From f50ae14f9e2b6fc736693c866bcbf20a594b5f62 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Sun, 5 Jan 2025 19:55:37 -0800 Subject: [PATCH] Video Driver Fixes Thanks and credit to Phillip Summers for finding these and suggesting solutions. - VGA driver initialization fixed. - CVDU probe fixed to not rely on ready bit of CVDU --- Source/HBIOS/cvdu.asm | 88 ++++++++++++++++++++++++++++++++----------- Source/HBIOS/vga.asm | 2 +- 2 files changed, 66 insertions(+), 24 deletions(-) diff --git a/Source/HBIOS/cvdu.asm b/Source/HBIOS/cvdu.asm index 9b4d6f64..ae6254b8 100644 --- a/Source/HBIOS/cvdu.asm +++ b/Source/HBIOS/cvdu.asm @@ -106,7 +106,7 @@ CVDU_INIT1: CALL PRTDEC PRTS("KB$") CALL CVDU_LOADFONT ; LOAD FONT DATA FROM ROM TO CVDU STRORAGE - CALL CVDU_VDARES + CALL CVDU_VDAINI CALL KBD_INIT ; INITIALIZE KEYBOARD DRIVER ; ADD OURSELVES TO VDA DISPATCH TABLE @@ -342,28 +342,70 @@ CVDU_RDX: ; ON RETURN, ZF SET INDICATES HARDWARE FOUND ; CVDU_PROBE: - ; WRITE TEST PATTERN $A5 $5A TO START OF VRAM - LD HL,0 ; POINT TO FIRST BYTE OF VRAM - LD C,18 ; ADDRESS REGISTER PAIR - CALL CVDU_WRX ; UPDATE VRAM ADDRESS POINTER - LD A,$A5 ; INITIAL TEST VALUE - LD B,A ; SAVE IN B - LD C,31 ; DATA REGISTER - CALL CVDU_WR ; WRITE VALUE TO LOC 0, ADR PTR INCREMENTS - CPL ; INVERT TEST VALUE - CALL CVDU_WR ; WRITE INVERTED VALUE TO LOC 1 - ; READ TEST PATTERN BACK TO CONFIRM HARDWARE EXISTS - LD HL,0 ; POINT TO FIRST BYTE OF VRAM - LD C,18 ; ADDRESS REGISTER PAIR - CALL CVDU_WRX ; UPDATE VRAM ADDRESS POINTER - LD C,31 ; DATA REGISTER - CALL CVDU_RD ; GET BYTE AT LOC 0, ADR PTR INCREMENTS - CP B ; CHECK IT - RET NZ ; ABORT IF BAD COMPARE - CALL CVDU_RD ; GET BYTE AT LOC 1 - CPL ; INVERT IT - CP B ; CHECK FOR INVERTED TEST VALUE - RET ; RETURN WITH ZF SET BASED ON CP + LD B,CVDU_PROBE_DATA_SIZE / 2 ; LOOP COUNTER + LD HL,CVDU_PROBE_DATA ; START OF DATA +CVDU_PROBE1: + LD C,(HL) ; REGISTER + INC HL + LD A,(HL) ; BYTE + INC HL + OUT (C),A ; WRITE IT + LD DE,25 + CALL VDELAY + DJNZ CVDU_PROBE1 +; + IN A,(CVDU_DATA) + LD C,A + LD DE,25 + CALL VDELAY + IN A,(CVDU_DATA) + CPL +; + CP C ; COMPARE OK? + RET + +CVDU_PROBE_DATA: + ; SET VRAM ADDRESS TO $0000 + .DB CVDU_REG, 18 ; ADR LOW + .DB CVDU_DATA, 0 + .DB CVDU_REG, 19 ; ADR HI + .DB CVDU_DATA, 0 + ; WRITE PATTERN + .DB CVDU_REG, 31 ; VRAM DATA + .DB CVDU_DATA, $A5 + .DB CVDU_DATA, $5A + ; RESET VRAM ADDRESS TO $0000 + .DB CVDU_REG, 18 ; ADR LOW + .DB CVDU_DATA, 0 + .DB CVDU_REG, 19 ; ADR HI + .DB CVDU_DATA, 0 + ; SETUP TO READ PATTERN + .DB CVDU_REG, 31 ; VRAM DATA +; +CVDU_PROBE_DATA_SIZE .EQU $ - CVDU_PROBE_DATA +; +;;; ; WRITE TEST PATTERN $A5 $5A TO START OF VRAM +;;; LD HL,0 ; POINT TO FIRST BYTE OF VRAM +;;; LD C,18 ; ADDRESS REGISTER PAIR +;;; CALL CVDU_WRX ; UPDATE VRAM ADDRESS POINTER +;;; LD A,$A5 ; INITIAL TEST VALUE +;;; LD B,A ; SAVE IN B +;;; LD C,31 ; DATA REGISTER +;;; CALL CVDU_WR ; WRITE VALUE TO LOC 0, ADR PTR INCREMENTS +;;; CPL ; INVERT TEST VALUE +;;; CALL CVDU_WR ; WRITE INVERTED VALUE TO LOC 1 +;;; ; READ TEST PATTERN BACK TO CONFIRM HARDWARE EXISTS +;;; LD HL,0 ; POINT TO FIRST BYTE OF VRAM +;;; LD C,18 ; ADDRESS REGISTER PAIR +;;; CALL CVDU_WRX ; UPDATE VRAM ADDRESS POINTER +;;; LD C,31 ; DATA REGISTER +;;; CALL CVDU_RD ; GET BYTE AT LOC 0, ADR PTR INCREMENTS +;;; CP B ; CHECK IT +;;; RET NZ ; ABORT IF BAD COMPARE +;;; CALL CVDU_RD ; GET BYTE AT LOC 1 +;;; CPL ; INVERT IT +;;; CP B ; CHECK FOR INVERTED TEST VALUE +;;; RET ; RETURN WITH ZF SET BASED ON CP ; ;---------------------------------------------------------------------- ; MOS 8563 DISPLAY CONTROLLER CHIP INITIALIZATION diff --git a/Source/HBIOS/vga.asm b/Source/HBIOS/vga.asm index 171b32c2..97470ff5 100644 --- a/Source/HBIOS/vga.asm +++ b/Source/HBIOS/vga.asm @@ -138,7 +138,7 @@ VGA_INIT1: ; HARDWARE INITIALIZATION CALL VGA_CRTINIT ; SETUP THE VGA CHIP REGISTERS CALL VGA_LOADFONT ; LOAD FONT DATA FROM ROM TO VGA STORAGE - CALL VGA_VDARES + CALL VGA_VDAINI CALL KBD_INIT ; INITIALIZE KEYBOARD DRIVER ; ADD OURSELVES TO VDA DISPATCH TABLE