|
|
1.1 root 1: / Unsigned long quotient
2:
3: .globl auldiv
4: .globl csv, cret
5: auldiv:
6: jsr r5,csv
7: tst 6.(r5)
8: bne hardldiv
9: mov 8.(r5),r3
10: bmi hardldiv
11: mov 4(r5),r1
12: mov 2(r1),r2
13: mov (r1),r1
14: bmi hardest
15: clr r0
16: div r3,r0
17: mov r0,r4 /high quotient
18: mov r1,r0
19: mov r2,r1
20: div r3,r0
21: bvc 1f
22: sub r3,r0 / this is the clever part
23: div r3,r0
24: tst r1
25: sxt r1
26: add r1,r0 / cannot overflow!
27: 1:
28: mov 4.(r5),r2
29: mov r4,(r2)+
30: mov r0,(r2)
31: jmp cret
32:
33: / The divisor is known to be >= 2^15 so only 16 cycles are needed.
34: hardldiv:
35: mov 4.(r5),r0
36: mov 2(r0),r2
37: mov (r0),r1
38: clr r0
39: mov 6.(r5),r3
40: mov $16.,r4
41: 1:
42: clc
43: rol r2
44: rol r1
45: rol r0
46: cmp r3,r0
47: bhi 3f
48: blo 2f
49: cmp 8.(r5),r1
50: blos 2f
51: 3:
52: sob r4,1b
53: br 1f
54: 2:
55: sub 8.(r5),r1
56: sbc r0
57: sub r3,r0
58: inc r2
59: sob r4,1b
60: 1:
61: mov 4.(r5),r3
62: clr (r3)+
63: mov r2,(r3)
64: jmp cret
65:
66: / The dividend is known to be >= 2^31 so 32 cycles are needed.
67: hardest:
68: mov 4.(r5),r0
69: mov 2(r0),r3
70: mov (r0),r2
71: clr r1
72: clr r0
73: mov $32.,r4
74: 1:
75: clc
76: rol r3
77: rol r2
78: rol r1
79: rol r0
80: cmp 6.(r5),r0
81: bhi 3f
82: blo 2f
83: cmp 8.(r5),r1
84: blos 2f
85: 3:
86: sob r4,1b
87: br 1f
88: 2:
89: sub 8.(r5),r1
90: sbc r0
91: sub 6.(r5),r0
92: inc r3
93: sob r4,1b
94: 1:
95: mov 4.(r5),r0
96: mov r2,(r0)+
97: mov r3,(r0)
98: jmp cret
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.