       .TITLE OTSER
/
/COPYRIGHT (C) 1975
/DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.
/
/THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY
/ON A SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH
/THE INCLUSION OF THE ABOVE COPYRIGHT NOTICE.  THIS
/SOFTWARE, OR ANY OTHER COPIES THEREOF, MAY NOT BE PRO-
/VIDED OR OTHERWISE MADE AVAILABLE TO ANY OTHER PERSON
/EXCEPT FOR USE ON SUCH SYSTEM AND TO ONE WHO AGREES TO
/THESE LICENSE TERMS.  TITLE TO AND OWNERSHIP OF THE
/SOFTWARE SHALL AT ALL TIMES REMAIN IN DEC.
/
/THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE
/WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A COM-
/MITMENT BY DIGITAL EQUIPMENT CORPORATION.
/
/DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY
/OF ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.
	.EJECT
/COPYRIGHT 1970, DIGITAL EQUIPMENT CORP., MAYNARD, MASS.
/EDIT #013   12-20-71
/EDIT #014	20-MAY-75	RK BLACKETT  SPR 15-979  MAKE CHANGES
/				  SO THAT END-OF-MEDIUM ALSO TRIGGERS
/				  THE END= BRANCH.
/EDIT #015	20-AUG-75	M. HEBENSTREIT  DISCLAIMER
/EDIT #016	 3-MAY-76	G. A. REID	CHANGE THE RSX VERSION
/					TO PRINT THE LUN AND E.V. ON
/					OTS20 ERRORS.  THESE CHANGES
/					REQUIRE THAT ROUTINES WHICH
/					ISSUE THE OTS20 ERROR PASS THE
/					E.V. IN THE MQ, AND THE LUN
/					IN THE AC.  THIS CHANGE REQUIRES
/					THE USE OF SPMSG EDIT #014 AND
/					LATER.
/OBJECT TIME ERROR ROUTINE.
/CALLING SEQUENCE--JMS* .ER
/                  .DSA ERROR NUMBER (BIT 0 = 1 IF RECOVERABLE).
/DEFINE RSX -----TO GET RSX VERSION.
/ALSO MUST DEFINE %FPP FOR FLT. POINT PROC. IF RSX DEFINED.
/RSX VERSION USES SPMSG TO OUTPUT MESSAGES.  SPMSG PRINTS ERROR
/NUMBER AND TASK NAME, THEN RETURNS TO OTSER.
/
/NO PARAMETERS DEFINED-----DOS15 VERSION
	.GLOBL OTSER
OTSER=.
	.GLOBL	.ER,.ZR,.ERST,.ER4,.ER3
	.GLOBL .SPC		/USED BY .FPP IF PRESENT
	.GLOBL .AERTB		/USED BY ERRSET
	.IFDEF RSX
	.GLOBL .SP,.SA,.SM
X10=10
ECLA=641000
UNDST=713770		/UNNORM DOUBLE STORE.
UNDLD=713170		/UNNORM. DOUBLE LOAD.
.ER	CAL	0
	DAC ACSAVE	/FOR COMMON ROUTINES
	PAL		/SAVE AC OR BITS 12-17 OF HDR INCASE OTS 11.
	LACQ		/(GAR-016) GET THE E.V. ...
	DAC	EV	/(GAR-016) AND SAVE IT.
.ER4	NOP	/JMP ER5 IF END,ERR EXITS SPECIFIED
ER7	LAC*	(X10)	/SAVE X10 FOR POSSIBLE RETURN
	DAC	SAVX10
	.IFDEF	%FPP
	UNDST		/SAVE FPP AC.  MAY BE RECOV. ERROR.
	TFPAC
	.ENDC
	LAC*	.SA	/PICK UP ADDRESS OF BUFFER
	DAC*	(X10)
	LAW	-4	/SET UP TO PRINT OTS-
	DAC	CNT
	LAC	MSGADR	/PICK UP ADDRESS OF OTS-
	DAC	CNT1
