]> cloudbase.mooo.com Git - z180-stamp-cpm3.git/commitdiff
change message buffer initialization. cleanup
authorLeo C <erbl259-lmu@yahoo.de>
Fri, 5 Jun 2015 06:49:18 +0000 (08:49 +0200)
committerLeo C <erbl259-lmu@yahoo.de>
Fri, 5 Jun 2015 06:49:18 +0000 (08:49 +0200)
cbios/bioskrnl.180
cbios/boot.180
cbios/conbuf.180
cbios/misc.180
cbios/mm.180
cbios/msgbuf.180
cbios/utils.180

index f2cfde85331fa0fc5dcf38c2a5e3c86a680a24c4..04f4159f7a39989926fdd11290bff0197ac9760f 100644 (file)
@@ -156,27 +156,13 @@ d$init$loop:
        or      d\r
        jr      z,d$init$next   ; if null, no drive\r
        push    hl              ; save @drv pointer\r
-   if 0\r
-       ex      de,hl           ; XDPH address in <HL>\r
-       dec     hl\r
-       dec     hl\r
-       ld      b,(hl)          ; get relative drive code\r
-       ld      (@ADRV),bc      ; save absolute and relative drive code\r
-       dec     hl              ; point to init pointer\r
-       ld      d,(hl)\r
-       dec     hl\r
-       ld      e,(hl)          ; get init pointer\r
-       ex      de,hl\r
-       call    ipchl           ; call init routine\r
-   else\r
        push    de\r
-       pop     ix\r
+       pop     ix              ; XDPH address in <DE>\r
        ld      b,(ix-2)\r
        ld      (@ADRV),bc      ; save absolute and relative drive code\r
        ld      l,(ix-4)\r
        ld      h,(ix-3)        ; get init pointer\r
        call    ipchl           ; call init routine\r
-   endif\r
        pop     hl              ; recover @drv pointer\r
 d$init$next:\r
        pop     bc              ; recover counter and drive #\r
index 5256539589f9037a1f57875d538cab3d47d68598..c0ecc1155972c462658b1c4d84ea3f98b8d42e18 100644 (file)
        include z180reg.inc\r
 \r
 \r
-bdos   equ     5\r
-\r
 ccpsize        equ     0c80h\r
 \r
+       ; CP/M BDOS Function Interfaces\r
+\r
+resetdsk       equ     13\r
+open           equ     15\r
+read           equ     20\r
+setdma         equ     26\r
+setmulti       equ     44\r
+bdos           equ     5\r
+\r
+\r
         if     banked\r
 tpa$bank equ   1\r
         else\r
@@ -89,21 +97,26 @@ hwini_skip:
 \r
 ?ldccp:\r
                                ; First time, load the A:CCP.COM file into TPA\r
-       call    resetdsk\r
+       ld      c,resetdsk\r
+       call    bdos\r
        xor     a\r
        ld      (ccp$fcb+15),a  ; zero extent\r
        ld      hl,0\r
        ld      (fcb$nr),hl     ; start at beginning of file\r
        ld      de,ccp$fcb\r
-       call    open            ; open file containing CCP\r
+       ld      c,open          ; open file containing CCP\r
+       call    bdos\r
        inc     a\r
        jp      z,no$ccp        ; error if no file...\r
        ld      de,0100h\r
-       call    setdma          ; start of TPA\r
+       ld      c,setdma                ; start of TPA\r
+       call    bdos\r
        ld      de,128\r
-       call    setmulti        ; allow up to 16k bytes\r
+       ld      c,setmulti      ; allow up to 16k bytes\r
+       call    bdos\r
        ld      de,ccp$fcb\r
-       call    read            ; load the thing\r
+       ld      c,read          ; load the thing\r
+       call    bdos            ; read records\r
                                ; now,\r
                                ;   copy CCP to bank 0 for reloading\r
        ld      hl,0100h\r
@@ -119,11 +132,8 @@ ld$1:
        call    ?bnksl          ; select extra bank\r
        pop     af\r
        ld      (hl),a          ; save the byte\r
