Browse Source

Abstraction of Font File Processing

Moved common font data file processing (including decompression) into core code and removed redundant code from VDA drivers.
pull/578/head
Wayne Warthen 7 months ago
parent
commit
ab7c566270
No known key found for this signature in database GPG Key ID: 8B34ED29C07EEB0A
  1. 52
      Source/HBIOS/cvdu.asm
  2. 146
      Source/HBIOS/hbios.asm
  3. 31
      Source/HBIOS/tms.asm
  4. 43
      Source/HBIOS/vga.asm
  5. 56
      Source/HBIOS/vrc.asm

52
Source/HBIOS/cvdu.asm

@ -50,11 +50,13 @@ CVDU_COLS .EQU 80
#IF (CVDUMON == CVDUMON_CGA)
#DEFINE USEFONT8X8
#DEFINE CVDU_FONT FONT8X8
CVDU_FONTID .EQU FONTID_8X8
#ENDIF
;
#IF (CVDUMON == CVDUMON_EGA)
#DEFINE USEFONT8X16
#DEFINE CVDU_FONT FONT8X16
CVDU_FONTID .EQU FONTID_8X16
#ENDIF
;
TERMENABLE .SET TRUE ; INCLUDE TERMINAL PSEUDODEVICE DRIVER
@ -105,6 +107,7 @@ CVDU_INIT1:
CALL PRTDEC
PRTS("KB$")
CALL CVDU_LOADFONT ; LOAD FONT DATA FROM ROM TO CVDU STRORAGE
; *** DIAGNOSE FONT LOAD ERROR HERE!!! ***
CALL CVDU_VDAINI
CALL KBD_INIT ; INITIALIZE KEYBOARD DRIVER
@ -494,48 +497,35 @@ CVDU_LOADFONT:
LD HL,$2000 ; START OF FONT BUFFER
LD C,18 ; UPDATE ADDRESS REGISTER PAIR
CALL CVDU_WRX ; DO IT
#IF USELZSA2
LD (CVDU_STACK),SP ; SAVE STACK
LD HL,(CVDU_STACK) ; AND SHIFT IT
LD DE,$2000 ; DOWN 4KB TO
OR A ; CREATE A
SBC HL,DE ; DECOMPRESSION BUFFER
LD SP,HL ; HL POINTS TO BUFFER
EX DE,HL ; START OF STACK BUFFER
PUSH DE ; SAVE IT
LD HL,CVDU_FONT ; START OF FONT DATA
CALL DLZSA2 ; DECOMPRESS TO DE
POP HL ; RECALL STACK BUFFER POSITION
#ELSE
LD HL,CVDU_FONT ; START OF FONT DATA
#ENDIF
;
LD A,CVDU_FONTID ; DESIRED FONT
CALL FNT_SELECT ; SELECT IT
RET NZ ; ERROR RETURN
;
LD DE,$2000 ; LENGTH OF FONT DATA
LD C,31 ; DATA REGISTER
;
CVDU_LOADFONT1:
LD A,(HL) ; LOAD NEXT BYTE OF FONT DATA
CALL CVDU_WR ; WRITE IT
;
DEC DE ; DECREMENT LOOP COUNTER
#IF (CVDUMON == CVDUMON_CGA)
; SKIP ALTERNATING 8 BYTE PAIRS (SEE COMMENT ABOVE)
; WE ONLY GET NEXT REAL FONT BYTE IF BIT 3 OF COUNTER IS SET.
BIT 3,E ; BIT 3 CHANGES WITH EVERY 8 BYTES
JR Z,CVDU_LOADFONT2 ; WHEN ZERO, DON'T INC FONT PTR
CALL NZ,FNT_NEXT ; LOAD NEXT FONT BYTE ONLY IF BIT IS ON
#ELSE
CALL FNT_NEXT ; LOAD NEXT FONT BYTE
#ENDIF
INC HL ; INCREMENT FONT DATA POINTER
CVDU_LOADFONT2:
;
CALL CVDU_WR ; WRITE IT
LD A,D ; CHECK DE...
OR E ; FOR COUNTER EXHAUSTED
JR NZ,CVDU_LOADFONT1 ; LOOP TILL DONE
#IF USELZSA2
LD HL,(CVDU_STACK) ; ERASE DECOMPRESS BUFFER
LD SP,HL ; BY RESTORING THE STACK
RET ; DONE
CVDU_STACK .DW 0
#ELSE
JR Z,CVDU_LOADFONT3 ; BAIL OUT IF DONE
JR CVDU_LOADFONT1 ; LOOP TILL DONE
;
CVDU_LOADFONT3:
XOR A ; SIGNAL SUCCESS
RET
#ENDIF
;
;----------------------------------------------------------------------
; SET CURSOR POSITION TO ROW IN D AND COLUMN IN E

