1: / Long quotient
2:
3: .globl aldiv
4: .globl csv, cret
5: aldiv:
6: jsr r5,csv
7: mov 8.(r5),r3
8: sxt r4
9: bpl 1f
10: neg r3
11: 1:
12: cmp r4,6.(r5)
13: bne hardldiv
14: mov 4(r5),r1
15: mov 2(r1),r2
16: mov (r1),r1
17: bge 1f
18: neg r1
19: neg r2
20: sbc r1
21: com r4
22: 1:
23: mov r4,-(sp)
24: clr r0
25: div r3,r0
26: mov r0,r4 /high quotient
27: mov r1,r0
28: mov r2,r1
29: div r3,r0
30: bvc 1f
31: sub r3,r0 / this is the clever part
32: div r3,r0
33: tst r1
34: sxt r1
35: add r1,r0 / cannot overflow!
36: 1:
37: mov r0,r1
38: mov r4,r0
39: tst (sp)+
40: bpl 9f
41: neg r0
42: neg r1
43: sbc r0
44: 9:
45: mov 4.(r5),r2
46: mov r0,(r2)+
47: mov r1,(r2)
48: jmp cret
49:
50: / The divisor is known to be >= 2^15 so only 16 cycles are needed.
51: hardldiv:
52: clr -(sp)
53: mov 4.(r5),r0
54: mov 2(r0),r2
55: mov (r0),r1
56: bpl 1f
57: com (sp)
58: neg r1
59: neg r2
60: sbc r1
61: 1:
62: clr r0
63: mov 6.(r5),r3
64: bge 1f
65: neg r3
66: neg 8.(r5)
67: sbc r3
68: com (sp)
69: 1:
70: mov $16.,r4
71: 1:
72: clc
73: rol r2
74: rol r1
75: rol r0
76: cmp r3,r0
77: bgt 3f
78: blt 2f
79: cmp 8.(r5),r1
80: blos 2f
81: 3:
82: sob r4,1b
83: br 1f
84: 2:
85: sub 8.(r5),r1
86: sbc r0
87: sub r3,r0
88: inc r2
89: sob r4,1b
90: 1:
91: mov r2,r1
92: clr r0
93: tst (sp)+
94: beq 1f
95: neg r0
96: neg r1
97: sbc r0
98: 1:
99: mov 4.(r5),r2
100: mov r0,(r2)+
101: mov r1,(r2)
102: jmp cret
Defined functions
aldiv
declared in line
3; defined in line
5; used 1 times