1: / Long remainder
2:
3: .globl alrem
4: .globl csv, cret
5: alrem:
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 hardlrem
14: mov 4.(r5),r0
15: mov 2(r0),r2
16: mov (r0),r1
17: mov r1,r4
18: bge 1f
19: neg r1
20: neg r2
21: sbc r1
22: 1:
23: clr r0
24: div r3,r0
25: mov r1,r0
26: mov r2,r1
27: div r3,r0
28: bvc 1f
29: sub r3,r0
30: div r3,r0
31: tst r1
32: beq 9f
33: add r3,r1
34: 1:
35: tst r4
36: bpl 9f
37: neg r1
38: 9:
39: sxt r0
40: mov 4.(r5),r3
41: mov r0,(r3)+
42: mov r1,(r3)
43: jmp cret
44:
45: / The divisor is known to be >= 2^15. Only 16 cycles are
46: / needed to get a remainder.
47: hardlrem:
48: mov 4.(r5),r0
49: mov 2(r0),r2
50: mov (r0),r1
51: bpl 1f
52: neg r1
53: neg r2
54: sbc r1
55: 1:
56: clr r0
57: mov 6.(r5),r3
58: bge 1f
59: neg r3
60: neg 8.(r5)
61: sbc r3
62: 1:
63: mov $16.,r4
64: 1:
65: clc
66: rol r2
67: rol r1
68: rol r0
69: cmp r3,r0
70: blt 2f
71: bgt 3f
72: cmp 8.(r5),r1
73: blos 2f
74: 3:
75: sob r4,1b
76: br 1f
77: 2:
78: sub 8.(r5),r1
79: sbc r0
80: sub r3,r0
81: sob r4,1b
82: 1:
83: mov 4.(r5),r3
84: tst (r3)
85: bge 1f
86: neg r0
87: neg r1
88: sbc r0
89: 1:
90: mov r0,(r3)+
91: mov r1,(r3)
92: jmp cret
Defined functions
alrem
declared in line
3; defined in line
5; used 1 times