atanbin.z80 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. atanbin:
  2. ;compute atan(DE/BC)
  3. ;make DE and BC positive, adjust angle later
  4. ld a,b
  5. rlc d
  6. rra
  7. rrc d
  8. push af
  9. jr nc,+_
  10. xor a
  11. sub e
  12. ld e,a
  13. sbc a,a
  14. sub d
  15. ld d,a
  16. _:
  17. bit 7,b
  18. jr z,+_
  19. xor a
  20. sub c
  21. ld c,a
  22. sbc a,a
  23. sub b
  24. ld b,a
  25. _:
  26. call atanbin_sub
  27. pop af
  28. ;bit 7 set means y was negative
  29. ;bit 6 set means x was negative
  30. add a,a
  31. jr nc,+_
  32. push af
  33. xor a
  34. sub c
  35. ld c,a
  36. pop af
  37. _:
  38. ret p
  39. ld a,128
  40. sub c
  41. ld c,a
  42. ret
  43. atanbin_sub:
  44. ;compute DE/BC as a fixed-point number
  45. ;if DE>=BC, swap and make the final result 256-atan(BC/DE)
  46. ld h,b
  47. ld l,c
  48. or a
  49. sbc hl,de
  50. jr nz,+_
  51. atan_return_32:
  52. ld bc,32
  53. ret
  54. _:
  55. add hl,de
  56. push af
  57. jr nc,+_
  58. ld b,d
  59. ld c,e
  60. .db $FE
  61. _:
  62. ex de,hl
  63. ;now do HL/BC, given that BC>HL
  64. ;We also made sure all were positive at this point
  65. xor a
  66. sub c
  67. ld c,a
  68. sbc a,a
  69. sub b
  70. ld b,a
  71. add hl,hl \ add hl,bc \ jr c,$+4 \ sbc hl,bc \ rla
  72. add hl,hl \ add hl,bc \ jr c,$+4 \ sbc hl,bc \ rla
  73. add hl,hl \ add hl,bc \ jr c,$+4 \ sbc hl,bc \ rla
  74. add hl,hl \ add hl,bc \ jr c,$+4 \ sbc hl,bc \ rla
  75. add hl,hl \ add hl,bc \ jr c,$+4 \ sbc hl,bc \ rla
  76. add hl,hl \ add hl,bc \ jr c,$+4 \ sbc hl,bc \ rla
  77. add hl,hl \ add hl,bc \ jr c,$+4 \ sbc hl,bc \ rla
  78. add hl,hl \ add hl,bc \ jr c,$+4 \ sbc hl,bc \ rla
  79. ;round step
  80. add hl,hl \ add hl,bc \ adc a,0
  81. jr c,atan_return_32
  82. ;if overflowed, this means we are essentially doing atan(1)
  83. ;If A<128
  84. ; return ((32+19A)>>7)
  85. ;Else
  86. ; return ((32+13A)>>7)+6
  87. ld l,a
  88. ld h,0
  89. ld c,l
  90. ld b,h
  91. add hl,hl
  92. add hl,bc
  93. add hl,hl
  94. ld d,h
  95. ld e,l
  96. add hl,hl
  97. add hl,bc
  98. ;HL is 13A
  99. ;DE is 6A
  100. add a,a
  101. jr nc,+_
  102. inc h
  103. inc h
  104. inc h
  105. .db $FE
  106. _:
  107. add hl,de
  108. ld c,32
  109. add hl,bc
  110. add hl,hl
  111. sla l
  112. ld a,h
  113. adc a,b
  114. ld c,a
  115. ;Now do pi/2-x if needed (pi/2 = 64, here)
  116. pop af
  117. ret nc
  118. ld a,64
  119. sub c
  120. ld c,a
  121. ret