diff --git a/Source/HBIOS/cvdu.asm b/Source/HBIOS/cvdu.asm index 2b5b6298..b432515f 100644 --- a/Source/HBIOS/cvdu.asm +++ b/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 diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index d5781f95..e3388618 100644 --- a/Source/HBIOS/hbios.asm +++ b/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 " diff --git a/Source/HBIOS/tms.asm b/Source/HBIOS/tms.asm index 679bddf1..eb6dee54 100644 --- a/Source/HBIOS/tms.asm +++ b/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 diff --git a/Source/HBIOS/vga.asm b/Source/HBIOS/vga.asm index 563df03d..df4a8d96 100644 --- a/Source/HBIOS/vga.asm +++ b/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 diff --git a/Source/HBIOS/vrc.asm b/Source/HBIOS/vrc.asm index c87051c6..fd5eeab8 100644 --- a/Source/HBIOS/vrc.asm +++ b/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