-       inc     hl\r
-       dec     bc              ; bump pointer, drop count\r
-       ld      a,b\r
-       or      c               ; test for done\r
-       jp      nz,ld$1\r
+       cpi                     ; bump pointer, drop count\r
+       jp      pe,ld$1\r
        pop     af\r
        call    ?bnksl          ; restore original bank\r
        ret\r
@@ -153,30 +163,6 @@ rl$1:
        ret\r
 \r
 \r
-       ; CP/M BDOS Function Interfaces\r
-\r
-resetdsk:\r
-       ld      c,13\r
-       jp      bdos            ; reset disk system\r
-\r
-open:\r
-       ld      c,15\r
-       jp      bdos            ; open file control block\r
-\r
-setdma:\r
-       ld      c,26\r
-       jp      bdos            ; set data transfer address\r
-\r
-setmulti:\r
-       ld      c,44\r
-       jp      bdos            ; set record count\r
-\r
-read:\r
-       ld      c,20\r
-       jp      bdos            ; read records\r
-\r
-\r
-\r
 ccp$fcb:db     1,'CCP     ','COM',0,0,0,0\r
        ds      16\r
 fcb$nr:        db      0,0,0\r
index 72756431ebe8afd497f680b3718c94e81fbae8a8..64d42dc1d70e9907cc78d7eb0e9ca9928fc4e091 100644 (file)
@@ -17,8 +17,8 @@
        mkbuf   ci.fifo_id, ci.fifo, ci.fifo_len\r
        mkbuf   co.fifo_id, co.fifo, co.fifo_len\r
 \r
-ici    equ     ci.fifo_id * 3\r
-ico    equ     co.fifo_id * 3\r
+ici    equ     ci.fifo_id * 2\r
+ico    equ     co.fifo_id * 2\r
 \r
 \r
 ;--------------------------------------------------------------\r
@@ -37,6 +37,8 @@ ff.init:
        jp      bufinit\r
 \r
 ;--------------------------------------------------------------\r
+; Input status\r
+; buffer is empty, if output index and input index are the same\r
 \r
        cseg\r
 ff.ist:\r
@@ -52,41 +54,40 @@ buf.empty:
        ret\r
 \r
 \r
+;--------------------------------------------------------------\r
+; Output status\r
+; buffer is full, if output index is one behind input index\r
+\r
 ff.in:\r
        push    ix\r
        ld      ix,(fifolst+ici)        ;\r
 \r
 buf.get:\r
-       ld      a,(ix+o.out_idx)        ;\r
+       push    ix\r
+       pop     hl\r
+       ld      c,(ix+o.out_idx)        ;\r
+       ld      b,0\r
+       add     hl,bc\r
+       ld      a,c\r
 bg.wait:\r
        cp      (ix+o.in_idx)           ;\r
        jr      z,bg.wait\r
-\r
-       push    hl                      ;\r
-       push    ix\r
-       pop     hl\r
-       add     a,l\r
-       ld      l,a\r
-       jr      nc,bg.nc\r
-       inc     h\r
-bg.nc:\r
-       ld      l,(hl)\r
-\r
-       ld      a,(ix+o.out_idx)        ;\r
+       ld      b,(hl)\r
+       ld      a,c                     ;\r
        inc     a\r
        and     (ix+o.mask)\r
        ld      (ix+o.out_idx),a\r
-\r
-       ld      a,l\r
-       pop     hl\r
+       ld      a,b\r
        pop     ix\r
        ret\r
 \r
 ;--------------------------------------------------------------\r
+; Output status\r
+; buffer is full, if output index is one behind input index\r
 \r
 ff.ost:\r
        push    ix\r
-       ld      ix,(fifolst+ico)                ;\r
+       ld      ix,(fifolst+ico)        ;\r
 \r
 buf.full:\r
        ld      a,(ix+o.in_idx)         ;\r
@@ -99,70 +100,36 @@ buf.full:
        ret\r
 \r
 \r
