*COPY                                                 IKMUTL            05000000
         CHECKVER IKCUTL,4.2                                   @SC90072 05000500
         TITLE 'CWDSET/DSPACE Routines - set/show working directory'    05001000
* Set new 'working directory', i.e., new code (need LSCAN or FILES)     05002000
* Entry: SCANPTR string has option                                      05003000
* Exit: R15=0 if ok, R15=1 if error or help needed. ERRNUM unchanged.   05004000
CWDSET   ENTER                                                 @SC86164 05005000
         NTOKN N=CWDRSET,H=CWDERR                                       05006000
         C     7,F3                 Length MUST be 4                    05007000
         BNE   CWDERR                                                   05008000
         TM    UPRIVS,LSCAN+FILES   Need some priveleges to             05009000
         BZ    CWDPRV               change code                         05010000
         TR    0(4,6),UPCASE        Upper case it                       05011000
         MVC   UCODE(4),0(6)        Save as new default code            05012000
         MVI   DESTL,1              Yes, new code                       05013000
         B     RTRN0                                           @SC86295 05014000
CWDPRV   PTEXT 'Not enough privileges to change code'                   05015000
         B     SUBERR                                                   05016000
CWDRSET  MVI   DESTL,0              No more code. Default to user's     05017000
         MVC   UCODE(4),$USRCDE     Get user's code from locore         05018000
         B     RTRN0                                                    05019000
CWDERR   PTEXT 'Must be a valid 4-digit MUSIC code'                     05020000
         B     SUBERR               Go display error msg                05021000
* * * * * * * * * * * * * * * * * * * * * *                             05022000
*                                                                       05023000
*                                                                       05024000
*        DSPACE Routine - display available disk space         @SC86164 05025000
*                                                                       05026000
* Show space available in 'working directory' or other area             05027000
* Entry: SCANPTR string has option (none => working directory)          05028000
* Exit: R15=0 if ok, R15=1 if error or help needed. ERRNUM unchanged    05029000
DSPACE   ENTER ALT                                             @SC86164 05030000
         MFSET DSKST,USERCTL                                            05031000
         MFREQ DSKST              Get User Control Record               05032000
         LA    15,PARMAREA         Temporary output buffer              05033000
         L     4,MFMAXS           Calculate space in use                05034000
         S     4,MFACUR                                                 05035000
         BAL   2,EDDEC            Convert to printable                  05036000
         MVC   0(12,15),=C' KBytes Free'                                05037000
         LA    0,12(15)                                                 05038000
         LA    1,PARMAREA                                               05039000
         SR    0,1                                                      05040000
         WTEXT (1),(0)       Display the message                        05041000
         B     RTRN0                                                    05042000
         LOCALS ,                                              @SC86295 05043000
         EXIT  ,                                               @SC86295 05044000
         TITLE 'FSPEC Routine - extract filespec from scan string'      05045000
*                                                                       05046000
* Entry: R1->name field, R0=flags selecting operation (see below)       05047000
*        For parse operations, SCANPTR defines the input string.        05048000
*        For getting foreign or display filespec, R7->output buffer     05049000
* Exit: if not FFNEW, then R15=0 if ok, 1 if ?, 2 if bad.               05050000
*        For R15=1 or 2 R3,R4 give message.  ERRNUM may be leftover.    05051000
*                                                                       05052000
*                                 Flags:                  Notes:        05053000
*   Tasks:               FFRCF FFSND FFGET FFNEW                        05054000
* Parse RECV               X                     set ROVR properly      05055000
* Parse SEND 1st                 X                                      05056000
* Parse SEND 2nd           X     X                                      05057000
* Parse GET 1st                        X                                05058000
* Parse GET 2nd            X           X         set ROVR properly      05059000
* Parse F-packet   (FFHDR) X     X     X                                05060000
* Parse for Generic(FFUTL)       X     X         FFWLD: allow partial   05061000
* Parse TAKE                                                            05062000
*                                                                       05063000
* Get unique name                            X     R15: 0=>ok, 1=>bad   05064000
* Interactive name check               X     X     R15: 0=>ok, 1=>bad   05065000
* Get foreign name (FFENC) X                 X     R15->end of string   05066000
* Get display form (FFDSP)       X           X     R15->end of string   05067000
*                                                                       05068000
FSPEC    ENTER                                                 @SC86295 05069000
         STC   0,FSPFLG                                        @SC86295 05070000
         LR    5,0                                             @SC88049 05071000
         SRL   5,4           Convert flags to index            @SC88049 05072000
         AR    5,5                                             @SC88049 05073000
         LR    0,1           Copy ptr to filespec              @SC86295 05074000
         TM    FSPFLG,FFNEW                                    @SC86295 05075000
         BO    FSPWRN                                          @SC86295 05076000
         MVC   0(LFID,1),BLNAME  Clear the filename to blanks           05077000
         PTEXT 'Invalid filename'                                       05078000
         MVI   ERRNUM,ERRFNE Assume bad file name              @SC86158 05079000
         LH    5,FSP0(5)     Get dispatch adr                  @SC88049 05080000
         B     FSP0(5)       Go to proper handler              @SC88049 05081000
*                                                                       05082000
*                  Take        Get 1st     Send 1st    Generic          05083000
FSP0     DC    AL2(FSPTAK-FSP0,FSPSN2-FSP0,FSPSND-FSP0,FSPUTL-FSP0)     05084000
*                                                                       05085000
*                  Receive    Get 2nd    Send 2nd    F-packet           05086000
         DC    AL2(FSPRC-FSP0,FSPRC-FSP0,FSPSN2-FSP0,FSPHD-FSP0)        05087000
         SPACE                                                          05088000
FSPUTL   TM    FSPFLG,FFWLD  Utility: default to all files?    @SC88049 05089000
         BZ    FSPASC        No                                @SC86295 05090000
         MVC   0(5,1),UCODE  Default prefix                             05091000
         MVI   5(1),C'*'     Yes                               @SC88308 05092000
FSPSND   DS    0H                                                       05093000
FSPASC   TM    FL2,SRV       Server mode?                      @SC86295 05094000
         BZ    FSPCPY        No, don't need to convert         @SC86295 05095000
         ICM   15,15,LEN     Get length                        @SC86295 05096000
         BZ    FSPCPY                                          @SC86295 05097000
         BCTR  15,0          Correct for EX                    @SC86158 05098000
         L     5,ADR         Get string ptr                    @SC89215 05099000
         EX    15,FSPTRAE    Change to EBCDIC                  @SC89215 05100000
         EX    15,FSPTRUP    Upcase and dot to space           @SC89215 05101000
         B     FSPCPY                                          @SC86295 05102000
FSPTRAE  TR    0(,5),ATOED                                     @SC89301 05102300
FSPTRUP  TR    0(,5),UPCASE                                    @SC89215 05102600
FSPRC    NI    FL1,255-ROVR  Setup for RECEIVE                 @SC86295 05103000
         NI    FL4,255-NMOK-NMCHNG  Collision not checked yet  @SC90033 05104000
         MVI   0(1),C'$'     Default fn                        @SC88308 05105000
         B     FSPCPY                                          @SC86295 05106000
FSPHD    MVI   0(1),C'$'     Default fn                        @SC88308 05107000
         L     2,ADR                                           @SC86295 05108000
         IC    7,4(2)        Save possible code separator      @SC88308 05109000
         TR    0(256,2),FSPTAB  Make valid fn chars            @SC86295 05110000
         CLM   7,1,UPCASE+C':'  Was it a separator?            @SC88308 05111000
         BNE   *+8                                             @SC88308 05112000
          STC  7,4(2)        Yes, change char. back to colon   @SC88308 05113000
         B     FSPCPY                                          @SC86295 05114000
FSPSN2   MVI   0(1),0        Clear JFSPEC length !!!                    05115000
         CLI   BRK,C','                                        @PG88306 05116000
         BE    RTRN0         Foreign name omitted              @PG88306 05117000
         NTOKN H=FSP2H,N=RTRN0                                          05118000
         LA    7,1(7)        Not machine length !                       05119000
         LA    1,L'JFNAM     Get maximum length                         05120000
         CLM   7,3,*-2       Does it fit?                      @SC86224 05121000
         BNH   *+6           Yes                               @SC86224 05122000
         LR    7,1           Use what we can                   @SC86224 05123000
         LR    3,0                                             @SC86295 05124000
         STC   7,0(3)        Save length                       @SC86224 05125000
         LA    0,1(3)                                          @SC86295 05126000
         MVCL  0,6           Get fn, at least                  @SC86224 05127000
         B     RTRN0                                           @SC86295 05128000
*                                                                       05129000
FSPTAK   DS    0H                                                       05130000
FSPCPY   NTOKN H=FSPH,N=FSPZ                                            05131000
         LR    8,0           Save start                                 05133000
         KCALL FOPSTR,LFID(,8),E=FSPINV                        @SC89218 05133300
         LA    1,LFID        Get max length                             05133600
         CLI   4(6),C':'     Code prefix ?                              05134000
         BE    FSPCPC                                                   05135000
         LR    2,0                                                      05136000
         MVC   0(5,2),UCODE  Add the user code                          05137000
         LA    0,5(2)        Point past code prefix                     05138000
         S     1,F5          Reduce receiving length                    05139000
FSPCPC   TM    FSPFLG,FFRCF                                             05140000
         BZ    FSPCPN                                          @SC86295 05141000
         OI    FL1,ROVR      Overwrite received fname          @SC86295 05142000
FSPCPN   LA    7,1(7)                                                   05143000
         ICM   7,8,BLANK                                                05144000
         MVCL  0,6           Copy token with padding                    05145000
         CLM   7,7,F0        Hope nothing left over!                    05146000
         BNE   FSPINV        Name was too long                          05147000
         TR    0(LFID,8),UPCASE   Ok, now upcase it                     05148000
         B     RTRN0                                           @SC86295 05149000
*                                                                       05150000
FSPZ     LR    14,0                                            @SC86295 05151000
         CLI   0(14),C' '    Any default given?                @SC86295 05152000
         BH    RTRN0         Yes, use it                       @SC86295 05153000
FSPMIS   PTEXT 'Missing filename'                                       05154000
FSPINV   LA    15,2                                            @SC86295 05155000
         B     FSPPTRS                                         @SC86295 05156000
*                                                                       05157000
FSPH     PTEXT 'Filespec has format: fn[<first-last>]'         @SC89218 05158000
         CLI   FSPFLG,FFSND  SEND 1st?                         @SC89218 05158200
         BE    *+8           Yes, use whole message            @SC89218 05158400
          SH   4,=H'14'      Chop off option part              @SC89218 05158600
         B     FSP0H                                           @SC86295 05159000
