-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfloat.mix
190 lines (190 loc) · 8.19 KB
/
float.mix
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
*
* ADDITION, SUBTRACTION, AND NORMALIZATION
*
BYTE EQU 1(4:4) BYTE SIZE B
EXP EQU 1:1 DEFINITION OF EXPONENT FIELD
FSUB STA TEMP FLOATING POINT SUBTRACTION SUBROUTINE:
LDAN TEMP CHANGE SIGN OF OPERAND.
FADD STJ EXITF FLOATING POINT ADDITION SUBROUTINE:
JOV OFLO ENSURE THAT OVERFLOW IS OFF.
STA TEMP TEMP := V.
LDX ACC RX := U.
CMPA ACC(EXP) STEPS A1, A2, A3 ARE COMBINED HERE:
JGE 1F JUMP IF EV >= EU.
STX FU(0:4) FU := +/-FFFF0.
LD2 ACC(EXP) RI2 := EW.
STA FV(0:4)
LD1N TEMP(EXP) RI1 := -EV.
JMP 4F
1H STA FU(0:4) FU := +/-FFFF0 (U,V INTERCHANGED).
LD2 TEMP(EXP) RI2 := EW.
STX FV(0:4)
LD1N ACC(EXP) RI1 := EV.
4H INC1 0,2 RI1 := EU - EV. (STEP A4 UNNECESSARY.)
5H LDA FV A5. SCALE RIGHT.
ENTX 0 CLEAR RX.
SRAX 0,1 SHIFT RIGHT EU - EV PLACES.
6H ADD FU A6. ADD.
JOV N4 A7. NORMALIZE. JUMP IF FRACTION OVERFLOW.
JXZ NORM EASY CASE?
LD1 FV(0:1) CHECK FOR OPPOSITE SIGNS.
JAP 1F
J1N N2 IF NOT, NORMALIZE.
JMP 2F
1H J1P N2
2H SRC 5 |RX| :=: |RA|.
DECX 1 (RX IS POSITIVE).
STA TEMP (THE OPERANDS HAD OPPOSITE SIGNS;
STA HALF(0:0) WE MUST ADJUST THE REGISTERS
LDAN TEMP BEFORE ROUNDING AND NORMALIZATION.)
ADD HALF
ADD HALF COMPLEMENT THE LEAST SIGNIFICANT PORTION.
SRC 5 JUMP INTO NORMALIZATION ROUTINE.
JMP N2
HALF CON 1//2 ONE HALF THE WORD SIZE (SIGN VARIES)
FU CON 0 FRACTION PART FU
FV CON 0 FRACTION PART FV
NORM JAZ ZRO N1. TEST F.
N2 CMPA =0=(1:1) N2. IS F NORMALIZED?
JNE N5 TO N5 IF LEADING BYTE NONZERO.
N3 SLAX 1 N3. SCALE LEFT.
DEC2 1 DECREASE E BY 1.
JMP N2 RETURN TO N2.
N4 ENTX 1 N4. SCALE RIGHT.
SRC 1 SHIFT RIGHT, INSERT "1" WITH PROPER SIGN.
INC2 1 INCREASE E BY 1.
N5 CMPA =BYTE/2=(5:5) N5. ROUND.
JL N6 IS |TAIL| < 0.5B?
JG 5F
JXNZ 5F IS |TAIL| > 0.5B?
STA TEMP |TAIL| = 0.5B; ROUND TO ODD.
LDX TEMP(4:4)
JXO N6 TO N6 IF RX IS ODD.
5H STA *+1(0:0) STORE SIGN OF RA.
INCA BYTE ADD B^-4 TO |F|. (SIGN VARIES)
JOV N4 CHECK FOR ROUNDING OVERFLOW.
N6 J2N EXPUN N6. CHECK E. UNDERFLOW IF E < 0.
N7 ENTX 0,2 N7. PACK. RX := E.
SRC 1
ZRO DEC2 BYTE RI2 := E - B.
8H STA ACC
EXITF J2N * EXIT, UNLESS E >= B.
EXPOV HLT 2 EXPONENT OVERFLOW DETECTED
EXPUN HLT 1 EXPONENT UNDERFLOW DETECTED
ACC CON 0 FLOATING POINT ACCUMULATOR
*
* PROGRAM M (FLOATING POINT MULTIPLICATION AND DIVISION).
*
Q EQU BYTE/2 Q IS HALF THE BYTE SIZE
FMUL STJ EXITF FLOATING POINT MULTIPLICATION SUBROUTINE:
JOV OFLO ENSURE THAT OVERFLOW IS OFF.
STA TEMP TEMP := V.
LDX ACC RX := U.
STX FU(0:4) FU := +/-FFFF0.
LD1 TEMP(EXP)
LD2 ACC(EXP)
INC2 -Q,1 RI2 := EU + EV - Q.
SLA 1
MUL FU MULTIPLY FU TIMES FV.
JMP NORM NORMALIZE, ROUND, AND EXIT.
FDIV STJ EXITF FLOATING POINT DIVISION SUBROUTINE:
JOV OFLO ENSURE THAT OVERFLOW IS OFF.
STA TEMP TEMP := V.
STA FV(0:4) FV := +/-FFFF0.
LD1 TEMP(EXP)
LD2 ACC(EXP)
DEC2 -Q,1 RI2 := EU - EV + Q.
ENTX 0
LDA ACC
SLA 1 RA := FU.
CMPA FV(1:5)
JL *+3 JUMP IF |FU| < |FV|.
SRA 1 OTHERWISE, SCALE FU RIGHT
INC2 1 AND INCREASE RI2 BY 1.
DIV FV DIVIDE.
JNOV NORM NORMALIZE, ROUND, AND EXIT.
DVZRO HLT 3 UNNORMALIZED OR ZERO DIVISOR
*
FLOT STJ EXITF ASSUME THAT RA = U, AN INTEGER.
JOV OFLO ENSURE THAT OVERFLOW IS OFF.
ENT2 Q+5 SET RAW EXPONENT.
ENTX 0
JMP NORM NORMALIZE, ROUND, AND EXIT.
*
FPFLOT STJ 9F IF NO FLOT PRESENT IN FP ATTACHMENT
SLA 1
ENTX Q+4
SRC 1
FADD =0=
9H JMP *
*
FIX STJ 9F FLOAT-TO-FIX SUBROUTINE
STA TEMP
LD1 TEMP(EXP) RI1 := E.
SLA 1 RA := +/-FFFF0.
JAZ 9F IS INPUT ZERO?
DEC1 1
CMPA =0=(1:1) IF LEADING BYTE IS ZERO,
JE *-4 SHIFT LEFT AGAIN.
ENN1 -Q-4,1
J1N FIXOVFLO IS MAGNITUDE TOO LARGE?
ENTX 0
SRAX 0,1
CMPX =1//2=
JL 9F
JG *+2
JAO 9F THE AMBIGUOUS CASE BECOMES ODD, SINCE
* B/2 IS EVEN.
STA *+1(0:0) ROUND, IF NECESSARY.
INCA 1 ADD +/-1 (OVERFLOW IS IMPOSSIBLE).
9H JMP *
*
FP STJ EXITF FRACTIONAL PART SUBROUTINE:
JOV OFLO ENSURE THAT OVERFLOW IS OFF.
STA TEMP TEMP := U.
ENTX 0
SLA 1 RA := FU.
LD2 TEMP(EXP) RI2 := EU.
DEC2 Q
J2NP *+3
SLA 0,2 REMOVE INTEGER PART OF U.
ENT2 0
JANN 1F
ENN2 0,2 FRACTION IS NEGATIVE: FIND
STAX 0,2 ITS COMPLEMENT.
ENT2 0
JXNZ *+3
JAZ *+2
INCA 1
ADD WM1 ADD WORD SIZE MINUS ONE.
1H INC2 Q PREPARE TO NORMALIZE THE ANSWER.
JMP NORM NORMALIZE, ROUND, AND EXIT.
8H EQU 1(1:1)
WM1 CON 8B-1,8B-1(1:4) WORD SIZE MINUS ONE.
*
FCMP STJ 9F FLOATING POINT COMPARISON SUBROUTINE:
JOV OFLO ENSURE THAT OVERFLOW IS OFF.
STA TEMP
LDAN TEMP V:=-V.
* (COPY HERE LINES 07-20 OF PROGRAM 4.2.1A.)
LDX FV(0:0) SET RX TO ZERO WITH THE SIGN OF FV.
DEC1 5
J1N *+2
ENT1 0 REPLACE LARGE DIFFERENCES IN EXPONENTS
STAX 5,1 BY A SMALLER ONE.
ADD FU RA:=DIFFERENCE OF OPERANDS.
JOV 7F FRACTION OVERFLOW: NOT ~.
CMPA EPSILON(1:5)
JG 8F JUMP IF NOT ~.
JL 6F JUMP IF ~.
JXZ 9F JUMP IF ~.
JXP 1F IF |RA|=EPSILON, CHECK SIGN OF RA X RX.
JAP 9F JUMP IF ~. (RA # 0)
JMP 8F
7H ENTX 1
SRC 1 MAKE RA NONZERO WITH SAME SIGN.
JMP 8F
1H JAP 8F JUMP IF NOT ~. (RA # 0)
6H ENTA 0
8H CMPA =0= SET COMPARISON INDICATOR.
9H JMP * EXIT FROM SUBROUTINE.