-       if 1\r
-ff.out:\r
-       push    ix                      ;15\r
-       ld      ix,(fifolst+ico)        ;\r
-\r
-buf.put:\r
-       push    hl                      ;11\r
-       push    bc                      ;11\r
-       push    ix                      ;15\r
-       pop     hl                      ;10\r
-       ld      a,c                     ;4\r
-       ld      c,(ix+o.in_idx)         ;19\r
-       ld      b,0                     ;7\r
-       add     hl,bc                   ;11\r
-       ld      (hl),a                  ;7\r
-       ld      b,a                     ;4\r
-\r
-       ld      a,c                     ;4\r
-       inc     a                       ;4\r
-       and     (ix+o.mask)             ;19\r
-bp.wait:\r
-       cp      (ix+o.out_idx)          ;19\r
-       jr      z,bp.wait               ;12/7\r
-       ld      (ix+o.in_idx),a         ;19\r
-\r
-       out     (AVRINT6),a             ;11\r
-       ld      a,b                     ;4\r
-       pop     bc                      ;10\r
-       pop     hl                      ;10\r
-       pop     ix                      ;14\r
-       ret                             ;10\r
-\r
-       else\r
+;--------------------------------------------------------------\r
+; put character in c in buffer\r
+; destroys hl, bc\r
+; returns output char in a\r
 \r
 ff.out:\r
-       push    ix                      ;15\r
-       ld      ix,co.fifo              ;14\r
-\r
+       push    ix                      ;\r
+       ld      ix,(fifolst+ico)        ;\r
 buf.put:\r
-       push    hl                      ;11\r
-       push    ix                      ;15\r
-       pop     hl                      ;10\r
-       ld      a,(ix+o.in_idx)         ;19\r
-       add     a,l                     ;4\r
-       ld      l,a                     ;4\r
-       jr      nc,bp.1                 ;12/7\r
-       inc     l                       ;4\r
-       ld      (hl),c                  ;7\r
-       ld      a,(ix+o.in_idx)         ;19\r
-       inc     a                       ;4\r
-       and     (ix+o.mask)             ;19\r
-bp.wait:\r
-       cp      (ix+o.out_idx)          ;19\r
-       jr      z,bp.wait               ;12/7\r
-       ld      (ix+o.in_idx),a         ;19\r
-\r
-       out     (AVRINT6),a             ;11\r
-       ld      a,c                     ;4\r
-       pop     hl                      ;10\r
-       pop     ix                      ;14\r
-       ret                             ;10             |\r
-\r
-       endif\r
-\r
-;--------------------------------------------------------------\r
+       push    ix                      ;\r
+       pop     hl                      ; get buffer start address\r
+\r
+       ld      a,c                     ;\r
+       ld      c,(ix+o.in_idx)         ; add input index\r
+       ld      b,0                     ;\r
+       add     hl,bc                   ;\r
+       ld      (hl),a                  ; one place is allways free\r
+       ld      b,a                     ;\r
+\r
+       ld      a,c                     ; bump input index\r
+       inc     a                       ;\r
+       and     (ix+o.mask)             ;\r
+bp.wait:                               ; do\r
+       cp      (ix+o.out_idx)          ;\r
+       jr      z,bp.wait               ; while new input idx == ouput idx\r
+       ld      (ix+o.in_idx),a         ;\r
+\r
+       out     (AVRINT6),a             ; tell monitor\r
+       ld      a,b                     ;\r
+       pop     ix                      ;\r
+       ret                             ;\r
 \r
        end\r
index b3e486d334898b331452e55f835cebe5ac02ba5b..ccb608ef364308be19a653bd01488e3286aae67b 100644 (file)
@@ -1,9 +1,10 @@
 
-       global intinit
-       global bufinit
-       global cpu_frq
+       public intinit
+       public bufinit
+       public cpu_frq
+       public get_tmr
 
-       global fifolst
+       public fifolst
 
        extrn div32_r,?pmsg
        extrn msg.sm,msg.recv,hwl2phy
