diff options
author | Leo C | 2019-05-03 21:32:11 +0200 |
---|---|---|
committer | Leo C | 2019-05-03 21:32:11 +0200 |
commit | 4d8aefb1047c9c80bc14a1c33bf71a9610c0256d (patch) | |
tree | 310ccf9c40299c4d273c96b99b6d16f9ac809b5b | |
parent | 80873aa27c7a3eccbd3858fdd5c39925ea7a2fcf (diff) | |
download | z180-stamp-cpm3-4d8aefb1047c9c80bc14a1c33bf71a9610c0256d.zip |
Implement output start-stop handling (Flags IXON, IXANY)
-rw-r--r-- | cbios/ascii.180 | 66 |
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
|