home *** CD-ROM | disk | FTP | other *** search
/ Columbia Kermit / kermit.zip / burroughs / b68ker.alg next >
Text File  |  2020-01-01  |  84KB  |  1,033 lines

  1. $SET LIST STACK LINEINFO LISTINCL FORMAT $ ERRLIST                      00000001
  2. $SET LEVEL 2                                                            00000002
  3. PROCEDURE KERMIT (INIT);                                                01000000
  4.     ARRAY INIT[*];                                                      01001000
  5.   BEGIN                                                                 01002000
  6. DEFINE                                                                  10000000
  7.                 %  PACKET LENGTH DEFINES                                10001000
  8.         MYPAD   = 10 #  % # OF PAD CHARS (SET EXPERIMENTALLY)           10002000
  9.     ,   MYTIMOUT= 5 #   % SECONDS TO WAIT BEFORE TIMEOUT                10002500
  10.     ,   MAXPACKET       = 96 #   % MAXIMUM LENGTH OF A PACKET           10003000
  11.     ,   MAXDATA         = (MAXPACKET - 5) #  % MOST DATA IN PACKET      10004000
  12.     ,   PADPACKETLENGTH = (MAXPACKET + MYPAD) #  % MOST WE MIGHT RECEIVE10005000
  13.     ,   MAXINTEGER      = 4"7FFFFFFFFF" # % LARGEST INTEGER ON B6800    10005250
  14.     ,   RETRYLIMIT      = 10 #  % NUMBER OF NAK RETRIES BEFORE ABORT    10005500
  15.     ;                                                                   10006000
  16. REAL MARK, SEQ, STATE                                                   11000000
  17.     , YOURMAXBUFF, YOURNPAD, YOURPAD, YOUREOL, YOURQUOTE, YOUR8BIT      11000250
  18.     , YOURREPEAT, YOURTIMOUT                                            11000500
  19.     ;                                                                   11000750
  20. BOOLEAN DEBUGGING, RSLT, AUTOING;                                       11001000
  21. FILE    RMT (KIND=REMOTE,FRAMESIZE=8, MYUSE=IO                          11002000
  22.             ,MAXRECSIZE=PADPACKETLENGTH,MINRECSIZE=1                    11003000
  23.             )                                                           11004000
  24.     ,   FYLE (KIND=DISK, FRAMESIZE=8)                                   11004500
  25.     ,   DEBUGFILE (KIND=PRINTER, FRAMESIZE=8)                           11005000
  26.     ;                                                                   11006000
  27. ARRAY CTLCHARS [0:7];   % DYNAMIC TRUTHSET: CHARS NEEDING CTL QUOTING   11700000
  28. DEFINE B = BOOLEAN #                                                    120010020.01.002
  29.      , R = REAL #                                                       120010040.01.002
  30.      , P = POINTER #                                                    120010060.01.002
  31.      , INT = INTEGER #                                                  120010080.01.002
  32.      , SIGNF = [46:1] #                                                 1200101001.188.000
  33.      , LISTOF2(L1,L2)                     = L1,L2                      #1200101201.188.004
  34.      , LISTOF3(L1,L2,L3)                  = L1,L2,L3                   #1200101401.188.004
  35.      , LISTOF4(L1,L2,L3,L4)               = L1,L2,L3,L4                #1200101601.188.004
  36.      , LISTOF5(L1,L2,L3,L4,L5)            = L1,L2,L3,L4,L5             #1200101801.188.004
  37.      , LISTOF6(L1,L2,L3,L4,L5,L6)         = L1,L2,L3,L4,L5,L6          #1200102001.188.004
  38.      , LISTOF7(L1,L2,L3,L4,L5,L6,L7)      = L1,L2,L3,L4,L5,L6,L7       #1200102201.188.004
  39.      , LISTOF8(L1,L2,L3,L4,L5,L6,L7,L8)   = L1,L2,L3,L4,L5,L6,L7,L8    #1200102401.188.004
  40.      , LISTOF9(L1,L2,L3,L4,L5,L6,L7,L8,L9)= L1,L2,L3,L4,L5,L6,L7,L8,L9 #1200102601.188.004
  41.      , FILEEOF    =  [9:1] #                                            1200102801.188.000
  42.      , FILEBRK    = [13:1] #                                            1200103001.188.000
  43.      , ALLONES    = REAL(NOT FALSE) #                                   1200103201.188.007
  44.      , ORD(X) = REAL(X,1) # %ORDINAL OF CHARACTER                       120010340.01.002
  45.      , CHAR(X) = ((X).[7:48]) FOR 1 # % CHARACTER VALUE OF INTEGER      12001036
  46.                                      % OR ALPHA EXPRESSION              120010380.01.002
  47.      , ERRORCODEF = [47:47] #  % FOR PUTTING A REAL VALUE INTO A BOOLEAN12001040
  48.      , POP(X) = X:=*.ERRORCODEF #                                       12001042
  49.      , POPPED(X) = (X).ERRORCODEF #                                     12001044
  50.      , PUSHIN(X) = (X) ERRORCODEF #                                     12001046
  51.      , BOOLINTOBOOL (B1,B2) = B2 & PUSHIN(B1) #                         12001048
  52.      , REALINTOBOOL (R,B) = BOOLINTOBOOL (BOOLEAN(R),B)#                12001050
  53.      , LINKF      = [19:20] #  % STANDARD LINK FIELD                    12001052
  54.      , SZ(X)      = 0:X-1 #    % FOR ARRAY DECLARATION                  12001054
  55.      ;                                                                  12001056
  56. PROCEDURE DUMPARRAY (WIRETAP,L,SOU,TYPE,INASCII);                       12002010
  57.     VALUE                    L,SOU,TYPE,INASCII ;                       12002020
  58.     FILE             WIRETAP                    ;                       12002030
  59.     REAL                     L,    TYPE         ;                       12002040
  60.     POINTER                    SOU              ;                       12002050
  61.     BOOLEAN                             INASCII ;                       12002060
  62.     COMMENT: PRODUCES A HEX AND ALPHANUMERIC DUMP OF THE CONTENTS OF AN 12002080
  63.                 ARRAY TO A PRINTER FILE.                                12002090
  64.              IT WILL LOOK SOMETHING LIKE:                               12002100
  65.                                                                         12002110
  66.                 -TYPE-  C O N T E N   T S   O F     T H E   A R         12002120
  67.                         C1D6D5E3C5D5  E3E240D6C640  E3C8C540C1D9        12002130
  68.                                                                         12002140
  69.                         R A Y                                           12002150
  70.                         D9C1E8                                          12002160
  71.                                                                         12002170
  72.         PARAMETERS:                                                     12002180
  73.             WIRETAP: IS A PRINTER FILE ONTO WHICH THE DUMP IS MADE.     12002190
  74.             L:  IS THE LENGTH (NUMBER OF CHARACTERS TO DUMP).           12002200
  75.             SOU: IS THE SOURCE POINTER -- POINTS TO THE FIRST CHARACTER 12002210
  76.                      TO DUMP.                                           12002220
  77.             TYPE: SHOULD CONTAIN A SIX CHARACTER IDENTIFICATION MESSAGE.12002230
  78.                      IT IS PRINTED ON THE DUMP TO THE LEFT OF THE ARRAY 12002240
  79.                      CONTENTS.                                          12002250
  80.             INASCII: IF TRUE, THE ARRAY CONTENTS ARE CONSIDERED TO BE IN12002260
  81.                         ASCII AND WILL BE TRANSLATED TO EBCDIC FOR THE  12002270
  82.                         ALPHA PART OF THE DUMP.                         12002280
  83.     ;                                                                   12002290
  84.   BEGIN                                                                 1200232001.188.001
  85.     ARRAY A1[0:9], A2[0:18], ED[0:20] %EDITED BY PICTURE                12002330
  86.             ;                                                           1200234001.188.001
  87.     BOOLEAN BOO;                                                        1200235001.188.001
  88.     REAL RM  % REMAINING                                                1200236001.188.001
  89.        , CTS % CHARACTERS TO SHOW (ON THIS LINE)                        1200237001.188.001
  90.        , BL  % BLANKS TO PUT AT END                                     1200238001.188.001
  91.        , PLL % PRINT LINE LENGTH                                        12002390
  92.        ;                                                                1200240001.188.001
  93.     POINTER PA2                                                         1200241001.188.001
  94.           , SLO  % SOURCE LEFT OFF                                      1200242001.188.001
  95.           ;                                                             1200243001.188.001
  96.     PICTURE ALPHALINE( AXAXAXAXAXAXX  AXAXAXAXAXAXX  AXAXAXAXAXAXX      1200244001.188.001
  97.                        AXAXAXAXAXAXX  AXAXAXAXAXAXX  AXAXAXAXAXAXX      1200245001.188.001
  98.                        AXAXAXAXAXAXX  AXAXAXAXAXAXX  AXAXAXAXAXAXX      1200246001.188.001
  99.                      )                                                  1200247001.188.001
  100.           , HEXLINE  ( A(12)X         A(12)X         A(12)X             1200248001.188.001
  101.                        A(12)X         A(12)X         A(12)X             1200249001.188.001
  102.                        A(12)X         A(12)X         A(12)X             1200250001.188.001
  103.                      )                                                  1200251001.188.001
  104.           ;                                                             1200252001.188.001
  105.                                                                         1200253001.188.001
  106.     PA2:=P(A2);                                                         1200254001.188.001
  107.     SLO:=SOU;                                                           1200255001.188.001
  108.     RM :=L;                                                             1200256001.188.001
  109.     REPLACE P(ED) BY TYPE FOR 6, " " FOR 20 WORDS;                      1200257001.188.001
  110.                                                                         1200258001.188.001
  111.     DO                                                                  1200259001.188.001
  112.       BEGIN                                                             1200260001.188.001
  113.         BL:=54-(CTS:=MIN(RM,54));                                       1200261001.188.001
  114.         IF INASCII THEN  % WHAT WE ARE WRITING IS IN ASCII              1200262001.188.001
  115.           BEGIN                                                         1200263001.188.001
  116.             REPLACE P(A1,7) BY SLO:SLO FOR CTS;                         1200264001.188.001
  117.             REPLACE PA2     BY P(A1,7) FOR CTS WITH ASCIITOEBCDIC       1200265001.188.001
  118.                              , " " FOR BL                               1200266001.188.001
  119.           END                                                           1200267001.188.001
  120.         ELSE                                                            1200268001.188.001
  121.           BEGIN                                                         1200269001.188.001
  122.             REPLACE P(A1) BY SLO:SLO FOR CTS;                           1200270001.188.001
  123.             REPLACE PA2     BY P(A1) FOR CTS, " " FOR BL                1200271001.188.001
  124.            END;                                                         1200272001.188.001
  125.         REPLACE P(ED[1])+1 BY PA2 WITH ALPHALINE;                       1200273001.188.001
  126.         PLL := IF WIRETAP.FRAMESIZE = 48 THEN 21                        12002740
  127.                ELSE 126;                                                12002750
  128.         BOO:=WRITE(WIRETAP,PLL,ED);                                     12002760
  129.                                                                         1200277001.188.001
  130.         REPLACE PA2     BY P(A1,4) FOR CTS*2 WITH HEXTOEBCDIC           1200278001.188.001
  131.                          , " " FOR BL*2;                                1200279001.188.001
  132.         REPLACE P(ED)   BY " " FOR 7                                    1200280001.188.001
  133.                          , PA2 WITH HEXLINE;                            1200281001.188.001
  134.         BOO:=WRITE(WIRETAP[SPACE 2],PLL,ED);                            12002820
  135.                                                                         1200283001.188.001
  136.         REPLACE P(ED[1]) BY " " FOR 20 WORDS;                           1200284001.188.001
  137.       END                                                               12002850
  138.     UNTIL  RM:=*-CTS  = 0                                               12002860
  139.   END   D E B U G W R I T E ;                                           12002870
  140. DEFINE DEBUGARRAY (L,PTR,TYPE,INASCII)=                                 12003000
  141.             IF DEBUGGING THEN DUMPARRAY(DEBUGFILE,L,PTR,TYPE,INASCII) # 12004000
  142.     ;                                                                   12005000
  143. DEFINE                                                                  13000000
  144.                 %  BASIC KERMIT TRANSFORMATION FUNCTIONS:               13001000
  145.         UNCHAR(X)       = (ORD(X) -32) #   % FROM PRINTABLE TO BINARY   13002000
  146.     ,   KERCHAR(X)      = CHAR(X+32) #     % BINARY TO PRINTABLE        13003000
  147.     ,   CTL(X)  = (REAL(NOT(B(X)EQV B(64))).[7:8]) # %CTL TO PRINTABLE--13004000
  148.     ,   CTLCHAR(X) = CHAR(CTL(X))  #                 %OR VISE VERSA     13004500
  149.     ;                                                                   13005000
  150. DEFINE  AUTORCV = 48"BF" #      % NDL -- AUTOMATICALLY RCV "D" PACKETS  18001000
  151.     ,   ASCIICRVAL = 13 #      % DECIMAL VALUE OF AN ASCII CR           18002000
  152.     ,   ASCIILFVAL = 10 #      % DECIMAL VALUE OF AN ASCII LF (OR NL)   18003000
  153.                                                                         18004000
  154.     ,   CAND (X,Y) = IF X THEN Y ELSE FALSE #                           18005000
  155.     ,   COR  (X,Y) = IF X THEN TRUE ELSE Y  #                           18006000
  156.     ;                                                                   18007000
  157. DEFINE  % PACKET TYPE CODES (FOR INTERNAL COMMUNICATIONS)               19000000
  158.         % DATA PACKETS  (EVEN)                                          19001000
  159.     DATA_TYPE   = 0 #                                                   19002000
  160.   , AUTO_TYPE   = 2 #                                                   19003000
  161.         % CONTROL PACKETS (ODD)                                         19004000
  162.   , ACK_TYPE    = 1 #                                                   19005000
  163.   , NAK_TYPE    = 3 #                                                   19006000
  164.   , S_TYPE      = 5 #   % SEND PACKET                                   19007000
  165.   , F_TYPE      = 7 #   % FILE SPEC PACKET                              19008000
  166.   , Z_TYPE      = 9 #   % EOF PACKET                                    19009000
  167.   , B_TYPE      = 11 #  % BREAK PACKET                                  19010000
  168.   , ERR_TYPE    = -1 #  % BAD NEWS, "E" PACKET, IO ERROR, OR FAULT      19011000
  169.   ;                                                                     19012000
  170. REAL PROCEDURE ACCUM_CHECKSUM (CH,L);                                   20000000
  171.     VALUE CH,L;                                                         20001000
  172.     POINTER CH;     % FIRST CHAR TO CHECKSUM                            20002000
  173.     REAL L;         % # OF CHARS TO CHECKSUM                            20003000
  174.   BEGIN                                                                 20004000
  175.     REAL A;     % ACCUMULATOR                                           20005000
  176.                                                                         20006000
  177.     DO                                                                  20007000
  178.       BEGIN                                                             20008000
  179.         A:=*+ ORD(CH);                                                  20009000
  180.         CH:=*+ 1                                                        20010000
  181.       END                                                               20011000
  182.     UNTIL L:=*- 1  = 0;                                                 20012000
  183.     A:=A.[7:8];                                                         20013000
  184.     ACCUM_CHECKSUM:=(A + A.[7:2]).[5:6];                                20014000
  185.   END   A C C U M   C H E C K S U M ;                                   20015000
  186. ASCII ARRAY PKT[0:PADPACKETLENGTH];   % PACKET GOES HERE                22000000
  187. REAL PKL;                             % LENGTH OF PACKET                22001000
  188. DEFINE      % PACKET CONTROL CHARACTERS                                 22002000
  189.     MARK_CHAR       = PKT[0] #                                          22003000
  190.   , COUNT_CHAR      = PKT[1] #      % # CHARS IN PACKET                 22004000
  191.   , SEQ_CHAR        = PKT[2] #      % MESSAGE #                         22005000
  192.   , TYPE_CHAR       = PKT[3] #      % TYPE OF PACKET                    22006000
  193.   , FIRST_DATA      = PKT[4] #      % FIRST CHAR OF DATA                22007000
  194.   ;                                                                     22008000
  195. DEFINE      % VALUES RETURNED FROM PGET                                 22009000
  196.         % PACKET IS OK:                                                 22010000
  197.     PG_OK       = 0 #   % PACKET IS OK                                  22011000
  198.         % IO ERRORS (NO PACKET RECEIVED):                               22012000
  199.   , PG_TIMEOUT  = 1 #   % TIMEOUT                                       22013000
  200.   , PG_EOF      = 2 #   % EOF                                           22014000
  201.   , PG_IOERR    = 3 #   % IO ERROR ON RECV                              22015000
  202.         % BADLY FORMED PACKET                                           22016000
  203.   , PG_NOMARK   = 4 #   % NO MARK (SOH) CHARACTER FOUND                 22017000
  204.   , PG_SHORT    = 5 #   % PACKET SHORTER THAN LENGTH CHAR SEZ           22018000
  205.   , PG_CKSM     = 6 #   % CHECKSUM ERROR                                22019000
  206.         % PACKET OUT OF SEQUENCE                                        22020000
  207.   , PG_SQHIGH   = 7 #   % SEQ IN PACKET = SEQ + 1                       22021000
  208.   , PG_SQLOW    = 8 #   % SEQ IN PACKET = SEQ - 1                       22022000
  209.   , PG_SEQERR   = 9 #   % WAY OUT OF SEQUENCE                           22023000
  210.   ;                                                                     22024000
  211. REAL PROCEDURE PGET(TL);                                                22025000
  212.     VALUE TL;                                                           22025250
  213.     BOOLEAN TL; % TIME LIMIT -- IF TRUE ENFORCE TIME LIMIT ON RCV:      22025500
  214. COMMENT:  THIS IS THE PRIMITIVE PACKET GET ROUTINE.  IT READS THE       22026000
  215.           DATACOM FILE TO TRY AND GET A PACKET.  IT MAY TIMEOUT,        22027000
  216.           GET AN IO ERROR OR RECEIVE SOMETHING.  IF IT GETS SOMETHING   22028000
  217.           IT LOOKS FOR A MARK (SOH) WHICH SIGNALS A KERMIT PACKET.      22029000
  218.           IF A MARK IS FOUND, THE PACKET IS TRANSLATED TO ASCII, ALIGNED22030000
  219.           TO THE PREDEFINED LOCATIONS OF THE PACKET CONTROL CHARACTERS  22031000
  220.           AND VERIFIED AS A GOOD PACKET.  A ZERO IS RETURNED IF A VALID 22032000
  221.           PACKET HAS BEEN RECEIVED.  A NON-ZERO VALUE SIGNALS SOME KIND 22033000
  222.           OF ABNORMAL CONDITION.  THE POSSIBLE VALUES RETURNED ARE      22034000
  223.           DEFINED ABOVE.  IT IS UP TO THE CALLER TO TAKE THE APPROPRIATE22035000
  224.           ACTION WHEN AN ABNORMALL CONDITION OCCURS.                    22036000
  225.                                                                         22037000
  226.           IF A PACKET IS RECEIVED FROM THE AUTO RECEIVE HANDLER IN NDL  22038000
  227.           (NDL HAS VERIFIED THE PACKET, ACKED IT, AND HANDLED CONTROL   22039000
  228.           CHARACTER QUOTING) THE PACKET WILL BE PRECEDED BY 48"BF".     22040000
  229.           THIS AUTORCV CODE IS PLACED IN MARK_CHAR WITH THE PACKET      22041000
  230.           CONTENTS (CONVERTED TO ASCII) IMMEDIATELY FOLLOWING.          22042000
  231.                                                                         22043000
  232.           PKL IS SET TO THE LENGTH OF THE DATA PORTION OF THE PACKET.   22044000
  233.         ;                                                               22045000
  234.   BEGIN                                                                 22046000
  235.     REAL S;                                                             22047000
  236.     POINTER PP;                                                         22048000
  237.                                                                         22049000
  238.     IF TL THEN RMT.TIMELIMIT:= YOURTIMOUT;  % ENFORCE TIME LIMIT?       22049500
  239.     IF RSLT:=READ (RMT,PADPACKETLENGTH,PKT) THEN                        22050000
  240.       BEGIN                                                             22051000
  241.         IF DEBUGGING THEN                                               22052000
  242.             WRITE (DEBUGFILE,<8"RECV ERR: ",H12>,REAL(RSLT));           22053000
  243.         PGET:=                                                          22054000
  244.             IF RSLT.[15:1] THEN PG_TIMEOUT                              22055000
  245.             ELSE                                                        22056000
  246.             IF RSLT.[9:1]  THEN PG_EOF                                  22057000
  247.             ELSE                PG_IOERR                                22058000
  248.       END                                                               22059000
  249.     ELSE            % HANDLE GOOD RECIVE HERE--IS IT A GOOD PKT?        22060000
  250.       BEGIN                                                             22061000
  251.         PKL:= RMT.CURRENTRECORD;                                        22062000
  252.         DEBUGARRAY (PKL,PKT,8"> IN >",COR(AUTOING,PKT=AUTORCV));        22063000
  253.         IF PKT= AUTORCV THEN                                            22064000
  254.           BEGIN                                                         22064500
  255.             PKL:=*-1;           % DON'T COUNT AUTORCV CHAR              22065000
  256.             AUTOING:= TRUE      % MAKE A NOTE THAT WE'RE AUTO RECEIVING 22065500
  257.           END                                                           22067500
  258.         ELSE        % NOT AUTO "D" PKT FROM NDL                         22069000
  259.           BEGIN                                                         22070000
  260.             SCAN PP:PKT FOR PKL:PKL UNTIL = MARK;                       22071000
  261.             IF PKL< 5 THEN  % NO MARK OR TOO SHORT TO BE VALID PACKET   22072000
  262.                 PGET:= PG_NOMARK                                        22073000
  263.             ELSE                                                        22074000
  264.               BEGIN                                                     22075000
  265.                 IF AUTOING THEN                                         22076100
  266.                   BEGIN                                                 22076200
  267.                     % JUST GOT OUT OF NDL AUTO RECV.  THERE IS NO       22076225
  268.                     % PADDING BEFORE THE PACKET, AND THE SEQ CHAR HAS   22076250
  269.                     % BEEN VERIFIED BY NDL.  THE COUNT, SEQ, AND TYPE   22076275
  270.                     % CHARACTERS ARE IN ASCII, BUT THE REST ARE IN      22076280
  271.                     % EBCDIC                                            22076290
  272.                     AUTOING:= FALSE;                                    22076300
  273.                     REPLACE MARK_CHAR BY PP:PP FOR 4; % MK,CNT,SEQ,TYPE 22076320
  274.                     REPLACE FIRST_DATA BY PP FOR PKL-4                  22076325
  275.                             WITH EBCDICTOASCII;                         22076350
  276.                     SEQ:= UNCHAR(SEQ_CHAR)  % RE-SYNC                   22076400
  277.                   END                                                   22076500
  278.                 ELSE REPLACE MARK_CHAR BY PP FOR PKL WITH EBCDICTOASCII;22076750
  279.                 IF PKL < PKL:=UNCHAR(COUNT_CHAR) THEN                   22077000
  280.                     PGET:= PG_SHORT                                     22078000
  281.                 ELSE                                                    22079000
  282.                         IF ACCUM_CHECKSUM (COUNT_CHAR,PKL) NEQ          22080000
  283.                                 UNCHAR((COUNT_CHAR)+PKL)                22081000
  284.                         THEN PGET:= PG_CKSM                             22082000
  285.                         ELSE    % CHECKSUM OK                           22083000
  286.                           BEGIN                                         22084000
  287.                             PKL:=* -3;  % JUST COUNT OF DATA BYTES      22085000
  288.                             IF S:= UNCHAR(SEQ_CHAR) - SEQ.[5:6] NEQ 0   22086000
  289.                             THEN        % OUT OF SEQUENCE               22087000
  290.                                 PGET:=                                  22088000
  291.                                     IF      S = 1  THEN PG_SQHIGH       22089000
  292.                                     ELSE IF S = -1 THEN PG_SQLOW        22090000
  293.                                     ELSE                PG_SEQERR       22091000
  294.                             ELSE   % GOOD PACKET                        22091250
  295.                                 IF TYPE_CHAR = 7"Y" THEN  % ACK PACKET  22091500
  296.                                     SEQ:= *+1                           22091750
  297.       END END END         END;                                          22092000
  298.                                                                         22093000
  299.     RMT.TIMELIMIT:= 0                                                   22094000
  300.   END   P G E T ;                                                       22095000
  301. EBCDIC ARRAY OPKT[0:MAXPACKET];  % LENGTH MAY CHANGE IF PADDING REQ'D   24000000
  302. BOOLEAN PROCEDURE PPUT (PTYPE,DATAL);                                   24001000
  303.     COMMENT:    PRIMITIVE PUT ROUTINE:                                  24002000
  304.         FORMATS AND SENDS A PACKET OF THE TYPE ENCODED IN PTYPE.  THE   24003000
  305.         TYPE, SEQ AND COUNT FIELDS WILL BE SET TO PROPER VALUES.  DATAL 24004000
  306.         BYTES OF DATA (IN ASCII) ARE ASSUMED TO BE PRESENT STARTING AT  24005000
  307.         FIRST_DATA.  NO QUOTING IS DONE BY PPUT, AND THUS MUST BE DONE  24006000
  308.         BEFORE CALLING PPUT.  PPUT WILL CALCULATE A CHECKSUM AND INSERT 24007000
  309.         IT INTO THE PACKET.  THE PACKET IS THEN SENT TO THE REMOTE      24008000
  310.         COMPUTER.                                                       24009000
  311.                                                                         24010000
  312.         THE STATUS WORD FROM THE WRITE TO THE REMOTE COMPUTER IS        24011000
  313.         RETURNED.  THE NORMAL VALUE RETURNED IS THUS FALSE, BUT WILL    24012000
  314.         BE TRUE IN THE CASE OF AN IO ERROR.                             24013000
  315.     ;                                                                   24014000
  316.     VALUE PTYPE,DATAL;                                                  24015000
  317.     REAL  PTYPE;    % CODE FOR TYPE OF PACKET TO SEND                   24016000
  318.     REAL DATAL;     % # OF CHARS TO SEND--THEY START AT FIRST_DATA      24017000
  319.   BEGIN                                                                 24018000
  320.     POINTER CKSM;  % POINTS TO LOCATION FOR CHECKSUM BYTE               24019000
  321.     BOOLEAN RSLT;                                                       24020000
  322.                                                                         24021000
  323.     CKSM:= OPKT;                                                        24022000
  324.     THRU YOURNPAD DO REPLACE CKSM:CKSM BY CHAR(YOURPAD);                24023000
  325.     REPLACE CKSM:OPKT BY CHAR(MARK), KERCHAR(DATAL+3)                   24024000
  326.                         ,KERCHAR(SEQ.[5:6]);                            24025000
  327.                         ;                                               24026000
  328.     CASE PTYPE OF                                                       24027000
  329.       BEGIN                                                             24028000
  330.         (DATA_TYPE)     : REPLACE CKSM:CKSM BY 7"D";                    24029000
  331.         (ACK_TYPE)      : REPLACE CKSM:CKSM BY 7"Y";                    24030000
  332.         (NAK_TYPE)      : REPLACE CKSM:CKSM BY 7"N";                    24031000
  333.         (S_TYPE)        : REPLACE CKSM:CKSM BY 7"S";                    24032000
  334.         (F_TYPE)        : REPLACE CKSM:CKSM BY 7"F";                    24033000
  335.         (Z_TYPE)        : REPLACE CKSM:CKSM BY 7"Z";                    24034000
  336.         (B_TYPE)        : REPLACE CKSM:CKSM BY 7"B";                    24035000
  337.         ELSE            : REPLACE CKSM:CKSM BY 7"E";                    24036000
  338.                           PTYPE:= ERR_TYPE                              24037000
  339.       END;                                                              24038000
  340.     REPLACE CKSM:CKSM BY FIRST_DATA FOR DATAL;                          24039000
  341.                                                                         24040000
  342.     REPLACE CKSM BY KERCHAR(ACCUM_CHECKSUM(OPKT[1],DATAL+3));           24041000
  343.     IF CKSM = 7" " THEN    % THIS IS TROUBLESOME TO KERMIT ON THE ALTOS 24042000
  344.       BEGIN                                                             24043000
  345.         REPLACE CKSM:=*+1 BY 7"X";  % MAKE IT SEE THE CHECKSUM          24044000
  346.         DATAL:=*+1      % AND BE SURE THE EXTRA CHAR IS SENT            24045000
  347.       END;                                                              24046000
  348.                                                                         24047000
  349.     REPLACE CKSM+1 BY CHAR(YOUREOL);                                    24048000
  350.                                                                         24049000
  351.     REPLACE OPKT BY OPKT FOR DATAL:=*+6 WITH ASCIITOEBCDIC;             24050000
  352.                                                                         24051000
  353.     DEBUGARRAY (DATAL,OPKT,8"< OUT<",FALSE);                            24052000
  354.     WHILE RMT.CENSUS > 0 DO          % FLUSH EXTRA MSG                  24053000
  355.         RSLT:= READ(RMT,0,PKT);                                         24054000
  356.     IF NOT RSLT THEN                                                    24055000
  357.         IF NOT RSLT:= WRITE(RMT[STOP],DATAL,OPKT) THEN                  24055250
  358.             IF PTYPE = ACK_TYPE THEN SEQ:=*+1;                          24055500
  359.     PPUT:=  IF RSLT THEN RSLT                                           24056000
  360.             ELSE IF PTYPE=ERR_TYPE THEN TRUE  % REPORT TYPE ERROR       24057000
  361.                  ELSE FALSE                   % OR OK                   24058000
  362.   END   P P U T ;                                                       24059000
  363. %        SEND AN ERROR MESSAGE TO ABORT OTHER END WITH THIS DEFINE      25000000
  364. POINTER PERREND;        % POINT TO END OF ERROR MESSAGE                 25001000
  365.                                                                         25002000
  366. DEFINE ERROUT(MSG) =     % NOTE: MSG IS AN ASCII STRING                 25003000
  367.           BEGIN                                                         25004000
  368.             REPLACE PERREND:FIRST_DATA BY MSG;                          25005000
  369.             PPUT (ERR_TYPE,DELTA(FIRST_DATA,PERREND))                   25006000
  370.           END   #                                                       25007000
  371.     ;                                                                   25008000
  372.                                                                         25009000
  373.                                                                         25010000
  374.                                                                         25011000
  375.                                                                         25012000
  376. REAL PROCEDURE GETPACKET(TL);                                           30000000
  377.     VALUE TL;                                                           30000250
  378.     BOOLEAN TL;         % TIMELIMIT -- TRUE IF A TIMELIMIT              30000500
  379.     COMMENT:                                                            30001000
  380.         THE PURPOSE OF GETPACKET IS TO RETRIEVE THE NEXT VALID PACKET   30002000
  381.         FROM THE REMOTE COMPUTER.  GETPACKET WILL NAK IMPROPERLY        30003000
  382.         FORMED PACKETS AND WILL NAK IN THE CASE OF A TIMEOUT.  IF TOO   30004000
  383.         MANY NAKS ARE SENT (AS DEFINED BY RETRYLIMIT), GETPACKET WILL   30005000
  384.         ACT AS IF IT HAD JUST RECEIVED AN ERROR (ABORT) PACKET.  AN     30006000
  385.         ERROR PACKET WILL ALSO BE REPORTED IN THE CASE OF AN IO ERROR   30007000
  386.         ON THE READ OF THE REMOTE FILE.                                 30008000
  387.                                                                         30009000
  388.         GETPACKET HANDLES CONTROL QUOTING.  ANY CONTROL CHARACTERS IN   30010000
  389.         THE PACKET WHICH WERE QUOTED FOR TRANSFER THROUGH THE DATACOM   30011000
  390.         LINK WILL BE RESTORED.  THE PACKET TYPE WILL BE CONVERTED TO    30012000
  391.         THE PACKET TYPE CODE AND RETURNED BY THE GETPACKET PROCEDURE.   30013000
  392.         THE DATA CONTAINED IN THE PACKET MAY BE ACCESSED STARTING AT    30014000
  393.         FIRST_DATA.  THE DATA FROM AN AUTO_TYPE PACKET WILL START AT    30015000
  394.         COUNT_CHAR.  THE COUNT OF NUMBER OF BYTES OF DATA WILL BE       30016000
  395.         FOUND IN PKL.                                                   30017000
  396.     ;                                                                   30018000
  397.   BEGIN                                                                 30019000
  398.     REAL E      % ERROR CODE RETURNED FROM PGET                         30020000
  399.        , RETRY  % COUNTDOWN OF RETIES LEFT BEFORE ABORT                 30021000
  400.        ;                                                                30022000
  401.     DEFINE DONE (RETURNV) =                                             30023000
  402.               BEGIN                                                     30024000
  403.                 E:= 0;  % GET OUT OF THE NAK LOOP                       30025000
  404.                 GETPACKET:= RETURNV                                     30026000
  405.               END   #                                                   30027000
  406.         ,  ACK =                                                        30028000
  407.               BEGIN                                                     30028500
  408.                 IF PPUT(ACK_TYPE,0) THEN DONE(ERR_TYPE)                 30029000
  409.               END   #                                                   30030000
  410.         ,  NAK =                                                        30032000
  411.               BEGIN                                                     30033000
  412.                 IF DECREMENTRETRY THEN  % TOO MANY RETRIES              30034000
  413.                     DONE(ERR_TYPE)                                      30035000
  414.                 ELSE                                                    30036000
  415.                     IF PPUT(NAK_TYPE,0) THEN                            30037000
  416.                         DONE(ERR_TYPE)    % UNSUCCESSFUL XMIT           30038000
  417.                    %ELSE LOOP BACK FOR ANOTHER TRY                      30039000
  418.               END   #                                                   30040000
  419.         ;                                                               30041000
  420.     DEFINE    % ASCII CHARACTER HEX EQUIVALENTS (CASE WON'T TAKE 7"X")  30042000
  421.         ASC_CHAR_B = 4"42" #                                            30043000
  422.     ,   ASC_CHAR_D = 4"44" #                                            30044000
  423.     ,   ASC_CHAR_F = 4"46" #                                            30045000
  424.     ,   ASC_CHAR_S = 4"53" #                                            30046000
  425.     ,   ASC_CHAR_Z = 4"5A" #                                            30047000
  426.     ;                                                                   30048000
  427.     BOOLEAN PROCEDURE DECREMENTRETRY;                                   30049000
  428.       BEGIN                                                             30050000
  429.         POINTER P1;                                                     30051000
  430.         IF RETRY:=*-1 < 0 THEN                                          30052000
  431.           BEGIN                                                         30053000
  432.             ERROUT (7"TOO MANY UNSUCCESSFUL ATTEMPTS TO RECEIVE");      30054000
  433.             DECREMENTRETRY:= TRUE;                                      30056000
  434.           END                                                           30057000
  435.       END   D E C R E M E N T R E T R Y ;                               30058000
  436.     PROCEDURE UNQUOTE;                                                  30059000
  437.       BEGIN                                                             30060000
  438.         POINTER P1,P2;                                                  30061000
  439.         REAL L;                                                         30062000
  440.                                                                         30063000
  441.         L:= PKL;                                                        30064000
  442.         P1:= P2:= FIRST_DATA;                                           30065000
  443.                                                                         30066000
  444.         WHILE L>0 DO                                                    30067000
  445.           BEGIN                                                         30068000
  446.             REPLACE P2:P2 BY P1:P1 FOR L:L UNTIL = YOURQUOTE;           30069000
  447.             IF L>0 THEN  % FOUND A QUOTE                                30070000
  448.                 IF L=1 THEN  % SHOULD NEVER BE                          30071000
  449.                   BEGIN                                                 30072000
  450.                     REPLACE P2:P2 BY P1:P1 FOR 1;                       30073000
  451.                     L:=*-1                                              30074000
  452.                   END                                                   30075000
  453.                 ELSE                                                    30076000
  454.                   BEGIN                                                 30077000
  455.                     PKL:=*-1;  % PACKET WILL BE SHORTER--NO MORE QUOTE  30078000
  456.                     IF P1:=*+1 = CHAR(YOURQUOTE) THEN  % QUOTE QUOTE %  30079000
  457.                         REPLACE P2:P2 BY YOURQUOTE     % = QUOTE     %  30080000
  458.                     ELSE REPLACE P2:P2 BY CTLCHAR(ORD(P1));             30081000
  459.                     P1:=*+1;  % POINT PAST QUOTED CHAR                  30082000
  460.                     L:=*-2                                              30083000
  461.           END     END                                                   30084000
  462.       END   U N Q U O T E ;                                             30085000
  463.     % GETPACKET STATEMENTS:                                             30086000
  464.                                                                         30087000
  465.     RETRY:= RETRYLIMIT;                                                 30088000
  466.                                                                         30089000
  467.     DO                                                                  30090000
  468.         IF E:=PGET(TL) = 0 THEN  % GOT A GOOD PACKET                    30091000
  469.             IF MARK_CHAR = AUTORCV THEN   % ALREADY NAKED AND DEQUOTED  30092000
  470.                 GETPACKET:= AUTO_TYPE      % BY THE NDL                 30093000
  471.             ELSE   % NORMAL PACKET-- WHAT DO WE DO WITH THIS KIND?      30094000
  472.                 CASE ORD(TYPE_CHAR) OF                                  30095000
  473.                   BEGIN                                                 30096000
  474.                     (ASC_CHAR_D) : UNQUOTE;                             30097000
  475.                     (ASC_CHAR_S) : GETPACKET:= S_TYPE;                  30098000
  476.                     (ASC_CHAR_F) : UNQUOTE;                             30099000
  477.                                    GETPACKET:= F_TYPE;                  30100000
  478.                     (ASC_CHAR_Z) : ACK;                                 30101000
  479.                                    GETPACKET:= Z_TYPE;                  30102000
  480.                     (ASC_CHAR_B) : ACK;                                 30103000
  481.                                    GETPACKET:= B_TYPE;                  30104000
  482.                     ELSE:          ACK;                                 30105000
  483.                                    GETPACKET:= ERR_TYPE                 30106000
  484.                   END CASE                                              30107000
  485.         ELSE  % BAD PACKET OR NO PACKET AT ALL RECEIVED                 30108000
  486.             CASE E-1 OF   % WHAT KIND OF ERROR?                         30109000
  487.               BEGIN                                                     30110000
  488.                 NAK;            % TIMEOUT                               30111000
  489.                 DONE(ERR_TYPE);   % EOF                                 30112000
  490.                 DONE(ERR_TYPE);   % OTHER IO ERROR                      30113000
  491.                 IF DECREMENTRETRY THEN DONE(ERR_TYPE);    % NO MARK     30114000
  492.                 NAK;            % SHORT                                 30115000
  493.                 NAK;            % BAD CHECKSUM                          30116000
  494.                 NAK;            % WE MISSED A PACKET                    30117000
  495.                 BEGIN           % IT MISSED OUR ACK-- TRY ACKING AGAIN  30118000
  496.                     SEQ:=*-1;                                           30119000
  497.                     ACK                                                 30120000
  498.                 END;                                                    30121000
  499.                 NAK;            % BAD SEQ                               30122000
  500.               END                                                       30123000
  501.     UNTIL E=0;                                                          30124000
  502.   END   G E T P A C K E T ;                                             30125000
  503. BOOLEAN PROCEDURE PUTPACKET(PTYPE, DATAL);                              35000000
  504.     COMMENT:                                                            35001000
  505.         PUTPACKET ADDS ACKNOWLEDGEMENT TO THE SERVICES PROVIDED BY      35002000
  506.         PPUT.  PUTPACKET WILL SEND THE PACKET REPEATEDLY UNTIL EITHER   35003000
  507.         AN ACK PACKET IS RECEIVED, AN IO ERROR OCCURS OR UNTIL THE      35004000
  508.         NUMBER OF RETRIES ATTEMPTED EQUAL THE VALUE IN RETRYLIMIT.      35005000
  509.         IF THE PACKET IS SUCCESSFULLY SENT AND ACKNOWLEDGED, PUTPACKET  35006000
  510.         RETURNS A VALUE OF FALSE.  IF PUTPACKET FAILS IN ITS MISSION    35007000
  511.         IT RETURNS A TRUE VALUE AFTER ATTEMPTING TO NOTIFY THE REMOTE   35008000
  512.         COMPUTER THAT THIS PROGRA IS NOW ABORTING.                      35009000
  513.                                                                         35010000
  514.         THE PARAMETERS TO PUTPACKET ARE THE SAME AS THOSE TO PPUT, AND  35011000
  515.         THE DATA IS NOT MODIFIED, MOVED, OR OTHERWISE CHANGED BEFORE    35012000
  516.         BEING SENT ON TO PPUT.                                          35013000
  517.     ;                                                                   35014000
  518.     VALUE PTYPE, DATAL;                                                 35015000
  519.     REAL PTYPE          % CODE FOR TYPE OF PACKET BEING SENT            35016000
  520.       ,  DATAL          % NUMBER OF BYTES TO SEND                       35017000
  521.       ;                                                                 35018000
  522.   BEGIN                                                                 35019000
  523.     REAL RETRY, GETCODE;                                                35020000
  524.     BOOLEAN RSLT;                                                       35021000
  525.                                                                         35022000
  526.     PROCEDURE SENDFAILURENOTICE;                                        35023000
  527.       BEGIN                                                             35024000
  528.         ERROUT (7"TOO MANY FAILED ATTEMPTS TO SEND A PACKET");          35026000
  529.         PUTPACKET:= TRUE       % LET CALLER KNOW OF OUR FAILURE         35029000
  530.       END;                                                              35030000
  531.     DEFINE  ABORT =     % WHEN THINGS ARE TOO DISMAL                    35031000
  532.               BEGIN                                                     35032000
  533.                 RETRY:= 0;                                              35033000
  534.                 PUTPACKET:= TRUE;                                       35034000
  535.                 PPUT(ERR_TYPE,0);       % ATTEMPT TO LET REMOTE KNOW    35035000
  536.               END       #                                               35036000
  537.         ,   TRYAGAIN =  % GOT NAK OR EQUIVALENT                         35037000
  538.               BEGIN                                                     35038000
  539.                 IF RETRY:=*-1 = 0 THEN SENDFAILURENOTICE                35039000
  540.               END       #                                               35040000
  541.         ;                                                               35041000
  542.                                                                         35042000
  543.     RETRY:= RETRYLIMIT;                                                 35043000
  544.     WHILE RETRY > 0 DO                                                  35044000
  545.                                                                         35045000
  546.         IF RSLT:= PPUT(PTYPE,DATAL) THEN   % IO ERROR--FAILURE          35046000
  547.           BEGIN                                                         35047000
  548.             RETRY:= 0;  % LEAVE LOOP                                    35048000
  549.             PUTPACKET:= RSLT;  % RETURN NOTICE OF OUR FAILURE           35049000
  550.             PPUT (ERR_TYPE,0);  % MAKE A DOUBTFUL ATTEMPT TO NOTIFY THE 35050000
  551.                                 % REMOTE COMPUTER OF OUR FAILURE        35051000
  552.           END                                                           35052000
  553.         ELSE    % SENT PACKET OK--NOW GET ACKNOWLEDGMENT                35053000
  554.                                                                         35054000
  555.             CASE PGET(TRUE) OF                                          35055000
  556.               BEGIN                                                     35056000
  557.                     % GOT A GOOD PACKET -- IS IT AN ACK?                35057000
  558.                 IF TYPE_CHAR=7"Y" THEN RETRY:=0  % SUCCESS !!!          35058000
  559.                 ELSE                                                    35059000
  560.                 IF TYPE_CHAR=7"E" THEN   % DISMAL FAILURE ON OTHER END  35060000
  561.                   BEGIN                                                 35061000
  562.                     RETRY:= 0;                                          35062000
  563.                     PUTPACKET:= TRUE    % PASS ON OUR FAILURE           35063000
  564.                   END                                                   35064000
  565.                 ELSE TRYAGAIN;  % TREAT ANYTHING ELSE AS A NAK          35065000
  566.                                                                         35066000
  567.                     % NOT A GOOD PACKET (IN VARIOUS FLAVORS):           35067000
  568.                 TRYAGAIN;       % TIMEOUT                               35068000
  569.                 ABORT;          % EOF                                   35069000
  570.                 ABORT;          % IO ERROR                              35070000
  571.                 TRYAGAIN;       % NOT A PACKET                          35071000
  572.                 TRYAGAIN;       % SHORT                                 35072000
  573.                 TRYAGAIN;       % CHECKSUM ERROR                        35073000
  574.                 RETRY:=0;       % IT'S ON NEXT PACKET--ASSUME ACK MISSED35074000
  575.                 TRYAGAIN;       % PRIOR PACKET NUMBER--MAY BE BAD NEWS  35075000
  576.                 TRYAGAIN        % BAD PACKET NUMBER                     35076000
  577.               END CASE;                                                 35077000
  578.   END   P U T P A C K E T ;                                             35078000
  579. PROCEDURE GETINIT;      % EXTRACT INITIALIZATION VALUES FROM SEND-INIT  40000000
  580.                         % PACKET OR FROM ACK OF OUR SEND-INIT           40001000
  581.   BEGIN                                                                 40002000
  582.     REAL CHARNBR;                                                       40003000
  583.     POINTER PCH;        % POINTER TO CURRENT CHAR                       40004000
  584.                                                                         40005000
  585.     %    ESTABLISH DEFAULTS:                                            40006000
  586.     YOURMAXBUFF:= MAXPACKET;                                            40007000
  587.     YOURQUOTE:= 7"#";                                                   40008000
  588.     YOUR8BIT:= 7"N";                                                    40009000
  589.                                                                         40010000
  590.     %    NOW GET THE SPECIFIC VALUES FROM OTHER KERMIT                  40011000
  591.     PCH:= FIRST_DATA;                                                   40012000
  592.     WHILE PKL> 0 AND CHARNBR < 11 DO                                    40013000
  593.       BEGIN                                                             40014000
  594.         IF PCH NEQ 7" " THEN                                            40016000
  595.             CASE CHARNBR OF                                             40017000
  596.               BEGIN                                                     40018000
  597.                 YOURMAXBUFF:= UNCHAR(PCH);      % BUFSZ                 40019000
  598.                 IF YOURTIMOUT:= UNCHAR(PCH) = MYTIMOUT THEN     % TIMOUT40020000
  599.                     YOURTIMOUT:=*+ 1; % PREVENT CONTINUOUS COLLISIONS   40021000
  600.                 YOURNPAD:= UNCHAR(PCH);         % NPAD                  40022000
  601.                 YOURPAD:= CTL(ORD(PCH));        % PAD                   40023000
  602.                 YOUREOL:= UNCHAR(PCH);          % EOL                   40024000
  603.                 YOURQUOTE:= ORD(PCH);           % QUOTE                 40025000
  604.                 YOUR8BIT:= ORD(PCH);            % 8 BIT QUOTE           40026000
  605.                 ;                               % CHKTYPE               40027000
  606.                 YOURREPEAT:= ORD(PCH);          % REPEAT QUOTE          40028000
  607.                 ;;                              % RESERVED              40029000
  608.               END;                                                      40030000
  609.         PCH:=*+1;       PKL:=*-1;                                       40030500
  610.         CHARNBR:=*+ 1                                                   40031000
  611.       END;                                                              40032000
  612.     IF DEBUGGING THEN WRITE(DEBUGFILE,*/,YOURMAXBUFF, YOURTIMOUT        40033000
  613.                                         ,YOURNPAD, YOURPAD              40034000
  614.                                         ,YOUREOL, YOURQUOTE, YOUR8BIT   40035000
  615.                                         ,YOURREPEAT                     40036000
  616.                            );                                           40037000
  617.                                                                         40038000
  618.     % SET BIT IN CONTROL CHAR TRUTHSET FOR CONTROL QUOTE CHAR:          40039000
  619.     CTLCHARS[YOURQUOTE.[7:3]].[(31-YOURQUOTE.[4:5]):1]:= 1;             40040000
  620.   END   G E T I N I T ;                                                 40041000
  621. REAL PROCEDURE SETINIT;  % RETURNS COUNT OF CHARACTERS SET IN BUILD     42000000
  622.   BEGIN                                                                 42001000
  623.     REPLACE FIRST_DATA BY  KERCHAR(94)    % BLKSZ                       42002000
  624.                           ,KERCHAR(MYTIMOUT)     % TIMOUT               42003000
  625.                           ,KERCHAR(MYPAD) % NPAD                        42004000
  626.                           ,CTLCHAR(0)     % PAD                         42005000
  627.                           ,KERCHAR(ASCIICRVAL)    % EOL                 42006000
  628.                           ,7"#"            % QUOTE                      42007000
  629.                           ,7" "            % NO 8 BIT QUOTING           42008000
  630.                           ,7"1"            % CHKTYPE                    42009000
  631.                           ,7" "            % REPEAT-- NOT YET IMPLEMENTD42010000
  632.                           ;                                             42011000
  633.     SETINIT:=9                                                          42012000
  634.   END   S E T I N I T ;                                                 42013000
  635. BOOLEAN PROCEDURE SEND_DATA (MRSZ);                                     60000000
  636.     VALUE MRSZ;                                                         60001000
  637.     REAL  MRSZ;   % MAXRECSIZE                                          60002000
  638.   BEGIN                                                                 60003000
  639.     EBCDIC ARRAY FREC [0:MRSZ+1];                                       60004000
  640.     BOOLEAN RTN, DONE;  % TEMP STORAGE FOR VALUE RETURNED, LOOP CONTROL 60005000
  641.     REAL SZ, SZ2;                                                       60006000
  642.     POINTER P1,P2;                                                      60007000
  643.     REAL I,J;                                                           60008000
  644.     REAL FL,PL;     % FILE AND PACKET CHARS LEFT                        60009000
  645.     POINTER FP,PP;  % FILE AND PACKET POINTERS                          60010000
  646.     TRUTHSET NULLBLANK (48"00"" ");                                     60011000
  647.     DEFINE                                                              60012000
  648.         YOURMAXDATA = YOURMAXBUFF - 5 #                                 60012500
  649.       , RESETPKT =  % START BUILDING A NEW DATA PACKET                  60013000
  650.               BEGIN                                                     60014000
  651.                 PP:= FIRST_DATA;                                        60015000
  652.                 PL:= YOURMAXDATA                                        60016000
  653.               END #                                                     60017000
  654.       , UNLOOP =                                                        60018000
  655.               BEGIN                                                     60019000
  656.                 SEND_DATA:= DONE:= TRUE;                                60020000
  657.                 FL:= -1;  % GET OUT OF LOOP                             60021000
  658.               END #                                                     60022000
  659.       , SENDIT =                                                        60023000
  660.                 IF PUTPACKET (DATA_TYPE,YOURMAXDATA-PL) THEN            60024000
  661.                     UNLOOP                                              60025000
  662.                 ELSE                                                    60026000
  663.                     RESETPKT        #                                   60027000
  664.       , ERR(X) =                                                        60028000
  665.               BEGIN                                                     60029000
  666.                 ERROUT(X);                                              60030000
  667.                 UNLOOP                                                  60031000
  668.               END #                                                     60032000
  669.       ;                                                                 60033000
  670.                                                                         60034000
  671.     RESETPKT;       % START A NEW DATA PACKET                           60035000
  672.                                                                         60036000
  673.     DO                                                                  60037000
  674.         IF RTN:= READ(FYLE,MRSZ,FREC) THEN                              60038000
  675.             IF RTN.[9:1] THEN   % EOF:                                  60039000
  676.               BEGIN                                                     60040000
  677.                 SENDIT;         %   SEND ANYTHING LEFT IN BUFFER        60041000
  678.                 DONE:= TRUE     %   AND EXIT LOOP                       60042000
  679.               END                                                       60043000
  680.             ELSE                                                        60044000
  681.                 ERR (7"IO ERROR ENCOUNTERED IN READ OF FILE")           60045000
  682.         ELSE                                                            60046000
  683.           BEGIN                                                         60047000
  684.             % REMOVE TRAILING BLANKS (AND NULLS FOLLOWING)              60048000
  685.             P2:= FREC; SZ2:= MRSZ;                                      60049000
  686.             DO        % TRUNCATE TRAILING SPACES AND NULLS              60050000
  687.               BEGIN                                                     60051000
  688.                 SCAN P1:P2 FOR SZ:SZ2  UNTIL IN NULLBLANK;              60052000
  689.                 SCAN P2:P1 FOR SZ2:SZ  WHILE = 8" ";                    60053000
  690.                 SCAN P2:P2 FOR SZ2:SZ2 WHILE = 0;                       60054000
  691.               END                                                       60055000
  692.             UNTIL SZ2 = 0;                                              60056000
  693.                                                                         60057000
  694.             % COUNT WHAT REMAINS, CONVERT IT TO ASCII                   60058000
  695.             % AND PLACE CRLF RECORD DELIMITER AT END                    60059000
  696.             REPLACE FREC BY FREC FOR FL:= MRSZ-SZ WITH EBCDICTOASCII    60060000
  697.                           , CHAR(ASCIICRVAL), CHAR(ASCIILFVAL);         60061000
  698.             FL:= *+2;   % ADD CR AND LF TO COUNT                        60062000
  699.             FP:= FREC;                                                  60063000
  700.                                                                         60064000
  701.             % QUOTE CONTROL CHARACTERS, DIVIDE UP INTO PACKETS AND      60065000
  702.             % SEND OUT THE PACKETS:                                     60066000
  703.             WHILE FL > 0 DO   % DON'T NEED NEW READ OF INPUT FILE       60067000
  704.               BEGIN                                                     60068000
  705.                 I := MIN(FL,PL);                                        60069000
  706.                 REPLACE PP:PP BY FP:FP FOR J:I UNTIL IN CTLCHARS[0];    60070000
  707.                 FL:=*- (I-J);                                           60071000
  708.                 PL:=*- (I-J);                                           60072000
  709.                                                                         60073000
  710.                 IF J > 0 THEN  % POINTING TO CTL CHAR--QUOTE IT         60074000
  711.                   BEGIN                                                 60075000
  712.                     IF PL=1 THEN SENDIT      % NO ROOM FOR IT           60076000
  713.                     ELSE                                                60077000
  714.                       BEGIN                                             60078000
  715.                         IF FP=CHAR(YOURQUOTE) THEN                      60079000
  716.                             % REPRESENT QUOTE CHAR BY QUOTE QUOTE:      60080000
  717.                             REPLACE PP:PP BY FP FOR 1, FP FOR 1         60081000
  718.                         ELSE                                            60082000
  719.                             REPLACE PP:PP BY CHAR(YOURQUOTE)            60083000
  720.                                            , CTLCHAR(ORD(FP));          60084000
  721.                         FP:=*+ 1;                                       60085000
  722.                         FL:=*- 1;                                       60086000
  723.                         PL:=*- 2;                                       60087000
  724.                   END END;                                              60088000
  725.                                                                         60089000
  726.                 IF PL = 0 THEN SENDIT    % NEED TO SEND PACKET          60090000
  727.           END END                                                       60091000
  728.     UNTIL DONE;                                                         60092000
  729.   END SEND_DATA;                                                        60093000
  730. BOOLEAN PROCEDURE SEND_INIT;                                            65000000
  731.   BEGIN                                                                 65001000
  732.     REAL L,E;                                                           65002000
  733.     POINTER P1;                                                         65003000
  734.     BOOLEAN DONE;                                                       65004000
  735.                                                                         65005000
  736.     DEFINE ABORT =                                                      65006000
  737.               BEGIN                                                     65007000
  738.                 SEND_INIT:= TRUE;                                       65008000
  739.                 E:= 0                                                   65009000
  740.               END  #                                                    65010000
  741.         ,  SHUTDOWN =                                                   65011000
  742.               BEGIN                                                     65012000
  743.                 ERROUT(7"IO ERROR");                                    65013000
  744.                 ABORT                                                   65014000
  745.               END  #                                                    65015000
  746.         ,  TRYAGAIN =  #                                                65016000
  747.         ;                                                               65017000
  748.                                                                         65018000
  749.     SEQ:= 0;                                                            65019000
  750.                                                                         65020000
  751.     DO  % LOOP UNTIL SUCCESSFUL SEND AND ACK OR ABOSLUTE FAILURE        65021000
  752.       BEGIN                                                             65022000
  753.         L:= SETINIT;                                                    65023000
  754.         IF PPUT(S_TYPE,L) THEN   % IO ERROR                             65024000
  755.             SHUTDOWN                                                    65025000
  756.         ELSE   % SENT S PACKET--NOW GET ACK                             65026000
  757.             CASE E:= PGET(TRUE) OF                                      65027000
  758.               BEGIN                                                     65028000
  759.                 IF TYPE_CHAR = 7"Y" THEN   % GOT GOOD PKT--IS IT ACK?   65029000
  760.                     GETINIT       % YES ACK, GET SPECS                  65030000
  761.                 ELSE                                                    65031000
  762.                 IF TYPE_CHAR = 7"E" THEN ABORT  % ERROR ON OTHER END    65032000
  763.                 ELSE E:= 1;   % ANYTHING ELSE SEEN AS NAK--TRY AGAIN    65033000
  764.                                                                         65034000
  765.                 TRYAGAIN;       % TIMEOUT                               65035000
  766.                 ABORT;          % EOF                                   65036000
  767.                 SHUTDOWN;       % IO ERROR                              65037000
  768.                 TRYAGAIN;       % NOT A PACKET                          65038000
  769.                 TRYAGAIN;       % SHORT PACKET                          65039000
  770.                 TRYAGAIN;       % CHECKSUM ERROR                        65040000
  771.                 SEQ:=*+ 1;      % BAD SEQ: ADAPT TO IT AND TRY AGAIN    65041000
  772.                 SEQ:=*- 1;      % BAD SEQ: ADAPT TO IT AND TRY AGAIN    65042000
  773.                 SEQ:=*+ 1       % BAD SEQ: TRY TO ADAPT                 65043000
  774.       END     END                                                       65044000
  775.     UNTIL E = 0                                                         65045000
  776.   END SEND_INIT;                                                        65046000
  777. PROCEDURE SEND;                                                         69000000
  778.   BEGIN                                                                 69001000
  779.     POINTER P1;                                                         69002000
  780.                                                                         69003000
  781.     YOUREOL:= ASCIICRVAL;       % DEFAULT EOL CHAR                      69004000
  782.                                                                         69005000
  783.     IF BOOLEAN(FYLE.AVAILABLE) THEN                                     69006000
  784.         IF NOT FYLE.ATTERR THEN  % COMPATABLE ATTRIBUTES                69007000
  785.             IF FYLE.BLOCKSTRUCTURE = VALUE(FIXED) THEN                  69008000
  786.               BEGIN                                                     69009000
  787.                 WRITE(RMT,<4"07">);  % DEL -- LET 'EM KNOW WE'RE UP     69010000
  788.                 WHEN(1);        % ALLOW TIME FOR OTHER END TO GET READY 69010500
  789.                                                                         69010750
  790.                 IF SEND_INIT THEN   % COULD NOT INITIATE COMMUNICATIONS 69011000
  791.                 ELSE                                                    69012000
  792.                   BEGIN                                                 69013000
  793.                                                                         69014000
  794.                     % SEND THE REMOTE FILE NAME BACK TO REMOTE SYSTEM   69015000
  795.                     SCAN P1:P(INIT) UNTIL = 0;                          69016000
  796.                     REPLACE FIRST_DATA BY P(INIT) FOR OFFSET(P1)+1      69017000
  797.                         WITH EBCDICTOASCII;                             69018000
  798.                     IF PUTPACKET (F_TYPE,OFFSET(P1)+1) THEN             69019000
  799.                         % FAILED SEND                                   69019500
  800.                     ELSE                                                69020000
  801.                                                                         69021000
  802.                         % SEND CONTENTS OF FILE                         69022000
  803.                         IF SEND_DATA (IF FYLE.FRAMESIZE=48 THEN         69023000
  804.                                             6 * FYLE.MAXRECSIZE         69024000
  805.                                       ELSE FYLE.MAXRECSIZE              69025000
  806.                                      )                                  69026000
  807.                         THEN  % COULD NOT SEND ENTIRE FILE              69027000
  808.                             CLOSE(FYLE)                                 69028000
  809.                         ELSE                                            69029000
  810.                           BEGIN                                         69030000
  811.                             CLOSE(FYLE);                                69031000
  812.                             IF PUTPACKET(Z_TYPE,0) THEN  % SEND EOF     69032000
  813.                             ELSE PUTPACKET (B_TYPE,0)  % BREAK--DONE    69033000
  814.               END END     END                                           69034000
  815.             ELSE WRITE(RMT,<"FILE STRUCTURE IS NOT READABLE BY KERMIT"  69035000
  816.                             4"3D">)                                     69035500
  817.         ELSE    % SYSTEM SHOULD HAVE SENT FILE ATTR ERR MSG             69036000
  818.     ELSE WRITE(RMT,<8"THE FILE YOU REQUESTED IS NOT AVAILABLE"4"3D">)   69037000
  819.   END SEND;                                                             69038000
  820. BOOLEAN PROCEDURE RCV_DATA(MINREC,MAXREC);                              70000000
  821.     VALUE MINREC,MAXREC;                                                70001000
  822.     REAL  MINREC,MAXREC;                                                70002000
  823.   BEGIN                                                                 70003000
  824.     REAL T,LI,L2,LO;    % PACKET TYPE, CHARACTER COUNTS                 70004000
  825.     POINTER PI,PO;      % INPUT AND OUTPUT POINTERS                     70005000
  826.     EBCDIC ARRAY OUTBUFF[0:MAXREC-1];                                   70006000
  827.     DEFINE CR=47"0D"#, LF=47"0A"#;                                      70007000
  828.     TRUTHSET NEWLINE (CR OR LF);                                        70008000
  829.                                                                         70009000
  830.     DEFINE FORWARD(X)=                                                  70010000
  831.                   BEGIN                                                 70011000
  832.                     PI:=*+(X);                                          70012000
  833.                     LI:=*-(X)                                           70013000
  834.                   END   #                                               70014000
  835.         ,  CLEAROUTBUFF =                                               70015000
  836.                   BEGIN                                                 70016000
  837.                     LO:= 0;     % NO CHARS IN BUFFER                    70017000
  838.                     REPLACE PO:= OUTBUFF BY 8" " FOR MAXREC             70018000
  839.                   END    #                                              70019000
  840.         ;                                                               70020000
  841.                                                                         70021000
  842.  $SET OMIT= NDLSETUP                                                    70021250
  843.     DEFINE INITAUTO= PPUT(ACK_TYPE,0) #; % NDL DOES NOT SUPPORT AUTO RCV70021500
  844.  $POP OMIT SET OMIT= NOT NDLSETUP                                       70021750
  845.     BOOLEAN PROCEDURE INITAUTO;          % NDL SUPPORTS AUTO RECV       70022000
  846. %     % INITIATE NDL AUTOMATIC DATA PACKET RECEIVE                      70023000
  847.       BEGIN                                                             70024000
  848.         REPLACE PKT BY AUTORCV, KERCHAR(YOURNPAD),KERCHAR(YOURPAD)      70025000
  849.                      , KERCHAR(0), KERCHAR(SEQ.[5:6]),8"D";             70026000
  850.         INITAUTO:= WRITE(RMT[STOP],6,PKT);                              70027000
  851.         DEBUGARRAY (6,PKT,8"AUTINT",TRUE);                              70028000
  852.       END;                                                              70029000
  853.  $POP OMIT                                                              70029500
  854.     BOOLEAN PROCEDURE REINIT;   % NDL DROPPED OUT OF AUTO RECEIVE       70030000
  855.       BEGIN                                                             70031000
  856.         IF NOT INITAUTO THEN    % SENT INIT TO NDL OK                   70032000
  857.           BEGIN                                                         70033000
  858.             REPLACE COUNT_CHAR BY FIRST_DATA FOR PKL;  % LIKE AN AUTOPKT70034000
  859.             REINIT:= TRUE;      % TRUE RESULT INDICATES SUCCESS         70035000
  860.           END                                                           70036000
  861.       END REINIT;                                                       70037000
  862.                                                                         70038000
  863. % RCV_DATA STATEMENTS:                                                  70039000
  864.     CLEAROUTBUFF;           % PREPARE OUTPUT BUFFER AND POINTER         70040000
  865.                                                                         70041000
  866.     % PUT NDL INTO AUTO RECEIVE MODE:                                   70042000
  867.     IF INITAUTO THEN  % FAILED                                          70043000
  868.         RCV_DATA:= TRUE   % REPORT FAILURE TO RECEIVE FILE              70044000
  869.     ELSE                                                                70045000
  870.                                                                         70046000
  871.         %LOOP FOR EVERY DATA PACKET                                     70047000
  872.         WHILE                                                           70048000
  873.             IF LO > MAXREC THEN FALSE   % ABORT EXIT                    70049000
  874.             ELSE                                                        70050000
  875.                 IF BOOLEAN(T:= GETPACKET(FALSE)) THEN                   70051000
  876.                     FALSE      % NOT DATA PACKET                        70051500
  877.                 ELSE    % DATA PACKET--AUTO OR OTHERWISE                70052000
  878.                     IF T = DATA_TYPE THEN                               70053000
  879.                         REINIT  % GOOD PACKET--BUT ALSO RESTART NDL AUTO70054000
  880.                     ELSE TRUE   % GOOD AUTO PACKET--CONTINUE LOOPING    70055000
  881.         DO                                                              70056000
  882.           BEGIN                                                         70057000
  883.             PI:= COUNT_CHAR;    % DATA PART OF PACKET STARTS HERE       70057250
  884.             LI:= PKL;           % LENGTH OF DATA IN PACKET              70057500
  885.                                                                         70057750
  886.             % BREAK INTO LOGICAL RECORDS:                               70058000
  887.             DO                                                          70059000
  888.               BEGIN                                                     70060000
  889.                 SCAN PI FOR L2:LI UNTIL IN NEWLINE;                     70061000
  890.                 L2:= LI-L2;     % # CHARS TO END OF LINE                70062000
  891.                 LI:= *-L2;      % # CHARS LEFT IN INPUT AFTER THIS LINE 70063000
  892.                 IF LO:=*+L2 > MAXREC THEN  % RECORD TOO LARGE           70064000
  893.                   BEGIN                                                 70065000
  894.                     LI:=0;  % SIMULATE END OF PACKET TO EXIT LOOP       70066000
  895.                     ERROUT(7"RECORD TOO LONG TO FIT INTO FILE");        70067000
  896.                     RCV_DATA:= TRUE;    % REPORT FAILURE TO CALLER      70068000
  897.                   END                                                   70069000
  898.                 ELSE                                                    70070000
  899.                   BEGIN                                                 70071000
  900.                     REPLACE PO:PO BY PI:PI FOR L2 WITH ASCIITOEBCDIC;   70072000
  901.                     IF LI > 0 THEN   % STILL DATA CHARS IN PKT          70072500
  902.                         IF PI IN NEWLINE THEN  % END OF A RECORD        70073000
  903.                           BEGIN                                         70074000
  904.                             IF PI=CR THEN                               70075000
  905.                                 IF CAND (LI>1, PI+1=LF) THEN            70075500
  906.                                         FORWARD(2)  % CRLF              70076000
  907.                                 ELSE    FORWARD(1)  % CR                70077000
  908.                             ELSE        FORWARD(1); % LF                70078000
  909.                             WRITE (FYLE,MAX(MINREC,LO),OUTBUFF);        70079000
  910.                                                                         70080000
  911.                             CLEAROUTBUFF                                70081000
  912.               END END     END                                           70082000
  913.             UNTIL LI=0  % LOOP UNTIL END OF INPUT REC                   70083000
  914.           END;  % LOOP UNTIL ALL PACKETS HAVE BEEN RECEIVED             70084000
  915.                                                                         70085000
  916.         % CLOSE FILE...IF SUCCESSFULLY RECEIVED ENTIRE FILE THE FILE    70086000
  917.         % IS CLOSED WITH LOCK, OTHERWISE JUST RELEASED                  70087000
  918.         IF T = Z_TYPE THEN      % GOT EOF PACKET                        70088000
  919.             LOCK(FYLE,CRUNCH)                                           70089000
  920.         ELSE                                                            70089250
  921.           BEGIN                                                         70089500
  922.             CLOSE(FYLE);                                                70090000
  923.             RCV_DATA:= T= ERR_TYPE  % DO NOT WAIT FOR BREAK IF ERROR    70090250
  924.           END                                                           70090500
  925.   END RCV_DATA;                                                         70091000
  926. BOOLEAN PROCEDURE RCV_INIT;                                             75000000
  927.   BEGIN                                                                 75001000
  928.     REAL E;     % ERROR CODE FROM PGET                                  75002000
  929.     DEFINE   TRYAGAIN =         % E IS ALREADY NON-ZERO SO CONTINUE LOOP75003000
  930.                   BEGIN                                                 75004000
  931.                     IF PPUT (NAK_TYPE,0) THEN ABORT                     75005000
  932.                   END   #                                               75006000
  933.         ,    ABORT =                                                    75007000
  934.                   BEGIN                                                 75008000
  935.                     RCV_INIT:= TRUE;   % NOTIFY CALLER OF FAILURE       75009000
  936.                     E:= 0               % GET OUT OF LOOP               75010000
  937.                   END   #                                               75011000
  938.         ,    SHUTDOWN =                                                 75012000
  939.                   BEGIN                                                 75013000
  940.                     ERROUT(7"IO ERROR");  % TRY TO TELL REMOTE          75014000
  941.                     ABORT                 % NOW GO AWAY                 75015000
  942.                   END   #                                               75016000
  943.         ,    SYNC_SEQ =         % GOT AN UNEXPECTED SEQ VALUE           75017000
  944.                   BEGIN                                                 75018000
  945.                     SEQ:= ORD(SEQ_CHAR);  % CHANGE OUR EXPECTATION      75019000
  946.                     TRYAGAIN                                            75020000
  947.                   END   #                                               75021000
  948.         ;                                                               75022000
  949.                                                                         75023000
  950.     DO   % LOOP UNTIL AN S-PACKET IS RECEIVED                           75024000
  951.         CASE E:= PGET(TRUE) OF                                          75025000
  952.           BEGIN                                                         75026000
  953.             % A GOOD PACKET-- IS IT AN "S" PACKET?                      75027000
  954.             IF TYPE_CHAR = 7"S" THEN                                    75028000
  955.               BEGIN                                                     75029000
  956.                 GETINIT;        % EXTRACT S PACKET PARAMETERS           75030000
  957.                 E:= SETINIT;    % SET UP ACK PACKET PARAMETERS          75031000
  958.                 IF PPUT(ACK_TYPE,E) THEN    % AND SEND ACK              75032000
  959.                     ABORT               % FATAL IO ERROR                75033000
  960.                 ELSE E:= 0              % SUCCESS -- GET OUT OF LOOP    75034000
  961.               END                                                       75035000
  962.             ELSE                                                        75036000
  963.             IF TYPE_CHAR = 7"E" THEN                                    75037000
  964.                 ABORT               % INDICATE FATAL ERROR--EXIT LOOP   75038000
  965.             ELSE        % TREAT ANY OTHER PACKET AS A NAK               75039000
  966.                 E:= 1;  % AND LOOP BACK FOR MORE                        75040000
  967.                                                                         75041000
  968.             % NO PACKET RECEIVED:                                       75042000
  969.             TRYAGAIN;           % TIMEOUT                               75043000
  970.             ABORT;              % EOF                                   75044000
  971.             SHUTDOWN;           % IO ERROR                              75045000
  972.             TRYAGAIN;           % NOT A PACKET                          75046000
  973.             TRYAGAIN;           % SHORT PACKET                          75047000
  974.             TRYAGAIN;           % CHECKSUM ERROR                        75048000
  975.             SYNC_SEQ;           %                                       75049000
  976.             SYNC_SEQ;           % OUT OF SEQUENCE--RESET SEQ AND RETRY  75050000
  977.             SYNC_SEQ;           %                                       75051000
  978.           END CASE                                                      75052000
  979.     UNTIL E=0                                                           75053000
  980.   END RCV_INIT;                                                         75054000
  981. PROCEDURE RECV;                                                         79000000
  982.   BEGIN                                                                 79001000
  983.  %  IF CAND(NOT FYLE.NEWFILE, FYLE.RESIDENT) THEN                       79002000
  984.  %      WRITE(RMT,<8"A FILE ALREADY EXISTS WITH THE SAME NAME AS "      79004000
  985.  %                 8"THE FILE YOU WISHED TO CREATE" 4"3D">)             79005000
  986.  %  ELSE                                                                79006000
  987.         IF COR(FYLE.BLOCKSTRUCTURE=VALUE(FIXED)                         79007000
  988.               ,FYLE.BLOCKSTRUCTURE=VALUE(EXTERNAL) AND                  79008000
  989.                     FYLE.KIND=VALUE(REMOTE) OR FYLE.KIND=VALUE(PRINTER) 79009000
  990.                     OR FYLE.KIND=VALUE(TAPE)                            79010000
  991.               )                                                         79011000
  992.         THEN    % ACCEPTABLE BLOCK STRUCTURE                            79012000
  993.           BEGIN                                                         79013000
  994.             FYLE.OPEN:= TRUE;                                           79014000
  995.             WHEN(1);                % ACCOMODATE POKEY APPLE            79014500
  996.             IF FYLE.ATTERR THEN     % TELL OTHER END WE'VE FAILED       79015000
  997.                 WRITE(RMT,<4"3D">)  % BY SENDING A NAK                  79016000
  998.             ELSE                                                        79017000
  999.               BEGIN                                                     79018000
  1000.                 WRITE(RMT,<4"07">);  % DEL TO LET 'EM KNOW WE'RE READY  79019000
  1001.                 IF RCV_INIT THEN   % UNABLE TO ESTABLISH                79020000
  1002.                 ELSE    % KERMIT TALKING TO KERMIT OK                   79021000
  1003.                     % GET AND IGNORE FILE ID PACKET                     79022000
  1004.                     IF GETPACKET(TRUE) = F_TYPE THEN                    79023000
  1005.                       BEGIN                                             79024000
  1006.                                                                         79024250
  1007.                         % ACTUAL FILE TRANSFER:                         79024500
  1008.                         IF NOT RCV_DATA                                 79025000
  1009.                                    (IF FYLE.MINRECSIZE=0 THEN           79025050
  1010.                                          FYLE.MAXRECSIZE                79025100
  1011.                                     ELSE FYLE.MINRECSIZE                79025150
  1012.                                    ,FYLE.MAXRECSIZE                     79025200
  1013.                                    )                                    79025250
  1014.                         THEN                                            79025500
  1015.                             IF GETPACKET(TRUE) NEQ B_TYPE THEN          79026000
  1016.                                 ERROUT(7"CAN ONLY RECEIVE ONE FILE")    79027000
  1017.           END END     END                                               79028000
  1018.         ELSE WRITE(RMT,<8"ILLEGAL BLOCKSTRUCTURE"4"3D">)                79029000
  1019.   END   R E C V ;                                                       79030000
  1020. %  OUTER BLOCK STATEMENTS START HERE:                                   90000000
  1021.                                                                         90002000
  1022. REPLACE P(CTLCHARS,0) BY 4"0000FFFFFFFF" FOR 1 WORDS, 0 FOR 2 WORDS     90003000
  1023.                        , 4"000000000001" FOR 1 WORDS                    90004000
  1024.                        , P(CTLCHARS,0) FOR 4 WORDS                      90005000
  1025.                        ;  % SET UP DYNAMIC TRUTHSET--LATER ADD CTL QUOTE90006000
  1026. YOURTIMOUT:= MYTIMOUT+1;    % THE TWO TIMEOUTS SHOULD BE DIFFERENT      90007000
  1027. MARK:=1;    % MARK DEFAULTS TO ASCII SOH CHARACTER                      90008000
  1028. DEBUGGING:= BOOLEAN(MYSELF.TASKVALUE);                                  90009000
  1029.                                                                         90011000
  1030. IF FYLE.MYUSE = VALUE(IN) THEN SEND                                     90012000
  1031. ELSE RECV                                                               90013000
  1032. END.                                                                    99999999
  1033.