summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLeo C2019-04-30 18:24:42 +0200
committerLeo C2019-04-30 18:27:07 +0200
commit99394318861405f5417a0ef46410e24adec9f57d (patch)
tree0a4ce8d2e983313aca5fa989bdb4e264cd4efab1
parent59a12b33798a590eb00f7c80809ee5c3b8970538 (diff)
downloadz180-stamp-cpm3-99394318861405f5417a0ef46410e24adec9f57d.zip
RX/TX int: Improve register allocation. TX int: Simplify/optimize flag handling.
-rw-r--r--cbios/ascii.18082
1 files 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