]> cloudbase.mooo.com Git - z180-stamp.git/commitdiff
Z180 banking updates
authorLeo C <erbl259-lmu@yahoo.de>
Tue, 5 May 2015 13:42:49 +0000 (15:42 +0200)
committerLeo C <erbl259-lmu@yahoo.de>
Tue, 5 May 2015 13:42:49 +0000 (15:42 +0200)
z180/config.inc
z180/init.180
z180/msgbuf-a.180

index ed98656c936f9214df8b2fd109f3b7579167647b..33152de2bd8beb1d214264eb76080d5c643629d3 100644 (file)
@@ -2,6 +2,8 @@
 FALSE  equ     0\r
 TRUE   equ     NOT FALSE\r
 \r
+banked equ     true\r
+\r
 ;-----------------------------------------------------\r
 ; CPU and BANKING types\r
 \r
@@ -35,7 +37,7 @@ PRT_TC10MS    equ     PHI / (PRT_PRE/10)
 COMMON_SIZE    equ     4*1024          ;Common Area size in bytes\r
                                        ;must be multiple of 4K\r
 \r
-if (COMMON_SIZE mod 1000h) \r
+if (COMMON_SIZE mod 1000h)\r
        .printx COMMON_SIZE not multiple of 4K!\r
        end     ;stop assembly\r
 endif\r
@@ -168,4 +170,3 @@ inidate     macro
        dseg\r
        ds      ??ps.len\r
        endm\r
-\r
index 73a77bb76767314502278b9ae0fe5a777eabcab0..f43aaeb9eaab90bf2371e17cdf93def37165867c 100644 (file)
@@ -234,51 +234,6 @@ buf.init:
        ld      (ix+o.mask),a\r
        ret\r
 \r
-;----------------------------------------------------------------------\r
-if 0\r
-       extrn   msginit,msg_tx_fifo,msg_rx_fifo\r
-       extrn   msg.sout\r
-\r
-bufferinit:\r
-\r
-       ld      de,msg_tx_fifo\r
-       in0     a,cbr\r
-       call    log2phys\r
-       ld      (40h+0),hl\r
-       ld      (40h+2),a\r
-\r
-;      ld      (bufdat+1),hl\r
-;      ld      (bufdat+3),a\r
-;      ld      a,1\r
-;      ld      (bufdat+0),a\r
-;      ld      hl,inimsg\r
-;      call    msg.sout\r
-\r
-       ld      de,msg_rx_fifo\r
-       in0     a,cbr\r
-       call    log2phys\r
-       ld      (bufdat+1),hl\r
-       ld      (bufdat+3),a\r
-       ld      a,2\r
-       ld      (bufdat+0),a\r
-       ld      hl,inimsg\r
-       call    msg.sout\r
-\r
-       ret\r
-\r
-inimsg:\r
-       db      inimsg_e - $ - 1\r
-       db      0AEh\r
-       db      inimsg_e - $ - 1\r
-       db      0\r
-bufdat:\r
-       db      0\r
-       dw      0\r
-       db      0\r
-inimsg_e:\r
-\r
-endif\r
-\r
 ;----------------------------------------------------------------------\r
 \r
        extrn   msginit,msg.sout\r
@@ -300,27 +255,27 @@ bfi_1:
        inc     hl\r
        ld      d,(hl)\r
        inc     hl\r
-       push    hl\r
+       ex      de,hl\r
 \r
        or      a\r
        jr      nz,bfi_2\r
-       call    hw_log2phys\r
+       call    hwl2phy\r
        ld      (40h+0),hl\r
        ld      (40h+2),a\r
-       out0    (AVRINT5),a\r
+       out     (AVRINT5),a\r
        jr      bfi_3   \r
 bfi_2:\r
-       call    hw_log2phys\r
+       call    hwl2phy\r
        ld      (bufdat+1),hl\r
        ld      (bufdat+3),a\r
        ld      hl,inimsg\r
        call    msg.sout\r
 bfi_3:\r
