language-Modula2-0.1: examples/Modula-2_Libraries/andrea-m2/lib/eth-hamburg/simplescr.mod
IMPLEMENTATION MODULE SimpleScreen;
(* J. Andrea Dec 1985, VMS V4 screen manipulation *)
(* This code may be freely used and distributed, it may not be sold. *)
FROM SYSTEM IMPORT ADDRESS;
FROM SSDefinitions IMPORT SS$_NORMAL;
FROM SMGDefinitions IMPORT
SMG$C_ASCII, SMG$V_BORDER, SMG$M_NORMAL;
FROM ScreenManagementProcedures IMPORT
SMG$CREATE_PASTEBOARD, SMG$CREATE_VIRTUAL_DISPLAY,
SMG$DELETE_PASTEBOARD,
SMG$ERASE_DISPLAY, SMG$ERASE_LINE,
SMG$PASTE_VIRTUAL_DISPLAY, SMG$PUT_CHARS,
SMG$REPAINT_SCREEN, SMG$SET_CURSOR_ABS;
VAR
status, paste_board, virtual_display :CARDINAL;
display_exists :BOOLEAN;
max_rows, max_cols :CARDINAL;
(* ----------------------------------------------------------------- *)
PROCEDURE ErasePage( row, col :CARDINAL );
(* -------------------------------------------------------------- *)
PROCEDURE BuildDisplay;
BEGIN (* BuildDisplay *)
status := SMG$CREATE_PASTEBOARD( paste_board, 'TT:',
max_rows, max_cols, 0 );
IF status = SS$_NORMAL THEN
status := SMG$CREATE_VIRTUAL_DISPLAY( max_rows, max_cols,
virtual_display,
BITSET(SMG$V_BORDER),
BITSET(SMG$M_NORMAL),
SMG$C_ASCII );
IF status = SS$_NORMAL THEN
status := SMG$PASTE_VIRTUAL_DISPLAY( virtual_display,
paste_board,
1, 1,
ADDRESS( virtual_display ) );
IF status = SS$_NORMAL THEN
display_exists := TRUE;
ELSE
display_exists := FALSE;
END; (* if *)
ELSE
display_exists := FALSE;
END; (* if *)
ELSE
display_exists := FALSE;
END; (* if *)
END BuildDisplay;
BEGIN
IF display_exists THEN
status := SMG$ERASE_DISPLAY( virtual_display,
INTEGER(row), INTEGER(col), max_rows, max_cols );
ELSE
BuildDisplay;
END; (* if *)
END ErasePage;
(* ----------------------------------------------------------------- *)
PROCEDURE ScreenFinished;
BEGIN (* ScreenFinished *)
IF display_exists THEN
status := SMG$DELETE_PASTEBOARD( paste_board, BITSET(0) );
END; (* if *)
END ScreenFinished;
(* ----------------------------------------------------------------- *)
PROCEDURE EraseLine( row, col :CARDINAL );
BEGIN (* EraseLine *)
status := SMG$ERASE_LINE( virtual_display,
INTEGER(row), INTEGER(col) );
END EraseLine;
(* ----------------------------------------------------------------- *)
PROCEDURE PutScreen( text :ARRAY OF CHAR; row, col :CARDINAL);
BEGIN (* PutScreen *)
status := SMG$PUT_CHARS( virtual_display, text,
INTEGER(row), INTEGER(col), 0,
BITSET(SMG$M_NORMAL),
BITSET(SMG$M_NORMAL),
SMG$C_ASCII );
END PutScreen;
(* ----------------------------------------------------------------- *)
PROCEDURE SetCursor( row, col :CARDINAL);
BEGIN (* SetCursor *)
status := SMG$SET_CURSOR_ABS( virtual_display,
INTEGER(row), INTEGER(col) );
END SetCursor;
(* ------------------------------------ *)
PROCEDURE ReDrawScreen;
BEGIN (* ReDrawScreen *)
status := SMG$REPAINT_SCREEN( paste_board );
END ReDrawScreen;
BEGIN (* SimpleScreen *)
display_exists := FALSE;
END SimpleScreen.