"$Id$"
#define em_bsize	2	/* must be equal to EM_BSIZE */
#define	ND	!defined($1)
#define	D	defined($1)
#define	BASE	240
#define MIN	(0-BASE)
#define MAX	(254-em_bsize-BASE)
#define IN(x)	(x>=MIN && x<=MAX)
#define IND(x)	(x>=MIN && x<=(MAX-2))

/*****************************************************\
****						   ****
****     6 5 0 0   B A C K   E N D   T A B L E	   ****
****						   ****
\*****************************************************/


/*
 *   INTEGER SIZE:   16 bits
 *   POINTER SIZE:   16 bits
 *   NO FLOATS
 */


EM_WSIZE = 2
EM_PSIZE = 2
EM_BSIZE = 2



/*********************\
*  R E G I S T E R S  *
\*********************/

REGISTERS:
AA = ("a",1), REG.
XX = ("x",1), REG.
AX = ("<dummy>",2,AA,XX), R16.

/* AX is a registerpair, A contains the highbyte of a word and
 * X contains the lowbyte
 */


/***************\
*  T O K E N S  *
\***************/

TOKENS:
IMMEDIATE 	= {INT off;} 1  "#%[off]" /* a fake token the
					   * cgg needs one
					   */



/***********************************\
*  T O K E N E X P R E S S I O N S  *
\***********************************/

TOKENEXPRESSIONS:
AAA = IMMEDIATE		/* a fake tokenexpression
			 * the cgg needs one
			 */


/***********\
*  C O D E  *
\***********/

CODE:

/* GROUP 1 - LOAD */

loc ($1%256)==($1/256)	| |
		allocate(R16)
		"lda #[$1].l"
		"tax"
					| %[a] | |
loc	 | |
		allocate(R16)
		"lda #[$1].h"
		"ldx #[$1].l"
					| %[a] | |
ldc highw(1)==loww(1) && (loww(1)%256)==(loww(1)/256) | |
		allocate(R16)
		"lda #[%(loww(1)%)].l"
		"tax"
		"jsr Push"
					| %[a] | |
ldc	 | |
		allocate(R16)
		"lda #[%(highw(1)%)].h"
		"ldx #[%(highw(1)%)].l"
		"jsr Push"
		"lda #[%(loww(1)%)].h"
		"ldx #[%(loww(1)%)].l"
					| %[a] | |
lol IN($1)	| |
		allocate(R16)
		"ldy #BASE+$1"
		"lda (LBl),y"
		"tax"
		"iny"
		"lda (LBl),y"
					| %[a] | |
lol 	| |
		allocate(R16)
		"lda #[$1].h"
		"ldx #[$1].l"
		"jsr Lol"
					| %[a] | |
loe	| |
		allocate(R16)
		"lda $1+1"
		"ldx $1"
					| %[a] | |
lil IN($1)	| |
		allocate(R16)
		"ldy #BASE+$1"
		"lda (LBl),y"
		"tax"
		"iny"
		"lda (LBl),y"
		"jsr Loi"
					| %[a] | |
lil 	| |
		allocate(R16)
		"lda #[$1].h"
		"ldx #[$1].l"
		"jsr Lol"
		"jsr Loi"
					| %[a] | |
lof $1==0	| R16 |
		"jsr Loi"
					| %[1] | |
lof    | |
		allocate(R16)
		"lda #[$1].h"
		"ldx #[$1].l"
		"jsr Adi2"
		"jsr Loi"
					| %[a] | |
lal	| |
		allocate(R16)
		"clc"
		"lda #[$1].l"
		"adc LB"
		"tax"
		"lda #[$1].h"
		"adc LB+1"
					| %[a] | |
lae 	| |
		allocate(R16)
		"lda #[$1].h"
		"ldx #[$1].l"
					| %[a] | |
lxl $1==0	| |
		allocate(R16)
		"lda LB+1"
		"ldx LB"
					| %[a] | |
lxl $1<=255	| |		/* n restricted to a max of 255 */
		allocate(R16)
		"ldx #[$1].l"
		"jsr Lxl"
					| %[a] | |
lxa $1==0	| |
		allocate(R16)
		"jsr Lxa1"
					| %[a] | |
lxa $1<=255	| |		/* n restricted to a max of 255 */
		allocate(R16)
		"ldx #[$1].l"
		"jsr Lxa2"
					| %[a] | |
loi $1==1	| R16 |
		"jsr Loi1"
					| %[1] | |
loi $1==2	| R16 |
		"jsr Loi"
					| %[1] | |
loi $1==4	| R16 |
		"jsr Ldi"
					| | |
loi D		| R16 |
		"ldy #[$1].h"
		"sty NBYTES+1"
		"ldy #[$1].l"
		"jsr Loil"
					| | |
los $1==2	| R16 |
		"jsr Los"
					| | |
ldl IND($1)	| |
		allocate(R16)
		"ldy #BASE+$1+3"
		"lda (LBl),y"
		"pha"
		"dey"
		"lda (LBl),y"
		"tax"
		"pla"
		"jsr Push"
		"dey"
		"lda (LBl),y"
		"pha"
		"dey"
		"lda (LBl),y"
		"tax"
		"pla"
					| %[a] | |
ldl	| |
		allocate(R16)
		"lda #[$1].h"
		"ldx #[$1].l"
		"jsr Locaddr"
		"jsr Ldo"
					| | |
lde	| |
		allocate(R16)
		"lda $1+3"
		"ldx $1+2"
		"jsr Push"
		"lda $1+1"
		"ldx $1"
					| %[a] | |
ldf $1==0	| R16 |
		"jsr Ldi"
					| | |
ldf	| |
		allocate(R16)
		"lda #[$1].h"
		"ldx #[$1].l"
		"jsr Adi2"
		"jsr Ldi"
					| | |
lpi 	| |
		allocate(R16)
		"lda #[$1].h"
		"ldx #[$1].l"
					| %[a] | |


/* GROUP 2 - STORE */

stl IN($1)	| R16 |
		"ldy #BASE+1+$1"
		"sta (LBl),y"
		"txa"
		"dey"
		"sta (LBl),y"
					| | |
stl	| |
		allocate(R16)
		"lda #[$1].h"
		"ldx #[$1].l"
		"jsr Stl"
					| | |
ste	| R16 |
		"sta $1+1"
		"stx $1"
					| | |
sil IN($1)	| |
		allocate(R16)
		"ldy #BASE+$1"
		"lda (LBl),y"
		"tax"
		"iny"
		"lda (LBl),y"
		"jsr Sti"
					| | |
sil	| |
		allocate(R16)
		"lda #[$1].h"
		"ldx #[$1].l"
		"jsr Lol"
		"jsr Sti"
					| | |
stf $1==0	| R16 |
		"jsr Sti"
					| | |
stf	| |
		allocate(R16)
		"lda #[$1].h"
		"ldx #[$1].l"
		"jsr Adi2"
		"jsr Sti"
					| | |
sti $1==1	| R16 |
		"jsr Sti1"
					| | |
sti $1==2	| R16 |
		"jsr Sti"
					| | |
sti $1==4	| R16 |
		"jsr Sdi"
					| | |
sti D	| R16 |
		"ldy #[$1].h"
		"sty NBYTES+1"
		"ldy #[$1].l"
		"jsr Stil"
					| | |
sts $1==2	| R16 |
		"jsr Sts"
					| | |
