--- /dev/null
+"$Header$"
+/********************************************************************
+ **** ****
+ **** Z 8 0 B A C K E N D T A B L E S ****
+ **** ****
+ ********************************************************************/
+
+
+
+/*
+ * INTEGER SIZE: 16 bits
+ * POINTER SIZE: 16 bits
+ */
+
+
+/* We store LB in the iy index-register, because this results in the
+ * cheapest addressing schemes for instruction like lol and stl.
+ * For a lol with an argument that is too low (< 0-128) or too high
+ * (>= 127) there is an overhead, because the offset cannot be
+ * expressed in 8 bits. In these cases we copy the LB to the hl-register,
+ * compute the required address and use register indirect mode to do
+ * the load. These cases occur rarely (about 11.5 % in C and 5.5 %
+ * in Pascal.
+ */
+
+EM_WSIZE = 2
+EM_PSIZE = 2
+EM_BSIZE = 4
+
+
+/**************************
+ ** R E G I S T E R S **
+ **************************/
+
+
+
+REGISTERS:
+AA = ("a",1) REG1, AREG.
+BB = ("b",1) REG1.
+CC = ("c",1) REG1.
+DD = ("d",1) REG1.
+EE = ("e",1) REG1.
+HH = ("h",1) REG1.
+LL = ("l",1) REG1.
+
+
+BC = ("bc",2,BB,CC) REG, GEN_REG, BC_REG, ANY_REG.
+DE = ("de",2,DD,EE) REG, GEN_REG, DE_REG, ANY_REG.
+HL = ("hl",2,HH,LL) GEN_REG, HL_REG, ANY_REG.
+
+LB = ("iy",2) LOCALBASE.
+IX = ("ix",2) INDEXREG, IX_REG, ANY_REG.
+
+
+
+pseudo0 = ("",2,BC,DE).
+pseudo1 = ("",2,HL,IX).
+pseudo2 = ("",2,pseudo0,pseudo1).
+pseudo3 = ("",2,pseudo2,AA) ALL_REG.
+
+
+/*****************
+ ** T O K E N S **
+ *****************/
+
+
+TOKENS:
+IMMEDIATE1 = {INT off;} 1 "%[off]"
+IMMEDIATE = {INT off;} 2 "%[off]"
+IREG1 = {REGISTER reg;} 1 "(%[reg])"
+INDEXED = {REGISTER reg;
+ INT off; } 1 "(%[reg]+%[off])"
+EXTENDED = {STRING off; } 2 "(%[off])"
+LOCAL_ADDR = {INT off; } 2
+EXTENDED_ADDR = {STRING off; } 2 "%[off]"
+
+
+
+/*************************************
+ ** T O K E N E X P R E S S I O N S **
+ *************************************/
+
+
+TOKENEXPRESSIONS:
+ANYTOK = IMMEDIATE + EXTENDED
+ANY1 = REG1 + IMMEDIATE1 + IREG1 + INDEXED
+ANY_ADDR = EXTENDED_ADDR + LOCAL_ADDR
+ANY = ANYTOK + ANY_REG + ANY_ADDR
+MEM_ALL = ANY - ANY_REG
+REG_SCR = REG * SCRATCH
+
+ANY_REG_SCR = ANY_REG * SCRATCH
+GEN_REG_SCR = GEN_REG * SCRATCH
+HL_REG_SCR = HL_REG * SCRATCH
+BC_REG_SCR = BC_REG * SCRATCH
+DE_REG_SCR = DE_REG * SCRATCH
+IX_REG_SCR = IX_REG * SCRATCH
+
+
+
+
+
+/*************
+ ** C O D E **
+ *************/
+
+
+CODE:
+
+
+/* G R O U P I : L O A D S */
+
+
+loc | | | {IMMEDIATE,$1} | |
+ldc | | | {IMMEDIATE,highw(1)} {IMMEDIATE,loww(1)} | |
+lol sfit($1,8) | | allocate(REG)
+ move({INDEXED,LB,$1} , %[a.2] )
+ move({INDEXED,LB,$1+1} , %[a.1] ) | %[a] | |
+lol | | allocate(HL_REG,REG)
+ "push iy"
+ "pop %[b]"
+ move({IMMEDIATE,$1} , %[a] )
+ "add hl,%[b]"
+ "ld %[b.2],(hl)"
+ "inc hl"
+ "ld %[b.1],(hl)"
+ erase(HL)
+ erase(%[a]) | %[b] | |
+ldl $1<126 && $1>0-128 | | allocate(REG,REG)
+ move({INDEXED,LB,$1} , %[a.2])
+ move({INDEXED,LB,$1+1},%[a.1])
+ move({INDEXED,LB,$1+2},%[b.2])
+ move({INDEXED,LB,$1+3},%[b.1]) | %[b] %[a] | |
+ldl | |
+ remove(ALL)
+ allocate(BC_REG,DE_REG,HL_REG={IMMEDIATE,$1})
+ "push iy"
+ "pop bc"
+ "add hl,bc"
+ "ld e,(hl)"
+ "inc hl"
+ "ld d,(hl)"
+ "inc hl"
+ "ld c,(hl)"
+ "inc hl"
+ "ld b,(hl)"
+ | BC DE | |
+loe | | | {EXTENDED,$1} | |
+lde | | | {EXTENDED,$1+"+2"} {EXTENDED,$1} | |
+lil sfit($1,8) | | allocate(HL_REG,REG)
+ move({INDEXED,LB,$1} , %[a.2])
+ move({INDEXED,LB,$1+1} , %[a.1])
+ "ld %[b.2],(hl)"
+ "inc hl"
+ "ld %[b.1],(hl)"
+ erase(HL)
+ erase(%[a]) | %[b] | |
+lil | | allocate(HL_REG = {IMMEDIATE,$1} , REG)
+ "push iy"
+ "pop %[b]"
+ "add hl,%[b]"
+ "ld %[b.2],(hl)"
+ "inc hl"
+ "ld %[b.1],(hl)"
+ "ld h,%[b.1]"
+ "ld l,%[b.2]"
+ "ld %[b.2],(hl)"
+ "inc hl"
+ "ld %[b.1],(hl)"
+ erase(HL)
+ erase(%[a]) | %[b] | |
+lof | HL_REG_SCR | allocate(REG = {IMMEDIATE,$1} )
+ "add hl,%[a]"
+ "ld %[a.2],(hl)"
+ "inc hl"
+ "ld %[a.1],(hl)"
+ erase(HL)
+ erase(%[a]) | %[a] | |
+... | REG_SCR | allocate(HL_REG = {IMMEDIATE,$1} )
+ "add hl,%[1]"
+ "ld %[1.2],(hl)"
+ "inc hl"
+ "ld %[1.1],(hl)"
+ erase(HL)
+ erase(%[1]) | %[1] | |
+ldf | HL_REG_SCR | allocate(REG = {IMMEDIATE,$1} , REG)
+ "add hl,%[a]"
+ "ld %[a.2],(hl)"
+ "inc hl"
+ "ld %[a.1],(hl)"
+ "inc hl"
+ "ld %[b.2],(hl)"
+ "inc hl"
+ "ld %[b.1],(hl)"
+ erase(HL)
+ erase(%[a]) | %[b] %[a] | |
+... | REG_SCR | allocate(HL_REG = {IMMEDIATE,$1} , REG)
+ "add hl,%[1]"
+ "ld %[1.2],(hl)"
+ "inc hl"
+ "ld %[1.1],(hl)"
+ "inc hl"
+ "ld %[b.2],(hl)"
+ "inc hl"
+ "ld %[b.1],(hl)"
+ erase(HL)
+ erase(%[1]) | %[b] %[1] | |
+lal | | remove(ALL)
+ allocate(HL_REG, REG = {IMMEDIATE,$1} )
+ "push iy"
+ "pop hl"
+ "add hl,%[b]"
+ erase(%[a]) | %[a] | |
+lae | | | {EXTENDED_ADDR,$1} | |
+lxl $1 == 0 | | remove(ALL)
+ "push iy"
+ | | |
+lxl | | remove(ALL)
+ allocate(AREG = {IMMEDIATE1,$1} ,
+ HL_REG,BC_REG)
+ "push iy"
+ "pop %[c]"
+ "1:"
+ "ld hl,4"
+ "add hl,%[c]"
+ "ld %[c.2],(hl)"
+ "inc hl"
+ "ld %[c.1],(hl)"
+ "dec a"
+ "jr nz,1b"
+ "push %[c]"
+ erase(AA) | | |
+lxa $1 == 0 | | | | lxl $1 adp 4 |
+lxa $1 == 1 | | remove(ALL)
+ allocate(HL_REG,BC_REG)
+ "ld %[b],4"
+ "push iy"
+ "pop hl"
+ "add hl,%[b]"
+ "ld %[b.2],(hl)"
+ "inc hl"
+ "ld %[b.1],(hl)"
+ "ld hl,4"
+ "add hl,%[b]" | HL | |
+lxa $1 > 1 | | remove (ANY)
+ allocate(AREG = {IMMEDIATE1,$1},
+ HL_REG,BC_REG)
+ "push iy"
+ "pop %[c]"
+ "1:"
+ "ld hl,4"
+ "add hl,%[c]"
+ "ld %[c.2],(hl)"
+ "inc hl"
+ "ld %[c.1],(hl)"
+ "inc hl"
+ "dec a"
+ "jr nz,1b"
+ "ld hl,4"
+ "add hl,%[c]"
+ erase(AA) | HL | |
+dch | | | | loi 2 |
+loi $1 == 1 | HL_REG | allocate(REG = {IMMEDIATE,0} )
+ "ld %[a.2],(hl)"
+ erase(%[a]) | %[a] | |
+... | REG | allocate(REG,AREG)
+ move({IREG1,%[1]} , AA)
+ move(AA , %[a.2])
+ move({IMMEDIATE1,0} , %[a.1])
+ erase(AA) | %[a] | |
+loi $1 == 2 | HL_REG_SCR | remove(ALL) allocate(REG)
+ "ld %[a.2],(hl)"
+ "inc hl"
+ "ld %[a.1],(hl)"
+ erase(%[1]) | %[a] | |
+loi $1 == 4 | HL_REG_SCR | remove(ALL)
+ allocate(AREG,REG)
+ "ld %[b.2],(hl)"
+ "inc hl"
+ "ld %[b.1],(hl)"
+ "inc hl"
+ "ld a,(hl)"
+ "inc hl"
+ "ld h,(hl)"
+ "ld l,a"
+ erase(HL) | HL %[b] | |
+loi $1 <= 511 && $1 > 4 | HL_REG_SCR |
+ remove(ALL)
+ allocate(AREG,REG)
+ move({IMMEDIATE,$1-1} , %[b])
+ "add hl,%[b]"
+ move({IMMEDIATE1,$1/2} , AA)
+ "1:"
+ "ld %[b.1],(hl)"
+ "dec hl"
+ "ld %[b.2],(hl)"
+ "dec hl"
+ "push %[b]"
+ "dec a"
+ "jr nz,1b"
+ erase(%[a])
+ erase(%[b]) | | |
+loi $1 > 511 | STACK | remove(ALL) allocate(ALL_REG)
+ move({IMMEDIATE,$1}, HL)
+ "push hl"
+ "call .los"
+ erase(HL) | | |
+los $1 == 2 | STACK | remove(ALL) allocate(ALL_REG)
+ "call .los" | | |
+lpi | | | {EXTENDED_ADDR,$1} | |
+
+
+
+/* G R O U P II : S T O R E S */
+
+
+
+stl sfit($1,8) | REG + HL_REG |
+ remove(ALL)
+ move(%[1.2] , {INDEXED,LB,$1} )
+ move(%[1.1] , {INDEXED,LB,$1+1} )
+ | | |
+stl | REG |
+ remove(ALL)
+ allocate(HL_REG = {IMMEDIATE,$1} , REG)
+ "push iy"
+ "pop %[b]"
+ "add hl,%[b]"
+ "ld (hl),%[1.2]"
+ "inc hl"
+ "ld (hl),%[1.1]"
+ erase(%[a]) | | |
+ste | ANY_REG | remove(EXTENDED,%[off] == $1)
+ remove(ALL)
+ move(%[1] , {EXTENDED,$1} ) | | |
+sil ($1 >= 0-128 && $1 < 127) | REG |
+ remove(ALL)
+ allocate(HL_REG)
+ move({INDEXED,LB,$1} , %[a.2])
+ move({INDEXED,LB,$1+1} , %[a.1])
+ "ld (hl),%[1.2]"
+ "inc hl"
+ "ld (hl),%[1.1]"
+ erase(%[a]) | | |
+sil ($1 < 0-128 || $1 >= 127) | REG |
+ remove(ALL)
+ allocate(HL_REG,REG)
+ "push iy"
+ "pop %[b]"
+ move({IMMEDIATE,$1} , %[a])
+ "add hl,%[b]"
+ "ld %[b.2],(hl)"
+ "inc hl"
+ "ld %[b.1],(hl)"
+ "ld h,%[b.1]"
+ "ld l,%[b.2]"
+ "ld (hl),%[1.2]"
+ "inc hl"
+ "ld (hl),%[1.1]"
+ erase(%[a]) | | |
+stf | HL_REG_SCR REG | remove(ALL)
+ allocate(REG = {IMMEDIATE,$1})
+ "add hl,%[a]"
+ "ld (hl),%[2.2]"
+ "inc hl"
+ "ld (hl),%[2.1]"
+ erase(%[1]) | | |
+sti $1 == 1 | HL_REG REG | remove(ALL)
+ "ld (hl),%[2.2]" | | |
+sti $1 == 2 | HL_REG_SCR REG | remove(ALL)
+ "ld (hl),%[2.2]"
+ "inc hl"
+ "ld (hl),%[2.1]"
+ erase(%[1]) | | |
+sti $1 == 4 | HL_REG_SCR REG REG |
+ remove(ALL)
+ "ld (hl),%[2.2]"
+ "inc hl"
+ "ld (hl),%[2.1]"
+ "inc hl"
+ "ld (hl),%[3.2]"
+ "inc hl"
+ "ld (hl),%[3.1]"
+ erase(HL) | | |
+sti $1 <= 511 && $1 > 4 | HL_REG_SCR |
+ remove(ALL)
+ allocate(AREG,REG)
+ move({IMMEDIATE1,$1/2} , AA)
+ "1:"
+ "pop %[b]"
+ "ld (hl),%[b.2]"
+ "inc hl"
+ "ld (hl),%[b.1]"
+ "inc hl"
+ "dec a"
+ "jr nz,1b"
+ erase(AA)
+ erase(HL) | | |
+sti $1 > 511 | STACK | remove(ALL) allocate(ALL_REG)
+ move({IMMEDIATE,$1}, HL)
+ "push hl"
+ "call .sts"
+ erase(HL) | | |
+sts $1 == 2 | STACK | remove(ALL) allocate(ALL_REG)
+ "call .sts" | | |
+sdl ($1 >= 0-128 && $1 < 125) | REG REG |
+ remove(ALL)
+ move(%[1.2] , {INDEXED,LB,$1})
+ move(%[1.1] , {INDEXED,LB,$1+1})
+ move(%[2.2] , {INDEXED,LB,$1+2})
+ move(%[2.1] , {INDEXED,LB,$1+3}) | | |
+sdl ($1 < 0-128 || $1 >= 125) | STACK |
+ remove(ALL)
+ allocate(HL_REG = {IMMEDIATE,$1} ,
+ BC_REG,DE_REG,IX_REG,AREG )
+ "call .sdl"
+ erase(HL) | | |
+sde | ANY_REG ANY_REG |
+ remove(ALL)
+ move(%[1] , {EXTENDED,$1})
+ move(%[2] , {EXTENDED,$1+"+2"}) | | |
+sdf | | remove(ALL)
+ allocate(ALL_REG)
+ move({IMMEDIATE,$1},DE)
+ "call .sdf"
+ | | |
+
+
+
+/* G R O U P III & IV : I N T E G E R A R I T H M E T I C */
+
+
+
+adi $1 == 2 | HL_REG_SCR GEN_REG |
+ "add hl,%[2]"
+ erase(HL) | HL | |
+... | GEN_REG HL_REG_SCR |
+ "add hl,%[1]"
+ erase(HL) | HL | |
+adi $1 == 4 | HL_REG_SCR DE_REG_SCR STACK | allocate(BC_REG)
+ "pop bc"
+ "add hl,bc"
+ "ex de,hl"
+ "pop bc"
+ "adc hl,bc"
+ erase(DE)
+ erase(HL) | HL DE | |
+sbi $1 == 2 | GEN_REG HL_REG_SCR |
+ "or a"
+ "sbc hl,%[1]"
+ erase(HL) | HL | |
+sbi $1 == 4 | BC_REG_SCR DE_REG_SCR STACK |
+ allocate(HL_REG)
+ "or a"
+ "pop hl"
+ "sbc hl,bc" /* least sign. */
+ "ex (sp),hl"
+ "sbc hl,de"
+ "pop de"
+ erase(DE)
+ erase(HL) | HL DE | |
+mli $1 == 2 | DE_REG_SCR BC_REG STACK |
+ allocate(HL_REG,IX_REG,AREG)
+ "call .mli2"
+ erase(DE) | HL | |
+mli $1 == 4 | STACK | allocate(ALL_REG)
+ "call .mli4" | | |
+dvi $1 == 2 | BC_REG_SCR DE_REG_SCR STACK |
+ allocate(HL_REG,IX_REG,AREG)
+ "call .dvi2"
+ "push de"
+ erase(BC)
+ erase(DE) | | |
+dvi $1 == 4 | STACK | allocate(ALL_REG)
+ "call .dvi4" | | |
+dvu $1 == 2 | BC_REG_SCR DE_REG_SCR STACK |
+ allocate(HL_REG,IX_REG,AREG)
+ "call .dvu2"
+ erase(BC)
+ erase(DE) | DE | |
+dvu $1 == 4 | STACK | allocate(ALL_REG)
+ "call .dvu4" | | |
+rmi $1 == 2 | BC_REG_SCR DE_REG_SCR STACK |
+ allocate(HL_REG,IX_REG,AREG)
+ "call .rmi2"
+ erase(BC)
+ erase(DE) | DE | |
+rmi $1 == 4 | STACK | allocate(ALL_REG)
+ "call .dvi4"
+ "pop hl"
+ "pop hl"
+ erase(HL)
+ | BC DE | |
+rmu $1 == 2 | BC_REG_SCR DE_REG_SCR STACK |
+ allocate(HL_REG,IX_REG,AREG)
+ "call .dvu2"
+ erase(BC)
+ erase(DE) | HL | |
+rmu $1 == 4 | STACK | allocate(ALL_REG)
+ "call .dvu4" | BC DE | |
+ngi $1 == 2 | REG | allocate(HL_REG = {IMMEDIATE,0})
+ "or a"
+ "sbc hl,%[1]"
+ erase(HL) | HL | |
+ngi $1 == 4 | DE_REG_SCR BC_REG_SCR |
+ allocate(HL_REG,AREG)
+ "xor a"
+ "ld h,a"
+ "ld l,a"
+ "sbc hl,de"
+ "ex de,hl"
+ "ld h,a"
+ "ld l,a"
+ "sbc hl,bc"
+ erase(DE) | HL DE | |
+sli $1 == 2 | REG_SCR HL_REG_SCR |
+ "inc %[1.1]" /* see if count >> 15 */
+ "dec %[1.1]"
+ "jr z,1f"
+ "ld %[1.2],15"
+ "1:"
+ "dec %[1.2]"
+ "jp m,2f"
+ "add hl,hl"
+ "jr 1b"
+ "2:"
+ erase(%[1])
+ erase(HL) | HL | |
+sli $1 == 4 | REG_SCR IX_REG_SCR HL_REG_SCR |
+ "inc %[1.1]"
+ "dec %[1.1]"
+ "jr z,1f"
+ "ld %[1.2],31"
+ "1:"
+ "dec %[1.2]"
+ "jp m,2f"
+ "add ix,ix"
+ "adc hl,hl"
+ "jr 1b"
+ "2:"
+ erase(%[1])
+ erase(HL)
+ erase(IX) | HL IX | |
+sri $1 == 2 | GEN_REG_SCR GEN_REG_SCR |
+ "inc %[1.1]"
+ "dec %[1.1]"
+ "jr z,1f"
+ "ld %[1.2],15"
+ "1:"
+ "dec %[1.2]"
+ "jp m,2f"
+ "sra %[2.1]"
+ "rr %[2.2]"
+ "jr 1b"
+ "2:"
+ erase(%[1])
+ erase(%[2]) | %[2] | |
+sri $1 == 4 | GEN_REG_SCR GEN_REG_SCR GEN_REG_SCR |
+ "inc %[1.1]"
+ "dec %[1.1]"
+ "jr z,1f"
+ "ld %[1.2],31"
+ "1:"
+ "dec %[1.2]"
+ "jp m,2f"
+ "sra %[3.1]"
+ "rr %[3.2]"
+ "rr %[2.1]"
+ "rr %[2.2]"
+ "jr 1b"
+ "2:"
+ erase(%[1])
+ erase(%[2])
+ erase(%[3]) | %[3] %[2] | |
+mlu | | | | mli $1 |
+sru $1 == 2 | GEN_REG_SCR GEN_REG_SCR |
+ "inc %[1.1]"
+ "dec %[1.1]"
+ "jr z,1f"
+ "ld %[1.2],15"
+ "1:"
+ "dec %[1.2]"
+ "jp m,2f"
+ "srl %[2.1]"
+ "rr %[2.2]"
+ "jr 1b"
+ "2:"
+ erase(%[1])
+ erase(%[2]) | %[2] | |
+sru $1 == 4 | GEN_REG_SCR GEN_REG_SCR GEN_REG_SCR |
+ "inc %[1.1]"
+ "dec %[1.1]"
+ "jr z,1f"
+ "ld %[1.2],31"
+ "1:"
+ "dec %[1.2]"
+ "jp m,2f"
+ "srl %[3.1]"
+ "rr %[3.2]"
+ "rr %[2.1]"
+ "rr %[2.2]"
+ "jr 1b"
+ "2:"
+ erase(%[1])
+ erase(%[2])
+ erase(%[3]) | %[3] %[2] | |
+adu | | | | adi $1 |
+sbu | | | | sbi $1 |
+slu | | | | sli $1 |
+
+
+
+/* G R O U P V : F L O A T I N G P O I N T */
+
+
+adf | |
+ "call .unimpld" | | |
+sbf | |
+ "call .unimpld" | | |
+mlf | |
+ "call .unimpld" | | |
+dvf | |
+ "call .unimpld" | | |
+ngf | |
+ "call .unimpld" | | |
+fif | |
+ "call .unimpld" | | |
+fef | |
+ "call .unimpld" | | |
+
+
+
+/* G R O U P VI : P O I N T E R A R I T H M E T I C */
+
+
+
+adp $1 == 0 | | | | |
+adp $1 == 1 | ANY_REG_SCR | "inc %[1]"
+ erase(%[1]) | %[1] | |
+adp $1 == 2 | ANY_REG_SCR | "inc %[1]"
+ "inc %[1]"
+ erase(%[1]) | %[1] | |
+adp $1 == 0-1 | ANY_REG_SCR | "dec %[1]"
+ erase(%[1]) | %[1] | |
+adp $1 == 0-2 | ANY_REG_SCR | "dec %[1]"
+ "dec %[1]"
+ erase(%[1]) | %[1] | |
+adp $1 < 0-2 || $1 > 2 | HL_REG_SCR |
+ allocate(REG = {IMMEDIATE,$1} )
+ "add hl,%[a]"
+ erase(HL) | HL | |
+... | REG |
+ allocate(HL_REG = {IMMEDIATE,$1} )
+ "add hl,%[1]"
+ erase(HL) | HL | |
+... | LOCAL_ADDR | remove(ALL) | {LOCAL_ADDR, %[1.off]+$1} | |
+ads $1 == 2 | HL_REG_SCR REG | remove(ALL) "add hl,%[2]"
+ erase(HL) | HL | |
+... | REG HL_REG_SCR | "add hl,%[1]"
+ erase(HL) | HL | |
+sbs $1 == 2 | REG HL_REG_SCR | "or a"
+ "sbc hl,%[1]"
+ erase(HL) | HL | |
+
+
+
+/* G R O U P VII : I N C R E M E N T / D E C R E M E N T */
+
+
+
+inc | ANY_REG_SCR | "inc %[1]"
+ erase(%[1]) | %[1] | |
+
+/* There is no efficient way on the Z80 to increment or decrement
+ * a local or external. We first fetch the variable into a register,
+ * increment/decrement it and then store it.
+ */
+
+inl | | | | lol $1 inc stl $1 |
+ine | | | | loe $1 inc ste $1 |
+dec | ANY_REG_SCR | "dec %[1]"
+ erase(%[1]) | %[1] | |
+del | | | | lol $1 dec stl $1 |
+dee | | | | loe $1 dec ste $1 |
+zrl ($1 >= 0-128 && $1 < 127) | |
+ remove(ALL)
+ allocate(AREG)
+ "xor a"
+ move(AA , {INDEXED,LB,$1})
+ move(AA , {INDEXED,LB,$1+1}) | | |
+zrl ($1 < 0-128 || $1 >= 127) | |
+ remove(ALL)
+ allocate(HL_REG = {IMMEDIATE,$1} , REG, AREG)
+ "push iy"
+ "pop %[b]"
+ "add hl,%[b]"
+ "xor a"
+ "ld (hl),a"
+ "inc hl"
+ "ld (hl),a"
+ erase(HL) | | |
+zre | | remove(EXTENDED,%[off] == $1)
+ remove(ALL)
+ allocate(ANY_REG = {IMMEDIATE,0} )
+ move(%[a] , {EXTENDED,$1}) | | |
+zer $1 == 2 | | | {IMMEDIATE,0} | |
+zer $1 == 4 | | | {IMMEDIATE,0} {IMMEDIATE,0} | |
+zer $1 > 4 && $1 < 256 | STACK |
+
+ allocate(BC_REG , GEN_REG)
+ "ld b,$1"
+ "ld %[b],0"
+ "1:"
+ "push %[b]"
+ "djnz 1b"
+ | | |
+
+
+
+/* G R O U P VIII : C O N V E R T */
+
+
+
+cii | STACK | remove(ALL) allocate(ALL_REG)
+ "call .cii" | | |
+cuu | STACK | remove(ALL) allocate(ALL_REG)
+ "call .cuu" | | |
+cui | | | | cuu |
+ciu | | | | cuu |
+cfi | |
+ "call .unimpld" | | |
+cif | |
+ "call .unimpld" | | |
+cuf | |
+ "call .unimpld" | | |
+cff | |
+ "call .unimpld" | | |
+cfu | |
+ "call .unimpld" | | |
+cmf | |
+ "call .unimpld" | | |
+
+
+
+/* G R O U P IX : L O G I C A L */
+
+
+
+and $1 == 2 | GEN_REG GEN_REG_SCR |
+ allocate(AREG)
+ "ld a,%[1.2]"
+ "and %[2.2]"
+ "ld %[2.2],a"
+ "ld a,%[1.1]"
+ "and %[2.1]"
+ "ld %[2.1],a"
+ erase(%[2]) | %[2] | |
+and defined($1) && $1 > 2 | STACK |
+ allocate(DE_REG = {IMMEDIATE,$1},
+ BC_REG,HL_REG,IX_REG,AREG)
+ "call .and"
+ erase(DE) | | |
+and ! defined($1) | DE_REG_SCR STACK |
+ allocate(BC_REG,HL_REG,IX_REG,AREG)
+ "call .and"
+ erase(DE) | | |
+ior $1 == 2 | GEN_REG GEN_REG_SCR |
+ allocate(AREG)
+ "ld a,%[1.2]"
+ "or %[2.2]"
+ "ld %[2.2],a"
+ "ld a,%[1.1]"
+ "or %[2.1]"
+ "ld %[2.1],a"
+ erase(%[2]) | %[2] | |
+ior defined($1) && $1 > 2 | STACK |
+ allocate(DE_REG = {IMMEDIATE,$1},
+ BC_REG,HL_REG,IX_REG,AREG)
+ "call .ior"
+ erase(DE) | | |
+ior ! defined($1) | DE_REG_SCR STACK |
+ allocate(BC_REG,HL_REG,IX_REG,AREG)
+ "call .ior"
+ erase(DE) | | |
+xor $1 == 2 | GEN_REG GEN_REG_SCR |
+ allocate(AREG)
+ "ld a,%[1.2]"
+ "xor %[2.2]"
+ "ld %[2.2],a"
+ "ld a,%[1.1]"
+ "xor %[2.1]"
+ "ld %[2.1],a"
+ erase(%[2]) | %[2] | |
+xor defined($1) && $1 > 2 | STACK |
+ allocate(DE_REG = {IMMEDIATE,$1},
+ BC_REG,HL_REG,IX_REG,AREG)
+ "call .xor"
+ erase(DE) | | |
+xor ! defined($1) | DE_REG_SCR STACK |
+ allocate(BC_REG,HL_REG,IX_REG,AREG)
+ "call .xor"
+ erase(DE) | | |
+com $1 == 2 | GEN_REG_SCR | allocate(AREG)
+ "ld a,%[1.2]"
+ "cpl"
+ "ld %[1.2],a"
+ "ld a,%[1.1]"
+ "cpl"
+ "ld %[1.1],a"
+ erase(%[1]) | %[1] | |
+com defined($1) && $1 > 2 | STACK |
+ allocate(AREG,
+ HL_REG = {IMMEDIATE,$1} )
+ "add hl,sp"
+ "1:"
+ "dec hl"
+ "ld a,(hl)"
+ "cpl"
+ "ld (hl),a"
+ "xor a"
+ "sbc hl,sp"
+ "jr z,2f"
+ "add hl,sp"
+ "jr 1b"
+ "2:"
+ erase(HL) | | |
+com ! defined($1) | HL_REG_SCR STACK |
+ allocate(AREG)
+ "add hl,sp"
+ "1:"
+ "dec hl"
+ "ld a,(hl)"
+ "cpl"
+ "ld (hl),a"
+ "xor a"
+ "sbc hl,sp"
+ "jr z,2f"
+ "add hl,sp"
+ "jr 1b"
+ "2:"
+ erase(HL) | | |
+rol $1 == 2 | REG_SCR HL_REG_SCR |
+ allocate(AREG)
+ "ld a,%[1.2]"
+ "and 15"
+ "jr z,2f"
+ "ld %[1],0"
+ "1:"
+ "add hl,hl"
+ "adc hl,%[1]"
+ "dec a"
+ "jr nz,1b"
+ "2:"
+ erase(%[1])
+ erase(%[2]) | HL | |
+rol $1 == 4 | REG IX_REG_SCR HL_REG_SCR |
+ allocate(AREG)
+ "ld a,%[1.2]"
+ "and 31"
+ "jr z,3f"
+ "1:"
+ "add ix,ix"
+ "adc hl,hl"
+ "jr nc,2f"
+ "inc ix"
+ "2:"
+ "dec a"
+ "jr nz,1b"
+ "3:"
+ erase(HL)
+ erase(IX) | HL IX | |
+ror $1 == 2 | GEN_REG_SCR GEN_REG_SCR |
+ allocate(AREG)
+ "ld a,%[1.2]"
+ "and 15"
+ "jr z,0f"
+ "1:"
+ "srl %[2.1]"
+ "rr %[2.2]"
+ "jr nc,2f"
+ "set 7,%[2.1]"
+ "2:"
+ "dec a"
+ "jr nz,1b"
+ "0:"
+ erase(%[1])
+ erase(%[2]) | %[2] | |
+ror $1 == 4 | GEN_REG_SCR GEN_REG_SCR GEN_REG_SCR |
+ allocate(AREG)
+ "ld a,%[1.2]"
+ "and 31"
+ "jr z,0f"
+ "1:"
+ "srl %[3.1]"
+ "rr %[3.2]"
+ "rr %[2.1]"
+ "rr %[2.2]"
+ "jr nc,2f"
+ "set 7,%[3.1]"
+ "2:"
+ "dec a"
+ "jr nz,1b"
+ "0:"
+ erase(%[1])
+ erase(%[2])
+ erase(%[3]) | %[3] %[2] | |
+
+
+
+/* G R O U P X : S E T S */
+
+
+inn defined($1) | STACK | allocate(HL_REG = {IMMEDIATE,$1},
+ BC_REG,DE_REG,IX_REG,AREG)
+ "call .inn"
+ erase(HL) | | |
+inn !defined($1) | HL_REG_SCR STACK |
+ allocate(BC_REG,DE_REG,IX_REG,AREG)
+ "call .inn"
+ erase(HL) | | |
+set defined($1) | STACK | allocate(HL_REG = {IMMEDIATE,$1},
+ BC_REG,DE_REG,IX_REG,AREG)
+ "call .set"
+ erase(HL) | | |
+set !defined($1) | HL_REG_SCR STACK |
+ allocate(BC_REG,DE_REG,IX_REG,AREG)
+ "call .set"
+ erase(HL) | | |
+
+
+
+/* G R O U P XI : A R R A Y S */
+
+
+lae aar $2 == 2 && rom(1,3) == 2 | STACK |
+ allocate(ALL_REG)
+ move({EXTENDED_ADDR,$1},BC)
+ "push bc"
+ "call .aar2" | | |
+lae aar $2 == 2 && rom(1,3) != 2 | STACK |
+ allocate(ALL_REG)
+ move({EXTENDED_ADDR,$1},BC)
+ "push bc"
+ "call .aar" | | |
+aar $1==2 | |
+ remove(ALL)
+ allocate(ALL_REG)
+ "call .aar"
+ | | |
+aar !defined($1) | | remove(ALL)
+ allocate(ALL_REG)
+ "call .aaru" | | |
+lae lar $2 == 2 && rom(1,3) == 2 | STACK |
+ remove(ALL) allocate(ALL_REG)
+ move({EXTENDED_ADDR,$1},BC)
+ "push bc"
+ "call .lar2" | | |
+lae lar $2 == 2 && rom(1,3) != 2 | STACK |
+ remove(ALL) allocate(ALL_REG)
+ move({EXTENDED_ADDR,$1},BC)
+ "push bc"
+ "call .lar" | | |
+lar $1==2 | | remove(ALL)
+ allocate(ALL_REG)
+ "call .lar" | | |
+lar !defined($1) | | remove(ALL)
+ allocate(ALL_REG)
+ "call .laru" | | |
+lae sar $2 == 2 && rom(1,3) == 2 | STACK |
+ remove(ALL) allocate(ALL_REG)
+ move({EXTENDED_ADDR, $1},BC)
+ "push bc"
+ "call .sar2" | | |
+lae sar $2 == 2 && rom(1,3) != 2 | STACK |
+ remove(ALL) allocate(ALL_REG)
+ move({EXTENDED_ADDR, $1},BC)
+ "push bc"
+ "call .sar" | | |
+sar $1==2 | | remove(ALL)
+ allocate(ALL_REG)
+ "call .sar" | | |
+sar !defined($1) | | remove(ALL)
+ allocate(ALL_REG)
+ "call .saru" | | |
+
+
+/* G R O U P XII : C O M P A R E */
+
+
+
+cmi $1 == 2 | REG_SCR HL_REG_SCR |
+ remove(ALL) allocate(AREG)
+ "ld a,h"
+ "xor %[1.1]"
+ "jp m,1f"
+ "sbc hl,%[1]"
+ "jr 2f"
+ "1:"
+ "xor %[1.1]"
+ "jp m,2f"
+ "set 0,l"
+ "2:"
+ erase(%[1])
+ erase(%[2]) | HL | |
+cmi $1 == 4 | STACK | remove(ALL) allocate(AREG = {IMMEDIATE1,1},
+ BC_REG,DE_REG,HL_REG,IX_REG)
+ "call .cmu4"
+ erase(AA) | DE | |
+cmu $1 == 2 | REG_SCR HL_REG_SCR |
+ remove(ALL) allocate(AREG)
+ "ld a,h"
+ "xor %[1.1]" /* resets carry bit */
+ "jp m,1f"
+ "sbc hl,%[1]"
+ "jr 2f"
+ "1:"
+ "xor %[1.1]"
+ "cpl"
+ "set 0,l"
+ "2:"
+ erase(%[1])
+ erase(%[2]) | HL | |
+cmu $1 == 4 | STACK | remove(ALL) allocate(AREG = {IMMEDIATE1,0},
+ BC_REG,DE_REG,HL_REG,IX_REG)
+ "call .cmu4"
+ erase(AA) | DE | |
+cmp | | | | cmu 2 |
+cms $1 == 2 | GEN_REG GEN_REG_SCR |
+ remove(ALL) allocate(AREG)
+ "ld a,%[1.1]"
+ "xor %[2.1]"
+ "ld %[2.1],a"
+ "ld a,%[1.2]"
+ "xor %[2.2]"
+ "ld %[2.2],a" | %[2] | |
+/***
+cmu defined($1) | STACK | allocate(HL_REG = {IMMEDIATE,$1},
+ BC_REG,DE_REG,IX_REG,AREG)
+ "call .cmu"
+ erase(HL) | | |
+cmu ! defined($1) | HL_REG_SCR STACK |
+ allocate(BC_REG,DE_REG,IX_REG,AREG)
+ "call .cmu"
+ erase(HL) | | |
+*/
+cms defined($1) | STACK | remove(ALL) allocate(HL_REG = {IMMEDIATE,$1},
+ BC_REG,DE_REG,IX_REG,AREG)
+ "call .cms"
+ erase(HL) | | |
+cms ! defined($1) | HL_REG_SCR STACK |
+ allocate(BC_REG,DE_REG,IX_REG,AREG)
+ "call .cms"
+ erase(HL) | | |
+
+
+
+
+tlt | GEN_REG | remove(ALL)
+ allocate(GEN_REG = {IMMEDIATE,0})
+ "bit 7,%[1.1]"
+ "jr z,1f"
+ "inc %[a.2]"
+ "1:"
+ erase(%[a]) | %[a] | |
+tle | GEN_REG | remove(ALL)
+ allocate(AREG, GEN_REG = {IMMEDIATE,1})
+ "xor a"
+ "add a,%[1.1]"
+ "jp m,2f"
+ "jr nz,1f"
+ "xor a"
+ "add a,%[1.2]"
+ "jr z,2f"
+ "1:"
+ "dec %[b.2]"
+ "2:"
+ erase(%[b]) | %[b] | |
+teq | GEN_REG | remove(ALL)
+ allocate(AREG,GEN_REG = {IMMEDIATE,0})
+ "ld a,%[1.1]"
+ "or a"
+ "jp m,1f"
+ "xor %[1.2]"
+ "jr nz,1f"
+ "inc %[b.2]"
+ "1:"
+ erase(%[b]) | %[b] | |
+tne | GEN_REG | remove(ALL)
+ allocate(AREG, GEN_REG = {IMMEDIATE,0})
+ "ld a,%[1.1]"
+ "or %[1.2]"
+ "jr z,1f"
+ "inc %[b.2]"
+ "1:"
+ erase(%[b]) | %[b] | |
+tge | GEN_REG | remove(ALL)
+ allocate(GEN_REG = {IMMEDIATE,0})
+ "bit 7,%[1.1]"
+ "jr nz,1f"
+ "inc %[a.2]"
+ "1:"
+ erase(%[a]) | %[a] | |
+tgt | GEN_REG | remove(ALL)
+ allocate(AREG, GEN_REG = {IMMEDIATE,0})
+ "xor a"
+ "add a,%[1.1]"
+ "jp m,2f"
+ "jr nz,1f"
+ "xor a"
+ "add a,%[1.2]"
+ "jr z,2f"
+ "1:"
+ "inc %[b.2]"
+ "2:"
+ erase(%[b]) | %[b] | |
+
+
+
+/* G R O U P XIII : B R A N C H */
+
+
+
+bra | | remove(ALL)
+ "jp $1" | | |
+blt | GEN_REG GEN_REG | remove(ALL) allocate(AREG)
+ "ld a,%[2.2]"
+ "sub %[1.2]"
+ "ld a,%[2.1]"
+ "sbc a,%[1.1]"
+ "jp m,$1" | | |
+ble | GEN_REG GEN_REG | remove(ALL) allocate(AREG)
+ "ld a,%[2.2]"
+ "sub %[1.2]"
+ "ld a,%[2.1]"
+ "sbc a,%[1.1]"
+ "jp m,$1"
+ "jr nz,1f"
+ "ld a,%[2.2]"
+ "cp %[1.2]"
+ "jr z,$1"
+ "1:" | | |
+beq | GEN_REG GEN_REG | remove(ALL) allocate(AREG)
+ "ld a,%[2.2]"
+ "sub %[1.2]"
+ "jr nz,1f"
+ "ld a,%[2.1]"
+ "sbc a,%[1.1]"
+ "jr z,$1"
+ "1:" | | |
+bne | GEN_REG GEN_REG | remove(ALL) allocate(AREG)
+ "ld a,%[2.2]"
+ "sub %[1.2]"
+ "jr nz,$1"
+ "ld a,%[2.1]"
+ "sbc a,%[1.1]"
+ "jr nz,$1"
+ erase(AA) | | |
+
+bge | GEN_REG GEN_REG | remove(ALL) allocate(AREG)
+ "ld a,%[2.2]"
+ "sub %[1.2]"
+ "ld a,%[2.1]"
+ "sbc a,%[1.1]"
+ "jp p,$1" | | |
+bgt | GEN_REG GEN_REG_SCR | remove(ALL) allocate(AREG)
+ "ld a,%[2.2]"
+ "sub %[1.2]"
+ "ld %[2.2],a"
+ "ld a,%[2.1]"
+ "sbc a,%[1.1]"
+ "jp m,1f"
+ "jr nz,$1"
+ "xor a"
+ "cp %[2.2]"
+ "jr nz,$1"
+ "1:"
+ erase(%[2]) | | |
+zlt | GEN_REG | remove(ALL) "bit 7,%[1.1]"
+ "jr nz,$1" | | |
+zle | GEN_REG | remove(ALL) allocate(AREG)
+ "xor a"
+ "add a,%[1.1]"
+ "jp m,$1"
+ "jr nz,1f"
+ "xor a"
+ "add a,%[1.2]"
+ "jr z,$1"
+ "1:" | | |
+zeq | GEN_REG | remove(ALL) allocate(AREG)
+ "ld a,%[1.1]"
+ "xor %[1.2]"
+ "jr z,$1" | | |
+zne | GEN_REG | remove(ALL) allocate(AREG)
+ "ld a,%[1.1]"
+ "xor %[1.2]"
+ "jr nz,$1" | | |
+zge | GEN_REG | remove(ALL) "bit 7,%[1.1]"
+ "jr z,$1" | | |
+zgt | GEN_REG | remove(ALL) allocate(AREG)
+ "xor a"
+ "add a,%[1.1]"
+ "jp m,1f"
+ "jr nz,$1"
+ "xor a"
+ "add a,%[1.2]"
+ "jr nz,$1"
+ "1:" | | |
+
+
+
+/* G R O U P XIV : P R O C E D U R E C A L L S */
+
+
+
+cai | HL_REG | remove(ALL)
+ allocate( GEN_REG )
+ "ld %[a],1f"
+ "push %[a]"
+ "jp (hl)"
+ "1:"
+ | | |
+cal | | remove(ALL)
+ allocate(ALL_REG)
+ "call $1"
+ | | |
+lfr $1 == 2 | | remove(ALL)
+ "push de"
+ | | |
+lfr $1 == 4 | STACK | "push de"
+ "push bc" | | |
+lfr | | remove(ALL)
+ "call .lfr"
+ | | |
+ret $1 == 0 | STACK |
+ remove(ALL)
+ allocate(HL_REG,LOCALBASE)
+ "push iy"
+ "pop hl"
+ "ld sp,hl"
+ "pop iy"
+ "ret" | | |
+ret $1 == 2 | STACK | remove(ALL)
+ allocate(HL_REG,DE_REG,LOCALBASE)
+ "pop de"
+ "push iy"
+ "pop hl"
+ "ld sp,hl"
+ "pop iy"
+ "ret" | | |
+ret $1 == 4 | STACK |
+ remove(ALL)
+ allocate(BC_REG, DE_REG, HL_REG, LOCALBASE)
+ "pop bc"
+ "pop de"
+ "push iy"
+ "pop hl"
+ "ld sp,hl"
+ "pop iy"
+ "ret" | | |
+ret | | remove(ALL)
+ move({IMMEDIATE,$1},BC)
+ "call .ret"
+ erase(BC) | | |
+
+
+
+/* G R O U P XV : M I S C E L L A N E O U S */
+
+
+
+asp $1 == 0 | | | | |
+asp $1 > 0 | STACK | remove(ALL) allocate(HL_REG)
+ move({IMMEDIATE,$1} , HL)
+ "add hl,sp"
+ "ld sp,hl"
+ erase(HL) | | |
+ass $1 == 2 | HL_REG_SCR STACK |
+ remove(ALL)
+ "add hl,sp"
+ "ld sp,hl"
+ erase(HL) | | |
+blm $1 == 0 | | | | |
+blm $1 > 0 |DE_REG_SCR HL_REG_SCR |
+
+ allocate(BC_REG = {IMMEDIATE,$1} )
+ "ldir"
+ erase(HL)
+ erase(BC)
+ erase(DE) | | |
+bls $1 == 2 | BC_REG_SCR DE_REG_SCR HL_REG_SCR |
+ remove(MEM_ALL)
+ "ldir"
+ erase(HL)
+ erase(BC)
+ erase(DE) | | |
+csa $1 == 2 | STACK | allocate(ALL_REG)
+ "jr .csa" | | |
+csb $1 == 2 | STACK | allocate(ALL_REG)
+ "jr .csb" | | |
+dus $1 == 2 | BC_REG_SCR | remove(MEM_ALL) allocate(HL_REG,DE_REG)
+ move({IMMEDIATE,0} , HL)
+ "add hl,sp"
+ "ld d,h"
+ "ld e,l" /* destination */
+ "sbc hl,bc" /* source */
+ "ld sp,hl"
+ "ex de,hl"
+ "ldir"
+ erase(HL)
+ erase(BC) | | |
+dup $1 == 2 | ANY | | %[1] %[1] | |
+dup $1 == 4 | ANY ANY | | %[2] %[1] %[2] %[1] | |
+dup $1 == 6 | ANY ANY ANY | | %[3] %[2] %[1] %[3] %[2] %[1] | |
+dup $1 > 6 | STACK | allocate(HL_REG,BC_REG,DE_REG)
+ move({IMMEDIATE,0} , HL)
+ "add hl,sp"
+ "ld d,h"
+ "ld e,l" /* destination */
+ move ({IMMEDIATE,$1},BC) /* count */
+ "sbc hl,bc" /* source */
+ "ld sp,hl"
+ "ex de,hl"
+ "ldir"
+ erase(HL)
+ erase(BC) | | |
+lor $1 == 0 | | "push iy" | | |
+fil | | allocate(HL_REG)
+ move({EXTENDED_ADDR,$1},HL)
+ "ld (hol0+4),hl"
+ erase(HL) | | |
+lor $1 == 1 | STACK | allocate(HL_REG)
+ move({IMMEDIATE,0} , HL)
+ "add hl,sp"
+ erase(HL) | HL | |
+lor $1 == 2 | STACK | | {EXTENDED,".reghp"} | |
+exg $1 == 2 | ANY ANY | | %[1] %[2] | |
+exg | STACK | remove(MEM_ALL)
+ allocate(HL_REG)
+ move({IMMEDIATE,$1},HL)
+ "push hl"
+ "call .exg" | | |
+gto | | remove(ALL)
+ allocate(ALL_REG)
+ move({EXTENDED_ADDR,$1},HL)
+ "call .gto"
+ | | |
+lim | | | {EXTENDED,"(ignmask)"} | |
+lin | | remove(ALL) allocate(HL_REG)
+ move({IMMEDIATE,$1},HL)
+ "ld (hol0),hl"
+ erase(HL) | | |
+lni | | allocate(HL_REG)
+ "ld hl,hol0"
+ "inc (hl)"
+ erase(HL) | | |
+lpb | | | | adp 4 |
+nop | | allocate(ALL_REG)
+ "call .nop" | | |
+rck $1 == 2 | STACK | allocate(ALL_REG)
+ "call .rck"
+ | | |
+rtt | | | | ret 0|
+sig | HL_REG_SCR |
+
+ "ld (trapproc),hl"
+ "ld hl,trapproc"
+ | HL | |
+sim | HL_REG | remove(MEM_ALL)
+ "pop hl"
+ "ld (ignmask),hl" | | |
+str $1 == 0 | IMMEDIATE STACK | move({IMMEDIATE,%[1.off]} , LB) | | |
+str $1 == 1 | STACK | allocate(HL_REG)
+ "pop hl"
+ "ld sp,hl" | | |
+str $1 == 2 | STACK | allocate(ALL_REG)
+ "call .strhp"
+ | | |
+trp| | remove(ALL)
+ allocate(ALL_REG)
+ "call .trp.z" | | |
+mon | | remove(MEM_ALL)
+ "call .mon" | | |
+
+
+
+/* C O E R C I O N S */
+
+
+
+/* from 4 bytes to 2 */
+
+
+/* to a register */
+| ANYTOK | allocate(ANY_REG)
+ move(%[1],%[a]) | %[a] | |
+
+| STACK | allocate(ANY_REG)
+ "pop %[a]" | %[a] | |
+| LOCAL_ADDR | allocate(ANY_REG)
+ move(LB,%[a])
+ "add %[a],%[1]"
+ | %[a] | |
+
+
+/* between registers */
+
+| GEN_REG | allocate(GEN_REG)
+ "ld %[a.1],%[1.1]"
+ "ld %[a.2],%[1.2]" | %[a] | |
+| LOCALBASE | allocate(ANY_REG)
+ "push iy"
+ "pop %[a]" | %[a] | |
+
+
+/***********
+ ** MOVES **
+ ***********/
+
+
+
+MOVES:
+(ANY,ANY,"ld %[2],%[1]")
+(ANY1,ANY1,"ld %[2],%[1]")
+
+
+
+
+/************
+ * STACKS *
+ ************/
+
+
+STACKS:
+
+(ANY_REG, , "push %[1]" )
+(MEM_ALL, ANY_REG, move(%[1],%[a])
+ "push %[a]" )
+(MEM_ALL, , "push hl"
+ move(%[1],HL)
+ "ex (sp),hl" )