User Tools

Site Tools


base:8bit_atan2_8-bit_angle

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

base:8bit_atan2_8-bit_angle [2015-04-17 04:30] (current)
Line 1: Line 1:
 +====== 8-bit atan2 ======
  
 +might be more precise to add a clc adc #$01 after each eor #$ff, you have to modify all the preceding bcs *+4/ bcc *+4  to *+7 to get the branches correct. also you can omit the clc where bcs is used. adding a SEC before all sbc's might increase the accuracy even further. :)
 +/Oswald
 + 
 +<code>
 +;; Calculate the angle, in a 256-degree circle, between two points.
 +;; The trick is to use logarithmic division to get the y/x ratio and
 +;; integrate the power function into the atan table. Some branching is
 +;; avoided by using a table to adjust for the octants.
 +;; In otherwords nothing new or particularily clever but nevertheless
 +;; quite useful.
 +;;
 +;; by Johan Forslöf (doynax)
 +
 +octant = $fb ;; temporary zeropage variable
 +
 +atan2 lda x1
 + sbc x2
 + bcs *+4
 + eor #$ff
 + tax
 + rol octant
 +
 + lda y1
 + sbc y2
 + bcs *+4
 + eor #$ff
 + tay
 + rol octant
 +
 + lda log2_tab,x
 + sbc log2_tab,y
 + bcc *+4
 + eor #$ff
 + tax
 +
 + lda octant
 + rol
 + and #%111
 + tay
 +
 + lda atan_tab,x
 + eor octant_adjust,y
 + rts
 +
 +octant_adjust .byte %00111111 ;; x+,y+,|x|>|y|
 + .byte %00000000 ;; x+,y+,|x|<|y|
 + .byte %11000000 ;; x+,y-,|x|>|y|
 + .byte %11111111 ;; x+,y-,|x|<|y|
 + .byte %01000000 ;; x-,y+,|x|>|y|
 + .byte %01111111 ;; x-,y+,|x|<|y|
 + .byte %10111111 ;; x-,y-,|x|>|y|
 + .byte %10000000 ;; x-,y-,|x|<|y|
 +
 +
 + ;;;;;;;; atan(2^(x/32))*128/pi ;;;;;;;;
 +
 +atan_tab .byte $00,$00,$00,$00,$00,$00,$00,$00
 + .byte $00,$00,$00,$00,$00,$00,$00,$00
 + .byte $00,$00,$00,$00,$00,$00,$00,$00
 + .byte $00,$00,$00,$00,$00,$00,$00,$00
 + .byte $00,$00,$00,$00,$00,$00,$00,$00
 + .byte $00,$00,$00,$00,$00,$00,$00,$00
 + .byte $00,$00,$00,$00,$00,$00,$00,$00
 + .byte $00,$00,$00,$00,$00,$00,$00,$00
 + .byte $00,$00,$00,$00,$00,$00,$00,$00
 + .byte $00,$00,$00,$00,$00,$00,$00,$00
 + .byte $00,$00,$00,$00,$00,$01,$01,$01
 + .byte $01,$01,$01,$01,$01,$01,$01,$01
 + .byte $01,$01,$01,$01,$01,$01,$01,$01
 + .byte $01,$01,$01,$01,$01,$01,$01,$01
 + .byte $01,$01,$01,$01,$01,$02,$02,$02
 + .byte $02,$02,$02,$02,$02,$02,$02,$02
 + .byte $02,$02,$02,$02,$02,$02,$02,$02
 + .byte $03,$03,$03,$03,$03,$03,$03,$03
 + .byte $03,$03,$03,$03,$03,$04,$04,$04
 + .byte $04,$04,$04,$04,$04,$04,$04,$04
 + .byte $05,$05,$05,$05,$05,$05,$05,$05
 + .byte $06,$06,$06,$06,$06,$06,$06,$06
 + .byte $07,$07,$07,$07,$07,$07,$08,$08
 + .byte $08,$08,$08,$08,$09,$09,$09,$09
 + .byte $09,$0a,$0a,$0a,$0a,$0b,$0b,$0b
 + .byte $0b,$0c,$0c,$0c,$0c,$0d,$0d,$0d
 + .byte $0d,$0e,$0e,$0e,$0e,$0f,$0f,$0f
 + .byte $10,$10,$10,$11,$11,$11,$12,$12
 + .byte $12,$13,$13,$13,$14,$14,$15,$15
 + .byte $15,$16,$16,$17,$17,$17,$18,$18
 + .byte $19,$19,$19,$1a,$1a,$1b,$1b,$1c
 + .byte $1c,$1c,$1d,$1d,$1e,$1e,$1f,$1f
 +
 +
 + ;;;;;;;; log2(x)*32 ;;;;;;;;
 +
 +log2_tab .byte $00,$00,$20,$32,$40,$4a,$52,$59
 + .byte $60,$65,$6a,$6e,$72,$76,$79,$7d
 + .byte $80,$82,$85,$87,$8a,$8c,$8e,$90
 + .byte $92,$94,$96,$98,$99,$9b,$9d,$9e
 + .byte $a0,$a1,$a2,$a4,$a5,$a6,$a7,$a9
 + .byte $aa,$ab,$ac,$ad,$ae,$af,$b0,$b1
 + .byte $b2,$b3,$b4,$b5,$b6,$b7,$b8,$b9
 + .byte $b9,$ba,$bb,$bc,$bd,$bd,$be,$bf
 + .byte $c0,$c0,$c1,$c2,$c2,$c3,$c4,$c4
 + .byte $c5,$c6,$c6,$c7,$c7,$c8,$c9,$c9
 + .byte $ca,$ca,$cb,$cc,$cc,$cd,$cd,$ce
 + .byte $ce,$cf,$cf,$d0,$d0,$d1,$d1,$d2
 + .byte $d2,$d3,$d3,$d4,$d4,$d5,$d5,$d5
 + .byte $d6,$d6,$d7,$d7,$d8,$d8,$d9,$d9
 + .byte $d9,$da,$da,$db,$db,$db,$dc,$dc
 + .byte $dd,$dd,$dd,$de,$de,$de,$df,$df
 + .byte $df,$e0,$e0,$e1,$e1,$e1,$e2,$e2
 + .byte $e2,$e3,$e3,$e3,$e4,$e4,$e4,$e5
 + .byte $e5,$e5,$e6,$e6,$e6,$e7,$e7,$e7
 + .byte $e7,$e8,$e8,$e8,$e9,$e9,$e9,$ea
 + .byte $ea,$ea,$ea,$eb,$eb,$eb,$ec,$ec
 + .byte $ec,$ec,$ed,$ed,$ed,$ed,$ee,$ee
 + .byte $ee,$ee,$ef,$ef,$ef,$ef,$f0,$f0
 + .byte $f0,$f1,$f1,$f1,$f1,$f1,$f2,$f2
 + .byte $f2,$f2,$f3,$f3,$f3,$f3,$f4,$f4
 + .byte $f4,$f4,$f5,$f5,$f5,$f5,$f5,$f6
 + .byte $f6,$f6,$f6,$f7,$f7,$f7,$f7,$f7
 + .byte $f8,$f8,$f8,$f8,$f9,$f9,$f9,$f9
 + .byte $f9,$fa,$fa,$fa,$fa,$fa,$fb,$fb
 + .byte $fb,$fb,$fb,$fc,$fc,$fc,$fc,$fc
 + .byte $fd,$fd,$fd,$fd,$fd,$fd,$fe,$fe
 + .byte $fe,$fe,$fe,$ff,$ff,$ff,$ff,$ff
 +</code>
base/8bit_atan2_8-bit_angle.txt · Last modified: 2015-04-17 04:30 (external edit)