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

    {
    After several tricks to redefine Characters in EGA and VGA in this echo,
    here is one you can use in CGA mode 4,5,6. You will find an Unit, and a
    test Program.
    }

    Unit graftabl;

    {
    released into the public domain
    author : Emmanuel ROUSSIN
    FIDO   : 2:320/200.21
    Email  : roussin@frmug.fr.mugnet.org

    for using redefined Characters (128 to 255)
    in CGA mode 4,5 and 6 Without using GRAFTABL.EXE
    }

    Interface

    Type
      Tcaractere8 = Array [1..8] of Byte;
      Tgraftabl = Array [128..255] of Tcaractere8;

    {
    if you want to use only one font, define it in this Unit, For example :

    Const
      the_only_font : Tgraftabl = (
                                  (x,x,x,x,x,x,x,x),
                                  .
                                  .
                                  (x,x,x,x,x,x,x,x),
                                  (x,x,x,x,x,x,x,x)
                                  );

    Or you can in your main Program :

    Var
      my_font : Tgraftabl;

    and define it after
    }

    Var
      seg_graftabl,
      ofs_graftabl : Word;

    {internal Procedures}

    Procedure get_graftabl(Var segment, offset : Word);
    Procedure put_graftabl(segment, offset : Word);

    {Procedures to use in your Programs}

    Procedure init_graftabl;
    Procedure use_graftabl(Var aray : Tgraftabl);
    Procedure end_graftabl;

    Implementation

    Procedure get_graftabl(Var segment, offset : Word);
    begin
      segment := memw[0 : $1F * 4 + 2];
      offset  := memw[0 : $1f * 4];
    end;

    Procedure put_graftabl(segment, offset : Word);
    begin
      memw[0 : $1f * 4 + 2] := segment;
      memw[0 : $1f * 4] := offset
    end;

    Procedure init_graftabl;
    { interrupt 1F is a Pointer to bitmaps For high 128 Chars (8 Bytes per
      Character) defined by GRAFTABL.EXE we save this initial Pointer }
    begin
      get_graftabl(seg_graftabl, ofs_graftabl);
    end;

    Procedure use_graftabl(Var aray : Tgraftabl);
    { we define a new Pointer : the address of an Array }
    begin
      put_graftabl(seg(aray),ofs(aray));
    end;

    Procedure end_graftabl;
    { we restore the original Pointer }
    begin
      put_graftabl(seg_graftabl,ofs_graftabl);
    end;

    end.

    Program test;

    Uses
      Graph3, Crt, graftabl;

    Var
      font    : Tgraftabl;
      i,j,tmp : Byte;
      rid     : Char;

    begin
      hires;
      init_graftabl;
      fillChar(font,sizeof(font),0);
      use_graftabl(font);

      {$F000:$FA6E is the ROM address where the Characters 0 to 127 are defined}

      For i := 1 to 26 do
        For j := 0 to 7 do
        begin
          tmp := mem[$F000 : $FA6E + 97 * 8 + (i - 1) * 8 + j] xor $FF;
          tmp := tmp xor $FF;
          tmp := tmp or (tmp div 2);
          font[i + 127, j + 1] := tmp;
          { Char 128 to 153 are redefined }
        end;

      For i := 1 to 26 do
        For j := 0 to 7 do
        begin
          tmp := mem[$F000 : $FA6E + 97 * 8 + (i - 1) * 8 + j] or $55;
          font[i + 153, j + 1 ] := tmp;
          { Char 154 to 181 are redefined }
        end;

      Writeln('the normal Characters ($61 to $7A) :');
      Writeln;
      For i := $61 to $7A do
        Write(chr(i));
      Writeln; Writeln;
      Writeln('now, these same Characters, but thick :');
      Writeln;
      For i := 128 to 153 do
        Write(chr(i));
      Writeln; Writeln;
      Writeln('the same Characters, but greyed :');
      Writeln;
      For i := 154 to 181 do
        Write(chr(i));
      rid := ReadKey;
      end_graftabl;
      Textmode(co80);
    end.

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