146
Source/HBIOS/hbios.asm

@ -8290,6 +8290,104 @@ HB_CPUSPD2:
HB_UTIL_END .EQU $
;
;==================================================================================================
; FONT MANAGEMENT ROUTINES
;==================================================================================================
;
; SELECT A FONT BASED ON THE FONT ID PASSED IN REGISTER A. THIS WILL
; PREPARE TO STREAM FONT DATA VIA THE FNT_NEXT ROUTINE. USES DE, AND
; HL.
;
FNT_SELECT:
; THE MAP IS CURRENTLY ASSUMED TO BE IN THE HBIOS BANK
LD E,A ; DESIRED FONT ID TO E
LD HL,FNT_MAP ; POINT TO START OF MAP
LD A,(HL) ; LOAD THE FONT ID
AND $7F ; REMOVE COMPRESSION BIT 7
OR A ; CHECK OF END OF TABLE
JR Z,FNT_SELECT_ERR ; IF SO, BAIL OUT W/ ERR
CP E ; CHECK FOR DESIRED FONT ID
JR Z,FNT_SELECT1 ; IF SO, LOCK IT IN
INC HL ; BUMP PAST FONT ID
INC HL ; BUMP TO
INC HL ; ... NEXT TABLE ENTRY
JR FNT_SELECT ; AND LOOP
;
FNT_SELECT1:
LD E,(HL) ; GET FONT ID BYTE
INC HL ; BUMP PAST FONT ID
LD A,BID_BIOS ; FOR NOW, ASSUME FONT IN HBIOS
LD (FNT_BID),A ; SAVE IT
LD A,(HL) ; DEREF HL
INC HL
LD H,(HL)
LD L,A
BIT 7,E ; COMPRESSED FONT DATA?
JR Z,FNT_SELECT2 ; IF NOT, SKIP DECOMP
;
#IF ((CVDUENABLE | GDCENABLE | TMSENABLE | VGAENABLE | VRCENABLE) & USELZSA2)
; BELOW DOES NOT YET HANDLE COMPRESSED FONT DATA IN ROM!!!
PUSH HL ; SAVE COMP DATA PTR
LD HL,0 ; COPY SP
ADD HL,SP ; ... TO HL
LD DE,$2100 ; SPACE FOR DECOMP BUF AND STACK
CCF ; CLEAR CARRY
SBC HL,DE ; HL IS START OF DECOMP BUF
POP DE ; RECOVER COMP DATA PTR
EX DE,HL ; SWAP
PUSH DE ; SAVE START OF DECOMP BUF
CALL DLZSA2 ; DECOMP
POP HL ; START OF DECOMP BUF
#ELSE
JR FNT_SELECT_ERR ; OOPS, CAN'T DECOMPRESS
#ENDIF
;
FNT_SELECT2:
LD (FNT_PTR),HL ; SAVE STARTING POINTER
XOR A ; SIGNAL SUCCESS
RET
FNT_SELECT_ERR:
OR $FF ; SIGNAL FAILURE
RET
;
; RETURN THE NEXT BYTE OF FONT DATA IN REGISTER A. EACH CALL RETURNS
; THE NEXT BYTE OF DATA. THERE IS NO INDICATION OF THE END OF THE
; FONT DATA. THE CALLER IS EXPECTED TO KNOW HOW MANY
; BYTES OF FONT DATA WILL BE RETURNED. ONLY REGISTER A IS
; MODIFIED.
;
ROMFONTS .EQU TRUE
;
FNT_NEXT:
#IF ROMFONTS
PUSH HL
PUSH DE
LD A,(FNT_BID)
LD D,A
LD HL,(FNT_PTR)
HB_DI
CALL HBX_PEEK
HB_EI
INC HL
LD (FNT_PTR),HL
LD A,E
POP DE
POP HL
RET
#ELSE
PUSH HL ; SAVE HL
LD HL,(FNT_PTR) ; GET CUR FONT DATA PTR
LD A,(HL) ; GET NEXT BYTE TO A
INC HL ; BUMP PTR
LD (FNT_PTR),HL ; SAVE PTR
POP HL ; RESTORE HL
RET ; DONE
#ENDIF
;
FNT_BID .DB 0 ; BANK CONTAINING FONT DATA
FNT_PTR .DW 0 ; POINTER TO NEXT BYTE OF DATA
;
;==================================================================================================
; DISPLAY SUMMARY OF ATTACHED UNITS/DEVICES
;==================================================================================================
;
@ -9550,25 +9648,41 @@ FONT8X16:
MEMECHO " 8X16"
#ENDIF
;
#IFDEF USEFONTCGA
FONTCGA:
#IF USELZSA2
#INCLUDE "fontcgac.asm"
#ELSE
#INCLUDE "fontcgau.asm"
#ENDIF
MEMECHO " CGA"
; HIGH BIT OF THE FONTID BYTE INDICATES THAT THE FONT DATA IS COMPRESSED
;
#IF USELZSA2
FNT_CMPMASK .EQU $80
#ELSE
FNT_CMPMASK .EQU $00
#ENDIF
;
#IFDEF USEFONTVGARC
FONTVGARC:
#IF USELZSA2
#INCLUDE "fontvgarcc.asm"
#ELSE
#INCLUDE "fontvgarcu.asm"
#ENDIF
MEMECHO " VGARC"
; FONT LOCATION MAP
;
FNT_MAP:
#IFDEF USEFONT6X8
; FOR NOW, WE NEVER COMPRESS THE 6X8 FONT. SEE TMS DRIVER.
;;; .DB FONTID_6X8 | FNT_CMPMASK
.DB FONTID_6X8
.DW FONT6X8
#ENDIF
;
#IFDEF USEFONT8X8
.DB FONTID_8X8 | FNT_CMPMASK
.DW FONT8X8
#ENDIF
;
#IFDEF USEFONT8X11
.DB FONTID_8X11 | FNT_CMPMASK
.DW FONT8X11
#ENDIF
;
#IFDEF USEFONT8X16
.DB FONTID_8X16 | FNT_CMPMASK
.DW FONT8X16
#ENDIF
;
.DB 0 ; END OF TABLE
;
SIZ_FONTS .EQU $ - ORG_FONTS
MEMECHO " occupy "

