repo.or.cz
/
urasm.git
/
blob
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
log
|
graphiclog1
|
graphiclog2
|
commit
|
commitdiff
|
tree
|
refs
|
edit
|
fork
blame
|
history
|
raw
|
HEAD
UrForth: fixed some bugs, added simple benchmark
[urasm.git]
/
libs
/
muldiv_slow.zas
blob
cbb68a93ce6aea864548f2eb3638bbda818d84fd
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
28
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
42
43
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