Browse Source

Unified Menu structure for romldr to ease intergration of ROMs

pull/16/head
b1ackmai1er 7 years ago
committed by GitHub
parent
commit
42cf223f4e
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 391
      Source/HBIOS/romldr.asm

391
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:

Loading…
Cancel
Save