MKSCRN.PAS

3.7 KB 1ceb9ad1480d0210…
{$I DIRECT.INC}
Unit MKScrn;

Interface

Type ScrnItemType = Record
       Ch   : Char;
       Attr : Byte;
     End;

     ScreenType = Record
       Case Boolean Of
         True  : (ScrnWord: Array[0..10000] of Word);
         False : (ScrnItem: Array[0..10000] of ScrnItemType);
       End;

Var
  ScrnWidth: Byte;
  ScrnHeight: Byte;
  ScrnPtr: ^ScreenType;


Procedure ScrollScrnRegionUp(xl,yl,xh,yh, count: Byte);
Procedure ScrollScrnRegionDown(xl,yl,xh,yh, count: Byte);
Procedure PutScrnWord (SX: Byte; SY: Byte; CA: Word);
Function  GetScrnWord(SX: Byte; SY: Byte): Word;
Procedure SetCursorPosition(Sx: Byte; Sy: Byte);
Procedure GetCursorPosition(Var Sx: Byte; Var Sy: Byte);
Procedure DelCharInLine(Sx: Byte; Sy: Byte);
Procedure InsCharInLine(Sx: Byte; Sy: Byte; Ch: Char);
Procedure InitializeScrnRegion(xl,yl,xh,yh: Byte; Ch: Char);


Implementation

Uses Dos, Crt;

Var Regs : Registers;

Procedure ScrollScrnRegionUp(xl,yl,xh,yh, count: Byte);
Begin
  If YH > ScrnHeight Then YH := ScrnHeight;
  If XH > ScrnWidth Then XH := ScrnWidth;
  Regs.ah := 6;
  Regs.al := count;
  Regs.ch := yl - 1;
  Regs.cl := xl - 1;
  Regs.dh := yh - 1;
  Regs.dl := xh - 1;
  Regs.bh := TextAttr;
  Intr($10, Regs);
End;


Procedure ScrollScrnRegionDown(xl,yl,xh,yh, count: Byte);
Begin
  Regs.ah := 7;
  If YH > ScrnHeight Then YH := ScrnHeight;
  If XH > ScrnWidth Then XH := ScrnWidth;
  Regs.al := count;
  Regs.ch := yl - 1;
  Regs.cl := xl - 1;
  Regs.dh := yh - 1;
  Regs.dl := xh - 1;
  Regs.bh := TextAttr;
  Intr($10, Regs);
End;


Procedure SetCursorPosition(Sx: Byte; Sy: Byte);
Begin
  Regs.ah := 2;
  Regs.dh := sy - 1;
  Regs.dl := sx - 1;
  Regs.bh := 0;
  Intr($10, Regs);
End;


Procedure GetCursorPosition(Var Sx: Byte; Var Sy: Byte);
Begin
  Regs.ah := 3;
  Regs.bh := 0;
  Intr($10, Regs);
  Sx := Regs.dl + 1;
  Sy := Regs.dh + 1;
End;


Function GetScrnWord(SX: Byte; SY: Byte): Word;
Var Cx,
    Cy: Byte;
Begin
  If (DirectVideo  And (Not CheckSnow)) Then
    GetScrnWord := ScrnPtr^.ScrnWord[((SY - 1) * ScrnWidth) + (SX - 1)]
  Else
  Begin
    GetCursorPosition(Cx,Cy);
    SetCursorPosition(Sx,Sy);
    Regs.Ah := 8;
    Regs.Bh := 0;
    Intr($10, Regs);
    GetScrnWord := Regs.Ax;
    SetCursorPosition(Cx,Cy);
  End;
End;

Procedure PutScrnWord (SX: Byte; SY: Byte; CA: Word);
Var Cx,
    Cy: Byte;
Begin
  If (DirectVideo And (Not CheckSnow)) Then
    ScrnPtr^.ScrnWord[((SY - 1) * ScrnWidth) + (SX - 1)] := CA
  Else
  Begin
    GetCursorPosition(Cx, Cy);
    SetCursorPosition(Sx, Sy);
    Regs.Ah := 9;
    Regs.Bh := 0;
    Regs.Al := Lo(Ca);
    Regs.Bl := Hi(Ca);
    Regs.Cx := 1;
    Intr($10, Regs);
    SetCursorPosition(Cx, Cy);
  End;
End;

Procedure DelCharInLine(Sx: Byte; Sy: Byte);
Var Ex,
    Cx: Byte;
Begin
  Ex := ScrnWidth;
  Cx := Sx;
  While (Cx < Ex) Do
  Begin
    PutScrnWord(Cx, Sy, GetScrnWord(Cx + 1, Sy));
    Inc(Cx);
  End;
  PutScrnWord(Ex, Sy, 32 + (TextAttr shl 8));
End;


Procedure InsCharInLine(Sx: Byte; Sy: Byte; Ch: Char);
Var Cx: Byte;
Begin
  Cx := ScrnWidth;
  While (Cx > Sx) Do
  Begin
    PutScrnWord(Cx, Sy, GetScrnWord(Cx - 1, Sy));
    Dec(Cx);
  End;
  PutScrnWord(Sx, Sy, Ord(Ch) + (TextAttr shl 8));
End;


Procedure InitializeScrnRegion(xl,yl,xh,yh: Byte; Ch: Char);
Var Cx,
    Cy: Byte;
Begin
  If YH > ScrnHeight Then YH := ScrnHeight;
  If XH > ScrnWidth Then XH := ScrnWidth;
  Cx := xl;
  Cy := yl;
  While (cy <= yh) Do
  Begin
    While (Cx <= xh) Do
    Begin
      PutScrnWord(Cx, Cy, Ord(ch) + (TextAttr shl 8));
      Inc(Cx);
    End;
    Inc(Cy);
  End;
End;


Begin
  ScrnHeight := 25;
  ScrnWidth := 80;
  ScrnPtr := Ptr($B800, 0);
End.