Skip to content

Commit

Permalink
Video Driver Fixes
Browse files Browse the repository at this point in the history
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
  • Loading branch information
wwarthen committed Jan 6, 2025
1 parent b02aecb commit f50ae14
Show file tree
Hide file tree
Showing 2 changed files with 66 additions and 24 deletions.
88 changes: 65 additions & 23 deletions Source/HBIOS/cvdu.asm
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion Source/HBIOS/vga.asm
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit f50ae14

Please sign in to comment.