Browse Source

Integrate Jose Collado's Screen Color Enhancements

Credit and thanks to Jose Collado

- This change enhances both the TMS driver and ANSI emulation to handle setting of screen foreground/background.
pull/378/head v3.4.0-dev.40
Wayne Warthen 2 years ago
parent
commit
def84eded9
  1. BIN
      Doc/RomWBW Applications.pdf
  2. BIN
      Doc/RomWBW Disk Catalog.pdf
  3. BIN
      Doc/RomWBW Errata.pdf
  4. BIN
      Doc/RomWBW ROM Applications.pdf
  5. BIN
      Doc/RomWBW System Guide.pdf
  6. BIN
      Doc/RomWBW User Guide.pdf
  7. 15
      Source/Doc/SystemGuide.md
  8. 126
      Source/HBIOS/ansi.asm
  9. 6
      Source/HBIOS/cvdu.asm
  10. 5
      Source/HBIOS/gdc.asm
  11. 95
      Source/HBIOS/tms.asm
  12. 4
      Source/HBIOS/vga.asm
  13. 2
      Source/ver.inc
  14. 2
      Source/ver.lib

BIN
Doc/RomWBW Applications.pdf

Binary file not shown.

BIN
Doc/RomWBW Disk Catalog.pdf

Binary file not shown.

BIN
Doc/RomWBW Errata.pdf

Binary file not shown.

BIN
Doc/RomWBW ROM Applications.pdf

Binary file not shown.

BIN
Doc/RomWBW System Guide.pdf

Binary file not shown.

BIN
Doc/RomWBW User Guide.pdf

Binary file not shown.

15
Source/Doc/SystemGuide.md

@ -1460,14 +1460,17 @@ standard HBIOS result code.
|----------------------------------------|----------------------------------------|
| B: 0x47 | A: Status |
| C: Video Unit | |
| D: Scope | |
| E: Color | |
Assign the specified Color (E) code to be used for all subsequent
character writes/fills. This color is also used to fill new lines
generated by scroll operations. Refer to the color code table above for
a list of the available color codes. Note that a given video display may
or may not support any/all colors. The Status (A) is a standard HBIOS
result code.
Assign the specified Color (E) code for character foreground/background.
If Scope (D) is 0, the specified color will be used for all
subsequent character writes/fills. This color is also used to fill new
lines generated by scroll operations. If Scope (D) is 1, then the
specified foreground/background color will be applied immediately to the
entire screen. Refer to the color code table above for a list of the
available color codes. Note that a given video display may or may not
support any/all colors. The Status (A) is a standard HBIOS result code.
### Function 0x48 -- Video Write Character (VDAWRC)

126
Source/HBIOS/ansi.asm

