AF used BC rstack (proc return stack) DE TOP HL used, e.g. for addressing or jp(hl) AF'…HL' unused IX frame pointer ? IY SP vstack, z80 rstack PC PC –––––––––––––––––––––––––––––––––––––––––––––– BC as rstack: pushr: pop hl 10 ld a,l 4 ld (bc++),a 13 ld a,h 4 ld (bc++),a 13 = 44cc, 7 bytes popr: ld a,(--bc) 13 ld h,a 4 ld a,(--bc) 13 ld l,a 4 jp hl 4 = 38cc, 7 bytes –––––––––––––––––––––––––––––––––––––––––––––– call procedure with RST -> rst callproc dw procaddr callproc: 21 rst + jp pop hl 10 ld a,(hl) 7 ; a = proc.lo inc hl 6 inc hl 6 pushr_hl 34cc, 6 bytes dec hl 6 ld h,(hl) 7 ; h = proc.hi ld l,a 4 ; l = proc.lo jp hl 4 = 105cc –––––––––––––––––––––––––––– call proc with CALL and start proc with macro P_ENTER macro p_enter pop hl rst pushr_hl pushr_hl 38 call + pop hl + rst inc bc 6 ld a,l 4 ld (bc),a 7 inc bc 6 ld a,h 4 ld (bc),a 7 ret 10 82cc –––––––––––––––––––––––––––– return from procedure jp return … pop hl pop hl return 10 jp ld a,(bc) 7 dec bc 6 ld h,a 4 ld a,(bc) 7 dec bc 6 ld l,a 4 jp hl 4 = 48cc ––––––––––––––––––––––––––––––––––––––––––––– 7 code snippets können als RST aufgerufen werden: ––––––––––––––––––––––––––––––––––––––––––––––––– Immediate Values: ––––––––––––––––– Der ersetzbare Code ist immer so kurz, dass das nicht lohnt: push de ld de,NN 3+1 bytes Signed Byte: –––––––––––– Grundsätzlich keine Optimierung für s8 Globale Variablen: –––––––––––––––––– Globale Variablen werden eher selten referenziert, es sei denn, zur Geschwindigkeitsoptimierung. Gerade dann ist aber das Verkürzen über einen RST unerwünscht. Setter sind seltener als Getter. GVAR push de 3+1 ld de,NN GGET push de 4+1 ld de,(NN) GSET ld (NN),de pop de GGETu8 push de 6+1 bytes KANDIDAT ld a,(NN) ld e,a ld d,0 GSET8 ld a,e 4+1 bytes ld (NN),a pop de Lokale Variablen: ––––––––––––––––– Lokale Variablen werden häufig angesprochen. Außerdem ist der Code dazu meist recht lang. LVAR push de 4+1+1 ld hl,OFFS add hl,sp ex hl,de LGET push de 7+1 ld hl,OFFS add hl,sp ld e,(hl++) ld d,(hl) ; alt: push de 6+1 ld e,(IX+OFFS) ld d,(IX+OFFS+1) LGETu8 push de 7+1 ld hl,OFFS ld d,h ; 0 add hl,sp ld e,(hl++) ; alt: push de 5+1 ld e,(IX+OFFS) ld d,0 LSET ld hl,OFFS 7+1 add hl,sp ld (hl++),e ld (hl),d pop de ; alt: ld (IX+OFFS),e 6+1 ld (IX+OFFS+1),d pop de LSETu8 ld hl,OFFS 5+1 add hl,sp ld (hl),e pop de ; alt: ld (IX+OFFS),e 3+1 pop de Items in Structs: ––––––––––––––––– IVAR ex hl,de 7+1+1, ersetzbar durch 3+1 KANDIDAT ld e,(hl++) ld d,(hl) ld hl,OFFS add hl,de ex hl,de IGET ex hl,de 10+1 beginnt mit IVAR (ohne finales ex) ld e,(hl++) ld d,(hl) ld hl,OFFS add hl,de ld e,(hl++) ld d,(hl) IGETu8 ex hl,de 10+1 beginnt mit IVAR (ohne finales ex) ld e,(hl++) ld d,(hl) ld hl,OFFS add hl,de ld e,(hl) ld d,0 ISET ex hl,de 11+1+1 beginnt mit IVAR (ohne finales ex) ld e,(hl++) ld d,(hl) ld hl,OFFS add hl,de pop de ld (hl++),e ld (hl),d pop de ISET8 ex hl,de 9+1+1 beginnt mit IVAR (ohne finales ex) ld e,(hl++) ld d,(hl) ld hl,OFFS add hl,de pop de ld (hl),e pop de Items in Arrays: –––––––––––––––– Eignet sich grundsätzlich gut für Unterprogramme (auch CALL statt RST), da keine Direktparameter. ATI pop hl 6+1+1 ld a,(hl++) ld h,(hl) ld l,a ; hl -> array add hl,de ; add hl,de ; hl -> word ex hl,de ATI8 pop hl 5+1+1 ld a,(hl++) ld h,(hl) ld l,a ; hl -> array add hl,de ; hl -> byte ex hl,de ATIGET pop hl 9+1 beginnt mit ATI (ohne finales ex) ld a,(hl++) ld h,(hl) ld l,a ; hl -> array add hl,de ; add hl,de ; hl -> word ld e,(hl++) ld d,(hl) ATIGETu8 pop hl 8+1 beginnt mit ATI8 (ohne finales ex) ld a,(hl++) ld h,(hl) ld l,a ; hl -> array add hl,de ; hl -> word ld e,(hl) ld d,0 ATISET pop hl 10+1+1 beginnt mit ATI (ohne finales ex) ld a,(hl++) ld h,(hl) ld l,a ; hl -> array add hl,de ; add hl,de ; hl -> word pop de ld (hl++),e ld (hl),d pop de ATISET8 pop hl 7+1+1 beginnt mit ATI (ohne finales ex) ld a,(hl++) ld h,(hl) ld l,a ; hl -> array add hl,de ; hl -> word pop de ld (hl),e pop de Combinations of LGET + IGET ––––––––––––––––––––––––––– Die könnten häufig vorkommen, wenn 'strukturiert' programmiert wird. Sie sind auf jeden Fall zu lang für RST. Und es müssen 2 Direktparameter eingeschleift werden. LGETIGET push de 18+1 begins with LGET ld hl,LOFFS could be reduced to 5 or 6 (CALL) or 3+1 (RST) bytes add hl,sp ld e,(hl++) ld d,(hl) ex hl,de ld e,(hl++) ld d,(hl) ld hl,IOFFS add hl,de ld e,(hl++) ld d,(hl) LGETIGETu8 push de 18+1 begins with LGET ld hl,LOFFS can be reduced to 5 or 6 (CALL) or 3+1 (RST) bytes add hl,sp ld e,(hl++) ld d,(hl) ex hl,de ld e,(hl++) ld d,(hl) ld hl,IOFFS add hl,de ld e,(hl) ld d,0 Combinations of LVAR + ATIGET ––––––––––––––––––––––––––––– Die könnten häufig vorkommen, wenn 'strukturiert' programmiert wird, wenn auch nicht ganz so häufig wie Kombinationen mit IGET.