Help with PASM synchronization
David Betz
Posts: 14,516
I'm sure I've made an obvious blunder here but I can't see what it is. I have written a PASM CRC routine that I intend to use in a communications object and I wanted to verify that it was producing the same results as my working Spin code. I wrote the following test program to verify this. The program works but gets stuck at the line after the cognew call waiting for the PASM code to complete. I guess I must have he PAR handling wrong but I've stared at it for a while and can't see what I'm doing wrong. The idea is that param_ptr gets set to the address of the test data but that the PASM code sets it to zero when it has finished computing the CRC. The main Spin code waits for that parameter to become zero before printing the result. The problem is that I never exit the "repeat while" loop suggesting that the PASM code never finishes or it fails to set param_ptr to zero. Can anyone spot my blunder?
Thanks!
David
Thanks!
David
CON _clkmode = xtal1 + pll16x _xinfreq = 5_000_000 conRxPin = 31 '' the RX pin to use for UART console conTxPin = 30 '' the TX pin to use for UART console conMode = 0 '' the mode to use for FullDuplex UART console conBaud = 115200 '' the baud rate to use for UART console CR = $0d OBJ ser : "FullDuplexSerialExtended" PUB main | param_ptr, param_cnt, param_crc, spin_crc, i ser.start(conRxPin, conTxPin, conMode, conBaud) spin_crc := 0 repeat i from 0 to 15 spin_crc := updcrc_spin(spin_crc, byte[@test_data][i]) ser.str(string("Spin value: ")) ser.hex(spin_crc, 8) ser.tx(CR) param_ptr := @test_data param_cnt := 16 cognew(@crc_test, @param_ptr) repeat while param_ptr <> 0 ser.str(string("PASM value: ")) ser.hex(param_crc, 8) ser.tx(CR) repeat PRI updcrc_spin(crc_spin, data) return (word[@crctab][(crc_spin >> 8) & $ff] ^ (crc_spin << 8) ^ data) & $ffff DAT test_data byte $01, $12, $23, $34, $45, $56, $67, $78 byte $89, $9a, $ab, $bc, $cd, $de, $ef, $f0 org 0 crc_test mov tmp, par rdlong ptr, tmp add tmp, #4 rdlong count, tmp mov crc, #0 :loop rdbyte rxdata, ptr call #updcrc add ptr, #1 djnz count, #:loop mov tmp, par add tmp, #8 wrlong crc, tmp mov tmp, par wrlong zero, tmp cogid tmp cogstop tmp ptr res 1 count res 1 tmp res 1 zero long 0 updcrc mov t1, crc test t1,#$100 wz shr t1, #9 add t1, #crctab movs :load, t1 shl crc, #8 :load mov t1, 0-0 if_nz shr t1, #16 xor crc, t1 xor crc, rxdata and crc, word_mask updcrc_ret ret crc res 1 rxdata res 1 t1 res 1 word_mask long $ffff crctab word $0000, $1021, $2042, $3063, $4084, $50a5, $60c6, $70e7 word $8108, $9129, $a14a, $b16b, $c18c, $d1ad, $e1ce, $f1ef word $1231, $0210, $3273, $2252, $52b5, $4294, $72f7, $62d6 word $9339, $8318, $b37b, $a35a, $d3bd, $c39c, $f3ff, $e3de word $2462, $3443, $0420, $1401, $64e6, $74c7, $44a4, $5485 word $a56a, $b54b, $8528, $9509, $e5ee, $f5cf, $c5ac, $d58d word $3653, $2672, $1611, $0630, $76d7, $66f6, $5695, $46b4 word $b75b, $a77a, $9719, $8738, $f7df, $e7fe, $d79d, $c7bc word $48c4, $58e5, $6886, $78a7, $0840, $1861, $2802, $3823 word $c9cc, $d9ed, $e98e, $f9af, $8948, $9969, $a90a, $b92b word $5af5, $4ad4, $7ab7, $6a96, $1a71, $0a50, $3a33, $2a12 word $dbfd, $cbdc, $fbbf, $eb9e, $9b79, $8b58, $bb3b, $ab1a word $6ca6, $7c87, $4ce4, $5cc5, $2c22, $3c03, $0c60, $1c41 word $edae, $fd8f, $cdec, $ddcd, $ad2a, $bd0b, $8d68, $9d49 word $7e97, $6eb6, $5ed5, $4ef4, $3e13, $2e32, $1e51, $0e70 word $ff9f, $efbe, $dfdd, $cffc, $bf1b, $af3a, $9f59, $8f78 word $9188, $81a9, $b1ca, $a1eb, $d10c, $c12d, $f14e, $e16f word $1080, $00a1, $30c2, $20e3, $5004, $4025, $7046, $6067 word $83b9, $9398, $a3fb, $b3da, $c33d, $d31c, $e37f, $f35e word $02b1, $1290, $22f3, $32d2, $4235, $5214, $6277, $7256 word $b5ea, $a5cb, $95a8, $8589, $f56e, $e54f, $d52c, $c50d word $34e2, $24c3, $14a0, $0481, $7466, $6447, $5424, $4405 word $a7db, $b7fa, $8799, $97b8, $e75f, $f77e, $c71d, $d73c word $26d3, $36f2, $0691, $16b0, $6657, $7676, $4615, $5634 word $d94c, $c96d, $f90e, $e92f, $99c8, $89e9, $b98a, $a9ab word $5844, $4865, $7806, $6827, $18c0, $08e1, $3882, $28a3 word $cb7d, $db5c, $eb3f, $fb1e, $8bf9, $9bd8, $abbb, $bb9a word $4a75, $5a54, $6a37, $7a16, $0af1, $1ad0, $2ab3, $3a92 word $fd2e, $ed0f, $dd6c, $cd4d, $bdaa, $ad8b, $9de8, $8dc9 word $7c26, $6c07, $5c64, $4c45, $3ca2, $2c83, $1ce0, $0cc1 word $ef1f, $ff3e, $cf5d, $df7c, $af9b, $bfba, $8fd9, $9ff8 word $6e17, $7e36, $4e55, $5e74, $2e93, $3eb2, $0ed1, $1ef0 fit 496
Comments
However, this restriction on RES is very bizarre. There is nothing in the manual that mentions this. Is this a bug in the BST Spin compiler?
There are two program counters in the assembler. One keeps track of the cog (long) address of the generated code and the other keeps track of the hub (byte) address where the code is placed. The ORG statement sets the cog address and is usually used to reset the cog address to zero. The RES statement increments the cog address by its operand in order to reserve space in the cog, but doesn't increment the hub address at all. This is intended for use at the end of a cog program and allows for variables to be allocated in the cog, but not to occupy space in hub memory. The actual cog locations are loaded from whatever happens to follow the last generated code in hub memory when the COGNEW / COGINIT is executed.
If you place a RES statement in the middle of a cog program, the cog program counter is incremented, but the actual data that's in memory is whatever follows the RES statement(s) so the cog addresses and the following code and/or data are out-of-sync.