X-Git-Url: http://cloudbase.mooo.com/gitweb/z180-stamp-cpm3.git/blobdiff_plain/40df51aed30ddcd710c7356f8098516c27088392..1e56f37617354c528443fc320e079037f1971ad9:/cbios/mm.180 diff --git a/cbios/mm.180 b/cbios/mm.180 index 9d1e256..d9efd16 100644 --- a/cbios/mm.180 +++ b/cbios/mm.180 @@ -3,20 +3,30 @@ global mmuinit - global bnk2log,bnk2phy,hwl2phy + global bnk2log,bnk2phy,hwl2phy,phy2log include config.inc include z180reg.inc ;---------------------------------------------------------------------- -; Memory Map: +; Memory Map 1: ; -; Common CAStart ... 0FFFF -; Bank 0 00000 ... CAStart-1 -; Bank 1 10000 ... +; Common CAStart .. 0FFFF +; Bank 0 00000 .. CAStart-1 +; Bank 1 10000 .. ; Bank 2 ; +; Memory Map 2: +; +; Common 18000 .. 1BFFF BANK1 +; +; Bank 0 00000 .. 0BFFF 0 +; Bank 1 0C000 .. 17FFF 1*BNK_SIZE +; Bank 2 1C000 .. 27FFF 2*BNK_SIZE + CMN_SIZE +; Bank 3 28000 .. 33FFF 3*BNK_SIZE + CMN_SIZE +; Bank n n*BNK_SIZE + (n < 2) ? 0 : CMN_SIZE +; ;---------------------------------------------------------------------- cseg @@ -32,20 +42,55 @@ mmuinit: ; in a: Bank number ; out a: bbr value + if 0 ; Memory Map 1 + bnk2log: or a ; ret z ; Bank 0 is at physical address 0 - dec a + dec a ; push bc ; - ld b,a ; - ld c,CA ; + ld c,a ; + ld b,BNK_SIZE ; mlt bc ; bank size * bank number ld a,c ; add a,10h ; add bank0 + common pop bc ; ret ; + else ; Memory Map 2 + +bnk2log: + or a + ret z ; Bank 0 is at physical address 0 + + push bc + ld c,a ; + ld b,BNK_SIZE ; + mlt bc ; bank size * bank number + cp 2 ; + ld a,c ; + pop bc + ret c + add a,CMN_SIZE + ret + + endif + + if 0 ; table version + + push hl + ld hl,bnk_table ; + add a,l ; + ld l,a ; + jr nc,$+3 ; + inc h ; + ld a,(hl) ; + pop hl + ret + + endif + ;-------------------------------------------------------------- ;in hl: Log. Address @@ -62,13 +107,16 @@ bnk2phy: cp CA*16 ld a,c pop bc - jr c,b2p_banked - xor a ; address is in common - jr b2b_cont ; base is 0 + ; address is in common + if 0 ; Memory Map 1 + ld a,0 ; base is 0 + else ; Memory Map 2 + ld a,1 ; same as bank1 + endif + b2p_banked: call bnk2log ; get address base -b2b_cont: ; fall thru @@ -102,10 +150,10 @@ l2p_i: ;-------------------------------------------------------------- ; -; de: Log. Address +; hl: Log. Address ; ; -; OP: ahl = (bankbase<<12) + (d<<8) + e +; OP: ahl = (bankbase<<12) + (h<<8) + l ; ;out ahl: Phys. (linear) Address @@ -137,6 +185,30 @@ hl2p_x: ret ; +;-------------------------------------------------------------- +; return logical bank 0 address for given physical address. +; +; in: ahl: pyhsical addres (20 bit) +; out hl: logical address. +; logical address is in bank 0 or common, no bank number returned +; + +phy2log: + or a + ret z + + push bc + push hl + ld l,h + ld h,0 + ld bc,-16*SYS$CBR + add hl,bc + ld h,l + pop bc + ld l,c + pop bc + ret + ;-------------------------------------------------------------- ; Trampoline for routines in banked ram. ; Switch stack pointer to "system" stack in top ram