NoahJosephHall

68k trig

Apr 11th, 2017
8,400
0
Never
2
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ; ---------------------------------------------------------------------------
  2. ; Subroutine to calculate sine and cosine of an angle
  3. ; d0 = input byte = angle (360 degrees == 256)
  4. ; d0 = output word = 255 * sine(angle)
  5. ; d1 = output word = 255 * cosine(angle)
  6. ; ---------------------------------------------------------------------------
  7.  
  8. ; ||||||||||||||| S U B R O U T I N E |||||||||||||||||||||||||||||||||||||||
  9.  
  10. ; sub_33B6:
  11. CalcSine:
  12.     andi.w  #$FF,d0
  13.     add.w   d0,d0
  14.     addi.w  #$80,d0
  15.     move.w  Sine_Data(pc,d0.w),d1 ; cos
  16.     subi.w  #$80,d0
  17.     move.w  Sine_Data(pc,d0.w),d0 ; sin
  18.     rts
  19. ; End of function CalcSine
  20.  
  21. ; ===========================================================================
  22. ; word_33CE:
  23. Sine_Data:  BINCLUDE    "misc/sinewave.bin"
  24.  
  25.  
  26. ; ---------------------------------------------------------------------------
  27. ; Subroutine to calculate arctangent of y/x
  28. ; d1 = input x
  29. ; d2 = input y
  30. ; d0 = output angle (360 degrees == 256)
  31. ; ---------------------------------------------------------------------------
  32.  
  33. ; ||||||||||||||| S U B R O U T I N E |||||||||||||||||||||||||||||||||||||||
  34.  
  35. ; sub_364E:
  36. CalcAngle:
  37.     movem.l d3-d4,-(sp)
  38.     moveq   #0,d3
  39.     moveq   #0,d4
  40.     move.w  d1,d3
  41.     move.w  d2,d4
  42.     or.w    d3,d4
  43.     beq.s   CalcAngle_Zero ; special case return if x and y are both 0
  44.     move.w  d2,d4
  45.  
  46.     absw.w  d3  ; calculate absolute value of x
  47.     absw.w  d4  ; calculate absolute value of y
  48.     cmp.w   d3,d4
  49.     bhs.w   +
  50.     lsl.l   #8,d4
  51.     divu.w  d3,d4
  52.     moveq   #0,d0
  53.     move.b  Angle_Data(pc,d4.w),d0
  54.     bra.s   ++
  55. +
  56.     lsl.l   #8,d3
  57.     divu.w  d4,d3
  58.     moveq   #$40,d0
  59.     sub.b   Angle_Data(pc,d3.w),d0
  60. +
  61.     tst.w   d1
  62.     bpl.w   +
  63.     neg.w   d0
  64.     addi.w  #$80,d0
  65. +
  66.     tst.w   d2
  67.     bpl.w   +
  68.     neg.w   d0
  69.     addi.w  #$100,d0
  70. +
  71.     movem.l (sp)+,d3-d4
  72.     rts
  73. ; ===========================================================================
  74. ; loc_36AA:
  75. CalcAngle_Zero:
  76.     move.w  #$40,d0
  77.     movem.l (sp)+,d3-d4
  78.     rts
  79. ; End of function CalcAngle
  80.  
  81. ; ===========================================================================
  82. ; byte_36B4:
  83. Angle_Data: BINCLUDE    "misc/angles.bin"
  84.  
  85. ; =========================================
Advertisement
Comments
  • User was banned
  • User was banned
Add Comment
Please, Sign In to add comment