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.