31
Source/HBIOS/tms.asm

@ -297,6 +297,7 @@ TMS_INIT1:
;
CALL TMS_CRTINIT ; SETUP THE TMS CHIP REGISTERS
CALL TMS_LOADFONT ; LOAD FONT DATA FROM ROM TO TMS STRORAGE
; *** DIAGNOSE FONT LOAD ERROR HERE!!! ***
CALL TMS_CLEAR ; CLEAR SCREEN, HOME CURSOR
#IF (TMSKBD == TMSKBD_PPK)
CALL PPK_INIT ; INITIALIZE PPI KEYBOARD DRIVER
@ -773,43 +774,23 @@ TMS_LOADFONT:
; SYSTEM INITIALIZATION REQUIRES A LARGE DECOMPRESSION BUFFER THAT WE
; HAVE NO WAY TO ACCOMMODATE WITHOUT TRASHING OS/APP MEMORY.
;
#IF USELZSA2 & FALSE
LD (TMS_STACK),SP ; SAVE STACK
LD HL,(TMS_STACK) ; AND SHIFT IT
LD DE,$2000 ; DOWN 4KB TO
CCF ; CREATE A
SBC HL,DE ; DECOMPRESSION BUFFER
LD SP,HL ; HL POINTS TO BUFFER
EX DE,HL ; START OF STACK BUFFER
PUSH DE ; SAVE IT
LD HL,TMS_FONT ; START OF FONT DATA
CALL DLZSA2 ; DECOMPRESS TO DE
POP HL ; RECALL STACK BUFFER POSITION
#ELSE
LD HL,TMS_FONT ; START OF FONT DATA
#ENDIF
LD A,FONTID_6X8 ; WE WANT 6X8
CALL FNT_SELECT ; SELECT IT
RET NZ ; ERROR RETURN
;
; FILL TMS_FNTVADDR BYTES FROM FONTDATA
LD DE,TMS_FNTSIZE
TMS_LOADFONT1:
LD A,(HL)
CALL FNT_NEXT ; NEXT FONT DATA BYTE
EZ80_IO
OUT (TMS_DATREG),A
TMS_IODELAY ; DELAY
INC HL
DEC DE
LD A,D
OR E
JR NZ,TMS_LOADFONT1
;
#IF USELZSA2 & FALSE
LD HL,(TMS_STACK) ; ERASE DECOMPRESS BUFFER
LD SP,HL ; BY RESTORING THE STACK
RET ; DONE
TMS_STACK .DW 0
#ELSE
XOR A ; SIGNAL SUCCESS
RET
#ENDIF
;
;----------------------------------------------------------------------
; VIRTUAL CURSOR MANAGEMENT

