Trailing-Edge
-
PDP-10 Archives
-
BB-D480F-BB_1985_short
-
mthtrp.mac
There are 9 other files named mthtrp.mac in the archive. Click here to see a list.
SEARCH MTHPRM
TV MTHTRP ARITHMETIC TRAP HANDLER,2(4017)
SUBTTL CHRIS SMITH/CKS/JLC/DAW 31-Jul-79
;COPYRIGHT (C) DIGITAL EQUIPMENT CORPORATION 1981, 1985
;ALL RIGHTS RESERVED.
;
;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED
;ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE
;INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER
;COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY
;OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY
;TRANSFERRED.
;THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE
;AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT
;CORPORATION.
;DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS
;SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL.
COMMENT \
***** Begin Revision History *****
Modified from LIB40 TRAPS version 32A(444)
1100 CKS 10-Aug-79
Rewrite for version 6
Remove KA code and fixups for KA-format double precision instructions
Add integer fixups (not enabled)
Change UTRP instruction to JSR (can't use PUSHJ because DDT's stack
pointer is AC 1)
Reorder stuff to optimize for SWTRP and UTRP
Add fixups for G-format DP numbers
1217 JLC 09-Dec-80
Fix integer divide check so it "patches" the answer
1464 DAW 12-May-81
Error messages.
1466 CKS 18-May-81
Use XSIR-format tables if the monitor supports them
1526 BL 9-Jul-81
Make %PSIINI 'IF20'-conditional.
1531 JLC 10-Jul-81
Typo in edit 1526.
1572 JLC 31-Jul-81 Q10-6348
Setup F before calling trap error typeout.
1656 DAW 2-Sep-81
Get rid of magic numbers.
1662 DAW 4-Sep-81
New routine %CALU.
1700 BL 10-Sep-81
Remove INTERN %CALU from 'IF20'.
1731 DAW 21-Sep-81
Overflows not filling in the right stuff.
1753 DAW 29-Sep-81
Don't call %TRACE on LERR's - PC is part of message now.
2033 DAW 19-Nov-81
Don't do XSIR% unless FOROTS is running in a non-zero section;
otherwise the Release 4 EXEC gets confused.
***** Begin Mathlib *****
3056 JLC 23-Mar-82
Change the names of the error tables, add 1.
3122 JLC 29-Apr-82
MATHLIB integration. Return to program if the instruction
after the trapped one is JFCL with flag bits. If JFCL with
no flag bits, do standard fixup and return to user program
or address if address is specified. If other instruction,
call error routine via $TCALL, which will print error
message if not over message limit, and call a user trap
routine (if specified) with the unfixed result and its type,
allowing the user to supply a fixup.
Removed the non-preferred trapping mechanisms for both
TOPS-10 and TOPS-20, as the preferred methods (UTRP. on
the -10 and SWTRP% on the -20) are both standard in the
currently released monitors.
3203 JLC 27-May-82
Fixed typo at NOCALU, TRNE was TRNN, so trap returned
to AC0 instead of routine.
3204 JLC 2-Jun-82
Removed ERR segment.
3205 JLC 3-Jun-82
Moved the error character to the first argument in TERRs.
3211 JLC 26-Jun-82
Fixed the documentation to reflect the separation of the
data type and the "2nd error number" in the user subroutine
call.
3213 JLC 20-Jul-82
Save user's PDP in %ERPDP in trap processing, so that error
processor can call GETPC to get module name.
3214 JLC 16-Aug-82
Fix code at NOCLRF so it gets the original flags into PC
for JRSTF. Turn off extraneous bits (namely, WRONGBIT) before
using index into XLOAD and XSTORE.
3222 JLC 9-Nov-82
Install patch to use APRENB instead of UTRP for the KS-10
to avoid microcode/monitor bug which caused infinite loops
in the overflow trap code.
3225 CKS 3-Jan-83
Clear floating underflow PC flag when returning from underflow trap
caught by JOV. Otherwise, since the JOV only clears overflow, you
get stray underflow flags left around.
***** Begin Version 1A *****
3243 BCM 29-Mar-83
Get and clear PC flags with new GETFLG and RESFLG macros. Fixes
always clearing underflow in MTHTRP. Only applies to JOV branches.
3252 MRB 27-Sep-83 10-34127
Changed error message "integer overflow" to "Arithmetic
integer overflow" to avoid confusion with "Input integer
overflow".
***** End Revision History *****
***** Begin Version 2 *****
4006 JLC 27-Oct-83
Removed edit 3252, as confusion is now removed by the
word "Input" for the input overflows.
4013 JLC 12-Jun-84
Added code to get XCT of a trapped instruction right most
of the time.
4017 JLC 16-Jan-85
Fix TOPS-10 extended addressing trap code.
\
SEGMENT CODE
ENTRY %TRPINI
EXTERN %TRFLG,%ERRPC,%UNFXD,%FIXED,%ERTYP,%ERPDP
EXTERN %ABORT
COMMENT \
DESCRIPTION OF "TRAPS" PROGRAM FOR MATHLIB-
I. THE PURPOSE OF THE TRAPS PROGRAM IS DO ERROR DETECTION,
CORRECTION, AND REPORTING 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
2. PROCESSOR AND MONITOR TRAPPING ON OVERFLOW (PC WORD
BIT 0) IS ENABLED
B. ERRSET is a user-callable subroutine to set the conditions
for trap handling.
CALL ERRSET (N)
or CALL ERRSET (N, I)
or CALL ERRSET (N, I, SUBR)
where N = max number of error messages to type
I = which error this call applies to. One of:
-1 any of the following
0 integer overflow
1 integer divide check
4 floating overflow
5 floating divide check
6 floating underflow
if I is not specified, -1 is assumed
SUBR = routine to call on the trap
C. OVTRAP IS THE USER-MODE INTERRUPT ROUTINE WHICH IS STARTED
BY THE MONITOR WHEN AN ARITHMETIC FAULT OCCURS.
1. The PC word (with the address+1 of the instruction
causing the trap) is stored in PC.
2. FOR FLOATING POINT INSTRUCTIONS
A. FOR OVERFLOWS AND DIVIDE CHECKS,
THE FAULTY ANSWER IS PATCHED
TO BE PLUS OR MINUS (THE SIGN WILL BE THAT
OF THE CORRECT ANSWER)THE LARGEST POSSIBLE
NUMBER.
B. FOR UNDERFLOWS, THE FAULTY ANSWER IS NORMALLY
PATCHED TO BE 0. HOWEVER, IF THE INSTRUCTION
FOLLOWING THE TRAPPING INSTRUCTION IS A JFCL
WITH BIT 16 (XR2) SET, THE ANSWER WILL BE
UN-NORMALIZED ENOUGH TO BRING THE EXPONENT
BACK INTO RANGE.
3. For integer instructions, no attempt is made to fix
up the faulty result. The problem is with the instructions
AOJX, AOSX, SOJX, and SOSX. These can modify the PC
and overflow. The new PC stored by the overflow trap
does not point to the instruction that overflowed, so
the recovery code will "fix" up a random instruction. The
probability of this occurrence is small, but if it does
happen there is no way to limit the consequences.
The only available solution is to not touch any integer
overflow.
4. IF THE INSTRUCTION AFTER THE TRAPPING INSTRUCTION
IS JFCL
A. DO NOT TYPE AN ERROR MESSAGE
B. DO NOT INCREMENT THE TRAP COUNTER ENTRY
C. IF ANY FLAG BITS ARE ON (9-12), IMMEDIATELY
RETURN TO THE PROGRAM WITHOUT CLEARING THE
FLAGS, AS IF THERE WERE NO TRAP HANDLER.
D. IF THE ADDRESS (BITS 18-35) OF THE JFCL
ARE NON-ZERO, THE INTERRUPTED PROGRAM WILL
BE RESTARTED AT THE ADDRESS OF THE JFCL
(THE @ AND INDEX FIELDS ARE IGNORED FOR
THE EFFECTIVE ADDRESS).
E. 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. INCREMENT THE TRAP COUNTER ENTRY
B. TYPE AN ERROR MESSAGE WITH THE FOLLOWING INFORMATION:
FLOATING OR INTEGER FAULT
OVERFLOW, UNDERFLOW, OR DIVIDE CHECK
ADDRESS OF FAULTING INSTRUCTION
C. IF A USER SUBROUTINE SUBR IS SPECIFIED BY A PREVIOUS
CALL TO ERRSET (SEE ABOVE), THE TRAP HANDLER
SIMULATES A CALL TO THE SUBROUTINE:
CALL SUBR (TRPNUM,PC,NUM2,VARTYP,UNFXD,FIXED)
WHERE TRPNUM IS THE TRAP NUMBER, PC IS THE
LOCATION OF THE TRAP RETURNED BY THE
MONITOR (WHICH MAY BE THE ADDRESS OF AN
XCT OR UUO WHICH THEN EXECUTED THE ACTUAL
INSTRUCTION TRAPPED), NUM2 IS A 2ND ERROR NUMBER
RESERVED FOR FUTURE USE, VARTYP IS THE TYPE CODE
OF THE VARIABLE MODIFIED BY THE TRAPPED
INSTRUCTION, UNFXD IS THE UNFIXED VALUE
OF THE VARIABLE, AND FIXED IS THE FORTRAN
FIXED VALUE. FORTRP USES THE VALUE RETURNED
IN FIXED, SO THAT THE USER MAY SUBSTITUTE
FOR THE FORTRAN FIXUP. NOTE THAT WHILE INTEGER
OVERFLOWS ARE TRAPPED, FIXUPS ARE NOT DONE.
(SEE NOTE ABOVE REGARDING INTEGER INSTRUCTIONS.)
D. THE INTERRUPTED PROGRAM WILL BE RESTARTED AT
THE INSTRUCTION AFTER THE TRAPPING INSTRUCTION
E. THE PROCESSOR FLAGS (PC WORD FLAGS) ARE CLEARED
EXCEPT FOR CRY0, CRY1, AND USER IOT.
F. THE INTERRUPTED PROGRAM IS RESTARTED
III. LIMITATIONS
A. Fixups are not made for KA-format double precision
numbers. The instructions FADL, FSBL, FMPL, FDVL,
UFA, and DFN are not recognized as requiring fixups.
B. 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)
C. MOVNX and MOVMX are integer instructions and will have
get integer fixups if they cause overflow. These
instructions can't overflow when dealing with normalized
floating point numbers.
D. THE TRAPPING INSTRUCTION MUST NOT BE IN AC 0.
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.)
\
;PC FLAGS
;THESE FLAGS SHOULD BE DEFINED IN FORPRM INSTEAD
UBITS==PC%USR+PC%UIO ;FOR NOW, THE FLAGS WE WANT NOT
;TO TURN OFF. WE REALLY
;WANT TO JUST TURN OFF
;THE FLAGS WE ARE INTERESTED IN
;ENTRY POINT TO INITALIZE TRAP HANDLER
%TRPINI:
XMOVEI T1,. ;Get section number
HLLZM T1,MSECT ;SAVE SECTION NUMBER OF TRAP HANDLER
TLNN T1,-1 ; Are we running in section 0?
JRSTF @[UBITS+SETRAP] ;YES. DO JRSTF TO CLEAR FLAGS
XMOVEI T1,SETRAP ;Place to go
MOVEM T1,TRPBLK+1 ;Save in 2nd word
MOVE T1,[UBITS] ;Flags
MOVEM T1,TRPBLK ;Save in 1st word
XJRSTF TRPBLK ;** Clear arithmetic flags **
IF20,<
SETRAP: XMOVEI T1,OVTRP ;SET TRAP ADDRESS IN CONTROL BLOCK
MOVEM T1,NPC
MOVEI T1,.FHSLF ;THIS FORK
MOVEI T2,.SWART ;SET ARITHMETIC TRAP ADDRESS
XMOVEI T3,TRPBLK ;POINT TO CONTROL BLOCK
SWTRP% ;TELL MONITOR
POPJ P, ;DONE
> ;END IF20
IF10,<
; This code is to alleviate a problem caused by a
; microcode bug in the KS processor running under
; TOPS-10. It should be removed when the problem
; has been corrected (don't hold your breath).
; The code will check to see
; if the processor type is a KS10, then use the
; APRENB trapping to avoid the problem with UTRP.
SETRAP: MOVE T1,[%CCTYP] ;get processor type from
GETTAB T1, ; the CPU data constants
JRST NUTRP ;CAN'T FAIL
MOVEI T1,(T1) ;get just right half
CAIN T1,.CCKSX ;if the processor is a KS
JRST NUTRP ;then use APRENB trapping.
MOVE T1,[JRST OVINT] ;SET UP JRST TO HIGH SEG
MOVEM T1,LTRAP+1 ;STORE IN WRITABLE MEMORY FOR JSR
MOVE T1,[1,,[2 ;SET TRAP,,BLOCK LENGTH
.UTAOF ;TRAP ON ARITHMETIC OVERFLOW
JSR LTRAP]] ;INSTRUCTION TO EXECUTE ON TRAP
UTRP. T1, ;SET INSTRUCTION TO EXECUTE
JRST NUTRP ;TOO BAD, NO TRAPPING
POPJ P, ;DONE
;APRENB TRAPPING. USE ONLY IF WE'RE ON A KS OR UTRP DOESN'T WORK.
NUTRP: MOVEI T1,APRTRP ;GET TRAP ADDRESS
HRRZM T1,.JBAPR ;STORE IN JOBDAT
MOVEI T1,AP.REN+AP.AOV+AP.FOV ;TRAP ON OVERFLOW
APRENB T1, ;ENABLE TRAPS
POPJ P, ;DONE
;HERE FROM MONITOR ON APRENB TRAP
;MOVE PC TO WHERE UTRP WOULD HAVE PUT IT
APRTRP: PORTAL .+1 ;OK TO ENTER HERE FROM PUBLIC PAGE
DMOVEM T0,ACS ;SAVE T0-T1
MOVE T0,.JBTPC ;GET TRAP PC
MOVEM T0,LTRAP ;STORE IT IN RIGHT PLACE
JRST OVZERO ;JOIN UTRP CODE
;HERE FROM JSR ON DIRECT OVERFLOW TRAP
;[4013] NEW CODE
OVINT: PORTAL .+1 ;OK TO ENTER HERE FROM PUBLIC PAGE
DMOVEM T0,ACS ;SAVE T0-T1
SKIPN MSECT ;SHOULD WE BE IN A NON-ZERO SECTION?
JRST OVZERO ;NO
XMOVEI T0,0 ;ARE WE ALREADY THERE?
JUMPN T0,OVNONZ ;YES
MOVE T0,MSECT ;GET SECTION # OF TRAP HANDLER
HRRI T0,OVNONZ ;AND ADDRESS OF A PLACE TO GO
XJRST T0 ;AND GO THERE
> ;END IF10
;THIS CODE ATTEMPTS TO GET ALL THE DATA THAT THE SWTRP JSYS GETS
;ON TOPS-20. THE COMPLICATED PART IS THE CALCULATION OF THE EFFECTIVE
;ADDRESS OF THE TRAPPED INSTRUCTION. THIS IS DONE BY GETTING THE LOCAL
;(18-BIT) ADDRESS FROM THE TRAPPED INSTRUCTION, THEN MOVING THE INDIRECT
;AND INDEX BITS TO THEIR PLACE IN EFIW FORMAT, AND USING AN INDIRECTED
;XMOVEI INSTRUCTION TO CALCULATE THE EFFECTIVE ADDRESS (THIS MUST BE
;DONE BECAUSE THE TRAPPED INSTRUCTION MAY, IN FACT, BE IN A DIFFERENT
;SECTION THAN THE TRAP HANDLER). NOTE THAT IF THE TRAPPED INSTRUCTION IS
;INDEXED, THE INDEX REGISTER MUST BE EXAMINED TO SEE IF IT CONTAINS A
;SECTION NUMBER. IF IT DOES, THE Y FIELD OF THE TRAPPED INSTRUCTION IS
;AN OFFSET, AND THUS DOES NOT GET A SECTION NUMBER ATTACHED TO IT IN
;THE EFFECTIVE ADDRESS CALCULATION.
OVNONZ: SFM FLGS ;SAVE FLAGS WHERE THEY BELONG
MOVE T0,LTRAP ;NON-ZERO SECTION. GET PC
MOVEM T0,PC ;SAVE IT
SUBI T0,1 ;DECREMENT TO POINT AT TRAP INSTRUCTION
MOVE T0,@T0 ;GET TRAP INSTRUCTION
XCTNZ: HLRM T0,INST ;[4017] STORE TRAP INSTRUCTION
HRRZM T0,INDADR ;SAVE LOCAL ADDRESS OF TRAPPED INST
HLLZ T0,T0 ;TOSS THE LOCAL ADDRESS
TLZ T0,777740 ;CLEAR THE INSTRUCTION AND AC FIELDS
LSH T0,^D12 ;MOVE IND,IDX TO EFIW FIELDS
MOVEM T0,INDTMP ;[4017] SAVE IND, IDX FIELDS
TLZ T0,200000 ;[4017] CLEAR IND FIELD
JUMPN T0,NZIDX ;IF INDEX, GO CHECK INDEX REGISTER
HRRZ T0,INDADR ;NO INDEXING. GET LOCAL ADDRESS AGAIN
CAILE T0,17 ;IS IT AN AC?
JRST NZGSN ;NO. USE PC-SECTION
HRLI T0,1 ;YES. GET AC GLOBAL ADDRESS
JRST GETEA ;AND GO CALCULATE EFFECTIVE ADDRESS
NZIDX: XMOVEI T0,@T0 ;[4017] GET INDEX REG
TLZN T0,-1 ;[4017] IS IT EXTENDED REG?
NZGSN: IOR T0,PC ;[4017] NO. GET SECTION NUMBER IN LEFT HALF
GETEA: IOR T0,INDTMP ;[4017] GET IND, IDX AGAIN
HLLM T0,INDADR ;SAVE EFIW IND, IDX, AND SECTION NUMBER
MOVE T0,ACS ;GET SAVED T0
XMOVEI T0,@INDADR ;DO EACALC
MOVEM T0,E ;SAVE EFFECTIVE ADDRESS OF TRAPPED INST
JRST OVTRAP ;JOIN COMMON CODE
OVZERO: MOVE T0,LTRAP ;GET TRAP PC AND FLAGS
HLLZM T0,FLGS ;SAVE FLAGS
HRRZM T0,PC ;AND PC
SUBI T0,1 ;DECREMENT TO POINT AT TRAP INSTRUCTION
MOVE T0,@T0 ;GET TRAP INSTRUCTION
HLRM T0,INST ;STORE TRAP INSTRUCTION
MOVEI T0,@T0 ;GET EFFECTIVE ADDRESS
MOVEM T0,E ;SAVE IT
JRST OVTRAP ;JOIN COMMON CODE
;HERE ON OVERFLOW TRAP WITH TRPBLK FILLED IN
OVTRP: DMOVEM T0,ACS ;SAVE T0-T1
;CHECK HERE IF WE GOT A TRAP WITHIN A TRAP ROUTINE (FATAL).
OVTRAP: MOVEM P,%ERPDP ;SAVE CURRENT PDP FOR ERROR REPORTING
MOVE T0,PC ;GET PC OF TRAP + 1
SUBI T0,1 ;GET PC OF TRAP
MOVEM T0,%ERRPC ;SAVE FOR ERROR REPORTING
SKIPE %TRFLG ;WERE WE IN A TRAP ALREADY?
$TCALL TDT,%ABORT ;TRAP DURING TRAP PROCESSING
;[3122]CHECK THE INSTRUCTION AFTER THE TRAPPED ONE. IF IT IS
;JFCL WITH FLAGS, RETURN TO THE USER PROGRAM WITHOUT TURNING
;OFF THE FLAGS.
TRAPOK: HLRZ T0,@PC ;GET INSTRUCTION AFTER TRAP
TRZ T0,37 ;SHUT OFF I AND X
TRZN T0,740 ;ANY AC BITS?
JRST NOTJF ;NO. CAN'T BE JFCL WITH FLAGS
CAIE T0,(JFCL) ;[3243] YES. IS IT A JFCL?
JRST NOTJF ;[3243] NO, GO HANDLE THE TRAP
DMOVE T0,ACS ;[3243] YES, RESTORE ACS AND RETURN NOW
JRST @PC ;[3243] WITHOUT SETTING ANY FLAGS
NOTJF: SETOM %TRFLG ;SET FLAG FOR INSIDE TRAP ROUTINE
DMOVEM T2,ACS+T2 ;SAVE T2-T3
LDB T1,[POINT 9,INST,26] ;GET OPCODE OF TRAP INSTRUCTION
CAIL T1,100 ;OUTSIDE TABLE RANGE?
CAILE T1,377
MOVEI T1,100 ;YES, SET TO INNOCUOUS TABLE ENTRY
IDIVI T1,4 ;4 BYTES PER WORD
LDB T1,BPTAB(T2) ;GET FLAG BITS FOR THIS INSTRUCTION
JUMPE T1,XRET ;INSTRUCTION CAN'T OVERFLOW, DON'T TRY FIXUPS
LDB T2,[POINT 4,INST,30] ;GET AC FIELD OF INSTRUCTION
CAIG T2,T3 ;DOES INST USE ACS T0-T3?
XMOVEI T2,ACS(T2) ;YES, RELOCATE TO SAVED ACS
MOVEM T2,AC ;SAVE AC ADDRESS OF INSTRUCTION
MOVE T2,E ;GET EFFECTIVE ADDRESS
CAIG T2,T3 ;IN SAVED ACS?
XMOVEI T2,ACS(T2) ;YES, RELOCATE
MOVEM T2,E
CAIE T1,SP ;SPECIAL INSTRUCTION?
JRST SPCONT ;NO. NORMAL INST
;SPECIAL CASES (EXTEND INSTRUCTIONS, XCT)
;[3122] FOR FIX, FIXR, PUT THE UNFIXED RESULT (A REAL VALUE) IN THE AC
SPINST: LDB T1,[POINT 9,INST,26] ;GET OPCODE AGAIN
CAIN T1,(<XCT>B9) ;XCT INSTRUCTION?
JRST SPXCT ;YES, GO HANDLE
CAIN T1,(<EXTEND>B9) ;EXTEND?
JRST SPEXT ;YES
;MUST BE A FIX OR FIXR
SPFIX: MOVE T0,@E ;GET THE UNFIXED QUANTITY
MOVEM T0,@AC ;PRETEND THE AC GOT THE UNFIXED VALUE
MOVEI T1,SPRA ;TELL THE USER IT'S A REAL VALUE
JRST SPCONT ;AND CONTINUE
SPEXT: MOVE T1,ACS+T1 ;RESTORE NONZERO ACS
DMOVE T2,ACS+T2
MOVE T0,@E ;GET EXTENDED INST
XMOVEI T1,@T0 ;GET ITS EFFECTIVE ADDRESS
CAIG T1,T3 ;IN SAVED ACS?
XMOVEI T1,ACS(T1) ;YES, RELOCATE
MOVEM T1,E ;Store real E
LDB T1,[POINT 9,T0,8] ;GET EXTEND OPCODE
CAIL T1,020 ;OUTSIDE TABLE RANGE?
CAILE T1,031
MOVEI T1,020 ;YES, SET TO INNOCUOUS TABLE ENTRY
ADDI T1,400-020 ;OFFSET TO END OF MAIN TABLE
IDIVI T1,4 ;9 BYTES PER WORD
LDB T1,BPTAB(T2) ;GET FLAG BITS FOR INSTRUCTION
JUMPE T1,XRET ;IF INST CAN'T OVERFLOW, DON'T TRY FIXUP
TRZN T1,WRONGBIT ;DOES INST LEAVE RESULT IN WRONG OPERAND?
JRST SPCONT ;NO, FINE
MOVE T0,@E ;GET OPERAND
MOVEM T0,@AC ;STORE IN AC FOR SIGN FIXUP
JRST SPCONT ;GO CONTINUE AS IF NORMAL INST
SPXCT: DMOVE T0,ACS ;RESTORE ACS
DMOVE T2,ACS+T2
MOVE T0,@E ;GET XCTED INST
SKIPE MSECT ;[4013]NON-ZERO SECTION?
JRST XCTNZ ;[4013]YES. MUST BE HANDLED MORE CAREFULLY
XMOVEI T1,@T0 ;GET ITS EFFECTIVE ADDRESS
CAIG T2,T3 ;IN SAVED ACS?
XMOVEI T2,ACS(T2) ;YES, RELOCATE
HLRM T0,INST ;STORE INST
MOVEM T1,E ;Store E
JRST OVTRAP ;START OVER
;[3122] SAVE THE UNFIXED RESULT IN %UNFXD
SPCONT: MOVEI T2,(T1) ;COPY FLAGS, ARG TYPE
LSH T2,-4 ;GET JUST FLAGS
ANDI T2,7 ;TURN OFF EXTRA BITS
XCT XLOAD(T2) ;GET UNFIXED RESULT
DMOVEM T2,%UNFXD ;SAVE FOR USER CALL
HLLZ T0,FLGS ;GET PC FLAGS
TLNN T0,(PC%FUF) ;FLOATING UNDERFLOW?
JRST OV ;NO, GO HANDLE OVERFLOW
REPEAT 0,<
MOVE T2,@PC ;GET INSTRUCTION AFTER TRAP INST
TLC T2,(JFCL (2)) ;IS IT A JFCL (2)?
TLNN T2,777002
JRST UNNORM ;YES, GO UNNORMALIZE RESULT
> ;END REPEAT 0
SETZB T2,T3 ;SET FIXED-UP VALUE TO 0
JRST STRET ;DONE
REPEAT 0,<
;THIS CODE HAS BEEN RECODED AND MOVED TO MODULE UNNORM IN MTHSNG, SINCE
;THE USER NOW HAS ACCESS TO THE UNFIXED AND FIXED-UP RESULTS
;VIA ERRSET.
UNNORM: MOVEI T2,(T1) ;COPY FLAGS AND TYPE CODE
LSH T2,-4 ;GET JUST FLAGS
ANDI T2,7 ;TURN OFF EXTRA BITS
XCT XLOAD(T2) ;GET RESULT STORED BY THE HARDWARE, HAS
;CORRECT FRACTION AND EXPONENT TOO LARGE
;BY 400
PUSH P,T1 ;SAVE T1
HLRE T1,T2 ;GET EXPONENT AND SIGN AND SOME FRACTION BITS
ASH T1,-9 ;GET RID OF FRACTION BITS
TSCE T1,T1 ;GET ABS(EXPONENT), SKIP IF POSITIVE FRACTION
TLOA T2,777000 ;NEGATIVE FRACTION, SET EXPONENT TO ALL ONES
TLZ T2,777000 ;POSITIVE FRACTION, SET EXPONENT TO ALL ZEROS
CAME T1,[377,,377] ;SUPPRESS ZERO-BIT SHIFT (-0 IS -256)
ASHC T2,400001(T1) ;UNNORMALIZE FRACTION, KEEP 1 BIT FOR ROUNDING
POP P,T1 ;GET FLAG BITS BACK
TRNE T1,DPBIT ;WAS TRAP INSTRUCTION DOUBLE PRECISION?
JRST DROUND ;YES, GO ROUND DP NUMBER
ADDI T2,1 ;ROUND HIGH WORD OF FRACTION
ASH T2,-1 ;DISCARD ROUNDING BIT
JRST STRET ;DONE
DROUND: TLO T3,(1B0) ;PREVENT INTEGER OVERFLOW WHEN WE ROUND
ADDI T3,1 ;ROUND LOW WORD
TLZN T3,(1B0) ;DID FRACTION OVERFLOW INTO SIGN BIT?
ADDI T2,1 ;YES, PROPAGATE CARRY TO HIGH WORD
ASHC T2,-1 ;DISCARD ROUNDING BIT
JRST STRET ;DONE
> ;END REPEAT 0
;HERE ON FLOATING & INTEGER OVERFLOW AND DIVIDE CHECK
OV: TLNE T0,(PC%NDV) ;NO DIVIDE?
JRST DIVCHK ;YES. CHECK FOR 0/0
TLNN T0,(PC%FOV) ;NO. FLOATING OVERFLOW?
JRST INTRET ;NO. INTEGER FIXUP IS DANGEROUS
JRST NDVCHK ;YES. GO ON WITH FIXUP
DIVCHK: SKIPE @AC ;DIVIDE BY ZERO. ZERO DIVIDEND?
JRST NDVCHK ;NO.
SETZB T2,T3 ;SET FIXED-UP VALUE TO 0
JRST STRET
NDVCHK: TRNN T1,ACBIT ;DID INST STORE ITS RESULT IN THE AC?
TLNE T0,(PC%NDV) ;YES, NO-DIVIDE, WHICH STORES NO RESULT?
SKIPA T2,@AC ;NO, GET RESULT FROM AC
MOVE T2,@E ;ELSE GET RESULT FROM E
TRZE T1,WRONGBIT ;DID INST STORE WRONG SIGN?
TLC T2,(1B0) ;YES, SET CORRECT SIGN
JUMPL T2,NEGOV ;IF CORRECT ANSWER NEGATIVE, GO SET -INF
DMOVE T2,[OCT 377777777777,377777777777] ;GET +INFINITY
JRST STRET
NEGOV: TLNN T0,(PC%FOV) ;FLOATING OVERFLOW?
JRST INTOV ;NO, USE INTEGER -INFINITY
MOVN T2,[OCT 377777777777] ;FLOATING, GET FLOATING -INFINITY
TRNE T1,DPBIT ;WAS INSTRUCTION DOUBLE PRECISION?
DMOVN T2,[OCT 377777777777,377777777777] ;YES, GET IT IN DP
JRST STRET ;GO STORE RESULT AND RETURN
INTOV: DMOVE T2,[OCT 400000000000,0] ;GET INTEGER -INFINITY
;[3122]CALL TCALU, WHICH IF THE INSTRUCTION FOLLOWING THE TRAPPED
;INSTRUCTION IS NOT A JFCL, ISSUES THE ERROR MESSAGE (IF NOT OVER THE
;MESSAGE LIMIT) AND CALLS THE USER-SPECIFIED TRAP SUBROUTINE (IF ANY);
;THEN USE THE RETURNED VALUE OF %FIXED (WHICH WILL BE UNTOUCHED IF
;THE USER DOESN'T DO ANYTHING TO IT).
STRET: DMOVEM T2,%FIXED ;STORE FIXED RESULT
PUSHJ P,TCALU ;CALL USER TRAP ROUTINE
DMOVE T2,%FIXED ;GET FIXED RESULT
LSH T1,-4 ;TOSS DATA TYPE, JUST GET FLAGS
ANDI T1,7 ;TURN OFF EXTRA BITS
XCT XSTORE(T1) ;STORE ANSWER
;RESTORE SOME ACS, CLEAR THE PC FLAGS
XRET: DMOVE T2,ACS+T2 ;RESTORE T2-T3
MOVSI T1,(PC%OVF+PC%FOV+PC%FUF+PC%NDV) ;CLEAR OV, FOV, FUF, NDV
ANDCAB T1,FLGS
SETZM %TRFLG ;WE ARE NO LONGER IN A TRAP
HLLZ T0,PC ;GET LH OF PC+1 OF TRAPPED INST
JUMPE T0,XRET0 ;NOT AN EXTENDED ADDRESSING TRAP
DMOVE T0,ACS ;RESTORE T0-T1
XJRSTF FLGS ;Return to user.
XRET0: HLLM T1,PC ;STORE FLAGS FOR JRSTF
DMOVE T0,ACS ;RESTORE T0-T1
JRSTF @PC
;INTEGER OVERFLOW RETURN - CALL TCALU TO ISSUE THE ERROR MSG AND
;CALL THE USER-SPECIFIED ROUTINE, BUT DO NOT USE THE FIXED-UP RESULT.
INTRET: SETZM %FIXED ;SET FIXED-UP VALUE TO 0
SETZM %FIXED+1
PUSHJ P,TCALU ;CALL USER ROUTINE
JRST XRET ;DON'T USE FIXED-UP VALUE
;[3122] IF THE INST AFTER THE TRAP IS A JFCL WITH NO FLAGS, PROCEED TO DO
;THE STANDARD FORTRAN FIXUP. OTHERWISE, PRINT A MESSAGE AND
;CALL A USER TRAP ROUTINE VIA $TCALL.
TCALU: MOVE T0,@PC ;GET INSTRUCTION AFTER TRAP
TLC T0,(JFCL) ;SEE IF IT'S JFCL
TLNN T0,777000 ;IS IT?
JRST NOCALU ;YES. DON'T PRINT MSG OR CALL USER
MOVEI T2,(T1) ;GET FLAGS AGAIN
ANDI T2,17 ;GET VARIABLE TYPE
MOVEM T2,%ERTYP ;SAVE FOR USER CALL
SETZ T2, ;CREATE AN INDEX
MOVE T0,FLGS ;TESTING THE FLAGS
TLNE T0,(PC%NDV) ;NO-DIVIDE?
TRO T2,1 ;YES
TLNE T0,(PC%FUF) ;FLOATING UNDERFLOW?
TRO T2,2 ;YES
TLNE T0,(PC%FOV) ;FLOATING OVERFLOW?
TRO T2,4 ;YES
XCT TCALTB(T2) ;DO MESSAGE CALL
POPJ P,
NOCALU: TRNE T0,-1 ;ADDR IN JCFL?
HRRM T0,PC ;YES. RETURN TO THAT ADDR
POPJ P,
SEGMENT DATA
IF20,<
;SWTRP BLOCK, FILLED IN BY MONITOR OR MICROCODE ON OVERFLOW TRAP
LTRAP: ;NON-FUNCTIONAL. HERE FOR COMPATIBILITY
TRPBLK:
FLGS: ;LH = PC FLAGS
INST: BLOCK 1 ;RH = LH(TRAP INSTRUCTION)
PC: BLOCK 1 ;PC+1 OF TRAP INSTRUCTION
E: BLOCK 1 ;E OF TRAP INSTRUCTION
NPC: BLOCK 1 ;NEW PC TO USE AT TRAP
>;END IF20
IF10,<
TRPBLK:
LTRAP: BLOCK 2 ;JSR HERE ON OVERFLOW
FLGS:
INST: BLOCK 1 ;RH = LH(TRAP INSTRUCTION)
PC: BLOCK 1 ;PC+1 OF TRAP INSTRUCTION
E: BLOCK 1 ;ITS EFFECTIVE ADDRESS
>;END IF10
MSECT: BLOCK 1 ;SECTION NUMBER OF TRAP HANDLER
INDADR: BLOCK 1 ;TRAPPED INST IND,IDX,E IN EFIW FORMAT
INDTMP: BLOCK 1 ;TEMP INDIRECT AND INDEX OF TRAPPED INST
AC: BLOCK 1 ;AC FIELD OF TRAP INSTRUCTION
ACS: BLOCK 4 ;TEMP SPACE FOR T0-T3
SEGMENT CODE
;FLAG BITS FOR EVERY INSTRUCTION THAT CAN OVERFLOW
;[3122] EXPANDED THE FLAG BYTE FOR EACH INSTRUCTION TO 9 BITS,
;TO ALLOW FOR THE VARIABLE TYPE CODE AND FOR A NEW BIT, NOT YET
;IMPLEMENTED, FOR THE AOS/SOS-CLASS INSTRUCTIONS, WHICH LEAVE
;THE RESULT IN MEMORY AND AN AC IF A NON-ZERO AC IS SPECIFIED.
;THIS IS NOT A PROBLEM FOR THE CURRENT PROCESSORS, SINCE INTEGER
;FIXUPS CANNOT BE DONE RELIABLY (SEE NOTES AT BEGINNING OF MODULE).
DPBIT==1*20 ;1 IF INST STORES 2-WORD RESULT
ACBIT==2*20 ;1 IF INST STORES RESULT IN AC
MEMBIT==4*20 ;1 IF INST STORES RESULT IN MEMORY
WRONGBIT==10*20 ;1 IF INST STORES RESULT WITH WRONG SIGN,
; FOR EXTEND MEANS RESULT NOT STORED IN AC
BOTHBT==ACBIT+MEMBIT ;RESULT STORED IN BOTH AC AND MEMORY
NZACBT==4*20 ;1 IF INST STORES RESULT IN BOTH IF AC NONZERO
;NOT HANDLED, AS INTEGER OVERFLOWS AREN'T FIXED
SPRA==TP%SPR+ACBIT ;SINGLE PRECISION REAL, RESULT IN AC
SPRM==TP%SPR+MEMBIT ;SINGLE REAL, RESULT IN MEMORY
SPRB==TP%SPR+BOTHBT ;SINGLE REAL, RESULT IN BOTH
INTA==TP%INT+ACBIT ;INTEGER, RESULT IN AC
INTM==TP%INT+MEMBIT ;INTEGER, RESULT IN MEMORY
INTB==TP%INT+BOTHBT ;INTEGER, RESULT IN BOTH
DPIA==TP%DPI+ACBIT+DPBIT ;DOUBLE INTEGER, RESULT IN AC
DPIM==TP%DPI+MEMBIT+DPBIT ;DOUBLE INTEGER, RESULT IN MEMORY
DPIB==TP%DPI+BOTHBT+DPBIT ;DOUBLE INTEGER, RESULT IN BOTH
DPRA==TP%DPR+ACBIT+DPBIT ;DOUBLE REAL, RESULT IN AC
DPRM==TP%DPR+MEMBIT+DPBIT ;DOUBLE REAL, RESULT IN MEMORY
DPRB==TP%DPR+BOTHBT+DPBIT ;DOUBLE REAL, RESULT IN BOTH
DPXA==TP%DPX+ACBIT+DPBIT ;GDOUBLE REAL, RESULT IN AC
DPXM==TP%DPX+MEMBIT+DPBIT ;GDOUBLE REAL, RESULT IN MEMORY
DPXB==TP%DPX+BOTHBT+DPBIT ;GDOUBLE REAL, RESULT IN BOTH
SPRAW==SPRA+WRONGBIT ;SPRA, RESULT HAS WRONG SIGN
SPRMW==SPRM+WRONGBIT ;SPRM, RESULT HAS WRONG SIGN
SPRBW==SPRB+WRONGBIT ;SPRB, RESULT HAS WRONG SIGN
INTAW==INTA+WRONGBIT ;INTA, RESULT HAS WRONG SIGN
INTMW==INTM+WRONGBIT ;INTM, RESULT HAS WRONG SIGN
INTBW==INTB+WRONGBIT ;INTB, RESULT HAS WRONG SIGN
INTNW==TP%INT+WRONGBIT+NZACBT ;INTEGER, WRONG SIGN, RESULT IN
;BOTH IF NON-ZERO AC
DPIAW==DPIA+WRONGBIT ;DPIA, RESULT HAS WRONG SIGN
DPIMW==DPIM+WRONGBIT ;DPIM, RESULT HAS WRONG SIGN
DPIBW==DPIB+WRONGBIT ;DPIB, RESULT HAS WRONG SIGN
DPRAW==DPRA+WRONGBIT ;DPRA, RESULT HAS WRONG SIGN
DPRMW==DPRM+WRONGBIT ;DPRM, RESULT HAS WRONG SIGN
DPRBW==DPRB+WRONGBIT ;DPRB, RESULT HAS WRONG SIGN
DPXAW==DPXA+WRONGBIT ;DPXA, RESULT HAS WRONG SIGN
DPXMW==DPXM+WRONGBIT ;DPXM, RESULT HAS WRONG SIGN
DPXBW==DPXB+WRONGBIT ;DPXB, RESULT HAS WRONG SIGN
SP==1 ;SPECIAL CASE, NOT COVERED ABOVE
NOBIT==0 ;NO BITS
BITS: BYTE (9) NOBIT, NOBIT, DPXA, DPXA ;OPCODE 100 UJEN-GFSB
BYTE (9) NOBIT, NOBIT, DPXA, DPXA ; 104 JSYS-GFDV
BYTE (9) DPRA, DPRA, DPRA, DPRA ; 110 DFAD-DFDV
BYTE (9) DPIAW, DPIAW, DPIAW, DPIA ; 114 DADD-DDIV
BYTE (9) NOBIT, DPIAW, SP, SP ; 120 DMOVE-EXTEND
BYTE (9) NOBIT, DPIMW, SP, NOBIT ; 124 DMOVEM-FLTR
BYTE (9) SPRA, NOBIT, SPRA, INTA ; 130 UFA-ADJBP
BYTE (9) NOBIT, NOBIT, NOBIT, NOBIT ; 134 ILDB-DPB
BYTE (9) SPRA, SPRA, SPRM, SPRB ; 140 FAD-FADB
BYTE (9) SPRA, SPRA, SPRM, SPRB ; 144 FADR-FADRB
BYTE (9) SPRA, SPRA, SPRM, SPRB ; 150 FSB-FSBB
BYTE (9) SPRA, SPRA, SPRM, SPRB ; 154 FSBR-FSBRB
BYTE (9) SPRA, SPRA, SPRM, SPRB ; 160 FMP-FMPB
BYTE (9) SPRA, SPRA, SPRM, SPRB ; 164 FMPR-FMPRB
BYTE (9) SPRA, SPRA, SPRM, SPRB ; 170 FDV-FDVB
BYTE (9) SPRA, SPRA, SPRM, SPRB ; 174 FDVR-FDVRB
BYTE (9) NOBIT, NOBIT, NOBIT, NOBIT ; 200 MOVE-MOVES
BYTE (9) NOBIT, NOBIT, NOBIT, NOBIT ; 204 MOVS-MOVSS
BYTE (9) INTAW, NOBIT, INTMW, INTMW ; 210 MOVN-MOVNS
BYTE (9) INTAW, NOBIT, INTMW, INTMW ; 214 MOVM-MOVMS
BYTE (9) INTA, INTA, INTM, INTB ; 220 IMUL-IMULB
BYTE (9) DPIA, DPIA, DPIM, DPIB ; 224 MUL-MULB
BYTE (9) INTA, INTA, INTM, INTB ; 230 IDIV-IDIVB
BYTE (9) DPIA, DPIA, DPIM, DPIB ; 234 DIV-DIVB
BYTE (9) INTA, NOBIT, NOBIT, NOBIT ; 240 ASH-JFFO
BYTE (9) INTA, NOBIT, NOBIT, NOBIT ; 244 ASHC-NONE
BYTE (9) NOBIT, NOBIT, INTA, INTA ; 250 EXCH-AOBJN
BYTE (9) NOBIT, NOBIT, SP, NOBIT ; 254 JRST-MAP
BYTE (9) NOBIT, NOBIT, NOBIT, NOBIT ; 260 PUSHJ-POPJ
BYTE (9) NOBIT, NOBIT, NOBIT, NOBIT ; 264 JSR-JRA
BYTE (9) INTAW, INTAW, INTMW, INTBW ; 270 ADD-ADDB
BYTE (9) INTAW, INTAW, INTMW, INTBW ; 274 SUB-SUBB
BYTE (9) NOBIT, NOBIT, NOBIT, NOBIT ; 300 CAI-CAILE
BYTE (9) NOBIT, NOBIT, NOBIT, NOBIT ; 304 CAIA-CAIG
BYTE (9) NOBIT, NOBIT, NOBIT, NOBIT ; 310 CAM-CAMG
BYTE (9) NOBIT, NOBIT, NOBIT, NOBIT ; 314 CAMA-CAMGE
BYTE (9) NOBIT, NOBIT, NOBIT, NOBIT ; 320 JUMP-JUMPLE
BYTE (9) NOBIT, NOBIT, NOBIT, NOBIT ; 324 JUMPA-JUMPG
BYTE (9) NOBIT, NOBIT, NOBIT, NOBIT ; 330 SKIP-SKIPLE
BYTE (9) NOBIT, NOBIT, NOBIT, NOBIT ; 334 SKIPA-SKIPG
BYTE (9) INTAW, INTAW, INTAW, INTAW ; 340 AOJ-AOJLE
BYTE (9) INTAW, INTAW, INTAW, INTAW ; 344 AOJA-AOJG
BYTE (9) INTNW, INTNW, INTNW, INTNW ; 350 AOS-AOSLE
BYTE (9) INTNW, INTNW, INTNW, INTNW ; 354 AOSA-AOSG
BYTE (9) INTAW, INTAW, INTAW, INTAW ; 360 SOJ-SOJLE
BYTE (9) INTAW, INTAW, INTAW, INTAW ; 364 SOJA-SOJG
BYTE (9) INTNW, INTNW, INTNW, INTNW ; 370 SOS-SOSLE
BYTE (9) INTNW, INTNW, INTNW, INTNW ; 374 SOSA-SOSG
BYTE (9) NOBIT, SPRAW, NOBIT, DPIAW ;EXTEND 020 XBLT-DGFIX
BYTE (9) INTAW, DPIAW, INTAW, NOBIT ;EXTEND 024 GFIX-DGFLTR
BYTE (9) NOBIT, DPXA, NOBIT, NOBIT ;EXTEND 030 GFLTR,GFSC
BPTAB: POINT 9,BITS-20(T1),8 ;BYTE POINTERS, OFFSET BY 100 OCTAL
POINT 9,BITS-20(T1),17
POINT 9,BITS-20(T1),26
POINT 9,BITS-20(T1),35
;TABLES INDEXED BY T1 (WITH FLAG BITS IN IT) TO ACCESS INSTRUCTION OPERANDS
XLOAD=.-2
MOVE T2,@AC ;SA
DMOVE T2,@AC ;DA
MOVE T2,@E ;SM
DMOVE T2,@E ;DM
MOVE T2,@AC ;SB
DMOVE T2,@AC ;DB
XSTORE=.-2
MOVEM T2,@AC ;SA
DMOVEM T2,@AC ;DA
MOVEM T2,@E ;SM
DMOVEM T2,@E ;DM
PUSHJ P,[MOVEM T2,@AC ;SB
MOVEM T2,@E
POPJ P,]
PUSHJ P,[DMOVEM T2,@AC ;DB
DMOVEM T2,@E
POPJ P,]
;TRAP MESSAGE CALL EXECUTE TABLE
TCALTB: $TCALL IOV
$TCALL IDC
NOP
NOP
$TCALL FOV
$TCALL FDC
$TCALL FUN
NOP
;TRAP ERROR MESSAGES
SEGMENT CODE
$TERR (%,IOV,0,0,Integer overflow) ;000
$TERR (%,IDC,1,0,Integer divide check) ;001 NDV
; $TERR (%,XXX,2,0,Floating underflow) ;010 FXU (impossible)
; $TERR (%,XXX,3,0,Floating divide check) ;011 FXU,NDV (impossible)
$TERR (%,FOV,4,0,Floating overflow) ;100 FXO
$TERR (%,FDC,5,0,Floating divide check) ;101 FXO,NDV
$TERR (%,FUN,6,0,Floating underflow) ;110 FXO,FXU
; $TERR (%,XXX,7,0,Floating divide check) ;111 FXO,FXU,NDV (impossible)
$TERR (?,TDT,-1,0,Trap occured during trap processing)
END