Browse Source

Update romldr.asm

Update to cater for possibility of more than 9 drives being detected. Update menu system to support
pull/76/head
b1ackmai1er 6 years ago
parent
commit
f552c83f23
  1. 160
      Source/HBIOS/romldr.asm

160
Source/HBIOS/romldr.asm

@ -206,8 +206,7 @@ MENU4:
; BOOT SELECTION PROCESSING ; BOOT SELECTION PROCESSING
;================================================================================================== ;==================================================================================================
; ;
SEL:
; HANDLE SERIAL CONSOLE INPUT
SEL: ; HANDLE SERIAL CONSOLE INPUT
CALL CST ; CHECK CONSOLE INPUT CALL CST ; CHECK CONSOLE INPUT
OR A ; ZERO? OR A ; ZERO?
JR Z,SEL1 ; IF NOT, CONTINUE JR Z,SEL1 ; IF NOT, CONTINUE
@ -221,9 +220,13 @@ SEL:
OUT (LEDPORT),A ; CLEAR LED OUT (LEDPORT),A ; CLEAR LED
#ENDIF #ENDIF
#ENDIF #ENDIF
CALL CINUC ; GET THE KEY
CALL COUT ; ECHO KEY
JR MATS ; AND HANDLE IT
CALL CINUC ; GET THE KEY
CALL COUT ; ECHO KEY
CP 'R' ; CHECK FOR
JP Z,REBOOT ; REBOOT REQUEST
LD DE,MENU_S+10-MENU_V ; POINT TO SERIAL MENU COLUMN
LD C,2 ; SET SERIAL FLAG
JR MATS ; GO CHECK MENU SELECTION
; ;
SEL1: SEL1:
#IF (DSKYENABLE) #IF (DSKYENABLE)
@ -241,8 +244,12 @@ SEL1:
OUT (LEDPORT),A ; CLEAR LED OUT (LEDPORT),A ; CLEAR LED
#ENDIF #ENDIF
#ENDIF #ENDIF
CALL DSKY_GETKEY ; GET PENDING KEY PRESS
JR MATK ; AND HANDLE IT
CALL DSKY_KEY ; GET PENDING KEY PRESS ; NOTE DESKY_GETKEY
CP KY_BO ; CHECK FOR REBOOT ; CAN RETURN AN INVALID
JP Z,REBOOT ; REBOOT REQUEST ; KEYSCAN AS FFH WHICH
LD DE,MENU_S+11-MENU_V ; POINT TO DSKY MENU COLUMN ; MAY BE MATCHED WITH
LD C,1 ; SET DSKY FLAG ; DUMMY MENU ENTRIES
JR MATS ; GO CHECK MENU SELECTION
#ENDIF #ENDIF
; ;
SEL2: SEL2:
@ -267,8 +274,10 @@ SEL2:
OUT (LEDPORT),A ; CLEAR LED OUT (LEDPORT),A ; CLEAR LED
#ENDIF #ENDIF
#ENDIF #ENDIF
LD A,BOOT_DEFAULT ; TIMEOUT EXPIRED,
JR MATS ; PERFORM DEFAULT BOOT ACTION
LD A,BOOT_DEFAULT ; TIMEOUT EXPIRED,
LD DE,MENU_S+10-MENU_V ; POINT TO SERIAL MENU COLUMN
LD C,2 ; SET SERIAL FLAG
JR MATS ; PERFORM DEFAULT BOOT ACTION
#ENDIF #ENDIF
; ;
SEL3: SEL3:
@ -279,51 +288,96 @@ SEL3:
; ROM MENU TABLE MATCHING ; ROM MENU TABLE MATCHING
;================================================================================================== ;==================================================================================================
; ;
MATS: ; MATCH SERIAL INPUT TO MENU
CP 'R'
JP Z,REBOOT
LD B,MENU_N
LD DE,MENU_S+10-MENU_V
LD HL,MENU_V
MATS1: EX DE,HL
ADD HL,DE
CP (HL)
EX DE,HL
MATS: LD B,MENU_N ; LOOP THROUGH THE ; ON ENTRY DE POINTS TO
LD HL,MENU_V ; MENU TABLE AND ; THE MENU COLUMN WE ARE
MATS1: EX DE,HL ; CHECK IF THE ; CHECKING AND C CONTAINS
ADD HL,DE ; KEYPRESS MATCHES ; A FLAG TELLING US IF WE
CP (HL) ; ANY OF ; HAVE DSKY OR SERIAL INPUT
EX DE,HL ; THE MENU ITEMS.
JR Z,MATS2 JR Z,MATS2
DJNZ MATS1 ; FALL THRU IF IT DOES NOT MATCH ROM MENU
SUB '0' ; CONVERT ASCII TO BINARY
JR MATD ; AND TRY DISK BOOT
MATS2: INC DE ; SKIP MENU SEL CHAR
INC DE ; SKIP DSKY SEL CHAR
JP GOROM ; BOOT FROM ROM
DJNZ MATS1 ; IF WE REACH THE TABLE END AND DON'T HAVE
JR MATD ; A MATCH GO AND CHECK FOR A DISK SELECTION
;
MATS2: LD B,0 ; WE GOT A MATCH FROM THE MENU TABLE. POINT
EX DE,HL ; TO THE ROM ADDRESS TO EXECUTE. ADJUST THE
ADD HL,BC ; POINTER TO THE ROM ENTRY BASED ON WHETHER WE
EX DE,HL ; GOT A MATCH IN THE DSKY OR SERIAL MENU COLUMN
JP GOROM ; JUMP TO THE ROM HANDLER.
;
MATD: LD B,A
LD A,C ; IF INPUT WAS SERIAL
DEC C ; CONVERT TO FROM.
JR Z,MATD1 ; ASCII TO DECIMAL.
LD A,B ; DSKY NUMBERS ARE
SUB '0' ; ALREADY DECIMAL
MATD1: CP 10 ; DO A RANGE CHECK
JR NC,MATX ; NOT VALID, HANDLE IT BELOW
; ;
#IF (DSKYENABLE)
MATK: ; MATCH DSKY INPUT TO MENU
CP KY_BO
JP Z,REBOOT
LD B,MENU_N
LD DE,MENU_S+11-MENU_V
LD HL,MENU_V
MATK1: EX DE,HL
ADD HL,DE
CP (HL)
EX DE,HL
JR Z,MATK2
DJNZ MATK1 ; FALL THRU IF IT DOES NOT MATCH DSKY MENU
JR MATD ; TRY DISK BOOT
MATK2: INC DE ; SKIP DSKY SEL CHAR
JP GOROM ; BOOT FROM ROM
PUSH BC
PUSH AF ; HOW MANY DISK
LD B,BF_SYSGET ; DEVICES DO WE
LD C,BF_SYSGET_DIOCNT ; HAVE IN THE
RST 08 ; SYSTEM ?
POP AF
POP BC
; JR MATD2 ; IF MORE THEN 9 ; UNCOMMENT TO TEST DOUBLE CHAR ENTRY
CP 10 ; THEN WE NEED TO GET
JR NC,MATD2 ; ANOTHER CHARACTER
;
CP E ; WE DON'T HAVE MORE THAN 10 DEVICES SO ; A = REQUESTED UNIT
JP C,GOBOOTDISK ; CHECK IT IS IN RANGE. BOOT IF IT IS ; E = AVAILABLE UNITS
JR MATX ; IT IF NOT VALID, HANDLE IT BELOW
MATD2: LD B,A ; PROCESS FURTHER INPUT ; B = REQUESTED UNIT
LD A,C ; CHECK WHERE TO GET ; C = DSKY/SERIAL FLAG
DEC C ; THE INPUT FROM AND GO
JR NZ,MATD3 ; GET ANOTHER CHARACTER
;
#IF (DSKYENABLE) ; INPUT DSKY
;
MATD4: ;CALL DSKY_STAT ; WAIT FOR
;OR A ; ANOTHER
;JR Z,MATD4 ; KEY FROM
;CALL DSKY_GETKEY ; DSKY
CALL DSKY_KEY
CP KY_EN ; IF NEXT KEY IS ENTER
JR Z,MATD6 ; OR GO, PROCESS AS A
CP KY_GO ; SINGLE DIGIT NUMBER
JR Z,MATD6 ; OTHERWISE JOIN TWO
JR MATD5 ; CHARCTERS IN ONE DECIMAL
#ENDIF #ENDIF
; ;
MATD: ; CHECK FOR DISK BOOT REQUEST
CP 10 ; 0-9, DISK DEVICE
JR NC,MATX ; NOT VALID, HANDLE IT BELOW
JP GOBOOTDISK ; BOOT FROM DISK
; ; INPUT SERIAL
;
MATD3: ;CALL CST ; WAIT FOR
;OR A ; ANOTHER
;JR Z,MATD3 ; KEY FROM
CALL CINUC ; SERIAL
CALL COUT
; ;
MATX:
; SET ERROR STRING AND LOOP
LD DE,STR_INVALID ; INVALID SEL MSG
JP MENU ; RESTART MENU LOOP
CP CHR_CR ; IF NEXT KEY IS RETURN PROCESS
JR Z,MATD6 ; AS A SINGLE DIGIT NUMBER
;
SUB '0' ; CONVERT THE SERIAL NUMBER TO DECIMAL
CP 10 ; DO A RANGE CHECK
JR NC,MATX ; NOT VALID, HANDLE IT BELOW
MATD5: LD C,A ; C CONTAINS SECOND CHARACTER INPUT 0..9
LD A,B ; A CONTAINS FIRST NUMBER INPUT 0..9
ADD A,A
LD B,A ; MULTIPLY FIRST DIGIT BY 10
ADD A,A ; AND ADD SECOND DIGIT
ADD A,A
ADD A,B ; CONVERT TWO INPUTTED
ADD A,C ; CHARACTERS TO DECIMAL.
LD B,A
;
MATD6: LD A,B ; PUT THE DEVICE NUMBER TO BOOT
JP GOBOOTDISK ; IN A AND GO BOOT DEVICE
;
MATX: LD DE,STR_INVALID ; SET ERROR STRING MESSAGE
JP MENU ; AND RESTART MENU LOOP
; ;
;================================================================================================== ;==================================================================================================
; ROM MENU TABLE ; ROM MENU TABLE
@ -508,7 +562,7 @@ GOBOOTDISK:
LD (BL_BOOTID),A LD (BL_BOOTID),A
LD DE,STR_BOOTDISK LD DE,STR_BOOTDISK
CALL WRITESTR CALL WRITESTR
CALL PRTHEXBYTE
CALL PRTDECB
PRTS("...$") PRTS("...$")
#IF (DSKYENABLE) #IF (DSKYENABLE)
LD HL,MSG_LOAD ; POINT TO LOAD MESSAGE LD HL,MSG_LOAD ; POINT TO LOAD MESSAGE
@ -737,8 +791,7 @@ PRTDRV:
LD A,'(' ; NEWLINE AND SPACING LD A,'(' ; NEWLINE AND SPACING
CALL COUT ; PRINT IT CALL COUT ; PRINT IT
LD A,B ; DRIVE LETTER TO A LD A,B ; DRIVE LETTER TO A
ADD A,'0' ; MAKE IT DISPLAY NUMERIC
CALL COUT ; PRINT IT
CALL PRTDECB
LD A,')' ; DRIVE LETTER COLON LD A,')' ; DRIVE LETTER COLON
CALL COUT ; PRINT IT CALL COUT ; PRINT IT
POP DE ; RECOVER DISK TYPE POP DE ; RECOVER DISK TYPE
@ -807,8 +860,7 @@ PRTALL1:
LD A,'(' ; FORMATTING LD A,'(' ; FORMATTING
CALL COUT ; PRINT IT CALL COUT ; PRINT IT
LD A,C ; INDEX TO A LD A,C ; INDEX TO A
ADD A,'0' ; MAKE NUMERIC CHAR
CALL COUT ; PRINT IT
CALL PRTDECB
LD A,')' ; FORMATTING LD A,')' ; FORMATTING
CALL COUT ; PRINT IT CALL COUT ; PRINT IT
PUSH BC ; SAVE LOOP CONTROL PUSH BC ; SAVE LOOP CONTROL

Loading…
Cancel
Save