[Back to EGAVGA SWAG index]  [Back to Main SWAG index]  [Original]

===========================================================================
 BBS: Canada Remote Systems
Date: 07-02-93 (14:00)             Number: 29054
From: SEAN PALMER                  Refer#: NONE
  To: FRANCIS BURIANEK              Recvd: NO  
Subj: DOS FONT                       Conf: (1221) F-PASCAL
---------------------------------------------------------------------------
FB>Would You know, where the Video Bios Fonts are located at? (address),
FB>or a way to access using an interrupt?

I pulled this off the echo a while back...

Type
  FontBlock    = 0..7;
  CharSetType  = (INT1F, INT43, ROM8x14, ROM8x8lo, ROM8x8hi, ROM9x14,
                 ROM8x16, ROM9x16);

{ Get a pointer to one of the eight resident VGA fonts }

Function GetFontPtr(charset : CharSetType) : Pointer; Assembler;ASM
        MOV    BH, charset
        MOV    AX,$1130
        INT    $10
        MOV    DX, ES
        XCHG   AX, BP
end;

{ Get font block index of current (resident) and alternate character set.
  Up to two fonts can be active at the same time }

Procedure GetFontBlock(Var primary, secondary : FontBlock); Assembler;ASM
  { Get character map select register:
    (VGA sequencer port 3C4h/3C5h index 3)

    7  6  5  4  3  2  1  0
          |  |  |  |  |  |
          |  |  |  |  +--+--   Primary font   (lower 2 bits)
          |  |  +--+--------   Secondary font (lower 2 bits)
          |  +--------------   Primary font   (high bit)
          +-----------------   Secondary font (high bit)     }

        MOV     AL, 3
        MOV     DX,$3C4
        OUT     DX, AL
        INC     DX
        IN      AL, DX
        MOV     BL, AL
        PUSH    AX
  { Get secondary font number: add up bits 5, 3 and 2 }
        SHR     AL, 1
        SHR     AL, 1
        AND     AL, 3
        TEST    BL,$20
        JZ      @1
        ADD     AL, 4
@1:     LES     DI, secondary
        STOSB
  { Get primary font number: add up bits 4, 1 and 0 }
        POP     AX
        AND     AL, 3
        TEST    BL,$10
        JZ      @2
        ADD     AL, 4
@2:     LES     DI, primary
        STOSB
end;

{ Store the font block index }

Procedure SetFontBlock(primary, secondary : FontBlock); Assembler;
Const
  MapPrimTable : Array[0..7] of Byte = ($00, $01, $02, $03,$10, $11, $12, $13);
  MapSecTable  : Array[0..7] of Byte = ($00, $04, $08, $0C,$20, $24, $28, $2C);
ASM
        MOV     AL, primary
        LEA     BX, MapPrimTable
        XLAT
        MOV     AH, AL
        MOV     AL, secondary
        LEA     BX, MapSecTable
        XLAT
        ADD     AL, AH
        MOV     BL, AL
{ Set block specifier }
        MOV     AX,$1103
        INT     $10
end;


 * OLX 2.2 * If at first you succeed, hide your astonishment...

--- Maximus 2.01wb
 * Origin: >>> Sun Mountain BBS <<< (303)-665-6922 (1:104/123)

[Back to EGAVGA SWAG index]  [Back to Main SWAG index]  [Original]