summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLeo C2019-05-03 21:32:11 +0200
committerLeo C2019-05-03 21:32:11 +0200
commit4d8aefb1047c9c80bc14a1c33bf71a9610c0256d (patch)
tree310ccf9c40299c4d273c96b99b6d16f9ac809b5b
parent80873aa27c7a3eccbd3858fdd5c39925ea7a2fcf (diff)
downloadz180-stamp-cpm3-4d8aefb1047c9c80bc14a1c33bf71a9610c0256d.zip
Implement output start-stop handling (Flags IXON, IXANY)
-rw-r--r--cbios/ascii.18066
1 files changed, 44 insertions, 22 deletions
diff --git a/cbios/ascii.180 b/cbios/ascii.180
index d3f6b20..5c93f1f 100644
--- a/cbios/ascii.180
+++ b/cbios/ascii.180
@@ -46,6 +46,7 @@ o.stat equ 5
b2m SXOFF,0
b2m TDC1,1
b2m TDC3,2
+ b2m TOFF,7
db 0
oint.iflags equ as0_dev+o.iflags-s0.inbuf
oint.fflags equ as0_dev+o.fflags-s0.inbuf
@@ -628,6 +629,9 @@ asci0_out:
ld ix,s0.outbuf ;
call ff_puth
pop ix ;
+ ld a,(as0_dev+o.stat) ;Transmitter stopped?
+ bit TOFF,a ;
+ ret nz ; yes
di ;
in0 a,(stat0) ;
or M_TIE ;
@@ -644,6 +648,9 @@ asci1_out:
ld ix,s1.outbuf ;
call ff_puth
pop ix ;
+ ld a,(as1_dev+o.stat) ;Transmitter stopped?
+ bit TOFF,a ;
+ ret nz ; yes
di ;
in0 a,(stat1) ;
or M_TIE ;
@@ -668,8 +675,6 @@ rtxisvjmp1:
.lall
asci_int macro dev
- local rxi_2,rxi_3
-
push ix
ld ix,s&dev&.inbuf ;
ld d,(ix+oint.fflags)
@@ -689,22 +694,36 @@ rxtxi&dev&_lp1:
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
+ ld c,(ix+o.in_idx) ;get input index
+ ld b,0 ;
+ ld hl,s&dev&.inbuf ; + base = input buffer pointer
+ add hl,bc ;
in0 b,(rdr&dev) ;get char
;todo: break detection
;todo: parity, framing, overrun error
ld (hl),b
-
-; bit IXON,d
-; jr z,rxi_2
- ;todo: test XON/XOFF
-rxi_2:
-
- ld a,c ;increment buffer in pointer
+ bit IXON,d
+ jr z,rxi&dev&_x3
+ ;test XON/XOFF
+ ld a,DC3
+ cp b
+ jr nz,rxi&dev&_x1
+ set TOFF,(ix+oint.stat) ;Stop transmitter
+ jr rxtxi&dev&_lp1
+rxi&dev&_x1:
+ ld a,DC1
+ cp b
+ jr nz,rxi&dev&_x2
+ res TOFF,(ix+oint.stat) ;Enable transmitter
+ jr rxi&dev&_txen
+rxi&dev&_x2:
+ bit IXANY,d
+ jr z,rxi&dev&_x3
+ res TOFF,(ix+oint.stat) ;Enable transmitter
+rxi&dev&_x3:
+
+ ld a,c ;increment input index
inc a ;
ld b,(ix+o.mask) ;
and b ;
@@ -718,12 +737,11 @@ rxi_2:
cp s&dev&.tx_len*3/4 ;buffer now 75% full?
jr nz,rxtxi&dev&_lp1
- if dev=0 ; only channel 0 has rts line
+ if dev=0 ;only channel 0 has rts line
bit CRTS_IFLOW,d
jr z,rxi0_nocrts
-
- in0 a,(cntla&dev) ;reset all error flags
- or M_RTS0+M_EFR ;RTS inactive
+ in0 a,(cntla&dev) ;
+ or M_RTS0+M_EFR ;RTS inactive
out0 (cntla0),a ;
rxi0_nocrts:
endif
@@ -732,6 +750,7 @@ rxi0_nocrts:
jr z,rxtxi&dev&_lp1
;send XOFF
set TDC3,(ix+oint.stat)
+rxi&dev&_txen:
set TIE,e ;
out0 (stat&dev),e ;
jr rxtxi&dev&_lp1
@@ -742,7 +761,7 @@ txi&dev:
; TX Interrupt
- ld a,(ix+oint.stat) ;check if xon/xoff should be sent
+ ld a,(ix+oint.stat) ;check whether xon/xoff should be sent
tst M_TDC1+M_TDC3 ;
jr z,txi&dev&_char ; no
@@ -757,7 +776,10 @@ txi&dev&_cch:
jp rxtxi&dev&_lp1 ;
txi&dev&_char:
- ld hl,s&dev&.outbuf+o.in_idx ;[in]
+ bit TOFF,(ix+oint.stat)
+ jr nz,txi&dev&_empty ;
+
+ ld hl,s&dev&.outbuf+o.in_idx ;[in]
ld a,(hl) ;
inc hl ;[out]
ld c,(hl) ;
@@ -769,15 +791,15 @@ txi&dev&_char:
ld a,(hl) ;
out0 (tdr&dev),a ;
inc c ;
- ld a,(s&dev&.outbuf+o.mask) ;
+ ld a,(s&dev&.outbuf+o.mask);
and c ;
- ld (s&dev&.outbuf+o.out_idx),a ;
+ ld (s&dev&.outbuf+o.out_idx),a ;
jp rxtxi&dev&_lp1
txi&dev&_empty:
res TIE,e ;disable tx-int
- out0 (stat&dev),e ; 5
+ out0 (stat&dev),e ;
rxtxi&dev&_exit:
pop ix