home *** CD-ROM | disk | FTP | other *** search
/ Columbia Kermit / kermit.zip / cmsoriginal / cmsv2.asm next >
Assembly Source File  |  2020-01-01  |  343KB  |  4,230 lines

  1. KERMIT   TITLE     'KERMIT-CMS'                                         00001000
  2. KERMIT   CSECT                                                          00002000
  3. * KERMIT   -                                                            00003000
  4. *                                                                       00004000
  5. *  Kermit CMS Version 2.01                                              00005000
  6. *  May 20, 1985                                                         00006000
  7. *                                                                       00007000
  8. *  This program is the IBM VM/CMS side of a file transfer system.       00008000
  9. *  It can be used to transfer files between a micro and a system        00009000
  10. *  running under VM/CMS.                                                00010000
  11. *  See the KERMIT User's Guide and Protocol manual for the complete     00011000
  12. *  program specifications to which this program and any other           00012000
  13. *  component of the system must adhere.                                 00013000
  14. *                                                                       00014000
  15. *  Daphne Tzoar, Columbia University Center for Computing Activities    00015000
  16. *  March 1982                                                           00016000
  17. *                                                                       00016100
  18. *  Version 2.01                                                         00016150
  19. *                                                                       00016200
  20. * [23] May  85: If virtual console is not a TTY, assume 3270.           00016250
  21. * [24] May  85: If no repeat prefixing, reset all variables.            00016300
  22. * [25] May  85: Fix problem of repeat prefixing of CR or LF.            00016350
  23. *                                                                       00017000
  24. *  Version 2.0                                                          00018000
  25. *  [1] Sept 83: Add 8-bit quoting to allow transfer of fixed format     00019000
  26. *               binary files.                                           00020000
  27. *  [2] Sept 83: Don't restrict incoming/outgoing record size to 256.    00021000
  28. *  [3] Aug  84: Print a version number upon startup.  Improve handling  00022000
  29. *               of keywords.  Maybe by the next release.                00023000
  30. *  [4] Aug  84: Pack as much data into a packet as possible.  Clean     00024000
  31. *               things up a bit.                                        00025000
  32. *  [5] Aug  84: Use common routines SPAR and RPAR for init packets.     00026000
  33. *  [6] Aug  84: Re-write decoding routine.                              00027000
  34. *  [7] Sept 84: Add repeat count prefixing.                             00028000
  35. *  [8] Sept 84: Add support for two character checksum and three        00029000
  36. *               character CRC.                                          00030000
  37. *  [9] Oct  84: If no filetype supplied on incoming file, use "X"       00031000
  38. *               rather than fail.  Default filemode to "*" on send.     00032000
  39. *               Remove redundant filename handling code from RDATA.     00033000
  40. *               Replace invalid letter in filename with "X".            00034000
  41. * [10] Oct  84: Add SET/SHOW DEBUG mode.  If OFF, ignore atten-         00035000
  42. *               tion if user types a BREAK.  Don't ignore if ON.        00036000
  43. * [11] Dec  84: If input supplied on command line, execute command      00037000
  44. *               and return to CMS (not to Kermit prompt mode).          00038000
  45. *               Allow several commands, separated by pound signs.       00039000
  46. * [12] Feb  85: Add support for Series/1 front end.  Bob Shields        00040000
  47. *               Temporarily turn off MSG, WNG, IMSG (if S/1 or TTY).    00041000
  48. * [13] Mar  85: Add server support including only basic functions.  Put 00042000
  49. *               send-error-packet code in one place only.  Make packet  00043000
  50. *               numbers more meaningful (n -> spknum, num -> rpknum).   00044000
  51. * [14] Mar  85: If debugging is on, log packets in a file.              00045000
  52. * [15] Mar  85: Upon startup, read commands from two init files: SYSTEM 00046000
  53. *               KERMINI and (USERID) KERMINI.  Lines with asterisk as   00047000
  54. *               the first character are comments.  Add TAKE command.    00048000
  55. *               Lrecl for these files must be 130 or less.              00049000
  56. * [16] Mar  85: Implement skip file or file group when sending.  Ditto  00050000
  57. *               for receiving (discard incoming file).                  00051000
  58. * [17] Apr  85: Add a SHOW ALL command.                                 00052000
  59. * [18] Apr  85: Add SET WARNING ON/OFF in case incoming file has the    00053000
  60. *               same name as an existing one.  If ON, rename incoming   00054000
  61. *               file.  If OFF, overwrite existing file.                 00055000
  62. * [19] Apr  85: Make ATOE table 256 characters long, as it should be.   00056000
  63. *               Modify SPACK and RPACK cosole I/O to use plists with    00057000
  64. *               flags to bypass user translate tables.  Bob Shields     00058000
  65. *               Use prompt of XON.                                      00059000
  66. * [20] Apr  85: Add SET ETOA and SET ATOE to allow user to modify       00060000
  67. *               the translate tables so they conform to his system.     00061000
  68. *               Display tables with new command: TDUMP.  Have SET       00062000
  69. *               routines use common code to get decimal input.          00063000
  70. * [21] Apr  85: Moved some code to different base register, 4K limit.   00064000
  71. * [22] Apr  85: Encode outgoing filename, decode incoming one.  Need    00065000
  72. *               a general routine to setup for encode/decode routines.  00066000
  73. *                                                                       00067000
  74. *  Version 1.0 Updates:                                                 00068000
  75. *  June 82:Only allow Kermit to run on an ASCII terminal.  Else, stop   00069000
  76. *          execution.  Also, check padding when receiving file in       00070000
  77. *          fixed format.  If only pad one character, pad the balance    00071000
  78. *          via the "EX" option, else skip that command.                 00072000
  79. *  Aug 82: Change "FSREAD" when sending to allow a maximum of 133, not  00073000
  80. *          the full buffer size since need two spaces for CRLF.         00074000
  81. *  Apr 83: Fix maximum number of tries on init (to 16), set timeout     00075000
  82. *          value to 8, and do "CTL" function to padding character       00076000
  83. *          in SINIT (not CHAR).                                         00077000
  84. *  Feb 84: Add fix so that when receive a file with RECFM = F, program  00078000
  85. *          does not abort with DISK FULL error.  Changes are indicated  00079000
  86. *          by the phrase '[edit]' in the comment.   Fix: Bill Small.    00080000
  87. *                                                                       00081000
  88. *  Please address all comments and questions to:                        00082000
  89. *  716 Watson                                                           00083000
  90. *  612 W. 115th St.                                                     00084000
  91. *  NY,NY, 10025                                                         00085000
  92. *  (212) 280-3703                                                       00086000
  93. *                                                                       00087000
  94. * Copyright (C) 1982,1983 Columbia University                           00088000
  95. *                                                                       00089000
  96. * Permission is granted to any individual or institution to copy        00090000
  97. * or use this program, except for explicitly commercial purposes.       00091000
  98. *                                                                       00092000
  99. * Note: If you find and correct problems in the program, please         00093000
  100. * forward all changes to the author.                                    00094000
  101. *                                                                       00095000
  102.          EJECT                                                          00096000
  103. * REGISTER USAGE -                                                      00097000
  104. * R1 -                                                                  00098000
  105. * R2 -                                                                  00099000
  106. * R3 -                                                                  00100000
  107. * R4 -                                                                  00101000
  108. * R5 -                                                                  00102000
  109. * R6 -                                                                  00103000
  110. * R7 -                                                                  00104000
  111. * R8 -                                                                  00105000
  112. * R9 -                                                                  00106000
  113. * R10 -                                                                 00107000
  114. * R11 - BASE REGISTER FOR GLOBAL DATA AREA                              00108000
  115. * R12 - PROGRAM BASE                                                    00109000
  116. * R13 - SAVE AREA                                                       00110000
  117. * R14 - SUBROUTINE LINKAGE                                              00111000
  118. * R15 - SUBROUTINE LINKAGE                                              00112000
  119. *                                                                       00113000
  120. * EXTERNAL MACROS/MODULES CALLED -                                      00114000
  121. *  The following MACLIBs should be GLOBAL'd:                            00115000
  122. *       DMSSP, CMSLIB, TSOMAC                                           00116000
  123. *                                                                       00117000
  124. *  The following external routines are called:                          00118000
  125. *       NEXTFST ASSEMBLE                                                00119000
  126. *       WILD ASSEMBLE                                                   00120000
  127. *                                                                       00121000
  128. *                                                                       00122000
  129.          SPACE                                                          00123000
  130.          PRINT     NOGEN                                                00124000
  131.          REGEQU                                                         00125000
  132.          FSTD      DSECT               WILL NEED FOR NEXTFST ROUTINE    00126000
  133.          ADT       DSECT                                                00127000
  134.          NUCON     DSECT               USE IN TOKENIZER ROUTINE         00128000
  135.          EXTSECT   DSECT               USE WHEN TURNING BLIP OFF        00129000
  136.          SPACE                                                          00130000
  137. SOH      EQU       X'01'               ^a FOR START OF HEADER CHAR      00131000
  138. XON      EQU       X'11'               XON [13]                         00132000
  139. AD       EQU       68                  DATA PACKET (ASCII 'D')          00133000
  140. AN       EQU       78                  NAK                              00134000
  141. AZ       EQU       90                  EOF packet, skip file group [16] 00135000
  142. AS       EQU       83                  INIT PACKET                      00136000
  143. AY       EQU       89                  ACK                              00137000
  144. AF       EQU       70                  FILE PACKET                      00138000
  145. AB       EQU       66                  BREAK PACKET                     00139000
  146. AE       EQU       69                  ERROR PACKET                     00140000
  147. AR       EQU       82                  Get packet "R" [13]              00141000
  148. AG       EQU       71                  Generic server packet "G" [13]   00142000
  149. AL       EQU       76                  Logout packet "L" [13]           00143000
  150. AI       EQU       73                  Parameter init packet "I" [13]   00144000
  151. AX       EQU       88                  Skip file when sending [16]      00145000
  152. ACR      EQU       13                  Ascii CR  [25]                   00145100
  153. ALF      EQU       10                  Ascii LF  [25]                   00145200
  154. ERCOD    EQU       12                  MEANS EOF WITH 'FSREAD'          00146000
  155. MAXTXT   EQU       64536               Max output buffer is 64K [6]     00147000
  156. MAXBIN   EQU       80                  Max output for binary files [1]  00148000
  157. * Fields of variable FLAGS:                                             00149000
  158. FLG1     EQU       X'80'               IS FILE THE FIRST OR NOT         00150000
  159. FLG2     EQU       X'40'               OVERWRITE SENT FILENAME?         00151000
  160. FLG3     EQU       X'20'               ONE = SENT ONLY PARTIAL RECORD   00152000
  161. FLG4     EQU       X'10'               NAK FROM MICRO(0) OR RPACK(1)?   00153000
  162. FLG5     EQU       X'08'               ALLOCATED MORE SPACE (DMSFREE)   00154000
  163. BINF     EQU       X'04'               ONE := BINARY DATA  [1]          00155000
  164. FLG7     EQU       X'02'               One := End-of-file  [4]          00156000
  165. DEBUG    EQU       X'01'               Debug mode ON/OFF [10]           00157000
  166. * Fields of variable LFLAGS:                                            00158000
  167. FMSGON   EQU       X'80'               CP SET MSG was ON [12]           00159000
  168. FWNGON   EQU       X'40'               CP SET WNG was ON [12]           00160000
  169. FIMSGON  EQU       X'20'               CP SET IMSG was ON [12]          00161000
  170. SERVON   EQU       X'10'               In SERVER mode [13]              00162000
  171. TAKON    EQU       X'08'               TAKE command [15]                00163000
  172. ALLFL    EQU       X'04'               SHOW ALL requested [17]          00164000
  173. WARFL    EQU       X'02'               Rename incoming file [18]        00165000
  174. CMDL     EQU       X'01'               Data on cmd line [11]            00166000
  175. *                                                                       00167000
  176. DSSIZ    EQU       X'50'               Default send packet size [4]     00168000
  177. DQUOTE   EQU       X'23'               Default quote character = # [4]  00169000
  178. D8QUO    EQU       X'26'               Default 8-bit quochar=&  [1][4]  00170000
  179. DCHKLEN  EQU       X'01'               Default checksum length [4]      00171000
  180. DRPT     EQU       X'7E'               Default repeat prefix  TILDE [4] 00172000
  181. DEOL     EQU       X'0D'               Default end of packet (CR) [4]   00173000
  182. DLRECL   EQU       X'50'               Default lrecl size = 80 [4]      00174000
  183. DRECFM   EQU       X'E5'               Default is variable recfm [4]    00175000
  184. DSTIM    EQU       X'08'               Default send time out [4]        00176000
  185. DRTIM    EQU       X'0D'               Default receive time out [4]     00177000
  186. DSPAD    EQU       X'00'               Default send padding. [4]        00178000
  187. DRPAD    EQU       X'00'               Default receive padding. [4]     00179000
  188. DSPADC   EQU       X'00'               Default send padding char. [4]   00180000
  189. DRPADC   EQU       X'00'               Default rec padding char. [4]    00181000
  190. SPMIN    EQU       X'14'               Min send packet size (20) [5]    00182000
  191. SPMAX    EQU       X'5E'               Max send packet size (94) [5]    00183000
  192. RPTMIN   EQU       X'03'               Min repeats for quoting [7]      00184000
  193. TAKMAX   EQU       10                  Max TAKE nesting level [15]      00185000
  194. *                                                                       00186000
  195. * For Series/1 [12 start]                                               00187000
  196. ASCXON   EQU       X'91'               X-ON (DC1) with hi order bit on  00188000
  197. * Fields of variable S1FLAGS                                            00189000
  198. S1INIT   EQU       X'80'               Init for S/1 already done [13]   00190000
  199. ISS1     EQU       X'01'               Console is S/1                   00191000
  200. * CCW flags:                                                            00192000
  201. CC       EQU       X'40'               Chained CCW follows              00193000
  202. SLI      EQU       X'20'               Suppress Incorr Len Ind          00194000
  203. * WCC flag bits and 3270 orders:                                        00195000
  204. ALARM    EQU       X'04'               ring alarm                       00196000
  205. UNLKKB   EQU       X'02'               unlock keyboard                  00197000
  206. SBA      EQU       X'11'               Set Buffer Address (3270)        00198000
  207. IC       EQU       X'13'               Insert Cursor (3270)             00199000
  208. * CSW flag bits:                                                        00200000
  209. ATTN     EQU       X'80'               attention                        00201000
  210. STATMOD  EQU       X'40'               status modifier                  00202000
  211. CUEND    EQU       X'20'               control unit end                 00203000
  212. BUSY     EQU       X'10'               busy                             00204000
  213. CHEND    EQU       X'08'               channel end                      00205000
  214. DEVEND   EQU       X'04'               device end                       00206000
  215. UNCHK    EQU       X'02'               unit check                       00207000
  216. UNXCPT   EQU       X'01'               unit exception                   00208000
  217. CPBRK    EQU       ATTN+CHEND+DEVEND+UNCHK      CP break-in  [12 end]   00209000
  218. *                                                                       00210000
  219.          EJECT                                                          00211000
  220. KERMIT   CSECT                                                          00212000
  221.          STM       R14,R12,12(R13)                                      00213000
  222.          BALR      R12,0                                                00214000
  223.          USING     *,R12                                                00215000
  224.          LA        R14,KSAVE                                            00216000
  225.          ST        R13,4(R14)                                           00217000
  226.          ST        R14,8(R13)                                           00218000
  227.          LR        R13,R14                                              00219000
  228. *                                                                       00220000
  229. * USE R11 AS BASE REGISTER FOR THE SHARED DATA AREA                     00221000
  230.          L         R11,=A(PARMS)                                        00222000
  231.          USING     PARMS,R11                                            00223000
  232.          LR        R6,R1               HOLD ON TO CONSOLE BUFFER        00224000
  233.          SR        R2,R2                                                00225000
  234.          BCTR      R2,0                Get info by using addr -1        00226000
  235.          DC        X'83230024'         GET LINESIZE DATA - DIAG 24      00227000
  236.          STH       R2,CONSADDR         Save console addr (CUU) [12]     00228000
  237.          XC        LINSIZ,LINSIZ                                        00229000
  238.          STC       R4,LINSIZ+3         SAVE THE LINESIZE                00230000
  239.          ST        R4,TEMP             Put here for compare [12]        00231000
  240.          MVI       S1FLAGS,X'00'       Clear S/1 flags [12]             00232000
  241.          CLC       CONSTTY,TEMP        Is console Ascii TTY? [12]       00233000
  242.          BE        OKDEV               Yes it's OK [12]                 00234000
  243. *        CLC       CONS772,TEMP        Is console 3277 mod 2? [12][23]  00235000
  244. *        BNE       BADDEV              No fail [12] [23]                00236000
  245.          OI        S1FLAGS,ISS1        Remember going via S/1 [12]      00237000
  246. OKDEV    LA        R7,=C'TERM LINES 130'                                00238000
  247.          LA        R8,14                                                00239000
  248.          DIAG      7,8,8               SET TO HIGHEST POSSIBLE VALUE    00240000
  249.          USING     NUCON,0             FOR TOKENIZER                    00241000
  250.          L         R7,AEXTSECT         LOC OF CMS ROUTINE EXTSECT       00242000
  251.          USING     EXTSECT,R7                                           00243000
  252.          MVC       BLIP(1),TIMCHAR     SAVE USER'S BLIP CHAR            00244000
  253.          DMSEXS    MVI,TIMCHAR,X'00'   TURN OFF BLIP FOR NOW            00245000
  254.          DROP      R7                                                   00246000
  255.          L         R15,=A(INIT)                                         00247000
  256.          BALR      R14,R15             CALL THE INITIALIZATION          00248000
  257.          L         R15,=A(PACKLEN)                                      00249000
  258.          BALR      R14,R15             Get max send packet size [4]     00250000
  259.          LA        R1,1                Set flags for next call [12]     00251000
  260.          L         R15,=A(SETMSGS)     Turn off MSG, WNG, IMSG [12]     00252000
  261.          BALR      R14,R15             [12]                             00253000
  262. * Get two 64K buffers for reading from and writing to files. [2]        00254000
  263. * Should really be 64K+2 for the possible CRLF added to end of the      00255000
  264. * send buffer.  The overrun will go into the receive buffer which       00256000
  265. * is OK since only one of send or receive is active at any time.        00257000
  266.          L         R0,=F'16384'        REQUEST 128K TOTAL [2 START]     00258000
  267.          DMSFREE   DWORDS=(0),ERR=ERRBUF,MSG=NO                         00259000
  268.          ST        R1,ABUF             ADDR OF FIRST BUFFER             00260000
  269.          A         R1,=F'64536'        SECOND BUFFER IS 64K ...         00261000
  270.          ST        R1,ARBUF            AWAY FROM FIRST [2 END]          00262000
  271.          MVI       TAKLEV,X'00'        TAKE file nesting [15 start]     00263000
  272.          LA        R2,INFOBUF          Put diag result here             00264000
  273.          L         R3,=F'32'           Get this much info               00265000
  274.          DC        X'83230000'         Issue the diagnose               00266000
  275.          LA        R2,INFOBUF                                           00267000
  276.          MVC       UNAME(8),16(R2)     Move to our buffer               00268000
  277.          LA        R2,UNAME            Point to init filename           00269000
  278.          FSOPEN    (R2)                Look for init file               00270000
  279.          LTR       R15,R15             Is it there                      00271000
  280.          BNZ       INIF0               Didn't find one                  00272000
  281.          MVI       TAKLEV,X'01'        Increment to one                 00273000
  282.          MVC       TAKTAB(18),0(R2)    Add to TAKE table                00274000
  283.          OI        LFLAGS,TAKON        Commands are from file           00275000
  284. INIF0    LA        R2,SYSTAK           Now look for SYSTEM KERMINI      00276000
  285.          FSOPEN    (R2)                                                 00277000
  286.          LTR       R15,R15             Is it there                      00278000
  287.          BNZ       INIF2               No                               00279000
  288.          SR        R5,R5               Clear to pick up byte            00280000
  289.          SR        R4,R4               Offset into TAKE table           00281000
  290.          IC        R5,TAKLEV           Get current TAKE level           00282000
  291.          LTR       R5,R5               Any levels so far                00283000
  292.          BZ        INIF1               No so offset is OK               00284000
  293.          LA        R4,18(R4)           Bump to next spot in table       00285000
  294. INIF1    LA        R4,TAKTAB(R4)       Where to add file                00286000
  295.          MVC       0(18,R4),0(R2)      Add to TAKE table                00287000
  296.          LA        R5,1(R5)            Increment it                     00288000
  297.          STC       R5,TAKLEV                                            00289000
  298.          OI        LFLAGS,TAKON        Commands are from file [15 end]  00290000
  299. INIF2    SR        R15,R15             ZERO RC INITIALLY (IF EXIT)      00291000
  300.          MVI       EXTFLG,X'00'        Don't exit yet [11]              00292000
  301.          OI        LFLAGS,CMDL         Set if info on cmd line [11]     00293000
  302.          LA        R6,8(R6)                                             00294000
  303.          CLC       0(8,R6),=8X'FF'     ALL COMMAND ON ONE LINE?         00295000
  304.          BNE       NOPRO               NO PROMPT IF YES                 00296000
  305.          NI        LFLAGS,X'FF'-CMDL   Nothing at command line [11]     00297000
  306.          LA        R5,PROMSG           Address of prompt string [3]     00298000
  307.          LA        R4,L'PROMSG         And it's length          [3]     00299000
  308.          WRTERM    (R5),(R4)           Print it                 [3]     00300000
  309.          LA        R5,HELPM            Address of help string   [3]     00301000
  310.          LA        R4,L'HELPM          And it's length          [3]     00302000
  311.          WRTERM    (R5),(R4)           Print it                 [3]     00303000
  312.          WRTERM    ' '                 And leave a blank line [3]       00304000
  313. PROMPT   CLI       EXTFLG,X'FF'        Time to exit? [11]               00305000
  314.          BE        LV2                 Yup [11]                         00306000
  315.          TM        LFLAGS,CMDL         Data on cmd line? [11]           00307000
  316.          BO        PRO4                Yes go check [11]                00308000
  317.          TM        LFLAGS,TAKON        Using TAKE file? [15 start]      00309000
  318.          BNO       PRO1                No go prompt                     00310000
  319.          XC        INPUT,INPUT         Should be clear                  00311000
  320.          SR        R3,R3                                                00312000
  321.          IC        R3,TAKLEV           Get current TAKE level           00313000
  322.          BCTR      R3,0                                                 00314000
  323.          M         R2,=F'18'           Get offset into table            00315000
  324.          LA        R2,TAKTAB(R3)       Point to TAKE file name          00316000
  325.          FSREAD    (R2),BUFFER=INPUT,BSIZE=130,FORM=E                   00317000
  326.          TR        INPUT(130),UPC      Upcase the input                 00318000
  327.          LTR       R15,R15             Read in OK?                      00319000
  328.          BZ        PRO2                Yes go parse                     00320000
  329.          C         R15,=A(ERCOD)       End of file                      00321000
  330.          BE        PRO3                                                 00322000
  331.          WRTERM    'Error reading command from TAKE or INIT file'       00323000
  332. PRO3     SR        R2,R2                                                00324000
  333.          IC        R2,TAKLEV           Get TAKE level                   00325000
  334.          BCTR      R2,0                And decrement it                 00326000
  335.          STC       R2,TAKLEV                                            00327000
  336.          LTR       R2,R2               Test level                       00328000
  337.          BNZ       PROMPT              Not done with TAKE yet           00329000
  338.          NI        LFLAGS,X'FF'-TAKON                                   00330000
  339.          B         PROMPT              Done with init/TAKE [15 end]     00331000
  340. PRO1     WRTERM    'KERMIT-CMS>',EDIT=NO                                00332000
  341. PRO4     RDTERM    INPUT               No prompt [11]                   00333000
  342. PRO2     DMSKEY    NUCLEUS                                              00334000
  343.          LA        R1,INPUT            R1 GETS ADDRESS OF STRING        00335000
  344. * RDTERM and FSREAD return amount actually read in R0.                  00336000
  345. *        L         R0,=F'130'          R0 GETS THE LENGTH               00337000
  346.          L         R15,ASCANN                                           00338000
  347.          BALR      R14,R15             DO TOKENIZING                    00339000
  348.          LR        R6,R1               SAVE ADDR OF TOKENIZED LIST      00340000
  349.          DMSKEY    RESET                                                00341000
  350. NOPRO    MVI       ERRNUM,X'FF'        RESET ERROR FOR THIS TIME        00342000
  351.          MVC       CHKLEN(1),CHKSET    Reset checksum length            00343000
  352.          CLI       0(R6),C'E'          CHECK FOR 'EXIT' COMMAND         00344000
  353.          BE        LEAVE                                                00345000
  354.          CLI       0(R6),C'Q'          CHECK FOR 'QUIT' COMMAND         00346000
  355.          BE        LEAVE                                                00347000
  356.          CLC       0(8,R6),=8X'FF'     No more input? [11]              00348000
  357.          BE        NOPRO2              Go check [11]                    00349000
  358.          CLI       0(R6),C'?'          NEED HELP ?                      00350000
  359.          BNE       SETCHK                                               00351000
  360.          WRTERM    'Receive, Send, Help, Exit, Quit, Status, Set, Show' 00352000
  361.          WRTERM    'Server, Take, Tdump, CMS, CP'                       00353000
  362.          B         PROMPT                                               00354000
  363. NOPRO2   TM        LFLAGS,CMDL         No more info on cmd line [11]    00355000
  364.          BO        LV2                 Yes so just exit [11]            00356000
  365.          B         PROMPT              No, blank line at prompt [11]    00357000
  366. SETCHK   CLC       0(3,R6),=CL3'SET'   IS IT THE SET COMMAND ?          00358000
  367.          BE        STSWITCH                                             00359000
  368.          CLC       0(6,R6),=C'STATUS'  IS IT THE STATUS COMMAND?        00360000
  369.          BE        STATSW                                               00361000
  370.          CLC       0(3,R6),=C'SHO'     IS IT THE SHOW COMMAND?          00362000
  371.          BE        SHOSW                                                00363000
  372.          CLC       0(5,R6),=C'TDUMP'   Dump a table? [20]               00364000
  373.          BE        TDSW                [20]                             00365000
  374.          CLC       0(4,R6),=C'HELP'    NEED HELP ?                      00366000
  375.          BE        HELPSW                                               00367000
  376.          CLC       0(4,R6),=C'SERV'    Server command [13]              00368000
  377.          BE        SERVSW              Yup [13]                         00369000
  378.          CLC       0(4,R6),=C'TAKE'    Take a command file? [15]        00370000
  379.          BE        TAKSW               [15]                             00371000
  380.          CLI       0(R6),C'*'          Is this a comment? [15]          00372000
  381.          BE        PROMPT              Yes ignore [15]                  00373000
  382.          CLC       0(3,R6),=C'CMS'     CMS COMMAND?                     00374000
  383.          BE        SYSCMD                                               00375000
  384.          CLC       0(2,R6),=C'CP'      CP COMMAND?                      00376000
  385.          BE        SYSCMD                                               00377000
  386.          OI        FLAGS,FLG1          SET FLG1 - IT'S THE FIRST FILE   00378000
  387.          NI        FLAGS,X'FF'-FLG2    TURN OFF OVERWRITE FLAG (INIT)   00379000
  388.          XC        NFSENT,NFSENT       NUMBER OF FILES SENT (= 0)       00380000
  389.          CLC       0(3,R6),=C'REC'                                      00381000
  390.          BNE       SS                  MAYBE IT'S A SEND COMMAND        00382000
  391.          L         R15,=A(PRSFN)       Parse filename [21]              00383000
  392.          BALR      R14,R15             [21]                             00384000
  393.          LTR       R15,R15             Check retcode [21]               00385000
  394.          BNE       PROMPT              Bad so don't accept cmd [21]     00386000
  395.          L         R15,=A(VERLET)      Verify letters of fn [9]         00387000
  396.          BALR      R14,R15             [9]                              00388000
  397.          B         RSWITCH             Else go receive [21]             00389000
  398. SS       CLC       0(3,R6),=C'SEN'                                      00390000
  399.          BNE       ERR                 UNRECOGNIZED COMMAND             00391000
  400.          LA        R6,8(R6)            PICK UP  NEXT WORD               00392000
  401.          CLI       0(R6),C'?'          NEED HELP?                       00393000
  402.          BNE       SS2                                                  00394000
  403.          WRTERM    'Specify filename(s) with format: fn ft [fm]'        00395000
  404.          B         PROMPT                                               00396000
  405. SS2      CLC       0(8,R6),=8X'FF'     NO MORE DATA ?                   00397000
  406.          BNE       SNAM                                                 00398000
  407.          WRTERM    'Specify File Name'                                  00399000
  408.          B         PROMPT              TRY AGAIN                        00400000
  409. SNAM     MVC       NAME,=18X'20'       BLANK IT  OUT                    00401000
  410.          MVC       FILNAM,=18X'20'     BLANK IT OUT TOO                 00402000
  411.          MVC       NAME(8),0(R6)       PICK UP THE FNAME                00403000
  412.          LA        R6,8(R6)            MOVE TO NEXT TOKEN               00404000
  413.          CLC       0(8,R6),=8X'FF'     NO MORE DATA ?                   00405000
  414.          BNE       STYP                                                 00406000
  415.          WRTERM    'Specify File Type'                                  00407000
  416.          B         PROMPT                                               00408000
  417. STYP     MVC       NAME+8(8),0(R6)     Pick up the ftype                00409000
  418.          MVC       NAME+16(2),=C'* '   Default file mode [9]            00410000
  419.          LA        R6,8(R6)            Look for fmode                   00411000
  420.          CLC       0(8,R6),=8X'FF'     Is it there?                     00412000
  421.          BE        SSWITCH             No use default                   00413000
  422.          MVC       NAME+16(2),0(R6)    Get fmode user wants             00414000
  423.          B         SSWITCH                                              00415000
  424. ERR      WRTERM    'Invalid command'                                    00416000
  425.          B         PROMPT              INVALID COMMAND - TRY AGAIN      00417000
  426.          SPACE     3                                                    00418000
  427. SSWITCH  EQU       *                                                    00419000
  428.          LA        1,=C'SET LINEDIT OFF'                                00420000
  429.          LA        0,15                15 CHAR COMMAND                  00421000
  430.          DIAG      1,0,8               SHOW IT'S A CP COMMAND           00422000
  431.          TM        FLAGS,DEBUG         In DEBUG mode? [10]              00423000
  432.          BO        SCALL               Yes, then don't ignore attn [10] 00424000
  433.          STAX      IGNATTN             Else ignore attention [10]       00425000
  434. SCALL    L         R15,=A(SEND)                                         00426000
  435.          BALR      R14,R15             CALL SEND PORTION                00427000
  436.          LTR       R5,R15              CHECK RETURN CODE                00428000
  437.          BNZ       LINON                                                00429000
  438.          MVI       ERRNUM,X'FF'        WORKED OK                        00430000
  439. LINON    LA        1,=C'SET LINEDIT ON'                                 00431000
  440.          LA        0,14                                                 00432000
  441.          DIAG      1,0,8                                                00433000
  442.          STAX      ,                   Reset attn address [10]          00434000
  443.          MVC       OLDERR(1),ERRNUM    ERROR SETTING OF THIS RUN        00435000
  444.          TM        FLAGS,FLG5          GOT EXTRA SPACE?                 00436000
  445.          BNO       SSW1                NOPE, JUST LEAVE                 00437000
  446.          LA        R0,4096/8           AMOUNT OF SPACE WE GOT           00438000
  447.          L         R1,STORLOC          FIND IT & FREE IT                00439000
  448.          DMSFRET   DWORDS=(0),LOC=(1),ERR=*,MSG=NO                      00440000
  449.          NI        FLAGS,X'FF'-FLG5    TURN OFF EXTRA SPACE FLAG        00441000
  450. SSW1     LTR       R5,R5               CHECK THE RETCODE                00442000
  451.          BZ        PROMPT              ALL OKAY                         00443000
  452.          WRTERM    'Error in sending file. Try again.'                  00444000
  453.          B         PROMPT              ERROR - TRY AGAIN                00445000
  454. RSWITCH  EQU       *                                                    00446000
  455.          LA        1,=C'SET LINEDIT OFF'                                00447000
  456.          LA        0,15                15 CHAR COMMAND                  00448000
  457.          DIAG      1,0,8               SHOW IT'S A CP COMMAND           00449000
  458.          TM        FLAGS,DEBUG         In DEBUG mode? [10]              00450000
  459.          BO        RCALL               Yes, then don't ignore attn [10] 00451000
  460.          STAX      IGNATTN             Else ignore attention [10]       00452000
  461. RCALL    L         R15,=A(RECEIVE)                                      00453000
  462.          BALR      R14,R15             CALL RECEIVE PORTION             00454000
  463.          LTR       R5,R15              CHECK RETURN CODE                00455000
  464.          BNZ       LNON                                                 00456000
  465.          MVI       ERRNUM,X'FF'                                         00457000
  466. LNON     LA        1,=C'SET LINEDIT ON'                                 00458000
  467.          LA        0,14                                                 00459000
  468.          DIAG      1,0,8                                                00460000
  469.          STAX      ,                   Reset attn address [10]          00461000
  470.          MVC       OLDERR(1),ERRNUM    ERROR SETTING OF THIS RUN        00462000
  471.          LTR       R5,R5               CHECK THE RETCODE                00463000
  472.          BZ        PROMPT              ALL OKAY                         00464000
  473.          WRTERM    'Error in receiving file. Try again.'                00465000
  474.          B         PROMPT              ERROR - TRY AGAIN                00466000
  475. STSWITCH EQU       *                                                    00467000
  476.          L         R15,=A(SET)                                          00468000
  477.          BALR      R14,R15             CALL "SET" SUBROUTINE            00469000
  478.          LTR       R15,R15             CHECK RETCODE                    00470000
  479.          BZ        PROMPT                                               00471000
  480.          WRTERM    'Invalid Set Command'                                00472000
  481.          B         PROMPT                                               00473000
  482. SHOSW    EQU       *                                                    00474000
  483.          L         R15,=A(SHOW)                                         00475000
  484.          BALR      R14,R15             CALL "SHOW" SUBROUTINE           00476000
  485.          LTR       R15,R15             CHECK RETCODE                    00477000
  486.          BZ        PROMPT                                               00478000
  487.          WRTERM    'Invalid Show Command'                               00479000
  488.          B         PROMPT                                               00480000
  489. SERVSW   EQU       *                   [13 start]                       00481000
  490.          CLI       8(R6),C'?'          Need help?                       00482000
  491.          BNE       SERVS0              No call server                   00483000
  492.          WRTERM    'Confirm with a carriage return'                     00484000
  493.          B         PROMPT                                               00485000
  494. SERVS0   L         R15,=A(SERVER)                                       00486000
  495.          BALR      R14,R15             Call server routine              00487000
  496.          B         PROMPT              Return to normal mode [13 end]   00488000
  497. TAKSW    EQU       *                   Take a command file [15 start]   00489000
  498.          CLI       8(R6),C'?'          Need help?                       00490000
  499.          BNE       TAKS0                                                00491000
  500.          WRTERM    'Specify filename with format: fn ft [fm]'           00492000
  501.          B         PROMPT                                               00493000
  502. TAKS0    CLI       TAKLEV,TAKMAX       At our max level?                00494000
  503.          BNH       TAKS1               Below so we're OK                00495000
  504.          WRTERM    'Past maximum nesting level for TAKE command'        00496000
  505.          B         PROMPT                                               00497000
  506. TAKS1    LA        R6,8(R6)            Point to filename                00498000
  507.          CLC       0(8,R6),=8X'FF'     File name given?                 00499000
  508.          BNE       TAKS2               Yes OK                           00500000
  509.          WRTERM    'File name must be specified'                        00501000
  510.          B         PROMPT                                               00502000
  511. TAKS2    SR        R3,R3                                                00503000
  512.          IC        R3,TAKLEV           Get current TAKE level           00504000
  513.          M         R2,=F'18'           Offset for next file name        00505000
  514.          LA        R2,TAKTAB(R3)                                        00506000
  515.          MVC       0(18,R2),=18X'40'   Blank area for file name         00507000
  516.          MVC       0(8,R2),0(R6)       Pick up file name                00508000
  517.          LA        R6,8(R6)            Point to file type               00509000
  518.          CLC       0(8,R6),=8X'FF'     File type given?                 00510000
  519.          BNE       TAKS3               Yes OK                           00511000
  520.          WRTERM    'File type must be specified'                        00512000
  521.          B         PROMPT                                               00513000
  522. TAKS3    MVC       8(8,R2),0(R6)       Pick up file type                00514000
  523.          LA        R6,8(R6)            Check for file mode              00515000
  524.          MVC       16(2,R2),=C'* '     Use any mode                     00516000
  525.          CLC       0(8,R6),=8X'FF'     File mode given?                 00517000
  526.          BE        TAKS4               No use default                   00518000
  527.          MVC       16(2,R2),0(R6)      Use what user typed              00519000
  528. TAKS4    FSOPEN    (R2)                Does file exist?                 00520000
  529.          LTR       R15,R15                                              00521000
  530.          BZ        TAKS5               Bad return code                  00522000
  531.          WRTERM    'TAKE file not found'                                00523000
  532.          B         PROMPT                                               00524000
  533. TAKS5    SR        R3,R3                                                00525000
  534.          IC        R3,TAKLEV           Get current take level           00526000
  535.          LA        R3,1(R3)            And increment                    00527000
  536.          STC       R3,TAKLEV                                            00528000
  537.          OI        LFLAGS,TAKON        Say we're in TAKE mode           00529000
  538.          B         PROMPT              [15 end]                         00530000
  539. STATSW   EQU       *                                                    00531000
  540.          CLI       8(R6),C'?'          NEED HELP?                       00532000
  541.          BNE       GIVSTAT                                              00533000
  542.          WRTERM    'Confirm with a carriage return'                     00534000
  543.          B         PROMPT                                               00535000
  544. GIVSTAT  CLI       OLDERR,X'FF'        WAS THERE AN ERROR LAST TIME?    00536000
  545.          BNE       FAIL                                                 00537000
  546.          WRTERM    'Kermit completed successfully'                      00538000
  547.          B         PROMPT                                               00539000
  548. FAIL     SR        R5,R5                                                00540000
  549.          IC        R5,OLDERR           GET OFFSET INTO ERROR TABLE      00541000
  550.          M         R4,=F'20'           OFFSET := ERRNUM * 20            00542000
  551.          LA        R5,ERRTAB(R5)                                        00543000
  552.          WRTERM    (R5),20             PRINT ERROR MSG ON SCREEN        00544000
  553.          B         PROMPT              AND LEAVE                        00545000
  554. IGNATTN  BR        R14                 Ignore attention [10]            00546000
  555. HELPSW   CLI       8(R6),C'?'          NEED HELP?                       00547000
  556.          BNE       GIVHLP                                               00548000
  557.          WRTERM    'Confirm with a carriage return'                     00549000
  558.          B         PROMPT                                               00550000
  559. GIVHLP   LA        R1,HLPMSG           GET LOCATION OF HELP MESSAGE     00551000
  560.          SVC       202                 SUPERVISOR CALL                  00552000
  561.          DC        AL4(*+8)            PRINT ERR MSG IF FAILED          00553000
  562.          B         PROMPT              RETURN IF NO                     00554000
  563.          WRTERM    'No help available'                                  00555000
  564.          B         PROMPT                                               00556000
  565. TDSW     L         R15,=A(SHOW)        Dump tables [20]                 00557000
  566.          BALR      R14,R15             Use the SHOW routine [20]        00558000
  567.          B         PROMPT                                               00559000
  568. SYSCMD   CLI       8(R6),C'?'          NEED HELP?                       00560000
  569.          BNE       GIVSYS                                               00561000
  570.          WRTERM    'Issue a CMS/CP command'                             00562000
  571.          B         PROMPT                                               00563000
  572. GIVSYS   CLC       8(8,R6),=8X'FF'     ANY COMMAND?                     00564000
  573.          BE        SYSERR              DIE IF NO                        00565000
  574.          LA        R1,0(R6)            REST OF THE CMS COMMAND          00566000
  575.          CLC       0(3,R6),=C'CMS'     CMS OR CP COMMAND?               00567000
  576.          BNE       GIVSVC                                               00568000
  577.          LA        R1,8(R6)            IGNORE THE "CMS" PART            00569000
  578. GIVSVC   SVC       202                 ISSUE THE COMMAND                00570000
  579.          DC        AL4(*+8)            PRINT ERR MSG IF FAILED          00571000
  580.          B         PROMPT                                               00572000
  581.          LR        R5,R15              GET RETCODE                      00573000
  582.          LINEDIT   TEXT='Command return code is  ...',SUB=(DEC,(R5))    00574000
  583.          B         PROMPT                                               00575000
  584. SYSERR   WRTERM    'No command supplied'                                00576000
  585.          B         PROMPT                                               00577000
  586. LEAVE    CLI       8(R6),C'?'          NEED HELP?                       00578000
  587.          BNE       LV2                                                  00579000
  588.          WRTERM    'Confirm with a carriage return'                     00580000
  589.          B         PROMPT                                               00581000
  590. * Return the two 64K buffers used for reading/writing. [2]              00582000
  591. LV2      L         R0,=F'16384'        RETURN 128K [2]                  00583000
  592.          L         R1,ABUF             STARTING ADDR [2]                00584000
  593.          DMSFRET   DWORDS=(0),LOC=(1),ERR=*,MSG=NO   [2]                00585000
  594.          SR        R1,R1               Clear flags back to how [12]     00586000
  595.          L         R15,=A(SETMSGS)     the user had them set [12]       00587000
  596.          BALR      R14,R15             [12]                             00588000
  597.          FSCLOSE   'KER LOG A1'        Close and ignore errors [14]     00589000
  598.          B         KRET                AND LEAVE [2]                    00590000
  599. BADDEV   WRTERM    'Connection must be via a TTY line or the Series/1  *00591000
  600.                emulation controller.'                  [12]             00592000
  601.          B         RET                                                  00593000
  602. ERRBUF   WRTERM    'Unable to allocate read/write buffers'  [2]         00594000
  603. KRET     EQU       *                                                    00595000
  604.          USING     NUCON,0             USE TO RESET BLIP                00596000
  605.          L         R7,AEXTSECT         ADDR OF EXTSECT                  00597000
  606.          USING     EXTSECT,R7          RESTORE USER'S BLIP CHAR         00598000
  607.          DMSEXS    MVC,TIMCHAR(1),BLIP                                  00599000
  608.          DROP      R7                                                   00600000
  609. *  RESTORE USER'S TERMINAL LINESIZE                                     00601000
  610.          LINEDIT   TEXT='TERM LINES ........',SUB=(DECA,LINSIZ),       *00602000
  611.                DOT=NO,DISP=CPCOMM                                       00603000
  612. RET      EQU       *                                                    00604000
  613.          L         R13,4(R13)                                           00605000
  614.          L         R14,12(R13)                                          00606000
  615.          LM        R0,R12,20(R13)                                       00607000
  616.          BR        R14                                                  00608000
  617. *                                                                       00609000
  618. KSAVE    DS        18F                 KERMIT'S SAVE AREA               00610000
  619.          LTORG                                                          00611000
  620.          DROP      R11                                                  00612000
  621.          DROP      R12                 NO LONGER NEED THEM              00613000
  622.          EJECT                                                          00614000
  623. * Moved code because base register ran out on us. [21]                  00615000
  624. PRSFN    BALR      R7,0                New base register                00616000
  625.          USING     *,R7                                                 00617000
  626.          L         R11,=A(PARMS)       Point to data area               00618000
  627.          USING     PARMS,R11                                            00619000
  628.          SR        R15,R15             Retcode                          00620000
  629.          LA        R6,8(R6)            Pick up next token               00621000
  630.          CLI       0(R6),C'?'          Need help?                       00622000
  631.          BNE       PRSF0                                                00623000
  632.          WRTERM    'Specify filename with format: [fn ft [fm]]'         00624000
  633.          BCTR      R15,0                                                00625000
  634.          B         PRSRET                                               00626000
  635. PRSF0    CLC       0(8,R6),=8X'FF'     No more words?                   00627000
  636.          BE        PRSRET              No so go receive                 00628000
  637.          CLI       0(R6),C'='          Is it "  = = FM" ?               00629000
  638.          BNE       PRSF1                                                00630000
  639.          CLI       8(R6),C'='          Is FT also '=' ?                 00631000
  640.          BNE       PRSF3               Must be an '='                   00632000
  641.          CLI       16(R6),X'FF'        No FM given - assume A1          00633000
  642.          BE        PRSRET                                               00634000
  643.          MVC       FM(2),16(R6)        Use FM they specified            00635000
  644.          B         PRSRET                                               00636000
  645. PRSF1    CLI       0(R6),C'*'          No wildcards here                00637000
  646.          BNE       PRSF2                                                00638000
  647.          WRTERM    'Invalid file name'                                  00639000
  648.          BCTR      R15,0                                                00640000
  649.          B         PRSRET                                               00641000
  650. PRSF2    MVC       FILNAM,=18X'20'     Blank it out                     00642000
  651.          MVC       FILNAM(8),0(R6)     Get fn                           00643000
  652.          LA        R6,8(R6)            Get next token                   00644000
  653.          CLI       0(R6),C'*'          Not allowed                      00645000
  654.          BE        PRSF3                                                00646000
  655.          CLI       0(R6),C'='          Not allowed                      00647000
  656.          BE        PRSF3                                                00648000
  657.          CLC       0(8,R6),=8X'FF'     No more?                         00649000
  658.          BNE       PRSF4                                                00650000
  659. PRSF3    WRTERM    'Invalid File Type'                                  00651000
  660.          BCTR      R15,0                                                00652000
  661.          B         PRSRET                                               00653000
  662. PRSF4    MVC       FILNAM+8(8),0(R6)   Get ftype                        00654000
  663.          OI        FLAGS,FLG2          Overwrite received fname         00655000
  664.          MVC       FILNAM+16(2),DFM    Default fmode,just in case       00656000
  665.          LA        R6,8(R6)            Look for fmode                   00657000
  666.          CLC       0(8,R6),=8X'FF'     Is it there?                     00658000
  667.          BE        PRSRET              No use default                   00659000
  668.          CLI       0(R6),C'*'          Not allowed in FM                00660000
  669.          BE        PRSF5                                                00661000
  670.          MVC       FILNAM+16(2),0(R6)  Get fmode                        00662000
  671.          B         PRSRET              Go to read portion               00663000
  672. PRSF5    WRTERM    'Invalid file mode'                                  00664000
  673.          BCTR      R15,0                                                00665000
  674. PRSRET   EQU       *                                                    00666000
  675.          DROP      R7                  Go back to old base              00667000
  676.          BR        R14                 Return to caller                 00668000
  677.          LTORG                                                          00669000
  678. *                                                                       00670000
  679. * Set the maximum data packet size. [4]                                 00671000
  680. PACKLEN  CSECT                                                          00672000
  681.          STM       R14,R12,12(R13)                                      00673000
  682.          BALR      R12,0                                                00674000
  683.          USING     *,R12                                                00675000
  684.          LA        R14,PKSAV                                            00676000
  685.          ST        R13,4(R14)                                           00677000
  686.          ST        R14,8(R13)                                           00678000
  687.          LR        R13,R14                                              00679000
  688. * USE R11 AS BASE REGISTER FOR 'PARMS' GLOBAL DATA LIST                 00680000
  689.          L         R11,=A(PARMS)                                        00681000
  690.          USING     PARMS,R11                                            00682000
  691.          L         R5,SPSIZ            Maximum send packet size         00683000
  692.          S         R5,=F'4'            Minus control information        00684000
  693.          SR        R7,R7                                                00685000
  694.          IC        R7,CHKLEN                                            00686000
  695.          SR        R5,R7               Minus checksum length            00687000
  696.          BCTR      R5,0                                                 00688000
  697.          BCTR      R5,0                Minus two for possible #X        00689000
  698.          CLI       EBQUOT,AN           Doing 8-bit quoting?             00690000
  699.          BE        PACK0               Nope                             00691000
  700.          CLI       EBQUOT,AY           Not doing it in this case either 00692000
  701.          BE        PACK0                                                00693000
  702.          BCTR      R5,0                Another one for 8-bit quoting    00694000
  703. PACK0    CLI       RPTQ,X'00'          Doing repeat char quoting        00695000
  704.          BE        PACK1               Nope, so that's all for now      00696000
  705.          BCTR      R5,0                                                 00697000
  706.          BCTR      R5,0                Minus two for repeat prefix      00698000
  707. PACK1    ST        R5,MAXDAT           Save max length for data field   00699000
  708. * Do standard linkage and return.                                       00700000
  709.          L         R13,4(R13)                                           00701000
  710.          L         R14,12(R13)                                          00702000
  711.          LM        R0,R12,20(R13)                                       00703000
  712.          BR        R14                                                  00704000
  713. PKSAV    DS        18F                                                  00705000
  714.          LTORG                                                          00706000
  715.          DROP      R11                                                  00707000
  716.          DROP      R12                                                  00708000
  717.          EJECT                                                          00709000
  718. *                                                                       00710000
  719. * Verify characters of FILNAM.  [9]                                     00711000
  720. VERLET   CSECT                                                          00712000
  721.          STM       R14,R12,12(R13)                                      00713000
  722.          BALR      R12,0                                                00714000
  723.          USING     *,R12                                                00715000
  724.          LA        R14,VRLSAV                                           00716000
  725.          ST        R13,4(R14)                                           00717000
  726.          ST        R14,8(R13)                                           00718000
  727.          LR        R13,R14                                              00719000
  728. * USE R11 AS BASE REGISTER FOR 'PARMS' GLOBAL DATA LIST                 00720000
  729.          L         R11,=A(PARMS)                                        00721000
  730.          USING     PARMS,R11                                            00722000
  731. VER0     SR        R1,R1                                                00723000
  732.          TRT       FILNAM(18),VALLET   Valid letters only               00724000
  733.          BZ        VERRET                                               00725000
  734.          MVI       0(R1),C'X'         Replace invalid char              00726000
  735.          B         VER0                                                 00727000
  736. VERRET   L         R13,4(R13)                                           00728000
  737.          L         R14,12(R13)                                          00729000
  738.          LM        R0,R12,20(R13)                                       00730000
  739.          BR        R14                                                  00731000
  740. VRLSAV   DS        18F                                                  00732000
  741. VALLET   DC        64X'01'                                              00733000
  742.          DC          X'00'             For 40 (space)                   00734000
  743.          DC        13X'01'                                              00735000
  744.          DC          X'00'             For 4E (plus)                    00736000
  745.          DC        12X'01'                                              00737000
  746.          DC          X'00'             For 5B (dollar sign)             00738000
  747.          DC         4X'01'                                              00739000
  748.          DC          X'00'             For 60 (dash)                    00740000
  749.          DC        12X'01'                                              00741000
  750.          DC          X'00'             For 6D (underscore)              00742000
  751.          DC        12X'01'                                              00743000
  752.          DC         3X'00'             For 7A-7C (colon ...             00744000
  753.          DC        68X'01'             ... pound sign, at sign)         00745000
  754.          DC         9X'00'             For C1-C9 (A-I)                  00746000
  755.          DC         7X'01'                                              00747000
  756.          DC         9X'00'             For D1-D9 (J-R)                  00748000
  757.          DC         8X'01'                                              00749000
  758.          DC         8X'00'             For E2-E9 (S-Z)                  00750000
  759.          DC         6X'01'                                              00751000
  760.          DC        10X'00'             For F0-F9 (0-9)                  00752000
  761.          DC         6X'01'                                              00753000
  762.          LTORG                                                          00754000
  763.          DROP      R11                                                  00755000
  764.          DROP      R12                                                  00756000
  765.          EJECT                                                          00757000
  766. *                                                                       00758000
  767. INIT     CSECT                                                          00759000
  768.          STM       R14,R12,12(R13)                                      00760000
  769.          BALR      R12,0                                                00761000
  770.          USING     *,R12                                                00762000
  771.          LA        R14,ISAVE                                            00763000
  772.          ST        R13,4(R14)                                           00764000
  773.          ST        R14,8(R13)                                           00765000
  774.          LR        R13,R14                                              00766000
  775. *                                                                       00767000
  776. * INITIALIZE VARIABLES THAT GET CHANGED DURING EXECUTION                00768000
  777. * USE R11 AS BASE REGISTER FOR 'PARMS' GLOBAL DATA LIST                 00769000
  778.          L         R11,=A(PARMS)                                        00770000
  779.          USING     PARMS,R11                                            00771000
  780.          XC        SNDPKT,SNDPKT       CLEAR OUT THESE BUFFERS          00772000
  781.          XC        RECPKT,RECPKT                                        00773000
  782.          XC        INPUT,INPUT                                          00774000
  783.          XC        ABUF,ABUF           ADDR OF READ BUFFER [2]          00775000
  784.          XC        ARBUF,ARBUF         ADDR OF WRITE BUFFER [2]         00776000
  785.          XC        QSBUF,QSBUF         For QUERY SET cmd [12]           00777000
  786.          XC        FSENT,FSENT                                          00778000
  787.          XC        SDAT,SDAT                                            00779000
  788.          XC        RDAT,RDAT                                            00780000
  789.          XC        SPKNUM,SPKNUM       SET VARIABLES TO ZERO            00781000
  790.          XC        RPKNUM,RPKNUM                                        00782000
  791.          XC        LSDAT,LSDAT                                          00783000
  792.          XC        LRDAT,LRDAT                                          00784000
  793.          MVI       FLAGS,X'00'         CLEAR ALL FLAGS                  00785000
  794.          MVI       LFLAGS,X'00'        Local settings flags [12]        00786000
  795.          XC        INBFPT,INBFPT                                        00787000
  796.          XC        OUTBFPT,OUTBFPT                                      00788000
  797.          XC        NUMTRY,NUMTRY                                        00789000
  798.          MVC       FILNAM,=18X'20'     BLANK OUT FILNAM & NAME          00790000
  799.          MVC       NAME,=18X'20'                                        00791000
  800.          MVI       PREV,X'00'                                           00792000
  801.          MVI       ERRNUM,X'FF'        SET TO NO ERROR FOR NOW          00793000
  802.          MVI       OLDERR,X'FF'        SAME HERE                        00794000
  803.          MVC       FST(4),=X'FF000000'                                  00795000
  804.          MVC       ADT(4),=X'FF000000'                                  00796000
  805.          XC        PKVAR,PKVAR         ZERO IT OUT                      00797000
  806.          XC        OLDTRY,OLDTRY                                        00798000
  807.          XC        TEMP,TEMP                                            00799000
  808.          XC        NFSENT,NFSENT       ZERO FILES SENT,INITIALLY        00800000
  809.          XC        STORLOC,STORLOC                                      00801000
  810.          MVC       LRECL,=A(DLRECL)    Use default [2] [4]              00802000
  811.          MVI       RFM,DRECFM                                           00803000
  812.          MVC       FM(2),DFM                                            00804000
  813.          MVC       MAXOUT,=A(MAXTXT)   Max output buffer size [6]       00805000
  814.          MVI       RQUOTE,DQUOTE       Use default quote char [4]       00806000
  815.          MVI       SQUOTE,DQUOTE       Ditto [4]                        00807000
  816.          MVI       EBQUOT,D8QUO        For 8-bit quoting [1][4]         00808000
  817.          MVI       ORIG8Q,D8QUO        For 8-bit quoting [1][4]         00809000
  818.          MVI       REOL,DEOL           Use default for now [4]          00810000
  819.          MVI       SEOL,DEOL           Ditto [4]                        00811000
  820.          MVI       STIME,DSTIM                                          00812000
  821.          MVI       RTIME,DRTIM                                          00813000
  822.          MVI       SPAD,DSPAD                                           00814000
  823.          MVI       RPAD,DRPAD                                           00815000
  824.          MVI       SPADCH,DSPADC                                        00816000
  825.          MVI       RPADCH,DRPADC                                        00817000
  826.          MVI       CHKLEN,DCHKLEN      Checksum length [4]              00818000
  827.          MVI       CHKSET,DCHKLEN      Checksum length [4]              00819000
  828.          MVI       RPTQ,DRPT           Repeat char prefix [4]           00820000
  829.          MVI       ORIGQ,DRPT          Repeat char prefix [4]           00821000
  830.          MVI       CXZ,X'00'           Abort sending file(s) [16]       00822000
  831.          MVI       STATE,C' '                                           00823000
  832.          MVI       STYPE,C' '                                           00824000
  833.          MVI       RTYPE,C' '                                           00825000
  834. *                                                                       00826000
  835. INITRET  L         R13,4(R13)                                           00827000
  836.          L         R14,12(R13)                                          00828000
  837.          LM        R0,R12,20(R13)                                       00829000
  838.          BR        R14                                                  00830000
  839. ISAVE    DS        18F                                                  00831000
  840.          LTORG                                                          00832000
  841.          DROP      R11                                                  00833000
  842.          DROP      R12                                                  00834000
  843.          EJECT                                                          00835000
  844. PARMS    CSECT                         GLOBAL DATA LIST                 00836000
  845. S1ORDS   DS        0D                  Transparent R/W [12 start]       00837000
  846.          DC        X'40',AL1(SBA),X'5D7F',AL1(SBA),X'0001'              00838000
  847. S1ORDSL  EQU       *-S1ORDS            [12 end]                         00839000
  848. SNDPKT   DS        CL130               SEND THIS TO MICRO               00840000
  849.          ORG       SNDPKT                                               00841000
  850. PHDR     DS        X                                                    00842000
  851. PLEN     DS        X                                                    00843000
  852. PNUM     DS        X                                                    00844000
  853. PTYPE    DS        X                                                    00845000
  854. PDATA    DS        0C                                                   00846000
  855.          ORG       ,                                                    00847000
  856. RECPKT   DS        CL130               RECEIVE THIS FROM MICRO          00848000
  857. S1SCCW   DS        0D                  CCW to write to S/1 [12 start]   00849000
  858.          DC        X'29',AL3(S1ORDS),AL1(SLI),X'00'                     00850000
  859. S1SDATL  DC        H'0'                Length of data to send           00851000
  860. S1RCCW   DS        0D                  CCW to read S/1                  00852000
  861.          DC        X'2A',AL3(RECPKT),AL1(SLI),X'80',AL2(L'RECPKT)       00853000
  862. * Data from console interrupts are saved here:                          00854000
  863. CONSCSW  DS        0D                                                   00855000
  864. CONSKEY  DC        X'00'               storage key + cond code          00856000
  865. CONSCCW  DC        AL3(0)              CCW addr                         00857000
  866. CONSUNIT DC        X'00'               unit status                      00858000
  867. CONSCHAN DC        X'00'               channel status                   00859000
  868. CONSBYTC DC        H'0'                byte count                       00860000
  869. ERRCSW   DS        1D                  copy of CSW in error             00861000
  870. *                                                                       00862000
  871. S1RDBYTC DC        F'-1'               READ MOD byte count residue      00863000
  872. CONSADDR DC        H'9'                console addr (CUU)               00864000
  873. CONSTTY  DC        X'8020'             Class=TERM,type=TTY              00865000
  874. CONS772  DC        X'400402'           Class=GRAF,type=3277,mod=2       00866000
  875. S1FLAGS  DC        X'00'               S/1 flags     [12 end]           00867000
  876. *                                                                       00868000
  877. LSDAT    DS        F                   SEND PACKET SIZE                 00869000
  878. LRDAT    DS        F                   RECEIVE PACKET SIZE              00870000
  879. MORENC   DS        F                   Encode refill routine [22]       00871000
  880. MORDEC   DS        F                   Deocde dump routine [22]         00872000
  881. FLAGS    DC        X'00'               USE TO TEST OUR FLAGS            00873000
  882. LFLAGS   DC        X'00'               For local settings [12]          00874000
  883. FILINFO  DC        A(NAME)             DATA FOR "NEXTFST" ROUTINE       00875000
  884.          DC        A(ADT)                                               00876000
  885.          DC        X'80',AL3(FST)                                       00877000
  886. HLPMSG   DC        CL8'HELP'           USE FOR CMS 'HELP' COMMAND       00878000
  887.          DC        CL8'KERMIT'         TOKENIZE TO 8 CHARACTERS         00879000
  888.          DC        8X'FF'              NO MORE INFO                     00880000
  889. NAME     DC        18X'20'             NAME OF FILE(S) TO SEND          00881000
  890.          DS        0F                                                   00882000
  891. FST      DC        X'FF',AL3(0)        USE FOR "NEXTFST" ROUTINE        00883000
  892. ADT      DC        X'FF',AL3(0)        THIS TOO                         00884000
  893.          DS        0F                                                   00885000
  894. INPUT    DS        CL130               INPUT BUFFER                     00886000
  895.          DS        0F                                                   00887000
  896. ABUF     DS        F                   ADDR OF FSREAD BUFFER  [2]       00888000
  897. ARBUF    DS        F                   ADDR OF FSWRITE BUFFER [2]       00889000
  898. PROMSG   DC        C'Kermit CMS Version 2.01'                 [3]       00890000
  899. HELPM    DC        C'Enter ? for a list of valid commands'    [3]       00891000
  900. FILMSG1  DC        C'File type is text.'                     [17]       00892000
  901. FILMSG2  DC        C'File type is binary.'                   [17]       00893000
  902. DEBMSG1  DC        C'Debug mode is off.'                     [17]       00894000
  903. DEBMSG2  DC        C'Debug mode is on.'                      [17]       00895000
  904. SERMSG1  DC        C'Series/1 mode is off.'                  [17]       00896000
  905. SERMSG2  DC        C'Series/1 mode is on.'                   [17]       00897000
  906. WARMSG1  DC        C'Warning is off.'                        [18]       00898000
  907. WARMSG2  DC        C'Warning is on.'                         [18]       00899000
  908. FSENT    DS        CL160               TABLE OF FILES SENT SO FAR       00900000
  909.          DS        0F                                                   00901000
  910. TAKTAB   DS        CL160               Table of TAKE files [15]         00902000
  911. QSBUF    DS        CL256               For QUERY SET response [12]      00903000
  912. SPKNUM   DC        F'0'                SEND PACKET NUMBER [13]          00904000
  913. RPKNUM   DC        F'0'                RECEIVE PACKET NUMBER [13]       00905000
  914. NUMTRY   DC        F'0'                TRIAL COUNTER FOR TRANSFERS      00906000
  915. OLDTRY   DS        F                   COUNTER FOR PREVIOUS PACKET      00907000
  916. NFSENT   DC        F'0'                NUMBER OF FILES SENT             00908000
  917. STORLOC  DS        F                   POINTER TO EXTRA STORAGE         00909000
  918. RECL     DS        F                   RECORD LEN (IF RECFM = V)        00910000
  919. RPSIZ    DC        F'94'               MAX RECEIVE PACKET SIZE          00911000
  920. SPSIZ    DC        F'80'               SEND PACKET SIZE                 00912000
  921. MAXTRY   DC        F'5'                NO. OF TIMES TO RETRY PACKET     00913000
  922. IMXTRY   DC        F'16'               NO. OF INITIAL TRIALS ALLOWED    00914000
  923. DEL      DC        F'127'              OCTAL 177 (DELETE CHAR)          00915000
  924. ZERO     DC        F'0'                                                 00916000
  925. ONE      DC        F'1'                                                 00917000
  926. FIVE     DC        F'5'                                                 00918000
  927. TWO      DC        F'2'                                                 00919000
  928. SPACE    DC        F'32'               ASCII SPACE                      00920000
  929. O1H      DC        F'64'               OCTAL 100                        00921000
  930. O2H      DC        F'128'              OCTAL 200                        00922000
  931. INBFPT   DC        F'0'                Input buffer pointer             00923000
  932. OUTBFPT  DC        F'0'                Output buffer pointer            00924000
  933. PAR      DS        F                   PARITY OF INCOMING CHARACTER [1] 00925000
  934. EXTFLG   DS        X                   Exit flag [11]                   00926000
  935. SQUOTE   DS        X                   Micro's quote char               00927000
  936. RQUOTE   DS        X                   QUOTE CHAR WE'LL SEND            00928000
  937. EBQUOT   DS        X                   8-BIT QUOTING CHAR [1]           00929000
  938. ORIG8Q   DS        X                   ORIG 8-BIT QUOTE CHAR [1]        00930000
  939. STIME    DS        X                   Send timeout [5]                 00931000
  940. RTIME    DS        X                   Receive timeout [5]              00932000
  941. SPAD     DS        X                   Send padding [5]                 00933000
  942. RPAD     DS        X                   Receive padding [5]              00934000
  943. SPADCH   DS        X                   Send pad char [5]                00935000
  944. RPADCH   DS        X                   Receive pad char [5]             00936000
  945. CXZ      DS        X                   Abort send/rec file(s) [16]      00937000
  946. TMP      DS        X                                                    00938000
  947. TEMP     DS        F                   TEMPORARY SPACE                  00939000
  948.          DS        0D                                                   00940000
  949. PKVAR    DS        D                   USE FOR PICKING UP INTEGER       00941000
  950. SDAT     DS        CL130               TEMP PLACE FOR SEND DATA         00942000
  951. RDAT     DS        CL130               TEMP PLACE FOR RECEIVE DATA      00943000
  952.          DS        0D                                                   00944000
  953. INFOBUF  DS        32X'00'             For diagnose x'00' [15]          00945000
  954. FILNAM   DS        CL18                SEND/REC FILENAME                00946000
  955. UNAME    DS        CL8                 User for init file [15]          00947000
  956.          DC        CL8'KERMINI '       File type expected [15]          00948000
  957.          DC        CL2'* '             File mode [15]                   00949000
  958. SYSTAK   DC        CL8'SYSTEM  '       System init file [15]            00950000
  959.          DC        CL8'KERMINI '       File type [15]                   00951000
  960.          DC        CL2'* '             File mode [15]                   00952000
  961. STATE    DS        C                   OUR CURRENT STATE                00953000
  962. DFM      DC        CL2'A1'             DEFAULT FILEMODE                 00954000
  963. FM       DS        CL2                 FILEMODE USER WANTS              00955000
  964. CHKLEN   DS        X                   Checksum length [4]              00956000
  965. CURCHK   DS        X                   Store chksum length here [8]     00957000
  966. CHKSET   DS        X                   SET by user [8]                  00958000
  967. RPTQ     DS        X                   Repeat prefix [4]                00959000
  968. ORIGQ    DS        X                   Original repeat prefix [7]       00960000
  969. RPTVAL   DS        X                   Character to be repeated [7]     00961000
  970. RPTCT    DS        X                   No. of times is repeated [7]     00962000
  971. TAKLEV   DS        X                   TAKE file level [15]             00963000
  972. REOL     DS        X                   EOL CHAR I NEED (CR)             00964000
  973. SEOL     DS        X                   EOL I'LL SEND                    00965000
  974. LRECL    DS        F                   LRECL PROGRAM WILL USE [2]       00966000
  975. RFM      DS        C                   RECFM PROGRAM WILL USE           00967000
  976. PREV     DS        C                   PREVIOUS CHAR REC (IN PTCHR)     00968000
  977. BLIP     DS        X                   SAVE USER'S BLIP CHAR            00969000
  978. LINSIZ   DS        F                   SAVE USER'S CONSOLE LINESIZE     00970000
  979. MAXDAT   DS        F                   Max packet size for send [4]     00971000
  980. MAXOUT   DS        F                   Max output buffer [6]            00972000
  981. ERRNUM   DS        X                   ERROR NUMBER,IN CASE WE DIE      00973000
  982. OLDERR   DS        X                   ERROR OF PREVIOUS EXECUTION      00974000
  983. STYPE    DS        C                   TYPE OF PACKET SENT              00975000
  984. RTYPE    DS        C                   TYPE OF PACKET RECEIVED          00976000
  985. * THIS IS THE ASCII TO EBCDIC TABLE [19]                                00977000
  986. ATOE     DC        X'00010203372D2E2F1605250B0C0D0E0F'                  00978000
  987.          DC        X'101112133C3D322618193F271C1D1E1F'                  00979000
  988.          DC        X'405A7F7B5B6C507D4D5D5C4E6B604B61'                  00980000
  989.          DC        X'F0F1F2F3F4F5F6F7F8F97A5E4C7E6E6F'                  00981000
  990.          DC        X'7CC1C2C3C4C5C6C7C8C9D1D2D3D4D5D6'                  00982000
  991.          DC        X'D7D8D9E2E3E4E5E6E7E8E9ADE0BD5F6D'                  00983000
  992.          DC        X'79818283848586878889919293949596'                  00984000
  993.          DC        X'979899A2A3A4A5A6A7A8A9C04FD0A107'                  00985000
  994.          DC        X'00010203372D2E2F1605250B0C0D0E0F'                  00986000
  995.          DC        X'101112133C3D322618193F271C1D1E1F'                  00987000
  996.          DC        X'405A7F7B5B6C507D4D5D5C4E6B604B61'                  00988000
  997.          DC        X'F0F1F2F3F4F5F6F7F8F97A5E4C7E6E6F'                  00989000
  998.          DC        X'7CC1C2C3C4C5C6C7C8C9D1D2D3D4D5D6'                  00990000
  999.          DC        X'D7D8D9E2E3E4E5E6E7E8E9ADE0BD5F6D'                  00991000
  1000.          DC        X'79818283848586878889919293949596'                  00992000
  1001.          DC        X'979899A2A3A4A5A6A7A8A9C04FD0A107'                  00993000
  1002. *THIS IS THE EBCDIC TO ASCII CONVERSION TABLE                           00994000
  1003. *CHARACTERS NOT REPRESENTABLE IN ASCII ARE REPLACED BY A NULL           00995000
  1004. ETOA     DC        X'000102030009007F0000000B0C0D0E0F'                  00996000
  1005.          DC        X'1011121300000800181900001C1D1E1F'                  00997000
  1006.          DC        X'00000000000A171B0000000000050607'                  00998000
  1007.          DC        X'0000160000000004000000001415001A'                  00999000
  1008.          DC        X'20000000000000000000002E3C282B7C'                  01000000
  1009.          DC        X'2600000000000000000021242A293B5E'                  01001000
  1010.          DC        X'2D2F00000000000000007C2C255F3E3F'                  01002000
  1011.          DC        X'000000000000000000603A2340273D22'                  01003000
  1012.          DC        X'00616263646566676869007B00000000'                  01004000
  1013.          DC        X'006A6B6C6D6E6F707172007D00000000'                  01005000
  1014.          DC        X'007E737475767778797A0000005B0000'                  01006000
  1015.          DC        X'000000000000000000000000005D0000'                  01007000
  1016.          DC        X'7B414243444546474849000000000000'                  01008000
  1017.          DC        X'7D4A4B4C4D4E4F505152000000000000'                  01009000
  1018.          DC        X'5C00535455565758595A000000000000'                  01010000
  1019.          DC        X'303132333435363738397C0000000000'                  01011000
  1020. * Table to convert EBCDIC text to upper case. [15]                      01012000
  1021. UPC      DC        X'000102030405060708090A0B0C0D0E0F'                  01013000
  1022.          DC        X'101112131415161718191A1B1C1D1E1F'                  01014000
  1023.          DC        X'202122232425262728292A2B2C2D2E2F'                  01015000
  1024.          DC        X'303132333435363738393A3B3C3D3E3F'                  01016000
  1025.          DC        X'404142434445464748494A4B4C4D4E4F'                  01017000
  1026.          DC        X'505152535455565758595A5B5C5D5E5F'                  01018000
  1027.          DC        X'606162636465666768696A6B6C6D6E6F'                  01019000
  1028.          DC        X'707172737475767778797A7B7C7D7E7F'                  01020000
  1029.          DC        X'80C1C2C3C4C5C6C7C8C98A8B8C8D8E8F'                  01021000
  1030.          DC        X'90D1D2D3D4D5D6D7D8D99A9B9C9D9E9F'                  01022000
  1031.          DC        X'A0A1E2E3E4E5E6E7E8E9AAABACADAEAF'                  01023000
  1032.          DC        X'B0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF'                  01024000
  1033.          DC        X'C0C1C2C3C4C5C6C7C8C9CACBCCCDCECF'                  01025000
  1034.          DC        X'D0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF'                  01026000
  1035.          DC        X'E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF'                  01027000
  1036.          DC        X'F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF'                  01028000
  1037. * Table to use for CRC calculation                                      01029000
  1038. CRCTAB   DC        X'0000'                                              01030000
  1039.          DC        X'1081'                                              01031000
  1040.          DC        X'2102'                                              01032000
  1041.          DC        X'3183'                                              01033000
  1042.          DC        X'4204'                                              01034000
  1043.          DC        X'5285'                                              01035000
  1044.          DC        X'6306'                                              01036000
  1045.          DC        X'7387'                                              01037000
  1046.          DC        X'8408'                                              01038000
  1047.          DC        X'9489'                                              01039000
  1048.          DC        X'A50A'                                              01040000
  1049.          DC        X'B58B'                                              01041000
  1050.          DC        X'C60C'                                              01042000
  1051.          DC        X'D68D'                                              01043000
  1052.          DC        X'E70E'                                              01044000
  1053.          DC        X'F78F'                                              01045000
  1054. *                                                                       01046000
  1055. CRCTB2   DC        X'0000'                                              01047000
  1056.          DC        X'1189'                                              01048000
  1057.          DC        X'2312'                                              01049000
  1058.          DC        X'329B'                                              01050000
  1059.          DC        X'4624'                                              01051000
  1060.          DC        X'57AD'                                              01052000
  1061.          DC        X'6536'                                              01053000
  1062.          DC        X'74BF'                                              01054000
  1063.          DC        X'8C48'                                              01055000
  1064.          DC        X'9DC1'                                              01056000
  1065.          DC        X'AF5A'                                              01057000
  1066.          DC        X'BED3'                                              01058000
  1067.          DC        X'CA6C'                                              01059000
  1068.          DC        X'DBE5'                                              01060000
  1069.          DC        X'E97E'                                              01061000
  1070.          DC        X'F8F7'                                              01062000
  1071. *                                                                       01063000
  1072. * TABLE OF ERROR MESSAGES (IN CASE WE ABORT)                            01064000
  1073. ERRTAB   DC        CL20'Bad send-packet size'    ERR MSG #0             01065000
  1074.          DC        CL20'Bad message number'      ERR MSG #1             01066000
  1075.          DC        CL20'Unrecognized state'      ERR MSG #2             01067000
  1076.          DC        CL20'No SOH encountered'      ERR MSG #3             01068000
  1077.          DC        CL20'Bad character count'     ERR MSG #4             01069000
  1078.          DC        CL20'Bad checksum'            ERR MSG #5             01070000
  1079.          DC        CL20'Disk is full'            ERR MSG #6             01071000
  1080.          DC        CL20'Invalid packet type'     ERR MSG #7             01072000
  1081.          DC        CL20'Lost a packet'           ERR MSG #8             01073000
  1082.          DC        CL20'Micro sent a NAK'        ERR MSG #9             01074000
  1083.          DC        CL20'Micro aborted'           ERR MSG #10            01075000
  1084.          DC        CL20'Invalid file name'       ERR MSG #11            01076000
  1085.          DC        CL20'Invalid lrecl'           ERR MSG #12            01077000
  1086.          DC        CL20'Permanent I/O error'     ERR MSG #13            01078000
  1087.          DC        CL20'Disk is read-only'       ERR MSG #14            01079000
  1088.          DC        CL20'Recfm conflict'          ERR MSG #15            01080000
  1089.          DC        CL20'Err allocating space'    ERR MSG #16            01081000
  1090.          DC        CL20'Series/1 I/O error'      ERR MSG #17  [12]      01082000
  1091.          DC        CL20'Unknown generic cmd'     ERR MSG #18  [13]      01083000
  1092.          DC        CL20'Unknown server cmd'      ERR MSG #19  [13]      01084000
  1093.          DC        CL20'Cannot rename file'      ERR MSG #20  [18]      01085000
  1094.          DC        CL20'File not found'          ERR MSG #21  [13]      01086000
  1095.          DC        CL20'Send cancelled'          ERR MSG #22  [16]      01087000
  1096.          DC        CL20'Receive cancelled'       ERR MSG #23  [16]      01088000
  1097.          DC        CL20'Cannot create file'      ERR MSG #24  [18]      01089000
  1098.          DC        CL20'Error writing file'      ERR MSG #25   [4]      01090000
  1099. S1ERRNUM EQU       17                  Makes life easier [12]           01091000
  1100.          LTORG                                                          01092000
  1101.          EJECT                                                          01093000
  1102. SET      CSECT                                                          01094000
  1103.          STM       R14,R12,12(R13)     SAVE CALLER'S REGISTERS          01095000
  1104.          BALR      R12,0               ESTABLISH ADDRESSABILITY         01096000
  1105.          USING     *,R12                                                01097000
  1106.          LA        R14,SETSAVE         ADDRESS OF MY SAVE AREA          01098000
  1107.          ST        R13,4(R14)          SAVE CALLER'S                    01099000
  1108.          ST        R14,8(R13)                                           01100000
  1109.          LR        R13,R14                                              01101000
  1110. * USE R11 AS BASE REGISTER FOR 'PARMS' GLOBAL DATA AREA                 01102000
  1111.          L         R11,=A(PARMS)                                        01103000
  1112.          USING     PARMS,R11           ESTABLISH ADDRESSABILITY         01104000
  1113.          LA        R6,8(R6)            PICK UP NEXT TOKEN               01105000
  1114.          CLI       0(R6),C'?'          NEED HELP ?                      01106000
  1115.          BNE       NOQ                                                  01107000
  1116.          WRTERM    'File, Debug, Block, Series1, Warning, Recfm, Quote' 01108000
  1117.          WRTERM    'Lrecl, End-of-line, Packet-size, Etoa, Atoe'        01109000
  1118.          B         SETOK                                                01110000
  1119. NOQ      CLC       0(7,R6),=CL7'SERIES1'  Series/1 mode [12 start]      01111000
  1120.          BNE       NOSER                                                01112000
  1121.          LA        R6,8(R6)            Pick up operand                  01113000
  1122.          CLI       0(R6),C'?'          Need help?                       01114000
  1123.          BNE       CHKSR                                                01115000
  1124.          WRTERM    'ON or OFF'                                          01116000
  1125.          B         SETOK                                                01117000
  1126. CHKSR    CLC       0(2,R6),=CL2'ON'    Set series/1 mode on             01118000
  1127.          BNE       STSR0                                                01119000
  1128.          OI        S1FLAGS,ISS1                                         01120000
  1129.          B         SETOK                                                01121000
  1130. STSR0    CLC       0(3,R6),=CL3'OFF'   Set series/1 mode off            01122000
  1131.          BNE       STSR1                                                01123000
  1132.          NI        S1FLAGS,X'FF'-ISS1                                   01124000
  1133.          B         SETOK                                                01125000
  1134. STSR1    WRTERM    'Operand must be ON or OFF'                          01126000
  1135.          B         SETERR              [12 end]                         01127000
  1136. NOSER    CLC       0(4,R6),=CL4'WARN'  Set fn renaming [18 start]       01128000
  1137.          BNE       NOWAR                                                01129000
  1138.          LA        R6,8(R6)            Pick up operand                  01130000
  1139.          CLI       0(R6),C'?'          Need help?                       01131000
  1140.          BNE       CHKWR                                                01132000
  1141.          WRTERM    'ON or OFF'                                          01133000
  1142.          B         SETOK                                                01134000
  1143. CHKWR    CLC       0(2,R6),=CL2'ON'    Set warning on?                  01135000
  1144.          BNE       STWR0                                                01136000
  1145.          OI        LFLAGS,WARFL        Yes                              01137000
  1146.          B         SETOK                                                01138000
  1147. STWR0    CLC       0(3,R6),=CL3'OFF'   Set warning off?                 01139000
  1148.          BNE       STWR1                                                01140000
  1149.          NI        LFLAGS,X'FF'-WARFL                                   01141000
  1150.          B         SETOK                                                01142000
  1151. STWR1    WRTERM    'Operand must be ON or OFF'                          01143000
  1152.          B         SETERR              [18 end]                         01144000
  1153. NOWAR    CLC       0(4,R6),=CL4'FILE'  Set file mode [1 start]          01145000
  1154.          BNE       NOBIN                                                01146000
  1155.          LA        R6,8(R6)            Pick up operand                  01147000
  1156.          CLI       0(R6),C'?'          Need help?                       01148000
  1157.          BNE       CHKBN                                                01149000
  1158.          WRTERM    'BINARY or TEXT'                                     01150000
  1159.          B         SETOK                                                01151000
  1160. CHKBN    CLC       0(6,R6),=CL6'BINARY' Setting to BINARY?              01152000
  1161.          BNE       STBN0               No maybe it's TEXT               01153000
  1162.          OI        FLAGS,BINF          Set binary on                    01154000
  1163.          MVC       MAXOUT,LRECL        Max output buffer size           01155000
  1164.          B         SETOK                                                01156000
  1165. STBN0    CLC       0(4,R6),=CL4'TEXT'  Setting it off?                  01157000
  1166.          BNE       STBN1               No then it's wrong               01158000
  1167.          NI        FLAGS,X'FF'-BINF    Set it OFF                       01159000
  1168.          MVC       MAXOUT,=A(MAXTXT)   Max output buffer size           01160000
  1169.          B         SETOK                                                01161000
  1170. STBN1    WRTERM    'Invalid operand'                                    01162000
  1171.          B         SETERR              [1 end]                          01163000
  1172. NOBIN    CLC       0(5,R6),=CL5'DEBUG' Set debug mode [10 start]        01164000
  1173.          BNE       NODEB               No check something else          01165000
  1174.          LA        R6,8(R6)            Pick up operand                  01166000
  1175.          CLI       0(R6),C'?'          Need help?                       01167000
  1176.          BNE       CHKDB                                                01168000
  1177.          WRTERM    'ON or OFF'                                          01169000
  1178.          B         SETOK                                                01170000
  1179. CHKDB    CLC       0(2,R6),=CL2'ON'    Setting it on?                   01171000
  1180.          BNE       STDEB3              No maybe it's OFF                01172000
  1181.          OI        FLAGS,DEBUG         Set it ON                        01173000
  1182.          FSERASE   'KER LOG A1'        In case exists already [14]      01174000
  1183.          FSOPEN    'KER LOG A1',RECFM=V,FORM=E    Keep a log [14]       01175000
  1184.          LTR       R15,R15             Check the return code [14]       01176000
  1185.          BZ        SETOK               No problem [14]                  01177000
  1186.          C         R15,=F'28'          File not found [14]              01178000
  1187.          BE        SETOK               That's OK too [14]               01179000
  1188.          WRTERM    'Error creating file, no logging of packets.'  [14]  01180000
  1189.          B         SETOK                                                01181000
  1190. STDEB3   CLC       0(3,R6),=CL3'OFF'   Setting if off?                  01182000
  1191.          BNE       STDEB4              No then it's wrong               01183000
  1192.          NI        FLAGS,X'FF'-DEBUG   Set it OFF                       01184000
  1193.          FSCLOSE   'KER LOG A1'        Done logging [14]                01185000
  1194.          B         SETOK                                                01186000
  1195. STDEB4   WRTERM    'Invalid operand'                                    01187000
  1196.          B         SETERR              [10 end]                         01188000
  1197. NODEB    CLC       0(5,R6),=CL5'BLOCK' Set checksum len [8 start]       01189000
  1198.          BNE       NOBL                                                 01190000
  1199.          LA        R6,8(R6)            Pick up chksum type              01191000
  1200.          CLI       0(R6),C'?'          Need help?                       01192000
  1201.          BNE       CHKBL                                                01193000
  1202.          WRTERM    '1, 2, or 3'                                         01194000
  1203.          B         SETOK                                                01195000
  1204. CHKBL    CLI       0(R6),X'F1'         Must be 1, 2 or 3                01196000
  1205.          BL        BLKERR              Error if below 1                 01197000
  1206.          CLI       0(R6),X'F3'                                          01198000
  1207.          BH        BLKERR              Error if above 3                 01199000
  1208.          CLI       1(R6),C' '          Should be one char long [20]     01200000
  1209.          BNE       BLKERR              Else fail [20]                   01201000
  1210.          SR        R4,R4                                                01202000
  1211.          IC        R4,0(R6)            Pick it up                       01203000
  1212.          S         R4,=F'240'          Shouldn't be printable           01204000
  1213.          STC       R4,CHKLEN           Pick up block check              01205000
  1214.          STC       R4,CHKSET           Store here too                   01206000
  1215.          B         SETOK                                                01207000
  1216. BLKERR   WRTERM    'Must be 1, 2, or 3'                                 01208000
  1217.          B         SETERR                                               01209000
  1218. NOBL     CLC       0(5,R6),=CL5'RECFM' Set recfm [8 end]                01210000
  1219.          BNE       NOREC                                                01211000
  1220.          LA        R6,8(R6)            PICK UP RECORD FORMAT            01212000
  1221.          CLI       0(R6),C'?'                                           01213000
  1222.          BNE       CHKFM                                                01214000
  1223.          WRTERM    'f or v (default of v)'                              01215000
  1224.          B         SETOK                                                01216000
  1225. CHKFM    CLI       0(R6),C'V'          REDUNDANT                        01217000
  1226.          BE        FMSET                                                01218000
  1227.          CLI       0(R6),C'F'          FIXED FORMAT?                    01219000
  1228.          BNE       RECERR                                               01220000
  1229. FMSET    MVC       RFM(1),0(R6)        PICK UP RECFM                    01221000
  1230.          B         SETOK                                                01222000
  1231. RECERR   WRTERM    'Fixed and variable files only'                      01223000
  1232.          B         SETERR                                               01224000
  1233. NOREC    CLC       0(5,R6),=C'QUOTE'   QUOTE CHARACTER                  01225000
  1234.          BNE       NOQUO                                                01226000
  1235.          LA        R6,8(R6)            GET NEXT TOKEN                   01227000
  1236.          CLI       0(R6),X'FF'         VALUE NOT SUPPLIED?              01228000
  1237.          BNE       GIVQ                                                 01229000
  1238.          WRTERM    '?not confirmed'                                     01230000
  1239.          B         SETERR                                               01231000
  1240. GIVQ     CLC       0(2,R6),=C'? '                                       01232000
  1241.          BNE       GETQUO                                               01233000
  1242.          WRTERM    'a single character'                                 01234000
  1243.          B         SETOK                                                01235000
  1244. GETQUO   MVC       RQUOTE(1),0(R6)     SET NEW QUOTE CHAR               01236000
  1245.          TR        RQUOTE(1),ETOA      GET ASCII FORM                   01237000
  1246.          CLI       1(R6),C' '          IS IT ONLY ONE CHAR?             01238000
  1247.          BE        ISQOK                                                01239000
  1248.          WRTERM    'one character only'                                 01240000
  1249.          B         SETERR                                               01241000
  1250. ISQOK    CLI       RQUOTE,X'21'        CAN'T BE LESS THAN 32            01242000
  1251.          BL        BADQUO                                               01243000
  1252.          CLI       RQUOTE,X'7E'        CAN'T BE LARGER THAN 126         01244000
  1253.          BH        BADQUO                                               01245000
  1254.          CLI       RQUOTE,X'3E'        HAS TO BE BETWEEN 32-62          01246000
  1255.          BNH       SETOK                                                01247000
  1256.          CLI       RQUOTE,X'60'        OR BETWEEN 96-126                01248000
  1257.          BNL       SETOK                                                01249000
  1258. BADQUO   WRTERM    'Must fall between 33-62,96,or 123-126 (decimal).'   01250000
  1259.          B         SETERR                                               01251000
  1260. NOQUO    CLC       0(5,R6),=C'LRECL'   LRECL SIZE                       01252000
  1261.          BNE       NORCL                                                01253000
  1262.          LA        R6,8(R6)            PICK UP NEXT TOKEN               01254000
  1263.          CLI       0(R6),C'?'          HELP ?                           01255000
  1264.          BNE       GETREC                                               01256000
  1265.          WRTERM    'Logical record length of 1-65536 (default of 80).'  01257000
  1266.          B         SETOK                                                01258000
  1267. GETREC   L         R15,=A(GETNUM)      Get decimal number [20]          01259000
  1268.          BALR      R14,R15             Use common routine [20]          01260000
  1269.          LTR       R7,R7               Result put here [20]             01261000
  1270.          BM        BADREC              Below zero or no input [20]      01262000
  1271.          BZ        BADREC              Must be above zero [20]          01263000
  1272.          C         R7,=F'65536'        Max of 64K for lrecl [2]         01264000
  1273.          BH        BADREC                                               01265000
  1274.          ST        R7,LRECL            Set the lrecl value [2]          01266000
  1275.          MVC       MAXOUT,LRECL        Max output buffer size           01267000
  1276.          B         SETOK                                                01268000
  1277. BADREC   WRTERM    'A number between 1 and 65536 (decimal).'            01269000
  1278.          B         SETERR                                               01270000
  1279. NORCL    CLC       0(3,R6),=C'END'     EOL CHARACTER                    01271000
  1280.          BNE       NOEND                                                01272000
  1281.          LA        R6,8(R6)            NEXT TOKEN                       01273000
  1282.          CLI       0(R6),C'?'          NEED HELP?                       01274000
  1283.          BNE       GETEOL                                               01275000
  1284.          WRTERM    'A decimal number between 0 and 31.'                 01276000
  1285.          B         SETOK                                                01277000
  1286. GETEOL   L         R15,=A(GETNUM)      Get decimal number [20]          01278000
  1287.          BALR      R14,R15             Use common routine [20]          01279000
  1288.          LTR       R7,R7               Result is here  [20]             01280000
  1289.          BM        BADEOL              Below zero or no input  [20]     01281000
  1290.          C         R7,=X'0000001F'     MAX OF 31 DECIMAL                01282000
  1291.          BH        BADEOL                                               01283000
  1292.          STC       R7,SEOL             SET SEND EOL VALUE               01284000
  1293.          B         SETOK                                                01285000
  1294. BADEOL   WRTERM    'Must be a two digit value less than 31 (dec).'      01286000
  1295.          B         SETERR                                               01287000
  1296. NOEND    CLC       0(3,R6),=C'PAC'     CHANGE RECEIVE PACKET SIZE       01288000
  1297.          BNE       NOPAC               [20]                             01289000
  1298.          LA        R6,8(R6)            GET NEXT TOKEN                   01290000
  1299.          CLI       0(R6),C'?'          NEED HELP?                       01291000
  1300.          BNE       GETPAC                                               01292000
  1301.          WRTERM    'Receive packet size (range: 26-94 decimal).'        01293000
  1302.          B         SETOK                                                01294000
  1303. GETPAC   L         R15,=A(GETNUM)      Get decimal number [20]          01295000
  1304.          BALR      R14,R15             Use common routine [20]          01296000
  1305.          LTR       R7,R7               Result is here  [20]             01297000
  1306.          BM        BADPAC              Below zero or no input  [20]     01298000
  1307.          C         R7,=F'26'           THIS IS MIN                      01299000
  1308.          BL        BADPAC                                               01300000
  1309.          C         R7,=A(SPMAX)        This is the max [5]              01301000
  1310.          BH        BADPAC                                               01302000
  1311.          ST        R7,RPSIZ            USE THIS VALUE NOW               01303000
  1312.          B         SETOK                                                01304000
  1313. BADPAC   WRTERM    'Must be between 26-94 (decimal).'                   01305000
  1314.          B         SETERR                                               01306000
  1315. * Use common code to change ATOE or ETOA.  R9 points to table to edit.  01307000
  1316. NOPAC    CLC       0(4,R6),=C'ETOA'    Change ETOA table? [20 start]    01308000
  1317.          BNE       NOET                                                 01309000
  1318.          LA        R9,ETOA             Address of table to change       01310000
  1319. ET0      LA        R6,8(R6)            Bump pointer                     01311000
  1320.          CLI       0(R6),C'?'          Help?                            01312000
  1321.          BNE       ET1                                                  01313000
  1322.          WRTERM    'Offset to change and new value (decimal)'           01314000
  1323.          B         SETOK                                                01315000
  1324. ET1      L         R15,=A(GETNUM)      Get table offset                 01316000
  1325.          BALR      R14,R15             Use common routine               01317000
  1326.          LTR       R7,R7               Result is here                   01318000
  1327.          BM        BADTRT              Below zero or no input           01319000
  1328.          C         R7,=F'255'          Max is 255                       01320000
  1329.          BH        BADTRT                                               01321000
  1330.          LR        R2,R7               Save table offset here           01322000
  1331.          LA        R6,8(R6)            Pick up next field               01323000
  1332.          L         R15,=A(GETNUM)      Get value to change it to        01324000
  1333.          BALR      R14,R15                                              01325000
  1334.          LTR       R7,R7                                                01326000
  1335.          BM        BADTRT                                               01327000
  1336.          C         R7,=F'255'                                           01328000
  1337.          BH        BADTRT                                               01329000
  1338.          AR        R9,R2               Location of byte to change       01330000
  1339.          STC       R7,0(R9)            Change value                     01331000
  1340.          B         SETOK               All done                         01332000
  1341. BADTRT   WRTERM    'Both numbers must be between 0-255 (decimal).'      01333000
  1342.          B         SETERR                                               01334000
  1343. NOET     CLC       0(4,R6),=C'ATOE'    Change ATOE                      01335000
  1344.          BNE       SETERR                                               01336000
  1345.          LA        R9,ATOE             Addr of table to edit            01337000
  1346.          B         ET0                 Use common routine               01338000
  1347. * R6 points to input.  Read and convert to binary.  Return value        01339000
  1348. * in R7.  Indicate error by returning -1.  Also uses R4 and R3.         01340000
  1349. GETNUM   SR        R7,R7                                                01341000
  1350.          BCTR      R7,0                Set to -1, error condition       01342000
  1351.          CLI       0(R6),X'FF'         Any input?                       01343000
  1352.          BE        GETN5               No, return negative value        01344000
  1353.          XC        PKVAR,PKVAR         Clear it out                     01345000
  1354.          SR        R4,R4               Length of input                  01346000
  1355.          LR        R3,R6               Don't lose pointer to input      01347000
  1356. GETN0    CLI       0(R3),C' '          Any more input                   01348000
  1357.          BE        GETN1               No, pick it data                 01349000
  1358.          CLI       0(R3),X'F0'         Must be between 0-9              01350000
  1359.          BL        GETN5                                                01351000
  1360.          CLI       0(R3),X'F9'                                          01352000
  1361.          BH        GETN5                                                01353000
  1362.          LA        R3,1(R3)            Bump input pointer               01354000
  1363.          LA        R4,1(R4)            Bump counter                     01355000
  1364.          C         R4,=F'8'            At our limit?                    01356000
  1365.          BNE       GETN0               No go for more                   01357000
  1366. GETN1    BCTR      R4,0                Decrement for next call          01358000
  1367.          EX        R4,PCK              Get the input                    01359000
  1368.          CVB       R7,PKVAR            Convert to binary                01360000
  1369. GETN5    BR        R14                 Return to caller                 01361000
  1370. * [20 end]                                                              01362000
  1371. SETERR   MVI       RQUOTE,DQUOTE       Reset value, just in case [4]    01363000
  1372.          LA        R15,4               SET A NON-ZERO RETCODE           01364000
  1373.          B         SETRET                                               01365000
  1374. SETOK    SR        R15,R15             RETCODE OF 0                     01366000
  1375. *                                                                       01367000
  1376. SETRET   L         R13,4(R13)                                           01368000
  1377.          L         R14,12(R13)                                          01369000
  1378.          LM        R0,R12,20(R13)                                       01370000
  1379.          BR        R14                                                  01371000
  1380. SETSAVE  DS        18F                                                  01372000
  1381. PCK      PACK      PKVAR(8),0(0,R6)                                     01373000
  1382.          LTORG                                                          01374000
  1383.          DROP      R11                                                  01375000
  1384.          DROP      R12                                                  01376000
  1385.          EJECT                                                          01377000
  1386. * Change to allow SHOW ALL.                                             01378000
  1387. SHOW     CSECT                                                          01379000
  1388.          STM       R14,R12,12(R13)     SAVE CALLER'S REGISTERS          01380000
  1389.          BALR      R12,0               ESTABLISH ADDRESSABILITY         01381000
  1390.          USING     *,R12                                                01382000
  1391.          LA        R14,SHOWSAVE        ADDRESS OF MY SAVE AREA          01383000
  1392.          ST        R13,4(R14)          SAVE CALLER'S                    01384000
  1393.          ST        R14,8(R13)                                           01385000
  1394.          LR        R13,R14                                              01386000
  1395. * USE R11 AS BASE REGISTER FOR 'PARMS' GLOBAL DATA AREA                 01387000
  1396.          L         R11,=A(PARMS)                                        01388000
  1397.          USING     PARMS,R11           ESTABLISH ADDRESSABILITY         01389000
  1398.          CLC       0(5,R6),=C'TDUMP'   Show or tdump [20]               01390000
  1399.          BE        TDUMP                                                01391000
  1400.          LA        R6,8(R6)            PICK UP NEXT TOKEN               01392000
  1401.          CLI       0(R6),C'?'          NEED HELP ?                      01393000
  1402.          BNE       SHOA                No check options                 01394000
  1403.          WRTERM    'File, Debug, Block, Series1, Warning, Recfm, Quote' 01395000
  1404.          WRTERM    'Lrecl, End-of-line, Packet-size, All'               01396000
  1405.          B         SHOWOK                                               01397000
  1406. SHOA     NI        LFLAGS,X'FF'-ALLFL  Turn off just in case            01398000
  1407.          CLC       0(3,R6),=CL3'ALL'   Show all options?                01399000
  1408.          BNE       SHO0                No find specific one             01400000
  1409.          OI        LFLAGS,ALLFL        SHOW ALL requested               01401000
  1410.          B         SHO00               Jump to middle                   01402000
  1411. SHO0     CLC       0(4,R6),=CL4'FILE'  Show file value [1 start]        01403000
  1412.          BNE       SHO1                                                 01404000
  1413. SHO00    LA        R3,FILMSG1          Assume text mode                 01405000
  1414.          LA        R4,L'FILMSG1        Get msg length                   01406000
  1415.          TM        FLAGS,BINF          Is text mode on?                 01407000
  1416.          BNO       SHO01               Yes.                             01408000
  1417.          LA        R3,FILMSG2          Mode is binary                   01409000
  1418.          LA        R4,L'FILMSG2                                         01410000
  1419. SHO01    WRTERM    (R3),(R4)           Print mode                       01411000
  1420.          TM        LFLAGS,ALLFL        Do they want it all              01412000
  1421.          BO        SHO10               Yes give more                    01413000
  1422.          B         SHOWOK              [1 end]                          01414000
  1423. SHO1     CLC       0(5,R6),=CL5'DEBUG' Show debug value [10 start]      01415000
  1424.          BNE       SHO2                                                 01416000
  1425. SHO10    LA        R3,DEBMSG2          Assume debug mode is on          01417000
  1426.          LA        R4,L'DEBMSG2        Get length                       01418000
  1427.          TM        FLAGS,DEBUG         Is debug mode on?                01419000
  1428.          BO        SHO11               Yes.                             01420000
  1429.          LA        R3,DEBMSG1                                           01421000
  1430.          LA        R4,L'DEBMSG1                                         01422000
  1431. SHO11    WRTERM    (R3),(R4)                                            01423000
  1432.          TM        LFLAGS,ALLFL        More to show                     01424000
  1433.          BO        SHO20               Yes                              01425000
  1434.          B         SHOWOK              Else end [10 end]                01426000
  1435. SHO2     CLC       0(5,R6),=CL5'BLOCK' Show checksum len [8 start]      01427000
  1436.          BNE       SHO3                                                 01428000
  1437. SHO20    MVC       TMP(1),CHKLEN       Munge it here                    01429000
  1438.          OI        TMP,X'F0'           Make it printable                01430000
  1439.          LINEDIT   TEXT='Block check is ..',SUB=(CHARA,(TMP,1))         01431000
  1440.          TM        LFLAGS,ALLFL        More to show                     01432000
  1441.          BO        SHO30               Yes                              01433000
  1442.          B         SHOWOK                                               01434000
  1443. SHO3     CLC       0(7,R6),=CL7'SERIES1' Show series/1 mode [12 start]  01435000
  1444.          BNE       SHO4                                                 01436000
  1445. SHO30    LA        R3,SERMSG1          Assume S/1 mode is off           01437000
  1446.          LA        R4,L'SERMSG1                                         01438000
  1447.          TM        S1FLAGS,ISS1        S/1 mode on?                     01439000
  1448.          BNO       SHO31               No                               01440000
  1449.          LA        R3,SERMSG2                                           01441000
  1450.          LA        R4,L'SERMSG2                                         01442000
  1451. SHO31    WRTERM    (R3),(R4)                                            01443000
  1452.          TM        LFLAGS,ALLFL                                         01444000
  1453.          BO        SHO40                                                01445000
  1454.          B         SHOWOK              [12 end]                         01446000
  1455. SHO4     CLC       0(4,R6),=CL4'WARN'  Show fn warning? [18 start]      01447000
  1456.          BNE       SHO5                                                 01448000
  1457. SHO40    LA        R3,WARMSG1          Assume warning is off            01449000
  1458.          LA        R4,L'WARMSG1        Get length                       01450000
  1459.          TM        LFLAGS,WARFL        Is warning off?                  01451000
  1460.          BNO       SHO41               Yes.                             01452000
  1461.          LA        R3,WARMSG2                                           01453000
  1462.          LA        R4,L'WARMSG2                                         01454000
  1463. SHO41    WRTERM    (R3),(R4)                                            01455000
  1464.          TM        LFLAGS,ALLFL        More to show                     01456000
  1465.          BO        SHO50               Yes                              01457000
  1466.          B         SHOWOK              Else end  [18 end]               01458000
  1467. SHO5     CLC       0(5,R6),=CL5'RECFM' Show recfm                       01459000
  1468.          BNE       SHO6                                                 01460000
  1469. SHO50    LINEDIT   TEXT='The record format is ..',SUB=(CHARA,(RFM,1))   01461000
  1470.          TM        LFLAGS,ALLFL                                         01462000
  1471.          BO        SHO60                                                01463000
  1472.          B         SHOWOK                                               01464000
  1473. SHO6     CLC       0(5,R6),=C'QUOTE'                                    01465000
  1474.          BNE       SHO7                                                 01466000
  1475. SHO60    TR        RQUOTE(1),ATOE      GET EBCDIC VERSION               01467000
  1476.          LINEDIT   TEXT='The quote character is ..',                   *01468000
  1477.                SUB=(CHARA,(RQUOTE,1))                                   01469000
  1478.          TR        RQUOTE(1),ETOA      KEEP THE ASCII FORM AROUND       01470000
  1479.          TM        LFLAGS,ALLFL                                         01471000
  1480.          BO        SHO70                                                01472000
  1481.          B         SHOWOK                                               01473000
  1482. SHO7     CLC       0(5,R6),=C'LRECL'                                    01474000
  1483.          BNE       SHO8                                                 01475000
  1484. SHO70    L         R4,LRECL                                             01476000
  1485.          LINEDIT   TEXT='Lrecl is ........',SUB=(DEC,(R4))              01477000
  1486.          TM        LFLAGS,ALLFL                                         01478000
  1487.          BO        SHO80                                                01479000
  1488.          B         SHOWOK                                               01480000
  1489. SHO8     CLC       0(3,R6),=C'END'                                      01481000
  1490.          BNE       SHO9                                                 01482000
  1491. SHO80    SR        R4,R4               ZERO IT OUT                      01483000
  1492.          IC        R4,SEOL                                              01484000
  1493.          LINEDIT   TEXT='End-of-Line character is ...... (decimal)',   *01485000
  1494.                SUB=(DEC,(R4))                                           01486000
  1495.          TM        LFLAGS,ALLFL                                         01487000
  1496.          BO        SHO90                                                01488000
  1497.          B         SHOWOK                                               01489000
  1498. SHO9     CLC       0(3,R6),=C'PAC'     PACKET LENGTH ?                  01490000
  1499.          BNE       SHOWERR                                              01491000
  1500. SHO90    LINEDIT   TEXT='Receive packet size is ........ (decimal)',   *01492000
  1501.                SUB=(DECA,RPSIZ)                                         01493000
  1502.          B         SHOWOK                                               01494000
  1503. * Table dump routine [20 start]                                         01495000
  1504. TDUMP    LA        R6,8(R6)            Bump pointer                     01496000
  1505.          CLI       0(R6),C'?'          Need help?                       01497000
  1506.          BNE       TD0                                                  01498000
  1507.          WRTERM    'Name of table to dump (ETOA or ATOE)'               01499000
  1508.          B         SHOWOK                                               01500000
  1509. TD0      SR        R4,R4                                                01501000
  1510.          CLC       0(4,R6),=C'ETOA'                                     01502000
  1511.          BNE       TD2                                                  01503000
  1512.          LA        R3,ETOA                                              01504000
  1513. TD1      C         R4,=F'16'                                            01505000
  1514.          BE        SHOWOK              All lines displayed              01506000
  1515.          LINEDIT   TEXT='....................................',        *01507000
  1516.                SUB=(HEX4A,(R3)),DOT=NO                                  01508000
  1517.          LA        R4,1(R4)            Increment counter                01509000
  1518.          LA        R3,16(R3)           Point to next line               01510000
  1519.          B         TD1                                                  01511000
  1520. TD2      CLC       0(4,R6),=C'ATOE'                                     01512000
  1521.          BNE       TD3                                                  01513000
  1522.          LA        R3,ATOE                                              01514000
  1523.          B         TD1                                                  01515000
  1524. TD3      WRTERM    'Only the ETOA or ATOE tables are displayed'         01516000
  1525.          B         SHOWOK                                               01517000
  1526. * [20 end]                                                              01518000
  1527. SHOWERR  LA        R15,4               SET A NON-ZERO RETCODE           01519000
  1528.          B         SHOWRET                                              01520000
  1529. SHOWOK   SR        R15,R15             ZERO RETCODE                     01521000
  1530. *                                                                       01522000
  1531. SHOWRET  L         R13,4(R13)                                           01523000
  1532.          L         R14,12(R13)                                          01524000
  1533.          LM        R0,R12,20(R13)                                       01525000
  1534.          BR        R14                                                  01526000
  1535. SHOWSAVE DS        18F                                                  01527000
  1536.          LTORG                                                          01528000
  1537.          DROP      R11                                                  01529000
  1538.          DROP      R12                                                  01530000
  1539.          EJECT                                                          01531000
  1540. *                                                                       01532000
  1541. * Add server support. [13 start]                                        01533000
  1542. SERVER   CSECT                                                          01534000
  1543.          STM       R14,R12,12(R13)     SAVE CALLER'S REGISTERS          01535000
  1544.          BALR      R12,0               ESTABLISH ADDRESSABILITY         01536000
  1545.          USING     *,R12                                                01537000
  1546.          LA        R14,SERVSAVE        ADDRESS OF MY SAVE AREA          01538000
  1547.          ST        R13,4(R14)          SAVE CALLER'S                    01539000
  1548.          ST        R14,8(R13)                                           01540000
  1549.          LR        R13,R14                                              01541000
  1550. * USE R11 AS BASE REGISTER FOR 'PARMS' GLOBAL DATA AREA                 01542000
  1551.          L         R11,=A(PARMS)                                        01543000
  1552.          USING     PARMS,R11           ESTABLISH ADDRESSABILITY         01544000
  1553.          LA        1,=C'SET LINEDIT OFF'                                01545000
  1554.          LA        0,15                Command length of 15             01546000
  1555.          DIAG      1,0,8               Say it's a CP command            01547000
  1556.          OI        LFLAGS,SERVON       SERVER mode is on                01548000
  1557.          WRTERM    'Entering server mode...'                            01549000
  1558.          TM        S1FLAGS,ISS1        Is console a S/1?                01550000
  1559.          BZ        SERVA               No, skip init stuff              01551000
  1560.          LA        R1,1                Initialize                       01552000
  1561.          L         R15,=A(INTRINI)     Trap CONS interrupts             01553000
  1562.          BALR      R14,R15                                              01554000
  1563. SERVA    TM        FLAGS,DEBUG         In DEBUG mode?                   01555000
  1564.          BO        SERV0               Yes, then don't ignore attn      01556000
  1565.          STAX      SRVATTN             Else ignore attention            01557000
  1566. SERV0    MVI       CHKLEN,DCHKLEN      Set checksum length to one       01558000
  1567.          XC        NUMTRY,NUMTRY       Trial counter                    01559000
  1568.          XC        SPKNUM,SPKNUM       Packet number we'll use          01560000
  1569.          L         15,=A(RPACK)                                         01561000
  1570.          BALR      R14,R15             Read in a packet                 01562000
  1571.          CLI       RTYPE,AS            Other side sending us a file?    01563000
  1572.          BNE       SERV1               Nope                             01564000
  1573. SERV01   L         R15,=A(RECEIVE)     Get the file                     01565000
  1574.          BALR      R14,R15                                              01566000
  1575.          MVC       OLDERR(1),ERRNUM                                     01567000
  1576.          MVI       ERRNUM,X'FF'        Reset error number               01568000
  1577.          B         SERV0               Go around again                  01569000
  1578. SERV1    CLI       RTYPE,AI            Init packet                      01570000
  1579.          BNE       SERV2               Nope                             01571000
  1580.          L         R5,LRDAT            Number of pieces of data         01572000
  1581.          L         R15,=A(SPAR)                                         01573000
  1582.          BALR      R14,R15             Read data from other host        01574000
  1583.          L         R15,=A(PACKLEN)     Get max send packet size         01575000
  1584.          BALR      R14,R15                                              01576000
  1585.          L         R15,=A(RPAR)        Our paramters to send            01577000
  1586.          BALR      R14,R15                                              01578000
  1587.          ST        R15,LSDAT           Length of reply                  01579000
  1588.          MVI       STYPE,AY            Send an ACK                      01580000
  1589.          L         R15,=A(SPACK)                                        01581000
  1590.          BALR      R14,R15                                              01582000
  1591.          MVC       OLDERR(1),ERRNUM                                     01583000
  1592.          MVI       ERRNUM,X'FF'        Reset error number               01584000
  1593.          B         SERV0               Loop again no matter what        01585000
  1594. SERV2    CLI       RTYPE,AG            Generic command                  01586000
  1595.          BNE       SERV3                                                01587000
  1596.          LA        R3,RDAT             Point to first data char         01588000
  1597.          CLI       0(R3),AF            Finish command                   01589000
  1598.          BE        SERV21              Yes go handle                    01590000
  1599.          CLI       0(R3),AL            Logout command                   01591000
  1600.          BNE       SERV24              No                               01592000
  1601. SERV21   XC        LSDAT,LSDAT         No data                          01593000
  1602.          MVI       STYPE,AY            Send an ACK                      01594000
  1603.          L         R15,=A(SPACK)                                        01595000
  1604.          BALR      R14,R15                                              01596000
  1605.          CLI       0(R3),AL            Logout?                          01597000
  1606.          BNE       SERV22              No, reset things                 01598000
  1607.          FSCLOSE   'KER LOG A1'        Ignore error messages [14]       01599000
  1608.          MVI       TEMP,XON            Other guy expects this           01600000
  1609.          WRTERM    TEMP,1              So send it                       01601000
  1610.          WAITT                                                          01602000
  1611.          LA        1,=C'LOG'                                            01603000
  1612.          LA        0,3                                                  01604000
  1613.          DIAG      1,0,8               Issue CP LOG command             01605000
  1614. SERV22   MVC       OLDERR(1),ERRNUM                                     01606000
  1615.          MVI       ERRNUM,X'FF'        Reset error number               01607000
  1616.          MVI       EXTFLG,X'FF'        Set exit flag                    01608000
  1617.          TM        S1FLAGS,ISS1        Is console a S/1?                01609000
  1618.          BZ        SERV23              No skip reset                    01610000
  1619.          SR        R1,R1               Clear interrupt trapping         01611000
  1620.          L         R15,=A(INTRINI)                                      01612000
  1621.          BALR      R14,R15                                              01613000
  1622. SERV23   NI        LFLAGS,X'FF'-SERVON    SERVER mode is off            01614000
  1623.          LA        1,=C'SET LINEDIT ON'                                 01615000
  1624.          LA        0,14                                                 01616000
  1625.          DIAG      1,0,8                                                01617000
  1626.          STAX      ,                   Reset attn address               01618000
  1627.          B         SERVRET                                              01619000
  1628. SERV24   MVI       ERRNUM,X'12'        Error message number             01620000
  1629.          L         R15,=A(ERRPACK)     Send an error packet             01621000
  1630.          BALR      R14,R15                                              01622000
  1631.          B         SERV0               And wait for more                01623000
  1632. SERV3    CLI       RTYPE,AR            Other side did GET command       01624000
  1633.          BNE       SERV4                                                01625000
  1634.          L         R5,LRDAT            File name size                   01626000
  1635.          LTR       R5,R5                                                01627000
  1636.          BZ        SERV35              Fail on zero length              01628000
  1637.          MVC       FILNAM,=18X'20'     Blank out filename               01629000
  1638.          MVC       NAME,=18X'20'                                        01630000
  1639.          LR        R6,R5               Length of data                   01631000
  1640.          LA        R7,RDAT             Location of data                 01632000
  1641. SERV30   CLI       0(R7),X'2E'         Is char a dot                    01633000
  1642.          BNE       SERV31              No try next one                  01634000
  1643.          MVI       0(R7),X'20'         Replace with space               01635000
  1644. SERV31   CLI       0(R7),X'61'         Less than Ascii "a"              01636000
  1645.          BL        SERV312             Yes leave as is                  01637000
  1646.          CLI       0(R7),X'7A'         Greater than Ascii "z"           01638000
  1647.          BH        SERV312             Yes leave as is                  01639000
  1648.          NI        0(R7),X'5F'         Else capitalize                  01640000
  1649. SERV312  LA        R7,1(R7)            Bump pointer                     01641000
  1650.          BCTR      R6,0                Any more data?                   01642000
  1651.          LTR       R6,R6                                                01643000
  1652.          BNZ       SERV30              Yes go check                     01644000
  1653.          TR        RDAT(130),ATOE      For tokenizer                    01645000
  1654.          DMSKEY    NUCLEUS             Tokenize input                   01646000
  1655.          LA        R1,RDAT             Buffer address                   01647000
  1656.          L         R0,LRDAT            Buffer length                    01648000
  1657.          L         R15,ASCANN                                           01649000
  1658.          BALR      R14,R15             Let CMS do the work              01650000
  1659.          LR        R3,R15              Save retcode                     01651000
  1660.          LR        R6,R1               Save pointer to tokenized list   01652000
  1661.          DMSKEY    RESET                                                01653000
  1662.          LTR       R3,R3               OK retcode?                      01654000
  1663.          BNZ       SERV35              Nope complain                    01655000
  1664.          MVC       NAME(8),0(R6)       Remember fn here                 01656000
  1665.          MVC       NAME+8(8),8(R6)     And ft                           01657000
  1666.          MVC       NAME+16(2),=C'* '   Default fm just in case          01658000
  1667.          CLC       16(8,R6),=8X'FF'    Look for fm                      01659000
  1668.          BE        SERV32              Not there, just send file        01660000
  1669.          MVC       NAME+16(2),16(R6)   Get fm                           01661000
  1670. SERV32   OI        FLAGS,FLG1          Sending first file               01662000
  1671.          XC        NFSENT,NFSENT       No files sent yet                01663000
  1672.          L         R15,=A(SEND)                                         01664000
  1673.          BALR      R14,R15                                              01665000
  1674.          MVC       OLDERR(1),ERRNUM                                     01666000
  1675.          MVI       ERRNUM,X'FF'        Reset error number               01667000
  1676.          B         SERV0               Go around again                  01668000
  1677. SERV35   MVI       ERRNUM,X'0B'        Error message number             01669000
  1678.          L         R15,=A(ERRPACK)     Send an error packet             01670000
  1679.          BALR      R14,R15                                              01671000
  1680.          B         SERV0               And wait for more                01672000
  1681. SERV4    CLI       RTYPE,AE            Error packet                     01673000
  1682.          BNE       SERV5                                                01674000
  1683.          B         SERV0               Ignore it                        01675000
  1684. SERV5    CLI       RTYPE,AN            Packet garbled?                  01676000
  1685.          BNE       SERV6                                                01677000
  1686.          MVI       STYPE,AN            Send a NAK                       01678000
  1687.          XC        LSDAT,LSDAT         No data                          01679000
  1688.          L         R15,=A(SPACK)                                        01680000
  1689.          BALR      R14,R15                                              01681000
  1690.          B         SERV0               And try again                    01682000
  1691. SERV6    CLI       RTYPE,X'00'         Series/1 error?                  01683000
  1692.          BNE       SERV7                                                01684000
  1693.          MVI       ERRNUM,S1ERRNUM     Try to send error packet         01685000
  1694.          L         R15,=A(ERRPACK)     Send an error packet             01686000
  1695.          BALR      R14,R15                                              01687000
  1696.          B         SERV0                                                01688000
  1697. SERV7    MVI       ERRNUM,X'13'        Error message number             01689000
  1698.          L         R15,=A(ERRPACK)     Send an error packet             01690000
  1699.          BALR      R14,R15                                              01691000
  1700.          B         SERV0                                                01692000
  1701. *                                                                       01693000
  1702. SRVATTN  BR        R14                 Ignore attention                 01694000
  1703. *                                                                       01695000
  1704. SERVRET  L         R13,4(R13)                                           01696000
  1705.          L         R14,12(R13)                                          01697000
  1706.          LM        R0,R12,20(R13)                                       01698000
  1707.          BR        R14                                                  01699000
  1708. SERVSAVE DS        18F                                                  01700000
  1709.          LTORG                                                          01701000
  1710.          DROP      R11                                                  01702000
  1711.          DROP      R12                                                  01703000
  1712.          EJECT                                                          01704000
  1713. * [13 end]                                                              01705000
  1714. *                                                                       01706000
  1715. * Read parameters from other host.  Size of data passed in R5.          01707000
  1716. * Use the default for any parameter not supplied. [5]                   01708000
  1717. *                                                                       01709000
  1718. SPAR     CSECT                                                          01710000
  1719.          STM       R14,R12,12(R13)                                      01711000
  1720.          BALR      R12,0                                                01712000
  1721.          USING     *,R12                                                01713000
  1722.          LA        R14,SPARSV                                           01714000
  1723.          ST        R13,4(R14)                                           01715000
  1724.          ST        R14,8(R13)                                           01716000
  1725.          LR        R13,R14                                              01717000
  1726. * USE R11 AS BASE REGISTER FOR THE SHARED DATA AREA                     01718000
  1727.          L         R11,=A(PARMS)                                        01719000
  1728.          USING     PARMS,R11                                            01720000
  1729.          SR        R4,R4               Zero out register                01721000
  1730.          LA        R7,RDAT             Pointer to data buffer           01722000
  1731.          C         R5,ZERO             Any data                         01723000
  1732.          BH        SPAR0                                                01724000
  1733.          LA        R4,DSSIZ            Default send packet size         01725000
  1734.          B         SPAR02                                               01726000
  1735. SPAR0    IC        R4,0(R7)            Max send packet size             01727000
  1736.          S         R4,SPACE            Subtract the space               01728000
  1737.          C         R4,=A(SPMIN)        Can't be below minimum           01729000
  1738.          BNL       SPAR01              So far, so good                  01730000
  1739.          LA        R4,SPMIN            Else, use the min valuea         01731000
  1740.          B         SPAR02                                               01732000
  1741. SPAR01   C         R4,=A(SPMAX)        Max send packet size             01733000
  1742.          BNH       SPAR02              Can't be above max               01734000
  1743.          LA        R4,SPMAX                                             01735000
  1744. SPAR02   STC       R4,SPSIZ+3          Save max send packet size        01736000
  1745.          C         R5,ONE              More than one piece of data?     01737000
  1746.          BH        SPAR1               Send timeout supplied            01738000
  1747.          LA        R4,DSTIM            Else, use default                01739000
  1748.          B         SPAR12                                               01740000
  1749. SPAR1    SR        R4,R4                                                01741000
  1750.          IC        R4,1(R7)            Get send timeout value           01742000
  1751.          S         R4,SPACE                                             01743000
  1752.          C         R4,ZERO             Must be non-negative             01744000
  1753.          BNL       SPAR12                                               01745000
  1754.          L         R4,ZERO                                              01746000
  1755. SPAR12   STC       R4,STIME            Save send timeout value          01747000
  1756.          C         R5,TWO              More than two pieces of data?    01748000
  1757.          BH        SPAR2               Yes, pick up pad char            01749000
  1758.          LA        R4,DSPAD            No, use default                  01750000
  1759.          B         SPAR22                                               01751000
  1760. SPAR2    SR        R4,R4                                                01752000
  1761.          IC        R4,2(R7)            Get number of pad chars          01753000
  1762.          S         R4,SPACE                                             01754000
  1763.          C         R4,ZERO             Must be non-negative             01755000
  1764.          BH        SPAR22                                               01756000
  1765.          L         R4,ZERO             Else, use zero                   01757000
  1766. SPAR22   STC       R4,SPAD                                              01758000
  1767.          C         R5,=F'3'            More than 3 pieces of data       01759000
  1768.          BH        SPAR3               Yes, get pad char to use         01760000
  1769.          LA        R4,DSPADC                                            01761000
  1770.          B         SPAR32                                               01762000
  1771. SPAR3    IC        R4,3(R7)            Pad char other side wants        01763000
  1772.          A         R4,O1H              Re-controllify it                01764000
  1773.          N         R4,=X'0000007F'                                      01765000
  1774.          C         R4,DEL              Is it a delete?                  01766000
  1775.          BE        SPAR32              Yes, then it's OK                01767000
  1776.          C         R4,ZERO             Is it above zero                 01768000
  1777.          BNL       SPAR31              Yes, then OK                     01769000
  1778.          L         R4,ZERO             Else, use null                   01770000
  1779.          B         SPAR32                                               01771000
  1780. SPAR31   C         R4,=F'31'           Is it a control char             01772000
  1781.          BNH       SPAR32              Yes, then OK                     01773000
  1782.          L         R4,ZERO             No, so use null                  01774000
  1783. SPAR32   STC       R4,SPADCH                                            01775000
  1784.          C         R5,=F'4'            More than 4 pieces of data       01776000
  1785.          BH        SPAR4               Yes, get EOL char                01777000
  1786.          LA        R4,DEOL             Else, use default                01778000
  1787.          B         SPAR42                                               01779000
  1788. SPAR4    IC        R4,4(R7)            Get the EOL char                 01780000
  1789.          S         R4,SPACE                                             01781000
  1790. SPAR42   STC       R4,SEOL                                              01782000
  1791.          C         R5,=F'5'            More than 5 pieces of data       01783000
  1792.          BH        SPAR5                                                01784000
  1793.          LA        R4,DQUOTE                                            01785000
  1794.          B         SPAR52                                               01786000
  1795. SPAR5    SR        R4,R4                                                01787000
  1796.          IC        R4,5(R7)            Get quote char                   01788000
  1797.          C         R4,SPACE            Less than a space?               01789000
  1798.          BNL       SPAR51              No, is OK so far                 01790000
  1799.          LA        R4,DQUOTE           Yes, so use default              01791000
  1800.          B         SPAR52                                               01792000
  1801. SPAR51   C         R4,=F'126'          Must be tilde or less            01793000
  1802.          BNH       SPAR52                                               01794000
  1803.          LA        R4,DQUOTE           If higher than use default       01795000
  1804. SPAR52   STC       R4,SQUOTE                                            01796000
  1805.          C         R5,=F'6'            More than 6 pieces of data       01797000
  1806.          BH        SPAR6                                                01798000
  1807.          MVI       EBQUOT,AY           Default (can do it but won't)    01799000
  1808.          B         SPAR7                                                01800000
  1809. SPAR6    SR        R4,R4                                                01801000
  1810.          IC        R4,6(R7)                                             01802000
  1811.          L         R15,=A(DOQUO)       Set 8-bit quote char [1]         01803000
  1812.          BALR      R14,R15             [1]                              01804000
  1813. SPAR7    C         R5,=F'7'            More than 7 pieces of data       01805000
  1814.          BH        SPAR71              Yes get checksum length          01806000
  1815.          MVI       CHKLEN,X'01'        Else use default of one          01807000
  1816.          B         SPAR8                                                01808000
  1817. SPAR71   SR        R4,R4                                                01809000
  1818.          IC        R4,7(R7)            Get checksum size they want      01810000
  1819.          L         R15,=A(DOCHK)       Check what they sent             01811000
  1820.          BALR      R14,R15                                              01812000
  1821. SPAR8    C         R5,=F'8'            More than 8 pieces of data       01813000
  1822.          BH        SPAR81              Get repeat quote they want       01814000
  1823.          MVI       RPTQ,X'00'          Else don't do repeat prefixing   01815000
  1824.          MVI       ORIGQ,X'00'         Reset here too  [24]             01815100
  1825.          B         SPAR9                                                01816000
  1826. SPAR81   SR        R4,R4                                                01817000
  1827.          IC        R4,8(R7)            Get prefix they want to use      01818000
  1828.          L         R15,=A(DORPT)       Routine to check their value     01819000
  1829.          BALR      R14,R15                                              01820000
  1830. SPAR9    L         R13,4(R13)                                           01821000
  1831.          L         R14,12(R13)                                          01822000
  1832.          LM        R0,R12,20(R13)                                       01823000
  1833.          BR        R14                                                  01824000
  1834. *                                                                       01825000
  1835. * Set checksum length                                                   01826000
  1836. DOCHK    MVI       TMP,X'31'                                            01827000
  1837.          CLM       R4,B'0001',TMP      Must be the character 1,2 or 3   01828000
  1838.          BL        DOCHK0              Below 1 so fail                  01829000
  1839.          MVI       TMP,X'33'                                            01830000
  1840.          CLM       R4,B'0001',TMP                                       01831000
  1841.          BNH       DOCHK1              Is in the limit                  01832000
  1842.          MVI       TMP,X'31'                                            01833000
  1843. DOCHK0   IC        R4,TMP              Else use default                 01834000
  1844. DOCHK1   S         R4,=F'48'           Don't want it printable          01835000
  1845.          CLM       R4,B'0001',CHKLEN   Do we want the same thing?       01836000
  1846.          BE        DOCHK2              Yes then we're done              01837000
  1847.          MVI       CHKLEN,X'01'        Else use single char checksum    01838000
  1848. DOCHK2   BR        R14                 Return                           01839000
  1849. * Set repeat count quote character.  It must be different from          01840000
  1850. * the control & eight-bit quote characters.  Also, both sides must      01841000
  1851. * use the same character.                                               01842000
  1852. DORPT    C         R4,=F'33'           Check if in valid range          01843000
  1853.          BNL       DORPT0              It's 33 or above                 01844000
  1854.          B         DORPT4              Else fail                        01845000
  1855. DORPT0   C         R4,=F'62'                                            01846000
  1856.          BH        DORPT1                                               01847000
  1857.          B         DORPT3              And 62 or below - OK             01848000
  1858. DORPT1   C         R4,=F'96'                                            01849000
  1859.          BNL       DORPT2              It's 96 or above                 01850000
  1860.          B         DORPT4              Else fail                        01851000
  1861. DORPT2   C         R4,=F'126'                                           01852000
  1862.          BH        DORPT4              If above 126 then fail           01853000
  1863. DORPT3   CLM       R4,B'0001',SQUOTE   Same as send quote char          01854000
  1864.          BE        DORPT4              Yes so fail                      01855000
  1865.          CLM       R4,B'0001',RQUOTE   Same as receive quote char       01856000
  1866.          BE        DORPT4              Yes so fail                      01857000
  1867.          CLM       R4,B'0001',EBQUOT   Same as eight bit prefix         01858000
  1868.          BE        DORPT4              Yes so fail                      01859000
  1869.          CLM       R4,B'0001',RPTQ     We planning to use same char?    01860000
  1870.          BNE       DORPT4              No so fail                       01861000
  1871.          BR        R14                 Yes so its OK                    01862000
  1872. DORPT4   MVI       RPTQ,X'00'          Don't do repeat prefixing        01863000
  1873.          MVI       ORIGQ,X'00'         Reset here too  [24]             01863100
  1874.          BR        R14                                                  01864000
  1875. *                                                                       01865000
  1876. SPARSV   DS        18F                 KERMIT'S SAVE AREA               01866000
  1877.          LTORG                                                          01867000
  1878.          DROP      R11                                                  01868000
  1879.          DROP      R12                 NO LONGER NEED THEM              01869000
  1880.          EJECT                                                          01870000
  1881. *                                                                       01871000
  1882. * Set up our parameters we will send to other host.  Return size        01872000
  1883. * of data in R15. [5]                                                   01873000
  1884. *                                                                       01874000
  1885. RPAR     CSECT                                                          01875000
  1886.          STM       R14,R12,12(R13)                                      01876000
  1887.          BALR      R12,0                                                01877000
  1888.          USING     *,R12                                                01878000
  1889.          LA        R14,RPARSV                                           01879000
  1890.          ST        R13,4(R14)                                           01880000
  1891.          ST        R14,8(R13)                                           01881000
  1892.          LR        R13,R14                                              01882000
  1893. * USE R11 AS BASE REGISTER FOR THE SHARED DATA AREA                     01883000
  1894.          L         R11,=A(PARMS)                                        01884000
  1895.          USING     PARMS,R11                                            01885000
  1896.          L         R5,RPSIZ            Receive packet size              01886000
  1897.          A         R5,SPACE            Make it printable                01887000
  1898.          STC       R5,SDAT             Add size info to buffer          01888000
  1899.          IC        R5,RTIME            Receive packet time out          01889000
  1900.          A         R5,SPACE                                             01890000
  1901.          STC       R5,SDAT+1                                            01891000
  1902.          IC        R5,RPAD             Number of padding chars.         01892000
  1903.          A         R5,SPACE                                             01893000
  1904.          STC       R5,SDAT+2                                            01894000
  1905.          IC        R5,RPADCH            Pad character                   01895000
  1906.          L         R3,O1H                                               01896000
  1907.          XR        R5,R3               CTL function (xor with 64)       01897000
  1908.          N         R5,=X'0000007F'                                      01898000
  1909.          STC       R5,SDAT+3                                            01899000
  1910.          IC        R5,REOL             EOL char I need                  01900000
  1911.          A         R5,SPACE            MAKE PRINTABLE                   01901000
  1912.          STC       R5,SDAT+4                                            01902000
  1913.          IC        R5,RQUOTE           My quote char                    01903000
  1914.          STC       R5,SDAT+5                                            01904000
  1915.          IC        R5,EBQUOT           8-BIT QUOTE CHAR [1]             01905000
  1916.          STC       R5,SDAT+6           PUT INTO BUFFER [1]              01906000
  1917.          IC        R5,CHKLEN           Length of checksum               01907000
  1918.          A         R5,=F'48'           Make into a real digit           01908000
  1919.          STC       R5,SDAT+7                                            01909000
  1920.          SR        R5,R5                                                01910000
  1921.          IC        R5,RPTQ             Repeat quote char                01911000
  1922.          C         R5,ZERO             Null means no                    01912000
  1923.          BNE       RPAR0               Branch if doing repeat quoting   01913000
  1924.          L         R5,SPACE            If not, send a blank instead     01914000
  1925. RPAR0    STC       R5,SDAT+8                                            01915000
  1926.          L         R15,=F'9'           Return size of data              01916000
  1927.          L         R13,4(R13)                                           01917000
  1928.          L         R14,12(R13)                                          01918000
  1929.          LM        R0,R12,20(R13)                                       01919000
  1930.          BR        R14                                                  01920000
  1931. *                                                                       01921000
  1932. RPARSV   DS        18F                 KERMIT'S SAVE AREA               01922000
  1933.          LTORG                                                          01923000
  1934.          DROP      R11                                                  01924000
  1935.          DROP      R12                 NO LONGER NEED THEM              01925000
  1936.          EJECT                                                          01926000
  1937. *                                                                       01927000
  1938. * New routine to set the 8-bit quote character depending on my          01928000
  1939. * own capabilities and the other Kermit's request.  [1]                 01929000
  1940. *                                                                       01930000
  1941. DOQUO    CSECT                                                          01931000
  1942.          STM       R14,R12,12(R13)     SAVE CALLER'S REGISTERS          01932000
  1943.          BALR      R12,0               ESTABLISH ADDRESSABILITY         01933000
  1944.          USING     *,R12                                                01934000
  1945.          LA        R14,DQSAVE          ADDRESS OF MY SAVE AREA          01935000
  1946.          ST        R13,4(R14)          SAVE CALLER'S                    01936000
  1947.          ST        R14,8(R13)                                           01937000
  1948.          LR        R13,R14                                              01938000
  1949. * USE R11 AS BASE REGISTER FOR 'PARMS' GLOBAL DATA AREA                 01939000
  1950.          L         R11,=A(PARMS)                                        01940000
  1951.          USING     PARMS,R11           ESTABLISH ADDRESSABILITY         01941000
  1952.          LA        R7,RDAT             Point to data buffer             01942000
  1953.          CLI       EBQUOT,AN           Can I do 8-bit quoting?          01943000
  1954.          BE        DQRET               No - so forget it                01944000
  1955.          CLI       EBQUOT,AY           Can I do it if requested?        01945000
  1956.          BNE       DQ0                 No - I must quote                01946000
  1957.          MVC       EBQUOT(1),6(R7)     Set new 8-bit quote char         01947000
  1958.          SR        R3,R3                                                01948000
  1959.          IC        R3,EBQUOT                                            01949000
  1960.          L         R15,=A(PRECHK)      Validate prefix                  01950000
  1961.          BALR      R14,R15                                              01951000
  1962.          LTR       R15,R15             Check the return code            01952000
  1963.          BNZ       DQ1                 Failed so don't do quoting       01953000
  1964.          CLC       EBQUOT(1),RQUOTE    Same prefix                      01954000
  1965.          BE        DQ1                 Not allowed so no quoting        01955000
  1966.          CLC       EBQUOT(1),SQUOTE    Same prefix                      01956000
  1967.          BE        DQ1                 Not allowed so no quoting        01957000
  1968.          B         DQRET               And leave                        01958000
  1969. DQ0      CLI       6(R7),AY            I need quoting - can he do it?   01959000
  1970.          BE        DQRET               Yes - then all is settled        01960000
  1971.          CLI       6(R7),AN            He can't do it - don't quote     01961000
  1972.          BE        DQ1                 He needs quoting also            01962000
  1973.          CLC       EBQUOT(1),6(R7)     The quote chars must match       01963000
  1974.          BE        DQRET               We match - its ok                01964000
  1975. DQ1      MVI       EBQUOT,AN           Else, forget the quoting         01965000
  1976. DQRET    L         R13,4(R13)                                           01966000
  1977.          L         R14,12(R13)                                          01967000
  1978.          LM        R0,R12,20(R13)                                       01968000
  1979.          BR        14                                                   01969000
  1980. *                                                                       01970000
  1981. * Check if prefix in R3 is in valid range: 33-62, 96-126.   If OK,      01971000
  1982. * R15 contains a zero, else -1.                                         01972000
  1983. *                                                                       01973000
  1984. PRECHK   C         R3,=F'33'                                            01974000
  1985.          BNL       PREC0               It's 33 or above                 01975000
  1986.          B         PREC4               Else fail                        01976000
  1987. PREC0    C         R3,=F'62'                                            01977000
  1988.          BH        PREC1                                                01978000
  1989.          B         PREC5               And 62 or below - OK             01979000
  1990. PREC1    C         R3,=F'96'                                            01980000
  1991.          BNL       PREC2               It's 96 or above                 01981000
  1992.          B         PREC4               Else fail                        01982000
  1993. PREC2    C         R3,=F'126'                                           01983000
  1994.          BNH       PREC5               Is 126 or below - OK             01984000
  1995. PREC4    L         R15,=F'-1'          Bad rc means we failed           01985000
  1996.          BR        R14                                                  01986000
  1997. PREC5    SR        R15,R15             Zero rc means all is well        01987000
  1998.          BR        R14                                                  01988000
  1999. *                                                                       01989000
  2000. DQSAVE   DS        18F                                                  01990000
  2001.          LTORG                                                          01991000
  2002.          DROP      R11                                                  01992000
  2003.          DROP      R12                 DON'T NEED THEM ANYMORE          01993000
  2004.          EJECT                                                          01994000
  2005. *                                                                       01995000
  2006. SEND     CSECT                                                          01996000
  2007.          STM       R14,R12,12(R13)     SAVE CALLER'S REGISTERS          01997000
  2008.          BALR      R12,0               ESTABLISH ADDRESSABILITY         01998000
  2009.          USING     *,R12                                                01999000
  2010.          LA        R14,SENDSAVE        ADDRESS OF MY SAVE AREA          02000000
  2011.          ST        R13,4(R14)          SAVE CALLER'S                    02001000
  2012.          ST        R14,8(R13)                                           02002000
  2013.          LR        R13,R14                                              02003000
  2014. * USE R11 AS BASE REGISTER FOR 'PARMS' GLOBAL DATA AREA                 02004000
  2015.          L         R11,=A(PARMS)                                        02005000
  2016.          USING     PARMS,R11           ESTABLISH ADDRESSABILITY         02006000
  2017.          MVC       EBQUOT(1),ORIG8Q    IF CHANGED IN LAST X-FER [1]     02007000
  2018.          MVI       CXZ,X'00'           Just in case [16]                02008000
  2019.          MVI       STATE,C'S'                                           02009000
  2020.          SR        R3,R3                                                02010000
  2021.          ST        R3,SPKNUM                                            02011000
  2022.          ST        R3,NUMTRY                                            02012000
  2023.          MVC       FST(4),=X'FF000000' INITIALIZATION STUFF             02013000
  2024.          MVC       ADT(4),=X'FF000000' HERE TOO,IN CASE OF RETRY        02014000
  2025. NXTFIL   CLI       CXZ,AZ              Stop file group send [16]        02015000
  2026.          BE        DIEOK               Yes finish up [16]               02016000
  2027.          LA        R1,FILINFO          STUFF NEED TO GET FNAME(S)       02017000
  2028.          L         R15,=V(NEXTFST)                                      02018000
  2029.          BALR      R14,R15             GET NEXT/FIRST FILE              02019000
  2030.          LTR       R5,R15              COPY RETCODE                     02020000
  2031.          BNZ       NOFIND              RETCODE OF ZERO = ALL OK         02021000
  2032.          MVI       CXZ,X'00'           In case aborted last file [16]   02022000
  2033.          L         R9,FST              GET INFO FROM FSTTABLE           02023000
  2034.          USING     FSTD,R9                                              02024000
  2035.          MVC       FILNAM(8),FSTFNAME  GET FNAME                        02025000
  2036.          MVC       FILNAM+8(8),FSTFTYPE                                 02026000
  2037.          MVC       FILNAM+16(2),FSTFMODE                                02027000
  2038.          L         R9,ADT                                               02028000
  2039.          USING     ADTSECT,R9                                           02029000
  2040.          LA        R5,ADTM                                              02030000
  2041.          MVC       FILNAM+16(1),0(R5)  GET CORRECT FMODE                02031000
  2042.          LA        R5,FSENT            TABLE W/FILES SENT SO FAR        02032000
  2043.          LR        R7,R5               KEEP TRACK OF TABLE              02033000
  2044.          LA        R7,160(R7)          HERE, WE'RE PAST THE TABLE       02034000
  2045.          L         R4,NFSENT           HOW MANY SENT SO FAR             02035000
  2046. FILLOOP  LTR       R4,R4                                                02036000
  2047.          BZ        OKSND                                                02037000
  2048.          BCTR      R4,0                DECREMENT COUNTER                02038000
  2049.          CLC       0(16,R5),FILNAM     SENT ALREADY?                    02039000
  2050.          BE        NXTFIL              DON'T RESEND                     02040000
  2051.          LA        R5,16(R5)           CHECK NEXT FILE                  02041000
  2052.          CR        R5,R7                                                02042000
  2053.          BNE       FILLOOP                                              02043000
  2054.          L         R5,STORLOC          SEARCH HERE NOW                  02044000
  2055.          B         FILLOOP                                              02045000
  2056. OKSND    TM        FLAGS,FLG1          IS THIS THE FIRST FILE?          02046000
  2057.          BNO       SLOOP               ONLY WAIT 10 SECS IF YES         02047000
  2058.          NI        FLAGS,X'FF'-FLG1    Turn off first file flag [13]    02048000
  2059.          TM        LFLAGS,SERVON       In server mode? [13]             02049000
  2060.          BO        SLOOP               Yes so skip this stuff [13]      02050000
  2061.          TM        S1FLAGS,ISS1        Is console a S/1? [12]           02051000
  2062.          BZ        SNDX                No, skip init stuff [12]         02052000
  2063.          LA        R1,1                Initialize [12]                  02053000
  2064.          L         R15,=A(INTRINI)     Trap CONS interrupts [12]        02054000
  2065.          BALR      R14,R15             [12]                             02055000
  2066. SNDX     LA        1,=C'SL 10 SEC'     Sleep before sending  [13]       02056000
  2067.          LA        0,9                 COMMAND LENGTH IS 9              02057000
  2068.          DIAG      1,0,8               SHOW IT'S A CP COMMAND           02058000
  2069. SLOOP    CLI       STATE,C'D'          SEND DATA STATE                  02059000
  2070.          BE        SDATA                                                02060000
  2071.          CLI       STATE,C'F'          SEND FILE STATE                  02061000
  2072.          BE        SFILE                                                02062000
  2073.          CLI       STATE,C'S'          SEND INIT STATE                  02063000
  2074.          BE        SINIT                                                02064000
  2075.          CLI       STATE,C'Z'          END OF FILE STATE                02065000
  2076.          BE        SEOF                                                 02066000
  2077.          CLI       STATE,C'B'          SEND BREAK STATE                 02067000
  2078.          BE        SBREAK                                               02068000
  2079.          CLI       STATE,C'C'          COMPLETE STATE                   02069000
  2080.          BE        COMPLETE                                             02070000
  2081.          CLI       STATE,C'A'          ABORT STATE                      02071000
  2082.          BE        ABORT               ERROR - GO TO ABORT STATE        02072000
  2083.          MVI       ERRNUM,X'02'        UNRECOGNIZED STATE               02073000
  2084.          B         ABORT               OTHERWISE, DIE                   02074000
  2085. *                                                                       02075000
  2086. SINIT    CLC       NUMTRY,IMXTRY       SEE IF CAN SEND                  02076000
  2087.          BL        SINIT0              YES WE CAN                       02077000
  2088.          MVI       STATE,C'A'          NOPE, GO INTO ABORT STATE        02078000
  2089.          B         SLOOP                                                02079000
  2090. SINIT0   L         R3,NUMTRY                                            02080000
  2091.          LA        R3,1(R3)            INCREMENT TRIAL COUNTER          02081000
  2092.          ST        R3,NUMTRY                                            02082000
  2093.          L         R15,=A(RPAR)        Our paramters to send [5]        02083000
  2094.          BALR      R14,R15                                              02084000
  2095.          ST        R15,LSDAT           Size of packet [5]               02085000
  2096.          MVI       STYPE,AS            PACKET TYPE = SEND INITIATE      02086000
  2097.          MVC       CURCHK(1),CHKLEN    Save desired value [8]           02087000
  2098.          MVI       CHKLEN,X'01'        Init uses 1 char chksum [8]      02088000
  2099.          L         R15,=A(SPACK)       GET ADDRESS OF ROUTINE 'SPACK'   02089000
  2100.          BALR      R14,R15             SAVE * AND GO TO SPACK           02090000
  2101.          CLI       STATE,C'A'                                           02091000
  2102.          BE        ABORT                                                02092000
  2103.          L         15,=A(RPACK)        GET ADDRESS OF 'RPACK'           02093000
  2104.          BALR      R14,R15             SAVE * AND GO TO RPACK           02094000
  2105.          MVC       CHKLEN(1),CURCHK    Restore desired chksum [8]       02095000
  2106.          CLI       RTYPE,AE            ERROR PACKET?                    02096000
  2107.          BNE       Y1                  NO, THEN MAYBE AN ACK            02097000
  2108.          MVI       ERRNUM,X'0A'        MICRO DIED                       02098000
  2109.          MVI       STATE,C'A'          AND DIE                          02099000
  2110.          B         SLOOP                                                02100000
  2111. Y1       CLI       RTYPE,AY            SEE IF GOT ACK                   02101000
  2112.          BNE       N1                  MAYBE IT'S 'N'                   02102000
  2113.          CLC       SPKNUM,RPKNUM       CHECK MESSAGE NUMBERS            02103000
  2114.          BE        AOK1                                                 02104000
  2115.          MVI       ERRNUM,X'08'        PACKET LOST                      02105000
  2116.          B         SLOOP                                                02106000
  2117. AOK1     L         R5,LRDAT            Number of pieces of data [5]     02107000
  2118.          L         R15,=A(SPAR)                                         02108000
  2119.          BALR      R14,R15             Read data from other host [5]    02109000
  2120.          L         R15,=A(PACKLEN)     Get max send packet size [5]     02110000
  2121.          BALR      R14,R15                                              02111000
  2122. NOCHG    MVI       STATE,C'F'          PUT INTO SEND FILE STATE         02112000
  2123.          XC        NUMTRY,NUMTRY       RESET TO ZERO                    02113000
  2124.          L         R3,SPKNUM                                            02114000
  2125.          LA        R3,1(R3)            ADD ONE                          02115000
  2126.          ST        R3,SPKNUM           STORE VALUE INCREMENTED BY 1     02116000
  2127.          NC        SPKNUM(4),=X'0000003F'   MASK TO GET MOD 64          02117000
  2128.          B         SLOOP                                                02118000
  2129. N1       CLI       RTYPE,AN            SEE IF IT'S 'N'                  02119000
  2130.          BNE       AB1                 IF NOT, DIE                      02120000
  2131.          TM        FLAGS,FLG4          DID MICRO NAK OR I REJECTED?     02121000
  2132.          BO        SLOOP               LEAVE ERR MSG AS IS IF I DID     02122000
  2133.          MVI       ERRNUM,X'09'        MICRO NAK'ED                     02123000
  2134.          B         SLOOP                                                02124000
  2135. AB1      MVI       STATE,C'A'          ELSE, ABORT                      02125000
  2136.          CLI       ERRNUM,S1ERRNUM     Was it a S/1 I/O error [12]      02126000
  2137.          BE        SLOOP               Yes just return [12]             02127000
  2138.          MVI       ERRNUM,X'07'        UNRECOGNIZED PACKET TYPE         02128000
  2139.          B         SLOOP                                                02129000
  2140. SFILE    CLC       NUMTRY,MAXTRY       EXCEEDED NO. OF TRIES ALLOWED?   02130000
  2141.          BL        OK2                 NOPE, STILL OK                   02131000
  2142.          MVI       STATE,C'A'          ABORT IF YES                     02132000
  2143.          B         SLOOP                                                02133000
  2144. OK2      TR        FILNAM,ETOA                                          02134000
  2145.          LA        R4,FILNAM           BEGINNING OF BUFFER              02135000
  2146.          SR        R1,R1                                                02136000
  2147.          TRT       FILNAM(8),PARSE     SEND A DOT INSTEAD OF SPACE      02137000
  2148.          BNZ       SP                                                   02138000
  2149.          L         R4,=F'8'            FUDGE THE LENGTH                 02139000
  2150.          B         SP2                                                  02140000
  2151. SP       SR        R1,R4               WHERE THE TRT STOPPED            02141000
  2152.          LR        R4,R1               HAVE LENGTH OF THE FN            02142000
  2153. SP2      LR        R5,R4               COUNTER FOR LENTH OF FILNAM      02143000
  2154.          BCTR      R4,0                ONE LESS FOR 'EX' COMMAND        02144000
  2155.          L         R7,ABUF             Put FN here for encode [22]      02145000
  2156.          EX        R4,FIRST            PICK UP THE FN                   02146000
  2157.          LA        R4,00(R5,R7)        Put the dot here [22]            02147000
  2158.          MVI       0(R4),X'2E'         ADD AN ASCII DOT                 02148000
  2159.          LA        R5,1(R5)            ADD ONE TO COUNTER               02149000
  2160.          LA        R4,FILNAM                                            02150000
  2161.          LA        R4,8(R4)            NEXT AREA OF THE FILNAM          02151000
  2162.          SR        R1,R1                                                02152000
  2163.          TRT       FILNAM+8(8),PARSE                                    02153000
  2164.          BNZ       SP3                                                  02154000
  2165.          L         R4,=F'8'            FUDGE THE LENGTH                 02155000
  2166.          B         SP4                                                  02156000
  2167. SP3      SR        R1,R4                                                02157000
  2168.          LR        R4,R1               WHERE WE STOPPED                 02158000
  2169. SP4      L         R7,ABUF             Where to put FT [22]             02159000
  2170.          LA        R7,00(R5,R7)        Next free spot [22]              02160000
  2171.          AR        R5,R4               LENGTH OF NAME WITH DOT          02161000
  2172.          BCTR      R4,0                MINUS ONE FOR THE 'EX'           02162000
  2173.          EX        R4,SECOND           PICK UP FT                       02163000
  2174.          L         R3,NUMTRY                                            02164000
  2175.          LA        R3,1(R3)            INCREMENT TRIAL COUNTER          02165000
  2176.          ST        R3,NUMTRY                                            02166000
  2177.          MVI       STYPE,AF            PACKET TYPE = FILE HEADER        02167000
  2178.          ST        R5,LSDAT            SET BUFFER SIZE                  02168000
  2179.          TR        FILNAM,ATOE                                          02169000
  2180.          L         R3,NFSENT                                            02170000
  2181.          LR        R4,R3               SAVE VALUE                       02171000
  2182.          C         R4,=F'10'           NEED MORE SPACE?                 02172000
  2183.          BE        ADDSP                                                02173000
  2184.          BH        ADDSP2                                               02174000
  2185.          M         R2,=F'16'           GET OFFSET INTO TABLE            02175000
  2186.          LA        R3,FSENT(R3)        POINTER INTO TABLE               02176000
  2187.          MVC       0(16,R3),FILNAM     SAVE FILENAME YOU'RE SENDING     02177000
  2188.          LA        R4,1(R4)            INCREMENT NUMBER OF FILES SENT   02178000
  2189.          ST        R4,NFSENT                                            02179000
  2190.          B         SNDFIL                                               02180000
  2191. ADDSP    LA        R0,4096/8           GET 4K BLOCK                     02181000
  2192.          DMSFREE   DWORDS=(0),ERR=ERRSP,MSG=NO                          02182000
  2193.          ST        R1,STORLOC          POINTS TO EXTRA DATA AREA        02183000
  2194.          OI        FLAGS,FLG5          GOT MORE SPACE (TURN ON FLAG)    02184000
  2195. ADDSP2   LR        R3,R4               GET CORRECT LENGTH AGAIN         02185000
  2196.          S         R3,=F'10'           GET PROPER POINTER               02186000
  2197.          M         R2,=F'16'           OFFSET INTO TABLE                02187000
  2198.          A         R3,STORLOC          LOC IN TABLE                     02188000
  2199.          MVC       0(16,R3),FILNAM     SAVE FILENAME                    02189000
  2200.          LA        R4,1(R4)            INCREMENT FILE COUNTER           02190000
  2201.          ST        R4,NFSENT                                            02191000
  2202.          B         SNDFIL                                               02192000
  2203. ERRSP    MVI       ERRNUM,X'10'        ERR ALLOCATING MORE SPACE        02193000
  2204.          MVI       STATE,C'A'          ABORT NOW                        02194000
  2205.          B         SLOOP                                                02195000
  2206. SNDFIL   XC        INBFPT,INBFPT       Input buffer offset [22 start]   02196000
  2207.          MVC       RECL,LSDAT          Input buffer length              02197000
  2208.          L         R2,=A(NULREF)       Null refill routine              02198000
  2209.          ST        R2,MORENC                                            02199000
  2210.          L         R15,=A(ENCODE)                                       02200000
  2211.          BALR      R14,R15             Encode fn [22 end]               02201000
  2212.          L         R15,=A(SPACK)       GET ADDRESS OF 'SPACK'           02202000
  2213.          BALR      14,15               SAVE * AND GO TO SPACK           02203000
  2214.          CLI       STATE,C'A'                                           02204000
  2215.          BE        ABORT                                                02205000
  2216.          L         15,=A(RPACK)        GET ADDRESS OF 'RPACK'           02206000
  2217.          BALR      14,15               SAVE * AND GO TO RPACK           02207000
  2218.          CLI       RTYPE,AE            ERROR PACKET?                    02208000
  2219.          BNE       Y2                  MAYBE AN ACK                     02209000
  2220.          MVI       ERRNUM,X'0A'        MICRO DIED                       02210000
  2221.          MVI       STATE,C'A'          SO WE DO TOO                     02211000
  2222.          B         SLOOP                                                02212000
  2223. Y2       CLI       RTYPE,AY            SEE IF GOT ACK                   02213000
  2224.          BNE       N2                  MAYBE GOT AN 'N'                 02214000
  2225.          CLC       SPKNUM,RPKNUM       DO WE HAVE THE CORRECT ACK?      02215000
  2226.          BE        AOK2                                                 02216000
  2227.          MVI       ERRNUM,X'08'        MISSING A PACKET SOMEWHERE       02217000
  2228.          B         SLOOP                                                02218000
  2229. AOK2     XC        NUMTRY,NUMTRY       RESET COUNTER                    02219000
  2230.          L         R3,SPKNUM                                            02220000
  2231.          LA        R3,1(R3)            ADD ONE                          02221000
  2232.          ST        R3,SPKNUM           STORE INCREMENTED VALUE          02222000
  2233.          NC        SPKNUM(4),=X'0000003F'   MASK TO GET MOD 64          02223000
  2234.          LA        R3,FILNAM           GET ADDRESS OF 'FILNAM' [4]      02224000
  2235.          FSOPEN    (R3),FORM=E         OPEN FILE FOR I/O [4]            02225000
  2236.          NI        FLAGS,X'FF'-FLG3    No data in input buffer [4]      02226000
  2237.          NI        FLAGS,X'FF'-FLG7    Not end of file yet [4]          02227000
  2238.          XC        LSDAT,LSDAT         No data in output buffer [4]     02228000
  2239.          L         15,=A(GTCHR)        GET A BUFFER FULL OF DATA        02229000
  2240.          BALR      14,15               DO GET-CHAR AND COME BACK        02230000
  2241.          MVI       STATE,C'D'          Send data state [4]              02231000
  2242.          C         R15,ZERO            Test the return code [4]         02232000
  2243.          BE        SLOOP               Successful return code [4]       02233000
  2244.          MVI       STATE,C'A'          Abort [4]                        02234000
  2245.          BH        SLOOP               Got read error - fail [4]        02235000
  2246.          MVI       STATE,C'Z'          Send end-of-file state [4]       02236000
  2247.          CLC       LSDAT,ZERO          Any data to send [4]             02237000
  2248.          BE        SLOOP               No, goto eof state [4]           02238000
  2249.          MVI       STATE,C'D'          Send the last packet [4]         02239000
  2250.          B         SLOOP                                                02240000
  2251. N2       CLI       RTYPE,AN                                             02241000
  2252.          BNE       AB2                 ELSE, DIE                        02242000
  2253.          TM        FLAGS,FLG4          DID MICRO NAK OR I REJECTED?     02243000
  2254.          BO        SLOOP               LEAVE ERR MSG AS IS IF I DID     02244000
  2255.          MVI       ERRNUM,X'09'        MICRO NAK'ED                     02245000
  2256.          B         SLOOP                                                02246000
  2257. AB2      MVI       STATE,C'A'          ELSE, ABORT                      02247000
  2258.          CLI       ERRNUM,S1ERRNUM     Was it a S/1 I/O error [12]      02248000
  2259.          BE        SLOOP               Yes just return [12]             02249000
  2260.          MVI       ERRNUM,X'07'        UNRECOGNIZED PACKET TYPE         02250000
  2261.          B         SLOOP                                                02251000
  2262. SDATA    CLC       NUMTRY,MAXTRY       CAN WE DO IT?                    02252000
  2263.          BL        OK4                 YES                              02253000
  2264.          MVI       STATE,C'A'          ELSE ABORT                       02254000
  2265.          B         SLOOP                                                02255000
  2266. OK4      L         R3,NUMTRY                                            02256000
  2267.          LA        R3,1(R3)            INCREMENT COUNTER                02257000
  2268.          ST        R3,NUMTRY                                            02258000
  2269.          MVI       STYPE,AD            PACKET TYPE = DATA               02259000
  2270.          L         R15,=A(SPACK)                                        02260000
  2271.          BALR      14,15               GO TO SPACK AND RETURN           02261000
  2272.          CLI       STATE,C'A'                                           02262000
  2273.          BE        ABORT                                                02263000
  2274.          L         15,=A(RPACK)                                         02264000
  2275.          BALR      14,15               SAME FOR RPACK                   02265000
  2276.          CLI       RTYPE,AE            ERROR PACKET?                    02266000
  2277.          BNE       Y4                  MAYBE AN ACK                     02267000
  2278.          MVI       ERRNUM,X'0A'        MICRO DIED                       02268000
  2279.          MVI       STATE,C'A'          SO WE DO TOO                     02269000
  2280.          B         SLOOP                                                02270000
  2281. Y4       CLI       RTYPE,AY            SEE IF GOT 'ACK'                 02271000
  2282.          BNE       N4                  SEE IF IT'S AN 'N'               02272000
  2283.          CLC       SPKNUM,RPKNUM       DO WE HAVE THE CORRECT ACK?      02273000
  2284.          BE        AOK4                                                 02274000
  2285.          MVI       ERRNUM,X'08'        MISSING A PACKET                 02275000
  2286.          B         SLOOP                                                02276000
  2287. AOK4     XC        NUMTRY,NUMTRY       RESET COUNTER                    02277000
  2288.          L         R3,SPKNUM                                            02278000
  2289.          LA        R3,1(R3)            INCREMENT COUNTER                02279000
  2290.          ST        R3,SPKNUM                                            02280000
  2291.          NC        SPKNUM(4),=X'0000003F'   MASK TO GET MOD 64          02281000
  2292.          CLC       LRDAT,ONE           Data in ack? [16]                02282000
  2293.          BNE       BOK4                No just go on [16]               02283000
  2294.          LA        R3,RDAT             Point to data [16]               02284000
  2295.          CLI       0(R3),AX            Abort sending file [16]          02285000
  2296.          BE        SDAB                Yes [16]                         02286000
  2297.          CLI       0(R3),AZ            Abort sending group [16]         02287000
  2298.          BNE       BOK4                No just ignore [16]              02288000
  2299. SDAB     MVC       CXZ(1),0(R3)        Pick up data [16]                02289000
  2300.          LA        R3,FILNAM           File we're sending [16]          02290000
  2301.          FSCLOSE   (R3)                Close it [16]                    02291000
  2302.          MVI       STATE,C'Z'          Go send end of file [16]         02292000
  2303.          MVI       ERRNUM,X'16'        Send cancelled [16]              02293000
  2304.          B         SLOOP               And continue [16]                02294000
  2305. BOK4     L         15,=A(GTCHR)        Get next buffer [16]             02295000
  2306.          BALR      14,15                                                02296000
  2307.          C         R15,ZERO            Test the return code [4]         02297000
  2308.          BE        SLOOP               Successful return code [4]       02298000
  2309.          MVI       STATE,C'A'          Abort [4]                        02299000
  2310.          BH        SLOOP               Got read error - fail [4]        02300000
  2311.          MVI       STATE,C'Z'          Send end-of-file state [4]       02301000
  2312.          CLC       LSDAT,ZERO          Any data to send [4]             02302000
  2313.          BE        SLOOP               No, goto eof state [4]           02303000
  2314.          MVI       STATE,C'D'          Send the last packet [4]         02304000
  2315.          B         SLOOP                                                02305000
  2316. N4       CLI       RTYPE,AN                                             02306000
  2317.          BNE       AB4                                                  02307000
  2318.          TM        FLAGS,FLG4          DID MICRO NAK OR I REJECTED?     02308000
  2319.          BO        SLOOP               LEAVE ERR MSG AS IS IF I DID     02309000
  2320.          MVI       ERRNUM,X'09'        MICRO NAK'ED                     02310000
  2321.          B         SLOOP                                                02311000
  2322. AB4      MVI       STATE,C'A'                                           02312000
  2323.          CLI       ERRNUM,S1ERRNUM     Was it a S/1 I/O error [12]      02313000
  2324.          BE        SLOOP               Yes just return [12]             02314000
  2325.          MVI       ERRNUM,X'07'        ILLEGAL PACKET TYPE              02315000
  2326.          B         SLOOP                                                02316000
  2327. SEOF     CLC       NUMTRY,MAXTRY       CAN WE DO IT?                    02317000
  2328.          BL        OK5                 BRANCH IF YES                    02318000
  2329.          MVI       STATE,C'A'          ABORT IF NO                      02319000
  2330.          B         SLOOP                                                02320000
  2331. OK5      L         R3,NUMTRY                                            02321000
  2332.          LA        R3,1(R3)            ADD ONE                          02322000
  2333.          ST        R3,NUMTRY           STORE INCREMENTED COUNTER        02323000
  2334.          MVI       STYPE,AZ            PACKET TYPE = EOF                02324000
  2335.          XC        LSDAT,LSDAT         LENGTH OF ZERO                   02325000
  2336.          L         R15,=A(SPACK)                                        02326000
  2337.          BALR      14,15               SAVE * AND GO TO SPACK           02327000
  2338.          CLI       STATE,C'A'                                           02328000
  2339.          BE        ABORT                                                02329000
  2340.          L         15,=A(RPACK)                                         02330000
  2341.          BALR      14,15               SAME FOR RPACK                   02331000
  2342.          CLI       RTYPE,AE            ERROR PACKET?                    02332000
  2343.          BNE       Y5                  MAYBE AN ACK                     02333000
  2344.          MVI       ERRNUM,X'0A'        MICRO DIED                       02334000
  2345.          MVI       STATE,C'A'          SO WE DO TOO                     02335000
  2346.          B         SLOOP                                                02336000
  2347. Y5       CLI       RTYPE,AY            CHECK FOR 'ACK'                  02337000
  2348.          BNE       N5                  MAYBE WAS A 'NAK'                02338000
  2349.          CLC       SPKNUM,RPKNUM       CORRECT ACK?                     02339000
  2350.          BE        AOK5                                                 02340000
  2351.          MVI       ERRNUM,X'08'        LOST A PACKET                    02341000
  2352.          B         SLOOP                                                02342000
  2353. AOK5     L         R3,SPKNUM                                            02343000
  2354.          LA        R3,1(R3)            ADD ONE                          02344000
  2355.          ST        R3,SPKNUM           STORE VALUE INCREMENTED BY 1     02345000
  2356.          NC        SPKNUM(4),=X'0000003F'   MASK TO GET MOD 64          02346000
  2357.          MVI       STATE,C'F'          SET TO SEND FILE FOR NOW         02347000
  2358.          B         NXTFIL              GET-NEXT-FILE                    02348000
  2359. NOFIND   TM        FLAGS,FLG1          DID IT DIE ON FIRST TRY?         02349000
  2360.          BNO       DIEOK               NO ONES == NOT FIRST             02350000
  2361.          MVI       STATE,C'A'          ABORT THIS ONE                   02351000
  2362.          TM        LFLAGS,SERVON       Are we a server [13]             02352000
  2363.          BO        NOF2                Yes handle differently [13]      02353000
  2364.          WRTERM    'File not found'                                     02354000
  2365.          B         SLOOP                                                02355000
  2366. NOF2     NI        FLAGS,X'FF'-FLG1    Clear first file status [13]     02356000
  2367.          MVI       ERRNUM,X'15'        Set msg for error packet [13]    02357000
  2368.          B         SLOOP               And go abort now [13]            02358000
  2369. DIEOK    MVI       STATE,C'B'          BREAK CONNECTION                 02359000
  2370.          B         SLOOP                                                02360000
  2371. N5       CLI       RTYPE,AN                                             02361000
  2372.          BNE       AB5                 DIE IF NOT A NAK                 02362000
  2373.          TM        FLAGS,FLG4          DID MICRO NAK OR I REJECTED?     02363000
  2374.          BO        SLOOP               LEAVE ERR MSG AS IS IF I DID     02364000
  2375.          MVI       ERRNUM,X'09'        MICRO NAK'ED                     02365000
  2376.          B         SLOOP                                                02366000
  2377. AB5      MVI       STATE,C'A'          ELSE, ABORT                      02367000
  2378.          CLI       ERRNUM,S1ERRNUM     Was it a S/1 I/O error [12]      02368000
  2379.          BE        SLOOP               Yes just return [12]             02369000
  2380.          MVI       ERRNUM,X'07'        UNRECOGNIZED PACKET TYPE         02370000
  2381.          B         SLOOP                                                02371000
  2382. SBREAK   CLC       NUMTRY,MAXTRY       OVER OUR LIMIT?                  02372000
  2383.          BL        OK6                 BRANCH IF NO                     02373000
  2384.          MVI       STATE,C'A'          ABORT IF YES                     02374000
  2385.          B         SLOOP                                                02375000
  2386. OK6      L         R3,NUMTRY                                            02376000
  2387.          LA        R3,1(R3)            ADD ONE                          02377000
  2388.          ST        R3,NUMTRY           INCREMEMTED TRIAL COUNTER        02378000
  2389.          MVI       STYPE,AB            PACKET TYPE = BREAK              02379000
  2390.          XC        LSDAT,LSDAT         LENGTH = ZERO                    02380000
  2391.          L         R15,=A(SPACK)                                        02381000
  2392.          BALR      14,15               SAVE * AND GO TO SPACK           02382000
  2393.          CLI       STATE,C'A'                                           02383000
  2394.          BE        ABORT                                                02384000
  2395.          L         15,=A(RPACK)                                         02385000
  2396.          BALR      14,15               SAVE * AND GO TO RPACK           02386000
  2397.          CLI       RTYPE,AE            ERROR PACKET?                    02387000
  2398.          BNE       Y6                  MAYBE AN ACK                     02388000
  2399.          MVI       ERRNUM,X'0A'        MICRO DIED                       02389000
  2400.          MVI       STATE,C'A'          THEN WE DO TOO                   02390000
  2401.          B         SLOOP                                                02391000
  2402. Y6       CLI       RTYPE,AY            CHECK FOR ACK                    02392000
  2403.          BNE       N6                  CHECK FOR 'N'                    02393000
  2404.          CLC       SPKNUM,RPKNUM       CORRECT ACK?                     02394000
  2405.          BE        AOK6                                                 02395000
  2406.          MVI       ERRNUM,X'08'        LOST A PACKET                    02396000
  2407.          B         SLOOP                                                02397000
  2408. AOK6     MVI       STATE,C'C'          COMPLETED STATE                  02398000
  2409.          CLI       CXZ,X'00'           Other guy stop x-fer? [16]       02399000
  2410.          BE        SLOOP               No end OK [16]                   02400000
  2411.          MVI       STATE,C'A'          Remember error [16]              02401000
  2412.          B         SLOOP                                                02402000
  2413. N6       CLI       RTYPE,AN            CHECK FOR 'N'                    02403000
  2414.          BNE       AB6                 DIE IF NOT A NAK                 02404000
  2415.          TM        FLAGS,FLG4          DID MICRO NAK OR I REJECTED?     02405000
  2416.          BO        SLOOP               LEAVE ERR MSG AS IS IF I DID     02406000
  2417.          MVI       ERRNUM,X'09'        MICRO NAK'ED                     02407000
  2418.          B         SLOOP                                                02408000
  2419. AB6      MVI       STATE,C'A'          ELSE,ABORT                       02409000
  2420.          CLI       ERRNUM,S1ERRNUM     Was it a S/1 I/O error [12]      02410000
  2421.          BE        SLOOP               Yes just return [12]             02411000
  2422.          MVI       ERRNUM,X'07'        UNRECOGNIZED PACKET TYPE         02412000
  2423.          B         SLOOP                                                02413000
  2424. *                                                                       02414000
  2425. ABORT    LA        R3,FILNAM                                            02415000
  2426.          FSCLOSE   (R3)                CLOSE THE FILE                   02416000
  2427.          TM        FLAGS,FLG1          DYING ON FILE-NOT-FOUND?         02417000
  2428.          BO        NOERRP              IF SO, THEN NO ERROR PACKET      02418000
  2429.          CLI       ERRNUM,X'0A'        DID THE MICRO DIE?               02419000
  2430.          BE        NOERRP              NO ERROR PACKET IF SO            02420000
  2431.          CLI       ERRNUM,X'16'        Other side cancel send [16]      02421000
  2432.          BE        NOERRP              Yes no error packet [16]         02422000
  2433. * At least try to send an error packet.                                 02423000
  2434. *        CLI       ERRNUM,S1ERRNUM     Was it a S/1 I/O error [12]      02424000
  2435. *        BE        NOERRP              No error packet if yes [12]      02425000
  2436.          L         R15,=A(ERRPACK)     Send error packet [13]           02426000
  2437.          BALR      R14,R15             Error number in ERRNUM [13]      02427000
  2438. NOERRP   LA        R15,4               SET NON-ZERO RETCODE             02428000
  2439.          B         SENDRET             PREPARE TO LEAVE                 02429000
  2440. COMPLETE SR        R15,R15             ZERO WILL BE RETCODE             02430000
  2441. SENDRET  TM        S1FLAGS,ISS1        Is console a S/1? [12]           02431000
  2442.          BZ        SENDRT2             No skip reset [12]               02432000
  2443.          TM        LFLAGS,SERVON       In server mode? [13]             02433000
  2444.          BO        SENDRT2             Yes don't reset yet [13]         02434000
  2445.          LR        R2,R15              Save retcode [12]                02435000
  2446.          SR        R1,R1               Clear interrupt trapping [12]    02436000
  2447.          L         R15,=A(INTRINI)     [12]                             02437000
  2448.          BALR      R14,R15             [12]                             02438000
  2449.          LR        R15,R2              Restore retcode [12]             02439000
  2450. SENDRT2  L         R13,4(R13)                                           02440000
  2451.          L         R14,12(R13)                                          02441000
  2452.          LM        R0,R12,20(R13)                                       02442000
  2453.          BR        R14                                                  02443000
  2454. SENDSAVE DS        18F                                                  02444000
  2455. PARSE    DC        32X'00'                                              02445000
  2456.          DC        X'01'               STOP ON A SPACE                  02446000
  2457.          DC        223X'00'                                             02447000
  2458. FIRST    MVC       0(0,R7),FILNAM      Pick up the FN [22]              02448000
  2459. SECOND   MVC       0(0,R7),FILNAM+8    PICK UP FT                       02449000
  2460.          LTORG                                                          02450000
  2461.          DROP      R11                                                  02451000
  2462.          DROP      R12                 DON'T NEED THEM ANYMORE          02452000
  2463.          EJECT                                                          02453000
  2464. *                                                                       02454000
  2465. * Rewrite routine to pack as much data into the outgoing packet as      02455000
  2466. * possible (not just a record at a time).  [4]                          02456000
  2467. GTCHR    CSECT                                                          02457000
  2468.          STM       R14,R12,12(R13)     Do standard linkage              02458000
  2469.          BALR      R12,0                                                02459000
  2470.          USING     *,R12                                                02460000
  2471.          LA        R14,GTSAV                                            02461000
  2472.          ST        R13,4(R14)                                           02462000
  2473.          ST        R14,8(R13)                                           02463000
  2474.          LR        R13,R14                                              02464000
  2475. * USE R11 AS BASE REGISTER FOR THE SHARED DATA AREA                     02465000
  2476.          L         R11,=A(PARMS)                                        02466000
  2477.          USING     PARMS,R11                                            02467000
  2478.          L         R2,=A(INBUF)        Routine to call when [22]        02468000
  2479.          ST        R2,MORENC           need to refill on input [22]     02469000
  2480.          TM        FLAGS,FLG3          Does input buffer have data?     02470000
  2481.          BO        GTCH0               One means yes.                   02471000
  2482.          L         R15,=A(INBUF)       Get a buffer full of data.       02472000
  2483.          BALR      R14,R15                                              02473000
  2484.          LTR       R15,R15             OK return code?                  02474000
  2485.          BNZ       GTCH1               No, leave this routine.          02475000
  2486. GTCH0    L         R15,=A(ENCODE)      Encode the data                  02476000
  2487.          BALR      R14,R15                                              02477000
  2488. GTCH1    L         R13,4(R13)          Return to caller                 02478000
  2489.          L         R14,12(R13)                                          02479000
  2490.          LM        R0,R12,20(R13)      Don't change retcode in R15      02480000
  2491.          BR        R14                                                  02481000
  2492. GTSAV    DS        18F                                                  02482000
  2493.          LTORG                                                          02483000
  2494.          EJECT                                                          02484000
  2495. *                                                                       02485000
  2496. * Expects input buffer address in ABUF, writes to SDAT                  02486000
  2497. * R8 - input buffer offset, R9 - output buffer offset,                  02487000
  2498. * R10 - character count, R5 - quote character                           02488000
  2499. * R3 - number of characters allowed in output buffer                    02489000
  2500. * RECL - number of characters in input buffer (set in refill            02490000
  2501. * routine), MORENC has address of refill routine [22]                   02491000
  2502. ENCODE   CSECT                                                          02492000
  2503.          STM       R14,R12,12(R13)     Do standard linkage              02493000
  2504.          BALR      R12,0                                                02494000
  2505.          USING     *,R12                                                02495000
  2506.          LA        R14,ENCSAV                                           02496000
  2507.          ST        R13,4(R14)                                           02497000
  2508.          ST        R14,8(R13)                                           02498000
  2509.          LR        R13,R14                                              02499000
  2510. * USE R11 AS BASE REGISTER FOR THE SHARED DATA AREA                     02500000
  2511.          L         R11,=A(PARMS)                                        02501000
  2512.          USING     PARMS,R11                                            02502000
  2513.          CLC       RECL,ZERO           Any data to encode? [7]          02503000
  2514.          BE        ENCOD6              No just return [7]               02504000
  2515.          MVC       RPTQ(1),ORIGQ       Initialize repeat quote char [7] 02505000
  2516.          MVI       RPTVAL,X'00'        Holds Char to be repeated [7]    02506000
  2517.          MVI       RPTCT,X'01'         Number of repetitions [7]        02507000
  2518.          L         R3,MAXDAT           Max packet size                  02508000
  2519.          LA        R3,1(R3)            Increment for BCT instruction    02509000
  2520.          SR        R9,R9               Initialize output buffer pointer 02510000
  2521.          SR        R10,R10             Ditto for character count        02511000
  2522.          SR        R5,R5               Will hold quote char             02512000
  2523.          IC        R5,RQUOTE                                            02513000
  2524.          L         R8,INBFPT           Where we left off                02514000
  2525. ENCOD0   BCTR      R3,0                Decr free space in output buffer 02515000
  2526.          LTR       R3,R3               Room left?                       02516000
  2527.          BP        ENCOD1              Yes keep going                   02517000
  2528.          ST        R8,INBFPT           No, so save input buffer pointer 02518000
  2529.          STC       R10,LSDAT+3         Save char count                  02519000
  2530.          OI        FLAGS,FLG3          Stuff in input buffer            02520000
  2531.          SR        R15,R15             OK retcode                       02521000
  2532.          B         ENCOD6                                               02522000
  2533. * Room in output buffer.  Now check if there's data in input buffer.    02523000
  2534. ENCOD1   C         R8,RECL             Any more input data?             02524000
  2535.          BL        ENCOD2              Yes go add to buffer             02525000
  2536. *        L         R15,=A(INBUF)       No, get more data [22]           02526000
  2537.          L         R15,MORENC          No, get more data [22]           02527000
  2538.          BALR      R14,R15                                              02528000
  2539.          L         R8,INBFPT           Input buffer pointer             02529000
  2540.          LTR       R15,R15             OK return code?                  02530000
  2541.          BZ        ENCOD2              Yes, there's more input          02531000
  2542.          STC       R10,LSDAT+3         Else, remember char count        02532000
  2543.          XC        INBFPT,INBFPT       Reset input buffer pointer       02533000
  2544.          NI        FLAGS,X'FF'-FLG3    No more data in input buffer     02534000
  2545.          B         ENCOD6                                               02535000
  2546. * Input data exists.  Add to buffer.                                    02536000
  2547. ENCOD2   SR        R7,R7                                                02537000
  2548.          L         R1,ABUF             ADDR OF BUFFER [2]               02538000
  2549.          AR        R1,R8               PLUS DISPLACEMENT [2]            02539000
  2550.          IC        R7,0(R1)            PICK UP BYTE [2]                 02540000
  2551.          CLI       RPTQ,X'00'          Doing repeat quoting [7]         02541000
  2552.          BE        ENCOD23             No so skip this part [7]         02542000
  2553.          L         R6,RECL             Get length of input record [7]   02543000
  2554.          SR        R6,R8               Minus chars processed [7]        02544000
  2555.          C         R6,ONE              On last piece of input [7]       02545000
  2556.          BE        ENCOD21             Yes so write it out [7]          02546000
  2557.          CLI       RPTCT,X'5E'         Max that can rep in a byte [7]   02547000
  2558.          BE        ENCOD21             Then that's it [7]               02548000
  2559.          CLM       R7,B'0001',1(R1)    Current & next chars equal? [7]  02549000
  2560.          BNE       ENCOD21             No go write out chars [7]        02550000
  2561.          SR        R6,R6               Zero it out [7]                  02551000
  2562.          IC        R6,RPTCT            Number of times char appears [7] 02552000
  2563.          LA        R6,1(R6)            Increment it [7]                 02553000
  2564.          STC       R6,RPTCT            Remember number of repeats [7]   02554000
  2565.          STC       R7,RPTVAL           Remember repeated char [7]       02555000
  2566.          LA        R3,1(R3)            Adjust output pointer [7]        02556000
  2567.          LA        R8,1(R8)            Bump input pointer [7]           02557000
  2568.          B         ENCOD0              And get more data [7]            02558000
  2569. ENCOD21  CLI       RPTCT,X'01'         Were previous chars repeats [7]  02559000
  2570.          BE        ENCOD23             No so just add this char [7]     02560000
  2571.          CLI       RPTCT,RPTMIN        Within bounds for prefixing [7]  02561000
  2572.          BNL       ENCOD22             Yes, use repeat prefixing [7]    02562000
  2573.          SR        R6,R6               Blank it out [7]                 02563000
  2574.          IC        R6,RPTCT            Not enough chars for repeats [7] 02564000
  2575.          SR        R8,R6               Adjust input buffer pointer [7]  02565000
  2576.          LA        R8,1(R8)            Don't get prev char again [7]    02566000
  2577.          LA        R3,1(R3)            Adjust output buffer counter [7] 02567000
  2578.          MVI       RPTVAL,X'00'        Clear out repeated char [7]      02568000
  2579.          MVC       ORIGQ(1),RPTQ       Save repeat quote char here [7]  02569000
  2580.          MVI       RPTQ,X'00'          Pretend not doing prefixing [7]  02570000
  2581.          B         ENCOD0              Reprocess the data [7]           02571000
  2582. ENCOD22  IC        R6,RPTQ             Get the repeat prefix [7]        02572000
  2583.          STC       R6,SDAT(R9)         Add to output buffer [7]         02573000
  2584.          LA        R9,1(R9)            Bump output pointer [7]          02574000
  2585.          LA        R10,1(R10)          Increment char count [7]         02575000
  2586.          BCTR      R3,0                Decrement for size [7]           02576000
  2587.          IC        R6,RPTCT            Size of repeated sequence [7]    02577000
  2588.          A         R6,=F'32'           Add space to make printable [7]  02578000
  2589.          STC       R6,SDAT(R9)         Add size to output buffer [7]    02579000
  2590.          LA        R9,1(R9)            Bump output pointer [7]          02580000
  2591.          LA        R10,1(R10)          Increment char count [7]         02581000
  2592.          BCTR      R3,0                Decrement for char itself [7]    02582000
  2593.          MVI       RPTCT,X'01'         Reset repeat count [7]           02583000
  2594.          MVI       RPTVAL,X'00'        And this [7]                     02584000
  2595. ENCOD23  CLI       EBQUOT,AN           DOING 8-BIT QUOTING? [1 START]   02585000
  2596.          BE        ENCOD3              NOPE, SO IGNORE                  02586000
  2597.          CLI       EBQUOT,AY           CAN DO IT BUT AREN'T?            02587000
  2598.          BE        ENCOD3              YUP                              02588000
  2599.          LR        R6,R7               SAVE CHAR HERE                   02589000
  2600.          N         R6,=X'0000007F'     GET CHAR WITHOUT PARITY          02590000
  2601.          N         R7,=X'00000080'     ISOLATE PARITY                   02591000
  2602.          LR        R7,R6               RESET REGISTER                   02592000
  2603.          BZ        ENCOD3              DON'T NEED 8-BIT QUOTING         02593000
  2604.          LA        R4,SDAT(R9)         WHERE CHAR IS GOING              02594000
  2605.          MVC       0(1,R4),EBQUOT      Add 8-bit quote char to buffer   02595000
  2606.          LA        R9,1(R9)            INCR POINTER IN OUTPUT BUFFER    02596000
  2607.          LA        R10,1(R10)          Incr char count                  02597000
  2608.          BCTR      R3,0                For 8-bit quote char [1 END]     02598000
  2609. ENCOD3   C         R7,SPACE            Is it a control character?       02599000
  2610.          BL        ENCOD5              Yes quote it and translate       02600000
  2611.          C         R7,DEL              Is it a delete?                  02601000
  2612.          BE        ENCOD5              Yes quote it and translate       02602000
  2613.          CR        R7,R5               Is it the quote character?       02603000
  2614.          BE        ENCOD51             Yes quote it                     02604000
  2615.          CLI       EBQUOT,AN           Doing 8-bit quoting [1 START]    02605000
  2616.          BE        ENCOD4              No how about repeat prefixing    02606000
  2617.          CLI       EBQUOT,AY           Same question                    02607000
  2618.          BE        ENCOD4              Not doing quoting                02608000
  2619.          CLM       R7,B'0001',EBQUOT   Is char the 8-bit quote char?    02609000
  2620.          BE        ENCOD51             Yes output w/quote char [1 END]  02610000
  2621. ENCOD4   CLI       ORIGQ,X'00'         Doing repeat prefixing [7]       02611000
  2622.          BE        ENCOD52             No check for quote char [7]      02612000
  2623.          CLM       R7,B'0001',ORIGQ    Is char repeat quote char [7]    02613000
  2624.          BE        ENCOD51             Yes then quote it [7]            02614000
  2625.          B         ENCOD52             Else don't quote it [7]          02615000
  2626. ENCOD5   A         R7,O1H              Add 64 to char                   02616000
  2627.          N         R7,=X'0000007F'     Get MOD 127                      02617000
  2628. ENCOD51  LA        R4,SDAT(R9)         Next spot in output buffer [7]   02618000
  2629.          MVC       0(1,R4),RQUOTE      Add quote char [7]               02619000
  2630.          LA        R9,1(R9)            Increment output buffer pointer  02620000
  2631.          LA        R10,1(R10)          Increment character counter      02621000
  2632.          BCTR      R3,0                Less space in output buffer [7]  02622000
  2633. ENCOD52  STC       R7,SDAT(R9)         Add the character                02623000
  2634.          LA        R9,1(R9)            Increment output buffer pointer  02624000
  2635.          LA        R8,1(R8)            Increment input buffer pointer   02625000
  2636.          LA        R10,1(R10)          Increment character counter      02626000
  2637.          CLI       RPTCT,X'01'         One occurence of char [7]        02627000
  2638.          BNE       ENCOD53             No there's more [7]              02628000
  2639.          MVC       RPTQ(1),ORIGQ       Restore repeat prefix [7]        02629000
  2640.          B         ENCOD0              Get more data                    02630000
  2641. ENCOD53  SR        R6,R6               Zero out for increment [7]       02631000
  2642.          IC        R6,RPTCT            Number of repetitions [7]        02632000
  2643.          BCTR      R6,0                Decrement number left to do [7]  02633000
  2644.          STC       R6,RPTCT            Store here [7]                   02634000
  2645.          B         ENCOD0              Add char again [7]               02635000
  2646. ENCOD6   L         R13,4(R13)                                           02636000
  2647.          L         R14,12(R13)                                          02637000
  2648.          LM        R0,R12,20(R13)      Don't change retcode in R15      02638000
  2649.          BR        R14                                                  02639000
  2650. NULREF   SR        R2,R2               [22 start]                       02640000
  2651.          BCTR      R2,0                Get -1 here                      02641000
  2652.          ST        R2,INBFPT           Say no more data to encode       02642000
  2653.          LR        R15,R2              Error ret code                   02643000
  2654.          BR        R14                 That's it [22 end]               02644000
  2655. ENCSAV   DS        18F                                                  02645000
  2656.          LTORG                                                          02646000
  2657.          EJECT                                                          02647000
  2658. *                                                                       02648000
  2659. * Read the next line from the input file, and do EBCDIC to ASCII        02649000
  2660. * translation if requested.  [4]                                        02650000
  2661. INBUF    CSECT                                                          02651000
  2662.          STM       R14,R12,12(R13)     Do standard linkage              02652000
  2663.          BALR      R12,0                                                02653000
  2664.          USING     *,R12                                                02654000
  2665.          LA        R14,INBSAV                                           02655000
  2666.          ST        R13,4(R14)                                           02656000
  2667.          ST        R14,8(R13)                                           02657000
  2668.          LR        R13,R14                                              02658000
  2669. * USE R11 AS BASE REGISTER FOR THE SHARED DATA AREA                     02659000
  2670.          L         R11,=A(PARMS)                                        02660000
  2671.          USING     PARMS,R11                                            02661000
  2672.          TM        FLAGS,FLG7          Hit eof yet? [4]                 02662000
  2673.          BNO       INBUFX              If yes, return RC of -1 [4]      02663000
  2674.          L         R15,=F'-1'          Error return code.               02664000
  2675.          XC        LSDAT,LSDAT         No data to send [4]              02665000
  2676.          B         INBUF9                                               02666000
  2677. INBUFX   L         R4,ABUF             READ INTO THIS BUFFER [2]        02667000
  2678.          LA        R3,FILNAM                                            02668000
  2679.          FSREAD    (R3),BUFFER=(R4),BSIZE=65536,FORM=E     [2]          02669000
  2680.          LTR       R4,R15              PUT RESULT OF READ IN R4         02670000
  2681.          BZ        INBUF1                                               02671000
  2682.          FSCLOSE   (R3)                CLOSE FILE                       02672000
  2683.          C         R4,=A(ERCOD)        Did we hit the end of file?      02673000
  2684.          BNE       INBUF0              No, it's something else.         02674000
  2685.          OI        FLAGS,FLG7          Set eof flag [4]                 02675000
  2686.          L         R15,=F'-1'          Error return code.               02676000
  2687.          B         INBUF9                                               02677000
  2688. INBUF0   L         R15,=F'1'           Error return code.               02678000
  2689.          MVI       ERRNUM,X'0C'        INVALID RECORD LENGTH            02679000
  2690.          C         R4,=F'8'            WAS OUR GUESS RIGHT?             02680000
  2691.          BE        INBUF9              IF YES, RETURN                   02681000
  2692.          MVI       ERRNUM,X'0D'        ELSE, GOT AN I/O ERROR           02682000
  2693.          B         INBUF9                                               02683000
  2694. INBUF1   LR        R5,R0               GET NUMBER OF BYTES READ IN      02684000
  2695.          TM        FLAGS,BINF          BINARY FILE X-FER [1]            02685000
  2696.          BO        INBUF8              YES, SKIP TRANSLATION [1]        02686000
  2697.          LTR       R5,R5               Any data at all [4]              02687000
  2698.          BZ        INBUF7              No skip translation [4]          02688000
  2699.          LR        R4,R5               SAVE ALSO IN R4                  02689000
  2700.          LR        R7,R5               AND IN R7 [2]                    02690000
  2701.          L         R3,ABUF             WHERE TRANSLATING STARTS [2]     02691000
  2702. INBUF2   BCTR      R4,0                SUBTRACT 1 FOR EX COMMAND        02692000
  2703.          C         R4,=F'255'          MAX FOR TRANSLATE IS 256 [2]     02693000
  2704.          BL        INBUF3              IF IS UNDER MAX THEN IS OK [2]   02694000
  2705.          LA        R4,255              ELSE, SET TO MAX [2]             02695000
  2706. INBUF3   EX        R4,TRANS            EBCDIC TO ASCII TRANSLATION      02696000
  2707.          C         R7,=F'256'          MORE CHARS LEFT TO X-LATE? [2]   02697000
  2708.          BNH       INBUF4              NOPE, WE'RE DONE [2]             02698000
  2709.          LA        R3,256(R3)          X-LATE NEXT SET OF CHARS [2]     02699000
  2710.          S         R7,=F'256'          DECR CHARS LEFT TO X-LATE [2]    02700000
  2711.          LR        R4,R7               NO. OF CHARS LEFT TO X-LATE [2]  02701000
  2712.          B         INBUF2              TRANSLATE SOME MORE [2]          02702000
  2713. INBUF4   L         R8,ABUF             GET LOC OF BUFFER INPUT [2]      02703000
  2714.          LR        R4,R5               GET BACK ORIG SIZE [2]           02704000
  2715.          BCTR      R4,0                [2]                              02705000
  2716.          L         R9,ABUF             HEAD OF BUFFER [2]               02706000
  2717.          AR        R9,R4               PLUS DISPLACEMENT [2]            02707000
  2718. INBUF5   CLI       0(R9),X'20'         IS THIS A BLANK?                 02708000
  2719.          BNE       INBUF6              NO, FOUND LAST CHAR OF LINE      02709000
  2720.          BCTR      R9,0                                                 02710000
  2721.          CR        R9,R8                                                02711000
  2722.          BNL       INBUF5              FIND LAST CHAR                   02712000
  2723.          SR        R5,R5               ALL BLANKS                       02713000
  2724.          B         INBUF7                                               02714000
  2725. INBUF6   SR        R9,R8                                                02715000
  2726.          LR        R5,R9               LENGTH OF LINE                   02716000
  2727.          LA        R5,1(R5)            Go past last char [2]            02717000
  2728. INBUF7   L         R9,ABUF             BUFFER HEAD [2]                  02718000
  2729.          AR        R9,R5               PLUS DISPLACEMENT [2]            02719000
  2730.          MVC       0(1,R9),=X'0D'      ADD ASCII CR                     02720000
  2731.          LA        R9,1(R9)            INCREMENT POINTER                02721000
  2732.          MVC       0(1,R9),=X'0A'      AND ADD ASCII LF [1]             02722000
  2733.          LA        R5,2(R5)            TWO EXTRA BYTES OF DATA NOW      02723000
  2734. INBUF8   ST        R5,RECL             LRECL + 2 (FOR CRLF)             02724000
  2735.          XC        INBFPT,INBFPT       Zero input buffer pointer        02725000
  2736.          SR        R15,R15             Return code == success           02726000
  2737. INBUF9   L         R13,4(R13)                                           02727000
  2738.          L         R14,12(R13)                                          02728000
  2739.          LM        R0,R12,20(R13)      Don't change retcode in R15      02729000
  2740.          BR        R14                                                  02730000
  2741. INBSAV   DS        18F                                                  02731000
  2742. TRANS    TR        0(0,R3),ETOA        EBCDIC TO ASCII TRANSLATION      02732000
  2743.          LTORG                                                          02733000
  2744.          EJECT                                                          02734000
  2745. * Add support for two character checksum and three character CRC.       02735000
  2746. * Expects input data to be in SDAT buffer.  Registers used: R9 to       02736000
  2747. * calculate the checksum. [8]                                           02737000
  2748. SPACK    CSECT                                                          02738000
  2749.          STM       R14,R12,12(R13)     SAVE CALLER'S REGISTERS          02739000
  2750.          BALR      R12,0               ESTABLISH ADDRESSABILITY         02740000
  2751.          USING     *,R12                                                02741000
  2752.          LA        R14,SPSAVE          ADDRESS OF MY SAVE AREA          02742000
  2753.          ST        R13,4(R14)          SAVE CALLER'S                    02743000
  2754.          ST        R14,8(R13)                                           02744000
  2755.          LR        R13,R14                                              02745000
  2756. * Use R11 as base register for 'PARMS' global data area                 02746000
  2757.          L         R11,=A(PARMS)                                        02747000
  2758.          USING     PARMS,R11           ESTABLISH ADDRESSABILITY         02748000
  2759.          SR        R9,R9               Zero out checksum register       02749000
  2760.          MVI       PHDR,SOH            Add Control-A to packet          02750000
  2761.          CLI       LSDAT+3,SPMAX       Data size below max? [4]         02751000
  2762.          BNH       SPACK0              Yup [4]                          02752000
  2763.          MVI       ERRNUM,X'00'        Data size exceeds max limit      02753000
  2764.          MVI       STATE,C'A'          Abort on this                    02754000
  2765.          B         SPRET                                                02755000
  2766. SPACK0   L         R4,LSDAT            Data size + space + two [8]      02756000
  2767.          A         R4,=F'34'           for packet number and type [8]   02757000
  2768.          SR        R5,R5               Zero for next instruction [8]    02758000
  2769.          IC        R5,CHKLEN           Get checksum length [8]          02759000
  2770.          AR        R4,R5               Account for it in pkt size [8]   02760000
  2771.          STC       R4,PLEN             Add it to packet                 02761000
  2772.          AR        R9,R4               And then add it to checksum      02762000
  2773.          CLC       SPKNUM,ZERO         Check if packet number is valid  02763000
  2774.          BNL       SPACK01             OK if >= to 0                    02764000
  2775.          MVI       ERRNUM,X'01'        Illegal packet number            02765000
  2776.          MVI       STATE,C'A'                                           02766000
  2777.          B         SPRET                                                02767000
  2778. SPACK01  CLC       SPKNUM,O1H          See if is <= octal 100           02768000
  2779.          BNH       SPACK02                                              02769000
  2780.          MVI       ERRNUM,X'01'        Illegal packet number            02770000
  2781.          MVI       STATE,C'A'                                           02771000
  2782.          B         SPRET                                                02772000
  2783. SPACK02  L         R4,SPKNUM           Get packet number                02773000
  2784.          A         R4,SPACE            Add space to make it printable   02774000
  2785.          STC       R4,PNUM             Add to buffer                    02775000
  2786.          AR        R9,R4               And add to checksum              02776000
  2787.          CLI       STYPE,X'41'         ASCII 'A'                        02777000
  2788.          BL        SPACK03             Can't be less than this          02778000
  2789.          CLI       STYPE,X'5A'         ASCII 'Z'                        02779000
  2790.          BNH       SPACK04             Can't be greater                 02780000
  2791. SPACK03  MVI       ERRNUM,X'07'        Illegal packet type              02781000
  2792.          MVI       STATE,C'A'          Die on this                      02782000
  2793.          B         SPRET                                                02783000
  2794. SPACK04  MVC       PTYPE(1),STYPE      Add message type to buffer       02784000
  2795.          SR        R2,R2               Zero it out                      02785000
  2796.          IC        R2,STYPE                                             02786000
  2797.          AR        R9,R2               Add to checksum                  02787000
  2798.          L         R6,LSDAT            How much data                    02788000
  2799.          LTR       R6,R6               Test it out                      02789000
  2800.          BZ        SPACK3                                               02790000
  2801.          SR        R5,R5               Use to get data                  02791000
  2802.          SR        R3,R3               Use to hold data                 02792000
  2803. SPACK1   IC        R3,SDAT(R5)         Pick up char                     02793000
  2804.          AR        R9,R3               Add to checksum                  02794000
  2805.          LA        R5,1(R5)            Bump pointer                     02795000
  2806.          CR        R5,R6               Got all the data yet             02796000
  2807.          BNE       SPACK1              Nope get the rest                02797000
  2808. SPACK2   LR        R7,R6               Munge size here                  02798000
  2809.          BCTR      R7,0                Subtract 1 for EX function       02799000
  2810.          EX        R7,MOVE             Get data to packet in one MOVE   02800000
  2811. SPACK3   LR        R7,R9               Need copy of chksum [8]          02801000
  2812.          CLI       CHKLEN,X'02'        What kind of checksum? [8]       02802000
  2813.          BE        SPACK5              2 char checkum [8]               02803000
  2814.          BH        SPACK4              3 char CRC [8]                   02804000
  2815.          ST        R9,TEMP             Else is one char checksum        02805000
  2816.          N         R9,=X'000000C0'     Get MOD 192                      02806000
  2817.          SRL       R9,6                Shift right by 6                 02807000
  2818.          A         R9,TEMP             Add the two values               02808000
  2819.          N         R9,=X'0000003F'     Get MOD 64 of checksum           02809000
  2820.          A         R9,SPACE            Make printable                   02810000
  2821.          STC       R9,PDATA(R6)        Add to buffer (after data)       02811000
  2822.          B         SPACK6              Go add EOL char                  02812000
  2823. SPACK4   SR        R5,R5               Zero out to get a NULL [8]       02813000
  2824.          STC       R5,PDATA(R6)        Add NULL at end of data [8]      02814000
  2825.          ST        R6,TEMP             Next free spot in buffer [8]     02815000
  2826.          LA        R5,PLEN             Where checksum starts [8]        02816000
  2827.          L         R15,=A(CRCCLC)      Calculate the CRC [8]            02817000
  2828.          BALR      R14,R15             Return CRC in R15 [8]            02818000
  2829.          LR        R7,R15              Keep in here [8]                 02819000
  2830.          LR        R5,R7               Munge value in dif register [8]  02820000
  2831.          N         R5,=X'0000F000'     Get bits 12-15 [8]               02821000
  2832.          SRL       R5,12               Shift right by 12 bits [8]       02822000
  2833.          A         R5,SPACE            Make char printable [8]          02823000
  2834.          L         R6,TEMP             Next free spot in buffer [8]     02824000
  2835.          STC       R5,PDATA(R6)        Add to buffer [8]                02825000
  2836.          LA        R6,1(R6)            Bump output pointer [8]          02826000
  2837. SPACK5   LR        R5,R7               Munge in dif register [8]        02827000
  2838.          N         R5,=X'00000FC0'     Get bits 6-11 [8]                02828000
  2839.          SRL       R5,6                Shift right 6 bits [8]           02829000
  2840.          A         R5,SPACE            Make char printable [8]          02830000
  2841.          STC       R5,PDATA(R6)        Add to buffer [8]                02831000
  2842.          LA        R6,1(R6)            Bump pointer [8]                 02832000
  2843.          N         R7,=X'0000003F'     Get bits 0-5 [8]                 02833000
  2844.          A         R7,SPACE            Make printable [8]               02834000
  2845.          STC       R7,PDATA(R6)        Add to buffer [8]                02835000
  2846. SPACK6   LA        R6,1(R6)            Bump pointer                     02836000
  2847.          IC        R9,SEOL                                              02837000
  2848.          STC       R9,PDATA(R6)        Add send end of packet char      02838000
  2849.          L         R6,LSDAT            Amount of data [8]               02839000
  2850.          A         R6,=F'5'            Control info and EOL char [8]    02840000
  2851.          SR        R5,R5               Zero for next instruction [8]    02841000
  2852.          IC        R5,CHKLEN           Get checksum length [8]          02842000
  2853.          AR        R6,R5               Plus length of checksum          02843000
  2854.          TM        FLAGS,DEBUG         Are we debugging? [14]           02844000
  2855.          BNO       SPACK61             No don't log packet [14]         02845000
  2856.          MVC       INPUT(130),SNDPKT   Munge data here [14]             02846000
  2857.          TR        INPUT(130),ATOE     Log in EBCDIC [14]               02847000
  2858.          FSWRITE   'KER LOG A1',BUFFER=INPUT,BSIZE=(R6),FORM=E,RECFM=V  02848000
  2859. SPACK61  TM        S1FLAGS,ISS1        is console a S/1?  [12 start]    02849000
  2860.          BZ        SENDTTY             no: do normal TTY output         02850000
  2861.          OC        SNDPKT,HIBITS       set hi bit in each char          02851000
  2862.          LA        R7,S1ORDSL(,R6)     incr by len of S/1 orders        02852000
  2863.          STH       R7,S1SDATL          store len in CCW                 02853000
  2864.          LA        R1,S1SCCW           get addr of CCW                  02854000
  2865.          L         R15,=A(SCRNIO)      call routine to output via       02855000
  2866.          BALR      R14,R15             full-screen diagnose             02856000
  2867.          LTR       R15,R15             did it work?                     02857000
  2868.          BM        S1SNDERR            no: error                        02858000
  2869. SS1WAIT  EQU       *                                                    02859000
  2870.          CLI       CONSUNIT,ATTN       was last intrpt an ATTN?         02860000
  2871.          BE        SS1READ             yes: go read from console        02861000
  2872.          WAITD     CON1                no: wait for one                 02862000
  2873.          B         SS1WAIT                                              02863000
  2874. SS1READ  EQU       *                                                    02864000
  2875.          XC        RECPKT,RECPKT       clear input buffer               02865000
  2876.          LA        R1,S1RCCW           get CCW to read console          02866000
  2877.          L         R15,=A(SCRNIO)      and do it now                    02867000
  2878.          BALR      R14,R15                                              02868000
  2879.          ST        R15,S1RDBYTC        save residue byte count          02869000
  2880.          LTR       R15,R15             did it work?                     02870000
  2881.          BNM       SPRET               yes: return to caller            02871000
  2882. S1SNDERR EQU       *                                                    02872000
  2883.          MVI       ERRNUM,S1ERRNUM     no: flag error                   02873000
  2884.          MVI       STATE,C'A'          go into abort state              02874000
  2885.          B         SPRET               ret to caller                    02875000
  2886. SENDTTY  EQU       *                   [12 end]                         02876000
  2887.          TR        SNDPKT(130),ATOE    Send in EBCDIC                   02877000
  2888. *        WRTERM    SNDPKT,(R6),EDIT=NO          [19]                    02878000
  2889.          STH       R6,TYLNLEN          Store length in plist [19]       02879000
  2890.          LA        R1,TYLNPLST         Point to plist [19]              02880000
  2891.          SVC       202                 Write to terminal [19]           02881000
  2892.          DC        AL4(1)              See comments at plist [19]       02882000
  2893. SPRET    L         R13,4(R13)                                           02883000
  2894.          L         R14,12(R13)                                          02884000
  2895.          LM        R0,R12,20(R13)                                       02885000
  2896.          BR        14                                                   02886000
  2897. SPSAVE   DS        18F                                                  02887000
  2898. MOVE     MVC       PDATA(0),SDAT                                        02888000
  2899. * [19 begin]                                                            02889000
  2900. * The following Plist is identical to a WRTERM macro one,               02890000
  2901. * except the macro can't gen a "2" flag which causes the                02891000
  2902. * output not to be translated with the user output translate            02892000
  2903. * table.  The "8" specifies no Carriage Return is needed.               02893000
  2904. TYLNPLST DS        0D                  Terminal write Plist:            02894000
  2905.          DC        CL8'TYPLIN'         Command name                     02895000
  2906.          DC        X'01',AL3(SNDPKT)   Buffer address                   02896000
  2907.          DC        C'B',X'82'          B->black, 82->no xlate or CR     02897000
  2908. TYLNLEN  DC        H'0'                store buffer len here            02898000
  2909. *  [19 end]                                                             02899000
  2910. HIBITS   DC        (L'SNDPKT)X'80'     Set hi bit in each char [12]     02900000
  2911.          LTORG                                                          02901000
  2912.          DROP      R11                                                  02902000
  2913.          DROP      R12                 DON'T NEED THEM ANYMORE          02903000
  2914.          EJECT                                                          02904000
  2915. * Calculate the CRC and return it in R15.  Expects R5 to point to       02905000
  2916. * the start of the buffer on which the CRC is calculated.  Stops        02906000
  2917. * when it reaches a NULL. [8]                                           02907000
  2918. CRCCLC   CSECT                                                          02908000
  2919.          STM       R14,R12,12(R13)     SAVE CALLER'S REGISTERS          02909000
  2920.          BALR      R12,0               ESTABLISH ADDRESSABILITY         02910000
  2921.          USING     *,R12                                                02911000
  2922.          LA        R14,CRCSAV          ADDRESS OF MY SAVE AREA          02912000
  2923.          ST        R13,4(R14)          SAVE CALLER'S                    02913000
  2924.          ST        R14,8(R13)                                           02914000
  2925.          LR        R13,R14                                              02915000
  2926. * Use R11 as base register for 'PARMS' global data area                 02916000
  2927.          L         R11,=A(PARMS)                                        02917000
  2928.          USING     PARMS,R11           ESTABLISH ADDRESSABILITY         02918000
  2929.          SR        R3,R3               Initial CRC value is zero        02919000
  2930. CRC0     SR        R4,R4               Clear out before read char       02920000
  2931.          IC        R4,0(R5)            Get the next character           02921000
  2932.          LTR       R4,R4               Test it                          02922000
  2933.          BZ        CRC1                If NULL then we're done          02923000
  2934.          LA        R5,1(R5)            Else bump input pointer          02924000
  2935.          LR        R7,R3               Munge CRC here                   02925000
  2936.          N         R7,=X'000000FF'     Only want lo order byte          02926000
  2937.          XR        R4,R7               XOR input and CRC lo byte        02927000
  2938.          LR        R7,R4               Keep the original for later      02928000
  2939.          N         R7,=X'000000F0'     Keep hi 4 bits of lowest byte    02929000
  2940.          SRL       R7,4                Shift it right by four           02930000
  2941.          N         R4,=X'0000000F'     Get lo 4 bits of lowest byte     02931000
  2942.          AR        R4,R4               Double to get index into table   02932000
  2943.          LH        R4,CRCTB2(R4)       Get low portion                  02933000
  2944.          AR        R7,R7               Double to get another index      02934000
  2945.          LH        R7,CRCTAB(R7)       Get high portion                 02935000
  2946.          N         R4,=X'0000FFFF'     Don't want propogated sign       02936000
  2947.          N         R7,=X'0000FFFF'     Ditto                            02937000
  2948.          XR        R4,R7               Add the two                      02938000
  2949.          SRL       R3,8                Shift 8 bits to right            02939000
  2950.          XR        R3,R4               XOR table value and CRC          02940000
  2951.          B         CRC0                And get some more                02941000
  2952. CRC1     LR        R15,R3              Return CRC in R15                02942000
  2953.          L         R13,4(R13)                                           02943000
  2954.          L         R14,12(R13)                                          02944000
  2955.          LM        R0,R12,20(R13)                                       02945000
  2956.          BR        14                                                   02946000
  2957. CRCSAV   DS        18F                                                  02947000
  2958.          LTORG                                                          02948000
  2959.          DROP      R11                                                  02949000
  2960.          DROP      R12                 DON'T NEED THEM ANYMORE          02950000
  2961.          EJECT                                                          02951000
  2962. *                                                                       02952000
  2963. * Add support for two character checksum and three character CRC.       02953000
  2964. * Expects input data to be in RECPKT buffer.  Writes data out to        02954000
  2965. * RDAT buffer.  Registers used: R5 to calculate checksum, R8 as         02955000
  2966. * pointer in input buffer.  R9 as output buffer pointer.  [8]           02956000
  2967. RPACK    CSECT                                                          02957000
  2968.          STM       R14,R12,12(R13)     SAVE CALLER'S REGISTERS          02958000
  2969.          BALR      R12,0               ESTABLISH ADDRESSABILITY         02959000
  2970.          USING     *,R12                                                02960000
  2971.          LA        R14,RPSAVE          ADDRESS OF MY SAVE AREA          02961000
  2972.          ST        R13,4(R14)          SAVE CALLER'S                    02962000
  2973.          ST        R14,8(R13)                                           02963000
  2974.          LR        R13,R14                                              02964000
  2975. * Use R11 as base register for 'PARMS' global data area                 02965000
  2976.          L         R11,=A(PARMS)                                        02966000
  2977.          USING     PARMS,R11           ESTABLISH ADDRESSABILITY         02967000
  2978.          TM        S1FLAGS,ISS1        is console a S/1?  [12 start]    02968000
  2979.          BZ        RECTTY              no: skip                         02969000
  2980.          L         R0,S1RDBYTC         get residue cnt from read        02970000
  2981.          LTR       R0,R0               check if one has been done       02971000
  2982.          BNM       RPS1MOV             non-neg->it has: skip            02972000
  2983.          MVI       SNDPKT,ASCXON       send micro X-ON to prod it       02973000
  2984.          LA        R1,S1ORDSL+1        and init S/1 "write/read"        02974000
  2985.          STH       R1,S1SDATL          data len = orders + 1 char       02975000
  2986.          LA        R1,S1SCCW           point to CCW for this I/O        02976000
  2987.          L         R15,=A(SCRNIO)      call routine to do I/O           02977000
  2988.          BALR      R14,R15                                              02978000
  2989.          LTR       R15,R15             did it work?                     02979000
  2990.          BM        RPACK9              no: an err occurred              02980000
  2991. RPWAIT   EQU       *                                                    02981000
  2992.          CLI       CONSUNIT,ATTN       was last intrp an ATTN?          02982000
  2993.          BE        RPS1RD              yes: go read console             02983000
  2994.          WAITD     CON1                no: wait for ATTN intrpt         02984000
  2995.          B         RPWAIT                                               02985000
  2996. RPS1RD   EQU       *                                                    02986000
  2997.          XC        RECPKT,RECPKT       clear input buffer               02987000
  2998.          LA        R1,S1RCCW           get CCW for READ MODIFIED        02988000
  2999.          L         R15,=A(SCRNIO)                                       02989000
  3000.          BALR      R14,R15             perform read                     02990000
  3001.          LTR       R0,R15              copy byte cnt & test status      02991000
  3002.          BM        RPACK9              len < 0 -> error: skip           02992000
  3003. RPS1MOV  EQU       *                                                    02993000
  3004. * The format of the incoming buffer is:                                 02994000
  3005. *     X'E8',X'????',<ASCII data with high bit set>,<CR>                 02995000
  3006. * where the '????' is an SBA-type cursor address which would            02996000
  3007. * point to the end of the data on the screen (if it were                02997000
  3008. * really there).                                                        02998000
  3009.          MVC       RECPKT(L'RECPKT-3),RECPKT+3  shift over leadin       02999000
  3010.          NC        RECPKT,NOHIBITS     clear all hi bits                03000000
  3011.          LA        R6,L'RECPKT-4       get size of buf - overhead       03001000
  3012.          SR        R6,R0               subt residue cnt from read       03002000
  3013.          BM        RPACK9              data len < 0: error              03003000
  3014.          LA        R2,RECPKT(R6)       point past last data char        03004000
  3015.          MVC       0(4,R2),=X'00000000'    clr ovhd after MVC           03005000
  3016.          LR        R0,R6               save correct data len            03006000
  3017.          TM        FLAGS,DEBUG         Are we debugging? [14]           03007000
  3018.          BNO       RPACKA              No don't log packet [14]         03008000
  3019.          MVC       INPUT(130),RECPKT   Munge here [14]                  03009000
  3020.          TR        INPUT(130),ATOE     Log in EBCDIC [14]               03010000
  3021.          FSWRITE   'KER LOG A1',BUFFER=INPUT,BSIZE=(R0),FORM=E,RECFM=V  03011000
  3022.          B         RPACKA              re-join common code              03012000
  3023. RECTTY   EQU       *                   normal TTY-type read [12 end]    03013000
  3024. *        RDTERM    RECPKT,EDIT=NO      Read in a buffer  [19]           03014000
  3025.          LA        R1,WTRDPLST         Point to Plist for read [19]     03015000
  3026.          SVC       202                 Read from terminal [19]          03016000
  3027.          DC        AL4(1)              See comments at Plist [19]       03017000
  3028.          LH        R0,WTRDLEN          Number of chars recv'd [19]      03018000
  3029.          TM        FLAGS,DEBUG         Are we debugging? [14]           03019000
  3030.          BNO       RPACKB              No don't log packet [14]         03020000
  3031.          FSWRITE   'KER LOG A1',BUFFER=RECPKT,BSIZE=(R0),FORM=E,RECFM=V 03021000
  3032. RPACKB   TR        RECPKT(130),ETOA    Translate to ASCII               03022000
  3033. RPACKA   EQU       *                   [12]                             03023000
  3034.          NI        FLAGS,X'FF'-FLG4    Make guess about type of error   03024000
  3035.          SR        R8,R8               Index register for RECPKT        03025000
  3036.          SR        R5,R5               Checksum register                03026000
  3037. RPACK0   LA        R7,RECPKT(R8)       Address of next input char       03027000
  3038.          CLI       0(R7),SOH           Is it Control-A                  03028000
  3039.          BE        RPACK1              Yes, so far so good              03029000
  3040.          LA        R8,1(R8)            Try next character               03030000
  3041.          C         R8,=F'130'          See if exceed buffer size        03031000
  3042.          BL        RPACK0              No, can keep checking            03032000
  3043.          MVI       ERRNUM,X'03'        Yes so no "SOH" error            03033000
  3044.          B         RPACK71                                              03034000
  3045. RPACK1   SR        R9,R9               Zero output buffer pointer       03035000
  3046.          LA        R8,1(R8)            Increment input buffer pointer   03036000
  3047.          LA        R7,RECPKT(R8)       Get loc of char count            03037000
  3048.          CLI       0(R7),SOH           Is it Control-A                  03038000
  3049.          BE        RPACK1              Yes start over                   03039000
  3050.          CLI       0(R7),DQUOTE        Equal or above the min           03040000
  3051.          BNL       RPACK11             Continue if yes                  03041000
  3052.          MVI       ERRNUM,X'04'        Bad packet length                03042000
  3053.          B         RPACK71                                              03043000
  3054. RPACK11  IC        R5,0(R7)            Start checksum                   03044000
  3055.          LR        R7,R5               Get size field                   03045000
  3056.          STC       R7,LRDAT+3          Data field & control info        03046000
  3057.          LA        R8,1(R8)            Increment input pointer          03047000
  3058.          SR        R7,R7               Zero it out                      03048000
  3059.          IC        R7,RECPKT(R8)       Pick up packet number            03049000
  3060.          C         R7,=A(SOH)          Is it Control-A                  03050000
  3061.          BE        RPACK1              Yes restart packet               03051000
  3062.          AR        R5,R7               Add to checksum                  03052000
  3063.          S         R7,SPACE            Subtract the space               03053000
  3064.          STC       R7,RPKNUM+3         RPKNUM := received packet number 03054000
  3065.          LA        R8,1(R8)            Increment input counter          03055000
  3066.          IC        R7,RECPKT(R8)       Pick up message type             03056000
  3067.          C         R7,=A(SOH)          Is it Control-A                  03057000
  3068.          BE        RPACK1              Yes restart                      03058000
  3069.          STC       R7,RTYPE            Save value here                  03059000
  3070.          AR        R5,R7               Add to checksum                  03060000
  3071.          LA        R8,1(R8)            Go to next byte                  03061000
  3072. * Start of change.                                                      03062000
  3073. * Now determine block check type for this packet.  Here we violate the  03063000
  3074. * layered nature of the protocol by inspecting the packet type in       03064000
  3075. * order to detect when the two sides get out of sync.  Two heuristics   03065000
  3076. * allow us to resync here:                                              03066000
  3077. *   a. An S packet always has a type 1 checksum.                        03067000
  3078. *   b. A NAK never contains data, so its block check type is            03068000
  3079. *      PACKET LEN-2.                                                    03069000
  3080.          L         R4,LRDAT            Get back the size                03070000
  3081.          S         R4,=F'34'           Unchar(len)-2 (for SEQ & TYPE)   03071000
  3082.          SR        R3,R3                                                03072000
  3083.          IC        R3,CHKLEN           Checksum length we expect        03073000
  3084.          CLI       RTYPE,AS            Is this an "S" packet?           03074000
  3085.          BNE       RPK0                Nope                             03075000
  3086.          L         R3,ONE              Yes, use 1 char checksum         03076000
  3087. RPK0     CLI       RTYPE,AN            Is this a NAK?                   03077000
  3088.          BNE       RPK1                Nope                             03078000
  3089.          LR        R3,R4               Yes so len-2 is checksum type    03079000
  3090. RPK1     STC       R3,CHKLEN           Then this is chksum length       03080000
  3091.          SR        R4,R3               Real size of data                03081000
  3092.          ST        R4,LRDAT            Save correct size                03082000
  3093. * End of change.                                                        03083000
  3094.          LTR       R4,R4               How much data did we get         03084000
  3095.          BZ        RPACK3              None so that's it                03085000
  3096. RPACK2   XC        TEMP,TEMP           Zero it out                      03086000
  3097.          LA        R7,RECPKT(R8)       Next location in buffer          03087000
  3098.          MVC       TEMP+3(1),0(R7)     Pick up next byte                03088000
  3099.          CLI       TEMP+3,SOH          Is it Control-A                  03089000
  3100.          BE        RPACK1              Yes start over                   03090000
  3101.          LA        R7,RDAT(R9)         Where the data's going           03091000
  3102.          MVC       0(1,R7),TEMP+3      And move it                      03092000
  3103.          A         R5,TEMP             Add to checksum                  03093000
  3104.          LA        R8,1(R8)            Bump input buffer pointer        03094000
  3105.          LA        R9,1(R9)            Bump output buffer pointer       03095000
  3106.          BCTR      R4,0                Decrement amount of input        03096000
  3107.          LTR       R4,R4               Any left?                        03097000
  3108.          BNZ       RPACK2              Yes get another character        03098000
  3109. RPACK3   SR        R7,R7               Zero out register                03099000
  3110.          IC        R7,RECPKT(R8)       Get checksum                     03100000
  3111.          LA        R8,1(R8)            Bump input pointer               03101000
  3112.          C         R7,=A(SOH)          Is it Control-A                  03102000
  3113.          BE        RPACK1              Yes start over                   03103000
  3114.          S         R7,SPACE            Turn char back into a number     03104000
  3115.          LR        R4,R5               Keep copy here [8]               03105000
  3116.          CLI       CHKLEN,X'02'        Using what checksum length       03106000
  3117.          BE        RPACK5              Two character checksum           03107000
  3118.          BH        RPACK4              Three character CRC              03108000
  3119.          ST        R5,TEMP             Else is a 1 char checksum        03109000
  3120.          N         R5,=X'000000C0'     Get two hi order bits            03110000
  3121.          SRL       R5,6                Shift it right by 6              03111000
  3122.          A         R5,TEMP             Add the two values               03112000
  3123.          N         R5,=X'0000003F'     Get mod 64                       03113000
  3124.          CR        R5,R7               Computed vs received checksum    03114000
  3125.          BE        RPACK8              Successful                       03115000
  3126.          B         RPACK7              We failed                        03116000
  3127. RPACK4   LA        R5,RECPKT           Address of input buffer          03117000
  3128.          LA        R5,1(R5)            Skip over the ^A                 03118000
  3129.          SR        R6,R6               Use for NULL                     03119000
  3130.          BCTR      R8,0                Go back one char                 03120000
  3131.          STC       R6,RECPKT(R8)       Next spot in output buffer       03121000
  3132.          LA        R8,1(R8)            Next char to pick up             03122000
  3133.          L         R15,=A(CRCCLC)      Calculate the CRC                03123000
  3134.          BALR      R14,R15                                              03124000
  3135.          LR        R4,R15              Keep it here                     03125000
  3136.          LR        R5,R4               Munge while here                 03126000
  3137.          N         R5,=X'0000F000'     Get bits 12-15                   03127000
  3138.          SRL       R5,12               Shift right by 12                03128000
  3139.          CR        R5,R7               Rec'v checksum = calculated one? 03129000
  3140.          BNE       RPACK7              No then we fail                  03130000
  3141.          SR        R7,R7               Zero out register                03131000
  3142.          IC        R7,RECPKT(R8)       Get next char of checksum        03132000
  3143.          LA        R8,1(R8)            Bump input pointer               03133000
  3144.          C         R7,=A(SOH)          Is it Control-A                  03134000
  3145.          BE        RPACK1              Yes start over                   03135000
  3146.          S         R7,SPACE            Get real value                   03136000
  3147. RPACK5   LR        R5,R4               Get back the CRC                 03137000
  3148.          N         R5,=X'00000FC0'     Get bits 6-11                    03138000
  3149.          SRL       R5,6                Shift right by six               03139000
  3150.          CR        R5,R7               Recv chksum = calc one?          03140000
  3151.          BNE       RPACK7              No                               03141000
  3152.          SR        R7,R7               Zero out register                03142000
  3153.          IC        R7,RECPKT(R8)       Get checksum                     03143000
  3154.          LA        R8,1(R8)            Bump input pointer               03144000
  3155.          C         R7,=A(SOH)          Is it Control-A                  03145000
  3156.          BE        RPACK1              Yes start over                   03146000
  3157.          S         R7,SPACE            Get back real value              03147000
  3158.          N         R4,=X'0000003F'     Get bits 0-5                     03148000
  3159.          CR        R4,R7               Do the last chars match          03149000
  3160.          BE        RPACK8              Yes                              03150000
  3161. RPACK7   EQU       *                                                    03151000
  3162. * Uncomment next two lines when debugging to get first char of chksum.  03152000
  3163. *        A         R5,SPACE                                             03153000
  3164. *        LINEDIT   TEXT='CHK SB ...',SUB=(HEX,(R5))                     03154000
  3165.          MVI       ERRNUM,X'05'        Bad checksum error               03155000
  3166. RPACK71  MVI       RTYPE,AN            Return a NAK                     03156000
  3167.          OI        FLAGS,FLG4          RPACK NAK'ed the packet          03157000
  3168. RPACK8   L         R13,4(R13)                                           03158000
  3169.          L         R14,12(R13)                                          03159000
  3170.          LM        R0,R12,20(R13)                                       03160000
  3171.          BR        14                                                   03161000
  3172. RPACK9   EQU       *                   S/1 I/O error occurred [12]      03162000
  3173.          MVI       ERRNUM,S1ERRNUM     Set error type [12]              03163000
  3174.          MVI       RTYPE,X'00'         Set an invalid pkt type [12]     03164000
  3175.          B         RPACK8              Return to caller [12]            03165000
  3176. RPSAVE   DS        18F                                                  03166000
  3177. * [19 begin]                                                            03167000
  3178. * The following Plist is identical to a RDTERM macro one,               03168000
  3179. * except the macro can't gen a "Y" code which causes the                03169000
  3180. * input not to be translated with the user input translate              03170000
  3181. * table and the buffer is blank filled.  Use prompt of XON.             03171000
  3182. WTRDPLST DS        0D                  Terminal read Plist:             03172000
  3183.          DC        CL8'WAITRD'         Command name                     03173000
  3184.          DC        X'01',AL3(RECPKT)   Buffer addr                      03174000
  3185.          DC        C'Y',C'P'           Y->no xlate, P->prompt           03175000
  3186. WTRDLEN  DC        AL2(0)              Rec'd chr count ret'd here       03176000
  3187.          DC        AL4(XONPRO)         Prompt Address                   03177000
  3188.          DC        AL4(LXONPRO)        Prompt length                    03178000
  3189.          DS        0D                                                   03179000
  3190. XONPRO   DC        X'11'               Prompt is XON                    03180000
  3191. LXONPRO  EQU       *-XONPRO                                             03181000
  3192. * [19 end]                                                              03182000
  3193. NOHIBITS DC        (L'RECPKT)X'7F'     Clear hi bit of each char [12]   03183000
  3194.          LTORG                                                          03184000
  3195.          DROP      R11                                                  03185000
  3196.          DROP      R12                 DON'T NEED THEM ANYMORE          03186000
  3197.          EJECT                                                          03187000
  3198. RECEIVE  CSECT                                                          03188000
  3199.          STM       R14,R12,12(R13)     SAVE CALLER'S REGISTERS          03189000
  3200.          BALR      R12,0               ESTABLISH ADDRESSABILITY         03190000
  3201.          USING     *,R12                                                03191000
  3202.          LA        R14,RECSAVE         ADDRESS OF MY SAVE AREA          03192000
  3203.          ST        R13,4(R14)          SAVE CALLER'S                    03193000
  3204.          ST        R14,8(R13)                                           03194000
  3205.          LR        R13,R14                                              03195000
  3206. * USE R11 AS BASE REGISTER FOR THE GLOBAL DATA AREA, 'PARMS'            03196000
  3207.          L         R11,=A(PARMS)                                        03197000
  3208.          USING     PARMS,R11                                            03198000
  3209.          TM        S1FLAGS,ISS1        Is console a S/1? [12]           03199000
  3210.          BZ        RECINI              No, skip init stuff [12]         03200000
  3211.          LA        R1,1                Initialize [12]                  03201000
  3212.          L         R15,=A(INTRINI)     Trap CONS interrupts [12]        03202000
  3213.          BALR      R14,R15             [12]                             03203000
  3214. RECINI   MVC       EBQUOT(1),ORIG8Q    IF CHANGED IN LAST X-FER [1]     03204000
  3215.          SR        R6,R6               GET ZERO                         03205000
  3216.          ST        R6,NUMTRY           ZERO THIS OUT                    03206000
  3217.          ST        R6,SPKNUM           HERE TOO                         03207000
  3218.          MVI       STATE,C'R'          SET TO RECEIVE STATE             03208000
  3219. RLOOP    CLI       STATE,C'D'          RECEIVE DATA STATE               03209000
  3220.          BE        RDATA                                                03210000
  3221.          CLI       STATE,C'F'          RECEIVE FILE STATE               03211000
  3222.          BE        RFILE                                                03212000
  3223.          CLI       STATE,C'R'          RECEIVE INIT STATE               03213000
  3224.          BE        RINIT                                                03214000
  3225.          CLI       STATE,C'C'          COMPLETE STATE                   03215000
  3226.          BE        RCOMP                                                03216000
  3227.          CLI       STATE,C'A'          ABORT STATE                      03217000
  3228.          BE        RABORT                                               03218000
  3229.          MVI       ERRNUM,X'02'        UNRECOGNIZED STATE               03219000
  3230.          B         RABORT              ELSE, DIE                        03220000
  3231. RINIT    CLC       NUMTRY,IMXTRY       SEE IF CAN RECEIVE               03221000
  3232.          BL        ROK1                YES, WE CAN                      03222000
  3233.          MVI       STATE,C'A'          NOPE, GO INTO ABORT STATE        03223000
  3234.          B         RLOOP                                                03224000
  3235. ROK1     L         R3,NUMTRY                                            03225000
  3236.          LA        R3,1(R3)            INCREMENT TRIAL COUNTER          03226000
  3237.          ST        R3,NUMTRY                                            03227000
  3238.          TM        LFLAGS,SERVON       In server mode? [13]             03228000
  3239.          BO        RY1                 Already read in packet [13]      03229000
  3240.          MVC       CURCHK(1),CHKLEN    Save desired value [8]           03230000
  3241.          MVI       CHKLEN,X'01'        Init uses 1 char chksum [8]      03231000
  3242.          L         R15,=A(RPACK)       GET INIT INFORMATION             03232000
  3243.          BALR      R14,R15                                              03233000
  3244.          MVC       CHKLEN(1),CURCHK    Restore desired chksum [8]       03234000
  3245.          CLI       RTYPE,AE            ERROR PACKET?                    03235000
  3246.          BNE       RY1                 ALL OK                           03236000
  3247.          MVI       ERRNUM,X'0A'        MICRO DIED                       03237000
  3248.          MVI       STATE,C'A'          SO WE DO TOO                     03238000
  3249.          B         RLOOP                                                03239000
  3250. RY1      CLI       RTYPE,AS            IS IT A SEND-INIT PACKET         03240000
  3251.          BNE       RN1                 MAYBE IT GOT CLOBBERED           03241000
  3252.          L         R5,LRDAT            Number of pieces of data [5]     03242000
  3253.          L         R15,=A(SPAR)        Read his parameters [5]          03243000
  3254.          BALR      R14,R15                                              03244000
  3255.          MVC       SPKNUM(4),RPKNUM    SYNCH PACKET NUMBERS             03245000
  3256.          MVI       STYPE,AY            SET MESSAGE TYPE TO ACK          03246000
  3257.          L         R15,=A(RPAR)        Make packet of our values [5]    03247000
  3258.          BALR      R14,R15                                              03248000
  3259.          ST        R15,LSDAT           Size of packet [5]               03249000
  3260.          MVC       CURCHK(1),CHKLEN    Save desired value [8]           03250000
  3261.          MVI       CHKLEN,X'01'        Init uses 1 char chksum [8]      03251000
  3262.          L         R15,=A(SPACK)       ADDRESS OF SPACK                 03252000
  3263.          BALR      R14,R15             SAVE * AND GO TO SPACK           03253000
  3264.          MVC       CHKLEN(1),CURCHK    Restore desired chksum [8]       03254000
  3265.          CLI       STATE,C'A'                                           03255000
  3266.          BE        RABORT                                               03256000
  3267.          MVI       STATE,C'F'          SET TO RECEIVE FILE STATE        03257000
  3268.          MVC       OLDTRY(4),NUMTRY    SAVE TRIAL COUNTER               03258000
  3269.          XC        NUMTRY,NUMTRY       RESET COUNTER TO ZERO            03259000
  3270.          L         R3,SPKNUM                                            03260000
  3271.          LA        R3,1(R3)            ADD ONE                          03261000
  3272.          ST        R3,SPKNUM           STORE VALUE INCREMENTED BY 1     03262000
  3273.          NC        SPKNUM(4),=X'0000003F'   MASK TO GET MOD 64          03263000
  3274.          B         RLOOP                                                03264000
  3275. RN1      CLI       RTYPE,AN            NAK (bad chksum)?                03265000
  3276.          BNE       RSELSE                                               03266000
  3277.          MVI       STYPE,AN            SEND A NAK PACKET                03267000
  3278.          XC        LSDAT,LSDAT         NO DATA                          03268000
  3279.          MVC       CURCHK(1),CHKLEN    Save desired value [8]           03269000
  3280.          MVI       CHKLEN,X'01'        Init uses 1 char chksum [8]      03270000
  3281.          L         R15,=A(SPACK)                                        03271000
  3282.          BALR      R14,R15                                              03272000
  3283.          MVC       CHKLEN(1),CURCHK    Restore desired chksum [8]       03273000
  3284.          B         RLOOP                                                03274000
  3285. RSELSE   MVI       STATE,C'A'          ELSE,ABORT                       03275000
  3286.          CLI       ERRNUM,S1ERRNUM     Was it a S/1 I/O error [12]      03276000
  3287.          BE        RLOOP               Yes just return [12]             03277000
  3288.          MVI       ERRNUM,X'07'        ILLEGAL PACKET TYPE              03278000
  3289.          B         RLOOP                                                03279000
  3290. RFILE    CLC       NUMTRY,MAXTRY       EXCEEDED NO. OF TRIALS ALLOWED   03280000
  3291.          BL        ROK2                NOPE, STILL OK                   03281000
  3292.          MVI       STATE,C'A'          ABORT IF YES                     03282000
  3293.          B         RLOOP                                                03283000
  3294. ROK2     L         R3,NUMTRY                                            03284000
  3295.          LA        R3,1(R3)            INCREMENT TRIAL COUNTER          03285000
  3296.          ST        R3,NUMTRY                                            03286000
  3297.          L         R15,=A(RPACK)       GET ADDRESS OF RPACK             03287000
  3298.          BALR      R14,R15             GO THERE AND RETURN WHEN DONE    03288000
  3299.          CLI       RTYPE,AE            ERROR PACKET?                    03289000
  3300.          BNE       RY2                 MAYBE AN ACK                     03290000
  3301.          MVI       ERRNUM,X'0A'        MICRO DIED                       03291000
  3302.          MVI       STATE,C'A'          SO WE DO TOO                     03292000
  3303.          B         RLOOP                                                03293000
  3304. RY2      CLI       RTYPE,AS            STILL IN INIT STATE?             03294000
  3305.          BNE       RNZ                 TRY FOR AN EOF                   03295000
  3306.          CLC       OLDTRY,IMXTRY       CAN WE TRY AGAIN? [5]            03296000
  3307.          BL        ROLD                                                 03297000
  3308.          MVI       STATE,C'A'          ELSE, ABORT                      03298000
  3309.          B         RLOOP                                                03299000
  3310. ROLD     L         R3,OLDTRY                                            03300000
  3311.          LA        R3,1(R3)            INCREMENT COUNTER                03301000
  3312.          ST        R3,OLDTRY                                            03302000
  3313.          L         R3,SPKNUM           GET PACKET NUMBER SENT           03303000
  3314.          BCTR      R3,0                SUBTRACT ONE FROM IT             03304000
  3315.          C         R3,RPKNUM           RPKNUM MUST EQUAL SPKNUM-1       03305000
  3316.          BE        RNUM                                                 03306000
  3317.          MVI       ERRNUM,X'08'        PREVIOUS PACKET MISSING          03307000
  3318.          B         RNAK                SEND A NAK                       03308000
  3319. RNUM     MVI       STYPE,AY            ACK PACKET                       03309000
  3320.          ST        R3,SPKNUM           MAKE SEND SEQ NO. = SPKNUM-1     03310000
  3321.          L         R15,=A(RPAR)        Get packet with our values [5]   03311000
  3322.          BALR      R14,R15                                              03312000
  3323.          ST        R15,LSDAT           Size of packet [5]               03313000
  3324.          L         R15,=A(SPACK)                                        03314000
  3325.          BALR      R14,R15             GO TO SPACK AND RETURN           03315000
  3326.          CLI       STATE,C'A'                                           03316000
  3327.          BE        RABORT                                               03317000
  3328.          L         R4,SPKNUM                                            03318000
  3329.          LA        R4,1(R4)            ADD ONE                          03319000
  3330.          ST        R4,SPKNUM           RESTORE N TO PROPER VALUE        03320000
  3331.          XC        NUMTRY,NUMTRY       RESET COUNTER TO ZERO            03321000
  3332.          B         RLOOP                                                03322000
  3333. RNZ      CLI       RTYPE,AZ                                             03323000
  3334.          BNE       RNF                 MAYBE IT'S AN 'F'                03324000
  3335.          CLC       OLDTRY,MAXTRY       CAN WE TRY AGAIN?                03325000
  3336.          BL        ROLD2                                                03326000
  3337.          MVI       STATE,C'A'          ELSE,ABORT                       03327000
  3338.          B         RLOOP                                                03328000
  3339. ROLD2    L         R3,OLDTRY                                            03329000
  3340.          LA        R3,1(R3)            INCREMENT COUNTER                03330000
  3341.          ST        R3,OLDTRY                                            03331000
  3342.          L         R3,SPKNUM           GET PACKET NUMBER SENT           03332000
  3343.          BCTR      R3,0                SUBTRACT ONE FROM IT             03333000
  3344.          C         R3,RPKNUM           RPKNUM MUST EQUAL SPKNUM-1       03334000
  3345.          BE        RNUM2                                                03335000
  3346.          MVI       ERRNUM,X'08'        PREVIOUS PACKET MISSING          03336000
  3347.          B         RNAK                SEND A NAK                       03337000
  3348. RNUM2    MVI       STYPE,AY            ACK PACKET                       03338000
  3349.          ST        R3,SPKNUM           SEND SEQ := SPKNUM-1             03339000
  3350.          XC        LSDAT,LSDAT         NO DATA                          03340000
  3351.          L         R15,=A(SPACK)                                        03341000
  3352.          BALR      R14,R15                                              03342000
  3353.          CLI       STATE,C'A'                                           03343000
  3354.          BE        RABORT                                               03344000
  3355.          L         R4,SPKNUM                                            03345000
  3356.          LA        R4,1(R4)            ADD ONE                          03346000
  3357.          ST        R4,SPKNUM           RESTORE SPKNUM TO PROPER VALUE   03347000
  3358.          XC        NUMTRY,NUMTRY       RESET COUNTER TO ZERO            03348000
  3359.          B         RLOOP                                                03349000
  3360. RNF      CLI       RTYPE,AF                                             03350000
  3361.          BNE       RNB                 WELL, IT'S NOT A FNAME           03351000
  3362.          CLC       RPKNUM,SPKNUM       THEY HAVE TO BE EQUAL            03352000
  3363.          BE        RNUM3                                                03353000
  3364.          MVI       ERRNUM,X'08'        PREVIOUS PACKET MISSING          03354000
  3365.          B         RNAK                SEND A NAK                       03355000
  3366. RNUM3    MVI       STYPE,AY            ACK PACKET                       03356000
  3367.          XC        LSDAT,LSDAT         NO DATA                          03357000
  3368.          MVI       CXZ,X'00'           Clear each time [16]             03358000
  3369.          TM        FLAGS,FLG2          OVERWRITE THE NAME SENT?         03359000
  3370.          BO        OVER                YUP,WE DO                        03360000
  3371.          L         R5,LRDAT            Data len to decode [22]          03361000
  3372.          LTR       R5,R5               CHECK LENGTH                     03362000
  3373.          BZ        SAYNO               DIE IF NO FILENAME               03363000
  3374.          L         R2,=A(NULDMP)       Null dump routine [22]           03364000
  3375.          ST        R2,MORDEC           [22]                             03365000
  3376.          XC        OUTBFPT,OUTBFPT     Output buffer offset [22]        03366000
  3377.          MVC       TEMP,MAXOUT         Save max here [22]               03367000
  3378.          MVC       MAXOUT,=A(MAXTXT)   Use big number [22]              03368000
  3379.          L         R15,=A(DECODE)      Decode the input [22]            03369000
  3380.          BALR      R14,R15             [22]                             03370000
  3381.          MVC       MAXOUT,TEMP         Reset [22]                       03371000
  3382.          L         R5,OUTBFPT          Len of decoded data [22]         03372000
  3383.          ST        R5,LRDAT            Keep length here [22]            03373000
  3384.          MVC       FILNAM,=18X'20'     Initialize to blanks             03374000
  3385. *        LA        R9,RDAT             Location of first char           03375000
  3386.          L         R9,ARBUF            Location of first char [22]      03376000
  3387.          LR        R8,R9               Points to buffer head [22]       03377000
  3388. REMDOT   CLC       0(1,R9),=X'2E'      LOOK FOR THE DOT                 03378000
  3389.          BE        DOT                 FOUND IT                         03379000
  3390.          LA        R9,1(R9)            NEXT POSITION                    03380000
  3391.          LR        R10,R9                                               03381000
  3392.          SR        R10,R8              GET LENGTH OF NAME SO FAR        03382000
  3393.          CR        R10,R5              AT END OF FN?                    03383000
  3394.          BL        REMDOT              NO,KEEP LOOKING                  03384000
  3395.          C         R5,=F'8'            Get FN (max of 8 chars) [9]      03385000
  3396.          BNH       DOT1                Size is OK [9]                   03386000
  3397.          L         R5,=F'8'            Truncate to 8 [9]                03387000
  3398. DOT1     BCTR      R5,0                Decrement for next instr [9]     03388000
  3399.          EX        R5,GETFN            Copy FN from buffer [9]          03389000
  3400.          B         DOT4                Set ft to "X"   [9]              03390000
  3401. DOT      LR        R5,R9               SAVE OUR PLACE                   03391000
  3402.          LA        R5,1(R5)            NEXT CHARACTER                   03392000
  3403.          SR        R9,R8               GET LENGTH OF FNAME              03393000
  3404.          LR        R4,R9               SAVE LENGTH ATTRIBUTE            03394000
  3405.          BCTR      R4,0                                                 03395000
  3406.          C         R9,=F'8'            MAX OF 8 CHARACTERS              03396000
  3407.          BNH       DOT2                                                 03397000
  3408.          L         R9,=F'8'            TRUNCATE EXTRA LETTERS           03398000
  3409. DOT2     BCTR      R9,0                FOR EX COMMAND                   03399000
  3410.          LTR       R9,R9               CHECK LENGTH                     03400000
  3411.          BM        SAYNO               DIE IF IT'S ZERO                 03401000
  3412.          EX        R9,GETFN            GET FILNAM                       03402000
  3413.          L         R7,LRDAT            GET LENGTH OF WHOLE NAME         03403000
  3414.          SR        R7,R4               AND GET LENGTH OF FTYPE          03404000
  3415.          S         R7,=F'3'            Minus dot, fn char, ft char      03405000
  3416.          LTR       R7,R7               CHECK LENGTH                     03406000
  3417.          BM        DOT4                Set ft to "X"    [9]             03407000
  3418.          C         R7,=F'7'            MAX IS 8 (7 + 1 FOR 'EX')        03408000
  3419.          BNH       DOT3                                                 03409000
  3420.          L         R7,=F'7'            TRUNCATE EXTRA LETTERS           03410000
  3421. DOT3     EX        R7,GETFT            GET FTYPE                        03411000
  3422.          B         DOT5                 Do translation [9]              03412000
  3423. DOT4     MVI       FILNAM+8,X'58'      Set FT to Ascii "X" [9]          03413000
  3424. DOT5     TR        FILNAM(18),ATOE     NEED IT IN EBCDIC                03414000
  3425.          MVC       FILNAM+16(2),FM     ADD DEFAULT FMODE                03415000
  3426. OVER     LA        R3,FILNAM           Point to fn                      03416000
  3427.          OC        FILNAM,=CL18' '     Uppercase filename               03417000
  3428.          L         R15,=A(VERLET)      Verify letters of fn [9]         03418000
  3429.          BALR      R14,R15             [9]                              03419000
  3430.          TM        LFLAGS,WARFL        Doing fn collision? [18 start]   03420000
  3431.          BNO       OVER3               No just delete it                03421000
  3432.          LR        R6,R3               Char we'll change, if needed     03422000
  3433.          LA        R7,FILNAM+16        Where FM starts                  03423000
  3434. OVER1    FSSTATE   (R3),FORM=E         Does it exist already?           03424000
  3435.          LTR       R15,R15                                              03425000
  3436.          BNZ       OVER4               No just go on                    03426000
  3437.          CR        R6,R7               Any more chars to work with?     03427000
  3438.          BE        OVER2               No so fail                       03428000
  3439.          MVI       0(R6),C'$'          Replace char with "$"            03429000
  3440.          LA        R6,1(R6)            Bump pointer                     03430000
  3441.          B         OVER1               And try again                    03431000
  3442. OVER2    MVI       ERRNUM,X'14'        Unable to rename file            03432000
  3443.          MVI       STATE,C'A'          So abort                         03433000
  3444.          B         RLOOP                                                03434000
  3445. OVER3    FSERASE   (R3)                Erase in case exists             03435000
  3446. OVER4    FSOPEN    (R3),FORM=E         Open before ACK                  03436000
  3447.          C         R15,=F'28'          File should not be found         03437000
  3448.          BE        RENOK               Worked OK                        03438000
  3449.          MVI       ERRNUM,X'18'        No - unable to create file       03439000
  3450.          MVI       STATE,C'A'          So we die                        03440000
  3451.          B         RLOOP               [18 end]                         03441000
  3452. RENOK    L         R15,=A(SPACK)                                        03442000
  3453.          BALR      R14,R15             SEND ACK                         03443000
  3454.          CLI       STATE,C'A'                                           03444000
  3455.          BE        RABORT                                               03445000
  3456.          MVC       OLDTRY(4),NUMTRY    KEEP NUMTRY FOR LATER            03446000
  3457.          XC        NUMTRY,NUMTRY       RESET TO ZERO                    03447000
  3458.          L         R3,SPKNUM                                            03448000
  3459.          LA        R3,1(R3)            ADD ONE                          03449000
  3460.          ST        R3,SPKNUM           INCREMENT COUNTER                03450000
  3461.          NC        SPKNUM(4),=X'0000003F'   MASK TO GET MOD 64          03451000
  3462.          MVI       STATE,C'D'          DATA RECEIVE STATE               03452000
  3463.          XC        OUTBFPT,OUTBFPT     Init output buffer pointer [6]   03453000
  3464.          B         RLOOP                                                03454000
  3465. RNB      CLI       RTYPE,AB            SEE IF IT'S A BREAK              03455000
  3466.          BNE       RNN                 MAYBE GOT A NAK                  03456000
  3467.          CLC       RPKNUM,SPKNUM                                        03457000
  3468.          BE        RNUM4                                                03458000
  3469.          MVI       ERRNUM,X'08'        PREVIOUS PACKET MISSING          03459000
  3470.          B         RNAK                SEND A NAK                       03460000
  3471. RNUM4    MVI       STYPE,AY            ACK PACKET                       03461000
  3472.          XC        LSDAT,LSDAT         NO DATA                          03462000
  3473.          L         R15,=A(SPACK)                                        03463000
  3474.          BALR      R14,R15                                              03464000
  3475.          CLI       STATE,C'A'                                           03465000
  3476.          BE        RABORT                                               03466000
  3477.          MVI       STATE,C'C'          COMPLETE STATE                   03467000
  3478.          CLI       CXZ,X'00'           Other side kill x-fer? [16]      03468000
  3479.          BE        RLOOP               No end OK [16]                   03469000
  3480.          MVI       STATE,C'A'          Else remember error [16]         03470000
  3481.          B         RLOOP                                                03471000
  3482. RNN      CLI       RTYPE,AN            SEE IF GOT A NAK                 03472000
  3483.          BNE       RNELSE                                               03473000
  3484. RNAK     MVI       STYPE,AN            SEND A NAK PACKET                03474000
  3485.          XC        LSDAT,LSDAT         NO DATA                          03475000
  3486.          L         R15,=A(SPACK)                                        03476000
  3487.          BALR      R14,R15                                              03477000
  3488.          B         RLOOP               DO NOTHING ON A NAK              03478000
  3489. RNELSE   MVI       STATE,C'A'          ABORT OTHERWISE                  03479000
  3490.          CLI       ERRNUM,S1ERRNUM     Was it a S/1 I/O error [12]      03480000
  3491.          BE        RLOOP               Yes just return [12]             03481000
  3492.          MVI       ERRNUM,X'07'        ILLEGAL PACKET TYPE              03482000
  3493.          B         RLOOP                                                03483000
  3494. RDATA    CLC       NUMTRY,MAXTRY       HAVE WE EXCEEDED OUR LIMIT?      03484000
  3495.          BL        ROK3                                                 03485000
  3496.          MVI       STATE,C'A'          ELSE, ABORT                      03486000
  3497.          B         RLOOP                                                03487000
  3498. ROK3     L         R4,NUMTRY                                            03488000
  3499.          LA        R4,1(R4)            INCREMENT                        03489000
  3500.          ST        R4,NUMTRY           SAVE INCREMENTED COUNTER         03490000
  3501.          L         R15,=A(RPACK)                                        03491000
  3502.          BALR      R14,R15             CALL RPACK                       03492000
  3503.          CLI       RTYPE,AE            ERROR PACKET?                    03493000
  3504.          BNE       RY3                 MAYBE AN ACK                     03494000
  3505.          MVI       ERRNUM,X'0A'        MICRO DIED                       03495000
  3506.          MVI       STATE,C'A'          WE ABORT TOO                     03496000
  3507.          B         RLOOP                                                03497000
  3508. RY3      CLI       RTYPE,AD            IS THIS A DATA PACKET?           03498000
  3509.          BNE       RDF                 MAYBE IT'S AN FNAME PACKET       03499000
  3510.          CLC       SPKNUM,RPKNUM       CHECK FOR RIGHT PACKET           03500000
  3511.          BNE       DIF                                                  03501000
  3512.          L         R15,=A(PTCHR)                                        03502000
  3513.          BALR      R14,R15             PUT CHARACTERS INTO FILE         03503000
  3514.          LTR       R15,R15             CHECK FOR NO ERROR [6]           03504000
  3515.          BZ        OKWR                NO ERROR                         03505000
  3516.          MVI       STATE,C'A'          ABORT ON FILE SYSTEM ERROR       03506000
  3517.          B         RLOOP                                                03507000
  3518. OKWR     MVI       STYPE,AY            ACK PACKET                       03508000
  3519.          XC        LSDAT,LSDAT         NO DATA                          03509000
  3520.          L         R15,=A(SPACK)                                        03510000
  3521.          BALR      R14,R15                                              03511000
  3522.          CLI       STATE,C'A'                                           03512000
  3523.          BE        RABORT                                               03513000
  3524.          MVC       OLDTRY(4),NUMTRY    SAVE NUMTRY'S VALUE IN OLDTRY    03514000
  3525.          XC        NUMTRY,NUMTRY       RESET NUMTRY                     03515000
  3526.          L         R3,SPKNUM                                            03516000
  3527.          LA        R3,1(R3)                                             03517000
  3528.          ST        R3,SPKNUM           INCREMENT COUNTER                03518000
  3529.          NC        SPKNUM(4),=X'0000003F'   MASK TO GET MOD 64          03519000
  3530.          B         RLOOP                                                03520000
  3531. DIF      CLC       OLDTRY,MAXTRY       CAN WE DO IT?                    03521000
  3532.          BL        DIFNUM                                               03522000
  3533.          MVI       STATE,C'A'          AND ABORT                        03523000
  3534.          B         RLOOP                                                03524000
  3535. DIFNUM   L         R4,OLDTRY                                            03525000
  3536.          LA        R4,1(R4)                                             03526000
  3537.          ST        R4,OLDTRY           INCREMENT THIS COUNTER           03527000
  3538.          L         R4,SPKNUM                                            03528000
  3539.          BCTR      R4,0                                                 03529000
  3540.          C         R4,RPKNUM           RPKNUM MUST EQUAL SPKNUM-1       03530000
  3541.          BE        DIFOK                                                03531000
  3542.          MVI       ERRNUM,X'08'        PREVIOUS PACKET MISSING          03532000
  3543.          B         RDN1                SEND A NAK                       03533000
  3544. DIFOK    XC        NUMTRY,NUMTRY       RESET COUNTER TO ZERO            03534000
  3545.          MVI       STYPE,AY            ACK PACKET                       03535000
  3546.          XC        LSDAT,LSDAT         NO DATA                          03536000
  3547.          ST        R4,SPKNUM           DECREMENT TO RESEND PACKET       03537000
  3548.          L         R15,=A(SPACK)                                        03538000
  3549.          BALR      R14,R15             SEND THE PACKET                  03539000
  3550.          CLI       STATE,C'A'                                           03540000
  3551.          BE        RABORT                                               03541000
  3552.          L         R4,SPKNUM                                            03542000
  3553.          LA        R4,1(R4)            ADD ONE                          03543000
  3554.          ST        R4,SPKNUM           RESTORE TO PROPER VALUE          03544000
  3555.          B         RLOOP               AND RETURN                       03545000
  3556. RDF      CLI       RTYPE,AF            SENDING FILENAME AGAIN?          03546000
  3557.          BNE       RDZ                                                  03547000
  3558.          CLC       OLDTRY,MAXTRY       CAN WE DO IT?                    03548000
  3559.          BL        FILOVER             TRYING IT AGAIN                  03549000
  3560.          MVI       STATE,C'A'          IF NO, ABORT                     03550000
  3561.          B         RLOOP                                                03551000
  3562. FILOVER  L         R4,OLDTRY                                            03552000
  3563.          LA        R4,1(R4)                                             03553000
  3564.          ST        R4,OLDTRY           SAVE INCREMENTED VALUE           03554000
  3565.          L         R4,SPKNUM                                            03555000
  3566.          BCTR      R4,0                NEED VALUE OF N-1                03556000
  3567.          C         R4,RPKNUM           SPKNUM-1 MUST EQUAL RPKNUM       03557000
  3568.          BE        FILOK                                                03558000
  3569.          MVI       ERRNUM,X'08'        PREVIOUS PACKET MISSING          03559000
  3570.          B         RDN1                SEND A NAK                       03560000
  3571. FILOK    XC        NUMTRY,NUMTRY       RESET TO ZERO                    03561000
  3572.          XC        LSDAT,LSDAT         NO DATA                          03562000
  3573.          MVI       STYPE,AY            ACK PACKET AGAIN                 03563000
  3574.          ST        R4,SPKNUM           DECREMENT FOR NOW                03564000
  3575.          L         R15,=A(SPACK)                                        03565000
  3576.          BALR      R14,R15                                              03566000
  3577.          CLI       STATE,C'A'                                           03567000
  3578.          BE        RABORT                                               03568000
  3579.          L         R4,SPKNUM                                            03569000
  3580.          LA        R4,1(R4)            ADD ONE                          03570000
  3581.          ST        R4,SPKNUM           RESTORE TO PROPER VALUE          03571000
  3582.          B         RLOOP               AND RETURN                       03572000
  3583. RDZ      CLI       RTYPE,AZ            IS THIS AN EOF PACKET?           03573000
  3584.          BNE       RDN                                                  03574000
  3585.          CLC       SPKNUM,RPKNUM       ARE THEY EQUAL                   03575000
  3586.          BE        RDOK                                                 03576000
  3587.          MVI       ERRNUM,X'08'        PREVIOUS PACKET MISSING          03577000
  3588.          B         RDN1                SEND A NAK                       03578000
  3589. RDOK     CLC       LRDAT,ONE           One piece of data [16]           03579000
  3590.          BNE       RDWR                No go write out file [16]        03580000
  3591.          LA        R3,RDAT             Point to data [16]               03581000
  3592.          CLI       0(R3),AD            "D" for discard [16]             03582000
  3593.          BNE       RDWR                No write out file [16]           03583000
  3594.          LA        R3,FILNAM           Else get filename [16]           03584000
  3595.          FSCLOSE   (R3)                Close the file [16]              03585000
  3596.          FSERASE   (R3)                And delete file [16]             03586000
  3597.          MVI       ERRNUM,X'17'        Receive cancelled [16]           03587000
  3598.          MVI       CXZ,X'FF'           Remember that [16]               03588000
  3599.          B         RDXX                Pick up later on [16]            03589000
  3600. * If data left in buffer when get EOF packet, write remaining           03590000
  3601. * data out to the file.      [1]                                        03591000
  3602. RDWR     CLC       OUTBFPT,ZERO        HOW MUCH DATA LEFT [1]           03592000
  3603.          BE        BUFMT               NONE LEFT, SEND ACK [1]          03593000
  3604.          L         R9,OUTBFPT          NUMBER OF CHARS IN BUFFER [1]    03594000
  3605.          L         R15,=A(OUTBUF)      WRITE OUT BUFFER [1] [6]         03595000
  3606.          BALR      R14,R15             GO TO IT [1]                     03596000
  3607.          LTR       R15,R15             CHECK RETCODE [1]                03597000
  3608.          BZ        BUFMT               WORKED OK [1]                    03598000
  3609.          MVI       STATE,C'A'          FILE SYSTEM ERROR [1]            03599000
  3610.          B         RLOOP               SO DIE [1]                       03600000
  3611. BUFMT    LA        R3,FILNAM                                            03601000
  3612.          FSCLOSE   (R3)                                                 03602000
  3613. RDXX     MVI       STYPE,AY            ACK THE PACKET  [1]              03603000
  3614.          XC        LSDAT,LSDAT         NO DATA                          03604000
  3615.          L         R15,=A(SPACK)                                        03605000
  3616.          BALR      R14,R15                                              03606000
  3617.          MVC       OLDTRY(4),NUMTRY    SAVE NUMTRY'S VALUE HERE         03607000
  3618.          XC        NUMTRY,NUMTRY       AND RESET COUNTER                03608000
  3619.          L         R3,SPKNUM                                            03609000
  3620.          LA        R3,1(R3)                                             03610000
  3621.          ST        R3,SPKNUM           STORE VALUE INCREMENTED BY 1     03611000
  3622.          NC        SPKNUM(4),=X'0000003F'   MASK TO GET MOD 64          03612000
  3623.          MVI       STATE,C'F'          TRY FOR ANOTHER FILE             03613000
  3624.          NI        FLAGS,X'FF'-FLG2    Only change first file [9]       03614000
  3625.          B         RLOOP                                                03615000
  3626. RDN      CLI       RTYPE,AN            DO WE NEED TO SEND A NAK?        03616000
  3627.          BNE       RDELSE                                               03617000
  3628. RDN1     MVI       STYPE,AN            SEND A NAK                       03618000
  3629.          XC        LSDAT,LSDAT         NO DATA                          03619000
  3630.          L         R15,=A(SPACK)                                        03620000
  3631.          BALR      R14,R15                                              03621000
  3632.          B         RLOOP                                                03622000
  3633. RDELSE   MVI       STATE,C'A'          UNRECOGNIZED PACKET - ABORT      03623000
  3634.          CLI       ERRNUM,S1ERRNUM     Was it a S/1 I/O error [12]      03624000
  3635.          BE        RLOOP               Yes just return [12]             03625000
  3636.          MVI       ERRNUM,X'07'        ILLEGAL PACKET TYPE              03626000
  3637.          B         RLOOP                                                03627000
  3638. SAYNO    MVI       STYPE,AN            SEND A NAK PACKET                03628000
  3639.          XC        LSDAT,LSDAT         NO DATA                          03629000
  3640.          MVI       ERRNUM,X'0B'        ILLEGAL FILENAME ERROR           03630000
  3641.          L         R15,=A(SPACK)                                        03631000
  3642.          BALR      R14,R15                                              03632000
  3643.          B         RLOOP                                                03633000
  3644. *                                                                       03634000
  3645. RABORT   LA        R3,FILNAM                                            03635000
  3646.          FSCLOSE   (R3)                CLOSE OPEN FILE                  03636000
  3647.          CLI       ERRNUM,X'0A'        DID THE MICRO DIE?               03637000
  3648.          BE        RNOERRP             NO ERROR PACKET IF SO            03638000
  3649.          CLI       ERRNUM,X'17'        Other side cancel receive [16]   03639000
  3650.          BE        RNOERRP             Yes no error packet [16]         03640000
  3651. * At least try to send an error packet.                                 03641000
  3652. *        CLI       ERRNUM,S1ERRNUM     Was it a S/1 I/O error [12]      03642000
  3653. *        BE        RNOERRP             Yes just return [12]             03643000
  3654.          L         R15,=A(ERRPACK)     Send error packet [13]           03644000
  3655.          BALR      R14,R15             Error number in ERRNUM [13]      03645000
  3656. RNOERRP  LA        R15,4               SET A NON-ZERO RETCODE           03646000
  3657.          B         RECRET              PREPARE TO LEAVE                 03647000
  3658. RCOMP    SR        R15,R15             RETCODE OF ZERO                  03648000
  3659. RECRET   TM        S1FLAGS,ISS1        Is console a S/1? [12]           03649000
  3660.          BZ        RECRET2             No skip reset [12]               03650000
  3661.          TM        LFLAGS,SERVON       In server mode? [13]             03651000
  3662.          BO        RECRET2             Yes don't reset yet [13]         03652000
  3663.          LR        R2,R15              Save retcode [12]                03653000
  3664.          SR        R1,R1               Clear interrupt trapping [12]    03654000
  3665.          L         R15,=A(INTRINI)     [12]                             03655000
  3666.          BALR      R14,R15             [12]                             03656000
  3667.          LR        R15,R2              Restore retcode [12]             03657000
  3668. RECRET2  L         R13,4(R13)                                           03658000
  3669.          L         R14,12(R13)                                          03659000
  3670.          LM        R0,R12,20(R13)                                       03660000
  3671.          BR        14                                                   03661000
  3672. RECSAVE  DS        18F                                                  03662000
  3673. GETFN    MVC       FILNAM(0),0(R8)     Pick up FNAME [22]               03663000
  3674. GETFT    MVC       FILNAM+8(0),0(R5)   PICK UP FTYPE                    03664000
  3675.          LTORG                                                          03665000
  3676.          DROP      R11                                                  03666000
  3677.          DROP      R12                 DON'T NEED THEM ANYMORE          03667000
  3678.          EJECT                                                          03668000
  3679. *                                                                       03669000
  3680. * Write data out to a file. [6]                                         03670000
  3681. PTCHR    CSECT                                                          03671000
  3682.          STM       R14,R12,12(R13)     Do standard linkage              03672000
  3683.          BALR      R12,0                                                03673000
  3684.          USING     *,R12                                                03674000
  3685.          LA        R14,PTSAV                                            03675000
  3686.          ST        R13,4(R14)                                           03676000
  3687.          ST        R14,8(R13)                                           03677000
  3688.          LR        R13,R14                                              03678000
  3689. * USE R11 AS BASE REGISTER FOR THE SHARED DATA AREA                     03679000
  3690.          L         R11,=A(PARMS)                                        03680000
  3691.          USING     PARMS,R11                                            03681000
  3692.          L         R2,=A(OUTBUF)       Routine to call to [22]          03682000
  3693.          ST        R2,MORDEC           dump decoded data [22]           03683000
  3694.          L         R5,LRDAT            Amount of input data             03684000
  3695.          L         R15,=A(DECODE)                                       03685000
  3696.          BALR      R14,R15                                              03686000
  3697.          L         R13,4(R13)                                           03687000
  3698.          L         R14,12(R13)                                          03688000
  3699.          LM        R0,R12,20(R13)      Don't change retcode in R15      03689000
  3700.          BR        R14                                                  03690000
  3701. PTSAV    DS        18F                                                  03691000
  3702.          LTORG                                                          03692000
  3703.          DROP      R11                                                  03693000
  3704.          DROP      R12                 DON'T NEED THEM ANYMORE          03694000
  3705.          EJECT                                                          03695000
  3706. *                                                                       03696000
  3707. * Expects R5 to contain size of input data.  Other registers used:      03697000
  3708. * R4 - quote character, R8 - input buffer pointer, R9 - output          03698000
  3709. * buffer pointer (get value from OUTBFPT).  Expects input to be in      03699000
  3710. * buffer RDAT and write out to buffer whose address in in ARBUF. [6]    03700000
  3711. DECODE   CSECT                                                          03701000
  3712.          STM       R14,R12,12(R13)     Do standard linkage              03702000
  3713.          BALR      R12,0                                                03703000
  3714.          USING     *,R12                                                03704000
  3715.          LA        R14,DECSAV                                           03705000
  3716.          ST        R13,4(R14)                                           03706000
  3717.          ST        R14,8(R13)                                           03707000
  3718.          LR        R13,R14                                              03708000
  3719. * USE R11 AS BASE REGISTER FOR THE SHARED DATA AREA                     03709000
  3720.          L         R11,=A(PARMS)                                        03710000
  3721.          USING     PARMS,R11                                            03711000
  3722.          SR        R4,R4               Use to hold quote char           03712000
  3723.          IC        R4,SQUOTE                                            03713000
  3724.          SR        R8,R8               Input buffer pointer             03714000
  3725.          L         R9,OUTBFPT          Output buffer pointer            03715000
  3726. DECOD0   MVI       RPTCT,X'00'         Reset each time [7]              03716000
  3727.          MVI       RPTVAL,X'00'        Ditto [7]                        03717000
  3728.          SR        R7,R7               Use to pick up char              03718000
  3729.          LTR       R5,R5               Any more data left?              03719000
  3730.          BNZ       DECOD1              Leave if all done                03720000
  3731.          ST        R9,OUTBFPT          Save place in output buffer      03721000
  3732.          SR        R15,R15             OK return code                   03722000
  3733.          B         DECOD8              And return to caller             03723000
  3734. DECOD1   C         R9,MAXOUT           Below max limit [2]              03724000
  3735.          BNL       DECOD7              No, write it out                 03725000
  3736.          CLI       RPTCT,X'00'         Doing a repeat [7]               03726000
  3737.          BE        DECOD11             No so get a char [7]             03727000
  3738.          XC        PAR,PAR             Clear the parity flag [7]        03728000
  3739.          IC        R7,RPTVAL           Get char we're repeating [7]     03729000
  3740.          TM        FLAGS,BINF          In binary mode? [25]             03729100
  3741.          BO        DECOD6              Yes no check for eol [25]        03729200
  3742.          CLI       RPTVAL,ACR          Ascii CR  [25]                   03729300
  3743.          BE        DECOD7              Yes, write another record [25]   03729400
  3744.          CLI       RPTVAL,ALF          Ascii LF [25]                    03729500
  3745.          BE        DECOD7              Yes, write another record [25]   03729600
  3746.          B         DECOD6              Write out to file [7]            03730000
  3747. DECOD11  BCTR      R5,0                Decrement char counter           03731000
  3748.          IC        R7,RDAT(R8)         Pick up a character              03732000
  3749.          XC        PAR,PAR             Assume hi bit=0 [1 start]        03733000
  3750.          CLI       RPTQ,X'00'          Doing repeat quoting [7]         03734000
  3751.          BE        DECOD12             No so skip next part [7]         03735000
  3752.          CLM       R7,B'0001',RPTQ     Picked up repeat quote char? [7] 03736000
  3753.          BNE       DECOD12             No continue processing [7]       03737000
  3754.          LA        R8,1(R8)            Bump input pointer [7]           03738000
  3755.          BCTR      R5,0                Modify buffer count [7]          03739000
  3756.          SR        R7,R7               Zero it out [7]                  03740000
  3757.          IC        R7,RDAT(R8)         Pick up the size [7]             03741000
  3758.          S         R7,=F'32'           Was made printable [7]           03742000
  3759.          STC       R7,RPTCT            Remember no. of repetitions [7]  03743000
  3760.          LA        R8,1(R8)            Bump input pointer [7]           03744000
  3761.          BCTR      R5,0                Modify buffer count [7]          03745000
  3762.          IC        R7,RDAT(R8)         Pick up repeated char [7]        03746000
  3763. DECOD12  CLI       EBQUOT,AN           Are we doing 8-bit quoting?      03747000
  3764.          BE        DECOD2              Nope                             03748000
  3765.          CLI       EBQUOT,AY           Can we do it but aren't?         03749000
  3766.          BE        DECOD2              Yes - so just forget it          03750000
  3767.          CLM       R7,B'0001',EBQUOT   Did we get 8-bit quote char?     03751000
  3768.          BNE       DECOD2              No - continue as usual           03752000
  3769.          BCTR      R5,0                Decrement no. of chars left      03753000
  3770.          LA        R8,1(R8)            Bump input pointer               03754000
  3771.          IC        R7,RDAT(R8)         Get quoted char                  03755000
  3772.          MVI       PAR+3,X'80'         Set hi order bit on [1 end]      03756000
  3773. DECOD2   CR        R7,R4               Is it the quote character?       03757000
  3774.          BNE       DECOD6              No it's a regular char           03758000
  3775.          BCTR      R5,0                Else decrement char count        03759000
  3776.          LA        R8,1(R8)            Bump input pointer               03760000
  3777.          IC        R7,RDAT(R8)         Pick up special char             03761000
  3778.          CLC       PAR,ZERO            If PAR <> 0 don't check [1]      03762000
  3779.          BNE       DECOD4              For CR/LF (it's 8A,8D) [1]       03763000
  3780.          TM        FLAGS,BINF          No check if binary mode [1]      03764000
  3781.          BO        DECOD4              Just skip it [1]                 03765000
  3782.          C         R7,=X'0000004D'     Is it a CR? (CHAR(CR))           03766000
  3783.          BNE       DECOD3              No, check for LF                 03767000
  3784.          MVI       PREV,X'4D'          Yes, remember we saw a CR        03768000
  3785.          LA        R8,1(R8)            Bump input pointer               03769000
  3786.          MVI       RPTVAL,ACR          Set in case of repeats [25]      03769100
  3787.          B         DECOD7              Write out record                 03770000
  3788. DECOD3   C         R7,=X'0000004A'     Should we write out on LF?       03771000
  3789.          BNE       DECOD4              No keep going                    03772000
  3790.          LA        R8,1(R8)            Bump input pointer               03773000
  3791.          CLI       PREV,X'4D'          Was last char CR?                03774000
  3792.          BE        DECOD0              Yes, so ignore LF                03775000
  3793.          MVI       RPTVAL,ALF          Set in case of repeats [25]      03775100
  3794.          B         DECOD7              Nope, so write out record        03776000
  3795. DECOD4   CR        R7,R4               Is it the quote char             03777000
  3796.          BE        DECOD6              Don't convert if yes             03778000
  3797.          CLI       EBQUOT,AN           Doing 8-bit quoting [1 start]    03779000
  3798.          BE        DECOD5              No don't check for quote char    03780000
  3799.          CLI       EBQUOT,AY           Can do it but aren't?            03781000
  3800.          BE        DECOD5              Yup-don't check for quote char   03782000
  3801.          CLM       R7,B'0001',EBQUOT   Is char the 8-bit quote char?    03783000
  3802.          BE        DECOD6              Yes - so don't convert           03784000
  3803.          CLI       RPTQ,X'00'          Doing repeat counts              03785000
  3804.          BE        DECOD5              No check for quote char [7]      03786000
  3805.          CLM       R7,B'0001',RPTQ     Is it the repeat quote char [7]  03787000
  3806.          BE        DECOD6              Yes, don't convert [7]           03788000
  3807. DECOD5   A         R7,O1H              Else add ^O100                   03789000
  3808.          N         R7,=X'0000007F'     Get modulo ^O200                 03790000
  3809. DECOD6   O         R7,PAR              OR in the parity bit [1]         03791000
  3810.          L         R1,ARBUF            Output buffer address [2]        03792000
  3811.          AR        R1,R9               Plus displacement [2]            03793000
  3812.          STC       R7,0(R1)            Store char in buffer [2]         03794000
  3813.          LA        R9,1(R9)            Bump output buffer pointer       03795000
  3814.          LA        R8,1(R8)            Bump input buffer pointer        03796000
  3815.          MVI       PREV,X'00'          Reset                            03797000
  3816.          SR        R3,R3               Clear out for subtract [7]       03798000
  3817.          IC        R3,RPTCT            Get no. of repetitions [7]       03799000
  3818.          BCTR      R3,0                Decrement repeat count [7]       03800000
  3819.          LTR       R3,R3               More repeats to do [7]           03801000
  3820.          BNP       DECOD0              Not positive, get new char [7]   03802000
  3821.          STC       R3,RPTCT            Save modified count [7]          03803000
  3822.          BCTR      R8,0                Re-adjust input buf pointer [7]  03804000
  3823.          STC       R7,RPTVAL           Remember repeated char [7]       03805000
  3824.          B         DECOD1              And write it out again [7]       03806000
  3825. *DECOD7  L         R15,=A(OUTBUF)      Routine to write out record [22] 03807000
  3826. DECOD7   L         R15,MORDEC          Routine to write out record [22] 03808000
  3827.          BALR      R14,R15                                              03809000
  3828.          LTR       R15,R15             Check the return code            03810000
  3829.          BNZ       DECOD8              Return if failed                 03811000
  3830.          XC        OUTBFPT,OUTBFPT     Reset output buffer pointer      03812000
  3831.          SR        R9,R9               Reset output buffer pointer      03813000
  3832.          SR        R3,R3               Clear out for subtract [7]       03814000
  3833.          IC        R3,RPTCT            Get no. of repetitions [7]       03815000
  3834.          CLI       RPTVAL,ACR          Ended with CR or LF? [25]        03815100
  3835.          BE        DECOD71             Yes do something else [25]       03815200
  3836.          CLI       RPTVAL,ALF          Or did we end 'cause [25]        03815300
  3837.          BE        DECOD71             hit max lrecl [25]               03815400
  3838.          LTR       R3,R3               More repeats to do [7]           03816000
  3839.          BP        DECOD1                                               03817000
  3840.          B         DECOD0              And get more input               03818000
  3841. DECOD71  BCTR      R3,0                One down [25]                    03818100
  3842.          LTR       R3,R3               Any more to go? [25]             03818200
  3843.          BNP       DECOD0              No, all done [25]                03818300
  3844.          STC       R3,RPTCT            Remember new count [25]          03818400
  3845.          B         DECOD1              And get new char [25]            03818500
  3846. DECOD8   L         R13,4(R13)                                           03819000
  3847.          L         R14,12(R13)                                          03820000
  3848.          LM        R0,R12,20(R13)      Don't change retcode in R15      03821000
  3849.          BR        R14                                                  03822000
  3850. NULDMP   BR        R14                 Null routine [22]                03823000
  3851. DECSAV   DS        18F                                                  03824000
  3852.          LTORG                                                          03825000
  3853.          DROP      R11                                                  03826000
  3854.          DROP      R12                 DON'T NEED THEM ANYMORE          03827000
  3855.          EJECT                                                          03828000
  3856. *                                                                       03829000
  3857. * Write out a buffer full of data. Expects R9 to contain the number     03830000
  3858. * of characters in the record. [6]                                      03831000
  3859. OUTBUF   CSECT                                                          03832000
  3860.          STM       R14,R12,12(R13)     Do standard linkage              03833000
  3861.          BALR      R12,0                                                03834000
  3862.          USING     *,R12                                                03835000
  3863.          LA        R14,OUTSAV                                           03836000
  3864.          ST        R13,4(R14)                                           03837000
  3865.          ST        R14,8(R13)                                           03838000
  3866.          LR        R13,R14                                              03839000
  3867. * USE R11 AS BASE REGISTER FOR THE SHARED DATA AREA                     03840000
  3868.          L         R11,=A(PARMS)                                        03841000
  3869.          USING     PARMS,R11                                            03842000
  3870.          L         R6,LRECL            Use to hold lrecl [2]            03843000
  3871.          LTR       R10,R9              Any data or bare CR?             03844000
  3872.          BNZ       OUTBF0              Yes, there's data                03845000
  3873.          L         R1,ARBUF            Else, get addr of buffer [2]     03846000
  3874.          MVI       0(R1),X'20'         Make first char a space [2]      03847000
  3875.          LA        R10,1(R10)          Length of one (fake blank line)  03848000
  3876. OUTBF0   TM        FLAGS,BINF          Binary data file? [1]            03849000
  3877.          BO        OUTBF3              If so skip translation [1]       03850000
  3878.          LR        R7,R10              Save size in R7 [2]              03851000
  3879.          LR        R1,R10              Here too [2]                     03852000
  3880.          L         R3,ARBUF            Where translating starts [2]     03853000
  3881. OUTBF1   BCTR      R1,0                Subtract 1 for EX command        03854000
  3882.          C         R1,=F'255'          Max for TRANSLATE is 256 [2]     03855000
  3883.          BL        OUTBF2              If is under max then is OK [2]   03856000
  3884.          LA        R1,255              Else, set to max [2]             03857000
  3885. OUTBF2   EX        R1,TRNS             EBCDIC to ASCII translation      03858000
  3886.          C         R7,=F'256'          Chars left to translate? [2]     03859000
  3887.          BNH       OUTBF3              Nope, we're done [2]             03860000
  3888.          LA        R3,256(R3)          X-late next group of chars [2]   03861000
  3889.          S         R7,=F'256'          Decr chars left to x-late [2]    03862000
  3890.          LR        R1,R7               No. of chars left to x-LATE [2]  03863000
  3891.          B         OUTBF1              Translate some more [2]          03864000
  3892. OUTBF3   LA        R3,FILNAM                                            03865000
  3893.          CLI       RFM,C'V'            Is it variable format?           03866000
  3894.          BE        OUTBF5              Yes so leave data as is          03867000
  3895.          CR        R10,R6              If fixed, cannot exceed lrecl    03868000
  3896.          BH        OUTBF4              Ignore data after lrecl value    03869000
  3897.          BE        OUTBF5              Nope, it's just right            03870000
  3898.          LR        R2,R6               Else, get lrecl size             03871000
  3899.          SR        R2,R10              Pad with this many spaces        03872000
  3900.          L         R0,ARBUF            Start of buffer [2]              03873000
  3901.          AR        R0,R10              Where to start padding [2]       03874000
  3902.          LR        R1,R2               Amount to pad by [2]             03875000
  3903.          L         R15,=X'00000040'    Pad with spaces [2]              03876000
  3904.          TM        FLAGS,BINF          In binary mode [1]               03877000
  3905.          BNO       OUTBF31             No so just pad [1]               03878000
  3906.          SR        R15,R15             Pad with nulls [1]               03879000
  3907. OUTBF31  MVCL      R0,R14              Do it [2]                        03880000
  3908. OUTBF4   LR        R10,R6              Length has to be this size       03881000
  3909. OUTBF5   SR        R6,R6                                                03882000
  3910.          IC        R6,RFM              RECFM has to be in a register    03883000
  3911.          L         R7,ARBUF            Addr of data buffer [2]          03884000
  3912.          FSWRITE   (R3),BUFFER=(R7),BSIZE=(R10),RECFM=(R6),FORM=E [2]   03885000
  3913.          LTR       R7,R15              Check retcode                    03886000
  3914.          BZ        OUTBF7              Is OK so get next record         03887000
  3915.          L         R15,=F'-1'          Bad retcode                      03888000
  3916.          C         R7,=A(ERCOD)        Is the disk read-only?           03889000
  3917.          BNE       OUTBF6              No check different error         03890000
  3918.          MVI       ERRNUM,X'0E'        Yes, set error type              03891000
  3919.          B         OUTBF7                                               03892000
  3920. OUTBF6   MVI       ERRNUM,X'0F'        Assume a RECFM conflict          03893000
  3921.          C         R7,=F'16'           File exists w/dif RECFM          03894000
  3922.          BE        OUTBF7                                               03895000
  3923.          MVI       ERRNUM,X'06'        Maybe disk full error            03896000
  3924.          C         R7,=F'13'           Yup that's it                    03897000
  3925.          BE        OUTBF7                                               03898000
  3926.          MVI       ERRNUM,X'19'        General write error              03899000
  3927. OUTBF7   L         R13,4(R13)                                           03900000
  3928.          L         R14,12(R13)                                          03901000
  3929.          LM        R0,R12,20(R13)      Don't change retcode in R15      03902000
  3930.          BR        R14                                                  03903000
  3931. OUTSAV   DS        18F                                                  03904000
  3932. TRNS     TR        0(0,R3),ATOE        BACK FROM ASCII TO EBCDIC        03905000
  3933.          LTORG                                                          03906000
  3934.          DROP      R11                                                  03907000
  3935.          DROP      R12                 DON'T NEED THEM ANYMORE          03908000
  3936. *                                                                       03909000
  3937. * Send error packet.  Error number is in variable errnum. [13]          03910000
  3938. ERRPACK  CSECT                                                          03911000
  3939.          STM       R14,R12,12(R13)     Do standard linkage              03912000
  3940.          BALR      R12,0                                                03913000
  3941.          USING     *,R12                                                03914000
  3942.          LA        R14,ERPSAV                                           03915000
  3943.          ST        R13,4(R14)                                           03916000
  3944.          ST        R14,8(R13)                                           03917000
  3945.          LR        R13,R14                                              03918000
  3946. * USE R11 AS BASE REGISTER FOR THE SHARED DATA AREA                     03919000
  3947.          L         R11,=A(PARMS)                                        03920000
  3948.          USING     PARMS,R11                                            03921000
  3949.          MVI       STYPE,AE            Error packet                     03922000
  3950.          MVC       LSDAT(4),=F'20'     All msgs are this long           03923000
  3951.          MVC       SPKNUM(4),RPKNUM    Synch packet numbers             03924000
  3952.          SR        R5,R5                                                03925000
  3953.          IC        R5,ERRNUM           Get right message number         03926000
  3954.          M         R4,=F'20'           Offset := ERRNUM * 20            03927000
  3955.          LA        R5,ERRTAB(R5)                                        03928000
  3956.          MVC       SDAT(20),0(R5)      Put data here                    03929000
  3957.          TR        SDAT(20),ETOA                                        03930000
  3958.          L         R15,=A(SPACK)                                        03931000
  3959.          BALR      R14,R15             Send error packet                03932000
  3960.          L         R13,4(R13)                                           03933000
  3961.          L         R14,12(R13)                                          03934000
  3962.          LM        R0,R12,20(R13)      Don't change retcode in R15      03935000
  3963.          BR        R14                                                  03936000
  3964. ERPSAV   DS        18F                                                  03937000
  3965.          LTORG                                                          03938000
  3966.          DROP      R11                                                  03939000
  3967.          DROP      R12                 DON'T NEED THEM ANYMORE          03940000
  3968. *                                                                       03941000
  3969. * Handle screen I/O if going via Series/1  [12 start]                   03942000
  3970. SCRNIO   CSECT                                                          03943000
  3971.          USING     SCRNIO,R15          establish addressability         03944000
  3972.          STM       R0,R14,SCRNSAV      save caller's reg                03945000
  3973.          LR        R12,R15             switch base reg                  03946000
  3974.          DROP      R15                                                  03947000
  3975.          USING     SCRNIO,R12                                           03948000
  3976.          L         R11,=A(PARMS)       point to data area               03949000
  3977.          USING     PARMS,R11                                            03950000
  3978.          LH        R2,CONSADDR         get console addr                 03951000
  3979. CLRSTAT  EQU       *                                                    03952000
  3980.          TIO       0(R2)               any previous business?           03953000
  3981.          BC        6,CLRSTAT           busy: loop                       03954000
  3982.          BC        1,SCRNERR           not operational: error           03955000
  3983. DODIAG   EQU       *                                                    03956000
  3984.          DIAG      R1,R2,X'0058'       start I/O via diagnose           03957000
  3985.          BC        8,WAITCOMP          ok: wait for completion          03958000
  3986.          BC        2,DODIAG            busy: try again                  03959000
  3987.          B         SCRNERR             CSW stored or error              03960000
  3988. WAITCOMP EQU       *                                                    03961000
  3989.          WAITD     CON1                wait for I/O to complete         03962000
  3990.          CLI       CONSCHAN,X'00'      did an error occur?              03963000
  3991.          BNE       SCRNERR             yes: skip                        03964000
  3992.          CLI       CONSUNIT,CHEND      just a channel end?              03965000
  3993.          BE        WAITCOMP            yes: wait for device end         03966000
  3994.          CLI       CONSUNIT,CPBRK      did CP break in?                 03967000
  3995.          BE        SCRNERR             yes: we're stuck now             03968000
  3996.          LH        R15,CONSBYTC        get I/O byte count               03969000
  3997.          CLI       CONSUNIT,DEVEND     is it a device end?              03970000
  3998.          BE        SCRNRET             yes: return okay                 03971000
  3999.          CLI       CONSUNIT,CHEND+DEVEND   chan end & dev end?          03972000
  4000.          BE        SCRNRET             yes: return okay                 03973000
  4001.          CLI       CONSUNIT,ATTN       attention?                       03974000
  4002.          BE        SCRNRET             yes: return okay                 03975000
  4003. SCRNERR  EQU       *                   some type of err occurred        03976000
  4004.          MVC       ERRCSW,CONSCSW      copy CSW in error                03977000
  4005.          SR        R15,R15             return error code of -1          03978000
  4006.          BCTR      R15,0                                                03979000
  4007. SCRNRET  EQU       *                                                    03980000
  4008.          LM        R0,R14,SCRNSAV      restore caller's regs            03981000
  4009.          BR        R14                 return to caller                 03982000
  4010. *                                                                       03983000
  4011. SCRNSAV  DS        15F                 reg save area                    03984000
  4012. *                                                                       03985000
  4013.          LTORG                                                          03986000
  4014.          DROP      R12                                                  03987000
  4015.          DROP      R11                 [12 end]                         03988000
  4016. * [12 start]                                                            03989000
  4017. * If R1 is non-zero, get values user has set for MSG, WNG and IMSG      03990000
  4018. * and then set them off for the duration of the program.  If R1 is      03991000
  4019. * zero, then reset to the values the user originally had.               03992000
  4020. SETMSGS  CSECT                                                          03993000
  4021.          USING     SETMSGS,R15                                          03994000
  4022.          STM       R0,R14,MSGSAV       save caller's regs               03995000
  4023.          LR        R12,R15             switch addressability            03996000
  4024.          DROP      R15                                                  03997000
  4025.          USING     SETMSGS,R12                                          03998000
  4026.          L         R11,=A(PARMS)       point to data area               03999000
  4027.          USING     PARMS,R11                                            04000000
  4028.          LTR       R1,R1               Setting or clearing              04001000
  4029.          BZ        SETM5               Go to clearing                   04002000
  4030.          LA        R2,QSET             point to CP QUERY command        04003000
  4031.          LA        R4,L'QSET           get length of command            04004000
  4032.          ICM       R4,B'1000',=X'40'   flag we want resp in buff        04005000
  4033.          LA        R3,QSBUF            Put response here                04006000
  4034.          LA        R5,L'QSBUF          its long enough for what we      04007000
  4035.          DIAG      R2,R4,X'0008'       need here                        04008000
  4036.          LR        R1,R5               get length of response and       04009000
  4037.          LA        R2,QSBUF            addr of response                 04010000
  4038.          BZ        SETM0               skip if response fit in buf      04011000
  4039.          LA        R1,L'QSBUF          else get length of buffer        04012000
  4040.          SR        R1,R5               and subt num overflow            04013000
  4041. SETM0    LA        R3,MSG3             get len-1,chars of token         04014000
  4042.          BAL       R10,GETSET          we're looking for                04015000
  4043.          CLC       CON,0(R4)           is following one "ON"?           04016000
  4044.          BNE       SETM1               no: skip                         04017000
  4045.          OI        LFLAGS,FMSGON       yes: flag SET MSG ON             04018000
  4046. SETM1    LA        R3,WNG3             get len-1,chats of token         04019000
  4047.          BAL       R10,GETSET          we're looking for                04020000
  4048.          CLC       CON,0(R4)           is following one "ON"?           04021000
  4049.          BNE       SETM2               no: skip                         04022000
  4050.          OI        LFLAGS,FWNGON       yes: flag SET WNG ON             04023000
  4051. SETM2    LA        R3,IMSG4            get len-1,chars of token         04024000
  4052.          BAL       R10,GETSET          we're looking for                04025000
  4053.          CLC       CON,0(R4)           is following one "ON"?           04026000
  4054.          BNE       SETM3               no: skip                         04027000
  4055.          OI        LFLAGS,FIMSGON      yes: flag SET IMSG ON            04028000
  4056. SETM3    LA        R2,MSGOFF           Turn off MSG's                   04029000
  4057.          LA        R4,L'MSGOFF         via diagnose X'08'               04030000
  4058.          DIAG      R2,R4,X'0008'                                        04031000
  4059.          LA        R2,WNGOFF           Ditto for WNG's                  04032000
  4060.          LA        R4,L'WNGOFF                                          04033000
  4061.          DIAG      R2,R4,X'0008'                                        04034000
  4062.          LA        R2,IMSGOFF          Ditto for IMSG's                 04035000
  4063.          LA        R4,L'IMSGOFF                                         04036000
  4064.          DIAG      R2,R4,X'0008'                                        04037000
  4065. SETM4    LM        R0,R12,MSGSAV       restore caller's regs            04038000
  4066.          BR        R14                 return                           04039000
  4067. *                                                                       04040000
  4068. SETM5    TM        LFLAGS,FMSGON       was CP SET MSG ON?               04041000
  4069.          BZ        SETM6               no: skip                         04042000
  4070.          LA        R2,MSGON            yes: turn it ON via              04043000
  4071.          LA        R4,L'MSGON          diagnose X'08'                   04044000
  4072.          DIAG      R2,R4,X'0008'                                        04045000
  4073. SETM6    TM        LFLAGS,FWNGON       was CP SET WNG ON?               04046000
  4074.          BZ        SETM7               no: skip                         04047000
  4075.          LA        R2,WNGON            yes: turn it ON via              04048000
  4076.          LA        R4,L'WNGON          diagnose X'08'                   04049000
  4077.          DIAG      R2,R4,X'0008'                                        04050000
  4078. SETM7    TM        LFLAGS,FIMSGON      was CP SET IMSG ON?              04051000
  4079.          BZ        SETM4               no: done                         04052000
  4080.          LA        R2,IMSGON           yes: turn it ON via              04053000
  4081.          LA        R4,L'IMSGON         diagnose X'08'                   04054000
  4082.          DIAG      R2,R4,X'0008'                                        04055000
  4083.          B         SETM4               And return                       04056000
  4084. *                                                                       04057000
  4085. * Parse the "CP Q SET" response string:                                 04058000
  4086. * On entry:    R1 = remaining length of resp                            04059000
  4087. *              R2 = addr of next char in resp                           04060000
  4088. *              R3 = ptr to <len-1,"target">                             04061000
  4089. * On exit:     R1 = remaining length of resp                            04062000
  4090. *              R2 = addr of char past sub-resp string                   04063000
  4091. *              R4 = addr of token AFTER find (ON|OFF|...)               04064000
  4092. GETSET   EQU       *                                                    04065000
  4093.          BAL       R9,SKPWHITE         scan over white space            04066000
  4094.          SR        R4,R4               clear for char load              04067000
  4095.          IC        R4,0(,R3)           get len-1 of target              04068000
  4096.          EX        R4,VARLCLC          is it right one?                 04069000
  4097.          BE        GETSETF             yes: skip                        04070000
  4098.          BAL       R9,SKP2EOS          no: skip past sub-resp           04071000
  4099.          B         GETSET              string and loop                  04072000
  4100. GETSETF  EQU       *                                                    04073000
  4101.          LA        R2,1(R4,R2)         scan past matched token          04074000
  4102.          BAL       R9,SKPWHITE         scan past white space            04075000
  4103.          LA        R4,0(,R2)           ret addr of next token           04076000
  4104.          BAL       R9,SKP2EOS          but bump ptr past end of         04077000
  4105.          BR        R10                 sub-resp string                  04078000
  4106. SKPWHITE EQU       *                                                    04079000
  4107.          CLI       0(R2),C' '          is it a blank?                   04080000
  4108.          BE        SKPWNXT             yes: scan over it                04081000
  4109.          CLI       0(R2),X'15'         is it a NewLine?                 04082000
  4110.          BNER      R9                  no - at token: return            04083000
  4111. SKPWNXT  EQU       *                                                    04084000
  4112.          LA        R2,1(,R2)           bump ptr to next char            04085000
  4113.          BCT       R1,SKPWHITE         decr count and loop              04086000
  4114.          LA        R4,=X'FF'           none left: ret ptr to            04087000
  4115.          BR        R10                 unmatchable string               04088000
  4116. SKP2EOS  EQU       *                                                    04089000
  4117.          CLI       0(R2),C','          is it a comma?                   04090000
  4118.          BE        SKP2EOSB            yes: skip                        04091000
  4119.          CLI       0(R2),X'15'         is it a NewLine?                 04092000
  4120.          BE        SKP2EOSB            yes: skip                        04093000
  4121.          LA        R2,1(,R2)           no: scan over char               04094000
  4122.          BCT       R1,SKP2EOS          decr count and loop              04095000
  4123.          LA        R4,=X'FF'           none left: ret ptr to            04096000
  4124.          BR        R10                 unmatchable string               04097000
  4125. SKP2EOSB EQU       *                   reached end of sub-resp          04098000
  4126.          LA        R2,1(,R2)           point 1 past sub-resp            04099000
  4127.          BCTR      R1,R9               decr count and return            04100000
  4128.          LA        R4,=X'FF'           none left: ret ptr to            04101000
  4129.          BR        R10                 unmatchable string               04102000
  4130. *                                                                       04103000
  4131. VARLCLC  CLC       0(*-*,R2),1(R3)                                      04104000
  4132. *                                                                       04105000
  4133. MSGSAV   DS        15F                 save caller's regs here          04106000
  4134. QSET     DC        C'QUERY SET'        CP QUERY SET command             04107000
  4135. CON      DC        C'ON'               check is SET xxx is "ON"         04108000
  4136. MSG3     DC        AL1(3-1),C'MSG'     len-1, token name                04109000
  4137. WNG3     DC        AL1(3-1),C'WNG'     ditto                            04110000
  4138. IMSG4    DC        AL1(4-1),C'IMSG'    ditto                            04111000
  4139. MSGOFF   DC        C'SET MSG OFF'      CP commands to alter             04112000
  4140. MSGON    DC        C'SET MSG ON'       SET MSG value                    04113000
  4141. WNGOFF   DC        C'SET WNG OFF'                                       04114000
  4142. WNGON    DC        C'SET WNG ON'                                        04115000
  4143. IMSGOFF  DC        C'SET IMSG OFF'                                      04116000
  4144. IMSGON   DC        C'SET IMSG ON'                                       04117000
  4145.          LTORG                                                          04118000
  4146.          DROP      R11                                                  04119000
  4147.          DROP      R12                                                  04120000
  4148.          EJECT                         [12 end]                         04121000
  4149. *                                                                       04122000
  4150. * Initialize for going via Series/1. [12 start]                         04123000
  4151. INTRINI  CSECT                                                          04124000
  4152.          USING     INTRINI,R15         establish addressability         04125000
  4153.          STM       R0,R14,INTRSAV      save caller's regs               04126000
  4154.          LR        R12,R15                                              04127000
  4155.          DROP      R15                                                  04128000
  4156.          USING     INTRINI,R12                                          04129000
  4157.          L         R11,=A(PARMS)       get base for data area           04130000
  4158.          USING     PARMS,R11                                            04131000
  4159.          LTR       R1,R1               anything in R1?                  04132000
  4160.          BZ        INTRCLR             no: do clean up                  04133000
  4161.          TM        S1FLAGS,S1INIT      Initialized already? [13]        04134000
  4162.          BO        INTRRET             Yes just leave [13]              04135000
  4163.          OI        S1FLAGS,S1INIT      Else init and flag as done [13]  04136000
  4164.          XC        CONSCSW,CONSCSW     clear any previous data          04137000
  4165.          SR        R2,R2               and any prev byte count          04138000
  4166.          BCTR      R2,0                (set len to -1)                  04139000
  4167.          ST        R2,S1RDBYTC                                          04140000
  4168.          WAITT                         Clear screen so don't get put    04141000
  4169.          SR        R0,R0                                                04142000
  4170.          LH        R0,CONSADDR         Get console address              04143000
  4171.          N         0,=F'255'                                            04144000
  4172.          LA        1,CLRCCW            into "HOLDING" on first I/O      04145000
  4173.          DIAG      1,0,X'58'           if there are any CP msgs on      04146000
  4174.          WAITT                         the screen                       04147000
  4175.          HNDINT    SET,(CON1,CHNDLR,009,WAIT)                           04148000
  4176.          LA        R1,CLRRDY            This I/O puts the screen        04149000
  4177.          TM        LFLAGS,SERVON        into MORE or HOLDING            04150000
  4178.          BNO       INTX0                with a ready or server          04151000
  4179.          LA        R1,CLRSRV            message                         04152000
  4180. INTX0    L         R15,=A(SCRNIO)                                       04153000
  4181.          BALR      R14,R15                                              04154000
  4182.          B         INTRRET                                              04155000
  4183. INTRCLR  EQU       *                                                    04156000
  4184.          HNDINT    CLR,(CON1)                                           04157000
  4185.          NI        S1FLAGS,X'FF'-S1INIT   Turn off flag [13]            04158000
  4186. INTRRET  EQU       *                                                    04159000
  4187.          LM        R0,R14,INTRSAV      restore caller's regs            04160000
  4188.          BR        R14                 return to caller                 04161000
  4189.          DS        0D                  CCW's to clear screen            04162000
  4190. CLRRDY   DC        X'29',AL3(RDYMSG),AL1(SLI),X'80',AL2(LRDYMSG)        04163000
  4191. RDYMSG   DC        AL1(X'C0'+ALARM),AL1(SBA),X'4040'                    04164000
  4192.          DC        C'Ready for file transfer...'                        04165000
  4193. LRDYMSG  EQU       *-RDYMSG                                             04166000
  4194.          DS        0D                  CCW's to clear screen            04167000
  4195. CLRSRV   DC        X'29',AL3(SRVMSG),AL1(SLI),X'80',AL2(LSRVMSG)        04168000
  4196. SRVMSG   DC        AL1(X'C0'+ALARM),AL1(SBA),X'4040'                    04169000
  4197.          DC        C'Entering server mode .....'                        04170000
  4198. LSRVMSG  EQU       *-SRVMSG                                             04171000
  4199.          DS        0D                                                   04172000
  4200. CLRCCW   DC        X'19',AL3(0),X'20',X'FF',AL2(1)                      04173000
  4201. INTRSAV  DS        15F                 reg save area                    04174000
  4202.          DROP      R11                                                  04175000
  4203.          DROP      R12                                                  04176000
  4204. *                                                                       04177000
  4205. * Console interrupt routine:                                            04178000
  4206. CHNDLR   DS        0H                                                   04179000
  4207.          USING     CHNDLR,R15          estab address.                   04180000
  4208.          STM       R10,R12,CHNDSAV     save only reg's we need to       04181000
  4209.          LR        R12,R15                                              04182000
  4210.          DROP      R15                                                  04183000
  4211.          USING     CHNDLR,R12                                           04184000
  4212.          L         R11,=A(PARMS)       point to data area               04185000
  4213.          USING     PARMS,R11                                            04186000
  4214.          STM       R2,R3,CONSCSW       save CSW from interrupt          04187000
  4215.          LA        R2,0(,R2)           display CCW addr in PER          04188000
  4216.          SRL       R3,16               isolate unit & chan status       04189000
  4217.          LA        R3,0(,R3)           so they show up in PER           04190000
  4218.          SR        R15,R15             R15=0-> intrpt proc complete     04191000
  4219.          CLI       CONSUNIT,CHEND      was it only a channel end?       04192000
  4220.          BNE       CHNDRET             no: exit                         04193000
  4221.          LA        R15,1               yes: flag we expect another      04194000
  4222. CHNDRET  EQU       *                                                    04195000
  4223.          LM        R10,R12,CHNDSAV     restore reg's                    04196000
  4224.          BR        R14                 return to CMS intrpt handler     04197000
  4225. CHNDSAV  DS        3F                  reg save area                    04198000
  4226.          LTORG                                                          04199000
  4227.          DROP      R12                                                  04200000
  4228.          DROP      R11                 [12 end]                         04201000
  4229.          END       KERMIT                                               04202000
  4230.