1: / Long quotient
2:
3: .globl ldiv
4: .globl csv, cret
5:
6: ldiv:
7: jsr r5,csv
8: mov 10.(r5),r3
9: sxt r4
10: bpl 1f
11: neg r3
12: 1:
13: cmp r4,8.(r5)
14: bne hardldiv
15: mov 6.(r5),r2
16: mov 4.(r5),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: jmp cret
46:
47: / The divisor is known to be >= 2^15 so only 16 cycles are needed.
48: hardldiv:
49: clr -(sp)
50: mov 6.(r5),r2
51: mov 4.(r5),r1
52: bpl 1f
53: com (sp)
54: neg r1
55: neg r2
56: sbc r1
57: 1:
58: clr r0
59: mov 8.(r5),r3
60: bge 1f
61: neg r3
62: neg 10.(r5)
63: sbc r3
64: com (sp)
65: 1:
66: mov $16.,r4
67: 1:
68: clc
69: rol r2
70: rol r1
71: rol r0
72: cmp r3,r0
73: bgt 3f
74: blt 2f
75: cmp 10.(r5),r1
76: blos 2f
77: 3:
78: sob r4,1b
79: br 1f
80: 2:
81: sub 10.(r5),r1
82: sbc r0
83: sub r3,r0
84: inc r2
85: sob r4,1b
86: 1:
87: mov r2,r1
88: clr r0
89: tst (sp)+
90: beq 1f
91: neg r0
92: neg r1
93: sbc r0
94: 1:
95: jmp cret
Defined functions
ldiv
declared in line
3; defined in line
6; used 1 times