C PROGRAM MAGAUX.FT C -------------- C C C C C P.LEMKIN C NATIONAL INSTUTUTES OF HEALTH C BETHESDA, MD 20014 C C C AUG 16, 1976 C AUG 13, 1976 C AUG 12, 1976 C AUG 11, 1976 C AUG 10, 1976 - MOVED PARAMS TO FRONT C August 8, 1976 C AUGUST 4, 1976 C AUGUST 2, 1976 C JULY 31, 1976 - LEMKIN MAG10 AUXILLARY ROUTINES. C C PURPOSE C -------- C AUXILLARY ROUTINES PACK, UNPACK, WTHEADER, RDHEADER C MSEARCH, RDFILE, WTFILE. C FOR MAG10. C C COMPILE AS: C ----------- C .COMP MAGAUX.RL < MAGCMN.FT,MAGAUX.FT C C C C C C *************************** P A R A M E T E R S ********* S DUMMY OS8DATE S CPAGE 2 S OS8DATE, 6211 S 7666 S DUMMY MAGBUFFER S CPAGE 2 S MAGBUFFER, 6271 / CDF 70 S 0 C S DUMMY DSKBUFFER S CPAGE 2 S DSKBUFFER, 6261 /CDF 60 S 0 C ************************************************* C * SUBROUTINE P A C K C ************************************************* C PACK 3/2 MAGBUFFER ==> DSKBUFFER S ENTRY PACK S CPAGE 2 S PACK, BLOCK 2 C C [1] 3/2 PACK (I.E. 3 BYTES INTO 2 PDP8E WORDS) 3456 BYTES C INTO 9 BLOCKS. NOTE 9 OS8 BLOCKS=256X9=2304 PDP8E WORDS C OR (3/2)*2304=3456 BYTES = 768 PDP10 WORDS OR C 1152 3-BYTE TRIPLES. C C C [1.1] SETUP AUTO INDEX REG 15 IS MAG, 16 IS DSK. S CLA CMA S DCA 15 S CLA CMA S DCA 16 S TAD (-D1152 /FAST COUNTER S DCA 7 C C C [2] LOOP AND CVT S CPAGE 15 S PK2, 6271 /CDF 70 TO MAGBUFFER S TADI 15 /B1 S AND (377 /STRIP OFF PARITY BIT S DCA 20 S TADI 15 /B2 S AND (377 /STRIP OFF PARITY BIT S DCA 21 S TADI 15 S DCA 22 /B3 C C [2.1] NOW PACK INTO 2 WORDS S TAD 22 /GET B3[4:7] S RTR; RTR; RAR /MOVE BITES 8:11 AC, TO 0:3 S AND (7400 /0:3 BITS S TAD 21 /B2 S MQL /B3[4:7]&B2 S TAD 22 /GET B3[0:3] S RTL; RTL /MOVE AC 4:7 TO 0:3 S AND (7400 S TAD 20 /B1 C C(AC)=B3[0:3]&B1. C C C [2.2] PUSH 2 WORDS INTO DSKBUFFER S CPAGE 11 S 6261 /CDF 60 TO DSKBUFFER S DCAI 16 S MQA S DCAI 16 S JMS 45 S CLA S ISZ 7 /TEST IF DONE S JMP PK2 /NO, CONTINUE C C [3] RETURN S CPAGE 3 S JMS 45 S CLA S RETRN PACK /RETURN C ************************************************* C * SUBROUTINE U N P A C K C ************************************************* C UNPACK 1/3 DSKBUFFER ==> MAGBUFFER S ENTRY UNPAC S CPAGE 2 S UNPAC, BLOCK 2 C C [1] 1/3 UNPACK (I.E. 3-BYTES FROM 2-PDP8E WORDS) C FOR 3456 BYTES FROM 9 BLOCKS. 3456 BYTES/3=1152. C C C [1.1] SETUP PTRS COUNTER C AUTOINDEX 15= MAG, 16 = DSK S CLA CMA S DCA 15 S CLA CMA S DCA 16 S TAD (-D1152 S DCA 7 /COUNTER C C C [2] LOOP AND CVT S CPAGE 5 S UPK2, 6261 /CDF 60 DSKBUFFER S TADI 16 /1ST WORD, B3[0:3]&B1 S DCA 20 S TADI 16 /2ND WORD, B3[4:7]&B2 S DCA 21 C C [2.1] UNPACK AND STORE S CPAGE 33 S 6271 /CDF 70, MAGBUFFER S TAD 20 S AND (0377 /B1 S DCAI 15 S TAD 21 S AND (0377 /B2 S DCAI 15 S TAD 20 /GET B3[0:3] S RTR; RTR S AND (0360 /TO 4:7 S MQL S TAD 21 /GET B3[4:7] S RTL; RTL; RAL S AND (0017 /TO 8:11 S MQA S DCAI 15 /PUSH B3 S ISZ 7 S JMP UPK2 /NO C C [3] YES, RETURN S CPAGE 3 S JMS 45 S CLA S RETRN UNPAC /RETURN C ************************************************* C * SUBROUTINE W T H E A D E R C ************************************************* C WRITE THE MAGTAPE HEADER CONSISTING OF THE 4 TUPLE: C KINFILE(1:3) - FILE NAME (6 BYTES) C KINFILE(4) - FILE EXTENSION (2 BYTES) C IBLKCNT - FILE LENGTH IN OS/8 BLOCKS (2 BYTES HI,LOW) C IDATE - OS/8 DATE WORD ( 3 BYTES), (YR, MONTH, DAY) S ENTRY WTHEA S CPAGE 2 S WTHEA, BLOCK 2 C C C [1] CVT 6 BIT TO 8 BIT K=0 DO 200 I=1,4 J=KINFILE(I) S TAD \J S RTR; RTR; RTR S AND (0077 S TAD (-40 S SPA /IF A:Z THEN < 0 SO ADD 300 INSTEAD OF 200 S TAD (100 /A:Z S TAD (240 S DCA \J1 S TAD \J /GET THE 2ND 1/2 S AND (0077 S TAD (-40 S SPA S TAD (100 S TAD (240 S DCA \J2 K=K+1 IBUF(K)=J1 K=K+1 200 IBUF(K)=J2 C [2] PUSH THE BLOCK COUNT S TAD \IBLKCNT S RTR;RTR;RTR;RTR S AND (17 /TOP 4 BITS S DCA \J1 S TAD \IBLKCNT S AND (377 S DCA \J2 K=K+1 IBUF(K)=J1 K=K+1 IBUF(K)=J2 C C C [3] PUSH THE OS/8 DATE WORD S TAD I OS8DATE /GET YEAR S AND (7 /YEAR S DCA \KYEAR K=K+1 IBUF(K)=KYEAR C S TAD I OS8DATE /GET MONTH S CLL RAL; RTL; RTL S AND (17 /MONTH S DCA \KMONTH K=K+1 IBUF(K)=KMONTH C S TAD I OS8DATE /GET DAY S CLL RAR; RTR S AND (37 /DAY S DCA \KDAY K=K+1 IBUF(K)=KDAY C C C C C [4] WRITE OUT THE RECORD OF 3456 BYTES, FROM IBUF BUFFER C BYTE MODE C IBYTE=0 C INIT PARITY SWITCH IPARITY=-10 C C TEST FOR >10 TRYS S \240, ISZ \IPARITY S JMP \245/ OK C C FATAL PARITY ERROR WRITE(1,242)(KINFILE(I),I=1,4) 242 FORMAT('PARITY ERROR WRITING HEADER. FILE: ',3A2,'.',A2) C FATAL ERROR CALL REMAG10 C 245 CALL MAGTAP(MWDCT,IBUF,4,MTRS,IBYTE,JUNIT) C C C [4.1] TEST FOR EOT AND PARITY ERROR S TAD \MTRS /EOT? S AND (0040 S SZA CLA S JMP \250 /FATAL EOT C S TAD \MTRS /PARITY? S AND (1616 S SNA CLA S JMP \299 /OK C C C [4.2] BACKSPACE AND TRY AGAIN CALL MAGTAP(1,0,7,MTRS,IBYTE,JUNIT) GOTO 240 C C C C C [4.3] FATAL EOT FOUND 250 WRITE(1,251)(KINFILE(I),I=1,4) 251 FORMAT(' EOT FOUND WRITING HEADER, FILE: ',3A2,'.',A2) CALL REMAG10 C C [5] RETURN S \299, RETRN WTHEA /RETURN C C ************************************************* C * SUBROUTINE R D H E A D E R C ************************************************* C READ THE MAGTAPE HEADER CONSISTING OF THE 4 TUPLE: C JFILE(1:3) - FILE NAME (6 BYTES) C JFILE(4) - FILE EXTENSION (2 BYTES) C JBLKCNT - FILE LENGTH IN OS/8 BLOCKS (2 BYTES HI,LOW) C IDATE - OS/8 DATE WORD ( 1 BYTE) S ENTRY RDHEA S CPAGE 2 S RDHEA, BLOCK 2 C C C [1] READ IN THE RECORD OF 3456 BYTES, FROM MAGBUFFER C BYTE MODE C C IPARITY=-10 C C TEST FOR PARITY OVERFLOW S \302, ISZ \IPARITY S JMP \310 /CONTINUE C WRITE(1,306) 306 FORMAT('PARITY ERROR ON READING HEADER') C FATAL EXIT CALL REMAG10 C 310 IBYTE=0 C COPY BUFFER POINTER S TAD MAGBUFFER S DCA AM1 S TAD MAGBUFFER# S DCA AM1# C S CPAGE 16 S CALL 6,MAGTA S ARG \MWDCT S AM1, ARG MAGBUFFER S ARG (2 /READ S ARG \MTRS S ARG \IBYTE S ARG \IUNIT C C RETURN IMMEDIATELY IF EOF S TAD \MTRS S AND (0100 S SNA CLA S JMP \311 /OK S RETRN RDHEA C C C [1.1] TEST FOR EOT AND PARITY ERRORS S \311, TAD \MTRS S AND (0040 /EOT? S SZA CLA S JMP \320 /FATAL EOT C S TAD \MTRS / PARITY? S AND (1616 S SNA CLA S JMP \301 /OK C CALL MAGTAP(1,0,7,MTRS,IBYTE,IUNIT) GOTO 302 C C C [1.2] FATAL EOT ERROR 320 WRITE(1,321) 321 FORMAT(' EOT FOUND READING HEADER.') C C REWIND THE UNIT AND TAKE FATAL EXIT. CALL MAGTAP(0,0,1,MTRS,IBYTE,IUNIT) CALL REMAG10 C C [2] CVT 8 BIT TO 6 BIT 301 CONTINUE S CLA CMA /-1 S DCA 15 /MAGBUFFER PTR DO 300 I=1,4 S CPAGE 10 S 6271 /CDF 70 MAGBUFFER S TADI 15 /GET 1ST BYTE S DCA 20 S TADI 15 /GET 2ND BYTE S DCA 21 S JMS 45 S NOP C C MAKE IT 6 BIT AND PACK IT S TAD 20 S RTL; RTL; RTL S AND (7700 S MQL S TAD 21 S AND (0077 S MQA S DCA \J1 300 JFILE(I)=J1 C [3] GET THE BLOCK COUNT AND OS8 DATE S CPAGE 15 S 6271 /CDF 70 MAGBUFFER S TADI 15 /GET HIGH BLOCK COUNT S DCA 20 S TADI 15 /GET LOW BLOCK COUNT S DCA 21 S TADI 15 /GET YEAR S DCA 22 S TADI 15 /GET MONTH S DCA 23 S TADI 15 /GET DAY S DCA 24 S JMS 45 S CLA C C [3.1] COMPUTE BLOCK COUNT AND SAVE IT S TAD 20 S RTL; RTL; RTL; RTL S AND (7400 S DCA 20 /SAVE IT S TAD 21 S AND (377 S TAD 20 S DCA \JBLKCNT C C C [3.2] COMPUTE PACKED DATE S TAD 22 S AND (7 S DCA \IYEAR S TAD 23 S AND (17 S DCA \IMONTH S TAD 24 S AND (37 S DCA \IDAY C S TAD \IDAY S CLL RAL; RTL S MQL S TAD \IMONTH S CLL RAR; RTR; RTR S MQA S TAD \IYEAR S DCA \IDATE C C C [4] RETURN S RETRN RDHEA /RETURN C C ************************************************* C * SUBROUTINE M S E A R C H C ************************************************* C SEARCH HEADER BLOCKS FOR C FILE SPECIFIED IN KINFILE(1:4) LEAVING THE TAPE C POSITIONED AT THE FRONT OF THE FILE. C IF THE SEARCH FAILS, THEN MSFLAG=0 ELSE MSFLAG=1. S ENTRY MSEAR S CPAGE 2 S MSEAR, BLOCK 2 C [1] INIT THE SEARCH BYZEROING SWITCH. MSFLAG=0 C C [2] READ HEADER. IF EOF THEN DONE ELSE TEST FOR MATCH. C NOTE: HEADER FILENAME IN JFILE[1:4] 510 CALL RDHEADER C C INCREMENT THE FILE COUNTER IFILECNT(IUNIT+1)=IFILECNT(IUNIT+1)+1 C C NOW TEST FOR EOF THEN RETURN WITH FALSE (0). S TAD \MTRS /GET STATUS REGISTER S AND (0100 /EOF? S SNA CLA S JMP \500 /NOT EOF C C IT WAS EOF, SO RETURN WITH FAILURE. (MSFLAG=0) S \550, RETRN MSEAR C C [2.1] OK, NOW TEST IF JFILE=KINFILE. C IF KINFILE=NULL THEN ALWAYS ACCEPT IT. 500 IF (KINFILE) 502,501,502 502 IF (MATCH(KINFILE,JFILE) )501,511,501 C C C [2.2] YES, FOUND A MATCH, BACKSPACE DRIVE 1 RECORD AND C RETURN TRUE 501 MSFLAG=1 CALL MAGTAP(1,0,7,MTRS,0,IUNIT) S RETRN MSEAR C C [2.3] NO MATCH, GO LOOK FOR NEXT EOF. 511 CALL MAGTAP(1,0,6,MTRS,0,IUNIT) S TAD \MTRS S AND (0040 /EOT S SZA CLA S JMP \550 /FAILED C S TAD \MTRS S AND (0100 /EOF S SNA CLA S JMP \511 /NOT YET, READ NEXT RECORD SEARCHING FOR EOF C C C [2.4] OK, FOUND EOF. NOW CHECK NEXT HEADER GOTO 510 C ************************************************* C * SUBROUTINE R D F I L E C ************************************************* C READ THE NEXT MAGTAPE FILE INTO C OS8 FILE "KDEVOUT:KOUTFILE[1:4]". C I.E. *DSK: <== MTA: C C IF NO TRANSFER WAS POSSIBLE (I.E. SEARCH FAILED) THEN C RETURN WITH MFLAG=0 ELSE MFLAG=1. C C C SUBROUTINE RDFILE SEARCHES THE MTA: HEADERS FOR A FILE THAT C MATCHES THE USER INPUT FILE SPEC (SEE MAG10.FT COMMENTS) C FOR WHICH THERE ARE 2 CASES: C 1. NULL SPEC==>TAKE NEXT MTA: FILE IF EXISTS C 2. F.E, *.E, F.*, *.*==> EXACT MATCH. SEARCH C UNTIL FIND A MATCH OR FAIL. C C WHEN THE MATCHING FILE IS FOUND, TRANSFER IT TO THE OUTPUT C DEVICE USING A FILE NAME DERIVED FROM EITHER: C 1. THE USER SUPPLIED OUTPUT FILE NAME IF NON-NULL C OR C 2. THE NAME READ FROM THE MTA: HEADER RECORD. C C S ENTRY RDFIL S CPAGE 2 S RDFIL, BLOCK 2 C C [1] INIT COUNTERS AND POINTERS, THEN ENTER OUTPUT FILE IRECORD=0 IPARERR=0 IPARFIX=0 IOPR=2 MFLAG=0 C C [1.1] SEARCH AND TEST IF SUCCEED 600 CALL MSEARCH IF (MSFLAG) 603,601,603 S \601, RETRN RDFIL C C C [1.2] CHECK WHETHER OUTPUT FILE NAME SPECIFIED. C READ THE HEADER C IF NONE WAS SPECIFIED, THEN USE THE C FILE NAME IN THE MTA HEADER RECORD. C SET THE FLAG TO TRUE. 603 MFLAG=1 CALL RDHEADER C C COPY THE FILE SIZE IN BLOCKS FROM THE HEADER IBLKCNT=JBLKCNT C C C [1.2.1] IF OUTPUT FILE SPEC = NULL OR HAS * SPEC C THEN OUTPUT FILE SPEC<==HEADER FILE SPEC; C NOTE: MCD IS COPY OF ORIGINAL KOUTFILE. C IT IS SETUP BEFORE THE FIRST CALL TO RDFILE. IF(MCD)606,604,606 C 604 DO 605 I=1,4 605 KOUTFILE(I)=JFILE(I) C C C [1.3] ENTER THE DISK FILE 606 CONTINUE IFLAG=MIO(KDEVOUT,KOUTFILE,KOUTFILE(4),3) IF(IFLAG)607,609,607 607 WRITE(1,608) KOUTFILE 608 FORMAT('ENTER ERROR DSK: FILE',3A2,'.',A2) S RETRN RDFIL C C [1.4] OK, PRINT FILE NAME 609 WRITE(1,610)KOUTFILE 610 FORMAT('R: ',3A2,'.',A2) C C [2] READ 1 RECORD FROM MTA: C READ 1 RECORD==>MAGBUFFER C RESET MAXIMUM NUMBER OF RETRYS ON A PARITY ERROR 620 IPARITY=-10 C DECREMENT THE NUMBER-OF-BLOCKS-LEFT COUNTER IBLKCNT=IBLKCNT-9 C C COMPUTE THE # BLOCKS TO WRITE ON DSK: IF(IBLKCNT)621,621,622 C <9 BLOCKS 621 IBN=IBLKCNT+9 GOTO 623 C .GE. 9 BLOCKS 622 IBN=9 623 CONTINUE C C INCREMENT THE RECORD COUNTER IRECORD=IRECORD+1 S TAD \IRECORD S DISP1 S CLA /PUT RECORD NUMBER IN THE RQC DISPLAY REGISTER C C C [2.1] READ MTA: RECORD AND CHECK FOR ERRORS C DO AS SABR CODE SO CAN GET AT MAGBUFFER PTR S CPAGE 16 C COPY BUFFER POINTER S \630, TAD MAGBUFFER S DCA AM2 S TAD MAGBUFFER# S DCA AM2# C S CALL 6,MAGTA S ARG \MWDCT /WORD COUNT S AM2, ARG MAGBUFFER S ARG \IOPR S ARG \MTRS S ARG \IBYTE S ARG \IUNIT C C TEST FOR END OF TAPE (EOT) ERROR S TAD \MTRS S AND (0040 S SZA CLA S JMP \670 /FATAL - PRINT MSG, REWIND AND GIVE UP C C TEST FOR EOF S TAD \MTRS S AND (0100 S SZA CLA S JMP \640 /PREMATURE EOF C S TAD \MTRS S AND (1616 /TST FOR PARITY ERRORS S SNA CLA S JMP \650 /NO ERROR, GO WRITE DATA ONTO DSK: C C C [2.1.1] NOTE ERRROR AND BACKSPACE THE DRIVE S ISZ \IPARITY /SEE IF > 10 TRYS S SKP /NOPE, CONTINUE TRYING S JMP \635 /YES, FATAL ERROR CALL MAGTAP(1,0,7,MTRS,0,IUNIT) C TRY AGAIN GOTO 630 C C C [2.1.2] FATAL PARITY ERROR 635 WRITE(1,636)IRECORD,IFILECNT(IUNIT+1),KOUTFILE 636 FORMAT('READ PARITY FAILURE AT RECORD ',I4,' FILE 1# ',I4,' OUTPUT FILE:',3A2,'.',A2) IPARERR=IPARERR+1 C JUST CONTINUE ANYWAY AND SALVAGE WHAT WE CAN... C C [2.1.3] PREMATURE END OF FILE REACHED 640 WRITE(1,641)KOUTFILE,IRECORD,JBLKCNT 641 FORMAT('READ PREMATURE EOF IN FILE: ',A3,'.',A2, 1', #REC=',I5,', #BLOCKS=',I5) CALL REMAG10 C C [2.2] WRITE IBN BLOCKS==>DSKBUFFER C PACK MAGBUFFER TO 3/2 FORMAT DSKBUFFER 650 CALL PACK C C [2.3] TEST IF FIXED PARITY ERROR C IF FIXED ERROR (-10 < IPARITY < 0) S TAD \IPARITY S SNA CLA S JMP \659 /FATAL PARITY C S TAD \IPARITY S TAD (D10 S SZA CLA S INC \IPARFIX /YES S CLA C C [2.4] COPY BUFFER POINTER S \659, TAD DSKBUFFER S DCA AD1 S TAD DSKBUFFER# S DCA AD1# C S CPAGE 14 S CALL 4,MIO S ARG \IBN /9 OR LESS BLOCKS IN XFER S AD1, ARG DSKBUFFER S ARG (0 S ARG (7 /WRITE S SNA CLA /NON-ZERO = ERROR S JMP \660 /OK C C [2.4.1] IO ERROR - - PRINT MSG - - AND EXIT 651 WRITE(1,652) KOUTFILE 652 FORMAT('WRITE ERROR ON DSK: FILE: ',3A2,'.',A2) S RETRN RDFIL C C C [2.5] TEST IF DONE. C IF DONE THEN CLOSE FILE AND RETURN ELSE GOTO [2]. 660 IF(IBLKCNT)661,661,620 C C [2.5.1] CLOSE THE DSK: FILE C -1 INDICATES THAT THE CHAR BUFFER IS NOT TO BE DUMPED. 661 IFLAG=MIO(-1,0,0,5) IF(IFLAG)663,662,663 C C [2.5.2] TEST IF PRINT OUT THE PARITY ERRORS 662 IF(IPARERR+IPARFIX)666,665,666 666 WRITE(1,667)IPARERR,IPARFIX,IRECORD 667 FORMAT(I5,' NON-RECOV., ',I5,' RECOV. PARITY ERRORS,' 1,I5,' RECORDS.') C C C [2.5.3] MOVE PAST EOF ON MTA: AND VERIFY ITS EXISTANCE. C WE ARE NOT POSITIONED AT THE START OF THE NEXT HEADER OR EOF. 665 CALL MAGTAP(1,0,6,MTRS,IBYTE,IUNIT) S TAD \MTRS S AND (0100 /EOF S SNA CLA S JMP \668 /NO EOF, ERROR MFLAG=1 S RETRN RDFIL /NORMAL RETURN C C MISSING EOF ERROR 668 WRITE(1,669)KOUTFILE 669 FORMAT('NO EOF AT LOGICAL EOF. FILE: ',3A2,'.',A2) CALL REMAG10 C C [2.5.4] CLOSE ERROR 663 WRITE(1,664) KOUTFILE 664 FORMAT('CLOSE ERROR ON DSK: FILE ',3A2,'.',A2) CALL REMAG10 C C [3] EOT FOUND WHILE READING 670 WRITE(1,671) KOUTFILE 671 FORMAT('EOT FOUND READING DSK: FILE ',3A2,'.',A2, 1'REWINDING') CALL REMAG10 C C C ************************************************* C * SUBROUTINE W T F I L E C ************************************************* C WRITE THE NEXT MAGTAPE FILE FROM C C C OS8 FILE "KDEVIN:KINFILE[1:4]". C S ENTRY WTFIL S CPAGE 2 S WTFIL, BLOCK 2 C [1.0] PRINT THE FILE NAME C FIRST PRINT OUT THE FILE. WRITE(1,711)(KINFILE(I),I=1,4) 711 FORMAT('W: ',3A2,'.',A2) C C C [1.1] LOOKUP THE DSK: FILE IFLAG=MIO(KDEVIN,KINFILE,KINFILE(4),1) IF (IFLAG) 700,710,700 700 WRITE(1,701)(KINFILE(I),I=1,4) 701 FORMAT('LOOKUP ERROR DSK: FILE ',3A2,'.',A2) S RETRN WTFIL C C C [1.2] NOW FIND DSK: FILE BLOCK LENGTH 710 IFLAG=MIO(KDEVIN,IABSBLK,IBLKCNT,13) C SINCE IBLKCNT = - NUMBER OF BLOCKS IN FILE, NEGATE IT. IBLKCNT = - IBLKCNT C C [1.3] WRITE THE MAGTAPE HEADER IRECORD=0 IPARERR=0 IPARFIX=0 IOPR=4 CALL WTHEADER C INCREMENT THE FILE COUNTER IFILECNT(JUNIT+1)=IFILECNT(JUNIT+1)+1 C C C [2] RECORD TRANSFER LOOP. C WRITE 1 MAGTAPE RECORD OF 3456 BYTES FROM MAGBUFFER C AFTER CONVERTING DSKBUFFER ==> MAGBUFFER. C 720 IRECORD=IRECORD+1 S TAD \IRECORD S DISP1 S CLA /OUTPUT RECORD NUMBER IN THE RQC DISPLAY REGISTER C C RESET PARITY COUNTER SPECIFYING # OF RETRIES IPARITY=-10 C C DECREMENT NUMBER-OF-BLOCKS-LEFT COUNTER IBLKCNT=IBLKCNT-9 C C C [2.1] READ 9 BLOCKS==>DSKBUFFER C COPY BUFFER POINTER S TAD DSKBUFFER S DCA AD2 S TAD DSKBUFFER# S DCA AD2# C S CPAGE 12 S CALL 4,MIO S ARG (D9 /9 BLOCKS S AD2, ARG DSKBUFFER S ARG (0 S ARG (6 /READ S SNA CLA S JMP \730 /OK WRITE(1,721)(KINFILE(J),J=1,4) 721 FORMAT('READ ERROR DSK: FILE ',3A2,'.',A2) CALL REMAG10 C C C [2.1.1] UNPACK DSKBUFFER ==> MAGBUFFER 730 CALL UNPACK C C [2.2] WRITE OUT MAGBUFFER. C COPY BUFFER POINTER S \731, TAD MAGBUFFER S DCA AM3 S TAD MAGBUFFER# S DCA AM3# C S CPAGE 16 S CALL 6,MAGTA S ARG \MWDCT /WORD COUNT S AM3, ARG MAGBUFFER S ARG \IOPR S ARG \MTRS S ARG \IBYTE S ARG \JUNIT C C TEST FOR EOT S TAD \MTRS S AND (0040 S SZA CLA S JMP \750 /FATAL ERROR, PRINT MSG AND REWIND - GIVE UP- C S TAD \MTRS /TEST FOR PARITY ERROR S AND (1616 S SNA CLA S JMP \740 /NO ERRORS C C TEST IF > 10 PARITY RETRIES S ISZ \IPARITY S SKP S JMP \732 /FATAL ERROR C NOT > 10 YET, SO BACKUP AND TRY AGAIN. CALL MAGTAP(1,0,7,MTRS,IBYTE,JUNIT) C SINCE WE HAD AN ERROR, TRY MOVING AHEAD ON THE TAPE GOTO 731 C C C [2.2.1] FATAL PARITY ERROR 732 WRITE(1,733)IRECORD,IFILE(JUNIT+1),KOUTFILE 733 FORMAT('WRITE PARITY FAILURE AT RECORD ',I5 1,' FILE# ',I5,', INPUT FILE:',3A2,'.',A2) IPARERR=IPARERR+1 C C C [2.3] TEST IF AT END OF FILE THEN DONE, WRITE C 2 EOFS ON MTA: ELSE GOTO [2]. C TEST IF RECOVERABLE PARITY ERROR IF (-10