sdl IND($1)	| R16 |
		"ldy #BASE+$1"
		"pha"
		"txa"
		"sta (LBl),y"
		"iny"
		"pla"
		"sta (LBl),y"
		"jsr Pop"
		"iny"
		"pha"
		"txa"
		"sta (LBl),y"
		"iny"
		"pla"
		"sta (LBl),y"
					| | |
sdl	| |
		allocate(R16)
		"lda #[$1].h"
		"ldx #[$1].l"
		"jsr Locaddr"
		"jsr Sdo"
					| | |
sde	| R16 |
		"sta $1+1"
		"stx $1"
		"jsr Pop"
		"sta $1+3"
		"stx $1+2"
					| | |
sdf $1==0	| R16 |
		"jsr Sdi"
					| | |
sdf	| |
		allocate(R16)
		"lda #[$1].h"
		"ldx #[$1].l"
		"jsr Adi2"
		"jsr Sdi"
					| | |


/* GROUP 3 - INTEGER ARITHMETIC */

loc lol adi (IN($2) && $3==2)	| |
		allocate(R16)
		"ldy #BASE+$2"
		"clc"
		"lda #[$1].l"
		"adc (LBl),y"
		"tax"
		"iny"
		"lda #[$1].h"
		"adc (LBl),y"
					| %[a] | |
lol loc adi	| | | | loc $2 lol $1 adi $3 |
lol lol adi (IN($1) && IN($2) && $3==2) | |
		allocate(R16)
		"ldy #BASE+$1+1"
		"lda (LBl),y"
		"pha"
		"dey"
		"lda (LBl),y"
		"ldy #BASE+$2"
		"clc"
		"adc (LBl),y"
		"tax"
		"iny"
		"pla"
		"adc (LBl),y"
					| %[a] | |
lol loe adi (IN($1) && $3==2) | |
		allocate(R16)
		"ldy #BASE+$1"
		"clc"
		"lda (LBl),y"
		"adc $2"
		"tax"
		"iny"
		"lda (LBl),y"
		"adc $2+1"
					| %[a] | |
loe lol adi	| | | | lol $2 loe $1 adi $3 |
loe loe adi $3==2	| |
		allocate(R16)
		"clc"
		"lda $1"
		"adc $2"
		"tax"
		"lda $1+1"
		"adc $2+1"
					| %[a] | |
loc loe adi $3==2	| |
		allocate(R16)
		"clc"
		"lda #[$1].l"
		"adc $2"
		"tax"
		"lda #[$1].h"
		"adc $2+1"
					| %[a] | |
loe loc adi 	| | | | loc $2 loe $1 adi $3 |
ldl adi IND($1) && $2==2	| |
		allocate(R16)
		"ldy #BASE+$1"
		"clc"
		"lda (LBl),y"
		"iny"
		"iny"
		"adc (LBl),y"
		"tax"
		"dey"
		"lda (LBl),y"
		"iny"
		"iny"
		"adc (LBl),y"
					| %[a] | |
lde adi $2==2	| |
		allocate(R16)
		"clc"
		"lda $1"
		"adc $1+2"
		"tax"
		"lda $1+1"
		"adc $1+3"
					| %[a] | |
loc adi $2==2 | R16 |
		"pha"
		"txa"
		"clc"
		"adc #[$1].l"
		"tax"
		"pla"
		"adc #[$1].h"
					| %[1] | |
lol adi IN($1) && $2==2 | R16 |
		"pha"
		"ldy #BASE+$1"
		"clc"
		"txa"
		"adc (LBl),y"
		"tax"
		"iny"
		"pla"
		"adc (LBl),y"
					| %[1] | |
loe adi $2==2	| R16 |
		"pha"
		"clc"
		"txa"
		"adc $1"
		"tax"
		"pla"
		"adc $1+1"
					| %[1] | |
lol lol adi IN($1) && !IN($2) && $3==2
		| | | | lol $2 lol $1 adi $3 |
adi $1==2	| R16 |
		"jsr Adi2"
					| %[1] | |
adi $1==4	| |
		allocate(R16)
		"jsr Adi4"
					| | |
adi ND	| R16 |
		"jsr Test2"
		"jsr Adi2"
					| %[1] | |
loc lol sbi (IN($2) && $3==2)	| |
		allocate(R16)
		"ldy #BASE+$1"
		"sec"
		"lda #[$1].l"
		"sbc (LBl),y"
		"tax"
		"iny"
		"lda #[$1].h"
 		"sbc (LBl),y"
 					| %[a] | |
lol loc sbi	| | | | lol $1 loc 0-$2 adi $3 |
lol lol sbi (IN($1) && IN($2) && $3==2) | |
		allocate(R16)
		"ldy #BASE+$1+1"
		"lda (LBl),y"
		"pha"
		"dey"
		"lda (LBl),y"
		"ldy #BASE+$2"
		"sec"
		"sbc (LBl),y"
		"tax"
		"iny"
		"pla"
		"sbc (LBl),y"
					| %[a] | |
lol loe sbi (IN($1) && $3==2) | |
		allocate(R16)
		"ldy #BASE+$1"
		"sec"
		"lda (LBl),y"
		"sbc $2"
		"tax"
		"iny"
		"lda (LBl),y"
		"sbc $2+1"
					| %[a] | |
loe lol sbi (IN($2) && $3==2) | |
		allocate(R16)
		"ldy #BASE+$1"
		"sec"
		"lda $2"
		"sbc (LBl),y"
		"tax"
		"iny"
		"lda $2+1"
		"sbc (LBl),y"
					| %[a] | |
loe loe sbi $3==2	| |
		allocate(R16)
		"sec"
		"lda $1"
		"sbc $2"
		"tax"
		"lda $1+1"
		"sbc $2+1"
					| %[a] | |
loc loe sbi $3==2	| |
		allocate(R16)
		"sec"
		"lda #[$1].l"
		"sbc $2"
		"tax"
		"lda #[$1].h"
		"sbc $2+1"
					| %[a] | |
loe loc sbi 	| | | | loe $1 loc 0-$2 adi $3 |
ldl sbi IND($1) && $2==2	| |
		allocate(R16)
		"ldy #BASE+$1+2"
		"sec"
		"lda (LBl),y"
		"dey"
		"dey"
		"sbc (LBl),y"
		"tax"
		"ldy #BASE+$1+3"
		"lda (LBl),y"
		"dey"
		"dey"
		"sbc (LBl),y"
					| %[a] | |
lde sbi $2==2	| |
		allocate(R16)
		"sec"
		"lda $1+2"
		"sbc $1"
		"tax"
		"lda $1+3"
		"sbc $1"
					| %[a] | |
loc sbi $2==2	| R16 |
		"pha"
		"txa"
		"sec"
		"sbc #[$1].l"
		"tax"
		"pla"
		"sbc #[$1].h"
					| %[1] | |
lol sbi IN($1) && $2==2 | R16 |
		"pha"
		"ldy #BASE+$1"
		"sec"
		"txa"
		"sbc (LBl),y"
		"tax"
		"iny"
		"pla"
		"sbc #[$1].h"
					| %[1] | |
loe sbi $2==2 | R16 |
		"pha"
		"sec"
		"txa"
		"sbc $1"
		"tax"
		"pla"
		"sbc $1+1"
					| %[1] | |
sbi $1==2	| R16 |
		"jsr Sbi2"
					| %[1] | |
sbi $1==4	| |
		allocate(R16)
		"jsr Sbi4"
					| | |
sbi ND	| R16 |
		"jsr Test2"
		"jsr Sbi2"
					| %[1] | |