ER1	LAC*	CNT1
	DAC*	X10	/STORE CHARACTER IN BUFFER
	ISZ	CNT1	/INCREASE POINTER
	ISZ	CNT	/HAVE WE COPIED FOUR CHARACTERS?
	JMP	ER1	/NO COPY ANOTHER ONE
	LAC*	.ER	/PICK UP ERROR NUMBER
	DAC	CNT1	/SAVE IT TO DETERMINE IF FATAL ERROR
	JMS ER8		/SUPPRESS?
	JMP ER9	/YES
	LAC	CNT1	/ERR # TO AC.
	LRS	6	/(GAR-016) MOVE ERROR # TO MQ LEFT JUSTIFIED.
	JMS	PUT	/(GAR-016) PUT THE LEFT # IN THE PRINT LINE.
	JMS	PUT	/(GAR-016) PUT THE RIGHT # IN THE PRINT LINE.
	LAW	-12
	TAD*	.ER	/IS ERROR A FORMAT ERROR?
	SZA!CLL
	JMP	ER2	/NO  PRINT MESSAGE
	ISZ	.ER	/POINT TO ERROR MESSAGE
	LAC	(074)	/PUT A < INTO BUFFER
	DAC*	X10
	XCT*	.ER	/PICK UP FORMAT MESSAGE
	LMQ		/IN 5/7 ASCII TO BE DECODED
	ECLA!LLS 7	/PICK UP FIRST 7 BITS
	DAC*	X10	/STORE IT IN BUFFER
	ECLA!LLS 7	/PICK UP NEXT 7 BITS
	DAC*	X10	/STORE IT IN BUFFER
	ECLA!LLS 7	/PICK UP LAST FOUR BITS
	DAC	CNT
	ISZ	.ER	/INCREMENT ER TO PICK UP SECOND WORD
	XCT*	.ER	/LOAD SECOND WORD
	LMQ		/SAVE IT IN MQ
	ECLA!LLS 3	/PICK UP FIRST 3 BITS
	XOR	CNT	/PUT ON FIRST FOUR BITS
	DAC*	X10	/STORE IT IN MESSAGE
	ECLA!LLS 7	/PICK UP LAST WORD
	DAC*	X10
	LAC	(076)	/INSERT A > IN BUFFER
	DAC*	X10
ER4	LAC	(ER9)	/SET RETURN ADDRESS IN .SP
	DAC*	.SP	/TO SIMULATE JMS* .SP
	JMP*	.SM
ER9	LAC	CNT1	/PICK UP CNT1 TO DETERMINE IF ERROR WAS FATAL
	SMA		/FATAL IF POSITIVE NUMBER
	CAL	(10)	/YES FATAL EXIT
	LAC	SAVX10	/RESTORE XR10
	DAC*	(X10)
	.IFDEF	%FPP
	UNDLD		/RESTORE FPP AC INCASE RECOV. ERROR.
	TFPAC
	.ENDC
	LAC	.ER		/RESTORE LINK
	RAL
	LAC	ACSAVE		/SAVE AC.
	ISZ	.ER	/RETURN JMS+2
	JMP*	.ER
/
ER2	LAC	CNT1	/(GAR-016) PICK UP THE ERROR NUMBER.
	SAD	(20)	/(GAR-016) IS IT AN OTS20 ERROR?
	JMP	XER20	/(GAR-016) YES.
	LAW	-6	/(GAR-016) NO.
	DAC	CNT
	LAW	-1	/BLANK OUT FORMAT MESSAGE AREA
ER3	DAC*	X10
	ISZ	CNT
	JMP	ER3
	JMP	ER4
