'****************************************************************************** ' c:\programs\compiler\catalina\target\xmm_default.spin '****************************************************************************** '=============================== Object Header ================================ 0010: a0 00 02 0c ' 160 bytes, 2-1 methods, 12 object pointers 0014: 38 00 00 00 ' METHOD 0018: c8 23 00 00 ' OBJECT Catalina_Common.spin 001c: a0 00 00 00 ' OBJECT Cache.spin 0020: c0 05 00 00 ' OBJECT Command_Line.spin 0024: d8 09 00 00 ' OBJECT Floating_Point.spin 0028: d0 11 00 00 ' OBJECT SD_Card.spin 002c: d0 11 00 00 ' OBJECT Clock.spin 0030: e0 11 00 00 ' OBJECT HMI.spin 0034: c8 17 18 00 ' OBJECT Graphics.spin 0038: d8 17 18 00 ' OBJECT Proxy_IO.spin 003c: fc 17 18 00 ' OBJECT Extras.spin 0040: 10 18 18 00 ' OBJECT Catalina_XMM.spin 0044: 90 1f 18 00 ' OBJECT Catalina_HUB_XMM_Loader.spin '================================ DAT Section ================================= '****************************************************************************** ' Catalina_Common.spin '****************************************************************************** '=============================== Object Header ================================ '================================ DAT Section ================================= '****************************************************************************** ' Cache.spin '****************************************************************************** '=============================== Object Header ================================ 00b0: 14 00 02 01 ' 20 bytes, 2-1 methods, 1 object pointers 00b4: 0c 00 00 00 ' METHOD 00b8: 14 00 00 00 ' OBJECT Catalina_SPI_Cache.spin '================================ DAT Section ================================= '****************************************************************************** ' Catalina_SPI_Cache.spin '****************************************************************************** '=============================== Object Header ================================ 00c4: 0c 05 03 01 ' 1292 bytes, 3-1 methods, 1 object pointers 00c8: b4 04 10 00 ' METHOD 00c8: b4 04 10 00 ' METHOD 00cc: e8 04 00 00 ' OBJECT Catalina_Common.spin '================================ DAT Section ================================= 00d4(0000): ' org $0 00d4(0000): f0 71 bd a0 ' init_vm mov t1, par ' get the address of the initialization structure 00d8(0001): b8 5e bd 08 ' rdlong pvmcmd, t1 ' pvmcmd is a pointer to the virtual address and read/write bit 00dc(0002): af 60 bd a0 ' mov pvmaddr, pvmcmd ' pvmaddr is a pointer into the cache line on return 00e0(0003): 04 60 fd 80 ' add pvmaddr, #4 00e4(0004): 04 70 fd 80 ' add t1, #4 00e8(0005): b8 62 bd 08 ' rdlong cacheptr, t1 ' cacheptr is the base address in hub ram of the cache 00ec(0006): 04 70 fd 80 ' add t1, #4 00f0(0007): b8 72 bd 0a ' rdlong t2, t1 wz 00f4(0008): b9 78 95 a0 ' if_nz mov index_width, t2 ' override the index_width default value 00f8(0009): 04 70 fd 80 ' add t1, #4 00fc(000a): b8 72 bd 0a ' rdlong t2, t1 wz 0100(000b): b9 7e 95 a0 ' if_nz mov offset_width, t2 ' override the offset_width default value 0104(000c): 01 7c fd a0 ' mov index_count, #1 0108(000d): bc 7c bd 2c ' shl index_count, index_width 010c(000e): be 7a bd a0 ' mov index_mask, index_count 0110(000f): 01 7a fd 84 ' sub index_mask, #1 0114(0010): 01 80 fd a0 ' mov line_size, #1 0118(0011): bf 80 bd 2c ' shl line_size, offset_width 011c(0012): c0 70 bd a0 ' mov t1, line_size 0120(0013): 01 70 fd 84 ' sub t1, #1 0124(0014): f0 71 3d 08 ' wrlong t1, par 0128(0015): 80 00 7c 5c ' jmp #vmflush 012c(0016): 00 00 00 00 ' fillme long 0[CACHE_INDEX-fillme] ' first cog locations are used for a direct mapped page table 02d4(0080): ' fit CACHE_INDEX 02d4(0080): 00 04 fd 54 ' vmflush movd :flush, #0 02d8(0081): be 70 bd a0 ' mov t1, index_count 02dc(0082): c1 00 bc a0 ' :flush mov 0-0, empty_mask 02e0(0083): b7 04 bd 80 ' add :flush, dstinc 02e4(0084): 82 70 fd e4 ' djnz t1, #:flush 02e8(0085): af 6c 3d 08 ' waitcmd wrlong zero, pvmcmd 02ec(0086): af 64 bd 0a ' :wait rdlong vmpage, pvmcmd wz 02f0(0087): 86 00 68 5c ' if_z jmp #:wait 02f4(0088): 00 64 7d c1 ' cmps vmpage,#0 wc ' if it is just a ping (cmd < 0) ... 02f8(0089): 9b 00 70 5c ' if_c jmp #ping ' ... then respond 02fc(008a): bf 64 bd 29 ' shr vmpage, offset_width wc ' carry is now one for read and zero for write 0300(008b): 00 6a fd a0 ' mov set_dirty_bit, #0 ' make mask to set dirty bit on writes 0304(008c): c2 6a bd 74 ' muxnc set_dirty_bit, dirty_mask 0308(008d): b2 68 bd a0 ' mov line, vmpage ' get the cache line index 030c(008e): bd 68 bd 60 ' and line, index_mask 0310(008f): b4 90 bd a0 ' mov hubaddr, line 0314(0090): bf 90 bd 2c ' shl hubaddr, offset_width 0318(0091): b1 90 bd 80 ' add hubaddr, cacheptr ' get the address of the cache line 031c(0092): b0 90 3d 08 ' wrlong hubaddr, pvmaddr ' return the address of the cache line 0320(0093): b4 2a bd 50 ' movs :ld, line 0324(0094): b4 32 bd 54 ' movd :st, line 0328(0095): 00 66 bd a0 ' :ld mov vmcurrent, 0-0 ' get the cache line tag 032c(0096): ba 66 bd 60 ' and vmcurrent, tag_mask 0330(0097): b2 66 3d 86 ' cmp vmcurrent, vmpage wz ' z set means there was a cache hit 0334(0098): 9d 5c d5 5c ' if_nz call #miss ' handle a cache miss 0338(0099): b5 00 bc 68 ' :st or 0-0, set_dirty_bit ' set the dirty bit on writes 033c(009a): 85 00 7c 5c ' jmp #waitcmd ' wait for a new command 0340(009b): ' ping 0340(009b): b0 86 3d 08 ' wrlong ping_response, pvmaddr 0344(009c): 85 00 7c 5c ' jmp #waitcmd 0348(009d): ' miss 0348(009d): cd a2 fd 5c ' call #XMM_Activate 034c(009e): b4 40 bd 54 ' movd :test, line 0350(009f): b4 58 bd 54 ' movd :st, line 0354(00a0): c2 00 3c 62 ' :test test 0-0, dirty_mask wz 0358(00a1): a7 00 68 5c ' if_z jmp #:rd ' current page is clean, just read new page 035c(00a2): c8 4e be a0 ' mov Hub_Addr, hubaddr 0360(00a3): c0 50 be a0 ' mov XMM_Len, line_size 0364(00a4): b3 4c be a0 ' mov XMM_Addr, vmcurrent 0368(00a5): bf 4c be 2c ' shl XMM_Addr, offset_width 036c(00a6): c6 8e fd 5c ' call #BWRITE ' write current page 0370(00a7): c8 4e be a0 ' :rd mov Hub_Addr, hubaddr 0374(00a8): c0 50 be a0 ' mov XMM_Len, line_size 0378(00a9): b2 4c be a0 ' mov XMM_Addr, vmpage 037c(00aa): bf 4c be 2c ' shl XMM_Addr, offset_width 0380(00ab): c4 8a fd 5c ' call #BREAD ' read new page 0384(00ac): b2 00 bc a0 ' :st mov 0-0, vmpage 0388(00ad): d2 a4 fd 5c ' call #XMM_Tristate 038c(00ae): 00 00 7c 5c ' miss_ret ret 0390(00af): 00 00 00 00 ' pvmcmd long 0 ' on call this is the virtual address and read/write bit 0394(00b0): 00 00 00 00 ' pvmaddr long 0 ' on return this is the address of the cache line containing the virtual address 0398(00b1): 00 00 00 00 ' cacheptr long 0 ' address in hub ram where cache lines are stored 039c(00b2): 00 00 00 00 ' vmpage long 0 ' page containing the virtual address 03a0(00b3): 00 00 00 00 ' vmcurrent long 0 ' current page in selected cache line (same as vmpage on a cache hit) 03a4(00b4): 00 00 00 00 ' line long 0 ' current cache line index 03a8(00b5): 00 00 00 00 ' set_dirty_bit long 0 ' DIRTY_BIT set on writes, clear on reads 03ac(00b6): 00 00 00 00 ' zero long 0 ' zero constant 03b0(00b7): 00 02 00 00 ' dstinc long 1<<9 ' increment for the destination field of an instruction 03b4(00b8): 00 00 00 00 ' t1 long 0 ' temporary variable 03b8(00b9): 00 00 00 00 ' t2 long 0 ' temporary variable 03bc(00ba): ff ff ff 7f ' tag_mask long !(1< SRAM 0438(00d9): 01 4e fe 80 ' add Hub_Addr,#01 'Increment HubRam Address 043c(00da): 01 4c fe 80 ' add XMM_Addr,#01 'Increment XMM_Addr 0440(00db): d6 50 fe e4 ' djnz XMM_Len,#:WritePageLoop 'Loop Until Done 0444(00dc): 1b e9 bf 68 ' or outa,RamChipSel 'Set RamChipSel Hi(SRAM Inactive) 0448(00dd): 00 00 7c 5c ' XMM_WritePage_ret ret 044c(00de): 1b e9 bf 64 ' XMM_ReadPage andn outa,RamChipSel 'Set RamChipSel Lo(SRAM Active) 0450(00df): 03 44 fe a0 ' mov SramData,#RDR 'Prep SRAM Read Command 0454(00e0): f6 0e fe 5c ' call #SendSramCmd 'Send Read Command To SRAM 0458(00e1): 1c e9 bf 68 ' or outa,RamClk 'Set RamClk Hi (First Dummy Clock) 045c(00e2): 1c e9 bf 64 ' andn outa,RamClk 'Set RamClk Lo 0460(00e3): 1d ed bf 64 ' andn dira,SramBusPort 'Set SramBusPort For Input 0464(00e4): 1c e9 bf 68 ' or outa,RamClk 'Set RamClk Hi (Second Dummy Clock) 0468(00e5): 1c e9 bf 64 ' andn outa,RamClk 'Set RamClk Lo 046c(00e6): 22 45 be 6c ' :ReadPageLoop xor SramData,SramData 'Clear SramData 0470(00e7): 02 4a fe a0 ' mov SramNibs,#02 'Configure For Nibble Transfer 0474(00e8): f2 47 be a0 ' :NextNibble mov SramTemp,ina 'Get Data From SRAM (INA -> SramTemp) 0478(00e9): 1c e9 bf 68 ' or outa,RamClk 'Set RamClk Hi (Ack Receipt Of Data) 047c(00ea): 1c e9 bf 64 ' andn outa,RamClk 'Set RamClk Lo 0480(00eb): 00 46 fe 28 ' shr SramTemp,#PinJustify 'Slide SramTemp -> Nibble0 0484(00ec): 0f 46 fe 60 ' and SramTemp,#$0F 'Keep Nibble0 Only 0488(00ed): 04 44 fe 2c ' shl SramData,#04 'Shift N0 -> N1...->...N6 -> N7 048c(00ee): 23 45 be 68 ' or SramData,SramTemp 'SramData=SramData | SramTemp 0490(00ef): e8 4a fe e4 ' djnz SramNibs,#:NextNibble 'Loop Until Byte Received 0494(00f0): 27 45 3e 00 ' wrbyte SramData,Hub_Addr 'Send SramData -> HubRam 0498(00f1): 01 4e fe 80 ' add Hub_Addr,#01 'Increment Hub_Addr 049c(00f2): 01 4c fe 80 ' add XMM_Addr,#01 'Increment XMM_Addr 04a0(00f3): e6 50 fe e4 ' djnz XMM_Len,#:ReadPageLoop 'Loop Until Done 04a4(00f4): 1b e9 bf 68 ' or outa,RamChipSel 'Set RamChipSel Hi (SRAM Inactive) 04a8(00f5): 00 00 7c 5c ' XMM_ReadPage_ret ret 04ac(00f6): 18 44 fe 2c ' SendSramCmd shl SramData,#24 'Move Read/Write Command To Upper Byte 04b0(00f7): 26 45 be 68 ' or SramData,XMM_Addr 'Combine Read/Write Command & Address 04b4(00f8): 08 4a fe a0 ' mov SramNibs,#08 'Configure To Send 8 Nibbles 04b8(00f9): 25 49 be a0 ' SendSramData mov SramSlide,SramNibs 'SramSlide Points To The Lowest Bit... 04bc(00fa): 01 48 fe 84 ' sub SramSlide,#01 '...Of The Highest Nibble To Send 04c0(00fb): 02 48 fe 2c ' shl SramSlide,#02 'SramSlide = 4 * (SramNibs - 1) 04c4(00fc): 1d ed bf 68 ' or dira,SramBusPort 'Set SramBusPort For Output 04c8(00fd): 1d e9 bf 64 ' :SendLoop andn outa,SramBusPort 'Clear Quad Bus 04cc(00fe): 22 47 be a0 ' mov SramTemp,SramData 'Move SramData -> SramTemp 04d0(00ff): 24 47 be 28 ' shr SramTemp,SramSlide 'Slide SramTemp NibbleX -> Nibble0 04d4(0100): 0f 46 fe 60 ' and SramTemp,#$0F 'Leave Nibble0 Only 04d8(0101): 00 46 fe 2c ' shl SramTemp,#PinJustify 'Position To Output Bus 04dc(0102): 23 e9 bf 68 ' or outa,SramTemp 'Output The Data 04e0(0103): 1c e9 bf 68 ' or outa,RamClk 'Set RamClk Hi (Latch Data) 04e4(0104): 1c e9 bf 64 ' andn outa,RamClk 'Set RamClk Lo 04e8(0105): 04 48 fe 84 ' sub SramSlide,#04 'Move Pointer To Next Lower Nibble 04ec(0106): fd 4a fe e4 ' djnz SramNibs,#:SendLoop 'Loop Until Done 04f0(0107): ' SendSramData_ret 04f0(0107): 00 00 7c 5c ' SendSramCmd_ret ret 04f4(0108): 80 48 fe a0 ' MakeQuadMode mov SramSlide,#$80 'SramSlide=0b10000000 04f8(0109): 1f e9 bf 60 ' :QuadLoop and outa,SPILo 'SPI_SI = 0 04fc(010a): 1b e9 bf 64 ' andn outa,RamChipSel 'Set RamChipSel Lo (SRAM Active) 0500(010b): 38 44 fe a0 ' mov SramData,#WSQI 'SramData = 0x38 (QuadCmd) 0504(010c): 24 45 be 60 ' and SramData,SramSlide 'Mask Out SramData Bits 0508(010d): 0f 45 7e ec ' tjz SramData,#:QuadSkip 'if(SramData == 0) SPI_SI=0 050c(010e): 1e e9 bf 68 ' or outa,SPIHi 'else SPI_SI = 1 0510(010f): 1c e9 bf 68 ' :QuadSkip or outa,RamClk 'Set RamClk Hi (Latch The Data) 0514(0110): 1c e9 bf 64 ' andn outa,RamClk 'Set RamClk Lo 0518(0111): 01 48 fe 28 ' shr SramSlide,#01 'SramSlide=SramSlide >> 1 051c(0112): 09 49 7e e8 ' tjnz SramSlide,#:QuadLoop 'Loop Until Done 0520(0113): 1b e9 bf 68 ' or outa,RamChipSel 'Set RamChipSel Hi(SRAM Inactive) 0524(0114): 00 00 7c 5c ' MakeQuadMode_ret ret 0528(0115): 1b e9 bf 64 ' MakeSeqMode andn outa,RamChipSel 'Set RamChipSel Lo(SRAM Active) 052c(0116): 21 45 be a0 ' mov SramData,SeqModeAccess 'Set For Seq Access 0530(0117): 04 4a fe a0 ' mov SramNibs,#04 'Send 4 Nibbles,2 Bytes 0534(0118): f9 0e fe 5c ' call #SendSramData 'Send The command 0538(0119): 1b e9 bf 68 ' or outa,RamChipSel 'Set RamChipSel Hi(SRAM Inactive) 053c(011a): 00 00 7c 5c ' MakeSeqMode_ret ret 0540(011b): 20 00 00 00 ' RamChipSel long Ram_Chip_Sel 0544(011c): 40 00 00 00 ' RamClk long Ram_Clk 0548(011d): 0f 00 00 00 ' SramBusPort long Sram_Bus_Port 054c(011e): 09 00 00 00 ' SPIHi long SPI_Hi 0550(011f): be ff ff ff ' SPILo long SPI_Lo 0554(0120): 69 00 00 00 ' CtrlSigsEnab long Ctrl_Sigs_Enab 0558(0121): 40 01 00 00 ' SeqModeAccess long WSEQ 055c(0122): 00 00 00 00 ' SramData long 0 0560(0123): 00 00 00 00 ' SramTemp long 0 0564(0124): 00 00 00 00 ' SramSlide long 0 0568(0125): 00 00 00 00 ' SramNibs long 0 056c(0126): 00 00 00 00 ' XMM_Addr long 0 0570(0127): 00 00 00 00 ' Hub_Addr long 0 0574(0128): 00 00 00 00 ' XMM_Len long 0 0578(0129): ' FIT 496 ' out of 496 '****************************************************************************** ' Catalina_Common.spin '****************************************************************************** '=============================== Object Header ================================ '================================ DAT Section ================================= '****************************************************************************** ' Command_Line.spin '****************************************************************************** '=============================== Object Header ================================ 05d0: 44 00 02 02 ' 68 bytes, 2-1 methods, 2 object pointers 05d4: 10 00 08 00 ' METHOD 05d8: 08 1e 00 00 ' OBJECT Catalina_Common.spin 05dc: 44 00 00 00 ' OBJECT Catalina_CogStore.spin '================================ DAT Section ================================= '****************************************************************************** ' Catalina_Common.spin '****************************************************************************** '=============================== Object Header ================================ '================================ DAT Section ================================= '****************************************************************************** ' Catalina_CogStore.spin '****************************************************************************** '=============================== Object Header ================================ 0614: d4 03 08 01 ' 980 bytes, 8-1 methods, 1 object pointers 0618: a4 02 00 00 ' METHOD 0618: a4 02 00 00 ' METHOD 0618: a4 02 00 00 ' METHOD 0618: a4 02 00 00 ' METHOD 0618: a4 02 00 00 ' METHOD 0618: a4 02 00 00 ' METHOD 0618: a4 02 00 00 ' METHOD 061c: ab 02 00 00 ' OBJECT Catalina_Common.spin '================================ DAT Section ================================= 0638(0000): ' org 0 0638(0000): ' entry 0638(0000): ' done 0638(0000): 00 20 fd a0 ' mov t0,#0 063c(0001): 95 20 3d 08 ' wrlong t0,command 0640(0002): ' loop 0640(0002): 95 20 bd 0a ' rdlong t0,command wz ' loop ... 0644(0003): 02 00 68 5c ' if_z jmp #loop ' ... till ... 0648(0004): 97 20 3d 86 ' cmp t0,response wz ' ... we get ... 064c(0005): 02 00 68 5c ' if_z jmp #loop ' ... a command 0650(0006): 90 22 bd a0 ' mov t1,t0 ' extract ... 0654(0007): 94 22 bd 60 ' and t1,low24 ' ... address argument 0658(0008): 1c 20 fd 28 ' shr t0,#28 ' extract command 065c(0009): 01 20 7d 86 ' cmp t0,#CMD_READ>>28 wz ' do ... 0660(000a): 15 00 68 5c ' if_z jmp #do_read ' ... read 0664(000b): 02 20 7d 86 ' cmp t0,#CMD_WRITE>>28 wz ' do ... 0668(000c): 1d 00 68 5c ' if_z jmp #do_write ' ... write 066c(000d): 03 20 7d 86 ' cmp t0,#CMD_SIZE>>28 wz ' do ... 0670(000e): 2c 00 68 5c ' if_z jmp #do_size ' ... size 0674(000f): 04 20 7d 86 ' cmp t0,#CMD_SETUP>>28 wz ' do ... 0678(0010): 32 00 68 5c ' if_z jmp #do_setup ' ... setup 067c(0011): 05 20 7d 86 ' cmp t0,#CMD_STOP>>28 wz ' do ... 0680(0012): 7e 00 68 5c ' if_z jmp #do_stop ' ... stop 0684(0013): ' identify 0684(0013): 95 2e 3d 08 ' wrlong response,command ' otherwise return unlikely response ... 0688(0014): 02 00 7c 5c ' jmp #loop ' ... and loop till we get a known command 068c(0015): ' do_read 068c(0015): 9f 30 fc 54 ' movd rd_inst,#storage ' read a copy ... 0690(0016): 9c 20 bd a2 ' mov t0,len wz ' ... of ... 0694(0017): ' rd_loop ' ... the ... 0694(0017): 00 00 68 5c ' if_z jmp #done ' ... string ... 0698(0018): 91 00 3c 08 ' rd_inst wrlong 0-0,t1 ' ... to ... 069c(0019): 9b 30 bc 80 ' add rd_inst,d_inc ' ... the ... 06a0(001a): 04 22 fd 80 ' add t1,#4 ' ... address ... 06a4(001b): 01 20 fd 86 ' sub t0,#1 wz ' ... provided ... 06a8(001c): 17 00 7c 5c ' jmp #rd_loop ' ... (assume there is enough space!) 06ac(001d): ' do_write 06ac(001d): 9f 40 fc 54 ' movd wr_inst,#storage ' write ... 06b0(001e): 00 38 fd a0 ' mov len,#0 ' ... a ... 06b4(001f): ' wr_loop ' ... copy ... 06b4(001f): 91 24 bd 08 ' rdlong t2,t1 ' ... of ... 06b8(0020): 92 00 bc a0 ' wr_inst mov 0-0,t2 ' ... the ... 06bc(0021): 9b 40 bc 80 ' add wr_inst,d_inc ' ... string ... 06c0(0022): 04 22 fd 80 ' add t1,#4 ' ... to ... 06c4(0023): 01 38 fd 80 ' add len,#1 ' ... cog ... 06c8(0024): 2c 39 7d 86 ' cmp len,#MAX_LONGS wz ' ... RAM ... 06cc(0025): 00 00 68 5c ' if_z jmp #done ' ... stopping ... 06d0(0026): 04 20 fd a0 ' mov t0,#4 ' ... when ... 06d4(0027): ff 24 7d 62 ' wr_test test t2,#$FF wz ' ... cog ... 06d8(0028): 00 00 68 5c ' if_z jmp #done ' ... full ... 06dc(0029): 08 24 fd 28 ' shr t2,#8 ' ... or ... 06e0(002a): 27 20 fd e4 ' djnz t0,#wr_test ' ... termination ... 06e4(002b): 1f 00 7c 5c ' jmp #wr_loop ' ... detected 06e8(002c): ' do_size 06e8(002c): 94 22 3d 86 ' cmp t1,low24 wz ' return ... 06ec(002d): 02 00 54 5c ' if_nz jmp #loop ' ... the ... 06f0(002e): 9c 20 bd a0 ' mov t0,len ' ... size (in LONGs) ... 06f4(002f): 96 20 bd 68 ' or t0,size_cmd ' ... of ... 06f8(0030): 95 20 3d 08 ' wrlong t0,command ' ... the stored ... 06fc(0031): 02 00 7c 5c ' jmp #loop ' ... command line 0700(0032): ' do_setup 0700(0032): 79 38 7d ec ' tjz len,#no_args ' if no stored string, set argc/argv to default values 0704(0033): 91 24 bd a0 ' mov t2,t1 ' save the address argument 0708(0034): 9f 6e fc 54 ' movd su_inst,#storage ' otherwise ... 070c(0035): 9c 20 bd a2 ' mov t0,len wz ' ... read ... 0710(0036): ' su_loop ' ... the ... 0710(0036): 3c 00 68 5c ' if_z jmp #su_count_args ' ... stored ... 0714(0037): 91 00 3c 08 ' su_inst wrlong 0-0,t1 ' ... string ... 0718(0038): 9b 6e bc 80 ' add su_inst,d_inc ' ... to ... 071c(0039): 04 22 fd 80 ' add t1,#4 ' ... the ... 0720(003a): 01 20 fd 86 ' sub t0,#1 wz ' ... address ... 0724(003b): 36 00 7c 5c ' jmp #su_loop ' ... provided (assume there is enough space!) 0728(003c): ' su_count_args 0728(003c): 92 22 bd a0 ' mov t1,t2 ' count the number of arguments in the string 072c(003d): 00 3a fd a0 ' mov n,#0 ' no arguments yet 0730(003e): 00 3c fd a0 ' mov q,#0 ' not in a quoted string 0734(003f): ' su_count_loop 0734(003f): 80 08 fd 5c ' call #skip_to_non_space ' find next non-space 0738(0040): 00 20 7d 86 ' cmp t0,#0 wz ' end of string? 073c(0041): 45 00 68 5c ' if_z jmp #su_save_argc ' yes - set up argc 0740(0042): 01 3a fd 80 ' add n,#1 ' no - found an argument 0744(0043): 85 1e fd 5c ' call #skip_to_space ' skip to next space (i.e. end of argument) 0748(0044): 3f 00 7c 5c ' jmp #su_count_loop 074c(0045): ' su_save_argc 074c(0045): 18 3a 7d 87 ' cmp n,#ARGV_MAX wz,wc ' set up argc and first element of argv 0750(0046): 18 3a c5 a0 ' if_a mov n,#ARGV_MAX ' 0754(0047): 98 3a 3d 04 ' wrword n,argc ' word[common#ARGC_ADDR] := n 0758(0048): 99 34 3d 04 ' wrword argv_start,argv ' word[common#ARGV_ADDR] := argv_0 075c(0049): 92 22 bd a0 ' mov t1,t2 0760(004a): 80 08 fd 5c ' call #skip_to_non_space ' find start of first argument ... 0764(004b): 9a 26 bd a0 ' mov t3,argv_start ' ... and save it ... 0768(004c): 93 22 3d 08 ' wrlong t1,t3 ' ... in long[common#ARGV_0] 076c(004d): 00 3c fd a0 ' mov q,#0 ' not currently within quoted string 0770(004e): ' su_argv_loop 0770(004e): 91 20 bd 02 ' rdbyte t0,t1 wz ' deconstruct command line, creating the argv array as we go 0774(004f): 75 00 68 5c ' if_z jmp #su_argv_done ' end of string found - terminate the argv array 0778(0050): 22 20 7d 86 ' cmp t0,#QUOTE_CHAR wz ' found a quote? 077c(0051): 64 00 54 5c ' if_nz jmp #su_argv_notquote ' no - just copy character (or terminate argument of it is a space) 0780(0052): 01 3c fd 6e ' xor q,#1 wz ' yes - toggle marker indicating we are within quoted string 0784(0053): 73 00 54 5c ' if_nz jmp #su_argv_nextchar ' if this is the start of a quoted string, just keep processing 0788(0054): 91 20 bd a0 ' mov t0,t1 ' otherwise, is the end ... 078c(0055): 01 20 fd 80 ' add t0,#1 ' ... of the quoted string ... 0790(0056): 90 20 bd 02 ' rdbyte t0,t0 wz ' ... also ... 0794(0057): 5a 00 68 5c ' if_z jmp #su_argv_chkquote ' ... the end ... 0798(0058): 20 20 7d 86 ' cmp t0,#" " wz ' ... of the argument? 079c(0059): 73 00 54 5c ' if_nz jmp #su_argv_nextchar ' no - just keep processing 07a0(005a): ' su_argv_chkquote 07a0(005a): 93 20 bd 08 ' rdlong t0,t3 ' yes - is there a quote ... 07a4(005b): 90 20 bd 00 ' rdbyte t0,t0 ' ... at the start ... 07a8(005c): 22 20 7d 86 ' cmp t0,#QUOTE_CHAR wz ' ... of the argument? 07ac(005d): 60 00 68 5c ' if_z jmp #su_argv_delquote ' yes - delete the start and end quotes 07b0(005e): 01 22 fd 80 ' add t1,#1 ' no - do not delete the start or end quotes ... 07b4(005f): 67 00 7c 5c ' jmp #su_argv_nextarg ' ... just save the argument 07b8(0060): ' su_argv_delquote 07b8(0060): 93 20 bd 08 ' rdlong t0,t3 ' remove quote ... 07bc(0061): 01 20 fd 80 ' add t0,#1 ' ... from start ... 07c0(0062): 93 20 3d 08 ' wrlong t0,t3 ' ... of string 07c4(0063): 67 00 7c 5c ' jmp #su_argv_nextarg ' save next argument 07c8(0064): ' su_argv_notquote 07c8(0064): 20 20 7d 86 ' cmp t0,#" " wz ' found a space? 07cc(0065): 73 00 54 5c ' if_nz jmp #su_argv_nextchar ' no - just keep processing 07d0(0066): 73 3c 7d e8 ' tjnz q,#su_argv_nextchar ' yes - are we within a quote? If yes, just keep processing 07d4(0067): ' su_argv_nextarg 07d4(0067): 01 3a fd 80 ' add n,#1 ' no - found the end of an argument 07d8(0068): 18 3a 7d 87 ' cmp n,#ARGV_MAX wz,wc ' too many arguments? 07dc(0069): 75 00 4c 5c ' if_ae jmp #su_argv_done ' yes - just terminate argv array 07e0(006a): 00 20 fd a0 ' mov t0,#0 ' no - zero terminate ... 07e4(006b): 91 20 3d 00 ' wrbyte t0,t1 ' ... the current argument 07e8(006c): 01 22 fd 80 ' add t1,#1 ' find the start ... 07ec(006d): 80 08 fd 5c ' call #skip_to_non_space ' ... of the next argument 07f0(006e): 91 20 bd 02 ' rdbyte t0,t1 wz ' end of string? 07f4(006f): 75 00 68 5c ' if_z jmp #su_argv_done ' yes - terminate qrgv array 07f8(0070): 04 26 fd 80 ' add t3,#4 ' no - save new pointer ... 07fc(0071): 93 22 3d 08 ' wrlong t1,t3 ' ... in the argv array 0800(0072): 4e 00 7c 5c ' jmp #su_argv_loop ' ... and keep processing 0804(0073): ' su_argv_nextchar 0804(0073): 01 22 fd 80 ' add t1,#1 ' process ... 0808(0074): 4e 00 7c 5c ' jmp #su_argv_loop ' ... the next character 080c(0075): ' su_argv_done 080c(0075): 04 26 fd 80 ' add t3,#4 ' ' terminate argv array with a null entry 0810(0076): 00 20 fd a0 ' mov t0,#0 ' long[b] := 0 0814(0077): 93 20 3d 08 ' wrlong t0,t3 ' 0818(0078): 00 00 7c 5c ' jmp #done ' 081c(0079): ' no_args ' 081c(0079): 00 20 fd a0 ' mov t0,#0 ' if no stored string ... 0820(007a): 98 20 3d 04 ' wrword t0,argc ' ... set argc ... 0824(007b): 9a 20 3d 08 ' wrlong t0,argv_start ' ... and argv_0 to zero 0828(007c): 99 34 3d 04 ' wrword argv_start,argv ' set argv to argv_0 082c(007d): 00 00 7c 5c ' jmp #done 0830(007e): ' do_stop 0830(007e): 01 20 fd 0c ' cogid t0 0834(007f): 03 20 7d 0c ' cogstop t0 0838(0080): ' skip_to_non_space 0838(0080): 91 20 bd 00 ' rdbyte t0,t1 083c(0081): 20 20 7d 86 ' cmp t0,#" " wz 0840(0082): 01 22 e9 80 ' if_z add t1,#1 0844(0083): 80 00 68 5c ' if_z jmp #skip_to_non_space 0848(0084): ' skip_to_non_space_ret 0848(0084): 00 00 7c 5c ' ret 084c(0085): ' skip_to_space 084c(0085): 91 20 bd 02 ' rdbyte t0,t1 wz 0850(0086): 8f 00 68 5c ' if_z jmp #skip_to_space_ret 0854(0087): 22 20 7d 86 ' cmp t0,#QUOTE_CHAR wz 0858(0088): 01 3c e9 6c ' if_z xor q,#1 085c(0089): 8d 00 68 5c ' if_z jmp #:skip_char 0860(008a): 20 20 7d 86 ' cmp t0,#" " wz 0864(008b): 8d 00 54 5c ' if_nz jmp #:skip_char 0868(008c): 8f 3c 7d ec ' tjz q,#skip_to_space_ret 086c(008d): ' :skip_char 086c(008d): 01 22 fd 80 ' add t1,#1 0870(008e): 85 00 7c 5c ' jmp #skip_to_space 0874(008f): ' skip_to_space_ret 0874(008f): 00 00 7c 5c ' ret 0878(0090): 00 00 00 00 ' t0 long 0 087c(0091): 00 00 00 00 ' t1 long 0 0880(0092): 00 00 00 00 ' t2 long 0 0884(0093): 00 00 00 00 ' t3 long 0 0888(0094): ff ff ff 00 ' low24 long $FFFFFF 088c(0095): f8 7f 00 00 ' command long COGSTORE 0890(0096): 00 00 00 30 ' size_cmd long CMD_SIZE 0894(0097): ce fa ed fe ' response long CMD_RESPONSE 0898(0098): 6c 7e 00 00 ' argc long ARGC_ADDR 089c(0099): 6e 7e 00 00 ' argv long ARGV_ADDR 08a0(009a): 70 7e 00 00 ' argv_start long ARGV_0 08a4(009b): 00 02 00 00 ' d_inc long 1<<9 08a8(009c): 00 00 00 00 ' len long 0 ' storage used (longs) 08ac(009d): 00 00 00 00 ' n long 0 08b0(009e): 00 00 00 00 ' q long 0 08b4(009f): ' fit 196 ' make sure at least 300 longs are available 08b4(009f): 00 00 00 00 ' storage long 0 ' long storage starts here '****************************************************************************** ' Catalina_Common.spin '****************************************************************************** '=============================== Object Header ================================ '================================ DAT Section ================================= '****************************************************************************** ' Floating_Point.spin '****************************************************************************** '=============================== Object Header ================================ 09e8: 68 00 03 02 ' 104 bytes, 3-1 methods, 2 object pointers 09ec: 3a 00 00 00 ' METHOD 09ec: 3a 00 00 00 ' METHOD 09f0: 3b 00 0c 00 ' OBJECT Catalina_Common.spin 09f4: f0 19 00 00 ' OBJECT Catalina_Float32_A_Plugin.spin '================================ DAT Section ================================= 09fc(0000): ' Float_A_Service_Table 09fc(0000): 01 ' byte Common#SVC_FLOAT_ADD, 1 09fd(0000): 01 ' 09fe(0000): 02 ' byte Common#SVC_FLOAT_SUB, 2 09ff(0000): 02 ' 0a00(0001): 03 ' byte Common#SVC_FLOAT_MUL, 3 0a01(0001): 03 ' 0a02(0001): 04 ' byte Common#SVC_FLOAT_DIV, 4 0a03(0001): 04 ' 0a04(0002): 05 ' byte Common#SVC_FLOAT_FLOAT, 5 0a05(0002): 05 ' 0a06(0002): 06 ' byte Common#SVC_FLOAT_TRUNC, 6 0a07(0002): 06 ' 0a08(0003): 07 ' byte Common#SVC_FLOAT_RND, 7 0a09(0003): 07 ' 0a0a(0003): 08 ' byte Common#SVC_FLOAT_SQR, 8 0a0b(0003): 08 ' 0a0c(0004): 09 ' byte Common#SVC_FLOAT_CMP, 9 0a0d(0004): 09 ' 0a0e(0004): 31 ' byte Common#SVC_FLOAT_SIN, 10 0a0f(0004): 0a ' 0a10(0005): 32 ' byte Common#SVC_FLOAT_COS, 11 0a11(0005): 0b ' 0a12(0005): 33 ' byte Common#SVC_FLOAT_TAN, 12 0a13(0005): 0c ' 0a14(0006): 34 ' byte Common#SVC_FLOAT_LOG, 13 0a15(0006): 0d ' 0a16(0006): 35 ' byte Common#SVC_FLOAT_LOG10, 14 0a17(0006): 0e ' 0a18(0007): 36 ' byte Common#SVC_FLOAT_EXP, 15 0a19(0007): 0f ' 0a1a(0007): 37 ' byte Common#SVC_FLOAT_EXP10, 16 0a1b(0007): 10 ' 0a1c(0008): 38 ' byte Common#SVC_FLOAT_POW, 17 0a1d(0008): 11 ' 0a1e(0008): 39 ' byte Common#SVC_FLOAT_FRAC, 18 0a1f(0008): 12 ' 0a20(0009): 00 ' byte 0, 0 0a21(0009): 00 ' '****************************************************************************** ' Catalina_Common.spin '****************************************************************************** '=============================== Object Header ================================ '================================ DAT Section ================================= '****************************************************************************** ' Catalina_Float32_A_Plugin.spin '****************************************************************************** '=============================== Object Header ================================ 0a50: 90 07 02 01 ' 1936 bytes, 2-1 methods, 1 object pointers 0a54: 84 07 00 00 ' METHOD 0a58: 88 19 00 00 ' OBJECT Catalina_Common.spin '================================ DAT Section ================================= 0a5c(0000): ' org 0a5c(0000): ' entry 0a5c(0000): 01 bc ff 0c ' cogid t1 ' get ... 0a60(0001): 02 bc ff 2c ' shl t1,#2 ' ... our ... 0a64(0002): f0 bd bf 80 ' add t1,par ' ... registry block entry 0a68(0003): de cf bf 08 ' rdlong rqstptr,t1 ' register ... 0a6c(0004): d2 cf bf 60 ' and rqstptr,Mask24 ' ... this ... 0a70(0005): 03 be ff a0 ' mov t2,#Plugin_Type ' ... plugin ... 0a74(0006): 18 be ff 2c ' shl t2,#24 ' ... as the ... 0a78(0007): e7 bf bf 68 ' or t2,rqstptr ' ... appropriate ... 0a7c(0008): de bf 3f 08 ' wrlong t2,t1 ' ... type 0a80(0009): d2 cf bf 60 ' and rqstptr,Mask24 ' set up our request block address 0a84(000a): 41 00 7c 5c ' jmp #doneCommand ' clear our request block 0a88(000b): ' getCommand 0a88(000b): e7 bd bf 0a ' rdlong t1, rqstptr wz ' wait for command 0a8c(000c): 0b 00 68 5c ' if_z jmp #getCommand 0a90(000d): de bf bf a0 ' mov t2, t1 ' load fnumA 0a94(000e): df d1 bf 08 ' rdlong fnumA, t2 0a98(000f): 04 be ff 80 ' add t2, #4 0a9c(0010): df d9 bf 08 ' rdlong fnumB, t2 ' load fnumB 0aa0(0011): 18 bc ff 2a ' shr t1, #24 wz ' get command 0aa4(0012): 13 bc 7f 85 ' cmp t1, #(FracCmd>>24)+1 wc ' check for valid command 0aa8(0013): 3d 00 6c 5c ' if_z_or_nc jmp #:exitNaN 0aac(0014): 01 bc ff 2c ' shl t1, #1 0ab0(0015): 15 bc ff 80 ' add t1, #:cmdTable-2 0ab4(0016): de 01 3c 5c ' jmp t1 ' jump to command 0ab8(0017): 48 b8 fc 5c ' :cmdTable call #_FAdd ' command dispatch table 0abc(0018): 3e 00 7c 5c ' jmp #endCommand 0ac0(0019): 43 b8 fc 5c ' call #_FSub 0ac4(001a): 3e 00 7c 5c ' jmp #endCommand 0ac8(001b): 60 dc fc 5c ' call #_FMul 0acc(001c): 3e 00 7c 5c ' jmp #endCommand 0ad0(001d): 72 02 fd 5c ' call #_FDiv 0ad4(001e): 3e 00 7c 5c ' jmp #endCommand 0ad8(001f): 82 1c fd 5c ' call #_FFloat 0adc(0020): 3e 00 7c 5c ' jmp #endCommand 0ae0(0021): 8f 3e fd 5c ' call #_FTrunc 0ae4(0022): 3e 00 7c 5c ' jmp #endCommand 0ae8(0023): 91 3e fd 5c ' call #_FRound 0aec(0024): 3e 00 7c 5c ' jmp #endCommand 0af0(0025): a0 76 fd 5c ' call #_FSqr 0af4(0026): 3e 00 7c 5c ' jmp #endCommand 0af8(0027): bc 9c fd 5c ' call #_FCmp 0afc(0028): 3b 00 7c 5c ' jmp #:returnstatus 0b00(0029): d1 00 fe 5c ' call #_Sin 0b04(002a): 3e 00 7c 5c ' jmp #endCommand 0b08(002b): cf 00 fe 5c ' call #_Cos 0b0c(002c): 3e 00 7c 5c ' jmp #endCommand 0b10(002d): 01 11 fe 5c ' call #_Tan 0b14(002e): 3e 00 7c 5c ' jmp #endCommand 0b18(002f): 09 19 fe 5c ' call #_Log 0b1c(0030): 3e 00 7c 5c ' jmp #endCommand 0b20(0031): 0d 21 fe 5c ' call #_Log10 0b24(0032): 3e 00 7c 5c ' jmp #endCommand 0b28(0033): 24 8d fe 5c ' call #_Exp 0b2c(0034): 3e 00 7c 5c ' jmp #endCommand 0b30(0035): 27 8d fe 5c ' call #_Exp10 0b34(0036): 3e 00 7c 5c ' jmp #endCommand 0b38(0037): 47 c9 fe 5c ' call #_Pow 0b3c(0038): 3e 00 7c 5c ' jmp #endCommand 0b40(0039): 65 dd fe 5c ' call #_Frac 0b44(003a): 3e 00 7c 5c ' jmp #endCommand 0b48(003b): e6 d1 bf a0 ' :returnstatus mov fnumA, status 0b4c(003c): 3e 00 7c 5c ' jmp #endcommand 0b50(003d): cf d1 bf a0 ' :exitNaN mov fnumA, NaN ' unknown command 0b54(003e): e7 bd bf a0 ' endCommand mov t1, rqstptr ' return result 0b58(003f): 04 bc ff 80 ' add t1, #4 0b5c(0040): de d1 3f 08 ' wrlong fnumA, t1 0b60(0041): ' doneCommand 0b60(0041): e7 9b 3f 08 ' wrlong Zero,rqstptr ' clear command status 0b64(0042): 0b 00 7c 5c ' jmp #getCommand ' wait for next command 0b68(0043): d7 d9 bf 6c ' _FSub xor fnumB, Bit31 ' negate B 0b6c(0044): 48 00 7c 5c ' jmp #_FAdd ' add values 0b70(0045): 5c 8e bc 50 ' _FAddI movs :getB, _FAddI_ret ' get immediate value 0b74(0046): 01 b8 fc 80 ' add _FAddI_ret, #1 0b78(0047): 00 d8 bf a0 ' :getB mov fnumB, 0 0b7c(0048): 8a 2b ff 5c ' _FAdd call #_Unpack2 ' unpack two variables 0b80(0049): 5c 00 78 5c ' if_c_or_z jmp #_FAdd_ret ' check for NaN or B = 0 0b84(004a): 01 d2 7f 62 ' test flagA, #SignFlag wz ' negate A mantissa if negative 0b88(004b): eb d7 97 a4 ' if_nz neg manA, manA 0b8c(004c): 01 da 7f 62 ' test flagB, #SignFlag wz ' negate B mantissa if negative 0b90(004d): ef df 97 a4 ' if_nz neg manB, manB 0b94(004e): ea bd bf a0 ' mov t1, expA ' align mantissas 0b98(004f): ee bd bf 84 ' sub t1, expB 0b9c(0050): de bd bf a8 ' abs t1, t1 0ba0(0051): 1f bc ff 4c ' max t1, #31 0ba4(0052): ee d5 3f c3 ' cmps expA, expB wz,wc 0ba8(0053): de df 87 38 ' if_nz_and_nc sar manB, t1 0bac(0054): de d7 93 38 ' if_nz_and_c sar manA, t1 0bb0(0055): ee d5 93 a0 ' if_nz_and_c mov expA, expB 0bb4(0056): ef d7 bf 80 ' add manA, manB ' add the two mantissas 0bb8(0057): 00 d6 7f c1 ' cmps manA, #0 wc, nr ' set sign of result 0bbc(0058): 01 d2 f3 68 ' if_c or flagA, #SignFlag 0bc0(0059): 01 d2 cf 64 ' if_nc andn flagA, #SignFlag 0bc4(005a): eb d7 bf a8 ' abs manA, manA ' pack result and exit 0bc8(005b): b4 99 ff 5c ' call #_Pack 0bcc(005c): ' _FSub_ret 0bcc(005c): ' _FAddI_ret 0bcc(005c): 00 00 7c 5c ' _FAdd_ret ret 0bd0(005d): 6e be bc 50 ' _FMulI movs :getB, _FMulI_ret ' get immediate value 0bd4(005e): 01 dc fc 80 ' add _FMulI_ret, #1 0bd8(005f): 00 d8 bf a0 ' :getB mov fnumB, 0 0bdc(0060): 8a 2b ff 5c ' _FMul call #_Unpack2 ' unpack two variables 0be0(0061): 6e 00 70 5c ' if_c jmp #_FMul_ret ' check for NaN 0be4(0062): ed d3 bf 6c ' xor flagA, flagB ' get sign of result 0be8(0063): ee d5 bf 80 ' add expA, expB ' add exponents 0bec(0064): 00 bc ff a0 ' mov t1, #0 ' t2 = upper 32 bits of manB 0bf0(0065): 20 be ff a0 ' mov t2, #32 ' loop counter for multiply 0bf4(0066): 01 de ff 29 ' shr manB, #1 wc ' get initial multiplier bit 0bf8(0067): eb bd b3 81 ' :multiply if_c add t1, manA wc ' 32x32 bit multiply 0bfc(0068): 01 bc ff 31 ' rcr t1, #1 wc 0c00(0069): 01 de ff 31 ' rcr manB, #1 wc 0c04(006a): 67 be ff e4 ' djnz t2, #:multiply 0c08(006b): 03 bc ff 2c ' shl t1, #3 ' justify result and exit 0c0c(006c): de d7 bf a0 ' mov manA, t1 0c10(006d): b4 99 ff 5c ' call #_Pack 0c14(006e): ' _FMulI_ret 0c14(006e): 00 00 7c 5c ' _FMul_ret ret 0c18(006f): 81 e2 bc 50 ' _FDivI movs :getB, _FDivI_ret ' get immediate value 0c1c(0070): 01 02 fd 80 ' add _FDivI_ret, #1 0c20(0071): 00 d8 bf a0 ' :getB mov fnumB, 0 0c24(0072): 8a 2b ff 5c ' _FDiv call #_Unpack2 ' unpack two variables 0c28(0073): cf d1 bb a0 ' if_c_or_z mov fnumA, NaN ' check for NaN or divide by 0 0c2c(0074): 81 00 78 5c ' if_c_or_z jmp #_FDiv_ret 0c30(0075): ed d3 bf 6c ' xor flagA, flagB ' get sign of result 0c34(0076): ee d5 bf 84 ' sub expA, expB ' subtract exponents 0c38(0077): 00 bc ff a0 ' mov t1, #0 ' clear quotient 0c3c(0078): 1e be ff a0 ' mov t2, #30 ' loop counter for divide 0c40(0079): 01 bc ff 2c ' :divide shl t1, #1 ' divide the mantissas 0c44(007a): ef d7 3f c3 ' cmps manA, manB wz,wc 0c48(007b): ef d7 af 84 ' if_z_or_nc sub manA, manB 0c4c(007c): 01 bc ef 80 ' if_z_or_nc add t1, #1 0c50(007d): 01 d6 ff 2c ' shl manA, #1 0c54(007e): 79 be ff e4 ' djnz t2, #:divide 0c58(007f): de d7 bf a0 ' mov manA, t1 ' get result and exit 0c5c(0080): b4 99 ff 5c ' call #_Pack 0c60(0081): ' _FDivI_ret 0c60(0081): 00 00 7c 5c ' _FDiv_ret ret 0c64(0082): e8 d3 bf a0 ' _FFloat mov flagA, fnumA ' get integer value 0c68(0083): 00 d0 ff a0 ' mov fnumA, #0 ' set initial result to zero 0c6c(0084): e9 d7 bf aa ' abs manA, flagA wz ' get absolute value of integer 0c70(0085): 8e 00 68 5c ' if_z jmp #_FFloat_ret ' if zero, exit 0c74(0086): 1f d2 ff 28 ' shr flagA, #31 ' set sign flag 0c78(0087): 1f d4 ff a0 ' mov expA, #31 ' set initial value for exponent 0c7c(0088): 01 d6 ff 2d ' :normalize shl manA, #1 wc ' normalize the mantissa 0c80(0089): 01 d4 cf 84 ' if_nc sub expA, #1 ' adjust exponent 0c84(008a): 88 00 4c 5c ' if_nc jmp #:normalize 0c88(008b): 01 d6 ff 30 ' rcr manA, #1 ' justify mantissa 0c8c(008c): 02 d6 ff 28 ' shr manA, #2 0c90(008d): b4 99 ff 5c ' call #_Pack ' pack and exit 0c94(008e): 00 00 7c 5c ' _FFloat_ret ret 0c98(008f): 00 bc ff a0 ' _FTrunc mov t1, #0 ' set for no rounding 0c9c(0090): 92 00 7c 5c ' jmp #fix 0ca0(0091): 01 bc ff a0 ' _FRound mov t1, #1 ' set for rounding 0ca4(0092): 96 67 ff 5c ' fix call #_Unpack ' unpack floating point value 0ca8(0093): 9f 00 70 5c ' if_c jmp #_FRound_ret ' check for NaN 0cac(0094): 02 d6 ff 2c ' shl manA, #2 ' left justify mantissa 0cb0(0095): 00 d0 ff a0 ' mov fnumA, #0 ' initialize result to zero 0cb4(0096): ea d5 bf a4 ' neg expA, expA ' adjust for exponent value 0cb8(0097): 1e d4 ff 82 ' add expA, #30 wz 0cbc(0098): 20 d4 7f c1 ' cmps expA, #32 wc 0cc0(0099): 9f 00 6c 5c ' if_nc_or_z jmp #_FRound_ret 0cc4(009a): ea d7 bf 28 ' shr manA, expA 0cc8(009b): de d7 bf 80 ' add manA, t1 ' round up 1/2 lsb 0ccc(009c): 01 d6 ff 28 ' shr manA, #1 0cd0(009d): 01 d2 7f 62 ' test flagA, #signFlag wz ' check sign and exit 0cd4(009e): eb d1 bf 9c ' sumnz fnumA, manA 0cd8(009f): ' _FTrunc_ret 0cd8(009f): 00 00 7c 5c ' _FRound_ret ret 0cdc(00a0): 96 67 ff 5c ' _FSqr call #_Unpack ' unpack floating point value 0ce0(00a1): 00 d0 cf a0 ' if_nc mov fnumA, #0 ' set initial result to zero 0ce4(00a2): bb 00 78 5c ' if_c_or_z jmp #_FSqr_ret ' check for NaN or zero 0ce8(00a3): 01 d2 7f 62 ' test flagA, #signFlag wz ' check for negative 0cec(00a4): cf d1 97 a0 ' if_nz mov fnumA, NaN ' yes, then return NaN 0cf0(00a5): bb 00 54 5c ' if_nz jmp #_FSqr_ret 0cf4(00a6): 01 d4 7f 62 ' test expA, #1 wz ' if even exponent, shift mantissa 0cf8(00a7): 01 d6 eb 28 ' if_z shr manA, #1 0cfc(00a8): 01 d4 ff 38 ' sar expA, #1 ' get exponent of root 0d00(00a9): d6 bd bf a0 ' mov t1, Bit30 ' set root value to $4000_0000 ' 0d04(00aa): 1f be ff a0 ' mov t2, #31 ' get loop counter 0d08(00ab): de d1 bf 68 ' :sqrt or fnumA, t1 ' blend partial root into result 0d0c(00ac): 20 c0 ff a0 ' mov t3, #32 ' loop counter for multiply 0d10(00ad): 00 c2 ff a0 ' mov t4, #0 0d14(00ae): e8 c5 bf a0 ' mov t5, fnumA 0d18(00af): 01 c4 ff 29 ' shr t5, #1 wc ' get initial multiplier bit 0d1c(00b0): e8 c3 b3 81 ' :multiply if_c add t4, fnumA wc ' 32x32 bit multiply 0d20(00b1): 01 c2 ff 31 ' rcr t4, #1 wc 0d24(00b2): 01 c4 ff 31 ' rcr t5, #1 wc 0d28(00b3): b0 c0 ff e4 ' djnz t3, #:multiply 0d2c(00b4): e1 d7 3f c1 ' cmps manA, t4 wc ' if too large remove partial root 0d30(00b5): de d1 b3 6c ' if_c xor fnumA, t1 0d34(00b6): 01 bc ff 28 ' shr t1, #1 ' shift partial root 0d38(00b7): ab be ff e4 ' djnz t2, #:sqrt ' continue for all bits 0d3c(00b8): e8 d7 bf a0 ' mov manA, fnumA ' store new mantissa value and exit 0d40(00b9): 01 d6 ff 28 ' shr manA, #1 0d44(00ba): b4 99 ff 5c ' call #_Pack 0d48(00bb): 00 00 7c 5c ' _FSqr_ret ret 0d4c(00bc): e8 bd bf a0 ' _FCmp mov t1, fnumA ' compare signs 0d50(00bd): ec bd bf 6c ' xor t1, fnumB 0d54(00be): d7 bd bf 62 ' and t1, Bit31 wz 0d58(00bf): c6 00 68 5c ' if_z jmp #:cmp1 ' same, then compare magnitude 0d5c(00c0): e8 bd bf a0 ' mov t1, fnumA ' check for +0 or -0 0d60(00c1): ec bd bf 68 ' or t1, fnumB 0d64(00c2): d7 bd bf 67 ' andn t1, Bit31 wz,wc 0d68(00c3): cb 00 68 5c ' if_z jmp #:exit 0d6c(00c4): d7 d1 3f 61 ' test fnumA, Bit31 wc ' compare signs 0d70(00c5): cb 00 7c 5c ' jmp #:exit 0d74(00c6): d7 d1 3f 62 ' :cmp1 test fnumA, Bit31 wz ' check signs 0d78(00c7): ca 00 54 5c ' if_nz jmp #:cmp2 0d7c(00c8): ec d1 3f 87 ' cmp fnumA, fnumB wz,wc 0d80(00c9): cb 00 7c 5c ' jmp #:exit 0d84(00ca): e8 d9 3f 87 ' :cmp2 cmp fnumB, fnumA wz,wc ' reverse test if negative 0d88(00cb): 01 cc ff a0 ' :exit mov status, #1 ' if fnumA > fnumB, t1 = 1 0d8c(00cc): e6 cd b3 a4 ' if_c neg status, status ' if fnumA < fnumB, t1 = -1 0d90(00cd): 00 cc eb a0 ' if_z mov status, #0 ' if fnumA = fnumB, t1 = 0 0d94(00ce): 00 00 7c 5c ' _FCmp_ret ret 0d98(00cf): 45 b8 fc 5c ' _Cos call #_FAddI ' cos(x) = sin(x + pi/2) 0d9c(00d0): db 0f c9 3f ' long pi / 2.0 0da0(00d1): e8 c7 bf a0 ' _Sin mov t6, fnumA ' save original angle 0da4(00d2): 6f 02 fd 5c ' call #_FDivI ' reduce angle to 0 to 2pi 0da8(00d3): db 0f c9 40 ' long 2.0 * pi 0dac(00d4): 8f 3e fd 5c ' call #_FTrunc 0db0(00d5): cf d1 3f 86 ' cmp fnumA, NaN wz ' check for NaN 0db4(00d6): 00 01 68 5c ' if_z jmp #_Sin_ret 0db8(00d7): 82 1c fd 5c ' call #_FFloat 0dbc(00d8): 5d dc fc 5c ' call #_FMulI 0dc0(00d9): db 0f c9 40 ' long 2.0 * pi 0dc4(00da): e8 d9 bf a0 ' mov fnumB, fnumA 0dc8(00db): e3 d1 bf a0 ' mov fnumA, t6 0dcc(00dc): 43 b8 fc 5c ' call #_FSub 0dd0(00dd): d7 d1 3f 62 ' test fnumA, bit31 wz 0dd4(00de): e1 00 68 5c ' if_z jmp #:sin1 0dd8(00df): 45 b8 fc 5c ' call #_FAddI 0ddc(00e0): db 0f c9 40 ' long 2.0 * pi 0de0(00e1): 5d dc fc 5c ' :sin1 call #_FMulI ' convert to 13 bit integer plus fraction 0de4(00e2): 83 f9 a2 44 ' long 8192.0 / (2.0 * pi) 0de8(00e3): e8 c5 bf a0 ' mov t5, fnumA ' get fraction 0dec(00e4): 65 dd fe 5c ' call #_Frac 0df0(00e5): e8 c3 bf a0 ' mov t4, fnumA 0df4(00e6): e2 d1 bf a0 ' mov fnumA, t5 ' get integer 0df8(00e7): 8f 3e fd 5c ' call #_FTrunc 0dfc(00e8): dc d1 3f 61 ' test fnumA, Sin_90 wc ' set C flag for quandrant 2 or 4 0e00(00e9): dd d1 3f 62 ' test fnumA, Sin_180 wz ' set Z flag for quandrant 3 or 4 0e04(00ea): e8 d1 bf b0 ' negc fnumA, fnumA ' if quandrant 2 or 4, negate offset 0e08(00eb): db d1 bf 68 ' or fnumA, SineTable ' blend in sine table address 0e0c(00ec): 01 d0 ff 2c ' shl fnumA, #1 ' get table offset 0e10(00ed): e8 bf bf 04 ' rdword t2, fnumA ' get first table value 0e14(00ee): df bf bf bc ' negnz t2, t2 ' if quandrant 3 or 4, negate 0e18(00ef): 02 d0 cf 80 ' if_nc add fnumA, #2 ' get second table value 0e1c(00f0): 02 d0 f3 84 ' if_c sub fnumA, #2 0e20(00f1): e8 c1 bf 04 ' rdword t3, fnumA 0e24(00f2): e0 c1 bf bc ' negnz t3, t3 ' if quandrant 3 or 4, negate 0e28(00f3): df d1 bf a0 ' mov fnumA, t2 ' result = float(value1) 0e2c(00f4): 82 1c fd 5c ' call #_FFloat 0e30(00f5): e1 d9 bf a2 ' mov fnumB, t4 wz ' exit if no fraction 0e34(00f6): fe 00 68 5c ' if_z jmp #:sin2 0e38(00f7): e8 c5 bf a0 ' mov t5, fnumA ' interpolate the fractional value 0e3c(00f8): e0 d1 bf a0 ' mov fnumA, t3 0e40(00f9): df d1 bf 84 ' sub fnumA, t2 0e44(00fa): 82 1c fd 5c ' call #_FFloat 0e48(00fb): 60 dc fc 5c ' call #_FMul 0e4c(00fc): e2 d9 bf a0 ' mov fnumB, t5 0e50(00fd): 48 b8 fc 5c ' call #_FAdd 0e54(00fe): 6f 02 fd 5c ' :sin2 call #_FDivI ' set range from -1.0 to 1.0 and exit 0e58(00ff): 00 ff 7f 47 ' long 65535.0 0e5c(0100): ' _Cos_ret 0e5c(0100): 00 00 7c 5c ' _Sin_ret ret 0e60(0101): e8 c9 bf a0 ' _Tan mov t7, fnumA ' tan(x) = sin(x) / cos(x) 0e64(0102): cf 00 fe 5c ' call #_Cos 0e68(0103): e8 cb bf a0 ' mov t8, fnumA 0e6c(0104): e4 d1 bf a0 ' mov fnumA, t7 0e70(0105): d1 00 fe 5c ' call #_Sin 0e74(0106): e5 d9 bf a0 ' mov fnumB, t8 0e78(0107): 72 02 fd 5c ' call #_FDiv 0e7c(0108): 00 00 7c 5c ' _Tan_ret ret 0e80(0109): 11 47 fe 5c ' _Log call #_Log2 ' log base e 0e84(010a): 6f 02 fd 5c ' call #_FDivI 0e88(010b): 3b aa b8 3f ' long 1.442695041 0e8c(010c): 00 00 7c 5c ' _Log_ret ret 0e90(010d): 11 47 fe 5c ' _Log10 call #_Log2 ' log base 10 0e94(010e): 6f 02 fd 5c ' call #_FDivI 0e98(010f): 78 9a 54 40 ' long 3.321928095 0e9c(0110): 00 00 7c 5c ' _Log10_ret ret 0ea0(0111): 96 67 ff 5c ' _Log2 call #_Unpack ' unpack variable 0ea4(0112): 22 01 78 5c ' if_z_or_c jmp #:exitNaN ' if NaN or <= 0, return NaN 0ea8(0113): 01 d2 7f 62 ' test flagA, #SignFlag wz 0eac(0114): 22 01 54 5c ' if_nz jmp #:exitNaN 0eb0(0115): ea c5 bf a0 ' mov t5, expA ' save exponent 0eb4(0116): eb bd bf a0 ' mov t1, manA ' get first 11 bits of fraction 0eb8(0117): 11 bc ff 28 ' shr t1, #17 ' get table offset 0ebc(0118): da bd bf 60 ' and t1, TableMask 0ec0(0119): d8 bd bf 80 ' add t1, LogTable ' get table address 0ec4(011a): 82 13 ff 5c ' call #float18Bits ' remainder = lower 18 bits 0ec8(011b): e8 bf bf a0 ' mov t2, fnumA 0ecc(011c): 6f 03 ff 5c ' call #loadTable ' get fraction from log table 0ed0(011d): e8 d9 bf a0 ' mov fnumB, fnumA 0ed4(011e): e2 d1 bf a0 ' mov fnumA, t5 ' convert exponent to float 0ed8(011f): 82 1c fd 5c ' call #_FFloat 0edc(0120): 48 b8 fc 5c ' call #_FAdd ' result = exponent + fraction 0ee0(0121): 23 01 7c 5c ' jmp #_Log2_ret 0ee4(0122): cf d1 bf a0 ' :exitNaN mov fnumA, NaN ' return NaN 0ee8(0123): 00 00 7c 5c ' _Log2_ret ret 0eec(0124): 5d dc fc 5c ' _Exp call #_FMulI ' e ** fnum 0ef0(0125): 3b aa b8 3f ' long 1.442695041 0ef4(0126): 29 01 7c 5c ' jmp #_Exp2 0ef8(0127): 5d dc fc 5c ' _Exp10 call #_FMulI ' 10 ** fnum 0efc(0128): 78 9a 54 40 ' long 3.321928095 0f00(0129): 96 67 ff 5c ' _Exp2 call #_Unpack ' unpack variable 0f04(012a): 46 01 70 5c ' if_c jmp #_Exp2_ret ' check for NaN 0f08(012b): ce d1 ab a0 ' if_z mov fnumA, One ' if 0, return 1.0 0f0c(012c): 46 01 68 5c ' if_z jmp #_Exp2_ret 0f10(012d): e8 c5 bf a0 ' mov t5, fnumA ' save sign value 0f14(012e): 8f 3e fd 5c ' call #_FTrunc ' get positive integer 0f18(012f): e8 c3 bf a8 ' abs t4, fnumA 0f1c(0130): e2 d1 bf a0 ' mov fnumA, t5 0f20(0131): 65 dd fe 5c ' call #_Frac ' get fraction 0f24(0132): 96 67 ff 5c ' call #_Unpack 0f28(0133): ea d5 bf a4 ' neg expA, expA ' get first 11 bits of fraction 0f2c(0134): ea d7 bf 28 ' shr manA, expA 0f30(0135): eb bd bf a0 ' mov t1, manA ' 0f34(0136): 11 bc ff 28 ' shr t1, #17 ' get table offset 0f38(0137): da bd bf 60 ' and t1, TableMask 0f3c(0138): d9 bd bf 80 ' add t1, AlogTable ' get table address 0f40(0139): 82 13 ff 5c ' call #float18Bits ' remainder = lower 18 bits 0f44(013a): e8 bf bf a0 ' mov t2, fnumA 0f48(013b): 6f 03 ff 5c ' call #loadTable ' get fraction from log table 0f4c(013c): 45 b8 fc 5c ' call #_FAddI ' add 1.0 0f50(013d): 00 00 80 3f ' long 1.0 0f54(013e): 96 67 ff 5c ' call #_Unpack ' align fraction 0f58(013f): e1 d5 bf 80 ' add expA, t4 ' add integer to exponent 0f5c(0140): b4 99 ff 5c ' call #_Pack 0f60(0141): d7 c5 3f 62 ' test t5, Bit31 wz ' check if negative 0f64(0142): 46 01 68 5c ' if_z jmp #_Exp2_ret 0f68(0143): e8 d9 bf a0 ' mov fnumB, fnumA ' yes, then invert 0f6c(0144): ce d1 bf a0 ' mov fnumA, One 0f70(0145): 72 02 fd 5c ' call #_FDiv 0f74(0146): ' _Exp_ret 0f74(0146): ' _Exp10_ret 0f74(0146): 00 00 7c 5c ' _Exp2_ret ret 0f78(0147): cf d9 3f 62 ' _Pow test fnumB, NaN wz ' check exponent 0f7c(0148): ce d1 ab a0 ' if_z mov fnumA, One ' if exponent=0, set base to 1.0 0f80(0149): e8 c9 bf a1 ' mov t7, fnumA wc ' save sign of result 0f84(014a): 59 01 4c 5c ' if_nc jmp #:pow3 ' check sign of base 0f88(014b): ec d1 bf a0 ' mov fnumA, fnumB ' check exponent 0f8c(014c): 96 67 ff 5c ' call #_Unpack 0f90(014d): e4 d1 bf a0 ' mov fnumA, t7 ' restore base 0f94(014e): 57 01 68 5c ' if_z jmp #:pow2 ' check for exponent = 0 0f98(014f): d7 d5 3f 62 ' test expA, Bit31 wz ' if exponent < 0, return NaN 0f9c(0150): 55 01 54 5c ' if_nz jmp #:pow1 0fa0(0151): 17 d4 ff 4c ' max expA, #23 ' check if exponent = integer 0fa4(0152): ea d7 bf 2c ' shl manA, expA 0fa8(0153): d3 d7 3f 62 ' and manA, Mask29 wz, nr 0fac(0154): 57 01 68 5c ' if_z jmp #:pow2 ' yes, then check if odd 0fb0(0155): cf d1 bf a0 ' :pow1 mov fnumA, NaN ' return NaN 0fb4(0156): 64 01 7c 5c ' jmp #_Pow_ret 0fb8(0157): d5 d7 3f 62 ' :pow2 test manA, Bit29 wz ' if odd, then negate result 0fbc(0158): d7 c9 ab 64 ' if_z andn t7, Bit31 0fc0(0159): d7 d9 3f 61 ' :pow3 test fnumB, Bit31 wc ' check sign of exponent 0fc4(015a): d7 d1 bf 66 ' andn fnumA, Bit31 wz ' get |fnumA| 0fc8(015b): 55 01 60 5c ' if_z_and_c jmp #:pow1 ' if 0^-n, return NaN 0fcc(015c): 64 01 68 5c ' if_z jmp #_Pow_ret ' if 0^+n, return Zero 0fd0(015d): ec c7 bf a0 ' mov t6, fnumB ' save power 0fd4(015e): 11 47 fe 5c ' call #_Log2 ' get log of base 0fd8(015f): e3 d9 bf a0 ' mov fnumB, t6 ' multiply by power 0fdc(0160): 60 dc fc 5c ' call #_FMul 0fe0(0161): 29 8d fe 5c ' call #_Exp2 ' get result 0fe4(0162): d7 c9 3f 62 ' test t7, Bit31 wz ' check for negative 0fe8(0163): d7 d1 97 6c ' if_nz xor fnumA, Bit31 0fec(0164): 00 00 7c 5c ' _Pow_ret ret 0ff0(0165): 96 67 ff 5c ' _Frac call #_Unpack ' get fraction 0ff4(0166): d7 d5 3f 62 ' test expA, Bit31 wz ' check for exp < 0 or NaN 0ff8(0167): 6c 01 74 5c ' if_c_or_nz jmp #:exit 0ffc(0168): 17 d4 ff 4c ' max expA, #23 ' remove the integer 1000(0169): ea d7 bf 2c ' shl manA, expA 1004(016a): d3 d7 bf 60 ' and manA, Mask29 1008(016b): 00 d4 ff a0 ' mov expA, #0 ' return fraction 100c(016c): b4 99 ff 5c ' :exit call #_Pack 1010(016d): d7 d1 bf 64 ' andn fnumA, Bit31 1014(016e): 00 00 7c 5c ' _Frac_ret ret 1018(016f): de c1 bf 04 ' loadTable rdword t3, t1 ' t3 = first table value 101c(0170): 00 be 7f 86 ' cmp t2, #0 wz ' if remainder = 0, skip interpolation 1020(0171): 00 bc eb a0 ' if_z mov t1, #0 1024(0172): 78 01 68 5c ' if_z jmp #:load2 1028(0173): 02 bc ff 80 ' add t1, #2 ' load second table value 102c(0174): da bd 3f 62 ' test t1, TableMask wz ' check for end of table 1030(0175): d4 bd ab a0 ' if_z mov t1, Bit16 ' t1 = second table value 1034(0176): de bd 97 04 ' if_nz rdword t1, t1 1038(0177): e0 bd bf 84 ' sub t1, t3 ' t1 = t1 - t3 103c(0178): e0 d7 bf a0 ' :load2 mov manA, t3 ' convert t3 to float 1040(0179): 84 13 ff 5c ' call #float16Bits 1044(017a): e8 c1 bf a0 ' mov t3, fnumA 1048(017b): de d7 bf a0 ' mov manA, t1 ' convert t1 to float 104c(017c): 84 13 ff 5c ' call #float16Bits 1050(017d): df d9 bf a0 ' mov fnumB, t2 ' t1 = t1 * remainder 1054(017e): 60 dc fc 5c ' call #_FMul 1058(017f): e0 d9 bf a0 ' mov fnumB, t3 ' result = t1 + t3 105c(0180): 48 b8 fc 5c ' call #_FAdd 1060(0181): 00 00 7c 5c ' loadTable_ret ret 1064(0182): 0e d6 ff 2c ' float18Bits shl manA, #14 ' float lower 18 bits 1068(0183): 85 01 7c 5c ' jmp #floatBits 106c(0184): 10 d6 ff 2c ' float16Bits shl manA, #16 ' float lower 16 bits 1070(0185): 03 d6 ff 28 ' floatBits shr manA, #3 ' align to bit 29 1074(0186): 00 d2 ff a0 ' mov flagA, #0 ' convert table value to float 1078(0187): 00 d4 ff a0 ' mov expA, #0 107c(0188): b4 99 ff 5c ' call #_Pack ' pack and exit 1080(0189): ' float18Bits_ret 1080(0189): ' float16Bits_ret 1080(0189): 00 00 7c 5c ' floatBits_ret ret 1084(018a): e8 bd bf a0 ' _Unpack2 mov t1, fnumA ' save A 1088(018b): ec d1 bf a0 ' mov fnumA, fnumB ' unpack B to A 108c(018c): 96 67 ff 5c ' call #_Unpack 1090(018d): 95 01 70 5c ' if_c jmp #_Unpack2_ret ' check for NaN 1094(018e): e8 d9 bf a0 ' mov fnumB, fnumA ' save B variables 1098(018f): e9 db bf a0 ' mov flagB, flagA 109c(0190): ea dd bf a0 ' mov expB, expA 10a0(0191): eb df bf a0 ' mov manB, manA 10a4(0192): de d1 bf a0 ' mov fnumA, t1 ' unpack A 10a8(0193): 96 67 ff 5c ' call #_Unpack 10ac(0194): 00 de 7f 86 ' cmp manB, #0 wz ' set Z flag 10b0(0195): 00 00 7c 5c ' _Unpack2_ret ret 10b4(0196): e8 d3 bf a0 ' _Unpack mov flagA, fnumA ' get sign 10b8(0197): 1f d2 ff 28 ' shr flagA, #31 10bc(0198): e8 d7 bf a0 ' mov manA, fnumA ' get mantissa 10c0(0199): d1 d7 bf 60 ' and manA, Mask23 10c4(019a): e8 d5 bf a0 ' mov expA, fnumA ' get exponent 10c8(019b): 01 d4 ff 2c ' shl expA, #1 10cc(019c): 18 d4 ff 2a ' shr expA, #24 wz 10d0(019d): a3 01 68 5c ' if_z jmp #:zeroSubnormal ' check for zero or subnormal 10d4(019e): ff d4 7f 86 ' cmp expA, #255 wz ' check if finite 10d8(019f): ae 01 54 5c ' if_nz jmp #:finite 10dc(01a0): cf d1 bf a0 ' mov fnumA, NaN ' no, then return NaN 10e0(01a1): 08 d2 ff a0 ' mov flagA, #NaNFlag 10e4(01a2): b1 01 7c 5c ' jmp #:exit2 10e8(01a3): ea d7 3f 6a ' :zeroSubnormal or manA, expA wz,nr ' check for zero 10ec(01a4): a8 01 54 5c ' if_nz jmp #:subnorm 10f0(01a5): 02 d2 ff 68 ' or flagA, #ZeroFlag ' yes, then set zero flag 10f4(01a6): 96 d4 ff a4 ' neg expA, #150 ' set exponent and exit 10f8(01a7): b1 01 7c 5c ' jmp #:exit2 10fc(01a8): 07 d6 ff 2c ' :subnorm shl manA, #7 ' fix justification for subnormals 1100(01a9): d5 d7 3f 62 ' :subnorm2 test manA, Bit29 wz 1104(01aa): b0 01 54 5c ' if_nz jmp #:exit1 1108(01ab): 01 d6 ff 2c ' shl manA, #1 110c(01ac): 01 d4 ff 84 ' sub expA, #1 1110(01ad): a9 01 7c 5c ' jmp #:subnorm2 1114(01ae): 06 d6 ff 2c ' :finite shl manA, #6 ' justify mantissa to bit 29 1118(01af): d5 d7 bf 68 ' or manA, Bit29 ' add leading one bit 111c(01b0): 7f d4 ff 84 ' :exit1 sub expA, #127 ' remove bias from exponent 1120(01b1): 08 d2 7f 61 ' :exit2 test flagA, #NaNFlag wc ' set C flag 1124(01b2): 00 d6 7f 86 ' cmp manA, #0 wz ' set Z flag 1128(01b3): 00 00 7c 5c ' _Unpack_ret ret 112c(01b4): 00 d6 7f 86 ' _Pack cmp manA, #0 wz ' check for zero 1130(01b5): 00 d4 eb a0 ' if_z mov expA, #0 1134(01b6): c7 01 68 5c ' if_z jmp #:exit1 1138(01b7): 01 d6 ff 2d ' :normalize shl manA, #1 wc ' normalize the mantissa 113c(01b8): 01 d4 cf 84 ' if_nc sub expA, #1 ' adjust exponent 1140(01b9): b7 01 4c 5c ' if_nc jmp #:normalize 1144(01ba): 02 d4 ff 80 ' add expA, #2 ' adjust exponent 1148(01bb): 00 d7 ff 81 ' add manA, #$100 wc ' round up by 1/2 lsb 114c(01bc): 01 d4 f3 80 ' if_c add expA, #1 1150(01bd): 7f d4 ff 80 ' add expA, #127 ' add bias to exponent 1154(01be): d0 d5 bf 40 ' mins expA, Minus23 1158(01bf): ff d4 ff 44 ' maxs expA, #255 115c(01c0): 01 d4 7f c1 ' cmps expA, #1 wc ' check for subnormals 1160(01c1): c7 01 4c 5c ' if_nc jmp #:exit1 1164(01c2): 01 d6 ff 68 ' :subnormal or manA, #1 ' adjust mantissa 1168(01c3): 01 d6 ff 20 ' ror manA, #1 116c(01c4): ea d5 bf a4 ' neg expA, expA 1170(01c5): ea d7 bf 28 ' shr manA, expA 1174(01c6): 00 d4 ff a0 ' mov expA, #0 ' biased exponent = 0 1178(01c7): eb d1 bf a0 ' :exit1 mov fnumA, manA ' bits 22:0 mantissa 117c(01c8): 09 d0 ff 28 ' shr fnumA, #9 1180(01c9): ea d1 bf 58 ' movi fnumA, expA ' bits 23:30 exponent 1184(01ca): 1f d2 ff 2c ' shl flagA, #31 1188(01cb): e9 d1 bf 68 ' or fnumA, flagA ' bit 31 sign 118c(01cc): 00 00 7c 5c ' _Pack_ret ret 1190(01cd): 00 00 00 00 ' Zero long 0 ' constants 1194(01ce): 00 00 80 3f ' One long $3F80_0000 1198(01cf): ff ff ff 7f ' NaN long $7FFF_FFFF 119c(01d0): e9 ff ff ff ' Minus23 long -23 11a0(01d1): ff ff 7f 00 ' Mask23 long $007F_FFFF 11a4(01d2): ff ff ff 00 ' Mask24 long $00FF_FFFF 11a8(01d3): ff ff ff 1f ' Mask29 long $1FFF_FFFF 11ac(01d4): 00 00 01 00 ' Bit16 long $0001_0000 11b0(01d5): 00 00 00 20 ' Bit29 long $2000_0000 11b4(01d6): 00 00 00 40 ' Bit30 long $4000_0000 11b8(01d7): 00 00 00 80 ' Bit31 long $8000_0000 11bc(01d8): 00 c0 00 00 ' LogTable long $C000 11c0(01d9): 00 d0 00 00 ' ALogTable long $D000 11c4(01da): fe 0f 00 00 ' TableMask long $0FFE 11c8(01db): 00 70 00 00 ' SineTable long $E000 >> 1 11cc(01dc): 00 08 00 00 ' Sin_90 long $0800 11d0(01dd): 00 10 00 00 ' Sin_180 long $1000 11d4(01de): ' t1 res 1 ' temporary values 11d4(01df): ' t2 res 1 11d4(01e0): ' t3 res 1 11d4(01e1): ' t4 res 1 11d4(01e2): ' t5 res 1 11d4(01e3): ' t6 res 1 11d4(01e4): ' t7 res 1 11d4(01e5): ' t8 res 1 11d4(01e6): ' status res 1 ' last compare status 11d4(01e7): ' rqstptr res 1 ' my request /reply block address 11d4(01e8): ' fnumA res 1 ' floating point A value 11d4(01e9): ' flagA res 1 11d4(01ea): ' expA res 1 11d4(01eb): ' manA res 1 11d4(01ec): ' fnumB res 1 ' floating point B value 11d4(01ed): ' flagB res 1 11d4(01ee): ' expB res 1 11d4(01ef): ' manB res 1 11d4(01f0): ' fit $1f0 '****************************************************************************** ' Catalina_Common.spin '****************************************************************************** '=============================== Object Header ================================ '================================ DAT Section ================================= '****************************************************************************** ' SD_Card.spin '****************************************************************************** '=============================== Object Header ================================ '================================ DAT Section ================================= '****************************************************************************** ' Clock.spin '****************************************************************************** '=============================== Object Header ================================ 11e0: 10 00 03 00 ' 16 bytes, 3-1 methods, 0 object pointers 11e4: 0c 00 00 00 ' METHOD 11e4: 0c 00 00 00 ' METHOD '================================ DAT Section ================================= '****************************************************************************** ' HMI.spin '****************************************************************************** '=============================== Object Header ================================ 11f0: 98 00 03 02 ' 152 bytes, 3-1 methods, 2 object pointers 11f4: 50 00 04 00 ' METHOD 11f4: 50 00 04 00 ' METHOD 11f8: 66 00 0c 00 ' OBJECT Catalina_Common.spin 11fc: e8 11 10 00 ' OBJECT Catalina_HMI_Plugin_TTY.spin '================================ DAT Section ================================= 1204(0000): ' HMI_Service_Table 1204(0000): 0a ' byte Common#SVC_K_PRESENT , 1 1205(0000): 01 ' 1206(0000): 0b ' byte Common#SVC_K_GET , 2 1207(0000): 02 ' 1208(0001): 0c ' byte Common#SVC_K_WAIT , 3 1209(0001): 03 ' 120a(0001): 0d ' byte Common#SVC_K_NEW , 4 120b(0001): 04 ' 120c(0002): 0e ' byte Common#SVC_K_READY , 5 120d(0002): 05 ' 120e(0002): 0f ' byte Common#SVC_K_CLEAR , 6 120f(0002): 06 ' 1210(0003): 10 ' byte Common#SVC_K_STATE , 7 1211(0003): 07 ' 1212(0003): 11 ' byte Common#SVC_M_PRESENT , 11 1213(0003): 0b ' 1214(0004): 12 ' byte Common#SVC_M_BUTTON , 12 1215(0004): 0c ' 1216(0004): 13 ' byte Common#SVC_M_BUTTONS , 13 1217(0004): 0d ' 1218(0005): 14 ' byte Common#SVC_M_ABS_X , 14 1219(0005): 0e ' 121a(0005): 15 ' byte Common#SVC_M_ABS_Y , 15 121b(0005): 0f ' 121c(0006): 16 ' byte Common#SVC_M_ABS_Z , 16 121d(0006): 10 ' 121e(0006): 17 ' byte Common#SVC_M_DELTA_X , 17 121f(0006): 11 ' 1220(0007): 18 ' byte Common#SVC_M_DELTA_Y , 18 1221(0007): 12 ' 1222(0007): 19 ' byte Common#SVC_M_DELTA_Z , 19 1223(0007): 13 ' 1224(0008): 1a ' byte Common#SVC_M_RESET , 20 1225(0008): 14 ' 1226(0008): 1b ' byte Common#SVC_T_GEOMETRY, 21 1227(0008): 15 ' 1228(0009): 1c ' byte Common#SVC_T_CHAR , 22 1229(0009): 16 ' 122a(0009): 1d ' byte Common#SVC_T_STRING , 23 122b(0009): 17 ' 122c(000a): 1e ' byte Common#SVC_T_INT , 24 122d(000a): 18 ' 122e(000a): 1f ' byte Common#SVC_T_UNSIGNED, 25 122f(000a): 19 ' 1230(000b): 20 ' byte Common#SVC_T_HEX , 26 1231(000b): 1a ' 1232(000b): 21 ' byte Common#SVC_T_BIN , 27 1233(000b): 1b ' 1234(000c): 22 ' byte Common#SVC_T_SETPOS , 28 1235(000c): 1c ' 1236(000c): 23 ' byte Common#SVC_T_GETPOS , 29 1237(000c): 1d ' 1238(000d): 24 ' byte Common#SVC_T_MODE , 30 1239(000d): 1e ' 123a(000d): 25 ' byte Common#SVC_T_SCROLL , 31 123b(000d): 1f ' 123c(000e): 26 ' byte Common#SVC_T_COLOR , 32 123d(000e): 20 ' 123e(000e): 00 ' byte 0 , 0 123f(000e): 00 ' '****************************************************************************** ' Catalina_Common.spin '****************************************************************************** '=============================== Object Header ================================ '================================ DAT Section ================================= '****************************************************************************** ' Catalina_HMI_Plugin_TTY.spin '****************************************************************************** '=============================== Object Header ================================ 1288: 3c 03 02 03 ' 828 bytes, 2-1 methods, 3 object pointers 128c: 00 03 04 00 ' METHOD 1290: 50 11 00 00 ' OBJECT Catalina_Common.spin 1294: 3c 03 00 00 ' OBJECT Catalina_CogCount.spin 1298: 88 03 00 00 ' OBJECT Catalina_FullDuplexSerial.spin '================================ DAT Section ================================= 129c(0000): ' org 0 129c(0000): ' HmiStart 129c(0000): 01 00 fc 0c ' t0 cogid t0 ' calculate ... 12a0(0001): 02 00 fc 2c ' t1 shl t0,#2 ' ... my ... 12a4(0002): f0 01 bc 80 ' t2 add t0,par ' ... request ... 12a8(0003): 00 76 bd 08 ' t3 rdlong rqstptr,t0 ' ... block ... 12ac(0004): b9 76 bd 60 ' t4 and rqstptr,low23 ' ... address (only use 23 bits) 12b0(0005): bb 78 bd a0 ' t5 mov rsltptr,rqstptr ' calculate ... 12b4(0006): 04 78 fd 80 ' t6 add rsltptr,#4 ' ... my result address 12b8(0007): ' loop 12b8(0007): bb 7a bd 0a ' rdlong rqst,rqstptr wz ' wait ... 12bc(0008): 07 00 68 5c ' if_z jmp #loop ' ... for a request 12c0(0009): bd 02 bc a0 ' mov t1,rqst 12c4(000a): 18 02 fc 28 ' shr t1,#24 12c8(000b): 20 02 7c 87 ' cmp t1,#32 wz,wc 12cc(000c): 81 00 44 5c ' if_a jmp #done_bad 12d0(000d): 02 02 fc 20 ' ror t1,#2 ' lookup code address 12d4(000e): 16 02 fc 80 ' add t1,#svctable 12d8(000f): 01 24 bc 50 ' movs :table,t1 12dc(0010): 02 02 fc 24 ' rol t1,#2 12e0(0011): 03 02 fc 2c ' shl t1,#3 12e4(0012): 00 04 bc a0 ' :table mov t2,0 12e8(0013): 01 04 bc 28 ' shr t2,t1 12ec(0014): ff 04 fc 60 ' and t2,#$FF 12f0(0015): 02 00 3c 5c ' jmp t2 ' jump to code routine 12f4(0016): ' svctable 12f4(0016): 1f ' byte initialize ' 0 12f5(0016): 2c ' byte k_present ' 1 12f6(0016): 2e ' byte k_get ' 2 12f7(0016): 36 ' byte k_wait ' 3 12f8(0017): 34 ' byte k_new ' 4 12f9(0017): 39 ' byte k_ready ' 5 12fa(0017): 3d ' byte k_clear ' 6 12fb(0017): 83 ' byte done_ok ' 7 k_state ignored (always return 0) 12fc(0018): 81 ' byte done_bad ' 8 12fd(0018): 81 ' byte done_bad ' 9 12fe(0018): 81 ' byte done_bad '10 12ff(0018): 83 ' byte done_ok '11 m_present ignored 1300(0019): 83 ' byte done_ok '12 m_button ignored 1301(0019): 83 ' byte done_ok '13 m_buttons ignored 1302(0019): 83 ' byte done_ok '14 m_abs_x ignored 1303(0019): 83 ' byte done_ok '15 m_abs_y ignored 1304(001a): 83 ' byte done_ok '16 m_abs_z ignored 1305(001a): 83 ' byte done_ok '17 m_delta_x ignored 1306(001a): 83 ' byte done_ok '18 m_delta_y ignored 1307(001a): 83 ' byte done_ok '19 m_delta_z ignored 1308(001b): 83 ' byte done_ok '20 m_reset ignored 1309(001b): 83 ' byte done_ok '21 t_geometry ignored (always return 0) 130a(001b): 40 ' byte t_char '22 130b(001b): 44 ' byte t_string '23 130c(001c): 4a ' byte t_int '24 130d(001c): 6b ' byte t_unsigned '25 130e(001c): 6d ' byte t_hex '26 130f(001c): 78 ' byte t_bin '27 1310(001d): 83 ' byte done_ok '28 t_setpos ignored 1311(001d): 83 ' byte done_ok '29 t_getpos ignored 1312(001d): 83 ' byte done_ok '30 t_mode ignored 1313(001d): 83 ' byte done_ok '31 t_scroll ignored 1314(001e): 83 ' byte done_ok '32 t_color ignored 1318(001f): ' initialize 1318(001f): bb 82 bd 08 ' rdlong prxhead,rqstptr ' save pointer to rx_head 131c(0020): c1 84 bd a0 ' mov prxtail,prxhead ' calculate ... 1320(0021): 04 84 fd 80 ' add prxtail,#4 ' ... pointer to rx_tail 1324(0022): c2 86 bd a0 ' mov ptxhead,prxtail ' calculate ... 1328(0023): 04 86 fd 80 ' add ptxhead,#4 ' ... pointer to tx_head 132c(0024): c3 88 bd a0 ' mov ptxtail,ptxhead ' calculate ... 1330(0025): 04 88 fd 80 ' add ptxtail,#4 ' ... pointer to tx_tail 1334(0026): c4 8c bd a0 ' mov prxbuff,ptxtail ' calculate ... 1338(0027): 14 8c fd 80 ' add prxbuff,#20 ' ... 133c(0028): c6 8c bd 08 ' rdlong prxbuff,prxbuff ' ... pointer to rx_buffer 1340(0029): c6 8a bd a0 ' mov ptxbuff,prxbuff ' calculate ... 1344(002a): 10 8a fd 80 ' add ptxbuff,#16 ' ... pointer to tx_buffer 1348(002b): 3d 00 7c 5c ' jmp #k_clear ' initialize keyboard 134c(002c): ' k_present 134c(002c): 01 7c fd a0 ' mov rslt,#1 ' presume ... 1350(002d): 84 00 7c 5c ' jmp #done ' ... always present 1354(002e): ' k_get 1354(002e): 8f 32 fd 5c ' call #k_load ' load key pointed to by tx_tail 1358(002f): 83 00 68 5c ' if_z jmp #done_ok ' Z set if no key available 135c(0030): ' k_consume 135c(0030): 01 02 fc 80 ' add t1,#1 ' increment ... 1360(0031): 0f 02 fc 60 ' and t1,#$f ' ... 1364(0032): c2 02 3c 08 ' wrlong t1,prxtail ' ... rx_tail 1368(0033): 84 00 7c 5c ' jmp #done 136c(0034): c1 02 bc 08 ' k_new rdlong t1,prxhead ' set rx_tail ... 1370(0035): c2 02 3c 08 ' wrlong t1,prxtail ' ... to rx_head 1374(0036): ' k_wait 1374(0036): 8f 32 fd 5c ' call #k_load ' load key pointed to by rx_tail 1378(0037): 36 00 68 5c ' if_z jmp #k_wait ' Z set if no key available 137c(0038): 30 00 7c 5c ' jmp #k_consume ' consume and return the key 1380(0039): ' k_ready 1380(0039): 88 1c fd 5c ' call #k_setup ' setup common values 1384(003a): 84 00 68 5c ' if_z jmp #done ' rslt == 0 if no key ready 1388(003b): 01 7c fd a4 ' neg rslt,#1 ' rslt == -1 if a key is ready 138c(003c): 84 00 7c 5c ' jmp #done 1390(003d): ' k_clear 1390(003d): c1 02 bc 08 ' rdlong t1,prxhead ' set rx_tail ... 1394(003e): c2 02 3c 08 ' wrlong t1,prxtail ' .... to rx_head 1398(003f): 84 00 7c 5c ' jmp #done 139c(0040): ' t_char 139c(0040): bd 0a bc a0 ' mov t5,rqst ' get ... 13a0(0041): ff 0a fc 60 ' and t5,#$ff ' ... char to write 13a4(0042): a6 5a fd 5c ' call #t_put5 ' write char to screen at cursor 13a8(0043): 83 00 7c 5c ' jmp #done_ok 13ac(0044): ' t_string 13ac(0044): b9 7a bd 60 ' and rqst,low23 ' source address is lower 23 bits of request 13b0(0045): ' :t_strloop 13b0(0045): bd 0a bc 02 ' rdbyte t5,rqst wz ' get char to write 13b4(0046): 83 00 68 5c ' if_z jmp #done_ok ' finished if null byte 13b8(0047): a6 5a fd 5c ' call #t_put5 ' write char to screen 13bc(0048): 01 7a fd 80 ' add rqst,#1 ' increment string pointer 13c0(0049): 45 00 7c 5c ' jmp #:t_strloop ' put more chars 13c4(004a): ' t_int 13c4(004a): a3 4a fd 5c ' call #t_getnum ' get number to print 13c8(004b): 00 7a 7d c3 ' cmps rqst,#0 WC,WZ ' positive? 13cc(004c): 50 00 4c 5c ' if_ae jmp #t_uint ' yes - no sign 13d0(004d): 2d 0a fc a0 ' mov t5,#$2d ' no - prefix number with '-' 13d4(004e): a6 5a fd 5c ' call #t_put5 ' write char to screen at cursor 13d8(004f): bd 7a bd ab ' abs rqst,rqst WC,WZ ' make number positive 13dc(0050): ' t_uint 13dc(0050): 67 00 68 5c ' if_z jmp #:t_int4 ' if zero, just print one digit 13e0(0051): ba 08 bc a0 ' mov t4,maxdec ' get largest possible decimal divisor 13e4(0052): ' :t_int2 13e4(0052): 04 7a 3d 87 ' cmp rqst,t4 WC,WZ ' is our number larger than that? 13e8(0053): 59 00 4c 5c ' if_ae jmp #:t_int3 ' yes - start extracting decimal digits 13ec(0054): 04 00 bc a0 ' mov t0,t4 ' no - divide divisor ... 13f0(0055): 0a 02 fc a0 ' mov t1,#10 ' ... by 10 ... 13f4(0056): ae 70 fd 5c ' call #d32u ' ... and ... 13f8(0057): 00 08 bc a0 ' mov t4,t0 ' ... try ... 13fc(0058): 52 00 7c 5c ' jmp #:t_int2 ' ... again 1400(0059): ' :t_int3 1400(0059): 0a 08 7c 87 ' cmp t4,#10 WC,WZ ' is this the last digit? 1404(005a): 67 00 70 5c ' if_b jmp #:t_int4 ' yes - no need to divide any more 1408(005b): bd 00 bc a0 ' mov t0,rqst ' no - divide number ... 140c(005c): 04 02 bc a0 ' mov t1,t4 ' ... by ... 1410(005d): ae 70 fd 5c ' call #d32u ' ... divisor 1414(005e): 00 0a bc a0 ' mov t5,t0 ' convert quotient ... 1418(005f): 30 0a fc 80 ' add t5,#$30 ' ... to digit char 141c(0060): 01 7a bd a0 ' mov rqst,t1 ' save remainder for next time 1420(0061): a6 5a fd 5c ' call #t_put5 ' write char to screen at cursor 1424(0062): 04 00 bc a0 ' mov t0,t4 ' divide divisor ... 1428(0063): 0a 02 fc a0 ' mov t1,#10 ' ... by 10 ... 142c(0064): ae 70 fd 5c ' call #d32u ' ... and ... 1430(0065): 00 08 bc a0 ' mov t4,t0 ' ... continue ... 1434(0066): 59 00 7c 5c ' jmp #:t_int3 ' ... with next digit 1438(0067): ' :t_int4 1438(0067): bd 0a bc a0 ' mov t5,rqst ' convert last decimal digit ... 143c(0068): 30 0a fc 80 ' add t5,#$30 ' ... to digit char 1440(0069): a6 5a fd 5c ' call #t_put5 ' write char to screen 1444(006a): 83 00 7c 5c ' jmp #done_ok 1448(006b): ' t_unsigned 1448(006b): a3 4a fd 5c ' call #t_getnum ' get number to print 144c(006c): 50 00 7c 5c ' jmp #t_uint ' no sign, just print digits 1450(006d): ' t_hex 1450(006d): a3 4a fd 5c ' call #t_getnum ' and get number to print 1454(006e): 08 08 fc a0 ' mov t4,#8 ' print 8 digits 1458(006f): ' :t_hex1 1458(006f): 04 7a fd 24 ' rol rqst,#4 ' convert 4 bits ... 145c(0070): bd 0a bc a0 ' mov t5,rqst ' ... to '0' .. '9' 1460(0071): 0f 0a fc 60 ' and t5,#$f ' ... or ... 1464(0072): 0a 0a 7c 87 ' cmp t5,#10 wc,wz ' ... 'A' .. 'F' ... 1468(0073): 07 0a cc 80 ' if_ae add t5,#($41-$30-10)' ... depending ... 146c(0074): 30 0a fc 80 ' add t5,#$30 ' ... on the digit value 1470(0075): a6 5a fd 5c ' call #t_put5 ' write char to screen 1474(0076): 6f 08 fc e4 ' djnz t4,#:t_hex1 ' continue with next digit 1478(0077): 83 00 7c 5c ' jmp #done_ok 147c(0078): ' t_bin 147c(0078): a3 4a fd 5c ' call #t_getnum ' get number to print 1480(0079): 20 08 fc a0 ' mov t4,#32 ' print 32 digits 1484(007a): ' :t_bin1 1484(007a): 01 7a fd 24 ' rol rqst,#1 ' convert bit ... 1488(007b): bd 0a bc a0 ' mov t5,rqst ' ... to '0' ... 148c(007c): 01 0a fc 60 ' and t5,#1 ' ... or ... 1490(007d): 30 0a fc 80 ' add t5,#$30 ' ... '1' 1494(007e): a6 5a fd 5c ' call #t_put5 ' write char to screen 1498(007f): 7a 08 fc e4 ' djnz t4,#:t_bin1 ' continue with next digit 149c(0080): 83 00 7c 5c ' jmp #done_ok 14a0(0081): ' done_bad 14a0(0081): 01 7c fd a4 ' neg rslt,#1 ' unknown code specified 14a4(0082): 84 00 7c 5c ' jmp #done 14a8(0083): ' done_ok 14a8(0083): 00 7c fd a0 ' mov rslt,#0 ' return zero 14ac(0084): ' done 14ac(0084): bc 7c 3d 08 ' wrlong rslt,rsltptr ' save result 14b0(0085): 00 7c fd a0 ' mov rslt,#0 ' indicate ... 14b4(0086): bb 7c 3d 08 ' wrlong rslt,rqstptr ' ... request complete 14b8(0087): 07 00 7c 5c ' jmp #loop ' wait for next request 14bc(0088): ' k_setup 14bc(0088): c1 04 bc a0 ' mov t2,prxhead ' get ... 14c0(0089): 02 04 bc 08 ' rdlong t2,t2 ' ... rx_head 14c4(008a): c2 02 bc a0 ' mov t1,prxtail ' get ... 14c8(008b): 01 02 bc 08 ' rdlong t1,t1 ' ... rx_tail 14cc(008c): 01 7c bd a0 ' mov rslt,t1 ' set Z flag ... 14d0(008d): 02 7c bd 86 ' sub rslt,t2 wz ' ... and rslt = 0 if rx_tail == rx_head 14d4(008e): ' k_setup_ret 14d4(008e): 00 00 7c 5c ' ret 14d8(008f): ' k_load 14d8(008f): 88 1c fd 5c ' call #k_setup ' setup common values 14dc(0090): 99 00 68 5c ' if_z jmp #k_load_ret ' Z flag set if no key available 14e0(0091): c6 7c bd a0 ' mov rslt,prxbuff ' point to key ... 14e4(0092): 01 7c bd 80 ' add rslt,t1 ' ... indicated ... 14e8(0093): be 7c bd 00 ' rdbyte rslt,rslt ' ... by rx_tail 14ec(0094): 0d 7c 7d 86 ' cmp rslt,#$0d wz ' CR? 14f0(0095): 0a 7c e9 a0 ' if_z mov rslt,#$0a ' if so, correct it 14f4(0096): 04 7c 7d 86 ' cmp rslt,#$04 wz ' EOT? 14f8(0097): 01 7c e9 a4 ' if_z neg rslt,#1 ' if so, return -1 (EOF) 14fc(0098): 01 00 fc a2 ' mov t0,#1 wz ' ensure Z flag not set! 1500(0099): ' k_load_ret 1500(0099): 00 00 7c 5c ' ret 1504(009a): ' t_setup 1504(009a): c3 04 bc a0 ' mov t2,ptxhead ' get ... 1508(009b): 02 04 bc 08 ' rdlong t2,t2 ' ... tx_head 150c(009c): c4 02 bc a0 ' mov t1,ptxtail ' get ... 1510(009d): 01 02 bc 08 ' rdlong t1,t1 ' ... tx_tail 1514(009e): 02 06 bc a0 ' mov t3,t2 ' set Z flag ... 1518(009f): 01 06 fc 80 ' add t3,#1 ' ... if ... 151c(00a0): 0f 06 fc 60 ' and t3,#$f ' ... tx_tail 1520(00a1): 03 02 3c 86 ' cmp t1,t3 wz ' ... == (tx_head + 1) & $f 1524(00a2): ' t_setup_ret 1524(00a2): 00 00 7c 5c ' ret 1528(00a3): ' t_getnum 1528(00a3): b9 7a bd 60 ' and rqst,low23 ' source address is lower 23 bits of request 152c(00a4): bd 7a bd 0a ' rdlong rqst,rqst wz ' get the actual number in the rquest 1530(00a5): ' t_getnum_ret 1530(00a5): 00 00 7c 5c ' ret 1534(00a6): ' t_put5 1534(00a6): 9a 44 fd 5c ' call #t_setup ' setup common values 1538(00a7): a6 00 68 5c ' if_z jmp #t_put5 ' repeat until (tx_tail <> (tx_head + 1) & $f) 153c(00a8): c5 00 bc a0 ' mov t0,ptxbuff ' txbuffer... 1540(00a9): 02 00 bc 80 ' add t0,t2 ' ... [tx_head] ... 1544(00aa): 00 0a 3c 00 ' wrbyte t5,t0 ' ... := t5 1548(00ab): c3 00 bc a0 ' mov t0,ptxhead ' tx_head ... 154c(00ac): 00 06 3c 08 ' wrlong t3,t0 ' ... := (tx_head + 1) & $f 1550(00ad): ' t_put5_ret 1550(00ad): 00 00 7c 5c ' ret 1554(00ae): ' d32u 1554(00ae): 20 7e fd a0 ' mov d1,#32 1558(00af): 00 80 fd a0 ' mov d2, #0 155c(00b0): ' :d32up 155c(00b0): 01 00 fc 2d ' shl t0,#1 WC 1560(00b1): 01 80 fd 35 ' rcl d2,#1 WC 1564(00b2): c0 02 3c 87 ' cmp t1,d2 WC,WZ 1568(00b3): 01 80 b9 84 ' if_be sub d2,t1 156c(00b4): 01 00 f8 80 ' if_be add t0,#1 1570(00b5): ' :d32down 1570(00b5): 01 7e fd 86 ' sub d1, #1 WZ 1574(00b6): b0 00 54 5c ' if_ne jmp #:d32up 1578(00b7): c0 02 bc a0 ' mov t1,d2 157c(00b8): ' d32u_ret 157c(00b8): 00 00 7c 5c ' ret 1580(00b9): ff ff 7f 00 ' low23 long $007FFFFF 1584(00ba): 00 ca 9a 3b ' maxdec long 1000000000 ' maximum decimal divisor for 32 bit values 1588(00bb): ' rqstptr res 1 ' address of my request block 1588(00bc): ' rsltptr res 1 ' address to put results 1588(00bd): ' rqst res 1 ' request being processed 1588(00be): ' rslt res 1 ' result to return 1588(00bf): ' d1 res 1 ' used when dividing 1588(00c0): ' d2 res 1 ' used when dividing 1588(00c1): ' prxhead res 1 1588(00c2): ' prxtail res 1 1588(00c3): ' ptxhead res 1 1588(00c4): ' ptxtail res 1 1588(00c5): ' ptxbuff res 1 1588(00c6): ' prxbuff res 1 1588(00c7): ' fit $1f0 '****************************************************************************** ' Catalina_Common.spin '****************************************************************************** '=============================== Object Header ================================ '================================ DAT Section ================================= '****************************************************************************** ' Catalina_CogCount.spin '****************************************************************************** '=============================== Object Header ================================ 15c4: 4c 00 03 01 ' 76 bytes, 3-1 methods, 1 object pointers 15c8: 10 00 88 00 ' METHOD 15c8: 10 00 88 00 ' METHOD 15cc: 49 00 00 00 ' OBJECT Catalina_Common.spin '================================ DAT Section ================================= '****************************************************************************** ' Catalina_Common.spin '****************************************************************************** '=============================== Object Header ================================ '================================ DAT Section ================================= '****************************************************************************** ' Catalina_FullDuplexSerial.spin '****************************************************************************** '=============================== Object Header ================================ 1610: c8 01 05 01 ' 456 bytes, 5-1 methods, 1 object pointers 1614: 68 01 00 00 ' METHOD 1614: 68 01 00 00 ' METHOD 1614: 68 01 00 00 ' METHOD 1614: 68 01 00 00 ' METHOD 1618: 8b 01 00 00 ' OBJECT Catalina_Common.spin '================================ DAT Section ================================= 1628(0000): ' org 1628(0000): f0 a9 bc a0 ' entry mov t1,par 'get structure address 162c(0001): 10 a8 fc 80 ' add t1,#4 << 2 'skip past heads and tails 1630(0002): 54 aa bc 08 ' rdlong t2,t1 'get rx_pin 1634(0003): 01 b2 fc a0 ' mov rxmask,#1 1638(0004): 55 b2 bc 2c ' shl rxmask,t2 163c(0005): 04 a8 fc 80 ' add t1,#4 'get tx_pin 1640(0006): 54 aa bc 08 ' rdlong t2,t1 1644(0007): 01 be fc a0 ' mov txmask,#1 1648(0008): 55 be bc 2c ' shl txmask,t2 164c(0009): 04 a8 fc 80 ' add t1,#4 'get rxtx_mode 1650(000a): 54 ae bc 08 ' rdlong rxtxmode,t1 1654(000b): 04 a8 fc 80 ' add t1,#4 'get bit_ticks 1658(000c): 54 b0 bc 08 ' rdlong bitticks,t1 165c(000d): 04 a8 fc 80 ' add t1,#4 'get buffer_ptr 1660(000e): 54 b4 bc 08 ' rdlong rxbuff,t1 1664(000f): 5a c0 bc a0 ' mov txbuff,rxbuff 1668(0010): 10 c0 fc 80 ' add txbuff,#16 166c(0011): 04 ae 7c 62 ' test rxtxmode,#%100 wz 'init tx pin according to mode 1670(0012): 02 ae 7c 61 ' test rxtxmode,#%010 wc 1674(0013): 5f e8 9b 68 ' if_z_ne_c or outa,txmask 1678(0014): 5f ec ab 68 ' if_z or dira,txmask 167c(0015): 33 c8 fc a0 ' mov txcode,#transmit 'initialize ping-pong multitasking 1680(0016): 64 bc bc 5c ' receive jmpret rxcode,txcode 'run a chunk of transmit code, then return 1684(0017): 01 ae 7c 62 ' test rxtxmode,#%001 wz 'wait for start bit on rx pin 1688(0018): f2 b3 3c 61 ' test rxmask,ina wc 168c(0019): 16 00 64 5c ' if_z_eq_c jmp #receive 1690(001a): 09 b8 fc a0 ' mov rxbits,#9 'ready to receive byte 1694(001b): 58 ba bc a0 ' mov rxcnt,bitticks 1698(001c): 01 ba fc 28 ' shr rxcnt,#1 169c(001d): f1 bb bc 80 ' add rxcnt,cnt 16a0(001e): 58 ba bc 80 ' :bit add rxcnt,bitticks 'ready next bit period 16a4(001f): 64 bc bc 5c ' :wait jmpret rxcode,txcode 'run a chuck of transmit code, then return 16a8(0020): 5d a8 bc a0 ' mov t1,rxcnt 'check if bit receive period done 16ac(0021): f1 a9 bc 84 ' sub t1,cnt 16b0(0022): 00 a8 7c c1 ' cmps t1,#0 wc 16b4(0023): 1f 00 4c 5c ' if_nc jmp #:wait 16b8(0024): f2 b3 3c 61 ' test rxmask,ina wc 'receive bit on rx pin 16bc(0025): 01 b6 fc 30 ' rcr rxdata,#1 16c0(0026): 1e b8 fc e4 ' djnz rxbits,#:bit 16c4(0027): 17 b6 fc 28 ' shr rxdata,#32-9 'justify and trim received byte 16c8(0028): ff b6 fc 60 ' and rxdata,#$FF 16cc(0029): 01 ae 7c 62 ' test rxtxmode,#%001 wz 'if rx inverted, invert byte 16d0(002a): ff b6 d4 6c ' if_nz xor rxdata,#$FF 16d4(002b): f0 ab bc 08 ' rdlong t2,par 'save received byte and inc head 16d8(002c): 5a aa bc 80 ' add t2,rxbuff 16dc(002d): 55 b6 3c 00 ' wrbyte rxdata,t2 16e0(002e): 5a aa bc 84 ' sub t2,rxbuff 16e4(002f): 01 aa fc 80 ' add t2,#1 16e8(0030): 0f aa fc 60 ' and t2,#$0F 16ec(0031): f0 ab 3c 08 ' wrlong t2,par 16f0(0032): 16 00 7c 5c ' jmp #receive 'byte done, receive next byte 16f4(0033): 5e c8 bc 5c ' transmit jmpret txcode,rxcode 'run a chunk of receive code, then return 16f8(0034): f0 a9 bc a0 ' mov t1,par 'check for head <> tail 16fc(0035): 08 a8 fc 80 ' add t1,#2 << 2 1700(0036): 54 aa bc 08 ' rdlong t2,t1 1704(0037): 04 a8 fc 80 ' add t1,#1 << 2 1708(0038): 54 ac bc 08 ' rdlong t3,t1 170c(0039): 56 aa 3c 86 ' cmp t2,t3 wz 1710(003a): 33 00 68 5c ' if_z jmp #transmit 1714(003b): 60 ac bc 80 ' add t3,txbuff 'get byte and inc tail 1718(003c): 56 c2 bc 00 ' rdbyte txdata,t3 171c(003d): 60 ac bc 84 ' sub t3,txbuff 1720(003e): 01 ac fc 80 ' add t3,#1 1724(003f): 0f ac fc 60 ' and t3,#$0F 1728(0040): 54 ac 3c 08 ' wrlong t3,t1 172c(0041): 00 c3 fc 68 ' or txdata,#$100 'ready byte to transmit 1730(0042): 02 c2 fc 2c ' shl txdata,#2 1734(0043): 01 c2 fc 68 ' or txdata,#1 1738(0044): 0b c4 fc a0 ' mov txbits,#11 173c(0045): f1 c7 bc a0 ' mov txcnt,cnt 1740(0046): 04 ae 7c 62 ' :bit test rxtxmode,#%100 wz 'output bit on tx pin according to mode 1744(0047): 02 ae 7c 61 ' test rxtxmode,#%010 wc 1748(0048): 01 c2 e0 6c ' if_z_and_c xor txdata,#1 174c(0049): 01 c2 fc 29 ' shr txdata,#1 wc 1750(004a): 5f e8 ab 70 ' if_z muxc outa,txmask 1754(004b): 5f ec 97 74 ' if_nz muxnc dira,txmask 1758(004c): 58 c6 bc 80 ' add txcnt,bitticks 'ready next cnt 175c(004d): 5e c8 bc 5c ' :wait jmpret txcode,rxcode 'run a chunk of receive code, then return 1760(004e): 63 a8 bc a0 ' mov t1,txcnt 'check if bit transmit period done 1764(004f): f1 a9 bc 84 ' sub t1,cnt 1768(0050): 00 a8 7c c1 ' cmps t1,#0 wc 176c(0051): 4d 00 4c 5c ' if_nc jmp #:wait 1770(0052): 46 c4 fc e4 ' djnz txbits,#:bit 'another bit to transmit? 1774(0053): 33 00 7c 5c ' jmp #transmit 'byte done, transmit next byte 1778(0054): ' t1 res 1 1778(0055): ' t2 res 1 1778(0056): ' t3 res 1 1778(0057): ' rxtxmode res 1 1778(0058): ' bitticks res 1 1778(0059): ' rxmask res 1 1778(005a): ' rxbuff res 1 1778(005b): ' rxdata res 1 1778(005c): ' rxbits res 1 1778(005d): ' rxcnt res 1 1778(005e): ' rxcode res 1 1778(005f): ' txmask res 1 1778(0060): ' txbuff res 1 1778(0061): ' txdata res 1 1778(0062): ' txbits res 1 1778(0063): ' txcnt res 1 1778(0064): ' txcode res 1 '****************************************************************************** ' Catalina_Common.spin '****************************************************************************** '=============================== Object Header ================================ '================================ DAT Section ================================= '****************************************************************************** ' Graphics.spin '****************************************************************************** '=============================== Object Header ================================ 17d8: 10 00 03 00 ' 16 bytes, 3-1 methods, 0 object pointers 17dc: 0c 00 00 00 ' METHOD 17dc: 0c 00 00 00 ' METHOD '================================ DAT Section ================================= '****************************************************************************** ' Proxy_IO.spin '****************************************************************************** '=============================== Object Header ================================ 17e8: 24 00 06 00 ' 36 bytes, 6-1 methods, 0 object pointers 17ec: 18 00 00 00 ' METHOD 17ec: 18 00 00 00 ' METHOD 17ec: 18 00 00 00 ' METHOD 17ec: 18 00 00 00 ' METHOD 17ec: 18 00 00 00 ' METHOD '================================ DAT Section ================================= '****************************************************************************** ' Extras.spin '****************************************************************************** '=============================== Object Header ================================ 180c: 14 00 03 01 ' 20 bytes, 3-1 methods, 1 object pointers 1810: 10 00 00 00 ' METHOD 1810: 10 00 00 00 ' METHOD 1814: 11 00 00 00 ' OBJECT Catalina_Common.spin '================================ DAT Section ================================= '****************************************************************************** ' Catalina_Common.spin '****************************************************************************** '=============================== Object Header ================================ '================================ DAT Section ================================= '****************************************************************************** ' Catalina_XMM.spin '****************************************************************************** '=============================== Object Header ================================ 1820: 80 07 03 01 ' 1920 bytes, 3-1 methods, 1 object pointers 1824: 70 07 00 00 ' METHOD 1824: 70 07 00 00 ' METHOD 1828: 74 07 04 00 ' OBJECT Catalina_Common.spin '================================ DAT Section ================================= 1830(0000): ' org 0 1830(0000): ' entry 1830(0000): 02 00 7c 5c ' jmp #INIT '$00 1834(0001): 00 00 00 00 ' XMM_Reg long 0 '$01 1838(0002): 53 00 7c 5c ' INIT jmp #lmm_init '$02 183c(0003): 7b 00 7c 5c ' LODL jmp #load_l '$03 1840(0004): 7d 00 7c 5c ' LODI jmp #load_i '$04 1844(0005): 80 00 7c 5c ' LODF jmp #fp_ind '$05 1848(0006): 88 00 7c 5c ' PSHL jmp #push_l '$06 184c(0007): a1 00 7c 5c ' PSHB jmp #push_b '$07 1850(0008): a8 00 7c 5c ' CPYB jmp #copy_b '$08 1854(0009): b4 00 7c 5c ' NEWF jmp #new_fp '$09 1858(000a): ba 00 7c 5c ' RETF jmp #fp_ret '$0a 185c(000b): c0 00 7c 5c ' CALA jmp #f_call '$0b 1860(000c): bc 00 7c 5c ' RETN jmp #f_ret '$0c 1864(000d): c1 00 7c 5c ' CALI jmp #f_cali '$0d 1868(000e): c5 00 7c 5c ' JMPA jmp #f_jump '$0e 186c(000f): c6 00 7c 5c ' JMPI jmp #f_jmpi '$0f 1870(0010): c9 00 7c 5c ' DIVS jmp #f_d32s '$10 1874(0011): d4 00 7c 5c ' DIVU jmp #f_d32u '$11 1878(0012): de 00 7c 5c ' MULT jmp #f_m32 '$12 187c(0013): e7 00 7c 5c ' BR_Z jmp #bra_z '$13 1880(0014): e9 00 7c 5c ' BRNZ jmp #bra_nz '$14 1884(0015): eb 00 7c 5c ' BRAE jmp #bra_ae '$15 1888(0016): ed 00 7c 5c ' BR_A jmp #bra_a '$16 188c(0017): ef 00 7c 5c ' BRBE jmp #bra_be '$17 1890(0018): f1 00 7c 5c ' BR_B jmp #bra_b '$18 1894(0019): f3 00 7c 5c ' SYSP jmp #plugin '$19 1898(001a): 83 00 7c 5c ' PSHA jmp #push_a '$1a 189c(001b): 3b 01 7c 5c ' FADD jmp #flt_add '$1b 18a0(001c): 3d 01 7c 5c ' FSUB jmp #flt_sub '$1c 18a4(001d): 3f 01 7c 5c ' FMUL jmp #flt_mul '$1d 18a8(001e): 41 01 7c 5c ' FDIV jmp #flt_div '$1e 18ac(001f): 53 01 7c 5c ' FCMP jmp #flt_cmp '$1f 18b0(0020): 43 01 7c 5c ' FLIN jmp #flt_int '$20 18b4(0021): 45 01 7c 5c ' INFL jmp #int_flt '$21 18b8(0022): 8b 00 7c 5c ' PSHM jmp #push_m '$22 18bc(0023): 97 00 7c 5c ' POPM jmp #pop_m '$23 18c0(0024): 85 00 7c 5c ' PSHF jmp #push_i '$24 18c4(0025): 27 01 7c 5c ' RLNG jmp #rd_long '$25 18c8(0026): 29 01 7c 5c ' RWRD jmp #rd_word '$26 18cc(0027): 2b 01 7c 5c ' RBYT jmp #rd_byte '$27 18d0(0028): 31 01 7c 5c ' WLNG jmp #wr_long '$28 18d4(0029): 33 01 7c 5c ' WWRD jmp #wr_word '$29 18d8(002a): 35 01 7c 5c ' WBYT jmp #wr_byte '$2a 18dc(002b): 00 00 00 00 ' PC long 0 '$2b 18e0(002c): 00 00 00 00 ' SP long 0 '$2c 18e4(002d): 00 00 00 00 ' FP long 0 '$2d 18e8(002e): 00 00 00 00 ' RI long 0 '$2e 18ec(002f): 00 00 00 00 ' BC long 0 '$2f 18f0(0030): 00 00 00 00 ' BA long 0 '$30 18f4(0031): 00 00 00 00 ' BZ long 0 '$31 18f8(0032): 00 00 00 00 ' CS long 0 '$32 18fc(0033): 00 00 00 00 ' r0 long 0 '$33 1900(0034): 00 00 00 00 ' r1 long 0 '$34 1904(0035): 00 00 00 00 ' r2 long 0 '$35 1908(0036): 00 00 00 00 ' r3 long 0 '$36 190c(0037): 00 00 00 00 ' r4 long 0 '$37 1910(0038): 00 00 00 00 ' r5 long 0 '$38 1914(0039): 00 00 00 00 ' r6 long 0 '$39 1918(003a): 00 00 00 00 ' r7 long 0 '$3a 191c(003b): 00 00 00 00 ' r8 long 0 '$3b 1920(003c): 00 00 00 00 ' r9 long 0 '$3c 1924(003d): 00 00 00 00 ' r10 long 0 '$3d 1928(003e): 00 00 00 00 ' r11 long 0 '$3e 192c(003f): 00 00 00 00 ' r12 long 0 '$3f 1930(0040): 00 00 00 00 ' r13 long 0 '$40 1934(0041): 00 00 00 00 ' r14 long 0 '$41 1938(0042): 00 00 00 00 ' r15 long 0 '$42 193c(0043): 00 00 00 00 ' r16 long 0 '$43 1940(0044): 00 00 00 00 ' r17 long 0 '$44 1944(0045): 00 00 00 00 ' r18 long 0 '$45 1948(0046): 00 00 00 00 ' r19 long 0 '$46 194c(0047): 00 00 00 00 ' r20 long 0 '$47 1950(0048): 00 00 00 00 ' r21 long 0 '$48 1954(0049): 00 00 00 00 ' r22 long 0 '$49 1958(004a): 00 00 00 00 ' r23 long 0 '$4a 195c(004b): 00 00 00 80 ' Bit31 long $80000000 '$4b 1960(004c): ff ff ff ff ' all_1s long $ffffffff '$4c 1964(004d): ff 00 00 00 ' cviu_m1 long $000000ff '$4d 1968(004e): ff ff 00 00 ' cviu_m2 long $0000ffff '$4e 196c(004f): 00 00 00 ff ' top8 long $ff000000 '$4f ' top 8 bits bitmask 1970(0050): ff ff ff 00 ' low24 long $00ffffff '$50 ' low 24 bits bitmask 1974(0051): ' init_B0 ' must match xmm_progbeg.s! 1974(0051): 00 00 00 00 ' init_BZ long $00000000 '$51 ' end of code / start of heap 1978(0052): 00 00 00 00 ' init_PC long $00000000 '$52 ' the initial PC 197c(0053): ' lmm_init 197c(0053): 01 66 fc 0c ' cogid r0 '$53 1 convert ... 1980(0054): 02 66 fc 2c ' shl r0,#2 '$54 2 ... my cog id ... 1984(0055): f0 67 bc 80 ' add r0,par '$55 3 ... to my registration addr 1988(0056): 33 68 bc 04 ' rdword r1,r0 '$56 4 register ... 198c(0057): 33 68 3c 08 ' wrlong r1,r0 '$57 5 ... ourselves 1990(0058): 34 c8 be a0 ' mov xfer,r1 '$58 6 1994(0059): ' wait 1994(0059): 34 60 bc 0a ' rdlong BA,r1 wz '$59 7 Wait till we are given the base address ... 1998(005a): 59 00 68 5c ' if_z jmp #wait '$5a 8 .. (only used during initialization) 199c(005b): 04 68 fc 80 ' add r1,#4 '$5b 9 Load our initial SP ... 19a0(005c): 34 58 bc 08 ' rdlong SP,r1 '$5c 10 ... from the request block 19a4(005d): 08 62 fc a0 ' mov BZ,#(init_BZ-init_B0)<<2+8 '$5d 11 calculate ... 19a8(005e): 30 62 bc 80 ' add BZ,BA '$5e 12 ... pointer to initial BZ 19ac(005f): 31 56 bc a0 ' mov PC,BZ '$5f 13 load ... 19b0(0060): 04 56 fc 80 ' add PC,#4 '$60 14 ... initial ... 19b4(0061): 2b 56 bc 08 ' rdlong PC,PC '$61 15 ... PC and ... 19b8(0062): 31 62 bc 08 ' rdlong BZ,BZ '$62 16 ... BZ and ... 19bc(0063): 73 e9 fe 5c ' call #XMM_Activate '$63 17 Initialize XMM hardware 19c0(0064): 24 64 fc 08 ' rdlong CS,#$10+(init_PC-init_B0)<<2+8+8 '$64 18 get code segment from RAM 19c4(0065): 32 56 bc 84 ' sub PC,CS '$65 19 correct PC for XMM 19c8(0066): 77 00 7c 5c ' jmp #LMM_loop '$66 20 we can now start executing LMM code 19cc(0067): 00 00 00 00 ' nop '$67 21 19d0(0068): 00 00 00 00 ' nop '$68 22 19d4(0069): 00 00 00 00 ' nop '$69 23 19d8(006a): 00 00 00 00 ' nop '$6a 24 19dc(006b): 00 00 00 00 ' nop '$6b 25 19e0(006c): 00 00 00 00 ' nop '$6c 26 19e4(006d): ' XMM_ReadReg 19e4(006d): 01 0c ff 54 ' movd XMM_Dst,#XMM_Reg '$6d 19e8(006e): 75 11 ff 5c ' call #XMM_ReadLong '$6e 19ec(006f): ' XMM_ReadReg_ret 19ec(006f): 00 00 7c 5c ' ret '$6f 19f0(0070): ' XMM_WriteReg 19f0(0070): 01 4a ff 50 ' movs XMM_Src,#XMM_Reg '$70 19f4(0071): 94 49 ff 5c ' call #XMM_WriteLong '$71 19f8(0072): ' XMM_WriteReg_ret 19f8(0072): 00 00 7c 5c ' ret '$72 19fc(0073): 00 00 00 00 ' XMM_Addr long 0 '$73 1a00(0074): 00 00 00 00 ' Hub_Addr long 0 '$74 1a04(0075): 00 00 00 00 ' XMM_Len long 0 '$75 1a08(0076): ' LMM_next 1a08(0076): 04 56 fc 80 ' add PC,#4 '$76 1a0c(0077): ' LMM_loop 1a0c(0077): 79 0c ff 54 ' movd XMM_Dst,#LMM_1 '$77 1a10(0078): 6f e5 fe 5c ' call #XMM_ReadInstr '$78 1a14(0079): ' LMM_1 1a14(0079): 00 00 00 00 ' nop '$79 1a18(007a): 77 00 7c 5c ' jmp #LMM_loop 1a1c(007b): ' load_l 1a1c(007b): 6e e5 fe 5c ' call #XMM_ReadRI ' load the long 1a20(007c): 77 00 7c 5c ' jmp #LMM_loop ' execute next instruction 1a24(007d): ' load_i 1a24(007d): 6e e5 fe 5c ' call #XMM_ReadRI ' load the address 1a28(007e): 2e 5c bc 08 ' rdlong RI,RI ' read the value at that address 1a2c(007f): 77 00 7c 5c ' jmp #LMM_loop ' execute next instruction 1a30(0080): ' fp_ind 1a30(0080): 6e e5 fe 5c ' call #XMM_ReadRI ' load the long value 1a34(0081): 2d 5c bc d0 ' adds RI,FP ' add the frame pointer 1a38(0082): 77 00 7c 5c ' jmp #LMM_loop ' execute next instruction 1a3c(0083): ' push_a 1a3c(0083): 6e e5 fe 5c ' call #XMM_ReadRI ' load the address 1a40(0084): 87 00 7c 5c ' jmp #push_x 1a44(0085): ' push_i 1a44(0085): 6e e5 fe 5c ' call #XMM_ReadRI ' load the long value 1a48(0086): 2d 5c bc d0 ' adds RI,FP ' add the frame pointer 1a4c(0087): ' push_x 1a4c(0087): 2e 5c bc 08 ' rdlong RI,RI ' read the value at that address 1a50(0088): ' push_l 1a50(0088): 04 58 fc 84 ' sub SP,#4 ' decrement SP 1a54(0089): 2c 5c 3c 08 ' wrlong RI,SP ' save value on stack 1a58(008a): 77 00 7c 5c ' jmp #LMM_loop ' execute next instruction 1a5c(008b): ' push_m 1a5c(008b): 6e e5 fe 5c ' call #XMM_ReadRI ' load the long value specifying the registers to push 1a60(008c): 2e ca be a0 ' mov t1,RI ' save register specification for later 1a64(008d): 39 22 fd 54 ' movd :push_x,#r6 ' start with ... 1a68(008e): 06 5c fc 28 ' shr RI,#6 ' ... r6 1a6c(008f): ' :push_nxt 1a6c(008f): 01 5c fc 2b ' shr RI,#1 wc,wz ' save rX? 1a70(0090): 04 58 f0 84 ' if_c sub SP,#4 ' if so ... 1a74(0091): ' :push_x ' ... save ... 1a74(0091): 2c 00 30 08 ' if_c wrlong 0-0,SP ' ... the register 1a78(0092): 63 23 bd 80 ' add :push_x,dlsb ' point to next register 1a7c(0093): 8f 00 54 5c ' if_nz jmp #:push_nxt ' continue till all registers checked 1a80(0094): 04 58 fc 84 ' sub SP,#4 ' save ... 1a84(0095): 2c ca 3e 08 ' wrlong t1,SP ' .... register specification 1a88(0096): 77 00 7c 5c ' jmp #LMM_loop ' execute next instruction 1a8c(0097): ' pop_m 1a8c(0097): 2c 5c bc 08 ' rdlong RI,SP ' load ... 1a90(0098): 04 58 fc 80 ' add SP,#4 ' ... register specification to pop 1a94(0099): 4a 38 fd 54 ' movd :pop_x,#r23 ' start with ... 1a98(009a): 08 5c fc 2c ' shl RI,#(32-24) ' ... r23 1a9c(009b): ' :pop_nxt 1a9c(009b): 01 5c fc 2f ' shl RI,#1 wc,wz ' load rX? 1aa0(009c): ' :pop_x ' if so ... 1aa0(009c): 2c 00 b0 08 ' if_c rdlong 0-0,SP ' ... load ... 1aa4(009d): 04 58 f0 80 ' if_c add SP,#4 ' ... the register 1aa8(009e): 77 00 68 5c ' if_z jmp #LMM_loop ' execute next instruction if all done 1aac(009f): 63 39 bd 84 ' sub :pop_x,dlsb ' point to previous register 1ab0(00a0): 9b 00 7c 5c ' jmp #:pop_nxt ' continue till all registers popped 1ab4(00a1): ' push_b 1ab4(00a1): 6c e5 fe 5c ' call #XMM_ReadBC ' load the byte count from the PC 1ab8(00a2): 03 5e fc 80 ' add BC,#3 ' round up BC ... 1abc(00a3): 03 5e fc 64 ' andn BC,#3 ' ... to be a multiple of 4 1ac0(00a4): 2f 58 bc 84 ' sub SP,BC ' decrement SP by rounded up size 1ac4(00a5): 33 ca be a0 ' mov t1,R0 ' source is in R0 1ac8(00a6): 2c cc be a0 ' mov t2,SP ' destination is SP 1acc(00a7): ad 00 7c 5c ' jmp #copy_longs ' do the copy 1ad0(00a8): ' copy_b 1ad0(00a8): 6c e5 fe 5c ' call #XMM_ReadBC ' load the byte count from the PC 1ad4(00a9): 03 5e fc 80 ' add BC,#3 ' round up BC ... 1ad8(00aa): 03 5e fc 64 ' andn BC,#3 ' ... to be a multiple of 4 1adc(00ab): 34 ca be a0 ' mov t1,R1 ' source is in R1 1ae0(00ac): 33 cc be a0 ' mov t2,R0 ' destination is in R0 1ae4(00ad): ' copy_longs 1ae4(00ad): 77 5e 7c ec ' tjz BC,#LMM_Loop ' no more to copy 1ae8(00ae): 65 cf be 08 ' rdlong t3,t1 ' small mode - src and dst ... 1aec(00af): 66 cf 3e 08 ' wrlong t3,t2 ' ... must both be Hub Addr 1af0(00b0): ' :copy_next 1af0(00b0): 04 ca fe 80 ' add t1,#4 ' increment source 1af4(00b1): 04 cc fe 80 ' add t2,#4 ' increment destination 1af8(00b2): 04 5e fc 84 ' sub BC,#4 ' decrement count ... 1afc(00b3): ad 00 7c 5c ' jmp #copy_longs ' ... and keep copying 1b00(00b4): ' new_fp 1b00(00b4): 04 58 fc 84 ' sub SP,#4 ' decrement the stack pointer 1b04(00b5): 2c 5a 3c 08 ' wrlong FP,SP ' save FP to stack 1b08(00b6): 2c 5a bc a0 ' mov FP,SP ' set up new FP 1b0c(00b7): 08 5e fc 80 ' add BC,#8 ' calculate what SP was ... 1b10(00b8): 2d 5e bc 80 ' add BC,FP ' ... before arguments were pushed 1b14(00b9): 77 00 7c 5c ' jmp #LMM_loop ' execute the next instruction 1b18(00ba): ' fp_ret 1b18(00ba): 2c 5a bc 08 ' rdlong FP,SP ' restore previous FP 1b1c(00bb): 04 58 fc 80 ' add SP,#4 ' increment the SP 1b20(00bc): ' f_ret 1b20(00bc): 2c 56 bc 08 ' rdlong PC,SP ' read the PC 1b24(00bd): 32 56 bc 84 ' sub PC,CS 1b28(00be): 08 58 fc 80 ' add SP,#8 ' increment the SP 1b2c(00bf): 77 00 7c 5c ' jmp #LMM_loop ' execute the next instruction 1b30(00c0): ' f_call 1b30(00c0): 6e e5 fe 5c ' call #XMM_ReadRI ' get the address to call 1b34(00c1): ' f_cali 1b34(00c1): 32 56 bc 80 ' add PC,CS ' correct for moved code segment 1b38(00c2): 08 58 fc 84 ' sub SP,#8 ' decrement the SP 1b3c(00c3): 2c 56 3c 08 ' wrlong PC,SP ' save current PC to stack 1b40(00c4): c6 00 7c 5c ' jmp #f_jmpi ' go to address in RI 1b44(00c5): ' f_jump 1b44(00c5): 6e e5 fe 5c ' call #XMM_ReadRI ' get the address to jump to 1b48(00c6): ' f_jmpi 1b48(00c6): 2e 56 bc a0 ' mov PC,RI ' get the address to jump to 1b4c(00c7): 32 56 bc 84 ' sub PC,CS ' correct for moved code segment 1b50(00c8): 77 00 7c 5c ' jmp #LMM_loop ' execute next instruction 1b54(00c9): ' f_d32s 1b54(00c9): 34 ce be a0 ' mov t3,r1 ' save sign for later 1b58(00ca): 33 d0 be a0 ' mov t4,r0 1b5c(00cb): 34 68 bc a8 ' abs r1,r1 1b60(00cc): 33 66 bc a8 ' abs r0,r0 1b64(00cd): 68 cf be 6c ' xor t3,t4 1b68(00ce): d5 ba fd 5c ' call #f_d32 ' perform unsigned division 1b6c(00cf): 68 d1 be a1 ' mov t4,t4 WC ' get bit #31 into carry 1b70(00d0): 34 68 bc b0 ' negc r1,r1 ' adjust the sign of the remainder 1b74(00d1): 67 cf be a1 ' mov t3,t3 WC ' get bit #31 into carry 1b78(00d2): 33 66 bc b0 ' negc r0,r0 ' adjust the sign of the result 1b7c(00d3): 77 00 7c 5c ' jmp #LMM_loop 1b80(00d4): 77 ba fd 50 ' f_d32u movs f_d32_ret,#LMM_loop ' set return to #LMM_loop & fall into div 1b84(00d5): ' f_d32 1b84(00d5): 20 ca fe a0 ' mov t1,#32 1b88(00d6): 00 cc fe a0 ' mov t2,#0 ' tmp2 is temp register to hold the remainder 1b8c(00d7): ' :loop 1b8c(00d7): 01 66 fc 2d ' shl r0,#1 WC 1b90(00d8): 01 cc fe 34 ' rcl t2,#1 1b94(00d9): 34 cc be e1 ' cmpsub t2,r1 WC 1b98(00da): 01 66 f0 80 ' if_c add r0,#1 1b9c(00db): d7 ca fe e4 ' djnz t1,#:loop 1ba0(00dc): 66 69 bc a0 ' mov r1,t2 ' set remainder 1ba4(00dd): ' f_d32_ret 1ba4(00dd): 00 00 7c 5c ' ret 1ba8(00de): ' f_m32 1ba8(00de): 00 ce fe a0 ' mov t3,#0 1bac(00df): ' :start 1bac(00df): 00 66 7c 86 ' cmp r0,#0 WZ 1bb0(00e0): e5 00 68 5c ' if_e jmp #:down3 1bb4(00e1): 01 66 fc 29 ' shr r0,#1 WC 1bb8(00e2): 34 ce b2 81 ' if_b add t3,r1 WC 1bbc(00e3): ' :down2 1bbc(00e3): 01 68 fc 2d ' shl r1,#1 WC 1bc0(00e4): df 00 7c 5c ' jmp #:start 1bc4(00e5): ' :down3 1bc4(00e5): 67 67 bc a0 ' mov r0,t3 1bc8(00e6): 77 00 7c 5c ' jmp #LMM_loop 1bcc(00e7): ' bra_z 1bcc(00e7): c5 00 68 5c ' if_z jmp #f_jump ' if condition true, branch is equiv to jump 1bd0(00e8): 76 00 7c 5c ' jmp #LMM_next ' increment PC, execute next instruction 1bd4(00e9): ' bra_nz 1bd4(00e9): c5 00 54 5c ' if_nz jmp #f_jump ' if condition true, branch is equiv to jump 1bd8(00ea): 76 00 7c 5c ' jmp #LMM_next ' increment PC, execute next instruction 1bdc(00eb): ' bra_ae 1bdc(00eb): c5 00 4c 5c ' if_ae jmp #f_jump ' if condition true, branch is equiv to jump 1be0(00ec): 76 00 7c 5c ' jmp #LMM_next ' increment PC, execute next instruction 1be4(00ed): ' bra_a 1be4(00ed): c5 00 44 5c ' if_a jmp #f_jump ' if condition true, branch is equiv to jump 1be8(00ee): 76 00 7c 5c ' jmp #LMM_next ' increment PC, execute next instruction 1bec(00ef): ' bra_be 1bec(00ef): c5 00 78 5c ' if_be jmp #f_jump ' if condition true, branch is equiv to jump 1bf0(00f0): 76 00 7c 5c ' jmp #LMM_next ' increment PC, execute next instruction 1bf4(00f1): ' bra_b 1bf4(00f1): c5 00 70 5c ' if_b jmp #f_jump ' if condition true, branch is equiv to jump 1bf8(00f2): 76 00 7c 5c ' jmp #LMM_next ' increment PC, execute next instruction 1bfc(00f3): ' plugin 1bfc(00f3): f5 48 fe 5c ' call #plugin2 ' plugin2 does all the work 1c00(00f4): 77 00 7c 5c ' jmp #LMM_loop 1c04(00f5): ' plugin2 1c04(00f5): 73 e9 fe 5c ' call #XMM_Tristate ' disable XMM while calling plugin 1c08(00f6): 08 d2 fe a0 ' mov ftemp,#8 ' ftemp stores lock - default to none required 1c0c(00f7): 36 66 bc a1 ' mov r0,r3 wc ' get plugin type or cog id or service id 1c10(00f8): 07 01 70 5c ' if_b jmp #psvc ' if < 0, code is a service id 1c14(00f9): 80 66 7c 62 ' test r0,#$80 wz ' if bit 7 set ... 1c18(00fa): 16 01 54 5c ' if_nz jmp #pcog ' code is a cog id ... 1c1c(00fb): ' ptype ' ... otherwize it's a plugin type 1c1c(00fb): f0 cb be a0 ' mov t1,par ' point to registry 1c20(00fc): 00 cc fe a0 ' mov t2,#0 ' start at cog id 0 1c24(00fd): ' plgt1 1c24(00fd): 08 cc 7e 87 ' cmp t2,#8 wc,wz ' run out of cogs? 1c28(00fe): 25 01 4c 5c ' if_ae jmp #plugerr ' yes - no such plugin 1c2c(00ff): 65 cf be 08 ' rdlong t3,t1 ' no - check cog's plugin type 1c30(0100): 18 ce fe 28 ' shr t3,#24 ' is it ... 1c34(0101): 33 ce 3e 86 ' cmp t3,r0 wz ' ... the plugin type what we wanted? 1c38(0102): 01 cc d6 80 ' if_nz add t2,#1 ' no - try ... 1c3c(0103): 04 ca d6 80 ' if_nz add t1,#4 ' ... next ... 1c40(0104): fd 00 54 5c ' if_nz jmp #plgt1 ' ... cog id 1c44(0105): ' plgt2 1c44(0105): 66 67 bc a0 ' mov r0,t2 ' use the cog where we found the plugin 1c48(0106): 16 01 7c 5c ' jmp #pcog ' invoke plugin (via the cog id) 1c4c(0107): ' psvc 1c4c(0107): 01 66 fc 2c ' shl r0,#1 ' read entry ... 1c50(0108): f0 67 bc 80 ' add r0,par ' ... from ... 1c54(0109): 33 66 bc 04 ' rdword r0,r0 ' ... the service registry 1c58(010a): 33 ca be a0 ' mov t1,r0 ' save in t1 and extract ... 1c5c(010b): 0c 66 fc 28 ' shr r0,#12 ' ... cog number to r0 1c60(010c): 65 cd be a0 ' mov t2,t1 ' save in t2 and extract ... 1c64(010d): 18 ca fe 2e ' shl t1,#24 wz ' ... request code to t1 (top 8 bits) ... 1c68(010e): 25 01 68 5c ' if_z jmp #plugerr ' ... or throw error if request code is zero 1c6c(010f): 66 d3 be a0 ' mov ftemp,t2 ' extract ... 1c70(0110): 08 d2 fe 28 ' shr ftemp,#8 ' ... lock number to ftemp 1c74(0111): 08 d2 7e 62 ' test ftemp,#8 wz ' are we required to use a lock? 1c78(0112): 15 01 54 5c ' if_nz jmp #no_lock ' no - just make the request 1c7c(0113): ' set_lock 1c7c(0113): 06 d2 7e 0d ' lockset ftemp wc ' yes - loop ... 1c80(0114): 13 01 70 5c ' if_c jmp #set_lock ' ... until we have set the lock 1c84(0115): ' no_lock 1c84(0115): 65 6b bc 68 ' or r2,t1 ' ... with request code 1c88(0116): ' pcog 1c88(0116): 07 66 fc 60 ' and r0,#7 ' mask off cog id to 0 .. 7 1c8c(0117): 02 66 fc 2c ' shl r0,#2 ' point to ... 1c90(0118): f0 67 bc 80 ' add r0,par ' ... registry entry for the cog 1c94(0119): 33 66 bc 08 ' rdlong r0,r0 ' get request block from registry 1c98(011a): 4f 66 3c 62 ' test r0,top8 wz ' is a plugin registered in this cog? 1c9c(011b): 25 01 68 5c ' if_z jmp #plugerr ' no - throw error 1ca0(011c): 33 6a 3c 08 ' wrlong r2,r0 ' ... request 1ca4(011d): ' ploop 1ca4(011d): 33 6c bc 0a ' rdlong r3,r0 wz ' wait till ... 1ca8(011e): 1d 01 54 5c ' if_nz jmp #ploop ' ... request completed 1cac(011f): 04 66 fc 80 ' add r0,#4 ' get ... 1cb0(0120): 33 66 bc 08 ' rdlong r0,r0 ' ... result 1cb4(0121): ' clr_lock 1cb4(0121): 08 d2 7e 62 ' test ftemp,#8 wz ' did we set a lock? 1cb8(0122): 07 d2 6a 0c ' if_z lockclr ftemp ' yes - clear the lock we set 1cbc(0123): 73 e9 fe 5c ' call #XMM_Activate ' re-enable XMM 1cc0(0124): ' plugin2_ret 1cc0(0124): 00 00 7c 5c ' ret 1cc4(0125): ' plugerr 1cc4(0125): 01 66 fc a4 ' neg r0,#1 ' plugin error (e.g. not registered) 1cc8(0126): 21 01 7c 5c ' jmp #clr_lock ' done - clear lock if required 1ccc(0127): ' rd_long 1ccc(0127): 04 ea fc a0 ' mov XMM_Len,#4 1cd0(0128): 2c 01 7c 5c ' jmp #rd_mult 1cd4(0129): ' rd_word 1cd4(0129): 02 ea fc a0 ' mov XMM_Len,#2 1cd8(012a): 2c 01 7c 5c ' jmp #rd_mult 1cdc(012b): ' rd_byte 1cdc(012b): 01 ea fc a0 ' mov XMM_Len,#1 1ce0(012c): ' rd_mult 1ce0(012c): 2e e6 bc a0 ' mov XMM_Addr,RI ' address is in RI 1ce4(012d): 32 e6 bc 84 ' sub XMM_Addr,CS ' correct XMM address 1ce8(012e): 2f 0c ff 54 ' movd XMM_Dst,#BC ' dest register is BC 1cec(012f): 89 27 ff 5c ' call #XMM_ReadMult ' read the bytes 1cf0(0130): 77 00 7c 5c ' jmp #LMM_Loop 1cf4(0131): ' wr_long 1cf4(0131): 04 ea fc a0 ' mov XMM_Len,#4 1cf8(0132): 36 01 7c 5c ' jmp #wr_mult 1cfc(0133): ' wr_word 1cfc(0133): 02 ea fc a0 ' mov XMM_Len,#2 1d00(0134): 36 01 7c 5c ' jmp #wr_mult 1d04(0135): ' wr_byte 1d04(0135): 01 ea fc a0 ' mov XMM_Len,#1 1d08(0136): ' wr_mult 1d08(0136): 2e e6 bc a0 ' mov XMM_Addr,RI ' address is in RI 1d0c(0137): 32 e6 bc 84 ' sub XMM_Addr,CS ' correct XMM address 1d10(0138): 2f 4a ff 50 ' movs XMM_Src,#BC ' source register is BC 1d14(0139): a6 79 ff 5c ' call #XMM_WriteMult ' write the bytes 1d18(013a): 77 00 7c 5c ' jmp #LMM_Loop 1d1c(013b): ' flt_add 1d1c(013b): 01 ca fe a4 ' neg t1,#Common#SVC_FLOAT_ADD 1d20(013c): 46 01 7c 5c ' jmp #fp_service 1d24(013d): ' flt_sub 1d24(013d): 02 ca fe a4 ' neg t1,#Common#SVC_FLOAT_SUB 1d28(013e): 46 01 7c 5c ' jmp #fp_service 1d2c(013f): ' flt_mul 1d2c(013f): 03 ca fe a4 ' neg t1,#Common#SVC_FLOAT_MUL 1d30(0140): 46 01 7c 5c ' jmp #fp_service 1d34(0141): ' flt_div 1d34(0141): 04 ca fe a4 ' neg t1,#Common#SVC_FLOAT_DIV 1d38(0142): 46 01 7c 5c ' jmp #fp_service 1d3c(0143): ' flt_int 1d3c(0143): 05 ca fe a4 ' neg t1,#Common#SVC_FLOAT_FLOAT 1d40(0144): 46 01 7c 5c ' jmp #fp_service 1d44(0145): ' int_flt 1d44(0145): 06 ca fe a4 ' neg t1,#Common#SVC_FLOAT_TRUNC 1d48(0146): ' fp_service 1d48(0146): 35 d4 be a0 ' mov ftmp2,r2 ' save r2 1d4c(0147): 36 d6 be a0 ' mov ftmp3,r3 ' save r3 1d50(0148): 65 6d bc a0 ' mov r3,t1 ' r3 = code of service to request 1d54(0149): 64 6b bc a0 ' mov r2,xfer ' r2 = data is address of xfer block 1d58(014a): 64 cb be a0 ' mov t1,xfer ' write ... 1d5c(014b): 65 67 3c 08 ' wrlong r0,t1 ' ... first argument to xfer block 1d60(014c): 04 ca fe 80 ' add t1,#4 ' write ... 1d64(014d): 65 69 3c 08 ' wrlong r1,t1 ' ... second argument to xfer block 1d68(014e): f5 48 fe 5c ' call #plugin2 ' request the service 1d6c(014f): 6a 6b bc a0 ' mov r2,ftmp2 ' restore r2 1d70(0150): 6b 6d bc a0 ' mov r3,ftmp3 ' restore r3 1d74(0151): 00 66 7c c3 ' cmps r0,#0 wz,wc ' set C & Z flags according to result 1d78(0152): 77 00 7c 5c ' jmp #LMM_loop 1d7c(0153): ' flt_cmp 1d7c(0153): 33 ca be a0 ' _FCmp mov t1, r0 ' compare signs 1d80(0154): 34 ca be 6c ' xor t1, r1 1d84(0155): 4b ca be 62 ' and t1, Bit31 wz 1d88(0156): 5d 01 68 5c ' if_z jmp #:cmp1 ' same, then compare magnitude 1d8c(0157): 33 ca be a0 ' mov t1, r0 ' check for +0 or -0 1d90(0158): 34 ca be 68 ' or t1, r1 1d94(0159): 4b ca be 67 ' andn t1, Bit31 wz,wc 1d98(015a): 77 00 68 5c ' if_z jmp #LMM_Loop 1d9c(015b): 4b 66 3c 61 ' test r0, Bit31 wc ' compare signs 1da0(015c): 77 00 7c 5c ' jmp #LMM_Loop 1da4(015d): 4b 66 3c 62 ' :cmp1 test r0, Bit31 wz ' check signs 1da8(015e): 61 01 54 5c ' if_nz jmp #:cmp2 1dac(015f): 34 66 3c 87 ' cmp r0, r1 wz,wc 1db0(0160): 77 00 7c 5c ' jmp #LMM_Loop 1db4(0161): 33 68 3c 87 ' :cmp2 cmp r1, r0 wz,wc ' reverse test if negative 1db8(0162): 77 00 7c 5c ' jmp #LMM_Loop 1dbc(0163): 00 02 00 00 ' dlsb long 1 << 9 1dc0(0164): 00 00 00 00 ' xfer long $0 ' set up during initialization 1dc4(0165): 00 00 00 00 ' t1 long $0 1dc8(0166): 00 00 00 00 ' t2 long $0 1dcc(0167): 00 00 00 00 ' t3 long $0 1dd0(0168): 00 00 00 00 ' t4 long $0 1dd4(0169): 00 00 00 00 ' ftemp long $0 1dd8(016a): 00 00 00 00 ' ftmp2 long $0 1ddc(016b): 00 00 00 00 ' ftmp3 long $0 1de0(016c): ' XMM_ReadBC 1de0(016c): 2f 0c ff 54 ' movd XMM_Dst,#BC ' dest register is BC 1de4(016d): 6f 01 7c 5c ' jmp #XMM_ReadInstr ' 1de8(016e): ' XMM_ReadRI 1de8(016e): 2e 0c ff 54 ' movd XMM_Dst,#RI ' dest register is RI 1dec(016f): ' XMM_ReadInstr 1dec(016f): 2b e6 bc a0 ' mov XMM_Addr,PC ' source address is PC 1df0(0170): 75 11 ff 5c ' call #XMM_ReadLong ' read the instuction 1df4(0171): 04 56 fc 80 ' add PC,#4 ' increment the PC 1df8(0172): ' XMM_ReadInstr_ret 1df8(0172): ' XMM_ReadRI_ret 1df8(0172): ' XMM_ReadBC_ret 1df8(0172): 00 00 7c 5c ' ret 1dfc(0173): ' XMM_Activate 1dfc(0173): ' XMM_Tristate 1dfc(0173): 00 00 00 00 ' nop ' nothing (TBD!) 1e00(0174): ' XMM_Activate_ret 1e00(0174): ' XMM_Tristate_ret 1e00(0174): 00 00 7c 5c ' ret 1e04(0175): ' XMM_ReadLong 1e04(0175): 73 9a bf a0 ' mov XMM_Tmp1,XMM_Addr ' get the address to read 1e08(0176): 73 9c bf a0 ' mov XMM_Tmp2,XMM_Addr ' same page ... 1e0c(0177): d7 9d bf 64 ' andn XMM_Tmp2,XMM_Msk ' ... as last ... 1e10(0178): d4 9d bf 84 ' sub XMM_Tmp2,XMM_Last ' ... read/written? 1e14(0179): 80 9d 7f ec ' tjz XMM_Tmp2,#:ReadLong_Line ' yes - already in Hub 1e18(017a): 03 9a ff 64 ' andn XMM_Tmp1,#Common#CACHE_CMD_MASK ' no set command ... 1e1c(017b): 03 9a ff 68 ' or XMM_Tmp1,#Common#CACHE_READ_CMD ' ... to READ 1e20(017c): d5 9b 3f 08 ' wrlong XMM_Tmp1,XMM_Cmd ' issue the command 1e24(017d): ' :ReadLong_Wait 1e24(017d): d5 9b bf 08 ' rdlong XMM_Tmp1,XMM_Cmd ' wait till ... 1e28(017e): 7d 9b 7f e8 ' tjnz XMM_Tmp1,#:ReadLong_Wait ' ... command completes 1e2c(017f): d6 a7 bf 08 ' rdlong XMM_Line,XMM_Rsp ' get cache line address 1e30(0180): ' :ReadLong_Line 1e30(0180): 73 a8 bf a0 ' mov XMM_Last,XMM_Addr ' save page ... 1e34(0181): d7 a9 bf 64 ' andn XMM_Last,XMM_Msk ' ... as last read 1e38(0182): d3 9b bf a0 ' mov XMM_Tmp1,XMM_Line ' get the last line address 1e3c(0183): 73 9c bf a0 ' mov XMM_Tmp2,XMM_Addr ' calculate ... 1e40(0184): d7 9d bf 60 ' and XMM_Tmp2,XMM_Msk ' ... the address ... 1e44(0185): ce 9b bf 80 ' add XMM_Tmp1,XMM_Tmp2 ' ... within the line 1e48(0186): cd 01 bc 08 ' XMM_Dst rdlong 0-0,XMM_Tmp1 ' read long from address to dst 1e4c(0187): 04 e6 fc 80 ' add XMM_Addr,#4 ' update XMM_Addr 1e50(0188): ' XMM_ReadLong_ret 1e50(0188): 00 00 7c 5c ' ret 1e54(0189): ' XMM_ReadMult 1e54(0189): 86 9b bf a0 ' mov XMM_Tmp1,XMM_Dst ' get ... 1e58(018a): 09 9a ff 28 ' shr XMM_Tmp1,#9 ' ... dst register ... 1e5c(018b): cd 23 bf 54 ' movd XMM_Dst2,XMM_Tmp1 ' set as reg to be shifted ... 1e60(018c): 75 11 ff 5c ' call #XMM_ReadLong ' read long containing bytes 1e64(018d): 04 e6 fc 84 ' sub XMM_Addr,#4 ' correct XMM_Addr 1e68(018e): 73 9a bf a0 ' mov XMM_Tmp1,XMM_Addr ' calculate ... 1e6c(018f): 03 9a ff 60 ' and XMM_Tmp1,#Common#CACHE_CMD_MASK ' ... offset of bytes 1e70(0190): 03 9a ff 2c ' shl XMM_Tmp1,#3 ' convert to no of bits to shift 1e74(0191): cd 01 bc 28 ' XMM_Dst2 shr 0-0,XMM_Tmp1 ' put bytes in correct place 1e78(0192): 75 e6 bc 80 ' add XMM_Addr,XMM_Len ' update XMM_Addr 1e7c(0193): ' XMM_ReadMult_ret 1e7c(0193): 00 00 7c 5c ' ret 1e80(0194): ' XMM_WriteLong 1e80(0194): a5 45 bf 54 ' movd XMM_Src1,XMM_Src ' set src reg as dst reg for hub write 1e84(0195): 73 9a bf a0 ' mov XMM_Tmp1,XMM_Addr ' get the address to write 1e88(0196): 73 a8 bf a0 ' mov XMM_Last,XMM_Addr ' save page ... 1e8c(0197): d7 a9 bf 64 ' andn XMM_Last,XMM_Msk ' ... as last read/written 1e90(0198): 03 9a ff 64 ' andn XMM_Tmp1,#Common#CACHE_CMD_MASK ' set command ... 1e94(0199): 02 9a ff 68 ' or XMM_Tmp1,#Common#CACHE_WRITE_CMD ' ... to WRITE 1e98(019a): d5 9b 3f 08 ' wrlong XMM_Tmp1,XMM_CMD ' issue the command 1e9c(019b): ' :WriteLong_Wait 1e9c(019b): d5 9b bf 08 ' rdlong XMM_Tmp1,XMM_Cmd ' wait till ... 1ea0(019c): 9b 9b 7f e8 ' tjnz XMM_Tmp1,#:WriteLong_Wait ' ... command completes 1ea4(019d): d6 a7 bf 08 ' rdlong XMM_Line,XMM_Rsp ' get response (cache line address) 1ea8(019e): d3 9b bf a0 ' mov XMM_Tmp1,XMM_Line 1eac(019f): 73 9c bf a0 ' mov XMM_Tmp2,XMM_Addr ' calculate ... 1eb0(01a0): d7 9d bf 60 ' and XMM_Tmp2,XMM_Msk ' ... the ... 1eb4(01a1): ce 9b bf 80 ' add XMM_Tmp1,XMM_Tmp2 ' ... address 1eb8(01a2): cd 01 3c 08 ' XMM_Src1 wrlong 0-0,XMM_Tmp1 ' write src register to that address 1ebc(01a3): 04 e6 fc 80 ' add XMM_Addr,#4 ' update XMM_Addr 1ec0(01a4): ' XMM_WriteLong_ret 1ec0(01a4): 00 00 7c 5c ' ret 1ec4(01a5): 00 00 00 00 ' XMM_Src long 0 ' temp storage of src register 1ec8(01a6): ' XMM_WriteMult 1ec8(01a6): d0 0d ff 54 ' movd XMM_Dst,#XMM_Tmp4 ' read the long ... 1ecc(01a7): 75 11 ff 5c ' call #XMM_ReadLong ' ... containing the bytes we want 1ed0(01a8): 04 e6 fc 84 ' sub XMM_Addr,#4 ' correct XMM_Addr 1ed4(01a9): a5 6b bf 54 ' movd XMM_Src2,XMM_Src ' set src reg as dst to mask ... 1ed8(01aa): a5 6d bf 50 ' movs XMM_Src3,XMM_Src ' ... and as src to include 1edc(01ab): 73 9c bf a0 ' mov XMM_Tmp2,XMM_Addr ' calculate ... 1ee0(01ac): 03 9c ff 60 ' and XMM_Tmp2,#Common#CACHE_CMD_MASK ' ... offset of bytes we want 1ee4(01ad): 03 9c ff 2c ' shl XMM_Tmp2,#3 ' convert to number of bits to shift 1ee8(01ae): 75 9a bf a0 ' mov XMM_Tmp1,XMM_Len ' calculate mask ... 1eec(01af): 02 9a ff 2c ' shl XMM_Tmp1,#2 ' ... for the bytes we must replace 1ef0(01b0): 01 9e ff a4 ' neg XMM_Tmp3,#1 ' set up ... 1ef4(01b1): cd 9f bf 2c ' shl XMM_Tmp3,XMM_Tmp1 ' ... the mask ... 1ef8(01b2): cd 9f bf 2c ' shl XMM_Tmp3,XMM_Tmp1 ' ... we need (avoid shifting by 32!) 1efc(01b3): ce a1 bf 20 ' ror XMM_Tmp4,XMM_Tmp2 ' move bytes to be replaced to LS bytes 1f00(01b4): cf a1 bf 60 ' and XMM_Tmp4,XMM_Tmp3 ' mask out bytes to be replaced 1f04(01b5): cf 01 bc 64 ' XMM_Src2 andn 0-0,XMM_Tmp3 ' or in ... 1f08(01b6): 00 a0 bf 68 ' XMM_Src3 or XMM_Tmp4,0-0 ' ... replacement bytes 1f0c(01b7): ce a1 bf 24 ' rol XMM_Tmp4,XMM_Tmp2 ' put bytes back to correct place 1f10(01b8): d0 4b ff 50 ' movs XMM_Src,#XMM_Tmp4 ' write the long ... 1f14(01b9): 94 49 ff 5c ' call #XMM_WriteLong ' ... containing the replaced bytes 1f18(01ba): 04 e6 fc 84 ' sub XMM_Addr,#4 ' correct XMM_Addr 1f1c(01bb): 75 e6 bc 80 ' add XMM_Addr,XMM_Len ' update XMM_Addr 1f20(01bc): ' XMM_WriteMult_ret 1f20(01bc): 00 00 7c 5c ' ret 1f24(01bd): ' XMM_WritePage 1f24(01bd): 75 a4 bf a0 ' mov XMM_Tmp6,XMM_Len ' save length 1f28(01be): 01 ea fc a0 ' mov XMM_Len,#1 ' we write one byte at a time 1f2c(01bf): ' :WriteLoop 1f2c(01bf): 74 a2 bf 00 ' rdbyte XMM_Tmp5,Hub_Addr ' read byte from source (Hub) 1f30(01c0): 01 e8 fc 80 ' add Hub_Addr,#1 ' inc source address 1f34(01c1): d1 4b ff 50 ' movs XMM_Src,#XMM_Tmp5 ' use this as temp byte 1f38(01c2): a6 79 ff 5c ' call #XMM_WriteMult ' write byte to sram 1f3c(01c3): bf a5 ff e4 ' djnz XMM_Tmp6,#:WriteLoop ' repeat till all bytes written 1f40(01c4): ' XMM_WritePage_ret 1f40(01c4): 00 00 7c 5c ' ret 1f44(01c5): ' XMM_ReadPage 1f44(01c5): 75 a4 bf a0 ' mov XMM_Tmp6,XMM_Len ' save length 1f48(01c6): 01 ea fc a0 ' mov XMM_Len,#1 ' we read one byte at a time 1f4c(01c7): ' :ReadLoop 1f4c(01c7): d1 0d ff 54 ' movd XMM_Dst,#XMM_Tmp5 ' use this as temp byte 1f50(01c8): 89 27 ff 5c ' call #XMM_ReadMult ' read byte from sram 1f54(01c9): 74 a2 3f 00 ' wrbyte XMM_Tmp5,Hub_Addr ' write byte to destination (Hub) 1f58(01ca): 01 e8 fc 80 ' add Hub_Addr,#1 ' inc dest address 1f5c(01cb): c7 a5 ff e4 ' djnz XMM_Tmp6,#:ReadLoop ' repeat till all bytes read 1f60(01cc): ' XMM_ReadPage_ret 1f60(01cc): 00 00 7c 5c ' ret 1f64(01cd): 00 00 00 00 ' XMM_Tmp1 long $0 1f68(01ce): 00 00 00 00 ' XMM_Tmp2 long $0 1f6c(01cf): 00 00 00 00 ' XMM_Tmp3 long $0 1f70(01d0): 00 00 00 00 ' XMM_Tmp4 long $0 1f74(01d1): 00 00 00 00 ' XMM_Tmp5 long $0 1f78(01d2): 00 00 00 00 ' XMM_Tmp6 long $0 1f7c(01d3): 00 00 00 00 ' XMM_Line long $0 1f80(01d4): 00 00 00 00 ' XMM_Last long $0 1f84(01d5): f0 7f 00 00 ' XMM_Cmd long Common#XMM_CACHE_CMD 1f88(01d6): f4 7f 00 00 ' XMM_Rsp long Common#XMM_CACHE_RSP 1f8c(01d7): 0f 00 00 00 ' XMM_Msk long Common#CACHE_LINE_MASK 1f90(01d8): ' fit $1f0 ' max size '****************************************************************************** ' Catalina_Common.spin '****************************************************************************** '=============================== Object Header ================================ '================================ DAT Section ================================= '****************************************************************************** ' Catalina_HUB_XMM_Loader.spin '****************************************************************************** '=============================== Object Header ================================ 1fa0: 38 04 03 01 ' 1080 bytes, 3-1 methods, 1 object pointers 1fa4: f4 03 10 00 ' METHOD 1fa4: f4 03 10 00 ' METHOD 1fa8: 16 04 10 00 ' OBJECT Catalina_Common.spin '================================ DAT Section ================================= 1fb0(0000): ' org 0 1fb0(0000): ' entry 1fb0(0000): f0 01 bd a0 ' mov r0,par ' point to parameters 1fb4(0001): 80 08 bd 08 ' rdlong reg_addr,r0 ' get address of Registry 1fb8(0002): 04 00 fd 80 ' add r0,#4 1fbc(0003): 80 0a bd 08 ' rdlong stack_addr,r0 ' get address of top of stack 1fc0(0004): 04 00 fd 80 ' add r0,#4 1fc4(0005): 80 0c bd 08 ' rdlong entry_addr,r0 ' get kernel entry address 1fc8(0006): 04 00 fd 80 ' add r0,#4 1fcc(0007): 80 06 bd 08 ' rdlong page_addr,r0 ' get address of page buffer 1fd0(0008): 91 24 fd 5c ' call #XMM_Activate 1fd4(0009): 79 fe fc 5c ' call #ClearPage ' ensure page buffer is empty 1fd8(000a): 18 ec fd a0 ' mov XMM_Addr,#INIT_BZ_OFF ' point to initial BZ 1fdc(000b): 83 ee bd a0 ' mov Hub_Addr,page_addr ' read ... 1fe0(000c): 00 f1 fd a0 ' mov XMM_Len,#PAGE_SIZE ' ... prologue ... 1fe4(000d): e3 d4 fd 5c ' call #XMM_ReadPage ' ... from ... 1fe8(000e): 83 00 bd a0 ' mov r0,page_addr ' ... initial BZ 1fec(000f): 80 0e bd 08 ' rdlong Init_BZ,r0 ' retrieve ... 1ff0(0010): 08 00 fd 80 ' add r0,#(LAYOUT_OFF - INIT_BZ_OFF) ' 1ff4(0011): 80 10 bd 08 ' rdlong layout,r0 ' 1ff8(0012): 14 00 fd 80 ' add r0,#(ENDS_OFF - LAYOUT_OFF) ' 1ffc(0013): 80 18 bd 08 ' rdlong ends_addr,r0 ' 2000(0014): 04 00 fd 80 ' add r0,#(ROBA_OFF - ENDS_OFF) ' 2004(0015): 80 12 bd 08 ' rdlong ro_base,r0 ' 2008(0016): 04 00 fd 80 ' add r0,#(RWBA_OFF - ROBA_OFF) ' 200c(0017): 80 14 bd 08 ' rdlong rw_base,r0 ' 2010(0018): 08 00 fd 80 ' add r0,#(RWEN_OFF - RWBA_OFF) ' 2014(0019): 80 16 bd 08 ' rdlong rw_ends,r0 ' ... prologue data 2018(001a): 90 1e bd a0 ' mov byte_count,kernel_size 201c(001b): 86 1a bd a0 ' mov src_addr,entry_addr 2020(001c): 8c 1c bd a0 ' mov dst_addr,ends_addr 2024(001d): 10 1c fd 80 ' add dst_addr,#$10 2028(001e): 05 10 7d 86 ' cmp layout,#5 wz ' for layout 5, correct ... 202c(001f): 57 1c a9 84 ' if_z sub dst_addr,l5size ' ... for bytes removed 2030(0020): 5f c8 fc 5c ' call #Copy_RAM_To_XMM 2034(0021): 58 1e bd a0 ' mov byte_count,pr_size ' size of prologue 2038(0022): 10 1e fd 84 ' sub byte_count,#$10 203c(0023): 10 1a fd a0 ' mov src_addr,#$10 2040(0024): 10 1c fd a0 ' mov dst_addr,#$10 2044(0025): 59 bc fc 5c ' call #Copy_XMM_To_RAM 2048(0026): 05 10 7d 86 ' cmp layout,#5 wz ' if layout 5 ... 204c(0027): 30 00 68 5c ' if_z jmp #reloc_xmm ' ... relocate XMM segments 2050(0028): 02 10 7d 86 ' cmp layout,#2 wz ' if not layout 2 ... 2054(0029): 56 00 54 5c ' if_nz jmp #cannot_load ' ... cannot load 2058(002a): ' reloc_rw 2058(002a): 8b 1e bd a0 ' mov byte_count,rw_ends ' calculate size ... 205c(002b): 8a 1e bd 84 ' sub byte_count,rw_base ' ... of rw segments 2060(002c): 8a 1a bd a0 ' mov src_addr,rw_base ' move rw segments ... 2064(002d): 8a 1c bd a0 ' mov dst_addr,rw_base ' ... from XMM ... 2068(002e): 10 1a fd 80 ' add src_addr,#$10 ' ... correcting src addr 206c(002f): 59 bc fc 5c ' call #Copy_XMM_To_RAM 2070(0030): ' reloc_xmm 2070(0030): 89 1a bd a0 ' mov src_addr,ro_base ' XMM resident segments ... 2074(0031): 10 1a fd 80 ' add src_addr,#$10 ' ... are moved to ... 2078(0032): 00 1c fd a0 ' mov dst_addr,#$0 ' ... offset 0 207c(0033): 05 10 7d 86 ' cmp layout,#5 wz ' for layout 5 correct ... 2080(0034): 57 1a a9 84 ' if_z sub src_addr,l5size ' ... for bytes removed ... 2084(0035): 8c 1e bd a0 ' mov byte_count,ends_addr ' calculate size ... 2088(0036): 89 1e bd 84 ' sub byte_count,ro_base ' ... of all XMM segments 208c(0037): 6c ee fc 5c ' call #Copy_XMM_To_XMM 2090(0038): 90 1e bd a0 ' mov byte_count,kernel_size 2094(0039): 8c 1a bd a0 ' mov src_addr,ends_addr 2098(003a): 10 1a fd 80 ' add src_addr,#$10 209c(003b): 05 10 7d 86 ' cmp layout,#5 wz ' for layout 5 correct ... 20a0(003c): 57 1a a9 84 ' if_z sub src_addr,l5size ' ... for bytes removed ... 20a4(003d): 48 1c e9 a0 ' if_z mov dst_addr,#TABLE_END ' ... and copy after seg table 20a8(003e): 87 1c 95 a0 ' if_nz mov dst_addr,Init_BZ ' for other layouts ... 20ac(003f): 10 1c d5 80 ' if_nz add dst_addr,#$10 ' ... copy to Init_BZ (+$0010) 20b0(0040): 59 bc fc 5c ' call #Copy_XMM_To_RAM 20b4(0041): 01 00 fd 0c ' cogid r0 ' convert ... 20b8(0042): 02 00 fd 2c ' shl r0,#2 ' ... my cog id ... 20bc(0043): 84 00 bd 80 ' add r0,reg_addr ' ... to my registration addr 20c0(0044): 80 04 bd 08 ' rdlong r2,r0 ' get my request block addr 20c4(0045): 04 04 fd 80 ' add r2,#4 20c8(0046): 82 0a 3d 08 ' wrlong stack_addr,r2 20cc(0047): 04 04 fd 84 ' sub r2,#4 20d0(0048): 10 02 fd a0 ' mov r1,#$10 ' initial BA is always $10 20d4(0049): 82 02 3d 08 ' wrlong r1,r2 20d8(004a): 01 00 fd 0c ' cogid r0 ' set the cog id 20dc(004b): 05 10 7d 86 ' cmp layout,#5 wz ' for layout 5 ... 20e0(004c): 48 02 e9 a0 ' if_z mov r1,#TABLE_END ' ... kernel is after seg table 20e4(004d): 87 02 95 a0 ' if_nz mov r1,Init_BZ ' for other layouts ... 20e8(004e): 10 02 d5 80 ' if_nz add r1,#$10 ' ... it is at Init_BZ (+$0010) 20ec(004f): 02 02 fd 2c ' shl r1,#2 20f0(0050): 81 00 bd 68 ' or r0,r1 ' set the code address 20f4(0051): 84 02 bd a0 ' mov r1,reg_addr 20f8(0052): 10 02 fd 2c ' shl r1,#16 20fc(0053): 81 00 bd 68 ' or r0,r1 ' set the par address 2100(0054): 91 24 fd 5c ' call #XMM_Tristate 2104(0055): 02 00 7d 0c ' coginit r0 2108(0056): ' cannot_load 2108(0056): 56 00 7c 5c ' jmp #cannot_load 210c(0057): 00 7e 00 00 ' l5size long $8000 - SECTOR_SIZE ' this many bytes removed 2110(0058): 00 02 00 00 ' pr_size long SECTOR_SIZE ' size of prologue 2114(0059): ' Copy_XMM_To_RAM 2114(0059): 5e 1e 7d ec ' tjz byte_count,#Copy_XMM_To_RAM_ret 2118(005a): 8d ec bd a0 ' mov XMM_Addr,src_addr 211c(005b): 8e ee bd a0 ' mov Hub_Addr,dst_addr 2120(005c): 8f f0 bd a0 ' mov XMM_Len,byte_count 2124(005d): e3 d4 fd 5c ' call #XMM_ReadPage 2128(005e): ' Copy_XMM_To_RAM_ret 2128(005e): 00 00 7c 5c ' ret 212c(005f): ' Copy_RAM_To_XMM 212c(005f): 64 1e 7d ec ' tjz byte_count,#Copy_RAM_To_XMM_ret 2130(0060): 8e ec bd a0 ' mov XMM_Addr,dst_addr 2134(0061): 8d ee bd a0 ' mov Hub_Addr,src_addr 2138(0062): 8f f0 bd a0 ' mov XMM_Len,byte_count 213c(0063): db c4 fd 5c ' call #XMM_WritePage 2140(0064): ' Copy_RAM_To_XMM_ret 2140(0064): 00 00 7c 5c ' ret 2144(0065): ' Copy_RAM_To_RAM 2144(0065): 6b 1e 7d ec ' tjz byte_count,#Copy_RAM_To_RAM_ret 2148(0066): ' :Copy_loop 2148(0066): 8d 00 bd 00 ' rdbyte r0,src_addr 214c(0067): 8e 00 3d 00 ' wrbyte r0,dst_addr 2150(0068): 01 1a fd 80 ' add src_addr,#1 2154(0069): 01 1c fd 80 ' add dst_addr,#1 2158(006a): 66 1e fd e4 ' djnz byte_count,#:Copy_loop 215c(006b): ' Copy_RAM_To_RAM_ret 215c(006b): 00 00 7c 5c ' ret 2160(006c): ' Copy_XMM_To_XMM 2160(006c): 77 1e 7d ec ' tjz byte_count,#Copy_XMM_To_XMM_ret 2164(006d): 78 48 fd 54 ' movd XMM_Dst,#XMM_XMM_Tmp 2168(006e): 78 86 fd 50 ' movs XMM_Src,#XMM_XMM_Tmp 216c(006f): ' :Copy_loop 216c(006f): 8d ec bd a0 ' mov XMM_Addr,src_addr 2170(0070): 93 4c fd 5c ' call #XMM_ReadLong 2174(0071): 8e ec bd a0 ' mov XMM_Addr,dst_addr 2178(0072): b2 84 fd 5c ' call #XMM_WriteLong 217c(0073): 04 1a fd 80 ' add src_addr,#4 2180(0074): 04 1c fd 80 ' add dst_addr,#4 2184(0075): 04 1e fd 86 ' sub byte_count,#4 wz 2188(0076): 6f 00 54 5c ' if_nz jmp #:Copy_loop 218c(0077): ' Copy_XMM_To_XMM_ret 218c(0077): 00 00 7c 5c ' ret 2190(0078): 00 00 00 00 ' XMM_XMM_Tmp long 0 2194(0079): ' ClearPage 2194(0079): 00 00 fd a0 ' mov r0,#0 2198(007a): 00 03 fd a0 ' mov r1,#PAGE_SIZE 219c(007b): 83 04 bd a0 ' mov r2,page_addr 21a0(007c): ' :ClearPage_loop 21a0(007c): 82 00 3d 00 ' wrbyte r0,r2 21a4(007d): 01 04 fd 80 ' add r2,#1 21a8(007e): 7c 02 fd e4 ' djnz r1,#:ClearPage_loop 21ac(007f): ' ClearPage_ret 21ac(007f): 00 00 7c 5c ' ret 21b0(0080): 00 00 00 00 ' r0 long $0 21b4(0081): 00 00 00 00 ' r1 long $0 21b8(0082): 00 00 00 00 ' r2 long $0 21bc(0083): 00 00 00 00 ' page_addr long $0 21c0(0084): 00 00 00 00 ' reg_addr long $0 21c4(0085): 00 00 00 00 ' stack_addr long $0 21c8(0086): 00 00 00 00 ' entry_addr long $0 21cc(0087): 00 00 00 00 ' Init_BZ long $0 21d0(0088): 00 00 00 00 ' layout long $0 21d4(0089): 00 00 00 00 ' ro_base long $0 21d8(008a): 00 00 00 00 ' rw_base long $0 21dc(008b): 00 00 00 00 ' rw_ends long $0 21e0(008c): 00 00 00 00 ' ends_addr long $0 21e4(008d): 00 00 00 00 ' src_addr long $0 21e8(008e): 00 00 00 00 ' dst_addr long $0 21ec(008f): 00 00 00 00 ' byte_count long $0 21f0(0090): c0 07 00 00 ' kernel_size long MAX_KERNEL_LONGS*4 ' (max) kernel size in bytes 21f4(0091): ' XMM_Activate 21f4(0091): ' XMM_Tristate 21f4(0091): 00 00 00 00 ' nop ' nothing (TBD!) 21f8(0092): ' XMM_Activate_ret 21f8(0092): ' XMM_Tristate_ret 21f8(0092): 00 00 7c 5c ' ret 21fc(0093): ' XMM_ReadLong 21fc(0093): f6 d6 bd a0 ' mov XMM_Tmp1,XMM_Addr ' get the address to read 2200(0094): f6 d8 bd a0 ' mov XMM_Tmp2,XMM_Addr ' same page ... 2204(0095): f5 d8 bd 64 ' andn XMM_Tmp2,XMM_Msk ' ... as last ... 2208(0096): f2 d8 bd 84 ' sub XMM_Tmp2,XMM_Last ' ... read/written? 220c(0097): 9e d8 7d ec ' tjz XMM_Tmp2,#:ReadLong_Line ' yes - already in Hub 2210(0098): 03 d6 fd 64 ' andn XMM_Tmp1,#Common#CACHE_CMD_MASK ' no set command ... 2214(0099): 03 d6 fd 68 ' or XMM_Tmp1,#Common#CACHE_READ_CMD ' ... to READ 2218(009a): f3 d6 3d 08 ' wrlong XMM_Tmp1,XMM_Cmd ' issue the command 221c(009b): ' :ReadLong_Wait 221c(009b): f3 d6 bd 08 ' rdlong XMM_Tmp1,XMM_Cmd ' wait till ... 2220(009c): 9b d6 7d e8 ' tjnz XMM_Tmp1,#:ReadLong_Wait ' ... command completes 2224(009d): f4 e2 bd 08 ' rdlong XMM_Line,XMM_Rsp ' get cache line address 2228(009e): ' :ReadLong_Line 2228(009e): f6 e4 bd a0 ' mov XMM_Last,XMM_Addr ' save page ... 222c(009f): f5 e4 bd 64 ' andn XMM_Last,XMM_Msk ' ... as last read 2230(00a0): f1 d6 bd a0 ' mov XMM_Tmp1,XMM_Line ' get the last line address 2234(00a1): f6 d8 bd a0 ' mov XMM_Tmp2,XMM_Addr ' calculate ... 2238(00a2): f5 d8 bd 60 ' and XMM_Tmp2,XMM_Msk ' ... the address ... 223c(00a3): ec d6 bd 80 ' add XMM_Tmp1,XMM_Tmp2 ' ... within the line 2240(00a4): eb 00 bc 08 ' XMM_Dst rdlong 0-0,XMM_Tmp1 ' read long from address to dst 2244(00a5): 04 ec fd 80 ' add XMM_Addr,#4 ' update XMM_Addr 2248(00a6): ' XMM_ReadLong_ret 2248(00a6): 00 00 7c 5c ' ret 224c(00a7): ' XMM_ReadMult 224c(00a7): a4 d6 bd a0 ' mov XMM_Tmp1,XMM_Dst ' get ... 2250(00a8): 09 d6 fd 28 ' shr XMM_Tmp1,#9 ' ... dst register ... 2254(00a9): eb 5e bd 54 ' movd XMM_Dst2,XMM_Tmp1 ' set as reg to be shifted ... 2258(00aa): 93 4c fd 5c ' call #XMM_ReadLong ' read long containing bytes 225c(00ab): 04 ec fd 84 ' sub XMM_Addr,#4 ' correct XMM_Addr 2260(00ac): f6 d6 bd a0 ' mov XMM_Tmp1,XMM_Addr ' calculate ... 2264(00ad): 03 d6 fd 60 ' and XMM_Tmp1,#Common#CACHE_CMD_MASK ' ... offset of bytes 2268(00ae): 03 d6 fd 2c ' shl XMM_Tmp1,#3 ' convert to no of bits to shift 226c(00af): eb 00 bc 28 ' XMM_Dst2 shr 0-0,XMM_Tmp1 ' put bytes in correct place 2270(00b0): f8 ec bd 80 ' add XMM_Addr,XMM_Len ' update XMM_Addr 2274(00b1): ' XMM_ReadMult_ret 2274(00b1): 00 00 7c 5c ' ret 2278(00b2): ' XMM_WriteLong 2278(00b2): c3 80 bd 54 ' movd XMM_Src1,XMM_Src ' set src reg as dst reg for hub write 227c(00b3): f6 d6 bd a0 ' mov XMM_Tmp1,XMM_Addr ' get the address to write 2280(00b4): f6 e4 bd a0 ' mov XMM_Last,XMM_Addr ' save page ... 2284(00b5): f5 e4 bd 64 ' andn XMM_Last,XMM_Msk ' ... as last read/written 2288(00b6): 03 d6 fd 64 ' andn XMM_Tmp1,#Common#CACHE_CMD_MASK ' set command ... 228c(00b7): 02 d6 fd 68 ' or XMM_Tmp1,#Common#CACHE_WRITE_CMD ' ... to WRITE 2290(00b8): f3 d6 3d 08 ' wrlong XMM_Tmp1,XMM_CMD ' issue the command 2294(00b9): ' :WriteLong_Wait 2294(00b9): f3 d6 bd 08 ' rdlong XMM_Tmp1,XMM_Cmd ' wait till ... 2298(00ba): b9 d6 7d e8 ' tjnz XMM_Tmp1,#:WriteLong_Wait ' ... command completes 229c(00bb): f4 e2 bd 08 ' rdlong XMM_Line,XMM_Rsp ' get response (cache line address) 22a0(00bc): f1 d6 bd a0 ' mov XMM_Tmp1,XMM_Line 22a4(00bd): f6 d8 bd a0 ' mov XMM_Tmp2,XMM_Addr ' calculate ... 22a8(00be): f5 d8 bd 60 ' and XMM_Tmp2,XMM_Msk ' ... the ... 22ac(00bf): ec d6 bd 80 ' add XMM_Tmp1,XMM_Tmp2 ' ... address 22b0(00c0): eb 00 3c 08 ' XMM_Src1 wrlong 0-0,XMM_Tmp1 ' write src register to that address 22b4(00c1): 04 ec fd 80 ' add XMM_Addr,#4 ' update XMM_Addr 22b8(00c2): ' XMM_WriteLong_ret 22b8(00c2): 00 00 7c 5c ' ret 22bc(00c3): 00 00 00 00 ' XMM_Src long 0 ' temp storage of src register 22c0(00c4): ' XMM_WriteMult 22c0(00c4): ee 48 fd 54 ' movd XMM_Dst,#XMM_Tmp4 ' read the long ... 22c4(00c5): 93 4c fd 5c ' call #XMM_ReadLong ' ... containing the bytes we want 22c8(00c6): 04 ec fd 84 ' sub XMM_Addr,#4 ' correct XMM_Addr 22cc(00c7): c3 a6 bd 54 ' movd XMM_Src2,XMM_Src ' set src reg as dst to mask ... 22d0(00c8): c3 a8 bd 50 ' movs XMM_Src3,XMM_Src ' ... and as src to include 22d4(00c9): f6 d8 bd a0 ' mov XMM_Tmp2,XMM_Addr ' calculate ... 22d8(00ca): 03 d8 fd 60 ' and XMM_Tmp2,#Common#CACHE_CMD_MASK ' ... offset of bytes we want 22dc(00cb): 03 d8 fd 2c ' shl XMM_Tmp2,#3 ' convert to number of bits to shift 22e0(00cc): f8 d6 bd a0 ' mov XMM_Tmp1,XMM_Len ' calculate mask ... 22e4(00cd): 02 d6 fd 2c ' shl XMM_Tmp1,#2 ' ... for the bytes we must replace 22e8(00ce): 01 da fd a4 ' neg XMM_Tmp3,#1 ' set up ... 22ec(00cf): eb da bd 2c ' shl XMM_Tmp3,XMM_Tmp1 ' ... the mask ... 22f0(00d0): eb da bd 2c ' shl XMM_Tmp3,XMM_Tmp1 ' ... we need (avoid shifting by 32!) 22f4(00d1): ec dc bd 20 ' ror XMM_Tmp4,XMM_Tmp2 ' move bytes to be replaced to LS bytes 22f8(00d2): ed dc bd 60 ' and XMM_Tmp4,XMM_Tmp3 ' mask out bytes to be replaced 22fc(00d3): ed 00 bc 64 ' XMM_Src2 andn 0-0,XMM_Tmp3 ' or in ... 2300(00d4): 00 dc bd 68 ' XMM_Src3 or XMM_Tmp4,0-0 ' ... replacement bytes 2304(00d5): ec dc bd 24 ' rol XMM_Tmp4,XMM_Tmp2 ' put bytes back to correct place 2308(00d6): ee 86 fd 50 ' movs XMM_Src,#XMM_Tmp4 ' write the long ... 230c(00d7): b2 84 fd 5c ' call #XMM_WriteLong ' ... containing the replaced bytes 2310(00d8): 04 ec fd 84 ' sub XMM_Addr,#4 ' correct XMM_Addr 2314(00d9): f8 ec bd 80 ' add XMM_Addr,XMM_Len ' update XMM_Addr 2318(00da): ' XMM_WriteMult_ret 2318(00da): 00 00 7c 5c ' ret 231c(00db): ' XMM_WritePage 231c(00db): f8 e0 bd a0 ' mov XMM_Tmp6,XMM_Len ' save length 2320(00dc): 01 f0 fd a0 ' mov XMM_Len,#1 ' we write one byte at a time 2324(00dd): ' :WriteLoop 2324(00dd): f7 de bd 00 ' rdbyte XMM_Tmp5,Hub_Addr ' read byte from source (Hub) 2328(00de): 01 ee fd 80 ' add Hub_Addr,#1 ' inc source address 232c(00df): ef 86 fd 50 ' movs XMM_Src,#XMM_Tmp5 ' use this as temp byte 2330(00e0): c4 b4 fd 5c ' call #XMM_WriteMult ' write byte to sram 2334(00e1): dd e0 fd e4 ' djnz XMM_Tmp6,#:WriteLoop ' repeat till all bytes written 2338(00e2): ' XMM_WritePage_ret 2338(00e2): 00 00 7c 5c ' ret 233c(00e3): ' XMM_ReadPage 233c(00e3): f8 e0 bd a0 ' mov XMM_Tmp6,XMM_Len ' save length 2340(00e4): 01 f0 fd a0 ' mov XMM_Len,#1 ' we read one byte at a time 2344(00e5): ' :ReadLoop 2344(00e5): ef 48 fd 54 ' movd XMM_Dst,#XMM_Tmp5 ' use this as temp byte 2348(00e6): a7 62 fd 5c ' call #XMM_ReadMult ' read byte from sram 234c(00e7): f7 de 3d 00 ' wrbyte XMM_Tmp5,Hub_Addr ' write byte to destination (Hub) 2350(00e8): 01 ee fd 80 ' add Hub_Addr,#1 ' inc dest address 2354(00e9): e5 e0 fd e4 ' djnz XMM_Tmp6,#:ReadLoop ' repeat till all bytes read 2358(00ea): ' XMM_ReadPage_ret 2358(00ea): 00 00 7c 5c ' ret 235c(00eb): 00 00 00 00 ' XMM_Tmp1 long $0 2360(00ec): 00 00 00 00 ' XMM_Tmp2 long $0 2364(00ed): 00 00 00 00 ' XMM_Tmp3 long $0 2368(00ee): 00 00 00 00 ' XMM_Tmp4 long $0 236c(00ef): 00 00 00 00 ' XMM_Tmp5 long $0 2370(00f0): 00 00 00 00 ' XMM_Tmp6 long $0 2374(00f1): 00 00 00 00 ' XMM_Line long $0 2378(00f2): 00 00 00 00 ' XMM_Last long $0 237c(00f3): f0 7f 00 00 ' XMM_Cmd long Common#XMM_CACHE_CMD 2380(00f4): f4 7f 00 00 ' XMM_Rsp long Common#XMM_CACHE_RSP 2384(00f5): 0f 00 00 00 ' XMM_Msk long Common#CACHE_LINE_MASK 2388(00f6): 00 00 00 00 ' XMM_Addr long 0 238c(00f7): 00 00 00 00 ' Hub_Addr long 0 2390(00f8): 00 00 00 00 ' XMM_Len long 0 2394(00f9): ' fit $1f0 ' max size '****************************************************************************** ' Catalina_Common.spin '****************************************************************************** '=============================== Object Header ================================ 23d8: e0 03 1b 00 ' 992 bytes, 27-1 methods, 0 object pointers 23dc: 6c 00 04 00 ' METHOD 23dc: 6c 00 04 00 ' METHOD 23dc: 6c 00 04 00 ' METHOD 23dc: 6c 00 04 00 ' METHOD 23dc: 6c 00 04 00 ' METHOD 23dc: 6c 00 04 00 ' METHOD 23dc: 6c 00 04 00 ' METHOD 23dc: 6c 00 04 00 ' METHOD 23dc: 6c 00 04 00 ' METHOD 23dc: 6c 00 04 00 ' METHOD 23dc: 6c 00 04 00 ' METHOD 23dc: 6c 00 04 00 ' METHOD 23dc: 6c 00 04 00 ' METHOD 23dc: 6c 00 04 00 ' METHOD 23dc: 6c 00 04 00 ' METHOD 23dc: 6c 00 04 00 ' METHOD 23dc: 6c 00 04 00 ' METHOD 23dc: 6c 00 04 00 ' METHOD 23dc: 6c 00 04 00 ' METHOD 23dc: 6c 00 04 00 ' METHOD 23dc: 6c 00 04 00 ' METHOD 23dc: 6c 00 04 00 ' METHOD 23dc: 6c 00 04 00 ' METHOD 23dc: 6c 00 04 00 ' METHOD 23dc: 6c 00 04 00 ' METHOD 23dc: 6c 00 04 00 ' METHOD '================================ DAT Section =================================