home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / INFO / PIBTERM / PIBT41S2.ARC / PIB4010B.MOD < prev    next >
Encoding:
Text File  |  1988-03-23  |  12.7 KB  |  399 lines

  1. (*----------------------------------------------------------------------*)
  2. (*          Scroll_Up --- Handle graphics screen scroll                 *)
  3. (*----------------------------------------------------------------------*)
  4.  
  5. PROCEDURE ScrollUp;
  6.  
  7. BEGIN (* ScrollUp *)
  8.  
  9.    IF LeftH THEN
  10.       BEGIN
  11.          LeftH := FALSE;
  12.          Graphics_XPos := 320;
  13.       END
  14.    ELSE
  15.       BEGIN
  16.          LeftH := TRUE;
  17.          Graphics_XPos := 0;
  18.       END;
  19.  
  20.    Graphics_YPos := 5;
  21.  
  22. END   (* ScrollUp *);
  23.  
  24. (*----------------------------------------------------------------------*)
  25. (*           Handle_Escape_Sequence --- Handle escape sequence          *)
  26. (*----------------------------------------------------------------------*)
  27.  
  28. PROCEDURE Handle_Escape_Sequence;
  29.  
  30. VAR
  31.    Ch: CHAR;
  32.  
  33. (*----------------------------------------------------------------------*)
  34.  
  35. FUNCTION Async_Next_Character : CHAR;
  36.  
  37. VAR
  38.    C:  INTEGER;
  39.  
  40. BEGIN (* Async_Next_Character *)
  41.  
  42.    Async_Receive_With_Timeout( 5 , C );
  43.  
  44.    IF ( C <> TimeOut ) THEN
  45.       Async_Next_Character := CHR( C )
  46.    ELSE
  47.       Async_Next_Character := CHR(0);
  48.  
  49. END   (* Async_Next_Character *);
  50.  
  51. (*----------------------------------------------------------------------*)
  52.  
  53. BEGIN (* Handle_Escape_Sequence *)
  54.  
  55.    CASE Async_Next_Character OF
  56.  
  57.       '/':      BEGIN
  58.                    IF Async_Next_Character IN ['0'..'2'] THEN
  59.                       IF Async_Next_Character = 'd' THEN;
  60.                 END;
  61.  
  62.       '8','9',':',';','?','''': ;
  63.  
  64.       'a'..'z': ;
  65.  
  66.       '"':      BEGIN
  67.                    IF Async_Next_Character IN ['0'..'7'] THEN
  68.                       IF Async_Next_Character IN ['e','g'] THEN;
  69.                 END;
  70.  
  71.       Ch_FF:    BEGIN
  72.                    Clear_Graphics_Screen;
  73.                    FlagG := Text_Plot;
  74.                 END;
  75.  
  76.       Ch_FS:   FlagG := Point_Plot_Start;
  77.  
  78.       Ch_GS:   FlagG := Vector_Plot_Start;
  79.  
  80.       ELSE;
  81.  
  82.    END (* CASE *);
  83.  
  84. END   (* Handle_Escape_Sequence *);
  85.  
  86. (*----------------------------------------------------------------------*)
  87.  
  88. BEGIN (* Display_Graphics *)
  89.                                    (* Remove current cursor       *)
  90.  
  91.    Display_Cursor( CursorX, CursorY );
  92.  
  93.                                    (* Select display depending on *)
  94.                                    (* character.                  *)
  95.    C := ORD( Ch );
  96.  
  97.    IF ( FlagG = Text_Plot ) THEN
  98.       CASE C OF
  99.  
  100.          NUL  :    ;       (* Strip Nulls              *)
  101.          DEL  :    ;       (* Strip Deletes            *)
  102.  
  103.          ESC  :    Handle_Escape_Sequence;
  104.  
  105.          BS   :    BEGIN
  106.                       IF LeftH THEN
  107.                          Graphics_XPos := MAX( Graphics_Xpos - 8 , 0 )
  108.                       ELSE
  109.                          Graphics_XPos := MAX( Graphics_Xpos - 8 , 320 );
  110.                    END;
  111.  
  112.          BELL :    IF Not Silent_Mode THEN
  113.                       WRITE( Ch );
  114.  
  115.          HT   :    BEGIN
  116.  
  117.                       L := 9 - WhereX MOD 8;
  118.  
  119.                       FOR I := 1 TO L DO
  120.                          BEGIN
  121.                             Plot_Char( BL_Ch, Graphics_XPos, Graphics_YPos );
  122.                             Graphics_XPos := Graphics_XPos + 8;
  123.                          END;
  124.  
  125.                    END;
  126.  
  127.          FF   :    Clear_Graphics_Screen;
  128.  
  129.          CR   :    IF Add_LF THEN
  130.                       BEGIN
  131.                          Graphics_YPos := Graphics_YPos + YInc;
  132.                          Last_Column_Hit := FALSE;
  133.                          IF Graphics_YPos > YMaxM1 THEN
  134.                             ScrollUp
  135.                          ELSE IF LeftH THEN
  136.                             Graphics_XPos := 0
  137.                          ELSE
  138.                             Graphics_XPos := 320;
  139.                       END
  140.                    ELSE
  141.                       BEGIN
  142.                          IF LeftH THEN
  143.                             Graphics_XPos := 0
  144.                          ELSE
  145.                             Graphics_XPos := 320;
  146.                          Last_Column_Hit := FALSE;
  147.                       END;
  148.  
  149.  
  150.          LF   :    IF NOT Add_LF THEN
  151.                       BEGIN
  152.                          Graphics_YPos := Graphics_YPos + YInc;
  153.                          IF Graphics_YPos > YMaxM1 THEN
  154.                             ScrollUp;
  155.                       END;
  156.  
  157.          VT   :    IF ( Graphics_YPos > YInc ) THEN
  158.                       Graphics_YPos := Graphics_YPos - YInc;
  159.  
  160.          FS   :    FlagG := Point_Plot_Start;
  161.  
  162.          GS   :    FlagG := Vector_Plot_Start;
  163.  
  164.          SOH  :    IF ( NOT Handle_Kermit_Autodownload ) THEN;
  165.  
  166.          CAN  :    IF ( NOT Handle_Zmodem_Autodownload ) THEN;
  167.  
  168.          ELSE
  169.             IF ( C > 31 ) THEN
  170.                BEGIN
  171.                   Plot_Char( Ch, Graphics_XPos, Graphics_YPos );
  172.                   Graphics_XPos := Graphics_XPos + 8;
  173.                   IF ( Graphics_XPos >= 640 ) THEN
  174.                      BEGIN
  175.                         Graphics_XPos := 0;
  176.                         Graphics_YPos := Graphics_YPos + YInc;
  177.                         IF Graphics_YPos > YMaxM1 THEN
  178.                            ScrollUp;
  179.                      END;
  180.  
  181.                END;
  182.  
  183.       END (* CASE *)
  184.  
  185.    ELSE                            (* Graphics mode *)
  186.  
  187.       CASE C OF
  188.  
  189.          FF:      BEGIN
  190.                      Clear_Graphics_Screen;
  191.                      FlagG := Text_Plot;
  192.                   END;
  193.  
  194.          CR:      BEGIN
  195.                      IF LeftH THEN
  196.                         Graphics_XPos := 0
  197.                      ELSE
  198.                         Graphics_XPos := 320;
  199.                      Last_Column_Hit := FALSE;
  200.                      FlagG := Text_Plot;
  201.                   END;
  202.  
  203.          FS:      FlagG := Point_Plot_Start;
  204.  
  205.          GS:      FlagG := Vector_Plot_Start;
  206.  
  207.          US:      FlagG := Text_Plot;
  208.  
  209.          ESC:     Handle_Escape_Sequence;
  210.  
  211.          ELSE
  212.             IF C > 31 THEN
  213.                Do_Graphics;
  214.  
  215.       END (* CASE *);
  216.                                    (* Display cursor *)
  217.  
  218.    Display_Cursor( Graphics_XPos, Graphics_YPos );
  219.  
  220.    CursorX := Graphics_XPos;
  221.    CursorY := Graphics_YPos;
  222.  
  223. END   (* Display_Graphics *);
  224.  
  225. (*----------------------------------------------------------------------*)
  226. (*  Initialize_Graphics_Mode --- Initialize for CGA/EGA differences     *)
  227. (*----------------------------------------------------------------------*)
  228.  
  229. PROCEDURE Initialize_Graphics_Mode;
  230.  
  231. (*----------------------------------------------------------------------*)
  232. (*                                                                      *)
  233. (*     Procedure:  Initialize_Graphics_Mode                             *)
  234. (*                                                                      *)
  235. (*     Purpose:    Set up graphics mode for CGA/EGA differences         *)
  236. (*                                                                      *)
  237. (*     Calling Sequence:                                                *)
  238. (*                                                                      *)
  239. (*        Initialize_Graphics_Mode;                                     *)
  240. (*                                                                      *)
  241. (*----------------------------------------------------------------------*)
  242.  
  243. BEGIN (* Initialize_Graphics_Mode *)
  244.  
  245.                                    (* Determine if EGA installed       *)
  246.  
  247.    EGA_On := EGA_Present;
  248.  
  249.                                    (* Set up depending upon EGA or CGA *)
  250.  
  251.    IF ( EGA_On AND Allow_EGA_Graphics ) THEN
  252.       BEGIN
  253.          XFactor               := 0.625;
  254.          YFactor               := 0.44871795;
  255.          YMax                  := 349;
  256.          YInc                  := 10;
  257.          GMode                 := EGA_GraphMode;
  258.          Write_Graphics_Screen := Write_Screen_Memory;
  259.          EGA_Use               := TRUE;
  260.          Set_EGA_Text_Mode( 25 );
  261.       END
  262.    ELSE
  263.       BEGIN
  264.          XFactor               := 0.625;
  265.          YFactor               := 0.2564103;
  266.          YMax                  := 199;
  267.          YInc                  := 6;
  268.          GMode                 := HiRes_GraphMode;
  269.          Write_Graphics_Screen := Write_Screen_Memory;
  270.          EGA_Use               := FALSE;
  271.       END;
  272.  
  273.    YMaxM1 := PRED( YMax );
  274.  
  275.    IF EGA_Use THEN
  276.       Graphics_Screen := PTR( EGA_Screen_Address   , 0 )
  277.    ELSE
  278.       IF ( MultiTasker <> MultiTasker_None ) THEN
  279.          Graphics_Screen := DesqView_Screen
  280.       ELSE
  281.          Graphics_Screen := PTR( Color_Screen_Address , 0 );
  282.  
  283. END   (* Initialize_Graphics_Mode *);
  284.  
  285. (*----------------------------------------------------------------------*)
  286.  
  287. BEGIN (* Emulate_TEK4010 *)
  288.                                    (* Initialize *)
  289.    Graphics_Terminal_Mode := TRUE;
  290.    Auto_Wrap_Mode         := TRUE;
  291.    Done                   := FALSE;
  292.    Do_Status_Line         := FALSE;
  293.    Do_Status_Time         := FALSE;
  294.    FlagG                  := Text_Plot;
  295.    New_Line               := New_Line_Param;
  296.    Insertion_Mode         := FALSE;
  297.    Save_SUpper            := Send_Upper_Case_Only;
  298.    Send_Upper_Case_Only   := TRUE;
  299.    Do_Script_Tests        := Waitstring_Mode OR When_Mode OR
  300.                              WaitCount_Mode  OR WaitQuiet_Mode OR
  301.                              Script_Learn_Mode;
  302.  
  303.                                    (* Load function keys             *)
  304.    IF Auto_Load_FunKeys THEN
  305.       Load_Function_Keys( 'TEK4010.FNC' );
  306.  
  307.    Graphics_ForeGround_Color := Global_ForeGround_Color;
  308.    Graphics_BackGround_Color := Global_BackGround_Color;
  309.  
  310.                                    (* Set up depending upon EGA/CGA *)
  311.    Initialize_Graphics_Mode;
  312.                                    (* Clear graphics screen      *)
  313.    Clear_Graphics_Screen;
  314.                                    (* Display cursor *)
  315.  
  316.    Display_Cursor( CursorX , CursorY );
  317.  
  318.                                    (* Loop over input until done *)
  319.    WHILE ( NOT Done ) DO
  320.       BEGIN
  321.                                    (* Check for character typed at keyboard *)
  322.          IF PibTerm_KeyPressed THEN
  323.             BEGIN
  324.                Handle_Keyboard_Input( Done , Reset_Requested ,
  325.                                       ClrScr_Req );
  326.                Do_Status_Line        := FALSE;
  327.                Do_Status_Time        := FALSE;
  328.                Write_Graphics_Screen := Write_Screen_Memory;
  329.                IF Reset_Requested THEN
  330.                   BEGIN
  331.                      Clear_Graphics_Screen;
  332.                      Display_Cursor( CursorX, CursorY );
  333.                      FlagG := Text_Plot;
  334.                   END
  335.                ELSE IF ClrScr_Req THEN
  336.                   BEGIN
  337.                      Clear_Graphics_Screen;
  338.                      Display_Cursor( CursorX, CursorY );
  339.                   END;
  340.             END;
  341.                                    (* Process any script in progress *)
  342.  
  343.          IF ( Script_File_Mode AND ( NOT ( Done OR Really_Wait_String ) ) ) THEN
  344.             BEGIN
  345.                Get_Script_Command( PibTerm_Command );
  346.                Execute_Command   ( PibTerm_Command , Done , TRUE );
  347.                Write_Graphics_Screen := Write_Screen_Memory;
  348.             END;
  349.                                    (* Handle carrier drop *)
  350.          IF Carrier_Dropped THEN
  351.             Handle_Carrier_Drop;
  352.                                    (* Hold everything while scroll lock on *)
  353.  
  354.          IF Scroll_Lock_On THEN
  355.             Handle_Scroll_Lock;
  356.  
  357.                                    (* Process character from remote *)
  358.  
  359.          IF ( Async_Buffer_Head <> Async_Buffer_Tail ) THEN
  360.             BEGIN
  361.                                    (* Get the character *)
  362.  
  363.                B := Async_Receive( Ch );
  364.  
  365.                                    (* Strip high bit if requested *)
  366.  
  367.                IF Auto_Strip_High_Bit THEN
  368.                   Ch := CHR( ORD( Ch ) AND $7F );
  369.  
  370.                                    (* Perform translation *)
  371.  
  372.                Ch := TrTab[Ch];
  373.  
  374.                                    (* Display the character received *)
  375.  
  376.                Display_Graphics( Ch );
  377.  
  378.                IF Do_Script_Tests THEN
  379.                   Do_Script_Checks( Ch );
  380.  
  381.             END
  382.                                    (* Check if waitstring time exhausted *)
  383.          ELSE
  384.             BEGIN
  385.                Async_Line_Status := Async_Line_Status AND $FD;
  386.                IF Really_Wait_String THEN
  387.                   Check_Wait_String_Time;
  388.                IF ( ( NOT PibTerm_KeyPressed ) AND ( NOT Script_File_Mode ) ) THEN
  389.                   IF ( Async_Buffer_Head = Async_Buffer_Tail ) THEN
  390.                      GiveAwayTime( 1 );
  391.             END;
  392.  
  393.       END;
  394.  
  395.    Graphics_Terminal_Mode := FALSE;
  396.    Send_Upper_Case_Only   := Save_SUpper;
  397.  
  398. END   (* Emulate_TEK4010 *);
  399.