/(GAR-016)
/(GAR-016)	WHEN AN OTS20 ERROR IS GIVEN, OTSER OUTPUTS
/(GAR-016)	THE LUN AND THE EVENT VARIABLE.  ROUTINES WHICH CALL OTSER
/(GAR-016)	TO ISSUE AN OTS20 ERROR MUST PASS THE E.V. IN THE MQ, AND
/(GAR-016)	THE LUN IN THE AC.
/(GAR-016)
XER20	LAC	(055)	/(GAR-016) PUT A '-' IN ...
	DAC*	X10	/(GAR-016) THE OUTPUT BUFFER.
	CLL		/(GAR-016)
	LAC	ACSAVE	/(GAR-016) GET THE LUN.
	IDIV		/(GAR-016)
	12		/(GAR-016)
	AAC	60	/(GAR-016)
	DAC	ACSAVE	/(GAR-016) SAVE THE ONES DIGIT.
	ECLA!DIV	/(GAR-016)
	12		/(GAR-016)
	AAC	60	/(GAR-016)
	DAC	CNT	/(GAR-016) SAVE THE TENS DIGIT.
	LACQ		/(GAR-016)
	AAC	60	/(GAR-016)
	DAC*	X10	/(GAR-016) PUT THE HUNDREDS DIGIT IN.
	LAC	CNT	/(GAR-016)
	DAC*	X10	/(GAR-016) PUT THE TENS DIGIT IN.
	LAC	ACSAVE	/(GAR-016)
	DAC*	X10	/(GAR-016) PUT THE ONES DIGIT IN.
	LAC	(055)	/(GAR-016) PUT A '-' IN ...
	DAC*	X10	/(GAR-016) THE OUTPUT BUFFER.
/(GAR-016)
/(GAR-016)	PLACE THE EVENT VARIABLE INTO THE OUTPUT BUFFER.
/(GAR-016)
	LAC	EV	/(GAR-016) GET THE E.V.
	LMQ		/(GAR-016)
	JMS	PUT	/(GAR-016) CHAR. 1 IN.
	JMS	PUT	/(GAR-016) CHAR. 2 IN.
	JMS	PUT	/(GAR-016) CHAR. 3 IN.
	JMS	PUT	/(GAR-016) CHAR. 4 IN.
	JMS	PUT	/(GAR-016) CHAR. 5 IN.
	JMS	PUT	/(GAR-016) CHAR. 6 IN.
	LAC	(055)	/(GAR-016) PUT A '-' IN ...
	DAC*	X10	/(GAR-016) THE OUTPUT BUFFER.
	LAC*	(X10)	/(GAR-016) NEED TO BACK UP ...
	AAC	-1	/(GAR-016) THE POINTER TO ADJUST ...
	DAC*	(X10)	/(GAR-016) FOR THE ADVANCE DONE BY SPMSG.
	JMP	ER4	/(GAR-016)
EV	.DSA	0	/(GAR-016)
/(GAR-016)
/(GAR-016)	SUBROUTINE PUT SHIFTS THE LEFTMOST 3 BITS FROM
/(GAR-016)	THE MQ TO THE AC, BUILDS A PRINTING CHARACTER,
/(GAR-016)	AND PLACES IT INTO THE OUTPUT BUFFER.
/(GAR-016)
PUT	0		/(GAR-016)
	ECLA!LLS 3	/(GAR-016)
	AAC	60	/(GAR-016)
	DAC*	X10	/(GAR-016)
	JMP*	PUT	/(GAR-016)
SAVX10	0
CNT	0
CNT1	0
MSGADR	MESSAG
MESSAG	117	/O
	124	/T
	123	/S
	055	/-
ACSAVE	0	/TEMP.
	.IFDEF	%FPP
TFPAC	0	/EXPONENT--TEMP. STOR. FOR FPP AC.
	0	/MANTISSA.  HO.
	0	/MANTISSA.  LO.
	.ENDC
	.ENDC
	.IFUND RSX
.ER    CAL    0
       DAC    ACSAVE         /SAVE AC IN CASE ERROR RECOVERABLE.
	DAC .ER3	/STORE BITS 12-17 OR HEADER IN CASE OTS 11
