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

    {
    >so it appears nothing happened).  I have seen some Programs that are
    >able to save the Dos font into a buffer in the Program and then just
    >set the video card back to that font when the Program quits.  The problem
    >is, I have not seen any documented Dos interrupt that will allow me to
    >do this.
    >  I'm wondering if anyone knows of such an interrupt that I can use to
    >  get the current VGA font and save it to a buffer.
    >  Any help would be greatly appreciated!

       Interrupt $10 is what you're looking For. Function $11,
       subFunction $30 gets the Character generator info.
       Function $11, subFunction $10 loads user fonts. Function $11 can
       also be used to Reset to one of the hardware fonts (subFunction
       $11 Resets to ROM 8x14, $12 Resets to ROM 8x8, $14 Resets to VGA
       ROM 8x16)

       The structure Types are as follows:
    }
    Type

      { enumerated font Type }
      ROMfont = (ROM8x14, ROM8x8, ROM8x16);

      { Character definition table }
      CharDefTable = Array[0..4096] of Byte;
      CharDefPtr   = ^CharDefTable;

      { Text Character generator table }
      Char_Table = Record
         Points :Byte;
         Def    :CharDefPtr;
      end;

      { font Format }
      FontPackage = Record
         FontInfo :Char_Table;
         Ch       :CharDefTable;
      end;
      FontPkgPtr = ^FontPackage;

    { Here are some handy Procedures to use those Types: }

    Procedure GetCharGenInfo(font: ROMfont; Var Table:Char_Table);
    begin
      if is_EGA then
      begin
        Reg.AH := $11;
        Reg.AL := $30;
        Case font of
          ROM8x8 : Reg.BH := 3;
          ROM8x14: Reg.BH := 2;
          ROM8x16: Reg.BH := 6;
        end;
        Intr($10, Reg);
        Table.Def := Ptr(Reg.ES, Reg.BP);
        Case font of
          ROM8x8 : Table.Points := 8;
          ROM8x14: Table.Points := 14;
          ROM8x16: Table.Points := 16;
        end;
      end;
    end;

    Procedure SetHardwareFont(Var font :ROMfont);
    begin
      if is_EGA then
      begin
        Reg,AH := $11;
        Case font of
          ROM8x14 : Reg.AL := $11;
          ROM8x8  : Reg.AL := $12;
          ROM8x16 :
            if is_VGA then
               Reg.AL := $14 { 8x16 on VGA only }
            else
            begin
               Reg.AL := $12;
               font := ROM8x14;
            end;
        end;
        Reg.BL := 0;
        Intr($10, Reg);
      end;
    end;

    Function FetchHardwareFont(font :ROMfont):FontPkgPtr;
    Var
      pkg :FontPkgPtr;
    begin
      New(pkg);
      GetCharGenInfo(font, Pkg^.FontInfo);
      Pkg^.Ch := Pkg^.FontInfo.Def^;
      FetchHardwareFont := Pkg;
    end;

    Procedure LoadUserFont(pkg :FontPkgPtr);
    begin
      Reg.AH := $11;
      Reg.AL := $10;
      Reg.ES := Seg(pkg^.ch);
      Reg.BP := Ofs(pkg^.ch);
      Reg.BH := Pkg^.FontInfo.Points;
      Reg.BL := 0;
      Reg.CX := 256;
      Reg.DX := 0;
      Intr($10, Reg);
    end;

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