C PROGRAM MAGTAP.FT C ----------------- C C C C MAGTAP - A TC58 MAGTAPE HANDLER FOR OS/8 FORTRAN II. C --------------------------------------------------- C C C C C C C SUBROUTINE MAGTAP(NUMB,ADDR,JCMD,IFLAG,IBYTE,IUNIT) C C C RAY GLASS AND PETER LEMKIN C NATIONAL INSTITUTES OF HEALTH C BETHESDA, MD. 20014 C C OCTOBER 11, 1972 C REVISED DEC 4, 1972 C C C ABSTRACT C ------------ C "MAGTAP" IS AN OS/8 FORTRAN II SUBROUTINE WHICH C ENABLES THE USER TO CONTROL EITHER A TU10 C OR A TU20 9 TRACK MAGTAPE DRIVE UTILIZING C THE TC58 CONTROLLER. THIS MAGTAPE DEVICE HANDLER C ALLOWS THE USER TO READ, WRITE, READ-COMPARE, C SPACE BACKWARDS, SPACE FORWARD, WRITE END OF FILE, C CHECK FOR BEGINING OR END OF TAPE, CHECK C FOR END OF FILE MARK, AND REWIND THE TAPE. MAGTAP RUNS C WITH INTERRUPTS OFF. C C C C C**PAGE C I.INTRODUCTION C ------------ C "MAGTAP" IS AN OS/8 FORTRAN II SUBROUTINE WHICH C ENABLES THE USER TO CONTROL EITHER A TU10 C OR A TU20 9 TRACK MAGTAPE DRIVE UTILIZING C THE TC58 CONTROLLER. THIS MAGTAPE DEVICE HANDLER C ALLOWS THE USER TO READ, WRITE, READ-COMPARE, C SPACE BACKWARDS, SPACE FORWARD, WRITE END OF FILE, C CHECK FOR BEGINING OR END OF TAPE, CHECK C FOR END OF FILE MARK, AND REWIND THE TAPE. C MAGTAPE RUNS WITH INTERRUPTS OFF. HOWEVER, BY A MINOR C MODIFICATION, THE "TINT" ROUTINE COULD BE USED TO SERVICE C MAGTAP INTERRUPTS. C C C C C C C C II.EXAMPLE OF USING MAGTAP C ---------------------- C AN EXAMPLE OF A CALL TO MAGTAP IS GIVEN BELOW: C C "CALL MAGTAP(200,ADDR,4,IFLAG,0,1)" C C THIS CALL WILL CAUSE 200 DECIMAL PDP8 WORDS TO BE WRITTEN C ON MAGTAPE UNIT 1, FROM LOCATION "ADDR". THE WORD C "ADDR" IS THE LOCATION OF THE FORTRAN ARRAY IN C THE PDP8. THE 4 IS THE COMMAND TO WRITE DATA ONTO C THE MAGTAPE. THE WORD 'IFLAG' IS SET TO 0 C OR -1 BY THE MAGTAP SUBROUTINES, AND IS C USED AS A FLAG TO SIGNAL IF A TEST IS TRUE C OR FALSE. THE NEXT TO LAST ARGUMENT, 0, INDICATES C THAT BYTE MODE IS TO BE USED WHEN WRITING ONTO C THE MAGTAPE. THE LAST ARGUMENT, 1, INDICATES UNIT 1 IS C TO BE USED. C C C C C C C III.ARGUMENT LIST C ------------- C C NUMB /THE NUMBER OF WORDS TO BE TRANSFERED C /TO OR FROM THE MAGTAP. 4096 C /WORDS OR BYTES, IS THE MAXIMUM SIZE C /FOR THE ARGUMENT 'NUMB'. C C ADDR /THE FORTRAN VARIABLE ARRAY USED TO C /SPECIFY WHERE DATA IS READ OR WRITTEN. C C JCMD /THIS COMMAND RANGES OVER 0 TO 13. C /AND DISPATCHES THE FUNCTION SPECIFIED C /IN THE JCMD TABLE, (SECTION IV). C C IFLAG / TRUE =0, FALSE =-1 C /IFLAG IS SET BY TESTS JCMD=[8 THROUGH 13] C /THIS "FLAG" IS USED TO TEST IF COMMANDS C /8 THROUGH 13 HAVE A TRUE OR FALSE RESULT. C C IBYTE / 0 IS BYTE MODE, -1 IS CORE DUMP MODE C C IUNIT /THE UNIT NUMBER OF THE MAGTAPE DRIVE C /MUST BE FROM 0 TO 7. C C C C C DEFINITION OF BYTE MODE: C ------------------------ C A BYTE (THE RIGHT 8 BITS OF A PDP8 WORD WHERE) C BITS 0-3 ARE NOT USED.) IS TRANSFERED TO THE 9 TRACK C MAGTAPE AS A ONE TAPE FRAME. THIS IS CONSTRUCTED C IN THE FOLLOWING MANNER: BITS 1 TO 8 ARE C AN 8-BIT BYTE WORD, AND BIT 9 IS THE PARITY BIT. C THIS MEANS THAT PDP8 BITS 4-11 ARE NOW MAGTAPE C BITS 1 TO 8. C C C C CORE DUMP MODE C -------------- C A PDP8 12-BIT WORD IS TRANSFERED TO THE 9 C TRACK MAGTAPE AS TWO CONSECUTIVE 6-BIT BYTES. EACH C TAPE WORD IS CONSTRUCTED AS FOLLOWS: C BIT 9 IS USED AS A PARITY BIT, BITS 1 AND C 2 ARE NOT USED, BITS 3 TO 6 ARE THE 6 BIT BYTE, C IE:THE FIRST PART OF THE 12 BIT PDP8 WORD C IS BITS 0-5. THE SECOND PART OF THE 12 BIT WORD C IS BITS 6-11. C C C C C C C**PAGE C C IV. JCMD COMMAND TABLE ASSIGNMENTS. C ------------------------------ C JCMD FUNCTION C ---- -------- C 0 NO OPERATION (NOP ) C C NUMB:IGNORED C ADDR:IGNORED C JCMD:USED C IFLAG:IGNORED C IBYTE:IGNORED C IUNIT:IGNORED C C C 1 REWIND THE TAPE C C NUMB:IGNORED C ADDR:IGNORED C JCMD:=1 C IFLAG:IGNORED C IBYTE:IGNORED C IUNIT:UNIT # C C C 2 READ 1 RECORD FROM THE TAPE. C A RECORD MAY BE ANY NUMBER OF C WORDS,DEPENDING ON THE SIZE OF C "NUMB". C C NUMB:USED C ADDR:USED C JCMD:=2 C IFLAG:IGNORED . C IBYTE:USED C IUNIT:UNIT # C C C 3 READ/COMPARE 1 RECORD FROM THE TAPE. C C NUMB:USED C ADDR:USED C JCMD:=3 C IFLAG:IGNORED C IBYTE:USED C IUNIT:UNIT # C C 4 WRITE 1 RECORD ONTO THE TAPE. C C NUMB:USED C ADDR:USED C JCMD:=4 C IFLAG:IGNORED . C IBYTE:USED C IUNIT:UNIT # C C C 5 WRITE END OF FILE C C NUMB:IGNORED C ADDR:IGNORED C JCMD:=5 C IFLAG:IGNORED C IBYTE:USED C IUNIT:UNIT # C C C 6 SPACE FORWARD 1 RECORD. C C NUMB:USED C ADDR:IGNORED C JCMD:=6 C IFLAG:IGNORED C IBYTE:USED C IUNIT:UNIT # C C C 7 SPACE REVERSE 1 RECORD. C C NUMB:USED C ADDR:IGNORED C JCMD:=7 C IFLAG:IGNORED C IBYTE:USED C IUNIT:UNIT # C C C C C 9 TEST READ/WRITE ERROR-PARITY ERRORS. C C NUMB:IGNORED C ADDR:IGNORED C JCMD:=9 C IFLAG:INTERNALLY SET C IBYTE:IGNORED C IUNIT:IGNORED C C C C 10 TEST READ/COMPARE ERROR C C NUMB:IGNORED C ADDR:IGNORED C JCMD:=10 C IFLAG:INTERNALLY SET. C IBYTE:IGNORED C IUNIT:IGNORED C C C 11 TEST END OF FILE MARK C C NUMB:IGNORED C ADDR:IGNORED C JCMD:=11 C IFLAG:INTERNALLY SET C IBYTE:IGNORED C IUNIT:IGNORED C C C C 12 TEST BEGINING OF TAPE MARK C C NUMB:IGNORED C ADDR:IGNORED C JCMD:=12 C IFLAG:INTERNALLY SET C IBYTE:IGNORED C IUNIT:IGNORED C C C 13 TEST END OF TAPE MARK C C NUMB:IGNORED C ADDR:IGNORED C JCMD:=13 C IFLAG:INTERNALLY SET C IBYTE:IGNORED C IUNIT:IGNORED C C C C C C**PAGE C C V. COMPILING AND LOADING C ------------------------ C . R FORT C *MAGTAP.RL,MAGTAP.LS<--MAGTAP.FT C .R LOADER C *MAIN AND ANY SUBROUTINES... C *MAGTAP.RL/0 - LOAD INTO ANY FIELD. C * ETC... C *LIB8/L$ C .SAVE SYS:MAIN ETC... C C C C VI. ADDITIONAL INFORMATION C ---------------------- C FOR A COMPLETE DESCRIPTION OF WHICH C MAGTAPE COMMANDS MUST BE USED AND WHICH C COMMANDS MAY BE IGNORED FOR ANY CALL C TO THIS SUBROUTINE SEE: INSTRUCTION MANUAL C ------------------ C MAGNETIC TAPE CONTROL-TC58, SECTION 2.6 C --------------------------------------- C OF DEC-08-I4AA-D , MARCH 1968. C ------------------------------- C C C C C C C C C C C C C C NEW SABR OPERATORS C -------------------- S OPDEF JMPI 5400 /TO PREVENT EXTRA CODE S OPDEF DCAI 3400 /TO PREVENT DUMMY SABR INDIRECTS S OPDEF MTAF 6712 /CLEAR THE STATUS AND COMMAND REGISTOR S OPDEF MTLC 6716 /LOAD THE CONTENTS OF AC0-11 INTO C /THE COMMAND REGISTOR S OPDEF MTGO 6722 /EXECUTE THE COMMAND IN THE COMMAND C /REGISTOR S OPDEF MTRS 6706 /READ CONTENSE OF STATUS REGISTOR S SKPDF MTCR 6711 /SKIP ON TAPE CONTROLL READY S SKPDF MTSF 6701 /SKIP ON ERROR FLAG OR MAGTAP FLAG S SKPDF MTTR 6721 /SKIP ON TAPE TRANSPORT READY C C C C C C**PAGE C ------------------------------------------------------ C C C 1.0 CALL BY VALUE, AND INITIALIZATION. ICMD=JCMD IDEV=1 C C C C C 1.2 THE COMMAND TELLS THE MAGTAPE WHAT TO DO. C IT IS INTERPRETED BY THE MAGTAPE ROUTINE IN ORDER TO C CONTROL THE MAGTAPE (MTA). C READ,REWIND,WRITE, ETC. C C C C C C C 2.IS COMMAND MINUS ? IF(ICMD)2,3,3 2 WRITE(IDEV,902)ICMD RETURN 902 FORMAT(5X,'BAD MAGTAP COMMAND. ICMD=',I5) C C C C C C C 3.TEST IF A MAGTAPE COMMAND OR TNTX COMMAND 3 IF(ICMD-7)4,4,500 S\4, TAD \ICMD S RTL;RAL S DCA \ICMD IF(IBYTE)41,40,41 C C C C C C 4.BYTE MODE O4O7 IS THE CONTROL WORD. S\40, TAD (0407 S DCA \KBYTE GOTO 42 C C C C C C 5.DUMP MODE O6O7-IS THE CONTROL WORD. S\41, TAD (0607 S DCA \KBYTE C C C C C C 6.SET UP THE WORD COUNT AND THE CURRENT ADDRESS C REGISTERS. S\42, TAD I \NUMB S CIA S CPAGE 3 S 6201 /CDF 0 S DCAI (7752 /PUT IN WC C FAKE A CDF S JMS 45 /CDFSKP S CLA S TAD \ADDR /GET THE FIELD S AND (0070 S DCA BFIELD /DATA FIELD S STA /LOAD -1 S TAD \ADDR# /GET THE ADDRESS S CPAGE 3 S 6201 /CDF 0 S DCAI (7753 /CURRENT ADDRESS C FAKE IT AGAIN S JMS 45 /CDFSKP S CLA C GET THE COMMAND S TAD \ICMD S AND (0070 /MAKE SURE S TAD \KBYTE /COMMAND MASK S DCA COMMAND C CHECK IF IUNIT IS LEGAL (0 TO 7) IF(IUNIT-7)63,63,64 64 WRITE(IDEV,65)IUNIT 65 FORMAT('IUNIT MUST BE FROM 0 TO 7 : ',I5) RETURN C C MOVE IUNIT INTO BITS 0 TO 2 FOR UNIT SELECTION. S\63, CLA S TAD I \IUNIT S RTL;RTL;RTL /LEFT SHIFT 6 BITS S RTL;RAL /LEFT SHIFT ANOTHER 3 S AND (7000 /MAKE SURE BITS 0 TO 2 S TAD COMMAND /FORM THE COMMAND S DCA COMMAND /FORM COMMAND, READY FOR COMMAND REG. C C C C C C 7.GO EXECUTE THE COMMAND S CPAGE 5 S JMS GOTAPE SCOMMAND, 0 /COMMAND FORMED FROM ICMD & COMMAND MASK. SBFIELD, 0 /DATA BUFFER FIELD FROM ADDR. C C C C C C 8.WAIT FOR TAPE TO FINISH EXECUTING THE COMMAND. S CPAGE 2 S JMS WTRDY RETURN C C C C C C C C **************** C INTERNAL SUBROUTINE WTRDY C IS USED TO WAIT UNTIL THE MAGTAP IS C READY. C CALLING SEQUENCE: C JMS WTRDY C RETURNS HERE WHEN READY. SWTRDY, 0 SWTTT, MTCR /IS CONTROL READY S JMP WTTT /NO S MTTR /IS THE DRIVE READY S JMP WTTT /NO S JMPI WTRDY /YES RETURN C C C C C C C C ******************** C INTERNAL SUBROUTINE GOTAPE C IS CALLED BY MAGTAP TO EXECUTE THE C TAPE COMMAND. C CALLING SEQUENCE: C JMS GOTAPE C COMMAND C FIELD C RETURN C C S CPAGE 23 SGOTAPE, 0 /PERFORM THE TAPE OPERATION. S MTAF /CLEAR TAPE CONTROL REGISTERS. S TAD I GOTAPE /GET THE COMMAND. S MTLC /LOAD THE COMMAND. S ISZ GOTAPE S CLA S CLA S TAD I GOTAPE /GET THE BUFFER FIELD. S MTGO /GO DO IT. SMTARDY, MTSF S JMP MTARDY S JMS TINT /GET THE STATUS OF THE MACHINE. S ISZ GOTAPE S JMPI GOTAPE /RETURN C C C C C C C C ********************* C INTERNAL SUBROUTINE TINT C IS USED TO SERVICE THE MAGTAP FAKE INTERUPT. C IT ACTUALLY SIMULATES THE SERVICING OF THE MTA C INTERUPT, SINCE NOT ACTUALLY AN INTERUPT. C IT SAVES THE STATUS OF THE MAGTAP AT THE C TIME OF INTERRUPT AND CLEARS THE COMMAND C AND INTERRUPT REGISTERS. C SERVICE THE MAGTAPE S CPAGE 15 STINT, 0 S CLA CLL S MTRS /READ MTA STATUS REGISTERS. S DCA TSTAT S 6724 /GET THE COMMAND REGISTER. S DCA TCOM S MTAF /CLEAR STATUS AND COMMAND REGISTERS. S JMPI TINT /RETURN C STCOM, 0 STSTAT, 0 C C C C C C C C *************************** C INTERNAL SUBROUTINE TNTX C SENSES THE TAPE CONDITION-THIS ROUTINE IS CALLED C BY THE USER,TO DETECT ERRORS,END OF FILE CONDITION C BEGINING OR END OF TAPE. IN ORDER FOR IT TO C WORK PROPERLY, A SIMULATED INTERUPT MUST HAVE C BEEN PROCESSED BY TINT. HOWEVER, IF C TNTX IS CALLED WHILE THE TAPE IS STILL BUSY C IT WILL WAIT FOR TAPE TO BECOME READY. C BY WHICH TIME AN INTERRUPT SHOULD HAVE BEEN C FIELDED. C RESULT OF TNTX C -------------- C IFLAG=0 IS TRUE C IFLAG=-1 IS FALSE C C C C C C 1.IF ICMD IS GREATOR THAN 13 WE HAVE AN C ERROR IN THE COMMAND. 500 IF(ICMD-13)501,501,2 501 IFLAG=0 C C C C C C 2.WAIT FOR TAPE S JMS WTRDY C C C C C C 3.GET THE COMMAND ICMD=ICMD-8 C C C C C C 4.DO A TABLE LOOKUP OF THE TAPE STATUS INDEXED C BY ICMD. S TAD \ICMD S TAD PTCND /I.E. THE TABLE ADDRESS. S DCA TN5 /INDEX OF TABLE. S TAD TSTAT /GET THE STATUS. S CPAGE 13 S AND I TN5 /AND IT AGAINST THE TABLE. S SNA CLA /SKIP IF HOLDS. S JMP \503 /ERROR RETURN STN5, 0 SPTCND, TCOND 503 IFLAG=-1 RETURN S CPAGE 6 STCOND, 0 S 1616 /READ/WRITE ERROR S 1636 /READ COMPARE ERROR S 0100 /EOF S 1000 /BOT S 0040 /EOT C C S\KBYTE,BLOCK 1 END