home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / pascal / library / dos / pibsoft / terminal / source / pib4010b.mod < prev    next >
Encoding:
Text File  |  1988-02-21  |  13.0 KB  |  408 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 Kermit_Autodownload THEN
  165.                       BEGIN
  166.                          Doing_Kermit_Autodown := TRUE;
  167.                          PibDownLoad( Kermit );
  168.                       END;
  169.  
  170.          CAN  :    IF Zmodem_Autodownload THEN
  171.                       BEGIN
  172.                          TT := Get_Zmodem_Type;
  173.                          IF ( TT <> None ) THEN
  174.                             PibDownLoad( TT );
  175.                       END;
  176.  
  177.          ELSE
  178.             IF ( C > 31 ) THEN
  179.                BEGIN
  180.                   Plot_Char( Ch, Graphics_XPos, Graphics_YPos );
  181.                   Graphics_XPos := Graphics_XPos + 8;
  182.                   IF ( Graphics_XPos >= 640 ) THEN
  183.                      BEGIN
  184.                         Graphics_XPos := 0;
  185.                         Graphics_YPos := Graphics_YPos + YInc;
  186.                         IF Graphics_YPos > YMaxM1 THEN
  187.                            ScrollUp;
  188.                      END;
  189.  
  190.                END;
  191.  
  192.       END (* CASE *)
  193.  
  194.    ELSE                            (* Graphics mode *)
  195.  
  196.       CASE C OF
  197.  
  198.          FF:      BEGIN
  199.                      Clear_Graphics_Screen;
  200.                      FlagG := Text_Plot;
  201.                   END;
  202.  
  203.          CR:      BEGIN
  204.                      IF LeftH THEN
  205.                         Graphics_XPos := 0
  206.                      ELSE
  207.                         Graphics_XPos := 320;
  208.                      Last_Column_Hit := FALSE;
  209.                      FlagG := Text_Plot;
  210.                   END;
  211.  
  212.          FS:      FlagG := Point_Plot_Start;
  213.  
  214.          GS:      FlagG := Vector_Plot_Start;
  215.  
  216.          US:      FlagG := Text_Plot;
  217.  
  218.          ESC:     Handle_Escape_Sequence;
  219.  
  220.          ELSE
  221.             IF C > 31 THEN
  222.                Do_Graphics;
  223.  
  224.       END (* CASE *);
  225.                                    (* Display cursor *)
  226.  
  227.    Display_Cursor( Graphics_XPos, Graphics_YPos );
  228.  
  229.    CursorX := Graphics_XPos;
  230.    CursorY := Graphics_YPos;
  231.  
  232. END   (* Display_Graphics *);
  233.  
  234. (*----------------------------------------------------------------------*)
  235. (*  Initialize_Graphics_Mode --- Initialize for CGA/EGA differences     *)
  236. (*----------------------------------------------------------------------*)
  237.  
  238. PROCEDURE Initialize_Graphics_Mode;
  239.  
  240. (*----------------------------------------------------------------------*)
  241. (*                                                                      *)
  242. (*     Procedure:  Initialize_Graphics_Mode                             *)
  243. (*                                                                      *)
  244. (*     Purpose:    Set up graphics mode for CGA/EGA differences         *)
  245. (*                                                                      *)
  246. (*     Calling Sequence:                                                *)
  247. (*                                                                      *)
  248. (*        Initialize_Graphics_Mode;                                     *)
  249. (*                                                                      *)
  250. (*----------------------------------------------------------------------*)
  251.  
  252. BEGIN (* Initialize_Graphics_Mode *)
  253.  
  254.                                    (* Determine if EGA installed       *)
  255.  
  256.    EGA_On := EGA_Present;
  257.  
  258.                                    (* Set up depending upon EGA or CGA *)
  259.  
  260.    IF ( EGA_On AND Allow_EGA_Graphics ) THEN
  261.       BEGIN
  262.          XFactor               := 0.625;
  263.          YFactor               := 0.44871795;
  264.          YMax                  := 349;
  265.          YInc                  := 10;
  266.          GMode                 := EGA_GraphMode;
  267.          Write_Graphics_Screen := Write_Screen_Memory;
  268.          EGA_Use               := TRUE;
  269.          Set_EGA_Text_Mode( 25 );
  270.       END
  271.    ELSE
  272.       BEGIN
  273.          XFactor               := 0.625;
  274.          YFactor               := 0.2564103;
  275.          YMax                  := 199;
  276.          YInc                  := 6;
  277.          GMode                 := HiRes_GraphMode;
  278.          Write_Graphics_Screen := Write_Screen_Memory;
  279.          EGA_Use               := FALSE;
  280.       END;
  281.  
  282.    YMaxM1 := PRED( YMax );
  283.  
  284.    IF EGA_Use THEN
  285.       Graphics_Screen := PTR( EGA_Screen_Address   , 0 )
  286.    ELSE
  287.       IF ( MultiTasker <> MultiTasker_None ) THEN
  288.          Graphics_Screen := DesqView_Screen
  289.       ELSE
  290.          Graphics_Screen := PTR( Color_Screen_Address , 0 );
  291.  
  292. END   (* Initialize_Graphics_Mode *);
  293.  
  294. (*----------------------------------------------------------------------*)
  295.  
  296. BEGIN (* Emulate_TEK4010 *)
  297.                                    (* Initialize *)
  298.    Graphics_Terminal_Mode := TRUE;
  299.    Auto_Wrap_Mode         := TRUE;
  300.    Done                   := FALSE;
  301.    Do_Status_Line         := FALSE;
  302.    Do_Status_Time         := FALSE;
  303.    FlagG                  := Text_Plot;
  304.    New_Line               := New_Line_Param;
  305.    Insertion_Mode         := FALSE;
  306.    Save_SUpper            := Send_Upper_Case_Only;
  307.    Send_Upper_Case_Only   := TRUE;
  308.    Do_Script_Tests        := Waitstring_Mode OR When_Mode OR
  309.                              WaitCount_Mode  OR WaitQuiet_Mode OR
  310.                              Script_Learn_Mode;
  311.  
  312.                                    (* Load function keys             *)
  313.    IF Auto_Load_FunKeys THEN
  314.       Load_Function_Keys( 'TEK4010.FNC' );
  315.  
  316.    Graphics_ForeGround_Color := Global_ForeGround_Color;
  317.    Graphics_BackGround_Color := Global_BackGround_Color;
  318.  
  319.                                    (* Set up depending upon EGA/CGA *)
  320.    Initialize_Graphics_Mode;
  321.                                    (* Clear graphics screen      *)
  322.    Clear_Graphics_Screen;
  323.                                    (* Display cursor *)
  324.  
  325.    Display_Cursor( CursorX , CursorY );
  326.  
  327.                                    (* Loop over input until done *)
  328.    WHILE ( NOT Done ) DO
  329.       BEGIN
  330.                                    (* Check for character typed at keyboard *)
  331.          IF PibTerm_KeyPressed THEN
  332.             BEGIN
  333.                Handle_Keyboard_Input( Done , Reset_Requested ,
  334.                                       ClrScr_Req );
  335.                Do_Status_Line        := FALSE;
  336.                Do_Status_Time        := FALSE;
  337.                Write_Graphics_Screen := Write_Screen_Memory;
  338.                IF Reset_Requested THEN
  339.                   BEGIN
  340.                      Clear_Graphics_Screen;
  341.                      Display_Cursor( CursorX, CursorY );
  342.                      FlagG := Text_Plot;
  343.                   END
  344.                ELSE IF ClrScr_Req THEN
  345.                   BEGIN
  346.                      Clear_Graphics_Screen;
  347.                      Display_Cursor( CursorX, CursorY );
  348.                   END;
  349.             END;
  350.                                    (* Process any script in progress *)
  351.  
  352.          IF ( Script_File_Mode AND ( NOT ( Done OR Really_Wait_String ) ) ) THEN
  353.             BEGIN
  354.                Get_Script_Command( PibTerm_Command );
  355.                Execute_Command   ( PibTerm_Command , Done , TRUE );
  356.                Write_Graphics_Screen := Write_Screen_Memory;
  357.             END;
  358.                                    (* Handle carrier drop *)
  359.          IF Carrier_Dropped THEN
  360.             Handle_Carrier_Drop;
  361.                                    (* Hold everything while scroll lock on *)
  362.  
  363.          IF Scroll_Lock_On THEN
  364.             Handle_Scroll_Lock;
  365.  
  366.                                    (* Process character from remote *)
  367.  
  368.          IF ( Async_Buffer_Head <> Async_Buffer_Tail ) THEN
  369.             BEGIN
  370.                                    (* Get the character *)
  371.  
  372.                B := Async_Receive( Ch );
  373.  
  374.                                    (* Strip high bit if requested *)
  375.  
  376.                IF Auto_Strip_High_Bit THEN
  377.                   Ch := CHR( ORD( Ch ) AND $7F );
  378.  
  379.                                    (* Perform translation *)
  380.  
  381.                Ch := TrTab[Ch];
  382.  
  383.                                    (* Display the character received *)
  384.  
  385.                Display_Graphics( Ch );
  386.  
  387.                IF Do_Script_Tests THEN
  388.                   Do_Script_Checks( Ch );
  389.  
  390.             END
  391.                                    (* Check if waitstring time exhausted *)
  392.          ELSE
  393.             BEGIN
  394.                Async_Line_Status := Async_Line_Status AND $FD;
  395.                IF Really_Wait_String THEN
  396.                   Check_Wait_String_Time;
  397.                IF ( ( NOT PibTerm_KeyPressed ) AND ( NOT Script_File_Mode ) ) THEN
  398.                   IF ( Async_Buffer_Head = Async_Buffer_Tail ) THEN
  399.                      GiveAwayTime( 1 );
  400.             END;
  401.  
  402.       END;
  403.  
  404.    Graphics_Terminal_Mode := FALSE;
  405.    Send_Upper_Case_Only   := Save_SUpper;
  406.  
  407. END   (* Emulate_TEK4010 *);
  408.