-       pop     hl\r
+       ex      de,hl\r
        djnz    bfi_1\r
        ret\r
 \r
-    else\r
+    else ;CPU_Z180\r
 \r
        call    msginit\r
 \r
@@ -340,7 +295,7 @@ bfi_1:
        jr      nz,bfi_2\r
 \r
        ld      a,(@cbnk)\r
-       call    bnk2phys\r
+       call    bnk2phy\r
 \r
        ld      (40h+0),hl\r
        ld      (40h+2),a\r
@@ -349,7 +304,7 @@ bfi_1:
 bfi_2:\r
 \r
        ld      a,(@cbnk)\r
-       call    bnk2phys\r
+       call    bnk2phy\r
 \r
        ld      (bufdat+1),hl\r
        ld      (bufdat+3),a\r
@@ -548,115 +503,109 @@ io.ini.l:
 ;\r
     if CPU_Z180\r
 \r
-; a: Bank number\r
+;--------------------------------------------------------------------\r
+; Return the BBR value for the given bank number\r
 ;\r
+; in  a: Bank number\r
 ; out a: bbr value\r
 \r
 bnk2log:\r
-       push    bc\r
-       ld      b,a\r
-       ld      c,CA\r
-       mlt     bc\r
-       add     a,10h\r
-       pop     bc\r
-       ret\r
+       or      a               ;\r
+       ret     z               ; Bank 0 is at physical address 0\r
 \r
-; de: Log. Address\r
-;  a: Bank number\r
+       push    bc              ;\r
+       ld      b,a             ;\r
+       ld      c,CA            ;\r
+       mlt     bc              ;\r
+       ld      a,c             ;\r
+       add     a,10h           ;\r
+       pop     bc              ;\r
+       ret                     ;\r
+\r
+;--------------------------------------------------------------\r
+\r
+;in  hl: Log. Address\r
+;     a: Bank number\r
 ;\r
 ;out ahl: Phys. (linear) Address\r
 \r
 \r
-bnk2phys:\r
+bnk2phy:\r
        call    bnk2log\r
-\r
        ; fall thru\r
+\r
 ;--------------------------------------------------------------\r
 ;\r
-; de: Log. Address\r
+; hl: Log. Address\r
 ;  a: Bank base (bbr)\r
 ;\r
-; OP: ahl = (a<<12) + (d<<8) + e\r
+;           2           0       0\r
+;           0   6       8       0\r
+; hl             hhhhhhhhllllllll\r
+;  a   +     bbbbbbbb\r
+;\r
+; OP: ahl = (a<<12) + (h<<8) + l\r
 ;\r
 ;out ahl: Phys. (linear) Address\r
 \r
-\r
-log2phys:\r
+log2phy:\r
        push    bc              ;\r
+l2p_i:\r
        ld      c,a             ;\r
        ld      b,16            ;\r
-       mlt     bc              ;  bc = a<<4\r
-       ld      l,d             ;4\r
-       ld      h,0             ;6\r
-       add     hl,bc           ;7  bc + d == a<<4 + d\r
-       ld      a,h             ;4\r
-       ld      h,l             ;4\r
-       ld      l,e             ;4\r
-       pop     bc              ;\r
-       ret                     ;\r
-\r
-    if 0\r
-    \r
-log2phys:\r
-       push    bc              ;\r
-       ld      b,a             ;\r
-       ld      c,16            ;\r
        mlt     bc              ; bc = a<<4\r
-       ld      a,c             ;4\r
-       add     a,h             ;4\r
-       ld      h,a             ;4\r
-       ld      a,b             ;4\r
-       adc     a,0             ;6\r
+       ld      a,c             ;\r
+       add     a,h             ;\r
+       ld      h,a             ;\r
+       ld      a,b             ;\r
+       adc     a,0             ;\r
        pop     bc              ;\r
        ret                     ;\r
 \r
