OSTAPE   TITLE '...OS tape to CMS disk utility'
         MACRO
&NAME    $TXT  &MSG,&MSG2
         LCLC  &A,&B
&A       SETC  '&NAME'.'L'
&B       SETC  '*-'.'&NAME'.'-01'
&NAME    DC    AL1(&A)
         DC    C&MSG
&A        EQU   (&B)
         MEND
         SPACE 01
         MACRO
&NAME    $MSG  &MSG
         LCLC  &A
         AIF   ('&MSG' EQ '').BP00
&A       SETC  '&MSG'.'-'.'&SYSECT'
&NAME    LA    R15,&MSG                  ==> MESSAGE
.BP00    ANOP
         BAL   R14,LINEDIT             ISSUE MESSAGE
         MEND
         SPACE 01
         MACRO
&NAME    $CP   &MSG
         LCLC  &A
         AIF   ('&MSG' EQ '').BP00
&A       SETC  '&MSG'.'-'.'&SYSECT'
&NAME    LA    R15,&MSG                  ==> CP COMMAND
.BP00    ANOP
         BAL   R14,DIAG08              ISSUE CP COMMAND
         MEND
         SPACE 01
         MACRO
&NAME    $CMS  &MSG
         LCLC  &A
         AIF   ('&MSG' EQ '').BP00
&A       SETC  '&MSG'.'-'.'&SYSECT'
&NAME    LA    R1,&MSG                   ==> CMS COMMAND
.BP00    ANOP
         BAL   R14,SVC202                CALL CMS COMMAND
         MEND
         EJECT
*****
**         Columbia University Center for Computer Activities
**
**                          OSTAPE
**
**              Written by Eric M Bitterman on 10/31/84
**
**  This program will read thru an OS formatted tape and copy the
**  files on it to a CMS disk, based on the name in the HDR rec.
**
**  To copy this program from tape to a CMS disk, issue the following
**  commands:
**       TAPE REW
**       TAPE FSF
**       FILEDEF  INMOVE TAP1 (RECFM VB LRECL 13000 BLOCK 13000)
**       FILEDEF OUTMOVE DISK OSTAPE ASSEMBLE A (RECFM V LRECL 100)
**       MOVEFILE
**       COPYFILE OSTAPE ASSEMBLE A (RECFM F LRECL 80)
**
**  To generate this program just enter the following CMS commands:
**       ASSEMBLE OSTAPE
**       LOAD OSTAPE
**       GENMOD OSTAPE
**       NUCXLOAD OSTAPE
**
**  To install the files, the installation tape must be attached
**  as 181 and then just enter:  OSTAPE and away it goes.
**
**  The format of this command is:
**       OSTAPE    COPYALL              ( a b d y z )
**                 DUMP fn ft fm        ( a b d y )
**                 DVOL1                ( d e )
**                 GENEXEC fn ft fm     ( a b d )
**                 LOAD fn ft fm        ( b c d )
**                 MODESET              ( d )
**                 SCAN fn ft           ( b c d )
**                 tapcmd nn            ( d )
**                 WVOL1 volser owner   ( d e )
**
**  tapcmd    = BSR BSF ERG FSR FSF REW RUN WTM
**  nn        = number of times this function is to be issued
**  fn/ft/fm  = CMS filename, type and mode
**
**  Options
**  -------
**  a        WTM | NOWTM  BLKSIZE  {4096 | 800}
**  b        PRINT | NOPRINT  TERM  DISK
**  c        EOT  EOF nn
**  d        TAPn  DEN  density  cuu
**  e        REWIND  LEAVE
**  y        APPEND
**  z        INPUT  cuu  OUTPUT  cuu
**
*****
         EJECT
OSTAPE   CSECT
         USING OSTAPE,R12
         B     12(,R15)                SKIP AROUND LITERAL
         DC    CL8'OSTAPE'
         STM   R14,R12,12(R13)         SAVE ENTRY REGISTERS
         LA    R12,00(,R15)            FIX BASE REGISTER
         LA    R14,WORK                ==> OUR SAVE AREA
         USING WORK,R13
         ST    R13,04(,R14)            .....CHAIN BACKWARD
         ST    R14,08(,R13)            .....CHAIN FORWARD
         LR    R13,R14                 ==> OUR SAVE AREA
*****
**  Check for any options.
*****
CHK4OPT  DS   0H
         CLI   08(R1),X'FF'            ARE THERE ANY?
         BE    NOFUNC                  ..... No,  then load to disk
         LA    R15,TAPLIST-10          ==> LIST OF VALID FUNCTIONS