FSP2H    PTEXT 'Enter foreign filespec'                        @SC86295 05160000
FSP0H    LA    15,1                                            @SC86295 05161000
FSPPTRS  RETREG 3,4          Return msg ptrs                   @SC86295 05162000
FSPRET   RET   ,                                               @SC86295 05164000
*                                                                       05165000
* Non-parsing functions . . .                                           05166000
*                                                                       05167000
* Get unique filespec                                                   05168000
FSPWRN   LR    4,1           Save name ptr                     @SC86295 05169000
         TM    FSPFLG,FFENC                                    @SC86295 05170000
         BO    FSPENC        Encode name into buffer           @SC86295 05171000
         TM    FSPFLG,FFDSP                                    @SC86295 05172000
         BO    FSPDSP        Copy name into buffer for display @SC86295 05173000
         TM    FL4,NMOK      Already checked?                  @SC87012 05174000
         BO    RTRN0         Yes, ok                           @SC87012 05175000
         MVC   XFILE,0(1)    Save original name                @SC90033 05175500
         LA    6,LFID-2(1)   End of FT                                  05176000
         BCTR  6,0                                             @BS86001 05177000
         CLI   0(6),C' '     Find end of token                 @BS86001 05178000
         BE    *-6                                             @BS86001 05179000
         LA    5,10+1        Allowed retries                   @BS86001 05180000
         LA    7,C'0'        Extra character                   @BS86001 05181000
         OI    FL4,NMOK      Assume it checks                  @SC87012 05182000
FSPSTA   OPENF T,(4),E=RTRN0 Does it exist already?            @SC86135 05183000
         OI    FL4,NMCHNG    Yes, remember collision occurred  @SC90033 05183500
         MVI   1(6),C'$'     Yes, modify Fn                             05184000
         STC   7,2(6)        Serialize                         @BS86001 05185000
         LA    7,1(7)        Bump counter                      @BS86001 05186000
         BCT   5,FSPSTA                                        @BS86001 05187000
         PTEXT 'Filename collision'                            @SC88049 05188000
         B     FSP0H         Return error code                 @SC88049 05189000
*                                                                       05190000
* Encode name at (R1) into (R7) buffer (in ASCII), possibly with        05191000
*  substitution from JFSPEC, but disable subsequent subst.              05192000
*  Return updated ptr in R15                                            05193000
FSPENC   LA    1,JFSPEC      Complex string?                   @SC86224 05194000
         BAL   14,PAKFOR                                       @SC86224 05195000
         LR    15,7          Save ptr                                   05196000
         BNZ   FSPFILS       Yes, tokens aren't used           @SC86224 05197000
         MVC   0(LFID,7),BLNAME                                         05198000
         MVC   0(17,7),5(4)     Copy filename Only                      05199000
         CLI   4(4),C':'        Is there a code prefix ???              05200000
         BE    *+10                                                     05201000
         MVC   0(LFID,7),0(4)   Copy token                              05202000
         LA    1,LFID(7)        End of token if no blanks               05203000
         TRT   0(LFID,7),TRTBL  Find 1st blank                          05204000
         TR    0(LFID,7),ETOAD  ASCII it                       @SC89301 05205000
         LR    15,1             New end of string                       05206000
FSPFILS  MVI   JFSPEC,0      Turn off string                   @SC86224 05207000
         B     FSPRET                                          @SC86295 05208000
*                                                                       05209000
* Copy name at (R1) into (R7) buffer in display form                    05210000
*  Return updated ptr in R15                                            05211000
FSPDSP   MVC   0(LFID,7),0(4)   Copy token                              05212000
         CLI   4(4),C':'        Prefix already ?                        05213000
         BE    FSPDTK3                                                  05214000
         MVC   0(5,7),UCODE     Get prefix                              05215000
         MVC   5(LFID-5,7),0(4)                                         05216000
FSPDTK3  LA    1,LFID(7)        End of token if no blanks               05217000
         TRT   0(LFID,7),TRTBL  Find 1st blank                          05218000
         LR    15,1             New end of string                       05219000
         B     FSPRET                                                   05220000
*                                                                       05221000
* Valid MUSIC file name characters                                      05222000
FSPTAB   DC    75C'$',C'.'           dot                                05223000
         DC    15C'$',C'$'           dollar sign                        05224000
         DC    31C'$',C'#@'          pound sign, at sign       @SC88308 05225000
         DC    04C'$',C'ABCDEFGHI'   a-i                                05226000
         DC    07C'$',C'JKLMNOPQR'   j-r                                05227000
         DC    08C'$',C'STUVWXYZ'    s-z                                05228000
         DC    23C'$',C'ABCDEFGHI'   A-I                                05229000
         DC    07C'$',C'JKLMNOPQR'   J-R                                05230000
         DC    08C'$',C'STUVWXYZ'    S-Z                                05231000
         DC    06C'$',C'0123456789'  0-9                                05232000
         DC    06C'$'                                                   05233000
         LOCALS ,                                              @SC86295 05234000
FSPFLG   DS    X             Filespec flags                    @SC86295 05235000
FSPEC    EXIT                                                  @SC86295 05236000
         TITLE 'KHELP routine - perform HELP command'                   05237000
* Handle HELP command, rest of string given by SCANPTR.                 05238000
KHELP    ENTER ,                                               @SC86355 05239000
         PTEXT 'LIST *COM:SYSTEM.KERMHELP',AREG=0,LREG=6       @SC88308 05240000
         NI    FL4,255-UCMD  Signal ptrs in R0,R6              @SC88308 05241000
         KCALL SUPFNC,3      Execute HOST command              @SC88308 05242000
         B     RTRN                                            @SC88308 05243000
         LOCALS ,                                                       05244000
KHELP    EXIT  ,                                               @SC87007 05245000
         TITLE 'SUPFNC Routine - various supervisor functions' @SC86158 05246000
