14
14
__i48mulu:
15
15
;backup af
16
16
push af
17
-
18
- ;backup interrupt
19
- ld a, i ; P = IEF2
20
- di
21
- push af
22
-
23
17
push ix
24
18
ld ix, 0
25
19
add ix, sp
@@ -30,20 +24,13 @@ __i48mulu:
30
24
push iy
31
25
push bc
32
26
33
- ; load ude:uhl into ude':ubc, load uiy:ubc into uhl':ubc'
34
-
35
- ld bc, (ix-6) ; bc = hl, b[0], b[1], b[2]
36
- exx
37
- ld hl, (ix-3) ; hl' = iy, b[3], b[4], b[5]
38
- ld de, (ix-9) ; de' = de, a[3], a[4], a[5]
39
- ld bc, (ix-12) ; bc' = bc, a[0], a[1], a[2]
40
- exx
41
-
27
+ ; bc = a[0], a[1]
28
+ ld a, l ; a = b[0]
29
+ ld iy, (ix-5) ; iy = b[1], b[2]
42
30
43
- ld de, 0
44
- push de ; sum overflow
45
- push de ; upper bytes of sum at -15
46
- push de ; lower bytes of sum at -18
31
+ or a, a
32
+ sbc hl, hl
33
+ push hl ; upper bytes of sum at -15
47
34
;Stack Use:
48
35
; ix-1 : deu b[5]
49
36
; ix-2 : d b[4]
@@ -57,221 +44,172 @@ __i48mulu:
57
44
; ix-10: bcu a[2]
58
45
; ix-11: b a[1]
59
46
; ix-12: c a[0]
60
- ; ix-13: overflow
61
- ; ix-14: overflow
62
- ; ix-15: overflow
63
- ; ix-16: sum[5]
64
- ; ix-17: sum[4]
65
- ; ix-18: sum[3]
66
- ; ix-19: sum[2]
67
- ; ix-20: sum[1]
68
- ; ix-21: sum[0]
47
+ ; ix-13: sum[5]
48
+ ; ix-14: sum[4]
49
+ ; ix-15: sum[3]
50
+ ; ix-16: sum[2]
51
+ ; ix-17: sum[1]
52
+ ; ix-18: sum[0]
69
53
70
54
; sum[0-1] =============================================================================================================================
71
55
72
- exx
73
- ld iyl, c ; iyl = a[0]
74
- ld iyh, b ; iyh = a[1]
75
- exx
76
-
77
56
; a[0]*b[0]
78
- ld d, iyl ; d = a[0]
79
- ld e, c ; e = b[0]
57
+ ld d, c ; d = a[0]
58
+ ld e, a ; e = b[0]
80
59
mlt de
81
- ld (ix-21), de ; multiplaction result in sum[0-1]
60
+ push de ; lower bytes of sum at -18
82
61
83
62
; sum[1-2] =============================================================================================================================
84
-
85
- ; a[0]*b[1]
86
- ld hl, (ix-20) ; hl will store current partial sum
87
- ld d, iyl ; d = a[0 ]
88
- ld e, b ; e = b[1 ]
63
+ ld l, d ; hl will store current partial sum
64
+
65
+ ; a[1]*b[0]
66
+ ld d, b ; d = a[1 ]
67
+ ld e, a ; e = b[0 ]
89
68
mlt de
90
69
add hl, de
91
70
92
- ; a[1 ]*b[0 ]
93
- ld d, iyh ; d = a[1 ]
94
- ld e, c ; e = b[0 ]
71
+ ; a[0 ]*b[1 ]
72
+ ld d, c ; d = a[0 ]
73
+ ld e, iyl ; e = b[1 ]
95
74
mlt de
96
75
add hl, de
97
76
98
- ld (ix-20 ), hl
77
+ ld (ix-17 ), hl
99
78
100
79
; sum[2-3] =============================================================================================================================
101
- ld a, (ix-10) ; a = a[2]
102
- ld hl, (ix-19) ; hl will store current partial sum
80
+ ld hl, (ix-16) ; hl will store current partial sum
103
81
104
- ; a[1 ]*b[1 ]
105
- ld d, iyh ; d = a[1 ]
106
- ld e, b ; e = b[1 ]
82
+ ; a[0 ]*b[2 ]
83
+ ld d, c ; d = a[0 ]
84
+ ld e, iyh ; e = b[2 ]
107
85
mlt de
108
86
add hl, de
109
87
110
- ; a[2 ]*b[0 ]
111
- ld d, a ; d = a[2 ]
112
- ld e, c ; e = b[0 ]
88
+ ; a[1 ]*b[1 ]
89
+ ld d, b ; d = a[1 ]
90
+ ld e, iyl ; e = b[1 ]
113
91
mlt de
114
92
add hl, de
115
93
116
- ; a[0 ]*b[2 ]
117
- ld d, iyl ; d = a[0 ]
118
- ld e, (ix-4) ; e = b[2 ]
94
+ ; a[2 ]*b[0 ]
95
+ ld d, (ix-10) ; d = a[2 ]
96
+ ld e, a ; e = b[0 ]
119
97
mlt de
120
98
add hl, de
121
99
122
- ld (ix-19 ), hl
100
+ ld (ix-16 ), hl
123
101
124
102
; sum[3-4] =============================================================================================================================
125
- ld hl, (ix-18 ) ; hl will store current partial sum
103
+ ld hl, (ix-15 ) ; hl will store current partial sum
126
104
127
- ; a[2 ]*b[1 ]
128
- ld d, a ; d = a[2 ]
129
- ld e, b ; e = b[1 ]
105
+ ; a[0 ]*b[3 ]
106
+ ld d, c ; d = a[0 ]
107
+ ld e, (ix-3) ; e = b[3 ]
130
108
mlt de
131
109
add hl, de
132
110
133
111
; a[1]*b[2]
134
- ld d, iyh ; d = a[1]
135
- ld e, (ix-4) ; e = b[2]
112
+ ld d, b ; d = a[1]
113
+ ld e, iyh ; e = b[2]
136
114
mlt de
137
115
add hl, de
138
116
139
- ld a, iyl ; a = a[0]
140
-
141
- exx
142
- ld iyl, e ; iyl = a[3]
143
- ex de, hl
144
- ; hl' = a[3], a[4], a[5]
145
- ; de' = b[3], b[4], b[5]
146
- ld iyh, e ; iyh = b[3]
147
- exx
148
-
149
- ; a[3]*b[0]
150
- ld d, iyl ; d = a[3]
151
- ld e, c ; e = b[0]
117
+ ; a[2]*b[1]
118
+ ld d, (ix-10) ; d = a[2]
119
+ ld e, iyl ; e = b[1]
152
120
mlt de
153
121
add hl, de
154
122
155
- ; a[0 ]*b[3 ]
156
- ld d, a ; d = a[0 ]
157
- ld e, iyh ; e = b[3 ]
123
+ ; a[3 ]*b[0 ]
124
+ ld d, (ix-9) ; d = a[3 ]
125
+ ld e, a ; e = b[0 ]
158
126
mlt de
159
127
add hl, de
160
128
161
- ld (ix-18 ), hl
129
+ ld (ix-15 ), hl
162
130
163
131
; sum [4-5] =============================================================================================================================
164
- ld hl, (ix-17)
132
+ ld hl, (ix-14) ; hl will store current partial sum
165
133
166
- ; a[3 ]*b[1 ]
167
- ld d, iyl ; d = a[3 ]
168
- ld e, b ; e = b[1 ]
134
+ ; a[0 ]*b[4 ]
135
+ ld d, c ; d = a[0 ]
136
+ ld e, (ix-2) ; e = b[4 ]
169
137
mlt de
170
138
add hl, de
171
139
172
- ; a[2 ]*b[2 ]
173
- ld d, (ix-10) ; d = a[2 ]
174
- ld e, (ix-4 ) ; e = b[2 ]
140
+ ; a[1 ]*b[3 ]
141
+ ld d, b ; d = a[1 ]
142
+ ld e, (ix-3 ) ; e = b[3 ]
175
143
mlt de
176
144
add hl, de
177
145
178
- ; a[1]*b[3]
179
- exx
180
- ld iyl, b ; iyl = a[1]
181
- ld iyh, e ; iyh = b[3]
182
- exx
183
- ld d, iyl ; d = a[1]
184
- ld e, iyh ; e = b[3]
146
+ ; a[2]*b[2]
147
+ ld d, (ix-10) ; d = a[2]
148
+ ld e, iyh ; e = b[2]
185
149
mlt de
186
150
add hl, de
187
151
188
- ; a[0]*b[4]
189
- exx
190
- ld iyh, d ; iyh = b[4]
191
- exx
192
- ld d, a ; d = a[0]
193
- ld e, iyh ; e = b[4]
152
+ ; a[3]*b[1]
153
+ ld d, (ix-9) ; d = a[3]
154
+ ld e, iyl ; e = b[1]
194
155
mlt de
195
156
add hl, de
196
157
197
158
; a[4]*b[0]
198
- exx
199
- ex de, hl
200
- ; hl' = b[3], b[4], b[5]
201
- ; de' = a[3], a[4], a[5]
202
- ld iyl, d ; iyl = a[4]
203
- ld iyh, e ; iyh = a[3], used later
204
- exx
205
- ld d, iyl ; d = a[4]
206
- ld e, c ; e = b[0]
159
+ ld d, (ix-8) ; d = a[4]
160
+ ld e, a ; e = b[0]
207
161
mlt de
208
162
add hl, de
209
163
210
- ld (ix-17 ), hl
164
+ ld (ix-14 ), l
211
165
212
166
; sum [5] (and overflow) ====================================================================================================================
213
- ld hl, (ix-16)
214
-
215
- ; a[4]*b[1]
216
- ld d, iyl ; d = a[4]
217
- ld e, b ; e = b[1]
218
- mlt de
219
- add hl, de
220
-
221
- ; a[3]*b[2]
222
- ld d, iyh ; d = a[3]
223
- ld e, (ix-4) ; e = b[2]
224
- mlt de
225
- add hl, de
226
-
227
- ; a[5]*b[0]
228
- ld d, (ix-7) ; d = a[5]
229
- ld e, c ; e = b[0]
230
- mlt de
231
- add hl, de
167
+ ld l, h ; hl will store current partial sum
232
168
233
169
; a[0]*b[5]
234
- ld d, a ; d = a[0]
170
+ ld d, c ; d = a[0]
235
171
ld e, (ix-1) ; e = b[5]
236
172
mlt de
237
173
add hl, de
238
174
175
+ ; a[1]*b[4]
176
+ ld c, (ix-2) ; c = b[4]
177
+ mlt bc
178
+ add hl, bc
179
+
239
180
; a[2]*b[3]
240
- exx
241
- ex de, hl
242
- ; hl' = a[3], a[4], a[5]
243
- ; de' = b[3], b[4], b[5]
244
- ld iyl, e ; iyl = b[3]
245
- ld iyh, d ; iyh = b[4], used later
246
- exx
247
- ld d, (ix-10) ; d = a[2]
248
- ld e, iyl ; e = b[3]
181
+ ld bc, (ix-10) ; bc = a[2], a[3]
182
+ ld d, c ; d = a[2]
183
+ ld e, (ix-3) ; e = b[3]
249
184
mlt de
250
185
add hl, de
251
186
252
- ; a[1]*b[4]
253
- exx
254
- ld iyl, b ; iyl = a[1]
255
- exx
256
- ld d, iyl ; d = a[1]
257
- ld e, iyh ; e = b[4]
187
+ ; a[3]*b[2]
188
+ ld c, iyh ; c = b[2]
189
+ mlt bc
190
+ add hl, bc
191
+
192
+ ; a[4]*b[1]
193
+ ld bc, (ix-8) ; bc = a[4], a[5]
194
+ ld d, c ; d = a[4]
195
+ ld e, iyl ; e = b[1]
258
196
mlt de
259
197
add hl, de
260
198
261
- ld (ix-16), hl
199
+ ; a[5]*b[0]
200
+ ld c, a ; c = b[0]
201
+ mlt bc
202
+ add hl, bc
203
+
204
+ ld (ix-13), l
262
205
263
206
;clean up stack and restore registers
264
207
pop hl
265
208
pop de
266
209
pop bc
267
- pop bc
268
210
pop iy
211
+
269
212
ld sp, ix
270
213
pop ix
271
-
272
- pop af ; interrupt stuff back, P/V = IEF2
273
- jp po, .skipEI
274
- ei
275
- .skipEI:
276
214
pop af
277
215
ret
0 commit comments