diff --git a/Source/CBIOS/cbios.asm b/Source/CBIOS/cbios.asm index 8485db22..84f41e9b 100644 --- a/Source/CBIOS/cbios.asm +++ b/Source/CBIOS/cbios.asm @@ -1844,6 +1844,10 @@ INIT: LD (8),A ; STORE AT 0x0008 LD HL,($FFF1) ; HBIOS ENTRY VECTOR LD (9),HL ; STORE AT 0x0009 + + ; SOFT REST HBIOS + LD B,BF_SYSRESET ; HB FUNC: RESET + RST 08 ; DO IT ; CREATE A TEMP COPY OF THE HBIOS CONFIG BLOCK (HCB) ; FOR REFERENCE USE DURING INIT diff --git a/Source/HBIOS/API.txt b/Source/HBIOS/API.txt index 33feefe0..fbd13ed2 100644 --- a/Source/HBIOS/API.txt +++ b/Source/HBIOS/API.txt @@ -91,6 +91,9 @@ POKE: ($FA): E=Byte Value HL=Address +RESET: ($FF): + B=Function A=Result + ================ Serial Functions ================ diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index 119662f1..58a5885c 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -561,6 +561,13 @@ INITSYS1: POP DE DJNZ INITSYS1 ; +; RECORD HEAP CURB AT THE CURRENT VALUE OF HEAP TOP. HEAP CURB +; MARKS THE POINT IN THE HEAP AFTER WHICH MEMORY IS RELEASED +; WHEN AN HBIOS RESET IS PEFORMED. +; + LD HL,(HCB + HCB_HEAPTOP) + LD (HEAPCURB),HL +; ; PRIOR TO THIS POINT, CONSOLE I/O WAS DIRECTED TO HARDWARE (XIO.ASM). ; NOW THAT HBIOS IS READY, SET THE CONSOLE UNIT TO ACTIVATE CONSOLE I/O ; VIA HBIOS. @@ -1160,6 +1167,16 @@ SYS_DISPATCH: JP Z,SYS_PEEK ; $F9 DEC A JP Z,SYS_POKE ; $FA + DEC A + ;JP Z,SYS_ ; $FB + DEC A + ;JP Z,SYS_ ; $FC + DEC A + ;JP Z,SYS_ ; $FD + DEC A + ;JP Z,SYS_ ; $FE + DEC A + JP Z,SYS_RESET ; $FF CALL PANIC ; INVALID ; ; SET ACTIVE MEMORY BANK AND RETURN PREVIOUSLY ACTIVE MEMORY BANK @@ -1417,6 +1434,14 @@ SYS_POKE: CALL HBX_POKE ; IMPLEMENTED IN PROXY XOR A RET +; +; SOFT RESET HBIOS, RELEASE HEAP MEMORY NOT USED BY HBIOS +; +SYS_RESET: + LD HL,(HEAPCURB) ; GET HBIOS HEAP THRESHOLD + LD (HCB + HCB_HEAPTOP),HL ; RESTORE HEAP TOP + XOR A + RET ;; ;; GET HCB VALUE BYTE ;; C: HCB INDEX (OFFSET INTO HCB) @@ -2594,6 +2619,8 @@ HSTLBAHI .EQU $ ; BLOCK ADDRESS LBA HIGH WORD HSTSEC .DB 0 ; SECTOR (0-255) HSTHEAD .DB 0 ; HEAD (0-255) ; +HEAPCURB .DW 0 ; MARK HEAP ADDRESS AFTER INITIALIZATION +; HB_INTSTKSAV .DW 0 ; SAVED STACK POINTER DURING INT PROCESSING .FILL $40,$FF ; 32 ENTRY STACK FOR INTERRUPT PROCESSING HB_INTSTK .EQU $ ; TOP OF INTERRUPT PROCESSING STACK diff --git a/Source/HBIOS/hbios.inc b/Source/HBIOS/hbios.inc index d59dba92..4574377e 100644 --- a/Source/HBIOS/hbios.inc +++ b/Source/HBIOS/hbios.inc @@ -62,8 +62,9 @@ BF_SYSFREE .EQU BF_SYS + 5 ; FREE HBIOS HEAP MEMORY BF_SYSVER .EQU BF_SYS + 6 ; GET HBIOS VERSION BF_SYSGET .EQU BF_SYS + 7 ; GET HBIOS INFO BF_SYSSET .EQU BF_SYS + 8 ; SET HBIOS PARAMETERS -BF_PEEK .EQU BF_SYS + 9 ; GET A BYTE VALUE FROM ALT BANK -BF_POKE .EQU BF_SYS + 10 ; SET A BYTE VALUE IN ALT BANK +BF_SYSPEEK .EQU BF_SYS + 9 ; GET A BYTE VALUE FROM ALT BANK +BF_SYSPOKE .EQU BF_SYS + 10 ; SET A BYTE VALUE IN ALT BANK +BF_SYSRESET .EQU BF_SYS + 15 ; SOFT RESET HBIOS ; BF_SYSGET_CIOCNT .EQU $00 ; GET CHAR UNIT COUNT BF_SYSGET_DIOCNT .EQU $10 ; GET DISK UNIT COUNT