1445 lines
		
	
	
	
		
			30 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			1445 lines
		
	
	
	
		
			30 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
| "$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)				| | |
 | |
| zrf | |
 | |
| 				"call .unimpld" | | |
 | |
| 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 | |			"pop iy" | | |
 | |
| 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]  | |
 | |
| | IMMEDIATE |			allocate(ANY_REG)
 | |
| 				move(%[1],%[a])
 | |
| 							| %[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"      )
 |