Browse Source

Implement "safe mode" boot process

Lots of ways this could be done. I have chosen to set it up so it just boots with a minimum driver set.

On SBC test  by setting BT_REC_TYPE to BT_REC_SBC02 and use the 1-bit jumper (crtact) jumper to enable.

Options for other platforms needs to be considered.
pull/69/head
b1ackmai1er 6 years ago
parent
commit
60df79fa4d
  1. 82
      Source/HBIOS/hbios.asm
  2. 11
      Source/HBIOS/std.asm

82
Source/HBIOS/hbios.asm

@ -911,6 +911,38 @@ HB_START1: ; BNKCALL ARRIVES HERE, BUT NOW RUNNING IN RAM BANK
LD (HL),$4D LD (HL),$4D
#ENDIF #ENDIF
#ENDIF #ENDIF
;
;==================================================================================================
; RECOVERY MODE
;==================================================================================================
;
; PLATFORM SPECIFIC CODE FOR DETECTING RECOVERY MODE SWITCH
;
#IF (BT_REC_TYPE!=BT_REC_NONE)
#IF (BT_REC_TYPE==BT_REC_FORCE)
LD A,1 ; SET FOR RECOVERY MODE
LD (HB_BOOT_REC),A ; SAVE FOR LATER
#ENDIF
#IF (PLATFORM == PLT_SBC)
#IF (BT_REC_TYPE==BT_REC_SBC01)
LD A,%00100000 ; DISABLE RTC AND
OUT (RTCIO),A ; DRQ DRIVER READ
IN A,(RTCIO) ; BIT 0 (DRQ).
CPL ; PULLED HIGH
AND 1 ; IS RECOVERY MODE
LD (HB_BOOT_REC),A ; SAVE FOR LATER
#ENDIF
#IF (BT_REC_TYPE==BT_REC_SBC02)
IN A,(RTCIO) ; RTC PORT, BIT 6 HAS THE
BIT 6,A ; STATE OF CONFIG JUMPER
LD A,1 ; JUMPER INSTALLED
JR Z,SAVE_REC_M ; IS RECOVERY MODE
LD A,0
SAVE_REC_M:
LD (HB_BOOT_REC),A ; SAVE FOR LATER
#ENDIF
#ENDIF
#ENDIF
; ;
DIAG(%00001111) DIAG(%00001111)
; ;
@ -1156,7 +1188,17 @@ HB_CPU2:
LD (HL),D LD (HL),D
LD B,PC_INITTBLLEN LD B,PC_INITTBLLEN
POP DE ; POP (1) DE IS ADDRESS OF TOP OF TABLE POP DE ; POP (1) DE IS ADDRESS OF TOP OF TABLE
CALL CALLLIST ; PROCESS THE PRE-INIT CALL TABLE
#IF (BT_REC_TYPE!=BT_REC_NONE)
LD A,(HB_BOOT_REC) ; IF WE ARE IN RECOVERY MODE
OR A ; POINT TO THE RECOVER MODE
JR Z,NOT_REC_M0 ; INITIALIZATION TABLE
LD B,PC_INITRLEN
LD DE,PC_INIT_REC
NOT_REC_M0:
#ENDIF
CALL CALLLIST ; PROCESS THE PRE-INIT CALL TABLE
; ;
#IF 0 #IF 0
; ;
@ -1329,8 +1371,19 @@ HB_SPDTST:
; PERFORM DEVICE INITIALIZATION ; PERFORM DEVICE INITIALIZATION
; ;
CALL NEWLINE CALL NEWLINE
#IF (BT_REC_TYPE!=BT_REC_NONE)
LD A,(HB_BOOT_REC) ; IF WE ARE IN RECOVERY MODE
OR A ; POINT TO THE RECOVER MODE
JR Z,NOT_REC_M1 ; INITIALIZATION TABLE
LD B,HB_INITRLEN
LD DE,HB_INIT_REC
JR IS_REC_M1
NOT_REC_M1:
#ENDIF
LD B,HB_INITTBLLEN LD B,HB_INITTBLLEN
LD DE,HB_INITTBL LD DE,HB_INITTBL
IS_REC_M1:
CALL CALLLIST CALL CALLLIST
; ;
; RECORD HEAP CURB AT THE CURRENT VALUE OF HEAP TOP. HEAP CURB ; RECORD HEAP CURB AT THE CURRENT VALUE OF HEAP TOP. HEAP CURB
@ -1431,8 +1484,31 @@ CALLLIST:
DJNZ CALLLIST DJNZ CALLLIST
CALLDUMMY: CALLDUMMY:
RET RET
#IF (BT_REC_TYPE!=BT_REC_NONE)
; ;
;================================================================================================== ;==================================================================================================
; TABLE OF RECOVERY MODE INITIALIZATION ENTRY POINTS
;==================================================================================================
;
; USE "CALLDUMMY" IF NO ENTRY REQUIRED
;
PC_INIT_REC:
#IF (PLATFORM == PLT_SBC)
.DW UART_PREINIT
; .DW CALLDUMMY
#ENDIF
PC_INITRLEN .EQU (($ - PC_INIT_REC) / 2)
;
HB_INIT_REC:
#IF (PLATFORM == PLT_SBC)
.DW UART_INIT
.DW MD_INIT
#ENDIF
HB_INITRLEN .EQU (($ - HB_INIT_REC) / 2)
;
#ENDIF
;==================================================================================================
; TABLE OF PRE-CONSOLE INITIALIZATION ENTRY POINTS ; TABLE OF PRE-CONSOLE INITIALIZATION ENTRY POINTS
;================================================================================================== ;==================================================================================================
@ -3926,6 +4002,10 @@ RTCVAL .DB 0 ; SHADOW VALUE FOR RTC LATCH PORT
; ;
HB_BATCOND .DB 0 ; BATTERY CONDITION (0=LOW, 1=OK) HB_BATCOND .DB 0 ; BATTERY CONDITION (0=LOW, 1=OK)
; ;
#IF (BT_REC_TYPE!=BT_REC_NONE)
HB_BOOT_REC .DB 0 ; BOOT MODE (0=NORMAL, 1=RECOVERY MODE)
#ENDIF
;
STR_BANNER .DB "RetroBrew HBIOS v", BIOSVER, ", ", TIMESTAMP, "$" STR_BANNER .DB "RetroBrew HBIOS v", BIOSVER, ", ", TIMESTAMP, "$"
STR_PLATFORM .DB PLATFORM_NAME, "$" STR_PLATFORM .DB PLATFORM_NAME, "$"
STR_SWITCH .DB "*** Activating CRT Console ***$" STR_SWITCH .DB "*** Activating CRT Console ***$"

