.SYSID < .TITLE MTC. >,< 101> / /COPYRIGHT (C) 1975 /DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. / /THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY /ON A SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH /THE INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS /SOFTWARE, OR ANY OTHER COPIES THEREOF, MAY NOT BE PRO- /VIDED OR OTHERWISE MADE AVAILABLE TO ANY OTHER PERSON /EXCEPT FOR USE ON SUCH SYSTEM AND TO ONE WHO AGREES TO /THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE /SOFTWARE SHALL AT ALL TIMES REMAIN IN DEC. / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE /WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A COM- /MITMENT BY DIGITAL EQUIPMENT CORPORATION. / /DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY /OF ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. .EJECT /+ / 100 09-JUN-75 (RCHM) MAKE XVM CHANGES. /101 31-JUL-75 (JMW) RETURN STATUS IN .SCOM+21; IN AC AFTER .WAIT. /- /LINKING LOADERS IN KM9 ENVIRONMENT. 1 FILE, INPUT ONLY, /IOPS AND IMAGE MODES. /PETE WILSON, 1-13-69 /***** TIMES OUT TO DETERMINE AVAILABILITY OF TRANSPORT ***** MTSF=IOT+7341 /SKIP ON MAG TAPE DONE OR MAG TAPE ERROR FLAG. MTCR=IOT+7321 /SKIP ON MAG TAPE CONTROL READY. MTTR=IOT+7301 /SKIP ON SELECTED MAG TAPE TRANSPORT READY. MTAF=IOT+7322 /CLEAR MAG TAPE DONE AND ERROR FLAGS (ALSO STATUS /AND COMMAND REGISTERS, IF CONTROL IS READY). MTCM=IOT+7324 /IOR AC 0-5,9-11 TO COMMAND REGISTER; TRANSFER /AC 6-8 TO COMMAND REGISTER 6-8. MTLC=IOT+7326 /TRANSFER AC 0-11 TO COMMAND REGISTER. MTVS=IOT+7342 /IOR STATUS REGISTER TO AC. MTRS=MTVS+10 /READ STATUS. MTVC=IOT+7302 /IOR COMMAND REGISTER TO AC. MTRC=MTVC+10 /READ COMMAND. MTGO=IOT+7304 /SET GO. .MED=3 /MONITOR ERROR DIAGNOSTIC. .SCOM=100 /SYSTEM COMMUNICATION. .GLOBL MTC. MTC. DAC MTCALP /SAVE POINTER TO CAL. DAC MTARGP /AND TO ARGUMENT LIST. ISZ MTARGP /BUMP ARGUMENT POINTER TO UNIT AND FUNCTION. LAC (.MED+1 /SET UP IOPS ERROR NUMBER. DAC MTERNO /.. /SECTION TO WAIT FOR MAG TAPE CONTROL AND UNIT READY. MTCR /CONTROL READY? JMP MTCALR /NO, RETURN TO CAL. LAC* MTARGP /PICK UP UNIT. MTLC /MOVE UNIT NUMBER TO COMMAND REGISTER. MTTR /SKIP IF THE UNIT REFERENCED IS READY. JMP MTLOOP /UNIT NOT READY, GO SEE WHY NOT. AND (17 /UNIT IS READY; EXTRACT FUNCTION CODE. TAD (MTDISP /FORM ADDRESS OF APPLICABLE JMP IN DISPATCH TABLE. DAC MTDISP /SAVE IT. LAC* MTARGP /PICK UP UNIT AGAIN. RTL /MOVE UNIT TO 15-17. RTL /.. AND (7 /THROW AWAY HIGH-ORDER JUNK. TAD (MTDSTB /FIND ENTRY IN DRIVE STATUS TABLE. DAC MTTPTR /SAVE POINTER TO ENTRY REFERENCED. LAW -1750 /RESET NOT-READY COUNTER DAC MTTRSW / FOR NEXT TIME. ISZ MTARGP /MTARGP POINTS TO CAL+2 AFTER EXECUTION. LAC MTCALP /SET UP MTPC IN CASE HANG ON DAC MTPC / CAL IS REQUIRED ( >1 IO OPERATION NEEDED). LAC* MTTPTR /STARTING PROCESSING OF BRAND-NEW CAL, PICK UP DRIVE STATUS. JMP* MTDISP /GO TO FUNCTION. MTDISP XX /POINTER TO FUNCTION. JMP MTINIT / 1 -- INIT MTSKIP SKP / 2 -- OPER (FSTAT, DLETE, RENAM) JMP MTSEEK / 3 -- SEEK MTNOP NOP / 4 -- ENTER JMP MTERR6 / 5 -- CLEAR JMP MTCLOS / 6 -- CLOSE JMP MTERR6 / 7 -- MTAPE JMP MTREAD /10 -- READ JMP MTERR6 /11 -- WRITE JMP MTWAIT /12 -- WAIT, WAITR JMP MTERR6 /13 -- TRAN MTCALR DBR XCT .+1 JMP* MTCALP /SECTION TO WAIT FOR SETTLE-DOWN DELAY WHEN UNIT IS NOT READY. MTLOOP MTRS /READ STATUS FOR SELECTED TRANSPORT. RAL /MOVE REWIND INDICATOR TO SIGN. SMA /THEN SKIP IF THE UNIT IS REWINDING. ISZ MTTRSW /UNIT IS NOT REWINDING, COUNT THIS TIME THROUGH WAIT LOOP. JMP MTCALR /THEN GO REPROCESS THE CAL. /COME HERE ON COUNT COMPLETE. MEANS TRANSPORT MUST NOT BE AVAILABLE. LAW -1750 /SET UP COUNT FOR NEXT TIME. DAC MTTRSW /.. JMP MTIOP4 /THEN GO PUBLISH IOPS 4. .EJECT MTBUFF .BLOCK 401 /ROOM FOR STANDARD MAG TAPE RECORD. MTEXBC=MTBUFF+1 MTACCM=MTBUFF+2 /INITIALIZE MAG TAPE UNIT. /CALLING SEQUENCE: / CAL+DIRECTION(8)+DAT(9-17) / UNIT(0-2)+1 / RESTART /MTARGP POINTS HERE NOW. / BUFSIZ /WHERE DIRECTION IS 0 FOR INPUT, 1 FOR OUTPUT. MTINIT CAL+45 /CALL SETUP. 16 /.. MTSF /MAG TAPE DONE OR ERROR FLAG. MTINT /GO HERE ON INTERRUPTS. LAC .+2 /DON'T CALL .SETUP AGAIN. DAC MTINIT /.. JMP .+1 /.. MTLBH=MTINIT+1 /POINTER TO LINE BUFFER HEADER, WORD 0. MTSTAT=MTLBH+1 /MAG TAPE STATUS ON COMPLETION OF OPERATION. MTWRDS=MTSTAT+1 /COUNT OF WORDS TRANSFERRED FROM CURRENT BUFFER LOAD. MTSRT2=MTWRDS /SWITCH FOR SUCCESSFUL DEB COMPARE. MTEOFS=MTWRDS+1 /SWITCH FOR EOF ENCOUNTERED IN THIS FILE; ZERO IF SO. MTSRT1=MTEOFS /POINTER TO USER'S DEB DURING .SEEK PROCESSING. MTERSW=MTEOFS+1 /PARITY ERROR IN CURRENT INPUT RECORD; 20 IF SO, ZERO IF NOT. MTFNAM=MTERSW+1 /FILE NAME CALCULATED DURING .SEEK PROCESSING. MTSRCT=MTFNAM /THREE-WORD COUNTER FOR DEB COMPARE. MTRDP4=MTFNAM /CURRENT-OUTPUT-WORD POINTER (IN USER'S LINE) FOR .READ'S. LAC* MTCALP /CHECK IO DIRECTION, PICK UP CAL. AND MTRWDC /DIRECTION IS IN BIT 8; MTRWDC = 001000. SZA!CLC!CCL /SKIP IF INIT FOR INPUT. JMP MTERR7 /OUTPUT INIT, IOPS 7. TAD MTENI /FORM BUFFER SIZE; AC = 377(8) AFTER EXECUTION. ISZ MTARGP /POINT TO BUFFER SIZE LOCATION, DAC* MTARGP / AND UPDATE IT. ISZ MTARGP /POINT TO RETURN. LAC* (.SCOM+4 /7- OR 9-CHANNEL DEFAULT? AND MTWRTC /CHECK BIT 6 TO FIND OUT (MTWRTC = 004000). SZA!RTR /SKIP IF 7-CHANNEL. TAD MTLAC0 /9-CHANNEL, INSERT CORE-DUMP BIT. RTR /AND ROTATE FORMAT DIRECTIVES INTO POSITION. RAR /.. /IF 9-CHANNEL, AC = 020100; IF 7-CHANNEL, AC = 000000. DAC MTDFLT /SAVE DEFAULT CONDITION FOR LATER. LAC* MTTPTR /CLEAR OUT PREVIOUS STATUS BITS. AND (60301 /.. XOR* MTTPTR TAD MTSTND /INSERT STANDARD VALUES. TAD MTDFLT /THEN ADD IN 9-CHANNEL IF WANTED. DAC* MTTPTR /TABLE ENTRY IS COMPLETE. ISZ* MTTPTR /TURN ON INIT-PERFORMED. MTCLOS AND (2 /NOW EXTRACT FILE-OPEN. SZA /SKIP IF NO FILE OPEN ON THIS DRIVE. DZM MTBFTB /FILE IS OPEN, RELEASE ASSIGNED BUFFER. XOR* MTTPTR /TURN OFF FILE-OPEN. DAC* MTTPTR /AND RESTORE DRIVE STATUS. MTDBR DZM MTNEXT /TURN OFF IO SEQUENCER. DBR /DEBREAK, XCT .+1 /WAIT FOR API, JMP* MTARGP /AND RETURN TO CALLER. /SEEK FILE ON MAG TAPE. /CALLING SEQUENCE: / CAL+DAT(9-17) / UNIT(0-2)+3 / ADDRESS OF DEB /MTARGP POINTS HERE NOW. MTSEEK XOR MTNEXT /ARE WE IN THE MIDDLE OF SOME I/O OPERATION? SAD* MTTPTR /SKIP IF SO. SKP /AND SKIP IF NOT. JMP* MTNEXT /GO PERFORM NEXT TASK. XOR MTBFTB /GET COUNT OF FILES CURRENTLY OPEN. SAD* MTTPTR /SKIP IF A FILE IS NOW OPEN ON SOME UNIT. SKP!RTR /NO FILE OPEN, SKIP. JMP MTER17 /FILE ALREADY OPEN, IOPS 17. SMA!RTL /SKIP IF INIT PERFORMED. JMP MTERR7 /ERROR OTHERWISE. /GO REWIND AND SEARCH DIRECTORY. TAD MTRWDC /PLUS REWIND COMMAND. JMS MTRDWR /GO ISSUE REWIND. SZL /ILLEGAL RETURN; SKIP IF NOT BOT. JMP MTSK03 /OK, GO READ DIRECTORY. JMP MTIOP4 /NOT BOT, TAKE IOPS 4. MTSK03 JMS MTNEXT /WAIT FOR DRIVE. /NOW READ THE FILE DIRECTORY IN. JMS MTINPT /ISSUE READ REQUEST. AND MTXIRG /EXTRACT EOF-ENCOUNTERED. SZA!CLL!CML /SKIP IF EOF NOT ENCOUNTERED; MEANS OLD-STYLE DIRECTORY. JMP MTSK03+1 /NEW-STYLE DIRECTORY, GO READ DIRECTORY BLOCK PROPER. /DIRECTORY IS IN CORE. MAKE SURE DIRECTORY FORMAT IS CORRECT (BCP WORD 1 /SHOULD EQUAL 747377; MAG TAPE WORD COUNT REGISTER SHOULD EQUAL ZERO). LAW 3577 /SET UP AC TO LOOK LIKE DIRECTORY BCP 1. RAL /AC = 747377 AFTER EXECUTION. XOR MTBUFF /COMPARE WITH BCP WORD 1. SZA /SKIP IF SUCCESSFUL COMPARE. JMP MTER41 /BCP 1 .NE. 747377, IOPS 41. SAD* MTWCR /NOW ENSURE THAT RECORD LENGTH IS 401(8). SKP!CLA!CMA /RECORD LENGTH IS OK, SKIP. JMP MTER41 /BAD RECORD LENGTH, IOPS 41. /SEEMS LIKE IT REALLY IS A DIRECTORY BLOCK; SEARCH DIRECTORY FOR NAME OF /FILE BEING SOUGHT. XOR MTL777 /TURN OFF BITS 0-8; BITS 9-17 = 777. AND MTBUFF+2 /EXTRACT ACTIVE FILE COUNT. TAD MTL777 /FILL UP LEFT HALF. DAC MTCACT /SAVE ONE'S COMPLEMENT ACTIVE COUNT. /SET UP ADDRESS OF FIRST FILE-NAME ENTRY. LAC MTSRS1 /PICK UP "LAC MTBUFF+2"; IT WILL BE USED TO GET DAC MTEXPT / SUCCESSIVE WORDS IN ACCESSIBILITY MAP. TAD (17 /THEN MAKE IT "LAC MTBUFF+21" DAC MTSRL2 / AND USE THAT TO ACCESS THE FILE-NAME SECTION. DZM MTACCM /ZERO RELATIVE-FILE-POSITION COUNTER. /NOW BEGIN THE SEARCH. MTSRL1 LAW -3 /COUNT THREE WORDS EACH ENTRY. DAC MTSRCT /.. LAC* MTARGP /POINTER TO DEB GOES TO DAC MTSRT1 / INTERNAL POINTER. ISZ MTCACT /COUNT FILE NAMES CONSIDERED. SKP /MORE TO DO. JMP MTER13 /FILE NOT FOUND, IOPS 13. DZM MTSRT2 /SUCCESSFUL-COMPARE SWITCH. /ENTER LOOP TO COMPARE THE DEB PROVIDED BY CALLER WITH THE DEB CURRENTLY /UNDER CONSIDERATION IN THE DIRECTORY. /THE FOLLOWING INSTRUCTION WAS SET UP AT MTSRL1-2 AND IS MODIFIED AT /MTSRL2+3. MTSRL2 LAC MTBUFF+21 /LAC MTBUFF+21,+22,...,+400 MTEXPC=.-1 MTSKEF=.-1 /SWITCH FOR LAST-ENCOUNTERED RECORD WAS EOF DURING SEEK; NON-ZERO IF SO. MTDFLT=.-1 MTRDP3=.-1 /CURRENT-INPUT-WORD POINTER FOR READ. XOR* MTSRT1 /COMPARE CORRESPONDING WORDS IN TWO DEB'S. ISZ MTSRT1 /BUMP POINTER TO CALLER'S DEB. ISZ MTSRL2 /AND ADDRESS PORTION OF THE LAC OF DIRECTORY WORD. SZA /NOW SKIP IF THE TWO WORDS MATCHED. DAC MTSRT2 /TWO WORDS DID NOT COMPARE; TURN OFF GOOD-COMPARE SWITCH. ISZ MTSRCT /COUNT WORDS CONSIDERED IN THIS DEB. JMP MTSRL2 /MORE TO DO, GO BACK AND CHECK NEXT PAIR. /COMPARED THREE WORDS, CHECK FOR SUCCESS. LAC MTSRT2 /MTSRT2 .E. 0 IF ALL THREE WORDS MATCHED. SNA!CLA!CMA /SKIP IF BAD COMPARE. JMP MTSRFD /GOOD COMPARE. ISZ MTACCM /FILE NAME MISMATCH, INDEX DEB-POSITION COUNTER. JMP MTSRL1 /THEN GO BACK TO CHECK NEXT ENTRY IN MAG TAPE DIRECTORY. /COME HERE ON FILE NAME FOUND IN DIRECTORY. TRANSLATE FILE-NAME POSITION /IN DIRECTORY (IN REGISTER MTACCM) INTO PHYSICAL FILE POSITION ON TAPE. /IDEA IS TO COUNT BITS IN THE ACCESSIBILITY MAP UNTIL THE NTH ONE-BIT /IS FOUND. MTSRFD XOR MTACCM /FORM 2'S COMPLEMENT FILE-NAME POSITION IN DIRECTORY DAC MTACCM / (AC .E. 777777 BEFORE EXECUTION OF XOR). DZM MTEXPC /INITIALIZE PHYSICAL-FILE-POSITION COUNTER. MTEXL1 ISZ MTEXPT /INDEX LAC OF MAP WORD. LAW -22 /SET UP 18-BIT COUNTER FOR DAC MTEXBC / CURRENT WORD IN ACCESSIBILITY MAP. /THE FOLLOWING INSTRUCTION WAS SET UP AT MTSRL1-4 AND IS MODIFIED AT MTEXL1. MTEXPT LAC MTBUFF+2 /LAC MTBUFF+3,+4,...,+20 MTSKCT=MTEXPT /COUNT OF FILES TO SKIP OVER DURING TAPE SEARCH. MTRCT1=MTEXPT /COUNT OF WORDS IN CURRENT INPUT LINE DURING .READ PROCESSING. MTEXL2 RAL /CHECK ACCESSIBILITY STATUS OF NEXT PHYSICAL FILE. SZL /SKIP IF THIS FILE IS INACTIVE. ISZ MTACCM /FILE IS ACTIVE. IS IT THE ONE WANTED? SKP /NO. RESUME SEARCH OF ACCESSIBILITY MAP. JMP MTEXFD /YES. GO SCAN THE TAPE FOR THIS FILE. ISZ MTEXPC /COUNT PHYSICAL FILES PRESENT. ISZ MTEXBC /COUNT BITS IN MAP WORD. JMP MTEXL2 /LOOK AT NEXT BIT IN CURRENT MAP WORD. JMP MTEXL1 /THIS WORD IS EXHAUSTED; TRY NEXT WORD. MTEXFD LAC MTEXPC /PICK UP POSITION OF FILE IN ACCESSIBILITY MAP. CMA /INVERT, DAC MTSKCT / AND SAVE AS 2'S COMPLEMENT COUNT OF EOF'S TO SKIP. DAC MTFNAM /SAVE ALSO AS FILE NAME APPEARING IN LABEL. DZM MTSKEF /THEN TURN OFF EOF-ENCOUNTERED SWITCH. MTSK05 JMS MTINPT /SPACE OVER ONE RECORD. AND MTXIRG /EOF PASSED? SNA /SKIP IF SO. JMP MTSK05-1 /IF NOT, SPACE OVER ANOTHER RECORD. SAD MTSKEF /HAVE WE SEEN 2 EOF'S IN SUCCESSION? JMP MTER44 /YES; UNEXPECTED LOGICAL EOT, IOPS 44. DAC MTSKEF /NO, SET MTSKEF FOR TEST ON NEXT RECORD. ISZ MTSKCT /AND COUNT THE FILE JUST PASSED. JMP MTSK05 /MORE RECORDS TO SKIP OVER. /WE ARE NOW POSITIONED TO READ FILE HEADER LABEL. JMS MTINPT /READ LABEL. /RETURN HERE WITH LABEL IN CORE. LAW 10033 /CHECK BCP WORD 1. TAD MTBUFF /IT SHOULD BE 007745. SZA!CLL!CML /SKIP IF BCP WORD 1 IS OK. JMP MTER40 /BCP WORD 1 .NE. 007745, IOPS 40. MTSRS1 LAC MTBUFF+2 /PICK UP FILE NAME FROM LABEL. XOR MTFNAM /SHOULD BE SAME AS CALCULATED NAME. SZA!RTL /SKIP IF TWO NAMES MATCH. JMP MTER40 /BAD FILE-NAME COMPARE, IOPS 40. DAC MTBFTB /INDICATE A FILE IS OPEN (AC .E. 2 NOW). ISZ* MTTPTR /TURN ON FILE-OPEN. ISZ* MTTPTR /AND RESTORE INIT-PERFORMED. /ALL SET AT LAST. MTSK06 ISZ MTARGP /BUMP MTARGP TO POINT TO RETURN. JMP MTDBR /THEN GO BACK TO CALLER. /READ MAG TAPE. /CALLING SEQUENCE: / CAL+MODE(6-8)+DAT(9-17) / UNIT (0-2)+10 / LINE BUFFER ADDRESS /MTARGP POINTS HERE ON ENTRY. / WORD COUNT MAX MTREAD XOR MTNEXT /IS IO SEQUENCER ON? SAD* MTTPTR /SKIP IF SO. SKP!RTR /STARTING NEW .READ, SKIP. JMP* MTNEXT /MOVING TAPE, GO TO NEXT OPERATION. SNL /SKIP IF A FILE IS OPEN. JMP MTER11 /NO .SEEK EXECUTED, IOPS 11. LAW 14000 /ENSURE MODE 0,1,2, OR 3. TAD* MTCALP /MODE IS IN CAL, BITS 6-8. SMA!CLA!CCL /SKIP IF MODE IS 0-3 (MINUS AC). JMP MTERR7 /ILLEGAL DATA MODE, IOPS 7. SAD MTEOFS /DID EOF OCCUR ON A PREVIOUS READ REQUEST? JMP MTEOFP /THERE WAS AN EOF IF MTEOFS .E. 0. MTRIF1 LAC MTBUFF /PICK UP CURRENT COUNT. TAD MTWRDS /LESS TOTAL WORDS ALREADY READ. SMA!CLA!RAL /SKIP IF MORE WORDS TO TRANSFER. JMP MTRFIL /BUFFER IS EMPTY, GO REFILL IT. TAD (MTBUFF-1 /FIND FIRST DATA WORD. TAD MTWRDS /PLUS WORDS READ SO FAR. DAC MTRDP3 /GIVES NEW-LINE POSITION. MTL777 LAW 17000 /CHECK WORD COUNT. AND* MTRDP3 /PICK UP LINE HEADER. CLL!RAL /BIT 1 TO SIGN; AC 0-8 = WORD-PAIR-COUNT * 2. SNA!SPA /SKIP IF BIT 1 .E. 0, BUT TOTAL COUNT .G. 0. JMP MTER23 /ILLEGAL WORD PAIR COUNT (WPC .G. 177 OR 0), IOPS 23. DAC MTRCT1 /SAVE POSITIVE WORD COUNT. LAC* MTARGP /PICK UP ADDRESS OF USER'S LINE BUFFER. DAC MTRDP4 /SAVE IN OUTPUT POINTER. DAC MTLBH /AND IN HEADER-WORD-0 POINTER. ISZ MTARGP /THEN BUMP MTARGP TO MAXIMUM WORD COUNT. AND (700000) /(RCHM-100) EXTRACT HIGH ORDER ADDRESS BITS. SZA /(RCHM-100) ARE ANY ON? JMP MTER67 /(RCHM-100) YES, GIVE INVALID MEMORY ERROR. LAC* MTARGP /PICK UP COUNT. DAC MTRCT2 /AND SAVE IT. /ENTER LOOP TO MOVE REQUESTED LINE FROM MAG TAPE BUFFER TO USER'S /LINE BUFFER AREA. MTRLP1 LAC* MTRDP3 /PICK UP NEXT WORD. DAC* MTRDP4 /PUT IN CALLER'S AREA. ISZ MTRDP3 /BUMP INPUT ADDRESS. ISZ MTRDP4 /AND OUTPUT ADDRESS. ISZ MTWRDS /UPDATE TOTAL WORDS MOVED FROM CURRENT BUFFER LOAD. LAC MTRCT1 /DECREMENT COUNT OF WORDS IN LINE. TAD MTL777 /COUNT IS IN BITS 0-8. DAC MTRCT1 /SAVE NEW COUNT. SNA /SKIP IF MORE TO DO. JMP MTRLP2 /ALL WORDS MOVED, GO FINISH UP. ISZ MTRCT2 /TEST UPPER LIMIT OF WORDS TO TRANSFER. JMP MTRLP1 /ROOM FOR MORE WORDS IN USER'S LINE. LAC MTRDP3 /OVERFLOWED USER'S AREA, DAC MTRDP4 / TURN OFF TRANSFERS. JMP MTRLP1 /THEN GO CONTINUE COUNTING. /ALL DONE, SET UP VALIDITY BITS AND RETURN. MTRLP2 LAW 17717 /CLEAR HEADER BITS 12-13. AND* MTLBH /.. DAC* MTLBH /.. XOR MTERSW /NOW CHECK FOR PARITY ERROR ON CURRENT RECORD. SAD* MTLBH /SKIP IF A PARITY ERROR DID OCCUR. SKP /NO ERROR, CHECK FOR LINE BUFFER OVERFLOW. JMP MTRLP3 /BYPASS OVERFLOW CHECKING IF PARITY ERROR. LAC MTRDP3 /DID OVERFLOW OCCUR? XOR MTRDP4 /MTRDP3 .E. MTRDP4 IF SO. SNA!CLA /SKIP IF NO OVERFLOW. LAC (60 /OVERLOW, TURN ON BITS 12-13. TAD* MTLBH /.. MTRLP3 DAC* MTLBH /RESTORE HEADER WITH VALIDITY BITS SET. JMP MTSK06 /THEN RETURN TO CALLER. /COME HERE TO REFILL INPUT BUFFER. MTRFIL JMS MTINPT /READ NEXT RECORD. SMA /SKIP IF ERROR ON READ. JMP MTCKBL-1 /NO ERROR, GO PROCESS INPUT RECORD. AND MTXIRG /EXTRACT EOF STATUS BIT. SZA!CLA /SKIP IF NOT EOF. JMP MTPTEF /EOF, SET UP INDICATOR (AC = 0 NOW). LAC MTSTAT /RETRIEVE STATUS. AND (020200 /EXTRACT PARITY AND BAD TAPE. SZA!CLL!CML /SKIP IF NOT PARITY OR BAD TAPE. JMP MTRAGN /REAL READ ERROR, GO TRY TO READ AGAIN. LAC MTSTAT /GET STATUS AGAIN. AND MTWRTC /EXTRACT EOT. SZA!CLA!RAL /NOT EOT, SKIP. JMP MTPTEF /EOT, SO INDICATE (AC = 1 NOW). LAC MTSTAT AND MTENI /EXTRACT DATA LATE. SZA!CLA /SKIP IF NOT DATA LATE. JMP MTRAG1 /DATA LATE, REREAD WITHOUT COUNTING. SAD* MTWCR /SKIP IF WORD COUNT .NE. 0. JMP MTER45 /WC .E. 0 MEANS LONG RECORD; IOPS 45. DZM MTERSW /INDICATE NO ERRORS IN THIS RECORD. MTCKBL LAW 10000 /TRANSFER OK. PICK UP BCP WORD 1. AND MTBUFF /EXTRACT BLOCK IDENTIFIER. XOR MTLAC0 /IS THIS A USER DATA BLOCK? SZA!CLA!CCL /USER DATA RECORD, SKIP. JMP MTPTEF /NOT USER DATA, TREAT AS EOF. LAC MTBUFF /USER DATA, SET UP COUNT. XOR MTLAC0 /TURN OFF BIT ONE. TAD MTCKBL /.. JMP MTRRTN /COME HERE ON EOF ENCOUNTERED. MTPTEF TAD (001005 /EOF OR EOT HEADER. DAC MTBUFF+2 /.. CMA!CCL /FORM CHECKSUM. DAC MTBUFF+3 /.. ISZ MTBUFF+3 /MAKE TWO'S COMPLEMENT. DZM MTEOFS /INDICATE EOF OR EOT ENCOUNTERED. MTEOFP LAW -4 MTRRTN DAC MTBUFF LAC (2 DAC MTWRDS LAW -25 /SET UP ERROR REREAD COUNTER DAC MTERCT / FOR NEXT TIME. JMP MTRIF1 /COME HERE TO SET UP REREAD. FIRST, BACKSPACE OVER ERROR RECORD. MTRAGN ISZ MTERCT /COUNT THIS TIME THROUGH ERROR LOOP. MTRAG1 SKP!CLA!CMA /MORE REREADS ALLOWED. JMP MTIREC /TOO MANY READ ERRORS. DAC* MTWCR /SET UP WORD COUNT TO BACKSPACE ONE. LAC* MTTPTR /BUILD BACKSPACE COMMAND. TAD MTBSPC /.. JMS MTRDWR /GO START UP BACKSPACE. JMP MTRD04 /ILLEGAL, IOPS 4. JMS MTNEXT /WAIT FOR SETTLE-DOWN. JMP MTRFIL /THEN GO REREAD ERROR RECORD. MTIREC LAC (20 /20 REREAD ATTEMPTS WITHOUT SUCCESS, TURN ON BIT 13. DAC MTERSW /INDICATES PERMANENT READ ERROR. JMP MTCKBL MTRD04 LAC (MTRAG1 JMP MTIOP4+1 MTER67 LAW 50 /(RCHM-100) PICK UP PRECURSOR TO IOPS 67 ERROR JMP MTER23+1 /(RCHM-100) GO PRINT ERROR MESSAGE. MTER45 ISZ MTERNO /LONG INPUT RECORD. MTER44 LAW 25 /UNEXPECTED LOGICAL EOT FOUND ON SEEK/ENTER. JMP .+3 /IGNORE IOPS 42-43. MTER41 ISZ MTERNO /DIRECTORY FORMAT ERROR. MTER40 LAW 21 /HEADER LABEL ERROR. SKP MTER23 LAW 4 /ILLEGAL WORD PAIR COUNT. TAD MTERNO DAC MTERNO MTER17 ISZ MTERNO /TOO MANY FILES. ISZ MTERNO /OUTPUT BUFFER OVERFLOW. ISZ MTERNO /PHYSICAL EOT FOUND ON WRITE. ISZ MTERNO /DIRECTORY FULL. MTER13 ISZ MTERNO /FILE NOT FOUND. ISZ MTERNO /EOT ENCOUNTERED ON SPACE FORWARD. MTER11 ISZ MTERNO /SEEK-ENTER NOT EXECUTED. ISZ MTERNO /FILE STILL ACTIVE. MTERR7 ISZ MTERNO /ILLEGAL DATA MODE. MTERR6 ISZ MTERNO /ILLEGAL FUNCTION. ISZ MTERNO /BYPASS IOPS 5. MTIOP4 LAC MTCALP /PICK UP POINTER TO CAL INSTRUCTION. DAC* (.MED /GIVE TO .MED. DZM MTNEXT /TURN OFF IO SEQUENCER. LAC MTERNO /PICK UP ERROR NUMBER. JMP* (.MED+1 /THEN GO TO .MED + 1. /EXECUTE WAIT, WAITR ON MAG TAPE. /CALLING SEQUENCE / CAL+CODE(8)+DAT(9-17) / 12 / NON-BUSY RETURN (WAIT) OR POINTER TO BUSY RETURN (WAITR) / NON-BUSY RETURN (WAITR) /WHERE CODE IS 0 FOR WAIT, 1 FOR WAITR. /FIRST, FIND OUT WHETHER WAIT OR WAITR IS WANTED. MTWAIT LAC* MTCALP /WAIT OR WAITR? AND MTRWDC /EXTRACT BIT 8. (MTRWDC = 001000) SZA /SKIP IF WAIT. ISZ MTARGP /WAITR, BUMP TO NON-BUSY RETURN. LAC MTSTAT /(JMW:101) RETURN STATUS IN AC. JMP MTDBR /THEN RETURN THROUGH ARGUMENT POINTER. /SUBROUTINE MTINPT, ISSUE READ FOR STANDARD MAG TAPE RECORD. MTINPT 0 MTCACT=MTINPT LAW -401 /READ 257(10) WORDS. DAC* MTWCR /SET UP WORD COUNT. LAC (MTBUFF-1 /READ INTO BUFFER PROPER. DAC* MTCAR /SET UP CURRENT ADDRESS. LAC* MTTPTR /FORM A READ COMMAND. TAD MTREDC /.. JMS MTRDWR /AND GO START UP IO. JMP MTIOP4 /ILLEGAL (DRIVE NOT DIALED UP), IOPS 4. JMS MTNEXT /GO WAIT FOR SETTLE-DOWN. LAC MTSTAT /PICK UP STATUS. JMP* MTINPT /THEN RE-ENTER MAIN LINE. /DRIVE STATUS TABLE FOR MTC. /BITS 0-2: UNIT NUMBER (0-7). /BIT 3: PARITY FOR THIS UNIT (1=ODD, 0=EVEN). /BIT 4: CORE DUMP; 0 IF 7-CHANNEL, 1 IF 9-CHANNEL. /BIT 5: WRITE EXTENDED IRG; UNUSED IN MTC. /BITS 6-8: COMMAND; MUST ALWAYS BE ZERO. /BIT 9: INTERRUPT ON; SHOULD ALWAYS BE ONE. /BITS 10-11: DENSITY FOR THIS UNIT. 10-11 ON MEANS 9-CHANNEL. /BITS 12-15: UNUSED. /BIT 16: FILE OPEN ON THIS DRIVE? 0=NO, 1=YES. /BIT 17: INIT PERFORMED? 0=NO, 1=YES. MTDSTB=. 040400 140400 240400 340400 440400 540400 640400 740400 .EJECT /MAG TAPE INTERRUPT SECTION. MTINT SKP /SKIP IF PIC ENTRY. JMP MTAPI /API ENTRY. DAC MTAC /SAVE AC. LAC* MTLAC0 /GET PC. DAC MTPC /SAVE IT, TOO. LAC (ION /GET ION CODE. JMP MTSETI /AND ENTER MAIN PROCESSOR. MTAPI DAC MTAC /SAVE AC LAC MTINT /GET PC. DAC MTPC /SAVE IT. LAC MTNOP /LEAVE PIC ALONE ON EXIT. MTSETI DAC MTION /SET UP EXIT INTERRUPT CONDITION. LAC MTSKIP /RESTORE PIC ENTRY. DAC MTINT /.. MTRS /READ STATUS DAC MTSTAT /SAVE STATUS DAC* (.SCOM+21 /(JMW:101) RETURN STATUS IN .SCOM+21. RTL /SKIP IF ERROR. RAL /EXTRACT ILLEGAL BIT. SMA /SKIP IF ILLEGAL. ISZ MTRDWR /BUMP MTRDWR TO SUCCESSFUL-TRANSFER RETURN. MTAF /CLEAR OUT MAG TAPE FLAG. MTION NOP /OR ION, IF WE GOT HERE VIA A PIC INTERRUPT. JMP* MTRDWR /COME HERE TO PERFORM ALL ACTUAL MAG TAPE IO OPERATIONS, VIA /"JMS MTRDWR". MTRDWR 0 /ENTRY TO PERFORM MAG TAPE IO. MTLC /COMMAND FROM AC TO COMMAND REGISTER. LAC MTAC /PICK UP INTERRUPT AC. MTGO /TURN ON GO. MTIRET DBR /DEBREAK, EITHER FROM LEVEL 4 OR LEVEL 1. XCT MTEXIT /RETURN TO MAIN PROGRAM. MTEXIT JMP* MTPC /EXIT FROM INTERRUPT SERVICE WHEN MORE IO REQUIRED. MTNEXT 0 MTRCT2=MTNEXT LAC MTAC /RESTORE AC. JMP MTIRET /THEN GET OUT. .EJECT /UNTOUCHABLE VARIABLES. DON'T USE THESE REGISTERS FOR ANYTHING ELSE. MTAC 0 /AC ON INTERRUPTS. MTPC 0 /PC ON INTERRUPTS. MTCALP 0 /POINTER TO CAL CURRENTLY IN PROCESS. MTARGP 0 /POINTER TO CAL ARGUMENT LIST. MTTRSW LAW -1750 /COUNTER FOR 1000 TIMES THROUGH WAIT LOOP. MTERCT LAW -25 /COUNTER FOR 20 REREADS OF ERROR RECORD. MTBFTB 0 /IS BUFFER IN USE? ZERO = NO, NON-ZERO = YES. MTERNO 0 /IOPS ERROR NUMBER; SET TO 4 BY CAL PROCESSOR. MTTPTR 0 /POINTER TO CURRENT ENTRY IN DRIVE STATUS TABLE. /CONSTANTS -- /COMMAND REGISTER BITS 6-8. MTRWDC 1000 /REWIND MTREDC 2000 /READ MTWRTC 4000 /MASK FOR EOT STATUS. MTBSPC 7000 /SPACE REVERSE. MTENI 400 /MASK FOR DATA-LATE STATUS. MTWCR 32 /WORD COUNT. MTCAR 33 /CURRENT ADDRESS. MTXIRG 10000 /MASK FOR EOF STATUS. MTLAC0 200000 /BLOCK IDENTIFIER FOR USER DATA RECORDS. MTSTND 040200 /STANDARD TAPE FORMAT (7-CHANNEL, ODD PARITY, 800 BPI). /MAG TAPE COMMAND REGISTER FORMAT -- /BITS 0-2 UNIT NUMBER (0-7) /BIT 3 PARITY (1=ODD, 0=EVEN) /BIT 4 CORE DUMP (1=USE CORE DUMP MODE, 0=USE 9-CHANNEL MODE) /BIT 5 EXTENDED IRG (1=WRITE 3" GAP BEFORE RECORD. /BITS 6-8 COMMAND /BIT 9 CONNECT TO INTERRUPT (1=YES, 0=NO) /BITS 10-11 DENSITY /BITS 12-17 IGNORED BY TAPE CONTROL /MAG TAPE STATUS REGISTER BIT ASSIGNMENTS -- /BIT 0 ERROR FLAG /BIT 1 TAPE REWINDING /BIT 2 BOT /BIT 3 ILLEGAL /BIT 4 PARITY ERROR /BIT 5 EOF /BIT 6 EOT /BIT 7 READ-COMPARE ERROR /BIT 8 RECORD LENGTH INCORRECT /BIT 9 DATA REQUEST LATE /BIT 10 BAD TAPE /BIT 11 MAG TAPE FLAG .END