chiark / gitweb /
transmit management - initial cut
authorian <ian>
Sun, 25 Dec 2005 16:56:56 +0000 (16:56 +0000)
committerian <ian>
Sun, 25 Dec 2005 16:56:56 +0000 (16:56 +0000)
detpic/program.asm
detpic/serout.asm

index d1909be00f7bad1cdcf05d40bd2cf0469658ee70..dbdfb682cc244a0ffc6abd765d81cbf41dd96f20 100644 (file)
@@ -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
 
 ;----------
index 4b3011a920482f82a197042bb8eb1005238fbd9f..ff06ac36353211d9b61a48ebb2957695af76471e 100644 (file)
@@ -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