.ER4	NOP	/JMP ER5 IF EXPANDED I/O
/INITIALIZED TO NOP BY I/O CLEAN UP OR BY ER5
/INITIALIZED TO JMP ER5 BY COMPILER CALLED ROUTINE .ZR
ER7       LAC*   .ER            /SAVE ERROR NUMBER AND CONVERT TO A TWO
       DAC    RECFLG         /   DIGIT ASCII-7 NUMBER.
/RETURN TO JMP ER2 IF OTS 30-37 AND MESSAGE IS TO BE SUPPRESSED
/RETURN TO LAC RECFLG IF OTS 30-37 AND MESSAGE IS NOT TO
/BE SUPPRESSED OR NOT OTS 30-37
	JMS ER8	/DETERMINE IF MESSAGE IS TO BE SUPPRESSED
	JMP ER2	/YES IT IS SUPPRESSED
	LAC RECFLG	/NO CONTINUE
       RAL
       AND    (16)
	DAC TEXT+3		/STORE DIGIT 2 IN BUFFER.
       LAC    RECFLG
       RCL; RTL; RTL
       AND    (3400)         /DIGIT 1 TO AC.
       XOR     TEXT+3        /MERGE DIGIT 2
       XOR    (30140)        /MERGE IN TWO 60'S.
       DAC    TEXT+3         /STORE ASCII-7 CHARACTERS IN BUFFER.
       LAC    SHORT
       DAC    TEXT2
       LAW    -12            /TEST FOR ERROR 12 (BAD FORMAT).
       TAD*   .ER            /   IF NOT, PRINT ERROR MESSAGE.
       SZA                   /   IF SO, LENGTHEN ERROR MESSAGE TO
       JMP    ER0            /   INCLUDE CURRENT FORMAT STATEMENT
       ISZ    .ER            /   WORD PAIR.
       XCT*   .ER
       DAC    FMT            /STORE FIRST FORMAT WORD IN BUFFER.
       ISZ    .ER
       XCT*   .ER
       DAC    FMT+1          /STORE SECOND FORMAT WORD IN BUFFER.
       LAC    LONG
       DAC    TEXT2
ER0	CAL 02775	/WRITE ERROR MESSAGE.--
ER6       .DSA   11
       .DSA   TEXT-2
ACSAVE .DSA   0
	CAL 775
	6
ER2    LAC    RECFLG         /CHECK ERROR FOR RECOVERABLE.
       SPA
       JMP    ER1            /   YES--RETURN TO CALLER.
       CAL    00000          /   NO-- CALL .EXIT.
       .DSA   15
ER1	LAC .ER		/RESTORE LINK AND AC BEFORE EXIT.
       RAL
       LAC    ACSAVE
       ISZ    .ER
       JMP*   .ER            /EXIT TO CALLING ROUTINE.
TEXT   .ASCII  ' .OTS '<0><0>'00'
TEXT2  .DSA   0
       .DSA   0
FMT    .BLOCK 2
       .DSA    360320
SHORT  .DSA   064000
LONG   .DSA   360000
RECFLG	.DSA 0
	.ENDC
/CALLING SEQUENCE-TO SET UP EXP. I/O ERROR ADDRESSES
/JMS* .ZR
/.DSA END
/.DSA ERR
/MEANINGFUL AC MUST BE SAVED AND RESTORED
.ZR	0	/CALLED BY COMPILER FOR EXP. I/O SETUP
	DAC ACSAVE	/SAVE FOR COMPILER
	LAC (JMP ER5)		/SET UP FOR EXP I/O
	DAC .ER4
	LAC* .ZR	/GET END ADDRESS  IF 0,NO ADDRESS
	SNA
	LAC (ER7)	/PROCESS AS USUAL
	DAC ENDADR	/SET EXIT ADDR.
	ISZ .ZR	/BUMP TO ERR ADR.
	LAC* .ZR	/GET ERR ADDRESS
	SNA
	LAC (ER7)	/AS USUAL
	DAC ERRADR
	ISZ .ZR	/BUMP FOR EXIT
	LAC ACSAVE	/RESTORE AC
	JMP* .ZR
