dsforth: added `[CHAR]`
[urasm.git] / dsforth / muldiv_fast.zas
blob4f2bee40a4fe070af9df8c0cd6a3ecdca6f89fc5
1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2 ;; fast mul & div procs
3 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
5 $FORTH_CODE_WORD U*
6 ;; k8
7 ;; ( 16 16 -- 32 )
8   pop   de
9   pop   hl
10   push  bc
12 ;; IN:
13 ;;   DE: num0
14 ;;   HL: num1
15 ;; OUT:
16 ;;   HL: high part
17 ;;   DE: low part
18 ;;   BC: dead
19 ;;   AF: dead
20   ld    bc,hl
21 ;; hlde=de*bc, bc is not changed
22 ;; min ticks: 730; max ticks: 826
23   ld    hl,0
24   or    a
26   rr    d
27   rr    e
28   jp    nc,$+4
29   add   hl,bc
31  DUP 15
32   rr    h
33   rr    l
34   rr    d
35   rr    e
36   jp    nc,$+4
37   add   hl,bc
38  EDUP
40   rr    h
41   rr    l
42   rr    d
43   rr    e
44 ;; done
46   pop   bc
47   jp    i_pushde
48 $FORTH_END_CODE_WORD U*
50 $FORTH_CODE_WORD U/MOD
51 ;; k8
52 ;; ( u32 u1 -- mod res )
53   ld    hl,bc
54   pop   bc  ; u1
55   pop   de  ; hi
56   ex    (sp),hl  ; lo; save BC (now in HL) on the stack
57   ex    de,hl
59 udivmodbody:
60   ld    a,b
61   or    c
62   jp    z,.udivmoderror
64 ;; IN:
65 ;;   HL: high part
66 ;;   DE: low part
67 ;;   BC: divisor
68 ;; OUT:
69 ;;   DE: res
70 ;;   HL: mod
71 ;;   BC: not changed
72 ;;   AF: dead
73   ;or    a
75  DUP 16
76   rl    e
77   rl    d
78   adc   hl,hl
79   sbc   hl,bc
80   jp    nc,$+4
81   add   hl,bc
82  EDUP
84   ld    a,e
85   rla
86   cpl
87   ld    e,a
89   ld    a,d
90   rla
91   cpl
92   ld    d,a
94 .done:
95   pop   bc
96   ex    de,hl
97   jp    i_pushde
99 .udivmoderror:
100   ld    hl,0
101   ld    de,hl
102   jr    .done
103 $FORTH_END_CODE_WORD U/MOD