loc lol mli (IN($2) && $3==2)	| |
		allocate(R16)
		"lda #[$1].l"
		"sta ARTH"
		"lda #[$1].h"
		"sta ARTH+1"
		"ldy #BASE+$2"
		"lda (LBl),y"
		"sta ARTH+2"
		"iny"
		"lda (LBl),y"
		"sta ARTH+3"
		"jsr Mlinp"
 					| %[a] | |
lol loc mli	| | | | loc $2 lol $1 mli $3 |
lol lol mli (IN($1) && IN($2) && $3==2) | |
		allocate(R16)
		"ldy #BASE+$1"
		"lda (LBl),y"
		"sta ARTH"
		"iny"
		"lda (LBl),y"
		"sta ARTH+1"
		"ldy #BASE+$2"
		"lda (LBl),y"
		"sta ARTH+2"
		"iny"
		"lda (LBl),y"
		"sta ARTH+3"
		"jsr Mlinp"
					| %[a] | |
lol loe mli (IN($1) && $3==2) | |
		allocate(R16)
		"ldy #BASE+$1"
		"lda (LBl),y"
		"sta ARTH"
		"iny"
		"lda (LBl),y"
		"sta ARTH+1"
		"lda $2"
		"sta ARTH+2"
		"lda $2+1"
		"sta ARTH+3"
		"jsr Mlinp"
					| %[a] | |
loe lol mli (IN($2) && $3==2) | | | | lol $2 loe $1 mli $3 |
loe loe mli $3==2	| |
		allocate(R16)
		"lda $1"
		"sta ARTH"
		"lda $1+1"
		"sta ARTH+1"
		"lda $2"
		"sta ARTH+2"
		"lda $2+1"
		"sta ARTH+3"
		"jsr Mlinp"
					| %[a] | |
loc loe mli $3==2	| |
		allocate(R16)
		"lda #[$1].l"
		"sta ARTH"
		"lda #[$1].h"
		"sta ARTH+1"
		"lda $2"
		"sta ARTH+2"
		"lda $2+1"
		"sta ARTH+3"
		"jsr Mlinp"
					| %[a] | |
loe loc mli 	| | | | loc $2 loe $1 mli $3 |
ldl mli IND($1) && $2==2	| |
		allocate(R16)
		"ldy #BASE+$1"
		"lda (LBl),y"
		"sta ARTH"
		"iny"
		"lda (LBl),y"
		"sta ARTH+1"
		"iny"
		"lda (LBl),y"
		"sta ARTH+2"
		"iny"
		"lda (LBl),y"
		"sta ARTH+3"
		"jsr Mlinp"
					| %[a] | |
lde mli $2==2	| |
		allocate(R16)
		"lda $1"
		"sta ARTH"
		"lda $1+1"
		"sta ARTH+1"
		"lda $1+2"
		"sta ARTH+2"
		"lda $1+3"
		"sta ARTH+3"
		"jsr Mlinp"
					| %[a] | |
loc mli $2==2 | R16 |
		"stx ARTH"
		"sta ARTH+1"
		"lda #[$1].l"
		"sta ARTH+2"
		"lda #[$1].h"
		"sta ARTH+3"
		"jsr Mlinp"
					| %[1] | |
lol mli IN($1) && $2==2 | R16 |
		"stx ARTH"
		"sta ARTH+1"
		"ldy #BASE+$1"
		"lda (LBl),y"
		"sta ARTH+2"
		"iny"
		"lda (LBl),y"
		"sta ARTH+3"
		"jsr Mlinp"
					| %[1] | |
loe mli $2==2	| R16 |
		"stx ARTH"
		"sta ARTH+1"
		"lda $1"
		"sta ARTH+2"
		"lda $1+1"
		"sta ARTH+3"
		"jsr Mlinp"
					| %[1] | |
lol lol mli IN($1) && !IN($2) && $3==2
		| | | | lol $2 lol $1 mli $3 |
mli $1==2	| R16 |
		"jsr Mli2"
					| %[1] | |
mli $1==4	| |
		allocate(R16)
		"jsr Mli4"
					| | |
mli ND	| R16 |
		"jsr Test2"
		"jsr Mli2"
					| %[1] | |
loc lol dvi (IN($2) && $3==2)	| |
		allocate(R16)
		"ldy #BASE+$2"
		"lda (LBl),y"
		"sta ARTH"
		"iny"
		"lda (LBl),y"
		"sta ARTH+1"
		"lda #[$1].l"
		"sta ARTH+2"
		"lda #[$1].h"
		"sta ARTH+3"
		"ldy #1"
		"sty UNSIGN"
		"jsr Div"
 					| %[a] | |
lol loc dvi (IN($1) && $3==2)	| |
		allocate(R16)
		"lda #[$2].l"
		"sta ARTH"
		"lda #[$2].h"
		"sta ARTH+1"
		"ldy #BASE+$1"
		"lda (LBl),y"
		"sta ARTH+2"
		"iny"
		"lda (LBl),y"
		"sta ARTH+3"
		"ldy #1"
		"sty UNSIGN"
		"jsr Div"
 					| %[a] | |
lol lol dvi (IN($1) && IN($2) && $3==2) | |
		allocate(R16)
		"ldy #BASE+$2"
		"lda (LBl),y"
		"sta ARTH"
		"iny"
		"lda (LBl),y"
		"sta ARTH+1"
		"ldy #BASE+$1"
		"lda (LBl),y"
		"sta ARTH+2"
		"iny"
		"lda (LBl),y"
		"sta ARTH+3"
		"ldy #1"
		"sty UNSIGN"
		"jsr Div"
					| %[a] | |
lol loe dvi (IN($1) && $3==2) | |
		allocate(R16)
		"ldy #BASE+$1"
		"lda (LBl),y"
		"sta ARTH+2"
		"iny"
		"lda (LBl),y"
		"sta ARTH+3"
		"lda $2"
		"sta ARTH"
		"lda $2+1"
		"sta ARTH+1"
		"ldy #1"
		"sty UNSIGN"
		"jsr Div"
					| %[a] | |
loe lol dvi (IN($2) && $3==2) | |
		allocate(R16)
		"ldy #BASE+$2"
		"lda (LBl),y"
		"sta ARTH"
		"iny"
		"lda (LBl),y"
		"sta ARTH+1"
		"lda $2"
		"sta ARTH+2"
		"lda $2+1"
		"sta ARTH+3"
		"ldy #1"
		"sty UNSIGN"
		"jsr Div"
					| %[a] | |
loe loe dvi $3==2	| |
		allocate(R16)
		"lda $2"
		"sta ARTH"
		"lda $2+1"
		"sta ARTH+1"
		"lda $1"
		"sta ARTH+2"
		"lda $1+1"
		"sta ARTH+3"
		"ldy #1"
		"sty UNSIGN"
		"jsr Div"
					| %[a] | |
loc loe dvi $3==2	| |
		allocate(R16)
		"lda #[$1].l"
		"sta ARTH+2"
		"lda #[$1].h"
		"sta ARTH+3"
		"lda $2"
		"sta ARTH"
		"lda $2+1"
		"sta ARTH+1"
		"ldy #1"
		"sty UNSIGN"
		"jsr Div"
					| %[a] | |
loe loc dvi $3==2	| |
		allocate(R16)
		"lda #[$2].l"
		"sta ARTH"
		"lda #[$2].h"
		"sta ARTH+1"
		"lda $1"
		"sta ARTH+2"
		"lda $1+1"
		"sta ARTH+3"
		"ldy #1"
		"sty UNSIGN"
		"jsr Div"
					| %[a] | |
