'' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '' % ClusoInterpreterP2 (spin P1 for P2) v0.0xx % '' % Ram Spin Interpreter for the Parallax Propeller Chip P8X32A % '' % Author: "Cluso99" (Ray Rodrick ) % '' % Copyright (c) 2008-2019 "Cluso99" (Ray Rodrick ) % '' % % '' % This is a derivative work of the original % '' % ***************************************** % '' % * PNut Interpreter * % '' % * Version 0.1 12/10/2004 * % '' % * (C) 2004 Parallax, Inc. * % '' % ***************************************** % '' % and has been modified and published with the gratious permission % '' % of Chip Gracey of Parallax Inc. % '' % % '' % Acknowledgements: Hippy for the RamInterpreter, PropView, % '' % and decoding of the spin bytecodes (with others). % '' % % '' % Further derivatives may require the permission of Parallax Inc. % '' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '' % Documentation - see SpinBytecodeDocs_600.spin % '' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ' ' RR20080617 modified by "Cluso99" ' RR20080716 restarted by "Cluso99" (no code mods but heading altered, Hippy's PUB Start) ' v100_2 add Hippy's hacks (Note: value/range lookup/down and clkset are disabled!!!) ' v100_3 make RamInterpreter hub code position variable (was hardcoded) ' (moved all documentation to end of file) ' v101_1 add external jump_table for lower j0-jF($00-3F) ' v101_2 add external jump_table for upper ($40-7F, $80-DF, $E0-FF) ' v103_2 add Ray's debug code (remove Hippy's waitcnt hack2 and range hack3) ' v103_5 Ray's debug working ' v103_9 put sync switch in debug ' v104_4 still putting in sync switch in debug ' v104_2 working with only cog 2 being debugged ' v104_3 add the debugging info ' uses RamVm_Step8_104_8 ' v200 back to speedup RamInterpreter ' v200 InterpreterCluso -> ClusoInterpreter ' RR20080904 v200C_1 check the cogs being loaded and their parameters ' RR20080905 v200C_2 add coginit to load RamInterpreter #1 or RamInterpreter #2 (ClusoInterpreter) if cog #7 ' RR20080905 v200C_3b This is the test version of the ClusoRamInterpreter ' v200C_4b working 2 versions: cog 5 = working version, cog 7 = test version ' v200C_5 sqrt disabled both working & test versions, waitcnt diff for ea, clkset etc all enabled (exc sqrt) ' v200C_7 cog 5 = RomInterpreter(control), cog 6 = RamInterpreter(works), cog 7 = ClusoInterpreter(test) ' v200C_8 v200C_600: start integrating ClusoInterpreter mods into ClusoInterpreter_200C_600 ' RR20080908 rename ClusoInterpreter_200C_600_1 --> ClusoInterpreter_260C_000 ' RR20080909 v260C_001 add PUB GetPasmAddr to both Ram & Cluso Interpreters, change PUB Start -> Init & parameters ' 2 fix varop, mrop(mathop), j3&j4 pop table fixes, ' RR20080911 003 fix assignment mathop (op2 &FF), math $F9..FE op -> a ' RR20080912 ClusoInterpreter_260C_003F (remove ALL modifications including coginit so starts ROM) ' RR20080914 _004F (remove dead code; test new getflags routine) ' _005F j6/j7, j8, jAB, jD ' RR20080915 _006F add Chip's new sqrt code; mrop/assignment replace "call #getop2" ' move "test op2,#%01000000 wc 'mathop? (c=1)" to mrop ' simplify j1, j5 ' RR20080915 ClusoInterpreter_260C_007F post to propeller forum '--------------------------------------------------------------------------------------------- ' RR20150408 v300C_001 recompile for P1V testing '--------------------------------------------------------------------------------------------- ' RR20180930 v301 convert to P2 ' RR20190228 v302 convert to P2 (start again) ' a pcurr -> ptra, dcurr -> ptrb ' b calls use internal stack: popayx/yx/x, popxr replace w inline code, ' range, getadrs, remove getop2 + getc ' c convert i_xxxx instr table & maths vector table for P2 ' d remove unicode chars, remove dead code, adj comments, :labels -> .labels ' e compile issues commented to '? , push->pushr, jmp/call xxx wz -> modcz + jmp/call ' movs/d/i -> sets/d/r ' !!!!!!!! need to check "if_nz tjz t2,#pushtf wz" replacement code at j5_23 !!!!!!!!!!! ' !!!!!!!! need to check memopb setr instructions (wr/rdxxxx not the same as P1) !!!!!!!!!!! ' f waitpeq/pne, waitcnt, waitvid, locknew/ret/try/rel, coginit/cognew/cogstop, clkset, ' max/min->fle/fge, wc,wz/wz,wc->wcz, absneg->abs+neg, REV/ENCOD/DECOD to use math_E0 ' pushret->pa: change return jmp & call pushret,#xxxx, par->ptra ' !!!!!!!! need to check mrop2(incdec), writem/writev/readv for REV instructions !!!!!!!!!!! ' COMPILES BUT UNTESTED ' g mod vector decoding (can speedup if vector_table b31->C so b30=i_bin/i_un) ' h '--------------------------------------------------------------------------------------------- ' RR20190301 v303a testing w bytecode to flash led p27 ' error: mathop vector1 !!!!!!!!!!! ' for testing, variables must be moved below $1E0 !!!!!!!!!!! ' de debug code ' f rev x,y -> rev x + shr x,y (wkg but waitcnt calc not verified) ' g try P1_spin_001b using PortA & PortB pins wkg ' h speedup fill/move (remove call popayx from vector_table) untested!!! ' i use skip for maths decoding, waitpeq/pne, j5 strsize & strcomp untested!!! ' k ' RR20190306 v304a new maths decoding w skipf (mathop_001k.spin) ' b new varop decoding w skipf ' g new j0-jF decoding (incomplete) ' RR20190315 v305a all new decoding done (untested) Assign code not done ' mathop re-tweeked, j9_012 & jF_123 re-tweeked, memop skip table bugfix ' e simple led flash wkg ' g assign_table ' j varop skip for assign(using) ''============================[ CON ]============================================================ CON 'P2-EVAL _XTALFREQ = 20_000_000 ' crystal frequency _XDIV = 4 '\ '\ crystal divider to give 5.0MHz _XMUL = 10 '| 25 MHz '| crystal / div * mul to give 50 MHz _XDIVP = 2 '/ '/ crystal / div * mul /divp to give 25 MHz _XOSC = %10 '15pF ' %00=OFF, %01=OSC, %10=15pF, %11=30pF {{ 'P2D2 _XTALFREQ = 12_000_000 ' crystal frequency _XDIV = 3 '\ '\ crystal divider to give 4.0MHz _XMUL = 12 '| 24 MHz '| crystal / div * mul to give 48 MHz _XDIVP = 2 '/ '/ crystal / div * mul /divp to give 24 MHz _XOSC = %01 'Osc ' %00=OFF, %01=OSC, %10=15pF, %11=30pF }} {{ 'P2D2 _XTALFREQ = 12_000_000 ' crystal frequency _XDIV = 3 '\ '\ crystal divider to give 4.0MHz _XMUL = 14 '| 28 MHz '| crystal / div * mul to give 48 MHz _XDIVP = 2 '/ '/ crystal / div * mul /divp to give 24 MHz _XOSC = %01 'Osc ' %00=OFF, %01=OSC, %10=15pF, %11=30pF }} '------------------------------------------------------------------------------------------------ _XSEL = %11 'XI+PLL ' %00=rcfast(20+MHz), %01=rcslow(~20KHz), %10=XI(5ms), %11=XI+PLL(10ms) _XPPPP = ((_XDIVP>>1) + 15) & $F ' 1->15, 2->0, 4->1, 6->2...30->14 _CLOCKFREQ = _XTALFREQ / _XDIV * _XMUL / _XDIVP ' internal clock frequency _SETFREQ = 1<<24 + (_XDIV-1)<<18 + (_XMUL-1)<<8 + _XPPPP<<4 + _XOSC<<2 ' %0000_000e_dddddd_mmmmmmmmmm_pppp_cc_00 ' setup oscillator _ENAFREQ = _SETFREQ + _XSEL ' %0000_000e_dddddd_mmmmmmmmmm_pppp_cc_ss ' enable oscillator '------------------------------------------------------------------------------------------------ _1us = _clockfreq/1_000_000 ' 1us '------------------------------------------------------------------------------------------------ _baud = 115_200 _bitper = (_clockfreq / _baud) << 16 + 7 ' 115200 baud, 8 bits _txmode = %0000_0000_000_0000000000000_01_11110_0 'async tx mode, output enabled for smart output _rxmode = %0000_0000_000_0000000000000_00_11111_0 'async rx mode, input enabled for smart input '------------------------------------------------------------------------------------------------ rx_pin = 63 ' pin serial receiver tx_pin = 62 ' pin serial transmitter spi_cs = 61 ' pin SPI memory select (also sd_ck) spi_ck = 60 ' pin SPI memory clock (also sd_cs) spi_di = 59 ' pin SPI memory data in (also sd_di) spi_do = 58 ' pin SPI memory data out (also sd_do) sd_ck = spi_cs 'pin SD Card clock sd_cs = spi_ck 'pin SD Card select sd_di = spi_di 'pin SD Card MOSI sd_do = spi_do 'pin SD Card MISO '------------------------------------------------------------------------------------------------ '' +--------------------------------------------------------------------------+ '' | Cluso's LMM_SerialDebugger for P2 (c)2013-2018 "Cluso99" (Ray Rodrick)| '' +--------------------------------------------------------------------------+ '' xxxxxx : xx xx xx xx ... DOWNLOAD: to cog/lut/hub {addr1} following {byte(s)} '' xxxxxx - [xxxxxx] [L] LIST: from cog/lut/hub {addr1} to < {addr2} L=longs '' xxxxxx G GOTO: to cog/lut/hub {addr1} '' Q QUIT: Quit Rom Monitor and return to the User Program '' Lffffffff[.]xxx LOAD: Load file from SD '' Rffffffff[.]xxx RUN: Load & Run file from SD '' TAQOZ: goto TAQOZ '' +--------------------------------------------------------------------------+ '' LMM DEBUGGER - CALL Modes...(not all modes supported) '' +--------------------------------------------------------------------------+ _MODE = $F << 5 ' mode bits defining the call b8..b5 (b4..b0 are modifier options) _SHIFT = 5 ' shr # to extract mode bits _HEX_ = 2 << 5 ' hex... _REV_ = 1 << 4 ' - reverse byte order _SP = 1 << 3 ' - space between hex output pairs '_DIGITS = 7..0 where 8->0 ' - no. of digits to display _LIST = 3 << 5 ' LIST memory line (1/4 longs) from cog/hub _ADDR2 = 1 << 4 ' 1= use lmm_p2 as to-address _LONG_ = 1 << 1 ' 1=display longs xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx _TXSTRING = 4 << 5 ' tx string (nul terminated) from hub _RXSTRING = 5 << 5 ' rx string _ECHO_ = 1 << 4 ' - echo char _PROMPT = 1 << 3 ' - prompt (lmm_x) _ADDR = 1 << 2 ' - addr of string buffer supplied _NOLF = 1 << 1 ' - strip '_MONITOR = 7 << 5 ' goto rom monitor '' +--------------------------------------------------------------------------+ '' P2 ROM SERIAL ROUTINES (HUBEXEC) '' +--------------------------------------------------------------------------+ _SerialInit = $fcab8 ' Serial Initialise (lmm_x & lmm_bufad must be set first) _HubTxCR = $fcae4 ' Sends (overwrites lmm_x) _HubTxRev = $fcaec ' Sends lmm_x with bytes reversed _HubTx = $fcaf0 ' Sends lmm_x (can be up to 4 bytes) _HubHexRev = $fcb24 ' Sends lmm_x with bytes reversed as Hex char(s) as defined in lmm_f _HubHex8 = $fcb28 ' Sends lmm_x as Hex char(s) after setting lmm_f as 8 hex chars _HubHex = $fcb2c ' Sends lmm_x as Hex char(s) as defined in lmm_f _HubTxStrVer = $fcb9c ' Sends $0 terminated string at lmm_p address after setting lmm_p=##_str_vers _HubTxString = $fcba4 ' Sends $0 terminated string at lmm_p address _HubListA2H = $fcbc4 ' List/Dump line(s) from lmm_p address to lmm_p2 address after setting lmm_f=#_LIST+_ADDR2 _HubList = $fcbc8 ' List/Dump line(s) from lmm_p address to lmm_p2 address according to lmm_f _HubRx = $fcb10 ' Recv char into lmm_x _HubRxStrMon = $fccc4 ' Recv string into lmm_bufad address after setting prompt=lmm_x=#"*" & params=lmm_f=#_RXSTRING+_ECHO_+_PROMPT _HubRxString = $fcccc ' Recv string into lmm_p/lmm_bufad address according to params in lmm_f _HubMonitor = $fcd78 ' Calls the Monitor; uses lmm_bufad as the input buffer address _RdLongCogHub = $fcf34 ' read cog/lut/hub long from lmm_p address into lmm_x, then lmm_p++ _str_vers = $fd014 ' locn of hub string, $0 terminated '' +--------------------------------------------------------------------------+ '' HUB ADDRESSES '' +--------------------------------------------------------------------------+ _HUBROM = $FC000 ' ROM $FC000 _HUBBUF = $FC000 ' overwrite Booter _HUBBUFSIZE = 80 ' RxString default size for _HUBBUF '' +--------------------------------------------------------------------------+ ''============[ COG VARIABLES $1E0-$1EF - MONITOR]============================= ''-------[ LMM parameters, etc ]----------------------------------------------- lmm_x = $1e0 ' parameter passed to/from LMM routine (typically a value) lmm_f = $1e1 ' parameter passed to LMM routine (function options; returns unchanged) lmm_p = $1e2 ' parameter passed to/from LMM routine (typically a hub/cog ptr/addr) lmm_p2 = $1e3 ' parameter passed to/from LMM routine (typically a 2nd hub/cog address) lmm_c = $1e4 ' parameter passed to/from LMM routine (typically a count) ''-------[ LMM additional workareas ]------------------------------------------ lmm_w = $1e5 ' workarea (never saved - short term use between calls, except _HubTx) lmm_tx = $1e6 ' _HubTx lmm_hx = $1e7 ' _HubHex/_HubString lmm_hx2 = $1e8 ' _HubHex lmm_hc = $1e9 ' " lmm_lx = $1ea ' _HubList lmm_lf = $1eb ' " lmm_lp = $1ec ' " lmm_lp2 = $1ed ' " lmm_lc = $1ee ' " lmm_bufad = $1ef ' _HubRxString '' +--------------------------------------------------------------------------+ '' ASCII equates '' +--------------------------------------------------------------------------+ _CLS_ = $0C _BS_ = $08 _LF_ = $0A _CR_ = $0D _TAQOZ_ = $1B ' goto TAQOZ '' +--------------------------------------------------------------------------+ CON '' <------------- P1 -------------> register <--------------- P2 ----------------> '' --------------------------------------------------------------------------------- '' Boot Parameter PAR = $1F0 = IJMP3 INT3 interrupt call address '' System Counter CNT = $1F1 = IRET3 INT3 interrupt return address '' Input States P31..P0 INA = $1F2 = IJMP2 INT2 interrupt call address '' Input States P63..P32 INB = $1F3 = IRET2 INT2 interrupt return address '' Output States P31..P0 OUTA = $1F4 = IJMP1 INT1 interrupt call address '' Output States P63..P32 OUTB = $1F5 = IRET1 INT1 interrupt return address '' Output Enables P31..P0 DIRA = $1F6 = PA CALLD/CALLPA/LOC '' Output Enables P63..P32 DIRB = $1F7 = PB CALLD/CALLPB/LOC '' Counter A Control CTRA = $1F8 = PTRA pointer A to hub RAM '' Counter B Control CTRB = $1F9 = PTRB pointer B to hub RAM '' Counter A Frequency FRQA = $1FA = DIRA P31..P0 Output Enables '' Counter B Frequency FRQB = $1FB = DIRB P63..P32 Output Enables '' Counter A Phase PHSA = $1FC = OUTA P31..P0 Output States '' Counter B Phase PHSB = $1FD = OUTB P63..P32 Output States '' Video Configuration VCFG = $1FE = INA P31..P0 Input States * '' Video Scale VSCL = $1FF = INB P63..P32 Input States ** '' --------------------------------------------------------------------------------- ''============================[ CON ]============================================================ CON ' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ' % THIS IS THE TEST VERSION of the ClusoInterpreterP2 % ' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ' P2 opcode cz i_WRBYTE = $188 '%1100010_0L i_WRWORD = $18A '%1100010_1L i_WRLONG = $18C '%1100011_0L i_RDBYTE = $158 '%1010110_cz i_RDWORD = $15C '%1010111_cz i_RDLONG = $160 '%1011000_cz '' +--------------------------------------------------------------------------+ '' HUB ADDRESSES '' +--------------------------------------------------------------------------+ HUB_interpreter = $01000 HUB_vectors = $01800 HUB_init = $02000 '' +--------------------------------------------------------------------------+ DAT orgh 0 org 0 '------------------------------------------------------------------------------------------------------------ clkfreq jmp #@StartInterpreter ' this gets replaced with hub$0=clkfreq '------------------------------------------------------------------------------------------------------------ ' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ' % THE SPIN BYTECODE GOES HERE (starts at HUB $00004) % ' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '----------------------------------------------------------------------------------------------- 'Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F '----------------------------------------------------------------------------------------------- {00000000} byte {$00, $B4, $C4, $04,}$6F, $8D, $10, $00, $3C, $00, $44, $00, $18, $00, $54, $00 {00000010} byte $2C, $00, $02, $00, $08, $00, $0C, $00, $66, $08, $66, $0C, $38, $F5, $65, $39 '<<< {00000020} byte $85, $55, $69, $66, $10, $6A, $14, $66, $18, $6A, $1C, $38, $55, $65, $66, $26 {00000030} byte $66, $2E, $66, $36, $66, $3E, $04, $60, $32, $00, $00, $00, $FF, $FF, $F9, $FF {00000040} byte $FF, $FF, $F9, $FF '----------------------------------------------------------------------------------------------- '%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '------------------------------------------------------------------------------------------------------------ DAT ' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ' % THIS IS THE TEST VERSION of the ClusoRamInterpreter for P2 % ' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ' PTRA <= pcurr ' PTRB <= dcurr ' PA <= pushret ' PB <= popx_ret orgh HUB_interpreter org 0 ClusoInterpreter '------------------------------------------------------------------------------------------------------------ ' PTRA = $004 (ie pbase-2) so read 6 words into dcall++ parx mov parx,ptra 'save PAR x add ptra,#2 'offset to pbase y rdword pbase,ptra++ '\ pbase a rdword vbase,ptra++ '| vbase t1 rdword dbase,ptra++ '| dbase t2 rdword id ,ptra++ '| pcurr op rdword ptrb ,ptra++ '/ dcurr op2 mov ptra ,id ' pcurr adr cogid id skip_rev loc PA,#loop 'setup pushret skip_reg jmp #loop r long 0 ' register# for j9/jF vtable long 0 'vector_table entry '^^^--- The above code (13 longs) are overlayed as variables.... '------------------------------------------------------------------------------------------------------------ ' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ' % Main loop % ' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% pushz if_z jmp #pushr 'Z = jmp #pushr jmp #loop 'NZ= jmp #loop pushtf MUXZ x,masklong 'Z=true(-1),NZ=false(0) pushr wrlong x,ptrb++ 'push result loop call #_debugloop mov x,#0 'reset x rdbyte op,ptra++ 'get opcode (bytecode) mov a,op 'preset a (for mathop) test op,#%01 wz 'get flags test op,#%10 wc '(note varop requires c=1) rdlut vtable,op 'get the vector_table entry call #_debugvect call #_debugrx execf vtable 'jump vtable[9:0] & skipf vtable[31:10] '------------------------------------------------------------------------------------------------------------ jmp #$ ' never gets here!!! (can save instr) '<=== '------------------------------------------------------------------------------------------------------------ ' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ' % 0 $00 Drop anchor --- push --- % j0_0 $0 ' % $01 Drop anchor --- --- --- % j0_1 $0 ' % $02 Drop anchor try push --- % j0_2 $0 ' % $03 Drop anchor try --- --- % j0_3 $0 ' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% j0 or op,pbase 'add pbase into flags wrword op,ptrb++ 'push return pbase & flags wrword vbase,ptrb++ 'push return vbase wrword dbase,ptrb++ 'push return dbase wrword dcall,ptrb++ 'push dcall mov dcall,ptrb '\ dcall = sub dcall,#2 '/ dcall stack posn jmp #pushr 'push init result=0 ' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ' % 1 % ' % $05 call sub --- % s j1_1 %--_----_---1_1110_0000_1010 ' % $06 call obj.sub --- % o j1_2 %--_----_---0_0000_0000_1010 ' % $07 call obj[].sub x % i j1_3 %--_----_---0_0000_0000_0000 ' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ' s o i %--_----_----_----_----_---0 j1_123 rdlong x,--ptrb 'popx=index - - i %--_----_----_----_----_--0- rdbyte y,ptra++ 'get obj/sub byte s o i %--_----_----_----_----_-0-- add y,x 'add any obj index - - i %--_----_----_----_----_0--- shl y,#2 'lookup words from table s o i %--_----_----_----_---0_---- add y,pbase ' s o i %--_----_----_----_--0-_---- rdlong y,y ' s o i %--_----_----_----_-0--_---- mov x,y 'get low word s o i %--_----_----_----_0---_---- shr y,#16 'get high word s o i %--_----_----_---0_----_---- {obj.sub & obj[].sub} add pbase,x 'set relative obj bases - o i %--_----_----_--0-_----_---- add vbase,y wc 'NC - o i %--_----_----_-0--_----_---- modz _set wz 'Z - o i %--_----_----_0---_----_---- jmp #jmpadr 'NC+Z - o i %--_----_---0_----_----_---- mov dbase,dcall 'get new dcall s rdword dcall,dcall 'set old dcall s wrword ptra,dbase 'set return pcurr s add dbase,#2 'set call dbase s add ptrb,y 'set call dcurr s spcurr if_nc mov ptra,pbase 'NC: set call pcurr s if_nc add ptra,x 'NC: s jmp #loop ' s ' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ' % 1 $04 jmp --- % j1_0 $0 ' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ' % 2 $08 tjz - push if nz x % j2_0 $0 ' % $09 djnz - push if nz x % j2_1 $0 ' % $0A jz x % j2_2 $0 ' % $0B jnz x % j2_3 $0 ' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% j2 rdlong x,--ptrb 'popx jmpadr ' j1_0 call #getadrs 'get sign-ext adr in op2 if_nc_and_nz sub x,#1 'if djnz, decrement cmp x,#1 wc 'determine branch apcurr if_c_eq_z add ptra,op2 'branch? (all cases tested) muxc op,#%00001001 wz 'if tjz/djnz and not 0, push, else loop if_z wrlong x,ptrb++ 'push result ? jmp #loop '------------------------------------------------------------------------------ 'get sign-extended adress in op2 getadrs rdbyte op2,ptra++ 'get 1st byte in op2 test op2,#$80 wc 'if bit7 set, another byte signx op2,#6 'sign-extend from bit6 if_nc RET wcz 'restore c+z (not another byte) rdbyte t2,ptra++ 'get 2nd byte and shift in shl op2,#8 or op2,t2 RET wcz 'restore c+z '------------------------------------------------------------------------------ ' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ' % 3 $0C casedone y,x % j3_0 %00_0000_0000_0000_0000_0001 ' % $0D value case y,x % j3_1 %00_0000_0000_0000_0000_1001 ' % $0E range case a,y,x % j3_2 %00_0000_0000_0000_0001_1000 ' % $0F lookdone a,y,x % j3_3 $0 ' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ' % 4 $10 value lookup y,x % j4_0 %00_0000_0000_0000_0110_1001 ' % $11 value lookdown y,x % j4_1 %00_0000_0000_0000_0110_1001 ' % $12 range lookup a,y,x % j4_2 %00_0000_0000_0000_0111_1000 ' % $13 range lookdown a,y,x % j4_3 %00_0000_0000_0000_0111_1000 ' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 'j3_0 casedone: popyx target+address & jump 'j3_1 value case: popyx target+value 'j3_2 range case: popayx target+range+range 'j3_3 lookdone: popayx target+address+index (discard & push result x=0) 'j4_0 value lookup: popyx target+value 'j4_1 value lookdn: popyx target+value 'j4_2 range lookup: popayx target+range+range 'j4_3 range lookdn: popayx target+range+range j3_3 sub ptrb,#12 '\ popayx & discard j3_3 $0 jmp #pushr '/ & push result x=0 xx j34 rdlong a,--ptrb 'popa %--_----_----_----_----_---0 rdlong y,--ptrb 'popy %--_----_----_----_----_--0- rdlong x,--ptrb 'popx %--_----_----_----_----_-0-- {j3_0} jmp #spcurr 'NC+Z %--_----_----_----_----_0--- {j3_1 j4_0 j4_1} mov a,y 'x=target, y..a=range %--_----_----_----_---0_---- {j3_1 j3_2} call #getadrs 'get sign-extended address %--_----_----_----_--0-_---- {j3_1 j3_2} modz _set wz 'c=same & Z %--_----_----_----_-0--_---- {j3_12 j4_0123} sub ptrb,#8 'pop index into t1 (underneath adr) rdlong t1,ptrb ' cmps a,y wc 'reverse range? negc t2,x 'set t2 for in-range.. if_nc sumz t2,t1 'forward lookup: -t1 + x + y if_c add t2,t1 'forward lookdown: t1 + x - y if_nc sumnz t2,y 'reverse lookup: t1 - x + y if_c add t2,y 'reverse lookdown: t1 - x + y??? '------------------------------------------------------- ' must be preceded by: cmps a,y wc 'check if x in range y..a according to c if_c xor a,y '\ C = swap range values if_c xor y,a '| if_c xor a,y '/ cmps x,y wc '\ c=0 if x within range if_nc cmps a,x wc '/ '------------------------------------------------------- if_z cmp x,t1 wc 'if lookup, c=0 if index within range add t1,a 'on first compare, t1 = index sub t1,y 'on second compare, t1 = index+a-y if_z_and_nc cmp t1,x wc if_nc mov t1,t2 'if in range, t1 = t2 if_c add t1,#1 'if out of range, t1 = index+a-y+1 test op,#%100 wz 'look or case? (Z=look) if_z wrlong t1,ptrb 'if look, update index '<=== combine 2 instrs??? add ptrb,#12 'unpop index+address+target if_z_and_nc rdlong y,--ptrb 'if look true or casedone, popy (target) if_z_and_nc rdlong x,--ptrb ' & popx (address) if_z jmp #spcurr 'if look true or casedone, branch or loop jmp #apcurr 'case, branch if true ' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ' % 5 $14 pop x ptrb-x % j5_0 %00_0000_0000_0000_0000_1100 ' % $15 run --- lsb<-ptra<-$FFFC % j5_1 %00_0000_0000_0000_0000_0011 ' % $16 STRSIZE(string) x a % j5_2 $0 ' % $17 STRCOMP(stringa,stringb) y,x x,y % j5_3 $0 ' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% j5_01 rdlong x,--ptrb 'popx %--_----_----_----_----_---0 sub ptrb,x 'if pop, subtract count from ptrb %--_----_----_----_----_--0- mov lsb,ptra 'if run, save pcurr and set to $FFFC %--_----_----_----_----_-0-- mov ptra,maskpar ' %--_----_----_----_----_0--- jmp #loop 'pop/run: loop j5_2 rdlong a,--ptrb 'popx-->a (string) j5_2 $0 neg x,#1 'init !count in x .loop rdbyte t1,a wz 'measure string add a,#1 if_nz djnz x,#.loop 'if NZ count-- not x '!count jmp #pushr 'push result j5_3 rdlong y,--ptrb 'popy-->y (stringb) j5_3 $0 rdlong a,--ptrb 'popx-->a (stringa) .loop3 rdbyte t1,a '\ compare strings add a,#1 '| rdbyte t2,y '| add y,#1 '| xor t1,t2 wz '/ z if strings match if_nz jmp #pushtf 'push mismatch=NZ=false=0 tjnz t2,#.loop3 'Z=endofstring, else loop jmp #pushtf 'push match=Z=true(-1) ' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ' % 6 $18 BYTEFILL(start,value,count) a,y,x x,y,a % j6_0 %00_0000_0000_0000_0111_0000 ' % $19 WORDFILL(start,value,count) a,y,x x,y,a % j6_1 %00_0000_0000_0000_0111_0000 ' % $1A LONGFILL(start,value,count) a,y,x x,y,a % j6_2 %00_0000_0000_0000_0111_0000 ' % % ' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ' % 7 $1C BYTEMOVE(to,from,count) a,y,x x,y,a % j7_0 %00_0000_0010_0100_0000_0000 ' % $1D WORDMOVE(to,from,count) a,y,x x,y,a % j7_1 %00_0000_0010_0100_0000_0000 ' % $1E LONGMOVE(to,from,count) a,y,x x,y,a % j7_2 %00_0000_0010_0100_0000_0000 ' % % ' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% j6_012 ' fill/move j7_012 rdlong a,--ptrb 'popa (count/count) %--_----_----_----_----_---0 rdlong y,--ptrb 'popy (value/from ) %--_----_----_----_----_--0- rdlong x,--ptrb 'popx (start/to ) %--_----_----_----_----_-0-- tjz a,#loop 'skip if count=0 %--_----_----_----_----_0--- 'set move read byte/word/long setr .rdmove,#i_rdbyte ' %--_----_----_----_---0_---- setr .rdmove,#i_rdword ' %--_----_----_----_--0-_---- setr .rdmove,#i_rdlong ' %--_----_----_----_-0--_---- 'set fill/move write byte/word/long setr .wrmove,#i_wrbyte ' %--_----_----_----_0---_---- setr .wrmove,#i_wrword ' %--_----_----_---0_----_---- setr .wrmove,#i_wrlong ' %--_----_----_--0-_----_---- mov .wrfill,.wrmove 'copy .wrmove to .wrfill %--_----_----_-0--_----_---- push PTRB 'save %--_----_----_0---_----_---- mov PTRB,x 'set start/to %--_----_---0_----_----_---- jmp #.fill ' %--_----_--0-_----_----_---- 'MOVE... push PTRA 'save mov PTRA,y 'set from rep @.repm,a 'a=count .rdmove rdbyte y,PTRA++ 'rd byte/word/long .wrmove wrbyte y,PTRB++ 'wr byte/word/long .repm ' pop PTRA 'restore pop PTRB 'restore jmp #loop 'FILL... .fill rep @.repf,a 'a=count .wrfill wrbyte y,PTRB++ 'wr byte/word/long .repf pop PTRB 'restore jmp #loop ' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ' % 6 $1B WAITPEQ(data,mask,port) a,y,x x,y,a % j6_3 $0 ' % 7 $1F WAITPNE(data,mask,port) a,y,x x,y,a % j7_3 $0 ' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% j6_3 ' j7_3 rdlong a,--ptrb 'popa (port) test a,#1 wz 'Z=portA, NZ=portB if_z sets .inx,#INA if_nz sets .inx,#INB rdlong y,--ptrb 'popy (mask) rdlong x,--ptrb 'popx (data) test op,#%100 wc 'NC=peq, C=pne .inx mov t1,0-0 'ina/inb and t1,y 'mask cmp x,t1 wz 'x=inx&mask? if_c_eq_z jmp #.inx 'wait for condition ????? jmp #loop ' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ' % 8 $20 CLKSET(mode,freq) y,x x,y % j8_0 %00_0000_0000_0001_1110_0000 ' % $21 COGSTOP(id) x % j8_1 %00_0000_0000_0001_1101_1101 ' % $22 LOCKRET(id) x % j8_2 %00_0000_0000_0001_1011_1101 ' % $23 WAITCNT(count) x % j8_3 %00_0000_0000_0000_0111_1101 ' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% j8 rdlong y,--ptrb 'popy %--_----_----_----_----_---0 rdlong x,--ptrb 'popx %--_----_----_----_----_--0- nop ' clkset x ' ????? %--_----_----_----_----_-0-- nop ' wrlong y,#$0000 ' ????? %--_----_----_----_----_0--- nop ' wrbyte x,#$0004 ' ????? %--_----_----_----_---0_---- cogstop x 'cogstop %--_----_----_----_--0-_---- lockret x 'lockret %--_----_----_----_-0--_---- addct1 x,#0 'set new cnt %--_----_----_----_0---_---- waitct1 ' and wait %--_----_----_---0_----_---- jmp #loop ' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ' % AB $28/$2C COGINIT(id,ptr,par) a,y,x x,y,a % jAB_0 %00_0000_0000_0011_1111_1000 ' % $29/$2D LOCKNEW --- % jAB_1 %00_0000_0000_0000_1110_0111 ' % $2A/$2E LOCKSET(id) x % jAB_2 %00_0000_0000_0000_0101_1011 ' % $2B/$2F LOCKCLR(id) x % jAB_3 %00_0000_0000_0000_0011_1011 ' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% jAB rdlong a,--ptrb 'popa %--_----_----_----_----_---0 rdlong y,--ptrb 'popy %--_----_----_----_----_--0- rdlong x,--ptrb 'popx %--_----_----_----_----_-0-- locknew x wc 'locknew %--_----_----_----_----_0--- if_c neg x,#1 '-1 if c, else 0..7 %--_----_----_----_---0_---- locktry x wc 'clr/set lock %--_----_----_----_--0-_---- lockrel x wc ' %--_----_----_----_-0--_---- muxc x,masklong '-1 if c, else 0 %--_----_----_----_0---_---- jABpushz test op,#%100 wz 'push result? %--_----_----_---0_----_---- jmp #pushz 'Z=push result, then loop %--_----_----_--0-_----_---- and a,maskpar 'assemble fields shl a,#16 ' and y,maskpar ' fle x,#8 ' >8 starts next available cog shl y,#2 ' or y,a ' or x,y ' '? setq a 'set PAR->PTRA (changed above!) '? coginit x wc,wr ' ????? neg x,#1 '-1 jmp #jABpushz ' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ' % C $30 ABORT --- % jC_0 %00_0000_0000_0000_0000_0001 ' % $31 ABORT value x % jC_1 %00_0000_0000_0000_0000_0010 ' % $32 RETURN --- % jC_2 %00_0000_0000_0000_0000_0001 ' % $33 RETURN value x % jC_3 %00_0000_0000_0000_0000_0010 ' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% jC rdlong x,--ptrb 'popx %--_----_----_----_----_---0 rdlong x,dbase 'if no value, get 'result' %--_----_----_----_----_--0- .loop mov ptrb,dbase 'restore ptrb rdword ptra,--ptrb 'pop ptra rdword dbase,--ptrb 'pop dbase rdword vbase,--ptrb 'pop vbase rdword pbase,--ptrb 'pop pbase & flags if_nc test pbase,#%10 wc 'if abort and !try, return again if_nc jmp #.loop test pbase,#%01 wz 'get push flag jmp #pushz 'push result? & loop ' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ' % D $34 push constant -1 --- % jD_0 $0 ' % $35 push constant 0 --- % jD_1 $0 ' % $36 push constant 1 --- % jD_2 $0 ' % $37 push constant -idsssss --- % jD_3 %00_0000_0000_0001_1000_0000 ' % i=invert, d=decrement, x = #2< -1/0/1 into x %--_----_----_---x_----_--x- jmp #pushr 'push result ' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ' % E $38 constant 1 byte --- % jE_0 $0 ' % $39 constant 2 bytes --- % jE_1 $0 ' % $3A constant 3 bytes --- % jE_2 $0 ' % $3B constant 4 bytes --- % jE_3 $0 ' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ' jE sub op,#$37 'op = 1/2/3/4 bytes ($38..3B - $37) rep @.rep,op rdbyte a,ptra++ 'constant: get data byte(s) shl x,#8 or x,a .rep jmp #pushr 'push result ' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ' % 9 $27 WAITVID(colors,pixels) y,x *Invalid* % j9_3 $0 ' % F $3C --- *Unused* % jF_0 $0 ' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% j9_3 rdlong y,--ptrb 'popy rdlong x,--ptrb 'popx jF_0 jmp #loop ' ' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ' % 9 $24 SPR[nibble] x push % j9_0 r %--_----_----_1111_0100_0111 ' % $25 SPR[nibble] x pop % j9_1 w %--_----_----_1111_0100_0111 ' % $26 SPR[nibble] x asgn % ????? j9_2 a %--_----_----_1111_0100_0111 ' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ' % F $3D register[bit] op x % jF_1 b %--_----_----_0000_1001_1001 ' % $3E register[bit..bit] op y,x % jF_2 r %--_----_----_0000_1001_1100 ' % $3F register op --- push/pop/asgn/adr % ????? jF_3 o %--_----_----_1000_1100_0111 ' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% j9_012 'x=reg $1Fx j9... jF... jF_123 'yx=[b..b] pcurr=op+reg 0 1 2 1 2 3 {jF_2} rdlong y,--ptrb 'popy: bit - - - - r - %--_----_----_----_----_---0 {jF_2 jF_1} rdlong x,--ptrb 'popx: bit - - - b r - %--_----_----_----_----_--0- {jF_1} mov y,x 'if single bit range - - - b - - %--_----_----_----_----_-0-- {j9_012 jF_3} mov lsb,#0 '\ bits[31:0] r w a - - o %--_----_----_----_----_0--- neg a,#1 '/ ..mask=1's r w a - - o %--_----_----_----_---0_---- mov skip_rev,#3 'preset no reverse r w a b r o %--_----_----_----_--0-_---- {jF_12} call #.bit_range 'set a=bit-mask, lsb=lowest-bit - - - b r - %--_----_----_----_-0--_---- {j9_012} rdlong r,--ptrb 'popx: reg r w a - - - %--_----_----_----_0---_---- {jF_123} rdbyte r,ptra++ 'pcurr: reg+op - - - b r o %--_----_----_---0_----_---- mov op,r '\ justify op - - - b r o %--_----_----_--0-_----_---- shr op,#5 '/ (sets type to register) - - - b r o %--_----_----_-0--_----_---- {jF_12} or op,#%1100 'set bit mode - - - b r - %--_----_----_0---_----_---- ????? call #_debugreg1 {j9_012 jF_123} call #.reg_xlate 'translate to P2 regs r w a b r o $0 call #_debugreg2 test op,#%01 wz '\ get op flags test op,#%10 wc '/ if_nc_and_z jmp #.read 'read? if_nc_and_nz jmp #.write 'write? if_c_and_z jmp #assign 'assign? (using) ' if_c_and_nz 'address? =fall thru '------------------------------------------------------- .addr mov x,adr 'address ????? s/be -bitcount ????? and x,maskword jmp #pushr '------------------------------------------------------- .read skipf skip_reg '\ skip if no P2 reg equiv alts r '| insert reg# .rdreg mov x,0-0 '/ read reg and x,a '\ extract bit field shr x,lsb '/ skipf skip_rev '\ skip unless reversed rev x '| .. rol x,lsb '/ .. reverse bit field jmp #pushr 'push result '------------------------------------------------------- .write rdlong x,--ptrb 'popx: value ????? mov lmm_x,x call #showCR mov lmm_x,skip_rev call #showCR skipf skip_rev '\ skip unless reversed rev x '| .. rol x,lsb '/ .. reverse bit field mov lmm_x,x call #showCR shl x,lsb '\ shift into bit posn and x,a '/ ..& extract bit field mov lmm_x,x call #showCR skipf skip_reg '\ skip if no P2 reg equiv alts r '| insert reg# '''.rwreg andn a,0-0 '/ read other bits mov t1,0-0 '/ read other bits mov lmm_x,a call #showCR andn t1,a mov a,t1 mov lmm_x,a call #showCR or x,a ' insert new bits mov lmm_x,x call #showCR skipf skip_reg '\ skip if no P2 reg equiv altd r '| insert reg# .wrreg mov 0-0,x '/ write back to reg jmp #loop ' '------------------------------------------------------- .bit_range and x,#$1F '\ trim bit/range and y,#$1F '/ mov adr,x '\ adr= bits-1 sub adr,y wc '| & C=reverse if_c neg adr '/ if_c mov lsb,x '\ lsb= lowest bit if_nc mov lsb,y '/ bmask a,adr '\ setup bit mask shl a,lsb '/ if_c mov skip_rev,#0 'C: set to reverse RET wcz ' '------------------------------------------------------- 'this code tweeked for speed... .reg_xlate or r,#$1E0 '\ make $1E0-$1FF and r,#$1FF '/ mov skip_reg,#3 'preset to skip alt+r/w regs cmp r,#$1F1 wcz 'C if <$1F1, Z if $1F1 if_c_or_z jmp #.le_1F1 'j if <$1F2 cmp r,#$1F8 wc 'C if <$1F8 if_nc RET wcz 'if >$1F7 '$1F2-$1F7 = INx/OUTx/DIRx.. .xlate sub r,#$1F2 'offset to table alts r,#reg_table '\ translate to P2 SPR mov r,0-0 '/ get table entry mov skip_reg,#0 'don't skip alt+r/w regs RET wcz ' '$1Ex, $1F0=PAR, $1F1=CNT .le_1F1 if_z getct x 'y: get CNT if_z RET wcz ' cmp r,#$1F0 wz 'PAR? if_z mov x,parx 'y: get PAR if_nz mov skip_reg,#0 '<$1F0: don't skip alt+r/w regs RET wcz ' '------------------------------------------------------- reg_table 'translate INx/OUTx/DIRx regs P1 to P2 '------------------------------------------------------- long $1FE ' $1F2 INA long $1FF ' $1F3 INB long $1FC ' $1F4 OUTA long $1FD ' $1F5 OUTB long $1FA ' $1F6 DIRA long $1FB ' $1F7 DIRB '------------------------------------------------------------------------------------------------------------ '---------------------------------------------------------------------------------------------------------------------------- ' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ' % Assignment % ' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ' .---v---v---v---v---v---v---v---. ' Math Assignment (USING) | p 1 s | o o o o o | (32 maths opcodes) "op2" ' operation `---^---^---^---^---^---^---^---' ' | | ' | (!s) 0 = swap binary args ' | 1 = no swap ' (!p) 0 = push ' 1 = no push ' ' .---v---v---v---v---v---v---v---. ' Assignment (USING) | p 0 | x x x x x | - | "op2" ' `---^---^---^---^---^---^---^---' ' p 0 0 0 0 0 0 - write ' p 0 0 0 0 s 1 - repeat-var loop, s = pop step +1..2 address ' p 0 0 0 1 0 - - ?var rnd forward long ' p 0 0 0 1 1 - - var? rnd reverse long ' p 0 0 1 0 0 - - ~var sign extend byte ' p 0 0 1 0 1 - - ~~var sign extend word ' p 0 0 1 1 0 - - var~ post-clear ' p 0 0 1 1 1 - - var~~ post-set ' p 0 1 0 0 s s - ++var pre-inc ss=00=mask size bit/adr??? ' p 0 1 0 1 s s - var++ post-inc 01=mask size byte ' p 0 1 1 0 s s - --var pre-dec 10=mask size word ' p 0 1 1 1 s s - var-- post-dec 11=mask size long ' `---^---^---^---^---^---^---^---' ' | ' (p) 0 = no push ' 1 = push back on stack (keep) '---------------------------------------------------------------------------------------------------------------------------- {{ assign_var mov y,#%10 'long mov adr,op '\ adr scale and adr,#%00011100 '/ *4 test op,#%00100000 wz 'Z=0=VAR=vbase, NZ=1=LOC=dbase modc _set wc 'C=1 jmp #memopb '---------------------------------------------------------------------------------------------------------------------------- assign_mem mov y,op ' shr y,#5 ' and y,#%11 'byte/word/long/mathop test op,#%00010000 wc 'C=1=Index if_c rdlong x,--ptrb 'popx if_c shl x,y ' & scale test op,#%00001000 wc 'get base mode test op,#%00000100 wz '00=MEM 01=OBJ 10=VAR 11=LOC if_nc_and_z rdlong adr,--ptrb 'no base: pop adr (MEM) if_c_or_nz call #getadrz 'base: get zerox adr (OBJ/VAR/LOC) test op,#%00001000 wc 'restore c if_c_or_nz mov adr,op2 ' when was op2 set??? add adr,x 'add any index if_nc_and_nz add adr,pbase 'OBJ: +pbase memopb if_c_and_z add adr,vbase 'VAR: +vbase if_c_and_nz add adr,dbase 'LOC: +dbase 'set writem/readm size and op,#%11 'type PUSH/POP/ASSIGN/PUSH# mrop test op,#%01 wz '\set flags test op,#%10 wc '/ if_nc_and_z jmp #read 'read? if_nc_and_nz rdlong x,--ptrb '\popx & if_nc_and_nz jmp #write '/ write? if_c_and_nz mov x,adr '\address? if_c_and_nz and x,maskword '| if_c_and_nz jmp #pushr '/ 'j assign 'fall thru }} '---------------------------------------------------------------------------------------------------------------------------- assign_mem test op,#%01000000 wc ' 10=long, 11=math??? test op,#%00100000 wz ' 00=byte, 01=word if_nc_and_z setr rdmem,#i_rdbyte if_nc_and_z setr wrmem,#i_wrbyte if_nc_and_nz setr rdmem,#i_rdword if_nc_and_nz setr wrmem,#i_wrword assign_var if_c_and_z setr rdmem,#i_rdlong if_c_and_z setr wrmem,#i_wrlong if_c_and_nz jmp #_hubMonitor ' '<<<<<<<<<<<<<<<<<<< ????? assign rdbyte op2,ptra++ 'pcurr: op2 (assignment) test op2,#%01000000 wc 'C=mathop? if_nc jmp #assign0 'j if not mathop jmp #_hubMonitor ' '<<<<<<<<<<<<<<<<<<< ????? { .assign_mathop ''??? mov a,op2 'mathop: set op ''??? test op2,#%00100000 wz 'if mathop, z=swap args '<<<<<<<<<<<<<<<<<<< ????? '' if_z swapargs? ''store ret adr??? call #mathop sub ptrb,#4 'unpop var/result (in any case) .keep test op2,#%10000000 wc 'keep value on stack? if_c add ptrb,#4 'y: keep value on stack .restore mov? pushret,#loop 'restore pushret .writem wrbyte/word/long x,adr 'MEM write jmp #loop } '---------------------------------------------------------------------------------------------------------------------------- 'not a mathop so get xbyte vector/skip assign0 call #_debugassign mov t1,op2 '\ assign_table offset shr t1,#1 '| and t1,#$1F '| add t1,#$100 '/ rdlut vtable,t1 'get the assign_table entry call #_debugvect1 call #_debugrx execf vtable 'jump vtable[9:0] & skipf vtable[31:10] '---------------------------------------------------------------------------------------------------------------------------- ' write p000000- %00_0000_0111_1111_1111_1110 ' +1:2 adr s=pops repeat p0000s1- (see below) ' rnd fwd ?var p00010-- %00_0000_0101_1111_1111_1001 ' rnd rev var? p00011-- %00_0000_0101_1111_1111_0001 ' signx byte ~var p00100-- %00_0000_0101_1111_1110_1101 ' signx word ~~var p00101-- %00_0000_0101_1111_1101_1101 ' post-clear var~ p00110-- %00_0000_0111_1111_1011_1101 ' post-set var~~ p00111-- %00_0000_0111_1111_0111_1101 ' 00=bit/adr ++var p0100ss- %00_0000_010*_**10_1111_1101 ' 01=byte var++ p0101ss- %00_0000_010*_**10_1111_1101 ' 10=word --var p0110ss- %00_0000_010*_**01_1111_1101 ' 11=long var-- p0111ss- %00_0000_010*_**01_1111_1101 assignx .writep rdlong x,--ptrb 'popx: write w/push %--_----_----_----_----_---0 rdmem rdlong x,adr 'MEM read var byte/word/long??? %--_----_----_----_----_--0- ????? .rnd getrnd x 'get random value %--_----_----_----_----_-0-- rev x 'rev %--_----_----_----_----_0--- .sxcs signx x,#7 '~var sign xtnd byte %--_----_----_----_---0_---- signx x,#15 '~~var sign xtnd word %--_----_----_----_--0-_---- mov x,#0 'var~ %--_----_----_----_-0--_---- neg x,#1 'var~~ %--_----_----_----_0---_---- .incdec add x,#1 '++var/var++ %--_----_----_---0_----_---- sub x,#1 '--var/var-- %--_----_----_--0-_----_---- zerox x,adr 'mask result by size: adr -1 ????? %--_----_----_-0--_----_---- ????? and x,#$FF ' byte %--_----_----_0---_----_---- and x,maskword ' word %--_----_---0_----_----_---- .stack wrlong x,ptrb 'update var on stack %--_----_--0-_----_----_---- add ptrb,#4 'keep var on stack %--_----_-0--_----_----_---- <<<<< .keep test op2,#%10000000 wc ' %--_----_0---_----_----_---- if_c add ptrb,#4 'keep var on stack %--_---0_----_----_----_---- .restore nop 'restore pushret to #loop %--_--0-_----_----_----_---- wrmem wrlong x,adr 'MEM read var byte/word/long??? %--_-0--_----_----_----_---- ????? jmp #loop ' $0 repeatx ' +1:2 adr s=pops repeat 0 p0000s1- %--_----_----_----_----_0100 ' +1:2 adr s=pops repeat 1 p0000s1- %--_----_----_----_----_1000 {{ go to monitor!!! <<<<<<<<<< .repeat rdlong a,--ptrb 'popa: to %--_----_----_----_----_---0 rdlong y,--ptrb 'popy: from %--_----_----_----_----_--0- rdlong t1,--ptrb 'popt1: step %--_----_----_----_----_-0-- mov t1,#1 'if step default, set step to 1 %--_----_----_----_----_0--- call #getadrs 'get sign-extended address cmps a,y wc 'reverse range? sumc x,t1 'add/sub step to/from var call #range 'x in range y..a according to c? if_nc add ptra,op2 'if in range, branch ????? .keep test op2,#%10000000 wc 'keep value on stack? if_c wrlong x,ptrb++ 'push result .restore wrlong x,adr 'MEM write jmp #loop '------------------------------------------------------------------------------------------------------------ range if_c xor a,y 'if reverse range, swap if_c xor y,a ' if_c xor a,y ' cmps x,y wc '\ NC= x within range if_nc cmps a,x wc '/ RET 'returns NC if within range }} '------------------------------------------------------------------------------------------------------------ '' rdbyte x,adr '\ ASGN: read byte '<<<<<<<<<<<<<<<<<<<<< '' rdword x,adr '| read word '<<<<<<<<<<<<<<<<<<<<< '' rdlong x,adr '/ read long '<<<<<<<<<<<<<<<<<<<<< jxxx jmp #_hubMonitor '<<<<<<<<<<<<<<<<<<<<< '------------------------------------------------------------------------------------------------------------ '---------------------------------------------------------------------------------------------------------------------------- ' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ' % $40..7F Variable operation % ' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ' .---v---v---v---v---v---v---v---. These opcodes allow fast access by making long access '$40-7F Fast access VAR, LOC | 0 1 | w | v v v | o o | to the first few long entries in the variable space ' `---^---^---^---^---^---^---^---' or stack a single byte opcode. The single byte opcodes ' | | | are effectively expanded within the interpreter... ' 0= VAR Address 00= PUSH Read - push result in stack ' 1= LOC (adr = v*4) 01= POP Write - pop value from stack ' | | 10= USING 2nd opcode (assignment) executed, result in target ' | | 11= PUSH # Push address of destination into stack ' | `---------|------------------------. ' `-----------. | | ' \|/ \|/ \|/ ' .---v---v---v---v---v---v---v---. .---v---v---v---v---v---v---v---. ' | 1 | 1 0 | 0 | 1 w | o o | | 0 0 0 | v v v | 0 0 | ' `---^---^---^---^---^---^---^---' `---^---^---^---^---^---^---^---' '---------------------------------------------------------------------------------------------------------------------------- ' ADR ' VAR xxx PUSH %00_0000_0000_1111_1100_1000 ' " " POP %00_0000_0000_1111_0011_1000 ' " " ASGN %00_0000_0000_0000_1111_1000 ?????????? ' " " PUSH# %00_0000_0000_0011_1111_1000 ' ' LOC xxx PUSH %00_0000_0000_1111_1100_0100 ' " " POP %00_0000_0000_1111_0011_0100 ' " " ASGN %00_0000_0000_0000_1111_0100 ?????????? ' " " PUSH# %00_0000_0000_0011_1111_0100 varop {adr} mov adr,op '\ isolate adr %--_----_----_----_----_---0 and adr,#%00011100 '/ adr=n*4 %--_----_----_----_----_--0- ' {+base} add adr,vbase ' VAR: +base %--_----_----_----_----_-0-- add adr,dbase ' LOC: +base %--_----_----_----_----_0--- ' {read var} rdlong x,adr '\ PUSH: read var %--_----_----_----_---0_---- {push var} wrlong x,ptrb++ '/ & push %--_----_----_----_--0-_---- ' {pop var} rdlong x,--ptrb '\ POP: pop var %--_----_----_----_-0--_---- {write var} wrlong x,adr '/ & write %--_----_----_----_0---_---- ' modcz _set,_set wcz '\ ASGN: C+Z=long %--_----_----_---0_----_---- ?????????? jmp #assign_var '/ %--_----_----_--0-_----_---- ?????????? ' and x,maskword '\ PUSH#: mask adr %--_----_----_-0--_----_---- {push adr} wrlong adr,ptrb++ '/ & push %--_----_----_0---_----_---- ' jmp #loop ' ' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ' % $80-DF Memory operation % ' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ' .---v---v---v---v---v---v---v---. '$80-DF Access MEM, OBJ, | 1 | s s | i | w w | o o | (96 stack load / save opcodes) ' VAR and LOC `---^---^---^---^---^---^---^---' ' | | | | ' 00= Byte | | 00= PUSH Read - push result in stack ' 01= Word | | 01= POP Write - pop value from stack ' 10= Long | | 10= USING 2nd opcode (assignment) executed, result in target ' (11= mathop) | | 11= PUSH # Push address of destination into stack ' | 00= MEM base popped from stack, if i=1 add offset ' | 01= OBJ base is object base , if i=1 add offset ' | 10= VAR base is variable base , if i=1 add offset ' | 11= LOC base is stack base , if i=1 add offset ' 0= no offset ' 1=[]= add offset (indexed) '---------------------------------------------------------------------------------------------------------------------------- ' {pop adr} 'MEM: pop adr %--_----_----_----_----_0--- ' {no index} 'INDEX: pop/scale/+ %--_----_----_----_----_---- ' {read var byte} 'PUSH: read byte %--_----_----_--0-_----_---- ' {write var byte} 'POP: write byte %--_----_-0--_----_----_---- ' '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ '{read var} BYTE NO-INDEX MEM 'PUSH: read & push %--_----_---0_--0-_----_0--- '{pop var} " " " 'POP: pop & write %--_----_-00-_----_----_0--- '{assign} " " " 'ASGN: %--_-00-_----_----_----_0--- ?????????? '{push address} " " " 'PUSH#: mask & push %-0_0---_----_----_----_0--- '------------------------------------------------------------------------------------------------------------- ' {read adr} 'OBJ: read adr %--_----_----_----_-0-0_---- ' {no index} 'INDEX: pop/scale/+ %--_----_----_----_----_---- ' {read var byte} 'PUSH: read byte %--_----_----_--0-_----_---- ' {write var byte} 'POP: write byte %--_----_-0--_----_----_---- ' '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ '{read var} BYTE NO-INDEX OBJ 'PUSH: read & push %--_----_---0_--0-_-0-0_---- '{pop var} " " " 'POP: pop & write %--_----_-00-_----_-0-0_---- '{assign} " " " 'ASGN: %--_-00-_----_----_-0-0_---- ?????????? '{push address} " " " 'PUSH#: mask & push %-0_0---_----_----_-0-0_---- '------------------------------------------------------------------------------------------------------------- ' {read adr} 'VAR: read adr %--_----_----_----_0--0_---- ' {no index} 'INDEX: pop/scale/+ %--_----_----_----_----_---- ' {read var byte} 'PUSH: read byte %--_----_----_--0-_----_---- ' {write var byte} 'POP: write byte %--_----_-0--_----_----_---- ' '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ '{read var} BYTE NO-INDEX VAR 'PUSH: read & push %--_----_---0_--0-_0--0_---- '{pop var} " " " 'POP: pop & write %--_----_-00-_----_0--0_---- '{assign} " " " 'ASGN: %--_-00-_----_----_0--0_---- ?????????? '{push address} " " " 'PUSH#: mask & push %-0_0---_----_----_0--0_---- '------------------------------------------------------------------------------------------------------------- ' {read adr} 'LOC: read adr %--_----_----_---0_---0_---- ' {no index} 'INDEX: pop/scale/+ %--_----_----_----_----_---- ' {read var byte} 'PUSH: read byte %--_----_----_--0-_----_---- ' {write var byte} 'POP: write byte %--_----_-0--_----_----_---- ' '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ '{read var} BYTE NO-INDEX LOC 'PUSH: read & push %--_----_---0_--00_---0_---- '{pop var} " " " 'POP: pop & write %--_----_-00-_---0_---0_---- '{assign} " " " 'ASGN: %--_-00-_----_---0_---0_---- ?????????? '{push address} " " " 'PUSH#: mask & push %-0_0---_----_---0_---0_---- '--------------------------------------------------------------------------------------------------------------------------- ' {pop adr} 'MEM: pop adr %--_----_----_----_----_0--- ' {+index} 'INDEX: pop/scale/+ %--_----_----_----_--0-_-000 ' {read var byte} 'PUSH: read byte %--_----_----_--0-_----_---- ' {write var byte} 'POP: write byte %--_----_-0--_----_----_---- ' '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ '{read var} BYTE INDEX MEM 'PUSH: read & push %--_----_---0_--0-_--0-_0000 '{pop var} " " " 'POP: pop & write %--_----_-00-_----_--0-_0000 '{assign} " " " 'ASGN: %--_-00-_----_----_--0-_0000 ?????????? '{push address} " " " 'PUSH#: mask & push %-0_0---_----_----_--0-_0000 '------------------------------------------------------------------------------------------------------------- ' {read adr} 'OBJ: read adr %--_----_----_----_-0-0_---- ' {+index} 'INDEX: pop/scale/+ %--_----_----_----_--0-_-000 ' {read var byte} 'PUSH: read byte %--_----_----_--0-_----_---- ' {write var byte} 'POP: write byte %--_----_-0--_----_----_---- ' '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ '{read var} BYTE INDEX OBJ 'PUSH: read & push %--_----_---0_--0-_-000_-000 '{pop var} " " " 'POP: pop & write %--_----_-00-_----_-000_-000 '{assign} " " " 'ASGN: %--_-00-_----_----_-000_-000 ?????????? '{push address} " " " 'PUSH#: mask & push %-0_0---_----_----_-000_-000 '------------------------------------------------------------------------------------------------------------- ' {read adr} 'VAR: read adr %--_----_----_----_0--0_---- ' {+index} 'INDEX: pop/scale/+ %--_----_----_----_--0-_-000 ' {read var byte} 'PUSH: read byte %--_----_----_--0-_----_---- ' {write var byte} 'POP: write byte %--_----_-0--_----_----_---- ' '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ '{read var} BYTE INDEX VAR 'PUSH: read & push %--_----_---0_--0-_0-00_-000 '{pop var} " " " 'POP: pop & write %--_----_-00-_----_0-00_-000 '{assign} " " " 'ASGN: %--_-00-_----_----_0-00_-000 ?????????? '{push address} " " " 'PUSH#: mask & push %-0_0---_----_----_0-00_-000 '------------------------------------------------------------------------------------------------------------- ' {read adr} 'LOC: read adr %--_----_----_---0_---0_---- ' {+index} 'INDEX: pop/scale/+ %--_----_----_----_--0-_-000 ' {read var byte} 'PUSH: read byte %--_----_----_--0-_----_---- ' {write var byte} 'POP: write byte %--_----_-0--_----_----_---- ' '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ '{read var} BYTE INDEX LOC 'PUSH: read & push %--_----_---0_--00_--00_-000 '{pop var} " " " 'POP: pop & write %--_----_-00-_---0_--00_-000 '{assign} " " " 'ASGN: %--_-00-_----_---0_--00_-000 ?????????? '{push address} " " " 'PUSH#: mask & push %-0_0---_----_---0_--00_-000 '--------------------------------------------------------------------------------------------------------------------------- ' {pop adr} 'MEM: pop adr %--_----_----_----_----_0--- ' {no index} 'INDEX: pop/scale/+ %--_----_----_----_----_---- ' {read var word} 'PUSH: read word %--_----_----_-0--_----_---- ' {write var word} 'POP: write word %--_----_0---_----_----_---- ' '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ '{read var} WORD NO-INDEX MEM 'PUSH: read & push %--_----_---0_-0--_----_0--- '{pop var} " " " 'POP: pop & write %--_----_0-0-_----_----_0--- '{assign} " " " 'ASGN: %--_-00-_----_----_----_0--- ?????????? '{push address} " " " 'PUSH#: mask & push %-0_0---_----_----_----_0--- '------------------------------------------------------------------------------------------------------------- ' {read adr} 'OBJ: read adr %--_----_----_----_-0-0_---- ' {no index} 'INDEX: pop/scale/+ %--_----_----_----_----_---- ' {read var word} 'PUSH: read word %--_----_----_-0--_----_---- ' {write var word} 'POP: write word %--_----_0---_----_----_---- ' '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ '{read var} WORD NO-INDEX OBJ 'PUSH: read & push %--_----_---0_-0--_-0-0_---- '{pop var} " " " 'POP: pop & write %--_----_0-0-_----_-0-0_---- '{assign} " " " 'ASGN: %--_-00-_----_----_-0-0_---- ?????????? '{push address} " " " 'PUSH#: mask & push %-0_0---_----_----_-0-0_---- '------------------------------------------------------------------------------------------------------------- ' {read adr} 'VAR: read adr %--_----_----_----_0--0_---- ' {no index} 'INDEX: pop/scale/+ %--_----_----_----_----_---- ' {read var word} 'PUSH: read word %--_----_----_-0--_----_---- ' {write var word} 'POP: write word %--_----_0---_----_----_---- ' '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ '{read var} WORD NO-INDEX VAR 'PUSH: read & push %--_----_---0_-0--_0--0_---- '{pop var} " " " 'POP: pop & write %--_----_0-0-_----_0--0_---- '{assign} " " " 'ASGN: %--_-00-_----_----_0--0_---- ?????????? '{push address} " " " 'PUSH#: mask & push %-0_0---_----_----_0--0_---- '------------------------------------------------------------------------------------------------------------- ' {read adr} 'LOC: read adr %--_----_----_---0_---0_---- ' {no index} 'INDEX: pop/scale/+ %--_----_----_----_----_---- ' {read var word} 'PUSH: read word %--_----_----_-0--_----_---- ' {write var word} 'POP: write word %--_----_0---_----_----_---- ' '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ '{read var} WORD NO-INDEX LOC 'PUSH: read & push %--_----_---0_-0-0_---0_---- '{pop var} " " " 'POP: pop & write %--_----_0-0-_---0_---0_---- '{assign} " " " 'ASGN: %--_-00-_----_---0_---0_---- ?????????? '{push address} " " " 'PUSH#: mask & push %-0_0---_----_---0_---0_---- '--------------------------------------------------------------------------------------------------------------------------- ' {pop adr} 'MEM: pop adr %--_----_----_----_----_0--- ' {+index} 'INDEX: pop/scale/+ %--_----_----_----_--0-_-000 ' {read var word} 'PUSH: read word %--_----_----_-0--_----_---- ' {write var word} 'POP: write word %--_----_0---_----_----_---- ' '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ '{read var} WORD INDEX MEM 'PUSH: read & push %--_----_---0_----_--0-_0000 '{pop var} " " " 'POP: pop & write %--_----_--0-_----_--0-_0000 '{assign} " " " 'ASGN: %--_-00-_----_----_--0-_0000 ?????????? '{push address} " " " 'PUSH#: mask & push %-0_0---_----_----_--0-_0000 '------------------------------------------------------------------------------------------------------------- ' {read adr} 'OBJ: read adr %--_----_----_----_-0-0_---- ' {+index} 'INDEX: pop/scale/+ %--_----_----_----_--0-_-000 ' {read var word} 'PUSH: read word %--_----_----_-0--_----_---- ' {write var word} 'POP: write word %--_----_0---_----_----_---- ' '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ '{read var} WORD INDEX OBJ 'PUSH: read & push %--_----_---0_----_-000_-000 '{pop var} " " " 'POP: pop & write %--_----_--0-_----_-000_-000 '{assign} " " " 'ASGN: %--_-00-_----_----_-000_-000 ?????????? '{push address} " " " 'PUSH#: mask & push %-0_0---_----_----_-000_-000 '------------------------------------------------------------------------------------------------------------- ' {read adr} 'VAR: read adr %--_----_----_----_0--0_---- ' {+index} 'INDEX: pop/scale/+ %--_----_----_----_--0-_-000 ' {read var word} 'PUSH: read word %--_----_----_-0--_----_---- ' {write var word} 'POP: write word %--_----_0---_----_----_---- ' '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ '{read var} WORD INDEX VAR 'PUSH: read & push %--_----_---0_----_0-00_-000 '{pop var} " " " 'POP: pop & write %--_----_--0-_----_0-00_-000 '{assign} " " " 'ASGN: %--_-00-_----_----_0-00_-000 ?????????? '{push address} " " " 'PUSH#: mask & push %-0_0---_----_----_0-00_-000 '------------------------------------------------------------------------------------------------------------- ' {read adr} 'LOC: read adr %--_----_----_---0_---0_---- ' {+index} 'INDEX: pop/scale/+ %--_----_----_----_--0-_-000 ' {read var word} 'PUSH: read word %--_----_----_-0--_----_---- ' {write var word} 'POP: write word %--_----_0---_----_----_---- ' '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ '{read var} WORD INDEX LOC 'PUSH: read & push %--_----_---0_---0_--00_-000 '{pop var} " " " 'POP: pop & write %--_----_--0-_---0_--00_-000 '{assign} " " " 'ASGN: %--_-00-_----_---0_--00_-000 ?????????? '{push address} " " " 'PUSH#: mask & push %-0_0---_----_---0_--00_-000 '--------------------------------------------------------------------------------------------------------------------------- ' {pop adr} 'MEM: pop adr %--_----_----_----_----_0--- ' {no index} 'INDEX: pop/scale/+ %--_----_----_----_----_---- ' {read var long} 'PUSH: read long %--_----_----_0---_----_---- ' {write var long} 'POP: write long %--_---0_----_----_----_---- ' '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ '{read var} LONG NO-INDEX MEM 'PUSH: read & push %--_----_---0_0---_----_0--- '{pop var} " " " 'POP: pop & write %--_---0_--0-_----_----_0--- '{assign} " " " 'ASGN: %--_-00-_----_----_----_0--- ?????????? '{push address} " " " 'PUSH#: mask & push %-0_0---_----_----_----_0--- '------------------------------------------------------------------------------------------------------------- ' {read adr} 'OBJ: read adr %--_----_----_----_-0-0_---- ' {no index} 'INDEX: pop/scale/+ %--_----_----_----_----_---- ' {read var long} 'PUSH: read long %--_----_----_0---_----_---- ' {write var long} 'POP: write long %--_---0_----_----_----_---- ' '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ '{read var} LONG NO-INDEX OBJ 'PUSH: read & push %--_----_---0_0---_-0-0_---- '{pop var} " " " 'POP: pop & write %--_---0_--0-_----_-0-0_---- '{assign} " " " 'ASGN: %--_-00-_----_----_-0-0_---- ?????????? '{push address} " " " 'PUSH#: mask & push %-0_0---_----_----_-0-0_---- '------------------------------------------------------------------------------------------------------------- ' {read adr} 'VAR: read adr %--_----_----_----_0--0_---- ' {no index} 'INDEX: pop/scale/+ %--_----_----_----_----_---- ' {read var long} 'PUSH: read long %--_----_----_0---_----_---- ' {write var long} 'POP: write long %--_---0_----_----_----_---- ' '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ '{read var} LONG NO-INDEX VAR 'PUSH: read & push %--_----_---0_0---_0--0_---- '{pop var} " " " 'POP: pop & write %--_---0_--0-_----_0--0_---- '{assign} " " " 'ASGN: %--_-00-_----_----_0--0_---- ?????????? '{push address} " " " 'PUSH#: mask & push %-0_0---_----_----_0--0_---- '------------------------------------------------------------------------------------------------------------- ' {read adr} 'LOC: read adr %--_----_----_---0_---0_---- ' {no index} 'INDEX: pop/scale/+ %--_----_----_----_----_---- ' {read var long} 'PUSH: read long %--_----_----_0---_----_---- ' {write var long} 'POP: write long %--_---0_----_----_----_---- ' '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ '{read var} LONG NO-INDEX LOC 'PUSH: read & push %--_----_---0_0--0_---0_---- '{pop var} " " " 'POP: pop & write %--_---0_--0-_---0_---0_---- '{assign} " " " 'ASGN: %--_-00-_----_---0_---0_---- ?????????? '{push address} " " " 'PUSH#: mask & push %-0_0---_----_---0_---0_---- '--------------------------------------------------------------------------------------------------------------------------- ' {pop adr} 'MEM: pop adr %--_----_----_----_----_0--- ' {+index} 'INDEX: pop/scale/+ %--_----_----_----_--0-_-000 ' {read var long} 'PUSH: read long %--_----_----_0---_----_---- ' {write var long} 'POP: write long %--_---0_----_----_----_---- ' '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ '{read var} LONG INDEX MEM 'PUSH: read & push %--_----_---0_0---_--0-_0000 '{pop var} " " " 'POP: pop & write %--_---0_--0-_----_--0-_0000 '{assign} " " " 'ASGN: %--_-00-_----_----_--0-_0000 ?????????? '{push address} " " " 'PUSH#: mask & push %-0_0---_----_----_--0-_0000 '------------------------------------------------------------------------------------------------------------- ' {read adr} 'OBJ: read adr %--_----_----_----_-0-0_---- ' {+index} 'INDEX: pop/scale/+ %--_----_----_----_--0-_-000 ' {read var long} 'PUSH: read long %--_----_----_0---_----_---- ' {write var long} 'POP: write long %--_---0_----_----_----_---- ' '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ '{read var} LONG INDEX OBJ 'PUSH: read & push %--_----_---0_0---_-000_-000 '{pop var} " " " 'POP: pop & write %--_---0_--0-_----_-000_-000 '{assign} " " " 'ASGN: %--_-00-_----_----_-000_-000 ?????????? '{push address} " " " 'PUSH#: mask & push %-0_0---_----_----_-000_-000 '------------------------------------------------------------------------------------------------------------- ' {read adr} 'VAR: read adr %--_----_----_----_0--0_---- ' {+index} 'INDEX: pop/scale/+ %--_----_----_----_--0-_-000 ' {read var long} 'PUSH: read long %--_----_----_0---_----_---- ' {write var long} 'POP: write long %--_---0_----_----_----_---- ' '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ '{read var} LONG INDEX VAR 'PUSH: read & push %--_----_---0_0---_0-00_-000 '{pop var} " " " 'POP: pop & write %--_---0_--0-_----_0-00_-000 '{assign} " " " 'ASGN: %--_-00-_----_----_0-00_-000 ?????????? '{push address} " " " 'PUSH#: mask & push %-0_0---_----_----_0-00_-000 '------------------------------------------------------------------------------------------------------------- ' {read adr} 'LOC: read adr %--_----_----_---0_---0_---- ' {+index} 'INDEX: pop/scale/+ %--_----_----_----_--0-_-000 ' {read var long} 'PUSH: read long %--_----_----_0---_----_---- ' {write var long} 'POP: write long %--_---0_----_----_----_---- ' '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ '{read var} LONG INDEX LOC 'PUSH: read & push %--_----_---0_0--0_--00_-000 '{pop var} " " " 'POP: pop & write %--_---0_--0-_---0_--00_-000 '{assign} " " " 'ASGN: %--_-00-_----_---0_--00_-000 ?????????? '{push address} " " " 'PUSH#: mask & push %-0_0---_----_---0_--00_-000 '--------------------------------------------------------------------------------------------------------------------------- ' {+index} 'INDEX: pop/scale/+ %--_----_----_----_--0-_-000 ' {pop adr} 'MEM: pop adr %--_----_----_----_----_0--- ' {read adr} 'OBJ: read adr+pbase %--_----_----_----_-0-0_---- ' {read adr} 'VAR: read adr+vbase %--_----_----_----_0--0_---- ' {read adr} 'LOC: read adr+dbase %--_----_----_---0_---0_---- ' {read var byte} 'PUSH: read byte %--_----_---*_--0-_----_---- ' {write var byte} 'POP: write byte %--_----_-0--_----_----_---- ' {read var word} 'PUSH: read word %--_----_---*_-0--_----_---- ' {write var word} 'POP: write word %--_----_0---_----_----_---- ' {read var long} 'PUSH: read long %--_----_---*_0---_----_---- ' {write var long} 'POP: write long %--_---0_----_----_----_---- ' {assign} 'ASGN: %--_-00-_----_----_----_---- ?????????? memop {pop index} rdlong x,--ptrb '\ INDEX: pop %--_----_----_----_----_---0 { & scale} shl x,#1 '| & scale %--_----_----_----_----_--0- shl x,#2 '/ %--_----_----_----_----_-0-- {pop adr} rdlong adr,--ptrb 'MEM: pop adr %--_----_----_----_----_0--- {read adr} call #read_adr 'OBJ/VAR/LOC: read adr %--_----_----_----_---0_---- {+index} add adr,x 'INDEX: +index %--_----_----_----_--0-_---- {+base} add adr,pbase 'OBJ: +pbase %--_----_----_----_-0--_---- add adr,vbase 'VAR: +vbase %--_----_----_----_0---_---- add adr,dbase 'LOC: +dbase %--_----_----_---0_----_---- {read var} rdbyte x,adr '\ PUSH: read byte %--_----_----_--0-_----_---- rdword x,adr '| read word %--_----_----_-0--_----_---- rdlong x,adr '| read long %--_----_----_0---_----_---- {push var} wrlong x,ptrb++ '/ & push result %--_----_---0_----_----_---- {pop var} rdlong x,--ptrb '\ POP: pop value %--_----_--0-_----_----_---- {write var} wrbyte x,adr '| & write byte %--_----_-0--_----_----_---- wrword x,adr '| write word %--_----_0---_----_----_---- wrlong x,adr '/ write long %--_---0_----_----_----_---- ' {assign} nop '\ ASGN: %--_--0-_----_----_----_---- ?????????? jmp #assign_mem '/ %--_-0--_----_----_----_---- ?????????? {push address} and adr,maskword '\ PUSH#: mask %--_0---_----_----_----_---- wrlong adr,ptrb++ '/ & push adr %-0_----_----_----_----_---- jmp #loop '------------------------------------------------------------------------------- read_adr {read adr} rdbyte adr,ptra++ '\ OBJ/VAR/LOC: read adr test adr,#$80 wc '| b7=1=another byte and adr,#$7F '| if_nc RET '| rdbyte t2,ptra++ '| get 2nd byte shl adr,#8 '| & shift in _RET_ or adr,t2 '/ '------------------------------------------------------------------------------- '---------------------------------------------------------------------------------------------------------------------------- ' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ' % $E0..FF Math operation % ' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ' .---v---v---v---v---v---v---v---. '$E0-FF Math operation | 1 1 1 | o o o o o | (32 maths opcodes) ' `---^---^---^---^---^---^---^---' ' ' .---v---v---v---v---v---v---v---. ' Math Assignment (USING) | p 1 s | o o o o o | (32 maths opcodes) "op2" ' operation `---^---^---^---^---^---^---^---' ' | | ' | (!s) 0 = swap binary args ' | 1 = no swap ' (!p) 0 = push ' 1 = no push '------------------------------------------------------------------------------ '$F0=AND bool %00_0000_0000_0000_1000_0000 '$F2=OR bool %00_0000_0000_0000_0100_0000 math_F02 rdlong y,--ptrb 'popy bin %--_----_----_----_----_---0 rdlong x,--ptrb 'popx un+bin %--_----_----_----_----_--0- CMP x,#0 wz ' %--_----_----_----_----_-0-- MUXNZ x,masklong ' %--_----_----_----_----_0--- CMP y,#0 wz ' %--_----_----_----_---0_---- MUXNZ y,masklong ' %--_----_----_----_--0-_---- AND x,y ' %--_----_----_----_-0--_---- OR x,y ' %--_----_----_----_0---_---- jmp #pushr 'push result '------------------------------------------------------------------------------ math_E0 rdlong y,--ptrb 'popy bin %--_----_----_----_----_---0 rdlong x,--ptrb 'popx un+bin %--_----_----_----_----_--0- ROR x,y '$E0=ROR %00_1111_1111_1111_1111_1000 ROL x,y '$E1=ROL %00_1111_1111_1111_1111_0100 SHR x,y '$E2=SHR %00_1111_1111_1111_1110_1100 SHL x,y '$E3=SHL %00_1111_1111_1111_1101_1100 FGES x,y '$E4=FGES %00_1111_1111_1111_1011_1100 FLES x,y '$E5=FLES %00_1111_1111_1111_0111_1100 NEG x '$E6=NEG un %00_1111_1111_1110_1111_1101 NOT x '$E7=NOT un %00_1111_1111_1101_1111_1101 AND x,y '$E8=AND %00_1111_1111_1011_1111_1100 ABS x '$E9=ABS un %00_1111_1111_0111_1111_1101 OR x,y '$EA=OR %00_1111_1110_1111_1111_1100 XOR x,y '$EB=XOR %00_1111_1101_1111_1111_1100 ADD x,y '$EC=ADD %00_1111_1011_1111_1111_1100 SUB x,y '$ED=SUB %00_1111_0111_1111_1111_1100 SAR x,y '$EE=SAR %00_1110_1111_1111_1111_1100 REV x '$EF=REV (un) %00_1101_1111_1111_1111_1100 ENCOD x '$F1=ENCOD un %00_1011_1111_1111_1111_1101 DECOD x '$F3=DECOD un %00_0111_1111_1111_1111_1101 jmp #pushr 'push result '------------------------------------------------------------------------------ math_F4 rdlong y,--ptrb 'popy bin %--_----_----_----_----_---0 rdlong x,--ptrb 'popx un+bin %--_----_----_----_----_--0- QMUL x,y '$F4=MPY %00_0111_1111_1111_1111_0000 GETQX x ' ** QMUL x,y '$F5=MPY_MSW %00_0111_1111_1111_1100_1100 GETQY x ' ** QDIV x,y '$F6=DIV %00_0111_1111_1111_0011_1100 GETQX x ' ** QDIV x,y '$F7=MOD %00_0111_1111_1100_1111_1100 GETQY x ' ** QSQRT x,#0 '$F8=SQRT un %00_0111_1111_0011_1111_1101 GETQX x ' ** '$F9..$FE=test signed LT/GT/NE/EQ/LE/GE '$F9..$FE %00_0010_0000_1111_1111_1100 'LT/GT/NE/EQ/LE/GE CMPS x,y wcz ' * 'tests if_z MOV x,#%100 ' * 'equal? if_nz MOV x,#%010 ' * 'above? if_c MOV x,#%001 ' * 'below? ANDN x,a wz ' * 'set t/f CMP y,#0 wz '$FF=NOT bool un %00_0001_1111_1111_1111_1100 '!t/f {pushtf} MUXZ x,masklong ' * 'Z=true(-1)/false(0) jmp #pushr 'push result '---------------------------------------------------------------------------------------------------------------------------- .gaps long $0[$1D0 - $] 'fill the gaps '<<<<<<<<<< fit $1D0 '<<<<<<<<<< long $3d3d3d3d 'saved PAR at start '<<<<<<<<<< tmp long $3d3d3d3d '<<<<<<<<<< ' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ' % Constants % ' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% masksqrt long $40000000 'mask constant (rotated until back by sqrt) maskword long $0000FFFF 'mask constant maskpar long $0000FFFC 'mask constant '------------------------------------------------------------------------------------------------------------ ''''.gaps long $0[$1E5 - $] 'fill the gaps '<<<<<<<<<< '''' fit $1E5 '<<<<<<<<<< '------------------------------------------------------------------------------------------------------------ masklong long $FFFFFFFF '(temporarily used by runner code) masktop long $80000000 '(temporarily used by runner code) maskwr long $00800000 '(temporarily used by runner code) '''' fit $1E8 ' <=== required '<<<<<<<<<< '------------------------------------------------------------------------------------------------------------ ' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ' % Variables % ' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% lsb res 1 id res 1 dcall res 1 pbase res 1 vbase res 1 dbase res 1 pcurr res 1 ' use ptra dcurr res 1 ' use ptrb '''' fit $1F0 '<<<<<<<<<< '------------------------------------------------------------------------------------------------------------ fit $1E0 '<<<<<<<<<< '============================================================================================================ DAT orgh HUB_vectors ' vector table begins (256 longs) ' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ' % Spin Bytecode - Vector Table % ' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '$00-3F Special purpose opcodes '$40-7F Fast access VAR and LOC '$80-DF Access MEM, OBJ, VAR and LOC '$E0-FF Unary and Binary operators (maths) vector_table '---------------------------------------------------------------------------------------------------------------------------- ' .---v---v---v---v---v---v---v---. '$00-3F Special purpose opcodes | 0 | 0 | o o o o o o | ' `---^---^---^---^---^---^---^---' ' op set byte description pops push extra bytes '---------------------------------------------------------------------------------------------------------------------------- long $0 <<10 +j0 '$00 0 000000tp drop anchor (t=try, !p=push) long $0 <<10 +j0 '$01 000000tp drop anchor (t=try, !p=push) long $0 <<10 +j0 '$02 000000tp drop anchor (t=try, !p=push) long $0 <<10 +j0 '$03 000000tp drop anchor (t=try, !p=push) long $0 <<10 +j1_0 '$04 1 00000100 jmp +1..2 address long %00_0000_0001_1110_0000_1010 <<10 +j1_123 '$05 00000101 call sub +1 sub long %00_0000_0000_0000_0000_1010 <<10 +j1_123 '$06 00000110 call obj.sub +2 obj+sub long %00_0000_0000_0000_0000_0000 <<10 +j1_123 '$07 00000111 call obj[].sub 1 +2 obj+sub long $0 <<10 +j2 '$08 2 00001000 tjz 1 0/1 +1..2 address long $0 <<10 +j2 '$09 00001001 djnz 1 0/1 +1..2 address long $0 <<10 +j2 '$0A 00001010 jz 1 +1..2 address long $0 <<10 +j2 '$0B 00001011 jnz 1 +1..2 address long %00_0000_0000_0000_0000_0001 <<10 +j34 '$0C 3 00001100 casedone 2 +1..2 address long %00_0000_0000_0000_0000_1001 <<10 +j34 '$0D 00001101 value case 1 +1..2 address long %00_0000_0000_0000_0001_1000 <<10 +j34 '$0E 00001110 range case 2 +1..2 address long $0 <<10 +j3_3 '$0F 00001111 lookdone 3 1 long %00_0000_0000_0000_0110_1001 <<10 +j34 '$10 4 00010000 value lookup 1 long %00_0000_0000_0000_0110_1001 <<10 +j34 '$11 00010001 value lookdown 1 long %00_0000_0000_0000_0111_1000 <<10 +j34 '$12 00010010 range lookup 2 long %00_0000_0000_0000_0111_1000 <<10 +j34 '$13 00010011 range lookdown 2 long %00_0000_0000_0000_0000_1100 <<10 +j5_01 '$14 5 00010100 pop 1+ ???1+ long %00_0000_0000_0000_0000_0011 <<10 +j5_01 '$15 00010101 run long $0 <<10 +j5_2 '$16 00010110 STRSIZE(string) 1 1 long $0 <<10 +j5_3 '$17 00010111 STRCOMP(stringa,stringb) 2 1 long %00_0000_0000_0000_0111_0000 <<10 +j6_012 '$18 6 00011000 BYTEFILL(start,value,count) 3 long %00_0000_0000_0000_0111_0000 <<10 +j6_012 '$19 00011001 WORDFILL(start,value,count) 3 long %00_0000_0000_0000_0111_0000 <<10 +j6_012 '$1A 00011010 LONGFILL(start,value,count) 3 long $0 <<10 +j6_3 '$1B 00011011 WAITPEQ(data,mask,port) 3 long %00_0000_0010_0100_0000_0000 <<10 +j7_012 '$1C 7 00011100 BYTEMOVE(to,from,count) 3 long %00_0000_0010_0100_0000_0000 <<10 +j7_012 '$1D 00011101 WORDMOVE(to,from,count) 3 long %00_0000_0010_0100_0000_0000 <<10 +j7_012 '$1E 00011110 LONGMOVE(to,from,count) 3 long $0 <<10 +j7_3 '$1F 00011111 WAITPNE(data,mask,port) 3 long %00_0000_0000_0001_1110_0000 <<10 +j8 '$20 8 00100000 CLKSET(mode,freq) 2 long %00_0000_0000_0001_1101_1101 <<10 +j8 '$21 00100001 COGSTOP(id) 1 long %00_0000_0000_0001_1011_1101 <<10 +j8 '$22 00100010 LOCKRET(id) 1 long %00_0000_0000_0000_0111_1101 <<10 +j8 '$23 00100011 WAITCNT(count) 1 long %00_0000_0000_1111_0100_0111 <<10 +j9_012 '$24 9 001001oo SPR[nibble] op push 1 +1 if assign long %00_0000_0000_1111_0100_0111 <<10 +j9_012 '$25 001001oo SPR[nibble] op pop 1 +1 if assign long %00_0000_0000_1111_0100_0111 <<10 +j9_012 '$26 001001oo SPR[nibble] op using 1 +1 if assign long $0 <<10 +j9_3 '$27 00100111 WAITVID(colors,pixels) 2 long %00_0000_0000_0011_1111_1000 <<10 +jAB '$28 A 00101p00 COGINIT(id,adr,ptr) 3 1 (!p=push) long %00_0000_0000_0000_1110_0111 <<10 +jAB '$29 00101p01 LOCKNEW 1 (!p=push) long %00_0000_0000_0000_0101_1011 <<10 +jAB '$2A 00101p10 LOCKSET(id) 1 1 (!p=push) long %00_0000_0000_0000_0011_1011 <<10 +jAB '$2B 00101p11 LOCKCLR(id) 1 1 (!p=push) long %00_0000_0000_0011_1111_1000 <<10 +jAB '$2C B 00101p00 COGINIT(id,adr,ptr) 3 0 (no push) long %00_0000_0000_0000_1110_0111 <<10 +jAB '$2D 00101p01 LOCKNEW 0 (no push) long %00_0000_0000_0000_0101_1011 <<10 +jAB '$2E 00101p10 LOCKSET(id) 1 0 (no push) long %00_0000_0000_0000_0011_1011 <<10 +jAB '$2F 00101p11 LOCKCLR(id) 1 0 (no push) long %00_0000_0000_0000_0000_0001 <<10 +jC '$30 C 00110000 ABORT long %00_0000_0000_0000_0000_0010 <<10 +jC '$31 00110001 ABORT value 1 long %00_0000_0000_0000_0000_0001 <<10 +jC '$32 00110010 RETURN long %00_0000_0000_0000_0000_0010 <<10 +jC '$33 00110011 RETURN value 1 long $0 <<10 +jD_012 '$34 D 001101cc PUSH #-1 1 long $0 <<10 +jD_012 '$35 001101cc PUSH #0 1 long $0 <<10 +jD_012 '$36 001101cc PUSH #1 1 long %00_0000_0000_0001_1000_0000 <<10 +jD_3 '$37 00110111 PUSH #kp 1 +1 maskdata long $0 <<10 +jE '$38 E 001110bb PUSH #k1 (1 byte) 1 +1 constant long $0 <<10 +jE '$39 001110bb PUSH #k2 (2 bytes) 1 +2 constant long $0 <<10 +jE '$3A 001110bb PUSH #k3 (3 bytes) 1 +3 constant long $0 <<10 +jE '$3B 001110bb PUSH #k4 (4 bytes) 1 +4 constant long $0 <<10 +jF_0 '$3C F 00111100 long %00_0000_0000_0000_1001_1001 <<10 +jF_123 '$3D 00111101 register[bit] op 1 +1 reg+op, +1 if assign long %00_0000_0000_0000_1001_1100 <<10 +jF_123 '$3E 00111110 register[bit..bit] op 2 +1 reg+op, +1 if assign long %00_0000_0000_1000_1100_0111 <<10 +jF_123 '$3F 00111111 register op +1 reg+op, +1 if assign 'from Hippy '3F 80+n PUSH spr '3F A0+n POP spr '3F C0+n USING spr '---------------------------------------------------------------------------------------------------------------------------- ' .---v---v---v---v---v---v---v---. These opcodes allow fast access by making long access '$40-7F Fast access VAR, LOC | 0 1 | w | v v v | o o | to the first few long entries in the variable space ' `---^---^---^---^---^---^---^---' or stack a single byte opcode. The single byte opcodes ' | | | are effectively expanded within the interpreter... ' 0= VAR Address 00= PUSH Read - push result in stack ' 1= LOC (adr = v*4) 01= POP Write - pop value from stack ' | | 10= USING 2nd opcode (assignment) executed, result in target ' | | 11= PUSH # Push address of destination into stack ' | `---------|------------------------. ' `-----------. | | ' \|/ \|/ \|/ ' .---v---v---v---v---v---v---v---. .---v---v---v---v---v---v---v---. ' | 1 | 1 0 | 0 | 1 w | o o | | 0 0 0 | v v v | 0 0 | ' `---^---^---^---^---^---^---^---' `---^---^---^---^---^---^---^---' '---------------------------------------------------------------------------------------------------------------------------- long %00_0000_0000_1111_1100_1000 <<10 +varop '$40 VAR PUSH addr=0*4= 00 long %00_0000_0000_1111_0011_1000 <<10 +varop '$41 VAR POP addr=0*4= 00 long %00_0000_0000_0000_1111_1000 <<10 +varop '$42 VAR USING addr=0*4= 00 long %00_0000_0000_0011_1111_1000 <<10 +varop '$43 VAR PUSH # addr=0*4= 00 long %00_0000_0000_1111_1100_1000 <<10 +varop '$44 VAR PUSH addr=1*4= 04 long %00_0000_0000_1111_0011_1000 <<10 +varop '$45 VAR POP addr=1*4= 04 long %00_0000_0000_0000_1111_1000 <<10 +varop '$46 VAR USING addr=1*4= 04 long %00_0000_0000_0011_1111_1000 <<10 +varop '$47 VAR PUSH # addr=1*4= 04 long %00_0000_0000_1111_1100_1000 <<10 +varop '$48 VAR PUSH addr=2*4= 08 long %00_0000_0000_1111_0011_1000 <<10 +varop '$49 VAR POP addr=2*4= 08 long %00_0000_0000_0000_1111_1000 <<10 +varop '$4A VAR USING addr=2*4= 08 long %00_0000_0000_0011_1111_1000 <<10 +varop '$4B VAR PUSH # addr=2*4= 08 long %00_0000_0000_1111_1100_1000 <<10 +varop '$4C VAR PUSH addr=3*4= 0C long %00_0000_0000_1111_0011_1000 <<10 +varop '$4D VAR POP addr=3*4= 0C long %00_0000_0000_0000_1111_1000 <<10 +varop '$4E VAR USING addr=3*4= 0C long %00_0000_0000_0011_1111_1000 <<10 +varop '$4F VAR PUSH # addr=3*4= 0C long %00_0000_0000_1111_1100_1000 <<10 +varop '$50 VAR PUSH addr=4*4= 10 long %00_0000_0000_1111_0011_1000 <<10 +varop '$51 VAR POP addr=4*4= 10 long %00_0000_0000_0000_1111_1000 <<10 +varop '$52 VAR USING addr=4*4= 10 long %00_0000_0000_0011_1111_1000 <<10 +varop '$53 VAR PUSH # addr=4*4= 10 long %00_0000_0000_1111_1100_1000 <<10 +varop '$54 VAR PUSH addr=5*4= 14 long %00_0000_0000_1111_0011_1000 <<10 +varop '$55 VAR POP addr=5*4= 14 long %00_0000_0000_0000_1111_1000 <<10 +varop '$56 VAR USING addr=5*4= 14 long %00_0000_0000_0011_1111_1000 <<10 +varop '$57 VAR PUSH # addr=5*4= 14 long %00_0000_0000_1111_1100_1000 <<10 +varop '$58 VAR PUSH addr=6*4= 18 long %00_0000_0000_1111_0011_1000 <<10 +varop '$59 VAR POP addr=6*4= 18 long %00_0000_0000_0000_1111_1000 <<10 +varop '$5A VAR USING addr=6*4= 18 long %00_0000_0000_0011_1111_1000 <<10 +varop '$5B VAR PUSH # addr=6*4= 18 long %00_0000_0000_1111_1100_1000 <<10 +varop '$5C VAR PUSH addr=7*4= 1C long %00_0000_0000_1111_0011_1000 <<10 +varop '$5D VAR POP addr=7*4= 1C long %00_0000_0000_0000_1111_1000 <<10 +varop '$5E VAR USING addr=7*4= 1C long %00_0000_0000_0011_1111_1000 <<10 +varop '$5F VAR PUSH # addr=7*4= 1C long %00_0000_0000_1111_1100_0100 <<10 +varop '$60 LOC PUSH addr=0*4= 00 long %00_0000_0000_1111_0011_0100 <<10 +varop '$61 LOC POP addr=0*4= 00 long %00_0000_0000_0000_1111_0100 <<10 +varop '$62 LOC USING addr=0*4= 00 long %00_0000_0000_0011_1111_0100 <<10 +varop '$63 LOC PUSH # addr=0*4= 00 long %00_0000_0000_1111_1100_0100 <<10 +varop '$64 LOC PUSH addr=1*4= 04 long %00_0000_0000_1111_0011_0100 <<10 +varop '$65 LOC POP addr=1*4= 04 long %00_0000_0000_0000_1111_0100 <<10 +varop '$66 LOC USING addr=1*4= 04 long %00_0000_0000_0011_1111_0100 <<10 +varop '$67 LOC PUSH # addr=1*4= 04 long %00_0000_0000_1111_1100_0100 <<10 +varop '$68 LOC PUSH addr=2*4= 08 long %00_0000_0000_1111_0011_0100 <<10 +varop '$69 LOC POP addr=2*4= 08 long %00_0000_0000_0000_1111_0100 <<10 +varop '$6A LOC USING addr=2*4= 08 long %00_0000_0000_0011_1111_0100 <<10 +varop '$6B LOC PUSH # addr=2*4= 08 long %00_0000_0000_1111_1100_0100 <<10 +varop '$6C LOC PUSH addr=3*4= 0C long %00_0000_0000_1111_0011_0100 <<10 +varop '$6D LOC POP addr=3*4= 0C long %00_0000_0000_0000_1111_0100 <<10 +varop '$6E LOC USING addr=3*4= 0C long %00_0000_0000_0011_1111_0100 <<10 +varop '$6F LOC PUSH # addr=3*4= 0C long %00_0000_0000_1111_1100_0100 <<10 +varop '$70 LOC PUSH addr=4*4= 10 long %00_0000_0000_1111_0011_0100 <<10 +varop '$71 LOC POP addr=4*4= 10 long %00_0000_0000_0000_1111_0100 <<10 +varop '$72 LOC USING addr=4*4= 10 long %00_0000_0000_0011_1111_0100 <<10 +varop '$73 LOC PUSH # addr=4*4= 10 long %00_0000_0000_1111_1100_0100 <<10 +varop '$74 LOC PUSH addr=5*4= 14 long %00_0000_0000_1111_0011_0100 <<10 +varop '$75 LOC POP addr=5*4= 14 long %00_0000_0000_0000_1111_0100 <<10 +varop '$76 LOC USING addr=5*4= 14 long %00_0000_0000_0011_1111_0100 <<10 +varop '$77 LOC PUSH # addr=5*4= 14 long %00_0000_0000_1111_1100_0100 <<10 +varop '$78 LOC PUSH addr=6*4= 18 long %00_0000_0000_1111_0011_0100 <<10 +varop '$79 LOC POP addr=6*4= 18 long %00_0000_0000_0000_1111_0100 <<10 +varop '$7A LOC USING addr=6*4= 18 long %00_0000_0000_0011_1111_0100 <<10 +varop '$7B LOC PUSH # addr=6*4= 18 long %00_0000_0000_1111_1100_0100 <<10 +varop '$7C LOC PUSH addr=7*4= 1C long %00_0000_0000_1111_0011_0100 <<10 +varop '$7D LOC POP addr=7*4= 1C long %00_0000_0000_0000_1111_0100 <<10 +varop '$7E LOC USING addr=7*4= 1C long %00_0000_0000_0011_1111_0100 <<10 +varop '$7F LOC PUSH # addr=7*4= 1C '---------------------------------------------------------------------------------------------------------------------------- ' .---v---v---v---v---v---v---v---. '$80-DF Access MEM, OBJ, | 1 | s s | i | w w | o o | (96 stack load / save opcodes) ' VAR and LOC `---^---^---^---^---^---^---^---' ' | | | | ' 00= Byte | | 00= PUSH Read - push result in stack ' 01= Word | | 01= POP Write - pop value from stack ' 10= Long | | 10= USING 2nd opcode (assignment) executed, result in target ' (11= mathop) | | 11= PUSH # Push address of destination into stack ' | 00= MEM base popped from stack, if i=1 add offset ' | 01= OBJ base is object base , if i=1 add offset ' | 10= VAR base is variable base , if i=1 add offset ' | 11= LOC base is stack base , if i=1 add offset ' 0= no offset ' 1=[]= add offset (indexed) '---------------------------------------------------------------------------------------------------------------------------- long %01_1111_1110_1101_1111_0111 <<10 +memop '$80 Byte MEM PUSH long %01_1111_1001_1111_1111_0111 <<10 +memop '$81 Byte MEM POP long %01_1001_1111_1111_1111_0111 <<10 +memop '$82 Byte MEM USING ?????????? long %00_0111_1111_1111_1111_0111 <<10 +memop '$83 Byte MEM PUSH # long %01_1111_1110_1101_1010_1111 <<10 +memop '$84 Byte OBJ PUSH long %01_1111_1001_1111_1010_1111 <<10 +memop '$85 Byte OBJ POP long %01_1001_1111_1111_1010_1111 <<10 +memop '$86 Byte OBJ USING ?????????? long %00_0111_1111_1111_1010_1111 <<10 +memop '$87 Byte OBJ PUSH # long %01_1111_1110_1101_0110_1111 <<10 +memop '$88 Byte VAR PUSH long %01_1111_1001_1111_0110_1111 <<10 +memop '$89 Byte VAR POP long %01_1001_1111_1111_0110_1111 <<10 +memop '$8A Byte VAR USING ?????????? long %00_0111_1111_1111_0110_1111 <<10 +memop '$8B Byte VAR PUSH # long %01_1111_1110_1100_1110_1111 <<10 +memop '$8C Byte LOC PUSH long %01_1111_1001_1110_1110_1111 <<10 +memop '$8D Byte LOC POP long %01_1001_1111_1110_1110_1111 <<10 +memop '$8E Byte LOC USING ?????????? long %00_0111_1111_1110_1110_1111 <<10 +memop '$8F Byte LOC PUSH # long %01_1111_1110_1101_1101_0000 <<10 +memop '$90 Byte [] MEM PUSH long %01_1111_1001_1111_1101_0000 <<10 +memop '$91 Byte [] MEM POP long %01_1001_1111_1111_1101_0000 <<10 +memop '$92 Byte [] MEM USING ?????????? long %00_0111_1111_1111_1101_0000 <<10 +memop '$93 Byte [] MEM PUSH # long %01_1111_1110_1101_1000_1000 <<10 +memop '$94 Byte [] OBJ PUSH long %01_1111_1001_1111_1000_1000 <<10 +memop '$95 Byte [] OBJ POP long %01_1001_1111_1111_1000_1000 <<10 +memop '$96 Byte [] OBJ USING ?????????? long %00_0111_1111_1111_1000_1000 <<10 +memop '$97 Byte [] OBJ PUSH # long %01_1111_1110_1101_0100_1000 <<10 +memop '$98 Byte [] VAR PUSH long %01_1111_1001_1111_0100_1000 <<10 +memop '$99 Byte [] VAR POP long %01_1001_1111_1111_0100_1000 <<10 +memop '$9A Byte [] VAR USING ?????????? long %00_0111_1111_1111_0100_1000 <<10 +memop '$9B Byte [] VAR PUSH # long %01_1111_1110_1100_1100_1000 <<10 +memop '$9C Byte [] LOC PUSH long %01_1111_1001_1110_1100_1000 <<10 +memop '$9D Byte [] LOC POP long %01_1001_1111_1110_1100_1000 <<10 +memop '$9E Byte [] LOC USING ?????????? long %00_0111_1111_1110_1100_1000 <<10 +memop '$9F Byte [] LOC PUSH # long %01_1111_1110_1011_1111_0111 <<10 +memop '$A0 Word MEM PUSH long %01_1111_0101_1111_1111_0111 <<10 +memop '$A1 Word MEM POP long %01_1001_1111_1111_1111_0111 <<10 +memop '$A2 Word MEM USING ?????????? long %00_0111_1111_1111_1111_0111 <<10 +memop '$A3 Word MEM PUSH # long %01_1111_1110_1011_1010_1111 <<10 +memop '$A4 Word OBJ PUSH long %01_1111_0101_1111_1010_1111 <<10 +memop '$A5 Word OBJ POP long %01_1001_1111_1111_1010_1111 <<10 +memop '$A6 Word OBJ USING ?????????? long %00_0111_1111_1111_1010_1111 <<10 +memop '$A7 Word OBJ PUSH # long %01_1111_1110_1011_0110_1111 <<10 +memop '$A8 Word VAR PUSH long %01_1111_0101_1111_0110_1111 <<10 +memop '$A9 Word VAR POP long %01_1001_1111_1111_0110_1111 <<10 +memop '$AA Word VAR USING ?????????? long %00_0111_1111_1111_0110_1111 <<10 +memop '$AB Word VAR PUSH # long %01_1111_1110_1010_1110_1111 <<10 +memop '$AC Word LOC PUSH long %01_1111_0101_1110_1110_1111 <<10 +memop '$AD Word LOC POP long %01_1001_1111_1110_1110_1111 <<10 +memop '$AE Word LOC USING ?????????? long %00_0111_1111_1110_1110_1111 <<10 +memop '$AF Word LOC PUSH # long %01_1111_1110_1111_1101_0000 <<10 +memop '$B0 Word [] MEM PUSH long %01_1111_1101_1111_1101_0000 <<10 +memop '$B1 Word [] MEM POP long %01_1001_1111_1111_1101_0000 <<10 +memop '$B2 Word [] MEM USING ?????????? long %00_0111_1111_1111_1101_0000 <<10 +memop '$B3 Word [] MEM PUSH # long %01_1111_1110_1111_1000_1000 <<10 +memop '$B4 Word [] OBJ PUSH long %01_1111_1101_1111_1000_1000 <<10 +memop '$B5 Word [] OBJ POP long %01_1001_1111_1111_1000_1000 <<10 +memop '$B6 Word [] OBJ USING ?????????? long %00_0111_1111_1111_1000_1000 <<10 +memop '$B7 Word [] OBJ PUSH # long %01_1111_1110_1111_0100_1000 <<10 +memop '$B8 Word [] VAR PUSH long %01_1111_1101_1111_0100_1000 <<10 +memop '$B9 Word [] VAR POP long %01_1001_1111_1111_0100_1000 <<10 +memop '$BA Word [] VAR USING ?????????? long %00_0111_1111_1111_0100_1000 <<10 +memop '$BB Word [] VAR PUSH # long %01_1111_1110_1110_1100_1000 <<10 +memop '$BC Word [] LOC PUSH long %01_1111_1101_1110_1100_1000 <<10 +memop '$BD Word [] LOC POP long %01_1001_1111_1110_1100_1000 <<10 +memop '$BE Word [] LOC USING ?????????? long %00_0111_1111_1110_1100_1000 <<10 +memop '$BF Word [] LOC PUSH # long %01_1111_1110_0111_1111_0111 <<10 +memop '$C0 Long MEM PUSH long %01_1110_1101_1111_1111_0111 <<10 +memop '$C1 Long MEM POP long %01_1001_1111_1111_1111_0111 <<10 +memop '$C2 Long MEM USING ?????????? long %00_0111_1111_1111_1111_0111 <<10 +memop '$C3 Long MEM PUSH # long %01_1111_1110_0111_1010_1111 <<10 +memop '$C4 Long OBJ PUSH long %01_1110_1101_1111_1010_1111 <<10 +memop '$C5 Long OBJ POP long %01_1001_1111_1111_1010_1111 <<10 +memop '$C6 Long OBJ USING ?????????? long %00_0111_1111_1111_1010_1111 <<10 +memop '$C7 Long OBJ PUSH # long %01_1111_1110_0111_0110_1111 <<10 +memop '$C8 Long VAR PUSH \ see also $40-7F bytecodes long %01_1110_1101_1111_0110_1111 <<10 +memop '$C9 Long VAR POP | long %01_1001_1111_1111_0110_1111 <<10 +memop '$CA Long VAR USING | ?????????? long %00_0111_1111_1111_0110_1111 <<10 +memop '$CB Long VAR PUSH # | long %01_1111_1110_0110_1110_1111 <<10 +memop '$CC Long LOC PUSH | long %01_1110_1101_1110_1110_1111 <<10 +memop '$CD Long LOC POP | long %01_1001_1111_1110_1110_1111 <<10 +memop '$CE Long LOC USING | ?????????? long %00_0111_1111_1110_1110_1111 <<10 +memop '$CF Long LOC PUSH # / long %01_1111_1110_0111_1101_0000 <<10 +memop '$D0 Long [] MEM PUSH long %01_1110_1101_1111_1101_0000 <<10 +memop '$D1 Long [] MEM POP long %01_1001_1111_1111_1101_0000 <<10 +memop '$D2 Long [] MEM USING ?????????? long %00_0111_1111_1111_1101_0000 <<10 +memop '$D3 Long [] MEM PUSH # long %01_1111_1110_0111_1000_1000 <<10 +memop '$D4 Long [] OBJ PUSH long %01_1110_1101_1111_1000_1000 <<10 +memop '$D5 Long [] OBJ POP long %01_1001_1111_1111_1000_1000 <<10 +memop '$D6 Long [] OBJ USING ?????????? long %00_0111_1111_1111_1000_1000 <<10 +memop '$D7 Long [] OBJ PUSH # long %01_1111_1110_0111_0100_1000 <<10 +memop '$D8 Long [] VAR PUSH long %01_1110_1101_1111_0100_1000 <<10 +memop '$D9 Long [] VAR POP long %01_1001_1111_1111_0100_1000 <<10 +memop '$DA Long [] VAR USING ?????????? long %00_0111_1111_1111_0100_1000 <<10 +memop '$DB Long [] VAR PUSH # long %01_1111_1110_0110_1100_1000 <<10 +memop '$DC Long [] LOC PUSH long %01_1110_1101_1110_1100_1000 <<10 +memop '$DD Long [] LOC POP long %01_1001_1111_1110_1100_1000 <<10 +memop '$DE Long [] LOC USING ?????????? long %00_0111_1111_1110_1100_1000 <<10 +memop '$DF Long [] LOC PUSH # '---------------------------------------------------------------------------------------------------------------------------- ' .---v---v---v---v---v---v---v---. '$E0-FF Math operation | 1 1 1 | o o o o o | (32 maths opcodes) ' `---^---^---^---^---^---^---^---' ' ' .---v---v---v---v---v---v---v---. ' Math Assignment (USING) | p 1 s | o o o o o | (32 maths opcodes) "op2" ' operation `---^---^---^---^---^---^---^---' ' | | ' | (!s) 0 = swap binary args ' | 1 = no swap ' (!p) 0 = push ' 1 = no push ' unary/ ' binary normal assign description '---------------------------------------------------------------------------------------------------------------------------- long %00_1111_1111_1111_1111_1000 <<10 +math_E0 '$E0 ROR 1st -> 2nd b -> ->= rotate right long %00_1111_1111_1111_1111_0100 <<10 +math_E0 '$E1 ROL 1st <- 2nd b <- <-= rotate left long %00_1111_1111_1111_1110_1100 <<10 +math_E0 '$E2 SHR 1st >> 2nd b >> >>= shift right long %00_1111_1111_1111_1101_1100 <<10 +math_E0 '$E3 SHL 1st << 2nd b << <<= shift left long %00_1111_1111_1111_1011_1100 <<10 +math_E0 '$E4 FGES 1st #> 2nd b #> #>= limit minimum (signed) long %00_1111_1111_1111_0111_1100 <<10 +math_E0 '$E5 FLES 1st <# 2nd b <# <#= limit maximum (signed) long %00_1111_1111_1110_1111_1101 <<10 +math_E0 '$E6 NEG - 1st unary - - negate long %00_1111_1111_1101_1111_1101 <<10 +math_E0 '$E7 NOT ! 1st unary ! ! bitwise not long %00_1111_1111_1011_1111_1100 <<10 +math_E0 '$E8 AND 1st & 2nd b & &= bitwise and long %00_1111_1111_0111_1111_1101 <<10 +math_E0 '$E9 ABS ABS( 1st ) unary || || absolute long %00_1111_1110_1111_1111_1100 <<10 +math_E0 '$EA OR 1st | 2nd b | |= bitwise or long %00_1111_1101_1111_1111_1100 <<10 +math_E0 '$EB XOR 1st ^ 2nd b ^ ^= bitwise xor long %00_1111_1011_1111_1111_1100 <<10 +math_E0 '$EC ADD 1st + 2nd b + += add long %00_1111_0111_1111_1111_1100 <<10 +math_E0 '$ED SUB 1st - 2nd b - -= subtract long %00_1110_1111_1111_1111_1100 <<10 +math_E0 '$EE SAR 1st ~> 2nd b ~> ~>= shift arithmetic right long %00_1101_1111_1111_1111_1100 <<10 +math_E0 '$EF REV 1st >< 2nd b (un) >< ><= reverse bits (neg y first) long %00_0000_0000_0000_1000_0000 <<10 +math_F02 '$F0 AND bool 1st AND 2nd b AND boolean and long %00_1011_1111_1111_1111_1101 <<10 +math_E0 '$F1 ENCOD >| 1st unary >| >| encode (0-32) long %00_0000_0000_0000_0100_0000 <<10 +math_F02 '$F2 OR bool 1st OR 2nd b OR boolean or long %00_0111_1111_1111_1111_1101 <<10 +math_E0 '$F3 DECOD |< 1st unary |< |< decode long %00_0010_0000_1111_1111_1100 <<10 +math_F4 '$F4 MPY 1st * 2nd b * *= multiply, return lower half (signed) long %00_0010_0000_1111_1111_1100 <<10 +math_F4 '$F5 MPY_MSW 1st ** 2nd b ** **= multiply, return upper half (signed) long %00_0010_0000_1111_1111_1100 <<10 +math_F4 '$F6 DIV 1st / 2nd b / /= divide, return quotient (signed) long %00_0010_0000_1111_1111_1100 <<10 +math_F4 '$F7 MOD 1st // 2nd b // //= divide, return remainder (signed) long %00_0010_0000_1111_1111_1100 <<10 +math_F4 '$F8 SQRT ^^ 1st unary ^^ ^^ square root long %00_0010_0000_1111_1111_1100 <<10 +math_F4 '$F9 LT 1st < 2nd b < test below (signed) long %00_0001_1111_1111_1111_1100 <<10 +math_F4 '$FA GT 1st > 2nd b > test above (signed) long %00_0000_1000_0011_1111_1111 <<10 +math_F4 '$FB NE 1st <> 2nd b <> test not equal long %00_0000_1000_0011_1111_1111 <<10 +math_F4 '$FC EQ 1st == 2nd b == test equal long %00_0000_1000_0011_1111_1111 <<10 +math_F4 '$FD LE 1st =< 2nd b =< test below or equal (signed) long %00_0000_1000_0011_1111_1111 <<10 +math_F4 '$FE GE 1st => 2nd b => test above or equal (signed) long %00_0000_0111_1111_1111_1111 <<10 +math_F4 '$FF NOT bool NOT 1st unary NOT NOT boolean not '---------------------------------------------------------------------------------------------------------------------------- '---------------------------------------------------------------------------------------------------------------------------- ' .---v---v---v---v---v---v---v---. ' Assignment (USING) | p 0 | x x x x x | - | "op2" ' `---^---^---^---^---^---^---^---' ' p 0 0 0 0 0 0 - write ' p 0 0 0 0 s 1 - repeat-var loop, s = pop step +1..2 address ' p 0 0 0 1 0 - - ?var rnd forward long ' p 0 0 0 1 1 - - var? rnd reverse long ' p 0 0 1 0 0 - - ~var sign extend byte ' p 0 0 1 0 1 - - ~~var sign extend word ' p 0 0 1 1 0 - - var~ post-clear ' p 0 0 1 1 1 - - var~~ post-set ' p 0 1 0 0 s s - ++var pre-inc ss=00=mask size bit/adr??? ' p 0 1 0 1 s s - var++ post-inc 01=mask size byte ' p 0 1 1 0 s s - --var pre-dec 10=mask size word ' p 0 1 1 1 s s - var-- post-dec 11=mask size long ' `---^---^---^---^---^---^---^---' ' | ' (p) 0 = no push ' 1 = push back on stack (keep) '---------------------------------------------------------------------------------------------------------------------------- ' write p000000- %--_----_-100_1111_1111_1110 ' +1:2 adr s=pops repeat p0000s1- (see below) ' rnd fwd ?var p00010-- %--_----_- ' rnd rev var? p00011-- %--_----_-100_1111_1111_1001 ' signx byte ~var p00100-- %--_----_- ' signx word ~~var p00101-- %--_----_- ' post-clear var~ p00110-- %--_----_- ' post-set var~~ p00111-- %--_----_- ' 00=bit/adr ++var p0100ss- %--_----_- ' 01=byte var++ p0101ss- %--_----_-100_***1_0111_1111 ' 10=word --var p0110ss- %--_----_- ' 11=long var-- p0111ss- %--_----_- assign_table ' <----> long %00_0000_0111_1111_1111_1110 <<10 +assignx '$00 p000_000- write long %00_0000_0000_0000_0000_0100 <<10 +repeatx '$01 p000_0s1- repeat-var loop, s = pop step +1..2 address long $0 <<10 +jxxx '$02 10 *invalid* long %00_0000_0000_0000_0000_1000 <<10 +repeatx '$03 11 long %00_0000_0101_1111_1111_1001 <<10 +assignx '$04 p000_10-- ?var rnd forward long long %00_0000_0101_1111_1111_1001 <<10 +assignx '$05 1 long %00_0000_0101_1111_1111_0001 <<10 +assignx '$06 p000_11-- var? rnd reverse long long %00_0000_0101_1111_1111_0001 <<10 +assignx '$07 1 long %00_0000_0101_1111_1110_1101 <<10 +assignx '$08 p001_00-- ~var sign extend byte long %00_0000_0101_1111_1110_1101 <<10 +assignx '$09 1 long %00_0000_0101_1111_1101_1101 <<10 +assignx '$0A p001_01-- ~~var sign extend word long %00_0000_0101_1111_1101_1101 <<10 +assignx '$0B 1 long %00_0000_0111_1111_1011_1101 <<10 +assignx '$0C p001_10-- var~ post-clear long %00_0000_0111_1111_1011_1101 <<10 +assignx '$0D 1 long %00_0000_0111_1111_0111_1101 <<10 +assignx '$0E p001_11-- var~~ post-set long %00_0000_0111_1111_0111_1101 <<10 +assignx '$0F 1 long %00_0000_0101_1010_1111_1101 <<10 +assignx '$10 p010_0ss- ++var pre-inc ss=00=mask size bit/adr??? long %00_0000_0101_0110_1111_1101 <<10 +assignx '$11 01 01=mask size byte long %00_0000_0100_1110_1111_1101 <<10 +assignx '$12 10 10=mask size word long %00_0000_0101_1110_1111_1101 <<10 +assignx '$13 11 11=mask size long long %00_0000_0101_1010_1111_1101 <<10 +assignx '$14 p010_1ss- var++ post-inc long %00_0000_0101_0110_1111_1101 <<10 +assignx '$15 01 long %00_0000_0100_1110_1111_1101 <<10 +assignx '$16 10 long %00_0000_0101_1110_1111_1101 <<10 +assignx '$17 11 long %00_0000_0101_1001_1111_1101 <<10 +assignx '$18 p011_0ss- --var pre-dec long %00_0000_0101_0101_1111_1101 <<10 +assignx '$19 01 long %00_0000_0100_1101_1111_1101 <<10 +assignx '$1A 10 long %00_0000_0101_1101_1111_1101 <<10 +assignx '$1B 11 long %00_0000_0101_1001_1111_1101 <<10 +assignx '$1C p011_1ss- var-- post-dec long %00_0000_0101_0101_1111_1101 <<10 +assignx '$1D 01 long %00_0000_0100_1101_1111_1101 <<10 +assignx '$1E 10 long %00_0000_0101_1101_1111_1101 <<10 +assignx '$1F 11 '---------------------------------------------------------------------------------------------------------------------------- DAT ' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ' % Initialise the P2 ClusoRamInterpreter % ' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% orgh HUB_init '<<<<<<<<<<<<<<<<<<<<<<< start hubexec code StartInterpreter mov lmm_x,##_clockfreq '\ set clkfreq in HUB $0 = CLKFREQ wrlong lmm_x,#$0 '/ ' Copy ClusoInterpreter to COG RAM & LUT RAM... setq #496-1 ' can shorten to length later!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! rdlong $0,##@ClusoInterpreter ' COG setq2 #512-1 ' can shorten to length later!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! rdlong $0,##@vector_table ' LUT {=============== setq #$004 ' set PTRA=PAR= bytecode '???? value ??? coginit mov PTRA,#$004 ' points to hub bytecode start $004 jmp #$0 ' start ClusoInterpreter in COG at $000 ================} '+-------[ Set Xtal ]----------------------------------------------------------+ entry hubset #0 ' set 20MHz+ mode hubset ##_SETFREQ ' setup oscillator waitx ##20_000_000/100 ' ~10ms hubset ##_ENAFREQ ' enable oscillator '+-----------------------------------------------------------------------------+ waitx ##_clockfreq*5 ' just a delay to get pc terminal running ''-------[ Start Serial ]------------------------------------------------------ mov lmm_bufad, ##_HUBBUF ' locn of hub buffer for serial routine mov lmm_x, ##_bitper ' sets serial baud call #_SerialInit ' initialise serial ''+----------------------------------------------------------------------------+ ''+ Display a String (in HUB, $00 terminated) + ''+----------------------------------------------------------------------------+ mov lmm_p, ##hubstring ' must be in hub! call #_HubTxString ''----------------------------------------------------------------------------- '%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% mov PTRA,#$004 ' points to hub bytecode start $004 call #@ClusoInterpreter ' start ClusoInterpreter in COG at $000 ' and return to debug!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! '%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% mov lmm_p,##hubstring ' must be in hub! call #_HubTxString mov lmm_x,ptra ' pcurr call #show mov lmm_x,ptrb ' dcurr call #show mov lmm_x,op ' op call #show mov lmm_x,vtable ' vtable call #show call #_hubTxCR mov lmm_x,x ' x call #show mov lmm_x,y ' y call #show mov lmm_x,a ' a call #show call #_hubTxCR ' now let's call the ROM Monitor... monitor call #_hubMonitor ' call the ROM Monitor (already initialised) jmp #monitor ' in case we return from the monitor '+-----------------------------------------------------------------------------+ _debugreadx mov tmp,x jmp #_debugread _debugready mov tmp,y jmp #_debugread _debugreada mov tmp,a jmp #_debugread _debugreadop mov tmp,op jmp #_debugread _debugreadop2 mov tmp,op2 jmp #_debugread _debugreadt2 mov tmp,t2 jmp #_debugread _debugread mov lmm_p,##str_read call #_HubTxString mov lmm_x,ptra ' ptra: pcurr sub lmm_x,#1 ' because ptra++ done call #show mov lmm_x,tmp ' bytecode read call #show call #_hubTxCR RET wcz '+-----------------------------------------------------------------------------+ _debugassign mov lmm_p,##str_assign '--assign-- call #_HubTxString _debugloop call #_debugxya ' x y a op op2 c+z call #_debugdcurr ' stack & adr+val ' call #_debugadr call #_debugpcurr ' code... RET wcz '+-----------------------------------------------------------------------------+ _debugdcurr mov lmm_p,##str_dcurr '--stack-- call #_HubTxString mov lmm_x,ptrb 'ptrb: dcurr call #showc rdlong lmm_x,--ptrb 'pop from stack call #show rdlong lmm_x,--ptrb 'pop from stack call #show rdlong lmm_x,--ptrb 'pop from stack call #show add ptrb,#12 'restore dcurr _debugadr mov lmm_p,##str_adr call #_HubTxString mov lmm_x,adr 'adr call #showc rdlong lmm_x,adr 'val call #show call #_hubTxCR RET wcz '+-----------------------------------------------------------------------------+ _debugpcurr mov lmm_p,##str_pcurr '--code-- call #_HubTxString mov lmm_x,ptra 'ptra: pcurr call #showc rdbyte lmm_x,ptra++ 'next op call #show rdbyte lmm_x,ptra++ 'next op call #show rdbyte lmm_x,ptra++ 'next op call #show sub ptra,#3 'restore pcurr '' call #_hubTxCR RET wcz '+-----------------------------------------------------------------------------+ _debugvect1 mov lmm_p,##str_vect 'assign vector call #_HubTxString mov lmm_x,t1 call #showc jmp #_dbgv _debugvect mov lmm_p,##str_vect call #_HubTxString mov lmm_x,op call #showc _dbgv mov lmm_x,vtable and lmm_x,##$3FF ' vtable adr call #show8 mov lmm_x,#"+" call #_hubTx mov lmm_x,vtable shr lmm_x,#10 ' vtable skip call #show call #_debugwcz RET wcz '+-----------------------------------------------------------------------------+ _debugrx call #_hubRx RET wcz '+-----------------------------------------------------------------------------+ _debugreg1 mov lmm_p,##str_reg1 call #_HubTxString mov lmm_x,r ' reg call #show mov lmm_x,lsb ' lsb call #show mov lmm_x,a ' a (mask) call #show mov lmm_x,op ' op call #show call #_hubTxCR RET wcz '+-----------------------------------------------------------------------------+ _debugreg2 mov lmm_p,##str_reg2 call #_HubTxString mov lmm_x,r ' reg call #show mov lmm_x,x ' x call #show call #_hubTxCR RET wcz '+-----------------------------------------------------------------------------+ _debugcnt mov lmm_p,##str_cnt jmp #_debugxxx '+-----------------------------------------------------------------------------+ _debugpar mov lmm_p,##str_par jmp #_debugxxx '+-----------------------------------------------------------------------------+ _debugwaitx mov lmm_p,##str_waitx _debugxxx call #_HubTxString mov lmm_x,x ' x call #show call #_hubTxCR RET wcz '+-----------------------------------------------------------------------------+ _debugpop mov lmm_p,##str_pop call #_HubTxString jmp #_debugxya '+-----------------------------------------------------------------------------+ _debugpush mov lmm_p,##str_push call #_HubTxString '' jmp #_debugxya ' fall thru '+-----------------------------------------------------------------------------+ _debugxya mov lmm_p,##str_xya call #_HubTxString mov lmm_x,x ' x call #show mov lmm_x,y ' y call #show mov lmm_x,a ' a call #show mov lmm_p,##str_space call #_HubTxString mov lmm_p,##str_ops call #_HubTxString mov lmm_x,op ' op call #show mov lmm_x,op2 ' op2 call #show '' jmp #_debugwcz ' fall thru '+-----------------------------------------------------------------------------+ _debugwcz if_NC_and_Z mov lmm_p,##str_NCZ if_NC_and_NZ mov lmm_p,##str_NCNZ if_C_and_Z mov lmm_p,##str_CZ if_C_and_NZ mov lmm_p,##str_CNZ call #_HubTxString RET wcz '+-----------------------------------------------------------------------------+ show call #_hubHex8 mov lmm_x,#" " call #_hubTx RET wcz '+-----------------------------------------------------------------------------+ showc call #_hubHex8 mov lmm_x,#":" call #_hubTx RET wcz '+-----------------------------------------------------------------------------+ show8 call #_hubHex8 RET wcz '+-----------------------------------------------------------------------------+ space8 mov lmm_p,##str_space call #_hubTxString RET wcz '+-----------------------------------------------------------------------------+ showCR call #_hubHex8 call #_hubTxCR RET wcz '+-----------------------------------------------------------------------------+ str_NCZ byte " NC Z",13,10,0 str_NCNZ byte " NC NZ",13,10,0 str_CZ byte " C Z",13,10,0 str_CNZ byte " C NZ",13,10,0 str_push byte "push: ",13,10,0 str_pop byte "pop: ",13,10,0 str_vect2 byte "vector 2:",13,10,0 str_vect3 byte "vector 3:",13,10,0 str_assign byte "assign...",13,10,0 str_cnt byte "cnt: ",0 str_par byte "par: ",0 str_xya byte "xya: ",0 str_ops byte "op,op2: ",0 str_vect byte "vect: ",0 str_loop byte "loop: ",0 str_pcurr byte "code---> ",0 str_dcurr byte "stack: ",0 str_adr byte "addr: ",0 str_read byte "----> ",0 str_waitx byte "wait: ",0 str_reg1 byte "reg: ",0 str_reg2 byte " ",0 str_space byte " ",0 hubstring byte "P2 ClusoInterpreter testing v305k",13,10,0 alignl '---------------------------------------------------------------------------------------------------------------------------- '