[Back to SCREEN SWAG index] [Back to Main SWAG index] [Original]
unit scrn;
{$D-,I-,S-,V-}
interface
Uses
Dos;
Const
display : Boolean = true;
FGround : Byte = 0;
BGround : Byte = 0;
attribute : Byte = 0;
apage : Word = $B800;
apoint : Word = 0;
{ foreground and background colors }
Black = 0;
Blue = 1;
Green = 2;
Cyan = 3;
Red = 4;
Magenta = 5;
Brown = 6;
LightGray = 7;
{ foreground colors }
DarkGray = 8;
LightBlue = 9;
LightGreen = 10;
LightCyan = 11;
LightRed = 12;
LightMagenta = 13;
Yellow = 14;
White = 15;
{ add for blinking characters }
Blink = 128;
VAR
regs : Registers;
Function GetMode : Byte;
{returns the current video mode}
Procedure SetMode (m : Byte);
{sets the video mode}
Procedure Scroll (ur, lc, lr, rc : Byte; nbr : ShortInt);
{scrolls the window up (nbr is +) or down (nbr is -)}
{If nbr is 0 or out of range then the screen clears}
{ur is the upper row, lc is the left column,
lr is the lower row, and rc is the right column}
{Note: using an out-of-range number may have unpredictable
results on the colors...it is not recommended}
Procedure SetCursor (s, e : Byte);
{sets the size of the cursor}
{s is the starting line, e is the ending line}
Procedure SetAPage (page : Word);
{Set the Active (drawing) page}
Procedure SetVPage (vpage : Byte);
{Set the display page}
Function DisplayCursor (display1 : Boolean) : Boolean;
{hides or displays the cursor}
Function Xis : Byte;
{Tells you what the X coordinate is for the current active page}
Function Yis : Byte;
{Tells you what the Y coordinate is for the current active page}
Procedure PXY (x, y : Byte);
{sets the coordinates on the current active page}
{To move the cursor on the visual page, first make the visual page
and active page the same}
{x is the row, y is the column}
Procedure SetFGround (FG : Byte);
{sets the foreground color}
{constants can be used}
{add 128 or the constant BLINK to make the foreground blink}
Procedure SetBGround (BG : Byte);
{sets the background color}
{constants can be used}
Procedure PWrite (S : String);
{writes a string to the current active page}
{numbers must be converted to a string before calling this procedure}
Procedure PWriteln (S : String);
Procedure ClrScrn;
{Clear the current active page}
implementation
Function GetMode : Byte;
{returns the current video mode}
Begin
regs.ah := $0F;
Intr($10,regs);
GetMode := regs.al;
End;
Procedure SetMode (m : Byte);
{sets the video mode}
Begin
regs.ah := 0;
regs.al := m;
Intr($10,regs);
End;
Procedure Scroll (ur, lc, lr, rc : Byte; nbr : ShortInt);
{scrolls the window up (nbr is +) or down (nbr is -)}
{If nbr is 0 or out of range then the screen clears}
Begin
Dec(ur);
Dec(lc);
Dec(lr);
Dec(rc);
If nbr < 0 Then regs.ah := 7 Else regs.ah := 6;
regs.al := Abs(nbr);
regs.bh := attribute;
regs.ch := ur;
regs.cl := lc;
regs.dh := lr;
regs.dl := rc;
Intr($10,regs);
End;
Procedure SetCursor (s, e : Byte);
Begin
regs.ah := 1;
regs.ch := s;
regs.cl := e;
Intr($10,regs);
End;
Procedure SetAPage (page : Word);
Begin
apage := $B800 + (page * $100);
End;
Procedure SetVPage (vpage : Byte);
Begin
regs.ah := 5;
regs.al := vpage;
Intr($10,regs);
End;
Function DisplayCursor(display1 : Boolean) : Boolean;
Begin
If Not(display1) Then Begin
regs.dh := 50;
regs.dl := 0;
End
Else regs.dx := apoint;
regs.ah := 2;
regs.bh := (apage - $B800) DIV $100;
Intr($10,regs);
display := display1;
End;
Function Xis : Byte;
Var cpage : Word;
Begin
cpage := (apage - $B800) DIV $100;
Xis := (Mem[$40:$51+(cpage * 2)]) + 1;
End;
Function Yis : Byte;
Var cpage : Word;
Begin
cpage := (apage - $B800) DIV $100;
Yis := (Mem[$40:$50+(cpage * 2)]) + 1;
End;
Procedure PXY (x, y : Byte);
Begin
Dec(x);
Dec(y);
regs.dh := x;
regs.dl := y;
regs.ah := 2;
regs.bh := (apage - $B800) DIV $100;
Intr($10,regs);
If Not(display) Then Begin
regs.dh := 50;
regs.dl := 0;
regs.ah := 2;
regs.bh := (apage - $B800) DIV $100;
Intr($10,regs);
End;
apoint := x * 80 * 2 + y * 2;
End;
Procedure SetFGround (FG : Byte);
Begin
FGround := FG;
attribute := BGround * 16 + FGround;
End;
Procedure SetBGround (BG : Byte);
Begin
BGround := BG;
attribute := BGround * 16 + FGround;
End;
Procedure PWrite (S : String);
Var
Len, x, y : Byte;
tmp : Word;
Begin
If Length(S) = 0 Then Exit;
tmp := apoint;
For Len := 0 To Length(S) - 1 Do Begin
Mem[apage:apoint+Len] := Ord(S[Len+1]);
Inc(apoint);
Mem[apage:apoint+Len] := attribute;
End;
apoint := (tmp + Length(S) * 2) DIV 2;
y := apoint MOD 80;
x := apoint DIV 80;
Inc(x);
Inc(y);
PXY(x,y);
If Not(display) Then Begin
regs.dh := 50;
regs.dl := 0;
regs.ah := 2;
regs.bh := (apage - $B800) DIV $100;
Intr($10,regs);
End;
End;
Procedure PWriteln (S : String);
Var
Len, x, y : Byte;
tmp : Word;
Begin
If Length(S) = 0 Then Exit;
tmp := apoint;
For Len := 0 To Length(S) - 1 Do Begin
Mem[apage:apoint+Len] := Ord(S[Len+1]);
Inc(apoint);
Mem[apage:apoint+Len] := attribute;
End;
apoint := (tmp + Length(S) * 2) DIV 2;
x := apoint DIV 80 + 2;
y := 1;
PXY(x,y);
If Not(display) Then Begin
regs.dh := 50;
regs.dl := 0;
regs.ah := 2;
regs.bh := (apage - $B800) DIV $100;
Intr($10,regs);
End;
End;
Procedure ClrScrn;
Var
x : Word;
Begin
x := 0;
While x < 4048 Do Begin
Mem[apage:x] := $20;
Inc(x);
Mem[apage:x] := attribute;
Inc(x);
End;
End;
{initializes the foreground and backbround colors}
Begin
regs.ah := 8;
regs.bh := 0;
Intr($10,regs);
attribute := regs.ah;
FGround := attribute MOD 16;
BGround := (attribute - FGround) DIV 16;
End.
[Back to SCREEN SWAG index] [Back to Main SWAG index] [Original]