From 99394318861405f5417a0ef46410e24adec9f57d Mon Sep 17 00:00:00 2001 From: Leo C Date: Tue, 30 Apr 2019 18:24:42 +0200 Subject: [PATCH] RX/TX int: Improve register allocation. TX int: Simplify/optimize flag handling. --- cbios/ascii.180 | 82 +++++++++++++++++++++++-------------------------- 1 file changed, 39 insertions(+), 43 deletions(-) diff --git a/cbios/ascii.180 b/cbios/ascii.180 index e75dd87..2353ae0 100644 --- a/cbios/ascii.180 +++ b/cbios/ascii.180 @@ -591,7 +591,7 @@ asci1_inp: di set TDC1,(ix+oint.stat) ; in0 a,(stat1) ; - or M_TIE, ; + or M_TIE ; out0 (stat1),a ; ei a1i_2: @@ -673,35 +673,35 @@ asci_int macro dev local rxi_2,rxi_3 push ix -rxtxi&dev&_lp0: ld ix,s&dev&.inbuf ; + ld d,(ix+oint.fflags) rxtxi&dev&_lp1: - in0 a,(stat&dev) ;receive flag set? + in0 e,(stat&dev) ;get asci status jp p,txi&dev ;RDRF == Bit 7 - and M_OVRN+M_PERR+M_FE - ld e,a - in0 a,(asext&dev) + ; RX Interrupt + + res BREAK,e + in0 a,(asext&dev) ;get break status and M_BREAK - or e + or e ;merge to other error flags ld e,a - in0 d,(cntla&dev) ; - res EFR,d ; - out0 (cntla&dev),d + in0 a,(cntla&dev) ;reset all error flags + and ~M_EFR ; + out0 (cntla&dev),a ; ld c,(ix+o.in_idx) ;input buffer pointer ld b,0 ld hl,s&dev&.inbuf ; add hl,bc - in0 a,(rdr&dev) ;get char - ld (hl),a + in0 b,(rdr&dev) ;get char ;todo: break detection - ;todo: parity, framing overrun error + ;todo: parity, framing, overrun error + ld (hl),b - ld e,(ix+oint.fflags) -; bit IXON,e +; bit IXON,d ; jr z,rxi_2 ;todo: test XON/XOFF rxi_2: @@ -724,46 +724,42 @@ rxi_2: jr nz,rxtxi&dev&_lp1 if dev=0 ; only channel 0 has rts line - bit CRTS_IFLOW,e + bit CRTS_IFLOW,d jr z,rxi0_nocrts - set EFR,d - set RTS0,d ;RTS inactive - out0 (cntla0),d ; + in0 a,(cntla&dev) ;reset all error flags + or M_RTS0+M_EFR ;RTS inactive + out0 (cntla0),a ; rxi0_nocrts: endif - bit IXOFF,e + bit IXOFF,d jr z,rxtxi&dev&_lp1 ;send XOFF set TDC3,(ix+oint.stat) - in0 a,(stat&dev) ; - set TIE,a ; - out0 (stat&dev),a ; + set TIE,e ; + out0 (stat&dev),e ; jr rxtxi&dev&_lp1 txi&dev: - ld e,a bit TDRE,e ;TX int? jr z,rxtxi&dev&_exit - ;todo: xon/xoff - bit IXOFF,(ix+oint.fflags) - jr z,txi&dev&_char -txi&dev&_dc1: - bit TDC1,(ix+oint.stat) - jr z,txi&dev&_dc3 - res TDC1,(ix+oint.stat) - ld a,DC1 - jr txi&dev&_dc1dc3 - -txi&dev&_dc3: - bit TDC3,(ix+oint.stat) - jr z,txi&dev&_char - res TDC3,(ix+oint.stat) - ld a,DC3 -txi&dev&_dc1dc3: - out0 (tdr&dev),a ; - jp rxtxi&dev&_lp0 + + ; TX Interrupt + + ld a,(ix+oint.stat) ;check if xon/xoff should be sent + tst M_TDC1+M_TDC3 ; + jr z,txi&dev&_char ; no + + ld l,DC3 ;prepare for xoff + bit TDC1,a ;request for xon (also) set? + jr z,txi&dev&_cch ; + ld l,DC1 ; +txi&dev&_cch: + out0 (tdr&dev),l ; + and ~(M_TDC1+M_TDC3) ;reset request flags + ld (ix+oint.stat),a ; + jp rxtxi&dev&_lp1 ; txi&dev&_char: ld hl,s&dev&.outbuf+o.in_idx ;[in] @@ -782,7 +778,7 @@ txi&dev&_char: and c ; ld (s&dev&.outbuf+o.out_idx),a ; - jp rxtxi&dev&_lp0 + jp rxtxi&dev&_lp1 txi&dev&_empty: res TIE,e ;disable tx-int -- 2.39.2