ldl dvi IND($1) && $2==2	| |
		allocate(R16)
		"ldy #BASE+$1"
		"lda (LBl),y"
		"sta ARTH"
		"iny"
		"lda (LBl),y"
		"sta ARTH+1"
		"iny"
		"lda (LBl),y"
		"sta ARTH+2"
		"iny"
		"lda (LBl),y"
		"sta ARTH+3"
		"ldy #1"
		"sty UNSIGN"
		"jsr Div"
					| %[a] | |
lde dvi $2==2	| |
		allocate(R16)
		"lda $1"
		"sta ARTH"
		"lda $1+1"
		"sta ARTH+1"
		"lda $1+2"
		"sta ARTH+2"
		"lda $1+3"
		"sta ARTH+3"
		"ldy #1"
		"sty UNSIGN"
		"jsr Div"
					| %[a] | |
loc dvi $2==2 | R16 |
		"stx ARTH+2"
		"sta ARTH+3"
		"lda #[$1].l"
		"sta ARTH"
		"lda #[$1].h"
		"sta ARTH+1"
		"ldy #1"
		"sty UNSIGN"
		"jsr Div"
					| %[1] | |
lol dvi IN($1) && $2==2 | R16 |
		"stx ARTH+2"
		"sta ARTH+3"
		"ldy #BASE+$1"
		"lda (LBl),y"
		"sta ARTH"
		"iny"
		"lda (LBl),y"
		"sta ARTH+1"
		"ldy #1"
		"sty UNSIGN"
		"jsr Div"
					| %[1] | |
loe dvi $2==2	| R16 |
		"stx ARTH+2"
		"sta ARTH+3"
		"lda $1"
		"sta ARTH"
		"lda $1+1"
		"sta ARTH+1"
		"ldy #1"
		"sty UNSIGN"
		"jsr Div"
					| %[1] | |
dvi $1==2	| R16 |
		"jsr Dvi2"
					| %[1] | |
dvi $1==4	| |
		allocate(R16)
		"jsr Dvi4"
					| | |
dvi ND	| R16 |
		"jsr Test2"
		"jsr Dvi2"
					| %[1] | |
rmi $1==2	| R16 |
		"jsr Rmi2"
					| %[1] | |
rmi $1==4	| |
		allocate(R16)
		"jsr Rmi4"
					| | |
rmi ND	| R16 |
		"jsr Test2"
		"jsr Rmi2"
					| %[1] | |
ngi $1==2	| R16 |
		"jsr Ngi2"
					| %[1] | |
ngi $1==4	| |
		allocate(R16)
		"lda SP+1"
		"ldx SP+2"
		"jsr Ngi4"
					| | |
ngi ND	| R16 |
		"jsr Test2"
		"jsr Ngi2"
					| %[1] | |
sli $1==2	| R16 |
		"jsr Sli2"
					| %[1] | |
sli $1==4	| R16 |
		"jsr Sli4"
					| | |
sli ND	| R16 |
		"jsr Test2"
		"jsr Sli2"
					| %[1] | |
sri $1==2	| R16 |
		"jsr Sri2"
					| %[1] | |
sri $1==4	| R16 |
		"jsr Sri4"
					| | |
sri ND	| R16 |
		"jsr Test2"
		"jsr Sri2"
					| %[1] | |


/* GROUP 4 - UNSIGNED ARITHMETIC */

loc lol adu	| | | | loc $1 lol $2 adi $3 |
lol loc adu	| | | | lol $1 loc $2 adi $3 |
lol lol adu	| | | | lol $1 lol $2 adi $3 |
lol loe adu	| | | | lol $1 loe $2 adi $3 |
loe lol adu	| | | | loe $1 lol $2 adi $3 |
loe loe adu	| | | | loe $1 loe $2 adi $3 |
loc loe adu	| | | | loc $1 loe $2 adi $3 |
loe loc adu	| | | | loe $1 loc $2 adi $3 |
ldl adu		| | | | ldl $1 adi $2 |
lde adu		| | | | lde $1 adi $2 |
loc adu		| | | | loc $1 adi $2 |
lol adu		| | | | lol $1 adi $2 |
loe adu		| | | | loe $1 adi $2 |
adu		| | | | adi $1 |

loc lol sbu	| | | | loc $1 lol $2 sbi $3 |
lol loc sbu	| | | | lol $1 loc $2 sbi $3 |
lol lol sbu	| | | | lol $1 lol $2 sbi $3 |
lol loe sbu	| | | | lol $1 loe $2 sbi $3 |
loe lol sbu	| | | | loe $1 lol $2 sbi $3 |
loe loe sbu	| | | | loe $1 loe $2 sbi $3 |
loc loe sbu	| | | | loc $1 loe $2 sbi $3 |
loe loc sbu	| | | | loe $1 loc $2 sbi $3 |
ldl sbu		| | | | ldl $1 sbi $2 |
lde sbu		| | | | lde $1 sbi $2 |
loc sbu		| | | | loc $1 sbi $2 |
lol sbu		| | | | lol $1 sbi $2 |
loe sbu		| | | | loe $1 sbi $2 |
sbu		| | | | sbi $1 |

loc lol mlu (IN($2) && $3==2)	| |
		allocate(R16)
		"lda #[$1].l"
		"sta ARTH"
		"lda #[$1].h"
		"sta ARTH+1"
		"ldy #BASE+$2"
		"lda (LBl),y"
		"sta ARTH+2"
		"iny"
		"lda (LBl),y"
		"sta ARTH+3"
		"ldy #0"
		"sty UNSIGN"
		"jsr Mul"
 					| %[a] | |
lol loc mlu	| | | | loc $2 lol $1 mlu $3 |
lol lol mlu (IN($1) && IN($2) && $3==2) | |
		allocate(R16)
		"ldy #BASE+$1"
		"lda (LBl),y"
		"sta ARTH"
		"iny"
		"lda (LBl),y"
		"sta ARTH+1"
		"ldy #BASE+$2"
		"lda (LBl),y"
		"sta ARTH+2"
		"iny"
		"lda (LBl),y"
		"sta ARTH+3"
		"ldy #0"
		"sty UNSIGN"
		"jsr Mul"
					| %[a] | |
lol loe mlu (IN($1) && $3==2) | |
		allocate(R16)
		"ldy #BASE+$1"
		"lda (LBl),y"
		"sta ARTH"
		"iny"
		"lda (LBl),y"
		"sta ARTH+1"
		"lda $2"
		"sta ARTH+2"
		"lda $2+1"
		"sta ARTH+3"
		"ldy #0"
		"sty UNSIGN"
		"jsr Mul"
					| %[a] | |
loe lol mlu (IN($2) && $3==2) | | | | lol $2 loe $1 mlu $3 |
loe loe mlu $3==2	| |
		allocate(R16)
		"lda $1"
		"sta ARTH"
		"lda $1+1"
		"sta ARTH+1"
		"lda $2"
		"sta ARTH+2"
		"lda $2+1"
		"sta ARTH+3"
		"ldy #0"
		"sty UNSIGN"
		"jsr Mul"
					| %[a] | |
loc loe mlu $3==2	| |
		allocate(R16)
		"lda #[$1].l"
		"sta ARTH"
		"lda #[$1].h"
		"sta ARTH+1"
		"lda $2"
		"sta ARTH+2"
		"lda $2+1"
		"sta ARTH+3"
		"ldy #0"
		"sty UNSIGN"
		"jsr Mul"
					| %[a] | |
