/FILE 1 N(TEMP.ARC) NEW(REPL) SP(1200) SECSP(100%) DEF /FILE SYSLIB PDS($MCM:*.M) /LOAD ASM * VOL2FILE: COPY A BINARY PC FILE TO A MUSIC/SP FILE (UNIT 1). * THE PC FILE IS DEFINED AS AN FBA VOLUME FILE, ON DEVICE 305, * IN THE SIM390 OR HERCULES CONFIG FILE. THE FILE IS ASSUMED * TO BE 80-BYTE RECORDS, E.G. AN ARCHIVE FILE. * A RECORD STARTING *MFAEND IS TREATED AS A SOFT END-OF-FILE. * EXAMPLE CONFIG RECORDS: * VOL DEFINITION IN SIM390: IODEVICE DISKF512 305 C:\TEMP1\MUSFIL.BIN * VOL DEFINITION IN HERCULES: 305 3370 C:\TEMP1\MUSFIL.BIN * WARNING: IF THE PC FILE IS NOT AN EXACT MULTIPLE OF 512 BYTES, * THE DATA IN THE FINAL INCOMPLETE BLOCK IS NOT READ OR COPIED. * NO ERROR MSGS ARE ISSUED - USE RC COMMAND TO CHECK JOB RETURN CODE. * JOB RETURN CODE (BITS): X'01' DEVICE UCB NOT FOUND. * X'02' ERROR WRITING TO OUTPUT FILE. * X'04' READ I/O ERROR ON VOL FILE. * CHANGE LOG: * 29SEP2005 - WRITTEN BY DAVE EDWARDS VOL2FILE CSECT PRINT NOGEN REGS MUSVC PRINT GEN DEVADDR EQU X'305' VOLUME DEVICE ADDR $SYSUCB EQU X'2CC' LOW MEMORY ADDR $UCBLN EQU X'312' LOW MEMORY ADDR USING *,R12 LR R12,R15 SET UP BASE REG LR R11,R14 SAVE RETURN ADDR * FIND DEV ADDR IN UCB TABLE, TO GET UCB NUMBER SR R0,R0 IC R0,$SYSUCB # OF UCB'S L R2,$SYSUCB ADDR OF FIRST UCB LH R3,$UCBLN LEN OF EACH UCB SR R4,R4 INIT. UCB # LOOP1 CLC 0(2,R2),=AL2(DEVADDR) IS IT OUR DEVICE? BE B1 YES, R4 = UCB NUMBER AR R2,R3 ADVANCE TO NEXT UCB LA R4,1(0,R4) BCT R0,LOOP1 B ERRNOUCB ERROR: UCB NOT FOUND * INIT. FOR I/O B1 STC R4,DSKREQ+15 STORE UCB # SR R2,R2 NEXT 512-BYTE BLOCK # = 0 LA R3,BLKBUF ADDR OF BUFFER FOR 512-BYTE BLOCK LR R4,R3 ADDR OF END OF DATA IN BLKBUF (R3 * TO R3+512) LR R5,R3 ADDR OF END OF PROCESSED DATA IN * BLKBUF (R3 TO R4) * LOOP: GET NEXT LOGICAL RECORD LOOP2 MVI RECBUF,C' ' INIT LOGICAL REC TO BLANKS, MVC RECBUF+1(L'RECBUF-1),RECBUF IN CASE SHORT REC AT END SR R6,R6 INIT # OF BYTES GOT SO FAR IN RECBUF LOOP3 CR R5,R4 ANY DATA LEFT IN BLKBUF? BL B2 YES, BRANCH BAL R14,NEXTBLK NO, READ NEXT BLOCK B2 LA R1,L'RECBUF SR R1,R6 # OF BYTES STILL TO GET IN RECBUF LR R0,R4 SR R0,R5 # OF BYTES AVAILABLE IN BLKBUF CR R1,R0 GET R1=MIN(R1,R0) (IS >0) BNH B3 LR R1,R0 B3 BCTR R1,0 GET LEN-1 FOR EX LA R14,RECBUF(R6) DESTINATION ADDR EX R1,MVC1 MOVE TO R14 FROM R5 LA R1,1(0,R1) GET BACK THE LEN AR R6,R1 UPDATE THE POINTERS AR R5,R1 C R6,=A(L'SOFTEOF) DO WE HAVE ENOUGH TO CHECK FOR EOF? BL B4 NO, BRANCH CLC SOFTEOF,RECBUF IS IT SOFT EOF RECORD BE B5 YES, WRITE IT OUT AND STOP B4 C R6,=A(L'RECBUF) DO WE HAVE A WHOLE LOGICAL REC? BL LOOP3 LOOP BACK IF NOT * PROCESS THE LOGICAL RECORD WE GOT B5 BAL R14,PUTREC WRITE IT TO OUTPUT FILE CLC SOFTEOF,RECBUF IS IT SOFT EOF RECORD? BE ENDALL YES, BRANCH B LOOP2 NO, LOOP BACK TO GET NEXT RECORD MVC1 MVC 0(0,R14),0(R5) (EXECUTED) * BLOCK READ GOT AN ERROR. LAST LOGICAL REC IS IN RECBUF, LENGTH = * R6 (MAY BE 0, MAY BE LESS THAN L'RECBUF). RDFAIL OI RETCODE+3,X'04' INDICATE READ I/O ERROR LTR R6,R6 IS THERE A LOGICAL RECORD? BNP FINISH NO BAL R14,PUTREC YES, PUT IT OUT (MAY BE SHORT REC) * END OF INPUT ENDALL DS 0H FINISH L R15,RETCODE EXIT, SETTING JOB RETURN CODE BR R11 * NEXTBLK: ROUTINE TO READ NEXT 512-BYTE BLOCK. * RETURN TO R14 IF OK. GO TO RDFAIL IF ERROR. NEXTBLK XC DSKREQ(4),DSKREQ SET UP DISK I/O REQUEST BLOCK ST R3,DSKREQ+4 BUFFER ADDR MVI DSKREQ+4,X'08' FLAG BYTE: I/O COMPLETE MVC DSKREQ+8(2),=AL2(512) LENGTH STCM R2,B'1111',DSKREQ+10 FBA BLOCK # (FIRST=0) MVI DSKREQ+14,X'FB' SPECIAL REC# FOR FBA STM R0,R15,SAVER SAVE REGS LA R14,DSKREQ NOTE: THE SVC CHANGES R14 L R5,=X'92653589' SVC $UDIOEX DO THE READ TM 4(R14),X'10'+X'02' TEST FOR EOF OR ERROR BNZ NXTB1 BRANCH IF SO LM R0,R15,SAVER RESTORE REGS A R2,=F'1' ADD 1 TO BLOCK # LA R4,512(0,R3) SET POINTERS IN BUFFER LR R5,R3 BR R14 RETURN NXTB1 LM R0,R15,SAVER RESTORE REGS B RDFAIL TAKE ERROR RETURN * PUTREC: ROUTINE TO WRITE LOGICAL RECORD TO OUTPUT FILE (UNIT 1). * IT CHANGES R1. RETURN TO R14 IF OK. GO TO ERRIOOUT IF ERROR. PUTREC MFREQ OUTREQ DO IT CLI MFIORC,0 BNE ERRIOOUT BRANCH IF ERROR BR R14 RETURN * ERRORS ERRNOUCB OI RETCODE+3,X'01' UCB NOT FOUND, OR UCB IS INVALID B FINISH ERRIOOUT OI RETCODE+3,X'02' ERROR WRITING TO OUTPUT FILE B FINISH * DATA AREAS RETCODE DC F'0' JOB RETURN CODE SAVER DS 16F FOR SAVING R0 THRU R15 DSKREQ DS 4F DISK I/O REQUEST BLOCK (READ 1 BLK) OUTREQ MFARG IO,(WR,LU),U=1,RLAB=MFIORC,ARG=RECARG MFGEN RECARG DC A(0,L'RECBUF,RECBUF) 0, LENGTH, BUFFER ADDR RECBUF DS CL80 LOGICAL RECORD BUFFER BLKBUF DS CL512 BUFFER FOR 512-BYTE BLOCK SOFTEOF DC C'*MFAEND ' ARCHIVE END RECORD (SOFT END-OF-FILE) LTORG END