1
+ *
2
+ NAM CHECK
3
+ TTL ROUTINES TO CHECK SPECIAL CASES AND INVALID OPS.
4
+ *
5
+ * LINKING LOADER DEFINTIONS
6
+ *
7
+ XDEF CKINVD,CHKZER,CHKINF,DIVZER
8
+ *
9
+ XREF RTAR1,IOPSUB,RTINF,ISDNRM
10
+ *
11
+ * REVISION HISTORY:
12
+ * DATE PROGRAMMER REASON
13
+ *
14
+ * 23.MAY.80 G. STEVENS ORIGINAL
15
+ * 28.MAY.80 G. STEVENS REWRITE CKINVD
16
+ * 03.JUNE.80 G. STEVENS MAKE CKINVD HANDLE NAN,ZEROS
17
+ * AND INFINITIES CORRECTLY
18
+ * 21.AUG.80 G. STEVENS REMOVE IOP 17 FROM DIVZER
19
+ *
20
+ PAGE
21
+ *
22
+ * HERE ARE SOME OF THE COMPONENT ROUTINES
23
+ * FOR THE FP09. THEY INCLUDE CHKZER, CHECK
24
+ * ZERO AGAINST THE ROUNDING MODES; CHECK
25
+ * CHECK INFINITY AGAINST A/P MODES OF
26
+ * CLOSURE; DIVZER, HANDLES DIVISION BY ZERO;
27
+ * RTNAN, BUILD UP A "NAN" WITH PROPER
28
+ * NAN ADDRES INSERTED.
29
+ *
30
+ ***************************************************************
31
+ *
32
+ * PROCEDURE CHKZER
33
+ *
34
+ * THIS ROUTINE CHECKS ZERO AGAINST ROUNDING
35
+ * MODES IN A FLP ADDITION WHEN BOTH OPERANDS
36
+ * ARE ZERO IN ORDER TO RETURN A ZERO RESULT
37
+ * OF THE CORRECT SIGN. IF SIGNS ARE THE SAME
38
+ * A ZERO OF THAT SIGN IS RETURNED. IF THE
39
+ * SIGN ARE OPPOSITE THEN +0 IS RETURNED
40
+ * IN ROUDING MODES RN,RZ,RP AND -O IS
41
+ * RETURNED IN ROUNDING MODE RM.
42
+ *
43
+ * RETURN A ZERO TO RESULT
44
+ *
45
+ CHKZER LBSR RTAR1
46
+ *
47
+ * NOW CHECK TO SEE IF THE SIGN NEEDS
48
+ * MODIFYING.
49
+ *
50
+ LDA ARG1,U
51
+ EORA ARG2,U
52
+ *
53
+ * IF THE SIGNS ARE NOT EQUAL, CHECK THE ROUNDING
54
+ * MODE TO DETERMINE THE PROPER SIGN.
55
+ *
56
+ IFCC LT
57
+ LDA [PFPCB,U]
58
+ ANDA #CTLRND GET ROUNDING MODE INFO.
59
+ IF A,GE,#BIT1+BIT2 RM MODE
60
+ LDA #BIT7
61
+ STA RESULT,U RETURN -0
62
+ *
63
+ ELSE
64
+ CLR RESULT,U RETURN +0
65
+ ENDIF
66
+ ENDIF
67
+ *
68
+ RTS RETURN
69
+ *
70
+ PAG
71
+ *******************************************************************
72
+ *
73
+ * PROCEDURE CHKINF
74
+ *
75
+ * THIS ROUTINE CHECKS INFINITY AGAINST
76
+ * CLOSURE MODES IN A FLP ADDITION WHEN
77
+ * BOTH OPERANDS ARE INFINITY TO DETERMINE
78
+ * WHETHER TO RETURN INFINITY OR A NAN
79
+ * WITH PROPER INVALID OPERATION CODE
80
+ *
81
+ *
82
+ * CHECK FOR A/P MODES
83
+ *
84
+ CHKINF LDA [PFPCB,U]
85
+ ANDA #BIT0
86
+ IFCC GT AFFINE MODE
87
+ LDA ARG1,U
88
+ EORA ARG2,U
89
+ *
90
+ * IF SIGNS THE SAME RETURN INFINITY
91
+ * OF THAT SIGN.
92
+ *
93
+ IFCC GE
94
+ LBSR RTAR1
95
+ *
96
+ * IF SIGNS DIFFER RETURN "NAN" AND
97
+ * SET IOP = 2
98
+ *
99
+ ELSE
100
+ IOP 2 (+INF)+(-INF); AFFINE MODE
101
+ ENDIF
102
+ *
103
+ * ELSE IN THE PROTECTIVE MODE RETURN NAN
104
+ * AND SET IOP = 8
105
+ *
106
+ ELSE
107
+ IOP 8 +/- INF; PROTECTIVE MODE
108
+ ENDIF
109
+ *
110
+ RTS RETURN
111
+ *
112
+ PAG
113
+ ***************************************************************
114
+ *
115
+ * PROCEDURE DIVZER
116
+ *
117
+ * THIS ROUTINE HANDLES THE CASE OF DIVISION
118
+ * BY ZERO.
119
+ *
120
+ * ON ENTRY: ARG2 CONTAINS A TRUE ZERO
121
+ * U - STACK FRAME POINTER
122
+ *
123
+ * ON EXIT: RESULT CONTAINS AN INFINITY W/
124
+ * SIGN OF THE INPUT ARGUMENT.
125
+ * U, S - UNCHANGED
126
+ * X,Y,D,CC - DESTROYED
127
+ *
128
+ * OPERATION: THE DIVISION BY ZERO FLAG IN TSTAT IS SET
129
+ * AND AN INFINITY OF THE SIGN OF THE INPUT ARGUMENT IS
130
+ * RETURNED IN THE STACK FRAME RESULT.
131
+ *
132
+ *
133
+ * CHECK DIVISION BY ZERO TRAP ENABLE
134
+ *
135
+ DIVZER EQU *
136
+ *
137
+ BSETA BIT3,(TSTAT,U)
138
+ LBSR RTINF
139
+ *
140
+ RTS RETURN
141
+ *
142
+ PAG
143
+ ******************************************************************
144
+ *
145
+ * PROCEDURE CKINVD
146
+ *
147
+ * CKINVD CHECKS FOR AN INVALID RESULT OF AN ARITHMETIC
148
+ * OPERATION. IF THE RESULTIS UNORMALIZED AND THE DESTINATION
149
+ * IS SINGLE OR DOUBLE THEN SIGNAL IOP. = 16 AND RETURN A
150
+ * NON TRAPPING NAN.
151
+ *
152
+ *
153
+ CKINVD EQU *
154
+ *
155
+ * CHECK FOR ZERO OR NAN OR INFINITY
156
+ *
157
+ LDD EXPR,U
158
+ IF D,NE,#INFEX
159
+ IF D,NE,#ZEROEX
160
+ *
161
+ * CHECK THE PRECISION OF THE RESULT
162
+ *
163
+ LDA RPREC,U
164
+ IF A,LE,#DBL SINGLE OR DOUBLE
165
+ LBSR ISDNRM CHECK FOR DENORMALZED
166
+ IFCC EQ RESULT IS DENORMALIZD
167
+ LDD EXPR,U SUBTRACT BIAS FROM EXPONENT
168
+ SUBD #01
169
+ STD EXPR,U
170
+ *
171
+ ELSE
172
+ LDA FRACTR,U
173
+ IFCC GE NOT NORMALIZED
174
+ IOP 16 SIGNAL INVALID OPERATION
175
+ *
176
+ ENDIF NOT NORMALIZED
177
+ *
178
+ ENDIF IS DENORMALIZED
179
+ *
180
+ ENDIF SINGLE OR DOUBLE
181
+ *
182
+ ENDIF NOT A ZERO
183
+ *
184
+ ENDIF NOT A NAN OR INFINITY
185
+ *
186
+ *
187
+ RTS RETURN
188
+ *
189
+ *
190
+
0 commit comments