Google
 

Trailing-Edge - PDP-10 Archives - decus_20tap2_198111 - decus/20-0028/traps.301
There are 2 other files named traps.301 in the archive. Click here to see a list.
TITLE TRAPS	V.021	15 NOVEMBER 1969
SUBTTL	OVER/UNDERFLOW TRAP ROUTINE	T. EGGERS

T=14	;WORKING ACCUMULATOR
TT=1
Q=16	;AC FOR JSA'S
P=17	;PUSH DOWN POINTER
FXU=1B11	;FLOATING EXPONENT UNDERFLOW FLAG
FOV=1B3		;FLOATING OVERFLOW BIT
NDV=1B12	;NO DIVIDE BIT

OPDEF DDTOUT [CALLI 3]
OPDEF APRENB [CALLI 16]	;TO SET UP APR TRAPPING
OVE=10		;ENABLE INTEGER OVERFLOW TRAPS

;RESTRICTIONS ON OVTRAP ROUTINE:
;	1- NO ANSWER FOR A TRAPPING INSTRUCTION MUST BE STORED
;	   INDEXED BY 17 (PUSH DOWN LIST)
;	2- OVTRAP DOES NOT TRACE XCT OR UUO CHAINS
;	3- THERE ARE NO FIXUPS FOR INTEGER TRAPS
;	4- MOVNX AND MOVMX ARE CONSIDERED INTEGER INSTRUCTIONS
;	5- TRAPPING INSTRUCTION MUST NOT BE IN ACCUMULATOR T=14

ENTRY TRPINI,OVERFL,OVTRAP,OVPCWD,OVCNT
EXTERNAL JOBTPC,JOBAPR,ERRMSG

MLON	;ENABLE MULTI LINE LITERALS

			;PUSHJ P,TRPINI	TO INITIALIZE ALL TRAPPING
TRPINI:	MOVEI TT,OVTRAP
	HRRZM TT,JOBAPR		;INIT OVERFLOW TRAP ADDRESS
; PDL OVERFLOW ADDED FOR SNOBOL TO GIVE A PROPER ERROR MESSAGE
	MOVEI TT,OVE+200000+400000
	JRSTF @[XWD 004000,.+1]		;CLEAR APR FLAGS
	APRENB TT,		;INIT OVERFLOW TRAPPING
	SETZM OVCNT		;INIT # OVERFLOWS TO 0
	POPJ	P,		;RETURN

;ARITHMETIC OVEFLOW TESTING PROGRAM
;THIS ROUTINE IS CALLED IN THE FOLLOWING MANNER:
;	JSA	Q,OVERFL
;	EXP	J
;IF OVERFLOWS HAVE OCCURRED, THE ANSWER IS SET TO 1, AND THE
;COUNTER IS CLEARED. IF THE OVERFLOW COUNTER IS 0, THE ANSWER
;IS SET TO 2.

	SIXBIT /OVERFL/
OVERFL:	0
	SETZM	@(Q)		;CLEAR OUT ANSWER WORD
	AOS	@(Q)		;SET ANSWER TO 1
	SKIPN	OVCNT		;ANY OVERFLOWS?
	AOS	@(Q)		;NO, SET ANSWER TO 2
	SETZM	OVCNT		;RESET OVERFLOW COUNTER
	JRA	Q,1(Q)		;RETURN
OVTRAP:	MOVEM T,TSAVE		;SAVE AC T

; FOLLOWING ADDED TO CHECK FOR PDL OVERFLOWS
	EXTERN OVER,JOBCNI
	MOVE T,JOBCNI
	TRNE T,1B19	;PDL OVERFLOW FLAG
	JRST OVER
; END OF PDL TRAPS CODE
; CHANGE MADE FOR SNOBOL SO IT CAN WORK WITH 4S50 MONITORS

	MOVEI T,110+600000
	APRENB T,

