home *** CD-ROM | disk | FTP | other *** search
/ Power Programming / powerprogramming1994.iso / progtool / pibterm / pibt41s1.arc / DOCISBA.MOD < prev    next >
Text File  |  1988-02-12  |  12KB  |  405 lines

  1. {
  2.     QUICKB.INC - Quick B Protocol Support routines
  3.           (derived from BPROTO.INC)
  4.  
  5.     Copyright 1987, CompuServe Incorporated
  6.  
  7.     These routines may be used as-is or in modified form in any
  8.     personal computer terminal program to implement support of the
  9.     CompuServe B and Quick B Protocols for the purpose of transfering
  10.     information between CompuServe hosts and a personal computer.
  11.  
  12.     Implementation of B and/or Quick B Protocols in any host environment
  13.     requires explicit licensing from CompuServe Incorporated.
  14.  
  15.     No warranty, expressed or implied, covers this code, or the specifications
  16.     of the B and Quick B Protocols.
  17.  
  18.  
  19.   Last update:
  20.        Russ Ranshaw      10-Oct-87
  21.  
  22.   This source was originally derived from BP.C, written by
  23.   Steve Wilhite, CompuServe Incorporated.
  24.  
  25.   Modified for PibTerm V4.0.7 by Philip R. Burns.   87-12-20.
  26.  
  27. }
  28.  
  29. (*----------------------------------------------------------------------*)
  30. (*  Initialize_Transfer_Display --- Initialize transfer display window  *)
  31. (*----------------------------------------------------------------------*)
  32.  
  33. PROCEDURE Initialize_Transfer_Display;
  34.  
  35. BEGIN (* Initialize_Transfer_Display *)
  36.  
  37.    Draw_Menu_Frame( 5, 10, 75, 20, Menu_Frame_Color, Menu_Title_Color,
  38.                     Menu_Text_Color, Comp_Title );
  39.  
  40.    TextColor( Menu_Text_Color_2 );
  41.  
  42.    GoToXY( 1 , 1 );
  43.    WRITE('Packets transferred: ');
  44.  
  45.    GoToXY( 1 , 2 );
  46.    WRITE('Bytes transferred  : ');
  47.  
  48.    GoToXY( 1 , 3 );
  49.    WRITE('Total errors       : ');
  50.  
  51.    GoToXY( 1 , 4 );
  52.  
  53.    IF ( NOT Receiving_File ) THEN
  54.       WRITE('Bytes to send      : ');
  55.  
  56.    ClrEol;
  57.  
  58.    GoToXY( 1 , 5 );
  59.    WRITE('Quick B protocol   : ');
  60.  
  61.    TextColor( Menu_Text_Color );
  62.  
  63.    IF Quick_B THEN
  64.       WRITE('ON ')
  65.    ELSE
  66.       WRITE('OFF');
  67.  
  68.    TextColor( Menu_Text_Color_2 );
  69.  
  70.    GoToXY( 1 , 6 );
  71.    WRITE('Block check type   : ');
  72.  
  73.    TextColor( Menu_Text_Color );
  74.  
  75.    IF Use_CRC THEN
  76.       WRITE('16-bit CRC')
  77.    ELSE
  78.       WRITE('8-bit Checksum');
  79.    ClrEol;
  80.  
  81.    TextColor( Menu_Text_Color_2 );
  82.  
  83.    GoToXY( 1 , 7 );
  84.    WRITE('Block length       : ');
  85.  
  86.    TextColor( Menu_Text_Color );
  87.  
  88.    WRITE( Buffer_Size);
  89.    ClrEol;
  90.  
  91.    TextColor( Menu_Text_Color_2 );
  92.  
  93.    GoToXY( 1 , 8 );
  94.    WRITE('Send ahead         : ');
  95.  
  96.    TextColor( Menu_Text_Color );
  97.  
  98.    IF ( Our_WS <> 0 ) THEN
  99.       WRITE('ON ')
  100.    ELSE
  101.       WRITE('OFF');
  102.  
  103.    TextColor( Menu_Text_Color_2 );
  104.  
  105.    GoToXY( 1 , Err_Mess_Line );
  106.    WRITE('Last status message: ');
  107.    ClrEol;
  108.  
  109.    CursorOff;
  110.  
  111.    TextColor( Menu_Text_Color );
  112.  
  113.    Write_Log( Comp_Title, FALSE, FALSE );
  114.  
  115. END   (* Initialize_Transfer_Display *);
  116.  
  117. (*----------------------------------------------------------------------*)
  118. (*            Update_B_Display --- Update blocks received display       *)
  119. (*----------------------------------------------------------------------*)
  120.  
  121. PROCEDURE Update_B_Display;
  122.  
  123. BEGIN (* Update_B_Display *)
  124.  
  125.    IF Display_Status THEN
  126.       BEGIN
  127.  
  128.          TextColor( Menu_Text_Color );
  129.  
  130.          GoToXY( 22 , 1 );
  131.          WRITE( Total_Packets );
  132.          ClrEol;
  133.  
  134.          GoToXY( 22 , 2 );
  135.          WRITE( Total_Bytes );
  136.          ClrEol;
  137.  
  138.          GoToXY( 22 , 3 );
  139.          WRITE( Total_Errors );
  140.          ClrEol;
  141.  
  142.          IF ( NOT Receiving_File ) THEN
  143.             BEGIN
  144.                GoToXY( 22 , 4 );
  145.                WRITE( TFile_Size );
  146.                ClrEol;
  147.             END;
  148.  
  149.       END;
  150.  
  151. END   (* Update_B_Display *);
  152.  
  153. (*----------------------------------------------------------------------*)
  154. (*        Flip_Display_Status --- turn status display on/off            *)
  155. (*----------------------------------------------------------------------*)
  156.  
  157. PROCEDURE Flip_Display_Status;
  158.  
  159. BEGIN (* Flip_Display_Status *)
  160.  
  161.    CASE Display_Status OF
  162.  
  163.       TRUE:   BEGIN
  164.                                    (* Indicate no display   *)
  165.  
  166.                  Display_Status := FALSE;
  167.  
  168.                                    (* Remove display window  *)
  169.  
  170.                  Restore_Screen_And_Colors( Saved_Screen );
  171.  
  172.                                    (* Restore cursor *)
  173.                  CursorOn;
  174.  
  175.               END;
  176.  
  177.       FALSE:  BEGIN
  178.                                    (* Indicate display will be done *)
  179.  
  180.                  Display_Status := TRUE;
  181.  
  182.                                    (* Save screen image *)
  183.  
  184.                  Save_Partial_Screen( Saved_Screen, 5, 10, 75, 20 );
  185.  
  186.                                    (* Initialize display window     *)
  187.  
  188.                  Initialize_Transfer_Display;
  189.  
  190.               END;
  191.  
  192.    END (* CASE *);
  193.  
  194. END   (* Flip_Display_Status *);
  195.  
  196. (*----------------------------------------------------------------------*)
  197. (*        Display_Message --- Display message in transfer window        *)
  198. (*----------------------------------------------------------------------*)
  199.  
  200. PROCEDURE Display_Message( Message: AnyStr; Line : INTEGER );
  201.  
  202. BEGIN (* Display_Message *)
  203.  
  204.    IF ( NOT Display_Status ) THEN
  205.       Flip_Display_Status;
  206.  
  207.    TextColor( Menu_Text_Color );
  208.  
  209.    GoToXY( 22 , Line );
  210.    WRITE( Message );
  211.    ClrEol;
  212.  
  213.    Write_Log( Message, TRUE, FALSE );
  214.  
  215. END   (* Display_Message *);
  216.  
  217. (*----------------------------------------------------------------------*)
  218. (*     Display_Message_With_Number --- Display message with a number    *)
  219. (*----------------------------------------------------------------------*)
  220.  
  221. PROCEDURE Display_Message_With_Number( Message: AnyStr; Number: INTEGER );
  222.  
  223. VAR
  224.    S: STRING[10];
  225.  
  226. BEGIN (* Display_Message_With_Number *)
  227.  
  228.    IF ( NOT Display_Status ) THEN
  229.       Flip_Display_Status;
  230.  
  231.    TextColor( Menu_Text_Color );
  232.  
  233.    GoToXY( 22 , Err_Mess_Line );
  234.    WRITE( Message , Number );
  235.    ClrEol;
  236.  
  237.    STR( Number , S );
  238.  
  239.    Write_Log( Message + S, TRUE, FALSE );
  240.  
  241. END   (* Display_Message_With_Number *);
  242.  
  243. (*----------------------------------------------------------------------*)
  244. (*               Check_Keyboard --- Check for keyboard entry            *)
  245. (*----------------------------------------------------------------------*)
  246.  
  247. PROCEDURE Check_Keyboard;
  248.  
  249. VAR
  250.    Ch: CHAR;
  251.  
  252. BEGIN (* Check_Keyboard *)
  253.                                    (* See if keyboard key depressed *)
  254.    IF PibTerm_KeyPressed THEN
  255.       BEGIN
  256.                                    (* Yes -- read character *)
  257.          Read_Kbd( Ch );
  258.                                    (* If it is an escape, check  *)
  259.                                    (* for extended key sequence. *)
  260.  
  261.          IF ( Ch = CHR( ESC ) ) THEN
  262.             IF PibTerm_KeyPressed THEN
  263.                BEGIN
  264.                                    (* Handle extended key sequence *)
  265.                   Read_Kbd( Ch );
  266.  
  267.                   CASE ORD( Ch ) OF
  268.                      Alt_R:      IF Receiving_File THEN
  269.                                     Halt_Transfer := TRUE;
  270.                      Alt_S:      IF ( NOT Receiving_File ) THEN
  271.                                     Halt_Transfer := TRUE;
  272.                      Shift_Tab:  Flip_Display_Status;
  273.                      ELSE        Handle_Function_Key( Ch );
  274.                   END;
  275.  
  276.                END
  277.             ELSE
  278.                                    (* Plain ESC -- see if we're to clear *)
  279.                                    (* XOFF received flag                 *)
  280.  
  281.                IF Async_XOff_Received THEN
  282.                   Clear_XOFF_Received;
  283.  
  284.       END;
  285.                                    (* Print something from spool file *)
  286.                                    (* while we're here.               *)
  287.    IF Print_Spooling THEN
  288.       Print_Spooled_File;
  289.  
  290. END   (* Check_Keyboard *);
  291.  
  292. (*----------------------------------------------------------------------*)
  293. (*            Do_CheckSum --- Do CRC or CheckSum calculation            *)
  294. (*----------------------------------------------------------------------*)
  295.  
  296. PROCEDURE Do_CheckSum( Ch : INTEGER );
  297.  
  298. BEGIN (* Do_CheckSum *)
  299.  
  300.    IF ( Quick_B AND Use_CRC ) THEN
  301.       BEGIN
  302.          CheckSum := SWAP( CheckSum ) XOR Ch;
  303.          CheckSum := CheckSum XOR ( LO( CheckSum ) SHR 4 );
  304.          CheckSum := CheckSum XOR ( SWAP( LO( CheckSum ) ) SHL 4 ) XOR
  305.                                   ( LO( CheckSum ) SHL 5 );
  306.       END
  307.    ELSE
  308.       BEGIN
  309.  
  310.          CheckSum := CheckSum SHL 1;
  311.  
  312.          IF ( CheckSum > 255 ) THEN
  313.             CheckSum := SUCC( CheckSum AND $FF );
  314.  
  315.          CheckSum := CheckSum + Ch;
  316.  
  317.          IF ( CheckSum > 255 ) THEN
  318.             CheckSum := SUCC( CheckSum AND $FF );
  319.  
  320.       END;
  321.  
  322. END   (* Do_CheckSum *);
  323.  
  324. (*----------------------------------------------------------------------*)
  325. (*               CISB_Term_ENQ --- Initialize CIS B Protocol            *)
  326. (*----------------------------------------------------------------------*)
  327.  
  328. PROCEDURE CISB_Term_ENQ;
  329.  
  330. (*----------------------------------------------------------------------*)
  331. (*                                                                      *)
  332. (*  CISB_Term_ENQ is called when the terminal emulator receives the     *)
  333. (*  character <ENQ> from the host.  Its purpose is to initialize for    *)
  334. (*  B Protocol and tell the host that we support Quick B.               *)
  335. (*                                                                      *)
  336. (*----------------------------------------------------------------------*)
  337.  
  338. BEGIN (* CISB_Term_ENQ *)
  339.  
  340.    Seq_Num     := 0;
  341.    Buffer_Size := 511;               { Set up defaults }
  342.    Quick_B     := FALSE;             { Not Quick B Protocol }
  343.    Use_CRC     := FALSE;             { Not CRC_16      }
  344.    SA_Enabled  := FALSE;             { No Send-Ahead by us }
  345.    SA_Max      := 1;                 { = single packet sent }
  346.  
  347.    Async_Send( CHR( DLE ) );
  348.    Async_Send( '+' );
  349.  
  350.    Async_Send( CHR( DLE ) );
  351.    Async_Send( '0' );
  352.  
  353. END  (* CISB_Term_ENQ *);
  354.  
  355. (*----------------------------------------------------------------------*)
  356. (*            CISB_Term_ESC_I --- Handle <ESC>I sequence                *)
  357. (*----------------------------------------------------------------------*)
  358.  
  359. PROCEDURE CISB_Term_ESC_I;
  360.  
  361. (*----------------------------------------------------------------------*)
  362. (*                                                                      *)
  363. (*  CISB_Term_ESC_I is called when <ESC><I> is received by the terminal *)
  364. (*  emulator.   Note that Quick B allows +XX to be added to the end of  *)
  365. (*  the response, where XX is the two hex digits of the standard B      *)
  366. (*  Protocol CheckSum of the preceeding characters in the response.     *)
  367. (*                                                                      *)
  368. (*----------------------------------------------------------------------*)
  369.  
  370. CONST
  371.    ESC_I_Response : STRING[12] = '#VCO,PB,DT,+';
  372.  
  373. VAR
  374.    Save_Use_CRC : BOOLEAN;
  375.    I            : INTEGER;
  376.    T            : ShortStr;
  377.  
  378. BEGIN (* CISB_Term_ESC_I *)
  379.                                    (* Save CRC setting, as this response *)
  380.                                    (* is always sent using checksum.     *)
  381.    Save_Use_CRC := Use_CRC;
  382.    Use_CRC      := FALSE;
  383.                                    (* Send <ESC>I text *)
  384.    CheckSum := 0;
  385.  
  386.    FOR  I := 1 TO LENGTH( ESC_I_Response ) DO
  387.       BEGIN
  388.          Async_Send (      ESC_I_Response[ I ]   );
  389.          Do_CheckSum( ORD( ESC_I_Response[ I ] ) );
  390.       END;
  391.                                    (* Append two hex digits of *)
  392.                                    (* CheckSum to response     *)
  393.  
  394.    T := Dec_To_Hex( WORD( CheckSum ) );
  395.  
  396.    Async_Send( T[3] );
  397.    Async_Send( T[4] );
  398.  
  399.    Async_Send( CHR( CR ) );
  400.                                    (* Restore CRC flag *)
  401.    Use_CRC := Save_Use_CRC;
  402.  
  403. END   (* CISB_Term_ESC_I *);
  404.  
  405.