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