loe loc mlu 	| | | | loc $2 loe $1 mlu $3 |
ldl mlu IND($1) && $2==2	| |
		allocate(R16)
		"ldy #BASE+$1"
		"lda (LBl),y"
		"sta ARTH"
		"iny"
		"lda (LBl),y"
		"sta ARTH+1"
		"iny"
		"lda (LBl),y"
		"sta ARTH+2"
		"iny"
		"lda (LBl),y"
		"sta ARTH+3"
		"ldy #0"
		"sty UNSIGN"
		"jsr Mul"
					| %[a] | |
lde mlu $2==2	| |
		allocate(R16)
		"lda $1"
		"sta ARTH"
		"lda $1+1"
		"sta ARTH+1"
		"lda $1+2"
		"sta ARTH+2"
		"lda $1+3"
		"sta ARTH+3"
		"ldy #0"
		"sty UNSIGN"
		"jsr Mul"
					| %[a] | |
loc mlu $2==2 | R16 |
		"stx ARTH"
		"sta ARTH+1"
		"lda #[$1].l"
		"sta ARTH+2"
		"lda #[$1].h"
		"sta ARTH+3"
		"ldy #0"
		"sty UNSIGN"
		"jsr Mul"
					| %[1] | |
lol mlu IN($1) && $2==2 | R16 |
		"stx ARTH"
		"sta ARTH+1"
		"ldy #BASE+$1"
		"lda (LBl),y"
		"sta ARTH+2"
		"iny"
		"lda (LBl),y"
		"sta ARTH+3"
		"ldy #0"
		"sty UNSIGN"
		"jsr Mul"
					| %[1] | |
loe mlu $2==2	| R16 |
		"stx ARTH"
		"sta ARTH+1"
		"lda $1"
		"sta ARTH+2"
		"lda $1+1"
		"sta ARTH+3"
		"ldy #0"
		"sty UNSIGN"
		"jsr Mul"
					| %[1] | |
lol lol mlu IN($1) && !IN($2) && $3==2
		| | | | lol $2 lol $1 mlu $3 |
mlu $1==2	| R16 |
		"jsr Mlu2"
					| %[1] | |
mlu $1==4	| |
		allocate(R16)
		"jsr Mlu4"
					| | |
mlu ND	| R16 |
		"jsr Test2"
		"jsr Mlu2"
					| %[1] | |

loc lol dvu (IN($2) && $3==2)	| |
		allocate(R16)
		"ldy #BASE+$2"
		"lda (LBl),y"
		"sta ARTH"
		"iny"
		"lda (LBl),y"
		"sta ARTH+1"
		"lda #[$1].l"
		"sta ARTH+2"
		"lda #[$1].h"
		"sta ARTH+3"
		"ldy #0"
		"sty UNSIGN"
		"jsr Duv"
 					| %[a] | |
lol loc dvu (IN($1) && $3==2)	| |
		allocate(R16)
		"lda #[$2].l"
		"sta ARTH"
		"lda #[$2].h"
		"sta ARTH+1"
		"ldy #BASE+$1"
		"lda (LBl),y"
		"sta ARTH+2"
		"iny"
		"lda (LBl),y"
		"sta ARTH+3"
		"ldy #0"
		"sty UNSIGN"
		"jsr Duv"
 					| %[a] | |
lol lol dvu (IN($1) && IN($2) && $3==2) | |
		allocate(R16)
		"ldy #BASE+$2"
		"lda (LBl),y"
		"sta ARTH"
		"iny"
		"lda (LBl),y"
		"sta ARTH+1"
		"ldy #BASE+$1"
		"lda (LBl),y"
		"sta ARTH+2"
		"iny"
		"lda (LBl),y"
		"sta ARTH+3"
		"ldy #0"
		"sty UNSIGN"
		"jsr Duv"
					| %[a] | |
lol loe dvu (IN($1) && $3==2) | |
		allocate(R16)
		"ldy #BASE+$1"
		"lda (LBl),y"
		"sta ARTH+2"
		"iny"
		"lda (LBl),y"
		"sta ARTH+3"
		"lda $2"
		"sta ARTH"
		"lda $2+1"
		"sta ARTH+1"
		"ldy #0"
		"sty UNSIGN"
		"jsr Duv"
					| %[a] | |
loe lol dvu (IN($2) && $3==2) | |
		allocate(R16)
		"ldy #BASE+$2"
		"lda (LBl),y"
		"sta ARTH"
		"iny"
		"lda (LBl),y"
		"sta ARTH+1"
		"lda $2"
		"sta ARTH+2"
		"lda $2+1"
		"sta ARTH+3"
		"ldy #0"
		"sty UNSIGN"
		"jsr Duv"
					| %[a] | |
loe loe dvu $3==2	| |
		allocate(R16)
		"lda $2"
		"sta ARTH"
		"lda $2+1"
		"sta ARTH+1"
		"lda $1"
		"sta ARTH+2"
		"lda $1+1"
		"sta ARTH+3"
		"ldy #0"
		"sty UNSIGN"
		"jsr Duv"
					| %[a] | |
loc loe dvu $3==2	| |
		allocate(R16)
		"lda #[$1].l"
		"sta ARTH+2"
		"lda #[$1].h"
		"sta ARTH+3"
		"lda $2"
		"sta ARTH"
		"lda $2+1"
		"sta ARTH+1"
		"ldy #0"
		"sty UNSIGN"
		"jsr Duv"
					| %[a] | |
loe loc dvu $3==2	| |
		allocate(R16)
		"lda #[$2].l"
		"sta ARTH"
		"lda #[$2].h"
		"sta ARTH+1"
		"lda $1"
		"sta ARTH+2"
		"lda $1+1"
		"sta ARTH+3"
		"ldy #0"
		"sty UNSIGN"
		"jsr Duv"
					| %[a] | |
ldl dvu IND($1) && $2==2	| |
		allocate(R16)
		"ldy #BASE+$1"
		"lda (LBl),y"
		"sta ARTH"
		"iny"
		"lda (LBl),y"
		"sta ARTH+1"
		"iny"
		"lda (LBl),y"
		"sta ARTH+2"
		"iny"
		"lda (LBl),y"
		"sta ARTH+3"
		"ldy #0"
		"sty UNSIGN"
		"jsr Duv"
					| %[a] | |
lde dvu $2==2	| |
		allocate(R16)
		"lda $1"
		"sta ARTH"
		"lda $1+1"
		"sta ARTH+1"
		"lda $1+2"
		"sta ARTH+2"
		"lda $1+3"
		"sta ARTH+3"
		"ldy #0"
		"sty UNSIGN"
		"jsr Duv"
					| %[a] | |
loc dvu $2==2 | R16 |
		"stx ARTH+2"
		"sta ARTH+3"
		"lda #[$1].l"
		"sta ARTH"
		"lda #[$1].h"
		"sta ARTH+1"
		"ldy #0"
		"sty UNSIGN"
		"jsr Duv"
					| %[1] | |
lol dvu IN($1) && $2==2 | R16 |
		"stx ARTH+2"
		"sta ARTH+3"
		"ldy #BASE+$1"
		"lda (LBl),y"
		"sta ARTH"
		"iny"
		"lda (LBl),y"
		"sta ARTH+1"
		"ldy #0"
		"sty UNSIGN"
		"jsr Duv"
					| %[1] | |
loe dvu $2==2	| R16 |
		"stx ARTH+2"
		"sta ARTH+3"
		"lda $1"
		"sta ARTH"
		"lda $1+1"
		"sta ARTH+1"
		"ldy #0"
		"sty UNSIGN"
		"jsr Duv"
					| %[1] | |
