Category : Miscellaneous Language Source Code
Archive   : OBERONM.ZIP
Filename : SCREEN.MOD

 
Output of file : SCREEN.MOD contained in archive : OBERONM.ZIP

MODULE Screen ; (* ERV, 1989 *)
IMPORT SYS;

CONST minrow * = 0 ; maxrow * = 24 ;
mincol * = 0 ; maxcol * = 79 ;

TYPE maptyp = ARRAY maxrow+1, maxcol+1 OF INTEGER ;
Styp = POINTER TO maptyp ;

VAR S : Styp ; Color * : INTEGER;
ColorScreen * : BOOLEAN;

PROCEDURE SetAddr ;
TYPE ptyp = POINTER TO ARRAY 1 OF SET;
VAR cr:RECORD low, high : INTEGER END;
p:ptyp;
BEGIN
cr.low := 10H; cr.high := 40H; (*equipflag in bios*)
p := SYS.VAL(ptyp,cr);
IF (5 IN p^) & (4 IN p^) THEN cr.high := 0B000H (*monochrome screen*);
ColorScreen := FALSE
ELSE cr.high := 0B800H (*color screen*); ColorScreen := TRUE
END;
cr.low := 0; S := SYS.VAL(Styp,cr)
END SetAddr;


PROCEDURE WrtCh * (ch:CHAR; row, col : INTEGER);
BEGIN S[row,col] := 07H * 256 + ORD(ch)
END WrtCh;

PROCEDURE WrtStr * (s:ARRAY OF CHAR; row, col : INTEGER);
VAR i,cl:INTEGER;
BEGIN cl := Color * 256;
i := 0;
WHILE s[i] # 00X DO S[row,col] := cl + ORD(s[i]);
INC(i); INC(col);
IF col > maxcol THEN INC(row); col := mincol;
IF row > maxrow THEN row := minrow END
END
END
END WrtStr;

PROCEDURE WrtHi * (s:ARRAY OF CHAR; row, col : INTEGER);
VAR i:INTEGER;
BEGIN
i := 0;
WHILE s[i] # 00X DO S[row,col] := 70H * 256 + ORD(s[i]);
INC(i); INC(col);
IF col > maxcol THEN INC(row); col := mincol;
IF row > maxrow THEN row := minrow END
END
END
END WrtHi;

PROCEDURE WrtSp * (VAR s:ARRAY OF BYTE; index,limit:INTEGER; row,col:INTEGER);
VAR ch:CHAR; i,j:INTEGER; cl:INTEGER;
BEGIN cl := Color * 256;
ch := CHR(s[index]); j := limit - index ;
IF j > maxcol THEN j := maxcol END;
WHILE (j > 0) & (ch # 0X) DO
S[row,col] := cl + ORD(ch);
INC(index); INC(col); DEC(j);
ch := CHR(s[index])
END ;
WHILE col < maxcol DO S[row,col] := cl + ORD(" "); INC(col) END
END WrtSp;


PROCEDURE Clear * ;
VAR cl:INTEGER;
BEGIN cl := Color * 256;
SYS.CODE(
0B8H, 00H,06H, (* mov ax,0600h ;scroll entire screen down*)
0B9H, 00H,00H, (* mov cx,0 *)
0BAH, 4FH,18H, (* mov dx,(24*256) + 79*)
8BH, 5EH, 0FCH, (* mov bx,[bp-4];get color cl into bh*)
0CDH, 10H (* int 10h *)
)
END Clear;

PROCEDURE EraseLine * (row:INTEGER);
VAR col,cl:INTEGER;
BEGIN col := mincol; cl := Color * 256;
WHILE col < maxcol DO S[row,col] := cl + ORD(" "); INC(col) END
END EraseLine;

PROCEDURE SetCursorOn *;
BEGIN SYS.CODE(
0B4H, 01H, (*mov ah,1 ;set cursor size *)
0B9H, 07H,06H, (*mov cx, 0607h ; start/end lines(visible on color)*)
0CDH, 10H (*int 10h *)
)
END SetCursorOn;

PROCEDURE SetCursorOff *;
BEGIN SYS.CODE(
0B4H, 01H, (*mov ah,1 ;set cursor size *)
0B9H, 01H,0FH, (*mov cx, 0F01h ; start/end lines(invisible)*)
0CDH, 10H (*int 10h *)
)
END SetCursorOff;

PROCEDURE MoveCursor * (row,col:INTEGER);
BEGIN col := row*256 + col;
SYS.CODE(
0B4H, 02H, (* mov ah,2 ;set cursor position *)
8BH, 56H, 06H, (* mov dx,word ptr[bp+6] ; get parm for row/col position *)
0B7H, 00H, (* mov bh,0 ;page number *)
0CDH, 10H (* int 10h *)
)
END MoveCursor;

BEGIN SetAddr; Color := 07H
END Screen.