Advertisement
Guest User

Untitled

a guest
Jan 30th, 2019
237
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MPASM 8.78 KB | None | 0 0
  1. Ten:   .word64 0xA
  2. DZero: .double 0.0
  3. DTen: .double 10.0
  4. DOne: .double 1.0
  5. DFive: .double 5.0
  6.  
  7. Dconsts:
  8.     .double 1.0E100
  9.     .double 1.0E200
  10.     .double 1.0E300
  11.     .double 1.0E10
  12.     .double 1.0E20
  13.     .double 1.0E30
  14.     .double 1.0E40
  15.     .double 1.0E50
  16.     .double 1.0E60
  17.     .double 1.0E70
  18.     .double 1.0E80
  19.     .double 1.0E90
  20.     .double 1.0E1
  21.     .double 1.0E2
  22.     .double 1.0E3
  23.     .double 1.0E4
  24.     .double 1.0E5
  25.     .double 1.0E6
  26.     .double 1.0E7
  27.     .double 1.0E8
  28.     .double 1.0E9
  29. Dconsts2:
  30.     .double 1.0E100
  31.     .double 1.0E200
  32.     .double 1.0E300
  33.     .double 1.0E50
  34.     .double 1.0E10
  35.     .double 1.0E20
  36.     .double 1.0E30
  37.     .double 1.0E40
  38.     .double 1.0E5
  39.     .double 1.0E1
  40.     .double 1.0E2
  41.     .double 1.0E3
  42.     .double 1.0E4
  43.     .double 1.0E5
  44.     .double 1.0E6
  45.     .double 1.0E7
  46.     .double 1.0E8
  47.     .double 1.0E9
  48.  
  49. MyZero: .asciiz "0.00000000e+0"
  50. MyOne: .asciiz "1.00000000e+0"
  51. MyMinusOne: .asciiz "-1.00000000e+0"
  52. ZeroCode: .word64 0x30 ; Ascii '0'  
  53.  
  54. --------------------------------------------------------------------------------------------------------------------------------------
  55.  
  56. myatof: ; converts ascii to float
  57. ; function, expects r10 =string length, r17 = &Source string
  58. ; returns computed number in f11
  59.  
  60. ldc1 f11,DZero(r0)
  61. ldc1 f10,DTen(r0)
  62. ldc1 f8,DOne(r0)
  63. ldc1 f0,DZero(r0)
  64. movz r9,r0,r0 ; r9 == i =0
  65. movz r18,r17,r0 ; r18 = &str[0]
  66. movz r6,r0,r0
  67. lb r6,0(r18)
  68. daddi r7,r0,45; r7 = '-'
  69. bne r6,r7,Skipa1
  70. sub.d f8,f0,f8 ; f8 = -1;
  71. daddi r18,r18,1
  72. b Skipa2
  73. Skipa1:
  74. daddi r7,r0,43; r7 = '+'
  75. bne r6,r7,Skipa2
  76. daddi r18,r18,1
  77. Skipa2:
  78. ldc1 f22,DOne(r0)
  79. div.d f29,f22,f10 ; f22 = 0.1
  80. mov.d f22,f29
  81. movz r6,r0,r0
  82. lb r6,0(r18); r6 = str[i]
  83. daddi r6,r6,-48 ; r6 =  r6 - '0'
  84. dmtc1 r6,f5
  85. cvt.d.l f5,f5  ; f5 = (double) (str[i] - '0')
  86. add.d f11,f11,f5
  87. daddi r18,r18,2
  88. Whilea1:
  89. daddi r7,r0,101 ; r7 = 'e'
  90. movz r6,r0,r0
  91. lb r6,0(r18); r6 = str[i]
  92. beq r6,r7,EndWhilea1
  93. daddi r7,r0,69; r7 ='E'
  94. beq r6,r7,EndWhilea1
  95. daddi r7,r0,48; r7 = '0'
  96. dsub r6,r6,r7 ; r6 = r6 - '0'
  97. dmtc1 r6,f5
  98. cvt.d.l f5,f5 ; f5 = (double) (str[i] - '0')
  99. mul.d f5,f5,f22
  100. add.d f11,f11,f5
  101. div.d f22,f22,f10
  102. daddi r18,r18,1
  103. b Whilea1
  104. EndWhilea1:
  105.  
  106. daddi r18,r18,1
  107. mov.d f22,f10
  108. movz r5,r0,r0
  109. daddi r24,r0,1
  110. daddi r7,r0,45; r7 = '-'
  111. movz r6,r0,r0
  112. lb r6,0(r18); r6 = str[i]
  113. bne r6,r7,Skipa3
  114. daddi r24,r0,-1
  115. ;daddi r18,r18,1
  116. Skipa3:
  117. ;daddi r18,r18,1
  118. daddi r18,r18,1
  119. dsub r25,r18,r17 ; r25 = i;
  120. movz r19,r0,r0
  121. ld r20,Ten(r0)
  122. Whilea2:
  123.   dsub r21,r25,r10
  124.   beqz r21,EndWhilea2
  125.   dmult r19,r20
  126.   mflo r19
  127.   movz r6,r0,r0
  128.   lb r6,0(r18); r6 = str[i]
  129.   daddi r6,r6,-48  ; r6 = r6 - '0'
  130.   dadd r19,r19,r6
  131.   daddi r18,r18,1
  132.   daddi r25,r25,1
  133. b Whilea2
  134. EndWhilea2:
  135.  movz r29,r19,r0
  136. bgez r24,PositivePower
  137.  
  138. daddi r21,r0,8 ; r21 = 8
  139. addi r10,r0,100; r10 = 100
  140. ddiv r29,r10
  141. mflo r15
  142. movz r16,r15,r0
  143. beqz r16,NoHundred1
  144. addi r16,r16,-1
  145. dmult r16,r21
  146. mflo r16
  147. ldc1 f28,Dconsts(r16)
  148. div.d f11,f11,f28
  149. NoHundred1:
  150. dmult r15,r10
  151. mflo r16
  152. dsub r16,r29,r16
  153. addi r10,r0,10
  154. ddiv r16,r10
  155. mflo r15
  156. movz r16,r15,r0
  157. beqz r16,NoTen1
  158. addi r16,r16,2
  159. dmult r16,r21
  160. mflo r16
  161. ldc1 f28,Dconsts(r16)
  162. div.d f11,f11,f28
  163. NoTen1:
  164. ddiv r29,r10
  165. mfhi r15
  166. movz r16,r15,r0
  167. beqz r16,NoOne1
  168. addi r16,r16,11
  169. dmult r16,r21
  170. mflo r16
  171. ldc1 f28,Dconsts(r16)
  172. div.d f11,f11,f28
  173.  
  174. NoOne1:
  175.  
  176.  
  177. b NoOne2
  178.  
  179. PositivePower:
  180.  
  181. daddi r21,r0,8
  182. addi r10,r0,100
  183. ddiv r29,r10
  184. mflo r15
  185. movz r16,r15,r0
  186. beqz r16,NoHundred2
  187. addi r16,r16,-1
  188. dmult r16,r21
  189. mflo r16
  190. ldc1 f28,Dconsts(r16)
  191. mul.d f11,f11,f28
  192. NoHundred2:
  193. dmult r15,r10
  194. mflo r16
  195. dsub r16,r29,r16
  196. addi r10,r0,10
  197. ddiv r16,r10
  198. mflo r15
  199. movz r16,r15,r0
  200. beqz r16,NoTen2
  201. addi r16,r16,2
  202. dmult r16,r21
  203. mflo r16
  204. ldc1 f28,Dconsts(r16)
  205. mul.d f11,f11,f28
  206. NoTen2:
  207. ddiv r29,r10
  208. mfhi r15
  209. movz r16,r15,r0
  210. beqz r16,NoOne2
  211. addi r16,r16,11
  212. dmult r16,r21
  213. mflo r16
  214. ldc1 f28,Dconsts(r16)
  215. mul.d f11,f11,f28
  216.  
  217. NoOne2:
  218.  
  219. mul.d f11,f11,f8
  220.  
  221. jr $ra
  222.  
  223. myftoa: ; converts float to ascii
  224. ; function, expects f11 =source number
  225. ; r17 = &destination string
  226. ; returns length in r18
  227. ;
  228. ; id f == 0.0?
  229.  
  230. mov.d f12,f11 ; f12 = x
  231. ldc1 f0,DZero(r0)
  232. c.eq.d 7,f12,f0 ; f == 0.0?
  233. bc1f 7,NotZero  ; No, Skip
  234. movz r18,r17,r0; r18 = &str[0]
  235. addi r9,r0,13
  236. addi r29,r0,MyZero
  237. MemCpy:
  238.  beqz r9,EndMemCpy
  239.  lb r6,0(r29)
  240.  sb r6,0(r18)
  241.  addi r18,r18,1
  242.  addi r29,r29,1
  243.  addi r9,r9,-1
  244.  b MemCpy
  245. EndMemCpy:
  246.  addi r18,r0,13
  247.  jr $ra
  248. NotZero:
  249.  
  250. movz r18,r17,r0; r18 = &str[0]
  251. ldc1 f0,DZero(r0)
  252. ldc1 f1,DOne(r0)
  253. ldc1 f10,DTen(r0)
  254. c.lt.d 7,f11,f0 ; x < 0 ?
  255. bc1f 7,NonNeg; No, x >= 0.0
  256. sub.d f12,f0,f12; f12 = -x (|x|)
  257. daddi r6,r0,45 ; str[0] = '-'
  258. sb r6,0(r18);
  259. daddi r18,r18,1
  260. NonNeg:
  261. ; f < 1.0
  262. c.lt.d 7,f11,f1 ; x < 1 ?
  263. bc1t 7,LessOne  ; No, x >= 0.0
  264.  
  265.  
  266. addi r3,r0,3
  267. movz r9,r0,r0 ; r9 = 0
  268. movz r4,r0,r0 ; r4 = 0
  269. addi r29,r0,Dconsts
  270. Whilefh1:
  271. ldc1 f29,0(r29)
  272. c.lt.d 7,f12,f29
  273. bc1t 7,EndWhilefh1
  274. beqz r3,EndWhilefh1
  275. addi r4,r4,1
  276. addi r3,r3,-1
  277. addi r29,r29,8
  278. addi r9,r9,100
  279. b Whilefh1
  280. EndWhilefh1:
  281.  
  282. beqz r4,NoH1
  283. addi r29,r29,-8
  284. ldc1 f29,0(r29)
  285. div.d f12,f12,f29
  286. NoH1:
  287. addi r29,r0,Dconsts
  288. addi r29,r29,24
  289. addi r4,r0,0
  290. addi r3,r0,9
  291.  
  292. Whileft1:
  293. ldc1 f29,0(r29)
  294. c.lt.d 7,f12,f29
  295. bc1t 7,EndWhileft1
  296. beqz r3,EndWhileft1
  297. addi r4,r4,1
  298. addi r3,r3,-1
  299. addi r29,r29,8
  300. addi r9,r9,10
  301. b Whileft1
  302. EndWhileft1:
  303.  
  304. beqz r4,NoD1
  305. addi r29,r29,-8
  306. ldc1 f29,0(r29)
  307. div.d f12,f12,f29
  308. NoD1:
  309. addi r29,r0,Dconsts
  310. addi r29,r29,96
  311. addi r4,r0,0
  312. addi r3,r0,9
  313.  
  314. Whilefs1:
  315. ldc1 f29,0(r29)
  316. c.lt.d 7,f12,f29
  317. bc1t 7,EndWhilefs1
  318. beqz r3,EndWhilefs1
  319. addi r4,r4,1
  320. addi r3,r3,-1
  321. addi r29,r29,8
  322. addi r9,r9,1
  323. b Whilefs1
  324. EndWhilefs1:
  325.  
  326. beqz r4,NoS1
  327. addi r29,r29,-8
  328. ldc1 f29,0(r29)
  329. div.d f12,f12,f29
  330. NoS1:
  331.  
  332. b GrOne
  333. LessOne:
  334. ldc1 f1,DOne(r0)
  335.  
  336. addi r3,r0,3
  337. movz r9,r0,r0 ; r9 = 0
  338. movz r4,r0,r0 ; r9 = 0
  339. addi r29,r0,Dconsts
  340. Whilefh2:
  341. ldc1 f29,0(r29)
  342. mul.d f13,f12,f29
  343. c.lt.d 7,f13,f1
  344. bc1f 7,EndWhilefh2
  345. beqz r3,EndWhilefh2
  346. addi r4,r4,1
  347. addi r3,r3,-1
  348. addi r29,r29,8
  349. addi r9,r9,-100
  350. b Whilefh2
  351. EndWhilefh2:
  352.  
  353. beqz r4,NoH2
  354. addi r29,r29,-8
  355. ldc1 f29,0(r29)
  356. mul.d f12,f12,f29
  357. NoH2:
  358. addi r29,r0,Dconsts
  359. addi r29,r29,24
  360. addi r4,r0,0
  361. addi r3,r0,9
  362.  
  363. Whileft2:
  364. ldc1 f29,0(r29)
  365. mul.d f13,f12,f29
  366. c.lt.d 7,f13,f1
  367. bc1f 7,EndWhileft2
  368. beqz r3,EndWhileft2
  369. addi r4,r4,1
  370. addi r3,r3,-1
  371. addi r29,r29,8
  372. addi r9,r9,-10
  373. b Whileft2
  374. EndWhileft2:
  375.  
  376. beqz r4,NoD2
  377. addi r29,r29,-8
  378. ldc1 f29,0(r29)
  379. mul.d f12,f12,f29
  380. NoD2:
  381. addi r29,r0,Dconsts
  382. addi r29,r29,96
  383. addi r4,r0,0
  384. addi r3,r0,9
  385.  
  386. Whilefs2:
  387. ldc1 f29,0(r29)
  388. mul.d f13,f12,f29
  389. c.lt.d 7,f13,f1
  390. bc1f 7,EndWhilefs2
  391. beqz r3,EndWhilefs2
  392. addi r4,r4,1
  393. addi r3,r3,-1
  394. addi r29,r29,8
  395. addi r9,r9,-1
  396. b Whilefs2
  397. EndWhilefs2:
  398. addi r9,r9,-1
  399.  
  400. beqz r4,NoS2
  401. addi r29,r29,-8
  402. ldc1 f29,0(r29)
  403. mul.d f12,f12,f29
  404. NoS2:
  405.  
  406. ldc1 f10,DTen(r0)
  407. mul.d f12,f12,f10
  408. ldc1 f1,DOne(r0)
  409. c.lt.d 7,f12,f1
  410. bc1f 7,GrOne
  411.   mul.d f12,f12,f10
  412.   addi r9,r9,-1
  413. GrOne:
  414. ldc1 f10,DTen(r0)
  415. daddi r6,r0,46 ; str[i] = '.'
  416. sb r6,1(r18)
  417. daddi r19,r18,1 ;r19 == pos1
  418.  
  419. movz r21,r0,r0
  420. daddi r22,r0,8
  421.  
  422.   mov.d f23,f1 ; f23 = 1.0
  423.   daddi r23,r0,0 ; r23 == digit = 1
  424.   whilef3a:
  425.      c.eq.d 7,f23,f12
  426.      bc1t 7,Eq1
  427.      c.lt.d 7,f23,f12 ; f23 < f12?
  428.      bc1f 7,EndWhilef3a  ; No, break
  429. Eq1:
  430.      daddi r23,r23,1 ; digit++
  431.      add.d f23,f23,f1
  432.   b whilef3a
  433.   EndWhilef3a:
  434.  
  435.   daddi r23,r23,48; r23 = r23 + '0'
  436.   sb r23,0(r18) ; str[i] = digit
  437.   addi r18,r18,2
  438.   add.d f12,f12,f1
  439.   sub.d f12,f12,f23
  440.   mul.d f12,f12,f10
  441.  
  442.  
  443. Forf1:
  444.   beq r21,r22,EndForf1 ; i < 8?
  445.   mov.d f23,f1 ; f23 = 1.0
  446.   daddi r23,r0,0 ; r23 == digit = 1
  447.   whilef3:
  448.      c.lt.d 7,f23,f12 ; f23 < f12?
  449.      bc1f 7,EndWhilef3  ; No, break
  450.      daddi r23,r23,1 ; digit++
  451.      add.d f23,f23,f1
  452.   b whilef3
  453.   EndWhilef3:
  454.   daddi r23,r23,48; r23 = r23 + '0'
  455.   sb r23,0(r18) ; str[i] = digit
  456.   daddi r18,r18,1
  457.   add.d f12,f12,f1
  458.   sub.d f12,f12,f23
  459.   mul.d f12,f12,f10
  460.   addi r21,r21,1
  461.   b Forf1  
  462. EndForf1:
  463.   daddi r23,r0,101; r23 = 'e'
  464.   sb r23,0(r18) ; str[i] = 'e'
  465.   daddi r18,r18,1 ; i++
  466.   bgez r9,Skipf2 ; is e > 0?
  467.   beqz r9,Skipf2 ; is e == 0?
  468. ;No e < 0
  469.   daddi r23,r0,45; r23 = '-'
  470.   sb r23,0(r18) ; str[i] = '-'
  471.   daddi r18,r18,1 ; i++
  472.   dsub r9,r0,r9 ; r9 = -r9 = |r9|
  473.   b Skipf3  
  474. Skipf2:
  475.   daddi r23,r0,43 ; r23 = '+'
  476.   sb r23,0(r18) ; str[i] = '+'
  477.   daddi r18,r18,1 ; i++
  478. Skipf3:
  479.   movz r14,r9,r0 ; r14 = e
  480.   daddi r15,r0,0
  481.   ld r10,Ten(r0)
  482. Whilef4:
  483.    daddi r15,r15,1
  484.    ddiv r14,r10  
  485.    mflo r14
  486.    beqz r14,EndWhilef4
  487.    b Whilef4
  488. EndWhilef4:  
  489.    daddi r15,r15,-1
  490.    dadd r15,r15,r18
  491.    movz r18,r15,r0 ; set up result
  492.   movz r14,r9,r0 ; r14 = e
  493.   ld r10,Ten(r0)
  494. Whilef5:
  495.    ddiv r14,r10  
  496.    mflo r14
  497.    mfhi r23
  498.    daddi r23,r23,48 ; r23 = r23 + '0'
  499.    sb r23,0(r15)
  500.    daddi r15,r15,-1
  501.    beqz r14,EndWhilef5
  502.    j Whilef5
  503. EndWhilef5:  
  504. dsub r18,r18,r17  
  505. daddi r18,r18,2
  506. jr $ra
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement