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

{****************************************************************************}
{*                                                                          *}
{*                     TEST PROGRAM AT THE BOTTOM OF FILE                   *}
{*                                                                          *}
{*                                                                          *}
{*                          VIRTUAL SCREEN UNIT                             *}
{*                                                                          *}
{*                  by Marc Oude Kotte, The Netherlands                     *}
{*                        email: TAL95@hotmail.com                          *}
{*                           i DO reply your mail!!                         *}
{****************************************************************************}

{This unit was designed to work in textmode $ and in VESAmodes $109 and $10A.
 It also should work in either Real and Protected mode. Windows support is
 of course nonsense.

 I don't know if it works in any other mode then the modes called above!

 If you use this unit in your programs, please call my name in the
 credits part of your program. I don't need any money since i never donate
 any money to other programmers myself.                             Bye!}

Unit VirtScr;

Interface

Type TRect = Record
               x1,y1,x2,y2: Integer;
             End;

     TVirtScr = Record
                  xSize, ySize: Integer; {hor and vert size of screen
                                          warning: size is handled as in:
                                            1..xSize
                                            1..ySize, NOT: 0..xSize
                                                           0..ySize!!!!!!}
                  xLoc1, yLoc1,
                  xLoc2, yLoc2: Integer;   {(x,y)-(x,y) location on screen}
                  x,y: Integer;          {current "plus"-position on screen
                                          if both values are zero, the first
                                          character in Data will be on
                                          xLoc,yLoc}
                  Data: Pointer;         {pointer to data}
                  DataSize: LongInt;     {size of data area}
                  Visible: Boolean;      {is screen visible?}
                  MaxX: Integer;         {horizontal width of current video mode}
                  MaxY: Integer;         {vertical length of current video mode}
                  CursorX, CursorY: Integer; {cursor position in window}
                  Attributes: Byte;
                End;

Function DetermineVideoMode: Byte;
{1 = normal textmode $3
 2 = vesa mode $0109
 3 = vesa mode $010A}

Procedure AssignTRect(var R: TRect;
                      x1, y1, x2, y2: Integer);
{place values into a TRect variable}

Procedure AssignTVirtScr(var V: TVirtScr;
                         xSize, ySize: Integer;
                         xLoc1, yLoc1, xLoc2, yLoc2: Integer;
                         x,y: Integer;
                         Data: Pointer;
                         Visible: Boolean);
{place values into a TVirtScr variable, does NOT init it!!!}

Procedure InitVirtualScreen(var V: TVirtScr);
{init the virtual screen: values are placed into certain variables}

Procedure DrawVirtualScreen(var V: TVirtScr);
{draws the virtual screen: you don't have to call this procedure all the
 time, the unit does it when you write(ln) something or when you init
 the screen or when you make it (in)visible}

Procedure VS_ClrScr(var V: TVirtScr);
{same as CRT proc ClrScr --> clears screen with current textbackground}

Procedure VS_ClrWindow(var V: TVirtScr; x1,y1,x2,y2: Integer);
{clears the defined window with current textbackground}

Procedure VS_GotoXY(var V: TVirtScr; ToX,ToY: Integer);
{same as CRT proc GotoXY --> moves CP to ToX,ToY.
Values must be 0 < ToX,ToY < Size+1}

Procedure VS_Write(var V: TVirtScr; s: String);
{same as proc Write --> writes string s, no CRLF}

Procedure VS_WriteLn(var V: TVirtScr; s: String);
{same as proc Write --> writes string s + CRLF}

Procedure VS_TextColor(var V: TVirtScr; Color: Byte);
{same as CRT proc TextColor --> sets text color}

Procedure VS_TextBackGround(var V: TVirtScr; Color: Byte);
{same as CRT proc TextBackGround --> sets textbackground color}

Procedure VS_Move(var V: TVirtScr; Right,Down: Integer);
{moves x,y right/down positions in virt screen
 If you call VS_Move(V,1,2) the virtual screen on your real screen will move
 one to the left and 2 up!!!}

Procedure VS_MoveTo(var V: TVirtScr; ToX,ToY: Integer);
{moves x,y to position ToX, ToY in virt screen}

Procedure VS_SetVisibility(var V: TVirtScr; Visible: Boolean);
{sets the visibility of a virtuals screen}

Procedure VS_ScreenDump(var V: TVirtScr; fn: String);
{makes a complete virtual screen dump into a file}

Procedure DrawWindow(x1,y1,x2,y2,Lines: Byte);
{extra proc: draws windows. Lines=1 --> Ä
                            Lines=2 --> Í}

Procedure CursorOff;
  Inline($B4/$01/$B7/$00/$B9/$1E/$1F/$CD/$10);

Procedure CursorOn;
  Inline($B4/$01/$B7/$00/$B9/$07/$06/$CD/$10);

Implementation

Uses Crt;

Var VidMem: Pointer; {pointer to video memory}

Procedure FastMove(Var source; Var dest; NumToMove : Word);
{This procedure ain't mine, but i don't know who made it... sorry
 The reasen i use it is that it's ñ1.6 times faster then Pascal's Move}
Begin
  InLine ($8C/$DA/$C5/$B6/> Source/$C4/$BE/> Dest/$8B/$8E/> NumToMove/
          $39/$FE/$72/$08/$FC/$D1/$E9/$73/$11/$A4/$EB/$0E/$FD/$01/$CE/
          $4E/$01/$CF/$4F/$D1/$E9/$73/$01/$A4/$4E/$4F/$F2/$A5/$8E/$DA);
End;

Function DetermineVideoMode: Byte;
Var Mode: Byte;
Begin
  Mode:=1;
  Asm
    mov ax, $4F03    {function $4F, subfunction 03: get SVGA mode}
    int $10          {call interrupt 16}
    cmp bx, $0109    {bx=$0109?}
    jnz @Try010A     {no? goto Try010A}
    mov Mode, 2      {mode = 2}
    jmp @End         {goto end}

   @Try010A:
    cmp bx, $010A    {bx=$010A?}
    jnz @End         {no? goto End --> no vesa text mode --> mode = 1}
    mov Mode, 3      {mode = 3}

   @End:
  End;
  DetermineVideoMode:=Mode;
End;

Procedure AssignTRect(var R: TRect; x1, y1, x2, y2: Integer);
Begin
  R.x1:=x1; R.y1:=y1; R.x2:=x2; R.y2:=y2;
End;

Procedure AssignTVirtScr(var V: TVirtScr; xSize, ySize, xLoc1, yLoc1, xLoc2, yLoc2, x ,y: Integer;
                         Data: Pointer; Visible: Boolean);
Begin
  V.xSize:=xSize; V.ySize:=ySize;
  V.xLoc1:=xLoc1; V.yLoc1:=yLoc1;
  V.xLoc2:=xLoc2; V.yLoc2:=yLoc2;
  V.x:=x;         V.y:=y;
  V.Data:=Data;   V.Visible:=Visible;
End;

Procedure InitVirtualScreen(var V: TVirtScr);
Begin
  With V Do
    Begin
      CursorX:=1;
      CursorY:=1;
      DataSize:=xSize; DataSize:=DataSize*ySize; DataSize:=DataSize*2;
      GetMem(Data, DataSize);
      FillChar(Data^, DataSize, 0);
      Attributes:=7;
      Case DetermineVideoMode Of
        1: Begin MaxX:=80;  MaxY:=25; End;
        2: Begin MaxX:=132; MaxY:=25; End;
        3: Begin MaxX:=132; MaxY:=43; End;
      End;
    End;
  DrawVirtualScreen(V);
End;

Procedure DrawVirtualScreen(var V: TVirtScr);
Var xBytesToDraw :Integer;
    yLinesToDraw :Integer;
    yTemp        :Integer;
Begin
 If V.Visible Then
  With V Do
    Begin
      xBytesToDraw:=(xLoc2-xLoc1)+1;
      If xBytesToDraw>xSize Then xBytesToDraw:=xSize;
      xBytesToDraw:=xBytesToDraw*2; {1 byte for char, 1 byte for attribs}
      yLinesToDraw:=(yLoc2-yLoc1)+1;
      If yLinesToDraw>ySize Then yLinesToDraw:=ySize;

      For yTemp:=0 To yLinesToDraw-1 Do
       Begin
        FastMove( Mem[Seg(Data^):Ofs(Data^) + (2*x + y*2*xSize) + (yTemp*2*xSize)],
                  Mem[Seg(VidMem^):Ofs(VidMem^) + 2*(xLoc1-1) + (yTemp+yLoc1-1)*2*MaxX],
                  xBytesToDraw);
       End;
    End;