@@ -94,7 +95,7 @@ cpu_frq:
        ld      hl,0
        ld      d,h
        ld      e,l
-       call    get_timer
+       call    get_tmr
        push    de
        push    hl
 
@@ -112,7 +113,7 @@ dly_lp:
 
        pop     hl
        pop     de
-       call    get_timer
+       call    get_tmr
 
        ld      b,h
        ld      c,l
@@ -132,10 +133,11 @@ cpuf_done:
 
 ;--------------------------------------------------------------------
 
-get_timer:
+       dseg
+get_tmr:
        push    de
        push    hl
-       ld      hl,1*256 + 3            ; d = subcommand, e = command
+       ld      hl,1*256 + 3            ; h = subcommand, l = command
        push    hl
        ld      hl,0
        add     hl,sp
@@ -161,7 +163,6 @@ get_timer:
 fifolst:
        rept 4
         dw     0
-        db     0
        endm
 
 ;--------------------------------------------------------------------
@@ -169,85 +170,47 @@ fifolst:
        dseg
 
 bufinit:
+       ld      (ix+o.in_idx),0         ;reset pointers (empty fifo)
+       ld      (ix+o.out_idx),0
        ld      a,(ix+o.id)
-       cp      4
-       jr      nc,bfi_doit2
-
        ld      hl,fifolst
        ld      e,a
        ld      d,0
        add     hl,de
        add     hl,de
-       add     hl,de
-
-   if 0
-       ld      e,(hl)
-       inc     hl
-       ld      d,(hl)
-       dec     hl
-       ld      a,e
-       or      d
-       jr      z,bfi_doit
-
-; TODO: address translation
-       push    de
-       pop     ix
-       ret
-   endif
-
-bfi_doit:
        push    ix
        pop     de
-; TODO: address translation
+       cp      4
+       jr      nc,bfi_skip
+
        ld      (hl),e
        inc     hl
        ld      (hl),d
-       ld      a,(ix+o.id)
-       or      a
-       jr      nz,bfi_doit2
 
-       ld      hl,fifolst
-       ld      (040h),hl
-       ld      (040h+2),a
-
-bfi_doit2:
-       ld      (ix+o.in_idx),0         ;reset pointers
-       ld      (ix+o.out_idx),0
-
-       push    ix                      ;get phys. address of fifo
-       pop     hl
-       call    hwl2phy
+bfi_skip:
        ex      de,hl
+       call    hwl2phy                 ;get phys. address of fifo
        ld      c,a
        ld      a,(ix+o.id)             ;fifo id
        or      a                       ;test if fifo 0
-       jr      nz,bfi_1
-
-       out     (AVRINT5),a
-       ret
+       ret     z
 
 bfi_1:
-       ld      hl,bfi_msg_end
-       ld      (hl),c
-       dec     hl
-       ld      (hl),d
-       dec     hl
-       ld      (hl),e
-       dec     hl
-       ld      (hl),a
-       dec     hl
-       ld      b,bfi_msg_len
+       ld      b,a
+       push    bc                      ;c: bank-addr, b: ignored
+       push    hl                      ;address
+       ld      c,0
+       push    bc                      ;c: function, b:subf
+       ld      b,5
+       ld      h,c
+       ld      l,c
+       add     hl,sp
        call    msg.sm
+       pop     hl
+       pop     hl
+       pop     hl
        ret
 
-bfi_msg:
-       db      0                       ;function: 0
-       db      0                       ;subfunc: gets overwritten with buf id
-       dw      0                       ;physical
-       db      0                       ;   address
-bfi_msg_len    equ $ - bfi_msg
-bfi_msg_end    equ $ - 1
-
 ;----------------------------------------------------------------------
 
 
index eb4135b505613eb397af04e8764f5246247372d2..9d1e2561f7e48290f43084c39b898fc5570cee7c 100644 (file)
@@ -148,10 +148,26 @@ hl2p_x:
 
        public  _b0call
 _b0call:
+       push    af
+       in0     a,(bbr)
+       jr      nz,b0c_doit
+       pop     af
 
