diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index f19223f5..18174085 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -49,13 +49,14 @@ ; - std.asm ; - ../ver.inc ; - build.inc -; - Config/_std.asm +; - Config/_.asm ; - cfg_.asm ; - cfg_MASTER.asm ; - hbios.inc ; - [z180.inc] ; - [z280.inc] ; - [eipc.inc] +; - layout.inc ; - util.asm ; - time.asm ; - bcd.asm @@ -941,8 +942,23 @@ Z280_SYSCALL_GO: ; #IF (MEMMGR == MM_SZ80) ; -; 1MB OF RAM IN 16K PAGES. STARTS AT 4TH 16K PAGE AND WRAPS AROUND -; BECAUSE PAGE 2 & 3 ARE FIXED TO HIGH 32K OF CPU ADDRESS SPACE. +; The S100 Z80 CPU implements a custom memory manager that allows mapping the 2 +; lowest 16K portions of CPU address space ($0000-$3FFFF, and $4000-$7FFF). +; Each of these banks can be mapped to any physical 16K bank. +; The physical 16K banks are 16K aligned. The memory manager +; can address a maximum of 1MB of physical memory. Which is +; 64 x 16K banks (bank numbers $00-$3F) +; +; The top 32K of CPU address space ($8000-$FFFF) is statically mapped +; to physical banks $02 & $03. RomWBW is designed to have the top +; 32K of CPU address space assigned to the last two banks of +; RAM. So the RomWBW memory manager for this board (MM_SZ80) +; rotates the requested bank numbers by 4. With wrapping, this +; causes a RomWBW request for the top two banks to be mapped to +; physical banks $02 & $03. +; +; Z80 CPU Physical: $00 $01 $02 $03 ... $38 $39 $3A $3B $3C $3D $3E $3F +; RomWBW Logical: $04 $05 $06 $07 ... $3C $3D $3E $3F $00 $01 $02 $03 ; BIT 7,A ; BIT 7 SET REQUESTS RAM PAGE JR Z,HBX_ROM ; NOT SET, SELECT ROM PAGE diff --git a/Source/HBIOS/layout.inc b/Source/HBIOS/layout.inc index c2c7af62..7c7d4225 100644 --- a/Source/HBIOS/layout.inc +++ b/Source/HBIOS/layout.inc @@ -60,7 +60,7 @@ CPM_IMGSIZ .EQU $3000 ; CPM IMAGE SIZE ON ROM ;-------------------------------------------------------------------------------------------------- ; BNK_NXTLOC .EQU $0000 ; RESET TO START OF BANK -BNK_CUR .EQU 1 ; THIS IS ROM BANK 1 (BID_IMG0) +BNK_CUR .EQU 0 ; BANK OFFSET FROM BID_IMG0 ; LDR_BNK .EQU BNK_CUR LDR_LOC .EQU $0000 ; RUNNING LOCATION OF BOOT LOADER @@ -103,7 +103,7 @@ BNK1_SLACK .EQU BNKTOP - BNK_NXTLOC ; REMAINING BANK SPACE ;-------------------------------------------------------------------------------------------------- ; BNK_NXTLOC .SET $0000 ; RESET TO START OF BANK -BNK_CUR .SET 2 ; THIS IS ROM BANK 2 (BID_IMG1) +BNK_CUR .SET 1 ; BANK OFFSET FROM BID_IMG0 ; ; NOTE FOLLOWING ARE COPY/PASTED INTO camel80.azm !!!!!!!! FTH_BNK .EQU BNK_CUR @@ -178,7 +178,7 @@ BNK2_SLACK .EQU BNKTOP - BNK_NXTLOC ; REMAINING BANK SPACE ;-------------------------------------------------------------------------------------------------- ; BNK_NXTLOC .SET $0000 ; RESET TO START OF BANK -BNK_CUR .SET 3 ; THIS IS ROM BANK 3 (BID_IMG2) +BNK_CUR .SET 2 ; BANK OFFSET FROM BID_IMG0 ; HWMON_BNK .EQU BNK_CUR HWMON_LOC .EQU $E000 diff --git a/Source/HBIOS/romldr.asm b/Source/HBIOS/romldr.asm index c438d74b..a9462053 100644 --- a/Source/HBIOS/romldr.asm +++ b/Source/HBIOS/romldr.asm @@ -1144,7 +1144,10 @@ romcopy: cp bid_cur ; special value? jr nz,romcopy1 ; if not, continue ld a,(bid_ldr) ; else substitute + jr romcopy2 ; and continue romcopy1: + add a,BID_IMG0 ; add to start of image banks +romcopy2: push af ; save source bank ; ld e,a ; source bank to E @@ -2695,8 +2698,11 @@ ra_ent .equ 12 ; *_SIZ *_END and any code generated which does not include LAYOUT.INC is ; synced. ; -; Note: The loadable ROM images are placed in ROM banks BID_IMG0 and -; BID_IMG1. However, RomWBW supports a mechanism to load a complete +; Note: The loadable ROM images are placed in ROM banks starting with +; BID_IMG0. The bank numbers below are an offset from BID_IMG0 because +; the actual bank id of BID_IMG0 varies per system. +; +; RomWBW supports a mechanism to load a complete ; new system dynamically as a runnable application (see appboot ; in hbios.asm). In this case, the contents of BID_IMG0 will ; be pre-loaded into the currently executing ram bank thereby allowing @@ -2705,48 +2711,48 @@ ra_ent .equ 12 ; normally found in BID_IMG0. This special value will cause ; the associated image to be loaded from the currently executing bank ; which will be correct regardless of the load mode. Images in other -; banks (BID_IMG1) will always be loaded directly from ROM. +; image banks (BID_IMG1). ; ra_tbl: ; -; Name Key Dsky Bank Src Dest Size Entry -; --------- ------- ----- -------- ----- ------- ------- ---------- -ra_ent(str_mon, 'M', KY_CL, MON_BNK, MON_IMGLOC, MON_LOC, MON_SIZ, MON_SERIAL) +; Name Key Dsky Bank Src Dest Size Entry +; --------- ------ ----- -------- ----- ------- ------- ---------- +ra_ent(str_mon, 'M', KY_CL, MON_BNK, MON_IMGLOC, MON_LOC, MON_SIZ, MON_SERIAL) ra_entsiz .equ $ - ra_tbl #if (BIOS == BIOS_WBW) #if (PLATFORM == PLT_S100) -ra_ent(str_smon, 'O', $FF, bid_cur, $8000, $8000, $0001, s100mon) +ra_ent(str_smon, 'O', $FF, bid_cur, $8000, $8000, $0001, s100mon) #endif #endif -ra_ent(str_cpm22, 'C', KY_BK, CPM22_BNK, CPM22_IMGLOC, CPM_LOC, CPM_SIZ, CPM_ENT) -ra_ent(str_zsys, 'Z', KY_FW, ZSYS_BNK, ZSYS_IMGLOC, CPM_LOC, CPM_SIZ, CPM_ENT) +ra_ent(str_cpm22, 'C', KY_BK, CPM22_BNK, CPM22_IMGLOC, CPM_LOC, CPM_SIZ, CPM_ENT) +ra_ent(str_zsys, 'Z', KY_FW, ZSYS_BNK, ZSYS_IMGLOC, CPM_LOC, CPM_SIZ, CPM_ENT) #if (BIOS == BIOS_WBW) -ra_ent(str_bas, 'B', KY_DE, BAS_BNK, BAS_IMGLOC, BAS_LOC, BAS_SIZ, BAS_LOC) -ra_ent(str_tbas, 'T', KY_EN, TBC_BNK, TBC_IMGLOC, TBC_LOC, TBC_SIZ, TBC_LOC) -ra_ent(str_fth, 'F', KY_EX, FTH_BNK, FTH_IMGLOC, FTH_LOC, FTH_SIZ, FTH_LOC) -ra_ent(str_play, 'P', $FF, GAM_BNK, GAM_IMGLOC, GAM_LOC, GAM_SIZ, GAM_LOC) -ra_ent(str_net, 'N'+$80, $FF, NET_BNK, NET_IMGLOC, NET_LOC, NET_SIZ, NET_LOC) -ra_ent(str_upd, 'X', $FF, UPD_BNK, UPD_IMGLOC, UPD_LOC, UPD_SIZ, UPD_LOC) -ra_ent(str_blnk, 'W'+$80, $FF, NVR_BNK, NVR_IMGLOC, NVR_LOC, NVR_SIZ, NVR_LOC) -ra_ent(str_blnk, 'D'+$80, $FF, DEV_BNK, DEV_IMGLOC, DEV_LOC, DEV_SIZ, DEV_LOC) -ra_ent(str_blnk, 'S'+$80, $FF, SLC_BNK, SLC_IMGLOC, SLC_LOC, SLC_SIZ, SLC_LOC) -ra_ent(str_user, 'U', $FF, USR_BNK, USR_IMGLOC, USR_LOC, USR_SIZ, USR_LOC) +ra_ent(str_bas, 'B', KY_DE, BAS_BNK, BAS_IMGLOC, BAS_LOC, BAS_SIZ, BAS_LOC) +ra_ent(str_tbas, 'T', KY_EN, TBC_BNK, TBC_IMGLOC, TBC_LOC, TBC_SIZ, TBC_LOC) +ra_ent(str_fth, 'F', KY_EX, FTH_BNK, FTH_IMGLOC, FTH_LOC, FTH_SIZ, FTH_LOC) +ra_ent(str_play, 'P', $FF, GAM_BNK, GAM_IMGLOC, GAM_LOC, GAM_SIZ, GAM_LOC) +ra_ent(str_net, 'N'+$80, $FF, NET_BNK, NET_IMGLOC, NET_LOC, NET_SIZ, NET_LOC) +ra_ent(str_upd, 'X', $FF, UPD_BNK, UPD_IMGLOC, UPD_LOC, UPD_SIZ, UPD_LOC) +ra_ent(str_blnk, 'W'+$80, $FF, NVR_BNK, NVR_IMGLOC, NVR_LOC, NVR_SIZ, NVR_LOC) +ra_ent(str_blnk, 'D'+$80, $FF, DEV_BNK, DEV_IMGLOC, DEV_LOC, DEV_SIZ, DEV_LOC) +ra_ent(str_blnk, 'S'+$80, $FF, SLC_BNK, SLC_IMGLOC, SLC_LOC, SLC_SIZ, SLC_LOC) +ra_ent(str_user, 'U', $FF, USR_BNK, USR_IMGLOC, USR_LOC, USR_SIZ, USR_LOC) #endif #if (DSKYENABLE) -ra_ent(str_dsky, 'Y'+$80, KY_GO, MON_BNK, MON_IMGLOC, MON_LOC, MON_SIZ, MON_DSKY) +ra_ent(str_dsky, 'Y'+$80, KY_GO, MON_BNK, MON_IMGLOC, MON_LOC, MON_SIZ, MON_DSKY) #endif -ra_ent(str_blnk, 'E'+$80, $FF, EGG_BNK, EGG_IMGLOC, EGG_LOC, EGG_SIZ, EGG_LOC) +ra_ent(str_blnk, 'E'+$80, $FF, EGG_BNK, EGG_IMGLOC, EGG_LOC, EGG_SIZ, EGG_LOC) ; .dw 0 ; table terminator ; ra_tbl_app: ; -; Name Key Dsky Bank Src Dest Size Entry -; --------- ------- ----- -------- ----- ------- ------- ---------- -ra_ent(str_mon, 'M', KY_CL, bid_cur, MON_IMGLOC, MON_LOC, MON_SIZ, MON_SERIAL) -ra_ent(str_zsys, 'Z', KY_FW, bid_cur, ZSYS_IMGLOC, CPM_LOC, CPM_SIZ, CPM_ENT) +; Name Key Dsky Bank Src Dest Size Entry +; --------- ------ ----- -------- ----- ------- ------- ---------- +ra_ent(str_mon, 'M', KY_CL, bid_cur, MON_IMGLOC, MON_LOC, MON_SIZ, MON_SERIAL) +ra_ent(str_zsys, 'Z', KY_FW, bid_cur, ZSYS_IMGLOC, CPM_LOC, CPM_SIZ, CPM_ENT) #if (DSKYENABLE) -ra_ent(str_dsky, 'Y'+$80, KY_GO, bid_cur, MON_IMGLOC, MON_LOC, MON_SIZ, MON_DSKY) +ra_ent(str_dsky, 'Y'+$80, KY_GO, bid_cur, MON_IMGLOC, MON_LOC, MON_SIZ, MON_DSKY) #endif ; .dw 0 ; table terminator