End;

Procedure VS_ClrScr(var V: TVirtScr);
Var t: LongInt;
    w: LongInt;
    x: LongInt;
Begin
  With V Do
    Begin
      w:=(xSize*ySize) - 1;
      For t:=0 To w Do
        Begin
          Mem[Seg(Data^):Ofs(Data^)+2*t]:=32;
          Mem[Seg(Data^):Ofs(Data^)+2*t + 1]:=Attributes;
        End;
    End;
  DrawVirtualScreen(V);
End;

Procedure VS_ClrWindow(var V: TVirtScr; x1,y1,x2,y2: Integer);
Var t: LongInt;
    w: LongInt;
Begin
  With V Do
    For t:=y1-1 To y2-1 Do
      For w:=x1-1 To x2-1 Do
        Begin
          Mem[Seg(Data^):Ofs(Data^) + 2 * (t*xSize + w)]:=32;
          Mem[Seg(Data^):Ofs(Data^) + 2 * (t*xSize + w) + 1]:=Attributes;
        End;

  DrawVirtualScreen(V);
End;

Procedure VS_GotoXY(var V: TVirtScr; ToX,ToY: Integer);
Begin
  With V Do
    Begin
      If (ToX>=1) and (ToX<=xSize) Then CursorX:=ToX;
      If (ToY>=1) and (ToY<=ySize) Then CursorY:=ToY;
    End;
End;

Procedure VS_Write(var V: TVirtScr; s: String);
Var t: Byte;
    w: Word;
Begin
  With V Do
    Begin
      For t:=1 To Length(s) Do
        Begin
          w:=Ofs(Data^) + 2*(CursorX - 1 + (CursorY-1)*xSize );
          Mem[Seg(Data^):w]:=Ord(s[t]);
          Mem[Seg(Data^):w+1]:=Attributes;
          Inc(CursorX);
        End;

      While CursorX>xSize Do Begin Dec(CursorX, xSize); Inc(CursorY); End;
      If CursorY>ySize Then CursorY:=ySize;
    End;
  DrawVirtualScreen(V);
End;

Procedure VS_WriteLn(var V: TVirtScr; s: String);
Var t: Byte;
    w: Word;
Begin
  With V Do
    Begin
      For t:=1 To Length(s) Do
        Begin
          w:=Ofs(Data^) + 2*(CursorX - 1 + (CursorY-1)*xSize );
          Mem[Seg(Data^):w]:=Ord(s[t]);
          Mem[Seg(Data^):w + 1]:=Attributes;
          Inc(CursorX);
        End;

      While CursorX>xSize Do Begin Dec(CursorX, xSize); Inc(CursorY); End;
      Inc(CursorY); {LF}
      CursorX:=1;   {CR}
      If CursorY>ySize Then CursorY:=ySize;
    End;
  DrawVirtualScreen(V);
End;

Procedure VS_TextColor(var V: TVirtScr; Color: Byte);
Begin
  V.Attributes:=V.Attributes shr 4;
  V.Attributes:=V.Attributes shl 4;
  V.Attributes:=V.Attributes or Color;
End;

Procedure VS_TextBackGround(var V: TVirtScr; Color: Byte);
Begin
  V.Attributes:=V.Attributes shl 4;
  V.Attributes:=V.Attributes shr 4;
  V.Attributes:=V.Attributes or (Color shl 4);
End;

Procedure VS_Move(var V: TVirtScr; Right,Down: Integer);
Var Oldx, Oldy: Integer;
Begin
  With V Do
    Begin
      Oldx:=x;
      Oldy:=y;
      Inc(x, Right);
      Inc(y, Down);
      If x>xSize-(xLoc2-xLoc1+1) Then x:=xSize-(xLoc2-xLoc1+1);
      If y>ySize-(yLoc2-yLoc1+1) Then y:=ySize-(yLoc2-yLoc1+1);
      If x<0 Then x:=0;
      If y<0 Then y:=0;
    End;
  If (v.x<>Oldx) or (v.y<>Oldy) Then DrawVirtualScreen(V);
