binstr.S
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:4k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. |
  2. | binstr.sa 3.3 12/19/90
  3. |
  4. |
  5. | Description: Converts a 64-bit binary integer to bcd.
  6. |
  7. | Input: 64-bit binary integer in d2:d3, desired length (LEN) in
  8. |          d0, and a  pointer to start in memory for bcd characters
  9. |          in d0. (This pointer must point to byte 4 of the first
  10. |          lword of the packed decimal memory string.)
  11. |
  12. | Output: LEN bcd digits representing the 64-bit integer.
  13. |
  14. | Algorithm:
  15. | The 64-bit binary is assumed to have a decimal point before
  16. | bit 63.  The fraction is multiplied by 10 using a mul by 2
  17. | shift and a mul by 8 shift.  The bits shifted out of the
  18. | msb form a decimal digit.  This process is iterated until
  19. | LEN digits are formed.
  20. |
  21. | A1. Init d7 to 1.  D7 is the byte digit counter, and if 1, the
  22. | digit formed will be assumed the least significant.  This is
  23. | to force the first byte formed to have a 0 in the upper 4 bits.
  24. |
  25. | A2. Beginning of the loop:
  26. | Copy the fraction in d2:d3 to d4:d5.
  27. |
  28. | A3. Multiply the fraction in d2:d3 by 8 using bit-field
  29. | extracts and shifts.  The three msbs from d2 will go into
  30. | d1.
  31. |
  32. | A4. Multiply the fraction in d4:d5 by 2 using shifts.  The msb
  33. | will be collected by the carry.
  34. |
  35. | A5. Add using the carry the 64-bit quantities in d2:d3 and d4:d5
  36. | into d2:d3.  D1 will contain the bcd digit formed.
  37. |
  38. | A6. Test d7.  If zero, the digit formed is the ms digit.  If non-
  39. | zero, it is the ls digit.  Put the digit in its place in the
  40. | upper word of d0.  If it is the ls digit, write the word
  41. | from d0 to memory.
  42. |
  43. | A7. Decrement d6 (LEN counter) and repeat the loop until zero.
  44. |
  45. | Implementation Notes:
  46. |
  47. | The registers are used as follows:
  48. |
  49. | d0: LEN counter
  50. | d1: temp used to form the digit
  51. | d2: upper 32-bits of fraction for mul by 8
  52. | d3: lower 32-bits of fraction for mul by 8
  53. | d4: upper 32-bits of fraction for mul by 2
  54. | d5: lower 32-bits of fraction for mul by 2
  55. | d6: temp for bit-field extracts
  56. | d7: byte digit formation word;digit count {0,1}
  57. | a0: pointer into memory for packed bcd string formation
  58. |
  59. | Copyright (C) Motorola, Inc. 1990
  60. | All Rights Reserved
  61. |
  62. | THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA 
  63. | The copyright notice above does not evidence any  
  64. | actual or intended publication of such source code.
  65. |BINSTR    idnt    2,1 | Motorola 040 Floating Point Software Package
  66. |section 8
  67. .include "fpsp.h"
  68. .global binstr
  69. binstr:
  70. moveml %d0-%d7,-(%a7)
  71. |
  72. | A1: Init d7
  73. |
  74. moveql #1,%d7 |init d7 for second digit
  75. subql #1,%d0 |for dbf d0 would have LEN+1 passes
  76. |
  77. | A2. Copy d2:d3 to d4:d5.  Start loop.
  78. |
  79. loop:
  80. movel %d2,%d4 |copy the fraction before muls
  81. movel %d3,%d5 |to d4:d5
  82. |
  83. | A3. Multiply d2:d3 by 8; extract msbs into d1.
  84. |
  85. bfextu %d2{#0:#3},%d1 |copy 3 msbs of d2 into d1
  86. asll #3,%d2 |shift d2 left by 3 places
  87. bfextu %d3{#0:#3},%d6 |copy 3 msbs of d3 into d6
  88. asll #3,%d3 |shift d3 left by 3 places
  89. orl %d6,%d2 |or in msbs from d3 into d2
  90. |
  91. | A4. Multiply d4:d5 by 2; add carry out to d1.
  92. |
  93. asll #1,%d5 |mul d5 by 2
  94. roxll #1,%d4 |mul d4 by 2
  95. swap %d6 |put 0 in d6 lower word
  96. addxw %d6,%d1 |add in extend from mul by 2
  97. |
  98. | A5. Add mul by 8 to mul by 2.  D1 contains the digit formed.
  99. |
  100. addl %d5,%d3 |add lower 32 bits
  101. nop |ERRATA ; FIX #13 (Rev. 1.2 6/6/90)
  102. addxl %d4,%d2 |add with extend upper 32 bits
  103. nop |ERRATA ; FIX #13 (Rev. 1.2 6/6/90)
  104. addxw %d6,%d1 |add in extend from add to d1
  105. swap %d6 |with d6 = 0; put 0 in upper word
  106. |
  107. | A6. Test d7 and branch.
  108. |
  109. tstw %d7 |if zero, store digit & to loop
  110. beqs first_d |if non-zero, form byte & write
  111. sec_d:
  112. swap %d7 |bring first digit to word d7b
  113. aslw #4,%d7 |first digit in upper 4 bits d7b
  114. addw %d1,%d7 |add in ls digit to d7b
  115. moveb %d7,(%a0)+ |store d7b byte in memory
  116. swap %d7 |put LEN counter in word d7a
  117. clrw %d7 |set d7a to signal no digits done
  118. dbf %d0,loop |do loop some more!
  119. bras end_bstr |finished, so exit
  120. first_d:
  121. swap %d7 |put digit word in d7b
  122. movew %d1,%d7 |put new digit in d7b
  123. swap %d7 |put LEN counter in word d7a
  124. addqw #1,%d7 |set d7a to signal first digit done
  125. dbf %d0,loop |do loop some more!
  126. swap %d7 |put last digit in string
  127. lslw #4,%d7 |move it to upper 4 bits
  128. moveb %d7,(%a0)+ |store it in memory string
  129. |
  130. | Clean up and return with result in fp0.
  131. |
  132. end_bstr:
  133. moveml (%a7)+,%d0-%d7
  134. rts
  135. |end