Browse Source

Merge pull request #20 from b1ackmai1er/master

Romldr now uses one routine to execute code.
pull/23/head
Wayne Warthen 7 years ago
committed by GitHub
parent
commit
7ed82106a3
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 149
      Source/HBIOS/romldr.asm

149
Source/HBIOS/romldr.asm

@ -125,20 +125,25 @@ DOBOOTMENU:
#ENDIF
;
LD B,MENU_N ; DISPLAY ALL ROM MENU ENTRIES
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)
LD HL,MENU_S ; DE POINTS TO START RECORD
MENU_L: PUSH HL ; SAVE CURRENT RECORD POSITION
PUSH HL ; PUT CURRENT ROM RECORD IN HL
POP DE
PUSH BC ; POINT HL TO THE MENU KEY
LD BC,MENU_O
ADD HL,BC
POP BC
WRITEM1:LD A,(DE) ; DE STEPS THROUGH THE MENU NAMES
CP '$' ; TEST FOR STRING TERMINATOR
JP Z,WRITEM2
CP (HL)
JR Z,WRITEM2
CP (HL) ; DO WE HAVE A MATCH WITH MENU
JR NZ,WRITEM3
LD A,'('
CALL COUT
LD A,(DE)
@ -147,13 +152,13 @@ WRITEM1:LD A,(DE)
WRITEM3:CALL COUT
INC DE
JR WRITEM1
WRITEM2:POP HL
POP BC
WRITEM2:POP HL ; RECALL THE PREVIOUS RECORD
LD DE,MENU_V ; SAVED AT MENU_L
ADD HL,DE ; MOVE TO NEXT RECORD
LD A,' '
CALL COUT
POP DE
EX DE,HL
ADD HL,DE
EX DE,HL
DJNZ MENU_L ; NEXT MENU ITEM
CALL NEWLINE ; DISPLAY AVAILABLE DRIVES
@ -214,12 +219,16 @@ MENU_C: EX DE,HL
JP GOBOOTDISK
MENU_X: CALL NEWLINE
EX DE,HL ; WE HAVE A VALID ROM MENU OPTION
INC HL
; DE CONTAIN POINTER TO MENU RECORD
EX DE,HL
INC HL ; WE HAVE A VALID ROM MENU OPTION
LD E,(HL)
INC HL
LD D,(HL)
EX DE,HL
JP (HL) ; JUMP TO THE ROUTINE TO EXECUTE IT
DB_INVALID:
@ -230,26 +239,26 @@ DB_INVALID:
#DEFCONT \ .DB M1
#DEFCONT \ .DB M2
#DEFCONT \ .DW M3
#DEFCONT \ .DB M4
#DEFCONT \ .DW M4
#DEFCONT \ .DW M5
#DEFCONT \ .DW M6
#DEFCONT \ .DW M7
#DEFCONT \ .DW M8
#DEFCONT \ .DB 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, 1000h, MON_LOC, MON_SIZ, BID_USR, "Monitor$12345")
MENU_1: MENU_L("CP/M $ $", "C", GOROM, BID_BIOSIMG, CPM_ENT, 2000h, CPM_LOC, CPM_SIZ, BID_USR, "CP/M 80 2.2$ ")
MENU_L("Z-SYSTEM $", "Z", GOROM, BID_BIOSIMG, CPM_ENT, 5000h, CPM_LOC, CPM_SIZ, BID_USR, "ZSDOS V1.1 $ ")
MENU_L("$ $", "E", GOROM, BID_BIOSIMG, EGG_LOC, 0E00h, EGG_LOC, EGG_SIZ, BID_USR, "Easter Egg $ ")
MENU_L("FORTH $ $", "F", 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$ ")
; name menu exec dest-exec source dest-addr img-size source-bank dest desc
; DB DB DW DB DW DW DW DW DB DB
MENU_S: MENU_L("MONITOR$ $", "M", GOROM, MON_SERIAL, 1000h, MON_LOC, MON_SIZ, BID_BIOSIMG, BID_USR, "Monitor$12345")
MENU_1: MENU_L("CP/M$ $", "C", GOROM, CPM_ENT, 2000h, CPM_LOC, CPM_SIZ, BID_BIOSIMG, BID_USR, "CP/M 80 2.2$ ")
MENU_L("Z-SYSTEM$$", "Z", GOROM, CPM_ENT, 5000h, CPM_LOC, CPM_SIZ, BID_BIOSIMG, BID_USR, "ZSDOS V1.1$ ")
MENU_L("$ $", "E", GOROM, EGG_LOC, 0E00h, EGG_LOC, EGG_SIZ, BID_BIOSIMG, BID_USR, "Easter Egg$ ")
MENU_L("FORTH$ $", "F", GOROM, FTH_LOC, 0000h, FTH_LOC, FTH_SIZ, BID_OSIMG, BID_USR, "Camel Forth$ ")
MENU_L("BASIC$ $", "B", GOROM, BAS_LOC, 1700h, BAS_LOC, BAS_SIZ, BID_OSIMG, BID_USR, "Nascom BASIC$")
MENU_L("T-BASIC$ $", "T", GOROM, TBC_LOC, 3700h, TBC_LOC, TBC_SIZ, BID_OSIMG, BID_USR, "Tasty BASIC$ ")
#IF (DSKYENABLE)
MENU_L("DSKY-MON $", "D", GOROM, BID_BIOSIMG, MON_DSKY, 1000h, MON_LOC, MON_SIZ, BID_USR, "DSKY Monitor$")
MENU_L("DSKY-MON $", "D", GOROM, MON_DSKY, 1000h, MON_LOC, MON_SIZ, BID_BIOSIMG, BID_USR, "DSKY Monitor$")
#ENDIF
.DB "REBOOT$ ", "R"
@ -258,66 +267,48 @@ MENU_1: MENU_L("CP/M $ $", "C", GOROM, BID_BIOSIMG, CPM_ENT, 2000h,
MENU_E:
MENU_V .EQU MENU_1-MENU_S ; LENGTH OF EACH MENU RECORD
MENU_N .EQU ((MENU_E-MENU_S)/MENU_V)+1 ; NUMBER OF MENU ITEMS
MENU_O .EQU 10 ; OFFSET TO MENU KEY FROM NAME
;
; BOOT OPTION PROCESSING
;
GOROM: EX DE,HL
INC HL ; HL POINTS TO source-bank
LD B,4 ; PUT NEXT FOUR ADDRESSES ON STACK
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
GOROMB: EX DE,HL
INC HL ; HL POINTS TO source-bank
LD B,4 ; PUT NEXT FOUR ADDRESSES ON STACK
GOROM: EX DE,HL
LD B,5 ; PUT NEXT FIVE ADDRESSES ON STACK
GOROMB1:INC HL
LD E,(HL)
INC HL
LD D,(HL)
PUSH DE
DJNZ GOROMB1
LD E,(HL) ; EXEC
INC HL ; SOURCE
LD D,(HL) ; DEST
PUSH DE ; SIZE
DJNZ GOROMB1 ; BANKS
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
CHAIN: ; EXPECT EXEC ADDRESS ON TOP OF STACK
POP DE ; BANKS
POP HL ; SIZE
LD B,BF_SYSSETCPY ; HBIOS FUNC: SETUP BANK COPY
RST 08 ; DO IT
POP DE ; DEST
POP HL ; SOURCE
LD B,BF_SYSBNKCPY ; HBIOS FUNC: PERFORM BANK COPY
RST 08 ; DO IT
;
; EXEC ADDRESS ON TOP OF STACK
;
#IF (PLATFORM == PLT_UNA)
LD BC,$00FB ; GET LOWER PAGE ID
RST 08 ; DE := LOWER PAGE ID == BOOT ROM PAGE
LD L,1 ; BOOT DISK UNIT IS ROM (UNIT ID = 1)
LD BC,$01FC ; UNA FUNC: SET BOOTSTRAP HISTORY
RST 08 ; CALL UNA
;
; HL IS ALREADY ON STACK AS REQUIRED BY UNA EXEC CHAIN CALL
LD DE,BID_USR ; TARGET BANK ID
PUSH DE ; ... ON STACK
DI ; ENTER WITH INTS DISABLED
JP $FFF7 ; UNA INTER-PAGE EXEC CHAIN
#ELSE
LD A,(HB_CURBNK) ; GET CURRENT BANK ID FROM PROXY DATA
LD B,BF_SYSSET ; HB FUNC: SET HBIOS PARAMETER
LD C,BF_SYSSET_BOOTINFO ; HB SUBFUNC: SET BOOT INFO
LD A,(HB_CURBNK) ; GET CURRENT BANK ID FROM PROXY DATA
LD L,A ; ... AND SAVE AS BOOT BANK
LD DE,$0100 ; BOOT VOLUME (UNIT, SLICE)
RST 08
@ -570,14 +561,13 @@ PRTALL1: ; LOOP THRU ALL UNITS AVAILABLE
PRTDRV:
PUSH BC ; SAVE UNIT
PUSH DE ; SAVE DISK TYPE
LD DE,STR_PREFIX ; NEWLINE AND SPACING
CALL WRITESTR ; PRINT IT
LD A,'(' ; NEWLINE AND SPACING
CALL COUT ; 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?
@ -641,14 +631,13 @@ PRTALL:
LD C,0 ; INIT DEVICE INDEX
;
PRTALL1:
LD DE,STR_PREFIX ; FORMATTING
CALL WRITESTR ; PRINT IT
LD A,'(' ; FORMATTING
CALL COUT ; 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_DIODEVICE ; HBIOS FUNC: REPORT DEVICE INFO
RST 08 ; CALL HBIOS
@ -729,13 +718,11 @@ STR_CPMLOC .DB "LOC=$"
STR_CPMEND .DB "END=$"
STR_CPMENT .DB "ENT=$"
STR_LABEL .DB "LABEL=$"
STR_PREFIX .DB "($"
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_NL .DB "\r\n$"
STR_BANNER .DB "\r\n", PLATFORM_NAME, " Boot Loader\r\n$"
;
#IF (DSKYENABLE)
; b o o t . .

Loading…
Cancel
Save