8 !----------------------------------------------------------------------------
9 ! SIGNED INTEGER ARITHMETIC
10 !------------------------------------------------------------------------------
12 adi_l: adroff ; move.w (a5),d0 ; bra 1f
14 1: sub.w wrd,d0 ; beq adi_1W
15 sub.w wrd,d0 ; beq adi_2W
19 comp und,(sp) ; beq 6f
20 comp und,word(sp); bne 7f
23 7: mov (sp)+,d0 ; ad d0,(sp)
30 bsr no8bar ; add.l #8,sp
33 move.l (sp)+,d0 ; add.l d0,(sp)
40 !--------------------------------------------------------------------------
42 sbi_z: mov (sp)+,d0 ; bra 1f
43 sbi_l: adroff ; move.w (a5),d0
44 1: sub.w wrd,d0 ; beq sbi_1W
45 sub.w wrd,d0 ; beq sbi_2W
49 comp und,(sp) ; beq 6f
50 comp und,word(sp) ; bne 7f
53 7: mov (sp)+,d0 ; subt d0,(sp)
60 add.l #8,sp ; bsr no8bar
63 move.l (sp)+,d0 ; sub.l d0,(sp)
69 9: bsr e_iovfl ; jmp (a4)
71 !----------------------------------------------------------------------------
73 mli_z: mov (sp)+,d0 ; bra 0f
74 mli_l: adroff ; move.w (a5),d0
75 0: sub.w wrd,d0 ; beq mli_1W
76 sub.w wrd,d0 ; beq mli_2W
81 comp und,(sp) ; bne 2f
86 move.l (sp)+,d1 ; bra 4f
88 muls (sp),d0 ; move.w d0,(sp)
91 3: swap d0 ; tst.w d0 ; bne 9b
97 bsr no8bar ; add.l #4,sp
98 move.l (sp)+,d0 ; add.l #4,sp
101 move.l (sp)+,d0 ; move.l (sp)+,d1
103 4: move.l #0,d5 ; tst.l d0 ; bpl 5f
116 !next 4 lines only in case 8 byte arithmetic
118 ! bmi 1f ; clr.l -(sp) ; bra 2f
123 !subroutine for unsigned 4byte multiplication . Expects multiplier in d0 and
124 ! multiplicant in d1 . Returns 4 byte result in d0 . If d4=0 overflow did
125 ! not occur on the multiplication , else it did .
129 mlu4: move.l d1,d3 ; move.l d0,d2
132 move.l d3,d4 ; mulu d2,d4
137 or.w d3,d4 ; or.w d2,d4
140 mulu d1,d0 ; add.l d3,d0
150 !---------------------------------------------------------------------------
152 dvi_z: mov (sp)+,d0 ; bra 0f
153 dvi_l: adroff ; move.w (a5),d0
154 0: sub.w wrd,d0 ; beq dvi_1W
155 sub.w wrd,d0 ; beq dvi_2W
159 bsr dvi4 ; move.l d1,-(sp)
161 bsr dvi2 ; move.w d1,-(sp)
166 bsr no8bar ; tst.l (sp)+
167 move.l (sp)+,(sp) ; bsr dvi4
168 move.l d1,-(sp) ; clr.l -(sp)
170 bsr dvi4 ; move.l d1,-(sp)
174 rmi_z: mov (sp)+,d0 ; bra 1f
175 rmi_l: adroff ; move.w (a5),d0
176 1: sub.l wrd,d0 ; beq rmi_1W
177 sub.l wrd,d0 ; beq rmi_2W
181 bsr dvi4 ; move.l d3,-(sp)
189 bsr no8bar ; tst.l (sp)+
190 move.l (sp)+,(sp) ; bsr dvi4
191 move.l d3,-(sp) ; clr.l -(sp)
193 bsr dvi4 ; move.l d3,-(sp)
197 ! 2byte division . In d1: quotient=low word ; remainder=high word
199 dvi2: move.l (sp)+,d2
200 move.w (sp)+,d0 !divisor
201 move.w (sp)+,d1 ; ext.l d1 !dividend
203 cmp.w und,d1 ; bne 1f
205 1: cmp.w und,d0 ; bne 2f
208 bsr e_idivz ; move.l und,d1 ; bra 4f
212 4: move.l d2,-(sp) ; rts
215 ! long signed division . quotient in d1 , remainder in d3
216 dvi4: move.l (sp)+,d5
217 move.l (sp)+,d0 !divisor
218 move.l (sp)+,d1 !dividend
220 cmp.l und,d0 ; beq 0f
221 cmp.l und,d1 ; bne 1f
225 move.l #0,d4 !sign in d4
237 4: move.l d5,-(sp) ; rts
239 !Expects d0 divisor , d1 dividend. Gives d1 quotient ,d3 remainder
248 move.l #0,d3 ; move.l #32,d2
249 3: lsl.l #1,d1 ; roxl.l #1,d3
251 sub.l d0,d3 ; add.l #1,d1
252 4: sub.w #1,d2 ; bgt 3b
255 !----------------------------------------------------------------------------
257 ngi_z: mov (sp)+,d0 ; bra 0f
258 ngi_l: adroff ; move.w (a5),d0
259 0: sub.l wrd,d0 ; bne 2f
261 comp und,(sp) ; bne 1f
266 2: cmp.l wrd,d0 ; beq 3f
270 bsr no8bar ; not.l (sp)
281 !--------------------------------------------------------------------------
283 sli_z: mov (sp)+,d0 ; bra 0f
284 sli_l: adroff ; move.w (a5),d0
285 0: sub.w wrd,d0 ; beq sli_1W
286 sub.w wrd,d0 ; beq sli2
288 sli_1W: mov (sp)+,d0 !d0 contains the shift count
290 9: mov (sp)+,d1 !integer to shift
301 mov d1,-(sp) ; jmp (a4)
304 bsr no8bar ; move.l (sp)+,d1
305 move.l (sp)+,d2 ; move.l (sp)+,d0
306 3: asl.l #1,d0 ; roxl.l #1,d2
308 move.l d0,-(sp) ; move.l d2,-(sp)
326 !------------------------------------------------------------------------------
332 sri_z: mov (sp)+,d0 ; bra 0f
333 sri_l: adroff ; move.w (a5),d0
334 0: sub.w wrd,d0 ; bne sri2
348 mov d1,-(sp) ; jmp (a4)
349 sri2: sub.w wrd,d0 ; beq 3f
353 bsr no8bar ; move.l (sp)+,d1
354 move.l (sp)+,d2 ; move.l (sp),d0
356 4: asr.l #1,d2 ; roxr.l #1,d0 ; dbra d1,4b
357 move.l d0,(sp) ; move.l d2,-(sp)