1
0
mirror of https://gitlab.com/camelot/kickc.git synced 2024-11-20 02:32:36 +00:00
kickc/src/test/ref/cordic-atan2.asm

288 lines
4.4 KiB
NASM
Raw Normal View History

2019-06-26 07:24:25 +00:00
// Find atan2(x, y) using the CORDIC method
// See http://bsvi.ru/uploads/CORDIC--_10EBA/cordic.pdf
.pc = $801 "Basic"
:BasicUpstart(main)
.pc = $80d "Program"
2019-06-28 07:34:02 +00:00
.label D018 = $d018
// Color Ram
.label COLS = $d800
// The number of iterations performed during 8-bit CORDIC atan2 calculation
.const CORDIC_ITERATIONS_8 = 8
2019-06-28 07:34:02 +00:00
.label CHARSET = $2000
.label SCREEN = $2800
2019-06-26 07:24:25 +00:00
main: {
2019-06-28 07:34:02 +00:00
.const toD0181_return = (>(SCREEN&$3fff)*4)|(>CHARSET)/4&$f
.label screen = 3
.label x = $a
.label y = 5
2019-06-28 07:34:02 +00:00
jsr init_font_hex
lda #toD0181_return
sta D018
lda #<SCREEN
sta.z screen
2019-06-28 07:34:02 +00:00
lda #>SCREEN
sta.z screen+1
2019-06-28 07:34:02 +00:00
lda #-$c
sta.z y
2019-06-26 07:24:25 +00:00
b1:
2019-06-28 07:34:02 +00:00
lda #-$13
sta.z x
2019-06-26 07:24:25 +00:00
b2:
jsr atan2_8
2019-06-26 07:24:25 +00:00
txa
2019-06-28 07:34:02 +00:00
ldy #0
2019-06-26 07:24:25 +00:00
sta (screen),y
inc.z screen
2019-06-28 07:34:02 +00:00
bne !+
inc.z screen+1
2019-06-28 07:34:02 +00:00
!:
inc.z x
2019-06-28 07:34:02 +00:00
lda #$15
cmp.z x
2019-06-26 07:24:25 +00:00
bne b2
inc.z y
2019-06-28 07:34:02 +00:00
lda #$d
cmp.z y
2019-06-26 07:24:25 +00:00
bne b1
2019-06-28 07:34:02 +00:00
b4:
lda COLS+$c*$28+$13
clc
adc #1
sta COLS+$c*$28+$13
jmp b4
2019-06-26 07:24:25 +00:00
}
// Find the atan2(x, y) - which is the angle of the line from (0,0) to (x,y)
// Finding the angle requires a binary search using CORDIC_ITERATIONS_8
// Returns the angle in hex-degrees (0=0, 0x80=PI, 0x100=2*PI)
// atan2_8(signed byte zeropage($a) x, signed byte zeropage(5) y)
atan2_8: {
.label _7 = $b
.label xi = $b
.label xd = $c
.label angle = 2
.label i = $d
.label x = $a
.label y = 5
lda.z y
2019-06-26 07:24:25 +00:00
cmp #0
2019-06-28 07:34:02 +00:00
beq !+
bmi !b1+
jmp b1
!b1:
!:
lda.z y
2019-06-28 07:34:02 +00:00
eor #$ff
clc
adc #1
tax
2019-06-26 07:24:25 +00:00
b3:
lda.z x
2019-06-28 07:34:02 +00:00
cmp #0
beq !+
bmi !b4+
jmp b4
!b4:
!:
lda.z x
2019-06-28 07:34:02 +00:00
eor #$ff
clc
adc #1
sta.z _7
2019-06-28 07:34:02 +00:00
b6:
lda #0
sta.z angle
sta.z i
2019-06-28 07:34:02 +00:00
b10:
txa
cmp #0
bne b11
b12:
lda.z angle
2019-06-28 07:34:02 +00:00
lsr
tax
lda.z x
2019-06-28 07:34:02 +00:00
cmp #0
bpl b7
txa
eor #$ff
clc
adc #$80+1
tax
b7:
lda.z y
2019-06-28 07:34:02 +00:00
cmp #0
bpl b8
dex
txa
eor #$ff
tax
b8:
rts
b11:
lda.z xi
ldy.z i
2019-06-26 07:24:25 +00:00
cpy #0
beq !e+
!l:
cmp #$80
ror
dey
bne !l-
!e:
sta.z xd
ldy.z i
2019-06-28 07:34:02 +00:00
txa
2019-06-26 07:24:25 +00:00
cpy #0
beq !e+
!l:
cmp #$80
ror
dey
bne !l-
!e:
tay
2019-06-28 07:34:02 +00:00
txa
2019-06-26 07:24:25 +00:00
cmp #0
beq !+
2019-06-28 07:34:02 +00:00
bpl b13
2019-06-26 07:24:25 +00:00
!:
tya
eor #$ff
sec
adc.z xi
sta.z xi
2019-06-28 07:34:02 +00:00
txa
2019-06-26 07:24:25 +00:00
clc
adc.z xd
2019-06-26 07:24:25 +00:00
tax
lda.z angle
ldy.z i
2019-06-28 07:34:02 +00:00
sec
sbc CORDIC_ATAN2_ANGLES_8,y
sta.z angle
2019-06-28 07:34:02 +00:00
b14:
inc.z i
2019-06-29 08:08:46 +00:00
lda #CORDIC_ITERATIONS_8-1+1
cmp.z i
2019-06-28 07:34:02 +00:00
beq b12
jmp b10
b13:
2019-06-26 07:24:25 +00:00
tya
clc
adc.z xi
sta.z xi
2019-06-28 07:34:02 +00:00
txa
2019-06-26 07:24:25 +00:00
sec
sbc.z xd
2019-06-28 07:34:02 +00:00
tax
lda.z angle
ldy.z i
2019-06-28 07:34:02 +00:00
clc
adc CORDIC_ATAN2_ANGLES_8,y
sta.z angle
2019-06-28 07:34:02 +00:00
jmp b14
b4:
lda.z x
sta.z xi
2019-06-28 07:34:02 +00:00
jmp b6
b1:
ldx.z y
2019-06-28 07:34:02 +00:00
jmp b3
}
// Make charset from proto chars
// init_font_hex(byte* zeropage(6) charset)
2019-06-28 07:34:02 +00:00
init_font_hex: {
.label _0 = $d
.label idx = $b
.label proto_lo = 8
.label charset = 6
.label c1 = $a
.label proto_hi = 3
.label c = 5
2019-06-28 07:34:02 +00:00
lda #0
sta.z c
2019-06-28 07:34:02 +00:00
lda #<FONT_HEX_PROTO
sta.z proto_hi
2019-06-28 07:34:02 +00:00
lda #>FONT_HEX_PROTO
sta.z proto_hi+1
2019-06-28 07:34:02 +00:00
lda #<CHARSET
sta.z charset
2019-06-28 07:34:02 +00:00
lda #>CHARSET
sta.z charset+1
2019-06-28 07:34:02 +00:00
b1:
lda #0
sta.z c1
2019-06-28 07:34:02 +00:00
lda #<FONT_HEX_PROTO
sta.z proto_lo
2019-06-28 07:34:02 +00:00
lda #>FONT_HEX_PROTO
sta.z proto_lo+1
2019-06-28 07:34:02 +00:00
b2:
lda #0
tay
sta (charset),y
lda #1
sta.z idx
2019-06-28 07:34:02 +00:00
ldx #0
b3:
txa
tay
lda (proto_hi),y
asl
asl
asl
asl
sta.z _0
2019-06-26 07:24:25 +00:00
txa
2019-06-28 07:34:02 +00:00
tay
lda (proto_lo),y
asl
ora.z _0
ldy.z idx
2019-06-28 07:34:02 +00:00
sta (charset),y
inc.z idx
2019-06-28 07:34:02 +00:00
inx
cpx #5
bne b3
lda #0
ldy.z idx
2019-06-28 07:34:02 +00:00
sta (charset),y
iny
sta (charset),y
lda #5
2019-06-26 07:24:25 +00:00
clc
adc.z proto_lo
sta.z proto_lo
2019-06-28 07:34:02 +00:00
bcc !+
inc.z proto_lo+1
2019-06-28 07:34:02 +00:00
!:
lda #8
clc
adc.z charset
sta.z charset
2019-06-28 07:34:02 +00:00
bcc !+
inc.z charset+1
2019-06-28 07:34:02 +00:00
!:
inc.z c1
2019-06-28 07:34:02 +00:00
lda #$10
cmp.z c1
2019-06-28 07:34:02 +00:00
bne b2
lda #5
clc
adc.z proto_hi
sta.z proto_hi
2019-06-28 07:34:02 +00:00
bcc !+
inc.z proto_hi+1
2019-06-28 07:34:02 +00:00
!:
inc.z c
2019-06-28 07:34:02 +00:00
lda #$10
cmp.z c
2019-06-28 07:34:02 +00:00
bne b1
rts
2019-06-26 07:24:25 +00:00
}
2019-06-28 07:34:02 +00:00
// Bit patterns for symbols 0-f (3x5 pixels) used in font hex
FONT_HEX_PROTO: .byte 2, 5, 5, 5, 2, 6, 2, 2, 2, 7, 6, 1, 2, 4, 7, 6, 1, 2, 1, 6, 5, 5, 7, 1, 1, 7, 4, 6, 1, 6, 3, 4, 6, 5, 2, 7, 1, 1, 1, 1, 2, 5, 2, 5, 2, 2, 5, 3, 1, 1, 2, 5, 7, 5, 5, 6, 5, 6, 5, 6, 2, 5, 4, 5, 2, 6, 5, 5, 5, 6, 7, 4, 6, 4, 7, 7, 4, 6, 4, 4
// Angles representing ATAN(0.5), ATAN(0.25), ATAN(0.125), ...
CORDIC_ATAN2_ANGLES_8:
.fill CORDIC_ITERATIONS_8, 2*256*atan(1/pow(2,i))/PI/2
2019-06-26 07:24:25 +00:00