atof.s 3.2 KB

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