multiply_divide.asm 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. _Multiply:
  2. ld a, $8
  3. ld b, a
  4. xor a
  5. ld [H_PRODUCT], a
  6. ld [H_MULTIPLYBUFFER], a
  7. ld [H_MULTIPLYBUFFER+1], a
  8. ld [H_MULTIPLYBUFFER+2], a
  9. ld [H_MULTIPLYBUFFER+3], a
  10. .loop
  11. ld a, [H_MULTIPLIER]
  12. srl a
  13. ld [H_MULTIPLIER], a ; (aliases: H_DIVISOR, H_MULTIPLIER, H_POWEROFTEN)
  14. jr nc, .smallMultiplier
  15. ld a, [H_MULTIPLYBUFFER+3]
  16. ld c, a
  17. ld a, [H_MULTIPLICAND+2]
  18. add c
  19. ld [H_MULTIPLYBUFFER+3], a
  20. ld a, [H_MULTIPLYBUFFER+2]
  21. ld c, a
  22. ld a, [H_MULTIPLICAND+1]
  23. adc c
  24. ld [H_MULTIPLYBUFFER+2], a
  25. ld a, [H_MULTIPLYBUFFER+1]
  26. ld c, a
  27. ld a, [H_MULTIPLICAND] ; (aliases: H_MULTIPLICAND)
  28. adc c
  29. ld [H_MULTIPLYBUFFER+1], a
  30. ld a, [H_MULTIPLYBUFFER]
  31. ld c, a
  32. ld a, [H_PRODUCT] ; (aliases: H_PRODUCT, H_PASTLEADINGZEROES, H_QUOTIENT)
  33. adc c
  34. ld [H_MULTIPLYBUFFER], a
  35. .smallMultiplier
  36. dec b
  37. jr z, .done
  38. ld a, [H_MULTIPLICAND+2]
  39. sla a
  40. ld [H_MULTIPLICAND+2], a
  41. ld a, [H_MULTIPLICAND+1]
  42. rl a
  43. ld [H_MULTIPLICAND+1], a
  44. ld a, [H_MULTIPLICAND]
  45. rl a
  46. ld [H_MULTIPLICAND], a
  47. ld a, [H_PRODUCT]
  48. rl a
  49. ld [H_PRODUCT], a
  50. jr .loop
  51. .done
  52. ld a, [H_MULTIPLYBUFFER+3]
  53. ld [H_PRODUCT+3], a
  54. ld a, [H_MULTIPLYBUFFER+2]
  55. ld [H_PRODUCT+2], a
  56. ld a, [H_MULTIPLYBUFFER+1]
  57. ld [H_PRODUCT+1], a
  58. ld a, [H_MULTIPLYBUFFER]
  59. ld [H_PRODUCT], a
  60. ret
  61. _Divide:
  62. xor a
  63. ld [H_DIVIDEBUFFER], a
  64. ld [H_DIVIDEBUFFER+1], a
  65. ld [H_DIVIDEBUFFER+2], a
  66. ld [H_DIVIDEBUFFER+3], a
  67. ld [H_DIVIDEBUFFER+4], a
  68. ld a, $9
  69. ld e, a
  70. .asm_37db3
  71. ld a, [H_DIVIDEBUFFER]
  72. ld c, a
  73. ld a, [H_DIVIDEND+1] ; (aliases: H_MULTIPLICAND)
  74. sub c
  75. ld d, a
  76. ld a, [H_DIVISOR] ; (aliases: H_DIVISOR, H_MULTIPLIER, H_POWEROFTEN)
  77. ld c, a
  78. ld a, [H_DIVIDEND] ; (aliases: H_PRODUCT, H_PASTLEADINGZEROES, H_QUOTIENT)
  79. sbc c
  80. jr c, .asm_37dce
  81. ld [H_DIVIDEND], a ; (aliases: H_PRODUCT, H_PASTLEADINGZEROES, H_QUOTIENT)
  82. ld a, d
  83. ld [H_DIVIDEND+1], a ; (aliases: H_MULTIPLICAND)
  84. ld a, [H_DIVIDEBUFFER+4]
  85. inc a
  86. ld [H_DIVIDEBUFFER+4], a
  87. jr .asm_37db3
  88. .asm_37dce
  89. ld a, b
  90. cp $1
  91. jr z, .asm_37e18
  92. ld a, [H_DIVIDEBUFFER+4]
  93. sla a
  94. ld [H_DIVIDEBUFFER+4], a
  95. ld a, [H_DIVIDEBUFFER+3]
  96. rl a
  97. ld [H_DIVIDEBUFFER+3], a
  98. ld a, [H_DIVIDEBUFFER+2]
  99. rl a
  100. ld [H_DIVIDEBUFFER+2], a
  101. ld a, [H_DIVIDEBUFFER+1]
  102. rl a
  103. ld [H_DIVIDEBUFFER+1], a
  104. dec e
  105. jr nz, .asm_37e04
  106. ld a, $8
  107. ld e, a
  108. ld a, [H_DIVIDEBUFFER]
  109. ld [H_DIVISOR], a ; (aliases: H_DIVISOR, H_MULTIPLIER, H_POWEROFTEN)
  110. xor a
  111. ld [H_DIVIDEBUFFER], a
  112. ld a, [H_DIVIDEND+1] ; (aliases: H_MULTIPLICAND)
  113. ld [H_DIVIDEND], a ; (aliases: H_PRODUCT, H_PASTLEADINGZEROES, H_QUOTIENT)
  114. ld a, [H_DIVIDEND+2]
  115. ld [H_DIVIDEND+1], a ; (aliases: H_MULTIPLICAND)
  116. ld a, [H_DIVIDEND+3]
  117. ld [H_DIVIDEND+2], a
  118. .asm_37e04
  119. ld a, e
  120. cp $1
  121. jr nz, .asm_37e0a
  122. dec b
  123. .asm_37e0a
  124. ld a, [H_DIVISOR] ; (aliases: H_DIVISOR, H_MULTIPLIER, H_POWEROFTEN)
  125. srl a
  126. ld [H_DIVISOR], a ; (aliases: H_DIVISOR, H_MULTIPLIER, H_POWEROFTEN)
  127. ld a, [H_DIVIDEBUFFER]
  128. rr a
  129. ld [H_DIVIDEBUFFER], a
  130. jr .asm_37db3
  131. .asm_37e18
  132. ld a, [H_DIVIDEND+1] ; (aliases: H_MULTIPLICAND)
  133. ld [H_REMAINDER], a ; (aliases: H_DIVISOR, H_MULTIPLIER, H_POWEROFTEN)
  134. ld a, [H_DIVIDEBUFFER+4]
  135. ld [H_QUOTIENT+3], a
  136. ld a, [H_DIVIDEBUFFER+3]
  137. ld [H_QUOTIENT+2], a
  138. ld a, [H_DIVIDEBUFFER+2]
  139. ld [H_QUOTIENT+1], a ; (aliases: H_MULTIPLICAND)
  140. ld a, [H_DIVIDEBUFFER+1]
  141. ld [H_DIVIDEND], a ; (aliases: H_PRODUCT, H_PASTLEADINGZEROES, H_QUOTIENT)
  142. ret