DAT org ' '****************************************** '* Spin2 Interpreter - work in progress * '****************************************** ' setq2 #$FF 'load SKIPF table for main bytecodes rdlong $000,##@bc_main setq2 #$FF 'load SKIPF table for alternate bytecodes, plus bulk of interpreter rdlong $100,##@bc_alt mov dira,#255 'make p7..p0 outputs rdfast #0,##@pgm 'point fifo to program push #$1F8 'execute program _ret_ setq #$000 ' ' ' Branches - jmp, jz, jnz ' bra_b rfbyte pa ' b bra_w rfword pa ' | w bra_l rflong pa ' | | l test x wz ' | | c d e f a: branch fwd popa x ' | | c d e f b: branch rev if_nz ret ' | | c d | | c: test, pop, branch fwd if z if_z ret ' | | | | e f d: test, pop, branch rev if z add pb,pa ' a | c | e | e: test, pop, branch fwd if nz sub pb,pa ' | b | d | f f: test, pop, branch rev if nz _ret_ rdfast #0,pb ' a b c d e f ' ' ' Branches - rep ' rep_b rfbyte pa ' b rep_w rfword pa ' | w rep_l rflong pa ' | | l test x wz ' a | a: test, if z then pop and branch fwd if_nz ret ' a | b: dec, if z then pop, else branch rev popa x ' a | add pb,pa ' a | sub x,#1 wz ' | b if_z popa x ' | b if_z ret ' | b sub pb,pa ' | b _ret_ rdfast #0,pb ' a b ' ' ' Read/write instructions ' rd_byte rdbyte x,a wz rd_word rdword x,a wz rd_long rdlong x,a wz rd_reg mov x,0 wz rd_lut rdlut x,a wz wr_byte wrbyte x,a wr_word wrword x,a wr_long wrlong x,a wr_reg mov 0,x wr_lut wrlut x,a ' ' ' Data ' _FFFFFFFF long $FFFFFFFF rd res 1 wr res 1 sz res 1 a res 1 x res 1 y res 1 z res 1 pbase res 1 vbase res 1 dbase res 1 ' ' '********* '* LUT * '********* ' org $200 'main bytecodes bc_main long var_loc | %00_000 << 10 'read long[dbase][00] long var_loc | %00_000 << 10 'read long[dbase][01] long var_loc | %00_000 << 10 'read long[dbase][02] long var_loc | %00_000 << 10 'read long[dbase][03] long var_loc | %00_000 << 10 'read long[dbase][04] long var_loc | %00_000 << 10 'read long[dbase][05] long var_loc | %00_000 << 10 'read long[dbase][06] long var_loc | %00_000 << 10 'read long[dbase][07] long var_loc | %00_000 << 10 'read long[dbase][08] long var_loc | %00_000 << 10 'read long[dbase][09] long var_loc | %00_000 << 10 'read long[dbase][10] long var_loc | %00_000 << 10 'read long[dbase][11] long var_loc | %00_000 << 10 'read long[dbase][12] long var_loc | %00_000 << 10 'read long[dbase][13] long var_loc | %00_000 << 10 'read long[dbase][14] long var_loc | %00_000 << 10 'read long[dbase][15] long var_loc | %00_11_000 << 10 'write long[dbase][00] (isolated) long var_loc | %00_11_000 << 10 'write long[dbase][01] (isolated) long var_loc | %00_11_000 << 10 'write long[dbase][02] (isolated) long var_loc | %00_11_000 << 10 'write long[dbase][03] (isolated) long var_loc | %00_11_000 << 10 'write long[dbase][04] (isolated) long var_loc | %00_11_000 << 10 'write long[dbase][05] (isolated) long var_loc | %00_11_000 << 10 'write long[dbase][06] (isolated) long var_loc | %00_11_000 << 10 'write long[dbase][07] (isolated) long var_loc | %00_11_000 << 10 'write long[dbase][08] (isolated) long var_loc | %00_11_000 << 10 'write long[dbase][09] (isolated) long var_loc | %00_11_000 << 10 'write long[dbase][10] (isolated) long var_loc | %00_11_000 << 10 'write long[dbase][11] (isolated) long var_loc | %00_11_000 << 10 'write long[dbase][12] (isolated) long var_loc | %00_11_000 << 10 'write long[dbase][13] (isolated) long var_loc | %00_11_000 << 10 'write long[dbase][14] (isolated) long var_loc | %00_11_000 << 10 'write long[dbase][15] (isolated) long var_loc | %0000_11_11_000 << 10 'setup long[dbase][00] long var_loc | %0000_11_11_000 << 10 'setup long[dbase][01] long var_loc | %0000_11_11_000 << 10 'setup long[dbase][02] long var_loc | %0000_11_11_000 << 10 'setup long[dbase][03] long var_loc | %0000_11_11_000 << 10 'setup long[dbase][04] long var_loc | %0000_11_11_000 << 10 'setup long[dbase][05] long var_loc | %0000_11_11_000 << 10 'setup long[dbase][06] long var_loc | %0000_11_11_000 << 10 'setup long[dbase][07] long var_loc | %0000_11_11_000 << 10 'setup long[dbase][08] long var_loc | %0000_11_11_000 << 10 'setup long[dbase][09] long var_loc | %0000_11_11_000 << 10 'setup long[dbase][10] long var_loc | %0000_11_11_000 << 10 'setup long[dbase][11] long var_loc | %0000_11_11_000 << 10 'setup long[dbase][12] long var_loc | %0000_11_11_000 << 10 'setup long[dbase][13] long var_loc | %0000_11_11_000 << 10 'setup long[dbase][14] long var_loc | %0000_11_11_000 << 10 'setup long[dbase][15] long var_b | %0_110_110_110_11111_110_110 << 10 'setup byte[pbase + rfbyte] long var_w | %0_110_110_110_11111_110_10_ << 10 'setup byte[pbase + rfword] long var_l | %0_110_110_110_11111_110_0__ << 10 'setup byte[pbase + rflong] long var_b | %0_110_110_110_11111_101_110 << 10 'setup byte[vbase + rfbyte] long var_w | %0_110_110_110_11111_101_10_ << 10 'setup byte[vbase + rfword] long var_l | %0_110_110_110_11111_101_0__ << 10 'setup byte[vbase + rflong] long var_b | %0_110_110_110_11111_011_110 << 10 'setup byte[dbase + rfbyte] long var_w | %0_110_110_110_11111_011_10_ << 10 'setup byte[dbase + rfword] long var_l | %0_110_110_110_11111_011_0__ << 10 'setup byte[dbase + rflong] long var_b | %0_110_110_110_01110_110_110 << 10 'setup byte[pbase + rfbyte][pop index] long var_w | %0_110_110_110_01110_110_10_ << 10 'setup byte[pbase + rfword][pop index] long var_l | %0_110_110_110_01110_110_0__ << 10 'setup byte[pbase + rflong][pop index] long var_b | %0_110_110_110_01110_101_110 << 10 'setup byte[vbase + rfbyte][pop index] long var_w | %0_110_110_110_01110_101_10_ << 10 'setup byte[vbase + rfword][pop index] long var_l | %0_110_110_110_01110_101_0__ << 10 'setup byte[vbase + rflong][pop index] long var_b | %0_110_110_110_01110_011_110 << 10 'setup byte[dbase + rfbyte][pop index] long var_w | %0_110_110_110_01110_011_10_ << 10 'setup byte[dbase + rfword][pop index] long var_l | %0_110_110_110_01110_011_0__ << 10 'setup byte[dbase + rflong][pop index] long var_b | %0_101_101_101_11111_110_110 << 10 'setup word[pbase + rfbyte] long var_w | %0_101_101_101_11111_110_10_ << 10 'setup word[pbase + rfword] long var_l | %0_101_101_101_11111_110_0__ << 10 'setup word[pbase + rflong] long var_b | %0_101_101_101_11111_101_110 << 10 'setup word[vbase + rfbyte] long var_w | %0_101_101_101_11111_101_10_ << 10 'setup word[vbase + rfword] long var_l | %0_101_101_101_11111_101_0__ << 10 'setup word[vbase + rflong] long var_b | %0_101_101_101_11111_011_110 << 10 'setup word[dbase + rfbyte] long var_w | %0_101_101_101_11111_011_10_ << 10 'setup word[dbase + rfword] long var_l | %0_101_101_101_11111_011_0__ << 10 'setup word[dbase + rflong] long var_b | %0_101_101_101_01100_110_110 << 10 'setup word[pbase + rfbyte][pop index] long var_w | %0_101_101_101_01100_110_10_ << 10 'setup word[pbase + rfword][pop index] long var_l | %0_101_101_101_01100_110_0__ << 10 'setup word[pbase + rflong][pop index] long var_b | %0_101_101_101_01100_101_110 << 10 'setup word[vbase + rfbyte][pop index] long var_w | %0_101_101_101_01100_101_10_ << 10 'setup word[vbase + rfword][pop index] long var_l | %0_101_101_101_01100_101_0__ << 10 'setup word[vbase + rflong][pop index] long var_b | %0_101_101_101_01100_011_110 << 10 'setup word[dbase + rfbyte][pop index] long var_w | %0_101_101_101_01100_011_10_ << 10 'setup word[dbase + rfword][pop index] long var_l | %0_101_101_101_01100_011_0__ << 10 'setup word[dbase + rflong][pop index] long var_b | %0_011_011_011_11111_110_110 << 10 'setup long[pbase + rfbyte] long var_w | %0_011_011_011_11111_110_10_ << 10 'setup long[pbase + rfword] long var_l | %0_011_011_011_11111_110_0__ << 10 'setup long[pbase + rflong] long var_b | %0_011_011_011_11111_101_110 << 10 'setup long[vbase + rfbyte] long var_w | %0_011_011_011_11111_101_10_ << 10 'setup long[vbase + rfword] long var_l | %0_011_011_011_11111_101_0__ << 10 'setup long[vbase + rflong] long var_b | %0_011_011_011_11111_011_110 << 10 'setup long[dbase + rfbyte] long var_w | %0_011_011_011_11111_011_10_ << 10 'setup long[dbase + rfword] long var_l | %0_011_011_011_11111_011_0__ << 10 'setup long[dbase + rflong] long var_b | %0_011_011_011_01010_110_110 << 10 'setup long[pbase + rfbyte][pop index] long var_w | %0_011_011_011_01010_110_10_ << 10 'setup long[pbase + rfword][pop index] long var_l | %0_011_011_011_01010_110_0__ << 10 'setup long[pbase + rflong][pop index] long var_b | %0_011_011_011_01010_101_110 << 10 'setup long[vbase + rfbyte][pop index] long var_w | %0_011_011_011_01010_101_10_ << 10 'setup long[vbase + rfword][pop index] long var_l | %0_011_011_011_01010_101_0__ << 10 'setup long[vbase + rflong][pop index] long var_b | %0_011_011_011_01010_011_110 << 10 'setup long[dbase + rfbyte][pop index] long var_w | %0_011_011_011_01010_011_10_ << 10 'setup long[dbase + rfword][pop index] long var_l | %0_011_011_011_01010_011_0__ << 10 'setup long[dbase + rflong][pop index] long var_a | %0_110_110_110_10 << 10 'setup byte[pop address] long var_a | %0_101_101_101_10 << 10 'setup word[pop address] long var_a | %0_011_011_011_10 << 10 'setup long[pop address] long var_i | %0_110_110_110_00110 << 10 'setup byte[pop base][pop index] long var_i | %0_101_101_101_00100 << 10 'setup word[pop base][pop index] long var_i | %0_011_011_011_00010 << 10 'setup long[pop base][pop index] long var_cog | %00_11_0000_11_10 << 10 'setup reg $0xx long var_cog | %00_11_0000_11_00 << 10 'setup reg $1xx long var_cog | %00_11_0000_00_10 << 10 'setup reg $0xx [pop index] long var_cog | %00_11_0000_00_00 << 10 'setup reg $1xx [pop index] long var_cog | %00_00_1111_11_10 << 10 'setup lut $0xx long var_cog | %00_00_1111_11_00 << 10 'setup lut $1xx long var_cog | %00_00_1111_00_10 << 10 'setup lut $0xx [pop index] long var_cog | %00_00_1111_00_00 << 10 'setup lut $1xx [pop index] long bra_b | %0101111110 << 10 'jmp rfbyte fwd long bra_b | %0011111110 << 10 'jmp rfbyte rev long bra_w | %010111110_ << 10 'jmp rfword fwd long bra_w | %001111110_ << 10 'jmp rfword rev long bra_l | %01011110__ << 10 'jmp rflong fwd long bra_l | %00111110__ << 10 'jmp rflong rev long bra_b | %0101000110 << 10 'jz rfbyte fwd long bra_b | %0011000110 << 10 'jz rfbyte rev long bra_w | %010100010_ << 10 'jz rfword fwd long bra_w | %001100010_ << 10 'jz rfword rev long bra_l | %01010000__ << 10 'jz rflong fwd long bra_l | %00110000__ << 10 'jz rflong rev long bra_b | %0100100110 << 10 'jnz rfbyte fwd long bra_b | %0010100110 << 10 'jnz rfbyte rev long bra_w | %010010010_ << 10 'jnz rfword fwd long bra_w | %001010010_ << 10 'jnz rfword rev long bra_l | %01001000__ << 10 'jnz rflong fwd long bra_l | %00101000__ << 10 'jnz rflong rev long rep_b | %011110000110 << 10 'rep rfbyte fwd long rep_w | %01111000010_ << 10 'rep rfword fwd long rep_l | %0111100000__ << 10 'rep rflong fwd long rep_b | %000001111110 << 10 'rep rfbyte rev long rep_w | %00000111110_ << 10 'rep rfword rev long rep_l | %0000011110__ << 10 'rep rflong rev long con_lo | %00 << 10 'constant -1 long con_lo | %010 << 10 'constant 0 long con_lo | %0110 << 10 'constant 1 long con_lo | %01110 << 10 'constant 2 long con_lo | %011110 << 10 'constant 3 long con_lo | %0111110 << 10 'constant 4 long con_lo | %01111110 << 10 'constant 5 long con_hi | %00 << 10 'constant 6 long con_hi | %010 << 10 'constant 7 long con_hi | %0110 << 10 'constant 8 long con_hi | %01110 << 10 'constant 15 long con_hi | %011110 << 10 'constant 16 long con_hi | %0111110 << 10 'constant 31 long con_hi | %01111110 << 10 'constant 32 long con_dat | %00 << 10 'constant rfbyte long con_dat | %011111010 << 10 'constant rfbyte! long con_dat | %0110 << 10 'constant rfword long con_dat | %011101110 << 10 'constant rfword! long con_dat | %011110 << 10 'constant rflong long con_dat | %0111010 << 10 'constant rfbyte+decod long con_dat | %001111010 << 10 'constant rfbyte+decod+not long con_dat | %0101111010 << 10 'constant rfbyte+decod+dec long con_dat | %01101111010 << 10 'constant rfbyte+decod+neg long op_notb | %0111111101110 << 10 '!!exp long op_not | %01111110_____ << 10 '!exp long op_neg | %0111110______ << 10 '-exp long op_abs | %011110_______ << 10 'ABS exp long op_ncod | %01110________ << 10 'NCOD exp long op_dcod | %0110_________ << 10 'DCOD exp long op_sqrt | %010111111110_ << 10 'SQRT exp long op_log2 | %01011111110__ << 10 'LOG2 exp long op_exp2 | %0101111110___ << 10 'EXP2 exp long sha_mod | %01111111010110 << 10 'exp >> exp long sha_mod | %01111110110110 << 10 'exp << exp long sha_mod | %01111101110110 << 10 'exp SAR exp long sha_mod | %01111011110110 << 10 'exp ROR exp long sha_mod | %01110111110110 << 10 'exp ROL exp long sgn_mod | %0111111100010_ << 10 'exp REV exp long sgn_mod | %0111110011010_ << 10 'exp SIGNX exp long sha_mod | %01101111110110 << 10 'exp + exp long sha_mod | %01011111110110 << 10 'exp - exp long log_mod | %011111000100 << 10 'exp && exp long log_mod | %011110100100 << 10 'exp ^^ exp long log_mod | %011101100100 << 10 'exp || exp long log_mod | %011111010110 << 10 'exp & exp long log_mod | %011110110110 << 10 'exp ^ exp long log_mod | %011101110110 << 10 'exp | exp long log_mod | %011011110110 << 10 'exp !< exp long log_mod | %010111110110 << 10 'exp !> exp long mul_mod | %011100110000110 << 10 'exp * exp long mul_mod | %011100101000110 << 10 'exp / exp long mul_mod | %010011101000110 << 10 'exp MOD exp long muu_mod | %011011110110101 << 10 'exp SCAL exp long muu_mod | %011110011110101 << 10 'exp FRAC exp long op_equ | %0100 << 10 'exp < exp long op_equ | %01010 << 10 'exp <= exp long op_equ | %011100 << 10 'exp == exp long op_equ | %0111100 << 10 'exp <> exp long op_equ | %01100 << 10 'exp >= exp long op_equ | %0010 << 10 'exp > exp j1 org $300 'alternate bytecodes - interpreted immediately after var setup bc_alt long var_rd | %011111100 << 10 '@var (push) long var_rd | %011110010 << 10 'var (push) long var_wr | %01000 << 10 'var := exp (isolated) long var_wr | %00100 << 10 'var := exp (push) long mod_iso | %0100011111010010 << 10 '++var, var++ (isolated) long mod_iso | %0100011110110010 << 10 '--var, var-- (isolated) long mod_psh | %011001110101000_ << 10 '++var (push) long mod_psh | %011001110011000_ << 10 '--var (push) long mod_psh | %001001111100000_ << 10 'var++ (push) long mod_psh | %001001111010000_ << 10 'var-- (push) long mod_iso | %0100011011110010 << 10 'var!! (isolated) long mod_psh | %001001101110000_ << 10 'var!! (push) long mod_iso | %0100010111110010 << 10 'var! (isolated) long mod_psh | %001001011110000_ << 10 'var! (push) long mod_iso | %0010001111100010 << 10 'var\new (swap) long una_iso | %0100011111101110010 << 10 '!!= var (isolated) long una_iso | %0100011111011110010 << 10 '!= var (isolated) long una_iso | %0100011110111110010 << 10 '-= var (isolated) long una_iso | %0100011101111110010 << 10 'ABS= var (isolated) long una_iso | %0100011011111110010 << 10 'NCOD= var (isolated) long una_iso | %0100010111111110010 << 10 'DCOD= var (isolated) long una_iso | %0100001111111100010 << 10 'SQRT= var (isolated) long una_iso | %0100001111111010010 << 10 'LOG2= var (isolated) long una_iso | %0100001111110110010 << 10 'EXP2= var (isolated) long sha_mod | %01000111111010010 << 10 'var >>= exp (isolated) long sha_mod | %01000111110110010 << 10 'var <<= exp (isolated) long sha_mod | %01000111101110010 << 10 'var SAR= exp (isolated) long sha_mod | %01000111011110010 << 10 'var ROR= exp (isolated) long sha_mod | %01000110111110010 << 10 'var ROL= exp (isolated) long sgn_mod | %0100011111100000_ << 10 'var REV= exp (isolated) long sgn_mod | %0100011110011010_ << 10 'var SIGNX= exp (isolated) long sha_mod | %01000101111110110 << 10 'var += exp (isolated) long sha_mod | %01000011111110110 << 10 'var -= exp (isolated) long log_mod | %010001111000000 << 10 'var &&= exp (isolated) long log_mod | %010001110100000 << 10 'var ^^= exp (isolated) long log_mod | %010001101100000 << 10 'var ||= exp (isolated) long log_mod | %010001111010010 << 10 'var &= exp (isolated) long log_mod | %010001110110010 << 10 'var ^= exp (isolated) long log_mod | %010001101110010 << 10 'var |= exp (isolated) long log_mod | %010001011110010 << 10 'var !<= exp (isolated) long log_mod | %010000111110010 << 10 'var !>= exp (isolated) long mul_mod | %010001100110000010 << 10 'var *= exp (isolated) long mul_mod | %010001100101000010 << 10 'var /= exp (isolated) long mul_mod | %010000011101000010 << 10 'var MOD= exp (isolated) long muu_mod | %010001011110110001 << 10 'var SCAL= exp (isolated) long muu_mod | %010001110011110001 << 10 'var FRAC= exp (isolated) long una_psh | %001001111110111000 << 10 '!!= var (push) long una_psh | %001001111101111000 << 10 '!= var (push) long una_psh | %001001111011111000 << 10 '-= var (push) long una_psh | %001001110111111000 << 10 'ABS= var (push) long una_psh | %001001101111111000 << 10 'NCOD= var (push) long una_psh | %001001011111111000 << 10 'DCOD= var (push) long una_psh | %001000111111110000 << 10 'SQRT= var (push) long una_psh | %001000111111101000 << 10 'LOG2= var (push) long una_psh | %001000111111011000 << 10 'EXP2= var (push) long sha_mod | %00100111111010010 << 10 'var >>= exp (push) long sha_mod | %00100111110110010 << 10 'var <<= exp (push) long sha_mod | %00100111101110010 << 10 'var SAR= exp (push) long sha_mod | %00100111011110010 << 10 'var ROR= exp (push) long sha_mod | %00100110111110010 << 10 'var ROL= exp (push) long sgn_mod | %0010011111100000_ << 10 'var REV= exp (push) long sgn_mod | %0010011110011010_ << 10 'var SIGNX= exp (push) long sha_mod | %00100101111110110 << 10 'var += exp (push) long sha_mod | %00100011111110110 << 10 'var -= exp (push) long log_mod | %001001111000000 << 10 'var &&= exp (push) long log_mod | %001001110100000 << 10 'var ^^= exp (push) long log_mod | %001001101100000 << 10 'var ||= exp (push) long log_mod | %001001111010010 << 10 'var &= exp (push) long log_mod | %001001110110010 << 10 'var ^= exp (push) long log_mod | %001001101110010 << 10 'var |= exp (push) long log_mod | %001001011110010 << 10 'var !<= exp (push) long log_mod | %001000111110010 << 10 'var !>= exp (push) long mul_mod | %001001100110000010 << 10 'var *= exp (push) long mul_mod | %001001100101000010 << 10 'var /= exp (push) long mul_mod | %001000011101000010 << 10 'var MOD= exp (push) long muu_mod | %001001011110110001 << 10 'var SCAL= exp (push) long muu_mod | %001001110011110001 << 10 'var FRAC= exp (push) j2 ' ' '******************** '* main bytecodes * '******************** ' ' ' Constants ' con_lo pusha x 'push a b c d e f g a: -1 _ret_ mov x,_FFFFFFFF ' a | | | | | | b: 0 _ret_ mov x,#0 ' b | | | | | c: 1 _ret_ mov x,#1 ' c | | | | d: 2 _ret_ mov x,#2 ' d | | | e: 3 _ret_ mov x,#3 ' e | | f: 4 _ret_ mov x,#4 ' f | g: 5 _ret_ mov x,#5 ' g con_hi pusha x 'push a b c d e f g a: 6 _ret_ mov x,#6 ' a | | | | | | b: 7 _ret_ mov x,#7 ' b | | | | | c: 8 _ret_ mov x,#8 ' c | | | | d: 15 _ret_ mov x,#15 ' d | | | e: 16 _ret_ mov x,#16 ' e | | f: 31 _ret_ mov x,#31 ' f | g: 32 _ret_ mov x,#32 ' g con_dat pusha x 'push a b c d e f g h i a: byte _ret_ rfbyte x ' a | | | | | | | | b: !byte rfbyte x ' b | | | f g h i c: word _ret_ rfword x ' | c | | | | | | d: !word rfword x ' | d | | | | | e: long _ret_ rflong x ' | | e | | | | f: byte + decode _ret_ decod x ' | | f | | | g: byte + decode + not decod x ' | | g h i h: byte + decode + decrement _ret_ not x ' b d g | | i: byte + decode + negate _ret_ sub x,#1 ' h | _ret_ neg x ' i ' ' ' Equality operators ' op_equ popa y 'pop a b c d e f a: < cmps y,x wc,wz ' a | c d e | b: <= cmps x,y wc,wz ' | b | | | f c: == _ret_ muxc x,_FFFFFFFF ' a | | | | f d: <> _ret_ muxnc x,_FFFFFFFF ' b | | e e: >= _ret_ muxz x,_FFFFFFFF ' c | f: > _ret_ muxnz x,_FFFFFFFF ' d ' ' ' Read/write/setup local variable ' var_loc getnib a,pa,#0 ' a b c a: read local shl a,#2 ' a b c b: write local add a,vbase ' a b c c: setup local pusha x 'read a | | _ret_ rdlong x,a 'read a | | wrlong x,a 'write b | _ret_ popa x 'write b | mov rd,rd_long 'setup c mov wr,wr_long 'setup c mov sz,#31 'setup c _ret_ setq #$100 'alt c ' ' ' Setup hub variable ' var_b rfbyte a 'offset b | | var_w rfword a ' | w | var_l rflong a ' | | l add a,pbase 'base p | | add a,vbase ' | v | add a,dbase ' | | d var_i popa y 'index b w l | shl y,#1 ' | w | | shl y,#2 ' | | l | var_a popa a 'addr | | | | i a add a,y ' b w l | i | mov rd,rd_byte 'rd b | | mov rd,rd_word ' | w | mov rd,rd_long ' | | l mov wr,wr_byte 'wr b | | mov wr,wr_word ' | w | mov wr,wr_long ' | | l mov sz,#7 'size b | | mov sz,#15 ' | w | mov sz,#31 ' | | l _ret_ setq #$100 'alt b w l ' ' ' Setup reg/lut variable ' var_cog rfbyte a '$0xx a b c d e f g h a: reg $0xx or a,#$100 '$1xx | b | d | f | h b: reg $1xx popa y 'index | | c d | | g h c: reg $0xx [index] add a,y 'index | | c d | | g h d: reg $1xx [index] mov rd,rd_reg 'reg a b c d | | | | e: lut $0xx mov wr,wr_reg 'reg a b c d | | | | f: lut $1xx sets rd,a 'reg a b c d | | | | g: lut $0xx [index] setd wr,a 'reg a b c d | | | | h: lut $1xx [index] mov rd,rd_lut 'lut | | | | e f g h mov wr,wr_lut 'lut | | | | e f g h mov sz,#31 'long a b c d e f g h _ret_ setq #$100 'alt a b c d e f g h ' ' '************************* '* alternate bytecodes * '************************* ' ' ' Variable address/read/write ' var_rd pusha x 'push a b a: @var (push) mov x,a 'addr a | b: var (push) alti rd 'read | b c: var := exp (isolated) nop 'read | b d: var := exp (push) var_wr alti wr 'write | | c d nop 'write | | c d popa x 'pop | | c | triml x,sz 'trim | | | d _ret_ setq #$000 'main a b c d ' ' ' Variable prefix/postfix modifiers ' mod_iso mov y,x 'iso a b | | | | g | i | k a: ++var, var++ (isolated) mod_psh pusha x 'push | | c d e f | h | j | b: --var, var-- (isolated) alti rd 'rd a b c d e f g h i j k c: ++var (push) nop 'rd a b c d e f g h i j k d: --var (push) mov z,x 'post | | | | e f | h | j k e: var++ (push) add x,#1 '++ a | c | e | | | | | | f: var-- (push) sub x,#1 '-- | b | d | f | | | | | g: var!! (isolated) triml x,sz 'ptr | | c d | | | | | | | h: var!! (push) muxz x,_FFFFFFFF '!! | | | | | | g h | | | i: var! (isolated) not x '! | | | | | | | | i j | j: var! (push) mov x,y 'swap | | | | | | | | | | k k: var\new (swap) alti wr 'wr a b c d e f g h i j k nop 'wr a b c d e f g h i j k mov x,y 'iso a b | | | | g | i | | mov x,z 'iso | | | | e f | h | j k _ret_ setq #$000 'main a b c d e f g h i j k ' ' ' Variable assignments / math operators ' una_iso mov y,x ' m a: !! una_psh pusha y 'push | n b: ! alti rd 'rd m n c: - (neg) op_notb test x wz 'rd,!! m n a d: ABS op_sqrt qsqrt x,#0 'SQRT x x | g e: NCOD op_log2 qlog x 'LOG2 x x | | h f: DCOD op_exp2 qexp x 'EXP2 x x | | | i g: SQRT muxz x,_FFFFFFFF '!! x x a | | | h: LOG2 op_not not x '! x x | b | | | i: EXP2 op_neg neg x '- x x | | c | | | op_abs abs x 'ABS x x | | | d | | | op_ncod topone x 'NCOD x x | | | | e | | | op_dcod decod x 'DCOD x x | | | | | f | | | getqx x ' x x | | | | | | g h i alti wr 'wr m n | | | | | | | | | ret 'wr,op m n a b c d e f g h i mov x,y 'iso m | m: ?= var (isolated) triml x,sz 'push | n n: ?= var (push) _ret_ setq #$000 'main m n x: use a..i sha_mod mov y,x ' x x a b c d e | | h i a: >> sgn_mod not y,x ' x x | | | | | f g | | b: << alti rd 'rd m n | | | | | | | | | c: SAR popa x 'rd,op m n a b c d e f g h i d: ROR rev x 'REV x x | | | | | f | | | e: ROL shr x,y '>> x x a | | | | f | | | f: REV shl x,y '<< x x | b | | | | g | | g: SIGNX sar x,y 'SAR x x | | c | | | g | | h: + ror x,y 'ROR x x | | | d | | | | | i: - rol x,y 'ROL x x | | | | e | | | | add x,y '+ x x | | | | | | | h | sub x,y '- x x | | | | | | | | i alti wr 'wr m n | | | | | | | | | ret 'wr m n a b c d e f g h i popa x 'iso m | m: var ?= exp (isolated) triml x,sz 'push | n n: var ?= exp (push) _ret_ setq #$000 'main m n x: use a..i log_mod mov y,x wz ' x x a b c d e f g h a: && muxnz y,_FFFFFFFF 'bool x x a b c | | | | | b: ^^ alti rd 'rd m n | | | | | | | | c: || popa x wz 'rd,op m n a b c d e f g h d: & muxnz x,_FFFFFFFF 'bool x x a b c | | | | | e: ^ and x,y '&&,& x x a | | d | | | | f: | xor x,y '^^,^ x x | b | | e | | | g: !< or x,y '||,| x x | | c | | f | | h: !> mins x,y '!< x x | | | | | | g | maxs x,y '!> x x | | | | | | | h alti wr 'wr m n | | | | | | | | ret 'wr m n a b c d e f g h popa x 'iso m | m: var ?= exp (isolated) triml x,sz 'push | n n: var ?= exp (push) _ret_ setq #$000 'main m n x: use a..k mul_mod abs y,x wc 'c=ys x x a b c | | a: * muu_mod mov y,x ' x x | | | d e b: / alti rd 'rd m n | | | | | c: MOD popa x 'rd,op m n a b c d e d: SCAL testb x,#31 wz '!z=xs x x a b c | | e: FRAC abs x ' x x a b c | | qmul x,y '*,SCAL x x a | | d | qdiv x,y '/,MOD x x | b c | | qfrac x,y 'FRAC x x | | | | e getqx x ' x x a b | | e if_c_eq_z neg x '*,/ x x a b | | | getqy x ' x x | | c d | if_c neg x 'MOD x x | | c | | alti wr 'wr m n | | | | | ret 'wr m n a b c d e popa x 'iso m | m: var ?= exp (isolated) triml x,sz 'push | n n: var ?= exp (push) _ret_ setq #$000 'main m n x: use a..k j3 ' ' '********************** '* bytecode program * '********************** ' orgh ' ' ' repeat ' outa++ ' pgm byte 109,$FC 'setup reg $1FC byte 4 'var++ byte 117,$-pgm 'jmp #pgm