b2m SXOFF,0\r
b2m TDC1,1\r
b2m TDC3,2\r
+ b2m TOFF,7\r
db 0\r
oint.iflags equ as0_dev+o.iflags-s0.inbuf\r
oint.fflags equ as0_dev+o.fflags-s0.inbuf\r
;\r
\r
asci_ioctl:\r
- ld a,b\r
- cp 1\r
- jr nz,asioc_1\r
- ld a,(inidone)\r
- cp inidoneval\r
- ret z\r
-asioc_1:\r
push hl\r
ex (sp),ix\r
ld (ix+o.absdev),b\r
ld b,(ix+o.absdev)\r
ld c,8 ;\r
mlt bc ;\r
- ld hl,@ctbl+7 ;\r
+ ld hl,@ctbl+6 ;\r
add hl,bc ;\r
+ res IXON,(ix+o.fflags)\r
+ bit mbxon_bit,(hl) ;get cpm3 xon flag\r
+ jr z,$+6\r
+ set IXON,(ix+o.fflags)\r
+ inc hl\r
ld a,(hl) ;get baudrate index\r
call as_br_div\r
ld c,astc0l\r
func_tcgeta:\r
call chk_ptr\r
\r
+ ld b,(ix+o.absdev)\r
+ ld c,8 ;\r
+ mlt bc ;\r
+ ld hl,@ctbl+6 ;\r
+ add hl,bc ;\r
+ res IXON,(ix+o.fflags)\r
+ bit mbxon_bit,(hl) ;get cpm3 xon flag\r
+ jr z,$+6\r
+ set IXON,(ix+o.fflags)\r
+ inc hl\r
ld a,(ix+o.iflags)\r
call b_st_a\r
inc de\r
ld a,(ix+o.fflags)\r
call b_st_a\r
inc de\r
-\r
- ld b,(ix+o.absdev)\r
- ld c,8 ;\r
- mlt bc ;\r
- ld hl,@ctbl+7 ;\r
- add hl,bc ;\r
ld a,(hl) ;get baudrate index\r
and M_CBAUD\r
ld b,a\r
ld b,(ix+o.absdev)\r
ld c,8 ;\r
mlt bc ;\r
- ld hl,@ctbl+7 ;\r
+ ld hl,@ctbl+6 ;\r
add hl,bc ;\r
+ res mbxon_bit,(hl)\r
+ bit IXON,a\r
+ jr z,$+4\r
+ set mbxon_bit,(hl)\r
+ inc hl\r
call b_ld_a\r
ld (ix+o.cflags),a\r
and M_CBAUD\r
ld ix,s0.outbuf ;\r
call ff_puth\r
pop ix ;\r
+ ld a,(as0_dev+o.stat) ;Transmitter stopped?\r
+ bit TOFF,a ;\r
+ ret nz ; yes\r
di ;\r
in0 a,(stat0) ;\r
or M_TIE ;\r
ld ix,s1.outbuf ;\r
call ff_puth\r
pop ix ;\r
+ ld a,(as1_dev+o.stat) ;Transmitter stopped?\r
+ bit TOFF,a ;\r
+ ret nz ; yes\r
di ;\r
in0 a,(stat1) ;\r
or M_TIE ;\r
\r
.lall\r
asci_int macro dev\r
- local rxi_2,rxi_3\r
-\r
push ix\r
ld ix,s&dev&.inbuf ;\r
ld d,(ix+oint.fflags)\r
and ~M_EFR ;\r
out0 (cntla&dev),a ;\r
\r
- ld c,(ix+o.in_idx) ;input buffer pointer\r
- ld b,0\r
- ld hl,s&dev&.inbuf ;\r
- add hl,bc\r
+ ld c,(ix+o.in_idx) ;get input index\r
+ ld b,0 ;\r
+ ld hl,s&dev&.inbuf ; + base = input buffer pointer\r
+ add hl,bc ;\r
\r
in0 b,(rdr&dev) ;get char\r
;todo: break detection\r
;todo: parity, framing, overrun error\r
ld (hl),b\r
-\r
-; bit IXON,d\r
-; jr z,rxi_2\r
- ;todo: test XON/XOFF\r
-rxi_2:\r
-\r
- ld a,c ;increment buffer in pointer\r
+ bit IXON,d\r
+ jr z,rxi&dev&_x3\r
+ ;test XON/XOFF\r
+ ld a,DC3\r
+ cp b\r
+ jr nz,rxi&dev&_x1\r
+ set TOFF,(ix+oint.stat) ;Stop transmitter\r
+ jr rxtxi&dev&_lp1\r
+rxi&dev&_x1:\r
+ ld a,DC1\r
+ cp b\r
+ jr nz,rxi&dev&_x2\r
+ res TOFF,(ix+oint.stat) ;Enable transmitter\r
+ jr rxi&dev&_txen\r
+rxi&dev&_x2:\r
+ bit IXANY,d\r
+ jr z,rxi&dev&_x3\r
+ res TOFF,(ix+oint.stat) ;Enable transmitter\r
+rxi&dev&_x3:\r
+\r
+ ld a,c ;increment input index\r
inc a ;\r
ld b,(ix+o.mask) ;\r
and b ;\r
cp s&dev&.tx_len*3/4 ;buffer now 75% full?\r
jr nz,rxtxi&dev&_lp1\r
\r
- if dev=0 ; only channel 0 has rts line\r
+ if dev=0 ;only channel 0 has rts line\r
bit CRTS_IFLOW,d\r
jr z,rxi0_nocrts\r
-\r
- in0 a,(cntla&dev) ;reset all error flags\r
- or M_RTS0+M_EFR ;RTS inactive\r
+ in0 a,(cntla&dev) ;\r
+ or M_RTS0+M_EFR ;RTS inactive\r
out0 (cntla0),a ;\r
rxi0_nocrts:\r
endif\r
jr z,rxtxi&dev&_lp1\r
;send XOFF\r
set TDC3,(ix+oint.stat)\r
+rxi&dev&_txen:\r
set TIE,e ;\r
out0 (stat&dev),e ;\r
jr rxtxi&dev&_lp1\r
\r
; TX Interrupt\r
\r
- ld a,(ix+oint.stat) ;check if xon/xoff should be sent\r
+ ld a,(ix+oint.stat) ;check whether xon/xoff should be sent\r
tst M_TDC1+M_TDC3 ;\r
jr z,txi&dev&_char ; no\r
\r
jp rxtxi&dev&_lp1 ;\r
\r
txi&dev&_char:\r
- ld hl,s&dev&.outbuf+o.in_idx ;[in]\r
+ bit TOFF,(ix+oint.stat)\r
+ jr nz,txi&dev&_empty ;\r
+\r
+ ld hl,s&dev&.outbuf+o.in_idx ;[in]\r
ld a,(hl) ;\r
inc hl ;[out]\r
ld c,(hl) ;\r
ld a,(hl) ;\r
out0 (tdr&dev),a ;\r
inc c ;\r
- ld a,(s&dev&.outbuf+o.mask) ;\r
+ ld a,(s&dev&.outbuf+o.mask);\r
and c ;\r
- ld (s&dev&.outbuf+o.out_idx),a ;\r
+ ld (s&dev&.outbuf+o.out_idx),a ;\r
\r
jp rxtxi&dev&_lp1\r
\r
txi&dev&_empty:\r
res TIE,e ;disable tx-int\r
- out0 (stat&dev),e ; 5\r
+ out0 (stat&dev),e ;\r
\r
rxtxi&dev&_exit:\r
pop ix\r