// +++ file: "main.asm" +++ /* Copyright (c) Günter Woigk 2009 - 2015 mailto:kio@little-bat.de This file is free software This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: ? Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. ? Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ============================================================================== Microcode for the K1-16/16 CPU 2013-03-07 2015-12-22 The microcode implements 3 different code models: microcode: located in the microcode rom and executed by the control unit hardware. microcodes are addressed with the microcode address counter. subroutines are called with 'jsr' (actually 5 microcodes in total!) and return with 'ret' which actually consists of 2 microcodes, jp and a nop, but one last microcode can sometimes be postponed into the 'nop'. ? labels are all_lowercase. ? arguments and return values are typically passed in registers. ? subroutines try to preserve registers. Millicode: located in the microcode rom and addressed with the ip register. millicodes are implemented in microcode. but may itself switch to millicode with the 'millicoded' microcode. millicodes are the implementation's address with condition 'bit15'. millicodes jump to the next millicode with the 'next_mc' microcode, or the 'Ret' millicode, if they are millicoded. note: 'millicoded' pushes the current ip and 'Ret' restores it. ? labels (millicodes!) are CamelCased. ? arguments are passed on the data stack with the top value in the alu register. ? most (simple) millicodes preserve all common registers. ? subroutines are implemented as new millicodes. (there is no 'Jsr') OPCODE: located in ram and addressed with the ip register. opcodes are implemented in microcode. opcodes are the implementation's address with - bit15 = code plane of the address and - bit14 = 1 to not clear the low byte or - bit14 = 0 to clear the low byte which may contain one byte of data (cmd_lo). opcodes jump to the next opcode with the 'next' microcode, which actually consists of 2 microcodes, the jp and a nop, but one last microcode can frequently be postponed into the 'nop'. ? labels (opcodes!) are ALL_UPPERCASE. ? arguments are passed on the data stack with the top value in the alu register. ? most (simple) opcodes preserve all common registers. ? subroutines (in ram) are implemented with opcodes. they are called with 'JSR' and return with 'RET' opcode. ? reading of the next opcode can be superseded with the interrupt vector. due to the hardware this results in a jump to the read opcode address & $F000. address $0000 is the reset entry, therefore opcodes must not start in range $0000-$0FFF. */ #include "options.h" // options for cc and asm // +++ file: "options.h" +++ /* Copyright (c) Günter Woigk 2009 - 2015 mailto:kio@little-bat.de This file is free software This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: ? Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. ? Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Dieses File darf nur #defines enthalten. Es wird von c-Sourcen und vom Assembler eingebunden! */ // Welcher Quartz-Vorteiler soll maximal eingestellt werden? // 2 -> 32/2 = 16 MHz // 4 -> 32/4 = 8 MHz // 8 -> 32/8 = 4 MHz // 16 -> 32/16 = 2 MHz // Der mca Assembler kennt 'clock_predivider' und ersetzt ggf. set clock2 und set clock4. // #define clock_predivider 2 // does "tst,(areg) : z" work? // note: does not work, even with 74AC151 on SSW // note: eliminate. no known user for this option. // #define fast_ival_z_test 0 // sollen die Microcode Macros 'log', 'trace' und 'tron' in 'macros.h' aktiviert werden? // Auch: Einbinden der Bytecode-Namen im BytecodeCompiler. // #define enable_debug_macros 1 // Der i2c-Treiber "i2c.cc" kann Code enthalten, der einen Treiber aus einem Array // statt aus dem i2c eeprom liest. Damit kann ein K1-Bus-Treiber erstmalig // ins System eingebracht werden. // // wenn include_i2c_soft_eeprom != 0 wird dieser Code für dieses Device eingebaut, zB. Device 3. // wenn include_i2c_soft_eeprom == 0 wird kein derartiger Code eingebaut. // // Die Daten für den Array werden in "i2c.cc" aus der Datei "i2c-sio-eeprom.h" importiert. // Dieses kann mit dem Script "eeprom.vs" aus der Datei "eeprom.bin" erzeugt werden. // eeprom.bin = output file des VCC Compilers für Target K1-Bus-Bytecode. // eeprom.vs = Script sollte in diesem Ordner ("?/Microcode/mc/eeprom.vs") liegen. // #define include_i2c_soft_eeprom 0 #define i2c_sio_addr 2 // falls include_i2c_soft_eeprom enabled // Der Driver für die Sio-Karte kann in Millicode implementiert sein. // Dann muss dieser Treiber nicht aus dem Eeprom geladen werden // #define include_sio_driver_in_rom 0 // Soll das EEFS Filesystem eingebaut werden? // #define include_filesystem 0 // Sollen die FP-Funktionen eingebaut werden? // #define include_floating_point 0 // sollen test-module eingebaut werden? // globales flag für alle test module. // test-module müssen zusätzlich individuell enabled werden. // #define include_tests 0 #define test_millicode 0 #define test_long 0 #define test_float 0 #define test_misc 0 #define test_i2c 0 // soll der ram-test übersprungen werden? // vor allem sinnvoll in der Emulation wg. Laufzeit. B-) // #define include_ramtest 1 // soll Datentyp bool signed oder unsigned sein? // unsigned: 0, 1 // signed: 0, -1 // unsigned ist C-Standard, signed wäre aber eine Winzigkeit schneller & kürzer // #define signed_bool 0 // --- file: "options.h" --- #include "asm/defs.asm" // symbolic names for registers and so on // +++ file: "defs.asm" +++ /* Copyright (c) Günter Woigk 2009 - 2015 mailto:kio@little-bat.de This file is free software This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: ? Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. ? Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ // K1-16/16 microcode // 2015-12-03 // ============================================================================== // Symbolic Names: // dis in out in out // ccc:E:oooooo:aaa:aaa:dddd:dddd // Data Bus: dreg cmd.clk = ___:0:______:___:___:0000:???? // cmd input (r/-) dreg ival.oe = ___:0:______:___:___:____:0000 // ival output (-/w) dreg mem.clk = ___:0:______:___:???:0001:???? // internal ram dreg mem.oe = ___:0:______:___:???:____:0001 // internal ram dreg io.clk = ___:0:____??:___:___:0010:???? // k1-bus i/o dreg io.oe = ___:0:____??:___:___:____:0010 // k1-bus i/o dreg dnop.clk = ___:0:______:___:___:0011:???? // dummy target (-/w) dreg axd.oe = ___:0:______:___:___:____:0011 // a-to-d port (r/-) dreg alu.clk = ___:0:__?_??:___:___:1000:???? // top of stack = tos = akku = alu dreg alu.oe = ___:0:______:___:___:____:1000 // top of stack = tos = akku = alu dreg sr.clk = ___:0:___?__:___:___:1100:???? // shift right // dreg sr_cy.clk = ___:0:___1__:___:___:1100:???? // shift right dreg sr.oe = ___:0:______:___:___:____:1100 // shift right dreg sl.clk = ___:0:___?__:___:___:1101:???? // shift left // dreg sl_cy.clk = ___:0:___1__:___:___:1101:???? // shift left dreg sl.oe = ___:0:______:___:___:____:1101 // shift left dreg d2ar.clk = ___:0:______:___:___:1111:???? // d-to-a register (-/w) dreg cmd_lo.oe = ___:0:______:___:___:____:1111 // cmd.lo register (r/-) dreg d0 = 4 // gp dreg register dreg d1 = 5 // "" dreg d2 = 6 // "" dreg d3 = 7 // scratch dreg dtmp = d3 // scratch dreg dxxx1 = 9 // unused dreg swap = 10 // swap hibyte <-> lobyte dreg dxxx2 = 11 // unused dreg msbit = 14 // 16-to-4 encoder // Address Bus: areg dxa.oe = ___:0:______:___:001:____:____ // d-to-a port areg anop.clk = ___:0:______:001:???:____:____ // dummy target areg d2ar.oe = ___:0:______:___:111:____:____ // d-to-a register (r/-) areg ioaddr.clk = ___:0:______:111:???:____:____ // k1-bus i/o address (w/-) areg ip = 0 // instruction pointer areg sp = 2 // stack pointer areg a0 = 3 // gp address register areg a1 = 4 // "" areg hp = 5 // heap pointer areg atmp = 6 // scratch // Option Lines: opt opt0 = ___:0:_____?:___:___:____:____ opt opt1 = ___:0:____?_:___:___:____:____ opt opt2 = ___:0:___?__:___:___:____:____ opt opt3 = ___:0:__?___:___:___:____:____ opt opt4 = ___:0:_?____:___:___:____:____ opt opt5 = ___:0:?_____:___:___:____:____ opt a_bits = ___:0:??____:___:___:____:____ opt d_bits = ___:0:__????:___:___:____:____ // for ALU: opt alu_fu = ___:0:____??:___:___:____:____ opt alu_cy = ___:0:___?__:___:___:____:____ // alu carry input opt alu_cpl = ___:0:__?___:___:___:____:____ // alu complement input opt cy = ___:0:___1__:___:___:____:____ opt nc = ___:0:___0__:___:___:____:____ opt add = ___:0:__0000:___:___:____:____ opt add_cy = ___:0:__0100:___:___:____:____ opt xor = ___:0:__0_01:___:___:____:____ opt and = ___:0:__0010:___:___:____:____ opt or = ___:0:__0110:___:___:____:____ opt load = ___:0:__0_11:___:___:____:____ opt sub = ___:0:__1100:___:___:____:____ opt sub_nc = ___:0:__1000:___:___:____:____ opt xor_cpl = ___:0:__1_01:___:___:____:____ opt and_cpl = ___:0:__1010:___:___:____:____ opt or_cpl = ___:0:__1110:___:___:____:____ opt load_cpl = ___:0:__1_11:___:___:____:____ // for Address Register: opt a_cpl = ___:0:_?____:___:___:____:____ opt a_dis = ___:0:?_____:___:___:____:____ opt add0 = ___:0:00____:___:001:____:____ // 001 = dxa.out opt sub2 = ___:0:01____:___:001:____:____ // 001 = dxa.out opt add1 = ___:0:00____:___:???:____:____ // ??? = !dxa.out opt sub1 = ___:0:01____:___:???:____:____ // ??? = !dxa.out opt adddis = ___:0:10____:___:???:____:____ // + cmd_lo opt subdis = ___:0:11____:___:???:____:____ // + cmd_lo - 256 // for I/O opt io_bits = ___:0:____??:___:___:____:____ opt i2c_clk = ___:0:___?01:___:___:____:0010 // 0010 = 2 = io.oe opt i2c_data = ___:0:__?_01:___:___:____:0010 // 0010 = 2 = io.oe // output: dreg io_data.clk = ___:0:____00:___:___:0010:???? // 0010 = 2 = io.clk dreg io_select.clk = ___:0:____01:___:___:0010:???? // 0010 = 2 = io.clk dreg io_ie_mask.clk = ___:0:____10:___:___:0010:???? // 0010 = 2 = io.clk dreg io_dummy.clk = ___:0:____11:___:___:0010:???? // 0010 = 2 = io.clk // input: dreg io_dummy.oe = ___:0:____00:___:___:____:0010 // 0010 = 2 = io.oe dreg io_i2c.oe = ___:0:__??01:___:___:____:0010 // 0010 = 2 = io.oe dreg io_irpt.oe = ___:0:____10:___:___:____:0010 // 0010 = 2 = io.oe dreg io_data.oe = ___:0:____11:___:___:____:0010 // 0010 = 2 = io.oe // Misc. Options: opt cmden = ___:0:______:___:___:____:____ opt cmddis = ___:1:___=_:________________ opt value = ___:1:___=_:???????????????? opt abort = ___:1:111=1:1111111111111111 // emulator only; reset on real machine // DIV_FF Names: "___:1:xxx=?:________________" opt clock2 = ___:1:000=?:________________ // 000 0 => XTAL/2 opt clock4 = ___:1:001=?:________________ // 001 0 => XTAL/4 opt halt = ___:1:010=?:________________ opt ei = ___:1:011=?:________________ opt led_grn = ___:1:100=?:________________ opt led_yel = ___:1:101=?:________________ opt led_red = ___:1:110=?:________________ opt reset = ___:1:111=?:________________ // Conditions: "000:_:______:___:___:____:____" cond 0 = 0 // (stay in) code plane 0 cond 1 = 1 // (stay in) code plane 1 cond cy = 2 // fork dep. on ALU carry flag cond z = 3 // fork dep. on ALU zero flag cond ovfl = 4 // fork dep. on ALU signed overflow flag cond rnd = 5 // fork dep. on RND cond bit0 = 6 // fork dep. on data bus bit 0 cond bit15 = 7 // fork dep. on data bus bit 15 // --- file: "defs.asm" --- #include "asm/globals.asm" // global data // +++ file: "globals.asm" +++ /* Copyright (c) Günter Woigk 2009 - 2015 mailto:kio@little-bat.de This file is free software This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: ? Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. ? Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ // ======================================================================== // Global Data // start at $0000 // ======================================================================= // Interrupts: int_vector data 16 // interrupt vectors int_mask data 1 // enable mask for installed handlers // Memory Management: gdata_ptr data 1 // allocation pointer for zeropage global data gcode_ptr data 1 // start of space for new words hp_base data 1 // bottom of data heap sp_base data 1 // top of return stack mem_data_start data 1 // Start of dynamic data blocks mem_data_end data 1 // Start of free memory between data and pointers mem_ptr_start data 1 // Start of global data pointers mem_free_ptr data 1 // Pointer to linked list of free global pointers mem_end data 1 mem_ptr_end := mem_end // End of local data pointers // Misc: opcode_Ret data 1 // opcode Ret: return_to_millicode #if include_filesystem trashname data 1 // ".trash" #endif #if include_sio_driver_in_rom sio_getctl_proc data 1 sio_setctl_proc data 1 sio_getc_proc data 1 sio_gets_proc data 1 sio_putc_proc data 1 sio_puts_proc data 1 #endif mem_globs_nz_end data 0 // 0-inited values: null data 1 // const value 0 stdin data 1 // dev_data[] for standard input device stdout data 1 // "" output "" stderr data 1 // "" error "" bc_data data 1 // bytecode compiler data #if include_floating_point ee_ptab data 1 // ec pos. exponents table ee_mtab data 1 // ec neg. exponents table #endif context0 data 1 context1 data 1 errno data 1 root data 1 // root node current_time data 2 // current time in UTC current_microsec data 2 // µsecond akku microsecs_per_int data 1 // µseconds per timer interrupt #if include_sio_driver_in_rom sio_channel_A data 1 sio_channel_B data 1 sio_selectmask data 1 IMR_value data 1 OPCR_value data 1 #endif // End of Globals: mem_globs_end data 0 // --- file: "globals.asm" --- #include "asm/macros.asm" // instruction macros // +++ file: "macros.asm" +++ /* Copyright (c) Günter Woigk 2009 - 2015 mailto:kio@little-bat.de This file is free software This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: ? Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. ? Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ // ================================================================ // exception.asm: // ================================================================ instr TODO ld atmp,$ // * TODO jp TODO // * TODO end instr OOMEM ld atmp,$ // * OOMEM jp OOMEM // * OOMEM end instr PANIC ld atmp,$ // * PANIC jp PANIC // * PANIC end instr TRAP(COND) if COND // * TRAP ld atmp,$ // * TRAP jp PANIC // * TRAP then // * TRAP end // ================================================================ // mem.asm: // ================================================================ // Get data address and size for handle // in: AREG = handle // out: AREG -> data.data // DREG = size // instr mem_get_address_and_size(AREG,DREG) ld DREG,(AREG) // * mem_get_address_and_size ld AREG,DREG // AREG -> data.size // * mem_get_address_and_size ld DREG,(AREG++) // AREG -> data.data; DREG = data.size // * mem_get_address_and_size end // ================================================================ // millicode.h: // ================================================================ // switch to millicode: // (switch back with 'Native') // (or return to caller with 'Next') // instr Millicode ld ip,$+4 // * Millicode ld cmd,ival // * Millicode //mc first_millicode :bit15 end // fetch next millicode instruction: // // instr next_mc // ld cmd,ip++ // ld cmd,ival :bit15 // end instr next_m // TODO: preliminary: vicci replaces 'return' only with 'next_m', because 'next_mc' is 1 char longer... next_mc // * next_m // ld cmd,ip++ // ld cmd,ival :bit15 end // start millicoded millicode: // pushr ip and switch to millicode // (switch back and next_mc with 'Next') // instr Millicoded ld atmp,$+4 // * Millicoded jp millicoded // * Millicoded end #if enable_debug_macros instr logchar(N) ld io,N,d_bits=4 // * logchar end instr lognum(N) ld io,N,d_bits=5 // * lognum end instr loghex(N) ld io,N,d_bits=6 // * loghex end instr logfloat(PTR) ld io,PTR,d_bits=7 // * logfloat end instr log_registers ld io,alu,d_bits=8 // * log_registers end instr log_cc ld io,alu,d_bits=9 // * log_cc end instr login ld io,alu,d_bits=10 // * login end instr logout ld io,alu,d_bits=11 // * logout end instr logmem ld io,alu,d_bits=12 // * logmem end instr trace(N) ld io,N,d_bits=15 // * trace end instr tron ld io,2,d_bits=15 // * tron end instr troff ld io,0,d_bits=15 // * troff end instr abort dw $ffff,abort // * abort end #else instr abort end instr log_cc end instr logchar(N) end instr lognum(N) end instr login end instr logout end instr logmem end instr log_registers end instr loghex(N) end instr logfloat(PTR) end instr trace(N) end instr tron end instr troff end #endif // --- file: "macros.asm" --- #include "asm/microcodes.asm" // #defines for microcodes implemented in c // +++ file: "microcodes.asm" +++ /* Copyright (c) Günter Woigk 2009 - 2015 mailto:kio@little-bat.de This file is free software This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: ? Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. ? Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #define AddPokeL op__ADDGL__5int32_5int32P_ #define SubPokeL op__SUBGL__5int32_5int32P_ #define SlPokeL op__SLGL__5int16_6uint32P_ #define SrPokeUL op__SRGL__5int16_6uint32P_ #if include_floating_point #define AddPokeF op__ADDGL__7float48_7float48P_ #define SubPokeF op__SUBGL__7float48_7float48P_ #define MulPokeF op__MULGL__7float48_7float48P_ #define DivPokeF op__DIVGL__7float48_7float48P_ // not used #define ModPokeF op__MODGL__7float48_7float48P_ // NIMP #define SlPokeF op__SLGL__5int16_7float48P_ // not used #define SrPokeF op__SRGL__5int16_7float48P_ // not used #define Cast_iF new__5int16_7float48 // not used #define Cast_uF new__6uint16_7float48 #define Cast_LF new__5int32_7float48 // not used #define Cast_ULF new__6uint32_7float48 #define Cast_Fi new__7float48_5int16 #define Cast_FL new__7float48_5int32 #endif #define Cast_iL new__5int16_5int32 // not used #define Cast_uL new__6uint16_6uint32 #define Cast_Li Nip #define Cast_RangeStr cast_range_2_str // cast ( str[?] -- str ) #define Cast_RangeStrRt cast_range_2_str_Rt // cast ( str[?] -- str ) and retain items NIMP // arith mixed i16+u16: //#define Eq_iu op__EQ__5int16_6uint16_6uint16 // NIMP //#define Ne_iu op__NE__5int16_6uint16_6uint16 // NIMP //#define Ge_iu op__GE__5int16_6uint16_6uint16 // NIMP //#define Gt_iu op__GT__5int16_6uint16_6uint16 // NIMP //#define Lt_iu op__LT__5int16_6uint16_6uint16 // NIMP //#define Le_iu op__LE__5int16_6uint16_6uint16 // NIMP //#define Eq_ui op__EQ__6uint16_5int16_6uint16 // NIMP //#define Ne_ui op__NE__6uint16_5int16_6uint16 // NIMP //#define Ge_ui op__GE__6uint16_5int16_6uint16 // NIMP //#define Le_ui op__LE__6uint16_5int16_6uint16 // NIMP //#define Gt_ui op__GT__6uint16_5int16_6uint16 // NIMP //#define Lt_ui op__LT__6uint16_5int16_6uint16 // NIMP //#define Mul_iu Mul_i16u16 // NIMP //#define Mul_ui Mul_u16i16 // NIMP //#define Div_iu Div_i16u16 // NIMP //#define Div_ui Div_u16i16 // NIMP #define Mod_iu op__MOD__5int16_6uint16_5int16 //#define Mod_ui Mod_u16i16 // NIMP // arith i32: #define EqL op__EQ__5int32_5int32_5int16 #define NeL op__NE__5int32_5int32_5int16 // not used #define GeL op__GE__5int32_5int32_5int16 // not used #define LeL op__LE__5int32_5int32_5int16 // not used #define GtL op__GT__5int32_5int32_5int16 // not used #define LtL op__LT__5int32_5int32_5int16 // not used #define AddL op__ADD__5int32_5int32_5int32 #define SubL op__SUB__5int32_5int32_5int32 #define MulL op__MUL__5int32_5int32_5int32 // not used #define DivL op__DIV__5int32_5int32_5int32 // not used #define ModL op__MOD__5int32_5int32_5int32 // NIMP #define AndL op__AND__5int32_5int32_5int32 // not used #define OrL op__OR__5int32_5int32_5int32 // not used #define XorL op__XOR__5int32_5int32_5int32 // not used #define SrL op__SR__6uint32_5int16_6uint32 #define SlL op__SL__6uint32_5int16_6uint32 #define NotL op__NOT__4void_5int32_4bool // NIMP //#define BoolL // not used #define NegL op__SUB__4void_5int32_5int32 #define CplL op__CPL__4void_5int32_6uint32 //#define AbsL // NIMP //#define SignL // NIMP //#define PowL // NIMP //#define IncrL //#define DecrL // NIMP #define PeekppL peekpp__5int32P_5int32 // not used //#define PeekmmL // NIMP //#define ppPeekL // NIMP //#define mmPeekL // NIMP //#define MinL // NIMP //#define MaxL // NIMP // arith u32: #define GeUL op__GE__6uint32_6uint32_5int16 #define GtUL op__GT__6uint32_6uint32_5int16 #define LtUL op__LT__6uint32_6uint32_5int16 #define LeUL op__LE__6uint32_6uint32_5int16 #define MulUL op__MUL__6uint32_6uint32_6uint32 // not used #define DivUL op__DIV__6uint32_6uint32_6uint32 // not used #define ModUL op__MOD__6uint32_6uint32_6uint32 // NIMP #define SrUL op__SR__6uint32_5int16_6uint32 //#define PowUL //#define MinUL //#define MaxUL // arith mixed i32+u32: //#define Eq_iuL //#define Ne_iuL //#define Ge_iuL //#define Gt_iuL //#define Lt_iuL //#define Le_iuL // //#define Eq_uiL //#define Ne_uiL //#define Ge_uiL //#define Le_uiL //#define Gt_uiL //#define Lt_uiL // //#define Mul_iuL //#define Mul_uiL //#define Div_iuL //#define Div_uiL //#define Mod_iuL //#define Mod_uiL // arith f48: #define EqF op__EQ__7float48_7float48_5int16 #define NeF op__NE__7float48_7float48_5int16 // not used #define GeF op__GE__7float48_7float48_5int16 #define LtF op__LT__7float48_7float48_5int16 #define LeF op__LE__7float48_7float48_5int16 #define GtF op__GT__7float48_7float48_5int16 #define AddF op__ADD__7float48_7float48_7float48 #define SubF op__SUB__7float48_7float48_7float48 #define MulF op__MUL__7float48_7float48_7float48 #define DivF op__DIV__7float48_7float48_7float48 #define ModF op__MOD__7float48_7float48_7float48 // NIMP #define NotF op__NOT__7float48_4bool // not used #define BoolF op__NOTNOT__7float48_4bool #define NegF op__SUB__4void_7float48_7float48 //#define IncrF //#define DecrF //#define PeekppF //#define PeekmmF //#define ppPeekF //#define mmPeekF #define MantF mant__7float48_6uint32 // not used. float = mantisse(float); 0.5 ? mant < 1.0; link with -lm #define SlF op__SL__7float48_5int16_7float48 // a< a n << note: neg. floats behave different than ints! #define SrF op__SR__7float48_5int16_7float48 // a>>int:n -> a n >> note: neg. floats behave different than ints! // Strings & Arrays: //#define ShrinkStr // shrink ( T[]¢ uint -- ) //#define ShrinkStrL //#define ShrinkStrF #define ShrinkStrStr ShrinkStrArray__8ucs2charAEAEC_6uint16_ // not used. shrink ( str[]¢ uint -- ) also for: array of other allocated type with no dtor //#define GrowStr // grow ( T[]¢ uint -- ) //#define GrowStrL //#define GrowStrF #define Append AppendGl__8ucs2char_8ucs2charAEP_ // operator+= ( T T[]& -- ) //#define AppendL //#define AppendF #define AppendStr AppendGl__8ucs2charAE_8ucs2charAEP_ // operator+= ( T[] T[]& -- ) //#define AppendCstr // operator+= ( T[]¢ T[]& -- ) //#define AppendRange // operator+= ( T[?] T[]& -- ) #define AppendStrRt AppendGlStrRt // not used. operator+= ( T[] T[]& -- ) and retain items #define AppendCstrRt AppendGl__8ucs2charAEAEC_8ucs2charAEAEP_// not used. operator+= ( T[]¢ T[]& -- ) and retain items #define AppendRangeRt AppendGlRangeRt // not used. operator+= ( T[?] T[]& -- ) and retain items #define AppendRt AppendGl__8ucs2charAE_8ucs2charAEAEP_ // operator+= ( T T[]& -- ) and retain items #define SortRange sort__5int16AEC_6uint16_6uint16_4boolB5int165int16D_ // sort ( int[?] bool(int,int) -- ) #define SortRangeL sort__5int32AEC_6uint16_6uint16_4boolB5int325int32D_ // NIMP. sort ( int32[?] bool(int32,int32) -- ) #define SortRangeF sort__7float48AEC_6uint16_6uint16_4boolB7float487float48D_ // NIMP. sort( float[?] bool(float,float) -- ) #define RolRange Rol_AE__6uint16AEC_6uint16_6uint16_ //#define RolRangeL //#define RolRangeF #define RorRange Ror_AE__6uint16AEC_6uint16_6uint16_ //#define RorRangeL //#define RorRangeF #define Find find__8ucs2charAEC_8ucs2char_6uint16_6uint16 // findchar ( str¢ char int:startidx -- ) //#define FindL //#define FindF #define RFind rfind__8ucs2charAEC_8ucs2char_6uint16_6uint16 // rfindchar ( str¢ char int:startidx -- ) //#define RFindL //#define RFindF //#define FindCstr // findstr ( str¢:z str¢: int -- ) //#define RFindCstr // rfindstr ( str¢:z str¢: int -- ) //#define Alloc // alloc ( uint32 -- T[] ) //#define Retain // retain ( T[]¢ -- T[] ) //#define RefCnt // refcnt ( T¢ -- uint ) //#define IsShared // is_shared ( T¢ -- uint ) //#define DropStr // dispose ( T[] -- ) //#define Shrinktofit // shrinktofit ( T[]& -- ) //#define End // end ( int -- ) // does not return //#define Assert // assert ( bool str -- ) //#define IoHelper // iohelper ( -- ) // does not advance ip #define CatCstrCstr catstr__8ucs2charAEC_8ucs2charAEC_8ucs2charAE // operator + ( str¢ str¢ -- str ) #define CatStrCstr catstr__8ucs2charAE_8ucs2charAEC_8ucs2charAE // operator + ( str str¢ -- str ) #define CatCstrStr catstr__8ucs2charAEC_8ucs2charAE_8ucs2charAE // operator + ( str¢ str -- str ) #define CatStrStr catstr__8ucs2charAE_8ucs2charAE_8ucs2charAE // operator + ( str str -- str ) //#define CatRangeCstr // operator + ( str_r str¢ -- str ) //#define CatCstrRange // operator + ( str¢ str_r -- str ) #define CatRangeStr catstr__8ucs2charAEC_6uint16_6uint16_8ucs2charAE_8ucs2charAE // operator + ( str_r str -- str ) #define CatStrRange catstr__8ucs2charAE_8ucs2charAEC_6uint16_6uint16_8ucs2charAE // operator + ( str str_r -- str ) #define CatRangeRange catstr__8ucs2charAEC_6uint16_6uint16_8ucs2charAEC_6uint16_6uint16_8ucs2charAE // operator + ( str_r str_r -- str ) #define CatStrChar catchar__8ucs2charAE_8ucs2char_8ucs2charAE // operator + ( T[] T -- T[] ) //#define CatStrL // operator + ( L[] L -- L[] ) //#define CatStrF // operator + ( F[] F -- F[] ) #define CatRangeChar catchar__8ucs2charAEC_6uint16_6uint16_8ucs2char_8ucs2charAE // operator + ( T[?] T -- T[] ) //#define CatRangeL // operator + ( L[?] L -- L[] ) //#define CatRangeF // operator + ( F[?] F -- F[] ) //#define CatCstrCstrRt // operator + ( str¢ str¢ -- str ) and retain items //#define CatStrCstrRt // operator + ( str str¢ -- str ) and retain items //#define CatCstrStrRt // operator + ( str¢ str -- str ) and retain items //#define CatStrStrRt // operator + ( str str -- str ) and retain items //#define CatRangeCstrRt // operator + ( str_r str¢ -- str ) and retain items //#define CatRangeStrRt // operator + ( str_r str -- str ) and retain items //#define CatCstrStrRt // operator + ( str¢ str_r -- str ) and retain items //#define CatStrRangeRt // operator + ( str str_r -- str ) and retain items //#define CatRangeRangeRt // operator + ( str_r str_r -- str ) and retain items //#define CatStrIRt // operator + ( I[] I -- I[] ) and retain item //#define Eq_CstrCstr // operator == ( str¢ str¢ -- bool ) //#define Eq_StrCstr // operator == ( str str¢ -- bool ) //#define Eq_CstrStr // operator == ( str¢ str -- bool ) //#define Eq_StrStr // operator == ( str str -- bool ) #define Eq_RangeCstr eq__8ucs2charAEC_6uint16_6uint16_8ucs2charAEC_4bool // operator == ( str_r str¢ -- bool ) #define Eq_CstrRange eq__8ucs2charAEC_8ucs2charAEC_6uint16_6uint16_4bool // operator == ( str¢ str_r -- bool ) #define Eq_RangeRange eq__8ucs2charAEC_6uint16_6uint16_8ucs2charAEC_6uint16_6uint16_4bool // operator == ( str_r str_r -- bool ) //#define Ne_CstrCstr // operator != ( str¢ str¢ -- bool ) //#define Ne_StrCstr // operator != ( str str¢ -- bool ) //#define Ne_CstrStr // operator != ( str¢ str -- bool ) //#define Ne_StrStr // operator != ( str str -- bool ) #define Ne_RangeCstr ne__8ucs2charATOE_8ucs2charAEC_4bool // operator != ( str_r str¢ -- bool ) #define Ne_CstrRange ne__8ucs2charAEC_8ucs2charATOE_4bool // operator != ( str¢ str_r -- bool ) #define Ne_RangeRange ne__8ucs2charAEC_6uint16_6uint16_8ucs2charAEC_6uint16_6uint16_4bool // operator != ( str_r str_r -- bool ) //#define Gt_CstrCstr // operator > ( str¢ str¢ -- bool ) //#define Ge_CstrCstr // operator >= ( str¢ str¢ -- bool ) //#define Le_CstrCstr // operator <= ( str¢ str¢ -- bool ) //#define Lt_CstrCstr // operator < ( str¢ str¢ -- bool ) #define NumStr numstr__5int16_8ucs2charAE // numstr ( int16 -- str ) #define NumStrU numstr__5int16_8ucs2charAE // numstr ( uint64 -- str ) #define NumStrL numstr__5int32_8ucs2charAE // numstr ( int32 -- str ) #define NumStrUL numstr__6uint32_8ucs2charAE // numstr ( uint32 -- str ) #define NumStrF numstr__7float48_8ucs2charAE // numstr ( float -- str ) #define SubStr SubStrc_r // ( str¢ int int -- str[?] ) #define MidStr3 midstr__8ucs2charAEC_5int16_5int16_8ucs2charATOE // ( str¢ int int -- str[?] ) #define MidStr2 midstr__8ucs2charAEC_5int16_8ucs2charATOE // ( str¢ int -- str[?] ) #define LeftStr leftstr__8ucs2charAEC_5int16_8ucs2charATOE // ( str¢ int -- str[?] ) #define RightStr rightstr__8ucs2charAEC_5int16_8ucs2charATOE // ( str¢ int -- str[?] ) // --- file: "microcodes.asm" --- #include "asm/exception.asm" // +++ file: "exception.asm" +++ /* Copyright (c) Günter Woigk 2009 - 2015 mailto:kio@little-bat.de This file is free software This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: ? Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. ? Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* LED Codes: -/yel/grn booting, cpu self test -/yel/- booting, ram test -/-/grn booting, initializing -/-/- running: all Leds off red/-/- OOMEM red/yel/- TODO red/yel/grn PANIC red/-/grn Abort (with message) */ // ======================================================= // Error Exits: // ======================================================= // abort oomem: // out of memory // :OOMEM ( -- ) // red/-/- Oomem: ( -- ) 0:$2978 0:data:led_g=0:$0000 oomem: clr led_grn 0:$2979 0:data:led_y=0:$0000 clr led_yel 0:$297A 0:000011:A1=A0:D0=D0 jp STOP1 0:$297B d15:data:reset=0:$6986 // abort todo: // not yet implemented // TODO: ( -- ) // red/yel/- Todo: ( -- ) 0:$297C 0:data:led_g=0:$0000 todo: clr led_grn 0:$297D 0:data:led_y=1:$0000 set led_yel 0:$297E 0:000011:A1=A0:D0=D0 jp STOP1 0:$297F d15:data:reset=0:$6986 // abort panic: // unexpected situation // PANIC: ( -- ) Panic: ( -- ) 0:$2980 0:data:led_g=1:$0000 panic: set led_grn 0:$2981 0:data:led_y=1:$0000 set led_yel // red/yel/grn 0:$2982 0:000011:A1=A0:D0=D0 jp STOP1 0:$2983 d15:data:reset=0:$6986 // abort with message (hopefully) // ABORT: ( -- ) // red/-/grn Abort: ( -- ) 0:$2984 0:data:led_g=1:$0000 set led_grn 0:$2985 0:data:led_y=0:$0000 clr led_yel // jp STOP1 0:$2986 0:data:led_r=1:$0000 STOP1: set led_red 0:$2987 0:data:clk/4=0:$0000 STOP2: clr clock4 0:$2988 0:data:clk/2=0:$0000 clr clock2 abort // for emulator 0:$2989 0:data:reset=1:$FFFF dw $ffff,abort // * abort do 0:$298A 0:000011:A1=A6:D3=D7 nop, dtmp.oe, atmp.oe // atmp = µC address in macro PANIC, TRAP, OOMEM and TODO 0:$298B 0:000011:A1=A0:D3=D8 nop, alu.oe, ip.oe // alu = TOP 0:$298C 0:000011:A1=A5:D3=D1 nop, mem.oe, hp.oe // HP and 2nd value on vstack 0:$298D 0:000011:A1=A2:D3=D1 nop, mem.oe, sp.oe // SP and top value on rstack 0:$298E 0:000011:A1=A3:D3=D4 nop, d0.oe, a0.oe 0:$298F 0:000011:A1=A4:D3=D5 nop, d1.oe, a1.oe 0:$2990 0:000011:A1=A7:D3=D6 nop, d2.oe, d2ar.oe 0:$2991 0:000011:A1=A6:D3=D0 nop, ival.oe, atmp.oe 0:$2992 0:000011:A1=A6:D3=DD nop, sl.oe 0:$2993 0:000011:A1=A6:D3=DC nop, sr.oe 0:$2994 0:000011:A1=A6:D3=DA nop, swap.oe 0:$2995 0:000011:A1=A6:D3=DE nop, msbit.oe 0:$2996 0:000011:A1=A6:D0=D0 loop 0:$2997 d15:data:reset=0:$698A // --- file: "exception.asm" --- #include "asm/ramtest.asm" // +++ file: "ramtest.asm" +++ /* Copyright (c) Günter Woigk 2009 - 2010 mailto:kio@little-bat.de This file is free software This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: ? Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. ? Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* -------------------------------------------------- Test and Clear Ram Test and clear ram with $0000. PANICs if defective ram found. RamTest should detect defective bits, defective chips, total failure of ram, defective data lines and defective address lines. Note: we can test the data ram, but we cannot test the microcode ram! failure in first loop: defective word at a0: issue with data lines? Bit always 0, always 1, shortened? failure in second loop: defective address lines => folding of addresses RamTest itself does not use any ram. RamTest does not use hp and sp On return alu = 0 so that whole memory = $00 even if alu = TOP is written back Returns via "next_mc" --> jp (*ip++) --> next microcode */ // in: - // out: alu = 0 // mod: alu,dtmp, a0 :Ramtest ( void -- void ) #if !include_ramtest // clear ram: xor alu ld sp,alu // sp = RAMTOP do tstn sp // test for $ffff ld (sp++),alu :z while 0 next_mc #else // Check whole ram word by word: // Store and read 16 x single bit 1 and 16 x single bit 0 0:$025A 0:000011:A3=A1:D3=D0 ld a0,$0000 // a0 -> ram 0:$025B 0:data:reset=0:$0000 do 0:$025C 0:000011:A1=A0:D8=D0 ld alu,$8000 // alu = pattern = $8000 --> $0001 0:$025D 0:data:reset=0:$8000 0:$025E 0:000011:A1=A0:D7=D8 ld dtmp,alu do 0:$025F 0:001011:A1=A0:D8=D8 cpl // test single bit cleared: 0:$0260 0:000011:A1=A3:D1=D8 ld (a0),alu 0:$0261 0:000001:A1=A3:D3=D7 equ dtmp // toggle bits on bus 0:$0262 0:000001:A1=A3:D3=D1 equ (a0) // delay 16 MHz 0:$0263 0:000001:A1=A3:D3=D1 equ (a0) // compare 0:$0264 z:000011:A1=A3:D7=D8 ld dtmp,alu : z 0:$0265 0:000011:A1=A3:D0=D0 jp 0,ee // defective word at a0 0:$0266 d15:data:reset=0:$427F 1:$0265 1:001011:A1=A7:D8=D8 cpl // test single bit set: 1:$0266 1:000011:A1=A3:D1=D8 ld (a0),alu 1:$0267 1:000001:A1=A3:D3=D7 equ dtmp // toggle bits on bus 1:$0268 1:000001:A1=A3:D3=D1 equ (a0) // delay 16 MHz 1:$0269 1:000001:A1=A3:D3=D1 equ (a0) // compare 1:$026A z:000011:A1=A3:D7=D8 ld dtmp,alu : z 0:$026B 0:000011:A1=A7:D0=D0 jp 0,ee // defective word at a0 0:$026C d15:data:reset=0:$427F 1:$026B 1:000011:A1=A3:DC=D8 ld sr,alu,nc // note: data bit 0 on bus 1:$026C d0:000011:A1=A3:D8=DC ld alu,sr : bit0 // note: test for bit0 0:$026D 0:000011:A1=A2:D0=D0 until 1 // note: conditional branch 0:$026E d15:data:reset=0:$425F // same byte, next bit 1:$026D 1:000011:A3=A3:D3=DC inc a0 1:$026E 1:000011:A1=A3:D3=D3 tst a0 1:$026F z:data:reset=0:$0000 until z // next byte 0:$0270 0:000011:A1=A7:D0=D0 0:$0271 d15:data:reset=0:$425C // now: all RAM[?] = $01 // Check for folding (defective address lines) and clear ram to $0000: // ld a0,$0000 // a0 = pointer ist schon // ld dtmp,1 // const: 1 ist schon do 1:$0270 1:000011:A1=A3:D8=D1 ld alu,(a0) 1:$0271 1:001100:A1=A3:D3=D7 sub dtmp // -1 1:$0272 1:001100:A1=A3:D8=D7 1:$0273 z:000011:A3=A3:D1=D8 ld (a0++),alu : z // $01 -> $00 1:$0274 1:000011:A1=A3:D0=D0 while 1 1:$0275 d15:data:reset=0:$C270 // Exit loop if ram cell did not contain $0001: // either due to folded addresses due to defective address line // or because entire 64k were cleared. // a0 points behind the mirrored cell or at $0001 if entire 64k are ok: 0:$0274 0:000001:A1=A7:D8=D8 xor alu // if stopped because 64k have been cleared: 0:$0275 0:010011:A3=A3:D3=D8 ld (--a0),alu // clear ram[$0000] 0:$0276 0:000011:A1=A3:D1=D8 0:$0277 0:000011:A1=A3:D3=D3 tst a0 TRAP !z 0:$0278 z:data:reset=0:$0000 if !z // * TRAP 0:$0279 0:000011:A6=A1:D3=D0 ld atmp,$ // * TRAP 0:$027A 0:data:reset=0:$4279 0:$027B 0:000011:A1=A2:D0=D0 jp PANIC // * TRAP 0:$027C d15:data:reset=0:$6980 1:$0279 1:000011:A1=A7:D0=D0 then // * TRAP 1:$027A d15:data:reset=0:$427D 0:$027D 0:000011:A0=A0:D0=D3 next_mc 0:$027E d15:000011:A1=A0:D0=D0 ee PANIC // PANIC exit from loop 1 0:$027F 0:000011:A6=A1:D3=D0 ld atmp,$ // * PANIC 0:$0280 0:data:reset=0:$427F 0:$0281 0:000011:A1=A2:D0=D0 jp PANIC // * PANIC 0:$0282 d15:data:reset=0:$6980 #endif // --- file: "ramtest.asm" --- #include "asm/mem.asm" // +++ file: "mem.asm" +++ /* Copyright (c) Günter Woigk 2006 - 2012 mailto:kio@little-bat.de This file is free software This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: ? Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. ? Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Memory Management -------------------------------------------------------- This module implements a dynamical memory management with 'handles'. External Calls: abort_oomem Blurb: Dynamically allocated data blocks are referenced by position-independent 'handles'. If a memory request cannot be served immediately, then the garbage collection 'mem_compact' is run. The time stamp grows linearly with the number of allocated blocks and the total allocated data size. For each block 3 words with management info are added: 1 word data size and 1 word pointer + 1 word ref count Pointers are allocated from a pool which grows downwards in direction of the data blocks for global pointers and upwards towards the machine stack for hierarchically nested local pointers. Handles are pointers to these pointers. More than one pointer can point to the same data block. Pointers can point to const data outside the managed data space. Local pointers are allocated on a heap. Releasing one local pointer releases all pointers above it too. Memory Layout: _______________________ mem_end / physical ram end !___________! <---- mem_ptr_end ! ! ! gpointer ! <---- mem_free_ptr !___ ! \_______! <---- mem_ptr_start ____ ! \________ <---- mem_data_end ! ! ! ! ! data ! ! ! ____!___________!______ mem_data_start ____!___________!______ sp_base !___retaddr ! \_______! <---- sp ____ ! \________ <---- hp ! locals ! !___________!______ hp_base !___________!______ ! ! ! globals ! ____!___________!______ $0000 / physical ram start Naming: data block : memory chunk allocated in the 'data' area layout: struct { size, data[size] } memptr : pointer to data.size of a data block memcnt : reference count handle : pointer to a memptr Functions: mem_compact ( -- ) mod: sr pres: d0-d2,a0-a1,alu mem_assert_free ( d0:size -- ) mod: alu,sr pres: d0-d2,a0-a1 new_data_with_size ( d0:size -- a1:memptr ) mod: alu,sr,a1 pres: d0-d2,a0 new_data_with_filler( d0:size d1:fill -- a1:memptr) mod: alu,sr,d0-d1,a1 pres: d2,a0 // new_data_with_data ( d0:size a0->data -- a1:memptr) mod: alu,sr,d0,a0-a1 pres: d1-d2 new_handle ( -- alu:a0:handle ) mod: alu,sr,a0 pres: d0-d2,a1 new_handle_for_ptr_quick(a1:ptr -- alu:a0:handle ) mod: alu,sr,a0 pres: d0-d2,a1 alloc ( d0:size -- alu:a0:handle a1:ptr ) mod: alu,sr,a0-a1 pres: d0-d2 filled_str ( d0:size d1:fill -- alu:a0:handle) mod: alu,sr,a0-a1,d0-d1 pres: d2 // alloc_with_data ( d0:size a1->data -- alu:a0:handle)mod: alu,sr,a0-a1,d0 pres: d1-d2 // del_handle ( a0:handle -- ) mod: -- pres: d0-d2,a0-a1,alu mem_resize_handle mem_shrink_handle ( a0=handle d0=size -- a0=handle ) mod: alu,sr pres:d0-d2,a0-a1 mem_grow_handle ( a0=handle d0=size -- a1->space ) mod: alu,sr,a0-a1 pres:d0-d2 mem_append_handle ( a0=handle1 a1=handle2 -- ) mod: alu,a0-a1,d0-d1 pres: d2 mem_find_handle ( alu=address--a0=handle d0=alu=idx)mod:alu,a0-a1,d0-d1 pres: d2 Opcodes: MEM_COMPACT ( -- ) MEM_GET_FREE_TOTAL ( -- u16:size ) MEM_GET_FREE ( -- u16:size ) MEM_ASSERT_FREE ( size -- ) // NEW_DATA_WITH_SIZE ( size -- memptr ) // alu = a1 -> data.size; data cleared ALLOC ( size -- str ) // a1 -> data.size; data cleared FILLEDSTR ( size filler -- str ) // alu = a1 -> data.size data cleared with filler DROPSTR ( str -- ) // release memory NIPSTR ( str top -- top ) // release memory Millicodes: MemCompact ( -- ) MemGetFreeTotal ( -- size ) MemGetFree ( -- size ) MemAssertFree ( size -- ) // NewDataWithSize ( size -- memptr ) // alu = a1 -> data.size; data cleared Alloc ( size -- str ) // a1 -> data.size; data cleared FilledStr ( size filler -- str ) // alu = a1 -> data.size data cleared with filler DropStr ( str -- ) // release memory NipStr ( str top -- top ) // release memory */ // -------------------------------------------------------- // Garbage Collection // // in: -- // out: -- // mod: sr // pres: alu,d0-d2,a0-a1 :mem0 if 1 MEM_COMPACT: ( -- ) 1:$0046 1:010011:A2=A2:D3=D8 pshr NEXT // return address 1:$0047 1:000011:A1=A2:D1=D0 1:$0048 0:data:reset=0:$5A04 else MemCompact: ( -- ) 0:$0046 0:010011:A2=A2:D3=DF pshr next_mc // return address 0:$0047 0:000011:A1=A2:D1=D0 0:$0048 0:data:reset=0:$5ACF then // jp mem_compact mem_compact: login 0:$0049 0:001010:A1=A2:D2=D8 ld io,alu,d_bits=10 // * login 0:$004A 0:000011:A5=A5:D3=D8 psh alu,a0,a1,d0,d1 // *dtmp* 0:$004B 0:000011:A5=A5:D1=D8 0:$004C 0:000011:A1=A3:D7=D3 0:$004D 0:000011:A5=A5:D1=D7 0:$004E 0:000011:A1=A4:D7=D3 0:$004F 0:000011:A5=A5:D1=D7 0:$0050 0:000011:A5=A5:D1=D4 0:$0051 0:000011:A1=A5:D1=D5 // 1. Loop over Handles: // In the size field of all used data blocks a pointer to the data pointer is stored. // In the data pointer the size is stored. // // If multiple data pointers point to the same data block, then this creates a linked list // data.size -> data_ptr1 -> data_ptr2 -> data_ptr_n = block_size. 0:$0052 0:000011:A3=A1:D3=D0 ld a0,(mem_ptr_end) // a0 -> behind last ptr *dtmp* 0:$0053 0:data:reset=0:$0019 0:$0054 0:000011:A1=A3:D7=D1 0:$0055 0:000011:A3=A1:D3=D7 0:$0056 0:000011:A6=A1:D3=D0 ld d0,(mem_data_start) // d0 -> first data: dyn. data is in range [d0 .. [d1 *atmp* 0:$0057 0:data:reset=0:$0015 0:$0058 0:000011:A1=A6:D4=D1 0:$0059 0:000011:A6=A1:D3=D0 ld d1,(mem_ptr_start) // d1 -> first ptr: also loop end *atmp* 0:$005A 0:data:reset=0:$0017 0:$005B 0:000011:A1=A6:D5=D1 0:$005C 0:000011:A1=A6:D0=D0 jp mem_p1 0:$005D d15:data:reset=0:$C06B do 0:$005E 0:010011:A3=A3:D3=DB dec a0 // step over memcnt 0:$005F 0:000011:A1=A3:D8=D1 ld alu,(a0) // alu = *ptr: must be in range [d0 .. [d1 0:$0060 0:001000:A1=A3:D3=D5 cmp_nc d1 // first_ptr - *ptr -1 0:$0061 0:001000:A1=A3:D3=D5 0:$0062 cy:data:reset=0:$0000 if !cy // !cy => cy => first_ptr - *ptr -1 ? 0 => first_ptr ? *ptr+1 // => first_ptr > *ptr => ptr in use! 0:$0063 0:001100:A1=A0:D3=D4 cmp d0 0:$0064 0:001100:A1=A0:D3=D4 0:$0065 cy:data:reset=0:$0000 if cy // cy => !cy => *ptr-mem_data_start?0 => *ptr?mem_data_start 1:$0066 1:000011:A4=A1:D3=D8 ld a1,alu // a1 -> data.size 1:$0067 1:000011:A1=A4:D8=D1 ld alu,(a1) // alu = data.size 1:$0068 1:000011:A1=A3:D7=D3 ld (a1),a0 // data.size -> ptr *dtmp* 1:$0069 1:000011:A1=A4:D1=D7 1:$006A 1:000011:A1=A3:D1=D8 ld (a0),alu // *ptr := data.size 0:$0066 0:000011:A1=A0:D0=D0 then 0:$0067 d15:data:reset=0:$C06B 1:$0063 1:000011:A1=A7:D0=D0 then 1:$0064 d15:data:reset=0:$C06B 1:$006B 1:000011:A1=A3:D8=D5 mem_p1 ld alu,d1 1:$006C 1:010001:A3=A3:D3=D3 equ a0-- // compare with first_ptr & step 1:$006D z:data:reset=0:$0000 until z 0:$006E 0:000011:A1=A7:D0=D0 0:$006F d15:data:reset=0:$405E // 2. Loop over Data Blocks: // Used blocks and freed blocks can be distinguished by their size field: // size fields of used blocks now contain a pointer to their (first) data_ptr ? mem_data_end // size fields of free blocks still contain their block size < mem_data_end // Unused blocks are skipped. // The data of used blocks is moved downwards to close any gap formed by free blocks. // The size is restored to the size field and the new block address is stored in the data_ptr. // If the data block was shared, then the data_ptr did not contain the block size < mem_data_end // but the address of the the next sharing data_ptr, which is ? mem_data_end. // All data_ptrs are updated to point to the new data location, // until a data_ptr, the last sharing data_ptr, actually contains the block size. // Improvements TODO: // a first loop can skip over data blocks which do not move // until the first released data block is encountered 1:$006E 1:000011:A3=A1:D3=D4 ld a0,d0//(mem_data_start) // a0 -> old data *dtmp* 1:$006F 1:000011:A6=A1:D3=D0 ld d1,(mem_data_end) // for loop end test and for discriminating between ptrs and sizes *atmp* 1:$0070 1:data:reset=0:$0016 1:$0071 1:000011:A1=A6:D5=D1 1:$0072 1:000011:A4=A3:D3=D8 ld a1,a0 // a1 -> new data 1:$0073 1:010011:A4=A4:D3=D8 do 1:$0074 1:000011:A3=A3:D4=D1 ld d0,(a0++) // a0 -> old_data.data; used: d0 -> data_ptr; free: d0 = size 1:$0075 1:000011:A1=A3:D8=D4 ld alu,d0 1:$0076 1:001100:A1=A3:D3=D5 cmp d1 // mem_data_end 1:$0077 1:001100:A1=A3:D3=D5 1:$0078 cy:data:reset=0:$0000 if !cy // !cy => cy => d0 = size => freed block => skip it 0:$0079 0:000000:A1=A3:D3=D3 add a0 // size + old_data.data => alu -> next old_data.size 0:$007A 0:000000:A1=A3:D8=D3 0:$007B 0:000011:A3=A1:D3=D8 ld a0,alu // a0 -> next old data else // block is in use: // d0 -> data_ptr // a0 -> old data.data // a1 -> new data.size // read size (or ptr to other data_ptr) from data_ptr // write new data address into data_ptr // if the read size is ? mem_data_end, then this is a link to another data_ptr. // Then do same with the other data_ptr. 1:$0079 1:000011:A1=A3:D7=D3 ld dtmp,a0 // dtmp -> old_data.data 1:$007A 1:000011:A3=A1:D3=D4 ld a0,d0 // a0 -> (1st) data_ptr 1:$007B 1:000011:A1=A4:D4=D3 ld d0,a1 // d0 -> new data.size do 1:$007C 1:000011:A1=A3:D8=D1 ld alu,(a0) // alu = data.size or ptr -> other data_ptr 1:$007D 1:000011:A1=A3:D1=D4 ld (a0),d0 // store ptr -> new data 1:$007E 1:001100:A1=A3:D3=D5 cmp d1 // mem_data_end 1:$007F 1:001100:A1=A3:D3=D5 1:$0080 cy:000011:A3=A1:D3=D8 ld a0,alu :cy // a0 -> other data_ptr (if alu ? mem_data_end) 1:$0081 1:000011:A1=A1:D0=D0 until 0 // !cy => cy => alu < mem_data_end => alu = data size 1:$0082 d15:data:reset=0:$C07C 0:$0081 0:000011:A4=A4:D1=D8 ld (a1++),alu // store data.size; a1 -> new data.data 0:$0082 0:000011:A3=A1:D3=D7 ld a0,dtmp // a0 -> old_data.data 0:$0083 0:010011:A2=A2:D3=D7 jsr memcpy // a0 -> next old_data.size; a1 -> next new_data.size 0:$0084 0:000011:A1=A2:D1=D0 0:$0085 0:data:reset=0:$4088 0:$0086 0:000011:A1=A0:D0=D0 0:$0087 d15:data:reset=0:$414B 0:$0088 0:000011:A1=A3:D8=D3 ld alu,a0 // alu -> next old data 0:$007C 0:000011:A1=A1:D0=D0 then 0:$007D d15:data:reset=0:$4089 0:$0089 0:000001:A1=A3:D3=D5 equ d1 // compare with mem_data_end 0:$008A z:data:reset=0:$0000 until z 0:$008B 0:000011:A1=A0:D0=D0 0:$008C d15:data:reset=0:$C074 // update sysvar 1:$008B 1:000011:A1=A4:D7=D3 ld (mem_data_end),a1 // *dtmp* *atmp* 1:$008C 1:000011:A6=A1:D3=D0 1:$008D 1:data:reset=0:$0016 1:$008E 1:000011:A1=A6:D1=D7 // clear new space 1:$008F 1:000011:A1=A3:D8=D3 ld alu,a0 1:$0090 1:001100:A1=A4:D3=D3 sub a1 1:$0091 1:001100:A1=A4:D8=D3 1:$0092 1:010011:A2=A2:D3=D3 jsr memclr 1:$0093 1:000011:A1=A2:D1=D0 1:$0094 1:data:reset=0:$C097 1:$0095 1:000011:A1=A0:D0=D0 1:$0096 d15:data:reset=0:$42B1 // exit 1:$0097 1:010011:A5=A5:D5=D1 pop d1,d0,a1,a0,alu // *dtmp* 1:$0098 1:010011:A5=A5:D4=D1 1:$0099 1:010011:A5=A5:D7=D1 1:$009A 1:000011:A4=A1:D3=D7 1:$009B 1:010011:A5=A5:D7=D1 1:$009C 1:000011:A3=A1:D3=D7 1:$009D 1:010011:A5=A5:D8=D1 logout 1:$009E 1:001011:A1=A5:D2=D8 ld io,alu,d_bits=11 // * logout 1:$009F 1:000011:A2=A2:D0=D1 ret // *post* 1:$00A0 d15:data:reset=0:$0000 // -------------------------------------------- // allocate handle and data: // // in: d0 = size // out: alu = a0 = handle // a1 = memptr // mod: alu,sr,a0,a1 // pres: d0-d2 // :mem2 if 1 ALLOC: ( size -- str ) // a1 -> data.size; data actually cleared 1:$0203 1:010011:A2=A2:D3=D8 pshr NEXT 1:$0204 1:000011:A1=A2:D1=D0 1:$0205 0:data:reset=0:$5A04 else Alloc: ( size -- str ) // a1 -> data.size; data actually cleared 0:$0203 0:010011:A2=A2:D3=D8 pshr next_mc 0:$0204 0:000011:A1=A2:D1=D0 0:$0205 0:data:reset=0:$5ACF then 0:$0206 0:000011:A1=A2:D4=D8 ld d0,alu // jp alloc alloc: 0:$0207 0:010011:A2=A2:D3=D8 pshr new_handle_for_ptr_quick 0:$0208 0:000011:A1=A2:D1=D0 0:$0209 0:data:reset=0:$45CF // jp new_data_with_size // -------------------------------------------- // allocate data: // asserts 2 words free for a pointer+refcnt without mem_compact() // runs mem_compact() if needed // // in: d0 = size // out: a1 = memptr -> data.size // d0 = size (pres.) // mod: alu,sr,a1 // pres:d0-d2,a0 // new_data_with_size: 0:$020A 0:000011:A6=A1:D3=D0 ld atmp,mem_data_end // atmp->mem_data_end 0:$020B 0:data:reset=0:$0016 0:$020C 0:000011:A6=A6:D8=D1 ld alu,(atmp++) // alu = mem_data_end atmp->mem_ptr_start 0:$020D 0:000011:A1=A6:D7=D8 ld dtmp,alu // dtmp = mem_data_end 0:$020E 0:000100:A1=A6:D3=D4 add_c d0 // alu = new mem_data_end 0:$020F 0:000100:A1=A6:D8=D4 0:$0210 cy:000011:A1=A6:D0=D0 jp cy,p1 // cy => new mem_data_end ? $10000 1:$0211 d15:data:reset=0:$421D 0:$0211 d15:data:reset=0:$4212 0:$0212 0:010011:A6=A6:DF=D1 ld d2ar,(atmp--) // d2ar = mem_ptr_start atmp->mem_data_end 0:$0213 0:010011:A4=A7:D3=D8 ld a1,d2ar-1 // a1 = mem_ptr_start -1 0:$0214 0:001100:A1=A4:D3=D3 cmp a1 // new mem_data_end - (mem_ptr_start-1) 0:$0215 0:001100:A1=A4:D3=D3 0:$0216 cy:000011:A1=A4:D0=D0 jp cy,p1 // cy => !cy => new mem_data_end ? (mem_ptr_start-1) 1:$0217 d15:data:reset=0:$421D 0:$0217 d15:data:reset=0:$4218 // ((mem_ptr_start!=$0000!!)) 0:$0218 0:000011:A4=A1:D3=D7 p2 ld a1,dtmp 0:$0219 0:000011:A1=A4:D1=D4 ld (a1),d0 // data.size = size 0:$021A 0:000011:A1=A6:D1=D8 ld (atmp),alu // update mem_data_end 0:$021B 0:000011:A2=A2:D0=D1 ret // a1 -> data.size; d0 = size *post* 0:$021C d15:data:reset=0:$0000 // no space => compact & retry 0:$021D 0:010011:A2=A2:D3=D8 p1 jsr mem_compact 0:$021E 0:000011:A1=A2:D1=D0 0:$021F 0:data:reset=0:$4222 0:$0220 0:000011:A1=A2:D0=D0 0:$0221 d15:data:reset=0:$4049 0:$0222 0:000011:A6=A1:D3=D0 ld atmp,mem_data_end // atmp->mem_data_end 0:$0223 0:data:reset=0:$0016 0:$0224 0:000011:A6=A6:D8=D1 ld alu,(atmp++) // alu = mem_data_end atmp->mem_ptr_start 0:$0225 0:000011:A1=A6:D7=D8 ld dtmp,alu // dtmp = mem_data_end 0:$0226 0:000100:A1=A6:D3=D4 add_c d0 // alu = new mem_data_end 0:$0227 0:000100:A1=A6:D8=D4 0:$0228 cy:000011:A1=A6:D0=D0 jp cy,p1 // cy => new mem_data_end ? $10000 1:$0229 d15:data:reset=0:$421D 0:$0229 d15:data:reset=0:$422A 0:$022A 0:010011:A6=A6:DF=D1 ld d2ar,(atmp--) // d2ar = mem_ptr_start atmp->mem_data_end 0:$022B 0:010011:A4=A7:D3=D8 ld a1,d2ar-1 // a1 = mem_ptr_start -1 0:$022C 0:001100:A1=A4:D3=D3 cmp a1 // new mem_data_end - (mem_ptr_start-1) 0:$022D 0:001100:A1=A4:D3=D3 0:$022E cy:000011:A1=A4:D0=D0 jp !cy,p2 0:$022F d15:data:reset=0:$4218 1:$022F d15:data:reset=0:$C230 1:$0230 1:000011:A1=A2:D0=D0 jp oomem // cy => !cy => new mem_data_end ? (mem_ptr_start-1) 1:$0231 d15:data:reset=0:$6978 // ((mem_ptr_start!=$0000!!)) // -------------------------------------------- // allocate data: // in: d0 = size // d1 = filler // out: a1 -> data.size // alu=a0=handle // mod: alu,sr,a0-a1,d0-d1 // pres:d2 // :mem3 if 1 FILLEDSTR: ( len filler -- str ) // alu = a1 -> data.size 1:$07CA 1:010011:A2=A2:D3=D8 pshr NEXT 1:$07CB 1:000011:A1=A2:D1=D0 1:$07CC 0:data:reset=0:$5A04 else FilledStr: ( len filler -- str ) // alu = a1 -> data.size 0:$07CA 0:010011:A2=A2:D3=DF pshr next_mc 0:$07CB 0:000011:A1=A2:D1=D0 0:$07CC 0:data:reset=0:$5ACF then 0:$07CD 0:010011:A5=A5:D4=D1 pop d0 // size 0:$07CE 0:000011:A1=A5:D5=D8 ld d1,alu // filler 0:$07CF 0:000011:A1=A5:D0=D0 jp filled_str 0:$07D0 d15:data:reset=0:$44EB :mem5 if 1 SPACESTR: ( len -- str ) 1:$04E5 1:010011:A2=A2:D3=DD pshr NEXT 1:$04E6 1:000011:A1=A2:D1=D0 1:$04E7 0:data:reset=0:$5A04 else SpaceStr: ( len -- str ) 0:$04E5 0:010011:A2=A2:D3=DF pshr next_mc 0:$04E6 0:000011:A1=A2:D1=D0 0:$04E7 0:data:reset=0:$5ACF then 0:$04E8 0:000011:A1=A2:D4=D8 ld d0,alu 0:$04E9 0:000011:A1=A2:D5=D0 ld d1,' ' 0:$04EA 0:data:reset=0:$0020 // jp filled_str filled_str: 0:$04EB 0:010011:A2=A2:D3=D8 pshr new_handle_for_ptr_quick 0:$04EC 0:000011:A1=A2:D1=D0 0:$04ED 0:data:reset=0:$45CF // jp new_data_with_filler // -------------------------------------------- // allocate data: // asserts one word free for a pointer without mem_compact() // runs mem_compact() if needed // // in: d0 = size // d1 = filler // out: a1 = memptr // mod: alu,sr,a1,d0-d1 // pres:a0,d2 // new_data_with_filler: 0:$04EE 0:010011:A2=A2:D3=DF jsr new_data_with_size // ( d0=size -- a1->data.size ) mod:alu,sr,a1 pres:d0-d2,a0 0:$04EF 0:000011:A1=A2:D1=D0 0:$04F0 0:data:reset=0:$44F3 0:$04F1 0:000011:A1=A4:D0=D0 0:$04F2 d15:data:reset=0:$420A 0:$04F3 0:000011:A1=A2:D4=D5 ld d0,d1 // d0=filler 0:$04F4 0:000011:A1=A4:D5=D3 ld d1,a1 // d1=memptr 0:$04F5 0:000011:A4=A4:D8=D1 ld alu,(a1++) // alu=count, a1->dest 0:$04F6 0:010011:A2=A2:D3=D8 jsr memset // ( a1->dest alu=count d0=filler ) mod: alu,sr,a1 pres:d0-d2,a0 0:$04F7 0:000011:A1=A2:D1=D0 0:$04F8 0:data:reset=0:$44FB 0:$04F9 0:000011:A1=A4:D0=D0 0:$04FA d15:data:reset=0:$42B3 0:$04FB 0:000011:A4=A1:D3=D5 ld a1,d1 // a1=memptr 0:$04FC 0:000011:A2=A2:D0=D1 ret 0:$04FD d15:data:reset=0:$0000 // ======================================================== // handles // ======================================================== // -------------------------------------------- // get a new handle for a memptr: // two words free must be asserted! e.g. by new_data_with_xxx() // does not run mem_compact(). // in: a1 = memptr // out: alu = a0 = handle // handle is retained // mod: alu,sr,a0 // pres: a1, d0-d2 // :new_handle_for_ptr_quick 0:$05CF 0:000011:A6=A1:D3=D0 ld atmp,mem_free_ptr // get ptr from free_list 0:$05D0 0:data:reset=0:$0018 0:$05D1 0:000011:A1=A6:D8=D1 ld alu,(atmp) // delay 0:$05D2 0:000011:A1=A6:D8=D1 ld alu,(atmp) 0:$05D3 z:data:reset=0:$0000 if !z // got one: 0:$05D4 0:000011:A3=A1:D3=D8 ld a0,alu // a0 = alu = handle 0:$05D5 0:000011:A1=A3:D7=D1 ld (atmp),(a0) // update mem_free_ptr *dtmp* 0:$05D6 0:000011:A1=A6:D1=D7 0:$05D7 0:000011:A1=A4:D7=D3 ld (a0++),a1 // store data_ptr *dtmp* 0:$05D8 0:000011:A3=A3:D1=D7 0:$05D9 0:010011:A3=A3:D1=D0 ld (a0--),1 0:$05DA 0:data:reset=0:$0001 0:$05DB 0:000011:A2=A2:D0=D1 ret // *post* 0:$05DC d15:data:reset=0:$0000 else // free_list empty: 1:$05D4 1:000011:A6=A1:D3=D0 ld atmp,mem_ptr_start // atmp -> mem_ptr_start 1:$05D5 1:data:reset=0:$0017 1:$05D6 1:000011:A1=A6:D7=D1 ld dtmp,(atmp) // dtmp = mem_ptr_start 1:$05D7 1:010011:A3=A1:D3=D7 ld dnop,dtmp,a0.clk,dxa.oe,sub2 // a0 = mem_ptr_start-2 = new mem_ptr_start 1:$05D8 1:000011:A1=A3:D8=D3 ld alu,a0 // alu = a0 = new mem_ptr_start = new handle 1:$05D9 1:000011:A1=A6:D1=D8 ld (atmp),alu // update mem_ptr_start 1:$05DA 1:000011:A1=A4:D7=D3 ld (a0++),a1 // store data_ptr *dtmp* 1:$05DB 1:000011:A3=A3:D1=D7 1:$05DC 1:010011:A3=A3:D1=D0 ld (a0--),1 1:$05DD 1:data:reset=0:$0001 1:$05DE 1:000011:A2=A2:D0=D1 ret // *post* 1:$05DF d15:data:reset=0:$0000 then // -------------------------------------------- // get a new handle: // may run mem_compact() // the memptr is preset so that mem_compact() can be run safely // before a dataptr is stored in the memptr // in: -- // out: alu=a0=handle // mod: alu,a0,sr // pres: d0-d2,a1 // :new_handle 0:$0443 0:000011:A6=A1:D3=D0 ld atmp,mem_free_ptr // atmp -> linked list of free mem pointers 0:$0444 0:data:reset=0:$0018 0:$0445 0:000011:A1=A6:D8=D1 ld alu,(atmp) // delay 0:$0446 0:000011:A1=A6:D8=D1 ld alu,(atmp) // get address of free memptr 0:$0447 z:000011:A3=A1:D3=D8 ld a0,alu :z // a0 = alu = handle if 0 // !z -> got one 0:$0448 0:000011:A3=A3:D7=D1 ld (atmp),(a0++) // update mem_free_ptr -> next in linked list *dtmp* 0:$0449 0:000011:A1=A6:D1=D7 0:$044A 0:010011:A3=A3:D1=D0 ld (a0--),1 // refcnt := 1 0:$044B 0:data:reset=0:$0001 // ld (a0),0 // note: free memptr is mem_compact()-safe: 0 or address_of_next_free_ptr > mem_ptr_start 0:$044C 0:000011:A2=A2:D0=D1 ret // 0:$044D d15:data:reset=0:$0000 else // free_list is empty => get ptr at start of pointers 1:$0448 1:000011:A6=A1:D3=D0 ld atmp,mem_ptr_start 1:$0449 1:data:reset=0:$0017 1:$044A 1:010011:A6=A6:DF=D1 ld d2ar,(atmp--) // d2ar -> last used memptr; atmp -> mem_data_end 1:$044B 1:010011:A3=A7:D3=D8 ld a0,d2ar-1 // a0 -> new memcnt 1:$044C 1:000011:A1=A3:D8=D3 ld alu,a0 // alu = mem_ptr_start-1 1:$044D 1:001000:A1=A6:D3=D1 sub_nc (atmp++) // alu = mem_ptr_start-1-mem_data_end-1 = gap_sz - 2 1:$044E 1:001000:A6=A6:D8=D1 // atmp -> mem_ptr_start 1:$044F cy:data:reset=0:$0000 if cy // cy=!cy -> gap_sz - 2 ? 0 -> gap_sz ? 2 1:$0450 1:010011:A3=A3:D1=D0 p1 ld (a0--),1 // memcnt = 1; a0 -> memptr 1:$0451 1:data:reset=0:$0001 // ld (a0),0 // make memptr mem_compact()-safe note: must be 0 1:$0452 1:000011:A1=A3:D8=D3 ld alu,a0 // alu = a0 = handle 1:$0453 1:000011:A1=A6:D1=D8 ld (atmp),alu // update mem_ptr_start 1:$0454 1:000011:A2=A2:D0=D1 ret // *post* 1:$0455 d15:data:reset=0:$0000 else 0:$0450 0:010011:A2=A2:D3=DF jsr mem_compact // pres. alu,a0-a1,d0-d2 0:$0451 0:000011:A1=A2:D1=D0 0:$0452 0:data:reset=0:$4455 0:$0453 0:000011:A1=A4:D0=D0 0:$0454 d15:data:reset=0:$4049 0:$0455 0:000011:A6=A1:D3=D0 ld atmp,mem_ptr_start 0:$0456 0:data:reset=0:$0017 0:$0457 0:010011:A6=A6:DF=D1 ld d2ar,(atmp--) // d2ar -> last used memptr 0:$0458 0:010011:A3=A7:D3=D8 ld a0,d2ar-1 // a0 -> new memcnt 0:$0459 0:000011:A1=A3:D8=D3 ld alu,a0 // alu = mem_ptr_start-1 0:$045A 0:001000:A1=A6:D3=D1 sub_nc (atmp++) // alu = mem_ptr_start-1-mem_data_end-1 = gap_sz - 2 0:$045B 0:001000:A6=A6:D8=D1 0:$045C cy:000011:A1=A6:D0=D0 jp cy,p1 // cy=!cy -> gap_sz - 2 ? 0 -> gap_sz ? 2 1:$045D d15:data:reset=0:$C450 0:$045D d15:data:reset=0:$445E 0:$045E 0:000011:A1=A4:D0=D0 jp oomem 0:$045F d15:data:reset=0:$6978 then then // -------------------------------------------- // find block which contains an address // the address must actually point inside an allocated block // or the returned handle/index are meaningless // in: alu = address // out: a0 = handle // d0 = alu = index // pres: d2 // :mem_find_handle login 0:$0305 0:001010:A1=A0:D2=D8 ld io,alu,d_bits=10 // * login TODO // anpassung wg. memcnt 0:$0306 0:000011:A6=A1:D3=D0 ld atmp,$ // * TODO 0:$0307 0:data:reset=0:$4306 0:$0308 0:000011:A1=A3:D0=D0 jp TODO // * TODO 0:$0309 d15:data:reset=0:$697C 0:$030A 0:000011:A1=A1:D5=D8 ld d1,alu // d1 = address 0:$030B 0:000011:A4=A1:D3=D0 ld a1,(mem_ptr_start) // a1 = pointer in memptrs dtmp 0:$030C 0:data:reset=0:$0017 0:$030D 0:000011:A1=A4:D7=D1 0:$030E 0:000011:A4=A1:D3=D7 0:$030F 0:000011:A6=A1:D3=D0 ld alu,(mem_ptr_end) // atmp 0:$0310 0:data:reset=0:$0019 0:$0311 0:000011:A1=A6:D8=D1 0:$0312 0:001000:A1=A4:D3=D3 sub_nc a1 0:$0313 0:001000:A1=A4:D8=D3 0:$0314 0:000011:A6=A1:D3=D8 ld atmp,alu // atmp = loop counter 0:$0315 0:000011:A1=A1:D4=D0 ld d0,0 // d0 = 0 = 'best' memptr so far 0:$0316 0:data:reset=0:$0000 0:$0317 0:000011:A3=A1:D3=D4 ld a0,d0 // a0 = 0 = 'best' handle so far do 0:$0318 0:000011:A4=A4:D8=D1 ld alu,(a1++) // alu = next memptr 0:$0319 0:001100:A1=A4:D3=D4 cmp d0 // new memptr - old memptr 0:$031A 0:001100:A1=A4:D3=D4 0:$031B cy:000011:A1=A4:D0=D0 jp !cy,n // !cy => cy => new < old => worse than current 'best' 0:$031C d15:data:reset=0:$4323 1:$031C d15:data:reset=0:$C31D 1:$031D 1:001000:A1=A3:D3=D5 cmp_nc d1 // new memptr - address -1 1:$031E 1:001000:A1=A3:D3=D5 1:$031F cy:000011:A1=A3:D0=D0 jp cy,n // cy => !cy => new memptr > address 1:$0320 d15:data:reset=0:$4323 0:$0320 d15:data:reset=0:$4321 // new 'best' candidate: 0:$0321 0:010011:A3=A4:D3=D8 ld a0,a1-1 0:$0322 0:000011:A1=A4:D4=D8 ld d0,alu 0:$0323 0:010011:A6=A6:D3=D3 n tst atmp-- 0:$0324 z:data:reset=0:$0000 while !z 0:$0325 0:000011:A1=A0:D0=D0 0:$0326 d15:data:reset=0:$4318 // now a0/d0 should be the memblock which contains the var: 1:$0325 1:000011:A1=A7:D8=D5 ld alu,d1 // address 1:$0326 1:001000:A1=A7:D3=D4 sub_nc d0 // alu = index = address - memptr -1 1:$0327 1:001000:A1=A7:D8=D4 1:$0328 1:000011:A1=A7:D4=D8 ld d0,alu 1:$0329 1:000011:A2=A2:D0=D1 ret // a0 = handle 1:$032A d15:data:reset=0:$0000 // -------------------------------------------- // resize handle: // in: a0=handle // d0=new size // out: a1->start of appended space (only if grown) // pres:d0-d2 // :mem_resize_handle // login // TODO 0:$0425 0:000011:A1=A3:DF=D1 ld d2ar,(a0) // d2ar = memptr 0:$0426 0:000011:A1=A7:D8=D1 ld alu,(d2ar) // alu = mem.size 0:$0427 0:001100:A1=A7:D3=D4 cmp d0 // oldsize-newsize 0:$0428 0:001100:A1=A7:D3=D4 0:$0429 cy:000011:A1=A7:D0=D0 jp !cy,mem_grow_handle // !cy => cy => oldsize-newsize<0 => oldsizemem.data 0:$0431 0:000011:A1=A7:D8=D4 ld alu,d0 // alu=new size 0:$0432 0:000000:A1=A6:D3=D3 add atmp // alu=memptr+1+size -> gap 0:$0433 0:000000:A1=A6:D8=D3 0:$0434 0:000011:A6=A1:D3=D8 ld atmp,alu // atmp->gap.size 0:$0435 0:000011:A1=A1:D8=D7 ld alu,dtmp // alu=old size 0:$0436 0:001000:A1=A1:D3=D4 sub_nc d0 // alu=old size-new size -1 = gap.size 0:$0437 0:001000:A1=A1:D8=D4 0:$0438 0:000011:A1=A6:D1=D8 ld (atmp),alu // gap.size := alu 0:$0439 0:000011:A2=A2:D0=D1 ret // post 0:$043A d15:data:reset=0:$0000 mem_shrink_handle_cond: // login // TODO 0:$043B 0:000011:A1=A3:DF=D1 ld d2ar,(a0) // d2ar = memptr 0:$043C 0:000011:A1=A7:D8=D1 ld alu,(d2ar) // alu = old len 0:$043D 0:001000:A1=A7:D3=D4 cmp_nc d0 // oldlen - newlen -1 0:$043E 0:001000:A1=A7:D3=D4 0:$043F cy:000011:A1=A7:D0=D0 jp cy,mem_shrink_handle// cy => !cy => oldlen -newlen -1 ? 0 => newlenstart of appended space // mod: alu,a0-a1 // pres:d0-d2 // :mem_grow_handle_cond // login // TODO 0:$059A 0:000011:A1=A3:DF=D1 ld d2ar,(a0) // d2ar = memptr 0:$059B 0:000011:A1=A7:D8=D1 ld alu,(d2ar) // alu = old len 0:$059C 0:001100:A1=A7:D3=D4 cmp d0 // oldlen - newlen 0:$059D 0:001100:A1=A7:D3=D4 0:$059E cy:data:reset=0:$0000 ret cy // cy => !cy => newlen?oldlen 1:$059F 1:000011:A2=A2:D0=D1 1:$05A0 d15:data:reset=0:$0000 mem_grow_handle: // login // TODO 0:$059F 0:010011:A2=A2:D3=D8 jsr new_data_with_size // out:a1=ptr mod: alu,sr,a1 pres: d0-d2,a0 0:$05A0 0:000011:A1=A2:D1=D0 0:$05A1 0:data:reset=0:$45A4 0:$05A2 0:000011:A1=A5:D0=D0 0:$05A3 d15:data:reset=0:$420A 0:$05A4 0:000011:A1=A3:D8=D1 ld alu,(a0) // alu = old memptr 0:$05A5 0:000011:A1=A4:D7=D3 ld (a0),a1 // *handle = new memptr dtmp 0:$05A6 0:000011:A1=A3:D1=D7 0:$05A7 0:000011:A3=A1:D3=D8 ld a0,alu // a0 = old memptr 0:$05A8 0:000011:A3=A3:D8=D1 ld alu,(a0++) // alu = oldlen; a0->olddata.data 0:$05A9 0:000011:A4=A4:D3=D8 inc a1 // a1->newdata.data 0:$05AA 0:000011:A1=A4:D0=D0 jp memcpy 0:$05AB d15:data:reset=0:$414B // -------------------------------------------- // append data from handle a1 to data from handle a0 // handle a1: not modified and not released // // in: a0=handle1 // a1=handle2 // out: -- // mod: alu,a0-a1,d0-d1 // pres:d2 // :mem_append_handle 0:$05AC 0:000011:A1=A3:DF=D1 ld d2ar,(a0) // memptr1 0:$05AD 0:000011:A1=A7:D8=D1 ld alu,(d2ar) // alu=size1 0:$05AE 0:000011:A1=A4:DF=D1 ld d2ar,(a1) // memptr2 0:$05AF 0:000000:A1=A7:D3=D1 add (d2ar) // alu=size1+size2 0:$05B0 0:000000:A1=A7:D8=D1 0:$05B1 cy:000011:A1=A7:D4=D8 ld d0,alu :cy // d0=size1+size2 1:$05B2 1:000011:A1=A7:D0=D0 jp 1,oomem // size1+size2>$ffff 1:$05B3 d15:data:reset=0:$6978 0:$05B2 0:000011:A1=A4:D5=D3 ld d1,a1 // d1=handle2 0:$05B3 0:010011:A2=A2:D3=D3 jsr mem_grow_handle // a1->start of appended space pres: d0-d2,a0 0:$05B4 0:000011:A1=A2:D1=D0 0:$05B5 0:data:reset=0:$45B8 0:$05B6 0:000011:A1=A5:D0=D0 0:$05B7 d15:data:reset=0:$459F 0:$05B8 0:000011:A3=A1:D3=D5 ld a0,d1 // a0=handle2 0:$05B9 0:000011:A1=A3:D7=D1 ld a0,(a0) // a0=ptr2 dtmp 0:$05BA 0:000011:A3=A1:D3=D7 0:$05BB 0:000011:A3=A3:D8=D1 ld alu,(a0++) // alu=len2 0:$05BC 0:000011:A1=A3:D0=D0 jp memcpy 0:$05BD d15:data:reset=0:$414B #if 0 // -------------------------------------------- // allocate data: // in: d0 = size // d1 = filler // out: a1 -> data.size // alu=a0=handle // mod: alu,sr,a0-a1,d0-d1 // pres:d2 // :NEW_DATA_WITH_SIZE ( size -- memptr ) // alu = a1 -> data.size; data cleared ld d0,alu jsr new_data_with_size ld alu,a1 next_op :NewDataWithSize ( size -- memptr ) // alu = a1 -> data.size; data cleared ld d0,alu jsr new_data_with_size ld alu,a1 next_mc #endif // -------------------------------------------------------- // Get amount of immediately available memory // which will not trigger the garbage collection. // note: Returns the raw available size -3 ? 0 // This asserts a request for the returned size. // Except if the returned size = 0; then even a dup_pointer may fail. // :mem4 if 1 MEM_GET_FREE: ( -- u16:size ) 1:$05BE 1:010011:A2=A2:D3=DF pshr NEXT 1:$05BF 1:000011:A1=A2:D1=D0 1:$05C0 0:data:reset=0:$5A04 else MemGetFree: ( -- size ) 0:$05BE 0:010011:A2=A2:D3=DB pshr next_mc 0:$05BF 0:000011:A1=A2:D1=D0 0:$05C0 0:data:reset=0:$5ACF then 0:$05C1 0:000011:A5=A5:D3=DF psh alu 0:$05C2 0:000011:A1=A5:D1=D8 0:$05C3 0:000011:A6=A1:D3=D0 ld atmp,mem_ptr_start 0:$05C4 0:data:reset=0:$0017 0:$05C5 0:000011:A1=A0:D8=D0 ld alu,-3 // alu = -3 0:$05C6 0:data:reset=0:$FFFD 0:$05C7 0:010000:A1=A6:D3=D1 add (atmp--) // alu = mem_ptr_start -3 0:$05C8 0:010000:A6=A6:D8=D1 0:$05C9 0:001100:A1=A6:D3=D1 sub (atmp) // mem_ptr_start -3 -mem_data_end 0:$05CA 0:001100:A1=A6:D8=D1 0:$05CB cy:data:reset=0:$0000 if cy 1:$05CC 1:000011:A2=A2:D0=D1 ret 1:$05CD d15:data:reset=0:$0000 else 0:$05CC 0:000001:A1=A0:D8=D8 xor alu 0:$05CD 0:000011:A2=A2:D0=D1 ret // post 0:$05CE d15:data:reset=0:$0000 then // -------------------------------------------------------- // Test whether d0+2 bytes are available. // note: d0=req.size +1=data.size +1=memptr // runs mem_compact() if needed. // // in: d0 = requested size // out: d0 = size (pres.) // mod: alu,sr // pres: d0-d2,a0-a1 // :mem1 if 1 MEM_ASSERT_FREE: ( size -- ) 1:$034B 1:000011:A1=A7:D4=D8 ld d0,alu 1:$034C 1:010011:A2=A2:D3=D8 pshr DROP // return address 1:$034D 1:000011:A1=A2:D1=D0 1:$034E 0:data:reset=0:$5F47 else MemAssertFree: ( size -- ) 0:$034B 0:000011:A1=A0:D4=D8 ld d0,alu 0:$034C 0:010011:A2=A2:D3=D8 pshr Drop // return address 0:$034D 0:000011:A1=A2:D1=D0 0:$034E 0:data:reset=0:$5F33 then // jp mem_assert_free mem_assert_free: login 0:$034F 0:001010:A1=A7:D2=D8 ld io,alu,d_bits=10 // * login TODO // assert d0+3 bytes 0:$0350 0:000011:A6=A1:D3=D0 ld atmp,$ // * TODO 0:$0351 0:data:reset=0:$4350 0:$0352 0:000011:A1=A3:D0=D0 jp TODO // * TODO 0:$0353 d15:data:reset=0:$697C 0:$0354 0:000011:A6=A1:D3=D0 ld atmp,mem_ptr_start 0:$0355 0:data:reset=0:$0017 0:$0356 0:010011:A6=A6:D8=D1 ld alu,(atmp--) // mem_ptr_start 0:$0357 0:001000:A1=A6:D3=D1 sub_nc (atmp) // -mem_data_end -1 0:$0358 0:001000:A1=A6:D8=D1 0:$0359 cy:000011:A1=A6:D0=D0 jp !cy,p1 // !cy => cy => mem_ptr_start ? mem_data_end => mem_ptr_start == mem_data_end 0:$035A d15:data:reset=0:$435E 1:$035A d15:data:reset=0:$C35B 1:$035B 1:001000:A1=A3:D3=D4 sub_nc d0 // -size -1 1:$035C 1:001000:A1=A3:D8=D4 1:$035D cy:data:reset=0:$0000 ret cy // cy => !cy => remaining space ? 0 1:$035E 1:000011:A2=A2:D0=D1 1:$035F d15:data:reset=0:$0000 0:$035E 0:010011:A2=A2:D3=DF p1 jsr mem_compact // compact & try again: 0:$035F 0:000011:A1=A2:D1=D0 0:$0360 0:data:reset=0:$4363 0:$0361 0:000011:A1=A3:D0=D0 0:$0362 d15:data:reset=0:$4049 0:$0363 0:000011:A6=A1:D3=D0 ld atmp,mem_ptr_start 0:$0364 0:data:reset=0:$0017 0:$0365 0:010011:A6=A6:D8=D1 ld alu,(atmp--) // mem_ptr_start 0:$0366 0:001000:A1=A6:D3=D1 sub_nc (atmp) // -mem_data_end -1 0:$0367 0:001000:A1=A6:D8=D1 0:$0368 cy:000011:A1=A6:D0=D0 jp !cy,oomem 0:$0369 d15:data:reset=0:$6978 1:$0369 d15:data:reset=0:$C36A 1:$036A 1:001000:A1=A3:D3=D4 sub_nc d0 // -size -1 1:$036B 1:001000:A1=A3:D8=D4 1:$036C cy:data:reset=0:$0000 ret cy 1:$036D 1:000011:A2=A2:D0=D1 1:$036E d15:data:reset=0:$0000 0:$036D 0:000011:A1=A7:D0=D0 jp oomem 0:$036E d15:data:reset=0:$6978 // -------------------------------------------- // peek & retain handle // retain handle // NULL-safe // :PeekStr ( str& -- str ) 0:$0665 0:000011:A4=A1:D3=D8 ld a1,alu // a1->strvar 0:$0666 0:000011:A1=A4:D8=D1 ld alu,(a1) // alu=handle Retain: ( str -- str ) 0:$0667 0:000011:A6=A1:D3=D8 ld atmp,alu 0:$0668 z:000011:A1=A1:D0=D0 jp z,next_mc 1:$0669 d15:data:reset=0:$5ACF 0:$0669 d15:data:reset=0:$466A 0:$066A 0:000001:A1=A6:D8=D8 xor alu 0:$066B 0:000011:A6=A6:D3=D8 inc atmp // *combine* 0:$066C 0:000100:A1=A6:D3=D1 add_c (atmp) 0:$066D 0:000100:A1=A6:D8=D1 0:$066E 0:010011:A6=A6:D1=D8 ld (atmp--),alu 0:$066F 0:000011:A1=A6:D8=D3 ld alu,atmp 0:$0670 0:000011:A0=A0:D0=D3 next_mc 0:$0671 d15:000011:A1=A0:D0=D0 :PEEKSTR ( str& -- str ) 0:$12B1 0:000011:A4=A1:D3=D8 ld a1,alu // a1->strvar 0:$12B2 0:000011:A1=A4:D8=D1 ld alu,(a1) // alu=handle RETAIN: ( str -- str ) 0:$12B3 0:000011:A6=A1:D3=D8 ld atmp,alu 0:$12B4 z:000011:A1=A1:D0=D0 jp z,NEXT 1:$12B5 d15:data:reset=0:$5A04 0:$12B5 d15:data:reset=0:$52B6 0:$12B6 0:000001:A1=A2:D8=D8 xor alu 0:$12B7 0:000011:A6=A6:D3=D8 inc atmp // *combine* 0:$12B8 0:000100:A1=A6:D3=D1 add_c (atmp) 0:$12B9 0:000100:A1=A6:D8=D1 0:$12BA 0:010011:A6=A6:D1=D8 ld (atmp--),alu 0:$12BB 0:000011:A1=A6:D8=D3 ld alu,atmp 0:$12BC 0:000011:A0=A0:D0=D1 next_op // *post* 0:$12BD d15:data:reset=0:$0000 // -------------------------------------------- // Release memory // NULL-safe // :NipStr ( str top -- top ) // release memory 0:$057E 0:000011:A1=A5:D7=D1 ld dtmp,(hp) 0:$057F 0:000011:A1=A5:D1=D8 ld (hp),alu 0:$0580 0:000011:A1=A5:D8=D7 ld alu,dtmp // jp DropStr DropStr: ( str -- ) // release memory 0:$0581 0:000011:A6=A1:D3=D8 ld atmp,alu // atmp -> memptr 0:$0582 z:000011:A6=A6:D3=D8 inc atmp :z // atmp -> memcnt 1:$0583 1:000011:A1=A7:D0=D0 jp 1,Drop // null 1:$0584 d15:data:reset=0:$5F33 0:$0583 0:000011:A1=A6:DF=D1 ld d2ar,(atmp) // d2ar = memcnt 0:$0584 0:010011:A3=A7:D3=D8 ld a0,d2ar-1 // a0 = memcnt-1 0:$0585 0:000011:A1=A3:D7=D3 ld (atmp--),a0 // update memcnt atmp -> memptr *dtmp* 0:$0586 0:010011:A6=A6:D1=D7 0:$0587 z:000011:A1=A6:D0=D0 jp !z,Drop // memcnt != 0 0:$0588 d15:data:reset=0:$5F33 1:$0588 d15:data:reset=0:$C589 1:$0589 1:000011:A3=A1:D3=D0 ld a0,mem_free_ptr 1:$058A 1:data:reset=0:$0018 1:$058B 1:000011:A1=A3:D7=D1 ld (atmp),(a0) // *dtmp* 1:$058C 1:000011:A1=A6:D1=D7 1:$058D 1:000011:A1=A3:D1=D8 ld (a0),alu 1:$058E 1:010011:A5=A5:D8=D1 pop alu 1:$058F 1:000011:A0=A0:D0=D3 next_mc 1:$0590 d15:000011:A1=A0:D0=D0 :NIPSTR ( str top -- top ) // release memory 0:$1183 0:000011:A1=A5:D7=D1 ld dtmp,(hp) 0:$1184 0:000011:A1=A5:D1=D8 ld (hp),alu 0:$1185 0:000011:A1=A5:D8=D7 ld alu,dtmp // jp DROPSTR DROPSTR: ( str -- ) // release memory 0:$1186 0:000011:A6=A1:D3=D8 ld atmp,alu // atmp -> memptr 0:$1187 z:000011:A6=A6:D3=D8 inc atmp :z // atmp -> memcnt 1:$1188 1:000011:A1=A7:D0=D0 jp 1,DROP 1:$1189 d15:data:reset=0:$5F47 0:$1188 0:000011:A1=A6:DF=D1 ld d2ar,(atmp) // d2ar = memcnt 0:$1189 0:010011:A3=A7:D3=D8 ld a0,d2ar-1 // a0 = memcnt-1 0:$118A 0:000011:A1=A3:D7=D3 ld (atmp--),a0 // update memcnt atmp -> memptr *dtmp* 0:$118B 0:010011:A6=A6:D1=D7 0:$118C z:000011:A1=A6:D0=D0 jp z,DROP 1:$118D d15:data:reset=0:$5F47 0:$118D d15:data:reset=0:$518E 0:$118E 0:000011:A3=A1:D3=D0 ld a0,mem_free_ptr 0:$118F 0:data:reset=0:$0018 0:$1190 0:000011:A1=A3:D7=D1 ld (atmp),(a0) // *dtmp* 0:$1191 0:000011:A1=A6:D1=D7 0:$1192 0:000011:A1=A3:D1=D8 ld (a0),alu 0:$1193 0:010011:A5=A5:D8=D1 pop alu 0:$1194 0:000011:A0=A0:D0=D1 next_op // *post* 0:$1195 d15:data:reset=0:$0000 // -------------------------------------------- // Store Handle in Variable // and release old handle // NULL-safe // POKESTR: ( str str* -- ) 0:$1196 0:000011:A3=A1:D3=D8 ld a0,alu // a0 -> zstr 0:$1197 0:000011:A1=A3:D8=D1 ld alu,(a0) // alu = old zstr 0:$1198 0:010011:A5=A5:D7=D1 pop (a0) // *zstr := qstr *dtmp* 0:$1199 0:000011:A1=A3:D1=D7 0:$119A 0:000011:A1=A3:D0=D0 jp DROPSTR 0:$119B d15:data:reset=0:$5186 PokeStr: ( str str* -- ) 0:$119C 0:000011:A3=A1:D3=D8 ld a0,alu // a0 -> zstr 0:$119D 0:000011:A1=A3:D8=D1 ld alu,(a0) // alu = old zstr 0:$119E 0:010011:A5=A5:D7=D1 pop (a0) // *zstr := qstr *dtmp* 0:$119F 0:000011:A1=A3:D1=D7 0:$11A0 0:000011:A1=A3:D0=D0 jp DropStr 0:$11A1 d15:data:reset=0:$4581 // -------------------------------------------- // allocate handle and data: // // in: d0 = size // d1 = tracked address // out: alu = a0 = handle // d1 = updated address // a1 = memptr // mod: alu,sr,a0,a1 // pres:d0,d2 // :alloc_wtv 0:$0103 0:010011:A2=A2:D3=D8 pshr new_handle_for_ptr_quick 0:$0104 0:000011:A1=A2:D1=D0 0:$0105 0:data:reset=0:$45CF // jp new_data_with_size_wtv // -------------------------------------------- // allocate data and track an address: // asserts 2 words free for a pointer+refcnt without mem_compact() // runs mem_compact() if needed // if mem_compact() is run and address d1 lies inside the movable memory, // then address d1 is updated to the new address // // in: d0 = size // d1 = tracked address // out: a1 = memptr -> data.size // d0 = size (pres.) // d1 = updated address // mod: alu,sr,a1 // pres:d0,d2,a0 // new_data_with_size_wtv: 0:$0106 0:000011:A6=A1:D3=D0 ld atmp,mem_data_end // atmp->mem_data_end 0:$0107 0:data:reset=0:$0016 0:$0108 0:000011:A6=A6:D8=D1 ld alu,(atmp++) // alu = mem_data_end atmp->mem_ptr_start 0:$0109 0:000011:A1=A6:D7=D8 ld dtmp,alu // dtmp = mem_data_end 0:$010A 0:000100:A1=A6:D3=D4 add_c d0 // alu = new mem_data_end 0:$010B 0:000100:A1=A6:D8=D4 0:$010C cy:000011:A1=A6:D0=D0 jp cy,p1 // cy => new mem_data_end ? $10000 1:$010D d15:data:reset=0:$4119 0:$010D d15:data:reset=0:$410E 0:$010E 0:010011:A6=A6:DF=D1 ld d2ar,(atmp--) // d2ar = mem_ptr_start atmp->mem_data_end 0:$010F 0:010011:A4=A7:D3=D8 ld a1,d2ar-1 // a1 = mem_ptr_start -1 0:$0110 0:001100:A1=A4:D3=D3 cmp a1 // new mem_data_end - (mem_ptr_start-1) 0:$0111 0:001100:A1=A4:D3=D3 0:$0112 cy:000011:A1=A4:D0=D0 jp cy,p1 // cy => !cy => new mem_data_end ? (mem_ptr_start-1) 1:$0113 d15:data:reset=0:$4119 0:$0113 d15:data:reset=0:$4114 // ((mem_ptr_start!=$0000!!)) 0:$0114 0:000011:A4=A1:D3=D7 p2 ld a1,dtmp 0:$0115 0:000011:A1=A4:D1=D4 ld (a1),d0 // data.size = size 0:$0116 0:000011:A1=A6:D1=D8 ld (atmp),alu // update mem_data_end 0:$0117 0:000011:A2=A2:D0=D1 ret // a1 -> data.size; d0 = size *post* 0:$0118 d15:data:reset=0:$0000 // no space => compact & retry 0:$0119 0:000011:A1=A0:D8=D5 p1 ld alu,d1 // alu = tracked address 0:$011A 0:000011:A6=A1:D3=D0 ld atmp,mem_ptr_start // atmp=mem_ptr_start 0:$011B 0:data:reset=0:$0017 0:$011C 0:001100:A1=A6:D3=D1 cmp (atmp) // address-mem_ptr_start 0:$011D 0:001100:A1=A6:D3=D1 0:$011E cy:data:reset=0:$0000 if !cy // !cy => cy => address not in allocated ram 0:$011F 0:010011:A2=A2:D3=D8 jsr mem_compact 0:$0120 0:000011:A1=A2:D1=D0 0:$0121 0:data:reset=0:$C134 0:$0122 0:000011:A1=A1:D0=D0 0:$0123 d15:data:reset=0:$4049 else // d1 points into movable ram: 1:$011F 1:000011:A5=A5:D3=DF psh a0,d0 // *dtmp* 1:$0120 1:000011:A1=A3:D7=D3 1:$0121 1:000011:A5=A5:D1=D7 1:$0122 1:000011:A1=A5:D1=D4 1:$0123 1:010011:A2=A2:D3=D4 jsr mem_find_handle // ( alu:address -- a0:handle d0:alu:index ) pres: d2 1:$0124 1:000011:A1=A2:D1=D0 1:$0125 1:data:reset=0:$C128 1:$0126 1:000011:A1=A1:D0=D0 1:$0127 d15:data:reset=0:$4305 1:$0128 1:010011:A2=A2:D3=D5 jsr mem_compact // a0 = handle -> memptr 1:$0129 1:000011:A1=A2:D1=D0 1:$012A 1:data:reset=0:$C12D 1:$012B 1:000011:A1=A1:D0=D0 1:$012C d15:data:reset=0:$4049 1:$012D 1:000011:A1=A3:D7=D1 ld dtmp,(a0) // dtmp = memptr -> data.size 1:$012E 1:000100:A1=A3:D3=D7 add_c dtmp // alu -> data.data + index 1:$012F 1:000100:A1=A3:D8=D7 1:$0130 1:000011:A1=A3:D5=D8 ld d1,alu // update tracked address in d1 1:$0131 1:010011:A5=A5:D5=D1 pop d1,a0 // *dtmp* 1:$0132 1:010011:A5=A5:D7=D1 1:$0133 1:000011:A3=A1:D3=D7 then 1:$0134 1:000011:A6=A1:D3=D0 ld atmp,mem_data_end // atmp->mem_data_end 1:$0135 1:data:reset=0:$0016 1:$0136 1:000011:A6=A6:D8=D1 ld alu,(atmp++) // alu = mem_data_end atmp->mem_ptr_start 1:$0137 1:000011:A1=A6:D7=D8 ld dtmp,alu // dtmp = mem_data_end 1:$0138 1:000100:A1=A6:D3=D4 add_c d0 // alu = new mem_data_end 1:$0139 1:000100:A1=A6:D8=D4 1:$013A cy:000011:A1=A6:D0=D0 jp cy,p1 // cy => new mem_data_end ? $10000 1:$013B d15:data:reset=0:$4119 0:$013B d15:data:reset=0:$413C 0:$013C 0:010011:A6=A6:DF=D1 ld d2ar,(atmp--) // d2ar = mem_ptr_start atmp->mem_data_end 0:$013D 0:010011:A4=A7:D3=D8 ld a1,d2ar-1 // a1 = mem_ptr_start -1 0:$013E 0:001100:A1=A4:D3=D3 cmp a1 // new mem_data_end - (mem_ptr_start-1) 0:$013F 0:001100:A1=A4:D3=D3 0:$0140 cy:000011:A1=A4:D0=D0 jp !cy,p2 0:$0141 d15:data:reset=0:$4114 1:$0141 d15:data:reset=0:$C142 1:$0142 1:000011:A1=A1:D0=D0 jp oomem // cy => !cy => new mem_data_end ? (mem_ptr_start-1) 1:$0143 d15:data:reset=0:$6978 // ((mem_ptr_start!=$0000!!)) // --- file: "mem.asm" --- #include "asm/ldir.asm" // +++ file: "ldir.asm" +++ /* Copyright (c) Günter Woigk 2009 - 2015 mailto:kio@little-bat.de This file is free software This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: ? Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. ? Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* memcpy ( a0=Q a1=Z alu=n -- a0+=n a1+=n ) mod:alu,sr,a0,a1 pres:d0-d2 memclr ( a1=Z alu=n -- a1+=n ) mod:alu,sr,a1,d0 pres:d1-d2,a0 memset ( a1=Z alu=n d0=filler -- a1+=n ) mod:alu,sr,a1 pres:d0-d2,a0 */ :ldir1a if 1 TRADMEMCPY: ( a:dest a:src cnt -- ) 1:$076D 1:010011:A2=A2:D3=DF pshr DROP 1:$076E 1:000011:A1=A2:D1=D0 1:$076F 0:data:reset=0:$5F47 else TradMemCpy: ( a:dest a:src cnt -- ) 0:$076D 0:010011:A2=A2:D3=D8 pshr Drop 0:$076E 0:000011:A1=A2:D1=D0 0:$076F 0:data:reset=0:$5F33 then 0:$0770 0:010011:A5=A5:D7=D1 pop a0,a1 // *dtmp* 0:$0771 0:000011:A3=A1:D3=D7 0:$0772 0:010011:A5=A5:D7=D1 0:$0773 0:000011:A4=A1:D3=D7 0:$0774 0:000011:A1=A1:D0=D0 jp memcpy 0:$0775 d15:data:reset=0:$414B // --------------------------------------------- // move block of data in ram // in: a0 -> source // a1 -> dest // alu = count // out: a0 += count; a1 += count // mod: alu,sr,a0,a1 // pres:d0-d2 // :ldir1 if 1 NEWMEMCPY: ( a:src a:dest cnt -- ) 1:$0144 1:010011:A2=A2:D3=D8 pshr DROP 1:$0145 1:000011:A1=A2:D1=D0 1:$0146 0:data:reset=0:$5F47 else NewMemCpy: ( a:src a:dest cnt -- ) 0:$0144 0:010011:A2=A2:D3=DF pshr Drop 0:$0145 0:000011:A1=A2:D1=D0 0:$0146 0:data:reset=0:$5F33 then 0:$0147 0:010011:A5=A5:D7=D1 pop a1,a0 // *dtmp* 0:$0148 0:000011:A4=A1:D3=D7 0:$0149 0:010011:A5=A5:D7=D1 0:$014A 0:000011:A3=A1:D3=D7 // jp memcpy memcpy: ldir: 0:$014B 0:000011:A1=A1:DC=D8 ld sr,alu,nc // sr = cnt/16 0:$014C 0:000011:A1=A1:DC=DC ld sr,sr,nc 0:$014D 0:000011:A1=A1:DC=DC ld sr,sr,nc 0:$014E 0:000011:A1=A1:DC=DC ld sr,sr,nc 0:$014F 0:000010:A1=A1:D8=D0 and $F // cnt&15: 0..15 0:$0150 0:data:reset=0:$000F 0:$0151 0:001011:A1=A0:D8=D8 cpl // -1 .. -16 0:$0152 0:000000:A1=A0:D8=D8 add alu // -2 .. -32 nodelay // and memcpytable | 31 0:$0153 0:000000:A1=A0:D7=D0 add mc0+2 // *dtmp* 0:$0154 0:data:reset=0:$417B 0:$0155 0:000000:A1=A1:D3=D7 0:$0156 0:000000:A1=A1:D8=D7 0:$0157 0:000011:A1=A1:D0=D8 ld cmd,alu 0:$0158 d15:000011:A6=A1:D3=DC ld atmp,sr :bit15 // atmp = cnt/16 //:memcpytable % 32 do 0:$0159 0:000011:A3=A3:D7=D1 ld (a1++),(a0++) // *dtmp* 0:$015A 0:000011:A4=A4:D1=D7 0:$015B 0:000011:A3=A3:D7=D1 ld (a1++),(a0++) // *dtmp* 0:$015C 0:000011:A4=A4:D1=D7 0:$015D 0:000011:A3=A3:D7=D1 ld (a1++),(a0++) // *dtmp* 0:$015E 0:000011:A4=A4:D1=D7 0:$015F 0:000011:A3=A3:D7=D1 ld (a1++),(a0++) // *dtmp* 0:$0160 0:000011:A4=A4:D1=D7 0:$0161 0:000011:A3=A3:D7=D1 ld (a1++),(a0++) // *dtmp* 0:$0162 0:000011:A4=A4:D1=D7 0:$0163 0:000011:A3=A3:D7=D1 ld (a1++),(a0++) // *dtmp* 0:$0164 0:000011:A4=A4:D1=D7 0:$0165 0:000011:A3=A3:D7=D1 ld (a1++),(a0++) // *dtmp* 0:$0166 0:000011:A4=A4:D1=D7 0:$0167 0:000011:A3=A3:D7=D1 ld (a1++),(a0++) // *dtmp* 0:$0168 0:000011:A4=A4:D1=D7 0:$0169 0:000011:A3=A3:D7=D1 ld (a1++),(a0++) // *dtmp* 0:$016A 0:000011:A4=A4:D1=D7 0:$016B 0:000011:A3=A3:D7=D1 ld (a1++),(a0++) // *dtmp* 0:$016C 0:000011:A4=A4:D1=D7 0:$016D 0:000011:A3=A3:D7=D1 ld (a1++),(a0++) // *dtmp* 0:$016E 0:000011:A4=A4:D1=D7 0:$016F 0:000011:A3=A3:D7=D1 ld (a1++),(a0++) // *dtmp* 0:$0170 0:000011:A4=A4:D1=D7 0:$0171 0:000011:A3=A3:D7=D1 ld (a1++),(a0++) // *dtmp* 0:$0172 0:000011:A4=A4:D1=D7 0:$0173 0:000011:A3=A3:D7=D1 ld (a1++),(a0++) // *dtmp* 0:$0174 0:000011:A4=A4:D1=D7 0:$0175 0:000011:A3=A3:D7=D1 ld (a1++),(a0++) // *dtmp* 0:$0176 0:000011:A4=A4:D1=D7 0:$0177 0:000011:A3=A3:D7=D1 ld (a1++),(a0++) // *dtmp* 0:$0178 0:000011:A4=A4:D1=D7 0:$0179 0:010011:A6=A6:D3=D3 mc0 tst atmp-- 0:$017A z:data:reset=0:$0000 while !z 0:$017B 0:000011:A1=A0:D0=D0 0:$017C d15:data:reset=0:$4159 1:$017B 1:000011:A2=A2:D0=D1 ret 1:$017C d15:data:reset=0:$0000 :lddr1 if 1 TRADRMEMCPY: ( a:dest a:src cnt -- ) 1:$06F6 1:010011:A2=A2:D3=DF pshr DROP 1:$06F7 1:000011:A1=A2:D1=D0 1:$06F8 0:data:reset=0:$5F47 else TradRMemCpy: ( a:dest a:src cnt -- ) 0:$06F6 0:010011:A2=A2:D3=D8 pshr Drop 0:$06F7 0:000011:A1=A2:D1=D0 0:$06F8 0:data:reset=0:$5F33 then 0:$06F9 0:010011:A5=A5:D7=D1 pop a0,a1 // *dtmp* 0:$06FA 0:000011:A3=A1:D3=D7 0:$06FB 0:010011:A5=A5:D7=D1 0:$06FC 0:000011:A4=A1:D3=D7 0:$06FD 0:000011:A1=A1:D0=D0 jp rmemcpy 0:$06FE d15:data:reset=0:$40A8 // --------------------------------------------- // move block of data in ram // in: a0 -> source // a1 -> dest // alu = count // mod: alu,sr // pres:d0-d2, a0,a1 // :lddr2 if 1 NEWRMEMCPY: ( a:src a:dest cnt -- ) 1:$00A1 1:010011:A2=A2:D3=D8 pshr DROP 1:$00A2 1:000011:A1=A2:D1=D0 1:$00A3 0:data:reset=0:$5F47 else NewRMemCpy: ( a:src a:dest cnt -- ) 0:$00A1 0:010011:A2=A2:D3=DF pshr Drop 0:$00A2 0:000011:A1=A2:D1=D0 0:$00A3 0:data:reset=0:$5F33 then 0:$00A4 0:010011:A5=A5:D7=D1 pop a1,a0 // *dtmp* 0:$00A5 0:000011:A4=A1:D3=D7 0:$00A6 0:010011:A5=A5:D7=D1 0:$00A7 0:000011:A3=A1:D3=D7 // jp memcpy rmemcpy: 0:$00A8 0:000011:A1=A1:D7=D8 ld dtmp,alu 0:$00A9 0:000000:A1=A3:D3=D3 add a0 0:$00AA 0:000000:A1=A3:D8=D3 0:$00AB 0:000011:A3=A1:D3=D8 ld a0,alu 0:$00AC 0:000011:A1=A1:D8=D7 ld alu,dtmp 0:$00AD 0:000000:A1=A4:D3=D3 add a1 0:$00AE 0:000000:A1=A4:D8=D3 0:$00AF 0:000011:A4=A1:D3=D8 ld a1,alu 0:$00B0 0:000011:A1=A1:D8=D7 ld alu,dtmp // move block of data in ram // in: a0 -> source end (excl) // a1 -> dest end (excl) // alu = count // out: a0 -= count; a1 -= count // mod: alu,sr,a0,a1 // pres:d0-d2 // lddr: 0:$00B1 0:010011:A3=A3:D3=D7 dec a0 0:$00B2 0:010011:A4=A4:D3=D7 dec a1 0:$00B3 0:000011:A1=A4:DC=D8 ld sr,alu,nc // sr = cnt/16 0:$00B4 0:000011:A1=A4:DC=DC ld sr,sr,nc 0:$00B5 0:000011:A1=A4:DC=DC ld sr,sr,nc 0:$00B6 0:000011:A1=A4:DC=DC ld sr,sr,nc 0:$00B7 0:000010:A1=A4:D8=D0 and $F // cnt&15: 0..15 0:$00B8 0:data:reset=0:$000F 0:$00B9 0:001011:A1=A0:D8=D8 cpl // -1 .. -16 0:$00BA 0:000000:A1=A0:D8=D8 add alu // -2 .. -32 nodelay // and memcpytable | 31 0:$00BB 0:000000:A1=A0:D7=D0 add mc0+2 // *dtmp* 0:$00BC 0:data:reset=0:$40E3 0:$00BD 0:000000:A1=A0:D3=D7 0:$00BE 0:000000:A1=A0:D8=D7 0:$00BF 0:000011:A1=A0:D0=D8 ld cmd,alu 0:$00C0 d15:000011:A6=A1:D3=DC ld atmp,sr :bit15 // atmp = cnt/16 //:rmemcpytable % 16 do 0:$00C1 0:010011:A3=A3:D7=D1 ld (a1--),(a0--) // *dtmp* 0:$00C2 0:010011:A4=A4:D1=D7 0:$00C3 0:010011:A3=A3:D7=D1 ld (a1--),(a0--) // *dtmp* 0:$00C4 0:010011:A4=A4:D1=D7 0:$00C5 0:010011:A3=A3:D7=D1 ld (a1--),(a0--) // *dtmp* 0:$00C6 0:010011:A4=A4:D1=D7 0:$00C7 0:010011:A3=A3:D7=D1 ld (a1--),(a0--) // *dtmp* 0:$00C8 0:010011:A4=A4:D1=D7 0:$00C9 0:010011:A3=A3:D7=D1 ld (a1--),(a0--) // *dtmp* 0:$00CA 0:010011:A4=A4:D1=D7 0:$00CB 0:010011:A3=A3:D7=D1 ld (a1--),(a0--) // *dtmp* 0:$00CC 0:010011:A4=A4:D1=D7 0:$00CD 0:010011:A3=A3:D7=D1 ld (a1--),(a0--) // *dtmp* 0:$00CE 0:010011:A4=A4:D1=D7 0:$00CF 0:010011:A3=A3:D7=D1 ld (a1--),(a0--) // *dtmp* 0:$00D0 0:010011:A4=A4:D1=D7 0:$00D1 0:010011:A3=A3:D7=D1 ld (a1--),(a0--) // *dtmp* 0:$00D2 0:010011:A4=A4:D1=D7 0:$00D3 0:010011:A3=A3:D7=D1 ld (a1--),(a0--) // *dtmp* 0:$00D4 0:010011:A4=A4:D1=D7 0:$00D5 0:010011:A3=A3:D7=D1 ld (a1--),(a0--) // *dtmp* 0:$00D6 0:010011:A4=A4:D1=D7 0:$00D7 0:010011:A3=A3:D7=D1 ld (a1--),(a0--) // *dtmp* 0:$00D8 0:010011:A4=A4:D1=D7 0:$00D9 0:010011:A3=A3:D7=D1 ld (a1--),(a0--) // *dtmp* 0:$00DA 0:010011:A4=A4:D1=D7 0:$00DB 0:010011:A3=A3:D7=D1 ld (a1--),(a0--) // *dtmp* 0:$00DC 0:010011:A4=A4:D1=D7 0:$00DD 0:010011:A3=A3:D7=D1 ld (a1--),(a0--) // *dtmp* 0:$00DE 0:010011:A4=A4:D1=D7 0:$00DF 0:010011:A3=A3:D7=D1 ld (a1--),(a0--) // *dtmp* 0:$00E0 0:010011:A4=A4:D1=D7 0:$00E1 0:010011:A6=A6:D3=D3 mc0 tst atmp-- 0:$00E2 z:data:reset=0:$0000 while !z 0:$00E3 0:000011:A1=A0:D0=D0 0:$00E4 d15:data:reset=0:$40C1 1:$00E3 1:000011:A3=A3:D3=DF inc a0 1:$00E4 1:000011:A4=A4:D3=DF inc a1 1:$00E5 1:000011:A2=A2:D0=D1 ret 1:$00E6 d15:data:reset=0:$0000 :lddrx1 if 1 TRADMEMMOVE: ( a:dest a:src cnt -- ) 1:$077F 1:010011:A2=A2:D3=DF pshr DROP 1:$0780 1:000011:A1=A2:D1=D0 1:$0781 0:data:reset=0:$5F47 else TradMemMove: ( a:dest a:src cnt -- ) 0:$077F 0:010011:A2=A2:D3=D8 pshr Drop 0:$0780 0:000011:A1=A2:D1=D0 0:$0781 0:data:reset=0:$5F33 then 0:$0782 0:010011:A5=A5:D7=D1 pop a0,a1 // *dtmp* 0:$0783 0:000011:A3=A1:D3=D7 0:$0784 0:010011:A5=A5:D7=D1 0:$0785 0:000011:A4=A1:D3=D7 0:$0786 0:000011:A1=A1:D0=D0 jp memmove 0:$0787 d15:data:reset=0:$4644 :lddrx2 if 1 NEWMEMMOVE: ( a:src a:dest cnt -- ) 1:$063D 1:010011:A2=A2:D3=D6 pshr DROP 1:$063E 1:000011:A1=A2:D1=D0 1:$063F 0:data:reset=0:$5F47 else NewMemMove: ( a:src a:dest cnt -- ) 0:$063D 0:010011:A2=A2:D3=DF pshr Drop 0:$063E 0:000011:A1=A2:D1=D0 0:$063F 0:data:reset=0:$5F33 then 0:$0640 0:010011:A5=A5:D7=D1 pop a1,a0 // *dtmp* 0:$0641 0:000011:A4=A1:D3=D7 0:$0642 0:010011:A5=A5:D7=D1 0:$0643 0:000011:A3=A1:D3=D7 // jp memmove // --------------------------------------------- // move block of data in ram // in: a0 -> source // a1 -> dest // alu = count // mod: alu,sr,a0,a1 // pres:d0-d2 // memmove: 0:$0644 0:000011:A1=A1:D7=D8 ld dtmp,alu 0:$0645 0:000011:A1=A3:D8=D3 ld alu,a0 0:$0646 0:001100:A1=A4:D3=D3 cmp a1 // src_addr - dest_addr 0:$0647 0:001100:A1=A4:D3=D3 0:$0648 cy:000011:A1=A4:D8=D7 ld alu,dtmp :cy if 1 1:$0649 1:000011:A1=A7:D0=D0 jp memcpy // cy=!cy => src_addr ? dest_addr => ldir 1:$064A d15:data:reset=0:$414B else 0:$0649 0:000011:A1=A4:D0=D0 jp rmemcpy 0:$064A d15:data:reset=0:$40A8 then // -------------------------------------------- // clear block of data to $0000 // in: a1 -> dest // alu = count // out: a1 += count // mod: alu,sr,a1,d0 // pres:d1-d2,a0 // :ldir3 if 1 MEMCLR: ( a:dest cnt -- ) 1:$02AC 1:010011:A2=A2:D3=DF pshr DROP 1:$02AD 1:000011:A1=A2:D1=D0 1:$02AE 0:data:reset=0:$5F47 else MemClr: ( a:dest cnt -- ) 0:$02AC 0:010011:A2=A2:D3=D8 pshr Drop 0:$02AD 0:000011:A1=A2:D1=D0 0:$02AE 0:data:reset=0:$5F33 then 0:$02AF 0:010011:A5=A5:D7=D1 pop a1 // *dtmp* 0:$02B0 0:000011:A4=A1:D3=D7 // jp memclr memclr: 0:$02B1 0:000011:A1=A1:D4=D0 ld d0,0 0:$02B2 0:data:reset=0:$0000 // jp memset // -------------------------------------------- // clear block of data with filler // in: a1 -> dest // alu = count // d0 = fill word // out: a1 += count // mod: alu,sr,a1 // pres:d0-d2,a0 // memset: 0:$02B3 0:000011:A1=A0:DC=D8 ld sr,alu,nc 0:$02B4 0:000011:A1=A0:DC=DC ld sr,sr,nc 0:$02B5 0:000011:A1=A0:DC=DC ld sr,sr,nc 0:$02B6 0:000011:A1=A0:DC=DC ld sr,sr,nc 0:$02B7 0:000010:A1=A0:D8=D0 and $F // 0..15 0:$02B8 0:data:reset=0:$000F 0:$02B9 0:001011:A1=A0:D8=D8 cpl // -1 .. -16 // and memsettable | 15 0:$02BA 0:000000:A1=A0:D7=D0 add ms0+1 // *dtmp* 0:$02BB 0:data:reset=0:$42D1 0:$02BC 0:000000:A1=A2:D3=D7 0:$02BD 0:000000:A1=A2:D8=D7 0:$02BE 0:000011:A1=A2:D0=D8 ld cmd,alu 0:$02BF d15:000011:A6=A1:D3=DC ld atmp,sr :bit15 //:memsettable % 16 do 0:$02C0 0:000011:A4=A4:D1=D4 ld (a1++),d0 0:$02C1 0:000011:A4=A4:D1=D4 ld (a1++),d0 0:$02C2 0:000011:A4=A4:D1=D4 ld (a1++),d0 0:$02C3 0:000011:A4=A4:D1=D4 ld (a1++),d0 0:$02C4 0:000011:A4=A4:D1=D4 ld (a1++),d0 0:$02C5 0:000011:A4=A4:D1=D4 ld (a1++),d0 0:$02C6 0:000011:A4=A4:D1=D4 ld (a1++),d0 0:$02C7 0:000011:A4=A4:D1=D4 ld (a1++),d0 0:$02C8 0:000011:A4=A4:D1=D4 ld (a1++),d0 0:$02C9 0:000011:A4=A4:D1=D4 ld (a1++),d0 0:$02CA 0:000011:A4=A4:D1=D4 ld (a1++),d0 0:$02CB 0:000011:A4=A4:D1=D4 ld (a1++),d0 0:$02CC 0:000011:A4=A4:D1=D4 ld (a1++),d0 0:$02CD 0:000011:A4=A4:D1=D4 ld (a1++),d0 0:$02CE 0:000011:A4=A4:D1=D4 ld (a1++),d0 0:$02CF 0:000011:A4=A4:D1=D4 ld (a1++),d0 0:$02D0 0:010011:A6=A6:D3=D3 ms0 tst atmp-- 0:$02D1 z:data:reset=0:$0000 while !z 0:$02D2 0:000011:A1=A0:D0=D0 0:$02D3 d15:data:reset=0:$42C0 1:$02D2 1:000011:A2=A2:D0=D1 ret 1:$02D3 d15:data:reset=0:$0000 :ldir2 if 1 MEMSET: ( a:dest filler cnt -- ) 1:$079A 1:010011:A2=A2:D3=DF pshr DROP 1:$079B 1:000011:A1=A2:D1=D0 1:$079C 0:data:reset=0:$5F47 else MemSet: ( a:dest filler cnt -- ) 0:$079A 0:010011:A2=A2:D3=D8 pshr Drop 0:$079B 0:000011:A1=A2:D1=D0 0:$079C 0:data:reset=0:$5F33 then 0:$079D 0:010011:A5=A5:D4=D1 pop d0,a1 // *dtmp* 0:$079E 0:010011:A5=A5:D7=D1 0:$079F 0:000011:A4=A1:D3=D7 0:$07A0 0:000011:A1=A1:D0=D0 jp memset 0:$07A1 d15:data:reset=0:$42B3 // --- file: "ldir.asm" --- #include "asm/interrupt.asm" // +++ file: "interrupt.asm" +++ /* Copyright (c) Günter Woigk 2009 - 2015 mailto:kio@little-bat.de This file is free software This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: ? Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. ? Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ // ============================================================ // Interrupt Vectors: // ============================================================ // interrupts jump to $1000:0 .. $3000:0 and $0000:1 .. $3000:1 // depending on the replaced opcode. ($0000:0 is the reset vector) :IRPT2 = $2000:0 ( -- ) 0:$2000 0:000011:A1=A0:D0=D0 jp IRPT1 0:$2001 d15:data:reset=0:$1000 :IRPT3 = $3000:0 ( -- ) 0:$3000 0:000011:A1=A2:D0=D0 jp IRPT1 0:$3001 d15:data:reset=0:$1000 :IRPT4 = $0000:1 ( -- ) 1:$0000 1:000011:A1=A2:D0=D0 jp IRPT1 1:$0001 d15:data:reset=0:$1000 :IRPT6 = $2000:1 ( -- ) 1:$2000 1:000011:A1=A7:D0=D0 jp IRPT1 1:$2001 d15:data:reset=0:$1000 :IRPT7 = $3000:1 ( -- ) 1:$3000 1:000011:A1=A7:D0=D0 jp IRPT1 1:$3001 d15:data:reset=0:$1000 :IRPT5 = $1000:1 ( -- ) 1:$1000 0:010011:A0=A0:D3=DF dec ip :0 // ... and join handler in other plane :IRPT1 = $1000:0 ( -- ) 0:$1000 0:010011:A0=A0:D3=DF dec ip // restore suppressed opcode 0:$1001 0:010011:A2=A2:D3=DF pshr ip // *dtmp* 0:$1002 0:000011:A1=A0:D7=D3 0:$1003 0:000011:A1=A2:D1=D7 0:$1004 0:000011:A1=A2:D7=D8 ld dtmp,alu // save alu 0:$1005 0:000010:A1=A2:DF=D2 ld d2ar,io_irpt 0:$1006 0:000011:A1=A7:D8=D3 ld alu,d2ar // int status of all devices 0:$1007 0:data: ei=0:$0000 di // *combine* 0:$1008 0:000011:A6=A1:D3=D0 ld atmp,int_mask 0:$1009 0:data:reset=0:$0010 0:$100A 0:000110:A1=A6:D8=D1 or (atmp) 0:$100B 0:000011:A1=A6:DE=D8 ld msbit,alu // msbit = highest 0-bit position 0:$100C 0:000011:A1=A6:D8=D7 ld alu,dtmp // restore alu 0:$100D 0:000011:A1=A6:DF=DE ld d2ar,msbit // d2ar = 0 .. 15 0:$100E 0:000011:A1=A7:DF=D1 ld d2ar,(d2ar) // d2ar -> OPCODE 'SELECTI' 0:$100F 0:000011:A0=A7:D3=D8 ld ip,d2ar+1 // ip -> IVAL 'SELECTMASK' 0:$1010 0:000001:A0=A0:D2=D1 ld io_select,(ip++) 0:$1011 0:data:led_y=1:$0000 set led_yel 0:$1012 0:data:led_g=0:$0000 clr led_grn 0:$1013 0:000011:A0=A0:D0=D1 next_op // *post* 0:$1014 d15:data:reset=0:$0000 :DROP8_RETI ( x x x x x x x x -- ) 0:$23B9 0:010011:A5=A5:D8=D1 pop alu 0:$23BA 0:010011:A5=A5:D8=D1 pop alu 0:$23BB 0:010011:A5=A5:D8=D1 pop alu 0:$23BC 0:010011:A5=A5:D8=D1 pop alu 0:$23BD 0:010011:A5=A5:D8=D1 pop alu 0:$23BE 0:010011:A5=A5:D8=D1 pop alu 0:$23BF 0:010011:A5=A5:D8=D1 pop alu 0:$23C0 0:010011:A5=A5:D8=D1 pop alu // jp RETI DROP0_RETI: RETI: ( -- ) // return from interrupt 0:$23C1 0:000011:A2=A2:D7=D1 popr ip // *dtmp* 0:$23C2 0:000011:A0=A1:D3=D7 0:$23C3 0:000001:A1=A1:D2=D0 ld io_select,$ffff // deselect device 0:$23C4 0:data:reset=0:$FFFF 0:$23C5 0:data:led_y=0:$0000 clr led_yel 0:$23C6 0:data:led_g=1:$0000 set led_grn 0:$23C7 0:data: ei=1:$0000 ei // re-enable interrupts 0:$23C8 0:000011:A0=A0:D0=D1 next_op // *post* 0:$23C9 d15:data:reset=0:$0000 // wait for interrupt // handle interrupt if interrupts are enabled // and resume millicode // :Halt ( -- ) 0:$1E90 0:data: halt=1:$0000 set halt // wait for interrupt 0:$1E91 0:010011:A2=A2:D3=D8 pshr ip // dtmp 0:$1E92 0:000011:A1=A0:D7=D3 0:$1E93 0:000011:A1=A2:D1=D7 0:$1E94 0:000011:A0=A1:D3=D0 ld ip,opcode_Ret 0:$1E95 0:data:reset=0:$001A 0:$1E96 0:data: halt=0:$0000 clr halt 0:$1E97 0:000011:A0=A0:D0=D1 next_op 0:$1E98 d15:data:reset=0:$0000 // Template für Timer-Interrupt-Handler #if 0 void SYSTEMTIMER() { current_microsec += microsecs_per_int; if current_microsec ? 1000000 { current_time++; current_microsec -= 1000000; } } #endif #if 1 :SYSTEMTIMER ( -- ) Millicoded // Size: 23 microcodes 0:$260B 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$260C 0:data:reset=0:$660F 0:$260D 0:000011:A1=A6:D0=D0 jp millicoded // * Millicoded 0:$260E d15:data:reset=0:$5F70 0:$260F d15:data:reset=0:$9F28 mc Gget+microsecs_per_int 0:$2610 d15:data:reset=0:$5B75 mc new__6uint16_6uint32 0:$2611 d15:data:reset=0:$0D26 mc Gvar+current_microsec 0:$2612 d15:data:reset=0:$6040 mc op__ADDGL__5int32_5int32P_ 0:$2613 d15:data:reset=0:$0D26 mc Gvar+current_microsec 0:$2614 d15:data:reset=0:$5CD6 mc Peek2 0:$2615 d15:data:reset=0:$0D0F mc Int8+15 0:$2616 d15:data:reset=0:$0D40 mc Int8+64 0:$2617 d15:data:reset=0:$0E42 mc Int16+66 0:$2618 d15:data:reset=0:$468B mc op__GE__6uint32_6uint32_5int16 0:$2619 d15:data:reset=0:$0607 mc BraIf0+7 0:$261A d15:data:reset=0:$0D24 mc Gvar+current_time 0:$261B d15:data:reset=0:$4698 mc IncrL 0:$261C d15:data:reset=0:$0D0F mc Int8+15 0:$261D d15:data:reset=0:$0D40 mc Int8+64 0:$261E d15:data:reset=0:$0E42 mc Int16+66 0:$261F d15:data:reset=0:$0D26 mc Gvar+current_microsec 0:$2620 d15:data:reset=0:$601C mc op__SUBGL__5int32_5int32P_ 0:$2621 d15:data:reset=0:$5B8A mc NextOpcode #endif #if 0 :SYSTEMTIMER ( -- ) ld a0,microsecs_per_int ld dtmp,(a0--) // dtmp = microsecs_per_int; a0 -> current_microsec.lo ld alu,(a0) // alu = current_microsec.lo (alt) add dtmp // alu = current_microsec.lo (neu) ld (a0--),alu : cy // update current_microsec.lo; a0 -> current_microsec.hi if 1 ld d1,alu // d1 = current_microsec.lo ld d2ar,(a0) // d2ar = current_microsec.hi ld atmp,d2ar+1 ld alu,atmp // alu = current_microsec.hi ld (a0--),alu // update current_microsec.hi; a0 -> current_time.lo else ld d1,alu // d1 = current_microsec.lo ld alu,(a0--) // alu = current_microsec.hi; a0 -> current_time.lo then ld dtmp,1e6.hi // dtmp = 1000000.hi ld d0,1e6.lo // d0 = 1000000.lo equ dtmp if z // 1000000.hi == current_microsec.hi ld alu,d1 // alu = current_microsec.lo ld dtmp,d0 // dtmp = 1000000.lo then cmp dtmp // current_microsec - 1000000 if cy // cy=!cy => current_microsec ? 1000000 ld d2ar,(a0) // d2ar = current_time.lo ld atmp,d2ar+1 ld alu,atmp // alu = current_time.lo ld (a0--),atmp // update current_time.lo; a0 -> current_time.hi if z ld d2ar,(a0) // d2ar = current_time.hi ld atmp,d2ar+1 ld alu,atmp // alu = current_time.hi ld (a0),atmp // update current_time.hi then then next_op #endif // --- file: "interrupt.asm" --- #include "asm/millicode.asm" // +++ file: "millicode.asm" +++ /* Copyright (c) Günter Woigk 2009 - 2015 mailto:kio@little-bat.de This file is free software This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: ? Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. ? Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ // Microcode for the K1-16/16 CPU // // 2012-04-25 // ================================================================ // millicode: // ================================================================ // forth-style opcodes in microcode rom // // similar to opcodes in ram // // notes: // do not forget to save & restore ip! // millicodes with cmd_lo argument can use opcode range $100 .. $F00 // instruction macros are in instr.h // Millicode: clear errno // :clear_error ( -- ) // clear errno 0:$1F6A 0:000011:A6=A1:D3=D0 ld atmp,errno 0:$1F6B 0:data:reset=0:$0022 0:$1F6C 0:000011:A1=A6:D1=D0 ld (atmp),0 //ok 0:$1F6D 0:data:reset=0:$0000 0:$1F6E 0:000011:A0=A0:D0=D3 next_mc 0:$1F6F d15:000011:A1=A0:D0=D0 // ================================================================ // Code Model Change & Subroutines: // ================================================================ // switch from microcode to millicode: // push ip and start millicode processing at atmp // used in macro instruction 'Millicoded' // (( ld atmp,$+4 )) // (( jp millicoded )) // millicoded: 0:$1F70 0:010011:A2=A2:D3=D8 pshr ip // dtmp 0:$1F71 0:000011:A1=A0:D7=D3 0:$1F72 0:000011:A1=A2:D1=D7 0:$1F73 0:000011:A0=A6:D0=D3 ld cmd,atmp, ip.clk, add1 // & ip = atmp+1 0:$1F74 d15:000011:A1=A6:D0=D0 ld cmd,ival :bit15 // Return to millicoded procedure: // either from millicoded or microcoded proc im microcode ROM // or from opcoded procedure in RAM. // note: the opcode Ret is always stored in the gvar opcode_Ret // :Ret ( -- ) Next: 0:$1ACD 0:000011:A2=A2:D7=D1 popr ip // dtmp 0:$1ACE 0:000011:A0=A1:D3=D7 Nop: ( -- ) next_mc: 0:$1ACF 0:000011:A0=A0:D0=D3 next_mc 0:$1AD0 d15:000011:A1=A0:D0=D0 // switch from millicode to microcode: // :Native ( -- ) 0:$1C0A 0:000011:A1=A0:D0=D3 jp ip 0:$1C0B d15:data:reset=0:$0000 // Call Procedure in Ram from Millicode: // :CallOpcode ( a:proc -- ) 0:$1EBD 0:010011:A2=A2:D3=D8 pshr ip,opcode_Ret // dtmp 0:$1EBE 0:000011:A1=A0:D7=D3 0:$1EBF 0:010011:A2=A2:D1=D7 0:$1EC0 0:000011:A1=A2:D1=D0 0:$1EC1 0:data:reset=0:$001A 0:$1EC2 0:000011:A0=A1:D3=D8 ld ip,alu 0:$1EC3 0:010011:A5=A5:D8=D1 pop alu 0:$1EC4 0:000011:A0=A0:D0=D1 next_op // post 0:$1EC5 d15:data:reset=0:$0000 // Call Millicode ProcPointer from Millicode: // :CallMillicode ( addr -- ) 0:$2002 0:000011:A1=A0:D0=D8 ld cmd,alu 0:$2003 d15:010011:A5=A5:D8=D1 pop alu :bit15 // Call Millicoded Struct or Array Destructor 'kill()' from Millicode: // Call kill() if handle != null and retain count == 1 // the kill() proc Millicode follows after this opcode // :CallKill ( T -- T ) 0:$06BA 0:000011:A6=A1:D3=D8 ld atmp,alu 0:$06BB z:data:reset=0:$0000 if !z 0:$06BC 0:000011:A6=A6:D3=D8 inc atmp // --> ref_cnt 0:$06BD 0:000011:A1=A6:DF=D1 ld d2ar,(atmp) 0:$06BE 0:010011:A6=A7:D3=D8 ld atmp,d2ar-1 0:$06BF 0:000011:A1=A6:D3=D3 tst atmp 0:$06C0 z:data:reset=0:$0000 if z 1:$06C1 1:000011:A0=A0:D0=D3 next_mc 1:$06C2 d15:000011:A1=A0:D0=D0 0:$06C1 0:data:reset=0:$0000 then 0:$06C2 0:data:reset=0:$0000 1:$06BC 1:000011:A1=A7:D0=D0 then 1:$06BD d15:data:reset=0:$46C3 0:$06C3 0:000011:A0=A0:D3=D8 inc ip // skip kill() millicode 0:$06C4 0:000011:A0=A0:D0=D3 next_mc 0:$06C5 d15:000011:A1=A0:D0=D0 // ================================================================ // Code Flow: // ================================================================ // ------------------------------------------------------- // branch to $+1+dis // // note: // if Bra_M == Bra-$100 // then Bra can be used for dist = -256 .. +255 :Bra_M = $100:0 ( -- ) // branch to ip-256+dis 0:$0100 0:110011:A0=A0:D3=DF ld ip,ip-dis 0:$0101 0:000011:A0=A0:D0=D3 next_mc 0:$0102 d15:000011:A1=A0:D0=D0 :Bra = $200:0 ( -- ) // branch to ip+dis 0:$0200 0:100011:A0=A0:D3=DF ld ip,ip+dis 0:$0201 0:000011:A0=A0:D0=D3 next_mc 0:$0202 d15:000011:A1=A0:D0=D0 :BraIf1_M = $300:0 ( bool -- ) 0:$0300 0:000011:A1=A0:D3=D8 tst alu 0:$0301 z:010011:A5=A5:D8=D1 pop alu : z if 1 1:$0302 1:000011:A0=A0:D0=D3 next_mc 1:$0303 d15:000011:A1=A0:D0=D0 else 0:$0302 0:110011:A0=A0:D3=D8 ld ip,ip-dis // ld ip,ip-256+dis 0:$0303 0:000011:A0=A0:D0=D3 next_mc 0:$0304 d15:000011:A1=A0:D0=D0 then :BraIf1 = $400:0 ( bool -- ) 0:$0400 0:000011:A1=A7:D3=D8 tst alu 0:$0401 z:010011:A5=A5:D8=D1 pop alu : z if 1 1:$0402 1:000011:A0=A0:D0=D3 next_mc 1:$0403 d15:000011:A1=A0:D0=D0 else 0:$0402 0:100011:A0=A0:D3=D8 ld ip,ip+dis 0:$0403 0:000011:A0=A0:D0=D3 next_mc 0:$0404 d15:000011:A1=A0:D0=D0 then :BraIf0_M = $500:0 ( bool -- ) 0:$0500 0:000011:A1=A7:D3=D8 tst alu 0:$0501 z:010011:A5=A5:D8=D1 pop alu : z if 0 0:$0502 0:000011:A0=A0:D0=D3 next_mc 0:$0503 d15:000011:A1=A0:D0=D0 else 1:$0502 1:110011:A0=A0:D3=DF ld ip,ip-dis 1:$0503 1:000011:A0=A0:D0=D3 next_mc 1:$0504 d15:000011:A1=A0:D0=D0 then :BraIf0 = $600:0 ( bool -- ) 0:$0600 0:000011:A1=A0:D3=D8 tst alu 0:$0601 z:010011:A5=A5:D8=D1 pop alu : z if 0 0:$0602 0:000011:A0=A0:D0=D3 next_mc 0:$0603 d15:000011:A1=A0:D0=D0 else 1:$0602 1:100011:A0=A0:D3=DF ld ip,ip+dis 1:$0603 1:000011:A0=A0:D0=D3 next_mc 1:$0604 d15:000011:A1=A0:D0=D0 then // ------------------------------------------------------- // pruning boolean OR: // mc Or1 // mc Bra // :Or1 ( i1 -- ) 0:$07F1 0:000011:A1=A0:D3=D8 tst alu 0:$07F2 z:data:reset=0:$0000 if !z 0:$07F3 0:000011:A1=A0:D8=D0 ld alu,1 // this allows i16 argument instead of proper i1 0:$07F4 0:data:reset=0:$0001 0:$07F5 0:000011:A0=A0:D0=D3 next_mc 0:$07F6 d15:000011:A1=A0:D0=D0 else 1:$07F3 1:010011:A5=A5:D8=D1 pop alu // drop i1 1:$07F4 1:000011:A0=A0:D3=D8 inc ip // skip bra 1:$07F5 1:000011:A0=A0:D0=D3 next_mc // execute 2nd branch for i1 1:$07F6 d15:000011:A1=A0:D0=D0 then // pruning boolean AND: // mc And0 // mc Bra // :And0 ( i1 -- ) 0:$07E5 0:000011:A1=A0:D3=D8 tst alu 0:$07E6 z:data:reset=0:$0000 if z 1:$07E7 1:000011:A0=A0:D0=D3 next_mc 1:$07E8 d15:000011:A1=A0:D0=D0 else 0:$07E7 0:010011:A5=A5:D8=D1 pop alu // drop i1 0:$07E8 0:000011:A0=A0:D3=D8 inc ip // skip bra 0:$07E9 0:000011:A0=A0:D0=D3 next_mc // execute 2nd branch for i1 0:$07EA d15:000011:A1=A0:D0=D0 then // -------------------------------------------------------- // jump to address // after 'Hi8' // //:Jp = $100:1 ( -- ) // ld ip,dxa+dis,swap.oe // ld ip,swap+dis // next_mc //:JpIf1 = $700:0 ( i1 -- ) // ((not used so far)) // tst alu // pop alu :z // if 0 // ld ip,dxa+dis,swap.oe // ld ip,swap+dis // next_mc // else // next_mc // then //:JpIf0 = $800:0 ( i1 -- ) // tst alu // pop alu :z // if 1 // ld ip,dxa+dis,swap.oe // ld ip,swap+dis // next_mc // else // next_mc // then // prepare 16 bit argument: // :Hi8 = $200:1 ( -- ) 1:$0200 1:000011:A1=A7:DA=DF ld swap,cmd_lo 1:$0201 1:000011:A0=A0:D0=D3 next_mc 1:$0202 d15:000011:A1=A0:D0=D0 :BraFar % $100 ( -- ) // after Hi8 1:$2100 1:100011:A0=A0:D7=D8 ld dtmp,alu, ip.oe, ip.clk, adddis // ld dtmp,alu + ld ip,ip+dis 1:$2101 1:000011:A1=A0:D8=D3 ld alu,ip 1:$2102 1:000000:A1=A0:D3=DA add swap 1:$2103 1:000000:A1=A0:D8=DA 1:$2104 1:000011:A0=A1:D3=D8 ld ip,alu 1:$2105 1:000011:A1=A1:D8=D7 ld alu,dtmp 1:$2106 1:000011:A0=A0:D0=D3 next_mc 1:$2107 d15:000011:A1=A0:D0=D0 // -------------------------------------------------------- // conditional millicode execution: // //If := BraIf0+1 ( i1 -- ) // execute next millicode if top != 0 //If2 := BraIf0+2 ( i1 -- ) // execute next 2 millicodes if top != 0 //If3 := BraIf0+3 ( i1 -- ) // execute next 3 millicodes if top != 0 // //Ifnot := BraIf1+1 ( i1 -- ) // execute next millicode if top == 0 //Ifnot2 := BraIf1+2 ( i1 -- ) // execute next 2 millicodes if top == 0 //Ifnot3 := BraIf1+3 ( i1 -- ) // execute next 3 millicodes if top == 0 // -------------------------------------------------------- // jump via table // cmd_lo = table size // // mc SwitchFar+n // mc Jp[0],Jp[1], .. Jp[n-1], Jp[default] // :SwitchFar = $A00:0 ( i8 -- ) 0:$0A00 0:001100:A1=A7:D3=DF cmp cmd_lo // idx - tbl_size 0:$0A01 0:001100:A1=A7:D3=DF 0:$0A02 cy:000000:A1=A7:D8=D8 add alu :cy // alu=i8*2 = offset in table *nodelay* if 1 // cy => !cy => idx ? tbl_size => out of table 1:$0A03 1:100011:A0=A0:D3=D8 ld ip,ip+dis 1:$0A04 1:100011:A0=A0:D3=D8 ld ip,ip+dis // ip += dis*2 => ip -> next millicode after tab 1:$0A05 1:010011:A5=A5:D8=D1 pop alu 1:$0A06 1:000011:A0=A0:D0=D3 next_mc 1:$0A07 d15:000011:A1=A0:D0=D0 else 0:$0A03 0:000000:A1=A0:D3=D3 add ip // alu = ip+i8*2 0:$0A04 0:000000:A1=A0:D8=D3 0:$0A05 0:000011:A0=A1:D3=D8 ld ip,alu // ip = ip+i8*2 -> Jp 0:$0A06 0:010011:A5=A5:D8=D1 pop alu 0:$0A07 0:000011:A0=A0:D0=D3 next_mc 0:$0A08 d15:000011:A1=A0:D0=D0 then // -------------------------------------------------------- // branch via table // cmd_lo = table size // // mc Switch+n // mc Bra[0],Bra[1], .. Bra[n-1], Bra[default] :Switch = $900:0 ( i8 -- ) 0:$0900 0:001100:A1=A7:D3=DF cmp cmd_lo // idx - tbl_size 0:$0901 0:001100:A1=A7:D3=DF 0:$0902 cy:100011:A0=A0:D7=D3 ld dtmp,ip+=dis :cy // ip -> next millicode after tab if 1 // cy => !cy => idx ? tbl_size => out of table 1:$0903 1:010011:A5=A5:D8=D1 pop alu 1:$0904 1:000011:A0=A0:D0=D3 next_mc 1:$0905 d15:000011:A1=A0:D0=D0 else 0:$0903 0:000000:A1=A0:D3=D7 add dtmp 0:$0904 0:000000:A1=A0:D8=D7 0:$0905 0:000011:A0=A1:D3=D8 ld ip,alu 0:$0906 0:010011:A5=A5:D8=D1 pop alu 0:$0907 0:000011:A0=A0:D0=D3 next_mc 0:$0908 d15:000011:A1=A0:D0=D0 then // -------------------------------------------------------- // For all items... // // ForAllItems // Bra L_end // L_loop: ... // ... // L_end: mmNextItem // Bra L_loop // // :ForAllItems ( T[]¢ -- ) // rstack:( -- T[]¢ a_idx e_idx ) // opcode bra.dest follows 0:$073D 0:000011:A1=A0:DF=D8 ld d2ar,alu // d2ar = alu = handle -> memptr 0:$073E z:000011:A1=A7:DF=D1 ld d2ar,(d2ar) : z // d2ar = memptr -> data.size if 0 0:$073F 0:000011:A1=A7:D4=D1 ld d0,(d2ar) // d0 = data.size else 1:$073F 0:000011:A1=A7:D4=D8 ld d0,alu // d0 = data.size = 0 then 0:$0740 0:010011:A2=A2:D3=D8 pshr alu,0,d0 // pushr T[]¢, a_idx, e_idx dtmp 0:$0741 0:010011:A2=A2:D1=D8 0:$0742 0:010011:A2=A2:D1=D0 0:$0743 0:data:reset=0:$0000 0:$0744 0:000011:A1=A2:D1=D4 0:$0745 0:010011:A5=A5:D8=D1 pop alu 0:$0746 0:000011:A0=A0:D0=D3 next_mc 0:$0747 d15:000011:A1=A0:D0=D0 :ForRange ( T[]¢ a_idx e_idx -- ) // rstack:( -- T[]¢ a_idx e_idx ) // opcode bra.dest follows 0:$1E6C 0:010011:A5=A5:D4=D1 pop d0,d1 0:$1E6D 0:010011:A5=A5:D5=D1 0:$1E6E 0:010011:A2=A2:D3=D8 pshr d1,d0,alu 0:$1E6F 0:010011:A2=A2:D1=D5 0:$1E70 0:010011:A2=A2:D1=D4 0:$1E71 0:000011:A1=A2:D1=D8 0:$1E72 0:010011:A5=A5:D8=D1 pop alu 0:$1E73 0:000011:A0=A0:D0=D3 next_mc 0:$1E74 d15:000011:A1=A0:D0=D0 :mmNextItem ( -- ) // loop: vstack:( -- T* ) rstack:( T[]¢ a_idx e_idx -- T[]¢ a_idx e_idx ) // exit: vstack:( -- ) rstack:( T[]¢ a_idx e_idx -- ) // opcode bra.dest follows 0:$03ED 0:000011:A5=A5:D3=D8 push alu 0:$03EE 0:000011:A1=A5:D1=D8 0:$03EF 0:000011:A2=A2:D8=D1 popr alu,d0 // alu=e_idx, d0=a_idx 0:$03F0 0:000011:A2=A2:D4=D1 0:$03F1 0:001100:A1=A2:D3=D4 cmp d0 // todo: nodelay 0:$03F2 0:001100:A1=A2:D3=D4 0:$03F3 z:data:reset=0:$0000 if !z 0:$03F4 0:000011:A1=A2:DF=D1 ld d2ar,(sp) // d2ar = T[]¢ = handle -> memptr 0:$03F5 0:000011:A6=A1:D3=D8 dec alu // alu = --e_idx atmp 0:$03F6 0:010011:A6=A6:D3=D8 0:$03F7 0:000011:A1=A6:D8=D3 0:$03F8 0:010011:A2=A2:D3=D3 pshr d0,alu 0:$03F9 0:010011:A2=A2:D1=D4 0:$03FA 0:000011:A1=A2:D1=D8 0:$03FB 0:000100:A1=A7:D3=D1 add_c (d2ar) // alu -> data.data+e_idx 0:$03FC 0:000100:A1=A7:D8=D1 0:$03FD 0:000011:A0=A0:D0=D3 next_mc // => bra 0:$03FE d15:000011:A1=A0:D0=D0 else 1:$03F4 1:000011:A2=A2:D7=D1 popr dtmp // rdrop T[]¢ 1:$03F5 1:010011:A5=A5:D8=D1 pop alu // alu := top 1:$03F6 1:000011:A0=A0:D3=D8 inc ip // skip bra 1:$03F7 1:000011:A0=A0:D0=D3 next_mc // => exit loop 1:$03F8 d15:000011:A1=A0:D0=D0 then /* :mmNextItem48 ( -- ) // loop: vstack:( -- float* ) rstack:( float[]¢ a_idx e_idx -- float[]¢ a_idx e_idx ) // exit: vstack:( -- ) rstack:( float[]¢ a_idx e_idx -- ) // opcode bra.dest follows push alu popr alu,d0 // alu=e_idx, d0=a_idx cmp d0 // todo: nodelay if !z ld d2ar,(sp) // d2ar = T[]¢ = handle -> memptr sub 3 // alu = --e_idx dtmp pshr d0,alu add_c (d2ar) // alu -> data.data+e_idx next_mc // => bra else popr dtmp // rdrop T[]¢ pop alu // alu := top incr ip // skip bra next_mc // => exit loop then */ /* :NextItempp ( -- ) // loop: vstack:( -- T* ) rstack:( T[]¢ a_idx e_idx -- T[]¢ a_idx e_idx ) // exit: vstack:( -- ) rstack:( T[]¢ a_idx e_idx -- ) // opcode bra.dest follows push alu popr d0,alu // d0=e_idx, alu=a_idx cmp d0 if !z ld d2ar,(sp) // d2ar = T[]¢ = handle -> memptr ld atmp,alu inc atmp pshr atmp,d0 // dtmp add_c (d2ar) // alu -> data.data+a_idx next_mc // => bra else popr dtmp // rdrop T[]¢ pop alu // alu := top incr ip // skip bra next_mc // => exit loop then */ // ======================================== // Stack Basics // ======================================== :SwapWithVar ( int:Q int&:Z -- int:Z ) // swap data Q with contents of variable Z 0:$3A05 0:000011:A6=A1:D3=D8 ld atmp,alu // atmp -> var Z 0:$3A06 0:000011:A1=A6:D8=D1 ld alu,(atmp) // alu = Z 0:$3A07 0:010011:A5=A5:D7=D1 pop (atmp) // var Z = Q dtmp 0:$3A08 0:000011:A1=A6:D1=D7 0:$3A09 0:000011:A0=A0:D0=D3 next_mc 0:$3A0A d15:000011:A1=A0:D0=D0 :SwapWithVar2 ( long:Q long&:Z -- long:Z ) // swap data Q with contents of variable Z 0:$1F18 0:000011:A6=A1:D3=D8 ld atmp,alu // atmp -> var Z.h 0:$1F19 0:000011:A6=A6:D5=D1 ld d1,(atmp++) // d1 = Z.h 0:$1F1A 0:000011:A1=A6:D8=D1 ld alu,(atmp) // alu = Z.l 0:$1F1B 0:010011:A5=A5:D7=D1 pop dtmp // dtmp = Q.l 0:$1F1C 0:010011:A6=A6:D1=D7 ld (atmp--),dtmp // var Z.l = Q.l 0:$1F1D 0:000011:A1=A5:D7=D1 ld dtmp,(hp) // dtmp = Q.h 0:$1F1E 0:000011:A1=A6:D1=D7 ld (atmp),dtmp // var Z.h = Q.h 0:$1F1F 0:000011:A1=A5:D1=D5 ld (hp),d1 // RVAL.h = Z.h // ld alu,alu // RVAL.l = Z.l 0:$1F20 0:000011:A0=A0:D0=D3 next_mc 0:$1F21 d15:000011:A1=A0:D0=D0 :SwapWithVar3 ( float:Q float&:Z -- float:Z ) // swap data Q with contents of variable Z 0:$21F2 0:000011:A6=A1:D3=D8 ld atmp,alu // atmp -> var Z2 0:$21F3 0:000011:A6=A6:D6=D1 ld d2,(atmp++) // d2 = Z2 0:$21F4 0:000011:A6=A6:D5=D1 ld d1,(atmp++) // d1 = Z1 0:$21F5 0:000011:A1=A6:D8=D1 ld alu,(atmp) // alu = Z0 0:$21F6 0:010011:A5=A5:D7=D1 pop dtmp // dtmp = Q0 0:$21F7 0:010011:A6=A6:D1=D7 ld (atmp--),dtmp // var Z0 = Q0 0:$21F8 0:010011:A5=A5:D7=D1 pop dtmp // dtmp = Q1 0:$21F9 0:010011:A6=A6:D1=D7 ld (atmp--),dtmp // var Z1 = Q1 0:$21FA 0:000011:A1=A5:D7=D1 ld dtmp,(hp) // dtmp = Q2 0:$21FB 0:000011:A1=A6:D1=D7 ld (atmp),dtmp // var Z2 = Q2 0:$21FC 0:000011:A5=A5:D1=D6 ld (hp++),d2 // RVAL2 = Z2 0:$21FD 0:000011:A1=A5:D1=D5 ld (hp),d1 // RVAL1 = Z1 // ld alu,alu // RVAL0 = Z0 0:$21FE 0:000011:A0=A0:D0=D3 next_mc 0:$21FF d15:000011:A1=A0:D0=D0 :Poke3 ( exp mant_h mant_l float* -- ) 0:$1F36 0:000011:A6=A1:D3=D8 ld atmp,alu 0:$1F37 0:010011:A5=A5:D8=D1 pop alu,d0,dtmp 0:$1F38 0:010011:A5=A5:D4=D1 0:$1F39 0:010011:A5=A5:D7=D1 0:$1F3A 0:000011:A6=A6:D1=D7 ld (atmp++),dtmp 0:$1F3B 0:000011:A6=A6:D1=D4 ld (atmp++),d0 0:$1F3C 0:000011:A1=A6:D1=D8 ld (atmp),alu 0:$1F3D 0:010011:A5=A5:D8=D1 pop alu 0:$1F3E 0:000011:A0=A0:D0=D3 next_mc 0:$1F3F d15:000011:A1=A0:D0=D0 :Poke2 ( int int long* -- ) 0:$1E23 0:000011:A6=A1:D3=D8 ld atmp,alu 0:$1E24 0:010011:A5=A5:D8=D1 pop alu,dtmp // alu=lo, dtmp=hi 0:$1E25 0:010011:A5=A5:D7=D1 0:$1E26 0:000011:A6=A6:D1=D7 ld (atmp++),dtmp 0:$1E27 0:000011:A1=A6:D1=D8 ld (atmp),alu 0:$1E28 0:010011:A5=A5:D8=D1 pop alu 0:$1E29 0:000011:A0=A0:D0=D3 next_mc 0:$1E2A d15:000011:A1=A0:D0=D0 :Poke ( int int* -- ) 0:$1C5A 0:000011:A6=A1:D3=D8 ld atmp,alu 0:$1C5B 0:010011:A5=A5:D7=D1 pop dtmp 0:$1C5C 0:000011:A1=A6:D1=D7 ld (atmp),dtmp 0:$1C5D 0:010011:A5=A5:D8=D1 pop alu 0:$1C5E 0:000011:A0=A0:D0=D3 next_mc 0:$1C5F d15:000011:A1=A0:D0=D0 :Peek3 ( float* -- exp mant_h mant_l ) 0:$1F4A 0:000011:A6=A1:D3=D8 ld atmp,alu 0:$1F4B 0:000011:A5=A5:D3=D8 psh (atmp++) // dtmp 0:$1F4C 0:000011:A6=A6:D7=D1 0:$1F4D 0:000011:A1=A5:D1=D7 0:$1F4E 0:000011:A5=A5:D3=D7 psh (atmp++) // dtmp 0:$1F4F 0:000011:A6=A6:D7=D1 0:$1F50 0:000011:A1=A5:D1=D7 0:$1F51 0:000011:A1=A6:D8=D1 ld alu,(atmp) 0:$1F52 0:000011:A0=A0:D0=D3 next_mc 0:$1F53 d15:000011:A1=A0:D0=D0 :Peek2 ( long* -- int_h int_l ) 0:$1CD6 0:000011:A6=A1:D3=D8 ld atmp,alu 0:$1CD7 0:000011:A5=A5:D3=D8 psh (atmp++) // dtmp 0:$1CD8 0:000011:A6=A6:D7=D1 0:$1CD9 0:000011:A1=A5:D1=D7 0:$1CDA 0:000011:A1=A6:D8=D1 ld alu,(atmp) 0:$1CDB 0:000011:A0=A0:D0=D3 next_mc 0:$1CDC d15:000011:A1=A0:D0=D0 :Peek ( int* -- int ) 0:$1AC5 0:000011:A6=A1:D3=D8 ld atmp,alu 0:$1AC6 0:000011:A1=A6:D8=D1 ld alu,(atmp) 0:$1AC7 0:000011:A0=A0:D0=D3 next_mc 0:$1AC8 d15:000011:A1=A0:D0=D0 :Peek_Clear ( T& -- T ) // peek and clear var 0:$1C30 0:000011:A6=A1:D3=D8 ld atmp,alu 0:$1C31 0:000011:A1=A6:D8=D1 ld alu,(atmp) 0:$1C32 0:000011:A1=A6:D1=D0 ld (atmp),0 0:$1C33 0:data:reset=0:$0000 0:$1C34 0:000011:A0=A0:D0=D3 next_mc 0:$1C35 d15:000011:A1=A0:D0=D0 // swap top and 2nd on top value: // :Swap ( a b -- b a ) 0:$1B25 0:000011:A1=A5:D7=D1 ld dtmp,(hp) 0:$1B26 0:000011:A1=A5:D1=D8 ld (hp),alu 0:$1B27 0:000011:A1=A5:D8=D7 ld alu,dtmp 0:$1B28 0:000011:A0=A0:D0=D3 next_mc 0:$1B29 d15:000011:A1=A0:D0=D0 //:Over( a b -- a b a ) // ld dtmp,(hp++) // ld (hp),alu // ld alu,dtmp // next_mc :Dup2( a b -- a b a b ) // *not* MDup2 !! 0:$05EA 0:000011:A5=A5:D7=D1 ld dtmp,(hp++) // dtmp = a 0:$05EB 0:000011:A5=A5:D1=D8 ld (hp++),alu 0:$05EC 0:000011:A1=A5:D1=D7 ld (hp),dtmp 0:$05ED 0:000011:A0=A0:D0=D3 next_mc 0:$05EE d15:000011:A1=A0:D0=D0 // multi-Dup: // mc MDup0-i3 -> dup top word i3 times // if 0 0:$05EF 1:000011:A5=A5:D3=D8 MDup8: inc hp :1 0:$05F0 1:000011:A5=A5:D3=D8 inc hp :1 0:$05F1 1:000011:A5=A5:D3=D8 inc hp :1 0:$05F2 1:000011:A5=A5:D3=D8 inc hp :1 0:$05F3 1:000011:A5=A5:D3=D8 inc hp :1 0:$05F4 1:000011:A5=A5:D3=D8 inc hp :1 0:$05F5 1:000011:A5=A5:D3=D8 inc hp :1 0:$05F6 1:000011:A5=A5:D3=D8 inc hp :1 0:$05F7 0:000011:A1=A5:D3=D8 MDup0: nop else 1:$05EF 1:000011:A1=A7:D3=DF nop 1:$05F0 1:000011:A5=A5:D1=D8 ld (hp++),alu 1:$05F1 1:000011:A5=A5:D1=D8 ld (hp++),alu 1:$05F2 1:000011:A5=A5:D1=D8 ld (hp++),alu 1:$05F3 1:000011:A5=A5:D1=D8 ld (hp++),alu 1:$05F4 1:000011:A5=A5:D1=D8 ld (hp++),alu 1:$05F5 1:000011:A5=A5:D1=D8 ld (hp++),alu 1:$05F6 1:000011:A5=A5:D1=D8 ld (hp++),alu 1:$05F7 0:000011:A1=A5:D1=D8 ld (hp),alu then 0:$05F8 0:000011:A0=A0:D0=D3 next_mc 0:$05F9 d15:000011:A1=A0:D0=D0 // multi-Drop: // mc MDrop0-i3 -> drop i3 words // :MDrop8 ( x x x x x x x x -- ) 0:$1F2C 0:010011:A5=A5:D8=D1 pop alu 0:$1F2D 0:010011:A5=A5:D8=D1 pop alu 0:$1F2E 0:010011:A5=A5:D8=D1 pop alu 0:$1F2F 0:010011:A5=A5:D8=D1 pop alu 0:$1F30 0:010011:A5=A5:D8=D1 pop alu 0:$1F31 0:010011:A5=A5:D8=D1 pop alu 0:$1F32 0:010011:A5=A5:D8=D1 pop alu 0:$1F33 0:010011:A5=A5:D8=D1 pop alu 0:$1F34 0:000011:A0=A0:D0=D3 MDrop0: next_mc 0:$1F35 d15:000011:A1=A0:D0=D0 :Drop8_Next ( x x x x x x x x -- ) 0:$1FF4 0:010011:A5=A5:D8=D1 pop alu 0:$1FF5 0:010011:A5=A5:D8=D1 pop alu 0:$1FF6 0:010011:A5=A5:D8=D1 pop alu 0:$1FF7 0:010011:A5=A5:D8=D1 pop alu 0:$1FF8 0:010011:A5=A5:D8=D1 pop alu 0:$1FF9 0:010011:A5=A5:D8=D1 pop alu 0:$1FFA 0:010011:A5=A5:D8=D1 pop alu 0:$1FFB 0:010011:A5=A5:D8=D1 pop alu MDrop0_Next: 0:$1FFC 0:000011:A2=A2:D7=D1 popr ip // dtmp 0:$1FFD 0:000011:A0=A1:D3=D7 0:$1FFE 0:000011:A0=A0:D0=D3 next_mc 0:$1FFF d15:000011:A1=A0:D0=D0 // multi-Drop: // mc MNip0-i3 -> nip i3 words over int16 // :MNip8 ( x x x x x x x x a -- a ) 0:$1F22 0:010011:A5=A5:D3=D8 dec hp 0:$1F23 0:010011:A5=A5:D3=D8 dec hp 0:$1F24 0:010011:A5=A5:D3=D8 dec hp 0:$1F25 0:010011:A5=A5:D3=D8 dec hp 0:$1F26 0:010011:A5=A5:D3=D8 dec hp 0:$1F27 0:010011:A5=A5:D3=D8 dec hp 0:$1F28 0:010011:A5=A5:D3=D8 dec hp 0:$1F29 0:010011:A5=A5:D3=D8 dec hp 0:$1F2A 0:000011:A0=A0:D0=D3 MNip0: next_mc 0:$1F2B d15:000011:A1=A0:D0=D0 :MNip8_Next ( x x x x x x x x a -- a ) 0:$2309 0:010011:A5=A5:D3=D8 dec hp 0:$230A 0:010011:A5=A5:D3=D8 dec hp 0:$230B 0:010011:A5=A5:D3=D8 dec hp 0:$230C 0:010011:A5=A5:D3=D8 dec hp 0:$230D 0:010011:A5=A5:D3=D8 dec hp 0:$230E 0:010011:A5=A5:D3=D8 dec hp 0:$230F 0:010011:A5=A5:D3=D8 dec hp 0:$2310 0:010011:A5=A5:D3=D8 dec hp MNip0_Next: 0:$2311 0:000011:A2=A2:D7=D1 popr ip // dtmp 0:$2312 0:000011:A0=A1:D3=D7 0:$2313 0:000011:A0=A0:D0=D3 next_mc 0:$2314 d15:000011:A1=A0:D0=D0 Nip := MNip0-1 ( a b -- b ) Dup := MDup0-1 ( int -- int int ) Drop := MDrop0-1 ( x -- ) Drop2 := MDrop0-2 ( x x -- ) Drop3 := MDrop0-3 ( x x x -- ) Drop_Next := MDrop0_Next-1 ( x -- ) Drop2_Next := MDrop0_Next-2 ( x x -- ) Drop3_Next := MDrop0_Next-3 ( x x x -- ) // ======================================== // R-Stack: // ======================================== :ToR3 ( int int int -- ) 0:$1FA1 0:010011:A2=A2:D3=D8 pshr alu 0:$1FA2 0:000011:A1=A2:D1=D8 0:$1FA3 0:010011:A5=A5:D8=D1 pop alu ToR2: ( int int -- ) 0:$1FA4 0:010011:A2=A2:D3=D8 pshr alu 0:$1FA5 0:000011:A1=A2:D1=D8 0:$1FA6 0:010011:A5=A5:D8=D1 pop alu ToR: ( int -- ) 0:$1FA7 0:010011:A2=A2:D3=D8 pshr alu 0:$1FA8 0:000011:A1=A2:D1=D8 0:$1FA9 0:010011:A5=A5:D8=D1 pop alu 0:$1FAA 0:000011:A0=A0:D0=D3 next_mc 0:$1FAB d15:000011:A1=A0:D0=D0 :DupToR ( int -- int ) 0:$1A61 0:010011:A2=A2:D3=D8 pshr alu 0:$1A62 0:000011:A1=A2:D1=D8 0:$1A63 0:000011:A0=A0:D0=D3 next_mc 0:$1A64 d15:000011:A1=A0:D0=D0 :PeekR ( -- int ) 0:$1BD4 0:000011:A5=A5:D3=D9 psh alu 0:$1BD5 0:000011:A1=A5:D1=D8 0:$1BD6 0:000011:A1=A2:D8=D1 ld alu,(sp) 0:$1BD7 0:000011:A0=A0:D0=D3 next_mc 0:$1BD8 d15:000011:A1=A0:D0=D0 :DropR ( -- ) 0:$1A15 0:000011:A2=A2:D3=D8 inc sp 0:$1A16 0:000011:A0=A0:D0=D3 next_mc 0:$1A17 d15:000011:A1=A0:D0=D0 :FromR3 ( -- int int int ) 0:$1F96 0:000011:A5=A5:D3=D8 psh alu 0:$1F97 0:000011:A1=A5:D1=D8 0:$1F98 0:000011:A2=A2:D8=D1 popr alu FromR2: ( -- int int ) 0:$1F99 0:000011:A5=A5:D3=D8 psh alu 0:$1F9A 0:000011:A1=A5:D1=D8 0:$1F9B 0:000011:A2=A2:D8=D1 popr alu FromR: ( -- int ) 0:$1F9C 0:000011:A5=A5:D3=D8 psh alu 0:$1F9D 0:000011:A1=A5:D1=D8 0:$1F9E 0:000011:A2=A2:D8=D1 popr alu 0:$1F9F 0:000011:A0=A0:D0=D3 next_mc 0:$1FA0 d15:000011:A1=A0:D0=D0 // ======================================== // Data Access // ======================================== // get address of global variable at 0+dis: // Gvar := Int8 ( -- i16& ) // store value into global variable at 0+dis: // :Gset % $100 ( i16 -- ) 0:$1600 0:000011:A6=A1:D3=DF ld atmp,cmd_lo 0:$1601 0:000011:A1=A6:D1=D8 ld (atmp),alu 0:$1602 0:010011:A5=A5:D8=D1 pop alu 0:$1603 0:000011:A0=A0:D0=D3 next_mc 0:$1604 d15:000011:A1=A0:D0=D0 // read value from global variable at 0+dis: // :Gget % $100 ( -- i16 ) 1:$1F00 1:000011:A1=A7:DF=DF ld d2ar,cmd_lo // note: d2ar => merges with ++hp 1:$1F01 1:000011:A5=A5:D3=DF psh alu 1:$1F02 1:000011:A1=A5:D1=D8 1:$1F03 1:000011:A1=A7:D8=D1 ld alu,(d2ar) 1:$1F04 1:000011:A0=A0:D0=D3 next_mc 1:$1F05 d15:000011:A1=A0:D0=D0 // get address of local variable at HP-256+dis: // can't be used for HP[0] => use PshHP instead // :Lvar % $100 ( -- T& ) 0:$0700 0:000011:A5=A5:D3=DF psh alu 0:$0701 0:000011:A1=A5:D1=D8 0:$0702 0:110011:A6=A5:D3=D8 ld atmp,hp-dis 0:$0703 0:000011:A1=A6:D8=D3 ld alu,atmp 0:$0704 0:000011:A0=A0:D0=D3 next_mc 0:$0705 d15:000011:A1=A0:D0=D0 // read value from local variable at HP-256+dis: // can't be used for HP[0] => use Dup instead // :Lget % $100 ( -- i16 ) 0:$1800 0:000011:A5=A5:D3=DF psh alu 0:$1801 0:000011:A1=A5:D1=D8 0:$1802 0:110011:A6=A5:D3=D8 ld atmp,hp-dis 0:$1803 0:000011:A1=A6:D8=D1 ld alu,(atmp) 0:$1804 0:000011:A0=A0:D0=D3 next_mc 0:$1805 d15:000011:A1=A0:D0=D0 // store value into local variable at HP-256+dis: // can't be used for HP[0] => use Nip instead // :Lset % $100 ( i16 -- ) 1:$0E00 1:110011:A6=A5:D3=DF ld atmp,hp-dis 1:$0E01 1:000011:A1=A6:D1=D8 ld (atmp),alu 1:$0E02 1:010011:A5=A5:D8=D1 pop alu 1:$0E03 1:000011:A0=A0:D0=D3 next_mc 1:$0E04 d15:000011:A1=A0:D0=D0 // get address of outer local variable context 0: // :XLvar % $100 ( -- i16* ) 1:$0F00 1:000011:A5=A5:D3=DF psh alu 1:$0F01 1:000011:A1=A5:D1=D8 1:$0F02 1:000011:A6=A1:D3=D0 ld atmp,context0 1:$0F03 1:data:reset=0:$0020 1:$0F04 1:000011:A1=A6:DF=D1 ld d2ar,(atmp) 1:$0F05 1:100011:A6=A7:D3=D8 ld atmp,d2ar+dis 1:$0F06 1:000011:A1=A6:D8=D3 ld alu,atmp 1:$0F07 1:000011:A0=A0:D0=D3 next_mc 1:$0F08 d15:000011:A1=A0:D0=D0 :PushContext0 ( -- ) 0:$21E4 0:000011:A6=A1:D3=D0 ld atmp,context0 0:$21E5 0:data:reset=0:$0020 0:$21E6 0:010011:A2=A2:D3=D8 pshr (atmp) // dtmp 0:$21E7 0:000011:A1=A6:D7=D1 0:$21E8 0:000011:A1=A2:D1=D7 0:$21E9 0:000011:A1=A2:D7=D8 ld dtmp,alu 0:$21EA 0:000011:A1=A2:D8=D0 ld alu,-126 0:$21EB 0:data:reset=0:$FF82 0:$21EC 0:000000:A1=A5:D3=D3 add hp 0:$21ED 0:000000:A1=A5:D8=D3 0:$21EE 0:000011:A1=A6:D1=D8 ld (atmp),alu 0:$21EF 0:000011:A1=A6:D8=D7 ld alu,dtmp 0:$21F0 0:000011:A0=A0:D0=D3 next_mc 0:$21F1 d15:000011:A1=A0:D0=D0 :PopContext0 ( -- ) 0:$1BF4 0:000011:A6=A1:D3=D0 ld atmp,context0 0:$1BF5 0:data:reset=0:$0020 0:$1BF6 0:000011:A2=A2:D7=D1 popr (atmp) // dtmp 0:$1BF7 0:000011:A1=A6:D1=D7 0:$1BF8 0:000011:A0=A0:D0=D3 next_mc 0:$1BF9 d15:000011:A1=A0:D0=D0 // get address of outer local variable context 1: // :XXLvar % $100 ( -- i16* ) 0:$0800 0:000011:A5=A5:D3=DF psh alu 0:$0801 0:000011:A1=A5:D1=D8 0:$0802 0:000011:A6=A1:D3=D0 ld atmp,context1 0:$0803 0:data:reset=0:$0021 0:$0804 0:000011:A1=A6:DF=D1 ld d2ar,(atmp) 0:$0805 0:100011:A6=A7:D3=D8 ld atmp,d2ar+dis 0:$0806 0:000011:A1=A6:D8=D3 ld alu,atmp 0:$0807 0:000011:A0=A0:D0=D3 next_mc 0:$0808 d15:000011:A1=A0:D0=D0 :PushContext1 ( -- ) 0:$220F 0:000011:A6=A1:D3=D0 ld atmp,context1 0:$2210 0:data:reset=0:$0021 0:$2211 0:010011:A2=A2:D3=D8 pshr (atmp) // dtmp 0:$2212 0:000011:A1=A6:D7=D1 0:$2213 0:000011:A1=A2:D1=D7 0:$2214 0:000011:A1=A2:D7=D8 ld dtmp,alu 0:$2215 0:000011:A1=A2:D8=D0 ld alu,-126 0:$2216 0:data:reset=0:$FF82 0:$2217 0:000000:A1=A5:D3=D3 add hp 0:$2218 0:000000:A1=A5:D8=D3 0:$2219 0:000011:A1=A6:D1=D8 ld (atmp),alu 0:$221A 0:000011:A1=A6:D8=D7 ld alu,dtmp 0:$221B 0:000011:A0=A0:D0=D3 next_mc 0:$221C d15:000011:A1=A0:D0=D0 :PopContext1 ( -- ) 0:$1BFA 0:000011:A6=A1:D3=D0 ld atmp,context1 0:$1BFB 0:data:reset=0:$0021 0:$1BFC 0:000011:A2=A2:D7=D1 popr (atmp) // dtmp 0:$1BFD 0:000011:A1=A6:D1=D7 0:$1BFE 0:000011:A0=A0:D0=D3 next_mc 0:$1BFF d15:000011:A1=A0:D0=D0 // get address of struct item at offset dis // :Item % $100 ( T{}¢ -- T& ) 0:$1700 0:000011:A6=A1:D3=D8 ld atmp,alu // atmp = handle 0:$1701 0:000011:A1=A6:DF=D1 ld d2ar,(atmp) // d2ar = ptr -> data.len 0:$1702 0:100011:A6=A7:D3=D8 ld atmp,d2ar+dis // atmp -> item-1 0:$1703 0:000011:A6=A6:D3=D8 inc atmp // atmp -> item 0:$1704 0:000011:A1=A6:D8=D3 ld alu,atmp 0:$1705 0:000011:A0=A0:D0=D3 next_mc 0:$1706 d15:000011:A1=A0:D0=D0 // read value from struct item at offset dis // :ItemGet % $100 ( T{}¢ -- i16 ) 0:$1D00 0:000011:A6=A1:D3=D8 ld atmp,alu // atmp = handle 0:$1D01 0:000011:A1=A6:DF=D1 ld d2ar,(atmp) // d2ar = ptr -> data.len 0:$1D02 0:100011:A6=A7:D3=D8 ld atmp,d2ar+dis // atmp -> item-1 0:$1D03 0:000011:A6=A6:D3=D8 inc atmp // atmp -> item 0:$1D04 0:000011:A1=A6:D8=D1 ld alu,(atmp) 0:$1D05 0:000011:A0=A0:D0=D3 next_mc 0:$1D06 d15:000011:A1=A0:D0=D0 // store value into struct item at offset dis // :ItemSet % $100 ( i16 T{}¢ -- ) 0:$2300 0:000011:A6=A1:D3=D8 ld atmp,alu // atmp = handle 0:$2301 0:000011:A1=A6:DF=D1 ld d2ar,(atmp) // d2ar = ptr -> data.len 0:$2302 0:100011:A6=A7:D3=D8 ld atmp,d2ar+dis // atmp -> item-1 0:$2303 0:000011:A6=A6:D3=D8 inc atmp // atmp -> item 0:$2304 0:010011:A5=A5:D7=D1 pop (atmp),alu // dtmp 0:$2305 0:000011:A1=A6:D1=D7 0:$2306 0:010011:A5=A5:D8=D1 0:$2307 0:000011:A0=A0:D0=D3 next_mc 0:$2308 d15:000011:A1=A0:D0=D0 :Last ( int[]¢ -- int& ) 0:$0604 0:000011:A5=A5:D3=D8 psh alu 0:$0605 0:000011:A1=A5:D1=D8 0:$0606 z:data:reset=0:$0000 if !z 0:$0607 0:000011:A1=A0:DF=D8 ld d2ar,alu // d2ar=alu=handle 0:$0608 0:000011:A1=A7:DF=D1 ld d2ar,(d2ar) // d2ar=ptr 0:$0609 0:000011:A1=A7:D3=D1 tst (d2ar) 0:$060A 0:000011:A1=A7:D7=D1 ld dtmp,(d2ar) // dtmp=len 0:$060B z:data:reset=0:$0000 if !z 0:$060C 0:001110:A1=A0:D8=D8 orn alu // alu = alu | !alu = 0xffff 0:$060D 0:000000:A1=A7:D3=D1 add (d2ar) 0:$060E 0:000000:A1=A7:D8=D1 0:$060F 0:000011:A1=A7:D0=D0 jp AtIndex 0:$0610 d15:data:reset=0:$5E2E 1:$060C 1:000011:A1=A7:D0=D0 then 1:$060D d15:data:reset=0:$4611 1:$0607 1:000011:A1=A7:D0=D0 then 1:$0608 d15:data:reset=0:$4611 0:$0611 0:010011:A5=A5:D8=D1 pop alu 0:$0612 0:000011:A0=A0:D0=D3 next_mc 0:$0613 d15:000011:A1=A0:D0=D0 :AtIndex0 ( int[]¢ -- int& ) 0:$1E2B 0:000011:A5=A5:D3=D8 psh alu 0:$1E2C 0:000011:A1=A5:D1=D8 0:$1E2D 0:000001:A1=A5:D8=D8 xor alu // jp AtIndex AtIndex: ( int[]¢ idx -- int& ) 0:$1E2E 0:010011:A5=A5:DF=D1 pop d2ar // str handle -> memptr 0:$1E2F 0:000100:A1=A7:D3=D1 add_c (d2ar) // ptr -> bu[idx] 0:$1E30 0:000100:A1=A7:D8=D1 0:$1E31 0:000011:A0=A0:D0=D3 next_mc 0:$1E32 d15:000011:A1=A0:D0=D0 :AtIndex2 ( long[]¢ idx -- long& ) 0:$1C54 0:000000:A1=A3:D8=D8 add alu // offset = index*2 nodelay 0:$1C55 0:010011:A5=A5:DF=D1 pop d2ar // str handle -> memptr 0:$1C56 0:000100:A1=A7:D3=D1 add_c (d2ar) // ptr -> bu[idx] 0:$1C57 0:000100:A1=A7:D8=D1 0:$1C58 0:000011:A0=A0:D0=D3 next_mc 0:$1C59 d15:000011:A1=A0:D0=D0 :AtIndex3 ( float[]¢ idx -- float& ) 0:$1EB4 0:000011:A1=A7:D7=D8 ld dtmp,alu 0:$1EB5 0:000000:A1=A7:D8=D8 add alu // nodelay 0:$1EB6 0:000000:A1=A7:D3=D7 add dtmp // offset = index*3 0:$1EB7 0:000000:A1=A7:D8=D7 0:$1EB8 0:010011:A5=A5:DF=D1 pop d2ar // str handle -> memptr 0:$1EB9 0:000100:A1=A7:D3=D1 add_c (d2ar) // ptr -> bu[idx] 0:$1EBA 0:000100:A1=A7:D8=D1 0:$1EBB 0:000011:A0=A0:D0=D3 next_mc 0:$1EBC d15:000011:A1=A0:D0=D0 :AtIndexPeek ( int[]¢ idx -- int ) 0:$1CF9 0:010011:A5=A5:DF=D1 pop d2ar // str handle -> memptr 0:$1CFA 0:000100:A1=A7:D3=D1 add_c (d2ar) // ptr -> bu[idx] 0:$1CFB 0:000100:A1=A7:D8=D1 0:$1CFC 0:000011:A1=A7:DF=D8 ld d2ar,alu 0:$1CFD 0:000011:A1=A7:D8=D1 ld alu,(d2ar) // value 0:$1CFE 0:000011:A0=A0:D0=D3 next_mc 0:$1CFF d15:000011:A1=A0:D0=D0 :AtIndexPeek2 ( long[]¢ idx -- long ) 0:$1F8B 0:000000:A1=A7:D8=D8 add alu // offset = index*2 nodelay 0:$1F8C 0:010011:A5=A5:DF=D1 pop d2ar // str handle -> memptr 0:$1F8D 0:000100:A1=A7:D3=D1 add_c (d2ar) // ptr -> bu[idx] 0:$1F8E 0:000100:A1=A7:D8=D1 0:$1F8F 0:000011:A6=A1:D3=D8 ld atmp,alu 0:$1F90 0:000011:A5=A5:D3=D8 push (atmp++) // dtmp 0:$1F91 0:000011:A6=A6:D7=D1 0:$1F92 0:000011:A1=A5:D1=D7 0:$1F93 0:000011:A1=A6:D8=D1 ld alu,(atmp) 0:$1F94 0:000011:A0=A0:D0=D3 next_mc 0:$1F95 d15:000011:A1=A0:D0=D0 :AtIndexPeek3 ( float[]¢ idx -- float ) 0:$3002 0:000011:A1=A0:D7=D8 ld dtmp,alu 0:$3003 0:000000:A1=A0:D8=D8 add alu // nodelay 0:$3004 0:000000:A1=A0:D3=D7 add dtmp // offset = index*3 0:$3005 0:000000:A1=A0:D8=D7 0:$3006 0:010011:A5=A5:DF=D1 pop d2ar // str handle -> memptr 0:$3007 0:000100:A1=A7:D3=D1 add_c (d2ar) // ptr -> bu[idx] 0:$3008 0:000100:A1=A7:D8=D1 0:$3009 0:000011:A6=A1:D3=D8 ld atmp,alu 0:$300A 0:000011:A5=A5:D3=D8 push (atmp++),(atmp++) // dtmp 0:$300B 0:000011:A6=A6:D7=D1 0:$300C 0:000011:A5=A5:D1=D7 0:$300D 0:000011:A6=A6:D7=D1 0:$300E 0:000011:A1=A5:D1=D7 0:$300F 0:000011:A1=A6:D8=D1 ld alu,(atmp) 0:$3010 0:000011:A0=A0:D0=D3 next_mc 0:$3011 d15:000011:A1=A0:D0=D0 :AtIndexPoke ( int int[]¢ idx -- ) 0:$1E87 0:010011:A5=A5:DF=D1 pop d2ar // str handle -> memptr 0:$1E88 0:000100:A1=A7:D3=D1 add_c (d2ar) // ptr -> bu[idx] 0:$1E89 0:000100:A1=A7:D8=D1 0:$1E8A 0:000011:A1=A7:DF=D8 ld d2ar,alu 0:$1E8B 0:010011:A5=A5:D7=D1 pop (d2ar),alu // store value *dtmp* 0:$1E8C 0:000011:A1=A7:D1=D7 0:$1E8D 0:010011:A5=A5:D8=D1 0:$1E8E 0:000011:A0=A0:D0=D3 next_mc 0:$1E8F d15:000011:A1=A0:D0=D0 :AtIndexPoke3 ( float float[]¢ idx -- ) 0:$036F 0:000011:A1=A1:D7=D8 ld dtmp,alu 0:$0370 0:000000:A1=A1:D8=D8 add alu // nodelay 0:$0371 0:000000:A1=A1:D3=D7 add dtmp // offset = index*3 0:$0372 0:000000:A1=A1:D8=D7 0:$0373 0:010011:A5=A5:DF=D1 pop d2ar // str handle -> memptr 0:$0374 0:000100:A1=A7:D3=D1 add_c (d2ar) // ptr -> bu[idx] 0:$0375 0:000100:A1=A7:D8=D1 0:$0376 0:000011:A6=A1:D3=D8 ld atmp,alu // atmp -> bu[idx] 0:$0377 0:010011:A5=A5:D6=D1 pop d2,d1,d0,alu 0:$0378 0:010011:A5=A5:D5=D1 0:$0379 0:010011:A5=A5:D4=D1 0:$037A 0:010011:A5=A5:D8=D1 0:$037B 0:000011:A6=A6:D1=D4 ld (atmp++),d0 0:$037C 0:000011:A6=A6:D1=D5 ld (atmp++),d1 0:$037D 0:000011:A6=A6:D1=D6 ld (atmp++),d2 0:$037E 0:000011:A0=A0:D0=D3 next_mc 0:$037F d15:000011:A1=A0:D0=D0 SwapVar3: ( float& float& -- ) 0:$0380 0:000011:A6=A1:D3=D8 ld atmp,alu 0:$0381 0:010011:A5=A5:D7=D1 pop a0 // dtmp 0:$0382 0:000011:A3=A1:D3=D7 0:$0383 1:000011:A1=A3:D8=D1 sw3 ld alu,(a0) :1 if 1 1:$0384 1:000011:A1=A6:D7=D1 ld (a0++),(atmp) // dtmp 1:$0385 1:000011:A3=A3:D1=D7 1:$0386 1:000011:A6=A6:D1=D8 ld (atmp++),alu 1:$0387 1:000011:A1=A3:D8=D1 sw2 ld alu,(a0) 1:$0388 1:000011:A1=A6:D7=D1 ld (a0++),(atmp) // dtmp 1:$0389 1:000011:A3=A3:D1=D7 1:$038A 1:000011:A6=A6:D1=D8 ld (atmp++),alu 1:$038B 1:000011:A1=A3:D8=D1 sw1 ld alu,(a0) 1:$038C 1:000011:A1=A6:D7=D1 ld (a0++),(atmp) // dtmp 1:$038D 1:000011:A3=A3:D1=D7 1:$038E 1:000011:A6=A6:D1=D8 ld (atmp++),alu 1:$038F 1:010011:A5=A5:D8=D1 pop alu 1:$0390 1:000011:A0=A0:D0=D3 next_mc 1:$0391 d15:000011:A1=A0:D0=D0 else SwapVar2: ( long& long& -- ) 0:$0384 0:000011:A6=A1:D3=D8 ld atmp,alu 0:$0385 0:010011:A5=A5:D7=D1 pop a0 :1 // dtmp 0:$0386 1:000011:A3=A1:D3=D7 0:$0387 0:000011:A1=A1:D3=D7 nop SwapVar: ( int& int& -- ) 0:$0388 0:000011:A6=A1:D3=D8 ld atmp,alu 0:$0389 0:010011:A5=A5:D7=D1 pop a0 :1 // dtmp 0:$038A 1:000011:A3=A1:D3=D7 then // ======================================== // Registers: // ======================================== :PshHP ( -- a16 ) 0:$1BC5 0:000011:A5=A5:D3=D8 psh alu 0:$1BC6 0:000011:A1=A5:D1=D8 0:$1BC7 0:000011:A1=A5:D8=D3 ld alu,hp 0:$1BC8 0:000011:A0=A0:D0=D3 next_mc 0:$1BC9 d15:000011:A1=A0:D0=D0 :PopHP ( a16 -- ) 0:$1AE1 0:000011:A5=A1:D3=D8 ld hp,alu 0:$1AE2 0:010011:A5=A5:D8=D1 pop alu 0:$1AE3 0:000011:A0=A0:D0=D3 next_mc 0:$1AE4 d15:000011:A1=A0:D0=D0 :PshSP ( -- a16 ) 0:$1BDE 0:000011:A5=A5:D3=D8 psh alu 0:$1BDF 0:000011:A1=A5:D1=D8 0:$1BE0 0:000011:A1=A2:D8=D3 ld alu,sp 0:$1BE1 0:000011:A0=A0:D0=D3 next_mc 0:$1BE2 d15:000011:A1=A0:D0=D0 :PopSP ( a16 -- ) 0:$1A41 0:000011:A2=A1:D3=D8 ld sp,alu 0:$1A42 0:010011:A5=A5:D8=D1 pop alu 0:$1A43 0:000011:A0=A0:D0=D3 next_mc 0:$1A44 d15:000011:A1=A0:D0=D0 //:PshD0 ( -- i16 ) // psh alu // ld alu,d0 // next_mc //:PshD1 ( -- i16 ) // psh alu // ld alu,d1 // next_mc //:PshD2 ( -- i16 ) // psh alu // ld alu,d2 // next_mc //:PopD0 ( i16 -- ) // ld d0,alu // pop alu // next_mc //:PopD1 ( i16 -- ) // ld d1,alu // pop alu // next_mc //:PopD2 ( i16 -- ) // ld d2,alu // pop alu // next_mc //:PshA0 ( -- a16 ) // psh alu // ld alu,a0 // next_mc //:PshA1 ( -- a16 ) // psh alu // ld alu,a1 // next_mc //:PopA0 ( a16 -- ) // ld a0,alu // pop alu // next_mc //:PopA1 ( a16 -- ) // ld a1,alu // pop alu // next_mc //:PokeA0pp ( i16 -- ) // ld (a0++),alu // pop alu // next_mc //:PokeA1pp ( i16 -- ) // ld (a1++),alu // pop alu // next_mc //:PeekA0pp ( -- i16 ) // psh alu // ld alu,(a0++) // next_mc //:PeekA1pp ( -- i16 ) // psh alu // ld alu,(a1++) // next_mc //:PeekA0 ( -- i16 ) // psh alu // ld alu,(a0) // next_mc //:PeekA1 ( -- i16 ) // psh alu // ld alu,(a1) // next_mc //:IncA0 ( -- ) // inc a0 // next_mc //:DecA0 ( -- ) // dec a0 // next_mc //:IncA1 ( -- ) // inc a1 // next_mc //:DecA1 ( -- ) // dec a1 // next_mc // ======================================== // Misc. Functions // ======================================== // General Short Delay n+2 µs: // num_opcodes/µs = 1e-6 * 16e6 = 16 ( 1µs @ 16MHz ) // 0 ~ 2 µs // // Ival|delay // 6 // :BusyWait ( i16:µs -- ) 0:$07C2 0:000011:A6=A1:D3=D8 ld atmp,alu // 1 do 0:$07C3 0:data:clk/4=0:$0000 clr clock4 // 1..4 + n*4 1:4 0:$07C4 0:010011:A6=A6:D3=D3 tst atmp-- // 4 + n*4 0:$07C5 z:data:reset=0:$0000 until z // 8 + n*8 0:$07C6 0:000011:A1=A0:D0=D0 0:$07C7 d15:data:reset=0:$47C3 1:$07C6 1:data:clk/4=1:$0000 set clock4 // 4 1:1 1:$07C7 1:010011:A5=A5:D8=D1 pop alu // 1 1:$07C8 1:000011:A0=A0:D0=D3 next_mc // 3 1:$07C9 d15:000011:A1=A0:D0=D0 :SetIntMask ( -- ) 0:$1B2F 0:000011:A6=A1:D3=D0 ld io_ie_mask,(int_mask) // atmp 0:$1B30 0:data:reset=0:$0010 0:$1B31 0:000010:A1=A6:D2=D1 0:$1B32 0:000011:A0=A0:D0=D3 next_mc 0:$1B33 d15:000011:A1=A0:D0=D0 :Select ( i16:sel_mask -- ) // DI and select device 0:$1BCA 0:000001:A1=A0:D2=D8 ld io_select,alu 0:$1BCB 0:010011:A5=A5:D8=D1 pop alu Di: 0:$1BCC 0:data: ei=0:$0000 di 0:$1BCD 0:000011:A0=A0:D0=D3 next_mc 0:$1BCE d15:000011:A1=A0:D0=D0 :Deselect ( -- ) 0:$1B20 0:000001:A1=A0:D2=D0 ld io_select,$FFFF 0:$1B21 0:data:reset=0:$FFFF Ei: 0:$1B22 0:data: ei=1:$0000 ei 0:$1B23 0:000011:A0=A0:D0=D3 next_mc 0:$1B24 d15:000011:A1=A0:D0=D0 // LEDs on SSW: // :SetLedRed() 0:$1A0C 0:data:led_r=1:$0000 set led_red 0:$1A0D 0:000011:A0=A0:D0=D3 next_mc 0:$1A0E d15:000011:A1=A0:D0=D0 :ClrLedRed() 0:$19DF 0:data:led_r=0:$0000 clr led_red 0:$19E0 0:000011:A0=A0:D0=D3 next_mc 0:$19E1 d15:000011:A1=A0:D0=D0 :SetLedYel() 0:$19E8 0:data:led_y=1:$0000 set led_yel 0:$19E9 0:000011:A0=A0:D0=D3 next_mc 0:$19EA d15:000011:A1=A0:D0=D0 :ClrLedYel() 0:$19FD 0:data:led_y=0:$0000 clr led_yel 0:$19FE 0:000011:A0=A0:D0=D3 next_mc 0:$19FF d15:000011:A1=A0:D0=D0 :SetLedGrn() 0:$19DC 0:data:led_g=1:$0000 set led_grn 0:$19DD 0:000011:A0=A0:D0=D3 next_mc 0:$19DE d15:000011:A1=A0:D0=D0 :ClrLedGrn() 0:$19D3 0:data:led_g=0:$0000 clr led_grn 0:$19D4 0:000011:A0=A0:D0=D3 next_mc 0:$19D5 d15:000011:A1=A0:D0=D0 /* :SetLeds ( i3:ryg -- ) ld sr,alu,nc pop alu :bit0 if 0 ld sr,sr,nc clr led_red :bit0 else ld sr,sr,nc set led_red :bit0 then // cond if 0 ld sr,sr,nc clr led_yel :bit0 else ld sr,sr,nc set led_yel :bit0 then // cond if 0 clr led_grn else set led_grn then next_mc */ // ======================================================= // Logging // ======================================================= :LogChar ( char -- ) // put char (cpu emulator) logchar alu 0:$1A3D 0:000100:A1=A1:D2=D8 ld io,alu,d_bits=4 // * logchar 0:$1A3E 0:010011:A5=A5:D8=D1 pop alu 0:$1A3F 0:000011:A0=A0:D0=D3 next_mc 0:$1A40 d15:000011:A1=A0:D0=D0 :LogNum ( i16 -- ) // put number (cpu emulator) lognum alu 0:$1AB5 0:000101:A1=A0:D2=D8 ld io,alu,d_bits=5 // * lognum 0:$1AB6 0:010011:A5=A5:D8=D1 pop alu 0:$1AB7 0:000011:A0=A0:D0=D3 next_mc 0:$1AB8 d15:000011:A1=A0:D0=D0 :LogCstr ( str¢ -- ) 0:$0672 0:000011:A3=A1:D3=D8 ld a0,alu 0:$0673 0:000011:A1=A3:D7=D1 ld a1,(a0) // dtmp 0:$0674 0:000011:A4=A1:D3=D7 0:$0675 0:000011:A4=A4:D7=D1 ld atmp,(a1++) // dtmp 0:$0676 0:000011:A6=A1:D3=D7 0:$0677 0:000011:A1=A1:D0=D0 jp psc 0:$0678 d15:data:reset=0:$467A do logchar (a1++) 0:$0679 0:000100:A4=A4:D2=D1 ld io,(a1++),d_bits=4 // * logchar 0:$067A 0:010011:A6=A6:D3=D3 psc tst atmp-- 0:$067B z:data:reset=0:$0000 until z 0:$067C 0:000011:A1=A0:D0=D0 0:$067D d15:data:reset=0:$4679 1:$067C 1:010011:A5=A5:D8=D1 pop alu 1:$067D 1:000011:A0=A0:D0=D3 next_mc 1:$067E d15:000011:A1=A0:D0=D0 :LogStr ( str -- ) 0:$06D2 0:000011:A3=A1:D3=D8 ld a0,alu 0:$06D3 0:000011:A1=A3:D7=D1 ld a1,(a0) // dtmp 0:$06D4 0:000011:A4=A1:D3=D7 0:$06D5 0:000011:A4=A4:D7=D1 ld atmp,(a1++) // dtmp 0:$06D6 0:000011:A6=A1:D3=D7 0:$06D7 0:000011:A1=A1:D0=D0 jp psa 0:$06D8 d15:data:reset=0:$46DA do logchar (a1++) 0:$06D9 0:000100:A4=A4:D2=D1 ld io,(a1++),d_bits=4 // * logchar 0:$06DA 0:010011:A6=A6:D3=D3 psa tst atmp-- 0:$06DB z:data:reset=0:$0000 until z 0:$06DC 0:000011:A1=A0:D0=D0 0:$06DD d15:data:reset=0:$46D9 1:$06DC 1:000011:A1=A7:D0=D0 jp DropStr 1:$06DD d15:data:reset=0:$4581 :LogCC ( -- ) log_cc 0:$19CA 0:001001:A1=A7:D2=D8 ld io,alu,d_bits=9 // * log_cc 0:$19CB 0:000011:A0=A0:D0=D3 next_mc 0:$19CC d15:000011:A1=A0:D0=D0 :LogRegisters ( -- ) log_registers 0:$1A1B 0:001000:A1=A0:D2=D8 ld io,alu,d_bits=8 // * log_registers 0:$1A1C 0:000011:A0=A0:D0=D3 next_mc 0:$1A1D d15:000011:A1=A0:D0=D0 :LogMem ( -- ) logmem 0:$19EB 0:001100:A1=A0:D2=D8 ld io,alu,d_bits=12 // * logmem 0:$19EC 0:000011:A0=A0:D0=D3 next_mc 0:$19ED d15:000011:A1=A0:D0=D0 :LogHP ( -- ) logchar '<' 0:$2195 0:000100:A1=A3:D2=D0 ld io,'<',d_bits=4 // * logchar 0:$2196 0:data:reset=0:$003C logchar 'H' 0:$2197 0:000100:A1=A0:D2=D0 ld io,'H',d_bits=4 // * logchar 0:$2198 0:data:reset=0:$0048 logchar 'P' 0:$2199 0:000100:A1=A0:D2=D0 ld io,'P',d_bits=4 // * logchar 0:$219A 0:data:reset=0:$0050 logchar '=' 0:$219B 0:000100:A1=A0:D2=D0 ld io,'=',d_bits=4 // * logchar 0:$219C 0:data:reset=0:$003D lognum hp 0:$219D 0:000101:A1=A5:D2=D3 ld io,hp,d_bits=5 // * lognum logchar '>' 0:$219E 0:000100:A1=A5:D2=D0 ld io,'>',d_bits=4 // * logchar 0:$219F 0:data:reset=0:$003E 0:$21A0 0:000011:A0=A0:D0=D3 next_mc 0:$21A1 d15:000011:A1=A0:D0=D0 :Trace ( -- ) trace 2 0:$1AA9 0:001111:A1=A0:D2=D0 ld io,2,d_bits=15 // * trace 0:$1AAA 0:data:reset=0:$0002 0:$1AAB 0:000011:A0=A0:D0=D3 next_mc 0:$1AAC d15:000011:A1=A0:D0=D0 :Tron ( -- ) trace 1 0:$1A65 0:001111:A1=A0:D2=D0 ld io,1,d_bits=15 // * trace 0:$1A66 0:data:reset=0:$0001 0:$1A67 0:000011:A0=A0:D0=D3 next_mc 0:$1A68 d15:000011:A1=A0:D0=D0 :Troff ( -- ) trace 0 0:$1A71 0:001111:A1=A0:D2=D0 ld io,0,d_bits=15 // * trace 0:$1A72 0:data:reset=0:$0000 0:$1A73 0:000011:A0=A0:D0=D3 next_mc 0:$1A74 d15:000011:A1=A0:D0=D0 // --- file: "millicode.asm" --- #include "asm/millicode_int.asm" // +++ file: "millicode_int.asm" +++ /* Copyright (c) Günter Woigk 2009 - 2015 mailto:kio@little-bat.de This file is free software This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: ? Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. ? Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ // Microcode for the K1-16/16 CPU // // 2012-04-08 op__GT__5int16_5int16_5int16 := Gt ( i16:a i16:b -- i1 ) // für sort() op__LT__5int16_5int16_5int16 := Lt ( i16:a i16:b -- i1 ) // für sort() op__GT__6uint16_6uint16_5int16 := Ugt ( i16:a i16:b -- i1 ) // für sort() op__LT__6uint16_6uint16_5int16 := Ult ( i16:a i16:b -- i1 ) // für sort() // util: :DupToRPeekSwap ( int int* -- int int ) // UP 0:$1D80 0:010011:A2=A2:D3=D8 pshr alu 0:$1D81 0:000011:A1=A2:D1=D8 0:$1D82 0:000011:A3=A1:D3=D8 ld a0,alu 0:$1D83 0:000011:A1=A5:D8=D1 ld alu,(hp) 0:$1D84 0:000011:A1=A3:D7=D1 ld (hp),(a0) // dtmp 0:$1D85 0:000011:A1=A5:D1=D7 0:$1D86 0:000011:A0=A0:D0=D3 next_mc 0:$1D87 d15:000011:A1=A0:D0=D0 :FromRPokeNext ( int -- ) // UP 0:$1D78 0:000011:A2=A2:D7=D1 popr a0,ip // dtmp 0:$1D79 0:000011:A3=A1:D3=D7 0:$1D7A 0:000011:A2=A2:D7=D1 0:$1D7B 0:000011:A0=A1:D3=D7 0:$1D7C 0:000011:A1=A3:D1=D8 ld (a0),alu 0:$1D7D 0:010011:A5=A5:D8=D1 pop alu 0:$1D7E 0:000011:A0=A0:D0=D3 next_mc 0:$1D7F d15:000011:A1=A0:D0=D0 // ======================================================= // Immediate Values: // ======================================================= // add immediate value quick: // :Addq = $B00:0 ( i16 -- i16 ) 0:$0B00 0:000000:A1=A7:D3=DF add cmd_lo 0:$0B01 0:000000:A1=A7:D8=DF 0:$0B02 0:000011:A0=A0:D0=D3 next_mc 0:$0B03 d15:000011:A1=A0:D0=D0 // subtract immediate value quick: // :Subq = $C00:0 ( i16 -- i16 ) 0:$0C00 0:001100:A1=A7:D3=DF sub cmd_lo 0:$0C01 0:001100:A1=A7:D8=DF 0:$0C02 0:000011:A0=A0:D0=D3 next_mc 0:$0C03 d15:000011:A1=A0:D0=D0 // push immediate value 0..255 // :Int8 = $D00:0 ( -- i8 ) 0:$0D00 0:000011:A5=A5:D3=DF psh alu 0:$0D01 0:000011:A1=A5:D1=D8 0:$0D02 0:000011:A1=A5:D8=DF ld alu,cmd_lo 0:$0D03 0:000011:A0=A0:D0=D3 next_mc 0:$0D04 d15:000011:A1=A0:D0=D0 // extend int8 to int16 // Ival nn = mc Int8+nn.lo, Int16+nn.hi // :Int16 = $E00:0 ( i8 -- i16 ) 0:$0E00 0:000011:A1=A7:DA=DF ld swap,cmd_lo 0:$0E01 0:000110:A1=A7:D8=DA or swap 0:$0E02 0:000011:A0=A0:D0=D3 next_mc 0:$0E03 d15:000011:A1=A0:D0=D0 Inc := Addq+1 ( i16 -- i16 ) Dec := Subq+1 ( i16 -- i16 ) // ======================================================= // Arithmetics: // ======================================================= :Max ( i16:a i16:b -- i16 ) 0:$064B 0:010011:A5=A5:D7=D1 pop dtmp // dtmp=a 0:$064C 0:001100:A1=A5:D3=D7 sub dtmp // b-a 0:$064D 0:001100:A1=A5:D8=D7 0:$064E ovf:data:reset=0:$0000 if !ovfl // !ovfl: signed result b-a is valid 1:$064F 1:000011:A1=A7:D0=D0 1:$0650 d15:data:reset=0:$C653 0:$064F 0:000011:A1=A0:D3=D8 tst alu // b-a 0:$0650 d15:data:reset=0:$0000 if bit15 // b-a?0 => a?b 1:$0651 1:000011:A1=A6:D8=D7 ld alu,dtmp else 0:$0651 0:000000:A1=A0:D3=D7 add dtmp 0:$0652 0:000000:A1=A0:D8=D7 1:$0652 0:data:reset=0:$0000 then 0:$0653 0:000011:A0=A0:D0=D3 next_mc 0:$0654 d15:000011:A1=A0:D0=D0 else // ovfl: implies: sign(a) != sign(b) 1:$0653 1:000011:A1=A0:D3=D7 tst dtmp // a 1:$0654 d15:data:reset=0:$0000 if bit15 // a<0 => b?0 => b?a 1:$0655 1:000000:A1=A0:D3=D7 add dtmp 1:$0656 1:000000:A1=A0:D8=D7 else 0:$0655 0:000011:A1=A0:D8=D7 ld alu,dtmp 0:$0656 1:data:reset=0:$0000 then 1:$0657 1:000011:A0=A0:D0=D3 next_mc 1:$0658 d15:000011:A1=A0:D0=D0 then :Min ( i16:a i16:b -- i16 ) 0:$0623 0:010011:A5=A5:D7=D1 pop dtmp // dtmp=a 0:$0624 0:001100:A1=A5:D3=D7 sub dtmp // b-a 0:$0625 0:001100:A1=A5:D8=D7 0:$0626 ovf:data:reset=0:$0000 if !ovfl // !ovfl: signed result b-a is valid 1:$0627 1:000011:A1=A7:D0=D0 1:$0628 d15:data:reset=0:$C62B 0:$0627 0:000011:A1=A0:D3=D8 tst alu // b-a 0:$0628 d15:data:reset=0:$0000 if bit15 // b-a?0 => a?b 1:$0629 1:000000:A1=A6:D3=D7 add dtmp 1:$062A 0:000000:A1=A6:D8=D7 else 0:$0629 0:000011:A1=A0:D8=D7 ld alu,dtmp 0:$062A 0:data:reset=0:$0000 then 0:$062B 0:000011:A0=A0:D0=D3 next_mc 0:$062C d15:000011:A1=A0:D0=D0 else // ovfl: implies: sign(a) != sign(b) 1:$062B 1:000011:A1=A6:D3=D7 tst dtmp // a 1:$062C d15:data:reset=0:$0000 if bit15 // a<0 => b?0 => b?a 1:$062D 1:000011:A1=A0:D8=D7 ld alu,dtmp else 0:$062D 0:000000:A1=A0:D3=D7 add dtmp 0:$062E 1:000000:A1=A0:D8=D7 1:$062E 1:data:reset=0:$0000 then 1:$062F 1:000011:A0=A0:D0=D3 next_mc 1:$0630 d15:000011:A1=A0:D0=D0 then :Abs ( i16 -- u16 ) 0:$07D1 0:000011:A1=A4:D3=D8 tst alu 0:$07D2 d15:data:reset=0:$0000 if bit15 1:$07D3 1:000011:A6=A1:D3=D8 neg // atmp 1:$07D4 1:010011:A6=A6:D3=D8 1:$07D5 1:001011:A1=A6:D8=D3 1:$07D6 1:000011:A0=A0:D0=D3 next_mc 1:$07D7 d15:000011:A1=A0:D0=D0 else 0:$07D3 0:000011:A0=A0:D0=D3 next_mc 0:$07D4 d15:000011:A1=A0:D0=D0 then :Sign ( i16 -- i16 ) 0:$02F9 0:000011:A1=A4:D3=D8 tst alu 0:$02FA z:data:reset=0:$0000 if z 1:$02FB 1:000011:A0=A0:D0=D3 next_mc 1:$02FC d15:000011:A1=A0:D0=D0 else 0:$02FB 0:000011:A1=A0:D3=D8 tst alu 0:$02FC d15:000011:A1=A0:D8=D0 ld alu,ival : bit15 if 1 1:$02FD 0:data:reset=0:$FFFF dw $ffff else 0:$02FD 0:data:reset=0:$0001 dw $0001 then 0:$02FE 0:000011:A0=A0:D0=D3 next_mc 0:$02FF d15:000011:A1=A0:D0=D0 then :Cpl ( i16 -- i16 ) 0:$19E2 0:001011:A1=A0:D8=D8 cpl 0:$19E3 0:000011:A0=A0:D0=D3 next_mc 0:$19E4 d15:000011:A1=A0:D0=D0 :DropNeg ( i16:a i16:b -- i16:-a ) // -a = 0-a = 1-1-a = -1-(a-1) = ~(a-1) 0:$1BC0 0:010011:A5=A5:DF=D1 pop d2ar 0:$1BC1 0:010011:A6=A7:D3=D8 ld atmp,d2ar-1 0:$1BC2 0:001011:A1=A6:D8=D3 ldn atmp 0:$1BC3 0:000011:A0=A0:D0=D3 next_mc 0:$1BC4 d15:000011:A1=A0:D0=D0 :NipNeg ( i16:a i16:b -- i16:-b ) 0:$1C6C 0:010011:A5=A5:D3=D8 dec hp // nip // jp Neg Neg: ( i16 -- i16 ) 0:$1C6D 0:000011:A6=A1:D3=D8 neg // atmp 0:$1C6E 0:010011:A6=A6:D3=D8 0:$1C6F 0:001011:A1=A6:D8=D3 0:$1C70 0:000011:A0=A0:D0=D3 next_mc 0:$1C71 d15:000011:A1=A0:D0=D0 :Not ( i16 -- i16 ) 0:$0823 0:000011:A1=A2:D3=D8 tst alu 0:$0824 z:000001:A1=A2:D8=D8 xor alu :z if 1 1:$0825 0:000100:A1=A7:D8=D8 add_c alu // z => 1 nodelay 0:$0825 0:data:reset=0:$0000 then // nz => 0 0:$0826 0:000011:A0=A0:D0=D3 next_mc 0:$0827 d15:000011:A1=A0:D0=D0 :Bool ( i16 -- i16 ) 0:$0837 0:000011:A1=A6:D3=D8 tst alu 0:$0838 z:000001:A1=A6:D8=D8 xor alu :z if 0 0:$0839 0:000100:A1=A6:D8=D8 add_c alu // nz => 1 nodelay 1:$0839 0:data:reset=0:$0000 then // z => 0 0:$083A 0:000011:A0=A0:D0=D3 next_mc 0:$083B d15:000011:A1=A0:D0=D0 :Msbit0 ( i16 -- i4 ) 0:$1AA1 0:000011:A1=A0:DE=D8 ld msbit,alu 0:$1AA2 0:000011:A1=A0:D8=DE ld alu,msbit 0:$1AA3 0:000011:A0=A0:D0=D3 next_mc 0:$1AA4 d15:000011:A1=A0:D0=D0 :Msbit ( i16 -- i4 ) 0:$1B0C 0:001011:A1=A2:D8=D8 ldn alu 0:$1B0D 0:000011:A1=A2:DE=D8 ld msbit,alu 0:$1B0E 0:000011:A1=A2:D8=DE ld alu,msbit 0:$1B0F 0:000011:A0=A0:D0=D3 next_mc 0:$1B10 d15:000011:A1=A0:D0=D0 :Bit0 ( i16 -- i1 ) 0:$1AB1 0:000010:A1=A0:D8=D0 and 1 0:$1AB2 0:data:reset=0:$0001 0:$1AB3 0:000011:A0=A0:D0=D3 next_mc 0:$1AB4 d15:000011:A1=A0:D0=D0 :Add ( i16 i16 -- i16 ) 0:$1AAD 0:010000:A1=A5:D3=D1 add (hp--) 0:$1AAE 0:010000:A5=A5:D8=D1 0:$1AAF 0:000011:A0=A0:D0=D3 next_mc 0:$1AB0 d15:000011:A1=A0:D0=D0 :Sub( i16 i16 -- i16 ) 0:$1BAC 0:011000:A1=A5:D3=D1 sub_nc (hp--) 0:$1BAD 0:011000:A5=A5:D8=D1 0:$1BAE 0:001011:A1=A5:D8=D8 cpl 0:$1BAF 0:000011:A0=A0:D0=D3 next_mc 0:$1BB0 d15:000011:A1=A0:D0=D0 :And ( i16 i16 -- i16 ) 0:$1A0F 0:010010:A5=A5:D8=D1 and (hp--) 0:$1A10 0:000011:A0=A0:D0=D3 next_mc 0:$1A11 d15:000011:A1=A0:D0=D0 :Or ( i16 i16 -- i16 ) 0:$1A12 0:010110:A5=A5:D8=D1 or (hp--) 0:$1A13 0:000011:A0=A0:D0=D3 next_mc 0:$1A14 d15:000011:A1=A0:D0=D0 :Xor ( i16 i16 -- i16 ) 0:$1A09 0:010001:A5=A5:D8=D1 xor (hp--) 0:$1A0A 0:000011:A0=A0:D0=D3 next_mc 0:$1A0B d15:000011:A1=A0:D0=D0 :Eq( i16 i16 -- i1 ) 0:$07DF 0:000001:A1=A5:D3=D1 equ (hp) // delay 0:$07E0 0:010001:A5=A5:D3=D1 equ (hp--) 0:$07E1 z:000001:A1=A5:D8=D8 xor alu :z if 1 1:$07E2 0:000100:A1=A7:D8=D8 add_c alu // z => 1 nodelay 0:$07E2 0:data:reset=0:$0000 then 0:$07E3 0:000011:A0=A0:D0=D3 next_mc 0:$07E4 d15:000011:A1=A0:D0=D0 :Ne( i16 i16 -- i1 ) 0:$07D5 0:000001:A1=A5:D3=D1 equ (hp) // delay 0:$07D6 0:010001:A5=A5:D3=D1 equ (hp--) 0:$07D7 z:000001:A1=A5:D8=D8 xor alu :z if 0 0:$07D8 0:000100:A1=A5:D8=D8 add_c alu // z => 1 nodelay 1:$07D8 0:data:reset=0:$0000 then 0:$07D9 0:000011:A0=A0:D0=D3 next_mc 0:$07DA d15:000011:A1=A0:D0=D0 :Peekpp( i16& -- i16 ) // peek and increment variable 0:$1DB0 0:000011:A1=A0:DF=D8 ld d2ar,alu 0:$1DB1 0:000011:A1=A7:D8=D1 ld alu,(d2ar) 0:$1DB2 0:000011:A6=A1:D3=D8 ld atmp,alu 0:$1DB3 0:000011:A6=A6:D3=D8 inc atmp 0:$1DB4 0:000011:A1=A6:D7=D3 ld (d2ar),atmp // dtmp 0:$1DB5 0:000011:A1=A7:D1=D7 0:$1DB6 0:000011:A0=A0:D0=D3 next_mc 0:$1DB7 d15:000011:A1=A0:D0=D0 :Peekmm( i16& -- i16 ) 0:$1DD0 0:000011:A1=A0:DF=D8 ld d2ar,alu 0:$1DD1 0:000011:A1=A7:D8=D1 ld alu,(d2ar) 0:$1DD2 0:000011:A6=A1:D3=D8 ld atmp,alu 0:$1DD3 0:010011:A6=A6:D3=D8 dec atmp 0:$1DD4 0:000011:A1=A6:D7=D3 ld (d2ar),atmp // dtmp 0:$1DD5 0:000011:A1=A7:D1=D7 0:$1DD6 0:000011:A0=A0:D0=D3 next_mc 0:$1DD7 d15:000011:A1=A0:D0=D0 :ppPeek( i16& -- i16 ) // increment and peek variable 0:$1D68 0:000011:A1=A0:DF=D8 ld d2ar,alu 0:$1D69 0:000011:A1=A7:D8=D1 ld alu,(d2ar) 0:$1D6A 0:000011:A6=A1:D3=D8 inc alu // atmp 0:$1D6B 0:000011:A6=A6:D3=D8 0:$1D6C 0:000011:A1=A6:D8=D3 0:$1D6D 0:000011:A1=A7:D1=D8 ld (d2ar),alu 0:$1D6E 0:000011:A0=A0:D0=D3 next_mc 0:$1D6F d15:000011:A1=A0:D0=D0 :mmPeek( i16& -- i16 ) 0:$1D58 0:000011:A1=A4:DF=D8 ld d2ar,alu 0:$1D59 0:000011:A1=A7:D8=D1 ld alu,(d2ar) 0:$1D5A 0:000011:A6=A1:D3=D8 dec alu // atmp 0:$1D5B 0:010011:A6=A6:D3=D8 0:$1D5C 0:000011:A1=A6:D8=D3 0:$1D5D 0:000011:A1=A7:D1=D8 ld (d2ar),alu 0:$1D5E 0:000011:A0=A0:D0=D3 next_mc 0:$1D5F d15:000011:A1=A0:D0=D0 :Incr ( i16& -- ) 0:$1E7E 0:000011:A1=A7:DF=D8 ld d2ar,alu 0:$1E7F 0:000011:A1=A7:D8=D1 ld alu,(d2ar) 0:$1E80 0:000011:A6=A1:D3=D8 inc alu // atmp 0:$1E81 0:000011:A6=A6:D3=D8 0:$1E82 0:000011:A1=A6:D8=D3 0:$1E83 0:000011:A1=A7:D1=D8 ld (d2ar),alu 0:$1E84 0:010011:A5=A5:D8=D1 pop alu 0:$1E85 0:000011:A0=A0:D0=D3 next_mc 0:$1E86 d15:000011:A1=A0:D0=D0 :Decr ( i16& -- ) 0:$1EA2 0:000011:A1=A0:DF=D8 ld d2ar,alu 0:$1EA3 0:000011:A1=A7:D8=D1 ld alu,(d2ar) 0:$1EA4 0:000011:A6=A1:D3=D8 dec alu // atmp 0:$1EA5 0:010011:A6=A6:D3=D8 0:$1EA6 0:000011:A1=A6:D8=D3 0:$1EA7 0:000011:A1=A7:D1=D8 ld (d2ar),alu 0:$1EA8 0:010011:A5=A5:D8=D1 pop alu 0:$1EA9 0:000011:A0=A0:D0=D3 next_mc 0:$1EAA d15:000011:A1=A0:D0=D0 :AddPoke ( int int& -- ) 0:$1DA8 0:000011:A6=A1:D3=D8 ld atmp,alu 0:$1DA9 0:000011:A1=A6:D8=D1 ld alu,(atmp) 0:$1DAA 0:010000:A1=A5:D3=D1 add (hp--) 0:$1DAB 0:010000:A5=A5:D8=D1 0:$1DAC 0:000011:A1=A6:D1=D8 ld (atmp),alu 0:$1DAD 0:010011:A5=A5:D8=D1 pop alu 0:$1DAE 0:000011:A0=A0:D0=D3 next_mc 0:$1DAF d15:000011:A1=A0:D0=D0 :SubPoke ( int int& -- ) 0:$1E33 0:000011:A6=A1:D3=D8 ld atmp,alu 0:$1E34 0:000011:A1=A6:D8=D1 ld alu,(atmp) 0:$1E35 0:011100:A1=A5:D3=D1 sub (hp--) 0:$1E36 0:011100:A5=A5:D8=D1 0:$1E37 0:000011:A1=A6:D1=D8 ld (atmp),alu 0:$1E38 0:010011:A5=A5:D8=D1 pop alu 0:$1E39 0:000011:A0=A0:D0=D3 next_mc 0:$1E3A d15:000011:A1=A0:D0=D0 :AndPoke ( int int& -- ) 0:$1CDD 0:000011:A6=A1:D3=D8 ld atmp,alu 0:$1CDE 0:000011:A1=A6:D8=D1 ld alu,(atmp) 0:$1CDF 0:010010:A5=A5:D8=D1 and (hp--) 0:$1CE0 0:000011:A1=A6:D1=D8 ld (atmp),alu 0:$1CE1 0:010011:A5=A5:D8=D1 pop alu 0:$1CE2 0:000011:A0=A0:D0=D3 next_mc 0:$1CE3 d15:000011:A1=A0:D0=D0 :OrPoke ( int int& -- ) 0:$1CEB 0:000011:A6=A1:D3=D8 ld atmp,alu 0:$1CEC 0:000011:A1=A6:D8=D1 ld alu,(atmp) 0:$1CED 0:010110:A5=A5:D8=D1 or (hp--) 0:$1CEE 0:000011:A1=A6:D1=D8 ld (atmp),alu 0:$1CEF 0:010011:A5=A5:D8=D1 pop alu 0:$1CF0 0:000011:A0=A0:D0=D3 next_mc 0:$1CF1 d15:000011:A1=A0:D0=D0 :XorPoke ( int int& -- ) 0:$1CA5 0:000011:A6=A1:D3=D8 ld atmp,alu 0:$1CA6 0:000011:A1=A6:D8=D1 ld alu,(atmp) 0:$1CA7 0:010001:A5=A5:D8=D1 xor (hp--) 0:$1CA8 0:000011:A1=A6:D1=D8 ld (atmp),alu 0:$1CA9 0:010011:A5=A5:D8=D1 pop alu 0:$1CAA 0:000011:A0=A0:D0=D3 next_mc 0:$1CAB d15:000011:A1=A0:D0=D0 //:Add_p3_n ( float* int -- float* ) // ld dtmp,alu // add alu // nodelay // add dtmp // add (hp--) // next_mc //:Add_p2_n ( long* int -- long* ) // add alu // nodelay // add (hp--) // next_mc // ======================================================= // Signed Arithmetics: // ======================================================= :SignedCompares if 1 Gt: ( i16:a i16:b -- i1 ) // signed greater than 1:$02D4 1:010011:A5=A5:D7=D1 ld dtmp,(hp--) 1:$02D5 1:001100:A1=A5:D3=D7 ogt: sub dtmp // b-a 1:$02D6 0:001100:A1=A5:D8=D7 else Ge: ( i16:a i16:a -- i1 ) // signed greater or equal 0:$02D4 0:010011:A5=A5:D7=D1 ld dtmp,(hp--) 0:$02D5 0:001000:A1=A5:D3=D7 oge: sub_nc dtmp // b-a-1 0:$02D6 0:001000:A1=A5:D8=D7 then 0:$02D7 ovf:data:reset=0:$0000 if !ovfl // !ovfl: signed result b-a is valid 1:$02D8 1:000011:A1=A7:D0=D0 1:$02D9 d15:data:reset=0:$C2DB 0:$02D8 0:000011:A1=A0:D3=D8 tst alu // b-a 0:$02D9 d15:000001:A1=A0:D8=D8 xor alu :bit15 if 1 // b-a<0 => b (a>b) = true 1:$02DA 0:000100:A1=A2:D8=D8 add_c alu // => 1 nodelay 0:$02DA 0:data:reset=0:$0000 then 0:$02DB 0:000011:A0=A0:D0=D3 next_mc 0:$02DC d15:000011:A1=A0:D0=D0 else // ovfl: implies: sign(a) != sign(b) 1:$02DB 1:000011:A1=A2:D3=D7 tst dtmp // a 1:$02DC d15:000001:A1=A2:D8=D8 xor alu :bit15 if 0 // a?0 => b<0 => (a>b) = true 0:$02DD 1:000100:A1=A0:D8=D8 add_c alu // => 1 nodelay 1:$02DD 1:data:reset=0:$0000 then 1:$02DE 1:000011:A0=A0:D0=D3 next_mc 1:$02DF d15:000011:A1=A0:D0=D0 then if 1 Lt: ( i16:a i16:b -- i1 ) // signed less than 1:$02E0 1:010011:A5=A5:D7=D1 ld dtmp,(hp--) 1:$02E1 1:001000:A1=A5:D3=D7 olt: sub_nc dtmp // b-a-1 1:$02E2 1:001000:A1=A5:D8=D7 else Le: ( i16:a i16:a -- i1 ) // signed less or equal 0:$02E0 0:010011:A5=A5:D7=D1 ld dtmp,(hp--) 0:$02E1 0:001100:A1=A5:D3=D7 ole: sub dtmp // b-a 0:$02E2 1:001100:A1=A5:D8=D7 then 1:$02E3 ovf:data:reset=0:$0000 if !ovfl // !ovfl: signed result b-a is valid 1:$02E4 1:000011:A1=A0:D0=D0 1:$02E5 d15:data:reset=0:$C2E7 0:$02E4 0:000011:A1=A7:D3=D8 tst alu // b-a 0:$02E5 d15:000001:A1=A7:D8=D8 xor alu :bit15 if 0 // b-a?0 => b?a => (a?b) = true 0:$02E6 0:000100:A1=A7:D8=D8 add_c alu // => 1 nodelay 1:$02E6 0:data:reset=0:$0000 then 0:$02E7 0:000011:A0=A0:D0=D3 next_mc 0:$02E8 d15:000011:A1=A0:D0=D0 else // ovfl: implies: sign(a) != sign(b) 1:$02E7 1:000011:A1=A0:D3=D7 tst dtmp // a 1:$02E8 d15:000001:A1=A0:D8=D8 xor alu :bit15 if 1 // a<0 => b?0 => (a?b) = true 1:$02E9 1:000100:A1=A0:D8=D8 add_c alu // => 1 nodelay 0:$02E9 1:data:reset=0:$0000 then 1:$02EA 1:000011:A0=A0:D0=D3 next_mc 1:$02EB d15:000011:A1=A0:D0=D0 then // signed multiplication // Mul: ( i16 i16 -- i16 ) // signed multiplication 1:$02EC 1:010011:A5=A5:D4=D1 pop d0 // result pos or neg? 1:$02ED 1:000001:A1=A5:D8=D4 xor d0 // alu.bit15 = result.sign 1:$02EE 1:000011:A1=A5:D3=D8 tst alu 1:$02EF d15:000001:A1=A5:D8=D4 xor d0 :bit15 // test result.sign if 1 1:$02F0 1:000011:A3=A1:D3=D0 ld a0,Neg // resut<0: return to neg 1:$02F1 1:data:reset=0:$5C6D else 0:$02F0 0:000011:A3=A1:D3=D0 ld a0,next_mc // result?0: return to next millicode 0:$02F1 1:data:reset=0:$5ACF then mul_d0: // alu neg? 1:$02F2 1:000011:A6=A1:D3=D8 ld atmp,alu 1:$02F3 d15:010011:A6=A6:D3=D8 dec atmp :bit15 if 1 // note: ~a = -1-a 1:$02F4 1:001011:A1=A6:D8=D3 ldn atmp // alu = ~(atmp) = -1-(atmp) = -1-(alu-1) = -alu 0:$02F4 1:data:reset=0:$0000 then // d0 neg? 1:$02F5 1:000011:A6=A1:D3=D4 ld atmp,d0 1:$02F6 d15:010011:A6=A6:D3=D4 dec atmp :bit15 0:$02F7 0:000011:A1=A7:D0=D0 jp 0,mulu_d0 // d0 pos. 0:$02F8 d15:data:reset=0:$4408 1:$02F7 1:000011:A1=A6:D4=D8 ld d0,alu 1:$02F8 1:001011:A1=A6:D8=D3 ldn atmp 1:$02F9 1:000011:A1=A6:D0=D0 jp mulu_d0 1:$02FA d15:data:reset=0:$4408 // signed division // :Div ( i16:Q i16:D -- i16 ) // signed division 0:$05DD 0:000011:A1=A5:D4=D1 ld d0,(hp) // result pos or neg? 0:$05DE 0:000001:A1=A5:D8=D4 xor d0 // alu.bit15 = result.sign 0:$05DF 0:000011:A1=A5:D3=D8 tst alu 0:$05E0 d15:000001:A1=A5:D8=D4 xor d0 :bit15 // test result.sign if 1 1:$05E1 1:000011:A3=A1:D3=D0 ld a0,DropNeg // result<0: return to Drop + Neg 1:$05E2 0:data:reset=0:$5BC0 else 0:$05E1 0:000011:A3=A1:D3=D0 ld a0,Drop 0:$05E2 0:data:reset=0:$5F33 then div_d0: // alu neg? 0:$05E3 0:000011:A6=A1:D3=D8 ld atmp,alu 0:$05E4 d15:010011:A6=A6:D3=D8 dec atmp :bit15 if 1 // note: -a = ~(a-1) 1:$05E5 0:001011:A1=A6:D8=D3 ldn atmp // D = -D 0:$05E5 0:data:reset=0:$0000 then // d0 neg? 0:$05E6 0:000011:A6=A1:D3=D4 ld atmp,d0 0:$05E7 d15:010011:A6=A6:D3=D4 dec atmp :bit15 0:$05E8 0:000011:A1=A6:D0=D0 jp 0,divu // d0 pos. 0:$05E9 d15:data:reset=0:$41B6 1:$05E8 1:000011:A1=A7:D7=D8 ld dtmp,alu 1:$05E9 1:001011:A1=A6:D8=D3 ldn atmp 1:$05EA 1:000011:A1=A5:D1=D8 ld (hp),alu // Q = -Q 1:$05EB 1:000011:A1=A5:D8=D7 ld alu,dtmp 1:$05EC 1:000011:A1=A5:D0=D0 jp divu 1:$05ED d15:data:reset=0:$41B6 // Q = Q/D*D + Q%D // Q%D = Q - Q/D*D => sign(D) irrelevant, sign(Q%D) = sign(Q) ! // :Rem ( i16:Q i16:D -- i16:R ) // signed division remainder // D neg? 0:$062F 0:000011:A6=A1:D3=D8 ld atmp,alu 0:$0630 d15:010011:A6=A6:D3=D8 dec atmp :bit15 if 1 // note: -a = ~(a-1) 1:$0631 0:001011:A1=A6:D8=D3 ldn atmp // D = -D 0:$0631 0:data:reset=0:$0000 then // Q neg? => result neg? 0:$0632 0:000011:A1=A5:D4=D1 ld d0,(hp) 0:$0633 d15:000011:A3=A1:D3=D0 ld a0,ival :bit15 if 0 0:$0634 0:data:reset=0:$5F29 dw Nip // Q?0 => result?0 0:$0635 0:000011:A1=A7:D0=D0 jp divu 0:$0636 d15:data:reset=0:$41B6 else 1:$0634 1:data:reset=0:$5C6C dw NipNeg // Q<0 => result<0: return to neg 1:$0635 1:000011:A1=A4:D7=D8 ld dtmp,alu 1:$0636 1:000011:A6=A1:D3=D4 ld atmp,d0 1:$0637 1:010011:A6=A6:D3=D4 dec atmp 1:$0638 1:001011:A1=A6:D8=D3 ldn atmp 1:$0639 1:000011:A1=A5:D1=D8 ld (hp),alu // Q = -Q 1:$063A 1:000011:A1=A5:D8=D7 ld alu,dtmp 1:$063B 1:000011:A1=A5:D0=D0 jp divu 1:$063C d15:data:reset=0:$41B6 then :MulPoke ( int int& -- ) Millicoded 0:$1D49 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$1D4A 0:data:reset=0:$5D4D 0:$1D4B 0:000011:A1=A5:D0=D0 jp millicoded // * Millicoded 0:$1D4C d15:data:reset=0:$5F70 0:$1D4D d15:data:reset=0:$5D80 mc DupToRPeekSwap,Mul,FromRPokeNext 0:$1D4E d15:data:reset=0:$C2EC 0:$1D4F d15:data:reset=0:$5D78 :DivPoke ( int int& -- ) Millicoded 0:$1D18 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$1D19 0:data:reset=0:$5D1C 0:$1D1A 0:000011:A1=A5:D0=D0 jp millicoded // * Millicoded 0:$1D1B d15:data:reset=0:$5F70 0:$1D1C d15:data:reset=0:$5D80 mc DupToRPeekSwap,Div,FromRPokeNext 0:$1D1D d15:data:reset=0:$45DD 0:$1D1E d15:data:reset=0:$5D78 :RemPoke ( int int& -- ) Millicoded 0:$1CE4 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$1CE5 0:data:reset=0:$5CE8 0:$1CE6 0:000011:A1=A4:D0=D0 jp millicoded // * Millicoded 0:$1CE7 d15:data:reset=0:$5F70 0:$1CE8 d15:data:reset=0:$5D80 mc DupToRPeekSwap,Rem,FromRPokeNext 0:$1CE9 d15:data:reset=0:$462F 0:$1CEA d15:data:reset=0:$5D78 // ======================================================= // Unsigned Arithmetics: // ======================================================= :UnsignedCompares if 1 Ugt: ( u16:a u16:b -- i1 ) 1:$06C6 1:011100:A1=A5:D3=D1 cmp (hp--) // b-a 1:$06C7 1:011100:A5=A5:D3=D1 1:$06C8 cy:000001:A1=A5:D8=D8 xor alu :cy else Uge: ( u16:a u16:b -- i1 ) 0:$06C6 0:011000:A1=A5:D3=D1 cmp_nc (hp--) // b-a-1 0:$06C7 0:011000:A5=A5:D3=D1 0:$06C8 cy:000001:A1=A5:D8=D8 xor alu :cy then if 0 // !cy => cy => a>b | a?b 0:$06C9 0:000100:A1=A5:D8=D8 add_c alu // => 1 nodelay 1:$06C9 0:data:reset=0:$0000 then 0:$06CA 0:000011:A0=A0:D0=D3 next_mc 0:$06CB d15:000011:A1=A0:D0=D0 if 1 Ule: ( u16:a u16:b -- i1 ) // unsigned less or equal 1:$06CC 1:011100:A1=A5:D3=D1 cmp (hp--) // b-a 1:$06CD 1:011100:A5=A5:D3=D1 1:$06CE cy:000001:A1=A5:D8=D8 xor alu :cy else Ult: ( u16:a u16:b -- i1 ) // unsigned less than 0:$06CC 0:011000:A1=A5:D3=D1 cmp_nc (hp--) // b-a-1 0:$06CD 0:011000:A5=A5:D3=D1 0:$06CE cy:000001:A1=A5:D8=D8 xor alu :cy then if 1 // cy => !cy => b?a | b>a 1:$06CF 0:000100:A1=A5:D8=D8 add_c alu // => 1 nodelay 0:$06CF 0:data:reset=0:$0000 then 0:$06D0 0:000011:A0=A0:D0=D3 next_mc 0:$06D1 d15:000011:A1=A0:D0=D0 :Umax ( u16 u16 -- u16 ) 0:$05FA 0:001100:A1=A5:D3=D1 cmp (hp) 0:$05FB 0:001100:A1=A5:D3=D1 0:$05FC cy:010011:A5=A5:D7=D1 pop dtmp :cy if 1 // cy => !cy => alu?(hp) 1:$05FD 1:000011:A0=A0:D0=D3 next_mc 1:$05FE d15:000011:A1=A0:D0=D0 else 0:$05FD 0:000011:A1=A5:D8=D7 ld alu,dtmp 0:$05FE 0:000011:A0=A0:D0=D3 next_mc 0:$05FF d15:000011:A1=A0:D0=D0 then :Umin ( u16 u16 -- u16 ) 0:$080F 0:001100:A1=A5:D3=D1 cmp (hp) 0:$0810 0:001100:A1=A5:D3=D1 0:$0811 cy:010011:A5=A5:D7=D1 pop dtmp :cy if 1 // cy => !cy => alu?(hp) 1:$0812 1:000011:A1=A7:D8=D7 ld alu,dtmp 1:$0813 1:000011:A0=A0:D0=D3 next_mc 1:$0814 d15:000011:A1=A0:D0=D0 else 0:$0812 0:000011:A0=A0:D0=D3 next_mc 0:$0813 d15:000011:A1=A0:D0=D0 then :Log10 ( uint -- uint ) // 0 .. 4 // return x<100 ? x<10?1:2 : x<10000 ? x<1000?3:4 : 5 0:$0504 0:001100:A1=A0:D7=D0 cmp 100 // dtmp 0:$0505 0:data:reset=0:$0064 0:$0506 0:001100:A1=A0:D3=D7 0:$0507 0:001100:A1=A0:D3=D7 0:$0508 cy:data:reset=0:$0000 if !cy 1:$0509 1:000011:A1=A7:D0=D0 1:$050A d15:data:reset=0:$C50F 0:$0509 0:001100:A1=A0:D7=D0 cmp 10 // dtmp 0:$050A 0:data:reset=0:$000A 0:$050B 0:001100:A1=A0:D3=D7 0:$050C 0:001100:A1=A0:D3=D7 0:$050D cy:000011:A1=A0:D8=D0 ld alu,ival :cy if 0 0:$050E 0:data:reset=0:$0000 dw 0 else 1:$050E 0:data:reset=0:$0001 dw 1 then 0:$050F 0:000011:A0=A0:D0=D3 next_mc 0:$0510 d15:000011:A1=A0:D0=D0 else 1:$050F 1:001100:A1=A0:D7=D0 cmp 10000 // dtmp 1:$0510 1:data:reset=0:$2710 1:$0511 1:001100:A1=A7:D3=D7 1:$0512 1:001100:A1=A7:D3=D7 1:$0513 cy:data:reset=0:$0000 if cy 1:$0514 1:000011:A1=A0:D8=D0 ld alu,4 1:$0515 1:data:reset=0:$0004 1:$0516 1:000011:A0=A0:D0=D3 next_mc 1:$0517 d15:000011:A1=A0:D0=D0 else 0:$0514 0:001100:A1=A7:D7=D0 cmp 1000 // dtmp 0:$0515 0:data:reset=0:$03E8 0:$0516 0:001100:A1=A3:D3=D7 0:$0517 0:001100:A1=A3:D3=D7 0:$0518 cy:000011:A1=A3:D8=D0 ld alu,ival :cy if 0 0:$0519 0:data:reset=0:$0002 dw 2 else 1:$0519 0:data:reset=0:$0003 dw 3 then 0:$051A 0:000011:A0=A0:D0=D3 next_mc 0:$051B d15:000011:A1=A0:D0=D0 then then //:Mul10 ( uint -- uint ) // ld sl,alu,nc // sl=alu*2 // ld sl,sl,nc // sl=alu*4 // add sl // alu=alu*5 // add alu // alu=alu*10 nodelay // next_mc //:Exp10 ( uint -- uint ) // 0 .. 4 // //// return x<2 ? x?10:1 : x<4 ? x<3?100:1000 : 10000 // // cmp 5 // dtmp // if !cy // !cy => cy => x<5 // add tab // dtmp // ld cmd,alu // ld alu,ival :bit15 //tab dm 1,10,100,1000,10000 // else // xor alu // then // next_mc // ======================================== // unsigned multiplication and division // ======================================== :Mulu0 ( int -- int:0 ) 0:$19D9 0:000001:A1=A3:D8=D8 xor alu 0:$19DA 0:000011:A0=A0:D0=D3 next_mc 0:$19DB d15:000011:A1=A0:D0=D0 :Mulu5 ( int -- int ) 0:$1C1E 0:000011:A1=A3:DD=D8 ld sl,alu,nc 0:$1C1F 0:000011:A1=A3:DD=DD ld sl,sl,nc 0:$1C20 0:000000:A1=A3:D3=DD add sl 0:$1C21 0:000000:A1=A3:D8=DD 0:$1C22 0:000011:A0=A0:D0=D3 next_mc 0:$1C23 d15:000011:A1=A0:D0=D0 Mulu1 := Nop ( int -- int ) Mulu2 := Sli0-1 ( int -- int ) Mulu4 := Sli0-2 ( int -- int ) Mulu8 := Sli0-3 ( int -- int ) :Mulu6 ( int -- int ) 0:$1C2A 0:000000:A1=A0:D8=D8 add alu // nodelay Mulu3: ( int -- int ) 0:$1C2B 0:000011:A1=A0:DD=D8 ld sl,alu,nc 0:$1C2C 0:000000:A1=A0:D3=DD add sl 0:$1C2D 0:000000:A1=A0:D8=DD 0:$1C2E 0:000011:A0=A0:D0=D3 next_mc 0:$1C2F d15:000011:A1=A0:D0=D0 :Mulu7 ( int -- int ) 0:$1E53 0:000011:A1=A2:DD=D8 ld sl,alu,nc 0:$1E54 0:000000:A1=A2:D3=DD add sl 0:$1E55 0:000000:A1=A2:D8=DD 0:$1E56 0:000011:A1=A2:DD=DD ld sl,sl,nc 0:$1E57 0:000000:A1=A2:D3=DD add sl 0:$1E58 0:000000:A1=A2:D8=DD 0:$1E59 0:000011:A0=A0:D0=D3 next_mc 0:$1E5A d15:000011:A1=A0:D0=D0 // --------------------- :unsigned_multiplication if 1 MULU: ( u16 u16 -- u16 ) // unsigned multiplication 1:$0405 1:000011:A3=A1:D3=D0 ld a0,NEXT // a0 = return address 1:$0406 0:data:reset=0:$5A04 else Mulu: ( u16 u16 -- u16 ) // unsigned multiplication 0:$0405 0:000011:A3=A1:D3=D0 ld a0,next_mc // a0 = return address 0:$0406 0:data:reset=0:$5ACF then 0:$0407 0:010011:A5=A5:D4=D1 mulu: pop d0 0:$0408 0:000011:A1=A5:D5=D8 mulu_d0:ld d1,alu 0:$0409 0:001100:A1=A5:D3=D4 cmp d0 0:$040A 0:001100:A1=A5:D3=D4 0:$040B cy:data:reset=0:$0000 if !cy // !cy => cy => d1-d0<0 => d1 swap 0:$040C 0:000011:A1=A0:D5=D4 ld d1,d0 0:$040D 0:000011:A1=A0:D4=D8 ld d0,alu 1:$040C 1:data:reset=0:$0000 then 1:$040D 0:data:reset=0:$0000 // d0 ? d1 // d0?255 else overflow! 0:$040E 0:000011:A1=A0:DC=D4 ld sr,d0,nc // sr = d0>>1 = shift bits (should be max 8) 0:$040F d0:000011:A1=A0:DD=D5 ld sl,d1,nc :bit0 // sl = d1<<1 = add value if 1 1:$0410 0:000011:A1=A7:D8=D5 ld alu,d1 // add value for bit0 else 0:$0410 0:000001:A1=A0:D8=D8 xor alu then 0:$0411 0:000011:A1=A0:DC=DC ld sr,sr,nc 0:$0412 d0:000011:A1=A0:D3=DC nop :bit0 if 1 1:$0413 1:000000:A1=A7:D3=DD add sl // add value for bit1 1:$0414 0:000000:A1=A7:D8=DD 0:$0413 0:data:reset=0:$0000 then 0:$0414 0:data:reset=0:$0000 do 0:$0415 0:000011:A1=A0:DC=DC ld sr,sr,nc 0:$0416 d0:000011:A1=A0:DD=DD ld sl,sl,nc : bit0 if 1 1:$0417 1:000000:A1=A7:D3=DD add sl // add value for bit2 (5) 1:$0418 0:000000:A1=A7:D8=DD 0:$0417 0:data:reset=0:$0000 then 0:$0418 0:data:reset=0:$0000 0:$0419 0:000011:A1=A0:DC=DC ld sr,sr,nc 0:$041A d0:000011:A1=A0:DD=DD ld sl,sl,nc : bit0 if 1 1:$041B 1:000000:A1=A7:D3=DD add sl // add value for bit3 (6) 1:$041C 0:000000:A1=A7:D8=DD 0:$041B 0:data:reset=0:$0000 then 0:$041C 0:data:reset=0:$0000 0:$041D 0:000011:A1=A0:DC=DC ld sr,sr,nc 0:$041E d0:000011:A1=A0:DD=DD ld sl,sl,nc : bit0 if 1 1:$041F 1:000000:A1=A7:D3=DD add sl // add value for bit4 (7) 1:$0420 0:000000:A1=A7:D8=DD 0:$041F 0:data:reset=0:$0000 then 0:$0420 0:data:reset=0:$0000 0:$0421 0:000011:A1=A0:D3=DC tst sr 0:$0422 z:data:reset=0:$0000 while !z 0:$0423 0:000011:A1=A0:D0=D0 0:$0424 d15:data:reset=0:$4415 1:$0423 1:000011:A1=A3:D0=D3 jp a0 1:$0424 d15:data:reset=0:$0000 // --------------- :unsigned_division if 1 DIVU: ( u16:x u16:y -- u16:r ) // r = x/y 1:$01B4 1:000011:A3=A1:D3=D0 ld a0,DROP 1:$01B5 0:data:reset=0:$5F47 else Divu: ( u16:x u16:y -- u16:q ) // q = x/y 0:$01B4 0:000011:A3=A1:D3=D0 ld a0,Drop 0:$01B5 0:data:reset=0:$5F33 then divu: ( u16:Q u16:D -- u16:q u16:r ) // q = Q/D r = Q%D return via a0 // test ob im Divisor bit15 gesetzt ist: // dann kann der remainder nämlich einen Überlauf in bit16 haben // (dieser Test ist bei signed Div nicht nötig) 0:$01B6 0:000011:A1=A7:D4=D8 ld d0,alu // d0 = divisor D 0:$01B7 d15:data:reset=0:$0000 if bit15 1:$01B8 1:000011:A1=A5:D8=D1 ld alu,(hp) // alu=Q 1:$01B9 1:001100:A1=A5:D3=D4 cmp d0 // Q?D ? 1:$01BA 1:001100:A1=A5:D3=D4 1:$01BB cy:data:reset=0:$0000 if cy // cy => !cy => Q?D 1:$01BC 1:001100:A1=A0:D3=D4 sub d0 1:$01BD 1:001100:A1=A0:D8=D4 1:$01BE 1:000011:A1=A5:D1=D0 ld (hp),1 1:$01BF 1:data:reset=0:$0001 1:$01C0 1:000011:A1=A3:D0=D3 jp a0 1:$01C1 d15:data:reset=0:$0000 else 0:$01BC 0:000011:A1=A5:D1=D0 ld (hp),0 0:$01BD 0:data:reset=0:$0000 0:$01BE 0:000011:A1=A3:D0=D3 jp a0 0:$01BF d15:data:reset=0:$0000 then 0:$01B8 0:000011:A1=A0:D0=D0 then 0:$01B9 d15:data:reset=0:$C1C2 // ld d0,alu // d0 = divisor D 1:$01C2 1:000001:A1=A0:D8=D8 xor alu // alu = remainder 1:$01C3 1:000011:A1=A5:DC=D1 ld sr,(hp),nc // sl = divident Q / result q 1:$01C4 d0:data:reset=0:$0000 if bit0 1:$01C5 1:000111:A1=A0:DD=DC ld sl,sr,cy else 0:$01C5 1:000011:A1=A7:DD=DC ld sl,sr,nc then 1:$01C6 1:000011:A6=A1:D3=D0 ld atmp,16 // atmp = loop counter 1:$01C7 1:data:reset=0:$0010 do 1:$01C8 1:000011:A1=A0:D7=D8 ld dtmp,alu // for undo 1:$01C9 1:001100:A1=A0:D3=D4 sub d0 // try subtraction 1:$01CA 1:001100:A1=A0:D8=D4 1:$01CB cy:data:reset=0:$0000 if cy // cy => !cy => d0 fits in alu => keep it & result bit = 1 1:$01CC 1:000111:A1=A0:DD=DD ld sl,sl,cy // quotient << 1 + 1 1:$01CD d15:000011:A1=A0:D3=DD nop :bit15 1:$01CE 1:000100:A1=A0:D8=D8 add_c alu // remainder << 1 nodelay else // d0 did not fit in alu => restore alu & result bit = 0 0:$01CC 0:000011:A1=A7:DD=DD ld sl,sl,nc // quotient << 1 + 0 0:$01CD d15:000011:A1=A7:D8=D7 ld alu,dtmp :bit15 // undo sub 0:$01CE 1:000000:A1=A7:D8=D8 add alu // remainder << 1 nodelay then 1:$01CF 1:010011:A6=A6:D3=D3 tst atmp-- 1:$01D0 z:data:reset=0:$0000 while !z 0:$01D1 0:000011:A1=A7:D0=D0 0:$01D2 d15:data:reset=0:$C1C8 // now: d0=divisor, alu=remainder, sl=quotient 1:$01D1 1:000011:A1=A0:DC=D8 ld sr,alu,nc 1:$01D2 1:000011:A1=A0:D8=DC ld alu,sr 1:$01D3 1:000011:A1=A5:D1=DD ld (hp),sl 1:$01D4 1:000011:A1=A3:D0=D3 jp a0 // post 1:$01D5 d15:data:reset=0:$0000 1:$01D6 1:000011:A1=A0:D4=D8 ld d0,alu // d0 = divisor 1:$01D7 1:000011:A1=A5:DD=D1 ld sl,(hp),nc // alu+sl = 32 bit divident, result is shifted into sl 1:$01D8 d15:000001:A1=A5:D8=D8 xor alu : bit15 if 0 // alu+sl <<= 1 0:$01D9 1:000000:A1=A7:D8=D8 add alu // nodelay else 1:$01D9 1:000100:A1=A5:D8=D8 add_c alu // nodelay then 1:$01DA 1:000011:A4=A1:D3=D0 ld a1,15 1:$01DB 1:data:reset=0:$000F do 1:$01DC 1:000011:A1=A0:D7=D8 ld dtmp,alu // for undo 1:$01DD 1:001100:A1=A0:D3=D4 sub d0 // try subtraction 1:$01DE 1:001100:A1=A0:D8=D4 1:$01DF cy:000011:A1=A0:D3=D4 nop : cy if 1 // cy => !cy => d0 fits in alu => keep it & result bit = 1 1:$01E0 1:000111:A1=A0:DD=DD ld sl,sl,cy // shift left alu+sl and shift 1 into result 1:$01E1 d15:000011:A1=A0:D3=DD nop : bit15 1:$01E2 1:000000:A1=A0:D8=D8 add alu // nodelay else // d0 did not fit in alu => restore alu & result bit = 0 0:$01E0 0:000011:A1=A7:DD=DD ld sl,sl,nc // shift left alu+sl and shift 0 into result 0:$01E1 d15:000011:A1=A7:D8=D7 ld alu,dtmp : bit15 // undo sub 0:$01E2 1:000100:A1=A7:D8=D8 add_c alu // nodelay then 1:$01E3 1:010011:A4=A4:D3=D3 tst a1-- 1:$01E4 z:data:reset=0:$0000 while !z 0:$01E5 0:000011:A1=A7:D0=D0 0:$01E6 d15:data:reset=0:$C1DC // now: d0=divisor, alu=remainder, sl=quotient 1:$01E5 1:000011:A1=A5:D1=DD ld (hp),sl 1:$01E6 1:000011:A1=A3:D0=D3 jp a0 // post 1:$01E7 d15:data:reset=0:$0000 // ------------------ // unsigned remainder // :Remu ( u16:x u16:y -- u16:r ) // r = x%y 0:$1AE9 0:000011:A3=A1:D3=D0 ld a0,Nip 0:$1AEA 0:data:reset=0:$5F29 0:$1AEB 0:000011:A1=A7:D0=D0 jp divu 0:$1AEC d15:data:reset=0:$41B6 :MuluPoke ( int int& -- ) Millicoded 0:$1D26 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$1D27 0:data:reset=0:$5D2A 0:$1D28 0:000011:A1=A5:D0=D0 jp millicoded // * Millicoded 0:$1D29 d15:data:reset=0:$5F70 0:$1D2A d15:data:reset=0:$5D80 mc DupToRPeekSwap 0:$1D2B d15:data:reset=0:$4405 mc Mulu 0:$1D2C d15:data:reset=0:$5D78 mc FromRPokeNext :DivuPoke ( int int& -- ) Millicoded 0:$1CF2 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$1CF3 0:data:reset=0:$5CF6 0:$1CF4 0:000011:A1=A4:D0=D0 jp millicoded // * Millicoded 0:$1CF5 d15:data:reset=0:$5F70 0:$1CF6 d15:data:reset=0:$5D80 mc DupToRPeekSwap 0:$1CF7 d15:data:reset=0:$41B4 mc Divu 0:$1CF8 d15:data:reset=0:$5D78 mc FromRPokeNext :RemuPoke ( int int& -- ) Millicoded 0:$1D3B 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$1D3C 0:data:reset=0:$5D3F 0:$1D3D 0:000011:A1=A5:D0=D0 jp millicoded // * Millicoded 0:$1D3E d15:data:reset=0:$5F70 0:$1D3F d15:data:reset=0:$5D80 mc DupToRPeekSwap 0:$1D40 d15:data:reset=0:$5AE9 mc Remu 0:$1D41 d15:data:reset=0:$5D78 mc FromRPokeNext // ======================================== // mixed signedness // ======================================== :Lt_iu ( i16 u16 -- bool ) 0:$07DB 0:000011:A1=A0:D3=D8 tst alu 0:$07DC d15:010011:A5=A5:D7=D1 pop dtmp : bit15 0:$07DD 0:000011:A1=A5:D0=D0 jp 0,olt 0:$07DE d15:data:reset=0:$C2E1 1:$07DD 1:000011:A1=A7:D8=D0 ld alu,1 1:$07DE 1:data:reset=0:$0001 1:$07DF 1:000011:A0=A0:D0=D3 next_mc 1:$07E0 d15:000011:A1=A0:D0=D0 :Ge_iu ( i16 u16 -- bool ) 0:$081F 0:000011:A1=A0:D3=D8 tst alu 0:$0820 d15:010011:A5=A5:D7=D1 pop dtmp : bit15 0:$0821 0:000011:A1=A5:D0=D0 jp 0,oge 0:$0822 d15:data:reset=0:$42D5 1:$0821 1:001001:A1=A7:D8=D8 xorn alu 1:$0822 1:000011:A0=A0:D0=D3 next_mc 1:$0823 d15:000011:A1=A0:D0=D0 // ======================================== // shift left and shift right // ======================================== //:Srs1 ( i16 -- i16 ) // shift right signed once // tst alu // if bit15 // ld sr,alu,cy // else // ld sr,alu,nc // then // ld alu,sr // next_mc :Sl ( i16:a i4:n -- i16 ) // calculated shift: a = a<>n with 0<=n<=15 0:$049A 0:000010:A1=A0:D8=D0 and $000F 0:$049B 0:data:reset=0:$000F 0:$049C 0:001011:A1=A0:D8=D8 cpl // -1-n -1..-16 0:$049D 0:000000:A1=A0:D7=D0 add srutab+1 // srtab+1-1-n = srtab-n dtmp 0:$049E 0:data:reset=0:$C4B3 0:$049F 0:000000:A1=A4:D3=D7 0:$04A0 0:000000:A1=A4:D8=D7 0:$04A1 0:000011:A1=A4:D0=D8 ld cmd,alu // jp srtab-n 0:$04A2 d15:010011:A5=A5:D8=D1 pop alu :bit15 // a if 1 Sru15: ( u16 -- u16 ) // fixed shift right: a = a>>n with 0<=n<=15 1:$04A3 0:000011:A1=A7:DC=D8 ld sr,alu,nc :0 // a>>15 1:$04A4 0:000011:A1=A7:DC=D8 ld sr,alu,nc :0 // a>>14 1:$04A5 0:000011:A1=A7:DC=D8 ld sr,alu,nc :0 // a>>13 1:$04A6 0:000011:A1=A7:DC=D8 ld sr,alu,nc :0 // a>>12 1:$04A7 0:000011:A1=A7:DC=D8 ld sr,alu,nc :0 // a>>11 1:$04A8 0:000011:A1=A7:DC=D8 ld sr,alu,nc :0 // a>>10 1:$04A9 0:000011:A1=A7:DC=D8 ld sr,alu,nc :0 // a>>9 1:$04AA 0:000011:A1=A7:DC=D8 ld sr,alu,nc :0 // a>>8 1:$04AB 0:000011:A1=A7:DC=D8 ld sr,alu,nc :0 // a>>7 1:$04AC 0:000011:A1=A7:DC=D8 ld sr,alu,nc :0 // a>>6 1:$04AD 0:000011:A1=A7:DC=D8 ld sr,alu,nc :0 // a>>5 1:$04AE 0:000011:A1=A7:DC=D8 ld sr,alu,nc :0 // a>>4 1:$04AF 0:000011:A1=A7:DC=D8 ld sr,alu,nc :0 // a>>3 1:$04B0 0:000011:A1=A7:DC=D8 ld sr,alu,nc :0 // a>>2 1:$04B1 0:000011:A1=A7:DC=D8 ld sr,alu,nc :0 // a>>1 1:$04B2 1:000011:A0=A0:D0=D3 srutab next_mc // a>>0 1:$04B3 d15:000011:A1=A0:D0=D0 else 0:$04A3 0:000011:A1=A5:D3=D8 nop // a>>15 0:$04A4 0:000011:A1=A5:DC=DC ld sr,sr , nc // a>>14 0:$04A5 0:000011:A1=A5:DC=DC ld sr,sr , nc // a>>13 0:$04A6 0:000011:A1=A5:DC=DC ld sr,sr , nc // a>>12 0:$04A7 0:000011:A1=A5:DC=DC ld sr,sr , nc // a>>11 0:$04A8 0:000011:A1=A5:DC=DC ld sr,sr , nc // a>>10 0:$04A9 0:000011:A1=A5:DC=DC ld sr,sr , nc // a>>9 0:$04AA 0:000011:A1=A5:DC=DC ld sr,sr , nc // a>>8 0:$04AB 0:000011:A1=A5:DC=DC ld sr,sr , nc // a>>7 0:$04AC 0:000011:A1=A5:DC=DC ld sr,sr , nc // a>>6 0:$04AD 0:000011:A1=A5:DC=DC ld sr,sr , nc // a>>5 0:$04AE 0:000011:A1=A5:DC=DC ld sr,sr , nc // a>>4 0:$04AF 0:000011:A1=A5:DC=DC ld sr,sr , nc // a>>3 0:$04B0 0:000011:A1=A5:DC=DC ld sr,sr , nc // a>>2 0:$04B1 0:000011:A1=A5:DC=DC ld sr,sr , nc // a>>1 0:$04B2 0:000011:A1=A5:D8=DC ld alu,sr // a>>0 0:$04B3 0:000011:A0=A0:D0=D3 next_mc 0:$04B4 d15:000011:A1=A0:D0=D0 then Sru0: = srutab ( int -- int ) // fixed shift right Sru1: = srutab-1 ( int -- int ) // single shift right :SrsPoke ( u4 u16* -- ) // calculated shift right signed 0:$03CD 0:000011:A1=A3:DF=D8 ld d2ar,alu // d2ar -> var; 0:$03CE 0:010011:A5=A5:D8=D1 pop alu // alu = u4 0:$03CF 0:001011:A1=A5:D8=D8 cpl // alu = -1 -u4 => 0..15 -> -1..-16 0:$03D0 0:000110:A1=A5:D8=D0 or $FFF0 // dtmp 0:$03D1 0:data:reset=0:$FFF0 0:$03D2 0:000000:A1=A7:D7=D0 add srstab+16 // dtmp 0:$03D3 0:data:reset=0:$C3EC 0:$03D4 0:000000:A1=A3:D3=D7 0:$03D5 0:000000:A1=A3:D8=D7 0:$03D6 0:000011:A1=A3:D4=D8 ld d0,alu // d0 -> srstab +16 -1 -u4 0:$03D7 0:010011:A5=A5:D8=D1 pop alu // alu = new TOP 0:$03D8 0:000011:A1=A7:D3=D1 tst (d2ar) 0:$03D9 d15:data:reset=0:$0000 if bit15 1:$03DA 1:000011:A1=A7:D0=D4 ld cmd,d0 // jp 1:$03DB 1:000111:A1=A7:DC=D1 ld sr,(d2ar),cy :1 // post else 0:$03DA 0:000011:A1=A0:D0=D4 ld cmd,d0 // jp 0:$03DB 0:000011:A1=A7:DC=D1 ld sr,(d2ar),nc :0 // post then if 1 1:$03DC 1:000111:A1=A7:DC=DC srstab ld sr,sr , cy // a>>15 1:$03DD 1:000111:A1=A7:DC=DC ld sr,sr , cy // a>>14 1:$03DE 1:000111:A1=A7:DC=DC ld sr,sr , cy // a>>13 1:$03DF 1:000111:A1=A7:DC=DC ld sr,sr , cy // a>>12 1:$03E0 1:000111:A1=A7:DC=DC ld sr,sr , cy // a>>11 1:$03E1 1:000111:A1=A7:DC=DC ld sr,sr , cy // a>>10 1:$03E2 1:000111:A1=A7:DC=DC ld sr,sr , cy // a>>9 1:$03E3 1:000111:A1=A7:DC=DC ld sr,sr , cy // a>>8 1:$03E4 1:000111:A1=A7:DC=DC ld sr,sr , cy // a>>7 1:$03E5 1:000111:A1=A7:DC=DC ld sr,sr , cy // a>>6 1:$03E6 1:000111:A1=A7:DC=DC ld sr,sr , cy // a>>5 1:$03E7 1:000111:A1=A7:DC=DC ld sr,sr , cy // a>>4 1:$03E8 1:000111:A1=A7:DC=DC ld sr,sr , cy // a>>3 1:$03E9 1:000111:A1=A7:DC=DC ld sr,sr , cy // a>>2 1:$03EA 1:000011:A1=A7:D1=DC ld (d2ar),sr // a>>1 1:$03EB 1:000011:A0=A0:D0=D3 next_mc // a>>0 1:$03EC d15:000011:A1=A0:D0=D0 else 0:$03DC 0:000011:A1=A7:DC=DC ld sr,sr , nc // a>>15 0:$03DD 0:000011:A1=A7:DC=DC ld sr,sr , nc // a>>14 0:$03DE 0:000011:A1=A7:DC=DC ld sr,sr , nc // a>>13 0:$03DF 0:000011:A1=A7:DC=DC ld sr,sr , nc // a>>12 0:$03E0 0:000011:A1=A7:DC=DC ld sr,sr , nc // a>>11 0:$03E1 0:000011:A1=A7:DC=DC ld sr,sr , nc // a>>10 0:$03E2 0:000011:A1=A7:DC=DC ld sr,sr , nc // a>>9 0:$03E3 0:000011:A1=A7:DC=DC ld sr,sr , nc // a>>8 0:$03E4 0:000011:A1=A7:DC=DC ld sr,sr , nc // a>>7 0:$03E5 0:000011:A1=A7:DC=DC ld sr,sr , nc // a>>6 0:$03E6 0:000011:A1=A7:DC=DC ld sr,sr , nc // a>>5 0:$03E7 0:000011:A1=A7:DC=DC ld sr,sr , nc // a>>4 0:$03E8 0:000011:A1=A7:DC=DC ld sr,sr , nc // a>>3 0:$03E9 0:000011:A1=A7:DC=DC ld sr,sr , nc // a>>2 0:$03EA 0:000011:A1=A7:D1=DC ld (d2ar),sr // a>>1 0:$03EB 0:000011:A0=A0:D0=D3 next_mc // a>>0 0:$03EC d15:000011:A1=A0:D0=D0 then :SruPoke ( i4:n i16*:a -- ) 0:$047D 0:000011:A3=A1:D3=D8 ld a0,alu // a0: dest 0:$047E 0:010011:A5=A5:D8=D1 pop alu // alu: dist 0:$047F 0:000010:A1=A5:D8=D0 and $000F 0:$0480 0:data:reset=0:$000F 0:$0481 0:001011:A1=A0:D8=D8 cpl // -1-n -1..-16 0:$0482 0:000000:A1=A0:D7=D0 add srutab+1 // srtab+1-1-n = srtab-n dtmp 0:$0483 0:data:reset=0:$C498 0:$0484 0:000000:A1=A4:D3=D7 0:$0485 0:000000:A1=A4:D8=D7 0:$0486 0:000011:A1=A4:D0=D8 ld cmd,alu // jp srtab-n 0:$0487 d15:010011:A5=A5:D8=D1 pop alu :bit15 // new TOP if 1 1:$0488 0:000011:A1=A3:DC=D1 ld sr,(a0) , nc :0 // a>>15 1:$0489 0:000011:A1=A3:DC=D1 ld sr,(a0) , nc :0 // a>>14 1:$048A 0:000011:A1=A3:DC=D1 ld sr,(a0) , nc :0 // a>>13 1:$048B 0:000011:A1=A3:DC=D1 ld sr,(a0) , nc :0 // a>>12 1:$048C 0:000011:A1=A3:DC=D1 ld sr,(a0) , nc :0 // a>>11 1:$048D 0:000011:A1=A3:DC=D1 ld sr,(a0) , nc :0 // a>>10 1:$048E 0:000011:A1=A3:DC=D1 ld sr,(a0) , nc :0 // a>>9 1:$048F 0:000011:A1=A3:DC=D1 ld sr,(a0) , nc :0 // a>>8 1:$0490 0:000011:A1=A3:DC=D1 ld sr,(a0) , nc :0 // a>>7 1:$0491 0:000011:A1=A3:DC=D1 ld sr,(a0) , nc :0 // a>>6 1:$0492 0:000011:A1=A3:DC=D1 ld sr,(a0) , nc :0 // a>>5 1:$0493 0:000011:A1=A3:DC=D1 ld sr,(a0) , nc :0 // a>>4 1:$0494 0:000011:A1=A3:DC=D1 ld sr,(a0) , nc :0 // a>>3 1:$0495 0:000011:A1=A3:DC=D1 ld sr,(a0) , nc :0 // a>>2 1:$0496 0:000011:A1=A3:DC=D1 ld sr,(a0) , nc :0 // a>>1 1:$0497 1:000011:A0=A0:D0=D3 srutab next_mc // a>>0 1:$0498 d15:000011:A1=A0:D0=D0 else 0:$0488 0:000011:A1=A5:D3=D8 nop // a>>15 0:$0489 0:000011:A1=A5:DC=DC ld sr,sr , nc // a>>14 0:$048A 0:000011:A1=A5:DC=DC ld sr,sr , nc // a>>13 0:$048B 0:000011:A1=A5:DC=DC ld sr,sr , nc // a>>12 0:$048C 0:000011:A1=A5:DC=DC ld sr,sr , nc // a>>11 0:$048D 0:000011:A1=A5:DC=DC ld sr,sr , nc // a>>10 0:$048E 0:000011:A1=A5:DC=DC ld sr,sr , nc // a>>9 0:$048F 0:000011:A1=A5:DC=DC ld sr,sr , nc // a>>8 0:$0490 0:000011:A1=A5:DC=DC ld sr,sr , nc // a>>7 0:$0491 0:000011:A1=A5:DC=DC ld sr,sr , nc // a>>6 0:$0492 0:000011:A1=A5:DC=DC ld sr,sr , nc // a>>5 0:$0493 0:000011:A1=A5:DC=DC ld sr,sr , nc // a>>4 0:$0494 0:000011:A1=A5:DC=DC ld sr,sr , nc // a>>3 0:$0495 0:000011:A1=A5:DC=DC ld sr,sr , nc // a>>2 0:$0496 0:000011:A1=A5:DC=DC ld sr,sr , nc // a>>1 0:$0497 0:000011:A1=A3:D1=DC ld (a0),sr // a>>0 0:$0498 0:000011:A0=A0:D0=D3 next_mc 0:$0499 d15:000011:A1=A0:D0=D0 then :SlPoke ( i4:n i16*:a -- ) // calculated shift: a <<= n with 0<=n<=15 0:$291E 0:000011:A3=A1:D3=D8 ld a0,alu 0:$291F 0:010011:A5=A5:D8=D1 pop alu 0:$2920 0:000010:A1=A5:D8=D0 and $000f // n 0..15 0:$2921 0:data:reset=0:$000F 0:$2922 0:001011:A1=A0:D8=D8 cpl // -1-n -1..-16 0:$2923 0:000000:A1=A0:D7=D0 add sltab+1 // sltab+1-1-n = sltab-n dtmp 0:$2924 0:data:reset=0:$6939 0:$2925 0:000000:A1=A1:D3=D7 0:$2926 0:000000:A1=A1:D8=D7 0:$2927 0:000011:A1=A1:D0=D8 ld cmd,alu // jp sltab-n 0:$2928 d15:000011:A1=A3:D8=D1 ld alu,(a0) :bit15 // a 0:$2929 0:000000:A1=A3:D8=D8 add alu // a<<15 nodelay 0:$292A 0:000000:A1=A3:D8=D8 add alu // a<<14 nodelay 0:$292B 0:000000:A1=A3:D8=D8 add alu // a<<13 nodelay 0:$292C 0:000000:A1=A3:D8=D8 add alu // a<<12 nodelay 0:$292D 0:000000:A1=A3:D8=D8 add alu // a<<11 nodelay 0:$292E 0:000000:A1=A3:D8=D8 add alu // a<<10 nodelay 0:$292F 0:000000:A1=A3:D8=D8 add alu // a<<9 nodelay 0:$2930 0:000000:A1=A3:D8=D8 add alu // a<<8 nodelay 0:$2931 0:000000:A1=A3:D8=D8 add alu // a<<7 nodelay 0:$2932 0:000000:A1=A3:D8=D8 add alu // a<<6 nodelay 0:$2933 0:000000:A1=A3:D8=D8 add alu // a<<5 nodelay 0:$2934 0:000000:A1=A3:D8=D8 add alu // a<<4 nodelay 0:$2935 0:000000:A1=A3:D8=D8 add alu // a<<3 nodelay 0:$2936 0:000000:A1=A3:D8=D8 add alu // a<<2 nodelay 0:$2937 0:000000:A1=A3:D8=D8 add alu // a<<1 nodelay 0:$2938 0:000011:A1=A3:D1=D8 sltab ld (a0),alu // a<<0 0:$2939 0:010011:A5=A5:D8=D1 pop alu 0:$293A 0:000011:A0=A0:D0=D3 next_mc 0:$293B d15:000011:A1=A0:D0=D0 // signed shift right: // :Srs ( i16:a i4:n -- i16 ) 0:$0460 0:000010:A1=A1:D8=D0 and $000F // dtmp 0:$0461 0:data:reset=0:$000F 0:$0462 0:001011:A1=A0:D8=D8 cpl // 0..15 -> -1..-16 0:$0463 0:000000:A1=A0:D7=D0 add srstab+16 // dtmp 0:$0464 0:data:reset=0:$C47C 0:$0465 0:000000:A1=A4:D3=D7 0:$0466 0:000000:A1=A4:D8=D7 0:$0467 0:000011:A1=A4:D4=D8 ld d0,alu 0:$0468 0:010011:A5=A5:D8=D1 pop alu 0:$0469 d15:000011:A1=A5:D8=D8 ld alu,alu :bit15 if 1 1:$046A 1:000011:A1=A7:D0=D4 ld cmd,d0 1:$046B 1:000111:A1=A7:DC=D8 ld sr,alu,cy :1 else 0:$046A 0:000011:A1=A5:D0=D4 ld cmd,d0 0:$046B 0:000011:A1=A5:DC=D8 ld sr,alu,nc :0 then if 1 1:$046C 1:000111:A1=A7:DC=DC srstab: ld sr,sr , cy // a>>15 1:$046D 1:000111:A1=A7:DC=DC ld sr,sr , cy // a>>14 1:$046E 1:000111:A1=A7:DC=DC ld sr,sr , cy // a>>13 1:$046F 1:000111:A1=A7:DC=DC ld sr,sr , cy // a>>12 1:$0470 1:000111:A1=A7:DC=DC ld sr,sr , cy // a>>11 1:$0471 1:000111:A1=A7:DC=DC ld sr,sr , cy // a>>10 1:$0472 1:000111:A1=A7:DC=DC ld sr,sr , cy // a>>9 1:$0473 1:000111:A1=A7:DC=DC ld sr,sr , cy // a>>8 1:$0474 1:000111:A1=A7:DC=DC ld sr,sr , cy // a>>7 1:$0475 1:000111:A1=A7:DC=DC ld sr,sr , cy // a>>6 1:$0476 1:000111:A1=A7:DC=DC ld sr,sr , cy // a>>5 1:$0477 1:000111:A1=A7:DC=DC ld sr,sr , cy // a>>4 1:$0478 1:000111:A1=A7:DC=DC ld sr,sr , cy // a>>3 1:$0479 1:000111:A1=A7:DC=DC ld sr,sr , cy // a>>2 1:$047A 1:000011:A1=A7:D8=DC ld alu,sr // a>>1 1:$047B 1:000011:A0=A0:D0=D3 next_mc // a>>0 1:$047C d15:000011:A1=A0:D0=D0 else 0:$046C 0:000011:A1=A5:DC=DC ld sr,sr , nc // a>>15 0:$046D 0:000011:A1=A5:DC=DC ld sr,sr , nc // a>>14 0:$046E 0:000011:A1=A5:DC=DC ld sr,sr , nc // a>>13 0:$046F 0:000011:A1=A5:DC=DC ld sr,sr , nc // a>>12 0:$0470 0:000011:A1=A5:DC=DC ld sr,sr , nc // a>>11 0:$0471 0:000011:A1=A5:DC=DC ld sr,sr , nc // a>>10 0:$0472 0:000011:A1=A5:DC=DC ld sr,sr , nc // a>>9 0:$0473 0:000011:A1=A5:DC=DC ld sr,sr , nc // a>>8 0:$0474 0:000011:A1=A5:DC=DC ld sr,sr , nc // a>>7 0:$0475 0:000011:A1=A5:DC=DC ld sr,sr , nc // a>>6 0:$0476 0:000011:A1=A5:DC=DC ld sr,sr , nc // a>>5 0:$0477 0:000011:A1=A5:DC=DC ld sr,sr , nc // a>>4 0:$0478 0:000011:A1=A5:DC=DC ld sr,sr , nc // a>>3 0:$0479 0:000011:A1=A5:DC=DC ld sr,sr , nc // a>>2 0:$047A 0:000011:A1=A5:D8=DC ld alu,sr // a>>1 0:$047B 0:000011:A0=A0:D0=D3 next_mc // a>>0 0:$047C d15:000011:A1=A0:D0=D0 then :random__6uint16 ( -- u16 ) 0:$0532 0:000011:A5=A5:D3=D8 inc hp // push alu 0:$0533 rnd:000011:A1=A5:D1=D8 ld (hp),alu : rnd if 1 1:$0534 rnd:000111:A1=A0:DD=DD ld sl,sl,cy : rnd 1:$0535 rnd:000111:A1=A0:DD=DD ld sl,sl,cy : rnd 1:$0536 rnd:000111:A1=A0:DD=DD ld sl,sl,cy : rnd 1:$0537 rnd:000111:A1=A0:DD=DD ld sl,sl,cy : rnd 1:$0538 rnd:000111:A1=A0:DD=DD ld sl,sl,cy : rnd 1:$0539 rnd:000111:A1=A0:DD=DD ld sl,sl,cy : rnd 1:$053A rnd:000111:A1=A0:DD=DD ld sl,sl,cy : rnd 1:$053B rnd:000111:A1=A0:DD=DD ld sl,sl,cy : rnd 1:$053C rnd:000111:A1=A0:DD=DD ld sl,sl,cy : rnd 1:$053D rnd:000111:A1=A0:DD=DD ld sl,sl,cy : rnd 1:$053E rnd:000111:A1=A0:DD=DD ld sl,sl,cy : rnd 1:$053F rnd:000111:A1=A0:DD=DD ld sl,sl,cy : rnd 1:$0540 rnd:000111:A1=A0:DD=DD ld sl,sl,cy : rnd 1:$0541 rnd:000111:A1=A0:DD=DD ld sl,sl,cy : rnd 1:$0542 rnd:000111:A1=A0:DD=DD ld sl,sl,cy : rnd 1:$0543 0:000111:A1=A0:DD=DD ld sl,sl,cy else 0:$0534 rnd:000011:A1=A5:DD=DD ld sl,sl,nc : rnd 0:$0535 rnd:000011:A1=A5:DD=DD ld sl,sl,nc : rnd 0:$0536 rnd:000011:A1=A5:DD=DD ld sl,sl,nc : rnd 0:$0537 rnd:000011:A1=A5:DD=DD ld sl,sl,nc : rnd 0:$0538 rnd:000011:A1=A5:DD=DD ld sl,sl,nc : rnd 0:$0539 rnd:000011:A1=A5:DD=DD ld sl,sl,nc : rnd 0:$053A rnd:000011:A1=A5:DD=DD ld sl,sl,nc : rnd 0:$053B rnd:000011:A1=A5:DD=DD ld sl,sl,nc : rnd 0:$053C rnd:000011:A1=A5:DD=DD ld sl,sl,nc : rnd 0:$053D rnd:000011:A1=A5:DD=DD ld sl,sl,nc : rnd 0:$053E rnd:000011:A1=A5:DD=DD ld sl,sl,nc : rnd 0:$053F rnd:000011:A1=A5:DD=DD ld sl,sl,nc : rnd 0:$0540 rnd:000011:A1=A5:DD=DD ld sl,sl,nc : rnd 0:$0541 rnd:000011:A1=A5:DD=DD ld sl,sl,nc : rnd 0:$0542 rnd:000011:A1=A5:DD=DD ld sl,sl,nc : rnd 0:$0543 0:000011:A1=A5:DD=DD ld sl,sl,nc then 0:$0544 0:000011:A1=A5:D8=DD ld alu,sl 0:$0545 0:000011:A0=A0:D0=D3 next_mc 0:$0546 d15:000011:A1=A0:D0=D0 :random__6uint16_6uint16 ( u16 -- u16 ) TODO // sl muss vorher genullt werden 0:$0327 0:000011:A6=A1:D3=D0 ld atmp,$ // * TODO 0:$0328 0:data:reset=0:$4327 0:$0329 0:000011:A1=A3:D0=D0 jp TODO // * TODO 0:$032A d15:data:reset=0:$697C 0:$032B 0:000011:A1=A1:D4=D8 ld d0,alu // d0 = max-wert 0:$032C 0:001011:A1=A1:D8=D8 cpl 0:$032D 0:000011:A1=A1:DE=D8 ld msbit,alu // req. bits-1 0:$032E 0:000011:A1=A1:D8=D0 ld alu,r1 0:$032F 0:data:reset=0:$4344 0:$0330 0:001100:A1=A3:D3=DE sub msbit 0:$0331 0:001100:A1=A3:D8=DE 0:$0332 0:000011:A1=A3:D5=D8 ld d1,alu // d1 = ladder entry address 0:$0333 0:000011:A1=A3:D0=D5 ld cmd,d1 // jp to d1, code plane = rnd 0:$0334 rnd:000011:A1=A3:D3=D5 nop : rnd if 1 1:$0335 rnd:000111:A1=A7:DD=DD ld sl,sl,cy : rnd 1:$0336 rnd:000111:A1=A7:DD=DD ld sl,sl,cy : rnd 1:$0337 rnd:000111:A1=A7:DD=DD ld sl,sl,cy : rnd 1:$0338 rnd:000111:A1=A7:DD=DD ld sl,sl,cy : rnd 1:$0339 rnd:000111:A1=A7:DD=DD ld sl,sl,cy : rnd 1:$033A rnd:000111:A1=A7:DD=DD ld sl,sl,cy : rnd 1:$033B rnd:000111:A1=A7:DD=DD ld sl,sl,cy : rnd 1:$033C rnd:000111:A1=A7:DD=DD ld sl,sl,cy : rnd 1:$033D rnd:000111:A1=A7:DD=DD ld sl,sl,cy : rnd 1:$033E rnd:000111:A1=A7:DD=DD ld sl,sl,cy : rnd 1:$033F rnd:000111:A1=A7:DD=DD ld sl,sl,cy : rnd 1:$0340 rnd:000111:A1=A7:DD=DD ld sl,sl,cy : rnd 1:$0341 rnd:000111:A1=A7:DD=DD ld sl,sl,cy : rnd 1:$0342 rnd:000111:A1=A7:DD=DD ld sl,sl,cy : rnd 1:$0343 rnd:000111:A1=A7:DD=DD ld sl,sl,cy : rnd 1:$0344 0:000111:A1=A7:DD=DD ld sl,sl,cy else 0:$0335 rnd:000011:A1=A3:DD=DD ld sl,sl,nc : rnd 0:$0336 rnd:000011:A1=A3:DD=DD ld sl,sl,nc : rnd 0:$0337 rnd:000011:A1=A3:DD=DD ld sl,sl,nc : rnd 0:$0338 rnd:000011:A1=A3:DD=DD ld sl,sl,nc : rnd 0:$0339 rnd:000011:A1=A3:DD=DD ld sl,sl,nc : rnd 0:$033A rnd:000011:A1=A3:DD=DD ld sl,sl,nc : rnd 0:$033B rnd:000011:A1=A3:DD=DD ld sl,sl,nc : rnd 0:$033C rnd:000011:A1=A3:DD=DD ld sl,sl,nc : rnd 0:$033D rnd:000011:A1=A3:DD=DD ld sl,sl,nc : rnd 0:$033E rnd:000011:A1=A3:DD=DD ld sl,sl,nc : rnd 0:$033F rnd:000011:A1=A3:DD=DD ld sl,sl,nc : rnd 0:$0340 rnd:000011:A1=A3:DD=DD ld sl,sl,nc : rnd 0:$0341 rnd:000011:A1=A3:DD=DD ld sl,sl,nc : rnd 0:$0342 rnd:000011:A1=A3:DD=DD ld sl,sl,nc : rnd 0:$0343 rnd:000011:A1=A3:DD=DD ld sl,sl,nc : rnd 0:$0344 0:000011:A1=A3:DD=DD r1: ld sl,sl,nc then 0:$0345 0:000011:A1=A3:D8=DD ld alu,sl 0:$0346 0:001100:A1=A3:D3=D4 cmp d0 0:$0347 0:001100:A1=A3:D3=D4 0:$0348 cy:data:reset=0:$0000 if cy 1:$0349 1:000011:A1=A7:D0=D5 ld cmd,d1 1:$034A rnd:000011:A1=A7:D3=D5 nop : rnd else 0:$0349 0:000011:A0=A0:D0=D3 next_mc 0:$034A d15:000011:A1=A0:D0=D0 then :IncrL ( i32* -- ) 0:$0698 0:000011:A6=A1:D3=D8 ld atmp,alu // atmp -> i32.hi 0:$0699 0:000011:A6=A6:D3=D8 inc atmp // atmp -> i32.lo 0:$069A 0:000001:A1=A6:D8=D8 xor alu 0:$069B 0:000100:A1=A6:D3=D1 add_c (atmp) 0:$069C 0:000100:A1=A6:D8=D1 0:$069D cy:010011:A6=A6:D1=D8 ld (atmp--),alu : cy if 1 1:$069E 1:000001:A1=A7:D8=D8 xor alu 1:$069F 1:000100:A1=A6:D3=D1 add_c (atmp) 1:$06A0 1:000100:A1=A6:D8=D1 1:$06A1 1:000011:A1=A6:D1=D8 ld (atmp),alu 0:$069E 0:000011:A1=A6:D0=D0 then 0:$069F d15:data:reset=0:$C6A2 1:$06A2 1:010011:A5=A5:D8=D1 pop alu 1:$06A3 1:000011:A0=A0:D0=D3 next_mc 1:$06A4 d15:000011:A1=A0:D0=D0 :BoolL ( i32 -- i16 ) 0:$0814 0:010011:A5=A5:D7=D1 pop dtmp 0:$0815 0:000110:A1=A5:D8=D7 or dtmp 0:$0816 z:000001:A1=A5:D8=D8 xor alu :z if 0 0:$0817 0:000100:A1=A5:D8=D8 add_c alu // nz => 1 nodelay 1:$0817 0:data:reset=0:$0000 then // z => 0 0:$0818 0:000011:A0=A0:D0=D3 next_mc 0:$0819 d15:000011:A1=A0:D0=D0 :SwapBytes ( i16 -- i16 ) 0:$1AE5 0:000011:A1=A0:DA=D8 ld swap,alu 0:$1AE6 0:000011:A1=A0:D8=DA ld alu,swap 0:$1AE7 0:000011:A0=A0:D0=D3 next_mc 0:$1AE8 d15:000011:A1=A0:D0=D0 :Bit15 ( i16 -- i1 ) 0:$081A 0:000011:A1=A0:D3=D8 tst alu 0:$081B d15:000011:A1=A0:D8=D0 ld alu,ival :bit15 if 1 1:$081C 0:data:reset=0:$0001 dw 1 else 0:$081C 0:data:reset=0:$0000 dw 0 then 0:$081D 0:000011:A0=A0:D0=D3 next_mc 0:$081E d15:000011:A1=A0:D0=D0 // ======================================================= // Characters // ======================================================= // Is Letter? // (z.Zt. ASCII only) // is_letter(c) = uchar((c|0x20)-'a')<='z'-'a'; // 2010-05-15 // :IsLetter ( u16:char -- i1 ) 0:$0657 0:000110:A1=A0:D8=D0 or $20 0:$0658 0:data:reset=0:$0020 0:$0659 0:001100:A1=A0:D7=D0 sub 'a' // dtmp 0:$065A 0:data:reset=0:$0061 0:$065B 0:001100:A1=A0:D3=D7 0:$065C 0:001100:A1=A0:D8=D7 0:$065D 0:001000:A1=A0:D7=D0 cmp_nc 'z'-'a' // dtmp 0:$065E 0:data:reset=0:$0019 0:$065F 0:001000:A1=A0:D3=D7 0:$0660 0:001000:A1=A0:D3=D7 0:$0661 cy:000001:A1=A0:D8=D8 xor alu :cy if 0 0:$0662 0:000100:A1=A0:D8=D8 add_c alu // => 1 nodelay 1:$0662 0:data:reset=0:$0000 then 0:$0663 0:000011:A0=A0:D0=D3 next_mc 0:$0664 d15:000011:A1=A0:D0=D0 // Is binary digit? // is_bin_digit(c) = (c|1)=='1'; // 2010-05-15 // :IsBinDigit ( u16:char -- i1 ) 0:$0788 0:000110:A1=A6:D8=D0 or 1 0:$0789 0:data:reset=0:$0001 0:$078A 0:000011:A1=A0:D7=D0 ld dtmp,'1' // wg. delay 0:$078B 0:data:reset=0:$0031 0:$078C 0:000001:A1=A0:D3=D7 equ dtmp 0:$078D z:000001:A1=A0:D8=D8 xor alu :z if 1 1:$078E 0:000100:A1=A7:D8=D8 add_c alu // => 1 nodelay 0:$078E 0:data:reset=0:$0000 then 0:$078F 0:000011:A0=A0:D0=D3 next_mc 0:$0790 d15:000011:A1=A0:D0=D0 // is decimal digit? // is_dec_digit(c) = uchar(c-'0')<='9'-'0'; // 2010-05-15 // :IsDecDigit ( u16:char -- i1 ) 0:$0706 0:001100:A1=A0:D7=D0 sub '0' // dtmp 0:$0707 0:data:reset=0:$0030 0:$0708 0:001100:A1=A0:D3=D7 0:$0709 0:001100:A1=A0:D8=D7 0:$070A 0:001000:A1=A0:D7=D0 cmp_nc '9'-'0' // dtmp 0:$070B 0:data:reset=0:$0009 0:$070C 0:001000:A1=A0:D3=D7 0:$070D 0:001000:A1=A0:D3=D7 0:$070E cy:000001:A1=A0:D8=D8 xor alu :cy if 0 0:$070F 0:000100:A1=A0:D8=D8 add_c alu // => 1 nodelay 1:$070F 0:data:reset=0:$0000 then 0:$0710 0:000011:A0=A0:D0=D3 next_mc 0:$0711 d15:000011:A1=A0:D0=D0 // is hexadecimal digit? // is_hex_digit(c) = uchar(c-'0')<='9'-'0' || uchar((c|0x20)-'a') <= 'f'-'a'; // 2010-05-15 // :IsHexDigit ( u16:char -- i1 ) 0:$051C 0:000011:A1=A0:D6=D8 ld d2,alu // d2=char 0:$051D 0:001100:A1=A0:D7=D0 sub '0' // dtmp 0:$051E 0:data:reset=0:$0030 0:$051F 0:001100:A1=A0:D3=D7 0:$0520 0:001100:A1=A0:D8=D7 0:$0521 0:001000:A1=A0:D7=D0 cmp_nc '9'-'0' // dtmp 0:$0522 0:data:reset=0:$0009 0:$0523 0:001000:A1=A0:D3=D7 0:$0524 0:001000:A1=A0:D3=D7 0:$0525 cy:000011:A1=A0:D8=D6 ld alu,d2 :cy // alu=char if 1 // cy => !cy => char>'9' => no dec. digit 1:$0526 1:000110:A1=A7:D8=D0 or $20 1:$0527 1:data:reset=0:$0020 1:$0528 1:001100:A1=A0:D7=D0 sub 'a' // dtmp 1:$0529 1:data:reset=0:$0061 1:$052A 1:001100:A1=A0:D3=D7 1:$052B 1:001100:A1=A0:D8=D7 1:$052C 1:001000:A1=A0:D7=D0 cmp_nc 'f'-'a' // dtmp 1:$052D 1:data:reset=0:$0005 1:$052E 1:001000:A1=A0:D3=D7 1:$052F 1:001000:A1=A0:D3=D7 1:$0530 cy:000001:A1=A0:D8=D8 xor alu :cy if 0 0:$0531 1:000100:A1=A7:D8=D8 add_c alu // => 1 nodelay 1:$0531 1:data:reset=0:$0000 then 1:$0532 1:000011:A0=A0:D0=D3 next_mc 1:$0533 d15:000011:A1=A0:D0=D0 else // !cy => cy => char?'9' => dec. digit 0:$0526 0:000001:A1=A0:D8=D8 xor alu 0:$0527 0:000100:A1=A0:D8=D8 add_c alu // => 1 nodelay 0:$0528 0:000011:A0=A0:D0=D3 next_mc 0:$0529 d15:000011:A1=A0:D0=D0 then // value of decimal digit: // char --> digit value: ['0'..'9'] ---> [0..9]; non-digits ---> [10..255] // digit_val(char c) { return uchar(c-'0'); } // 2010-05-15 // DecDigitValue := Subq+'0' ( u16:char -- u16 ) // value of base36 digit: // char --> digit value: ['0'..'9']['A'..'Z']['a'..'z'] ---> [0...35]; non-digits ---> [36++] // digit_value(c) = c<='9' ? uchar(c-'0') : int(uchar((c&~0x20)-'A'))+10; // 2010-05-15 // :DigitValue ( u16:char -- u16 ) 0:$0614 0:001100:A1=A0:D7=D0 cmp '9'+1 // dtmp 0:$0615 0:data:reset=0:$003A 0:$0616 0:001100:A1=A0:D3=D7 0:$0617 0:001100:A1=A0:D3=D7 0:$0618 cy:000011:A1=A0:D0=D0 jp !cy,Subq+'0' // !cy => cy => char<'9'+1 => char?'9' => rval > $FFC0 0:$0619 d15:data:reset=0:$0C30 1:$0619 d15:data:reset=0:$C61A 1:$061A 1:000110:A1=A6:D8=D0 or $20 // to_lower 1:$061B 1:data:reset=0:$0020 1:$061C 1:001100:A1=A0:D7=D0 sub 'a' // dtmp 1:$061D 1:data:reset=0:$0061 1:$061E 1:001100:A1=A0:D3=D7 1:$061F 1:001100:A1=A0:D8=D7 1:$0620 cy:data:reset=0:$0000 if !cy 0:$0621 0:000011:A0=A0:D0=D3 next_mc 0:$0622 d15:000011:A1=A0:D0=D0 else 1:$0621 1:000011:A1=A0:D0=D0 jp Addq+10 1:$0622 d15:data:reset=0:$0B0A then // --- file: "millicode_int.asm" --- #include "asm/millicode_float.asm" // +++ file: "millicode_float.asm" +++ /* Copyright (c) Günter Woigk 2009 - 2015 mailto:kio@little-bat.de This file is free software This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: ? Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. ? Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ // Microcode for the K1-16/16 CPU // // 2012-04-08 // ======================================================= // millicode - Floating Point Arithmetics // ======================================================= // ======================================================= // Constant Values: // ======================================================= // Macro: instr float(MANTH,MANTL,EXP) psh alu,EXP,MANTH // * float ld alu,MANTL // * float next_mc // * float end :pi_4__7float48 ( -- float ) float $C90F,$DAA2, $3FFF // pi/4 0:$1EEC 0:000011:A5=A5:D3=D8 psh alu,$3FFF ,$C90F // * float 0:$1EED 0:000011:A5=A5:D1=D8 0:$1EEE 0:000011:A5=A5:D1=D0 0:$1EEF 0:data:reset=0:$3FFF 0:$1EF0 0:000011:A1=A5:D1=D0 0:$1EF1 0:data:reset=0:$C90F 0:$1EF2 0:000011:A1=A1:D8=D0 ld alu,$DAA2 // * float 0:$1EF3 0:data:reset=0:$DAA2 0:$1EF4 0:000011:A0=A0:D0=D3 next_mc // * float 0:$1EF5 d15:000011:A1=A0:D0=D0 :inf_p__7float48 float $ffff, $ffff, $7ffff // +inf exp = $7fff, mant = $ffffffff 0:$1ED8 0:000011:A5=A5:D3=D8 psh alu,$7ffff ,$ffff // * float 0:$1ED9 0:000011:A5=A5:D1=D8 0:$1EDA 0:000011:A5=A5:D1=D0 0:$1EDB 0:data:reset=0:$FFFF 0:$1EDC 0:000011:A1=A5:D1=D0 0:$1EDD 0:data:reset=0:$FFFF 0:$1EDE 0:000011:A1=A7:D8=D0 ld alu,$ffff // * float 0:$1EDF 0:data:reset=0:$FFFF 0:$1EE0 0:000011:A0=A0:D0=D3 next_mc // * float 0:$1EE1 d15:000011:A1=A0:D0=D0 :inf_m__7float48 0:$1D11 0:000011:A5=A5:D3=D8 inc hp // -inf exp = $Ffff, mant = $ffffffff 0:$1D12 0:000011:A5=A5:D1=D8 ld (hp++),alu 0:$1D13 0:001001:A1=A5:D8=D8 xorn alu 0:$1D14 0:000011:A5=A5:D1=D8 ld (hp++),alu 0:$1D15 0:000011:A1=A5:D1=D8 ld (hp),alu 0:$1D16 0:000011:A0=A0:D0=D3 next_mc 0:$1D17 d15:000011:A1=A0:D0=D0 :NaN__7float48 0:$1DD8 0:000011:A5=A5:D3=D8 inc hp // NaN exp = 0, mant = $0000FFFF 0:$1DD9 0:000011:A5=A5:D1=D8 ld (hp++),alu 0:$1DDA 0:000001:A1=A5:D8=D8 xor alu 0:$1DDB 0:000011:A5=A5:D1=D8 ld (hp++),alu 0:$1DDC 0:000011:A1=A5:D1=D8 ld (hp),alu 0:$1DDD 0:001001:A1=A5:D8=D8 xorn alu 0:$1DDE 0:000011:A0=A0:D0=D3 next_mc 0:$1DDF d15:000011:A1=A0:D0=D0 :zero__7float48 0:$1CCF 0:000011:A5=A5:D3=DD inc hp // 0.0 exp = 0, mant = 0 0:$1CD0 0:000011:A5=A5:D1=D8 ld (hp++),alu 0:$1CD1 0:000001:A1=A5:D8=D8 xor alu 0:$1CD2 0:000011:A5=A5:D1=D8 ld (hp++),alu 0:$1CD3 0:000011:A1=A5:D1=D8 ld (hp),alu 0:$1CD4 0:000011:A0=A0:D0=D3 next_mc 0:$1CD5 d15:000011:A1=A0:D0=D0 /* :log2_e ( -- float ) float $B8AA,$3B29, $4000 // 1.44269504088896340735992468100189214 log2(e) :log10_e( -- float ) float $DE5B,$D8A9,$3FFE // 0.434294481903251827651128918916605082 log10(e) :ln_2 ( -- float ) float $B172,$17F8, $3FFF // 0.693147180559945309417232121458176568 loge(2) :ln_10 ( -- float ) float $935D,$8DDE, $4001 // 2.30258509299404568401799145468436421 loge(10) :pi ( -- float ) float $C90F,$DAA2, $4001 // pi = 3.14159265358979323846264338327950288 :ec ( -- float ) float $ADF8,$5459, $4001 // ec = 2.71828182845904523536028747135266250 :one__7float48 float $8000,$0000,$4000 // 1.0 :two__7float48 float $8000,$0000,$4001 // 2.0 :e_m05 float $9B45,$97E3, $3FFF // e^-0.5 e_m1: float $BC5A,$B1B1, $3FFE // e^-1 e_m2: float $8A95,$551E, $3FFD // e^-2 e_m4: float $960A,$ADC1, $3FFA // e^-4 e_m8: float $AFE1,$0821, $3FF4 e_m16: float $F1AA,$DDD7, $3FE8 e_m32: float $E423,$27BB, $3FD1 e_m64: float $CB4E,$A399, $3FA3 e_m128: float $A175,$CF9D, $3F47 e_m256: float $CBAA,$CAB5, $3E8E e_m512: float $A208,$4F6E, $3D1D :e_05 float $D309,$4C71, $4000 // e^0.5 ec: float $ADF8,$5459, $4001 // e^1 = ec = 2.71828182845904523536028747135266250 e_2: float $EC73,$25C7, $4002 // e^2 e_4: float $DA64,$8171, $4005 // e^4 e_8: float $BA4F,$53EA, $400B e_16: float $8797,$5E85, $4017 e_32: float $8FA1,$FE62, $402E e_64: float $A12C,$C168, $405C e_128: float $CAF2,$A62F, $40B8 e_256: float $A0E3,$D441, $4171 e_512: float $CA3B,$2826, $42E2 :pi_m1 float $A2F9,$836E, $3FFE // 1/pi = 0.318309886183790671537767526745028724 :pi_2m1 float $A2F9,$836E, $3FFF // 2/pi = 0.636619772367581343075535053490057448 :pi_2 float $C90F,$DAA2, $4000 // pi/2 = 1.57079632679489661923132169163975144 :pi_x2 float $C90F,$DAA2, $4002 // 2*pi = 2*3.14159265358979323846264338327950288 :z_pi_m05 float $906E,$BA82, $4000 // 1.12837916709551257389615890312154517 2/sqrt(pi) :zwei_05 float $B504,$F334, $4000 // 1.41421356237309504880168872420969808 sqrt(2) :zwei_m05 float $B504,$F334, $3FFF // 0.707106781186547524400844362104849039 1/sqrt(2) */ // --- file: "millicode_float.asm" --- #include "asm/millicode_str.asm" // +++ file: "millicode_str.asm" +++ /* Copyright (c) Günter Woigk 2009 - 2015 mailto:kio@little-bat.de This file is free software This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: ? Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. ? Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ // Microcode for the K1-16/16 CPU // // 2012-04-08 // ================================================================ // millicode - Strings and Arrays // ================================================================ // Immediate String Literal: // mc Istr+data.len // dm data // ld cmd,atmp // :Istr = $F00:0 ( -- str ) 0:$0F00 0:000011:A5=A5:D3=DF psh alu 0:$0F01 0:000011:A1=A5:D1=D8 0:$0F02 0:000011:A1=A5:D4=DF ld d0,cmd_lo // d0=len 0:$0F03 0:010011:A2=A2:D3=DF jsr alloc // d0=len, a1=ptr->data.len, alu=a0=handle 0:$0F04 0:000011:A1=A2:D1=D0 0:$0F05 0:data:reset=0:$4F08 0:$0F06 0:000011:A1=A7:D0=D0 0:$0F07 d15:data:reset=0:$4207 0:$0F08 0:000011:A6=A1:D3=D0 ld atmp,p1 0:$0F09 0:data:reset=0:$4F0F 0:$0F0A 0:000011:A3=A1:D3=D4 ld a0,d0 // a0=d0=len 0:$0F0B 0:000011:A1=A6:D0=D3 jp atmp // post ((first 'ld(a1++),d0' overwrites str.len with len)) 0:$0F0C d15:data:reset=0:$0000 do // copy text to string 0:$0F0D 0:000011:A0=A0:D0=D3 ld cmd,ip++ 0:$0F0E d15:000011:A1=A0:D4=D0 ld d0,ival :bit15 // d0=char // ((load d0=char and run through following chars up to 'ld cmd,atmp' => jump to p1)) 0:$0F0F 0:010011:A3=A3:D3=D3 p1 tst a0-- 0:$0F10 z:000011:A4=A4:D1=D4 ld (a1++),d0 :z 0:$0F11 0:000011:A1=A4:D0=D0 until 1 0:$0F12 d15:data:reset=0:$4F0D 1:$0F11 1:000011:A0=A0:D3=DF inc ip // skip over final 'ld cmd,atmp' 1:$0F12 1:000011:A0=A0:D0=D3 next_mc 1:$0F13 d15:000011:A1=A0:D0=D0 // count(int16[]) // :Count ( str¢ -- u16:size ) 0:$082D 0:000011:A1=A7:DF=D8 ld d2ar,alu // d2ar=alu=handle 0:$082E z:000011:A1=A7:DF=D1 ld d2ar,(d2ar) :z // d2ar=ptr if 0 0:$082F 0:000011:A1=A7:D8=D1 ld alu,(d2ar) // alu=len 0:$0830 0:000011:A0=A0:D0=D3 next_mc 0:$0831 d15:000011:A1=A0:D0=D0 else 1:$082F 1:000011:A0=A0:D0=D3 next_mc 1:$0830 d15:000011:A1=A0:D0=D0 then cast_range_2_str := cast_range_2_str__8ucs2charAEC_6uint16_6uint16_8ucs2charAE ( char[?] -- str ) CatStr := catstr__8ucs2charAE_8ucs2charAE_8ucs2charAE ( str str -- str ) :CharStr ( char -- str ) 0:$2107 0:000011:A1=A0:D4=D0 ld d0,1 // size 0:$2108 0:data:reset=0:$0001 0:$2109 0:000011:A1=A0:D5=D8 ld d1,alu // save char 0:$210A 0:010011:A2=A2:D3=D8 jsr alloc // alloc 0:$210B 0:000011:A1=A2:D1=D0 0:$210C 0:data:reset=0:$610F 0:$210D 0:000011:A1=A1:D0=D0 0:$210E d15:data:reset=0:$4207 0:$210F 0:000011:A4=A4:D3=D7 ld (++a1),d1 // store char 0:$2110 0:000011:A1=A4:D1=D5 0:$2111 0:000011:A0=A0:D0=D3 next_mc // rval = alu = a0 = handle 0:$2112 d15:000011:A1=A0:D0=D0 : SubStrc_r ( ucs2str¢, int16:a int16:e -- char[?] ) Millicoded 0:$3D04 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$3D05 0:data:reset=0:$7D08 0:$3D06 0:000011:A1=A5:D0=D0 jp millicoded // * Millicoded 0:$3D07 d15:data:reset=0:$5F70 // a = max(a,+0); 0:$3D08 d15:data:reset=0:$18FF mc Lget+255 0:$3D09 d15:data:reset=0:$0D00 mc Int8+0 0:$3D0A d15:data:reset=0:$464B mc Max 0:$3D0B d15:data:reset=0:$8EFF mc Lset+255 // e = min(e,(int)s.count()); 0:$3D0C d15:data:reset=0:$45F6 mc Dup 0:$3D0D d15:data:reset=0:$18FD mc Lget+253 0:$3D0E d15:data:reset=0:$482D mc Count 0:$3D0F d15:data:reset=0:$4623 mc Min 0:$3D10 d15:data:reset=0:$5F29 mc Nip // if(e null <=> empty str 1:$059B 1:data:reset=0:$001B 1:$059C 1:000011:A1=A4:D1=D8 ld (a1),alu // *var := handle 1:$059D 1:000011:A0=A0:D0=D3 next_mc 1:$059E d15:000011:A1=A0:D0=D0 then // test if array or struct is shared // null => false // :IsShared ( T[] -- bool ) 0:$0712 0:000011:A1=A0:D3=D8 tst alu 0:$0713 z:data:reset=0:$0000 if !z 0:$0714 0:000011:A6=A1:D3=D8 ld atmp,alu 0:$0715 0:000011:A6=A6:D3=D8 inc atmp 0:$0716 0:000011:A1=A6:D3=D1 tst (atmp) 0:$0717 0:001100:A1=A6:D3=D1 cmp (atmp) 0:$0718 0:001100:A1=A6:D3=D1 0:$0719 z:data:reset=0:$0000 if z 1:$071A 1:000011:A1=A7:D8=D0 ld alu,0 1:$071B 0:data:reset=0:$0000 else 0:$071A 0:000011:A1=A0:D8=D0 ld alu,1 0:$071B 0:data:reset=0:$0001 then 1:$0714 1:000011:A1=A7:D0=D0 then 1:$0715 d15:data:reset=0:$471C 0:$071C 0:000011:A0=A0:D0=D3 next_mc 0:$071D d15:000011:A1=A0:D0=D0 #if 0 // -> misc.asm // size == count(int16[]) // :Count ( str¢ -- u16:size ) Count: ld d2ar,alu // d2ar=alu=handle ld d2ar,(d2ar) :z // d2ar=ptr if 0 ld alu,(d2ar) // alu=len next_mc // post else next_mc then #endif // count(int32[]) // :Count2 ( int32[]¢ -- u16:count ) 0:$07EB 0:000011:A1=A0:DF=D8 ld d2ar,alu // d2ar=alu=handle 0:$07EC z:000011:A1=A7:DF=D1 ld d2ar,(d2ar) :z // d2ar=ptr if 0 0:$07ED 0:000011:A1=A7:DC=D1 ld sr,(d2ar),nc 0:$07EE 0:000011:A1=A7:D8=DC ld alu,sr // alu=cnt 0:$07EF 0:000011:A0=A0:D0=D3 next_mc // post 0:$07F0 d15:000011:A1=A0:D0=D0 else 1:$07ED 1:000011:A0=A0:D0=D3 next_mc 1:$07EE d15:000011:A1=A0:D0=D0 then // count(float48[]) // :Count3 ( float48[]¢ -- u16:count ) 0:$00E5 0:000011:A1=A0:DF=D8 ld d2ar,alu // d2ar=alu=handle 0:$00E6 z:000011:A1=A7:DF=D1 ld d2ar,(d2ar) :z // d2ar=ptr if 1 1:$00E7 1:000011:A0=A0:D0=D3 next_mc 1:$00E8 d15:000011:A1=A0:D0=D0 0:$00E7 0:data:reset=0:$0000 then 0:$00E8 0:data:reset=0:$0000 0:$00E9 0:000011:A1=A7:D8=D1 ld alu,(d2ar) // alu=size Div3U: // alu = alu/3 0:$00EA 0:001100:A1=A7:D7=D0 cmp $100 // dtmp 0:$00EB 0:data:reset=0:$0100 0:$00EC 0:001100:A1=A1:D3=D7 0:$00ED 0:001100:A1=A1:D3=D7 0:$00EE cy:data:reset=0:$0000 if !cy // !cy => cy => alu<$100 0:$00EF 0:000011:A1=A0:DC=D0 ld sr,$0180,nc // $c0 = 3<<6 0:$00F0 0:data:reset=0:$0180 else 1:$00EF 1:000111:A1=A7:DC=D0 ld sr,$8000,cy // $c000 = 3<<14 1:$00F0 0:data:reset=0:$8000 then 0:$00F1 0:000011:A1=A1:DD=D0 ld sl,0,nc // result 0:$00F2 0:data:reset=0:$0000 do 0:$00F3 0:001100:A1=A0:D3=DC cmp sr // alu - 3< !cy => alu>=sr 1:$00F6 1:001100:A1=A7:D3=DC sub sr 1:$00F7 1:001100:A1=A7:D8=DC 1:$00F8 0:000111:A1=A7:DD=DD ld sl,sl,cy else 0:$00F6 0:000011:A1=A0:DD=DD ld sl,sl,nc 0:$00F7 0:data:reset=0:$0000 then 0:$00F8 0:data:reset=0:$0000 0:$00F9 0:000011:A1=A0:DC=DC ld sr,sr,nc 0:$00FA d0:data:reset=0:$0000 while !bit0 0:$00FB 0:000011:A1=A0:D0=D0 0:$00FC d15:data:reset=0:$40F3 1:$00FB 1:000011:A1=A7:D8=DD ld alu,sl 1:$00FC 1:000011:A0=A0:D0=D3 next_mc 1:$00FD d15:000011:A1=A0:D0=D0 /* :CatStr ( str str -- str ) login TODO // memcnt ld a1,alu // a1=handle2 ld dtmp,(hp) :z jp 1,Drop // string2=NULL => return string 1 ld a0,dtmp // a0=handle1 ld d2,a1 :z // d2=handle2 jp 1,Nip // string1=NULL => return string 2 // ld atmp,a0+1 // atmp->memcnt1 TODO jsr mem_append_handle // delete handle2 ld alu,d2 // alu = TOP = handle2 jp DropStr */ // ======================================================= // Create Strings: // ======================================================= #if 0 // -> misc.asm // Immediate String Literal: // mc Istr+data.len // dm data // ld cmd,atmp // :Istr = $F00:0 ( -- str ) psh alu ld d0,cmd_lo // d0=len jsr alloc // d0=len, a1=ptr->data.len, alu=a0=handle ld atmp,p1 ld a0,d0 // a0=d0=len jp atmp // post ((first 'ld(a1++),d0' overwrites str.len with len)) do // copy text to string ld cmd,ip++ ld d0,ival :bit15 // d0=char // ((load d0=char and run through following chars up to 'ld cmd,atmp' => jump to p1)) p1 tst a0-- ld (a1++),d0 :z until 1 inc ip // skip over final 'ld cmd,atmp' next_mc #endif // helper für AppendStr: // :AllocTrackedVref ( T[]& T[] uint:n -- T[]& T[] ) 0:$2325 0:000011:A1=A7:D4=D8 ld d0,alu // size 0:$2326 0:010011:A5=A5:D3=D8 dec hp 0:$2327 0:000011:A5=A5:D5=D1 ld d1,(hp++) // d1 = tracked address -> var 0:$2328 0:010011:A2=A2:D3=D8 jsr alloc_wtv // allocate handle and data: 0:$2329 0:000011:A1=A2:D1=D0 0:$232A 0:data:reset=0:$632D 0:$232B 0:000011:A1=A3:D0=D0 0:$232C d15:data:reset=0:$4103 // in: d0 = size // d1 = tracked address // out: alu = a0 = handle // d1 = updated address // a1 = memptr // mod: alu,sr,a0,a1 // pres:d0,d2 0:$232D 0:010011:A5=A5:D3=D3 dec hp 0:$232E 0:000011:A5=A5:D1=D5 ld (hp++),d1 // updated vref back on stack 0:$232F 0:000011:A6=A1:D3=D5 ld atmp,d1 // atmp -> var 0:$2330 0:000011:A1=A6:D7=D1 ld dtmp,(atmp) // dtmp = oldstr 0:$2331 0:000011:A1=A6:D1=D8 ld (atmp),alu // var := newstr 0:$2332 0:000011:A1=A6:D8=D7 ld alu,dtmp // alu = oldstr 0:$2333 0:000011:A1=A6:D0=D0 jp DropStr // dispose oldstr 0:$2334 d15:data:reset=0:$4581 :AppendCstr ( T[]¢ T[]& -- ) // speichere CatStr(zweiter,erster) in die vref zurück 0:$06DE 0:000011:A1=A5:DF=D1 ld d2ar,(hp) // d2ar -> memptr 0:$06DF z:000011:A6=A7:D3=D8 ld atmp,d2ar+1 : z // atmp -> refcnt 1:$06E0 1:000011:A1=A7:D0=D0 jp 1,AppendGl__8ucs2charAE_8ucs2charAEP_ // T[]¢ is null 1:$06E1 d15:data:reset=0:$6B1F 0:$06E0 0:000011:A1=A6:DF=D1 ld d2ar,(atmp) // d2ar = refcnt 0:$06E1 0:000011:A3=A7:D3=D8 ld a0,d2ar+1 // a0 = refcnt+1 0:$06E2 0:000011:A1=A3:D7=D3 ld (atmp),a0 // *dtmp* // refcnt = refcnt+1 0:$06E3 0:000011:A1=A6:D1=D7 0:$06E4 0:000011:A1=A6:D0=D0 jp AppendGl__8ucs2charAE_8ucs2charAEP_ 0:$06E5 d15:data:reset=0:$6B1F //:AppendStr ( T[] T[]& -- ) // speichere CatStr(zweiter,erster) in die vref zurück // TODO --> str.cc TODO 0:$06E6 0:000011:A6=A1:D3=D0 ld atmp,$ // * TODO 0:$06E7 0:data:reset=0:$46E6 0:$06E8 0:000011:A1=A6:D0=D0 jp TODO // * TODO 0:$06E9 d15:data:reset=0:$697C :AppendRange ( T[?] T[]& -- ) // speichere CatStr(zweiter,erster) in die vref zurück TODO 0:$1D98 0:000011:A6=A1:D3=D0 ld atmp,$ // * TODO 0:$1D99 0:data:reset=0:$5D98 0:$1D9A 0:000011:A1=A5:D0=D0 jp TODO // * TODO 0:$1D9B d15:data:reset=0:$697C //:AppendRange ( T[?] T[]¢ -- ) // hänge ersten an den zweiten an // TODO //:AppendCstr ( T[]¢ T[]¢ -- ) // hänge ersten an den zweiten an // TODO //:AppendStr ( T[] T[]¢ -- ) // hänge ersten an den zweiten an // TODO str1 = 1 zstr = 0 Millicoded 0:$1D9C 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$1D9D 0:data:reset=0:$5DA0 0:$1D9E 0:000011:A1=A5:D0=D0 jp millicoded // * Millicoded 0:$1D9F d15:data:reset=0:$5F70 // mc args=0,Lget str1,Count,Ifnot3,Drop,DropStr,Ret, args==-2 // mc args=0,Lget zstr,Peek,Lget str1,CatStr,args==1 // TODO: mem_compact() !!! // mc Lget zstr,SwapWithVar,DropStr,Drop2_Next, args==-2 #if 0 ld a0,alu // a0 -> str1 tst (a0) // delay ld d2ar,(a0) // d2ar = str1 jp z,PokeCstr tst (hp) // delay pop d2 // d2 = str2 jp z,next_mc ld d2ar,(d2ar) // d2ar -> str1.len ld alu,(d2ar) // alu = len1 ld d2ar,d2 ld d2ar,(d2ar) // d2ar -> str2.len add (d2ar) // alu = len1+len2 ld d0,alu ld a0,(a0) // a0 = str1 dtmp jsr mem_grow_handle // a1->appended space d0-d2 pres. ld a0,d2 // str2 ld a0,(a0) // memptr2 -> str2.len dtmp ld alu,(a0++) pshr next_mc jp memcpy #endif /* Hänge String an String an */ //:AppendGlCstrRt ( T[]¢ T[]& -- ) // operator+= and retain items, reverted //AppendGlCstrRt__8ucs2charAEC_8ucs2charAEP_: // TODO :AppendGlStrRt ( T[] T[]& -- ) // operator+= and retain items, reverted TODO 0:$1AC1 0:000011:A6=A1:D3=D0 ld atmp,$ // * TODO 0:$1AC2 0:data:reset=0:$5AC1 0:$1AC3 0:000011:A1=A2:D0=D0 jp TODO // * TODO 0:$1AC4 d15:data:reset=0:$697C :AppendGlRangeRt ( T[?] T[]& -- ) // operator+= and retain items, reverted TODO 0:$1A95 0:000011:A6=A1:D3=D0 ld atmp,$ // * TODO 0:$1A96 0:data:reset=0:$5A95 0:$1A97 0:000011:A1=A2:D0=D0 jp TODO // * TODO 0:$1A98 d15:data:reset=0:$697C /* append to string and retain items: */ //:AppendGlItemRt ( T T[]& -- ) // operator+= and retain items // TODO :CatStr__Rt ( T[] T[] -- T[] ) // operator + and retain items TODO 0:$1A8D 0:000011:A6=A1:D3=D0 ld atmp,$ // * TODO 0:$1A8E 0:data:reset=0:$5A8D 0:$1A8F 0:000011:A1=A2:D0=D0 jp TODO // * TODO 0:$1A90 d15:data:reset=0:$697C /* Hänge Zeichen an String an */ //AppendGlChar__8ucs2char_8ucs2charAEP_ //:AppendGlChar ( char str& -- ) // TODO :AppendF ( float float[]& -- ) TODO 0:$1A7D 0:000011:A6=A1:D3=D0 ld atmp,$ // * TODO 0:$1A7E 0:data:reset=0:$5A7D 0:$1A7F 0:000011:A1=A2:D0=D0 jp TODO // * TODO 0:$1A80 d15:data:reset=0:$697C :AppendL ( long long[]& -- ) TODO 0:$1A89 0:000011:A6=A1:D3=D0 ld atmp,$ // * TODO 0:$1A8A 0:data:reset=0:$5A89 0:$1A8B 0:000011:A1=A2:D0=D0 jp TODO // * TODO 0:$1A8C d15:data:reset=0:$697C //:AppendL ( long long[]¢ -- ) // TODO /* :nAppendChar ( char str¢ -- ) TODO//to be eliminated // alu -> strvar // (hp) = char ld a0,alu // a0 -> strvar ld d1,alu // d1 -> strvar *combine* ld d2ar,(a0) // d2ar -> memptr jp z, append_to_null // append to non-null string: ld d2ar,(d2ar) // d2ar -> data.size ld d2,(d2ar) // d2 = old size ld atmp,d2 inc atmp ld d0,atmp // d0 = new size jsr alloc_wtv // ( d0:size d1->strvar -- alu=a0=handle d1->strvar a1->data.size ) // pres:d0,d2 // alu = new handle // a0 = new handle // d1 -> strvar (updated) // a1 -> new data.size // d0 = new size // d2 = old size ld atmp,d1 // atmp -> strvar ld d1,(atmp) // d1 = old handle -> old memptr ld (atmp),alu // *strvar := new handle ld a0,d1 // a0 = old handle -> old memptr ld a0,(a0) // a0 = old memptr -> old data.len *dtmp* ld alu,(a0++) // a0 -> old data.data alu = old len inc a1 // a1 -> new data.data jsr memcpy // ( alu:n a0 a1 -- a0+=n a1+=n ) mod: alu,sr,a0,a1 pres:d0-d2 pop (a1) // store char *dtmp* ld alu,d1 // alu = old handle jp DropStr // drop old str append_to_null ld d0,1 // d0 = new strlen jsr alloc_wtv // ( d0:size d1->strvar -- alu=a0=handle d1->strvar a1->data.size ) // pres:d0,d2 // alu = new handle // d1 -> strvar (updated) // a1 -> new data.size ld atmp,d1 // atmp -> strvar ld (atmp),alu // *strvar := new handle inc a1 // a1 -> new data.data pop (a1),alu // store char *dtmp* next_mc */ //:Rol_AE ( int[?] -- ) // TODO :Rol_LAE ( long[?] -- ) TODO 0:$1A75 0:000011:A6=A1:D3=D0 ld atmp,$ // * TODO 0:$1A76 0:data:reset=0:$5A75 0:$1A77 0:000011:A1=A2:D0=D0 jp TODO // * TODO 0:$1A78 d15:data:reset=0:$697C :Rol_FAE ( float[?] -- ) TODO 0:$1A69 0:000011:A6=A1:D3=D0 ld atmp,$ // * TODO 0:$1A6A 0:data:reset=0:$5A69 0:$1A6B 0:000011:A1=A2:D0=D0 jp TODO // * TODO 0:$1A6C d15:data:reset=0:$697C :RangeAll ( T[]¢ -- T[?] ) 0:$1ECF 0:000011:A6=A1:D3=D8 ld atmp,alu // atmp -> memptr 0:$1ED0 0:000011:A1=A6:DF=D1 ld d2ar,(atmp) // d2ar -> array.len 0:$1ED1 0:000011:A5=A5:D3=D8 psh alu,0 // T[]¢, a=0 0:$1ED2 0:000011:A5=A5:D1=D8 0:$1ED3 0:000011:A1=A5:D1=D0 0:$1ED4 0:data:reset=0:$0000 0:$1ED5 0:000011:A1=A7:D8=D1 ld alu,(d2ar) // e=len 0:$1ED6 0:000011:A0=A0:D0=D3 next_mc 0:$1ED7 d15:000011:A1=A0:D0=D0 :ResizeStr( str¢ len -- ) 0:$07B2 0:010011:A5=A5:D7=D1 pop dtmp // handle 0:$07B3 0:000011:A3=A1:D3=D7 ld a0,dtmp // a0 = handle 0:$07B4 z:000011:A1=A1:D4=D8 ld d0,alu :z // d0 = new len 1:$07B5 1:000011:A1=A7:D0=D0 jp 1,Drop // NULL handle can't be changed 1:$07B6 d15:data:reset=0:$5F33 0:$07B5 0:010011:A2=A2:D3=D8 pshr Drop 0:$07B6 0:000011:A1=A2:D1=D0 0:$07B7 0:data:reset=0:$5F33 0:$07B8 0:000011:A1=A7:D0=D0 jp mem_resize_handle // in: a0=handle d0=size 0:$07B9 d15:data:reset=0:$4425 :GrowStr( str¢ len -- ) 0:$07AA 0:010011:A5=A5:D7=D1 pop dtmp // handle 0:$07AB 0:000011:A3=A1:D3=D7 ld a0,dtmp // a0 = handle 0:$07AC z:000011:A1=A1:D4=D8 ld d0,alu :z // d0 = new len 1:$07AD 1:000011:A1=A7:D0=D0 jp 1,Drop // NULL handle can't be changed 1:$07AE d15:data:reset=0:$5F33 0:$07AD 0:010011:A2=A2:D3=D8 pshr Drop 0:$07AE 0:000011:A1=A2:D1=D0 0:$07AF 0:data:reset=0:$5F33 0:$07B0 0:000011:A1=A7:D0=D0 jp mem_grow_handle_cond // in: a0=handle d0=size 0:$07B1 d15:data:reset=0:$459A :ShrinkStr( str¢ len -- ) 0:$07BA 0:010011:A5=A5:D7=D1 pop dtmp // handle 0:$07BB 0:000011:A3=A1:D3=D7 ld a0,dtmp 0:$07BC z:000011:A1=A1:D4=D8 ld d0,alu :z // new len 1:$07BD 1:000011:A1=A7:D0=D0 jp 1,Drop // NULL handle can't be changed 1:$07BE d15:data:reset=0:$5F33 0:$07BD 0:010011:A2=A2:D3=D8 pshr Drop 0:$07BE 0:000011:A1=A2:D1=D0 0:$07BF 0:data:reset=0:$5F33 0:$07C0 0:000011:A1=A7:D0=D0 jp mem_shrink_handle_cond // in: a0=handle d0=size 0:$07C1 d15:data:reset=0:$443B //:ShrinkStrArray ( T[][]¢ uint -- ) // TODO // compare strings for equality // 2010-05-11 // :Eq_CstrCstr ( str1¢ str2¢ -- i1 ) 0:$01E7 0:000011:A3=A1:D3=D8 ld a0,alu // a0=handle2 0:$01E8 z:010011:A5=A5:D8=D1 pop alu :z // alu=handle1 if 1 1:$01E9 1:000011:A3=A1:D3=D0 ld a0,null // a0==0 => a0=ptr->null 1:$01EA 0:data:reset=0:$001B else 0:$01E9 0:000011:A1=A3:D7=D1 ld a0,(a0) // a0=ptr2 dtmp 0:$01EA 0:000011:A3=A1:D3=D7 then 0:$01EB 0:000011:A4=A1:D3=D8 ld a1,alu // handle1 0:$01EC z:data:reset=0:$0000 if z 1:$01ED 1:000011:A4=A1:D3=D0 ld a1,null // a1==0 => a1=ptr->null 1:$01EE 0:data:reset=0:$001B else 0:$01ED 0:000011:A1=A4:D7=D1 ld a1,(a1) // a1=ptr1 dtmp 0:$01EE 0:000011:A4=A1:D3=D7 then // a0 -> bu1 // a1 -> bu2 m_cmpstr: 0:$01EF 0:000011:A1=A3:D7=D1 ld atmp,(a0) // atmp=len1 dtmp 0:$01F0 0:000011:A6=A1:D3=D7 // vergleich beider strings. // als erstes wird das length-word verglichen. do 0:$01F1 0:000011:A3=A3:D8=D1 ld alu,(a0++) // alu=char2 0:$01F2 0:000001:A1=A4:D3=D1 equ (a1) // delay 0:$01F3 0:000001:A4=A4:D3=D1 equ (a1++) // char2==char1? 0:$01F4 z:data:reset=0:$0000 if !z // no 0:$01F5 0:000001:A1=A0:D8=D8 xor alu // rval=0=no 0:$01F6 0:000011:A0=A0:D0=D3 next_mc 0:$01F7 d15:000011:A1=A0:D0=D0 1:$01F5 1:000011:A1=A7:D0=D0 then 1:$01F6 d15:data:reset=0:$41F8 0:$01F8 0:010011:A6=A6:D3=D3 tst atmp-- // counter 0:$01F9 z:data:reset=0:$0000 until z 0:$01FA 0:000011:A1=A0:D0=D0 0:$01FB d15:data:reset=0:$41F1 1:$01FA 1:000001:A1=A7:D8=D8 xor alu 1:$01FB 1:000100:A1=A7:D8=D8 add_c alu // => 1 = yes nodelay 1:$01FC 1:000011:A0=A0:D0=D3 next_mc 1:$01FD d15:000011:A1=A0:D0=D0 :Ne_CstrCstr ( str1¢ str2¢ -- i1 ) Millicoded 0:$1D1F 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$1D20 0:data:reset=0:$5D23 0:$1D21 0:000011:A1=A5:D0=D0 jp millicoded // * Millicoded 0:$1D22 d15:data:reset=0:$5F70 0:$1D23 d15:data:reset=0:$41E7 mc Eq_CstrCstr 0:$1D24 d15:data:reset=0:$4823 mc Not 0:$1D25 d15:data:reset=0:$5ACD mc Ret // --- file: "millicode_str.asm" --- #include "asm/combicodes.asm" // +++ file: "combicodes.asm" +++ /* Copyright (c) Günter Woigk 2009 - 2015 mailto:kio@little-bat.de This file is free software This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: ? Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. ? Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ // Microcode for the K1-16/16 CPU // // 2010-09-20 // ================================================================ // Combined Millicode + Opcodes // ================================================================ :srn // shift right a>>n return via d2 0:$04B5 0:000010:A1=A0:D8=D0 and $000F 0:$04B6 0:data:reset=0:$000F 0:$04B7 0:000011:A1=A0:D3=D8 tst alu 0:$04B8 z:001011:A1=A0:D8=D8 cpl :z // n -> -1-n if 1 1:$04B9 1:000011:A1=A7:D0=D6 ld cmd,d2 1:$04BA d15:010011:A5=A5:D8=D1 pop alu :bit15 else 0:$04B9 0:000000:A1=A0:D7=D0 add sr8+8+1 // sr0+1+(-1-n) = sr0-n dtmp 0:$04BA 0:data:reset=0:$C4CF 0:$04BB 0:000000:A1=A4:D3=D7 0:$04BC 0:000000:A1=A4:D8=D7 0:$04BD 0:000011:A1=A4:D0=D8 ld cmd,alu // jp srtab-n 0:$04BE d15:010011:A5=A5:DC=D1 ld sr,(hp--),nc :bit15 then if 1 1:$04BF 1:000011:A1=A7:DC=DC ld sr,sr , nc // a>>15 1:$04C0 1:000011:A1=A7:DC=DC ld sr,sr , nc // a>>14 1:$04C1 1:000011:A1=A7:DC=DC ld sr,sr , nc // a>>13 1:$04C2 1:000011:A1=A7:DC=DC ld sr,sr , nc // a>>12 1:$04C3 1:000011:A1=A7:DC=DC ld sr,sr , nc // a>>11 1:$04C4 1:000011:A1=A7:DC=DC ld sr,sr , nc // a>>10 1:$04C5 0:000011:A1=A7:DA=DC ld swap,sr :0 // a>>9 0:$04BF 0:000011:A1=A5:D0=D0 then 0:$04C0 d15:data:reset=0:$C4C6 if 1 1:$04C6 1:000011:A1=A7:DC=DC sr8 ld sr,sr , nc // a>>8 1:$04C7 1:000011:A1=A7:DC=DC ld sr,sr , nc // a>>7 1:$04C8 1:000011:A1=A7:DC=DC ld sr,sr , nc // a>>6 1:$04C9 1:000011:A1=A7:DC=DC ld sr,sr , nc // a>>5 1:$04CA 1:000011:A1=A7:DC=DC ld sr,sr , nc // a>>4 1:$04CB 1:000011:A1=A7:DC=DC ld sr,sr , nc // a>>3 1:$04CC 1:000011:A1=A7:DC=DC ld sr,sr , nc // a>>2 1:$04CD 1:000011:A1=A7:D0=D6 ld cmd,d2 1:$04CE d15:000011:A1=A7:D8=DC ld alu,sr :bit15 // a>>1 else // dm "1234567" 0:$04C6 0:000011:A1=A7:D8=D0 ld alu,$00ff 0:$04C7 0:data:reset=0:$00FF 0:$04C8 0:000011:A1=A0:D0=D6 ld cmd,d2 0:$04C9 d15:000010:A1=A0:D8=DA and swap :bit15 then :sln // shift left a< -1-n if 1 1:$04CF 1:000011:A1=A7:D0=D6 ld cmd,d2 1:$04D0 d15:010011:A5=A5:D8=D1 pop alu :bit15 else 0:$04CF 0:000000:A1=A0:D7=D0 add sl8+8+1 // sl0+1+(-1-n) = sl0-n dtmp 0:$04D0 0:data:reset=0:$C4E5 0:$04D1 0:000000:A1=A4:D3=D7 0:$04D2 0:000000:A1=A4:D8=D7 0:$04D3 0:000011:A1=A4:D0=D8 ld cmd,alu // jp sltab-n 0:$04D4 d15:010011:A5=A5:DD=D1 ld sl,(hp--),nc :bit15 then if 1 1:$04D5 1:000011:A1=A7:DD=DD ld sl,sl , nc // a<<15 1:$04D6 1:000011:A1=A7:DD=DD ld sl,sl , nc // a<<14 1:$04D7 1:000011:A1=A7:DD=DD ld sl,sl , nc // a<<13 1:$04D8 1:000011:A1=A7:DD=DD ld sl,sl , nc // a<<12 1:$04D9 1:000011:A1=A7:DD=DD ld sl,sl , nc // a<<11 1:$04DA 1:000011:A1=A7:DD=DD ld sl,sl , nc // a<<10 1:$04DB 0:000011:A1=A7:DA=DD ld swap,sl :0 // a<<9 0:$04D5 0:000011:A1=A5:D0=D0 then 0:$04D6 d15:data:reset=0:$C4DC if 1 1:$04DC 1:000011:A1=A7:DD=DD sl8 ld sl,sl , nc // a<<8 1:$04DD 1:000011:A1=A7:DD=DD ld sl,sl , nc // a<<7 1:$04DE 1:000011:A1=A7:DD=DD ld sl,sl , nc // a<<6 1:$04DF 1:000011:A1=A7:DD=DD ld sl,sl , nc // a<<5 1:$04E0 1:000011:A1=A7:DD=DD ld sl,sl , nc // a<<4 1:$04E1 1:000011:A1=A7:DD=DD ld sl,sl , nc // a<<3 1:$04E2 1:000011:A1=A7:DD=DD ld sl,sl , nc // a<<2 1:$04E3 1:000011:A1=A7:D0=D6 ld cmd,d2 1:$04E4 d15:000011:A1=A7:D8=DD ld alu,sl :bit15 // a<<1 else // dm "1234567" 0:$04DC 0:000011:A1=A7:D8=D0 ld alu,$ff00 0:$04DD 0:data:reset=0:$FF00 0:$04DE 0:000011:A1=A7:D0=D6 ld cmd,d2 0:$04DF d15:000010:A1=A7:D8=DA and swap :bit15 then :sl_n ( i16 i4 -- i16 ) 0:$1A59 0:000011:A1=A0:D6=D0 ld d2,next_mc 0:$1A5A 0:data:reset=0:$5ACF 0:$1A5B 0:000011:A1=A2:D0=D0 jp sln 0:$1A5C d15:data:reset=0:$44CB :sr_n ( i16 i4 -- i16 ) 0:$1A51 0:000011:A1=A1:D6=D0 ld d2,next_mc 0:$1A52 0:data:reset=0:$5ACF 0:$1A53 0:000011:A1=A2:D0=D0 jp srn 0:$1A54 d15:data:reset=0:$44B5 // --- file: "combicodes.asm" --- #include "asm/opcodes.asm" // +++ file: "opcodes.asm" +++ /* Copyright (c) Günter Woigk 2009 - 2015 mailto:kio@little-bat.de This file is free software This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: ? Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. ? Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #if signed_bool instr return(FLAG,VALUE) ld cmd,(ip++) :FLAG if VALUE xorn alu :bit15 else xor alu :bit15 then // cond end #else // unsigned bool instr return(FLAG,VALUE) xor alu :FLAG // * return if VALUE // * return add_c alu // nodelay // * return next_op // post // * return else // * return next_op // * return then // * return end #endif // OPCODE: nop // resume with next OPCODE in ram: // :NOP ( -- ) NEXT: ( -- ) 0:$1A04 0:000011:A0=A0:D0=D1 next_op 0:$1A05 d15:data:reset=0:$0000 :SWAPWITHVAR ( int:Q int&:Z -- int:Z ) // swap data Q with contents of variable Z 0:$1C0C 0:000011:A6=A1:D3=D8 ld atmp,alu // atmp -> var Z 0:$1C0D 0:000011:A1=A6:D8=D1 ld alu,(atmp) // alu = Z 0:$1C0E 0:010011:A5=A5:D7=D1 pop (atmp) // var Z = Q dtmp 0:$1C0F 0:000011:A1=A6:D1=D7 0:$1C10 0:000011:A0=A0:D0=D1 next_op 0:$1C11 d15:data:reset=0:$0000 :MSBIT ( i16 -- i4 ) 0:$1B39 0:001011:A1=A4:D8=D8 ldn alu 0:$1B3A 0:000011:A1=A4:DE=D8 ld msbit,alu 0:$1B3B 0:000011:A1=A4:D8=DE ld alu,msbit 0:$1B3C 0:000011:A0=A0:D0=D1 next_op 0:$1B3D d15:data:reset=0:$0000 :ATI ( int[]¢ idx -- int& ) 0:$1B48 0:010011:A5=A5:DF=D1 pop d2ar // str handle -> memptr 0:$1B49 0:000100:A1=A7:D3=D1 add_c (d2ar) // ptr -> bu[idx] 0:$1B4A 0:000100:A1=A7:D8=D1 0:$1B4B 0:000011:A0=A0:D0=D1 next_op 0:$1B4C d15:data:reset=0:$0000 :ATIPEEK ( str¢ idx -- int ) 0:$1CC1 0:010011:A5=A5:DF=D1 pop d2ar // str handle -> memptr 0:$1CC2 0:000100:A1=A7:D3=D1 add_c (d2ar) // ptr -> bu[idx] 0:$1CC3 0:000100:A1=A7:D8=D1 0:$1CC4 0:000011:A1=A7:DF=D8 ld d2ar,alu 0:$1CC5 0:000011:A1=A7:D8=D1 ld alu,(d2ar) // value 0:$1CC6 0:000011:A0=A0:D0=D1 next_op 0:$1CC7 d15:data:reset=0:$0000 :ATIPOKE ( int int[]¢ idx -- ) 0:$1E63 0:010011:A5=A5:DF=D1 pop d2ar // str handle -> memptr 0:$1E64 0:000100:A1=A7:D3=D1 add_c (d2ar) // ptr -> bu[idx] 0:$1E65 0:000100:A1=A7:D8=D1 0:$1E66 0:000011:A1=A7:DF=D8 ld d2ar,alu 0:$1E67 0:010011:A5=A5:D7=D1 pop (d2ar),alu // store value *dtmp* 0:$1E68 0:000011:A1=A7:D1=D7 0:$1E69 0:010011:A5=A5:D8=D1 0:$1E6A 0:000011:A0=A0:D0=D1 next_op 0:$1E6B d15:data:reset=0:$0000 :ATIPOKESTR ( str idx str[]¢ -- ) // Bytecode login 0:$216E 0:001010:A1=A3:D2=D8 ld io,alu,d_bits=10 // * login TODO // memcnt 0:$216F 0:000011:A6=A1:D3=D0 ld atmp,$ // * TODO 0:$2170 0:data:reset=0:$616F 0:$2171 0:000011:A1=A1:D0=D0 jp TODO // * TODO 0:$2172 d15:data:reset=0:$697C 0:$2173 0:000011:A1=A1:DF=D8 ld d2ar,alu // d2ar = handle -> memptr -> str[].cnt 0:$2174 0:010011:A5=A5:D8=D1 pop alu // idx 0:$2175 0:000100:A1=A7:D3=D1 add_c (d2ar) // alu = @str[].cnt+1+idx -> str[i] 0:$2176 0:000100:A1=A7:D8=D1 0:$2177 0:000011:A1=A7:DF=D8 ld d2ar,alu // d2ar -> str[i] 0:$2178 0:000011:A1=A7:D8=D1 ld alu,(d2ar) // alu = str[i] 0:$2179 0:000011:A1=A7:D0=D0 jp POKESTR 0:$217A d15:data:reset=0:$5196 :COUNT ( str¢ -- i16 ) // Bytecode 0:$1B57 0:000011:A1=A0:DF=D8 ld d2ar,alu 0:$1B58 0:000011:A1=A7:DF=D1 ld d2ar,(d2ar) 0:$1B59 0:000011:A1=A7:D8=D1 ld alu,(d2ar) 0:$1B5A 0:000011:A0=A0:D0=D1 next_op 0:$1B5B d15:data:reset=0:$0000 :TOR ( n -- ) // Bytecode 0:$1B6B 0:010011:A2=A2:D3=DC pshr alu 0:$1B6C 0:000011:A1=A2:D1=D8 0:$1B6D 0:010011:A5=A5:D8=D1 pop alu 0:$1B6E 0:000011:A0=A0:D0=D1 next_op 0:$1B6F d15:data:reset=0:$0000 :FROMR ( -- n ) // Bytecode 0:$1B61 0:000011:A5=A5:D3=DC psh alu 0:$1B62 0:000011:A1=A5:D1=D8 0:$1B63 0:000011:A2=A2:D8=D1 popr alu 0:$1B64 0:000011:A0=A0:D0=D1 next_op 0:$1B65 d15:data:reset=0:$0000 :IRPT ( selmask -- ) // Bytecode: trigger irpt routine 0:$1FC4 0:data: ei=0:$0000 di 0:$1FC5 0:000001:A1=A0:D2=D8 ld io_select,alu 0:$1FC6 0:000011:A1=A0:DE=D8 ld msbit,alu 0:$1FC7 0:000011:A6=A1:D3=DE ld atmp,msbit // atmp = int_vector = 0 .. 15 0:$1FC8 0:010011:A2=A2:D3=DE pshr ip // dtmp 0:$1FC9 0:000011:A1=A0:D7=D3 0:$1FCA 0:000011:A1=A2:D1=D7 0:$1FCB 0:000011:A1=A6:DF=D1 ld d2ar,(atmp) // d2ar -> device sel mask 0:$1FCC 0:000011:A0=A7:D3=D8 ld ip,d2ar+1 // ip -> int_handler 0:$1FCD 0:010011:A5=A5:D8=D1 pop alu 0:$1FCE 0:000011:A0=A0:D0=D1 next_op // jump to int handler in ram post 0:$1FCF d15:data:reset=0:$0000 :OR1 % $100 ( i1 -- ) // Bytecode: pruning boolean OR 0:$1400 0:000011:A1=A7:D3=D8 tst alu 0:$1401 z:data:reset=0:$0000 if !z 0:$1402 0:100011:A0=A0:D3=D8 ld ip,ip+dis // skip 2nd operand else 1:$1402 0:010011:A5=A5:D8=D1 pop alu // drop i1 and execute 2nd operand for i1 then 0:$1403 0:000011:A0=A0:D0=D1 next_op 0:$1404 d15:data:reset=0:$0000 :AND0 % $100 ( i1 -- ) // Bytecode: pruning boolean AND 0:$1300 0:000011:A1=A7:D3=D8 tst alu 0:$1301 z:data:reset=0:$0000 if z 1:$1302 0:100011:A0=A0:D3=DF ld ip,ip+dis // skip 2nd operand else 0:$1302 0:010011:A5=A5:D8=D1 pop alu // drop i1 and execute 2nd operand for i1 then 0:$1303 0:000011:A0=A0:D0=D1 next_op 0:$1304 d15:data:reset=0:$0000 // return from millicoded opcode: // NextOpcode := RET ( -- ) //// copy memory from str q to str z[j] //// limits copy count to str sizes //// but does not check indexes //// //:COPY_I2IJ ( qi zi zj n qstr¢ zstr[]¢ -- ) // Bytecode // login // TODO // memcnt // // pop d0,d1 // d0=qstr,d1=n // ld atmp,alu // zstr // ld alu,(atmp) // alu -> zstr.len // add_c (hp) // alu -> zstr[j] // ld (hp++),d1 // n back on stack // ld (hp),d0 // qstr back on stack //// jp COPY_I2I // //// copy memory from str q to str z //// limits copy count to str sizes //// but does not check indexes //// //COPY_I2I: ( qidx, zidx, cnt, str¢:q, str¢:z -- ) // Bytecode // login // TODO // memcnt // // Millicoded //qidx=4 //zidx=3 //cnt=2 //qstr=1 //zstr=0 // args=0 // // limit copy cnt: // mc Lget zstr,Count,Lget zidx,Sub, args==1 // z_max_cnt // mc Lget qstr,Count,Lget qidx,Sub, args==2 // z_max_cnt q_max_cnt // mc Min,Lget cnt,Min,Lset cnt, args==0 // // calc q and z ptr: // mc Lget zidx,AtIndex,Swap, args==0 // mc Lget qidx,AtIndex,Swap, args==0 // // copy, drop args & exit: // mc Lget cnt,NewMemCpy,Drop3_Next // args==-5 // //:COPY_IJ2I ( qi, qj, zi, n, qstr[]¢, zstr¢ -- ) // Bytecode // login // TODO // memcnt // // ld d0,alu // d0=zstr // pop d2ar,d1,d2 // d2ar=qstr[],d1=n,d2=zi // ld alu,(d2ar) // alu->qstr[].len // add_c (hp) // alu->qstr[j] // ld (hp++),d2 // zi // ld (hp++),d1 // n // ld (hp),alu // qstr // ld alu,d0 // zstr // jp COPY_I2I // //:COPY_IJ2IJ ( qi, qj, zi, zj, n, qstr[]¢, zstr[]¢ -- ) // Bytecode // login // TODO // memcnt // // ld atmp,alu // atmp=zstr[] // pop d2ar,d0,d1,d2 // d2ar=qstr[],d0=n,d1=zj,d2=zi // ld alu,(d2ar) // alu->qstr[].len // add_c (hp) // alu->qstr[j] // ld d2ar,alu // d2ar->qstr[j] // ld (hp++),d2 // zi // ld (hp++),d0 // n // ld (hp),(d2ar) // qstr dtmp // ld alu,(atmp) // alu->zstr[].cnt // add_c d1 // alu->zstr[j] // ld atmp,alu // ld alu,(atmp) // alu=zstr // jp COPY_I2I /* :ATIRESIZE ( size i str[]¢ -- ) // Bytecode login TODO // memcnt Millicoded mc Dup2,ToR,ToR mc Swap,AtIndexPeek mc Swap,ResizedStr mc FromR,FromR mc Swap,AtIndexPoke mc NextOpcode */ // resize string // :RESIZE ( size str* -- ) // Bytecode login 0:$10A2 0:001010:A1=A5:D2=D8 ld io,alu,d_bits=10 // * login TODO // memcnt 0:$10A3 0:000011:A6=A1:D3=D0 ld atmp,$ // * TODO 0:$10A4 0:data:reset=0:$50A3 0:$10A5 0:000011:A1=A0:D0=D0 jp TODO // * TODO 0:$10A6 d15:data:reset=0:$697C 0:$10A7 0:000011:A3=A1:D3=D8 ld a0,alu // a0->str 0:$10A8 0:000011:A1=A3:D8=D1 ld alu,(a0) // alu=str_handle (delay) 0:$10A9 0:000011:A1=A3:D8=D1 ld alu,(a0) // alu=str_handle 0:$10AA z:data:reset=0:$0000 if z // str==NULL 1:$10AB 1:000011:A1=A7:D0=D0 1:$10AC d15:data:reset=0:$50BB 0:$10BB 0:000011:A1=A5:D4=D1 ld d0,(hp) 0:$10BC 0:010011:A5=A5:D4=D1 ld d0,(hp--) 0:$10BD z:data:reset=0:$0000 if z 1:$10BE 1:010011:A5=A5:D8=D1 pop alu // TOP 1:$10BF 1:000011:A0=A0:D0=D1 next_op 1:$10C0 d15:data:reset=0:$0000 else // str==NULL, new str.len>0 0:$10BE 0:000011:A1=A3:D6=D3 ld d2,a0 // d2->str (safe) 0:$10BF 0:010011:A2=A2:D3=D3 jsr alloc // in:d0=size out:alu=a0=handle, a1->data.size 0:$10C0 0:000011:A1=A2:D1=D0 0:$10C1 0:data:reset=0:$50C4 0:$10C2 0:000011:A1=A0:D0=D0 0:$10C3 d15:data:reset=0:$4207 0:$10C4 0:000011:A3=A1:D3=D6 ld a0,d2 0:$10C5 0:000011:A1=A3:D1=D8 ld (a0),alu 0:$10C6 0:000011:A0=A0:D0=D1 next_op 0:$10C7 d15:data:reset=0:$0000 then else // str!=NULL 0:$10AB 0:000011:A1=A5:D4=D1 ld d0,(hp) 0:$10AC 0:010011:A5=A5:D4=D1 ld d0,(hp--) // d0=new size 0:$10AD z:data:reset=0:$0000 if z login 1:$10AE 1:001010:A1=A7:D2=D8 ld io,alu,d_bits=10 // * login TODO 1:$10AF 1:000011:A6=A1:D3=D0 ld atmp,$ // * TODO 1:$10B0 1:data:reset=0:$D0AF 1:$10B1 1:000011:A1=A0:D0=D0 jp TODO // * TODO 1:$10B2 d15:data:reset=0:$697C 1:$10B3 1:000011:A1=A3:D1=D0 ld (a0),0 // str:=NULL 1:$10B4 1:data:reset=0:$0000 1:$10B5 1:000011:A6=A1:D3=D0 ld atmp,mem_free_ptr 1:$10B6 1:data:reset=0:$0018 1:$10B7 1:000011:A3=A1:D3=D8 ld a0,alu // a0=alu=handle 1:$10B8 1:000011:A1=A6:D7=D1 ld (a0),(atmp) // dtmp 1:$10B9 1:000011:A1=A3:D1=D7 1:$10BA 1:000011:A1=A6:D1=D8 ld (atmp),alu 1:$10BB 1:010011:A5=A5:D8=D1 pop alu 1:$10BC 1:000011:A0=A0:D0=D1 next_op 1:$10BD d15:data:reset=0:$0000 else 0:$10AE 0:000011:A3=A1:D3=D8 ld a0,alu // a0=handle 0:$10AF 0:010011:A5=A5:D4=D1 pop d0 // d0=new size 0:$10B0 0:010011:A2=A2:D3=D8 jsr mem_resize_handle 0:$10B1 0:000011:A1=A2:D1=D0 0:$10B2 0:data:reset=0:$50B5 0:$10B3 0:000011:A1=A0:D0=D0 0:$10B4 d15:data:reset=0:$4425 0:$10B5 0:010011:A5=A5:D8=D1 pop alu 0:$10B6 0:000011:A0=A0:D0=D1 next_op 0:$10B7 d15:data:reset=0:$0000 then then :SWITCH ( i -- ) // Bytecode: SWITCH,N,LABELS[N] 0:$12D6 0:001100:A1=A0:D3=D1 cmp (ip) 0:$12D7 0:001100:A1=A0:D3=D1 0:$12D8 cy:data:reset=0:$0000 if cy // cy => !cy => i?n => ootable => resume after table 1:$12D9 1:000011:A0=A0:D8=D1 ld alu,(ip++) 1:$12DA 1:000100:A1=A0:D3=D3 add_c ip 1:$12DB 1:000100:A1=A0:D8=D3 1:$12DC 1:000011:A0=A1:D3=D8 ld ip,alu 1:$12DD 1:010011:A5=A5:D8=D1 pop alu 1:$12DE 1:000011:A0=A0:D0=D1 next_op // post 1:$12DF d15:data:reset=0:$0000 else 0:$12D9 0:000100:A1=A0:D3=D3 add_c ip 0:$12DA 0:000100:A1=A0:D8=D3 0:$12DB 0:000011:A6=A1:D3=D8 ld atmp,alu // atmp->tbl[i] 0:$12DC 0:000011:A1=A6:D7=D1 ld ip,(atmp) // ip = tbl[i] dtmp 0:$12DD 0:000011:A0=A1:D3=D7 0:$12DE 0:010011:A5=A5:D8=D1 pop alu 0:$12DF 0:000011:A0=A0:D0=D1 next_op // post 0:$12E0 d15:data:reset=0:$0000 then /* :RESIZE_STRBU ( n str[]¢ -- ) // Bytecode login TODO // memcnt Millicoded n = 1 strbu=0 args=0 mc Lget n,Lget strbu,Count,Eq,If,Drop2_Next, args==-2 args=0 mc Lget n,Lget strbu,Count,Ugt,BraIf1 gt, args==0 // newsize mem_free_ptr 0:$1152 0:data:reset=0:$0018 0:$1153 0:000011:A1=A3:D6=D1 ld d2,(a0) // d2 -> last free memptr atmp 0:$1154 0:000011:A1=A7:D7=D1 ld a1,(d2ar) // a1->str[].len dtmp 0:$1155 0:000011:A4=A1:D3=D7 0:$1156 0:000011:A4=A4:D7=D1 ld atmp,(a1++) // atmp=str[].len, a1->str[0] dtmp 0:$1157 0:000011:A6=A1:D3=D7 0:$1158 0:000011:A1=A1:D0=D0 jp p 0:$1159 d15:data:reset=0:$515D do 0:$115A 0:000011:A1=A4:DF=D1 ld d2ar,(a1) // delay 0:$115B 0:000011:A4=A4:DF=D1 ld d2ar,(a1++) // d2ar -> str[i] 0:$115C z:data:reset=0:$0000 if !z 0:$115D 0:000011:A1=A7:D1=D6 p ld (d2ar),d2 // add str to mem_free list 0:$115E 0:000011:A1=A7:D6=D3 ld d2,d2ar 1:$115D 1:data:reset=0:$0000 then 1:$115E 0:data:reset=0:$0000 0:$115F 0:010011:A6=A6:D3=D3 tst atmp-- 0:$1160 z:data:reset=0:$0000 until z 0:$1161 0:000011:A1=A0:D0=D0 0:$1162 d15:data:reset=0:$515A 1:$1161 1:000011:A1=A3:D1=D6 ld (a0),d2 // update mem_free_ptr 1:$1162 1:010011:A5=A5:D8=D1 pop alu 1:$1163 1:000011:A0=A0:D0=D1 next_op // post 1:$1164 d15:data:reset=0:$0000 then //MULU0 := LDQ+0 falsch: muss sein: drop + ldq(0) MULU1 := NEXT MULU2 := SLI1 MULU4 := SLI2 MULU8 := SLI3 :MULU5 ld sl,alu,nc 0:$1B52 0:000011:A1=A0:DD=DD ld sl,sl,nc 0:$1B53 0:000000:A1=A0:D3=DD add sl 0:$1B54 0:000000:A1=A0:D8=DD 0:$1B55 0:000011:A0=A0:D0=D1 next_op 0:$1B56 d15:data:reset=0:$0000 :MULU6 add alu // nodelay 0:$1B43 0:000011:A1=A2:DD=D8 MULU3: ld sl,alu,nc 0:$1B44 0:000000:A1=A2:D3=DD add sl 0:$1B45 0:000000:A1=A2:D8=DD 0:$1B46 0:000011:A0=A0:D0=D1 next_op 0:$1B47 d15:data:reset=0:$0000 :MULU7 ld sl,alu,nc 0:$1296 0:000000:A1=A2:D3=DD add sl 0:$1297 0:000000:A1=A2:D8=DD 0:$1298 0:000011:A1=A2:DD=DD ld sl,sl,nc 0:$1299 0:000000:A1=A2:D3=DD add sl 0:$129A 0:000000:A1=A2:D8=DD 0:$129B 0:000011:A0=A0:D0=D1 next_op 0:$129C d15:data:reset=0:$0000 // signed multiplication // MUL: ( i16 i16 -- i16 ) // signed multiplication 0:$129D 0:010011:A5=A5:D4=D1 pop d0 // result pos or neg? 0:$129E 0:000001:A1=A5:D8=D4 xor d0 // alu.bit15 = result.sign 0:$129F 0:000001:A1=A5:D8=D4 xor d0 // alu.bit15 on data bus; restore alu 0:$12A0 d15:000011:A3=A1:D3=D0 ld a0,ival :bit15 // test result.sign if 1 1:$12A1 0:data:reset=0:$5BEF dw NEG // resut<0: return to neg else 0:$12A1 0:data:reset=0:$5A04 dw NEXT then 0:$12A2 0:000011:A1=A2:D0=D0 jp mul_d0 0:$12A3 d15:data:reset=0:$C2F2 // signed division // :DIV ( i16:Q i16:D -- i16 ) // signed division 0:$1319 0:000011:A1=A5:D4=D1 ld d0,(hp) // result pos or neg? 0:$131A 0:000001:A1=A5:D8=D4 xor d0 // alu.bit15 = result.sign 0:$131B 0:000001:A1=A5:D8=D4 xor d0 // alu.bit15 on data bus; restore alu 0:$131C d15:000011:A3=A1:D3=D0 ld a0,ival :bit15 // test result.sign if 1 1:$131D 0:data:reset=0:$5B7A dw DROP_NEG // result<0: return to Drop + Neg else 0:$131D 0:data:reset=0:$5F47 dw DROP then 0:$131E 0:000011:A1=A7:D0=D0 jp div_d0 0:$131F d15:data:reset=0:$45E3 // Q = Q/D*D + Q%D // Q%D = Q - Q/D*D => sign(D) irrelevant, sign(Q%D) = sign(Q) ! // :REM ( i16:Q i16:D -- i16:R ) // signed division remainder // D neg? 0:$127F 0:000011:A6=A1:D3=D8 ld atmp,alu 0:$1280 d15:010011:A6=A6:D3=D8 dec atmp :bit15 if 1 // note: -a = ~(a-1) 1:$1281 0:001011:A1=A6:D8=D3 ldn atmp // D = -D 0:$1281 0:data:reset=0:$0000 then // Q neg? => result neg? 0:$1282 0:000011:A1=A5:D4=D1 ld d0,(hp) 0:$1283 d15:000011:A3=A1:D3=D0 ld a0,ival :bit15 if 0 0:$1284 0:data:reset=0:$5EE9 dw NIP // Q?0 => result?0 0:$1285 0:000011:A1=A6:D0=D0 jp divu 0:$1286 d15:data:reset=0:$41B6 else 1:$1284 1:data:reset=0:$5BEE dw NIP_NEG // Q<0 => result<0: return to neg 1:$1285 1:000011:A1=A3:D7=D8 ld dtmp,alu 1:$1286 1:000011:A6=A1:D3=D4 ld atmp,d0 1:$1287 1:010011:A6=A6:D3=D4 dec atmp 1:$1288 1:001011:A1=A6:D8=D3 ldn atmp 1:$1289 1:000011:A1=A5:D1=D8 ld (hp),alu // Q = -Q 1:$128A 1:000011:A1=A5:D8=D7 ld alu,dtmp 1:$128B 1:000011:A1=A5:D0=D0 jp divu 1:$128C d15:data:reset=0:$41B6 then /* MULU: -> millicode_int.asm DIVU: -> millicode_int.asm */ :REMU ( u16:x u16:y -- u16:r ) // r = x%y 0:$1A25 0:000011:A3=A1:D3=D0 ld a0,NIP 0:$1A26 0:data:reset=0:$5EE9 0:$1A27 0:000011:A1=A6:D0=D0 jp divu 0:$1A28 d15:data:reset=0:$41B6 :FROMR_POKE_NEXT ( int -- ) // UP 0:$1BE8 0:000011:A2=A2:D7=D1 popr a0 // dtmp 0:$1BE9 0:000011:A3=A1:D3=D7 0:$1BEA 0:000011:A1=A3:D1=D8 ld (a0),alu 0:$1BEB 0:010011:A5=A5:D8=D1 pop alu 0:$1BEC 0:000011:A0=A0:D0=D1 next_op // post 0:$1BED d15:data:reset=0:$0000 :MULPOKE ( int int* -- ) Millicoded 0:$1CAC 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$1CAD 0:data:reset=0:$5CB0 0:$1CAE 0:000011:A1=A4:D0=D0 jp millicoded // * Millicoded 0:$1CAF d15:data:reset=0:$5F70 0:$1CB0 d15:data:reset=0:$5D80 mc DupToRPeekSwap, Mul, FROMR_POKE_NEXT 0:$1CB1 d15:data:reset=0:$C2EC 0:$1CB2 d15:data:reset=0:$5BE8 :DIVPOKE ( int int* -- ) Millicoded 0:$1D42 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$1D43 0:data:reset=0:$5D46 0:$1D44 0:000011:A1=A5:D0=D0 jp millicoded // * Millicoded 0:$1D45 d15:data:reset=0:$5F70 0:$1D46 d15:data:reset=0:$5D80 mc DupToRPeekSwap, Div, FROMR_POKE_NEXT 0:$1D47 d15:data:reset=0:$45DD 0:$1D48 d15:data:reset=0:$5BE8 :REMPOKE ( int int* -- ) Millicoded 0:$1C9E 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$1C9F 0:data:reset=0:$5CA2 0:$1CA0 0:000011:A1=A4:D0=D0 jp millicoded // * Millicoded 0:$1CA1 d15:data:reset=0:$5F70 0:$1CA2 d15:data:reset=0:$5D80 mc DupToRPeekSwap, Rem, FROMR_POKE_NEXT 0:$1CA3 d15:data:reset=0:$462F 0:$1CA4 d15:data:reset=0:$5BE8 :SRUPOKE ( n int* -- ) // Bytecode Millicoded 0:$1C18 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$1C19 0:data:reset=0:$5C1C 0:$1C1A 0:000011:A1=A4:D0=D0 jp millicoded // * Millicoded 0:$1C1B d15:data:reset=0:$5F70 0:$1C1C d15:data:reset=0:$447D mc SruPoke, NextOpcode 0:$1C1D d15:data:reset=0:$5B8A :SRSPOKE ( n int* -- ) // Bytecode Millicoded 0:$1DC0 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$1DC1 0:data:reset=0:$5DC4 0:$1DC2 0:000011:A1=A5:D0=D0 jp millicoded // * Millicoded 0:$1DC3 d15:data:reset=0:$5F70 TODO 0:$1DC4 0:000011:A6=A1:D3=D0 ld atmp,$ // * TODO 0:$1DC5 0:data:reset=0:$5DC4 0:$1DC6 0:000011:A1=A5:D0=D0 jp TODO // * TODO 0:$1DC7 d15:data:reset=0:$697C // mc SrsPoke, NextOpcode :SLPOKE ( n int* -- ) // Bytecode Millicoded 0:$1C36 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$1C37 0:data:reset=0:$5C3A 0:$1C38 0:000011:A1=A4:D0=D0 jp millicoded // * Millicoded 0:$1C39 d15:data:reset=0:$5F70 0:$1C3A d15:data:reset=0:$691E mc SlPoke, NextOpcode 0:$1C3B d15:data:reset=0:$5B8A :ANDPOKE ( int int* -- ) // Bytecode 0:$1C97 0:000011:A6=A1:D3=D8 ld atmp,alu 0:$1C98 0:010011:A5=A5:D8=D1 pop alu 0:$1C99 0:000010:A1=A6:D8=D1 and (atmp) 0:$1C9A 0:000011:A1=A6:D1=D8 ld (atmp),alu 0:$1C9B 0:010011:A5=A5:D8=D1 pop alu 0:$1C9C 0:000011:A0=A0:D0=D1 next_op 0:$1C9D d15:data:reset=0:$0000 :ORPOKE ( int int* -- ) // Bytecode 0:$1C90 0:000011:A6=A1:D3=D8 ld atmp,alu 0:$1C91 0:010011:A5=A5:D8=D1 pop alu 0:$1C92 0:000110:A1=A6:D8=D1 or (atmp) 0:$1C93 0:000011:A1=A6:D1=D8 ld (atmp),alu 0:$1C94 0:010011:A5=A5:D8=D1 pop alu 0:$1C95 0:000011:A0=A0:D0=D1 next_op 0:$1C96 d15:data:reset=0:$0000 :XORPOKE ( int int* -- ) // Bytecode 0:$2208 0:000011:A6=A1:D3=D8 ld atmp,alu 0:$2209 0:010011:A5=A5:D8=D1 pop alu 0:$220A 0:000001:A1=A6:D8=D1 xor (atmp) 0:$220B 0:000011:A1=A6:D1=D8 ld (atmp),alu 0:$220C 0:010011:A5=A5:D8=D1 pop alu 0:$220D 0:000011:A0=A0:D0=D1 next_op 0:$220E d15:data:reset=0:$0000 :ADDPOKE ( int int* -- ) // Bytecode 0:$1D60 0:000011:A6=A1:D3=D8 ld atmp,alu 0:$1D61 0:010011:A5=A5:D8=D1 pop alu 0:$1D62 0:000000:A1=A6:D3=D1 add (atmp) 0:$1D63 0:000000:A1=A6:D8=D1 0:$1D64 0:000011:A1=A6:D1=D8 ld (atmp),alu 0:$1D65 0:010011:A5=A5:D8=D1 pop alu 0:$1D66 0:000011:A0=A0:D0=D1 next_op 0:$1D67 d15:data:reset=0:$0000 :SUBPOKE ( int int* -- ) // Bytecode 0:$1DC8 0:000011:A6=A1:D3=D8 ld atmp,alu 0:$1DC9 0:000011:A1=A6:D8=D1 ld alu,(atmp) 0:$1DCA 0:011100:A1=A5:D3=D1 sub (hp--) 0:$1DCB 0:011100:A5=A5:D8=D1 0:$1DCC 0:000011:A1=A6:D1=D8 ld (atmp),alu 0:$1DCD 0:010011:A5=A5:D8=D1 pop alu 0:$1DCE 0:000011:A0=A0:D0=D1 next_op 0:$1DCF d15:data:reset=0:$0000 // =================================================================== // branching: // =================================================================== // 2010-05-11 :JP ( -- ) // JP nn 0:$1A55 0:000011:A1=A0:D7=D1 ld ip,(ip) // dtmp 0:$1A56 0:000011:A0=A1:D3=D7 0:$1A57 0:000011:A0=A0:D0=D1 next_op 0:$1A58 d15:data:reset=0:$0000 // 2010-05-11 :JP_Z ( i1 -- ) // JP if Z nn 0:$134B 0:000011:A1=A0:D3=D8 tst alu 0:$134C z:000011:A0=A0:D7=D1 ld dtmp,(ip++) :z if 1 1:$134D 1:000011:A0=A1:D3=D7 ld ip,dtmp 1:$134E 1:010011:A5=A5:D8=D1 pop alu 1:$134F 1:000011:A0=A0:D0=D1 next_op // post 1:$1350 d15:data:reset=0:$0000 else 0:$134D 0:010011:A5=A5:D8=D1 pop alu 0:$134E 0:000011:A0=A0:D0=D1 next_op // post 0:$134F d15:data:reset=0:$0000 then // 2010-05-11 :JP_NZ ( i1 -- ) // JP if NZ nn 0:$1350 0:000011:A1=A0:D3=D8 tst alu 0:$1351 z:000011:A0=A0:D7=D1 ld dtmp,(ip++) :z if 0 0:$1352 0:000011:A0=A1:D3=D7 ld ip,dtmp 0:$1353 0:010011:A5=A5:D8=D1 pop alu 0:$1354 0:000011:A0=A0:D0=D1 next_op // post 0:$1355 d15:data:reset=0:$0000 else 1:$1352 1:010011:A5=A5:D8=D1 pop alu 1:$1353 1:000011:A0=A0:D0=D1 next_op // post 1:$1354 d15:data:reset=0:$0000 then // 2010-05-11 :JSR ( -- ) // JSR nn 0:$1D2D 0:000011:A0=A0:D7=D1 ld dtmp,(ip++) 0:$1D2E 0:000011:A1=A0:D6=D3 ld d2,ip 0:$1D2F 0:000011:A0=A1:D3=D7 ld ip,dtmp 0:$1D30 0:010011:A2=A2:D3=D7 pshr d2 0:$1D31 0:000011:A1=A2:D1=D6 0:$1D32 0:000011:A0=A0:D0=D1 next_op // post 0:$1D33 d15:data:reset=0:$0000 :CALLPROCPTR ( procaddr -- ) 0:$1A6D 0:000011:A1=A1:D7=D8 ld dtmp,alu 0:$1A6E 0:010011:A5=A5:D8=D1 pop alu 0:$1A6F 0:000011:A1=A5:D0=D7 jp dtmp 0:$1A70 d15:data:reset=0:$0000 // Call Struct or Array Destructor 'kill()': // Call kill() if handle != null and retain count == 1 // the kill() proc address follows after this opcode // :CALLKILL ( T -- T ) 0:$121B 0:000011:A6=A1:D3=D8 ld atmp,alu 0:$121C z:data:reset=0:$0000 if !z 0:$121D 0:000011:A6=A6:D3=D8 inc atmp // --> ref_cnt 0:$121E 0:000011:A1=A6:DF=D1 ld d2ar,(atmp) 0:$121F 0:010011:A6=A7:D3=D8 ld atmp,d2ar-1 0:$1220 0:000011:A1=A6:D3=D3 tst atmp 0:$1221 z:data:reset=0:$0000 if z 1:$1222 1:000011:A0=A0:D7=D1 ld dtmp,(ip++) 1:$1223 1:000011:A1=A0:D6=D3 ld d2,ip 1:$1224 1:000011:A0=A1:D3=D7 ld ip,dtmp 1:$1225 1:010011:A2=A2:D3=D7 pshr d2 1:$1226 1:000011:A1=A2:D1=D6 1:$1227 1:000011:A0=A0:D0=D1 next_op // post 1:$1228 d15:data:reset=0:$0000 0:$1222 0:000011:A1=A0:D0=D0 then 0:$1223 d15:data:reset=0:$D229 1:$121D 1:000011:A1=A7:D0=D0 then 1:$121E d15:data:reset=0:$D229 1:$1229 1:000011:A0=A0:D3=D8 inc ip // skip kill() proc address 1:$122A 1:000011:A0=A0:D0=D1 next_op 1:$122B d15:data:reset=0:$0000 // 2010-05-13 HALT: ( -- ) // wait for interrupt 1:$122C 1:data: halt=1:$0000 set halt 1:$122D 1:000011:A1=A0:D3=D8 nop 1:$122E 1:data: halt=0:$0000 clr halt 1:$122F 1:000011:A0=A0:D0=D1 next_op // post 1:$1230 d15:data:reset=0:$0000 // note: // wenn BRA_M = BRA_P-$100, dann ist: // BRA möglich für: BRA=BRA_P und dist = -256 .. +255 // // 2010-05-11 :BSR_M = $3E00:1 ( -- ) // BSR -$100+dis 1:$3E00 1:110011:A0=A0:D7=D3 ld dtmp,ip-=dis 1:$3E01 1:010011:A2=A2:D3=D3 pshr dtmp 1:$3E02 1:000011:A1=A2:D1=D7 1:$3E03 1:000011:A0=A0:D0=D1 next_op // post 1:$3E04 d15:data:reset=0:$0000 // 2010-05-11 :BSR_P = $3F00:1 ( -- ) // BSR +dis 1:$3F00 1:100011:A0=A0:D7=D3 ld dtmp,ip+=dis 1:$3F01 1:010011:A2=A2:D3=D3 pshr dtmp 1:$3F02 1:000011:A1=A2:D1=D7 1:$3F03 1:000011:A0=A0:D0=D1 next_op // post 1:$3F04 d15:data:reset=0:$0000 // 2010-05-11 :BRA_M = $3E00:0 ( -- ) // BRA -$100+dis 0:$3E00 0:110011:A0=A0:D3=DD ld ip,ip-dis 0:$3E01 0:000011:A0=A0:D0=D1 next_op 0:$3E02 d15:data:reset=0:$0000 // 2010-05-11 :BRA_P = $3F00:0 ( -- ) // BRA +dis 0:$3F00 0:100011:A0=A0:D3=DD ld ip,ip+dis 0:$3F01 0:000011:A0=A0:D0=D1 next_op 0:$3F02 d15:data:reset=0:$0000 // 2010-05-11 :BRAZ_M = $3C00:1 ( i1 -- ) // BRA if Z -$100+dis 1:$3C00 1:000011:A1=A7:D3=D8 tst alu 1:$3C01 z:010011:A5=A5:D8=D1 pop alu :z if 1 1:$3C02 1:110011:A0=A0:D3=D8 ld ip,ip-dis 1:$3C03 1:000011:A0=A0:D0=D1 next_op 1:$3C04 d15:data:reset=0:$0000 else 0:$3C02 0:000011:A0=A0:D0=D1 next_op 0:$3C03 d15:data:reset=0:$0000 then // 2010-05-11 :BRAZ_P = $3D00:1 ( i1 -- ) // BRA if Z +dis 1:$3D00 1:000011:A1=A7:D3=D8 tst alu 1:$3D01 z:010011:A5=A5:D8=D1 pop alu :z if 1 1:$3D02 1:100011:A0=A0:D3=D8 ld ip,ip+dis 1:$3D03 1:000011:A0=A0:D0=D1 next_op 1:$3D04 d15:data:reset=0:$0000 else 0:$3D02 0:000011:A0=A0:D0=D1 next_op 0:$3D03 d15:data:reset=0:$0000 then // 2010-05-11 :BRANZ_M = $3A00:1 ( i1 -- ) // BRA if NZ -$100+dis 1:$3A00 1:000011:A1=A7:D3=D8 tst alu 1:$3A01 z:010011:A5=A5:D8=D1 pop alu :z if 0 0:$3A02 0:110011:A0=A0:D3=DB ld ip,ip-dis 0:$3A03 0:000011:A0=A0:D0=D1 next_op 0:$3A04 d15:data:reset=0:$0000 else 1:$3A02 1:000011:A0=A0:D0=D1 next_op 1:$3A03 d15:data:reset=0:$0000 then // 2010-05-11 :BRANZ_P = $3B00:1 ( i1 -- ) // BRA if NZ +dis 1:$3B00 1:000011:A1=A7:D3=D8 tst alu 1:$3B01 z:010011:A5=A5:D8=D1 pop alu :z if 0 0:$3B02 0:100011:A0=A0:D3=DD ld ip,ip+dis 0:$3B03 0:000011:A0=A0:D0=D1 next_op 0:$3B04 d15:data:reset=0:$0000 else 1:$3B02 1:000011:A0=A0:D0=D1 next_op 1:$3B03 d15:data:reset=0:$0000 then #if 0 SKIP_cc = BRA+1 :cc #endif // OPCODE: return from procedure // drop top rstack value // and resume with next OPCODE in ram: // :RDROP_RET ( -- ) 0:$1B89 0:000011:A2=A2:D7=D1 popr dtmp RET: ( -- ) // 2010-05-11 0:$1B8A 0:000011:A2=A2:D7=D1 popr ip // dtmp 0:$1B8B 0:000011:A0=A1:D3=D7 0:$1B8C 0:000011:A0=A0:D0=D1 next_op 0:$1B8D d15:data:reset=0:$0000 // =================================================================== // stack manipulation: // =================================================================== // 2010-05-11 :DUP ( i16 -- i16 i16 ) 0:$1A91 0:000011:A5=A5:D3=DC psh alu 0:$1A92 0:000011:A1=A5:D1=D8 0:$1A93 0:000011:A0=A0:D0=D1 next_op // post 0:$1A94 d15:data:reset=0:$0000 // 2010-05-11 //:NIP ( i16:a i16:b -- i16:b ) // pop dtmp // next_op // post // 2010-05-11 :SWAP ( i16:a i16:b -- i16:b i16:a ) 0:$1B16 0:000011:A1=A5:D7=D1 ld dtmp,(hp) 0:$1B17 0:000011:A1=A5:D1=D8 ld (hp),alu 0:$1B18 0:000011:A1=A5:D8=D7 ld alu,dtmp 0:$1B19 0:000011:A0=A0:D0=D1 next_op // post 0:$1B1A d15:data:reset=0:$0000 // 2010-05-11 :OVER ( i16:a i16:b -- i16:a i16:b i16:a ) 0:$1B1B 0:000011:A5=A5:D7=D1 ld dtmp,(hp++) // a 0:$1B1C 0:000011:A1=A5:D1=D8 ld (hp),alu // b 0:$1B1D 0:000011:A1=A5:D8=D7 ld alu,dtmp // a 0:$1B1E 0:000011:A0=A0:D0=D1 next_op // post 0:$1B1F d15:data:reset=0:$0000 // 2010-05-11 :PEEK ( a16 -- i16 ) 0:$1A9D 0:000011:A6=A1:D3=D8 ld atmp,alu 0:$1A9E 0:000011:A1=A6:D8=D1 ld alu,(atmp) 0:$1A9F 0:000011:A0=A0:D0=D1 next_op // post 0:$1AA0 d15:data:reset=0:$0000 // 2010-05-11 :POKE ( i16 a16 -- ) 0:$1C7E 0:000011:A6=A1:D3=D8 ld atmp,alu 0:$1C7F 0:010011:A5=A5:D7=D1 pop (atmp) // dtmp 0:$1C80 0:000011:A1=A6:D1=D7 0:$1C81 0:010011:A5=A5:D8=D1 pop alu 0:$1C82 0:000011:A0=A0:D0=D1 next_op // post 0:$1C83 d15:data:reset=0:$0000 // bytecode_18 = pick ( n? i -- n? n(i) ) with n(0) = i // 2010-05-11 //:PICK ( ? n2 n1 i -- ? n2 n1 ni ) // psh alu // hp -> i // cpl // alu = -1-i // add_c hp // alu = hp+1-1-i = hp-i // ld atmp,alu // ld alu,(atmp) // next_op // post // bytecode_24 = peek++ ( a:i16 -- n ) peek byte/word with post increment // 2010-05-11 :PEEKPP ( a16 -- i16 ) // peek and increment variable 0:$1DA0 0:000011:A1=A7:DF=D8 ld d2ar,alu // d2ar -> var 0:$1DA1 0:000011:A1=A7:D8=D1 ld alu,(d2ar) // alu = n 0:$1DA2 0:000011:A6=A1:D3=D8 ld atmp,alu // atmp = n 0:$1DA3 0:000011:A6=A6:D3=D8 inc atmp // atmp = n+1 0:$1DA4 0:000011:A1=A6:D7=D3 ld (d2ar),atmp // (var) = n+1 dtmp 0:$1DA5 0:000011:A1=A7:D1=D7 0:$1DA6 0:000011:A0=A0:D0=D1 next_op // post 0:$1DA7 d15:data:reset=0:$0000 :PEEKMM ( a16 -- i16 ) 0:$2506 0:000011:A1=A0:DF=D8 ld d2ar,alu // d2ar -> var 0:$2507 0:000011:A1=A7:D8=D1 ld alu,(d2ar) // alu = n 0:$2508 0:000011:A6=A1:D3=D8 ld atmp,alu // atmp = n 0:$2509 0:010011:A6=A6:D3=D8 dec atmp // atmp = n-1 0:$250A 0:000011:A1=A6:D7=D3 ld (d2ar),atmp // (var) = n-1 dtmp 0:$250B 0:000011:A1=A7:D1=D7 0:$250C 0:000011:A0=A0:D0=D1 next_op // post 0:$250D d15:data:reset=0:$0000 :PPPEEK ( a16 -- i16 ) #if 0 ld d2ar,alu // d2ar -> var ld alu,(d2ar) // alu = n ld atmp,alu // atmp = n inc atmp // atmp = n+1 ld alu,atmp // alu = n+1 ld (d2ar),alu // (var) = n+1 next_op // post #else 0:$1CBA 0:000011:A1=A5:DF=D8 ld d2ar,alu // d2ar -> var 0:$1CBB 0:000001:A1=A5:D8=D8 xor alu 0:$1CBC 0:000100:A1=A7:D3=D1 add_c (d2ar) 0:$1CBD 0:000100:A1=A7:D8=D1 0:$1CBE 0:000011:A1=A7:D1=D8 ld (d2ar),alu 0:$1CBF 0:000011:A0=A0:D0=D1 next_op // post 0:$1CC0 d15:data:reset=0:$0000 #endif :MMPEEK ( a16 -- i16 ) 0:$1DE0 0:000011:A1=A0:DF=D8 ld d2ar,alu // d2ar -> var 0:$1DE1 0:000011:A1=A7:D8=D1 ld alu,(d2ar) // alu = n 0:$1DE2 0:000011:A6=A1:D3=D8 ld atmp,alu // atmp = n 0:$1DE3 0:010011:A6=A6:D3=D8 dec atmp // atmp = n-1 0:$1DE4 0:000011:A1=A6:D8=D3 ld alu,atmp // alu = n-1 0:$1DE5 0:000011:A1=A7:D1=D8 ld (d2ar),alu // (var) = n-1 0:$1DE6 0:000011:A0=A0:D0=D1 next_op // post 0:$1DE7 d15:data:reset=0:$0000 // ================================================ // push immediate numeric value // ================================================ // 2010-05-11 :IVAL ( -- i16 ) // load immediate value // psh alu // ld alu,(ip++) // next_op 0:$1AFB 0:000011:A5=A5:D7=D8 ld dtmp,alu , hp.oe,hp.clk,add1 // and ++hp 0:$1AFC 0:000011:A0=A0:D8=D1 ld alu,(ip++) 0:$1AFD 0:000011:A1=A5:D1=D7 ld (hp),dtmp 0:$1AFE 0:000011:A0=A0:D0=D1 next_op // post 0:$1AFF d15:data:reset=0:$0000 // 2010-05-11 :LDQ % $100 ( -- i8 ) // LD n // psh alu // ld alu,cmd_lo // next_op 1:$2400 1:000011:A5=A5:D7=D8 ld dtmp,alu , hp.oe,hp.clk,add1 // and ++hp 1:$2401 1:000011:A1=A5:D8=DF ld alu,cmd_lo 1:$2402 1:000011:A1=A5:D1=D7 ld (hp),dtmp 1:$2403 1:000011:A0=A0:D0=D1 next_op // post 1:$2404 d15:data:reset=0:$0000 // 2010-05-11 :LDNQ % $100 ( -- i8 ) // LD ~n (-1-n) load quick negative number (-1...-256) // psh alu // ldn cmd_lo // next_op 1:$0C00 1:000011:A5=A5:D7=D8 ld dtmp,alu , hp.oe,hp.clk,add1 // and ++hp 1:$0C01 1:001011:A1=A5:D8=DF ldn cmd_lo 1:$0C02 1:000011:A1=A5:D1=D7 ld (hp),dtmp 1:$0C03 1:000011:A0=A0:D0=D1 next_op // post 1:$0C04 d15:data:reset=0:$0000 // ============================================================ // local variables: // ============================================================ // index is: ... n[254] n[255] top[256] // the TOP value cannot be picked with LVAR! ((=> use DUP)) // 2010-05-11 :LVAR % $100 ( -- a16 ) // address of local variable: HP-dis 0:$2400 0:000011:A5=A5:D3=D8 psh alu 0:$2401 0:000011:A1=A5:D1=D8 0:$2402 0:110011:A6=A5:D3=D8 ld atmp,hp-dis 0:$2403 0:000011:A1=A6:D8=D3 ld alu,atmp 0:$2404 0:000011:A0=A0:D0=D1 next_op // post 0:$2405 d15:data:reset=0:$0000 // 2010-05-11 :LGET % $100 ( -- i16 ) // get local var data 0:$1F00 0:000011:A5=A5:D3=DD psh alu 0:$1F01 0:000011:A1=A5:D1=D8 0:$1F02 0:110011:A6=A5:D3=D8 ld atmp,hp-dis 0:$1F03 0:000011:A1=A6:D8=D1 ld alu,(atmp) 0:$1F04 0:000011:A0=A0:D0=D1 next_op // post 0:$1F05 d15:data:reset=0:$0000 // index is: ... n[254] n[255] n[256] data[257] // the TOP value cannot be stored with LPOKE! ((=> used NIP)) // // 2010-05-11 :LSET % $100 ( i16:data -- ) // store data in local var 1:$2300 1:110011:A6=A5:D3=DF ld atmp,hp-dis 1:$2301 1:000011:A1=A6:D1=D8 ld (atmp),alu 1:$2302 1:010011:A5=A5:D8=D1 pop alu 1:$2303 1:000011:A0=A0:D0=D1 next_op // post 1:$2304 d15:data:reset=0:$0000 :PSH_HP ( -- i16* ) 0:$1AF6 0:000011:A5=A5:D3=D8 psh alu 0:$1AF7 0:000011:A1=A5:D1=D8 0:$1AF8 0:000011:A1=A5:D8=D3 ld alu,hp 0:$1AF9 0:000011:A0=A0:D0=D1 next_op // post 0:$1AFA d15:data:reset=0:$0000 // ============================================================ // global 'zero page' variables: // ============================================================ :GGET % $100 ( -- i16 ) // get global var data 1:$0B00 1:000011:A5=A5:D3=DF psh alu 1:$0B01 1:000011:A1=A5:D1=D8 1:$0B02 1:000011:A6=A1:D3=DF ld atmp,cmd_lo 1:$0B03 1:000011:A1=A6:D8=D1 ld alu,(atmp) 1:$0B04 1:000011:A0=A0:D0=D1 next_op // post 1:$0B05 d15:data:reset=0:$0000 :GSET % $100 ( i16:data -- ) // store data in global var 1:$2200 1:000011:A6=A1:D3=DF ld atmp,cmd_lo 1:$2201 1:000011:A1=A6:D1=D8 ld (atmp),alu 1:$2202 1:010011:A5=A5:D8=D1 pop alu 1:$2203 1:000011:A0=A0:D0=D1 next_op // post 1:$2204 d15:data:reset=0:$0000 GVAR := LDQ ( -- i16* ) // ================================================ // struct items // ================================================ :IVAR % $100 ( T{}¢ -- T& ) 0:$2100 0:000011:A6=A1:D3=D8 ld atmp,alu // atmp = handle 0:$2101 0:000011:A1=A6:DF=D1 ld d2ar,(atmp) // d2ar = ptr -> data.len 0:$2102 0:100011:A6=A7:D3=D8 ld atmp,d2ar+dis // atmp -> item-1 0:$2103 0:000011:A6=A6:D3=D8 inc atmp // atmp -> item 0:$2104 0:000011:A1=A6:D8=D3 ld alu,atmp 0:$2105 0:000011:A0=A0:D0=D1 next_op 0:$2106 d15:data:reset=0:$0000 :IGET % $100 ( T{}¢ -- int16 ) 0:$1B00 0:000011:A6=A1:D3=D8 ld atmp,alu // atmp = handle 0:$1B01 0:000011:A1=A6:DF=D1 ld d2ar,(atmp) // d2ar = ptr -> data.len 0:$1B02 0:100011:A6=A7:D3=D8 ld atmp,d2ar+dis // atmp -> item-1 0:$1B03 0:000011:A6=A6:D3=D8 inc atmp // atmp -> item 0:$1B04 0:000011:A1=A6:D8=D1 ld alu,(atmp) 0:$1B05 0:000011:A0=A0:D0=D1 next_op 0:$1B06 d15:data:reset=0:$0000 :ISET % $100 ( int16 T{}¢ -- ) 1:$1E00 1:000011:A6=A1:D3=D8 ld atmp,alu // atmp = handle 1:$1E01 1:000011:A1=A6:DF=D1 ld d2ar,(atmp) // d2ar = ptr -> data.len 1:$1E02 1:100011:A6=A7:D3=D8 ld atmp,d2ar+dis // atmp -> item-1 1:$1E03 1:000011:A6=A6:D3=D8 inc atmp // atmp -> item 1:$1E04 1:010011:A5=A5:D7=D1 pop (atmp),alu // dtmp 1:$1E05 1:000011:A1=A6:D1=D7 1:$1E06 1:010011:A5=A5:D8=D1 1:$1E07 1:000011:A0=A0:D0=D1 next_op 1:$1E08 d15:data:reset=0:$0000 // ================================================ // 16 bit Arithmetics // ================================================ :CASTwl2b ( uint16 -- uint8 ) 0:$1AD9 0:000010:A1=A0:D8=D0 and $00ff 0:$1ADA 0:data:reset=0:$00FF 0:$1ADB 0:000011:A0=A0:D0=D1 next_op 0:$1ADC d15:data:reset=0:$0000 :CASTwh2b ( uint16 -- uint8 ) 0:$1C3C 0:000011:A1=A3:DA=D8 ld swap,alu 0:$1C3D 0:000011:A1=A3:D8=D0 ld alu,$00ff 0:$1C3E 0:data:reset=0:$00FF 0:$1C3F 0:000010:A1=A0:D8=DA and swap 0:$1C40 0:000011:A0=A0:D0=D1 next_op 0:$1C41 d15:data:reset=0:$0000 :SWAPBYTES ( i16 -- i16 ) 0:$1AD5 0:000011:A1=A0:DA=D8 ld swap,alu 0:$1AD6 0:000011:A1=A0:D8=DA ld alu,swap 0:$1AD7 0:000011:A0=A0:D0=D1 next_op 0:$1AD8 d15:data:reset=0:$0000 // 16 bit immediate: // 2010-05-11 :SUBI ( i16 -- i16 ) // top -= nn 0:$1A5D 0:001100:A1=A0:D3=D1 sub (ip++) 0:$1A5E 0:001100:A0=A0:D8=D1 0:$1A5F 0:000011:A0=A0:D0=D1 next_op 0:$1A60 d15:data:reset=0:$0000 // 2010-05-11 :ADDI ( i16 -- i16 ) // top += nn 0:$1ADD 0:000000:A1=A0:D3=D1 add (ip++) 0:$1ADE 0:000000:A0=A0:D8=D1 0:$1ADF 0:000011:A0=A0:D0=D1 next_op 0:$1AE0 d15:data:reset=0:$0000 // 2010-05-11 :ANDI ( i16 -- i16 ) // top &= nn 0:$19FA 0:000010:A0=A0:D8=D1 and (ip++) 0:$19FB 0:000011:A0=A0:D0=D1 next_op 0:$19FC d15:data:reset=0:$0000 // 2010-05-11 :ORI ( i16 -- i16 ) // top |= nn 0:$19F1 0:000110:A0=A0:D8=D1 or (ip++) 0:$19F2 0:000011:A0=A0:D0=D1 next_op 0:$19F3 d15:data:reset=0:$0000 // 2010-05-11 :XORI ( i16 -- i16 ) // top ^= nn 0:$1A1E 0:000001:A0=A0:D8=D1 xor (ip++) 0:$1A1F 0:000011:A0=A0:D0=D1 next_op 0:$1A20 d15:data:reset=0:$0000 :MULI ( i16 -- i16 ) 0:$1B07 0:000011:A5=A5:D3=D8 psh alu 0:$1B08 0:000011:A1=A5:D1=D8 0:$1B09 0:000011:A0=A0:D8=D1 ld alu,(ip++) 0:$1B0A 0:000011:A1=A0:D0=D0 jp MUL 0:$1B0B d15:data:reset=0:$529D :DIVI ( i16 -- i16 ) 0:$1BBB 0:000011:A5=A5:D3=DC psh alu 0:$1BBC 0:000011:A1=A5:D1=D8 0:$1BBD 0:000011:A0=A0:D8=D1 ld alu,(ip++) 0:$1BBE 0:000011:A1=A0:D0=D0 jp DIV 0:$1BBF d15:data:reset=0:$5319 :REMI ( i16 -- i16 ) 0:$1B11 0:000011:A5=A5:D3=D8 psh alu 0:$1B12 0:000011:A1=A5:D1=D8 0:$1B13 0:000011:A0=A0:D8=D1 ld alu,(ip++) 0:$1B14 0:000011:A1=A0:D0=D0 jp REM 0:$1B15 d15:data:reset=0:$527F :MULUI ( i16 -- i16 ) // unsigned multiply with immediate value 0:$1B34 0:000011:A5=A5:D3=D8 psh alu 0:$1B35 0:000011:A1=A5:D1=D8 0:$1B36 0:000011:A0=A0:D8=D1 ld alu,(ip++) 0:$1B37 0:000011:A1=A0:D0=D0 jp MULU 0:$1B38 d15:data:reset=0:$C405 :DIVUI ( i16 -- i16 ) // unsigned divide by immediate value 0:$1BB1 0:000011:A5=A5:D3=D8 psh alu 0:$1BB2 0:000011:A1=A5:D1=D8 0:$1BB3 0:000011:A0=A0:D8=D1 ld alu,(ip++) 0:$1BB4 0:000011:A1=A0:D0=D0 jp DIVU 0:$1BB5 d15:data:reset=0:$C1B4 :REMUI ( i16 -- i16 ) // unsigned remainder with immediate value 0:$1B3E 0:000011:A5=A5:D3=D8 psh alu 0:$1B3F 0:000011:A1=A5:D1=D8 0:$1B40 0:000011:A0=A0:D8=D1 ld alu,(ip++) 0:$1B41 0:000011:A1=A0:D0=D0 jp REMU 0:$1B42 d15:data:reset=0:$5A25 :SRUI TODO 0:$1A31 0:000011:A6=A1:D3=D0 ld atmp,$ // * TODO 0:$1A32 0:data:reset=0:$5A31 0:$1A33 0:000011:A1=A2:D0=D0 jp TODO // * TODO 0:$1A34 d15:data:reset=0:$697C :UGEI ( a -- f ) // cmd.lo = b TODO 0:$1A81 0:000011:A6=A1:D3=D0 ld atmp,$ // * TODO 0:$1A82 0:data:reset=0:$5A81 0:$1A83 0:000011:A1=A2:D0=D0 jp TODO // * TODO 0:$1A84 d15:data:reset=0:$697C :EQI ( a -- f ) // cmd.lo = b TODO 0:$1A39 0:000011:A6=A1:D3=D0 ld atmp,$ // * TODO 0:$1A3A 0:data:reset=0:$5A39 0:$1A3B 0:000011:A1=A2:D0=D0 jp TODO // * TODO 0:$1A3C d15:data:reset=0:$697C :NEI ( a -- f ) // cmd.lo = b TODO 0:$1A49 0:000011:A6=A1:D3=D0 ld atmp,$ // * TODO 0:$1A4A 0:data:reset=0:$5A49 0:$1A4B 0:000011:A1=A2:D0=D0 jp TODO // * TODO 0:$1A4C d15:data:reset=0:$697C :UGTI ( a -- f ) // cmd.lo = b TODO 0:$1A85 0:000011:A6=A1:D3=D0 ld atmp,$ // * TODO 0:$1A86 0:data:reset=0:$5A85 0:$1A87 0:000011:A1=A2:D0=D0 jp TODO // * TODO 0:$1A88 d15:data:reset=0:$697C :ULEI ( a -- f ) // cmd.lo = b TODO 0:$1A4D 0:000011:A6=A1:D3=D0 ld atmp,$ // * TODO 0:$1A4E 0:data:reset=0:$5A4D 0:$1A4F 0:000011:A1=A2:D0=D0 jp TODO // * TODO 0:$1A50 d15:data:reset=0:$697C :ULTI ( a -- f ) // cmd.lo = b TODO 0:$1A45 0:000011:A6=A1:D3=D0 ld atmp,$ // * TODO 0:$1A46 0:data:reset=0:$5A45 0:$1A47 0:000011:A1=A2:D0=D0 jp TODO // * TODO 0:$1A48 d15:data:reset=0:$697C // 8 bit immediate quick: // 2010-05-11 :ADDQ % $100 ( i16 -- i16 ) // ADD n 1:$1500 1:000000:A1=A7:D3=DF add cmd_lo 1:$1501 1:000000:A1=A7:D8=DF 1:$1502 1:000011:A0=A0:D0=D1 next_op 1:$1503 d15:data:reset=0:$0000 // 2010-05-11 :SUBQ % $100 ( i16 -- i16 ) // SUB n 0:$1E00 0:001100:A1=A2:D3=DF sub cmd_lo 0:$1E01 0:001100:A1=A2:D8=DF 0:$1E02 0:000011:A0=A0:D0=D1 next_op 0:$1E03 d15:data:reset=0:$0000 // 2010-05-11 :ANDQ % $100 ( i16 -- i16 ) // AND n 1:$0900 1:000010:A1=A7:D8=DF and cmd_lo 1:$0901 1:000011:A0=A0:D0=D1 next_op 1:$0902 d15:data:reset=0:$0000 // 2010-05-11 :ORQ % $100 ( i16 -- i16 ) // OR n 1:$1100 1:000110:A1=A7:D8=DF or cmd_lo 1:$1101 1:000011:A0=A0:D0=D1 next_op 1:$1102 d15:data:reset=0:$0000 // 2010-05-11 :XORQ % $100 ( i16 -- i16 ) // XOR n 1:$0A00 1:000001:A1=A7:D8=DF xor cmd_lo 1:$0A01 1:000011:A0=A0:D0=D1 next_op 1:$0A02 d15:data:reset=0:$0000 :UGEQ % $100 ( a -- f ) // cmd.lo = b TODO 0:$1A00 0:000011:A6=A1:D3=D0 ld atmp,$ // * TODO 0:$1A01 0:data:reset=0:$1A00 0:$1A02 0:000011:A1=A2:D0=D0 jp TODO // * TODO 0:$1A03 d15:data:reset=0:$697C :EQQ % $100 ( a -- f ) // cmd.lo = b 0:$1200 0:001100:A1=A7:D3=DF cmp cmd_lo 0:$1201 0:001100:A1=A7:D3=DF return z,1 0:$1202 z:000001:A1=A7:D8=D8 xor alu :z // * return if 1 // * return 1:$1203 1:000100:A1=A7:D8=D8 add_c alu // nodelay // * return 1:$1204 1:000011:A0=A0:D0=D1 next_op // post // * return 1:$1205 d15:data:reset=0:$0000 else // * return 0:$1203 0:000011:A0=A0:D0=D1 next_op // * return 0:$1204 d15:data:reset=0:$0000 then // * return :NEQ % $100 ( a -- f ) // cmd.lo = b TODO 1:$0100 1:000011:A6=A1:D3=D0 ld atmp,$ // * TODO 1:$0101 1:data:reset=0:$8100 1:$0102 1:000011:A1=A1:D0=D0 jp TODO // * TODO 1:$0103 d15:data:reset=0:$697C :UGTQ % $100 ( a -- f ) // cmd.lo = b TODO 1:$0800 1:000011:A6=A1:D3=D0 ld atmp,$ // * TODO 1:$0801 1:data:reset=0:$8800 1:$0802 1:000011:A1=A0:D0=D0 jp TODO // * TODO 1:$0803 d15:data:reset=0:$697C :ULEQ % $100 ( a -- f ) // cmd.lo = b TODO 0:$1500 0:000011:A6=A1:D3=D0 ld atmp,$ // * TODO 0:$1501 0:data:reset=0:$1500 0:$1502 0:000011:A1=A5:D0=D0 jp TODO // * TODO 0:$1503 d15:data:reset=0:$697C :ULTQ % $100 ( a -- f ) // cmd.lo = b 0:$1100 0:001100:A1=A7:D3=DF cmp cmd_lo // a-b 0:$1101 0:001100:A1=A7:D3=DF 0:$1102 cy:000011:A1=A7:D8=D0 ld alu,ival :cy if 0 0:$1103 0:data:reset=0:$0001 dw 1 // !cy => cy => a-b<0 => b-a>0 => b>a => (a>=b) = true else 1:$1103 0:data:reset=0:$0000 dw 0 // false then // cond 0:$1104 0:000011:A0=A0:D0=D1 next_op 0:$1105 d15:data:reset=0:$0000 // ld cmd,(ip++) :cy // if 0 // xorn alu :bit15 // !cy => cy => a-b<0 => b-a>0 => b>a => (a>=b) = true // else // xor alu :bit15 // false // then // cond :MULQ % $100 ( a -- f ) // cmd.lo = b TODO 0:$1900 0:000011:A6=A1:D3=D0 ld atmp,$ // * TODO 0:$1901 0:data:reset=0:$1900 0:$1902 0:000011:A1=A1:D0=D0 jp TODO // * TODO 0:$1903 d15:data:reset=0:$697C :DIVQ % $100 ( a -- f ) // cmd.lo = b TODO 1:$1800 1:000011:A6=A1:D3=D0 ld atmp,$ // * TODO 1:$1801 1:data:reset=0:$9800 1:$1802 1:000011:A1=A0:D0=D0 jp TODO // * TODO 1:$1803 d15:data:reset=0:$697C :REMQ % $100 ( a -- f ) // cmd.lo = b TODO 1:$1A00 1:000011:A6=A1:D3=D0 ld atmp,$ // * TODO 1:$1A01 1:data:reset=0:$9A00 1:$1A02 1:000011:A1=A2:D0=D0 jp TODO // * TODO 1:$1A03 d15:data:reset=0:$697C :MULUQ % $100 ( a -- f ) // cmd.lo = b TODO 1:$1700 1:000011:A6=A1:D3=D0 ld atmp,$ // * TODO 1:$1701 1:data:reset=0:$9700 1:$1702 1:000011:A1=A7:D0=D0 jp TODO // * TODO 1:$1703 d15:data:reset=0:$697C :DIVUQ % $100 ( a -- f ) // cmd.lo = b 1:$1B00 1:000011:A5=A5:D3=DF psh alu 1:$1B01 1:000011:A1=A5:D1=D8 1:$1B02 1:000011:A1=A5:D8=DF ld alu,cmd_lo 1:$1B03 1:000011:A1=A5:D0=D0 jp DIVU 1:$1B04 d15:data:reset=0:$C1B4 :REMUQ % $100 ( a -- f ) // cmd.lo = b TODO 1:$1600 1:000011:A6=A1:D3=D0 ld atmp,$ // * TODO 1:$1601 1:data:reset=0:$9600 1:$1602 1:000011:A1=A6:D0=D0 jp TODO // * TODO 1:$1603 d15:data:reset=0:$697C // non consts: // 2010-05-11 :ADD ( i16 i16 -- i16 ) 0:$1AED 0:010000:A1=A5:D3=D1 add (hp--) 0:$1AEE 0:010000:A5=A5:D8=D1 0:$1AEF 0:000011:A0=A0:D0=D1 next_op 0:$1AF0 d15:data:reset=0:$0000 // 2010-05-11 :SUB ( i16:x i16:y -- i16 ) // x-y = -1-(y-x-1) 0:$1BD9 0:011000:A1=A5:D3=D1 sub_nc (hp--) 0:$1BDA 0:011000:A5=A5:D8=D1 0:$1BDB 0:001011:A1=A5:D8=D8 cpl 0:$1BDC 0:000011:A0=A0:D0=D1 next_op // post 0:$1BDD d15:data:reset=0:$0000 // 2010-05-11 :AND ( i16 i16 -- i16 ) 0:$19CD 0:010010:A5=A5:D8=D1 and (hp--) 0:$19CE 0:000011:A0=A0:D0=D1 next_op // post 0:$19CF d15:data:reset=0:$0000 // 2010-05-11 :OR ( i16 i16 -- i16 ) 0:$1A18 0:010110:A5=A5:D8=D1 or (hp--) 0:$1A19 0:000011:A0=A0:D0=D1 next_op // post 0:$1A1A d15:data:reset=0:$0000 // 2010-05-11 :XOR ( i16 i16 -- i16 ) 0:$19D0 0:010001:A5=A5:D8=D1 xor (hp--) 0:$19D1 0:000011:A0=A0:D0=D1 next_op // post 0:$19D2 d15:data:reset=0:$0000 :EQ( i16 i16 -- i1 ) 0:$132E 0:000001:A1=A5:D3=D1 equ (hp) // delay 0:$132F 0:010001:A5=A5:D3=D1 equ (hp--) return z,1 0:$1330 z:000001:A1=A5:D8=D8 xor alu :z // * return if 1 // * return 1:$1331 1:000100:A1=A7:D8=D8 add_c alu // nodelay // * return 1:$1332 1:000011:A0=A0:D0=D1 next_op // post // * return 1:$1333 d15:data:reset=0:$0000 else // * return 0:$1331 0:000011:A0=A0:D0=D1 next_op // * return 0:$1332 d15:data:reset=0:$0000 then // * return :NE( i16 i16 -- i1 ) 0:$133A 0:000001:A1=A5:D3=D1 equ (hp) // delay 0:$133B 0:010001:A5=A5:D3=D1 equ (hp--) return z,0 0:$133C z:000001:A1=A5:D8=D8 xor alu :z // * return if 0 // * return 0:$133D 0:000100:A1=A5:D8=D8 add_c alu // nodelay // * return 0:$133E 0:000011:A0=A0:D0=D1 next_op // post // * return 0:$133F d15:data:reset=0:$0000 else // * return 1:$133D 1:000011:A0=A0:D0=D1 next_op // * return 1:$133E d15:data:reset=0:$0000 then // * return :UNSIGNED_COMPARES if 1 UGT: ( u16:a u16:b -- i1 ) 1:$1334 1:011100:A1=A5:D3=D1 cmp (hp--) // b-a 1:$1335 0:011100:A5=A5:D3=D1 else UGE: ( u16:a u16:b -- i1 ) 0:$1334 0:011000:A1=A5:D3=D1 cmp_nc (hp--) // b-a-1 0:$1335 0:011000:A5=A5:D3=D1 then return cy,0 // !cy => cy => b-a<0 => a>b | a?b 0:$1336 cy:000001:A1=A5:D8=D8 xor alu :cy // * return if 0 // * return 0:$1337 0:000100:A1=A5:D8=D8 add_c alu // nodelay // * return 0:$1338 0:000011:A0=A0:D0=D1 next_op // post // * return 0:$1339 d15:data:reset=0:$0000 else // * return 1:$1337 1:000011:A0=A0:D0=D1 next_op // * return 1:$1338 d15:data:reset=0:$0000 then // * return :UNSIGNED_COMPARES2 if 1 ULE: ( u16:a u16:b -- i1 ) // unsigned less or equal 1:$1340 1:011100:A1=A5:D3=D1 cmp (hp--) // b-a 1:$1341 0:011100:A5=A5:D3=D1 else ULT: ( u16:a u16:b -- i1 ) // unsigned less than 0:$1340 0:011000:A1=A5:D3=D1 cmp_nc (hp--) // b-a-1 0:$1341 0:011000:A5=A5:D3=D1 then return cy,1 // cy => !cy => b?a | b>a 0:$1342 cy:000001:A1=A5:D8=D8 xor alu :cy // * return if 1 // * return 1:$1343 1:000100:A1=A7:D8=D8 add_c alu // nodelay // * return 1:$1344 1:000011:A0=A0:D0=D1 next_op // post // * return 1:$1345 d15:data:reset=0:$0000 else // * return 0:$1343 0:000011:A0=A0:D0=D1 next_op // * return 0:$1344 d15:data:reset=0:$0000 then // * return :SIGNED_COMPARES if 1 GT: ( i16:a i16:b -- i1 ) // signed greater than 1:$12A4 1:010011:A5=A5:D7=D1 ld dtmp,(hp--) 1:$12A5 1:001100:A1=A5:D3=D7 OGT: sub dtmp // b-a 1:$12A6 0:001100:A1=A5:D8=D7 else GE: ( i16:a i16:a -- i1 ) // signed greater or equal 0:$12A4 0:010011:A5=A5:D7=D1 ld dtmp,(hp--) 0:$12A5 0:001000:A1=A5:D3=D7 OGE: sub_nc dtmp // b-a-1 0:$12A6 0:001000:A1=A5:D8=D7 then 0:$12A7 ovf:data:reset=0:$0000 if !ovfl // !ovfl: signed result b-a is valid 1:$12A8 1:000011:A1=A7:D0=D0 1:$12A9 d15:data:reset=0:$52AC 0:$12A8 0:000011:A1=A0:D3=D8 tst alu // b-a return bit15,1 // b-a<0 => b a>b 0:$12A9 d15:000001:A1=A0:D8=D8 xor alu :bit15 // * return if 1 // * return 1:$12AA 1:000100:A1=A2:D8=D8 add_c alu // nodelay // * return 1:$12AB 1:000011:A0=A0:D0=D1 next_op // post // * return 1:$12AC d15:data:reset=0:$0000 else // * return 0:$12AA 0:000011:A0=A0:D0=D1 next_op // * return 0:$12AB d15:data:reset=0:$0000 then // * return else // ovfl: implies: sign(a) != sign(b) 0:$12AC 1:000011:A1=A0:D3=D7 tst dtmp // a return bit15,0 // a?0 => b<0 => a>b 1:$12AD d15:000001:A1=A0:D8=D8 xor alu :bit15 // * return if 0 // * return 0:$12AE 0:000100:A1=A7:D8=D8 add_c alu // nodelay // * return 0:$12AF 0:000011:A0=A0:D0=D1 next_op // post // * return 0:$12B0 d15:data:reset=0:$0000 else // * return 1:$12AE 1:000011:A0=A0:D0=D1 next_op // * return 1:$12AF d15:data:reset=0:$0000 then // * return then :SIGNED_COMPARES2 if 1 LT: ( i16:a i16:b -- i1 ) // signed less than 1:$12BE 1:010011:A5=A5:D7=D1 ld dtmp,(hp--) 1:$12BF 1:001000:A1=A5:D3=D7 OLT: sub_nc dtmp // b-a-1 1:$12C0 0:001000:A1=A5:D8=D7 else LE: ( i16:a i16:a -- i1 ) // signed less or equal 0:$12BE 0:010011:A5=A5:D7=D1 ld dtmp,(hp--) 0:$12BF 0:001100:A1=A5:D3=D7 OLE: sub dtmp // b-a 0:$12C0 0:001100:A1=A5:D8=D7 then 0:$12C1 ovf:data:reset=0:$0000 if !ovfl // !ovfl: signed result b-a is valid 1:$12C2 1:000011:A1=A7:D0=D0 1:$12C3 d15:data:reset=0:$D2C6 0:$12C2 0:000011:A1=A0:D3=D8 tst alu // b-a return bit15,0 // b-a?0 => b?a => a?b 0:$12C3 d15:000001:A1=A0:D8=D8 xor alu :bit15 // * return if 0 // * return 0:$12C4 0:000100:A1=A0:D8=D8 add_c alu // nodelay // * return 0:$12C5 0:000011:A0=A0:D0=D1 next_op // post // * return 0:$12C6 d15:data:reset=0:$0000 else // * return 1:$12C4 1:000011:A0=A0:D0=D1 next_op // * return 1:$12C5 d15:data:reset=0:$0000 then // * return else // ovfl: implies: sign(a) != sign(b) 1:$12C6 1:000011:A1=A0:D3=D7 tst dtmp // a return bit15,1 // a<0 => b?0 => a?b 1:$12C7 d15:000001:A1=A0:D8=D8 xor alu :bit15 // * return if 1 // * return 1:$12C8 1:000100:A1=A0:D8=D8 add_c alu // nodelay // * return 1:$12C9 1:000011:A0=A0:D0=D1 next_op // post // * return 1:$12CA d15:data:reset=0:$0000 else // * return 0:$12C8 0:000011:A0=A0:D0=D1 next_op // * return 0:$12C9 d15:data:reset=0:$0000 then // * return then // 2010-05-11 :UMAX ( u16:a u16:b -- u16 ) // unsigned maximum 0:$1345 0:001100:A1=A5:D3=D1 cmp (hp) // b-a 0:$1346 0:001100:A1=A5:D3=D1 0:$1347 cy:data:reset=0:$0000 if !cy // !cy => cy => b-a<0 => b a>b => max(a,b) = a 0:$1348 0:010011:A5=A5:D8=D1 pop alu // a 0:$1349 0:000011:A0=A0:D0=D1 next_op // post 0:$134A d15:data:reset=0:$0000 else 1:$1348 1:010011:A5=A5:D7=D1 pop dtmp 1:$1349 1:000011:A0=A0:D0=D1 next_op // post 1:$134A d15:data:reset=0:$0000 then // 2010-05-11 :UMIN ( u16 u16 -- u16 ) // unsigned minimum 0:$1356 0:001100:A1=A5:D3=D1 cmp (hp) 0:$1357 0:001100:A1=A5:D3=D1 0:$1358 cy:data:reset=0:$0000 if cy // cy => !cy => b-a?0 => b?a => a?b => min(a,b) = a 1:$1359 1:010011:A5=A5:D8=D1 pop alu // a 1:$135A 1:000011:A0=A0:D0=D1 next_op // post 1:$135B d15:data:reset=0:$0000 else 0:$1359 0:010011:A5=A5:D7=D1 pop dtmp 0:$135A 0:000011:A0=A0:D0=D1 next_op // post 0:$135B d15:data:reset=0:$0000 then // 2010-05-12 :MAX ( i16:a i16:b -- i1 ) // signed maximum 0:$12F5 0:000011:A1=A0:D6=D8 ld d2,alu // d2 = b 0:$12F6 0:010011:A5=A5:D7=D1 ld dtmp,(hp--) // d3 = a 0:$12F7 0:001100:A1=A5:D3=D7 sub dtmp // alu= b-a 0:$12F8 0:001100:A1=A5:D8=D7 0:$12F9 ovf:data:reset=0:$0000 if !ovfl // signed result b-a is valid 0:$12FA 0:000011:A1=A0:D3=D8 tst alu // b-a else // ovfl // implies: sign(a) != sign(b) 1:$12FA 0:000011:A1=A7:D3=D6 tst d2 // b then 0:$12FB d15:000011:A0=A0:D0=D1 ld cmd,(ip++) :bit15 if 0 // !ovfl: b-a?0 => b?a => a?b => return b 0:$12FC d15:000011:A1=A0:D8=D6 ld alu,d2 :bit15 // ovfl: b?0 => a<0 => a?b => return b else 1:$12FC d15:000011:A1=A7:D8=D7 ld alu,dtmp :bit15 then // cond // 2010-05-12 :MIN ( i16:a i16:b -- i1 ) // signed minimum 0:$11F6 0:000011:A1=A0:D6=D8 ld d2,alu // d2 = b 0:$11F7 0:010011:A5=A5:D7=D1 ld dtmp,(hp--) // d3 = a 0:$11F8 0:001100:A1=A5:D3=D7 sub dtmp // alu= b-a 0:$11F9 0:001100:A1=A5:D8=D7 0:$11FA ovf:data:reset=0:$0000 if !ovfl // signed result b-a is valid 0:$11FB 0:000011:A1=A0:D3=D8 tst alu // b-a else // ovfl // implies: sign(a) != sign(b) 1:$11FB 0:000011:A1=A7:D3=D6 tst d2 // b then 0:$11FC d15:000011:A0=A0:D0=D1 ld cmd,(ip++) :bit15 if 0 // !ovfl: b-a?0 => b?a => a?b => return a 0:$11FD d15:000011:A1=A0:D8=D7 ld alu,dtmp :bit15 // ovfl: b?0 => a<0 => a?b => return a else 1:$11FD d15:000011:A1=A7:D8=D6 ld alu,d2 :bit15 then // cond // 2010-05-11 :CPL ( i16 -- i16 ) // alu = ~alu 0:$19EE 0:001011:A1=A0:D8=D8 cpl 0:$19EF 0:000011:A0=A0:D0=D1 next_op // post 0:$19F0 d15:data:reset=0:$0000 :DROP_NEG ( int:a b -- int:-a ) 0:$1B7A 0:010011:A5=A5:DF=D1 pop d2ar 0:$1B7B 0:010011:A6=A7:D3=D8 ld atmp,d2ar-1 0:$1B7C 0:000011:A1=A6:D8=D3 ld alu,atmp 0:$1B7D 0:000011:A0=A0:D0=D1 next_op // post 0:$1B7E d15:data:reset=0:$0000 :NIP_NEG ( a int:b -- int:-b ) 0:$1BEE 0:010011:A5=A5:D3=D8 dec hp // nip // jp NEG // 2010-05-11 NEG: ( i16 -- i16 ) // alu = -alu 0:$1BEF 0:000011:A6=A1:D3=D8 neg // atmp 0:$1BF0 0:010011:A6=A6:D3=D8 0:$1BF1 0:001011:A1=A6:D8=D3 0:$1BF2 0:000011:A0=A0:D0=D1 next_op // post 0:$1BF3 d15:data:reset=0:$0000 // 2010-05-11 :BOOL ( i16 -- i1 ) // top = top ? -1 : 0 0:$1365 0:000011:A1=A0:D3=D8 tst alu return z,0 0:$1366 z:000001:A1=A0:D8=D8 xor alu :z // * return if 0 // * return 0:$1367 0:000100:A1=A0:D8=D8 add_c alu // nodelay // * return 0:$1368 0:000011:A0=A0:D0=D1 next_op // post // * return 0:$1369 d15:data:reset=0:$0000 else // * return 1:$1367 1:000011:A0=A0:D0=D1 next_op // * return 1:$1368 d15:data:reset=0:$0000 then // * return // 2010-05-11 :NOT ( i16 -- i1 ) 0:$1361 0:000011:A1=A0:D3=D8 tst alu return z,1 0:$1362 z:000001:A1=A0:D8=D8 xor alu :z // * return if 1 // * return 1:$1363 1:000100:A1=A7:D8=D8 add_c alu // nodelay // * return 1:$1364 1:000011:A0=A0:D0=D1 next_op // post // * return 1:$1365 d15:data:reset=0:$0000 else // * return 0:$1363 0:000011:A0=A0:D0=D1 next_op // * return 0:$1364 d15:data:reset=0:$0000 then // * return // ============================================================ // shift left / right // ============================================================ // 2010-05-11 :SSL ( i16 -- i16 ) // unsigned single shift left: top = top << 1 0:$1AA5 0:000011:A1=A0:DD=D8 ld sl,alu , nc 0:$1AA6 0:000011:A1=A0:D8=DD ld alu,sl 0:$1AA7 0:000011:A0=A0:D0=D1 next_op // post 0:$1AA8 d15:data:reset=0:$0000 // 2010-05-11 :SSR ( i16 -- i16 ) // unsigned single shift right: top = top >> 1 0:$1AB9 0:000011:A1=A0:DC=D8 ld sr,alu , nc 0:$1ABA 0:000011:A1=A0:D8=DC ld alu,sr 0:$1ABB 0:000011:A0=A0:D0=D1 next_op // post 0:$1ABC d15:data:reset=0:$0000 // 2010-05-12 :SL ( i16:n i4:m -- i16 ) // n << m with 0<=m<=15 0:$11A2 0:000010:A1=A5:D8=D0 and $000f // m 0..15 0:$11A3 0:data:reset=0:$000F 0:$11A4 0:001011:A1=A0:D8=D8 cpl // -1-m -1..-16 0:$11A5 0:000000:A1=A0:D7=D0 add SLI0+1 // SLI0+1-1-m = SLI0-m dtmp 0:$11A6 0:data:reset=0:$D1BB 0:$11A7 0:000000:A1=A1:D3=D7 0:$11A8 0:000000:A1=A1:D8=D7 0:$11A9 0:000011:A1=A1:D0=D8 ld cmd,alu // jp SLI0-m 0:$11AA d15:010011:A5=A5:D8=D1 pop alu :bit15 // n // 2010-05-11 if 1 SLI: ( i16 -- i16 ) // shift left immediate: top = top << (15..0) 1:$11AB 1:000000:A1=A7:D8=D8 add alu // a<<15 nodelay 1:$11AC 1:000000:A1=A7:D8=D8 add alu // a<<14 nodelay 1:$11AD 1:000000:A1=A7:D8=D8 add alu // a<<13 nodelay 1:$11AE 1:000000:A1=A7:D8=D8 add alu // a<<12 nodelay 1:$11AF 1:000000:A1=A7:D8=D8 add alu // a<<11 nodelay 1:$11B0 1:000000:A1=A7:D8=D8 add alu // a<<10 nodelay 1:$11B1 1:000000:A1=A7:D8=D8 add alu // a<<9 nodelay 1:$11B2 0:000011:A1=A7:DA=D8 ld swap,alu :0 // a<<8 1:$11B3 1:000000:A1=A7:D8=D8 add alu // a<<7 nodelay 1:$11B4 1:000000:A1=A7:D8=D8 add alu // a<<6 nodelay 1:$11B5 1:000000:A1=A7:D8=D8 add alu // a<<5 nodelay 1:$11B6 1:000000:A1=A7:D8=D8 add alu // a<<4 nodelay 1:$11B7 1:000000:A1=A7:D8=D8 add alu // a<<3 nodelay 1:$11B8 1:000000:A1=A7:D8=D8 add alu // a<<2 nodelay 1:$11B9 1:000000:A1=A7:D8=D8 add alu // a<<1 nodelay 1:$11BA 1:000011:A0=A0:D0=D1 SLI0: next_op // a<<0 1:$11BB d15:data:reset=0:$0000 else 0:$11AB 0:data:reset=0:$0061 dm "xxxxxxxx" // +8 0:$11AC 0:data:reset=0:$0073 0:$11AD 0:data:reset=0:$006D 0:$11AE 0:data:reset=0:$002F 0:$11AF 0:data:reset=0:$006F 0:$11B0 0:data:reset=0:$0070 0:$11B1 0:data:reset=0:$0063 0:$11B2 0:data:reset=0:$006F 0:$11B3 0:data:reset=0:$0064 0:$11B4 0:data:reset=0:$0065 0:$11B5 0:data:reset=0:$0073 0:$11B6 0:data:reset=0:$002E 0:$11B7 0:data:reset=0:$0061 0:$11B8 0:data:reset=0:$0073 0:$11B9 0:data:reset=0:$006D 0:$11BA 0:000011:A1=A0:D8=D0 ld alu,$ff00 0:$11BB 0:data:reset=0:$FF00 0:$11BC 0:000010:A1=A7:D8=DA and swap 0:$11BD 0:000011:A0=A0:D0=D1 next_op // post 0:$11BE d15:data:reset=0:$0000 then SLI1 := SLI0-1 ( int -- int ) SLI2 := SLI0-2 ( int -- int ) SLI3 := SLI0-3 ( int -- int ) // 2010-05-12 :SR ( i16:n i4:m -- i16 ) // n >> m with 0<=m<=15 0:$1075 0:000010:A1=A0:D8=D0 and $000F 0:$1076 0:data:reset=0:$000F 0:$1077 0:001011:A1=A0:D8=D8 cpl // -1-m -1..-16 0:$1078 0:000000:A1=A0:D7=D0 add srtab+1 // SLI0+1-1-m = SLI0-m dtmp 0:$1079 0:data:reset=0:$D08E 0:$107A 0:000000:A1=A0:D3=D7 0:$107B 0:000000:A1=A0:D8=D7 0:$107C 0:000011:A1=A0:D0=D8 ld cmd,alu // jp SLI0-m 0:$107D d15:000011:A1=A5:DC=D1 ld sr,(hp) , nc :bit15 // n>>1 if 1 1:$107E 1:000011:A1=A7:DC=DC ld sr,sr , nc // a>>15 1:$107F 1:000011:A1=A7:DC=DC ld sr,sr , nc // a>>14 1:$1080 1:000011:A1=A7:DC=DC ld sr,sr , nc // a>>13 1:$1081 1:000011:A1=A7:DC=DC ld sr,sr , nc // a>>12 1:$1082 1:000011:A1=A7:DC=DC ld sr,sr , nc // a>>11 1:$1083 1:000011:A1=A7:DC=DC ld sr,sr , nc // a>>10 1:$1084 0:000011:A1=A7:DA=DC ld swap,sr :0 // a>>9 1:$1085 1:000011:A1=A7:DC=DC ld sr,sr , nc // a>>8 1:$1086 1:000011:A1=A7:DC=DC ld sr,sr , nc // a>>7 1:$1087 1:000011:A1=A7:DC=DC ld sr,sr , nc // a>>6 1:$1088 1:000011:A1=A7:DC=DC ld sr,sr , nc // a>>5 1:$1089 1:000011:A1=A7:DC=DC ld sr,sr , nc // a>>4 1:$108A 1:000011:A1=A7:DC=DC ld sr,sr , nc // a>>3 1:$108B 1:000011:A1=A7:DC=DC ld sr,sr , nc // a>>2 1:$108C 0:000011:A1=A7:D8=DC ld alu,sr :0 // a>>1 1:$108D 1:010011:A5=A5:D8=D1 srtab pop alu // a>>0 1:$108E 1:000011:A0=A0:D0=D1 next_op // post 1:$108F d15:data:reset=0:$0000 else 0:$107E 0:data:reset=0:$0061 dm "1234567" 0:$107F 0:data:reset=0:$0073 0:$1080 0:data:reset=0:$006D 0:$1081 0:data:reset=0:$002F 0:$1082 0:data:reset=0:$006F 0:$1083 0:data:reset=0:$0070 0:$1084 0:data:reset=0:$0063 0:$1085 0:data:reset=0:$006F 0:$1086 0:data:reset=0:$0064 0:$1087 0:data:reset=0:$0065 0:$1088 0:data:reset=0:$0073 0:$1089 0:data:reset=0:$002E 0:$108A 0:data:reset=0:$0061 0:$108B 0:data:reset=0:$0073 0:$108C 0:data:reset=0:$006D 0:$108D 0:000011:A1=A0:D8=D0 ld alu,$00ff //87 0:$108E 0:data:reset=0:$00FF 0:$108F 0:000011:A0=A0:D0=D1 ld cmd,(ip++) //6 0:$1090 d15:010010:A5=A5:D8=DA and swap , hp.oe,hp.clk,sub1 :bit15 //5 0:$1091 0:data:reset=0:$0061 dm "4321" //4321 0:$1092 0:data:reset=0:$0073 0:$1093 0:data:reset=0:$006D 0:$1094 0:data:reset=0:$002F 0:$1095 0:data:reset=0:$006F 0:$1096 0:data:reset=0:$0070 0:$1097 0:data:reset=0:$0063 0:$1098 0:data:reset=0:$006F 0:$1099 0:data:reset=0:$0064 0:$109A 0:data:reset=0:$0065 0:$109B 0:data:reset=0:$0073 0:$109C 0:data:reset=0:$002E 0:$109D 0:data:reset=0:$0061 0:$109E 0:data:reset=0:$0073 0:$109F 0:data:reset=0:$006D 0:$10A0 0:000011:A0=A0:D0=D1 ld cmd,(ip++) // 5 0:$10A1 d15:010011:A5=A5:D8=DC ld alu,sr , hp.oe,hp.clk,sub1 :bit15 // 4 then :SRU ( u16:a i4:n -- u16 ) // calculated shift a = a>>n with 0<=n<=15 0:$11DB 0:000010:A1=A0:D8=D0 and $000F 0:$11DC 0:data:reset=0:$000F 0:$11DD 0:001011:A1=A0:D8=D8 cpl // -1-n -1..-16 0:$11DE 0:000000:A1=A0:D7=D0 add srutab+1 // srtab+1-1-n = srtab-n dtmp 0:$11DF 0:data:reset=0:$D1F4 0:$11E0 0:000000:A1=A1:D3=D7 0:$11E1 0:000000:A1=A1:D8=D7 0:$11E2 0:000011:A1=A1:D0=D8 ld cmd,alu // jp srtab-n 0:$11E3 d15:010011:A5=A5:D8=D1 pop alu :bit15 // a if 1 SRU15: ( u16 -- u16 ) // fixed shift right: a = a>>n with 0<=n<=15 1:$11E4 0:000011:A1=A7:DC=D8 ld sr,alu,nc :0 // a>>15 1:$11E5 0:000011:A1=A7:DC=D8 ld sr,alu,nc :0 // a>>14 1:$11E6 0:000011:A1=A7:DC=D8 ld sr,alu,nc :0 // a>>13 1:$11E7 0:000011:A1=A7:DC=D8 ld sr,alu,nc :0 // a>>12 1:$11E8 0:000011:A1=A7:DC=D8 ld sr,alu,nc :0 // a>>11 1:$11E9 0:000011:A1=A7:DC=D8 ld sr,alu,nc :0 // a>>10 1:$11EA 0:000011:A1=A7:DC=D8 ld sr,alu,nc :0 // a>>9 1:$11EB 0:000011:A1=A7:DC=D8 ld sr,alu,nc :0 // a>>8 1:$11EC 0:000011:A1=A7:DC=D8 ld sr,alu,nc :0 // a>>7 1:$11ED 0:000011:A1=A7:DC=D8 ld sr,alu,nc :0 // a>>6 1:$11EE 0:000011:A1=A7:DC=D8 ld sr,alu,nc :0 // a>>5 1:$11EF 0:000011:A1=A7:DC=D8 ld sr,alu,nc :0 // a>>4 1:$11F0 0:000011:A1=A7:DC=D8 ld sr,alu,nc :0 // a>>3 1:$11F1 0:000011:A1=A7:DC=D8 ld sr,alu,nc :0 // a>>2 1:$11F2 0:000011:A1=A7:DC=D8 ld sr,alu,nc :0 // a>>1 1:$11F3 1:000011:A0=A0:D0=D1 srutab next_op // a>>0 1:$11F4 d15:data:reset=0:$0000 else 0:$11E4 0:000011:A1=A5:D3=D8 nop // a>>15 0:$11E5 0:000011:A1=A5:DC=DC ld sr,sr , nc // a>>14 0:$11E6 0:000011:A1=A5:DC=DC ld sr,sr , nc // a>>13 0:$11E7 0:000011:A1=A5:DC=DC ld sr,sr , nc // a>>12 0:$11E8 0:000011:A1=A5:DC=DC ld sr,sr , nc // a>>11 0:$11E9 0:000011:A1=A5:DC=DC ld sr,sr , nc // a>>10 0:$11EA 0:000011:A1=A5:DC=DC ld sr,sr , nc // a>>9 0:$11EB 0:000011:A1=A5:DC=DC ld sr,sr , nc // a>>8 0:$11EC 0:000011:A1=A5:DC=DC ld sr,sr , nc // a>>7 0:$11ED 0:000011:A1=A5:DC=DC ld sr,sr , nc // a>>6 0:$11EE 0:000011:A1=A5:DC=DC ld sr,sr , nc // a>>5 0:$11EF 0:000011:A1=A5:DC=DC ld sr,sr , nc // a>>4 0:$11F0 0:000011:A1=A5:DC=DC ld sr,sr , nc // a>>3 0:$11F1 0:000011:A1=A5:DC=DC ld sr,sr , nc // a>>2 0:$11F2 0:000011:A1=A5:DC=DC ld sr,sr , nc // a>>1 0:$11F3 0:000011:A1=A5:D8=DC ld alu,sr // a>>0 0:$11F4 0:000011:A0=A0:D0=D1 next_op 0:$11F5 d15:data:reset=0:$0000 then SRU0: = srutab ( int -- int ) // fixed shift right SRU1: = srutab-1 ( int -- int ) // single shift right // ============================================================ // other functions // ============================================================ // 2010-05-12 :RND1 ( -- i1 ) // one random bit 0:$135C 0:000011:A5=A5:D3=D8 psh alu 0:$135D 0:000011:A1=A5:D1=D8 return rnd,1 0:$135E rnd:000001:A1=A5:D8=D8 xor alu :rnd // * return if 1 // * return 1:$135F 1:000100:A1=A7:D8=D8 add_c alu // nodelay // * return 1:$1360 1:000011:A0=A0:D0=D1 next_op // post // * return 1:$1361 d15:data:reset=0:$0000 else // * return 0:$135F 0:000011:A0=A0:D0=D1 next_op // * return 0:$1360 d15:data:reset=0:$0000 then // * return // 2010-05-12 :RND ( -- i16 ) // 16 bit random number 0:$122F 0:000011:A5=A5:D3=DF psh alu : rnd 0:$1230 rnd:000011:A1=A5:D1=D8 if 1 1:$1231 rnd:000100:A1=A0:D8=D8 add_c alu : rnd // nodelay 1:$1232 rnd:000100:A1=A0:D8=D8 add_c alu : rnd // nodelay 1:$1233 rnd:000100:A1=A0:D8=D8 add_c alu : rnd // nodelay 1:$1234 rnd:000100:A1=A0:D8=D8 add_c alu : rnd // nodelay 1:$1235 rnd:000100:A1=A0:D8=D8 add_c alu : rnd // nodelay 1:$1236 rnd:000100:A1=A0:D8=D8 add_c alu : rnd // nodelay 1:$1237 rnd:000100:A1=A0:D8=D8 add_c alu : rnd // nodelay 1:$1238 rnd:000100:A1=A0:D8=D8 add_c alu : rnd // nodelay 1:$1239 rnd:000100:A1=A0:D8=D8 add_c alu : rnd // nodelay 1:$123A rnd:000100:A1=A0:D8=D8 add_c alu : rnd // nodelay 1:$123B rnd:000100:A1=A0:D8=D8 add_c alu : rnd // nodelay 1:$123C rnd:000100:A1=A0:D8=D8 add_c alu : rnd // nodelay 1:$123D rnd:000100:A1=A0:D8=D8 add_c alu : rnd // nodelay 1:$123E rnd:000100:A1=A0:D8=D8 add_c alu : rnd // nodelay 1:$123F rnd:000100:A1=A0:D8=D8 add_c alu : rnd // nodelay 1:$1240 1:000011:A0=A0:D0=D1 ld cmd,(ip++) 1:$1241 d15:000100:A1=A0:D8=D8 add_c alu :bit15 // nodelay else 0:$1231 rnd:000000:A1=A5:D8=D8 add alu : rnd // nodelay 0:$1232 rnd:000000:A1=A5:D8=D8 add alu : rnd // nodelay 0:$1233 rnd:000000:A1=A5:D8=D8 add alu : rnd // nodelay 0:$1234 rnd:000000:A1=A5:D8=D8 add alu : rnd // nodelay 0:$1235 rnd:000000:A1=A5:D8=D8 add alu : rnd // nodelay 0:$1236 rnd:000000:A1=A5:D8=D8 add alu : rnd // nodelay 0:$1237 rnd:000000:A1=A5:D8=D8 add alu : rnd // nodelay 0:$1238 rnd:000000:A1=A5:D8=D8 add alu : rnd // nodelay 0:$1239 rnd:000000:A1=A5:D8=D8 add alu : rnd // nodelay 0:$123A rnd:000000:A1=A5:D8=D8 add alu : rnd // nodelay 0:$123B rnd:000000:A1=A5:D8=D8 add alu : rnd // nodelay 0:$123C rnd:000000:A1=A5:D8=D8 add alu : rnd // nodelay 0:$123D rnd:000000:A1=A5:D8=D8 add alu : rnd // nodelay 0:$123E rnd:000000:A1=A5:D8=D8 add alu : rnd // nodelay 0:$123F rnd:000000:A1=A5:D8=D8 add alu : rnd // nodelay 0:$1240 0:000011:A0=A0:D0=D1 ld cmd,(ip++) 0:$1241 d15:000000:A1=A0:D8=D8 add alu :bit15 // nodelay then // ============================================================ // Characters // Is Uppercase? // (z.Zt. ASCII only) // is_uppercase(c) = uchar(c-'A')<='Z'-'A'; // // 2010-05-12 :IS_UPPERCASE ( u16:char -- i1 ) 0:$12E1 0:001100:A1=A0:D7=D0 sub 'A' // dtmp 0:$12E2 0:data:reset=0:$0041 0:$12E3 0:001100:A1=A0:D3=D7 0:$12E4 0:001100:A1=A0:D8=D7 0:$12E5 0:001000:A1=A0:D7=D0 cmp_nc 'Z'-'A' // dtmp 0:$12E6 0:data:reset=0:$0019 0:$12E7 0:001000:A1=A0:D3=D7 0:$12E8 0:001000:A1=A0:D3=D7 0:$12E9 cy:000011:A0=A0:D0=D1 ld cmd,(ip++) :cy if 0 0:$12EA d15:001001:A1=A0:D8=D8 xorn alu :bit15 // !cy => cy => char-A-1-(Z-A) < 0 => char-A ? Z-A => uppercase => true else 1:$12EA d15:000001:A1=A7:D8=D8 xor alu :bit15 // cy => !cy => char-A-1 ? Z-A => char-1?Z => char>Z => not uppercase then // Is Letter? // (z.Zt. ASCII only) // is_letter(c) = uchar((c|0x20)-'a')<='z'-'a'; // // 2010-05-12 :IS_LETTER ( u16:char -- i1 ) 0:$1A99 0:000110:A1=A1:D8=D0 or $20 0:$1A9A 0:data:reset=0:$0020 0:$1A9B 0:000011:A1=A0:D0=D0 jp IS_LOWERCASE 0:$1A9C d15:data:reset=0:$52EB // Is Lowercase? // (z.Zt. ASCII only) // is_lowercase(c) = uchar(c-'a')<='z'-'a'; // // 2010-05-12 :IS_LOWERCASE ( u16:char -- i1 ) 0:$12EB 0:001100:A1=A0:D7=D0 sub 'a' // dtmp 0:$12EC 0:data:reset=0:$0061 0:$12ED 0:001100:A1=A0:D3=D7 0:$12EE 0:001100:A1=A0:D8=D7 0:$12EF 0:001000:A1=A0:D7=D0 cmp_nc 'z'-'a' // dtmp 0:$12F0 0:data:reset=0:$0019 0:$12F1 0:001000:A1=A0:D3=D7 0:$12F2 0:001000:A1=A0:D3=D7 0:$12F3 cy:000011:A0=A0:D0=D1 ld cmd,(ip++) :cy if 0 0:$12F4 d15:001001:A1=A0:D8=D8 xorn alu :bit15 // true else 1:$12F4 d15:000001:A1=A7:D8=D8 xor alu :bit15 // cy => !cy => char-a-1 ? z-a => char-1?z => char>z => not lowercase then // To Lowercase // (z.Zt. ASCII only) // to_lower(c) = uchar(c-'A')<='Z'-'A' ? c|0x20 : c; // // 2010-05-12 :TO_LOWER ( u16:char -- u16:char ) 0:$1270 0:000011:A1=A0:D6=D8 ld d2,alu // d2=char 0:$1271 0:001100:A1=A0:D7=D0 sub 'A' // dtmp 0:$1272 0:data:reset=0:$0041 0:$1273 0:001100:A1=A0:D3=D7 0:$1274 0:001100:A1=A0:D8=D7 0:$1275 0:001000:A1=A0:D7=D0 cmp_nc 'Z'-'A' // dtmp 0:$1276 0:data:reset=0:$0019 0:$1277 0:001000:A1=A0:D3=D7 0:$1278 0:001000:A1=A0:D3=D7 0:$1279 cy:data:reset=0:$0000 if cy // cy => !cy => char-A-1 ? Z-A => char-1?Z => char>Z => !uppercase 1:$127A 1:000011:A1=A7:D8=D6 ld alu,d2 1:$127B 1:000011:A0=A0:D0=D1 next_op // post 1:$127C d15:data:reset=0:$0000 else 0:$127A 0:000011:A1=A0:D8=D0 ld alu,$20 0:$127B 0:data:reset=0:$0020 0:$127C 0:000110:A1=A0:D8=D6 or d2 0:$127D 0:000011:A0=A0:D0=D1 next_op // post 0:$127E d15:data:reset=0:$0000 then // To Uppercase // (z.Zt. ASCII only) // to_upper(c) = uchar(c-'a')<='z'-'a' ? c&~0x20 : c; // // 2010-05-12 :TO_UPPER ( u16:char -- u16:char ) 0:$1261 0:000011:A1=A0:D6=D8 ld d2,alu // d2=char 0:$1262 0:001100:A1=A0:D7=D0 sub 'a' // dtmp 0:$1263 0:data:reset=0:$0061 0:$1264 0:001100:A1=A0:D3=D7 0:$1265 0:001100:A1=A0:D8=D7 0:$1266 0:001000:A1=A0:D7=D0 cmp_nc 'z'-'a' // dtmp 0:$1267 0:data:reset=0:$0019 0:$1268 0:001000:A1=A0:D3=D7 0:$1269 0:001000:A1=A0:D3=D7 0:$126A cy:data:reset=0:$0000 if cy // cy => !cy => char-a-1 ? z-a => char-1?z => char>z => !lowercase => return as-is 1:$126B 1:000011:A1=A7:D8=D6 ld alu,d2 1:$126C 1:000011:A0=A0:D0=D1 next_op // post 1:$126D d15:data:reset=0:$0000 else 0:$126B 0:000011:A1=A0:D8=D0 ld alu,~$20 // lowercase => 0:$126C 0:data:reset=0:$FFDF 0:$126D 0:000010:A1=A7:D8=D6 and d2 // return to_upper 0:$126E 0:000011:A0=A0:D0=D1 next_op // post 0:$126F d15:data:reset=0:$0000 then // Is binary digit? // is_bin_digit(c) = (c|1)=='1'; // // 2010-05-12 :IS_BIN_DIGIT ( u16:char -- i1 ) 0:$1327 0:000110:A1=A0:D8=D0 or 1 0:$1328 0:data:reset=0:$0001 0:$1329 0:000011:A1=A0:D7=D0 ld dtmp,'1' // wg. delay 0:$132A 0:data:reset=0:$0031 0:$132B 0:000001:A1=A0:D3=D7 equ dtmp 0:$132C z:000011:A0=A0:D0=D1 ld cmd,(ip++) :z if 1 1:$132D d15:001001:A1=A7:D8=D8 xorn alu :bit15 // true else 0:$132D d15:000001:A1=A0:D8=D8 xor alu :bit15 // no then // is octal digit? // is_oct_digit(c) = (c|7)=='7'; // // 2010-05-12 :IS_OCT_DIGIT ( u16:char -- i1 ) 0:$1320 0:000110:A1=A5:D8=D0 or 7 0:$1321 0:data:reset=0:$0007 0:$1322 0:000011:A1=A0:D7=D0 ld dtmp,'7' // wg. delay 0:$1323 0:data:reset=0:$0037 0:$1324 0:000001:A1=A0:D3=D7 equ dtmp 0:$1325 z:000011:A0=A0:D0=D1 ld cmd,(ip++) :z if 1 1:$1326 d15:001001:A1=A7:D8=D8 xorn alu :bit15 // true else 0:$1326 d15:000001:A1=A0:D8=D8 xor alu :bit15 // no then // is decimal digit? // is_dec_digit(c) = uchar(c-'0')<='9'-'0'; // // 2010-05-12 :IS_DEC_DIGIT ( u16:char -- i1 ) 0:$1305 0:001100:A1=A0:D7=D0 sub '0' // dtmp 0:$1306 0:data:reset=0:$0030 0:$1307 0:001100:A1=A0:D3=D7 0:$1308 0:001100:A1=A0:D8=D7 0:$1309 0:001000:A1=A0:D7=D0 cmp_nc '9'-'0' // dtmp 0:$130A 0:data:reset=0:$0009 0:$130B 0:001000:A1=A0:D3=D7 0:$130C 0:001000:A1=A0:D3=D7 0:$130D cy:000011:A0=A0:D0=D1 ld cmd,(ip++) :cy if 1 1:$130E d15:000001:A1=A7:D8=D8 xor alu :bit15 // cy => !cy => char-'0'-1 ? '9'-'0' => char-1?'9' => char>'9' => no decdigit else 0:$130E d15:001001:A1=A0:D8=D8 xorn alu :bit15 // true then // is hexadecimal digit? // is_hex_digit(c) = uchar(c-'0')<='9'-'0' || uchar((c|0x20)-'a') <= 'f'-'a'; // // 2010-05-12 :IS_HEX_DIGIT ( u16:char -- i1 ) 0:$1205 0:000011:A1=A0:D6=D8 ld d2,alu // d2=char 0:$1206 0:001100:A1=A0:D7=D0 sub '0' // dtmp 0:$1207 0:data:reset=0:$0030 0:$1208 0:001100:A1=A0:D3=D7 0:$1209 0:001100:A1=A0:D8=D7 0:$120A 0:001000:A1=A0:D7=D0 cmp_nc '9'-'0' // dtmp 0:$120B 0:data:reset=0:$0009 0:$120C 0:001000:A1=A0:D3=D7 0:$120D 0:001000:A1=A0:D3=D7 0:$120E cy:000011:A1=A0:D8=D6 ld alu,d2 :cy // alu=char if 1 // cy => !cy => char>'9' => no dec. digit 1:$120F 1:000110:A1=A7:D8=D0 or $20 1:$1210 1:data:reset=0:$0020 1:$1211 1:001100:A1=A0:D7=D0 sub 'a' // dtmp 1:$1212 1:data:reset=0:$0061 1:$1213 1:001100:A1=A0:D3=D7 1:$1214 1:001100:A1=A0:D8=D7 1:$1215 1:001000:A1=A0:D7=D0 cmp_nc 'f'-'a' // dtmp 1:$1216 1:data:reset=0:$0005 1:$1217 1:001000:A1=A0:D3=D7 1:$1218 1:001000:A1=A0:D3=D7 1:$1219 cy:000011:A0=A0:D0=D1 ld cmd,(ip++) :cy if 1 1:$121A d15:000001:A1=A0:D8=D8 xor alu :bit15 // cy => !cy => c|20-a-1?f-a => c|20-1?f => c|20>f => no hex else 0:$121A d15:001001:A1=A7:D8=D8 xorn alu :bit15 // nc => yes then else // !cy => cy => char?'9' => dec. digit 0:$120F 0:001001:A1=A0:D8=D8 xorn alu // yes 0:$1210 0:000011:A0=A0:D0=D1 next_op // post 0:$1211 d15:data:reset=0:$0000 then // value of decimal digit: // char --> digit value: ['0'..'9'] ---> [0..9]; non-digits ---> [10..255] // digit_val(char c) { return uchar(c-'0'); } // // 2010-05-12 DEC_DIGIT_VALUE := SUBQ+'0' ( u16:char -- u16 ) // sub '0' // dtmp // next_op // value of base36 digit: // char --> digit value: ['0'..'9']['A'..'Z']['a'..'z'] ---> [0...35]; non-digits ---> [36++] // digit_value(c) = c<='9' ? uchar(c-'0') : int(uchar((c&~0x20)-'A'))+10; // // 2010-05-12 :DIGIT_VALUE ( u16:char -- u16 ) 0:$1288 0:001100:A1=A7:D7=D0 cmp '9'+1 // dtmp 0:$1289 0:data:reset=0:$003A 0:$128A 0:001100:A1=A0:D3=D7 0:$128B 0:001100:A1=A0:D3=D7 0:$128C cy:000011:A1=A0:D0=D0 jp !cy,SUBQ+'0' // !cy => cy => char<'9'+1 => char?'9' => rval > $FFC0 0:$128D d15:data:reset=0:$1E30 1:$128D d15:data:reset=0:$D28E 1:$128E 1:000110:A1=A2:D8=D0 or $20 // to_lower 1:$128F 1:data:reset=0:$0020 1:$1290 1:001100:A1=A0:D7=D0 sub 'a' // dtmp 1:$1291 1:data:reset=0:$0061 1:$1292 1:001100:A1=A0:D3=D7 1:$1293 1:001100:A1=A0:D8=D7 1:$1294 cy:000011:A1=A0:D0=D0 ld cmd,ival :cy if 0 0:$1295 d15:data:reset=0:$5A04 dw NEXT :bit15 // !cy => cy => char<'a' => rval > $FFC0 else 1:$1295 d15:data:reset=0:$950A dw ADDQ+10 :bit15 // => legal 10 .. 36 or illegal >36 then // ============================================ // strings & arrays // ============================================ // 2010-05-11 // get string length: // disposes the handle // :STRLEN ( str -- len ) login 0:$1252 0:001010:A1=A0:D2=D8 ld io,alu,d_bits=10 // * login TODO // memcnt 0:$1253 0:000011:A6=A1:D3=D0 ld atmp,$ // * TODO 0:$1254 0:data:reset=0:$5253 0:$1255 0:000011:A1=A2:D0=D0 jp TODO // * TODO 0:$1256 d15:data:reset=0:$697C 0:$1257 0:000011:A3=A1:D3=D8 ld a0,alu // a0=alu=handle 0:$1258 z:000011:A1=A3:DF=D1 ld d2ar,(a0) :z // d2ar -> len if 0 //del_handle: 0:$1259 0:000011:A6=A1:D3=D0 ld atmp,mem_free_ptr 0:$125A 0:data:reset=0:$0018 0:$125B 0:000011:A1=A6:D7=D1 ld (a0),(atmp) // dtmp 0:$125C 0:000011:A1=A3:D1=D7 0:$125D 0:000011:A1=A6:D1=D8 ld (atmp),alu 0:$125E 0:000011:A1=A7:D8=D1 ld alu,(d2ar) // alu=len 0:$125F 0:000011:A0=A0:D0=D1 next_op // post 0:$1260 d15:data:reset=0:$0000 else 1:$1259 1:000011:A0=A0:D0=D1 next_op 1:$125A d15:data:reset=0:$0000 then // 2010-05-11 // get buffer length: // does not dispose the handle // :BUSIZE ( bu -- len ) login 0:$130F 0:001010:A1=A0:D2=D8 ld io,alu,d_bits=10 // * login TODO // memcnt 0:$1310 0:000011:A6=A1:D3=D0 ld atmp,$ // * TODO 0:$1311 0:data:reset=0:$5310 0:$1312 0:000011:A1=A3:D0=D0 jp TODO // * TODO 0:$1313 d15:data:reset=0:$697C 0:$1314 0:000011:A1=A1:DF=D8 ld d2ar,alu // d2ar=alu=handle 0:$1315 z:000011:A1=A7:DF=D1 ld d2ar,(d2ar) :z // d2ar=ptr if 0 0:$1316 0:000011:A1=A7:D8=D1 ld alu,(d2ar) // alu=len 0:$1317 0:000011:A0=A0:D0=D1 next_op // post 0:$1318 d15:data:reset=0:$0000 else 1:$1316 1:000011:A0=A0:D0=D1 next_op 1:$1317 d15:data:reset=0:$0000 then // 2010-05-11 // compare two strings for equality: // :SAMECSTR ( str¢ str¢ -- i1 ) login 0:$1106 0:001010:A1=A0:D2=D8 ld io,alu,d_bits=10 // * login TODO // memcnt 0:$1107 0:000011:A6=A1:D3=D0 ld atmp,$ // * TODO 0:$1108 0:data:reset=0:$5107 0:$1109 0:000011:A1=A1:D0=D0 jp TODO // * TODO 0:$110A d15:data:reset=0:$697C 0:$110B 0:000011:A3=A1:D3=D8 ld a0,alu // a0=handle2 0:$110C z:010011:A5=A5:D8=D1 pop alu :z // alu=handle1 if 1 1:$110D 1:000011:A3=A1:D3=D0 ld a0,null // a0==0 => a0=ptr->null 1:$110E 0:data:reset=0:$001B else 0:$110D 0:000011:A1=A3:D7=D1 ld a0,(a0) // a0=ptr2 dtmp 0:$110E 0:000011:A3=A1:D3=D7 then 0:$110F 0:000011:A4=A1:D3=D8 ld a1,alu // handle1 0:$1110 z:data:reset=0:$0000 if z 1:$1111 1:000011:A4=A1:D3=D0 ld a1,null // a1==0 => a1=ptr->null 1:$1112 0:data:reset=0:$001B else 0:$1111 0:000011:A1=A4:D7=D1 ld a1,(a1) // a1=ptr1 dtmp 0:$1112 0:000011:A4=A1:D3=D7 then // a0 -> bu1 // a1 -> bu2 cmpstr: login 0:$1113 0:001010:A1=A1:D2=D8 ld io,alu,d_bits=10 // * login TODO // memcnt 0:$1114 0:000011:A6=A1:D3=D0 ld atmp,$ // * TODO 0:$1115 0:data:reset=0:$5114 0:$1116 0:000011:A1=A1:D0=D0 jp TODO // * TODO 0:$1117 d15:data:reset=0:$697C 0:$1118 0:000011:A1=A3:D7=D1 ld atmp,(a0) // atmp=len1 dtmp 0:$1119 0:000011:A6=A1:D3=D7 // vergleich beider strings. // als erstes wird das length-word verglichen. do 0:$111A 0:000011:A3=A3:D8=D1 ld alu,(a0++) // alu=char2 0:$111B 0:000001:A1=A4:D3=D1 equ (a1) // delay 0:$111C 0:000001:A4=A4:D3=D1 equ (a1++) // char2==char1? 0:$111D z:data:reset=0:$0000 if !z // no 0:$111E 0:000001:A1=A0:D8=D8 xor alu // rval=0=no 0:$111F 0:000011:A0=A0:D0=D1 next_op // post 0:$1120 d15:data:reset=0:$0000 1:$111E 1:000011:A1=A7:D0=D0 then 1:$111F d15:data:reset=0:$5121 0:$1121 0:010011:A6=A6:D3=D3 tst atmp-- // counter 0:$1122 z:data:reset=0:$0000 until z 0:$1123 0:000011:A1=A0:D0=D0 0:$1124 d15:data:reset=0:$511A 1:$1123 1:001001:A1=A7:D8=D8 xorn alu // rval=-1=yes 1:$1124 1:000011:A0=A0:D0=D1 next_op // post 1:$1125 d15:data:reset=0:$0000 // 2010-05-11 // compare strings for equality: // disposes the handle // :SAMESTR ( str1 str2 -- i1 ) login 0:$1125 0:001010:A1=A1:D2=D8 ld io,alu,d_bits=10 // * login TODO // memcnt 0:$1126 0:000011:A6=A1:D3=D0 ld atmp,$ // * TODO 0:$1127 0:data:reset=0:$5126 0:$1128 0:000011:A1=A1:D0=D0 jp TODO // * TODO 0:$1129 d15:data:reset=0:$697C 0:$112A 0:000011:A1=A1:DF=D0 ld d2ar,mem_free_ptr 0:$112B 0:data:reset=0:$0018 0:$112C 0:000011:A6=A1:D3=D8 ld atmp,alu // atmp=alu=handle2 0:$112D z:000011:A1=A6:D7=D1 ld dtmp,(atmp) :z // dtmp=ptr2 if 0 0:$112E 0:000011:A3=A1:D3=D7 ld a0,dtmp // a0=ptr2 // del handle: login 0:$112F 0:001010:A1=A1:D2=D8 ld io,alu,d_bits=10 // * login TODO 0:$1130 0:000011:A6=A1:D3=D0 ld atmp,$ // * TODO 0:$1131 0:data:reset=0:$5130 0:$1132 0:000011:A1=A1:D0=D0 jp TODO // * TODO 0:$1133 d15:data:reset=0:$697C 0:$1134 0:000011:A1=A7:D7=D1 ld (atmp),(d2ar) // dtmp 0:$1135 0:000011:A1=A6:D1=D7 0:$1136 0:000011:A1=A7:D1=D8 ld (d2ar),alu else 1:$112E 1:000011:A3=A1:D3=D0 ld a0,null 1:$112F 1:data:reset=0:$001B 1:$1130 1:000011:A1=A0:D0=D0 then 1:$1131 d15:data:reset=0:$5137 0:$1137 0:010011:A5=A5:D8=D1 pop alu 0:$1138 0:000011:A6=A1:D3=D8 ld atmp,alu // atmp=alu=handle1 0:$1139 z:000011:A1=A6:D7=D1 ld dtmp,(atmp) :z // dtmp=ptr1 if 0 0:$113A 0:000011:A4=A1:D3=D7 ld a1,dtmp // a1=ptr2 // del handle: login 0:$113B 0:001010:A1=A1:D2=D8 ld io,alu,d_bits=10 // * login TODO 0:$113C 0:000011:A6=A1:D3=D0 ld atmp,$ // * TODO 0:$113D 0:data:reset=0:$513C 0:$113E 0:000011:A1=A1:D0=D0 jp TODO // * TODO 0:$113F d15:data:reset=0:$697C 0:$1140 0:000011:A1=A7:D7=D1 ld (atmp),(d2ar) // dtmp 0:$1141 0:000011:A1=A6:D1=D7 0:$1142 0:000011:A1=A7:D1=D8 ld (d2ar),alu 0:$1143 0:000011:A1=A7:D0=D0 jp cmpstr 0:$1144 d15:data:reset=0:$5113 else 1:$113A 1:000011:A4=A1:D3=D0 ld a1,null 1:$113B 1:data:reset=0:$001B 1:$113C 1:000011:A1=A0:D0=D0 jp cmpstr 1:$113D d15:data:reset=0:$5113 then // ====================================================== // Strings: // >str = address of a string variable = ptr -> handle // str = handle = ptr -> temp mem ptr on temp mem heap // gstr = handle = ptr -> mem ptr #if 0 // 2010-05-11 // create new empty string: // STR: = LDQ ( -- str ) psh alu xor alu // len=0 => handle=NULL next_op // post #endif // 2010-05-11 // create new uncleared string with size: // NEWSTR: = ALLOC ( len -- str ) // 2010-05-11 // spacestr: // :CLEAREDSTR ( len filler -- str ) login 0:$12CA 0:001010:A1=A0:D2=D8 ld io,alu,d_bits=10 // * login TODO // memcnt 0:$12CB 0:000011:A6=A1:D3=D0 ld atmp,$ // * TODO 0:$12CC 0:data:reset=0:$52CB 0:$12CD 0:000011:A1=A2:D0=D0 jp TODO // * TODO 0:$12CE d15:data:reset=0:$697C 0:$12CF 0:010011:A5=A5:D4=D1 pop d0 0:$12D0 0:000011:A1=A5:D3=D4 tst d0 // d0=len 0:$12D1 z:010011:A2=A2:D5=D8 ld d1,alu , sp.oe,sp.clk,sub1 :z // d1=filler and --sp if 0 0:$12D2 0:000011:A0=A0:D7=D1 ld (sp),(ip++) // dtmp 0:$12D3 0:000011:A1=A2:D1=D7 0:$12D4 0:000011:A1=A2:D0=D0 jp filled_str 0:$12D5 d15:data:reset=0:$44EB else 1:$12D2 1:000011:A5=A5:D3=DF inc hp // len=0 => handle=NULL 1:$12D3 1:000011:A0=A0:D0=D1 next_op // post 1:$12D4 d15:data:reset=0:$0000 then // cleared buffer: // cleared with 0 // real handle even for size=0 // :CLEAREDBUFFER ( len -- str ) login 0:$1F0E 0:001010:A1=A2:D2=D8 ld io,alu,d_bits=10 // * login TODO // memcnt 0:$1F0F 0:000011:A6=A1:D3=D0 ld atmp,$ // * TODO 0:$1F10 0:data:reset=0:$5F0F 0:$1F11 0:000011:A1=A7:D0=D0 jp TODO // * TODO 0:$1F12 d15:data:reset=0:$697C 0:$1F13 0:010011:A2=A2:D4=D8 ld d0,alu, sp.clk,sp.oe,sub1 // size; --sp 0:$1F14 0:000011:A0=A0:D7=D1 ld (sp),(ip++) // dtmp 0:$1F15 0:000011:A1=A2:D1=D7 0:$1F16 0:000011:A1=A2:D0=D0 jp alloc 0:$1F17 d15:data:reset=0:$4207 // 2010-05-11 // str with immediate data in prg code: // :ISTR ( -- str ) 0:$2247 0:000011:A5=A5:D3=DD psh alu 0:$2248 0:000011:A1=A5:D1=D8 0:$2249 0:000011:A1=A0:D4=D3 ld d0,ip // d0=ptr 0:$224A 0:000011:A0=A0:D8=D1 ld alu,(ip++) // alu=cstr.len; ip->cstr.data 0:$224B 0:000000:A1=A0:D3=D3 add ip // alu->cstr.data+cstr.len 0:$224C 0:000000:A1=A0:D8=D3 0:$224D 0:000011:A0=A1:D3=D8 ld ip,alu // ip->next_op 0:$224E 0:010011:A2=A2:D3=D8 jsr new_handle // a0=alu=handle 0:$224F 0:000011:A1=A2:D1=D0 0:$2250 0:data:reset=0:$6253 0:$2251 0:000011:A1=A2:D0=D0 0:$2252 d15:data:reset=0:$4443 0:$2253 0:000011:A1=A3:D1=D4 ld (a0),d0 0:$2254 0:000011:A0=A0:D0=D1 next_op // post 0:$2255 d15:data:reset=0:$0000 // 2010-05-11 // duplicate string handle: // :DUPSTR ( str:bu -- str:bu str2 ) login 0:$10ED 0:001010:A1=A0:D2=D8 ld io,alu,d_bits=10 // * login TODO // memcnt 0:$10EE 0:000011:A6=A1:D3=D0 ld atmp,$ // * TODO 0:$10EF 0:data:reset=0:$50EE 0:$10F0 0:000011:A1=A0:D0=D0 jp TODO // * TODO 0:$10F1 d15:data:reset=0:$697C 0:$10F2 0:000011:A5=A5:D3=DC psh alu // alu 0:$10F3 0:000011:A1=A5:D1=D8 0:$10F4 z:000011:A4=A1:D3=D8 ld a1,alu :z // a1=handle1 if 0 0:$10F5 0:010011:A2=A2:D3=D8 jsr new_handle // a0=alu=handle 0:$10F6 0:000011:A1=A2:D1=D0 0:$10F7 0:data:reset=0:$50FA 0:$10F8 0:000011:A1=A0:D0=D0 0:$10F9 d15:data:reset=0:$4443 0:$10FA 0:000011:A1=A4:D7=D1 ld (a0),(a1) // copy ptr1 dtmp 0:$10FB 0:000011:A1=A3:D1=D7 0:$10FC 0:000011:A0=A0:D0=D1 next_op // post 0:$10FD d15:data:reset=0:$0000 else 1:$10F5 1:000011:A0=A0:D0=D1 next_op 1:$10F6 d15:data:reset=0:$0000 then #if 0 // 2010-05-11 // duplicate handle and data: // :COPYSTR ( str:bu -- str:bu str2 ) login TODO // memcnt psh alu // alu ld a0,alu :z // a0=handle1 if 0 ld d2ar,(a0) // d2ar=ptr1 ld d0,(d2ar) // d0=len1 jsr mem_assert_free // in:d0 ld d2ar,(a0) // d2ar=ptr1 ld d0,(d2ar) // d0=len1 pshr (ip++) // dtmp jp alloc_with_data else // copy empty string: next_op // ( NULL -- NULL NULL ) then #endif // 2010-05-11 // concatenate 2 strings // reuses one handle, drops the other // if one of both strings is NULL, then data is not copied! // :CATSTR ( str1 str2 -- str ) login 0:$11BF 0:001010:A1=A0:D2=D8 ld io,alu,d_bits=10 // * login TODO // memcnt 0:$11C0 0:000011:A6=A1:D3=D0 ld atmp,$ // * TODO 0:$11C1 0:data:reset=0:$51C0 0:$11C2 0:000011:A1=A1:D0=D0 jp TODO // * TODO 0:$11C3 d15:data:reset=0:$697C login 0:$11C4 0:001010:A1=A1:D2=D8 ld io,alu,d_bits=10 // * login TODO 0:$11C5 0:000011:A6=A1:D3=D0 ld atmp,$ // * TODO 0:$11C6 0:data:reset=0:$51C5 0:$11C7 0:000011:A1=A1:D0=D0 jp TODO // * TODO 0:$11C8 d15:data:reset=0:$697C 0:$11C9 0:000011:A4=A1:D3=D8 ld a1,alu // a1=handle2 0:$11CA z:000011:A1=A5:D7=D1 ld dtmp,(hp) :z 1:$11CB 1:000011:A1=A7:D0=D0 if 0 1:$11CC d15:data:reset=0:$D1D8 0:$11CB 0:000011:A3=A1:D3=D7 ld a0,dtmp // a0=handle1 0:$11CC z:000011:A1=A4:D6=D3 ld d2,a1 :z // d2=handle2 if 0 0:$11CD 0:010011:A2=A2:D3=D3 jsr mem_append_handle 0:$11CE 0:000011:A1=A2:D1=D0 0:$11CF 0:data:reset=0:$51D2 0:$11D0 0:000011:A1=A1:D0=D0 0:$11D1 d15:data:reset=0:$45AC // delete handle2 0:$11D2 0:000011:A4=A1:D3=D6 ld a1,d2 0:$11D3 0:000011:A1=A1:DF=D0 ld d2ar,mem_free_ptr 0:$11D4 0:data:reset=0:$0018 0:$11D5 0:000011:A1=A7:D7=D1 ld (a1),(d2ar) // dtmp 0:$11D6 0:000011:A1=A4:D1=D7 0:$11D7 0:000011:A1=A7:D1=D6 ld (d2ar),d2 0:$11D8 0:010011:A5=A5:D8=D1 pop alu 0:$11D9 0:000011:A0=A0:D0=D1 next_op // post 0:$11DA d15:data:reset=0:$0000 else 1:$11CD 1:010011:A5=A5:D3=D8 dec hp // string1=NULL => return string 2 1:$11CE 1:000011:A0=A0:D0=D1 next_op // post 1:$11CF d15:data:reset=0:$0000 then else 1:$11D8 1:010011:A5=A5:D8=D1 pop alu // string2=NULL => return string 1 1:$11D9 1:000011:A0=A0:D0=D1 next_op // post 1:$11DA d15:data:reset=0:$0000 then // resize string // :RESIZESTR ( str size -- str ) // Not for Bytecode! login 0:$1242 0:001010:A1=A0:D2=D8 ld io,alu,d_bits=10 // * login TODO // memcnt 0:$1243 0:000011:A6=A1:D3=D0 ld atmp,$ // * TODO 0:$1244 0:data:reset=0:$5243 0:$1245 0:000011:A1=A2:D0=D0 jp TODO // * TODO 0:$1246 d15:data:reset=0:$697C 0:$1247 0:000011:A1=A5:D7=D1 ld dtmp,(hp) 0:$1248 0:000011:A3=A1:D3=D7 ld a0,dtmp // a0=handle 0:$1249 z:000011:A1=A1:D4=D8 ld d0,alu :z // d0=new size if 0 0:$124A 0:010011:A2=A2:D3=D8 jsr mem_resize_handle 0:$124B 0:000011:A1=A2:D1=D0 0:$124C 0:data:reset=0:$524F 0:$124D 0:000011:A1=A2:D0=D0 0:$124E d15:data:reset=0:$4425 0:$124F 0:010011:A5=A5:D8=D1 pop alu // alu=handle 0:$1250 0:000011:A0=A0:D0=D1 next_op // post 0:$1251 d15:data:reset=0:$0000 else // str is NULL 1:$124A 1:010011:A2=A2:D3=DF jsr alloc 1:$124B 1:000011:A1=A2:D1=D0 1:$124C 1:data:reset=0:$D24F 1:$124D 1:000011:A1=A2:D0=D0 1:$124E d15:data:reset=0:$4207 1:$124F 1:010011:A5=A5:D3=D7 dec hp // nip NULL-handle 1:$1250 1:000011:A0=A0:D0=D1 next_op // post 1:$1251 d15:data:reset=0:$0000 then // create substring // reuses the string handle // :LEFTSTR ( str len -- str ) login 0:$1163 0:001010:A1=A1:D2=D8 ld io,alu,d_bits=10 // * login TODO // memcnt 0:$1164 0:000011:A6=A1:D3=D0 ld atmp,$ // * TODO 0:$1165 0:data:reset=0:$5164 0:$1166 0:000011:A1=A1:D0=D0 jp TODO // * TODO 0:$1167 d15:data:reset=0:$697C 0:$1168 0:000011:A1=A5:DF=D1 ld d2ar,(hp) // delay 0:$1169 0:000011:A1=A5:DF=D1 ld d2ar,(hp) // handle 0:$116A 0:000011:A1=A7:D7=D1 ld a1,(d2ar) :z // a1=ptr dtmp 0:$116B z:000011:A4=A1:D3=D7 if 0 0:$116C 0:001100:A1=A4:D3=D1 cmp (a1) // len-str.len 0:$116D 0:001100:A1=A4:D3=D1 0:$116E cy:000011:A1=A4:D4=D8 ld d0,alu :cy // d0=len if 0 // !cy => cy => len < str.len => substring 0:$116F 0:010011:A2=A2:D3=D8 jsr new_data_with_size // d0=len a1=ptr 0:$1170 0:000011:A1=A2:D1=D0 0:$1171 0:data:reset=0:$5174 0:$1172 0:000011:A1=A1:D0=D0 0:$1173 d15:data:reset=0:$420A 0:$1174 0:000011:A1=A5:DF=D1 ld d2ar,(hp) // handle 0:$1175 0:000011:A1=A7:D7=D1 ld a0,(d2ar) // a0=qptr dtmp 0:$1176 0:000011:A3=A1:D3=D7 0:$1177 0:000011:A4=A4:D7=D3 ld (d2ar),a1++ // *handle=ptr a1->zdata dtmp 0:$1178 0:000011:A1=A7:D1=D7 0:$1179 0:000011:A3=A3:D3=D7 inc a0 // a0->qdata 0:$117A 0:000011:A1=A3:D8=D4 ld alu,d0 0:$117B 0:010011:A2=A2:D3=D4 jsr memcpy 0:$117C 0:000011:A1=A2:D1=D0 0:$117D 0:data:reset=0:$5180 0:$117E 0:000011:A1=A1:D0=D0 0:$117F d15:data:reset=0:$414B 1:$116F 1:000011:A1=A7:D0=D0 then 1:$1170 d15:data:reset=0:$5180 1:$116C 1:000011:A1=A7:D0=D0 then 1:$116D d15:data:reset=0:$5180 0:$1180 0:010011:A5=A5:D8=D1 pop alu // rval=handle 0:$1181 0:000011:A0=A0:D0=D1 next_op // post 0:$1182 d15:data:reset=0:$0000 :RIGHTSTR ( str len -- str ) login 0:$10C8 0:001010:A1=A0:D2=D8 ld io,alu,d_bits=10 // * login TODO // memcnt 0:$10C9 0:000011:A6=A1:D3=D0 ld atmp,$ // * TODO 0:$10CA 0:data:reset=0:$50C9 0:$10CB 0:000011:A1=A0:D0=D0 jp TODO // * TODO 0:$10CC d15:data:reset=0:$697C 0:$10CD 0:000011:A1=A5:DF=D1 ld d2ar,(hp) // delay 0:$10CE 0:000011:A1=A5:DF=D1 ld d2ar,(hp) // handle 0:$10CF 0:000011:A1=A7:D7=D1 ld a1,(d2ar) :z // a1=ptr dtmp 0:$10D0 z:000011:A4=A1:D3=D7 if 0 0:$10D1 0:001100:A1=A4:D3=D1 cmp (a1) // len-str.len 0:$10D2 0:001100:A1=A4:D3=D1 0:$10D3 cy:000011:A1=A4:D4=D8 ld d0,alu :cy // d0=len if 0 // !cy => cy => len2 < str1.len => return lhandle for copied data 0:$10D4 0:010011:A2=A2:D3=D8 jsr new_data_with_size // d0=len a1=ptr 0:$10D5 0:000011:A1=A2:D1=D0 0:$10D6 0:data:reset=0:$50D9 0:$10D7 0:000011:A1=A0:D0=D0 0:$10D8 d15:data:reset=0:$420A 0:$10D9 0:010011:A5=A5:DF=D1 pop d2ar // handle 0:$10DA 0:000011:A1=A7:D7=D1 ld a0,(d2ar) // a0=qptr dtmp 0:$10DB 0:000011:A3=A1:D3=D7 0:$10DC 0:000011:A4=A4:D7=D3 ld (d2ar),a1++ // *handle=ptr a1->zdata dtmp 0:$10DD 0:000011:A1=A7:D1=D7 0:$10DE 0:000011:A3=A3:D8=D1 ld alu,(a0++) // alu=qlen, a0->qdata 0:$10DF 0:001100:A1=A3:D3=D4 sub d0 // alu=qlen-len 0:$10E0 0:001100:A1=A3:D8=D4 0:$10E1 0:000000:A1=A3:D3=D3 add a0 // alu->qdata+qlen-len 0:$10E2 0:000000:A1=A3:D8=D3 0:$10E3 0:000011:A3=A1:D3=D8 ld a0,alu // a0->qdata+qlen-len 0:$10E4 0:000011:A1=A1:D8=D4 ld alu,d0 // alu=len 0:$10E5 0:010011:A2=A2:D3=D4 pshr DROP // pop alu + next_op 0:$10E6 0:000011:A1=A2:D1=D0 0:$10E7 0:data:reset=0:$5F47 0:$10E8 0:000011:A1=A7:D0=D0 jp memcpy 0:$10E9 d15:data:reset=0:$414B // else // cy => !cy => len ? str.len => return self // pop alu // rval=handle // next_op // post 1:$10D4 1:000011:A1=A7:D0=D0 then 1:$10D5 d15:data:reset=0:$50EA 1:$10D1 1:000011:A1=A7:D0=D0 then 1:$10D2 d15:data:reset=0:$50EA 0:$10EA 0:010011:A5=A5:D8=D1 pop alu // rval=handle 0:$10EB 0:000011:A0=A0:D0=D1 next_op // post 0:$10EC d15:data:reset=0:$0000 :MIDSTR ( str pos len -- str ) login 0:$1048 0:001010:A1=A0:D2=D8 ld io,alu,d_bits=10 // * login TODO // memcnt 0:$1049 0:000011:A6=A1:D3=D0 ld atmp,$ // * TODO 0:$104A 0:data:reset=0:$5049 0:$104B 0:000011:A1=A0:D0=D0 jp TODO // * TODO 0:$104C d15:data:reset=0:$697C 0:$104D 0:000011:A1=A1:D4=D8 ld d0,alu // d0=zlen 0:$104E 0:010011:A5=A5:D5=D1 ld d1,(hp--) // d1=pos 0:$104F 0:000011:A1=A5:DF=D1 ld d2ar,(hp) // delay 0:$1050 0:000011:A1=A5:DF=D1 ld d2ar,(hp) // handle 0:$1051 0:000011:A1=A7:D7=D1 ld a0,(d2ar) :z // a0=ptr dtmp 0:$1052 z:000011:A3=A1:D3=D7 if 0 0:$1053 0:000011:A1=A3:D6=D1 ld d2,(a0) // d2=qlen 0:$1054 0:000011:A1=A3:D8=D5 ld alu,d1 // alu=pos 0:$1055 0:001100:A1=A3:D3=D6 cmp d2 // pos-qlen 0:$1056 0:001100:A1=A3:D3=D6 0:$1057 cy:data:reset=0:$0000 if cy // cy => !cy => pos-qlen?0 => pos?qlen => return emptystr 1:$1058 1:000011:A1=A7:D0=D0 1:$1059 d15:data:reset=0:$506F 0:$106F 0:010011:A5=A5:D8=D1 pop alu // alu=rval=handle 0:$1070 0:000011:A3=A1:D3=D8 ld a0,alu // a0=handle 0:$1071 0:000011:A1=A3:D1=D0 ld (a0),null 0:$1072 0:data:reset=0:$001B 0:$1073 0:000011:A0=A0:D0=D1 next_op 0:$1074 d15:data:reset=0:$0000 else // pos < qlen 0:$1058 0:000000:A1=A0:D3=D4 add d0 // alu=pos+zlen 0:$1059 0:000000:A1=A0:D8=D4 0:$105A 0:001100:A1=A0:D3=D6 cmp d2 // pos+zlen-qlen 0:$105B 0:001100:A1=A0:D3=D6 0:$105C cy:data:reset=0:$0000 if cy // cy => !cy => pos+zlen-qlen?0 => pos+zlen?qlen => zlen = qlen-pos 1:$105D 1:000011:A1=A7:D8=D6 ld alu,d2 // alu=qlen 1:$105E 1:001100:A1=A7:D3=D5 sub d1 // alu=qlen-pos=zlen 1:$105F 1:001100:A1=A7:D8=D5 1:$1060 1:000011:A1=A7:D4=D8 ld d0,alu // d0=zlen 0:$105D 0:000011:A1=A0:D0=D0 then 0:$105E d15:data:reset=0:$D061 1:$1061 1:010011:A2=A2:D3=D8 jsr new_data_with_size // in:d0 out:a1=ptr 1:$1062 1:000011:A1=A2:D1=D0 1:$1063 1:data:reset=0:$D066 1:$1064 1:000011:A1=A0:D0=D0 1:$1065 d15:data:reset=0:$420A 1:$1066 1:010011:A5=A5:DF=D1 pop d2ar // d2ar=handle 1:$1067 1:000011:A1=A7:D7=D1 ld a0,(d2ar) // a0=qptr dtmp 1:$1068 1:000011:A3=A1:D3=D7 1:$1069 1:000011:A4=A4:D7=D3 ld (d2ar),a1++ // *handle=ptr a1->zdata dtmp 1:$106A 1:000011:A1=A7:D1=D7 1:$106B 1:000011:A1=A3:D8=D3 ld alu,a0 // alu=qptr 1:$106C 1:000100:A1=A3:D3=D5 add_c d1 // alu=qdata+pos 1:$106D 1:000100:A1=A3:D8=D5 1:$106E 1:000011:A3=A1:D3=D8 ld a0,alu // a0->qdata+pos 1:$106F 1:000011:A1=A1:D8=D4 ld alu,d0 // alu=len 1:$1070 1:010011:A2=A2:D3=D4 pshr DROP // pop alu + next_op 1:$1071 1:000011:A1=A2:D1=D0 1:$1072 1:data:reset=0:$5F47 1:$1073 1:000011:A1=A7:D0=D0 jp memcpy 1:$1074 d15:data:reset=0:$414B then 1:$1053 1:000011:A1=A7:D0=D0 then 1:$1054 d15:data:reset=0:$D075 1:$1075 1:010011:A5=A5:D8=D1 pop alu // rval=handle 1:$1076 1:000011:A0=A0:D0=D1 next_op // post 1:$1077 d15:data:reset=0:$0000 :HEXSTR4 ( u16 -- str ) 0:$1ABD 0:000011:A1=A0:D4=D0 ld d0,4 // d0=digits 0:$1ABE 0:data:reset=0:$0004 0:$1ABF 0:000011:A1=A0:D0=D0 jp hexstr 0:$1AC0 d15:data:reset=0:$501F :HEXSTR3 ( u16 -- str ) 0:$1AC9 0:000011:A1=A0:D4=D0 ld d0,3 // d0=digits 0:$1ACA 0:data:reset=0:$0003 0:$1ACB 0:000011:A1=A0:D0=D0 jp hexstr 0:$1ACC d15:data:reset=0:$501F :HEXSTR2 ( u16 -- str ) 0:$1A21 0:000011:A1=A0:D4=D0 ld d0,2 // d0=digits 0:$1A22 0:data:reset=0:$0002 0:$1A23 0:000011:A1=A0:D0=D0 jp hexstr 0:$1A24 d15:data:reset=0:$501F :HEXSTR1 ( u16 -- str ) 0:$1AD1 0:000011:A1=A0:D4=D0 ld d0,1 // d0=digits 0:$1AD2 0:data:reset=0:$0001 0:$1AD3 0:000011:A1=A0:D0=D0 jp hexstr 0:$1AD4 d15:data:reset=0:$501F :HEXSTR ( u16 digits -- str ) 0:$1015 0:000011:A1=A0:D4=D0 ld d0,1 0:$1016 0:data:reset=0:$0001 0:$1017 0:001100:A1=A0:D3=D4 sub d0 // alu=digits-1 => 0..3 0:$1018 0:001100:A1=A0:D8=D4 0:$1019 0:000010:A1=A0:D8=D0 and 3 // force legal 0:$101A 0:data:reset=0:$0003 0:$101B 0:000000:A1=A0:D3=D4 add d0 // 1..4 0:$101C 0:000000:A1=A0:D8=D4 0:$101D 0:000011:A1=A0:D4=D8 ld d0,alu // d0=digits: 1..4 0:$101E 0:010011:A5=A5:D8=D1 pop alu // jp hexstr hexstr: login 0:$101F 0:001010:A1=A5:D2=D8 ld io,alu,d_bits=10 // * login TODO // memcnt 0:$1020 0:000011:A6=A1:D3=D0 ld atmp,$ // * TODO 0:$1021 0:data:reset=0:$5020 0:$1022 0:000011:A1=A0:D0=D0 jp TODO // * TODO 0:$1023 d15:data:reset=0:$697C 0:$1024 0:000011:A1=A1:D6=D8 ld d2,alu // d2=number 0:$1025 0:010011:A2=A2:D3=D8 jsr alloc // out:alu=a0=handle a1=ptr 0:$1026 0:000011:A1=A2:D1=D0 0:$1027 0:data:reset=0:$502A 0:$1028 0:000011:A1=A0:D0=D0 0:$1029 d15:data:reset=0:$4207 0:$102A 0:000011:A1=A4:D8=D3 ld alu,a1 // alu=ptr 0:$102B 0:000000:A1=A4:D3=D4 add d0 // alu->zdata+len-1 ((last char)) 0:$102C 0:000000:A1=A4:D8=D4 0:$102D 0:000011:A4=A1:D3=D8 ld a1,alu // a1->zdata.last_char 0:$102E 0:000011:A1=A1:DD=D6 ld sl,d2,nc 0:$102F d15:data:reset=0:$0000 if bit15 1:$1030 0:000111:A1=A7:DC=DD ld sr,sl,cy // sr=number else 0:$1030 0:000011:A1=A0:DC=DD ld sr,sl,nc // sr=number then 0:$1031 0:000011:A1=A0:D5=D0 ld d1,10 // d1=10 0:$1032 0:data:reset=0:$000A 0:$1033 0:000011:A1=A0:D6=D0 ld d2,'A'-10 // d2='A'-10 0:$1034 0:data:reset=0:$0037 do 0:$1035 0:000011:A1=A0:D8=DC ld alu,sr 0:$1036 0:000010:A1=A0:D8=D0 and $0F 0:$1037 0:data:reset=0:$000F 0:$1038 0:001100:A1=A0:D3=D5 cmp d1 // digit-10 0:$1039 0:001100:A1=A0:D3=D5 0:$103A cy:data:reset=0:$0000 if cy // cy => !cy => digit?10 1:$103B 1:000000:A1=A7:D3=D6 add d2 // 'A'-10 1:$103C 0:000000:A1=A7:D8=D6 else 0:$103B 0:000110:A1=A0:D8=D0 or '0' 0:$103C 0:data:reset=0:$0030 then 0:$103D 0:010011:A4=A4:D1=D8 ld (a1--),alu 0:$103E 0:000011:A1=A4:DC=DC ld sr,sr,nc 0:$103F 0:000011:A1=A4:DC=DC ld sr,sr,nc 0:$1040 0:000011:A1=A4:DC=DC ld sr,sr,nc 0:$1041 0:000011:A1=A4:DC=DC ld sr,sr,nc 0:$1042 0:001001:A1=A4:D8=D8 xorn alu // -1 0:$1043 0:000000:A1=A4:D3=D4 add d0 // d0-1 0:$1044 0:000000:A1=A4:D8=D4 0:$1045 z:000011:A1=A4:D4=D8 ld d0,alu :z 0:$1046 0:000011:A1=A4:D0=D0 while 0 0:$1047 d15:data:reset=0:$5035 1:$1046 1:000011:A1=A3:D8=D3 ld alu,a0 // rval=handle 1:$1047 1:000011:A0=A0:D0=D1 next_op // post 1:$1048 d15:data:reset=0:$0000 // ======================================================= // IO Instructions // ======================================================= :EI( -- ) 0:$19F4 0:data: ei=1:$0000 ei 0:$19F5 0:000011:A0=A0:D0=D1 next_op // post 0:$19F6 d15:data:reset=0:$0000 :DI( -- ) 0:$1A06 0:data: ei=0:$0000 di 0:$1A07 0:000011:A0=A0:D0=D1 next_op // post 0:$1A08 d15:data:reset=0:$0000 :SELECT ( i16:sel_mask -- ) // DI and SELECT DEVICE 0:$2406 0:data: ei=0:$0000 di 0:$2407 0:000001:A1=A0:D2=D8 ld io_select,alu 0:$2408 0:010011:A5=A5:D8=D1 pop alu 0:$2409 0:000011:A0=A0:D0=D1 next_op // post 0:$240A d15:data:reset=0:$0000 :SELECTI ( -- ) // DI and SELECT DEVICE 0:$1A2D 0:data: ei=0:$0000 di 0:$1A2E 0:000001:A0=A0:D2=D1 ld io_select,(ip++) 0:$1A2F 0:000011:A0=A0:D0=D1 next_op // post 0:$1A30 d15:data:reset=0:$0000 :DESELECT ( -- ) 0:$1BE3 0:000001:A1=A0:D2=D0 ld io_select,$ffff 0:$1BE4 0:data:reset=0:$FFFF 0:$1BE5 0:data: ei=1:$0000 ei 0:$1BE6 0:000011:A0=A0:D0=D1 next_op // post 0:$1BE7 d15:data:reset=0:$0000 : INI % $100 ( -- n ) // cmd_lo = address 0:$2500 0:000011:A7=A1:D3=DF ld ioaddr,cmd_lo 0:$2501 0:000011:A5=A5:D3=DF psh alu 0:$2502 0:000011:A1=A5:D1=D8 0:$2503 0:000011:A1=A5:D8=D2 ld alu,io_data 0:$2504 0:000011:A0=A0:D0=D1 next_op // post 0:$2505 d15:data:reset=0:$0000 : IN ( a -- n ) 0:$1A79 0:000011:A7=A1:D3=D8 ld ioaddr,alu 0:$1A7A 0:000011:A1=A1:D8=D2 ld alu,io_data 0:$1A7B 0:000011:A0=A0:D0=D1 next_op // post 0:$1A7C d15:data:reset=0:$0000 : INI2 % $100 ( -- n ) // cmd_lo = address 1:$0D00 1:000011:A7=A1:D3=DF ld ioaddr,cmd_lo 1:$0D01 1:000011:A5=A5:D3=DF psh alu 1:$0D02 1:000011:A1=A5:D1=D8 1:$0D03 1:data:clk/2=0:$0000 clr clock2 1:$0D04 1:000011:A1=A0:D8=D2 ld alu,io_data 1:$0D05 1:data:clk/2=1:$0000 set clock2 1:$0D06 1:000011:A0=A0:D0=D1 next_op // post 1:$0D07 d15:data:reset=0:$0000 : IN2 ( a -- n ) 0:$1C8A 0:000011:A7=A1:D3=D8 ld ioaddr,alu 0:$1C8B 0:data:clk/2=0:$0000 clr clock2 0:$1C8C 0:000011:A1=A0:D8=D2 ld alu,io_data 0:$1C8D 0:data:clk/2=1:$0000 set clock2 0:$1C8E 0:000011:A0=A0:D0=D1 next_op // post 0:$1C8F d15:data:reset=0:$0000 : INI4 % $100 ( -- n ) // cmd_lo = address 1:$1900 1:000011:A7=A1:D3=DF ld ioaddr,cmd_lo 1:$1901 1:000011:A5=A5:D3=DF psh alu 1:$1902 1:000011:A1=A5:D1=D8 1:$1903 1:data:clk/4=0:$0000 clr clock4 1:$1904 1:000011:A1=A0:D8=D2 ld alu,io_data 1:$1905 1:data:clk/4=1:$0000 set clock4 1:$1906 1:000011:A0=A0:D0=D1 next_op // post 1:$1907 d15:data:reset=0:$0000 : IN4 ( a -- n ) 0:$1C78 0:000011:A7=A1:D3=D8 ld ioaddr,alu 0:$1C79 0:data:clk/4=0:$0000 clr clock4 0:$1C7A 0:000011:A1=A0:D8=D2 ld alu,io_data 0:$1C7B 0:data:clk/4=1:$0000 set clock4 0:$1C7C 0:000011:A0=A0:D0=D1 next_op // post 0:$1C7D d15:data:reset=0:$0000 : INI8 % $100 ( -- n ) // cmd_lo = address 0:$1C00 0:000011:A7=A1:D3=DF ld ioaddr,cmd_lo 0:$1C01 0:000011:A5=A5:D3=DF psh alu 0:$1C02 0:000011:A1=A5:D1=D8 0:$1C03 0:data:clk/2=0:$0000 clr clock2 0:$1C04 0:data:clk/4=0:$0000 clr clock4 0:$1C05 0:000011:A1=A0:D8=D2 ld alu,io_data 0:$1C06 0:data:clk/4=1:$0000 set clock4 0:$1C07 0:data:clk/2=1:$0000 set clock2 0:$1C08 0:000011:A0=A0:D0=D1 next_op // post 0:$1C09 d15:data:reset=0:$0000 : IN8 ( a -- n ) 0:$1E0B 0:000011:A7=A1:D3=D8 ld ioaddr,alu 0:$1E0C 0:data:clk/2=0:$0000 clr clock2 0:$1E0D 0:data:clk/4=0:$0000 clr clock4 0:$1E0E 0:000011:A1=A0:D8=D2 ld alu,io_data 0:$1E0F 0:data:clk/4=1:$0000 set clock4 0:$1E10 0:data:clk/2=1:$0000 set clock2 0:$1E11 0:000011:A0=A0:D0=D1 next_op // post 0:$1E12 d15:data:reset=0:$0000 : OUTI % $100 ( n -- ) // cmd_lo = address 1:$0700 1:000011:A7=A1:D3=DF ld ioaddr,cmd_lo 1:$0701 1:000000:A1=A1:D2=D8 ld io_data,alu 1:$0702 1:000011:A1=A1:D2=D8 ld io_dummy,alu 1:$0703 1:010011:A5=A5:D8=D1 pop alu 1:$0704 1:000011:A0=A0:D0=D1 next_op // post 1:$0705 d15:data:reset=0:$0000 : OUT ( n a -- ) 0:$1D0A 0:000011:A7=A1:D3=D8 ld ioaddr,alu 0:$1D0B 0:010011:A5=A5:D8=D1 pop alu 0:$1D0C 0:000000:A1=A5:D2=D8 ld io_data,alu 0:$1D0D 0:000011:A1=A5:D2=D8 ld io_dummy,alu 0:$1D0E 0:010011:A5=A5:D8=D1 pop alu 0:$1D0F 0:000011:A0=A0:D0=D1 next_op // post 0:$1D10 d15:data:reset=0:$0000 : OUTI2 % $100 ( n -- ) // cmd_lo = address 1:$1C00 1:000011:A7=A1:D3=DF ld ioaddr,cmd_lo 1:$1C01 1:data:clk/2=0:$0000 clr clock2 1:$1C02 1:000000:A1=A0:D2=D8 ld io_data,alu 1:$1C03 1:000011:A1=A0:D2=D8 ld io_dummy,alu 1:$1C04 1:data:clk/2=1:$0000 set clock2 1:$1C05 1:010011:A5=A5:D8=D1 pop alu 1:$1C06 1:000011:A0=A0:D0=D1 next_op // post 1:$1C07 d15:data:reset=0:$0000 : OUT2 ( n a -- ) 0:$1E99 0:000011:A7=A1:D3=D8 ld ioaddr,alu 0:$1E9A 0:010011:A5=A5:D8=D1 pop alu 0:$1E9B 0:data:clk/2=0:$0000 clr clock2 0:$1E9C 0:000000:A1=A0:D2=D8 ld io_data,alu 0:$1E9D 0:000011:A1=A0:D2=D8 ld io_dummy,alu 0:$1E9E 0:data:clk/2=1:$0000 set clock2 0:$1E9F 0:010011:A5=A5:D8=D1 pop alu 0:$1EA0 0:000011:A0=A0:D0=D1 next_op // post 0:$1EA1 d15:data:reset=0:$0000 : OUTI4 % $100 ( n -- ) // cmd_lo = address 0:$2200 0:000011:A7=A1:D3=DF ld ioaddr,cmd_lo 0:$2201 0:data:clk/4=0:$0000 clr clock4 0:$2202 0:000000:A1=A0:D2=D8 ld io_data,alu 0:$2203 0:000011:A1=A0:D2=D8 ld io_dummy,alu 0:$2204 0:data:clk/4=1:$0000 set clock4 0:$2205 0:010011:A5=A5:D8=D1 pop alu 0:$2206 0:000011:A0=A0:D0=D1 next_op // post 0:$2207 d15:data:reset=0:$0000 : OUT4 ( n a -- ) 0:$1EC6 0:000011:A7=A1:D3=D8 ld ioaddr,alu 0:$1EC7 0:010011:A5=A5:D8=D1 pop alu 0:$1EC8 0:data:clk/4=0:$0000 clr clock4 0:$1EC9 0:000000:A1=A0:D2=D8 ld io_data,alu 0:$1ECA 0:000011:A1=A0:D2=D8 ld io_dummy,alu 0:$1ECB 0:data:clk/4=1:$0000 set clock4 0:$1ECC 0:010011:A5=A5:D8=D1 pop alu 0:$1ECD 0:000011:A0=A0:D0=D1 next_op // post 0:$1ECE d15:data:reset=0:$0000 : OUTI8 % $100 ( n -- ) // cmd_lo = address 1:$1D00 1:000011:A7=A1:D3=DF ld ioaddr,cmd_lo 1:$1D01 1:data:clk/2=0:$0000 clr clock2 1:$1D02 1:data:clk/4=0:$0000 clr clock4 1:$1D03 1:000000:A1=A0:D2=D8 ld io_data,alu 1:$1D04 1:000011:A1=A0:D2=D8 ld io_dummy,alu 1:$1D05 1:data:clk/4=1:$0000 set clock4 1:$1D06 1:data:clk/2=1:$0000 set clock2 1:$1D07 1:010011:A5=A5:D8=D1 pop alu 1:$1D08 1:000011:A0=A0:D0=D1 next_op // post 1:$1D09 d15:data:reset=0:$0000 : OUT8 ( n a -- ) 0:$1F75 0:000011:A7=A1:D3=D8 ld ioaddr,alu 0:$1F76 0:010011:A5=A5:D8=D1 pop alu 0:$1F77 0:data:clk/2=0:$0000 clr clock2 0:$1F78 0:data:clk/4=0:$0000 clr clock4 0:$1F79 0:000000:A1=A0:D2=D8 ld io_data,alu 0:$1F7A 0:000011:A1=A0:D2=D8 ld io_dummy,alu 0:$1F7B 0:data:clk/4=1:$0000 set clock4 0:$1F7C 0:data:clk/2=1:$0000 set clock2 0:$1F7D 0:010011:A5=A5:D8=D1 pop alu 0:$1F7E 0:000011:A0=A0:D0=D1 next_op // post 0:$1F7F d15:data:reset=0:$0000 :BIN8 ( bu[]¢ i n a -- ) // in ( bu[?] io_addr -- ) login 0:$1BA2 0:001010:A1=A1:D2=D8 ld io,alu,d_bits=10 // * login TODO 0:$1BA3 0:000011:A6=A1:D3=D0 ld atmp,$ // * TODO 0:$1BA4 0:data:reset=0:$5BA3 0:$1BA5 0:000011:A1=A3:D0=D0 jp TODO // * TODO 0:$1BA6 d15:data:reset=0:$697C :BIN4 ( bu[]¢ i n a -- ) // in ( bu[?] io_addr -- ) login 0:$1BB6 0:001010:A1=A1:D2=D8 ld io,alu,d_bits=10 // * login TODO 0:$1BB7 0:000011:A6=A1:D3=D0 ld atmp,$ // * TODO 0:$1BB8 0:data:reset=0:$5BB7 0:$1BB9 0:000011:A1=A3:D0=D0 jp TODO // * TODO 0:$1BBA d15:data:reset=0:$697C :BIN2 ( bu[]¢ i n a -- ) // in ( bu[?] io_addr -- ) login 0:$1B98 0:001010:A1=A1:D2=D8 ld io,alu,d_bits=10 // * login TODO 0:$1B99 0:000011:A6=A1:D3=D0 ld atmp,$ // * TODO 0:$1B9A 0:data:reset=0:$5B99 0:$1B9B 0:000011:A1=A3:D0=D0 jp TODO // * TODO 0:$1B9C d15:data:reset=0:$697C :BIN ( bu[]¢ i n a -- ) // in ( bu[?] io_addr -- ) login 0:$1B5C 0:001010:A1=A0:D2=D8 ld io,alu,d_bits=10 // * login TODO 0:$1B5D 0:000011:A6=A1:D3=D0 ld atmp,$ // * TODO 0:$1B5E 0:data:reset=0:$5B5D 0:$1B5F 0:000011:A1=A3:D0=D0 jp TODO // * TODO 0:$1B60 d15:data:reset=0:$697C :BOUT8 ( bu[]¢ i n a -- ) // out ( bu[?] io_addr -- ) login 0:$1BA7 0:001010:A1=A1:D2=D8 ld io,alu,d_bits=10 // * login TODO 0:$1BA8 0:000011:A6=A1:D3=D0 ld atmp,$ // * TODO 0:$1BA9 0:data:reset=0:$5BA8 0:$1BAA 0:000011:A1=A3:D0=D0 jp TODO // * TODO 0:$1BAB d15:data:reset=0:$697C :BOUT4 ( bu[]¢ i n a -- ) // out ( bu[?] io_addr -- ) login 0:$1B8E 0:001010:A1=A0:D2=D8 ld io,alu,d_bits=10 // * login TODO 0:$1B8F 0:000011:A6=A1:D3=D0 ld atmp,$ // * TODO 0:$1B90 0:data:reset=0:$5B8F 0:$1B91 0:000011:A1=A3:D0=D0 jp TODO // * TODO 0:$1B92 d15:data:reset=0:$697C :BOUT2 ( bu[]¢ i n a -- ) // out ( bu[?] io_addr -- ) login 0:$1B70 0:001010:A1=A0:D2=D8 ld io,alu,d_bits=10 // * login TODO 0:$1B71 0:000011:A6=A1:D3=D0 ld atmp,$ // * TODO 0:$1B72 0:data:reset=0:$5B71 0:$1B73 0:000011:A1=A3:D0=D0 jp TODO // * TODO 0:$1B74 d15:data:reset=0:$697C :BOUT ( bu[]¢ i n a -- ) // out ( bu[?] io_addr -- ) login 0:$1B66 0:001010:A1=A0:D2=D8 ld io,alu,d_bits=10 // * login TODO 0:$1B67 0:000011:A6=A1:D3=D0 ld atmp,$ // * TODO 0:$1B68 0:data:reset=0:$5B67 0:$1B69 0:000011:A1=A3:D0=D0 jp TODO // * TODO 0:$1B6A d15:data:reset=0:$697C :FBOUT8 ( bu[]¢ i n a -- ) // out ( bu[?] io_addr -- ) login 0:$1B7F 0:001010:A1=A0:D2=D8 ld io,alu,d_bits=10 // * login TODO 0:$1B80 0:000011:A6=A1:D3=D0 ld atmp,$ // * TODO 0:$1B81 0:data:reset=0:$5B80 0:$1B82 0:000011:A1=A3:D0=D0 jp TODO // * TODO 0:$1B83 d15:data:reset=0:$697C :FBOUT4 ( bu[]¢ i n a -- ) // out ( bu[?] io_addr -- ) login 0:$1B93 0:001010:A1=A1:D2=D8 ld io,alu,d_bits=10 // * login TODO 0:$1B94 0:000011:A6=A1:D3=D0 ld atmp,$ // * TODO 0:$1B95 0:data:reset=0:$5B94 0:$1B96 0:000011:A1=A3:D0=D0 jp TODO // * TODO 0:$1B97 d15:data:reset=0:$697C :FBOUT2 ( bu[]¢ i n a -- ) // out ( bu[?] io_addr -- ) login 0:$1B9D 0:001010:A1=A1:D2=D8 ld io,alu,d_bits=10 // * login TODO 0:$1B9E 0:000011:A6=A1:D3=D0 ld atmp,$ // * TODO 0:$1B9F 0:data:reset=0:$5B9E 0:$1BA0 0:000011:A1=A3:D0=D0 jp TODO // * TODO 0:$1BA1 d15:data:reset=0:$697C :FBOUT ( bu[]¢ i n a -- ) // out ( bu[?] io_addr -- ) login 0:$1B84 0:001010:A1=A1:D2=D8 ld io,alu,d_bits=10 // * login TODO 0:$1B85 0:000011:A6=A1:D3=D0 ld atmp,$ // * TODO 0:$1B86 0:data:reset=0:$5B85 0:$1B87 0:000011:A1=A3:D0=D0 jp TODO // * TODO 0:$1B88 d15:data:reset=0:$697C // multi-Drop: // DROP0-i3 -> drop i3 words // :DROP8 ( x x x x x x x x -- ) 0:$1F40 0:010011:A5=A5:D8=D1 pop alu 0:$1F41 0:010011:A5=A5:D8=D1 pop alu 0:$1F42 0:010011:A5=A5:D8=D1 pop alu 0:$1F43 0:010011:A5=A5:D8=D1 pop alu 0:$1F44 0:010011:A5=A5:D8=D1 pop alu 0:$1F45 0:010011:A5=A5:D8=D1 pop alu 0:$1F46 0:010011:A5=A5:D8=D1 pop alu 0:$1F47 0:010011:A5=A5:D8=D1 pop alu 0:$1F48 0:000011:A0=A0:D0=D1 DROP0: next_op 0:$1F49 d15:data:reset=0:$0000 :DROP8_RET ( x x x x x x x x -- ) 0:$1FAC 0:010011:A5=A5:D8=D1 pop alu 0:$1FAD 0:010011:A5=A5:D8=D1 pop alu 0:$1FAE 0:010011:A5=A5:D8=D1 pop alu 0:$1FAF 0:010011:A5=A5:D8=D1 pop alu 0:$1FB0 0:010011:A5=A5:D8=D1 pop alu 0:$1FB1 0:010011:A5=A5:D8=D1 pop alu 0:$1FB2 0:010011:A5=A5:D8=D1 pop alu 0:$1FB3 0:010011:A5=A5:D8=D1 pop alu DROP0_RET: 0:$1FB4 0:000011:A2=A2:D7=D1 popr ip // dtmp 0:$1FB5 0:000011:A0=A1:D3=D7 0:$1FB6 0:000011:A0=A0:D0=D1 next_op 0:$1FB7 d15:data:reset=0:$0000 // multi-Nip: // NIP0-i3 -> nip i3 words over int16 // :NIP8 ( x x x x x x x x a -- a ) 0:$1EE2 0:010011:A5=A5:D3=D8 dec hp 0:$1EE3 0:010011:A5=A5:D3=D8 dec hp 0:$1EE4 0:010011:A5=A5:D3=D8 dec hp 0:$1EE5 0:010011:A5=A5:D3=D8 dec hp 0:$1EE6 0:010011:A5=A5:D3=D8 dec hp 0:$1EE7 0:010011:A5=A5:D3=D8 dec hp 0:$1EE8 0:010011:A5=A5:D3=D8 dec hp 0:$1EE9 0:010011:A5=A5:D3=D8 dec hp 0:$1EEA 0:000011:A0=A0:D0=D1 NIP0: next_op 0:$1EEB d15:data:reset=0:$0000 :NIP8_RET ( x x x x x x x x a -- a ) 0:$1FE8 0:010011:A5=A5:D3=DD dec hp 0:$1FE9 0:010011:A5=A5:D3=DD dec hp 0:$1FEA 0:010011:A5=A5:D3=DD dec hp 0:$1FEB 0:010011:A5=A5:D3=DD dec hp 0:$1FEC 0:010011:A5=A5:D3=DD dec hp 0:$1FED 0:010011:A5=A5:D3=DD dec hp 0:$1FEE 0:010011:A5=A5:D3=DD dec hp 0:$1FEF 0:010011:A5=A5:D3=DD dec hp NIP0_RET: 0:$1FF0 0:000011:A2=A2:D7=D1 popr ip // dtmp 0:$1FF1 0:000011:A0=A1:D3=D7 0:$1FF2 0:000011:A0=A0:D0=D1 next_op 0:$1FF3 d15:data:reset=0:$0000 NIP := NIP0-1 ( a b -- b ) DROP := DROP0-1 ( x -- ) DROP2 := DROP0-2 ( x x -- ) DROP3 := DROP0-3 ( x x x -- ) DROP_RET := DROP0_RET-1 ( x -- ) DROP2_RET := DROP0_RET-2 ( x x -- ) DROP3_RET := DROP0_RET-3 ( x x x -- ) // --- file: "opcodes.asm" --- #include "stdc.cc" // +++ file: "stdc.asm" +++ // K1-16/16 Microcode // 2015-12-22 16:10:39 : hexstr__6uint16_8ucs2charAE ( uint16 -- ucs2str ) 0:$1C84 0:000011:A5=A5:D3=D8 psh alu 0:$1C85 0:000011:A1=A5:D1=D8 0:$1C86 0:000011:A1=A5:D8=D0 ld alu,4 0:$1C87 0:data:reset=0:$0004 0:$1C88 0:000011:A1=A0:D0=D0 jp hexstr__6uint16_6uint16_8ucs2charAE 0:$1C89 d15:data:reset=0:$4230 : hexstr__6uint16_6uint16_8ucs2charAE ( uint16, uint16 -- ucs2str ) /* digits=(digits-1)&3+1 str s=new str(digits) do{ while digits-- s[digits] = hexchar(number) number>>=4 } next_m s */ 0:$0230 0:000011:A1=A2:D7=D0 ld dtmp,1 0:$0231 0:data:reset=0:$0001 0:$0232 0:001100:A1=A0:D3=D7 sub dtmp 0:$0233 0:001100:A1=A0:D8=D7 0:$0234 0:000010:A1=A0:D8=D0 and 3 0:$0235 0:data:reset=0:$0003 0:$0236 0:000000:A1=A0:D3=D7 add dtmp // alu = digits 0:$0237 0:000000:A1=A0:D8=D7 0:$0238 0:000011:A1=A0:D4=D8 ld d0,alu // d0=digits 0:$0239 0:010011:A2=A2:D3=D8 jsr alloc // alu=a0=handle a1=memptr 0:$023A 0:000011:A1=A2:D1=D0 0:$023B 0:data:reset=0:$423E 0:$023C 0:000011:A1=A2:D0=D0 0:$023D d15:data:reset=0:$4207 0:$023E 0:000011:A6=A1:D3=D4 ld atmp,d0 // atmp = digits 0:$023F 0:000011:A1=A1:D8=D4 ld alu,d0 0:$0240 0:000000:A1=A4:D3=D3 add a1 // alu -> last digit 0:$0241 0:000000:A1=A4:D8=D3 0:$0242 0:010011:A5=A5:DD=D1 ld sl,(hp--),nc // pop sr 0:$0243 d15:000011:A4=A1:D3=D8 ld a1,alu :bit15 // a1 -> last digit if 1 1:$0244 0:000111:A1=A7:DC=DD ld sr,sl,cy // pop sr ctd. else 0:$0244 0:000011:A1=A1:DC=DD ld sr,sl,nc // pop sr ctd. then 0:$0245 0:000011:A1=A1:D7=D0 ld dtmp,9 0:$0246 0:data:reset=0:$0009 0:$0247 0:000011:A1=A0:D0=D0 jp p1 0:$0248 d15:data:reset=0:$4256 do 0:$0249 0:000011:A1=A2:D8=DC ld alu,sr 0:$024A 0:000010:A1=A2:D8=D0 and $F 0:$024B 0:data:reset=0:$000F 0:$024C 0:001000:A1=A0:D3=D7 cmp_nc dtmp // cmp 9 0:$024D 0:001000:A1=A0:D3=D7 0:$024E cy:000110:A1=A0:D8=D0 or ival :cy if 1 // cy => !cy => alu?10 1:$024F 1:data:reset=0:$0040 dw $40 1:$0250 0:001100:A1=A0:D8=D7 nop,alu.clk,dtmp.oe,sub // alu -= 'A'-$40-10 $4A..$4F -> 'A'..'F' else 0:$024F 0:data:reset=0:$0030 dw '0' // => '0'..'9' 0:$0250 0:data:reset=0:$0000 then 0:$0251 0:010011:A4=A4:D1=D8 ld (a1--),alu 0:$0252 0:000011:A1=A4:DC=DC ld sr,sr,nc 0:$0253 0:000011:A1=A4:DC=DC ld sr,sr,nc 0:$0254 0:000011:A1=A4:DC=DC ld sr,sr,nc 0:$0255 0:000011:A1=A4:DC=DC ld sr,sr,nc 0:$0256 0:010011:A6=A6:D3=D3 p1 tst atmp-- 0:$0257 z:data:reset=0:$0000 while !z 0:$0258 0:000011:A1=A0:D0=D0 0:$0259 d15:data:reset=0:$4249 1:$0258 1:000011:A1=A3:D8=D3 ld alu,a0 // rval = str handle next_m 1:$0259 1:000011:A0=A0:D0=D3 next_mc // * next_m 1:$025A d15:000011:A1=A0:D0=D0 : numstr__5int16_8ucs2charAE ( int16 -- ucs2str ) Millicoded // Size: 19 microcodes 0:$2453 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$2454 0:data:reset=0:$6457 0:$2455 0:000011:A1=A4:D0=D0 jp millicoded // * Millicoded 0:$2456 d15:data:reset=0:$5F70 0:$2457 d15:data:reset=0:$45F6 mc Dup 0:$2458 d15:data:reset=0:$0D00 mc Int8+0 0:$2459 d15:data:reset=0:$C2E0 mc Lt 0:$245A d15:data:reset=0:$0608 mc BraIf0+8 0:$245B d15:data:reset=0:$0F01 mc Istr+1 0:$245C 0:data:reset=0:$002D dm '-' 0:$245D 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$245E d15:data:reset=0:$18FF mc Lget+255 0:$245F d15:data:reset=0:$5C6D mc Neg 0:$2460 d15:data:reset=0:$6900 mc numstr__6uint16_8ucs2charAE 0:$2461 d15:data:reset=0:$6AAF mc CatStrStr 0:$2462 d15:data:reset=0:$0202 mc Bra+2 0:$2463 d15:data:reset=0:$45F6 mc Dup 0:$2464 d15:data:reset=0:$6900 mc numstr__6uint16_8ucs2charAE 0:$2465 d15:data:reset=0:$6310 mc MNip0_Next-1 : numstr__6uint16_8ucs2charAE ( uint16 -- ucs2str ) Millicoded // Size: 30 microcodes 0:$2900 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$2901 0:data:reset=0:$6904 0:$2902 0:000011:A1=A1:D0=D0 jp millicoded // * Millicoded 0:$2903 d15:data:reset=0:$5F70 0:$2904 d15:data:reset=0:$45F6 mc Dup 0:$2905 d15:data:reset=0:$4504 mc Log10 0:$2906 d15:data:reset=0:$0B01 mc Addq+1 0:$2907 d15:data:reset=0:$45F6 mc Dup 0:$2908 d15:data:reset=0:$4203 mc Alloc 0:$2909 d15:data:reset=0:$0D30 mc Int8+48 0:$290A d15:data:reset=0:$18FD mc Lget+253 0:$290B d15:data:reset=0:$0D0A mc Int8+10 0:$290C d15:data:reset=0:$5AE9 mc Remu 0:$290D d15:data:reset=0:$5AAD mc Add 0:$290E d15:data:reset=0:$18FF mc Lget+255 0:$290F d15:data:reset=0:$07FD mc Lvar+253 0:$2910 d15:data:reset=0:$5D58 mc mmPeek 0:$2911 d15:data:reset=0:$5E87 mc AtIndexPoke 0:$2912 d15:data:reset=0:$0D0A mc Int8+10 0:$2913 d15:data:reset=0:$07FD mc Lvar+253 0:$2914 d15:data:reset=0:$5CF2 mc DivuPoke 0:$2915 d15:data:reset=0:$18FE mc Lget+254 0:$2916 d15:data:reset=0:$03F2 mc BraIf1-14 0:$2917 d15:data:reset=0:$45F6 mc Dup 0:$2918 d15:data:reset=0:$4667 mc Retain 0:$2919 d15:data:reset=0:$5FA7 mc ToR 0:$291A d15:data:reset=0:$4581 mc DropStr 0:$291B d15:data:reset=0:$5F32 mc MDrop0-2 0:$291C d15:data:reset=0:$5F9C mc FromR 0:$291D d15:data:reset=0:$5ACD mc Ret : abort__8ucs2charAE_ ( ucs2str ) Millicoded // Size: 20 microcodes 0:$24EC 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$24ED 0:data:reset=0:$64F0 0:$24EE 0:000011:A1=A4:D0=D0 jp millicoded // * Millicoded 0:$24EF d15:data:reset=0:$5F70 0:$24F0 d15:data:reset=0:$0F08 mc Istr+8 0:$24F1 0:data:reset=0:$000A dm 10 0:$24F2 0:data:reset=0:$0041 dm 'A' 0:$24F3 0:data:reset=0:$0062 dm 'b' 0:$24F4 0:data:reset=0:$006F dm 'o' 0:$24F5 0:data:reset=0:$0072 dm 'r' 0:$24F6 0:data:reset=0:$0074 dm 't' 0:$24F7 0:data:reset=0:$003A dm ':' 0:$24F8 0:data:reset=0:$0020 dm ' ' 0:$24F9 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$24FA d15:data:reset=0:$46D2 mc LogStr 0:$24FB d15:data:reset=0:$45F6 mc Dup 0:$24FC d15:data:reset=0:$4672 mc LogCstr 0:$24FD d15:data:reset=0:$6984 mc Abort 0:$24FE d15:data:reset=0:$4581 mc DropStr 0:$24FF d15:data:reset=0:$5ACD mc Ret : PANIC__8ucs2charAE_ ( ucs2str ) Millicoded // Size: 20 microcodes 0:$24D8 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$24D9 0:data:reset=0:$64DC 0:$24DA 0:000011:A1=A4:D0=D0 jp millicoded // * Millicoded 0:$24DB d15:data:reset=0:$5F70 0:$24DC d15:data:reset=0:$0F08 mc Istr+8 0:$24DD 0:data:reset=0:$000A dm 10 0:$24DE 0:data:reset=0:$0050 dm 'P' 0:$24DF 0:data:reset=0:$0061 dm 'a' 0:$24E0 0:data:reset=0:$006E dm 'n' 0:$24E1 0:data:reset=0:$0069 dm 'i' 0:$24E2 0:data:reset=0:$0063 dm 'c' 0:$24E3 0:data:reset=0:$003A dm ':' 0:$24E4 0:data:reset=0:$0020 dm ' ' 0:$24E5 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$24E6 d15:data:reset=0:$46D2 mc LogStr 0:$24E7 d15:data:reset=0:$45F6 mc Dup 0:$24E8 d15:data:reset=0:$4672 mc LogCstr 0:$24E9 d15:data:reset=0:$6980 mc Panic 0:$24EA d15:data:reset=0:$4581 mc DropStr 0:$24EB d15:data:reset=0:$5ACD mc Ret : op__MOD__5int16_6uint16_5int16 ( int16, uint16 -- int16 ) Millicoded // Size: 19 microcodes 0:$248C 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$248D 0:data:reset=0:$6490 0:$248E 0:000011:A1=A4:D0=D0 jp millicoded // * Millicoded 0:$248F d15:data:reset=0:$5F70 0:$2490 d15:data:reset=0:$18FF mc Lget+255 0:$2491 d15:data:reset=0:$0D00 mc Int8+0 0:$2492 d15:data:reset=0:$C2E0 mc Lt 0:$2493 d15:data:reset=0:$0606 mc BraIf0+6 0:$2494 d15:data:reset=0:$18FF mc Lget+255 0:$2495 d15:data:reset=0:$5C6D mc Neg 0:$2496 d15:data:reset=0:$18FF mc Lget+255 0:$2497 d15:data:reset=0:$5AE9 mc Remu 0:$2498 d15:data:reset=0:$5C6D mc Neg 0:$2499 d15:data:reset=0:$0203 mc Bra+3 0:$249A d15:data:reset=0:$18FF mc Lget+255 0:$249B d15:data:reset=0:$18FF mc Lget+255 0:$249C d15:data:reset=0:$5AE9 mc Remu 0:$249D d15:data:reset=0:$8EFF mc Lset+255 0:$249E d15:data:reset=0:$5FFB mc MDrop0_Next-1 : op__GE__6uint16_5int16_4bool ( uint16, int16 -- bool ) Millicoded // Size: 13 microcodes 0:$21C9 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$21CA 0:data:reset=0:$61CD 0:$21CB 0:000011:A1=A1:D0=D0 jp millicoded // * Millicoded 0:$21CC d15:data:reset=0:$5F70 0:$21CD d15:data:reset=0:$45F6 mc Dup 0:$21CE d15:data:reset=0:$0D00 mc Int8+0 0:$21CF d15:data:reset=0:$C2E0 mc Lt 0:$21D0 d15:data:reset=0:$47F1 mc Or1 0:$21D1 d15:data:reset=0:$0203 mc Bra+3 0:$21D2 d15:data:reset=0:$18FF mc Lget+255 0:$21D3 d15:data:reset=0:$18FF mc Lget+255 0:$21D4 d15:data:reset=0:$46C6 mc Uge 0:$21D5 d15:data:reset=0:$630F mc MNip0_Next-2 : op__GT__6uint16_5int16_4bool ( uint16, int16 -- bool ) Millicoded // Size: 13 microcodes 0:$20BF 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$20C0 0:data:reset=0:$60C3 0:$20C1 0:000011:A1=A0:D0=D0 jp millicoded // * Millicoded 0:$20C2 d15:data:reset=0:$5F70 0:$20C3 d15:data:reset=0:$45F6 mc Dup 0:$20C4 d15:data:reset=0:$0D00 mc Int8+0 0:$20C5 d15:data:reset=0:$C2E0 mc Lt 0:$20C6 d15:data:reset=0:$47F1 mc Or1 0:$20C7 d15:data:reset=0:$0203 mc Bra+3 0:$20C8 d15:data:reset=0:$18FF mc Lget+255 0:$20C9 d15:data:reset=0:$18FF mc Lget+255 0:$20CA d15:data:reset=0:$C6C6 mc Ugt 0:$20CB d15:data:reset=0:$630F mc MNip0_Next-2 : op__LE__6uint16_5int16_4bool ( uint16, int16 -- bool ) Millicoded // Size: 13 microcodes 0:$21BC 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$21BD 0:data:reset=0:$61C0 0:$21BE 0:000011:A1=A1:D0=D0 jp millicoded // * Millicoded 0:$21BF d15:data:reset=0:$5F70 0:$21C0 d15:data:reset=0:$45F6 mc Dup 0:$21C1 d15:data:reset=0:$0D00 mc Int8+0 0:$21C2 d15:data:reset=0:$42D4 mc Ge 0:$21C3 d15:data:reset=0:$47E5 mc And0 0:$21C4 d15:data:reset=0:$0203 mc Bra+3 0:$21C5 d15:data:reset=0:$18FF mc Lget+255 0:$21C6 d15:data:reset=0:$18FF mc Lget+255 0:$21C7 d15:data:reset=0:$C6CC mc Ule 0:$21C8 d15:data:reset=0:$630F mc MNip0_Next-2 : op__LT__6uint16_5int16_4bool ( uint16, int16 -- bool ) Millicoded // Size: 13 microcodes 0:$2161 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$2162 0:data:reset=0:$6165 0:$2163 0:000011:A1=A1:D0=D0 jp millicoded // * Millicoded 0:$2164 d15:data:reset=0:$5F70 0:$2165 d15:data:reset=0:$45F6 mc Dup 0:$2166 d15:data:reset=0:$0D00 mc Int8+0 0:$2167 d15:data:reset=0:$42D4 mc Ge 0:$2168 d15:data:reset=0:$47E5 mc And0 0:$2169 d15:data:reset=0:$0203 mc Bra+3 0:$216A d15:data:reset=0:$18FF mc Lget+255 0:$216B d15:data:reset=0:$18FF mc Lget+255 0:$216C d15:data:reset=0:$46CC mc Ult 0:$216D d15:data:reset=0:$630F mc MNip0_Next-2 : op__LE__5int16_6uint16_4bool ( int16, uint16 -- bool ) Millicoded // Size: 13 microcodes 0:$21A2 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$21A3 0:data:reset=0:$61A6 0:$21A4 0:000011:A1=A1:D0=D0 jp millicoded // * Millicoded 0:$21A5 d15:data:reset=0:$5F70 0:$21A6 d15:data:reset=0:$18FF mc Lget+255 0:$21A7 d15:data:reset=0:$0D00 mc Int8+0 0:$21A8 d15:data:reset=0:$C2E0 mc Lt 0:$21A9 d15:data:reset=0:$47F1 mc Or1 0:$21AA d15:data:reset=0:$0203 mc Bra+3 0:$21AB d15:data:reset=0:$18FF mc Lget+255 0:$21AC d15:data:reset=0:$18FF mc Lget+255 0:$21AD d15:data:reset=0:$C6CC mc Ule 0:$21AE d15:data:reset=0:$630F mc MNip0_Next-2 : op__LT__5int16_6uint16_4bool ( int16, uint16 -- bool ) Millicoded // Size: 13 microcodes 0:$21AF 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$21B0 0:data:reset=0:$61B3 0:$21B1 0:000011:A1=A1:D0=D0 jp millicoded // * Millicoded 0:$21B2 d15:data:reset=0:$5F70 0:$21B3 d15:data:reset=0:$18FF mc Lget+255 0:$21B4 d15:data:reset=0:$0D00 mc Int8+0 0:$21B5 d15:data:reset=0:$C2E0 mc Lt 0:$21B6 d15:data:reset=0:$47F1 mc Or1 0:$21B7 d15:data:reset=0:$0203 mc Bra+3 0:$21B8 d15:data:reset=0:$18FF mc Lget+255 0:$21B9 d15:data:reset=0:$18FF mc Lget+255 0:$21BA d15:data:reset=0:$46CC mc Ult 0:$21BB d15:data:reset=0:$630F mc MNip0_Next-2 : op__GT__5int16_6uint16_4bool ( int16, uint16 -- bool ) Millicoded // Size: 13 microcodes 0:$2120 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$2121 0:data:reset=0:$6124 0:$2122 0:000011:A1=A1:D0=D0 jp millicoded // * Millicoded 0:$2123 d15:data:reset=0:$5F70 0:$2124 d15:data:reset=0:$18FF mc Lget+255 0:$2125 d15:data:reset=0:$0D00 mc Int8+0 0:$2126 d15:data:reset=0:$42D4 mc Ge 0:$2127 d15:data:reset=0:$47E5 mc And0 0:$2128 d15:data:reset=0:$0203 mc Bra+3 0:$2129 d15:data:reset=0:$18FF mc Lget+255 0:$212A d15:data:reset=0:$18FF mc Lget+255 0:$212B d15:data:reset=0:$C6C6 mc Ugt 0:$212C d15:data:reset=0:$630F mc MNip0_Next-2 : op__GE__5int16_6uint16_4bool ( int16, uint16 -- bool ) Millicoded // Size: 13 microcodes 0:$20E6 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$20E7 0:data:reset=0:$60EA 0:$20E8 0:000011:A1=A0:D0=D0 jp millicoded // * Millicoded 0:$20E9 d15:data:reset=0:$5F70 0:$20EA d15:data:reset=0:$18FF mc Lget+255 0:$20EB d15:data:reset=0:$0D00 mc Int8+0 0:$20EC d15:data:reset=0:$42D4 mc Ge 0:$20ED d15:data:reset=0:$47E5 mc And0 0:$20EE d15:data:reset=0:$0203 mc Bra+3 0:$20EF d15:data:reset=0:$18FF mc Lget+255 0:$20F0 d15:data:reset=0:$18FF mc Lget+255 0:$20F1 d15:data:reset=0:$46C6 mc Uge 0:$20F2 d15:data:reset=0:$630F mc MNip0_Next-2 : op__EQ__5int16_6uint16_4bool ( int16, uint16 -- bool ) Millicoded // Size: 13 microcodes 0:$2064 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$2065 0:data:reset=0:$6068 0:$2066 0:000011:A1=A0:D0=D0 jp millicoded // * Millicoded 0:$2067 d15:data:reset=0:$5F70 0:$2068 d15:data:reset=0:$18FF mc Lget+255 0:$2069 d15:data:reset=0:$18FF mc Lget+255 0:$206A d15:data:reset=0:$47DF mc Eq 0:$206B d15:data:reset=0:$47E5 mc And0 0:$206C d15:data:reset=0:$0203 mc Bra+3 0:$206D d15:data:reset=0:$18FF mc Lget+255 0:$206E d15:data:reset=0:$0D00 mc Int8+0 0:$206F d15:data:reset=0:$42D4 mc Ge 0:$2070 d15:data:reset=0:$630F mc MNip0_Next-2 : op__NE__5int16_6uint16_4bool ( int16, uint16 -- bool ) Millicoded // Size: 13 microcodes 0:$2113 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$2114 0:data:reset=0:$6117 0:$2115 0:000011:A1=A1:D0=D0 jp millicoded // * Millicoded 0:$2116 d15:data:reset=0:$5F70 0:$2117 d15:data:reset=0:$18FF mc Lget+255 0:$2118 d15:data:reset=0:$18FF mc Lget+255 0:$2119 d15:data:reset=0:$47D5 mc Ne 0:$211A d15:data:reset=0:$47F1 mc Or1 0:$211B d15:data:reset=0:$0203 mc Bra+3 0:$211C d15:data:reset=0:$18FF mc Lget+255 0:$211D d15:data:reset=0:$0D00 mc Int8+0 0:$211E d15:data:reset=0:$C2E0 mc Lt 0:$211F d15:data:reset=0:$630F mc MNip0_Next-2 : op__EQ__6uint16_5int16_4bool ( uint16, int16 -- bool ) Millicoded // Size: 13 microcodes 0:$207E 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$207F 0:data:reset=0:$6082 0:$2080 0:000011:A1=A0:D0=D0 jp millicoded // * Millicoded 0:$2081 d15:data:reset=0:$5F70 0:$2082 d15:data:reset=0:$45F6 mc Dup 0:$2083 d15:data:reset=0:$18FE mc Lget+254 0:$2084 d15:data:reset=0:$47DF mc Eq 0:$2085 d15:data:reset=0:$47E5 mc And0 0:$2086 d15:data:reset=0:$0203 mc Bra+3 0:$2087 d15:data:reset=0:$45F6 mc Dup 0:$2088 d15:data:reset=0:$0D00 mc Int8+0 0:$2089 d15:data:reset=0:$42D4 mc Ge 0:$208A d15:data:reset=0:$630F mc MNip0_Next-2 : op__NE__6uint16_5int16_4bool ( uint16, int16 -- bool ) Millicoded // Size: 13 microcodes 0:$2071 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$2072 0:data:reset=0:$6075 0:$2073 0:000011:A1=A0:D0=D0 jp millicoded // * Millicoded 0:$2074 d15:data:reset=0:$5F70 0:$2075 d15:data:reset=0:$45F6 mc Dup 0:$2076 d15:data:reset=0:$18FE mc Lget+254 0:$2077 d15:data:reset=0:$47D5 mc Ne 0:$2078 d15:data:reset=0:$47F1 mc Or1 0:$2079 d15:data:reset=0:$0203 mc Bra+3 0:$207A d15:data:reset=0:$45F6 mc Dup 0:$207B d15:data:reset=0:$0D00 mc Int8+0 0:$207C d15:data:reset=0:$C2E0 mc Lt 0:$207D d15:data:reset=0:$630F mc MNip0_Next-2 : hexchar__6uint16_5int16 ( uint16 -- int16 ) // n&=$F next_m n>9u ? 'A'-10+n : '0'+n 0:$0732 0:000010:A1=A0:D8=D0 and $F 0:$0733 0:data:reset=0:$000F 0:$0734 0:000011:A1=A0:D7=D0 ld dtmp,9 0:$0735 0:data:reset=0:$0009 0:$0736 0:001000:A1=A0:D3=D7 cmp_nc dtmp 0:$0737 0:001000:A1=A0:D3=D7 0:$0738 cy:000110:A1=A0:D8=D0 or ival :cy if 1 // cy => !cy => alu?10 1:$0739 1:data:reset=0:$0040 dw $40 1:$073A 0:001100:A1=A0:D8=D7 nop,alu.clk,dtmp.oe,sub // alu += 'A'-$40-10: $4A..$4F -> 'A'..'F' else 0:$0739 0:data:reset=0:$0030 dw '0' // => '0'..'9' 0:$073A 0:data:reset=0:$0000 then next_m 0:$073B 0:000011:A0=A0:D0=D3 next_mc // * next_m 0:$073C d15:000011:A1=A0:D0=D0 : catstr__8ucs2charAE_8ucs2charAE_8ucs2charAE ( ucs2str, ucs2str -- ucs2str ) Millicoded // Size: 37 microcodes 0:$2AAF 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$2AB0 0:data:reset=0:$6AB3 0:$2AB1 0:000011:A1=A2:D0=D0 jp millicoded // * Millicoded 0:$2AB2 d15:data:reset=0:$5F70 0:$2AB3 d15:data:reset=0:$18FF mc Lget+255 0:$2AB4 d15:data:reset=0:$482D mc Count 0:$2AB5 d15:data:reset=0:$18FF mc Lget+255 0:$2AB6 d15:data:reset=0:$482D mc Count 0:$2AB7 d15:data:reset=0:$18FF mc Lget+255 0:$2AB8 d15:data:reset=0:$18FF mc Lget+255 0:$2AB9 d15:data:reset=0:$5AAD mc Add 0:$2ABA d15:data:reset=0:$4203 mc Alloc 0:$2ABB d15:data:reset=0:$45F6 mc Dup 0:$2ABC d15:data:reset=0:$0D00 mc Int8+0 0:$2ABD d15:data:reset=0:$5E2E mc AtIndex 0:$2ABE d15:data:reset=0:$18FB mc Lget+251 0:$2ABF d15:data:reset=0:$0D00 mc Int8+0 0:$2AC0 d15:data:reset=0:$5E2E mc AtIndex 0:$2AC1 d15:data:reset=0:$18FC mc Lget+252 0:$2AC2 d15:data:reset=0:$476D mc TradMemCpy 0:$2AC3 d15:data:reset=0:$45F6 mc Dup 0:$2AC4 d15:data:reset=0:$18FD mc Lget+253 0:$2AC5 d15:data:reset=0:$5E2E mc AtIndex 0:$2AC6 d15:data:reset=0:$18FC mc Lget+252 0:$2AC7 d15:data:reset=0:$0D00 mc Int8+0 0:$2AC8 d15:data:reset=0:$5E2E mc AtIndex 0:$2AC9 d15:data:reset=0:$18FD mc Lget+253 0:$2ACA d15:data:reset=0:$476D mc TradMemCpy 0:$2ACB d15:data:reset=0:$45F6 mc Dup 0:$2ACC d15:data:reset=0:$4667 mc Retain 0:$2ACD d15:data:reset=0:$07FB mc Lvar+251 0:$2ACE d15:data:reset=0:$7A05 mc SwapWithVar 0:$2ACF d15:data:reset=0:$4581 mc DropStr 0:$2AD0 d15:data:reset=0:$4581 mc DropStr 0:$2AD1 d15:data:reset=0:$5F32 mc MDrop0-2 0:$2AD2 d15:data:reset=0:$4581 mc DropStr 0:$2AD3 d15:data:reset=0:$5ACD mc Ret // --- file: "stdc.asm" --- #include "long.cc" // +++ file: "long.asm" +++ // K1-16/16 Microcode // 2015-12-22 16:10:39 : abs__5int32_6uint32 ( int32 -- uint32 ) Millicoded // Size: 20 microcodes 0:$2536 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$2537 0:data:reset=0:$653A 0:$2538 0:000011:A1=A5:D0=D0 jp millicoded // * Millicoded 0:$2539 d15:data:reset=0:$5F70 0:$253A d15:data:reset=0:$07FF mc Lvar+255 0:$253B d15:data:reset=0:$5CD6 mc Peek2 0:$253C d15:data:reset=0:$0D00 mc Int8+0 0:$253D d15:data:reset=0:$0D00 mc Int8+0 0:$253E d15:data:reset=0:$4791 mc GeL 0:$253F d15:data:reset=0:$0603 mc BraIf0+3 0:$2540 d15:data:reset=0:$07FF mc Lvar+255 0:$2541 d15:data:reset=0:$5CD6 mc Peek2 0:$2542 d15:data:reset=0:$0203 mc Bra+3 0:$2543 d15:data:reset=0:$07FF mc Lvar+255 0:$2544 d15:data:reset=0:$5CD6 mc Peek2 0:$2545 d15:data:reset=0:$47A2 mc NegL 0:$2546 d15:data:reset=0:$5FA4 mc ToR2 0:$2547 d15:data:reset=0:$5F32 mc MDrop0-2 0:$2548 d15:data:reset=0:$5F99 mc FromR2 0:$2549 d15:data:reset=0:$5ACD mc Ret : min__6uint32_6uint32_6uint32 ( uint32, uint32 -- uint32 ) Millicoded // Size: 18 microcodes 0:$2441 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$2442 0:data:reset=0:$6445 0:$2443 0:000011:A1=A4:D0=D0 jp millicoded // * Millicoded 0:$2444 d15:data:reset=0:$5F70 0:$2445 d15:data:reset=0:$07FD mc Lvar+253 0:$2446 d15:data:reset=0:$5CD6 mc Peek2 0:$2447 d15:data:reset=0:$07FD mc Lvar+253 0:$2448 d15:data:reset=0:$5CD6 mc Peek2 0:$2449 d15:data:reset=0:$46A0 mc LtUL 0:$244A d15:data:reset=0:$0603 mc BraIf0+3 0:$244B d15:data:reset=0:$07FD mc Lvar+253 0:$244C d15:data:reset=0:$5CD6 mc Peek2 0:$244D d15:data:reset=0:$0202 mc Bra+2 0:$244E d15:data:reset=0:$07FF mc Lvar+255 0:$244F d15:data:reset=0:$5CD6 mc Peek2 0:$2450 d15:data:reset=0:$07FB mc Lvar+251 0:$2451 d15:data:reset=0:$5E23 mc Poke2 0:$2452 d15:data:reset=0:$5FFA mc MDrop0_Next-2 : random__6uint32 ( -- uint32 ) Millicoded 0:$1E04 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$1E05 0:data:reset=0:$5E08 0:$1E06 0:000011:A1=A6:D0=D0 jp millicoded // * Millicoded 0:$1E07 d15:data:reset=0:$5F70 0:$1E08 d15:data:reset=0:$4532 mc random__6uint16 0:$1E09 d15:data:reset=0:$4532 mc random__6uint16 0:$1E0A d15:data:reset=0:$5ACD mc Next : hexstr__6uint32_6uint16_8ucs2charAE ( uint32, uint16 -- ucs2str ) Millicoded // Size: 27 microcodes 0:$27AC 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$27AD 0:data:reset=0:$67B0 0:$27AE 0:000011:A1=A7:D0=D0 jp millicoded // * Millicoded 0:$27AF d15:data:reset=0:$5F70 0:$27B0 d15:data:reset=0:$45F6 mc Dup 0:$27B1 d15:data:reset=0:$0C01 mc Subq+1 0:$27B2 d15:data:reset=0:$0D07 mc Int8+7 0:$27B3 d15:data:reset=0:$5A0F mc And 0:$27B4 d15:data:reset=0:$0B01 mc Addq+1 0:$27B5 d15:data:reset=0:$5F29 mc Nip 0:$27B6 d15:data:reset=0:$45F6 mc Dup 0:$27B7 d15:data:reset=0:$0D04 mc Int8+4 0:$27B8 d15:data:reset=0:$C6C6 mc Ugt 0:$27B9 d15:data:reset=0:$0609 mc BraIf0+9 0:$27BA d15:data:reset=0:$18FE mc Lget+254 0:$27BB d15:data:reset=0:$18FF mc Lget+255 0:$27BC d15:data:reset=0:$0C04 mc Subq+4 0:$27BD d15:data:reset=0:$4230 mc hexstr__6uint16_6uint16_8ucs2charAE 0:$27BE d15:data:reset=0:$18FE mc Lget+254 0:$27BF d15:data:reset=0:$0D04 mc Int8+4 0:$27C0 d15:data:reset=0:$4230 mc hexstr__6uint16_6uint16_8ucs2charAE 0:$27C1 d15:data:reset=0:$6AAF mc CatStrStr 0:$27C2 d15:data:reset=0:$0203 mc Bra+3 0:$27C3 d15:data:reset=0:$18FF mc Lget+255 0:$27C4 d15:data:reset=0:$18FF mc Lget+255 0:$27C5 d15:data:reset=0:$4230 mc hexstr__6uint16_6uint16_8ucs2charAE 0:$27C6 d15:data:reset=0:$630E mc MNip0_Next-3 : numstr__5int32_8ucs2charAE ( int32 -- ucs2str ) Millicoded // Size: 21 microcodes 0:$2573 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$2574 0:data:reset=0:$6577 0:$2575 0:000011:A1=A5:D0=D0 jp millicoded // * Millicoded 0:$2576 d15:data:reset=0:$5F70 0:$2577 d15:data:reset=0:$18FF mc Lget+255 0:$2578 d15:data:reset=0:$0D00 mc Int8+0 0:$2579 d15:data:reset=0:$C2E0 mc Lt 0:$257A d15:data:reset=0:$0609 mc BraIf0+9 0:$257B d15:data:reset=0:$0F01 mc Istr+1 0:$257C 0:data:reset=0:$002D dm '-' 0:$257D 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$257E d15:data:reset=0:$07FE mc Lvar+254 0:$257F d15:data:reset=0:$5CD6 mc Peek2 0:$2580 d15:data:reset=0:$47A2 mc NegL 0:$2581 d15:data:reset=0:$7B7E mc numstr__6uint32_8ucs2charAE 0:$2582 d15:data:reset=0:$6AAF mc CatStrStr 0:$2583 d15:data:reset=0:$0203 mc Bra+3 0:$2584 d15:data:reset=0:$07FF mc Lvar+255 0:$2585 d15:data:reset=0:$5CD6 mc Peek2 0:$2586 d15:data:reset=0:$7B7E mc numstr__6uint32_8ucs2charAE 0:$2587 d15:data:reset=0:$630F mc MNip0_Next-2 : numstr__6uint32_8ucs2charAE ( uint32 -- ucs2str ) Millicoded // Size: 132 microcodes 0:$3B7E 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$3B7F 0:data:reset=0:$7B82 0:$3B80 0:000011:A1=A3:D0=D0 jp millicoded // * Millicoded 0:$3B81 d15:data:reset=0:$5F70 0:$3B82 d15:data:reset=0:$18FF mc Lget+255 0:$3B83 d15:data:reset=0:$0679 mc BraIf0+121 0:$3B84 d15:data:reset=0:$0D00 mc Int8+0 0:$3B85 d15:data:reset=0:$0D00 mc Int8+0 0:$3B86 d15:data:reset=0:$0D00 mc Int8+0 0:$3B87 d15:data:reset=0:$0D00 mc Int8+0 0:$3B88 d15:data:reset=0:$07FB mc Lvar+251 0:$3B89 d15:data:reset=0:$5CD6 mc Peek2 0:$3B8A d15:data:reset=0:$0D9A mc Int8+154 0:$3B8B d15:data:reset=0:$0E3B mc Int16+59 0:$3B8C d15:data:reset=0:$0D00 mc Int8+0 0:$3B8D d15:data:reset=0:$0ECA mc Int16+202 0:$3B8E d15:data:reset=0:$468B mc GeUL 0:$3B8F d15:data:reset=0:$0621 mc BraIf0+33 0:$3B90 d15:data:reset=0:$0D31 mc Int8+49 0:$3B91 d15:data:reset=0:$8EFF mc Lset+255 0:$3B92 d15:data:reset=0:$0D9A mc Int8+154 0:$3B93 d15:data:reset=0:$0E3B mc Int16+59 0:$3B94 d15:data:reset=0:$0D00 mc Int8+0 0:$3B95 d15:data:reset=0:$0ECA mc Int16+202 0:$3B96 d15:data:reset=0:$07F9 mc Lvar+249 0:$3B97 d15:data:reset=0:$601C mc SubPokeL 0:$3B98 d15:data:reset=0:$07FB mc Lvar+251 0:$3B99 d15:data:reset=0:$5CD6 mc Peek2 0:$3B9A d15:data:reset=0:$0D9A mc Int8+154 0:$3B9B d15:data:reset=0:$0E3B mc Int16+59 0:$3B9C d15:data:reset=0:$0D00 mc Int8+0 0:$3B9D d15:data:reset=0:$0ECA mc Int16+202 0:$3B9E d15:data:reset=0:$468B mc GeUL 0:$3B9F d15:data:reset=0:$0604 mc BraIf0+4 0:$3BA0 d15:data:reset=0:$0D01 mc Int8+1 0:$3BA1 d15:data:reset=0:$07FE mc Lvar+254 0:$3BA2 d15:data:reset=0:$5DA8 mc AddPoke 0:$3BA3 d15:data:reset=0:$01EE mc Bra-18 0:$3BA4 d15:data:reset=0:$0D0A mc Int8+10 0:$3BA5 d15:data:reset=0:$8EFD mc Lset+253 0:$3BA6 d15:data:reset=0:$0D0A mc Int8+10 0:$3BA7 d15:data:reset=0:$4203 mc Alloc 0:$3BA8 d15:data:reset=0:$07FF mc Lvar+255 0:$3BA9 d15:data:reset=0:$7A05 mc SwapWithVar 0:$3BAA d15:data:reset=0:$4581 mc DropStr 0:$3BAB d15:data:reset=0:$18FF mc Lget+255 0:$3BAC d15:data:reset=0:$18FF mc Lget+255 0:$3BAD d15:data:reset=0:$07FC mc Lvar+252 0:$3BAE d15:data:reset=0:$5DB0 mc Peekpp 0:$3BAF d15:data:reset=0:$5E87 mc AtIndexPoke 0:$3BB0 d15:data:reset=0:$021D mc Bra+29 0:$3BB1 d15:data:reset=0:$0D09 mc Int8+9 0:$3BB2 d15:data:reset=0:$8EFD mc Lset+253 0:$3BB3 d15:data:reset=0:$07FB mc Lvar+251 0:$3BB4 d15:data:reset=0:$5CD6 mc Peek2 0:$3BB5 d15:data:reset=0:$0DF5 mc Int8+245 0:$3BB6 d15:data:reset=0:$0E05 mc Int16+5 0:$3BB7 d15:data:reset=0:$0D00 mc Int8+0 0:$3BB8 d15:data:reset=0:$0EE1 mc Int16+225 0:$3BB9 d15:data:reset=0:$46A0 mc LtUL 0:$3BBA d15:data:reset=0:$060E mc BraIf0+14 0:$3BBB d15:data:reset=0:$0D01 mc Int8+1 0:$3BBC d15:data:reset=0:$07FC mc Lvar+252 0:$3BBD d15:data:reset=0:$5E33 mc SubPoke 0:$3BBE d15:data:reset=0:$07FB mc Lvar+251 0:$3BBF d15:data:reset=0:$5CD6 mc Peek2 0:$3BC0 d15:data:reset=0:$07F9 mc Lvar+249 0:$3BC1 d15:data:reset=0:$6040 mc AddPokeL 0:$3BC2 d15:data:reset=0:$07FB mc Lvar+251 0:$3BC3 d15:data:reset=0:$5CD6 mc Peek2 0:$3BC4 d15:data:reset=0:$0D02 mc Int8+2 0:$3BC5 d15:data:reset=0:$456D mc SlL 0:$3BC6 d15:data:reset=0:$07F9 mc Lvar+249 0:$3BC7 d15:data:reset=0:$6040 mc AddPokeL 0:$3BC8 d15:data:reset=0:$01EA mc Bra-22 0:$3BC9 d15:data:reset=0:$18FD mc Lget+253 0:$3BCA d15:data:reset=0:$4203 mc Alloc 0:$3BCB d15:data:reset=0:$07FF mc Lvar+255 0:$3BCC d15:data:reset=0:$7A05 mc SwapWithVar 0:$3BCD d15:data:reset=0:$4581 mc DropStr 0:$3BCE d15:data:reset=0:$18FE mc Lget+254 0:$3BCF d15:data:reset=0:$18FC mc Lget+252 0:$3BD0 d15:data:reset=0:$46CC mc Ult 0:$3BD1 d15:data:reset=0:$0624 mc BraIf0+36 0:$3BD2 d15:data:reset=0:$0D30 mc Int8+48 0:$3BD3 d15:data:reset=0:$8EFF mc Lset+255 0:$3BD4 d15:data:reset=0:$07FB mc Lvar+251 0:$3BD5 d15:data:reset=0:$5CD6 mc Peek2 0:$3BD6 d15:data:reset=0:$0DF5 mc Int8+245 0:$3BD7 d15:data:reset=0:$0E05 mc Int16+5 0:$3BD8 d15:data:reset=0:$0D00 mc Int8+0 0:$3BD9 d15:data:reset=0:$0EE1 mc Int16+225 0:$3BDA d15:data:reset=0:$468B mc GeUL 0:$3BDB d15:data:reset=0:$060A mc BraIf0+10 0:$3BDC d15:data:reset=0:$0D01 mc Int8+1 0:$3BDD d15:data:reset=0:$07FE mc Lvar+254 0:$3BDE d15:data:reset=0:$5DA8 mc AddPoke 0:$3BDF d15:data:reset=0:$0DF5 mc Int8+245 0:$3BE0 d15:data:reset=0:$0E05 mc Int16+5 0:$3BE1 d15:data:reset=0:$0D00 mc Int8+0 0:$3BE2 d15:data:reset=0:$0EE1 mc Int16+225 0:$3BE3 d15:data:reset=0:$07F9 mc Lvar+249 0:$3BE4 d15:data:reset=0:$601C mc SubPokeL 0:$3BE5 d15:data:reset=0:$01EE mc Bra-18 0:$3BE6 d15:data:reset=0:$18FF mc Lget+255 0:$3BE7 d15:data:reset=0:$18FF mc Lget+255 0:$3BE8 d15:data:reset=0:$07FC mc Lvar+252 0:$3BE9 d15:data:reset=0:$5DB0 mc Peekpp 0:$3BEA d15:data:reset=0:$5E87 mc AtIndexPoke 0:$3BEB d15:data:reset=0:$07FB mc Lvar+251 0:$3BEC d15:data:reset=0:$5CD6 mc Peek2 0:$3BED d15:data:reset=0:$07F9 mc Lvar+249 0:$3BEE d15:data:reset=0:$6040 mc AddPokeL 0:$3BEF d15:data:reset=0:$07FB mc Lvar+251 0:$3BF0 d15:data:reset=0:$5CD6 mc Peek2 0:$3BF1 d15:data:reset=0:$0D02 mc Int8+2 0:$3BF2 d15:data:reset=0:$456D mc SlL 0:$3BF3 d15:data:reset=0:$07F9 mc Lvar+249 0:$3BF4 d15:data:reset=0:$6040 mc AddPokeL 0:$3BF5 d15:data:reset=0:$01D8 mc Bra-40 0:$3BF6 d15:data:reset=0:$45F6 mc Dup 0:$3BF7 d15:data:reset=0:$4667 mc Retain 0:$3BF8 d15:data:reset=0:$5FA7 mc ToR 0:$3BF9 d15:data:reset=0:$4581 mc DropStr 0:$3BFA d15:data:reset=0:$5F31 mc MDrop0-3 0:$3BFB d15:data:reset=0:$5F9C mc FromR 0:$3BFC d15:data:reset=0:$0204 mc Bra+4 0:$3BFD d15:data:reset=0:$07FF mc Lvar+255 0:$3BFE d15:data:reset=0:$0B01 mc Addq+1 0:$3BFF d15:data:reset=0:$5AC5 mc Peek 0:$3C00 d15:data:reset=0:$6900 mc numstr__6uint16_8ucs2charAE 0:$3C01 d15:data:reset=0:$630F mc MNip0_Next-2 : new__5int16_5int32 ( int16 -- int32 ) 0:$07F7 0:000011:A1=A0:D3=D8 tst alu 0:$07F8 0:000011:A5=A5:D3=D8 psh ival :bit15 0:$07F9 d15:000011:A1=A5:D1=D0 if 0 0:$07FA 0:data:reset=0:$0000 dw 0 else 1:$07FA 0:data:reset=0:$FFFF dw $ffff then next_m 0:$07FB 0:000011:A0=A0:D0=D3 next_mc // * next_m 0:$07FC d15:000011:A1=A0:D0=D0 : new__6uint16_6uint32 ( uint16 -- uint32 ) 0:$1B75 0:000011:A5=A5:D3=DC psh 0 0:$1B76 0:000011:A1=A5:D1=D0 0:$1B77 0:data:reset=0:$0000 next_m 0:$1B78 0:000011:A0=A0:D0=D3 next_mc // * next_m 0:$1B79 d15:000011:A1=A0:D0=D0 : msbit__5int32_5int16 ( int32 -- int16 ) // next_m n.h ? msbit(n.h)+16 : msbit(n.l) 0:$0751 0:000011:A1=A5:D3=D1 tst (hp) // delay 0:$0752 0:000011:A1=A5:D3=D1 tst (hp) 0:$0753 z:010011:A5=A5:D7=D1 pop dtmp :z if 1 1:$0754 1:001011:A1=A7:D8=D8 ldn alu 1:$0755 1:000011:A1=A7:DE=D8 ld msbit,alu 1:$0756 1:000011:A1=A7:D8=DE ld alu,msbit next_m 1:$0757 1:000011:A0=A0:D0=D3 next_mc // * next_m 1:$0758 d15:000011:A1=A0:D0=D0 else 0:$0754 0:001011:A1=A5:D8=D7 ldn dtmp 0:$0755 0:000011:A1=A5:DE=D8 ld msbit,alu 0:$0756 0:000011:A1=A5:D8=DE ld alu,msbit 0:$0757 0:000110:A1=A5:D8=D0 or 16 0:$0758 0:data:reset=0:$0010 next_m 0:$0759 0:000011:A0=A0:D0=D3 next_mc // * next_m 0:$075A d15:000011:A1=A0:D0=D0 then : mulu_16_32__6uint16_6uint16_6uint32 ( uint16, uint16 -- uint32 ) // ulong r,c // if a>b swap(a,b) // sort: a < b // c.l=b // do{ // while a // if a&1 r += c // a >>= 1 // c <<= 1 // } // next_m r 0:$03AE 0:000011:A1=A5:D4=D1 ld d0,(hp) // d0 = a; alu = b 0:$03AF 0:001000:A1=A5:D3=D4 cmp_nc d0 // b-a-1 0:$03B0 0:001000:A1=A5:D3=D4 0:$03B1 cy:data:reset=0:$0000 if cy // cy => !cy => alu?d0+1 => swap 1:$03B2 1:000011:A1=A7:D4=D8 ld d0,alu // d0 = alu 1:$03B3 0:000011:A1=A5:D8=D1 ld alu,(hp) // alu = d0 0:$03B2 0:data:reset=0:$0000 then // alu = a ? d0 = b = c.l 0:$03B3 0:data:reset=0:$0000 0:$03B4 0:000011:A1=A0:DD=D0 ld sl,0,nc // sl,d0 = c 0:$03B5 0:data:reset=0:$0000 0:$03B6 0:000011:A1=A0:D5=DD ld d1,sl 0:$03B7 0:000011:A1=A0:D6=DD ld d2,sl // d2.d1 = r 0:$03B8 0:000011:A1=A0:DC=D8 ld sr,alu,nc // sr = a 0:$03B9 d0:000011:A1=A0:D0=D0 ld cmd,ival :bit0 if 1 1:$03BA d15:data:reset=0:$C3BD dw a :bit15 else 0:$03BA d15:data:reset=0:$C3C5 dw na :bit15 then do // while a != 0 0:$03BB 0:000011:A1=A3:DC=DC ld sr,sr,nc // next bit 0:$03BC d0:data:reset=0:$0000 if bit0 // if a&1 then r += c 1:$03BD 1:000011:A1=A7:D8=D4 a ld alu,d0 1:$03BE 1:000000:A1=A7:D3=D5 add d1 1:$03BF 1:000000:A1=A7:D8=D5 1:$03C0 cy:000011:A1=A7:D5=D8 ld d1,alu :cy if 1 1:$03C1 1:000011:A1=A7:D8=DD ld alu,sl 1:$03C2 1:000100:A1=A7:D3=D6 add_c d2 1:$03C3 1:000100:A1=A7:D8=D6 else 0:$03C1 0:000011:A1=A7:D8=DD ld alu,sl 0:$03C2 0:000000:A1=A7:D3=D6 add d2 0:$03C3 1:000000:A1=A7:D8=D6 then 1:$03C4 1:000011:A1=A7:D6=D8 ld d2,alu 0:$03BD 0:000011:A1=A0:D0=D0 then 0:$03BE d15:data:reset=0:$C3C5 // c <<= 1 1:$03C5 1:000011:A1=A7:D8=D4 na ld alu,d0 // alu = c.l 1:$03C6 1:000000:A1=A7:D8=D8 add alu // nodelay 1:$03C7 cy:000011:A1=A7:D4=D8 ld d0,alu : cy // c.l <<= 1 if 1 1:$03C8 1:000111:A1=A7:DD=DD ld sl,sl,cy // c.h <<= 1 + cy else 0:$03C8 1:000011:A1=A7:DD=DD ld sl,sl,nc then 1:$03C9 1:000011:A1=A7:D3=DC tst sr // a == 0? 1:$03CA z:data:reset=0:$0000 while !z // no => loop 0:$03CB 0:000011:A1=A7:D0=D0 0:$03CC d15:data:reset=0:$43BB // result = d2.d1 1:$03CB 1:000011:A1=A5:D1=D6 ld (hp),d2 1:$03CC 1:000011:A1=A5:D8=D5 ld alu,d1 next_m 1:$03CD 1:000011:A0=A0:D0=D3 next_mc // * next_m 1:$03CE d15:000011:A1=A0:D0=D0 : mul10__6uint32_6uint32 ( uint32 -- uint32 ) 0:$0547 0:000000:A1=A0:D8=D8 add alu // nodelay 0:$0548 cy:data:reset=0:$0000 if cy 1:$0549 0:000111:A1=A5:DD=D1 ld sl,(hp),cy else 0:$0549 0:000011:A1=A5:DD=D1 ld sl,(hp),nc // sl.alu = x*2 then 0:$054A 0:000011:A1=A5:D4=D8 ld d0,alu 0:$054B 0:000011:A1=A5:D5=DD ld d1,sl // d1.d0 = x*2 0:$054C 0:000000:A1=A5:D8=D8 add alu // nodelay 0:$054D cy:data:reset=0:$0000 if cy 1:$054E 0:000111:A1=A7:DD=DD ld sl,sl,cy else 0:$054E 0:000011:A1=A0:DD=DD ld sl,sl,nc // sl.alu = x*4 then 0:$054F 0:000000:A1=A0:D8=D8 add alu // nodelay 0:$0550 cy:data:reset=0:$0000 if cy 1:$0551 0:000111:A1=A7:DD=DD ld sl,sl,cy else 0:$0551 0:000011:A1=A0:DD=DD ld sl,sl,nc // sl.alu = x*8 then 0:$0552 0:000000:A1=A0:D3=D4 add d0 0:$0553 0:000000:A1=A0:D8=D4 0:$0554 cy:000011:A1=A0:D4=D8 ld d0,alu :cy if 1 1:$0555 1:000011:A1=A7:D8=DD ld alu,sl 1:$0556 1:000100:A1=A7:D3=D5 add_c d1 1:$0557 0:000100:A1=A7:D8=D5 else 0:$0555 0:000011:A1=A0:D8=DD ld alu,sl 0:$0556 0:000000:A1=A0:D3=D5 add d1 0:$0557 0:000000:A1=A0:D8=D5 then 0:$0558 0:000011:A1=A5:D1=D8 ld (hp),alu 0:$0559 0:000011:A1=A5:D8=D4 ld alu,d0 next_m 0:$055A 0:000011:A0=A0:D0=D3 next_mc // * next_m 0:$055B d15:000011:A1=A0:D0=D0 : exp10l__6uint16_6uint32 ( uint16 -- uint32 ) // if x<=4 next_m exp10 uint(x) // next_m x<=6 ? x==5?100000:1000000 : x==7?10000000:x==8?100000000:1000000000 0:$0283 0:001100:A1=A1:D7=D0 cmp 10 // dtmp 0:$0284 0:data:reset=0:$000A 0:$0285 0:001100:A1=A0:D3=D7 0:$0286 0:001100:A1=A0:D3=D7 0:$0287 cy:data:reset=0:$0000 if !cy // !cy => cy => x<10 0:$0288 0:000000:A1=A0:D8=D8 add alu // nodelay 0:$0289 0:000000:A1=A0:D7=D0 add tab1 // dtmp 0:$028A 0:data:reset=0:$4290 0:$028B 0:000000:A1=A2:D3=D7 0:$028C 0:000000:A1=A2:D8=D7 0:$028D 0:000011:A5=A5:D3=D7 inc hp // prepare psh 0:$028E 0:000011:A1=A5:D0=D8 ld cmd,alu 0:$028F d15:000011:A1=A5:D1=D0 ld (hp),ival :bit15 0:$0290 0:data:reset=0:$0000 tab1 dm 0,0,0,0,0, 1e5>>16, 1e6>>16, 1e7>>16, 1e8>>16, 1e9>>16 0:$0291 0:data:reset=0:$0000 0:$0292 0:data:reset=0:$0000 0:$0293 0:data:reset=0:$0000 0:$0294 0:data:reset=0:$0000 0:$0295 0:data:reset=0:$0001 0:$0296 0:data:reset=0:$000F 0:$0297 0:data:reset=0:$0098 0:$0298 0:data:reset=0:$05F5 0:$0299 0:data:reset=0:$3B9A 0:$029A 0:000000:A1=A3:D7=D0 add tab2-tab1 // dtmp 0:$029B 0:data:reset=0:$0010 0:$029C 0:000000:A1=A0:D3=D7 0:$029D 0:000000:A1=A0:D8=D7 0:$029E 0:000011:A1=A0:D0=D8 ld cmd,alu 0:$029F d15:000011:A1=A0:D8=D0 ld alu,ival :bit15 0:$02A0 0:data:reset=0:$0001 tab2 dm 1,10,100,1e3,1e4, 1e5&$ffff, 1e6&$ffff, 1e7&$ffff, 1e8&$ffff, 1e9&$ffff 0:$02A1 0:data:reset=0:$000A 0:$02A2 0:data:reset=0:$0064 0:$02A3 0:data:reset=0:$03E8 0:$02A4 0:data:reset=0:$2710 0:$02A5 0:data:reset=0:$86A0 0:$02A6 0:data:reset=0:$4240 0:$02A7 0:data:reset=0:$9680 0:$02A8 0:data:reset=0:$E100 0:$02A9 0:data:reset=0:$CA00 else 1:$0288 1:000001:A1=A7:D8=D8 xor alu 1:$0289 1:000011:A5=A5:D3=D8 psh alu 1:$028A 1:000011:A1=A5:D1=D8 1:$028B 1:000011:A1=A5:D0=D0 then 1:$028C d15:data:reset=0:$42AA next_m 0:$02AA 0:000011:A0=A0:D0=D3 next_mc // * next_m 0:$02AB d15:000011:A1=A0:D0=D0 : log10__6uint32_6uint16 ( uint32 -- uint16 ) // if x.h next_m x<1000000 ? x<10?1:2 : x<10000 ? x<1000?3:4 : 5 // else next_m log10(x.l) 0:$017D 0:000011:A1=A5:D3=D1 tst (hp) // delay 0:$017E 0:010011:A5=A5:D5=D1 pop d1 0:$017F z:000011:A1=A5:D4=D8 ld d0,alu :z // x = d1.d0 1:$0180 1:000011:A1=A7:D0=D0 jp 1,Log10 // if x.h==0 next_m log10(x.l) 1:$0181 d15:data:reset=0:$4504 instr lt_32(AH,AL,NN) ld alu,AH // * lt_32 equ NN>>16 :z // * lt_32 if 1 // a.h==n.h ? // * lt_32 ld alu,AL // => compare a.l and n.l // * lt_32 ld dtmp,NN&$ffff // * lt_32 else // * lt_32 ld alu,AH // * lt_32 ld dtmp,NN>>16 // * lt_32 then // * lt_32 cmp dtmp // A-N: cy => !cy => A?N // * lt_32 ld alu,d2 :cy // !cy => cy => A>16 :z // * lt_32 0:$0183 z:data:reset=0:$0098 if 1 // a.h==n.h ? // * lt_32 1:$0184 1:000011:A1=A7:D8=D4 ld alu,d0 // => compare a.l and n.l // * lt_32 1:$0185 1:000011:A1=A7:D7=D0 ld dtmp,1e7 &$ffff // * lt_32 1:$0186 0:data:reset=0:$9680 else // * lt_32 0:$0184 0:000011:A1=A0:D8=D5 ld alu,d1 // * lt_32 0:$0185 0:000011:A1=A0:D7=D0 ld dtmp,1e7 >>16 // * lt_32 0:$0186 0:data:reset=0:$0098 then // * lt_32 0:$0187 0:001100:A1=A0:D3=D7 cmp dtmp // A-N: cy => !cy => A?N // * lt_32 0:$0188 0:001100:A1=A0:D3=D7 0:$0189 cy:000011:A1=A0:D8=D6 ld alu,d2 :cy // !cy => cy => A>16 :z // * lt_32 0:$018C z:data:reset=0:$000F if 1 // a.h==n.h ? // * lt_32 1:$018D 1:000011:A1=A7:D8=D4 ld alu,d0 // => compare a.l and n.l // * lt_32 1:$018E 1:000011:A1=A7:D7=D0 ld dtmp,1e6 &$ffff // * lt_32 1:$018F 0:data:reset=0:$4240 else // * lt_32 0:$018D 0:000011:A1=A0:D8=D5 ld alu,d1 // * lt_32 0:$018E 0:000011:A1=A0:D7=D0 ld dtmp,1e6 >>16 // * lt_32 0:$018F 0:data:reset=0:$000F then // * lt_32 0:$0190 0:001100:A1=A0:D3=D7 cmp dtmp // A-N: cy => !cy => A?N // * lt_32 0:$0191 0:001100:A1=A0:D3=D7 0:$0192 cy:000011:A1=A0:D8=D6 ld alu,d2 :cy // !cy => cy => A>16 :z // * lt_32 0:$0195 z:data:reset=0:$0001 if 1 // a.h==n.h ? // * lt_32 1:$0196 1:000011:A1=A7:D8=D4 ld alu,d0 // => compare a.l and n.l // * lt_32 1:$0197 1:000011:A1=A7:D7=D0 ld dtmp,1e5 &$ffff // * lt_32 1:$0198 0:data:reset=0:$86A0 else // * lt_32 0:$0196 0:000011:A1=A0:D8=D5 ld alu,d1 // * lt_32 0:$0197 0:000011:A1=A0:D7=D0 ld dtmp,1e5 >>16 // * lt_32 0:$0198 0:data:reset=0:$0001 then // * lt_32 0:$0199 0:001100:A1=A0:D3=D7 cmp dtmp // A-N: cy => !cy => A?N // * lt_32 0:$019A 0:001100:A1=A0:D3=D7 0:$019B cy:000011:A1=A0:D8=D6 ld alu,d2 :cy // !cy => cy => A>16 :z // * lt_32 1:$01A0 z:data:reset=0:$3B9A if 1 // a.h==n.h ? // * lt_32 1:$01A1 1:000011:A1=A3:D8=D4 ld alu,d0 // => compare a.l and n.l // * lt_32 1:$01A2 1:000011:A1=A3:D7=D0 ld dtmp,1e9 &$ffff // * lt_32 1:$01A3 1:data:reset=0:$CA00 else // * lt_32 0:$01A1 0:000011:A1=A7:D8=D5 ld alu,d1 // * lt_32 0:$01A2 0:000011:A1=A7:D7=D0 ld dtmp,1e9 >>16 // * lt_32 0:$01A3 1:data:reset=0:$3B9A then // * lt_32 1:$01A4 1:001100:A1=A2:D3=D7 cmp dtmp // A-N: cy => !cy => A?N // * lt_32 1:$01A5 1:001100:A1=A2:D3=D7 1:$01A6 cy:000011:A1=A2:D8=D6 ld alu,d2 :cy // !cy => cy => A>16 :z // * lt_32 0:$01A9 z:data:reset=0:$05F5 if 1 // a.h==n.h ? // * lt_32 1:$01AA 1:000011:A1=A7:D8=D4 ld alu,d0 // => compare a.l and n.l // * lt_32 1:$01AB 1:000011:A1=A7:D7=D0 ld dtmp,1e8 &$ffff // * lt_32 1:$01AC 0:data:reset=0:$E100 else // * lt_32 0:$01AA 0:000011:A1=A5:D8=D5 ld alu,d1 // * lt_32 0:$01AB 0:000011:A1=A5:D7=D0 ld dtmp,1e8 >>16 // * lt_32 0:$01AC 0:data:reset=0:$05F5 then // * lt_32 0:$01AD 0:001100:A1=A5:D3=D7 cmp dtmp // A-N: cy => !cy => A?N // * lt_32 0:$01AE 0:001100:A1=A5:D3=D7 0:$01AF cy:000011:A1=A5:D8=D6 ld alu,d2 :cy // !cy => cy => A(int)b.h : a.l>b.l 0:$0764 0:000011:A1=A0:D6=D8 ld d2,alu // d2=b.l 0:$0765 0:010011:A5=A5:D8=D1 pop alu,d0,dtmp // a=dtmp.d0; b=alu.d2 0:$0766 0:010011:A5=A5:D4=D1 0:$0767 0:010011:A5=A5:D7=D1 0:$0768 0:000001:A1=A5:D3=D7 equ dtmp // b.h==a.h? 0:$0769 z:000011:A1=A5:D0=D0 ld cmd,ival :z if 1 1:$076A d15:data:reset=0:$C684 dw ougt :bit15 // => (uint)a.l>(uint)b.l else 0:$076A d15:data:reset=0:$C2D5 dw ogt :bit15 // !> (int)a.h>(int)b.h (( Gt() in millicode_int.asm )) then next_m 0:$076B 0:000011:A0=A0:D0=D3 next_mc // * next_m 0:$076C d15:000011:A1=A0:D0=D0 : op__GE__5int32_5int32_5int16 ( int32, int32 -- int16 ) // next_m a.h!=b.h ? (int)a.h>(int)b.h : a.l>=b.l 0:$0791 0:000011:A1=A0:D5=D8 ld d1,alu // d1=b.l 0:$0792 0:010011:A5=A5:D8=D1 pop alu,d0,dtmp // a=dtmp.d0; b=alu.d1 0:$0793 0:010011:A5=A5:D4=D1 0:$0794 0:010011:A5=A5:D7=D1 0:$0795 0:000001:A1=A5:D3=D7 equ dtmp // b.h==a.h? 0:$0796 z:000011:A1=A5:D0=D0 ld cmd,ival :z if 1 1:$0797 d15:data:reset=0:$C691 dw ouge :bit15 // => (uint)a.l>=(uint)b.l else 0:$0797 d15:data:reset=0:$42D5 dw oge :bit15 // !> (int)a.h>=(int)b.h (( Ge() in millicode_int.asm )) then next_m 0:$0798 0:000011:A0=A0:D0=D3 next_mc // * next_m 0:$0799 d15:000011:A1=A0:D0=D0 : op__LT__5int32_5int32_5int16 ( int32, int32 -- int16 ) // next_m a.h!=b.h ? (int)a.h<(int)b.h : a.l (uint)a.l<(uint)b.l else 0:$0761 d15:data:reset=0:$C2E1 dw olt :bit15 // !> (int)a.h<(int)b.h (( Lt() in millicode_int.asm )) then next_m 0:$0762 0:000011:A0=A0:D0=D3 next_mc // * next_m 0:$0763 d15:000011:A1=A0:D0=D0 : op__LE__5int32_5int32_5int16 ( int32, int32 -- int16 ) // next_m a.h!=b.h ? (int)a.h<(int)b.h : a.l<=b.l 0:$0776 0:000011:A1=A1:D6=D8 ld d2,alu // d2=b.l 0:$0777 0:010011:A5=A5:D8=D1 pop alu,d0,dtmp // a=dtmp.d0; b=alu.d2 0:$0778 0:010011:A5=A5:D4=D1 0:$0779 0:010011:A5=A5:D7=D1 0:$077A 0:000001:A1=A5:D3=D7 equ dtmp // b.h==a.h? 0:$077B z:000011:A1=A5:D0=D0 ld cmd,ival :z if 1 1:$077C d15:data:reset=0:$C6B3 dw oule :bit15 // => (uint)a.l<=(uint)b.l else 0:$077C d15:data:reset=0:$42E1 dw ole :bit15 // !> (int)a.h<=(int)b.h (( Le() in millicode_int.asm )) then next_m 0:$077D 0:000011:A0=A0:D0=D3 next_mc // * next_m 0:$077E d15:000011:A1=A0:D0=D0 : op__NE__5int32_5int32_5int16 ( int32, int32 -- int16 ) // next_m a.h!=b.h || a.l!=b.l 0:$071E 0:010011:A5=A5:D4=D1 pop d0,d1,d2 0:$071F 0:010011:A5=A5:D5=D1 0:$0720 0:010011:A5=A5:D6=D1 0:$0721 0:000001:A1=A5:D8=D5 xor d1 0:$0722 z:000001:A1=A5:D8=D8 xor alu :z if 0 0:$0723 0:000100:A1=A5:D8=D8 add_c alu // => 1 = yes nodelay next_m 0:$0724 0:000011:A0=A0:D0=D3 next_mc // * next_m 0:$0725 d15:000011:A1=A0:D0=D0 else 1:$0723 1:000011:A1=A7:D8=D4 ld alu,d0 1:$0724 1:000001:A1=A7:D3=D6 equ d2 1:$0725 z:000001:A1=A7:D8=D8 xor alu :z if 0 0:$0726 1:000100:A1=A0:D8=D8 add_c alu // => 1 = yes nodelay 1:$0726 1:data:reset=0:$0000 then next_m 1:$0727 1:000011:A0=A0:D0=D3 next_mc // * next_m 1:$0728 d15:000011:A1=A0:D0=D0 then : op__EQ__5int32_5int32_5int16 ( int32, int32 -- int16 ) // next_m a.h==b.h && a.l==b.l 0:$0748 0:010011:A5=A5:D4=D1 pop d0,d1,d2 0:$0749 0:010011:A5=A5:D5=D1 0:$074A 0:010011:A5=A5:D6=D1 0:$074B 0:000001:A1=A5:D8=D5 xor d1 0:$074C z:000001:A1=A5:D8=D8 xor alu :z if 0 next_m // => 0 = no 0:$074D 0:000011:A0=A0:D0=D3 next_mc // * next_m 0:$074E d15:000011:A1=A0:D0=D0 else 1:$074D 1:000011:A1=A7:D8=D4 ld alu,d0 1:$074E 1:000001:A1=A7:D3=D6 equ d2 1:$074F z:000001:A1=A7:D8=D8 xor alu :z if 1 1:$0750 1:000100:A1=A7:D8=D8 add_c alu // => 1 = yes nodelay 0:$0750 1:data:reset=0:$0000 then next_m 1:$0751 1:000011:A0=A0:D0=D3 next_mc // * next_m 1:$0752 d15:000011:A1=A0:D0=D0 then : op__CPL__4void_5int32_6uint32 ( void, int32 -- uint32 ) 0:$1C24 0:000011:A1=A0:D7=D8 ld dtmp,alu 0:$1C25 0:001011:A1=A5:D8=D1 ldn (hp) 0:$1C26 0:000011:A1=A5:D1=D8 ld (hp),alu 0:$1C27 0:001011:A1=A5:D8=D7 ldn dtmp next_m 0:$1C28 0:000011:A0=A0:D0=D3 next_mc // * next_m 0:$1C29 d15:000011:A1=A0:D0=D0 : op__SUB__4void_5int32_5int32 ( void, int32 -- int32 ) 0:$07A2 0:000011:A6=A1:D3=D8 ld atmp,alu 0:$07A3 z:010011:A6=A6:D3=D8 dec atmp :z if 0 0:$07A4 0:001011:A1=A5:D8=D1 ldn (hp) // a.l!=0 => kein übertrag => a.h := ~a.h else //xor alu // a.l==0 => übertrag => a.h := -a.h 1:$07A4 1:001000:A1=A5:D3=D1 sub_nc (hp) 1:$07A5 0:001000:A1=A5:D8=D1 0:$07A5 0:data:reset=0:$0000 then 0:$07A6 0:000011:A1=A5:D1=D8 ld (hp),alu 0:$07A7 0:001011:A1=A6:D8=D3 ldn atmp next_m 0:$07A8 0:000011:A0=A0:D0=D3 next_mc // * next_m 0:$07A9 d15:000011:A1=A0:D0=D0 : op__ADD__5int32_5int32_5int32 ( int32, int32 -- int32 ) // alu = b.l 0:$0727 0:010011:A5=A5:D5=D1 pop d1 // d1 = b.h 0:$0728 0:010000:A1=A5:D3=D1 add (hp--) // alu = b.l+a.l 0:$0729 0:010000:A5=A5:D8=D1 0:$072A cy:000011:A1=A5:D6=D8 ld d2,alu :cy // d2 = b.l+a.l if 1 1:$072B 1:000011:A1=A5:D8=D1 ld alu,(hp) // alu = a.h 1:$072C 1:000100:A1=A5:D3=D5 add_c d1 // alu = a.h+b.h+cy 1:$072D 0:000100:A1=A5:D8=D5 else 0:$072B 0:000011:A1=A5:D8=D1 ld alu,(hp) // alu = a.h 0:$072C 0:000000:A1=A5:D3=D5 add d1 // alu = a.h+b.h 0:$072D 0:000000:A1=A5:D8=D5 then 0:$072E 0:000011:A1=A5:D1=D8 ld (hp),alu // a.h+b.h 0:$072F 0:000011:A1=A5:D8=D6 ld alu,d2 // a.l+b.l next_m 0:$0730 0:000011:A0=A0:D0=D3 next_mc // * next_m 0:$0731 d15:000011:A1=A0:D0=D0 : op__SUB__5int32_5int32_5int32 ( int32, int32 -- int32 ) // note: a-b = a+(~b)+1 0:$06EA 0:001011:A1=A1:D8=D8 cpl // alu = ~b.l 0:$06EB 0:010011:A5=A5:D5=D1 pop d1 // d1 = b.h 0:$06EC 0:010100:A1=A5:D3=D1 add_c (hp--) // alu = a.l + ~b.l + 1 0:$06ED 0:010100:A5=A5:D8=D1 0:$06EE cy:000011:A1=A5:D6=D8 ld d2,alu :cy if 1 1:$06EF 1:001011:A1=A7:D8=D5 ldn d1 // alu = ~b.h 1:$06F0 1:000100:A1=A5:D3=D1 add_c (hp) // alu = a.h + ~b.h + 1 1:$06F1 0:000100:A1=A5:D8=D1 else 0:$06EF 0:001011:A1=A5:D8=D5 ldn d1 // alu = ~b.h 0:$06F0 0:000000:A1=A5:D3=D1 add (hp) // alu = a.h + ~b.h 0:$06F1 0:000000:A1=A5:D8=D1 then 0:$06F2 0:000011:A1=A5:D1=D8 ld (hp),alu // a.h+b.h 0:$06F3 0:000011:A1=A5:D8=D6 ld alu,d2 // a.l+b.l next_m 0:$06F4 0:000011:A0=A0:D0=D3 next_mc // * next_m 0:$06F5 d15:000011:A1=A0:D0=D0 : op__MUL__5int32_5int32_5int32 ( int32, int32 -- int32 ) Millicoded // Size: 51 microcodes 0:$2D5B 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$2D5C 0:data:reset=0:$6D5F 0:$2D5D 0:000011:A1=A5:D0=D0 jp millicoded // * Millicoded 0:$2D5E d15:data:reset=0:$5F70 0:$2D5F d15:data:reset=0:$18FD mc Lget+253 0:$2D60 d15:data:reset=0:$0D00 mc Int8+0 0:$2D61 d15:data:reset=0:$0E80 mc Int16+128 0:$2D62 d15:data:reset=0:$5A0F mc And 0:$2D63 d15:data:reset=0:$0615 mc BraIf0+21 0:$2D64 d15:data:reset=0:$18FF mc Lget+255 0:$2D65 d15:data:reset=0:$0D00 mc Int8+0 0:$2D66 d15:data:reset=0:$0E80 mc Int16+128 0:$2D67 d15:data:reset=0:$5A0F mc And 0:$2D68 d15:data:reset=0:$0608 mc BraIf0+8 0:$2D69 d15:data:reset=0:$07FD mc Lvar+253 0:$2D6A d15:data:reset=0:$5CD6 mc Peek2 0:$2D6B d15:data:reset=0:$47A2 mc NegL 0:$2D6C d15:data:reset=0:$07FD mc Lvar+253 0:$2D6D d15:data:reset=0:$5CD6 mc Peek2 0:$2D6E d15:data:reset=0:$47A2 mc NegL 0:$2D6F d15:data:reset=0:$6744 mc MulUL 0:$2D70 d15:data:reset=0:$021A mc Bra+26 0:$2D71 d15:data:reset=0:$07FD mc Lvar+253 0:$2D72 d15:data:reset=0:$5CD6 mc Peek2 0:$2D73 d15:data:reset=0:$47A2 mc NegL 0:$2D74 d15:data:reset=0:$07FD mc Lvar+253 0:$2D75 d15:data:reset=0:$5CD6 mc Peek2 0:$2D76 d15:data:reset=0:$6744 mc MulUL 0:$2D77 d15:data:reset=0:$47A2 mc NegL 0:$2D78 d15:data:reset=0:$0212 mc Bra+18 0:$2D79 d15:data:reset=0:$18FF mc Lget+255 0:$2D7A d15:data:reset=0:$0D00 mc Int8+0 0:$2D7B d15:data:reset=0:$0E80 mc Int16+128 0:$2D7C d15:data:reset=0:$5A0F mc And 0:$2D7D d15:data:reset=0:$0608 mc BraIf0+8 0:$2D7E d15:data:reset=0:$07FD mc Lvar+253 0:$2D7F d15:data:reset=0:$5CD6 mc Peek2 0:$2D80 d15:data:reset=0:$07FD mc Lvar+253 0:$2D81 d15:data:reset=0:$5CD6 mc Peek2 0:$2D82 d15:data:reset=0:$47A2 mc NegL 0:$2D83 d15:data:reset=0:$6744 mc MulUL 0:$2D84 d15:data:reset=0:$47A2 mc NegL 0:$2D85 d15:data:reset=0:$0205 mc Bra+5 0:$2D86 d15:data:reset=0:$07FD mc Lvar+253 0:$2D87 d15:data:reset=0:$5CD6 mc Peek2 0:$2D88 d15:data:reset=0:$07FD mc Lvar+253 0:$2D89 d15:data:reset=0:$5CD6 mc Peek2 0:$2D8A d15:data:reset=0:$6744 mc MulUL 0:$2D8B d15:data:reset=0:$07FB mc Lvar+251 0:$2D8C d15:data:reset=0:$5E23 mc Poke2 0:$2D8D d15:data:reset=0:$5FFA mc MDrop0_Next-2 : op__DIV__5int32_5int32_5int32 ( int32, int32 -- int32 ) Millicoded // Size: 51 microcodes 0:$2D8E 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$2D8F 0:data:reset=0:$6D92 0:$2D90 0:000011:A1=A5:D0=D0 jp millicoded // * Millicoded 0:$2D91 d15:data:reset=0:$5F70 0:$2D92 d15:data:reset=0:$18FD mc Lget+253 0:$2D93 d15:data:reset=0:$0D00 mc Int8+0 0:$2D94 d15:data:reset=0:$0E80 mc Int16+128 0:$2D95 d15:data:reset=0:$5A0F mc And 0:$2D96 d15:data:reset=0:$0615 mc BraIf0+21 0:$2D97 d15:data:reset=0:$18FF mc Lget+255 0:$2D98 d15:data:reset=0:$0D00 mc Int8+0 0:$2D99 d15:data:reset=0:$0E80 mc Int16+128 0:$2D9A d15:data:reset=0:$5A0F mc And 0:$2D9B d15:data:reset=0:$0608 mc BraIf0+8 0:$2D9C d15:data:reset=0:$07FD mc Lvar+253 0:$2D9D d15:data:reset=0:$5CD6 mc Peek2 0:$2D9E d15:data:reset=0:$47A2 mc NegL 0:$2D9F d15:data:reset=0:$07FD mc Lvar+253 0:$2DA0 d15:data:reset=0:$5CD6 mc Peek2 0:$2DA1 d15:data:reset=0:$47A2 mc NegL 0:$2DA2 d15:data:reset=0:$7B1D mc DivUL 0:$2DA3 d15:data:reset=0:$021A mc Bra+26 0:$2DA4 d15:data:reset=0:$07FD mc Lvar+253 0:$2DA5 d15:data:reset=0:$5CD6 mc Peek2 0:$2DA6 d15:data:reset=0:$47A2 mc NegL 0:$2DA7 d15:data:reset=0:$07FD mc Lvar+253 0:$2DA8 d15:data:reset=0:$5CD6 mc Peek2 0:$2DA9 d15:data:reset=0:$7B1D mc DivUL 0:$2DAA d15:data:reset=0:$47A2 mc NegL 0:$2DAB d15:data:reset=0:$0212 mc Bra+18 0:$2DAC d15:data:reset=0:$18FF mc Lget+255 0:$2DAD d15:data:reset=0:$0D00 mc Int8+0 0:$2DAE d15:data:reset=0:$0E80 mc Int16+128 0:$2DAF d15:data:reset=0:$5A0F mc And 0:$2DB0 d15:data:reset=0:$0608 mc BraIf0+8 0:$2DB1 d15:data:reset=0:$07FD mc Lvar+253 0:$2DB2 d15:data:reset=0:$5CD6 mc Peek2 0:$2DB3 d15:data:reset=0:$07FD mc Lvar+253 0:$2DB4 d15:data:reset=0:$5CD6 mc Peek2 0:$2DB5 d15:data:reset=0:$47A2 mc NegL 0:$2DB6 d15:data:reset=0:$7B1D mc DivUL 0:$2DB7 d15:data:reset=0:$47A2 mc NegL 0:$2DB8 d15:data:reset=0:$0205 mc Bra+5 0:$2DB9 d15:data:reset=0:$07FD mc Lvar+253 0:$2DBA d15:data:reset=0:$5CD6 mc Peek2 0:$2DBB d15:data:reset=0:$07FD mc Lvar+253 0:$2DBC d15:data:reset=0:$5CD6 mc Peek2 0:$2DBD d15:data:reset=0:$7B1D mc DivUL 0:$2DBE d15:data:reset=0:$07FB mc Lvar+251 0:$2DBF d15:data:reset=0:$5E23 mc Poke2 0:$2DC0 d15:data:reset=0:$5FFA mc MDrop0_Next-2 : op__AND__5int32_5int32_5int32 ( int32, int32 -- int32 ) Millicoded // Size: 13 microcodes 0:$213A 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$213B 0:data:reset=0:$613E 0:$213C 0:000011:A1=A1:D0=D0 jp millicoded // * Millicoded 0:$213D d15:data:reset=0:$5F70 0:$213E d15:data:reset=0:$18FF mc Lget+255 0:$213F d15:data:reset=0:$07FC mc Lvar+252 0:$2140 d15:data:reset=0:$5CDD mc AndPoke 0:$2141 d15:data:reset=0:$07FF mc Lvar+255 0:$2142 d15:data:reset=0:$0B01 mc Addq+1 0:$2143 d15:data:reset=0:$5AC5 mc Peek 0:$2144 d15:data:reset=0:$07FD mc Lvar+253 0:$2145 d15:data:reset=0:$5CDD mc AndPoke 0:$2146 d15:data:reset=0:$5FFA mc MDrop0_Next-2 : op__OR__5int32_5int32_5int32 ( int32, int32 -- int32 ) Millicoded // Size: 13 microcodes 0:$212D 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$212E 0:data:reset=0:$6131 0:$212F 0:000011:A1=A1:D0=D0 jp millicoded // * Millicoded 0:$2130 d15:data:reset=0:$5F70 0:$2131 d15:data:reset=0:$18FF mc Lget+255 0:$2132 d15:data:reset=0:$07FC mc Lvar+252 0:$2133 d15:data:reset=0:$5CEB mc OrPoke 0:$2134 d15:data:reset=0:$07FF mc Lvar+255 0:$2135 d15:data:reset=0:$0B01 mc Addq+1 0:$2136 d15:data:reset=0:$5AC5 mc Peek 0:$2137 d15:data:reset=0:$07FD mc Lvar+253 0:$2138 d15:data:reset=0:$5CEB mc OrPoke 0:$2139 d15:data:reset=0:$5FFA mc MDrop0_Next-2 : op__XOR__5int32_5int32_5int32 ( int32, int32 -- int32 ) Millicoded // Size: 13 microcodes 0:$2154 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$2155 0:data:reset=0:$6158 0:$2156 0:000011:A1=A1:D0=D0 jp millicoded // * Millicoded 0:$2157 d15:data:reset=0:$5F70 0:$2158 d15:data:reset=0:$18FF mc Lget+255 0:$2159 d15:data:reset=0:$07FC mc Lvar+252 0:$215A d15:data:reset=0:$5CA5 mc XorPoke 0:$215B d15:data:reset=0:$07FF mc Lvar+255 0:$215C d15:data:reset=0:$0B01 mc Addq+1 0:$215D d15:data:reset=0:$5AC5 mc Peek 0:$215E d15:data:reset=0:$07FD mc Lvar+253 0:$215F d15:data:reset=0:$5CA5 mc XorPoke 0:$2160 d15:data:reset=0:$5FFA mc MDrop0_Next-2 : op__GT__6uint32_6uint32_5int16 ( uint32, uint32 -- int16 ) // next_m a.h!=b.h ? a.h>b.h : a.l>b.l 0:$067E 0:000011:A1=A6:D6=D8 ld d2,alu // d2=b.l 0:$067F 0:010011:A5=A5:D8=D1 pop alu,d0,dtmp // a=dtmp.d0; b=alu.d2 0:$0680 0:010011:A5=A5:D4=D1 0:$0681 0:010011:A5=A5:D7=D1 0:$0682 0:000001:A1=A5:D3=D7 equ dtmp // b.h==a.h? 0:$0683 z:data:reset=0:$0000 if z // if a.h==b.h 1:$0684 0:000011:A1=A7:D8=D6 ougt: ld alu,d2 // then compare a.l with b.l else 0:$0684 0:000011:A1=A0:D4=D7 ld d0,dtmp // else compare a.h with b.h then 0:$0685 0:001100:A1=A0:D3=D4 cmp d0 0:$0686 0:001100:A1=A0:D3=D4 0:$0687 cy:000001:A1=A0:D8=D8 xor alu :cy if 0 // !cy => cy => alu bb.h : a.l>=b.l 0:$068B 0:000011:A1=A0:D5=D8 ld d1,alu // d1=b.l 0:$068C 0:010011:A5=A5:D8=D1 pop alu,d0,dtmp // a=dtmp.d0; b=alu.d1 0:$068D 0:010011:A5=A5:D4=D1 0:$068E 0:010011:A5=A5:D7=D1 0:$068F 0:000001:A1=A5:D3=D7 equ dtmp // b.h==a.h? 0:$0690 z:data:reset=0:$0000 if z // if a.h==b.h 1:$0691 0:000011:A1=A7:D8=D5 ouge: ld alu,d1 // then compare a.l with b.l else 0:$0691 0:000011:A1=A0:D4=D7 ld d0,dtmp then 0:$0692 0:001000:A1=A0:D3=D4 cmp_nc d0 0:$0693 0:001000:A1=A0:D3=D4 0:$0694 cy:000001:A1=A0:D8=D8 xor alu :cy if 0 // !cy => cy => alu b?a 0:$0695 0:000100:A1=A0:D8=D8 add_c alu // nodelay 1:$0695 0:data:reset=0:$0000 then next_m 0:$0696 0:000011:A0=A0:D0=D3 next_mc // * next_m 0:$0697 d15:000011:A1=A0:D0=D0 : op__LT__6uint32_6uint32_5int16 ( uint32, uint32 -- int16 ) // next_m a.h!=b.h ? a.h !cy => alu?d1+1 => b>a 1:$06AA 0:000100:A1=A7:D8=D8 add_c alu // nodelay 0:$06AA 0:data:reset=0:$0000 then next_m 0:$06AB 0:000011:A0=A0:D0=D3 next_mc // * next_m 0:$06AC d15:000011:A1=A0:D0=D0 : op__LE__6uint32_6uint32_5int16 ( uint32, uint32 -- int16 ) // next_m a.h!=b.h ? a.h !cy => alu?d1 => b?a 1:$06B7 0:000100:A1=A7:D8=D8 add_c alu // nodelay 0:$06B7 0:data:reset=0:$0000 then next_m 0:$06B8 0:000011:A0=A0:D0=D3 next_mc // * next_m 0:$06B9 d15:000011:A1=A0:D0=D0 : op__MUL__6uint32_6uint32_6uint32 ( uint32, uint32 -- uint32 ) Millicoded // Size: 26 microcodes 0:$2744 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$2745 0:data:reset=0:$6748 0:$2746 0:000011:A1=A7:D0=D0 jp millicoded // * Millicoded 0:$2747 d15:data:reset=0:$5F70 0:$2748 d15:data:reset=0:$18FE mc Lget+254 0:$2749 d15:data:reset=0:$18FF mc Lget+255 0:$274A d15:data:reset=0:$43AE mc mulu_16_32__6uint16_6uint16_6uint32 0:$274B d15:data:reset=0:$18FB mc Lget+251 0:$274C d15:data:reset=0:$0605 mc BraIf0+5 0:$274D d15:data:reset=0:$18FB mc Lget+251 0:$274E d15:data:reset=0:$18FD mc Lget+253 0:$274F d15:data:reset=0:$4405 mc Mulu 0:$2750 d15:data:reset=0:$07FE mc Lvar+254 0:$2751 d15:data:reset=0:$5DA8 mc AddPoke 0:$2752 d15:data:reset=0:$18FD mc Lget+253 0:$2753 d15:data:reset=0:$0605 mc BraIf0+5 0:$2754 d15:data:reset=0:$18FC mc Lget+252 0:$2755 d15:data:reset=0:$18FC mc Lget+252 0:$2756 d15:data:reset=0:$4405 mc Mulu 0:$2757 d15:data:reset=0:$07FE mc Lvar+254 0:$2758 d15:data:reset=0:$5DA8 mc AddPoke 0:$2759 d15:data:reset=0:$07FF mc Lvar+255 0:$275A d15:data:reset=0:$5CD6 mc Peek2 0:$275B d15:data:reset=0:$07F9 mc Lvar+249 0:$275C d15:data:reset=0:$5E23 mc Poke2 0:$275D d15:data:reset=0:$5FF8 mc MDrop0_Next-4 : op__DIV__6uint32_6uint32_6uint32 ( uint32, uint32 -- uint32 ) Millicoded // Size: 97 microcodes 0:$3B1D 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$3B1E 0:data:reset=0:$7B21 0:$3B1F 0:000011:A1=A3:D0=D0 jp millicoded // * Millicoded 0:$3B20 d15:data:reset=0:$5F70 0:$3B21 d15:data:reset=0:$0D00 mc Int8+0 0:$3B22 d15:data:reset=0:$0D00 mc Int8+0 0:$3B23 d15:data:reset=0:$0D00 mc Int8+0 0:$3B24 d15:data:reset=0:$0D00 mc Int8+0 0:$3B25 d15:data:reset=0:$0D00 mc Int8+0 0:$3B26 d15:data:reset=0:$07F8 mc Lvar+248 0:$3B27 d15:data:reset=0:$5CD6 mc Peek2 0:$3B28 d15:data:reset=0:$07F8 mc Lvar+248 0:$3B29 d15:data:reset=0:$5CD6 mc Peek2 0:$3B2A d15:data:reset=0:$468B mc GeUL 0:$3B2B d15:data:reset=0:$064D mc BraIf0+77 0:$3B2C d15:data:reset=0:$18FA mc Lget+250 0:$3B2D d15:data:reset=0:$47F1 mc Or1 0:$3B2E d15:data:reset=0:$0201 mc Bra+1 0:$3B2F d15:data:reset=0:$18FB mc Lget+251 0:$3B30 d15:data:reset=0:$0642 mc BraIf0+66 0:$3B31 d15:data:reset=0:$07F8 mc Lvar+248 0:$3B32 d15:data:reset=0:$5CD6 mc Peek2 0:$3B33 d15:data:reset=0:$4751 mc msbit__5int32_5int16 0:$3B34 d15:data:reset=0:$07F9 mc Lvar+249 0:$3B35 d15:data:reset=0:$5CD6 mc Peek2 0:$3B36 d15:data:reset=0:$4751 mc msbit__5int32_5int16 0:$3B37 d15:data:reset=0:$5BAC mc Sub 0:$3B38 d15:data:reset=0:$5F29 mc Nip 0:$3B39 d15:data:reset=0:$07F8 mc Lvar+248 0:$3B3A d15:data:reset=0:$5CD6 mc Peek2 0:$3B3B d15:data:reset=0:$18FE mc Lget+254 0:$3B3C d15:data:reset=0:$455C mc SrUL 0:$3B3D d15:data:reset=0:$07FC mc Lvar+252 0:$3B3E d15:data:reset=0:$5E23 mc Poke2 0:$3B3F d15:data:reset=0:$07F8 mc Lvar+248 0:$3B40 d15:data:reset=0:$5CD6 mc Peek2 0:$3B41 d15:data:reset=0:$0D20 mc Int8+32 0:$3B42 d15:data:reset=0:$18FD mc Lget+253 0:$3B43 d15:data:reset=0:$5BAC mc Sub 0:$3B44 d15:data:reset=0:$456D mc SlL 0:$3B45 d15:data:reset=0:$07F6 mc Lvar+246 0:$3B46 d15:data:reset=0:$5E23 mc Poke2 0:$3B47 d15:data:reset=0:$07FC mc Lvar+252 0:$3B48 d15:data:reset=0:$5CD6 mc Peek2 0:$3B49 d15:data:reset=0:$0D01 mc Int8+1 0:$3B4A d15:data:reset=0:$456D mc SlL 0:$3B4B d15:data:reset=0:$07FA mc Lvar+250 0:$3B4C d15:data:reset=0:$5E23 mc Poke2 0:$3B4D d15:data:reset=0:$07FE mc Lvar+254 0:$3B4E d15:data:reset=0:$5CD6 mc Peek2 0:$3B4F d15:data:reset=0:$07F8 mc Lvar+248 0:$3B50 d15:data:reset=0:$5CD6 mc Peek2 0:$3B51 d15:data:reset=0:$468B mc GeUL 0:$3B52 d15:data:reset=0:$0608 mc BraIf0+8 0:$3B53 d15:data:reset=0:$0D00 mc Int8+0 0:$3B54 d15:data:reset=0:$0D01 mc Int8+1 0:$3B55 d15:data:reset=0:$07FA mc Lvar+250 0:$3B56 d15:data:reset=0:$6040 mc AddPokeL 0:$3B57 d15:data:reset=0:$07FA mc Lvar+250 0:$3B58 d15:data:reset=0:$5CD6 mc Peek2 0:$3B59 d15:data:reset=0:$07FC mc Lvar+252 0:$3B5A d15:data:reset=0:$601C mc SubPokeL 0:$3B5B d15:data:reset=0:$07FE mc Lvar+254 0:$3B5C d15:data:reset=0:$5CD6 mc Peek2 0:$3B5D d15:data:reset=0:$0D01 mc Int8+1 0:$3B5E d15:data:reset=0:$456D mc SlL 0:$3B5F d15:data:reset=0:$07FC mc Lvar+252 0:$3B60 d15:data:reset=0:$5E23 mc Poke2 0:$3B61 d15:data:reset=0:$18F8 mc Lget+248 0:$3B62 d15:data:reset=0:$0D00 mc Int8+0 0:$3B63 d15:data:reset=0:$0E80 mc Int16+128 0:$3B64 d15:data:reset=0:$5A0F mc And 0:$3B65 d15:data:reset=0:$0603 mc BraIf0+3 0:$3B66 d15:data:reset=0:$0D01 mc Int8+1 0:$3B67 d15:data:reset=0:$07FE mc Lvar+254 0:$3B68 d15:data:reset=0:$5DA8 mc AddPoke 0:$3B69 d15:data:reset=0:$07F8 mc Lvar+248 0:$3B6A d15:data:reset=0:$5CD6 mc Peek2 0:$3B6B d15:data:reset=0:$0D01 mc Int8+1 0:$3B6C d15:data:reset=0:$456D mc SlL 0:$3B6D d15:data:reset=0:$07F6 mc Lvar+246 0:$3B6E d15:data:reset=0:$5E23 mc Poke2 0:$3B6F d15:data:reset=0:$5BC5 mc PshHP 0:$3B70 d15:data:reset=0:$5DD0 mc Peekmm 0:$3B71 d15:data:reset=0:$0607 mc BraIf0+7 0:$3B72 d15:data:reset=0:$01D4 mc Bra-44 0:$3B73 d15:data:reset=0:$0DFF mc Int8+255 0:$3B74 d15:data:reset=0:$0EFF mc Int16+255 0:$3B75 d15:data:reset=0:$0DFF mc Int8+255 0:$3B76 d15:data:reset=0:$0EFF mc Int16+255 0:$3B77 d15:data:reset=0:$07FA mc Lvar+250 0:$3B78 d15:data:reset=0:$5E23 mc Poke2 0:$3B79 d15:data:reset=0:$07FC mc Lvar+252 0:$3B7A d15:data:reset=0:$5CD6 mc Peek2 0:$3B7B d15:data:reset=0:$07F6 mc Lvar+246 0:$3B7C d15:data:reset=0:$5E23 mc Poke2 0:$3B7D d15:data:reset=0:$5FF5 mc MDrop0_Next-7 : op__SR__6uint32_5int16_6uint32 ( uint32, int16 -- uint32 ) // if d & $10 { n.l=n.h n.h=0 } // d &= $F // if d // { // n.l = n.l>>d + n.h<<(16-d) // n.h = n.h>>d // } // next_m n 0:$055C 0:010011:A5=A5:D4=D1 pop d0 // d0 = n.l 0:$055D 0:000011:A1=A5:D5=D1 ld d1,(hp) // d1 = n.h 0:$055E 0:000010:A1=A5:D3=D0 tst_and $10 :z // d ? 16 ? 0:$055F z:data:reset=0:$0010 if 0 // shift distance ? 16 => n.l = n.h>>d // n.h = 0 0:$0560 0:000011:A5=A5:D1=D0 ld (hp++),0 // n.h = 0 0:$0561 0:data:reset=0:$0000 0:$0562 0:000011:A1=A5:D1=D5 ld (hp),d1 // n.l = n.h 0:$0563 0:000011:A1=A5:D0=D0 jp Sru 0:$0564 d15:data:reset=0:$449A else // shift distance < 16 // shift across word boundary: 1:$0560 1:000010:A1=A7:D8=D0 and $F 1:$0561 1:data:reset=0:$000F 1:$0562 1:000011:A6=A1:D3=D8 ld atmp,alu 1:$0563 1:000011:A1=A1:D0=D0 jp p1 1:$0564 d15:data:reset=0:$C569 do 1:$0565 1:000011:A1=A5:DC=D5 ld sr,d1,nc 1:$0566 d0:000011:A1=A5:D5=DC ld d1,sr :bit0 if 1 1:$0567 1:000111:A1=A5:DC=D4 ld sr,d0,cy else 0:$0567 1:000011:A1=A7:DC=D4 ld sr,d0,nc then 1:$0568 1:000011:A1=A5:D4=DC ld d0,sr 1:$0569 1:010011:A6=A6:D3=D3 p1 tst atmp-- 1:$056A z:data:reset=0:$0000 until z 0:$056B 0:000011:A1=A7:D0=D0 0:$056C d15:data:reset=0:$C565 1:$056B 1:000011:A1=A5:D1=D5 ld (hp),d1 // n.h back on stack 1:$056C 1:000011:A1=A5:D8=D4 ld alu,d0 // alu = top = n.l next_m 1:$056D 1:000011:A0=A0:D0=D3 next_mc // * next_m 1:$056E d15:000011:A1=A0:D0=D0 then : op__SL__6uint32_5int16_6uint32 ( uint32, int16 -- uint32 ) // if d & $10 { n.h=n.l n.l=0 } // d &= $F // if d // { // n.h = n.h<>(16-d) // n.l = n.l< n.h = n.l< n.l=0 0:$0573 0:data:reset=0:$0D00 0:$0574 0:000011:A1=A5:D0=D0 jp sln 0:$0575 d15:data:reset=0:$44CB else // shift distance < 16 // shift across word boundary: 1:$0571 1:000010:A1=A7:D8=D0 and $F 1:$0572 1:data:reset=0:$000F 1:$0573 1:000011:A6=A1:D3=D8 ld atmp,alu 1:$0574 1:000011:A1=A1:D0=D0 jp p1 1:$0575 d15:data:reset=0:$C57A do 1:$0576 1:000011:A1=A5:DD=D4 ld sl,d0,nc 1:$0577 d15:000011:A1=A5:D4=DD ld d0,sl :bit15 if 1 1:$0578 1:000111:A1=A5:DD=D5 ld sl,d1,cy else 0:$0578 1:000011:A1=A7:DD=D5 ld sl,d1,nc then 1:$0579 1:000011:A1=A5:D5=DD ld d1,sl 1:$057A 1:010011:A6=A6:D3=D3 p1 tst atmp-- 1:$057B z:data:reset=0:$0000 until z 0:$057C 0:000011:A1=A7:D0=D0 0:$057D d15:data:reset=0:$C576 1:$057C 1:000011:A1=A5:D1=D5 ld (hp),d1 // n.h back on stack 1:$057D 1:000011:A1=A5:D8=D4 ld alu,d0 // alu = top = n.l next_m 1:$057E 1:000011:A0=A0:D0=D3 next_mc // * next_m 1:$057F d15:000011:A1=A0:D0=D0 then : op__SUB__5int32_5int16_5int32 ( int32, int16 -- int32 ) 0:$0832 0:000011:A5=A5:D3=D8 tst alu,hp.clk,hp.oe,add1 0:$0833 d15:000011:A1=A5:D1=D0 ld (hp),ival :bit15 if 1 1:$0834 0:data:reset=0:$FFFF dw $FFFF else 0:$0834 0:data:reset=0:$0000 dw 0 then 0:$0835 0:000011:A1=A0:D0=D0 jp op__SUB__5int32_5int32_5int32 0:$0836 d15:data:reset=0:$46EA : op__ADD__5int32_5int16_5int32 ( int32, int16 -- int32 ) 0:$0828 0:000011:A5=A5:D3=D8 tst alu,hp.clk,hp.oe,add1 0:$0829 d15:000011:A1=A5:D1=D0 ld (hp),ival :bit15 if 1 1:$082A 0:data:reset=0:$FFFF dw $FFFF else 0:$082A 0:data:reset=0:$0000 dw 0 then 0:$082B 0:000011:A1=A0:D0=D0 jp op__ADD__5int32_5int32_5int32 0:$082C d15:data:reset=0:$4727 : op__MUL__6uint32_6uint16_6uint32 ( uint32, uint16 -- uint32 ) Millicoded // Size: 19 microcodes 0:$24C5 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$24C6 0:data:reset=0:$64C9 0:$24C7 0:000011:A1=A4:D0=D0 jp millicoded // * Millicoded 0:$24C8 d15:data:reset=0:$5F70 0:$24C9 d15:data:reset=0:$18FF mc Lget+255 0:$24CA d15:data:reset=0:$18FF mc Lget+255 0:$24CB d15:data:reset=0:$43AE mc mulu_16_32__6uint16_6uint16_6uint32 0:$24CC d15:data:reset=0:$18FC mc Lget+252 0:$24CD d15:data:reset=0:$0605 mc BraIf0+5 0:$24CE d15:data:reset=0:$18FC mc Lget+252 0:$24CF d15:data:reset=0:$18FD mc Lget+253 0:$24D0 d15:data:reset=0:$4405 mc Mulu 0:$24D1 d15:data:reset=0:$07FE mc Lvar+254 0:$24D2 d15:data:reset=0:$5DA8 mc AddPoke 0:$24D3 d15:data:reset=0:$07FF mc Lvar+255 0:$24D4 d15:data:reset=0:$5CD6 mc Peek2 0:$24D5 d15:data:reset=0:$07FA mc Lvar+250 0:$24D6 d15:data:reset=0:$5E23 mc Poke2 0:$24D7 d15:data:reset=0:$5FF9 mc MDrop0_Next-3 : op__ADDGL__5int32_5int32P_ ( int32, int32& ) Millicoded // Size: 12 microcodes 0:$2040 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$2041 0:data:reset=0:$6044 0:$2042 0:000011:A1=A0:D0=D0 jp millicoded // * Millicoded 0:$2043 d15:data:reset=0:$5F70 0:$2044 d15:data:reset=0:$45F6 mc Dup 0:$2045 d15:data:reset=0:$5CD6 mc Peek2 0:$2046 d15:data:reset=0:$07FC mc Lvar+252 0:$2047 d15:data:reset=0:$5CD6 mc Peek2 0:$2048 d15:data:reset=0:$4727 mc AddL 0:$2049 d15:data:reset=0:$18FE mc Lget+254 0:$204A d15:data:reset=0:$5E23 mc Poke2 0:$204B d15:data:reset=0:$5FF9 mc MDrop0_Next-3 : op__SUBGL__5int32_5int32P_ ( int32, int32& ) Millicoded // Size: 12 microcodes 0:$201C 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$201D 0:data:reset=0:$6020 0:$201E 0:000011:A1=A0:D0=D0 jp millicoded // * Millicoded 0:$201F d15:data:reset=0:$5F70 0:$2020 d15:data:reset=0:$45F6 mc Dup 0:$2021 d15:data:reset=0:$5CD6 mc Peek2 0:$2022 d15:data:reset=0:$07FC mc Lvar+252 0:$2023 d15:data:reset=0:$5CD6 mc Peek2 0:$2024 d15:data:reset=0:$46EA mc SubL 0:$2025 d15:data:reset=0:$18FE mc Lget+254 0:$2026 d15:data:reset=0:$5E23 mc Poke2 0:$2027 d15:data:reset=0:$5FF9 mc MDrop0_Next-3 : op__SLGL__5int16_6uint32P_ ( int16, uint32& ) Millicoded // Size: 11 microcodes 0:$1F80 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$1F81 0:data:reset=0:$5F84 0:$1F82 0:000011:A1=A7:D0=D0 jp millicoded // * Millicoded 0:$1F83 d15:data:reset=0:$5F70 0:$1F84 d15:data:reset=0:$45F6 mc Dup 0:$1F85 d15:data:reset=0:$5CD6 mc Peek2 0:$1F86 d15:data:reset=0:$18FD mc Lget+253 0:$1F87 d15:data:reset=0:$456D mc SlL 0:$1F88 d15:data:reset=0:$18FE mc Lget+254 0:$1F89 d15:data:reset=0:$5E23 mc Poke2 0:$1F8A d15:data:reset=0:$5FFA mc MDrop0_Next-2 : op__SRGL__5int16_6uint32P_ ( int16, uint32& ) Millicoded // Size: 11 microcodes 0:$3F03 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$3F04 0:data:reset=0:$7F07 0:$3F05 0:000011:A1=A7:D0=D0 jp millicoded // * Millicoded 0:$3F06 d15:data:reset=0:$5F70 0:$3F07 d15:data:reset=0:$45F6 mc Dup 0:$3F08 d15:data:reset=0:$5CD6 mc Peek2 0:$3F09 d15:data:reset=0:$18FD mc Lget+253 0:$3F0A d15:data:reset=0:$455C mc SrUL 0:$3F0B d15:data:reset=0:$18FE mc Lget+254 0:$3F0C d15:data:reset=0:$5E23 mc Poke2 0:$3F0D d15:data:reset=0:$5FFA mc MDrop0_Next-2 : peekpp__5int32P_5int32 ( int32& -- int32 ) Millicoded // Size: 19 microcodes 0:$24B2 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$24B3 0:data:reset=0:$64B6 0:$24B4 0:000011:A1=A4:D0=D0 jp millicoded // * Millicoded 0:$24B5 d15:data:reset=0:$5F70 0:$24B6 d15:data:reset=0:$45F6 mc Dup 0:$24B7 d15:data:reset=0:$5CD6 mc Peek2 0:$24B8 d15:data:reset=0:$18FE mc Lget+254 0:$24B9 d15:data:reset=0:$5CD6 mc Peek2 0:$24BA d15:data:reset=0:$0D00 mc Int8+0 0:$24BB d15:data:reset=0:$0D01 mc Int8+1 0:$24BC d15:data:reset=0:$4727 mc AddL 0:$24BD d15:data:reset=0:$18FC mc Lget+252 0:$24BE d15:data:reset=0:$5E23 mc Poke2 0:$24BF d15:data:reset=0:$07FF mc Lvar+255 0:$24C0 d15:data:reset=0:$5CD6 mc Peek2 0:$24C1 d15:data:reset=0:$5FA4 mc ToR2 0:$24C2 d15:data:reset=0:$5F31 mc MDrop0-3 0:$24C3 d15:data:reset=0:$5F99 mc FromR2 0:$24C4 d15:data:reset=0:$5ACD mc Ret // --- file: "long.asm" --- #include "str.cc" // +++ file: "str.asm" +++ // K1-16/16 Microcode // 2015-12-22 16:10:39 : implicit__str__kill__8ucs2charAEAE_8ucs2charAEAE ( str_AE -- str_AE ) Millicoded // Size: 12 microcodes 0:$2034 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$2035 0:data:reset=0:$6038 0:$2036 0:000011:A1=A0:D0=D0 jp millicoded // * Millicoded 0:$2037 d15:data:reset=0:$5F70 0:$2038 d15:data:reset=0:$45F6 mc Dup 0:$2039 d15:data:reset=0:$473D mc ForAllItems 0:$203A d15:data:reset=0:$0202 mc Bra+2 0:$203B d15:data:reset=0:$5AC5 mc Peek 0:$203C d15:data:reset=0:$4581 mc DropStr 0:$203D d15:data:reset=0:$43ED mc mmNextItem 0:$203E d15:data:reset=0:$01FC mc Bra-4 0:$203F d15:data:reset=0:$5ACD mc Ret : implicit__str__shrink__8ucs2charAEC_6uint16_ ( ucs2str¢, uint16 ) Millicoded // Size: 6 microcodes 0:$1C48 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$1C49 0:data:reset=0:$5C4C 0:$1C4A 0:000011:A1=A4:D0=D0 jp millicoded // * Millicoded 0:$1C4B d15:data:reset=0:$5F70 0:$1C4C d15:data:reset=0:$47BA mc ShrinkStr 0:$1C4D d15:data:reset=0:$5ACD mc Ret : copy__6uint16AEC_6uint16_6uint16AEC_6uint16_6uint16_ ( uint16[]¢, uint16, uint16[]¢, uint16, uint16 ) Millicoded // Size: 64 microcodes 0:$3A0B 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$3A0C 0:data:reset=0:$7A0F 0:$3A0D 0:000011:A1=A2:D0=D0 jp millicoded // * Millicoded 0:$3A0E d15:data:reset=0:$5F70 0:$3A0F d15:data:reset=0:$18FC mc Lget+252 0:$3A10 d15:data:reset=0:$482D mc Count 0:$3A11 d15:data:reset=0:$18FD mc Lget+253 0:$3A12 d15:data:reset=0:$482D mc Count 0:$3A13 d15:data:reset=0:$18FB mc Lget+251 0:$3A14 d15:data:reset=0:$18FE mc Lget+254 0:$3A15 d15:data:reset=0:$46CC mc Ult 0:$3A16 d15:data:reset=0:$47E5 mc And0 0:$3A17 d15:data:reset=0:$0203 mc Bra+3 0:$3A18 d15:data:reset=0:$18FD mc Lget+253 0:$3A19 d15:data:reset=0:$18FF mc Lget+255 0:$3A1A d15:data:reset=0:$46CC mc Ult 0:$3A1B d15:data:reset=0:$062E mc BraIf0+46 0:$3A1C d15:data:reset=0:$18FE mc Lget+254 0:$3A1D d15:data:reset=0:$18FE mc Lget+254 0:$3A1E d15:data:reset=0:$18F9 mc Lget+249 0:$3A1F d15:data:reset=0:$5BAC mc Sub 0:$3A20 d15:data:reset=0:$18FE mc Lget+254 0:$3A21 d15:data:reset=0:$18FA mc Lget+250 0:$3A22 d15:data:reset=0:$5BAC mc Sub 0:$3A23 d15:data:reset=0:$480F mc Umin 0:$3A24 d15:data:reset=0:$480F mc Umin 0:$3A25 d15:data:reset=0:$18FB mc Lget+251 0:$3A26 d15:data:reset=0:$18FB mc Lget+251 0:$3A27 d15:data:reset=0:$5E2E mc AtIndex 0:$3A28 d15:data:reset=0:$18F8 mc Lget+248 0:$3A29 d15:data:reset=0:$18F8 mc Lget+248 0:$3A2A d15:data:reset=0:$5E2E mc AtIndex 0:$3A2B d15:data:reset=0:$18FE mc Lget+254 0:$3A2C d15:data:reset=0:$476D mc TradMemCpy 0:$3A2D d15:data:reset=0:$18FD mc Lget+253 0:$3A2E d15:data:reset=0:$18FF mc Lget+255 0:$3A2F d15:data:reset=0:$C6C6 mc Ugt 0:$3A30 d15:data:reset=0:$0402 mc BraIf1+2 0:$3A31 d15:data:reset=0:$5F33 mc MDrop0-1 0:$3A32 d15:data:reset=0:$0217 mc Bra+23 0:$3A33 d15:data:reset=0:$45F6 mc Dup 0:$3A34 d15:data:reset=0:$07FC mc Lvar+252 0:$3A35 d15:data:reset=0:$5E33 mc SubPoke 0:$3A36 d15:data:reset=0:$45F6 mc Dup 0:$3A37 d15:data:reset=0:$07F9 mc Lvar+249 0:$3A38 d15:data:reset=0:$5DA8 mc AddPoke 0:$3A39 d15:data:reset=0:$18FA mc Lget+250 0:$3A3A d15:data:reset=0:$18FD mc Lget+253 0:$3A3B d15:data:reset=0:$47DF mc Eq 0:$3A3C d15:data:reset=0:$0602 mc BraIf0+2 0:$3A3D d15:data:reset=0:$0D00 mc Int8+0 0:$3A3E d15:data:reset=0:$8EFA mc Lset+250 0:$3A3F d15:data:reset=0:$45F6 mc Dup 0:$3A40 d15:data:reset=0:$07FB mc Lvar+251 0:$3A41 d15:data:reset=0:$5DA8 mc AddPoke 0:$3A42 d15:data:reset=0:$18FC mc Lget+252 0:$3A43 d15:data:reset=0:$18FE mc Lget+254 0:$3A44 d15:data:reset=0:$47DF mc Eq 0:$3A45 d15:data:reset=0:$0602 mc BraIf0+2 0:$3A46 d15:data:reset=0:$0D00 mc Int8+0 0:$3A47 d15:data:reset=0:$8EFC mc Lset+252 0:$3A48 d15:data:reset=0:$5F33 mc MDrop0-1 0:$3A49 d15:data:reset=0:$01D2 mc Bra-46 0:$3A4A d15:data:reset=0:$5FF5 mc MDrop0_Next-7 : copy_i16_to_i8__6uint16AEC_6uint16_6uint16AEC_6uint16_ ( uint16[]¢, uint16, uint16[]¢, uint16 ) Millicoded // Size: 37 microcodes 0:$2AD4 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$2AD5 0:data:reset=0:$6AD8 0:$2AD6 0:000011:A1=A2:D0=D0 jp millicoded // * Millicoded 0:$2AD7 d15:data:reset=0:$5F70 0:$2AD8 d15:data:reset=0:$18FD mc Lget+253 0:$2AD9 d15:data:reset=0:$482D mc Count 0:$2ADA d15:data:reset=0:$18FD mc Lget+253 0:$2ADB d15:data:reset=0:$5BAC mc Sub 0:$2ADC d15:data:reset=0:$18FE mc Lget+254 0:$2ADD d15:data:reset=0:$482D mc Count 0:$2ADE d15:data:reset=0:$18FE mc Lget+254 0:$2ADF d15:data:reset=0:$5BAC mc Sub 0:$2AE0 d15:data:reset=0:$C4B1 mc Sru15+15-1 0:$2AE1 d15:data:reset=0:$480F mc Umin 0:$2AE2 d15:data:reset=0:$5BC5 mc PshHP 0:$2AE3 d15:data:reset=0:$5DD0 mc Peekmm 0:$2AE4 d15:data:reset=0:$0613 mc BraIf0+19 0:$2AE5 d15:data:reset=0:$18FC mc Lget+252 0:$2AE6 d15:data:reset=0:$18FC mc Lget+252 0:$2AE7 d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$2AE8 d15:data:reset=0:$C4AA mc Sru15+15-8 0:$2AE9 d15:data:reset=0:$18FD mc Lget+253 0:$2AEA d15:data:reset=0:$07FD mc Lvar+253 0:$2AEB d15:data:reset=0:$5DB0 mc Peekpp 0:$2AEC d15:data:reset=0:$5E87 mc AtIndexPoke 0:$2AED d15:data:reset=0:$18FC mc Lget+252 0:$2AEE d15:data:reset=0:$07FC mc Lvar+252 0:$2AEF d15:data:reset=0:$5DB0 mc Peekpp 0:$2AF0 d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$2AF1 d15:data:reset=0:$0DFF mc Int8+255 0:$2AF2 d15:data:reset=0:$5A0F mc And 0:$2AF3 d15:data:reset=0:$18FD mc Lget+253 0:$2AF4 d15:data:reset=0:$07FD mc Lvar+253 0:$2AF5 d15:data:reset=0:$5DB0 mc Peekpp 0:$2AF6 d15:data:reset=0:$5E87 mc AtIndexPoke 0:$2AF7 d15:data:reset=0:$01EA mc Bra-22 0:$2AF8 d15:data:reset=0:$5FF7 mc MDrop0_Next-5 : copy_i8_to_i16__6uint16AEC_6uint16_6uint16AEC_6uint16_ ( uint16[]¢, uint16, uint16[]¢, uint16 ) Millicoded // Size: 35 microcodes 0:$2A42 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$2A43 0:data:reset=0:$6A46 0:$2A44 0:000011:A1=A2:D0=D0 jp millicoded // * Millicoded 0:$2A45 d15:data:reset=0:$5F70 0:$2A46 d15:data:reset=0:$18FD mc Lget+253 0:$2A47 d15:data:reset=0:$482D mc Count 0:$2A48 d15:data:reset=0:$18FD mc Lget+253 0:$2A49 d15:data:reset=0:$5BAC mc Sub 0:$2A4A d15:data:reset=0:$C4B1 mc Sru15+15-1 0:$2A4B d15:data:reset=0:$18FE mc Lget+254 0:$2A4C d15:data:reset=0:$482D mc Count 0:$2A4D d15:data:reset=0:$18FE mc Lget+254 0:$2A4E d15:data:reset=0:$5BAC mc Sub 0:$2A4F d15:data:reset=0:$480F mc Umin 0:$2A50 d15:data:reset=0:$5BC5 mc PshHP 0:$2A51 d15:data:reset=0:$5DD0 mc Peekmm 0:$2A52 d15:data:reset=0:$0611 mc BraIf0+17 0:$2A53 d15:data:reset=0:$18FC mc Lget+252 0:$2A54 d15:data:reset=0:$07FC mc Lvar+252 0:$2A55 d15:data:reset=0:$5DB0 mc Peekpp 0:$2A56 d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$2A57 d15:data:reset=0:$C39B mc Sli15+15-8 0:$2A58 d15:data:reset=0:$18FB mc Lget+251 0:$2A59 d15:data:reset=0:$07FB mc Lvar+251 0:$2A5A d15:data:reset=0:$5DB0 mc Peekpp 0:$2A5B d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$2A5C d15:data:reset=0:$0DFF mc Int8+255 0:$2A5D d15:data:reset=0:$5A0F mc And 0:$2A5E d15:data:reset=0:$5AAD mc Add 0:$2A5F d15:data:reset=0:$18FD mc Lget+253 0:$2A60 d15:data:reset=0:$07FD mc Lvar+253 0:$2A61 d15:data:reset=0:$5DB0 mc Peekpp 0:$2A62 d15:data:reset=0:$5E87 mc AtIndexPoke 0:$2A63 d15:data:reset=0:$01EC mc Bra-20 0:$2A64 d15:data:reset=0:$5FF7 mc MDrop0_Next-5 : midstr__8ucs2charAEC_5int16_5int16_8ucs2charATOE ( ucs2str¢, int16, int16 -- str_r ) Millicoded // Size: 14 microcodes 0:$221D 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$221E 0:data:reset=0:$6221 0:$221F 0:000011:A1=A2:D0=D0 jp millicoded // * Millicoded 0:$2220 d15:data:reset=0:$5F70 0:$2221 d15:data:reset=0:$18FE mc Lget+254 0:$2222 d15:data:reset=0:$18FE mc Lget+254 0:$2223 d15:data:reset=0:$18FD mc Lget+253 0:$2224 d15:data:reset=0:$18FD mc Lget+253 0:$2225 d15:data:reset=0:$5AAD mc Add 0:$2226 d15:data:reset=0:$7D04 mc SubStr 0:$2227 d15:data:reset=0:$5FA1 mc ToR3 0:$2228 d15:data:reset=0:$5F31 mc MDrop0-3 0:$2229 d15:data:reset=0:$5F96 mc FromR3 0:$222A d15:data:reset=0:$5ACD mc Ret : midstr__8ucs2charAEC_5int16_8ucs2charATOE ( ucs2str¢, int16 -- str_r ) Millicoded // Size: 13 microcodes 0:$20CC 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$20CD 0:data:reset=0:$60D0 0:$20CE 0:000011:A1=A0:D0=D0 jp millicoded // * Millicoded 0:$20CF d15:data:reset=0:$5F70 0:$20D0 d15:data:reset=0:$18FF mc Lget+255 0:$20D1 d15:data:reset=0:$18FF mc Lget+255 0:$20D2 d15:data:reset=0:$18FD mc Lget+253 0:$20D3 d15:data:reset=0:$482D mc Count 0:$20D4 d15:data:reset=0:$7D04 mc SubStr 0:$20D5 d15:data:reset=0:$5FA1 mc ToR3 0:$20D6 d15:data:reset=0:$5F32 mc MDrop0-2 0:$20D7 d15:data:reset=0:$5F96 mc FromR3 0:$20D8 d15:data:reset=0:$5ACD mc Ret : leftstr__8ucs2charAEC_5int16_8ucs2charATOE ( ucs2str¢, int16 -- str_r ) Millicoded // Size: 12 microcodes 0:$204C 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$204D 0:data:reset=0:$6050 0:$204E 0:000011:A1=A0:D0=D0 jp millicoded // * Millicoded 0:$204F d15:data:reset=0:$5F70 0:$2050 d15:data:reset=0:$18FF mc Lget+255 0:$2051 d15:data:reset=0:$0D00 mc Int8+0 0:$2052 d15:data:reset=0:$18FE mc Lget+254 0:$2053 d15:data:reset=0:$7D04 mc SubStr 0:$2054 d15:data:reset=0:$5FA1 mc ToR3 0:$2055 d15:data:reset=0:$5F32 mc MDrop0-2 0:$2056 d15:data:reset=0:$5F96 mc FromR3 0:$2057 d15:data:reset=0:$5ACD mc Ret : rightstr__8ucs2charAEC_5int16_8ucs2charATOE ( ucs2str¢, int16 -- str_r ) Millicoded // Size: 16 microcodes 0:$2365 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$2366 0:data:reset=0:$6369 0:$2367 0:000011:A1=A3:D0=D0 jp millicoded // * Millicoded 0:$2368 d15:data:reset=0:$5F70 0:$2369 d15:data:reset=0:$18FF mc Lget+255 0:$236A d15:data:reset=0:$18FE mc Lget+254 0:$236B d15:data:reset=0:$482D mc Count 0:$236C d15:data:reset=0:$18FE mc Lget+254 0:$236D d15:data:reset=0:$5BAC mc Sub 0:$236E d15:data:reset=0:$18FD mc Lget+253 0:$236F d15:data:reset=0:$482D mc Count 0:$2370 d15:data:reset=0:$7D04 mc SubStr 0:$2371 d15:data:reset=0:$5FA1 mc ToR3 0:$2372 d15:data:reset=0:$5F32 mc MDrop0-2 0:$2373 d15:data:reset=0:$5F96 mc FromR3 0:$2374 d15:data:reset=0:$5ACD mc Ret : catstr__8ucs2charAE_8ucs2charAEC_8ucs2charAE ( ucs2str, ucs2str¢ -- ucs2str ) Millicoded // Size: 35 microcodes 0:$2A1F 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$2A20 0:data:reset=0:$6A23 0:$2A21 0:000011:A1=A2:D0=D0 jp millicoded // * Millicoded 0:$2A22 d15:data:reset=0:$5F70 0:$2A23 d15:data:reset=0:$18FF mc Lget+255 0:$2A24 d15:data:reset=0:$482D mc Count 0:$2A25 d15:data:reset=0:$18FF mc Lget+255 0:$2A26 d15:data:reset=0:$482D mc Count 0:$2A27 d15:data:reset=0:$18FF mc Lget+255 0:$2A28 d15:data:reset=0:$18FF mc Lget+255 0:$2A29 d15:data:reset=0:$5AAD mc Add 0:$2A2A d15:data:reset=0:$4203 mc Alloc 0:$2A2B d15:data:reset=0:$45F6 mc Dup 0:$2A2C d15:data:reset=0:$0D00 mc Int8+0 0:$2A2D d15:data:reset=0:$5E2E mc AtIndex 0:$2A2E d15:data:reset=0:$18FB mc Lget+251 0:$2A2F d15:data:reset=0:$0D00 mc Int8+0 0:$2A30 d15:data:reset=0:$5E2E mc AtIndex 0:$2A31 d15:data:reset=0:$18FC mc Lget+252 0:$2A32 d15:data:reset=0:$476D mc TradMemCpy 0:$2A33 d15:data:reset=0:$45F6 mc Dup 0:$2A34 d15:data:reset=0:$18FD mc Lget+253 0:$2A35 d15:data:reset=0:$5E2E mc AtIndex 0:$2A36 d15:data:reset=0:$18FC mc Lget+252 0:$2A37 d15:data:reset=0:$0D00 mc Int8+0 0:$2A38 d15:data:reset=0:$5E2E mc AtIndex 0:$2A39 d15:data:reset=0:$18FD mc Lget+253 0:$2A3A d15:data:reset=0:$476D mc TradMemCpy 0:$2A3B d15:data:reset=0:$45F6 mc Dup 0:$2A3C d15:data:reset=0:$4667 mc Retain 0:$2A3D d15:data:reset=0:$07FB mc Lvar+251 0:$2A3E d15:data:reset=0:$7A05 mc SwapWithVar 0:$2A3F d15:data:reset=0:$4581 mc DropStr 0:$2A40 d15:data:reset=0:$4581 mc DropStr 0:$2A41 d15:data:reset=0:$5FF9 mc MDrop0_Next-3 : catstr__8ucs2charAEC_8ucs2charAE_8ucs2charAE ( ucs2str¢, ucs2str -- ucs2str ) Millicoded // Size: 37 microcodes 0:$2A8A 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$2A8B 0:data:reset=0:$6A8E 0:$2A8C 0:000011:A1=A2:D0=D0 jp millicoded // * Millicoded 0:$2A8D d15:data:reset=0:$5F70 0:$2A8E d15:data:reset=0:$18FF mc Lget+255 0:$2A8F d15:data:reset=0:$482D mc Count 0:$2A90 d15:data:reset=0:$18FF mc Lget+255 0:$2A91 d15:data:reset=0:$482D mc Count 0:$2A92 d15:data:reset=0:$18FF mc Lget+255 0:$2A93 d15:data:reset=0:$18FF mc Lget+255 0:$2A94 d15:data:reset=0:$5AAD mc Add 0:$2A95 d15:data:reset=0:$4203 mc Alloc 0:$2A96 d15:data:reset=0:$45F6 mc Dup 0:$2A97 d15:data:reset=0:$0D00 mc Int8+0 0:$2A98 d15:data:reset=0:$5E2E mc AtIndex 0:$2A99 d15:data:reset=0:$18FB mc Lget+251 0:$2A9A d15:data:reset=0:$0D00 mc Int8+0 0:$2A9B d15:data:reset=0:$5E2E mc AtIndex 0:$2A9C d15:data:reset=0:$18FC mc Lget+252 0:$2A9D d15:data:reset=0:$476D mc TradMemCpy 0:$2A9E d15:data:reset=0:$45F6 mc Dup 0:$2A9F d15:data:reset=0:$18FD mc Lget+253 0:$2AA0 d15:data:reset=0:$5E2E mc AtIndex 0:$2AA1 d15:data:reset=0:$18FC mc Lget+252 0:$2AA2 d15:data:reset=0:$0D00 mc Int8+0 0:$2AA3 d15:data:reset=0:$5E2E mc AtIndex 0:$2AA4 d15:data:reset=0:$18FD mc Lget+253 0:$2AA5 d15:data:reset=0:$476D mc TradMemCpy 0:$2AA6 d15:data:reset=0:$45F6 mc Dup 0:$2AA7 d15:data:reset=0:$4667 mc Retain 0:$2AA8 d15:data:reset=0:$5FA7 mc ToR 0:$2AA9 d15:data:reset=0:$4581 mc DropStr 0:$2AAA d15:data:reset=0:$5F32 mc MDrop0-2 0:$2AAB d15:data:reset=0:$4581 mc DropStr 0:$2AAC d15:data:reset=0:$5F33 mc MDrop0-1 0:$2AAD d15:data:reset=0:$5F9C mc FromR 0:$2AAE d15:data:reset=0:$5ACD mc Ret : catstr__8ucs2charAEC_8ucs2charAEC_8ucs2charAE ( ucs2str¢, ucs2str¢ -- ucs2str ) Millicoded // Size: 35 microcodes 0:$29FC 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$29FD 0:data:reset=0:$6A00 0:$29FE 0:000011:A1=A2:D0=D0 jp millicoded // * Millicoded 0:$29FF d15:data:reset=0:$5F70 0:$2A00 d15:data:reset=0:$18FF mc Lget+255 0:$2A01 d15:data:reset=0:$482D mc Count 0:$2A02 d15:data:reset=0:$18FF mc Lget+255 0:$2A03 d15:data:reset=0:$482D mc Count 0:$2A04 d15:data:reset=0:$18FF mc Lget+255 0:$2A05 d15:data:reset=0:$18FF mc Lget+255 0:$2A06 d15:data:reset=0:$5AAD mc Add 0:$2A07 d15:data:reset=0:$4203 mc Alloc 0:$2A08 d15:data:reset=0:$45F6 mc Dup 0:$2A09 d15:data:reset=0:$0D00 mc Int8+0 0:$2A0A d15:data:reset=0:$5E2E mc AtIndex 0:$2A0B d15:data:reset=0:$18FB mc Lget+251 0:$2A0C d15:data:reset=0:$0D00 mc Int8+0 0:$2A0D d15:data:reset=0:$5E2E mc AtIndex 0:$2A0E d15:data:reset=0:$18FC mc Lget+252 0:$2A0F d15:data:reset=0:$476D mc TradMemCpy 0:$2A10 d15:data:reset=0:$45F6 mc Dup 0:$2A11 d15:data:reset=0:$18FD mc Lget+253 0:$2A12 d15:data:reset=0:$5E2E mc AtIndex 0:$2A13 d15:data:reset=0:$18FC mc Lget+252 0:$2A14 d15:data:reset=0:$0D00 mc Int8+0 0:$2A15 d15:data:reset=0:$5E2E mc AtIndex 0:$2A16 d15:data:reset=0:$18FD mc Lget+253 0:$2A17 d15:data:reset=0:$476D mc TradMemCpy 0:$2A18 d15:data:reset=0:$45F6 mc Dup 0:$2A19 d15:data:reset=0:$4667 mc Retain 0:$2A1A d15:data:reset=0:$5FA7 mc ToR 0:$2A1B d15:data:reset=0:$4581 mc DropStr 0:$2A1C d15:data:reset=0:$5F30 mc MDrop0-4 0:$2A1D d15:data:reset=0:$5F9C mc FromR 0:$2A1E d15:data:reset=0:$5ACD mc Ret : catstr__8ucs2charAE_8ucs2charAEC_6uint16_6uint16_8ucs2charAE ( ucs2str, ucs2str¢, uint16, uint16 -- ucs2str ) Millicoded // Size: 38 microcodes 0:$2AF9 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$2AFA 0:data:reset=0:$6AFD 0:$2AFB 0:000011:A1=A2:D0=D0 jp millicoded // * Millicoded 0:$2AFC d15:data:reset=0:$5F70 0:$2AFD d15:data:reset=0:$18FD mc Lget+253 0:$2AFE d15:data:reset=0:$482D mc Count 0:$2AFF d15:data:reset=0:$18FF mc Lget+255 0:$2B00 d15:data:reset=0:$5AAD mc Add 0:$2B01 d15:data:reset=0:$18FE mc Lget+254 0:$2B02 d15:data:reset=0:$5BAC mc Sub 0:$2B03 d15:data:reset=0:$4203 mc Alloc 0:$2B04 d15:data:reset=0:$45F6 mc Dup 0:$2B05 d15:data:reset=0:$0D00 mc Int8+0 0:$2B06 d15:data:reset=0:$5E2E mc AtIndex 0:$2B07 d15:data:reset=0:$18FB mc Lget+251 0:$2B08 d15:data:reset=0:$0D00 mc Int8+0 0:$2B09 d15:data:reset=0:$5E2E mc AtIndex 0:$2B0A d15:data:reset=0:$18FA mc Lget+250 0:$2B0B d15:data:reset=0:$482D mc Count 0:$2B0C d15:data:reset=0:$476D mc TradMemCpy 0:$2B0D d15:data:reset=0:$45F6 mc Dup 0:$2B0E d15:data:reset=0:$18FB mc Lget+251 0:$2B0F d15:data:reset=0:$482D mc Count 0:$2B10 d15:data:reset=0:$5E2E mc AtIndex 0:$2B11 d15:data:reset=0:$18FC mc Lget+252 0:$2B12 d15:data:reset=0:$18FC mc Lget+252 0:$2B13 d15:data:reset=0:$5E2E mc AtIndex 0:$2B14 d15:data:reset=0:$18FD mc Lget+253 0:$2B15 d15:data:reset=0:$18FB mc Lget+251 0:$2B16 d15:data:reset=0:$5BAC mc Sub 0:$2B17 d15:data:reset=0:$476D mc TradMemCpy 0:$2B18 d15:data:reset=0:$45F6 mc Dup 0:$2B19 d15:data:reset=0:$4667 mc Retain 0:$2B1A d15:data:reset=0:$07FB mc Lvar+251 0:$2B1B d15:data:reset=0:$7A05 mc SwapWithVar 0:$2B1C d15:data:reset=0:$4581 mc DropStr 0:$2B1D d15:data:reset=0:$4581 mc DropStr 0:$2B1E d15:data:reset=0:$5FF9 mc MDrop0_Next-3 : catstr__8ucs2charAEC_6uint16_6uint16_8ucs2charAE_8ucs2charAE ( ucs2str¢, uint16, uint16, ucs2str -- ucs2str ) Millicoded // Size: 40 microcodes 0:$2B6C 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$2B6D 0:data:reset=0:$6B70 0:$2B6E 0:000011:A1=A3:D0=D0 jp millicoded // * Millicoded 0:$2B6F d15:data:reset=0:$5F70 0:$2B70 d15:data:reset=0:$45F6 mc Dup 0:$2B71 d15:data:reset=0:$482D mc Count 0:$2B72 d15:data:reset=0:$18FE mc Lget+254 0:$2B73 d15:data:reset=0:$5AAD mc Add 0:$2B74 d15:data:reset=0:$18FD mc Lget+253 0:$2B75 d15:data:reset=0:$5BAC mc Sub 0:$2B76 d15:data:reset=0:$4203 mc Alloc 0:$2B77 d15:data:reset=0:$45F6 mc Dup 0:$2B78 d15:data:reset=0:$0D00 mc Int8+0 0:$2B79 d15:data:reset=0:$5E2E mc AtIndex 0:$2B7A d15:data:reset=0:$18FB mc Lget+251 0:$2B7B d15:data:reset=0:$18FB mc Lget+251 0:$2B7C d15:data:reset=0:$5E2E mc AtIndex 0:$2B7D d15:data:reset=0:$18FC mc Lget+252 0:$2B7E d15:data:reset=0:$18FA mc Lget+250 0:$2B7F d15:data:reset=0:$5BAC mc Sub 0:$2B80 d15:data:reset=0:$476D mc TradMemCpy 0:$2B81 d15:data:reset=0:$45F6 mc Dup 0:$2B82 d15:data:reset=0:$18FD mc Lget+253 0:$2B83 d15:data:reset=0:$18FB mc Lget+251 0:$2B84 d15:data:reset=0:$5BAC mc Sub 0:$2B85 d15:data:reset=0:$5E2E mc AtIndex 0:$2B86 d15:data:reset=0:$18FE mc Lget+254 0:$2B87 d15:data:reset=0:$0D00 mc Int8+0 0:$2B88 d15:data:reset=0:$5E2E mc AtIndex 0:$2B89 d15:data:reset=0:$18FD mc Lget+253 0:$2B8A d15:data:reset=0:$482D mc Count 0:$2B8B d15:data:reset=0:$476D mc TradMemCpy 0:$2B8C d15:data:reset=0:$45F6 mc Dup 0:$2B8D d15:data:reset=0:$4667 mc Retain 0:$2B8E d15:data:reset=0:$5FA7 mc ToR 0:$2B8F d15:data:reset=0:$4581 mc DropStr 0:$2B90 d15:data:reset=0:$4581 mc DropStr 0:$2B91 d15:data:reset=0:$5F31 mc MDrop0-3 0:$2B92 d15:data:reset=0:$5F9C mc FromR 0:$2B93 d15:data:reset=0:$5ACD mc Ret : catchar__8ucs2charAEC_6uint16_6uint16_8ucs2char_8ucs2charAE ( ucs2str¢, uint16, uint16, ucs2char -- ucs2str ) Millicoded // Size: 29 microcodes 0:$288A 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$288B 0:data:reset=0:$688E 0:$288C 0:000011:A1=A0:D0=D0 jp millicoded // * Millicoded 0:$288D d15:data:reset=0:$5F70 0:$288E d15:data:reset=0:$18FE mc Lget+254 0:$288F d15:data:reset=0:$07FE mc Lvar+254 0:$2890 d15:data:reset=0:$5E33 mc SubPoke 0:$2891 d15:data:reset=0:$18FF mc Lget+255 0:$2892 d15:data:reset=0:$0B01 mc Addq+1 0:$2893 d15:data:reset=0:$4203 mc Alloc 0:$2894 d15:data:reset=0:$45F6 mc Dup 0:$2895 d15:data:reset=0:$0D00 mc Int8+0 0:$2896 d15:data:reset=0:$5E2E mc AtIndex 0:$2897 d15:data:reset=0:$18FB mc Lget+251 0:$2898 d15:data:reset=0:$18FB mc Lget+251 0:$2899 d15:data:reset=0:$5E2E mc AtIndex 0:$289A d15:data:reset=0:$18FC mc Lget+252 0:$289B d15:data:reset=0:$476D mc TradMemCpy 0:$289C d15:data:reset=0:$18FF mc Lget+255 0:$289D d15:data:reset=0:$18FF mc Lget+255 0:$289E d15:data:reset=0:$4604 mc Last 0:$289F d15:data:reset=0:$5C5A mc Poke 0:$28A0 d15:data:reset=0:$45F6 mc Dup 0:$28A1 d15:data:reset=0:$4667 mc Retain 0:$28A2 d15:data:reset=0:$5FA7 mc ToR 0:$28A3 d15:data:reset=0:$4581 mc DropStr 0:$28A4 d15:data:reset=0:$5F30 mc MDrop0-4 0:$28A5 d15:data:reset=0:$5F9C mc FromR 0:$28A6 d15:data:reset=0:$5ACD mc Ret : catchar__8ucs2charAEC_8ucs2char_8ucs2charAE ( ucs2str¢, ucs2char -- ucs2str ) Millicoded // Size: 28 microcodes 0:$2836 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$2837 0:data:reset=0:$683A 0:$2838 0:000011:A1=A0:D0=D0 jp millicoded // * Millicoded 0:$2839 d15:data:reset=0:$5F70 0:$283A d15:data:reset=0:$18FF mc Lget+255 0:$283B d15:data:reset=0:$482D mc Count 0:$283C d15:data:reset=0:$45F6 mc Dup 0:$283D d15:data:reset=0:$0B01 mc Addq+1 0:$283E d15:data:reset=0:$4203 mc Alloc 0:$283F d15:data:reset=0:$45F6 mc Dup 0:$2840 d15:data:reset=0:$0D00 mc Int8+0 0:$2841 d15:data:reset=0:$5E2E mc AtIndex 0:$2842 d15:data:reset=0:$18FC mc Lget+252 0:$2843 d15:data:reset=0:$0D00 mc Int8+0 0:$2844 d15:data:reset=0:$5E2E mc AtIndex 0:$2845 d15:data:reset=0:$18FD mc Lget+253 0:$2846 d15:data:reset=0:$476D mc TradMemCpy 0:$2847 d15:data:reset=0:$18FE mc Lget+254 0:$2848 d15:data:reset=0:$18FF mc Lget+255 0:$2849 d15:data:reset=0:$4604 mc Last 0:$284A d15:data:reset=0:$5C5A mc Poke 0:$284B d15:data:reset=0:$45F6 mc Dup 0:$284C d15:data:reset=0:$4667 mc Retain 0:$284D d15:data:reset=0:$5FA7 mc ToR 0:$284E d15:data:reset=0:$4581 mc DropStr 0:$284F d15:data:reset=0:$5F31 mc MDrop0-3 0:$2850 d15:data:reset=0:$5F9C mc FromR 0:$2851 d15:data:reset=0:$5ACD mc Ret : catchar__8ucs2charAE_8ucs2char_8ucs2charAE ( ucs2str, ucs2char -- ucs2str ) Millicoded // Size: 11 microcodes 0:$1F54 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$1F55 0:data:reset=0:$5F58 0:$1F56 0:000011:A1=A7:D0=D0 jp millicoded // * Millicoded 0:$1F57 d15:data:reset=0:$5F70 0:$1F58 d15:data:reset=0:$18FF mc Lget+255 0:$1F59 d15:data:reset=0:$18FF mc Lget+255 0:$1F5A d15:data:reset=0:$6836 mc catchar__8ucs2charAEC_8ucs2char_8ucs2charAE 0:$1F5B d15:data:reset=0:$07FE mc Lvar+254 0:$1F5C d15:data:reset=0:$7A05 mc SwapWithVar 0:$1F5D d15:data:reset=0:$4581 mc DropStr 0:$1F5E d15:data:reset=0:$5FFB mc MDrop0_Next-1 : match__8ucs2charAEC_8ucs2charAEC_4bool ( ucs2str¢, ucs2str¢ -- bool ) Millicoded // Size: 116 microcodes 0:$3E04 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$3E05 0:data:reset=0:$7E08 0:$3E06 0:000011:A1=A6:D0=D0 jp millicoded // * Millicoded 0:$3E07 d15:data:reset=0:$5F70 0:$3E08 d15:data:reset=0:$45F6 mc Dup 0:$3E09 d15:data:reset=0:$0D2A mc Int8+42 0:$3E0A d15:data:reset=0:$0D00 mc Int8+0 0:$3E0B d15:data:reset=0:$65F4 mc find__8ucs2charAEC_8ucs2char_6uint16_6uint16 0:$3E0C d15:data:reset=0:$45F6 mc Dup 0:$3E0D d15:data:reset=0:$18FF mc Lget+255 0:$3E0E d15:data:reset=0:$0DFF mc Int8+255 0:$3E0F d15:data:reset=0:$0EFF mc Int16+255 0:$3E10 d15:data:reset=0:$47DF mc Eq 0:$3E11 d15:data:reset=0:$0610 mc BraIf0+16 0:$3E12 d15:data:reset=0:$18FD mc Lget+253 0:$3E13 d15:data:reset=0:$482D mc Count 0:$3E14 d15:data:reset=0:$18FD mc Lget+253 0:$3E15 d15:data:reset=0:$482D mc Count 0:$3E16 d15:data:reset=0:$47DF mc Eq 0:$3E17 d15:data:reset=0:$47E5 mc And0 0:$3E18 d15:data:reset=0:$0208 mc Bra+8 0:$3E19 d15:data:reset=0:$18FD mc Lget+253 0:$3E1A d15:data:reset=0:$0D00 mc Int8+0 0:$3E1B d15:data:reset=0:$18FC mc Lget+252 0:$3E1C d15:data:reset=0:$0D00 mc Int8+0 0:$3E1D d15:data:reset=0:$18FA mc Lget+250 0:$3E1E d15:data:reset=0:$482D mc Count 0:$3E1F d15:data:reset=0:$68E2 mc matches__8ucs2charAEC_5int16_8ucs2charAEC_5int16_5int16_4bool 0:$3E20 d15:data:reset=0:$4837 mc Bool 0:$3E21 d15:data:reset=0:$0255 mc Bra+85 0:$3E22 d15:data:reset=0:$18FD mc Lget+253 0:$3E23 d15:data:reset=0:$482D mc Count 0:$3E24 d15:data:reset=0:$18FE mc Lget+254 0:$3E25 d15:data:reset=0:$46CC mc Ult 0:$3E26 d15:data:reset=0:$0602 mc BraIf0+2 0:$3E27 d15:data:reset=0:$0D00 mc Int8+0 0:$3E28 d15:data:reset=0:$024E mc Bra+78 0:$3E29 d15:data:reset=0:$18FD mc Lget+253 0:$3E2A d15:data:reset=0:$0D00 mc Int8+0 0:$3E2B d15:data:reset=0:$18FC mc Lget+252 0:$3E2C d15:data:reset=0:$0D00 mc Int8+0 0:$3E2D d15:data:reset=0:$18FB mc Lget+251 0:$3E2E d15:data:reset=0:$68E2 mc matches__8ucs2charAEC_5int16_8ucs2charAEC_5int16_5int16_4bool 0:$3E2F d15:data:reset=0:$0402 mc BraIf1+2 0:$3E30 d15:data:reset=0:$0D00 mc Int8+0 0:$3E31 d15:data:reset=0:$0245 mc Bra+69 0:$3E32 d15:data:reset=0:$18FE mc Lget+254 0:$3E33 d15:data:reset=0:$0D2A mc Int8+42 0:$3E34 d15:data:reset=0:$18FC mc Lget+252 0:$3E35 d15:data:reset=0:$482D mc Count 0:$3E36 d15:data:reset=0:$6639 mc rfind__8ucs2charAEC_8ucs2char_6uint16_6uint16 0:$3E37 d15:data:reset=0:$18FC mc Lget+252 0:$3E38 d15:data:reset=0:$482D mc Count 0:$3E39 d15:data:reset=0:$18FC mc Lget+252 0:$3E3A d15:data:reset=0:$482D mc Count 0:$3E3B d15:data:reset=0:$18FE mc Lget+254 0:$3E3C d15:data:reset=0:$0B01 mc Addq+1 0:$3E3D d15:data:reset=0:$5BAC mc Sub 0:$3E3E d15:data:reset=0:$5BAC mc Sub 0:$3E3F d15:data:reset=0:$45F6 mc Dup 0:$3E40 d15:data:reset=0:$18FD mc Lget+253 0:$3E41 d15:data:reset=0:$C2E0 mc Lt 0:$3E42 d15:data:reset=0:$0603 mc BraIf0+3 0:$3E43 d15:data:reset=0:$0D00 mc Int8+0 0:$3E44 d15:data:reset=0:$5F28 mc MNip0-2 0:$3E45 d15:data:reset=0:$0231 mc Bra+49 0:$3E46 d15:data:reset=0:$18FB mc Lget+251 0:$3E47 d15:data:reset=0:$18FF mc Lget+255 0:$3E48 d15:data:reset=0:$18FA mc Lget+250 0:$3E49 d15:data:reset=0:$18FC mc Lget+252 0:$3E4A d15:data:reset=0:$0B01 mc Addq+1 0:$3E4B d15:data:reset=0:$18F8 mc Lget+248 0:$3E4C d15:data:reset=0:$482D mc Count 0:$3E4D d15:data:reset=0:$68E2 mc matches__8ucs2charAEC_5int16_8ucs2charAEC_5int16_5int16_4bool 0:$3E4E d15:data:reset=0:$0403 mc BraIf1+3 0:$3E4F d15:data:reset=0:$0D00 mc Int8+0 0:$3E50 d15:data:reset=0:$5F28 mc MNip0-2 0:$3E51 d15:data:reset=0:$0225 mc Bra+37 0:$3E52 d15:data:reset=0:$18FD mc Lget+253 0:$3E53 d15:data:reset=0:$18FE mc Lget+254 0:$3E54 d15:data:reset=0:$47DF mc Eq 0:$3E55 d15:data:reset=0:$041F mc BraIf1+31 0:$3E56 d15:data:reset=0:$07FD mc Lvar+253 0:$3E57 d15:data:reset=0:$5E7E mc Incr 0:$3E58 d15:data:reset=0:$18FC mc Lget+252 0:$3E59 d15:data:reset=0:$0D2A mc Int8+42 0:$3E5A d15:data:reset=0:$18FB mc Lget+251 0:$3E5B d15:data:reset=0:$65F4 mc Find 0:$3E5C d15:data:reset=0:$18FA mc Lget+250 0:$3E5D d15:data:reset=0:$18FC mc Lget+252 0:$3E5E d15:data:reset=0:$18FD mc Lget+253 0:$3E5F d15:data:reset=0:$18F8 mc Lget+248 0:$3E60 d15:data:reset=0:$18F8 mc Lget+248 0:$3E61 d15:data:reset=0:$18FB mc Lget+251 0:$3E62 d15:data:reset=0:$686E mc find__8ucs2charAEC_5int16_5int16_8ucs2charAEC_5int16_5int16_5int16 0:$3E63 d15:data:reset=0:$8EFD mc Lset+253 0:$3E64 d15:data:reset=0:$18FD mc Lget+253 0:$3E65 d15:data:reset=0:$0DFF mc Int8+255 0:$3E66 d15:data:reset=0:$0EFF mc Int16+255 0:$3E67 d15:data:reset=0:$47DF mc Eq 0:$3E68 d15:data:reset=0:$0603 mc BraIf0+3 0:$3E69 d15:data:reset=0:$0D00 mc Int8+0 0:$3E6A d15:data:reset=0:$5F27 mc MNip0-3 0:$3E6B d15:data:reset=0:$020B mc Bra+11 0:$3E6C d15:data:reset=0:$45F6 mc Dup 0:$3E6D d15:data:reset=0:$18FB mc Lget+251 0:$3E6E d15:data:reset=0:$5BAC mc Sub 0:$3E6F d15:data:reset=0:$07FC mc Lvar+252 0:$3E70 d15:data:reset=0:$5DA8 mc AddPoke 0:$3E71 d15:data:reset=0:$45F6 mc Dup 0:$3E72 d15:data:reset=0:$8EFC mc Lset+252 0:$3E73 d15:data:reset=0:$5F33 mc MDrop0-1 0:$3E74 d15:data:reset=0:$01DD mc Bra-35 0:$3E75 d15:data:reset=0:$0D01 mc Int8+1 0:$3E76 d15:data:reset=0:$5F28 mc MNip0-2 0:$3E77 d15:data:reset=0:$630D mc MNip0_Next-4 : find__8ucs2charAEC_8ucs2char_6uint16_6uint16 ( ucs2str¢, ucs2char, uint16 -- uint16 ) Millicoded // Size: 23 microcodes 0:$25F4 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$25F5 0:data:reset=0:$65F8 0:$25F6 0:000011:A1=A5:D0=D0 jp millicoded // * Millicoded 0:$25F7 d15:data:reset=0:$5F70 0:$25F8 d15:data:reset=0:$45F6 mc Dup 0:$25F9 d15:data:reset=0:$18FD mc Lget+253 0:$25FA d15:data:reset=0:$482D mc Count 0:$25FB d15:data:reset=0:$46CC mc Ult 0:$25FC d15:data:reset=0:$060B mc BraIf0+11 0:$25FD d15:data:reset=0:$18FE mc Lget+254 0:$25FE d15:data:reset=0:$18FF mc Lget+255 0:$25FF d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$2600 d15:data:reset=0:$18FE mc Lget+254 0:$2601 d15:data:reset=0:$47DF mc Eq 0:$2602 d15:data:reset=0:$0602 mc BraIf0+2 0:$2603 d15:data:reset=0:$45F6 mc Dup 0:$2604 d15:data:reset=0:$0205 mc Bra+5 0:$2605 d15:data:reset=0:$5BC5 mc PshHP 0:$2606 d15:data:reset=0:$5E7E mc Incr 0:$2607 d15:data:reset=0:$01F0 mc Bra-16 0:$2608 d15:data:reset=0:$0DFF mc Int8+255 0:$2609 d15:data:reset=0:$0EFF mc Int16+255 0:$260A d15:data:reset=0:$630E mc MNip0_Next-3 : rfind__8ucs2charAEC_8ucs2char_6uint16_6uint16 ( ucs2str¢, ucs2char, uint16 -- uint16 ) Millicoded // Size: 23 microcodes 0:$2639 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$263A 0:data:reset=0:$663D 0:$263B 0:000011:A1=A6:D0=D0 jp millicoded // * Millicoded 0:$263C d15:data:reset=0:$5F70 0:$263D d15:data:reset=0:$45F6 mc Dup 0:$263E d15:data:reset=0:$18FD mc Lget+253 0:$263F d15:data:reset=0:$482D mc Count 0:$2640 d15:data:reset=0:$46CC mc Ult 0:$2641 d15:data:reset=0:$060B mc BraIf0+11 0:$2642 d15:data:reset=0:$18FE mc Lget+254 0:$2643 d15:data:reset=0:$18FF mc Lget+255 0:$2644 d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$2645 d15:data:reset=0:$18FE mc Lget+254 0:$2646 d15:data:reset=0:$47DF mc Eq 0:$2647 d15:data:reset=0:$0602 mc BraIf0+2 0:$2648 d15:data:reset=0:$45F6 mc Dup 0:$2649 d15:data:reset=0:$0205 mc Bra+5 0:$264A d15:data:reset=0:$5BC5 mc PshHP 0:$264B d15:data:reset=0:$5EA2 mc Decr 0:$264C d15:data:reset=0:$01F0 mc Bra-16 0:$264D d15:data:reset=0:$0DFF mc Int8+255 0:$264E d15:data:reset=0:$0EFF mc Int16+255 0:$264F d15:data:reset=0:$630E mc MNip0_Next-3 : eq__8ucs2charAEC_6uint16_6uint16_8ucs2charAEC_6uint16_6uint16_4bool ( ucs2str¢, uint16, uint16, ucs2str¢, uint16, uint16 -- bool ) Millicoded // Size: 32 microcodes 0:$2998 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$2999 0:data:reset=0:$699C 0:$299A 0:000011:A1=A1:D0=D0 jp millicoded // * Millicoded 0:$299B d15:data:reset=0:$5F70 0:$299C d15:data:reset=0:$18FD mc Lget+253 0:$299D d15:data:reset=0:$18FB mc Lget+251 0:$299E d15:data:reset=0:$5BAC mc Sub 0:$299F d15:data:reset=0:$18FF mc Lget+255 0:$29A0 d15:data:reset=0:$18FD mc Lget+253 0:$29A1 d15:data:reset=0:$5BAC mc Sub 0:$29A2 d15:data:reset=0:$47D5 mc Ne 0:$29A3 d15:data:reset=0:$0602 mc BraIf0+2 0:$29A4 d15:data:reset=0:$0D00 mc Int8+0 0:$29A5 d15:data:reset=0:$0211 mc Bra+17 0:$29A6 d15:data:reset=0:$18FC mc Lget+252 0:$29A7 d15:data:reset=0:$18FC mc Lget+252 0:$29A8 d15:data:reset=0:$46CC mc Ult 0:$29A9 d15:data:reset=0:$060C mc BraIf0+12 0:$29AA d15:data:reset=0:$18FB mc Lget+251 0:$29AB d15:data:reset=0:$07FB mc Lvar+251 0:$29AC d15:data:reset=0:$5DB0 mc Peekpp 0:$29AD d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$29AE d15:data:reset=0:$18FD mc Lget+253 0:$29AF d15:data:reset=0:$07FD mc Lvar+253 0:$29B0 d15:data:reset=0:$5DB0 mc Peekpp 0:$29B1 d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$29B2 d15:data:reset=0:$47D5 mc Ne 0:$29B3 d15:data:reset=0:$05F2 mc BraIf0-14 0:$29B4 d15:data:reset=0:$0D00 mc Int8+0 0:$29B5 d15:data:reset=0:$0201 mc Bra+1 0:$29B6 d15:data:reset=0:$0D01 mc Int8+1 0:$29B7 d15:data:reset=0:$630B mc MNip0_Next-6 : eq__8ucs2charAEC_6uint16_6uint16_8ucs2charAEC_4bool ( ucs2str¢, uint16, uint16, ucs2str¢ -- bool ) Millicoded // Size: 12 microcodes 0:$1FD0 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$1FD1 0:data:reset=0:$5FD4 0:$1FD2 0:000011:A1=A7:D0=D0 jp millicoded // * Millicoded 0:$1FD3 d15:data:reset=0:$5F70 0:$1FD4 d15:data:reset=0:$18FD mc Lget+253 0:$1FD5 d15:data:reset=0:$18FD mc Lget+253 0:$1FD6 d15:data:reset=0:$18FD mc Lget+253 0:$1FD7 d15:data:reset=0:$7D04 mc SubStr 0:$1FD8 d15:data:reset=0:$18FD mc Lget+253 0:$1FD9 d15:data:reset=0:$5ECF mc RangeAll 0:$1FDA d15:data:reset=0:$6998 mc eq__8ucs2charAEC_6uint16_6uint16_8ucs2charAEC_6uint16_6uint16_4bool 0:$1FDB d15:data:reset=0:$630D mc MNip0_Next-4 : eq__8ucs2charAEC_8ucs2charAEC_6uint16_6uint16_4bool ( ucs2str¢, ucs2str¢, uint16, uint16 -- bool ) Millicoded // Size: 12 microcodes 0:$2028 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$2029 0:data:reset=0:$602C 0:$202A 0:000011:A1=A0:D0=D0 jp millicoded // * Millicoded 0:$202B d15:data:reset=0:$5F70 0:$202C d15:data:reset=0:$18FD mc Lget+253 0:$202D d15:data:reset=0:$5ECF mc RangeAll 0:$202E d15:data:reset=0:$18FB mc Lget+251 0:$202F d15:data:reset=0:$18FB mc Lget+251 0:$2030 d15:data:reset=0:$18FB mc Lget+251 0:$2031 d15:data:reset=0:$7D04 mc SubStr 0:$2032 d15:data:reset=0:$6998 mc eq__8ucs2charAEC_6uint16_6uint16_8ucs2charAEC_6uint16_6uint16_4bool 0:$2033 d15:data:reset=0:$630D mc MNip0_Next-4 : ne__8ucs2charAEC_6uint16_6uint16_8ucs2charAEC_6uint16_6uint16_4bool ( ucs2str¢, uint16, uint16, ucs2str¢, uint16, uint16 -- bool ) Millicoded 0:$1CC8 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$1CC9 0:data:reset=0:$5CCC 0:$1CCA 0:000011:A1=A4:D0=D0 jp millicoded // * Millicoded 0:$1CCB d15:data:reset=0:$5F70 0:$1CCC d15:data:reset=0:$6998 mc eq__8ucs2charAEC_6uint16_6uint16_8ucs2charAEC_6uint16_6uint16_4bool 0:$1CCD d15:data:reset=0:$4823 mc Not 0:$1CCE d15:data:reset=0:$5ACD mc Next : ne__8ucs2charAEC_8ucs2charATOE_4bool ( ucs2str¢, str_r -- bool ) Millicoded // Size: 13 microcodes 0:$2188 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$2189 0:data:reset=0:$618C 0:$218A 0:000011:A1=A1:D0=D0 jp millicoded // * Millicoded 0:$218B d15:data:reset=0:$5F70 0:$218C d15:data:reset=0:$18FD mc Lget+253 0:$218D d15:data:reset=0:$0D00 mc Int8+0 0:$218E d15:data:reset=0:$18FB mc Lget+251 0:$218F d15:data:reset=0:$482D mc Count 0:$2190 d15:data:reset=0:$7D04 mc SubStr 0:$2191 d15:data:reset=0:$07FB mc Lvar+251 0:$2192 d15:data:reset=0:$5F4A mc Peek3 0:$2193 d15:data:reset=0:$5CC8 mc ne__8ucs2charAEC_6uint16_6uint16_8ucs2charAEC_6uint16_6uint16_4bool 0:$2194 d15:data:reset=0:$630D mc MNip0_Next-4 : ne__8ucs2charATOE_8ucs2charAEC_4bool ( str_r, ucs2str¢ -- bool ) Millicoded // Size: 13 microcodes 0:$208B 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$208C 0:data:reset=0:$608F 0:$208D 0:000011:A1=A0:D0=D0 jp millicoded // * Millicoded 0:$208E d15:data:reset=0:$5F70 0:$208F d15:data:reset=0:$07FD mc Lvar+253 0:$2090 d15:data:reset=0:$5F4A mc Peek3 0:$2091 d15:data:reset=0:$18FD mc Lget+253 0:$2092 d15:data:reset=0:$0D00 mc Int8+0 0:$2093 d15:data:reset=0:$18FB mc Lget+251 0:$2094 d15:data:reset=0:$482D mc Count 0:$2095 d15:data:reset=0:$7D04 mc SubStr 0:$2096 d15:data:reset=0:$5CC8 mc ne__8ucs2charAEC_6uint16_6uint16_8ucs2charAEC_6uint16_6uint16_4bool 0:$2097 d15:data:reset=0:$630D mc MNip0_Next-4 : AppendGl__8ucs2charAE_8ucs2charAEP_ ( ucs2str, ucs2str& ) Millicoded // Size: 38 microcodes 0:$2B1F 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$2B20 0:data:reset=0:$6B23 0:$2B21 0:000011:A1=A3:D0=D0 jp millicoded // * Millicoded 0:$2B22 d15:data:reset=0:$5F70 0:$2B23 d15:data:reset=0:$45F6 mc Dup 0:$2B24 d15:data:reset=0:$5AC5 mc Peek 0:$2B25 d15:data:reset=0:$4667 mc Retain 0:$2B26 d15:data:reset=0:$45F6 mc Dup 0:$2B27 d15:data:reset=0:$482D mc Count 0:$2B28 d15:data:reset=0:$18FD mc Lget+253 0:$2B29 d15:data:reset=0:$482D mc Count 0:$2B2A d15:data:reset=0:$5AAD mc Add 0:$2B2B d15:data:reset=0:$6325 mc AllocTrackedVref 0:$2B2C d15:data:reset=0:$18FF mc Lget+255 0:$2B2D d15:data:reset=0:$5AC5 mc Peek 0:$2B2E d15:data:reset=0:$0D00 mc Int8+0 0:$2B2F d15:data:reset=0:$5E2E mc AtIndex 0:$2B30 d15:data:reset=0:$18FF mc Lget+255 0:$2B31 d15:data:reset=0:$0D00 mc Int8+0 0:$2B32 d15:data:reset=0:$5E2E mc AtIndex 0:$2B33 d15:data:reset=0:$18FE mc Lget+254 0:$2B34 d15:data:reset=0:$482D mc Count 0:$2B35 d15:data:reset=0:$476D mc TradMemCpy 0:$2B36 d15:data:reset=0:$18FF mc Lget+255 0:$2B37 d15:data:reset=0:$5AC5 mc Peek 0:$2B38 d15:data:reset=0:$18FF mc Lget+255 0:$2B39 d15:data:reset=0:$482D mc Count 0:$2B3A d15:data:reset=0:$5E2E mc AtIndex 0:$2B3B d15:data:reset=0:$18FD mc Lget+253 0:$2B3C d15:data:reset=0:$0D00 mc Int8+0 0:$2B3D d15:data:reset=0:$5E2E mc AtIndex 0:$2B3E d15:data:reset=0:$18FC mc Lget+252 0:$2B3F d15:data:reset=0:$482D mc Count 0:$2B40 d15:data:reset=0:$476D mc TradMemCpy 0:$2B41 d15:data:reset=0:$4581 mc DropStr 0:$2B42 d15:data:reset=0:$5F33 mc MDrop0-1 0:$2B43 d15:data:reset=0:$4581 mc DropStr 0:$2B44 d15:data:reset=0:$5ACD mc Ret : AppendGl__8ucs2charAEAEC_8ucs2charAEAEP_ ( str_AE¢, str_AE& ) Millicoded // Size: 52 microcodes 0:$2DC1 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$2DC2 0:data:reset=0:$6DC5 0:$2DC3 0:000011:A1=A5:D0=D0 jp millicoded // * Millicoded 0:$2DC4 d15:data:reset=0:$5F70 0:$2DC5 d15:data:reset=0:$45F6 mc Dup 0:$2DC6 d15:data:reset=0:$5AC5 mc Peek 0:$2DC7 d15:data:reset=0:$4667 mc Retain 0:$2DC8 d15:data:reset=0:$45F6 mc Dup 0:$2DC9 d15:data:reset=0:$482D mc Count 0:$2DCA d15:data:reset=0:$18FD mc Lget+253 0:$2DCB d15:data:reset=0:$482D mc Count 0:$2DCC d15:data:reset=0:$5AAD mc Add 0:$2DCD d15:data:reset=0:$6325 mc AllocTrackedVref 0:$2DCE d15:data:reset=0:$18FF mc Lget+255 0:$2DCF d15:data:reset=0:$5AC5 mc Peek 0:$2DD0 d15:data:reset=0:$0D00 mc Int8+0 0:$2DD1 d15:data:reset=0:$5E2E mc AtIndex 0:$2DD2 d15:data:reset=0:$18FF mc Lget+255 0:$2DD3 d15:data:reset=0:$0D00 mc Int8+0 0:$2DD4 d15:data:reset=0:$5E2E mc AtIndex 0:$2DD5 d15:data:reset=0:$18FE mc Lget+254 0:$2DD6 d15:data:reset=0:$482D mc Count 0:$2DD7 d15:data:reset=0:$476D mc TradMemCpy 0:$2DD8 d15:data:reset=0:$18FF mc Lget+255 0:$2DD9 d15:data:reset=0:$5AC5 mc Peek 0:$2DDA d15:data:reset=0:$18FF mc Lget+255 0:$2DDB d15:data:reset=0:$482D mc Count 0:$2DDC d15:data:reset=0:$5E2E mc AtIndex 0:$2DDD d15:data:reset=0:$18FD mc Lget+253 0:$2DDE d15:data:reset=0:$0D00 mc Int8+0 0:$2DDF d15:data:reset=0:$5E2E mc AtIndex 0:$2DE0 d15:data:reset=0:$18FC mc Lget+252 0:$2DE1 d15:data:reset=0:$482D mc Count 0:$2DE2 d15:data:reset=0:$476D mc TradMemCpy 0:$2DE3 d15:data:reset=0:$18FF mc Lget+255 0:$2DE4 d15:data:reset=0:$5AC5 mc Peek 0:$2DE5 d15:data:reset=0:$482D mc Count 0:$2DE6 d15:data:reset=0:$5BC5 mc PshHP 0:$2DE7 d15:data:reset=0:$5DD0 mc Peekmm 0:$2DE8 d15:data:reset=0:$0607 mc BraIf0+7 0:$2DE9 d15:data:reset=0:$18FE mc Lget+254 0:$2DEA d15:data:reset=0:$5AC5 mc Peek 0:$2DEB d15:data:reset=0:$18FF mc Lget+255 0:$2DEC d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$2DED d15:data:reset=0:$4667 mc Retain 0:$2DEE d15:data:reset=0:$5F33 mc MDrop0-1 0:$2DEF d15:data:reset=0:$01F6 mc Bra-10 0:$2DF0 d15:data:reset=0:$5F33 mc MDrop0-1 0:$2DF1 d15:data:reset=0:$46BA mc CallKill 0:$2DF2 d15:data:reset=0:$6034 mc implicit__str__kill__8ucs2charAEAE_8ucs2charAEAE 0:$2DF3 d15:data:reset=0:$4581 mc DropStr 0:$2DF4 d15:data:reset=0:$5FFA mc MDrop0_Next-2 : AppendGl__8ucs2charAE_8ucs2charAEAEP_ ( ucs2str, str_AE& ) Millicoded // Size: 46 microcodes 0:$2CCB 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$2CCC 0:data:reset=0:$6CCF 0:$2CCD 0:000011:A1=A4:D0=D0 jp millicoded // * Millicoded 0:$2CCE d15:data:reset=0:$5F70 0:$2CCF d15:data:reset=0:$45F6 mc Dup 0:$2CD0 d15:data:reset=0:$5AC5 mc Peek 0:$2CD1 d15:data:reset=0:$4667 mc Retain 0:$2CD2 d15:data:reset=0:$45F6 mc Dup 0:$2CD3 d15:data:reset=0:$482D mc Count 0:$2CD4 d15:data:reset=0:$0B01 mc Addq+1 0:$2CD5 d15:data:reset=0:$6325 mc AllocTrackedVref 0:$2CD6 d15:data:reset=0:$18FF mc Lget+255 0:$2CD7 d15:data:reset=0:$5AC5 mc Peek 0:$2CD8 d15:data:reset=0:$0D00 mc Int8+0 0:$2CD9 d15:data:reset=0:$5E2E mc AtIndex 0:$2CDA d15:data:reset=0:$18FF mc Lget+255 0:$2CDB d15:data:reset=0:$0D00 mc Int8+0 0:$2CDC d15:data:reset=0:$5E2E mc AtIndex 0:$2CDD d15:data:reset=0:$18FE mc Lget+254 0:$2CDE d15:data:reset=0:$482D mc Count 0:$2CDF d15:data:reset=0:$476D mc TradMemCpy 0:$2CE0 d15:data:reset=0:$18FE mc Lget+254 0:$2CE1 d15:data:reset=0:$4667 mc Retain 0:$2CE2 d15:data:reset=0:$18FE mc Lget+254 0:$2CE3 d15:data:reset=0:$5AC5 mc Peek 0:$2CE4 d15:data:reset=0:$4604 mc Last 0:$2CE5 d15:data:reset=0:$5C5A mc Poke 0:$2CE6 d15:data:reset=0:$45F6 mc Dup 0:$2CE7 d15:data:reset=0:$482D mc Count 0:$2CE8 d15:data:reset=0:$5BC5 mc PshHP 0:$2CE9 d15:data:reset=0:$5DD0 mc Peekmm 0:$2CEA d15:data:reset=0:$0607 mc BraIf0+7 0:$2CEB d15:data:reset=0:$18FE mc Lget+254 0:$2CEC d15:data:reset=0:$5AC5 mc Peek 0:$2CED d15:data:reset=0:$18FF mc Lget+255 0:$2CEE d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$2CEF d15:data:reset=0:$4667 mc Retain 0:$2CF0 d15:data:reset=0:$5F33 mc MDrop0-1 0:$2CF1 d15:data:reset=0:$01F6 mc Bra-10 0:$2CF2 d15:data:reset=0:$5F33 mc MDrop0-1 0:$2CF3 d15:data:reset=0:$46BA mc CallKill 0:$2CF4 d15:data:reset=0:$6034 mc implicit__str__kill__8ucs2charAEAE_8ucs2charAEAE 0:$2CF5 d15:data:reset=0:$4581 mc DropStr 0:$2CF6 d15:data:reset=0:$5F33 mc MDrop0-1 0:$2CF7 d15:data:reset=0:$4581 mc DropStr 0:$2CF8 d15:data:reset=0:$5ACD mc Ret : AppendGl__8ucs2char_8ucs2charAEP_ ( ucs2char, ucs2str& ) Millicoded // Size: 13 microcodes 0:$20B2 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$20B3 0:data:reset=0:$60B6 0:$20B4 0:000011:A1=A0:D0=D0 jp millicoded // * Millicoded 0:$20B5 d15:data:reset=0:$5F70 0:$20B6 d15:data:reset=0:$45F6 mc Dup 0:$20B7 d15:data:reset=0:$5AC5 mc Peek 0:$20B8 d15:data:reset=0:$4667 mc Retain 0:$20B9 d15:data:reset=0:$18FE mc Lget+254 0:$20BA d15:data:reset=0:$5F54 mc CatStrChar 0:$20BB d15:data:reset=0:$18FF mc Lget+255 0:$20BC d15:data:reset=0:$7A05 mc SwapWithVar 0:$20BD d15:data:reset=0:$4581 mc DropStr 0:$20BE d15:data:reset=0:$5FFA mc MDrop0_Next-2 : append__8ucs2charAEC_8ucs2char_ ( ucs2str¢, ucs2char ) // this.grow(this.count()+1); // this.last() = c; AppendChar: ( s c -- ) Millicoded 0:$20D9 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$20DA 0:data:reset=0:$60DD 0:$20DB 0:000011:A1=A0:D0=D0 jp millicoded // * Millicoded 0:$20DC d15:data:reset=0:$5F70 0:$20DD d15:data:reset=0:$18FF mc Lget+255 0:$20DE d15:data:reset=0:$18FE mc Lget+254 0:$20DF d15:data:reset=0:$482D mc Count 0:$20E0 d15:data:reset=0:$0B01 mc Addq+1 0:$20E1 d15:data:reset=0:$47AA mc GrowStr // mc Dup // mc Lget+254 // mc Last // mc Poke // mc MDrop0_Next+-2 0:$20E2 d15:data:reset=0:$5B25 mc Swap 0:$20E3 d15:data:reset=0:$4604 mc Last 0:$20E4 d15:data:reset=0:$5C5A mc Poke 0:$20E5 d15:data:reset=0:$5ACD mc Next : catstr__8ucs2charAE_8ucs2char_8ucs2charAE ( ucs2str, ucs2char -- ucs2str ) Millicoded // Size: 29 microcodes 0:$28A7 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$28A8 0:data:reset=0:$68AB 0:$28A9 0:000011:A1=A0:D0=D0 jp millicoded // * Millicoded 0:$28AA d15:data:reset=0:$5F70 0:$28AB d15:data:reset=0:$18FF mc Lget+255 0:$28AC d15:data:reset=0:$482D mc Count 0:$28AD d15:data:reset=0:$0B01 mc Addq+1 0:$28AE d15:data:reset=0:$4203 mc Alloc 0:$28AF d15:data:reset=0:$45F6 mc Dup 0:$28B0 d15:data:reset=0:$0D00 mc Int8+0 0:$28B1 d15:data:reset=0:$5E2E mc AtIndex 0:$28B2 d15:data:reset=0:$18FD mc Lget+253 0:$28B3 d15:data:reset=0:$0D00 mc Int8+0 0:$28B4 d15:data:reset=0:$5E2E mc AtIndex 0:$28B5 d15:data:reset=0:$18FC mc Lget+252 0:$28B6 d15:data:reset=0:$482D mc Count 0:$28B7 d15:data:reset=0:$476D mc TradMemCpy 0:$28B8 d15:data:reset=0:$18FF mc Lget+255 0:$28B9 d15:data:reset=0:$18FF mc Lget+255 0:$28BA d15:data:reset=0:$18FC mc Lget+252 0:$28BB d15:data:reset=0:$482D mc Count 0:$28BC d15:data:reset=0:$5E87 mc AtIndexPoke 0:$28BD d15:data:reset=0:$45F6 mc Dup 0:$28BE d15:data:reset=0:$4667 mc Retain 0:$28BF d15:data:reset=0:$07FD mc Lvar+253 0:$28C0 d15:data:reset=0:$7A05 mc SwapWithVar 0:$28C1 d15:data:reset=0:$4581 mc DropStr 0:$28C2 d15:data:reset=0:$4581 mc DropStr 0:$28C3 d15:data:reset=0:$5FFB mc MDrop0_Next-1 : catstr__8ucs2charAEC_6uint16_6uint16_8ucs2charAEC_6uint16_6uint16_8ucs2charAE ( ucs2str¢, uint16, uint16, ucs2str¢, uint16, uint16 -- ucs2str ) Millicoded // Size: 37 microcodes 0:$2A65 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$2A66 0:data:reset=0:$6A69 0:$2A67 0:000011:A1=A2:D0=D0 jp millicoded // * Millicoded 0:$2A68 d15:data:reset=0:$5F70 0:$2A69 d15:data:reset=0:$18FC mc Lget+252 0:$2A6A d15:data:reset=0:$07FC mc Lvar+252 0:$2A6B d15:data:reset=0:$5E33 mc SubPoke 0:$2A6C d15:data:reset=0:$18FF mc Lget+255 0:$2A6D d15:data:reset=0:$07FF mc Lvar+255 0:$2A6E d15:data:reset=0:$5E33 mc SubPoke 0:$2A6F d15:data:reset=0:$18FD mc Lget+253 0:$2A70 d15:data:reset=0:$18FF mc Lget+255 0:$2A71 d15:data:reset=0:$5AAD mc Add 0:$2A72 d15:data:reset=0:$4203 mc Alloc 0:$2A73 d15:data:reset=0:$45F6 mc Dup 0:$2A74 d15:data:reset=0:$0D00 mc Int8+0 0:$2A75 d15:data:reset=0:$5E2E mc AtIndex 0:$2A76 d15:data:reset=0:$18F9 mc Lget+249 0:$2A77 d15:data:reset=0:$18F9 mc Lget+249 0:$2A78 d15:data:reset=0:$5E2E mc AtIndex 0:$2A79 d15:data:reset=0:$18FA mc Lget+250 0:$2A7A d15:data:reset=0:$476D mc TradMemCpy 0:$2A7B d15:data:reset=0:$45F6 mc Dup 0:$2A7C d15:data:reset=0:$18FB mc Lget+251 0:$2A7D d15:data:reset=0:$5E2E mc AtIndex 0:$2A7E d15:data:reset=0:$18FC mc Lget+252 0:$2A7F d15:data:reset=0:$18FC mc Lget+252 0:$2A80 d15:data:reset=0:$5E2E mc AtIndex 0:$2A81 d15:data:reset=0:$18FD mc Lget+253 0:$2A82 d15:data:reset=0:$476D mc TradMemCpy 0:$2A83 d15:data:reset=0:$45F6 mc Dup 0:$2A84 d15:data:reset=0:$4667 mc Retain 0:$2A85 d15:data:reset=0:$5FA7 mc ToR 0:$2A86 d15:data:reset=0:$4581 mc DropStr 0:$2A87 d15:data:reset=0:$5F2E mc MDrop0-6 0:$2A88 d15:data:reset=0:$5F9C mc FromR 0:$2A89 d15:data:reset=0:$5ACD mc Ret : ShrinkStrArray__8ucs2charAEAEC_6uint16_ ( str_AE¢, uint16 ) Millicoded // Size: 24 microcodes 0:$2680 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$2681 0:data:reset=0:$6684 0:$2682 0:000011:A1=A6:D0=D0 jp millicoded // * Millicoded 0:$2683 d15:data:reset=0:$5F70 0:$2684 d15:data:reset=0:$18FF mc Lget+255 0:$2685 d15:data:reset=0:$482D mc Count 0:$2686 d15:data:reset=0:$18FF mc Lget+255 0:$2687 d15:data:reset=0:$18FF mc Lget+255 0:$2688 d15:data:reset=0:$46CC mc Ult 0:$2689 d15:data:reset=0:$060D mc BraIf0+13 0:$268A d15:data:reset=0:$45F6 mc Dup 0:$268B d15:data:reset=0:$18FE mc Lget+254 0:$268C d15:data:reset=0:$C6C6 mc Ugt 0:$268D d15:data:reset=0:$0606 mc BraIf0+6 0:$268E d15:data:reset=0:$18FE mc Lget+254 0:$268F d15:data:reset=0:$07FF mc Lvar+255 0:$2690 d15:data:reset=0:$5D58 mc mmPeek 0:$2691 d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$2692 d15:data:reset=0:$4581 mc DropStr 0:$2693 d15:data:reset=0:$01F6 mc Bra-10 0:$2694 d15:data:reset=0:$18FE mc Lget+254 0:$2695 d15:data:reset=0:$18FE mc Lget+254 0:$2696 d15:data:reset=0:$5C48 mc implicit__str__shrink__8ucs2charAEC_6uint16_ 0:$2697 d15:data:reset=0:$5FF9 mc MDrop0_Next-3 : Rol_AE__6uint16AEC_6uint16_6uint16_ ( uint16[]¢, uint16, uint16 ) Millicoded // Size: 30 microcodes 0:$28C4 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$28C5 0:data:reset=0:$68C8 0:$28C6 0:000011:A1=A0:D0=D0 jp millicoded // * Millicoded 0:$28C7 d15:data:reset=0:$5F70 0:$28C8 d15:data:reset=0:$18FF mc Lget+255 0:$28C9 d15:data:reset=0:$0B01 mc Addq+1 0:$28CA d15:data:reset=0:$45F6 mc Dup 0:$28CB d15:data:reset=0:$18FE mc Lget+254 0:$28CC d15:data:reset=0:$46CC mc Ult 0:$28CD d15:data:reset=0:$0613 mc BraIf0+19 0:$28CE d15:data:reset=0:$18FD mc Lget+253 0:$28CF d15:data:reset=0:$18FD mc Lget+253 0:$28D0 d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$28D1 d15:data:reset=0:$18FC mc Lget+252 0:$28D2 d15:data:reset=0:$18FC mc Lget+252 0:$28D3 d15:data:reset=0:$5E2E mc AtIndex 0:$28D4 d15:data:reset=0:$18FB mc Lget+251 0:$28D5 d15:data:reset=0:$18FD mc Lget+253 0:$28D6 d15:data:reset=0:$5E2E mc AtIndex 0:$28D7 d15:data:reset=0:$18FC mc Lget+252 0:$28D8 d15:data:reset=0:$18FC mc Lget+252 0:$28D9 d15:data:reset=0:$5BAC mc Sub 0:$28DA d15:data:reset=0:$476D mc TradMemCpy 0:$28DB d15:data:reset=0:$45F6 mc Dup 0:$28DC d15:data:reset=0:$18FB mc Lget+251 0:$28DD d15:data:reset=0:$18FC mc Lget+252 0:$28DE d15:data:reset=0:$0C01 mc Subq+1 0:$28DF d15:data:reset=0:$5E87 mc AtIndexPoke 0:$28E0 d15:data:reset=0:$5F33 mc MDrop0-1 0:$28E1 d15:data:reset=0:$5FF8 mc MDrop0_Next-4 : Ror_AE__6uint16AEC_6uint16_6uint16_ ( uint16[]¢, uint16, uint16 ) Millicoded // Size: 30 microcodes 0:$295A 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$295B 0:data:reset=0:$695E 0:$295C 0:000011:A1=A1:D0=D0 jp millicoded // * Millicoded 0:$295D d15:data:reset=0:$5F70 0:$295E d15:data:reset=0:$45F6 mc Dup 0:$295F d15:data:reset=0:$0C01 mc Subq+1 0:$2960 d15:data:reset=0:$18FE mc Lget+254 0:$2961 d15:data:reset=0:$18FF mc Lget+255 0:$2962 d15:data:reset=0:$46CC mc Ult 0:$2963 d15:data:reset=0:$0613 mc BraIf0+19 0:$2964 d15:data:reset=0:$18FD mc Lget+253 0:$2965 d15:data:reset=0:$18FF mc Lget+255 0:$2966 d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$2967 d15:data:reset=0:$18FC mc Lget+252 0:$2968 d15:data:reset=0:$18FC mc Lget+252 0:$2969 d15:data:reset=0:$0B01 mc Addq+1 0:$296A d15:data:reset=0:$5E2E mc AtIndex 0:$296B d15:data:reset=0:$18FB mc Lget+251 0:$296C d15:data:reset=0:$18FB mc Lget+251 0:$296D d15:data:reset=0:$5E2E mc AtIndex 0:$296E d15:data:reset=0:$18FD mc Lget+253 0:$296F d15:data:reset=0:$18FA mc Lget+250 0:$2970 d15:data:reset=0:$5BAC mc Sub 0:$2971 d15:data:reset=0:$46F6 mc TradRMemCpy 0:$2972 d15:data:reset=0:$45F6 mc Dup 0:$2973 d15:data:reset=0:$18FB mc Lget+251 0:$2974 d15:data:reset=0:$18FB mc Lget+251 0:$2975 d15:data:reset=0:$5E87 mc AtIndexPoke 0:$2976 d15:data:reset=0:$5F33 mc MDrop0-1 0:$2977 d15:data:reset=0:$5FF8 mc MDrop0_Next-4 : cast_range_2_str__8ucs2charAEC_6uint16_6uint16_8ucs2charAE ( ucs2str¢, uint16, uint16 -- ucs2str ) Millicoded // Size: 25 microcodes 0:$2712 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$2713 0:data:reset=0:$6716 0:$2714 0:000011:A1=A7:D0=D0 jp millicoded // * Millicoded 0:$2715 d15:data:reset=0:$5F70 0:$2716 d15:data:reset=0:$45F6 mc Dup 0:$2717 d15:data:reset=0:$18FE mc Lget+254 0:$2718 d15:data:reset=0:$5BAC mc Sub 0:$2719 d15:data:reset=0:$4203 mc Alloc 0:$271A d15:data:reset=0:$45F6 mc Dup 0:$271B d15:data:reset=0:$0D00 mc Int8+0 0:$271C d15:data:reset=0:$5E2E mc AtIndex 0:$271D d15:data:reset=0:$18FC mc Lget+252 0:$271E d15:data:reset=0:$18FC mc Lget+252 0:$271F d15:data:reset=0:$5E2E mc AtIndex 0:$2720 d15:data:reset=0:$18FD mc Lget+253 0:$2721 d15:data:reset=0:$18FB mc Lget+251 0:$2722 d15:data:reset=0:$5BAC mc Sub 0:$2723 d15:data:reset=0:$476D mc TradMemCpy 0:$2724 d15:data:reset=0:$45F6 mc Dup 0:$2725 d15:data:reset=0:$4667 mc Retain 0:$2726 d15:data:reset=0:$5FA7 mc ToR 0:$2727 d15:data:reset=0:$4581 mc DropStr 0:$2728 d15:data:reset=0:$5F31 mc MDrop0-3 0:$2729 d15:data:reset=0:$5F9C mc FromR 0:$272A d15:data:reset=0:$5ACD mc Ret : matches__8ucs2char_8ucs2char_4bool ( ucs2char, ucs2char -- bool ) Millicoded // Size: 13 microcodes 0:$2147 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$2148 0:data:reset=0:$614B 0:$2149 0:000011:A1=A1:D0=D0 jp millicoded // * Millicoded 0:$214A d15:data:reset=0:$5F70 0:$214B d15:data:reset=0:$18FF mc Lget+255 0:$214C d15:data:reset=0:$18FF mc Lget+255 0:$214D d15:data:reset=0:$47DF mc Eq 0:$214E d15:data:reset=0:$47F1 mc Or1 0:$214F d15:data:reset=0:$0203 mc Bra+3 0:$2150 d15:data:reset=0:$45F6 mc Dup 0:$2151 d15:data:reset=0:$0D3F mc Int8+63 0:$2152 d15:data:reset=0:$47DF mc Eq 0:$2153 d15:data:reset=0:$630F mc MNip0_Next-2 : matches__8ucs2charAEC_5int16_8ucs2charAEC_5int16_5int16_4bool ( ucs2str¢, int16, ucs2str¢, int16, int16 -- bool ) Millicoded // Size: 30 microcodes 0:$28E2 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$28E3 0:data:reset=0:$68E6 0:$28E4 0:000011:A1=A0:D0=D0 jp millicoded // * Millicoded 0:$28E5 d15:data:reset=0:$5F70 0:$28E6 d15:data:reset=0:$18FF mc Lget+255 0:$28E7 d15:data:reset=0:$18FF mc Lget+255 0:$28E8 d15:data:reset=0:$C2E0 mc Lt 0:$28E9 d15:data:reset=0:$0612 mc BraIf0+18 0:$28EA d15:data:reset=0:$18FC mc Lget+252 0:$28EB d15:data:reset=0:$07FC mc Lvar+252 0:$28EC d15:data:reset=0:$5DB0 mc Peekpp 0:$28ED d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$28EE d15:data:reset=0:$18FD mc Lget+253 0:$28EF d15:data:reset=0:$07FD mc Lvar+253 0:$28F0 d15:data:reset=0:$5DB0 mc Peekpp 0:$28F1 d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$28F2 d15:data:reset=0:$18FF mc Lget+255 0:$28F3 d15:data:reset=0:$18FF mc Lget+255 0:$28F4 d15:data:reset=0:$47DF mc Eq 0:$28F5 d15:data:reset=0:$47F1 mc Or1 0:$28F6 d15:data:reset=0:$0203 mc Bra+3 0:$28F7 d15:data:reset=0:$45F6 mc Dup 0:$28F8 d15:data:reset=0:$0D3F mc Int8+63 0:$28F9 d15:data:reset=0:$47DF mc Eq 0:$28FA d15:data:reset=0:$5F28 mc MNip0-2 0:$28FB d15:data:reset=0:$03EA mc BraIf1-22 0:$28FC d15:data:reset=0:$18FF mc Lget+255 0:$28FD d15:data:reset=0:$18FF mc Lget+255 0:$28FE d15:data:reset=0:$47DF mc Eq 0:$28FF d15:data:reset=0:$630C mc MNip0_Next-5 : find__8ucs2charAEC_5int16_5int16_8ucs2charAEC_5int16_5int16_5int16 ( ucs2str¢, int16, int16, ucs2str¢, int16, int16 -- int16 ) Millicoded // Size: 28 microcodes 0:$286E 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$286F 0:data:reset=0:$6872 0:$2870 0:000011:A1=A0:D0=D0 jp millicoded // * Millicoded 0:$2871 d15:data:reset=0:$5F70 0:$2872 d15:data:reset=0:$45F6 mc Dup 0:$2873 d15:data:reset=0:$18FE mc Lget+254 0:$2874 d15:data:reset=0:$5BAC mc Sub 0:$2875 d15:data:reset=0:$07FC mc Lvar+252 0:$2876 d15:data:reset=0:$5E33 mc SubPoke 0:$2877 d15:data:reset=0:$18FC mc Lget+252 0:$2878 d15:data:reset=0:$18FC mc Lget+252 0:$2879 d15:data:reset=0:$42E0 mc Le 0:$287A d15:data:reset=0:$060C mc BraIf0+12 0:$287B d15:data:reset=0:$18FB mc Lget+251 0:$287C d15:data:reset=0:$18FB mc Lget+251 0:$287D d15:data:reset=0:$18FC mc Lget+252 0:$287E d15:data:reset=0:$18FC mc Lget+252 0:$287F d15:data:reset=0:$18FC mc Lget+252 0:$2880 d15:data:reset=0:$68E2 mc matches__8ucs2charAEC_5int16_8ucs2charAEC_5int16_5int16_4bool 0:$2881 d15:data:reset=0:$0602 mc BraIf0+2 0:$2882 d15:data:reset=0:$18FC mc Lget+252 0:$2883 d15:data:reset=0:$0205 mc Bra+5 0:$2884 d15:data:reset=0:$07FC mc Lvar+252 0:$2885 d15:data:reset=0:$5E7E mc Incr 0:$2886 d15:data:reset=0:$01F0 mc Bra-16 0:$2887 d15:data:reset=0:$0DFF mc Int8+255 0:$2888 d15:data:reset=0:$0EFF mc Int16+255 0:$2889 d15:data:reset=0:$630B mc MNip0_Next-6 // --- file: "str.asm" --- #include "sort.cc" // +++ file: "sort.asm" +++ // K1-16/16 Microcode // 2015-12-22 16:10:39 : sort__5int16AEC_6uint16_6uint16_4boolB5int165int16D_ ( int16[]¢, uint16, uint16, bool(int16,int16) ) Millicoded // Size: 166 microcodes 0:$3D5A 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$3D5B 0:data:reset=0:$7D5E 0:$3D5C 0:000011:A1=A5:D0=D0 jp millicoded // * Millicoded 0:$3D5D d15:data:reset=0:$5F70 0:$3D5E d15:data:reset=0:$61E4 mc PushContext0 0:$3D5F d15:data:reset=0:$0D10 mc Int8+16 0:$3D60 d15:data:reset=0:$4203 mc Alloc 0:$3D61 d15:data:reset=0:$0D10 mc Int8+16 0:$3D62 d15:data:reset=0:$4203 mc Alloc 0:$3D63 d15:data:reset=0:$0D00 mc Int8+0 0:$3D64 d15:data:reset=0:$07FC mc Lvar+252 0:$3D65 d15:data:reset=0:$5EA2 mc Decr 0:$3D66 d15:data:reset=0:$18FC mc Lget+252 0:$3D67 d15:data:reset=0:$18FA mc Lget+250 0:$3D68 d15:data:reset=0:$5BAC mc Sub 0:$3D69 d15:data:reset=0:$0B01 mc Addq+1 0:$3D6A d15:data:reset=0:$0904 mc Switch+4 0:$3D6B d15:data:reset=0:$0211 mc Bra+17 0:$3D6C d15:data:reset=0:$0210 mc Bra+16 0:$3D6D d15:data:reset=0:$020B mc Bra+11 0:$3D6E d15:data:reset=0:$0201 mc Bra+1 0:$3D6F d15:data:reset=0:$0219 mc Bra+25 0:$3D70 d15:data:reset=0:$18FB mc Lget+251 0:$3D71 d15:data:reset=0:$18FA mc Lget+250 0:$3D72 d15:data:reset=0:$0B02 mc Addq+2 0:$3D73 d15:data:reset=0:$6792 mc sort__5int16AEC_6uint16_6uint16_4boolB5int165int16D___sort__6uint16_6uint16_ 0:$3D74 d15:data:reset=0:$18FB mc Lget+251 0:$3D75 d15:data:reset=0:$0B01 mc Addq+1 0:$3D76 d15:data:reset=0:$18FA mc Lget+250 0:$3D77 d15:data:reset=0:$0B02 mc Addq+2 0:$3D78 d15:data:reset=0:$6792 mc sort__5int16AEC_6uint16_6uint16_4boolB5int165int16D___sort__6uint16_6uint16_ 0:$3D79 d15:data:reset=0:$18FB mc Lget+251 0:$3D7A d15:data:reset=0:$18FA mc Lget+250 0:$3D7B d15:data:reset=0:$0B01 mc Addq+1 0:$3D7C d15:data:reset=0:$6792 mc sort__5int16AEC_6uint16_6uint16_4boolB5int165int16D___sort__6uint16_6uint16_ 0:$3D7D d15:data:reset=0:$45F6 mc Dup 0:$3D7E d15:data:reset=0:$067B mc BraIf0+123 0:$3D7F d15:data:reset=0:$18FE mc Lget+254 0:$3D80 d15:data:reset=0:$07FF mc Lvar+255 0:$3D81 d15:data:reset=0:$5D58 mc mmPeek 0:$3D82 d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$3D83 d15:data:reset=0:$8EFB mc Lset+251 0:$3D84 d15:data:reset=0:$18FF mc Lget+255 0:$3D85 d15:data:reset=0:$18FF mc Lget+255 0:$3D86 d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$3D87 d15:data:reset=0:$8EFC mc Lset+252 0:$3D88 d15:data:reset=0:$01DD mc Bra-35 0:$3D89 d15:data:reset=0:$18FB mc Lget+251 0:$3D8A d15:data:reset=0:$18FB mc Lget+251 0:$3D8B d15:data:reset=0:$18F9 mc Lget+249 0:$3D8C d15:data:reset=0:$18F9 mc Lget+249 0:$3D8D d15:data:reset=0:$6792 mc sort__5int16AEC_6uint16_6uint16_4boolB5int165int16D___sort__6uint16_6uint16_ 0:$3D8E d15:data:reset=0:$07F9 mc Lvar+249 0:$3D8F d15:data:reset=0:$5DB0 mc Peekpp 0:$3D90 d15:data:reset=0:$07F9 mc Lvar+249 0:$3D91 d15:data:reset=0:$5DD0 mc Peekmm 0:$3D92 d15:data:reset=0:$18F7 mc Lget+247 0:$3D93 d15:data:reset=0:$18F7 mc Lget+247 0:$3D94 d15:data:reset=0:$46C6 mc Uge 0:$3D95 d15:data:reset=0:$0437 mc BraIf1+55 0:$3D96 d15:data:reset=0:$18F7 mc Lget+247 0:$3D97 d15:data:reset=0:$18FE mc Lget+254 0:$3D98 d15:data:reset=0:$18F7 mc Lget+247 0:$3D99 d15:data:reset=0:$6002 mc CallMillicode 0:$3D9A d15:data:reset=0:$0612 mc BraIf0+18 0:$3D9B d15:data:reset=0:$45F6 mc Dup 0:$3D9C d15:data:reset=0:$18F6 mc Lget+246 0:$3D9D d15:data:reset=0:$18F7 mc Lget+247 0:$3D9E d15:data:reset=0:$6002 mc CallMillicode 0:$3D9F d15:data:reset=0:$0604 mc BraIf0+4 0:$3DA0 d15:data:reset=0:$07F7 mc Lvar+247 0:$3DA1 d15:data:reset=0:$5DB0 mc Peekpp 0:$3DA2 d15:data:reset=0:$8EFF mc Lset+255 0:$3DA3 d15:data:reset=0:$020B mc Bra+11 0:$3DA4 d15:data:reset=0:$18F6 mc Lget+246 0:$3DA5 d15:data:reset=0:$18F6 mc Lget+246 0:$3DA6 d15:data:reset=0:$5E2E mc AtIndex 0:$3DA7 d15:data:reset=0:$18F5 mc Lget+245 0:$3DA8 d15:data:reset=0:$07F6 mc Lvar+246 0:$3DA9 d15:data:reset=0:$5DD0 mc Peekmm 0:$3DAA d15:data:reset=0:$5E2E mc AtIndex 0:$3DAB d15:data:reset=0:$4388 mc SwapVar 0:$3DAC d15:data:reset=0:$0202 mc Bra+2 0:$3DAD d15:data:reset=0:$07F7 mc Lvar+247 0:$3DAE d15:data:reset=0:$5E7E mc Incr 0:$3DAF d15:data:reset=0:$18F7 mc Lget+247 0:$3DB0 d15:data:reset=0:$18F7 mc Lget+247 0:$3DB1 d15:data:reset=0:$46C6 mc Uge 0:$3DB2 d15:data:reset=0:$041A mc BraIf1+26 0:$3DB3 d15:data:reset=0:$45F6 mc Dup 0:$3DB4 d15:data:reset=0:$18F7 mc Lget+247 0:$3DB5 d15:data:reset=0:$18F7 mc Lget+247 0:$3DB6 d15:data:reset=0:$6002 mc CallMillicode 0:$3DB7 d15:data:reset=0:$0612 mc BraIf0+18 0:$3DB8 d15:data:reset=0:$18F8 mc Lget+248 0:$3DB9 d15:data:reset=0:$18FE mc Lget+254 0:$3DBA d15:data:reset=0:$18F7 mc Lget+247 0:$3DBB d15:data:reset=0:$6002 mc CallMillicode 0:$3DBC d15:data:reset=0:$0604 mc BraIf0+4 0:$3DBD d15:data:reset=0:$07F8 mc Lvar+248 0:$3DBE d15:data:reset=0:$5DD0 mc Peekmm 0:$3DBF d15:data:reset=0:$5F29 mc Nip 0:$3DC0 d15:data:reset=0:$01D1 mc Bra-47 0:$3DC1 d15:data:reset=0:$18F6 mc Lget+246 0:$3DC2 d15:data:reset=0:$07F6 mc Lvar+246 0:$3DC3 d15:data:reset=0:$5DB0 mc Peekpp 0:$3DC4 d15:data:reset=0:$5E2E mc AtIndex 0:$3DC5 d15:data:reset=0:$18F5 mc Lget+245 0:$3DC6 d15:data:reset=0:$18F6 mc Lget+246 0:$3DC7 d15:data:reset=0:$5E2E mc AtIndex 0:$3DC8 d15:data:reset=0:$4388 mc SwapVar 0:$3DC9 d15:data:reset=0:$01C8 mc Bra-56 0:$3DCA d15:data:reset=0:$07F8 mc Lvar+248 0:$3DCB d15:data:reset=0:$5EA2 mc Decr 0:$3DCC d15:data:reset=0:$01C5 mc Bra-59 0:$3DCD d15:data:reset=0:$18F7 mc Lget+247 0:$3DCE d15:data:reset=0:$18FE mc Lget+254 0:$3DCF d15:data:reset=0:$18F7 mc Lget+247 0:$3DD0 d15:data:reset=0:$6002 mc CallMillicode 0:$3DD1 d15:data:reset=0:$0603 mc BraIf0+3 0:$3DD2 d15:data:reset=0:$07F8 mc Lvar+248 0:$3DD3 d15:data:reset=0:$5EA2 mc Decr 0:$3DD4 d15:data:reset=0:$0202 mc Bra+2 0:$3DD5 d15:data:reset=0:$07F7 mc Lvar+247 0:$3DD6 d15:data:reset=0:$5E7E mc Incr 0:$3DD7 d15:data:reset=0:$18F8 mc Lget+248 0:$3DD8 d15:data:reset=0:$18FC mc Lget+252 0:$3DD9 d15:data:reset=0:$5BAC mc Sub 0:$3DDA d15:data:reset=0:$18FD mc Lget+253 0:$3DDB d15:data:reset=0:$18F5 mc Lget+245 0:$3DDC d15:data:reset=0:$5BAC mc Sub 0:$3DDD d15:data:reset=0:$C6C6 mc Ugt 0:$3DDE d15:data:reset=0:$060E mc BraIf0+14 0:$3DDF d15:data:reset=0:$18FD mc Lget+253 0:$3DE0 d15:data:reset=0:$18F9 mc Lget+249 0:$3DE1 d15:data:reset=0:$18FA mc Lget+250 0:$3DE2 d15:data:reset=0:$5E87 mc AtIndexPoke 0:$3DE3 d15:data:reset=0:$18F8 mc Lget+248 0:$3DE4 d15:data:reset=0:$18FA mc Lget+250 0:$3DE5 d15:data:reset=0:$07FA mc Lvar+250 0:$3DE6 d15:data:reset=0:$5DB0 mc Peekpp 0:$3DE7 d15:data:reset=0:$5E87 mc AtIndexPoke 0:$3DE8 d15:data:reset=0:$18F8 mc Lget+248 0:$3DE9 d15:data:reset=0:$8EF7 mc Lset+247 0:$3DEA d15:data:reset=0:$18FE mc Lget+254 0:$3DEB d15:data:reset=0:$8EF8 mc Lset+248 0:$3DEC d15:data:reset=0:$020B mc Bra+11 0:$3DED d15:data:reset=0:$18F7 mc Lget+247 0:$3DEE d15:data:reset=0:$18F9 mc Lget+249 0:$3DEF d15:data:reset=0:$18FA mc Lget+250 0:$3DF0 d15:data:reset=0:$5E87 mc AtIndexPoke 0:$3DF1 d15:data:reset=0:$18FE mc Lget+254 0:$3DF2 d15:data:reset=0:$18FA mc Lget+250 0:$3DF3 d15:data:reset=0:$07FA mc Lvar+250 0:$3DF4 d15:data:reset=0:$5DB0 mc Peekpp 0:$3DF5 d15:data:reset=0:$5E87 mc AtIndexPoke 0:$3DF6 d15:data:reset=0:$18FD mc Lget+253 0:$3DF7 d15:data:reset=0:$8EF7 mc Lset+247 0:$3DF8 d15:data:reset=0:$5F30 mc MDrop0-4 0:$3DF9 d15:data:reset=0:$016C mc Bra-148 0:$3DFA d15:data:reset=0:$5F33 mc MDrop0-1 0:$3DFB d15:data:reset=0:$4581 mc DropStr 0:$3DFC d15:data:reset=0:$4581 mc DropStr 0:$3DFD d15:data:reset=0:$5F30 mc MDrop0-4 0:$3DFE d15:data:reset=0:$5BF4 mc PopContext0 0:$3DFF d15:data:reset=0:$5ACD mc Ret : sort__5int16AEC_6uint16_6uint16_4boolB5int165int16D___sort__6uint16_6uint16_ ( uint16, uint16 ) Millicoded // Size: 26 microcodes 0:$2792 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$2793 0:data:reset=0:$6796 0:$2794 0:000011:A1=A7:D0=D0 jp millicoded // * Millicoded 0:$2795 d15:data:reset=0:$5F70 0:$2796 d15:data:reset=0:$8F7C mc XLvar+124 0:$2797 d15:data:reset=0:$5AC5 mc Peek 0:$2798 d15:data:reset=0:$18FE mc Lget+254 0:$2799 d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$279A d15:data:reset=0:$8F7C mc XLvar+124 0:$279B d15:data:reset=0:$5AC5 mc Peek 0:$279C d15:data:reset=0:$18FE mc Lget+254 0:$279D d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$279E d15:data:reset=0:$8F7F mc XLvar+127 0:$279F d15:data:reset=0:$5AC5 mc Peek 0:$27A0 d15:data:reset=0:$6002 mc CallMillicode 0:$27A1 d15:data:reset=0:$0609 mc BraIf0+9 0:$27A2 d15:data:reset=0:$8F7C mc XLvar+124 0:$27A3 d15:data:reset=0:$5AC5 mc Peek 0:$27A4 d15:data:reset=0:$18FE mc Lget+254 0:$27A5 d15:data:reset=0:$5E2E mc AtIndex 0:$27A6 d15:data:reset=0:$8F7C mc XLvar+124 0:$27A7 d15:data:reset=0:$5AC5 mc Peek 0:$27A8 d15:data:reset=0:$18FE mc Lget+254 0:$27A9 d15:data:reset=0:$5E2E mc AtIndex 0:$27AA d15:data:reset=0:$4388 mc SwapVar 0:$27AB d15:data:reset=0:$5FFA mc MDrop0_Next-2 // --- file: "sort.asm" --- #if include_sio_driver_in_rom #include "sio.cc" #endif #if include_floating_point #include "float.cc" #endif // ______________________________________________________ // "Production" Microcode: #if !include_tests #include "i2c.cc" // +++ file: "i2c.asm" +++ // K1-16/16 Microcode // 2015-12-22 16:10:39 : i2cSendByte__6uint16_6uint16 ( uint16 -- uint16 ) Millicoded // Size: 25 microcodes 0:$272B 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$272C 0:data:reset=0:$672F 0:$272D 0:000011:A1=A7:D0=D0 jp millicoded // * Millicoded 0:$272E d15:data:reset=0:$5F70 0:$272F d15:data:reset=0:$45F6 mc Dup 0:$2730 d15:data:reset=0:$C39B mc Sli15+15-8 0:$2731 d15:data:reset=0:$483C mc i2cSendBit__5int16_5int16 0:$2732 d15:data:reset=0:$483C mc i2cSendBit__5int16_5int16 0:$2733 d15:data:reset=0:$483C mc i2cSendBit__5int16_5int16 0:$2734 d15:data:reset=0:$483C mc i2cSendBit__5int16_5int16 0:$2735 d15:data:reset=0:$483C mc i2cSendBit__5int16_5int16 0:$2736 d15:data:reset=0:$483C mc i2cSendBit__5int16_5int16 0:$2737 d15:data:reset=0:$483C mc i2cSendBit__5int16_5int16 0:$2738 d15:data:reset=0:$483C mc i2cSendBit__5int16_5int16 0:$2739 d15:data:reset=0:$5F29 mc Nip 0:$273A d15:data:reset=0:$0D00 mc Int8+0 0:$273B d15:data:reset=0:$5EF6 mc i2cReadBit__5int16_5int16 0:$273C d15:data:reset=0:$0604 mc BraIf0+4 0:$273D d15:data:reset=0:$5DF0 mc i2cSendEnd 0:$273E d15:data:reset=0:$0D01 mc Int8+1 0:$273F d15:data:reset=0:$5F29 mc Nip 0:$2740 d15:data:reset=0:$0202 mc Bra+2 0:$2741 d15:data:reset=0:$0D00 mc Int8+0 0:$2742 d15:data:reset=0:$5F29 mc Nip 0:$2743 d15:data:reset=0:$5ACD mc Ret : i2cReadByte__4bool_6uint16 ( bool -- uint16 ) Millicoded // Size: 21 microcodes 0:$2588 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$2589 0:data:reset=0:$658C 0:$258A 0:000011:A1=A5:D0=D0 jp millicoded // * Millicoded 0:$258B d15:data:reset=0:$5F70 0:$258C d15:data:reset=0:$0D00 mc Int8+0 0:$258D d15:data:reset=0:$5EF6 mc i2cReadBit__5int16_5int16 0:$258E d15:data:reset=0:$5EF6 mc i2cReadBit__5int16_5int16 0:$258F d15:data:reset=0:$5EF6 mc i2cReadBit__5int16_5int16 0:$2590 d15:data:reset=0:$5EF6 mc i2cReadBit__5int16_5int16 0:$2591 d15:data:reset=0:$5EF6 mc i2cReadBit__5int16_5int16 0:$2592 d15:data:reset=0:$5EF6 mc i2cReadBit__5int16_5int16 0:$2593 d15:data:reset=0:$5EF6 mc i2cReadBit__5int16_5int16 0:$2594 d15:data:reset=0:$5EF6 mc i2cReadBit__5int16_5int16 0:$2595 d15:data:reset=0:$18FF mc Lget+255 0:$2596 d15:data:reset=0:$0603 mc BraIf0+3 0:$2597 d15:data:reset=0:$5F06 mc i2cSendBit1 0:$2598 d15:data:reset=0:$5DF0 mc i2cSendEnd 0:$2599 d15:data:reset=0:$0201 mc Bra+1 0:$259A d15:data:reset=0:$5D90 mc i2cSendBit0 0:$259B d15:data:reset=0:$45F6 mc Dup 0:$259C d15:data:reset=0:$630F mc MNip0_Next-2 : i2cReadByte__6uint16 ( -- uint16 ) // logchar 'i' // ("i2c_RB "); // logchar '2' // logchar 'c' // logchar '_' // logchar 'R' // logchar 'B' // logchar ' ' 0:$1AF1 0:000011:A5=A5:D3=D8 psh alu 0:$1AF2 0:000011:A1=A5:D1=D8 0:$1AF3 0:000001:A1=A5:D8=D8 xor alu 0:$1AF4 0:000011:A1=A5:D0=D0 jp i2cReadByte__4bool_6uint16 0:$1AF5 d15:data:reset=0:$6588 : i2cStartReading__6uint16 ( -- uint16 ) Millicoded // Size: 8 microcodes 0:$1E3B 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$1E3C 0:data:reset=0:$5E3F 0:$1E3D 0:000011:A1=A6:D0=D0 jp millicoded // * Millicoded 0:$1E3E d15:data:reset=0:$5F70 0:$1E3F d15:data:reset=0:$5E5B mc i2cSendStart 0:$1E40 d15:data:reset=0:$0DA1 mc Int8+161 0:$1E41 d15:data:reset=0:$672B mc i2cSendByte__6uint16_6uint16 0:$1E42 d15:data:reset=0:$5ACD mc Ret : i2cStartWritingAtAddress__6uint16_6uint16 ( uint16 -- uint16 ) Millicoded // Size: 30 microcodes 0:$293C 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$293D 0:data:reset=0:$6940 0:$293E 0:000011:A1=A1:D0=D0 jp millicoded // * Millicoded 0:$293F d15:data:reset=0:$5F70 0:$2940 d15:data:reset=0:$5E5B mc i2cSendStart 0:$2941 d15:data:reset=0:$0DA0 mc Int8+160 0:$2942 d15:data:reset=0:$672B mc i2cSendByte__6uint16_6uint16 0:$2943 d15:data:reset=0:$060C mc BraIf0+12 0:$2944 d15:data:reset=0:$6386 mc i2cWaitEndWriting__6uint16 0:$2945 d15:data:reset=0:$0603 mc BraIf0+3 0:$2946 d15:data:reset=0:$0D01 mc Int8+1 0:$2947 d15:data:reset=0:$5F29 mc Nip 0:$2948 d15:data:reset=0:$0210 mc Bra+16 0:$2949 d15:data:reset=0:$5E5B mc i2cSendStart 0:$294A d15:data:reset=0:$0DA0 mc Int8+160 0:$294B d15:data:reset=0:$672B mc i2cSendByte__6uint16_6uint16 0:$294C d15:data:reset=0:$0603 mc BraIf0+3 0:$294D d15:data:reset=0:$0D01 mc Int8+1 0:$294E d15:data:reset=0:$5F29 mc Nip 0:$294F d15:data:reset=0:$0209 mc Bra+9 0:$2950 d15:data:reset=0:$45F6 mc Dup 0:$2951 d15:data:reset=0:$C4AA mc Sru15+15-8 0:$2952 d15:data:reset=0:$672B mc i2cSendByte__6uint16_6uint16 0:$2953 d15:data:reset=0:$47F1 mc Or1 0:$2954 d15:data:reset=0:$0203 mc Bra+3 0:$2955 d15:data:reset=0:$45F6 mc Dup 0:$2956 d15:data:reset=0:$672B mc i2cSendByte__6uint16_6uint16 0:$2957 d15:data:reset=0:$4837 mc Bool 0:$2958 d15:data:reset=0:$5F29 mc Nip 0:$2959 d15:data:reset=0:$5ACD mc Ret : i2cStartReadingAtAddress__6uint16_6uint16 ( uint16 -- uint16 ) Millicoded // Size: 13 microcodes 0:$217B 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$217C 0:data:reset=0:$617F 0:$217D 0:000011:A1=A1:D0=D0 jp millicoded // * Millicoded 0:$217E d15:data:reset=0:$5F70 0:$217F d15:data:reset=0:$45F6 mc Dup 0:$2180 d15:data:reset=0:$693C mc i2cStartWritingAtAddress__6uint16_6uint16 0:$2181 d15:data:reset=0:$0603 mc BraIf0+3 0:$2182 d15:data:reset=0:$0D01 mc Int8+1 0:$2183 d15:data:reset=0:$5F29 mc Nip 0:$2184 d15:data:reset=0:$0202 mc Bra+2 0:$2185 d15:data:reset=0:$5E3B mc i2cStartReading__6uint16 0:$2186 d15:data:reset=0:$5F29 mc Nip 0:$2187 d15:data:reset=0:$5ACD mc Ret : i2cWaitEndWriting__6uint16 ( -- uint16 ) Millicoded // Size: 17 microcodes 0:$2386 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$2387 0:data:reset=0:$638A 0:$2388 0:000011:A1=A3:D0=D0 jp millicoded // * Millicoded 0:$2389 d15:data:reset=0:$5F70 0:$238A d15:data:reset=0:$0D64 mc Int8+100 0:$238B d15:data:reset=0:$5E3B mc i2cStartReading__6uint16 0:$238C d15:data:reset=0:$0606 mc BraIf0+6 0:$238D d15:data:reset=0:$5BC5 mc PshHP 0:$238E d15:data:reset=0:$5D58 mc mmPeek 0:$238F d15:data:reset=0:$0603 mc BraIf0+3 0:$2390 d15:data:reset=0:$0D64 mc Int8+100 0:$2391 d15:data:reset=0:$47C2 mc BusyWait 0:$2392 d15:data:reset=0:$01F8 mc Bra-8 0:$2393 d15:data:reset=0:$5DF0 mc i2cSendEnd 0:$2394 d15:data:reset=0:$45F6 mc Dup 0:$2395 d15:data:reset=0:$4823 mc Not 0:$2396 d15:data:reset=0:$6310 mc MNip0_Next-1 : i2cReadData__6uint16AEC_ ( uint16[]¢ ) Millicoded // Size: 17 microcodes 0:$2375 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$2376 0:data:reset=0:$6379 0:$2377 0:000011:A1=A3:D0=D0 jp millicoded // * Millicoded 0:$2378 d15:data:reset=0:$5F70 0:$2379 d15:data:reset=0:$0D00 mc Int8+0 0:$237A d15:data:reset=0:$45F6 mc Dup 0:$237B d15:data:reset=0:$18FE mc Lget+254 0:$237C d15:data:reset=0:$482D mc Count 0:$237D d15:data:reset=0:$46CC mc Ult 0:$237E d15:data:reset=0:$0606 mc BraIf0+6 0:$237F d15:data:reset=0:$5AF1 mc i2cReadByte__6uint16 0:$2380 d15:data:reset=0:$18FE mc Lget+254 0:$2381 d15:data:reset=0:$07FE mc Lvar+254 0:$2382 d15:data:reset=0:$5DB0 mc Peekpp 0:$2383 d15:data:reset=0:$5E87 mc AtIndexPoke 0:$2384 d15:data:reset=0:$01F5 mc Bra-11 0:$2385 d15:data:reset=0:$5FFA mc MDrop0_Next-2 : i2cReadData__6uint16_6uint16AEC_6uint16_6uint16_3Err ( uint16, uint16[]¢, uint16, uint16 -- Err ) Millicoded // Size: 24 microcodes 0:$26C8 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$26C9 0:data:reset=0:$66CC 0:$26CA 0:000011:A1=A6:D0=D0 jp millicoded // * Millicoded 0:$26CB d15:data:reset=0:$5F70 0:$26CC d15:data:reset=0:$18FD mc Lget+253 0:$26CD d15:data:reset=0:$617B mc i2cStartReadingAtAddress__6uint16_6uint16 0:$26CE d15:data:reset=0:$0602 mc BraIf0+2 0:$26CF d15:data:reset=0:$0D03 mc Int8+3 0:$26D0 d15:data:reset=0:$020E mc Bra+14 0:$26D1 d15:data:reset=0:$18FF mc Lget+255 0:$26D2 d15:data:reset=0:$18FF mc Lget+255 0:$26D3 d15:data:reset=0:$46CC mc Ult 0:$26D4 d15:data:reset=0:$0609 mc BraIf0+9 0:$26D5 d15:data:reset=0:$18FF mc Lget+255 0:$26D6 d15:data:reset=0:$18FF mc Lget+255 0:$26D7 d15:data:reset=0:$47DF mc Eq 0:$26D8 d15:data:reset=0:$6588 mc i2cReadByte__4bool_6uint16 0:$26D9 d15:data:reset=0:$18FD mc Lget+253 0:$26DA d15:data:reset=0:$07FD mc Lvar+253 0:$26DB d15:data:reset=0:$5DB0 mc Peekpp 0:$26DC d15:data:reset=0:$5E87 mc AtIndexPoke 0:$26DD d15:data:reset=0:$01F3 mc Bra-13 0:$26DE d15:data:reset=0:$0D00 mc Int8+0 0:$26DF d15:data:reset=0:$630D mc MNip0_Next-4 : i2cWriteData__6uint16_6uint16AEC_6uint16_6uint16_6uint16_3Err ( uint16, uint16[]¢, uint16, uint16, uint16 -- Err ) Millicoded // Size: 43 microcodes 0:$2B94 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$2B95 0:data:reset=0:$6B98 0:$2B96 0:000011:A1=A3:D0=D0 jp millicoded // * Millicoded 0:$2B97 d15:data:reset=0:$5F70 0:$2B98 d15:data:reset=0:$18FE mc Lget+254 0:$2B99 d15:data:reset=0:$18FE mc Lget+254 0:$2B9A d15:data:reset=0:$46CC mc Ult 0:$2B9B d15:data:reset=0:$0621 mc BraIf0+33 0:$2B9C d15:data:reset=0:$18FC mc Lget+252 0:$2B9D d15:data:reset=0:$693C mc i2cStartWritingAtAddress__6uint16_6uint16 0:$2B9E d15:data:reset=0:$0602 mc BraIf0+2 0:$2B9F d15:data:reset=0:$0D03 mc Int8+3 0:$2BA0 d15:data:reset=0:$021D mc Bra+29 0:$2BA1 d15:data:reset=0:$18FF mc Lget+255 0:$2BA2 d15:data:reset=0:$18FD mc Lget+253 0:$2BA3 d15:data:reset=0:$5BAC mc Sub 0:$2BA4 d15:data:reset=0:$18FF mc Lget+255 0:$2BA5 d15:data:reset=0:$18FA mc Lget+250 0:$2BA6 d15:data:reset=0:$18FD mc Lget+253 0:$2BA7 d15:data:reset=0:$0C01 mc Subq+1 0:$2BA8 d15:data:reset=0:$5A0F mc And 0:$2BA9 d15:data:reset=0:$5BAC mc Sub 0:$2BAA d15:data:reset=0:$480F mc Umin 0:$2BAB d15:data:reset=0:$45F6 mc Dup 0:$2BAC d15:data:reset=0:$07FA mc Lvar+250 0:$2BAD d15:data:reset=0:$5DA8 mc AddPoke 0:$2BAE d15:data:reset=0:$5BC5 mc PshHP 0:$2BAF d15:data:reset=0:$5DD0 mc Peekmm 0:$2BB0 d15:data:reset=0:$0609 mc BraIf0+9 0:$2BB1 d15:data:reset=0:$18FC mc Lget+252 0:$2BB2 d15:data:reset=0:$07FC mc Lvar+252 0:$2BB3 d15:data:reset=0:$5DB0 mc Peekpp 0:$2BB4 d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$2BB5 d15:data:reset=0:$672B mc i2cSendByte__6uint16_6uint16 0:$2BB6 d15:data:reset=0:$05F7 mc BraIf0-9 0:$2BB7 d15:data:reset=0:$0D02 mc Int8+2 0:$2BB8 d15:data:reset=0:$5F29 mc MNip0-1 0:$2BB9 d15:data:reset=0:$0204 mc Bra+4 0:$2BBA d15:data:reset=0:$5DF0 mc i2cSendEnd 0:$2BBB d15:data:reset=0:$5F33 mc MDrop0-1 0:$2BBC d15:data:reset=0:$01DB mc Bra-37 0:$2BBD d15:data:reset=0:$0D00 mc Int8+0 0:$2BBE d15:data:reset=0:$630C mc MNip0_Next-5 : i2cVerifyData__6uint16_6uint16AEC_6uint16_6uint16_3Err ( uint16, uint16[]¢, uint16, uint16 -- Err ) Millicoded // Size: 28 microcodes 0:$27FE 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$27FF 0:data:reset=0:$6802 0:$2800 0:000011:A1=A0:D0=D0 jp millicoded // * Millicoded 0:$2801 d15:data:reset=0:$5F70 0:$2802 d15:data:reset=0:$18FD mc Lget+253 0:$2803 d15:data:reset=0:$617B mc i2cStartReadingAtAddress__6uint16_6uint16 0:$2804 d15:data:reset=0:$0602 mc BraIf0+2 0:$2805 d15:data:reset=0:$0D03 mc Int8+3 0:$2806 d15:data:reset=0:$0212 mc Bra+18 0:$2807 d15:data:reset=0:$18FF mc Lget+255 0:$2808 d15:data:reset=0:$18FF mc Lget+255 0:$2809 d15:data:reset=0:$46CC mc Ult 0:$280A d15:data:reset=0:$060D mc BraIf0+13 0:$280B d15:data:reset=0:$18FE mc Lget+254 0:$280C d15:data:reset=0:$07FE mc Lvar+254 0:$280D d15:data:reset=0:$5DB0 mc Peekpp 0:$280E d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$280F d15:data:reset=0:$18FE mc Lget+254 0:$2810 d15:data:reset=0:$18FE mc Lget+254 0:$2811 d15:data:reset=0:$47DF mc Eq 0:$2812 d15:data:reset=0:$6588 mc i2cReadByte__4bool_6uint16 0:$2813 d15:data:reset=0:$47D5 mc Ne 0:$2814 d15:data:reset=0:$05F2 mc BraIf0-14 0:$2815 d15:data:reset=0:$5DF0 mc i2cSendEnd 0:$2816 d15:data:reset=0:$0D02 mc Int8+2 0:$2817 d15:data:reset=0:$0201 mc Bra+1 0:$2818 d15:data:reset=0:$0D00 mc Int8+0 0:$2819 d15:data:reset=0:$630D mc MNip0_Next-4 : i2cGetctl__11I2cDrvrDataC_6uint16_6uint16 ( I2cDrvrData¢, uint16 -- uint16 ) Millicoded // Size: 21 microcodes 0:$255E 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$255F 0:data:reset=0:$6562 0:$2560 0:000011:A1=A5:D0=D0 jp millicoded // * Millicoded 0:$2561 d15:data:reset=0:$5F70 0:$2562 d15:data:reset=0:$45F6 mc Dup 0:$2563 d15:data:reset=0:$0D07 mc Int8+7 0:$2564 d15:data:reset=0:$47DF mc Eq 0:$2565 d15:data:reset=0:$0604 mc BraIf0+4 0:$2566 d15:data:reset=0:$18FF mc Lget+255 0:$2567 d15:data:reset=0:$1D01 mc ItemGet+1 0:$2568 d15:data:reset=0:$5B0C mc Msbit 0:$2569 d15:data:reset=0:$0208 mc Bra+8 0:$256A d15:data:reset=0:$45F6 mc Dup 0:$256B d15:data:reset=0:$0D08 mc Int8+8 0:$256C d15:data:reset=0:$47DF mc Eq 0:$256D d15:data:reset=0:$0603 mc BraIf0+3 0:$256E d15:data:reset=0:$18FF mc Lget+255 0:$256F d15:data:reset=0:$1D02 mc ItemGet+2 0:$2570 d15:data:reset=0:$0201 mc Bra+1 0:$2571 d15:data:reset=0:$0D00 mc Int8+0 0:$2572 d15:data:reset=0:$630F mc MNip0_Next-2 : i2cSetctl__11I2cDrvrDataC_6uint16_6uint16_ ( I2cDrvrData¢, uint16, uint16 ) Millicoded // Size: 5 microcodes 0:$1BCF 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$1BD0 0:data:reset=0:$5BD3 0:$1BD1 0:000011:A1=A3:D0=D0 jp millicoded // * Millicoded 0:$1BD2 d15:data:reset=0:$5F70 0:$1BD3 d15:data:reset=0:$5FF9 mc MDrop0_Next-3 : i2cWriteBlocks__11I2cDrvrDataC_6uint32_6uint16AEC_6uint16_6uint16_3Err ( I2cDrvrData¢, uint32, uint16[]¢, uint16, uint16 -- Err ) Millicoded // Size: 17 microcodes 0:$23A8 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$23A9 0:data:reset=0:$63AC 0:$23AA 0:000011:A1=A3:D0=D0 jp millicoded // * Millicoded 0:$23AB d15:data:reset=0:$5F70 0:$23AC d15:data:reset=0:$18FB mc Lget+251 0:$23AD d15:data:reset=0:$1D00 mc ItemGet+0 0:$23AE d15:data:reset=0:$5BCA mc Select 0:$23AF d15:data:reset=0:$18FD mc Lget+253 0:$23B0 d15:data:reset=0:$18FD mc Lget+253 0:$23B1 d15:data:reset=0:$18FD mc Lget+253 0:$23B2 d15:data:reset=0:$18FD mc Lget+253 0:$23B3 d15:data:reset=0:$18F7 mc Lget+247 0:$23B4 d15:data:reset=0:$1D01 mc ItemGet+1 0:$23B5 d15:data:reset=0:$6B94 mc i2cWriteData__6uint16_6uint16AEC_6uint16_6uint16_6uint16_3Err 0:$23B6 d15:data:reset=0:$5B20 mc Deselect 0:$23B7 d15:data:reset=0:$45F6 mc Dup 0:$23B8 d15:data:reset=0:$630A mc MNip0_Next-7 : i2cReadBlocks__11I2cDrvrDataC_6uint32_6uint16AEC_6uint16_6uint16_3Err ( I2cDrvrData¢, uint32, uint16[]¢, uint16, uint16 -- Err ) Millicoded // Size: 15 microcodes 0:$2256 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$2257 0:data:reset=0:$625A 0:$2258 0:000011:A1=A2:D0=D0 jp millicoded // * Millicoded 0:$2259 d15:data:reset=0:$5F70 0:$225A d15:data:reset=0:$18FB mc Lget+251 0:$225B d15:data:reset=0:$1D00 mc ItemGet+0 0:$225C d15:data:reset=0:$5BCA mc Select 0:$225D d15:data:reset=0:$18FD mc Lget+253 0:$225E d15:data:reset=0:$18FD mc Lget+253 0:$225F d15:data:reset=0:$18FD mc Lget+253 0:$2260 d15:data:reset=0:$18FD mc Lget+253 0:$2261 d15:data:reset=0:$66C8 mc i2cReadData__6uint16_6uint16AEC_6uint16_6uint16_3Err 0:$2262 d15:data:reset=0:$5B20 mc Deselect 0:$2263 d15:data:reset=0:$45F6 mc Dup 0:$2264 d15:data:reset=0:$630A mc MNip0_Next-7 : i2cVerifyBlocks__11I2cDrvrDataC_6uint32_6uint16AEC_6uint16_6uint16_3Err ( I2cDrvrData¢, uint32, uint16[]¢, uint16, uint16 -- Err ) Millicoded // Size: 15 microcodes 0:$22A1 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$22A2 0:data:reset=0:$62A5 0:$22A3 0:000011:A1=A2:D0=D0 jp millicoded // * Millicoded 0:$22A4 d15:data:reset=0:$5F70 0:$22A5 d15:data:reset=0:$18FB mc Lget+251 0:$22A6 d15:data:reset=0:$1D00 mc ItemGet+0 0:$22A7 d15:data:reset=0:$5BCA mc Select 0:$22A8 d15:data:reset=0:$18FD mc Lget+253 0:$22A9 d15:data:reset=0:$18FD mc Lget+253 0:$22AA d15:data:reset=0:$18FD mc Lget+253 0:$22AB d15:data:reset=0:$18FD mc Lget+253 0:$22AC d15:data:reset=0:$67FE mc i2cVerifyData__6uint16_6uint16AEC_6uint16_6uint16_3Err 0:$22AD d15:data:reset=0:$5B20 mc Deselect 0:$22AE d15:data:reset=0:$45F6 mc Dup 0:$22AF d15:data:reset=0:$630A mc MNip0_Next-7 : new__8ucs2charAEC_6uint16_14I2cBlockDevice ( ucs2str¢, uint16 -- I2cBlockDevice ) Millicoded // Size: 46 microcodes 0:$2C9D 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$2C9E 0:data:reset=0:$6CA1 0:$2C9F 0:000011:A1=A4:D0=D0 jp millicoded // * Millicoded 0:$2CA0 d15:data:reset=0:$5F70 0:$2CA1 d15:data:reset=0:$45F6 mc Dup 0:$2CA2 d15:data:reset=0:$5BCA mc Select 0:$2CA3 d15:data:reset=0:$7D1A mc i2c_log2eepromsize__6uint16 0:$2CA4 d15:data:reset=0:$45F6 mc Dup 0:$2CA5 d15:data:reset=0:$C4B1 mc Sru15+15-1 0:$2CA6 d15:data:reset=0:$0C01 mc Subq+1 0:$2CA7 d15:data:reset=0:$5B20 mc Deselect 0:$2CA8 d15:data:reset=0:$18FD mc Lget+253 0:$2CA9 d15:data:reset=0:$0D0B mc Int8+11 0:$2CAA d15:data:reset=0:$0E80 mc Int16+128 0:$2CAB d15:data:reset=0:$0D03 mc Int8+3 0:$2CAC d15:data:reset=0:$4203 mc Alloc 0:$2CAD d15:data:reset=0:$5FA7 mc ToR 0:$2CAE d15:data:reset=0:$0D01 mc Int8+1 0:$2CAF d15:data:reset=0:$18FD mc Lget+253 0:$2CB0 d15:data:reset=0:$438B mc Sl 0:$2CB1 d15:data:reset=0:$5BD4 mc PeekR 0:$2CB2 d15:data:reset=0:$2301 mc ItemSet+1 0:$2CB3 d15:data:reset=0:$0D01 mc Int8+1 0:$2CB4 d15:data:reset=0:$18FC mc Lget+252 0:$2CB5 d15:data:reset=0:$18FC mc Lget+252 0:$2CB6 d15:data:reset=0:$5BAC mc Sub 0:$2CB7 d15:data:reset=0:$438B mc Sl 0:$2CB8 d15:data:reset=0:$5BD4 mc PeekR 0:$2CB9 d15:data:reset=0:$2302 mc ItemSet+2 0:$2CBA d15:data:reset=0:$18FC mc Lget+252 0:$2CBB d15:data:reset=0:$5BD4 mc PeekR 0:$2CBC d15:data:reset=0:$2300 mc ItemSet+0 0:$2CBD d15:data:reset=0:$5F9C mc FromR 0:$2CBE d15:data:reset=0:$5A61 mc DupToR 0:$2CBF d15:data:reset=0:$0D5E mc Int8+i2cGetctl__11I2cDrvrDataC_6uint16_6uint16&$FF 0:$2CC0 d15:data:reset=0:$0E65 mc Int16+(i2cGetctl__11I2cDrvrDataC_6uint16_6uint16>>8)&$FF 0:$2CC1 d15:data:reset=0:$0DCF mc Int8+i2cSetctl__11I2cDrvrDataC_6uint16_6uint16_&$FF 0:$2CC2 d15:data:reset=0:$0E5B mc Int16+(i2cSetctl__11I2cDrvrDataC_6uint16_6uint16_>>8)&$FF 0:$2CC3 d15:data:reset=0:$0D56 mc Int8+i2cReadBlocks__11I2cDrvrDataC_6uint32_6uint16AEC_6uint16_6uint16_3Err&$FF 0:$2CC4 d15:data:reset=0:$0E62 mc Int16+(i2cReadBlocks__11I2cDrvrDataC_6uint32_6uint16AEC_6uint16_6uint16_3Err>>8)&$FF 0:$2CC5 d15:data:reset=0:$0DA8 mc Int8+i2cWriteBlocks__11I2cDrvrDataC_6uint32_6uint16AEC_6uint16_6uint16_3Err&$FF 0:$2CC6 d15:data:reset=0:$0E63 mc Int16+(i2cWriteBlocks__11I2cDrvrDataC_6uint32_6uint16AEC_6uint16_6uint16_3Err>>8)&$FF 0:$2CC7 d15:data:reset=0:$6EA2 mc new__8ucs2charAEC_6uint16_8DrvrDataC_6uint16B8DrvrDataC6uint16D_4voidB8DrvrDataC6uint166uint16D_3ErrB8DrvrDataC6uint326uint16AEC6uint166uint16D_3ErrB8DrvrDataC6uint326uint16AEC6uint166uint16D_11BlockDevice 0:$2CC8 d15:data:reset=0:$5F9C mc FromR 0:$2CC9 d15:data:reset=0:$4581 mc DropStr 0:$2CCA d15:data:reset=0:$630D mc MNip0_Next-4 : i2cD0C0 () 0:$19D6 0:000001:A1=A0:D3=D2 ld dnop,io_i2c, i2c_data=0, i2c_clk=0 // Data:0 Clock:0 0:$19D7 0:000011:A1=A0:D0=D0 jp i2cDelay 0:$19D8 d15:data:reset=0:$5B4D : i2cD1C0 () 0:$19F7 0:001001:A1=A0:D3=D2 ld dnop,io_i2c, i2c_data=1, i2c_clk=0 // Data:1 Clock:0 0:$19F8 0:000011:A1=A0:D0=D0 jp i2cDelay 0:$19F9 d15:data:reset=0:$5B4D : i2cD0C1 () 0:$19E5 0:000101:A1=A0:D3=D2 ld dnop,io_i2c, i2c_data=0, i2c_clk=1 // Data:0 Clock:1 0:$19E6 0:000011:A1=A0:D0=D0 jp i2cDelay 0:$19E7 d15:data:reset=0:$5B4D : i2cD1C1 () 0:$1D07 0:001101:A1=A0:D3=D2 ld dnop,io_i2c, i2c_data=1, i2c_clk=1 // Data:1 Clock:1 0:$1D08 0:000011:A1=A0:D0=D0 jp i2cDelay 0:$1D09 d15:data:reset=0:$5B4D : i2cD1C0AddBit__5int16_5int16 ( int16 -- int16 ) 0:$0809 0:001001:A1=A0:D7=D2 ld dtmp,io_i2c, i2c_data=1, i2c_clk=0 // Data:1 Clock:0 and read & append bit to alu 0:$080A 0:000011:A1=A0:D3=D7 tst dtmp 0:$080B d0:data:reset=0:$0000 if bit0 1:$080C 0:000100:A1=A7:D8=D8 add_c alu // nodelay else 0:$080C 0:000000:A1=A0:D8=D8 add alu // nodelay then 0:$080D 0:000011:A1=A0:D0=D0 jp i2cDelay 0:$080E d15:data:reset=0:$5B4D : i2cDelay () // io // 1 // jp // 2 0:$1B4D 0:data:clk/4=0:$0000 clr clock4 // 1..4 0:$1B4E 0:000011:A1=A0:D3=D8 nop // 4 0:$1B4F 0:data:clk/4=1:$0000 set clock4 // 4 next_m // 3 0:$1B50 0:000011:A0=A0:D0=D3 next_mc // * next_m 0:$1B51 d15:000011:A1=A0:D0=D0 : i2cSendStart () Millicoded // Size: 8 microcodes 0:$1E5B 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$1E5C 0:data:reset=0:$5E5F 0:$1E5D 0:000011:A1=A6:D0=D0 jp millicoded // * Millicoded 0:$1E5E d15:data:reset=0:$5F70 0:$1E5F d15:data:reset=0:$5D07 mc i2cD1C1 0:$1E60 d15:data:reset=0:$59E5 mc i2cD0C1 0:$1E61 d15:data:reset=0:$59D6 mc i2cD0C0 0:$1E62 d15:data:reset=0:$5ACD mc Ret : i2cSendEnd () Millicoded // Size: 8 microcodes 0:$1DF0 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$1DF1 0:data:reset=0:$5DF4 0:$1DF2 0:000011:A1=A5:D0=D0 jp millicoded // * Millicoded 0:$1DF3 d15:data:reset=0:$5F70 0:$1DF4 d15:data:reset=0:$59D6 mc i2cD0C0 0:$1DF5 d15:data:reset=0:$59E5 mc i2cD0C1 0:$1DF6 d15:data:reset=0:$5D07 mc i2cD1C1 0:$1DF7 d15:data:reset=0:$5ACD mc Ret : i2cSendBit1 () Millicoded // Size: 8 microcodes 0:$1F06 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$1F07 0:data:reset=0:$5F0A 0:$1F08 0:000011:A1=A7:D0=D0 jp millicoded // * Millicoded 0:$1F09 d15:data:reset=0:$5F70 0:$1F0A d15:data:reset=0:$59F7 mc i2cD1C0 0:$1F0B d15:data:reset=0:$5D07 mc i2cD1C1 0:$1F0C d15:data:reset=0:$59F7 mc i2cD1C0 0:$1F0D d15:data:reset=0:$5ACD mc Ret : i2cSendBit0 () Millicoded // Size: 8 microcodes 0:$1D90 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$1D91 0:data:reset=0:$5D94 0:$1D92 0:000011:A1=A5:D0=D0 jp millicoded // * Millicoded 0:$1D93 d15:data:reset=0:$5F70 0:$1D94 d15:data:reset=0:$59D6 mc i2cD0C0 0:$1D95 d15:data:reset=0:$59E5 mc i2cD0C1 0:$1D96 d15:data:reset=0:$59D6 mc i2cD0C0 0:$1D97 d15:data:reset=0:$5ACD mc Ret : i2cSendBit__5int16_5int16 ( int16 -- int16 ) 0:$083C 0:000000:A1=A0:D8=D8 add alu // nodelay 0:$083D d15:000011:A1=A0:D0=D0 ld cmd,ival :bit15 if 1 1:$083E d15:data:reset=0:$5F06 dw i2cSendBit1 :bit15 else 0:$083E d15:data:reset=0:$5D90 dw i2cSendBit0 :bit15 then : i2cReadBit__5int16_5int16 ( int16 -- int16 ) Millicoded // Size: 10 microcodes 0:$1EF6 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$1EF7 0:data:reset=0:$5EFA 0:$1EF8 0:000011:A1=A6:D0=D0 jp millicoded // * Millicoded 0:$1EF9 d15:data:reset=0:$5F70 0:$1EFA d15:data:reset=0:$59F7 mc i2cD1C0 0:$1EFB d15:data:reset=0:$5D07 mc i2cD1C1 0:$1EFC d15:data:reset=0:$45F6 mc Dup 0:$1EFD d15:data:reset=0:$4809 mc i2cD1C0AddBit__5int16_5int16 0:$1EFE d15:data:reset=0:$5F29 mc Nip 0:$1EFF d15:data:reset=0:$5ACD mc Ret : i2c_log2eepromsize__6uint16 ( -- uint16 ) Millicoded // Size: 64 microcodes 0:$3D1A 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$3D1B 0:data:reset=0:$7D1E 0:$3D1C 0:000011:A1=A5:D0=D0 jp millicoded // * Millicoded 0:$3D1D d15:data:reset=0:$5F70 0:$3D1E d15:data:reset=0:$0D10 mc Int8+16 0:$3D1F d15:data:reset=0:$4203 mc Alloc 0:$3D20 d15:data:reset=0:$0D00 mc Int8+0 0:$3D21 d15:data:reset=0:$18FF mc Lget+255 0:$3D22 d15:data:reset=0:$5ECF mc RangeAll 0:$3D23 d15:data:reset=0:$66C8 mc i2cReadData__6uint16_6uint16AEC_6uint16_6uint16_3Err 0:$3D24 d15:data:reset=0:$0602 mc BraIf0+2 0:$3D25 d15:data:reset=0:$0D03 mc Int8+3 0:$3D26 d15:data:reset=0:$022F mc Bra+47 0:$3D27 d15:data:reset=0:$0D10 mc Int8+16 0:$3D28 d15:data:reset=0:$5BC5 mc PshHP 0:$3D29 d15:data:reset=0:$5DD0 mc Peekmm 0:$3D2A d15:data:reset=0:$47E5 mc And0 0:$3D2B d15:data:reset=0:$0205 mc Bra+5 0:$3D2C d15:data:reset=0:$18FF mc Lget+255 0:$3D2D d15:data:reset=0:$18FF mc Lget+255 0:$3D2E d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$3D2F d15:data:reset=0:$0DFF mc Int8+255 0:$3D30 d15:data:reset=0:$47DF mc Eq 0:$3D31 d15:data:reset=0:$03F6 mc BraIf1-10 0:$3D32 d15:data:reset=0:$45F6 mc Dup 0:$3D33 d15:data:reset=0:$0D00 mc Int8+0 0:$3D34 d15:data:reset=0:$C2E0 mc Lt 0:$3D35 d15:data:reset=0:$060E mc BraIf0+14 0:$3D36 d15:data:reset=0:$0DFE mc Int8+254 0:$3D37 d15:data:reset=0:$18FE mc Lget+254 0:$3D38 d15:data:reset=0:$0D00 mc Int8+0 0:$3D39 d15:data:reset=0:$5E87 mc AtIndexPoke 0:$3D3A d15:data:reset=0:$0D00 mc Int8+0 0:$3D3B d15:data:reset=0:$18FE mc Lget+254 0:$3D3C d15:data:reset=0:$0D00 mc Int8+0 0:$3D3D d15:data:reset=0:$0D01 mc Int8+1 0:$3D3E d15:data:reset=0:$0D10 mc Int8+16 0:$3D3F d15:data:reset=0:$6B94 mc i2cWriteData__6uint16_6uint16AEC_6uint16_6uint16_6uint16_3Err 0:$3D40 d15:data:reset=0:$0603 mc BraIf0+3 0:$3D41 d15:data:reset=0:$0D03 mc Int8+3 0:$3D42 d15:data:reset=0:$5F29 mc MNip0-1 0:$3D43 d15:data:reset=0:$0212 mc Bra+18 0:$3D44 d15:data:reset=0:$0D0E mc Int8+14 0:$3D45 d15:data:reset=0:$0D01 mc Int8+1 0:$3D46 d15:data:reset=0:$18FF mc Lget+255 0:$3D47 d15:data:reset=0:$438B mc Sl 0:$3D48 d15:data:reset=0:$18FD mc Lget+253 0:$3D49 d15:data:reset=0:$5ECF mc RangeAll 0:$3D4A d15:data:reset=0:$67FE mc i2cVerifyData__6uint16_6uint16AEC_6uint16_6uint16_3Err 0:$3D4B d15:data:reset=0:$0D00 mc Int8+0 0:$3D4C d15:data:reset=0:$47DF mc Eq 0:$3D4D d15:data:reset=0:$0605 mc BraIf0+5 0:$3D4E d15:data:reset=0:$5BC5 mc PshHP 0:$3D4F d15:data:reset=0:$5D58 mc mmPeek 0:$3D50 d15:data:reset=0:$0D02 mc Int8+2 0:$3D51 d15:data:reset=0:$C6C6 mc Ugt 0:$3D52 d15:data:reset=0:$03F2 mc BraIf1-14 0:$3D53 d15:data:reset=0:$45F6 mc Dup 0:$3D54 d15:data:reset=0:$0B01 mc Addq+1 0:$3D55 d15:data:reset=0:$5F28 mc MNip0-2 0:$3D56 d15:data:reset=0:$5FA7 mc ToR 0:$3D57 d15:data:reset=0:$4581 mc DropStr 0:$3D58 d15:data:reset=0:$5F9C mc FromR 0:$3D59 d15:data:reset=0:$5ACD mc Ret // --- file: "i2c.asm" --- #include "dev.cc" // +++ file: "dev.asm" +++ // K1-16/16 Microcode // 2015-12-22 16:10:39 : implicit__dev__kill__16BytecodeCompiler_16BytecodeCompiler ( BytecodeCompiler -- BytecodeCompiler ) Millicoded // Size: 35 microcodes 0:$29D9 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$29DA 0:data:reset=0:$69DD 0:$29DB 0:000011:A1=A1:D0=D0 jp millicoded // * Millicoded 0:$29DC d15:data:reset=0:$5F70 0:$29DD d15:data:reset=0:$45F6 mc Dup 0:$29DE d15:data:reset=0:$1D00 mc ItemGet+0 0:$29DF d15:data:reset=0:$4581 mc DropStr 0:$29E0 d15:data:reset=0:$45F6 mc Dup 0:$29E1 d15:data:reset=0:$1D01 mc ItemGet+1 0:$29E2 d15:data:reset=0:$4581 mc DropStr 0:$29E3 d15:data:reset=0:$45F6 mc Dup 0:$29E4 d15:data:reset=0:$1D02 mc ItemGet+2 0:$29E5 d15:data:reset=0:$4581 mc DropStr 0:$29E6 d15:data:reset=0:$45F6 mc Dup 0:$29E7 d15:data:reset=0:$1D03 mc ItemGet+3 0:$29E8 d15:data:reset=0:$46BA mc CallKill 0:$29E9 d15:data:reset=0:$5FDC mc implicit__dev__kill__8ucs2charAEAE_8ucs2charAEAE 0:$29EA d15:data:reset=0:$4581 mc DropStr 0:$29EB d15:data:reset=0:$45F6 mc Dup 0:$29EC d15:data:reset=0:$1D04 mc ItemGet+4 0:$29ED d15:data:reset=0:$4581 mc DropStr 0:$29EE d15:data:reset=0:$45F6 mc Dup 0:$29EF d15:data:reset=0:$1D07 mc ItemGet+7 0:$29F0 d15:data:reset=0:$4581 mc DropStr 0:$29F1 d15:data:reset=0:$45F6 mc Dup 0:$29F2 d15:data:reset=0:$1D08 mc ItemGet+8 0:$29F3 d15:data:reset=0:$46BA mc CallKill 0:$29F4 d15:data:reset=0:$6058 mc implicit__dev__kill__6uint16AEAE_6uint16AEAE 0:$29F5 d15:data:reset=0:$4581 mc DropStr 0:$29F6 d15:data:reset=0:$45F6 mc Dup 0:$29F7 d15:data:reset=0:$1D0B mc ItemGet+11 0:$29F8 d15:data:reset=0:$46BA mc CallKill 0:$29F9 d15:data:reset=0:$6239 mc implicit__dev__kill__11bcc_procdefAE_11bcc_procdefAE 0:$29FA d15:data:reset=0:$4581 mc DropStr 0:$29FB d15:data:reset=0:$5ACD mc Ret : implicit__dev__kill__8ucs2charAEAE_8ucs2charAEAE ( ucs2str[] -- ucs2str[] ) Millicoded // Size: 12 microcodes 0:$1FDC 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$1FDD 0:data:reset=0:$5FE0 0:$1FDE 0:000011:A1=A7:D0=D0 jp millicoded // * Millicoded 0:$1FDF d15:data:reset=0:$5F70 0:$1FE0 d15:data:reset=0:$45F6 mc Dup 0:$1FE1 d15:data:reset=0:$473D mc ForAllItems 0:$1FE2 d15:data:reset=0:$0202 mc Bra+2 0:$1FE3 d15:data:reset=0:$5AC5 mc Peek 0:$1FE4 d15:data:reset=0:$4581 mc DropStr 0:$1FE5 d15:data:reset=0:$43ED mc mmNextItem 0:$1FE6 d15:data:reset=0:$01FC mc Bra-4 0:$1FE7 d15:data:reset=0:$5ACD mc Ret : implicit__dev__kill__6uint16AEAE_6uint16AEAE ( uint16[][] -- uint16[][] ) Millicoded // Size: 12 microcodes 0:$2058 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$2059 0:data:reset=0:$605C 0:$205A 0:000011:A1=A0:D0=D0 jp millicoded // * Millicoded 0:$205B d15:data:reset=0:$5F70 0:$205C d15:data:reset=0:$45F6 mc Dup 0:$205D d15:data:reset=0:$473D mc ForAllItems 0:$205E d15:data:reset=0:$0202 mc Bra+2 0:$205F d15:data:reset=0:$5AC5 mc Peek 0:$2060 d15:data:reset=0:$4581 mc DropStr 0:$2061 d15:data:reset=0:$43ED mc mmNextItem 0:$2062 d15:data:reset=0:$01FC mc Bra-4 0:$2063 d15:data:reset=0:$5ACD mc Ret : implicit__dev__kill__11bcc_procdef_11bcc_procdef ( bcc_procdef -- bcc_procdef ) Millicoded // Size: 8 microcodes 0:$1E4B 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$1E4C 0:data:reset=0:$5E4F 0:$1E4D 0:000011:A1=A6:D0=D0 jp millicoded // * Millicoded 0:$1E4E d15:data:reset=0:$5F70 0:$1E4F d15:data:reset=0:$45F6 mc Dup 0:$1E50 d15:data:reset=0:$1D01 mc ItemGet+1 0:$1E51 d15:data:reset=0:$4581 mc DropStr 0:$1E52 d15:data:reset=0:$5ACD mc Ret : implicit__dev__kill__11bcc_procdefAE_11bcc_procdefAE ( bcc_procdef[] -- bcc_procdef[] ) Millicoded // Size: 14 microcodes 0:$2239 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$223A 0:data:reset=0:$623D 0:$223B 0:000011:A1=A2:D0=D0 jp millicoded // * Millicoded 0:$223C d15:data:reset=0:$5F70 0:$223D d15:data:reset=0:$45F6 mc Dup 0:$223E d15:data:reset=0:$473D mc ForAllItems 0:$223F d15:data:reset=0:$0204 mc Bra+4 0:$2240 d15:data:reset=0:$5AC5 mc Peek 0:$2241 d15:data:reset=0:$46BA mc CallKill 0:$2242 d15:data:reset=0:$5E4B mc implicit__dev__kill__11bcc_procdef_11bcc_procdef 0:$2243 d15:data:reset=0:$4581 mc DropStr 0:$2244 d15:data:reset=0:$43ED mc mmNextItem 0:$2245 d15:data:reset=0:$01FA mc Bra-6 0:$2246 d15:data:reset=0:$5ACD mc Ret : implicit__dev__kill__4Node_4Node ( Node -- Node ) Millicoded // Size: 11 microcodes 0:$1F5F 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$1F60 0:data:reset=0:$5F63 0:$1F61 0:000011:A1=A7:D0=D0 jp millicoded // * Millicoded 0:$1F62 d15:data:reset=0:$5F70 0:$1F63 d15:data:reset=0:$45F6 mc Dup 0:$1F64 d15:data:reset=0:$1D04 mc ItemGet+4 0:$1F65 d15:data:reset=0:$46BA mc CallKill 0:$1F66 d15:data:reset=0:$622B mc implicit__dev__kill__2FDAE_2FDAE 0:$1F67 d15:data:reset=0:$4581 mc DropStr 0:$1F68 d15:data:reset=0:$5D88 mc implicit__dev__kill__2FD_2FD 0:$1F69 d15:data:reset=0:$5ACD mc Ret : implicit__dev__kill__2FD_2FD ( FD -- FD ) Millicoded // Size: 8 microcodes 0:$1D88 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$1D89 0:data:reset=0:$5D8C 0:$1D8A 0:000011:A1=A5:D0=D0 jp millicoded // * Millicoded 0:$1D8B d15:data:reset=0:$5F70 0:$1D8C d15:data:reset=0:$45F6 mc Dup 0:$1D8D d15:data:reset=0:$1D01 mc ItemGet+1 0:$1D8E d15:data:reset=0:$4581 mc DropStr 0:$1D8F d15:data:reset=0:$5ACD mc Ret : implicit__dev__kill__2FDAE_2FDAE ( FDs -- FDs ) Millicoded // Size: 14 microcodes 0:$222B 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$222C 0:data:reset=0:$622F 0:$222D 0:000011:A1=A2:D0=D0 jp millicoded // * Millicoded 0:$222E d15:data:reset=0:$5F70 0:$222F d15:data:reset=0:$45F6 mc Dup 0:$2230 d15:data:reset=0:$473D mc ForAllItems 0:$2231 d15:data:reset=0:$0204 mc Bra+4 0:$2232 d15:data:reset=0:$5AC5 mc Peek 0:$2233 d15:data:reset=0:$46BA mc CallKill 0:$2234 d15:data:reset=0:$5D88 mc implicit__dev__kill__2FD_2FD 0:$2235 d15:data:reset=0:$4581 mc DropStr 0:$2236 d15:data:reset=0:$43ED mc mmNextItem 0:$2237 d15:data:reset=0:$01FA mc Bra-6 0:$2238 d15:data:reset=0:$5ACD mc Ret : init_devices () Millicoded // Size: 144 microcodes 0:$3F70 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$3F71 0:data:reset=0:$7F74 0:$3F72 0:000011:A1=A7:D0=D0 jp millicoded // * Millicoded 0:$3F73 d15:data:reset=0:$5F70 0:$3F74 d15:data:reset=0:$0F0E mc Istr+14 0:$3F75 0:data:reset=0:$005B dm '[' 0:$3F76 0:data:reset=0:$0069 dm 'i' 0:$3F77 0:data:reset=0:$006E dm 'n' 0:$3F78 0:data:reset=0:$0069 dm 'i' 0:$3F79 0:data:reset=0:$0074 dm 't' 0:$3F7A 0:data:reset=0:$005F dm '_' 0:$3F7B 0:data:reset=0:$0064 dm 'd' 0:$3F7C 0:data:reset=0:$0065 dm 'e' 0:$3F7D 0:data:reset=0:$0076 dm 'v' 0:$3F7E 0:data:reset=0:$0069 dm 'i' 0:$3F7F 0:data:reset=0:$0063 dm 'c' 0:$3F80 0:data:reset=0:$0065 dm 'e' 0:$3F81 0:data:reset=0:$0073 dm 's' 0:$3F82 0:data:reset=0:$005D dm ']' 0:$3F83 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$3F84 d15:data:reset=0:$46D2 mc LogStr 0:$3F85 d15:data:reset=0:$0D05 mc Int8+5 0:$3F86 d15:data:reset=0:$4203 mc Alloc 0:$3F87 d15:data:reset=0:$5FA7 mc ToR 0:$3F88 d15:data:reset=0:$0D00 mc Int8+0 0:$3F89 d15:data:reset=0:$5BD4 mc PeekR 0:$3F8A d15:data:reset=0:$2300 mc ItemSet+0 0:$3F8B d15:data:reset=0:$0F00 mc Istr+0 0:$3F8C 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$3F8D d15:data:reset=0:$5BD4 mc PeekR 0:$3F8E d15:data:reset=0:$2301 mc ItemSet+1 0:$3F8F d15:data:reset=0:$0D00 mc Int8+0 0:$3F90 d15:data:reset=0:$4203 mc Alloc 0:$3F91 d15:data:reset=0:$5BD4 mc PeekR 0:$3F92 d15:data:reset=0:$2304 mc ItemSet+4 0:$3F93 d15:data:reset=0:$5F9C mc FromR 0:$3F94 d15:data:reset=0:$1623 mc Gset+root 0:$3F95 d15:data:reset=0:$0D05 mc Int8+5 0:$3F96 d15:data:reset=0:$4203 mc Alloc 0:$3F97 d15:data:reset=0:$5FA7 mc ToR 0:$3F98 d15:data:reset=0:$0D00 mc Int8+0 0:$3F99 d15:data:reset=0:$5BD4 mc PeekR 0:$3F9A d15:data:reset=0:$2300 mc ItemSet+0 0:$3F9B d15:data:reset=0:$0F03 mc Istr+3 0:$3F9C 0:data:reset=0:$0064 dm 'd' 0:$3F9D 0:data:reset=0:$0065 dm 'e' 0:$3F9E 0:data:reset=0:$0076 dm 'v' 0:$3F9F 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$3FA0 d15:data:reset=0:$5BD4 mc PeekR 0:$3FA1 d15:data:reset=0:$2301 mc ItemSet+1 0:$3FA2 d15:data:reset=0:$0D00 mc Int8+0 0:$3FA3 d15:data:reset=0:$4203 mc Alloc 0:$3FA4 d15:data:reset=0:$5BD4 mc PeekR 0:$3FA5 d15:data:reset=0:$2304 mc ItemSet+4 0:$3FA6 d15:data:reset=0:$5F9C mc FromR 0:$3FA7 d15:data:reset=0:$9F23 mc Gget+root 0:$3FA8 d15:data:reset=0:$18FF mc Lget+255 0:$3FA9 d15:data:reset=0:$4667 mc Retain 0:$3FAA d15:data:reset=0:$6355 mc Node__append__4NodeC_2FD_ 0:$3FAB d15:data:reset=0:$0D01 mc Int8+1 0:$3FAC d15:data:reset=0:$18FF mc Lget+255 0:$3FAD d15:data:reset=0:$18FF mc Lget+255 0:$3FAE d15:data:reset=0:$59E2 mc Cpl 0:$3FAF d15:data:reset=0:$7012 mc init_device__4NodeC_6uint16_6uint16 0:$3FB0 d15:data:reset=0:$45F6 mc Dup 0:$3FB1 d15:data:reset=0:$47E5 mc And0 0:$3FB2 d15:data:reset=0:$0203 mc Bra+3 0:$3FB3 d15:data:reset=0:$45F6 mc Dup 0:$3FB4 d15:data:reset=0:$0D03 mc Int8+3 0:$3FB5 d15:data:reset=0:$47D5 mc Ne 0:$3FB6 d15:data:reset=0:$0612 mc BraIf0+18 0:$3FB7 d15:data:reset=0:$0F08 mc Istr+8 0:$3FB8 0:data:reset=0:$0020 dm ' ' 0:$3FB9 0:data:reset=0:$0065 dm 'e' 0:$3FBA 0:data:reset=0:$0072 dm 'r' 0:$3FBB 0:data:reset=0:$0072 dm 'r' 0:$3FBC 0:data:reset=0:$006F dm 'o' 0:$3FBD 0:data:reset=0:$0072 dm 'r' 0:$3FBE 0:data:reset=0:$003A dm ':' 0:$3FBF 0:data:reset=0:$0020 dm ' ' 0:$3FC0 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$3FC1 d15:data:reset=0:$18FF mc Lget+255 0:$3FC2 d15:data:reset=0:$6900 mc numstr__6uint16_8ucs2charAE 0:$3FC3 d15:data:reset=0:$6AAF mc CatStrStr 0:$3FC4 d15:data:reset=0:$0F01 mc Istr+1 0:$3FC5 0:data:reset=0:$0020 dm ' ' 0:$3FC6 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$3FC7 d15:data:reset=0:$6AAF mc CatStrStr 0:$3FC8 d15:data:reset=0:$46D2 mc LogStr 0:$3FC9 d15:data:reset=0:$0D01 mc Int8+1 0:$3FCA d15:data:reset=0:$07FE mc Lvar+254 0:$3FCB d15:data:reset=0:$691E mc SlPoke 0:$3FCC d15:data:reset=0:$18FF mc Lget+255 0:$3FCD d15:data:reset=0:$0402 mc BraIf1+2 0:$3FCE d15:data:reset=0:$5F33 mc MDrop0-1 0:$3FCF d15:data:reset=0:$0202 mc Bra+2 0:$3FD0 d15:data:reset=0:$5F33 mc MDrop0-1 0:$3FD1 d15:data:reset=0:$01DA mc Bra-38 0:$3FD2 d15:data:reset=0:$5B2F mc SetIntMask 0:$3FD3 d15:data:reset=0:$5B20 mc Deselect 0:$3FD4 d15:data:reset=0:$18FF mc Lget+255 0:$3FD5 d15:data:reset=0:$78EF mc find_stdio__4NodeC_ 0:$3FD6 d15:data:reset=0:$0F21 mc Istr+33 0:$3FD7 0:data:reset=0:$000A dm 10 0:$3FD8 0:data:reset=0:$0053 dm 'S' 0:$3FD9 0:data:reset=0:$0054 dm 'T' 0:$3FDA 0:data:reset=0:$004F dm 'O' 0:$3FDB 0:data:reset=0:$0050 dm 'P' 0:$3FDC 0:data:reset=0:$0050 dm 'P' 0:$3FDD 0:data:reset=0:$0045 dm 'E' 0:$3FDE 0:data:reset=0:$0044 dm 'D' 0:$3FDF 0:data:reset=0:$0020 dm ' ' 0:$3FE0 0:data:reset=0:$0061 dm 'a' 0:$3FE1 0:data:reset=0:$0074 dm 't' 0:$3FE2 0:data:reset=0:$0020 dm ' ' 0:$3FE3 0:data:reset=0:$0065 dm 'e' 0:$3FE4 0:data:reset=0:$006E dm 'n' 0:$3FE5 0:data:reset=0:$0064 dm 'd' 0:$3FE6 0:data:reset=0:$0020 dm ' ' 0:$3FE7 0:data:reset=0:$006F dm 'o' 0:$3FE8 0:data:reset=0:$0066 dm 'f' 0:$3FE9 0:data:reset=0:$0020 dm ' ' 0:$3FEA 0:data:reset=0:$0069 dm 'i' 0:$3FEB 0:data:reset=0:$006E dm 'n' 0:$3FEC 0:data:reset=0:$0069 dm 'i' 0:$3FED 0:data:reset=0:$0074 dm 't' 0:$3FEE 0:data:reset=0:$005F dm '_' 0:$3FEF 0:data:reset=0:$0064 dm 'd' 0:$3FF0 0:data:reset=0:$0065 dm 'e' 0:$3FF1 0:data:reset=0:$0076 dm 'v' 0:$3FF2 0:data:reset=0:$0069 dm 'i' 0:$3FF3 0:data:reset=0:$0063 dm 'c' 0:$3FF4 0:data:reset=0:$0065 dm 'e' 0:$3FF5 0:data:reset=0:$0073 dm 's' 0:$3FF6 0:data:reset=0:$0028 dm '(' 0:$3FF7 0:data:reset=0:$0029 dm ')' 0:$3FF8 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$3FF9 d15:data:reset=0:$46D2 mc LogStr 0:$3FFA d15:data:reset=0:$697C mc Todo 0:$3FFB d15:data:reset=0:$5F33 mc MDrop0-1 0:$3FFC d15:data:reset=0:$46BA mc CallKill 0:$3FFD d15:data:reset=0:$5F5F mc implicit__dev__kill__4Node_4Node 0:$3FFE d15:data:reset=0:$4581 mc DropStr 0:$3FFF d15:data:reset=0:$5ACD mc Ret : read_uint12__6uint16 ( -- uint16 ) Millicoded // Size: 18 microcodes 0:$240B 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$240C 0:data:reset=0:$640F 0:$240D 0:000011:A1=A4:D0=D0 jp millicoded // * Millicoded 0:$240E d15:data:reset=0:$5F70 0:$240F d15:data:reset=0:$5AF1 mc i2cReadByte__6uint16 0:$2410 d15:data:reset=0:$45F6 mc Dup 0:$2411 d15:data:reset=0:$0DF0 mc Int8+240 0:$2412 d15:data:reset=0:$46CC mc Ult 0:$2413 d15:data:reset=0:$0602 mc BraIf0+2 0:$2414 d15:data:reset=0:$45F6 mc Dup 0:$2415 d15:data:reset=0:$0206 mc Bra+6 0:$2416 d15:data:reset=0:$45F6 mc Dup 0:$2417 d15:data:reset=0:$0D0F mc Int8+15 0:$2418 d15:data:reset=0:$5A0F mc And 0:$2419 d15:data:reset=0:$C39B mc Sli15+15-8 0:$241A d15:data:reset=0:$5AF1 mc i2cReadByte__6uint16 0:$241B d15:data:reset=0:$5AAD mc Add 0:$241C d15:data:reset=0:$6310 mc MNip0_Next-1 : read_block__6uint16AE ( -- uint16[] ) Millicoded // Size: 16 microcodes 0:$2345 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$2346 0:data:reset=0:$6349 0:$2347 0:000011:A1=A3:D0=D0 jp millicoded // * Millicoded 0:$2348 d15:data:reset=0:$5F70 0:$2349 d15:data:reset=0:$640B mc read_uint12__6uint16 0:$234A d15:data:reset=0:$45F6 mc Dup 0:$234B d15:data:reset=0:$4203 mc Alloc 0:$234C d15:data:reset=0:$45F6 mc Dup 0:$234D d15:data:reset=0:$6375 mc i2cReadData__6uint16AEC_ 0:$234E d15:data:reset=0:$45F6 mc Dup 0:$234F d15:data:reset=0:$4667 mc Retain 0:$2350 d15:data:reset=0:$5FA7 mc ToR 0:$2351 d15:data:reset=0:$4581 mc DropStr 0:$2352 d15:data:reset=0:$5F33 mc MDrop0-1 0:$2353 d15:data:reset=0:$5F9C mc FromR 0:$2354 d15:data:reset=0:$5ACD mc Ret : read_chunk__6uint16_6uint16AE ( uint16 -- uint16[] ) Millicoded // Size: 39 microcodes 0:$2B45 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$2B46 0:data:reset=0:$6B49 0:$2B47 0:000011:A1=A3:D0=D0 jp millicoded // * Millicoded 0:$2B48 d15:data:reset=0:$5F70 0:$2B49 d15:data:reset=0:$5AF1 mc i2cReadByte__6uint16 0:$2B4A d15:data:reset=0:$6345 mc read_block__6uint16AE 0:$2B4B d15:data:reset=0:$18FF mc Lget+255 0:$2B4C d15:data:reset=0:$18FD mc Lget+253 0:$2B4D d15:data:reset=0:$47DF mc Eq 0:$2B4E d15:data:reset=0:$0607 mc BraIf0+7 0:$2B4F d15:data:reset=0:$45F6 mc Dup 0:$2B50 d15:data:reset=0:$4667 mc Retain 0:$2B51 d15:data:reset=0:$5FA7 mc ToR 0:$2B52 d15:data:reset=0:$4581 mc DropStr 0:$2B53 d15:data:reset=0:$5F33 mc MDrop0-1 0:$2B54 d15:data:reset=0:$5F9C mc FromR 0:$2B55 d15:data:reset=0:$0215 mc Bra+21 0:$2B56 d15:data:reset=0:$18FF mc Lget+255 0:$2B57 d15:data:reset=0:$0D35 mc Int8+53 0:$2B58 d15:data:reset=0:$46C6 mc Uge 0:$2B59 d15:data:reset=0:$47E5 mc And0 0:$2B5A d15:data:reset=0:$0203 mc Bra+3 0:$2B5B d15:data:reset=0:$18FF mc Lget+255 0:$2B5C d15:data:reset=0:$0D39 mc Int8+57 0:$2B5D d15:data:reset=0:$C6CC mc Ule 0:$2B5E d15:data:reset=0:$47F1 mc Or1 0:$2B5F d15:data:reset=0:$0203 mc Bra+3 0:$2B60 d15:data:reset=0:$18FF mc Lget+255 0:$2B61 d15:data:reset=0:$0D45 mc Int8+69 0:$2B62 d15:data:reset=0:$47DF mc Eq 0:$2B63 d15:data:reset=0:$0403 mc BraIf1+3 0:$2B64 d15:data:reset=0:$4581 mc DropStr 0:$2B65 d15:data:reset=0:$5F33 mc MDrop0-1 0:$2B66 d15:data:reset=0:$0203 mc Bra+3 0:$2B67 d15:data:reset=0:$4581 mc DropStr 0:$2B68 d15:data:reset=0:$5F33 mc MDrop0-1 0:$2B69 d15:data:reset=0:$01DF mc Bra-33 0:$2B6A d15:data:reset=0:$0D00 mc Int8+0 0:$2B6B d15:data:reset=0:$6310 mc MNip0_Next-1 : init_device__4NodeC_6uint16_6uint16 ( Node¢, uint16 -- uint16 ) Millicoded // Size: 721 microcodes 0:$3012 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$3013 0:data:reset=0:$7016 0:$3014 0:000011:A1=A0:D0=D0 jp millicoded // * Millicoded 0:$3015 d15:data:reset=0:$5F70 0:$3016 d15:data:reset=0:$61E4 mc PushContext0 0:$3017 d15:data:reset=0:$45F6 mc Dup 0:$3018 d15:data:reset=0:$5BCA mc Select 0:$3019 d15:data:reset=0:$0D00 mc Int8+0 0:$301A d15:data:reset=0:$617B mc i2cStartReadingAtAddress__6uint16_6uint16 0:$301B d15:data:reset=0:$0603 mc BraIf0+3 0:$301C d15:data:reset=0:$0D03 mc Int8+3 0:$301D d15:data:reset=0:$8202 mc Hi8+2 0:$301E d15:data:reset=0:$A1C1 mc BraFar+193 0:$301F d15:data:reset=0:$0F0D mc Istr+13 0:$3020 0:data:reset=0:$005B dm '[' 0:$3021 0:data:reset=0:$0069 dm 'i' 0:$3022 0:data:reset=0:$006E dm 'n' 0:$3023 0:data:reset=0:$0069 dm 'i' 0:$3024 0:data:reset=0:$0074 dm 't' 0:$3025 0:data:reset=0:$005F dm '_' 0:$3026 0:data:reset=0:$0064 dm 'd' 0:$3027 0:data:reset=0:$0065 dm 'e' 0:$3028 0:data:reset=0:$0076 dm 'v' 0:$3029 0:data:reset=0:$0069 dm 'i' 0:$302A 0:data:reset=0:$0063 dm 'c' 0:$302B 0:data:reset=0:$0065 dm 'e' 0:$302C 0:data:reset=0:$003A dm ':' 0:$302D 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$302E d15:data:reset=0:$18FF mc Lget+255 0:$302F d15:data:reset=0:$5AA1 mc Msbit0 0:$3030 d15:data:reset=0:$6453 mc NumStr 0:$3031 d15:data:reset=0:$6AAF mc CatStrStr 0:$3032 d15:data:reset=0:$0F01 mc Istr+1 0:$3033 0:data:reset=0:$005D dm ']' 0:$3034 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$3035 d15:data:reset=0:$6AAF mc CatStrStr 0:$3036 d15:data:reset=0:$46D2 mc LogStr 0:$3037 d15:data:reset=0:$0D30 mc Int8+48 0:$3038 d15:data:reset=0:$6B45 mc read_chunk__6uint16_6uint16AE 0:$3039 d15:data:reset=0:$45F6 mc Dup 0:$303A d15:data:reset=0:$4823 mc Not 0:$303B d15:data:reset=0:$47F1 mc Or1 0:$303C d15:data:reset=0:$0204 mc Bra+4 0:$303D d15:data:reset=0:$45F6 mc Dup 0:$303E d15:data:reset=0:$482D mc Count 0:$303F d15:data:reset=0:$0D08 mc Int8+8 0:$3040 d15:data:reset=0:$47D5 mc Ne 0:$3041 d15:data:reset=0:$47F1 mc Or1 0:$3042 d15:data:reset=0:$020E mc Bra+14 0:$3043 d15:data:reset=0:$45F6 mc Dup 0:$3044 d15:data:reset=0:$0D00 mc Int8+0 0:$3045 d15:data:reset=0:$0D04 mc Int8+4 0:$3046 d15:data:reset=0:$7D04 mc SubStr 0:$3047 d15:data:reset=0:$0F04 mc Istr+4 0:$3048 0:data:reset=0:$004B dm 'K' 0:$3049 0:data:reset=0:$0031 dm '1' 0:$304A 0:data:reset=0:$0044 dm 'D' 0:$304B 0:data:reset=0:$0031 dm '1' 0:$304C 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$304D d15:data:reset=0:$5A61 mc DupToR 0:$304E d15:data:reset=0:$608B mc Ne_RangeCstr 0:$304F d15:data:reset=0:$5F9C mc FromR 0:$3050 d15:data:reset=0:$4581 mc DropStr 0:$3051 d15:data:reset=0:$0606 mc BraIf0+6 0:$3052 d15:data:reset=0:$0D65 mc Int8+101 0:$3053 d15:data:reset=0:$5FA7 mc ToR 0:$3054 d15:data:reset=0:$4581 mc DropStr 0:$3055 d15:data:reset=0:$5F9C mc FromR 0:$3056 d15:data:reset=0:$8202 mc Hi8+2 0:$3057 d15:data:reset=0:$A188 mc BraFar+136 0:$3058 d15:data:reset=0:$0D31 mc Int8+49 0:$3059 d15:data:reset=0:$6B45 mc read_chunk__6uint16_6uint16AE 0:$305A d15:data:reset=0:$45F6 mc Dup 0:$305B d15:data:reset=0:$4823 mc Not 0:$305C d15:data:reset=0:$47F1 mc Or1 0:$305D d15:data:reset=0:$0204 mc Bra+4 0:$305E d15:data:reset=0:$45F6 mc Dup 0:$305F d15:data:reset=0:$482D mc Count 0:$3060 d15:data:reset=0:$0D06 mc Int8+6 0:$3061 d15:data:reset=0:$46CC mc Ult 0:$3062 d15:data:reset=0:$0607 mc BraIf0+7 0:$3063 d15:data:reset=0:$0D66 mc Int8+102 0:$3064 d15:data:reset=0:$5FA7 mc ToR 0:$3065 d15:data:reset=0:$4581 mc DropStr 0:$3066 d15:data:reset=0:$4581 mc DropStr 0:$3067 d15:data:reset=0:$5F9C mc FromR 0:$3068 d15:data:reset=0:$8202 mc Hi8+2 0:$3069 d15:data:reset=0:$A176 mc BraFar+118 0:$306A d15:data:reset=0:$0D32 mc Int8+50 0:$306B d15:data:reset=0:$6B45 mc read_chunk__6uint16_6uint16AE 0:$306C d15:data:reset=0:$45F6 mc Dup 0:$306D d15:data:reset=0:$0408 mc BraIf1+8 0:$306E d15:data:reset=0:$0D67 mc Int8+103 0:$306F d15:data:reset=0:$5FA7 mc ToR 0:$3070 d15:data:reset=0:$4581 mc DropStr 0:$3071 d15:data:reset=0:$4581 mc DropStr 0:$3072 d15:data:reset=0:$4581 mc DropStr 0:$3073 d15:data:reset=0:$5F9C mc FromR 0:$3074 d15:data:reset=0:$8202 mc Hi8+2 0:$3075 d15:data:reset=0:$A16A mc BraFar+106 0:$3076 d15:data:reset=0:$0D33 mc Int8+51 0:$3077 d15:data:reset=0:$6B45 mc read_chunk__6uint16_6uint16AE 0:$3078 d15:data:reset=0:$45F6 mc Dup 0:$3079 d15:data:reset=0:$0409 mc BraIf1+9 0:$307A d15:data:reset=0:$0D68 mc Int8+104 0:$307B d15:data:reset=0:$5FA7 mc ToR 0:$307C d15:data:reset=0:$4581 mc DropStr 0:$307D d15:data:reset=0:$4581 mc DropStr 0:$307E d15:data:reset=0:$4581 mc DropStr 0:$307F d15:data:reset=0:$4581 mc DropStr 0:$3080 d15:data:reset=0:$5F9C mc FromR 0:$3081 d15:data:reset=0:$8202 mc Hi8+2 0:$3082 d15:data:reset=0:$A15D mc BraFar+93 0:$3083 d15:data:reset=0:$0D34 mc Int8+52 0:$3084 d15:data:reset=0:$6B45 mc read_chunk__6uint16_6uint16AE 0:$3085 d15:data:reset=0:$45F6 mc Dup 0:$3086 d15:data:reset=0:$040A mc BraIf1+10 0:$3087 d15:data:reset=0:$0D69 mc Int8+105 0:$3088 d15:data:reset=0:$5FA7 mc ToR 0:$3089 d15:data:reset=0:$4581 mc DropStr 0:$308A d15:data:reset=0:$4581 mc DropStr 0:$308B d15:data:reset=0:$4581 mc DropStr 0:$308C d15:data:reset=0:$4581 mc DropStr 0:$308D d15:data:reset=0:$4581 mc DropStr 0:$308E d15:data:reset=0:$5F9C mc FromR 0:$308F d15:data:reset=0:$8202 mc Hi8+2 0:$3090 d15:data:reset=0:$A14F mc BraFar+79 0:$3091 d15:data:reset=0:$18FD mc Lget+253 0:$3092 d15:data:reset=0:$0D00 mc Int8+0 0:$3093 d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$3094 d15:data:reset=0:$18FC mc Lget+252 0:$3095 d15:data:reset=0:$0D01 mc Int8+1 0:$3096 d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$3097 d15:data:reset=0:$C39B mc Sli15+15-8 0:$3098 d15:data:reset=0:$5AAD mc Add 0:$3099 d15:data:reset=0:$18FC mc Lget+252 0:$309A d15:data:reset=0:$0D02 mc Int8+2 0:$309B d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$309C d15:data:reset=0:$18FB mc Lget+251 0:$309D d15:data:reset=0:$0D03 mc Int8+3 0:$309E d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$309F d15:data:reset=0:$18FA mc Lget+250 0:$30A0 d15:data:reset=0:$0D04 mc Int8+4 0:$30A1 d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$30A2 d15:data:reset=0:$18F9 mc Lget+249 0:$30A3 d15:data:reset=0:$0D05 mc Int8+5 0:$30A4 d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$30A5 d15:data:reset=0:$0DFF mc Int8+255 0:$30A6 d15:data:reset=0:$0E07 mc Int16+7 0:$30A7 d15:data:reset=0:$07FB mc Lvar+251 0:$30A8 d15:data:reset=0:$5CDD mc AndPoke 0:$30A9 d15:data:reset=0:$18FE mc Lget+254 0:$30AA d15:data:reset=0:$0B01 mc Addq+1 0:$30AB d15:data:reset=0:$45F6 mc Dup 0:$30AC d15:data:reset=0:$5B0C mc Msbit 0:$30AD d15:data:reset=0:$0C03 mc Subq+3 0:$30AE d15:data:reset=0:$5F29 mc Nip 0:$30AF d15:data:reset=0:$0D03 mc Int8+3 0:$30B0 d15:data:reset=0:$18FF mc Lget+255 0:$30B1 d15:data:reset=0:$480F mc Umin 0:$30B2 d15:data:reset=0:$5F29 mc Nip 0:$30B3 d15:data:reset=0:$0D00 mc Int8+0 0:$30B4 d15:data:reset=0:$18FF mc Lget+255 0:$30B5 d15:data:reset=0:$45FA mc Umax 0:$30B6 d15:data:reset=0:$5F29 mc Nip 0:$30B7 d15:data:reset=0:$18FC mc Lget+252 0:$30B8 d15:data:reset=0:$0D02 mc Int8+2 0:$30B9 d15:data:reset=0:$5A0F mc And 0:$30BA d15:data:reset=0:$4837 mc Bool 0:$30BB d15:data:reset=0:$0D0A mc Int8+10 0:$30BC d15:data:reset=0:$5A3D mc LogChar 0:$30BD d15:data:reset=0:$18F7 mc Lget+247 0:$30BE d15:data:reset=0:$4672 mc LogCstr 0:$30BF d15:data:reset=0:$0D3A mc Int8+58 0:$30C0 d15:data:reset=0:$5A3D mc LogChar 0:$30C1 d15:data:reset=0:$0D09 mc Int8+9 0:$30C2 d15:data:reset=0:$5A3D mc LogChar 0:$30C3 d15:data:reset=0:$18F8 mc Lget+248 0:$30C4 d15:data:reset=0:$4672 mc LogCstr 0:$30C5 d15:data:reset=0:$0D20 mc Int8+32 0:$30C6 d15:data:reset=0:$5A3D mc LogChar 0:$30C7 d15:data:reset=0:$18F9 mc Lget+249 0:$30C8 d15:data:reset=0:$4672 mc LogCstr 0:$30C9 d15:data:reset=0:$0F08 mc Istr+8 0:$30CA 0:data:reset=0:$0020 dm ' ' 0:$30CB 0:data:reset=0:$005B dm '[' 0:$30CC 0:data:reset=0:$0073 dm 's' 0:$30CD 0:data:reset=0:$0070 dm 'p' 0:$30CE 0:data:reset=0:$0065 dm 'e' 0:$30CF 0:data:reset=0:$0065 dm 'e' 0:$30D0 0:data:reset=0:$0064 dm 'd' 0:$30D1 0:data:reset=0:$003A dm ':' 0:$30D2 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$30D3 d15:data:reset=0:$46D2 mc LogStr 0:$30D4 d15:data:reset=0:$18FF mc Lget+255 0:$30D5 d15:data:reset=0:$5AB5 mc LogNum 0:$30D6 d15:data:reset=0:$0D5D mc Int8+93 0:$30D7 d15:data:reset=0:$5A3D mc LogChar 0:$30D8 d15:data:reset=0:$45F6 mc Dup 0:$30D9 d15:data:reset=0:$060A mc BraIf0+10 0:$30DA d15:data:reset=0:$0F07 mc Istr+7 0:$30DB 0:data:reset=0:$005B dm '[' 0:$30DC 0:data:reset=0:$0062 dm 'b' 0:$30DD 0:data:reset=0:$0075 dm 'u' 0:$30DE 0:data:reset=0:$0072 dm 'r' 0:$30DF 0:data:reset=0:$0073 dm 's' 0:$30E0 0:data:reset=0:$0074 dm 't' 0:$30E1 0:data:reset=0:$005D dm ']' 0:$30E2 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$30E3 d15:data:reset=0:$46D2 mc LogStr 0:$30E4 d15:data:reset=0:$0D41 mc Int8+65 0:$30E5 d15:data:reset=0:$6B45 mc read_chunk__6uint16_6uint16AE 0:$30E6 d15:data:reset=0:$45F6 mc Dup 0:$30E7 d15:data:reset=0:$040C mc BraIf1+12 0:$30E8 d15:data:reset=0:$0D6A mc Int8+106 0:$30E9 d15:data:reset=0:$5FA7 mc ToR 0:$30EA d15:data:reset=0:$4581 mc DropStr 0:$30EB d15:data:reset=0:$5F2D mc MDrop0-7 0:$30EC d15:data:reset=0:$4581 mc DropStr 0:$30ED d15:data:reset=0:$4581 mc DropStr 0:$30EE d15:data:reset=0:$4581 mc DropStr 0:$30EF d15:data:reset=0:$4581 mc DropStr 0:$30F0 d15:data:reset=0:$4581 mc DropStr 0:$30F1 d15:data:reset=0:$5F9C mc FromR 0:$30F2 d15:data:reset=0:$8201 mc Hi8+1 0:$30F3 d15:data:reset=0:$A1EC mc BraFar+236 0:$30F4 d15:data:reset=0:$0D42 mc Int8+66 0:$30F5 d15:data:reset=0:$6B45 mc read_chunk__6uint16_6uint16AE 0:$30F6 d15:data:reset=0:$45F6 mc Dup 0:$30F7 d15:data:reset=0:$040D mc BraIf1+13 0:$30F8 d15:data:reset=0:$0D6B mc Int8+107 0:$30F9 d15:data:reset=0:$5FA7 mc ToR 0:$30FA d15:data:reset=0:$4581 mc DropStr 0:$30FB d15:data:reset=0:$4581 mc DropStr 0:$30FC d15:data:reset=0:$5F2D mc MDrop0-7 0:$30FD d15:data:reset=0:$4581 mc DropStr 0:$30FE d15:data:reset=0:$4581 mc DropStr 0:$30FF d15:data:reset=0:$4581 mc DropStr 0:$3100 d15:data:reset=0:$4581 mc DropStr 0:$3101 d15:data:reset=0:$4581 mc DropStr 0:$3102 d15:data:reset=0:$5F9C mc FromR 0:$3103 d15:data:reset=0:$8201 mc Hi8+1 0:$3104 d15:data:reset=0:$A1DB mc BraFar+219 0:$3105 d15:data:reset=0:$0D0C mc Int8+12 0:$3106 d15:data:reset=0:$4203 mc Alloc 0:$3107 d15:data:reset=0:$45F6 mc Dup 0:$3108 d15:data:reset=0:$18F0 mc Lget+240 0:$3109 d15:data:reset=0:$18FC mc Lget+252 0:$310A d15:data:reset=0:$18FC mc Lget+252 0:$310B d15:data:reset=0:$18F8 mc Lget+248 0:$310C d15:data:reset=0:$18F8 mc Lget+248 0:$310D d15:data:reset=0:$7585 mc BytecodeCompiler__init__16BytecodeCompilerC_6uint16_6uint16AEC_6uint16AEC_6uint16_4bool_ 0:$310E d15:data:reset=0:$9F12 mc Gget+gcode_ptr 0:$310F d15:data:reset=0:$9F12 mc Gget+gcode_ptr 0:$3110 d15:data:reset=0:$5AF1 mc i2cReadByte__6uint16 0:$3111 d15:data:reset=0:$0D43 mc Int8+67 0:$3112 d15:data:reset=0:$47D5 mc Ne 0:$3113 d15:data:reset=0:$0611 mc BraIf0+17 0:$3114 d15:data:reset=0:$0D6C mc Int8+108 0:$3115 d15:data:reset=0:$5FA7 mc ToR 0:$3116 d15:data:reset=0:$5F32 mc MDrop0-2 0:$3117 d15:data:reset=0:$46BA mc CallKill 0:$3118 d15:data:reset=0:$69D9 mc implicit__dev__kill__16BytecodeCompiler_16BytecodeCompiler 0:$3119 d15:data:reset=0:$4581 mc DropStr 0:$311A d15:data:reset=0:$4581 mc DropStr 0:$311B d15:data:reset=0:$4581 mc DropStr 0:$311C d15:data:reset=0:$5F2D mc MDrop0-7 0:$311D d15:data:reset=0:$4581 mc DropStr 0:$311E d15:data:reset=0:$4581 mc DropStr 0:$311F d15:data:reset=0:$4581 mc DropStr 0:$3120 d15:data:reset=0:$4581 mc DropStr 0:$3121 d15:data:reset=0:$4581 mc DropStr 0:$3122 d15:data:reset=0:$5F9C mc FromR 0:$3123 d15:data:reset=0:$8201 mc Hi8+1 0:$3124 d15:data:reset=0:$A1BB mc BraFar+187 0:$3125 d15:data:reset=0:$640B mc read_uint12__6uint16 0:$3126 d15:data:reset=0:$5AF1 mc i2cReadByte__6uint16 0:$3127 d15:data:reset=0:$5AF1 mc i2cReadByte__6uint16 0:$3128 d15:data:reset=0:$6345 mc read_block__6uint16AE 0:$3129 d15:data:reset=0:$6345 mc read_block__6uint16AE 0:$312A d15:data:reset=0:$6345 mc read_block__6uint16AE 0:$312B d15:data:reset=0:$0D2A mc Int8+42 0:$312C d15:data:reset=0:$5A3D mc LogChar 0:$312D d15:data:reset=0:$18F8 mc Lget+248 0:$312E d15:data:reset=0:$18FB mc Lget+251 0:$312F d15:data:reset=0:$18FB mc Lget+251 0:$3130 d15:data:reset=0:$18FB mc Lget+251 0:$3131 d15:data:reset=0:$18FB mc Lget+251 0:$3132 d15:data:reset=0:$4667 mc Retain 0:$3133 d15:data:reset=0:$18FB mc Lget+251 0:$3134 d15:data:reset=0:$72E3 mc BytecodeCompiler__compile__16BytecodeCompilerC_6uint16_6uint16_6uint16AEC_6uint16AE_6uint16AEC_6uint16 0:$3135 d15:data:reset=0:$45F6 mc Dup 0:$3136 d15:data:reset=0:$0615 mc BraIf0+21 0:$3137 d15:data:reset=0:$45F6 mc Dup 0:$3138 d15:data:reset=0:$5FA7 mc ToR 0:$3139 d15:data:reset=0:$5F33 mc MDrop0-1 0:$313A d15:data:reset=0:$4581 mc DropStr 0:$313B d15:data:reset=0:$4581 mc DropStr 0:$313C d15:data:reset=0:$4581 mc DropStr 0:$313D d15:data:reset=0:$5F2F mc MDrop0-5 0:$313E d15:data:reset=0:$46BA mc CallKill 0:$313F d15:data:reset=0:$69D9 mc implicit__dev__kill__16BytecodeCompiler_16BytecodeCompiler 0:$3140 d15:data:reset=0:$4581 mc DropStr 0:$3141 d15:data:reset=0:$4581 mc DropStr 0:$3142 d15:data:reset=0:$4581 mc DropStr 0:$3143 d15:data:reset=0:$5F2D mc MDrop0-7 0:$3144 d15:data:reset=0:$4581 mc DropStr 0:$3145 d15:data:reset=0:$4581 mc DropStr 0:$3146 d15:data:reset=0:$4581 mc DropStr 0:$3147 d15:data:reset=0:$4581 mc DropStr 0:$3148 d15:data:reset=0:$4581 mc DropStr 0:$3149 d15:data:reset=0:$5F9C mc FromR 0:$314A d15:data:reset=0:$8201 mc Hi8+1 0:$314B d15:data:reset=0:$A194 mc BraFar+148 0:$314C d15:data:reset=0:$18FB mc Lget+251 0:$314D d15:data:reset=0:$0D08 mc Int8+8 0:$314E d15:data:reset=0:$46C6 mc Uge 0:$314F d15:data:reset=0:$47E5 mc And0 0:$3150 d15:data:reset=0:$0203 mc Bra+3 0:$3151 d15:data:reset=0:$18FB mc Lget+251 0:$3152 d15:data:reset=0:$0D1F mc Int8+31 0:$3153 d15:data:reset=0:$C6CC mc Ule 0:$3154 d15:data:reset=0:$0602 mc BraIf0+2 0:$3155 d15:data:reset=0:$9F12 mc Gget+gcode_ptr 0:$3156 d15:data:reset=0:$8EF9 mc Lset+249 0:$3157 d15:data:reset=0:$18FB mc Lget+251 0:$3158 d15:data:reset=0:$0406 mc BraIf1+6 0:$3159 d15:data:reset=0:$5F33 mc MDrop0-1 0:$315A d15:data:reset=0:$4581 mc DropStr 0:$315B d15:data:reset=0:$4581 mc DropStr 0:$315C d15:data:reset=0:$4581 mc DropStr 0:$315D d15:data:reset=0:$5F31 mc MDrop0-3 0:$315E d15:data:reset=0:$0206 mc Bra+6 0:$315F d15:data:reset=0:$5F33 mc MDrop0-1 0:$3160 d15:data:reset=0:$4581 mc DropStr 0:$3161 d15:data:reset=0:$4581 mc DropStr 0:$3162 d15:data:reset=0:$4581 mc DropStr 0:$3163 d15:data:reset=0:$5F31 mc MDrop0-3 0:$3164 d15:data:reset=0:$01AB mc Bra-85 0:$3165 d15:data:reset=0:$18FE mc Lget+254 0:$3166 d15:data:reset=0:$1D0B mc ItemGet+11 0:$3167 d15:data:reset=0:$0D08 mc Int8+8 0:$3168 d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$3169 d15:data:reset=0:$45F6 mc Dup 0:$316A d15:data:reset=0:$060A mc BraIf0+10 0:$316B d15:data:reset=0:$18EE mc Lget+238 0:$316C d15:data:reset=0:$5AA1 mc Msbit0 0:$316D d15:data:reset=0:$18FF mc Lget+255 0:$316E d15:data:reset=0:$1D02 mc ItemGet+2 0:$316F d15:data:reset=0:$18FF mc Lget+255 0:$3170 d15:data:reset=0:$5C5A mc Poke 0:$3171 d15:data:reset=0:$18ED mc Lget+237 0:$3172 d15:data:reset=0:$0D10 mc Gvar+int_mask 0:$3173 d15:data:reset=0:$5CDD mc AndPoke 0:$3174 d15:data:reset=0:$5F33 mc MDrop0-1 0:$3175 d15:data:reset=0:$18FD mc Lget+253 0:$3176 d15:data:reset=0:$1D0B mc ItemGet+11 0:$3177 d15:data:reset=0:$0D00 mc Int8+0 0:$3178 d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$3179 d15:data:reset=0:$5F29 mc Nip 0:$317A d15:data:reset=0:$45F6 mc Dup 0:$317B d15:data:reset=0:$1D02 mc ItemGet+2 0:$317C d15:data:reset=0:$45F6 mc Dup 0:$317D d15:data:reset=0:$5EBD mc CallOpcode 0:$317E d15:data:reset=0:$18F3 mc Lget+243 0:$317F d15:data:reset=0:$0D00 mc Int8+0 0:$3180 d15:data:reset=0:$0E04 mc Int16+4 0:$3181 d15:data:reset=0:$5A0F mc And 0:$3182 d15:data:reset=0:$47E5 mc And0 0:$3183 d15:data:reset=0:$0203 mc Bra+3 0:$3184 d15:data:reset=0:$9F28 mc Gget+microsecs_per_int 0:$3185 d15:data:reset=0:$0D00 mc Int8+0 0:$3186 d15:data:reset=0:$47DF mc Eq 0:$3187 d15:data:reset=0:$062B mc BraIf0+43 0:$3188 d15:data:reset=0:$18FC mc Lget+252 0:$3189 d15:data:reset=0:$1D0B mc ItemGet+11 0:$318A d15:data:reset=0:$0D01 mc Int8+1 0:$318B d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$318C d15:data:reset=0:$8EFF mc Lset+255 0:$318D d15:data:reset=0:$18FF mc Lget+255 0:$318E d15:data:reset=0:$0624 mc BraIf0+36 0:$318F d15:data:reset=0:$18FF mc Lget+255 0:$3190 d15:data:reset=0:$1D02 mc ItemGet+2 0:$3191 d15:data:reset=0:$0D10 mc Int8+16 0:$3192 d15:data:reset=0:$0E27 mc Int16+39 0:$3193 d15:data:reset=0:$18FF mc Lget+255 0:$3194 d15:data:reset=0:$5EBD mc CallOpcode 0:$3195 d15:data:reset=0:$1628 mc Gset+microsecs_per_int 0:$3196 d15:data:reset=0:$0F10 mc Istr+16 0:$3197 0:data:reset=0:$005B dm '[' 0:$3198 0:data:reset=0:$0074 dm 't' 0:$3199 0:data:reset=0:$0069 dm 'i' 0:$319A 0:data:reset=0:$006D dm 'm' 0:$319B 0:data:reset=0:$0065 dm 'e' 0:$319C 0:data:reset=0:$0072 dm 'r' 0:$319D 0:data:reset=0:$0020 dm ' ' 0:$319E 0:data:reset=0:$0070 dm 'p' 0:$319F 0:data:reset=0:$0065 dm 'e' 0:$31A0 0:data:reset=0:$0072 dm 'r' 0:$31A1 0:data:reset=0:$0069 dm 'i' 0:$31A2 0:data:reset=0:$006F dm 'o' 0:$31A3 0:data:reset=0:$0064 dm 'd' 0:$31A4 0:data:reset=0:$0020 dm ' ' 0:$31A5 0:data:reset=0:$003D dm '=' 0:$31A6 0:data:reset=0:$0020 dm ' ' 0:$31A7 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$31A8 d15:data:reset=0:$9F28 mc Gget+microsecs_per_int 0:$31A9 d15:data:reset=0:$6453 mc NumStrU 0:$31AA d15:data:reset=0:$6AAF mc CatStrStr 0:$31AB d15:data:reset=0:$0F03 mc Istr+3 0:$31AC 0:data:reset=0:$00B5 dm 181 0:$31AD 0:data:reset=0:$0073 dm 's' 0:$31AE 0:data:reset=0:$005D dm ']' 0:$31AF 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$31B0 d15:data:reset=0:$6AAF mc CatStrStr 0:$31B1 d15:data:reset=0:$46D2 mc LogStr 0:$31B2 d15:data:reset=0:$5F33 mc MDrop0-1 0:$31B3 d15:data:reset=0:$18FE mc Lget+254 0:$31B4 d15:data:reset=0:$1612 mc Gset+gcode_ptr 0:$31B5 d15:data:reset=0:$0F0C mc Istr+12 0:$31B6 0:data:reset=0:$005B dm '[' 0:$31B7 0:data:reset=0:$0072 dm 'r' 0:$31B8 0:data:reset=0:$0065 dm 'e' 0:$31B9 0:data:reset=0:$0073 dm 's' 0:$31BA 0:data:reset=0:$0069 dm 'i' 0:$31BB 0:data:reset=0:$0064 dm 'd' 0:$31BC 0:data:reset=0:$0065 dm 'e' 0:$31BD 0:data:reset=0:$006E dm 'n' 0:$31BE 0:data:reset=0:$0074 dm 't' 0:$31BF 0:data:reset=0:$0020 dm ' ' 0:$31C0 0:data:reset=0:$003D dm '=' 0:$31C1 0:data:reset=0:$0020 dm ' ' 0:$31C2 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$31C3 d15:data:reset=0:$9F12 mc Gget+gcode_ptr 0:$31C4 d15:data:reset=0:$18FB mc Lget+251 0:$31C5 d15:data:reset=0:$5BAC mc Sub 0:$31C6 d15:data:reset=0:$6453 mc NumStr 0:$31C7 d15:data:reset=0:$6AAF mc CatStrStr 0:$31C8 d15:data:reset=0:$0F07 mc Istr+7 0:$31C9 0:data:reset=0:$0020 dm ' ' 0:$31CA 0:data:reset=0:$0062 dm 'b' 0:$31CB 0:data:reset=0:$0079 dm 'y' 0:$31CC 0:data:reset=0:$0074 dm 't' 0:$31CD 0:data:reset=0:$0065 dm 'e' 0:$31CE 0:data:reset=0:$0073 dm 's' 0:$31CF 0:data:reset=0:$005D dm ']' 0:$31D0 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$31D1 d15:data:reset=0:$6AAF mc CatStrStr 0:$31D2 d15:data:reset=0:$46D2 mc LogStr 0:$31D3 d15:data:reset=0:$0D00 mc Int8+0 0:$31D4 d15:data:reset=0:$18EB mc Lget+235 0:$31D5 d15:data:reset=0:$18EE mc Lget+238 0:$31D6 d15:data:reset=0:$4667 mc Retain 0:$31D7 d15:data:reset=0:$18FE mc Lget+254 0:$31D8 d15:data:reset=0:$6900 mc numstr__6uint16_8ucs2charAE 0:$31D9 d15:data:reset=0:$6AAF mc CatStrStr 0:$31DA d15:data:reset=0:$5A61 mc DupToR 0:$31DB d15:data:reset=0:$6698 mc Node__find__4NodeC_8ucs2charAEC_2FDC 0:$31DC d15:data:reset=0:$5F9C mc FromR 0:$31DD d15:data:reset=0:$4581 mc DropStr 0:$31DE d15:data:reset=0:$0603 mc BraIf0+3 0:$31DF d15:data:reset=0:$5BC5 mc PshHP 0:$31E0 d15:data:reset=0:$5E7E mc Incr 0:$31E1 d15:data:reset=0:$01F2 mc Bra-14 0:$31E2 d15:data:reset=0:$0D0A mc Int8+10 0:$31E3 d15:data:reset=0:$649F mc init_device__4NodeC_6uint16_6uint16__procptr__6uint16_6uint16P 0:$31E4 d15:data:reset=0:$0D09 mc Int8+9 0:$31E5 d15:data:reset=0:$649F mc init_device__4NodeC_6uint16_6uint16__procptr__6uint16_6uint16P 0:$31E6 d15:data:reset=0:$18FF mc Lget+255 0:$31E7 d15:data:reset=0:$47E5 mc And0 0:$31E8 d15:data:reset=0:$0201 mc Bra+1 0:$31E9 d15:data:reset=0:$45F6 mc Dup 0:$31EA d15:data:reset=0:$0410 mc BraIf1+16 0:$31EB d15:data:reset=0:$0D6D mc Int8+109 0:$31EC d15:data:reset=0:$5FA7 mc ToR 0:$31ED d15:data:reset=0:$5F2D mc MDrop0-7 0:$31EE d15:data:reset=0:$46BA mc CallKill 0:$31EF d15:data:reset=0:$69D9 mc implicit__dev__kill__16BytecodeCompiler_16BytecodeCompiler 0:$31F0 d15:data:reset=0:$4581 mc DropStr 0:$31F1 d15:data:reset=0:$4581 mc DropStr 0:$31F2 d15:data:reset=0:$4581 mc DropStr 0:$31F3 d15:data:reset=0:$5F2D mc MDrop0-7 0:$31F4 d15:data:reset=0:$4581 mc DropStr 0:$31F5 d15:data:reset=0:$4581 mc DropStr 0:$31F6 d15:data:reset=0:$4581 mc DropStr 0:$31F7 d15:data:reset=0:$4581 mc DropStr 0:$31F8 d15:data:reset=0:$4581 mc DropStr 0:$31F9 d15:data:reset=0:$5F9C mc FromR 0:$31FA d15:data:reset=0:$02E5 mc Bra+229 0:$31FB d15:data:reset=0:$18F0 mc Lget+240 0:$31FC d15:data:reset=0:$0D04 mc Int8+4 0:$31FD d15:data:reset=0:$5A0F mc And 0:$31FE d15:data:reset=0:$0666 mc BraIf0+102 0:$31FF d15:data:reset=0:$0D0B mc Int8+11 0:$3200 d15:data:reset=0:$649F mc init_device__4NodeC_6uint16_6uint16__procptr__6uint16_6uint16P 0:$3201 d15:data:reset=0:$0D0C mc Int8+12 0:$3202 d15:data:reset=0:$649F mc init_device__4NodeC_6uint16_6uint16__procptr__6uint16_6uint16P 0:$3203 d15:data:reset=0:$0D0D mc Int8+13 0:$3204 d15:data:reset=0:$649F mc init_device__4NodeC_6uint16_6uint16__procptr__6uint16_6uint16P 0:$3205 d15:data:reset=0:$0D0E mc Int8+14 0:$3206 d15:data:reset=0:$649F mc init_device__4NodeC_6uint16_6uint16__procptr__6uint16_6uint16P 0:$3207 d15:data:reset=0:$18EC mc Lget+236 0:$3208 d15:data:reset=0:$0D01 mc Int8+1 0:$3209 d15:data:reset=0:$5A0F mc And 0:$320A d15:data:reset=0:$47E5 mc And0 0:$320B d15:data:reset=0:$0206 mc Bra+6 0:$320C d15:data:reset=0:$18FD mc Lget+253 0:$320D d15:data:reset=0:$47E5 mc And0 0:$320E d15:data:reset=0:$0202 mc Bra+2 0:$320F d15:data:reset=0:$18FE mc Lget+254 0:$3210 d15:data:reset=0:$4837 mc Bool 0:$3211 d15:data:reset=0:$4823 mc Not 0:$3212 d15:data:reset=0:$0611 mc BraIf0+17 0:$3213 d15:data:reset=0:$0D6E mc Int8+110 0:$3214 d15:data:reset=0:$5FA7 mc ToR 0:$3215 d15:data:reset=0:$5F2C mc MDrop0-8 0:$3216 d15:data:reset=0:$5F31 mc MDrop0-3 0:$3217 d15:data:reset=0:$46BA mc CallKill 0:$3218 d15:data:reset=0:$69D9 mc implicit__dev__kill__16BytecodeCompiler_16BytecodeCompiler 0:$3219 d15:data:reset=0:$4581 mc DropStr 0:$321A d15:data:reset=0:$4581 mc DropStr 0:$321B d15:data:reset=0:$4581 mc DropStr 0:$321C d15:data:reset=0:$5F2D mc MDrop0-7 0:$321D d15:data:reset=0:$4581 mc DropStr 0:$321E d15:data:reset=0:$4581 mc DropStr 0:$321F d15:data:reset=0:$4581 mc DropStr 0:$3220 d15:data:reset=0:$4581 mc DropStr 0:$3221 d15:data:reset=0:$4581 mc DropStr 0:$3222 d15:data:reset=0:$5F9C mc FromR 0:$3223 d15:data:reset=0:$02BC mc Bra+188 0:$3224 d15:data:reset=0:$18EC mc Lget+236 0:$3225 d15:data:reset=0:$0D02 mc Int8+2 0:$3226 d15:data:reset=0:$5A0F mc And 0:$3227 d15:data:reset=0:$47E5 mc And0 0:$3228 d15:data:reset=0:$0206 mc Bra+6 0:$3229 d15:data:reset=0:$18FF mc Lget+255 0:$322A d15:data:reset=0:$47E5 mc And0 0:$322B d15:data:reset=0:$0202 mc Bra+2 0:$322C d15:data:reset=0:$45F6 mc Dup 0:$322D d15:data:reset=0:$4837 mc Bool 0:$322E d15:data:reset=0:$4823 mc Not 0:$322F d15:data:reset=0:$0611 mc BraIf0+17 0:$3230 d15:data:reset=0:$0D6F mc Int8+111 0:$3231 d15:data:reset=0:$5FA7 mc ToR 0:$3232 d15:data:reset=0:$5F2C mc MDrop0-8 0:$3233 d15:data:reset=0:$5F31 mc MDrop0-3 0:$3234 d15:data:reset=0:$46BA mc CallKill 0:$3235 d15:data:reset=0:$69D9 mc implicit__dev__kill__16BytecodeCompiler_16BytecodeCompiler 0:$3236 d15:data:reset=0:$4581 mc DropStr 0:$3237 d15:data:reset=0:$4581 mc DropStr 0:$3238 d15:data:reset=0:$4581 mc DropStr 0:$3239 d15:data:reset=0:$5F2D mc MDrop0-7 0:$323A d15:data:reset=0:$4581 mc DropStr 0:$323B d15:data:reset=0:$4581 mc DropStr 0:$323C d15:data:reset=0:$4581 mc DropStr 0:$323D d15:data:reset=0:$4581 mc DropStr 0:$323E d15:data:reset=0:$4581 mc DropStr 0:$323F d15:data:reset=0:$5F9C mc FromR 0:$3240 d15:data:reset=0:$029F mc Bra+159 0:$3241 d15:data:reset=0:$0D00 mc Int8+0 0:$3242 d15:data:reset=0:$45F6 mc Dup 0:$3243 d15:data:reset=0:$18EE mc Lget+238 0:$3244 d15:data:reset=0:$46CC mc Ult 0:$3245 d15:data:reset=0:$061D mc BraIf0+29 0:$3246 d15:data:reset=0:$18E8 mc Lget+232 0:$3247 d15:data:reset=0:$4667 mc Retain 0:$3248 d15:data:reset=0:$18F8 mc Lget+248 0:$3249 d15:data:reset=0:$18FE mc Lget+254 0:$324A d15:data:reset=0:$5AAD mc Add 0:$324B d15:data:reset=0:$6900 mc numstr__6uint16_8ucs2charAE 0:$324C d15:data:reset=0:$6AAF mc CatStrStr 0:$324D d15:data:reset=0:$18F3 mc Lget+243 0:$324E d15:data:reset=0:$1D09 mc ItemGet+9 0:$324F d15:data:reset=0:$18FE mc Lget+254 0:$3250 d15:data:reset=0:$5AAD mc Add 0:$3251 d15:data:reset=0:$5AC5 mc Peek 0:$3252 d15:data:reset=0:$18E2 mc Lget+226 0:$3253 d15:data:reset=0:$18FE mc Lget+254 0:$3254 d15:data:reset=0:$18E7 mc Lget+231 0:$3255 d15:data:reset=0:$18FD mc Lget+253 0:$3256 d15:data:reset=0:$18F4 mc Lget+244 0:$3257 d15:data:reset=0:$18F4 mc Lget+244 0:$3258 d15:data:reset=0:$18F4 mc Lget+244 0:$3259 d15:data:reset=0:$18F4 mc Lget+244 0:$325A d15:data:reset=0:$18F4 mc Lget+244 0:$325B d15:data:reset=0:$18F4 mc Lget+244 0:$325C d15:data:reset=0:$6CF9 mc new__8ucs2charAEC_6uint16_8DrvrDataC_6uint16B8DrvrDataC6uint16D_4voidB8DrvrDataC6uint166uint16D_6uint16B8DrvrDataCD_6uint16B8DrvrDataC6uint16AEC6uint166uint16D_4voidB8DrvrDataC6uint16D_6uint16B8DrvrDataC6uint16AEC6uint166uint16D_12SerialDevice 0:$325D d15:data:reset=0:$6355 mc Node__append__4NodeC_2FD_ 0:$325E d15:data:reset=0:$07FE mc Lvar+254 0:$325F d15:data:reset=0:$5E7E mc Incr 0:$3260 d15:data:reset=0:$5F33 mc MDrop0-1 0:$3261 d15:data:reset=0:$4581 mc DropStr 0:$3262 d15:data:reset=0:$01DF mc Bra-33 0:$3263 d15:data:reset=0:$5F2F mc MDrop0-5 0:$3264 d15:data:reset=0:$026C mc Bra+108 0:$3265 d15:data:reset=0:$18F0 mc Lget+240 0:$3266 d15:data:reset=0:$0D08 mc Int8+8 0:$3267 d15:data:reset=0:$5A0F mc And 0:$3268 d15:data:reset=0:$0658 mc BraIf0+88 0:$3269 d15:data:reset=0:$0D0F mc Int8+15 0:$326A d15:data:reset=0:$649F mc init_device__4NodeC_6uint16_6uint16__procptr__6uint16_6uint16P 0:$326B d15:data:reset=0:$0D10 mc Int8+16 0:$326C d15:data:reset=0:$649F mc init_device__4NodeC_6uint16_6uint16__procptr__6uint16_6uint16P 0:$326D d15:data:reset=0:$18EE mc Lget+238 0:$326E d15:data:reset=0:$0D01 mc Int8+1 0:$326F d15:data:reset=0:$5A0F mc And 0:$3270 d15:data:reset=0:$47E5 mc And0 0:$3271 d15:data:reset=0:$0202 mc Bra+2 0:$3272 d15:data:reset=0:$18FF mc Lget+255 0:$3273 d15:data:reset=0:$4823 mc Not 0:$3274 d15:data:reset=0:$0611 mc BraIf0+17 0:$3275 d15:data:reset=0:$0D70 mc Int8+112 0:$3276 d15:data:reset=0:$5FA7 mc ToR 0:$3277 d15:data:reset=0:$5F2C mc MDrop0-8 0:$3278 d15:data:reset=0:$5F33 mc MDrop0-1 0:$3279 d15:data:reset=0:$46BA mc CallKill 0:$327A d15:data:reset=0:$69D9 mc implicit__dev__kill__16BytecodeCompiler_16BytecodeCompiler 0:$327B d15:data:reset=0:$4581 mc DropStr 0:$327C d15:data:reset=0:$4581 mc DropStr 0:$327D d15:data:reset=0:$4581 mc DropStr 0:$327E d15:data:reset=0:$5F2D mc MDrop0-7 0:$327F d15:data:reset=0:$4581 mc DropStr 0:$3280 d15:data:reset=0:$4581 mc DropStr 0:$3281 d15:data:reset=0:$4581 mc DropStr 0:$3282 d15:data:reset=0:$4581 mc DropStr 0:$3283 d15:data:reset=0:$4581 mc DropStr 0:$3284 d15:data:reset=0:$5F9C mc FromR 0:$3285 d15:data:reset=0:$025A mc Bra+90 0:$3286 d15:data:reset=0:$18EE mc Lget+238 0:$3287 d15:data:reset=0:$0D02 mc Int8+2 0:$3288 d15:data:reset=0:$5A0F mc And 0:$3289 d15:data:reset=0:$47E5 mc And0 0:$328A d15:data:reset=0:$0202 mc Bra+2 0:$328B d15:data:reset=0:$45F6 mc Dup 0:$328C d15:data:reset=0:$4823 mc Not 0:$328D d15:data:reset=0:$0611 mc BraIf0+17 0:$328E d15:data:reset=0:$0D71 mc Int8+113 0:$328F d15:data:reset=0:$5FA7 mc ToR 0:$3290 d15:data:reset=0:$5F2C mc MDrop0-8 0:$3291 d15:data:reset=0:$5F33 mc MDrop0-1 0:$3292 d15:data:reset=0:$46BA mc CallKill 0:$3293 d15:data:reset=0:$69D9 mc implicit__dev__kill__16BytecodeCompiler_16BytecodeCompiler 0:$3294 d15:data:reset=0:$4581 mc DropStr 0:$3295 d15:data:reset=0:$4581 mc DropStr 0:$3296 d15:data:reset=0:$4581 mc DropStr 0:$3297 d15:data:reset=0:$5F2D mc MDrop0-7 0:$3298 d15:data:reset=0:$4581 mc DropStr 0:$3299 d15:data:reset=0:$4581 mc DropStr 0:$329A d15:data:reset=0:$4581 mc DropStr 0:$329B d15:data:reset=0:$4581 mc DropStr 0:$329C d15:data:reset=0:$4581 mc DropStr 0:$329D d15:data:reset=0:$5F9C mc FromR 0:$329E d15:data:reset=0:$0241 mc Bra+65 0:$329F d15:data:reset=0:$0D00 mc Int8+0 0:$32A0 d15:data:reset=0:$45F6 mc Dup 0:$32A1 d15:data:reset=0:$18F0 mc Lget+240 0:$32A2 d15:data:reset=0:$46CC mc Ult 0:$32A3 d15:data:reset=0:$061B mc BraIf0+27 0:$32A4 d15:data:reset=0:$18EA mc Lget+234 0:$32A5 d15:data:reset=0:$4667 mc Retain 0:$32A6 d15:data:reset=0:$18FA mc Lget+250 0:$32A7 d15:data:reset=0:$18FE mc Lget+254 0:$32A8 d15:data:reset=0:$5AAD mc Add 0:$32A9 d15:data:reset=0:$6900 mc numstr__6uint16_8ucs2charAE 0:$32AA d15:data:reset=0:$6AAF mc CatStrStr 0:$32AB d15:data:reset=0:$18F5 mc Lget+245 0:$32AC d15:data:reset=0:$1D09 mc ItemGet+9 0:$32AD d15:data:reset=0:$18FE mc Lget+254 0:$32AE d15:data:reset=0:$5AAD mc Add 0:$32AF d15:data:reset=0:$5AC5 mc Peek 0:$32B0 d15:data:reset=0:$18E4 mc Lget+228 0:$32B1 d15:data:reset=0:$18FE mc Lget+254 0:$32B2 d15:data:reset=0:$18E9 mc Lget+233 0:$32B3 d15:data:reset=0:$18FD mc Lget+253 0:$32B4 d15:data:reset=0:$18F6 mc Lget+246 0:$32B5 d15:data:reset=0:$18F6 mc Lget+246 0:$32B6 d15:data:reset=0:$18F6 mc Lget+246 0:$32B7 d15:data:reset=0:$18F6 mc Lget+246 0:$32B8 d15:data:reset=0:$6EA2 mc new__8ucs2charAEC_6uint16_8DrvrDataC_6uint16B8DrvrDataC6uint16D_4voidB8DrvrDataC6uint166uint16D_3ErrB8DrvrDataC6uint326uint16AEC6uint166uint16D_3ErrB8DrvrDataC6uint326uint16AEC6uint166uint16D_11BlockDevice 0:$32B9 d15:data:reset=0:$6355 mc Node__append__4NodeC_2FD_ 0:$32BA d15:data:reset=0:$07FE mc Lvar+254 0:$32BB d15:data:reset=0:$5E7E mc Incr 0:$32BC d15:data:reset=0:$5F33 mc MDrop0-1 0:$32BD d15:data:reset=0:$4581 mc DropStr 0:$32BE d15:data:reset=0:$01E1 mc Bra-31 0:$32BF d15:data:reset=0:$5F31 mc MDrop0-3 0:$32C0 d15:data:reset=0:$0210 mc Bra+16 0:$32C1 d15:data:reset=0:$0D72 mc Int8+114 0:$32C2 d15:data:reset=0:$5FA7 mc ToR 0:$32C3 d15:data:reset=0:$5F2D mc MDrop0-7 0:$32C4 d15:data:reset=0:$46BA mc CallKill 0:$32C5 d15:data:reset=0:$69D9 mc implicit__dev__kill__16BytecodeCompiler_16BytecodeCompiler 0:$32C6 d15:data:reset=0:$4581 mc DropStr 0:$32C7 d15:data:reset=0:$4581 mc DropStr 0:$32C8 d15:data:reset=0:$4581 mc DropStr 0:$32C9 d15:data:reset=0:$5F2D mc MDrop0-7 0:$32CA d15:data:reset=0:$4581 mc DropStr 0:$32CB d15:data:reset=0:$4581 mc DropStr 0:$32CC d15:data:reset=0:$4581 mc DropStr 0:$32CD d15:data:reset=0:$4581 mc DropStr 0:$32CE d15:data:reset=0:$4581 mc DropStr 0:$32CF d15:data:reset=0:$5F9C mc FromR 0:$32D0 d15:data:reset=0:$020F mc Bra+15 0:$32D1 d15:data:reset=0:$0D00 mc Int8+0 0:$32D2 d15:data:reset=0:$5FA7 mc ToR 0:$32D3 d15:data:reset=0:$5F2D mc MDrop0-7 0:$32D4 d15:data:reset=0:$46BA mc CallKill 0:$32D5 d15:data:reset=0:$69D9 mc implicit__dev__kill__16BytecodeCompiler_16BytecodeCompiler 0:$32D6 d15:data:reset=0:$4581 mc DropStr 0:$32D7 d15:data:reset=0:$4581 mc DropStr 0:$32D8 d15:data:reset=0:$4581 mc DropStr 0:$32D9 d15:data:reset=0:$5F2D mc MDrop0-7 0:$32DA d15:data:reset=0:$4581 mc DropStr 0:$32DB d15:data:reset=0:$4581 mc DropStr 0:$32DC d15:data:reset=0:$4581 mc DropStr 0:$32DD d15:data:reset=0:$4581 mc DropStr 0:$32DE d15:data:reset=0:$4581 mc DropStr 0:$32DF d15:data:reset=0:$5F9C mc FromR 0:$32E0 d15:data:reset=0:$5F28 mc MNip0-2 0:$32E1 d15:data:reset=0:$5BF4 mc PopContext0 0:$32E2 d15:data:reset=0:$5ACD mc Ret : init_device__4NodeC_6uint16_6uint16__procptr__6uint16_6uint16P ( uint16 -- uint16* ) Millicoded // Size: 19 microcodes 0:$249F 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$24A0 0:data:reset=0:$64A3 0:$24A1 0:000011:A1=A4:D0=D0 jp millicoded // * Millicoded 0:$24A2 d15:data:reset=0:$5F70 0:$24A3 d15:data:reset=0:$8F8E mc XLvar+142 0:$24A4 d15:data:reset=0:$5AC5 mc Peek 0:$24A5 d15:data:reset=0:$1D0B mc ItemGet+11 0:$24A6 d15:data:reset=0:$18FF mc Lget+255 0:$24A7 d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$24A8 d15:data:reset=0:$0607 mc BraIf0+7 0:$24A9 d15:data:reset=0:$8F8E mc XLvar+142 0:$24AA d15:data:reset=0:$5AC5 mc Peek 0:$24AB d15:data:reset=0:$1D0B mc ItemGet+11 0:$24AC d15:data:reset=0:$18FF mc Lget+255 0:$24AD d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$24AE d15:data:reset=0:$1D02 mc ItemGet+2 0:$24AF d15:data:reset=0:$0201 mc Bra+1 0:$24B0 d15:data:reset=0:$0D00 mc Int8+0 0:$24B1 d15:data:reset=0:$6310 mc MNip0_Next-1 : find_stdio__4NodeC_ ( Node¢ ) Millicoded // Size: 275 microcodes 0:$38EF 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$38F0 0:data:reset=0:$78F3 0:$38F1 0:000011:A1=A0:D0=D0 jp millicoded // * Millicoded 0:$38F2 d15:data:reset=0:$5F70 0:$38F3 d15:data:reset=0:$0F0D mc Istr+13 0:$38F4 0:data:reset=0:$000A dm 10 0:$38F5 0:data:reset=0:$005B dm '[' 0:$38F6 0:data:reset=0:$0066 dm 'f' 0:$38F7 0:data:reset=0:$0069 dm 'i' 0:$38F8 0:data:reset=0:$006E dm 'n' 0:$38F9 0:data:reset=0:$0064 dm 'd' 0:$38FA 0:data:reset=0:$005F dm '_' 0:$38FB 0:data:reset=0:$0073 dm 's' 0:$38FC 0:data:reset=0:$0074 dm 't' 0:$38FD 0:data:reset=0:$0064 dm 'd' 0:$38FE 0:data:reset=0:$0069 dm 'i' 0:$38FF 0:data:reset=0:$006F dm 'o' 0:$3900 0:data:reset=0:$005D dm ']' 0:$3901 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$3902 d15:data:reset=0:$46D2 mc LogStr 0:$3903 d15:data:reset=0:$0D00 mc Int8+0 0:$3904 d15:data:reset=0:$0D10 mc Int8+16 0:$3905 d15:data:reset=0:$4203 mc Alloc 0:$3906 d15:data:reset=0:$0D00 mc Int8+0 0:$3907 d15:data:reset=0:$18FD mc Lget+253 0:$3908 d15:data:reset=0:$1D04 mc ItemGet+4 0:$3909 d15:data:reset=0:$482D mc Count 0:$390A d15:data:reset=0:$5BC5 mc PshHP 0:$390B d15:data:reset=0:$5DD0 mc Peekmm 0:$390C d15:data:reset=0:$0621 mc BraIf0+33 0:$390D d15:data:reset=0:$18FC mc Lget+252 0:$390E d15:data:reset=0:$1D04 mc ItemGet+4 0:$390F d15:data:reset=0:$18FF mc Lget+255 0:$3910 d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$3911 d15:data:reset=0:$45F6 mc Dup 0:$3912 d15:data:reset=0:$1D00 mc ItemGet+0 0:$3913 d15:data:reset=0:$0D04 mc Int8+4 0:$3914 d15:data:reset=0:$47DF mc Eq 0:$3915 d15:data:reset=0:$47E5 mc And0 0:$3916 d15:data:reset=0:$0204 mc Bra+4 0:$3917 d15:data:reset=0:$45F6 mc Dup 0:$3918 d15:data:reset=0:$1D04 mc ItemGet+4 0:$3919 d15:data:reset=0:$0D10 mc Int8+16 0:$391A d15:data:reset=0:$5A0F mc And 0:$391B d15:data:reset=0:$0610 mc BraIf0+16 0:$391C d15:data:reset=0:$45F6 mc Dup 0:$391D d15:data:reset=0:$1D04 mc ItemGet+4 0:$391E d15:data:reset=0:$0D01 mc Int8+1 0:$391F d15:data:reset=0:$5A0F mc And 0:$3920 d15:data:reset=0:$0603 mc BraIf0+3 0:$3921 d15:data:reset=0:$45F6 mc Dup 0:$3922 d15:data:reset=0:$07FB mc Lvar+251 0:$3923 d15:data:reset=0:$60B2 mc Append 0:$3924 d15:data:reset=0:$45F6 mc Dup 0:$3925 d15:data:reset=0:$1D04 mc ItemGet+4 0:$3926 d15:data:reset=0:$0D02 mc Int8+2 0:$3927 d15:data:reset=0:$5A0F mc And 0:$3928 d15:data:reset=0:$0603 mc BraIf0+3 0:$3929 d15:data:reset=0:$45F6 mc Dup 0:$392A d15:data:reset=0:$07FD mc Lvar+253 0:$392B d15:data:reset=0:$60B2 mc Append 0:$392C d15:data:reset=0:$5F33 mc MDrop0-1 0:$392D d15:data:reset=0:$01DC mc Bra-36 0:$392E d15:data:reset=0:$0F09 mc Istr+9 0:$392F 0:data:reset=0:$0020 dm ' ' 0:$3930 0:data:reset=0:$0069 dm 'i' 0:$3931 0:data:reset=0:$006E dm 'n' 0:$3932 0:data:reset=0:$0064 dm 'd' 0:$3933 0:data:reset=0:$0065 dm 'e' 0:$3934 0:data:reset=0:$0076 dm 'v' 0:$3935 0:data:reset=0:$0073 dm 's' 0:$3936 0:data:reset=0:$003A dm ':' 0:$3937 0:data:reset=0:$0020 dm ' ' 0:$3938 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$3939 d15:data:reset=0:$46D2 mc LogStr 0:$393A d15:data:reset=0:$18FD mc Lget+253 0:$393B d15:data:reset=0:$482D mc Count 0:$393C d15:data:reset=0:$5AB5 mc LogNum 0:$393D d15:data:reset=0:$0F0A mc Istr+10 0:$393E 0:data:reset=0:$0020 dm ' ' 0:$393F 0:data:reset=0:$006F dm 'o' 0:$3940 0:data:reset=0:$0075 dm 'u' 0:$3941 0:data:reset=0:$0074 dm 't' 0:$3942 0:data:reset=0:$0064 dm 'd' 0:$3943 0:data:reset=0:$0065 dm 'e' 0:$3944 0:data:reset=0:$0076 dm 'v' 0:$3945 0:data:reset=0:$0073 dm 's' 0:$3946 0:data:reset=0:$003A dm ':' 0:$3947 0:data:reset=0:$0020 dm ' ' 0:$3948 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$3949 d15:data:reset=0:$46D2 mc LogStr 0:$394A d15:data:reset=0:$18FF mc Lget+255 0:$394B d15:data:reset=0:$482D mc Count 0:$394C d15:data:reset=0:$5AB5 mc LogNum 0:$394D d15:data:reset=0:$18FF mc Lget+255 0:$394E d15:data:reset=0:$482D mc Count 0:$394F d15:data:reset=0:$5F29 mc Nip 0:$3950 d15:data:reset=0:$5BC5 mc PshHP 0:$3951 d15:data:reset=0:$5DD0 mc Peekmm 0:$3952 d15:data:reset=0:$0632 mc BraIf0+50 0:$3953 d15:data:reset=0:$0F21 mc Istr+33 0:$3954 0:data:reset=0:$000A dm 10 0:$3955 0:data:reset=0:$000A dm 10 0:$3956 0:data:reset=0:$0074 dm 't' 0:$3957 0:data:reset=0:$006F dm 'o' 0:$3958 0:data:reset=0:$0020 dm ' ' 0:$3959 0:data:reset=0:$0073 dm 's' 0:$395A 0:data:reset=0:$0065 dm 'e' 0:$395B 0:data:reset=0:$006C dm 'l' 0:$395C 0:data:reset=0:$0065 dm 'e' 0:$395D 0:data:reset=0:$0063 dm 'c' 0:$395E 0:data:reset=0:$0074 dm 't' 0:$395F 0:data:reset=0:$0020 dm ' ' 0:$3960 0:data:reset=0:$0074 dm 't' 0:$3961 0:data:reset=0:$0065 dm 'e' 0:$3962 0:data:reset=0:$0072 dm 'r' 0:$3963 0:data:reset=0:$006D dm 'm' 0:$3964 0:data:reset=0:$0069 dm 'i' 0:$3965 0:data:reset=0:$006E dm 'n' 0:$3966 0:data:reset=0:$0061 dm 'a' 0:$3967 0:data:reset=0:$006C dm 'l' 0:$3968 0:data:reset=0:$0020 dm ' ' 0:$3969 0:data:reset=0:$0074 dm 't' 0:$396A 0:data:reset=0:$0079 dm 'y' 0:$396B 0:data:reset=0:$0070 dm 'p' 0:$396C 0:data:reset=0:$0065 dm 'e' 0:$396D 0:data:reset=0:$0020 dm ' ' 0:$396E 0:data:reset=0:$0027 dm 39 0:$396F 0:data:reset=0:$0023 dm '#' 0:$3970 0:data:reset=0:$0027 dm 39 0:$3971 0:data:reset=0:$0020 dm ' ' 0:$3972 0:data:reset=0:$002B dm '+' 0:$3973 0:data:reset=0:$0020 dm ' ' 0:$3974 0:data:reset=0:$0027 dm 39 0:$3975 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$3976 d15:data:reset=0:$18FF mc Lget+255 0:$3977 d15:data:reset=0:$6453 mc NumStrU 0:$3978 d15:data:reset=0:$6AAF mc CatStrStr 0:$3979 d15:data:reset=0:$0F02 mc Istr+2 0:$397A 0:data:reset=0:$0027 dm 39 0:$397B 0:data:reset=0:$000A dm 10 0:$397C 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$397D d15:data:reset=0:$6AAF mc CatStrStr 0:$397E d15:data:reset=0:$18FE mc Lget+254 0:$397F d15:data:reset=0:$18FE mc Lget+254 0:$3980 d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$3981 d15:data:reset=0:$18FF mc Lget+255 0:$3982 d15:data:reset=0:$6C43 mc SerialDevice__writebytes__12SerialDeviceC_6uint16AEC_ 0:$3983 d15:data:reset=0:$4581 mc DropStr 0:$3984 d15:data:reset=0:$01CB mc Bra-53 0:$3985 d15:data:reset=0:$18FD mc Lget+253 0:$3986 d15:data:reset=0:$482D mc Count 0:$3987 d15:data:reset=0:$0D00 mc Int8+0 0:$3988 d15:data:reset=0:$47DF mc Eq 0:$3989 d15:data:reset=0:$0619 mc BraIf0+25 0:$398A d15:data:reset=0:$0F16 mc Istr+22 0:$398B 0:data:reset=0:$004E dm 'N' 0:$398C 0:data:reset=0:$006F dm 'o' 0:$398D 0:data:reset=0:$0020 dm ' ' 0:$398E 0:data:reset=0:$0049 dm 'I' 0:$398F 0:data:reset=0:$006E dm 'n' 0:$3990 0:data:reset=0:$0070 dm 'p' 0:$3991 0:data:reset=0:$0075 dm 'u' 0:$3992 0:data:reset=0:$0074 dm 't' 0:$3993 0:data:reset=0:$0020 dm ' ' 0:$3994 0:data:reset=0:$0044 dm 'D' 0:$3995 0:data:reset=0:$0065 dm 'e' 0:$3996 0:data:reset=0:$0076 dm 'v' 0:$3997 0:data:reset=0:$0069 dm 'i' 0:$3998 0:data:reset=0:$0063 dm 'c' 0:$3999 0:data:reset=0:$0065 dm 'e' 0:$399A 0:data:reset=0:$0020 dm ' ' 0:$399B 0:data:reset=0:$0046 dm 'F' 0:$399C 0:data:reset=0:$006F dm 'o' 0:$399D 0:data:reset=0:$0075 dm 'u' 0:$399E 0:data:reset=0:$006E dm 'n' 0:$399F 0:data:reset=0:$0064 dm 'd' 0:$39A0 0:data:reset=0:$0021 dm '!' 0:$39A1 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$39A2 d15:data:reset=0:$64D8 mc PANIC__8ucs2charAE_ 0:$39A3 d15:data:reset=0:$0F13 mc Istr+19 0:$39A4 0:data:reset=0:$000A dm 10 0:$39A5 0:data:reset=0:$0057 dm 'W' 0:$39A6 0:data:reset=0:$0061 dm 'a' 0:$39A7 0:data:reset=0:$0069 dm 'i' 0:$39A8 0:data:reset=0:$0074 dm 't' 0:$39A9 0:data:reset=0:$0069 dm 'i' 0:$39AA 0:data:reset=0:$006E dm 'n' 0:$39AB 0:data:reset=0:$0067 dm 'g' 0:$39AC 0:data:reset=0:$0020 dm ' ' 0:$39AD 0:data:reset=0:$0066 dm 'f' 0:$39AE 0:data:reset=0:$006F dm 'o' 0:$39AF 0:data:reset=0:$0072 dm 'r' 0:$39B0 0:data:reset=0:$0020 dm ' ' 0:$39B1 0:data:reset=0:$006B dm 'k' 0:$39B2 0:data:reset=0:$0065 dm 'e' 0:$39B3 0:data:reset=0:$0079 dm 'y' 0:$39B4 0:data:reset=0:$002E dm '.' 0:$39B5 0:data:reset=0:$002E dm '.' 0:$39B6 0:data:reset=0:$002E dm '.' 0:$39B7 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$39B8 d15:data:reset=0:$46D2 mc LogStr 0:$39B9 d15:data:reset=0:$0D00 mc Int8+0 0:$39BA d15:data:reset=0:$18FF mc Lget+255 0:$39BB d15:data:reset=0:$0D00 mc Int8+0 0:$39BC d15:data:reset=0:$47DF mc Eq 0:$39BD d15:data:reset=0:$0606 mc BraIf0+6 0:$39BE d15:data:reset=0:$45F6 mc Dup 0:$39BF d15:data:reset=0:$0603 mc BraIf0+3 0:$39C0 d15:data:reset=0:$0D00 mc Int8+0 0:$39C1 d15:data:reset=0:$5F29 mc Nip 0:$39C2 d15:data:reset=0:$0201 mc Bra+1 0:$39C3 d15:data:reset=0:$5E90 mc Halt 0:$39C4 d15:data:reset=0:$07FF mc Lvar+255 0:$39C5 d15:data:reset=0:$5D68 mc ppPeek 0:$39C6 d15:data:reset=0:$18FB mc Lget+251 0:$39C7 d15:data:reset=0:$482D mc Count 0:$39C8 d15:data:reset=0:$5AE9 mc Remu 0:$39C9 d15:data:reset=0:$8EFF mc Lset+255 0:$39CA d15:data:reset=0:$18FC mc Lget+252 0:$39CB d15:data:reset=0:$18FE mc Lget+254 0:$39CC d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$39CD d15:data:reset=0:$0D04 mc Int8+4 0:$39CE d15:data:reset=0:$6852 mc Device__getctl__6DeviceC_6uint16_6uint16 0:$39CF d15:data:reset=0:$05EA mc BraIf0-22 0:$39D0 d15:data:reset=0:$0D01 mc Int8+1 0:$39D1 d15:data:reset=0:$5F29 mc Nip 0:$39D2 d15:data:reset=0:$18FC mc Lget+252 0:$39D3 d15:data:reset=0:$18FE mc Lget+254 0:$39D4 d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$39D5 d15:data:reset=0:$65DE mc SerialDevice__readbyte__12SerialDeviceC_6uint16 0:$39D6 d15:data:reset=0:$45F6 mc Dup 0:$39D7 d15:data:reset=0:$5A3D mc LogChar 0:$39D8 d15:data:reset=0:$18FC mc Lget+252 0:$39D9 d15:data:reset=0:$18FD mc Lget+253 0:$39DA d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$39DB d15:data:reset=0:$0D23 mc Int8+35 0:$39DC d15:data:reset=0:$47DF mc Eq 0:$39DD d15:data:reset=0:$0619 mc BraIf0+25 0:$39DE d15:data:reset=0:$45F6 mc Dup 0:$39DF d15:data:reset=0:$0C30 mc Subq+48 0:$39E0 d15:data:reset=0:$45F6 mc Dup 0:$39E1 d15:data:reset=0:$18FB mc Lget+251 0:$39E2 d15:data:reset=0:$482D mc Count 0:$39E3 d15:data:reset=0:$46CC mc Ult 0:$39E4 d15:data:reset=0:$0611 mc BraIf0+17 0:$39E5 d15:data:reset=0:$18FA mc Lget+250 0:$39E6 d15:data:reset=0:$18FC mc Lget+252 0:$39E7 d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$39E8 d15:data:reset=0:$4667 mc Retain 0:$39E9 d15:data:reset=0:$161C mc Gset+stdin 0:$39EA d15:data:reset=0:$18FC mc Lget+252 0:$39EB d15:data:reset=0:$18FF mc Lget+255 0:$39EC d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$39ED d15:data:reset=0:$4667 mc Retain 0:$39EE d15:data:reset=0:$161D mc Gset+stdout 0:$39EF d15:data:reset=0:$18FC mc Lget+252 0:$39F0 d15:data:reset=0:$18FF mc Lget+255 0:$39F1 d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$39F2 d15:data:reset=0:$4667 mc Retain 0:$39F3 d15:data:reset=0:$161E mc Gset+stderr 0:$39F4 d15:data:reset=0:$5F32 mc MDrop0-2 0:$39F5 d15:data:reset=0:$0207 mc Bra+7 0:$39F6 d15:data:reset=0:$5F33 mc MDrop0-1 0:$39F7 d15:data:reset=0:$45F6 mc Dup 0:$39F8 d15:data:reset=0:$18FB mc Lget+251 0:$39F9 d15:data:reset=0:$18FC mc Lget+252 0:$39FA d15:data:reset=0:$5E87 mc AtIndexPoke 0:$39FB d15:data:reset=0:$5F33 mc MDrop0-1 0:$39FC d15:data:reset=0:$01BD mc Bra-67 0:$39FD d15:data:reset=0:$5F32 mc MDrop0-2 0:$39FE d15:data:reset=0:$4581 mc DropStr 0:$39FF d15:data:reset=0:$4581 mc DropStr 0:$3A00 d15:data:reset=0:$4581 mc DropStr 0:$3A01 d15:data:reset=0:$5FFB mc MDrop0_Next-1 // --- file: "dev.asm" --- #include "FD.cc" // +++ file: "FD.asm" +++ // K1-16/16 Microcode // 2015-12-22 16:10:39 : implicit__FD__kill__8ucs2charAEAE_8ucs2charAEAE ( str_AE -- str_AE ) Millicoded // Size: 12 microcodes 0:$2004 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$2005 0:data:reset=0:$6008 0:$2006 0:000011:A1=A0:D0=D0 jp millicoded // * Millicoded 0:$2007 d15:data:reset=0:$5F70 0:$2008 d15:data:reset=0:$45F6 mc Dup 0:$2009 d15:data:reset=0:$473D mc ForAllItems 0:$200A d15:data:reset=0:$0202 mc Bra+2 0:$200B d15:data:reset=0:$5AC5 mc Peek 0:$200C d15:data:reset=0:$4581 mc DropStr 0:$200D d15:data:reset=0:$43ED mc mmNextItem 0:$200E d15:data:reset=0:$01FC mc Bra-4 0:$200F d15:data:reset=0:$5ACD mc Ret : implicit__FD__kill__2FD_2FD ( FD -- FD ) Millicoded // Size: 8 microcodes 0:$1DF8 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$1DF9 0:data:reset=0:$5DFC 0:$1DFA 0:000011:A1=A5:D0=D0 jp millicoded // * Millicoded 0:$1DFB d15:data:reset=0:$5F70 0:$1DFC d15:data:reset=0:$45F6 mc Dup 0:$1DFD d15:data:reset=0:$1D01 mc ItemGet+1 0:$1DFE d15:data:reset=0:$4581 mc DropStr 0:$1DFF d15:data:reset=0:$5ACD mc Ret : implicit__FD__shrink__2FDAEC_6uint16_ ( FDs¢, uint16 ) Millicoded // Size: 16 microcodes 0:$22C0 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$22C1 0:data:reset=0:$62C4 0:$22C2 0:000011:A1=A2:D0=D0 jp millicoded // * Millicoded 0:$22C3 d15:data:reset=0:$5F70 0:$22C4 d15:data:reset=0:$45EA mc Dup2 0:$22C5 d15:data:reset=0:$60CC mc MidStr2 0:$22C6 d15:data:reset=0:$5E6C mc ForRange 0:$22C7 d15:data:reset=0:$0204 mc Bra+4 0:$22C8 d15:data:reset=0:$5C30 mc Peek_Clear 0:$22C9 d15:data:reset=0:$46BA mc CallKill 0:$22CA d15:data:reset=0:$5DF8 mc implicit__FD__kill__2FD_2FD 0:$22CB d15:data:reset=0:$4581 mc DropStr 0:$22CC d15:data:reset=0:$43ED mc mmNextItem 0:$22CD d15:data:reset=0:$01FA mc Bra-6 0:$22CE d15:data:reset=0:$47BA mc ShrinkStr 0:$22CF d15:data:reset=0:$5ACD mc Ret : FD__isrootdir__2FDC_4bool ( FD¢ -- bool ) Millicoded // Size: 24 microcodes 0:$26B0 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$26B1 0:data:reset=0:$66B4 0:$26B2 0:000011:A1=A6:D0=D0 jp millicoded // * Millicoded 0:$26B3 d15:data:reset=0:$5F70 0:$26B4 d15:data:reset=0:$45F6 mc Dup 0:$26B5 d15:data:reset=0:$47E5 mc And0 0:$26B6 d15:data:reset=0:$0204 mc Bra+4 0:$26B7 d15:data:reset=0:$45F6 mc Dup 0:$26B8 d15:data:reset=0:$1D00 mc ItemGet+0 0:$26B9 d15:data:reset=0:$0D01 mc Int8+1 0:$26BA d15:data:reset=0:$47DF mc Eq 0:$26BB d15:data:reset=0:$47E5 mc And0 0:$26BC d15:data:reset=0:$0203 mc Bra+3 0:$26BD d15:data:reset=0:$45F6 mc Dup 0:$26BE d15:data:reset=0:$1D02 mc ItemGet+2 0:$26BF d15:data:reset=0:$4837 mc Bool 0:$26C0 d15:data:reset=0:$47E5 mc And0 0:$26C1 d15:data:reset=0:$0205 mc Bra+5 0:$26C2 d15:data:reset=0:$45F6 mc Dup 0:$26C3 d15:data:reset=0:$1D02 mc ItemGet+2 0:$26C4 d15:data:reset=0:$1D00 mc ItemGet+0 0:$26C5 d15:data:reset=0:$0D00 mc Int8+0 0:$26C6 d15:data:reset=0:$47DF mc Eq 0:$26C7 d15:data:reset=0:$6310 mc MNip0_Next-1 : FD__contains__2FDC_2FDC_4bool ( FD¢, FD¢ -- bool ) Millicoded // Size: 18 microcodes 0:$241D 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$241E 0:data:reset=0:$6421 0:$241F 0:000011:A1=A4:D0=D0 jp millicoded // * Millicoded 0:$2420 d15:data:reset=0:$5F70 0:$2421 d15:data:reset=0:$45F6 mc Dup 0:$2422 d15:data:reset=0:$0608 mc BraIf0+8 0:$2423 d15:data:reset=0:$45F6 mc Dup 0:$2424 d15:data:reset=0:$18FE mc Lget+254 0:$2425 d15:data:reset=0:$47DF mc Eq 0:$2426 d15:data:reset=0:$0404 mc BraIf1+4 0:$2427 d15:data:reset=0:$45F6 mc Dup 0:$2428 d15:data:reset=0:$1D02 mc ItemGet+2 0:$2429 d15:data:reset=0:$5F29 mc Nip 0:$242A d15:data:reset=0:$01F6 mc Bra-10 0:$242B d15:data:reset=0:$45F6 mc Dup 0:$242C d15:data:reset=0:$18FE mc Lget+254 0:$242D d15:data:reset=0:$47DF mc Eq 0:$242E d15:data:reset=0:$630F mc MNip0_Next-2 : FD__entries__2FDC_8ucs2charAEAE ( FD¢ -- str_AE ) Millicoded // Size: 24 microcodes 0:$3B05 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$3B06 0:data:reset=0:$7B09 0:$3B07 0:000011:A1=A3:D0=D0 jp millicoded // * Millicoded 0:$3B08 d15:data:reset=0:$5F70 0:$3B09 d15:data:reset=0:$45F6 mc Dup 0:$3B0A d15:data:reset=0:$1D00 mc ItemGet+0 0:$3B0B d15:data:reset=0:$0D01 mc Int8+1 0:$3B0C d15:data:reset=0:$47DF mc Eq 0:$3B0D d15:data:reset=0:$0603 mc BraIf0+3 0:$3B0E d15:data:reset=0:$45F6 mc Dup 0:$3B0F d15:data:reset=0:$7B05 mc FD__entries__2FDC_8ucs2charAEAE 0:$3B10 d15:data:reset=0:$020B mc Bra+11 0:$3B11 d15:data:reset=0:$45F6 mc Dup 0:$3B12 d15:data:reset=0:$1D00 mc ItemGet+0 0:$3B13 d15:data:reset=0:$0D00 mc Int8+0 0:$3B14 d15:data:reset=0:$47DF mc Eq 0:$3B15 d15:data:reset=0:$0603 mc BraIf0+3 0:$3B16 d15:data:reset=0:$45F6 mc Dup 0:$3B17 d15:data:reset=0:$69B8 mc Node__entries__4NodeC_8ucs2charAEAE 0:$3B18 d15:data:reset=0:$0203 mc Bra+3 0:$3B19 d15:data:reset=0:$0D06 mc Int8+6 0:$3B1A d15:data:reset=0:$1622 mc Gset+errno 0:$3B1B d15:data:reset=0:$0D00 mc Int8+0 0:$3B1C d15:data:reset=0:$6310 mc MNip0_Next-1 : FD__find__2FDC_8ucs2charAEC_2FD ( FD¢, ucs2str¢ -- FD ) Millicoded // Size: 18 microcodes 0:$23DC 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$23DD 0:data:reset=0:$63E0 0:$23DE 0:000011:A1=A3:D0=D0 jp millicoded // * Millicoded 0:$23DF d15:data:reset=0:$5F70 0:$23E0 d15:data:reset=0:$18FF mc Lget+255 0:$23E1 d15:data:reset=0:$1D00 mc ItemGet+0 0:$23E2 d15:data:reset=0:$0D00 mc Int8+0 0:$23E3 d15:data:reset=0:$47DF mc Eq 0:$23E4 d15:data:reset=0:$0605 mc BraIf0+5 0:$23E5 d15:data:reset=0:$18FF mc Lget+255 0:$23E6 d15:data:reset=0:$18FF mc Lget+255 0:$23E7 d15:data:reset=0:$6698 mc Node__find__4NodeC_8ucs2charAEC_2FDC 0:$23E8 d15:data:reset=0:$4667 mc Retain 0:$23E9 d15:data:reset=0:$0203 mc Bra+3 0:$23EA d15:data:reset=0:$0D06 mc Int8+6 0:$23EB d15:data:reset=0:$1622 mc Gset+errno 0:$23EC d15:data:reset=0:$0D00 mc Int8+0 0:$23ED d15:data:reset=0:$630F mc MNip0_Next-2 : FD__getctl__2FDC_6uint16_6uint16 ( FD¢, uint16 -- uint16 ) Millicoded // Size: 21 microcodes 0:$259D 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$259E 0:data:reset=0:$65A1 0:$259F 0:000011:A1=A5:D0=D0 jp millicoded // * Millicoded 0:$25A0 d15:data:reset=0:$5F70 0:$25A1 d15:data:reset=0:$18FF mc Lget+255 0:$25A2 d15:data:reset=0:$1D00 mc ItemGet+0 0:$25A3 d15:data:reset=0:$0905 mc Switch+5 0:$25A4 d15:data:reset=0:$0205 mc Bra+5 0:$25A5 d15:data:reset=0:$020A mc Bra+10 0:$25A6 d15:data:reset=0:$0209 mc Bra+9 0:$25A7 d15:data:reset=0:$0204 mc Bra+4 0:$25A8 d15:data:reset=0:$0203 mc Bra+3 0:$25A9 d15:data:reset=0:$0206 mc Bra+6 0:$25AA d15:data:reset=0:$0D00 mc Int8+0 0:$25AB d15:data:reset=0:$0205 mc Bra+5 0:$25AC d15:data:reset=0:$18FF mc Lget+255 0:$25AD d15:data:reset=0:$18FF mc Lget+255 0:$25AE d15:data:reset=0:$6852 mc Device__getctl__6DeviceC_6uint16_6uint16 0:$25AF d15:data:reset=0:$0201 mc Bra+1 0:$25B0 d15:data:reset=0:$0D00 mc Int8+0 0:$25B1 d15:data:reset=0:$630F mc MNip0_Next-2 : FD__setctl__2FDC_6uint16_6uint16_ ( FD¢, uint16, uint16 ) Millicoded // Size: 19 microcodes 0:$2479 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$247A 0:data:reset=0:$647D 0:$247B 0:000011:A1=A4:D0=D0 jp millicoded // * Millicoded 0:$247C d15:data:reset=0:$5F70 0:$247D d15:data:reset=0:$18FE mc Lget+254 0:$247E d15:data:reset=0:$1D00 mc ItemGet+0 0:$247F d15:data:reset=0:$0905 mc Switch+5 0:$2480 d15:data:reset=0:$020A mc Bra+10 0:$2481 d15:data:reset=0:$0209 mc Bra+9 0:$2482 d15:data:reset=0:$0208 mc Bra+8 0:$2483 d15:data:reset=0:$0203 mc Bra+3 0:$2484 d15:data:reset=0:$0202 mc Bra+2 0:$2485 d15:data:reset=0:$0205 mc Bra+5 0:$2486 d15:data:reset=0:$0204 mc Bra+4 0:$2487 d15:data:reset=0:$18FE mc Lget+254 0:$2488 d15:data:reset=0:$18FE mc Lget+254 0:$2489 d15:data:reset=0:$18FE mc Lget+254 0:$248A d15:data:reset=0:$675E mc Device__setctl__6DeviceC_6uint16_6uint16_ 0:$248B d15:data:reset=0:$5FF9 mc MDrop0_Next-3 : FD__ioblocks__2FDC_6uint32_6uint16AEC_6uint16_6uint16_4bool_4bool_ ( FD¢, uint32, uint16[]¢, uint16, uint16, bool, bool ) Millicoded // Size: 22 microcodes 0:$25B2 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$25B3 0:data:reset=0:$65B6 0:$25B4 0:000011:A1=A5:D0=D0 jp millicoded // * Millicoded 0:$25B5 d15:data:reset=0:$5F70 0:$25B6 d15:data:reset=0:$0D11 mc Int8+17 0:$25B7 d15:data:reset=0:$1622 mc Gset+errno 0:$25B8 d15:data:reset=0:$18F9 mc Lget+249 0:$25B9 d15:data:reset=0:$1D00 mc ItemGet+0 0:$25BA d15:data:reset=0:$0C03 mc Subq+3 0:$25BB d15:data:reset=0:$0901 mc Switch+1 0:$25BC d15:data:reset=0:$0201 mc Bra+1 0:$25BD d15:data:reset=0:$0209 mc Bra+9 0:$25BE d15:data:reset=0:$18F9 mc Lget+249 0:$25BF d15:data:reset=0:$07F9 mc Lvar+249 0:$25C0 d15:data:reset=0:$5CD6 mc Peek2 0:$25C1 d15:data:reset=0:$18F9 mc Lget+249 0:$25C2 d15:data:reset=0:$18F9 mc Lget+249 0:$25C3 d15:data:reset=0:$18F9 mc Lget+249 0:$25C4 d15:data:reset=0:$18F9 mc Lget+249 0:$25C5 d15:data:reset=0:$18F9 mc Lget+249 0:$25C6 d15:data:reset=0:$7C7D mc BlockDevice__ioblocks__11BlockDeviceC_6uint32_6uint16AEC_6uint16_6uint16_4bool_4bool_ 0:$25C7 d15:data:reset=0:$5FF4 mc MDrop0_Next-8 : FD__writeblocks8__2FDC_6uint32_6uint16AEC_6uint16_6uint16_ ( FD¢, uint32, uint16[]¢, uint16, uint16 ) // ioblocks(fd,startblock, data, a, e, no, yes); 0:$1E43 0:000011:A5=A5:D3=DD psh alu 0:$1E44 0:000011:A1=A5:D1=D8 0:$1E45 0:000001:A1=A5:D8=D8 xor alu 0:$1E46 0:000011:A5=A5:D3=D8 psh alu 0:$1E47 0:000011:A1=A5:D1=D8 0:$1E48 0:000100:A1=A5:D8=D8 add_c alu // nodelay 0:$1E49 0:000011:A1=A5:D0=D0 jp FD__ioblocks__2FDC_6uint32_6uint16AEC_6uint16_6uint16_4bool_4bool_ 0:$1E4A d15:data:reset=0:$65B2 : FD__readblocks8__2FDC_6uint32_6uint16AEC_6uint16_6uint16_ ( FD¢, uint32, uint16[]¢, uint16, uint16 ) // ioblocks(fd,startblock,data,a,e,no,no); 0:$1CB3 0:000011:A5=A5:D3=D8 psh alu 0:$1CB4 0:000011:A1=A5:D1=D8 0:$1CB5 0:000001:A1=A5:D8=D8 xor alu 0:$1CB6 0:000011:A5=A5:D3=D8 psh alu 0:$1CB7 0:000011:A1=A5:D1=D8 0:$1CB8 0:000011:A1=A5:D0=D0 jp FD__ioblocks__2FDC_6uint32_6uint16AEC_6uint16_6uint16_4bool_4bool_ 0:$1CB9 d15:data:reset=0:$65B2 : FD__writeblocks16__2FDC_6uint32_6uint16AEC_6uint16_6uint16_ ( FD¢, uint32, uint16[]¢, uint16, uint16 ) // ioblocks(fd,startblock,data,a,e,yes,yes); 0:$1DE8 0:000011:A5=A5:D3=D8 psh alu 0:$1DE9 0:000011:A1=A5:D1=D8 0:$1DEA 0:000011:A1=A5:D8=D0 ld alu,1 0:$1DEB 0:data:reset=0:$0001 0:$1DEC 0:000011:A5=A5:D3=D8 psh alu 0:$1DED 0:000011:A1=A5:D1=D8 0:$1DEE 0:000011:A1=A5:D0=D0 jp FD__ioblocks__2FDC_6uint32_6uint16AEC_6uint16_6uint16_4bool_4bool_ 0:$1DEF d15:data:reset=0:$65B2 : FD__readblocks16__2FDC_6uint32_6uint16AEC_6uint16_6uint16_ ( FD¢, uint32, uint16[]¢, uint16, uint16 ) // ioblocks(fd,startblock,data,a,e,yes,no); 0:$1E13 0:000011:A5=A5:D3=D8 psh alu 0:$1E14 0:000011:A1=A5:D1=D8 0:$1E15 0:000011:A5=A5:D3=D8 psh 1 0:$1E16 0:000011:A1=A5:D1=D0 0:$1E17 0:data:reset=0:$0001 0:$1E18 0:000001:A1=A0:D8=D8 xor alu 0:$1E19 0:000011:A1=A0:D0=D0 jp FD__ioblocks__2FDC_6uint32_6uint16AEC_6uint16_6uint16_4bool_4bool_ 0:$1E1A d15:data:reset=0:$65B2 : FD__getavail__2FDC_6uint16 ( FD¢ -- uint16 ) Millicoded // Size: 15 microcodes 0:$2265 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$2266 0:data:reset=0:$6269 0:$2267 0:000011:A1=A2:D0=D0 jp millicoded // * Millicoded 0:$2268 d15:data:reset=0:$5F70 0:$2269 d15:data:reset=0:$45F6 mc Dup 0:$226A d15:data:reset=0:$1D00 mc ItemGet+0 0:$226B d15:data:reset=0:$0C04 mc Subq+4 0:$226C d15:data:reset=0:$0901 mc Switch+1 0:$226D d15:data:reset=0:$0201 mc Bra+1 0:$226E d15:data:reset=0:$0203 mc Bra+3 0:$226F d15:data:reset=0:$45F6 mc Dup 0:$2270 d15:data:reset=0:$5C60 mc SerialDevice__getavail__12SerialDeviceC_6uint16 0:$2271 d15:data:reset=0:$0201 mc Bra+1 0:$2272 d15:data:reset=0:$0D00 mc Int8+0 0:$2273 d15:data:reset=0:$6310 mc MNip0_Next-1 : FD__getfree__2FDC_6uint16 ( FD¢ -- uint16 ) Millicoded // Size: 15 microcodes 0:$2274 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$2275 0:data:reset=0:$6278 0:$2276 0:000011:A1=A2:D0=D0 jp millicoded // * Millicoded 0:$2277 d15:data:reset=0:$5F70 0:$2278 d15:data:reset=0:$45F6 mc Dup 0:$2279 d15:data:reset=0:$1D00 mc ItemGet+0 0:$227A d15:data:reset=0:$0C04 mc Subq+4 0:$227B d15:data:reset=0:$0901 mc Switch+1 0:$227C d15:data:reset=0:$0201 mc Bra+1 0:$227D d15:data:reset=0:$0203 mc Bra+3 0:$227E d15:data:reset=0:$45F6 mc Dup 0:$227F d15:data:reset=0:$5C66 mc SerialDevice__getfree__12SerialDeviceC_6uint16 0:$2280 d15:data:reset=0:$0201 mc Bra+1 0:$2281 d15:data:reset=0:$0D00 mc Int8+0 0:$2282 d15:data:reset=0:$6310 mc MNip0_Next-1 : FD__readbyte__2FDC_6uint16 ( FD¢ -- uint16 ) Millicoded // Size: 44 microcodes 0:$2BBF 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$2BC0 0:data:reset=0:$6BC3 0:$2BC1 0:000011:A1=A3:D0=D0 jp millicoded // * Millicoded 0:$2BC2 d15:data:reset=0:$5F70 0:$2BC3 d15:data:reset=0:$45F6 mc Dup 0:$2BC4 d15:data:reset=0:$1D00 mc ItemGet+0 0:$2BC5 d15:data:reset=0:$0C04 mc Subq+4 0:$2BC6 d15:data:reset=0:$0901 mc Switch+1 0:$2BC7 d15:data:reset=0:$0201 mc Bra+1 0:$2BC8 d15:data:reset=0:$0203 mc Bra+3 0:$2BC9 d15:data:reset=0:$45F6 mc Dup 0:$2BCA d15:data:reset=0:$65DE mc SerialDevice__readbyte__12SerialDeviceC_6uint16 0:$2BCB d15:data:reset=0:$021E mc Bra+30 0:$2BCC d15:data:reset=0:$0F09 mc Istr+9 0:$2BCD 0:data:reset=0:$006E dm 'n' 0:$2BCE 0:data:reset=0:$006F dm 'o' 0:$2BCF 0:data:reset=0:$0064 dm 'd' 0:$2BD0 0:data:reset=0:$0065 dm 'e' 0:$2BD1 0:data:reset=0:$0074 dm 't' 0:$2BD2 0:data:reset=0:$0079 dm 'y' 0:$2BD3 0:data:reset=0:$0070 dm 'p' 0:$2BD4 0:data:reset=0:$0065 dm 'e' 0:$2BD5 0:data:reset=0:$0028 dm '(' 0:$2BD6 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$2BD7 d15:data:reset=0:$18FF mc Lget+255 0:$2BD8 d15:data:reset=0:$1D01 mc ItemGet+1 0:$2BD9 d15:data:reset=0:$6A1F mc catstr__8ucs2charAE_8ucs2charAEC_8ucs2charAE 0:$2BDA d15:data:reset=0:$0F02 mc Istr+2 0:$2BDB 0:data:reset=0:$0029 dm ')' 0:$2BDC 0:data:reset=0:$003D dm '=' 0:$2BDD 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$2BDE d15:data:reset=0:$5A61 mc DupToR 0:$2BDF d15:data:reset=0:$6A1F mc catstr__8ucs2charAE_8ucs2charAEC_8ucs2charAE 0:$2BE0 d15:data:reset=0:$18FF mc Lget+255 0:$2BE1 d15:data:reset=0:$1D00 mc ItemGet+0 0:$2BE2 d15:data:reset=0:$6453 mc NumStrU 0:$2BE3 d15:data:reset=0:$6AAF mc CatStrStr 0:$2BE4 d15:data:reset=0:$5F9C mc FromR 0:$2BE5 d15:data:reset=0:$4581 mc DropStr 0:$2BE6 d15:data:reset=0:$64EC mc abort__8ucs2charAE_ 0:$2BE7 d15:data:reset=0:$0D11 mc Int8+17 0:$2BE8 d15:data:reset=0:$1622 mc Gset+errno 0:$2BE9 d15:data:reset=0:$0D00 mc Int8+0 0:$2BEA d15:data:reset=0:$6310 mc MNip0_Next-1 : FD__writebyte__2FDC_6uint16_ ( FD¢, uint16 ) Millicoded // Size: 16 microcodes 0:$22D0 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$22D1 0:data:reset=0:$62D4 0:$22D2 0:000011:A1=A2:D0=D0 jp millicoded // * Millicoded 0:$22D3 d15:data:reset=0:$5F70 0:$22D4 d15:data:reset=0:$0D11 mc Int8+17 0:$22D5 d15:data:reset=0:$1622 mc Gset+errno 0:$22D6 d15:data:reset=0:$18FF mc Lget+255 0:$22D7 d15:data:reset=0:$1D00 mc ItemGet+0 0:$22D8 d15:data:reset=0:$0C04 mc Subq+4 0:$22D9 d15:data:reset=0:$0901 mc Switch+1 0:$22DA d15:data:reset=0:$0201 mc Bra+1 0:$22DB d15:data:reset=0:$0203 mc Bra+3 0:$22DC d15:data:reset=0:$18FF mc Lget+255 0:$22DD d15:data:reset=0:$18FF mc Lget+255 0:$22DE d15:data:reset=0:$6650 mc SerialDevice__writebyte__12SerialDeviceC_6uint16_ 0:$22DF d15:data:reset=0:$5FFA mc MDrop0_Next-2 : FD__read2bytes__2FDC_6uint32 ( FD¢ -- uint32 ) Millicoded // Size: 17 microcodes 0:$2397 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$2398 0:data:reset=0:$639B 0:$2399 0:000011:A1=A3:D0=D0 jp millicoded // * Millicoded 0:$239A d15:data:reset=0:$5F70 0:$239B d15:data:reset=0:$45F6 mc Dup 0:$239C d15:data:reset=0:$1D03 mc ItemGet+3 0:$239D d15:data:reset=0:$0603 mc BraIf0+3 0:$239E d15:data:reset=0:$45F6 mc Dup 0:$239F d15:data:reset=0:$6522 mc FD__read__2FDC_6uint32 0:$23A0 d15:data:reset=0:$0203 mc Bra+3 0:$23A1 d15:data:reset=0:$45F6 mc Dup 0:$23A2 d15:data:reset=0:$650E mc FD__read__2FDC_6uint16 0:$23A3 d15:data:reset=0:$5B75 mc Cast_uL 0:$23A4 d15:data:reset=0:$5FA4 mc ToR2 0:$23A5 d15:data:reset=0:$5F33 mc MDrop0-1 0:$23A6 d15:data:reset=0:$5F99 mc FromR2 0:$23A7 d15:data:reset=0:$5ACD mc Ret : FD__write2bytes__2FDC_6uint32_ ( FD¢, uint32 ) Millicoded // Size: 16 microcodes 0:$22E0 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$22E1 0:data:reset=0:$62E4 0:$22E2 0:000011:A1=A2:D0=D0 jp millicoded // * Millicoded 0:$22E3 d15:data:reset=0:$5F70 0:$22E4 d15:data:reset=0:$18FE mc Lget+254 0:$22E5 d15:data:reset=0:$1D03 mc ItemGet+3 0:$22E6 d15:data:reset=0:$0605 mc BraIf0+5 0:$22E7 d15:data:reset=0:$18FE mc Lget+254 0:$22E8 d15:data:reset=0:$07FE mc Lvar+254 0:$22E9 d15:data:reset=0:$5CD6 mc Peek2 0:$22EA d15:data:reset=0:$60A5 mc FD__write__2FDC_6uint32_ 0:$22EB d15:data:reset=0:$0203 mc Bra+3 0:$22EC d15:data:reset=0:$18FE mc Lget+254 0:$22ED d15:data:reset=0:$18FF mc Lget+255 0:$22EE d15:data:reset=0:$63CA mc FD__write__2FDC_6uint16_ 0:$22EF d15:data:reset=0:$5FF9 mc MDrop0_Next-3 : FD__readbytes__2FDC_6uint16AEC_ ( FD¢, uint16[]¢ ) Millicoded // Size: 16 microcodes 0:$2315 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$2316 0:data:reset=0:$6319 0:$2317 0:000011:A1=A3:D0=D0 jp millicoded // * Millicoded 0:$2318 d15:data:reset=0:$5F70 0:$2319 d15:data:reset=0:$0D11 mc Int8+17 0:$231A d15:data:reset=0:$1622 mc Gset+errno 0:$231B d15:data:reset=0:$18FF mc Lget+255 0:$231C d15:data:reset=0:$1D00 mc ItemGet+0 0:$231D d15:data:reset=0:$0C04 mc Subq+4 0:$231E d15:data:reset=0:$0901 mc Switch+1 0:$231F d15:data:reset=0:$0201 mc Bra+1 0:$2320 d15:data:reset=0:$0203 mc Bra+3 0:$2321 d15:data:reset=0:$18FF mc Lget+255 0:$2322 d15:data:reset=0:$18FF mc Lget+255 0:$2323 d15:data:reset=0:$6C70 mc SerialDevice__readbytes__12SerialDeviceC_6uint16AEC_ 0:$2324 d15:data:reset=0:$5FFA mc MDrop0_Next-2 : FD__writebytes__2FDC_6uint16AEC_ ( FD¢, uint16[]¢ ) Millicoded // Size: 16 microcodes 0:$22F0 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$22F1 0:data:reset=0:$62F4 0:$22F2 0:000011:A1=A2:D0=D0 jp millicoded // * Millicoded 0:$22F3 d15:data:reset=0:$5F70 0:$22F4 d15:data:reset=0:$0D11 mc Int8+17 0:$22F5 d15:data:reset=0:$1622 mc Gset+errno 0:$22F6 d15:data:reset=0:$18FF mc Lget+255 0:$22F7 d15:data:reset=0:$1D00 mc ItemGet+0 0:$22F8 d15:data:reset=0:$0C04 mc Subq+4 0:$22F9 d15:data:reset=0:$0901 mc Switch+1 0:$22FA d15:data:reset=0:$0201 mc Bra+1 0:$22FB d15:data:reset=0:$0203 mc Bra+3 0:$22FC d15:data:reset=0:$18FF mc Lget+255 0:$22FD d15:data:reset=0:$18FF mc Lget+255 0:$22FE d15:data:reset=0:$6C43 mc SerialDevice__writebytes__12SerialDeviceC_6uint16AEC_ 0:$22FF d15:data:reset=0:$5FFA mc MDrop0_Next-2 : FD__readdata__2FDC_6uint16AEC_ ( FD¢, uint16[]¢ ) Millicoded // Size: 16 microcodes 0:$22B0 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$22B1 0:data:reset=0:$62B4 0:$22B2 0:000011:A1=A2:D0=D0 jp millicoded // * Millicoded 0:$22B3 d15:data:reset=0:$5F70 0:$22B4 d15:data:reset=0:$0D11 mc Int8+17 0:$22B5 d15:data:reset=0:$1622 mc Gset+errno 0:$22B6 d15:data:reset=0:$18FF mc Lget+255 0:$22B7 d15:data:reset=0:$1D00 mc ItemGet+0 0:$22B8 d15:data:reset=0:$0C04 mc Subq+4 0:$22B9 d15:data:reset=0:$0901 mc Switch+1 0:$22BA d15:data:reset=0:$0201 mc Bra+1 0:$22BB d15:data:reset=0:$0203 mc Bra+3 0:$22BC d15:data:reset=0:$18FF mc Lget+255 0:$22BD d15:data:reset=0:$18FF mc Lget+255 0:$22BE d15:data:reset=0:$6BEB mc SerialDevice__readdata__12SerialDeviceC_6uint16AEC_ 0:$22BF d15:data:reset=0:$5FFA mc MDrop0_Next-2 : FD__writedata__2FDC_6uint16AEC_ ( FD¢, uint16[]¢ ) Millicoded // Size: 16 microcodes 0:$2335 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$2336 0:data:reset=0:$6339 0:$2337 0:000011:A1=A3:D0=D0 jp millicoded // * Millicoded 0:$2338 d15:data:reset=0:$5F70 0:$2339 d15:data:reset=0:$0D11 mc Int8+17 0:$233A d15:data:reset=0:$1622 mc Gset+errno 0:$233B d15:data:reset=0:$18FF mc Lget+255 0:$233C d15:data:reset=0:$1D00 mc ItemGet+0 0:$233D d15:data:reset=0:$0C04 mc Subq+4 0:$233E d15:data:reset=0:$0901 mc Switch+1 0:$233F d15:data:reset=0:$0201 mc Bra+1 0:$2340 d15:data:reset=0:$0203 mc Bra+3 0:$2341 d15:data:reset=0:$18FF mc Lget+255 0:$2342 d15:data:reset=0:$18FF mc Lget+255 0:$2343 d15:data:reset=0:$6C17 mc SerialDevice__writedata__12SerialDeviceC_6uint16AEC_ 0:$2344 d15:data:reset=0:$5FFA mc MDrop0_Next-2 : FD__read15__2FDC_6uint16 ( FD¢ -- uint16 ) Millicoded // Size: 24 microcodes 0:$2668 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$2669 0:data:reset=0:$666C 0:$266A 0:000011:A1=A6:D0=D0 jp millicoded // * Millicoded 0:$266B d15:data:reset=0:$5F70 0:$266C d15:data:reset=0:$45F6 mc Dup 0:$266D d15:data:reset=0:$6BBF mc FD__readbyte__2FDC_6uint16 0:$266E d15:data:reset=0:$45F6 mc Dup 0:$266F d15:data:reset=0:$0D80 mc Int8+128 0:$2670 d15:data:reset=0:$46CC mc Ult 0:$2671 d15:data:reset=0:$47F1 mc Or1 0:$2672 d15:data:reset=0:$0202 mc Bra+2 0:$2673 d15:data:reset=0:$18FF mc Lget+255 0:$2674 d15:data:reset=0:$1D03 mc ItemGet+3 0:$2675 d15:data:reset=0:$0602 mc BraIf0+2 0:$2676 d15:data:reset=0:$45F6 mc Dup 0:$2677 d15:data:reset=0:$0207 mc Bra+7 0:$2678 d15:data:reset=0:$45F6 mc Dup 0:$2679 d15:data:reset=0:$0D7F mc Int8+127 0:$267A d15:data:reset=0:$5A0F mc And 0:$267B d15:data:reset=0:$5AE5 mc SwapBytes 0:$267C d15:data:reset=0:$18FE mc Lget+254 0:$267D d15:data:reset=0:$6BBF mc FD__readbyte__2FDC_6uint16 0:$267E d15:data:reset=0:$5A12 mc Or 0:$267F d15:data:reset=0:$630F mc MNip0_Next-2 : FD__write15__2FDC_6uint16_ ( FD¢, uint16 ) Millicoded // Size: 26 microcodes 0:$2778 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$2779 0:data:reset=0:$677C 0:$277A 0:000011:A1=A7:D0=D0 jp millicoded // * Millicoded 0:$277B d15:data:reset=0:$5F70 0:$277C d15:data:reset=0:$5F6A mc clear_error 0:$277D d15:data:reset=0:$45F6 mc Dup 0:$277E d15:data:reset=0:$0D7F mc Int8+127 0:$277F d15:data:reset=0:$C6C6 mc Ugt 0:$2780 d15:data:reset=0:$47E5 mc And0 0:$2781 d15:data:reset=0:$0203 mc Bra+3 0:$2782 d15:data:reset=0:$18FF mc Lget+255 0:$2783 d15:data:reset=0:$1D03 mc ItemGet+3 0:$2784 d15:data:reset=0:$4823 mc Not 0:$2785 d15:data:reset=0:$0606 mc BraIf0+6 0:$2786 d15:data:reset=0:$18FF mc Lget+255 0:$2787 d15:data:reset=0:$18FF mc Lget+255 0:$2788 d15:data:reset=0:$5AE5 mc SwapBytes 0:$2789 d15:data:reset=0:$0D80 mc Int8+128 0:$278A d15:data:reset=0:$5A12 mc Or 0:$278B d15:data:reset=0:$62D0 mc FD__writebyte__2FDC_6uint16_ 0:$278C d15:data:reset=0:$9F22 mc Gget+errno 0:$278D d15:data:reset=0:$0403 mc BraIf1+3 0:$278E d15:data:reset=0:$18FF mc Lget+255 0:$278F d15:data:reset=0:$18FF mc Lget+255 0:$2790 d15:data:reset=0:$62D0 mc FD__writebyte__2FDC_6uint16_ 0:$2791 d15:data:reset=0:$5FFA mc MDrop0_Next-2 : FD__read__2FDC_6uint16 ( FD¢ -- uint16 ) Millicoded // Size: 20 microcodes 0:$250E 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$250F 0:data:reset=0:$6512 0:$2510 0:000011:A1=A5:D0=D0 jp millicoded // * Millicoded 0:$2511 d15:data:reset=0:$5F70 0:$2512 d15:data:reset=0:$45F6 mc Dup 0:$2513 d15:data:reset=0:$6BBF mc FD__readbyte__2FDC_6uint16 0:$2514 d15:data:reset=0:$18FF mc Lget+255 0:$2515 d15:data:reset=0:$1D03 mc ItemGet+3 0:$2516 d15:data:reset=0:$47F1 mc Or1 0:$2517 d15:data:reset=0:$0201 mc Bra+1 0:$2518 d15:data:reset=0:$9F22 mc Gget+errno 0:$2519 d15:data:reset=0:$0602 mc BraIf0+2 0:$251A d15:data:reset=0:$45F6 mc Dup 0:$251B d15:data:reset=0:$0205 mc Bra+5 0:$251C d15:data:reset=0:$45F6 mc Dup 0:$251D d15:data:reset=0:$5AE5 mc SwapBytes 0:$251E d15:data:reset=0:$18FE mc Lget+254 0:$251F d15:data:reset=0:$6BBF mc FD__readbyte__2FDC_6uint16 0:$2520 d15:data:reset=0:$5A12 mc Or 0:$2521 d15:data:reset=0:$630F mc MNip0_Next-2 : FD__write__2FDC_6uint16_ ( FD¢, uint16 ) Millicoded // Size: 18 microcodes 0:$23CA 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$23CB 0:data:reset=0:$63CE 0:$23CC 0:000011:A1=A3:D0=D0 jp millicoded // * Millicoded 0:$23CD d15:data:reset=0:$5F70 0:$23CE d15:data:reset=0:$5F6A mc clear_error 0:$23CF d15:data:reset=0:$18FF mc Lget+255 0:$23D0 d15:data:reset=0:$1D03 mc ItemGet+3 0:$23D1 d15:data:reset=0:$0404 mc BraIf1+4 0:$23D2 d15:data:reset=0:$18FF mc Lget+255 0:$23D3 d15:data:reset=0:$18FF mc Lget+255 0:$23D4 d15:data:reset=0:$5AE5 mc SwapBytes 0:$23D5 d15:data:reset=0:$62D0 mc FD__writebyte__2FDC_6uint16_ 0:$23D6 d15:data:reset=0:$9F22 mc Gget+errno 0:$23D7 d15:data:reset=0:$0403 mc BraIf1+3 0:$23D8 d15:data:reset=0:$18FF mc Lget+255 0:$23D9 d15:data:reset=0:$18FF mc Lget+255 0:$23DA d15:data:reset=0:$62D0 mc FD__writebyte__2FDC_6uint16_ 0:$23DB d15:data:reset=0:$5FFA mc MDrop0_Next-2 : FD__read24__2FDC_6uint32 ( FD¢ -- uint32 ) Millicoded // Size: 20 microcodes 0:$254A 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$254B 0:data:reset=0:$654E 0:$254C 0:000011:A1=A5:D0=D0 jp millicoded // * Millicoded 0:$254D d15:data:reset=0:$5F70 0:$254E d15:data:reset=0:$0D00 mc Int8+0 0:$254F d15:data:reset=0:$0D00 mc Int8+0 0:$2550 d15:data:reset=0:$18FE mc Lget+254 0:$2551 d15:data:reset=0:$6BBF mc FD__readbyte__2FDC_6uint16 0:$2552 d15:data:reset=0:$8EFF mc Lset+255 0:$2553 d15:data:reset=0:$9F22 mc Gget+errno 0:$2554 d15:data:reset=0:$0403 mc BraIf1+3 0:$2555 d15:data:reset=0:$18FE mc Lget+254 0:$2556 d15:data:reset=0:$650E mc FD__read__2FDC_6uint16 0:$2557 d15:data:reset=0:$5F29 mc Nip 0:$2558 d15:data:reset=0:$07FF mc Lvar+255 0:$2559 d15:data:reset=0:$5CD6 mc Peek2 0:$255A d15:data:reset=0:$5FA4 mc ToR2 0:$255B d15:data:reset=0:$5F31 mc MDrop0-3 0:$255C d15:data:reset=0:$5F99 mc FromR2 0:$255D d15:data:reset=0:$5ACD mc Ret : FD__write24__2FDC_6uint32_ ( FD¢, uint32 ) Millicoded // Size: 13 microcodes 0:$2098 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$2099 0:data:reset=0:$609C 0:$209A 0:000011:A1=A0:D0=D0 jp millicoded // * Millicoded 0:$209B d15:data:reset=0:$5F70 0:$209C d15:data:reset=0:$18FE mc Lget+254 0:$209D d15:data:reset=0:$18FE mc Lget+254 0:$209E d15:data:reset=0:$62D0 mc FD__writebyte__2FDC_6uint16_ 0:$209F d15:data:reset=0:$9F22 mc Gget+errno 0:$20A0 d15:data:reset=0:$0403 mc BraIf1+3 0:$20A1 d15:data:reset=0:$18FE mc Lget+254 0:$20A2 d15:data:reset=0:$18FF mc Lget+255 0:$20A3 d15:data:reset=0:$63CA mc FD__write__2FDC_6uint16_ 0:$20A4 d15:data:reset=0:$5FF9 mc MDrop0_Next-3 : FD__read__2FDC_6uint32 ( FD¢ -- uint32 ) Millicoded // Size: 20 microcodes 0:$2522 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$2523 0:data:reset=0:$6526 0:$2524 0:000011:A1=A5:D0=D0 jp millicoded // * Millicoded 0:$2525 d15:data:reset=0:$5F70 0:$2526 d15:data:reset=0:$0D00 mc Int8+0 0:$2527 d15:data:reset=0:$0D00 mc Int8+0 0:$2528 d15:data:reset=0:$18FE mc Lget+254 0:$2529 d15:data:reset=0:$650E mc FD__read__2FDC_6uint16 0:$252A d15:data:reset=0:$8EFF mc Lset+255 0:$252B d15:data:reset=0:$9F22 mc Gget+errno 0:$252C d15:data:reset=0:$0403 mc BraIf1+3 0:$252D d15:data:reset=0:$18FE mc Lget+254 0:$252E d15:data:reset=0:$650E mc FD__read__2FDC_6uint16 0:$252F d15:data:reset=0:$5F29 mc Nip 0:$2530 d15:data:reset=0:$07FF mc Lvar+255 0:$2531 d15:data:reset=0:$5CD6 mc Peek2 0:$2532 d15:data:reset=0:$5FA4 mc ToR2 0:$2533 d15:data:reset=0:$5F31 mc MDrop0-3 0:$2534 d15:data:reset=0:$5F99 mc FromR2 0:$2535 d15:data:reset=0:$5ACD mc Ret : FD__write__2FDC_6uint32_ ( FD¢, uint32 ) Millicoded // Size: 13 microcodes 0:$20A5 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$20A6 0:data:reset=0:$60A9 0:$20A7 0:000011:A1=A0:D0=D0 jp millicoded // * Millicoded 0:$20A8 d15:data:reset=0:$5F70 0:$20A9 d15:data:reset=0:$18FE mc Lget+254 0:$20AA d15:data:reset=0:$18FE mc Lget+254 0:$20AB d15:data:reset=0:$63CA mc FD__write__2FDC_6uint16_ 0:$20AC d15:data:reset=0:$9F22 mc Gget+errno 0:$20AD d15:data:reset=0:$0403 mc BraIf1+3 0:$20AE d15:data:reset=0:$18FE mc Lget+254 0:$20AF d15:data:reset=0:$18FF mc Lget+255 0:$20B0 d15:data:reset=0:$63CA mc FD__write__2FDC_6uint16_ 0:$20B1 d15:data:reset=0:$5FF9 mc MDrop0_Next-3 : FD__read__2FDC_7float48 ( FD¢ -- float48 ) Millicoded // Size: 23 microcodes 0:$2622 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$2623 0:data:reset=0:$6626 0:$2624 0:000011:A1=A6:D0=D0 jp millicoded // * Millicoded 0:$2625 d15:data:reset=0:$5F70 0:$2626 d15:data:reset=0:$0D00 mc Int8+0 0:$2627 d15:data:reset=0:$0D00 mc Int8+0 0:$2628 d15:data:reset=0:$0D00 mc Int8+0 0:$2629 d15:data:reset=0:$18FD mc Lget+253 0:$262A d15:data:reset=0:$650E mc FD__read__2FDC_6uint16 0:$262B d15:data:reset=0:$8EFE mc Lset+254 0:$262C d15:data:reset=0:$9F22 mc Gget+errno 0:$262D d15:data:reset=0:$0405 mc BraIf1+5 0:$262E d15:data:reset=0:$18FD mc Lget+253 0:$262F d15:data:reset=0:$6522 mc FD__read__2FDC_6uint32 0:$2630 d15:data:reset=0:$07FC mc Lvar+252 0:$2631 d15:data:reset=0:$0B01 mc Addq+1 0:$2632 d15:data:reset=0:$5E23 mc Poke2 0:$2633 d15:data:reset=0:$07FE mc Lvar+254 0:$2634 d15:data:reset=0:$5F4A mc Peek3 0:$2635 d15:data:reset=0:$5FA1 mc ToR3 0:$2636 d15:data:reset=0:$5F30 mc MDrop0-4 0:$2637 d15:data:reset=0:$5F96 mc FromR3 0:$2638 d15:data:reset=0:$5ACD mc Ret : FD__write__2FDC_7float48_ ( FD¢, float48 ) Millicoded // Size: 15 microcodes 0:$2292 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$2293 0:data:reset=0:$6296 0:$2294 0:000011:A1=A2:D0=D0 jp millicoded // * Millicoded 0:$2295 d15:data:reset=0:$5F70 0:$2296 d15:data:reset=0:$18FD mc Lget+253 0:$2297 d15:data:reset=0:$18FD mc Lget+253 0:$2298 d15:data:reset=0:$63CA mc FD__write__2FDC_6uint16_ 0:$2299 d15:data:reset=0:$9F22 mc Gget+errno 0:$229A d15:data:reset=0:$0405 mc BraIf1+5 0:$229B d15:data:reset=0:$18FD mc Lget+253 0:$229C d15:data:reset=0:$07FD mc Lvar+253 0:$229D d15:data:reset=0:$0B01 mc Addq+1 0:$229E d15:data:reset=0:$5CD6 mc Peek2 0:$229F d15:data:reset=0:$60A5 mc FD__write__2FDC_6uint32_ 0:$22A0 d15:data:reset=0:$5FF8 mc MDrop0_Next-4 : FD__read__2FDC_8ucs2charAE ( FD¢ -- ucs2str ) Millicoded // Size: 19 microcodes 0:$2466 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$2467 0:data:reset=0:$646A 0:$2468 0:000011:A1=A4:D0=D0 jp millicoded // * Millicoded 0:$2469 d15:data:reset=0:$5F70 0:$246A d15:data:reset=0:$45F6 mc Dup 0:$246B d15:data:reset=0:$6668 mc FD__read15__2FDC_6uint16 0:$246C d15:data:reset=0:$4203 mc Alloc 0:$246D d15:data:reset=0:$9F22 mc Gget+errno 0:$246E d15:data:reset=0:$0403 mc BraIf1+3 0:$246F d15:data:reset=0:$18FF mc Lget+255 0:$2470 d15:data:reset=0:$18FF mc Lget+255 0:$2471 d15:data:reset=0:$6315 mc FD__readbytes__2FDC_6uint16AEC_ 0:$2472 d15:data:reset=0:$45F6 mc Dup 0:$2473 d15:data:reset=0:$4667 mc Retain 0:$2474 d15:data:reset=0:$5FA7 mc ToR 0:$2475 d15:data:reset=0:$4581 mc DropStr 0:$2476 d15:data:reset=0:$5F33 mc MDrop0-1 0:$2477 d15:data:reset=0:$5F9C mc FromR 0:$2478 d15:data:reset=0:$5ACD mc Ret : FD__write__2FDC_8ucs2charAEC_ ( FD¢, ucs2str¢ ) Millicoded // Size: 14 microcodes 0:$21D6 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$21D7 0:data:reset=0:$61DA 0:$21D8 0:000011:A1=A1:D0=D0 jp millicoded // * Millicoded 0:$21D9 d15:data:reset=0:$5F70 0:$21DA d15:data:reset=0:$18FF mc Lget+255 0:$21DB d15:data:reset=0:$18FF mc Lget+255 0:$21DC d15:data:reset=0:$482D mc Count 0:$21DD d15:data:reset=0:$6778 mc FD__write15__2FDC_6uint16_ 0:$21DE d15:data:reset=0:$9F22 mc Gget+errno 0:$21DF d15:data:reset=0:$0403 mc BraIf1+3 0:$21E0 d15:data:reset=0:$18FF mc Lget+255 0:$21E1 d15:data:reset=0:$18FF mc Lget+255 0:$21E2 d15:data:reset=0:$62F0 mc FD__writebytes__2FDC_6uint16AEC_ 0:$21E3 d15:data:reset=0:$5FFA mc MDrop0_Next-2 : FD__getstr__2FDC_8ucs2charAE ( FD¢ -- ucs2str ) Millicoded // Size: 18 microcodes 0:$23EE 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$23EF 0:data:reset=0:$63F2 0:$23F0 0:000011:A1=A3:D0=D0 jp millicoded // * Millicoded 0:$23F1 d15:data:reset=0:$5F70 0:$23F2 d15:data:reset=0:$45F6 mc Dup 0:$23F3 d15:data:reset=0:$1D00 mc ItemGet+0 0:$23F4 d15:data:reset=0:$0C04 mc Subq+4 0:$23F5 d15:data:reset=0:$0901 mc Switch+1 0:$23F6 d15:data:reset=0:$0201 mc Bra+1 0:$23F7 d15:data:reset=0:$0203 mc Bra+3 0:$23F8 d15:data:reset=0:$45F6 mc Dup 0:$23F9 d15:data:reset=0:$6D29 mc SerialDevice__getstr__12SerialDeviceC_8ucs2charAE 0:$23FA d15:data:reset=0:$0204 mc Bra+4 0:$23FB d15:data:reset=0:$0D11 mc Int8+17 0:$23FC d15:data:reset=0:$1622 mc Gset+errno 0:$23FD d15:data:reset=0:$0F00 mc Istr+0 0:$23FE 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$23FF d15:data:reset=0:$6310 mc MNip0_Next-1 : FD__putstr__2FDC_8ucs2charAE_ ( FD¢, ucs2str ) Millicoded // Size: 9 microcodes 0:$1E75 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$1E76 0:data:reset=0:$5E79 0:$1E77 0:000011:A1=A6:D0=D0 jp millicoded // * Millicoded 0:$1E78 d15:data:reset=0:$5F70 0:$1E79 d15:data:reset=0:$18FF mc Lget+255 0:$1E7A d15:data:reset=0:$18FF mc Lget+255 0:$1E7B d15:data:reset=0:$62F0 mc FD__writebytes__2FDC_6uint16AEC_ 0:$1E7C d15:data:reset=0:$4581 mc DropStr 0:$1E7D d15:data:reset=0:$5FFB mc MDrop0_Next-1 : Node__entries__4NodeC_8ucs2charAEAE ( Node¢ -- str_AE ) Millicoded // Size: 33 microcodes 0:$29B8 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$29B9 0:data:reset=0:$69BC 0:$29BA 0:000011:A1=A1:D0=D0 jp millicoded // * Millicoded 0:$29BB d15:data:reset=0:$5F70 0:$29BC d15:data:reset=0:$45F6 mc Dup 0:$29BD d15:data:reset=0:$1D04 mc ItemGet+4 0:$29BE d15:data:reset=0:$482D mc Count 0:$29BF d15:data:reset=0:$45F6 mc Dup 0:$29C0 d15:data:reset=0:$4203 mc Alloc 0:$29C1 d15:data:reset=0:$07FF mc Lvar+255 0:$29C2 d15:data:reset=0:$5DD0 mc Peekmm 0:$29C3 d15:data:reset=0:$060C mc BraIf0+12 0:$29C4 d15:data:reset=0:$18FE mc Lget+254 0:$29C5 d15:data:reset=0:$1D04 mc ItemGet+4 0:$29C6 d15:data:reset=0:$18FE mc Lget+254 0:$29C7 d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$29C8 d15:data:reset=0:$1D01 mc ItemGet+1 0:$29C9 d15:data:reset=0:$4667 mc Retain 0:$29CA d15:data:reset=0:$18FF mc Lget+255 0:$29CB d15:data:reset=0:$18FD mc Lget+253 0:$29CC d15:data:reset=0:$5E2E mc AtIndex 0:$29CD d15:data:reset=0:$7A05 mc SwapWithVar 0:$29CE d15:data:reset=0:$4581 mc DropStr 0:$29CF d15:data:reset=0:$01F1 mc Bra-15 0:$29D0 d15:data:reset=0:$45F6 mc Dup 0:$29D1 d15:data:reset=0:$4667 mc Retain 0:$29D2 d15:data:reset=0:$5FA7 mc ToR 0:$29D3 d15:data:reset=0:$46BA mc CallKill 0:$29D4 d15:data:reset=0:$6004 mc implicit__FD__kill__8ucs2charAEAE_8ucs2charAEAE 0:$29D5 d15:data:reset=0:$4581 mc DropStr 0:$29D6 d15:data:reset=0:$5F32 mc MDrop0-2 0:$29D7 d15:data:reset=0:$5F9C mc FromR 0:$29D8 d15:data:reset=0:$5ACD mc Ret : Node__find__4NodeC_8ucs2charAEC_2FDC ( Node¢, ucs2str¢ -- FD¢ ) Millicoded // Size: 24 microcodes 0:$2698 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$2699 0:data:reset=0:$669C 0:$269A 0:000011:A1=A6:D0=D0 jp millicoded // * Millicoded 0:$269B d15:data:reset=0:$5F70 0:$269C d15:data:reset=0:$18FF mc Lget+255 0:$269D d15:data:reset=0:$1D04 mc ItemGet+4 0:$269E d15:data:reset=0:$45F6 mc Dup 0:$269F d15:data:reset=0:$482D mc Count 0:$26A0 d15:data:reset=0:$5BC5 mc PshHP 0:$26A1 d15:data:reset=0:$5DD0 mc Peekmm 0:$26A2 d15:data:reset=0:$060B mc BraIf0+11 0:$26A3 d15:data:reset=0:$18FF mc Lget+255 0:$26A4 d15:data:reset=0:$18FF mc Lget+255 0:$26A5 d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$26A6 d15:data:reset=0:$1D01 mc ItemGet+1 0:$26A7 d15:data:reset=0:$18FD mc Lget+253 0:$26A8 d15:data:reset=0:$41E7 mc Eq_CstrCstr 0:$26A9 d15:data:reset=0:$05F6 mc BraIf0-10 0:$26AA d15:data:reset=0:$18FF mc Lget+255 0:$26AB d15:data:reset=0:$18FF mc Lget+255 0:$26AC d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$26AD d15:data:reset=0:$0201 mc Bra+1 0:$26AE d15:data:reset=0:$0D00 mc Int8+0 0:$26AF d15:data:reset=0:$630D mc MNip0_Next-4 : Node__append__4NodeC_2FD_ ( Node¢, FD ) Millicoded // Size: 16 microcodes 0:$2355 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$2356 0:data:reset=0:$6359 0:$2357 0:000011:A1=A3:D0=D0 jp millicoded // * Millicoded 0:$2358 d15:data:reset=0:$5F70 0:$2359 d15:data:reset=0:$18FF mc Lget+255 0:$235A d15:data:reset=0:$1D04 mc ItemGet+4 0:$235B d15:data:reset=0:$18FF mc Lget+255 0:$235C d15:data:reset=0:$4667 mc Retain 0:$235D d15:data:reset=0:$60D9 mc AppendChar 0:$235E d15:data:reset=0:$18FF mc Lget+255 0:$235F d15:data:reset=0:$18FF mc Lget+255 0:$2360 d15:data:reset=0:$2302 mc ItemSet+2 0:$2361 d15:data:reset=0:$46BA mc CallKill 0:$2362 d15:data:reset=0:$5DF8 mc implicit__FD__kill__2FD_2FD 0:$2363 d15:data:reset=0:$4581 mc DropStr 0:$2364 d15:data:reset=0:$5FFB mc MDrop0_Next-1 : Node__remove__4NodeC_2FDC_ ( Node¢, FD¢ ) Millicoded // Size: 27 microcodes 0:$27C7 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$27C8 0:data:reset=0:$67CB 0:$27C9 0:000011:A1=A7:D0=D0 jp millicoded // * Millicoded 0:$27CA d15:data:reset=0:$5F70 0:$27CB d15:data:reset=0:$18FF mc Lget+255 0:$27CC d15:data:reset=0:$1D04 mc ItemGet+4 0:$27CD d15:data:reset=0:$45F6 mc Dup 0:$27CE d15:data:reset=0:$482D mc Count 0:$27CF d15:data:reset=0:$45F6 mc Dup 0:$27D0 d15:data:reset=0:$5BC5 mc PshHP 0:$27D1 d15:data:reset=0:$5DD0 mc Peekmm 0:$27D2 d15:data:reset=0:$060E mc BraIf0+14 0:$27D3 d15:data:reset=0:$18FE mc Lget+254 0:$27D4 d15:data:reset=0:$18FF mc Lget+255 0:$27D5 d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$27D6 d15:data:reset=0:$18FC mc Lget+252 0:$27D7 d15:data:reset=0:$47DF mc Eq 0:$27D8 d15:data:reset=0:$05F7 mc BraIf0-9 0:$27D9 d15:data:reset=0:$18FE mc Lget+254 0:$27DA d15:data:reset=0:$18FF mc Lget+255 0:$27DB d15:data:reset=0:$18FD mc Lget+253 0:$27DC d15:data:reset=0:$68C4 mc RolRange 0:$27DD d15:data:reset=0:$18FE mc Lget+254 0:$27DE d15:data:reset=0:$07FE mc Lvar+254 0:$27DF d15:data:reset=0:$5D58 mc mmPeek 0:$27E0 d15:data:reset=0:$62C0 mc implicit__FD__shrink__2FDAEC_6uint16_ 0:$27E1 d15:data:reset=0:$5FF7 mc MDrop0_Next-5 // --- file: "FD.asm" --- #include "SerialDevice.cc" // +++ file: "SerialDevice.asm" +++ // K1-16/16 Microcode // 2015-12-22 16:10:39 : implicit__SerialDevice__shrink__6uint16AEC_6uint16_ ( uint16[]¢, uint16 ) Millicoded // Size: 6 microcodes 0:$1C72 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$1C73 0:data:reset=0:$5C76 0:$1C74 0:000011:A1=A4:D0=D0 jp millicoded // * Millicoded 0:$1C75 d15:data:reset=0:$5F70 0:$1C76 d15:data:reset=0:$47BA mc ShrinkStr 0:$1C77 d15:data:reset=0:$5ACD mc Ret : SerialDevice__getavail__12SerialDeviceC_6uint16 ( SerialDevice¢ -- uint16 ) // next_m this.getctl(ioctl_in_avail); 0:$1C60 0:000011:A5=A5:D3=D8 psh alu 0:$1C61 0:000011:A1=A5:D1=D8 0:$1C62 0:000011:A1=A5:D8=D0 ld alu,4 // ioctl_in_avail: in dev.h 0:$1C63 0:data:reset=0:$0004 0:$1C64 0:000011:A1=A0:D0=D0 jp Device__getctl__6DeviceC_6uint16_6uint16 0:$1C65 d15:data:reset=0:$6852 : SerialDevice__getfree__12SerialDeviceC_6uint16 ( SerialDevice¢ -- uint16 ) // next_m this.getctl(ioctl_out_free); 0:$1C66 0:000011:A5=A5:D3=D8 psh alu 0:$1C67 0:000011:A1=A5:D1=D8 0:$1C68 0:000011:A1=A5:D8=D0 ld alu,5 // ioctl_out_free: in dev.h 0:$1C69 0:data:reset=0:$0005 0:$1C6A 0:000011:A1=A0:D0=D0 jp Device__getctl__6DeviceC_6uint16_6uint16 0:$1C6B d15:data:reset=0:$6852 : SerialDevice__readbyte__12SerialDeviceC_6uint16 ( SerialDevice¢ -- uint16 ) Millicoded // Size: 22 microcodes 0:$25DE 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$25DF 0:data:reset=0:$65E2 0:$25E0 0:000011:A1=A5:D0=D0 jp millicoded // * Millicoded 0:$25E1 d15:data:reset=0:$5F70 0:$25E2 d15:data:reset=0:$45F6 mc Dup 0:$25E3 d15:data:reset=0:$1D04 mc ItemGet+4 0:$25E4 d15:data:reset=0:$0D00 mc Int8+0 0:$25E5 d15:data:reset=0:$0E80 mc Int16+128 0:$25E6 d15:data:reset=0:$5A0F mc And 0:$25E7 d15:data:reset=0:$0606 mc BraIf0+6 0:$25E8 d15:data:reset=0:$45F6 mc Dup 0:$25E9 d15:data:reset=0:$1D05 mc ItemGet+5 0:$25EA d15:data:reset=0:$18FF mc Lget+255 0:$25EB d15:data:reset=0:$1D08 mc ItemGet+8 0:$25EC d15:data:reset=0:$6002 mc CallMillicode 0:$25ED d15:data:reset=0:$0205 mc Bra+5 0:$25EE d15:data:reset=0:$45F6 mc Dup 0:$25EF d15:data:reset=0:$1D05 mc ItemGet+5 0:$25F0 d15:data:reset=0:$18FF mc Lget+255 0:$25F1 d15:data:reset=0:$1D08 mc ItemGet+8 0:$25F2 d15:data:reset=0:$5EBD mc CallOpcode 0:$25F3 d15:data:reset=0:$6310 mc MNip0_Next-1 : SerialDevice__writebyte__12SerialDeviceC_6uint16_ ( SerialDevice¢, uint16 ) Millicoded // Size: 24 microcodes 0:$2650 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$2651 0:data:reset=0:$6654 0:$2652 0:000011:A1=A6:D0=D0 jp millicoded // * Millicoded 0:$2653 d15:data:reset=0:$5F70 0:$2654 d15:data:reset=0:$18FF mc Lget+255 0:$2655 d15:data:reset=0:$1D04 mc ItemGet+4 0:$2656 d15:data:reset=0:$0D00 mc Int8+0 0:$2657 d15:data:reset=0:$0E80 mc Int16+128 0:$2658 d15:data:reset=0:$5A0F mc And 0:$2659 d15:data:reset=0:$0607 mc BraIf0+7 0:$265A d15:data:reset=0:$18FF mc Lget+255 0:$265B d15:data:reset=0:$1D05 mc ItemGet+5 0:$265C d15:data:reset=0:$18FF mc Lget+255 0:$265D d15:data:reset=0:$18FD mc Lget+253 0:$265E d15:data:reset=0:$1D0A mc ItemGet+10 0:$265F d15:data:reset=0:$6002 mc CallMillicode 0:$2660 d15:data:reset=0:$0206 mc Bra+6 0:$2661 d15:data:reset=0:$18FF mc Lget+255 0:$2662 d15:data:reset=0:$1D05 mc ItemGet+5 0:$2663 d15:data:reset=0:$18FF mc Lget+255 0:$2664 d15:data:reset=0:$18FD mc Lget+253 0:$2665 d15:data:reset=0:$1D0A mc ItemGet+10 0:$2666 d15:data:reset=0:$5EBD mc CallOpcode 0:$2667 d15:data:reset=0:$5FFA mc MDrop0_Next-2 : SerialDevice__readbytes__12SerialDeviceC_6uint16AEC_6uint16_6uint16_6uint16 ( SerialDevice¢, uint16[]¢, uint16, uint16 -- uint16 ) Millicoded // Size: 28 microcodes 0:$27E2 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$27E3 0:data:reset=0:$67E6 0:$27E4 0:000011:A1=A7:D0=D0 jp millicoded // * Millicoded 0:$27E5 d15:data:reset=0:$5F70 0:$27E6 d15:data:reset=0:$18FD mc Lget+253 0:$27E7 d15:data:reset=0:$1D04 mc ItemGet+4 0:$27E8 d15:data:reset=0:$0D00 mc Int8+0 0:$27E9 d15:data:reset=0:$0E80 mc Int16+128 0:$27EA d15:data:reset=0:$5A0F mc And 0:$27EB d15:data:reset=0:$0609 mc BraIf0+9 0:$27EC d15:data:reset=0:$18FD mc Lget+253 0:$27ED d15:data:reset=0:$1D05 mc ItemGet+5 0:$27EE d15:data:reset=0:$18FD mc Lget+253 0:$27EF d15:data:reset=0:$18FD mc Lget+253 0:$27F0 d15:data:reset=0:$18FD mc Lget+253 0:$27F1 d15:data:reset=0:$18F9 mc Lget+249 0:$27F2 d15:data:reset=0:$1D09 mc ItemGet+9 0:$27F3 d15:data:reset=0:$6002 mc CallMillicode 0:$27F4 d15:data:reset=0:$0208 mc Bra+8 0:$27F5 d15:data:reset=0:$18FD mc Lget+253 0:$27F6 d15:data:reset=0:$1D05 mc ItemGet+5 0:$27F7 d15:data:reset=0:$18FD mc Lget+253 0:$27F8 d15:data:reset=0:$18FD mc Lget+253 0:$27F9 d15:data:reset=0:$18FD mc Lget+253 0:$27FA d15:data:reset=0:$18F9 mc Lget+249 0:$27FB d15:data:reset=0:$1D09 mc ItemGet+9 0:$27FC d15:data:reset=0:$5EBD mc CallOpcode 0:$27FD d15:data:reset=0:$630D mc MNip0_Next-4 : SerialDevice__writebytes__12SerialDeviceC_6uint16AEC_6uint16_6uint16_6uint16 ( SerialDevice¢, uint16[]¢, uint16, uint16 -- uint16 ) Millicoded // Size: 28 microcodes 0:$281A 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$281B 0:data:reset=0:$681E 0:$281C 0:000011:A1=A0:D0=D0 jp millicoded // * Millicoded 0:$281D d15:data:reset=0:$5F70 0:$281E d15:data:reset=0:$18FD mc Lget+253 0:$281F d15:data:reset=0:$1D04 mc ItemGet+4 0:$2820 d15:data:reset=0:$0D00 mc Int8+0 0:$2821 d15:data:reset=0:$0E80 mc Int16+128 0:$2822 d15:data:reset=0:$5A0F mc And 0:$2823 d15:data:reset=0:$0609 mc BraIf0+9 0:$2824 d15:data:reset=0:$18FD mc Lget+253 0:$2825 d15:data:reset=0:$1D05 mc ItemGet+5 0:$2826 d15:data:reset=0:$18FD mc Lget+253 0:$2827 d15:data:reset=0:$18FD mc Lget+253 0:$2828 d15:data:reset=0:$18FD mc Lget+253 0:$2829 d15:data:reset=0:$18F9 mc Lget+249 0:$282A d15:data:reset=0:$1D0B mc ItemGet+11 0:$282B d15:data:reset=0:$6002 mc CallMillicode 0:$282C d15:data:reset=0:$0208 mc Bra+8 0:$282D d15:data:reset=0:$18FD mc Lget+253 0:$282E d15:data:reset=0:$1D05 mc ItemGet+5 0:$282F d15:data:reset=0:$18FD mc Lget+253 0:$2830 d15:data:reset=0:$18FD mc Lget+253 0:$2831 d15:data:reset=0:$18FD mc Lget+253 0:$2832 d15:data:reset=0:$18F9 mc Lget+249 0:$2833 d15:data:reset=0:$1D0B mc ItemGet+11 0:$2834 d15:data:reset=0:$5EBD mc CallOpcode 0:$2835 d15:data:reset=0:$630D mc MNip0_Next-4 : SerialDevice__readbytes__12SerialDeviceC_6uint16AEC_ ( SerialDevice¢, uint16[]¢ ) Millicoded // Size: 45 microcodes 0:$2C70 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$2C71 0:data:reset=0:$6C74 0:$2C72 0:000011:A1=A4:D0=D0 jp millicoded // * Millicoded 0:$2C73 d15:data:reset=0:$5F70 0:$2C74 d15:data:reset=0:$0D00 mc Int8+0 0:$2C75 d15:data:reset=0:$18FF mc Lget+255 0:$2C76 d15:data:reset=0:$482D mc Count 0:$2C77 d15:data:reset=0:$18FD mc Lget+253 0:$2C78 d15:data:reset=0:$1D04 mc ItemGet+4 0:$2C79 d15:data:reset=0:$0D00 mc Int8+0 0:$2C7A d15:data:reset=0:$0E80 mc Int16+128 0:$2C7B d15:data:reset=0:$5A0F mc And 0:$2C7C d15:data:reset=0:$060D mc BraIf0+13 0:$2C7D d15:data:reset=0:$18FD mc Lget+253 0:$2C7E d15:data:reset=0:$1D05 mc ItemGet+5 0:$2C7F d15:data:reset=0:$18FD mc Lget+253 0:$2C80 d15:data:reset=0:$18FD mc Lget+253 0:$2C81 d15:data:reset=0:$18FD mc Lget+253 0:$2C82 d15:data:reset=0:$18FB mc Lget+251 0:$2C83 d15:data:reset=0:$5BAC mc Sub 0:$2C84 d15:data:reset=0:$18F9 mc Lget+249 0:$2C85 d15:data:reset=0:$1D09 mc ItemGet+9 0:$2C86 d15:data:reset=0:$6002 mc CallMillicode 0:$2C87 d15:data:reset=0:$07FE mc Lvar+254 0:$2C88 d15:data:reset=0:$5DA8 mc AddPoke 0:$2C89 d15:data:reset=0:$020C mc Bra+12 0:$2C8A d15:data:reset=0:$18FD mc Lget+253 0:$2C8B d15:data:reset=0:$1D05 mc ItemGet+5 0:$2C8C d15:data:reset=0:$18FD mc Lget+253 0:$2C8D d15:data:reset=0:$18FD mc Lget+253 0:$2C8E d15:data:reset=0:$18FD mc Lget+253 0:$2C8F d15:data:reset=0:$18FB mc Lget+251 0:$2C90 d15:data:reset=0:$5BAC mc Sub 0:$2C91 d15:data:reset=0:$18F9 mc Lget+249 0:$2C92 d15:data:reset=0:$1D09 mc ItemGet+9 0:$2C93 d15:data:reset=0:$5EBD mc CallOpcode 0:$2C94 d15:data:reset=0:$07FE mc Lvar+254 0:$2C95 d15:data:reset=0:$5DA8 mc AddPoke 0:$2C96 d15:data:reset=0:$18FF mc Lget+255 0:$2C97 d15:data:reset=0:$18FF mc Lget+255 0:$2C98 d15:data:reset=0:$46CC mc Ult 0:$2C99 d15:data:reset=0:$0602 mc BraIf0+2 0:$2C9A d15:data:reset=0:$5E90 mc Halt 0:$2C9B d15:data:reset=0:$01DB mc Bra-37 0:$2C9C d15:data:reset=0:$5FF8 mc MDrop0_Next-4 : SerialDevice__writebytes__12SerialDeviceC_6uint16AEC_ ( SerialDevice¢, uint16[]¢ ) Millicoded // Size: 45 microcodes 0:$2C43 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$2C44 0:data:reset=0:$6C47 0:$2C45 0:000011:A1=A4:D0=D0 jp millicoded // * Millicoded 0:$2C46 d15:data:reset=0:$5F70 0:$2C47 d15:data:reset=0:$0D00 mc Int8+0 0:$2C48 d15:data:reset=0:$18FF mc Lget+255 0:$2C49 d15:data:reset=0:$482D mc Count 0:$2C4A d15:data:reset=0:$18FD mc Lget+253 0:$2C4B d15:data:reset=0:$1D04 mc ItemGet+4 0:$2C4C d15:data:reset=0:$0D00 mc Int8+0 0:$2C4D d15:data:reset=0:$0E80 mc Int16+128 0:$2C4E d15:data:reset=0:$5A0F mc And 0:$2C4F d15:data:reset=0:$060D mc BraIf0+13 0:$2C50 d15:data:reset=0:$18FD mc Lget+253 0:$2C51 d15:data:reset=0:$1D05 mc ItemGet+5 0:$2C52 d15:data:reset=0:$18FD mc Lget+253 0:$2C53 d15:data:reset=0:$18FD mc Lget+253 0:$2C54 d15:data:reset=0:$18FD mc Lget+253 0:$2C55 d15:data:reset=0:$18FB mc Lget+251 0:$2C56 d15:data:reset=0:$5BAC mc Sub 0:$2C57 d15:data:reset=0:$18F9 mc Lget+249 0:$2C58 d15:data:reset=0:$1D0B mc ItemGet+11 0:$2C59 d15:data:reset=0:$6002 mc CallMillicode 0:$2C5A d15:data:reset=0:$07FE mc Lvar+254 0:$2C5B d15:data:reset=0:$5DA8 mc AddPoke 0:$2C5C d15:data:reset=0:$020C mc Bra+12 0:$2C5D d15:data:reset=0:$18FD mc Lget+253 0:$2C5E d15:data:reset=0:$1D05 mc ItemGet+5 0:$2C5F d15:data:reset=0:$18FD mc Lget+253 0:$2C60 d15:data:reset=0:$18FD mc Lget+253 0:$2C61 d15:data:reset=0:$18FD mc Lget+253 0:$2C62 d15:data:reset=0:$18FB mc Lget+251 0:$2C63 d15:data:reset=0:$5BAC mc Sub 0:$2C64 d15:data:reset=0:$18F9 mc Lget+249 0:$2C65 d15:data:reset=0:$1D0B mc ItemGet+11 0:$2C66 d15:data:reset=0:$5EBD mc CallOpcode 0:$2C67 d15:data:reset=0:$07FE mc Lvar+254 0:$2C68 d15:data:reset=0:$5DA8 mc AddPoke 0:$2C69 d15:data:reset=0:$18FF mc Lget+255 0:$2C6A d15:data:reset=0:$18FF mc Lget+255 0:$2C6B d15:data:reset=0:$46CC mc Ult 0:$2C6C d15:data:reset=0:$0602 mc BraIf0+2 0:$2C6D d15:data:reset=0:$5E90 mc Halt 0:$2C6E d15:data:reset=0:$01DB mc Bra-37 0:$2C6F d15:data:reset=0:$5FF8 mc MDrop0_Next-4 : SerialDevice__readdata__12SerialDeviceC_6uint16AEC_ ( SerialDevice¢, uint16[]¢ ) Millicoded // Size: 44 microcodes 0:$2BEB 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$2BEC 0:data:reset=0:$6BEF 0:$2BED 0:000011:A1=A3:D0=D0 jp millicoded // * Millicoded 0:$2BEE d15:data:reset=0:$5F70 0:$2BEF d15:data:reset=0:$18FF mc Lget+255 0:$2BF0 d15:data:reset=0:$1D03 mc ItemGet+3 0:$2BF1 d15:data:reset=0:$0604 mc BraIf0+4 0:$2BF2 d15:data:reset=0:$18FF mc Lget+255 0:$2BF3 d15:data:reset=0:$18FF mc Lget+255 0:$2BF4 d15:data:reset=0:$6C70 mc SerialDevice__readbytes__12SerialDeviceC_6uint16AEC_ 0:$2BF5 d15:data:reset=0:$0220 mc Bra+32 0:$2BF6 d15:data:reset=0:$0D40 mc Int8+64 0:$2BF7 d15:data:reset=0:$4203 mc Alloc 0:$2BF8 d15:data:reset=0:$0D00 mc Int8+0 0:$2BF9 d15:data:reset=0:$0D00 mc Int8+0 0:$2BFA d15:data:reset=0:$0D20 mc Int8+32 0:$2BFB d15:data:reset=0:$18FC mc Lget+252 0:$2BFC d15:data:reset=0:$482D mc Count 0:$2BFD d15:data:reset=0:$18FD mc Lget+253 0:$2BFE d15:data:reset=0:$5BAC mc Sub 0:$2BFF d15:data:reset=0:$480F mc Umin 0:$2C00 d15:data:reset=0:$5F29 mc Nip 0:$2C01 d15:data:reset=0:$45F6 mc Dup 0:$2C02 d15:data:reset=0:$0611 mc BraIf0+17 0:$2C03 d15:data:reset=0:$07FE mc Lvar+254 0:$2C04 d15:data:reset=0:$458D mc PeekNZ 0:$2C05 d15:data:reset=0:$18FF mc Lget+255 0:$2C06 d15:data:reset=0:$C3A2 mc Sli15+15-1 0:$2C07 d15:data:reset=0:$5C72 mc implicit__SerialDevice__shrink__6uint16AEC_6uint16_ 0:$2C08 d15:data:reset=0:$18FC mc Lget+252 0:$2C09 d15:data:reset=0:$18FD mc Lget+253 0:$2C0A d15:data:reset=0:$6C70 mc SerialDevice__readbytes__12SerialDeviceC_6uint16AEC_ 0:$2C0B d15:data:reset=0:$18FE mc Lget+254 0:$2C0C d15:data:reset=0:$0D00 mc Int8+0 0:$2C0D d15:data:reset=0:$18FB mc Lget+251 0:$2C0E d15:data:reset=0:$18FC mc Lget+252 0:$2C0F d15:data:reset=0:$6A42 mc copy_i8_to_i16__6uint16AEC_6uint16_6uint16AEC_6uint16_ 0:$2C10 d15:data:reset=0:$45F6 mc Dup 0:$2C11 d15:data:reset=0:$07FE mc Lvar+254 0:$2C12 d15:data:reset=0:$5DA8 mc AddPoke 0:$2C13 d15:data:reset=0:$01E6 mc Bra-26 0:$2C14 d15:data:reset=0:$5F32 mc MDrop0-2 0:$2C15 d15:data:reset=0:$4581 mc DropStr 0:$2C16 d15:data:reset=0:$5FFA mc MDrop0_Next-2 : SerialDevice__writedata__12SerialDeviceC_6uint16AEC_ ( SerialDevice¢, uint16[]¢ ) Millicoded // Size: 44 microcodes 0:$2C17 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$2C18 0:data:reset=0:$6C1B 0:$2C19 0:000011:A1=A4:D0=D0 jp millicoded // * Millicoded 0:$2C1A d15:data:reset=0:$5F70 0:$2C1B d15:data:reset=0:$18FF mc Lget+255 0:$2C1C d15:data:reset=0:$1D03 mc ItemGet+3 0:$2C1D d15:data:reset=0:$0604 mc BraIf0+4 0:$2C1E d15:data:reset=0:$18FF mc Lget+255 0:$2C1F d15:data:reset=0:$18FF mc Lget+255 0:$2C20 d15:data:reset=0:$6C43 mc SerialDevice__writebytes__12SerialDeviceC_6uint16AEC_ 0:$2C21 d15:data:reset=0:$0220 mc Bra+32 0:$2C22 d15:data:reset=0:$0D40 mc Int8+64 0:$2C23 d15:data:reset=0:$4203 mc Alloc 0:$2C24 d15:data:reset=0:$0D00 mc Int8+0 0:$2C25 d15:data:reset=0:$0D00 mc Int8+0 0:$2C26 d15:data:reset=0:$0D20 mc Int8+32 0:$2C27 d15:data:reset=0:$18FC mc Lget+252 0:$2C28 d15:data:reset=0:$482D mc Count 0:$2C29 d15:data:reset=0:$18FD mc Lget+253 0:$2C2A d15:data:reset=0:$5BAC mc Sub 0:$2C2B d15:data:reset=0:$480F mc Umin 0:$2C2C d15:data:reset=0:$5F29 mc Nip 0:$2C2D d15:data:reset=0:$45F6 mc Dup 0:$2C2E d15:data:reset=0:$0611 mc BraIf0+17 0:$2C2F d15:data:reset=0:$07FE mc Lvar+254 0:$2C30 d15:data:reset=0:$458D mc PeekNZ 0:$2C31 d15:data:reset=0:$18FF mc Lget+255 0:$2C32 d15:data:reset=0:$C3A2 mc Sli15+15-1 0:$2C33 d15:data:reset=0:$5C72 mc implicit__SerialDevice__shrink__6uint16AEC_6uint16_ 0:$2C34 d15:data:reset=0:$18FD mc Lget+253 0:$2C35 d15:data:reset=0:$18FE mc Lget+254 0:$2C36 d15:data:reset=0:$18FC mc Lget+252 0:$2C37 d15:data:reset=0:$0D00 mc Int8+0 0:$2C38 d15:data:reset=0:$6AD4 mc copy_i16_to_i8__6uint16AEC_6uint16_6uint16AEC_6uint16_ 0:$2C39 d15:data:reset=0:$18FC mc Lget+252 0:$2C3A d15:data:reset=0:$18FD mc Lget+253 0:$2C3B d15:data:reset=0:$6C43 mc SerialDevice__writebytes__12SerialDeviceC_6uint16AEC_ 0:$2C3C d15:data:reset=0:$45F6 mc Dup 0:$2C3D d15:data:reset=0:$07FE mc Lvar+254 0:$2C3E d15:data:reset=0:$5DA8 mc AddPoke 0:$2C3F d15:data:reset=0:$01E6 mc Bra-26 0:$2C40 d15:data:reset=0:$5F32 mc MDrop0-2 0:$2C41 d15:data:reset=0:$4581 mc DropStr 0:$2C42 d15:data:reset=0:$5FFA mc MDrop0_Next-2 : SerialDevice__getstr__12SerialDeviceC_8ucs2charAE ( SerialDevice¢ -- ucs2str ) Millicoded // Size: 50 microcodes 0:$2D29 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$2D2A 0:data:reset=0:$6D2D 0:$2D2B 0:000011:A1=A5:D0=D0 jp millicoded // * Millicoded 0:$2D2C d15:data:reset=0:$5F70 0:$2D2D d15:data:reset=0:$0D32 mc Int8+50 0:$2D2E d15:data:reset=0:$0D00 mc Int8+0 0:$2D2F d15:data:reset=0:$18FF mc Lget+255 0:$2D30 d15:data:reset=0:$4203 mc Alloc 0:$2D31 d15:data:reset=0:$0D00 mc Int8+0 0:$2D32 d15:data:reset=0:$18FE mc Lget+254 0:$2D33 d15:data:reset=0:$18FC mc Lget+252 0:$2D34 d15:data:reset=0:$47DF mc Eq 0:$2D35 d15:data:reset=0:$0607 mc BraIf0+7 0:$2D36 d15:data:reset=0:$0D32 mc Int8+50 0:$2D37 d15:data:reset=0:$07FC mc Lvar+252 0:$2D38 d15:data:reset=0:$5DA8 mc AddPoke 0:$2D39 d15:data:reset=0:$07FF mc Lvar+255 0:$2D3A d15:data:reset=0:$458D mc PeekNZ 0:$2D3B d15:data:reset=0:$18FC mc Lget+252 0:$2D3C d15:data:reset=0:$47AA mc GrowStr 0:$2D3D d15:data:reset=0:$18FC mc Lget+252 0:$2D3E d15:data:reset=0:$65DE mc SerialDevice__readbyte__12SerialDeviceC_6uint16 0:$2D3F d15:data:reset=0:$5F29 mc Nip 0:$2D40 d15:data:reset=0:$45F6 mc Dup 0:$2D41 d15:data:reset=0:$0D10 mc Int8+16 0:$2D42 d15:data:reset=0:$46CC mc Ult 0:$2D43 d15:data:reset=0:$47E5 mc And0 0:$2D44 d15:data:reset=0:$0204 mc Bra+4 0:$2D45 d15:data:reset=0:$45F6 mc Dup 0:$2D46 d15:data:reset=0:$0D11 mc Int8+17 0:$2D47 d15:data:reset=0:$0E34 mc Int16+52 0:$2D48 d15:data:reset=0:$5A0F mc And 0:$2D49 d15:data:reset=0:$0406 mc BraIf1+6 0:$2D4A d15:data:reset=0:$45F6 mc Dup 0:$2D4B d15:data:reset=0:$18FE mc Lget+254 0:$2D4C d15:data:reset=0:$07FC mc Lvar+252 0:$2D4D d15:data:reset=0:$5DB0 mc Peekpp 0:$2D4E d15:data:reset=0:$5E87 mc AtIndexPoke 0:$2D4F d15:data:reset=0:$01E2 mc Bra-30 0:$2D50 d15:data:reset=0:$18FF mc Lget+255 0:$2D51 d15:data:reset=0:$0D00 mc Int8+0 0:$2D52 d15:data:reset=0:$18FC mc Lget+252 0:$2D53 d15:data:reset=0:$7D04 mc SubStr 0:$2D54 d15:data:reset=0:$6712 mc Cast_RangeStr 0:$2D55 d15:data:reset=0:$5FA7 mc ToR 0:$2D56 d15:data:reset=0:$5F33 mc MDrop0-1 0:$2D57 d15:data:reset=0:$4581 mc DropStr 0:$2D58 d15:data:reset=0:$5F31 mc MDrop0-3 0:$2D59 d15:data:reset=0:$5F9C mc FromR 0:$2D5A d15:data:reset=0:$5ACD mc Ret : new__8ucs2charAEC_6uint16_8DrvrDataC_6uint16B8DrvrDataC6uint16D_4voidB8DrvrDataC6uint166uint16D_6uint16B8DrvrDataCD_6uint16B8DrvrDataC6uint16AEC6uint166uint16D_4voidB8DrvrDataC6uint16D_6uint16B8DrvrDataC6uint16AEC6uint166uint16D_12SerialDevice ( ucs2str¢, uint16, DrvrData¢, t_getctl, t_setctl, t_getc, t_gets, t_putc, t_gets -- SerialDevice ) Millicoded // Size: 48 microcodes 0:$2CF9 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$2CFA 0:data:reset=0:$6CFD 0:$2CFB 0:000011:A1=A4:D0=D0 jp millicoded // * Millicoded 0:$2CFC d15:data:reset=0:$5F70 0:$2CFD d15:data:reset=0:$0D0C mc Int8+12 0:$2CFE d15:data:reset=0:$4203 mc Alloc 0:$2CFF d15:data:reset=0:$5FA7 mc ToR 0:$2D00 d15:data:reset=0:$0D04 mc Int8+4 0:$2D01 d15:data:reset=0:$5BD4 mc PeekR 0:$2D02 d15:data:reset=0:$2300 mc ItemSet+0 0:$2D03 d15:data:reset=0:$18F8 mc Lget+248 0:$2D04 d15:data:reset=0:$4667 mc Retain 0:$2D05 d15:data:reset=0:$5BD4 mc PeekR 0:$2D06 d15:data:reset=0:$2301 mc ItemSet+1 0:$2D07 d15:data:reset=0:$18F9 mc Lget+249 0:$2D08 d15:data:reset=0:$0D20 mc Int8+32 0:$2D09 d15:data:reset=0:$5A0F mc And 0:$2D0A d15:data:reset=0:$0D00 mc Int8+0 0:$2D0B d15:data:reset=0:$47D5 mc Ne 0:$2D0C d15:data:reset=0:$5BD4 mc PeekR 0:$2D0D d15:data:reset=0:$2303 mc ItemSet+3 0:$2D0E d15:data:reset=0:$18F9 mc Lget+249 0:$2D0F d15:data:reset=0:$5BD4 mc PeekR 0:$2D10 d15:data:reset=0:$2304 mc ItemSet+4 0:$2D11 d15:data:reset=0:$18FA mc Lget+250 0:$2D12 d15:data:reset=0:$5BD4 mc PeekR 0:$2D13 d15:data:reset=0:$2305 mc ItemSet+5 0:$2D14 d15:data:reset=0:$18FB mc Lget+251 0:$2D15 d15:data:reset=0:$5BD4 mc PeekR 0:$2D16 d15:data:reset=0:$2306 mc ItemSet+6 0:$2D17 d15:data:reset=0:$18FC mc Lget+252 0:$2D18 d15:data:reset=0:$5BD4 mc PeekR 0:$2D19 d15:data:reset=0:$2307 mc ItemSet+7 0:$2D1A d15:data:reset=0:$18FD mc Lget+253 0:$2D1B d15:data:reset=0:$5BD4 mc PeekR 0:$2D1C d15:data:reset=0:$2308 mc ItemSet+8 0:$2D1D d15:data:reset=0:$18FE mc Lget+254 0:$2D1E d15:data:reset=0:$5BD4 mc PeekR 0:$2D1F d15:data:reset=0:$2309 mc ItemSet+9 0:$2D20 d15:data:reset=0:$18FF mc Lget+255 0:$2D21 d15:data:reset=0:$5BD4 mc PeekR 0:$2D22 d15:data:reset=0:$230A mc ItemSet+10 0:$2D23 d15:data:reset=0:$45F6 mc Dup 0:$2D24 d15:data:reset=0:$5BD4 mc PeekR 0:$2D25 d15:data:reset=0:$230B mc ItemSet+11 0:$2D26 d15:data:reset=0:$5F9C mc FromR 0:$2D27 d15:data:reset=0:$5F22 mc MNip0-8 0:$2D28 d15:data:reset=0:$6310 mc MNip0_Next-1 // --- file: "SerialDevice.asm" --- #include "Device.cc" // +++ file: "Device.asm" +++ // K1-16/16 Microcode // 2015-12-22 16:10:39 : Device__getctl__6DeviceC_6uint16_6uint16 ( Device¢, uint16 -- uint16 ) Millicoded // Size: 28 microcodes 0:$2852 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$2853 0:data:reset=0:$6856 0:$2854 0:000011:A1=A0:D0=D0 jp millicoded // * Millicoded 0:$2855 d15:data:reset=0:$5F70 0:$2856 d15:data:reset=0:$0D00 mc Int8+0 0:$2857 d15:data:reset=0:$18FE mc Lget+254 0:$2858 d15:data:reset=0:$1D04 mc ItemGet+4 0:$2859 d15:data:reset=0:$0D00 mc Int8+0 0:$285A d15:data:reset=0:$0E80 mc Int16+128 0:$285B d15:data:reset=0:$5A0F mc And 0:$285C d15:data:reset=0:$0608 mc BraIf0+8 0:$285D d15:data:reset=0:$18FE mc Lget+254 0:$285E d15:data:reset=0:$1D05 mc ItemGet+5 0:$285F d15:data:reset=0:$18FE mc Lget+254 0:$2860 d15:data:reset=0:$18FC mc Lget+252 0:$2861 d15:data:reset=0:$1D06 mc ItemGet+6 0:$2862 d15:data:reset=0:$6002 mc CallMillicode 0:$2863 d15:data:reset=0:$5F29 mc Nip 0:$2864 d15:data:reset=0:$0207 mc Bra+7 0:$2865 d15:data:reset=0:$18FE mc Lget+254 0:$2866 d15:data:reset=0:$1D05 mc ItemGet+5 0:$2867 d15:data:reset=0:$18FE mc Lget+254 0:$2868 d15:data:reset=0:$18FC mc Lget+252 0:$2869 d15:data:reset=0:$1D06 mc ItemGet+6 0:$286A d15:data:reset=0:$5EBD mc CallOpcode 0:$286B d15:data:reset=0:$5F29 mc Nip 0:$286C d15:data:reset=0:$45F6 mc Dup 0:$286D d15:data:reset=0:$630E mc MNip0_Next-3 : Device__setctl__6DeviceC_6uint16_6uint16_ ( Device¢, uint16, uint16 ) Millicoded // Size: 26 microcodes 0:$275E 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$275F 0:data:reset=0:$6762 0:$2760 0:000011:A1=A7:D0=D0 jp millicoded // * Millicoded 0:$2761 d15:data:reset=0:$5F70 0:$2762 d15:data:reset=0:$18FE mc Lget+254 0:$2763 d15:data:reset=0:$1D04 mc ItemGet+4 0:$2764 d15:data:reset=0:$0D00 mc Int8+0 0:$2765 d15:data:reset=0:$0E80 mc Int16+128 0:$2766 d15:data:reset=0:$5A0F mc And 0:$2767 d15:data:reset=0:$0608 mc BraIf0+8 0:$2768 d15:data:reset=0:$18FE mc Lget+254 0:$2769 d15:data:reset=0:$1D05 mc ItemGet+5 0:$276A d15:data:reset=0:$18FE mc Lget+254 0:$276B d15:data:reset=0:$18FE mc Lget+254 0:$276C d15:data:reset=0:$18FB mc Lget+251 0:$276D d15:data:reset=0:$1D07 mc ItemGet+7 0:$276E d15:data:reset=0:$6002 mc CallMillicode 0:$276F d15:data:reset=0:$0207 mc Bra+7 0:$2770 d15:data:reset=0:$18FE mc Lget+254 0:$2771 d15:data:reset=0:$1D05 mc ItemGet+5 0:$2772 d15:data:reset=0:$18FE mc Lget+254 0:$2773 d15:data:reset=0:$18FE mc Lget+254 0:$2774 d15:data:reset=0:$18FB mc Lget+251 0:$2775 d15:data:reset=0:$1D07 mc ItemGet+7 0:$2776 d15:data:reset=0:$5EBD mc CallOpcode 0:$2777 d15:data:reset=0:$5FF9 mc MDrop0_Next-3 // --- file: "Device.asm" --- #include "BlockDevice.cc" // +++ file: "BlockDevice.asm" +++ // K1-16/16 Microcode // 2015-12-22 16:10:40 : BlockDevice__ioblocks__11BlockDeviceC_6uint32_6uint16AEC_6uint16_6uint16_4bool_4bool_ ( BlockDevice¢, uint32, uint16[]¢, uint16, uint16, bool, bool ) Millicoded // Size: 133 microcodes 0:$3C7D 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$3C7E 0:data:reset=0:$7C81 0:$3C7F 0:000011:A1=A4:D0=D0 jp millicoded // * Millicoded 0:$3C80 d15:data:reset=0:$5F70 0:$3C81 d15:data:reset=0:$5F6A mc clear_error 0:$3C82 d15:data:reset=0:$18FD mc Lget+253 0:$3C83 d15:data:reset=0:$18FD mc Lget+253 0:$3C84 d15:data:reset=0:$47DF mc Eq 0:$3C85 d15:data:reset=0:$047B mc BraIf1+123 0:$3C86 d15:data:reset=0:$18FF mc Lget+255 0:$3C87 d15:data:reset=0:$18F8 mc Lget+248 0:$3C88 d15:data:reset=0:$1D03 mc ItemGet+3 0:$3C89 d15:data:reset=0:$47DF mc Eq 0:$3C8A d15:data:reset=0:$0624 mc BraIf0+36 0:$3C8B d15:data:reset=0:$45F6 mc Dup 0:$3C8C d15:data:reset=0:$0603 mc BraIf0+3 0:$3C8D d15:data:reset=0:$18F9 mc Lget+249 0:$3C8E d15:data:reset=0:$1D0C mc ItemGet+12 0:$3C8F d15:data:reset=0:$0202 mc Bra+2 0:$3C90 d15:data:reset=0:$18F9 mc Lget+249 0:$3C91 d15:data:reset=0:$1D0B mc ItemGet+11 0:$3C92 d15:data:reset=0:$18F8 mc Lget+248 0:$3C93 d15:data:reset=0:$1D04 mc ItemGet+4 0:$3C94 d15:data:reset=0:$0D00 mc Int8+0 0:$3C95 d15:data:reset=0:$0E80 mc Int16+128 0:$3C96 d15:data:reset=0:$5A0F mc And 0:$3C97 d15:data:reset=0:$060B mc BraIf0+11 0:$3C98 d15:data:reset=0:$18F8 mc Lget+248 0:$3C99 d15:data:reset=0:$1D05 mc ItemGet+5 0:$3C9A d15:data:reset=0:$07F8 mc Lvar+248 0:$3C9B d15:data:reset=0:$5CD6 mc Peek2 0:$3C9C d15:data:reset=0:$18F8 mc Lget+248 0:$3C9D d15:data:reset=0:$18F8 mc Lget+248 0:$3C9E d15:data:reset=0:$18F8 mc Lget+248 0:$3C9F d15:data:reset=0:$18FA mc Lget+250 0:$3CA0 d15:data:reset=0:$6002 mc CallMillicode 0:$3CA1 d15:data:reset=0:$1622 mc Gset+errno 0:$3CA2 d15:data:reset=0:$020A mc Bra+10 0:$3CA3 d15:data:reset=0:$18F8 mc Lget+248 0:$3CA4 d15:data:reset=0:$1D05 mc ItemGet+5 0:$3CA5 d15:data:reset=0:$07F8 mc Lvar+248 0:$3CA6 d15:data:reset=0:$5CD6 mc Peek2 0:$3CA7 d15:data:reset=0:$18F8 mc Lget+248 0:$3CA8 d15:data:reset=0:$18F8 mc Lget+248 0:$3CA9 d15:data:reset=0:$18F8 mc Lget+248 0:$3CAA d15:data:reset=0:$18FA mc Lget+250 0:$3CAB d15:data:reset=0:$5EBD mc CallOpcode 0:$3CAC d15:data:reset=0:$1622 mc Gset+errno 0:$3CAD d15:data:reset=0:$5F33 mc MDrop0-1 0:$3CAE d15:data:reset=0:$0252 mc Bra+82 0:$3CAF d15:data:reset=0:$0D40 mc Int8+64 0:$3CB0 d15:data:reset=0:$18FE mc Lget+254 0:$3CB1 d15:data:reset=0:$449A mc Sru 0:$3CB2 d15:data:reset=0:$0D01 mc Int8+1 0:$3CB3 d15:data:reset=0:$18F7 mc Lget+247 0:$3CB4 d15:data:reset=0:$1D08 mc ItemGet+8 0:$3CB5 d15:data:reset=0:$438B mc Sl 0:$3CB6 d15:data:reset=0:$45FA mc Umax 0:$3CB7 d15:data:reset=0:$45F6 mc Dup 0:$3CB8 d15:data:reset=0:$18F7 mc Lget+247 0:$3CB9 d15:data:reset=0:$1D08 mc ItemGet+8 0:$3CBA d15:data:reset=0:$449A mc Sru 0:$3CBB d15:data:reset=0:$18FD mc Lget+253 0:$3CBC d15:data:reset=0:$0603 mc BraIf0+3 0:$3CBD d15:data:reset=0:$18FF mc Lget+255 0:$3CBE d15:data:reset=0:$C3A2 mc Sli15+15-1 0:$3CBF d15:data:reset=0:$0202 mc Bra+2 0:$3CC0 d15:data:reset=0:$18FF mc Lget+255 0:$3CC1 d15:data:reset=0:$C4B1 mc Sru15+15-1 0:$3CC2 d15:data:reset=0:$45F6 mc Dup 0:$3CC3 d15:data:reset=0:$4203 mc Alloc 0:$3CC4 d15:data:reset=0:$18FC mc Lget+252 0:$3CC5 d15:data:reset=0:$060D mc BraIf0+13 0:$3CC6 d15:data:reset=0:$18FB mc Lget+251 0:$3CC7 d15:data:reset=0:$0606 mc BraIf0+6 0:$3CC8 d15:data:reset=0:$18F8 mc Lget+248 0:$3CC9 d15:data:reset=0:$18F8 mc Lget+248 0:$3CCA d15:data:reset=0:$18FE mc Lget+254 0:$3CCB d15:data:reset=0:$0D00 mc Int8+0 0:$3CCC d15:data:reset=0:$6AD4 mc copy_i16_to_i8__6uint16AEC_6uint16_6uint16AEC_6uint16_ 0:$3CCD d15:data:reset=0:$0205 mc Bra+5 0:$3CCE d15:data:reset=0:$18F8 mc Lget+248 0:$3CCF d15:data:reset=0:$18F8 mc Lget+248 0:$3CD0 d15:data:reset=0:$18FE mc Lget+254 0:$3CD1 d15:data:reset=0:$0D00 mc Int8+0 0:$3CD2 d15:data:reset=0:$6A42 mc copy_i8_to_i16__6uint16AEC_6uint16_6uint16AEC_6uint16_ 0:$3CD3 d15:data:reset=0:$18FF mc Lget+255 0:$3CD4 d15:data:reset=0:$18F9 mc Lget+249 0:$3CD5 d15:data:reset=0:$18F7 mc Lget+247 0:$3CD6 d15:data:reset=0:$5BAC mc Sub 0:$3CD7 d15:data:reset=0:$480F mc Umin 0:$3CD8 d15:data:reset=0:$8EFF mc Lset+255 0:$3CD9 d15:data:reset=0:$18F5 mc Lget+245 0:$3CDA d15:data:reset=0:$07F5 mc Lvar+245 0:$3CDB d15:data:reset=0:$5CD6 mc Peek2 0:$3CDC d15:data:reset=0:$18FD mc Lget+253 0:$3CDD d15:data:reset=0:$0D00 mc Int8+0 0:$3CDE d15:data:reset=0:$18FA mc Lget+250 0:$3CDF d15:data:reset=0:$18F5 mc Lget+245 0:$3CE0 d15:data:reset=0:$18F5 mc Lget+245 0:$3CE1 d15:data:reset=0:$7C7D mc BlockDevice__ioblocks__11BlockDeviceC_6uint32_6uint16AEC_6uint16_6uint16_4bool_4bool_ 0:$3CE2 d15:data:reset=0:$9F22 mc Gget+errno 0:$3CE3 d15:data:reset=0:$041B mc BraIf1+27 0:$3CE4 d15:data:reset=0:$18FC mc Lget+252 0:$3CE5 d15:data:reset=0:$040D mc BraIf1+13 0:$3CE6 d15:data:reset=0:$18FB mc Lget+251 0:$3CE7 d15:data:reset=0:$0606 mc BraIf0+6 0:$3CE8 d15:data:reset=0:$45F6 mc Dup 0:$3CE9 d15:data:reset=0:$0D00 mc Int8+0 0:$3CEA d15:data:reset=0:$18F6 mc Lget+246 0:$3CEB d15:data:reset=0:$18F6 mc Lget+246 0:$3CEC d15:data:reset=0:$6A42 mc copy_i8_to_i16__6uint16AEC_6uint16_6uint16AEC_6uint16_ 0:$3CED d15:data:reset=0:$0205 mc Bra+5 0:$3CEE d15:data:reset=0:$45F6 mc Dup 0:$3CEF d15:data:reset=0:$0D00 mc Int8+0 0:$3CF0 d15:data:reset=0:$18F6 mc Lget+246 0:$3CF1 d15:data:reset=0:$18F6 mc Lget+246 0:$3CF2 d15:data:reset=0:$6AD4 mc copy_i16_to_i8__6uint16AEC_6uint16_6uint16AEC_6uint16_ 0:$3CF3 d15:data:reset=0:$18FD mc Lget+253 0:$3CF4 d15:data:reset=0:$07F8 mc Lvar+248 0:$3CF5 d15:data:reset=0:$5DA8 mc AddPoke 0:$3CF6 d15:data:reset=0:$18F9 mc Lget+249 0:$3CF7 d15:data:reset=0:$18F9 mc Lget+249 0:$3CF8 d15:data:reset=0:$46CC mc Ult 0:$3CF9 d15:data:reset=0:$0605 mc BraIf0+5 0:$3CFA d15:data:reset=0:$18FE mc Lget+254 0:$3CFB d15:data:reset=0:$5B75 mc Cast_uL 0:$3CFC d15:data:reset=0:$07F4 mc Lvar+244 0:$3CFD d15:data:reset=0:$6040 mc AddPokeL 0:$3CFE d15:data:reset=0:$01C5 mc Bra-59 0:$3CFF d15:data:reset=0:$4581 mc DropStr 0:$3D00 d15:data:reset=0:$5F31 mc MDrop0-3 0:$3D01 d15:data:reset=0:$5FF4 mc MDrop0_Next-8 : BlockDevice__writeblocks8__11BlockDeviceC_6uint32_6uint16AEC_6uint16_6uint16_ ( BlockDevice¢, uint32, uint16[]¢, uint16, uint16 ) // z.ioblocks(block,blocks,bu,idx,0/*small*/,1/*write*/); 0:$1D50 0:000011:A5=A5:D3=D8 psh alu 0:$1D51 0:000011:A1=A5:D1=D8 0:$1D52 0:000001:A1=A5:D8=D8 xor alu 0:$1D53 0:000011:A5=A5:D3=D8 psh alu 0:$1D54 0:000011:A1=A5:D1=D8 0:$1D55 0:000100:A1=A5:D8=D8 add_c alu // nodelay 0:$1D56 0:000011:A1=A5:D0=D0 jp BlockDevice__ioblocks__11BlockDeviceC_6uint32_6uint16AEC_6uint16_6uint16_4bool_4bool_ 0:$1D57 d15:data:reset=0:$7C7D : BlockDevice__readblocks8__11BlockDeviceC_6uint32_6uint16AEC_6uint16_6uint16_ ( BlockDevice¢, uint32, uint16[]¢, uint16, uint16 ) // z.ioblocks(block,blocks,bu,idx,0/*small*/,0/*read*/); 0:$1D34 0:000011:A5=A5:D3=D8 psh alu 0:$1D35 0:000011:A1=A5:D1=D8 0:$1D36 0:000001:A1=A5:D8=D8 xor alu 0:$1D37 0:000011:A5=A5:D3=D8 psh alu 0:$1D38 0:000011:A1=A5:D1=D8 0:$1D39 0:000011:A1=A5:D0=D0 jp BlockDevice__ioblocks__11BlockDeviceC_6uint32_6uint16AEC_6uint16_6uint16_4bool_4bool_ 0:$1D3A d15:data:reset=0:$7C7D : BlockDevice__writeblocks16__11BlockDeviceC_6uint32_6uint16AEC_6uint16_6uint16_ ( BlockDevice¢, uint32, uint16[]¢, uint16, uint16 ) // z.ioblocks(block,blocks,bu,idx,1/*wide*/,1/*write*/); 0:$1DB8 0:000011:A5=A5:D3=D8 psh alu 0:$1DB9 0:000011:A1=A5:D1=D8 0:$1DBA 0:000011:A1=A5:D8=D0 ld alu,1 0:$1DBB 0:data:reset=0:$0001 0:$1DBC 0:000011:A5=A5:D3=D8 psh alu 0:$1DBD 0:000011:A1=A5:D1=D8 0:$1DBE 0:000011:A1=A5:D0=D0 jp BlockDevice__ioblocks__11BlockDeviceC_6uint32_6uint16AEC_6uint16_6uint16_4bool_4bool_ 0:$1DBF d15:data:reset=0:$7C7D : BlockDevice__readblocks16__11BlockDeviceC_6uint32_6uint16AEC_6uint16_6uint16_ ( BlockDevice¢, uint32, uint16[]¢, uint16, uint16 ) // z.ioblocks(block,blocks,bu,idx,1/*wide*/,0/*read*/); 0:$1D70 0:000011:A5=A5:D3=D8 psh alu 0:$1D71 0:000011:A1=A5:D1=D8 0:$1D72 0:000011:A5=A5:D3=D8 psh 1 0:$1D73 0:000011:A1=A5:D1=D0 0:$1D74 0:data:reset=0:$0001 0:$1D75 0:000001:A1=A0:D8=D8 xor alu 0:$1D76 0:000011:A1=A0:D0=D0 jp BlockDevice__ioblocks__11BlockDeviceC_6uint32_6uint16AEC_6uint16_6uint16_4bool_4bool_ 0:$1D77 d15:data:reset=0:$7C7D : new__8ucs2charAEC_6uint16_8DrvrDataC_6uint16B8DrvrDataC6uint16D_4voidB8DrvrDataC6uint166uint16D_3ErrB8DrvrDataC6uint326uint16AEC6uint166uint16D_3ErrB8DrvrDataC6uint326uint16AEC6uint166uint16D_11BlockDevice ( ucs2str¢, uint16, DrvrData¢, t_getctl, t_setctl, t_readblocks, t_readblocks -- BlockDevice ) Millicoded // Size: 88 microcodes 0:$2EA2 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$2EA3 0:data:reset=0:$6EA6 0:$2EA4 0:000011:A1=A6:D0=D0 jp millicoded // * Millicoded 0:$2EA5 d15:data:reset=0:$5F70 0:$2EA6 d15:data:reset=0:$0D00 mc Int8+0 0:$2EA7 d15:data:reset=0:$0D00 mc Int8+0 0:$2EA8 d15:data:reset=0:$0D00 mc Int8+0 0:$2EA9 d15:data:reset=0:$18F8 mc Lget+248 0:$2EAA d15:data:reset=0:$0D00 mc Int8+0 0:$2EAB d15:data:reset=0:$0E80 mc Int16+128 0:$2EAC d15:data:reset=0:$5A0F mc And 0:$2EAD d15:data:reset=0:$0610 mc BraIf0+16 0:$2EAE d15:data:reset=0:$18F9 mc Lget+249 0:$2EAF d15:data:reset=0:$0D07 mc Int8+7 0:$2EB0 d15:data:reset=0:$18F8 mc Lget+248 0:$2EB1 d15:data:reset=0:$6002 mc CallMillicode 0:$2EB2 d15:data:reset=0:$8EFE mc Lset+254 0:$2EB3 d15:data:reset=0:$18F9 mc Lget+249 0:$2EB4 d15:data:reset=0:$0D09 mc Int8+9 0:$2EB5 d15:data:reset=0:$18F8 mc Lget+248 0:$2EB6 d15:data:reset=0:$6002 mc CallMillicode 0:$2EB7 d15:data:reset=0:$18F8 mc Lget+248 0:$2EB8 d15:data:reset=0:$0D08 mc Int8+8 0:$2EB9 d15:data:reset=0:$18F7 mc Lget+247 0:$2EBA d15:data:reset=0:$6002 mc CallMillicode 0:$2EBB d15:data:reset=0:$07FD mc Lvar+253 0:$2EBC d15:data:reset=0:$5E23 mc Poke2 0:$2EBD d15:data:reset=0:$020F mc Bra+15 0:$2EBE d15:data:reset=0:$18F9 mc Lget+249 0:$2EBF d15:data:reset=0:$0D07 mc Int8+7 0:$2EC0 d15:data:reset=0:$18F8 mc Lget+248 0:$2EC1 d15:data:reset=0:$5EBD mc CallOpcode 0:$2EC2 d15:data:reset=0:$8EFE mc Lset+254 0:$2EC3 d15:data:reset=0:$18F9 mc Lget+249 0:$2EC4 d15:data:reset=0:$0D09 mc Int8+9 0:$2EC5 d15:data:reset=0:$18F8 mc Lget+248 0:$2EC6 d15:data:reset=0:$5EBD mc CallOpcode 0:$2EC7 d15:data:reset=0:$18F8 mc Lget+248 0:$2EC8 d15:data:reset=0:$0D08 mc Int8+8 0:$2EC9 d15:data:reset=0:$18F7 mc Lget+247 0:$2ECA d15:data:reset=0:$5EBD mc CallOpcode 0:$2ECB d15:data:reset=0:$07FD mc Lvar+253 0:$2ECC d15:data:reset=0:$5E23 mc Poke2 0:$2ECD d15:data:reset=0:$0D0D mc Int8+13 0:$2ECE d15:data:reset=0:$4203 mc Alloc 0:$2ECF d15:data:reset=0:$5FA7 mc ToR 0:$2ED0 d15:data:reset=0:$0D03 mc Int8+3 0:$2ED1 d15:data:reset=0:$5BD4 mc PeekR 0:$2ED2 d15:data:reset=0:$2300 mc ItemSet+0 0:$2ED3 d15:data:reset=0:$18F7 mc Lget+247 0:$2ED4 d15:data:reset=0:$4667 mc Retain 0:$2ED5 d15:data:reset=0:$5BD4 mc PeekR 0:$2ED6 d15:data:reset=0:$2301 mc ItemSet+1 0:$2ED7 d15:data:reset=0:$18F8 mc Lget+248 0:$2ED8 d15:data:reset=0:$0D20 mc Int8+32 0:$2ED9 d15:data:reset=0:$5A0F mc And 0:$2EDA d15:data:reset=0:$4837 mc Bool 0:$2EDB d15:data:reset=0:$5BD4 mc PeekR 0:$2EDC d15:data:reset=0:$2303 mc ItemSet+3 0:$2EDD d15:data:reset=0:$18F8 mc Lget+248 0:$2EDE d15:data:reset=0:$5BD4 mc PeekR 0:$2EDF d15:data:reset=0:$2304 mc ItemSet+4 0:$2EE0 d15:data:reset=0:$18F9 mc Lget+249 0:$2EE1 d15:data:reset=0:$5BD4 mc PeekR 0:$2EE2 d15:data:reset=0:$2305 mc ItemSet+5 0:$2EE3 d15:data:reset=0:$18FA mc Lget+250 0:$2EE4 d15:data:reset=0:$5BD4 mc PeekR 0:$2EE5 d15:data:reset=0:$2306 mc ItemSet+6 0:$2EE6 d15:data:reset=0:$18FB mc Lget+251 0:$2EE7 d15:data:reset=0:$5BD4 mc PeekR 0:$2EE8 d15:data:reset=0:$2307 mc ItemSet+7 0:$2EE9 d15:data:reset=0:$18FE mc Lget+254 0:$2EEA d15:data:reset=0:$5BD4 mc PeekR 0:$2EEB d15:data:reset=0:$2308 mc ItemSet+8 0:$2EEC d15:data:reset=0:$07FF mc Lvar+255 0:$2EED d15:data:reset=0:$5CD6 mc Peek2 0:$2EEE d15:data:reset=0:$5BD4 mc PeekR 0:$2EEF d15:data:reset=0:$1709 mc Item+9 0:$2EF0 d15:data:reset=0:$5E23 mc Poke2 0:$2EF1 d15:data:reset=0:$18FC mc Lget+252 0:$2EF2 d15:data:reset=0:$5BD4 mc PeekR 0:$2EF3 d15:data:reset=0:$230B mc ItemSet+11 0:$2EF4 d15:data:reset=0:$18FD mc Lget+253 0:$2EF5 d15:data:reset=0:$5BD4 mc PeekR 0:$2EF6 d15:data:reset=0:$230C mc ItemSet+12 0:$2EF7 d15:data:reset=0:$5F9C mc FromR 0:$2EF8 d15:data:reset=0:$5F22 mc MNip0-8 0:$2EF9 d15:data:reset=0:$630F mc MNip0_Next-2 : new__8ucs2charAEC_15NullBlockDevice ( ucs2str¢ -- NullBlockDevice ) Millicoded // Size: 18 microcodes 0:$242F 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$2430 0:data:reset=0:$6433 0:$2431 0:000011:A1=A4:D0=D0 jp millicoded // * Millicoded 0:$2432 d15:data:reset=0:$5F70 0:$2433 d15:data:reset=0:$45F6 mc Dup 0:$2434 d15:data:reset=0:$0D0B mc Int8+11 0:$2435 d15:data:reset=0:$0E80 mc Int16+128 0:$2436 d15:data:reset=0:$0D00 mc Int8+0 0:$2437 d15:data:reset=0:$0D42 mc Int8+null_getctl__8DrvrDataC_6uint16_6uint16&$FF 0:$2438 d15:data:reset=0:$0E5C mc Int16+(null_getctl__8DrvrDataC_6uint16_6uint16>>8)&$FF 0:$2439 d15:data:reset=0:$0D2A mc Int8+null_setctl__8DrvrDataC_6uint16_6uint16_&$FF 0:$243A d15:data:reset=0:$0E5B mc Int16+(null_setctl__8DrvrDataC_6uint16_6uint16_>>8)&$FF 0:$243B d15:data:reset=0:$0D4E mc Int8+null_io__8DrvrDataC_6uint32_6uint16AEC_6uint16_6uint16_3Err&$FF 0:$243C d15:data:reset=0:$0E5C mc Int16+(null_io__8DrvrDataC_6uint32_6uint16AEC_6uint16_6uint16_3Err>>8)&$FF 0:$243D d15:data:reset=0:$0D4E mc Int8+null_io__8DrvrDataC_6uint32_6uint16AEC_6uint16_6uint16_3Err&$FF 0:$243E d15:data:reset=0:$0E5C mc Int16+(null_io__8DrvrDataC_6uint32_6uint16AEC_6uint16_6uint16_3Err>>8)&$FF 0:$243F d15:data:reset=0:$6EA2 mc new__8ucs2charAEC_6uint16_8DrvrDataC_6uint16B8DrvrDataC6uint16D_4voidB8DrvrDataC6uint166uint16D_3ErrB8DrvrDataC6uint326uint16AEC6uint166uint16D_3ErrB8DrvrDataC6uint326uint16AEC6uint166uint16D_11BlockDevice 0:$2440 d15:data:reset=0:$6310 mc MNip0_Next-1 : null_getctl__8DrvrDataC_6uint16_6uint16 ( DrvrData¢, uint16 -- uint16 ) Millicoded // Size: 6 microcodes 0:$1C42 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$1C43 0:data:reset=0:$5C46 0:$1C44 0:000011:A1=A4:D0=D0 jp millicoded // * Millicoded 0:$1C45 d15:data:reset=0:$5F70 0:$1C46 d15:data:reset=0:$0D00 mc Int8+0 0:$1C47 d15:data:reset=0:$630F mc MNip0_Next-2 : null_setctl__8DrvrDataC_6uint16_6uint16_ ( DrvrData¢, uint16, uint16 ) Millicoded // Size: 5 microcodes 0:$1B2A 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$1B2B 0:data:reset=0:$5B2E 0:$1B2C 0:000011:A1=A3:D0=D0 jp millicoded // * Millicoded 0:$1B2D d15:data:reset=0:$5F70 0:$1B2E d15:data:reset=0:$5FF9 mc MDrop0_Next-3 : null_io__8DrvrDataC_6uint32_6uint16AEC_6uint16_6uint16_3Err ( DrvrData¢, uint32, uint16[]¢, uint16, uint16 -- Err ) Millicoded // Size: 6 microcodes 0:$1C4E 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$1C4F 0:data:reset=0:$5C52 0:$1C50 0:000011:A1=A4:D0=D0 jp millicoded // * Millicoded 0:$1C51 d15:data:reset=0:$5F70 0:$1C52 d15:data:reset=0:$0D00 mc Int8+0 0:$1C53 d15:data:reset=0:$630B mc MNip0_Next-6 // --- file: "BlockDevice.asm" --- #if include_filesystem #include "Block.cc" #include "File.cc" #include "Dir.cc" #endif #include "99_bottles_of_beer.cc" // +++ file: "99_bottles_of_beer.asm" +++ // K1-16/16 Microcode // 2015-12-22 16:10:40 : bob__5int16_8ucs2charAE ( int16 -- ucs2str ) Millicoded // Size: 56 microcodes 0:$2E2A 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$2E2B 0:data:reset=0:$6E2E 0:$2E2C 0:000011:A1=A6:D0=D0 jp millicoded // * Millicoded 0:$2E2D d15:data:reset=0:$5F70 0:$2E2E d15:data:reset=0:$45F6 mc Dup 0:$2E2F d15:data:reset=0:$0D00 mc Int8+0 0:$2E30 d15:data:reset=0:$C2D4 mc Gt 0:$2E31 d15:data:reset=0:$0603 mc BraIf0+3 0:$2E32 d15:data:reset=0:$45F6 mc Dup 0:$2E33 d15:data:reset=0:$6453 mc numstr__5int16_8ucs2charAE 0:$2E34 d15:data:reset=0:$020F mc Bra+15 0:$2E35 d15:data:reset=0:$45F6 mc Dup 0:$2E36 d15:data:reset=0:$0602 mc BraIf0+2 0:$2E37 d15:data:reset=0:$0D4E mc Int8+78 0:$2E38 d15:data:reset=0:$0201 mc Bra+1 0:$2E39 d15:data:reset=0:$0D6E mc Int8+110 0:$2E3A d15:data:reset=0:$6107 mc CharStr 0:$2E3B d15:data:reset=0:$0F06 mc Istr+6 0:$2E3C 0:data:reset=0:$006F dm 'o' 0:$2E3D 0:data:reset=0:$0020 dm ' ' 0:$2E3E 0:data:reset=0:$006D dm 'm' 0:$2E3F 0:data:reset=0:$006F dm 'o' 0:$2E40 0:data:reset=0:$0072 dm 'r' 0:$2E41 0:data:reset=0:$0065 dm 'e' 0:$2E42 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$2E43 d15:data:reset=0:$6AAF mc CatStrStr 0:$2E44 d15:data:reset=0:$0F07 mc Istr+7 0:$2E45 0:data:reset=0:$0020 dm ' ' 0:$2E46 0:data:reset=0:$0062 dm 'b' 0:$2E47 0:data:reset=0:$006F dm 'o' 0:$2E48 0:data:reset=0:$0064 dm 'd' 0:$2E49 0:data:reset=0:$0064 dm 'd' 0:$2E4A 0:data:reset=0:$006C dm 'l' 0:$2E4B 0:data:reset=0:$0065 dm 'e' 0:$2E4C 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$2E4D d15:data:reset=0:$6AAF mc CatStrStr 0:$2E4E d15:data:reset=0:$18FF mc Lget+255 0:$2E4F d15:data:reset=0:$0C01 mc Subq+1 0:$2E50 d15:data:reset=0:$0604 mc BraIf0+4 0:$2E51 d15:data:reset=0:$0F01 mc Istr+1 0:$2E52 0:data:reset=0:$0073 dm 's' 0:$2E53 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$2E54 d15:data:reset=0:$0202 mc Bra+2 0:$2E55 d15:data:reset=0:$0F00 mc Istr+0 0:$2E56 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$2E57 d15:data:reset=0:$6AAF mc CatStrStr 0:$2E58 d15:data:reset=0:$0F06 mc Istr+6 0:$2E59 0:data:reset=0:$0020 dm ' ' 0:$2E5A 0:data:reset=0:$006F dm 'o' 0:$2E5B 0:data:reset=0:$0066 dm 'f' 0:$2E5C 0:data:reset=0:$0020 dm ' ' 0:$2E5D 0:data:reset=0:$00F8 dm 248 0:$2E5E 0:data:reset=0:$006C dm 'l' 0:$2E5F 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$2E60 d15:data:reset=0:$6AAF mc CatStrStr 0:$2E61 d15:data:reset=0:$6310 mc MNip0_Next-1 : bobo__5int16_8ucs2charAE ( int16 -- ucs2str ) Millicoded // Size: 22 microcodes 0:$25C8 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$25C9 0:data:reset=0:$65CC 0:$25CA 0:000011:A1=A5:D0=D0 jp millicoded // * Millicoded 0:$25CB d15:data:reset=0:$5F70 0:$25CC d15:data:reset=0:$45F6 mc Dup 0:$25CD d15:data:reset=0:$6E2A mc bob__5int16_8ucs2charAE 0:$25CE d15:data:reset=0:$0F0C mc Istr+12 0:$25CF 0:data:reset=0:$0020 dm ' ' 0:$25D0 0:data:reset=0:$006F dm 'o' 0:$25D1 0:data:reset=0:$006E dm 'n' 0:$25D2 0:data:reset=0:$0020 dm ' ' 0:$25D3 0:data:reset=0:$0074 dm 't' 0:$25D4 0:data:reset=0:$0068 dm 'h' 0:$25D5 0:data:reset=0:$0065 dm 'e' 0:$25D6 0:data:reset=0:$0020 dm ' ' 0:$25D7 0:data:reset=0:$0077 dm 'w' 0:$25D8 0:data:reset=0:$00E5 dm 229 0:$25D9 0:data:reset=0:$006C dm 'l' 0:$25DA 0:data:reset=0:$006C dm 'l' 0:$25DB 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$25DC d15:data:reset=0:$6AAF mc CatStrStr 0:$25DD d15:data:reset=0:$6310 mc MNip0_Next-1 : sing_99_bottles_of_beer__2FDC_5int16_ ( FD¢, int16 ) Millicoded // Size: 121 microcodes 0:$3C04 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$3C05 0:data:reset=0:$7C08 0:$3C06 0:000011:A1=A4:D0=D0 jp millicoded // * Millicoded 0:$3C07 d15:data:reset=0:$5F70 0:$3C08 d15:data:reset=0:$18FF mc Lget+255 0:$3C09 d15:data:reset=0:$18FF mc Lget+255 0:$3C0A d15:data:reset=0:$18FE mc Lget+254 0:$3C0B d15:data:reset=0:$4823 mc Not 0:$3C0C d15:data:reset=0:$5BAC mc Sub 0:$3C0D d15:data:reset=0:$65C8 mc bobo__5int16_8ucs2charAE 0:$3C0E d15:data:reset=0:$0F02 mc Istr+2 0:$3C0F 0:data:reset=0:$002C dm ',' 0:$3C10 0:data:reset=0:$0020 dm ' ' 0:$3C11 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$3C12 d15:data:reset=0:$6AAF mc CatStrStr 0:$3C13 d15:data:reset=0:$18FE mc Lget+254 0:$3C14 d15:data:reset=0:$6E2A mc bob__5int16_8ucs2charAE 0:$3C15 d15:data:reset=0:$6AAF mc CatStrStr 0:$3C16 d15:data:reset=0:$0D2E mc Int8+46 0:$3C17 d15:data:reset=0:$5F54 mc CatStrChar 0:$3C18 d15:data:reset=0:$0D0A mc Int8+10 0:$3C19 d15:data:reset=0:$5F54 mc CatStrChar 0:$3C1A d15:data:reset=0:$5E75 mc FD__putstr__2FDC_8ucs2charAE_ 0:$3C1B d15:data:reset=0:$45F6 mc Dup 0:$3C1C d15:data:reset=0:$0D00 mc Int8+0 0:$3C1D d15:data:reset=0:$C2D4 mc Gt 0:$3C1E d15:data:reset=0:$0630 mc BraIf0+48 0:$3C1F d15:data:reset=0:$18FF mc Lget+255 0:$3C20 d15:data:reset=0:$0F21 mc Istr+33 0:$3C21 0:data:reset=0:$0054 dm 'T' 0:$3C22 0:data:reset=0:$0061 dm 'a' 0:$3C23 0:data:reset=0:$006B dm 'k' 0:$3C24 0:data:reset=0:$0065 dm 'e' 0:$3C25 0:data:reset=0:$0020 dm ' ' 0:$3C26 0:data:reset=0:$006F dm 'o' 0:$3C27 0:data:reset=0:$006E dm 'n' 0:$3C28 0:data:reset=0:$0065 dm 'e' 0:$3C29 0:data:reset=0:$0020 dm ' ' 0:$3C2A 0:data:reset=0:$0064 dm 'd' 0:$3C2B 0:data:reset=0:$006F dm 'o' 0:$3C2C 0:data:reset=0:$0077 dm 'w' 0:$3C2D 0:data:reset=0:$006E dm 'n' 0:$3C2E 0:data:reset=0:$0020 dm ' ' 0:$3C2F 0:data:reset=0:$0061 dm 'a' 0:$3C30 0:data:reset=0:$006E dm 'n' 0:$3C31 0:data:reset=0:$0064 dm 'd' 0:$3C32 0:data:reset=0:$0020 dm ' ' 0:$3C33 0:data:reset=0:$0070 dm 'p' 0:$3C34 0:data:reset=0:$0061 dm 'a' 0:$3C35 0:data:reset=0:$0073 dm 's' 0:$3C36 0:data:reset=0:$0073 dm 's' 0:$3C37 0:data:reset=0:$0020 dm ' ' 0:$3C38 0:data:reset=0:$0069 dm 'i' 0:$3C39 0:data:reset=0:$0074 dm 't' 0:$3C3A 0:data:reset=0:$0020 dm ' ' 0:$3C3B 0:data:reset=0:$0061 dm 'a' 0:$3C3C 0:data:reset=0:$0072 dm 'r' 0:$3C3D 0:data:reset=0:$006F dm 'o' 0:$3C3E 0:data:reset=0:$0075 dm 'u' 0:$3C3F 0:data:reset=0:$006E dm 'n' 0:$3C40 0:data:reset=0:$002C dm ',' 0:$3C41 0:data:reset=0:$0020 dm ' ' 0:$3C42 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$3C43 d15:data:reset=0:$07FE mc Lvar+254 0:$3C44 d15:data:reset=0:$5D58 mc mmPeek 0:$3C45 d15:data:reset=0:$65C8 mc bobo__5int16_8ucs2charAE 0:$3C46 d15:data:reset=0:$6AAF mc CatStrStr 0:$3C47 d15:data:reset=0:$0F03 mc Istr+3 0:$3C48 0:data:reset=0:$002E dm '.' 0:$3C49 0:data:reset=0:$000A dm 10 0:$3C4A 0:data:reset=0:$000A dm 10 0:$3C4B 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$3C4C d15:data:reset=0:$6AAF mc CatStrStr 0:$3C4D d15:data:reset=0:$5E75 mc FD__putstr__2FDC_8ucs2charAE_ 0:$3C4E d15:data:reset=0:$01B9 mc Bra-71 0:$3C4F d15:data:reset=0:$18FF mc Lget+255 0:$3C50 d15:data:reset=0:$0F22 mc Istr+34 0:$3C51 0:data:reset=0:$0047 dm 'G' 0:$3C52 0:data:reset=0:$006F dm 'o' 0:$3C53 0:data:reset=0:$0074 dm 't' 0:$3C54 0:data:reset=0:$006F dm 'o' 0:$3C55 0:data:reset=0:$0020 dm ' ' 0:$3C56 0:data:reset=0:$0074 dm 't' 0:$3C57 0:data:reset=0:$0068 dm 'h' 0:$3C58 0:data:reset=0:$0065 dm 'e' 0:$3C59 0:data:reset=0:$0020 dm ' ' 0:$3C5A 0:data:reset=0:$0073 dm 's' 0:$3C5B 0:data:reset=0:$0074 dm 't' 0:$3C5C 0:data:reset=0:$006F dm 'o' 0:$3C5D 0:data:reset=0:$0072 dm 'r' 0:$3C5E 0:data:reset=0:$0065 dm 'e' 0:$3C5F 0:data:reset=0:$0020 dm ' ' 0:$3C60 0:data:reset=0:$0061 dm 'a' 0:$3C61 0:data:reset=0:$006E dm 'n' 0:$3C62 0:data:reset=0:$0064 dm 'd' 0:$3C63 0:data:reset=0:$0020 dm ' ' 0:$3C64 0:data:reset=0:$0062 dm 'b' 0:$3C65 0:data:reset=0:$0075 dm 'u' 0:$3C66 0:data:reset=0:$0079 dm 'y' 0:$3C67 0:data:reset=0:$0020 dm ' ' 0:$3C68 0:data:reset=0:$0073 dm 's' 0:$3C69 0:data:reset=0:$006F dm 'o' 0:$3C6A 0:data:reset=0:$006D dm 'm' 0:$3C6B 0:data:reset=0:$0065 dm 'e' 0:$3C6C 0:data:reset=0:$0020 dm ' ' 0:$3C6D 0:data:reset=0:$006D dm 'm' 0:$3C6E 0:data:reset=0:$006F dm 'o' 0:$3C6F 0:data:reset=0:$0072 dm 'r' 0:$3C70 0:data:reset=0:$0065 dm 'e' 0:$3C71 0:data:reset=0:$002C dm ',' 0:$3C72 0:data:reset=0:$0020 dm ' ' 0:$3C73 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$3C74 d15:data:reset=0:$0D63 mc Int8+99 0:$3C75 d15:data:reset=0:$65C8 mc bobo__5int16_8ucs2charAE 0:$3C76 d15:data:reset=0:$6AAF mc CatStrStr 0:$3C77 d15:data:reset=0:$0D2E mc Int8+46 0:$3C78 d15:data:reset=0:$5F54 mc CatStrChar 0:$3C79 d15:data:reset=0:$0D0A mc Int8+10 0:$3C7A d15:data:reset=0:$5F54 mc CatStrChar 0:$3C7B d15:data:reset=0:$5E75 mc FD__putstr__2FDC_8ucs2charAE_ 0:$3C7C d15:data:reset=0:$5FFA mc MDrop0_Next-2 // --- file: "99_bottles_of_beer.asm" --- #include "bcc.cc" // +++ file: "bcc.asm" +++ // K1-16/16 Microcode // 2015-12-22 16:10:40 : implicit__bcc__kill__6uint16AEAE_6uint16AEAE ( uint16[][] -- uint16[][] ) Millicoded // Size: 12 microcodes 0:$1FB8 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$1FB9 0:data:reset=0:$5FBC 0:$1FBA 0:000011:A1=A7:D0=D0 jp millicoded // * Millicoded 0:$1FBB d15:data:reset=0:$5F70 0:$1FBC d15:data:reset=0:$45F6 mc Dup 0:$1FBD d15:data:reset=0:$473D mc ForAllItems 0:$1FBE d15:data:reset=0:$0202 mc Bra+2 0:$1FBF d15:data:reset=0:$5AC5 mc Peek 0:$1FC0 d15:data:reset=0:$4581 mc DropStr 0:$1FC1 d15:data:reset=0:$43ED mc mmNextItem 0:$1FC2 d15:data:reset=0:$01FC mc Bra-4 0:$1FC3 d15:data:reset=0:$5ACD mc Ret : BytecodeCompiler__init__16BytecodeCompilerC_6uint16_6uint16AEC_6uint16AEC_6uint16_4bool_ ( BytecodeCompiler¢, uint16, uint16[]¢, uint16[]¢, uint16, bool ) Millicoded // Size: 876 microcodes 0:$3585 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$3586 0:data:reset=0:$7589 0:$3587 0:000011:A1=A5:D0=D0 jp millicoded // * Millicoded 0:$3588 d15:data:reset=0:$5F70 0:$3589 d15:data:reset=0:$18FC mc Lget+252 0:$358A d15:data:reset=0:$18FA mc Lget+250 0:$358B d15:data:reset=0:$230A mc ItemSet+10 0:$358C d15:data:reset=0:$0D80 mc Int8+128 0:$358D d15:data:reset=0:$4203 mc Alloc 0:$358E d15:data:reset=0:$18FA mc Lget+250 0:$358F d15:data:reset=0:$230B mc ItemSet+11 0:$3590 d15:data:reset=0:$18FE mc Lget+254 0:$3591 d15:data:reset=0:$4667 mc Retain 0:$3592 d15:data:reset=0:$18FA mc Lget+250 0:$3593 d15:data:reset=0:$2307 mc ItemSet+7 0:$3594 d15:data:reset=0:$9F11 mc Gget+gdata_ptr 0:$3595 d15:data:reset=0:$18FA mc Lget+250 0:$3596 d15:data:reset=0:$2309 mc ItemSet+9 0:$3597 d15:data:reset=0:$18FE mc Lget+254 0:$3598 d15:data:reset=0:$482D mc Count 0:$3599 d15:data:reset=0:$0D11 mc Gvar+gdata_ptr 0:$359A d15:data:reset=0:$5DA8 mc AddPoke 0:$359B d15:data:reset=0:$0F4E mc Istr+78 0:$359C 0:data:reset=0:$A400 dm LDQ 0:$359D 0:data:reset=0:$5AFB dm IVAL 0:$359E 0:data:reset=0:$6247 dm ISTR 0:$359F 0:data:reset=0:$6247 dm ISTR 0:$35A0 0:data:reset=0:$5AD5 dm SWAPBYTES 0:$35A1 0:data:reset=0:$5AD9 dm CASTwl2b 0:$35A2 0:data:reset=0:$5C3C dm CASTwh2b 0:$35A3 0:data:reset=0:$59EE dm CPL 0:$35A4 0:data:reset=0:$5361 dm NOT 0:$35A5 0:data:reset=0:$5B39 dm MSBIT 0:$35A6 0:data:reset=0:$5AED dm ADD 0:$35A7 0:data:reset=0:$5BD9 dm SUB 0:$35A8 0:data:reset=0:$C405 dm MULU 0:$35A9 0:data:reset=0:$C1B4 dm DIVU 0:$35AA 0:data:reset=0:$5A25 dm REMU 0:$35AB 0:data:reset=0:$59CD dm AND 0:$35AC 0:data:reset=0:$5A18 dm OR 0:$35AD 0:data:reset=0:$59D0 dm XOR 0:$35AE 0:data:reset=0:$51A2 dm SL 0:$35AF 0:data:reset=0:$51DB dm SRU 0:$35B0 0:data:reset=0:$532E dm EQ 0:$35B1 0:data:reset=0:$533A dm NE 0:$35B2 0:data:reset=0:$5340 dm ULT 0:$35B3 0:data:reset=0:$D340 dm ULE 0:$35B4 0:data:reset=0:$D334 dm UGT 0:$35B5 0:data:reset=0:$5334 dm UGE 0:$35B6 0:data:reset=0:$5356 dm UMIN 0:$35B7 0:data:reset=0:$2400 dm LVAR 0:$35B8 0:data:reset=0:$A400 dm GVAR 0:$35B9 0:data:reset=0:$2100 dm IVAR 0:$35BA 0:data:reset=0:$5B48 dm ATI 0:$35BB 0:data:reset=0:$5CC1 dm ATIPEEK 0:$35BC 0:data:reset=0:$5E63 dm ATIPOKE 0:$35BD 0:data:reset=0:$1F00 dm LGET 0:$35BE 0:data:reset=0:$A300 dm LSET 0:$35BF 0:data:reset=0:$8B00 dm GGET 0:$35C0 0:data:reset=0:$A200 dm GSET 0:$35C1 0:data:reset=0:$1B00 dm IGET 0:$35C2 0:data:reset=0:$9E00 dm ISET 0:$35C3 0:data:reset=0:$5D60 dm ADDPOKE 0:$35C4 0:data:reset=0:$5DC8 dm SUBPOKE 0:$35C5 0:data:reset=0:$5C97 dm ANDPOKE 0:$35C6 0:data:reset=0:$5C90 dm ORPOKE 0:$35C7 0:data:reset=0:$5DA0 dm PEEKPP 0:$35C8 0:data:reset=0:$5DE0 dm MMPEEK 0:$35C9 0:data:reset=0:$1F00 dm LGET 0:$35CA 0:data:reset=0:$8B00 dm GGET 0:$35CB 0:data:reset=0:$1B00 dm IGET 0:$35CC 0:data:reset=0:$5C7E dm POKE 0:$35CD 0:data:reset=0:$5361 dm NOT 0:$35CE 0:data:reset=0:$C203 dm ALLOC 0:$35CF 0:data:reset=0:$C203 dm ALLOC 0:$35D0 0:data:reset=0:$C203 dm ALLOC 0:$35D1 0:data:reset=0:$5B57 dm COUNT 0:$35D2 0:data:reset=0:$5B57 dm COUNT 0:$35D3 0:data:reset=0:$5C12 dm COPY__6uint16AEC_6uint16_6uint16AEC_6uint16_6uint16_ 0:$35D4 0:data:reset=0:$5C12 dm COPY__6uint16AEC_6uint16_6uint16AEC_6uint16_6uint16_ 0:$35D5 0:data:reset=0:$5186 dm DROPSTR 0:$35D6 0:data:reset=0:$5A79 dm IN 0:$35D7 0:data:reset=0:$5D0A dm OUT 0:$35D8 0:data:reset=0:$5B5C dm BIN 0:$35D9 0:data:reset=0:$5B66 dm BOUT 0:$35DA 0:data:reset=0:$5A35 dm I2C_READ_DATA__6uint16_6uint16AEC_6uint16_6uint16_6uint16 0:$35DB 0:data:reset=0:$5A29 dm I2C_WRITE_DATA__6uint16_6uint16AEC_6uint16_6uint16_6uint16 0:$35DC 0:data:reset=0:$6406 dm SELECT 0:$35DD 0:data:reset=0:$5BE3 dm DESELECT 0:$35DE 0:data:reset=0:$660B dm SYSTEMTIMER 0:$35DF 0:data:reset=0:$D22C dm HALT 0:$35E0 0:data:reset=0:$6283 dm SYSTIME__6uint16 0:$35E1 0:data:reset=0:$3F00 dm BRA_P 0:$35E2 0:data:reset=0:$BD00 dm BRAZ_P 0:$35E3 0:data:reset=0:$BB00 dm BRANZ_P 0:$35E4 0:data:reset=0:$1300 dm AND0 0:$35E5 0:data:reset=0:$1400 dm OR1 0:$35E6 0:data:reset=0:$52D6 dm SWITCH 0:$35E7 0:data:reset=0:$5D2D dm JSR 0:$35E8 0:data:reset=0:$5B8A dm RET 0:$35E9 0:data:reset=0:$5A04 dm NOP 0:$35EA 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$35EB d15:data:reset=0:$18FA mc Lget+250 0:$35EC d15:data:reset=0:$2300 mc ItemSet+0 // info: start of array items 0:$35ED d15:data:reset=0:$0F06 mc Istr+6 0:$35EE 0:data:reset=0:$0069 dm 'i' 0:$35EF 0:data:reset=0:$0076 dm 'v' 0:$35F0 0:data:reset=0:$0061 dm 'a' 0:$35F1 0:data:reset=0:$006C dm 'l' 0:$35F2 0:data:reset=0:$002E dm '.' 0:$35F3 0:data:reset=0:$0062 dm 'b' 0:$35F4 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$35F5 d15:data:reset=0:$0F04 mc Istr+4 0:$35F6 0:data:reset=0:$0069 dm 'i' 0:$35F7 0:data:reset=0:$0076 dm 'v' 0:$35F8 0:data:reset=0:$0061 dm 'a' 0:$35F9 0:data:reset=0:$006C dm 'l' 0:$35FA 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$35FB d15:data:reset=0:$0F08 mc Istr+8 0:$35FC 0:data:reset=0:$0069 dm 'i' 0:$35FD 0:data:reset=0:$0076 dm 'v' 0:$35FE 0:data:reset=0:$0061 dm 'a' 0:$35FF 0:data:reset=0:$006C dm 'l' 0:$3600 0:data:reset=0:$002E dm '.' 0:$3601 0:data:reset=0:$0062 dm 'b' 0:$3602 0:data:reset=0:$005B dm '[' 0:$3603 0:data:reset=0:$005D dm ']' 0:$3604 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$3605 d15:data:reset=0:$0F08 mc Istr+8 0:$3606 0:data:reset=0:$0069 dm 'i' 0:$3607 0:data:reset=0:$0076 dm 'v' 0:$3608 0:data:reset=0:$0061 dm 'a' 0:$3609 0:data:reset=0:$006C dm 'l' 0:$360A 0:data:reset=0:$002E dm '.' 0:$360B 0:data:reset=0:$0077 dm 'w' 0:$360C 0:data:reset=0:$005B dm '[' 0:$360D 0:data:reset=0:$005D dm ']' 0:$360E 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$360F d15:data:reset=0:$0F04 mc Istr+4 0:$3610 0:data:reset=0:$0073 dm 's' 0:$3611 0:data:reset=0:$0077 dm 'w' 0:$3612 0:data:reset=0:$0061 dm 'a' 0:$3613 0:data:reset=0:$0070 dm 'p' 0:$3614 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$3615 d15:data:reset=0:$0F06 mc Istr+6 0:$3616 0:data:reset=0:$0067 dm 'g' 0:$3617 0:data:reset=0:$0065 dm 'e' 0:$3618 0:data:reset=0:$0074 dm 't' 0:$3619 0:data:reset=0:$005F dm '_' 0:$361A 0:data:reset=0:$006C dm 'l' 0:$361B 0:data:reset=0:$006F dm 'o' 0:$361C 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$361D d15:data:reset=0:$0F06 mc Istr+6 0:$361E 0:data:reset=0:$0067 dm 'g' 0:$361F 0:data:reset=0:$0065 dm 'e' 0:$3620 0:data:reset=0:$0074 dm 't' 0:$3621 0:data:reset=0:$005F dm '_' 0:$3622 0:data:reset=0:$0068 dm 'h' 0:$3623 0:data:reset=0:$0069 dm 'i' 0:$3624 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$3625 d15:data:reset=0:$0F03 mc Istr+3 0:$3626 0:data:reset=0:$0063 dm 'c' 0:$3627 0:data:reset=0:$0070 dm 'p' 0:$3628 0:data:reset=0:$006C dm 'l' 0:$3629 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$362A d15:data:reset=0:$0F03 mc Istr+3 0:$362B 0:data:reset=0:$006E dm 'n' 0:$362C 0:data:reset=0:$006F dm 'o' 0:$362D 0:data:reset=0:$0074 dm 't' 0:$362E 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$362F d15:data:reset=0:$0F05 mc Istr+5 0:$3630 0:data:reset=0:$006D dm 'm' 0:$3631 0:data:reset=0:$0073 dm 's' 0:$3632 0:data:reset=0:$0062 dm 'b' 0:$3633 0:data:reset=0:$0069 dm 'i' 0:$3634 0:data:reset=0:$0074 dm 't' 0:$3635 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$3636 d15:data:reset=0:$0F03 mc Istr+3 0:$3637 0:data:reset=0:$0061 dm 'a' 0:$3638 0:data:reset=0:$0064 dm 'd' 0:$3639 0:data:reset=0:$0064 dm 'd' 0:$363A 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$363B d15:data:reset=0:$0F03 mc Istr+3 0:$363C 0:data:reset=0:$0073 dm 's' 0:$363D 0:data:reset=0:$0075 dm 'u' 0:$363E 0:data:reset=0:$0062 dm 'b' 0:$363F 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$3640 d15:data:reset=0:$0F03 mc Istr+3 0:$3641 0:data:reset=0:$006D dm 'm' 0:$3642 0:data:reset=0:$0075 dm 'u' 0:$3643 0:data:reset=0:$006C dm 'l' 0:$3644 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$3645 d15:data:reset=0:$0F03 mc Istr+3 0:$3646 0:data:reset=0:$0064 dm 'd' 0:$3647 0:data:reset=0:$0069 dm 'i' 0:$3648 0:data:reset=0:$0076 dm 'v' 0:$3649 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$364A d15:data:reset=0:$0F03 mc Istr+3 0:$364B 0:data:reset=0:$0072 dm 'r' 0:$364C 0:data:reset=0:$0065 dm 'e' 0:$364D 0:data:reset=0:$006D dm 'm' 0:$364E 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$364F d15:data:reset=0:$0F03 mc Istr+3 0:$3650 0:data:reset=0:$0061 dm 'a' 0:$3651 0:data:reset=0:$006E dm 'n' 0:$3652 0:data:reset=0:$0064 dm 'd' 0:$3653 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$3654 d15:data:reset=0:$0F02 mc Istr+2 0:$3655 0:data:reset=0:$006F dm 'o' 0:$3656 0:data:reset=0:$0072 dm 'r' 0:$3657 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$3658 d15:data:reset=0:$0F03 mc Istr+3 0:$3659 0:data:reset=0:$0078 dm 'x' 0:$365A 0:data:reset=0:$006F dm 'o' 0:$365B 0:data:reset=0:$0072 dm 'r' 0:$365C 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$365D d15:data:reset=0:$0F02 mc Istr+2 0:$365E 0:data:reset=0:$0073 dm 's' 0:$365F 0:data:reset=0:$006C dm 'l' 0:$3660 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$3661 d15:data:reset=0:$0F02 mc Istr+2 0:$3662 0:data:reset=0:$0073 dm 's' 0:$3663 0:data:reset=0:$0072 dm 'r' 0:$3664 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$3665 d15:data:reset=0:$0F02 mc Istr+2 0:$3666 0:data:reset=0:$0065 dm 'e' 0:$3667 0:data:reset=0:$0071 dm 'q' 0:$3668 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$3669 d15:data:reset=0:$0F02 mc Istr+2 0:$366A 0:data:reset=0:$006E dm 'n' 0:$366B 0:data:reset=0:$0065 dm 'e' 0:$366C 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$366D d15:data:reset=0:$0F02 mc Istr+2 0:$366E 0:data:reset=0:$006C dm 'l' 0:$366F 0:data:reset=0:$0074 dm 't' 0:$3670 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$3671 d15:data:reset=0:$0F02 mc Istr+2 0:$3672 0:data:reset=0:$006C dm 'l' 0:$3673 0:data:reset=0:$0065 dm 'e' 0:$3674 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$3675 d15:data:reset=0:$0F02 mc Istr+2 0:$3676 0:data:reset=0:$0067 dm 'g' 0:$3677 0:data:reset=0:$0074 dm 't' 0:$3678 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$3679 d15:data:reset=0:$0F02 mc Istr+2 0:$367A 0:data:reset=0:$0067 dm 'g' 0:$367B 0:data:reset=0:$0065 dm 'e' 0:$367C 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$367D d15:data:reset=0:$0F03 mc Istr+3 0:$367E 0:data:reset=0:$006D dm 'm' 0:$367F 0:data:reset=0:$0069 dm 'i' 0:$3680 0:data:reset=0:$006E dm 'n' 0:$3681 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$3682 d15:data:reset=0:$0F04 mc Istr+4 0:$3683 0:data:reset=0:$006C dm 'l' 0:$3684 0:data:reset=0:$0076 dm 'v' 0:$3685 0:data:reset=0:$0061 dm 'a' 0:$3686 0:data:reset=0:$0072 dm 'r' 0:$3687 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$3688 d15:data:reset=0:$0F04 mc Istr+4 0:$3689 0:data:reset=0:$0067 dm 'g' 0:$368A 0:data:reset=0:$0076 dm 'v' 0:$368B 0:data:reset=0:$0061 dm 'a' 0:$368C 0:data:reset=0:$0072 dm 'r' 0:$368D 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$368E d15:data:reset=0:$0F04 mc Istr+4 0:$368F 0:data:reset=0:$0069 dm 'i' 0:$3690 0:data:reset=0:$0076 dm 'v' 0:$3691 0:data:reset=0:$0061 dm 'a' 0:$3692 0:data:reset=0:$0072 dm 'r' 0:$3693 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$3694 d15:data:reset=0:$0F03 mc Istr+3 0:$3695 0:data:reset=0:$0061 dm 'a' 0:$3696 0:data:reset=0:$0074 dm 't' 0:$3697 0:data:reset=0:$0069 dm 'i' 0:$3698 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$3699 d15:data:reset=0:$0F06 mc Istr+6 0:$369A 0:data:reset=0:$0061 dm 'a' 0:$369B 0:data:reset=0:$0074 dm 't' 0:$369C 0:data:reset=0:$0069 dm 'i' 0:$369D 0:data:reset=0:$0067 dm 'g' 0:$369E 0:data:reset=0:$0065 dm 'e' 0:$369F 0:data:reset=0:$0074 dm 't' 0:$36A0 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$36A1 d15:data:reset=0:$0F06 mc Istr+6 0:$36A2 0:data:reset=0:$0061 dm 'a' 0:$36A3 0:data:reset=0:$0074 dm 't' 0:$36A4 0:data:reset=0:$0069 dm 'i' 0:$36A5 0:data:reset=0:$0073 dm 's' 0:$36A6 0:data:reset=0:$0065 dm 'e' 0:$36A7 0:data:reset=0:$0074 dm 't' 0:$36A8 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$36A9 d15:data:reset=0:$0F04 mc Istr+4 0:$36AA 0:data:reset=0:$006C dm 'l' 0:$36AB 0:data:reset=0:$0067 dm 'g' 0:$36AC 0:data:reset=0:$0065 dm 'e' 0:$36AD 0:data:reset=0:$0074 dm 't' 0:$36AE 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$36AF d15:data:reset=0:$0F04 mc Istr+4 0:$36B0 0:data:reset=0:$006C dm 'l' 0:$36B1 0:data:reset=0:$0073 dm 's' 0:$36B2 0:data:reset=0:$0065 dm 'e' 0:$36B3 0:data:reset=0:$0074 dm 't' 0:$36B4 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$36B5 d15:data:reset=0:$0F04 mc Istr+4 0:$36B6 0:data:reset=0:$0067 dm 'g' 0:$36B7 0:data:reset=0:$0067 dm 'g' 0:$36B8 0:data:reset=0:$0065 dm 'e' 0:$36B9 0:data:reset=0:$0074 dm 't' 0:$36BA 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$36BB d15:data:reset=0:$0F04 mc Istr+4 0:$36BC 0:data:reset=0:$0067 dm 'g' 0:$36BD 0:data:reset=0:$0073 dm 's' 0:$36BE 0:data:reset=0:$0065 dm 'e' 0:$36BF 0:data:reset=0:$0074 dm 't' 0:$36C0 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$36C1 d15:data:reset=0:$0F04 mc Istr+4 0:$36C2 0:data:reset=0:$0069 dm 'i' 0:$36C3 0:data:reset=0:$0067 dm 'g' 0:$36C4 0:data:reset=0:$0065 dm 'e' 0:$36C5 0:data:reset=0:$0074 dm 't' 0:$36C6 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$36C7 d15:data:reset=0:$0F04 mc Istr+4 0:$36C8 0:data:reset=0:$0069 dm 'i' 0:$36C9 0:data:reset=0:$0073 dm 's' 0:$36CA 0:data:reset=0:$0065 dm 'e' 0:$36CB 0:data:reset=0:$0074 dm 't' 0:$36CC 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$36CD d15:data:reset=0:$0F05 mc Istr+5 0:$36CE 0:data:reset=0:$0061 dm 'a' 0:$36CF 0:data:reset=0:$0064 dm 'd' 0:$36D0 0:data:reset=0:$0064 dm 'd' 0:$36D1 0:data:reset=0:$0067 dm 'g' 0:$36D2 0:data:reset=0:$006C dm 'l' 0:$36D3 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$36D4 d15:data:reset=0:$0F05 mc Istr+5 0:$36D5 0:data:reset=0:$0073 dm 's' 0:$36D6 0:data:reset=0:$0075 dm 'u' 0:$36D7 0:data:reset=0:$0062 dm 'b' 0:$36D8 0:data:reset=0:$0067 dm 'g' 0:$36D9 0:data:reset=0:$006C dm 'l' 0:$36DA 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$36DB d15:data:reset=0:$0F05 mc Istr+5 0:$36DC 0:data:reset=0:$0061 dm 'a' 0:$36DD 0:data:reset=0:$006E dm 'n' 0:$36DE 0:data:reset=0:$0064 dm 'd' 0:$36DF 0:data:reset=0:$0067 dm 'g' 0:$36E0 0:data:reset=0:$006C dm 'l' 0:$36E1 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$36E2 d15:data:reset=0:$0F04 mc Istr+4 0:$36E3 0:data:reset=0:$006F dm 'o' 0:$36E4 0:data:reset=0:$0072 dm 'r' 0:$36E5 0:data:reset=0:$0067 dm 'g' 0:$36E6 0:data:reset=0:$006C dm 'l' 0:$36E7 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$36E8 d15:data:reset=0:$0F06 mc Istr+6 0:$36E9 0:data:reset=0:$0070 dm 'p' 0:$36EA 0:data:reset=0:$0065 dm 'e' 0:$36EB 0:data:reset=0:$0065 dm 'e' 0:$36EC 0:data:reset=0:$006B dm 'k' 0:$36ED 0:data:reset=0:$0070 dm 'p' 0:$36EE 0:data:reset=0:$0070 dm 'p' 0:$36EF 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$36F0 d15:data:reset=0:$0F06 mc Istr+6 0:$36F1 0:data:reset=0:$006D dm 'm' 0:$36F2 0:data:reset=0:$006D dm 'm' 0:$36F3 0:data:reset=0:$0070 dm 'p' 0:$36F4 0:data:reset=0:$0065 dm 'e' 0:$36F5 0:data:reset=0:$0065 dm 'e' 0:$36F6 0:data:reset=0:$006B dm 'k' 0:$36F7 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$36F8 d15:data:reset=0:$0F04 mc Istr+4 0:$36F9 0:data:reset=0:$006C dm 'l' 0:$36FA 0:data:reset=0:$0067 dm 'g' 0:$36FB 0:data:reset=0:$0065 dm 'e' 0:$36FC 0:data:reset=0:$0074 dm 't' 0:$36FD 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$36FE d15:data:reset=0:$0F04 mc Istr+4 0:$36FF 0:data:reset=0:$0067 dm 'g' 0:$3700 0:data:reset=0:$0067 dm 'g' 0:$3701 0:data:reset=0:$0065 dm 'e' 0:$3702 0:data:reset=0:$0074 dm 't' 0:$3703 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$3704 d15:data:reset=0:$0F04 mc Istr+4 0:$3705 0:data:reset=0:$0069 dm 'i' 0:$3706 0:data:reset=0:$0067 dm 'g' 0:$3707 0:data:reset=0:$0065 dm 'e' 0:$3708 0:data:reset=0:$0074 dm 't' 0:$3709 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$370A d15:data:reset=0:$0F03 mc Istr+3 0:$370B 0:data:reset=0:$0073 dm 's' 0:$370C 0:data:reset=0:$0065 dm 'e' 0:$370D 0:data:reset=0:$0074 dm 't' 0:$370E 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$370F d15:data:reset=0:$0F03 mc Istr+3 0:$3710 0:data:reset=0:$006E dm 'n' 0:$3711 0:data:reset=0:$006F dm 'o' 0:$3712 0:data:reset=0:$0074 dm 't' 0:$3713 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$3714 d15:data:reset=0:$0F05 mc Istr+5 0:$3715 0:data:reset=0:$0061 dm 'a' 0:$3716 0:data:reset=0:$006C dm 'l' 0:$3717 0:data:reset=0:$006C dm 'l' 0:$3718 0:data:reset=0:$006F dm 'o' 0:$3719 0:data:reset=0:$0063 dm 'c' 0:$371A 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$371B d15:data:reset=0:$0F05 mc Istr+5 0:$371C 0:data:reset=0:$0061 dm 'a' 0:$371D 0:data:reset=0:$006C dm 'l' 0:$371E 0:data:reset=0:$006C dm 'l' 0:$371F 0:data:reset=0:$006F dm 'o' 0:$3720 0:data:reset=0:$0063 dm 'c' 0:$3721 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$3722 d15:data:reset=0:$0F07 mc Istr+7 0:$3723 0:data:reset=0:$0061 dm 'a' 0:$3724 0:data:reset=0:$006C dm 'l' 0:$3725 0:data:reset=0:$006C dm 'l' 0:$3726 0:data:reset=0:$006F dm 'o' 0:$3727 0:data:reset=0:$0063 dm 'c' 0:$3728 0:data:reset=0:$002E dm '.' 0:$3729 0:data:reset=0:$0053 dm 'S' 0:$372A 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$372B d15:data:reset=0:$0F05 mc Istr+5 0:$372C 0:data:reset=0:$0063 dm 'c' 0:$372D 0:data:reset=0:$006F dm 'o' 0:$372E 0:data:reset=0:$0075 dm 'u' 0:$372F 0:data:reset=0:$006E dm 'n' 0:$3730 0:data:reset=0:$0074 dm 't' 0:$3731 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$3732 d15:data:reset=0:$0F05 mc Istr+5 0:$3733 0:data:reset=0:$0063 dm 'c' 0:$3734 0:data:reset=0:$006F dm 'o' 0:$3735 0:data:reset=0:$0075 dm 'u' 0:$3736 0:data:reset=0:$006E dm 'n' 0:$3737 0:data:reset=0:$0074 dm 't' 0:$3738 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$3739 d15:data:reset=0:$0F09 mc Istr+9 0:$373A 0:data:reset=0:$0063 dm 'c' 0:$373B 0:data:reset=0:$006F dm 'o' 0:$373C 0:data:reset=0:$0070 dm 'p' 0:$373D 0:data:reset=0:$0079 dm 'y' 0:$373E 0:data:reset=0:$0041 dm 'A' 0:$373F 0:data:reset=0:$0069 dm 'i' 0:$3740 0:data:reset=0:$0041 dm 'A' 0:$3741 0:data:reset=0:$0069 dm 'i' 0:$3742 0:data:reset=0:$006E dm 'n' 0:$3743 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$3744 d15:data:reset=0:$0F09 mc Istr+9 0:$3745 0:data:reset=0:$0063 dm 'c' 0:$3746 0:data:reset=0:$006F dm 'o' 0:$3747 0:data:reset=0:$0070 dm 'p' 0:$3748 0:data:reset=0:$0079 dm 'y' 0:$3749 0:data:reset=0:$0041 dm 'A' 0:$374A 0:data:reset=0:$0069 dm 'i' 0:$374B 0:data:reset=0:$0041 dm 'A' 0:$374C 0:data:reset=0:$0069 dm 'i' 0:$374D 0:data:reset=0:$006E dm 'n' 0:$374E 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$374F d15:data:reset=0:$0F07 mc Istr+7 0:$3750 0:data:reset=0:$0064 dm 'd' 0:$3751 0:data:reset=0:$0069 dm 'i' 0:$3752 0:data:reset=0:$0073 dm 's' 0:$3753 0:data:reset=0:$0070 dm 'p' 0:$3754 0:data:reset=0:$006F dm 'o' 0:$3755 0:data:reset=0:$0073 dm 's' 0:$3756 0:data:reset=0:$0065 dm 'e' 0:$3757 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$3758 d15:data:reset=0:$0F02 mc Istr+2 0:$3759 0:data:reset=0:$0069 dm 'i' 0:$375A 0:data:reset=0:$006E dm 'n' 0:$375B 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$375C d15:data:reset=0:$0F03 mc Istr+3 0:$375D 0:data:reset=0:$006F dm 'o' 0:$375E 0:data:reset=0:$0075 dm 'u' 0:$375F 0:data:reset=0:$0074 dm 't' 0:$3760 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$3761 d15:data:reset=0:$0F03 mc Istr+3 0:$3762 0:data:reset=0:$0062 dm 'b' 0:$3763 0:data:reset=0:$0069 dm 'i' 0:$3764 0:data:reset=0:$006E dm 'n' 0:$3765 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$3766 d15:data:reset=0:$0F04 mc Istr+4 0:$3767 0:data:reset=0:$0062 dm 'b' 0:$3768 0:data:reset=0:$006F dm 'o' 0:$3769 0:data:reset=0:$0075 dm 'u' 0:$376A 0:data:reset=0:$0074 dm 't' 0:$376B 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$376C d15:data:reset=0:$0F07 mc Istr+7 0:$376D 0:data:reset=0:$0072 dm 'r' 0:$376E 0:data:reset=0:$0065 dm 'e' 0:$376F 0:data:reset=0:$0061 dm 'a' 0:$3770 0:data:reset=0:$0064 dm 'd' 0:$3771 0:data:reset=0:$0069 dm 'i' 0:$3772 0:data:reset=0:$0032 dm '2' 0:$3773 0:data:reset=0:$0063 dm 'c' 0:$3774 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$3775 d15:data:reset=0:$0F08 mc Istr+8 0:$3776 0:data:reset=0:$0077 dm 'w' 0:$3777 0:data:reset=0:$0072 dm 'r' 0:$3778 0:data:reset=0:$0069 dm 'i' 0:$3779 0:data:reset=0:$0074 dm 't' 0:$377A 0:data:reset=0:$0065 dm 'e' 0:$377B 0:data:reset=0:$0069 dm 'i' 0:$377C 0:data:reset=0:$0032 dm '2' 0:$377D 0:data:reset=0:$0063 dm 'c' 0:$377E 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$377F d15:data:reset=0:$0F02 mc Istr+2 0:$3780 0:data:reset=0:$0064 dm 'd' 0:$3781 0:data:reset=0:$0069 dm 'i' 0:$3782 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$3783 d15:data:reset=0:$0F02 mc Istr+2 0:$3784 0:data:reset=0:$0065 dm 'e' 0:$3785 0:data:reset=0:$0069 dm 'i' 0:$3786 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$3787 d15:data:reset=0:$0F05 mc Istr+5 0:$3788 0:data:reset=0:$0074 dm 't' 0:$3789 0:data:reset=0:$0069 dm 'i' 0:$378A 0:data:reset=0:$006D dm 'm' 0:$378B 0:data:reset=0:$0065 dm 'e' 0:$378C 0:data:reset=0:$0072 dm 'r' 0:$378D 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$378E d15:data:reset=0:$0F04 mc Istr+4 0:$378F 0:data:reset=0:$0077 dm 'w' 0:$3790 0:data:reset=0:$0061 dm 'a' 0:$3791 0:data:reset=0:$0069 dm 'i' 0:$3792 0:data:reset=0:$0074 dm 't' 0:$3793 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$3794 d15:data:reset=0:$0F07 mc Istr+7 0:$3795 0:data:reset=0:$0073 dm 's' 0:$3796 0:data:reset=0:$0079 dm 'y' 0:$3797 0:data:reset=0:$0073 dm 's' 0:$3798 0:data:reset=0:$0074 dm 't' 0:$3799 0:data:reset=0:$0069 dm 'i' 0:$379A 0:data:reset=0:$006D dm 'm' 0:$379B 0:data:reset=0:$0065 dm 'e' 0:$379C 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$379D d15:data:reset=0:$0F02 mc Istr+2 0:$379E 0:data:reset=0:$006A dm 'j' 0:$379F 0:data:reset=0:$0070 dm 'p' 0:$37A0 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$37A1 d15:data:reset=0:$0F03 mc Istr+3 0:$37A2 0:data:reset=0:$006A dm 'j' 0:$37A3 0:data:reset=0:$0070 dm 'p' 0:$37A4 0:data:reset=0:$0030 dm '0' 0:$37A5 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$37A6 d15:data:reset=0:$0F03 mc Istr+3 0:$37A7 0:data:reset=0:$006A dm 'j' 0:$37A8 0:data:reset=0:$0070 dm 'p' 0:$37A9 0:data:reset=0:$0031 dm '1' 0:$37AA 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$37AB d15:data:reset=0:$0F04 mc Istr+4 0:$37AC 0:data:reset=0:$0061 dm 'a' 0:$37AD 0:data:reset=0:$006E dm 'n' 0:$37AE 0:data:reset=0:$0064 dm 'd' 0:$37AF 0:data:reset=0:$0030 dm '0' 0:$37B0 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$37B1 d15:data:reset=0:$0F03 mc Istr+3 0:$37B2 0:data:reset=0:$006F dm 'o' 0:$37B3 0:data:reset=0:$0072 dm 'r' 0:$37B4 0:data:reset=0:$0031 dm '1' 0:$37B5 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$37B6 d15:data:reset=0:$0F06 mc Istr+6 0:$37B7 0:data:reset=0:$0073 dm 's' 0:$37B8 0:data:reset=0:$0077 dm 'w' 0:$37B9 0:data:reset=0:$0069 dm 'i' 0:$37BA 0:data:reset=0:$0074 dm 't' 0:$37BB 0:data:reset=0:$0063 dm 'c' 0:$37BC 0:data:reset=0:$0068 dm 'h' 0:$37BD 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$37BE d15:data:reset=0:$0F04 mc Istr+4 0:$37BF 0:data:reset=0:$0063 dm 'c' 0:$37C0 0:data:reset=0:$0061 dm 'a' 0:$37C1 0:data:reset=0:$006C dm 'l' 0:$37C2 0:data:reset=0:$006C dm 'l' 0:$37C3 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$37C4 d15:data:reset=0:$0F03 mc Istr+3 0:$37C5 0:data:reset=0:$0072 dm 'r' 0:$37C6 0:data:reset=0:$0065 dm 'e' 0:$37C7 0:data:reset=0:$0074 dm 't' 0:$37C8 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$37C9 d15:data:reset=0:$0F05 mc Istr+5 0:$37CA 0:data:reset=0:$006C dm 'l' 0:$37CB 0:data:reset=0:$0061 dm 'a' 0:$37CC 0:data:reset=0:$0062 dm 'b' 0:$37CD 0:data:reset=0:$0065 dm 'e' 0:$37CE 0:data:reset=0:$006C dm 'l' 0:$37CF 0:000011:A1=A6:D0=D3 ld cmd,atmp // info: end of array items 0:$37D0 d15:data:reset=0:$0D4E mc Int8+78 0:$37D1 d15:data:reset=0:$4203 mc Alloc 0:$37D2 d15:data:reset=0:$5A61 mc DupToR 0:$37D3 d15:data:reset=0:$473D mc ForAllItems 0:$37D4 d15:data:reset=0:$0201 mc Bra+1 0:$37D5 d15:data:reset=0:$5C5A mc Poke 0:$37D6 d15:data:reset=0:$43ED mc mmNextItem 0:$37D7 d15:data:reset=0:$01FD mc Bra-3 0:$37D8 d15:data:reset=0:$5F9C mc FromR 0:$37D9 d15:data:reset=0:$18FA mc Lget+250 0:$37DA d15:data:reset=0:$2303 mc ItemSet+3 0:$37DB d15:data:reset=0:$0F4E mc Istr+78 0:$37DC 0:data:reset=0:$0001 dm 1 0:$37DD 0:data:reset=0:$0001 dm 1 0:$37DE 0:data:reset=0:$0001 dm 1 0:$37DF 0:data:reset=0:$0001 dm 1 0:$37E0 0:data:reset=0:$0000 dm 0 0:$37E1 0:data:reset=0:$0000 dm 0 0:$37E2 0:data:reset=0:$0000 dm 0 0:$37E3 0:data:reset=0:$0000 dm 0 0:$37E4 0:data:reset=0:$0000 dm 0 0:$37E5 0:data:reset=0:$0000 dm 0 0:$37E6 0:data:reset=0:$FFFF dm -1 0:$37E7 0:data:reset=0:$FFFF dm -1 0:$37E8 0:data:reset=0:$FFFF dm -1 0:$37E9 0:data:reset=0:$FFFF dm -1 0:$37EA 0:data:reset=0:$FFFF dm -1 0:$37EB 0:data:reset=0:$FFFF dm -1 0:$37EC 0:data:reset=0:$FFFF dm -1 0:$37ED 0:data:reset=0:$FFFF dm -1 0:$37EE 0:data:reset=0:$FFFF dm -1 0:$37EF 0:data:reset=0:$FFFF dm -1 0:$37F0 0:data:reset=0:$FFFF dm -1 0:$37F1 0:data:reset=0:$FFFF dm -1 0:$37F2 0:data:reset=0:$FFFF dm -1 0:$37F3 0:data:reset=0:$FFFF dm -1 0:$37F4 0:data:reset=0:$FFFF dm -1 0:$37F5 0:data:reset=0:$FFFF dm -1 0:$37F6 0:data:reset=0:$FFFF dm -1 0:$37F7 0:data:reset=0:$0001 dm 1 0:$37F8 0:data:reset=0:$0001 dm 1 0:$37F9 0:data:reset=0:$0000 dm 0 0:$37FA 0:data:reset=0:$FFFF dm -1 0:$37FB 0:data:reset=0:$FFFF dm -1 0:$37FC 0:data:reset=0:$FFFD dm -3 0:$37FD 0:data:reset=0:$0001 dm 1 0:$37FE 0:data:reset=0:$FFFF dm -1 0:$37FF 0:data:reset=0:$0001 dm 1 0:$3800 0:data:reset=0:$FFFF dm -1 0:$3801 0:data:reset=0:$0000 dm 0 0:$3802 0:data:reset=0:$FFFE dm -2 0:$3803 0:data:reset=0:$FFFE dm -2 0:$3804 0:data:reset=0:$FFFE dm -2 0:$3805 0:data:reset=0:$FFFE dm -2 0:$3806 0:data:reset=0:$FFFE dm -2 0:$3807 0:data:reset=0:$0000 dm 0 0:$3808 0:data:reset=0:$0000 dm 0 0:$3809 0:data:reset=0:$0001 dm 1 0:$380A 0:data:reset=0:$0001 dm 1 0:$380B 0:data:reset=0:$0000 dm 0 0:$380C 0:data:reset=0:$FFFE dm -2 0:$380D 0:data:reset=0:$0000 dm 0 0:$380E 0:data:reset=0:$0000 dm 0 0:$380F 0:data:reset=0:$0000 dm 0 0:$3810 0:data:reset=0:$0001 dm 1 0:$3811 0:data:reset=0:$0000 dm 0 0:$3812 0:data:reset=0:$0000 dm 0 0:$3813 0:data:reset=0:$FFFB dm -5 0:$3814 0:data:reset=0:$FFFB dm -5 0:$3815 0:data:reset=0:$FFFF dm -1 0:$3816 0:data:reset=0:$0000 dm 0 0:$3817 0:data:reset=0:$FFFE dm -2 0:$3818 0:data:reset=0:$FFFC dm -4 0:$3819 0:data:reset=0:$FFFC dm -4 0:$381A 0:data:reset=0:$FFFD dm -3 0:$381B 0:data:reset=0:$FFFD dm -3 0:$381C 0:data:reset=0:$0000 dm 0 0:$381D 0:data:reset=0:$0000 dm 0 0:$381E 0:data:reset=0:$0000 dm 0 0:$381F 0:data:reset=0:$0000 dm 0 0:$3820 0:data:reset=0:$0001 dm 1 0:$3821 0:data:reset=0:$0000 dm 0 0:$3822 0:data:reset=0:$FFFF dm -1 0:$3823 0:data:reset=0:$FFFF dm -1 0:$3824 0:data:reset=0:$FFFF dm -1 0:$3825 0:data:reset=0:$FFFF dm -1 0:$3826 0:data:reset=0:$FFFF dm -1 0:$3827 0:data:reset=0:$0000 dm 0 0:$3828 0:data:reset=0:$0000 dm 0 0:$3829 0:data:reset=0:$0000 dm 0 0:$382A 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$382B d15:data:reset=0:$18FA mc Lget+250 0:$382C d15:data:reset=0:$2304 mc ItemSet+4 0:$382D d15:data:reset=0:$0F10 mc Istr+16 0:$382E 0:data:reset=0:$9500 dm ADDQ 0:$382F 0:data:reset=0:$1E00 dm SUBQ 0:$3830 0:data:reset=0:$9700 dm MULUQ 0:$3831 0:data:reset=0:$9B00 dm DIVUQ 0:$3832 0:data:reset=0:$9600 dm REMUQ 0:$3833 0:data:reset=0:$8900 dm ANDQ 0:$3834 0:data:reset=0:$9100 dm ORQ 0:$3835 0:data:reset=0:$8A00 dm XORQ 0:$3836 0:data:reset=0:$0000 dm 0 0:$3837 0:data:reset=0:$0000 dm 0 0:$3838 0:data:reset=0:$1200 dm EQQ 0:$3839 0:data:reset=0:$8100 dm NEQ 0:$383A 0:data:reset=0:$1100 dm ULTQ 0:$383B 0:data:reset=0:$1500 dm ULEQ 0:$383C 0:data:reset=0:$8800 dm UGTQ 0:$383D 0:data:reset=0:$1A00 dm UGEQ 0:$383E 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$383F d15:data:reset=0:$18FA mc Lget+250 0:$3840 d15:data:reset=0:$2302 mc ItemSet+2 0:$3841 d15:data:reset=0:$0F10 mc Istr+16 0:$3842 0:data:reset=0:$5ADD dm ADDI 0:$3843 0:data:reset=0:$5A5D dm SUBI 0:$3844 0:data:reset=0:$5B34 dm MULUI 0:$3845 0:data:reset=0:$5BB1 dm DIVUI 0:$3846 0:data:reset=0:$5B3E dm REMUI 0:$3847 0:data:reset=0:$59FA dm ANDI 0:$3848 0:data:reset=0:$59F1 dm ORI 0:$3849 0:data:reset=0:$5A1E dm XORI 0:$384A 0:data:reset=0:$0000 dm 0 0:$384B 0:data:reset=0:$0000 dm 0 0:$384C 0:data:reset=0:$5A39 dm EQI 0:$384D 0:data:reset=0:$5A49 dm NEI 0:$384E 0:data:reset=0:$5A45 dm ULTI 0:$384F 0:data:reset=0:$5A4D dm ULEI 0:$3850 0:data:reset=0:$5A85 dm UGTI 0:$3851 0:data:reset=0:$5A81 dm UGEI 0:$3852 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$3853 d15:data:reset=0:$18FA mc Lget+250 0:$3854 d15:data:reset=0:$2301 mc ItemSet+1 0:$3855 d15:data:reset=0:$0F04 mc Istr+4 0:$3856 0:data:reset=0:$5A79 dm IN 0:$3857 0:data:reset=0:$5C8A dm IN2 0:$3858 0:data:reset=0:$5C78 dm IN4 0:$3859 0:data:reset=0:$5E0B dm IN8 0:$385A 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$385B d15:data:reset=0:$5A61 mc DupToR 0:$385C d15:data:reset=0:$18FE mc Lget+254 0:$385D d15:data:reset=0:$5E2E mc AtIndex 0:$385E d15:data:reset=0:$5F9C mc FromR 0:$385F d15:data:reset=0:$4581 mc DropStr 0:$3860 d15:data:reset=0:$5AC5 mc Peek 0:$3861 d15:data:reset=0:$18FA mc Lget+250 0:$3862 d15:data:reset=0:$1D00 mc ItemGet+0 0:$3863 d15:data:reset=0:$0D3A mc Int8+58 0:$3864 d15:data:reset=0:$5E87 mc AtIndexPoke 0:$3865 d15:data:reset=0:$0F04 mc Istr+4 0:$3866 0:data:reset=0:$5D0A dm OUT 0:$3867 0:data:reset=0:$5E99 dm OUT2 0:$3868 0:data:reset=0:$5EC6 dm OUT4 0:$3869 0:data:reset=0:$5F75 dm OUT8 0:$386A 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$386B d15:data:reset=0:$5A61 mc DupToR 0:$386C d15:data:reset=0:$18FE mc Lget+254 0:$386D d15:data:reset=0:$5E2E mc AtIndex 0:$386E d15:data:reset=0:$5F9C mc FromR 0:$386F d15:data:reset=0:$4581 mc DropStr 0:$3870 d15:data:reset=0:$5AC5 mc Peek 0:$3871 d15:data:reset=0:$18FA mc Lget+250 0:$3872 d15:data:reset=0:$1D00 mc ItemGet+0 0:$3873 d15:data:reset=0:$0D3B mc Int8+59 0:$3874 d15:data:reset=0:$5E87 mc AtIndexPoke 0:$3875 d15:data:reset=0:$0F04 mc Istr+4 0:$3876 0:data:reset=0:$5B5C dm BIN 0:$3877 0:data:reset=0:$5B98 dm BIN2 0:$3878 0:data:reset=0:$5BB6 dm BIN4 0:$3879 0:data:reset=0:$5BA2 dm BIN8 0:$387A 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$387B d15:data:reset=0:$5A61 mc DupToR 0:$387C d15:data:reset=0:$18FE mc Lget+254 0:$387D d15:data:reset=0:$5E2E mc AtIndex 0:$387E d15:data:reset=0:$5F9C mc FromR 0:$387F d15:data:reset=0:$4581 mc DropStr 0:$3880 d15:data:reset=0:$5AC5 mc Peek 0:$3881 d15:data:reset=0:$18FA mc Lget+250 0:$3882 d15:data:reset=0:$1D00 mc ItemGet+0 0:$3883 d15:data:reset=0:$0D3C mc Int8+60 0:$3884 d15:data:reset=0:$5E87 mc AtIndexPoke 0:$3885 d15:data:reset=0:$45F6 mc Dup 0:$3886 d15:data:reset=0:$0607 mc BraIf0+7 0:$3887 d15:data:reset=0:$0F04 mc Istr+4 0:$3888 0:data:reset=0:$5B84 dm FBOUT 0:$3889 0:data:reset=0:$5B9D dm FBOUT2 0:$388A 0:data:reset=0:$5B93 dm FBOUT4 0:$388B 0:data:reset=0:$5B7F dm FBOUT8 0:$388C 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$388D d15:data:reset=0:$0206 mc Bra+6 0:$388E d15:data:reset=0:$0F04 mc Istr+4 0:$388F 0:data:reset=0:$5B66 dm BOUT 0:$3890 0:data:reset=0:$5B70 dm BOUT2 0:$3891 0:data:reset=0:$5B8E dm BOUT4 0:$3892 0:data:reset=0:$5BA7 dm BOUT8 0:$3893 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$3894 d15:data:reset=0:$5A61 mc DupToR 0:$3895 d15:data:reset=0:$18FE mc Lget+254 0:$3896 d15:data:reset=0:$5E2E mc AtIndex 0:$3897 d15:data:reset=0:$5F9C mc FromR 0:$3898 d15:data:reset=0:$4581 mc DropStr 0:$3899 d15:data:reset=0:$5AC5 mc Peek 0:$389A d15:data:reset=0:$18FA mc Lget+250 0:$389B d15:data:reset=0:$1D00 mc ItemGet+0 0:$389C d15:data:reset=0:$0D3D mc Int8+61 0:$389D d15:data:reset=0:$5E87 mc AtIndexPoke 0:$389E d15:data:reset=0:$0F04 mc Istr+4 0:$389F 0:data:reset=0:$2500 dm INI 0:$38A0 0:data:reset=0:$8D00 dm INI2 0:$38A1 0:data:reset=0:$9900 dm INI4 0:$38A2 0:data:reset=0:$1C00 dm INI8 0:$38A3 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$38A4 d15:data:reset=0:$5A61 mc DupToR 0:$38A5 d15:data:reset=0:$18FE mc Lget+254 0:$38A6 d15:data:reset=0:$5E2E mc AtIndex 0:$38A7 d15:data:reset=0:$5F9C mc FromR 0:$38A8 d15:data:reset=0:$4581 mc DropStr 0:$38A9 d15:data:reset=0:$5AC5 mc Peek 0:$38AA d15:data:reset=0:$18FA mc Lget+250 0:$38AB d15:data:reset=0:$2305 mc ItemSet+5 0:$38AC d15:data:reset=0:$0F04 mc Istr+4 0:$38AD 0:data:reset=0:$8700 dm OUTI 0:$38AE 0:data:reset=0:$9C00 dm OUTI2 0:$38AF 0:data:reset=0:$2200 dm OUTI4 0:$38B0 0:data:reset=0:$9D00 dm OUTI8 0:$38B1 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$38B2 d15:data:reset=0:$5A61 mc DupToR 0:$38B3 d15:data:reset=0:$18FE mc Lget+254 0:$38B4 d15:data:reset=0:$5E2E mc AtIndex 0:$38B5 d15:data:reset=0:$5F9C mc FromR 0:$38B6 d15:data:reset=0:$4581 mc DropStr 0:$38B7 d15:data:reset=0:$5AC5 mc Peek 0:$38B8 d15:data:reset=0:$18FA mc Lget+250 0:$38B9 d15:data:reset=0:$2306 mc ItemSet+6 0:$38BA d15:data:reset=0:$0D00 mc Int8+0 0:$38BB d15:data:reset=0:$0D00 mc Int8+0 0:$38BC d15:data:reset=0:$0D00 mc Int8+0 0:$38BD d15:data:reset=0:$0D00 mc Int8+0 0:$38BE d15:data:reset=0:$18FD mc Lget+253 0:$38BF d15:data:reset=0:$18F8 mc Lget+248 0:$38C0 d15:data:reset=0:$482D mc Count 0:$38C1 d15:data:reset=0:$46CC mc Ult 0:$38C2 d15:data:reset=0:$0609 mc BraIf0+9 0:$38C3 d15:data:reset=0:$18F9 mc Lget+249 0:$38C4 d15:data:reset=0:$07FC mc Lvar+252 0:$38C5 d15:data:reset=0:$5DB0 mc Peekpp 0:$38C6 d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$38C7 d15:data:reset=0:$07FC mc Lvar+252 0:$38C8 d15:data:reset=0:$5DA8 mc AddPoke 0:$38C9 d15:data:reset=0:$07FF mc Lvar+255 0:$38CA d15:data:reset=0:$5E7E mc Incr 0:$38CB d15:data:reset=0:$01F2 mc Bra-14 0:$38CC d15:data:reset=0:$18FF mc Lget+255 0:$38CD d15:data:reset=0:$4203 mc Alloc 0:$38CE d15:data:reset=0:$18F6 mc Lget+246 0:$38CF d15:data:reset=0:$1708 mc Item+8 0:$38D0 d15:data:reset=0:$7A05 mc SwapWithVar 0:$38D1 d15:data:reset=0:$46BA mc CallKill 0:$38D2 d15:data:reset=0:$5FB8 mc implicit__bcc__kill__6uint16AEAE_6uint16AEAE 0:$38D3 d15:data:reset=0:$4581 mc DropStr 0:$38D4 d15:data:reset=0:$45F6 mc Dup 0:$38D5 d15:data:reset=0:$18FE mc Lget+254 0:$38D6 d15:data:reset=0:$46CC mc Ult 0:$38D7 d15:data:reset=0:$0615 mc BraIf0+21 0:$38D8 d15:data:reset=0:$18F9 mc Lget+249 0:$38D9 d15:data:reset=0:$07FD mc Lvar+253 0:$38DA d15:data:reset=0:$5DB0 mc Peekpp 0:$38DB d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$38DC d15:data:reset=0:$18F8 mc Lget+248 0:$38DD d15:data:reset=0:$18FC mc Lget+252 0:$38DE d15:data:reset=0:$18FB mc Lget+251 0:$38DF d15:data:reset=0:$18FD mc Lget+253 0:$38E0 d15:data:reset=0:$5AAD mc Add 0:$38E1 d15:data:reset=0:$7D04 mc SubStr 0:$38E2 d15:data:reset=0:$6712 mc Cast_RangeStr 0:$38E3 d15:data:reset=0:$18F5 mc Lget+245 0:$38E4 d15:data:reset=0:$1D08 mc ItemGet+8 0:$38E5 d15:data:reset=0:$07FD mc Lvar+253 0:$38E6 d15:data:reset=0:$5DB0 mc Peekpp 0:$38E7 d15:data:reset=0:$5E87 mc AtIndexPoke 0:$38E8 d15:data:reset=0:$45F6 mc Dup 0:$38E9 d15:data:reset=0:$07FC mc Lvar+252 0:$38EA d15:data:reset=0:$5DA8 mc AddPoke 0:$38EB d15:data:reset=0:$5F33 mc MDrop0-1 0:$38EC d15:data:reset=0:$01E7 mc Bra-25 0:$38ED d15:data:reset=0:$5F2C mc MDrop0-8 0:$38EE d15:data:reset=0:$5FFA mc MDrop0_Next-2 : BytecodeCompiler__compile__16BytecodeCompilerC_6uint16_6uint16_6uint16AEC_6uint16AE_6uint16AEC_6uint16 ( BytecodeCompiler¢, uint16, uint16, uint16[]¢, uint16[], uint16[]¢ -- uint16 ) Millicoded // Size: 674 microcodes 0:$32E3 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$32E4 0:data:reset=0:$72E7 0:$32E5 0:000011:A1=A2:D0=D0 jp millicoded // * Millicoded 0:$32E6 d15:data:reset=0:$5F70 0:$32E7 d15:data:reset=0:$61E4 mc PushContext0 0:$32E8 d15:data:reset=0:$0D03 mc Int8+3 0:$32E9 d15:data:reset=0:$4203 mc Alloc 0:$32EA d15:data:reset=0:$5FA7 mc ToR 0:$32EB d15:data:reset=0:$18FD mc Lget+253 0:$32EC d15:data:reset=0:$5BD4 mc PeekR 0:$32ED d15:data:reset=0:$2300 mc ItemSet+0 0:$32EE d15:data:reset=0:$18FE mc Lget+254 0:$32EF d15:data:reset=0:$4667 mc Retain 0:$32F0 d15:data:reset=0:$5BD4 mc PeekR 0:$32F1 d15:data:reset=0:$2301 mc ItemSet+1 0:$32F2 d15:data:reset=0:$9F12 mc Gget+gcode_ptr 0:$32F3 d15:data:reset=0:$5BD4 mc PeekR 0:$32F4 d15:data:reset=0:$2302 mc ItemSet+2 0:$32F5 d15:data:reset=0:$5F9C mc FromR 0:$32F6 d15:data:reset=0:$18FA mc Lget+250 0:$32F7 d15:data:reset=0:$1D0B mc ItemGet+11 0:$32F8 d15:data:reset=0:$18FA mc Lget+250 0:$32F9 d15:data:reset=0:$5E87 mc AtIndexPoke 0:$32FA d15:data:reset=0:$18FB mc Lget+251 0:$32FB d15:data:reset=0:$1D0B mc ItemGet+11 0:$32FC d15:data:reset=0:$18FB mc Lget+251 0:$32FD d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$32FE d15:data:reset=0:$18FD mc Lget+253 0:$32FF d15:data:reset=0:$4667 mc Retain 0:$3300 d15:data:reset=0:$18FD mc Lget+253 0:$3301 d15:data:reset=0:$4667 mc Retain 0:$3302 d15:data:reset=0:$6AAF mc CatStrStr 0:$3303 d15:data:reset=0:$07FD mc Lvar+253 0:$3304 d15:data:reset=0:$7A05 mc SwapWithVar 0:$3305 d15:data:reset=0:$4581 mc DropStr 0:$3306 d15:data:reset=0:$18FD mc Lget+253 0:$3307 d15:data:reset=0:$482D mc Count 0:$3308 d15:data:reset=0:$0D00 mc Int8+0 0:$3309 d15:data:reset=0:$0E01 mc Int16+1 0:$330A d15:data:reset=0:$4203 mc Alloc 0:$330B d15:data:reset=0:$0D00 mc Int8+0 0:$330C d15:data:reset=0:$0E01 mc Int16+1 0:$330D d15:data:reset=0:$4203 mc Alloc 0:$330E d15:data:reset=0:$0D00 mc Int8+0 0:$330F d15:data:reset=0:$0E01 mc Int16+1 0:$3310 d15:data:reset=0:$4203 mc Alloc 0:$3311 d15:data:reset=0:$0D00 mc Int8+0 0:$3312 d15:data:reset=0:$18F6 mc Lget+246 0:$3313 d15:data:reset=0:$0D08 mc Int8+8 0:$3314 d15:data:reset=0:$47DF mc Eq 0:$3315 d15:data:reset=0:$0605 mc BraIf0+5 0:$3316 d15:data:reset=0:$0D2D mc Int8+SELECTI&$FF 0:$3317 d15:data:reset=0:$0E5A mc Int16+(SELECTI>>8)&$FF 0:$3318 d15:data:reset=0:$18F4 mc Lget+244 0:$3319 d15:data:reset=0:$1D0A mc ItemGet+10 0:$331A d15:data:reset=0:$60F3 mc BytecodeCompiler__store__6uint16_6uint16_ 0:$331B d15:data:reset=0:$0D00 mc Int8+0 0:$331C d15:data:reset=0:$0D00 mc Int8+0 0:$331D d15:data:reset=0:$0D00 mc Int8+0 0:$331E d15:data:reset=0:$18FE mc Lget+254 0:$331F d15:data:reset=0:$18F6 mc Lget+246 0:$3320 d15:data:reset=0:$482D mc Count 0:$3321 d15:data:reset=0:$46CC mc Ult 0:$3322 d15:data:reset=0:$0402 mc BraIf1+2 0:$3323 d15:data:reset=0:$8202 mc Hi8+2 0:$3324 d15:data:reset=0:$A119 mc BraFar+25 0:$3325 d15:data:reset=0:$66E0 mc BytecodeCompiler__compile__16BytecodeCompilerC_6uint16_6uint16_6uint16AEC_6uint16AE_6uint16AEC_6uint16____peeknextopcode__6uint16 0:$3326 d15:data:reset=0:$8EFF mc Lset+255 0:$3327 d15:data:reset=0:$07FE mc Lvar+254 0:$3328 d15:data:reset=0:$5E7E mc Incr 0:$3329 d15:data:reset=0:$18F7 mc Lget+247 0:$332A d15:data:reset=0:$07FD mc Lvar+253 0:$332B d15:data:reset=0:$5DB0 mc Peekpp 0:$332C d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$332D d15:data:reset=0:$5F29 mc Nip 0:$332E d15:data:reset=0:$18FF mc Lget+255 0:$332F d15:data:reset=0:$0904 mc Switch+4 0:$3330 d15:data:reset=0:$0204 mc Bra+4 0:$3331 d15:data:reset=0:$0251 mc Bra+81 0:$3332 d15:data:reset=0:$0270 mc Bra+112 0:$3333 d15:data:reset=0:$027F mc Bra+127 0:$3334 d15:data:reset=0:$0294 mc Bra+148 0:$3335 d15:data:reset=0:$66E0 mc BytecodeCompiler__compile__16BytecodeCompilerC_6uint16_6uint16_6uint16AEC_6uint16AE_6uint16AEC_6uint16____peeknextopcode__6uint16 0:$3336 d15:data:reset=0:$8EFF mc Lset+255 0:$3337 d15:data:reset=0:$18FF mc Lget+255 0:$3338 d15:data:reset=0:$0C0A mc Subq+10 0:$3339 d15:data:reset=0:$0D0F mc Int8+15 0:$333A d15:data:reset=0:$C6CC mc Ule 0:$333B d15:data:reset=0:$0623 mc BraIf0+35 0:$333C d15:data:reset=0:$07FE mc Lvar+254 0:$333D d15:data:reset=0:$5E7E mc Incr 0:$333E d15:data:reset=0:$18FF mc Lget+255 0:$333F d15:data:reset=0:$0D12 mc Int8+18 0:$3340 d15:data:reset=0:$47DF mc Eq 0:$3341 d15:data:reset=0:$0608 mc BraIf0+8 0:$3342 d15:data:reset=0:$0DBA mc Int8+SLI0&$FF 0:$3343 d15:data:reset=0:$0ED1 mc Int16+(SLI0>>8)&$FF 0:$3344 d15:data:reset=0:$18FF mc Lget+255 0:$3345 d15:data:reset=0:$0D0F mc Int8+15 0:$3346 d15:data:reset=0:$5A0F mc And 0:$3347 d15:data:reset=0:$5BAC mc Sub 0:$3348 d15:data:reset=0:$5EAB mc BytecodeCompiler__store__6uint16_ 0:$3349 d15:data:reset=0:$01D4 mc Bra-44 0:$334A d15:data:reset=0:$18FF mc Lget+255 0:$334B d15:data:reset=0:$0D13 mc Int8+19 0:$334C d15:data:reset=0:$47DF mc Eq 0:$334D d15:data:reset=0:$0608 mc BraIf0+8 0:$334E d15:data:reset=0:$0DF3 mc Int8+SRU0&$FF 0:$334F d15:data:reset=0:$0ED1 mc Int16+(SRU0>>8)&$FF 0:$3350 d15:data:reset=0:$18FF mc Lget+255 0:$3351 d15:data:reset=0:$0D0F mc Int8+15 0:$3352 d15:data:reset=0:$5A0F mc And 0:$3353 d15:data:reset=0:$5BAC mc Sub 0:$3354 d15:data:reset=0:$5EAB mc BytecodeCompiler__store__6uint16_ 0:$3355 d15:data:reset=0:$01C8 mc Bra-56 0:$3356 d15:data:reset=0:$18F2 mc Lget+242 0:$3357 d15:data:reset=0:$1D02 mc ItemGet+2 0:$3358 d15:data:reset=0:$18FE mc Lget+254 0:$3359 d15:data:reset=0:$0C0A mc Subq+10 0:$335A d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$335B d15:data:reset=0:$18FF mc Lget+255 0:$335C d15:data:reset=0:$5AAD mc Add 0:$335D d15:data:reset=0:$5EAB mc BytecodeCompiler__store__6uint16_ 0:$335E d15:data:reset=0:$01BF mc Bra-65 0:$335F d15:data:reset=0:$18FF mc Lget+255 0:$3360 d15:data:reset=0:$0D3A mc Int8+58 0:$3361 d15:data:reset=0:$47DF mc Eq 0:$3362 d15:data:reset=0:$060A mc BraIf0+10 0:$3363 d15:data:reset=0:$07FE mc Lvar+254 0:$3364 d15:data:reset=0:$5E7E mc Incr 0:$3365 d15:data:reset=0:$07F9 mc Lvar+249 0:$3366 d15:data:reset=0:$5E7E mc Incr 0:$3367 d15:data:reset=0:$18F2 mc Lget+242 0:$3368 d15:data:reset=0:$1D05 mc ItemGet+5 0:$3369 d15:data:reset=0:$18FF mc Lget+255 0:$336A d15:data:reset=0:$5AAD mc Add 0:$336B d15:data:reset=0:$5EAB mc BytecodeCompiler__store__6uint16_ 0:$336C d15:data:reset=0:$01B1 mc Bra-79 0:$336D d15:data:reset=0:$18FF mc Lget+255 0:$336E d15:data:reset=0:$0D3B mc Int8+59 0:$336F d15:data:reset=0:$47DF mc Eq 0:$3370 d15:data:reset=0:$060A mc BraIf0+10 0:$3371 d15:data:reset=0:$07FE mc Lvar+254 0:$3372 d15:data:reset=0:$5E7E mc Incr 0:$3373 d15:data:reset=0:$07F9 mc Lvar+249 0:$3374 d15:data:reset=0:$5EA2 mc Decr 0:$3375 d15:data:reset=0:$18F2 mc Lget+242 0:$3376 d15:data:reset=0:$1D06 mc ItemGet+6 0:$3377 d15:data:reset=0:$18FF mc Lget+255 0:$3378 d15:data:reset=0:$5AAD mc Add 0:$3379 d15:data:reset=0:$5EAB mc BytecodeCompiler__store__6uint16_ 0:$337A d15:data:reset=0:$01A3 mc Bra-93 0:$337B d15:data:reset=0:$45F6 mc Dup 0:$337C d15:data:reset=0:$0D00 mc Int8+LDQ&$FF 0:$337D d15:data:reset=0:$0EA4 mc Int16+(LDQ>>8)&$FF 0:$337E d15:data:reset=0:$5A12 mc Or 0:$337F d15:data:reset=0:$5EAB mc BytecodeCompiler__store__6uint16_ 0:$3380 d15:data:reset=0:$07F9 mc Lvar+249 0:$3381 d15:data:reset=0:$5E7E mc Incr 0:$3382 d15:data:reset=0:$019B mc Bra-101 0:$3383 d15:data:reset=0:$45F6 mc Dup 0:$3384 d15:data:reset=0:$C39B mc Sli15+15-8 0:$3385 d15:data:reset=0:$18F6 mc Lget+246 0:$3386 d15:data:reset=0:$07FC mc Lvar+252 0:$3387 d15:data:reset=0:$5DB0 mc Peekpp 0:$3388 d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$3389 d15:data:reset=0:$5AAD mc Add 0:$338A d15:data:reset=0:$5F29 mc Nip 0:$338B d15:data:reset=0:$66E0 mc BytecodeCompiler__compile__16BytecodeCompilerC_6uint16_6uint16_6uint16AEC_6uint16AE_6uint16AEC_6uint16____peeknextopcode__6uint16 0:$338C d15:data:reset=0:$8EFF mc Lset+255 0:$338D d15:data:reset=0:$18FF mc Lget+255 0:$338E d15:data:reset=0:$0C0A mc Subq+10 0:$338F d15:data:reset=0:$0D0F mc Int8+15 0:$3390 d15:data:reset=0:$C6CC mc Ule 0:$3391 d15:data:reset=0:$060A mc BraIf0+10 0:$3392 d15:data:reset=0:$07FE mc Lvar+254 0:$3393 d15:data:reset=0:$5E7E mc Incr 0:$3394 d15:data:reset=0:$18F2 mc Lget+242 0:$3395 d15:data:reset=0:$1D01 mc ItemGet+1 0:$3396 d15:data:reset=0:$18FE mc Lget+254 0:$3397 d15:data:reset=0:$0C0A mc Subq+10 0:$3398 d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$3399 d15:data:reset=0:$18FF mc Lget+255 0:$339A d15:data:reset=0:$60F3 mc BytecodeCompiler__store__6uint16_6uint16_ 0:$339B d15:data:reset=0:$0182 mc Bra-126 0:$339C d15:data:reset=0:$0DFB mc Int8+IVAL&$FF 0:$339D d15:data:reset=0:$0E5A mc Int16+(IVAL>>8)&$FF 0:$339E d15:data:reset=0:$18FF mc Lget+255 0:$339F d15:data:reset=0:$60F3 mc BytecodeCompiler__store__6uint16_6uint16_ 0:$33A0 d15:data:reset=0:$07F9 mc Lvar+249 0:$33A1 d15:data:reset=0:$5E7E mc Incr 0:$33A2 d15:data:reset=0:$017B mc Bra-133 0:$33A3 d15:data:reset=0:$0D47 mc Int8+ISTR&$FF 0:$33A4 d15:data:reset=0:$0E62 mc Int16+(ISTR>>8)&$FF 0:$33A5 d15:data:reset=0:$18FF mc Lget+255 0:$33A6 d15:data:reset=0:$60F3 mc BytecodeCompiler__store__6uint16_6uint16_ 0:$33A7 d15:data:reset=0:$5BC5 mc PshHP 0:$33A8 d15:data:reset=0:$5DD0 mc Peekmm 0:$33A9 d15:data:reset=0:$0606 mc BraIf0+6 0:$33AA d15:data:reset=0:$18F7 mc Lget+247 0:$33AB d15:data:reset=0:$07FD mc Lvar+253 0:$33AC d15:data:reset=0:$5DB0 mc Peekpp 0:$33AD d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$33AE d15:data:reset=0:$5EAB mc BytecodeCompiler__store__6uint16_ 0:$33AF d15:data:reset=0:$01F7 mc Bra-9 0:$33B0 d15:data:reset=0:$07F9 mc Lvar+249 0:$33B1 d15:data:reset=0:$5E7E mc Incr 0:$33B2 d15:data:reset=0:$016B mc Bra-149 0:$33B3 d15:data:reset=0:$0D47 mc Int8+ISTR&$FF 0:$33B4 d15:data:reset=0:$0E62 mc Int16+(ISTR>>8)&$FF 0:$33B5 d15:data:reset=0:$18FF mc Lget+255 0:$33B6 d15:data:reset=0:$60F3 mc BytecodeCompiler__store__6uint16_6uint16_ 0:$33B7 d15:data:reset=0:$5BC5 mc PshHP 0:$33B8 d15:data:reset=0:$5DD0 mc Peekmm 0:$33B9 d15:data:reset=0:$060C mc BraIf0+12 0:$33BA d15:data:reset=0:$18F7 mc Lget+247 0:$33BB d15:data:reset=0:$07FD mc Lvar+253 0:$33BC d15:data:reset=0:$5DB0 mc Peekpp 0:$33BD d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$33BE d15:data:reset=0:$C39B mc Sli15+15-8 0:$33BF d15:data:reset=0:$18F6 mc Lget+246 0:$33C0 d15:data:reset=0:$07FC mc Lvar+252 0:$33C1 d15:data:reset=0:$5DB0 mc Peekpp 0:$33C2 d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$33C3 d15:data:reset=0:$5AAD mc Add 0:$33C4 d15:data:reset=0:$5EAB mc BytecodeCompiler__store__6uint16_ 0:$33C5 d15:data:reset=0:$01F1 mc Bra-15 0:$33C6 d15:data:reset=0:$07F9 mc Lvar+249 0:$33C7 d15:data:reset=0:$5E7E mc Incr 0:$33C8 d15:data:reset=0:$0155 mc Bra-171 0:$33C9 d15:data:reset=0:$18FF mc Lget+255 0:$33CA d15:data:reset=0:$0C45 mc Subq+69 0:$33CB d15:data:reset=0:$0909 mc Switch+9 0:$33CC d15:data:reset=0:$0209 mc Bra+9 0:$33CD d15:data:reset=0:$0226 mc Bra+38 0:$33CE d15:data:reset=0:$0230 mc Bra+48 0:$33CF d15:data:reset=0:$023A mc Bra+58 0:$33D0 d15:data:reset=0:$0239 mc Bra+57 0:$33D1 d15:data:reset=0:$024B mc Bra+75 0:$33D2 d15:data:reset=0:$0266 mc Bra+102 0:$33D3 d15:data:reset=0:$027B mc Bra+123 0:$33D4 d15:data:reset=0:$02A9 mc Bra+169 0:$33D5 d15:data:reset=0:$02BF mc Bra+191 0:$33D6 d15:data:reset=0:$0D55 mc Int8+JP&$FF 0:$33D7 d15:data:reset=0:$0E5A mc Int16+(JP>>8)&$FF 0:$33D8 d15:data:reset=0:$0D00 mc Int8+BRA_P&$FF 0:$33D9 d15:data:reset=0:$0E3F mc Int16+(BRA_P>>8)&$FF 0:$33DA d15:data:reset=0:$6E62 mc BytecodeCompiler__compile__16BytecodeCompilerC_6uint16_6uint16_6uint16AEC_6uint16AE_6uint16AEC_6uint16____store_jp_or_bra__6uint16_6uint16_4bool 0:$33DB d15:data:reset=0:$0603 mc BraIf0+3 0:$33DC d15:data:reset=0:$0DC9 mc Int8+201 0:$33DD d15:data:reset=0:$8201 mc Hi8+1 0:$33DE d15:data:reset=0:$A19B mc BraFar+155 0:$33DF d15:data:reset=0:$66E0 mc BytecodeCompiler__compile__16BytecodeCompilerC_6uint16_6uint16_6uint16AEC_6uint16AE_6uint16AEC_6uint16____peeknextopcode__6uint16 0:$33E0 d15:data:reset=0:$0D4D mc Int8+77 0:$33E1 d15:data:reset=0:$47DF mc Eq 0:$33E2 d15:data:reset=0:$060E mc BraIf0+14 0:$33E3 d15:data:reset=0:$18F7 mc Lget+247 0:$33E4 d15:data:reset=0:$18FD mc Lget+253 0:$33E5 d15:data:reset=0:$0B01 mc Addq+1 0:$33E6 d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$33E7 d15:data:reset=0:$5F29 mc Nip 0:$33E8 d15:data:reset=0:$18FB mc Lget+251 0:$33E9 d15:data:reset=0:$18FF mc Lget+255 0:$33EA d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$33EB d15:data:reset=0:$0532 mc BraIf0-206 0:$33EC d15:data:reset=0:$18FB mc Lget+251 0:$33ED d15:data:reset=0:$18FF mc Lget+255 0:$33EE d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$33EF d15:data:reset=0:$8EF9 mc Lset+249 0:$33F0 d15:data:reset=0:$012D mc Bra-211 0:$33F1 d15:data:reset=0:$0DCA mc Int8+202 0:$33F2 d15:data:reset=0:$8201 mc Hi8+1 0:$33F3 d15:data:reset=0:$A186 mc BraFar+134 0:$33F4 d15:data:reset=0:$07F9 mc Lvar+249 0:$33F5 d15:data:reset=0:$5EA2 mc Decr 0:$33F6 d15:data:reset=0:$0D4B mc Int8+JP_Z&$FF 0:$33F7 d15:data:reset=0:$0E53 mc Int16+(JP_Z>>8)&$FF 0:$33F8 d15:data:reset=0:$0D00 mc Int8+BRAZ_P&$FF 0:$33F9 d15:data:reset=0:$0EBD mc Int16+(BRAZ_P>>8)&$FF 0:$33FA d15:data:reset=0:$6E62 mc BytecodeCompiler__compile__16BytecodeCompilerC_6uint16_6uint16_6uint16AEC_6uint16AE_6uint16AEC_6uint16____store_jp_or_bra__6uint16_6uint16_4bool 0:$33FB d15:data:reset=0:$0522 mc BraIf0-222 0:$33FC d15:data:reset=0:$0DCB mc Int8+203 0:$33FD d15:data:reset=0:$8201 mc Hi8+1 0:$33FE d15:data:reset=0:$A17B mc BraFar+123 0:$33FF d15:data:reset=0:$07F9 mc Lvar+249 0:$3400 d15:data:reset=0:$5EA2 mc Decr 0:$3401 d15:data:reset=0:$0D50 mc Int8+JP_NZ&$FF 0:$3402 d15:data:reset=0:$0E53 mc Int16+(JP_NZ>>8)&$FF 0:$3403 d15:data:reset=0:$0D00 mc Int8+BRANZ_P&$FF 0:$3404 d15:data:reset=0:$0EBB mc Int16+(BRANZ_P>>8)&$FF 0:$3405 d15:data:reset=0:$6E62 mc BytecodeCompiler__compile__16BytecodeCompilerC_6uint16_6uint16_6uint16AEC_6uint16AE_6uint16AEC_6uint16____store_jp_or_bra__6uint16_6uint16_4bool 0:$3406 d15:data:reset=0:$0517 mc BraIf0-233 0:$3407 d15:data:reset=0:$0DCB mc Int8+203 0:$3408 d15:data:reset=0:$8201 mc Hi8+1 0:$3409 d15:data:reset=0:$A170 mc BraFar+112 0:$340A d15:data:reset=0:$18F9 mc Lget+249 0:$340B d15:data:reset=0:$18FA mc Lget+250 0:$340C d15:data:reset=0:$18FE mc Lget+254 0:$340D d15:data:reset=0:$5E87 mc AtIndexPoke 0:$340E d15:data:reset=0:$9F12 mc Gget+gcode_ptr 0:$340F d15:data:reset=0:$18FB mc Lget+251 0:$3410 d15:data:reset=0:$07FB mc Lvar+251 0:$3411 d15:data:reset=0:$5DB0 mc Peekpp 0:$3412 d15:data:reset=0:$5E87 mc AtIndexPoke 0:$3413 d15:data:reset=0:$18F2 mc Lget+242 0:$3414 d15:data:reset=0:$1D00 mc ItemGet+0 0:$3415 d15:data:reset=0:$18FE mc Lget+254 0:$3416 d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$3417 d15:data:reset=0:$18FF mc Lget+255 0:$3418 d15:data:reset=0:$5AAD mc Add 0:$3419 d15:data:reset=0:$5EAB mc BytecodeCompiler__store__6uint16_ 0:$341A d15:data:reset=0:$07F9 mc Lvar+249 0:$341B d15:data:reset=0:$5EA2 mc Decr 0:$341C d15:data:reset=0:$0101 mc Bra-255 0:$341D d15:data:reset=0:$0DD6 mc Int8+SWITCH&$FF 0:$341E d15:data:reset=0:$0E52 mc Int16+(SWITCH>>8)&$FF 0:$341F d15:data:reset=0:$18FF mc Lget+255 0:$3420 d15:data:reset=0:$60F3 mc BytecodeCompiler__store__6uint16_6uint16_ 0:$3421 d15:data:reset=0:$07F9 mc Lvar+249 0:$3422 d15:data:reset=0:$5EA2 mc Decr 0:$3423 d15:data:reset=0:$5BC5 mc PshHP 0:$3424 d15:data:reset=0:$5DD0 mc Peekmm 0:$3425 d15:data:reset=0:$0402 mc BraIf1+2 0:$3426 d15:data:reset=0:$82FE mc Hi8+254 0:$3427 d15:data:reset=0:$A1F6 mc BraFar+246 0:$3428 d15:data:reset=0:$9F12 mc Gget+gcode_ptr 0:$3429 d15:data:reset=0:$18FB mc Lget+251 0:$342A d15:data:reset=0:$07FB mc Lvar+251 0:$342B d15:data:reset=0:$5DB0 mc Peekpp 0:$342C d15:data:reset=0:$5E87 mc AtIndexPoke 0:$342D d15:data:reset=0:$18F7 mc Lget+247 0:$342E d15:data:reset=0:$07FD mc Lvar+253 0:$342F d15:data:reset=0:$5DB0 mc Peekpp 0:$3430 d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$3431 d15:data:reset=0:$18F8 mc Lget+248 0:$3432 d15:data:reset=0:$18F9 mc Lget+249 0:$3433 d15:data:reset=0:$18FE mc Lget+254 0:$3434 d15:data:reset=0:$5E87 mc AtIndexPoke 0:$3435 d15:data:reset=0:$45F6 mc Dup 0:$3436 d15:data:reset=0:$5EAB mc BytecodeCompiler__store__6uint16_ 0:$3437 d15:data:reset=0:$5F33 mc MDrop0-1 0:$3438 d15:data:reset=0:$01EA mc Bra-22 0:$3439 d15:data:reset=0:$18F2 mc Lget+242 0:$343A d15:data:reset=0:$1D0B mc ItemGet+11 0:$343B d15:data:reset=0:$18FF mc Lget+255 0:$343C d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$343D d15:data:reset=0:$0D2D mc Int8+JSR&$FF 0:$343E d15:data:reset=0:$0E5D mc Int16+(JSR>>8)&$FF 0:$343F d15:data:reset=0:$18FF mc Lget+255 0:$3440 d15:data:reset=0:$1D02 mc ItemGet+2 0:$3441 d15:data:reset=0:$60F3 mc BytecodeCompiler__store__6uint16_6uint16_ 0:$3442 d15:data:reset=0:$45F6 mc Dup 0:$3443 d15:data:reset=0:$1D00 mc ItemGet+0 0:$3444 d15:data:reset=0:$0D00 mc Int8+0 0:$3445 d15:data:reset=0:$47D5 mc Ne 0:$3446 d15:data:reset=0:$18FF mc Lget+255 0:$3447 d15:data:reset=0:$1D01 mc ItemGet+1 0:$3448 d15:data:reset=0:$482D mc Count 0:$3449 d15:data:reset=0:$5BAC mc Sub 0:$344A d15:data:reset=0:$07F7 mc Lvar+247 0:$344B d15:data:reset=0:$5DA8 mc AddPoke 0:$344C d15:data:reset=0:$5F33 mc MDrop0-1 0:$344D d15:data:reset=0:$82FE mc Hi8+254 0:$344E d15:data:reset=0:$A1CF mc BraFar+207 0:$344F d15:data:reset=0:$18F8 mc Lget+248 0:$3450 d15:data:reset=0:$1D00 mc ItemGet+0 0:$3451 d15:data:reset=0:$0D00 mc Int8+0 0:$3452 d15:data:reset=0:$47DF mc Eq 0:$3453 d15:data:reset=0:$0618 mc BraIf0+24 0:$3454 d15:data:reset=0:$18F9 mc Lget+249 0:$3455 d15:data:reset=0:$0D08 mc Int8+8 0:$3456 d15:data:reset=0:$C6C6 mc Ugt 0:$3457 d15:data:reset=0:$0607 mc BraIf0+7 0:$3458 d15:data:reset=0:$0D40 mc Int8+DROP8&$FF 0:$3459 d15:data:reset=0:$0E5F mc Int16+(DROP8>>8)&$FF 0:$345A d15:data:reset=0:$5EAB mc BytecodeCompiler__store__6uint16_ 0:$345B d15:data:reset=0:$0D08 mc Int8+8 0:$345C d15:data:reset=0:$07F8 mc Lvar+248 0:$345D d15:data:reset=0:$5E33 mc SubPoke 0:$345E d15:data:reset=0:$01F5 mc Bra-11 0:$345F d15:data:reset=0:$18F3 mc Lget+243 0:$3460 d15:data:reset=0:$0D08 mc Int8+8 0:$3461 d15:data:reset=0:$47DF mc Eq 0:$3462 d15:data:reset=0:$0603 mc BraIf0+3 0:$3463 d15:data:reset=0:$0DC1 mc Int8+DROP0_RETI&$FF 0:$3464 d15:data:reset=0:$0E63 mc Int16+(DROP0_RETI>>8)&$FF 0:$3465 d15:data:reset=0:$0202 mc Bra+2 0:$3466 d15:data:reset=0:$0DB4 mc Int8+DROP0_RET&$FF 0:$3467 d15:data:reset=0:$0E5F mc Int16+(DROP0_RET>>8)&$FF 0:$3468 d15:data:reset=0:$18F8 mc Lget+248 0:$3469 d15:data:reset=0:$5BAC mc Sub 0:$346A d15:data:reset=0:$5EAB mc BytecodeCompiler__store__6uint16_ 0:$346B d15:data:reset=0:$02D2 mc Bra+210 0:$346C d15:data:reset=0:$18F9 mc Lget+249 0:$346D d15:data:reset=0:$0D09 mc Int8+9 0:$346E d15:data:reset=0:$C6C6 mc Ugt 0:$346F d15:data:reset=0:$0607 mc BraIf0+7 0:$3470 d15:data:reset=0:$0DE2 mc Int8+NIP8&$FF 0:$3471 d15:data:reset=0:$0E5E mc Int16+(NIP8>>8)&$FF 0:$3472 d15:data:reset=0:$5EAB mc BytecodeCompiler__store__6uint16_ 0:$3473 d15:data:reset=0:$0D08 mc Int8+8 0:$3474 d15:data:reset=0:$07F8 mc Lvar+248 0:$3475 d15:data:reset=0:$5E33 mc SubPoke 0:$3476 d15:data:reset=0:$01F5 mc Bra-11 0:$3477 d15:data:reset=0:$0DF0 mc Int8+NIP0_RET&$FF 0:$3478 d15:data:reset=0:$0E5F mc Int16+(NIP0_RET>>8)&$FF 0:$3479 d15:data:reset=0:$18F8 mc Lget+248 0:$347A d15:data:reset=0:$0C01 mc Subq+1 0:$347B d15:data:reset=0:$5BAC mc Sub 0:$347C d15:data:reset=0:$5EAB mc BytecodeCompiler__store__6uint16_ 0:$347D d15:data:reset=0:$02C0 mc Bra+192 0:$347E d15:data:reset=0:$9F12 mc Gget+gcode_ptr 0:$347F d15:data:reset=0:$18F9 mc Lget+249 0:$3480 d15:data:reset=0:$18FE mc Lget+254 0:$3481 d15:data:reset=0:$5E87 mc AtIndexPoke 0:$3482 d15:data:reset=0:$18FB mc Lget+251 0:$3483 d15:data:reset=0:$18FF mc Lget+255 0:$3484 d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$3485 d15:data:reset=0:$47E5 mc And0 0:$3486 d15:data:reset=0:$0205 mc Bra+5 0:$3487 d15:data:reset=0:$18F9 mc Lget+249 0:$3488 d15:data:reset=0:$18FA mc Lget+250 0:$3489 d15:data:reset=0:$18FE mc Lget+254 0:$348A d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$348B d15:data:reset=0:$47D5 mc Ne 0:$348C d15:data:reset=0:$0602 mc BraIf0+2 0:$348D d15:data:reset=0:$0DCC mc Int8+204 0:$348E d15:data:reset=0:$02EB mc Bra+235 0:$348F d15:data:reset=0:$18F9 mc Lget+249 0:$3490 d15:data:reset=0:$18FA mc Lget+250 0:$3491 d15:data:reset=0:$18FE mc Lget+254 0:$3492 d15:data:reset=0:$5E87 mc AtIndexPoke 0:$3493 d15:data:reset=0:$82FE mc Hi8+254 0:$3494 d15:data:reset=0:$A189 mc BraFar+137 0:$3495 d15:data:reset=0:$18FF mc Lget+255 0:$3496 d15:data:reset=0:$0C1B mc Subq+27 0:$3497 d15:data:reset=0:$0926 mc Switch+38 0:$3498 d15:data:reset=0:$0233 mc Bra+51 0:$3499 d15:data:reset=0:$026B mc Bra+107 0:$349A d15:data:reset=0:$0275 mc Bra+117 0:$349B d15:data:reset=0:$0222 mc Bra+34 0:$349C d15:data:reset=0:$0221 mc Bra+33 0:$349D d15:data:reset=0:$0220 mc Bra+32 0:$349E d15:data:reset=0:$0240 mc Bra+64 0:$349F d15:data:reset=0:$0252 mc Bra+82 0:$34A0 d15:data:reset=0:$0264 mc Bra+100 0:$34A1 d15:data:reset=0:$0263 mc Bra+99 0:$34A2 d15:data:reset=0:$026D mc Bra+109 0:$34A3 d15:data:reset=0:$026C mc Bra+108 0:$34A4 d15:data:reset=0:$0219 mc Bra+25 0:$34A5 d15:data:reset=0:$0218 mc Bra+24 0:$34A6 d15:data:reset=0:$0217 mc Bra+23 0:$34A7 d15:data:reset=0:$0216 mc Bra+22 0:$34A8 d15:data:reset=0:$0215 mc Bra+21 0:$34A9 d15:data:reset=0:$0214 mc Bra+20 0:$34AA d15:data:reset=0:$0234 mc Bra+52 0:$34AB d15:data:reset=0:$0259 mc Bra+89 0:$34AC d15:data:reset=0:$0263 mc Bra+99 0:$34AD d15:data:reset=0:$0210 mc Bra+16 0:$34AE d15:data:reset=0:$020F mc Bra+15 0:$34AF d15:data:reset=0:$020E mc Bra+14 0:$34B0 d15:data:reset=0:$020D mc Bra+13 0:$34B1 d15:data:reset=0:$0269 mc Bra+105 0:$34B2 d15:data:reset=0:$020B mc Bra+11 0:$34B3 d15:data:reset=0:$020A mc Bra+10 0:$34B4 d15:data:reset=0:$0209 mc Bra+9 0:$34B5 d15:data:reset=0:$0208 mc Bra+8 0:$34B6 d15:data:reset=0:$0207 mc Bra+7 0:$34B7 d15:data:reset=0:$0206 mc Bra+6 0:$34B8 d15:data:reset=0:$0205 mc Bra+5 0:$34B9 d15:data:reset=0:$0204 mc Bra+4 0:$34BA d15:data:reset=0:$0203 mc Bra+3 0:$34BB d15:data:reset=0:$0202 mc Bra+2 0:$34BC d15:data:reset=0:$0201 mc Bra+1 0:$34BD d15:data:reset=0:$026D mc Bra+109 0:$34BE d15:data:reset=0:$07FE mc Lvar+254 0:$34BF d15:data:reset=0:$5EA2 mc Decr 0:$34C0 d15:data:reset=0:$18FF mc Lget+255 0:$34C1 d15:data:reset=0:$0D4D mc Int8+77 0:$34C2 d15:data:reset=0:$C6C6 mc Ugt 0:$34C3 d15:data:reset=0:$0602 mc BraIf0+2 0:$34C4 d15:data:reset=0:$0DCD mc Int8+205 0:$34C5 d15:data:reset=0:$02B4 mc Bra+180 0:$34C6 d15:data:reset=0:$18F2 mc Lget+242 0:$34C7 d15:data:reset=0:$1D00 mc ItemGet+0 0:$34C8 d15:data:reset=0:$18FE mc Lget+254 0:$34C9 d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$34CA d15:data:reset=0:$5F29 mc Nip 0:$34CB d15:data:reset=0:$0268 mc Bra+104 0:$34CC d15:data:reset=0:$45F6 mc Dup 0:$34CD d15:data:reset=0:$18F8 mc Lget+248 0:$34CE d15:data:reset=0:$0C01 mc Subq+1 0:$34CF d15:data:reset=0:$47DF mc Eq 0:$34D0 d15:data:reset=0:$0603 mc BraIf0+3 0:$34D1 d15:data:reset=0:$0DF6 mc Int8+PSH_HP&$FF 0:$34D2 d15:data:reset=0:$0E5A mc Int16+(PSH_HP>>8)&$FF 0:$34D3 d15:data:reset=0:$0209 mc Bra+9 0:$34D4 d15:data:reset=0:$0D00 mc Int8+LVAR&$FF 0:$34D5 d15:data:reset=0:$0E24 mc Int16+(LVAR>>8)&$FF 0:$34D6 d15:data:reset=0:$0D01 mc Int8+1 0:$34D7 d15:data:reset=0:$0E01 mc Int16+1 0:$34D8 d15:data:reset=0:$5AAD mc Add 0:$34D9 d15:data:reset=0:$18FF mc Lget+255 0:$34DA d15:data:reset=0:$5AAD mc Add 0:$34DB d15:data:reset=0:$18F8 mc Lget+248 0:$34DC d15:data:reset=0:$5BAC mc Sub 0:$34DD d15:data:reset=0:$5F29 mc Nip 0:$34DE d15:data:reset=0:$0255 mc Bra+85 0:$34DF d15:data:reset=0:$45F6 mc Dup 0:$34E0 d15:data:reset=0:$18F8 mc Lget+248 0:$34E1 d15:data:reset=0:$0C01 mc Subq+1 0:$34E2 d15:data:reset=0:$47DF mc Eq 0:$34E3 d15:data:reset=0:$0603 mc BraIf0+3 0:$34E4 d15:data:reset=0:$0D91 mc Int8+DUP&$FF 0:$34E5 d15:data:reset=0:$0E5A mc Int16+(DUP>>8)&$FF 0:$34E6 d15:data:reset=0:$0209 mc Bra+9 0:$34E7 d15:data:reset=0:$0D00 mc Int8+LGET&$FF 0:$34E8 d15:data:reset=0:$0E1F mc Int16+(LGET>>8)&$FF 0:$34E9 d15:data:reset=0:$0D01 mc Int8+1 0:$34EA d15:data:reset=0:$0E01 mc Int16+1 0:$34EB d15:data:reset=0:$5AAD mc Add 0:$34EC d15:data:reset=0:$18FF mc Lget+255 0:$34ED d15:data:reset=0:$5AAD mc Add 0:$34EE d15:data:reset=0:$18F8 mc Lget+248 0:$34EF d15:data:reset=0:$5BAC mc Sub 0:$34F0 d15:data:reset=0:$5F29 mc Nip 0:$34F1 d15:data:reset=0:$0242 mc Bra+66 0:$34F2 d15:data:reset=0:$45F6 mc Dup 0:$34F3 d15:data:reset=0:$18F8 mc Lget+248 0:$34F4 d15:data:reset=0:$0C02 mc Subq+2 0:$34F5 d15:data:reset=0:$47DF mc Eq 0:$34F6 d15:data:reset=0:$0603 mc BraIf0+3 0:$34F7 d15:data:reset=0:$0DE9 mc Int8+NIP&$FF 0:$34F8 d15:data:reset=0:$0E5E mc Int16+(NIP>>8)&$FF 0:$34F9 d15:data:reset=0:$0209 mc Bra+9 0:$34FA d15:data:reset=0:$0D00 mc Int8+LSET&$FF 0:$34FB d15:data:reset=0:$0EA3 mc Int16+(LSET>>8)&$FF 0:$34FC d15:data:reset=0:$0D02 mc Int8+2 0:$34FD d15:data:reset=0:$0E01 mc Int16+1 0:$34FE d15:data:reset=0:$5AAD mc Add 0:$34FF d15:data:reset=0:$18FF mc Lget+255 0:$3500 d15:data:reset=0:$5AAD mc Add 0:$3501 d15:data:reset=0:$18F8 mc Lget+248 0:$3502 d15:data:reset=0:$5BAC mc Sub 0:$3503 d15:data:reset=0:$5F29 mc Nip 0:$3504 d15:data:reset=0:$022F mc Bra+47 0:$3505 d15:data:reset=0:$18F2 mc Lget+242 0:$3506 d15:data:reset=0:$1D00 mc ItemGet+0 0:$3507 d15:data:reset=0:$18FE mc Lget+254 0:$3508 d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$3509 d15:data:reset=0:$18F1 mc Lget+241 0:$350A d15:data:reset=0:$1D09 mc ItemGet+9 0:$350B d15:data:reset=0:$5AAD mc Add 0:$350C d15:data:reset=0:$18FF mc Lget+255 0:$350D d15:data:reset=0:$5AAD mc Add 0:$350E d15:data:reset=0:$5F29 mc Nip 0:$350F d15:data:reset=0:$0224 mc Bra+36 0:$3510 d15:data:reset=0:$18F2 mc Lget+242 0:$3511 d15:data:reset=0:$1D00 mc ItemGet+0 0:$3512 d15:data:reset=0:$18FE mc Lget+254 0:$3513 d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$3514 d15:data:reset=0:$18F6 mc Lget+246 0:$3515 d15:data:reset=0:$07FC mc Lvar+252 0:$3516 d15:data:reset=0:$5DB0 mc Peekpp 0:$3517 d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$3518 d15:data:reset=0:$5AAD mc Add 0:$3519 d15:data:reset=0:$5F29 mc Nip 0:$351A d15:data:reset=0:$0219 mc Bra+25 0:$351B d15:data:reset=0:$0D00 mc Int8+LDQ&$FF 0:$351C d15:data:reset=0:$0EA4 mc Int16+(LDQ>>8)&$FF 0:$351D d15:data:reset=0:$18F1 mc Lget+241 0:$351E d15:data:reset=0:$1D08 mc ItemGet+8 0:$351F d15:data:reset=0:$18FE mc Lget+254 0:$3520 d15:data:reset=0:$0C07 mc Subq+7 0:$3521 d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$3522 d15:data:reset=0:$482D mc Count 0:$3523 d15:data:reset=0:$5AAD mc Add 0:$3524 d15:data:reset=0:$0D03 mc Int8+ALLOC&$FF 0:$3525 d15:data:reset=0:$0EC2 mc Int16+(ALLOC>>8)&$FF 0:$3526 d15:data:reset=0:$60F3 mc BytecodeCompiler__store__6uint16_6uint16_ 0:$3527 d15:data:reset=0:$07F9 mc Lvar+249 0:$3528 d15:data:reset=0:$5E7E mc Incr 0:$3529 d15:data:reset=0:$82FD mc Hi8+253 0:$352A d15:data:reset=0:$A1F3 mc BraFar+243 0:$352B d15:data:reset=0:$07FE mc Lvar+254 0:$352C d15:data:reset=0:$5EA2 mc Decr 0:$352D d15:data:reset=0:$0D2D mc Int8+SELECTI&$FF 0:$352E d15:data:reset=0:$0E5A mc Int16+(SELECTI>>8)&$FF 0:$352F d15:data:reset=0:$18F1 mc Lget+241 0:$3530 d15:data:reset=0:$1D0A mc ItemGet+10 0:$3531 d15:data:reset=0:$60F3 mc BytecodeCompiler__store__6uint16_6uint16_ 0:$3532 d15:data:reset=0:$82FD mc Hi8+253 0:$3533 d15:data:reset=0:$A1EA mc BraFar+234 0:$3534 d15:data:reset=0:$45F6 mc Dup 0:$3535 d15:data:reset=0:$5EAB mc BytecodeCompiler__store__6uint16_ 0:$3536 d15:data:reset=0:$18F2 mc Lget+242 0:$3537 d15:data:reset=0:$1D04 mc ItemGet+4 0:$3538 d15:data:reset=0:$18FE mc Lget+254 0:$3539 d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$353A d15:data:reset=0:$07F8 mc Lvar+248 0:$353B d15:data:reset=0:$5DA8 mc AddPoke 0:$353C d15:data:reset=0:$82FD mc Hi8+253 0:$353D d15:data:reset=0:$A1E0 mc BraFar+224 0:$353E d15:data:reset=0:$18FF mc Lget+255 0:$353F d15:data:reset=0:$0D4C mc Int8+76 0:$3540 d15:data:reset=0:$47D5 mc Ne 0:$3541 d15:data:reset=0:$0602 mc BraIf0+2 0:$3542 d15:data:reset=0:$0DCE mc Int8+206 0:$3543 d15:data:reset=0:$0236 mc Bra+54 0:$3544 d15:data:reset=0:$18FD mc Lget+253 0:$3545 d15:data:reset=0:$5BC5 mc PshHP 0:$3546 d15:data:reset=0:$5DD0 mc Peekmm 0:$3547 d15:data:reset=0:$0630 mc BraIf0+48 0:$3548 d15:data:reset=0:$18FB mc Lget+251 0:$3549 d15:data:reset=0:$18FF mc Lget+255 0:$354A d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$354B d15:data:reset=0:$45F6 mc Dup 0:$354C d15:data:reset=0:$5AC5 mc Peek 0:$354D d15:data:reset=0:$45F6 mc Dup 0:$354E d15:data:reset=0:$C4AA mc Sru15+15-8 0:$354F d15:data:reset=0:$0D00 mc Int8+0 0:$3550 d15:data:reset=0:$47DF mc Eq 0:$3551 d15:data:reset=0:$0606 mc BraIf0+6 0:$3552 d15:data:reset=0:$18F7 mc Lget+247 0:$3553 d15:data:reset=0:$18FF mc Lget+255 0:$3554 d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$3555 d15:data:reset=0:$18FE mc Lget+254 0:$3556 d15:data:reset=0:$5C5A mc Poke 0:$3557 d15:data:reset=0:$021E mc Bra+30 0:$3558 d15:data:reset=0:$18F7 mc Lget+247 0:$3559 d15:data:reset=0:$18FF mc Lget+255 0:$355A d15:data:reset=0:$0DFF mc Int8+255 0:$355B d15:data:reset=0:$5A0F mc And 0:$355C d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$355D d15:data:reset=0:$18FE mc Lget+254 0:$355E d15:data:reset=0:$0B01 mc Addq+1 0:$355F d15:data:reset=0:$5BAC mc Sub 0:$3560 d15:data:reset=0:$45F6 mc Dup 0:$3561 d15:data:reset=0:$0DFF mc Int8+255 0:$3562 d15:data:reset=0:$C2D4 mc Gt 0:$3563 d15:data:reset=0:$47F1 mc Or1 0:$3564 d15:data:reset=0:$0204 mc Bra+4 0:$3565 d15:data:reset=0:$45F6 mc Dup 0:$3566 d15:data:reset=0:$0D00 mc Int8+0 0:$3567 d15:data:reset=0:$0EFF mc Int16+255 0:$3568 d15:data:reset=0:$C2E0 mc Lt 0:$3569 d15:data:reset=0:$0603 mc BraIf0+3 0:$356A d15:data:reset=0:$0DCF mc Int8+207 0:$356B d15:data:reset=0:$5F26 mc MNip0-4 0:$356C d15:data:reset=0:$020D mc Bra+13 0:$356D d15:data:reset=0:$18FF mc Lget+255 0:$356E d15:data:reset=0:$0D00 mc Int8+0 0:$356F d15:data:reset=0:$0EFF mc Int16+255 0:$3570 d15:data:reset=0:$5A0F mc And 0:$3571 d15:data:reset=0:$18FF mc Lget+255 0:$3572 d15:data:reset=0:$5AAD mc Add 0:$3573 d15:data:reset=0:$18FD mc Lget+253 0:$3574 d15:data:reset=0:$5C5A mc Poke 0:$3575 d15:data:reset=0:$5F33 mc MDrop0-1 0:$3576 d15:data:reset=0:$5F32 mc MDrop0-2 0:$3577 d15:data:reset=0:$01CD mc Bra-51 0:$3578 d15:data:reset=0:$0D00 mc Int8+0 0:$3579 d15:data:reset=0:$5F29 mc MNip0-1 0:$357A d15:data:reset=0:$5FA7 mc ToR 0:$357B d15:data:reset=0:$5F30 mc MDrop0-4 0:$357C d15:data:reset=0:$4581 mc DropStr 0:$357D d15:data:reset=0:$4581 mc DropStr 0:$357E d15:data:reset=0:$4581 mc DropStr 0:$357F d15:data:reset=0:$5F31 mc MDrop0-3 0:$3580 d15:data:reset=0:$4581 mc DropStr 0:$3581 d15:data:reset=0:$5F30 mc MDrop0-4 0:$3582 d15:data:reset=0:$5F9C mc FromR 0:$3583 d15:data:reset=0:$5BF4 mc PopContext0 0:$3584 d15:data:reset=0:$5ACD mc Ret : BytecodeCompiler__compile__16BytecodeCompilerC_6uint16_6uint16_6uint16AEC_6uint16AE_6uint16AEC_6uint16____peeknextopcode__6uint16 ( -- uint16 ) Millicoded // Size: 25 microcodes 0:$26E0 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$26E1 0:data:reset=0:$66E4 0:$26E2 0:000011:A1=A6:D0=D0 jp millicoded // * Millicoded 0:$26E3 d15:data:reset=0:$5F70 0:$26E4 d15:data:reset=0:$8F7F mc XLvar+127 0:$26E5 d15:data:reset=0:$5AC5 mc Peek 0:$26E6 d15:data:reset=0:$8F86 mc XLvar+134 0:$26E7 d15:data:reset=0:$5AC5 mc Peek 0:$26E8 d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$26E9 d15:data:reset=0:$45F6 mc Dup 0:$26EA d15:data:reset=0:$0D2D mc Int8+45 0:$26EB d15:data:reset=0:$46C6 mc Uge 0:$26EC d15:data:reset=0:$0603 mc BraIf0+3 0:$26ED d15:data:reset=0:$0D0F mc Int8+15 0:$26EE d15:data:reset=0:$07FF mc Lvar+255 0:$26EF d15:data:reset=0:$5E33 mc SubPoke 0:$26F0 d15:data:reset=0:$45F6 mc Dup 0:$26F1 d15:data:reset=0:$0D3E mc Int8+62 0:$26F2 d15:data:reset=0:$46C6 mc Uge 0:$26F3 d15:data:reset=0:$0603 mc BraIf0+3 0:$26F4 d15:data:reset=0:$0D04 mc Int8+4 0:$26F5 d15:data:reset=0:$07FF mc Lvar+255 0:$26F6 d15:data:reset=0:$5E33 mc SubPoke 0:$26F7 d15:data:reset=0:$45F6 mc Dup 0:$26F8 d15:data:reset=0:$6310 mc MNip0_Next-1 : BytecodeCompiler__compile__16BytecodeCompilerC_6uint16_6uint16_6uint16AEC_6uint16AE_6uint16AEC_6uint16____store_jp_or_bra__6uint16_6uint16_4bool ( uint16, uint16 -- bool ) Millicoded // Size: 64 microcodes 0:$2E62 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$2E63 0:data:reset=0:$6E66 0:$2E64 0:000011:A1=A6:D0=D0 jp millicoded // * Millicoded 0:$2E65 d15:data:reset=0:$5F70 0:$2E66 d15:data:reset=0:$8F7F mc XLvar+127 0:$2E67 d15:data:reset=0:$5AC5 mc Peek 0:$2E68 d15:data:reset=0:$482D mc Count 0:$2E69 d15:data:reset=0:$8F86 mc XLvar+134 0:$2E6A d15:data:reset=0:$5AC5 mc Peek 0:$2E6B d15:data:reset=0:$5BAC mc Sub 0:$2E6C d15:data:reset=0:$0DFF mc Int8+255 0:$2E6D d15:data:reset=0:$C6C6 mc Ugt 0:$2E6E d15:data:reset=0:$47F1 mc Or1 0:$2E6F d15:data:reset=0:$0207 mc Bra+7 0:$2E70 d15:data:reset=0:$9F12 mc Gget+gcode_ptr 0:$2E71 d15:data:reset=0:$8F80 mc XLvar+128 0:$2E72 d15:data:reset=0:$5AC5 mc Peek 0:$2E73 d15:data:reset=0:$1D02 mc ItemGet+2 0:$2E74 d15:data:reset=0:$5BAC mc Sub 0:$2E75 d15:data:reset=0:$0DFF mc Int8+255 0:$2E76 d15:data:reset=0:$C2D4 mc Gt 0:$2E77 d15:data:reset=0:$0605 mc BraIf0+5 0:$2E78 d15:data:reset=0:$18FF mc Lget+255 0:$2E79 d15:data:reset=0:$8F88 mc XLvar+136 0:$2E7A d15:data:reset=0:$5AC5 mc Peek 0:$2E7B d15:data:reset=0:$60F3 mc BytecodeCompiler__store__6uint16_6uint16_ 0:$2E7C d15:data:reset=0:$0205 mc Bra+5 0:$2E7D d15:data:reset=0:$45F6 mc Dup 0:$2E7E d15:data:reset=0:$8F88 mc XLvar+136 0:$2E7F d15:data:reset=0:$5AC5 mc Peek 0:$2E80 d15:data:reset=0:$5AAD mc Add 0:$2E81 d15:data:reset=0:$5EAB mc BytecodeCompiler__store__6uint16_ 0:$2E82 d15:data:reset=0:$9F12 mc Gget+gcode_ptr 0:$2E83 d15:data:reset=0:$0D01 mc Int8+1 0:$2E84 d15:data:reset=0:$5BAC mc Sub 0:$2E85 d15:data:reset=0:$8F84 mc XLvar+132 0:$2E86 d15:data:reset=0:$5AC5 mc Peek 0:$2E87 d15:data:reset=0:$8F85 mc XLvar+133 0:$2E88 d15:data:reset=0:$5DB0 mc Peekpp 0:$2E89 d15:data:reset=0:$5E87 mc AtIndexPoke 0:$2E8A d15:data:reset=0:$8F83 mc XLvar+131 0:$2E8B d15:data:reset=0:$5AC5 mc Peek 0:$2E8C d15:data:reset=0:$8F88 mc XLvar+136 0:$2E8D d15:data:reset=0:$5AC5 mc Peek 0:$2E8E d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$2E8F d15:data:reset=0:$0D00 mc Int8+0 0:$2E90 d15:data:reset=0:$47DF mc Eq 0:$2E91 d15:data:reset=0:$0607 mc BraIf0+7 0:$2E92 d15:data:reset=0:$8F81 mc XLvar+129 0:$2E93 d15:data:reset=0:$5AC5 mc Peek 0:$2E94 d15:data:reset=0:$8F83 mc XLvar+131 0:$2E95 d15:data:reset=0:$5AC5 mc Peek 0:$2E96 d15:data:reset=0:$8F88 mc XLvar+136 0:$2E97 d15:data:reset=0:$5AC5 mc Peek 0:$2E98 d15:data:reset=0:$5E87 mc AtIndexPoke 0:$2E99 d15:data:reset=0:$8F81 mc XLvar+129 0:$2E9A d15:data:reset=0:$5AC5 mc Peek 0:$2E9B d15:data:reset=0:$8F83 mc XLvar+131 0:$2E9C d15:data:reset=0:$5AC5 mc Peek 0:$2E9D d15:data:reset=0:$8F88 mc XLvar+136 0:$2E9E d15:data:reset=0:$5AC5 mc Peek 0:$2E9F d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$2EA0 d15:data:reset=0:$47D5 mc Ne 0:$2EA1 d15:data:reset=0:$630F mc MNip0_Next-2 : BytecodeCompiler__store__6uint16_ ( uint16 ) Millicoded // Size: 9 microcodes 0:$1EAB 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$1EAC 0:data:reset=0:$5EAF 0:$1EAD 0:000011:A1=A6:D0=D0 jp millicoded // * Millicoded 0:$1EAE d15:data:reset=0:$5F70 0:$1EAF d15:data:reset=0:$45F6 mc Dup 0:$1EB0 d15:data:reset=0:$0D12 mc Gvar+gcode_ptr 0:$1EB1 d15:data:reset=0:$5DB0 mc Peekpp 0:$1EB2 d15:data:reset=0:$5C5A mc Poke 0:$1EB3 d15:data:reset=0:$5FFB mc MDrop0_Next-1 : BytecodeCompiler__store__6uint16_6uint16_ ( uint16, uint16 ) Millicoded // Size: 13 microcodes 0:$20F3 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$20F4 0:data:reset=0:$60F7 0:$20F5 0:000011:A1=A0:D0=D0 jp millicoded // * Millicoded 0:$20F6 d15:data:reset=0:$5F70 0:$20F7 d15:data:reset=0:$18FF mc Lget+255 0:$20F8 d15:data:reset=0:$0D12 mc Gvar+gcode_ptr 0:$20F9 d15:data:reset=0:$5DB0 mc Peekpp 0:$20FA d15:data:reset=0:$5C5A mc Poke 0:$20FB d15:data:reset=0:$45F6 mc Dup 0:$20FC d15:data:reset=0:$0D12 mc Gvar+gcode_ptr 0:$20FD d15:data:reset=0:$5DB0 mc Peekpp 0:$20FE d15:data:reset=0:$5C5A mc Poke 0:$20FF d15:data:reset=0:$5FFA mc MDrop0_Next-2 : SYSTIME__6uint16 ( -- uint16 ) Millicoded // Size: 15 microcodes 0:$2283 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$2284 0:data:reset=0:$6287 0:$2285 0:000011:A1=A2:D0=D0 jp millicoded // * Millicoded 0:$2286 d15:data:reset=0:$5F70 0:$2287 d15:data:reset=0:$0D24 mc Gvar+current_time 0:$2288 d15:data:reset=0:$0B01 mc Addq+1 0:$2289 d15:data:reset=0:$5AC5 mc Peek 0:$228A d15:data:reset=0:$C399 mc Sli15+15-10 0:$228B d15:data:reset=0:$0D26 mc Gvar+current_microsec 0:$228C d15:data:reset=0:$5CD6 mc Peek2 0:$228D d15:data:reset=0:$0D0A mc Int8+10 0:$228E d15:data:reset=0:$455C mc SrUL 0:$228F d15:data:reset=0:$5F29 mc MNip0-1 0:$2290 d15:data:reset=0:$5AAD mc Add 0:$2291 d15:data:reset=0:$5B8A mc RET : COPY__6uint16AEC_6uint16_6uint16AEC_6uint16_6uint16_ ( uint16[]¢, uint16, uint16[]¢, uint16, uint16 ) Millicoded 0:$1C12 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$1C13 0:data:reset=0:$5C16 0:$1C14 0:000011:A1=A4:D0=D0 jp millicoded // * Millicoded 0:$1C15 d15:data:reset=0:$5F70 0:$1C16 d15:data:reset=0:$7A0B mc copy__6uint16AEC_6uint16_6uint16AEC_6uint16_6uint16_ 0:$1C17 d15:data:reset=0:$5B8A mc RET : I2C_READ_DATA__6uint16_6uint16AEC_6uint16_6uint16_6uint16 ( uint16, uint16[]¢, uint16, uint16 -- uint16 ) TODO 0:$1A35 0:000011:A6=A1:D3=D0 ld atmp,$ // * TODO 0:$1A36 0:data:reset=0:$5A35 0:$1A37 0:000011:A1=A2:D0=D0 jp TODO // * TODO 0:$1A38 d15:data:reset=0:$697C // add (hp) // convert last parameter: cnt -> end_addr // Millicoded // mc i2cReadData__6uint16_6uint16AEC_6uint16_6uint16_6uint16 // mc RET : I2C_WRITE_DATA__6uint16_6uint16AEC_6uint16_6uint16_6uint16 ( uint16, uint16[]¢, uint16, uint16 -- uint16 ) TODO 0:$1A29 0:000011:A6=A1:D3=D0 ld atmp,$ // * TODO 0:$1A2A 0:data:reset=0:$5A29 0:$1A2B 0:000011:A1=A2:D0=D0 jp TODO // * TODO 0:$1A2C d15:data:reset=0:$697C // add (hp) // convert last parameter: cnt -> end_addr // Millicoded // mc i2cWriteData__6uint16_6uint16AEC_6uint16_6uint16_6uint16 // mc RET // --- file: "bcc.asm" --- #include "shell.cc" // +++ file: "shell.asm" +++ // K1-16/16 Microcode // 2015-12-22 16:10:40 : implicit__shell__kill__8ucs2charAEAE_8ucs2charAEAE ( ucs2str[] -- ucs2str[] ) Millicoded // Size: 12 microcodes 0:$2010 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$2011 0:data:reset=0:$6014 0:$2012 0:000011:A1=A0:D0=D0 jp millicoded // * Millicoded 0:$2013 d15:data:reset=0:$5F70 0:$2014 d15:data:reset=0:$45F6 mc Dup 0:$2015 d15:data:reset=0:$473D mc ForAllItems 0:$2016 d15:data:reset=0:$0202 mc Bra+2 0:$2017 d15:data:reset=0:$5AC5 mc Peek 0:$2018 d15:data:reset=0:$4581 mc DropStr 0:$2019 d15:data:reset=0:$43ED mc mmNextItem 0:$201A d15:data:reset=0:$01FC mc Bra-4 0:$201B d15:data:reset=0:$5ACD mc Ret : implicit__shell__kill__2FD_2FD ( FD -- FD ) Millicoded // Size: 8 microcodes 0:$1E1B 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$1E1C 0:data:reset=0:$5E1F 0:$1E1D 0:000011:A1=A6:D0=D0 jp millicoded // * Millicoded 0:$1E1E d15:data:reset=0:$5F70 0:$1E1F d15:data:reset=0:$45F6 mc Dup 0:$1E20 d15:data:reset=0:$1D01 mc ItemGet+1 0:$1E21 d15:data:reset=0:$4581 mc DropStr 0:$1E22 d15:data:reset=0:$5ACD mc Ret : implicit__shell__kill__5Shell_5Shell ( Shell -- Shell ) Millicoded // Size: 25 microcodes 0:$26F9 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$26FA 0:data:reset=0:$66FD 0:$26FB 0:000011:A1=A6:D0=D0 jp millicoded // * Millicoded 0:$26FC d15:data:reset=0:$5F70 0:$26FD d15:data:reset=0:$45F6 mc Dup 0:$26FE d15:data:reset=0:$1D00 mc ItemGet+0 0:$26FF d15:data:reset=0:$46BA mc CallKill 0:$2700 d15:data:reset=0:$5E1B mc implicit__shell__kill__2FD_2FD 0:$2701 d15:data:reset=0:$4581 mc DropStr 0:$2702 d15:data:reset=0:$45F6 mc Dup 0:$2703 d15:data:reset=0:$1D01 mc ItemGet+1 0:$2704 d15:data:reset=0:$46BA mc CallKill 0:$2705 d15:data:reset=0:$5E1B mc implicit__shell__kill__2FD_2FD 0:$2706 d15:data:reset=0:$4581 mc DropStr 0:$2707 d15:data:reset=0:$45F6 mc Dup 0:$2708 d15:data:reset=0:$1D02 mc ItemGet+2 0:$2709 d15:data:reset=0:$46BA mc CallKill 0:$270A d15:data:reset=0:$5E1B mc implicit__shell__kill__2FD_2FD 0:$270B d15:data:reset=0:$4581 mc DropStr 0:$270C d15:data:reset=0:$45F6 mc Dup 0:$270D d15:data:reset=0:$1D03 mc ItemGet+3 0:$270E d15:data:reset=0:$46BA mc CallKill 0:$270F d15:data:reset=0:$5E1B mc implicit__shell__kill__2FD_2FD 0:$2710 d15:data:reset=0:$4581 mc DropStr 0:$2711 d15:data:reset=0:$5ACD mc Ret : Shell__input__5ShellC_8ucs2charAEC_8ucs2charAE ( Shell¢, ucs2str¢ -- ucs2str ) Millicoded // Size: 262 microcodes 0:$2EFA 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$2EFB 0:data:reset=0:$6EFE 0:$2EFC 0:000011:A1=A6:D0=D0 jp millicoded // * Millicoded 0:$2EFD d15:data:reset=0:$5F70 0:$2EFE d15:data:reset=0:$0D00 mc Int8+0 0:$2EFF d15:data:reset=0:$0D00 mc Int8+0 0:$2F00 d15:data:reset=0:$0D00 mc Int8+0 0:$2F01 d15:data:reset=0:$0F00 mc Istr+0 0:$2F02 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$2F03 d15:data:reset=0:$07FD mc Lvar+253 0:$2F04 d15:data:reset=0:$7A05 mc SwapWithVar 0:$2F05 d15:data:reset=0:$4581 mc DropStr 0:$2F06 d15:data:reset=0:$0D00 mc Int8+0 0:$2F07 d15:data:reset=0:$8EFF mc Lset+255 0:$2F08 d15:data:reset=0:$9F1D mc Gget+stdout 0:$2F09 d15:data:reset=0:$0D05 mc Int8+5 0:$2F0A d15:data:reset=0:$7C04 mc sing_99_bottles_of_beer__2FDC_5int16_ 0:$2F0B d15:data:reset=0:$9F1D mc Gget+stdout 0:$2F0C d15:data:reset=0:$0F02 mc Istr+2 0:$2F0D 0:data:reset=0:$000A dm 10 0:$2F0E 0:data:reset=0:$000D dm 13 0:$2F0F 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$2F10 d15:data:reset=0:$5E75 mc FD__putstr__2FDC_8ucs2charAE_ 0:$2F11 d15:data:reset=0:$9F1D mc Gget+stdout 0:$2F12 d15:data:reset=0:$18FC mc Lget+252 0:$2F13 d15:data:reset=0:$62F0 mc FD__writebytes__2FDC_6uint16AEC_ 0:$2F14 d15:data:reset=0:$9F1D mc Gget+stdout 0:$2F15 d15:data:reset=0:$0D20 mc Int8+32 0:$2F16 d15:data:reset=0:$62D0 mc FD__writebyte__2FDC_6uint16_ 0:$2F17 d15:data:reset=0:$9F1C mc Gget+stdin 0:$2F18 d15:data:reset=0:$6265 mc FD__getavail__2FDC_6uint16 0:$2F19 d15:data:reset=0:$0403 mc BraIf1+3 0:$2F1A d15:data:reset=0:$9F1D mc Gget+stdout 0:$2F1B d15:data:reset=0:$0D07 mc Int8+7 0:$2F1C d15:data:reset=0:$62D0 mc FD__writebyte__2FDC_6uint16_ 0:$2F1D d15:data:reset=0:$9F1C mc Gget+stdin 0:$2F1E d15:data:reset=0:$6BBF mc FD__readbyte__2FDC_6uint16 0:$2F1F d15:data:reset=0:$5F29 mc Nip 0:$2F20 d15:data:reset=0:$45F6 mc Dup 0:$2F21 d15:data:reset=0:$0C08 mc Subq+8 0:$2F22 d15:data:reset=0:$090F mc Switch+15 0:$2F23 d15:data:reset=0:$0210 mc Bra+16 0:$2F24 d15:data:reset=0:$0287 mc Bra+135 0:$2F25 d15:data:reset=0:$0267 mc Bra+103 0:$2F26 d15:data:reset=0:$024D mc Bra+77 0:$2F27 d15:data:reset=0:$0214 mc Bra+20 0:$2F28 d15:data:reset=0:$02C1 mc Bra+193 0:$2F29 d15:data:reset=0:$021E mc Bra+30 0:$2F2A d15:data:reset=0:$0281 mc Bra+129 0:$2F2B d15:data:reset=0:$0280 mc Bra+128 0:$2F2C d15:data:reset=0:$027F mc Bra+127 0:$2F2D d15:data:reset=0:$027E mc Bra+126 0:$2F2E d15:data:reset=0:$027D mc Bra+125 0:$2F2F d15:data:reset=0:$0221 mc Bra+33 0:$2F30 d15:data:reset=0:$0250 mc Bra+80 0:$2F31 d15:data:reset=0:$026B mc Bra+107 0:$2F32 d15:data:reset=0:$0279 mc Bra+121 0:$2F33 d15:data:reset=0:$02B6 mc Bra+182 0:$2F34 d15:data:reset=0:$18FF mc Lget+255 0:$2F35 d15:data:reset=0:$05E1 mc BraIf0-31 0:$2F36 d15:data:reset=0:$9F1D mc Gget+stdout 0:$2F37 d15:data:reset=0:$0D08 mc Int8+8 0:$2F38 d15:data:reset=0:$62D0 mc FD__writebyte__2FDC_6uint16_ 0:$2F39 d15:data:reset=0:$07FF mc Lvar+255 0:$2F3A d15:data:reset=0:$5EA2 mc Decr 0:$2F3B d15:data:reset=0:$01DB mc Bra-37 0:$2F3C d15:data:reset=0:$18FF mc Lget+255 0:$2F3D d15:data:reset=0:$18FD mc Lget+253 0:$2F3E d15:data:reset=0:$482D mc Count 0:$2F3F d15:data:reset=0:$46CC mc Ult 0:$2F40 d15:data:reset=0:$05D6 mc BraIf0-42 0:$2F41 d15:data:reset=0:$9F1D mc Gget+stdout 0:$2F42 d15:data:reset=0:$18FD mc Lget+253 0:$2F43 d15:data:reset=0:$07FD mc Lvar+253 0:$2F44 d15:data:reset=0:$5DB0 mc Peekpp 0:$2F45 d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$2F46 d15:data:reset=0:$62D0 mc FD__writebyte__2FDC_6uint16_ 0:$2F47 d15:data:reset=0:$01CF mc Bra-49 0:$2F48 d15:data:reset=0:$18FF mc Lget+255 0:$2F49 d15:data:reset=0:$0D00 mc Int8+0 0:$2F4A d15:data:reset=0:$47DF mc Eq 0:$2F4B d15:data:reset=0:$03CB mc BraIf1-53 0:$2F4C d15:data:reset=0:$9F1D mc Gget+stdout 0:$2F4D d15:data:reset=0:$0D08 mc Int8+8 0:$2F4E d15:data:reset=0:$62D0 mc FD__writebyte__2FDC_6uint16_ 0:$2F4F d15:data:reset=0:$07FF mc Lvar+255 0:$2F50 d15:data:reset=0:$5EA2 mc Decr 0:$2F51 d15:data:reset=0:$18FE mc Lget+254 0:$2F52 d15:data:reset=0:$0D00 mc Int8+0 0:$2F53 d15:data:reset=0:$18FD mc Lget+253 0:$2F54 d15:data:reset=0:$7D04 mc SubStr 0:$2F55 d15:data:reset=0:$18FB mc Lget+251 0:$2F56 d15:data:reset=0:$18FB mc Lget+251 0:$2F57 d15:data:reset=0:$0B01 mc Addq+1 0:$2F58 d15:data:reset=0:$0DFF mc Int8+255 0:$2F59 d15:data:reset=0:$0E7F mc Int16+127 0:$2F5A d15:data:reset=0:$7D04 mc SubStr 0:$2F5B d15:data:reset=0:$6A65 mc CatRangeRange 0:$2F5C d15:data:reset=0:$07FD mc Lvar+253 0:$2F5D d15:data:reset=0:$7A05 mc SwapWithVar 0:$2F5E d15:data:reset=0:$4581 mc DropStr 0:$2F5F d15:data:reset=0:$9F1D mc Gget+stdout 0:$2F60 d15:data:reset=0:$0D05 mc Int8+5 0:$2F61 d15:data:reset=0:$62D0 mc FD__writebyte__2FDC_6uint16_ 0:$2F62 d15:data:reset=0:$9F1D mc Gget+stdout 0:$2F63 d15:data:reset=0:$18FD mc Lget+253 0:$2F64 d15:data:reset=0:$18FD mc Lget+253 0:$2F65 d15:data:reset=0:$0DFF mc Int8+255 0:$2F66 d15:data:reset=0:$0E7F mc Int16+127 0:$2F67 d15:data:reset=0:$7D04 mc SubStr 0:$2F68 d15:data:reset=0:$6712 mc Cast_RangeStr 0:$2F69 d15:data:reset=0:$5A61 mc DupToR 0:$2F6A d15:data:reset=0:$62F0 mc FD__writebytes__2FDC_6uint16AEC_ 0:$2F6B d15:data:reset=0:$5F9C mc FromR 0:$2F6C d15:data:reset=0:$4581 mc DropStr 0:$2F6D d15:data:reset=0:$9F1D mc Gget+stdout 0:$2F6E d15:data:reset=0:$0D20 mc Int8+32 0:$2F6F d15:data:reset=0:$62D0 mc FD__writebyte__2FDC_6uint16_ 0:$2F70 d15:data:reset=0:$9F1D mc Gget+stdout 0:$2F71 d15:data:reset=0:$0D06 mc Int8+6 0:$2F72 d15:data:reset=0:$62D0 mc FD__writebyte__2FDC_6uint16_ 0:$2F73 d15:data:reset=0:$01A3 mc Bra-93 0:$2F74 d15:data:reset=0:$18FF mc Lget+255 0:$2F75 d15:data:reset=0:$18FB mc Lget+251 0:$2F76 d15:data:reset=0:$1D05 mc ItemGet+5 0:$2F77 d15:data:reset=0:$46C6 mc Uge 0:$2F78 d15:data:reset=0:$0608 mc BraIf0+8 0:$2F79 d15:data:reset=0:$9F1D mc Gget+stdout 0:$2F7A d15:data:reset=0:$0D0B mc Int8+11 0:$2F7B d15:data:reset=0:$62D0 mc FD__writebyte__2FDC_6uint16_ 0:$2F7C d15:data:reset=0:$18FC mc Lget+252 0:$2F7D d15:data:reset=0:$1D05 mc ItemGet+5 0:$2F7E d15:data:reset=0:$07FE mc Lvar+254 0:$2F7F d15:data:reset=0:$5E33 mc SubPoke 0:$2F80 d15:data:reset=0:$0196 mc Bra-106 0:$2F81 d15:data:reset=0:$9F1D mc Gget+stdout 0:$2F82 d15:data:reset=0:$0D12 mc Int8+18 0:$2F83 d15:data:reset=0:$62D0 mc FD__writebyte__2FDC_6uint16_ 0:$2F84 d15:data:reset=0:$9F1D mc Gget+stdout 0:$2F85 d15:data:reset=0:$18FE mc Lget+254 0:$2F86 d15:data:reset=0:$62D0 mc FD__writebyte__2FDC_6uint16_ 0:$2F87 d15:data:reset=0:$0D00 mc Int8+0 0:$2F88 d15:data:reset=0:$8EFF mc Lset+255 0:$2F89 d15:data:reset=0:$9F1D mc Gget+stdout 0:$2F8A d15:data:reset=0:$0D08 mc Int8+8 0:$2F8B d15:data:reset=0:$62D0 mc FD__writebyte__2FDC_6uint16_ 0:$2F8C d15:data:reset=0:$018A mc Bra-118 0:$2F8D d15:data:reset=0:$18FF mc Lget+255 0:$2F8E d15:data:reset=0:$18FB mc Lget+251 0:$2F8F d15:data:reset=0:$1D05 mc ItemGet+5 0:$2F90 d15:data:reset=0:$5AAD mc Add 0:$2F91 d15:data:reset=0:$18FD mc Lget+253 0:$2F92 d15:data:reset=0:$482D mc Count 0:$2F93 d15:data:reset=0:$C6CC mc Ule 0:$2F94 d15:data:reset=0:$0608 mc BraIf0+8 0:$2F95 d15:data:reset=0:$9F1D mc Gget+stdout 0:$2F96 d15:data:reset=0:$0D0A mc Int8+10 0:$2F97 d15:data:reset=0:$62D0 mc FD__writebyte__2FDC_6uint16_ 0:$2F98 d15:data:reset=0:$18FC mc Lget+252 0:$2F99 d15:data:reset=0:$1D05 mc ItemGet+5 0:$2F9A d15:data:reset=0:$07FE mc Lvar+254 0:$2F9B d15:data:reset=0:$5DA8 mc AddPoke 0:$2F9C d15:data:reset=0:$017A mc Bra-134 0:$2F9D d15:data:reset=0:$9F1D mc Gget+stdout 0:$2F9E d15:data:reset=0:$18FD mc Lget+253 0:$2F9F d15:data:reset=0:$18FD mc Lget+253 0:$2FA0 d15:data:reset=0:$0DFF mc Int8+255 0:$2FA1 d15:data:reset=0:$0E7F mc Int16+127 0:$2FA2 d15:data:reset=0:$7D04 mc SubStr 0:$2FA3 d15:data:reset=0:$6712 mc Cast_RangeStr 0:$2FA4 d15:data:reset=0:$5A61 mc DupToR 0:$2FA5 d15:data:reset=0:$62F0 mc FD__writebytes__2FDC_6uint16AEC_ 0:$2FA6 d15:data:reset=0:$5F9C mc FromR 0:$2FA7 d15:data:reset=0:$4581 mc DropStr 0:$2FA8 d15:data:reset=0:$18FE mc Lget+254 0:$2FA9 d15:data:reset=0:$482D mc Count 0:$2FAA d15:data:reset=0:$8EFF mc Lset+255 0:$2FAB d15:data:reset=0:$016B mc Bra-149 0:$2FAC d15:data:reset=0:$45F6 mc Dup 0:$2FAD d15:data:reset=0:$0D7F mc Int8+127 0:$2FAE d15:data:reset=0:$5A0F mc And 0:$2FAF d15:data:reset=0:$0D20 mc Int8+32 0:$2FB0 d15:data:reset=0:$46C6 mc Uge 0:$2FB1 d15:data:reset=0:$062B mc BraIf0+43 0:$2FB2 d15:data:reset=0:$9F1D mc Gget+stdout 0:$2FB3 d15:data:reset=0:$18FF mc Lget+255 0:$2FB4 d15:data:reset=0:$62D0 mc FD__writebyte__2FDC_6uint16_ 0:$2FB5 d15:data:reset=0:$18FF mc Lget+255 0:$2FB6 d15:data:reset=0:$18FD mc Lget+253 0:$2FB7 d15:data:reset=0:$482D mc Count 0:$2FB8 d15:data:reset=0:$46CC mc Ult 0:$2FB9 d15:data:reset=0:$0611 mc BraIf0+17 0:$2FBA d15:data:reset=0:$9F1D mc Gget+stdout 0:$2FBB d15:data:reset=0:$0D05 mc Int8+5 0:$2FBC d15:data:reset=0:$62D0 mc FD__writebyte__2FDC_6uint16_ 0:$2FBD d15:data:reset=0:$9F1D mc Gget+stdout 0:$2FBE d15:data:reset=0:$18FD mc Lget+253 0:$2FBF d15:data:reset=0:$18FD mc Lget+253 0:$2FC0 d15:data:reset=0:$0DFF mc Int8+255 0:$2FC1 d15:data:reset=0:$0E7F mc Int16+127 0:$2FC2 d15:data:reset=0:$7D04 mc SubStr 0:$2FC3 d15:data:reset=0:$6712 mc Cast_RangeStr 0:$2FC4 d15:data:reset=0:$5A61 mc DupToR 0:$2FC5 d15:data:reset=0:$62F0 mc FD__writebytes__2FDC_6uint16AEC_ 0:$2FC6 d15:data:reset=0:$5F9C mc FromR 0:$2FC7 d15:data:reset=0:$4581 mc DropStr 0:$2FC8 d15:data:reset=0:$9F1D mc Gget+stdout 0:$2FC9 d15:data:reset=0:$0D06 mc Int8+6 0:$2FCA d15:data:reset=0:$62D0 mc FD__writebyte__2FDC_6uint16_ 0:$2FCB d15:data:reset=0:$18FE mc Lget+254 0:$2FCC d15:data:reset=0:$0D00 mc Int8+0 0:$2FCD d15:data:reset=0:$18FD mc Lget+253 0:$2FCE d15:data:reset=0:$7D04 mc SubStr 0:$2FCF d15:data:reset=0:$18FD mc Lget+253 0:$2FD0 d15:data:reset=0:$688A mc CatRangeChar 0:$2FD1 d15:data:reset=0:$18FD mc Lget+253 0:$2FD2 d15:data:reset=0:$18FD mc Lget+253 0:$2FD3 d15:data:reset=0:$0DFF mc Int8+255 0:$2FD4 d15:data:reset=0:$0E7F mc Int16+127 0:$2FD5 d15:data:reset=0:$7D04 mc SubStr 0:$2FD6 d15:data:reset=0:$6AF9 mc CatStrRange 0:$2FD7 d15:data:reset=0:$07FD mc Lvar+253 0:$2FD8 d15:data:reset=0:$7A05 mc SwapWithVar 0:$2FD9 d15:data:reset=0:$4581 mc DropStr 0:$2FDA d15:data:reset=0:$07FF mc Lvar+255 0:$2FDB d15:data:reset=0:$5E7E mc Incr 0:$2FDC d15:data:reset=0:$013A mc Bra-198 0:$2FDD d15:data:reset=0:$9F1D mc Gget+stdout 0:$2FDE d15:data:reset=0:$0F01 mc Istr+1 0:$2FDF 0:data:reset=0:$007B dm '{' 0:$2FE0 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$2FE1 d15:data:reset=0:$18FE mc Lget+254 0:$2FE2 d15:data:reset=0:$6453 mc NumStrU 0:$2FE3 d15:data:reset=0:$6AAF mc CatStrStr 0:$2FE4 d15:data:reset=0:$0F01 mc Istr+1 0:$2FE5 0:data:reset=0:$007D dm '}' 0:$2FE6 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$2FE7 d15:data:reset=0:$6AAF mc CatStrStr 0:$2FE8 d15:data:reset=0:$5E75 mc FD__putstr__2FDC_8ucs2charAE_ 0:$2FE9 d15:data:reset=0:$012D mc Bra-211 0:$2FEA d15:data:reset=0:$9F1D mc Gget+stdout 0:$2FEB d15:data:reset=0:$18FD mc Lget+253 0:$2FEC d15:data:reset=0:$18FD mc Lget+253 0:$2FED d15:data:reset=0:$0DFF mc Int8+255 0:$2FEE d15:data:reset=0:$0E7F mc Int16+127 0:$2FEF d15:data:reset=0:$7D04 mc SubStr 0:$2FF0 d15:data:reset=0:$6712 mc Cast_RangeStr 0:$2FF1 d15:data:reset=0:$5A61 mc DupToR 0:$2FF2 d15:data:reset=0:$62F0 mc FD__writebytes__2FDC_6uint16AEC_ 0:$2FF3 d15:data:reset=0:$5F9C mc FromR 0:$2FF4 d15:data:reset=0:$4581 mc DropStr 0:$2FF5 d15:data:reset=0:$9F1D mc Gget+stdout 0:$2FF6 d15:data:reset=0:$0D20 mc Int8+32 0:$2FF7 d15:data:reset=0:$62D0 mc FD__writebyte__2FDC_6uint16_ 0:$2FF8 d15:data:reset=0:$18FE mc Lget+254 0:$2FF9 d15:data:reset=0:$4667 mc Retain 0:$2FFA d15:data:reset=0:$5FA7 mc ToR 0:$2FFB d15:data:reset=0:$5F32 mc MDrop0-2 0:$2FFC d15:data:reset=0:$4581 mc DropStr 0:$2FFD d15:data:reset=0:$5F32 mc MDrop0-2 0:$2FFE d15:data:reset=0:$5F9C mc FromR 0:$2FFF d15:data:reset=0:$5ACD mc Ret : Shell__breakIntoWords__8ucs2charAEC_8ucs2charAEAE ( ucs2str¢ -- ucs2str[] ) Millicoded // Size: 92 microcodes 0:$3AA6 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$3AA7 0:data:reset=0:$7AAA 0:$3AA8 0:000011:A1=A2:D0=D0 jp millicoded // * Millicoded 0:$3AA9 d15:data:reset=0:$5F70 0:$3AAA d15:data:reset=0:$0D00 mc Int8+0 0:$3AAB d15:data:reset=0:$4203 mc Alloc 0:$3AAC d15:data:reset=0:$18FF mc Lget+255 0:$3AAD d15:data:reset=0:$482D mc Count 0:$3AAE d15:data:reset=0:$0D00 mc Int8+0 0:$3AAF d15:data:reset=0:$0D00 mc Int8+0 0:$3AB0 d15:data:reset=0:$18FF mc Lget+255 0:$3AB1 d15:data:reset=0:$18FD mc Lget+253 0:$3AB2 d15:data:reset=0:$46CC mc Ult 0:$3AB3 d15:data:reset=0:$47E5 mc And0 0:$3AB4 d15:data:reset=0:$0205 mc Bra+5 0:$3AB5 d15:data:reset=0:$18FC mc Lget+252 0:$3AB6 d15:data:reset=0:$18FE mc Lget+254 0:$3AB7 d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$3AB8 d15:data:reset=0:$0D20 mc Int8+32 0:$3AB9 d15:data:reset=0:$C6CC mc Ule 0:$3ABA d15:data:reset=0:$0603 mc BraIf0+3 0:$3ABB d15:data:reset=0:$07FF mc Lvar+255 0:$3ABC d15:data:reset=0:$5E7E mc Incr 0:$3ABD d15:data:reset=0:$01F2 mc Bra-14 0:$3ABE d15:data:reset=0:$18FF mc Lget+255 0:$3ABF d15:data:reset=0:$18FD mc Lget+253 0:$3AC0 d15:data:reset=0:$46CC mc Ult 0:$3AC1 d15:data:reset=0:$0636 mc BraIf0+54 0:$3AC2 d15:data:reset=0:$18FF mc Lget+255 0:$3AC3 d15:data:reset=0:$5F29 mc Nip 0:$3AC4 d15:data:reset=0:$18FC mc Lget+252 0:$3AC5 d15:data:reset=0:$18FF mc Lget+255 0:$3AC6 d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$3AC7 d15:data:reset=0:$0D22 mc Int8+34 0:$3AC8 d15:data:reset=0:$47D5 mc Ne 0:$3AC9 d15:data:reset=0:$060E mc BraIf0+14 0:$3ACA d15:data:reset=0:$45F6 mc Dup 0:$3ACB d15:data:reset=0:$18FD mc Lget+253 0:$3ACC d15:data:reset=0:$46CC mc Ult 0:$3ACD d15:data:reset=0:$47E5 mc And0 0:$3ACE d15:data:reset=0:$0205 mc Bra+5 0:$3ACF d15:data:reset=0:$18FC mc Lget+252 0:$3AD0 d15:data:reset=0:$18FF mc Lget+255 0:$3AD1 d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$3AD2 d15:data:reset=0:$0D20 mc Int8+32 0:$3AD3 d15:data:reset=0:$C6C6 mc Ugt 0:$3AD4 d15:data:reset=0:$0611 mc BraIf0+17 0:$3AD5 d15:data:reset=0:$5BC5 mc PshHP 0:$3AD6 d15:data:reset=0:$5E7E mc Incr 0:$3AD7 d15:data:reset=0:$01F2 mc Bra-14 0:$3AD8 d15:data:reset=0:$5BC5 mc PshHP 0:$3AD9 d15:data:reset=0:$5E7E mc Incr 0:$3ADA d15:data:reset=0:$45F6 mc Dup 0:$3ADB d15:data:reset=0:$18FD mc Lget+253 0:$3ADC d15:data:reset=0:$46CC mc Ult 0:$3ADD d15:data:reset=0:$47E5 mc And0 0:$3ADE d15:data:reset=0:$0206 mc Bra+6 0:$3ADF d15:data:reset=0:$18FC mc Lget+252 0:$3AE0 d15:data:reset=0:$07FF mc Lvar+255 0:$3AE1 d15:data:reset=0:$5DB0 mc Peekpp 0:$3AE2 d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$3AE3 d15:data:reset=0:$0D22 mc Int8+34 0:$3AE4 d15:data:reset=0:$47D5 mc Ne 0:$3AE5 d15:data:reset=0:$03F4 mc BraIf1-12 0:$3AE6 d15:data:reset=0:$07FD mc Lvar+253 0:$3AE7 d15:data:reset=0:$458D mc PeekNZ 0:$3AE8 d15:data:reset=0:$18FC mc Lget+252 0:$3AE9 d15:data:reset=0:$482D mc Count 0:$3AEA d15:data:reset=0:$0B01 mc Addq+1 0:$3AEB d15:data:reset=0:$47AA mc GrowStr 0:$3AEC d15:data:reset=0:$18FC mc Lget+252 0:$3AED d15:data:reset=0:$18FE mc Lget+254 0:$3AEE d15:data:reset=0:$18FE mc Lget+254 0:$3AEF d15:data:reset=0:$7D04 mc SubStr 0:$3AF0 d15:data:reset=0:$6712 mc Cast_RangeStr 0:$3AF1 d15:data:reset=0:$18FC mc Lget+252 0:$3AF2 d15:data:reset=0:$4604 mc Last 0:$3AF3 d15:data:reset=0:$7A05 mc SwapWithVar 0:$3AF4 d15:data:reset=0:$4581 mc DropStr 0:$3AF5 d15:data:reset=0:$45F6 mc Dup 0:$3AF6 d15:data:reset=0:$8EFF mc Lset+255 0:$3AF7 d15:data:reset=0:$01B8 mc Bra-72 0:$3AF8 d15:data:reset=0:$18FD mc Lget+253 0:$3AF9 d15:data:reset=0:$4667 mc Retain 0:$3AFA d15:data:reset=0:$5FA7 mc ToR 0:$3AFB d15:data:reset=0:$5F31 mc MDrop0-3 0:$3AFC d15:data:reset=0:$46BA mc CallKill 0:$3AFD d15:data:reset=0:$6010 mc implicit__shell__kill__8ucs2charAEAE_8ucs2charAEAE 0:$3AFE d15:data:reset=0:$4581 mc DropStr 0:$3AFF d15:data:reset=0:$5F33 mc MDrop0-1 0:$3B00 d15:data:reset=0:$5F9C mc FromR 0:$3B01 d15:data:reset=0:$5ACD mc Ret : Shell__run__5ShellC_ ( Shell¢ ) Millicoded // Size: 53 microcodes 0:$2DF5 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$2DF6 0:data:reset=0:$6DF9 0:$2DF7 0:000011:A1=A5:D0=D0 jp millicoded // * Millicoded 0:$2DF8 d15:data:reset=0:$5F70 0:$2DF9 d15:data:reset=0:$0D24 mc Gvar+current_time 0:$2DFA d15:data:reset=0:$5CD6 mc Peek2 0:$2DFB d15:data:reset=0:$7B7E mc numstr__6uint32_8ucs2charAE 0:$2DFC d15:data:reset=0:$0F01 mc Istr+1 0:$2DFD 0:data:reset=0:$003E dm '>' 0:$2DFE 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$2DFF d15:data:reset=0:$6AAF mc CatStrStr 0:$2E00 d15:data:reset=0:$18FF mc Lget+255 0:$2E01 d15:data:reset=0:$18FF mc Lget+255 0:$2E02 d15:data:reset=0:$6EFA mc Shell__input__5ShellC_8ucs2charAEC_8ucs2charAE 0:$2E03 d15:data:reset=0:$9F1D mc Gget+stdout 0:$2E04 d15:data:reset=0:$0F03 mc Istr+3 0:$2E05 0:data:reset=0:$002D dm '-' 0:$2E06 0:data:reset=0:$002D dm '-' 0:$2E07 0:data:reset=0:$003E dm '>' 0:$2E08 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$2E09 d15:data:reset=0:$5E75 mc FD__putstr__2FDC_8ucs2charAE_ 0:$2E0A d15:data:reset=0:$45F6 mc Dup 0:$2E0B d15:data:reset=0:$7AA6 mc Shell__breakIntoWords__8ucs2charAEC_8ucs2charAEAE 0:$2E0C d15:data:reset=0:$0D00 mc Int8+0 0:$2E0D d15:data:reset=0:$45F6 mc Dup 0:$2E0E d15:data:reset=0:$18FE mc Lget+254 0:$2E0F d15:data:reset=0:$482D mc Count 0:$2E10 d15:data:reset=0:$46CC mc Ult 0:$2E11 d15:data:reset=0:$0610 mc BraIf0+16 0:$2E12 d15:data:reset=0:$45F6 mc Dup 0:$2E13 d15:data:reset=0:$0607 mc BraIf0+7 0:$2E14 d15:data:reset=0:$9F1D mc Gget+stdout 0:$2E15 d15:data:reset=0:$0F03 mc Istr+3 0:$2E16 0:data:reset=0:$0020 dm ' ' 0:$2E17 0:data:reset=0:$002B dm '+' 0:$2E18 0:data:reset=0:$0020 dm ' ' 0:$2E19 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$2E1A d15:data:reset=0:$5E75 mc FD__putstr__2FDC_8ucs2charAE_ 0:$2E1B d15:data:reset=0:$9F1D mc Gget+stdout 0:$2E1C d15:data:reset=0:$18FE mc Lget+254 0:$2E1D d15:data:reset=0:$07FE mc Lvar+254 0:$2E1E d15:data:reset=0:$5DB0 mc Peekpp 0:$2E1F d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$2E20 d15:data:reset=0:$62F0 mc FD__writebytes__2FDC_6uint16AEC_ 0:$2E21 d15:data:reset=0:$01EB mc Bra-21 0:$2E22 d15:data:reset=0:$5F33 mc MDrop0-1 0:$2E23 d15:data:reset=0:$46BA mc CallKill 0:$2E24 d15:data:reset=0:$6010 mc implicit__shell__kill__8ucs2charAEAE_8ucs2charAEAE 0:$2E25 d15:data:reset=0:$4581 mc DropStr 0:$2E26 d15:data:reset=0:$4581 mc DropStr 0:$2E27 d15:data:reset=0:$4581 mc DropStr 0:$2E28 d15:data:reset=0:$01D0 mc Bra-48 0:$2E29 d15:data:reset=0:$5ACD mc Ret : wait_ms__5int16_ ( int16 ) Millicoded // Size: 91 microcodes 0:$3A4B 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$3A4C 0:data:reset=0:$7A4F 0:$3A4D 0:000011:A1=A2:D0=D0 jp millicoded // * Millicoded 0:$3A4E d15:data:reset=0:$5F70 0:$3A4F d15:data:reset=0:$45F6 mc Dup 0:$3A50 d15:data:reset=0:$0D00 mc Int8+0 0:$3A51 d15:data:reset=0:$C2E0 mc Lt 0:$3A52 d15:data:reset=0:$0452 mc BraIf1+82 0:$3A53 d15:data:reset=0:$0D24 mc Gvar+current_time 0:$3A54 d15:data:reset=0:$5CD6 mc Peek2 0:$3A55 d15:data:reset=0:$18FE mc Lget+254 0:$3A56 d15:data:reset=0:$0DE8 mc Int8+232 0:$3A57 d15:data:reset=0:$0E03 mc Int16+3 0:$3A58 d15:data:reset=0:$41B4 mc Divu 0:$3A59 d15:data:reset=0:$5B75 mc Cast_uL 0:$3A5A d15:data:reset=0:$4727 mc AddL 0:$3A5B d15:data:reset=0:$0D26 mc Gvar+current_microsec 0:$3A5C d15:data:reset=0:$5CD6 mc Peek2 0:$3A5D d15:data:reset=0:$18FC mc Lget+252 0:$3A5E d15:data:reset=0:$0DE8 mc Int8+232 0:$3A5F d15:data:reset=0:$0E03 mc Int16+3 0:$3A60 d15:data:reset=0:$5AE9 mc Remu 0:$3A61 d15:data:reset=0:$0DE8 mc Int8+232 0:$3A62 d15:data:reset=0:$0E03 mc Int16+3 0:$3A63 d15:data:reset=0:$4405 mc Mulu 0:$3A64 d15:data:reset=0:$5B75 mc Cast_uL 0:$3A65 d15:data:reset=0:$4727 mc AddL 0:$3A66 d15:data:reset=0:$07FF mc Lvar+255 0:$3A67 d15:data:reset=0:$5CD6 mc Peek2 0:$3A68 d15:data:reset=0:$0D0F mc Int8+15 0:$3A69 d15:data:reset=0:$0D40 mc Int8+64 0:$3A6A d15:data:reset=0:$0E42 mc Int16+66 0:$3A6B d15:data:reset=0:$468B mc GeUL 0:$3A6C d15:data:reset=0:$0607 mc BraIf0+7 0:$3A6D d15:data:reset=0:$0D0F mc Int8+15 0:$3A6E d15:data:reset=0:$0D40 mc Int8+64 0:$3A6F d15:data:reset=0:$0E42 mc Int16+66 0:$3A70 d15:data:reset=0:$07FD mc Lvar+253 0:$3A71 d15:data:reset=0:$601C mc SubPokeL 0:$3A72 d15:data:reset=0:$07FD mc Lvar+253 0:$3A73 d15:data:reset=0:$4698 mc IncrL 0:$3A74 d15:data:reset=0:$0F06 mc Istr+6 0:$3A75 0:data:reset=0:$0020 dm ' ' 0:$3A76 0:data:reset=0:$0077 dm 'w' 0:$3A77 0:data:reset=0:$0068 dm 'h' 0:$3A78 0:data:reset=0:$0065 dm 'e' 0:$3A79 0:data:reset=0:$006E dm 'n' 0:$3A7A 0:data:reset=0:$003D dm '=' 0:$3A7B 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$3A7C d15:data:reset=0:$07FC mc Lvar+252 0:$3A7D d15:data:reset=0:$5CD6 mc Peek2 0:$3A7E d15:data:reset=0:$7B7E mc NumStrUL 0:$3A7F d15:data:reset=0:$6AAF mc CatStrStr 0:$3A80 d15:data:reset=0:$0F01 mc Istr+1 0:$3A81 0:data:reset=0:$002E dm '.' 0:$3A82 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$3A83 d15:data:reset=0:$6AAF mc CatStrStr 0:$3A84 d15:data:reset=0:$07FE mc Lvar+254 0:$3A85 d15:data:reset=0:$5CD6 mc Peek2 0:$3A86 d15:data:reset=0:$7B7E mc NumStrUL 0:$3A87 d15:data:reset=0:$6AAF mc CatStrStr 0:$3A88 d15:data:reset=0:$0F01 mc Istr+1 0:$3A89 0:data:reset=0:$0020 dm ' ' 0:$3A8A 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$3A8B d15:data:reset=0:$6AAF mc CatStrStr 0:$3A8C d15:data:reset=0:$46D2 mc LogStr 0:$3A8D d15:data:reset=0:$0D24 mc Gvar+current_time 0:$3A8E d15:data:reset=0:$5CD6 mc Peek2 0:$3A8F d15:data:reset=0:$07FB mc Lvar+251 0:$3A90 d15:data:reset=0:$5CD6 mc Peek2 0:$3A91 d15:data:reset=0:$46A0 mc LtUL 0:$3A92 d15:data:reset=0:$0602 mc BraIf0+2 0:$3A93 d15:data:reset=0:$5E90 mc Halt 0:$3A94 d15:data:reset=0:$01F8 mc Bra-8 0:$3A95 d15:data:reset=0:$0D24 mc Gvar+current_time 0:$3A96 d15:data:reset=0:$5CD6 mc Peek2 0:$3A97 d15:data:reset=0:$07FB mc Lvar+251 0:$3A98 d15:data:reset=0:$5CD6 mc Peek2 0:$3A99 d15:data:reset=0:$4748 mc EqL 0:$3A9A d15:data:reset=0:$47E5 mc And0 0:$3A9B d15:data:reset=0:$0205 mc Bra+5 0:$3A9C d15:data:reset=0:$0D26 mc Gvar+current_microsec 0:$3A9D d15:data:reset=0:$5CD6 mc Peek2 0:$3A9E d15:data:reset=0:$07FD mc Lvar+253 0:$3A9F d15:data:reset=0:$5CD6 mc Peek2 0:$3AA0 d15:data:reset=0:$46A0 mc LtUL 0:$3AA1 d15:data:reset=0:$0602 mc BraIf0+2 0:$3AA2 d15:data:reset=0:$5E90 mc Halt 0:$3AA3 d15:data:reset=0:$01F1 mc Bra-15 0:$3AA4 d15:data:reset=0:$5F30 mc MDrop0-4 0:$3AA5 d15:data:reset=0:$5FFB mc MDrop0_Next-1 : new__2FD_2FD_2FD_2FD_5Shell ( FD, FD, FD, FD -- Shell ) Millicoded // Size: 136 microcodes 0:$3E78 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$3E79 0:data:reset=0:$7E7C 0:$3E7A 0:000011:A1=A6:D0=D0 jp millicoded // * Millicoded 0:$3E7B d15:data:reset=0:$5F70 0:$3E7C d15:data:reset=0:$0D01 mc Int8+1 0:$3E7D d15:data:reset=0:$0DFF mc Int8+255 0:$3E7E d15:data:reset=0:$18FC mc Lget+252 0:$3E7F d15:data:reset=0:$6265 mc FD__getavail__2FDC_6uint16 0:$3E80 d15:data:reset=0:$0604 mc BraIf0+4 0:$3E81 d15:data:reset=0:$18FC mc Lget+252 0:$3E82 d15:data:reset=0:$6BBF mc FD__readbyte__2FDC_6uint16 0:$3E83 d15:data:reset=0:$5F33 mc MDrop0-1 0:$3E84 d15:data:reset=0:$01F9 mc Bra-7 0:$3E85 d15:data:reset=0:$18FC mc Lget+252 0:$3E86 d15:data:reset=0:$0D1E mc Int8+30 0:$3E87 d15:data:reset=0:$62D0 mc FD__writebyte__2FDC_6uint16_ 0:$3E88 d15:data:reset=0:$0D64 mc Int8+100 0:$3E89 d15:data:reset=0:$7A4B mc wait_ms__5int16_ 0:$3E8A d15:data:reset=0:$0D00 mc Int8+0 0:$3E8B d15:data:reset=0:$18FB mc Lget+251 0:$3E8C d15:data:reset=0:$6265 mc FD__getavail__2FDC_6uint16 0:$3E8D d15:data:reset=0:$0603 mc BraIf0+3 0:$3E8E d15:data:reset=0:$18FB mc Lget+251 0:$3E8F d15:data:reset=0:$6BBF mc FD__readbyte__2FDC_6uint16 0:$3E90 d15:data:reset=0:$5F29 mc Nip 0:$3E91 d15:data:reset=0:$45F6 mc Dup 0:$3E92 d15:data:reset=0:$0D1E mc Int8+30 0:$3E93 d15:data:reset=0:$47DF mc Eq 0:$3E94 d15:data:reset=0:$0641 mc BraIf0+65 0:$3E95 d15:data:reset=0:$18FB mc Lget+251 0:$3E96 d15:data:reset=0:$63EE mc FD__getstr__2FDC_8ucs2charAE 0:$3E97 d15:data:reset=0:$4581 mc DropStr 0:$3E98 d15:data:reset=0:$18FB mc Lget+251 0:$3E99 d15:data:reset=0:$63EE mc FD__getstr__2FDC_8ucs2charAE 0:$3E9A d15:data:reset=0:$45F6 mc Dup 0:$3E9B d15:data:reset=0:$0D00 mc Int8+0 0:$3E9C d15:data:reset=0:$0D04 mc Int8+4 0:$3E9D d15:data:reset=0:$7D04 mc SubStr 0:$3E9E d15:data:reset=0:$6712 mc Cast_RangeStr 0:$3E9F d15:data:reset=0:$5A61 mc DupToR 0:$3EA0 d15:data:reset=0:$0F04 mc Istr+4 0:$3EA1 0:data:reset=0:$0073 dm 's' 0:$3EA2 0:data:reset=0:$0073 dm 's' 0:$3EA3 0:data:reset=0:$007A dm 'z' 0:$3EA4 0:data:reset=0:$003D dm '=' 0:$3EA5 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$3EA6 d15:data:reset=0:$5A61 mc DupToR 0:$3EA7 d15:data:reset=0:$41E7 mc Eq_CstrCstr 0:$3EA8 d15:data:reset=0:$5F9C mc FromR 0:$3EA9 d15:data:reset=0:$4581 mc DropStr 0:$3EAA d15:data:reset=0:$5F9C mc FromR 0:$3EAB d15:data:reset=0:$4581 mc DropStr 0:$3EAC d15:data:reset=0:$0628 mc BraIf0+40 0:$3EAD d15:data:reset=0:$0D04 mc Int8+4 0:$3EAE d15:data:reset=0:$0D00 mc Int8+0 0:$3EAF d15:data:reset=0:$8EFC mc Lset+252 0:$3EB0 d15:data:reset=0:$18FF mc Lget+255 0:$3EB1 d15:data:reset=0:$07FF mc Lvar+255 0:$3EB2 d15:data:reset=0:$5DB0 mc Peekpp 0:$3EB3 d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$3EB4 d15:data:reset=0:$0C30 mc Subq+48 0:$3EB5 d15:data:reset=0:$8EFE mc Lset+254 0:$3EB6 d15:data:reset=0:$18FE mc Lget+254 0:$3EB7 d15:data:reset=0:$0D09 mc Int8+9 0:$3EB8 d15:data:reset=0:$C6CC mc Ule 0:$3EB9 d15:data:reset=0:$0607 mc BraIf0+7 0:$3EBA d15:data:reset=0:$18FC mc Lget+252 0:$3EBB d15:data:reset=0:$0D0A mc Int8+10 0:$3EBC d15:data:reset=0:$4405 mc Mulu 0:$3EBD d15:data:reset=0:$18FD mc Lget+253 0:$3EBE d15:data:reset=0:$5AAD mc Add 0:$3EBF d15:data:reset=0:$8EFC mc Lset+252 0:$3EC0 d15:data:reset=0:$01EF mc Bra-17 0:$3EC1 d15:data:reset=0:$0D00 mc Int8+0 0:$3EC2 d15:data:reset=0:$8EFD mc Lset+253 0:$3EC3 d15:data:reset=0:$18FF mc Lget+255 0:$3EC4 d15:data:reset=0:$07FF mc Lvar+255 0:$3EC5 d15:data:reset=0:$5DB0 mc Peekpp 0:$3EC6 d15:data:reset=0:$5CF9 mc AtIndexPeek 0:$3EC7 d15:data:reset=0:$0C30 mc Subq+48 0:$3EC8 d15:data:reset=0:$8EFE mc Lset+254 0:$3EC9 d15:data:reset=0:$18FE mc Lget+254 0:$3ECA d15:data:reset=0:$0D09 mc Int8+9 0:$3ECB d15:data:reset=0:$C6CC mc Ule 0:$3ECC d15:data:reset=0:$0607 mc BraIf0+7 0:$3ECD d15:data:reset=0:$18FD mc Lget+253 0:$3ECE d15:data:reset=0:$0D0A mc Int8+10 0:$3ECF d15:data:reset=0:$4405 mc Mulu 0:$3ED0 d15:data:reset=0:$18FD mc Lget+253 0:$3ED1 d15:data:reset=0:$5AAD mc Add 0:$3ED2 d15:data:reset=0:$8EFD mc Lset+253 0:$3ED3 d15:data:reset=0:$01EF mc Bra-17 0:$3ED4 d15:data:reset=0:$5F33 mc MDrop0-1 0:$3ED5 d15:data:reset=0:$4581 mc DropStr 0:$3ED6 d15:data:reset=0:$0D06 mc Int8+6 0:$3ED7 d15:data:reset=0:$4203 mc Alloc 0:$3ED8 d15:data:reset=0:$5FA7 mc ToR 0:$3ED9 d15:data:reset=0:$18FA mc Lget+250 0:$3EDA d15:data:reset=0:$4667 mc Retain 0:$3EDB d15:data:reset=0:$5BD4 mc PeekR 0:$3EDC d15:data:reset=0:$2300 mc ItemSet+0 0:$3EDD d15:data:reset=0:$18FB mc Lget+251 0:$3EDE d15:data:reset=0:$4667 mc Retain 0:$3EDF d15:data:reset=0:$5BD4 mc PeekR 0:$3EE0 d15:data:reset=0:$2301 mc ItemSet+1 0:$3EE1 d15:data:reset=0:$18FC mc Lget+252 0:$3EE2 d15:data:reset=0:$4667 mc Retain 0:$3EE3 d15:data:reset=0:$5BD4 mc PeekR 0:$3EE4 d15:data:reset=0:$2302 mc ItemSet+2 0:$3EE5 d15:data:reset=0:$18FD mc Lget+253 0:$3EE6 d15:data:reset=0:$4667 mc Retain 0:$3EE7 d15:data:reset=0:$5BD4 mc PeekR 0:$3EE8 d15:data:reset=0:$2303 mc ItemSet+3 0:$3EE9 d15:data:reset=0:$18FE mc Lget+254 0:$3EEA d15:data:reset=0:$5BD4 mc PeekR 0:$3EEB d15:data:reset=0:$2304 mc ItemSet+4 0:$3EEC d15:data:reset=0:$18FF mc Lget+255 0:$3EED d15:data:reset=0:$5BD4 mc PeekR 0:$3EEE d15:data:reset=0:$2305 mc ItemSet+5 0:$3EEF d15:data:reset=0:$5F9C mc FromR 0:$3EF0 d15:data:reset=0:$5FA7 mc ToR 0:$3EF1 d15:data:reset=0:$5F31 mc MDrop0-3 0:$3EF2 d15:data:reset=0:$46BA mc CallKill 0:$3EF3 d15:data:reset=0:$5E1B mc implicit__shell__kill__2FD_2FD 0:$3EF4 d15:data:reset=0:$4581 mc DropStr 0:$3EF5 d15:data:reset=0:$46BA mc CallKill 0:$3EF6 d15:data:reset=0:$5E1B mc implicit__shell__kill__2FD_2FD 0:$3EF7 d15:data:reset=0:$4581 mc DropStr 0:$3EF8 d15:data:reset=0:$46BA mc CallKill 0:$3EF9 d15:data:reset=0:$5E1B mc implicit__shell__kill__2FD_2FD 0:$3EFA d15:data:reset=0:$4581 mc DropStr 0:$3EFB d15:data:reset=0:$46BA mc CallKill 0:$3EFC d15:data:reset=0:$5E1B mc implicit__shell__kill__2FD_2FD 0:$3EFD d15:data:reset=0:$4581 mc DropStr 0:$3EFE d15:data:reset=0:$5F9C mc FromR 0:$3EFF d15:data:reset=0:$5ACD mc Ret : run_shell () Millicoded // Size: 98 microcodes 0:$3F0E 0:000011:A6=A1:D3=D0 ld atmp,$+4 // * Millicoded 0:$3F0F 0:data:reset=0:$7F12 0:$3F10 0:000011:A1=A7:D0=D0 jp millicoded // * Millicoded 0:$3F11 d15:data:reset=0:$5F70 0:$3F12 d15:data:reset=0:$0F07 mc Istr+7 0:$3F13 0:data:reset=0:$005B dm '[' 0:$3F14 0:data:reset=0:$0053 dm 'S' 0:$3F15 0:data:reset=0:$0048 dm 'H' 0:$3F16 0:data:reset=0:$0045 dm 'E' 0:$3F17 0:data:reset=0:$004C dm 'L' 0:$3F18 0:data:reset=0:$004C dm 'L' 0:$3F19 0:data:reset=0:$005D dm ']' 0:$3F1A 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$3F1B d15:data:reset=0:$46D2 mc LogStr 0:$3F1C d15:data:reset=0:$9F1D mc Gget+stdout 0:$3F1D d15:data:reset=0:$0F19 mc Istr+25 0:$3F1E 0:data:reset=0:$000A dm 10 0:$3F1F 0:data:reset=0:$000D dm 13 0:$3F20 0:data:reset=0:$004B dm 'K' 0:$3F21 0:data:reset=0:$0031 dm '1' 0:$3F22 0:data:reset=0:$002D dm '-' 0:$3F23 0:data:reset=0:$0031 dm '1' 0:$3F24 0:data:reset=0:$0036 dm '6' 0:$3F25 0:data:reset=0:$002F dm '/' 0:$3F26 0:data:reset=0:$0031 dm '1' 0:$3F27 0:data:reset=0:$0036 dm '6' 0:$3F28 0:data:reset=0:$003A dm ':' 0:$3F29 0:data:reset=0:$0020 dm ' ' 0:$3F2A 0:data:reset=0:$0048 dm 'H' 0:$3F2B 0:data:reset=0:$0065 dm 'e' 0:$3F2C 0:data:reset=0:$006C dm 'l' 0:$3F2D 0:data:reset=0:$006C dm 'l' 0:$3F2E 0:data:reset=0:$006F dm 'o' 0:$3F2F 0:data:reset=0:$0020 dm ' ' 0:$3F30 0:data:reset=0:$004B dm 'K' 0:$3F31 0:data:reset=0:$0069 dm 'i' 0:$3F32 0:data:reset=0:$006F dm 'o' 0:$3F33 0:data:reset=0:$0020 dm ' ' 0:$3F34 0:data:reset=0:$0021 dm '!' 0:$3F35 0:data:reset=0:$000A dm 10 0:$3F36 0:data:reset=0:$000D dm 13 0:$3F37 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$3F38 d15:data:reset=0:$5E75 mc FD__putstr__2FDC_8ucs2charAE_ 0:$3F39 d15:data:reset=0:$9F1C mc Gget+stdin 0:$3F3A d15:data:reset=0:$4667 mc Retain 0:$3F3B d15:data:reset=0:$9F1D mc Gget+stdout 0:$3F3C d15:data:reset=0:$4667 mc Retain 0:$3F3D d15:data:reset=0:$9F1E mc Gget+stderr 0:$3F3E d15:data:reset=0:$4667 mc Retain 0:$3F3F d15:data:reset=0:$9F23 mc Gget+root 0:$3F40 d15:data:reset=0:$4667 mc Retain 0:$3F41 d15:data:reset=0:$7E78 mc new__2FD_2FD_2FD_2FD_5Shell 0:$3F42 d15:data:reset=0:$9F1D mc Gget+stdout 0:$3F43 d15:data:reset=0:$0F0E mc Istr+14 0:$3F44 0:data:reset=0:$0054 dm 'T' 0:$3F45 0:data:reset=0:$0065 dm 'e' 0:$3F46 0:data:reset=0:$0072 dm 'r' 0:$3F47 0:data:reset=0:$006D dm 'm' 0:$3F48 0:data:reset=0:$0069 dm 'i' 0:$3F49 0:data:reset=0:$006E dm 'n' 0:$3F4A 0:data:reset=0:$0061 dm 'a' 0:$3F4B 0:data:reset=0:$006C dm 'l' 0:$3F4C 0:data:reset=0:$0020 dm ' ' 0:$3F4D 0:data:reset=0:$0072 dm 'r' 0:$3F4E 0:data:reset=0:$006F dm 'o' 0:$3F4F 0:data:reset=0:$0077 dm 'w' 0:$3F50 0:data:reset=0:$0073 dm 's' 0:$3F51 0:data:reset=0:$003D dm '=' 0:$3F52 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$3F53 d15:data:reset=0:$18FE mc Lget+254 0:$3F54 d15:data:reset=0:$1D04 mc ItemGet+4 0:$3F55 d15:data:reset=0:$6453 mc NumStrU 0:$3F56 d15:data:reset=0:$6AAF mc CatStrStr 0:$3F57 d15:data:reset=0:$0F06 mc Istr+6 0:$3F58 0:data:reset=0:$0020 dm ' ' 0:$3F59 0:data:reset=0:$0063 dm 'c' 0:$3F5A 0:data:reset=0:$006F dm 'o' 0:$3F5B 0:data:reset=0:$006C dm 'l' 0:$3F5C 0:data:reset=0:$0073 dm 's' 0:$3F5D 0:data:reset=0:$003D dm '=' 0:$3F5E 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$3F5F d15:data:reset=0:$6AAF mc CatStrStr 0:$3F60 d15:data:reset=0:$18FE mc Lget+254 0:$3F61 d15:data:reset=0:$1D05 mc ItemGet+5 0:$3F62 d15:data:reset=0:$6453 mc NumStrU 0:$3F63 d15:data:reset=0:$6AAF mc CatStrStr 0:$3F64 d15:data:reset=0:$0F02 mc Istr+2 0:$3F65 0:data:reset=0:$000A dm 10 0:$3F66 0:data:reset=0:$000D dm 13 0:$3F67 0:000011:A1=A6:D0=D3 ld cmd,atmp 0:$3F68 d15:data:reset=0:$6AAF mc CatStrStr 0:$3F69 d15:data:reset=0:$5E75 mc FD__putstr__2FDC_8ucs2charAE_ 0:$3F6A d15:data:reset=0:$45F6 mc Dup 0:$3F6B d15:data:reset=0:$6DF5 mc Shell__run__5ShellC_ 0:$3F6C d15:data:reset=0:$46BA mc CallKill 0:$3F6D d15:data:reset=0:$66F9 mc implicit__shell__kill__5Shell_5Shell 0:$3F6E d15:data:reset=0:$4581 mc DropStr 0:$3F6F d15:data:reset=0:$5ACD mc Ret // --- file: "shell.asm" --- #endif // ______________________________________________________ // "Test" Microcode: #if include_tests //#include "test/test_helper.cc" #if test_i2c #include "test/Block.cc" #include "test/Device.cc" #include "test/BlockDevice.cc" #include "i2c.cc" #include "test/test_i2c.cc" #endif #if test_millicode #include "test_millicode.asm" #endif #if test_long #include "test/test_long.cc" #endif #if test_float #include "test/test_float.cc" #endif #if test_misc #include "test/test_misc.cc" #endif #endif // ====================================================== // RESET // ====================================================== // Reset entry condition: // ? $7FFF with 'cmddis=1' and 'cond=0' (for next instr) forced by INIT // ? $0000 is executed // : reset_7fff = $3FFF:1 1:$3FFF 1:data:reset=0:$0000 clr reset // 'nop' ((cmd_dis version)) : reset = $0000 0:$0000 0:data: halt=0:$0000 clr halt // don't halt cpu if no interrupt pending 0:$0001 0:data: ei=0:$0000 di // disable interrupt processing ((in "ld cmd,(ip++)" aka "next")) 0:$0002 0:data:clk/4=1:$0000 set clock4 // set full speed 0:$0003 0:data:clk/2=1:$0000 set clock2 // ((except if clock_predivider > 2)) // ====================================== // CPU Test // ====================================== 0:$0004 0:data:led_r=0:$0000 clr led_red // see "exceptions.asm" for LED codes 0:$0005 0:data:led_y=1:$0000 set led_yel 0:$0006 0:data:led_g=1:$0000 set led_grn // -/yel/grn --> booting, cpu self test 0:$0007 0:000011:A1=A0:D8=D0 ld alu,1 0:$0008 0:data:reset=0:$0001 do 0:$0009 0:000011:A1=A0:D4=D8 ld d0,alu 0:$000A 0:000011:A3=A1:D3=D4 ld a0,d0 0:$000B 0:000011:A1=A3:D5=D3 ld d1,a0 0:$000C 0:000011:A4=A1:D3=D5 ld a1,d1 0:$000D 0:000011:A1=A4:D6=D3 ld d2,a1 0:$000E 0:000011:A6=A1:D3=D6 ld atmp,d2 0:$000F 0:000011:A1=A6:D7=D3 ld dtmp,atmp 0:$0010 0:000011:A5=A1:D3=D7 ld hp,dtmp 0:$0011 0:000111:A1=A5:DD=D3 ld sl,hp,cy 0:$0012 d15:000011:A2=A1:D3=DD ld sp,sl : bit15 if 0 0:$0013 0:000011:A1=A2:DC=D3 ld sr,sp,nc else 1:$0013 0:000111:A1=A2:DC=D3 ld sr,sp,cy then 0:$0014 0:000011:A0=A1:D3=DC ld ip,sr 0:$0015 0:000011:A1=A0:DA=D3 ld swap,ip 0:$0016 0:000011:A1=A0:DA=DA ld swap,swap 0:$0017 0:000011:A1=A0:DF=DA ld d2ar,swap 0:$0018 0:000001:A1=A7:D3=D3 equ d2ar TRAP !z 0:$0019 z:data:reset=0:$0000 if !z // * TRAP 0:$001A 0:000011:A6=A1:D3=D0 ld atmp,$ // * TRAP 0:$001B 0:data:reset=0:$401A 0:$001C 0:000011:A1=A0:D0=D0 jp PANIC // * TRAP 0:$001D d15:data:reset=0:$6980 1:$001A 1:000011:A1=A7:D0=D0 then // * TRAP 1:$001B d15:data:reset=0:$401E 0:$001E 0:000000:A1=A1:D8=D8 add alu // nodelay 0:$001F z:data:reset=0:$0000 until z 0:$0020 0:000011:A1=A0:D0=D0 0:$0021 d15:data:reset=0:$4009 // ====================================== // Test and Clear Ram // ====================================== Millicode 1:$0020 1:000011:A0=A1:D3=D0 ld ip,$+4 // * Millicode 1:$0021 1:data:reset=0:$C024 1:$0022 1:000011:A1=A0:D0=D0 ld cmd,ival // * Millicode 1:$0023 d15:data:reset=0:$59D3 mc ClrLedGrn // -/yel/- --> booting, ram test 1:$0024 d15:data:reset=0:$425A mc Ramtest // --> alu = 0 // ====================================== // Init Global Data // ====================================== 1:$0025 d15:data:reset=0:$59FD mc ClrLedYel // -/-/grn --> booting, initializing 1:$0026 d15:data:reset=0:$59DC mc SetLedGrn // Initialize non-zero global data: // interrupt vectors: 1:$0027 d15:data:reset=0:$0D0F mc Int8+15, PopHP // int_vector[16] all 0x0000 note: hp points to last byte, empty heap = $ffff 1:$0028 d15:data:reset=0:$5AE1 1:$0029 d15:data:reset=0:$0DFF mc Ival $ffff // int_mask of installed devices 1:$002A d15:data:reset=0:$0EFF // memory management: 1:$002B d15:data:reset=0:$0D29 mc Ival mem_globs_end // gdata_ptr 1:$002C d15:data:reset=0:$0E00 1:$002D d15:data:reset=0:$0D00 mc Ival $100 // gcode_ptr = start of space for new dicts 1:$002E d15:data:reset=0:$0E01 1:$002F d15:data:reset=0:$0D00 mc Ival $4000 // hp_base = mem_size/4 1:$0030 d15:data:reset=0:$0E40 1:$0031 d15:data:reset=0:$0D00 mc Ival $8000 // sp_base = mem_size/2 1:$0032 d15:data:reset=0:$0E80 1:$0033 d15:data:reset=0:$45F6 mc Dup // mem_data_start := sp_base 1:$0034 d15:data:reset=0:$45F6 mc Dup // mem_data_end := sp_base 1:$0035 d15:data:reset=0:$0DFE mc Ival $FFFE // mem_ptr_start start of mem pointers = mem_end-2 1:$0036 d15:data:reset=0:$0EFF 1:$0037 d15:data:reset=0:$45F6 mc Dup // mem_free_ptr start of linked list of free mem pointers = mem_end-2 1:$0038 d15:data:reset=0:$0D00 mc Int8+0 // mem_end end of physical ram = mem_end: $0000 (TODO: eliminate?) // misc: 1:$0039 d15:data:reset=0:$0DCD mc Ival Ret // opcode Ret: return to millicode 1:$003A d15:data:reset=0:$0E5A #if include_filesystem mc Istr ".trash" // cstr ".trash" = trash file name #endif #if include_sio_driver_in_rom mc Ival SIO_GETCTL_PROC mc Ival SIO_SETCTL_PROC mc Ival SIO_GETC_PROC mc Ival SIO_GETS_PROC mc Ival SIO_PUTC_PROC mc Ival SIO_PUTS_PROC mc Ival SIO_IRPT_PROC #endif // Initialize registers: // must be done before calling millicoded words 1:$003B d15:data:reset=0:$9F13 mc Gget+hp_base,PopHP // reset hp note: also writes TOP value to ram 1:$003C d15:data:reset=0:$5AE1 1:$003D d15:data:reset=0:$9F14 mc Gget+sp_base,PopSP // reset sp 1:$003E d15:data:reset=0:$5A41 #if include_floating_point mc init_float // init globals in float.cc #endif 1:$003F d15:data:reset=0:$59D3 mc ClrLedGrn // -/-/- "RUNNING" 1:$0040 d15:data:reset=0:$6987 mc STOP2 // ======================================================= // Test Code // ======================================================= #if include_tests #if test_millicode mc TestMillicode #endif #if test_misc mc TestMisc #endif #if test_i2c mc TestI2C #endif #if test_long mc TestLong #endif #if test_float mc TestFloat #endif mc Istr "---OK!---", LogStr mc SetLedYel mc SetLedGrn mc STOP2 #endif // ======================================================= // Load and Init Device Drivers, Start Shell // ======================================================= #if !include_tests 1:$0041 d15:data:reset=0:$7F70 mc init_devices // init k1-bus devices in dev.cc 1:$0042 d15:data:reset=0:$59D3 mc ClrLedGrn // -/-/- --> running: all Leds off 1:$0043 d15:data:reset=0:$6987 mc STOP2 1:$0044 d15:data:reset=0:$7F0E mc run_shell 1:$0045 d15:data:reset=0:$0000 mc reset #endif // --- file: "main.asm" ---