home *** CD-ROM | disk | FTP | other *** search
/ Columbia Kermit / kermit.zip / music / imusic.asm next >
Assembly Source File  |  2020-01-01  |  117KB  |  2,615 lines

  1.          PRINT NOGEN
  2.          MACRO
  3. &LABEL   WRTERM &MSG
  4.          LCLA  &CNT
  5.          LCLC  &LEN
  6. &CNT     SETA  K'&MSG-2
  7. &LEN     SETC  '&CNT'
  8. &LABEL   XC    IOBUF,IOBUF              BLANK OUT IOBUF
  9.          MVI   IOBUF,C' '
  10.          MFSET REPLY,IO,R=(WR)
  11.          MVC   IOBUF+1(&LEN),=C&MSG
  12.          LA    R2,&LEN+1
  13.          ST    R2,IOARG+4
  14.          MFREQ REPLY
  15.          MEND
  16.          PRINT NOGEN
  17. KERMIT   TITLE     'KERMIT-MUSIC'
  18. KERMIT   CSECT
  19. * KERMIT   -
  20. *
  21. *  Kermit - KL10 Error-free Reciprocol Micro Interface Transfer
  22. *  MUSIC version 1.2
  23. *
  24. *  This program is the IBM MUSIC side of a file transfer system.
  25. *  It can be used to transfer files between a micro and a system
  26. *  running MUSIC under VM/SP.
  27. *  See the KERMIT manual for the complete program specifications
  28. *  to which this program and any other component of the system
  29. *  must adhere.
  30. *
  31. *  Marie Schriefer, Indiana University - Purdue University, Indianaplis
  32. *  October, 1984
  33. *  This version of Kermit was created by modifying the VM/CMS Kermit
  34. *  from March 1982.
  35. *
  36. *  This latest version of 12-11-85, will support the IBM SERIES1/7171
  37. *  protocol device. Changes made by Tulane University.
  38. *  Contact John Voigt, Tulane University Computer Services Dept.
  39. *          Room 102, Richardson Bldg, New Orleans LA 70118-5698
  40. *          <SYSBJAV%TCSVM.BITNET@WICSVM.ARPA>
  41. *
  42. * Permission is granted to any individual or institution to copy
  43. * or use this program, except for explicitly commercial purposes.
  44. *
  45. * Note that this version has only been tested using the IBM PC version
  46. * of Kermit as the remote side.
  47. *
  48.          EJECT
  49. * REGISTER USAGE -
  50. * R1 -
  51. * R2 -
  52. * R3 -
  53. * R4 -
  54. * R5 -
  55. * R6 -
  56. * R7 -
  57. * R8 -
  58. * R9 -
  59. * R10 -
  60. * R11 - BASE REGISTER FOR GLOBAL DATA AREA
  61. * R12 - PROGRAM BASE
  62. * R13 - SAVE AREA
  63. * R14 - SUBROUTINE LINKAGE
  64. * R15 - SUBROUTINE LINKAGE
  65. *
  66. * EXTERNAL MACROS/MODULES CALLED -
  67. *  The following MACLIBs are needed to assemble this:
  68. *       $MCM.MACLIB, $MCS.MACLIB
  69. *
  70. *
  71. *
  72.          SPACE
  73.          REGS
  74.          MUSVC
  75.          SPACE
  76. SOH      EQU       X'01'               ^a FOR START OF HEADER CHAR
  77. SBA      EQU       X'11'               FOR SERIES1/7171
  78. AD       EQU       68                  DATA PACKET (ASCII 'D')
  79. AN       EQU       78                  NAK
  80. AZ       EQU       90                  EOF PACKET
  81. AS       EQU       83                  INIT PACKET
  82. AY       EQU       89                  ACK
  83. AF       EQU       70                  FILE PACKET
  84. AB       EQU       66                  BREAK PACKET
  85. AE       EQU       69                  ERROR PACKET
  86. CR       EQU       X'0D'               MUSIC'S CARRIAGE RETURN
  87. FLG1     EQU       X'80'               INTERRUPT SENT FROM MICRO
  88. FLG2     EQU       X'40'               OVERWRITE SENT FILENAME?
  89. FLG3     EQU       X'20'               ONE = SENT ONLY PARTIAL RECORD
  90. FLG4     EQU       X'10'               NAK FROM MICRO(0) OR RPACK(1)?
  91. FLG5     EQU       X'08'               FILE 'FILNAM' IS NOW OPEN
  92. FLG6     EQU       X'04'               END-OF-FILE FOUND
  93. ISS1     EQU       X'01'               series 1/7171 terminal
  94. S1INIT   EQU       X'80'               series 1 initialized
  95.          EJECT
  96. KERMIT   CSECT
  97.          STM       R14,R12,12(R13)     SAVE REGS
  98.          BALR      R12,0               ESTABLISH
  99.          USING     *,R12                  ADDRESSABILITY
  100.          LA        R14,KSAVE
  101.          ST        R13,4(R14)
  102.          ST        R14,8(R13)
  103.          LR        R13,R14
  104. *
  105. * USE R11 AS BASE REGISTER FOR THE SHARED DATA AREA
  106.          L         R11,=A(PARMS)
  107.          USING     PARMS,R11
  108.          L         R15,=A(INIT)
  109.          BALR      R14,R15             CALL THE INITIALIZATION
  110.          SR        R15,R15             ZERO RC INITIALLY (IF EXIT)
  111. *
  112. OPENTERM MFSET REPLY,OPEN,R=(RDOK,WROK,DDORDS,ENQSHR)   OPEN
  113.          MFREQ REPLY                                      TERMINAL
  114.          CALL  NPRMPT                  DON'T WRITE OUT MUSIC PROMPT
  115. PROMPT   WRTERM    'KERMIT-MUSIC>'     WRITE PROMPT
  116.          MFSET REPLY,IO,R=(RD,FILL)    SET FOR READ
  117.          XC    IOBUF,IOBUF             CLEAR BUFFER
  118.          MVC   IOARG+4,IOBUFLEN
  119.          CALL  TRIN                    TRANSLATE INPUT
  120.          MFREQ REPLY                   READ
  121. *
  122. *        PARSE INPUT INTO 1 TO 3 WORDS
  123. *
  124.          CALL      NOTRIN
  125.          MVC       COMMAND,BLANKS      MOVE BLANKS TO COMMAND
  126.          MVC       WORD2,BLANKS
  127.          MVC       WORD3,BLANKS
  128.          LA        R1,IOBUF            POINT TO INPUT BUFFER
  129.          LA        R15,FINDWORD        GO FIND COMMAND
  130.          BALR      R14,R15             BRANCH
  131.          LTR       R4,R4               COMMAND FOUND?
  132.          BZ        PROMPT              NO, GO PROMPT
  133.          CH        R4,=H'3'            COMMAND LENGTH GREATER THAN 3?
  134.          BNH       MOVEOK              NO, BRANCH
  135.          LA        R4,3                MOVE ONLY 3 CHARS OF COMMAND
  136. MOVEOK   DS        0H
  137.          BCTR      R4,0                SUBTRACT ONE FOR EXECUTE
  138.          EX        R4,MOVECMD          MOVE COMMAND
  139.          LA        R15,FINDWORD        GO FIND NEXT WORD
  140.          BALR      R14,R15
  141.          LTR       R4,R4               WORD FOUND?
  142.          BZ        CMDCHK              NO, GO CHECK COMMAND
  143.          CH        R4,=H'17'           GREATER THAN 22?
  144.          BH        LENGERR             YES, GO GIVE ERROR
  145.          ST        R4,WORD2LEN         SAVE THE LENGTH
  146.          BCTR      R4,0                SUBTRACT ONE FOR EXECUTE
  147.          EX        R4,MOVEWRD2         NO, MOVE TO WORD TWO
  148.          LA        R15,FINDWORD        GO GET NEXT WORD
  149.          BALR      R14,R15             BRANCH
  150.          LTR       R4,R4               WORD FOUND?
  151.          BZ        CMDCHK              NO, GO PROCESS COMMAND
  152.          CH        R4,=H'17'           GREATER THAN 17?
  153.          BNH       MOVEOK3             NO, GO DO MOVE
  154.          LA        R4,17               YES, TRUNCATE TO 8
  155. MOVEOK3  DS        0H
  156.          ST        R4,WORD3LEN         SAVE LENGTH OF WORD
  157.          BCTR      R4,0                SUBTRACT ONE FOR EXECUTE
  158.          EX        R4,MOVEWRD3         MOVE REST OF INPUT
  159.          B         CMDCHK
  160. LENGERR  DS        0H
  161.          WRTERM    'The filename or 2nd word of the command is too longX
  162.                 .  MUSIC filenames'
  163.          WRTERM    'may be up to 17 characters long.'
  164.          B         PROMPT
  165. *
  166. FINDWORD DS        0H
  167.          LA        R5,IOBUFEND-1       ADDR OF END OF INPUT - 1
  168.          SR        R5,R1               LENGTH OF REST OF INPUT
  169.          LR        R6,R1               POINTER TO INPUT BUFFER
  170.          EX        R5,TRTNONBL         FIND START OF NEXT WORD
  171.          BZ        NOWORD              FIRST LETTER FOUND
  172.          CLI       0(R1),CR            CARRIAGE RETURN?
  173.          BNE       NXTWORD             YES, GO CHECK COMMAND
  174. NOWORD   DS        0H
  175.          LA        R4,0                NO WORD
  176.          BR        R14                 RETURN
  177. NXTWORD  DS        0H
  178.          LA        R5,IOBUFEND-1       GET END OF INPUT BUFFER
  179.          SR        R5,R1               GET LENGTH LEFT
  180.          LR        R6,R1               START OF SECOND WORD
  181.          SR        R1,R1               CLEAR FOR TRANSLATE
  182.          EX        R5,TRTBLANK         FIND NEXT BLANK OR CR
  183.          BZ        CMDERR              ERROR IF NOT FOUND
  184.          LR        R4,R1               ADDR OF BLANK AFTER WORD
  185.          SR        R4,R6               LENGTH OF NEXT WORD
  186.          BR        R14                 RETURN
  187. TRTBLANK TRT       0(0,R6),BLANKTBL    LOOK FOR NEXT BLANK
  188. TRTNONBL TRT       0(0,R6),NONBLANK    LOOK FOR NON BLANK CHAR
  189. MOVECMD  MVC       COMMAND(0),0(R6)    MOVE COMMAND TO COL. 1
  190. MOVEWRD2 MVC       WORD2(0),0(R6)      MOVE SECOND WORD OF COMMAND
  191. MOVEWRD3 MVC       WORD3(0),0(R6)      MOVE SECOND WORD TO COL. 5
  192. *
  193. CMDCHK   DS        0H
  194.          MVI       ERRNUM,X'FF'        RESET ERROR FOR THIS TIME
  195.          CLI       COMMAND,C'E'        CHECK FOR 'EXIT' COMMAND
  196.          BNE       CHKQ                NO, BRANCH TO CHECK Q
  197.          CLI       WORD2,C'?'          YES, IS IT QUESTION OR EXIT?
  198.          BNE       RET                 EXIT, SO GO RETURN
  199.          WRTERM    'The EXIT command causes KERMIT to terminate.'
  200.          B         PROMPT
  201. *
  202. CHKQ     DS        0H
  203.          CLI       COMMAND,C'Q'        CHECK FOR 'QUIT' COMMAND
  204.          BNE       CHKQUES             NO, BRANCH
  205.          CLI       WORD2,C'?'          QUESTION ABOUT QUIT?
  206.          BNE       RET                 NO, GO RETURN
  207.          WRTERM    'The QUIT command causes KERMIT to terminate.'
  208.          B         PROMPT
  209. *
  210. CHKQUES  DS        0H
  211.          CLI       COMMAND,C'?'        NEED HELP ?
  212.          BNE       CHKSET
  213. WRITECMD DS        0H
  214.          WRTERM    'Legal Commands are: '
  215.          WRTERM    'RECEIVE, SEND, HELP, EXIT, QUIT, SET, STATUS, SHOW,*
  216.                 ?'
  217.          B         PROMPT
  218. *
  219. CHKSET   CLC       COMMAND,=CL3'SET'   IS IT THE SET COMMAND ?
  220.          BE        STSWITCH
  221.          CLC       COMMAND,=C'STA'     IS IT THE STATUS COMMAND?
  222.          BE        STATSW
  223.          CLC       COMMAND,=C'SHO'     IS IT THE SHOW COMMAND?
  224.          BE        SHOSW
  225.          CLC       COMMAND,=C'HEL'     NEED HELP ?
  226.          BE        HELPSW
  227.          NI        FLAGS,X'FF'-FLG2    TURN OFF OVERWRITE FLAG (INIT)
  228.          CLC       COMMAND,=C'REC'
  229.          BNE       SS                  MAYBE IT'S A SEND COMMAND
  230. *
  231. *        RECEIVE COMMAND
  232. *
  233.          CLI       WORD2,C'?'          NEED HELP?
  234.          BNE       RR2
  235.          WRTERM    'SPECIFY:  RECeive (filename)'
  236.          WRTERM    ' '
  237.          WRTERM    'The filename is optional.  If given, the file will X
  238.                be stored under that name.'
  239.          WRTERM    'If missing, the file will be stored with the name fX
  240.                rom the SEND command.'
  241.          B         PROMPT
  242. *
  243. RR2      DS        0H
  244.          CLI       WORD2,C' '          FILENAME GIVEN?
  245.          BE        RSWITCH             NO,  CONTINUE
  246.          OI        FLAGS,FLG2          TURN ON OVERWRITE FLAG
  247.          MVC       FILNAM(22),WORD2    MOVE FILNAME
  248.          TRT       FILNAM(18),BLANKTBL FIND FIRST BLANK
  249.          BNZ       RR3
  250.          WRTERM    'ERROR IN FILE NAME.'
  251.          B         PROMPT
  252. RR3      DS        0H
  253.          LA        R2,FILNAM           START OF FILE NAME
  254.          SR        R1,R2               SUBTRACT START FROM END
  255.          ST        R1,FNAMLEN          STORE FILE NAME LENGTH
  256.          MVI       PREV,X'00'          ZERO OUT PREV. LINE FLAG
  257.          XC        RBUF,RBUF           CLEAR BUFFER
  258.          LA        R5,RBUF             GET ADDRESS OF BUFFER
  259.          ST        R5,MUSARG+8         STORE IN MUSARG
  260.          MVC       MUSARG+4(4),=F'256'
  261.          MFSET     MUSFIL,OPEN,R=(OKNEW,WROK)
  262.          MFREQ     MUSFIL,BAD=BADOPEN
  263.          OI        FLAGS,FLG5          TURN ON FILE OPEN FLAG
  264. RSWITCH  DS        0H
  265.          L         R15,=A(RECEIVE)
  266.          BALR      R14,R15             CALL RECEIVE PORTION
  267.          LTR       R5,R15              CHECK RETURN CODE
  268.          BNZ       LNON
  269.          MVI       ERRNUM,X'FF'
  270. LNON     DS        0H
  271.          MVC       OLDERR(1),ERRNUM    ERROR SETTING OF THIS RUN
  272.          LTR       R5,R5               CHECK THE RETCODE
  273.          BZ        PROMPT              ALL OKAY
  274.          WRTERM    'Error in receiving file. Try again.'
  275.          B         PROMPT              ERROR - TRY AGAIN
  276. *
  277. *        SEND COMMAND
  278. *
  279. SS       CLC       COMMAND,=C'SEN'
  280.          BNE       CMDERR              UNRECOGNIZED COMMAND
  281.          CLI       WORD2,C'?'          NEED HELP?
  282.          BNE       SS2                 NO, BRANCH
  283.          WRTERM    'SPECIFY:  SEND filename1 (filaname2)'
  284.          WRTERM    ' '
  285.          WRTERM    'Send the MUSIC file, filename1, to the micro.'  If x
  286.                filename2'
  287.          WRTERM    'is given, send the name to the micro to use as the X
  288.                file name there.'
  289.          WRTERM    ' '
  290.          B         PROMPT
  291. SS2      DS        0H
  292.          CLI       WORD2,C' '          FILENAME GIVEN?
  293.          BNE       SS3
  294.          WRTERM    'No filename specifed'
  295.          B         PROMPT
  296. SS3      DS        0H
  297.          MVC       FILNAM(22),WORD2
  298.          MVC       FNAMLEN(4),WORD2LEN STORE FILE NAME LENGTH
  299.          LA        R5,BUF              GET ADDRESS OF BUFFER
  300.          ST        R5,MUSARG+8         STORE IN MUSARG
  301.          MVC       MUSARG+4(4),=F'256'
  302.          MFSET     MUSFIL,OPEN,R=(OKOLD,RDOK)
  303.          MFREQ     MUSFIL,BAD=BADOPEN
  304.          OI        FLAGS,FLG5          TURN ON FILE OPEN FLAG
  305. SSWITCH  DS        0H
  306.          L         R15,=A(SEND)
  307.          BALR      R14,R15             CALL SEND PORTION
  308.          LTR       R5,R15              CHECK RETURN CODE
  309.          BNZ       LINON
  310.          MVI       ERRNUM,X'FF'        WORKED OK
  311. LINON    DS        0H
  312.          MVC       OLDERR(1),ERRNUM    ERROR SETTING OF THIS RUN
  313. SSW1     LTR       R5,R5               CHECK THE RETCODE
  314.          BZ        PROMPT              ALL OKAY
  315.          WRTERM    'Error in sending file. Try again.'
  316.          B         PROMPT              ERROR - TRY AGAIN
  317. *
  318. BADOPEN  DS        0H
  319.          XC        IOBUF,IOBUF         CLEAR IOBUF
  320.          LA        R5,IOBUF+1          GET ERROR MESSAGE IN IO BUFFER
  321.          ST        R5,MUSARG+8
  322.          MVC       MUSARG+4(4),IOBUFLEN    SET MAX LENGTH
  323.          MFSET     MUSFIL,MSG          GET ERROR MESSAGE
  324.          MFREQ     MUSFIL,BAD=STATBAD
  325.          L         R5,MUSARG+4         GET LENGTH OF MESSAGE
  326.          LA        R5,1(R5)            ADD ONE FOR CC
  327.          ST        R5,IOARG+4          STORE MESSAGE LENGTH
  328.          MVC       MUSARG+4(4),=F'256' RESET TO 256
  329.          MVI       IOBUF,C' '          SET CARRIAGE CONTROL TO BLANK
  330.          MFSET     REPLY,IO,R=(WR)     SET UP TO WRITE ERROR MSG
  331.          MFREQ     REPLY
  332.          B         PROMPT              AND LEAVE
  333. *
  334. *
  335. *
  336. CMDERR   WRTERM    'INVALID COMMAND'
  337.          B         PROMPT              INVALID COMMAND - TRY AGAIN
  338.          SPACE     3
  339. *
  340. *
  341. *
  342. STSWITCH EQU       *
  343.          L         R15,=A(SET)
  344.          BALR      R14,R15             CALL "SET" SUBROUTINE
  345.          LTR       R15,R15             CHECK RETCODE
  346.          BZ        PROMPT
  347.          WRTERM    'Illegal Set Command'
  348.          B         PROMPT
  349. SHOSW    EQU       *
  350.          L         R15,=A(SHOW)
  351.          BALR      R14,R15             CALL "SHOW" SUBROUTINE
  352.          LTR       R15,R15             CHECK RETCODE
  353.          BZ        PROMPT
  354.          WRTERM    'Illegal Show Command'
  355.          B         PROMPT
  356. STATSW   EQU       *
  357.          CLI       WORD2,C'?'          NEED HELP?
  358.          BNE       GIVSTAT
  359.          WRTERM    'The STATUS command gives the final status'
  360.          WRTERM    'of the previous KERMIT command.'
  361.          B         PROMPT
  362. GIVSTAT  CLI       OLDERR,X'FF'        WAS THERE AN ERROR LAST TIME?
  363.          BNE       FAIL
  364.          WRTERM    'Kermit completed successfully'
  365.          B         PROMPT
  366. FAIL     DS        0H
  367.          XC        IOBUF,IOBUF         CLEAR IOBUF
  368.          CLI       OLDERR,X'FE'        ERROR ON MFREQ?
  369.          BE        STATUS1             YES, BRANCH
  370.          IC        R5,OLDERR           GET OFFSET INTO ERROR TABLE
  371.          M         R4,=F'20'           OFFSET := ERRNUM * 20
  372.          LA        R5,ERRTAB(R5)
  373.          CLI       OLDERR,S1ERRNUM     WAS IT A SERIES1 ERROR?
  374.          BNE       FAIL1               NO, THE WRITE OUT THE ERROR
  375.          LA        R1,X'F0'            GET READY TO UNPK ERROR CODES
  376.          ICM       R1,B'1110',KERFSRET MOVE IN THE ERROR CODES
  377.          SRL       R1,4                GET RID OF LOWER ZERO
  378.          ST        R1,WORK1            SAVE IT
  379.          UNPK      S1RETC(6),WORK1(4)  MAKE IT SORTA-PRINTABLE
  380.          TR        S1RETC(6),HEXTB     PRETTY IT UP
  381. FAIL1    MVC       IOBUF+1(20),0(R5)   MOVE MESSAGE
  382.          B         STATWR              BRANCH TO WRITE STATUS
  383. STATUS1  DS        0H
  384.          MVC       MUSFIL+8(1),MUSERR  MOVE IN ERROR CODE
  385.          LA        R5,IOBUF+1
  386.          ST        R5,MUSARG+8
  387.          MVC       MUSARG+4(4),IOBUFLEN    SET MAX LENGTH
  388.          MFSET     MUSFIL,MSG
  389.          MFREQ     MUSFIL,BAD=STATBAD
  390.          MVC       MUSARG+4(4),=F'256'
  391. STATWR   DS        0H
  392.          MFSET     REPLY,IO,R=(WR)
  393.          MVI       IOBUF,C' '          BLANK OUT CC
  394.          MVC       IOARG+4,IOBUFLEN
  395.          MFREQ     REPLY
  396.          B         PROMPT              AND LEAVE
  397. STATBAD  DS        0H
  398.          MVC       IOBUF+1,=C'BAD ERROR CODE FOUND IN MUSERR'
  399.          MVC       MUSARG+4(4),=F'256'
  400.          B         STATWR
  401. *
  402. HELPSW   DS        0H
  403.          WRTERM    'EXIT back to MUSIC'
  404.          WRTERM    'QUIT and go back to MUSIC'
  405.          WRTERM    'RECEIVE file from PC'
  406.          WRTERM    'SEND file to PC'
  407.          WRTERM    'SET a parameter'
  408.          WRTERM    'SHOW the value of a parameter'
  409.          WRTERM    'STATUS of previous Kermit command'
  410.          WRTERM    '? - list the available Kermit commands'
  411.          WRTERM    ' '
  412.          WRTERM    'For details on a command, issue the command followex
  413.                d by ?'
  414.          WRTERM    'All commands may be shortened to 3 characters.'
  415.          WRTERM    ' '
  416.          B         PROMPT
  417. *
  418. *
  419. RET      EQU       *
  420.          L         R13,4(R13)
  421.          L         R14,12(R13)
  422.          LM        R0,R12,20(R13)
  423.          BR        R14
  424. *
  425. KSAVE    DS        18F                 KERMIT'S SAVE AREA
  426.          LTORG
  427.          DROP      R11
  428.          DROP      R12                 NO LONGER NEED THEM
  429.          EJECT
  430. INIT     CSECT
  431.          STM       R14,R12,12(R13)
  432.          BALR      R12,0
  433.          USING     *,R12
  434.          LA        R14,ISAVE
  435.          ST        R13,4(R14)
  436.          ST        R14,8(R13)
  437.          LR        R13,R14
  438. *
  439. * INITIALIZE VARIABLES THAT GET CHANGED DURING EXECUTION
  440. * USE R11 AS BASE REGISTER FOR 'PARMS' GLOBAL DATA LIST
  441.          L         R11,=A(PARMS)
  442.          USING     PARMS,R11
  443.          XC        SNDPKT,SNDPKT       CLEAR OUT THESE BUFFERS
  444.          XC        RECPKT,RECPKT
  445.          XC        IOBUF,IOBUF
  446.          LA        R0,BUF              GET BUFFER ADDR
  447.          LA        R1,L'BUF            GET LENGTH OF BUFFER
  448.          SR        R15,R15             SET MOVE LENGTH AND PAD TO ZERO
  449.          MVCL      R0,R14              CLEAR OUT BUFFER
  450.          LA        R0,RBUF             CLEAR
  451.          LA        R1,L'RBUF              OUT
  452.          SR        R15,R15                  THE
  453.          MVCL      R0,R14                     BUFFER
  454.          XC        SDAT,SDAT
  455.          XC        RDAT,RDAT
  456.          XC        N,N                 SET VARIABLES TO ZERO
  457.          XC        NUM,NUM
  458.          XC        LSDAT,LSDAT
  459.          XC        LRDAT,LRDAT
  460.          MVI       FLAGS,X'00'         CLEAR ALL FLAGS
  461.          MVI       S1FLAGS,X'01'       DEFAULT TO SERIES1 ON
  462.          XC        SAVPL,SAVPL         CLEAR
  463.          XC        SAVPLDAT,SAVPLDAT     BUFFER
  464.          XC        RSAVPL,RSAVPL            POINTERS
  465.          XC        NUMTRY,NUMTRY
  466.          MVC       FILNAM,=22X'20'     BLANK OUT FILNAM & NAME
  467.          MVC       FNAMLEN,=F'0'       MOVE ZERO TO FILE NAME LENGTH
  468.          MVI       PREV,X'00'
  469.          MVI       ERRNUM,X'FF'        SET TO NO ERROR FOR NOW
  470.          MVI       OLDERR,X'FF'        SAME HERE
  471.          XC        PKVAR,PKVAR         ZERO IT OUT
  472.          XC        OLDTRY,OLDTRY
  473.          XC        SPSIZ,SPSIZ
  474.          XC        SIZE,SIZE
  475.          XC        TEMP,TEMP
  476.          MVC       LRECL(1),DLRECL     SET DEFAULTS, JUST IN CASE
  477.          MVC       RFM(1),DRECFM
  478.          MVC       QUOCHAR(1),DQUOTE
  479.          MVC       RQUO(1),DQUOTE
  480.          MVC       REOL(1),DEOL
  481.          MVC       SEOL(1),DEOL
  482.          MVC       DLYTIME(4),DDLYTIM  SET DELAY TIME FOR SINIT
  483.          MVI       STATE,C' '
  484.          MVI       STYPE,C' '
  485.          MVI       RTYPE,C' '
  486. *
  487. INITRET  L         R13,4(R13)
  488.          L         R14,12(R13)
  489.          LM        R0,R12,20(R13)
  490.          BR        R14
  491. ISAVE    DS        18F
  492.          LTORG
  493.          DROP      R11
  494.          DROP      R12
  495.          EJECT
  496. *
  497. *
  498. PARMS    CSECT                         GLOBAL DATA LIST
  499. REPLY    MFARG 0,NAME=TERM,ARG=IOARG
  500.          MFGEN
  501. MUSFIL   MFARG 0,NAME=FILNAM,ARG=MUSARG,INFIN=INFARG1,INFOUT=INFARG2
  502.          MFGEN
  503. KERMFARG MFARG FSIO,U=9,FSARG=KERFSARG,PHYS=KERPHYS,RLAB=KERFSRET
  504.          MFGEN
  505. KERFSARG MFVAR FSARG,PICT=Y,PRE=KERM
  506. KERPHYS  MFVAR PHYS,PICT=Y,PRE=KERM
  507. IOARG    DC A(0,132,IOBUF)
  508. IOBUF    DC XL132'00'
  509. IOBUFEND DS 0CL1
  510. TERM     DC CL22'SYSTERM'
  511. IOBUFLEN DC F'132'
  512. MUSARG   DS 0F
  513.          DC A(0)
  514. MUSRLEN  DC A(256)
  515.          DC A(BUF)
  516. INFARG1  DC A(10,30,-1)
  517. LRECL    DC AL2(80)
  518. RFM      DC AL1(02)
  519.          DC AL1(0)
  520.          DC XL4'0000C0C0'
  521. INFARG2  DC A(20,20,-1)
  522.          DC AL2(80)
  523.          DC AL1(02)
  524.          DC AL1(0)
  525.          DC XL4'0000C0C0'
  526. **************************************************************
  527. *  W A R N I N G : THE FOLLOWING S1ORDS MUST IMMEDIATELY     *
  528. *                  PRECEDE THE SNDPKT BUFFER. THEY CAUSE THE *
  529. *                  SERIES1/7171 TO ENTER TRANSPARENCY MODE.  *
  530. *                                                            *
  531. **************************************************************
  532. S1ORDS   DS 0D
  533.          DC X'40',AL1(SBA),X'5D7F',AL1(SBA),X'0001'   TRANSPARENCY
  534. S1ORDSL  EQU *-S1ORDS
  535. SNDPKT   DS        CL130               SEND THIS TO MICRO
  536.          ORG       SNDPKT
  537. PHDR     DS        X
  538. PLEN     DS        X
  539. PNUM     DS        X
  540. PTYPE    DS        X
  541. PDATA    DS        0C
  542.          ORG       ,
  543. RECPKT   DS        CL130               RECEIVE THIS FROM MICRO
  544. LSDAT    DS        F                   SEND PACKET SIZE
  545. LRDAT    DS        F                   RECEIVE PACKET SIZE
  546. FLAGS    DC        X'00'               USE TO TEST OUR FLAGS
  547. S1FLAGS  DC        X'01'               SERIES 1 FLAGS
  548. COMMAND  DS        CL3
  549. WORD2    DS        CL22
  550. WORD3    DS        CL22
  551. WORD2LEN DC        F'0'                LENGTH OF PARM IN WORD2
  552. WORD3LEN DC        F'0'                LENGTH OF PARM IN WORD3
  553.          DS        0F
  554. BUF      DS        CL256               FSREAD INTO HERE
  555.          DS        CL2                 EXTRA BYTES IN CASE 256 CHARS
  556. RBUF     DS        CL256               FSWRITE FROM HERE
  557. N        DC        F'0'                SEND PACKET NUMBER
  558. NUM      DC        F'0'                RECEIVE PACKET NUMBER
  559. NUMTRY   DC        F'0'                TRIAL COUNTER FOR TRANSFERS
  560. OLDTRY   DS        F                   COUNTER FOR PREVIOUS PACKET
  561. MAXPACK  DC        F'94'               MAX PACKET SIZE
  562. RECL     DS        F                   RECORD LEN (WITHOUT BLANKS)
  563. RPSIZ    DC        F'94'               MAX RECEIVE PACKET SIZE
  564. DSSIZ    DC        F'40'               DEFAULT MAX SEND PACKET SIZE
  565. SPSIZ    DS        F                   SEND PACKET SIZE
  566. MAXTRY   DC        F'5'                NO. OF TIMES TO RETRY PACKET
  567. IMXTRY   DC        F'16'               NO. OF INITIAL TRIALS ALLOWED
  568. SIZE     DS        F                   MAX SIZE FOR SEND DATA
  569. DEL      DC        F'127'              OCTAL 177 (DELETE CHAR)
  570. ZERO     DC        F'0'
  571. ONE      DC        F'1'
  572. FIVE     DC        F'5'
  573. TWO      DC        F'2'
  574. SPACE    DC        F'32'               ASCII SPACE
  575. O1H      DC        F'64'               OCTAL 100
  576. O2H      DC        F'128'              OCTAL 200
  577. SAVPL    DC        F'0'                POINTER WITHIN BUF,INIT=0
  578. SAVPLDAT DC        F'0'                POINTER WITHIN SDAT, INIT=0
  579. RSAVPL   DC        F'0'                POINTER IN 'PTCHR',INIT=0
  580. DQUOTE   DC        X'23'               DEFAULT QUOTE CHARACTER = #
  581. QUOCHAR  DS        X                   QOUTE CHAR WE'LL SEND
  582. RQUO     DS        X                   MICRO'S QUOTE CHAR
  583. TEMP     DS        F                   TEMPORARY SPACE
  584. WORK1    DS        F                   FOR FSIO ERROR
  585.          DS        0D
  586. PKVAR    DS        D                   USE FOR PICKING UP INTEGER
  587. SDAT     DS        CL130               TEMP PLACE FOR SEND DATA
  588. RDAT     DS        CL130               TEMP PLACE FOR RECEIVE DATA
  589. FNAMLEN  DS        F                   FILE NAME LENGTH
  590. FILNAM   DS        CL22                SEND/REC FILENAME
  591. BLANKS   DC        CL22' '             BLANKS
  592. STATE    DS        C                   OUR CURRENT STATE
  593. DEOL     DC        X'0D'               DEFAULT END OF PACKET (CR)
  594. REOL     DS        X                   EOL CHAR I NEED (CR)
  595. SEOL     DS        X                   EOL I'LL SEND
  596. DLRECL   DC        X'0050'             DEFAULT LRECL SIZE OF 80
  597. DRECFM   DC        X'02'               DEFAULT RECFM - FIXED COMPRESSED
  598. PREV     DS        C                   PREVIOUS CHAR REC (IN PTCHR)
  599. DLYTIME  DS        F                   DELAY TIME BEFORE SEND INIT
  600. DDLYTIM  DC        F'15'               DEFAULT DELAY TIME
  601. ERRNUM   DS        X                   ERROR NUMBER,IN CASE WE DIE
  602. OLDERR   DS        X                   ERROR OF PREVIOUS EXECUTION
  603. MUSERR   DS        X                   ERROR FROM MUSIC MACRO MFREQ
  604. STYPE    DS        C                   TYPE OF PACKET SENT
  605. RTYPE    DS        C                   TYPE OF PACKET RECEIVED
  606. * THIS IS THE ASCII TO EBCDIC TABLE
  607. ATOE     DC        X'00010203372D2E2F1605250B0C0D0E0F'
  608.          DC        X'101112133C3D322618193F271C1D1E1F'
  609.          DC        X'405A7F7B5B6C507D4D5D5C4E6B604B61'
  610.          DC        X'F0F1F2F3F4F5F6F7F8F97A5E4C7E6E6F'
  611.          DC        X'7CC1C2C3C4C5C6C7C8C9D1D2D3D4D5D6'
  612.          DC        X'D7D8D9E2E3E4E5E6E7E8E9ADE0BD5F6D'
  613.          DC        X'79818283848586878889919293949596'
  614.          DC        X'979899A2A3A4A5A6A7A8A9C04FD0A107'
  615. *THIS IS THE EBCDIC TO ASCII CONVERSION TABLE
  616. *CHARACTERS NOT REPRESENTABLE IN ASCII ARE REPLACED BY A NULL
  617. ETOA     DC        X'000102030009007F0000000B0C0D0E0F'
  618.          DC        X'1011121300000800181900001C1D1E1F'
  619.          DC        X'00000000000A171B0000000000050607'
  620.          DC        X'0000160000000004000000001415001A'
  621.          DC        X'20000000000000000000002E3C282B7C'
  622.          DC        X'2600000000000000000021242A293B5E'
  623.          DC        X'2D2F00000000000000007C2C255F3E3F'
  624.          DC        X'000000000000000000603A2340273D22'
  625.          DC        X'00616263646566676869007B00000000'
  626.          DC        X'006A6B6C6D6E6F707172007D00000000'
  627.          DC        X'007E737475767778797A0000005B0000'
  628.          DC        X'000000000000000000000000005D0000'
  629.          DC        X'7B414243444546474849000000000000'
  630.          DC        X'7D4A4B4C4D4E4F505152000000000000'
  631.          DC        X'5C00535455565758595A000000000000'
  632.          DC        X'303132333435363738397C0000000000'
  633. *
  634. * TABLE OF ERROR MESSAGES (IN CASE WE ABORT)
  635. ERRTAB   DC        CL20'Bad send-packet size'    ERR MSG #0
  636.          DC        CL20'Bad message number'      ERR MSG #1
  637.          DC        CL20'Unrecognized state'      ERR MSG #2
  638.          DC        CL20'No SOH encountered'      ERR MSG #3
  639.          DC        CL20'Bad character count'     ERR MSG #4
  640.          DC        CL20'Bad checksum'            ERR MSG #5
  641.          DC        CL20'Disk is full'            ERR MSG #6
  642.          DC        CL20'Illegal packet type'     ERR MSG #7
  643.          DC        CL20'Lost a packet'           ERR MSG #8
  644.          DC        CL20'Micro sent a NAK'        ERR MSG #9
  645.          DC        CL20'Micro aborted'           ERR MSG #10
  646.          DC        CL20'Illegal file name'       ERR MSG #11
  647.          DC        CL20'Invalid lrecl'           ERR MSG #12
  648.          DC        CL20'Permanent I/O error'     ERR MSG #13
  649.          DC        CL20'Disk is read-only'       ERR MSG #14
  650.          DC        CL20'Recfm conflict'          ERR MSG #15
  651.          DC        CL20'ERR ALLOCATING SPACE'    ERR MSG #16
  652.          DC        CL20'ERROR OPENING FILE  '    ERR MSG #17
  653. S1ERRMSG DS        0CL20
  654.          DC        CL13'FSIO ERROR = '           ERR MSG #18
  655. S1RETC   DC        CL6' '
  656.          DC        CL1' '
  657. S1ERRNUM EQU       18                ERROR NUMBER FOR SERIES1/7171
  658. *
  659. BLANKTBL DS        0XL256
  660.          DC        13XL1'00'
  661.          DC        X'02'
  662.          DC        50XL1'00'
  663.          DC        X'01'               STOP ON A SPACE
  664.          DC        191XL1'00'
  665. *
  666. NONBLANK DS        0XL256
  667.          DC        64XL1'01'
  668.          DC        X'00'               STOP ON A NON-BLANK
  669.          DC        191XL1'01'
  670. *
  671. NAMETBL  DS        0XL256
  672.          DC        75XL1'01'
  673.          DC        XL1'00'             '.'
  674.          DC        15XL1'01'
  675.          DC        XL1'00'             '$'
  676.          DC        31XL1'01'
  677.          DC        2XL1'00'            '#' AND '@'
  678.          DC        68XL1'01'
  679.          DC        9XL1'00'            ABCDEFGHI
  680.          DC        7XL1'01'
  681.          DC        9XL1'00'            JKLMNOPQR
  682.          DC        8XL1'01'
  683.          DC        8XL1'00'            STUVWXYZ
  684.          DC        6XL1'01'
  685.          DC        10XL1'00'           0123456789
  686.          DC        6XL1'01'
  687. *
  688. INPTTY   DS    0D
  689. *                0 1 2 3 4 5 6 7 8 9 A B C D E F
  690. *                ZLZL@ @ SPSPR'R'DEDEP P 0 0 P P
  691.          DC    X'00007C7C404079791010D7D7F0F09797' 0
  692. *                BSBSH H ( ( H H CNCNX X 8 8 X X
  693.          DC    X'1616C8C84D4D88881818E7E7F8F8A7A7' 1
  694. *                ETETD D $ $ D D TFTFT T 4 4 T T
  695.          DC    X'3737C4C45B5B84843C3CE3E3F4F4A3A3' 2
  696. *                FFFFL L , , L L FSFSR/R/< < +-+-
  697.          DC    X'0C0CD3D36B6B93931C1CE0E04C4C4F4F' 3
  698. *                SXSXB B " " B B TNTNR R 2 2 R R
  699.          DC    X'0202C2C27F7F82821212D9D9F2F29999' 4  48 & 49 CHANGED
  700. *                LFLFJ J * * J J SBSBZ Z : : Z Z        FROM 0101
  701.          DC    X'2525D1D15C5C91913F3FE9E97A7AA9A9' 5
  702. *                AKAKF F & & F F SYSYV V 6 6 V V
  703.          DC    X'2E2EC6C6505086863232E5E5F6F6A5A5' 6
  704.          DC    X'0E0ED5D54B4B95951E1E5F5F6E6EA1A1' 7
  705. *                SHSHA A ! ! A A XNXNQ Q 1 1 Q Q
  706.          DC    X'0101C1C15A5A81811111D8D8F1F19898' 8
  707. *                TBTBI I ) ) I I EMEMY Y 9 9 Y Y
  708.          DC    X'0505C9C95D5D89891919E8E8F9F9A8A8' 9
  709. *                WRWRE E % % E E NKNKU U 5 5 U U
  710.          DC    X'2D2DC5C56C6C85853D3DE4E4F5F5A4A4' A
  711. *                RTRTM M - - M M GSGSS)S)= = B)B)
  712.          DC    X'0D0DD4D4606094941D1DBDBD7E7ED0D0' B
  713. *                EMEMC C # # C C XFXFS S 3 3 S S
  714.          DC    X'0303C3C37B7B83831313E2E2F3F3A2A2' C
  715. *                VTVTK K + + K K ESESS(S(; ; B(B(
  716.          DC    X'0B0BD2D24E4E92922727ADAD5E5E7878' D
  717. *                BLBLG G ' ' G G EBEBW W 7 7 W W
  718.          DC    X'2F2FC7C77D7D87872626E6E6F7F7A6A6' E
  719. *                SISIO O / / O O USUSBSBS? ?
  720.          DC    X'0F0FD6D6616196961F1F6D6D6F6F0707' F
  721. *                0 1 2 3 4 5 6 7 8 9 A B C D E F
  722. OUTTTY   DS    0D
  723. *                0 1 2 3 4 5 6 7 8 9 A B C D E F
  724. *                ZLSHSXEXTFTB  DL      VTFFRTSOSI
  725.          DC    X'008141C0009000FF000000D130B171F0' 0
  726. *                DEXN    RSNLBSILCNEM    FSGSRSUS
  727.          DC    X'098848C9000011001899000039B878F9' 1
  728. *                        BPLFEBES          WRAKBL
  729.          DC    X'000000000050E8D80000000000A060E1' 2
  730. *                    SY  TN              XFNK  SB
  731.          DC    X'00006900000000210000000028A90059' 3
  732. *                SP              B)S)R/. < ( + |
  733.          DC    X'0500000000000000000000743C14D43F' 4
  734. *                &                 +-! $ * ) ; ^
  735.          DC    X'6500000000000000000084245595DD7B' 5
  736. *                - /               R'  , % _ > ?
  737.          DC    X'B4F500000000000000003F35A5FA7DFC' 6
  738. *                                B(S(: # @ ' = "
  739.          DC    X'000000000000000000065CC503E4BD44' 7
  740. *                  A B C D E F G H I
  741.          DC    X'008747C627A666E7179600DE00000000' 8
  742. *                  J K L M N O P Q R
  743.          DC    X'0056D736B777F60F8E4E00BE00000000' 9
  744. *                    S T U V W X Y Z
  745.          DC    X'007ECF2EAF6FEE1E9F5F000000DB0000' A
  746. *
  747.          DC    X'00000000000000000000000000BB0000' B
  748. *                  A B C D E F G H I
  749.          DC    X'DE8242C322A363E21293000000000000' C
  750. *                  J K L M N O P Q R           --
  751.          DC    X'BE53D233B272F30A8B4B000000000000' D
  752. *                    S T U V W X Y Z
  753.          DC    X'3A00CA2BAA6AEB1B9A5A000000000000' E
  754. *                0 1 2 3 4 5 6 7 8 9           DL
  755.          DC    X'0C8D4DCC2DAC6CED1D9C3F0000000000' F
  756. *                0 1 2 3 4 5 6 7 8 9 A B C D E F
  757. HEXTB    EQU   *-X'F0'   ORIGIN TABLE BACK A WAYS - ONLY NEED F0-FF
  758.          DC    X'F0F1F2F3F4F5F6F7F8F9C1C2C3C4C5C6'
  759.          LTORG
  760.          EJECT
  761. SET      CSECT
  762.          STM       R14,R12,12(R13)     SAVE CALLER'S REGISTERS
  763.          BALR      R12,0               ESTABLISH ADDRESSABILITY
  764.          USING     *,R12
  765.          LA        R14,SETSAVE         ADDRESS OF MY SAVE AREA
  766.          ST        R13,4(R14)          SAVE CALLER'S
  767.          ST        R14,8(R13)
  768.          LR        R13,R14
  769. * USE R11 AS BASE REGISTER FOR 'PARMS' GLOBAL DATA AREA
  770.          L         R11,=A(PARMS)
  771.          USING     PARMS,R11           ESTABLISH ADDRESSABILITY
  772.          CLI       WORD2,C'?'          NEED HELP ?
  773.          BNE       NOQ
  774.          WRTERM    'RECfm, End-of-line, Quote, Lrecl, Packet-size, DelaX
  775.                y-time, RETry-count, SERIES1.'
  776.          B         SETOK
  777. NOQ      DS        0H
  778.          CLC       =CL7'SERIES1',WORD2           SET SERIES1/7171?
  779.          BNE       NOSER1              NO - TRY NEXT OPTION
  780.          CLI       WORD3,C'?'          WANT INFO?
  781.          BNE       CHKSERON            NO -_ SEE IF SET 'ON'
  782.          WRTERM    'ON or OFF'
  783.          B         SETOK               FINISHED
  784. CHKSERON CLC       =CL2'ON',WORD3      TURN IT ON?
  785.          BNE       CHKSEROF            NO - TRY OFF
  786.          OI        S1FLAGS,ISS1        SET THE BIT
  787.          B         SETOK               FINISHED
  788. CHKSEROF CLC       =CL3'OFF',WORD3     TURN IT OFF?
  789.          BNE       SERINV              NO - THEN WE HAVE A PROBLEM
  790.          NI        S1FLAGS,X'FF'-ISS1  TURN OFF THE S1 BIT
  791.          B         SETOK               FINISHED HERE
  792. SERINV   WRTERM    'Op must be ON or OFF'
  793.          B         SETOK               MAYBE THEY'LL TRY AGAIN
  794. NOSER1   CLC       WORD2(4),=CL4'REC '
  795.          BE        RECFM
  796.          CLC       WORD2(5),=CL5'RECFM'
  797.          BNE       NOREC
  798. RECFM    DS        0H                  PICK UP RECORD FORMAT
  799.          CLI       WORD3,C'?'
  800.          BNE       CHKFM
  801.          WRTERM    'F, FC, V, or VC (default of FC)'
  802.          B         SETOK
  803. CHKFM    DS        0H
  804.          CLC       WORD3(2),=CL2'F '   FIXED FORMAT?
  805.          BNE       TRYFC
  806.          MVI       RFM,X'01'           MARK FIXED
  807.          B         SETOK
  808. TRYFC    DS        0H
  809.          CLC       WORD3(2),=CL2'FC'   FIXED COMPRESSED FORMAT?
  810.          BNE       TRYV
  811.          MVI       RFM,X'02'           MARK FIXED COMPRESSED
  812.          B         SETOK
  813. TRYV     DS        0H
  814.          CLC       WORD3(2),=CL2'V '   VARIABLE FORMAT?
  815.          BNE       TRYVC
  816.          MVI       RFM,X'03'           MARK VARIABLE
  817.          B         SETOK
  818. TRYVC    DS        0H
  819.          CLC       WORD3(2),=CL2'VC'   VARIABLE COMPRESSED FORMAT?
  820.          BNE       RECERR
  821.          MVI       RFM,X'04'           MARK VARIABLE COMPRESSED
  822.          B         SETOK
  823. RECERR   WRTERM    'Error in record format. F, FC, V, VC allowed.'
  824.          B         SETERR
  825. *
  826. NOREC    DS        0H
  827.          CLC       WORD2(2),=C'Q '     QUOTE CHARACTER?
  828.          BE        QUOTE               YES, BRANCH
  829.          CLC       WORD2(5),=CL5'QUOTE' QUOTE CHAR?
  830.          BNE       NOQUO               NO, GO TRY NEXT
  831. QUOTE    DS        0H
  832.          CLI       WORD3,C' '          VALUE NOT SUPPLIED?
  833.          BNE       GIVQ
  834.          WRTERM    'Quote character cannot be a blank.  Re-specify.'
  835.          B         SETERR
  836. GIVQ     CLI       WORD3,C'?'
  837.          BNE       GETQUO
  838.          WRTERM    'The single charater used to transmit control '
  839.          WRTERM    'characters  (default is #).'
  840.          B         SETOK
  841. GETQUO   MVC       QUOCHAR(1),WORD3    SET NEW QUOTE CHAR
  842.          TR        QUOCHAR(1),ETOA     GET ASCII FORM
  843.          CLI       WORD3+1,C' '        IS IT ONLY ONE CHAR?
  844.          BE        ISQOK
  845.          WRTERM    'one character only'
  846.          B         SETERR
  847. ISQOK    CLI       QUOCHAR,X'21'       CAN'T BE LESS THAN 32
  848.          BL        BADQUO
  849.          CLI       QUOCHAR,X'7E'       CAN'T BE LARGER THAN 126
  850.          BH        BADQUO
  851.          CLI       QUOCHAR,X'3E'       HAS TO BE BETWEEN 32-62
  852.          BNH       SETOK
  853.          CLI       QUOCHAR,X'60'       OR BETWEEN 96-126
  854.          BNL       SETOK
  855. BADQUO   WRTERM    'Must fall between 41-76,140,or 173-176 (octal).'
  856.          B         SETERR
  857. *
  858. NOQUO    DS        0H
  859.          CLC       WORD2(2),=C'L '     LRECL?
  860.          BE        RECLENG             YES, BRANCH
  861.          CLC       WORD2(5),=C'LRECL'  LRECL SIZE?
  862.          BNE       NORCL               NO, BRANCH
  863. RECLENG  DS        0H
  864.          CLI       WORD3,C'?'          HELP ?
  865.          BNE       GETREC
  866.          WRTERM    'Logical record length (default of 80).'
  867.          B         SETOK
  868. GETREC   CLI       WORD3,C' '          NO VALUE GIVEN?
  869.          BNE       CALC
  870.          WRTERM    'No record length given.  Re-specify.'
  871.          B         SETERR
  872. CALC     CLI       WORD3,X'F0'         MUST BE >= TO 0
  873.          BL        BADREC
  874.          CLI       WORD3,X'F9'         MUST BE <= TO 9
  875.          BH        BADREC
  876.          XC        PKVAR,PKVAR         EMPTY IT OUT
  877.          SR        R4,R4               LENGTH OF NUMBER
  878.          CLI       WORD3+1,C' '        TWO DIGITS?
  879.          BNE       CALC2
  880.          EX        R4,PCK
  881.          B         TST
  882. CALC2    LA        R4,1(R4)            ADD ONE
  883.          CLI       WORD3+2,C' '        THREE DIGITS?
  884.          BNE       CALC3
  885.          EX        R4,PCK
  886.          B         TST
  887. CALC3    LA        R4,1(R4)            IS THERE AN ERROR?
  888.          CLI       WORD3+3,C' '
  889.          BNE       BADREC
  890.          EX        R4,PCK
  891. TST      CVB       R7,PKVAR
  892.          C         R7,=X'00000100'     MAX OF 256 FOR LRECL
  893.          BH        BADREC
  894.          STH       R7,LRECL            SET THE LRECL VALUE
  895.          B         SETOK
  896. BADREC   WRTERM    'LRECL must be a number from 0 to 256.'
  897.          B         SETERR
  898. *
  899. NORCL    DS        0H
  900.          CLI       WORD2,C'E'          EOL CHARACTER?
  901.          BE        EOL                 YES, BRANCH
  902.          CLC       WORD2(3),=C'END'     EOL CHARACTER
  903.          BNE       NOEND
  904. EOL      DS        0H
  905.          CLI       WORD3,C' '          NOT DATA
  906.          BNE       EOLCHAR
  907.          WRTERM    'No End-of-Line character specified.'
  908.          B         SETERR
  909. EOLCHAR  CLI       WORD3,C'?'          NEED HELP?
  910.          BNE       GETEOL
  911.          WRTERM    'A two digit number between 00 and 31 (dec).'
  912.          WRTERM    '(The default is 13.)'
  913.          B         SETOK
  914. GETEOL   CLI       WORD3,X'F0'         MUST BE >= TO 0
  915.          BL        BADEOL
  916.          CLI       WORD3,X'F9'         MUST BE <= TO 9
  917.          BH        BADEOL
  918.          XC        PKVAR,PKVAR         USE TO CONVERT VALUE
  919.          CLI       WORD3+1,C' '        INPUT MUST BE TWO CHARS
  920.          BE        BADEOL
  921.          CLI       WORD3+2,C' '          TWO CHARS, AT MAX
  922.          BNE       BADEOL
  923.          PACK      PKVAR(8),0(2,R6)    PICK UP TWO CHARACTERS
  924.          CVB       R7,PKVAR            PUT PACKED DECIMAL INTO REG
  925.          C         R7,=X'0000001F'     MAX OF 31 DECIMAL
  926.          BH        BADEOL
  927.          STC       R7,SEOL             SET SEND EOL VALUE
  928.          B         SETOK
  929. BADEOL   WRTERM    'Must be a two digit value less than 31 (dec).'
  930.          B         SETERR
  931. *
  932. NOEND    DS        0H
  933.          CLI       WORD2,C'P'          CHANGE PACKET SIZE?
  934.          BE        PAC                 YES, BRANCH
  935.          CLC       WORD2(3),=C'PAC'    CHANGE RECEIVE PACKET SIZE
  936.          BNE       NOPAC               NO, GO CHECK NEXT
  937. PAC      DS        0H
  938.          CLI       WORD3,C' '          NO DATA
  939.          BNE       GETPAC
  940.          WRTERM    'No receive packet size specified.'
  941.          B         SETERR
  942. GETPAC   CLI       WORD3,C'?'          NEED HELP?
  943.          BNE       CALC4
  944.          WRTERM    'Receive packet size (range: 26-94 decimal).'
  945.          WRTERM    '(The default is 94.)'
  946.          B         SETOK
  947. CALC4    CLI       WORD3,X'F0'         MUST BE >= TO 0
  948.          BL        BADPAC
  949.          CLI       WORD3,X'F9'         MUST BE <= TO 9
  950.          BH        BADPAC
  951.          XC        PKVAR,PKVAR         USE TO CONVERT VALUE
  952.          CLI       WORD3+1,C' '        INPUT MUST BE TWO CHARS
  953.          BE        BADPAC
  954.          CLI       WORD3+2,C' '        TWO CHARS, AT MAX
  955.          BNE       BADPAC
  956.          PACK      PKVAR(8),WORD3(2)   PICK UP TWO CHARS
  957.          CVB       R7,PKVAR            PUT PACKED DECIMAL INTO REG
  958.          C         R7,=F'26'           THIS IS MIN
  959.          BL        BADPAC
  960.          C         R7,MAXPACK          THIS IS THE MAX
  961.          BH        BADPAC
  962.          ST        R7,RPSIZ            USE THIS VALUE NOW
  963.          B         SETOK
  964. BADPAC   WRTERM    'Bad packet size - must be between 26-94 (decimal).'
  965.          B         SETERR
  966. NOPAC    DS        0H
  967.          CLC       WORD2(2),=C'D '     DELAY TIME?
  968.          BE        DELAY               YES, BRANCH
  969.          CLC       WORD2(5),=CL5'DELAY' DELAY TIME?
  970.          BNE       NODLY               NO, ERROR
  971. DELAY    DS        0H
  972.          CLI       WORD3,C' '          VALUE NOT SUPPLIED?
  973.          BNE       GIVD
  974.          WRTERM    'The DELAY time cannot be a blank.  Re-specify.'
  975.          B         SETERR
  976. GIVD     CLI       WORD3,C'?'
  977.          BNE       GETDLY
  978.          WRTERM    'The time in seconds before KERMIT will send '
  979.          WRTERM    'the first packet.  (The default is 15.)'
  980.          B         SETOK
  981. GETDLY   CLI       WORD3,X'F0'         MUST BE >= TO 0
  982.          BL        BADDLY
  983.          CLI       WORD3,X'F9'         MUST BE <= TO 9
  984.          BH        BADDLY
  985.          XC        PKVAR,PKVAR         USE TO CONVERT VALUE
  986.          SR        R4,R4               LENGTH OF NUMBER
  987.          CLI       WORD3+1,C' '        TWO DIGITS?
  988.          BNE       DLY2
  989.          EX        R4,PCK
  990.          B         CALCDLY
  991. DLY2     LA        R4,1(R4)            ADD ONE
  992.          CLI       WORD3+2,C' '        THREE DIGITS?
  993.          BNE       DLY3
  994.          EX        R4,PCK
  995.          B         CALCDLY
  996. DLY3     LA        R4,1(R4)            IS THERE AN ERROR?
  997.          CLI       WORD3+3,C' '
  998.          BNE       BADDLY
  999.          EX        R4,PCK
  1000. CALCDLY  CVB       R7,PKVAR
  1001.          C         R7,=F'120'          MAX OF 120 SECONDS FOR DELAY
  1002.          BH        BADDLY
  1003.          ST        R7,DLYTIME          SET THE DELAY VALUE
  1004.          B         SETOK
  1005. BADDLY   WRTERM    'DELAY must be a number from 0 - 120.'
  1006.          B         SETERR
  1007. *
  1008. NODLY    DS        0H
  1009.          CLC       WORD2(4),=C'RET '   RETRY?
  1010.          BE        RETRYCNT            YES, BRANCH
  1011.          CLC       WORD2(5),=C'RETRY'  LRECL SIZE?
  1012.          BNE       SETERR              NO, BRANCH
  1013. RETRYCNT DS        0H
  1014.          CLI       WORD3,C'?'          HELP ?
  1015.          BNE       GETRET
  1016.          WRTERM    'The number of times a packet may be re-sent.'
  1017.          WRTERM    'The default is 5.'
  1018.          B         SETOK
  1019. GETRET   CLI       WORD3,C' '          NO VALUE GIVEN?
  1020.          BNE       RETCALC
  1021.          WRTERM    'No retry count given.  Re-specify.'
  1022.          B         SETERR
  1023. RETCALC  CLI       WORD3,X'F0'         MUST BE >= TO 0
  1024.          BL        BADRET
  1025.          CLI       WORD3,X'F9'         MUST BE <= TO 9
  1026.          BH        BADRET
  1027.          XC        PKVAR,PKVAR         EMPTY IT OUT
  1028.          SR        R4,R4               LENGTH OF NUMBER
  1029.          CLI       WORD3+1,C' '        TWO DIGITS?
  1030.          BNE       RETCALC2
  1031.          EX        R4,PCK
  1032.          B         RETTST
  1033. RETCALC2 LA        R4,1(R4)            ADD ONE
  1034.          CLI       WORD3+2,C' '        THREE DIGITS?
  1035.          BNE       RETCALC3
  1036.          EX        R4,PCK
  1037.          B         RETTST
  1038. RETCALC3 LA        R4,1(R4)            IS THERE AN ERROR?
  1039.          CLI       WORD3+3,C' '
  1040.          BNE       BADRET
  1041.          EX        R4,PCK
  1042. RETTST   CVB       R7,PKVAR
  1043.          C         R7,=X'00000064'     MAX OF 100 FOR RETRY
  1044.          BH        BADRET
  1045.          ST        R7,MAXTRY           SET THE LRECL VALUE
  1046.          B         SETOK
  1047. BADRET   WRTERM    'RETRY count must be a number from 0 to 100.'
  1048.          B         SETERR
  1049. *
  1050. SETERR   DS        0H
  1051.          MVC       QUOCHAR(1),DQUOTE   RESET VALUE, JUST IN CASE
  1052.          LA        R15,4               SET A NON-ZERO RETCODE
  1053.          B         SETRET
  1054. SETOK    SR        R15,R15             RETCODE OF 0
  1055. *
  1056. SETRET   L         R13,4(R13)
  1057.          L         R14,12(R13)
  1058.          LM        R0,R12,20(R13)
  1059.          BR        R14
  1060. SETSAVE  DS        18F
  1061. PCK      PACK      PKVAR(8),WORD3(0)
  1062.          LTORG
  1063.          DROP      R11
  1064.          DROP      R12
  1065.          EJECT
  1066. SHOW     CSECT
  1067.          STM       R14,R12,12(R13)     SAVE CALLER'S REGISTERS
  1068.          BALR      R12,0               ESTABLISH ADDRESSABILITY
  1069.          USING     *,R12
  1070.          LA        R14,SHOWSAVE        ADDRESS OF MY SAVE AREA
  1071.          ST        R13,4(R14)          SAVE CALLER'S
  1072.          ST        R14,8(R13)
  1073.          LR        R13,R14
  1074. * USE R11 AS BASE REGISTER FOR 'PARMS' GLOBAL DATA AREA
  1075.          L         R11,=A(PARMS)
  1076.          USING     PARMS,R11           ESTABLISH ADDRESSABILITY
  1077.          CLI       WORD2,C'?'          NEED HELP ?
  1078.          BNE       SHOREC
  1079.          WRTERM    'RECfm, End-of-line, Quote, Lrecl, Packet-size, DelaX
  1080.                y-time, RETry-count, SERIES1.'
  1081.          B         SHOWOK
  1082. SHOREC   CLC       WORD2(5),=CL5'RECFM'
  1083.          BE        RFM1
  1084.          CLC       WORD2(4),=CL4'REC '
  1085.          BNE       SHOQUO
  1086. RFM1     DS        0H
  1087.          CLI       RFM,X'01'           RECFM=F?
  1088.          BNE       RFM2                NO, BRANCH
  1089.          WRTERM    'The RECORD FORMAT is FIXED.'
  1090.          B         SHOWOK
  1091. RFM2     DS        0H
  1092.          CLI       RFM,X'02'           RECFM=FC?
  1093.          BNE       RFM3                NO, BRANCH
  1094.          WRTERM    'The RECORD FORMAT is FIXED COMPRESSED.'
  1095.          B         SHOWOK
  1096. RFM3     DS        0H
  1097.          CLI       RFM,X'03'           RECFM=FC?
  1098.          BNE       RFM4                NO, BRANCH
  1099.          WRTERM    'The RECORD FORMAT is VARIABLE.'
  1100.          B         SHOWOK
  1101. RFM4     DS        0H
  1102.          CLI       RFM,X'04'
  1103.          BNE       RFMERR
  1104.          WRTERM    'The RECORD FORMAT is VARIABLE COMPRESSED.'
  1105.          B         SHOWOK
  1106. RFMERR   DS        0H
  1107.          MVI       RFM,X'02'           SET RECFM TO FC
  1108.          WRTERM    'The RECORD FORMAT is FIXED COMPRESSED.'
  1109.          B         SHOWOK
  1110. *
  1111. SHOQUO   DS        0H
  1112.          CLC       WORD2(5),=C'QUOTE'
  1113.          BE        QUO1
  1114.          CLC       WORD2(2),=C'Q '
  1115.          BNE       SHORCL
  1116. QUO1     DS        0H
  1117.          MVC       MSGQCHAR(1),QUOCHAR GET QUOTE CHARACTER
  1118.          TR        MSGQCHAR(1),ATOE    TRANSLATE TO EBCDIC
  1119.          MVC       SHOWMSG(24),MSGQUOTE  MOVE QUOTE MESSAGE
  1120.          B         SHOWIT
  1121. *
  1122. SHORCL   DS        0H
  1123.          CLC       WORD2(5),=C'LRECL'
  1124.          BE        LREC1
  1125.          CLC       WORD2(2),=C'L '
  1126.          BNE       SHOEND
  1127. LREC1    DS        0H
  1128.          SR        R4,R4               ZERO IT OUT
  1129.          LH        R4,LRECL
  1130.          CVD       R4,PKVAR
  1131.          UNPK      MSGLCHAR(3),PKVAR+6(2)
  1132.          OI        MSGLCHAR+2,X'F0'
  1133.          MVC       SHOWMSG(24),MSGLRECL
  1134.          B         SHOWIT
  1135. *
  1136. SHOEND   DS        0H
  1137.          CLC       WORD2(3),=C'END'
  1138.          BE        SHOEND2
  1139.          CLC       WORD2(3),=C'EOL'
  1140.          BE        SHOEND2
  1141.          CLC       WORD2(2),=C'E '
  1142.          BNE       SHOPAC
  1143. SHOEND2  DS        0H
  1144.          SR        R4,R4               ZERO IT OUT
  1145.          IC        R4,SEOL
  1146.          CVD       R4,PKVAR            CONVERT TO DECIMAL
  1147.          UNPK      MSGECHAR(2),PKVAR+6(2)  UNPACK
  1148.          OI        MSGECHAR+1,X'F0'    MAKE LAST DIGIT A NUMBER
  1149.          MVC       SHOWMSG(24),MSGEOL  MOVE MESSAGE
  1150.          B         SHOWIT
  1151. *
  1152. SHOPAC   DS        0H
  1153.          CLC       WORD2(3),=C'PAC'     PACKET LENGTH ?
  1154.          BE        PAC1
  1155.          CLC       WORD2(2),=C'P '
  1156.          BNE       SHODLY
  1157. PAC1     DS        0H
  1158.          L         R4,RPSIZ            GET RECEIVE PACKET SIZE
  1159.          CVD       R4,PKVAR            CONVERT TO DECIMAL
  1160.          UNPK      MSGPSIZE(3),PKVAR+6(2)  UNPACK
  1161.          OI        MSGPSIZE+2,X'F0'    MAKE LAST DIGIT A NUMBER
  1162.          MVC       SHOWMSG(24),MSGPAC  MOVE MESSAGE
  1163.          B         SHOWIT
  1164. *
  1165. SHODLY   CLC       WORD2(5),=CL5'DELAY' SHOW DELAY VALUE?
  1166.          BE        DELAY1
  1167.          CLC       WORD2(2),=C'D '
  1168.          BNE       SHORET              NO, ERROR IN SHOW REQUESR
  1169. DELAY1   DS        0H
  1170.          L         R4,DLYTIME          GET DELEAY TIME
  1171.          CVD       R4,PKVAR            CONVERT TO DECIMAL
  1172.          UNPK      MSGDTIME(3),PKVAR+6(2)  UNPACK
  1173.          OI        MSGDTIME+2,X'F0'    MAKE LAST DIGIT A NUMBER
  1174.          MVC       SHOWMSG(24),MSGDLY  MOVE MESSAGE
  1175.          B         SHOWIT
  1176. SHORET   DS        0H
  1177.          CLC       WORD2(5),=C'RETRY'
  1178.          BE        RET1
  1179.          CLC       WORD2(4),=CL4'RET'
  1180.          BNE       SHOSER1             MAYBE IT'S FOR SERIES1/7171?
  1181. RET1     DS        0H
  1182.          SR        R4,R4               ZERO IT OUT
  1183.          L         R4,MAXTRY
  1184.          CVD       R4,PKVAR
  1185.          UNPK      MSGRTCNT(3),PKVAR+6(2)
  1186.          OI        MSGRTCNT+2,X'F0'
  1187.          MVC       SHOWMSG(24),MSGRETRY
  1188.          B         SHOWIT
  1189. SHOSER1  DS        0H                  HERE TO SHOW SERIES1 STATUS
  1190.          CLC       =CL7'SERIES1',WORD2 COULD IT BE?
  1191.          BNE       SHOERR              NO - UNKNOWN PARM THEN
  1192.          MVC       MSGSER10(8),=CL8'ON' ASSUME IT IS ON
  1193.          TM        S1FLAGS,ISS1        TEST IT
  1194.          BO        SHOSER2             WE GUESSED CORRECTLY
  1195.          MVC       MSGSER10(8),=CL8'OFF' CORRECT THE MESSAGE
  1196. SHOSER2  MVC       SHOWMSG(24),MSGSER1 Move in the text
  1197.          B         SHOWIT
  1198. *
  1199. SHOERR   LA        R15,4               SET A NON-ZERO RETCODE
  1200.          B         SHOWRET
  1201. *
  1202. SHOWIT   DS        0H
  1203.          XC        IOBUF,IOBUF         CLEAR IOBUF
  1204.          MVI       IOBUF,C' '          MOVE BLANK TO CC
  1205.          MVC       IOARG+4,IOBUFLEN
  1206.          MFSET     REPLY,IO,R=(WR)
  1207.          MVC       IOBUF+1(24),SHOWMSG
  1208.          MFREQ REPLY
  1209. SHOWOK   SR        R15,R15             ZERO RETCODE
  1210. *
  1211. SHOWRET  L         R13,4(R13)
  1212.          L         R14,12(R13)
  1213.          LM        R0,R12,20(R13)
  1214.          BR        R14
  1215. SHOWSAVE DS        18F
  1216. SHOWMSG  DS        CL24
  1217. MSGQUOTE DS        0CL24
  1218.          DC        CL23'The QUOTE character is '
  1219. MSGQCHAR DC        CL1' '
  1220. MSGLRECL DS        0CL24
  1221.          DC        CL19'THE LRECL VALUE IS '
  1222. MSGLCHAR DC        CL5'     '
  1223. MSGEOL   DS        0CL24
  1224.          DC        CL21'THE EOL CHARACTER IS '
  1225. MSGECHAR DC        CL3'   '
  1226. MSGPAC   DS        0CL24
  1227.          DC        CL19'THE PACKET SIZE IS '
  1228. MSGPSIZE DC        CL5'     '
  1229. MSGDLY   DS        0CL24
  1230.          DC        CL18'THE DELAY TIME IS '
  1231. MSGDTIME DC        CL6'      '
  1232. MSGRETRY DS        0CL24
  1233.          DC        CL19'THE RETRY COUNT IS '
  1234. MSGRTCNT DC        CL5'     '
  1235. MSGSER1  DS        0CL24
  1236.          DC        CL16'Series1/7171 is '
  1237. MSGSER10 DC        CL8' '
  1238.          LTORG
  1239.          DROP      R11
  1240.          DROP      R12
  1241.          EJECT
  1242. SEND     CSECT
  1243.          STM       R14,R12,12(R13)     SAVE CALLER'S REGISTERS
  1244.          BALR      R12,0               ESTABLISH ADDRESSABILITY
  1245.          USING     *,R12
  1246.          LA        R14,SENDSAVE        ADDRESS OF MY SAVE AREA
  1247.          ST        R13,4(R14)          SAVE CALLER'S
  1248.          ST        R14,8(R13)
  1249.          LR        R13,R14
  1250. * USE R11 AS BASE REGISTER FOR 'PARMS' GLOBAL DATA AREA
  1251.          L         R11,=A(PARMS)
  1252.          USING     PARMS,R11           ESTABLISH ADDRESSABILITY
  1253.          MVI       STATE,C'S'
  1254.          SR        R3,R3
  1255.          ST        R3,N
  1256.          ST        R3,NUMTRY
  1257.          TM        S1FLAGS,ISS1        IS THIS A SERIES1/7171 TERMINAL
  1258.          BNO       SNDX                NO NEED TO INITIALIZE THEN
  1259.          LA        R1,1                SET PARM FOR INITIALIZE
  1260.          L         R15,=A(INTRINI)     GET ADDR OF SERIES1 INIT ROUTINE
  1261.          BALR      R14,R15             GO TO IT!!
  1262. SNDX     L         R0,DLYTIME    GET DELAY TIME
  1263.          SVC       $DLYEXC             WAIT
  1264. SLOOP    CLI       STATE,C'D'          SEND DATA STATE
  1265.          BE        SDATA
  1266.          CLI       STATE,C'F'          SEND FILE STATE
  1267.          BE        SFILE
  1268.          CLI       STATE,C'S'          SEND INIT STATE
  1269.          BE        SINIT
  1270.          CLI       STATE,C'Z'          END OF FILE STATE
  1271.          BE        SEOF
  1272.          CLI       STATE,C'B'          SEND BREAK STATE
  1273.          BE        SBREAK
  1274.          CLI       STATE,C'C'          COMPLETE STATE
  1275.          BE        COMPLETE
  1276.          CLI       STATE,C'A'          ABORT STATE
  1277.          BE        ABORT               ERROR - GO TO ABORT STATE
  1278.          MVI       ERRNUM,X'02'        UNRECOGNIZED STATE
  1279.          B         ABORT               OTHERWISE, DIE
  1280. SINIT    CLC       NUMTRY,IMXTRY       SEE IF CAN SEND
  1281.          BL        OK1                 YES WE CAN
  1282.          MVI       STATE,C'A'          NOPE, GO INTO ABORT STATE
  1283.          B         SLOOP
  1284. OK1      L         R5,SPACE            MAKE CHARACTER PRINTABLE
  1285.          A         R5,RPSIZ            ADD REC PACKET SIZE
  1286.          STC       R5,SDAT             ADD SIZE INFO TO BUFFER
  1287.          L         R5,SPACE
  1288.          A         R5,=F'8'            8 FOR TIMEOUT
  1289.          STC       R5,SDAT+1
  1290.          L         R5,SPACE            SEND ZERO + " " FOR NPAD
  1291.          STC       R5,SDAT+2           WE'RE THE SLOW GUYS
  1292.          SR        R5,R5               PAD WITH NULLS
  1293.          L         R3,O1H
  1294.          XR        R5,R3               CTL FUNCTION (XOR WITH 64)
  1295.          STC       R5,SDAT+3           DON'T NEED PADCHAR EITHER
  1296.          SR        R5,R5               ZERO IT OUT FOR NEXT TWO GUYS
  1297.          IC        R5,REOL             EOL CHAR I NEED
  1298.          A         R5,SPACE            MAKE PRINTABLE
  1299.          STC       R5,SDAT+4
  1300.          IC        R5,QUOCHAR          MY QUOTE CHAR
  1301.          STC       R5,SDAT+5
  1302.          L         R3,NUMTRY
  1303.          LA        R3,1(R3)            INCREMENT TRIAL COUNTER
  1304.          ST        R3,NUMTRY
  1305.          MVI       STYPE,AS            PACKET TYPE = SEND INITIATE
  1306.          MVC       LSDAT(4),=F'6'      BUFFER SIZE FOR THIS SEND
  1307.          L         R4,DSSIZ            GET DEFAULT SPSIZ
  1308.          S         R4,FIVE             FOR NOW, USE DEFAULT SPSIZ....
  1309.          ST        R4,SIZE             ....TO SET VALUE OF SIZE
  1310.          L         R15,=A(SPACK)       GET ADDRESS OF ROUTINE 'SPACK'
  1311.          BALR      14,15               SAVE * AND GO TO SPACK
  1312.          CLI       STATE,C'A'
  1313.          BE        ABORT
  1314.          L         15,=A(RPACK)        GET ADDRESS OF 'RPACK'
  1315.          BALR      14,15               SAVE * AND GO TO RPACK
  1316.          CLI       RTYPE,AE            ERROR PACKET?
  1317.          BNE       Y1                  NO, THEN MAYBE AN ACK
  1318.          MVI       ERRNUM,X'0A'        MICRO DIED
  1319.          MVI       STATE,C'A'          AND DIE
  1320.          B         SLOOP
  1321. Y1       CLI       RTYPE,AY            SEE IF GOT ACK
  1322.          BNE       N1                  MAYBE IT'S 'N'
  1323.          CLC       N,NUM               CHECK MESSAGE NUMBERS
  1324.          BE        AOK1
  1325.          MVI       ERRNUM,X'08'        PACKET LOST
  1326.          B         SLOOP
  1327. AOK1     SR        R4,R4               ZERO OUT REGISTER
  1328.          IC        R4,RDAT             USE SPSIZ THE MICRO WANTS
  1329.          S         R4,SPACE            SUBTRACT THE ' '
  1330.          C         R4,=F'26'           BUFFER HAS TO BE >= 26
  1331.          BNL       CH1                 SO FAR, SO GOOD
  1332.          MVI       STATE,C'A'          ABORT THEN
  1333.          MVI       ERRNUM,X'00'        INVALID DATA-PACKET-SIZE ERROR
  1334.          B         SLOOP
  1335. CH1      C         R4,MAXPACK          MAX PACKET SIZE
  1336.          BNH       CH2                 CONTINUE IF <= TO MAX
  1337.          MVI       STATE,C'A'          DIE
  1338.          MVI       ERRNUM,X'00'        INVALID DATA-PACKET-SIZE ERROR
  1339.          B         SLOOP
  1340. CH2      STC       R4,SPSIZ+3          USE SPSIZ THE MICRO WANTS
  1341.          S         R4,FIVE
  1342.          ST        R4,SIZE             SET SIZE TO SPSIZ-5
  1343.          CLC       LRDAT(4),=F'4'      USING DEFAULTS?
  1344.          BNH       NOCHG               YUP
  1345.          LA        R5,RDAT             POINTER TO THE BUFFER
  1346.          SR        R7,R7
  1347.          IC        R7,4(R5)            SEOL MICRO WANTS
  1348.          S         R7,SPACE            UNCHAR (IE - SUBTRACT SPACE)
  1349.          STC       R7,SEOL
  1350. NOCHG    MVI       STATE,C'F'          PUT INTO SEND FILE STATE
  1351.          XC        NUMTRY,NUMTRY       RESET TO ZERO
  1352.          L         R3,N
  1353.          LA        R3,1(R3)            ADD ONE
  1354.          ST        R3,N                STORE VALUE INCREMENTED BY 1
  1355.          NC        N(4),=X'0000003F'   MASK TO GET MOD 64
  1356.          B         SLOOP
  1357. N1       CLI       RTYPE,AN            SEE IF IT'S 'N'
  1358.          BNE       AB1                 IF NOT, DIE
  1359.          TM        FLAGS,FLG4          DID MICRO NAK OR I REJECTED?
  1360.          BO        SLOOP               LEAVE ERR MSG AS IS IF I DID
  1361.          MVI       ERRNUM,X'09'        MICRO NAK'ED
  1362.          B         SLOOP
  1363. AB1      MVI       STATE,C'A'          ELSE, ABORT
  1364.          CLI       ERRNUM,S1ERRNUM     WAS IT A FSIO/SERIES1 ERROR?
  1365.          BE        SLOOP               DON'T CHANGE IT TO DEFAULT CODE
  1366.          MVI       ERRNUM,X'07'        UNRECOGNIZED PACKET TYPE
  1367.          B         SLOOP
  1368. SFILE    CLC       NUMTRY,MAXTRY       EXCEEDED NO. OF TRIES ALLOWED?
  1369.          BL        OK2                 NOPE, STILL OK
  1370.          MVI       STATE,C'A'          ABORT IF YES
  1371.          B         SLOOP
  1372. OK2      DS        0H
  1373.          CLI       WORD3,C' '          FILENAME IN WORD3?
  1374.          BE        SF2                 NO, BRANCH
  1375.          MVC       SDAT(17),WORD3      YES, MOVE FILENAME FOR SEND
  1376.          MVC       LSDAT(4),WORD3LEN   MOVE LENGTH OF NAME TO SEND LEN
  1377.          B         SF3
  1378. SF2      DS        0H
  1379.          MVC       SDAT(17),FILNAM     PUT FILENAME IN BUFFER
  1380.          MVC       LSDAT(4),FNAMLEN    LENGTH OF SDAT (FILE NAME LENG)
  1381. SF3      DS        0H
  1382.          TR        SDAT(17),ETOA       TRANSLATE TO ASCII
  1383.          L         R3,NUMTRY
  1384.          LA        R3,1(R3)            INCREMENT TRIAL COUNTER
  1385.          ST        R3,NUMTRY
  1386.          MVI       STYPE,AF            PACKET TYPE = FILE HEADER
  1387.          L         R15,=A(SPACK)       GET ADDRESS OF SPACK
  1388.          BALR      14,15               SAVE * AND GO TO SPACK
  1389.          CLI       STATE,C'A'
  1390.          BE        ABORT
  1391.          L         15,=A(RPACK)        GET ADDRESS OF 'RPACK'
  1392.          BALR      14,15               SAVE * AND GO TO RPACK
  1393.          CLI       RTYPE,AE            ERROR PACKET?
  1394.          BNE       Y2                  MAYBE AN ACK
  1395.          MVI       ERRNUM,X'0A'        MICRO DIED
  1396.          MVI       STATE,C'A'          SO WE DO TOO
  1397.          B         SLOOP
  1398. Y2       CLI       RTYPE,AY            SEE IF GOT ACK
  1399.          BNE       N2                  MAYBE GOT AN 'N'
  1400.          CLC       N,NUM               DO WE HAVE THE CORRECT ACK?
  1401.          BE        AOK2
  1402.          MVI       ERRNUM,X'08'        MISSING A PACKET SOMEWHERE
  1403.          B         SLOOP
  1404. AOK2     MVI       STATE,C'D'          PREPARE FOR SEND-DATA STATE
  1405.          XC        NUMTRY,NUMTRY       RESET COUNTER
  1406.          L         R3,N
  1407.          LA        R3,1(R3)            ADD ONE
  1408.          ST        R3,N                STORE INCREMENTED VALUE
  1409.          NC        N(4),=X'0000003F'   MASK TO GET MOD 64
  1410.          L         15,=A(OPNFIL)       GO OPEN FILE AND GET FIRST REC
  1411.          BALR      14,15               DO GET-CHAR AND COME BACK
  1412.          B         SLOOP
  1413. N2       CLI       RTYPE,AN
  1414.          BNE       AB2                 ELSE, DIE
  1415.          TM        FLAGS,FLG4          DID MICRO NAK OR I REJECTED?
  1416.          BO        SLOOP               LEAVE ERR MSG AS IS IF I DID
  1417.          MVI       ERRNUM,X'09'        MICRO NAK'ED
  1418.          B         SLOOP
  1419. AB2      MVI       STATE,C'A'          ELSE, ABORT
  1420.          CLI       ERRNUM,S1ERRNUM     WAS IT A FSIO/SERIES1 ERROR?
  1421.          BE        SLOOP               DON'T CHANGE IT TO DEFAULT CODE
  1422.          MVI       ERRNUM,X'07'        UNRECOGNIZED PACKET TYPE
  1423.          B         SLOOP
  1424. SDATA    CLC       NUMTRY,MAXTRY       CAN WE DO IT?
  1425.          BL        OK4                 YES
  1426.          MVI       STATE,C'A'          ELSE ABORT
  1427.          B         SLOOP
  1428. OK4      L         R3,NUMTRY
  1429.          LA        R3,1(R3)            INCREMENT COUNTER
  1430.          ST        R3,NUMTRY
  1431.          MVI       STYPE,AD            PACKET TYPE = DATA
  1432.          L         R15,=A(SPACK)
  1433.          BALR      14,15               GO TO SPACK AND RETURN
  1434.          CLI       STATE,C'A'
  1435.          BE        ABORT
  1436.          L         15,=A(RPACK)
  1437.          BALR      14,15               SAME FOR RPACK
  1438.          CLI       RTYPE,AE            ERROR PACKET?
  1439.          BNE       Y4                  MAYBE AN ACK
  1440.          MVI       ERRNUM,X'0A'        MICRO DIED
  1441.          MVI       STATE,C'A'          SO WE DO TOO
  1442.          B         SLOOP
  1443. Y4       CLI       RTYPE,AY            SEE IF GOT 'ACK'
  1444.          BNE       N4                  SEE IF IT'S AN 'N'
  1445.          CLC       N,NUM               DO WE HAVE THE CORRECT ACK?
  1446.          BE        AOK4
  1447.          MVI       ERRNUM,X'08'        MISSING A PACKET
  1448.          B         SLOOP
  1449. AOK4     DS        0H
  1450.          XC        NUMTRY,NUMTRY       RESET COUNTER
  1451.          L         R3,N
  1452.          LA        R3,1(R3)            INCREMENT COUNTER
  1453.          ST        R3,N
  1454.          NC        N(4),=X'0000003F'   MASK TO GET MOD 64
  1455.          L         R4,LRDAT            GET DATA LENGTH
  1456.          LTR       R4,R4               ANY DATA?
  1457.          BZ        AOKNOZ              NO, NORMAL ACK
  1458.          CLI       RDAT,X'58'          ASCII X?
  1459.          BE        STOPSEND
  1460.          CLI       RDAT,X'5A'          ASCII Z?
  1461.          BNE       AOKNOZ
  1462. STOPSEND DS        0H
  1463.          OI        FLAGS,FLG1          TURN ON INTERRUPT BIT
  1464.          MFSET     MUSFIL,CLOSE        CLOSE FILE
  1465.          MFREQ     MUSFIL,BAD=SERROR
  1466.          NI        FLAGS,X'FF'-FLG5    TURN OFF FILE OPEN FLAG
  1467.          MVI       STATE,C'Z'          SET EOF STATE
  1468.          B         SLOOP               GO ACT LIKE END OF FILE
  1469. AOKNOZ   DS        0H
  1470.          L         15,=A(GTCHR)
  1471.          BALR      14,15               DO GET-CHAR AND RETURN
  1472.          B         SLOOP
  1473. N4       CLI       RTYPE,AN
  1474.          BNE       AB4
  1475.          TM        FLAGS,FLG4          DID MICRO NAK OR I REJECTED?
  1476.          BO        SLOOP               LEAVE ERR MSG AS IS IF I DID
  1477.          MVI       ERRNUM,X'09'        MICRO NAK'ED
  1478.          B         SLOOP
  1479. AB4      MVI       STATE,C'A'
  1480.          CLI       ERRNUM,S1ERRNUM     WAS IT A FSIO/SERIES1 ERROR?
  1481.          BE        SLOOP               DON'T CHANGE IT TO DEFAULT CODE
  1482.          MVI       ERRNUM,X'07'        ILLEGAL PACKET TYPE
  1483.          B         SLOOP
  1484. SEOF     CLC       NUMTRY,MAXTRY       CAN WE DO IT?
  1485.          BL        OK5                 BRANCH IF YES
  1486.          MVI       STATE,C'A'          ABORT IF NO
  1487.          B         SLOOP
  1488. OK5      L         R3,NUMTRY
  1489.          LA        R3,1(R3)            ADD ONE
  1490.          ST        R3,NUMTRY           STORE INCREMENTED COUNTER
  1491.          MVI       STYPE,AZ            PACKET TYPE = EOF
  1492.          XC        LSDAT,LSDAT         LENGTH OF ZERO
  1493.          CLI       FLAGS,FLG1          WAS SEND INTERRUPTED?
  1494.          BNO       EOFNORM             NO, NORMAL EOF
  1495.          MVI       LSDAT+1,X'01'       SET DATA LENGTH TO ONE
  1496.          MVI       SDAT,X'44'          PUT ASCII 'D' IN SEND DATA
  1497. EOFNORM  DS        0H
  1498.          L         R15,=A(SPACK)
  1499.          BALR      14,15               SAVE * AND GO TO SPACK
  1500.          CLI       STATE,C'A'
  1501.          BE        ABORT
  1502.          L         15,=A(RPACK)
  1503.          BALR      14,15               SAME FOR RPACK
  1504.          CLI       RTYPE,AE            ERROR PACKET?
  1505.          BNE       Y5                  MAYBE AN ACK
  1506.          MVI       ERRNUM,X'0A'        MICRO DIED
  1507.          MVI       STATE,C'A'          SO WE DO TOO
  1508.          B         SLOOP
  1509. Y5       CLI       RTYPE,AY            CHECK FOR 'ACK'
  1510.          BNE       N5                  MAYBE WAS A 'NAK'
  1511.          CLC       N,NUM               CORRECT ACK?
  1512.          BE        AOK5
  1513.          MVI       ERRNUM,X'08'        LOST A PACKET
  1514.          B         SLOOP
  1515. AOK5     L         R3,N
  1516.          LA        R3,1(R3)            ADD ONE
  1517.          ST        R3,N                STORE VALUE INCREMENTED BY 1
  1518.          NC        N(4),=X'0000003F'   MASK TO GET MOD 64
  1519. DIEOK    MVI       STATE,C'B'          BREAK CONNECTION
  1520.          B         SLOOP
  1521. N5       CLI       RTYPE,AN
  1522.          BNE       AB5                 DIE IF NOT A NAK
  1523.          TM        FLAGS,FLG4          DID MICRO NAK OR I REJECTED?
  1524.          BO        SLOOP               LEAVE ERR MSG AS IS IF I DID
  1525.          MVI       ERRNUM,X'09'        MICRO NAK'ED
  1526.          B          SLOOP
  1527. AB5      MVI       STATE,C'A'          ELSE, ABORT
  1528.          CLI       ERRNUM,S1ERRNUM     WAS IT A FSIO/SERIES1 ERROR?
  1529.          BE        SLOOP               DON'T CHANGE IT TO DEFAULT CODE
  1530.          MVI       ERRNUM,X'07'        UNRECOGNIZED PACKET TYPE
  1531.          B         SLOOP
  1532. SBREAK   CLC       NUMTRY,MAXTRY       OVER OUR LIMIT?
  1533.          BL        OK6                 BRANCH IF NO
  1534.          MVI       STATE,C'A'          ABORT IF YES
  1535.          B         SLOOP
  1536. OK6      L         R3,NUMTRY
  1537.          LA        R3,1(R3)            ADD ONE
  1538.          ST        R3,NUMTRY           INCREMEMTED TRIAL COUNTER
  1539.          MVI       STYPE,AB            PACKET TYPE = BREAK
  1540.          XC        LSDAT,LSDAT         LENGTH = ZERO
  1541.          L         R15,=A(SPACK)
  1542.          BALR      14,15               SAVE * AND GO TO SPACK
  1543.          CLI       STATE,C'A'
  1544.          BE        ABORT
  1545.          L         15,=A(RPACK)
  1546.          BALR      14,15               SAVE * AND GO TO RPACK
  1547.          CLI       RTYPE,AE            ERROR PACKET?
  1548.          BNE       Y6                  MAYBE AN ACK
  1549.          MVI       ERRNUM,X'0A'        MICRO DIED
  1550.          MVI       STATE,C'A'          THEN WE DO TOO
  1551.          B         SLOOP
  1552. Y6       CLI       RTYPE,AY            CHECK FOR ACK
  1553.          BNE       N6                  CHECK FOR 'N'
  1554.          CLC       N,NUM               CORRECT ACK?
  1555.          BE        AOK6
  1556.          MVI       ERRNUM,X'08'        LOST A PACKET
  1557.          B         SLOOP
  1558. AOK6     MVI       STATE,C'C'          COMPLETED STATE
  1559.          B         SLOOP
  1560. N6       CLI       RTYPE,AN            CHECK FOR 'N'
  1561.          BNE       AB6                 DIE IF NOT A NAK
  1562.          TM        FLAGS,FLG4          DID MICRO NAK OR I REJECTED?
  1563.          BO        SLOOP               LEAVE ERR MSG AS IS IF I DID
  1564.          MVI       ERRNUM,X'09'        MICRO NAK'ED
  1565.          B         SLOOP
  1566. AB6      MVI       STATE,C'A'          ELSE,ABORT
  1567.          CLI       ERRNUM,S1ERRNUM     WAS IT A FSIO/SERIES1 ERROR?
  1568.          BE        SLOOP               DON'T CHANGE IT TO DEFAULT CODE
  1569.          MVI       ERRNUM,X'07'        UNRECOGNIZED PACKET TYPE
  1570.          B         SLOOP
  1571. OPNFIL   DS        0H
  1572.          LA        R5,BUF              GET ADDRESS OF BUFFER
  1573.          ST        R5,MUSARG+8         STORE IN MUSARG
  1574.          MVC       MUSARG+4(4),=F'256'
  1575.          MFSET     MUSFIL,OPEN,R=(OKOLD,RDOK)        OPEN MUSIC FILE
  1576.          MFREQ     MUSFIL,BAD=SERROR
  1577.          OI        FLAGS,FLG5          FLAG FILE OPEN
  1578. GTCHR    DS        0H
  1579.          TM        FLAGS,FLG6          EOF ALREADY?
  1580.          BO        SETEOF              YES, GO CLOSE FILE
  1581.          TM        FLAGS,FLG3          SEE IF THERE'S STUFF IN BUF
  1582.          BO        STUFF               ONES -> STUFF'S THERE
  1583.          MVI       BUF,C' '            BLANK OUT INPUT AREA
  1584.          MVC       BUF+1(255),BUF
  1585.          MFSET     MUSFIL,IO,R=(RD)    READ A RECORD
  1586.          MFREQ     MUSFIL,EOF=SETEOF,BAD=SERROR
  1587.          B         OK8
  1588. SETEOF   DS        0H
  1589.          L         R9,SAVPLDAT         CURRENT ADDR IN SDAT
  1590.          LTR       R9,R9               IS THERE DATA TO SEND?
  1591.          BZ        SETEOF2             NO, CONTINUE WITH EOF
  1592.          STC       R9,LSDAT+3          SAVE PACKET DATA LENGTH
  1593.          OI        FLAGS,FLG6          TURN ON EOF FLAG
  1594.          XC        SAVPLDAT,SAVPLDAT   ZERO OUT SDAT COUNT
  1595.          BR        R14                 RETURN
  1596. SETEOF2  DS        0H
  1597.          NI        FLAGS,X'FF'-FLG6    TURN OFF EOF FLAG
  1598.          MFSET     MUSFIL,CLOSE        CLOSE FILE
  1599.          MFREQ     MUSFIL,BAD=SERROR
  1600.          NI        FLAGS,X'FF'-FLG5    TURN OFF FILE OPEN FLAG
  1601.          MVI       STATE,C'Z'
  1602.          BR        R14
  1603. SERROR   MVI       STATE,C'A'          ABORT ON FILE SYSTEM ERROR
  1604.          MVC       MUSERR(1),MUSFIL+8  GET RETURN CODE
  1605.          MVI       ERRNUM,X'FE'        SET ERROR CODE
  1606.          BR        R14                 RETURN
  1607. OK8      L         R5,MUSARG+4         GET NUMBER OF BYTES READ IN
  1608.          LR        R4,R5               SAVE ALSO IN R4
  1609.          BCTR      R4,0                SUBTRACT ONE
  1610.          EX        R4,TRANS            EBCDIC TO ASCII TRANSLATION
  1611.          LA        R8,BUF              GET LOCATION OF BUFFER INPUT
  1612.          LA        R9,BUF(R4)          LAST POSITION IN THAT BUFFER
  1613. X4       CLI       0(R9),X'20'         IS THIS A BLANK?
  1614.          BNE       X5                  NO, FOUND LAST CHAR OF LINE
  1615.          BCTR      R9,0
  1616.          CR        R9,R8
  1617.          BNL       X4                  FIND LAST CHAR
  1618.          SR        R5,R5               ALL BLANKS
  1619.          B         FOO
  1620. X5       SR        R9,R8
  1621.          LR        R5,R9               LENGTH OF LINE
  1622.          LA        R5,1(R5)            ADD ONE
  1623. FOO      LA        R9,BUF(R5)          FIRST BLANK SPACE AFTER DATA
  1624.          MVC       0(1,R9),=X'0D'      ADD ASCII CR
  1625.          LA        R9,1(R9)            INCREMENT POINTER
  1626.          MVC       0(1,R9),=X'0A'      AND ADD ASCII LF
  1627.          LA        R5,2(R5)            TWO EXTRA BYTES OF DATA NOW
  1628.          ST        R5,RECL             LRECL + 2 (FOR CRLF)
  1629.          SR        R8,R8               ZERO OUT INDEX FOR BUF
  1630. STUFF    DS        0H
  1631.          SR        R5,R5               WILL HOLD QUOCHAR
  1632.          IC        R5,QUOCHAR
  1633.          L         R8,SAVPL            WHERE WE LEFT OFF
  1634.          L         R9,SAVPLDAT         INDEX INTO SDAT WHERE WE STOPPED
  1635.          C         R8,RECL             SEE IF ARE AT LIMIT
  1636.          BNL       FULL2               LEAVE IF REACHED OR EXCEEDED
  1637.          SR        R7,R7
  1638. LOOP     IC        R7,BUF(R8)          PICK UP BYTE
  1639.          CR        R7,R5               IS IT THE QUOTE CHARACTER?
  1640.          BE        SPECIAL
  1641.          C         R7,DEL              IS IT THE CHARDEL?
  1642.          BE        SPECIAL
  1643.          C         R7,SPACE            IS IT A CONTROL CHARACTER?
  1644.          BL        SPECIAL
  1645.          B         ADDIT
  1646. SPECIAL  L         R4,SIZE             MUNGE VALUE WHILE IN R4
  1647.          SR        R4,R9               FIND DIF BETWEEN THE TWO
  1648.          C         R4,TWO              SEE IF HAVE AT LEAST 2 BYTES
  1649.          BL        FULL                NO, GO SEND PACKET
  1650. ROOM     LA        R4,SDAT(R9)         WHERE IT'S GOING
  1651.          MVC       0(1,R4),QUOCHAR     MOVE QUOTE CHAR THERE
  1652.          LA        R9,1(R9)            INCREMENT SDAT COUNTER
  1653.          CR        R7,R5               DON'T ADD ^O100 TO THIS
  1654.          BE        ADDIT               IT'S ALREADY PRINTABLE
  1655.          A         R7,O1H              ADD ^O100 TO CHAR
  1656.          N         R7,=X'0000007F'     GET MOD ^O200
  1657. ADDIT    STC       R7,SDAT(R9)         ADD THE CHARACTER
  1658.          LA        R9,1(R9)            INCREMENT SDAT COUNTER
  1659.          LA        R8,1(R8)            INCREMENT BUF COUNTER
  1660.          C         R9,SIZE             SEE IF REACHED LIMIT
  1661.          BNL       FULL
  1662.          C         R8,RECL             SEE IF REACHED LIMIT
  1663.          BNL       FULL2
  1664.          B         LOOP
  1665. FULL     EQU       *
  1666.          STC       R9,LSDAT+3          THIS ONE TOO
  1667.          ST        R8,SAVPL            HERE TOO
  1668.          OI        FLAGS,FLG3          TURN ON FLAG - STUFF IN BUF
  1669.          XC        SAVPLDAT,SAVPLDAT   ZERO OUT SDAT INDEX
  1670.          BR        14
  1671. FULL2    EQU       *
  1672.          ST        R9,SAVPLDAT         SAVE PLACE IN BUFFER
  1673.          XC        SAVPL,SAVPL         RESET THIS
  1674.          NI        FLAGS,X'FF'-FLG3    TURN OFF LEFTOVER DATA FLAG
  1675.          B         GTCHR
  1676. *
  1677. ABORT    DS        0H
  1678.          CLI       ERRNUM,X'FE'        ERROR NUM = FE?
  1679.          BNE       SERROR1             YES, BRANCHCH
  1680.          MVI       BUF,C' '            BLANK
  1681.          MVC       BUF+1(255),BUF         OUT BUF
  1682.          MFSET     MUSFIL,MSG
  1683.          MVC       MUSARG+4(4),SIZE    SET MAX MESSAGE SIZE
  1684.          MFREQ     MUSFIL
  1685.          L         R5,MUSARG+4         GET LENGTH OF ERROR MESSAGE
  1686.          ST        R5,LSDAT            STORE LENGTH TO SEND
  1687.          BCTR      R5,0                SUBTRACT ONE FOR EXECUTE
  1688.          EX        R5,MOVESERR         MOVE MESSAGE TO SDAT
  1689.          EX        R5,TRANSERR         TRANSLATE TO ASCII
  1690. SERROR1  DS        0H
  1691.          TM        FLAGS,FLG5          FILE OPEN?
  1692.          BNO       NOTOPEN
  1693.          MFSET     MUSFIL,CLOSE
  1694.          MFREQ     MUSFIL
  1695.          NI        FLAGS,X'FF'-FLG5    TURN OFF FILE OPEN FLAG
  1696. NOTOPEN  DS        0H
  1697.          CLI       ERRNUM,X'0A'        DID THE MICRO DIE?
  1698.          BE        NOERRP              NO ERROR PACKET IF SO
  1699.          MVI       STYPE,AE            ERROR PACKET
  1700.          MVC       N(4),NUM            SYNCH PACKET NUMBERS
  1701.          CLI       ERRNUM,X'FE'        ERROR = FF?
  1702.          BE        SERROR2             YES, BRANCH
  1703.          SR        R5,R5
  1704.          IC        R5,ERRNUM           GET RIGHT MESSAGE NUMBER
  1705.          M         R4,=F'20'           OFFSET := ERRNUM * 20
  1706.          LA        R5,ERRTAB(R5)
  1707.          CLI       OLDERR,S1ERRNUM     WAS IT A SERIES1 ERROR?
  1708.          BNE       NOTOPEN1            NO, THE WRITE OUT THE ERROR
  1709.          LA        R1,X'F0'            GET READY TO UNPK ERROR CODES
  1710.          ICM       R1,B'1110',KERFSRET MOVE IN THE ERROR CODES
  1711.          SRL       R1,4                GET RID OF LOWER ZERO
  1712.          ST        R1,WORK1            SAVE IT
  1713.          UNPK      S1RETC(6),WORK1(4)  MAKE IT SORTA-PRINTABLE
  1714.          TR        S1RETC(6),HEXTB     PRETTY IT UP
  1715. NOTOPEN1 MVC       SDAT(20),0(R5)      SPACK NEEDS THE DATA HERE
  1716.          TR        SDAT(20),ETOA       TRANSLATE TO ASCII
  1717.          MVC       LSDAT,=F'20'        STORE THE DATA LENGTH
  1718. SERROR2  DS        0H
  1719.          L         R15,=A(SPACK)
  1720.          BALR      R14,R15             SEND ERROR PACKET & DIE
  1721. NOERRP   LA        R15,4               SET NON-ZERO RETCODE
  1722.          B         SENDRET             PREPARE TO LEAVE
  1723. COMPLETE SR        R15,R15             ZERO WILL BE RETCODE
  1724. SENDRET  EQU       *
  1725.          TM        S1FLAGS,ISS1        ON A SERIES1/7171?
  1726.          BNO       SENDRET2            NO - SKIP OVER DE-INIT STUFF
  1727.          LR        R2,R15              SAVE THE RETCODE
  1728.          SR        R1,R1               SET PARM FOR END FULL SCREEN I/O
  1729.          L         R15,=A(INTRINI)
  1730.          BALR      R14,R15
  1731.          LR        R15,R2              RESTORE THE RETURN CODE
  1732. SENDRET2 L         R13,4(R13)
  1733.          L         R14,12(R13)
  1734.          LM        R0,R12,20(R13)
  1735.          BR        R14
  1736. SENDSAVE DS        18F
  1737. TRANS    TR        BUF(0),ETOA         EBCDIC TO ASCII TRANSLATION
  1738. MOVESERR MVC       SDAT(0),BUF         MOVE MESSAGE TO SDAT
  1739. TRANSERR TR        SDAT(0),ETOA        TRANSLATE TO ASCII
  1740.          LTORG
  1741.          DROP      R11
  1742.          DROP      R12                 DON'T NEED THEM ANYMORE
  1743.          EJECT
  1744. SPACK    CSECT
  1745.          STM       R14,R12,12(R13)     SAVE CALLER'S REGISTERS
  1746.          BALR      R12,0               ESTABLISH ADDRESSABILITY
  1747.          USING     *,R12
  1748.          LA        R14,SPSAVE          ADDRESS OF MY SAVE AREA
  1749.          ST        R13,4(R14)          SAVE CALLER'S
  1750.          ST        R14,8(R13)
  1751.          LR        R13,R14
  1752. * USE R11 AS BASE REGISTER FOR 'PARMS' GLOBAL DATA AREA
  1753.          L         R11,=A(PARMS)
  1754.          USING     PARMS,R11           ESTABLISH ADDRESSABILITY
  1755.          XC        SNDPKT,SNDPKT
  1756.          SR        R9,R9
  1757.          MVI       PHDR,SOH            ADD CONTROL-A TO PACKET
  1758.          CLC       LSDAT,SIZE          NEED DATA SIZE <= SPSIZ-5
  1759.          BNH       FINE
  1760.          MVI       ERRNUM,X'00'        DATA SIZE EXCEEDS MAX LIMIT
  1761.          MVI       STATE,C'A'          ABORT ON THIS
  1762.          B         SPRET
  1763. FINE     DS        0H
  1764.          L         R4,=F'35'           USE ^O43 TO OFFSET DATA
  1765.          A         R4,LSDAT            ADD IT TO LSDAT
  1766.          STC       R4,PLEN
  1767.          AR        R9,R4               AND THEN ADD IT TO CHECKSUM
  1768.          CLC       N,ZERO              CHECK IF N IS VALID
  1769.          BNL       T1                  OK IF >= TO 0
  1770.          MVI       ERRNUM,X'01'        ILLEGAL MESSAGE NUMBER
  1771.          MVI       STATE,C'A'
  1772.          B         SPRET
  1773. T1       CLC       N,O1H               SEE IF IS <= OCTAL 100
  1774.          BNH       T2
  1775.          MVI       ERRNUM,X'01'        ILLEGAL MESSAGE NUMBER
  1776.          MVI       STATE,C'A'
  1777.          B         SPRET
  1778. T2       L         R4,SPACE            OFFSET THIS VALUE TOO
  1779.          A         R4,N                ADD IT TO N
  1780.          ST        R4,TEMP
  1781.          MVC       PNUM(1),TEMP+3
  1782.          A         R9,TEMP             AND ADD TO CHECKSUM
  1783.          CLI       STYPE,X'41'         ASCII 'A'
  1784.          BL        T3                  CAN'T BE LESS THAN THIS
  1785.          CLI       STYPE,X'5A'         ASCII 'Z'
  1786.          BNH       T4                  CAN'T BE GREATER
  1787. T3       MVI       ERRNUM,X'07'        ILLEGAL PACKET TYPE
  1788.          MVI       STATE,C'A'          DIE ON THIS
  1789.          B         SPRET
  1790. T4       MVC       PTYPE(1),STYPE      ADD MESSAGE TYPE
  1791.          SR        R2,R2               ZERO IT OUT
  1792.          IC        R2,STYPE
  1793.          AR        R9,R2               ADD TO CHECKSUM
  1794.          L         R6,LSDAT            HOW MUCH DATA
  1795.          LTR       R6,R6               TEST IT OUT
  1796.          BZ        NODAT
  1797.          SR        R5,R5               USE TO GET DATA
  1798.          SR        R3,R3               USE TO HOLD DATA
  1799. DATCHK   IC        R3,SDAT(R5)         PICK UP CHAR
  1800.          AR        R9,R3               ADD TO CHECKSUM
  1801.          LA        R5,1(R5)            BUMP POINTER
  1802.          BCTR      R6,0
  1803.          LTR       R6,R6               MORE DATA?
  1804.          BNZ       DATCHK
  1805.          L         R7,LSDAT            GET DATA LENGTH
  1806.          BCTR      R7,0                SUBTRACT 1 FOR EX FUNCTION
  1807.          EX        R7,MOVE             MOVE THE DATA TO SNDPKT
  1808. NODAT    DS        0H
  1809.          ST        R9,TEMP             WE'LL NEED THIS SOON
  1810.          N         R9,=X'000000C0'     GET MOD 192
  1811.          M         R8,ONE              CARRY OVER THE SIGN BIT
  1812.          D         R8,O1H              GET MOD 64
  1813.          A         R9,TEMP             ADD THE TWO VALUES
  1814.          N         R9,=X'0000003F'     GET MOD 64 OF CHECKSUM
  1815.          A         R9,SPACE            ADD OFFSET
  1816.          L         R6,LSDAT            GET DATA LENGTH
  1817.          STC       R9,PDATA(R6)        ADD CHECKSUM AFTER DATA
  1818.          LA        R6,1(R6)            MOVE POINTER
  1819.          IC        R9,SEOL             ADD SEND END OF PACKET CHAR
  1820.          STC       R9,PDATA(R6)
  1821.          LA        R6,5(R6)            VALUE OF LSDAT+5
  1822.          TM        S1FLAGS,ISS1        WE A SERIES1/7171 TERM?
  1823.          BNO       SENDTTY             NOPE - THEN DO IT THE ASCII WAY
  1824.          LA        R7,S1ORDSL(R6)      BUMP UP LENGTH FOR XPARENCY
  1825.          ST        R7,KERMFSWL         SAVE IN FSARG BLOCK
  1826.          XC        RECPKT,RECPKT       CLEAR OUT THE RECEIVE BUFFER
  1827.          MVC       KERMARSZ(4),=F'-1'  SET NEGATIVE RBC
  1828.          MFREQ     KERMFARG    DO THE FULL SCREEN WRITE-ERASE/READ
  1829.          CLI       KERFSRET,X'00'      ZERO RETCODE??
  1830.          BE        SPRET               GREAT - WE'RE DONE HERE
  1831.          MVI       ERRNUM,S1ERRNUM     SET SERIES1/7171/FSIO ERROR
  1832.          MVI       STATE,C'A'          WE WILL ABORT THIS ONE
  1833.          B         SPRET               AND EXIT
  1834. SENDTTY  TR        SNDPKT(130),ATOE    SEND IN EBCDIC
  1835.          SR        R4,R4
  1836.          LA        R4,7                CC,SOH, PLEN,PNUM,PTYP,CHKSUM,0D
  1837.          A         R4,LSDAT            ADD IN LENGTH OF DATA
  1838.          ST        R4,IOARG+4          STORE LENGTH TO WRITE
  1839.          MFSET     REPLY,IO,R=(WR)
  1840.          MVI       IOBUF,X'41'         USE CC OF X'41' FOR NO TRANSLATE
  1841.          MVC       IOBUF+1(130),SNDPKT
  1842.          TR        IOBUF+1(131),OUTTTY
  1843.          MFREQ     REPLY
  1844. SPRET    L         R13,4(R13)
  1845.          L         R14,12(R13)
  1846.          LM        R0,R12,20(R13)
  1847.          BR        14
  1848. SPSAVE   DS        18F
  1849. MOVE     MVC       PDATA(0),SDAT
  1850.          LTORG
  1851.          DROP      R11
  1852.          DROP      R12                 DON'T NEED THEM ANYMORE
  1853.          EJECT
  1854. RPACK    CSECT
  1855.          STM       R14,R12,12(R13)     SAVE CALLER'S REGISTERS
  1856.          BALR      R12,0               ESTABLISH ADDRESSABILITY
  1857.          USING     *,R12
  1858.          LA        R14,RPSAVE          ADDRESS OF MY SAVE AREA
  1859.          ST        R13,4(R14)          SAVE CALLER'S
  1860.          ST        R14,8(R13)
  1861.          LR        R13,R14
  1862. * USE R11 AS BASE REGISTER FOR 'PARMS' GLOBAL DATA AREA
  1863.          L         R11,=A(PARMS)
  1864.          USING     PARMS,R11           ESTABLISH ADDRESSABILITY
  1865.          TM        S1FLAGS,ISS1        ARE WE ON A SERIES1/7171?
  1866.          BNO       RECTTY              GET IT THE ASCII WAY
  1867. *
  1868. *  NOTE: AS A RESULT OF THE SEND OPERATION A READ SHOULD ALWAYS
  1869. *        HAVE BEEN DONE. THEREFORE ALL WE DO IS CHECK IN THE
  1870. *        BUFFER TO MAKE SURE DATA WAS RECEIVED.
  1871. *
  1872.          MVC       RECPKT(L'RECPKT-3),RECPKT+3 SKIP THE FAKE AID
  1873.          NC        RECPKT,NOHIBITS     TURN OFF THE PARITY STUFF
  1874.          L         R0,KERMARSZ         GET SIZE OF PACKET
  1875.          S         R0,=F'4'            LESS AID,CURSOR ADDR AND CR
  1876.          BM        RPACK9              NOT ENUF RECEIVED
  1877.          LA        R6,RECPKT           POINT TO PACKET
  1878.          AR        R6,R0               ADD IN LENGTH
  1879.          MVC       0(4,R6),=F'0'       PATCH UP THE END
  1880.          B         RPACKA              AND SKIP OVER THE TTY STUFF
  1881. RECTTY   EQU       *
  1882.          MFSET     REPLY,IO,R=(RD)
  1883.          MVC       IOARG+4,IOBUFLEN
  1884.          MFREQ     REPLY
  1885.          TR        IOBUF(132),INPTTY
  1886.          MVC       RECPKT,IOBUF
  1887.          TR        RECPKT(130),ETOA
  1888. RPACKA   EQU       *
  1889.          NI        FLAGS,X'FF'-FLG4    ASSUME MICRO'LL NAK-NOT RPACK
  1890.          SR        R8,R8               INDEX REG FOR RECPKT
  1891.          SR        R5,R5               CHECKSUM REGISTER
  1892. TRY      LA        R7,RECPKT(R8)       ADDRESS OF CHARACTER
  1893.          CLI       0(R7),SOH           IS IT CONTROL-A
  1894.          BE        READIN              YES; SO FAR, SO GOOD
  1895.          LA        R8,1(R8)            TRY NEXT CHARACTER
  1896.          C         R8,=F'130'          SEE IF EXCEED BUFFER
  1897.          BL        TRY
  1898.          MVI       ERRNUM,X'03'        NO "SOH" ERROR
  1899.          B         BADP
  1900. READIN   SR        R9,R9               ZERO OUT INDEX REG FOR RDAT
  1901.          LA        R8,1(R8)            INCREMENT COUNTER
  1902.          LA        R7,RECPKT(R8)       PICK UP LOC OF CHAR COUNT
  1903.          CLI       0(R7),SOH           IS IT CONTROL-A
  1904.          BE        READIN              START OVER
  1905.          CLC       0(1,R7),DQUOTE      COUNT+' '+3 AND ^d35
  1906.          BNL       CONT                CONTINUE IF >=
  1907.          MVI       ERRNUM,X'04'        BAD LENGTH ATTRIBUTE
  1908.          B         BADP
  1909. CONT     IC        R5,0(R7)            START CHECKSUM
  1910.          LR        R7,R5               MUNGE IN R7 TO GET LRDAT
  1911.          S         R7,=F'35'           LENGTH OF DATA
  1912.          STC       R7,LRDAT+3
  1913.          LA        R8,1(R8)            INCREMENT
  1914.          SR        R7,R7               ZERO IT OUT
  1915.          IC        R7,RECPKT(R8)       PICK UP PACKET NUMBER
  1916.          C         R7,=A(SOH)          IS IT CONTROL-A
  1917.          BE        READIN
  1918.          AR        R5,R7               ADD TO CHECKSUM
  1919.          S         R7,SPACE            SUBTRACT THE ' '
  1920.          STC       R7,NUM+3            NUM := RECEIVED PACKET NO.
  1921.          LA        R8,1(R8)            INCREMENT COUNTER
  1922.          IC        R7,RECPKT(R8)       PICK UP MESSAGE TYPE
  1923.          C         R7,=A(SOH)          IS IT CONTROL-A
  1924.          BE        READIN
  1925.          AR        R5,R7               ADD TO CHECKSUM
  1926.          STC       R7,RTYPE            PUT INTO RTYPE
  1927.          LA        R8,1(R8)            GO TO NEXT BYTE
  1928.          L         R4,LRDAT            COUNTER TO GET ALL DATA
  1929. LUP      C         R4,ZERO             SEE IF PICKED UP ALL DATA
  1930.          BE        FIN
  1931.          XC        TEMP,TEMP           ZERO IT OUT
  1932.          LA        R7,RECPKT(R8)       NEXT LOCATION IN BUFFER
  1933.          MVC       TEMP+3(1),0(R7)     PICK UP NEXT BYTE
  1934.          CLI       TEMP+3,SOH          IS IT CONTROL-A
  1935.          BE        READIN
  1936.          LA        R7,RDAT(R9)         WHERE THE DATA'S GOING
  1937.          MVC       0(1,R7),TEMP+3      AND MOVE IT
  1938.          A         R5,TEMP             ADD TO CHECKSUM
  1939.          LA        R8,1(R8)            ADD ONE
  1940.          LA        R9,1(R9)            ADD ONE
  1941.          BCTR      R4,0                DECREMENT COUNTER
  1942.          B         LUP
  1943. FIN      SR        R7,R7               ZERO OUT REGISTER
  1944.          IC        R7,RECPKT(R8)       GET CHECKSUM
  1945.          C         R7,=A(SOH)          IS IT CONTROL-A
  1946.          BE        READIN
  1947.          ST        R5,TEMP             WE'LL NEED THIS SOON
  1948.          N         R5,=X'000000C0'     GET MOD 192
  1949.          M         R4,ONE              CARRY OVER THE SIGN BIT
  1950.          D         R4,O1H              GET MOD 64
  1951.          A         R5,TEMP             ADD THE TWO VALUES
  1952.          N         R5,=X'0000003F'     GET MOD 64
  1953.          A         R5,SPACE            ADD OFFSET
  1954.          CR        R5,R7               COMPUTED VS RECEIVED CHECKSUM
  1955.          BE        RPRET
  1956.          MVI       ERRNUM,X'05'        BAD CHECKSUM ERROR
  1957. BADP     MVI       RTYPE,AN            RETURN A NAK
  1958.          OI        FLAGS,FLG4          RPACK NAK'ED THE PACKET
  1959. RPRET    L         R13,4(R13)
  1960.          L         R14,12(R13)
  1961.          LM        R0,R12,20(R13)
  1962.          BR        14
  1963. RPACK9   DS        0H
  1964.          MVI       ERRNUM,S1ERRNUM     SET SERIES1/7171 ERROR
  1965.          MVI       STATE,C'A'          SAY WE'RE ABORTING
  1966.          B         RPRET               AND EXIT
  1967. RPSAVE   DS        18F
  1968. NOHIBITS DC        (L'RECPKT)X'7F'
  1969.          LTORG
  1970.          DROP      R11
  1971.          DROP      R12                 DON'T NEED THEM ANYMORE
  1972.          EJECT
  1973. RECEIVE  CSECT
  1974.          STM       R14,R12,12(R13)     SAVE CALLER'S REGISTERS
  1975.          BALR      R12,0               ESTABLISH ADDRESSABILITY
  1976.          USING     *,R12
  1977.          LA        R14,RECSAVE         ADDRESS OF MY SAVE AREA
  1978.          ST        R13,4(R14)          SAVE CALLER'S
  1979.          ST        R14,8(R13)
  1980.          LR        R13,R14
  1981. * USE R11 AS BASE REGISTER FOR THE GLOBAL DATA AREA, 'PARMS'
  1982.          L         R11,=A(PARMS)
  1983.          USING     PARMS,R11
  1984.          TM        S1FLAGS,ISS1        IS THIS A SERIES1/7171?
  1985.          BNO       RECIN1              NO, HTEN SKIP INITIALIZATION
  1986.          LA        R1,1                SET INIT PARM
  1987.          L         R15,=A(INTRINI)
  1988.          BALR      R14,R15             GO INIT FOR SERIES1/7171
  1989. RECIN1   SR        R6,R6               GET ZERO
  1990.          ST        R6,NUMTRY           ZERO THIS OUT
  1991.          ST        R6,N                HERE TOO
  1992.          XC        RBUF,RBUF           ZERO OUT THE BUFFER
  1993.          XC        RSAVPL,RSAVPL       CLEAR SAVE PLACE
  1994.          MVI       PREV,X'00'          ZERO OUT PREVIOUS LINE
  1995.          MVI       STATE,C'R'          SET TO RECEIVE STATE
  1996. RLOOP    CLI       STATE,C'D'          RECEIVE DATA STATE
  1997.          BE        RDATA
  1998.          CLI       STATE,C'F'          RECEIVE FILE STATE
  1999.          BE        RFILE
  2000.          CLI       STATE,C'R'          RECEIVE INIT STATE
  2001.          BE        RINIT
  2002.          CLI       STATE,C'C'          COMPLETE STATE
  2003.          BE        RCOMP
  2004.          CLI       STATE,C'A'          ABORT STATE
  2005.          BE        RABORT
  2006.          MVI       ERRNUM,X'02'        UNRECOGNIZED STATE
  2007.          B         RABORT              ELSE, DIE
  2008. RINIT    CLC       NUMTRY,IMXTRY       SEE IF CAN RECEIVE
  2009.          BL        ROK1                YES, WE CAN
  2010.          MVI       STATE,C'A'          NOPE, GO INTO ABORT STATE
  2011.          B         RLOOP
  2012. ROK1     L         R3,NUMTRY
  2013.          LA        R3,1(R3)            INCREMENT TRIAL COUNTER
  2014.          ST        R3,NUMTRY
  2015.          L         R4,DSSIZ            DEFAULT SEND PACKET SIZE
  2016.          S         R4,FIVE             USE DEFAULT TO SET "SIZE"
  2017.          ST        R4,SIZE             IN CASE WE DIE BEFORE IT'S SET
  2018.          L         R15,=A(RPACK)       GET INIT INFORMATION
  2019.          BALR      R14,R15
  2020.          CLI       RTYPE,AE            ERROR PACKET?
  2021.          BNE       RY1                 ALL OK
  2022.          MVI       ERRNUM,X'0A'        MICRO DIED
  2023.          MVI       STATE,C'A'          SO WE DO TOO
  2024.          B         RLOOP
  2025. RY1      CLI       RTYPE,AS            IS IT A SEND-INIT PACKET
  2026.          BNE       RN1                 MAYBE IT GOT CLOBBERED
  2027.          SR        R4,R4               ZERO OUT REGISTER
  2028.          IC        R4,RDAT             GET FIRST CHARACTER
  2029.          S         R4,SPACE            SUBTRACT THE ' '
  2030.          C         R4,=F'26'           MIN SPACK SIZE
  2031.          BNL       RCH1                SO FAR, SO GOOD
  2032.          MVI       STATE,C'A'          ELSE, ABORT
  2033.          MVI       ERRNUM,X'00'        INVALID DATA-PACKET-SIZE ERROR
  2034.          B         RLOOP
  2035. RCH1     C         R4,MAXPACK          MAX PACKET SIZE
  2036.          BNH       RCH2
  2037.          MVI       STATE,C'A'          ABORT IF SIZE IS ILLEGAL
  2038.          MVI       ERRNUM,X'00'        BAD SEND DATA LENGTH
  2039.          B         RLOOP
  2040. RCH2     STC       R4,SPSIZ+3          USE THE VALUE AS SEND SIZE
  2041.          S         R4,FIVE
  2042.          ST        R4,SIZE             SET IT TO SPSIZ-5
  2043.          CLC       LRDAT(4),=F'4'      USING ALL DEFAULTS ?
  2044.          BNH       NOCH                YUP
  2045.          LA        R5,RDAT             POINT TO THE BUFFER
  2046.          SR        R7,R7
  2047.          IC        R7,4(R5)            SEOL THE MICRO WANTS
  2048.          S         R7,SPACE            UNCHAR (SUBTRACT ' ')
  2049.          STC       R7,SEOL
  2050.          CLC       LRDAT(4),FIVE       ANY MORE DATA?
  2051.          BNH       NOCH                JUST USE DEFAULTS
  2052.          MVC       RQUO(1),5(R5)       SET NEW QUOCHAR VALUE
  2053. NOCH     MVC       N(4),NUM            SYNCH PACKET NUMBERS
  2054.          MVI       STYPE,AY            SET MESSAGE TYPE TO ACK
  2055.          MVC       LSDAT(4),=F'6'      SET LENGTH OF DATA SENDING
  2056.          L         R5,SPACE            MAKE CHARACTER PRINTABLE
  2057.          A         R5,RPSIZ            ADD REC PACKET SIZE
  2058.          STC       R5,SDAT             ADD SIZE INFO TO BUFFER
  2059.          L         R5,SPACE
  2060.          A         R5,=F'8'            8 FOR TIMEOUT
  2061.          STC       R5,SDAT+1
  2062.          L         R5,SPACE            SEND ZERO + " " FOR NPAD
  2063.          STC       R5,SDAT+2           WE'RE THE SLOW GUYS
  2064.          SR        R5,R5               PAD WITH NULLS
  2065.          L         R3,O1H
  2066.          XR        R5,R3               CTL FUNCTION (XOR WITH 64)
  2067.          STC       R5,SDAT+3           DON'T NEED PADCHAR EITHER
  2068.          SR        R5,R5               ZERO IT OUT FOR NEXT TWO GUYS
  2069.          IC        R5,REOL             EOL CHAR I NEED
  2070.          A         R5,SPACE            MAKE PRINTABLE
  2071.          STC       R5,SDAT+4
  2072.          IC        R5,QUOCHAR          MY QUOTE CHAR
  2073.          STC       R5,SDAT+5
  2074.          L         R15,=A(SPACK)       ADDRESS OF SPACK
  2075.          BALR      R14,R15             SAVE * AND GO TO SPACK
  2076.          CLI       STATE,C'A'
  2077.          BE        RABORT
  2078.          MVI       STATE,C'F'          SET TO RECEIVE FILE STATE
  2079.          MVC       OLDTRY(4),NUMTRY    SAVE TRIAL COUNTER
  2080.          XC        NUMTRY,NUMTRY       RESET COUNTER TO ZERO
  2081.          L         R3,N
  2082.          LA        R3,1(R3)            ADD ONE
  2083.          ST        R3,N                STORE VALUE INCREMENTED BY 1
  2084.          NC        N(4),=X'0000003F'   MASK TO GET MOD 64
  2085.          B         RLOOP
  2086. RN1      CLI       RTYPE,AN            MAYBE IT'S A NAK
  2087.          BNE       RSELSE
  2088.          MVI       STYPE,AN            SEND A NAK PACKET
  2089.          XC        LSDAT,LSDAT         NO DATA
  2090.          L         R15,=A(SPACK)
  2091.          BALR      R14,R15
  2092.          B         RLOOP
  2093. RSELSE   MVI       STATE,C'A'          ELSE,ABORT
  2094.          CLI       ERRNUM,S1ERRNUM     SERIES1 ERROR?
  2095.          BE        RLOOP               DON'T MASK IT
  2096.          MVI       ERRNUM,X'07'        ILLEGAL PACKET TYPE
  2097.          B         RLOOP
  2098. RFILE    CLC       NUMTRY,MAXTRY       EXCEEDED NO. OF TRIALS ALLOWED
  2099.          BL        ROK2                NOPE, STILL OK
  2100.          MVI       STATE,C'A'          ABORT IF YES
  2101.          B         RLOOP
  2102. ROK2     L         R3,NUMTRY
  2103.          LA        R3,1(R3)            INCREMENT TRIAL COUNTER
  2104.          ST        R3,NUMTRY
  2105.          L         R15,=A(RPACK)       GET ADDRESS OF RPACK
  2106.          BALR      R14,R15             GO THERE AND RETURN WHEN DONE
  2107.          CLI       RTYPE,AE            ERROR PACKET?
  2108.          BNE       RY2                 MAYBE AN ACK
  2109.          MVI       ERRNUM,X'0A'        MICRO DIED
  2110.          MVI       STATE,C'A'          SO WE DO TOO
  2111.          B         RLOOP
  2112. RY2      CLI       RTYPE,AS            STILL IN INIT STATE?
  2113.          BNE       RNZ                 TRY FOR AN EOF
  2114.          CLC       OLDTRY,MAXTRY       CAN WE TRY AGAIN?
  2115.          BL        ROLD
  2116.          MVI       STATE,C'A'          ELSE, ABORT
  2117.          B         RLOOP
  2118. ROLD     L         R3,OLDTRY
  2119.          LA        R3,1(R3)            INCREMENT COUNTER
  2120.          ST        R3,OLDTRY
  2121.          L         R3,N                GET PACKET NUMBER SENT
  2122.          BCTR      R3,0                SUBTRACT ONE FROM IT
  2123.          C         R3,NUM              NUM MUST EQUAL N-1
  2124.          BE        RNUM
  2125.          MVI       ERRNUM,X'08'        PREVIOUS PACKET MISSING
  2126.          B         RNAK                SEND A NAK
  2127. RNUM     MVI       STYPE,AY            ACK PACKET
  2128.          ST        R3,N                MAKE SEND SEQ NO. = N-1
  2129.          MVC       LSDAT(4),=F'6'      SET DATA LENGTH VARIABLE
  2130.          L         R15,=A(SPACK)
  2131.          BALR      R14,R15             GO TO SPACK AND RETURN
  2132.          CLI       STATE,C'A'
  2133.          BE        RABORT
  2134.          L         R4,N
  2135.          LA        R4,1(R4)            ADD ONE
  2136.          ST        R4,N                RESTORE N TO PROPER VALUE
  2137.          XC        NUMTRY,NUMTRY       RESET COUNTER TO ZERO
  2138.          B         RLOOP
  2139. RNZ      CLI       RTYPE,AZ
  2140.          BNE       RNF                 MAYBE IT'S AN 'F'
  2141.          CLC       OLDTRY,MAXTRY       CAN WE TRY AGAIN?
  2142.          BL        ROLD2
  2143.          MVI       STATE,C'A'          ELSE,ABORT
  2144.          B         RLOOP
  2145. ROLD2    L         R3,OLDTRY
  2146.          LA        R3,1(R3)            INCREMENT COUNTER
  2147.          ST        R3,OLDTRY
  2148.          L         R3,N                GET PACKET NUMBER SENT
  2149.          BCTR      R3,0                SUBTRACT ONE FROM IT
  2150.          C         R3,NUM              NUM MUST EQUAL N-1
  2151.          BE        RNUM2
  2152.          MVI       ERRNUM,X'08'        PREVIOUS PACKET MISSING
  2153.          B         RNAK                SEND A NAK
  2154. RNUM2    MVI       STYPE,AY            ACK PACKET
  2155.          ST        R3,N                SEND SEQ := N-1
  2156.          XC        LSDAT,LSDAT         NO DATA
  2157.          L         R15,=A(SPACK)
  2158.          BALR      R14,R15
  2159.          CLI       STATE,C'A'
  2160.          BE        RABORT
  2161.          L         R4,N
  2162.          LA        R4,1(R4)            ADD ONE
  2163.          ST        R4,N                RESTORE N TO PROPER VALUE
  2164.          XC        NUMTRY,NUMTRY       RESET COUNTER TO ZERO
  2165.          B         RLOOP
  2166. RNF      CLI       RTYPE,AF
  2167.          BNE       RNB                 WELL, IT'S NOT A FNAME
  2168.          CLC       NUM,N               THEY HAVE TO BE EQUAL
  2169.          BE        RNUM3
  2170.          MVI       ERRNUM,X'08'        PREVIOUS PACKET MISSING
  2171.          B         RNAK                SEND A NAK
  2172. RNUM3    MVI       STYPE,AY            ACK PACKET
  2173.          XC        LSDAT,LSDAT         NO DATA
  2174.          TM        FLAGS,FLG2          OVERWRITE THE NAME SENT?
  2175.          BNO       ROPENFIL            NO, GO OPEN THE FILE
  2176.          MVC       LSDAT(4),FNAMLEN    GET FILE NAME LENGTH
  2177.          MVC       SDAT(17),FILNAM     MOVE FILNAM TO TO SEND DATA
  2178.          TR        SDAT(17),ETOA       TRANSLATE TO ASCII
  2179.          B         RFACK               GO SEND ACK
  2180. ROPENFIL DS        0H
  2181.          L         R4,LRDAT            GET SIZE OF FILNAM
  2182.          LTR       R4,R4               CHECK LENGTH
  2183.          BZ        SAYNO               DIE IF NO FILENAME
  2184.          C         R4,=F'17'           LENGTH GREATER THAN 17 CHARS?
  2185.          BNH       RFNAMEOK            NO, NAME IS OK
  2186.          LA        R4,17               TRUNCATE NAME TO 17 CHARACTERS
  2187. RFNAMEOK DS        0H
  2188.          MVC       FILNAM,=22X'20'     INITIALIZE TO BLANKS
  2189.          ST        R4,FNAMLEN          STORE FILE NAME LENGTH
  2190.          BCTR      R4,0                SUBTRACT ONE FOR EXECUTE
  2191.          EX        R4,MOVEFNAM         MOVE THE FILE NAME
  2192.          TR        FILNAM(22),ATOE     TRANSLATE TO EBCDIC
  2193.          LA        R4,FILNAM(R4)       POINT TO LAST CHARACTER
  2194.          CLI       0(R4),C'.'          PERIOD?
  2195.          BNE       RFNAME2             NO, NAME IS OK
  2196.          MVI       0(R4),C' '          YES, CHANGE TO BLANK
  2197. RFNAME2  DS        0H
  2198.          LA        R5,RBUF             GET ADDRESS OF BUFFER
  2199.          ST        R5,MUSARG+8         STORE IN MUSARG
  2200.          MVC       MUSARG+4(4),=F'256'
  2201.          MFSET     MUSFIL,OPEN,R=(OKNEW,WROK)
  2202.          MFREQ     MUSFIL,BAD=RERROR
  2203.          OI        FLAGS,FLG5          TURN ON FILE OPEN FLAG
  2204. *
  2205. RFACK    DS        0H
  2206.          L         R15,=A(SPACK)
  2207.          BALR      R14,R15             SEND ACK
  2208.          CLI       STATE,C'A'
  2209.          BE        RABORT
  2210.          MVC       OLDTRY(4),NUMTRY    KEEP NUMTRY FOR LATER
  2211.          XC        NUMTRY,NUMTRY       RESET TO ZERO
  2212.          L         R3,N
  2213.          LA        R3,1(R3)            ADD ONE
  2214.          ST        R3,N                INCREMENT COUNTER
  2215.          NC        N(4),=X'0000003F'   MASK TO GET MOD 64
  2216.          MVI       STATE,C'D'          DATA RECEIVE STATE
  2217.          B         RLOOP
  2218. RNB      CLI       RTYPE,AB            SEE IF IT'S A BREAK
  2219.          BNE       RNN                 MAYBE GOT A NAK
  2220.          CLC       NUM,N
  2221.          BE        RNUM4
  2222.          MVI       ERRNUM,X'08'        PREVIOUS PACKET MISSING
  2223.          B         RNAK                SEND A NAK
  2224. RNUM4    MVI       STYPE,AY            ACK PACKET
  2225.          XC        LSDAT,LSDAT         NO DATA
  2226.          L         R15,=A(SPACK)
  2227.          BALR      R14,R15
  2228.          CLI       STATE,C'A'
  2229.          BE        RABORT
  2230.          MVI       STATE,C'C'          COMPLETE STATE
  2231.          B         RLOOP
  2232. RNN      CLI       RTYPE,AN            SEE IF GOT A NAK
  2233.          BNE       RNELSE
  2234. RNAK     MVI       STYPE,AN            SEND A NAK PACKET
  2235.          XC        LSDAT,LSDAT         NO DATA
  2236.          L         R15,=A(SPACK)
  2237.          BALR      R14,R15
  2238.          B         RLOOP               DO NOTHING ON A NAK
  2239. RNELSE   MVI       STATE,C'A'          ABORT OTHERWISE
  2240.          CLI       ERRNUM,S1ERRNUM     SERIES1 ERROR?
  2241.          BE        RLOOP               DON'T MASK IT
  2242.          MVI       ERRNUM,X'07'        ILLEGAL PACKET TYPE
  2243.          B         RLOOP
  2244. RDATA    CLC       NUMTRY,MAXTRY       HAVE WE EXCEEDED OUR LIMIT?
  2245.          BL        ROK3
  2246.          MVI       STATE,C'A'          ELSE, ABORT
  2247.          B         RLOOP
  2248. ROK3     L         R4,NUMTRY
  2249.          LA        R4,1(R4)            INCREMENT
  2250.          ST        R4,NUMTRY           SAVE INCREMENTED COUNTER
  2251.          L         R15,=A(RPACK)
  2252.          BALR      R14,R15             CALL RPACK
  2253.          CLI       RTYPE,AE            ERROR PACKET?
  2254.          BNE       RY3                 MAYBE AN ACK
  2255.          MVI       ERRNUM,X'0A'        MICRO DIED
  2256.          MVI       STATE,C'A'          WE ABORT TOO
  2257.          B         RLOOP
  2258. RY3      CLI       RTYPE,AD            IS THIS A DATA PACKET?
  2259.          BNE       RDF                 MAYBE IT'S AN FNAME PACKET
  2260.          CLC       N,NUM               CHECK FOR RIGHT PACKET
  2261.          BNE       DIF
  2262.          L         R15,=A(PTCHR)
  2263.          BALR      R14,R15             PUT CHARACTERS INTO FILE
  2264.          CLI       STATE,C'A'          ABORT ON FILE SYSTEM ERROR
  2265.          BE        RLOOP
  2266.          MVI       STYPE,AY            ACK PACKET
  2267.          XC        LSDAT,LSDAT         NO DATA
  2268.          L         R15,=A(SPACK)
  2269.          BALR      R14,R15
  2270.          CLI       STATE,C'A'
  2271.          BE        RABORT
  2272.          MVC       OLDTRY(4),NUMTRY    SAVE NUMTRY'S VALUE IN OLDTRY
  2273.          XC        NUMTRY,NUMTRY       RESET NUMTRY
  2274.          L         R3,N
  2275.          LA        R3,1(R3)
  2276.          ST        R3,N                INCREMENT COUNTER
  2277.          NC        N(4),=X'0000003F'   MASK TO GET MOD 64
  2278.          B         RLOOP
  2279. DIF      CLC       OLDTRY,MAXTRY       CAN WE DO IT?
  2280.          BL        DIFNUM
  2281.          MVI       STATE,C'A'          AND ABORT
  2282.          B         RLOOP
  2283. DIFNUM   L         R4,OLDTRY
  2284.          LA        R4,1(R4)
  2285.          ST        R4,OLDTRY           INCREMENT THIS COUNTER
  2286.          L         R4,N
  2287.          BCTR      R4,0
  2288.          C         R4,NUM              NUM MUST EQUAL N-1
  2289.          BE        DIFOK
  2290.          MVI       ERRNUM,X'08'        PREVIOUS PACKET MISSING
  2291.          B         RDN1                SEND A NAK
  2292. DIFOK    XC        NUMTRY,NUMTRY       RESET COUNTER TO ZERO
  2293.          MVI       STYPE,AY            ACK PACKET
  2294.          XC        LSDAT,LSDAT         NO DATA
  2295.          ST        R4,N                SET N TO N-1 TO RESEND PACKET
  2296.          L         R15,=A(SPACK)
  2297.          BALR      R14,R15             SEND THE PACKET
  2298.          CLI       STATE,C'A'
  2299.          BE        RABORT
  2300.          L         R4,N
  2301.          LA        R4,1(R4)            ADD ONE
  2302.          ST        R4,N                RESTORE N TO PROPER VALUE
  2303.          B         RLOOP               AND RETURN
  2304. RDF      CLI       RTYPE,AF            SENDING FILENAME AGAIN?
  2305.          BNE       RDZ
  2306.          CLC       OLDTRY,MAXTRY       CAN WE DO IT?
  2307.          BL        FILOVER             TRYING IT AGAIN
  2308.          MVI       STATE,C'A'          IF NO, ABORT
  2309.          B         RLOOP
  2310. FILOVER  L         R4,OLDTRY
  2311.          LA        R4,1(R4)
  2312.          ST        R4,OLDTRY           SAVE INCREMENTED VALUE
  2313.          L         R4,N
  2314.          BCTR      R4,0                NEED VALUE OF N-1
  2315.          C         R4,NUM              N-1 MUST EQUAL NUM
  2316.          BE        FILOK
  2317.          MVI       ERRNUM,X'08'        PREVIOUS PACKET MISSING
  2318.          B         RDN1                SEND A NAK
  2319. FILOK    XC        NUMTRY,NUMTRY       RESET TO ZERO
  2320.          XC        LSDAT,LSDAT         NO DATA
  2321.          MVI       STYPE,AY            ACK PACKET AGAIN
  2322.          ST        R4,N                SET N TO N-1 FOR NOW
  2323.          TM        FLAGS,FLG5          IS FILE ALREADY OPEN?
  2324.          BO        RDFACK              YES, BRANCH
  2325.          TM        FLAGS,FLG2          OVERWRITE THE NAME SENT?
  2326.          BNO       RDFOPEN             NO, GO OPEN FILE
  2327.          MVC       LSDAT(4),FNAMLEN    GET FILE NAME LENGTH
  2328.          MVC       SDAT(17),FILNAM     MOVE FILNAM TO TO SEND DATA
  2329.          TR        SDAT(17),ETOA       TRANSLATE TO ASCII
  2330.          B         RDFACK              GO SEND ACK
  2331. RDFOPEN  DS        0H
  2332.          L         R4,LRDAT            GET SIZE OF FILNAM
  2333.          LTR       R4,R4               CHECK LENGTH
  2334.          BZ        SAYNO               DIE IF NO FILENAME
  2335.          C         R4,=F'17'           LENGTH GREATER THAN 17 CHARS?
  2336.          BNH       RDFNAMOK            NO, NAME IS OK
  2337.          LA        R4,17               TRUNCATE NAME TO 17 CHARACTERS
  2338. RDFNAMOK DS        0H
  2339.          MVC       FILNAM,=22X'20'     INITIALIZE TO BLANKS
  2340.          ST        R4,FNAMLEN          STORE FILE NAME LENGTH
  2341.          BCTR      R4,0                SUBTRACT ONE FOR EXECUTE
  2342.          EX        R4,MOVEFNAM         MOVE THE FILE NAME
  2343.          TR        FILNAM(22),ATOE     TRANSLATE TO EBCDIC
  2344.          LA        R4,FILNAM(R4)       POINT TO LAST CHARACTER
  2345.          CLI       0(R4),C'.'          PERIOD?
  2346.          BNE       RDFNAME2            NO, NAME IS OK
  2347.          MVI       0(R4),C' '          YES, CHANGE TO BLANK
  2348. RDFNAME2 DS        0H
  2349.          LA        R5,RBUF             GET ADDRESS OF BUFFER
  2350.          ST        R5,MUSARG+8         STORE IN MUSARG
  2351.          MVC       MUSARG+4(4),=F'256'
  2352.          MFSET     MUSFIL,OPEN,R=(OKNEW,WROK)
  2353.          MFREQ     MUSFIL,BAD=RERROR
  2354.          OI        FLAGS,FLG5          TURN ON FILE OPEN FLAG
  2355. RDFACK   DS        0H
  2356.          L         R15,=A(SPACK)
  2357.          BALR      R14,R15
  2358.          CLI       STATE,C'A'
  2359.          BE        RABORT
  2360.          L         R4,N
  2361.          LA        R4,1(R4)            ADD ONE
  2362.          ST        R4,N                RESTORE N TO PROPER VALUE
  2363.          B         RLOOP               AND RETURN
  2364. RDZ      CLI       RTYPE,AZ            IS THIS AN EOF PACKET?
  2365.          BNE       RDN
  2366.          CLC       N,NUM               ARE THEY EQUAL
  2367.          BE        RDOK
  2368.          MVI       ERRNUM,X'08'        PREVIOUS PACKET MISSING
  2369.          B         RDN1                SEND A NAK
  2370. RDOK     MVI       STYPE,AY            ACK THE PACKET
  2371.          XC        LSDAT,LSDAT         NO DATA
  2372.          L         R4,LRDAT            GET DATA LENGTH
  2373.          LTR       R4,R4               ANY DATA?
  2374.          BZ        RDZEOF              NO, NORMAL EOF
  2375.          CLI       RDAT,X'44'          DISCARD FILE?
  2376.          BNE       RDZEOF              NO, CONTINUE
  2377.          MFSET     MUSFIL,CLOSE,R=(DEL)  SET TO DELETE FILE
  2378.          B         RDZCLOSE            BRANCH
  2379. RDZEOF   DS        0H
  2380.          MFSET     MUSFIL,CLOSE
  2381. RDZCLOSE DS        0H
  2382.          MFREQ     MUSFIL,BAD=RERROR
  2383.          NI        FLAGS,X'FF'-FLG5    TURN OFF FILE OPEN FLAG
  2384.          L         R15,=A(SPACK)
  2385.          BALR      R14,R15
  2386.          MVC       OLDTRY(4),NUMTRY    SAVE NUMTRY'S VALUE HERE
  2387.          XC        NUMTRY,NUMTRY       AND RESET COUNTER
  2388.          L         R3,N
  2389.          LA        R3,1(R3)
  2390.          ST        R3,N                STORE VALUE INCREMENTED BY 1
  2391.          NC        N(4),=X'0000003F'   MASK TO GET MOD 64
  2392.          MVI       STATE,C'F'          TRY FOR ANOTHER FILE
  2393.          B         RLOOP
  2394. RDN      CLI       RTYPE,AN            DO WE NEED TO SEND A NAK?
  2395.          BNE       RDELSE
  2396. RDN1     MVI       STYPE,AN            SEND A NAK
  2397.          XC        LSDAT,LSDAT         NO DATA
  2398.          L         R15,=A(SPACK)
  2399.          BALR      R14,R15
  2400.          B         RLOOP
  2401. RDELSE   MVI       STATE,C'A'          UNRECOGNIZED PACKET - ABORT
  2402.          CLI       ERRNUM,S1ERRNUM     SERIES1 ERROR?
  2403.          BE        RLOOP               DON'T MASK IT
  2404.          MVI       ERRNUM,X'07'        ILLEGAL PACKET TYPE
  2405.          B         RLOOP
  2406. SAYNO    DS        0H
  2407.          MVI       STYPE,AN            SEND A NAK PACKET
  2408.          XC        LSDAT,LSDAT         NO DATA
  2409.          MVI       ERRNUM,X'0B'        ILLEGAL FILENAME ERROR
  2410.          L         R15,=A(SPACK)
  2411.          BALR      R14,R15
  2412.          B         RLOOP
  2413. PTCHR    SR        R4,R4               USE TO HOLD QUOCHAR
  2414.          SR        R6,R6               USE TO HOLD LRECL
  2415.          SR        R8,R8               COUNTER WITHIN RDAT
  2416.          L         R9,RSAVPL           COUNTER WITHIN RBUF
  2417.          IC        R4,RQUO
  2418.          LH        R6,LRECL
  2419.          L         R5,LRDAT            COUNTER TO GET ALL DATA
  2420. RLUP     SR        R7,R7               USE TO PICK UP CHAR
  2421.          LTR       R5,R5               MORE DATA LEFT?
  2422.          BNZ       MOR                 LEAVE IF ALL DONE
  2423.          SR        R15,R15             ZERO OUT RETURN CODE
  2424.          CLI       PREV,X'4D'          ARE WE IN MIDDLE OF LINE?
  2425.          BER       R14                 LEAVE IF NOT
  2426.          ST        R9,RSAVPL           SAVE OUR PLACE
  2427.          BR        R14
  2428. MOR      BCTR      R5,0                DECREMENT CHAR COUNTER
  2429.          IC        R7,RDAT(R8)         GET DATA FROM RDAT
  2430.          CR        R7,R4               IS IT THE QUOTE CHARACTER?
  2431.          BNE       REGULAR
  2432.          BCTR      R5,0                DECREMENT CHAR COUNT
  2433.          LA        R8,1(R8)            MOVE POINTER
  2434.          IC        R7,RDAT(R8)         PICK UP SPECIAL CHAR
  2435.          C         R7,=X'0000004D'     IS IT A CR? (CHAR(CR))
  2436.          BNE       NOCR                WRITE OUT RECORD IF YES
  2437.          MVI       PREV,X'4D'          JUST HAD A CR
  2438.          LA        R8,1(R8)            IGNORE CONTROL CHAR
  2439.          B         RFIN
  2440. NOCR     C         R7,=X'0000004A'     HOW ABOUT A LF? (CHAR(LF))
  2441.          BNE       NOLF                IF YES, WRITE OUT RECORD
  2442.          LA        R8,1(R8)            IGNORE CONTROL CHAR
  2443.          CLI       PREV,X'4D'          WAS LAST THING CR?
  2444.          BNE       RFIN                NOPE, THEN KEEP ON
  2445.          B         RLUP                IGNORE LF IF PREV=CR
  2446. NOLF     CR        R7,R4               IS IT THE QUOCHAR
  2447.          BE        REGULAR             DON'T CONVERT IF IT IS
  2448.          A         R7,O1H              ADD ^O100
  2449.          N         R7,=X'0000007F'     GET MOD ^O200
  2450. REGULAR  STC       R7,RBUF(R9)         STORE CHAR IN RBUF
  2451.          LA        R9,1(R9)            MOVE RBUF COUNTER
  2452.          LA        R8,1(R8)            MOVE RDAT COUNTER
  2453.          MVI       PREV,X'00'          BLANK OUT CR IF WAS THERE
  2454.          C         R9,=F'255'          ONLY 256 CHARS ALLOWED
  2455.          BNH       RLUP                AND CONTINUE
  2456.          LR        R10,R9              USE MAX LENGTH OF 256
  2457.          B         WRFIL               AND WRITE TO FILE
  2458. RFIN     LTR       R10,R9              GET DATA SIZE
  2459.          BZ        FUDGE               GOTTA FAKE A BLANK LINE
  2460.          C         R7,=X'0000004D'     IS IT A CR?  (CHAR(CR))
  2461.          BE        WRFIL
  2462.          C         R7,=X'0000004A'     HOW ABOUT A LF? (CHAR(LF))
  2463.          BE        WRFIL
  2464.          ST        R10,RSAVPL          SAVE DATA RECEIVED SO FAR
  2465.          BR        14
  2466. FUDGE    MVI       RBUF,X'20'          MAKE FIRST CHAR A SPACE
  2467.          LA        R10,1(R10)          LENGTH OF ONE
  2468. WRFIL    XC        RSAVPL,RSAVPL       RESET THE POINTER
  2469.          TR        RBUF(256),ATOE      MAKE EBCDIC AGAIN
  2470.          CLI       RFM,X'02'           IS IT VARIABLE FORMAT?
  2471.          BH        VAR                 YES, BRANCH
  2472.          CR        R10,R6
  2473.          BH        PUR                 IGNORE DATA AFTER LRECL VALUE
  2474.          CR        R10,R6              PAD OUT TO LRECL SIZE ?
  2475.          BE        VAR                 NOPE, IT'S OK.
  2476.          LR        R2,R6               GET LRECL SIZE
  2477.          SR        R2,R10              PAD WITH THIS MANY SPACES
  2478.          BCTR      R2,0                MINUS ONE FOR THE 'EX'
  2479.          LA        R9,RBUF(R10)        START PADDING HERE
  2480.          MVI       0(R9),C' '          PUT IN THE FIRST SPACE
  2481.          LTR       R2,R2
  2482.          BZ        PUR                 DON'T PAD IF SIZE DIF WAS ONE
  2483.          BCTR      R2,0                SUBRTRACT SPACE WE JUST ADDED
  2484.          EX        R2,PAD              PAD OUT BUFFER
  2485. PUR      LR        R10,R6              LENGTH HAS TO BE THIS SIZE
  2486. VAR      DS        0H
  2487.          ST        R10,MUSARG+4        STORE LENGTH
  2488.          LA        R9,RBUF             GET ADDR OF BUFFER
  2489.          ST        R9,MUSARG+8         STORE ADDRESS IN MUSARG
  2490.          SR        R9,R9               SET RBUF POINTER BACK TO ZERO
  2491.          MFSET     MUSFIL,IO,R=(WR)
  2492.          MFREQ     MUSFIL,BAD=RERROR
  2493.          B         RLUP                GET NEXT LINE IF OK
  2494. RERROR   DS        0H
  2495.          MVI       STATE,C'A'          SET FOR ABORT
  2496.          MVC       MUSERR(1),MUSFIL+8  GET ERROR CODE
  2497.          MVI       ERRNUM,X'FE'        SET ERROR CODE
  2498.          B         RLOOP
  2499. RABORT   DS        0H
  2500.          CLI       ERRNUM,X'FE'        ERROR NUM = FE?
  2501.          BNE       RERROR1             YES, BRANCHCH
  2502.          MVI       RBUF,C' '           BLANK
  2503.          MVC       RBUF+1(255),RBUF       OUT RBUF
  2504.          MFSET     MUSFIL,MSG
  2505.          MVC       MUSARG+4(4),SIZE    SET MAX MESSAGE SIZE
  2506.          MFREQ     MUSFIL
  2507.          L         R5,MUSARG+4         GET LENGTH OF ERROR MESSAGE
  2508.          ST        R5,LSDAT            STORE LENGTH TO SEND
  2509.          BCTR      R5,0                SUBTRACT ONE FOR EXECUTE
  2510.          EX        R5,MOVEERR          MOVE MESSAGE TO SDAT
  2511.          EX        R5,TRANERR          TRANSLATE TO ASCII
  2512. RERROR1  DS        0H
  2513.          TM        FLAGS,FLG5          FILE OPEN?
  2514.          BNO       RNOTOPEN
  2515.          MFSET     MUSFIL,CLOSE
  2516.          MFREQ     MUSFIL
  2517.          NI        FLAGS,X'FF'-FLG5    TURN OFF FILE OPEN FLAG
  2518. RNOTOPEN DS        0H
  2519.          CLI       ERRNUM,X'0A'        DID THE MICRO DIE?
  2520.          BE        RNOERRP             NO ERROR PACKET IF SO
  2521.          MVI       STYPE,AE            ERROR PACKET
  2522.          MVC       N(4),NUM            SYNCH PACKET NUMBERS
  2523.          CLI       ERRNUM,X'FE'        ERROR = FF?
  2524.          BE        RERROR2             YES, BRANCH
  2525.          SR        R5,R5
  2526.          IC        R5,ERRNUM           GET RIGHT MESSAGE NUMBER
  2527.          M         R4,=F'20'           OFFSET := ERRNUM * 20
  2528.          LA        R5,ERRTAB(R5)
  2529.          CLI       OLDERR,S1ERRNUM     WAS IT A SERIES1 ERROR?
  2530.          BNE       RNOTOPN1            NO, THE WRITE OUT THE ERROR
  2531.          LA        R1,X'F0'            GET READY TO UNPK ERROR CODES
  2532.          ICM       R1,B'1110',KERFSRET MOVE IN THE ERROR CODES
  2533.          SRL       R1,4                GET RID OF LOWER ZERO
  2534.          ST        R1,WORK1            SAVE IT
  2535.          UNPK      S1RETC(6),WORK1(4)  MAKE IT SORTA-PRINTABLE
  2536.          TR        S1RETC(6),HEXTB     PRETTY IT UP
  2537. RNOTOPN1 MVC       SDAT(20),0(R5)      SPACK NEEDS THE DATA HERE
  2538.          TR        SDAT(20),ETOA       TRANSLATE TO ASCII
  2539.          MVC       LSDAT,=F'20'        STORE THE DATA LENGTH
  2540. RERROR2  DS        0H
  2541.          L         R15,=A(SPACK)
  2542.          BALR      R14,R15             SEND ERROR PACKET & DIE
  2543. RNOERRP  LA        R15,4               SET NON-ZERO RETCODE
  2544.          B         RECRET              PREPARE TO LEAVE
  2545. RCOMP    SR        R15,R15             RETCODE OF ZERO
  2546. RECRET   TM        S1FLAGS,ISS1        SERIES1/7171?
  2547.          BNO       RECRET2             NO - THEN NO NEED TO DE-INIT
  2548.          LR        R2,R15              PRESERVE THE RETCODE
  2549.          SR        R1,R1               SET P-REG
  2550.          L         R15,=A(INTRINI)
  2551.          BALR      R14,R15             GO TO IT
  2552.          LR        R15,R2              RESTORE THE RETCODE
  2553. RECRET2  L         R13,4(R13)
  2554.          L         R14,12(R13)
  2555.          LM        R0,R12,20(R13)
  2556.          BR        14
  2557. RECSAVE  DS        18F
  2558. MOVEFNAM MVC       FILNAM(0),RDAT       PICK UP FNAME
  2559. PAD      MVC       1(0,R9),0(R9)       PAD OUT WITH SPACES
  2560. MOVEERR  MVC       SDAT(0),RBUF        MOVE MESSAGE TO SDAT
  2561. TRANERR  TR        SDAT(0),ETOA        TRANSLATE TO ASCII
  2562.          LTORG
  2563.          DROP      R11
  2564.          DROP      R12                 DON'T NEED THEM ANYMORE
  2565.          EJECT
  2566. *
  2567. * INITIALIZE FOR GOING VIA SERIES/1.
  2568. INTRINI  CSECT
  2569.          USING     INTRINI,R15         establish addressability
  2570.          STM       R0,R14,INTRSAV      save caller's regs
  2571.          LR        R12,R15
  2572.          DROP      R15
  2573.          USING     INTRINI,R12
  2574.          L         R11,=A(PARMS)
  2575.          USING     PARMS,R11
  2576.          LTR       R1,R1               anything in R1?
  2577.          BZ        INTRCLR             no: do clean up
  2578.          TM        S1FLAGS,S1INIT      Initialized already? [13]
  2579.          BO        INTRRET             Yes just leave [13]
  2580.          OI        S1FLAGS,S1INIT      Else init and flag as done [13]
  2581.          LA        R1,INTRMSG          SET UP ADDR OF INIT MSG
  2582.          ST        R1,KERMFSWB         AND SAVE IN PLIST
  2583.          LA        R1,LINTRMSG         AND LENGTH
  2584.          ST        R1,KERMFSWL         THIS TOO SHALL BE PASSED
  2585.          MVI       KERMFSFG,WRTERASE+SKIPRD+OWNWCC
  2586.          MFREQ     KERMFARG            DO IT
  2587.          CLI       KERFSRET,X'00'      ANY ERRORS?
  2588.          BE        INTRIN1             NO - GREAT
  2589.          ABEND     64                  THAT'S ALL FOLKS
  2590. INTRIN1  DS        0H
  2591.          LA        R1,S1ORDS     POINT TO BEGINNING OF SEND PACKET
  2592.          ST        R1,KERMFSWB    SET WRITE BUFFER ADDR
  2593.          LA        R1,RECPKT      POINT TO BEGINNING OF SEND PACKET
  2594.          ST        R1,KERMFSRB    SET READ BUFFER ADDR
  2595.          LA        R1,L'RECPKT    POINT TO BEGINNING OF SEND PACKET
  2596.          ST        R1,KERMFSRL    SET READ BUFFER ADDR
  2597.          MVI       KERMFSFG,WRTERASE+OWNWCC     SET FSIO OPTIONS
  2598.          B         INTRRET
  2599. INTRCLR  EQU       *
  2600.          NI        S1FLAGS,X'FF'-S1INIT   Turn off flag
  2601. INTRRET  EQU       *
  2602.          LM        R0,R14,INTRSAV      restore caller's regs
  2603.          BR        R14                 return to caller
  2604. INTRSAV  DS        15F                 reg save area
  2605. WRTERASE EQU       X'80'               FSIO WRITE ERASE
  2606. INTRMSG  DC        X'C4',AL1(SBA),X'4040'
  2607.          DC        C'Ready for file transfer...'
  2608. LINTRMSG EQU       *-INTRMSG
  2609. OWNWCC   EQU       X'02'               WE WILL USE OWN WCC IN FSIO
  2610. SKIPRD   EQU       X'04'               SKIP THE READ OPERATION
  2611.          LTORG
  2612.          DROP      R11
  2613.          DROP      R12
  2614.          END       KERMIT
  2615.