CHK4OPT1 DS   0H
         LA    R15,10(,R15)            BUMP TO NEXT ENTRY
         CLI   00(R15),X'FF'           END OF LIST?
         BE    BADFUNC                 .....YES,  THEN ERROR
         CLC   08(08,R1),00(R15)       MATCH?
         BNE   CHK4OPT1                ..... NO,  THEN CONTINUE
         LH    R15,08(,R15)            GET DISPL TO PROCESS RTN
         B     00(R15,R12)             GO PROCESS OPTION
$FUNC    DS   0H
         MVC   TAPECTL1,08(R1)         MOVE IN THE FUNCTION
         BAL   R14,TAPECOM             ISSUE TAPE COMMAND
         BNZ   BADTAPE                 ....., NG,  THEN ERROR$TXT
         B     RETURN                  DONE
         EJECT
$DUMP    DS   0H
$COPY    DS   0H
$DVOL    DS   0H
$GENX    DS   0H
$LOAD    DS   0H
$MODE    DS   0H
$SCAN    DS   0H
$WVOL    DS   0H
         $MSG  MSG999W                 WARN USER
         LA    R15,04                  SET RETURN CODE
         B     RETURN                  DONE
NOFUNC   DS   0H
*****
**  Rewind the tape to its loadpoint.
*****
         BAL   R14,TAPEREW             REWIND TAPE
         BNZ   BADTAPE                 ..... NG,  THEN ERROR MESSAGE
*****
**  Read thru the file looking for HDR1 records, extract the CMS
**  filename and then FSF the tape.
*****
READ     DS   0H
         BAL   R14,RDTAPE              READ NEXT TAPE RECORD
         BZ    NOTEOF                  .... OK,  SKIP
         CH    R15,=H'02'              WAS IT END OF TAPE?
         BNE   BADTAPE                 ..... NO,  THEN TAPE ERROR
         CLI   EOF,X'FF'               WAS LAST OPERATION EOF?
         BE    BADTAPE                 .....YES,  THEN DONE
         MVI   EOF,X'FF'               SET EOF FLAG
         B     READ
         EJECT
NOTEOF   DS   0H
         MVI   EOF,X'00'               INIT TO ZERO
         CLC   =C'HDR1',BUFFER
         BNE   READ                    ..... NO,  THEN CONTINUE
*****
**  This is the HDR1 now extract the CMS filename.
*****
         LA    R0,17                   MAX LENGTH TO SCAN
         LA    R1,BUFFER+04            ==> BEGIN OF FILEID
         LR    R2,R1                   .....AND HERE TOO
         LA    R3,FN                   ==> WHERE TO STASH VALUE
         LA    R4,02                   SET NUMBER OF FIELDS TO FIND
GETVAL   DS   0H
         MVC   00(08,R3),SPACE         INIT FIELD TO BLANKS
GETVAL1  DS   0H
         CLI   00(R1),C'.'             FOUND?
         BE    GETVAL2                 .....YES,  THEN SKIP
         CLI   00(R1),C' '             FOUND?
         BE    GETVAL2                 .....YES,  THEN SKIP
         LA    R1,01(,R1)              BUMP TO NEXT CHARACTER
         BCT   R0,GETVAL1              CONTINUE
GETVAL2  DS   0H
         LR    R15,R1                  COPY OVER
         SR    R15,R2                  CALC LENGTH OF DATA
         BCTR  R15,R0                  .....AND SET RELATIVE TO ZERO
         C     R15,=F'07'              IS FIELD LENGTH OK?
         BNH   *+08                    .....YES,  THEN SKIP
         L     R15,=F'07'              OTHERWISE SET TO MAX LENGTH
         LTR   R15,R15                 CHECK TO SEE THIS IS VALID
         BM    GETVAL3                 .... NG,  ITS < 00
         MVC   00(*-*,R3),00(R2)       *** EXECUTED INSTRUCTION ***
         EX    R15,*-06                MOVE IN VALUE
         B     GETVAL4
GETVAL3  DS   0H
         MVC   00(08,R3),=CL8'EMB'
GETVAL4  DS   0H
         LA    R1,01(,R1)              BUMP PAST THE DELIMETER
         LR    R2,R1                   .....AND COPY HERE
         LA    R3,08(,R3)              BUMP TO NEXT RESULT FIELD
         BCT   R4,GETVAL               CONTINUE
*****
**  Issue message giving name of this CMS file.
*****
         MVC   S1(08),FN               MOVE IN THE FILENAME
         MVC   S2(08),FT               .....FILETYPE
         MVC   S3(02),FM               .....AND THE FILEMODE
         $MSG  MSG101I                 ISSUE MESSAGE
         EJECT
