"$Header$" #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 = ("",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")