dvu $1==2	| R16 |
		"jsr Dvu2"
					| %[1] | |
dvu $1==4	| |
		allocate(R16)
		"jsr Dvu4"
					| | |
dvu ND	| R16 |
		"jsr Test2"
		"jsr Dvu2"
					| %[1] | |

rmu $1==2	| R16 |
		"jsr Rmu2"
					| %[1] | |
rmu $1==4	| |
		allocate(R16)
		"jsr Rmu4"
					| | |
slu	| | | | sli $1 |
sru $1==2	| R16 |
		"jsr Sru2"
					| %[1] | |
sru $1==4	| R16 |
		"jsr Sru4"
					| | |
sru ND	| R16 |
		"jsr Test2"
		"jsr Sru2"
					| %[1] | |


/* GROUP 6 - POINTER ARITHMETIC */

adp $1==0	| | | | |
adp	| | | | loc $1 adi 2 |
ads $1==2	| R16 |
		"jsr Adi2"
					| %[1] | |
ads ND 	| R16 |
		"jsr Test2"
		"jsr Adi2"
					| %[1] | |
sbs $1==2	| R16 |
		"jsr Sbi2"
					| %[1] | |
sbs ND	| R16 |
		"jsr Test2"
		"jsr Sbi2"
					| %[1] | |


/* GROUP 7 INCREMENT/DECREMENT/ZERO */

inc	| R16 |
		"inx"
		"bne 1f"
		"clc"
		"adc #1\n1:"
					| %[1] | |
inl IN($1)	| |
		allocate(R16)
		"ldy #BASE+$1"
		"clc"
		"lda (LBl),y"
		"adc #1"
		"sta (LBl),y"
		"bcc 1f"
		"iny"
		"lda (LBl),y"
		"adc #0"
		"sta (LBl),y\n1:"
					| | |
inl D	| |
		allocate(R16)
		"lda #[$1].h"
		"ldx #[$1].l"
		"jsr Lol"
		"inx"
		"bne 1f"
		"clc"
		"adc #1"
		"1: jsr Stii"
					| | |
ine	| |
		"inc $1"
		"bne 1f"
		"inc $1+1\n1:"
					| | |
dec	| R16 |
		"cpx #0"
		"bne 1f"
		"sec"
		"sbc #1"
		"1: dex"
					| %[1] | |
del IN($1)	| |
		allocate(R16)
		"ldy #BASE+$1"
		"sec"
		"lda (LBl),y"
		"sbc #1"
		"sta (LBl),y"
		"bcs 1f"
		"iny"
		"lda (LBl),y"
		"sbc #0"
		"sta (LBl),y\n1:"
					| | |
del	| |
		allocate(R16)
		"lda #[$1].h"
		"ldx #[$1].l"
		"jsr Lol"
		"cpx #0"
		"bne 1f"
		"sec"
		"sbc #1"
		"1: dex"
		"jsr Stii"
					| | |
dee 	| |
		"ldy $1"
		"bne 1f"
		"dec $1+1"
		"1: dey"
		"sty $1"
					| | |
zrl IN($1)	| |
		allocate(R16)
		"ldy #BASE+$1"
		"lda #0"
		"sta (LBl),y"
		"iny"
		"sta (LBl),y"
					| | |
zrl	| |
		allocate(R16)
		"lda #[$1].h"
		"ldx #[$1].l"
		"jsr Zrl"
					| | |
zre	| |
		"ldy #0"
		"sty $1"
		"sty $1+1"
					| | |
zer $1==2	| |
		allocate(R16)
		"lda #0"
		"tax"
					| %[a] | |
zer $1==4	| |
		allocate(R16)
		"lda #0"
		"tax"
		"jsr Push"
					| %[a] | |
zer $1>0 && $1<=256	| |
		allocate(R16)
		"ldy #$1-1"
		"jsr Zer"
					| | |


/* GROUP 8 - CONVERT (stack: source, source size, dest. size (top)) */

loc loc cii $1==1 && $2==2	| R16 |
		"txa"
		"bpl 1f"
		"lda #0xff"
		"bne 2f"
		"1:  lda #0\n2:"
					| %[1] | |
cii 	| R16 |
		"jsr Cii"
					| | |
cui 	| | | | cii |
ciu	| | | | cii |
cuu 	| | | | cii |
loc loc cui $1==$2	| | | | |
loc loc ciu $1==$2	| | | | |
loc loc cuu $1==2 && $2==4 | | | | loc 0 |


/* GROUP 9 - LOGICAL */

and $1==2	| R16 |
		"sta ARTH+1"
		"stx ARTH"
		"jsr Pop"
		"and ARTH+1"
		"pha"
		"txa"
		"and ARTH"
		"tax"
		"pla"
					| %[1] | |
and $1<=254	| |
		allocate(R16)
		"ldy #[$1].l"
		"jsr And"
					| | |
and ND	| R16 |
		"jsr TestFFh"
		"jsr Pop"
		"iny"
		"jsr And"
					| | |
ior $1==2	| R16 |
		"sta ARTH+1"
		"stx ARTH"
		"jsr Pop"
		"ora ARTH+1"
		"pha"
		"txa"
		"ora ARTH"
		"tax"
		"pla"
					| %[1] | |
ior $1<=254	| |
		allocate(R16)
		"ldy #[$1].l"
		"jsr Ior"
					| | |
ior ND	| R16 |
		"jsr TestFFh"
		"jsr Pop"
		"iny"
		"jsr Ior"
					| | |
xor $1==2	| R16 |
		"sta ARTH+1"
		"stx ARTH"
		"jsr Pop"
		"eor ARTH+1"
		"pha"
		"txa"
		"eor ARTH"
		"tax"
		"pla"
					| %[1] | |
xor $1<=254	| |
		allocate(R16)
		"ldy #[$1].l"
		"jsr Xor"
					| | |
xor ND	| R16 |
		"jsr TestFFh"
		"jsr Pop"
		"iny"
		"jsr Xor"
					| | |
com $1==2	| R16 |
		"eor #0xff"
		"pha"
		"txa"
		"eor #0xff"
		"tax"
		"pla"
					| %[1] | |
com $1<=254	| |
		allocate(R16)
		"ldy #[$1].l"
		"jsr Com"
					| | |
com ND	| R16 |
		"jsr TestFFh"
		"jsr Pop"
		"iny"
		"jsr Com"
					| | |
rol $1==2	| R16 |
		"jsr Rol"
					| %[1] | |
rol $1==4	| R16 |
		"jsr Rol4"
					| | |
rol ND	| R16 |
		"jsr Test2"
		"jsr Rolw"
					| %[1] | |
ror $1==2	| R16 |
		"jsr Ror"
					| %[1] | |
ror $1==4	| R16 |
		"jsr Ror4"
					| | |
ror ND	| R16 |
		"jsr Test2"
		"jsr Rorw"
					| %[1] | |


/* GROUP 10 - SETS */

loc inn $1<0 && $2==2	| R16 |
		"lda #0"
		"tax"
					| %[1] | |
loc inn	$2==2 && $1==0	| R16 |
		"txa"
		"and #1"
		"tax"
		"lda #0"
					| %[1] | |
loc inn	$2==2 && $1>0 && $1<16	| R16 |
		"ldy #$1"
		"stx ARTH"
		"1: lsr a"
		"ror ARTH"
		"dey"
		"bne 1b"
		"lda ARTH"
		"and #1"
		"tax"
		"lda #0"
					| %[1] | |