; END OF CHANGE

	SOS T,JOBTPC		;MAKE JOBTPC POINT TO INSTRUCTION
	MOVEM T,OVPCWD		;SAVE PC WORD
	TLNN T,(FXU)		;FLOATING POINT UNDERFLOW?
	JRST OVTRP1

	LDB T,[POINT 9,(T),8]	;GET INSTRUCTION
	CAILE T,177		;POSSIBLE FLOATING POINT?
	JRST TJFCL1		;NO
	CAIGE T,140		;BETWEEN 140 AND 177?
	JRST	[CAIN T,(<FSC>_-9)	;NO, FSC?
		JRST UAC		;YES
					;(UFA AND DFN CAN'T CAUSE UNDERFLOW)
		JRST TJFCL1]		;NO, PRINT ERROR MESSAGE
	ANDI T,7		;MASK TO MODE BITS
	JRST UTBL(T)		;DISPATCH ON INSTRUCTION TYPE


OVTRP1:	TLNN T,(FOV)		;FLOATING OVERFLOW OR FLOATING DIVIDE CHECK?
	JRST TJFCL1		;NO, INTEGER OVERFLOW OR DIVIDE CHECK
	LDB T,[POINT 4,@JOBTPC,12]	;GET AC FIELD
	MOVEM T,ACFLD		;SAVE AC FIELD
	MOVE T,@JOBTPC		;GET INSTRUCTION
	MOVEM T,INST
	MOVE T,TSAVE
	MOVEI T,@INST		;GET EFFECTIVE ADDRESS
	EXCH T,INST		; AND SAVE. PICK UP INSTRUCTION
	TLC T,(042B8)		;CHANGE "MODE 2" TO "MODE 0"
				; AND CHANGE 140-177 TO 100-137
	HLR T,JOBTPC		;GET FLAGS IN RIGHT HALF
	TDNE T,[643B8+<NDV_-^D18>]	;SKIP FOR "TO MEMORY" AND NO NDV
				; NO SKIP FOR INSTRUCTIONS OUTSIDE 140-177(E.G. FSC,XCT,UFA)
	SKIPA T,ACFLD		;GET CORRECT SIGN FROM AC
	MOVE T,INST		;GET CORRECT SIGN FROM MEMORY
	MOVEM T,ACDATA		;SAVE ADDRESS FOR SIGN OF CORRECT RESULT
	MOVE T,TSAVE
	SKIPGE @ACDATA		;SKIP IF CORRECT RESULT IS POSITIVE
	SKIPA T,[XWD 400000,1]	;NO, NEGATIVE
	HRLOI T,377777		;YES
	PUSH P,T		;SAVE OVERFLOW FIX UP
	LDB T,[POINT 9,@JOBTPC,8]	;GET INSTRUCTION
	CAIG T,177
	CAIGE T,140		;NORMAL FLOATING POINT INSTRUCTION
	JRST	[CAIN T,(<FSC>_-9)	;NO, FSC?
		JRST AC		;YES
		CAIN T,(<UFA>_-9)	;UFA?
		JRST AC1
		POP P,ACDATA	;GET ITEM OFF PDL
		JRST TJFCL1]	;PROBABLY AN XCT
	ANDI T,7
	JRST TBL(T)
;THIS PAGE FOR OVERFLOWS AND DIVIDE CHECKS

TBL:	JRST AC
	JRST ACLONG
	JRST MEMORY
	JRST BOTH
	JRST AC
	JRST AC
	JRST MEMORY
	;JRST BOTH

BOTH:	PUSH P,(P)		;SAVE ANOTHER COPY
BOTH1:	MOVE T,TSAVE
	POP P,@ACFLD		;LOAD AC
	POP P,@INST		;LOAD MEMORY
	JRST TJFCL

AC1:	AOS T,ACFLD
	ANDI T,17		;MASK AC+1 TO 4 BITS
	MOVEM T,ACFLD
AC:	MOVE T,TSAVE
	POP P,@ACFLD		;LOAD AC
	JRST TJFCL

ACLONG:	MOVE T,ACFLD		;GET AC
	ADDI T,1
	ANDI T,17
	MOVEM T,INST		;PUT AC+1 INTO MEMORY ADDRESS
	POP P,ACDATA		;GET SIGN OF ANSWER INTO BETTER PLACE
	PUSH P,[XWD 344777,-1]	;SAVE A POS LOW WORD
	HRLOI T,377777		;ASSUME A POSITIVE HIGH WORD
	SKIPGE ACDATA		;SHOULD RESULT BE POSITIVE?
	DFN T,(P)		;NO, NEGATE IT
	PUSH P,T		;PUT OTHER ARG ON PDL
	JRST BOTH1

MEMORY:	MOVE T,TSAVE
	POP P,@INST
	JRST TJFCL
;THIS PAGE FOR UNDERFLOWS ONLY

UTBL:	JRST UAC		;ZERO AC
	JRST UACLNG		;ZERO AC, AC+1
	JRST UMEMRY		;ZERO E
	JRST UBOTH		;ZERO AC,E
	JRST UAC
	JRST UAC
	JRST UMEMRY
	;JRST UBOTH

UBOTH:	MOVE T,@JOBTPC		;GET OFFENDING INSTRUCTION
	TLZ T,777000		;ZERO OP CODE
	TLO T,(SETZB)		;CHANGE TO "SETZB AC,E"
	JRST UAC2

UMEMRY:	MOVE T,@JOBTPC
	TLZ T,777740		;ZERO OP CODE, AC FIELD
	TLO T,(SETZM)		;CHANGE TO "SETZM E"
	JRST UAC2

UACLNG:	LDB T,[POINT 4,@JOBTPC,12]	;GET AC FIELD
	DPB T,[POINT 4,T,12]	;COPY INTO AC FIELD
	ADDI T,1		;CHANGE AC TO AC+1
	TRZ T,20		;MASK TO 4 BITS
	TLO T,(SETZB)		;CHANGE TO "SETZB AC,AC+1"
	JRST UAC2

UAC:	HLLZ T,@JOBTPC		;GET OFFENDING INSTRUCTION
	TLZ T,777037		;ZERO OP CODE, XR,@, LEAVE AC
	TLO T,(SETZ)		;CHANGE TO "SETZ AC,"
UAC2:	EXCH T,TSAVE		;SAVE INSTRUCTION, RESTORE T
	XCT TSAVE		;CLEAR THE REQUIRED REGISTERS

TJFCL:	MOVEM T,TSAVE		;SAVE T AGAIN
TJFCL1:	AOS JOBTPC		;JOBTPC POINTS TO NEXT INSTRUCTION
	MOVE T,@JOBTPC		;GET NEXT INSTRUCTION
	TLC T,(<JFCL>)		;COMPLEMENT "JFCL" BITS
	TLNE T,777000		;JFCL INSTRUCTION?
	JRST ERRPNT		;NO, PRINT ERROR MESSAGE
	TRNE T,-1		;ADDRESS SPECIFIED ON JFCL?
	MOVEM T,JOBTPC		;YES, GO THERE
	TLNE T,(<JFCL 17,>)	;IS OVERFLOW BIT SET IN JFCL?
	JRST ERRPNT		;YES, TYPE ERROR MESSAGE
RETURN:	JRSTF @[XWD 004000,.+1]	;CLEAR APR FLAGS, LEAVE "USER IOT" SET
	MOVE T,TSAVE		;RESTORE T
	JRST @JOBTPC
ERRPNT:	MOVE T,OVPCWD		;GET FLAGS
	TLNN T,(FXU)
	AOS OVCNT		;COUNT OVERFLOWS AND DIVIDE CHECKS
	TLNN T,(FOV)		;FLOATING POINT TRAP?
	JRST	[HRRI T,1	;NO, ASSUME INTEGER OVERFLOW
		TLNE T,(NDV)	;INTEGER DIVIDE CHECK?
		MOVEI T,2	;YES
		JRST MSG2]
	HRRI T,3		;ASSUME FLOATING POINT OVERFLOW
	TLNE T,(NDV)		;FLOATING DIVIDE CHECK?
	MOVEI T,5		;YES
	TLNE T,(FXU)		;FLOATING UNDERFLOW?
	MOVEI T,4		;YES
MSG2:	HRL T,MTABLE-1(T)	;GET ADDRESS OF MESSAGE, AND
	MOVSM T,MSG4		;SAVE IT FOR ERROR MESSAGE PRINTOUT
	MOVE T,MBTAB-1(T)	;GET BYTE POINTER FOR STORING PC
	MOVEM T,PSTO		;SAVE IT
	PUSH P,T+1		;SAVE ANOTHER AC
	HRLO T+1,OVPCWD		;GET PC, PUT 1'S IN RIGHT HALF
MSG3:	MOVEI T,0		;CONVERT BINARY TO OCTAL AND STORE IN MESSAGE
	LSHC T,3
	ADDI T,"0"
	IDPB T,PSTO
	TRNE T+1,-1
	JRST MSG3

	POP P,T+1		;RESTORE AC
	JSA 16,ERRMSG		;GET MESSAGE PRINTED
MSG4:	.-.			;# OF MESSAGE, ADDRESS OF MESSAGE
	JRST RETURN

MTABLE:	MINOV
	MINNDV
	MFOV
	MFXU
	MFNDV

MBTAB:	POINT 7,MINOV1,-1
	POINT 7,MINDC1,27
	POINT 7,MFOV1,6
	POINT 7,MFXU1,13
	POINT 7,MFNDV1,-1
MINOV:	ASCII /INTEGER OVERFLOW	PC=/
MINOV1:	ASCIZ /000000/

MINNDV:	ASCII /INTEGER DIVIDE CHECK/
MINDC1:	ASCIZ /	PC=000000/

MFOV:	ASCII /FLOATING OVERFLOW	PC/
MFOV1:	ASCIZ /=000000/

MFXU:	ASCII /FLOATING UNDERFLOW	P/
MFXU1:	ASCIZ /C=000000/

MFNDV:	ASCII /FLOATING DIVIDE CHECK	PC=/
MFNDV1:	ASCIZ /000000/
PSTO:	BLOCK 1		;BYTE POINTER

OVPCWD:	BLOCK 1		;PC WORD WHEN TRAP OCCURS
OVCNT:	BLOCK 1		;COUNT OVERFLOWS
TSAVE:	BLOCK 1		;TEMP FOR AC T
ACFLD:	BLOCK 1		;ADDRESS OF ACCUMULATOR
ACDATA:	BLOCK 1		;HOLDS SIGN OF CORRECT ANSWER
INST:	BLOCK 1		;HOLDS INSTRUCTION OR "E"
REPEAT 0,<

DESCRIPTION OF "TRAPS" PROGRAM FOR LIB40-

I. THE PURPOSE OF THE TRAPS PROGRAM IS DO ERROR DETECTION
   AND CORRECTION WHEN ARITHMETIC FAULTS OCCUR DURING THE
   EXECUTION OF FORTRAN PROGRAMS.

II. THE TRAPS PROGRAM CONSISTS OF THREE DISTINCT PARTS:

	A. TRPINI
		1. CALLING SEQUENCE- PUSHJ P,TRPINI
						;RETURN
		2. THE OVERFLOW COUNTER, OVCNT, (USED BY THE OVERFL
		      FUNCTION) AND THE PC WORD FLAGS ARE CLEARED
		3. PROCESSOR AND MONITOR TRAPPING ON OVERFLOW (PC WORD
		      BIT 0) IS ENNABLED

	B. OVERFL IS THE STANDARD FORTRAN OVERFLOW FUNCTION
		1. CALLING SEQUENCE-	JSA 16,OVERFL
					ARG	J
						;RETURN
		2. IF OVCNT=0, THEN J_1
		3. IF OVCNT=/0, THEN J_2
		4. THE OVERFLOW COUNTER, OVCNT, IS CLEARED TO 0

	C. OVTRAP IS A USER-MODE INTERRUPT ROUTINE WHICH IS STARTED
	  BY THE MONITOR WHEN AN ARITHMETIC FAULT OCCURS
		1. THE PC WORD (WITH THE ADDRESS OF THE INSTRUCTION
		      CAUSING THE TRAP) IS STORED IN OVPCWD
		2. FOR FLOATING POINT INSTRUCTIONS
		      A. THE FAULTY ANSWER IS PATCHED TO BE 0
			 FOR UNDERFLOWS, OR PLUS OR MINUS (THE
			 SIGN WILL BE THAT OF THE CORRECT ANSWER)
			 THE LARGEST POSSIBLE NUMBER
			 FOR OVERFLOWS OR DIVIDE CHECKS
		3. (FOR INTEGER INSTRUCTIONS, NO PATCHING OF ANSWERS
		      IS DONE.)
		4. IF THE INSTRUCTION AFTER THE TRAPPING INSTRUCTION
		      IS JFCL
		      A. DO NOT TYPE AN ERROR MESSAGE
			 UNLESS BIT 9 (AR OV TEST BIT) IS 1
		      B. DO NOT INDEX THE OVERFLOW COUNTER OVCNT
		      C. IF THE ADDRESS (BITS 18-35) OF THE JFCL
			 ARE NON-ZERO, THE INTERRUPTED PROGRAM WILL
			 BE RESTARTED AT THE EFFECTIVE ADDRESS OF
			 THE JFCL
		      D. IF THE ADDRESS OF THE JFCL IS ZERO, THE
			 INTERRUPTED PROGRAM WILL BE RESTARTED AT
			 THE JFCL
		5. IF THE INSTRUCTION AFTER THE TRAPPING INSTRUCTION
		      IS NOT JFCL
		      A. INDEX THE OVERFLOW COUNTER, OVCNT
		      B. TYPE AN ERROR MESSAGE, USING SUBROUTINE "ERRMSG",
			 OF THE FOLLOWING FORM:

			INTEGER     OVERFLOW
			FLOATING    UNDERFLOW	PC=NNNNNN
				    DIVIDE CHECK

		      C. THE INTERRUPTED PROGRAM WILL BE RESTARTED AT
			 THE INSTRUCTION AFTER THE TRAPPING INSTRUCTION
		6. THE PROCESSOR FLAGS (PC WORD FLAGS) ARE CLEARED
		7. THE INTERRUPTED PROGRAM IS RESTARTED

III. LIMITATIONS

	A. OVTRAP FIXUPS WILL NOT WORK ON THE PDP-6 FOR-
		1. THE LOW ORDER WORD OF FXXRL OR FXXL INSTRUCTIONS
		2. EXPONENT UNDERFLOW OR DIVIDE CHECK TRAPS

	B. FLOATING POINT FIX UPS WILL NOT OCCUR FOR INSTRUCTIONS
	   THAT ARE EXECUTED BY AN XCT OR A UUO, OR FOR INSTRUCTIONS
	   THAT ARE IN ACCUMULATOR T=14


	C. THE MEMORY FIX UPS FOR THE FLOATING POINT INSTRUCTIONS
	   WILL NOT WORK PROPERLY IF THE ANSWER IS STORED INDEXED
	   BY 17 (THE PUSH DOWN POINTER). EXAMPLES:

			FADRM AC,(17)
			FMPRB AC,-2(17)
			FDVM  AC,+1(17)

	D. MOVNX AND MOVMX ARE INTEGER INSTRUCTIONS AND WILL HAVE
	   NO FLOATING POINT FIX UPS IF THEY CAUSE OVERFLOW
	E. TRAPPING INSTRUCTION MUST NOT BE IN ACCUMULATOR T=14
	F. THE SIGN OF F.P. DIVIDE CHECK FIX UPS WILL BE CORRECT
	    ONLY WHEN DIVIDING BY ZERO. (THIS IMPLIES THAT THE
	    ARGUMENTS FOR DIVIDE CHECKS SHOULD BE NORMALIZED.)

>	;END REPEAT 0

END