*****
**  Read in the HDR2 record and extract the LRECL and BLKSIZE.
*****
         BAL   R14,RDTAPE              READ NEXT TAPE RECORD
         MVC   INLRECL(05),BUFFER+10   MOVE IN THE LRECL
         MVC   OUTLRECL(05),BUFFER+10  .....AND HERE TOO
         MVC   INBLOCK(05),BUFFER+05   MOVE IN THE BLOCKSIZE
*****
**  Now skip over any extra HDRx type records.
*****
         BAL   R14,TAPEFSF             FSF
*****
**  Issue the FILEDEF and MOVEFILE commands inorder to copy the
**  program on the tape over to a CMS disk.
*****
         $CMS  FINIS                   CLOSE ALL FILES
         $CMS  INMOVE                  DEFINE MOVEFILE INPUT
         $CMS  OUTMOVE                 DEFINE MOVEFILE OUTPUT
         $CMS  MOVEFILE                COPY DATA
         BNZ   NGMOVE
*****
**  Skip over the EOF file.
*****
         BAL   R14,TAPEFSF
         B     READ                    GET NEXT FILE
         EJECT
RDTAPE   DS   0H
         MVC   TAPECTL1,KREAD          SETUP TO DO READ
         LA    R1,BUFFER               ==> TAPE BUFFER
         STCM  R1,B'0111',TAPECTL4     .....AND SAVE BUFFER ADDR
         LA    R1,80                   GET BUFFER LENGTH
         ST    R1,TAPECTL5             .....AND SAVE IN PLIST
         ST    R14,SAVR14              SAVE RETURN ADDRESS
         BAL   R14,TAPECOM             ISSUE TAPEIO REQUEST
         L     R14,SAVR14              RESTORE RETUN ADDRESS
         L     R0,TAPECTL6             GET LENGTH OF DATA READ
         LTR   R15,R15                 SET CONDITION CODE
         BR    R14                     RETURN
NGMOVE   DS   0H
         LR    R2,R15                  SAVE RETURN CODE
         $MSG  MSG102E
         LR    R15,R2                  RESTORE RETURN CODE
         B     RETURN                  DONE
BADFUNC  DS   0H
         $MSG  MSG998E                 ISSUE ERROR MESSAGE
         LA    R15,04                  SET BAD RETURN CODE
         B     RETURN                  DONE
BADTAPE  DS   0H
         LR    R2,R15                  COPY RETURN CODE HERE
         SLL   R15,01                  MULTIPLY BY TWO
         LA    R15,TPERRS-02(R15)      ==> MESSAGE DISPLACEMENT
         LH    R15,00(,R15)            GET MESSAGE DISPLACEMENT
         AR    R15,R12                 ==>MESSAGE TEXT
         $MSG  ,
         LR    R15,R2                  RESTORE RETURN CODE
RETURN   DS   0H
         L     R13,04(,R13)            ==> PREV SAVE AREA
         L     R14,12(,R13)            RESTORE RETURN ADDRESS
         LM    R0,R12,20(R13)          .....AND THESE TOO
         BR    R14                     ALL DONE
TAPEFSF  DS   0H
         MVC   TAPECTL1,KFSF           FORWARD SPACE THE TAPE
         B     TAPECOM
TAPEREW  DS   0H
         MVC   TAPECTL1,KREW           REWIND TAPE TO LOAD POINT
TAPECOM  DS   0H
         LA    R1,TAPECTL              ==> TAPE PLIST
SVC202   DS   0H
         NOPR  R14
         SVC   202
         DC    AL4(01)
         LTR   R15,R15
         BR    R14
         EJECT
LINEDIT  DS   0H
       LINEDIT TEXTA=(R15),RENT=NO,DOT=NO,COMP=NO,DISP=ERRMSG,         X
               SUB=(CHARA,S1,CHARA,S2,CHARA,S3),                       X
               MF=(E,EDWORK)
         MVC   S1(SUBLEN),S1-01        SET TO BLANKS
         BR    R14                     RETURN
         EJECT
         LTORG
WORK     DC   9D'00'
SAVR14   DC    F'00'                   SAVE REGISTER R14 HERE
BUFFER   DC    CL80' '                 TAPE BUFFER
SPACE    DC    CL8' '
EOF      DC    X'00'
INMOVE   DS   0D
         DC    CL8'FILEDEF'
         DC    CL8'INMOVE'
         DC    CL8'TAP1'
         DC    CL8'('
         DC    CL8'RECFM'
         DC    CL8'VB'
         DC    CL8'LRECL'
INLRECL  DC    CL8'200'
         DC    CL8'BLOCK'
INBLOCK  DC    CL8'4000'
         DC   8X'FF'
OUTMOVE  DS   0D
         DC    CL8'FILEDEF'
         DC    CL8'OUTMOVE'
         DC    CL8'DISK'
FN       DC    CL8'        '
FT       DC    CL8'        '
FM       DC    CL8'A1      '
         DC    CL8'('
         DC    CL8'RECFM'
         DC    CL8'VB'
         DC    CL8'LRECL'
OUTLRECL DC    CL8'300'
         DC   8X'FF'
FINIS    DS   0D
         DC    CL8'FINIS'
         DC    CL8'*'
         DC    CL8'*'
         DC    CL8'*'
         DC   8X'FF'
MOVEFILE DS   0D
         DC    CL8'MOVEFILE'
         DC   8X'FF'
         EJECT
*****
**  TAPEIO plist.
*****
TAPECTL  DS   0D
         DC    CL8'TAPEIO'
TAPECTL1 DC    CL8'FSF'                FUNCTION
TAPECTL2 DC    CL4'0181'               DEVICE ADDRESS
TAPECTL3 DC    BL1'0'                  MODE
TAPECTL4 DC    AL3(00)                 BUFFER ADDRESS
TAPECTL5 DC    F'00'                   BUFFER LENGTH
TAPECTL6 DC    F'00'                   NUMBE OF BYTES READ
         DC   8X'FF'
TAPLIST  DS   0D
*****
**  Standalone functions.
*****
KREW     DC    CL8'REW     ',AL2($FUNC-OSTAPE)
         DC    CL8'RUN     ',AL2($FUNC-OSTAPE)
         DC    CL8'ERG     ',AL2($FUNC-OSTAPE)
         DC    CL8'BSR     ',AL2($FUNC-OSTAPE)
         DC    CL8'BSF     ',AL2($FUNC-OSTAPE)
         DC    CL8'FSR     ',AL2($FUNC-OSTAPE)
KFSF     DC    CL8'FSF     ',AL2($FUNC-OSTAPE)
         DC    CL8'WTM     ',AL2($FUNC-OSTAPE)
*****
**  Hi level functions.
*****
         DC    CL8'DUMP    ',AL2($DUMP-OSTAPE)
         DC    CL8'COPYALL ',AL2($COPY-OSTAPE)
         DC    CL8'DVOL1   ',AL2($DVOL-OSTAPE)
         DC    CL8'GENEXEC ',AL2($GENX-OSTAPE)
         DC    CL8'LOAD    ',AL2($LOAD-OSTAPE)
         DC    CL8'MODESET ',AL2($MODE-OSTAPE)
         DC    CL8'SCAN    ',AL2($SCAN-OSTAPE)
         DC    CL8'WVOL1   ',AL2($WVOL-OSTAPE)
         DC   2X'FF'
KREAD    DC    CL8'READ'
TPERRS   DS   0H
         DC    AL2(MSG204I-OSTAPE)    RC=01
         DC    AL2(MSG205I-OSTAPE)    RC=02
         DC    AL2(MSG206I-OSTAPE)    RC=03
         DC    AL2(MSG207I-OSTAPE)    RC=04
         DC    AL2(MSG208I-OSTAPE)    RC=05
         DC    AL2(MSG209I-OSTAPE)    RC=06
         DC    AL2(00)                Place holder
         DC    AL2(MSG210I-OSTAPE)    RC=08
         EJECT
         DC    C' '
S1       DC    CL8' '
S2       DC    CL8' '
S3       DC    CL8' '
SUBLEN    EQU   (*-S1)
EDWORK LINEDIT MF=L,MAXSUBS=03
MSG101I  $TXT  '........ ........ ..'
MSG102E  $TXT  'MOVEFILE terminated with a non-zero return code'
MSG204I  $TXT  'Invalid function or parameter list'
MSG205I  $TXT  'END-OF-FILE or END-OF-TAPE encountered'
MSG206I  $TXT  'Permanent I/O error'
MSG207I  $TXT  'Illegal device id specified'
MSG208I  $TXT  'Tape not attached'
MSG209I  $TXT  'Tape is file protected'
MSG210I  $TXT  'Incorrect length'
MSG998E  $TXT  'Invalid or omitted OSTAPE function'
MSG999W  $TXT  'Function not implemented'
         PRINT NOGEN
        REGEQU ,
         END
