Browse Source

Add VDA Read Character function

For your consideration. Seems to work.
pull/253/head
b1ackmai1er 4 years ago
parent
commit
3bc8afcc87
  1. 19
      Source/Doc/Architecture.md
  2. 10
      Source/HBIOS/cvdu.asm
  3. 7
      Source/HBIOS/hbios.asm
  4. 10
      Source/HBIOS/tms.asm
  5. 25
      Source/HBIOS/vdu.asm
  6. 10
      Source/HBIOS/vga.asm

19
Source/Doc/Architecture.md

@ -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)
------------

10
Source/HBIOS/cvdu.asm

@ -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

7
Source/HBIOS/hbios.asm

@ -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)

10
Source/HBIOS/tms.asm

@ -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

25
Source/HBIOS/vdu.asm

@ -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
;======================================================================

10
Source/HBIOS/vga.asm

@ -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

Loading…
Cancel
Save