EGA/VGA fonts

 BBS: Inland Empire Archive
Date: 05-08-92 (22:18)             Number: 200
From: MIKE KELLY                   Refer#: NONE
  To: SCOTT WUNSCH                  Recvd: NO  
Subj: EGA/VGA fonts                  Conf: (2) Quik_Bas
In a message of <May 06 08:31>, Scott Wunsch (1:140/23) writes:
 >  Could anybody post some code to change the screen font on an
 >EGA/VGA?
 >                        -= Scott \\'unsch =-

Try this, which is a somewhat simplified version of what I
use for my Russian/English programs:
-------------------
' Load with /L command line option
TYPE regtypeX
  ax    AS INTEGER
  bx    AS INTEGER
  cx    AS INTEGER
  dx    AS INTEGER
  bp    AS INTEGER
  si    AS INTEGER
  di    AS INTEGER
  flags AS INTEGER
  ds    AS INTEGER
  es    AS INTEGER
END TYPE

DECLARE SUB InterruptX (a AS INTEGER, b AS regtypeX, c AS regtypeX)
DECLARE SUB LoadFont (DisplayType$, font$)
DECLARE SUB ReSetFont (DisplayType$)

DisplayType$ = "VGA"
font$ = "e:\fonts\medvl-16.fnt"
LoadFont DisplayType$, font$
FOR x% = 8 TO 255
  PRINT CHR$(x%); " ";
NEXT
q$ = INPUT$(1)
ReSetFont DisplayType$

SUB LoadFont (DisplayType$, font$)
  SELECT CASE DisplayType$
    CASE "EGA"
      CharBytes% = &HE00
    CASE "VGA", "MCGA"
      CharBytes% = &H1100           ' BH = Number of bytes/character
                                    ' BL = Block to load in map 2
  END SELECT
  DIM reg AS regtypeX               ' Standard DIM
  font1% = FREEFILE                 ' No duplicate problems!
  OPEN font$ FOR BINARY AS #font1%  ' Open font file for easy access
  total% = LOF(1)                   ' Total file size
  t$ = STRING$(total%, 0)           ' Define as string for the font
  GET #1, , t$                      ' Get the font
  CLOSE #font1%                     ' Close the file
  reg.ax = &H1100                   ' AH = &H11
                                    ' AL = 0 - load user font
  reg.cx = &HFF                     ' Number of chars to load (256)
  reg.bx = CharBytes%
  reg.dx = &H0                      ' DX = Offset into map 2 block (0)
  reg.es = VARSEG(t$)               ' Pointer to user table
  reg.bp = SADD(t$)                 ' Pointer to user table
  InterruptX &H10, reg, reg         ' CALL Interrupt 10
  reg.ax = &H1103                   ' AH = &H11
                                    ' AL = 3- Set block specifier
  reg.bx = 0                        ' BL = Block to load
  InterruptX &H10, reg, reg         ' CALL Interrupt 10
  t$ = ""                           ' Free up some memory
END SUB

SUB ReSetFont (DisplayType$)
  SELECT CASE DisplayType$
    CASE "EGA"
      ROMfont% = 1                  ' 8x14 ROM font
    CASE "VGA", "MCGA"
      ROMfont% = 4                  ' 8x16 ROM font
  END SELECT
  DIM reg AS regtypeX               ' Standard DIM
  reg.ax = &H1100 + ROMfont%        ' AH = &H11, AL = ROM font to load
  reg.bx = &H0                      ' BL = Block to load
  InterruptX &H10, reg, reg         ' CALL Interrupt 10
END SUB
--------------
Check the "Interrupt List" for variations of loading/resetting the fonts.

Note: the "standard" Cyrillic font (code page 866
[WordimPerfect calls it 899 for reasons that I've yet to
discover] is all high bit, so I only load chars 128-254,
and modify reg.cx & reg.dx to reflect that.

Mike



--- QM v1.00
 * Origin: Russian House, Portland, OR, USA (1:105/23.48)
Outer Court
Echo Basic Postings

Books at Amazon:

Back to BASIC: The History, Corruption, and Future of the Language

Hackers: Heroes of the Computer Revolution (including Tiny BASIC)

Go to: The Story of the Math Majors, Bridge Players, Engineers, Chess Wizards, Scientists and Iconoclasts who were the Hero Programmers of the Software Revolution

The Advent of the Algorithm: The Idea that Rules the World

Moths in the Machine: The Power and Perils of Programming

Mastering Visual Basic .NET