43
Source/HBIOS/vga.asm

@ -51,6 +51,7 @@ VGA_SCANL .EQU 16
VGA_89BIT .EQU VGA_8BIT
#DEFINE USEFONT8X16
#DEFINE VGA_FONT FONT8X16
VGA_FONTID .EQU FONTID_8X16
#ENDIF
#IF (VGASIZ=V80X30)
VGA_ROWS .EQU 30
@ -59,6 +60,7 @@ VGA_SCANL .EQU 16
VGA_89BIT .EQU VGA_8BIT
#DEFINE USEFONT8X16
#DEFINE VGA_FONT FONT8X16
VGA_FONTID .EQU FONTID_8X16
#ENDIF
#IF (VGASIZ=V80X43)
VGA_ROWS .EQU 43
@ -67,6 +69,7 @@ VGA_SCANL .EQU 11
VGA_89BIT .EQU VGA_8BIT
#DEFINE USEFONT8X11
#DEFINE VGA_FONT FONT8X11
VGA_FONTID .EQU FONTID_8X11
#ENDIF
#IF (VGASIZ=V80X60)
VGA_ROWS .EQU 60
@ -75,6 +78,7 @@ VGA_SCANL .EQU 8
VGA_89BIT .EQU VGA_8BIT
#DEFINE USEFONT8X8
#DEFINE VGA_FONT FONT8X8
VGA_FONTID .EQU FONTID_8X8
#ENDIF
;
#IF VGA_CSTY=VGA_BLOK
@ -138,6 +142,7 @@ VGA_INIT1:
; HARDWARE INITIALIZATION
CALL VGA_CRTINIT ; SETUP THE VGA CHIP REGISTERS
CALL VGA_LOADFONT ; LOAD FONT DATA FROM ROM TO VGA STORAGE
; *** DIAGNOSE FONT LOAD ERROR HERE!!! ***
CALL VGA_VDAINI
CALL KBD_INIT ; INITIALIZE KEYBOARD DRIVER
@ -550,52 +555,32 @@ VGA_CRTCDUMP1:
VGA_LOADFONT:
LD HL,$7000 | VGA_89BIT ; CLEAR FONT PAGE NUM
CALL VGA_SETCFG
#IF USELZSA2
LD (VGA_STACK),SP ; SAVE STACK
LD HL,(VGA_STACK) ; AND SHIFT IT
LD DE,$2000 ; DOWN 4KB TO
OR A ; CREATE A
SBC HL,DE ; DECOMPRESSION BUFFER
LD SP,HL ; HL POINTS TO BUFFER
EX DE,HL ; START OF STACK BUFFER
PUSH DE ; SAVE IT
LD HL,VGA_FONT ; START OF FONT DATA
CALL DLZSA2 ; DECOMPRESS TO DE
POP HL ; RECALL STACK BUFFER POSITION
#ELSE
LD HL,VGA_FONT ; START OF FONT DATA
#ENDIF
;
LD A,VGA_FONTID ; DESIRED FONT
CALL FNT_SELECT ; SELECT IT
RET NZ ; ERROR RETURN
;
LD DE,$7000 ; PAGE 7 OF VIDEO RAM
VGA_LOADFONT1:
LD B,VGA_SCANL ; # BYTES FOR EACH CHAR
VGA_LOADFONT2:
LD A,(HL) ; GET NEXT BYTE
CALL FNT_NEXT ; GET NEXT BYTE
CALL VGA_MEMWR ; MEM(DE) := A
INC HL ; NEXT FONT BYTE
INC DE ; NEXT MEM BYTE
DJNZ VGA_LOADFONT2
;
LD BC,16-VGA_SCANL ; MOVE TO NEXT
EX DE,HL ; 16 BYTE
ADD HL,BC ; CHARACTER
EX DE,HL
;
LD A,D
CP $80 ; CHECK FOR END
JR NZ,VGA_LOADFONT1 ; LOOP
LD HL,$7070 | VGA_89BIT ; SET FONT PAGE NUM TO 7
CALL VGA_SETCFG
#IF USELZSA2
LD HL,(VGA_STACK) ; ERASE DECOMPRESS BUFFER
LD SP,HL ; BY RESTORING THE STACK
RET ; DONE
VGA_STACK .DW 0
#ELSE
XOR A
RET
#ENDIF
;
;----------------------------------------------------------------------
; SET CURSOR POSITION TO ROW IN D AND COLUMN IN E

