.TITLE EXTMT.MAC 05-AUG-77/10-MAY-78 ; ; SAND77-1492 ; ; ; AUTHOR: N. A. BOURGEOIS, JR. ; ADVANCED SYSTEMS DEVELPOMENT DIVISION 1736 ; SANDIA LABORATORIES ; PO BOX 5800 ; ALBUQUERQUE, NM 87185 ; 505-264-8088 ; FTS 475-8088 ; ; THIS SOFTWARE IS ISSUED BY SANDIA LABORATORIES, OPERATED ; FOR THE UNITED STATES DEPARTMENT OF ENERGY BY SANDIA ; CORPORATION. ; ; NOTICE ; ; THIS SOFTWARE WAS SPONSORED BY THE UNITED STATES ; GOVERNMENT. NEITHER THE UNITED STATES GOVERNMENT NOR ; THE UNITED STATES DEPARTMENT OF ENERGY, NOR ANY OF THEIR ; EMPLOYEES, NOR ANY OF THEIR CONTRACTORS, SUBCONTRACTORS, ; OR THEIR EMPLOYEES MAKES ANY WARRANTY, EXPRESS OR ; IMPLIED, OR ASSUMES ANY LEGAL LIABILITY OR ; RESPONSIBILITY FOR THE ACCURACY, COMPLETENESS OR ; USEFULNESS OF ANY INFORMATION, APPARATUS, PRODUCT OR ; PROCESS DISCLOSED, OR REPRESENTS THAT ITS USE WOULD NOT ; INFRINGE PRIVATELY OWNED RIGHTS. ; ; THIS WORK WAS SPONSORED AND FUNDED BY: ; BASE AND INSTALLATION SECURITY SYSTEMS PROGRAM OFFICE ; ELECTRONIC SYSTEMS DIVISION ; AIR FORCE SYSTEMS COMMAND ; HANSCOM AIR FORCE BASE, MA 01731 ; ; **************** ; * * ; * UNCLASSIFIED * ; * * ; **************** .SBTTL DESCRIPTION 05-AUG-77/20-OCT-77 ;THE SUBROUTINE "EXTMT" IS A FORTRAN CALLABLE MAGNETIC TAPE HANDLER. IT ;IS CAPABLE OF READING OR WRITING TAPES IN ANY ARBITRARY FORMAT. AS ;HEREIN IMPLEMENTED THE TAPE DENSITY IS 800 BPI (CORE DUMP MODE FOR ;7-TRACK), LATERAL PARITY IS EVEN AND THE TAPE MUST BE MOUNTED ON UNIT ;#0. NO INTERRUPTS ARE USED. TO CHANGE ANY OF THESE FIXED PARAMETERS ;IT IS NECESSARY TO CHANGE THE COMMAND PROTOTYPE LABELED "COMAND" IN THE ;ASSIGNMENTS SECTION AS REQUIRED PRIOR TO ASSEMBLY OF THE SUBROUTINE. ;THE CONDITIONAL ASSEMBLY SWITCH "CHANGE" HAS BEEN PROVIDED FOR THIS ;PURPOSE. ;THE FORTRAN CALLING SEQUENCE IS AS FOLLOWS: ; ; CALL EXTMT(ARG1[,ARG2[,ARG3[,ARG4]]]) ; ;THIS FORTRAN CALLABLE SUBROUTINE CAUSES THE MAGNETIC TAPE UNIT TO ;PERFORM THE OPERATION SPECIFIED IN ARGUMENT ONE. THE NUMBER OF ;CHARACTERS TO BE TRANSFERRED OR RECORDS TO BE SKIPPED MUST BE GIVEN ;IN ARGUMENT TWO. IDENTIFICATION OF THE MEMORY BUFFER TO BE USED MUST ;BE STATED IN ARGUMENT THREE. WHEN AN END-OF-FILE IS READ ON THE TAPE A ;ZERO IS RETURNED IN ARGUMENT FOUR, OTHERWISE THE ACTUAL NUMBER OF BYTES ;READ IS RETURNED. ONLY THOSE ARGUMENTS REQUIRED FOR ANY GIVEN FUNCTION ;SHOULD BE INCLUDED IN THE CALL STATEMENT. ALL ARGUMENTS ARE INTEGER. ; ; ARG1 VALUES FUNCTION ARGS REQ'D ; 0 OFF LINE 1 ; 1 READ 1, 2, 3, 4 ; 2 WRITE 1, 2, 3 ; 3 WRITE EOF 1 ; 4 SPACE FORWARD 1, 2 ; 5 SPACE REVERSE 1, 2 ; 6 WRITE/ERG 1, 2, 3 ; 7 REWIND 1 ;APPENDIX A CONTAINS A TYPICAL SAMPLE FORTRAN PROGRAM WHICH IN TURN ;CALLS THIS MAG TAPE HANDLER. THE SAMPLE PROGRAM READS AN RT-11 ;STRUCTURED ASCII FILE AND WRITES A DATA GENERAL RDOS STRUCTURED ASCII ;FILE ON THE MAG TAPE. ;APPENDIX B CONTAINS THE RT-11 COMMAND STRINGS TO ASSEMBLE, COMPILE AND ;LINK THE SAMPLE PROGRAM AND THIS MAG TAPE HANDLER. .SBTTL MACROS 08-AUG-77/09-SEP-77 .MCALL ..V2.. ;USE VERSION 2 MACROS ..V2.. .MCALL .EXIT ;TO RT-11 MONITOR .MCALL .PRINT ;A MESSAGE ON THE CONSOLE TTY .MCALL .REGDEF ;DEFINE THE PROCESSOR REGISTERS .REGDEF .SBTTL ASSIGNMENTS 08-AUG-77/20-OCT-77 ;MAGNETIC TAPE UNIT REGISTERS MTS =172520 ;STATUS REGISTER MTC =MTS+2 ;COMMAND REGISTER MTBRC =MTC+2 ;BYTE RECORD COUNTER MTCMA =MTBRC+2 ;CURRENT MEMORY ADDRESS MTD =MTCMA+2 ;DATA BUFFER MTRD =MTD+2 ;READ LINES MTV =224 ;VECTOR ADDRESS ;CONSTANTS READ =2 ;READ A RECORD WRITE =4 ;WRITE A RECORD WRTEOF =6 ;WRITE AN END-OF-FILE SPCFWD =10 ;SPACE FORWARD SPCREV =12 ;SPACE REVERSE WRTERG =14 ;WRITE A RECORD WITH EXTENDED RECORD GAP REWIND =16 ;REWIND THE TAPE PWRCLR =10000 ;POWER CLEAR .IF DF CHANGE COMAND =CHANGE ;COMMAND PROTOTYPE ; DENSITY ; BIT 14 BIT 13 BPI TRKS ; 0 0 200 7 ; 0 1 556 7 ; 1 0 800 7 ; 1 1 800 7(CORE DUMP),9 ; PARITY ; BIT 11 ; 0 ODD ; 1 EVEN .IFF COMAND =64000 ;COMMAND PROTOTYPE ; 60000 DENSITY 800 BPI (CORE DUMP MODE ; FOR 7-TRACK) ; 4000 LATERAL PARITY EVEN ; UNIT #0 SELECT ; INTERRUPT OFF .ENDC EOF =40000 ;END-OF-FILE GO =1 ;INITIATE THE FUNCTION FILPRT =4 ;FILE PROTECT OFFLIN =100 ;OFF LINE .SBTTL GLOBALS 08-AUG-77/ .GLOBL EXTMT .SBTTL DIRECTIVES 08-AUG-77/08-MAY-78 .CSECT $EXTMT .IDENT \V9E08\ .SBTTL FORTRAN INTERFACE 05-AUG-77/08-MAY-78 ;GET THE FIRST TWO ARGUMENTS AND THE ADDRESSES OF THE SECOND TWO ;ARGUMENTS. THEN CALL THE MAGNETIC TAPE UNIT DRIVER. FINALLY, RETURN ;TO THE CALLING FORTRAN PROGRAM. NUMEROUS ERROR DIAGNOSTICS ARE ISSUED ;AS APPROPIATE FOLLOWED BY AN EXIT TO THE OPERATING SYSTEM. .ENABL LSB EXTMT: CLR IFUN ;START CLR ISIZ ; WITH CLR RECORD ; ALL CLR IRSTAT ; CLEAN! MOV (R5)+ ,R0 ;GET THE NUMBER OF ARGUMENTS BIC #177400 ,R0 ;USE THE LOW BYTE ONLY MOV @(R5)+ ,IFUN ;GET THE FUNCTION DEC R0 ;ANY MORE ARGUMENTS? BEQ 1$ ; NO MOV @(R5)+ ,ISIZ ;GET THE BYTE RECORD COUNT DEC R0 ;ANY MORE ARGUMENTS? BEQ 1$ ; NO MOV (R5)+ ,RECORD ;GET THE BUFFER ADDRESS DEC R0 ;ANY MORE ARGUMENTS? BEQ 1$ ; NO MOV (R5) ,IRSTAT ;GET THE READ STATUS ADDRESS DEC R0 ;ANY MORE ARGUMENTS? BNE 2$ ; YES 1$: JSR PC ,MTDRVR ;CALL THE MAG TAPE DRIVER RTS PC ;RETURN TO FORTRAN IFUN: 0 ;FUNCTION ISIZ: 0 ;BYTE RECORD COUNT RECORD: 0 ;CONTENTS = SA RECORD BUFFER IRSTAT: 0 ;CONTENTS = READ STATUS ADDRESS 2$: .PRINT #MSG1 .EXIT .DSABL LSB .NLIST BEX MSG1: .ASCIZ \ EXTMT: TOO MANY ARGUMENTS\ .EVEN .LIST BEX .SBTTL MAG TAPE DRIVER 08-AUG-77/10-MAY-78 ;THIS SUBROUTINE CONTROLS THE OPERATION OF THE MAGNETIC TAPE UNIT. IF ;THE UNIT IS OFF LINE THE ROUTINE ISSUES A DIAGNOSTIC AND EXITS. IF NOT ;IT CALLS A SUBROUTINE THAT DETERMINES THE REQUESTED FUNCTION THEN ;EXECUTES IT. IF THE FUNCTION FAILS TO EXECUTE SUCCESSFULLY IN FOUR ;ATTEMPTS THE ROUTINE ISSUES A DIAGNOSTIC AND EXITS. .ENABL LSB MTDRVR: BIT #OFFLIN ,@#MTS ;MT OFF LINE? BEQ 4$ ; YES BIS #PWRCLR ,@#MTC ;INIT THE MT UNIT MOV #4 ,R3 ;WE'LL TRY 4 TIMES JSR PC ,MTFUN ;DETERMINE THE FUNCTION 1$: JSR PC ,MTWAIT MOV RECORD ,@#MTCMA ;LOAD BUFFER ADDRESS MOV ISIZ ,@#MTBRC ;LOAD BYTE RECORD COUNT NEG @#MTBRC MOV #COMAND ,@#MTC ;DELIVER PROTOTYPE INSTRUCTION BIS IFUN ,@#MTC ;INCLUDE THE FUNCTION INC @#MTC ;NOW EXECUTE IT! TST IFUN ;WAS FUNCTION = OFF LINE? BEQ 3$ ; YES JSR PC ,MTWAIT TST @#MTC ;ERROR? BPL 2$ ; NO BIT #EOF ,@#MTS ;EOF? BNE 2$ ; YES DEC R3 ;TRY AGAIN? BEQ 5$ ; NO MOV #-2 ,@#MTBRC ; YES, SO SPACE MOV #COMAND+SPCREV+GO,@#MTC ; REVERSE 2 RECORDS JSR PC ,MTWAIT MOV #-1 ,@#MTBRC ; THEN SPACE MOV #COMAND+SPCFWD+GO,@#MTC ; FORWARD 1 RECORD BR 1$ ; AND TRY AGAIN 2$: CMP #READ ,IFUN ;WAS FUNCTION = READ? BNE 3$ ; NO CLR @IRSTAT ; YES, SO ZERO ARG4 FOR EOF BIT #EOF ,@#MTS ;EOF? BNE 3$ ; YES MOV ISIZ ,@IRSTAT ;RETURN THE NUMBER ADD @#MTBRC ,@IRSTAT ; OF BYTES READ 3$: RTS PC 4$: .PRINT #MSG2 .EXIT 5$: .PRINT #MSG3 .EXIT .DSABL LSB .NLIST BEX MSG2: .ASCIZ \ EXTMT: MT OFF LINE\ MSG3: .ASCIZ \ EXTMT: BAD TAPE OR HARDWARE ERROR\ .EVEN .LIST BEX .SBTTL DETERMINE FUNCTION 08-AUG-77/08-MAY-78 ;THIS SUBROUTINE DETERMINES THE REQUESTED FUNCTION. IF AN INVALID ;ARGUMENT EXISTS THE ROUTINE ISSUES AN APPROPIATE DIAGNOSTIC AND EXITS. ;IF ONE OF THE SEVERAL WRITE FUNCTIONS IS REQUESTED THE PRESENCE OF THE ;WRITE ENABLE RING IS TESTED AND IF NOT PRESENT THE ROUTINE ISSUES A ;DIAGNOSTIC AND EXITS. .ENABL LSB MTFUN: ASL IFUN ;POSITION THE FUNCTION BITS BEQ 4$ ; IF FUNCTION = OFF LINE CMP #WRTEOF ,IFUN ;WRITE EOF? BEQ 4$ ; YES CMP #REWIND ,IFUN ;REWIND? BEQ 4$ ; YES CMP #SPCFWD ,IFUN ;SPACE FORWARD? BEQ 3$ ; YES CMP #SPCREV ,IFUN ;SPACE REVERSE? BEQ 3$ ; YES CMP #WRITE ,IFUN ;WRITE? BEQ 1$ ; YES CMP #WRTERG ,IFUN ;WRITE WITH ERG? BEQ 1$ ; YES CMP #READ ,IFUN ;READ? BNE 5$ ; NO TST IRSTAT ;VALID READ STATUS ADDRESS? BEQ 9$ ; NO BR 2$ ; YES 1$: BIT #FILPRT ,@#MTS ;WRITE ENABLE RING INSTALLED? BNE 8$ ; YES 2$: TST RECORD ;VALID BUFFER ADDRESS? BEQ 6$ ; NO 3$: TST ISIZ ;VALID BYTE RECORD COUNT? BLE 7$ ; NO 4$: RTS PC 5$: .PRINT #MSG4 .EXIT 6$: .PRINT #MSG5 .EXIT 7$: .PRINT #MSG6 .EXIT 8$: .PRINT #MSG7 .EXIT 9$: .PRINT #MSG8 .EXIT .DSABL LSB .NLIST BEX MSG4: .ASCIZ \ EXTMT: FUNCTION ARGUMENT ERROR\ MSG5: .ASCIZ \ EXTMT: BUFFER ARGUMENT ERROR\ MSG6: .ASCIZ \ EXTMT: BYTE RECORD ARGUMENT ERROR\ MSG7: .ASCIZ \ EXTMT: MT FILE PROTECT\ MSG8: .ASCIZ \ EXTMT: READ STATUS ARGUMENT ERROR\ .EVEN .LIST BEX .SBTTL WAIT ROUTINE 08-AUG-77/17-AUG-77 ;WAIT UNTIL BOTH THE CONTROL UNIT AND THE TAPE UNIT ARE READY. NO ;TIMEOUT FEATURE IS INCLUDED. .ENABL LSB MTWAIT: TSTB @#MTC ;CONTROL UNIT READY? BPL MTWAIT ; NO 1$: ASR @#MTS ;TAPE UNIT READY? BCC 1$ ; NO RTS PC .DSABL LSB .SBTTL SAMPLE FORTRAN PROGRAM 09-SEP-77/20-OCT-77 ; C SRCDAT AUTHOR: W L JACKLIN ; C ; C CREATES DG RDOS SOURCE LANGUAGE MAG TAPE FROM DEC RT-11 ; C FILES ; C ; LOGICAL*1 FNAM(10),INRCRD(82),CR,LF ; C ; DATA CR/"015/,LF/"012/ ; C ; 1 FORMAT (' FILE NUMBER (00-99) ? ',$) ; 2 FORMAT (I2) ; 3 FORMAT (' "DEV:FILNAM.EXT" ? ',$) ; 4 FORMAT (80A1) ; C ; TYPE 1 ; ACCEPT 2, LFN ; TYPE 3 ; CALL ASSIGN (30,FNAM,-10) ; CALL TAPWRT (INRCRD,-1,LFN) ; C ; 100 CONTINUE ; READ (30,4,END=120,ERR=110) INRCRD ; L = LEN(INRCRD) ; INRCRD(N+1) = CR ; INRCRD(N+2) = LF ; CALL TAPWRT (INRCRD,L+2,LFN) ; GO TO 100 ; C ; 110 CONTINUE ; STOP 'SRCDMT: READ ERROR' ; C ; 120 CONTINUE ; CALL TAPWRT (INRCRD,0,LFN) ; CALL EXIT ; END ; SUBROUTINE TAPWRT (CHARS,NBYTES,LFN) ; C ; LOGICAL*1 CHARS(2),OUTBFR(514) ; C ; EQUIVALENCE (OUTBFR(511),ICTL1),(OUTBFR(513),ICTL2) ; C ; IF (NBYTES) 100,200,300 ; C ; 100 CONTINUE ; IPTR = 1 ; RETURN ; C ; 200 CONTINUE ; DO 210 I = IPTR,510 ; OUTBFR(I) = .FALSE. ; 210 CONTINUE ; ICTL1 = LFN ; ICTL2 = LFN ; CALL EXTMT (2,514,OUTBFR) ; CALL EXTMT (3) ; CALL EXTMT (3) ; CALL EXTMT (5,1) ; RETURN ; C ; 300 CONTINUE ; DO 310 I = 1,NBYTES ; OUTBFR(IPTR) = CHARS(I) ; IPTR = IPTR + 1 ; IF (IPTR .LT. 511) GO TO 310 ; C ; ICTL1 = LFN ; ICTL2 = LFN ; CALL EXTMT (2,514,OUTBFR) ; C ; 310 CONTINUE ; RETURN ; C ; END .SBTTL RT-11 COMMAND STRINGS 09-SEP-77/08-MAY-78 ; .R MACRO ; *EXTMT[,LP:]<[TT:,SY:]EXTMT[/C/N:TTM[:CND]] ; *[CHANGE=XXXXX] ; *[^Z^Z] ; *^C ; .R FORTRAN ; *SRCDAT[,LP:]