From: Leo C Date: Sat, 2 Jul 2016 08:17:17 +0000 (+0200) Subject: Unifiy asci0/asci1 interrupt routines X-Git-Tag: hexrel-6.9~16 X-Git-Url: http://cloudbase.mooo.com/gitweb/z180-stamp-cpm3.git/commitdiff_plain/5d7663e12c563f78fab15eeaf5ecbfcad39d8194 Unifiy asci0/asci1 interrupt routines --- diff --git a/cbios/ascii.180 b/cbios/ascii.180 index d329de4..ef9e1bb 100644 --- a/cbios/ascii.180 +++ b/cbios/ascii.180 @@ -512,6 +512,8 @@ asci0_inp: ld a,b cp s0.rx_len/4 jr nc,a0i_1 + bit CRTS_IFLOW,(ix+oint.fflags) + jr z,a0i_1 di in0 a,(cntla0) and ~M_RTS0 ;assert RTS @@ -593,54 +595,53 @@ asci1_out: cseg rtxisvjmp0: call isv_sw - dw rxtxi0 + dw asci0_int + rtxisvjmp1: call isv_sw - dw rxtxi1 + dw asci1_int ;-------------------------------------------------------------- -; ASCI 0 Transmit/Receive interupt routines +; ASCI 0/1 Transmit/Receive interupt routines + + .lall +asci_int macro dev + local rxi_2,rxi_4 - dseg -rxtxi0: push ix -rxtxi0_lp0: - ld ix,s0.inbuf ; -rxtxi0_lp1: - in0 a,(stat0) ;receive flag set? - jp p,rxtxi0_1 ;RDRF == Bit 7 +rxtxi&dev&_lp0: + ld ix,s&dev&.inbuf ; +rxtxi&dev&_lp1: + in0 a,(stat&dev) ;receive flag set? + jp p,txi&dev ;RDRF == Bit 7 and M_OVRN+M_PERR+M_FE ld e,a - in0 a,(asext0) + in0 a,(asext&dev) and M_BREAK or e ld e,a - in0 d,(cntla0) ; + in0 d,(cntla&dev) ; res EFR,d ; - out0 (cntla0),d - + out0 (cntla&dev),d ld c,(ix+o.in_idx) ; ld b,0 - ld hl,s0.inbuf ; + ld hl,s&dev&.inbuf ; add hl,bc - in0 a,(rdr0) ; + in0 a,(rdr&dev) ; ld (hl),a ;todo: break detection ;todo: parity, framing overrun error - ld e,(ix+oint.fflags) bit IXON,e - jr z,rxtxi0_2 - + jr z,rxi_2 ;todo: test XON/XOFF -rxtxi0_2: - +rxi_2: ld a,c ;increment buffer in pointer inc a ; @@ -649,124 +650,79 @@ rxtxi0_2: ld c,a sub (ix+o.out_idx) ; - jr z,rxtxi0_lp1 ;skip if buffer is full + jr z,rxtxi&dev&_lp1 ;skip if buffer is full ld (ix+o.in_idx),c ; jr nc,$+3 ; adc b ; - cp s0.tx_len*3/4 - jr c,rxi0_noflow + cp s&dev&.tx_len*3/4 + jr c,rxi&dev&_noflow + if dev=0 bit CRTS_IFLOW,e - jr z,rxtxi0_4 + jr z,rxi_4 set EFR,d set RTS0,d ;RTS inactive - out0 (cntla0),d ; + out0 (cntla&dev),d ; + endif -rxtxi0_4: +rxi_4: bit IXOFF,e - jr z,rxtxi0_lp1 + jr z,rxtxi&dev&_lp1 ;todo: send XOFF -rxi0_noflow: - jr rxtxi0_lp1 +rxi&dev&_noflow: + jr rxtxi&dev&_lp1 -rxtxi0_1: +txi&dev: ld e,a bit TDRE,e ;TX int? - jr z,rxtxi0_e ; - - - ld ix,s0.outbuf ; - - ld a,(ix+o.out_idx) ; - cp (ix+o.in_idx) ;if index.in == index.out - jr z,?0ti_2 ; buffer empty - - ld hl,s0.outbuf ; - ld c,a - ld b,0 - add hl,bc - ld b,(hl) - out0 (tdr0),b ; 7 + jr z,rxtxi&dev&_exit + + ;todo: xon/xoff + + ld hl,s&dev&.outbuf+o.in_idx ;[in] + ld a,(hl) ; + inc hl ;[out] + ld c,(hl) ; + cp c ; + jr z,txi&dev&_empty ; + inc hl ;fifo base + ld b,0 ; + add hl,bc ; + ld a,(hl) ; + out0 (tdr&dev),a ; + inc c ; + ld a,(s&dev&.outbuf+o.mask) ; + and c ; + ld (s&dev&.outbuf+o.out_idx),a ; - inc a - and (ix+o.mask) - ld (ix+o.out_idx),a - jr rxtxi0_lp0 + jr rxtxi&dev&_lp0 -?0ti_2: +txi&dev&_empty: res TIE,e ;disable tx-int - out0 (stat0),e ; 5 + out0 (stat&dev),e ; 5 -rxtxi0_e: +rxtxi&dev&_exit: pop ix ret - - -;-------------------------------------------------------------- -; ASCI 1 Transmit/Receive interupt routines + endm dseg -rxtxi1: - in0 e,(stat1) ;receive flag set? 5 - jp p,txi1_0 ; - - in0 d,(rdr1) ;todo: break detection 9 - bit FE,e ;framing error? - jr nz,??ri_1 - - push ix - ld ix,s1.inbuf ; - ld hl,s1.inbuf ; - ld c,(ix+o.in_idx) ; - ld b,0 - add hl,bc - ld (hl),d - - ld a,c ; - inc a - and (ix+o.mask) - cp (ix+o.out_idx) ; - jr z,$+5 ;skip if buffer is full - ld (ix+o.in_idx),a - pop ix -??ri_1: - in0 a,(cntla1) ; 1 - res EFR,a ; - out0 (cntla1),a ; 1 - ret - -txi1_0: - push ix - ld ix,s1.outbuf ; +;-------------------------------------------------------------- +; ASCI 0 Transmit/Receive interupt routines - ld a,(ix+o.out_idx) ; - cp (ix+o.in_idx) ;if index.in == index.out - jr z,??ti_2 ; buffer empty - - ld hl,s1.outbuf ; - ld c,a - ld b,0 - add hl,bc - ld l,(hl) - out0 (tdr1),l ; 7 - - inc a - and (ix+o.mask) - ld (ix+o.out_idx),a - jr ??ti_3 -??ti_2: - res TIE,e ;disable tx-int - out0 (stat1),e ; 5 -??ti_3: - pop ix - ret +asci0_int: + asci_int 0 +;-------------------------------------------------------------- +; ASCI 1 Transmit/Receive interupt routines +asci1_int: + asci_int 1 end diff --git a/cbios/fifo.180 b/cbios/fifo.180 index ca2924a..e818c5a 100644 --- a/cbios/fifo.180 +++ b/cbios/fifo.180 @@ -120,12 +120,13 @@ ff_gech: ld c,(ix+o.out_idx) ; ld b,0 add hl,bc - jr $+3 gech.wait: - halt ld a,(ix+o.in_idx) ; sub c - jr z,gech.wait + jr nz,gech.cont + halt + jr gech.wait +gech.cont: jr nc,$+5 adc (ix+o.mask) ; mask+carry == buffer size dec a