C PROGRAM MAG10.FT C -------------- C C C C C P.LEMKIN, AND G. GROSFELD C NATIONAL CANCER INSTITUTE C NATIONAL INSTITUTES OF HEALTH C BETHESDA, MD 20014 C C C AUG 16, 1976 C AUG 13, 1976 C AUGUST 12, 1976 C REVISED AUG 8, 1976 -LEMKIN C REVISED AUGUST 6, 1976 C AUGUST 4, 1976 C AUGUST 2, 1976 C JULY 31, 1976 - LEMKIN, (MODIFIED FROM MAG.FT) C C PURPOSE C -------- C MAG10.FT IS A PDP8E PROGRAM WHICH USES THE COMMAND DECODER C INPUT TO SPECIFY AN INPUT AND OUTPUT FILE PAIR OF COMMANDS C TO MANIPULATE THE MTA0: OR MTA1: C TC58/TU20-10 MAGTAPES. C C IT IS USED TO REWIND (/R), ADVANCE n C FILES (n/A), BACKSPACE n FILES (n/B) WRITE A LOGICAL EOT C (/E/O/F), ADVANCE TO THE END OF THE TAPE (/T), PRINT A FILE C COUNT (/C) AND TRANSFER FILES TO/FROM OTHER OS/8 DEVICES AND C THE MAGTAPE UNITS. LIST THE NAMES AND LENGTHS OF FILES ON THE C TAPE (/L). MAGTAPE FILES HAVE AN EXPLICIT HEADER. C FILES ARE STORED SEQUENTIALLY ON THE MAGTAPE WITH EOF C MARKERS BETWEEN FILES. TWO EOF'S ARE WRITTEN AT THE END OF A C SET OF FILES. FILES ARE WRITTEN IN 9-TRACK 8-BIT BYTE ODD C PARITY, 800 BPI. THIS FORMAT MAY BE READ BY MACHINES WHICH C CAN READ IBM COMPATIBLE BYTE MODE (SUCH AS THE PDP10 KL10). C C C Magtape format C -------------- C The tape format is 9-track 800 BPI odd parity, 8-bit byte C data. A record consists of 3456 8-bit bytes (which is equal C to 2304 OS/8 12-bit words (2/3 word=1 byte) or 9 OS/8 C (256 word) file blocks or 768 PDP10 image mode words. C The first record of each file is a header C record which contains the C filename (6 bytes), C file extension (2 bytes), C OS/8 file length in blocks (2 bytes - high and low bytes), C OS/8 date word(year 1 byte, month 1byte, day 1 byte). C C C OPERATIONS: C ---------- C *MTA:/R < - REWIND C *(OPT. LIST FILE) < MTA:/L - REWIND THE TAPE AND LIST C HEADER NAMES, LENGTH C OF FILES, THEN REWIND. IF C /P IS USED, THEN PRINT ON THE C LPT: DEVICE. THE LPT: MAY C BE ASSIGNED TO DSK: IN WHICH C CASE A ".DA" FILE NAME C MAY BE SPECIFIED. C *MTA:/A MTA: FILE TRANSFER OPTIONS C ------------------------------------ C IN THE FOLLOWING EXAMPLES THE IS SPECIFIED C AS FOLLOWS. LET F=SPECIFIC FILE NAME, LET E= SPECIFIC C EXTENSION, THEN A FILE MAY BE: C ::= F.E | *.E | F.* | *.* C C *MTA:(NEW F.E) < DSK:F.E - COPY FILE AND RENAME ON MTA: C *MTA: < DSK: - COPY FILE(S) BY NAME. C *DSK: < MTA: - TRANSFER NEXT FILE BY HEADER NAME C *DSK:(NEW F.E) < MTA: - TRANSFER NEXT FILE AND RENAME C *DSK: < MTA: - SEARCH MTA: FOR SPECIFIED FILE(S) C *DSK:(NEW F.E) < MTA:F.E - SEARCH MTA: FOR C SPECIFIED FILE C C C MTAi: ==> MTAj: FILE TRANSFER OPTIONS C ------------------------------------ C IN THE FOLLOWING EXAMPLES THE IS SPECIFIED C AS FOLLOWS. LET F=SPECIFIC FILE NAME, LET E= SPECIFIC C EXTENSION, THEN A FILE MAY BE: C ::= F.E | *.E | F.* | *.* C C *MTAj:(NEW F.E) < MTAi:F.E - COPY FILE AND RENAME C *MTAj < MTAi: - COPY FILE(S) BY NAME. C *MTAj: < MTAi: - TRANSFER NEXT FILE BY HEADER NAME C *MTAj:(NEW F.E) < MTAi: - TRANSFER NEXT FILE AND RENAME C *MTAj: < MTAi: - SEARCH MTAi: FOR SPECIFIED FILE(S) C *MTAj:(NEW F.E) < MTAi:F.E - SEARCH MTAi: FOR C SPECIFIED FILE C C C C C C INTERNAL MODE OF OPERATION C -------------------------- C COMMANDS ARE FETCHED FROM THE COMMAND DECODER. THE MAG10 C SWITCHES ARE ANALYZED AND THEN THE C OUTPUT MAGTAPE UNIT COMPUTED IF NEEDED. THE SWITCH OPERATION C IS PERFORMED AND THE COMMAND DECODER RESTARTED. IF C NONE OF THE FIRST SET OF SWITCHES IS USED THE I/O IS C ASSUMED AND SECTION [3] IS ENTERED WHERE THE ACTUAL I/O IS C PERFORMED. C C C CHAIN OPTION C ------------ C MAG10 HAS THE OPTION WHEREBY IF A 2ND INPUT FILE IS SPECIFIED, C MAG10 WILL CHAIN TO IT AFTER PERFORMING THE SPECIFIED C OPERATION. THERE IS AN ASSUMPTION MADE THAT THE CHAIN C FILE EXISTS ON THE SYS. ONLY THE FILE NAME NEED BE SPECIFIED (I.E C YOU DON'T HAVE TO SPECIFY THE .SV) C C COMPILE AS: C ----------- C .COMP MAG10.RL < MAGCMN.FT,MAG10.FT C C C LOAD AS: C ------- C .R LOADER C *MIO C *MCDSPEC/2 C *MAGTAP C *MAGAUX C *MTFILE C *MATCH C *QUESTION C *MDIRECT C *MCDSPEC C *MAG10 C */M$ C .SAVE SYS:MAG10.SV C C C C [0] INQUIRE WHAT THE DEVICE NUMBERS OF THE MTA0 AND MTA1 UNITS C ARE AND IF THEY EXIST. C C [0.1] SET THE PARAMETERS MTA0=-1 MTA1=-1 IBYTE=0 C SET THE WC = 3456 BYTES= 2000+1456 Fortran II Eqv. MWDCT=2000+1456 C C DEFINE THE STAR@ 6-BIT S TAD (5200/"*@" S DCA \ISTAR C IFILECNT(1)=0 IFILECNT(2)=0 RW(1)='READ ' RW(2)='WROTE ' C C C [0.2] GO INQUIRE OS/8 NUMBERS FOR THE MTA0: C AND MTA1: HANDLERS WHICH WILL BE NEEDED TO ANALYZE C THE CD OUTPUT. S TAD M0 /"MT" S DCA AM0 S TAD M0# /"A0" S DCA AM0# S CPAGE 11 S 6212 /CIF 10 S JMS 7700 /USR S 12 /INQUIRE S AM0, 0 S 0 S 0 S JMP \25 /MTA0: NOT FOUND S TAD AM0# /SAVE DEVICE # FOR MTA0: S DCA \MTA0 GOTO 20 C C NOTE THAT MTA0: DOES NOT EXIST 25 WRITE(1,27) 27 FORMAT('MTA0: DOES NOT EXIST.') C S \20, TAD M1 /"MT" S DCA AM1 S TAD M1# /"A1" S DCA AM1# S CPAGE 11 S 6212 /CIF 10 S JMS 7700 /USR S 12 /INQUIRE S AM1, 0 S 0 S 0 S JMP \26 /ERROR. MTA1: DOES NOT EXIST S TAD AM1# /SAVE DEVICE # FOR MTA0: S DCA \MTA1 GOTO 30 C C NOTE THAT MTA1: DOES NOT EXIST 26 WRITE(1,28) 28 FORMAT('MTA1: DOES NOT EXIST.') C C C C C [0.3] PRINT VERSION DATE & TIME C 30 WRITE(1,31) 31 FORMAT(/,'"MAG10", VERSION: 8/16/76, 8:45 AM',/) GOTO 102 C C C [0.4] REENTER MAG10 BECAUSE OF FATAL I/O ERROR S ENTRY REMAG S CPAGE 2 S REMAG, BLOCK 2 C C C [0.5] CHECK IF 2ND INPUT FILE WAS SPECIFIED LAST C TIME AND THEN CHAIN TO IT IF IT WAS. 100 IF(KINFILE(5))101,102,101 101 CALL CHAIN(KINFILE(5)) C C C C [1] CALL THE COMMAND DECODER C 102 CALL MCDSPEC IBYTE=0 IRECORD=0 IPARERR=0 IPARFIX=0 S JMS MAKUNIT /SETUP MTAi: ANALYSIS C SETUP FOR OUTPUT DEVICE UNLESS SPECIFIED OTHERWISE KUNIT=JUNIT C C C [2] CHECK THE SWITCHES C C C [2.1] CHECK FOR *MTA:/R< - REWIND IF (ISW(18))214,220,214 C REWIND MTA SPECIFIED C 214 CALL MAGTAP(0,0,1,MTRS,IBYTE,JUNIT) C C TEST FOR BOT S TAD \MTRS S AND (1000/ BOT S SNA CLA S JMP \212 /N BOT FOUND C IFILECNT(KUNIT+1)=0 GOTO 100 C 212 WRITE(1,213) 213 FORMAT('BOT NOT FOUND.') CALL EXIT C C C C C C [2.2] CHECK FOR MTA:NNN/A< (ADVANCE NNN FILES) 220 IF (ISW(1))221,230,221 221 LOGEOT=-2 DO 224 I=1,ICNUM C ADVANCE RECORDS UNTIL EOF THEN GOTO END OF THE DO LOOP C S CPAGE 4 S \222, JMS FORWARD S JMP \223 /FOUND EOF, TEST FOR LOGICAL EOT C LOGEOT=-2 S JMP \222 /EOF NOT FOUND, RESET COUNTER & ADVANCE S CPAGE 5 S \223, ISZ \LOGEOT /SEE IF 2ND EOF (IE. LOGICAL EOT) S SKP /NO, INCREMENT FILE COUNTER & CONTINUE S JMP \225 /YES, LOGICAL EOT: GET OUT OF LOOP 224 IFILECNT(JUNIT+1)=IFILECNT(JUNIT+1)+1 C C (ADVANCED REQUISITE NUMBER OF FILES, NEXT COMMAND?) GOTO 100 C S CPAGE 3 S \225, JMS REVERSE /BACK UP 1 (BETWEEN DOUBLE EOF'S) S NOP /DON'T WORRY ABOUT EOF HERE WRITE(1,228)IFILECNT(JUNIT+1) 228 FORMAT('LOGICAL END-OF-TAPE FOUND AFTER FILE #',I5) GOTO 100 C C C C [2.3] CHECK FOR *MTA:NNN/B< - BACKSPACE NNN FILES 230 IF (ISW(2))231,240,231 C C MUST BACKUP REALLY N+1 SINCE PASS LAST EOF. 231 ICNUM=ICNUM+1 DO 233 I=1,ICNUM C BACKSPACE RECORDS UNTIL BOT THEN GOTO [1] C S CPAGE 5 S\232, JMS REVERSE S SKP /EOF FOUND, DECREMENT COUNTER S JMP \232 /NO EOF, CONTINUE BACKING 233 IFILECNT(JUNIT+1)=IFILECNT(JUNIT+1)-1 C S CPAGE 3 S JMS FORWARD /ADVANCE OVER EOF MARK S NOP /EXPECT EOF HERE C C (INCREMENT COUNTER TO CORRECT FOR "N+1" BACKUPS) IFILECNT(JUNIT+1)=IFILECNT(JUNIT+1)+1 GOTO 100 C C C C C [2.4] CHECK FOR MTA:/E/O/F< C (WRITE A LOGICAL, IE DOUBLE, EOF) C THEN DO A REWIND. C 240 IF (ISW(5)+ISW(6)+ISW(15)-3)250,241,250 C WRITE WITH EXTENDED GAP C 241 CALL MAGTAP(0,0,5,MTRS,2,KUNIT) CALL MAGTAP(0,0,5,MTRS,2,KUNIT) C WRITE(1,243)IFILECNT(JUNIT+1)+1 243 FORMAT('LOGICAL END-OF-TAPE WRITTEN AFTER FILE #',I5, !':REWINDING') C S JMP \214 /GO REWIND C C C C [2.5] CHECK FOR MTA:/T< (ADVANCE TO LOGICAL EOT) C NOTE: LOGICAL EOT=DOUBLE EOF 250 IF (ISW(20))1251,260,1251 C C REWIND BEFORE SEARCH 1251 CALL MAGTAP(0,0,1,MTRS,IBYTE,JUNIT) C 251 LOGEOT=-2 C S CPAGE 4 S \252, JMS FORWARD S JMP \253 /FOUND EOF, TEST FOR LOGICAL EOT C C PUT THE FILE COUNT IN DISP2 K=IFILECNT(JUNIT+1) S TAD \K S DISP2 S CLA C C C TEST FOR CONTROL/C THEN REEENTER S KRB S AND (177 S TAD (-3 S SZA CLA S JMP \254 /NO C TERMINATE AND REWIND FIRST WRITE(1,1254) 1254 FORMAT('REWINDING') CALL MAGTAP(0,0,1,MTRS,IBYTE,JUNIT) CALL REMAG10 C C 254 LOGEOT=-2 S JMP \252 /NO EOF, RESET COUNTER & ADVANCE C S CPAGE 5 S \253, ISZ \LOGEOT /SEE IF 2ND EOF (IE. LOG. EOT) S SKP /NO, JUST INCREMENT FILE COUNTER & CONTINUE S JMP \225 /YES, LOGICAL EOT: GET OUT OF LOOP IFILECNT(JUNIT+1)=IFILECNT(JUNIT+1)+1 S JMP \252 /KEEP ADVANCING UNTIL EOT (LOG. OR REAL) C C C C [2.6] CHECK FOR MTA:/C< (PRINT TAPE POSITION) C IN TERMS OF NEXT FILE POSITION (TO BE READ OR WRITTEN) 260 IF (ISW(3))261,270,261 261 WRITE(1,262)IFILECNT(JUNIT+1)+1 262 FORMAT('TAPE POSITIONED BEFORE FILE#: ',I5) GOTO 100 C C C [2.7] CHECK FOR MTA:/V< (PRINT VERSION DATE & TIME) 270 IF (ISW(22))30,280,30 C C C [2.8] CHECK FOR *LPT: DSK: C IF OUTPUT AND (NOT MTAOUTPUT) AND MTAINPUT C THEN DO RDFILE; 310 IF (MTAINPUT)320,320,311 311 IF (MTAOUTPUT) 399,312,330 312 IF(KDEVOUT)399,399,1313 C C TEST IF NULL INPUT FILE, THEN DO NOT REWIND! 1313 IF(KINFILE)313,319,313 C C C [3.1.1] REWIND THE UNIT. 313 CALL MAGTAP(0,0,1,MTRS,IBYTE,IUNIT) C C SKIP PAST THE INITIAL EOF CALL MAGTAP(1,0,6,MTRS,IBYTE,IUNIT) IFILECNT(IUNIT+1)=0 C TEST FOR THE INITIAL EOF WHICH MUST BE THERE! S TAD \MTRS S AND (0100 S SZA CLA S JMP \319 /OK, CONTINUE C 1300 WRITE(1,1319) 1319 FORMAT(' NO INITIAL EOF, BAD TAPE!') CALL REMAG10 C C COPY THE FILE NAME FOR USE BY RDFILE IN DETERMINING WHETHER C TO USE THE OUTPUT FILENAME OR THE HEADER FILE NAME 319 MCD=KOUTFILE C C C [3.1.2] TRANSFER FILE 314 CALL RDFILE C C TEST IF RDFILE FOUND LOGICAL EOT THEN DONE. IF(MFLAG)318,100,318 C C C [3.1.3] TEST IF DONE TRANSFERING FILES. IF F.E C OR NULL WAS SPECIFIED BY THE USER THEN DONE. IF C ANY * WAS SPECIFIED THEN WE MUST SEARCH THE WHOLE TAPE. 318 IF(KINFILE)316,100,316 316 IF(KINFILE-ISTAR)317,314,317 317 IF(KINFILE(4)-ISTAR)100,314,100 C [3.2] TEST IF TRANSFER DSK==>MTA. C IF INPUT AND (NOT MTAINPUT) AND MTAOUTPUT C THEN DO WTFILE; 320 IF (MTAOUTPUT) 399,399,321 321 IF (MTAINPUT) 322,322,330 322 IF (KDEVIN) 399,399,323 C C C [3.2.1] TEST IF WRITE THE INITIAL EOF ON THE TAPE 323 IF(IFILECNT(JUNIT+1))328,1320,328 1320 CALL MAGTAP(1,0,7,MTRS,0,JUNIT) C IF WE SEE THE BOT THEN THE UNIT DOES NOT REVERSE S TAD \MTRS S AND (1000 /BOT? S SNA CLA S JMP \1321 /NOT A BOT, C WAS BOT, WRITE THE INITIAL EOF CALL MAGTAP(0,0,5,MTRS,IBYTE,JUNIT) WRITE(1,1322) 1322 FORMAT('WRITING INITIAL EOF AT BOT') GOTO 328 C C ADVANCE TO LEAVE TAPE IN CORRECT POSITION 1321 CALL MAGTAP(1,0,6,MTRS,IBYTE,JUNIT) C C C [3.2.2] GET FILENAME USING DIRECTORY SEARCH 328 CALL MDIRECT(KDEVIN,KINFILE,NSTACK,NPTR) C CHECK FOR NO FILES FOUND (I.E. * OR ? SPEC WHICH FAILED) IF (NPTR) 325,324,325 C 324 WRITE(1,327) 327 FORMAT(' DSK: SEARCH FAILED.') GOTO 100 C C C [3.2.3] TRANSFER DSK==>MTA - GET FILE NAMES C FOR ALL FILES IN NSTACK[1:NPTR,1:4] 325 DO 329 IPTR=1,NPTR C COPY FILE NAME FROM THE STACK WHERE C FILE NAMES ARE 3A2,A2 (I.E. 4 WORDS) AND NSTACK C IS A 1-D ARRAY OF MAX SIZE 241. C DO 326 J=1,4 INDEX=(IPTR-1)*4+J 326 KINFILE(J)=NSTACK(INDEX) C C C [3.2.4] DO THE TRANSFER C SAVE KDEVIN AND RESTORE AFTER THE CALL KDISAVE=KDEVIN CALL WTFILE KDEVIN=KDISAVE 329 CONTINUE GOTO 100 C C C C [3.3] COPY MTAi:==>MTAj:. 330 IF(KINFILE)1330,1331,1330 C C [3.3.1] REWIND THE UNIT. 1330 CALL MAGTAP(0,0,1,MTRS,IBYTE,IUNIT) C C SKIP PAST THE INITIAL EOF CALL MAGTAP(1,0,6,MTRS,IBYTE,IUNIT) IFILECNT(IUNIT+1)=0 C C TEST FOR THE INITIAL EOF ON MTAj: WHICH MUST BE THERE! S TAD \MTRS S AND (0100 S SNA CLA S JMP \1300 /NOT EOF - FATAL BAD TAPE, FAIL AT [3.1.1] C C TEST IF NEED TO WRITE OUTPUT EOF AT FIRST BLOCK IF(IFILECNT(JUNIT+1))1331,1332,1331 C FILE COUNT IS ZERO GO TEST 1332 CALL MAGTAP(1,0,7,MTRS,0,JUNIT) S TAD \MTRS S SNA CLA S JMP \1333 /NOT BOT C WAS BOT, WRITE INITIAL EOF CALL MAGTAP(0,0,5,MTRS,IBYTE,JUNIT) WRITE(1,1322) GOTO 1331 C C ADVANCE THE TAPE TO CORRECT POSITION. 1333 CALL MAGTAP(1,0,6,MTRS,IBYTE,JUNIT) C C COPY THE FILE NAME FOR USE BY MTFILE IN DETERMINING WHETHER C TO USE THE OUTPUT FILENAME OR THE HEADER FILE NAME 1331 MCD=KOUTFILE C C C [3.3.2] TRANSFER FILE 334 CALL MTFIL C C TEST IF MTFILE FOUND LOGICAL EOT THEN DONE. IF(MFLAG)338,100,338 C C C [3.3.3] TEST IF DONE TRANSFERING FILES. IF F.E C OR NULL WAS SPECIFIED BY THE USER THEN DONE. IF C ANY * WAS SPECIFIED THEN WE MUST SEARCH THE WHOLE TAPE. 338 IF(KINFILE)336,100,336 336 IF(KINFILE-ISTAR)337,334,337 337 IF(KINFILE(4)-ISTAR)100,334,100 C C C [3.4] ILLEGAL FILE SPEC 399 WRITE(1,398) 398 FORMAT('ILLEGAL R/W FILESPEC') GOTO 100 C C [4.0] END OF TAPE ERROR HANDLERS C 400 WRITE(1,401)IFILECNT(JUNIT+1) 401 FORMAT('EOT FOUND AFTER FILE #',I5,':REWINDING') GOTO 214 C 402 WRITE(1,403)IFILECNT(JUNIT+1) 403 FORMAT('FOUND BOT WITH ',I5,' FILES REMAINING') IFILECNT(JUNIT+1)=0 GOTO 100 C C C C ******************************************************** C SUBROUTINE M A K U N I T C ******************************************************** S CPAGE 3 S RMAKUNIT, JMP I MAKUNIT S MAKUNIT, 0 /ENTRY C TAKE THE KDEVOUT - KDEVIN NUMBERS AND TEST IF LEGAL MTA C AND IF SO MAKE JUNIT = THE UNIT NUMBER C EXACTLY ONE OF THESE UNITS MUST BE SPECIFIED OTHERWISE AN ERROR C IS ASSUMED. C MTAOUTPUT=0 MTAINPUT=0 IUNIT=0 JUNIT=0 C C IF (KDEVOUT-MTA0)2001,2000,2001 2000 JUNIT=0 MTAOUTPUT=1 C 2001 IF (KDEVOUT-MTA1)2003,2002,2003 2002 JUNIT=1 MTAOUTPUT=1 C 2003 IF (KDEVIN-MTA0)2005,2004,2005 2004 IUNIT=0 MTAINPUT=1 C 2005 IF (KDEVIN-MTA1)2007,2006,2007 2006 IUNIT=1 MTAINPUT=1 2007 CONTINUE C C C TEST IF FOUND AT LEAST ONE DRIVES IF (MTAOUTPUT+MTAINPUT) 2010,2010,2009 S \2009, JMP RMAKUNIT /OK, RETURN C 2010 WRITE(1,2008) 2008 FORMAT('ILLEGAL MTA: UNIT SPECIFIED.') GOTO 100 C C C ************************************************************* C SUBROUTINE F O R W A R D C ************************************************************* C S CPAGE 3 S RFWD, JMP I FORWARD S FORWARD, 0 CALL MAGTAP(1,0,6,MTRS,0,KUNIT) C S CPAGE 4 S JMS EOT /TEST FOR PHYSICAL END OF TAPE S JMP \400 /GO HANDLE END-OF-TAPE ERROR C S CPAGE 5 S JMS EOF /TEST FOR END OF FILE S SKP /FOUND EOF, TAKE ERROR RETURN S INC FORWARD /NO EOF FOUND, TAKE NORMAL RETURN S JMP RFWD /GO RETURN C C ************************************************************* C ************************************************************* C SUBROUTINE R E V E R S E C ************************************************************* C S RREV, JMP I REVERSE S REVERSE, 0 CALL MAGTAP(1,0,7,MTRS,0,KUNIT) C S CPAGE 4 S JMS BOT /CHECK FOR BEGINNING OF TAPE S JMP \402 /BOT FOUND, ERROR EXIT C S CPAGE 5 S JMS EOF /BOT NOT FOUND, TEST FOR END OF FILE S SKP /EOF FOUND, TAKE ERROR RETURN S INC REVERSE /NO EOF, SET UP NORMAL RETURN S JMP RREV /GO RETURN C C ************************************************************* C STATUS BIT-PATTERN TEST SUBROUTINES C ----------------------------------- C C C C ************************************************************** C SUBROUTINE BOT: TEST FOR BEGINNING OF TAPE C ************************************************************** C S CPAGE 3 S RBOT, JMP I BOT S BOT, 0 /ENTRY S TAD \MTRS /CHECK STATUS S AND MBOT /USE BOT MASK S SNA CLA /SKIP IF TRUE S INC BOT /NOT TRUE, SET UP ALTERNATE RETURN S JMP RBOT /GO RETURN C C ************************************************************** C C C ************************************************************** C SUBROUTINE EOF: TEST FOR END OF FILE C ************************************************************** C S CPAGE 3 S REOF, JMP I EOF S EOF, 0 /ENTRY S TAD \MTRS /READ STATUS S AND MEOF /AND WITH EOF MASK S SNA CLA /SKIP IF TRUE (NORMAL RETURN) S INC EOF /NOT TRUE, SET UP ALTERNATE RETURN S JMP REOF /GO RETURN C C ************************************************************** C C C ************************************************************** C SUBROUTINE EOT: TEST FOR PHYSICAL END OF TAPE C ************************************************************** C S CPAGE 3 S REOT, JMP I EOT S EOT, 0 /ENTRY S TAD \MTRS /READ STATUS BITS S AND MEOT /AND WITH EOT MASK S SNA CLA /SKIP IF TRUE (NORMAL RETURN) S INC EOT /FALSE, SET UP ALTERNATE RETURN S JMP REOT /GO RETURN C C ************************************************************** C C C ************************************************************** C SUBROUTINE PARITY: TEST FOR READ/WRITE PARITY ERRORS C ************************************************************** C S CPAGE 3 S RPAR, JMP I PARITY S PARITY,0 /ENTRY S TAD \MTRS /READ STATUS BITS S AND MPAR /AND WITH PARITY BIT MASK S SNA CLA /SKIP IF TRUE (NORMAL RETURN) S INC PARITY /ERRORS, TAKE ALTERNATE RETURN S JMP RPAR /GO RETURN C C ************************************************************* C C C STATUS TEST BIT-MASK TABLE C -------------------------- C S MBOT, 1000 /BEGINNING OF TAPE MASK S MEOF, 0100 /END OF FILE MASK S MEOT, 0040 /END OF TAPE MASK S MPAR, 1616 /READ OR WRITE PARITY ERROR MASK C C C C POINTERS C -------- S M0, TEXT /MTA0/ S M1, TEXT /MTA1/ C C END