Category : Pascal Source Code
Archive   : PIBT41S1.ZIP
Filename : DISPLAYC.MOD

 
Output of file : DISPLAYC.MOD contained in archive : PIBT41S1.ZIP
(*----------------------------------------------------------------------*)
(* Display_Character --- show character received from port *)
(*----------------------------------------------------------------------*)

PROCEDURE Display_Character( Ch: CHAR );

(*----------------------------------------------------------------------*)
(* *)
(* Procedure: Display_Character *)
(* *)
(* Purpose: Displays character received from comm. port on *)
(* screen/printer/capture file. *)
(* *)
(* Calling Sequence: *)
(* *)
(* Display_Character( Ch : CHAR ); *)
(* *)
(* Ch --- Character received from Comm. port. *)
(* *)
(* Calls: Async_Receive *)
(* Min *)
(* Update_Review_Pointers *)
(* TimeOfDay *)
(* TimeDiff *)
(* *)
(* Remarks: *)
(* *)
(* This routine strips out certain characters which *)
(* should not be displayed, performs output line wrapping, *)
(* and saves the output line characters in the review buffer. *)
(* *)
(*----------------------------------------------------------------------*)

(* STRUCTURED *) CONST
CR_Ch : CHAR = ^M;
LF_Ch : CHAR = ^J;
BL_Ch : CHAR = ' ';
(* Terminal types so effect of FF *)
(* can be distinguished *)
Ansi_Set : SET OF Terminal_Type
= [Ansi, VT52, VT100];

VAR
I : INTEGER;
J : INTEGER;
L : INTEGER;
Xpos : INTEGER;
Ypos : INTEGER;
KeyC : CHAR;
Disp : BOOLEAN;

(*----------------------------------------------------------------------*)
(* MoveXY --- Move to (X,Y) on screen using BIOS call *)
(*----------------------------------------------------------------------*)

PROCEDURE MoveXY( X: INTEGER; Y: INTEGER );

(*----------------------------------------------------------------------*)
(* *)
(* Procedure: MoveXY *)
(* *)
(* Purpose: Moves to specified (X,Y) position on screen *)
(* *)
(* Calling Sequence: *)
(* *)
(* MoveXY( X: INTEGER; Y: INTEGER ); *)
(* *)
(* (X,Y) --- Where to move to *)
(* *)
(*----------------------------------------------------------------------*)

BEGIN (* MoveXY *)

INLINE(
$55/ { PUSH BP}
$B4/$02/ { MOV Ah,2 ;BIOS position cursor function}
$B7/$00/ { MOV Bh,0 ;Page 0}
$8A/$B6/>Y/ { MOV Dh,[BP+>Y] ;Y coordinate}
$FE/$CE/ { DEC Dh ;Drop by 1}
$8A/$96/>X/ { MOV Dl,[BP+>X] ;X coordinate}
$FE/$CA/ { DEC Dl ;Drop by 1}
$CD/$10/ { INT $10 ;BIOS video interrupt}
$5D); { POP BP}

END (* MoveXY *);

(*----------------------------------------------------------------------*)

PROCEDURE Move_Chars_To_Right;

VAR
I : INTEGER;
L : INTEGER;
C : CHAR;
CAttr : BYTE;
Hold_Chars : ARRAY[1..300] OF BYTE;

BEGIN (* Move_Chars_To_Right *)

IF ( NOT Write_Screen_Memory ) THEN
FOR I := ( Wrap_Screen_Col - 1 ) DOWNTO XPos DO
BEGIN
ReadCXY ( C, I, YPos, CAttr );
WriteCXY( C, SUCC( I ), YPos, CAttr );
END
ELSE
BEGIN
(* Freeze screen for DoubleDos *)

IF ( MultiTasker = DoubleDos ) THEN
BEGIN
TurnOffTimeSharing;
Get_Screen_Address( DesqView_Screen );
END;

L := Wrap_Screen_Col - XPos;
I := PRED( ( PRED( YPos ) * Max_Screen_Col + XPos ) SHL 1 );

IF Wait_For_Retrace THEN
BEGIN
MoveFromScreen( DesqView_Screen^.Screen_Image[ I ],
Hold_Chars[1], L );
MoveToScreen ( Hold_Chars[1],
DesqView_Screen^.Screen_Image[ I + 2 ],
L );
END
ELSE
MOVE( DesqView_Screen^.Screen_Image[ I ],
DesqView_Screen^.Screen_Image[ I + 2 ],
L SHL 1 );
(* Unfreeze screen in DoubleDos *)


IF ( MultiTasker = DoubleDos ) THEN
TurnOnTimeSharing
(* Synchronize screen for TopView *)