End;

Procedure VS_MoveTo(var V: TVirtScr; ToX, ToY: Integer);
Begin
  With V Do
    Begin
      x:=ToX;
      y:=ToY;
      If x>xSize-(xLoc2-xLoc1+1) Then x:=xSize-(xLoc2-xLoc1+1);
      If y>ySize-(yLoc2-yLoc1+1) Then y:=ySize-(yLoc2-yLoc1+1);
      If x<0 Then x:=0;
      If y<0 Then y:=0;
    End;
  DrawVirtualScreen(V);
End;

Procedure VS_SetVisibility(var V: TVirtScr; Visible: Boolean);
Begin
  V.Visible:=Visible;
  DrawVirtualScreen(V);
End;

Procedure VS_ScreenDump(var V: TVirtScr; fn: String);
Var f: File;
    w: Word;
Begin
  Assign(f, fn);
  {$I-} ReWrite(f, 1); {$I+}
  If IOResult=0 Then
    Begin
      BlockWrite(f, V.Data^, V.DataSize, w);
      Close(f);
    End;
End;

Procedure DrawWindow(x1,y1,x2,y2,Lines: Byte);
Var x,y: Byte;
    lb,rb,lo,ro,vert,hor: Char;
Begin
  Case Lines Of
    1: Begin lb:='Ú'; rb:='¿'; lo:='À'; ro:='Ù'; vert:='³'; hor:='Ä'; End;
    2: Begin lb:='É'; rb:='»'; lo:='È'; ro:='¼'; vert:='º'; hor:='Í'; End;
    Else Begin lb:=' '; rb:=' '; lo:=' '; ro:=' '; vert:=' '; hor:=' ';End;
  End;
  GotoXY(x1,y1); Write(lb); For x:=x1+1 To x2-1 Do Write(hor); Write(rb);
  For y:=y1+1 To y2-1 Do Begin GotoXY(x1,y); Write(vert); GotoXY(x2,y); Write(vert); End;
  GotoXY(x1,y2); Write(lo); For x:=x1+1 To x2-1 Do Write(hor); Write(ro);
End;


Var w: String;
Begin
  w:='--== VIRTUAL SCREEN UNIT by Marc Oude Kotte ==--';
  VidMem:=Ptr(SegB800,0);
End.

{***********************************TEST PROGRAM****************************}

