UrForth: properly mark scattered colon words
[urasm.git] / libs / sqrt16_fast.zas
blob70406452108274f3f792497799eb3cd7fd013868
1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2 ;; fast 16-bit integer square root
3 ;; 92 bytes, 344-379 cycles (average 362)
4 ;; v2 - 3 t-state optimization spotted by Russ McNulty
5 ;; http://www.retroprogramming.com/2017/07/a-fast-z80-integer-square-root.html
6 ;; k8: NOT TESTED YET!
7 ;;
8 ;; IN:
9 ;;   HL: number
10 ;; OUT:
11 ;;   A: square root
12 ;;   HL: dead
13 ;;   DE: dead
14 ;;   F: dead
15 sqrt16_hl:
16   ld    a,h
17   ld    de,0B0C0h
18   add   a,e
19   jr    c,.sq7
20   ld    a,h
21   ld    d,0F0h
22 .sq7:
23 ; ----------
24   add   a,d
25   jr    nc,.sq6
26   res   5,d
27   db    254
28 .sq6:
29   sub   d
30   sra   d
31 ; ----------
32   set   2,d
33   add   a,d
34   jr    nc,.sq5
35   res   3,d
36   db    254
37 .sq5:
38   sub   d
39   sra   d
40 ; ----------
41   inc   d
42   add   a,d
43   jr    nc,.sq4
44   res   1,d
45   db    254
46 .sq4:
47   sub   d
48   sra   d
49   ld    h,a
50 ; ----------
51   add   hl,de
52   jr    nc,.sq3
53   ld    e,040h
54   db    210
55 .sq3:
56   sbc   hl,de
57   sra   d
58   ld    a,e
59   rra
60 ; ----------
61   or    010h
62   ld    e,a
63   add   hl,de
64   jr    nc,.sq2
65   and   0DFh
66   db    218
67 .sq2:
68   sbc   hl,de
69   sra   d
70   rra
71 ; ----------
72   or    04h
73   ld    e,a
74   add   hl,de
75   jr    nc,.sq1
76   and   0F7h
77   db    218
78 .sq1:
79   sbc   hl,de
80   sra   d
81   rra
82 ; ----------
83   inc   a
84   ld    e,a
85   add   hl,de
86   jr    nc,.sq0
87   and   0FDh
88 .sq0:
89   sra   d
90   rra
91   cpl
92   ret
94 ;; original code
95 ;; 34 bytes, 1005-1101 cycles (average 1053)
96 ;;  ld    bc,08000h
97 ;;  ld    h,c
98 ;;  ld    l,c
99 ;;sqrloop:
100 ;;  srl   b
101 ;;  rr    c
102 ;;  add   hl,bc
103 ;;  ex    de,hl
104 ;;  sbc   hl,de
105 ;;  jr    c,sqrbit
106 ;;  ex    de,hl
107 ;;  add   hl,bc
108 ;;  jr    sqrfi
109 ;;sqrbit:
110 ;;  add   hl,de
111 ;;  ex    de,hl
112 ;;  or    a
113 ;;  sbc   hl,bc
114 ;;sqrfi:
115 ;;  srl   h
116 ;;  rr    l
117 ;;  srl   b
118 ;;  rr    c
119 ;;  jr    nc,sqrloop