UrForth: fixed some bugs, added simple benchmark
[urasm.git] / libs / muldiv_slow.zas
blobcbb68a93ce6aea864548f2eb3638bbda818d84fd
1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2 ;; unsigned multiply
3 ;; IN:
4 ;;   HL: num0
5 ;;   DE: num1
6 ;; OUT:
7 ;;   HL: high part
8 ;;   DE: low part
9 ;;   BC: dead
10 ;;   AF: dead
11 UMul1616_32:
12   ld    b,h
13   ld    a,l
14   call  .mulsub
15   push  hl
16   ld    h,a
17   ld    a,b
18   ld    b,h
19   call  .mulsub
20   pop   de
21   ld    c,d
22   add   hl,bc
23   adc   a,0
24   ld    d,l
25   ld    l,h
26   ld    h,a
27   ret
29 .mulsub:
30   ld    hl,0
31   ld    c,8
32 .next:
33   add   hl,hl
34   rla
35   jr    nc,.skip
36   add   hl,de
37   adc   a,0
38 .skip:
39   dec   c
40   jr    nz,.next
41   ret
44 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
45 ;; unsigned division
46 ;; IN:
47 ;;   HL: high part
48 ;;   DE: low part
49 ;;   BC: divisor
50 ;; OUT:
51 ;;   DE: res
52 ;;   HL: mod
53 ;;   BC: dead
54 ;;   AF: dead
55 UDiv3216_16:
56   ld    a,l
57   sub   a,c
58   ld    a,h
59   sbc   a,b
60   jr    nc,.error
61   ld    a,16
62 .loop:
63   add   hl,hl
64   rla
65   ex    de,hl
66   add   hl,hl
67   jr    nc,.nodo0
68   inc   de
69   and   a,a
70 .nodo0:
71   ex    de,hl
72   rra
73   push  af
74   jr    nc,.nodo1
75   and   a,l
76   sbc   hl,bc
77   jr    .next
78 .nodo1:
79   and   a,a
80   sbc   hl,bc
81   jr    nc,.next
82   add   hl,bc
83   dec   de
84 .next:
85   inc   de
86   pop   af
87   dec   a
88   jr    nz,.loop
89   ret
90 .error:
91   ld    hl,0
92   ld    de,hl
93   ret