dsforth: added `[CHAR]`
[urasm.git] / dsforth / muldiv_slow.zas
blobd7bcd5578a7014d23ac18469e6ffac495f12555b
1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2 ;; fast mul & div procs
3 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
5 $FORTH_CODE_WORD U*
6 ;; k8
7 ;; ( 16 16 -- 32 )
8   pop   hl
9   pop   de
10   push  bc
12 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
13 ;; unsigned multiply
14 ;; IN:
15 ;;   HL: num0
16 ;;   DE: num1
17 ;; OUT:
18 ;;   HL: high part
19 ;;   DE: low part
20 ;;   BC: dead
21 ;;   AF: dead
22   ld   b,h
23   ld   a,l
24   call umulsub
25   push hl
26   ld   h,a
27   ld   a,b
28   ld   b,h
29   call umulsub
30   pop  de
31   ld   c,d
32   add  hl,bc
33   adc  a,0
34   ld   d,l
35   ld   l,h
36   ld   h,a
38   pop   bc
39   jp    i_pushde
41 umulsub:
42   ld   hl,0
43   ld   c,8
44 .next:
45   add  hl,hl
46   rla
47   jr   nc,.skip
48   add  hl,de
49   adc  a,0
50 .skip:
51   dec  c
52   jr   nz,.next
53   ret
54 $FORTH_END_CODE_WORD U*
56 $FORTH_CODE_WORD U/MOD
57 ;; k8
58 ;; ( u32 u1 -- mod res )
59   ld    hl,bc
60   pop   bc  ; u1
61   pop   de  ; hi
62   ex    (sp),hl  ; lo; save BC (now in HL) on the stack
63   ex    de,hl
65 udivmodbody:
66 ;; IN:
67 ;;   HL: high part
68 ;;   DE: low part
69 ;;   BC: divisor
70 ;; OUT:
71 ;;   DE: res
72 ;;   HL: mod
73 ;;   BC: not changed
74 ;;   AF: dead
75   ld    a,l
76   sub   a,c
77   ld    a,h
78   sbc   a,b
79   jr    nc,.error
80   ld    a,16
81 .loop:
82   add   hl,hl
83   rla
84   ex    de,hl
85   add   hl,hl
86   jr    nc,.nodo0
87   inc   de
88   and   a,a
89 .nodo0:
90   ex    de,hl
91   rra
92   push  af
93   jr    nc,.nodo1
94   and   a,l
95   sbc   hl,bc
96   jr    .next
97 .nodo1:
98   and   a,a
99   sbc   hl,bc
100   jr    nc,.next
101   add   hl,bc
102   dec   de
103 .next:
104   inc   de
105   pop   af
106   dec   a
107   jr    nz,.loop
109 .done:
110   pop   bc
111   ex    de,hl
112   jp    i_pushde
114 .error:
115   ld    hl,0
116   ld    de,hl
117   jr    .done
118 $FORTH_END_CODE_WORD U/MOD