diff --git a/Source/HBIOS/Build.ps1 b/Source/HBIOS/Build.ps1 index 563c1f33..7ddb0789 100644 --- a/Source/HBIOS/Build.ps1 +++ b/Source/HBIOS/Build.ps1 @@ -58,9 +58,9 @@ if ($Platform -eq "UNA") {$CBiosFile = '../CBIOS/cbios_una.bin'} else {$CBiosFil # $TimeStamp = '"' + (Get-Date -Format 'dd-MMM-yyyy') + '"' $TimeStamp = '"' + (Get-Date -Format 'yyyy-MM-dd') + '"' -Function Asm($Component, $Opt, $Architecture=$CPUType, $Output="${Component}.bin") +Function Asm($Component, $Opt, $Architecture=$CPUType, $Output="${Component}.bin", $List="${Component}.lst") { - $Cmd = "tasm -t${Architecture} -g3 ${Opt} ${Component}.asm ${Output}" + $Cmd = "tasm -t${Architecture} -g3 ${Opt} ${Component}.asm ${Output} ${List}" $Cmd | write-host Invoke-Expression $Cmd | write-host if ($LASTEXITCODE -gt 0) {throw "TASM returned exit code $LASTEXITCODE"} @@ -101,11 +101,9 @@ Asm 'prefix' Asm 'romldr' if ($Platform -ne "UNA") { - Asm 'hbios' - Asm 'hbfill' - Asm 'setup' - Asm 'comldr' - Asm 'imgldr' + Asm 'hbios' '-dROMBOOT' -Output 'hbios_rom.bin' -List 'hbios_rom.lst' + Asm 'hbios' '-dAPPBOOT' -Output 'hbios_app.bin' -List 'hbios_rom.lst' + Asm 'hbios' '-dIMGBOOT' -Output 'hbios_img.bin' -List 'hbios_rom.lst' } # Generate result files using components above @@ -139,9 +137,9 @@ if ($Platform -eq "UNA") } else { - Concat 'setup.bin','hbios.bin','hbfill.bin','osimg.bin','osimg.bin',$RomDiskFile $RomFile - Concat 'comldr.bin','hbios.bin','osimg.bin' $ComFile - Concat 'imgldr.bin','hbios.bin','osimg.bin' $ImgFile + Concat 'hbios_rom.bin','osimg.bin','osimg.bin','osimg.bin',$RomDiskFile $RomFile + Concat 'hbios_app.bin','osimg.bin' $ComFile + Concat 'hbios_img.bin','osimg.bin' $ImgFile } # Cleanup diff --git a/Source/HBIOS/Layout.txt b/Source/HBIOS/Layout.txt index d32e63c7..8e98d724 100644 --- a/Source/HBIOS/Layout.txt +++ b/Source/HBIOS/Layout.txt @@ -3,20 +3,18 @@ Final Output Files ------------------ ROM Output File [512K] -> .rom - setup [32K] romboot? - hbios+hbfill [32K] + hbios_rom [32K] OSIMG [32K] OSIMG [32K] (used as filler) + OSIMG [32K] (used as filler) romdisk - [384K] COM Output File -> .com - comldr [varies] appboot? - hbios [varies] + hbios_com [varies] OSIMG [32K] IMG Output File -> .img - imgldr [varies] imgboot? - hbios [varies] + hbios_img [varies] OSIMG [32K] ------------------------- @@ -43,43 +41,7 @@ ZSYS [12K] -> zsys.bin Compilation Units ----------------- -setup.asm -> setup.bin: romboot? - std.asm - ver.inc - hbios.inc - build.inc - .asm - plt_.inc - hbios.exp - loader boot? - xio - memmgr - -comldr.asm -> comldr.bin: appboot? - std.asm - ver.inc - hbios.inc - build.inc - .asm - plt_.inc - hbios.exp - loader boot? - xio - memmgr - -imgldr.asm -> imgldr.bin: imgboot? - std.asm - ver.inc - hbios.inc - build.inc - .asm - plt_.inc - hbios.exp - loader boot? - xio - memmgr - -hbios.bin: +hbios.asm -> hbios_rom.bin, hbios_app.bin, hbios_img.bin std.asm ver.inc hbios.inc @@ -112,3 +74,30 @@ dbgmon.asm -> dbgmon.bin: util.asm memmgr.asm dsky.asm + +======================================================================= +HBIOS Loading Modes: + ROMBOOT: Startup from ROM Bank BID_BOOT + APPBOOT: Startup as CP/M application + IMGBOOT: Startup from RAM Bank BID_USR +======================================================================= + + - If not (APPBOOT), include page 0 + + - Base Hardware Init + - Iff (ROMBOOT), init BBR + + - Install Proxy + - Set CURBNK: + - If ROMBOOT, then BID_BOOT, else BID_USR + + - Install HBIOS + - Copy from CURBNK:0 --> BID_BIOS:0 ($8000 bytes) + + - Transition to HBIOS in BID_BIOS + + - Copy OS Image to USR Bank + - If (ROM_MODE), copy BID_OS:0 --> BID_USR:0 + - Else, copy BID_USR: --> BID_USR:0 + + - Chain to BID_USR:0 diff --git a/Source/HBIOS/Make.cmd b/Source/HBIOS/Old/Make.cmd similarity index 100% rename from Source/HBIOS/Make.cmd rename to Source/HBIOS/Old/Make.cmd diff --git a/Source/HBIOS/comldr.asm b/Source/HBIOS/Old/comldr.asm similarity index 100% rename from Source/HBIOS/comldr.asm rename to Source/HBIOS/Old/comldr.asm diff --git a/Source/HBIOS/hbfill.asm b/Source/HBIOS/Old/hbfill.asm similarity index 100% rename from Source/HBIOS/hbfill.asm rename to Source/HBIOS/Old/hbfill.asm diff --git a/Source/HBIOS/imgldr.asm b/Source/HBIOS/Old/imgldr.asm similarity index 100% rename from Source/HBIOS/imgldr.asm rename to Source/HBIOS/Old/imgldr.asm diff --git a/Source/HBIOS/Old/loader.asm b/Source/HBIOS/Old/loader.asm index fd8bacb0..dc9e88f2 100644 --- a/Source/HBIOS/Old/loader.asm +++ b/Source/HBIOS/Old/loader.asm @@ -3,977 +3,184 @@ ; LOADER ;================================================================================================== ; -; INCLUDE GENERIC STUFF +P2LOC .EQU $F000 ; PHASE 2 RUN LOCATION ; -#INCLUDE "std.asm" -; - .ORG $8400 -; - ; SETUP OUR STACK - LD SP,BL_STACK ; SET UP LOADER STACK - - ; ENSURE THAT USER BANK IS MAPPED TO LOWER 32K -#IF (PLATFORM == PLT_UNA) - ; SWITCH TO EXEC PAGE IN BANKED MEMORY - LD BC,$01FB ; SET BANK - LD DE,$800E ; EXEC_PAGE (SEE PAGES.INC) - RST 08 ; DO IT - - LD HL,BL_UNAMOD ; POINT TO UNA MODE FLAG - LD (HL),$FF ; SET UNA MODE +#IFDEF ROMLOAD +CURBNK .EQU BID_BOOT #ELSE - LD A,BID_USR ; USER RAM PAGE - CALL PGSEL ; SELECT IT +CURBNK .EQU BID_USR #ENDIF - - ; TEST FOR UNA, CONFIG INVOCATION VECTOR IF FOUND - CALL UNACHK - - ; BANNER - CALL NEWLINE - LD DE,STR_BANNER - CALL WRITESTR - - ; RUN THE BOOT LOADER MENU - JP DOBOOTMENU -; -;__DOBOOT________________________________________________________________________________________________________________________ ; -; PERFORM BOOT FRONT PANEL ACTION -;________________________________________________________________________________________________________________________________ +;================================================================================================== +; COLD START +;================================================================================================== ; -DOBOOTMENU: - CALL NEWLINE - CALL NEWLINE - - LD DE,STR_BOOTMENU - CALL WRITESTR - -#IF (DSKYENABLE) - LD HL,BOOT ; POINT TO BOOT MESSAGE - CALL SEGDISPLAY ; DISPLAY MESSAGE +START: + DI ; NO INTERRUPTS + IM 1 ; INTERRUPT MODE 1 + LD SP,HBX_LOC ; SETUP INITIAL STACK JUST BELOW HBIOS PROXY +; +; HARDWARE BOOTSTRAP FOR Z180 +; FOR N8, ACR & RMAP ARE ASSUMED TO BE ALREADY SET OR THIS CODE +; WOULD NOT BE EXECUTING +; +#IF ((PLATFORM == PLT_N8) | (PLATFORM == PLT_MK4)) + ; SET BASE FOR CPU IO REGISTERS + LD A,Z180_BASE + OUT0 (Z180_ICR),A + + ; DISABLE REFRESH + XOR A + OUT0 (Z180_RCR),A + + ; SET DEFAULT CPU CLOCK MULTIPLIERS (XTAL / 2) + XOR A + OUT0 (Z180_CCR),A + OUT0 (Z180_CMR),A + + ; SET DEFAULT WAIT STATES + LD A,$F0 + OUT0 (Z180_DCNTL),A + + ; MMU SETUP + LD A,$80 + OUT0 (Z180_CBAR),A ; SETUP FOR 32K/32K BANK CONFIG +#IFDEF ROMLOAD + XOR A + OUT0 (Z180_BBR),A ; BANK BASE = 0 #ENDIF + LD A,(RAMSIZE + RAMBIAS - 64) >> 2 + OUT0 (Z180_CBR),A ; COMMON BASE = LAST (TOP) BANK -#IF (BOOTTYPE == BT_AUTO) - LD BC,1000 * BOOT_TIMEOUT - LD (BL_TIMEOUT),BC +#IF (Z180_CLKDIV >= 1) + ; SET CLOCK DIVIDE TO 1 RESULTING IN FULL XTAL SPEED + LD A,$80 + OUT0 (Z180_CCR),A #ENDIF -DB_BOOTLOOP: -; -; CHECK FOR CONSOLE BOOT KEYPRESS -; - CALL CST - OR A - JP Z,DB_CONEND - CALL CINUC - CP 'M' ; MONITOR - JP Z,GOMON - CP 'C' ; CP/M BOOT FROM ROM - JP Z,GOCPM - CP 'Z' ; ZSYSTEM BOOT FROM ROM - JP Z,GOZSYS - CP 'L' ; LIST DRIVES - JP Z,GOLIST - CP '0' ; 0-9, DISK DEVICE - JP C,DB_INVALID - CP '9' + 1 - JP NC,DB_INVALID - SUB '0' - JP GOBOOTDISK -DB_CONEND: -; -; CHECK FOR DSKY BOOT KEYPRESS -; -#IF (DSKYENABLE) - CALL KY_STAT ; GET KEY FROM KB INTO A - OR A - JP Z,DB_DSKYEND - CALL KY_GET - CP KY_GO ; GO = MONITOR - JP Z,GOMONDSKY - CP KY_BO ; BO = BOOT ROM - JP Z,GOCPM -; CP 0AH ; A-F, DISK BOOT -; JP C,DB_INVALID - CP 0FH + 1 ; 0-F, DISK BOOT -; JP NC,DB_INVALID -; SUB 0AH - JP GOBOOTDISK -; LD HL,BOOT ; POINT TO BOOT MESSAGE -; LD A,00H ; BLANK OUT SELECTION,IT WAS INVALID -; LD (HL),A ; STORE IT IN DISPLAY BUFFER -; CALL SEGDISPLAY ; DISPLAY THE BUFFER -DB_DSKYEND: +#IF (Z180_CLKDIV >= 2) + ; SET CPU MULTIPLIER TO 1 RESULTING IN XTAL * 2 SPEED + LD A,$80 + OUT0 (Z180_CMR),A #ENDIF -; -; IF CONFIGURED, CHECK FOR AUTOBOOT TIMEOUT -; -#IF (BOOTTYPE == BT_AUTO) - - ; DELAY FOR 1MS TO MAKE TIMEOUT CALC EASY - LD DE,40 - CALL VDELAY - ; CHECK/INCREMENT TIMEOUT - LD BC,(BL_TIMEOUT) - DEC BC - LD (BL_TIMEOUT),BC - LD A,B - OR C - JP NZ,DB_BOOTLOOP - - ; TIMEOUT EXPIRED, PERFORM DEFAULT BOOT ACTION - LD A,BOOT_DEFAULT - CP 'M' ; MONITOR - JP Z,GOMON - CP 'C' ; CP/M BOOT FROM ROM - JP Z,GOCPM - CP 'Z' ; ZSYSTEM BOOT FROM ROM - JP Z,GOZSYS - CP 'L' ; LIST DRIVES - JP Z,GOLIST - CP '0' ; 0-9, DISK DEVICE - JP C,DB_INVALID - CP '9' + 1 - JP NC,DB_INVALID - SUB '0' - JP GOBOOTDISK + ; SET DESIRED WAIT STATES + LD A,0 + (Z180_MEMWAIT << 6) | (Z180_IOWAIT << 4) + OUT0 (Z180_DCNTL),A #ENDIF - - JP DB_BOOTLOOP -; -; BOOT OPTION PROCESSING -; -DB_INVALID: - LD DE,STR_INVALID - CALL WRITESTR - JP DOBOOTMENU -; -GOMON: - CALL LDMON - JP MON_SERIAL ; -GOMONDSKY: - CALL LDMON - JP MON_DSKY +; HARDWARE BOOTSTRAP FOR ZETA 2 ; -LDMON: - LD DE,STR_BOOTMON - CALL WRITESTR - LD HL,$4000 - LD DE,$C000 - LD BC,$1000 - JP LDIMG -; -GOCPM: - LD DE,STR_BOOTCPM - CALL WRITESTR - LD HL,$5000 - LD DE,CPM_LOC - LD BC,$3000 - $400 - CALL LDIMG -#IF (PLATFORM == PLT_UNA) - LD DE,$0100 ; BOOT DEV/UNIT/LU=0 (ROM DRIVE) -#ELSE - LD DE,$0000 ; BOOT DEV/UNIT/LU=0 (ROM DRIVE) +#IF (PLATFORM == PLT_ZETA2) + ; SET PAGING REGISTERS +#IFDEF ROMLOAD + XOR A + OUT (MPGSEL_0),A + INC A + OUT (MPGSEL_1),A #ENDIF - JP CPM_ENT -; -GOZSYS: - LD DE,STR_BOOTZSYS - CALL WRITESTR - LD HL,$1000 - LD DE,CPM_LOC - LD BC,$3000 - $400 - CALL LDIMG -#IF (PLATFORM == PLT_UNA) - LD DE,$0100 ; BOOT DEV/UNIT/LU=0 (ROM DRIVE) -#ELSE - LD DE,$0000 ; BOOT DEV/UNIT/LU=0 (ROM DRIVE) + LD A,62 + OUT (MPGSEL_2),A + INC A + OUT (MPGSEL_3),A + ; ENABLE PAGING + LD A,1 + OUT (MPGENA),A #ENDIF - JP CPM_ENT -; -GOLIST: - LD DE,STR_LIST - CALL WRITESTR - LD DE,STR_DRVLIST - CALL WRITESTR - CALL PRTALL - JP DOBOOTMENU -; -GOBOOTDISK: - LD (BL_BOOTID),A - LD DE,STR_BOOTDISK - CALL WRITESTR - JP BOOTDISK -; -LDIMG: ; -; LOAD IMAGE FROM ROM +; COPY OURSELVES AND LOADER TO HI RAM FOR PHASE 2 ; -; INPUT: HL=IMAGE SOURCE ADDRESS -; DE=IMAGE TARGET ADDRESS -; BC=IMAGE SIZE -; - PUSH HL - PUSH DE - PUSH BC -; -#IF (PLATFORM == PLT_UNA) - ; SWITCH TO ROM IMAGE IN THIRD ROM PAGE - LD BC,$01FB ; SET BANK - LD DE,$0002 ; THIRD ROM PAGE (SEE PAGES.INC) - CALL $FFFD ; DO IT -#ELSE - LD A,BID_BOOT ; ROM PAGE WITH OS IMAGE - CALL PGSEL ; SELECT IT -#ENDIF - POP BC - POP DE - POP HL + LD HL,0 ; COPY FROM START OF ROM IMAGE + LD DE,P2LOC ; TO HIMEM RUN LOCATION + LD BC,LDR_END ; COPY FULL IMAGE LDIR -#IF (PLATFORM == PLT_UNA) - ; SWITCH BACK TO EXEC PAGE IN BANKED MEMORY - LD BC,$01FB ; SET BANK - LD DE,$800E ; EXEC_PAGE (SEE PAGES.INC) - CALL $FFFD ; DO IT -#ELSE - LD A,BID_USR ; USER RAM PAGE - CALL PGSEL ; SELECT IT -#ENDIF - RET -; -; CHECK FOR UNA, SETUP INVOCATION VECTOR IF FOUND + JP PHASE2 ; JUMP TO PHASE 2 BOOT IN UPPER MEMORY ; -UNACHK: - LD A,($FFFD) ; FIXED LOCATION OF UNA API VECTOR - CP $C3 ; JP INSTRUCTION? - JR NZ,UNACHKX ; IF NOT, NOT UNA - LD HL,($FFFE) ; GET JP ADDRESS - LD A,(HL) ; GET BYTE AT TARGET ADDRESS - CP $FD ; FIRST BYTE OF UNA PUSH IX INSTRUCTION - JR NZ,UNACHKX ; IF NOT, NOT UNA - INC HL ; NEXT BYTE - LD A,(HL) ; GET NEXT BYTE - CP $E5 ; SECOND BYTE OF UNA PUSH IX INSTRUCTION - JR NZ,UNACHKX ; IF NOT, NOT UNA - LD HL,BL_UNAMOD ; POINT TO UNA MODE FLAG - LD (HL),$FF ; SET UNA MODE - LD A,$C3 ; JP INSTRUCTION - LD (8),A ; STORE AT 0x0008 - LD HL,($FFFE) ; UNA ENTRY VECTOR - LD (9),HL ; STORE AT 0x0009 -; -UNACHKX: - RET -; -; BOOT FROM DISK DRIVE -; -BOOTDISK: - LD DE,STR_BOOTDISK1 ; DISK BOOT MESSAGE - CALL WRITESTR ; PRINT IT - - ; CHECK FOR UNA - LD A,(BL_UNAMOD) ; GET UNA MODE - OR A ; SET FLAGS - JP NZ,BOOTUNA ; HANDLE UNA AS NEEDED - - ; CHECK FOR VALID DRIVE LETTER - LD A,(BL_BOOTID) ; BOOT DEVICE TO A - PUSH AF ; SAVE BOOT DEVICE - LD B,BF_DIODEVCNT ; HBIOS FUNC: DEVICE COUNT - RST 08 ; CALL HBIOS, DEVICE COUNT TO B - POP AF ; RESTORE BOOT DEVICE - CP B ; CHECK MAX (INDEX - COUNT) - JP NC,DB_NODISK ; HANDLE INVALID SELECTION - - ; GET DEVICE/UNIT, LU - LD B,BF_DIODEVINF ; HBIOS FUNC: DEVICE INFO - LD A,(BL_BOOTID) ; GET BOOT DEVICE ID - LD C,A ; PUT IN C - RST 08 ; CALL HBIOS, DEV INFO TO C - LD A,C ; DEVICE/UNIT TO A - LD (BL_DEVICE),A ; STORE IT - XOR A ; LU ALWAYS ZERO - LD (BL_LU),A ; STORE IT - - ; SENSE MEDIA - LD A,(BL_DEVICE) ; GET DEVICE/UNIT - LD C,A ; STORE IN C - LD B,BF_DIOMED ; DRIVER FUNCTION = DISK MEDIA - RST 08 ; CALL HBIOS - OR A ; SET FLAGS - JP Z,DB_ERR ; HANDLE ERROR - - ; SET SPT BASED ON MEDIA DETECTED - LD C,18 ; ASSUME 18 SPT - CP MID_FD144 ; 3.5" 1.44M FLOPPY? - JR Z,BOOTDISK1 ; YES, DONE - - LD C,15 ; ASSUME 15 SPT - CP MID_FD120 ; 5.25" 1.2M FLOPPY? - JR Z,BOOTDISK1 ; YES, DONE - CP MID_FD111 ; 8" 1.11M FLOPPY? - JR Z,BOOTDISK1 ; YES, DONE - - LD C,9 ; ASSUME 9 SPT - CP MID_FD720 ; 3.5" 720K FLOPPY? - JR Z,BOOTDISK1 ; YES, DONE - CP MID_FD360 ; 5.25" 360k FLOPPY? - JR Z,BOOTDISK1 ; YES, DONE - - LD C,16 ; EVERYTHING ELSE IS LBA (USE 16 SPT) - -BOOTDISK1: - LD A,C - LD (BL_SPT),A ; SAVE SPT - - ; DETERMINE STARTING TRACK FOR LU - LD A,(BL_LU) ; GET LU SPECIFIED - LD E,A ; LU INDEX - LD H,65 ; 65 TRACKS PER LU - CALL MULT8 ; HL := H * E - LD (BL_LUTRK),HL ; SAVE IT - - ; READ BOOT INFO SECTOR - LD HL,0 ; INITIAL TRACK (RELATIVE TO LU) - LD (BL_CURTRK),HL ; SAVE AS CURRENT TRACK - LD A,2 ; BOOT INFO IS IN SECTOR 2 - LD (BL_CURSEC),A ; SAVE AS CURRENT SECTOR - LD HL,BL_INFOSEC ; WHERE TO PUT INFO SECTOR - LD (BL_CURDMA),HL ; ... AND SAVE IT - CALL DB_READSEC ; READ CURRENT SECTOR - JP NZ,DB_ERR ; HANDLE ERROR - - ; CHECK SIGNATURE - LD BC,(BB_SIG) - LD A,$A5 - CP B - JP NZ,DB_NOBOOT - LD A,$5A - CP C - JP NZ,DB_NOBOOT - - ; PRINT CPMLOC VALUE - CALL NEWLINE - LD DE,STR_CPMLOC - CALL WRITESTR - LD BC,(BB_CPMLOC) - CALL PRTHEXWORD - - ; PRINT CPMEND VALUE - CALL PC_SPACE - LD DE,STR_CPMEND - CALL WRITESTR - LD BC,(BB_CPMEND) - CALL PRTHEXWORD - - ; PRINT CPMENT VALUE - CALL PC_SPACE - LD DE,STR_CPMENT - CALL WRITESTR - LD BC,(BB_CPMENT) - CALL PRTHEXWORD - CALL PC_SPACE - - ; PRINT DISK LABEL - LD DE,STR_LABEL - CALL WRITESTR - LD DE,BB_LABEL ; if it is there, then a printable - LD A,(BB_TERM) ; Display Disk Label if Present - CP '$' ; (dwg 2/7/2012) - CALL Z,WRITESTR ; label is there as well even if spaces. - - ; COMPUTE NUMBER OF SECTORS TO LOAD - LD HL,(BB_CPMEND) ; HL := END - LD DE,(BB_CPMLOC) ; DE := START - OR A ; CLEAR CARRY - SBC HL,DE ; HL := LENGTH TO LOAD - LD A,H ; DETERMINE 512 BYTE SECTOR COUNT - RRCA ; ... BY DIVIDING MSB BY TWO - LD (BL_COUNT),A ; ... AND SAVE IT - - ; LOADING MESSAGE - CALL NEWLINE - LD DE,STR_LOADING - CALL WRITESTR - - ; SETUP FOR DATA LOAD - LD HL,(BB_CPMLOC) ; GET TARGET LOAD LOCATION - LD (BL_CURDMA),HL ; ... AND SAVE IT - -DB_LOOP: - CALL DB_NXTSEC ; BUMP TO NEXT SECTOR - CALL DB_READSEC ; READ SECTOR - JP NZ,DB_ERR ; HANDLE ERRORS - CALL PC_PERIOD ; SHOW PROGRESS - LD HL,(BL_CURDMA) ; GET LOAD LOC - LD DE,512 ; 512 BYTES PER SECTOR - ADD HL,DE ; INCREMENT MEM POINTER - LD (BL_CURDMA),HL ; ... AND SAVE IT - LD HL,BL_COUNT ; POINT TO COUNTER - DEC (HL) ; ... AND DECREMENT IT - JR NZ,DB_LOOP ; LOOP IF NEEDED - CALL NEWLINE ; FORMATTING - - ; PASS BOOT DEVICE/UNIT/LU TO CBIOS COLD BOOT - LD A,(BL_DEVICE) ; LOAD BOOT DEVICE/UNIT - LD D,A ; SAVE IN D - LD A,(BL_LU) ; LOAD BOOT LU - LD E,A ; SAVE IN E - - ; JUMP TO COLD BOOT ENTRY - LD HL,(BB_CPMENT) - JP (HL) - +; THIS IS THE PHASE 2 CODE THAT MUST EXECUTE IN UPPER MEMORY ; -; BOOT FROM UNA DISK DRIVE + .ORG $ + P2LOC ; WE ARE NOW EXECUTING IN UPPER MEMORY ; -BOOTUNA: - LD A,(BL_BOOTID) ; GET BOOT DEVICE ID - LD B,A ; MOVE TO B - - ; LOAD SECTOR 2 (BOOT INFO) - LD C,$41 ; UNA FUNC: SET LBA - LD DE,0 ; HI WORD OF LBA IS ALWAYS ZERO - LD HL,2 ; LOAD STARTING INFO SECTOR 2 - RST 08 ; SET LBA - JP NZ,DB_ERR ; HANDLE ERROR - CALL PC_PERIOD ; MARK PROGRESS +PHASE2: ; - LD C,$42 ; UNA FUNC: READ SECTORS - LD DE,BL_INFOSEC ; DEST OF CPM IMAGE - LD L,1 ; SECTORS TO READ - RST 08 ; DO READ - JP NZ,DB_ERR ; HANDLE ERROR - CALL PC_PERIOD ; MARK PROGRESS +; INSTALL HBIOS PROXY IN UPPER MEMORY ; - ; CHECK SIGNATURE - CALL NEWLINE ; FORMATTING - LD DE,(BB_SIG) ; GET THE SIGNATURE - LD A,$A5 ; FIRST BYTE SHOULD BE $A5 - CP D ; COMPARE - JP NZ,DB_NOBOOT ; ERROR IF NOT EQUAL - LD A,$5A ; SECOND BYTE SHOULD BE $5A - CP E ; COMPARE - JP NZ,DB_NOBOOT ; ERROR IS NOT EQUAL - - ; PRINT CPMLOC VALUE - CALL NEWLINE - LD DE,STR_CPMLOC - CALL WRITESTR - LD BC,(BB_CPMLOC) - CALL PRTHEXWORD - - ; PRINT CPMEND VALUE - CALL PC_SPACE - LD DE,STR_CPMEND - CALL WRITESTR - LD BC,(BB_CPMEND) - CALL PRTHEXWORD - - ; PRINT CPMENT VALUE - CALL PC_SPACE - LD DE,STR_CPMENT - CALL WRITESTR - LD BC,(BB_CPMENT) - CALL PRTHEXWORD - CALL PC_SPACE - ; PRINT DISK LABEL - LD DE,STR_LABEL - CALL WRITESTR - LD DE,BB_LABEL ; if it is there, then a printable - LD A,(BB_TERM) ; Display Disk Label if Present - CP '$' ; (dwg 2/7/2012) - CALL Z,WRITESTR ; label is there as well even if spaces. -; - LD DE,STR_LOADING ; LOADING MESSAGE - CALL WRITESTR ; PRINT IT -; - LD A,(BL_BOOTID) ; GET BOOT DEVICE ID - LD B,A ; MOVE TO B -; - LD C,$41 ; UNA FUNC: SET LBA - LD DE,0 ; HI WORD OF LBA IS ALWAYS ZERO - LD HL,3 ; LOAD STARTING AT SECTOR 3 - RST 08 ; SET LBA - JP NZ,DB_ERR ; HANDLE ERROR - CALL PC_PERIOD ; MARK PROGRESS -; - LD C,$42 ; UNA FUNC: READ SECTORS - LD HL,(BB_CPMEND) ; HL := END - LD DE,(BB_CPMLOC) ; DE := START - OR A ; CLEAR CARRY - SBC HL,DE ; HL := LENGTH TO LOAD - LD A,H ; DETERMINE 512 BYTE SECTOR COUNT - RRCA ; ... BY DIVIDING MSB BY TWO - LD L,A ; SECTORS TO READ - LD DE,(BB_CPMLOC) ; DEST OF CPM IMAGE - RST 08 ; DO READ - JP NZ,DB_ERR ; HANDLE ERROR - CALL PC_PERIOD ; MARK PROGRESS -; - ; PASS BOOT DEVICE/UNIT/LU TO CBIOS COLD BOOT - LD A,(BL_BOOTID) ; LOAD BOOT DEVICE/UNIT - LD D,A ; SAVE IN D - XOR A ; BOOT LU IS ALWAYS 0 - LD E,A ; SAVE IN E -; - ; JUMP TO COLD BOOT ENTRY - CALL NEWLINE ; FORMATTING - LD HL,(BB_CPMENT) ; GET THE ENTRY POINT - JP (HL) ; ... AND GO - -DB_NODISK: - ; SELDSK DID NOT LIKE DRIVE SELECTION - LD DE,STR_NODISK - CALL WRITESTR - JP DOBOOTMENU - -DB_NOBOOT: - ; DISK IS NOT BOOTABLE - LD DE,STR_NOBOOT - CALL WRITESTR - JP DOBOOTMENU - -DB_ERR: - ; I/O ERROR DURING BOOT ATTEMPT - LD DE,STR_BOOTERR - CALL WRITESTR - JP DOBOOTMENU -; -; INCREMENT TO NEXT SECTOR -; -DB_NXTSEC: - LD A,(BL_SPT) ; GET SECTORS PER TRACK - LD B,A ; ... AND SAVE IT IN B - LD HL,BL_CURSEC ; POINT TO CURRENT SECTOR - INC (HL) ; INCREMENT IT - LD A,(HL) ; GET CURRENT SECTOR TO A - CP B ; COMPARE TO SPT IN B - RET NZ ; IF WE HAVE NOT HIT SPT, DONE - XOR A ; PREPARE TO CLEAR CUR SECTOR - LD (HL),A ; ... AND DO IT - LD HL,(BL_CURTRK) ; LOAD CURRENT TRACK VALUE - INC HL ; ... AND INCREMENT IT - LD (BL_CURTRK),HL ; ... AND SAVE IT - RET -; -; READ CURRENT SECTOR TO LOAD LOCATION -; -DB_READSEC: - LD HL,(BL_CURDMA) ; GET THE SECTOR DMA ADDRESS - -#IF 0 - CALL NEWLINE - PUSH HL - POP BC - CALL PRTHEXWORD +;#IFDEF ROMLOAD +; LD A,BID_BIOSIMG ; HBIOS IMAGE ROM BANK +; CALL BNKSEL ; SELECT IT +;#ENDIF + LD HL,HBX_IMG ; HL := SOURCE OF HBIOS PROXY IMAGE +#IFNDEF ROMLOAD + LD BC,LDR_END ; SIZE OF LOADER + ADD HL,BC ; OFFSET SOURCE ADDRESS #ENDIF - LD B,BF_DIOSETBUF ; HBIOS FUNC: SET BUF - RST 08 ; CALL HBIOS - - LD A,(BL_DEVICE) ; GET ACTIVE DEVICE/UNIT BYTE - AND $F0 ; ISOLATE DEVICE PORTION - CP DIODEV_FD ; FLOPPY? - JR NZ,DB_READSEC1 ; NO, USE LBA HANDLING - ; SET HL=TRACK (ADD IN TRACK OFFSET) - LD DE,(BL_LUTRK) ; DE = TRACK OFFSET FOR LU SUPPORT - LD HL,(BL_CURTRK) ; HL = TRACK # - ADD HL,DE ; APPLY OFFSET FOR ACTIVE LU - ; SET DE=SECTOR - LD A,(BL_CURSEC) ; GET THE SECTOR INTO A - LD E,A ; MOVE IT TO LSB - LD D,0 ; MSB IS ALWAYS ZERO - ; SET C = DEVICE/UNIT - LD B,BF_DIORD ; FUNCTION IN B - LD A,(BL_DEVICE) ; LOAD DEVICE/UNIT VALUE - LD C,A ; SAVE IN C - JR DB_READSEC3 ; DISPATCH TO DRIVER -; -DB_READSEC1: -; - ; LBA STYLE ACCESS - LD DE,(BL_CURTRK) ; GET TRACK INTO HL - LD B,4 ; PREPARE TO LEFT SHIFT BY 4 BITS -DB_READSEC2: - SLA E ; SHIFT DE LEFT BY 4 BITS - RL D - DJNZ DB_READSEC2 ; LOOP TILL ALL BITS DONE - LD A,(BL_CURSEC) ; GET THE SECTOR INTO A - AND $0F ; GET RID OF TOP NIBBLE - OR E ; COMBINE WITH E - LD E,A ; BACK IN E - LD HL,0 ; HL:DE NOW HAS LU RELATIVE LBA - ; APPLY LU OFFSET NOW - ; LU OFFSET IS EXPRESSED AS NUMBER OF BLOCKS * 256 TO LU OFFSET! - LD A,(BL_LUTRK) ; LSB OF LU TRACK TO A - ADD A,D ; ADD WITH D - LD D,A ; PUT IT BACK IN D - LD A,(BL_LUTRK+1) ; MSB OF LU TRACK TO A - CALL ADDHLA ; ADD LU OFFSET - LD B,BF_DIORD ; FUNCTION IN B - LD A,(BL_DEVICE) ; GET THE DEVICE/UNIT VALUE - LD C,A ; PUT IT IN C -; -DB_READSEC3: -; - ; DISPATCH TO DRIVER -#IF 0 - PUSH AF - PUSH BC - PUSH DE - PUSH HL - - CALL PC_PERIOD - LD A,C - CALL PRTHEXBYTE - PUSH BC - PUSH HL - POP BC - CALL PC_PERIOD - CALL PRTHEXWORD - PUSH DE - POP BC - CALL PC_COLON - CALL PRTHEXWORD - CALL NEWLINE - POP BC - - POP HL - POP DE - POP BC - POP AF + LD DE,HBX_LOC ; DE := DESTINATION TO INSTALL IT + LD BC,HBX_SIZ ; SIZE + LDIR ; DO THE COPY + LD A,CURBNK ; BOOT/SETUP BANK + LD (HB_CURBNK),A ; INIT CURRENT BANK + +;#IFDEF ROMLOAD +; CALL BNKSEL ; SELECT IT +;#ENDIF + +; +; INSTALL HBIOS CODE BANK +; +;#IFDEF ROMLOAD +; LD A,BID_BIOSIMG ; SOURCE BANK +;#ELSE + LD A,(HB_CURBNK) ; SOURCE BANK +;#ENDIF + LD (HB_SRCBNK),A ; SET IT + LD A,BID_BIOS ; DESTINATION BANK + LD (HB_DSTBNK),A ; SET IT + LD HL,0 ; SOURCE ADDRESS IS ZERO +#IFNDEF ROMLOAD + LD BC,LDR_END ; SIZE OF LOADER + ADD HL,BC ; OFFSET SOURCE ADDRESS #ENDIF - RST 08 - OR A ; SET FLAGS BASED ON RESULT - RET -; -; PRINT LIST OF ALL DRIVES -; -PRTALL: - LD A,(BL_UNAMOD) ; GET UNA MODE FLAG - OR A ; SET FLAGS - JP NZ,UPRTALL ; HANDLE UNA MODE - - LD B,BF_DIODEVCNT ; HBIOS FUNC: DEVICE COUNT - RST 08 ; CALL HBIOS - LD A,B ; COUNT TO A - OR A ; SET FLAGS - RET Z ; BAIL OUT IF ZERO - LD C,0 ; INIT DEVICE INDEX -; -PRTALL1: - LD DE,STR_PREFIX ; FORMATTING - CALL WRITESTR ; PRINT IT - LD A,C ; INDEX TO A - ADD A,'0' ; MAKE NUMERIC CHAR - CALL COUT ; PRINT IT - LD A,')' ; FORMATTING - CALL COUT ; PRINT IT - CALL PC_SPACE ; SPACING - PUSH BC ; SAVE LOOP CONTROL - LD B,BF_DIODEVINF ; HBIOS FUNC: DEVICE INFO - RST 08 ; CALL HBIOS - LD D,C ; DEVICE/UNIT TO D - LD E,0 ; LU IS ZERO - CALL PRTDRV ; PRINT IT - POP BC ; RESTORE LOOP CONTROL - INC C ; BUMP INDEX - DJNZ PRTALL1 ; LOOP AS NEEDED - RET ; DONE -; -; PRINT THE DEVICE/UNIT/LU INFO -; ON INPUT D HAS DEVICE/UNIT, E HAS LU -; DESTROY NO REGISTERS OTHER THAN A -; -PRTDRV: - PUSH DE ; PRESERVE DE - PUSH HL ; PRESERVE HL - LD A,D ; LOAD DEVICE/UNIT - RRCA ; ROTATE DEVICE - RRCA ; ... BITS - RRCA ; ... INTO - RRCA ; ... LOWEST 4 BITS - AND $0F ; ISOLATE DEVICE BITS - ADD A,A ; MULTIPLE BY TWO FOR WORD TABLE - LD HL,DEVTBL ; POINT TO START OF DEVICE NAME TABLE - CALL ADDHLA ; ADD A TO HL TO POINT TO TABLE ENTRY - LD A,(HL) ; DEREFERENCE HL TO LOC OF DEVICE NAME STRING - INC HL ; ... - LD D,(HL) ; ... - LD E,A ; ... - CALL WRITESTR ; PRINT THE DEVICE NMEMONIC - POP HL ; RECOVER HL - POP DE ; RECOVER DE - LD A,D ; LOAD DEVICE/UNIT - AND $0F ; ISOLATE UNIT - CALL PRTDECB ; PRINT IT - CALL PC_COLON ; FORMATTING -; LD A,E ; LOAD LU -; CALL PRTDECB ; PRINT IT - RET -; -DEVTBL: ; DEVICE TABLE - .DW DEV00, DEV01, DEV02, DEV03 - .DW DEV04, DEV05, DEV06, DEV07 - .DW DEV08, DEV09, DEV10, DEV11 - .DW DEV12, DEV13, DEV14, DEV15 -; -DEVUNK .DB "???$" -DEV00 .DB "MD$" -DEV01 .DB "FD$" -DEV02 .DB "RAMF$" -DEV03 .DB "IDE$" -DEV04 .DB "ATAPI$" -DEV05 .DB "PPIDE$" -DEV06 .DB "SD$" -DEV07 .DB "PRPSD$" -DEV08 .DB "PPPSD$" -DEV09 .DB "HDSK$" -DEV10 .EQU DEVUNK -DEV11 .EQU DEVUNK -DEV12 .EQU DEVUNK -DEV13 .EQU DEVUNK -DEV14 .EQU DEVUNK -DEV15 .EQU DEVUNK -; -; PRINT LIST OF ALL DRIVES UNDER UNA + LD DE,0 ; TARGET ADDRESS IS ZERO + LD BC,HB_END ; COPY ALL OF HBIOS IMAGE + CALL HB_BNKCPY ; DO IT ; -UPRTALL: - LD B,0 ; START WITH UNIT 0 +; INITIALIZE HBIOS ; -UPRTALL1: ; LOOP THRU ALL UNITS AVAILABLE - LD C,$48 ; UNA FUNC: GET DISK TYPE - LD L,0 ; PRESET UNIT COUNT TO ZERO - RST 08 ; CALL UNA, B IS ASSUMED TO BE UNTOUCHED!!! - LD A,L ; UNIT COUNT TO A - OR A ; PAST END? - RET Z ; WE ARE DONE - PUSH BC ; SAVE UNIT - CALL UPRTDRV ; PROCESS THE UNIT - POP BC ; RESTORE UNIT - INC B ; NEXT UNIT - JR UPRTALL1 ; LOOP + LD A,BID_BIOS ; HBIOS BANK + LD HL,0 ; ADDRESS 0 IS HBIOS INIT ENTRY ADDRESS + CALL HB_BNKCALL ; DO IT ; -; PRINT THE UNA UNIT INFO -; ON INPUT B HAS UNIT +; CHAIN TO OS LOADER ; -UPRTDRV: - PUSH BC ; SAVE UNIT - PUSH DE ; SAVE DISK TYPE - LD DE,STR_PREFIX ; NEWLINE AND SPACING - CALL WRITESTR ; PRINT IT - LD A,B ; DRIVE LETTER TO A - ADD A,'0' ; MAKE IT DISPLAY NUMERIC - CALL COUT ; PRINT IT - LD A,')' ; DRIVE LETTER COLON - CALL COUT ; PRINT IT - CALL PC_SPACE - POP DE ; RECOVER DISK TYPE - LD A,D ; DISK TYPE TO A - CP $40 ; RAM/ROM? - JR Z,UPRTDRV1 ; HANDLE RAM/ROM - LD DE,UDEVIDE ; ASSUME IDE - CP $41 ; IDE? - JR Z,UPRTDRV2 ; PRINT IT - LD DE,UDEVPPIDE ; ASSUME PPIDE - CP $42 ; PPIDE? - JR Z,UPRTDRV2 ; PRINT IT - LD DE,UDEVSD ; ASSUME SD - CP $43 ; SD? - JR Z,UPRTDRV2 ; PRINT IT - LD DE,UDEVDSD ; ASSUME DSD - CP $44 ; DSD? - JR Z,UPRTDRV2 ; PRINT IT - LD DE,UDEVUNK ; OTHERWISE UNKNOWN - JR UPRTDRV2 -; -UPRTDRV1: ; HANDLE RAM/ROM - LD C,$45 ; UNA FUNC: GET DISK INFO - LD DE,$9000 ; 512 BYTE BUFFER *** FIX!!! *** - RST 08 ; CALL UNA - BIT 7,B ; TEST RAM DRIVE BIT - LD DE,UDEVROM ; ASSUME ROM - JR Z,UPRTDRV2 ; IF SO, PRINT IT - LD DE,UDEVRAM ; OTHERWISE RAM - JR UPRTDRV2 ; PRINT IT -; -UPRTDRV2: ; PRINT DEVICE - POP BC ; RECOVER UNIT - CALL WRITESTR ; PRINT DEVICE NAME - LD A,B ; UNIT TO A - ADD A,'0' ; MAKE IT PRINTABLE NUMERIC - CALL COUT ; PRINT IT - LD A,':' ; DEVICE NAME COLON - CALL COUT ; PRINT IT - RET ; DONE -; -UDEVRAM .DB "RAM$" -UDEVROM .DB "ROM$" -UDEVIDE .DB "IDE$" -UDEVPPIDE .DB "PPIDE$" -UDEVSD .DB "SD$" -UDEVDSD .DB "DSD$" -UDEVUNK .DB "UNK$" -; -#IF (DSKYENABLE) -; -; -;__SEGDISPLAY________________________________________________________________________________________ -; -; DISPLAY CONTENTS OF DISPLAYBUF IN DECODED HEX BITS 0-3 ARE DISPLAYED DIG, BIT 7 IS DP -;____________________________________________________________________________________________________ -; -SEGDISPLAY: - PUSH AF ; STORE AF - PUSH BC ; STORE BC - PUSH HL ; STORE HL - LD BC,0007H - ADD HL,BC - LD B,08H ; SET DIGIT COUNT - LD A,40H | 30H ; SET CONTROL PORT 7218 TO OFF - OUT (PPIC),A ; OUTPUT - CALL DELAY ; WAIT - LD A,0F0H ; SET CONTROL TO 1111 (DATA COMING, HEX DECODE,NO DECODE, NORMAL) - -SEGDISPLAY1: ; - OUT (PPIA),A ; OUTPUT TO PORT - LD A,80H | 30H ; STROBE WRITE PULSE WITH CONTROL=1 - OUT (PPIC),A ; OUTPUT TO PORT - CALL DELAY ; WAIT - LD A,40H | 30H ; SET CONTROL PORT 7218 TO OFF - OUT (PPIC),A ; OUTPUT - -SEGDISPLAY_LP: - LD A,(HL) ; GET DISPLAY DIGIT - OUT (PPIA),A ; OUT TO PPIA - LD A,00H | 30H ; SET WRITE STROBE - OUT (PPIC),A ; OUT TO PPIC - CALL DELAY ; DELAY - LD A,40H | 30H ; SET CONTROL PORT OFF - OUT (PPIC),A ; OUT TO PPIC - CALL DELAY ; WAIT - DEC HL ; INC POINTER - DJNZ SEGDISPLAY_LP ; LOOP FOR NEXT DIGIT - POP HL ; RESTORE HL - POP BC ; RESTORE BC - POP AF ; RESTORE AF - RET -#ENDIF -; -;__TEXT_STRINGS_________________________________________________________________________________________________________________ -; -; STRINGS -;_____________________________________________________________________________________________________________________________ -; -STR_BOOTDISK .DB "BOOT FROM DISK\r\n$" -STR_BOOTDISK1 .DB "\r\nReading disk information...$" -STR_BOOTMON .DB "START MONITOR\r\n$" -STR_BOOTCPM .DB "BOOT CPM FROM ROM\r\n$" -STR_BOOTZSYS .DB "BOOT ZSYSTEM FROM ROM\r\n$" -STR_LIST .DB "LIST DEVICES\r\n$" -STR_INVALID .DB "INVALID SELECTION\r\n$" -STR_SETUP .DB "SYSTEM SETUP\r\n$" -STR_SIG .DB "SIGNATURE=$" -STR_CPMLOC .DB "LOC=$" -STR_CPMEND .DB "END=$" -STR_CPMENT .DB "ENT=$" -STR_LABEL .DB "LABEL=$" -STR_DRVLIST .DB "\r\nDevices:\r\n$" -STR_PREFIX .DB "\r\n $" -STR_LOADING .DB "\r\nLoading$" -STR_NODISK .DB "\r\nNo disk!$" -STR_NOBOOT .DB "\r\nDisk not bootable!$" -STR_BOOTERR .DB "\r\nBoot failure!$" -; -STR_BANNER .DB "\r\n", PLATFORM_NAME, " Boot Loader$" -STR_BOOTMENU .DB "\r\nBoot: (C)PM, (Z)System, (M)onitor,\r\n" - .DB " (L)ist devices, or Device ID ===> $" -; - .IF DSKYENABLE -BOOT: -; . . t o o b - .DB 00H, 00H, 80H, 80H, 094H, 09DH, 09DH, 09FH - .ENDIF -; -#DEFINE CIOMODE_HBIOS -#DEFINE DSKY_KBD -#INCLUDE "util.asm" -; -#IF (PLATFORM != PLT_UNA) -#INCLUDE "memmgr.asm" +#IFDEF ROMLOAD + ; PERFORM BANK CALL TO OS IMAGES BANK + LD A,BID_OSIMG ; CHAIN TO OS IMAGES BANK + LD HL,0 ; ENTER AT ADDRESS 0 + CALL HB_BNKCALL ; GO THERE + HALT ; WE SHOULD NEVER COME BACK! +#ELSE + ; SLIDE OS IMAGES BLOB DOWN TO $0000 + LD HL,LDR_END ; SOURCE IS LOADER END + LD BC,HB_END ; PLUS HBIOS IMAGE SIZE + ADD HL,BC ; FINAL SOURCE ADDRESS + LD DE,0 ; TARGET ADDRESS IS ZERO + LD BC,BNKTOP ; MAX SIZE OF OS IMAGES + LDIR ; DO IT + ; JUMP TO START + JP 0 ; AND CHAIN #ENDIF ; -; READ A CONSOLE CHARACTER AND CONVERT TO UPPER CASE -; -CINUC: - CALL CIN - AND 7FH ; STRIP HI BIT - CP 'A' ; KEEP NUMBERS, CONTROLS - RET C ; AND UPPER CASE - CP 7BH ; SEE IF NOT LOWER CASE - RET NC - AND 5FH ; MAKE UPPER CASE - RET -; ;================================================================================================== -; WORKING DATA STORAGE +; MEMORY MANAGER ;================================================================================================== ; -BL_STACKSIZ .EQU 40H - .FILL BL_STACKSIZ,0 -BL_STACK .EQU $ -; -BL_SPT .DB 16 ; SECTORS PER TRACK FOR LOAD DEVICE -BL_LUTRK .DW 0 ; STARTING TRACK FOR LU -BL_CURTRK .DW 0 ; CURRENT TRACK FOR LOAD -BL_CURSEC .DB 0 ; CURRENT SECTOR FOR LOAD -BL_CURDMA .DW 0 ; CURRENT MEM LOC BEING LOADED -BL_COUNT .DB 0 ; LOAD COUNTER -BL_TIMEOUT .DW 0 ; AUTOBOOT TIMEOUT COUNTDOWN COUNTER -BL_BOOTID .DB 0 ; BOOT DEVICE ID CHOSEN BY USER -BL_DEVICE .DB 0 ; DEVICE TO LOAD FROM -BL_LU .DB 0 ; LU TO LOAD FROM -BL_UNAMOD .DB 0 ; UNA MODE FLAG, NONZERO IS UNA -; -; BOOT INFO SECTOR IS READ INTO AREA BELOW -; THE THIRD SECTOR OF A DISK DEVICE IS RESERVED FOR BOOT INFO -; -BL_INFOSEC .EQU $ - .FILL (512 - 128),0 -BB_METABUF .EQU $ -BB_SIG .DW 0 ; SIGNATURE (WILL BE 0A55AH IF SET) -BB_PLATFORM .DB 0 ; FORMATTING PLATFORM -BB_DEVICE .DB 0 ; FORMATTING DEVICE -BB_FORMATTER .FILL 8,0 ; FORMATTING PROGRAM -BB_DRIVE .DB 0 ; PHYSICAL DISK DRIVE # -BB_LU .DB 0 ; LOGICAL UNIT (LU) - .DB 0 ; MSB OF LU, NOW DEPRECATED - .FILL (BB_METABUF + 128) - $ - 32,0 -BB_PROTECT .DB 0 ; WRITE PROTECT BOOLEAN -BB_UPDATES .DW 0 ; UPDATE COUNTER -BB_RMJ .DB 0 ; RMJ MAJOR VERSION NUMBER -BB_RMN .DB 0 ; RMN MINOR VERSION NUMBER -BB_RUP .DB 0 ; RUP UPDATE NUMBER -BB_RTP .DB 0 ; RTP PATCH LEVEL -BB_LABEL .FILL 16,0 ; 16 CHARACTER DRIVE LABEL -BB_TERM .DB 0 ; LABEL TERMINATOR ('$') -BB_BILOC .DW 0 ; LOC TO PATCH BOOT DRIVE INFO TO (IF NOT ZERO) -BB_CPMLOC .DW 0 ; FINAL RAM DESTINATION FOR CPM/CBIOS -BB_CPMEND .DW 0 ; END ADDRESS FOR LOAD -BB_CPMENT .DW 0 ; CP/M ENTRY POINT (CBIOS COLD BOOT) +#IFDEF ROMLOAD +#INCLUDE "memmgr.asm" +#ENDIF ; ;================================================================================================== -; FILL REMAINDER OF BANK +; CLEAN UP ;================================================================================================== ; -SLACK: .EQU (9000H - $) - .FILL SLACK -; - .ECHO "LOADER space remaining: " - .ECHO SLACK - .ECHO " bytes.\n" - .END + .ORG $ - P2LOC ; BACK TO IMAGE-BASED ADDRESSING +LDR_END .EQU $ ; MARK END OF LOADER diff --git a/Source/HBIOS/makefile b/Source/HBIOS/Old/makefile similarity index 100% rename from Source/HBIOS/makefile rename to Source/HBIOS/Old/makefile diff --git a/Source/HBIOS/memmgr.asm b/Source/HBIOS/Old/memmgr.asm similarity index 100% rename from Source/HBIOS/memmgr.asm rename to Source/HBIOS/Old/memmgr.asm diff --git a/Source/HBIOS/setup.asm b/Source/HBIOS/Old/setup.asm similarity index 100% rename from Source/HBIOS/setup.asm rename to Source/HBIOS/Old/setup.asm diff --git a/Source/HBIOS/dbgmon.asm b/Source/HBIOS/dbgmon.asm index 7bdc605d..be72a279 100644 --- a/Source/HBIOS/dbgmon.asm +++ b/Source/HBIOS/dbgmon.asm @@ -39,8 +39,6 @@ BS: .EQU 08H ; ASCII BACKSPACE CHARACTER ; #INCLUDE "util.asm" ; -#INCLUDE "memmgr.asm" -; #IF DSKYENABLE ; #INCLUDE "dsky.asm" @@ -613,28 +611,16 @@ SERIALCMDLOOP: ;_____________________________________________________________________________ ; BOOT: - ; ENSURE DEFAULT MEMORY PAGE CONFIGURATION -;#IF (PLATFORM == PLT_N8) -; LD A,DEFACR -; OUT0 (ACR),A -; XOR A -; OUT0 (RMAP),A -;#ELSE -; XOR A -; OUT (MPCL_ROM),A -; OUT (MPCL_RAM),A -;#ENDIF #IF (PLATFORM == PLT_UNA) LD BC,$01FB ; UNA FUNC = SET BANK LD DE,$0000 ; ROM BANK 0 CALL $FFFD ; DO IT (RST 08 NOT SAFE HERE) + JP 0000H ; JUMP TO RESTART ADDRESS #ELSE - LD A,BID_BOOT - CALL BNKSEL + LD A,BID_BOOT ; BOOT BANK + LD HL,0 ; ADDRESS ZERO + CALL HB_BNKCALL ; DOES NOT RETURN #ENDIF - ; JUMP TO RESTART ADDRESS - JP 0000H - ;__KLOP_______________________________________________________________________ ; diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index 4a833bb4..b331f91f 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -6,6 +6,8 @@ ; INCLUDE GENERIC STUFF ; #INCLUDE "std.asm" +; +#IFNDEF APPBOOT ; .ORG 0 ; @@ -50,7 +52,56 @@ DESC .DB "ROMWBW v", BIOSVER, ", Copyright 2015, Wayne Warthen, GNU GPL v3", 0 ; .FILL ($100 - $),$FF ; PAD REMAINDER OF PAGE ZERO ; -HCB .FILL $100,$FF ; RESERVED FOR HBIOS CONTROL BLOCK +#ENDIF +; +;================================================================================================== +; HBIOS CONFIGURATION BLOCK (HCB) +;================================================================================================== +; + .ORG HCB_LOC +HCB: + JP HB_START +; + .DB 'W',~'W' ; MARKER + .DB RMJ << 4 | RMN ; FIRST BYTE OF VERSION INFO + .DB RUP << 4 | RTP ; SECOND BYTE OF VERSION INFO +; +CB_PLT .DB PLATFORM +CB_CPUMHZ .DB CPUMHZ +CB_CPUKHZ .DW CPUKHZ +CB_RAMBANKS .DB RAMSIZE / 32 +CB_ROMBANKS .DB ROMSIZE / 32 +; +CB_BOOTVOL .DW 0 ; BOOT VOLUME IS UNIT/SLICE, SET BY LOADER +CB_BOOTBID .DB 0 ; BOOT BANK ID, SET BY LOADER +CB_SERDEV .DB 0 ; PRIMARY SERIAL UNIT IS UNIT #0 BY FIAT +CB_CRTDEV .DB $FF ; PRIMARY CRT UNIT, $FF UNTIL AFTER HBIOS INIT +CB_CONDEV .DB $FF ; CONSOLE UNIT, $FF UNTIL AFTER HBIOS INIT +; +;CB_CUREMU .DB VDAEMU ; CURRENT VDA TERMINAL EMULATION (DEPRECATED) +;CB_CURVDA .DB VDADEV ; CURRENT VDA TARGET FOR EMULATION (DEPRECATED) +; +; MEMORY MANAGEMENT VARIABLES START AT $20 +; + .FILL (HCB + $20 - $),0 +; +CB_HEAP .DW 0 +CB_HEAPTOP .DW 0 +; +; STANDARD BANK ID'S START AT $D8 +; + .FILL (HCB + $D8 - $),0 +; +CB_BIDCOM .DB BID_COM +CB_BIDUSR .DB BID_USR +CB_BIDBIOS .DB BID_BIOS +CB_BIDAUX .DB BID_AUX +CB_BIDRAMD0 .DB BID_RAMD0 +CB_BIDRAMDN .DB BID_RAMDN +CB_BIDROMD0 .DB BID_ROMD0 +CB_BIDROMDN .DB BID_ROMDN +; + .FILL (HCB + HCB_SIZ - $),0 ; PAD REMAINDER OF HCB ; ;================================================================================================== ; HBIOS UPPER MEMORY PROXY (RELOCATED TO RUN IN TOP 2 PAGES OF CPU RAM) @@ -423,7 +474,11 @@ HBX_STACK .EQU $ ; ; HBIOS PROXY MGMT BLOCK (TOP 32 BYTES) ; +#IFDEF ROMBOOT .DB BID_BOOT ; CURRENTLY ACTIVE LOW MEMORY BANK ID +#ELSE + .DB BID_USR ; CURRENTLY ACTIVE LOW MEMORY BANK ID +#ENDIF .DB $FF ; DEPRECATED!!! .DW 0 ; BNKCPY SOURCE ADDRESS .DB BID_USR ; BNKCPY SOURCE BANK ID @@ -468,10 +523,25 @@ HB_START: XOR A OUT0 (Z180_RCR),A + ; SET DEFAULT CPU CLOCK MULTIPLIERS (XTAL / 2) + XOR A + OUT0 (Z180_CCR),A + OUT0 (Z180_CMR),A + ; SET DEFAULT WAIT STATES TO ACCURATELY MEASURE CPU SPEED LD A,$F0 OUT0 (Z180_DCNTL),A + ; MMU SETUP + LD A,$80 + OUT0 (Z180_CBAR),A ; SETUP FOR 32K/32K BANK CONFIG + #IFDEF ROMBOOT + XOR A + OUT0 (Z180_BBR),A ; BANK BASE = 0 + #ENDIF + LD A,(RAMSIZE + RAMBIAS - 64) >> 2 + OUT0 (Z180_CBR),A ; COMMON BASE = LAST (TOP) BANK + #IF (Z180_CLKDIV >= 1) ; SET CLOCK DIVIDE TO 1 RESULTING IN FULL XTAL SPEED LD A,$80 @@ -485,6 +555,52 @@ HB_START: #ENDIF #ENDIF +; +#IF (PLATFORM == PLT_ZETA2) + ; SET PAGING REGISTERS +#IFDEF ROMBOOT + XOR A + OUT (MPGSEL_0),A + INC A + OUT (MPGSEL_1),A +#ENDIF + LD A,62 + OUT (MPGSEL_2),A + INC A + OUT (MPGSEL_3),A + ; ENABLE PAGING + LD A,1 + OUT (MPGENA),A +#ENDIF +; +; INSTALL PROXY IN UPPER MEMORY +; + LD HL,HBX_IMG + LD DE,HBX_LOC + LD BC,HBX_SIZ + LDIR +; +; INSTALL HBIOS TO RAM BANK +; + LD A,(HB_CURBNK) + LD (HB_SRCBNK),A + LD A,BID_BIOS + LD (HB_DSTBNK),A + LD HL,0 + LD DE,0 + LD BC,$8000 + CALL HB_BNKCPY +; +; TRANSITION TO HBIOS IN RAM BANK +; + LD A,BID_BIOS ; BIOS BANK ID + LD HL,HB_START1 ; EXECUTION RESUMES HERE + CALL HBX_BNKCALL ; CONTINUE IN RAM BANK, DO NOT RETURN + HALT ; WE SHOULD NOT COME BACK HERE! +HB_START1: ; BNKCALL ARRIVES HERE, BUT NOW RUNNING IN RAM BANK + LD SP,HBX_LOC ; RESET STACK SINCE WE DO NOT RETURN +; +; ; CALL HB_CPUSPD ; CPU SPEED DETECTION ; @@ -578,21 +694,6 @@ INITSYS1: ; LD HL,(HCB + HCB_HEAPTOP) LD (HEAPCURB),HL -;; -;; RUN THROUGH ALL SERIAL DEVICES AND PERFORM FULL INITIALIZATION -;; -; LD A,(CIO_CNT) ; GET SERIAL DEVICE COUNT -; LD B,A ; INIT LOOP COUNTER -; LD C,0 ; INIT UNIT INDEX -;INITSYS2: -; PUSH BC ; SAVE LOOP CONTROL -; LD B,BF_CIOINIT ; FUNC: INIT -; LD DE,-1 ; INIT W/ CURRENT CONFIG -; CALL CIO_DISPATCH ; CALL SERIAL UNIT DISPATCHER -; ;CALL NZ,????? ; IF ERROR, SHOW IT -; POP BC ; RESTORE LOOP CONTROL -; INC C ; NEXT UNIT -; DJNZ INITSYS2 ; LOOP TILL ALL UNITS DONE ; ; NOW SWITCH TO CRT CONSOLE IF CONFIGURED ; @@ -623,6 +724,42 @@ INITSYS1: INITSYS3: ; CALL PRTSUM ; PRINT UNIT/DEVICE SUMMARY TABLE +; +; CHAIN TO OS LOADER +; +#IFDEF ROMBOOT + ; PERFORM BANK CALL TO OS IMAGES BANK + LD A,BID_OSIMG ; CHAIN TO OS IMAGES BANK + LD HL,0 ; ENTER AT ADDRESS 0 + CALL HB_BNKCALL ; GO THERE + HALT ; WE SHOULD NEVER COME BACK! +#ELSE + ; COPY OS IMAGE: BID_USR: --> BID_USR:0 + LD A,BID_USR + LD (HB_SRCBNK),A + LD (HB_DSTBNK),A + LD HL,HB_END + LD DE,0 + LD BC,$8000 + CALL HB_BNKCPY +; + ; PERFORM BANK CALL TO OS IMAGES BANK + LD A,BID_USR ; CHAIN TO OS IMAGES BANK + LD HL,0 ; ENTER AT ADDRESS 0 + CALL HB_BNKCALL ; GO THERE + HALT ; WE SHOULD NEVER COME BACK! + + +; ; SLIDE OS IMAGES BLOB DOWN TO $0000 +; LD HL,LDR_END ; SOURCE IS LOADER END +; LD BC,HB_END ; PLUS HBIOS IMAGE SIZE +; ADD HL,BC ; FINAL SOURCE ADDRESS +; LD DE,0 ; TARGET ADDRESS IS ZERO +; LD BC,BNKTOP ; MAX SIZE OF OS IMAGES +; LDIR ; DO IT +; ; JUMP TO START +; JP 0 ; AND CHAIN +#ENDIF ; RET ; @@ -1792,7 +1929,7 @@ SIZ_TERM .EQU $ - ORG_TERM #INCLUDE "time.asm" #INCLUDE "bcd.asm" #INCLUDE "decode.asm" -#INCLUDE "xio.asm" +;#INCLUDE "xio.asm" ; #IF (DSKYENABLE) #DEFINE DSKY_KBD @@ -2537,9 +2674,9 @@ COUT: JR COUT2 ; CONTINUE ; COUT1: - ; USE XIO - LD A,E ; GET OUTPUT CHAR BACK TO ACCUM - CALL XIO_OUTC ; OUTPUT VIA XIO + ;; USE XIO + ;LD A,E ; GET OUTPUT CHAR BACK TO ACCUM + ;CALL XIO_OUTC ; OUTPUT VIA XIO ; COUT2: ; RESTORE ALL REGISTERS @@ -2569,8 +2706,8 @@ CIN: JR CIN2 ; CONTINUE ; CIN1: - ; USE XIO - CALL XIO_INC ; GET CHAR + ;; USE XIO + ;CALL XIO_INC ; GET CHAR ; CIN2: ; @@ -2599,8 +2736,8 @@ CST: JR CST2 ; CONTINUE ; CST1: - ; USE XIO - CALL XIO_IST ; GET STATUS + ;; USE XIO + ;CALL XIO_IST ; GET STATUS ; CST2: ; RESTORE REGISTERS (AF IS OUTPUT) @@ -2653,11 +2790,16 @@ HB_BCDTMP .FILL 5,0 ; TEMPORARY BCD NUMBER STORAGE ; HB_WRKBUF .FILL 512,0 ; INTERNAL DISK BUFFER ; -HB_END .EXPORT HB_END ; EXPORT ENDING ADDRESS +;HB_END .EXPORT HB_END ; EXPORT ENDING ADDRESS +HB_END .EQU $ ; SLACK .EQU BNKTOP - $ .ECHO "HBIOS space remaining: " .ECHO SLACK .ECHO " bytes.\n" +; +#IFDEF ROMBOOT + .FILL SLACK +#ENDIF ; .END diff --git a/Source/HBIOS/hbios.inc b/Source/HBIOS/hbios.inc index 51aecc23..5870f7fd 100644 --- a/Source/HBIOS/hbios.inc +++ b/Source/HBIOS/hbios.inc @@ -118,17 +118,20 @@ EMUTYP_ANSI .EQU 2 ; ANSI HCB_LOC .EQU $100 ; LOCATION OF HCB IN HBIOS BANK HCB_SIZ .EQU $100 ; SIZE OF HCB DATA BLOCK ; -HCB_CPUMHZ .EQU $05 ; CPU SPEED IN MHZ (BYTE) -HCB_CPUKHZ .EQU $06 ; CPU SPEED IN KHZ (WORD) -HCB_RAMBANKS .EQU $08 ; TOTAL SIZE OF RAM IN 32K BANKS (BYTE) -HCB_ROMBANKS .EQU $09 ; TOTAL SIZE OF ROM IN 32K BANKS (BYTE) -HCB_BOOTVOL .EQU $0A ; BOOT VOLUME, MSB=DEV/UNIT, LSB=LU (WORD) -HCB_BOOTBID .EQU $0C ; BANK ID OF ROM PAGE BOOTED (BYTE) -HCB_SERDEV .EQU $0D ; PRIMARY SERIAL DEVICE/UNIT (BYTE) -HCB_CRTDEV .EQU $0E ; CRT DISPLAY DEVICE/UNIT (BYTE) -HCB_CONDEV .EQU $0F ; ACTIVE CONSOLE DEVICE/UNIT (BYTE) -;HCB_CUREMU .EQU $10 ; CURRENT VDA TERMINAL EMULATION (DEPRECATED) -;HCB_CURVDA .EQU $11 ; CURRENT VDA TARGET FOR EMULATION (DEPRECATED) +HCB_MARKER .EQU $03 ; MARKER ('W',~'W') (WORD) +HCB_VERSION .EQU $05 ; HBIOS VERSION NUM +HCB_PLATFORM .EQU $07 ; PLATFORM ID +HCB_CPUMHZ .EQU $08 ; CPU SPEED IN MHZ (BYTE) +HCB_CPUKHZ .EQU $09 ; CPU SPEED IN KHZ (WORD) +HCB_RAMBANKS .EQU $0B ; TOTAL SIZE OF RAM IN 32K BANKS (BYTE) +HCB_ROMBANKS .EQU $0C ; TOTAL SIZE OF ROM IN 32K BANKS (BYTE) +HCB_BOOTVOL .EQU $0D ; BOOT VOLUME, MSB=DEV/UNIT, LSB=LU (WORD) +HCB_BOOTBID .EQU $0F ; BANK ID OF ROM PAGE BOOTED (BYTE) +HCB_SERDEV .EQU $10 ; PRIMARY SERIAL DEVICE/UNIT (BYTE) +HCB_CRTDEV .EQU $11 ; CRT DISPLAY DEVICE/UNIT (BYTE) +HCB_CONDEV .EQU $12 ; ACTIVE CONSOLE DEVICE/UNIT (BYTE) +;HCB_CUREMU .EQU $13 ; CURRENT VDA TERMINAL EMULATION (DEPRECATED) +;HCB_CURVDA .EQU $14 ; CURRENT VDA TARGET FOR EMULATION (DEPRECATED) ; HCB_HEAP .EQU $20 ; DWORD ADDRESS OF START OF HEAP HCB_HEAPTOP .EQU $22 ; DWORD ADDRESS OF TOP OF HEAP diff --git a/Source/HBIOS/loader.asm b/Source/HBIOS/loader.asm deleted file mode 100644 index 6cbe9093..00000000 --- a/Source/HBIOS/loader.asm +++ /dev/null @@ -1,270 +0,0 @@ -; -;================================================================================================== -; LOADER -;================================================================================================== -; -P2LOC .EQU $F000 ; PHASE 2 RUN LOCATION -; -#IFDEF ROMLOAD -CURBNK .EQU BID_BOOT -#ELSE -CURBNK .EQU BID_USR -#ENDIF -; -;================================================================================================== -; HBIOS CONFIGURATION BLOCK (HCB) -;================================================================================================== -; - .ORG $ + P2LOC -CB: - .DB 'W',~'W' ; MARKER - .DB RMJ << 4 | RMN ; FIRST BYTE OF VERSION INFO - .DB RUP << 4 | RTP ; SECOND BYTE OF VERSION INFO -; -CB_PLT .DB PLATFORM -CB_CPUMHZ .DB CPUMHZ -CB_CPUKHZ .DW CPUKHZ -CB_RAMBANKS .DB RAMSIZE / 32 -CB_ROMBANKS .DB ROMSIZE / 32 -; -CB_BOOTVOL .DW 0 ; BOOT VOLUME IS UNIT/SLICE, SET BY LOADER -CB_BOOTBID .DB 0 ; BOOT BANK ID, SET BY LOADER -CB_SERDEV .DB 0 ; PRIMARY SERIAL UNIT IS UNIT #0 BY FIAT -CB_CRTDEV .DB $FF ; PRIMARY CRT UNIT, $FF UNTIL AFTER HBIOS INIT -CB_CONDEV .DB $FF ; CONSOLE UNIT, $FF UNTIL AFTER HBIOS INIT -; -;CB_CUREMU .DB VDAEMU ; CURRENT VDA TERMINAL EMULATION (DEPRECATED) -;CB_CURVDA .DB VDADEV ; CURRENT VDA TARGET FOR EMULATION (DEPRECATED) -; -; MEMORY MANAGEMENT VARIABLES START AT $20 -; - .FILL (CB + $20 - $),0 -; -CB_HEAP .DW 0 -CB_HEAPTOP .DW 0 -; -; STANDARD BANK ID'S START AT $D8 -; - .FILL (CB + $D8 - $),0 -; -CB_BIDCOM .DB BID_COM -CB_BIDUSR .DB BID_USR -CB_BIDBIOS .DB BID_BIOS -CB_BIDAUX .DB BID_AUX -CB_BIDRAMD0 .DB BID_RAMD0 -CB_BIDRAMDN .DB BID_RAMDN -CB_BIDROMD0 .DB BID_ROMD0 -CB_BIDROMDN .DB BID_ROMDN -; - .FILL (CB + HCB_SIZ - $),0 ; PAD REMAINDER OF HCB -; - .ORG $ - P2LOC -; -;================================================================================================== -; COLD START -;================================================================================================== -; -START: - DI ; NO INTERRUPTS - IM 1 ; INTERRUPT MODE 1 - LD SP,HBX_LOC ; SETUP INITIAL STACK JUST BELOW HBIOS PROXY -; -; HARDWARE BOOTSTRAP FOR Z180 -; FOR N8, ACR & RMAP ARE ASSUMED TO BE ALREADY SET OR THIS CODE -; WOULD NOT BE EXECUTING -; -#IF ((PLATFORM == PLT_N8) | (PLATFORM == PLT_MK4)) - ; SET BASE FOR CPU IO REGISTERS - LD A,Z180_BASE - OUT0 (Z180_ICR),A - - ; DISABLE REFRESH - XOR A - OUT0 (Z180_RCR),A - - ; SET DEFAULT CPU CLOCK MULTIPLIERS (XTAL / 2) - XOR A - OUT0 (Z180_CCR),A - OUT0 (Z180_CMR),A - - ; SET DEFAULT WAIT STATES - LD A,$F0 - OUT0 (Z180_DCNTL),A - - ; MMU SETUP - LD A,$80 - OUT0 (Z180_CBAR),A ; SETUP FOR 32K/32K BANK CONFIG -#IFDEF ROMLOAD - XOR A - OUT0 (Z180_BBR),A ; BANK BASE = 0 -#ENDIF - LD A,(RAMSIZE + RAMBIAS - 64) >> 2 - OUT0 (Z180_CBR),A ; COMMON BASE = LAST (TOP) BANK - -#IF (Z180_CLKDIV >= 1) - ; SET CLOCK DIVIDE TO 1 RESULTING IN FULL XTAL SPEED - LD A,$80 - OUT0 (Z180_CCR),A -#ENDIF - -#IF (Z180_CLKDIV >= 2) - ; SET CPU MULTIPLIER TO 1 RESULTING IN XTAL * 2 SPEED - LD A,$80 - OUT0 (Z180_CMR),A -#ENDIF - - ; SET DESIRED WAIT STATES - LD A,0 + (Z180_MEMWAIT << 6) | (Z180_IOWAIT << 4) - OUT0 (Z180_DCNTL),A -#ENDIF -; -; HARDWARE BOOTSTRAP FOR ZETA 2 -; -#IF (PLATFORM == PLT_ZETA2) - ; SET PAGING REGISTERS -#IFDEF ROMLOAD - XOR A - OUT (MPGSEL_0),A - INC A - OUT (MPGSEL_1),A -#ENDIF - LD A,62 - OUT (MPGSEL_2),A - INC A - OUT (MPGSEL_3),A - ; ENABLE PAGING - LD A,1 - OUT (MPGENA),A -#ENDIF -; -; EMIT FIRST SIGN OF LIFE TO SERIAL PORT -; - CALL XIO_INIT ; INIT SERIAL PORT -#IFNDEF ROMLOAD - CALL XIO_CRLF ; FORMATTING -#ENDIF - LD HL,STR_BOOT ; POINT TO MESSAGE - CALL XIO_OUTS ; SAY HELLO -; -; COPY OURSELVES AND LOADER TO HI RAM FOR PHASE 2 -; - LD HL,0 ; COPY FROM START OF ROM IMAGE - LD DE,P2LOC ; TO HIMEM RUN LOCATION - LD BC,LDR_END ; COPY FULL IMAGE - LDIR -; - CALL XIO_DOT ; MARK PROGRESS -; - JP PHASE2 ; JUMP TO PHASE 2 BOOT IN UPPER MEMORY -; -STR_BOOT .DB "RomWBW$" -; -; IMBED DIRECT SERIAL I/O ROUTINES -; -#INCLUDE "xio.asm" -#INCLUDE "decode.asm" -; -;______________________________________________________________________________________________________________________ -; -; THIS IS THE PHASE 2 CODE THAT MUST EXECUTE IN UPPER MEMORY -; - .ORG $ + P2LOC ; WE ARE NOW EXECUTING IN UPPER MEMORY -; -PHASE2: - CALL XIO_DOT ; MARK PROGRESS -; -; INSTALL HBIOS PROXY IN UPPER MEMORY -; -#IFDEF ROMLOAD - LD A,BID_BIOSIMG ; HBIOS IMAGE ROM BANK - CALL BNKSEL ; SELECT IT -#ENDIF - LD HL,HBX_IMG ; HL := SOURCE OF HBIOS PROXY IMAGE -#IFNDEF ROMLOAD - LD BC,LDR_END ; SIZE OF LOADER - ADD HL,BC ; OFFSET SOURCE ADDRESS -#ENDIF - LD DE,HBX_LOC ; DE := DESTINATION TO INSTALL IT - LD BC,HBX_SIZ ; SIZE - LDIR ; DO THE COPY - LD A,CURBNK ; BOOT/SETUP BANK - LD (HB_CURBNK),A ; INIT CURRENT BANK -#IFDEF ROMLOAD - CALL BNKSEL ; SELECT IT -#ENDIF - CALL XIO_DOT ; MARK PROGRESS -; -; INSTALL HBIOS CODE BANK -; -#IFDEF ROMLOAD - LD A,BID_BIOSIMG ; SOURCE BANK -#ELSE - LD A,(HB_CURBNK) ; SOURCE BANK -#ENDIF - LD (HB_SRCBNK),A ; SET IT - LD A,BID_BIOS ; DESTINATION BANK - LD (HB_DSTBNK),A ; SET IT - LD HL,0 ; SOURCE ADDRESS IS ZERO -#IFNDEF ROMLOAD - LD BC,LDR_END ; SIZE OF LOADER - ADD HL,BC ; OFFSET SOURCE ADDRESS -#ENDIF - LD DE,0 ; TARGET ADDRESS IS ZERO - LD BC,HB_END ; COPY ALL OF HBIOS IMAGE - CALL XIO_DOT ; MARK PROGRESS - CALL HB_BNKCPY ; DO IT - CALL XIO_DOT ; MARK PROGRESS -; -; INSTALL HCB INTO HBIOS CODE BANK -; - LD A,BID_BIOS ; GET BIOS BANK - LD (HB_SRCBNK),A ; SET AS SOURCE (IRRELEVANT) - LD (HB_DSTBNK),A ; SET AS DEST - LD HL,CB ; LOCAL LOADER HCB ADDRESS - LD DE,HCB_LOC ; DEST HBIOS HCB ADDRESS - LD BC,HCB_SIZ ; ONE PAGE IN LENGTH - CALL HB_BNKCPY ; DO IT - CALL XIO_DOT ; MARK PROGRESS -; -; -; INITIALIZE HBIOS -; - CALL XIO_SYNC ; FLUSH OUTPUT FIFO - LD A,BID_BIOS ; HBIOS BANK - LD HL,0 ; ADDRESS 0 IS HBIOS INIT ENTRY ADDRESS - CALL HB_BNKCALL ; DO IT -; -; CHAIN TO OS LOADER -; -#IFDEF ROMLOAD - ; PERFORM BANK CALL TO OS IMAGES BANK - LD A,BID_OSIMG ; CHAIN TO OS IMAGES BANK - LD HL,0 ; ENTER AT ADDRESS 0 - CALL HB_BNKCALL ; GO THERE - HALT ; WE SHOULD NEVER COME BACK! -#ELSE - ; SLIDE OS IMAGES BLOB DOWN TO $0000 - LD HL,LDR_END ; SOURCE IS LOADER END - LD BC,HB_END ; PLUS HBIOS IMAGE SIZE - ADD HL,BC ; FINAL SOURCE ADDRESS - LD DE,0 ; TARGET ADDRESS IS ZERO - LD BC,BNKTOP ; MAX SIZE OF OS IMAGES - LDIR ; DO IT - ; JUMP TO START - JP 0 ; AND CHAIN -#ENDIF -; -;================================================================================================== -; MEMORY MANAGER -;================================================================================================== -; -#IFDEF ROMLOAD -#INCLUDE "memmgr.asm" -#ENDIF -; -;================================================================================================== -; CLEAN UP -;================================================================================================== -; - .ORG $ - P2LOC ; BACK TO IMAGE-BASED ADDRESSING -LDR_END .EQU $ ; MARK END OF LOADER