Trailing-Edge
-
PDP-10 Archives
-
decuslib20-02
-
decus/20-0056/mtio.mac
There are 2 other files named mtio.mac in the archive. Click here to see a list.
; The following conditional assembly features are
;available in the MTIO package.
;
; The default mode--IBM vs. DEC
;
; Whether data is reconverted to PDP-10 form after it
; has been written out in IBM mode (INTEGER and REAL
; numbers only)
;
;
; At assembly time, MODE should be set to 0 if
;IBM is desired as a default mode and should be set
;to something other than 0 if DEC mode is desired
;as the default. The default value for MODE is 0.
;
;
; The following applies only to the subroutine MTWRIT,
;it has no bearing on any other routine.
; At assembly time, PROCES should be set to 0 if reconversion
;of data is desired. The data must be reconverted if it is
;to be used after the call to this routine. If it is not reconverted
;what comes back in the array will be garbage to the FORTRAN
;program. If PROCES is non-zero, the data will not be
;reconverted--this is faster and will require slightly less core.
;PROCES==0 is the default value for this parameter.
;
; The parameters may be set in two ways: by changing the
; source file or at assembly time. To set MODE equal to 0, the line
; MODE==0
;should be inserted at the beginning of the MACRO source file.
;Alternatively, the parameters may be set when
;running the MACRO assembler, for example:
;
;R MACRO
;*T:FILE_TTY:,T:FILE
;MODE==1
;PROCES==1
;
;END OF PASS ONE
;MODE==1
;PROCESS==1
;
;
;Where T is the users Dectape (or disc).
;
; CONVERTED TO CURRENT FORTRAN STANDARD FROM F40, 9 AUG 1980
; BY PAUL T. ROBINSON, WESLEYAN UNIV, DECUS CONVERSION PROGRAMMER
IFNDEF MODE,<MODE==0>
IFNDEF PROCES,<PROCES==0>
TITLE MTIO
ENTRY MTREAD
ENTRY MTSKIP
ENTRY MTINIT
MLON
;GENERAL SUBROUTINE TO READ UNFORMATTED NUMERICAL DATA
;WRITTEN BY AN IBM 360 COMPUTER ON A MAGNETIC TAPE
;
;FORTRAN CALLING SEQUENCE:
; CALL READ(ARRAY,SIZE,IERR)
;
; ARRAY-IS THE ARRAY WHERE THE DATA IS TO BE STORED
; SIZE-IS THE SIZE OF TE ARRAY
; IERR-CAN HAVE THE FOLLOWING VALUES
; 0-NO ERROR
; 1-MT INPUT ERROR
; 2-MT END OF FILE. NO DATA READ
; 3-MT END OF TAPE. NO DATA READ
;
; ARRAY MAY EITHER BE DECLARED REAL,INTEGER OR LOGICAL
; IN THE FORTRAN CALLING PROGRAM. IF IT IS DECLARED
; LOGICAL, NO CONVERSION IS MADE BETWEEN 360 AND PDP-10
; REPRESENTATION. IF IT IS DECLARED INTEGER, THE DATA IS
; SHIFTED OVER 4 BITS. IF IT IS DECLARED REAL, CONVERSION
; IS MADE BETWEEN 360 AND PDP-10 FLOATING POINT REPRESENTATION.
; SIZE IS THE SIZE OF THE RECORD AND THE ARRAY. IT IS
; ASSUMED TO BE INTEGER. IF IT IS LESS THAN OR EQUAL TO
; ZERO NO READING TAKES PLACE.
;
;
; REGISTER CONVENTIONS:
A=1 ;GENERAL PURPOSE
B=2 ;GP
C=3 ;GP
D=4 ;GP
SIZE=5 ;SIZE OF ARRAY
ADR=6 ;ADDRESS OF ARRAY
J=10 ;JSP REGISTER
Z=16 ;JSA-JRA REGISTER, ARGUMENT BLOCK POINTER
P=17 ;STACK POINTER
;CHANNEL FOR I/O
MT==15
;SHOULD BE COMPATIBLE WITH THE DISPLAY RTNS AND HFOS SINCE
;THEY USE CHANNELS 16 AND 17
;FIRST SECTION OF CODING: PICK UP ARRAY SIZE AND ADDRESS,
;SET UP IOWD AND READ THE DATA. ERROR BRANCHES TO BDATA.
MTREAD: SETZM @2(Z) ;ZERO INDICATES NO ERROR
SKIPG SIZE,@1(Z) ;GET RECORD SIZE
JRST DONE ;IF <= 0, FORGET IT
MOVN A,SIZE ;IOWD IS NEGATIVE IN LEFT HALF
HRLM A,CWD ;STORE IT (SIZE CONTAINS RECORD SIZE)
MOVEI ADR,@(Z) ;GET ARRAY ADDRESS
SOS ADR ;IOWD IS ADDR.-1 IN RIGHT HALF
HRRM ADR,CWD ;STORE IT
MTAPE MT,0 ;WAIT FOR MT TO BE FREE
IN MT,CWD ;GET DATA
SKIPA ;INPUT SUCCESSFUL
JRST BDATA ;WHOOPS, INPUT ERROR
;DATA HAS BEEN READ, NOW MUST DECIDE WHAT IT WAS AND
;WHAT TO DO WITH IT. FORTRAN LOGICAL MEANS NO PROCESSING
;REAL AND INTEGER MEAN CONVERT.
;
;ALSO--ALTERNATE ENTRY POINT FROM MTWRIT TO RECONVERT
;FROM 360 TO PDP-10 #'S. (ONLY ON CONDITIONAL
;ASSEMBLY)
;
REPROC: SKIPGE FLAG ;IBM OR DEC MODE?
JRST DONE ;DEC,SUPPRESS PROCESSING
LDB A,[POINT 4,(Z),12] ;GET ARGUMENT TYPE
JUMPE A,INTGER ;0 IS INTEGER ARGUMENT
CAIN A,2 ;SO IS 2
JRST INTGER
CAIE A,4 ;4 IS FLOATING POINT
JRST DONE ;IF NOT FLTG OR INTEGER ASSUME LOGICAL
;DATA IS FLOATING POINT SO MUST CONVERT EXPONENT,PICK UP
;MANTISSA AND NORMALIZE
LP1: AOS ADR ;INCREMENT ADR OF WORD TO BE MODIFIED
SETZ C, ;ANSWER IS STORED IN C
SKIPGE A,(ADR) ;PICK UP THE WORD.
TLZ A,400000 ;360 FLTG PNT#'S ARE IN ABSOLUTE
;VALUE FORM WITH ONLY THE FIRST BIT
;COMPLEMENTED TO INDICATED MINUS.
;THEREFORE CLEAR ONLY THAT BIT.
LDB B,[POINT 7,A,7] ;GET EXPONENT
SUBI B,^D64 ;360 IS EXCESS 64 NOTATION
ASH B,2 ;360 EXP IS TO BASE 16,PDP10 TO
;BASE 2,SO SCALE
ADDI B,^D128 ;PDP-10 IS EXCESS 64
CAIL B,^D256 ;EXPONENT TOO LARGE?
JRST OVFLW ;YES
JUMPL B,UNFLW ;EXP TOO SMALL
DPB B,[POINT 8,C,8] ;STORE EXPONENT
LDB B,[POINT 24,A,31] ;GET MANTISSA
DPB B,[POINT 24,C,32] ;STORE IT
STORE: FADRI C,0 ;ADD ZERO TO NORMALIZE
SKIPGE (ADR) ;IF ORIGINAL WORD WAS <0
MOVN C,C ;THEN NEGATE ANSWER
MOVEM C,(ADR) ;AND STORE IT
SOJG SIZE,LP1 ;ANY WORDS LEFT?
JRST DONE ;NO SO RETURN
;Here if data is in integer form. Just shift right
;FOUR PLACES AND RESTORE.
INTGER: AOS ADR ;INCREMENT ADDRESS
MOVE A,(ADR) ;PICK UP WORD
ASH A,-4 ;SHIFT IT
MOVEM A,(ADR) ;RESTORE IT
SOJG SIZE,INTGER ;ARE WE DONE?
;DONE: JRA Z,3(Z) ;RETURN
DONE: POPJ P, ;RETURN
CWD: Z ;INPUT CWD HERE
Z ;0 IS STOP COMMAND
UNFLW: TLOA C,400 ;UNDERFLOW-PUT SMALLEST FLTG PNT #
OVFLW: HRLOI C,377777 ;ON OVERFLOW GET LARGEST
JRST STORE ;FLTG PT # AND RETURN IT
;INPUT ERROR BRANCHES TO HERE. POSSIBLE CAUSES:
;END OF FILE, END OF TAPE, AND INPUT DATA ERROR.
BDATA: GETSTS MT,A ;GET STATUS TO SEE WHY ERROR
MOVEI B,1 ;IF NOTHING ELSE, I/O ERROR
TRNE A,20000 ;END OF FILE?
JRST ENDFIL ;GO PROCESS IT
TRNE A,2000 ;END OF TAPE?
MOVEI B,3 ;TELL THE POOR GUY
STATUS: TRZ A,740000 ;CLEAR ANY ERROR BITS
SETSTS MT,(A) ;AND TELL MONITOR
MOVEM B,@2(Z) ;RETURN FLAG TO USER
; JRA Z,3(Z) ;AND GO RETURN
POPJ P, ;RETURN
ENDFIL: MOVEI B,2 ;SET EOF FLAG
CLOSE MT, ;CLOSE AND
JSP J,INITMT ;REOPEN TO GET RID OF EOF
JRST STATUS ;AND GO RETURN
;SUBROUTINE TO SKIP FILES AND RECORDS ON MAGTAPE
;IN CONJUNCTION WITH ABOVE RTN.
;
;FORTRAN CALLING SEQUENCE:
;
; CALL MTSKIP(IFILE,IREC)
;
; IFILE-THE NUMBER OF FILES TO BE SKIPPED
; IREC-THE NUMBER OF RECORDS TO BE SKIPPED
;
; IFILE AND IREC ARE ASSUMED TO BE INTEGER AND
; MAY BE EITHER POSITIVE, ZERO OR NEGATIVE. IF THEY
; IF POSITIVE, THE INDICATED # OF FILES AND RECORDS
; ARE SKIPPED, IF ZERO, NONE ARE SKIPPED, AND IF NEGATIVE
; THE INDICATED # OF FILES IS BACKSPACED.
; FILES ARE SKIPPED BEFORE RECORDS ARE.
;
FILE==16 ;SKIP A FILE
; FILE+1=17 IS BACKSPACE FILE
RECORD==6 ;SKIP A RECORD
; RECORD+1=7 IS BACKSPACE RECORD
MTSKIP: MOVEI C,FILE ;SET UP TO SKIP FILE
MOVE A,@(Z) ;PICK UP FIRST ARGUMENT
JUMPE A,MTSKRC ;IF =0,DON'T SKIP ANYTHNG
CLOSE MT, ;CLOSE MT
JSP J,EXECUT ;NE 0, GO DO IT
JSP J,INITMT ;AND REOPEN
MTSKRC: MOVEI C,RECORD ;SET UP TO SKIP RECORDS
MOVE A,@1(Z) ;2ND ARG IS # RECORDS
JSP J,EXECUT ;DO IT
; JRA Z,2(Z) ;GO DO IT
POPJ P, ;
EXECUT: SKIPGE A ;IF A IS >0 NO MODIFICATION TO MTAPE
AOS C ;IF <0, ADD 1 TO MTAPE OPERATOR TO
;INDICATE BACKSPACING
MOVM B,A ;#TO GO FORWARD OR BACK
EXEC1: SOJL B,EXEC2 ;SKIP SOMETHING
MTAPE MT,(C) ;C HAS WHAT WE DO
JRST EXEC1 ;TRY AGAIN
EXEC2: CAIE C,17 ;IF WE WERE BACKSPACING FILES
;THEN MUST CHECK POSITION
JRST (J) ;ALL OK,RETURN
MTAPE MT,17 ;WE WERE BACKSPACING SO
;GO ONE MORE AND THEN SEE IF
;WE SHOULD GO FORWARD.
MTAPE MT,0 ;WAIT UNTIL NOT BUSY
STATO MT,4000 ;AT BEGINNING OF TAPE?
MTAPE MT,FILE ;NO,MUST SKIP OVER FILE MARK
JRST (J) ;RETURN
;SUBROUTINE TO INITIALIZE CHANNELS FOR I/O TO MAGTAPE AND
;POSITION THE TAPE INITIALLY. MUST BE CALLED PRIOR TO THE
;CALL OF THE ABOVE TWO ROUTINES.
;
;FORTRAN CALLING SEQUENCE:
;
; CALL MTINIT(FILE,REC)
;
; FILE-POSITION TAPE JUST BEFORE THIS FILE
; REC-POSITION TAPE JUST BEFORE THIS RECORD
;
; FILE AND REC ARE ASSUMED TO BE INTEGER. THEY
; INDICATE THE FILE THAT WILL BE READ NEXT (ASSUMING MTSKIP
; IS NOT CALLED). CALL MTINIT(1,1) AND CALL MTINIT(0,0) ARE
; EQUIVALENT, BOTH REWIND THE TAPE AND SET UP TO READ THE
; FIRST FILE, FIRST RECORD. A CALL WITH FILE LESS THAN 0
;SUPPRESSES ANY POSITINING, THE I/O CHANNEL IS SIMPLY
;INITIALIZED AND I/O BEGINS AT THE CURRENT TAPE POSITION.
;
DUMP==17 ;DUMP MODE FOR UNBUFFERED I/O
MTINIT: IFE MODE,<SETZM FLAG> ;MODE=0 IMPLIES DEFAULT IS IBM
IFN MODE,<SETOM FLAG> ;MODE NE 0 IMPLIES DEC IS DEFAULT
MOVEI A,17 ;INITIALLY DUMP MODE
HRRM A,INITMT ;OTHER SUBROUTINES MAY CHANGE THIS
JSP J,INITMT ;INITIALIZE MT
SKIPGE A,@(Z) ;THIS IS FILE#
; JRA Z,2(Z) ;IF <0, DON'T TOUCH TAPE
POPJ P, ;SO RETURN
MTAPE MT,1 ;OTHERWISE REWIND IT
SOSG A ;# OF FILES TO SKIP IS
;DESIRED POSITION - 1
JRST SKIPRC ;BUT DON'T SKIP -1 OR 0 FILES
MOVEI C,FILE ;WHAT TO DO
JSP J,EXECUT ;GO DO IT
SKIPRC: MOVE A,@1(Z) ;THIS IS RECORD POSITION
MOVEI C,RECORD ;WHAT TO DO
SOSLE A ;IF <= 0,DON'T DO ANYTHING
JSP J,EXECUT ;GO DO IT
; JRA Z,2(Z) ;RETURN, ALL DONE
POPJ P,
INITMT: INIT MT,DUMP ;DUMP MODE FOR I/O
SIXBIT .MTA0. ;MAG TAPE
Z ;NO BUFFERS
JRST UNAVIL ;INIT FAILED
MOVE C,FLAG ;0 INDICATES IBM,-1 DEC
ADDI C,101 ;101 INDICATES IBM,100 DEC
MTAPE MT,(C) ;SET THE STATUS
JRST (J) ;RETURN
FLAG: 0 ;-1 IS DEC,0 IS IBM MODE
UNAVIL: OUTSTR [ASCIZ/MTIO --MTA0 unavailable
/]
EXIT
;SUBROUTINE TO CHANGE FROM IBM MODE(STANDARD)
;TO DEC COMPATIBLE MODE.
;THE CALL IS:
; CALL SETDEC
;THERE ARE NO ARGUMENTS.
;
ENTRY SETDEC
SETDEC: SETOM FLAG ;SET DEC FLAG
MTAPE MT,100 ;CHANGE STATUS TO DEC-COMPATIBLE
; JRA Z,(Z) ;RETURN
POPJ P,
;SUBROUTINE TO CHANGE BACK TO IBM MODE FROM DEC MODE
;(AS SET BY SETDEC).
;THE CALL IS:
;
; CALL SETIBM
;
;THERE ARE NO ARGUMENTS
;
ENTRY SETIBM
SETIBM: SETZM FLAG ;0 IS IBM FLAG
MTAPE MT,101 ;CHANGE STATUS TO IBM MODE
; JRA Z,(Z) ;RETURN
POPJ P,
;SUBROUTINE TO WRITE AN END-OF-FILE MARK ON MAGTAPE
;
;CALL:
; CALL MTCLOS
;
;THERE ARE NO ARGUMENTS
;
ENTRY MTCLOS
MTCLOS: RELEAS MT, ;GET RID OF THE MT
; JRA Z,(Z) ;RETURN
POPJ P,
;SUBROUTINE TO WRITE EOF
;
; CALL MTEOF
;
ENTRY MTEOF
MTEOF: MTAPE MT,3 ;WRITE AN EOF MARKER
; JRA Z,(Z) ;RETURN TO FORTRAN
POPJ P,
;SUBROUTINE TO SET DENSITY
;
; CALL SETDEN(IDENS)
;
; WHERE IDENS IS AN INTEGER AND CAN HAVE THESE VALUES
;
; IDENS = 0--SYSTEM STANDARD
; 1--200 BPI
; 2--556 BPI
; 3--800 BPI
;0 IS THE DEFAULT VALUE
;
ENTRY SETDEN
SETDEN: SKIPN FLAG ;IF IBM MODE, THEN CAN'T SET
; JRA Z,1(Z) ;PARITY SO RETURN
POPJ P,
SKIPL A,@(Z) ;ARG <0?
CAILE A,3 ;NO, >3?
SETZ A, ;YES, SO ASSUME 0
DPB A,[POINT 2,INITMT,28] ;SET THE BITS IN INIT
GETSTS MT,B ;GET THE OLD STATUS
DPB A,[POINT 2,B,28] ;STORE IT
SETSTS MT,(B) ;AND TELL THE MONITOR
; JRA Z,1(Z) ;RETURN
POPJ P,
;SUBROUTINE TO SET PARITY
;
; CALL SETPAR(IPAR)
;
; WHERE IPAR - EQ 0--ODD PARITY
; NE 0--EVEN PARITY
ENTRY SETPAR
SETPAR: SKIPN FLAG ;IF INM MODE CAN7T SET DENSITY
; JRA Z,1(Z) ;SO RETURN
POPJ P,
SKIPN A,@(Z) ;IF ARG NE 0
MOVEI A,1 ;THEN ASSUME 1
DPB A,[POINT 1,INITMT,26] ;STORE IT AT THE INIT
GETSTS MT,B ;GET STATUS
SKIPG A ;EVEN OR ODD?
TRZA B,1B26 ;ODD, SO ZERO AND SKIP
TRO B,1B26 ;EVEN, SO SET IT
SETSTS MT,(B) ;RETURN THE VALUE
; JRA Z,1(Z) ;RETURN
POPJ P,
;SUBROUTINE TO WAIT FOR MAGTAPE TO STOP SPINNING
;
; CALL MTWAIT
;
ENTRY MTWAIT
MTWAIT: MTAPE MT,0 ;WAIT FOR MT
; JRA Z,(Z) ;RETURN
POPJ P,
;
;SUBROUTINE TO WRITE OUT ONE RECORD ON MAGNETIC TAPE.
;MTINIT MUST HAVE BEEN CALLED PRIOR TO THIS TO
;INITIALIZE THE I/O CHANNEL. THE CALL IS:
;
; CALL MTWRIT(ARRAY,SIZE,IERR)
;
; ARRAY-IS THE ARRAY WHERE THE DATA IS STORED
; SIZE-IS THE SIZE OF THE ARRAY (AND THE RECORD)
; IERR-HAS THE SAME VALUES AS MTREAD
;
;THE APPROPRIATE TRANSFORMATION IS MADE FROM PDP-10 TO 360
;REPRESENTATION OF FIXED AND FLOATING POINT NUMBERS.
;******THE DATA IS DESTROYED WHEN IT IS PUT ON MAGNETIC TAPE*******
;(EXCEPT IN THE CASE OF LOGICAL DATA WHERE NO CHANGE IS MADE)
;
;SPECIAL REGISTERS USED BY THIS ROUTINE
EXP=7 ;HOLDS EXPONENT OF FLTG POINT #
FRAC=11 ;HOLDS FRACTION
ENTRY MTWRIT
MTWRIT: SETZM @2(Z) ;INITIALLY NO ERRORS DETECTED
MOVN SIZE,@1(Z) ;SECOND ARG IS ARRAY SIZE
JUMPGE SIZE,DONE ;IF WAS <= 0,DON'T WRITE RECORD
HRLM SIZE,CWD ;IOWD IS - IN LEFT HALF
MOVE ADR,(Z) ;GET ADDRESS OF ARRAY
HRRM ADR,CWD ;STORE IT AT CWD
SOS CWD ;ADDRESS IS ADDRESS - 1
SKIPGE FLAG ;IF IN IBM MODE, OK
JRST WRITE ;IF NOT, DON'T DO ANY CONVERSION
LDB A,[POINT 4,(Z),12] ;GET ARGUMENT TYPE
;
;IOWD HAS BEEN SET UP. MUST DETERMINE WHAT KIND OF ARGUMENT
;AND PROCESS ACCORDINGLY.
;
JUMPE A,INTCON ;0 IS INTEGER ARGUMENT
CAIN A,2 ;SO IS 2
JRST INTCON
CAIE A,4 ;4 IS FLTG POINT
JRST WRITE ;EVERYTHING ELSE ASSUMED LOGICAL
;
;FLOATING POINT CONVERSION. DATA IS DESTROYED.
;
FLTGLP: MOVM A,(ADR) ;GET A DATA WORD
SETZ C, ;RESULT WILL GO HERE
LDB EXP,[POINT 8,A,8] ;REGISTER 8 HAS EXPONENT
SUBI EXP,^D128 ;EXPONENT WAS IN EXCESS 128
LDB FRAC,[POINT 24,A,32];THIS IS THE FRACTION
;
;HAVE EXPONENT AND FRACTION, MUST 'DE-NORMALIZE' NUMBER
;TO 360 STANDARDS. WANT EXPONENT EVEN MULTIPLE OF 4
;SINCE 360 IS BASE 16. (2**4=16). SO SHIFT FRACTION RIGHT
;ONE BIT (= DIVIDE BY TWO), AND INCREMENT EXPONENT BY 1
;(= MULTUPLY BY TWO). CONTINUE UNTIL EXPONENT MULTIPLE
;OF 4.
;
NORMLP: TRNN EXP,3 ;ARE LOW ORDER 2 BITS OF
;EXPONENT ZERO
JRST NORMAL ;YES, SUCCESSFULLY DENORMALIZED
LSH FRAC,-1 ;SHIFT FRACTION (= DIVIDE BY 2)
AOJA EXP,NORMLP ;ADD ONE TO EXPONENT, TRY AGAIN
;
;THE NUMBER HAS BEEN NORMALIZED TO THE 360'S POINT OF VIEW
;
NORMAL: LSH EXP,-2 ;CONVERT EXPONENT TO BASE OF 16
ADDI EXP,^D64 ;360 IS EXCESS 64 NOTATION
DPB EXP,[POINT 7,C,7] ;STORE CALCULATED EXPONENT
DPB FRAC,[POINT 24,C,31];AND CALCULATED FRACTION
SKIPGE (ADR) ;IF ORIGINAL # WAS <=0
TLO C,400000 ;THEN MUST SET 360 SIGN BIT
MOVEM C,(ADR) ;STORE THIS NUMBER
AOS ADR ;INCREMENT ADDRESS
AOJL SIZE,FLTGLP ;SEE IF ANOTHER # IS TO BE CONVERTED
JRST WRITE1 ;ALL DONE, WRITE THE BUFFER
;
;INTEGER CONVERSION BRANCHES HERE. ALL THAT MUST BE DONE
;IS SHIFT THE DATA OVER 4 BITS.
;
INTCON: MOVE A,(ADR) ;GET THE NUMBER
ASH A,4 ;SHIFT IT OVER SO 360 WILL GET
;FIRST 32 BBITS
MOVEM A,(ADR) ;STORE IT
AOS ADR ;INCREMENT ADDRESS
AOJL SIZE,INTCON ;ANY MORE #'S?
;
;ANY CONVERSION THAT NEEDS TO BE MADE HAS BEEN DONE.
;NOW JUST WRITE THE DATA ON THE TAPE AND RETURN TO THE USER.
;
WRITE1:
IFE PROCES,<MOVE SIZE,@1(Z) ;IF RECONVERTING DATA, GET
MOVEI ADR,@(Z) ;START ADR AND SIZE
SOS ADR> ;WANT ADDR-1
WRITE: MTAPE MT,0 ;WAIT FOR THE MTAPE TO BE DONE
OUT MT,CWD ;OUTPUT THE BLOCK
WRET: ;HERE IF DATA WRITTEN
IFN PROCES,<;JRA Z,2(Z) ;NOT PROCESSING DATA SO RETURN
POPJ P,
JRST BDATA> ;AN ERROR, FIND WHAT
IFE PROCES,<JRST REPROC ;PROCESSING DATA SO DO IT
GETSTS MT,A ;SOME ERROR-FIND WHAT
MOVEI B,1 ;ASSUME I/O ERROR
TRNE A,2000 ;END OF TAPE?
MOVEI B,3 ;YES
TRZ A,740000 ;CLEAR ANY ERROR BITS
MOVEM B,@2(Z) ;TELL THE GUY
SETSTS MT,(A) ;TELL THE MONITOR
JRST REPROC> ;AND DEPROCESS DATA.
END