''***************************** ''* SerialTransmit v0.9 * ''***************************** '' Asynchronus transmitter object with 16 Byte FIFO '' transmits 2 stopbits, 8 or 9 databits, and can add even or odd parity ' made by Andy Schenk, Insonix VAR long cog long tx_head '6 contiguous longs long tx_tail long tx_pin long tx_format long bit_ticks long buffer_ptr byte tx_buffer[16] 'txbuffer PUB start(pin, baudrate, format) : okay '' Start serial transmitter - starts a cog '' returns false if no cog available '' '' format bit0: 0= 8 databits, 1= 9 databits '' bit1: 1= add parity in highest bit '' bit2: 0= Odd parity, 1= Even parity '' bit3: 1= inverse output stop longfill(@tx_head, 0, 2) 'clear head and tail pointers tx_pin := pin 'set the parameters bit_ticks := clkfreq / baudrate tx_format := format buffer_ptr := @tx_buffer okay := cog := cognew(@entry, @tx_head) + 1 'start cog PUB stop '' Stop transmitter - frees a cog if cog cogstop(cog~ - 1) longfill(@tx_head, 0, 2) PUB str(stringptr) '' Print a zero-terminated string repeat strsize(stringptr) tx(byte[stringptr++]) PUB dec(value) | i '' Print a decimal number if value < 0 -value tx("-") i := 1_000_000_000 repeat 10 if value => i tx(value / i + "0") value //= i result~~ elseif result or i == 1 tx("0") i /= 10 PUB hex(value, digits) '' Print a hexadecimal number value <<= (8 - digits) << 2 repeat digits tx(lookupz((value <-= 4) & $F : "0".."9", "A".."F")) PUB bin(value, digits) '' Print a binary number value <<= 32 - digits repeat digits tx((value <-= 1) & 1 + "0") PUB tx(c) '' Send byte (may wait for room in buffer) repeat until (tx_tail <> (tx_head + 1) & $0F) tx_buffer[tx_head] := c tx_head := (tx_head + 1) & $0F DAT '*********************************** '* Assembly language serial driver * '*********************************** org 0 ' entry mov t1,par 'get parameter pointer add t1,#2 << 2 'skip over head and tail rdlong t2,t1 'get tx_pin mov txmask,#1 shl txmask,t2 test txformat,#%1000 wz 'invers? if_z or outa,txmask 'set idle if_nz andn outa,txmask or dira,txmask 'tx pin = output add t1,#4 'get format rdlong txformat,t1 add t1,#4 'get bit_ticks rdlong bittime,t1 add t1,#4 'get buffer_ptr rdlong txbuff,t1 transmit mov t1,par 'check for head <> tail rdlong t2,t1 add t1,#1 << 2 rdlong t3,t1 cmp t2,t3 wz if_z jmp #transmit sendloop add t3,txbuff 'get byte and inc tail rdbyte txdata,t3 sub t3,txbuff add t3,#1 and t3,#$0F wrlong t3,t1 test txformat,#%001 wz '8 or 9 databits? if_z mov txcnt,#$80 if_nz mov txcnt,#$100 shl txcnt,#1 or txdata,txcnt wc 'add stoppbit, test parity shl txdata,#1 test txformat,#%010 wz 'parity? if_z jmp #noparity test txformat,#%100 wz 'odd or even parity? if_z muxc txdata,txcnt 'add even if_nz muxnc txdata,txcnt 'add odd noparity shl txcnt,#1 test txformat,#%1000 wz 'invers? if_nz xor txdata,K0FFF mov dtime,cnt add dtime,bittime sendbit shr txdata,#1 wc 'test LSB mov t2,outa if_nc andn t2,txmask 'bit=0 or if_c or t2,txmask 'bit=1 mov outa,t2 waitcnt dtime,bittime 'wait 1 bit shr txcnt,#1 wc if_nc jmp #sendbit '10 or 11 times waitcnt dtime,bittime '2 stopbits (delete this for 1 stopbit) jmp #transmit 'done,wait for next ' K0FFF long $0FFF ' ' Uninitialized data ' t1 res 1 t2 res 1 t3 res 1 dtime res 1 bittime res 1 txformat res 1 txmask res 1 txdata res 1 txcnt res 1 txbuff res 1