' ' buffered smart pin serial object for P2 Eval board, buffering rx/tx in the Cog ' CON _txmode = %0000_0000_000_0000000000000_01_11110_0 'async tx mode, output enabled for smart output _rxmode = %0000_0000_000_0000000000000_00_11111_0 'async rx mode, input enabled for smart input VAR long cog 'cog id of this instance long rx1_cmd, rx1_param, tx1_cmd, tx1_param, rx2_cmd, rx2_param, tx2_cmd, tx2_param ' mailbox 8 longs PUB stop if cog cogstop(cog) cog := 0 PUB start(rxpin, txpin, mode, baudrate) return startExt(rxpin, txpin, baudrate, baudrate, _rxmode, _txmode,0, $FF, $100, $FF,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1) PUB start2(rxpin1, txpin1, mode1, baudrate1, rxpin2, txpin2, mode2, baudrate2) return startExt(rxpin1, txpin1, baudrate1, baudrate1, _rxmode, _txmode, 0, $7F, $80, $7F ,rxpin2, txpin2, baudrate2, baudrate2, _rxmode, _txmode, $100, $7F, $180, $7F) PUB startExt(rxpin1, txpin1, rxbaudrate1, txbaudrate1, rxmode1, txmode1, rxlutstart1, rxlutsize1, txlutstart1, txlutsize1, rxpin2, txpin2, rxbaudrate2, txbaudrate2, rxmode2, txmode2, rxlutstart2, rxlutsize2, txlutstart2, txlutsize2) | startparams[21] stop startparams[0] := @rx1_cmd 'hub address mailbox startparams[1] := rxpin1 'pin rx1 startparams[2] := 7 + ((CLKFREQ / rxbaudrate1) << 16) 'bitrate rx1 startparams[3] := rxmode1 'mode rx1 startparams[4] := rxlutstart1 'start lutbuffer rx1 startparams[5] := rxlutsize1 'size lutbuffer rx1 startparams[6] := txpin1 'pin tx1 startparams[7] := 7 + ((CLKFREQ / txbaudrate1) << 16) 'bitrate tx1 startparams[8] := txmode1 'mode tx1 startparams[9] := txlutstart1 'start lutbuffer tx1 startparams[10] := txlutsize1 'size lutbuffer tx1 startparams[11] := rxpin2 'pin rx2 startparams[12] := 7 + ((CLKFREQ / rxbaudrate2) << 16) 'bitrate rx2 startparams[13] := rxmode2 'mode rx2 startparams[14] := rxlutstart2 'start lutbuffer rx2 startparams[15] := rxlutsize2 'size lutbuffer rx2 startparams[16] := txpin2 'pin tx2 startparams[17] := 7 + ((CLKFREQ / txbaudrate2) << 16) 'bitrate tx2 startparams[18] := txmode2 'mode tx2 startparams[19] := txlutstart2 'start lutbuffer tx2 startparams[20] := txlutsize2 'size lutbuffer tx2 rx1_cmd := 0 'set flag to know if the started cog has read its parameters cog := cognew(@cogserial_init,@startparams[0]) + 1 if cog repeat until rx1_cmd == -1 'wait until cog is done reading parameter RESULT := 1 ' ' check if byte received (never waits) ' returns -1 if no byte, otherwise byte ' PUB rxcheck RETURN rx_read(0, -2, 0) ' ' receive a byte (waits until done) ' returns received byte ' PUB rx : rxbyte rx_read(@rxbyte, 1, 0) ' ' check if byte received (never waits) ' returns -1 if no byte, otherwise byte ' PUB rx_check(port) RETURN rx_read(0, -2, port) ' ' receive a byte (waits until done) ' returns received byte ' PUB rx_(port) : rxbyte rx_read(@rxbyte, 1, port) ' ' receive a block from serial to memory of given size in bytes (waits until done) ' PUB rx_read(hubaddress, size, port) rx_read_async(hubaddress, size, port) if port repeat until rx2_cmd == -1 RESULT := rx2_param else repeat until rx1_cmd == -1 RESULT := rx1_param ' ' receive a block from serial to memory of given size in bytes (does not wait for completion - you may need to check rx1_cmd if done or not later in your code) ' PUB rx_read_async(hubaddress, size, port) if port repeat until rx2_cmd == -1 rx2_param := hubaddress rx2_cmd := size else repeat until rx1_cmd == -1 rx1_param := hubaddress rx1_cmd := size ' ' returns size of receive buffer in bytes ' PUB rx_size(port) RETURN rx_read(0, -4, port) ' ' returns number of bytes waiting in receive buffer ' PUB rx_count(port) RETURN rx_read(0, -3, port) ' ' check if byte can be send (never waits) ' returns -1 if no space in buffer otherwise number of free bytes in send buffer ' PUB txcheck RETURN tx_write(0, -2, 0) ' ' sends a byte (waits until done) ' PUB tx(val) tx_write(@val,1, 0) ' ' check if byte can be send (never waits) ' returns -1 if no space in buffer otherwise number of free bytes in send buffer ' PUB tx_check(port) RETURN tx_write(0, -2, port) ' ' sends a byte (waits until done) ' PUB tx_(val, port) tx_write(@val,1, port) ' ' sends a byte (does not wait for completion - you may need to check tx1_cmd if done or not later in your code) ' PUB tx_async(val, port) tx_write_async(@val,1, port) ' ' sends a block from memory to serial of given size in bytes (waits until done) ' PUB tx_write(hubaddress, size, port) tx_write_async(hubaddress, size, port) if port repeat until tx2_cmd == -1 RESULT := tx2_param else repeat until tx1_cmd == -1 RESULT := tx1_param ' ' sends a block from memory to serial of given size in bytes (does not wait for completion - you may need to check tx1_cmd if done or not later in your code) ' PUB tx_write_async(hubaddress, size, port) if port repeat until tx2_cmd == -1 tx2_param := hubaddress tx2_cmd := size else repeat until tx1_cmd == -1 tx1_param := hubaddress tx1_cmd := size ' ' returns size of send buffer in bytes ' PUB tx_size(port) RETURN tx_write(0, -4, port) ' ' returns number of free bytes in send buffer ' PUB tx_count(port) RETURN tx_write(0, -3, port) ' ' transmit a string (waits until done) ' PUB str(s) | c tx_write(s, -5, 0) ' ' transmit a string (waits until done) ' PUB str_(s, port) | c tx_write(s, -5, port) ' ' transmit a string (does not wait for completion - you may need to check tx1_cmd if done or not later in your code) ' PUB str_async(s, port) | c tx_write_async(s, -5, port) ' ' transmit a long as decimal ' PUB dec(value) dec_(value, 0) ' ' transmit a long as decimal ' PUB dec_(value, port) | i, x '' Print a decimal number result := 0 x := value == NEGX 'Check for max negative if value < 0 value := ||(value+x) 'If negative, make positive; adjust for max negative tx_async("-", port) 'and output sign i := 1_000_000_000 'Initialize divisor repeat 10 'Loop for 10 digits if value => i tx_async(value / i + "0" + x*(i == 1), port) 'If non-zero digit, output digit; adjust for max negative value //= i 'and digit from value result~~ 'flag non-zero found elseif result or i == 1 tx_async("0", port) 'If zero digit (or only digit) output it i /= 10 'Update divisor ' ' transmit a long as hex ' PUB hex(val, digits) hex_(val, digits, 0) ' ' transmit a long as hex ' PUB hex_(val, digits, port) | shft, x shft := (digits - 1) << 2 repeat digits x := (val >> shft) & $F shft -= 4 if (x => 10) x := (x - 10) + "A" else x := x + "0" tx_async(x, port) DAT org 0 cogserial_init rdlong rx1_mailbox_ptr,ptra++ rdlong rx1_pin, ptra++ rdlong rx1_bitperiod, ptra++ rdlong rx1_mode, ptra++ rdlong rx1_lut_buff, ptra++ rdlong rx1_lut_btop, ptra++ rdlong tx1_pin, ptra++ rdlong tx1_bitperiod, ptra++ rdlong tx1_mode, ptra++ rdlong tx1_lut_buff, ptra++ rdlong tx1_lut_btop, ptra++ rdlong rx2_pin, ptra++ rdlong rx2_bitperiod, ptra++ rdlong rx2_mode, ptra++ rdlong rx2_lut_buff, ptra++ rdlong rx2_lut_btop, ptra++ rdlong tx2_pin, ptra++ rdlong tx2_bitperiod, ptra++ rdlong tx2_mode, ptra++ rdlong tx2_lut_buff, ptra++ rdlong tx2_lut_btop, ptra++ ' ' calculate mailbox pointers ' mov rx1_param_ptr, rx1_mailbox_ptr add rx1_param_ptr, #4 mov tx1_mailbox_ptr,rx1_param_ptr add tx1_mailbox_ptr,#4 mov tx1_param_ptr, tx1_mailbox_ptr add tx1_param_ptr, #4 mov rx2_mailbox_ptr,tx1_param_ptr add rx2_mailbox_ptr,#4 mov rx2_param_ptr, rx2_mailbox_ptr add rx2_param_ptr, #4 mov tx2_mailbox_ptr,rx2_param_ptr add tx2_mailbox_ptr,#4 mov tx2_param_ptr, tx2_mailbox_ptr add tx2_param_ptr, #4 ' ' clear mailbox ' wrlong minusOne, tx2_param_ptr wrlong minusOne, tx2_mailbox_ptr wrlong minusOne, rx2_param_ptr wrlong minusOne, rx2_mailbox_ptr wrlong minusOne, tx1_param_ptr wrlong minusOne, tx1_mailbox_ptr wrlong minusOne, rx1_param_ptr wrlong minusOne, rx1_mailbox_ptr ' this tells calling cog we got the parameters ' ' init used smartpins ' rx1_init cmp rx1_pin, minusOne wz if_nz call #rx1_reset tx1_init cmp tx1_pin, minusOne wz if_nz call #tx1_reset rx2_init cmp rx2_pin, minusOne wz if_nz call #rx2_reset tx2_init cmp tx2_pin, minusOne wz if_nz call #tx2_reset timer_init mov ijmp3,#tx_isr 'set int3 vector setint3 #1 'set int3 for ct-passed-ct1 event getct tx_ct1 'set initial tx_ct1 target mov tx_ct1wait, #500 ' todo - needs to be adjuted to fastest ports bitfrequence somehow addct1 tx_ct1, tx_ct1wait ' 'command loop ' rx1_cmd_check cmp rx1_pin, minusOne wz if_z jmp #tx1_cmd_check rdlong cmd, rx1_mailbox_ptr 'cmd from rx1 mailbox? cmp cmd, minusOne wz if_nz call #rx1_do_cmd 'do it tx1_cmd_check cmp tx1_pin, minusOne wz if_z jmp #rx2_cmd_check rdlong cmd, tx1_mailbox_ptr 'cmd from tx1 mailbox? cmp cmd, minusOne wz if_nz call #tx1_do_cmd 'do it rx2_cmd_check cmp rx2_pin, minusOne wz if_z jmp #tx2_cmd_check rdlong cmd, rx2_mailbox_ptr 'cmd from rx2 mailbox? cmp cmd, minusOne wz if_nz call #rx2_do_cmd 'do it tx2_cmd_check cmp tx2_pin, minusOne wz if_z jmp #rx1_cmd_check rdlong cmd, tx2_mailbox_ptr 'cmd from tx2 mailbox? cmp cmd, minusOne wz if_nz call #tx2_do_cmd 'do it jmp #rx1_cmd_check ' ' tx1 try to send, reads long in lut buffer ' tx1_send cmp tx1_head, tx1_tail wz 'byte to send? if_z ret 'no wait for next time rdpin tx1_char, tx1_pin wc 'wait for transmit done if_c ret mov tx1_address, tx1_tail 'adjust to buffer start add tx1_address, tx1_lut_buff 'by adding tx1_lut_buff rdlut tx1_char, tx1_address 'get byte from circular buffer in lut incmod tx1_tail, tx1_lut_btop 'increment buffer tail _ret_ wypin tx1_char, tx1_pin 'send byte ' ' tx2 try to send, reads long in lut buffer ' tx2_send cmp tx2_head, tx2_tail wz 'byte to send? if_z ret 'no wait for next time rdpin tx2_char, tx2_pin wc 'wait for transmit done if_c ret mov tx2_address, tx2_tail 'adjust to buffer start add tx2_address, tx2_lut_buff 'by adding tx2_lut_buff rdlut tx2_char, tx2_address 'get byte from circular buffer in lut incmod tx2_tail, tx2_lut_btop 'increment buffer tail _ret_ wypin tx2_char, tx2_pin 'send byte ' ' tx write interrupt, reads longs in lut buffer ' 'int3 isr, runs once every 500 clocks tx_isr call #tx1_send call #tx2_send addct1 tx_ct1, tx_ct1wait 'update txct1 target reti3 'return to main program ' ' rx1 read interrupt writes byte in lut buffer ' rx1_isr rdpin rx1_char, rx1_pin '2 get received chr shr rx1_char, #32-8 '2 shift to lsb justify mov rx1_address, rx1_head '2 adjust to buffer start add rx1_address, rx1_lut_buff '2 by adding rx1_lut_buff wrlut rx1_char, rx1_address '2 write byte to circular buffer in lut incmod rx1_head, rx1_lut_btop '2 ..increment buffer head reti1 '2/4 ..exit ' ' rx2 read interrupt writes byte in lut buffer ' rx2_isr rdpin rx2_char, rx2_pin '2 get received chr shr rx2_char, #32-8 '2 shift to lsb justify mov rx2_address, rx2_head '2 adjust to buffer start add rx2_address, rx2_lut_buff '2 by adding rx1_lut_buff wrlut rx2_char, rx2_address '2 write byte to circular buffer in lut incmod rx2_head, rx2_lut_btop '2 ..increment buffer head reti2 '2/4 ..exit ' ' Reset rx1 clear buffer pointers enable pin and int1 ' rx1_reset setint1 #0 'disable int1 dirl rx1_pin 'disable receiver mov rx1_head, #0 'reset serial buffer pointers mov rx1_tail, #0 mov rx1_char, #%110<<6 add rx1_char, rx1_pin wrpin rx1_mode, rx1_pin 'configure rx_pin for asynchronous receive, always input wxpin rx1_bitperiod, rx1_pin setse1 rx1_char 'set se1 to trigger on rx1_pin (rx1_pin high) mov ijmp1, #rx1_isr 'set int1 jump vector to rx1 ISR setint1 #4 'set int1 to trigger on se1 _ret_ dirh rx1_pin 'enable receiver ' ' Reset rx2 clear buffer pointers enable pin and int2 ' rx2_reset setint2 #0 'disable int2 dirl rx2_pin 'disable receiver mov rx2_head, #0 'reset serial buffer pointers mov rx2_tail, #0 mov rx2_char, #%110<<6 add rx2_char, rx2_pin wrpin rx2_mode, rx2_pin 'configure rx_pin for asynchronous receive, always input wxpin rx2_bitperiod, rx2_pin setse2 rx2_char 'set se1 to trigger on rx1_pin (rx1_pin high) mov ijmp2, #rx2_isr 'set int2 jump vector to rx2 ISR setint2 #5 'set int2 to trigger on se2 _ret_ dirh rx2_pin 'enable receiver ' ' Reset tx1 set tx1_mode and tx1_bitperiod, enable pin ' tx1_reset dirl tx1_pin 'disable transmitter mov tx1_head, #0 'reset serial buffer pointers mov tx1_tail, #0 wrpin tx1_mode, tx1_pin 'configure tx1_pin for asynchronous transmit, always output wxpin tx1_bitperiod, tx1_pin _ret_ dirh tx1_pin 'enable transmitter ' ' Reset tx2 set tx2_mode and tx2_bitperiod, enable pin ' tx2_reset dirl tx2_pin 'disable transmitter mov tx2_head, #0 'reset serial buffer pointers mov tx2_tail, #0 wrpin tx2_mode, tx2_pin 'configure tx1_pin for asynchronous transmit, always output wxpin tx2_bitperiod, tx2_pin _ret_ dirh tx2_pin 'enable transmitter ' ' handle rx1 mailbox ' rx1_do_cmd cmps cmd, #0 wcz '#rx1_blck if_ge jmp #.rx1block cmp cmd, minusTwo wz '#rx1_check if_z jmp #.rx1check cmp cmd, minusThree wz '#rx1_count if_z jmp #.rx1count cmp cmd, minusFour wz '#rx1_size if_z jmp #.rx1size jmp #.done .rx1block rdlong blockaddress, rx1_param_ptr 'cmd is current count .rx1BlockLoop cmp cmd, #0 wz if_z jmp #.done cmp rx1_head, rx1_tail wz 'byte received? if_z wrlong blockaddress, rx1_param_ptr 'no - save back current Block address if_z wrlong cmd, rx1_mailbox_ptr 'no - save back current count if_z ret 'noting there try again next round mov rx_address, rx1_tail 'adjust to buffer start add rx_address, rx1_lut_buff 'by adding rx1_lut_buff rdlut rx_char, rx_address 'get byte from circular buffer in lut incmod rx1_tail, rx1_lut_btop 'increment buffer tail wrbyte rx_char, blockaddress 'write byte to Block add blockaddress, #1 'adjust Block address sub cmd, #1 'adjust count jmp #.rx1BlockLoop 'and get next byte .rx1check mov rx_char, minusOne cmp rx1_head, rx1_tail wz 'byte received? if_z jmp #.donewritepar .rx1get cmp rx1_head, rx1_tail wz 'byte received? if_z jmp #.rx1get rdlut rx_char, rx1_tail 'get byte from circular buffer in lut incmod rx1_tail, rx1_lut_btop 'increment buffer tail jmp #.donewritepar .rx1count call #rx1_count jmp #.donewritepar .rx1size mov rx_char, rx1_lut_btop .donewritepar wrlong rx_char, rx1_param_ptr .done _ret_ wrlong minusOne, rx1_mailbox_ptr rx1_count mov rx_char, rx1_head 'returns count of bytes in receive buffer in rx_char cmp rx1_head, rx1_tail wcz if_b add rx_char, rx1_lut_btop _ret_ sub rx_char, rx1_tail ' ' handle rx2 mailbox ' rx2_do_cmd cmps cmd, #0 wcz '#rx2_blck if_ge jmp #.rx2block cmp cmd, minusTwo wz '#rx2_check if_z jmp #.rx2check cmp cmd, minusThree wz '#rx2_count if_z jmp #.rx2count cmp cmd, minusFour wz '#rx2_size if_z jmp #.rx2size jmp #.done .rx2block rdlong blockaddress, rx2_param_ptr 'cmd is current count .rx2BlockLoop cmp cmd, #0 wz if_z jmp #.done cmp rx2_head, rx2_tail wz 'byte received? if_z wrlong blockaddress, rx2_param_ptr 'no - save back current Block address if_z wrlong cmd, rx2_mailbox_ptr 'no - save back current count if_z ret 'noting there try again next round mov rx_address, rx2_tail 'adjust to buffer start add rx_address, rx2_lut_buff 'by adding rx2_lut_buff rdlut rx_char, rx_address 'get byte from circular buffer in lut incmod rx2_tail, rx2_lut_btop 'increment buffer tail wrbyte rx_char, blockaddress 'write byte to Block add blockaddress, #1 'adjust Block address sub cmd, #1 'adjust count jmp #.rx2BlockLoop 'and get next byte .rx2check mov rx_char, minusOne cmp rx2_head, rx2_tail wz 'byte received? if_z jmp #.donewritepar .rx2get cmp rx2_head, rx2_tail wz 'byte received? if_z jmp #.rx2get rdlut rx_char, rx2_tail 'get byte from circular buffer in lut incmod rx2_tail, rx2_lut_btop 'increment buffer tail jmp #.donewritepar .rx2count call #rx2_count jmp #.donewritepar .rx2size mov rx_char, rx2_lut_btop .donewritepar wrlong rx_char, rx2_param_ptr .done _ret_ wrlong minusOne, rx2_mailbox_ptr rx2_count mov rx_char, rx2_head 'returns count of bytes in receive buffer in rx_char cmp rx2_head, rx2_tail wcz if_b add rx_char, rx2_lut_btop _ret_ sub rx_char, rx2_tail ' ' handle tx1 mailbox ' tx1_do_cmd cmps cmd, #0 wcz '#tx1_block if_ge jmp #.tx1block cmp cmd, minusTwo wz '#tx1_check if_z jmp #.tx1check cmp cmd, minusThree wz '#tx1_count if_z jmp #.tx1count cmp cmd, minusFour wz '#tx1_size if_z jmp #.tx1size cmp cmd, minusFive wz '#tx1_str if_z jmp #.tx1block jmp #.done .tx1block rdlong blockaddress, tx1_param_ptr 'cmd is current count .tx1BlockLoop cmp cmd, #0 wz if_z jmp #.done mov tx_address, tx1_head incmod tx_address, tx1_lut_btop cmp tx_address, tx1_tail wz if_z wrlong blockaddress, tx1_param_ptr 'no - save back current Block address if_z wrlong cmd, tx1_mailbox_ptr 'no - save back current count if_z ret 'no space there try again next round mov tx_char, #0 rdbyte tx_char, blockaddress cmp cmd, minusFive wz if_nz sub cmd, #1 'adjust count if_z cmp tx_char, #0 wz if_z jmp #.done mov tx_address, tx1_head 'adjust to buffer start add tx_address, tx1_lut_buff 'by adding tx1_lut_buff wrlut tx_char, tx_address 'write byte to circular buffer in lut incmod tx1_head, tx1_lut_btop '..increment buffer head add blockaddress, #1 'adjust Block address jmp #.tx1BlockLoop 'and put next byte .tx1check mov tx_char, minusOne mov tx_address, tx1_head incmod tx_address, tx1_lut_btop cmp tx_address, tx1_tail wz if_z jmp #.donewritepar .tx1count call #tx1_count jmp #.donewritepar .tx1size mov tx_char, tx1_lut_btop .donewritepar wrlong tx_char, tx1_param_ptr .done _ret_ wrlong minusOne, tx1_mailbox_ptr tx1_count mov tx_char, tx1_head 'returns count of bytes in transmit buffer in tx_char cmp tx1_head, tx1_tail wcz if_b add tx_char, tx1_lut_btop _ret_ sub tx_char, tx1_tail ' ' handle tx2 mailbox ' tx2_do_cmd cmps cmd, #0 wcz '#tx2_block if_ge jmp #.tx2block cmp cmd, minusTwo wz '#tx2_check if_z jmp #.tx2check cmp cmd, minusThree wz '#tx2_count if_z jmp #.tx2count cmp cmd, minusFour wz '#tx2_size if_z jmp #.tx2size cmp cmd, minusFive wz '#tx2_str if_z jmp #.tx2block jmp #.done .tx2block rdlong blockaddress, tx2_param_ptr 'cmd is current count .tx2BlockLoop cmp cmd, #0 wz if_z jmp #.done mov tx_address, tx2_head incmod tx_address, tx2_lut_btop cmp tx_address, tx2_tail wz if_z wrlong blockaddress, tx2_param_ptr 'no - save back current Block address if_z wrlong cmd, tx2_mailbox_ptr 'no - save back current count if_z ret 'no space there try again next round mov tx_char, #0 rdbyte tx_char, blockaddress cmp cmd, minusFive wz if_nz sub cmd, #1 'adjust count if_z cmp tx_char, #0 wz if_z jmp #.done mov tx_address, tx2_head 'adjust to buffer start add tx_address, tx2_lut_buff 'by adding tx2_lut_buff wrlut tx_char, tx_address 'write byte to circular buffer in lut incmod tx2_head, tx2_lut_btop '..increment buffer head add blockaddress, #1 'adjust Block address jmp #.tx2BlockLoop 'and put next byte .tx2check mov tx_char, minusOne mov tx_address, tx2_head incmod tx_address, tx2_lut_btop cmp tx_address, tx2_tail wz if_z jmp #.donewritepar .tx2count call #tx2_count jmp #.donewritepar .tx2size mov tx_char, tx2_lut_btop .donewritepar wrlong tx_char, tx2_param_ptr .done _ret_ wrlong minusOne, tx2_mailbox_ptr tx2_count mov tx_char, tx2_head 'returns count of bytes in transmit buffer in tx_char cmp tx2_head, tx2_tail wcz if_b add tx_char, tx2_lut_btop _ret_ sub tx_char, tx2_tail ' ' data ' minusOne long -1 'usable ngative constants minusTwo long -2 minusThree long -3 minusFour long -4 minusFive long -5 ' rx1_mailbox_ptr res 1 rx1_param_ptr res 1 rx1_pin res 1 'serial1 rxpin rx1_bitperiod res 1 'bitperiod := 7 + ((CLKFREQ / baudrate) << 16) rx1_mode res 1 'configure rx1_pin for asynchronous receive, always input rx1_lut_buff res 1 'lut rx1 receive buffer address in lut rx1_lut_btop res 1 'lut rx1 receive buffer top address in lut (size for rx1) ' rx1_head res 1 'serial1 rxhead address rx1_tail res 1 'serial1 rxtail address ' rx1_char res 1 'tmp char for rx1_isr rx1_address res 1 'tmp address for rx1_isr ' rx2_mailbox_ptr res 1 rx2_param_ptr res 1 rx2_pin res 1 'serial1 rx2pin rx2_bitperiod res 1 'bitperiod := 7 + ((CLKFREQ / baudrate) << 16) rx2_mode res 1 'configure rx2_pin for asynchronous receive, always input rx2_lut_buff res 1 'lut rx2 receive buffer address in lut rx2_lut_btop res 1 'lut rx2 receive buffer top address in lut (size for rx1) ' rx2_head res 1 'serial1 rxhead address rx2_tail res 1 'serial1 rxtail address ' rx2_char res 1 'tmp char for rx2_isr rx2_address res 1 'tmp address for rx2_isr ' tx1_mailbox_ptr res 1 tx1_param_ptr res 1 tx1_pin res 1 'serial1 txpin tx1_bitperiod res 1 'bitperiod := 7 + ((CLKFREQ / baudrate) << 16) tx1_mode res 1 'configure tx1_pin for asynchronous transmit, always output tx1_lut_buff res 1 'lut tx1 send buffer address in lut tx1_lut_btop res 1 'lut tx1 send buffer top address in lut (size for tx1) ' tx1_head res 1 'serial1 txhead address tx1_tail res 1 'serial1 txtail address ' tx1_char res 1 'tmp char for tx1_send tx1_address res 1 'tmp address for tx1_send ' tx2_mailbox_ptr res 1 tx2_param_ptr res 1 tx2_pin res 1 'serial1 tx2pin tx2_bitperiod res 1 'bitperiod := 7 + ((CLKFREQ / baudrate) << 16) tx2_mode res 1 'configure tx2_pin for asynchronous transmit, always output tx2_lut_buff res 1 'lut tx2 send buffer address in lut tx2_lut_btop res 1 'lut tx2 send buffer top address in lut (size for tx2) ' tx2_head res 1 'serial1 txhead address tx2_tail res 1 'serial1 txtail address ' tx2_char res 1 'tmp char for tx2_send tx2_address res 1 'tmp address for tx2_send ' blockaddress res 1 cmd res 1 rx_char res 1 rx_address res 1 tx_char res 1 tx_address res 1 tx_ct1 res 1 'reserve long for ct1 in tx_timer tx_ct1wait res 1 'reserve long for ct1 in tx_timer how long to wait