ack/mach/z80/cg/table
1985-03-29 21:10:43 +00:00

1441 lines
30 KiB
Plaintext

"$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" )