diff --git a/Source/Doc/Architecture.md b/Source/Doc/Architecture.md index 7c4ca5e3..5afc0cd0 100644 --- a/Source/Doc/Architecture.md +++ b/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) ------------ diff --git a/Source/HBIOS/cvdu.asm b/Source/HBIOS/cvdu.asm index 558f61d0..7f5b6cd1 100644 --- a/Source/HBIOS/cvdu.asm +++ b/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 diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index 6b59ef54..924b3f0d 100644 --- a/Source/HBIOS/hbios.asm +++ b/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) diff --git a/Source/HBIOS/tms.asm b/Source/HBIOS/tms.asm index accad61e..ab0970fa 100644 --- a/Source/HBIOS/tms.asm +++ b/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 diff --git a/Source/HBIOS/vdu.asm b/Source/HBIOS/vdu.asm index bb37c14a..0d035bf4 100644 --- a/Source/HBIOS/vdu.asm +++ b/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,32 @@ 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 HL,(VDU_OFFSET) ; SET BUFFER READ POSITION + LD DE,(VDU_POS) + ADD HL,DE + + 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 ;====================================================================== diff --git a/Source/HBIOS/vga.asm b/Source/HBIOS/vga.asm index dea1aea8..61832ff4 100644 --- a/Source/HBIOS/vga.asm +++ b/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