Add VDA Read Character function

For your consideration. Seems to work.
This commit is contained in:
b1ackmai1er
2021-10-18 20:38:37 +08:00
parent 6de8d63913
commit 3bc8afcc87
6 changed files with 76 additions and 5 deletions

View File

@@ -1368,6 +1368,25 @@ codes as described at the start of this section.
`\clearpage`{=latex}
### Function 0x4F -- Read a character at current video position (VDARDC)
| _Entry Parameters_
| B: 0x4F
| C: Video Device Unit ID
| _Exit Results_
| A: Status (0=OK, else error)
| E: Character
| B: Character Color Code
| C: Character Attribute Code
Read a character from the current cursor position including it's colour
and attributes. If the display does not support colours or attributes
then return colour white on black and no attributes. If the device does
not support the ability to read a character, return error status
`\clearpage`{=latex}
Sound (SND)
------------

View File

@@ -94,6 +94,7 @@ CVDU_FNTBL:
.DW KBD_STAT
.DW KBD_FLUSH
.DW KBD_READ
.DW CVDU_VDARDC
#IF (($ - CVDU_FNTBL) != (VDA_FNCNT * 2))
.ECHO "*** INVALID CVDU FUNCTION TABLE ***\n"
!!!!!
@@ -219,6 +220,15 @@ CVDU_VDASCR1:
POP DE ; RECOVER E
INC E ; INCREMENT IT
JR CVDU_VDASCR ; LOOP
;----------------------------------------------------------------------
; READ VALUE AT CURRENT VDU BUFFER POSITION
; RETURN E = CHARACTER, B = COLOUR, C = ATTRIBUTES
;----------------------------------------------------------------------
CVDU_VDARDC:
OR $FF ; UNSUPPORTED FUNCTION
RET
;
;======================================================================
; CVDU DRIVER - PRIVATE DRIVER FUNCTIONS

View File

@@ -191,13 +191,13 @@ RTCDEF .SET RTCDEF | %00000001 ; SC128 I2C SCL BIT
#IF (CPUSPDDEF==SPD_HIGH)
RTCDEF .SET RTCDEF | %00001000 ; DEFAULT SPEED HIGH
#ELSE
RTCDEF .SET RTCDEF | %00000000 ; DEFAULT SPEED LOW
RTCDEF .SET RTCDEF & %11110111 ; DEFAULT SPEED LOW
#ENDIF
#ENDIF
;
#IF (!(CPUSPDCAP==SPD_FIXED) & (PLATFORM==PLT_SBC))
#IF (CPUSPDDEF==SPD_HIGH)
RTCDEF .SET RTCDEF | %00000000 ; DEFAULT SPEED HIGH
RTCDEF .SET RTCDEF & %11110111 ; DEFAULT SPEED HIGH
#ELSE
RTCDEF .SET RTCDEF | %00001000 ; DEFAULT SPEED LOW
#ENDIF
@@ -3202,7 +3202,7 @@ VDA_ADDENT:
; WORD DRIVER FUNCTION TABLE ADDRESS
; WORD UNIT SPECIFIC DATA (TYPICALLY A DEVICE INSTANCE DATA ADDRESS)
;
VDA_FNCNT .EQU 15 ; NUMBER OF VDA FUNCS (FOR RANGE CHECK)
VDA_FNCNT .EQU 16 ; NUMBER OF VDA FUNCS (FOR RANGE CHECK)
VDA_MAX .EQU 16 ; UP TO 16 UNITS
VDA_SIZ .EQU VDA_MAX * 4 ; EACH ENTRY IS 4 BYTES
;
@@ -6231,7 +6231,6 @@ HB_SECS .FILL 4,0 ; 32 BIT SECONDS COUNTER
;
HB_CPUTYPE .DB 0 ; 0=Z80, 1=80180, 2=SL1960, 3=ASCI BRG
;
;RTCVAL .DB RTCDEF ; SHADOW VALUE FOR RTC LATCH PORT
IOPRVAL .DW 0 ; TEMP STORAGE FOR IOPR
;
HB_BATCOND .DB 0 ; BATTERY CONDITION (0=LOW, 1=OK)

View File

@@ -209,6 +209,7 @@ TMS_FNTBL:
.DW TMS_READ
#ENDIF
#ENDIF
.DW TMS_VDARDC
#IF (($ - TMS_FNTBL) != (VDA_FNCNT * 2))
.ECHO "*** INVALID TMS FUNCTION TABLE ***\n"
!!!!!
@@ -345,6 +346,15 @@ TMS_VDASCR2:
XOR A
RET
;----------------------------------------------------------------------
; READ VALUE AT CURRENT VDU BUFFER POSITION
; RETURN E = CHARACTER, B = COLOUR, C = ATTRIBUTES
;----------------------------------------------------------------------
TMS_VDARDC:
OR $FF ; UNSUPPORTED FUNCTION
RET
; DUMMY FUNCTIONS BELOW BECAUSE SCG BOARD HAS NO
; KEYBOARD INTERFACE

View File

@@ -148,11 +148,12 @@ VDU_FNTBL:
.DW PPK_STAT
.DW PPK_FLUSH
.DW PPK_READ
.DW VDU_VDARDC
#IF (($ - VDU_FNTBL) != (VDA_FNCNT * 2))
.ECHO "*** INVALID VDU FUNCTION TABLE ***\n"
!!!!!
#ENDIF
;
VDU_VDAINI:
; RESET VDA
; CURRENTLY IGNORES VIDEO MODE AND BITMAP DATA
@@ -258,6 +259,28 @@ VDU_VDASCR1:
INC E ; INCREMENT IT
JR VDU_VDASCR ; LOOP
;
;----------------------------------------------------------------------
; READ VALUE AT CURRENT VDU BUFFER POSITION
; RETURN E = CHARACTER, B = COLOUR, C = ATTRIBUTES
;----------------------------------------------------------------------
;
VDU_VDARDC:
LD C,18 ; SET SOURCE ADDRESS IN VDU (HL)
CALL VDU_WRREGX ; DO IT
LD A,31 ; PREP VDU FOR DATA R/W
OUT (VDU_REG),A ; DO IT
CALL VDU_WAITRDY ; WAIT FOR VDU TO BE READY
LD C,VDU_RAMRD ; LOAD C WITH VDU READ REGISTER
IN E,(C)
LD B,$F0 ; WHITE FG. BLACK BG
LD C,$00 ; NO ATTRIBUTES
XOR A
RET
;
;======================================================================
; VDU DRIVER - PRIVATE DRIVER FUNCTIONS
;======================================================================

View File

@@ -161,6 +161,7 @@ VGA_FNTBL:
.DW KBD_STAT
.DW KBD_FLUSH
.DW KBD_READ
.DW VGA_VDARDC
#IF (($ - VGA_FNTBL) != (VDA_FNCNT * 2))
.ECHO "*** INVALID VGA FUNCTION TABLE ***\n"
!!!!!
@@ -313,6 +314,15 @@ VGA_VDASCR1:
POP DE ; RECOVER E
INC E ; INCREMENT IT
JR VGA_VDASCR ; LOOP
;----------------------------------------------------------------------
; READ VALUE AT CURRENT VDU BUFFER POSITION
; RETURN E = CHARACTER, B = COLOUR, C = ATTRIBUTES
;----------------------------------------------------------------------
VGA_VDARDC:
OR $FF ; UNSUPPORTED FUNCTION
RET
;
;======================================================================
; VGA DRIVER - PRIVATE DRIVER FUNCTIONS