@ -3,6 +3,10 @@
; ANSI EMULATION MODULE
;==================================================================================================
;
; ENHANCED BY: JOSE L. COLLADO -- 12/21/2023 -
; NEW ANSI PRIVATE SEQUENCE TO INIT VDU AND CHANGE DEFAULT COLORS
; (SEE ANSI CONTROL SEQUENCE DISPATCHING SECTION BELOW FOR DETAILS)
;
; TODO:
; 1) INSERT/DELETE CHARACTERS CTL SEQUENCES
; 2) OTHER CTL SEQUENCES?
@ -61,6 +65,7 @@ ANSI_RESET:
LD (ANSI_ATTR),A ; CLEAR ATTRIBUTES
LD A,ANSI_DEFCOLOR ; DEFAULT COLOR
LD (ANSI_COLOR),A ; RESET COLOR
LD (ANSI_SCOLOR),A ; RESET SCREEN COLOR
XOR A ; ZERO ACCUM
LD (ANSI_WRAP),A ; CLEAR WRAP FLAG
LD (ANSI_LNM),A ; SET LINE FEED NEW LINE MODE
@ -385,6 +390,17 @@ ANSI_ESCDISP2: ; ESC DISPATCHING FOR '#' INT CHAR
; ANSI CONTROL SEQUENCE DISPATCHING
;==================================================================================================
;
;--------------------------------------------------------------------------------------------------
; ### JLC Mod - NEW ANSI PRIVATE SEQUENCE TO INIT VDU AND CHANGE DEFAULT COLORS ###
;--------------------------------------------------------------------------------------------------
; Follows ANSI Standards described in VT100.net for Private Sequences.
; Implements the ESC Seq.: \ESC[{Num1};{Num2}'{' where '{' is the final char of new Private Sequence.
; Initializes the VDU and Changes Default Colors according to the following table:
; {Num1}: 30..37 - Foreground color (black, red, green, yellow, blue, magenta, cyan, white)
; {Num2}: 40..47 - Background color (black, red, green, yellow, blue, magenta, cyan, white)
;
; Example: \ESC[37;44{ sets text to white on blue background, \ESC[0{ returns to default colors.
;
ANSI_CTLDISP:
LD (ANSI_FINAL),A ; RECORD THE FINAL CHARACTER
#IF (ANSITRACE >= 2)
@ -453,6 +469,11 @@ ANSI_STD1: ; DISPATCH FOR FINAL CHAR W/ NO INTERMEDIATE CHAR AND NO PRIVATE CHAR
CP 'm' ; SGR: SELECT GRAPHIC RENDITION
JP Z,ANSI_SGR
; CHECK FOR ANY OTHERS HERE
; ### JLC Mod - New Private Sequence with Parameters checked here...
CP '{' ; SSC: SET SCREEN COLORS
JP Z,ANSI_SSC
;
; ANY OTHERS ARE IGNORED
JR ANSI_UNK ; UNKNOWN, ABORT
;
ANSI_DEC: ; DISPATCH ON INTERMEDIATE CHAR W/ PRIVATE CHAR = '?' (DEC)
@ -1147,14 +1168,15 @@ ANSI_SGR1: ; PROCESSING LOOP
INC HL ; POINT TO NEXT PARM
DJNZ ANSI_SGR1 ; LOOP TILL DONE
;
; NOW IMPLEMENT ALL CHANGES
; NOW IMPLEMENT ALL CHANGES FOR SGR
LD A,(ANSI_ATTR) ; GET THE ATTRIBUTE VALUE
LD E,A ; MOVE TO E
LD B,BF_VDASAT ; SET ATTRIBUTE FUNCTION
CALL ANSI_VDADISP ; CALL THE FUNCTION
LD A,(ANSI_COLOR) ; GET THE COLOR VALUE
LD E,A ; MOVE TO E
LD B,BF_VDASCO ; SET ATTRIBUTE FUNCTION
LD D,0 ; SET INDIVIDUAL CHAR COLORS
LD B,BF_VDASCO ; SET COLOR FUNCTION
CALL ANSI_VDADISP ; CALL THE FUNCTION
RET ; RETURN
;
@ -1234,6 +1256,81 @@ ANSI_SGR_BG:
;
;
;
;......................................................................................
; ### JLC Mod - Implement new Private Sequence to call VDAINI and Change Default Colors
;
ANSI_SSC: ; SET SCREEN COLOR (CUSTOM EXTENSION)
LD A,(ANSI_PARIDX) ; GET CURRENT PARM INDEX
INC A ; INC TO MAKE IT THE COUNT
LD B,A ; B IS NOW LOOP COUNTER
LD HL,ANSI_PARLST ; HL POINTS TO START OF PARM LIST
;
ANSI_SSC1: ; PROCESSING LOOP
PUSH BC ; PRESERVE BC
PUSH HL ; PRESERVE HL
LD A,(HL)
CALL ANSI_SSC2 ; HANDLE PARM
POP HL ; RESTORE HL
POP BC ; RESTORE BC
INC HL ; POINT TO NEXT PARM
DJNZ ANSI_SSC1 ; LOOP TILL DONE
;
; NOW IMPLEMENT ALL CHANGES FOR SSC
LD A,(ANSI_SCOLOR) ; GET THE COLOR VALUE
LD E,A ; MOVE TO E
LD D,1 ; SET SCREEN COLORS
LD B,BF_VDASCO ; SET COLOR FUNCTION
CALL ANSI_VDADISP ; CALL THE FUNCTION
RET ; RETURN
;
ANSI_SSC2: ; HANDLE THE REQUEST CODE
CP 0 ; ALL OFF
JR Z,ANSI_SSC_OFF ; DO IT
CP 30 ; START OF FOREGROUND
RET C ; OUT OF RANGE
CP 38 ; END OF RANGE
JR C,ANSI_SSC_FG ; SET FOREGROUND
CP 40 ; START OF BACKGROUND
RET C ; OUT OF RANGE
CP 48 ; END OF RANGE
JR C,ANSI_SSC_BG ; SET BACKGROUND
RET ; OTHERWISE OUT OF RANGE
;
ANSI_SSC_OFF:
LD A,ANSI_DEFCOLOR ; DEFAULT COLOR
LD (ANSI_SCOLOR),A ; RESET COLOR
RET
;
ANSI_SSC_BOLD:
LD A,(ANSI_SCOLOR) ; LOAD CURRENT COLOR
OR %00001000 ; SET BOLD BIT
LD (ANSI_SCOLOR),A ; SAVE IT
RET
;
ANSI_SSC_FG:
SUB 30
LD E,A
LD A,(ANSI_SCOLOR)
AND %11111000
OR E
LD (ANSI_SCOLOR),A
RET
;
ANSI_SSC_BG:
SUB 40
RLCA
RLCA
RLCA
RLCA
LD E,A
LD A,(ANSI_SCOLOR)
AND %10001111
OR E
LD (ANSI_SCOLOR),A
RET
;
;
;
ANSI_DECALN: ; DEC SCREEN ALIGNMENT TEST
LD DE,0 ; PREPARE TO HOME CURSOR
LD (ANSI_POS),DE ; SAVE NEW CURSOR POSITION
@ -1394,7 +1491,8 @@ ANSI_ROWS .DB 24 ; NUMBER OF ROWS ON SCREEN
;
ANSI_STATE .DW PANIC ; CURRENT FUNCTION FOR STATE MACHINE
ANSI_ATTR .DB ANSI_DEFATTR ; CURRENT CHARACTER ATTRIBUTE
ANSI_COLOR .DB ANSI_DEFCOLOR ; CURRENT CHARACTER COLOR;
ANSI_COLOR .DB ANSI_DEFCOLOR ; CURRENT CHARACTER FG/BG COLOR
ANSI_SCOLOR .DB ANSI_DEFCOLOR ; CURRENT SCREEN FG/BG COLOR
ANSI_WRAP .DB 0 ; WRAP PENDING FLAG
ANSI_TABS .FILL 32,0 ; TAB STOP BIT MAP (256 BITS)
ANSI_LNM .DB 0 ; LINE FEED NEW LINE MODE FLAG
@ -1415,3 +1513,25 @@ ANSI_VARLEN .EQU $ - ANSI_VARS
;
ANSI_VDAUNIT .DB $FF ; VIDEO UNIT NUM OF ATTACHED VDA DEVICE
ANSI_DEVNUM .DB $FF ; TERMINAL DEVICE NUMBER
;
;=============================================================
; BASIC ANSI COLOR TABLE (NIBBLES FOR FOREGROUND & BACKGROUND)
; ------------------------------------------------------------
; 0 Black
; 1 Red
; 2 Green
; 3 Brown
; 4 Blue
; 5 Magenta
; 6 Cyan
; 7 White
; 8 Gray
; 9 Light Red
; A Light Green
; B Yellow
; C Light Blue
; D Light Magenta
; E Light Cyan
; F Bright White
;=============================================================
;

6
Source/HBIOS/cvdu.asm

@ -208,6 +208,11 @@ CVDU_VDASAT:
RET
CVDU_VDASCO:
; WE HANDLE ONLY PER-CHARACTER COLORS (D=0)
LD A,D ; GET CHAR/SCREEN SCOPE
OR A ; CHARACTER?
JR NZ,CVDU_VDASCO_Z ; IF NOT, JUST RETURN
; INCOMING IS: IBGRIBGR (I=INTENSITY, B=BLUE, G=GREEN, R=RED)
; TRANSFORM TO: ----RGBI (DISCARD BACKGROUND COLOR IN HIGH NIBBLE)
XOR A ; CLEAR A
@ -221,6 +226,7 @@ CVDU_VDASCO1:
AND %11110000 ; CLEAR OUT OLD COLOR BITS
OR E ; STUFF IN THE NEW ONES
LD (CVDU_ATTR),A ; AND SAVE THE RESULT
CVDU_VDASCO_Z:
XOR A ; SIGNAL SUCCESS
RET

5
Source/HBIOS/gdc.asm

@ -189,8 +189,13 @@ GDC_VDASAT: ; SET ATTRIBUTES
RET
GDC_VDASCO: ; SET COLOR
; WE HANDLE ONLY PER-CHARACTER COLORS (D=0)
LD A,D ; GET CHAR/SCREEN SCOPE
OR A ; CHARACTER?
JR NZ,GDC_VDASCO_Z ; IF NOT, JUST RETURN
LD A,E ; GET THE INCOMING COLOR
LD (GDC_COLOR),A ; AND SAVE FOR LATER
GDC_VDASCO_Z:
XOR A ; SIGNAL SUCCESS
RET

95
Source/HBIOS/tms.asm

@ -201,7 +201,7 @@ TMS_INIT:
#IF (TMSMODE == TMSMODE_MSX)
PRTS("MSX$")
#ENDIF
#IF (TMSMODE == TMSMODE_COLECO) ; ### JLC Mod for completeness ###
#IF (TMSMODE == TMSMODE_COLECO)
PRTS("COLECO$")
#ENDIF
#IF (TMSMODE == TMSMODE_MSXKBD)
@ -215,7 +215,6 @@ TMS_INIT:
LD A,TMS_DATREG
CALL PRTHEXBYTE
CALL TMS_PROBE ; CHECK FOR HW EXISTENCE
;JP TMS_INIT1 ; ### JLC DEBUG: ALLWAYS CONTINUE ###
JR Z,TMS_INIT1 ; CONTINUE IF PRESENT
;
; *** HARDWARE NOT PRESENT ***
@ -370,7 +369,40 @@ TMS_VDASAT:
RET
TMS_VDASCO:
XOR A ; NOT POSSIBLE, JUST SIGNAL SUCCESS
; ### JLC Mod - Implement Default Text Mode Colors via ANSI_VDAINI or direct HBIOS Call
;
; Color setting is in reg D in ANSI Format as described in RomWBW System Guide
; Convert Color Format from ANSI to TMS shuffling bits arround and using
; Color Conversion Table at TMS_COLOR_TBL (approximated equivalences)
; Save converted value to (TMS_TMSCOLOR)
;
; TMS hardware only allows setting a global (screen) foreground/background color. So, we
; only process this command if E is 1.
;
LD A,D ; GET CHAR/SCREEN SCOPE
CP 1 ; SCREEN?
JR NZ,TMS_VDASCO_Z ; IF NOT, JUST RETURN
;
LD A,E ; GET COLOR BYTE
AND $F0 ; ISOLATE BACKGROUND
RRCA \ RRCA \ RRCA \ RRCA ; MOVE TO LOWER NIBBLE
LD HL,TMS_COLOR_TBL ; POINT TO COLOR CONVERSION TABLE
CALL ADDHLA ; OFFSET TO DESIRED COLOR
LD B,(HL) ; PUT NEW BG IN B
;
LD A,E ; GET COLOR BYTE
AND $0F ; ISOLATE FOREGROUND
LD HL,TMS_COLOR_TBL ; POINT TO COLOR CONVERSION TABLE
CALL ADDHLA ; OFFSET TO DESIRED COLOR
LD A,(HL) ; PUT NEW FG IN A
RLCA \ RLCA \ RLCA \ RLCA ; MOVE TO UPPER NIBBLE
;
OR B ; COMBINE WITH FG
LD C, 7 ; C = Color Register, A = Desired new Color in TMS Format
CALL TMS_SET ; Write to specific TMS Register, Change Default Text Color
;
TMS_VDASCO_Z:
XOR A ; SIGNAL SUCCESS
RET
TMS_VDAWRC:
@ -558,7 +590,7 @@ TMS_CRTINIT:
LD HL,0
CALL TMS_WR
;
; FILL ENTIRE 16KB VRAM CONTENTS with $00 ### JLC Comment fix ###
; FILL ENTIRE 16KB VRAM CONTENTS with $00
LD DE,$4000 ; 16KB
TMS_CRTINIT1:
XOR A
@ -614,7 +646,7 @@ TMS_LOADFONT:
#ENDIF
;
; FILL TMS_FNTVADDR BYTES FROM FONTDATA
LD DE,TMS_FNTSIZE ; ### JLC Mod for JBL compatibility ###
LD DE,TMS_FNTSIZE
TMS_LOADFONT1:
LD A,(HL)
OUT (TMS_DATREG),A
@ -738,7 +770,6 @@ TMS_XY2IDX:
CALL MULT8 ; MULTIPLY TO GET ROW OFFSET
LD E,A ; GET COLUMN BACK
ADD HL,DE ; ADD IT IN
; ### JLC Fix to allow Name Table Addresses other than $0000 and JBL Compatibility ###
LD DE,TMS_CHRVADDR ; Add offset Address to start of Name Table (Char)
ADD HL,DE
RET ; RETURN
@ -787,7 +818,6 @@ TMS_FILL1:
;----------------------------------------------------------------------
;
TMS_SCROLL:
; ### JLC Fix to allow Name Table Addresses other than $0000 and JBL Compatibility ###
LD HL,TMS_CHRVADDR ; SOURCE ADDRESS OF CHARACTER BUFFER
LD C,TMS_ROWS - 1 ; SET UP LOOP COUNTER FOR ROWS - 1
;
@ -839,7 +869,6 @@ TMS_SCROLL3:
;----------------------------------------------------------------------
;
TMS_RSCROLL:
; ### JLC Fix to allow Name Table Addresses other than $0000 and JBL Compatibility ###
LD HL,TMS_COLS * (TMS_ROWS - 1)
LD DE,TMS_CHRVADDR ; Add offset Address to start of Name Table (Char)
ADD HL,DE
@ -983,7 +1012,10 @@ TMS_INTHNDL:
TMS_POS .DW 0 ; CURRENT DISPLAY POSITION
TMS_CURSAV .DB 0 ; SAVES ORIGINAL CHARACTER UNDER CURSOR
TMS_BUF .FILL 256,0 ; COPY BUFFER
;
; ### JLC Mod
; ANSI-->TMS Color Conversion Table
TMS_COLOR_TBL .DB $01,$08,$02,$0A,$04,$06,$0C,$0F,$0E,$09,$03,$0B,$05,$0D,$07,$0F
;
;==================================================================================================
; TMS DRIVER - INSTANCE DATA
@ -1055,6 +1087,10 @@ TMS_IDAT:
; https://www.msx.org/wiki/Screen_Modes_Description#SCREEN_0_in_80-column_.28Text_mode_2.29
; BITS 1-0 SHOULD BE 1. BITS 8-2 SHOULD BE (ADR >> 8).
;
; ### JLC Mod
; TEXT MODE DEFAULT COLOR (REG 7) CAN BE CHANGED INVOKING VDASCO
; OR VIA ANSI PRIVATE ESC SEQ. (SEE ANSI.ASM FOR DETAILS)
;
TMS_INITVDU: ; V9958 REGISTER SET
.DB $04 ; REG 0 - NO EXTERNAL VID, SET M4 = 1 FOR 80 COLS
TMS_INITVDU_REG_1:
@ -1069,7 +1105,7 @@ TMS_INITVDU_REG_1:
.DB $00 ; REG 9
.DB $00 ; REG 10 - COLOUR TABLE A14-A16 (TMS_FNTVADDR - $1000)
;
#ELSE ; _______TMS9918 REGISTER SET ### JLC Mod for JBL compatibility & MODE II Readiness ###_______
#ELSE ; _______TMS9918 REGISTER SET_______
;
TMS_INITVDU: ; V9918 REGISTER SET
.DB $00 ; REG 0 - SET TEXT MODE, NO EXTERNAL VID
@ -1080,18 +1116,7 @@ TMS_INITVDU_REG_1:
.DB $00 ; REG 4 - SET PATTERN GENERATOR TABLE TO (TMS_FNTVADDR -> $0000)
.DB $76 ; REG 5 - SPRITE ATTRIBUTE IRRELEVANT, SET TO MODE II DEFAULT VALUE
.DB $03 ; REG 6 - NO SPRITE GENERATOR TABLE, SET TO MODE II DEFAULT VALUE
.DB $E1 ; REG 7 - GREY ON BLACK ### JLC Mod Change default text color for better readability YMMV ###
;
;TMS_INITVDU:
; .DB $00 ; REG 0 - NO EXTERNAL VID
;TMS_INITVDU_REG_1:
; .DB $50 ; REG 1 - ENABLE SCREEN, SET TEXT MODE & BLANK SCREEN ### JLC comment fix (NOT MODE 1) ###
; .DB $00 ; REG 2 - PATTERN NAME TABLE := 0
; .DB $00 ; REG 3 - NO COLOR TABLE
; .DB $01 ; REG 4 - SET PATTERN GENERATOR TABLE TO (TMS_FNTVADDR -> $0800)
; .DB $00 ; REG 5 - SPRITE ATTRIBUTE IRRELEVANT
; .DB $00 ; REG 6 - NO SPRITE GENERATOR TABLE
; .DB $F0 ; REG 7 - WHITE ON TRANSPARENT
.DB $E1 ; REG 7 - TEXT COLOR
;
#ENDIF
;
@ -1101,3 +1126,29 @@ TMS_INITVDULEN .EQU $ - TMS_INITVDU
#IF (CPUFAM == CPU_Z180)
TMS_DCNTL .DB $00 ; SAVE Z180 DCNTL AS NEEDED
#ENDIF
;
; ### JLC Mod
;===============================================================================
; BASIC ANSI to TMS COLOR CONVERSION TABLE (NIBBLES FOR FOREGROUND & BACKGROUND)
; Follows RomWBW System Guide Chapter 8, HBIOS Reference
;-------------------------------------------------------------------------------
; ANSI Color TMS Equivalent
;-------------------------------------------------------------------------------
; 0 Black 1
; 1 Red 8
; 2 Green 2
; 3 Brown A
; 4 Blue 4
; 5 Magenta 6
; 6 Cyan C
; 7 White F
; 8 Gray E
; 9 Light Red 9
; A Light Green 3
; B Yellow B
; C Light Blue 5
; D Light Magenta D
; E Light Cyan 7
; F Bright White F
;===============================================================================
;

4
Source/HBIOS/vga.asm

@ -237,6 +237,10 @@ VGA_VDASAT:
JR VGA_VDASCO2 ; IMPLEMENT SETTING
VGA_VDASCO:
; WE HANDLE ONLY PER-CHARACTER COLORS (D=0)
LD A,D ; GET CHAR/SCREEN SCOPE
OR A ; CHARACTER?
JR NZ,VGA_VDASCO3 ; IF NOT, JUST RETURN
; INCOMING IS: IBGRIBGR (I=INTENSITY, B=BLUE, G=GREEN, R=RED)
; TRANSFORM TO: -RGBIRGB (DISCARD INTENSITY BIT IN HIGH NIBBLE)
;

2
Source/ver.inc

@ -2,7 +2,7 @@
#DEFINE RMN 4
#DEFINE RUP 0
#DEFINE RTP 0
#DEFINE BIOSVER "3.4.0-dev.39"
#DEFINE BIOSVER "3.4.0-dev.40"
#define rmj RMJ
#define rmn RMN
#define rup RUP

2
Source/ver.lib

@ -3,5 +3,5 @@ rmn equ 4
rup equ 0
rtp equ 0
biosver macro
db "3.4.0-dev.39"
db "3.4.0-dev.40"
endm

Loading…
Cancel
Save