mirror of
https://github.com/wwarthen/RomWBW.git
synced 2026-02-06 14:11:48 -06:00
Support Font Data in ROM
Video soft font data was occupying a large amount of space in the HBIOS bank. This change moves the font data to a ROM bank by default. Thanks and credit to @b1ackmai1er who provided much of the code that originated this change. Co-Authored-By: b1ackmai1er <39449559+b1ackmai1er@users.noreply.github.com>
This commit is contained in:
@@ -5454,7 +5454,7 @@ SYS_RESUSER:
|
||||
;
|
||||
IN0 A,(Z180_ITC) ; GET ITC REGISTER
|
||||
XOR $80 ; PRECLEAR TRAP BIT
|
||||
RET M ; IF TRAP BIT NOT SET, DONE
|
||||
JP M,SYS_RESUSER3 ; IF TRAP BIT NOT SET, DONE
|
||||
;
|
||||
; HANDLE INVALID OPCODE
|
||||
DEC HL ; BACK UP TO OPCODE START
|
||||
@@ -5488,6 +5488,7 @@ SYS_RESUSER2:
|
||||
;
|
||||
#ENDIF
|
||||
;
|
||||
SYS_RESUSER3:
|
||||
; RESET ACTIVE VIDEO DISPLAY ATTACHED TO EMULATOR
|
||||
CALL TERM_RESET
|
||||
;
|
||||
@@ -8287,62 +8288,111 @@ HB_CPUSPD2:
|
||||
RET ; AND DONE
|
||||
#ENDIF ; CPUFAM != CPU_EZ80
|
||||
;
|
||||
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.
|
||||
; PREPARE TO STREAM FONT DATA VIA THE FNT_NEXT ROUTINE. USES AF, BC,
|
||||
; DE, AND HL. RETURNS ZERO (ZF SET) FOR SUCCESS OR NON-ZERO (ZF CLEAR)
|
||||
; IF FONT NOT FOUND.
|
||||
;
|
||||
#IF ROMFONTS
|
||||
FNT_BNKID .EQU FONTS_BNK
|
||||
FNT_MAP .EQU FONTS_LOC
|
||||
#ELSE
|
||||
FNT_BNKID .EQU BID_BIOS
|
||||
#ENDIF
|
||||
;
|
||||
FNT_SELECT:
|
||||
; THE MAP IS CURRENTLY ASSUMED TO BE IN THE HBIOS BANK
|
||||
LD E,A ; DESIRED FONT ID TO E
|
||||
LD A,FNT_BNKID ; FONT BANK ID TO A
|
||||
LD (FNT_BID),A ; SAVE IN WORKING VARIABLE
|
||||
LD D,FNT_BNKID ; D = BANK FOR FONT DATA
|
||||
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
|
||||
FNT_SELECT0:
|
||||
CALL FNT_BYTE ; LOAD THE FONT ID FROM MAP
|
||||
;;;CALL PC_SPACE ; ** DEBUG ***
|
||||
;;;CALL PRTHEXBYTE ; ** DEBUG ***
|
||||
AND $7F ; MASK OUT COMP INDICATOR
|
||||
OR A ; CHECK FOR 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
|
||||
JR FNT_SELECT0 ; AND LOOP
|
||||
;
|
||||
FNT_SELECT1:
|
||||
LD E,(HL) ; GET FONT ID BYTE
|
||||
CALL FNT_BYTE ; GET FONT ID BYTE
|
||||
PUSH AF ; SAVE IT
|
||||
LD C,A ; SAVE IT IN E
|
||||
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?
|
||||
CALL FNT_BYTE ; LO BYTE OF ADDRESS
|
||||
LD E,A ; PUT IN E
|
||||
INC HL ; BUMP
|
||||
CALL FNT_BYTE ; HI BYTE OF ADDRESS
|
||||
LD D,A ; PUT IN D
|
||||
EX DE,HL ; FULL ADDRESS TO HL
|
||||
POP AF ; RECOVER FONT ID
|
||||
AND $80 ; 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
|
||||
;
|
||||
; DECOMPRESS THE FONT DATA. WE USURP $E000-$EFFF AS A BUFFER FOR THE
|
||||
; DECOMPRESSED DATA. IF THE FONT DATA IS IN ROM, WE FIRST COPY THE
|
||||
; COMPRESSED DATA TO $D000-DFFF. THE BUFFER SIZES ARE LARGE ENOUGH TO
|
||||
; CONTAIN THE LARGEST FONT IN ITS DECOMPRESSED STATE. THE BUFFER
|
||||
; LOCATIONS ARE SAFE DURING BOOT, BUT *NOT* FOR A RUNNING SYSTEM. SO,
|
||||
; ANY FONT THAT MUST BE RELOADED AFTER BOOT WILL NEED TO BE SAVED IN
|
||||
; DECOMPRESSED STATE! SPECIFICALLY THE 6X8 TMS FONT.
|
||||
;
|
||||
;;;CALL PC_SPACE ; ** DEBUG ***
|
||||
;;;LD A,'C' ; ** DEBUG ***
|
||||
;;;CALL COUT ; ** DEBUG ***
|
||||
;
|
||||
#IF ROMFONTS
|
||||
;;;LD A,'R' ; ** DEBUG ***
|
||||
;;;CALL COUT ; ** DEBUG ***
|
||||
;
|
||||
; COPY THE COMPRESSED DATA FROM ROM TO RAM BUFFER
|
||||
LD A,(FNT_BID) ; GET ROM FONT BANK ID
|
||||
LD (HB_SRCBNK),A ; SETUP SOURCE BANK
|
||||
LD A,BID_BIOS ; DEST BANK IS BIOS BANK
|
||||
LD (HB_DSTBNK),A ; SETUP DESTINATION BANK
|
||||
LD DE,$D000 ; PUT DEST IN DE
|
||||
LD BC,$1000 ; BLINDLY COPY 4K
|
||||
CALL HBX_BNKCPY ; COPY COMP FONT DATA TO RAM
|
||||
;
|
||||
; DO THE DECOMPRESSION
|
||||
LD HL,$D000 ; COMP BUF ADR TO HL
|
||||
LD DE,$E000 ; DECOMP BUF ADR TO DE
|
||||
CALL DLZSA2 ; DECOMPRESS
|
||||
LD A,BID_BIOS ; BANK OF DECOMP BUF
|
||||
LD (FNT_BID),A ; UPDATE FNT_BID
|
||||
LD HL,$E000 ; DEOMP BUF ADR TO HL
|
||||
#ELSE
|
||||
;;;LD A,'I' ; ** DEBUG ***
|
||||
;;;CALL COUT ; ** DEBUG ***
|
||||
LD DE,$E000 ; DECOMP BUF ADR TO DE
|
||||
CALL DLZSA2 ; DECOMPRESS
|
||||
LD HL,$E000 ; DECOMP BUF ADR TO HL
|
||||
#ENDIF
|
||||
;
|
||||
#ELSE
|
||||
JR FNT_SELECT_ERR ; OOPS, CAN'T DECOMPRESS
|
||||
#ENDIF
|
||||
;
|
||||
FNT_SELECT2:
|
||||
LD (FNT_PTR),HL ; SAVE STARTING POINTER
|
||||
;;;LD A,(FNT_BID) ; ** DEBUG ***
|
||||
;;;CALL PC_SPACE ; ** DEBUG ***
|
||||
;;;CALL PRTHEXBYTE ; ** DEBUG ***
|
||||
;;;LD HL,(FNT_PTR) ; ** DEBUG ***
|
||||
;;;CALL PC_SPACE ; ** DEBUG ***
|
||||
;;;CALL PRTHEXWORDHL ; ** DEBUG ***
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET
|
||||
|
||||
@@ -8352,41 +8402,38 @@ FNT_SELECT_ERR:
|
||||
;
|
||||
; 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
|
||||
; FONT DATA. THE CALLER CONTROLS NUMBER OF BYTES REQUESTED.
|
||||
; ONLY REGISTER A IS MODIFIED.
|
||||
;
|
||||
FNT_NEXT:
|
||||
#IF ROMFONTS
|
||||
PUSH HL
|
||||
LD HL,(FNT_PTR)
|
||||
CALL FNT_BYTE
|
||||
INC HL
|
||||
LD (FNT_PTR),HL
|
||||
POP HL
|
||||
RET
|
||||
;
|
||||
; HELPER FUNCTION TO RETRIEVE A BYTE OF ROM FONT DATA FROM THE
|
||||
; ROM FONT BANK. RETURNS BYTE FROM (FNT_BID:HL). RETURNS BYTE IN A.
|
||||
; ALL OTHER REGSITERS UNCHANGED.
|
||||
;
|
||||
FNT_BYTE:
|
||||
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
|
||||
;
|
||||
HB_UTIL_END .EQU $
|
||||
;
|
||||
;==================================================================================================
|
||||
; DISPLAY SUMMARY OF ATTACHED UNITS/DEVICES
|
||||
;==================================================================================================
|
||||
@@ -9604,85 +9651,88 @@ ORG_FONTS .EQU $
|
||||
;
|
||||
MEMECHO "FONTS"
|
||||
;
|
||||
#IFDEF USEFONT6X8
|
||||
FONT6X8:
|
||||
;
|
||||
; FOR NOW, WE NEVER COMPRESS THE 6X8 FONT. SEE TMS DRIVER.
|
||||
;
|
||||
#IF USELZSA2 & FALSE
|
||||
#INCLUDE "font6x8c.asm"
|
||||
#ELSE
|
||||
#INCLUDE "font6x8u.asm"
|
||||
#ENDIF
|
||||
MEMECHO " 6X8"
|
||||
#ENDIF
|
||||
;
|
||||
#IFDEF USEFONT8X8
|
||||
FONT8X8:
|
||||
;
|
||||
#IF USELZSA2
|
||||
#INCLUDE "font8x8c.asm"
|
||||
#ELSE
|
||||
#INCLUDE "font8x8u.asm"
|
||||
#ENDIF
|
||||
MEMECHO " 8X8"
|
||||
#ENDIF
|
||||
;
|
||||
#IFDEF USEFONT8X11
|
||||
FONT8X11:
|
||||
#IF USELZSA2
|
||||
#INCLUDE "font8x11c.asm"
|
||||
#ELSE
|
||||
#INCLUDE "font8x11u.asm"
|
||||
#ENDIF
|
||||
MEMECHO " 8X11"
|
||||
#ENDIF
|
||||
;
|
||||
#IFDEF USEFONT8X16
|
||||
FONT8X16:
|
||||
#IF USELZSA2
|
||||
#INCLUDE "font8x16c.asm"
|
||||
#ELSE
|
||||
#INCLUDE "font8x16u.asm"
|
||||
#ENDIF
|
||||
MEMECHO " 8X16"
|
||||
#ENDIF
|
||||
#IF !ROMFONTS
|
||||
;
|
||||
; HIGH BIT OF THE FONTID BYTE INDICATES THAT THE FONT DATA IS COMPRESSED
|
||||
;
|
||||
#IF USELZSA2
|
||||
#IF USELZSA2
|
||||
FNT_CMPMASK .EQU $80
|
||||
#ELSE
|
||||
#ELSE
|
||||
FNT_CMPMASK .EQU $00
|
||||
#ENDIF
|
||||
#ENDIF
|
||||
;
|
||||
; FONT LOCATION MAP
|
||||
;
|
||||
FNT_MAP:
|
||||
#IFDEF USEFONT6X8
|
||||
#IFDEF USEFONT6X8
|
||||
; FOR NOW, WE NEVER COMPRESS THE 6X8 FONT. SEE TMS DRIVER.
|
||||
;;; .DB FONTID_6X8 | FNT_CMPMASK
|
||||
.DB FONTID_6X8
|
||||
.DW FONT6X8
|
||||
#ENDIF
|
||||
#ENDIF
|
||||
;
|
||||
#IFDEF USEFONT8X8
|
||||
#IFDEF USEFONT8X8
|
||||
.DB FONTID_8X8 | FNT_CMPMASK
|
||||
.DW FONT8X8
|
||||
#ENDIF
|
||||
#ENDIF
|
||||
;
|
||||
#IFDEF USEFONT8X11
|
||||
#IFDEF USEFONT8X11
|
||||
.DB FONTID_8X11 | FNT_CMPMASK
|
||||
.DW FONT8X11
|
||||
#ENDIF
|
||||
#ENDIF
|
||||
;
|
||||
#IFDEF USEFONT8X16
|
||||
#IFDEF USEFONT8X16
|
||||
.DB FONTID_8X16 | FNT_CMPMASK
|
||||
.DW FONT8X16
|
||||
#ENDIF
|
||||
#ENDIF
|
||||
;
|
||||
.DB 0 ; END OF TABLE
|
||||
|
||||
;
|
||||
#IFDEF USEFONT6X8
|
||||
FONT6X8:
|
||||
;
|
||||
; FOR NOW, WE NEVER COMPRESS THE 6X8 FONT. SEE TMS DRIVER.
|
||||
;
|
||||
#IF USELZSA2 & FALSE
|
||||
#INCLUDE "font6x8c.asm"
|
||||
#ELSE
|
||||
#INCLUDE "font6x8u.asm"
|
||||
#ENDIF
|
||||
MEMECHO " 6X8"
|
||||
#ENDIF
|
||||
;
|
||||
#IFDEF USEFONT8X8
|
||||
FONT8X8:
|
||||
;
|
||||
#IF USELZSA2
|
||||
#INCLUDE "font8x8c.asm"
|
||||
#ELSE
|
||||
#INCLUDE "font8x8u.asm"
|
||||
#ENDIF
|
||||
MEMECHO " 8X8"
|
||||
#ENDIF
|
||||
;
|
||||
#IFDEF USEFONT8X11
|
||||
FONT8X11:
|
||||
#IF USELZSA2
|
||||
#INCLUDE "font8x11c.asm"
|
||||
#ELSE
|
||||
#INCLUDE "font8x11u.asm"
|
||||
#ENDIF
|
||||
MEMECHO " 8X11"
|
||||
#ENDIF
|
||||
;
|
||||
#IFDEF USEFONT8X16
|
||||
FONT8X16:
|
||||
#IF USELZSA2
|
||||
#INCLUDE "font8x16c.asm"
|
||||
#ELSE
|
||||
#INCLUDE "font8x16u.asm"
|
||||
#ENDIF
|
||||
MEMECHO " 8X16"
|
||||
#ENDIF
|
||||
;
|
||||
#ENDIF
|
||||
;
|
||||
SIZ_FONTS .EQU $ - ORG_FONTS
|
||||
MEMECHO " occupy "
|
||||
|
||||
Reference in New Issue
Block a user