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
;----------
;
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
; 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