-    endif\r
 ;--------------------------------------------------------------\r
 ;\r
-; de: Log. Address\r
-; \r
+; hl: Log. Address\r
+;\r
 ;\r
 ; OP: ahl = (bankbase<<12) + (d<<8) + e\r
 ;\r
 ;out ahl: Phys. (linear) Address\r
 \r
 \r
-hw_log2phys:\r
+hwl2phy:\r
        push    bc              ;\r
-       in0     c,(cbar)\r
-       ld      a,d\r
-       or      00fh\r
+       in0     c,(cbar)        ;\r
+       ld      a,h             ;\r
+       or      00fh            ; log. addr in common1?\r
        cp      c\r
        jr      c,hlp_1\r
-       in0     c,(cbr)\r
-       jr      hlp_e\r
+\r
+       in0     a,(cbr)         ; yes, cbr is address base\r
+       jr      hl2p_x\r
 hlp_1:\r
-       ld      b,16\r
+       ld      b,16            ; log. address in baked area?\r
        mlt     bc\r
-       ld      a,d\r
+       ld      a,h\r
        cp      c\r
-       ld      c,0\r
-       jr      c,hlp_e\r
-       in0     c,(bbr)\r
-hlp_e: \r
-       ld      b,16            ;\r
-       mlt     bc              ;bc = a<<4\r
-       ld      l,d             ;\r
-       ld      h,0             ;\r
-       add     hl,bc           ;bc + d == a<<4 + d\r
-       ld      a,h             ;\r
-       ld      h,l             ;\r
-       ld      l,e             ;\r
-       pop     bc              ;\r
+       jr      c,hlp_2\r
+       in0     a,(bbr)         ; yes, bbr is address base\r
+       jr      hl2p_x\r
+hlp_2:\r
+       xor     a               ; common1\r
+hl2p_x:\r
+       jr      nz,l2p_i\r
+\r
+       pop     bc              ; bank part is 0, no translation\r
        ret                     ;\r
 \r
-    else\r
 \r
-;\r
+\r
+    else       ;CPU_Z180\r
+\r
 ;----------------------------------------------------------------------\r
 ;\r
 \r
-bnk2phys:\r
+bnk2phy:\r
        sla     h\r
        jr      nc,b2p_1                ;A15=1 --> common\r
        ld      a,3\r
@@ -693,18 +642,18 @@ topcodsys:
 ; Save cbar\r
 \r
 isv_sw:                                ;\r
-       ex (sp),hl              ;       save hl, return adr in hl\r
+       ex (sp),hl              ;save hl, 'return adr' in hl\r
        push de                 ;\r
        push af                 ;\r
-       ex de,hl                ;\r
+       ex de,hl                ;'return address' in de\r
        ld hl,0                 ;\r
        add hl,sp               ;\r
        ld a,h                  ;\r
        cp 0f8h                 ;\r
-       jr nc,isw_1             ;\r
+       jr nc,isw_1             ;stack allready in top ram\r
        ld sp,$stack            ;\r
 isw_1:\r
-       push hl                 ;\r
+       push hl                 ;save user stack pointer\r
        in0 h,(cbar)            ;\r
        push hl                 ;\r
        ld a,SYS$CBAR           ;\r
index 1bdd826e27d2bee89f24af427e7d4921e04ac4e1..ddb2d93888cc869416d99658089022852d99cb21 100644 (file)
@@ -1,11 +1,11 @@
        page    255\r
        .z80\r
-       \r
+\r
        global  mrx.fifo,mtx.fifo\r
 \r
        global  msginit,msgi.st,msg.in,msgo.st,msg.out\r
        global  msg.sout\r
-       \r
+\r
        extrn   buf.init\r
 \r
        include config.inc\r
@@ -27,7 +27,7 @@
 ;\r
 ; Init buffer\r
 ;\r
