diff --git a/VersionASM b/VersionASM index ca30bbd11f092c29b889565ff73bc0336ade9a61..1666ce515fff5310fbf0cbe6716fd5235b2de227 100644 --- a/VersionASM +++ b/VersionASM @@ -9,12 +9,12 @@ GBLS Module_ApplicationDate GBLS Module_HelpVersion GBLS Module_ComponentName -Module_MajorVersion SETS "6.32" -Module_Version SETA 632 +Module_MajorVersion SETS "6.33" +Module_Version SETA 633 Module_MinorVersion SETS "" -Module_Date SETS "19 Jan 2020" -Module_ApplicationDate SETS "19-Jan-20" +Module_Date SETS "12 Feb 2020" +Module_ApplicationDate SETS "12-Feb-20" Module_ComponentName SETS "Kernel" -Module_FullVersion SETS "6.32" -Module_HelpVersion SETS "6.32 (19 Jan 2020)" +Module_FullVersion SETS "6.33" +Module_HelpVersion SETS "6.33 (12 Feb 2020)" END diff --git a/VersionNum b/VersionNum index de1a61d7cd9a07ab0ec330671fb19186ec42ec8c..1f9a95d8e68adc91e49f00a9fb9a4a874f7b366f 100644 --- a/VersionNum +++ b/VersionNum @@ -1,21 +1,21 @@ -/* (6.32) +/* (6.33) * * This file is automatically maintained by srccommit, do not edit manually. * */ -#define Module_MajorVersion_CMHG 6.32 +#define Module_MajorVersion_CMHG 6.33 #define Module_MinorVersion_CMHG -#define Module_Date_CMHG 19 Jan 2020 +#define Module_Date_CMHG 12 Feb 2020 -#define Module_MajorVersion "6.32" -#define Module_Version 632 +#define Module_MajorVersion "6.33" +#define Module_Version 633 #define Module_MinorVersion "" -#define Module_Date "19 Jan 2020" +#define Module_Date "12 Feb 2020" -#define Module_ApplicationDate "19-Jan-20" +#define Module_ApplicationDate "12-Feb-20" #define Module_ComponentName "Kernel" -#define Module_FullVersion "6.32" -#define Module_HelpVersion "6.32 (19 Jan 2020)" -#define Module_LibraryVersionInfo "6:32" +#define Module_FullVersion "6.33" +#define Module_HelpVersion "6.33 (12 Feb 2020)" +#define Module_LibraryVersionInfo "6:33" diff --git a/hdr/KernelWS b/hdr/KernelWS index 1b39fa468aec8f511130abf7713e2c12bc2827a4..9b4647bc6d4e9e532c26cc6d3df2836a97142e41 100644 --- a/hdr/KernelWS +++ b/hdr/KernelWS @@ -804,6 +804,7 @@ ScreenBlankDPMSState # 1 ; 0 => just blank video ; 1 => blank to stand-by (hsync off) ; 2 => blank to suspend (vsync off) ; 3 => blank to off (H+V off) + ; 255 => no mode programmed yet ASSERT ScreenBlankDPMSState = Legacy_ScreenBlankDPMSState ASSERT ?ScreenBlankDPMSState = ?Legacy_ScreenBlankDPMSState diff --git a/s/PMF/osbyte b/s/PMF/osbyte index 5c7606bda02a24ec41a1354687b5a830be298967..a017b476cfac30286401272dc17f27242a775146 100644 --- a/s/PMF/osbyte +++ b/s/PMF/osbyte @@ -563,9 +563,11 @@ Osbyte13 ROUT TSTNE R1, #3 ; NE => blanked and DPMS turned off HSync or VSync MyOsbyte NE ; if true exit immediately - ; Also, exit now if we don't have a driver active + ; Also, exit now if we don't have a driver active, or there's no + ; mode programmed LDR R0, [LR,#CurrentGraphicsVDriver] CMP R0, #GraphicsVInvalid + CMPEQ R1, #255 MyOsbyte EQ ; It is actually better to call Idle with interrupts disabled as it stops the interrupt diff --git a/s/vdu/vdudriver b/s/vdu/vdudriver index fb0227228bc163a3391f72d7da05b87a5267f769..4f4196c6d2f3265223213d1c3e7bf8ac9c1e7983 100644 --- a/s/vdu/vdudriver +++ b/s/vdu/vdudriver @@ -106,9 +106,9 @@ VduInit ROUT ASSERT (ZeroPage :AND: 255) = 0 STRB R0, [R0, #OsbyteVars + :INDEX: VDUqueueItems] ;purge queue STRB R0, [WsPtr, #ScreenBlankFlag] ; not blanked - [ ZeroPage <> 0 + MOV R0, #255 + STRB R0, [WsPtr, #ScreenBlankDPMSState] ; however, no mode programmed yet MOV R0, #0 - ] STR R0, [WsPtr, #CursorCounter] STR R0, [WsPtr, #CursorDesiredState] STR R0, [WsPtr, #VduStatus] diff --git a/s/vdu/vdupalxx b/s/vdu/vdupalxx index b31d9a8867a0d6636edc76fc5450b43fe8d462a4..77a104de23ff31f22084e73601006f3ee9cf5725 100644 --- a/s/vdu/vdupalxx +++ b/s/vdu/vdupalxx @@ -1064,6 +1064,7 @@ PV_BlankScreen ROUT AND r0, r0, #1 STRB r0, [WsPtr, #ScreenBlankFlag] ; update new state LDRB r1, [WsPtr, #ScreenBlankDPMSState] + AND r1, r1, #3 LDR r4, [WsPtr, #CurrentGraphicsVDriver] MOV r4, r4, LSL #24 diff --git a/s/vdu/vduswis b/s/vdu/vduswis index 0f08566d2a97a8b712568616dad83161d1d9e2ea..25b06b42d32ba39359a76bcea238c4dfca764ec1 100644 --- a/s/vdu/vduswis +++ b/s/vdu/vduswis @@ -1273,6 +1273,10 @@ RemovePages ROUT ; display starts in pages that remain + CMP R4, #0 ; if we've somehow shrunk to zero, + MOVEQ R5, R14 ; then DisplayStart = ScreenEndAddr, + BEQ %FT06 ; and avoid the infinite loop below! + SUB R5, R3, R0 ; new DisplayStart 05 @@ -1280,6 +1284,7 @@ RemovePages ROUT SUBCS R5, R5, R4 ; then repeatedly subtract off new size BCS %BT05 ; until in range +06 Push "R0-R2" MOV R0, R5 ; put new display start in r0 BL SetVinit ; this updates DisplayStart @@ -1302,10 +1307,15 @@ InsertRemovePagesExit LDR R4, [WsPtr, #DisplayScreenStart] SUB R0, R4, R0 LDR R3, [WsPtr, #TotalScreenSize] + + CMP R3, #0 + MOVEQ R0, R14 + BEQ %FT26 25 CMP R0, R14 ; ensure displayscreenstart in range too SUBCS R0, R0, R3 BCS %BT25 +26 BL NewScreenStart 30 BL SetVendDefault @@ -2063,6 +2073,10 @@ ScreenMode_SelectDevice ROUT MOV r1, #Service_DisplayChanged MOV r3, #DisplayChangedSub_ModeChanged IssueService + ; Flag that VSync probably isn't working + ; (will be cleared by HardwareModeChange) + MOV r0, #255 + STRB r0, [WsPtr, #ScreenBlankDPMSState] ; Update current driver VDU var STR r2, [WsPtr, #CurrentGraphicsVDriver] ; Issue service call to indicate change is coming @@ -2071,28 +2085,47 @@ ScreenMode_SelectDevice ROUT ; Call InitialiseMode to select a mode to use for this new driver CMP r2, #GraphicsVInvalid BLNE InitialiseMode - BVS %FT15 - ; Success! - MOV r0, #DisplayChanged_Changed - IssueService - MOV r1, r5 - EXIT -15 - ; Something went wrong trying to activate the new driver - ; Try and restore the old one + BVC %FT15 + ; Something went wrong trying to activate the new driver. + ; Make sure the VSync flag is still set. + MOV lr, #255 + STRB lr, [WsPtr, #ScreenBlankDPMSState] + ; Do we have an old driver we can try and switch back to? + ; + ; If we don't have an old driver, just stick with this new + ; one, under the assumption that the failure was because we + ; couldn't find a valid mode to switch to (which is generally + ; the only way in which InitialiseMode will fail). For such a + ; situation, there's a reasonable chance that things will start + ; working later on during the boot sequence, e.g. once an MDF + ; is loaded. And for such a case, temporarily having a broken + ; driver active is much better than restoring the "no driver" + ; state, since we currently don't have any kind of watchdog which + ; will kick the video system into life once the MDF does get + ; loaded. + CMP r5, #GraphicsVInvalid + BEQ %FT15 STR r0, [sp] ; Return the error to the caller STR r5, [WsPtr, #CurrentGraphicsVDriver] MOV r0, #DisplayChanged_Changing MOV r2, r5 IssueService - CMP r5, #GraphicsVInvalid - BLNE InitialiseMode + BL InitialiseMode + MOVVS lr, #255 + STRVSB lr, [WsPtr, #ScreenBlankDPMSState] ; TODO - Try harder if this 2nd call fails (e.g. try all drivers in turn) MOV r0, #DisplayChanged_Changed IssueService MOV r1, r5 SETV EXIT + +15 + ; Success! + MOV r0, #DisplayChanged_Changed + IssueService + MOV r1, r5 + EXIT 20 PullEnv ADR r0, ErrorBlock_BadGDriver