Pristine Ack-5.5
[Ack-5.5.git] / mach / z80 / int / atof.s
1 .define atof
2 .sect .text
3 .sect .rom
4 .sect .data
5 .sect .bss
6 .sect .text
7         .sect .data
8 ! Set of variables
9
10 big:    .data1 0
11         .data1 0
12         .data1 0x40
13         .data1 24       ! 2^23
14 negfrac:.space 1
15 negexp: .space 1
16 begzero:
17 nd:     .space 2
18 fl:     .space 6
19         exp=fl+4
20 eexp:   .space 2
21 flexp:  .space 4
22 exp5:   .space 4
23 endzero:
24 ten:    .data1 0
25         .data1 0
26         .data1 0x50
27         .data1 4                ! 10
28 dig:    .data1 0
29         .data1 0
30 fildig: .data1 0                ! here a number from 0 to 31 will be converted flt.
31         .data1 7
32 bexp:   .space 2
33
34         .sect .text
35 atof:                   ! entry with stringpointer in hl
36                         ! exit with pointer to float in hl
37         push ix
38         push iy
39         push bc
40         push de
41         push af
42         ld b,1
43 1:
44         ld a,(hl)
45         inc hl
46         cp ' '
47         jr z,1b
48         cp '-'
49         jr nz,1f
50         ld b,-1
51         jr 2f
52 1:      cp '+'
53         jr z,2f
54         dec hl
55 2:      ld a,b
56         ld (negfrac),a
57         xor a
58         ld de,begzero
59         ld b,endzero-begzero
60 1:      ld (de),a
61         inc de
62         djnz 1b
63 1:      ld a,(hl)
64         inc hl
65         sub '0'
66         jr c,1f
67         cp 10
68         jr nc,1f
69         ld (fildig),a
70         call cmpbigfl
71         jr z,2f
72         call mulandadd
73         jr 3f
74 2:      ld de,(exp)
75         inc de
76         ld (exp),de
77 3:      ld de,(nd)
78         inc de
79         ld (nd),de
80         jr 1b
81 1:      cp '.'-'0'
82         jr nz,4f
83 1:      ld a,(hl)
84         inc hl
85         sub '0'
86         jr c,4f
87         cp 10
88         jr nc,4f
89         ld (fildig),a
90         call cmpbigfl
91         jr z,2f
92         call mulandadd
93         ld de,(exp)
94         dec de
95         ld (exp),de
96 2:      ld de,(nd)
97         inc de
98         ld (nd),de
99         jr 1b
100 4:
101         ld b,1
102         cp 'E'-'0'
103         jr z,1f
104         cp 'e'-'0'
105         jr nz,5f
106 1:      ld a,(hl)
107         inc hl
108         cp '+'
109         jr z,1f
110         cp '-'
111         jr nz,2f
112         ld b,-1
113         jr 1f
114 2:      dec hl
115 1:      ld a,b
116         ld (negexp),a
117         exx
118         xor a
119         ld h,a
120         ld l,a
121         ld b,a
122         ld d,a
123         ld e,a
124         exx
125 1:      ld a,(hl)
126         inc hl
127         sub '0'
128         jr c,1f
129         cp 10
130         jr nc,1f
131         exx
132         ld c,a
133         add hl,hl
134         add hl,hl
135         add hl,de
136         add hl,hl
137         add hl,bc
138         ld d,h
139         ld e,l
140         exx
141         jr 1b
142 1:      exx
143         ld hl,negexp
144         or a
145         bit 7,(hl)
146         ld hl,(exp)
147         jr z,1f
148         sbc hl,de
149         jr 2f
150 1:      add hl,de
151 2:      ld (exp),hl
152         exx
153 5:      ld a,1
154         ld de,(exp)
155         push de
156         bit 7,d
157         jr z,1f
158         neg
159         ld hl,0
160         or a
161         sbc hl,de
162         ex de,hl
163 1:      ld (negexp),a
164         ld (exp),de
165         pop de
166         ld hl,(nd)
167         add hl,de
168         ld de,-33               ! -LOGHUGE ?
169         xor a
170         sbc hl,de
171         jp p,1f
172         ld hl,fl
173         ld b,6
174 2:      ld (hl),a
175         inc hl
176         djnz 2b
177 1:      ld hl,0x0140    ! 1.0
178         ld (flexp+2),hl
179         ld hl,0x0350    ! 5.0
180         ld (exp5+2),hl
181         ld hl,(exp)
182         ld (bexp),hl
183 1:      bit 0,l
184         jr z,2f
185         call xflt
186         .data2 flexp,exp5,fpmult,4,flexp
187 2:      sra h
188         rr l
189         ld a,h
190         or l
191         jr z,3f
192         call xflt
193         .data2 exp5,exp5,fpmult,4,exp5
194         jr 1b
195 3:      ld hl,negexp
196         ld a,(bexp)
197         bit 7,(hl)
198         jr z,1f
199         call xflt
200         .data2 flexp,fl,fpdiv,4,fl
201         neg
202         jr 2f
203 1:      call xflt
204         .data2 flexp,fl,fpmult,4,fl
205 2:      ld b,a
206         ld a,(fl+3)
207         add a,b
208         ld (fl+3),a
209         ld a,(negfrac)
210         bit 7,a
211         jr z,1f
212         call xflt
213         .data2 fl,fl,fpcomp,4,fl
214 1:      call xflt
215         .data2 fl,fl,fpnorm,4,fl
216         ld hl,fl
217         pop af
218         pop de
219         pop bc
220         pop iy
221         pop ix
222         ret
223
224 cmpbigfl:
225         call xflt
226         .data2 big,fl,fpcmf,0
227         ld a,(fpac+1)
228         bit 7,a
229         ret
230 mulandadd:
231         call xflt
232         .data2 fl,ten,fpmult,4,fl
233         ld a,7
234         ld (fildig+1),a
235         call xflt
236         .data2 dig,dig,fpnorm,4,dig
237         call xflt
238         .data2 fl,dig,fpadd,4,fl
239         ret
240
241 xflt:
242         ex (sp),iy
243         push af
244         push bc
245         push de
246         push hl
247         ld h,(iy+1)
248         ld l,(iy+0)
249         ld de,fpac
250         ld bc,4
251         ldir
252         ld h,(iy+3)
253         ld l,(iy+2)
254         ld de,fpop
255         ld bc,4
256         ldir
257         push iy
258         ld hl,1f
259         push hl
260         ld h,(iy+5)
261         ld l,(iy+4)
262         jp (hl)
263 1:      pop iy
264         ld b,(iy+7)
265         ld c,(iy+6)
266         ld a,b
267         or c
268         jr z,1f
269         inc iy
270         inc iy
271         ld hl,fpac
272         ld d,(iy+7)
273         ld e,(iy+6)
274         ldir
275 1:      push iy
276         pop hl
277         ld de,8
278         add hl,de
279         push hl
280         pop iy
281         pop hl
282         pop de
283         pop bc
284         pop af
285         ex (sp),iy
286         ret
287 .align 256