56
Source/HBIOS/vrc.asm

@ -24,6 +24,8 @@ VRC_COLS .EQU 64
#DEFINE USEFONT8X8
#DEFINE VRC_FONT FONT8X8
;
VRC_FONTID .EQU FONTID_8X8
;
TERMENABLE .SET TRUE ; INCLUDE TERMINAL PSEUDODEVICE DRIVER
KBDENABLE .SET TRUE ; INCLUDE KBD KEYBOARD SUPPORT
;
@ -70,6 +72,7 @@ VRC_INIT1:
; HARDWARE INITIALIZATION
CALL VRC_CRTINIT ; SETUP THE VGARC CHIP REGISTERS
CALL VRC_LOADFONT ; LOAD FONT DATA FROM ROM TO VGARC STORAGE
; *** DIAGNOSE FONT LOAD ERROR HERE!!! ***
CALL VRC_VDAINI ; RESET
CALL KBD_INIT ; INITIALIZE KEYBOARD DRIVER
@ -273,67 +276,22 @@ VRC_CRTINIT:
;----------------------------------------------------------------------
;
VRC_LOADFONT:
LD A,VRC_FONTID ; DESIRED FONT ID
CALL FNT_SELECT ; SELECT IT
RET NZ ; ERROR RETURN
;
#IF USELZSA2
LD (VRC_STACK),SP ; SAVE STACK
LD HL,(VRC_STACK) ; AND SHIFT IT
LD DE,$2000 ; DOWN 4KB TO
OR A ; CREATE A
SBC HL,DE ; DECOMPRESSION BUFFER
LD SP,HL ; HL POINTS TO BUFFER
EX DE,HL ; START OF STACK BUFFER
PUSH DE ; SAVE IT
LD HL,VRC_FONT ; START OF FONT DATA
CALL DLZSA2 ; DECOMPRESS TO DE
POP HL ; RECALL STACK BUFFER POSITION
#ELSE
LD HL,VRC_FONT ; START OF FONT DATA
#ENDIF
;
#IF 0
; THIS APPROACH TO LOADING FONTS IS BEST (FASTEST), BUT IS
; CAUSING ARTIFACTS ON THE DISPLAYED FONTS WHEN RUN ON A
; Z280. IT IS NOT CLEAR WHAT THE PROBLEM IS (POSSIBLY
; Z280 BUG), BUT FOR NOW WE AVOID THIS AND USE AN
; ALTERNATIVE APPROACH BELOW.
LD DE,0+(128*8)-1 ; LENGTH OF FONT DATA - 1
ADD HL,DE ; ADD TO HL
LD BC,VRC_FONTBASE+3 ; WORK BACKWARDS
OTDR ; DO 4 PAGES
DEC C
OTDR
DEC C
OTDR
DEC C
OTDR
DEC C
#ENDIF
;
#IF 1
; ALTERNATIVE APPROACH TO LOADING FONTS. THIS ONE AVOIDS
; THE USE OF OTDR WHICH SEEMS TO CAUSE PROBLEMS ON Z280.
LD B,0
LD C,VRC_FONTBASE
VRC_LOADFONT1:
LD A,(HL)
CALL FNT_NEXT
OUT (C),A
INC HL
INC B
JR NZ,VRC_LOADFONT1
INC C
LD A,C
CP VRC_FONTBASE + 4
JR NZ,VRC_LOADFONT1
#ENDIF
;
#IF USELZSA2
LD HL,(VRC_STACK) ; ERASE DECOMPRESS BUFFER
LD SP,HL ; BY RESTORING THE STACK
RET ; DONE
VRC_STACK .DW 0
#ELSE
RET
#ENDIF
;
;----------------------------------------------------------------------
; SET CURSOR POSITION TO ROW IN D AND COLUMN IN E

Loading…
Cancel
Save