@ -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 $ 7 F ; 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 $ 7 F ; 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 DL ZSA2 ; 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 DL ZSA2 ; 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 DL ZSA2 ; 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 "