Program TestProgram; {for VirtScr Unit}
Uses Mouse, Crt, VirtScr;
Var V: TVirtScr;
Const NC : Array[1..4000] Of Char = (
#32,#7,#32,#112,#70,#116,#105,#112,#108,#112,#101,#112,#32,#112,
#32,#112,#69,#116,#100,#112,#105,#112,#116,#112,#32,#112,#32,#112,#83,
#116,#101,#112,#97,#112,#114,#112,#99,#112,#104,#112,#32,#112,#32,#112,
#82,#116,#117,#112,#110,#112,#32,#112,#32,#112,#67,#116,#111,#112,#109,
#112,#112,#112,#105,#112,#108,#112,#101,#112,#32,#112,#32,#112,#68,#116,
#101,#112,#98,#112,#117,#112,#103,#112,#32,#112,#32,#112,#84,#116,#111,
#112,#111,#112,#108,#112,#115,#112,#32,#112,#32,#112,#79,#116,#112,#112,
#116,#112,#105,#112,#111,#112,#110,#112,#115,#112,#32,#112,#32,#112,#87,
#116,#105,#112,#110,#112,#100,#112,#111,#112,#119,#112,#32,#112,#32,#112,
#72,#116,#101,#112,#108,#112,#112,#112,#32,#112,#32,#112,#32,#112,#32,
#112,#32,#112,#32,#112,#32,#112,#32,#112,#32,#112,#201,#31,#205,#31,
#91,#31,#254,#26,#93,#31,#205,#31,#205,#31,#205,#31,#205,#31,#205,
#31,#205,#31,#205,#31,#205,#31,#205,#31,#205,#31,#205,#31,#205,#31,
#205,#31,#205,#31,#205,#31,#205,#31,#205,#31,#205,#31,#32,#31,#92,
#31,#66,#31,#80,#31,#92,#31,#80,#31,#65,#31,#83,#31,#70,#31,
#73,#31,#76,#31,#69,#31,#83,#31,#92,#31,#86,#31,#73,#31,#82,
#31,#84,#31,#83,#31,#67,#31,#82,#31,#92,#31,#86,#31,#73,#31,
#82,#31,#84,#31,#83,#31,#67,#31,#82,#31,#46,#31,#80,#31,#65,
#31,#83,#31,#32,#31,#205,#31,#205,#31,#205,#31,#205,#31,#205,#31,
#205,#31,#205,#31,#205,#31,#205,#31,#205,#31,#205,#31,#205,#31,#205,
#31,#205,#31,#205,#31,#205,#31,#49,#31,#205,#31,#91,#31,#18,#26,
#93,#31,#205,#31,#187,#31,#186,#31,#32,#31,#32,#31,#32,#31,#32,
#31,#49,#31,#58,#31,#32,#31,#66,#28,#101,#28,#103,#28,#105,#28,
#110,#28,#32,#31,#108,#31,#98,#31,#58,#31,#61,#31,#39,#27,#218,
#27,#39,#27,#59,#31,#32,#31,#114,#31,#98,#31,#58,#31,#61,#31,
#39,#27,#191,#27,#39,#27,#59,#31,#32,#31,#108,#31,#111,#31,#58,
#31,#61,#31,#39,#27,#192,#27,#39,#27,#59,#31,#32,#31,#114,#31,
#111,#31,#58,#31,#61,#31,#39,#27,#217,#27,#39,#27,#59,#31,#32,
#31,#118,#31,#101,#31,#114,#31,#116,#31,#58,#31,#61,#31,#39,#27,
#179,#27,#39,#27,#59,#31,#32,#31,#104,#31,#111,#31,#114,#31,#58,
#31,#61,#31,#39,#27,#196,#27,#39,#27,#59,#31,#32,#31,#69,#28,
#110,#28,#100,#28,#59,#31,#32,#31,#32,#31,#32,#31,#32,#31,#30,
#49,#186,#31,#32,#31,#32,#31,#32,#31,#32,#31,#50,#31,#58,#31,
#32,#31,#66,#28,#101,#28,#103,#28,#105,#28,#110,#28,#32,#31,#108,
#31,#98,#31,#58,#31,#61,#31,#39,#27,#201,#27,#39,#27,#59,#31,
#32,#31,#114,#31,#98,#31,#58,#31,#61,#31,#39,#27,#187,#27,#39,
#27,#59,#31,#32,#31,#108,#31,#111,#31,#58,#31,#61,#31,#39,#27,
#200,#27,#39,#27,#59,#31,#32,#31,#114,#31,#111,#31,#58,#31,#61,
#31,#39,#27,#188,#27,#39,#27,#59,#31,#32,#31,#118,#31,#101,#31,
#114,#31,#116,#31,#58,#31,#61,#31,#39,#27,#186,#27,#39,#27,#59,
#31,#32,#31,#104,#31,#111,#31,#114,#31,#58,#31,#61,#31,#39,#27,
#205,#27,#39,#27,#59,#31,#32,#31,#69,#28,#110,#28,#100,#28,#59,
#31,#32,#31,#32,#31,#32,#31,#32,#31,#177,#49,#186,#31,#32,#31,
#32,#31,#32,#31,#32,#31,#69,#28,#108,#28,#115,#28,#101,#28,#32,
#31,#66,#28,#101,#28,#103,#28,#105,#28,#110,#28,#32,#31,#108,#31,
#98,#31,#58,#31,#61,#31,#39,#27,#32,#27,#39,#27,#59,#31,#32,
#31,#114,#31,#98,#31,#58,#31,#61,#31,#39,#27,#32,#27,#39,#27,
#59,#31,#32,#31,#108,#31,#111,#31,#58,#31,#61,#31,#39,#27,#32,
#27,#39,#27,#59,#31,#32,#31,#114,#31,#111,#31,#58,#31,#61,#31,
#39,#27,#32,#27,#39,#27,#59,#31,#32,#31,#118,#31,#101,#31,#114,
#31,#116,#31,#58,#31,#61,#31,#39,#27,#32,#27,#39,#27,#59,#31,
#32,#31,#104,#31,#111,#31,#114,#31,#58,#31,#61,#31,#39,#27,#32,
#27,#39,#27,#59,#31,#69,#28,#110,#28,#100,#28,#59,#31,#32,#31,
#32,#31,#32,#31,#177,#49,#186,#31,#32,#31,#32,#31,#69,#28,#110,
#28,#100,#28,#59,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,
#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,
#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,
#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,
#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,
#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,
#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,
#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,
#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,
#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#177,
#49,#186,#31,#32,#31,#32,#31,#71,#31,#111,#31,#116,#31,#111,#31,
#88,#31,#89,#31,#40,#31,#120,#31,#49,#31,#44,#31,#121,#31,#49,
#31,#41,#31,#59,#31,#32,#31,#87,#31,#114,#31,#105,#31,#116,#31,
#101,#31,#40,#31,#108,#31,#98,#31,#41,#31,#59,#31,#32,#31,#70,
#28,#111,#28,#114,#28,#32,#31,#120,#31,#58,#31,#61,#31,#120,#31,
#49,#31,#43,#31,#49,#31,#32,#31,#84,#28,#111,#28,#32,#31,#120,
#31,#50,#31,#45,#31,#49,#31,#32,#31,#68,#28,#111,#28,#32,#31,
#87,#31,#114,#31,#105,#31,#116,#31,#101,#31,#40,#31,#104,#31,#111,
#31,#114,#31,#41,#31,#59,#31,#32,#31,#87,#31,#114,#31,#105,#31,
#116,#31,#101,#31,#40,#31,#114,#31,#98,#31,#41,#31,#59,#31,#32,
#31,#32,#31,#32,#31,#32,#31,#32,#31,#177,#49,#186,#31,#32,#31,
#32,#31,#70,#28,#111,#28,#114,#28,#32,#31,#121,#31,#58,#31,#61,
#31,#121,#31,#49,#31,#43,#31,#49,#31,#32,#31,#84,#28,#111,#28,
#32,#31,#121,#31,#50,#31,#45,#31,#49,#31,#32,#31,#68,#28,#111,
#28,#32,#31,#66,#28,#101,#28,#103,#28,#105,#28,#110,#28,#32,#31,
#71,#31,#111,#31,#116,#31,#111,#31,#88,#31,#89,#31,#40,#31,#120,
#31,#49,#31,#44,#31,#121,#31,#41,#31,#59,#31,#32,#31,#87,#31,
#114,#31,#105,#31,#116,#31,#101,#31,#40,#31,#118,#31,#101,#31,#114,
#31,#116,#31,#41,#31,#59,#31,#32,#31,#71,#31,#111,#31,#116,#31,
#111,#31,#88,#31,#89,#31,#40,#31,#120,#31,#50,#31,#44,#31,#121,
#31,#41,#31,#59,#31,#32,#31,#87,#31,#114,#31,#105,#31,#116,#31,
#101,#31,#40,#31,#177,#49,#186,#31,#32,#31,#32,#31,#71,#31,#111,
#31,#116,#31,#111,#31,#88,#31,#89,#31,#40,#31,#120,#31,#49,#31,
#44,#31,#121,#31,#50,#31,#41,#31,#59,#31,#32,#31,#87,#31,#114,
#31,#105,#31,#116,#31,#101,#31,#40,#31,#108,#31,#111,#31,#41,#31,
#59,#31,#32,#31,#70,#28,#111,#28,#114,#28,#32,#31,#120,#31,#58,
#31,#61,#31,#120,#31,#49,#31,#43,#31,#49,#31,#32,#31,#84,#28,
#111,#28,#32,#31,#120,#31,#50,#31,#45,#31,#49,#31,#32,#31,#68,
#28,#111,#28,#32,#31,#87,#31,#114,#31,#105,#31,#116,#31,#101,#31,
#40,#31,#104,#31,#111,#31,#114,#31,#41,#31,#59,#31,#32,#31,#87,
#31,#114,#31,#105,#31,#116,#31,#101,#31,#40,#31,#114,#31,#111,#31,
#41,#31,#59,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#177,
#49,#186,#31,#69,#28,#110,#28,#100,#28,#59,#31,#32,#31,#32,#31,
#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,
#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,
#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,
#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,
#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,
#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,
#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,
#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,
#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,
#31,#32,#31,#32,#31,#32,#31,#32,#31,#177,#49,#186,#31,#32,#31,
#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,
#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,
#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,
#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,
#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,
#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,
#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,
#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,
#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,
#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,
#32,#31,#32,#31,#177,#49,#186,#31,#86,#28,#97,#28,#114,#28,#32,
#31,#119,#31,#58,#31,#32,#31,#83,#28,#116,#28,#114,#28,#105,#28,
#110,#28,#103,#28,#59,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,
#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,
#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,
#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,
#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,
#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,
#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,
#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,
#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#177,
#49,#186,#31,#66,#28,#101,#28,#103,#28,#105,#28,#110,#28,#32,#31,
#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,
#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,
#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,
#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,
#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,
#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,
#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,
#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,
#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,
#31,#32,#31,#32,#31,#32,#31,#32,#31,#177,#49,#186,#31,#32,#31,
#32,#31,#119,#31,#58,#31,#61,#31,#39,#27,#45,#27,#45,#27,#61,
#27,#61,#27,#32,#27,#86,#27,#73,#27,#82,#27,#84,#27,#85,#27,
#65,#27,#76,#27,#32,#27,#83,#27,#67,#27,#82,#27,#69,#27,#69,
#27,#78,#27,#32,#27,#85,#27,#78,#27,#73,#27,#84,#27,#32,#27,
#98,#27,#121,#27,#32,#27,#77,#27,#97,#27,#114,#27,#99,#27,#32,
#27,#79,#27,#117,#27,#100,#27,#101,#27,#32,#27,#75,#27,#111,#27,
#116,#27,#116,#27,#101,#27,#32,#27,#61,#27,#61,#27,#45,#27,#45,
#27,#39,#27,#59,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,
#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,
#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,
#32,#31,#32,#31,#177,#49,#186,#31,#32,#31,#32,#31,#86,#31,#105,
#31,#100,#31,#77,#31,#101,#31,#109,#31,#58,#31,#61,#31,#80,#31,
#116,#31,#114,#31,#40,#31,#83,#31,#101,#31,#103,#31,#66,#31,#56,
#31,#48,#31,#48,#31,#44,#31,#48,#31,#41,#31,#59,#31,#32,#31,
#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,
#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,
#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,
#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,
#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,
#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,
#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#177,
#49,#186,#31,#69,#28,#110,#28,#100,#28,#46,#31,#32,#31,#32,#31,
#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,
#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,
#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,
#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,
#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,
#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,
#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,
#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,
#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,
#31,#32,#31,#32,#31,#32,#31,#32,#31,#177,#49,#186,#31,#32,#31,
#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,
#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,
#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,
#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,
#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,
#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,
#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,
#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,
#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,
#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,
#32,#31,#32,#31,#177,#49,#186,#31,#32,#31,#32,#31,#32,#31,#32,
#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,
#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,
#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,
#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,
#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,
#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,
#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,
#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,
#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,
#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#177,
#49,#186,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,
#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,
#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,
#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,
#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,
#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,
#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,
#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,
#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,
#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,
#31,#32,#31,#32,#31,#32,#31,#32,#31,#177,#49,#186,#31,#32,#31,
#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,
#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,
#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,
#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,
#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,
#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,
#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,
#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,
#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,
#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,
#32,#31,#32,#31,#177,#49,#186,#31,#32,#31,#32,#31,#32,#31,#32,
#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,
#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,
#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,
#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,
#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,
#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,
#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,
#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,
#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,
#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#254,
#49,#186,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,
#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,
#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,
#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,
#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,
#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,
#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,
#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,
#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,
#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,
#31,#32,#31,#32,#31,#32,#31,#32,#31,#177,#49,#186,#31,#32,#31,
#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,
#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,
#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,
#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,
#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,
#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,
#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,
#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,
#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,
#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,#32,#31,
#32,#31,#32,#31,#31,#49,#200,#31,#205,#31,#205,#31,#205,#31,#205,
#31,#205,#31,#32,#31,#51,#31,#53,#31,#49,#31,#58,#31,#49,#31,
#32,#31,#205,#31,#205,#31,#205,#31,#205,#31,#205,#31,#17,#49,#254,
#49,#177,#49,#177,#49,#177,#49,#177,#49,#177,#49,#177,#49,#177,#49,
#177,#49,#177,#49,#177,#49,#177,#49,#177,#49,#177,#49,#177,#49,#177,
#49,#177,#49,#177,#49,#177,#49,#177,#49,#177,#49,#177,#49,#177,#49,
#177,#49,#177,#49,#177,#49,#177,#49,#177,#49,#177,#49,#177,#49,#177,
#49,#177,#49,#177,#49,#177,#49,#177,#49,#177,#49,#177,#49,#177,#49,
#177,#49,#177,#49,#177,#49,#177,#49,#177,#49,#177,#49,#177,#49,#177,
#49,#177,#49,#177,#49,#177,#49,#177,#49,#177,#49,#177,#49,#177,#49,
#177,#49,#177,#49,#177,#49,#177,#49,#177,#49,#16,#49,#196,#26,#217,
#26,#32,#112,#70,#116,#49,#116,#32,#112,#72,#112,#101,#112,#108,#112,
#112,#112,#32,#112,#32,#112,#70,#116,#50,#116,#32,#112,#83,#112,#97,
#112,#118,#112,#101,#112,#32,#112,#32,#112,#70,#116,#51,#116,#32,#112,
#79,#112,#112,#112,#101,#112,#110,#112,#32,#112,#32,#112,#65,#116,#108,
#116,#116,#116,#43,#116,#70,#116,#57,#116,#32,#112,#67,#112,#111,#112,
#109,#112,#112,#112,#105,#112,#108,#112,#101,#112,#32,#112,#32,#112,#70,
#116,#57,#116,#32,#112,#77,#112,#97,#112,#107,#112,#101,#112,#32,#112,
#32,#112,#65,#116,#108,#116,#116,#116,#43,#116,#70,#116,#49,#116,#48,
#116,#32,#112,#76,#112,#111,#112,#99,#112,#97,#112,#108,#112,#32,#112,
#109,#112,#101,#112,#110,#112,#117,#112,#32,#112,#32,#112,#32,#112,#32,
#112,#32,#112,#32,#112,#32,#112,#32,#112,#32,#112);

Function InBox(x1,y1,x2,y2,x,y:Word):Boolean;
Begin
   If (x>=x1) and (x<=x2) and (y>=y1) and (y<=y2) Then InBox:=True Else InBox:=False;
End;

Var OldMx, OldMy: Word;
    Knop, Mx, My: Word;
Begin
  CursorOff; {VirtScr unit}
  TextBackGround(Black);
  TextColor(LightGray);
  ClrScr;

  DrawWindow(15,6,65,18,1);
  AssignTVirtScr(V, 80, 25, 16, 7, 64, 17, 0, 0, V.Data, True);
  InitVirtualScreen(V);

  Move(NC, V.Data^, 4000);
  DrawVirtualScreen(V);

  GotoXY(3,3); WriteLn('Test program for Virtual Screens:');
  GotoXY(12,20); WriteLn('Press right mouse button to move Pascal!');
  GotoXY(1,24); Write('--== VIRTUAL SCREEN UNIT by Marc Oude Kotte ==--':80);

  ShowMouse;

  Repeat
    GetMouse(Knop, Mx, My);
    Mx:=Mx div 8 + 1;
    My:=My div 8 + 1;
    If Knop=2 Then If InBox(16,7,64,17,Mx,My) Then
      Begin
        OldMx:=Mx;
        OldMy:=My;
        HideMouse;
        Repeat
          GetMouse(Knop, Mx, My);
          Mx:=Mx div 8 + 1;
          My:=My div 8 + 1;
          If (Mx<>OldMx) or (My<>OldMy) Then
            Begin
              VS_Move(V, -(OldMx-Mx), -(OldMy-My));
              OldMx:=Mx;
              OldMy:=My;
            End;
        Until Knop<>2;
        ShowMouse;
      End;
  Until KeyPressed;
  ReadKey;

  CursorOn;
End.

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