SUPFNC   ENTER                                                 @SC86295 05247000
*  On entry, R1 = operation code, R0 = possible ptr            @SC86158 05248000
* Exit: R15 set (0 => ok, <0 => illegal cmd, >0 => depends)             05249000
*       ERRNUM set appropriately (R1=1,3,4) or unchanged (2,5-11)       05250000
* 1 -> Start typeout interception.  N.B.  &MAXLR >> 2048 for this       05251000
* 2 -> Clean up afterwards and stop interception                        05252000
* 3 -> Execute host command with or without interception                05253000
*      If UCMD set, SCANPTR gives text, else R0->text,R6=len            05254000
* 4 -> Execute CP command with or without interception                  05255000
*      R0->text, R6=len                                                 05256000
* 5 -> Stop interception if going                                       05257000
* 6 -> Retrieve original cmd parm string into CBUF (R15=1 if null)      05258000
* 7 -> Test for stacked lines, return number in R15                     05259000
* 8 -> Log off (doesn't return!)                                        05260000
* 9 -> Wait specified time                                              05261000
* 10-> Return clock time in R15 (centisec)                              05262000
* 11-> Setup up new prompt string at (R0)                               05263000
         BCT   1,ICPFIN                                        @SC86158 05264000
* Start interception, initialize ptrs                          @SC86158 05265000
         MVI   ERRNUM,ERRNOE OK                                @SC86158 05266000
         LA    0,2048        Suitable offset                   @SC86158 05267000
         A     0,WBUF        Output buffer                     @SC86158 05268000
         L     1,TSENT       Limit                             @SC86158 05269000
         LR    15,0                                            @SC86158 05270000
         STM   15,0,TXTPTR   Save                              @SC86158 05271000
         STM   0,1,SVCOPTR                                     @SC86158 05272000
         SR    1,0           Get length                        @SC86158 05273000
         L     15,=X'15000000'                                 @SC86158 05274000
         MVCL  0,14          Fill with NL (X'15')              @SC86158 05275000
         OI    SVCFLG,INTERCPT    Interception in Progress              05276000
         B     RTRN0                                           @SC86295 05277000
* Clean up after interception                                  @SC86295 05278000
ICPFIN   BCT   1,ICPHST                                        @SC86158 05279000
         L     5,SVCOPTR     End of text                       @SC86158 05280000
         ST    5,TXTPTR+4    Save                              @SC86158 05281000
         NI    SVCFLG,255-INTERCPT  Stop interception                   05282000
         B     RTRN0                                                    05283000
* Stop interception if going                                            05284000
ICPRST   BCT   1,SFCLIN                                                 05285000
         NI    SVCFLG,255-INTERCPT  Stop interception                   05286000
         B     RTRN0                                                    05287000
* Execute host command.  Save return code.                     @SC88308 05288000
ICPHST   BCT   1,ICPCP                                         @SC86158 05289000
         TM    FL4,UCMD                                        @SC88308 05290000
         BO    *+12                                            @SC88308 05291000
          ST   0,ADR         Ptrs are in R0,R6                 @SC88308 05292000
          ST   6,LEN                                           @SC88308 05293000
         NTOKN N=SFCHBAD                                       @SC88308 05294000
         SCAN  HSTCMDS,RTRN0 Dispatch to handler               @SC88308 05295000
SFCHBAD  HELP  HSTCMDS,RTRNM1                                  @SC88308 05296000
*                                                                       05297000
HSTCMDS  KW    'LIBRARY',SFCDIR,MIN=3                          @SC88308 05298000
         KW    'COPY',SFCCOP,MIN=4                             @SC88308 05299000
         KW    'PURGE',SFCDEL,MIN=3                            @SC88308 05300000
         KW    'RENAME',SFCREN,MIN=3                           @SC88308 05301000
         KW    'LIST',SFCTYP                                   @SC88308 05302000
         KW    ,                                               @SC88308 05303000
*                                                                       05304000
SFCDIR   LA    3,13          DISKIO dir function code          @SC88308 05305000
         B     SFCUTL                                          @SC88308 05306000
SFCDEL   LA    3,14          DISKIO del function code          @SC88308 05307000
         B     SFCUTL                                          @SC88308 05308000
SFCREN   LA    3,15          DISKIO ren function code          @SC88308 05309000
         B     SFCUTL                                          @SC88308 05310000
SFCCOP   LA    3,16          DISKIO cop function code          @SC88308 05311000
         B     SFCUTL                                          @SC88308 05312000
SFCTYP   LA    3,17          DISKIO typ function code          @SC88308 05313000
*        B     SFCUTL                                          @SC88308 05314000
SFCUTL   SR    0,0                                             @SC88308 05315000
         KCALL FSPEC,FILNAM,E=SUBERR                           @SC88308 05316000
         CH    3,=H'14'                                        @SC88308 05317000
         BNH   SFCUT1        Dir/lib or del/pur                @SC88308 05318000
         CH    3,=H'17'                                        @SC88308 05319000
         BE    SFCUT1        Type/list                         @SC88308 05320000
         SR    0,0                                             @SC88308 05321000
         KCALL FSPEC,IFILE,E=SUBERR Get 2nd file name          @SC88308 05322000
SFCUT1   FTOKN N=SFCUT6      See if anything else in command   @SC88308 05323000
         PTEXT 'No more operands'                              @SC88308 05324000
         B     SUBERR                                          @SC88308 05325000
SFCUT6   LR    0,3           Get function code                 @SC88308 05326000
         LA    2,IFILE       Optional 2nd name                 @SC88308 05327000
         KCALL DISKIO,FILNAM Do it                             @SC88308 05328000
         B     RTRN                                            @SC88308 05329000
* Execute CP command at (R0) with text interception            @SC86158 05330000
ICPCP    BCT   1,ICPRST                                        @SC86158 05331000
         WTEXT 'CP commands not supported'                              05332000
         B     RTRN0                                                    05333000
*                                                                       05334000
SFCLIN   BCT   1,SFCSTK                                        @SC86295 05335000
* Retrieve original command line arguments, if any             @SC86295 05336000
*   Return code =0 if yes, =1 if no                            @SC86295 05337000
*   Leave string in CBUF buffer (up to 256), length in CLEN    @SC86295 05338000
         L     1,ORGR1       Get original R1                            05339000
         L     1,0(,1)                                                  05340000
         LH    2,0(,1)       Get command line parm length               05341000
         LA    3,2(,1)       Get address of parms                       05342000
         LTR   2,2           Any parms ???                              05343000
         BZ    RTRN1                                                    05344000
         ST    2,CLEN        Save the length                            05345000
         L     4,CBUF        Copy to other buffer                       05346000
         MVC   0(128,4),0(3)                                            05347000
         LA    3,0(2,3)      Now, backscan the command line             05348000
SFCLIN3  BCTR  3,0           buffer to check if there is really         05349000
         CLI   0(3),C' '     something. MUSIC should have set the       05350000
         BNE   RTRN0         length to 0, but under DEBUG, we           05351000
         BCT   2,SFCLIN3     get a blank line of length 80 !!!          05352000
         B     RTRN1                                                    05353000
*                                                                       05354000
* Test for stacked commands                                    @SC86295 05355000
*   return code = number of stacked lines                      @SC86295 05356000
SFCSTK   BCT   1,SFCKIL                                        @SC86295 05357000
         ICM   15,15,GTPB+4  Anything in line buffer?                   05358000
         BH    RTRN1         There's one line, at least                 05359000
         B     RTRN0         Nothing stacked                            05360000
*                                                                       05361000
* Log out                                                      @SC86295 05362000
SFCKIL   BCT   1,SFCWT                                         @SC86295 05363000
         LA    1,OFFARG      Schedule a signoff to the system           05364000
         SVC   237               $SETSAV                                05365000
         LA    15,0          And abort the job right away.              05366000
         SVC   $EOJ                                                     05367000
         B     RTRN                                                     05368000
*                                                                       05369000
* Wait specified time in R0 (sec)                                       05370000
SFCWT    BCT   1,SFCCLK      Tell MUSIC to delay for x seconds          05371000
         SVC   $DLYEXC                                                  05372000
         B     RTRN0                                           @SC86295 05373000
*                                                                       05374000
* Return time in centisec in R15                                        05375000
SFCCLK   BCT   1,SFCPRP                                        @SC87351 05376000
         STCK  TMPDW         Store TOD clock                   @SC86295 05377000
         LM    14,15,TMPDW                                     @SC86295 05378000
         SLDL  14,8          Take mod 204 days                 @SC86295 05379000
         SRDL  14,20         Get in microsec                   @SC86295 05380000
         D     14,=F'10000'  Get in centisec                   @SC86295 05381000
         B     RTRN                                            @SC86295 05382000
*                                                                       05383000
SFCPRP   B     RTRN0         No action for prompting           @SC87351 05384000
OFFARG   DC    CL6'/OFF**',X'A0'                                        05385000
         LOCALS ,                                              @SC86295 05386000
SUPFNC   EXIT                                                  @SC86158 05387000
         TITLE 'Interception Code'                                      05388000
*                                                                       05389000
*  Entry:  R0->Length of string to write, R1->Address of string         05390000
*                                                                       05391000
*  Exit:   Always R15=0                                                 05392000
*                                                                       05393000
ICPTYP   ENTER                                                          05394000
         LR    2,0                Get length in R2                      05395000
         LM    3,4,SVCOPTR        Yes, then add the line just           05396000
         SR    4,3                built to the interception buffer      05397000
         CR    2,4                Any room left ?                       05398000
         BH    RTRN0                                                    05399000
         BCTR  2,0                                                      05400000
         EX    2,ICPMV            Move the line to the output buffer    05401000
         LA    2,1(2)                                                   05402000
         LA    3,1(2,3)           Update the source pointer             05403000
         ST    3,SVCOPTR          Save it                               05404000
         B     RTRN0                                                    05405000
ICPMV    MVC   0(0,3),0(1)                                              05406000
         LOCALS ,                                                       05407000
ICPTYP   EXIT   ,                                                       05408000
         TITLE 'SETMSG Routine - controls CP breakin'                   05409000
* Entry: R1 selects operation                                           05410000
* Exit: R15=0 if ok                                                     05411000
* 1-> Analyze user environment, determine if suitable.                  05412000
*     Save quantities needed and condition line for entering commands.  05413000
*     Perform any system-dependent initialization.                      05414000
* 2-> Condition line for protocol transfers.                            05415000
* 3-> Decondition line at end of transfer.                              05416000
* 4-> System-dependent clean-up at exit.                                05417000
* 5-> Reperform system-dependent initialization after SET LINE.         05418000
SETMSG   ENTER ,                                                        05419000
         BCT   1,STM2                Go if R1 not 1, so no init         05420000
         MFARG 0,RLAB=ZRC,ULAB=ZLU                             @PG90057 05421000
         MFARG NAME=MFNAME,INFIN=ZINFIN,INFOUT=ZINFOUT,ARG=ZARG         05422000
         MFARG PHYS=ZPHYS,UCTL=ZUCTL,UINFO=ZUINFO,TAG=MFTAG             05423000
         MFARG EOFPT=ZEOFPT,FSARG=ZFSARG                                05424000
         MFGEN AREA=DSKST                                               05425000
         MVC   UCODE(4),$USRCDE   Get the user's code                   05426000
         MVI   UCODE+4,C':'  Set up 5-char prefix string                05427000
         MVI   SCODE+4,C':'  Ditto                             @SC88308 05428000
         LA    1,STMNOPR                                                05429000
         SVC   $SETOPT            Disable prompting                     05430000
         LA    1,STMTXLC                                                05431000
         SVC   $SETOPT            Allow lower case input                05432000
         MVI   TRMTP,C'T'    1st assume TTY                    @SC88203 05433000
         TM    $TRMTYP,X'20'      Check the terminal type               05434000
         BZ    RTRN0                                                    05435000
         MVI   TRMTP,C'S'         Remember going via S/1                05436000
         L     8,S1RDPL                                        @SC88203 05437000
         XC    0(9,8),0(8)   Zero out buffer                   @SC88203 05438000
         LA    0,1                                             @SC88203 05439000
         KCALL SCRNIO        Clear screen and set up           @SC88203 05440000
*        LA    0,6                                             @SC88203 05441000
*        KCALL SCRNIO,STMS1ST Issue status request             @SC88203 05442000
*        LA    0,5                                             @SC88203 05443000
*        KCALL SCRNIO,S1RDPL Read back status                  @SC88203 05444000
*        LA    0,2                                             @SC88203 05445000
*        KCALL SCRNIO        Release screen                    @SC88203 05446000
*        CLI   0(8),X'E4'    Check for Yale status response    @SC88203 05447000
*        BE    *+12          Ok                                @SC88203 05448000
*         CLI  0(8),0        Check for Yale status response    @SC88203 05449000
*         BNE  STMGRP        No, must be something else        @SC88203 05450000
*        CLI   3(8),X'11'                                      @SC88203 05451000
*        BNE   STMGRP        No, must be something else        @SC88203 05452000
*        CLC   =X'2B5B5B',6(8)                                 @SC88203 05453000
         BE    RTRN0         Yes, all set                      @SC88203 05454000
STMGRP   MVI   TRMTP,C'G'    Assume graphics device            @SC88203 05455000
         B     RTRN0                                                    05456000
*  Condition Line for protocol transfers                                05457000
STM2     BCT   1,STM3                                                   05458000
         CLI   TRMTP,C'V'                                      @SC89020 05458300
         BE    *+12          TTY ==> limited                   @SC89020 05458600
         CLI   TRMTP,C'T'         TTY terminals can't change handshk    05459000
         BNE   STM2X                                                    05460000
         CLI   S1HND,XON          User want special one anyway ?        05461000
         BNE   STM2X                                                    05462000
         MVI   S1HND,0            System provides the handshake!        05463000
STM2X    B     RTRN0                                                    05464000
*  Decondition line at end of transfer                                  05465000
STM3     BCT   1,STM4                                          @SC86316 05466000
         B     RTRN0                                                    05467000
*  System cleanup at exit                                               05468000
STM4     BCT   1,STM5        Special clean-up                  @SC87351 05469000
         LA    1,STMPRMT     Turn on prompting                          05470000
         SVC   $SETOPT                                                  05471000
         LA    1,STMTXUC     Fold lower case to upper case              05472000
         SVC   $SETOPT                                                  05473000
         B     RTRN0         Special clean-up done                      05474000
*                                                                       05475000
STM5     B     RTRN1         Other lines not allowed                    05476000
*                                                                       05477000
STMNOPR  DC    X'A0',AL1(1,3,6) Turn off Prompting                      05478000
STMPRMT  DC    X'A0',AL1(0,3,6) Turn on Prompting                       05479000
STMTXLC  DC    X'A0',AL1(1,1,6) Text Lower Case Input                   05480000
STMTXUC  DC    X'A0',AL1(0,1,6) Text Upper Case Input                   05481000
*                                                                       05482000
STMS1ST  DC    A(STMS1ORD,L'STMS1ORD)                          @SC88203 05483000
STMS1ORD DC    X'C32B5BBC'   WCC + Yale ASCII status request   @SC88203 05484000
         LOCALS ,                                                       05485000
SETMSG   EXIT                                                           05486000
         TITLE 'GETLIN Routine - Get a line from terminal'     @SC87015 05487000
* Entry: R1->buffer of length 256                              @SC87015 05488000
* Exit: Buffer filled, R0=length, R15=0 if ok. Else R15=1.     @SC87015 05489000
GETLIN   ENTER                                                 @SC87015 05490000
         LR    8,1           Save buffer ptr                   @SC88095 05491000
         LA    9,256         For copying                       @SC88095 05492000
         LM    4,6,GTPB      Saved ptrs: start, length, current         05493000
         LTR   5,5           Already got something?            @SC88095 05494000
         BNZ   GTL1          Yes, return it                    @SC87015 05495000
         TGET  (4),130       Read a line from the terminal              05496000
         SLR   2,2           Clear length for return                    05497000
         LA    5,0(1,4)      Point past the end                         05498000
         BCTR  5,0           Scan back for a non-blank                  05499000
         CLI   0(5),C' '                                                05500000
         BE    *-6                                                      05501000
         LA    5,1(,5)                                                  05502000
         SR    5,4           Stripped length                            05503000
         BNH   GTLA          Null input                                 05504000
         LR    6,4           Set current read ptr                       05505000
         ST    5,GTPB+4      Save new length                            05506000
GTL1     LR    1,5           Length of stuff                   @SC88095 05507000
         AR    1,4           End of buffer                     @SC88095 05508000
         LR    0,1           Save end                          @SC88095 05509000
         LR    2,1                                             @SC88095 05510000
         SR    2,6           Length of text remaining          @SC88095 05511000
         BNP   GTLA          None, return length 0             @SC88095 05512000
         SLR   4,4                                             @SC88095 05513000
         IC    4,LNDLM       Get delimiter                     @SC88095 05514000
         LA    4,TRTBL(4)    Ptr to delimiter char             @SC88095 05515000
         MVI   0(4),1        Set up to snag delims             @SC88095 05516000
         MVI   TRTBL+C' ',0  And ignore blanks                 @SC88095 05517000
         CR    2,9           Get shorter of 256 and string     @SC88095 05518000
         BNH   *+6                                             @SC88095 05519000
          LR   2,9                                             @SC88095 05520000
         BCTR  2,0           Set up for EX                     @SC88095 05521000
         EX    2,GTLTRT                                        @SC88095 05522000
         MVI   0(4),0        Now clear out table               @SC88095 05523000
         MVI   TRTBL+C' ',1  And restore                       @SC88095 05524000
         SR    1,6           Length of line                    @SC88095 05525000
         LR    7,1           Set up MVCL                       @SC88095 05526000
         CR    9,7           Get shorter of 256 and string     @SC88095 05527000
         BNH   *+6                                             @SC88095 05528000
          LR   9,7                                             @SC88095 05529000
         LR    2,9           Length actually copied            @SC88095 05530000
         MVCL  8,6                                             @SC88095 05531000
         AR    6,7           In case we couldn't use it all    @SC88095 05532000
         CR    6,0           Finished input?                   @SC88095 05533000
         BNL   GTLA          Yes, release it                   @SC88095 05534000
         LA    6,1(,6)       Skip over linend char             @SC88095 05535000
         ST    6,GTPB+8      Next read ptr                     @SC88095 05536000
         B     GTLZ          Return                            @SC88095 05537000
GTLA     MVC   GTPB+4,F0     Clear input indicator             @SC87015 05538000
GTLZ     RETREG (0,2)        Return (2) as R0                  @SC89218 05539000
         B     RTRN0                                           @SC87015 05541000
GTLTRT   TRT   0(,6),TRTBL   Find a delimiter                  @SC88095 05542000
         LOCALS ,                                              @SC87015 05543000
GETLIN   EXIT  ,                                               @SC87015 05544000
         TITLE 'TERMIO Routine - Handle terminal I/O'                   05545000
* R1 points to a pair of (adr,len) for read or write.  If I/O is        05546000
* successfull, R15 returns transferred byte count (else returns -1).    05547000
*               Command code is in R0:                                  05548000
* 1 => Open line for I/O            4 => Write packet                   05549000
* 2 => Close line                   5 => Read packet                    05550000
* 3 => Reset line status after    ( 6 => Write message ) not used       05551000
*      environment changes                                              05552000
*                                                                       05553000
TERMIO   ENTER                                                          05554000
         SR    15,15         OK                                @SC86295 05555000
         BCT   0,TRMCLS                                        @SC86295 05556000
* Open terminal line for protocol                                       05557000
         MVI   RIOC,X'80'    Nothing saved                     @SC86295 05558000
         MVI   TRMFLG,X'FF'  Initialize w/r flag               @SC87275 05559000
         LA    1,STMNOCR                                                05560000
         SVC   $SETOPT       No CRLF added                              05561000
         LA    1,STMNOTR                                                05562000
         SVC   $SETOPT       No translate Input                         05563000
         LA    1,STMNOER                                                05564000
         SVC   $SETOPT       No *TRANSMISSION ERROR messages            05565000
         CLI   TIMOUT,0      Timeout wanted ???                         05566000
         BE    RTRN0                                                    05567000
         LA    1,STMTMOU                                                05568000
         SVC   $SETOPT       Timeout on reads                           05569000
         B     RTRN0                                                    05570000
* Close terminal line after protocol transfer                           05571000
TRMCLS   BCT   0,TRMRSET                                       @SC86295 05572000
         LA    1,STMCRLF     Reenable CRLF                              05573000
         SVC   $SETOPT                                                  05574000
         LA    1,STMTRIN     Reenable translation                       05575000
         SVC   $SETOPT                                                  05576000
         LA    1,STMNOTM     No timeouts                                05577000
         SVC   $SETOPT                                                  05578000
         LA    1,STMTRER                                                05579000
         SVC   $SETOPT       *TRANSMISSION ERROR messages allowed       05580000
         B     RTRN0                                           @SC86295 05581000
* (Re)set terminal characteristics to suit environment                  05582000
TRMRSET  BCT   0,TRMRW                                         @SC86295 05583000
         B     RTRN0                                           @SC86295 05584000
*                                                                       05585000
*  Perform I/O request                                                  05586000
TRMRW    BCT   0,TRMRD                                         @SC87275 05587000
         CLI   WRRD,0        Write/read?                       @SC87275 05588000
         BNE   *+8           No, do it immediately                      05589000
         MVI   TRMFLG,0      Indicate no action on follow-up            05590000
         LM    2,3,0(1)      Get buffer address + length                05591000
         BCTR  2,0           Backup to insert carriage control          05592000
         MVI   0(2),X'41'    No output translate PLEASE !               05593000
         ST    2,TRMRBUF     Setup I/O buffer for MFIO                  05594000
         LA    3,1(3)        Fixup length for CC added                  05595000
         ST    3,TRMRLEN     Set I/O length                             05596000
         MFREQ PRT                                                      05597000
         B     RTRN0                                           @SC87275 05598000
*                                                                       05599000
TRMRD    TS    TRMFLG                                          @SC87275 05600000
         BZ    RTRN0         Just a follow-up. 0-length read   @SC87275 05601000
         LM    2,3,0(1)                                                 05602000
         C     3,AMAXRT      Check for maximum length                   05603000
         BL    TRMRD3                                                   05604000
         L     3,AMAXRT      Not too long please...                     05605000
TRMRD3   ST    2,TRMRBUF     Setup I/O buffer for MFIO                  05606000
         ST    3,TRMRLEN     Set I/O length                             05607000
         SLR   4,4                                                      05608000
         SLR   5,5                                                      05609000
         MVCL  2,4           Clear the input buffer                     05610000
         MFREQ TRM                                                      05611000
         ICM   15,15,TRMARSZ Get number of bytes read                   05612000
         BNZ   RTRN          Ok, got a buffer                           05613000
         L     2,TRMRBUF                                                05614000
         MVI   0(2),X'2B'    Timeout !!!                                05615000
         B     RTRN1         Return Length 1                            05616000
*                                                                       05617000
STMNOCR  DC    X'A0',AL1(1,1,5) Turn off CRLF                           05618000
STMCRLF  DC    X'A0',AL1(0,1,5) Turn on CRLF                            05619000
STMNOTR  DC    X'A0',AL1(1,1,4) Turn off input translation              05620000
STMTRIN  DC    X'A0',AL1(0,1,4) Turn on input translation               05621000
STMTMOU  DC    X'A0',AL1(1,1,0) Turn on Timeout                         05622000
STMNOTM  DC    X'A0',AL1(0,1,0) Turn off Timeout                        05623000
STMNOER  DC    X'A0',AL1(0,1,7) Don't allow *TRANSMISSION ERROR msg     05624000
STMTRER  DC    X'A0',AL1(1,1,7) Allow *TRANSMISSION ERROR msg           05625000
         SPACE                                                          05626000
*********************************************************************** 05627000
*                                                                     * 05628000
*    Reversing Table. Translate ASCII to reverse ASCII                * 05629000
*                                                                     * 05630000
*********************************************************************** 05631000
         SPACE 1                                                        05632000
*                0 1 2 3 4 5 6 7 8 9 A B C D E F                        05633000
ATORA    DC    X'008040C020A060E0109050D030B070F0' 0                    05634000
         DC    X'088848C828A868E8189858D838B878F8' 1                    05635000
         DC    X'048444C424A464E4149454D434B474F4' 2                    05636000
         DC    X'0C8C4CCC2CAC6CEC1C9C5CDC3CBC7CFC' 3                    05637000
         DC    X'028242C222A262E2129252D232B272F2' 4                    05638000
         DC    X'0A8A4ACA2AAA6AEA1A9A5ADA3ABA7AFA' 5                    05639000
         DC    X'068646C626A666E6169656D636B676F6' 6                    05640000
         DC    X'0E8E4ECE2EAE6EEE1E9E5EDE3EBE7EFE' 7                    05641000
         DC    X'018141C121A161E1119151D131B171F1' 8                    05642000
         DC    X'098949C929A969E9199959D939B979F9' 9                    05643000
         DC    X'058545C525A565E5159555D535B575F5' A                    05644000
         DC    X'0D8D4DCD2DAD6DED1D9D5DDD3DBD7DFD' B                    05645000
         DC    X'038343C323A363E3139353D333B373F3' C                    05646000
         DC    X'0B8B4BCB2BAB6BEB1B9B5BDB3BBB7BFB' D                    05647000
         DC    X'078747C727A767E7179757D737B777F7' E                    05648000
         DC    X'0F8F4FCF2FAF6FEF1F9F5FDF3FBF7FFF' F                    05649000
*********************************************************************** 05650000
*                                                                     * 05651000
*    Reversing Table. Reverse ASCII to ASCII. Lose high order bit.    * 05652000
*                                                                     * 05653000
*********************************************************************** 05654000
         SPACE 1                                                        05655000
*                0 1 2 3 4 5 6 7 8 9 A B C D E F                        05656000
RATOA    DC    X'00004040202060601010505030307070' 0                    05657000
         DC    X'08084848282868681818585838387878' 1                    05658000
         DC    X'04044444242464641414545434347474' 2                    05659000
         DC    X'0C0C4C4C2C2C6C6C1C1C5C5C3C3C7C7C' 3                    05660000
         DC    X'02024242222262621212525232327272' 4                    05661000
         DC    X'0A0A4A4A2A2A6A6A1A1A5A5A3A3A7A7A' 5                    05662000
         DC    X'06064646262666661616565636367676' 6                    05663000
         DC    X'0E0E4E4E2E2E6E6E1E1E5E5E3E3E7E7E' 7                    05664000
         DC    X'01014141212161611111515131317171' 8                    05665000
         DC    X'09094949292969691919595939397979' 9                    05666000
         DC    X'05054545252565651515555535357575' A                    05667000
         DC    X'0D0D4D4D2D2D6D6D1D1D5D5D3D3D7D7D' B                    05668000
         DC    X'03034343232363631313535333337373' C                    05669000
         DC    X'0B0B4B4B2B2B6B6B1B1B5B5B3B3B7B7B' D                    05670000
         DC    X'07074747272767671717575737377777' E                    05671000
         DC    X'0F0F4F4F2F2F6F6F1F1F5F5F3F3F7F7F' F                    05672000
         LOCALS ,                                              @SC86295 05673000
         EXIT                                                           05674000
         TITLE 'SCRNIO Routine - Handle screen I/O via Series/1'        05675000
* R1 points to a pair of (adr,len) for read or write.  If I/O is        05676000
* successfull, R15 returns transferred byte count (else returns -1).    05677000
*               Command code is in R0:                                  05678000
* 0 => Clear screen on console (not comm line)                 @SC90045 05678500
* 1 => Open screen for I/O            4 => Write packet                 05679000
* 2 => Close screen                   5 => Read packet                  05680000
* 3 => Reset screen status after      6 => Write message                05681000
*      environment changes                                              05682000
*                                                                       05683000
SCRNIO   ENTER                                                          05684000
         XC    ZFSARG(20),ZFSARG  Clear FSIO Control Block              05685000
         LTR   0,0                                             @SC90045 05685300
         BZ    SCRCLR                                          @SC90045 05685600
         BCT   0,SCRCLS                                        @SC86295 05686000
         MVI   TRMFLG,X'FF'       Initialize W/R flag          @PG90058 05686500
SCRCLRA  MVI   FSFSFG,X'84'  Write erase needed to setup FSIO  @SC90045 05687000
         MVI   FSFSFG+1,X'60'     No data Compression                   05688000
         MVI   ZLU,9              Specify Unit 9                        05689000
         MFSET DSKST,FSIO                                               05690000
         MFREQ DSKST              Do the I/O                            05691000
         B     RTRN0                                           @SC86295 05692000
*                                                                       05692100
SCRCLR   CLI   TRMTP,C'T'    Is it a TTY terminal?             @SC90045 05692200
         BE    RTRN0         Yes, can't clear screen           @SC90045 05692300
         CLI   TRMTP,C'V'    Is it a TTY terminal?             @SC90045 05692400
         BE    RTRN0         Yes, can't clear screen           @SC90045 05692500
         TM    FL2,PROTO     In protocol mode?                 @SC90045 05692600
         BO    RTRN0         Yes, skip clearing screen         @SC90045 05692700
         B     SCRCLRA       Do it                             @SC90045 05692800
*                                                                       05693000
SCRCLS   BCT   0,SCRRSET                                       @SC86295 05694000
         B     RTRN0                                           @SC86295 05695000
* (Re)set device characteristics to suit environment                    05696000
SCRRSET  BCT   0,SCRRW                                         @SC86295 05697000
         B     RTRN0                                                    05698000
*                                                                       05699000
*  Perform I/O request                                                  05700000
SCRRW    BCT   0,SCRRD                                                  05701000
         CLI   WRRD,0             Write/Read ?                 @PG90058 05702000
         BE    SCRWO                                           @PG90058 05702200
         MVC   RIOPRP(8),0(1)     Save Write data as Read Prmp @PG90058 05702400
         B     RTRN0                                           @PG90058 05702600
SCRWO    MVI   FSFSFG,X'06'       WCC included, Skip read      @PG90058 05702800
         MVI   FSFSFG+1,X'A0'     No data Compression                   05703000
         MVC   FSFSWL(4),4(1)     Get buffer length                     05704000
         MVC   FSFSWB(4),0(1)     Get buffer address                    05705000
         MVI   ZLU,9              Specify Unit 9                        05706000
         MVI   TRMFLG,0           Indicate no actn on followup @PG90058 05706500
         MFSET DSKST,FSIO                                               05707000
         MFREQ DSKST              Do the I/O                            05708000
         B     RTRN0                                                    05709000
*                                                                       05709500
SCRRD    BCT   0,SCRWM                                                  05710000
         TS    TRMFLG             Do we have to really read?   @PG90058 05711000
         BZ    RTRN0              Just a follow up. 0-len read @PG90058 05711300
         MVI   FSFSFG,X'02'       Write/Read with Wcc          @PG90058 05711600
         MVI   FSFSFG+1,X'80'     No data Compression                   05712000
         MVC   FSFSRL(4),4(1)     Get buffer length Read       @PG90058 05713000
         MVC   FSFSRB(4),0(1)     Get buffer address Read      @PG90058 05713500
         MVC   FSFSWL(4),RIOPRP+4 Get buffer length Write      @PG90058 05714000
         MVC   FSFSWB(4),RIOPRP   Get buffer address Write     @PG90058 05714500
         MVI   ZLU,9              Specify Unit 9                        05715000
         MFSET DSKST,FSIO                                               05716000
         MFREQ DSKST              Do the I/O                            05717000
         L     15,MFARSZ                                                05718000
         TM    FL1,DEBUG          If DEBUG is on, then                  05719000
         BZ    RTRN               also log the AID and cursor           05720000
         TM    DBGFLG,DBGIO  I/O log wanted?                   @SC88168 05721000
         BZ    RTRN          No, skip it                       @SC88168 05722000
         L     2,LOGBUF      Ptr to buffer                     @SC87286 05723000
         MVI   0(2),C'A'     Set label                         @SC87286 05724000
         L     3,FSFSRB                                                 05725000
         MVC   2(3,2),0(3)   Copy into buffer                  @SC87286 05726000
         LR    9,15          Save data length                  @SC87286 05727000
         WRITF LOGPTR,BSIZE=5 Log it                           @SC87286 05728000
         TM    DBGFLG,DBGSV  Save log?                         @SC88168 05729000
         BZ    SCRIOLZ       No, skip it                       @SC88168 05730000
         SAVEF LOGPTR        Yes, close it                     @SC88168 05731000
SCRIOLZ  DS    0H                                              @SC88168 05732000
         LR    15,9          Return data length                @SC87286 05733000
         B     RTRN          Return                            @SC86299 05734000
*                                                                       05735000
SCRWM    MVI   FSFSFG,X'86'       EW, WCC included, Skip Read           05736000
         MVI   FSFSFG+1,X'A0'     No data Compression                   05737000
         MVC   FSFSWL(4),4(1)     Get buffer length                     05738000
         MVC   FSFSWB(4),0(1)     Get buffer address                    05739000
         MVI   ZLU,9              Specify Unit 9                        05740000
         MFSET DSKST,FSIO                                               05741000
         MFREQ DSKST              Do the I/O                            05742000
         B     RTRN0                                                    05743000
RIOPRP   DC    A(0,1)                                          @PG90058 05743500
         LOCALS ,                                                       05744000
SCRNIO   EXIT  ,                                                        05745000
         TITLE 'DISKIO Routine - performs disk I/O functions'           05746000
* Function selected on entry by R0:                                     05747000
* 0=> unnum: R1->FAB.  Return R1->buffer,R0=# and remove the sequence   05748000
*   number (if any) from the buffer (used for TAKE files)               05749000
* 1=> open (in): R1->pattern FDB, R2->name.  Returns R0->FAB, R1->FDB   05750000
* 2=> open (out): (same)                                                05751000
* 3=> test name: R2->name.  Returns R1->FDB if found (else R15=1)       05752000
* 4=> close file: R1->adr(FAB).                                         05753000
* 5=> set up search: R1->pattern name.                                  05754000
* 6=> return next file in list:  Returns R1->FDB + sets up FILNAM       05755000
* 7=> close search (if any).                                            05756000
* 8=> test CWD string: R1->string.  Returns R15=0 if ok, else =1.       05757000
* 9=> read: R1->FAB.  Returns R15=12 if EOF, 0 if ok; R0=# data         05758000
* 10=> write: R1->FAB.  Returns R15=13 if disk full, 0 if ok.           05759000
* 11=> test space: R1->pattern FDB (has size in Kbytes),                05760000
*  R2->name (used if FAB not found), R6->adr(FAB). Return R15=0 if ok.  05760500
* 12=> analyze R/W error, set ERRNUM, make EMSG: R1->FAB, TMPDW=code    05761000
*      always returns R15=1                                             05762000
* 13=> directory info on file: R1->name.  Returns R15=0 if ok.          05763000
* 14=> delete file: R1->name.  Returns R15=0 if ok.                     05764000
* 15=> rename file: R1->name, R2->new name.  Returns R15=0 if ok.       05765000
* 16=> copy file: R1->name, R2->new name.  Returns R15=0 if ok.         05766000
* 17-> type file: R1-> name. Returns R15=0 if ok.                       05767000
* 21=> save file status in directory: R1->FAB.                 @SC88168 05768000
* 22=> open library (in): R2->DDNAME.  Return R15=0 if ok.     @SC89073 05768200
* 23=> point for next read, R1->adr(FDB), R2=records to skip.  @SC89218 05768300
*      Return R15=0 if ok.                                     @SC89218 05768400
DISKIO   ENTER                                                          05769000
         USING FABD,3                                          @SC86295 05770000
         SR    4,4           Signal no block assigned          @SC86295 05771000
         STC   0,DSKCOD      Save function code (for now)      @SC88101 05772000
         LR    5,0                                             @SC89073 05773000
         AR    5,5                                             @SC89073 05773200
         LH    5,DSK0(5)     Get handler address               @SC89073 05773400
         B     DSK0(5)       Do the function                   @SC89073 05773600
DSK0     DC    Y(DSKRED-DSK0,DSKOPNI-DSK0,DSKOPNO-DSK0)   0-2  @SC89073 05773800
         DC    Y(DSKTEST-DSK0,DSKCLOS-DSK0,DSKNSET-DSK0)  3-5  @SC89073 05774000
         DC    Y(DSKNXT-DSK0,DSKXSET-DSK0,DSKCWDF-DSK0)   6-8  @SC89073 05774200
         DC    Y(DSKRED-DSK0,DSKWRT-DSK0,DSKTSP-DSK0)     9-11 @SC89073 05774400
         DC    Y(DSKXXX-DSK0,DSKDIR-DSK0,DSKDEL-DSK0)    12-14 @SC89073 05774600
         DC    Y(DSKRNM-DSK0,DSKCPY-DSK0,DSKTYP-DSK0)    15-17 @SC89073 05774800
         DC    3Y(DSKER1-DSK0)   Spare utilities         18-20 @SC89073 05775000
         DC    2Y(DSKER1-DSK0),Y(DSKPNT-DSK0)            21-23 @SC89218 05775200
         DC    8Y(DSKER1-DSK0)   Spares                        @SC89073 05775400
*                                                                       05776000
* Open for input file whose name is at (R2), FDB at (R1)                05777000
DSKOPNI  DS    0H                                              @SC89073 05777500
         BAL   9,DSKALC      Get FAB                           @SC86295 05778000
         MFSET DSKST,OPEN,R=(OKOLD,RDOK)                                05779000
         MFREQ DSKST                        Try to open file            05780000
         CLI   ZRC,0                        Errors ???                  05781000
         BNZ   DSKER1        Not found                         @SC86295 05782000
         MVC   FABRC,ZRC                                                05783000
         BAL   9,DSKCHKNM          Check if allowed to do I/O           05784000
          B     DSKER1                                                  05785000
         BAL   14,DSKVALS          Go copy info to FDBD                 05786000
         MVC   FABUNIT(1),ZLU      Save file unit number                05787000
         B     RTRN0                                           @SC86295 05788000
*                                                                       05789000
* Open for output file whose name is at (R2), FDB at (R1)               05790000
DSKOPNO  DS    0H                                              @SC89073 05791000
         BAL   9,DSKALC      Get FAB                           @SC86295 05792000
         MVC   FABCOMM,=CL8'Open'  In case of error            @SC88308 05793000
         MFSET DSKST,EXTRACT                                   @SC88308 05796000
         MFREQ DSKST         Get file attributes               @SC88308 05797000
         CLI   ZRC,0         Did it work?                      @SC88308 05798000
         BNE   DSKOP2        Not found, just writing new       @SC87012 05799000
         TM    FDBFLGS,APPN+SVATT  Should we keep attributes?  @SC90033 05799500
         BZ    *+8           No                                @SC90033 05800000
          BAL  14,DSKVALS    Yes, copy old ones to FDB         @SC90033 05800500
         TM    FDBFLGS,APPN  Appending?                        @SC90033 05801000
         BO    DSKOP2        Yes, keep old file                @SC90033 05801500
DSKOP1   DS    0H                                              @SC88308 05802000
         MFSET DSKST,OPEN,R=(OKOLD,RDOK)                                05803000
         MFREQ DSKST                                                    05804000
         MVC   FABRC(1),ZRC                                             05805000
         CLI   ZRC,30              Error deleting file ?                05806000
         BE    DSKOP2              Yup, ignore it.                      05807000
         BAL   9,DSKCHKNM          Check if allowed to do I/O           05808000
          B     DSKER1                                                  05809000
         MFSET DSKST,CLOSE,R=(DEL)                                      05810000
         MFREQ DSKST               Delete the file...                   05811000
         MVC   FABRC(1),ZRC                                             05812000
DSKOP2   MVC   ZINFIN(LZINFDEF),ZINFDEF  Get default file attrs         05813000
         SR    0,0                                                      05814000
         ICM   0,3,FDBLRC    Insert logical record length               05815000
         STH   0,MFIRSIZ                                                05816000
         CLI   FDBRCF,C'V'   If not variable, then truncate             05817000
         BNE   DSKSTLR                                         @SC88120 05818000
         CLI   TYPFIL,C'B'   If variabel BUT binary, truncate           05819000
         BE    DSKSTLR                                                  05820000
         L     0,MAXLRC      TEXT file, no limit               @SC87012 05821000
DSKSTLR  ST    0,FABLRTR     Set output buffer limit                    05822000
         CLI   FDBRCF,C'F'   Fixed format ?                             05823000
         BNE   *+8                                                      05824000
         MVI   MFIRFM,X'02'  Yup, set to Fixed Compressed               05825000
         MFSET DSKST,OPEN,R=(OKOLD,OKNEW,WROK)                          05826000
         TM    FDBFLGS,APPN   Append to file ?                          05827000
         BZ    *+8                                                      05828000
         OI    DSKST+1,X'20'  Manually specify APPOK !                  05829000
         MFREQ DSKST          Do the I/O                                05830000
         CLI   ZRC,0          Any errors ?                              05831000
         BNZ   DSKER1                                                   05832000
         MVC   FABRC,ZRC     Save return code                           05833000
         MVC   ZINFOUT(LZINFDEF),ZINFIN  Copy creation file parms       05834000
         BAL   14,DSKVALS          Copy parms to FDBD                   05835000
         OI    FDBFLGS,FWRITE      Write mode file                      05836000
         MVC   FABUNIT(1),ZLU      Save the Unit number                 05837000
         B     RTRN0                                           @SC86295 05838000
*                                                                       05839000
* Test for existence of file whose name is at (R2)                      05840000
DSKTEST  DS    0H                                              @SC89073 05841000
         MVC   MFNAME(LFID),0(2)   Get filename to test                 05842000
DSKTST2  LA    3,DSKSTT      Get temporary FDB                 @SC88308 05843000
         MFSET DSKST,EXTRACT                                   @SC88308 05844000
         MFREQ DSKST               Get the file info...                 05845000
         MVI   ZLU,0               Safety check...                      05846000
         CLI   ZRC,0               Any errors ?                         05847000
         BNZ   DSKER1                                                   05848000
         BAL   14,DSKVALS          Go copy info to FDBD                 05849000
         B     RTRN0                                                    05850000
*                                                                       05851000
* Close file whose ticket is at (R1), release block                     05852000
DSKCLOS  DS    0H                                              @SC89073 05853000
         ICM   3,15,0(1)     Get FAB ptr, if any               @SC86295 05854000
         BZ    RTRN0         None, ignore                      @SC86295 05855000
         XC    0(4,1),0(1)   Yes, now clear ticket             @SC86295 05856000
         MVC   ZLU(1),FABUNIT      Copy file Unit number                05857000
         LR    6,3                 Save the address of the FAB          05858000
         MFSET DSKST,CLOSE                                              05859000
         TM    FDBFLGS,FWRITE      Write mode file ?                    05860000
         BZ    DSKCLS2                                                  05861000
         OI    DSKST+1,X'10'       Yes, add RLSE option !               05862000
DSKCLS2  MFREQ DSKST               Close the file                       05863000
         LR    1,6                 Get FAB address                      05864000
         LA    0,FABDWDS                                       @SC86295 05865000
       DMSFRET DWORDS=(0),LOC=(1)  Free up the FAB                      05866000
         B     RTRN0                                           @SC86295 05867000
*                                                                       05867080
* Point past 1st N records of file at (R1)                     @SC89218 05867160
DSKPNT   ICM   3,15,0(1)     Get ticket                        @SC89218 05867240
         BZ    RTRN1         Not open                          @SC89218 05867320
         LR    3,1                                             @SC89218 05867400
         LTR   2,2           Number of records to skip         @SC89218 05867480
         BNP   RTRN0         Never mind                        @SC89218 05867560
DSKPNTL  READF 0(,3),E=RTRN1 Skip one                          @SC89218 05867640
         BCT   2,DSKPNTL     ... until finished                @SC89218 05867720
         B     RTRN0         Return with completion code       @SC89218 05867800
*                                                                       05868000
* Read from file   R1->FAB                                              05869000
DSKRED   DS    0H                                              @SC89073 05870000
DSKRED2  LR    3,1                 Point to FAB                         05871000
         MVC   FABCOMM(8),=CL8'Read'  I/O Operation                     05872000
         L     0,FDBBUFF           Get buffer address                   05873000
         ST    0,MFRBUF                                                 05874000
         L     0,FDBBSIZ           Get I/O Length                       05875000
         ST    0,MFRLEN                                                 05876000
         MVC   ZLU(1),FABUNIT      Get unit number                      05877000
         MFSET DSKST,IO,R=(RD)                                          05878000
         MFREQ DSKST               Do the I/O                           05879000
         MVC   FABRC(1),ZRC        Save the return code                 05880000
         L     0,MFARSZ            Get length read from Save file.      05881000
         RETREG 0            Return length as R0               @SC89218 05882000
         CLI   ZRC,0               Any errors ???                       05884000
         BE    RTRN0                                                    05885000
         LA    15,12               End of file.                         05886000
         CLI   ZRC,1               End of file maybe ???                05887000
         BE    RTRN                                                     05888000
         B     RTRN1               Well, just another error...          05889000
*                                                                       05890000
* Write to file    R1->FAB                                              05891000
DSKWRT   DS    0H                                              @SC89073 05892000
         LR    3,1                 Point to FAB                         05893000
         MVC   FABCOMM(8),=CL8'Write'  I/O Operation                    05894000
         L     0,FDBBUFF           Get buffer address                   05895000
         ST    0,MFRBUF                                                 05896000
         L     0,FDBBSIZ           Get I/O Length                       05897000
         ST    0,MFRLEN                                                 05898000
         MVC   ZLU(1),FABUNIT      Get unit number                      05899000
         MFSET DSKST,IO,R=(WR)                                          05900000
         MFREQ DSKST               Do the I/O                           05901000
         MVC   FABRC(1),ZRC        Save the return code                 05902000
         CLI   ZRC,0               Any errors ???                       05903000
         BE    RTRN0                                                    05904000
         LA    15,13               Disk full error code.                05905000
         CLI   ZRC,40              Well, is it full ?                   05906000
         BL    RTRN1                                                    05907000
         CLI   ZRC,42              Three possible return codes          05908000
         BH    RTRN1                                                    05909000
         B     RTRN                                                     05910000
*                                                                       05911000
* Analyze error: Get error code from FABRC field of FAB !               05912000
DSKXXX   DS    0H                                              @SC89073 05913000
         LR    3,1                 Get address of FAB                   05914000
         MVI   ERRNUM,ERRDIE       Set Kermit DISKIO error code         05915000
         L     2,EMSGP             Ptr to msg buffer                    05916000
         MVC   0(8,2),FABCOMM      Copy oprn name                       05917000
         MVC   ZRC(1),FABRC        Get the error code                   05918000
         LA    0,8(2)              Get address of where to pad          05919000
         ST    0,MFRBUF            message                              05920000
         LA    0,70                Maximum length of message            05921000
         ST    0,MFRLEN                                                 05922000
         MFSET DSKST,MSG           Convert RC to real message           05923000
         MFREQ DSKST                                                    05924000
         LA    0,79                Return maximum length of msg.        05925000
         ST    0,EMSGL                                                  05926000
         B     RTRN1                                           @SC87338 05927000
*                                                                       05928000
* Delete file R1->name, Return R15=0 if ok                              05929000
DSKDEL   DS    0H                                              @SC89073 05930000
         LA    3,DSKSTT             Temporary FAB needed                05931000
         MVC   MFNAME(LFID),0(1)    Copy file name to delete            05932000
         MFSET DSKST,OPEN,R=(OKOLD,RDOK)                                05933000
         MFREQ DSKST              Try to open the file                  05934000
         CLI   ZRC,0              Error ?                               05935000
         BNE   DSKER2                                                   05936000
         BAL   9,DSKCHKNM          Check if allowed to do I/O           05937000
          B     DSKER2                                                  05938000
         MFSET DSKST,CLOSE,R=(DEL)                                      05939000
         MFREQ DSKST              Delete the file                       05940000
         CLI   ZRC,0              Error ?                               05941000
         BNE   DSKER2                                                   05942000
         LA    2,0                File deleted message                  05943000
*                                                                       05944000
DSKMSG   SLL   2,4                Get the address of the message        05945000
         LA    1,DSKMTAB(2)                                    @SC88308 05946000
         LA    0,16          Length of msg                     @SC88308 05947000
         WTEXT (1),(0)                                         @SC88308 05948000
         MVI   ERRNUM,ERRNOE      No Errors                             05949000
         B     RTRN0                                                    05950000
*                                                                       05951000
* Rename file R1->name, R2->newname,  Return R15=0 if ok                05952000
DSKRNM   DS    0H                                              @SC89073 05953000
         LA    3,DSKSTT             Temporary FAB needed                05954000
         MVC   MFNAME(LFID),0(1)    Copy file name to delete            05955000
         MFSET DSKST,OPEN,R=(OKOLD,RDOK)                                05956000
         MFREQ DSKST                Try to open the file                05957000
         CLI   ZRC,0                Error ?                             05958000
         BNE   DSKER2                                                   05959000
         BAL   9,DSKCHKNM          Check if allowed to do I/O           05960000
          B     DSKER2                                                  05961000
         MVC   ZINFIN(LZINFDEF),ZINFDEF  Get default file attrs         05962000
         MVC   MFNAME(LFID),0(2)         Get new name                   05963000
         MFSET DSKST,CLOSE,R=(RENAME)                                   05964000
         MFREQ DSKST              Rename it !                           05965000
         LA    2,1                File renamed message                  05966000
         CLI   ZRC,0              Error on rename ?                     05967000
         BE    DSKMSG                                                   05968000
         CLI   ZLU,0              Is an additional close required ?     05969000
         BE    DSKER2                                                   05970000
         MFSET DSKST,CLOSE        Yes, close the file normally.         05971000
         MFREQ DSKST              Rename failed.                        05972000
         B     DSKER2                                                   05973000
*                                                                       05974000
* Copy file.  R1->name, R2->newname.  Return R15=0 if ok                05975000
DSKCPY   DS    0H                                              @SC89073 05976000
         LA    3,DSKSTT             Temporary FAB needed                05977000
         LA    7,1                  Error by default !!!                05978000
         MVC   MFNAME(LFID),0(1)    Get file name to copy               05979000
         MFSET DSKST,OPEN,R=(OKOLD,RDOK)                                05980000
         MFREQ DSKST              Try to open the file                  05981000
         CLI   ZRC,0              Error ?                               05982000
         BNE   DSKER2                                                   05983000
         BAL   9,DSKCHKNM          Check if allowed to do I/O           05984000
          B     DSKER2                                                  05985000
         SLR   8,8                                                      05986000
         ICM   8,1,ZLU             Save Read Unit Number                05987000
         L     9,MFEOFB            Get number of blks to copy           05988000
         MVC   PARMAREA(2),MFORSIZ     Save record size                 05989000
         MVC   PARMAREA+2(4),MFNLRC    Save Line count                  05990000
         MVC   PARMAREA+6(4),MFEOFB    Save last blk written            05991000
         MVC   PARMAREA+10(4),MFEOFD   Save displacement                05992000
         MVC   CMD(64),MFTAG Save tag                          @SC88308 05993000
*                                                                       05994000
         MVC   MFNAME(LFID),0(2)    Get destination                     05995000
         MVC   ZINFIN(LZINFDEF),ZINFOUT                                 05996000
         NI    MFIGCTL,X'7F'        Turn off common bit !!!             05997000
         MFSET DSKST,OPEN,R=(OKNEW,WROK)                                05998000
         MFREQ DSKST              Try to open the file                  05999000
         CLI   ZRC,0                                                    06000000
         BNE   DSKCP55            Error. New file open failed !         06001000
         ICM   8,2,ZLU            Save Write Unit Number                06002000
*                                                                       06003000
         LA    4,1                Starting blk number                   06004000
         LA    5,512              Number of blks to copy                06005000
         LA    6,2048             Address of buffer                     06006000
         A     6,WBUF                                                   06007000
         LTR   9,9                Anything left to do ???               06008000
         BZ    DSKCP50                                                  06009000
DSKCP20  STCM  8,1,ZLU            Set Unit number                       06010000
         STM   4,6,MFSBNU         Set read args                         06011000
         MFSET DSKST,UIO,R=(RD)                                         06012000
         MFREQ DSKST              Read a block                          06013000
         CLI   ZRC,0              Error reading ?                       06014000
         BNE   DSKCP55                                                  06015000
         STCM  8,2,ZLU            Set unit number                       06016000
         STM   4,6,MFSBNU         Set read args                         06017000
         MFSET DSKST,UIO,R=(WR)                                         06018000
         MFREQ DSKST              Write the block back                  06019000
         CLI   ZRC,0         Error writing?                    @SC88308 06020000
         BNE   DSKCP55                                                  06021000
         LA    4,1(4)             Next block                            06022000
         BCT   9,DSKCP20          until all done                        06023000
*                                                                       06024000
DSKCP50  SLR   7,7           Clear return code !                        06025000
DSKCP55  STCM  8,1,ZLU                                                  06026000
         CLI   ZLU,0         Is the input file open ???                 06027000
         BE    DSKCP60                                                  06028000
         MFSET DSKST,CLOSE   Yes, close the input file.                 06029000
         MFREQ DSKST                                                    06030000
         ICM   7,2,ZRC       Save the return code                       06031000
DSKCP60  STCM  8,2,ZLU                                                  06032000
         CLI   ZLU,0         Is the output file open ?                  06033000
         BE    DSKCP80                                                  06034000
         LTR   7,7           Any errors so far ?                        06035000
         BNZ   DSKCP65                                                  06036000
         MFSET DSKST,CLOSE,R=(SETEFP)  No, close and save file          06037000
         MVC   MFORSIZ(2),PARMAREA     Set record size                  06038000
         MVC   MFNLRC(4),PARMAREA+2    Set Line count                   06039000
         MVC   MFEOFB(4),PARMAREA+6    Set last blk written             06040000
         MVC   MFEOFD(4),PARMAREA+10   Set displacement                 06041000
         MVC   MFTAG(64),CMD Restore tag                       @SC88308 06042000
         B     DSKCP70                                                  06043000
DSKCP65  MFSET DSKST,CLOSE,R=(DEL)  Errors, delete file !               06044000
DSKCP70  MFREQ DSKST                                                    06045000
         ICM   7,4,ZRC       Get return code on Close                   06046000
DSKCP80  LR    15,7          Return it to Kermit !                      06047000
         B     RTRN                                                     06048000
*                                                                       06049000
* Type file.   R1-> name. Returns R15=0 if ok.                          06050000
DSKTYP   DS    0H                                              @SC89073 06051000
         LR    4,1           Point to file name                @PG88335 06052000
         OPENF I,(4),FILFDB,FILPTR,E=RTRN1                     @PG88335 06053000
         LR    3,0           Point to FAB                      @PG88335 06054000
         LH    1,FDBLRC                                        @PG88335 06055000
         CH    1,=H'130'     Check record length !!!           @PG88335 06056000
         BL    DSKTYP20                                        @PG88335 06057000
         WTEXT 'Only first 130 characters displayed!'          @PG88335 06058000
DSKTYP20 L     3,RBUF        Point to data buffer              @PG88335 06059000
         READF FILPTR,BUFFER=(3),E=DSKTYP50                    @PG88335 06060000
         CH    0,=H'130'     Record too long ?                 @PG88335 06061000
         BL    DSKTYP30                                        @PG88335 06062000
         LA    0,129         Yes, truncate...                  @PG88335 06063000
DSKTYP30 LTR   0,0           Is it null ?                      @PG88335 06064000
         BNZ   DSKTYP35                                        @PG88335 06065000
         MVI   0(3),X'40'    Then we must have at least        @PG88335 06066000
         LA    0,1           one character to output           @PG88335 06067000
DSKTYP35 WTEXT (3)                                             @PG88335 06068000
         B     DSKTYP20                                        @PG88335 06069000
DSKTYP50 C     15,F12        EOF code ?                        @PG88335 06070000
         BE    DSKTYP70                                        @PG88335 06071000
         ERRF  ,             Analyze error code                @PG88335 06072000
         CLOSF FILPTR                                          @PG88335 06073000
         B     RTRN1                                           @PG88335 06074000
DSKTYP70 CLOSF FILPTR                                          @PG88335 06075000
         B     RTRN0                                           @PG88335 06076000
*                                                                       06077000
* Return on error, release useless block, if any                        06078000
DSKER1   LTR   1,4           Any block assigned?               @SC86295 06079000
         BZ    RTRN1         No                                @SC86295 06080000
         LA    0,FABDWDS     Yes, release it                   @SC86295 06081000
       DMSFRET DWORDS=(0),LOC=(1)                              @SC86295 06082000
         B     RTRN1         Flag error                        @SC86295 06083000
* Error return from disk utilities. Set ERRNUM properly.                06084000
DSKER2   CLI   ZRC,12                                                   06085000
         BNE   DSKER3                                                   06086000
         MVI   ERRNUM,ERRFNE  Invalid filename                          06087000
         B     RTRN1                                                    06088000
DSKER3   CLI   ZRC,30                                                   06089000
         BNE   DSKER4                                                   06090000
         MVI   ERRNUM,ERRFNF  File not found                            06091000
         B     RTRN1                                                    06092000
DSKER4   MVI   ERRNUM,ERRDIE  Disk I/O Error                            06093000
         B     RTRN1                                                    06094000
* Allocate FAB and copy default FDB                                     06095000
DSKALC   LR    5,1           Save FDB ptr                      @SC86295 06096000
         MVC   MFNAME,0(2)                                              06097000
         LA    0,FABDWDS                                       @SC86295 06098000
       DMSFREE DWORDS=(0),ERR=DSKER1                           @SC86295 06099000
         LR    3,1           New block ptr                     @SC86295 06100000
         LA    4,FDBD        FDB pointer                       @SC88120 06101000
         RETREG (0,3),(1,4)  Return FAB ptr in R0, FDB in R1   @SC89218 06102000
         LR    4,3           Indicate we have it               @SC88120 06104000
         XC    0(8*FABDWDS,3),0(3)                             @SC86295 06105000
         MVC   FDBD(FDBCOP),0(5) Copy user's FDB               @SC86295 06106000
         MVC   FABFN(LFID),0(2)  Copy filename to FAB                   06107000
         BR    9                                               @SC86295 06108000
*                                                                       06109000
* Set up search through list of files, pattern at (R1)                  06110000
DSKNSET  DS    0H                                              @SC89073 06111000
         MVC   SCODE,UCODE        Get default user code                 06112000
         MVC   NXFN(LFID),0(1)    Save pattern name                     06113000
         CLI   4(1),C':'          Code specified in filename ?          06114000
         BNE   DSKNS4             Nope.                                 06115000
         MVC   SCODE(4),0(1)      Get the new code for search           06116000
         MVC   NXFN(LFID),BLNAME  Clear the filename pattern            06117000
         MVC   NXFN(17),5(1)      Copy filename part only               06118000
DSKNS4   CLC   SCODE(4),=CL4'*USR' Do we really want the user's code ?  06119000
         BNE   DSKNS6                                                   06120000
         MVC   SCODE(4),$USRCDE   Yes, then put in the real thing       06121000
DSKNS6   MVI   NXFLG,NFSOK        Clear flag byte                       06122000
         LA    2,LFID             Max length of filename                06123000
         LA    3,NXFN+LFID                                              06124000
DSKNS8   BCTR  3,0                                                      06125000
         CLI   0(3),C'?'          Is it a wildcard ?                    06126000
         BE    DSKNS10                                                  06127000
         CLI   0(3),C'*'          Is it a wildcard ?                    06128000
         BE    DSKNS10                                                  06129000
         BCT   2,DSKNS8                                                 06130000
         B     RTRN0              No wildcards, Grreat !!!              06131000
*                                                                       06132000
DSKNS10  CLC   SCODE(4),$USRCDE   Are we searching our library ?        06133000
         BE    DSKNS12                                                  06134000
         TM    UPRIVS,FILES+LSCAN No, then we need some privs !!!       06135000
         BZ    DSKNS15                                                  06136000
DSKNS12  LA    1,NXFN+LFID        End of token if no blanks             06137000
         TRT   NXFN(LFID),TRTBL   Find 1st blank                        06138000
         LA    2,NXFN                                                   06139000
         SR    1,2                Calc length of string                 06140000
         ST    1,NXFNL            Save it...                            06141000
         OI    NXFLG,NFWLD        Wildcard search necessary !           06142000
         L     2,MFINDBUF                                               06143000
         CALL  MFIND1,((2),F10,SCODE,F0,ZRC),VL,MF=(E,PARMAREA)         06144000
         LTR   15,15              Any errors ???                        06145000
         BZ    RTRN0                                                    06146000
DSKNS15  OI    NXFLG,NFERR        Error on MFIND1 call                  06147000
         B     RTRN1                                                    06148000
*                                                                       06149000
* Flush previous file pattern                                           06150000
DSKXSET  DS    0H                                              @SC89073 06151000
         MVI   NXFLG,0            Clear flag byte                       06152000
         B     RTRN0                                                    06153000
*                                                                       06154000
* Check CWD string, return code in R15                                  06155000
DSKCWDF  DS    0H                                              @SC89073 06156000
         B     RTRN0                                                    06157000
*                                                                       06158000
* Check disk space for proposed file: FDB at (R1), FAB ptr at (R6)      06159000
DSKTSP   L     5,FDBSIZE-FDBD(,1)  Get actual size             @SC90037 06159200
         ICM   3,15,0(6)     Get FAB ptr                       @SC90037 06159400
         BNZ   DSKTSP0       Not open yet                      @SC90037 06159600
         MVC   MFNAME(LFID),0(2)   Get filename                @SC90037 06159800
         LA    3,DSKSTT      Get temporary FDB                 @SC90037 06160000
         MFSET DSKST,EXTRACT                                   @SC90037 06160200
         MFREQ DSKST         Get the file info                 @SC90037 06160400
         MVI   ZLU,0         For safety                        @SC90037 06160600
         CLI   ZRC,0         Found it?                         @SC90037 06160800
         BNE   DSKTSP0       Not found, nothing to erase       @SC90037 06161000
         L     1,MFOPRM      Old file size in KBytes           @SC90037 06161200
         SR    5,1           Assume old file will be erased    @SC90037 06161400
         BNP   RTRN0         Will release enough for new file  @SC90037 06161600
DSKTSP0  DS    0H            Check free space                  @SC90037 06161800
         MFSET DSKST,USERCTL    Get User Control Record to              06163000
         MFREQ DSKST            determine how much space the            06164000
         MVC   FABRC(1),ZRC     user has left. Save return code !       06165000
         L     1,MFMAXS         Get max allocation space                06166000
         S     1,MFACUR         Subtract amt allocated                  06167000
         CLR   1,5                                             @SC90037 06168000
         BL    RTRN1         No room                           @SC86316 06169000
         B     RTRN0         Ok                                @SC86316 06170000
*                                                                       06171000
DSKVALS  LA    0,FDBD        Ptr to FDB                        @SC86295 06172000
         RETREG (1,0)        Return FDB ptr as R1              @SC89218 06173000
***  GET FILE'S DATE...                                                 06175000
         SR    7,7                                             @SC87296 06176000
         IC    7,DS1CRDT     Get year in binary                @SC87296 06177000
         CVD   7,TMPDW                                         @SC87296 06178000
         MVO   FDBDATE+1(2),TMPDW Copy year                    @SC87296 06179000
         ICM   7,3,DS1CRDT+1 Get day-of-year in binary         @SC87296 06180000
         MVC   DSKMNTH,=AL1(30,31,30,31,31,30,31,30,31,28,31)  @SC86299 06181000
         TM    DS1CRDT,3                                       @SC87296 06182000
         BNZ   *+8                                             @SC87296 06183000
         MVI   DSKMNTH+9,29  Leap year, change Feb.            @SC86299 06184000
         LA    6,11                                            @SC86299 06185000
         SR    0,0                                             @SC86299 06186000
DSKVMDL  IC    0,DSKMNTH-1(6)                                  @SC86299 06187000
         SR    7,0           Test if passed the right month    @SC86299 06188000
         BNP   DSKVMDM       Got it                            @SC86299 06189000
         BCT   6,DSKVMDL                                       @SC86299 06190000
         SR    0,0           Hit December                      @SC86299 06191000
DSKVMDM  AR    7,0           Get day of month                  @SC86299 06192000
         LCR   6,6                                             @SC86299 06193000
         LA    6,12(6)       Get month                         @SC86299 06194000
         MH    6,=H'100'                                       @SC86299 06195000
         AR    6,7           Combine MMDD                      @SC86299 06196000
         MH    6,=H'10'                                        @SC86299 06197000
         CVD   6,TMPDW                                         @SC86299 06198000
         MVC   FDBDATE+2(2),TMPDW+5                            @SC86299 06199000
         MVI   FDBDATE,X'19' Assume 20th Cent                  @SC86295 06200000
         CLI   FDBDATE+1,X'50'                                 @SC86295 06201000
         BH    *+8           Ok                                @SC86295 06202000
         MVI   FDBDATE,X'20' Must be 21st                      @SC86295 06203000
         L     1,MFOPRM      Set file size in KBytes                    06204000
         ST    1,FDBSIZE                                                06205000
         SLR   1,1           Set record format character                06206000
         IC    1,MFORFM      Ignore 'Compressed' modes.                 06207000
         SLL   1,1                                                      06208000
         LA    0,RFMTAB                                                 06209000
         AR    1,0                                                      06210000
         MVC   FDBRCF,0(1)                                              06211000
         MVC   FDBLRC(2),MFORSIZ  Get logical record length             06212000
         NI    FDBFLGS,255-FWRITE Clear the write mode flag             06213000
         BR    14                                                       06214000
*                                                                       06215000
*        NXTFST Routine - searches through Save Library Index           06216000
*                                                                       06217000
DSKNXT   DS    0H                                              @SC89073 06218000
         TM    NXFLG,NFSOK        Was a search set up ???               06219000
         BZ    RTRN1                                                    06220000
         TM    NXFLG,NFERR+NFEND  Error or End of search ???            06221000
         BNZ   RTRN1                                                    06222000
*                                                                       06223000
         TM    NXFLG,NFWLD        Do we need to call MFINDX ?           06224000
         BO    DSKSRCH                                                  06225000
         OI    NXFLG,NFEND        End of search...                      06226000
         LA    1,NXFN             Source name was good. Use it!         06227000
DSKFND   MVC   MFNAME(5),SCODE  Rebuild the complete filename  @SC88308 06228000
         MVC   MFNAME+5(17),0(1)  info on the file.                     06229000
         MVC   FILNAM(LFID),MFNAME  Setup FILNAM !!!                    06230000
         B     DSKTST2                                                  06231000
*                                                                       06232000
DSKSRCH  CALL  MFINDX,(FCODE,LCFN,NXFLTYP,NXSVFLG,NXBKNUM,NXDIRLOC),VL,+06233000
               MF=(E,PARMAREA)                                          06234000
         C     15,F4              End of library search ?               06235000
         BNE   NXT20                                                    06236000
         OI    NXFLG,NFEND        Yes, end of search                    06237000
         B     RTRN1                                                    06238000
NXT20    LTR   15,15              Error in search ?                     06239000
         BZ    NXT30                                                    06240000
         OI    NXFLG,NFSERRS+NFERR Yes, error in search        @SC88308 06241000
         B     RTRN1                                                    06242000
NXT30    CLC   NXFLTYP,F0         Skip over common entries              06243000
         BNE   DSKSRCH                                                  06244000
         CLI   LCFN,C'.'          Skip over temporary files             06245000
         BE    DSKSRCH                                                  06246000
         CLC   FCODE(4),SCODE     Is this the right code ???            06247000
         BNE   DSKSRCH                                                  06248000
         CALL  MATCH,(LCFN,FM17,NXFN,NXFNL,ASTER,QUEST),VL,            +06249000
               MF=(E,PARMAREA)                                          06250000
         LTR   0,0                Well, did they match ???              06251000
         BZ    DSKSRCH                                                  06252000
         LA    1,LCFN             Point to name found and go            06253000
         B     DSKFND             copy it and set FDB                   06254000
*                                                                       06255000
* Directory Info on file R1->name, return R15=0 if OK                   06256000
DSKDIR   DS    0H                                              @SC89073 06257000
         NXTFSET E=DSKDRERR  Set up search (name at R1)        @SC88308 06258000
DSKDRLP  NXTF  E=DSKDRZ      Find next entry                   @SC88308 06259000
         OI    NXFLG,NFFND   Found something, at least one     @SC88308 06260000
         LA    1,CMD         Yes, build the filename with      @SC88308 06261000
         LR    2,1                the attributes we want in a           06262000
         LA    3,LFID        Length of name buffer             @SC88308 06263000
         LA    4,MFNAME                                        @SC88308 06264000
         LR    5,3                                             @SC88308 06265000
         CLC   0(4,4),$USRCDE   User's code?                   @SC88308 06266000
         BNE   *+12          No                                @SC88308 06267000
          A    4,F5          Yes, skip over it for output      @SC88308 06268000
          S    3,F5                                            @SC88308 06269000
         MVCL  2,4                                             @SC88308 06270000
         ICM   0,3,MFORSIZ                                              06271000
         BAL   9,DSKNUM           Add the logical record length         06272000
         MVC   0(2,2),BLNAME Leave some blanks                 @SC88308 06273000
         SLR   3,3                                                      06274000
         IC    3,MFORFM           Get record format                     06275000
         SLL   3,1                                                      06276000
         LA    3,RFMTAB(3)        Get address of printable value        06277000
         MVC   2(2,2),0(3)   Add to line                       @SC88308 06278000
         LA    2,4(2)        Bump the length                   @SC88308 06279000
         ICM   0,15,MFOPRM                                              06280000
         BAL   9,DSKNUM           Add the file size in Kbytes           06281000
         MVI   0(2),C'K'                                                06282000
         LA    2,1(2)                                                   06283000
         ICM   0,15,MFNLRC        Add the number of lines               06284000
         BAL   9,DSKNUM                                                 06285000
         MVC   0(6,2),=C' lines'                                        06286000
         LA    2,6(2)                                                   06287000
*                                                                       06288000
         SR    2,1                Get the output length                 06289000
         WTEXT (1),(2)                                                  06290000
         B     DSKDRLP                                         @SC88308 06291000
*                                                              @SC88308 06292000
DSKDRZ   TM    NXFLG,NFSERRS+NFERR                             @SC88308 06293000
         BNZ   DSKDRERR      Report error                      @SC88308 06294000
         TM    NXFLG,NFFND   Any files found?                  @SC88308 06295000
         BO    RTRN0         Yes, return gracefully            @SC88308 06296000
DSKDRERR PTEXT 'Not found'                                     @SC88308 06297000
         B     SUBERR                                          @SC88308 06298000
*                                                                       06299000
DSKNUM   CVD   0,TMPDW            Pack the binary value                 06300000
         OI    TMPDW+7,15         Set zone                              06301000
         UNPK  0(8,2),TMPDW       Convert to printable                  06302000
         LA    5,7(2)             Point to end of string                06303000
DSKNUM2  CLI   0(2),C'0'          Remove leading zeros                  06304000
         BNE   DSKNUM3            except for the first one.             06305000
         MVI   0(2),C' '                                                06306000
         LA    2,1(2)                                                   06307000
         CR    2,5                                                      06308000
         BL    DSKNUM2                                                  06309000
DSKNUM3  LA    2,1(5)             Get the new ending address            06310000
         BR    9                                                        06311000
*                                                                       06312000
*  Check for privs to open filename                                     06313000
*  R3->FAB,  R9->returns                                       @SC88308 06314000
DSKCHKNM TM    UPRIVS,FILES+LSCAN If FILES, never any problems          06315000
         BNZ   4(9)                                                     06316000
         CLC   MFUIFC(4),$USRCDE  If our own code, then no problem      06317000
         BE    4(9)                                                     06318000
         TM    MFOACNB,X'A0'      Allowed to read file ???              06319000
         BZ    4(9)                                                     06320000
         MVI   FABRC,21           Not your library error.               06321000
         CLI   ZLU,0              Is the file still open ?              06322000
         BER   9                                                        06323000
         MFSET DSKST,CLOSE        Yes, close it normally...             06324000
         MFREQ DSKST                                                    06325000
         BR    9                  Error return                          06326000
*                                                                       06327000
RFMTAB   DC    C'U F FCV VC'      Record Format Table                   06328000
DSKMTAB  DC    CL16'File deleted'                                       06329000
         DC    CL16'File renamed'                                       06330000
         DC    CL16'File copied'                                        06331000
         LOCALS ,                                                       06332000
DS1CRDT  DS    XL1,XL2       Creation date AL1(yr),AL2(day)    @SC86299 06333000
DSKMNTH  DS    XL11          Month length table                @SC86299 06334000
DSKCOD   DS    X             Saved DISKIO code                 @SC88308 06335000
         DROP  R3                                                       06336000
         EXIT                                                           06337000
         EJECT                                                          06338000
