From 3134af6c1994239c31bfb2aa9a2ca50976d40c53 Mon Sep 17 00:00:00 2001 From: Leo C Date: Fri, 19 Apr 2019 00:28:56 +0200 Subject: [PATCH] Initial XON/XOFF input control (Holm. T) --- cbios/ascii.180 | 61 +++++++++++++++++++++++++++++++++---------------- cbios/ioctl.inc | 3 +++ 2 files changed, 44 insertions(+), 20 deletions(-) diff --git a/cbios/ascii.180 b/cbios/ascii.180 index fbe193d..0a2fd6f 100644 --- a/cbios/ascii.180 +++ b/cbios/ascii.180 @@ -58,7 +58,7 @@ as1_dev: db 0 ;absolute device # db 1 ;relative device db 0 ;iflags - db M_CREAD ;fflags + db M_CREAD+M_IXOFF ;fflags db M_CS8 ;cflags db 0 @@ -108,9 +108,8 @@ asci_ioctl: ld a,b cp 1 jr nz,asioc_1 - ld a,(INIDONE) - and 80h - cp INIDONEVAL + ld a,(inidone) + cp inidoneval ret z asioc_1: push hl @@ -546,12 +545,12 @@ asci0_inp: push ix ld ix,s0.inbuf ; call ff_gech - ld a,b - cp s0.rx_len/4 - jr nc,a0i_1 - bit CRTS_IFLOW,(ix+oint.fflags) - jr z,a0i_1 - di + ld a,b ;remaining chrs in buffer + cp s0.rx_len/4 ; < 32? + jr nc,a0i_1 ; no, just get char + bit CRTS_IFLOW,(ix+oint.fflags) ; yes, enable RTS if needed + jr z,a0i_1 ; no needed + di ; needed, enable in0 a,(cntla0) and ~M_RTS0 ;assert RTS or M_EFR ;don't reset error flags @@ -569,6 +568,20 @@ asci1_inp: push ix ld ix,s1.inbuf ; call ff_gech + ld a,b ; remaining chars in buffer + cp s0.rx_len/4 ; == 25% full? + jr nz,a1i_2 ; no, just get char + bit IXOFF,(ix+oint.fflags) ; XON/XOFF on input? + jr z,a1i_2 ; no +; di +a1i_1: in0 a,(stat1) ; status reg ASCI1 + bit TDRE,a ; Transmitter Data Reg. empty? + jr z,a1i_1 ; no, wait + ld a,11h ; DC1/XON + out0 (tdr1),a ; send out +; ei +a1i_2: + ld a,c ; get back the char pop ix ret @@ -643,7 +656,7 @@ rtxisvjmp1: .lall asci_int macro dev - local rxi_2,rxi_4 + local rxi_2,rxi_3,rxi_4 push ix rxtxi&dev&_lp0: @@ -663,20 +676,17 @@ rxtxi&dev&_lp1: res EFR,d ; out0 (cntla&dev),d - ld c,(ix+o.in_idx) ; + ld c,(ix+o.in_idx) ;input buffer pointer ld b,0 ld hl,s&dev&.inbuf ; add hl,bc - in0 a,(rdr&dev) ; + in0 a,(rdr&dev) ;get char ld (hl),a ;todo: break detection ;todo: parity, framing overrun error ld e,(ix+oint.fflags) - bit IXON,e - jr z,rxi_2 - ;todo: test XON/XOFF rxi_2: @@ -689,7 +699,7 @@ rxi_2: sub (ix+o.out_idx) ; jr z,rxtxi&dev&_lp1 ;skip if buffer is full - ld (ix+o.in_idx),c ; + ld (ix+o.in_idx),c ;input buffer pointer jr nc,$+3 ; adc b ; @@ -705,12 +715,23 @@ rxi_2: set RTS0,d ;RTS inactive out0 (cntla&dev),d ; endif + if dev=1 + bit IXOFF,e + jr z,rxi_4 + +; di +rxi_3: in0 a,(stat&dev) ; status reg ASCI1 + bit TDRE,a ; Transmitter Data Reg. empty? + jr z,rxi_3 ; no, wait + ld a,DC3 ; DC3/XOFF + out0 (tdr&dev),a ; send out +; ei + endif rxi_4: - bit IXOFF,e - jr z,rxtxi&dev&_lp1 +; bit IXOFF,e +; jr z,rxtxi&dev&_lp1 ;todo: send XOFF - rxi&dev&_noflow: jr rxtxi&dev&_lp1 diff --git a/cbios/ioctl.inc b/cbios/ioctl.inc index 8d1f303..b2797f2 100644 --- a/cbios/ioctl.inc +++ b/cbios/ioctl.inc @@ -102,3 +102,6 @@ TIOCM_CD equ 010h ;DCD (data carrier detect) TIOCM_RI equ 020h ;RNG (ring) TIOCM_DSR equ 040h ;DSR (data set ready) TIOCM_OUT1 equ 080h ; + +DC1 equ 011h ; DC1/XON +DC3 equ 013h ; DC3/XOFF -- 2.39.2