1: / Long remainder
2:
3: .globl lrem
4: .globl csv, cret
5:
6: lrem:
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 hardlrem
15: mov 6.(r5),r2
16: mov 4.(r5),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: jmp cret
41:
42: / The divisor is known to be >= 2^15. Only 16 cycles are
43: / needed to get a remainder.
44: hardlrem:
45: mov 6.(r5),r2
46: mov 4.(r5),r1
47: bpl 1f
48: neg r1
49: neg r2
50: sbc r1
51: 1:
52: clr r0
53: mov 8.(r5),r3
54: bge 1f
55: neg r3
56: neg 10.(r5)
57: sbc r3
58: 1:
59: mov $16.,r4
60: 1:
61: clc
62: rol r2
63: rol r1
64: rol r0
65: cmp r3,r0
66: blt 2f
67: bgt 3f
68: cmp 10.(r5),r1
69: blos 2f
70: 3:
71: sob r4,1b
72: br 1f
73: 2:
74: sub 10.(r5),r1
75: sbc r0
76: sub r3,r0
77: sob r4,1b
78: 1:
79: tst 4(r5)
80: bge 1f
81: neg r0
82: neg r1
83: sbc r0
84: 1:
85: jmp cret
Defined functions
lrem
declared in line
3; defined in line
6; used 1 times