|
|
1.1 root 1: //////////
2: / i8086 C library runtime support.
3: / vdiv()
4: / Unsigned long division and remainder support.
5: //////////
6:
7: #include "larges.h"
8:
9: //////////
10: / Returns (dx ax) / (bx cx) in (si di)
11: / and (dx ax) % (bx cx) in (dx ax).
12: / All are unsigned longs.
13: //////////
14:
15: .globl vdiv
16:
17: vdiv: mov si, bx
18: or si, cx
19: mov si, $-1 / does not affect flags
20: mov di, si
21: jne 0f
22: sub si, si
23: mov di, si / divisor = 0
24: Gret
25:
26: 1: shr si, $1 / "count" quotient bits
27: rcr di, $1
28: 0: cmp dx, bx
29: jb 1f
30: shl cx, $1 / shift until big enough
31: rcl bx, $1
32: jnc 1b
33: / oops!
34: 3: rcr bx, $1 / carry!=0 only if drop from above
35: rcr cx, $1
36: 1: sub ax, cx
37: sbb dx, bx
38: jnc 2f
39: add ax, cx
40: adc dx, bx / produces another carry
41: 2: rcl di, $1 / collect inverted quotient
42: rcl si, $1
43: jnc 3b / use above "count"
44:
45: not si
46: not di
47: Gret
48:
49: / end of vdiv.m
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.