ELSE IF ( MultiTasker = TopView ) THEN
Sync_Screen( I , SUCC( L ) );

END;

END (* Move_Chars_To_Right *);

(*----------------------------------------------------------------------*)

BEGIN (* Display_Character *)
(* Select display depending on *)
(* character. *)
Disp := FALSE;

IF ( ( ORD( Ch ) < 32 ) AND ( NOT Graphics_Mode ) ) THEN
CASE ORD( Ch ) OF

CR : IF Add_LF THEN
BEGIN
IF Capture_On THEN
Capture_Char( LF_Ch );
IF Printer_On THEN
BEGIN
Write_Prt( CR_Ch );
Write_Prt( LF_Ch );
END;
WRITE( CR_Ch, LF_Ch );
Last_Column_Hit := FALSE;
IF Review_On THEN
Update_Review_Pointers;
END
ELSE
BEGIN
WRITE( CR_Ch );
Last_Column_Hit := FALSE;
IF Printer_On THEN
Write_Prt( CR_Ch );
END;

LF : IF NOT Add_LF THEN
BEGIN
IF Capture_On THEN
Capture_Char( LF_Ch );
WRITE( LF_Ch );
IF Printer_On THEN
Write_Prt( LF_Ch );
IF Review_On THEN
Update_Review_Pointers;
END;

BS : BEGIN
WRITE( Ch );
IF Capture_On THEN
Capture_Char( Ch );
IF Printer_On THEN
Write_Prt( Ch );
IF Review_On THEN
IF ( LENGTH( Review_Line ) > 0 ) THEN
DELETE( Review_Line, LENGTH( Review_Line ), 1 );
END;

NUL : ; (* Strip Nulls *)

(* Strip unattached XONs *)
XON : Disp := NOT Do_Xon_Xoff_Checks;

BELL : IF ( Not Silent_Mode ) THEN
Sound_Bell;

HT : BEGIN

L := 9 - WhereX MOD 8;

FOR I := 1 TO L DO
BEGIN
WRITE( BL_Ch );
IF Review_On THEN
IF ( LENGTH( Review_Line ) < Max_Review_Line_Length ) THEN
Review_Line := Review_Line + ' ';
END;

IF ( Capture_On AND Exact_Capture ) THEN
Capture_Char( Ch );

IF Printer_On THEN
FOR I := 1 TO L DO
Write_Prt( BL_Ch );

END;

VT, FF: BEGIN
IF Capture_On THEN
Capture_Char( Ch );
IF Printer_On THEN
Write_Prt( Ch );
IF ( NOT ( Terminal_To_Emulate IN Ansi_Set ) ) THEN
Clear_Window
ELSE
BEGIN
WRITE( LF_Ch );
IF Review_On THEN
Update_Review_Pointers;
END;
END;

ELSE
Disp := TRUE;

END (* CASE *)
ELSE
Disp := TRUE;

IF Disp AND ( ORD( Ch ) <> DEL ) THEN
BEGIN

XPos := WhereX + PRED( Upper_Left_Column );
YPos := WhereY + PRED( Upper_Left_Row );

IF ( XPos < Wrap_Screen_Col ) THEN
BEGIN
IF Insertion_Mode THEN
Move_Chars_To_Right;
WriteCXY( Ch, XPos, YPos, Global_Text_Attribute );
MoveXY( SUCC( XPos ) , YPos );
Last_Column_Hit := FALSE;
END
ELSE
BEGIN
IF Auto_Wrap_Mode THEN
BEGIN
IF Last_Column_Hit THEN
BEGIN
IF ( Capture_On AND ( NOT Exact_Capture ) ) THEN
Capture_Char( CHR( LF ) );
WRITELN;
XPos := WhereX + PRED( Upper_Left_Column );
YPos := WhereY + PRED( Upper_Left_Row );
END;
Last_Column_Hit := NOT Last_Column_Hit;
WriteCXY( Ch, XPos, YPos, Global_Text_Attribute );
IF ( NOT Last_Column_Hit ) THEN
MoveXY( SUCC( XPos ) , YPos );
END
ELSE
BEGIN
WriteCXY( Ch, Wrap_Screen_Col, YPos, Global_Text_Attribute );
Last_Column_Hit := TRUE;
END;
END;

IF Review_On THEN
IF ( LENGTH( Review_Line ) < Max_Review_Line_Length ) THEN
Review_Line := Review_Line + Ch;

IF Capture_On THEN
Capture_Char( Ch );

IF Printer_On THEN
Write_Prt( Ch );

END;

END (* Display_Character *);


  3 Responses to “Category : Pascal Source Code
Archive   : PIBT41S1.ZIP
Filename : DISPLAYC.MOD

  1. Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!

  2. This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.

  3. But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/