From 42cf223f4e9db16c11aa6999399f12feb7710120 Mon Sep 17 00:00:00 2001 From: b1ackmai1er <39449559+b1ackmai1er@users.noreply.github.com> Date: Tue, 6 Nov 2018 16:01:14 +0800 Subject: [PATCH] Unified Menu structure for romldr to ease intergration of ROMs --- Source/HBIOS/romldr.asm | 391 ++++++++++++++++------------------------ 1 file changed, 156 insertions(+), 235 deletions(-) diff --git a/Source/HBIOS/romldr.asm b/Source/HBIOS/romldr.asm index ea01c3d9..fda7d702 100644 --- a/Source/HBIOS/romldr.asm +++ b/Source/HBIOS/romldr.asm @@ -7,23 +7,8 @@ ; #INCLUDE "std.asm" ; -; osimg.bin -; -;LDRIMG .EQU $0000 ;SIZE 0A00 > 0000-0A00 -MONIMG .EQU $0A00 ;SIZE 1000 > 0A00-1A00 -CPMIMG .EQU $1A00 ;SIZE 3000 > 1A00-4A00 -ZSYSIMG .EQU $4A00 ;SIZE 3000 > 4A00-7A00 -EGGIMG .EQU $7A00 ;SIZE 0200 > 7A00-7C00 -; -; osimg1.bin -; -FTHIMG .EQU $0000 ;SIZE 1700 > 0000-1700 -BASIMG .EQU $1700 ;SIZE 2000 > 1700-3700 -TBCIMG .EQU $3700 ;SIZE 0900 > 3700-4000 -; INT_IM1 .EQU $FF00 ; - .ORG 0 ; ;================================================================================================== @@ -134,52 +119,86 @@ INT_IM1 .EQU $FF00 ;________________________________________________________________________________________________________________________________ ; DOBOOTMENU: -; CALL NEWLINE - LD DE,STR_BOOTMENU - CALL WRITESTR - CALL PRTALL - CALL PC_COLON - +; #IF (DSKYENABLE) - LD HL,BOOT ; POINT TO BOOT MESSAGE - CALL SEGDISPLAY ; DISPLAY MESSAGE + LD HL,BOOT ; POINT TO BOOT MESSAGE + CALL SEGDISPLAY ; DISPLAY MESSAGE #ENDIF #IF (BOOTTYPE == BT_AUTO) - LD BC,100 * BOOT_TIMEOUT - LD (BL_TIMEOUT),BC + LD BC,100 * BOOT_TIMEOUT + LD (BL_TIMEOUT),BC #ENDIF -DB_BOOTLOOP: -; -; CHECK FOR CONSOLE BOOT KEYPRESS -; - CALL CST - OR A - JP Z,DB_CONEND - CALL CINUC - CP 'B' ; NASCOM BASIC - JP Z,GOBASIC - CP 'C' ; CP/M BOOT FROM ROM - JP Z,GOCPM - CP 'E' ; CP/M BOOT FROM ROM - JP Z,GOEASTA - CP 'F' ; FORTH - JP Z,GOFORTH - CP 'M' ; MONITOR - JP Z,GOMONSER -; CP 'L' ; LIST DRIVES -; JP Z,GOLIST - CP 'T' ; TASTY BASIC - JP Z,GOTBAS - CP 'Z' ; ZSYSTEM BOOT FROM ROM - JP Z,GOZSYS - CP '0' ; 0-9, DISK DEVICE - JP C,DB_INVALID - CP '9' + 1 - JP NC,DB_INVALID - SUB '0' - JP GOBOOTDISK +DB_BOOTLOOP: ; OUTPUT A '$' TERMINATED MENU TEXT WITH HIGHLIGHT + LD B,MENU_N + LD DE,MENU_S + LD HL,MENU_V +MENU_L: PUSH DE +WRITE_M:PUSH BC + PUSH HL + PUSH DE + POP HL + LD BC,10 + ADD HL,BC ; HL POINTS TO MENU KEY +WRITEM1:LD A,(DE) + CP '$' ; TEST FOR STRING TERMINATOR + JP Z,WRITEM2 + CP (HL) + JR NZ,WRITEM3 + LD A,'(' + CALL COUT + LD A,(DE) + CALL COUT + LD A,')' +WRITEM3:CALL COUT + INC DE + JR WRITEM1 +WRITEM2:POP HL + POP BC + + POP DE + EX DE,HL + ADD HL,DE + EX DE,HL + DJNZ MENU_L ; NEXT MENU ITEM + + CALL NEWLINE ; DISPLAY AVAILABLE DRIVES + CALL PRTALL + CALL PC_COLON + +MENU_W: CALL CST ; INPUT A MENU SELECTION + OR A + JP Z,MENU_W + CALL CINUC + + LD B,MENU_N + LD DE,MENU_S+10-MENU_V + LD HL,MENU_V +MENU_C: EX DE,HL + ADD HL,DE + CP (HL) + EX DE,HL + JR Z,MENU_X + DJNZ MENU_C ; FALL THRU IF IT DOES NOT MATCH ROM MENU + +; CHECK FOR DRIVE EXECUTION + + CP '0' ; 0-9, DISK DEVICE + JP C,DB_INVALID + CP '9' + 1 + JP NC,DB_INVALID + SUB '0' + JP GOBOOTDISK + +MENU_X: EX DE,HL ; WE HAVE A VALID ROM MENU OPTION + INC HL + LD E,(HL) + INC HL + LD D,(HL) + EX DE,HL + JP (HL) ;; JUMP TO THE ROUTINE TO EXECUTE IT + DB_CONEND: ; ; CHECK FOR DSKY BOOT KEYPRESS @@ -249,170 +268,92 @@ DB_DSKYEND: #ENDIF JP DB_BOOTLOOP -; + +#DEFINE MENU_L(M1,M2,M3,M4,M5,M6,M7,M8,M9,M10) \ +#DEFCONT \ .DB M1 +#DEFCONT \ .DB M2 +#DEFCONT \ .DW M3 +#DEFCONT \ .DB M4 +#DEFCONT \ .DW M5 +#DEFCONT \ .DW M6 +#DEFCONT \ .DW M7 +#DEFCONT \ .DW M8 +#DEFCONT \ .DB M9 +#DEFCONT \ .DB M10 +; +; name menu exec source-bank dest-exec source-addr dest-addr img-size dest-bank desc +; DB DB DW DB DW DW DW DW DB DB +MENU_S: MENU_L("MONITOR $$", "M", GOROM, BID_BIOSIMG, MON_SERIAL, 0A00h, MON_LOC, MON_SIZ, BID_USR, "Monitor$12345") +MENU_1: MENU_L("CPM $ $", "C", GOROM, BID_BIOSIMG, CPM_ENT, 1A00h, CPM_LOC, CPM_SIZ, BID_USR, "CP/M$ ") + MENU_L("Z-SYSTEM $", "Z", GOROM, BID_BIOSIMG, CPM_ENT, 4A00h, CPM_LOC, CPM_SIZ, BID_USR, "Z-System$ ") + MENU_L("$ $", "E", GOROM, BID_BIOSIMG, EGG_LOC, 7A00h, EGG_LOC, EGG_SIZ, BID_USR, "$ ") + MENU_L("FORTH $ $", "R", GOROMB, BID_OSIMG, FTH_LOC, 0000h, FTH_LOC, FTH_SIZ, BID_USR, "Camel Forth$ ") + MENU_L("BASIC $ $", "B", GOROMB, BID_OSIMG, BAS_LOC, 1700h, BAS_LOC, BAS_SIZ, BID_USR, "Nascom BASIC$") + MENU_L("T-BASIC $$", "T", GOROMB, BID_OSIMG, TBC_LOC, 3700h, TBC_LOC, TBC_SIZ, BID_USR, "Tasty BASIC$ ") + +#IF (DSKYENABLE) + MENU_L("DSKY-MON $", "D", GOROM, BID_BIOSIMG, MON_DSKY, 0A00h, MON_LOC, MON_SIZ, BID_USR, DSKY Monitor$") +#ENDIF + +MENU_E: + +MENU_V .EQU MENU_1-MENU_S ; LENGTH OF EACH MENU RECORD +MENU_N .EQU (MENU_E-MENU_S)/MENU_V ; NUMBER OF MENU ITEMS + ; ; BOOT OPTION PROCESSING ; DB_INVALID: - LD DE,STR_INVALID - CALL WRITESTR - JP DOBOOTMENU -; -GOBASIC: - LD DE,STR_BOOTBAS ; DE POINTS TO MESSAGE - CALL WRITESTR ; WRITE IT TO CONSOLE - ; COPY BASIC FROM BASIC FROM OSIMG0 IN ROM BANK TO THIS RAM BANKS - LD B,BF_SYSSETCPY ; HBIOS FUNC: SETUP BANK COPY - LD D,BID_USR ; D = DEST BANK = USER BANK - LD E,BID_OSIMG ; E = SRC BANK = BIOS BANK - LD HL,BAS_SIZ ; HL = COPY LEN = 1 PAGE = 256 BYTES - RST 08 ; DO IT - LD DE,STR_LOADING - CALL WRITESTR ; WRITE IT TO CONSOLE - LD B,BF_SYSBNKCPY ; HBIOS FUNC: PERFORM BANK COPY - LD HL,BASIMG ; COPY FROM - LD DE,BAS_LOC ; COPY TO - RST 08 ; DO IT - LD DE,STR_LAUNCH - CALL WRITESTR - LD HL,BAS_LOC - JP CHAIN - -; LD HL,BAS_LOC ; FIRST BANK CODE -; PUSH HL -; LD DE,STR_BOOTBAS ; DE POINTS TO MESSAGE -; CALL WRITESTR ; WRITE IT TO CONSOLE -; ; COPY IMAGE TO EXEC ADDRESS -; LD HL,BASIMG ; HL := BASIC IMAGE ADDRESS -; LD DE,BAS_LOC ; DE := BASIC EXEC ADDRESS -; LD BC,BAS_SIZ ; BC := BASIC SIZE -; LDIR ; COPY BASIC CODE TO EXEC ADDRESS -; POP HL ; RECOVER ENTRY ADDRESS -; JR CHAIN ; AND CHAIN TO IT + LD DE,STR_INVALID + CALL WRITESTR + JP DOBOOTMENU +; +GOROM: EX DE,HL + INC HL ; HL POINTS TO source-bank +; LD A,(HL) +; CP BID_BIOSIMG +; JP Z,DOBOOTMENU; ONLY CURRENT BANK SUPPORTED -GOEASTA: - - LD HL,EGG_LOC - PUSH HL - LD DE,STR_LAUNCH ; DE POINTS TO MESSAGE - CALL WRITESTR ; WRITE IT TO CONSOLE - ; COPY IMAGE TO EXEC ADDRESS - LD HL,EGGIMG ; HL := BASIC IMAGE ADDRESS - LD DE,EGG_LOC ; DE := BASIC EXEC ADDRESS - LD BC,EGG_SIZ ; BC := BASIC SIZE - LDIR ; COPY BASIC CODE TO EXEC ADDRESS - POP HL ; RECOVER ENTRY ADDRESS - JP CHAIN ; AND CHAIN TO IT + LD B,4 ; +GOROM_1:INC HL + LD E,(HL) + INC HL + LD D,(HL) + PUSH DE + DJNZ GOROM_1 + + POP BC ; SIZE + POP DE ; DEST + POP HL ; SOURCE + LDIR + JR CHAIN -GOTBAS: - LD DE,STR_BOOTTBC ; DE POINTS TO MESSAGE - CALL WRITESTR ; WRITE IT TO CONSOLE - ; COPY BASIC FROM OSIMG0 IN ROM BANK TO THIS RAM BANKS - LD B,BF_SYSSETCPY ; HBIOS FUNC: SETUP BANK COPY - LD D,BID_USR ; D = DEST BANK = USER BANK - LD E,BID_OSIMG ; E = SRC BANK = BIOS BANK - LD HL,TBC_SIZ ; HL = COPY LEN = 1 PAGE = 256 BYTES - RST 08 ; DO IT - LD DE,STR_LOADING - CALL WRITESTR ; WRITE IT TO CONSOLE - LD B,BF_SYSBNKCPY ; HBIOS FUNC: PERFORM BANK COPY - LD HL,TBCIMG ; COPY FROM - LD DE,TBC_LOC ; COPY TO - RST 08 ; DO IT - LD DE,STR_LAUNCH - CALL WRITESTR - LD HL,TBC_LOC - JP CHAIN - -; LD HL,TBC_LOC ; FIRST BANK CODE -; PUSH HL -; LD DE,STR_BOOTTBC ; DE POINTS TO MESSAGE -; CALL WRITESTR ; WRITE IT TO CONSOLE -; ; COPY IMAGE TO EXEC ADDRESS -; LD HL,TBCIMG ; HL := BASIC IMAGE ADDRESS -; LD DE,TBC_LOC ; DE := BASIC EXEC ADDRESS -; LD BC,TBC_SIZ ; BC := BASIC SIZE -; LDIR ; COPY BASIC CODE TO EXEC ADDRESS -; POP HL ; RECOVER ENTRY ADDRESS -; JR CHAIN ; AND CHAIN TO IT +GOROMB: EX DE,HL + INC HL ; HL POINTS TO source-bank +; LD A,(HL) +; CP BID_BIOSIMG +; JP Z,DOBOOTMENU; ONLY CURRENT BANK SUPPORTED -GOFORTH: - LD DE,STR_BOOTFTH ; DE POINTS TO MESSAGE - CALL WRITESTR ; WRITE IT TO CONSOLE - ; COPY FORTH FROM OSIMG0 IN ROM BANK TO THIS RAM BANKS - LD B,BF_SYSSETCPY ; HBIOS FUNC: SETUP BANK COPY - LD D,BID_USR ; D = DEST BANK = USER BANK - LD E,BID_OSIMG ; E = SRC BANK = BIOS BANK - LD HL,FTH_SIZ ; HL = COPY LEN = 1 PAGE = 256 BYTES - RST 08 ; DO IT - LD DE,STR_LOADING - CALL WRITESTR ; WRITE IT TO CONSOLE - LD B,BF_SYSBNKCPY ; HBIOS FUNC: PERFORM BANK COPY - LD HL,FTHIMG ; COPY FROM - LD DE,FTH_LOC ; COPY TO - RST 08 ; DO IT - LD DE,STR_LAUNCH - CALL WRITESTR - LD HL,FTH_LOC - JP CHAIN + LD B,4 +GOROMB1:INC HL + LD E,(HL) + INC HL + LD D,(HL) + PUSH DE + DJNZ GOROMB1 + + POP HL ; SIZE + LD B,BF_SYSSETCPY ; HBIOS FUNC: SETUP BANK COPY + LD D,BID_USR ; D = DEST BANK = USER BANK + LD E,BID_OSIMG ; E = SRC BANK = BIOS BANK + RST 08 + + POP DE ; DEST + POP HL ; SOURCE + LD B,BF_SYSBNKCPY ; HBIOS FUNC: PERFORM BANK COPY + RST 08 ; DO IT -; LD HL,FTH_LOC ; FIRST BANK CODE -; PUSH HL -; LD DE,STR_BOOTFTH ; DE POINTS TO MESSAGE -; CALL WRITESTR ; WRITE IT TO CONSOLE -; ; COPY IMAGE TO EXEC ADDRESS -; LD HL,FTHIMG ; HL := BASIC IMAGE ADDRESS -; LD DE,FTH_LOC ; DE := BASIC EXEC ADDRESS -; LD BC,FTH_SIZ ; BC := BASIC SIZE -; LDIR ; COPY BASIC CODE TO EXEC ADDRESS -; POP HL ; RECOVER ENTRY ADDRESS -; JR CHAIN ; AND CHAIN TO IT - -GOMONSER: - LD HL,MON_SERIAL ; MONITOR SERIAL INTERFACE ENTRY ADDRESS TO HL - JR GOMON ; LOAD AND RUN MONITOR -; -GOMONDSKY: - LD HL,MON_DSKY ; MONITOR DSKY INTERFACE ENTRY ADDRESS TO HL - JR GOMON ; LOAD AND RUN MONITOR -; -GOMON: - LD DE,STR_BOOTMON ; DE POINTS TO MESSAGE - CALL WRITESTR ; WRITE IT TO CONSOLE -; - PUSH HL ; SAVE DESIRED MONITOR ENTRY ADDRESS -; - ; COPY MONITOR IMAGE TO EXEC ADDRESS - LD HL,MONIMG ; HL := MONITOR IMAGE ADDRESS - LD DE,MON_LOC ; DE := MONITOR EXEC ADDRESS - LD BC,MON_SIZ ; BC := MONITOR SIZE - LDIR ; COPY MONITOR CODE TO EXEC ADDRESS -; - POP HL ; RECOVER ENTRY ADDRESS - JR CHAIN ; AND CHAIN TO IT -; -GOCPM: - LD DE,STR_BOOTCPM ; DE POINTS TO MESSAGE - CALL WRITESTR ; WRITE IT TO CONSOLE - LD HL,CPMIMG ; SET HL TO CPM IMAGE ADDRESS - JR GOOS ; LOAD AND RUN OS -; -GOZSYS: - LD DE,STR_BOOTZSYS ; DE POINTS TO MESSAGE - CALL WRITESTR ; WRITE IT TO CONSOLE - LD HL,ZSYSIMG ; SET HL TO ZSYS IMAGE ADDRESS - JR GOOS ; LOAD AND RUN OS -; -GOOS: - ; COPY OS IMAGE TO EXEC ADDRESS - LD DE,CPM_LOC ; DE := MONITOR EXEC ADDRESS - LD BC,CPM_SIZ ; BC := MONITOR SIZE - LDIR ; COPY MONITOR CODE TO EXEC ADDRESS -; - LD HL,CPM_ENT - ;JR CHAIN ; CHAIN TO ENTRY ADDRESS IN USER BANK -; CHAIN: - PUSH HL ; SAVE ENTRY ADDRESS +; PUSH HL ; SAVE ENTRY ADDRESS ; #IF (PLATFORM == PLT_UNA) LD BC,$00FB ; GET LOWER PAGE ID @@ -440,15 +381,6 @@ CHAIN: CALL HB_BNKCALL ; AND GO HALT ; WE SHOULD NEVER RETURN!!! #ENDIF - -; -GOLIST: - LD DE,STR_LIST - CALL WRITESTR - LD DE,STR_DRVLIST - CALL WRITESTR - CALL PRTALL - JP DOBOOTMENU ; GOBOOTDISK: LD (BL_BOOTID),A @@ -886,13 +818,7 @@ DEV15 .EQU DEVUNK ; STR_BOOTDISK .DB "BOOT FROM DISK\r\n$" STR_BOOTDISK1 .DB "\r\nReading disk information...$" -STR_BOOTMON .DB "START MONITOR FROM ROM\r\n$" -STR_BOOTBAS .DB "START BASIC FROM ROM\r\n$" -STR_BOOTFTH .DB "START FORTH FROM ROM\r\n$" -STR_BOOTTBC .DB "START TASTYBASIC FROM ROM\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_LIST .DB "LIST DEVICES\r\n$" STR_INVALID .DB "INVALID SELECTION\r\n$" STR_SETUP .DB "SYSTEM SETUP\r\n$" STR_SIG .DB "SIGNATURE=$" @@ -902,18 +828,13 @@ STR_CPMENT .DB "ENT=$" STR_LABEL .DB "LABEL=$" STR_DRVLIST .DB "\r\nDisk Devices:\r\n$" STR_PREFIX .DB "($" -;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_ITSRAM .DB "\r\n\RAM$" -STR_LAUNCH .DB "\r\nLaunching ...$" -; -STR_BANNER .DB "\r\n", PLATFORM_NAME, " Boot Loader$" -STR_BOOTMENU .DB "\r\n" - .DB "\r\nROM Boot: (B)ASIC, (C)PM, (F)ORTH, (M)onitor, (T)ASTYBASIC, (Z)System.\r\n" - .DB "Disk Boot: $" +;STR_LAUNCH .DB "\r\nLaunching ...$" +STR_BANNER .DB "\r\n", PLATFORM_NAME, " Boot Loader" +STR_NL .DB "\r\n$" ; .IF DSKYENABLE BOOT: