|
|
|
@ -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 |
|
|
|
|