-       \r
+\r
 msginit:\r
        ld      ix,mrx.fifo\r
        ld      a,mrx.fifo.mask\r
@@ -49,7 +49,7 @@ buf.empty:
        ret     z\r
        or      0ffh\r
        ret\r
-       \r
+\r
 ;--------------------------------------------------------------\r
 \r
 msg.in:\r
@@ -71,12 +71,12 @@ bg.wait:
        inc     h\r
 bg.nc:\r
        ld      l,(hl)\r
-       \r
+\r
        ld      a,(ix+o.out_idx)        ;\r
        inc     a\r
        and     (ix+o.mask)\r
        ld      (ix+o.out_idx),a\r
-       \r
+\r
        ld      a,l\r
        pop     hl\r
        pop     ix\r
@@ -100,6 +100,8 @@ buf.full:
 \r
 ;--------------------------------------------------------------\r
 \r
+    if 0\r
+\r
 msg.out:\r
        push    ix\r
        ld      ix,mtx.fifo             ;\r
@@ -122,7 +124,7 @@ bp.wait:
        jr      z,bp.wait\r
        ld      (hl),b\r
        ld      (ix+o.in_idx),a\r
-       \r
+\r
        ld      a,b\r
        out     (AVRINT5),a\r
        pop     bc\r
@@ -130,50 +132,154 @@ bp.wait:
        pop     ix\r
        ret\r
 \r
+    endif\r
 \r
 ;--------------------------------------------------------------\r
-;\r
-; (hl): data\r
 \r
-msg.sout:\r
+\r
+\r
+msg.out:\r
        push    ix\r
        ld      ix,mtx.fifo             ;\r
 \r
+buf.put:\r
        push    bc\r
-       push    de\r
-       ld      b,(hl)                  ;\r
-       inc     hl\r
-       ex      de,hl\r
-       \r
-ms.ol:\r
-       push    ix\r
-       pop     hl\r
        ld      c,(ix+o.in_idx)         ;\r
-       ld      a,c\r
-       add     l\r
-       ld      l,a\r
-       jr      nc,ms.on\r
-       inc     h\r
-ms.on:\r
+       ld      b,0\r
+       push    ix                      ;14\r
+       add     ix,bc                   ;10\r
+       ld      (ix+0),a                ;15\r
+       pop     ix                      ;12 / 51\r
+       ld      b,a                     ; 4\r
        ld      a,c                     ;\r
-       inc     a\r
-       and     (ix+o.mask)\r
-ms.wait:\r
+       inc     a                       ;\r
+       and     (ix+o.mask)             ;\r
+bp.wait:\r
        cp      (ix+o.out_idx)          ;\r
-       jr      z,ms.wait\r
-       ld      c,a\r
-       ld      a,(de)\r
-       inc     de\r
-       ld      (hl),a\r
-       ld      (ix+o.in_idx),c\r
-       djnz    ms.ol\r
+       jr      z,bp.wait               ;\r
+       ld      (ix+o.in_idx),a         ;\r
+\r
+       ld      a,b\r
        out     (AVRINT5),a\r
-       ex      de,hl\r
-       pop     de\r
        pop     bc\r
        pop     ix\r
        ret\r
 \r