loc inn zeq $1>0 && $1<16 && $2==2	| R16 |
		"ldy #$1+1"
		"stx ARTH"
		"1: lsr a"
		"ror ARTH"
		"dey"
		"bne 1b"
		"bcc $1"
					| | |
loc inn zne $1>0 && $1<16 && $2==2	| R16 |
		"ldy #$1+1"
		"stx ARTH"
		"1: lsr a"
		"ror ARTH"
		"dey"
		"bne 1b"
		"bcs $1"
					| | |
inn $1==2	| R16 |
		"txa"
		"tay"
		"jsr Pop"
		"stx ARTH"
		"1: lsr a"
		"ror ARTH"
		"dey"
		"bne 1b"
		"lda ARTH"
		"and #1"
		"tax"
		"lda #0"
				| %[1] | |
inn zeq $1==2	| R16 |
		"txa"
		"tay"
		"jsr Pop"
		"stx ARTH"
		"1: lsr a"
		"ror ARTH"
		"dey"
		"bpl 1b"
		"lda ARTH"
		"bcc $2"
				| %[1] | |
inn zne $1==2	| R16 |
		"txa"
		"tay"
		"jsr Pop"
		"stx ARTH"
		"1: lsr a"
		"ror ARTH"
		"dey"
		"bpl 1b"
		"bcs $2"
				| %[1] | |
inn $1<=256	| R16 |
		"ldy #$1-1"
		"jsr Inn"
					| %[1] | |
inn ND	| R16 |
		"jsr TestFFh"
		"jsr Pop"
		"jsr Inn"
					| %[1] | |
loc set $2==2 && $1>=0 && $1<16	| |
		allocate(R16)
		"ldy #$1"
		"lda #0"
		"sta ARTH"
		"sec"
		"1: rol ARTH"
		"rol a"
		"dey"
		"bpl 1b"
		"ldx ARTH"
					| %[a] | |
set $1==2	| R16 |
		"txa"
		"tay"
		"lda #0"
		"sta ARTH"
		"sec"
		"1: rol ARTH"
		"rol a"
		"bpl 1b"
		"ldx ARTH"
					| %[1] | |
set $1<=256	| R16 |
		"ldy #$1-1"
		"jsr Set"
					| | |
set ND	| R16 |
		"jsr TestFFh"
		"jsr Pop"
		"jsr Set"
					| | |


/* GROUP 11 - ARRAY */

lae lar defined(rom(1,3)) | | | | lae $1 aar $2 loi rom(1,3) |
lar $1==2	| R16 |
		"jsr Lar"
					| | |
lar ND	| R16 |
		"jsr Test2"
		"jsr Lar"
					| | |
lae sar defined(rom(1,3)) | | | | lae $1 aar $2 sti rom(1,3) |
sar $1==2	| R16 |
		"jsr Sar"
					| | |
sar ND	| R16 |
		"jsr Test2"
		"jsr Sar"
					| | |
lae aar $2==2 && rom(1,3)==1 && rom(1,1)==0 | | | | adi 2 |
lae aar $2==2 && rom(1,3)==1 && rom(1,1)!=0 | |
				    | | adi 2 adp 0-rom(1,1) |
lae aar $2==2 && rom(1,3)==2 && rom(1,1)==0 | R16 |
		"pha"
		"txa"
		"asl a"
		"tax"
		"pla"
		"rol a"
					| %[1] | adi 2 |
lae aar $2==2 && rom(1,3)==2 && rom(1,1)!=0 | R16 |
		"pha"
		"txa"
		"asl a"
		"tax"
		"pla"
		"rol a"
				    | %[1] | adi 2 adp (0-rom(1,1))*2 |
lae aar $2==2 && rom(1,3)>2 && rom(1,1)==0 | |
					| | loc rom(1,3) mli 2 adi 2 |
lae aar $2==2 && rom(1,3)>2 && rom(1,1)!=0 | |
		| | loc rom(1,3) mli 2 adi 2 adp (0-rom(1,1))*rom(1,3) |
aar $1==2	| R16 |
		"jsr Aar"
					| %[1] | |
aar ND	| R16 |
		"jsr Test2"
		"jsr Aar"
					| %[1] | |


/* GROUP 12 - COMPARE */

cmi $1==2	| R16 |
		"jsr Cmi"
					| %[1] | |
cmi $1==4	| |
		allocate(R16)
		"jsr Cmi4"
					| %[a] | |
cmi ND	| R16 |
		"jsr Test2"
		"jsr Cmi"
					| %[1] | |
cmu $1==2	| R16 |
		"jsr Cmu2"
					| %[1] | |
cmu $1==4	| |
		allocate(R16)
		"jsr Cmu4"
					| %[a] | |
cmu ND	| R16 |
		"jsr Test2"
		"jsr Cmu"
					| | |
cmp	| |
					| | cmu 2 |
cms $1==2	| |
		allocate(R16)
		"ldy #2"
		"jsr Cms"
					| %[a] | |
cms $1==4	| |
		allocate(R16)
		"ldy #4"
		"jsr Cms"
					| %[a] | |
cms ND	| R16 |
		"jsr TestFFh"
		"iny"
		"jsr Cms"
					| %[1] | |
tlt	| R16 |
		"jsr Tlt"
					| %[1] | |
tle	| R16 |
		"jsr Tle"
					| %[1] | |
teq	| R16 |
		"jsr Teq"
					| %[1] | |
tne	| R16 |
		"jsr Tne"
					| %[1] | |
tge	| R16 |
		"jsr Tge"
					| %[1] | |
tgt	| R16 |
		"jsr Tgt"
					| %[1] | |


/* GROUP 13 - BRANCH */

bra	| |
		remove(ALL)
		"jmp $1"
					| | |

blt	| R16 |
		"jsr Sbi2"
		"bmi $1"
					| | |
ble	| R16 |
		"jsr Sbi2"
		"bmi $1"
		"bne 1f"
		"txa"
		"beq $1\n1:"
					| | |
beq	| R16 |
		"sta BRANCH+1"
		"stx BRANCH"
		"jsr Pop"
		"cmp BRANCH+1"
		"bne 1f"
		"cpx BRANCH"
		"beq $1\n1:"
					| | |
bne	| R16 |
		"sta BRANCH+1"
		"stx BRANCH"
		"jsr Pop"
		"cmp BRANCH+1"
		"bne $1"
		"cpx BRANCH"
		"bne $1"
					| | |
bge	| R16 |
		"jsr Sbi2"
		"bpl $1"
					| | |
bgt	| R16 |
		"jsr Sbi2"
		"bmi 1f"
		"bne $1"
		"txa"
		"bne $1\n1:"
					| | |

cmi zlt $1==2 | | | | blt $2 |
cmp zlt	| | | | blt $2 |
zlt	| R16 |
		"tay"
		"bmi $1"
					| | |
cmi zle $1==2 | | | | ble $2 |
cmp zle | | | | ble $2 |
zle	| R16 |
		"tay"
		"bmi $1"
		"bne 1f"
		"txa"
		"beq $1\n1:"
					| | |
cmi zeq $1==2 | | | | beq $2 |
cmp zeq | | | | beq $2 |
cms zeq $1==2 | | | | beq $2 |
zeq	| R16 |
		"tay"
		"bne 1f"
		"txa"
		"beq $1\n1:"
					| | |