/EXPECTES AC FOLLOWING ENTRANCE INTO .ER TO BE IN ACSAVE
ER5	LAC (NOP)	/REINITIALIZE 
	DAC .ER4
	LAC* .ER	/GET ERROR NUMBER
	AND (77777)	/MASK BITS 3-17
/MUST IGNORE BITS 0-2 OF ERROR NUMBER ABOVE
	DAC .ERST	/STORE ERROR NUMBER AS STATUS
	SAD (11)	/OTS 11?  TEST FOR EOF
	SKP		/YES
	JMP* ERRADR	/ERROR NOT EOF OR EOM
	LAC ACSAVE	/AC CONTAINS DATA MODE IF OTS 11
	SAD (5)	/EOF
	JMP* ENDADR
	SAD	(6)	/(RKB-014) END OF MEDIUM?
	JMP*	ENDADR	/(RKB-014) YES, TAKE THE END= BRANCH
	JMP* ERRADR	/ERR
.ERST	0	/ERR STATUS WORD-OTS ERR #
ENDADR	ER7
ERRADR	ER7
.ER3	0	/TMP. STR.FOR HEADER IN CASE I/O DATA ERROR - IOERR
/NEEDS THIS IF LOADED
/ER8 DETERMINES IF OTS ERROR IS 30-37 (ARITHMETIC).  IF IT IS
/SUPPRESSED AFTER N ERROR MSGS. OF A TYPE HAVE BEEN
/OUTPUT.  N IS SET BY ERRSET AND IN THE FORM OF-N-1 IN .AERTB TABLE.
/DEFAULT IS N=75 DECIMAL
/CALLING SEQUENCE:    OTS ERROR NUMBER IN AC
/	JMS ER8
/	NEXT INSTR.    RET. HERE IF MSG. IS TO BE SUPPR.
/	NEXT INSTR.	RET. HERE IF MSG. IS TO BE OUTPUT
/
/
ER8	0
	AND (77777)	/DUMP REC. BIT AND BITS 1,2
/MUST IGNORE BITS 0-2 OF ERROR NUMBER ABOVE
	DAC ER11	/TEMP SAVE
	AND (377740)
	SZA	/>37?
	JMP ER8A	/YES.  OUTPUT
	LAC ER11	/CONT. TEST
	TAD (-30)	/
	SPA		/<30?
	JMP ER8A	/YES.  OUTPUT
	TAD (.AERTB)	/GET TABLE POINTER--0-7 IN AC
	DAC ER11
	ISZ* ER11	/BUMP TABLE ENTRY.  IF 0, START SUPPR. MSG.
/OF THIS TYPE
	JMP ER8A	/NOT 0, KEEP OUTPUTING MSG.
	DZM .SPC	/SET SUPPRESS PC PRINT FLAG IF FPP PRESENT
	CLC		/777777 TO TABLE ENTRY SO THAT SUBSEQ.
/MSG. OF THIS TYPE WILL BE SUPPR.
	DAC* ER11
	JMP* ER8
ER8A	ISZ ER8	/DON'T SUPPRESS ERROR MSG.
	JMP* ER8
.SPC	000001		/SUPPR. PC FLAG .  WILL SUPPR. IF 0
ER11	0		/TEMP
/ARITH ERROR TABLE FOR MSG. CONTROL.  ALL ENTRIES SET TO -N-1
/BY ERRSET  (CALL ERRSET(N) FROM F4).  DEFAULT IS -114(75 DEC. MSGS)
.AERTB	-114		/.OTS 30
	-114		/.OTS 31
	-114		/.OTS 32
	-114		/.OTS 33
	-114		/.OTS 34
	-114		/.OTS 35
	-114		/.OTS 36
	-114		/.OTS 37
       .END
