From 25a9ce046fc8e8fa9f7bc9c6cd8a9754cdc75378 Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Sat, 4 Jan 2025 13:59:37 +0800 Subject: [PATCH] Option to move Fonts out of HBIOS area to ROM Bank 3 The FONTS_INLINE equate controls whether the fonts are included in the HBIOS area as per existing behaviour or whether they are placed in the currently unused ROM bank 3. In the case where we use bank 3 for font storage, the HBIOS is built with the font data located at 0x8000 onwards. The build process splits this off for relocation to the correct image position. Unlzsa, the TMS and VGA driver have been updated to access the font data from either location, whether compressed or not. Moving the font data to bank 3 results in significant savings in HBIOS space. If you are happy with this approach, I will continue developing and roll changes into other display drivers and do some hardware testing. Further on, as mentioned, I would like to look see if i can get the decompressor to decompress one byte at a time and move the CCP cache to bank 3 as well. Regards Phil --- Source/HBIOS/Bank Layout.txt | 14 +++-- Source/HBIOS/Build.cmd | 10 +++- Source/HBIOS/cfg_MASTER.asm | 1 + Source/HBIOS/cvdu.asm | 6 +-- Source/HBIOS/eastaegg.asm | 2 +- Source/HBIOS/ef.asm | 4 +- Source/HBIOS/fonts.inc | 70 ++++++++++++++++++++++++ Source/HBIOS/hbios.asm | 91 +++++++++---------------------- Source/HBIOS/tms.asm | 102 +++++++++++++++++++++++------------ Source/HBIOS/unlzsa2s.asm | 81 ++++++++++++++++++++++++---- Source/HBIOS/vga.asm | 36 +++++++++++-- Source/HBIOS/vrc.asm | 4 +- 12 files changed, 292 insertions(+), 129 deletions(-) create mode 100644 Source/HBIOS/fonts.inc diff --git a/Source/HBIOS/Bank Layout.txt b/Source/HBIOS/Bank Layout.txt index f7f957cb..b859c174 100644 --- a/Source/HBIOS/Bank Layout.txt +++ b/Source/HBIOS/Bank Layout.txt @@ -2,13 +2,15 @@ ROM Bank Layout Bank ID Module Start Size ------ ------ ------ ------ -0x00 hbios 0x0000 0x8000 +0x00 hbios 0x0000 0x7FFF + 0x7FFF 0x0001 0x8000 0x01 loader 0x0000 0x1000 dbgmon 0x1000 0x2000 cpm22 0x2000 0x3000 - zsys 0x5000 0x3000 + zsys 0x5000 0x2FFF + 0x7FFF 0x0001 0x8000 0x02 forth 0x0000 0x1700 @@ -18,10 +20,12 @@ Bank ID Module Start Size egg 0x4900 0x0200 netboot 0x4B00 0x1000 updater 0x5B00 0x0D00 - usrrom 0x6800 0x1800 + usrrom 0x6800 0x7FFF + 0x7FFF 0x0001 0x8000 -0x03 imgpad2 0x0000 0x8000 +0x03 [fonts] 0x0000 0x7FFF + 0x7FFF 0x0001 0x8000 0x04 - N ROM Disk Data @@ -34,7 +38,7 @@ Bank ID Usage 0x00 Boot Bank (HBIOS image) 0x01 ROM Loader, Monitor, ROM OSes 0x02 ROM Applications -0x03 Reserved +0x03 Optional Font storage, Cache. 0x04-0x0F ROM Disk Banks (12) diff --git a/Source/HBIOS/Build.cmd b/Source/HBIOS/Build.cmd index 920b8d1a..e963b679 100644 --- a/Source/HBIOS/Build.cmd +++ b/Source/HBIOS/Build.cmd @@ -17,7 +17,7 @@ set CPMDIR80=%TOOLS%/cpm/ :: :: This PowerShell script validates the build variables passed in. If -:: necessary, the user is prmopted to pick the variables. It then creates +:: necessary, the user is prompted to pick the variables. It then creates :: an include file that is imbedded in the HBIOS assembly (build.inc). :: It also creates a batch command file that sets environment variables :: for use by the remainder of this batch file (build_env.cmd). @@ -114,7 +114,7 @@ copy /b romldr.bin + dbgmon.bin + ..\zsdos\zsys_wbw.bin + ..\cpm22\cpm_wbw.bin o copy /b ..\Forth\camel80.bin + nascom.bin + ..\tastybasic\src\tastybasic.bin + game.bin + eastaegg.bin + %NETBOOT% + updater.bin + sysconf.bin + usrrom.bin osimg1.bin || exit /b if %Platform%==S100 ( - zxcc slr180 -s100mon/fh + zxcc slr180 -s100mon/fh || exit /b zxcc mload25 -s100mon || exit /b copy /b s100mon.com osimg2.bin || exit /b ) else ( @@ -123,6 +123,12 @@ if %Platform%==S100 ( copy /b romldr.bin + dbgmon.bin + ..\zsdos\zsys_wbw.bin osimg_small.bin || exit /b +:: +:: Split off anything above 32K mark of the hbios. This will be relocated to rom bank 3 +:: + +"%TOOLS%\srecord\srec_cat.exe" hbios_rom.bin -Binary -crop 0x8000 0x10000 -offset -0x8000 -o osimg2.bin -Binary || exit /b + :: :: Inject one byte checksum at the last byte of all 4 ROM bank image files. :: This means that computing a checksum over any of the 32K osimg banks diff --git a/Source/HBIOS/cfg_MASTER.asm b/Source/HBIOS/cfg_MASTER.asm index 45720b91..4a448f39 100644 --- a/Source/HBIOS/cfg_MASTER.asm +++ b/Source/HBIOS/cfg_MASTER.asm @@ -52,6 +52,7 @@ BIOS .EQU BIOS_NONE ; HARDWARE BIOS: BIOS_[WBW|UNA] BATCOND .EQU FALSE ; ENABLE LOW BATTERY WARNING MESSAGE HBIOS_MUTEX .EQU FALSE ; ENABLE REENTRANT CALLS TO HBIOS (ADDS OVERHEAD) USELZSA2 .EQU FALSE ; ENABLE FONT COMPRESSION +FONTS_INLINE .EQU TRUE ; FONT DATA LOCATION: TRUE=IN HBIOS FALSE=IN ROM BANK 3 TICKFREQ .EQU 50 ; DESIRED PERIODIC TIMER INTERRUPT FREQUENCY (HZ) ; BT_REC_TYPE .EQU BT_REC_NONE ; BOOT RECOVERY METHOD TO USE diff --git a/Source/HBIOS/cvdu.asm b/Source/HBIOS/cvdu.asm index 9b4d6f64..92ce2c28 100644 --- a/Source/HBIOS/cvdu.asm +++ b/Source/HBIOS/cvdu.asm @@ -105,7 +105,7 @@ CVDU_INIT1: CALL CVDU_CRTINIT ; SETUP THE CVDU CHIP REGISTERS CALL PRTDEC PRTS("KB$") - CALL CVDU_LOADFONT ; LOAD FONT DATA FROM ROM TO CVDU STRORAGE + CALL CVDU_LOADFONT ; LOAD FONT DATA FROM ROM TO CVDU STORAGE CALL CVDU_VDARES CALL KBD_INIT ; INITIALIZE KEYBOARD DRIVER @@ -439,11 +439,11 @@ CVDU_LOADFONT: 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 + LD HL,CVDU_FONT & $7FFF ; START OF FONT DATA CALL DLZSA2 ; DECOMPRESS TO DE POP HL ; RECALL STACK BUFFER POSITION #ELSE - LD HL,CVDU_FONT ; START OF FONT DATA + LD HL,CVDU_FONT & $7FFF ; START OF FONT DATA #ENDIF LD DE,$2000 ; LENGTH OF FONT DATA diff --git a/Source/HBIOS/eastaegg.asm b/Source/HBIOS/eastaegg.asm index 7d291165..d29c9ed9 100644 --- a/Source/HBIOS/eastaegg.asm +++ b/Source/HBIOS/eastaegg.asm @@ -1,7 +1,7 @@ ; Adapted from https://rosettacode.org/wiki/Mandelbrot_set#Z80_Assembly ; by Phillip Summers difficultylevelhigh@gmail.com ; -; WBWROM SBV V2 Easteregg +; WBWROM Easteregg ; ; Compute a Mandelbrot set on a simple Z80 computer. ; diff --git a/Source/HBIOS/ef.asm b/Source/HBIOS/ef.asm index 63ba2bf4..554c5413 100644 --- a/Source/HBIOS/ef.asm +++ b/Source/HBIOS/ef.asm @@ -48,7 +48,7 @@ EF_NOP .EQU $91 ; EF_IND .EQU $80 ; EF_CLF .EQU $05 ; EF_OCT .EQU $30 ; -EF_OCTAUX .EQU $04 ; AUXILIARY POITER +EF_OCTAUX .EQU $04 ; AUXILIARY POINTER EF_KRF .EQU $00 ; NO AUTOINCREMENT EF_KRL .EQU $50 ; NO AUTOINCREMENT EF_INY .EQU $B0 ; INC Y @@ -383,7 +383,7 @@ EF_LOAD_INDIR: ; D = TARGET REGISTER, E = VALUE TO WRITE RET ; EF_LOAD_MODE: ; LOAD MODE - LD D,EF_TGSREG ; START INDIRECT REGISTER 1 : TGS + LD D,EF_TGSREG ; START INDIRECT REGISTER 1 : TGS LD B,EF_INIT_CNT ; LOAD 5 INDIRECT REGISTERS EF_MODEREG: LD E,(HL) diff --git a/Source/HBIOS/fonts.inc b/Source/HBIOS/fonts.inc new file mode 100644 index 00000000..0ff3c1cc --- /dev/null +++ b/Source/HBIOS/fonts.inc @@ -0,0 +1,70 @@ +; +;================================================================================================== +; FONTS +;================================================================================================== +; +HB_FONTS_BEG .EQU $ +; +ORG_FONTS .EQU $ +; + MEMECHO "FONTS" +; +#IFDEF USEFONT8X8 +FONT8X8: + +; WE NEVER COMPRESS THE 8X8 FONT AS THERE IS NOT ENOUGH SPACE TO DECOMPRESS THEM AT WARM BOOT + + #IF USELZSA2 & FALSE + #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 +; +#IFDEF USEFONTCGA +FONTCGA: + #IF USELZSA2 + #INCLUDE "fontcgac.asm" + #ELSE + #INCLUDE "fontcgau.asm" + #ENDIF + MEMECHO " CGA" +#ENDIF +; +#IFDEF USEFONTVGARC +FONTVGARC: + #IF USELZSA2 + #INCLUDE "fontvgarcc.asm" + #ELSE + #INCLUDE "fontvgarcu.asm" + #ENDIF + MEMECHO " VGARC" +#ENDIF +; +SIZ_FONTS .EQU $ - ORG_FONTS + MEMECHO " occupy " + MEMECHO SIZ_FONTS + MEMECHO " bytes.\n" +; +HB_FONTS_END .EQU $ \ No newline at end of file diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index 6e2dfa99..4d99c50f 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -9398,75 +9398,13 @@ SIZ_EZ80DRVS .EQU $ - ORG_EZ80DRVS HB_DRIVERS_END .EQU $ ; ;================================================================================================== -; FONTS +; IF WE ARE INCLUDING FONTS IN THE HBIOS AREA WE IMPORT THEM HERE ;================================================================================================== ; -HB_FONTS_BEG .EQU $ -; -ORG_FONTS .EQU $ -; - MEMECHO "FONTS" -; -#IFDEF USEFONT8X8 -FONT8X8: -; -; FOR NOW, WE NEVER COMPRESS THE 8X8 FONT. SEE TMS DRIVER. -; - #IF USELZSA2 & FALSE - #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 -; -#IFDEF USEFONTCGA -FONTCGA: - #IF USELZSA2 - #INCLUDE "fontcgac.asm" - #ELSE - #INCLUDE "fontcgau.asm" - #ENDIF - MEMECHO " CGA" +#IF (FONTS_INLINE == TRUE) +#INCLUDE "fonts.inc") #ENDIF ; -#IFDEF USEFONTVGARC -FONTVGARC: - #IF USELZSA2 - #INCLUDE "fontvgarcc.asm" - #ELSE - #INCLUDE "fontvgarcu.asm" - #ENDIF - MEMECHO " VGARC" -#ENDIF -; -SIZ_FONTS .EQU $ - ORG_FONTS - MEMECHO " occupy " - MEMECHO SIZ_FONTS - MEMECHO " bytes.\n" -; -HB_FONTS_END .EQU $ -; ;================================================================================================== ; HBIOS GLOBAL DATA ;================================================================================================== @@ -9687,6 +9625,8 @@ MG014_STATMAPHI: ; HB_DATA_END .EQU $ ; +HB_CRC .DB $00 ; RESERVE ONE BYTE FOR CRC BYTE TO BE PATCHED BY BUILD PROCESS +; HB_END .EQU $ ; SLACK .EQU BNKTOP - $ @@ -9748,5 +9688,26 @@ SLACK .EQU BNKTOP - $ .FILL SLACK #ENDIF #ENDIF +; +; <<< +; <<< 0X8000 STARTS HERE :) +; <<< +; +;================================================================================================== +; RESERVE SPACE FOR CCP CACHE ? +;================================================================================================== +; +; .FILL 2048,0 +; +;================================================================================================== +; IF WE ARE PUTTING FIXED FONTS ROM BANK 3 WE IMPORT THEM HERE AT 0x8000. +; THE BUILD PROCESS SPLITS THEM OUT LATER +;================================================================================================== +; +#IF (FONTS_INLINE == FALSE) +#INCLUDE "fonts.inc") +K64 .EQU -1-$+1 + .FILL K64,0 +#ENDIF ; .END diff --git a/Source/HBIOS/tms.asm b/Source/HBIOS/tms.asm index 6633f696..4941080d 100644 --- a/Source/HBIOS/tms.asm +++ b/Source/HBIOS/tms.asm @@ -757,55 +757,89 @@ TMS_CLEAR: ; LOAD FONT DATA ;---------------------------------------------------------------------- ; +; THE 8X8 FONT DATA USED BY THE TMS DRIVER IS UNCOMPRESSED +; WE COPY IT DIRECTLY FROM ITS LOCATION IN THE HBIOS OR ROM BANK 3 +; TO THE TMS BOARD MEMORY +; TMS_LOADFONT: ; SET WRITE ADDRESS TO TMS_FNTVADDR LD HL,TMS_FNTVADDR CALL TMS_WR ; -; THE USE OF COMPRESSED FONT STORAGE FOR THE TMS DRIVER IS DISABLED -; SO THAT WE CAN RELOAD THE FONT DATA ON USER RESET. THE TMS CHIP -; IS FREQUENTLY REPROGRAMMED BY GAMES, ETC., SO IT IS NECESSARY TO -; REINIT AND RELOAD FONTS. RELOADING A COMPRESSED FONT AFTER -; 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 -; - ; FILL TMS_FNTVADDR BYTES FROM FONTDATA + LD HL,TMS_FONT & $7FFF ; START OF FONT DATA LD DE,TMS_FNTSIZE TMS_LOADFONT1: - LD A,(HL) +#IF (FONTS_INLINE == TRUE) + LD A,(HL) ; READ FONT DATA FROM HBIOS +#ELSE + push de + ld d,BID_IMG2 + call HBX_PEEK ; READ FONT DATA FROM ROM BANK 3 + ld a,e + pop de +#ENDIF + CALL PRTHEXBYTE EZ80_IO - OUT (TMS_DATREG),A + OUT (TMS_DATREG),A ; WRITE TO THE TMS BOARD MEMORY 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 RET -#ENDIF +; +; +; +;TMS_LOADFONT: +; ; SET WRITE ADDRESS TO TMS_FNTVADDR +; LD HL,TMS_FNTVADDR +; CALL TMS_WR +; +; THE USE OF COMPRESSED FONT STORAGE FOR THE TMS DRIVER IS DISABLED +; SO THAT WE CAN RELOAD THE FONT DATA ON USER RESET. THE TMS CHIP +; IS FREQUENTLY REPROGRAMMED BY GAMES, ETC., SO IT IS NECESSARY TO +; REINIT AND RELOAD FONTS. RELOADING A COMPRESSED FONT AFTER +; 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 & $7FFF ; START OF FONT DATA +; CALL DLZSA2 ; DECOMPRESS TO DE +; POP HL ; RECALL STACK BUFFER POSITION +;#ELSE +; LD HL,TMS_FONT & $7FFF ; START OF FONT DATA +;#ENDIF +; +; ; FILL TMS_FNTVADDR BYTES FROM FONTDATA +; LD DE,TMS_FNTSIZE +;TMS_LOADFONT1: +; LD A,(HL) +; 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 +; RET +;#ENDIF ; ;---------------------------------------------------------------------- ; VIRTUAL CURSOR MANAGEMENT diff --git a/Source/HBIOS/unlzsa2s.asm b/Source/HBIOS/unlzsa2s.asm index 7fbc74fb..75617a9e 100644 --- a/Source/HBIOS/unlzsa2s.asm +++ b/Source/HBIOS/unlzsa2s.asm @@ -12,6 +12,7 @@ ; ver.06 by spke (11-12/04/2021, added some comments) ; ver.07 by spke (04-05/04/2022, 134(-5) bytes, +1% speed, using self-modifying code by default) ; ver.071 by PSummers (6/1/2023), ROMWBW version. +; ver.072 by PSummers (2/1/2025), ROMWBW version support decompress from another bank. ; ; The data must be compressed using the command line compressor by Emmanuel Marty ; The compression is done as follows: @@ -71,8 +72,17 @@ #DEFINE ADD_OFFSET \ #DEFCONT \ add hl,de - #DEFINE BLOCKCOPY \ - #DEFCONT \ ldir + #IF (FONTS_INLINE == TRUE) + #DEFINE BLOCKCOPY ldir + #DEFINE GETHLA ld a,(hl) + #DEFINE GETHLB ld b,(hl) + #DEFINE GETHLC ld c,(hl) + #ELSE + #DEFINE BLOCKCOPY call BLKCOPY + #DEFINE GETHLA call READSRCHLA + #DEFINE GETHLB call READSRCHLB + #DEFINE GETHLC call READSRCHLC + #ENDIF #ELSE #DEFINE NEXT_HL \ #DEFCONT \ dec hl @@ -86,6 +96,7 @@ #ENDIF DLZSA2: + ; in many places we assume that B = 0 ; flag P in A' signals the need to re-load the nibble store xor a \ ld b,a \ ex af,af' \ jr ReadToken @@ -106,7 +117,7 @@ CASE01x: ; token "01Z" stands for 9-bit offsets cp %01100000 doRLB rl b -OffsetReadC: ld c,(hl) \ NEXT_HL +OffsetReadC: GETHLC \ NEXT_HL #IFNDEF AVOID_SELFMODIFYING_CODE SaveOffset: ld (PrevOffset),bc \ ld b,0 @@ -129,7 +140,7 @@ PrevOffset .EQU $+1 \ ld hl,0 BLOCKCOPY ; BC = 0, DE = dest pop hl ; HL = src -ReadToken: ld a,(hl) \ NEXT_HL \ push af +ReadToken: GETHLA \ NEXT_HL \ push af and %00011000 \ jr z,NoLiterals rrca \ rrca \ rrca @@ -147,7 +158,7 @@ CASE1xx cp %11000000 \ jr c,CASE10x CASE110: ; token "110" stands for 16-bit offset ; (read a byte for offset bits 8-15, then another byte for offset bits 0-7) - ld b,(hl) \ NEXT_HL \ jr OffsetReadC + GETHLB \ NEXT_HL \ jr OffsetReadC CASE10x: ; token "10Z" stands for 13-bit offsets ; (read a nibble for offset bits 9-12 and use the inverted bit Z @@ -160,19 +171,69 @@ CASE10x: ; token "10Z" stands for 13-bit offsets ExtendedCode: call ReadNibble \ inc a \ jr z,ExtraByte sub $F0+1 \ add a,c \ ret -ExtraByte ld a,15 \ add a,c \ add a,(hl) \ NEXT_HL \ ret nc - ld a,(hl) \ NEXT_HL - ld b,(hl) \ NEXT_HL \ ret nz +ExtraByte GETHLA \ add a,15 \ add a,c \ NEXT_HL \ ret nc + GETHLA \ NEXT_HL + GETHLB \ NEXT_HL \ ret nz pop bc ; RET is not needed, because RET from ReadNibble is sufficient ReadNibble: ld c,a skipLDCA xor a \ nop \ ex af,af' \ ret m ; NOP for Z280 bug - ld a,(hl) \ or $F0 \ ex af,af' - ld a,(hl) \ NEXT_HL \ or $0F + GETHLA \ or $F0 \ ex af,af' + GETHLA \ NEXT_HL \ or $0F rrca \ rrca \ rrca \ rrca \ ret ; The extraneous NOP instruction above is to workaround a bug in the ; Z280 processor where ex af,af' can copy rather than swap the flags ; register. ; See https://www.retrobrewcomputers.org/forum/index.php?t=msg&goto=10183& + +#IF (FONTS_INLINE == FALSE) +; +; +; READ A SOURCE BYTE FROM ANOTHER BANK +; SOURCE ADDRESS IN HL AND BANK IN D, VALUE RETURNED IN A, B or C +; +READSRCHLA: + push de + push af + ld d,BID_IMG2 + call HBX_PEEK + pop af + ld a,e + pop de + ret +; +READSRCHLB: + push de + push af + ld d,BID_IMG2 + call HBX_PEEK + pop af + ld b,e + pop de + ret +; +READSRCHLC: + push de + push af + ld d,BID_IMG2 + call HBX_PEEK + pop af + ld c,e + pop de + ret +; +BLKCOPY:push af +BLKCOPY_lp: + call READSRCHLA + ld (de),a + inc hl + inc de + dec bc + ld a,b + or c + jr nz,BLKCOPY_lp + pop af + ret +#ENDIF diff --git a/Source/HBIOS/vga.asm b/Source/HBIOS/vga.asm index 171b32c2..607283e6 100644 --- a/Source/HBIOS/vga.asm +++ b/Source/HBIOS/vga.asm @@ -544,8 +544,20 @@ VGA_CRTCDUMP1: ; ;---------------------------------------------------------------------- ; LOAD FONT DATA +; +; IF V80X60 MODE IS USED THEN THE 8*8 UNCOMPRESSED FONT IS ALWAYS USED. +; THE FONT DATA MAY BE STORED IN THE HBIOS AREA OR ROM BANK 3 (BID_IMG2) +; EXCEPT FOR THE 8X8 FONT, DATA MAY BE COMPRESSED OR UNCOMPRESSED. ;---------------------------------------------------------------------- - +; +; IF FONTS ARE STORED INLINE IN HBIOS: +; IF 8x8 - NO COMPRESSION SO PROGRAM STRAIGHT FROM HBIOS +; IF UNCOMPRESSED - PROGRAM STRAIGHT FROM HBIOS +; IF COMPRESSED - DECOMPRESS FIRST +; IF FONTS ARE STORED IN BANK3 +; IF 8x8 - NO COMPRESSION - SO PROGRAM FROM BANK3 USING PEEK +; IF UNCOMPRESSED - PROGRAM FROM BANK3 USING PEEK +; IF COMPRESSED - DECOMPRESS FIRST ; VGA_LOADFONT: LD HL,$7000 | VGA_89BIT ; CLEAR FONT PAGE NUM @@ -560,18 +572,32 @@ VGA_LOADFONT: 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 + LD HL,VGA_FONT & $7FFF ; START OF FONT DATA CALL DLZSA2 ; DECOMPRESS TO DE POP HL ; RECALL STACK BUFFER POSITION #ELSE - LD HL,VGA_FONT ; START OF FONT DATA + LD HL,VGA_FONT & $7FFF ; START OF FONT DATA #ENDIF - +; +; AT THIS POINT HL POINTS TO UNCOMPRESSED FONT DATA +; THIS DATA MAY BE IN THE HBIOS AREA, IN THE STACK BUFFER +; OR IN BANK 3 +; 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 + +#IF ((USELZSA2 == FALSE) & (FONTS_INLINE == FALSE)) + PUSH DE + LD D,BID_IMG2 + CALL HBX_PEEK ; GET NEXT BYTE FROM ROM BANK 3 + LD A,E + POP DE +#ELSE + LD A,(HL) ; GET NEXT BYTE FROM HBIOS OR STACK BUFFER +#ENDIF +; CALL PRTHEXBYTE CALL VGA_MEMWR ; MEM(DE) := A INC HL ; NEXT FONT BYTE INC DE ; NEXT MEM BYTE diff --git a/Source/HBIOS/vrc.asm b/Source/HBIOS/vrc.asm index 98b12a59..5c5a580e 100644 --- a/Source/HBIOS/vrc.asm +++ b/Source/HBIOS/vrc.asm @@ -283,11 +283,11 @@ VRC_LOADFONT: 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 + LD HL,VRC_FONT & $7FFF ; START OF FONT DATA CALL DLZSA2 ; DECOMPRESS TO DE POP HL ; RECALL STACK BUFFER POSITION #ELSE - LD HL,VRC_FONT ; START OF FONT DATA + LD HL,VRC_FONT & $7FFF ; START OF FONT DATA #ENDIF ; #IF 0