From: ian Date: Sun, 25 Dec 2005 16:56:56 +0000 (+0000) Subject: transmit management - initial cut X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ijackson/git?a=commitdiff_plain;h=731948d7c1ab00213d3218c03a87d652ba84064b;p=trains.git transmit management - initial cut --- diff --git a/detpic/program.asm b/detpic/program.asm index d1909be..dbdfb68 100644 --- a/detpic/program.asm +++ b/detpic/program.asm @@ -70,17 +70,18 @@ master_init call common_local_init call serial_init call nmra_init + call serialtxfc_init call mascan_init return ;---------------------------------------- master_interrupt_low enter_interrupt_low - ;call ticker_intrl + call ticker_intrl call nmra_serialrx_intrl - ;call serialtx_intrl - ;call points_local_intrl - ;call i2cm_intrl + call serialtx_intrl + call points_local_intrl + call i2cm_intrl panic morse_IL ;---------- diff --git a/detpic/serout.asm b/detpic/serout.asm index 4b3011a..ff06ac3 100644 --- a/detpic/serout.asm +++ b/detpic/serout.asm @@ -13,6 +13,7 @@ serial_addbyte ; mov_lfsr outbuf, 0 mov_ff outmsg_end, FSR0L + bs_f PIR1, TXIE ; ensure we get interrupted ;... serial_addbyte_another ; W byte to xmit to host trashed @@ -30,5 +31,78 @@ serial_addbyte_another ; too many panic morse_HB +;---------------------------------------------------------------------- +serialtx_intrl + bt_f_if1 INTCON, RBIF + rcall portb_read ; check flow control + + ; are we ready to transmit ? + bt_f_if0 PIR1, TXIF + return + bt_f_if0 PIR1, TXIE + return + + mov_lfsr outbuf, 0 + mov_fw outmsg_begin + mov_wf FSR0L + xor_wfw outmsg_end + bra_z tx_bufempty + + mov_fw INDF0 + mov_wf TXREG + bra_n tx_justsent_noacknmra + ; we've just sent the last byte of some message: + ; maybe we push an NMRADONE message on the front + mov_fw acknmra + bra_nz tx_acknmra_insert +tx_justsent_noacknmra + inc_f outmsg_begin + bc_f outmsg_begin, outbuf_szln2 + goto led_green + +tx_bufempty + ; maybe we send an NMRADONE + mov_fw acknmra + bra_nz tx_acknmra_send + ; nothing at all to do: + bc_f PIR1, TXIE + goto led_black + +tx_acknmra_insert + sub_wff acknmra ; we're acking these now + mov_wf INDF0 ; write it over the message we just sent + goto led_green + +tx_acknmra_send + sub_wff acknmra ; we're acking these now + mov_wf TXREG + goto led_green + +;---------------------------------------- +portb_read +; W undefined value from PORTB + mov_fw PORTB + bc_f INTCON, RBIF + + bt_w_if0 p0_rs232_fcin >> 4 + bra tx_fcdisable + ; tx enable: + + bs_f PIR1, TXIE + bc_f INTCON, RBIE + return + +tx_fcdisable + bc_f PIR1, TXIE + bs_f INTCON, RBIE + goto led_red + +;---------------------------------------------------------------------- +serialtxfc_init + bs_f INTCON, RBIE + bc_f INTCON2, RBIP + rcall porb_read + return + ;====================================================================== include final.inc