C PROGRAM MAGTAP.FT C ----------------- C C C C MAGTAP - A TC58 MAGTAPE HANDLER FOR OS/8 FORTRAN II. C --------------------------------------------------- C C C SUBROUTINE MAGTAP(NUMB,ADDR,ICMD,MTRS,IBYTE,IUNIT) C C C PETER LEMKIN C IPU, DBCD C NATIONAL CANCER INSTITUTE C NATIONAL INSTITUTES OF HEALTH C BETHESDA, MD. 20014 C C AUG 12 1976 - ADDED XTENDED GAP C AUG 11, 1976 - WORKS C AUG 8, 1976 - REVISED FROM OLD GLASS&LEMKIN ROUTINE. 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 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 ICMD /THIS COMMAND RANGES OVER 0 TO 13. C /AND DISPATCHES THE FUNCTION SPECIFIED C /IN THE ICMD TABLE, (SECTION IV). C C MTRS / RESULTS OF MTRS TC58 STATUS REGISTER AFTER COMMAND. C C IBYTE / 0 IS BYTE MODE, +1 IS CORE DUMP MODE C ADD +2 FOR WRITING EXTENDED GAP FOR WRITE AND EOF 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 C MTRS (OCTAL) STATUS BIT PATTERNS FOR VARIOUS CONDITIONS C ------------------------------------------------------- C 1616 - READ/WRITE ERROR C 1636 - READ/COMPARE ERROR C 0100 - EOF DETECTED C 1000 - BOT DETECTED C 0040 - EOT DETECTED C C MTRS BITS C --------- C 4000 - ERROR FLAG C 2000 - TAPE REWINDING C 1000 - BOT C 0400 - ILLEGAL COMMAND C 0200 - PARITY ERROR (LAT OR LONG) C 0100 - EOF C 0040 - EOT C 0020 - READ/COMPARE ERROR C 0010 - RECORD LENGTH (WC=0 LONG, WC NEQ 0 SHORT) C 0004 - DATA REQUEST LATE C 0002 - BAD TAPE C 0001 - MTF OR JOB DONE C C IV. ICMD COMMAND TABLE ASSIGNMENTS. C ------------------------------ C ICMD FUNCTION C ---- -------- C 0 NO OPERATION (NOP ) C C NUMB:- C ADDR:- C ICMD:=0 C MTRS: MTRS STATUS C IBYTE:- C IUNIT:- C C C 1 REWIND THE TAPE C C NUMB:- C ADDR:- C ICMD:=1 C MTRS: MTRS STATUS C IBYTE:- 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: # OF PDP8E WORDS TO TRANSFER C ADDR: TC58/PDP8 I/O BUFFER C ICMD:=2 C MTRS: MTRS STATUS . C IBYTE: BYTE(0)/CORE DUMP(1) C IUNIT:UNIT # C C C 3 READ/COMPARE 1 RECORD FROM THE TAPE. C C NUMB: # OF PDP8E WORDS TO TRANSFER C ADDR: TC58/PDP8 I/O BUFFER C ICMD:=3 C MTRS: MTRS STATUS C IBYTE: BYTE(0)/CORE DUMP(1) C IUNIT:UNIT # C C 4 WRITE 1 RECORD ONTO THE TAPE. C C NUMB: # OF PDP8E WORDS TO TRANSFER C ADDR: TC58/PDP8 I/O BUFFER C ICMD:=4 C MTRS: MTRS STATUS . C IBYTE: BYTE(0)/CORE DUMP(1) C IUNIT:UNIT # C C C 5 WRITE END OF FILE C C NUMB:- C ADDR:- C ICMD:=5 C MTRS: MTRS STATUS C IBYTE: BYTE(0)/CORE DUMP(1) C IUNIT:UNIT # C C C 6 SPACE FORWARD 1 RECORD. C C NUMB: # OF RECORDS TO FORWARD. C ADDR:- C ICMD:=6 C MTRS: MTRS STATUS C IBYTE: BYTE(0)/CORE DUMP(1) C IUNIT:UNIT # C C C 7 SPACE REVERSE 1 RECORD. C C NUMB: # OF RECORDS TO REVERSE. C ADDR:- C ICMD:=7 C MTRS: MTRS STATUS C IBYTE: BYTE(0)/CORE DUMP(1) C IUNIT:UNIT # C C 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 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 NEW SABR OPERATORS C -------------------- 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 OPDEF MTRC 6724 /OR THE COMMAND REGISTER INTO THE AC. 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 [0.0] POINTERS GOTO 123 C ****POINTERS***** S DUMMY WC7752 S DUMMY CA7753 S CPAGE 2 S WC7752, 6201 S 7752 S CPAGE 2 S CA7753, 6201 S 7753 C S COMMAND, 0 /COMMAND FORMED FROM ICMD & COMMAND MASK. S BFIELD, 0 /DATA BUFFER FIELD FROM ADDR. C C C C [1.0] CALL BY VALUE, AND INITIALIZE. 123 KBYTE=0 C INIT OUTPUT ERROR DEVICE IDEV=1 C C TEST IBYTE .AND. '0002 FOR EXTENEDED GAP IXTDGAP=0 S TAD I \IBYTE /LOOK AT BIT 10 FOR EXTENDED GAP S AND (0002 S SZA CLA S TAD (100 /EXTENDED 3 INCH GAP S DCA \IXTDGAP C C C [2] TEST IF LEGAL COMMAND. IF SO THEN PUT INTO C COMMAND REGISTER WORD BITS 6:8. C IS COMMAND MINUS < 0? IF(ICMD)2,3,3 2 WRITE(IDEV,902)ICMD RETURN 902 FORMAT(' BAD MAGTAP COMMAND. ICMD=',I5) C C C C [2.1] TEST IF A MAGTAPE COMMAND .LE. 7. 3 IF(ICMD-7)4,4,2 S\4, TAD I \ICMD S RTL;RAL S AND (0070 /00 TO 70 S DCA \ICMD C C [3] TEST IF BYTE(0) OR CORE DUMP(1) MODE. S TAD I \IBYTE S AND (0001 /ONLY LOOK AT THE MODE BIT S SZA CLA S JMP \41 /CORE DUMP C C C C [3.1] BYTE MODE 0407 IS THE CONTROL WORD. S\40, TAD (0407 S DCA \KBYTE GOTO 42 C C C C C C [3.2] DUMP MODE 0607-IS THE CONTROL WORD. S\41, TAD (0607 S DCA \KBYTE C C C C [4] SET UP THE WORD COUNT AND THE CURRENT ADDRESS C REGISTERS. S \42, CLA S TAD I \NUMB S CIA S DCA I WC7752 /WORD COUNT C S TAD \ADDR /GET THE FIELD FROM THE DUMMY POINTER S AND (0070 S DCA BFIELD /DATA FIELD S CLA CMA /LOAD -1 C S TAD \ADDR# /GET THE ADDRESS FROM THE DUMMY POINTER S DCA I CA7753 /CURRENT ADDRESS C C C [5] CHECK IF IUNIT IS LEGAL (0 TO 7) IF(IUNIT)64,66,66 66 IF(IUNIT-7)63,63,64 64 WRITE(IDEV,65)IUNIT 65 FORMAT(' IUNIT MUST BE FROM 0 TO 7 : ',I5) RETURN C C [5.1] MOVE IUNIT INTO BITS 0 TO 2. 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 DCA \IUNIT /SAVE FOR INSERTION INTO COMMAND WORD C C [6] COMPUTE THE COMPLETE THE COMMAND S TAD \ICMD /00X0 S TAD \IUNIT /X000 S TAD \KBYTE /0407 OR 0607 S TAD \IXTDGAP /0000 (NO GAP), 100 (3 INCH GAP) S DCA COMMAND C C C C [7] CLEAR THE CONTROLLER AND WAIT FOR BOTH DRIVE C AND CONTROLLER TO BECOME READY S MTAF /CLEAR TAPE CONTROL REGISTERS. C WAIT FOR THE TAPE TO BECOME READY S WAIT1C, MTCR /CONTROLLER READY? S JMP WAIT1C /NO C S WAIT1T, MTTR /TRANSPORT READY? S JMP WAIT1T /NO C C C [8] LOAD CMD REGISTER S TAD COMMAND S MTLC /LOAD THE COMMAND. S CLA C C [9] START THE OPR WITH BUFFER FIELD IN THE AC S TAD BFIELD /GET THE BUFFER FIELD. S MTGO /GO DO IT. S CLA C C [10] WAIT FOR CONTROLLER TO BE READY S WAIT2C, MTCR /CONTOLLER READY? S JMP WAIT2C /NO C S WAIT2T, MTTR /DRIVE READY S JMP WAIT2T /NO C C C C [11] RETURN WITH TC58 STATUS IN MTRS. S MTRS /GET STATUS S DCA I \MTRS C C C [12] RETURN RETURN END C ****POINTERS***** S DUMMY WC7752 S DUMMY CA7753 S CPAGE 2 S WC7752, 6201 S 7752 S CPAGE 2 S CA7753, 6201 S 7753 C S COMMAND, 0 /COMMAND FORMED FROM ICMD & COMMAND MASK. S BFIELD, 0 /DATA BUFFER FIELD FROM ADDR. C