11
Source/HBIOS/std.asm

@ -23,7 +23,7 @@
FALSE .EQU 0 FALSE .EQU 0
TRUE .EQU ~FALSE TRUE .EQU ~FALSE
; ;
; DEBUGGNG OPTIONS
; DEBUGGING OPTIONS
; ;
USENONE .EQU 0 ; NO DEBUG USENONE .EQU 0 ; NO DEBUG
USEXIO .EQU 1 ; BASIC SERIAL DRIVER USEXIO .EQU 1 ; BASIC SERIAL DRIVER
@ -74,6 +74,15 @@ MM_Z180 .EQU 4 ; Z180 NATIVE MEMORY MANAGER
BT_MENU .EQU 1 ; WAIT FOR MENU SELECTION AT LOADER PROMPT BT_MENU .EQU 1 ; WAIT FOR MENU SELECTION AT LOADER PROMPT
BT_AUTO .EQU 2 ; AUTO SELECT BOOT_DEFAULT AFTER BOOT_TIMEOUT BT_AUTO .EQU 2 ; AUTO SELECT BOOT_DEFAULT AFTER BOOT_TIMEOUT
; ;
; BOOT RECOVERY METHODS
;
BT_REC_NONE .EQU 0 ; NO RECOVERY MODE
BT_REC_FORCE .EQU 1 ; FORCE BOOT RECOVERY MODE
BT_REC_SBC01 .EQU 2 ; ECB-SBCV2 - BIT 1 RTC HIGH
BT_REC_SBC02 .EQU 3 ; ECB-SBCV2 - 1-BIT IO PORT
;
BT_REC_TYPE .EQU BT_REC_NONE ; BOOT RECOVERY METHOD TO USE
;
; FLOPPY DISK MEDIA SELECTIONS (ID'S MUST BE INDEX OF ENTRY IN FCD_TBL) ; FLOPPY DISK MEDIA SELECTIONS (ID'S MUST BE INDEX OF ENTRY IN FCD_TBL)
; ;
FDM720 .EQU 0 ; 3.5" FLOPPY, 720KB, 2 SIDES, 80 TRKS, 9 SECTORS FDM720 .EQU 0 ; 3.5" FLOPPY, 720KB, 2 SIDES, 80 TRKS, 9 SECTORS

Loading…
Cancel
Save