home *** CD-ROM | disk | FTP | other *** search
/ 8bitfiles.net/archives / archives.tar / archives / genie-commodore-file-library / C64-128Toolkit / CORDIC.ARC / CORDIC.S < prev    next >
Encoding:
Text File  |  2019-04-13  |  4.4 KB  |  296 lines

  1. ;CORDIC.S
  2. ;WRITTEN BY BILL LUCIER/NOV 92
  3. ;FROM AN ARTICLE FROM THE C USER JOURNAL NOV/92
  4. ;THIS PROGRAM FINDS THE SINE AND COSINE IN AN INTEGER FORMAT
  5. ;THE VALUES IN A CIRCLE RANGE FROM -1 TO 1. THIS PROGRAM USES
  6. ;THE RANGE -16384 TO 16384. THE COORDINATES ARE ONLY CALCULATED
  7. ;FOR THE 1ST QUADRANT AS THEY ARE THE SAME IN THE OTHERS BUT WITH
  8. ;A DIFFERENT SIGN.
  9. ;THIS ROUTINE IS ALMOST 3X AS FAST AS THE ROM FUNCTIONS.
  10. ;MERLIN USERS SHOULD BE ABLE TO ASSEMBLE THIS BY CHANGING THE ? TO [
  11. X=$8E
  12. Y=$8C
  13. XPOINT=$C8
  14. YPOINT=$CA
  15. .MAC POKE
  16. LDA ?1
  17. STA ?2
  18. .MND
  19. *=4864
  20. STA 193 ;STORE THETA IN 193 & 194 AND MULTIPLY BY 182
  21. STX 194 ;STORE IN $B4 & $B5
  22. CPX #1
  23. BNE LESSTHEN256
  24. CMP #14
  25. BCC QUAD3
  26. POKE #4:QUAD
  27. BNE MULTIPLY
  28. LESSTHEN256 CMP #89
  29. BCS CHECKQUAD2
  30. POKE #1:QUAD
  31. BNE MULTIPLY
  32. CHECKQUAD2 CMP #179
  33. BCS QUAD3
  34. POKE #2:QUAD
  35. BNE MULTIPLY
  36. QUAD3 POKE #3:QUAD
  37. MULTIPLY POKE #0:$B1
  38. LDX #182
  39. STX $B0
  40. STA $B1
  41. STA $B5
  42. STA $B4
  43. LDX #8
  44. MLOOP LSR $B1
  45. ROR $B0
  46. BCC SHIFT
  47. CLC
  48. LDA 193
  49. ADC $B4
  50. STA $B4
  51. LDA 194
  52. ADC $B5
  53. STA $B5
  54. SHIFT ASL 193
  55. ROL 194
  56. DEX
  57. BNE MLOOP
  58. THETA=$B4
  59. LDA QUAD
  60. CMP #2
  61. BEQ IN2QUAD
  62. CMP #3
  63. BEQ IN3QUAD
  64. CMP #4
  65. BEQ IN4QUAD
  66. JMP BEGINCALC
  67. IN2QUAD SEC
  68. LDA #0
  69. SBC THETA
  70. STA THETA
  71. LDA #128
  72. SBC THETA+1
  73. STA THETA+1
  74. JMP BEGINCALC
  75. IN3QUAD SEC
  76. LDA THETA+1
  77. SBC #128
  78. STA THETA+1
  79. JMP BEGINCALC
  80. IN4QUAD LDA THETA
  81. EOR #255
  82. STA THETA
  83. LDA THETA+1
  84. EOR #255
  85. STA THETA+1
  86. BEGINCALC POKE #38:X+1
  87. POKE #221:X
  88. LDA #<THETA
  89. JSR TWOCOMP
  90. LDA #0
  91. STA Y
  92. STA Y+1
  93. STA I
  94. LOOPI LDA THETA+1
  95. BMI COUNTERCW     ;THETA IS NEGATIVE SO ADD ARCTAN TO IT
  96. LDA I
  97. ASL
  98. TAY
  99. CLC
  100. LDA THETA
  101. ADC NEGARCTAN,Y   ;NEGARCTAN IS THE TWO COMP OF ARCTAN SO IN
  102. STA THETA         ;EFFECT WE ARE SUBTRACTING HERE
  103. LDA THETA+1
  104. ADC NEGARCTAN+1,Y
  105. STA THETA+1
  106. JSR ROTATEXY
  107. LDA #$B6          ;SUBTRACT THE ROTATED VALUE OF X FROM Y
  108. JSR TWOCOMP
  109. CLC
  110. LDA Y
  111. ADC $B6
  112. STA Y
  113. LDA Y+1
  114. ADC $B7
  115. STA Y+1
  116. CLC
  117. LDA X
  118. ADC $B8
  119. STA X
  120. LDA X+1
  121. ADC $B9
  122. STA X+1
  123. JMP NEXT
  124. COUNTERCW CLC
  125. LDA I
  126. ASL
  127. TAY
  128. LDA ARCTAN,Y
  129. ADC THETA
  130. STA THETA
  131. LDA ARCTAN+1,Y
  132. ADC THETA+1
  133. STA THETA+1
  134. JSR ROTATEXY
  135. CLC
  136. LDA Y
  137. ADC $B6
  138. STA Y
  139. LDA Y+1
  140. ADC $B7
  141. STA Y+1
  142. LDA #$B8
  143. JSR TWOCOMP
  144. CLC
  145. LDA X
  146. ADC $B8
  147. STA X
  148. LDA X+1
  149. ADC $B9
  150. STA X+1
  151. NEXT INC I
  152. LDA I
  153. CMP #14       ;WE ARE WORKING WITH 16384 AS OUR UNITS AROUND THE
  154. BEQ *+5       ;CIRCLE SO MUST CALCULATE 14 TIMES (2^14=16384)
  155. JMP LOOPI
  156. LDA $8C
  157. LDX $8D
  158. JSR FINALANSWER
  159. STA $8C
  160. STX $8D
  161. LDA $8E
  162. LDX $8F
  163. JSR FINALANSWER
  164. STA $8E
  165. STX $8F
  166. LDA QUAD      ;CHECK WHAT QUADRANT WE WERE ORIGINALLY IN
  167. CMP #1        ;WE MAY HAVE TO NEGATE HERE TO GET THE CORRECT ANSWER
  168. BEQ CHECKY
  169. CMP #4
  170. BEQ CHECKY
  171. LDA #<X
  172. JSR TWOCOMP
  173. CHECKY LDA QUAD
  174. CMP #3
  175. BCC DONE
  176. LDA #<Y
  177. JSR TWOCOMP
  178. DONE LDY #0
  179. LDA $8D
  180. LDX #XPOINT
  181. JSR PUTINBANK1
  182. LDX #XPOINT
  183. LDY #1
  184. LDA $8C
  185. JSR PUTINBANK1
  186. LDX #YPOINT
  187. LDY #0
  188. LDA $8F
  189. JSR PUTINBANK1
  190. LDX #YPOINT
  191. LDY #1
  192. LDA $8E
  193. PUTINBANK1 STX 697
  194. LDX #127
  195. JMP $02AF
  196. ROTATEXY POKE Y:$B8
  197. POKE Y+1:$B9
  198. STA YFLAG
  199. BPL NOTMINUS
  200. LDA #$B8
  201. JSR TWOCOMP
  202. NOTMINUS POKE X:$B6
  203. POKE X+1:$B7
  204. STA XFLAG
  205. BPL NOTMINUS2      ;GET THE TWO COMPLEMENT OF IT. AFTER IT HAS
  206. LDA #$B6           ;BEEN ROTATED WE WILL HAVE TO MAKE IT NEGATIVE AGAIN
  207. JSR TWOCOMP
  208. NOTMINUS2 LDX I
  209. BEQ REVEM
  210. ROTATEM LSR $B9
  211. ROR $B8
  212. LSR $B7
  213. ROR $B6
  214. DEX
  215. BNE ROTATEM
  216. REVEM LDA XFLAG  ;IF THIS WAS NEGATIVE BEFORE MAKE IT NEGATIVE AGAIN
  217. BPL CHECKYFLAG
  218. LDA #$B6
  219. JSR TWOCOMP
  220. CHECKYFLAG LDA YFLAG
  221. BPL NOTNEG
  222. LDA #$B8
  223. BNE TWOCOMP
  224. NOTNEG RTS
  225. TWOCOMP STA $B0   ;THE VALUE POINTED AT IN $B0,$B1 IS
  226. LDY #0            ; EXCLUSIVELY'ORED WITH 65535 AND HAS
  227. STY $B1           ;1 ADDED TO IT TO GET THE TWO'S COMPLEMENT
  228. LDA ($B0),Y
  229. EOR #255
  230. TAX
  231. INY
  232. LDA ($B0),Y
  233. EOR #255
  234. TAY
  235. INX
  236. BNE NOTWRAP
  237. INY
  238. NOTWRAP TYA
  239. LDY #1
  240. STA ($B0),Y
  241. DEY
  242. TXA
  243. STA ($B0),Y
  244. RTS
  245. FINALANSWER STA $FC
  246. STX $FD
  247. POKE #0:NEG
  248. STA $F9
  249. STA $FA
  250. STA $FB
  251. STA $FE
  252. TXA
  253. BPL NOTNEGAT
  254. POKE #$FC:NEG
  255. JSR TWOCOMP
  256. NOTNEGAT POKE #100:$B6     ;HERE THE NUMBER IN $FC & $FD IS * 100.
  257. LDX #8                     ;THEN IT IS DIVIDED BY 16384. IT WOULD
  258. LOOP LSR $B6               ;BE EASIER TO DIVIDE BY 163 BUT THERE
  259. BCC NOADD                  ;WOULD BE A LOSS OF PRECISION
  260. CLC
  261. LDA $FC
  262. ADC $F9
  263. STA $F9
  264. LDA $FD
  265. ADC $FA
  266. STA $FA
  267. LDA $FE
  268. ADC $FB
  269. STA $FB
  270. NOADD ASL $FC
  271. ROL $FD
  272. ROL $FE
  273. DEX
  274. BNE LOOP
  275. LDX #14          ;DIVIDE BY 16384.THAT IS ROTATE RIGHT 14 TIMES
  276. ROTATE LSR $FB
  277. ROR $FA
  278. ROR $F9
  279. DEX
  280. BNE ROTATE
  281. LDA NEG
  282. BEQ POSITIVE
  283. LDA #$F9
  284. JSR TWOCOMP
  285. POSITIVE LDA $F9
  286. LDX $FA
  287. RTS
  288. QUAD .BYT 0
  289. I .BYT 0
  290. NEG .BYT 0
  291. ARCTAN .WOR 8192,4836,2555,1297,651,326,163,81,41,20,10,5,2,1
  292. NEGARCTAN .WOR 57344,60700,62981,64239,64885,65210,65373,65455,65495,65516,65526
  293. .WOR 65531,65534,65535
  294. XFLAG .BYT 0
  295. YFLAG .BYT 0
  296.