]> cloudbase.mooo.com Git - z180-stamp-cpm3.git/blobdiff - cbios/ascii.180
Remove 'inidone' initialisation bypassing.
[z180-stamp-cpm3.git] / cbios / ascii.180
index d3f6b20fa5a73d1561c2678336e86ee5b7c37c32..3ffa931cf6da387cdf1725883377ccaa0c086d22 100644 (file)
@@ -46,6 +46,7 @@ o.stat                equ     5
        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
@@ -110,13 +111,6 @@ IOCTL_MAX equ      ($-ioctl_ftab)/2
 ;\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
@@ -155,8 +149,13 @@ init_st:
        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
@@ -218,18 +217,22 @@ mod_tab:
 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
@@ -260,8 +263,13 @@ func_tcseta:
        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
@@ -628,6 +636,9 @@ asci0_out:
        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
@@ -644,6 +655,9 @@ asci1_out:
        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
@@ -668,8 +682,6 @@ rtxisvjmp1:
 \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
@@ -689,22 +701,36 @@ rxtxi&dev&_lp1:
        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
@@ -718,12 +744,11 @@ rxi_2:
        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
@@ -732,6 +757,7 @@ rxi0_nocrts:
        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
@@ -742,7 +768,7 @@ txi&dev:
 \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
@@ -757,7 +783,10 @@ txi&dev&_cch:
        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
@@ -769,15 +798,15 @@ txi&dev&_char:
        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