+\r
+;--------------------------------------------------------------\r
+\r
+    if 0\r
+       ; Works only, if buffer size < (128 - 3)\r
+       ;       --> mask must be 03fh or less\r
+\r
+msg.out:\r
+       push    ix\r
+       ld      ix,mtx.fifo             ;\r
+\r
+buf.put:\r
+       push    bc\r
+       ld      b,a                     ; 4\r
+       ld      a,(ix+o.in_idx)         ;14\r
+       ld      ($ + 3 + 2),a           ;15\r
+       ld      (ix+0),b                ;15\r
+       inc     a                       ;\r
+       and     (ix+o.mask)             ;\r
+bp.wait:\r
+       cp      (ix+o.out_idx)          ;\r
+       jr      z,bp.wait               ;\r
+       ld      (ix+o.in_idx),a         ;\r
+\r
+       ld      a,b\r
+       out     (AVRINT5),a\r
+       pop     bc\r
+       pop     ix\r
+       ret\r
+\r
+    endif\r
+\r
+;--------------------------------------------------------------\r
+;\r
+; (hl): data\r
+\r
+msg.sout:\r
+       push    ix                      ;14\r
+       ld      ix,mtx.fifo             ;12\r
+       push    bc                      ;11\r
+       push    de                      ;11\r
+       ld      c,(hl)                  ; 6\r
+       ld      b,0                     ; 6\r
+       inc     hl                      ; 7\r
+ms.ol:                                 ;       \\r
+       ld      a,low mtx.fifo          ; 6\r
+       add     a,(ix+o.in_idx)         ;14\r
+       ld      e,a                     ; 4\r
+       ld      a,high mtx.fifo         ; 6\r
+       adc     a,b                     ; 4\r
+       ld      d,a                     ; 4\r
+\r
+       ld      a,(ix+o.in_idx)         ;14\r
+       inc     a                       ; 4\r
+       and     (ix+o.mask)             ;14\r
+ms.wait:\r
+       cp      (ix+o.out_idx)          ;14\r
+       jr      z,ms.wait               ; 6/8\r
+\r
+       ldi                             ;12\r
+       ld      (ix+o.in_idx),a         ;15\r
+       jp      pe,ms.ol                ; 6/9    -- 126\r
+\r
+       out     (AVRINT5),a             ;10\r
+       pop     de                      ; 9\r
+       pop     bc                      ; 9\r
+       pop     ix                      ;12\r
+       ret                             ; 9\r
+\r
+;--------------------------------------------------------------\r
+;\r
+; (hl): data\r
+\r
+    if 0\r
+\r
+msg.sout:\r
+       push    ix                      ;14\r
+       ld      ix,mtx.fifo             ;12\r
+       push    bc                      ;11\r
+       push    de                      ;11\r
+       ld      b,(hl)                  ; 6\r
+       inc     hl                      ; 4\r
+       ex      de,hl                   ; 3\r
+ms.ol:                                 ;       \\r
+       push    ix                      ;14\r
+       pop     hl                      ; 9\r
+       ld      c,(ix+o.in_idx)         ;14\r
+       ld      a,c                     ; 4\r
+       add     l                       ; 4\r
+       ld      l,a                     ; 4\r
+       jr      nc,ms.on                ; 6/8\r
+       inc     h                       ; 4\r
+ms.on:\r
+       ld      a,c                     ; 4\r
+       inc     a                       ; 4\r
+       and     (ix+o.mask)             ;14\r
+ms.wait:\r
+       cp      (ix+o.out_idx)          ;14\r
+       jr      z,ms.wait               ; 6/8\r
+       ld      c,a                     ; 4\r
+       ld      a,(de)                  ; 6\r
+       inc     de                      ; 4\r
+       ld      (hl),a                  ; 7\r
+       ld      (ix+o.in_idx),c         ;15\r
+       djnz    ms.ol                   ; 7/9   -- 130\r
+\r
+       out     (AVRINT5),a             ;10\r
+       ex      de,hl                   ; 3\r
+       pop     de                      ; 9\r
+       pop     bc                      ; 9\r
+       pop     ix                      ;12\r
+       ret                             ; 9\r
+\r
+    endif\r
+\r
 ;--------------------------------------------------------------\r
 \r
 msg.co:\r
@@ -185,8 +291,8 @@ msg.co:
        pop     hl\r
        pop     af\r
        ret\r
-       \r
-       \r
+\r
+\r
 buf:\r
        db      buf_end - $ - 1         ;output string length\r
        db      0AEh                    ; message start token\r
@@ -200,4 +306,3 @@ buf_end:
 ;----------------------------------------------------------------------\r
 \r
        end\r
-\r