diff --git a/Source/HBIOS/romldr.asm b/Source/HBIOS/romldr.asm index 3ac79c51..8a44fec4 100644 --- a/Source/HBIOS/romldr.asm +++ b/Source/HBIOS/romldr.asm @@ -206,8 +206,7 @@ MENU4: ; BOOT SELECTION PROCESSING ;================================================================================================== ; -SEL: - ; HANDLE SERIAL CONSOLE INPUT +SEL: ; HANDLE SERIAL CONSOLE INPUT CALL CST ; CHECK CONSOLE INPUT OR A ; ZERO? JR Z,SEL1 ; IF NOT, CONTINUE @@ -221,9 +220,13 @@ SEL: OUT (LEDPORT),A ; CLEAR LED #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: #IF (DSKYENABLE) @@ -241,8 +244,12 @@ SEL1: OUT (LEDPORT),A ; CLEAR LED #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 ; SEL2: @@ -267,8 +274,10 @@ SEL2: OUT (LEDPORT),A ; CLEAR LED #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 ; SEL3: @@ -279,51 +288,96 @@ SEL3: ; 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 - 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 ; -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 @@ -508,7 +562,7 @@ GOBOOTDISK: LD (BL_BOOTID),A LD DE,STR_BOOTDISK CALL WRITESTR - CALL PRTHEXBYTE + CALL PRTDECB PRTS("...$") #IF (DSKYENABLE) LD HL,MSG_LOAD ; POINT TO LOAD MESSAGE @@ -737,8 +791,7 @@ PRTDRV: 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 + CALL PRTDECB LD A,')' ; DRIVE LETTER COLON CALL COUT ; PRINT IT POP DE ; RECOVER DISK TYPE @@ -807,8 +860,7 @@ PRTALL1: LD A,'(' ; FORMATTING CALL COUT ; PRINT IT LD A,C ; INDEX TO A - ADD A,'0' ; MAKE NUMERIC CHAR - CALL COUT ; PRINT IT + CALL PRTDECB LD A,')' ; FORMATTING CALL COUT ; PRINT IT PUSH BC ; SAVE LOOP CONTROL