Wird das Programm wie folgt geändert ....
Code
Var
  OLED_CD[@PortD,2]     : Bit;
  OLED_RST[@PortD,3]    : Bit;
  
  DispData              : Array[0..3] of Byte;   // Displaydata schwarz/weiss --> graustufen
  ArrayCounter          : Integer;
  
  Counter               : Integer;
Procedure WriteOLED_C(Arg: Byte);                     // Command-Byte zum LCD senden
  Begin
    OLED_CD:=0;                                       // Befehl
    SPIOutByteD(Arg);                                 // Output Arg
    OLED_CD:=1;                                       // Daten
  End WriteOLED_C;
Procedure WriteOLED_D(Arg: Byte);                     // Daten zum LCD senden
  Begin
    SPIOutByteD(Arg);                                 // Output Arg
  End WriteOLED_D;
  
Procedure Init_OLED;
  Begin
    MDelay(50);
    Oled_RST:=0;
    MDelay(50);
    Oled_RST:=1;
    MDelay(50);
    WriteOLED_C($FD);        //Display Lock  einmalig,damit das OLED Commandos empfängt
    WriteOLED_D($12);
    WriteOLED_C($AE);        //Display OFF  , Displaycontroller aktiv,Panel inaktiv
    WriteOLED_C($B3);        //Display Clock , interner Osc und Divisor , bleibt unverändert
    WriteOLED_D(%10010001);
    WriteOLED_C($CA);        //Set Multiplex , entspricht der Pixelhöhe des Displays
    WriteOLED_D(63);         //Höhe - 1    ,  64 Pixel
    WriteOLED_C($A2);        //Set Offset , beginne bei Reihe 0
    WriteOLED_D(0);
    WriteOLED_C($A1);        //Set Startline , beginne bei Reihe 0
    WriteOLED_D(0);
    WriteOLED_C($A0);        //Set Remap
    WriteOLED_D(%00000110);  //0b00000110  verkehrt ,0b00010100 normal(Displayanschluß unten)
    WriteOLED_D(%00010001);
    WriteOLED_C($B5);        //Set GPIO  , keine weitere Bedeutung da diese Pin's nicht rausgeführt
    WriteOLED_D(0);
    WriteOLED_C($AB);        //Set Funktion , bleibt unverändert
    WriteOLED_D($01);
    WriteOLED_C($B4);        //External VSL , bleibt unverändert
    WriteOLED_D($A0);
    WriteOLED_D($FD);
    WriteOLED_C($C1);        //Set Contrast Current , Genereller Kontrast , bleibt unverändert
    WriteOLED_D($FF);
    WriteOLED_C($C7);        //Set Master Contrast , Hier ist eine Helligkeitsanpassung möglich
    WriteOLED_D($08);        // 0-14  Empfehlung 9-10 oder weniger , je mehr umso weniger LifeTime !!!
    WriteOLED_C($B9);        //Set Default Gray Scale , bleibt unverändert
    WriteOLED_C($B1);        //Set pre & dis_charge , bleibt unverändert
    WriteOLED_D($E2);
    WriteOLED_C($D1);        //Enhance Driving Scheme , bleibt unverändert
    WriteOLED_D($82);
    WriteOLED_D($20);
    WriteOLED_C($BB);        //Set pre-charge Voltage
    WriteOLED_D($08);
    WriteOLED_C($B6);        //Set Second Pre-charge Period
    WriteOLED_D($0F);
    WriteOLED_C($BE);        //Set VCOMH
    WriteOLED_D($07);
    WriteOLED_C($A6);        //Display normel  , "0xa7" Display reverse
    MDelay(50);
    WriteOLED_C($AF);        //Display ON  , Displaycontroller aktiv,Panel aktiv
  End Init_OLED;
Procedure chDispRefresh;                              //
  Begin
    OLED_CD:=0;                                       // Befehl
    SPIOutByteD($15);                                 // Output Arg
    OLED_CD:=1;                                       // Daten
    SPIOutByteD(28);
    SPIOutByteD(91);
    OLED_CD:=0;                                       // Befehl
    SPIOutByteD($75);                                 // Output Arg
    OLED_CD:=1;                                       // Daten
    SPIOutByteD(0);
    SPIOutByteD(63);
    OLED_CD:=0;                                       // Befehl
    SPIOutByteD($5C);                                 // Output Arg
    OLED_CD:=1;
    For ArrayCounter:=0 to 2047 do
      _ACCB:=GraphColArr[ArrayCounter];          // DisplayArray in _ACCB leden
        ASM;                                     // von Thorsten
          LDI        _ACCCLO, %.DispData AND 0FFh
          LDI        _ACCCHI, %.DispData SHRB 8  // Pointer auf Data laden
          //LDD        _ACCB, Y+000h               // Arg from Frame laden
          LDI        _ACCBLO, 4                  //
          IOS_LOOP2:
          CLR        _ACCA                       // Ausgangspunkt data:=0
          SBRC       _ACCB, 7                    // Bit 7 in ARG testen
          LDI        _ACCA, $F0                  // wenn gesetzt DATA:=$F0
          LSL        _ACCB                       // ARG nach links schieben
          SBRC       _ACCB, 7                    // Bit 6 ... jetzt testen  SkipRegisterBitClear
          ORI        _ACCA, $0F                  // gesetzt  Data := data or $0F
          ST         Z+, _ACCA                   // Data wegspeichern und Data Ptr um 1 erhöhen
          LSL        _ACCB                       // ARG shift left um oben Bit 5 ... zu testen
          DEC        _ACCBLO                     // wenn Loop var nicht 0 nochmal
          BRNE       IOS_LOOP2                   //
        EndASM;
        SPIOutD(@DispData,4);
      EndFor;
  End chDispRefresh;
  
  
{$D-}
UserDevice GraphIOS(Cmd: Byte; Arg: Byte);
  Begin
  End GraphIOS;
{$D+}
 
..... und anstatt gDispRefresh mein chDispRefresh verwendet, dauert der Displayrefresh unter gleichen Bedingungen wie oben nur noch 15.7ms anstatt 41.3ms!
Durch den Merlin-Optimizer gejagt, wird es nochmal um ca. 1ms schneller