C PROGRAM MAGTAP.FT C ----------------- C C C C MAGTAP - A TC58/TM8E 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 REV JAN 14, 1978 C NOV 22, 1976 C C C ABSTRACT C ------------ C "MAGTAP" IS AN OS/8 FORTRAN II SUBROUTINE WHICH C ENABLES THE USER TO CONTROL EITHER A TU10, TU20, OR C A TU16 9-TRACK (800BPI, ODD PARITY) MAGTAPE DRIVE C UTILIZING EITHER THE TC58 OR TM8E CONTROLLER. C C 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. MAGTAP AUTOMATICALLY DETERMINES C WHETHER THE TM8E OR TC58 CONTROLLER EXISTS C AND USES THE CONTROLLER WHICH WAS FOUND. C C THIS CONTROLLER PROGRAM USES THE SAME BASIC C LOGIC FOR BOTH TYPES OF CONTROLLERS. COMPUTED "GOTO"S ARE USED C AT EACH STEP IN THE ALGORITHM TO IMPLEMENT THE LOGIC. C IN ADDITION, IF THE TM8E CONTROLLER IS USED, C THE STATUS WORD RETURNED (MTRS) IS TRANSLATED C TO THAT OF THE TC58 CONTROLLER. THUS THE CALLING PROGRAM C CAN BE WRITTEN TO TEST THE MTRS STATUS WORD INDEPENDENT C OF WHICH DRIVE IS RUNNING. C C ADDITIONAL TYPES OF NON-STANDARD MAGTAPE CONTROLLERS C WHICH USE DMA COULD BE ADDED WITHOUT TOO MUCH C EFFORT. THE HANDLER WORKS BY FIRST DETERMINING C WHICH CONTROLLER IS ACTIVE AND SETS A COMPUTED "GOTO" C VARIABLE "KTRLR". THIS IS THEN USED TO DECIDE WHICH IOTS C GET EXECTURED AT EACH STEP OF THE HANDLER. IN ADDITION, C THE NON-STANDARD CONTROLLER STATUS WORD MUST BE MAPPED C TO THAT OF THE TC58 (MTRS). C C I. ARGUMENT LIST C ---------------- C C NUMB /THE NUMBER OF WORDS TO BE TRANSFERED C /TO/FROM THE MAGTAP. IT IS ALSO USED C /TO SPECIFY THE NUMBER OF RECORDS TO ADVANCE C /OR BACKSPACE THE DRIVE FOR THOSE COMMANDS. C /THE MAXIMUM VALUE IS 4096. C C ADDR /THE FORTRAN VARIABLE BUFFER ARRAY USED TO C /SPECIFY WHERE DATA IS READ OR WRITTEN. C C ICMD /THE HANDLER COMMAND. IT IS IN THE RANGE OF [0:7]. C C MTRS /STATUS REGISTER IN MTRS FORMAT. SEE TABLE III. C C IBYTE /BYTE/CORE DUMP MODE SWITCH WHERE 0 IS BYTE C /MODE, 1 IS CORE DUMP MODE. IN ADDITION, C /ADD 2 FOR WRITING EXTENDED GAP FOR WRITE AND EOF C /OPERATIONS. C C IUNIT /THE UNIT NUMBER OF THE MAGTAPE DRIVE [0:7]. C /MUST BE FROM 0 TO 7. C C C C C II.BYTE AND CORE DUMP MODES 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: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: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 III. THE "MTRS" STATUS WORD RETURNED BY THE HANDLER. C -------------------------------------------------------- C THE STATUS OF THE DRIVE/CONTROLLER IS REPORTED BACK TO THE C CALLING PROGRAM AT THE END OF THE TAPE OPERATION. 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 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 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: 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 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: 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 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: 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 MARK 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 "NUMB" 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 "NUMB" 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 C ------------- C .R FORT C *MAGTAP.RLCMD REG. S OPDEF MTGO 6722 /EXECUTE THE COMMAND IN THE CMD REG. S OPDEF MTRS 6706 /READ CONTENSE OF STATUS REGISTER 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 C C TM8E IOTS C --------- S OPDEF LWCR 6701 /NOTE: SAME AS MTSF S OPDEF LCAR 6703 S OPDEF LCMR 6705 S OPDEF LFBR 6706 C S OPDEF CLT 6712 S OPDEF CLF 6725 C S SKPDF SKEF 6721 S SKPDF SKCB 6722 S SKPDF SKJD 6723 S SKPDF SKTR 6724 C S OPDEF RMSR 6714 S OPDEF RFSR 6716 C [0.0] POINTERS C ****POINTERS***** GOTO 100 C THE DUMMY VARIABLES ARE THE TC58 WORD COUNT AND CURRENT C ADDRESS REGISTERS. S DUMMY WC7752 S DUMMY CA7753 S CPAGE 2 S WC7752, 6201 S 7752 S CPAGE 2 S CA7753, 6201 S 7753 C 100 CONTINUE C ****** END OF POINTERS***** S BFIELD, 0 /DATA BUFFER FIELD FROM ADDR. C C C C [1.0] CALL BY VALUE, AND INITIALIZE. KBYTE=0 ICMD1=0 ICMD2=0 C C C [1.1] TEST IF TC58 OR TM8E S CMA CLA S LWCR /WILL BE -1 IF TC58 S NOP /NEED SINCE LWCR=MTSF S DCA \KTRLR /SAVE TEST RESULTS C IF(KTRLR)110,111,111 C C WAS TC58, SET GOTO SWITCH AND CLEAR FLAGS 110 KTRLR=1 S MTAF /CLEAR FLAGS GOTO 121 C C WAS TM8E, SET GOTO SWITCH AND CLEAR FLAGS 111 KTRLR=2 S CLT /CLEAR FLAGS S CLF GOTO 121 C C C [1.2] TEST IBYTE .AND. '0002 FOR EXTENEDED GAP C C TC58 S\121, 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 \ICMD1 GOTO 200 C C TM8E S \122, TAD I \IBYTE S AND (0002 S SZA CLA S TAD (400 /WRITE 3" EXTENED GAP S DCA \ICMD2 C C C C [2] TEST IF LEGAL COMMAND. IF SO THEN PUT INTO C COMMAND REGISTER WORD BITS 6:8. C IF (0 LEQ ICMD LEQ 7) C THEN CONTINUE C ELSE REPORT ERROR AND RETURN; 200 IF(ICMD)201,210,210 210 IF(ICMD-7)211,211,201 201 WRITE(1,202)ICMD GOTO 900 202 FORMAT(' BAD MAGTAP COMMAND. ICMD=',I5) C C C [2.1] EXTRACT THE CMD AND START CREATING THE COMMAND C WORD FOR SPECIFIC CONTROLLERS. 211 GOTO(212,213),KTRLR C C TC58 S\212, TAD I \ICMD S RTL;RAL /9:11==>6:8 S AND (0070 /00 TO 70 S TAD \ICMD1 S DCA \ICMD1 GOTO 300 C C C TM8E S \213, TAD I \ICMD S RTR; RTR /9:11==>0:2 S AND (7000 S TAD \ICMD2 S TAD (0100 /"GO BIT" S DCA \ICMD2 C C C [3] TEST IF BYTE(0) OR CORE DUMP(1) MODE. 300 GOTO(310,320),KTRLR C C C [3.1] TC58 MODE TEST S \310, TAD I \IBYTE S AND (0001 /ONLY LOOK AT THE MODE BIT S SZA CLA S JMP \311 /CORE DUMP C C C C [3.1.1] BYTE MODE 0407 IS THE CONTROL WORD. S TAD (0407 S TAD \ICMD1 S DCA \ICMD1 GOTO 400 C C C C [3.1.2] TC58 DUMP MODE 0607-IS THE CONTROL WORD. S\311, TAD (0607 S TAD \ICMD1 S DCA \ICMD1 GOTO 400 C C C [3.2] TM8E MODE TEST S \320, TAD I \IBYTE S AND (0001 S SZA CLA S JMP \321 C C TM8E BYTE MODE S TAD (0407 S TAD \ICMD1 S DCA \ICMD1 GOTO 400 C C TM8E CORE DUMP MODE S \321, TAD (0607 S TAD \ICMD1 S DCA \ICMD1 C C C C [4] SET UP THE WORD COUNT AND THE CURRENT ADDRESS C REGISTERS. 400 GOTO(401,402),KTRLR C C C TC58 S\401, TAD I \NUMB S CIA S DCA I WC7752 GOTO 403 C C C TM8E S \402, CLA S TAD I \NUMB S CIA S LWCR C C C [4.2] LOAD CURRENT ADDRESS S\403, TAD \ADDR /GET THE FIELD FROM THE DUMMY POINTER S AND (0070 S DCA BFIELD /DATA FIELD GOTO(411,412),KTRLR C C C TC58 S\411, CLA CMA /-1 S TAD \ADDR# S DCAI CA7753 GOTO 500 C C C TM8E S CLA CMA /LOAD -1 S TAD \ADDR# /GET THE ADDRESS FROM THE DUMMY POINTER S LCAR C C C [5] CHECK IF IUNIT IS LEGAL (0 TO 7) 500 IF(IUNIT)501,503,503 503 IF(IUNIT-7)600,600,501 501 WRITE(1,502)IUNIT 502 FORMAT(' IUNIT MUST BE FROM 0 TO 7 : ',I5) GOTO 900 C C C [6] MOVE IUNIT INTO BITS 0 TO 2. S\600, 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 \ICMD1 S DCA \IUNIT /SAVE FOR INSERTION INTO COMMAND WORD C C C [7] WAIT FOR COTROLLER/DRIVE READY GOTO(710,720),KTRLR C C C [7.1] CLEAR THE TC58 CONTROLLER AND WAIT FOR BOTH DRIVE C AND CONTROLLER TO BECOME READY S\710, 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 GOTO 800 C C C [7.2] TM8E WAIT READY S \720, SKCB /CONTOLLER READY S JMP \720 C S \721, SKTR /DRIVE READY S JMP \721 C C C C [8] LOAD CMD REGISTER TO PERFORM OPERATION 800 GOTO(810,820),KNTRLR C C C C [8.1] TC58 CONTROLLER S \810, TAD \ICMD1 S MTLC /LOAD THE COMMAND. S CLA C C [8.1] 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 [8.1.2] WAIT FOR CONTROLLER TO BE READY S \812, MTCR /CONTOLLER READY? S JMP \812 /NO C S MTTR /DRIVE READY S JMP \812 /NO C C C C [8.1.3] RETURN WITH TC58 STATUS IN MTRS. S MTRS /GET STATUS S DCA I \MTRS GOTO 900 C C C [8.2] TM8E CONTROLLER EXECUTE COMMAND AND COMPUTE C EQUIVALENT OF MTRS TO BE RETURNED. S \820, TAD \ICMD1 S TAD BFIELD S LCMR S TAD \ICMD2 S LFBR C C C [8.2.1] WAIT FOR DRIVE AND CONTROLLER S \821, SKCB S JMP \821 S SKTR S JMP \821 C C C [8.2.2] GET STATUS REGISTERS AND CVT TO MTRS EQUIV. M=0 C GET BITS IN COMMON BETWEEN (MTRS,RMSR) S RMSR S AND (7300 S DCA \M C S RMSR /GET EOT 6<==8 S RTL S AND (0040 S TAD \M S DCA \M C C RMSR /GET READ/COMPARE 7<==10 S RTL;RAL S AND (0020 S TAD \M S DCA \M C S RMSR /GET RLE, LATE DATA 8:9<==6:7 S RTR S AND (0014 S TAD \M S DCA \M C S RMSR /GET ILL. CMD 3<==11 S RTR; RTR; RAR S AND (0400 S TAD \M S DCA \M C S RFSR /GET BAD TAPE BIT S RTR; RAR /10<==7 S AND (0002 S TAD \M S DCA I \MTRS /SAVE IT BY REFERENCE C C C [9] DONE, RETURN 900 RETURN END