+       ex      (sp),hl                 ;16
+       push    de
+       ld      e,(hl)
+       inc     hl
+       ld      d,(hl)
+       inc     hl
+       ld      (b0c_fast_go),de
+       pop     de
+       ex      (sp),hl                 ;16
+b0c_fast_go equ        $+1
+       jp      0
+
+b0c_doit:
        ld      (b0_save_hl),hl
        ld      (b0_save_de),de
-       push    af
        pop     hl
        ld      (b0_save_af),hl
 
@@ -181,12 +197,13 @@ _b0call:
        ld      sp,bs$stack             ;
 
        push    hl                      ;save   user stack pointer
-       in0     h,(cbar)                ;
+
+       in0     h,(bbr)                 ;
        push    hl                      ;
        ld      hl,b0c_ret
        push    hl
-       ld      a,SYS$CBAR              ;
-       out0    (cbar),a                ;
+       xor     a
+       out0    (bbr),a                 ;
        ex      de,hl                   ;ptr
        ld      e,(hl)                  ;get 'function address'
        inc     hl                      ;
@@ -203,7 +220,7 @@ b0c_ret:
        ld      (b0_save_hl),hl
 
        pop     hl                      ;
-       out0    (cbar),h                ;
+       out0    (bbr),h                 ;
        pop     hl                      ;
        ld      sp,hl                   ;
        ld      hl,(b0_save_hl)
index a5dfa493a243933a0c0897ae4c0c458b4f87badd..12d4861d7b1974137009215202b36acee4318ddd 100644 (file)
@@ -7,7 +7,7 @@
 ;      global  msg.sout\r
        global  msg.sm,msg.recv\r
 \r
-       extrn   bufinit\r
+       extrn   bufinit,hwl2phy\r
        extrn   fifolst\r
 \r
        include config.inc\r
        mkbuf   0,mtx.fifo,mtx.fifo_len\r
        mkbuf   1,mrx.fifo,mrx.fifo_len\r
 \r
-;txfifo_addr   equ     fifolst + (0*3)\r
-;rxfifo_addr   equ     fifolst + (1*3)\r
+;txfifo_addr   equ     fifolst + (0*2)\r
+;rxfifo_addr   equ     fifolst + (1*2)\r
 \r
-itx    equ     0*3\r
-irx    equ     1*3\r
+itx    equ     0*2\r
+irx    equ     1*2\r
 \r
 ;--------------------------------------------------------------\r
 ;\r
-; Init mssage fifos\r
+; Init message fifos\r
 ;\r
        dseg\r
 \r
@@ -38,18 +38,34 @@ msginit:
        jr      nz,msgi_1\r
 \r
        ld      hl,(040h)\r
+;TODO: physical to logical address translation\r
        ld      a,l\r
        or      h\r
        jr      z,msgi_1\r
 \r
        ld      de,fifolst\r
-       ld      bc,4*3\r
+       ld      bc,4*2\r
        ldir\r
        ret\r
 \r
 msgi_1:\r
+       ld      a,(043h)\r
+;TODO: value should be 0\r
        ld      ix,mtx.fifo\r
        call    bufinit\r
+\r
+       ld      hl,fifolst\r
+       call    hwl2phy\r
+       ld      (040h),hl\r
+       ld      (040h+2),a\r
+       ld      a,0ffh\r
+       ld      (043h),a\r
+       out     (AVRINT5),a\r
+wait:\r
+       ld      a,(043h)\r
+       or      a\r
+       jr      nz,wait\r
+\r
        ld      ix,mrx.fifo\r
        jp      bufinit\r
 \r
index f682d443e70c5b1b633fbb993c06c012357099a2..8157abab67fa83073137b0b48d8d7e3514c54394 100644 (file)
@@ -112,7 +112,7 @@ div32_r:
        add     hl,bc           ;low x + y/2
        pop     bc
        jr      nc,div_r1
-       inc     hl
+       inc     de
 div_r1:
        ;fall thru