[Back to EGAVGA SWAG index] [Back to Main SWAG index] [Original]
{===========================================================================
Date: 10-09-93 (10:40)
From: WIM VAN DER VEGT
Subj: textmodes w/43/50 lines
---------------------------------------------------------------------------
Here the uncodes sources of some routines I've written to replace
turbo's internal textmode routines to enable 43 & 50 lines textmodes on
VGA. They use the BIOS and can be combined with normal read/write
statements. Just use the unit and call one of the Vgaxxlines routines.
{---------------------------------------------------------}
{  Project : Vga Textmode Support                         }
{  By      : G.W. van der Vegt                            }
{---------------------------------------------------------}
{  Date  .time  Revision                                  }
{  931003.2200  Creatie.                                  }
{---------------------------------------------------------}
Unit Vts_01;
Interface
Function  MaxX : Byte;
Function  MaxY : Byte;
Function  WhereX : Byte;
Function  WhereY : Byte;
Procedure GotoXY(x,y : Byte);
Function  GetXY(x,y : Byte) : Char;
Procedure vga50lines;
Procedure vga43lines;
Procedure vga25lines;
{---------------------------------------------------------}
Implementation
Uses
  Dos;
{---------------------------------------------------------}
Function MaxX : Byte;
{----Return horizontal size of textmode in characters}
Var
  r      : Registers;
Begin
  r.ah:=$0F;
  Intr($10,r);
  MaxX:=r.AH;
End; {of MaxX}
{---------------------------------------------------------}
Function MaxY : Byte;
{----Return vertical size of textmode in characters}
Var
  r      : Registers;
  buf    : Array[0..63] Of byte;
Begin
  r.ah:=$1B;
  r.bx:=$00;
  r.es:=Seg(buf);
  r.di:=Ofs(buf);
  Intr($10,r);
  MaxY:=buf[$22];
End; {of MaxY}
{---------------------------------------------------------}
Function WhereX : Byte;
{----WhereX, aware of textmodes larger than 80x25}
Var
  r : registers;
Begin
  r.ah:=$0f;
  Intr($10,r);
  r.ah:=$03;
  Intr($10,r);
  WhereX:=r.dl;
End; {of WhereX}
{---------------------------------------------------------}
Function WhereY : Byte;
{----WhereY, aware of textmodes larger than 80x25}
Var
  r : registers;
Begin
  r.ah:=$0f;
  Intr($10,r);
  r.ah:=$03;
  Intr($10,r);
  WhereY:=r.dh;
End; {of WhereY}
{---------------------------------------------------------}
Procedure GotoXY(x,y : Byte);
{----GotoXY, aware of textmodes larger than 80x25}
Var
  r : registers;
Begin
  r.ah:=$0f;
  Intr($10,r);
  r.ah:=$02;
  r.dh:=y;
  r.dl:=x;
  Intr($10,r);
End; {of GotoXY}
{---------------------------------------------------------}
Function GetXY(x,y : Byte) : Char;
{----GetXY, returns char at x,y and is aware of textmodes larger than 80x25}
{           leave cursor unchanged.                                        }
Var
  r     : registers;
  xs,ys : Byte;
Begin
  xs:=WhereX;
  ys:=WhereY;
  GotoXY(x,y);
  r.ah:=$0f;
  Intr($10,r);
  r.ah:=$08;
  Intr($10,r);
  GetXY:=Chr(r.al);
  GotoXY(xs,ys);
End; {of GotoXY}
{---------------------------------------------------------}
Procedure vga50lines;
{----Put VGA display into 80x50 textmode}
Var
  r : registers;
  b : Byte;
Begin
{----50 line mode}
  b:=Mem[$40:$87];
  Mem[$40:$87]:=Mem[$40:$87] OR $01;
  r.ah:=$11;
  r.al:=$12; {----8x8 Character set}
  r.bl:=$00;
  Intr($10,r);
  Mem[$40:$87]:=b;
{----400 scan lines neccesary}
  r.ah:=$12;
  r.al:=$02; {----400}
  r.bl:=$30;
  Intr($10,r);
End; {of Vga50lines}
{---------------------------------------------------------}
Procedure vga43lines;
{----Put VGA display into 80x43 (EGA) textmode}
Var
  r : registers;
  b : Byte;
Begin
{----43 line mode}
  b:=Mem[$40:$87];
  Mem[$40:$87]:=Mem[$40:$87] OR $01;
  r.ah:=$11;
  r.al:=$12; {----8x8 Character set}
  r.bl:=$00;
  Intr($10,r);
  Mem[$40:$87]:=b;
{----350 scan lines neccesary}
  r.ah:=$12;
  r.al:=$01; {----350}
  r.bl:=$30;
  Intr($10,r);
End; {of Vga43lines}
{---------------------------------------------------------}
Procedure vga25lines;
{----Put VGA display into 80x25 textmode}
Var
  r : registers;
  b : Byte;
Begin
{----25 line mode}
  b:=Mem[$40:$87];
  Mem[$40:$87]:=Mem[$40:$87] OR $01;
  r.ah:=$11;
  r.al:=$11; {----8x14 Character set}
  r.bl:=$00;
  Intr($10,r);
  Mem[$40:$87]:=b;
{----400 scan lines neccesary}
  r.ah:=$12;
  r.al:=$02; {----400}
  r.bl:=$30;
  Intr($10,r);
End; {of Vga25lines}
End.
[Back to EGAVGA SWAG index] [Back to Main SWAG index] [Original]