From d294fb6d09da8e862c3a70aeaaa2e1cfd377a76a Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Wed, 3 Apr 2024 11:52:18 -0700 Subject: [PATCH] Reset Video Hardware on OS Reset - When an OS performs a reset operation, the HBIOS hook has been extended to automatically reset the video hardware of the CRT device (if it exists). - This should go a long way toward fixing corrupt video after an application is run that reprograms the video hardware. - An OS reset may or may not be performed when an application exits depending on the behavior of the application. So, if an application exits without initiating a reset, then the video will not be reset. Most applications that muck with the video chip directly will perform the reset at exit, so this is not normally an issue. - If the OS encounters an error (such as drive not ready when doing a DIR), the error message may be erased by this new behavior depending on the specific scenario. --- Source/HBIOS/hbios.asm | 5 +++++ Source/HBIOS/term.asm | 38 ++++++++++++++++++++++++++++++++++++-- Source/ver.inc | 2 +- Source/ver.lib | 2 +- 4 files changed, 43 insertions(+), 4 deletions(-) diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index 279e3110..4dee78c9 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -4269,6 +4269,8 @@ SYS_RESCOLD: SYS_RESUSER: ; #IF (CPUFAM == CPU_Z180) +; +; IF Z180 CPU, CHECK FOR INVALID OPCODE FLAG AND HANDLE IF SO ; IN0 A,(Z180_ITC) ; GET ITC REGISTER XOR $80 ; PRECLEAR TRAP BIT @@ -4305,6 +4307,9 @@ SYS_RESUSER2: JP NEWLINE ; FORMATTING & EXIT ; #ENDIF +; + ; RESET ACTIVE VIDEO DISPLAY ATTACHED TO EMULATOR + CALL TERM_RESET ; RET ; ELSE RETURN WITH USER RESET VECTOR IN HL ; diff --git a/Source/HBIOS/term.asm b/Source/HBIOS/term.asm index 5e569516..dae95e44 100644 --- a/Source/HBIOS/term.asm +++ b/Source/HBIOS/term.asm @@ -31,6 +31,8 @@ TERM_PREINIT: XOR A ; SIGNAL SUCCESS RET ; DONE ; +#IF (TERMENABLE) +; ;====================================================================== ; TERMINAL DRIVER - ATTACH ;====================================================================== @@ -47,8 +49,6 @@ TERM_PREINIT: ; DE: VDA DRIVER'S DISPATCH ADDRESS ; HL: VDA DRIVER'S INSTANCE DATA ; -#IF (TERMENABLE) -; TERM_ATTACH: ; LD A,(TERM_DEVCNT) ; GET NEXT DEVICE NUMBER TO USE @@ -83,6 +83,34 @@ TERM_ATTACH: RET ; RETURN ; ;====================================================================== +; TERMINAL DRIVER - RESET +;====================================================================== +; +; RESET THE FULL EMULATION STACK INCLUDING THE UNDERLYING VDA. +; THIS IS USED TO RECOVER FROM APPLICATIONS THAT REPROGRAM THE +; VIDEO CHIP. +; +TERM_RESET: + ; ABORT IF NOTHING ATTACHED + LD A,(TERM_DEVCNT) + OR A + JR NZ,TERM_RESET1 + OR $FF + RET +; +TERM_RESET1: + ; CALL EMULATOR INITDEV FUNCTION + #IF (VDAEMU == EMUTYP_TTY) + CALL TTY_INITDEV + #ENDIF + #IF (VDAEMU == EMUTYP_ANSI) + CALL ANSI_INITDEV + #ENDIF +; + XOR A + RET +; +;====================================================================== ; TERMINAL DRIVER PRIVATE DATA ;====================================================================== ; @@ -95,4 +123,10 @@ TERM_DEVCNT .DB 0 ; TERMINAL DEVICE COUNT #INCLUDE "tty.asm" #INCLUDE "ansi.asm" ; +#ELSE +; +TERM_RESET: + XOR A + RET +; #ENDIF \ No newline at end of file diff --git a/Source/ver.inc b/Source/ver.inc index 79ccbb29..84a9fb0e 100644 --- a/Source/ver.inc +++ b/Source/ver.inc @@ -2,7 +2,7 @@ #DEFINE RMN 5 #DEFINE RUP 0 #DEFINE RTP 0 -#DEFINE BIOSVER "3.5.0-dev.22" +#DEFINE BIOSVER "3.5.0-dev.23" #define rmj RMJ #define rmn RMN #define rup RUP diff --git a/Source/ver.lib b/Source/ver.lib index 9d5a054e..fdf43c6a 100644 --- a/Source/ver.lib +++ b/Source/ver.lib @@ -3,5 +3,5 @@ rmn equ 5 rup equ 0 rtp equ 0 biosver macro - db "3.5.0-dev.22" + db "3.5.0-dev.23" endm