1
0
mirror of https://gitlab.com/camelot/kickc.git synced 2025-02-17 10:30:43 +00:00

Added circular clear atan2 test

This commit is contained in:
Jesper Gravgaard 2019-06-29 11:10:16 +02:00
parent d0c23993cc
commit e02f3bc2e0
7 changed files with 5081 additions and 1 deletions

View File

@ -10,7 +10,7 @@ word* CORDIC_ATAN2_ANGLES_16 = 0x1000;
// Populate cordic angles table
kickasm(pc CORDIC_ATAN2_ANGLES_16, uses CORDIC_ITERATIONS_16) {{
.for (var i=0; i<CORDIC_ITERATIONS_16; i++)
.word 256*2*256*atan(1/pow(2,i))/PI/2
.word 256*2*256*atan(1/pow(2,i))/PI/2
}}
// Find the atan2(x, y) - which is the angle of the line from (0,0) to (x,y)

View File

@ -35,6 +35,11 @@ public class TestPrograms {
public TestPrograms() {
}
@Test
public void testCordicAtan2Clear() throws IOException, URISyntaxException {
compileAndCompare("cordic-atan2-clear");
}
@Test
public void testCordicAtan2Ref() throws IOException, URISyntaxException {
compileAndCompare("cordic-atan2-16-ref");

View File

@ -0,0 +1,37 @@
// Find atan2(x, y) using the CORDIC method
// See http://bsvi.ru/uploads/CORDIC--_10EBA/cordic.pdf
import "font-hex"
import "atan2"
import "c64"
const byte* CHARSET = 0x2000;
const byte* SCREEN = 0x2800;
void main() {
init_font_hex(CHARSET);
*D018 = toD018(SCREEN, CHARSET);
init_screen();
// Clear the screen by modifying the charset
byte* clear_char = CHARSET;
while(true) {
do {} while(*RASTER!=0xff);
if(clear_char<CHARSET+0x0800) {
*clear_char++ = 0;
}
}
}
void init_screen() {
byte* screen = SCREEN;
for(signed byte y: -12..12) {
for(signed byte x: -19..20) {
signed word xw = (signed word)(word){ (byte)x, 0 };
signed word yw = (signed word)(word){ (byte)y, 0 };
word angle_w = atan2_16(xw, yw);
byte ang_w = >(angle_w+0x0080);
*screen++ = ang_w;
}
}
}

View File

@ -0,0 +1,392 @@
// 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"
// The number of iterations performed during 16-bit CORDIC atan2 calculation
.const CORDIC_ITERATIONS_16 = $f
// Angles representing ATAN(0.5), ATAN(0.25), ATAN(0.125), ...
.label CORDIC_ATAN2_ANGLES_16 = $1000
// The number of iterations performed during 8-bit CORDIC atan2 calculation
.const CORDIC_ITERATIONS_8 = 8
// Angles representing ATAN(0.5), ATAN(0.25), ATAN(0.125), ...
.label CORDIC_ATAN2_ANGLES_8 = $1100
.label RASTER = $d012
.label D018 = $d018
.label CHARSET = $2000
.label SCREEN = $2800
// Populate cordic angles table
// Populate cordic angles table
main: {
.const toD0181_return = (>(SCREEN&$3fff)*4)|(>CHARSET)/4&$f
.label clear_char = 2
jsr init_font_hex
lda #toD0181_return
sta D018
jsr init_screen
lda #<CHARSET
sta clear_char
lda #>CHARSET
sta clear_char+1
b2:
lda #$ff
cmp RASTER
bne b2
lda clear_char+1
cmp #>CHARSET+$800
bcc !+
bne b2
lda clear_char
cmp #<CHARSET+$800
bcs b2
!:
lda #0
tay
sta (clear_char),y
inc clear_char
bne !+
inc clear_char+1
!:
jmp b2
}
init_screen: {
.label _7 = $c
.label xw = $17
.label yw = $19
.label angle_w = $c
.label screen = 5
.label y = 4
lda #<SCREEN
sta screen
lda #>SCREEN
sta screen+1
lda #-$c
sta y
b1:
ldx #-$13
b2:
ldy #0
txa
sta xw+1
sty xw
lda y
sta yw+1
sty yw
jsr atan2_16
lda #$80
clc
adc _7
sta _7
bcc !+
inc _7+1
!:
lda _7+1
ldy #0
sta (screen),y
inc screen
bne !+
inc screen+1
!:
inx
cpx #$15
bne b2
inc y
lda #$d
cmp y
bne b1
rts
}
// 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_16
// Returns the angle in hex-degrees (0=0, 0x8000=PI, 0x10000=2*PI)
// atan2_16(signed word zeropage($17) x, signed word zeropage($19) y)
atan2_16: {
.label _2 = 7
.label _7 = 9
.label yi = 7
.label xi = 9
.label xd = $1b
.label yd = $1d
.label angle = $c
.label i = $b
.label return = $c
.label x = $17
.label y = $19
lda y+1
bne !+
lda y
beq !e+
lsr
!:
bmi !b1+
jmp b1
!b1:
!e:
sec
lda #0
sbc y
sta _2
lda #0
sbc y+1
sta _2+1
b3:
lda x+1
bne !+
lda x
beq !e+
lsr
!:
bmi !b4+
jmp b4
!b4:
!e:
sec
lda #0
sbc x
sta _7
lda #0
sbc x+1
sta _7+1
b6:
lda #0
sta angle
sta angle+1
sta i
b10:
lda yi+1
bne b11
lda yi
bne b11
b12:
lsr angle+1
ror angle
lda x+1
bpl b7
sec
lda #<$8000
sbc angle
sta angle
lda #>$8000
sbc angle+1
sta angle+1
b7:
lda y+1
bpl b8
sec
lda #0
sbc angle
sta angle
lda #0
sbc angle+1
sta angle+1
b8:
rts
b11:
ldy i
lda xi
sta xd
lda xi+1
sta xd+1
cpy #0
beq !e+
!:
lda xd+1
cmp #$80
ror xd+1
ror xd
dey
bne !-
!e:
ldy i
lda yi
sta yd
lda yi+1
sta yd+1
cpy #0
beq !e+
!:
lda yd+1
cmp #$80
ror yd+1
ror yd
dey
bne !-
!e:
lda yi+1
bne !+
lda yi
beq !e+
lsr
!:
bpl b13
!e:
lda xi
sec
sbc yd
sta xi
lda xi+1
sbc yd+1
sta xi+1
lda yi
clc
adc xd
sta yi
lda yi+1
adc xd+1
sta yi+1
lda i
asl
tay
sec
lda angle
sbc CORDIC_ATAN2_ANGLES_16,y
sta angle
lda angle+1
sbc CORDIC_ATAN2_ANGLES_16+1,y
sta angle+1
b14:
inc i
lda #CORDIC_ITERATIONS_16-1+1
cmp i
bne !b12+
jmp b12
!b12:
jmp b10
b13:
lda xi
clc
adc yd
sta xi
lda xi+1
adc yd+1
sta xi+1
lda yi
sec
sbc xd
sta yi
lda yi+1
sbc xd+1
sta yi+1
lda i
asl
tay
clc
lda angle
adc CORDIC_ATAN2_ANGLES_16,y
sta angle
lda angle+1
adc CORDIC_ATAN2_ANGLES_16+1,y
sta angle+1
jmp b14
b4:
lda x
sta xi
lda x+1
sta xi+1
jmp b6
b1:
lda y
sta yi
lda y+1
sta yi+1
jmp b3
}
// Make charset from proto chars
// init_font_hex(byte* zeropage($11) charset)
init_font_hex: {
.label _0 = $1f
.label idx = $16
.label proto_lo = $13
.label charset = $11
.label c1 = $15
.label proto_hi = $e
.label c = $10
lda #0
sta c
lda #<FONT_HEX_PROTO
sta proto_hi
lda #>FONT_HEX_PROTO
sta proto_hi+1
lda #<CHARSET
sta charset
lda #>CHARSET
sta charset+1
b1:
lda #0
sta c1
lda #<FONT_HEX_PROTO
sta proto_lo
lda #>FONT_HEX_PROTO
sta proto_lo+1
b2:
lda #0
tay
sta (charset),y
lda #1
sta idx
ldx #0
b3:
txa
tay
lda (proto_hi),y
asl
asl
asl
asl
sta _0
txa
tay
lda (proto_lo),y
asl
ora _0
ldy idx
sta (charset),y
inc idx
inx
cpx #5
bne b3
lda #0
ldy idx
sta (charset),y
iny
sta (charset),y
lda #5
clc
adc proto_lo
sta proto_lo
bcc !+
inc proto_lo+1
!:
lda #8
clc
adc charset
sta charset
bcc !+
inc charset+1
!:
inc c1
lda #$10
cmp c1
bne b2
lda #5
clc
adc proto_hi
sta proto_hi
bcc !+
inc proto_hi+1
!:
inc c
lda #$10
cmp c
bne b1
rts
}
// 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
.pc = CORDIC_ATAN2_ANGLES_16 "CORDIC_ATAN2_ANGLES_16"
.for (var i=0; i<CORDIC_ITERATIONS_16; i++)
.word 256*2*256*atan(1/pow(2,i))/PI/2
.pc = CORDIC_ATAN2_ANGLES_8 "CORDIC_ATAN2_ANGLES_8"
.fill CORDIC_ITERATIONS_8, 2*256*atan(1/pow(2,i))/PI/2

View File

@ -0,0 +1,191 @@
@begin: scope:[] from
[0] phi()
to:@1
@1: scope:[] from @begin
kickasm(location (const word*) CORDIC_ATAN2_ANGLES_16#0 uses CORDIC_ITERATIONS_16#0) {{ .for (var i=0; i<CORDIC_ITERATIONS_16; i++)
.word 256*2*256*atan(1/pow(2,i))/PI/2
}}
to:@2
@2: scope:[] from @1
kickasm(location (const byte*) CORDIC_ATAN2_ANGLES_8#0 uses CORDIC_ITERATIONS_8#0) {{ .fill CORDIC_ITERATIONS_8, 2*256*atan(1/pow(2,i))/PI/2
}}
to:@3
@3: scope:[] from @2
[3] phi()
[4] call main
to:@end
@end: scope:[] from @3
[5] phi()
main: scope:[main] from @3
[6] phi()
[7] call init_font_hex
to:main::toD0181
main::toD0181: scope:[main] from main
[8] phi()
to:main::@5
main::@5: scope:[main] from main::toD0181
[9] *((const byte*) D018#0) ← (const byte) main::toD0181_return#0
[10] call init_screen
to:main::@1
main::@1: scope:[main] from main::@3 main::@4 main::@5
[11] (byte*) main::clear_char#5 ← phi( main::@5/(const byte*) CHARSET#0 main::@4/(byte*) main::clear_char#1 )
to:main::@2
main::@2: scope:[main] from main::@1 main::@2
[12] if(*((const byte*) RASTER#0)!=(byte) $ff) goto main::@2
to:main::@3
main::@3: scope:[main] from main::@2
[13] if((byte*) main::clear_char#5>=(const byte*) CHARSET#0+(word) $800) goto main::@1
to:main::@4
main::@4: scope:[main] from main::@3
[14] *((byte*) main::clear_char#5) ← (byte) 0
[15] (byte*) main::clear_char#1 ← ++ (byte*) main::clear_char#5
to:main::@1
init_screen: scope:[init_screen] from main::@5
[16] phi()
to:init_screen::@1
init_screen::@1: scope:[init_screen] from init_screen init_screen::@3
[17] (byte*) init_screen::screen#4 ← phi( init_screen/(const byte*) SCREEN#0 init_screen::@3/(byte*) init_screen::screen#1 )
[17] (signed byte) init_screen::y#4 ← phi( init_screen/(signed byte) -$c init_screen::@3/(signed byte) init_screen::y#1 )
to:init_screen::@2
init_screen::@2: scope:[init_screen] from init_screen::@1 init_screen::@4
[18] (byte*) init_screen::screen#2 ← phi( init_screen::@1/(byte*) init_screen::screen#4 init_screen::@4/(byte*) init_screen::screen#1 )
[18] (signed byte) init_screen::x#2 ← phi( init_screen::@1/(signed byte) -$13 init_screen::@4/(signed byte) init_screen::x#1 )
[19] (word) init_screen::xw#0 ← (byte)(signed byte) init_screen::x#2 w= (byte) 0
[20] (word) init_screen::yw#0 ← (byte)(signed byte) init_screen::y#4 w= (byte) 0
[21] (signed word) atan2_16::x#0 ← (signed word)(word) init_screen::xw#0
[22] (signed word) atan2_16::y#0 ← (signed word)(word) init_screen::yw#0
[23] call atan2_16
[24] (word) atan2_16::return#2 ← (word) atan2_16::return#0
to:init_screen::@4
init_screen::@4: scope:[init_screen] from init_screen::@2
[25] (word) init_screen::angle_w#0 ← (word) atan2_16::return#2
[26] (word~) init_screen::$7 ← (word) init_screen::angle_w#0 + (byte) $80
[27] (byte) init_screen::ang_w#0 ← > (word~) init_screen::$7
[28] *((byte*) init_screen::screen#2) ← (byte) init_screen::ang_w#0
[29] (byte*) init_screen::screen#1 ← ++ (byte*) init_screen::screen#2
[30] (signed byte) init_screen::x#1 ← ++ (signed byte) init_screen::x#2
[31] if((signed byte) init_screen::x#1!=(signed byte) $15) goto init_screen::@2
to:init_screen::@3
init_screen::@3: scope:[init_screen] from init_screen::@4
[32] (signed byte) init_screen::y#1 ← ++ (signed byte) init_screen::y#4
[33] if((signed byte) init_screen::y#1!=(signed byte) $d) goto init_screen::@1
to:init_screen::@return
init_screen::@return: scope:[init_screen] from init_screen::@3
[34] return
to:@return
atan2_16: scope:[atan2_16] from init_screen::@2
[35] if((signed word) atan2_16::y#0>(signed byte) 0) goto atan2_16::@1
to:atan2_16::@2
atan2_16::@2: scope:[atan2_16] from atan2_16
[36] (signed word~) atan2_16::$2 ← - (signed word) atan2_16::y#0
to:atan2_16::@3
atan2_16::@3: scope:[atan2_16] from atan2_16::@1 atan2_16::@2
[37] (signed word) atan2_16::yi#0 ← phi( atan2_16::@1/(signed word~) atan2_16::yi#11 atan2_16::@2/(signed word~) atan2_16::$2 )
[38] if((signed word) atan2_16::x#0>(signed byte) 0) goto atan2_16::@4
to:atan2_16::@5
atan2_16::@5: scope:[atan2_16] from atan2_16::@3
[39] (signed word~) atan2_16::$7 ← - (signed word) atan2_16::x#0
to:atan2_16::@6
atan2_16::@6: scope:[atan2_16] from atan2_16::@4 atan2_16::@5
[40] (signed word) atan2_16::xi#0 ← phi( atan2_16::@4/(signed word~) atan2_16::xi#8 atan2_16::@5/(signed word~) atan2_16::$7 )
to:atan2_16::@10
atan2_16::@10: scope:[atan2_16] from atan2_16::@14 atan2_16::@6
[41] (word) atan2_16::angle#12 ← phi( atan2_16::@14/(word) atan2_16::angle#13 atan2_16::@6/(byte) 0 )
[41] (byte) atan2_16::i#2 ← phi( atan2_16::@14/(byte) atan2_16::i#1 atan2_16::@6/(byte) 0 )
[41] (signed word) atan2_16::xi#3 ← phi( atan2_16::@14/(signed word) atan2_16::xi#7 atan2_16::@6/(signed word) atan2_16::xi#0 )
[41] (signed word) atan2_16::yi#3 ← phi( atan2_16::@14/(signed word) atan2_16::yi#7 atan2_16::@6/(signed word) atan2_16::yi#0 )
[42] if((signed word) atan2_16::yi#3!=(signed byte) 0) goto atan2_16::@11
to:atan2_16::@12
atan2_16::@12: scope:[atan2_16] from atan2_16::@10 atan2_16::@14
[43] (word) atan2_16::angle#6 ← phi( atan2_16::@10/(word) atan2_16::angle#12 atan2_16::@14/(word) atan2_16::angle#13 )
[44] (word) atan2_16::angle#1 ← (word) atan2_16::angle#6 >> (byte) 1
[45] if((signed word) atan2_16::x#0>=(signed byte) 0) goto atan2_16::@7
to:atan2_16::@16
atan2_16::@16: scope:[atan2_16] from atan2_16::@12
[46] (word) atan2_16::angle#4 ← (word) $8000 - (word) atan2_16::angle#1
to:atan2_16::@7
atan2_16::@7: scope:[atan2_16] from atan2_16::@12 atan2_16::@16
[47] (word) atan2_16::angle#11 ← phi( atan2_16::@12/(word) atan2_16::angle#1 atan2_16::@16/(word) atan2_16::angle#4 )
[48] if((signed word) atan2_16::y#0>=(signed byte) 0) goto atan2_16::@8
to:atan2_16::@9
atan2_16::@9: scope:[atan2_16] from atan2_16::@7
[49] (word) atan2_16::angle#5 ← - (word) atan2_16::angle#11
to:atan2_16::@8
atan2_16::@8: scope:[atan2_16] from atan2_16::@7 atan2_16::@9
[50] (word) atan2_16::return#0 ← phi( atan2_16::@9/(word) atan2_16::angle#5 atan2_16::@7/(word) atan2_16::angle#11 )
to:atan2_16::@return
atan2_16::@return: scope:[atan2_16] from atan2_16::@8
[51] return
to:@return
atan2_16::@11: scope:[atan2_16] from atan2_16::@10
[52] (signed word) atan2_16::xd#0 ← (signed word) atan2_16::xi#3 >> (byte) atan2_16::i#2
[53] (signed word) atan2_16::yd#0 ← (signed word) atan2_16::yi#3 >> (byte) atan2_16::i#2
[54] if((signed word) atan2_16::yi#3>(signed byte) 0) goto atan2_16::@13
to:atan2_16::@15
atan2_16::@15: scope:[atan2_16] from atan2_16::@11
[55] (signed word) atan2_16::xi#2 ← (signed word) atan2_16::xi#3 - (signed word) atan2_16::yd#0
[56] (signed word) atan2_16::yi#2 ← (signed word) atan2_16::yi#3 + (signed word) atan2_16::xd#0
[57] (byte~) atan2_16::$24 ← (byte) atan2_16::i#2 << (byte) 1
[58] (word) atan2_16::angle#3 ← (word) atan2_16::angle#12 - *((const word*) CORDIC_ATAN2_ANGLES_16#0 + (byte~) atan2_16::$24)
to:atan2_16::@14
atan2_16::@14: scope:[atan2_16] from atan2_16::@13 atan2_16::@15
[59] (signed word) atan2_16::xi#7 ← phi( atan2_16::@13/(signed word) atan2_16::xi#1 atan2_16::@15/(signed word) atan2_16::xi#2 )
[59] (word) atan2_16::angle#13 ← phi( atan2_16::@13/(word) atan2_16::angle#2 atan2_16::@15/(word) atan2_16::angle#3 )
[59] (signed word) atan2_16::yi#7 ← phi( atan2_16::@13/(signed word) atan2_16::yi#1 atan2_16::@15/(signed word) atan2_16::yi#2 )
[60] (byte) atan2_16::i#1 ← ++ (byte) atan2_16::i#2
[61] if((byte) atan2_16::i#1==(const byte) CORDIC_ITERATIONS_16#0-(byte) 1+(byte) 1) goto atan2_16::@12
to:atan2_16::@10
atan2_16::@13: scope:[atan2_16] from atan2_16::@11
[62] (signed word) atan2_16::xi#1 ← (signed word) atan2_16::xi#3 + (signed word) atan2_16::yd#0
[63] (signed word) atan2_16::yi#1 ← (signed word) atan2_16::yi#3 - (signed word) atan2_16::xd#0
[64] (byte~) atan2_16::$23 ← (byte) atan2_16::i#2 << (byte) 1
[65] (word) atan2_16::angle#2 ← (word) atan2_16::angle#12 + *((const word*) CORDIC_ATAN2_ANGLES_16#0 + (byte~) atan2_16::$23)
to:atan2_16::@14
atan2_16::@4: scope:[atan2_16] from atan2_16::@3
[66] (signed word~) atan2_16::xi#8 ← (signed word) atan2_16::x#0
to:atan2_16::@6
atan2_16::@1: scope:[atan2_16] from atan2_16
[67] (signed word~) atan2_16::yi#11 ← (signed word) atan2_16::y#0
to:atan2_16::@3
init_font_hex: scope:[init_font_hex] from main
[68] phi()
to:init_font_hex::@1
init_font_hex::@1: scope:[init_font_hex] from init_font_hex init_font_hex::@5
[69] (byte) init_font_hex::c#6 ← phi( init_font_hex/(byte) 0 init_font_hex::@5/(byte) init_font_hex::c#1 )
[69] (byte*) init_font_hex::proto_hi#6 ← phi( init_font_hex/(const byte[]) FONT_HEX_PROTO#0 init_font_hex::@5/(byte*) init_font_hex::proto_hi#1 )
[69] (byte*) init_font_hex::charset#5 ← phi( init_font_hex/(const byte*) CHARSET#0 init_font_hex::@5/(byte*) init_font_hex::charset#0 )
to:init_font_hex::@2
init_font_hex::@2: scope:[init_font_hex] from init_font_hex::@1 init_font_hex::@4
[70] (byte) init_font_hex::c1#4 ← phi( init_font_hex::@1/(byte) 0 init_font_hex::@4/(byte) init_font_hex::c1#1 )
[70] (byte*) init_font_hex::proto_lo#4 ← phi( init_font_hex::@1/(const byte[]) FONT_HEX_PROTO#0 init_font_hex::@4/(byte*) init_font_hex::proto_lo#1 )
[70] (byte*) init_font_hex::charset#2 ← phi( init_font_hex::@1/(byte*) init_font_hex::charset#5 init_font_hex::@4/(byte*) init_font_hex::charset#0 )
[71] *((byte*) init_font_hex::charset#2) ← (byte) 0
to:init_font_hex::@3
init_font_hex::@3: scope:[init_font_hex] from init_font_hex::@2 init_font_hex::@3
[72] (byte) init_font_hex::idx#5 ← phi( init_font_hex::@2/(byte) 1 init_font_hex::@3/(byte) init_font_hex::idx#2 )
[72] (byte) init_font_hex::i#2 ← phi( init_font_hex::@2/(byte) 0 init_font_hex::@3/(byte) init_font_hex::i#1 )
[73] (byte~) init_font_hex::$0 ← *((byte*) init_font_hex::proto_hi#6 + (byte) init_font_hex::i#2) << (byte) 4
[74] (byte~) init_font_hex::$1 ← *((byte*) init_font_hex::proto_lo#4 + (byte) init_font_hex::i#2) << (byte) 1
[75] (byte~) init_font_hex::$2 ← (byte~) init_font_hex::$0 | (byte~) init_font_hex::$1
[76] *((byte*) init_font_hex::charset#2 + (byte) init_font_hex::idx#5) ← (byte~) init_font_hex::$2
[77] (byte) init_font_hex::idx#2 ← ++ (byte) init_font_hex::idx#5
[78] (byte) init_font_hex::i#1 ← ++ (byte) init_font_hex::i#2
[79] if((byte) init_font_hex::i#1!=(byte) 5) goto init_font_hex::@3
to:init_font_hex::@4
init_font_hex::@4: scope:[init_font_hex] from init_font_hex::@3
[80] *((byte*) init_font_hex::charset#2 + (byte) init_font_hex::idx#2) ← (byte) 0
[81] (byte) init_font_hex::idx#3 ← ++ (byte) init_font_hex::idx#2
[82] *((byte*) init_font_hex::charset#2 + (byte) init_font_hex::idx#3) ← (byte) 0
[83] (byte*) init_font_hex::proto_lo#1 ← (byte*) init_font_hex::proto_lo#4 + (byte) 5
[84] (byte*) init_font_hex::charset#0 ← (byte*) init_font_hex::charset#2 + (byte) 8
[85] (byte) init_font_hex::c1#1 ← ++ (byte) init_font_hex::c1#4
[86] if((byte) init_font_hex::c1#1!=(byte) $10) goto init_font_hex::@2
to:init_font_hex::@5
init_font_hex::@5: scope:[init_font_hex] from init_font_hex::@4
[87] (byte*) init_font_hex::proto_hi#1 ← (byte*) init_font_hex::proto_hi#6 + (byte) 5
[88] (byte) init_font_hex::c#1 ← ++ (byte) init_font_hex::c#6
[89] if((byte) init_font_hex::c#1!=(byte) $10) goto init_font_hex::@1
to:init_font_hex::@return
init_font_hex::@return: scope:[init_font_hex] from init_font_hex::@5
[90] return
to:@return

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,191 @@
(label) @1
(label) @2
(label) @3
(label) @begin
(label) @end
(byte*) CHARSET
(const byte*) CHARSET#0 CHARSET = (byte*) 8192
(word*) CORDIC_ATAN2_ANGLES_16
(const word*) CORDIC_ATAN2_ANGLES_16#0 CORDIC_ATAN2_ANGLES_16 = (word*) 4096
(byte*) CORDIC_ATAN2_ANGLES_8
(const byte*) CORDIC_ATAN2_ANGLES_8#0 CORDIC_ATAN2_ANGLES_8 = (byte*) 4352
(byte) CORDIC_ITERATIONS_16
(const byte) CORDIC_ITERATIONS_16#0 CORDIC_ITERATIONS_16 = (byte) $f
(byte) CORDIC_ITERATIONS_8
(const byte) CORDIC_ITERATIONS_8#0 CORDIC_ITERATIONS_8 = (byte) 8
(byte*) D018
(const byte*) D018#0 D018 = (byte*) 53272
(byte[]) FONT_HEX_PROTO
(const byte[]) FONT_HEX_PROTO#0 FONT_HEX_PROTO = { (byte) 2, (byte) 5, (byte) 5, (byte) 5, (byte) 2, (byte) 6, (byte) 2, (byte) 2, (byte) 2, (byte) 7, (byte) 6, (byte) 1, (byte) 2, (byte) 4, (byte) 7, (byte) 6, (byte) 1, (byte) 2, (byte) 1, (byte) 6, (byte) 5, (byte) 5, (byte) 7, (byte) 1, (byte) 1, (byte) 7, (byte) 4, (byte) 6, (byte) 1, (byte) 6, (byte) 3, (byte) 4, (byte) 6, (byte) 5, (byte) 2, (byte) 7, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 2, (byte) 5, (byte) 2, (byte) 5, (byte) 2, (byte) 2, (byte) 5, (byte) 3, (byte) 1, (byte) 1, (byte) 2, (byte) 5, (byte) 7, (byte) 5, (byte) 5, (byte) 6, (byte) 5, (byte) 6, (byte) 5, (byte) 6, (byte) 2, (byte) 5, (byte) 4, (byte) 5, (byte) 2, (byte) 6, (byte) 5, (byte) 5, (byte) 5, (byte) 6, (byte) 7, (byte) 4, (byte) 6, (byte) 4, (byte) 7, (byte) 7, (byte) 4, (byte) 6, (byte) 4, (byte) 4 }
(byte*) RASTER
(const byte*) RASTER#0 RASTER = (byte*) 53266
(byte*) SCREEN
(const byte*) SCREEN#0 SCREEN = (byte*) 10240
(word()) atan2_16((signed word) atan2_16::x , (signed word) atan2_16::y)
(signed word~) atan2_16::$2 $2 zp ZP_WORD:7 4.0
(byte~) atan2_16::$23 reg byte a 2002.0
(byte~) atan2_16::$24 reg byte a 2002.0
(signed word~) atan2_16::$7 $7 zp ZP_WORD:9 4.0
(label) atan2_16::@1
(label) atan2_16::@10
(label) atan2_16::@11
(label) atan2_16::@12
(label) atan2_16::@13
(label) atan2_16::@14
(label) atan2_16::@15
(label) atan2_16::@16
(label) atan2_16::@2
(label) atan2_16::@3
(label) atan2_16::@4
(label) atan2_16::@5
(label) atan2_16::@6
(label) atan2_16::@7
(label) atan2_16::@8
(label) atan2_16::@9
(label) atan2_16::@return
(word) atan2_16::angle
(word) atan2_16::angle#1 angle zp ZP_WORD:12 3.0
(word) atan2_16::angle#11 angle zp ZP_WORD:12 4.0
(word) atan2_16::angle#12 angle zp ZP_WORD:12 364.0
(word) atan2_16::angle#13 angle zp ZP_WORD:12 1334.6666666666667
(word) atan2_16::angle#2 angle zp ZP_WORD:12 2002.0
(word) atan2_16::angle#3 angle zp ZP_WORD:12 2002.0
(word) atan2_16::angle#4 angle zp ZP_WORD:12 4.0
(word) atan2_16::angle#5 angle zp ZP_WORD:12 4.0
(word) atan2_16::angle#6 angle zp ZP_WORD:12 2004.0
(byte) atan2_16::i
(byte) atan2_16::i#1 i zp ZP_BYTE:11 1501.5
(byte) atan2_16::i#2 i zp ZP_BYTE:11 429.0
(word) atan2_16::return
(word) atan2_16::return#0 return zp ZP_WORD:12 34.99999999999999
(word) atan2_16::return#2 return zp ZP_WORD:12 202.0
(signed word) atan2_16::x
(signed word) atan2_16::x#0 x zp ZP_WORD:23 3.8928571428571437
(signed word) atan2_16::xd
(signed word) atan2_16::xd#0 xd zp ZP_WORD:27 600.5999999999999
(signed word) atan2_16::xi
(signed word) atan2_16::xi#0 xi zp ZP_WORD:9 6.0
(signed word) atan2_16::xi#1 xi zp ZP_WORD:9 500.5
(signed word) atan2_16::xi#2 xi zp ZP_WORD:9 500.5
(signed word) atan2_16::xi#3 xi zp ZP_WORD:9 801.2
(signed word) atan2_16::xi#7 xi zp ZP_WORD:9 1001.0
(signed word~) atan2_16::xi#8 xi zp ZP_WORD:9 4.0
(signed word) atan2_16::y
(signed word) atan2_16::y#0 y zp ZP_WORD:25 3.633333333333334
(signed word) atan2_16::yd
(signed word) atan2_16::yd#0 yd zp ZP_WORD:29 1501.5
(signed word) atan2_16::yi
(signed word) atan2_16::yi#0 yi zp ZP_WORD:7 1.2000000000000002
(signed word) atan2_16::yi#1 yi zp ZP_WORD:7 667.3333333333334
(signed word~) atan2_16::yi#11 yi zp ZP_WORD:7 4.0
(signed word) atan2_16::yi#2 yi zp ZP_WORD:7 667.3333333333334
(signed word) atan2_16::yi#3 yi zp ZP_WORD:7 858.2857142857142
(signed word) atan2_16::yi#7 yi zp ZP_WORD:7 1001.0
(void()) init_font_hex((byte*) init_font_hex::charset)
(byte~) init_font_hex::$0 $0 zp ZP_BYTE:31 1001.0
(byte~) init_font_hex::$1 reg byte a 2002.0
(byte~) init_font_hex::$2 reg byte a 2002.0
(label) init_font_hex::@1
(label) init_font_hex::@2
(label) init_font_hex::@3
(label) init_font_hex::@4
(label) init_font_hex::@5
(label) init_font_hex::@return
(byte) init_font_hex::c
(byte) init_font_hex::c#1 c zp ZP_BYTE:16 16.5
(byte) init_font_hex::c#6 c zp ZP_BYTE:16 1.1578947368421053
(byte) init_font_hex::c1
(byte) init_font_hex::c1#1 c1 zp ZP_BYTE:21 151.5
(byte) init_font_hex::c1#4 c1 zp ZP_BYTE:21 13.466666666666667
(byte*) init_font_hex::charset
(byte*) init_font_hex::charset#0 charset zp ZP_WORD:17 35.5
(byte*) init_font_hex::charset#2 charset zp ZP_WORD:17 108.35714285714285
(byte*) init_font_hex::charset#5 charset zp ZP_WORD:17 22.0
(byte) init_font_hex::i
(byte) init_font_hex::i#1 reg byte x 1501.5
(byte) init_font_hex::i#2 reg byte x 667.3333333333334
(byte) init_font_hex::idx
(byte) init_font_hex::idx#2 idx zp ZP_BYTE:22 551.0
(byte) init_font_hex::idx#3 reg byte y 202.0
(byte) init_font_hex::idx#5 idx zp ZP_BYTE:22 600.5999999999999
(byte*) init_font_hex::proto_hi
(byte*) init_font_hex::proto_hi#1 proto_hi zp ZP_WORD:14 7.333333333333333
(byte*) init_font_hex::proto_hi#6 proto_hi zp ZP_WORD:14 56.83333333333334
(byte*) init_font_hex::proto_lo
(byte*) init_font_hex::proto_lo#1 proto_lo zp ZP_WORD:19 50.5
(byte*) init_font_hex::proto_lo#4 proto_lo zp ZP_WORD:19 92.53846153846155
(void()) init_screen()
(word~) init_screen::$7 $7 zp ZP_WORD:12 202.0
(label) init_screen::@1
(label) init_screen::@2
(label) init_screen::@3
(label) init_screen::@4
(label) init_screen::@return
(byte) init_screen::ang_w
(byte) init_screen::ang_w#0 reg byte a 202.0
(word) init_screen::angle_w
(word) init_screen::angle_w#0 angle_w zp ZP_WORD:12 202.0
(byte*) init_screen::screen
(byte*) init_screen::screen#1 screen zp ZP_WORD:5 42.599999999999994
(byte*) init_screen::screen#2 screen zp ZP_WORD:5 28.545454545454547
(byte*) init_screen::screen#4 screen zp ZP_WORD:5 22.0
(signed byte) init_screen::x
(signed byte) init_screen::x#1 reg byte x 151.5
(signed byte) init_screen::x#2 reg byte x 16.833333333333332
(signed word) init_screen::xw
(word) init_screen::xw#0 xw zp ZP_WORD:23 50.5
(signed byte) init_screen::y
(signed byte) init_screen::y#1 y zp ZP_BYTE:4 16.5
(signed byte) init_screen::y#4 y zp ZP_BYTE:4 1.4666666666666666
(signed word) init_screen::yw
(word) init_screen::yw#0 yw zp ZP_WORD:25 50.5
(void()) main()
(label) main::@1
(label) main::@2
(label) main::@3
(label) main::@4
(label) main::@5
(byte*) main::clear_char
(byte*) main::clear_char#1 clear_char zp ZP_WORD:2 22.0
(byte*) main::clear_char#5 clear_char zp ZP_WORD:2 33.5
(label) main::toD0181
(word~) main::toD0181_$0
(number~) main::toD0181_$1
(number~) main::toD0181_$2
(number~) main::toD0181_$3
(word~) main::toD0181_$4
(byte~) main::toD0181_$5
(number~) main::toD0181_$6
(number~) main::toD0181_$7
(number~) main::toD0181_$8
(byte*) main::toD0181_gfx
(byte) main::toD0181_return
(const byte) main::toD0181_return#0 toD0181_return = >(word)(const byte*) SCREEN#0&(word) $3fff*(byte) 4|>(word)(const byte*) CHARSET#0/(byte) 4&(byte) $f
(byte*) main::toD0181_screen
zp ZP_WORD:2 [ main::clear_char#5 main::clear_char#1 ]
zp ZP_BYTE:4 [ init_screen::y#4 init_screen::y#1 ]
reg byte x [ init_screen::x#2 init_screen::x#1 ]
zp ZP_WORD:5 [ init_screen::screen#2 init_screen::screen#4 init_screen::screen#1 ]
zp ZP_WORD:7 [ atan2_16::yi#3 atan2_16::yi#7 atan2_16::yi#0 atan2_16::yi#11 atan2_16::$2 atan2_16::yi#1 atan2_16::yi#2 ]
zp ZP_WORD:9 [ atan2_16::xi#3 atan2_16::xi#7 atan2_16::xi#0 atan2_16::xi#8 atan2_16::$7 atan2_16::xi#1 atan2_16::xi#2 ]
zp ZP_BYTE:11 [ atan2_16::i#2 atan2_16::i#1 ]
zp ZP_WORD:12 [ atan2_16::angle#6 atan2_16::angle#12 atan2_16::angle#13 atan2_16::angle#2 atan2_16::angle#3 atan2_16::return#0 atan2_16::angle#5 atan2_16::angle#11 atan2_16::angle#1 atan2_16::angle#4 atan2_16::return#2 init_screen::angle_w#0 init_screen::$7 ]
zp ZP_WORD:14 [ init_font_hex::proto_hi#6 init_font_hex::proto_hi#1 ]
zp ZP_BYTE:16 [ init_font_hex::c#6 init_font_hex::c#1 ]
zp ZP_WORD:17 [ init_font_hex::charset#2 init_font_hex::charset#5 init_font_hex::charset#0 ]
zp ZP_WORD:19 [ init_font_hex::proto_lo#4 init_font_hex::proto_lo#1 ]
zp ZP_BYTE:21 [ init_font_hex::c1#4 init_font_hex::c1#1 ]
reg byte x [ init_font_hex::i#2 init_font_hex::i#1 ]
zp ZP_BYTE:22 [ init_font_hex::idx#5 init_font_hex::idx#2 ]
zp ZP_WORD:23 [ init_screen::xw#0 atan2_16::x#0 ]
zp ZP_WORD:25 [ init_screen::yw#0 atan2_16::y#0 ]
reg byte a [ init_screen::ang_w#0 ]
zp ZP_WORD:27 [ atan2_16::xd#0 ]
zp ZP_WORD:29 [ atan2_16::yd#0 ]
reg byte a [ atan2_16::$24 ]
reg byte a [ atan2_16::$23 ]
zp ZP_BYTE:31 [ init_font_hex::$0 ]
reg byte a [ init_font_hex::$1 ]
reg byte a [ init_font_hex::$2 ]
reg byte y [ init_font_hex::idx#3 ]