cmi zne $1==2 | | | | bne $2 |
cmp zne | | | | bne $2 |
cms zne $1==2 | | | | bne $2 |
zne	| R16 |
		"tay"
		"bne $1"
		"txa"
		"bne $1"
					| | |
cmi zge $1==2 | | | | bge $2 |
cmp zge | | | | bge $2 |
zge	| R16 |
		"tay"
		"bpl $1"
					| | |
cmi zgt $1==2 | | | | bgt $2 |
cmp zgt | | | | bgt $2 |
zgt	| R16 |
		"tay"
		"bmi 1f"
		"bne $1"
		"txa"
		"bne $1\n1:"
					| | |


/* GROUP 14 - PROCEDURE CALL */

cai	| R16 |
		"stx ADDR"
		"sta ADDR+1"
		"jsr Indir"
					| | |
cal	| |
		remove(ALL)
		"jsr $1"
					| | |
lfr $1==2 | |
		allocate(R16)
		"lda #0"
		"ldx #RETURN"
		"jsr Loi"
					| %[a] | |
lfr $1==4 | |
		allocate(R16)
		"lda #0"
		"ldx #RETURN"
		"jsr Ldi"
					| | |
lfr ret $1==$2	| | | | ret 0 |
asp lfr ret $2==$3 | | | | ret 0 |
ret $1==0 || $1==2 || $1==4 	| |
		allocate(R16)
		"ldy #$1"
		"jmp Ret"
					| | |


/* GROUP 15 - MISCELLANOUS */

asp	| |
		allocate(R16)
		"lda #[$1].h"
		"ldx #[$1].l"
		"jsr Asp"
					| | |
ass $1==2	| R16 |
		"jsr Asp"
					| | |
ass ND	| R16 |
		"jsr Test2"
		"jsr Pop"
		"jsr Asp"
					| | |
blm $1==0	| | | | asp 4 |
blm D	| R16 |
		"ldy #[[$1].h+1]"
		"sty NBYTES+1"
		"ldy #[$1].l"
		"jsr Blm"
					| | |
bls $1==2	| R16 |
		"sta NBYTES+1"
		"inc NBYTES+1"
		"txa"
		"tay"
		"jsr Pop"
		"jsr Blm"
					| | |
bls ND	| R16 |
		"jsr Test2"
		"sta NBYTES+1"
		"inc NBYTES+1"
		"txa"
		"tay"
		"jsr Pop"
		"jsr Blm"
					| | |
csa	| R16 |
		"jmp Csa"
					| | |
csb	| R16 |
		"jmp Csb"
					| | |
dch	| | | | loi 2 |
dup $1==2	| R16 |
		"jsr Push"
					| %[1] | |
dup $1<=256	| |
		allocate(R16)
		"ldy #[$1].l"
		"jsr Dup"
					| | |
dus $1==2	| R16 |
		"jsr TestFFh"
		"iny"
		"jsr Dup"
					| | |
exg $1==2	| R16 |
		"jsr Exg2"
					| %[1] | |
exg $1<=255	| |
		allocate(R16)
		"ldy #$1"
		"jsr Exg"
					| | |
fil	| |
		"ldy #[$1].l"
		"sty hol0+4"
		"ldy #[$1].h"
		"sty hol0+5"
					| | |
gto	| |
		allocate(R16)
		"lda #[$1].h"
		"ldx #[$1].l"
		"jmp Gto"
					| | |
lim	| |
		allocate(R16)
		"ldx IGNMASK"
		"lda IGNMASK+1"
					| %[a] | |
lin	| |
		"ldy #[$1].l"
		"sty hol0"
		"ldy #[$1].h"
		"sty hol0+1"
					| | |
lni	| |
		"inc hol0"
		"bne 1f"
		"inc hol0+1\n1:"
					| | |
lor $1==0	| |
		allocate(R16)
		"ldx LB"
		"lda LB+1"
					| %[a] | |
lor $1==1	| |
		allocate(R16)
		"ldx SP+2"
		"lda SP+1"
					| %[a] | |
lor $1==2	| |
		allocate(R16)
		"ldx HP"
		"lda HP+1"
					| %[a] | |
lpb	| | | | adp 2 |
mon	| R16 |
		"jsr Mon"
					| %[1] | |
nop	| STACK |
#ifdef DEBUG
		allocate(R16)
		"jsr Printstack"
#endif
					| | |
rck	| R16 | | | |
rtt	| |
		remove(ALL)
		"jmp Rtt"
					| | |
sig 	| R16 |
		"pha"
		"txa"
		"pha"
		"ldx ERRPROC"
		"lda ERRPROC+1"
		"jsr Push"
		"pla"
		"sta ERRPROC"
		"pla"
		"sta ERRPROC+1"
					| | |
sim	| R16 |
		"stx IGNMASK"
		"sta IGNMASK+1"
					| | |
str $1==0	| R16 |
		"stx LB"
		"sta LB+1"
		"tay"
		"sec"
		"txa"
		"sbc #BASE"
		"sta LBl"
		"tya"
		"sbc #0"
		"sta LBl+1"
					| | |
str $1==1	| R16 |
		"stx SP+2"
		"sta SP+1"
					| | |
str $1==2	| R16 |
		"stx HP"
		"sta HP+1"
					| | |
trp	| R16 |
		"jsr Trap"
					| | |
lol lal sti $1==$2 && $3==1 | | | | | /* throw away funny C-proc-prolog */

	| STACK |
		allocate(R16)
		"jsr Pop"
					| %[a] | |

/* FLOATING POINT
 * Every EM floating point instruction is translated
 * into a library call. At present, these library
 * routines generate an 'Illegal EM instruction' trap.
 */


adf $1==4	| STACK |
		"jsr Adf4"
					| | |
adf $1==8	| STACK |
		"jsr Adf8"		| | |

sbf $1==4	| STACK |
		"jsr Sbf4"
					| | |
sbf $1==8	| STACK |
		"jsr Sbf8"		| | |

mlf $1==4	| STACK |
		"jsr Mlf4"
					| | |
mlf $1==8	| STACK |
		"jsr Mlf8"		| | |

dvf $1==4	| STACK |
		"jsr Dvf4"
					| | |
dvf $1==8	| STACK |
		"jsr Dvf8"		| | |

ngf $1==4	| STACK |
		"jsr Ngf4"
					| | |
ngf $1==8	| STACK |
		"jsr Ngf8"		| | |

zrf $1==4	| STACK |
		"jsr Zrf4"
					| | |
zrf $1==8	| STACK |
		"jsr Zrf8"		| | |

cmf $1==4	| STACK |
		"jsr Cmf4"
					| | |
cmf $1==8	| STACK |
		"jsr Cmf8"		| | |

fef $1==4	| STACK |
		"jsr Fef4"
					| | |
fef $1==8	| STACK |
		"jsr Fef8"		| | |

fif $1==4	| STACK |
		"jsr Fif4"
					| | |
fif $1==8	| STACK |
		"jsr Fif8"		| | |

cfi 		| STACK |
		"jsr Cfi"		| | |

cif 		| STACK |
		"jsr Cif"		| | |

cuf 		| STACK |
		"jsr Cuf"		| | |

cff 		| STACK |
		"jsr Cff"		| | |

cfu 		| STACK |
		"jsr Cfu"		| | |

lfr $1==8	| STACK |
		"jsr Lfr8"		| | |

ret $1==8	| STACK |
		"jmp Ret8"		| | |

/*************\
*  M O V E S  *
\*************/

MOVES:  (AAA,AAA,"nop")

STACKS:  (R16, , "jsr Push")
