1
0
mirror of https://gitlab.com/camelot/kickc.git synced 2025-04-08 14:37:40 +00:00

Now both Vogel Sunflower Bobs & Sprites.

This commit is contained in:
jespergravgaard 2019-12-01 14:04:18 +01:00
parent 7aff220a6e
commit caec30ff0b
11 changed files with 14456 additions and 3142 deletions

View File

@ -38,8 +38,13 @@ public class TestPrograms {
}
@Test
public void testPreBob() throws IOException, URISyntaxException {
compileAndCompare("complex/prebob/prebob");
public void testVogelBobs() throws IOException, URISyntaxException {
compileAndCompare("complex/prebob/vogel-bobs");
}
@Test
public void testVogelSprites() throws IOException, URISyntaxException {
compileAndCompare("complex/prebob/vogel-sprites");
}
@Test

View File

@ -57,6 +57,9 @@ const char BOB_SHIFTS_Y = 8;
// The size of a sub-table of BOB_TABLES
const char BOB_SUBTABLE_SIZE = BOB_SHIFTS_X*BOB_SHIFTS_Y;
// The number of BOBs to render
const char NUM_BOBS = 20;
void main() {
mulf_init();
prepareBobs();
@ -80,9 +83,11 @@ void main() {
char angle = 0;
while(true) {
do { } while (*RASTER<$f8);
*BORDERCOL = 0xf;
renderBobCleanup();
signed char r = 30;
char a = angle;
for(char i: 0..25) {
for(char i: 0..NUM_BOBS-1) {
//kickasm {{ .break }}
*BORDERCOL = 1;
int x = mulf8s(r, COS[a]) + 75*0x100;
@ -105,26 +110,33 @@ void main() {
*D018 = toD018(SCREEN_BASIC, CHARSET_BASIC);
}
// Table for getting BOB screen offset from the BOB Y-position
unsigned int[0x20] RENDERBOB_YOFFSET;
// Table used for deleting rendered BOB's. Contains pointers to first char of each BOB.
char*[NUM_BOBS] RENDERBOB_CLEANUP;
// Pointer to the next clean-up to add
char** renderBobCleanupNext;
// *40 Table unsigned int[0x20] MUL40 = { ((unsigned int)i)*40 };
unsigned int[0x20] MUL40;
// Initialize the tables used by renderBob()
void renderBobInit() {
for(char y: 0..0x1f)
RENDERBOB_YOFFSET[y] = ((unsigned int)y)*40;
MUL40[y] = ((unsigned int)y)*40;
for(char i: 0..NUM_BOBS-1)
RENDERBOB_CLEANUP[i] = BOB_SCREEN;
}
// Render a single BOB at a given x/y-position
// X-position is 0-151. Each x-position is 2 pixels wide.
// Y-position is 0-183. Each y-position is 1 pixel high.
void renderBob(char xpos, char ypos) {
char x_char_offset = xpos/BOB_SHIFTS_X;
char y_char_offset = ypos/BOB_SHIFTS_Y;
//unsigned int y_offset = (unsigned int)y_char_offset*40;
unsigned int y_offset = RENDERBOB_YOFFSET[y_char_offset];
unsigned int y_offset = MUL40[y_char_offset];
char* screen = BOB_SCREEN+y_offset+x_char_offset;
char bob_table_idx = (ypos&7)*BOB_SHIFTS_X+(xpos&3);
*renderBobCleanupNext++ = screen;
screen[0] = (BOB_TABLES+0*BOB_SUBTABLE_SIZE)[bob_table_idx];
screen[40] = (BOB_TABLES+1*BOB_SUBTABLE_SIZE)[bob_table_idx];
screen[80] = (BOB_TABLES+2*BOB_SUBTABLE_SIZE)[bob_table_idx];
@ -136,6 +148,24 @@ void renderBob(char xpos, char ypos) {
screen[82] = (BOB_TABLES+8*BOB_SUBTABLE_SIZE)[bob_table_idx];
}
// Clean Up the rendered BOB's
void renderBobCleanup() {
for(char i: 0..NUM_BOBS-1) {
char* screen = RENDERBOB_CLEANUP[i];
screen[0] = 0;
screen[40] = 0;
screen[80] = 0;
screen[1] = 0;
screen[41] = 0;
screen[81] = 0;
screen[2] = 0;
screen[42] = 0;
screen[82] = 0;
}
// Prepare for next clean-up
renderBobCleanupNext = RENDERBOB_CLEANUP;
}
// Creates the pre-shifted bobs into BOB_CHARSET and populates the BOB_TABLES
// Modifies PROTO_BOB by shifting it around
void prepareBobs() {

View File

@ -0,0 +1,105 @@
// Same animation using a multiplexer
import "c64"
import "multiplexer"
import "fastmultiply"
import "string"
import "keyboard"
// The BOB sprite
align(0x1000) char[] SPRITE = kickasm(resource "smiley.png") {{
.var pic = LoadPicture("smiley.png", List().add($000000, $ffffff))
.for (var y=0; y<21; y++)
.for (var x=0;x<3; x++)
.byte pic.getSinglecolorByte(x,y)
}};
// Sine and Cosine tables
// Angles: $00=0, $80=PI,$100=2*PI
// Sine/Cosine: signed fixed [-$7f,$7f]
align(0x40) signed char[0x140] SIN = kickasm {{
.for(var i=0;i<$140;i++)
.byte >round($7fff*sin(i*2*PI/256))
}};
signed char* COS = SIN+0x40; // sin(x) = cos(x+PI/2)
// The BASIC screen
const char* SCREEN = 0x0400;
// The number of BOBs to render
const char NUM_BOBS = 16;
void main() {
asm { sei }
init();
loop();
exit();
asm { cli }
}
// Initialize the program
void init() {
*D011 = VIC_DEN | VIC_RSEL | 3;
// Initialize the multiplexer
plexInit(SCREEN);
// Set the sprite pointers & initial positions
for(char i: 0..PLEX_COUNT-1) {
PLEX_PTR[i] = (char)(SPRITE/0x40);
PLEX_XPOS[i] = 24+i*5;
PLEX_YPOS[i] = 50+i*8;
}
// Enable & initialize sprites
*SPRITES_ENABLE = 0xff;
for(char i: 0..7) {
SPRITES_COLS[i] = GREEN;
}
mulf_init();
// Clear screen
memset(SCREEN, ' ', 1000);
}
// Exit the program
void exit() {
// Wait for space release
while(keyboard_key_pressed(KEY_SPACE)) {}
}
// The main loop
void loop() {
// Render Rotated BOBs
char angle = 0;
while(true) {
do { } while (*RASTER<0xd8);
*BORDERCOL = 0xf;
signed char r = 30;
char a = angle;
for(char i: 0..NUM_BOBS-1) {
//kickasm {{ .break }}
*BORDERCOL = 6;
int x = mulf8s(r, COS[a])*2 + 125*0x100;
PLEX_XPOS[i] = >x;
int y = mulf8s(r, SIN[a])*2 + 125*0x100;
PLEX_YPOS[i] = >y;
a += 98;
r += 3;
}
*BORDERCOL = 3;
plexSort();
angle += 3;
*BORDERCOL = BLACK;
// Sort the sprites by y-position
while((*D011&VIC_RST8)!=0) {}
// Show the sprites
for( char i: 0..PLEX_COUNT-1) {
*BORDERCOL = BLACK;
char rasterY = plexFreeNextYpos();
while(*RASTER<rasterY) {}
(*BORDERCOL)++;
plexShowSprite();
}
*BORDERCOL = BLACK;
if(keyboard_key_pressed(KEY_SPACE)) {
break;
}
}
}

View File

@ -28,13 +28,19 @@
.const BOB_SHIFTS_Y = 8
// The size of a sub-table of BOB_TABLES
.const BOB_SUBTABLE_SIZE = BOB_SHIFTS_X*BOB_SHIFTS_Y
// The number of BOBs to render
.const NUM_BOBS = $14
.const SIZEOF_POINTER = 2
.label COS = SIN+$40
// BOB charset ID of the next glyph to be added
.label bob_charset_next_id = $f
// Current index within the progress cursor (0-7)
.label progress_idx = 3
// Current position of the progress cursor
.label progress_cursor = 6
.label progress_cursor = $c
// Pointer to the next clean-up to add
// Prepare for next clean-up
.label renderBobCleanupNext = 6
// Constants for KickAsm Vogel Sunflower
.const PHI = (1+sqrt(5))/2
@ -44,11 +50,11 @@ main: {
.const vicSelectGfxBank2_toDd001_return = 3
.const toD0181_return = (>(BOB_SCREEN&$3fff)*4)|(>BOB_CHARSET)/4&$f
.const toD0182_return = (>(SCREEN_BASIC&$3fff)*4)|(>CHARSET_BASIC)/4&$f
.label __9 = 6
.label __11 = 6
.label __12 = 6
.label x = $b
.label y = 6
.label __10 = $c
.label __12 = $c
.label __13 = $c
.label x = 9
.label y = $c
.label a = 4
.label r = 3
.label i = 5
@ -70,10 +76,17 @@ main: {
lda RASTER
cmp #$f8
bcc __b2
lda #$f
sta BORDERCOL
jsr renderBobCleanup
lda.z angle
sta.z a
lda #0
sta.z i
lda #<RENDERBOB_CLEANUP
sta.z renderBobCleanupNext
lda #>RENDERBOB_CLEANUP
sta.z renderBobCleanupNext+1
lda #$1e
sta.z r
__b4:
@ -84,19 +97,19 @@ main: {
ldy.z a
ldx COS,y
jsr mulf8s
lda.z __9
lda.z __10
clc
adc #<$4b*$100
sta.z x
lda.z __9+1
lda.z __10+1
adc #>$4b*$100
sta.z x+1
lda.z r
ldy.z a
ldx SIN,y
jsr mulf8s
asl.z __12
rol.z __12+1
asl.z __13
rol.z __13+1
clc
lda.z y
adc #<$5a*$100
@ -118,7 +131,7 @@ main: {
tax
jsr renderBob
inc.z i
lda #$1a
lda #NUM_BOBS-1+1
cmp.z i
bne __b4
lax.z angle
@ -171,12 +184,12 @@ keyboard_matrix_read: {
// Y-position is 0-183. Each y-position is 1 pixel high.
// renderBob(byte zeropage($f) xpos, byte register(X) ypos)
renderBob: {
.label __2 = $10
.label __2 = $c
.label __5 = $e
.label xpos = $f
.label x_char_offset = $d
.label y_offset = $10
.label screen = $10
.label x_char_offset = $b
.label y_offset = $c
.label screen = $c
lda.z xpos
lsr
lsr
@ -186,11 +199,10 @@ renderBob: {
lsr
lsr
asl
//unsigned int y_offset = (unsigned int)y_char_offset*40;
tay
lda RENDERBOB_YOFFSET,y
lda MUL40,y
sta.z y_offset
lda RENDERBOB_YOFFSET+1,y
lda MUL40+1,y
sta.z y_offset+1
clc
lda.z __2
@ -216,6 +228,19 @@ renderBob: {
clc
adc.z __5
tax
ldy #0
lda.z screen
sta (renderBobCleanupNext),y
iny
lda.z screen+1
sta (renderBobCleanupNext),y
lda #SIZEOF_POINTER
clc
adc.z renderBobCleanupNext
sta.z renderBobCleanupNext
bcc !+
inc.z renderBobCleanupNext+1
!:
lda BOB_TABLES,x
ldy #0
sta (screen),y
@ -248,7 +273,7 @@ renderBob: {
// Fast multiply two signed bytes to a word result
// mulf8s(signed byte register(A) a, signed byte register(X) b)
mulf8s: {
.label return = 6
.label return = $c
jsr mulf8u_prepare
stx.z mulf8s_prepared.b
jsr mulf8s_prepared
@ -259,7 +284,7 @@ mulf8s: {
// mulf8s_prepared(signed byte zeropage($f) b)
mulf8s_prepared: {
.label memA = $fd
.label m = 6
.label m = $c
.label b = $f
lda.z b
jsr mulf8u_prepared
@ -287,7 +312,7 @@ mulf8s_prepared: {
mulf8u_prepared: {
.label resL = $fe
.label memB = $ff
.label return = 6
.label return = $c
sta memB
tax
sec
@ -319,6 +344,42 @@ mulf8u_prepare: {
sta mulf8u_prepared.sm4+1
rts
}
// Clean Up the rendered BOB's
renderBobCleanup: {
.label screen = $10
ldx #0
__b1:
txa
asl
tay
lda RENDERBOB_CLEANUP,y
sta.z screen
lda RENDERBOB_CLEANUP+1,y
sta.z screen+1
lda #0
tay
sta (screen),y
ldy #$28
sta (screen),y
ldy #$50
sta (screen),y
ldy #1
sta (screen),y
ldy #$29
sta (screen),y
ldy #$51
sta (screen),y
ldy #2
sta (screen),y
ldy #$2a
sta (screen),y
ldy #$52
sta (screen),y
inx
cpx #NUM_BOBS-1+1
bne __b1
rts
}
// Copies the character c (an unsigned char) to the first num characters of the object pointed to by the argument str.
memset: {
.label str = BOB_SCREEN
@ -352,8 +413,8 @@ memset: {
renderBobInit: {
.label __0 = $10
.label __1 = $10
.label __4 = $12
.label __5 = $10
.label __6 = $12
.label __7 = $10
ldx #0
__b1:
txa
@ -362,19 +423,19 @@ renderBobInit: {
sta.z __0+1
lda.z __0
asl
sta.z __4
sta.z __6
lda.z __0+1
rol
sta.z __4+1
asl.z __4
rol.z __4+1
lda.z __5
sta.z __6+1
asl.z __6
rol.z __6+1
lda.z __7
clc
adc.z __4
sta.z __5
lda.z __5+1
adc.z __4+1
sta.z __5+1
adc.z __6
sta.z __7
lda.z __7+1
adc.z __6+1
sta.z __7+1
asl.z __1
rol.z __1+1
asl.z __1
@ -385,22 +446,34 @@ renderBobInit: {
asl
tay
lda.z __1
sta RENDERBOB_YOFFSET,y
sta MUL40,y
lda.z __1+1
sta RENDERBOB_YOFFSET+1,y
sta MUL40+1,y
inx
cpx #$20
bne __b1
ldx #0
__b2:
txa
asl
tay
lda #<BOB_SCREEN
sta RENDERBOB_CLEANUP,y
lda #>BOB_SCREEN
sta RENDERBOB_CLEANUP+1,y
inx
cpx #NUM_BOBS-1+1
bne __b2
rts
}
// Creates the pre-shifted bobs into BOB_CHARSET and populates the BOB_TABLES
// Modifies PROTO_BOB by shifting it around
prepareBobs: {
.label bob_table = $12
.label bob_table = $10
.label shift_y = 2
// Populate charset and tables
.label bob_glyph = $10
.label cell = $d
.label bob_glyph = 6
.label cell = $b
.label bob_table_idx = 4
.label shift_x = 5
jsr progress_init
@ -512,12 +585,12 @@ progress_inc: {
// Looks through BOB_CHARSET to find the passed bob glyph if present.
// If not present it is added
// Returns the glyph ID
// bobCharsetFindOrAddGlyph(byte* zeropage($10) bob_glyph)
// bobCharsetFindOrAddGlyph(byte* zeropage(6) bob_glyph)
bobCharsetFindOrAddGlyph: {
.label bob_glyph = $10
.label i = $a
.label bob_glyph = 6
.label i = 8
.label glyph_id = $e
.label glyph_cursor = 8
.label glyph_cursor = $12
lda #<BOB_CHARSET
sta.z glyph_cursor
lda #>BOB_CHARSET
@ -580,7 +653,7 @@ bobCharsetFindOrAddGlyph: {
// Shift PROTO_BOB right one X pixel
shiftProtoBobRight: {
.label carry = $e
.label i = $d
.label i = $b
ldy #0
ldx #0
txa
@ -655,13 +728,13 @@ mulf_init: {
// Counter used for determining x%2==0
.label sqr1_hi = $10
// Fill mulf_sqr1 = f(x) = int(x*x/4): If f(x) = x*x/4 then f(x+1) = f(x) + x/2 + 1/4
.label sqr = $b
.label sqr = $c
.label sqr1_lo = 6
// Decrease or increase x_255 - initially we decrease
.label sqr2_hi = 8
.label sqr2_hi = 9
.label sqr2_lo = $12
//Start with g(0)=f(255)
.label dir = $a
.label dir = 8
ldx #0
lda #<mulf_sqr1_hi+1
sta.z sqr1_hi
@ -803,5 +876,7 @@ SIN:
// Tables containing the char to use for a specific cell of a shifted BOB.
// char_id = BOB_TABLES[cell*BOB_SUBTABLE_SIZE + shift_y*BOB_SHIFTS_X + shift_x];
BOB_TABLES: .fill 9*8*4, 0
// Table for getting BOB screen offset from the BOB Y-position
RENDERBOB_YOFFSET: .fill 2*$20, 0
// Table used for deleting rendered BOB's. Contains pointers to first char of each BOB.
RENDERBOB_CLEANUP: .fill 2*NUM_BOBS, 0
// *40 Table unsigned int[0x20] MUL40 = { ((unsigned int)i)*40 };
MUL40: .fill 2*$20, 0

View File

@ -42,503 +42,541 @@ main::@7: scope:[main] from main::toD0181
[15] *((const byte*) D018) ← (const byte) main::toD0181_return#0
[16] call memset
to:main::@1
main::@1: scope:[main] from main::@14 main::@7
[17] (byte) main::angle#6 ← phi( main::@7/(byte) 0 main::@14/(byte) main::angle#1 )
main::@1: scope:[main] from main::@15 main::@7
[17] (byte) main::angle#8 ← phi( main::@7/(byte) 0 main::@15/(byte) main::angle#1 )
to:main::@2
main::@2: scope:[main] from main::@1 main::@2
[18] if(*((const byte*) RASTER)<(byte) $f8) goto main::@2
to:main::@3
main::@3: scope:[main] from main::@2
[19] (byte) main::a#7 ← (byte) main::angle#6
to:main::@4
main::@4: scope:[main] from main::@13 main::@3
[20] (byte) main::i#2 ← phi( main::@13/(byte) main::i#1 main::@3/(byte) 0 )
[20] (byte) main::a#2 ← phi( main::@13/(byte) main::a#1 main::@3/(byte) main::a#7 )
[20] (signed byte) main::r#2 ← phi( main::@13/(signed byte) main::r#1 main::@3/(signed byte) $1e )
[21] *((const byte*) BORDERCOL) ← (byte) 1
[22] (signed byte) mulf8s::a#0 ← (signed byte) main::r#2
[23] (signed byte) mulf8s::b#0 ← *((const signed byte*) COS + (byte) main::a#2)
[24] call mulf8s
[25] (signed word) mulf8s::return#2 ← (signed word) mulf8s::return#0
[19] *((const byte*) BORDERCOL) ← (byte) $f
[20] call renderBobCleanup
to:main::@11
main::@11: scope:[main] from main::@4
[26] (signed word~) main::$9 ← (signed word) mulf8s::return#2
[27] (signed word) main::x#0 ← (signed word~) main::$9 + (signed word)(number) $4b*(number) $100
[28] (signed byte) mulf8s::a#1 ← (signed byte) main::r#2
[29] (signed byte) mulf8s::b#1 ← *((const signed byte*) SIN + (byte) main::a#2)
[30] call mulf8s
[31] (signed word) mulf8s::return#3 ← (signed word) mulf8s::return#0
main::@11: scope:[main] from main::@3
[21] (byte) main::a#6 ← (byte) main::angle#8
to:main::@4
main::@4: scope:[main] from main::@11 main::@14
[22] (byte) main::i#2 ← phi( main::@11/(byte) 0 main::@14/(byte) main::i#1 )
[22] (byte**) renderBobCleanupNext#17 ← phi( main::@11/(const byte**) RENDERBOB_CLEANUP main::@14/(byte**) renderBobCleanupNext#13 )
[22] (byte) main::a#2 ← phi( main::@11/(byte) main::a#6 main::@14/(byte) main::a#1 )
[22] (signed byte) main::r#2 ← phi( main::@11/(signed byte) $1e main::@14/(signed byte) main::r#1 )
[23] *((const byte*) BORDERCOL) ← (byte) 1
[24] (signed byte) mulf8s::a#0 ← (signed byte) main::r#2
[25] (signed byte) mulf8s::b#0 ← *((const signed byte*) COS + (byte) main::a#2)
[26] call mulf8s
[27] (signed word) mulf8s::return#2 ← (signed word) mulf8s::return#0
to:main::@12
main::@12: scope:[main] from main::@11
[32] (signed word~) main::$11 ← (signed word) mulf8s::return#3
[33] (signed word~) main::$12 ← (signed word~) main::$11 << (byte) 1
[34] (signed word) main::y#0 ← (signed word~) main::$12 + (signed word)(number) $5a*(number) $100
[35] *((const byte*) BORDERCOL) ← (byte) 2
[36] (byte) main::a#1 ← (byte) main::a#2 + (byte) $62
[37] (signed byte) main::r#1 ← (signed byte) main::r#2 + (signed byte) 3
[38] (byte) renderBob::xpos#0 ← > (signed word) main::x#0
[39] (byte) renderBob::ypos#0 ← > (signed word) main::y#0
[40] call renderBob
main::@12: scope:[main] from main::@4
[28] (signed word~) main::$10 ← (signed word) mulf8s::return#2
[29] (signed word) main::x#0 ← (signed word~) main::$10 + (signed word)(number) $4b*(number) $100
[30] (signed byte) mulf8s::a#1 ← (signed byte) main::r#2
[31] (signed byte) mulf8s::b#1 ← *((const signed byte*) SIN + (byte) main::a#2)
[32] call mulf8s
[33] (signed word) mulf8s::return#3 ← (signed word) mulf8s::return#0
to:main::@13
main::@13: scope:[main] from main::@12
[41] (byte) main::i#1 ← ++ (byte) main::i#2
[42] if((byte) main::i#1!=(byte) $1a) goto main::@4
to:main::@5
main::@5: scope:[main] from main::@13
[43] (byte) main::angle#1 ← (byte) main::angle#6 + (byte) 3
[44] *((const byte*) BORDERCOL) ← (byte) 0
[45] call keyboard_key_pressed
[46] (byte) keyboard_key_pressed::return#2 ← (byte) keyboard_key_pressed::return#0
[34] (signed word~) main::$12 ← (signed word) mulf8s::return#3
[35] (signed word~) main::$13 ← (signed word~) main::$12 << (byte) 1
[36] (signed word) main::y#0 ← (signed word~) main::$13 + (signed word)(number) $5a*(number) $100
[37] *((const byte*) BORDERCOL) ← (byte) 2
[38] (byte) main::a#1 ← (byte) main::a#2 + (byte) $62
[39] (signed byte) main::r#1 ← (signed byte) main::r#2 + (signed byte) 3
[40] (byte) renderBob::xpos#0 ← > (signed word) main::x#0
[41] (byte) renderBob::ypos#0 ← > (signed word) main::y#0
[42] call renderBob
to:main::@14
main::@14: scope:[main] from main::@5
[47] (byte~) main::$18 ← (byte) keyboard_key_pressed::return#2
[48] if((byte) 0!=(byte~) main::$18) goto main::@6
to:main::@1
main::@6: scope:[main] from main::@14 main::@15
[49] phi()
[50] call keyboard_key_pressed
[51] (byte) keyboard_key_pressed::return#3 ← (byte) keyboard_key_pressed::return#0
main::@14: scope:[main] from main::@13
[43] (byte) main::i#1 ← ++ (byte) main::i#2
[44] if((byte) main::i#1!=(const byte) NUM_BOBS-(byte) 1+(byte) 1) goto main::@4
to:main::@5
main::@5: scope:[main] from main::@14
[45] (byte) main::angle#1 ← (byte) main::angle#8 + (byte) 3
[46] *((const byte*) BORDERCOL) ← (byte) 0
[47] call keyboard_key_pressed
[48] (byte) keyboard_key_pressed::return#2 ← (byte) keyboard_key_pressed::return#0
to:main::@15
main::@15: scope:[main] from main::@6
[52] (byte~) main::$20 ← (byte) keyboard_key_pressed::return#3
[53] if((byte) 0!=(byte~) main::$20) goto main::@6
main::@15: scope:[main] from main::@5
[49] (byte~) main::$19 ← (byte) keyboard_key_pressed::return#2
[50] if((byte) 0!=(byte~) main::$19) goto main::@6
to:main::@1
main::@6: scope:[main] from main::@15 main::@16
[51] phi()
[52] call keyboard_key_pressed
[53] (byte) keyboard_key_pressed::return#3 ← (byte) keyboard_key_pressed::return#0
to:main::@16
main::@16: scope:[main] from main::@6
[54] (byte~) main::$21 ← (byte) keyboard_key_pressed::return#3
[55] if((byte) 0!=(byte~) main::$21) goto main::@6
to:main::vicSelectGfxBank2
main::vicSelectGfxBank2: scope:[main] from main::@15
[54] *((const byte*) CIA2_PORT_A_DDR) ← (byte) 3
main::vicSelectGfxBank2: scope:[main] from main::@16
[56] *((const byte*) CIA2_PORT_A_DDR) ← (byte) 3
to:main::vicSelectGfxBank2_toDd001
main::vicSelectGfxBank2_toDd001: scope:[main] from main::vicSelectGfxBank2
[55] phi()
[57] phi()
to:main::vicSelectGfxBank2_@1
main::vicSelectGfxBank2_@1: scope:[main] from main::vicSelectGfxBank2_toDd001
[56] *((const byte*) CIA2_PORT_A) ← (const byte) main::vicSelectGfxBank2_toDd001_return#0
[58] *((const byte*) CIA2_PORT_A) ← (const byte) main::vicSelectGfxBank2_toDd001_return#0
to:main::toD0182
main::toD0182: scope:[main] from main::vicSelectGfxBank2_@1
[57] phi()
[59] phi()
to:main::@8
main::@8: scope:[main] from main::toD0182
[58] *((const byte*) D018) ← (const byte) main::toD0182_return#0
[60] *((const byte*) D018) ← (const byte) main::toD0182_return#0
to:main::@return
main::@return: scope:[main] from main::@8
[59] return
[61] return
to:@return
(byte()) keyboard_key_pressed((byte) keyboard_key_pressed::key)
keyboard_key_pressed: scope:[keyboard_key_pressed] from main::@5 main::@6
[60] phi()
[61] call keyboard_matrix_read
[62] (byte) keyboard_matrix_read::return#2 ← (byte) keyboard_matrix_read::return#0
[62] phi()
[63] call keyboard_matrix_read
[64] (byte) keyboard_matrix_read::return#2 ← (byte) keyboard_matrix_read::return#0
to:keyboard_key_pressed::@1
keyboard_key_pressed::@1: scope:[keyboard_key_pressed] from keyboard_key_pressed
[63] (byte~) keyboard_key_pressed::$2 ← (byte) keyboard_matrix_read::return#2
[64] (byte) keyboard_key_pressed::return#0 ← (byte~) keyboard_key_pressed::$2 & *((const byte*) keyboard_matrix_col_bitmask+(const byte) keyboard_key_pressed::colidx#0)
[65] (byte~) keyboard_key_pressed::$2 ← (byte) keyboard_matrix_read::return#2
[66] (byte) keyboard_key_pressed::return#0 ← (byte~) keyboard_key_pressed::$2 & *((const byte*) keyboard_matrix_col_bitmask+(const byte) keyboard_key_pressed::colidx#0)
to:keyboard_key_pressed::@return
keyboard_key_pressed::@return: scope:[keyboard_key_pressed] from keyboard_key_pressed::@1
[65] return
[67] return
to:@return
(byte()) keyboard_matrix_read((byte) keyboard_matrix_read::rowid)
keyboard_matrix_read: scope:[keyboard_matrix_read] from keyboard_key_pressed
[66] *((const byte*) CIA1_PORT_A) ← *((const byte*) keyboard_matrix_row_bitmask+(const byte) keyboard_key_pressed::rowidx#0)
[67] (byte) keyboard_matrix_read::return#0 ← ~ *((const byte*) CIA1_PORT_B)
[68] *((const byte*) CIA1_PORT_A) ← *((const byte*) keyboard_matrix_row_bitmask+(const byte) keyboard_key_pressed::rowidx#0)
[69] (byte) keyboard_matrix_read::return#0 ← ~ *((const byte*) CIA1_PORT_B)
to:keyboard_matrix_read::@return
keyboard_matrix_read::@return: scope:[keyboard_matrix_read] from keyboard_matrix_read
[68] return
[70] return
to:@return
(void()) renderBob((byte) renderBob::xpos , (byte) renderBob::ypos)
renderBob: scope:[renderBob] from main::@12
[69] (byte) renderBob::x_char_offset#0 ← (byte) renderBob::xpos#0 >> (byte) 2
[70] (byte) renderBob::y_char_offset#0 ← (byte) renderBob::ypos#0 >> (byte) 3
[71] (byte~) renderBob::$8 ← (byte) renderBob::y_char_offset#0 << (byte) 1
[72] (word) renderBob::y_offset#0 ← *((const word*) RENDERBOB_YOFFSET + (byte~) renderBob::$8)
[73] (byte*~) renderBob::$2 ← (const byte*) BOB_SCREEN + (word) renderBob::y_offset#0
[74] (byte*) renderBob::screen#0 ← (byte*~) renderBob::$2 + (byte) renderBob::x_char_offset#0
[75] (byte~) renderBob::$4 ← (byte) renderBob::ypos#0 & (byte) 7
[76] (byte~) renderBob::$5 ← (byte~) renderBob::$4 << (byte) 2
[77] (byte~) renderBob::$6 ← (byte) renderBob::xpos#0 & (byte) 3
[78] (byte) renderBob::bob_table_idx#0 ← (byte~) renderBob::$5 + (byte~) renderBob::$6
[79] *((byte*) renderBob::screen#0) ← *((const byte*) BOB_TABLES + (byte) renderBob::bob_table_idx#0)
[80] *((byte*) renderBob::screen#0 + (byte) $28) ← *((const byte*) BOB_TABLES+(byte) 1*(const byte) BOB_SUBTABLE_SIZE + (byte) renderBob::bob_table_idx#0)
[81] *((byte*) renderBob::screen#0 + (byte) $50) ← *((const byte*) BOB_TABLES+(byte) 2*(const byte) BOB_SUBTABLE_SIZE + (byte) renderBob::bob_table_idx#0)
[82] *((byte*) renderBob::screen#0 + (byte) 1) ← *((const byte*) BOB_TABLES+(byte) 3*(const byte) BOB_SUBTABLE_SIZE + (byte) renderBob::bob_table_idx#0)
[83] *((byte*) renderBob::screen#0 + (byte) $29) ← *((const byte*) BOB_TABLES+(byte) 4*(const byte) BOB_SUBTABLE_SIZE + (byte) renderBob::bob_table_idx#0)
[84] *((byte*) renderBob::screen#0 + (byte) $51) ← *((const byte*) BOB_TABLES+(byte) 5*(const byte) BOB_SUBTABLE_SIZE + (byte) renderBob::bob_table_idx#0)
[85] *((byte*) renderBob::screen#0 + (byte) 2) ← *((const byte*) BOB_TABLES+(byte) 6*(const byte) BOB_SUBTABLE_SIZE + (byte) renderBob::bob_table_idx#0)
[86] *((byte*) renderBob::screen#0 + (byte) $2a) ← *((const byte*) BOB_TABLES+(byte) 7*(const byte) BOB_SUBTABLE_SIZE + (byte) renderBob::bob_table_idx#0)
[87] *((byte*) renderBob::screen#0 + (byte) $52) ← *((const byte*) BOB_TABLES+(byte) 8*(const byte) BOB_SUBTABLE_SIZE + (byte) renderBob::bob_table_idx#0)
renderBob: scope:[renderBob] from main::@13
[71] (byte) renderBob::x_char_offset#0 ← (byte) renderBob::xpos#0 >> (byte) 2
[72] (byte) renderBob::y_char_offset#0 ← (byte) renderBob::ypos#0 >> (byte) 3
[73] (byte~) renderBob::$8 ← (byte) renderBob::y_char_offset#0 << (byte) 1
[74] (word) renderBob::y_offset#0 ← *((const word*) MUL40 + (byte~) renderBob::$8)
[75] (byte*~) renderBob::$2 ← (const byte*) BOB_SCREEN + (word) renderBob::y_offset#0
[76] (byte*) renderBob::screen#0 ← (byte*~) renderBob::$2 + (byte) renderBob::x_char_offset#0
[77] (byte~) renderBob::$4 ← (byte) renderBob::ypos#0 & (byte) 7
[78] (byte~) renderBob::$5 ← (byte~) renderBob::$4 << (byte) 2
[79] (byte~) renderBob::$6 ← (byte) renderBob::xpos#0 & (byte) 3
[80] (byte) renderBob::bob_table_idx#0 ← (byte~) renderBob::$5 + (byte~) renderBob::$6
[81] *((byte**) renderBobCleanupNext#17) ← (byte*) renderBob::screen#0
[82] (byte**) renderBobCleanupNext#13 ← (byte**) renderBobCleanupNext#17 + (const byte) SIZEOF_POINTER
[83] *((byte*) renderBob::screen#0) ← *((const byte*) BOB_TABLES + (byte) renderBob::bob_table_idx#0)
[84] *((byte*) renderBob::screen#0 + (byte) $28) ← *((const byte*) BOB_TABLES+(byte) 1*(const byte) BOB_SUBTABLE_SIZE + (byte) renderBob::bob_table_idx#0)
[85] *((byte*) renderBob::screen#0 + (byte) $50) ← *((const byte*) BOB_TABLES+(byte) 2*(const byte) BOB_SUBTABLE_SIZE + (byte) renderBob::bob_table_idx#0)
[86] *((byte*) renderBob::screen#0 + (byte) 1) ← *((const byte*) BOB_TABLES+(byte) 3*(const byte) BOB_SUBTABLE_SIZE + (byte) renderBob::bob_table_idx#0)
[87] *((byte*) renderBob::screen#0 + (byte) $29) ← *((const byte*) BOB_TABLES+(byte) 4*(const byte) BOB_SUBTABLE_SIZE + (byte) renderBob::bob_table_idx#0)
[88] *((byte*) renderBob::screen#0 + (byte) $51) ← *((const byte*) BOB_TABLES+(byte) 5*(const byte) BOB_SUBTABLE_SIZE + (byte) renderBob::bob_table_idx#0)
[89] *((byte*) renderBob::screen#0 + (byte) 2) ← *((const byte*) BOB_TABLES+(byte) 6*(const byte) BOB_SUBTABLE_SIZE + (byte) renderBob::bob_table_idx#0)
[90] *((byte*) renderBob::screen#0 + (byte) $2a) ← *((const byte*) BOB_TABLES+(byte) 7*(const byte) BOB_SUBTABLE_SIZE + (byte) renderBob::bob_table_idx#0)
[91] *((byte*) renderBob::screen#0 + (byte) $52) ← *((const byte*) BOB_TABLES+(byte) 8*(const byte) BOB_SUBTABLE_SIZE + (byte) renderBob::bob_table_idx#0)
to:renderBob::@return
renderBob::@return: scope:[renderBob] from renderBob
[88] return
[92] return
to:@return
(signed word()) mulf8s((signed byte) mulf8s::a , (signed byte) mulf8s::b)
mulf8s: scope:[mulf8s] from main::@11 main::@4
[89] (signed byte) mulf8s::b#2 ← phi( main::@11/(signed byte) mulf8s::b#1 main::@4/(signed byte) mulf8s::b#0 )
[89] (signed byte) mulf8s::mulf8s_prepare1_a#0 ← phi( main::@11/(signed byte) mulf8s::a#1 main::@4/(signed byte) mulf8s::a#0 )
mulf8s: scope:[mulf8s] from main::@12 main::@4
[93] (signed byte) mulf8s::b#2 ← phi( main::@12/(signed byte) mulf8s::b#1 main::@4/(signed byte) mulf8s::b#0 )
[93] (signed byte) mulf8s::mulf8s_prepare1_a#0 ← phi( main::@12/(signed byte) mulf8s::a#1 main::@4/(signed byte) mulf8s::a#0 )
to:mulf8s::mulf8s_prepare1
mulf8s::mulf8s_prepare1: scope:[mulf8s] from mulf8s
[90] (byte) mulf8u_prepare::a#0 ← (byte)(signed byte) mulf8s::mulf8s_prepare1_a#0
[91] call mulf8u_prepare
[94] (byte) mulf8u_prepare::a#0 ← (byte)(signed byte) mulf8s::mulf8s_prepare1_a#0
[95] call mulf8u_prepare
to:mulf8s::@1
mulf8s::@1: scope:[mulf8s] from mulf8s::mulf8s_prepare1
[92] (signed byte) mulf8s_prepared::b#0 ← (signed byte) mulf8s::b#2
[93] call mulf8s_prepared
[96] (signed byte) mulf8s_prepared::b#0 ← (signed byte) mulf8s::b#2
[97] call mulf8s_prepared
to:mulf8s::@2
mulf8s::@2: scope:[mulf8s] from mulf8s::@1
[94] (signed word) mulf8s::return#0 ← (signed word)(word) mulf8s_prepared::m#4
[98] (signed word) mulf8s::return#0 ← (signed word)(word) mulf8s_prepared::m#4
to:mulf8s::@return
mulf8s::@return: scope:[mulf8s] from mulf8s::@2
[95] return
[99] return
to:@return
(signed word()) mulf8s_prepared((signed byte) mulf8s_prepared::b)
mulf8s_prepared: scope:[mulf8s_prepared] from mulf8s::@1
[96] (byte) mulf8u_prepared::b#0 ← (byte)(signed byte) mulf8s_prepared::b#0
[97] call mulf8u_prepared
[98] (word) mulf8u_prepared::return#2 ← (word) mulf8u_prepared::return#0
[100] (byte) mulf8u_prepared::b#0 ← (byte)(signed byte) mulf8s_prepared::b#0
[101] call mulf8u_prepared
[102] (word) mulf8u_prepared::return#2 ← (word) mulf8u_prepared::return#0
to:mulf8s_prepared::@5
mulf8s_prepared::@5: scope:[mulf8s_prepared] from mulf8s_prepared
[99] (word) mulf8s_prepared::m#0 ← (word) mulf8u_prepared::return#2
[100] if(*((const signed byte*) mulf8s_prepared::memA)>=(signed byte) 0) goto mulf8s_prepared::@1
[103] (word) mulf8s_prepared::m#0 ← (word) mulf8u_prepared::return#2
[104] if(*((const signed byte*) mulf8s_prepared::memA)>=(signed byte) 0) goto mulf8s_prepared::@1
to:mulf8s_prepared::@3
mulf8s_prepared::@3: scope:[mulf8s_prepared] from mulf8s_prepared::@5
[101] (byte~) mulf8s_prepared::$8 ← > (word) mulf8s_prepared::m#0
[102] (byte~) mulf8s_prepared::$15 ← (byte~) mulf8s_prepared::$8 - (byte)(signed byte) mulf8s_prepared::b#0
[103] (word) mulf8s_prepared::m#1 ← (word) mulf8s_prepared::m#0 hi= (byte~) mulf8s_prepared::$15
[105] (byte~) mulf8s_prepared::$8 ← > (word) mulf8s_prepared::m#0
[106] (byte~) mulf8s_prepared::$15 ← (byte~) mulf8s_prepared::$8 - (byte)(signed byte) mulf8s_prepared::b#0
[107] (word) mulf8s_prepared::m#1 ← (word) mulf8s_prepared::m#0 hi= (byte~) mulf8s_prepared::$15
to:mulf8s_prepared::@1
mulf8s_prepared::@1: scope:[mulf8s_prepared] from mulf8s_prepared::@3 mulf8s_prepared::@5
[104] (word) mulf8s_prepared::m#5 ← phi( mulf8s_prepared::@3/(word) mulf8s_prepared::m#1 mulf8s_prepared::@5/(word) mulf8s_prepared::m#0 )
[105] if((signed byte) mulf8s_prepared::b#0>=(signed byte) 0) goto mulf8s_prepared::@2
[108] (word) mulf8s_prepared::m#5 ← phi( mulf8s_prepared::@3/(word) mulf8s_prepared::m#1 mulf8s_prepared::@5/(word) mulf8s_prepared::m#0 )
[109] if((signed byte) mulf8s_prepared::b#0>=(signed byte) 0) goto mulf8s_prepared::@2
to:mulf8s_prepared::@4
mulf8s_prepared::@4: scope:[mulf8s_prepared] from mulf8s_prepared::@1
[106] (byte~) mulf8s_prepared::$12 ← > (word) mulf8s_prepared::m#5
[107] (byte~) mulf8s_prepared::$16 ← (byte~) mulf8s_prepared::$12 - (byte)*((const signed byte*) mulf8s_prepared::memA)
[108] (word) mulf8s_prepared::m#2 ← (word) mulf8s_prepared::m#5 hi= (byte~) mulf8s_prepared::$16
[110] (byte~) mulf8s_prepared::$12 ← > (word) mulf8s_prepared::m#5
[111] (byte~) mulf8s_prepared::$16 ← (byte~) mulf8s_prepared::$12 - (byte)*((const signed byte*) mulf8s_prepared::memA)
[112] (word) mulf8s_prepared::m#2 ← (word) mulf8s_prepared::m#5 hi= (byte~) mulf8s_prepared::$16
to:mulf8s_prepared::@2
mulf8s_prepared::@2: scope:[mulf8s_prepared] from mulf8s_prepared::@1 mulf8s_prepared::@4
[109] (word) mulf8s_prepared::m#4 ← phi( mulf8s_prepared::@1/(word) mulf8s_prepared::m#5 mulf8s_prepared::@4/(word) mulf8s_prepared::m#2 )
[113] (word) mulf8s_prepared::m#4 ← phi( mulf8s_prepared::@1/(word) mulf8s_prepared::m#5 mulf8s_prepared::@4/(word) mulf8s_prepared::m#2 )
to:mulf8s_prepared::@return
mulf8s_prepared::@return: scope:[mulf8s_prepared] from mulf8s_prepared::@2
[110] return
[114] return
to:@return
(word()) mulf8u_prepared((byte) mulf8u_prepared::b)
mulf8u_prepared: scope:[mulf8u_prepared] from mulf8s_prepared
[111] *((const byte*) mulf8u_prepared::memB) ← (byte) mulf8u_prepared::b#0
[115] *((const byte*) mulf8u_prepared::memB) ← (byte) mulf8u_prepared::b#0
asm { ldxmemB sec sm1: ldamulf_sqr1_lo,x sm2: sbcmulf_sqr2_lo,x staresL sm3: ldamulf_sqr1_hi,x sm4: sbcmulf_sqr2_hi,x stamemB }
[113] (word) mulf8u_prepared::return#0 ← *((const byte*) mulf8u_prepared::memB) w= *((const byte*) mulf8u_prepared::resL)
[117] (word) mulf8u_prepared::return#0 ← *((const byte*) mulf8u_prepared::memB) w= *((const byte*) mulf8u_prepared::resL)
to:mulf8u_prepared::@return
mulf8u_prepared::@return: scope:[mulf8u_prepared] from mulf8u_prepared
[114] return
[118] return
to:@return
(void()) mulf8u_prepare((byte) mulf8u_prepare::a)
mulf8u_prepare: scope:[mulf8u_prepare] from mulf8s::mulf8s_prepare1
[115] *((const byte*) mulf8u_prepare::memA) ← (byte) mulf8u_prepare::a#0
[119] *((const byte*) mulf8u_prepare::memA) ← (byte) mulf8u_prepare::a#0
asm { ldamemA stamulf8u_prepared.sm1+1 stamulf8u_prepared.sm3+1 eor#$ff stamulf8u_prepared.sm2+1 stamulf8u_prepared.sm4+1 }
to:mulf8u_prepare::@return
mulf8u_prepare::@return: scope:[mulf8u_prepare] from mulf8u_prepare
[117] return
[121] return
to:@return
(void()) renderBobCleanup()
renderBobCleanup: scope:[renderBobCleanup] from main::@3
[122] phi()
to:renderBobCleanup::@1
renderBobCleanup::@1: scope:[renderBobCleanup] from renderBobCleanup renderBobCleanup::@1
[123] (byte) renderBobCleanup::i#2 ← phi( renderBobCleanup/(byte) 0 renderBobCleanup::@1/(byte) renderBobCleanup::i#1 )
[124] (byte~) renderBobCleanup::$1 ← (byte) renderBobCleanup::i#2 << (byte) 1
[125] (byte*) renderBobCleanup::screen#0 ← *((const byte**) RENDERBOB_CLEANUP + (byte~) renderBobCleanup::$1)
[126] *((byte*) renderBobCleanup::screen#0) ← (byte) 0
[127] *((byte*) renderBobCleanup::screen#0 + (byte) $28) ← (byte) 0
[128] *((byte*) renderBobCleanup::screen#0 + (byte) $50) ← (byte) 0
[129] *((byte*) renderBobCleanup::screen#0 + (byte) 1) ← (byte) 0
[130] *((byte*) renderBobCleanup::screen#0 + (byte) $29) ← (byte) 0
[131] *((byte*) renderBobCleanup::screen#0 + (byte) $51) ← (byte) 0
[132] *((byte*) renderBobCleanup::screen#0 + (byte) 2) ← (byte) 0
[133] *((byte*) renderBobCleanup::screen#0 + (byte) $2a) ← (byte) 0
[134] *((byte*) renderBobCleanup::screen#0 + (byte) $52) ← (byte) 0
[135] (byte) renderBobCleanup::i#1 ← ++ (byte) renderBobCleanup::i#2
[136] if((byte) renderBobCleanup::i#1!=(const byte) NUM_BOBS-(byte) 1+(byte) 1) goto renderBobCleanup::@1
to:renderBobCleanup::@return
renderBobCleanup::@return: scope:[renderBobCleanup] from renderBobCleanup::@1
[137] return
to:@return
(void*()) memset((void*) memset::str , (byte) memset::c , (word) memset::num)
memset: scope:[memset] from main::@7
[118] phi()
[138] phi()
to:memset::@1
memset::@1: scope:[memset] from memset memset::@2
[119] (byte*) memset::dst#2 ← phi( memset/(byte*)(const void*) memset::str#0 memset::@2/(byte*) memset::dst#1 )
[120] if((byte*) memset::dst#2!=(const byte*) memset::end#0) goto memset::@2
[139] (byte*) memset::dst#2 ← phi( memset/(byte*)(const void*) memset::str#0 memset::@2/(byte*) memset::dst#1 )
[140] if((byte*) memset::dst#2!=(const byte*) memset::end#0) goto memset::@2
to:memset::@return
memset::@return: scope:[memset] from memset::@1
[121] return
[141] return
to:@return
memset::@2: scope:[memset] from memset::@1
[122] *((byte*) memset::dst#2) ← (const byte) memset::c#0
[123] (byte*) memset::dst#1 ← ++ (byte*) memset::dst#2
[142] *((byte*) memset::dst#2) ← (const byte) memset::c#0
[143] (byte*) memset::dst#1 ← ++ (byte*) memset::dst#2
to:memset::@1
(void()) renderBobInit()
renderBobInit: scope:[renderBobInit] from main::@10
[124] phi()
[144] phi()
to:renderBobInit::@1
renderBobInit::@1: scope:[renderBobInit] from renderBobInit renderBobInit::@1
[125] (byte) renderBobInit::y#2 ← phi( renderBobInit/(byte) 0 renderBobInit::@1/(byte) renderBobInit::y#1 )
[126] (word~) renderBobInit::$0 ← (word)(byte) renderBobInit::y#2
[127] (word~) renderBobInit::$4 ← (word~) renderBobInit::$0 << (byte) 2
[128] (word~) renderBobInit::$5 ← (word~) renderBobInit::$4 + (word~) renderBobInit::$0
[129] (word~) renderBobInit::$1 ← (word~) renderBobInit::$5 << (byte) 3
[130] (byte~) renderBobInit::$3 ← (byte) renderBobInit::y#2 << (byte) 1
[131] *((const word*) RENDERBOB_YOFFSET + (byte~) renderBobInit::$3) ← (word~) renderBobInit::$1
[132] (byte) renderBobInit::y#1 ← ++ (byte) renderBobInit::y#2
[133] if((byte) renderBobInit::y#1!=(byte) $20) goto renderBobInit::@1
[145] (byte) renderBobInit::y#2 ← phi( renderBobInit/(byte) 0 renderBobInit::@1/(byte) renderBobInit::y#1 )
[146] (word~) renderBobInit::$0 ← (word)(byte) renderBobInit::y#2
[147] (word~) renderBobInit::$6 ← (word~) renderBobInit::$0 << (byte) 2
[148] (word~) renderBobInit::$7 ← (word~) renderBobInit::$6 + (word~) renderBobInit::$0
[149] (word~) renderBobInit::$1 ← (word~) renderBobInit::$7 << (byte) 3
[150] (byte~) renderBobInit::$4 ← (byte) renderBobInit::y#2 << (byte) 1
[151] *((const word*) MUL40 + (byte~) renderBobInit::$4) ← (word~) renderBobInit::$1
[152] (byte) renderBobInit::y#1 ← ++ (byte) renderBobInit::y#2
[153] if((byte) renderBobInit::y#1!=(byte) $20) goto renderBobInit::@1
to:renderBobInit::@2
renderBobInit::@2: scope:[renderBobInit] from renderBobInit::@1 renderBobInit::@2
[154] (byte) renderBobInit::i#2 ← phi( renderBobInit::@1/(byte) 0 renderBobInit::@2/(byte) renderBobInit::i#1 )
[155] (byte~) renderBobInit::$5 ← (byte) renderBobInit::i#2 << (byte) 1
[156] *((const byte**) RENDERBOB_CLEANUP + (byte~) renderBobInit::$5) ← (const byte*) BOB_SCREEN
[157] (byte) renderBobInit::i#1 ← ++ (byte) renderBobInit::i#2
[158] if((byte) renderBobInit::i#1!=(const byte) NUM_BOBS-(byte) 1+(byte) 1) goto renderBobInit::@2
to:renderBobInit::@return
renderBobInit::@return: scope:[renderBobInit] from renderBobInit::@1
[134] return
renderBobInit::@return: scope:[renderBobInit] from renderBobInit::@2
[159] return
to:@return
(void()) prepareBobs()
prepareBobs: scope:[prepareBobs] from main::@9
[135] phi()
[136] call progress_init
[160] phi()
[161] call progress_init
to:prepareBobs::@8
prepareBobs::@8: scope:[prepareBobs] from prepareBobs
[137] phi()
[138] call bobCharsetFindOrAddGlyph
[162] phi()
[163] call bobCharsetFindOrAddGlyph
to:prepareBobs::@1
prepareBobs::@1: scope:[prepareBobs] from prepareBobs::@8 prepareBobs::@9
[139] (byte) prepareBobs::bob_table_idx#6 ← phi( prepareBobs::@8/(byte) 0 prepareBobs::@9/(byte) prepareBobs::bob_table_idx#12 )
[139] (byte) bob_charset_next_id#14 ← phi( prepareBobs::@8/(byte) bob_charset_next_id#16 prepareBobs::@9/(byte) bob_charset_next_id#30 )
[139] (byte) progress_idx#16 ← phi( prepareBobs::@8/(byte) 0 prepareBobs::@9/(byte) progress_idx#31 )
[139] (byte*) progress_cursor#15 ← phi( prepareBobs::@8/(const byte*) SCREEN_BASIC prepareBobs::@9/(byte*) progress_cursor#31 )
[139] (byte) prepareBobs::shift_y#2 ← phi( prepareBobs::@8/(byte) 0 prepareBobs::@9/(byte) prepareBobs::shift_y#1 )
[140] if((byte) prepareBobs::shift_y#2<(const byte) BOB_SHIFTS_Y) goto prepareBobs::@2
[164] (byte) prepareBobs::bob_table_idx#6 ← phi( prepareBobs::@8/(byte) 0 prepareBobs::@9/(byte) prepareBobs::bob_table_idx#12 )
[164] (byte) bob_charset_next_id#14 ← phi( prepareBobs::@8/(byte) bob_charset_next_id#16 prepareBobs::@9/(byte) bob_charset_next_id#30 )
[164] (byte) progress_idx#16 ← phi( prepareBobs::@8/(byte) 0 prepareBobs::@9/(byte) progress_idx#31 )
[164] (byte*) progress_cursor#15 ← phi( prepareBobs::@8/(const byte*) SCREEN_BASIC prepareBobs::@9/(byte*) progress_cursor#31 )
[164] (byte) prepareBobs::shift_y#2 ← phi( prepareBobs::@8/(byte) 0 prepareBobs::@9/(byte) prepareBobs::shift_y#1 )
[165] if((byte) prepareBobs::shift_y#2<(const byte) BOB_SHIFTS_Y) goto prepareBobs::@2
to:prepareBobs::@return
prepareBobs::@return: scope:[prepareBobs] from prepareBobs::@1
[141] return
[166] return
to:@return
prepareBobs::@2: scope:[prepareBobs] from prepareBobs::@1 prepareBobs::@13
[142] (byte) progress_idx#31 ← phi( prepareBobs::@1/(byte) progress_idx#16 prepareBobs::@13/(byte) progress_idx#25 )
[142] (byte*) progress_cursor#31 ← phi( prepareBobs::@1/(byte*) progress_cursor#15 prepareBobs::@13/(byte*) progress_cursor#24 )
[142] (byte) bob_charset_next_id#30 ← phi( prepareBobs::@1/(byte) bob_charset_next_id#14 prepareBobs::@13/(byte) bob_charset_next_id#21 )
[142] (byte) prepareBobs::bob_table_idx#12 ← phi( prepareBobs::@1/(byte) prepareBobs::bob_table_idx#6 prepareBobs::@13/(byte) prepareBobs::bob_table_idx#1 )
[142] (byte) prepareBobs::shift_x#2 ← phi( prepareBobs::@1/(byte) 0 prepareBobs::@13/(byte) prepareBobs::shift_x#1 )
[143] if((byte) prepareBobs::shift_x#2<(const byte) BOB_SHIFTS_X) goto prepareBobs::@3
[167] (byte) progress_idx#31 ← phi( prepareBobs::@1/(byte) progress_idx#16 prepareBobs::@13/(byte) progress_idx#25 )
[167] (byte*) progress_cursor#31 ← phi( prepareBobs::@1/(byte*) progress_cursor#15 prepareBobs::@13/(byte*) progress_cursor#24 )
[167] (byte) bob_charset_next_id#30 ← phi( prepareBobs::@1/(byte) bob_charset_next_id#14 prepareBobs::@13/(byte) bob_charset_next_id#21 )
[167] (byte) prepareBobs::bob_table_idx#12 ← phi( prepareBobs::@1/(byte) prepareBobs::bob_table_idx#6 prepareBobs::@13/(byte) prepareBobs::bob_table_idx#1 )
[167] (byte) prepareBobs::shift_x#2 ← phi( prepareBobs::@1/(byte) 0 prepareBobs::@13/(byte) prepareBobs::shift_x#1 )
[168] if((byte) prepareBobs::shift_x#2<(const byte) BOB_SHIFTS_X) goto prepareBobs::@3
to:prepareBobs::@4
prepareBobs::@4: scope:[prepareBobs] from prepareBobs::@2
[144] phi()
[145] call shiftProtoBobDown
[169] phi()
[170] call shiftProtoBobDown
to:prepareBobs::@9
prepareBobs::@9: scope:[prepareBobs] from prepareBobs::@4
[146] (byte) prepareBobs::shift_y#1 ← ++ (byte) prepareBobs::shift_y#2
[171] (byte) prepareBobs::shift_y#1 ← ++ (byte) prepareBobs::shift_y#2
to:prepareBobs::@1
prepareBobs::@3: scope:[prepareBobs] from prepareBobs::@2
[147] (byte*) prepareBobs::bob_table#0 ← (const byte*) BOB_TABLES + (byte) prepareBobs::bob_table_idx#12
[172] (byte*) prepareBobs::bob_table#0 ← (const byte*) BOB_TABLES + (byte) prepareBobs::bob_table_idx#12
to:prepareBobs::@5
prepareBobs::@5: scope:[prepareBobs] from prepareBobs::@11 prepareBobs::@3
[148] (byte*) progress_cursor#24 ← phi( prepareBobs::@11/(byte*) progress_cursor#17 prepareBobs::@3/(byte*) progress_cursor#31 )
[148] (byte) progress_idx#25 ← phi( prepareBobs::@11/(byte) progress_idx#10 prepareBobs::@3/(byte) progress_idx#31 )
[148] (byte*) prepareBobs::bob_table#2 ← phi( prepareBobs::@11/(byte*) prepareBobs::bob_table#1 prepareBobs::@3/(byte*) prepareBobs::bob_table#0 )
[148] (byte) bob_charset_next_id#21 ← phi( prepareBobs::@11/(byte) bob_charset_next_id#16 prepareBobs::@3/(byte) bob_charset_next_id#30 )
[148] (byte*) prepareBobs::bob_glyph#2 ← phi( prepareBobs::@11/(byte*) prepareBobs::bob_glyph#1 prepareBobs::@3/(const byte*) PROTO_BOB )
[148] (byte) prepareBobs::cell#2 ← phi( prepareBobs::@11/(byte) prepareBobs::cell#1 prepareBobs::@3/(byte) 0 )
[149] if((byte) prepareBobs::cell#2<(byte) 9) goto prepareBobs::@6
[173] (byte*) progress_cursor#24 ← phi( prepareBobs::@11/(byte*) progress_cursor#17 prepareBobs::@3/(byte*) progress_cursor#31 )
[173] (byte) progress_idx#25 ← phi( prepareBobs::@11/(byte) progress_idx#10 prepareBobs::@3/(byte) progress_idx#31 )
[173] (byte*) prepareBobs::bob_table#2 ← phi( prepareBobs::@11/(byte*) prepareBobs::bob_table#1 prepareBobs::@3/(byte*) prepareBobs::bob_table#0 )
[173] (byte) bob_charset_next_id#21 ← phi( prepareBobs::@11/(byte) bob_charset_next_id#16 prepareBobs::@3/(byte) bob_charset_next_id#30 )
[173] (byte*) prepareBobs::bob_glyph#2 ← phi( prepareBobs::@11/(byte*) prepareBobs::bob_glyph#1 prepareBobs::@3/(const byte*) PROTO_BOB )
[173] (byte) prepareBobs::cell#2 ← phi( prepareBobs::@11/(byte) prepareBobs::cell#1 prepareBobs::@3/(byte) 0 )
[174] if((byte) prepareBobs::cell#2<(byte) 9) goto prepareBobs::@6
to:prepareBobs::@7
prepareBobs::@7: scope:[prepareBobs] from prepareBobs::@5
[150] (byte) prepareBobs::bob_table_idx#1 ← ++ (byte) prepareBobs::bob_table_idx#12
[151] call shiftProtoBobRight
[175] (byte) prepareBobs::bob_table_idx#1 ← ++ (byte) prepareBobs::bob_table_idx#12
[176] call shiftProtoBobRight
to:prepareBobs::@12
prepareBobs::@12: scope:[prepareBobs] from prepareBobs::@7
[152] phi()
[153] call shiftProtoBobRight
[177] phi()
[178] call shiftProtoBobRight
to:prepareBobs::@13
prepareBobs::@13: scope:[prepareBobs] from prepareBobs::@12
[154] (byte) prepareBobs::shift_x#1 ← ++ (byte) prepareBobs::shift_x#2
[179] (byte) prepareBobs::shift_x#1 ← ++ (byte) prepareBobs::shift_x#2
to:prepareBobs::@2
prepareBobs::@6: scope:[prepareBobs] from prepareBobs::@5
[155] (byte*) bobCharsetFindOrAddGlyph::bob_glyph#1 ← (byte*) prepareBobs::bob_glyph#2
[156] call bobCharsetFindOrAddGlyph
[157] (byte) bobCharsetFindOrAddGlyph::return#1 ← (byte) bobCharsetFindOrAddGlyph::glyph_id#11
[180] (byte*) bobCharsetFindOrAddGlyph::bob_glyph#1 ← (byte*) prepareBobs::bob_glyph#2
[181] call bobCharsetFindOrAddGlyph
[182] (byte) bobCharsetFindOrAddGlyph::return#1 ← (byte) bobCharsetFindOrAddGlyph::glyph_id#11
to:prepareBobs::@10
prepareBobs::@10: scope:[prepareBobs] from prepareBobs::@6
[158] (byte~) prepareBobs::$6 ← (byte) bobCharsetFindOrAddGlyph::return#1
[159] *((byte*) prepareBobs::bob_table#2) ← (byte~) prepareBobs::$6
[160] (byte*) prepareBobs::bob_glyph#1 ← (byte*) prepareBobs::bob_glyph#2 + (byte) 8
[161] (byte*) prepareBobs::bob_table#1 ← (byte*) prepareBobs::bob_table#2 + (const byte) BOB_SHIFTS_X*(const byte) BOB_SHIFTS_Y
[162] call progress_inc
[183] (byte~) prepareBobs::$6 ← (byte) bobCharsetFindOrAddGlyph::return#1
[184] *((byte*) prepareBobs::bob_table#2) ← (byte~) prepareBobs::$6
[185] (byte*) prepareBobs::bob_glyph#1 ← (byte*) prepareBobs::bob_glyph#2 + (byte) 8
[186] (byte*) prepareBobs::bob_table#1 ← (byte*) prepareBobs::bob_table#2 + (const byte) BOB_SHIFTS_X*(const byte) BOB_SHIFTS_Y
[187] call progress_inc
to:prepareBobs::@11
prepareBobs::@11: scope:[prepareBobs] from prepareBobs::@10
[163] (byte) prepareBobs::cell#1 ← ++ (byte) prepareBobs::cell#2
[188] (byte) prepareBobs::cell#1 ← ++ (byte) prepareBobs::cell#2
to:prepareBobs::@5
(void()) progress_inc()
progress_inc: scope:[progress_inc] from prepareBobs::@10
[164] (byte) progress_idx#8 ← ++ (byte) progress_idx#25
[165] if((byte) progress_idx#8!=(byte) 8) goto progress_inc::@1
[189] (byte) progress_idx#8 ← ++ (byte) progress_idx#25
[190] if((byte) progress_idx#8!=(byte) 8) goto progress_inc::@1
to:progress_inc::@2
progress_inc::@2: scope:[progress_inc] from progress_inc
[166] *((byte*) progress_cursor#24) ← *((const byte*) progress_inc::progress_chars+(byte) 8)
[167] (byte*) progress_cursor#8 ← ++ (byte*) progress_cursor#24
[191] *((byte*) progress_cursor#24) ← *((const byte*) progress_inc::progress_chars+(byte) 8)
[192] (byte*) progress_cursor#8 ← ++ (byte*) progress_cursor#24
to:progress_inc::@1
progress_inc::@1: scope:[progress_inc] from progress_inc progress_inc::@2
[168] (byte*) progress_cursor#17 ← phi( progress_inc/(byte*) progress_cursor#24 progress_inc::@2/(byte*) progress_cursor#8 )
[168] (byte) progress_idx#10 ← phi( progress_inc/(byte) progress_idx#8 progress_inc::@2/(byte) 0 )
[169] *((byte*) progress_cursor#17) ← *((const byte*) progress_inc::progress_chars + (byte) progress_idx#10)
[193] (byte*) progress_cursor#17 ← phi( progress_inc/(byte*) progress_cursor#24 progress_inc::@2/(byte*) progress_cursor#8 )
[193] (byte) progress_idx#10 ← phi( progress_inc/(byte) progress_idx#8 progress_inc::@2/(byte) 0 )
[194] *((byte*) progress_cursor#17) ← *((const byte*) progress_inc::progress_chars + (byte) progress_idx#10)
to:progress_inc::@return
progress_inc::@return: scope:[progress_inc] from progress_inc::@1
[170] return
[195] return
to:@return
(byte()) bobCharsetFindOrAddGlyph((byte*) bobCharsetFindOrAddGlyph::bob_glyph)
bobCharsetFindOrAddGlyph: scope:[bobCharsetFindOrAddGlyph] from prepareBobs::@6 prepareBobs::@8
[171] (byte*) bobCharsetFindOrAddGlyph::bob_glyph#10 ← phi( prepareBobs::@8/(const byte*) PROTO_BOB+(byte) $30 prepareBobs::@6/(byte*) bobCharsetFindOrAddGlyph::bob_glyph#1 )
[171] (byte) bob_charset_next_id#23 ← phi( prepareBobs::@8/(byte) 0 prepareBobs::@6/(byte) bob_charset_next_id#21 )
[196] (byte*) bobCharsetFindOrAddGlyph::bob_glyph#10 ← phi( prepareBobs::@8/(const byte*) PROTO_BOB+(byte) $30 prepareBobs::@6/(byte*) bobCharsetFindOrAddGlyph::bob_glyph#1 )
[196] (byte) bob_charset_next_id#23 ← phi( prepareBobs::@8/(byte) 0 prepareBobs::@6/(byte) bob_charset_next_id#21 )
to:bobCharsetFindOrAddGlyph::@1
bobCharsetFindOrAddGlyph::@1: scope:[bobCharsetFindOrAddGlyph] from bobCharsetFindOrAddGlyph bobCharsetFindOrAddGlyph::@6
[172] (byte*) bobCharsetFindOrAddGlyph::glyph_cursor#11 ← phi( bobCharsetFindOrAddGlyph/(const byte*) BOB_CHARSET bobCharsetFindOrAddGlyph::@6/(byte*) bobCharsetFindOrAddGlyph::glyph_cursor#1 )
[172] (byte) bobCharsetFindOrAddGlyph::glyph_id#11 ← phi( bobCharsetFindOrAddGlyph/(byte) 0 bobCharsetFindOrAddGlyph::@6/(byte) bobCharsetFindOrAddGlyph::glyph_id#1 )
[173] if((byte) bobCharsetFindOrAddGlyph::glyph_id#11!=(byte) bob_charset_next_id#23) goto bobCharsetFindOrAddGlyph::@2
[197] (byte*) bobCharsetFindOrAddGlyph::glyph_cursor#11 ← phi( bobCharsetFindOrAddGlyph/(const byte*) BOB_CHARSET bobCharsetFindOrAddGlyph::@6/(byte*) bobCharsetFindOrAddGlyph::glyph_cursor#1 )
[197] (byte) bobCharsetFindOrAddGlyph::glyph_id#11 ← phi( bobCharsetFindOrAddGlyph/(byte) 0 bobCharsetFindOrAddGlyph::@6/(byte) bobCharsetFindOrAddGlyph::glyph_id#1 )
[198] if((byte) bobCharsetFindOrAddGlyph::glyph_id#11!=(byte) bob_charset_next_id#23) goto bobCharsetFindOrAddGlyph::@2
to:bobCharsetFindOrAddGlyph::@7
bobCharsetFindOrAddGlyph::@7: scope:[bobCharsetFindOrAddGlyph] from bobCharsetFindOrAddGlyph::@1 bobCharsetFindOrAddGlyph::@8
[174] (byte) bobCharsetFindOrAddGlyph::i1#2 ← phi( bobCharsetFindOrAddGlyph::@8/(byte) bobCharsetFindOrAddGlyph::i1#1 bobCharsetFindOrAddGlyph::@1/(byte) 0 )
[175] if((byte) bobCharsetFindOrAddGlyph::i1#2<(byte) 8) goto bobCharsetFindOrAddGlyph::@8
[199] (byte) bobCharsetFindOrAddGlyph::i1#2 ← phi( bobCharsetFindOrAddGlyph::@8/(byte) bobCharsetFindOrAddGlyph::i1#1 bobCharsetFindOrAddGlyph::@1/(byte) 0 )
[200] if((byte) bobCharsetFindOrAddGlyph::i1#2<(byte) 8) goto bobCharsetFindOrAddGlyph::@8
to:bobCharsetFindOrAddGlyph::@9
bobCharsetFindOrAddGlyph::@9: scope:[bobCharsetFindOrAddGlyph] from bobCharsetFindOrAddGlyph::@7
[176] (byte) bob_charset_next_id#8 ← ++ (byte) bob_charset_next_id#23
[201] (byte) bob_charset_next_id#8 ← ++ (byte) bob_charset_next_id#23
to:bobCharsetFindOrAddGlyph::@return
bobCharsetFindOrAddGlyph::@return: scope:[bobCharsetFindOrAddGlyph] from bobCharsetFindOrAddGlyph::@5 bobCharsetFindOrAddGlyph::@9
[177] (byte) bob_charset_next_id#16 ← phi( bobCharsetFindOrAddGlyph::@5/(byte) bob_charset_next_id#23 bobCharsetFindOrAddGlyph::@9/(byte) bob_charset_next_id#8 )
[178] return
[202] (byte) bob_charset_next_id#16 ← phi( bobCharsetFindOrAddGlyph::@5/(byte) bob_charset_next_id#23 bobCharsetFindOrAddGlyph::@9/(byte) bob_charset_next_id#8 )
[203] return
to:@return
bobCharsetFindOrAddGlyph::@8: scope:[bobCharsetFindOrAddGlyph] from bobCharsetFindOrAddGlyph::@7
[179] *((byte*) bobCharsetFindOrAddGlyph::glyph_cursor#11 + (byte) bobCharsetFindOrAddGlyph::i1#2) ← *((byte*) bobCharsetFindOrAddGlyph::bob_glyph#10 + (byte) bobCharsetFindOrAddGlyph::i1#2)
[180] (byte) bobCharsetFindOrAddGlyph::i1#1 ← ++ (byte) bobCharsetFindOrAddGlyph::i1#2
[204] *((byte*) bobCharsetFindOrAddGlyph::glyph_cursor#11 + (byte) bobCharsetFindOrAddGlyph::i1#2) ← *((byte*) bobCharsetFindOrAddGlyph::bob_glyph#10 + (byte) bobCharsetFindOrAddGlyph::i1#2)
[205] (byte) bobCharsetFindOrAddGlyph::i1#1 ← ++ (byte) bobCharsetFindOrAddGlyph::i1#2
to:bobCharsetFindOrAddGlyph::@7
bobCharsetFindOrAddGlyph::@2: scope:[bobCharsetFindOrAddGlyph] from bobCharsetFindOrAddGlyph::@1 bobCharsetFindOrAddGlyph::@4
[181] (byte) bobCharsetFindOrAddGlyph::i#2 ← phi( bobCharsetFindOrAddGlyph::@1/(byte) 0 bobCharsetFindOrAddGlyph::@4/(byte) bobCharsetFindOrAddGlyph::i#1 )
[182] if((byte) bobCharsetFindOrAddGlyph::i#2<(byte) 8) goto bobCharsetFindOrAddGlyph::@3
[206] (byte) bobCharsetFindOrAddGlyph::i#2 ← phi( bobCharsetFindOrAddGlyph::@1/(byte) 0 bobCharsetFindOrAddGlyph::@4/(byte) bobCharsetFindOrAddGlyph::i#1 )
[207] if((byte) bobCharsetFindOrAddGlyph::i#2<(byte) 8) goto bobCharsetFindOrAddGlyph::@3
to:bobCharsetFindOrAddGlyph::@5
bobCharsetFindOrAddGlyph::@3: scope:[bobCharsetFindOrAddGlyph] from bobCharsetFindOrAddGlyph::@2
[183] if(*((byte*) bobCharsetFindOrAddGlyph::glyph_cursor#11 + (byte) bobCharsetFindOrAddGlyph::i#2)==*((byte*) bobCharsetFindOrAddGlyph::bob_glyph#10 + (byte) bobCharsetFindOrAddGlyph::i#2)) goto bobCharsetFindOrAddGlyph::@4
[208] if(*((byte*) bobCharsetFindOrAddGlyph::glyph_cursor#11 + (byte) bobCharsetFindOrAddGlyph::i#2)==*((byte*) bobCharsetFindOrAddGlyph::bob_glyph#10 + (byte) bobCharsetFindOrAddGlyph::i#2)) goto bobCharsetFindOrAddGlyph::@4
to:bobCharsetFindOrAddGlyph::@5
bobCharsetFindOrAddGlyph::@5: scope:[bobCharsetFindOrAddGlyph] from bobCharsetFindOrAddGlyph::@2 bobCharsetFindOrAddGlyph::@3
[184] (byte) bobCharsetFindOrAddGlyph::found#2 ← phi( bobCharsetFindOrAddGlyph::@3/(byte) 0 bobCharsetFindOrAddGlyph::@2/(byte) 1 )
[185] if((byte) 0==(byte) bobCharsetFindOrAddGlyph::found#2) goto bobCharsetFindOrAddGlyph::@6
[209] (byte) bobCharsetFindOrAddGlyph::found#2 ← phi( bobCharsetFindOrAddGlyph::@3/(byte) 0 bobCharsetFindOrAddGlyph::@2/(byte) 1 )
[210] if((byte) 0==(byte) bobCharsetFindOrAddGlyph::found#2) goto bobCharsetFindOrAddGlyph::@6
to:bobCharsetFindOrAddGlyph::@return
bobCharsetFindOrAddGlyph::@6: scope:[bobCharsetFindOrAddGlyph] from bobCharsetFindOrAddGlyph::@5
[186] (byte) bobCharsetFindOrAddGlyph::glyph_id#1 ← ++ (byte) bobCharsetFindOrAddGlyph::glyph_id#11
[187] (byte*) bobCharsetFindOrAddGlyph::glyph_cursor#1 ← (byte*) bobCharsetFindOrAddGlyph::glyph_cursor#11 + (byte) 8
[211] (byte) bobCharsetFindOrAddGlyph::glyph_id#1 ← ++ (byte) bobCharsetFindOrAddGlyph::glyph_id#11
[212] (byte*) bobCharsetFindOrAddGlyph::glyph_cursor#1 ← (byte*) bobCharsetFindOrAddGlyph::glyph_cursor#11 + (byte) 8
to:bobCharsetFindOrAddGlyph::@1
bobCharsetFindOrAddGlyph::@4: scope:[bobCharsetFindOrAddGlyph] from bobCharsetFindOrAddGlyph::@3
[188] (byte) bobCharsetFindOrAddGlyph::i#1 ← ++ (byte) bobCharsetFindOrAddGlyph::i#2
[213] (byte) bobCharsetFindOrAddGlyph::i#1 ← ++ (byte) bobCharsetFindOrAddGlyph::i#2
to:bobCharsetFindOrAddGlyph::@2
(void()) shiftProtoBobRight()
shiftProtoBobRight: scope:[shiftProtoBobRight] from prepareBobs::@12 prepareBobs::@7
[189] phi()
[214] phi()
to:shiftProtoBobRight::@1
shiftProtoBobRight::@1: scope:[shiftProtoBobRight] from shiftProtoBobRight shiftProtoBobRight::@6
[190] (byte) shiftProtoBobRight::carry#2 ← phi( shiftProtoBobRight/(byte) 0 shiftProtoBobRight::@6/(byte) shiftProtoBobRight::carry#10 )
[190] (byte) shiftProtoBobRight::j#3 ← phi( shiftProtoBobRight/(byte) 0 shiftProtoBobRight::@6/(byte) shiftProtoBobRight::j#10 )
[190] (byte) shiftProtoBobRight::i#2 ← phi( shiftProtoBobRight/(byte) 0 shiftProtoBobRight::@6/(byte) shiftProtoBobRight::i#1 )
[191] if((byte) shiftProtoBobRight::i#2<(byte)(number) 3*(number) 3*(number) 8) goto shiftProtoBobRight::@2
[215] (byte) shiftProtoBobRight::carry#2 ← phi( shiftProtoBobRight/(byte) 0 shiftProtoBobRight::@6/(byte) shiftProtoBobRight::carry#10 )
[215] (byte) shiftProtoBobRight::j#3 ← phi( shiftProtoBobRight/(byte) 0 shiftProtoBobRight::@6/(byte) shiftProtoBobRight::j#10 )
[215] (byte) shiftProtoBobRight::i#2 ← phi( shiftProtoBobRight/(byte) 0 shiftProtoBobRight::@6/(byte) shiftProtoBobRight::i#1 )
[216] if((byte) shiftProtoBobRight::i#2<(byte)(number) 3*(number) 3*(number) 8) goto shiftProtoBobRight::@2
to:shiftProtoBobRight::@return
shiftProtoBobRight::@return: scope:[shiftProtoBobRight] from shiftProtoBobRight::@1
[192] return
[217] return
to:@return
shiftProtoBobRight::@2: scope:[shiftProtoBobRight] from shiftProtoBobRight::@1
[193] (byte~) shiftProtoBobRight::$1 ← *((const byte*) PROTO_BOB + (byte) shiftProtoBobRight::j#3) & (byte) 1
[194] if((byte) 0!=(byte~) shiftProtoBobRight::$1) goto shiftProtoBobRight::@3
[218] (byte~) shiftProtoBobRight::$1 ← *((const byte*) PROTO_BOB + (byte) shiftProtoBobRight::j#3) & (byte) 1
[219] if((byte) 0!=(byte~) shiftProtoBobRight::$1) goto shiftProtoBobRight::@3
to:shiftProtoBobRight::@4
shiftProtoBobRight::@3: scope:[shiftProtoBobRight] from shiftProtoBobRight::@2
[195] phi()
[220] phi()
to:shiftProtoBobRight::@4
shiftProtoBobRight::@4: scope:[shiftProtoBobRight] from shiftProtoBobRight::@2 shiftProtoBobRight::@3
[196] (byte) shiftProtoBobRight::carry#1 ← phi( shiftProtoBobRight::@3/(byte) $80 shiftProtoBobRight::@2/(byte) 0 )
[197] (byte~) shiftProtoBobRight::$5 ← *((const byte*) PROTO_BOB + (byte) shiftProtoBobRight::j#3) >> (byte) 1
[198] (byte~) shiftProtoBobRight::$6 ← (byte) shiftProtoBobRight::carry#2 | (byte~) shiftProtoBobRight::$5
[199] *((const byte*) PROTO_BOB + (byte) shiftProtoBobRight::j#3) ← (byte~) shiftProtoBobRight::$6
[200] if((byte) shiftProtoBobRight::j#3>=(byte) $30) goto shiftProtoBobRight::@5
[221] (byte) shiftProtoBobRight::carry#1 ← phi( shiftProtoBobRight::@3/(byte) $80 shiftProtoBobRight::@2/(byte) 0 )
[222] (byte~) shiftProtoBobRight::$5 ← *((const byte*) PROTO_BOB + (byte) shiftProtoBobRight::j#3) >> (byte) 1
[223] (byte~) shiftProtoBobRight::$6 ← (byte) shiftProtoBobRight::carry#2 | (byte~) shiftProtoBobRight::$5
[224] *((const byte*) PROTO_BOB + (byte) shiftProtoBobRight::j#3) ← (byte~) shiftProtoBobRight::$6
[225] if((byte) shiftProtoBobRight::j#3>=(byte) $30) goto shiftProtoBobRight::@5
to:shiftProtoBobRight::@7
shiftProtoBobRight::@7: scope:[shiftProtoBobRight] from shiftProtoBobRight::@4
[201] (byte) shiftProtoBobRight::j#2 ← (byte) shiftProtoBobRight::j#3 + (byte) $18
[226] (byte) shiftProtoBobRight::j#2 ← (byte) shiftProtoBobRight::j#3 + (byte) $18
to:shiftProtoBobRight::@6
shiftProtoBobRight::@6: scope:[shiftProtoBobRight] from shiftProtoBobRight::@5 shiftProtoBobRight::@7
[202] (byte) shiftProtoBobRight::j#10 ← phi( shiftProtoBobRight::@7/(byte) shiftProtoBobRight::j#2 shiftProtoBobRight::@5/(byte) shiftProtoBobRight::j#1 )
[203] (byte) shiftProtoBobRight::i#1 ← ++ (byte) shiftProtoBobRight::i#2
[204] (byte) shiftProtoBobRight::carry#10 ← (byte) shiftProtoBobRight::carry#1
[227] (byte) shiftProtoBobRight::j#10 ← phi( shiftProtoBobRight::@7/(byte) shiftProtoBobRight::j#2 shiftProtoBobRight::@5/(byte) shiftProtoBobRight::j#1 )
[228] (byte) shiftProtoBobRight::i#1 ← ++ (byte) shiftProtoBobRight::i#2
[229] (byte) shiftProtoBobRight::carry#10 ← (byte) shiftProtoBobRight::carry#1
to:shiftProtoBobRight::@1
shiftProtoBobRight::@5: scope:[shiftProtoBobRight] from shiftProtoBobRight::@4
[205] (byte) shiftProtoBobRight::j#1 ← (byte) shiftProtoBobRight::j#3 - (byte) $2f
[230] (byte) shiftProtoBobRight::j#1 ← (byte) shiftProtoBobRight::j#3 - (byte) $2f
to:shiftProtoBobRight::@6
(void()) shiftProtoBobDown()
shiftProtoBobDown: scope:[shiftProtoBobDown] from prepareBobs::@4
[206] phi()
[231] phi()
to:shiftProtoBobDown::@1
shiftProtoBobDown::@1: scope:[shiftProtoBobDown] from shiftProtoBobDown shiftProtoBobDown::@2
[207] (byte) shiftProtoBobDown::i#2 ← phi( shiftProtoBobDown/(byte) $17 shiftProtoBobDown::@2/(byte) shiftProtoBobDown::i#1 )
[208] if((byte) shiftProtoBobDown::i#2>(byte) 0) goto shiftProtoBobDown::@2
[232] (byte) shiftProtoBobDown::i#2 ← phi( shiftProtoBobDown/(byte) $17 shiftProtoBobDown::@2/(byte) shiftProtoBobDown::i#1 )
[233] if((byte) shiftProtoBobDown::i#2>(byte) 0) goto shiftProtoBobDown::@2
to:shiftProtoBobDown::@3
shiftProtoBobDown::@3: scope:[shiftProtoBobDown] from shiftProtoBobDown::@1
[209] *((const byte*) PROTO_BOB) ← (byte) 0
[210] *((const byte*) PROTO_BOB+(byte) $18) ← (byte) 0
[211] *((const byte*) PROTO_BOB+(byte) $30) ← (byte) 0
[234] *((const byte*) PROTO_BOB) ← (byte) 0
[235] *((const byte*) PROTO_BOB+(byte) $18) ← (byte) 0
[236] *((const byte*) PROTO_BOB+(byte) $30) ← (byte) 0
to:shiftProtoBobDown::@return
shiftProtoBobDown::@return: scope:[shiftProtoBobDown] from shiftProtoBobDown::@3
[212] return
[237] return
to:@return
shiftProtoBobDown::@2: scope:[shiftProtoBobDown] from shiftProtoBobDown::@1
[213] *((const byte*) PROTO_BOB + (byte) shiftProtoBobDown::i#2) ← *((const byte*) PROTO_BOB+(byte) $17 + (byte) shiftProtoBobDown::i#2)
[214] *((const byte*) PROTO_BOB+(byte) $18 + (byte) shiftProtoBobDown::i#2) ← *((const byte*) PROTO_BOB+(byte) $2f + (byte) shiftProtoBobDown::i#2)
[215] *((const byte*) PROTO_BOB+(byte) $30 + (byte) shiftProtoBobDown::i#2) ← (byte) 0
[216] (byte) shiftProtoBobDown::i#1 ← -- (byte) shiftProtoBobDown::i#2
[238] *((const byte*) PROTO_BOB + (byte) shiftProtoBobDown::i#2) ← *((const byte*) PROTO_BOB+(byte) $17 + (byte) shiftProtoBobDown::i#2)
[239] *((const byte*) PROTO_BOB+(byte) $18 + (byte) shiftProtoBobDown::i#2) ← *((const byte*) PROTO_BOB+(byte) $2f + (byte) shiftProtoBobDown::i#2)
[240] *((const byte*) PROTO_BOB+(byte) $30 + (byte) shiftProtoBobDown::i#2) ← (byte) 0
[241] (byte) shiftProtoBobDown::i#1 ← -- (byte) shiftProtoBobDown::i#2
to:shiftProtoBobDown::@1
(void()) progress_init((byte*) progress_init::line)
progress_init: scope:[progress_init] from prepareBobs
[217] phi()
[242] phi()
to:progress_init::@return
progress_init::@return: scope:[progress_init] from progress_init
[218] return
[243] return
to:@return
(void()) mulf_init()
mulf_init: scope:[mulf_init] from main
[219] phi()
[244] phi()
to:mulf_init::@1
mulf_init::@1: scope:[mulf_init] from mulf_init mulf_init::@3
[220] (byte) mulf_init::x_2#3 ← phi( mulf_init/(byte) 0 mulf_init::@3/(byte) mulf_init::x_2#2 )
[220] (byte*) mulf_init::sqr1_hi#2 ← phi( mulf_init/(const byte*) mulf_sqr1_hi+(byte) 1 mulf_init::@3/(byte*) mulf_init::sqr1_hi#1 )
[220] (word) mulf_init::sqr#4 ← phi( mulf_init/(byte) 0 mulf_init::@3/(word) mulf_init::sqr#1 )
[220] (byte) mulf_init::c#2 ← phi( mulf_init/(byte) 0 mulf_init::@3/(byte) mulf_init::c#1 )
[220] (byte*) mulf_init::sqr1_lo#2 ← phi( mulf_init/(const byte*) mulf_sqr1_lo+(byte) 1 mulf_init::@3/(byte*) mulf_init::sqr1_lo#1 )
[221] if((byte*) mulf_init::sqr1_lo#2!=(const byte*) mulf_sqr1_lo+(word) $200) goto mulf_init::@2
[245] (byte) mulf_init::x_2#3 ← phi( mulf_init/(byte) 0 mulf_init::@3/(byte) mulf_init::x_2#2 )
[245] (byte*) mulf_init::sqr1_hi#2 ← phi( mulf_init/(const byte*) mulf_sqr1_hi+(byte) 1 mulf_init::@3/(byte*) mulf_init::sqr1_hi#1 )
[245] (word) mulf_init::sqr#4 ← phi( mulf_init/(byte) 0 mulf_init::@3/(word) mulf_init::sqr#1 )
[245] (byte) mulf_init::c#2 ← phi( mulf_init/(byte) 0 mulf_init::@3/(byte) mulf_init::c#1 )
[245] (byte*) mulf_init::sqr1_lo#2 ← phi( mulf_init/(const byte*) mulf_sqr1_lo+(byte) 1 mulf_init::@3/(byte*) mulf_init::sqr1_lo#1 )
[246] if((byte*) mulf_init::sqr1_lo#2!=(const byte*) mulf_sqr1_lo+(word) $200) goto mulf_init::@2
to:mulf_init::@5
mulf_init::@5: scope:[mulf_init] from mulf_init::@1 mulf_init::@8
[222] (byte) mulf_init::dir#2 ← phi( mulf_init::@8/(byte) mulf_init::dir#4 mulf_init::@1/(byte) $ff )
[222] (byte*) mulf_init::sqr2_hi#2 ← phi( mulf_init::@8/(byte*) mulf_init::sqr2_hi#1 mulf_init::@1/(const byte*) mulf_sqr2_hi )
[222] (byte) mulf_init::x_255#2 ← phi( mulf_init::@8/(byte) mulf_init::x_255#1 mulf_init::@1/(byte) -1 )
[222] (byte*) mulf_init::sqr2_lo#2 ← phi( mulf_init::@8/(byte*) mulf_init::sqr2_lo#1 mulf_init::@1/(const byte*) mulf_sqr2_lo )
[223] if((byte*) mulf_init::sqr2_lo#2!=(const byte*) mulf_sqr2_lo+(word) $1ff) goto mulf_init::@6
[247] (byte) mulf_init::dir#2 ← phi( mulf_init::@8/(byte) mulf_init::dir#4 mulf_init::@1/(byte) $ff )
[247] (byte*) mulf_init::sqr2_hi#2 ← phi( mulf_init::@8/(byte*) mulf_init::sqr2_hi#1 mulf_init::@1/(const byte*) mulf_sqr2_hi )
[247] (byte) mulf_init::x_255#2 ← phi( mulf_init::@8/(byte) mulf_init::x_255#1 mulf_init::@1/(byte) -1 )
[247] (byte*) mulf_init::sqr2_lo#2 ← phi( mulf_init::@8/(byte*) mulf_init::sqr2_lo#1 mulf_init::@1/(const byte*) mulf_sqr2_lo )
[248] if((byte*) mulf_init::sqr2_lo#2!=(const byte*) mulf_sqr2_lo+(word) $1ff) goto mulf_init::@6
to:mulf_init::@7
mulf_init::@7: scope:[mulf_init] from mulf_init::@5
[224] *((const byte*) mulf_sqr2_lo+(word) $1ff) ← *((const byte*) mulf_sqr1_lo+(word) $100)
[225] *((const byte*) mulf_sqr2_hi+(word) $1ff) ← *((const byte*) mulf_sqr1_hi+(word) $100)
[249] *((const byte*) mulf_sqr2_lo+(word) $1ff) ← *((const byte*) mulf_sqr1_lo+(word) $100)
[250] *((const byte*) mulf_sqr2_hi+(word) $1ff) ← *((const byte*) mulf_sqr1_hi+(word) $100)
to:mulf_init::@return
mulf_init::@return: scope:[mulf_init] from mulf_init::@7
[226] return
[251] return
to:@return
mulf_init::@6: scope:[mulf_init] from mulf_init::@5
[227] *((byte*) mulf_init::sqr2_lo#2) ← *((const byte*) mulf_sqr1_lo + (byte) mulf_init::x_255#2)
[228] *((byte*) mulf_init::sqr2_hi#2) ← *((const byte*) mulf_sqr1_hi + (byte) mulf_init::x_255#2)
[229] (byte*) mulf_init::sqr2_hi#1 ← ++ (byte*) mulf_init::sqr2_hi#2
[230] (byte) mulf_init::x_255#1 ← (byte) mulf_init::x_255#2 + (byte) mulf_init::dir#2
[231] if((byte) mulf_init::x_255#1!=(byte) 0) goto mulf_init::@9
[252] *((byte*) mulf_init::sqr2_lo#2) ← *((const byte*) mulf_sqr1_lo + (byte) mulf_init::x_255#2)
[253] *((byte*) mulf_init::sqr2_hi#2) ← *((const byte*) mulf_sqr1_hi + (byte) mulf_init::x_255#2)
[254] (byte*) mulf_init::sqr2_hi#1 ← ++ (byte*) mulf_init::sqr2_hi#2
[255] (byte) mulf_init::x_255#1 ← (byte) mulf_init::x_255#2 + (byte) mulf_init::dir#2
[256] if((byte) mulf_init::x_255#1!=(byte) 0) goto mulf_init::@9
to:mulf_init::@8
mulf_init::@9: scope:[mulf_init] from mulf_init::@6
[232] phi()
[257] phi()
to:mulf_init::@8
mulf_init::@8: scope:[mulf_init] from mulf_init::@6 mulf_init::@9
[233] (byte) mulf_init::dir#4 ← phi( mulf_init::@9/(byte) mulf_init::dir#2 mulf_init::@6/(byte) 1 )
[234] (byte*) mulf_init::sqr2_lo#1 ← ++ (byte*) mulf_init::sqr2_lo#2
[258] (byte) mulf_init::dir#4 ← phi( mulf_init::@9/(byte) mulf_init::dir#2 mulf_init::@6/(byte) 1 )
[259] (byte*) mulf_init::sqr2_lo#1 ← ++ (byte*) mulf_init::sqr2_lo#2
to:mulf_init::@5
mulf_init::@2: scope:[mulf_init] from mulf_init::@1
[235] (byte) mulf_init::c#1 ← ++ (byte) mulf_init::c#2
[236] (byte~) mulf_init::$1 ← (byte) mulf_init::c#1 & (byte) 1
[237] if((byte~) mulf_init::$1!=(byte) 0) goto mulf_init::@3
[260] (byte) mulf_init::c#1 ← ++ (byte) mulf_init::c#2
[261] (byte~) mulf_init::$1 ← (byte) mulf_init::c#1 & (byte) 1
[262] if((byte~) mulf_init::$1!=(byte) 0) goto mulf_init::@3
to:mulf_init::@4
mulf_init::@4: scope:[mulf_init] from mulf_init::@2
[238] (byte) mulf_init::x_2#1 ← ++ (byte) mulf_init::x_2#3
[239] (word) mulf_init::sqr#2 ← ++ (word) mulf_init::sqr#4
[263] (byte) mulf_init::x_2#1 ← ++ (byte) mulf_init::x_2#3
[264] (word) mulf_init::sqr#2 ← ++ (word) mulf_init::sqr#4
to:mulf_init::@3
mulf_init::@3: scope:[mulf_init] from mulf_init::@2 mulf_init::@4
[240] (byte) mulf_init::x_2#2 ← phi( mulf_init::@2/(byte) mulf_init::x_2#3 mulf_init::@4/(byte) mulf_init::x_2#1 )
[240] (word) mulf_init::sqr#3 ← phi( mulf_init::@2/(word) mulf_init::sqr#4 mulf_init::@4/(word) mulf_init::sqr#2 )
[241] (byte~) mulf_init::$4 ← < (word) mulf_init::sqr#3
[242] *((byte*) mulf_init::sqr1_lo#2) ← (byte~) mulf_init::$4
[243] (byte~) mulf_init::$5 ← > (word) mulf_init::sqr#3
[244] *((byte*) mulf_init::sqr1_hi#2) ← (byte~) mulf_init::$5
[245] (byte*) mulf_init::sqr1_hi#1 ← ++ (byte*) mulf_init::sqr1_hi#2
[246] (word) mulf_init::sqr#1 ← (word) mulf_init::sqr#3 + (byte) mulf_init::x_2#2
[247] (byte*) mulf_init::sqr1_lo#1 ← ++ (byte*) mulf_init::sqr1_lo#2
[265] (byte) mulf_init::x_2#2 ← phi( mulf_init::@2/(byte) mulf_init::x_2#3 mulf_init::@4/(byte) mulf_init::x_2#1 )
[265] (word) mulf_init::sqr#3 ← phi( mulf_init::@2/(word) mulf_init::sqr#4 mulf_init::@4/(word) mulf_init::sqr#2 )
[266] (byte~) mulf_init::$4 ← < (word) mulf_init::sqr#3
[267] *((byte*) mulf_init::sqr1_lo#2) ← (byte~) mulf_init::$4
[268] (byte~) mulf_init::$5 ← > (word) mulf_init::sqr#3
[269] *((byte*) mulf_init::sqr1_hi#2) ← (byte~) mulf_init::$5
[270] (byte*) mulf_init::sqr1_hi#1 ← ++ (byte*) mulf_init::sqr1_hi#2
[271] (word) mulf_init::sqr#1 ← (word) mulf_init::sqr#3 + (byte) mulf_init::x_2#2
[272] (byte*) mulf_init::sqr1_lo#1 ← ++ (byte*) mulf_init::sqr1_lo#2
to:mulf_init::@1

View File

@ -17,6 +17,8 @@
(const signed byte*) COS = (const signed byte*) SIN+(byte) $40
(const byte*) D018 = (byte*) 53272
(const byte) KEY_SPACE = (number) $3c
(const word*) MUL40 = { fill( $20, 0) }
(const byte) NUM_BOBS = (number) $14
(const byte*) PROTO_BOB = kickasm {{ .var pic = LoadPicture("smiley.png", List().add($000000, $ffffff))
.for (var x=0;x<3; x++)
.for (var y=0; y<24; y++)
@ -27,11 +29,12 @@
(const byte) RADIX::HEXADECIMAL = (number) $10
(const byte) RADIX::OCTAL = (number) 8
(const byte*) RASTER = (byte*) 53266
(const word*) RENDERBOB_YOFFSET = { fill( $20, 0) }
(const byte**) RENDERBOB_CLEANUP = { fill( NUM_BOBS, 0) }
(const byte*) SCREEN_BASIC = (byte*) 1024
(const signed byte*) SIN = kickasm {{ .for(var i=0;i<$140;i++)
.byte >round($7fff*sin(i*2*PI/256))
}}
(const byte) SIZEOF_POINTER = (byte) 2
(byte()) bobCharsetFindOrAddGlyph((byte*) bobCharsetFindOrAddGlyph::bob_glyph)
(label) bobCharsetFindOrAddGlyph::@1
(label) bobCharsetFindOrAddGlyph::@2
@ -44,19 +47,19 @@
(label) bobCharsetFindOrAddGlyph::@9
(label) bobCharsetFindOrAddGlyph::@return
(byte*) bobCharsetFindOrAddGlyph::bob_glyph
(byte*) bobCharsetFindOrAddGlyph::bob_glyph#1 bob_glyph zp[2]:16 2002.0
(byte*) bobCharsetFindOrAddGlyph::bob_glyph#10 bob_glyph zp[2]:16 7400.200000000001
(byte*) bobCharsetFindOrAddGlyph::bob_glyph#1 bob_glyph zp[2]:6 2002.0
(byte*) bobCharsetFindOrAddGlyph::bob_glyph#10 bob_glyph zp[2]:6 7400.200000000001
(byte) bobCharsetFindOrAddGlyph::found
(byte) bobCharsetFindOrAddGlyph::found#2 reg byte a 10001.0
(byte*) bobCharsetFindOrAddGlyph::glyph_cursor
(byte*) bobCharsetFindOrAddGlyph::glyph_cursor#1 glyph_cursor zp[2]:8 20002.0
(byte*) bobCharsetFindOrAddGlyph::glyph_cursor#11 glyph_cursor zp[2]:8 10000.307692307691
(byte*) bobCharsetFindOrAddGlyph::glyph_cursor#1 glyph_cursor zp[2]:18 20002.0
(byte*) bobCharsetFindOrAddGlyph::glyph_cursor#11 glyph_cursor zp[2]:18 10000.307692307691
(byte) bobCharsetFindOrAddGlyph::glyph_id
(byte) bobCharsetFindOrAddGlyph::glyph_id#1 glyph_id zp[1]:14 10001.0
(byte) bobCharsetFindOrAddGlyph::glyph_id#11 glyph_id zp[1]:14 1937.75
(byte) bobCharsetFindOrAddGlyph::i
(byte) bobCharsetFindOrAddGlyph::i#1 i zp[1]:10 200002.0
(byte) bobCharsetFindOrAddGlyph::i#2 i zp[1]:10 166668.3333333333
(byte) bobCharsetFindOrAddGlyph::i#1 i zp[1]:8 200002.0
(byte) bobCharsetFindOrAddGlyph::i#2 i zp[1]:8 166668.3333333333
(byte) bobCharsetFindOrAddGlyph::i1
(byte) bobCharsetFindOrAddGlyph::i1#1 reg byte y 20002.0
(byte) bobCharsetFindOrAddGlyph::i1#2 reg byte y 16668.333333333332
@ -92,11 +95,11 @@
(byte) keyboard_matrix_read::rowid
(const byte*) keyboard_matrix_row_bitmask = { (byte) $fe, (byte) $fd, (byte) $fb, (byte) $f7, (byte) $ef, (byte) $df, (byte) $bf, (byte) $7f }
(void()) main()
(signed word~) main::$11 zp[2]:6 202.0
(signed word~) main::$12 zp[2]:6 202.0
(byte~) main::$18 reg byte a 22.0
(byte~) main::$20 reg byte a 22.0
(signed word~) main::$9 zp[2]:6 202.0
(signed word~) main::$10 zp[2]:12 202.0
(signed word~) main::$12 zp[2]:12 202.0
(signed word~) main::$13 zp[2]:12 202.0
(byte~) main::$19 reg byte a 22.0
(byte~) main::$21 reg byte a 22.0
(label) main::@1
(label) main::@10
(label) main::@11
@ -104,6 +107,7 @@
(label) main::@13
(label) main::@14
(label) main::@15
(label) main::@16
(label) main::@2
(label) main::@3
(label) main::@4
@ -116,10 +120,10 @@
(byte) main::a
(byte) main::a#1 a zp[1]:4 28.857142857142858
(byte) main::a#2 a zp[1]:4 25.9375
(byte) main::a#7 a zp[1]:4 22.0
(byte) main::a#6 a zp[1]:4 22.0
(byte) main::angle
(byte) main::angle#1 angle zp[1]:2 3.6666666666666665
(byte) main::angle#6 angle zp[1]:2 1.2692307692307692
(byte) main::angle#8 angle zp[1]:2 1.1785714285714286
(byte) main::i
(byte) main::i#1 i zp[1]:5 151.5
(byte) main::i#2 i zp[1]:5 9.619047619047619
@ -151,9 +155,9 @@
(byte) main::vicSelectGfxBank2_toDd001_return
(const byte) main::vicSelectGfxBank2_toDd001_return#0 vicSelectGfxBank2_toDd001_return = (byte) 3
(signed word) main::x
(signed word) main::x#0 x zp[2]:11 18.363636363636363
(signed word) main::x#0 x zp[2]:9 18.363636363636363
(signed word) main::y
(signed word) main::y#0 y zp[2]:6 40.4
(signed word) main::y#0 y zp[2]:12 40.4
(void*()) memset((void*) memset::str , (byte) memset::c , (word) memset::num)
(label) memset::@1
(label) memset::@2
@ -185,9 +189,9 @@
(signed byte) mulf8s::mulf8s_prepare1_a
(signed byte) mulf8s::mulf8s_prepare1_a#0 reg byte a 202.0
(signed word) mulf8s::return
(signed word) mulf8s::return#0 return zp[2]:6 51.0
(signed word) mulf8s::return#2 return zp[2]:6 202.0
(signed word) mulf8s::return#3 return zp[2]:6 202.0
(signed word) mulf8s::return#0 return zp[2]:12 51.0
(signed word) mulf8s::return#2 return zp[2]:12 202.0
(signed word) mulf8s::return#3 return zp[2]:12 202.0
(signed word()) mulf8s_prepared((signed byte) mulf8s_prepared::b)
(byte~) mulf8s_prepared::$12 reg byte a 4.0
(byte~) mulf8s_prepared::$15 reg byte a 4.0
@ -202,11 +206,11 @@
(signed byte) mulf8s_prepared::b
(signed byte) mulf8s_prepared::b#0 b zp[1]:15 0.4
(word) mulf8s_prepared::m
(word) mulf8s_prepared::m#0 m zp[2]:6 2.0
(word) mulf8s_prepared::m#1 m zp[2]:6 4.0
(word) mulf8s_prepared::m#2 m zp[2]:6 4.0
(word) mulf8s_prepared::m#4 m zp[2]:6 1.3333333333333333
(word) mulf8s_prepared::m#5 m zp[2]:6 2.5
(word) mulf8s_prepared::m#0 m zp[2]:12 2.0
(word) mulf8s_prepared::m#1 m zp[2]:12 4.0
(word) mulf8s_prepared::m#2 m zp[2]:12 4.0
(word) mulf8s_prepared::m#4 m zp[2]:12 1.3333333333333333
(word) mulf8s_prepared::m#5 m zp[2]:12 2.5
(const signed byte*) mulf8s_prepared::memA = (signed byte*) 253
(signed word) mulf8s_prepared::return
(void()) mulf8u_prepare((byte) mulf8u_prepare::a)
@ -221,8 +225,8 @@
(const byte*) mulf8u_prepared::memB = (byte*) 255
(const byte*) mulf8u_prepared::resL = (byte*) 254
(word) mulf8u_prepared::return
(word) mulf8u_prepared::return#0 return zp[2]:6 1.3333333333333333
(word) mulf8u_prepared::return#2 return zp[2]:6 4.0
(word) mulf8u_prepared::return#0 return zp[2]:12 1.3333333333333333
(word) mulf8u_prepared::return#2 return zp[2]:12 4.0
(void()) mulf_init()
(byte~) mulf_init::$1 reg byte a 22.0
(byte~) mulf_init::$4 reg byte a 22.0
@ -241,13 +245,13 @@
(byte) mulf_init::c#1 c zp[1]:15 2.5384615384615383
(byte) mulf_init::c#2 c zp[1]:15 11.0
(byte) mulf_init::dir
(byte) mulf_init::dir#2 dir zp[1]:10 4.125
(byte) mulf_init::dir#4 dir zp[1]:10 11.0
(byte) mulf_init::dir#2 dir zp[1]:8 4.125
(byte) mulf_init::dir#4 dir zp[1]:8 11.0
(word) mulf_init::sqr
(word) mulf_init::sqr#1 sqr zp[2]:11 11.0
(word) mulf_init::sqr#2 sqr zp[2]:11 22.0
(word) mulf_init::sqr#3 sqr zp[2]:11 9.166666666666666
(word) mulf_init::sqr#4 sqr zp[2]:11 5.5
(word) mulf_init::sqr#1 sqr zp[2]:12 11.0
(word) mulf_init::sqr#2 sqr zp[2]:12 22.0
(word) mulf_init::sqr#3 sqr zp[2]:12 9.166666666666666
(word) mulf_init::sqr#4 sqr zp[2]:12 5.5
(byte*) mulf_init::sqr1_hi
(byte*) mulf_init::sqr1_hi#1 sqr1_hi zp[2]:16 7.333333333333333
(byte*) mulf_init::sqr1_hi#2 sqr1_hi zp[2]:16 2.75
@ -255,8 +259,8 @@
(byte*) mulf_init::sqr1_lo#1 sqr1_lo zp[2]:6 22.0
(byte*) mulf_init::sqr1_lo#2 sqr1_lo zp[2]:6 3.142857142857143
(byte*) mulf_init::sqr2_hi
(byte*) mulf_init::sqr2_hi#1 sqr2_hi zp[2]:8 3.6666666666666665
(byte*) mulf_init::sqr2_hi#2 sqr2_hi zp[2]:8 8.25
(byte*) mulf_init::sqr2_hi#1 sqr2_hi zp[2]:9 3.6666666666666665
(byte*) mulf_init::sqr2_hi#2 sqr2_hi zp[2]:9 8.25
(byte*) mulf_init::sqr2_lo
(byte*) mulf_init::sqr2_lo#1 sqr2_lo zp[2]:18 22.0
(byte*) mulf_init::sqr2_lo#2 sqr2_lo zp[2]:18 4.888888888888889
@ -288,19 +292,19 @@
(label) prepareBobs::@9
(label) prepareBobs::@return
(byte*) prepareBobs::bob_glyph
(byte*) prepareBobs::bob_glyph#1 bob_glyph zp[2]:16 500.5
(byte*) prepareBobs::bob_glyph#2 bob_glyph zp[2]:16 429.0
(byte*) prepareBobs::bob_glyph#1 bob_glyph zp[2]:6 500.5
(byte*) prepareBobs::bob_glyph#2 bob_glyph zp[2]:6 429.0
(byte*) prepareBobs::bob_table
(byte*) prepareBobs::bob_table#0 bob_table zp[2]:18 202.0
(byte*) prepareBobs::bob_table#1 bob_table zp[2]:18 667.3333333333334
(byte*) prepareBobs::bob_table#2 bob_table zp[2]:18 388.0
(byte*) prepareBobs::bob_table#0 bob_table zp[2]:16 202.0
(byte*) prepareBobs::bob_table#1 bob_table zp[2]:16 667.3333333333334
(byte*) prepareBobs::bob_table#2 bob_table zp[2]:16 388.0
(byte) prepareBobs::bob_table_idx
(byte) prepareBobs::bob_table_idx#1 bob_table_idx zp[1]:4 40.4
(byte) prepareBobs::bob_table_idx#12 bob_table_idx zp[1]:4 19.11764705882353
(byte) prepareBobs::bob_table_idx#6 bob_table_idx zp[1]:4 11.0
(byte) prepareBobs::cell
(byte) prepareBobs::cell#1 cell zp[1]:13 2002.0
(byte) prepareBobs::cell#2 cell zp[1]:13 300.29999999999995
(byte) prepareBobs::cell#1 cell zp[1]:11 2002.0
(byte) prepareBobs::cell#2 cell zp[1]:11 300.29999999999995
(byte) prepareBobs::shift_x
(byte) prepareBobs::shift_x#1 shift_x zp[1]:5 202.0
(byte) prepareBobs::shift_x#2 shift_x zp[1]:5 16.833333333333332
@ -308,11 +312,11 @@
(byte) prepareBobs::shift_y#1 shift_y zp[1]:2 22.0
(byte) prepareBobs::shift_y#2 shift_y zp[1]:2 1.4347826086956523
(byte*) progress_cursor
(byte*) progress_cursor#15 progress_cursor zp[2]:6 11.0
(byte*) progress_cursor#17 progress_cursor zp[2]:6 201.4
(byte*) progress_cursor#24 progress_cursor zp[2]:6 71.11764705882355
(byte*) progress_cursor#31 progress_cursor zp[2]:6 37.33333333333333
(byte*) progress_cursor#8 progress_cursor zp[2]:6 4.0
(byte*) progress_cursor#15 progress_cursor zp[2]:12 11.0
(byte*) progress_cursor#17 progress_cursor zp[2]:12 201.4
(byte*) progress_cursor#24 progress_cursor zp[2]:12 71.11764705882355
(byte*) progress_cursor#31 progress_cursor zp[2]:12 37.33333333333333
(byte*) progress_cursor#8 progress_cursor zp[2]:12 4.0
(byte) progress_idx
(byte) progress_idx#10 progress_idx zp[1]:3 201.0
(byte) progress_idx#16 progress_idx zp[1]:3 11.0
@ -328,34 +332,51 @@
(label) progress_init::@return
(byte*) progress_init::line
(void()) renderBob((byte) renderBob::xpos , (byte) renderBob::ypos)
(byte*~) renderBob::$2 zp[2]:16 4.0
(byte*~) renderBob::$2 zp[2]:12 4.0
(byte~) renderBob::$4 reg byte a 4.0
(byte~) renderBob::$5 zp[1]:14 2.0
(byte~) renderBob::$6 reg byte a 4.0
(byte~) renderBob::$8 reg byte a 4.0
(label) renderBob::@return
(byte) renderBob::bob_table_idx
(byte) renderBob::bob_table_idx#0 reg byte x 2.2222222222222228
(byte) renderBob::bob_table_idx#0 reg byte x 1.8181818181818186
(byte*) renderBob::screen
(byte*) renderBob::screen#0 screen zp[2]:16 1.5384615384615383
(byte*) renderBob::screen#0 screen zp[2]:12 1.4666666666666666
(byte) renderBob::x_char_offset
(byte) renderBob::x_char_offset#0 x_char_offset zp[1]:13 0.8
(byte) renderBob::x_char_offset#0 x_char_offset zp[1]:11 0.8
(byte) renderBob::xpos
(byte) renderBob::xpos#0 xpos zp[1]:15 10.499999999999998
(byte) renderBob::y_char_offset
(byte) renderBob::y_char_offset#0 reg byte a 4.0
(word) renderBob::y_offset
(word) renderBob::y_offset#0 y_offset zp[2]:16 4.0
(word) renderBob::y_offset#0 y_offset zp[2]:12 4.0
(byte) renderBob::ypos
(byte) renderBob::ypos#0 reg byte x 15.000000000000002
(void()) renderBobCleanup()
(byte~) renderBobCleanup::$1 reg byte a 202.0
(label) renderBobCleanup::@1
(label) renderBobCleanup::@return
(byte) renderBobCleanup::i
(byte) renderBobCleanup::i#1 reg byte x 151.5
(byte) renderBobCleanup::i#2 reg byte x 25.25
(byte*) renderBobCleanup::screen
(byte*) renderBobCleanup::screen#0 screen zp[2]:16 112.22222222222223
(byte**) renderBobCleanupNext
(byte**) renderBobCleanupNext#13 renderBobCleanupNext zp[2]:6 7.357142857142858
(byte**) renderBobCleanupNext#17 renderBobCleanupNext zp[2]:6 3.3870967741935485
(void()) renderBobInit()
(word~) renderBobInit::$0 zp[2]:16 16.5
(word~) renderBobInit::$1 zp[2]:16 11.0
(byte~) renderBobInit::$3 reg byte a 22.0
(word~) renderBobInit::$4 zp[2]:18 22.0
(word~) renderBobInit::$5 zp[2]:16 22.0
(byte~) renderBobInit::$4 reg byte a 22.0
(byte~) renderBobInit::$5 reg byte a 22.0
(word~) renderBobInit::$6 zp[2]:18 22.0
(word~) renderBobInit::$7 zp[2]:16 22.0
(label) renderBobInit::@1
(label) renderBobInit::@2
(label) renderBobInit::@return
(byte) renderBobInit::i
(byte) renderBobInit::i#1 reg byte x 16.5
(byte) renderBobInit::i#2 reg byte x 11.0
(byte) renderBobInit::y
(byte) renderBobInit::y#1 reg byte x 16.5
(byte) renderBobInit::y#2 reg byte x 4.714285714285714
@ -384,8 +405,8 @@
(byte) shiftProtoBobRight::carry#10 reg byte y 2002.0
(byte) shiftProtoBobRight::carry#2 reg byte y 286.0
(byte) shiftProtoBobRight::i
(byte) shiftProtoBobRight::i#1 i zp[1]:13 1001.0
(byte) shiftProtoBobRight::i#2 i zp[1]:13 231.0
(byte) shiftProtoBobRight::i#1 i zp[1]:11 1001.0
(byte) shiftProtoBobRight::i#2 i zp[1]:11 231.0
(byte) shiftProtoBobRight::j
(byte) shiftProtoBobRight::j#1 reg byte x 2002.0
(byte) shiftProtoBobRight::j#10 reg byte x 1001.0
@ -395,34 +416,36 @@
reg byte a [ mulf8s::mulf8s_prepare1_a#0 mulf8s::a#1 mulf8s::a#0 ]
reg byte x [ mulf8s::b#2 mulf8s::b#1 mulf8s::b#0 ]
reg byte x [ renderBobCleanup::i#2 renderBobCleanup::i#1 ]
reg byte x [ renderBobInit::y#2 renderBobInit::y#1 ]
zp[1]:2 [ prepareBobs::shift_y#2 prepareBobs::shift_y#1 main::angle#6 main::angle#1 ]
reg byte x [ renderBobInit::i#2 renderBobInit::i#1 ]
zp[1]:2 [ prepareBobs::shift_y#2 prepareBobs::shift_y#1 main::angle#8 main::angle#1 ]
zp[1]:3 [ progress_idx#16 progress_idx#31 progress_idx#25 progress_idx#10 progress_idx#8 main::r#2 main::r#1 ]
zp[1]:4 [ prepareBobs::bob_table_idx#6 prepareBobs::bob_table_idx#12 prepareBobs::bob_table_idx#1 main::a#2 main::a#1 main::a#7 ]
zp[1]:4 [ prepareBobs::bob_table_idx#6 prepareBobs::bob_table_idx#12 prepareBobs::bob_table_idx#1 main::a#2 main::a#6 main::a#1 ]
zp[1]:5 [ prepareBobs::shift_x#2 prepareBobs::shift_x#1 main::i#2 main::i#1 ]
reg byte y [ bobCharsetFindOrAddGlyph::i1#2 bobCharsetFindOrAddGlyph::i1#1 ]
reg byte a [ bobCharsetFindOrAddGlyph::found#2 ]
reg byte x [ shiftProtoBobRight::j#3 shiftProtoBobRight::j#10 shiftProtoBobRight::j#2 shiftProtoBobRight::j#1 ]
reg byte y [ shiftProtoBobRight::carry#2 shiftProtoBobRight::carry#10 ]
reg byte x [ shiftProtoBobDown::i#2 shiftProtoBobDown::i#1 ]
zp[2]:6 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_lo#1 progress_cursor#15 progress_cursor#31 progress_cursor#24 progress_cursor#17 progress_cursor#8 memset::dst#2 memset::dst#1 mulf8s_prepared::m#4 mulf8s_prepared::m#5 mulf8s_prepared::m#1 mulf8s_prepared::m#0 mulf8s_prepared::m#2 mulf8s::return#0 mulf8u_prepared::return#2 mulf8s::return#2 main::$9 mulf8s::return#3 main::$11 mulf8u_prepared::return#0 main::$12 main::y#0 ]
zp[2]:6 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_lo#1 prepareBobs::bob_glyph#2 prepareBobs::bob_glyph#1 bobCharsetFindOrAddGlyph::bob_glyph#10 bobCharsetFindOrAddGlyph::bob_glyph#1 memset::dst#2 memset::dst#1 renderBobCleanupNext#17 renderBobCleanupNext#13 ]
reg byte x [ mulf_init::x_2#3 mulf_init::x_2#2 mulf_init::x_2#1 ]
reg byte x [ mulf_init::x_255#2 mulf_init::x_255#1 ]
zp[2]:8 [ mulf_init::sqr2_hi#2 mulf_init::sqr2_hi#1 bobCharsetFindOrAddGlyph::glyph_cursor#11 bobCharsetFindOrAddGlyph::glyph_cursor#1 ]
zp[1]:10 [ mulf_init::dir#2 mulf_init::dir#4 bobCharsetFindOrAddGlyph::i#2 bobCharsetFindOrAddGlyph::i#1 ]
zp[2]:11 [ main::x#0 mulf_init::sqr#3 mulf_init::sqr#4 mulf_init::sqr#1 mulf_init::sqr#2 ]
zp[1]:8 [ mulf_init::dir#2 mulf_init::dir#4 bobCharsetFindOrAddGlyph::i#2 bobCharsetFindOrAddGlyph::i#1 ]
zp[2]:9 [ main::x#0 mulf_init::sqr2_hi#2 mulf_init::sqr2_hi#1 ]
reg byte x [ renderBob::ypos#0 ]
reg byte a [ keyboard_key_pressed::return#2 ]
reg byte a [ main::$18 ]
reg byte a [ main::$19 ]
reg byte a [ keyboard_key_pressed::return#3 ]
reg byte a [ main::$20 ]
reg byte a [ main::$21 ]
reg byte a [ keyboard_matrix_read::return#2 ]
reg byte a [ keyboard_key_pressed::$2 ]
reg byte a [ keyboard_key_pressed::return#0 ]
reg byte a [ keyboard_matrix_read::return#0 ]
zp[1]:13 [ renderBob::x_char_offset#0 shiftProtoBobRight::i#2 shiftProtoBobRight::i#1 prepareBobs::cell#2 prepareBobs::cell#1 ]
zp[1]:11 [ renderBob::x_char_offset#0 shiftProtoBobRight::i#2 shiftProtoBobRight::i#1 prepareBobs::cell#2 prepareBobs::cell#1 ]
reg byte a [ renderBob::y_char_offset#0 ]
reg byte a [ renderBob::$8 ]
zp[2]:12 [ renderBob::y_offset#0 renderBob::$2 renderBob::screen#0 mulf_init::sqr#3 mulf_init::sqr#4 mulf_init::sqr#1 mulf_init::sqr#2 progress_cursor#15 progress_cursor#31 progress_cursor#24 progress_cursor#17 progress_cursor#8 mulf8s_prepared::m#4 mulf8s_prepared::m#5 mulf8s_prepared::m#1 mulf8s_prepared::m#0 mulf8s_prepared::m#2 mulf8s::return#0 mulf8u_prepared::return#2 mulf8s::return#2 main::$10 mulf8s::return#3 main::$12 mulf8u_prepared::return#0 main::$13 main::y#0 ]
reg byte a [ renderBob::$4 ]
zp[1]:14 [ renderBob::$5 shiftProtoBobRight::carry#1 bobCharsetFindOrAddGlyph::glyph_id#11 bobCharsetFindOrAddGlyph::glyph_id#1 ]
reg byte a [ renderBob::$6 ]
@ -434,9 +457,11 @@ reg byte a [ mulf8s_prepared::$8 ]
reg byte a [ mulf8s_prepared::$15 ]
reg byte a [ mulf8s_prepared::$12 ]
reg byte a [ mulf8s_prepared::$16 ]
zp[2]:16 [ renderBobInit::$0 renderBobInit::$5 renderBobInit::$1 renderBob::y_offset#0 renderBob::$2 renderBob::screen#0 mulf_init::sqr1_hi#2 mulf_init::sqr1_hi#1 prepareBobs::bob_glyph#2 prepareBobs::bob_glyph#1 bobCharsetFindOrAddGlyph::bob_glyph#10 bobCharsetFindOrAddGlyph::bob_glyph#1 ]
zp[2]:18 [ renderBobInit::$4 mulf_init::sqr2_lo#2 mulf_init::sqr2_lo#1 prepareBobs::bob_table#2 prepareBobs::bob_table#1 prepareBobs::bob_table#0 ]
reg byte a [ renderBobInit::$3 ]
reg byte a [ renderBobCleanup::$1 ]
zp[2]:16 [ renderBobInit::$0 renderBobInit::$7 renderBobInit::$1 renderBobCleanup::screen#0 mulf_init::sqr1_hi#2 mulf_init::sqr1_hi#1 prepareBobs::bob_table#2 prepareBobs::bob_table#1 prepareBobs::bob_table#0 ]
zp[2]:18 [ renderBobInit::$6 mulf_init::sqr2_lo#2 mulf_init::sqr2_lo#1 bobCharsetFindOrAddGlyph::glyph_cursor#11 bobCharsetFindOrAddGlyph::glyph_cursor#1 ]
reg byte a [ renderBobInit::$4 ]
reg byte a [ renderBobInit::$5 ]
reg byte a [ bobCharsetFindOrAddGlyph::return#1 ]
reg byte a [ prepareBobs::$6 ]
reg byte a [ shiftProtoBobRight::$1 ]

View File

@ -0,0 +1,644 @@
// Same animation using a multiplexer
.pc = $801 "Basic"
:BasicUpstart(main)
.pc = $80d "Program"
.label SPRITES_XPOS = $d000
.label SPRITES_YPOS = $d001
.label SPRITES_XMSB = $d010
.label RASTER = $d012
.label SPRITES_ENABLE = $d015
.label BORDERCOL = $d020
.label SPRITES_COLS = $d027
.label D011 = $d011
.const VIC_RST8 = $80
.const VIC_DEN = $10
.const VIC_RSEL = 8
// CIA#1 Port A: keyboard matrix columns and joystick #2
.label CIA1_PORT_A = $dc00
// CIA#1 Port B: keyboard matrix rows and joystick #1.
.label CIA1_PORT_B = $dc01
// The colors of the C64
.const BLACK = 0
.const GREEN = 5
// The number of sprites in the multiplexer
.const PLEX_COUNT = $20
.const KEY_SPACE = $3c
// The BASIC screen
.label SCREEN = $400
// The number of BOBs to render
.const NUM_BOBS = $10
.label COS = SIN+$40
// The address of the sprite pointers on the current screen (screen+$3f8).
.label PLEX_SCREEN_PTR = SCREEN+$3f8
// The MSB bit of the next sprite to use for showing
.label plex_sprite_msb = 5
// The index of the sprite that is free next. Since sprites are used round-robin this moves forward each time a sprite is shown.
.label plex_free_next = 2
// The index the next sprite to use for showing (sprites are used round-robin)
.label plex_sprite_idx = 3
// The index in the PLEX tables of the next sprite to show
// Prepare for showing the sprites
.label plex_show_idx = 4
main: {
sei
jsr init
jsr loop
jsr exit
cli
rts
}
// Exit the program
exit: {
b1:
// Wait for space release
jsr keyboard_key_pressed
cmp #0
bne b1
rts
}
// Determines whether a specific key is currently pressed by accessing the matrix directly
// The key is a keyboard code defined from the keyboard matrix by %00rrrccc, where rrr is the row ID (0-7) and ccc is the column ID (0-7)
// All keys exist as as KEY_XXX constants.
// Returns zero if the key is not pressed and a non-zero value if the key is currently pressed
keyboard_key_pressed: {
.const colidx = KEY_SPACE&7
.label rowidx = KEY_SPACE>>3
jsr keyboard_matrix_read
and keyboard_matrix_col_bitmask+colidx
rts
}
// Read a single row of the keyboard matrix
// The row ID (0-7) of the keyboard matrix row to read. See the C64 key matrix for row IDs.
// Returns the keys pressed on the row as bits according to the C64 key matrix.
// Notice: If the C64 normal interrupt is still running it will occasionally interrupt right between the read & write
// leading to erroneous readings. You must disable kill the normal interrupt or sei/cli around calls to the keyboard matrix reader.
keyboard_matrix_read: {
lda keyboard_matrix_row_bitmask+keyboard_key_pressed.rowidx
sta CIA1_PORT_A
lda CIA1_PORT_B
eor #$ff
rts
}
// The main loop
loop: {
.label __1 = 7
.label __2 = 7
.label __5 = 7
.label __6 = 7
.label x = 7
.label y = 7
.label a = 3
.label r = 2
.label i = 4
// Render Rotated BOBs
.label angle = 6
.label plexFreeNextYpos1_return = $11
.label i1 = $12
lda #0
sta.z angle
__b2:
lda RASTER
cmp #$d8
bcc __b2
lda #$f
sta BORDERCOL
lda.z angle
sta.z a
lda #0
sta.z i
lda #$1e
sta.z r
__b4:
//kickasm {{ .break }}
lda #6
sta BORDERCOL
lda.z r
ldy.z a
ldx COS,y
jsr mulf8s
asl.z __2
rol.z __2+1
clc
lda.z x
adc #<$7d*$100
sta.z x
lda.z x+1
adc #>$7d*$100
sta.z x+1
tax
lda.z i
asl
tay
txa
sta PLEX_XPOS,y
lda.z r
ldy.z a
ldx SIN,y
jsr mulf8s
asl.z __6
rol.z __6+1
clc
lda.z y
adc #<$7d*$100
sta.z y
lda.z y+1
adc #>$7d*$100
sta.z y+1
ldy.z i
sta PLEX_YPOS,y
lax.z a
axs #-[$62]
stx.z a
lax.z r
axs #-[3]
stx.z r
inc.z i
lda #NUM_BOBS-1+1
cmp.z i
bne __b4
lda #3
sta BORDERCOL
jsr plexSort
lax.z angle
axs #-[3]
stx.z angle
lda #BLACK
sta BORDERCOL
// Sort the sprites by y-position
__b6:
lda #VIC_RST8
and D011
cmp #0
bne __b6
lda #0
sta.z i1
lda #1
sta.z plex_sprite_msb
lda #0
sta.z plex_show_idx
sta.z plex_sprite_idx
sta.z plex_free_next
// Show the sprites
__b7:
lda #BLACK
sta BORDERCOL
ldy.z plex_free_next
lda PLEX_FREE_YPOS,y
sta.z plexFreeNextYpos1_return
__b8:
lda RASTER
cmp.z plexFreeNextYpos1_return
bcc __b8
inc BORDERCOL
jsr plexShowSprite
inc.z i1
lda #PLEX_COUNT-1+1
cmp.z i1
bne __b7
lda #BLACK
sta BORDERCOL
jsr keyboard_key_pressed
cmp #0
bne __breturn
jmp __b2
__breturn:
rts
}
// Show the next sprite.
// plexSort() prepares showing the sprites
plexShowSprite: {
.label plex_sprite_idx2 = $11
lda.z plex_sprite_idx
asl
sta.z plex_sprite_idx2
ldx.z plex_show_idx
ldy PLEX_SORTED_IDX,x
lda PLEX_YPOS,y
ldy.z plex_sprite_idx2
sta SPRITES_YPOS,y
clc
adc #$15
ldy.z plex_free_next
sta PLEX_FREE_YPOS,y
ldx.z plex_free_next
inx
lda #7
sax.z plex_free_next
ldx.z plex_show_idx
ldy PLEX_SORTED_IDX,x
lda PLEX_PTR,y
ldx.z plex_sprite_idx
sta PLEX_SCREEN_PTR,x
ldy.z plex_show_idx
lda PLEX_SORTED_IDX,y
asl
tax
lda PLEX_XPOS,x
ldy.z plex_sprite_idx2
sta SPRITES_XPOS,y
lda PLEX_XPOS+1,x
cmp #0
bne __b1
lda #$ff
eor.z plex_sprite_msb
and SPRITES_XMSB
sta SPRITES_XMSB
__b2:
ldx.z plex_sprite_idx
inx
lda #7
sax.z plex_sprite_idx
inc.z plex_show_idx
asl.z plex_sprite_msb
lda.z plex_sprite_msb
cmp #0
bne __b5
lda #1
sta.z plex_sprite_msb
rts
__b5:
rts
__b1:
lda SPRITES_XMSB
ora.z plex_sprite_msb
sta SPRITES_XMSB
jmp __b2
}
// Ensure that the indices in PLEX_SORTED_IDX is sorted based on the y-positions in PLEX_YPOS
// Assumes that the positions are nearly sorted already (as each sprite just moves a bit)
// Uses an insertion sort:
// 1. Moves a marker (m) from the start to end of the array. Every time the marker moves forward all elements before the marker are sorted correctly.
// 2a. If the next element after the marker is larger that the current element
// the marker can be moved forwards (as the sorting is correct).
// 2b. If the next element after the marker is smaller than the current element:
// elements before the marker are shifted right one at a time until encountering one smaller than the current one.
// It is then inserted at the spot. Now the marker can move forward.
plexSort: {
.label nxt_idx = $11
.label nxt_y = $12
.label m = 5
lda #0
sta.z m
__b1:
ldy.z m
lda PLEX_SORTED_IDX+1,y
sta.z nxt_idx
tay
lda PLEX_YPOS,y
sta.z nxt_y
ldx.z m
ldy PLEX_SORTED_IDX,x
cmp PLEX_YPOS,y
bcs __b2
__b3:
lda PLEX_SORTED_IDX,x
sta PLEX_SORTED_IDX+1,x
dex
cpx #$ff
beq __b4
lda.z nxt_y
ldy PLEX_SORTED_IDX,x
cmp PLEX_YPOS,y
bcc __b3
__b4:
inx
lda.z nxt_idx
sta PLEX_SORTED_IDX,x
__b2:
inc.z m
lda #PLEX_COUNT-2+1
cmp.z m
bne __b1
ldx #0
plexFreePrepare1___b1:
lda #0
sta PLEX_FREE_YPOS,x
inx
cpx #8
bne plexFreePrepare1___b1
rts
}
// Fast multiply two signed bytes to a word result
// mulf8s(signed byte register(A) a, signed byte register(X) b)
mulf8s: {
.label return = 7
jsr mulf8u_prepare
stx.z mulf8s_prepared.b
jsr mulf8s_prepared
rts
}
// Calculate fast multiply with a prepared unsigned byte to a word result
// The prepared number is set by calling mulf8s_prepare(byte a)
// mulf8s_prepared(signed byte zeropage($12) b)
mulf8s_prepared: {
.label memA = $fd
.label m = 7
.label b = $12
lda.z b
jsr mulf8u_prepared
lda memA
cmp #0
bpl __b1
lda.z m+1
sec
sbc.z b
sta.z m+1
__b1:
lda.z b
cmp #0
bpl __b2
lda.z m+1
sec
sbc memA
sta.z m+1
__b2:
rts
}
// Calculate fast multiply with a prepared unsigned byte to a word result
// The prepared number is set by calling mulf8u_prepare(byte a)
// mulf8u_prepared(byte register(A) b)
mulf8u_prepared: {
.label resL = $fe
.label memB = $ff
.label return = 7
sta memB
tax
sec
sm1:
lda mulf_sqr1_lo,x
sm2:
sbc mulf_sqr2_lo,x
sta resL
sm3:
lda mulf_sqr1_hi,x
sm4:
sbc mulf_sqr2_hi,x
sta memB
lda resL
sta.z return
lda memB
sta.z return+1
rts
}
// Prepare for fast multiply with an unsigned byte to a word result
// mulf8u_prepare(byte register(A) a)
mulf8u_prepare: {
.label memA = $fd
sta memA
sta mulf8u_prepared.sm1+1
sta mulf8u_prepared.sm3+1
eor #$ff
sta mulf8u_prepared.sm2+1
sta mulf8u_prepared.sm4+1
rts
}
// Initialize the program
init: {
.label i = 6
lda #VIC_DEN|VIC_RSEL|3
sta D011
jsr plexInit
lda #0
sta.z i
// Set the sprite pointers & initial positions
__b1:
lda #$ff&SPRITE/$40
ldy.z i
sta PLEX_PTR,y
tya
asl
asl
clc
adc.z i
tax
axs #-[$18]
tya
asl
tay
txa
sta PLEX_XPOS,y
lda.z i
asl
asl
asl
clc
adc #$32
ldy.z i
sta PLEX_YPOS,y
inc.z i
lda #PLEX_COUNT-1+1
cmp.z i
bne __b1
// Enable & initialize sprites
lda #$ff
sta SPRITES_ENABLE
ldx #0
__b3:
lda #GREEN
sta SPRITES_COLS,x
inx
cpx #8
bne __b3
jsr mulf_init
jsr memset
rts
}
// Copies the character c (an unsigned char) to the first num characters of the object pointed to by the argument str.
memset: {
.label str = SCREEN
.const c = ' '
.const num = $3e8
.label end = str+num
.label dst = 7
lda #<str
sta.z dst
lda #>str
sta.z dst+1
__b1:
lda.z dst+1
cmp #>end
bne __b2
lda.z dst
cmp #<end
bne __b2
rts
__b2:
lda #c
ldy #0
sta (dst),y
inc.z dst
bne !+
inc.z dst+1
!:
jmp __b1
}
// Initialize the mulf_sqr multiplication tables with f(x)=int(x*x/4)
mulf_init: {
// x/2
.label c = $12
// Counter used for determining x%2==0
.label sqr1_hi = 9
// Fill mulf_sqr1 = f(x) = int(x*x/4): If f(x) = x*x/4 then f(x+1) = f(x) + x/2 + 1/4
.label sqr = $f
.label sqr1_lo = 7
// Decrease or increase x_255 - initially we decrease
.label sqr2_hi = $d
.label sqr2_lo = $b
//Start with g(0)=f(255)
.label dir = $11
ldx #0
lda #<mulf_sqr1_hi+1
sta.z sqr1_hi
lda #>mulf_sqr1_hi+1
sta.z sqr1_hi+1
txa
sta.z sqr
sta.z sqr+1
sta.z c
lda #<mulf_sqr1_lo+1
sta.z sqr1_lo
lda #>mulf_sqr1_lo+1
sta.z sqr1_lo+1
__b1:
lda.z sqr1_lo+1
cmp #>mulf_sqr1_lo+$200
bne __b2
lda.z sqr1_lo
cmp #<mulf_sqr1_lo+$200
bne __b2
lda #$ff
sta.z dir
lda #<mulf_sqr2_hi
sta.z sqr2_hi
lda #>mulf_sqr2_hi
sta.z sqr2_hi+1
ldx #-1
lda #<mulf_sqr2_lo
sta.z sqr2_lo
lda #>mulf_sqr2_lo
sta.z sqr2_lo+1
__b5:
lda.z sqr2_lo+1
cmp #>mulf_sqr2_lo+$1ff
bne __b6
lda.z sqr2_lo
cmp #<mulf_sqr2_lo+$1ff
bne __b6
// Set the very last value g(511) = f(256)
lda mulf_sqr1_lo+$100
sta mulf_sqr2_lo+$1ff
lda mulf_sqr1_hi+$100
sta mulf_sqr2_hi+$1ff
rts
__b6:
lda mulf_sqr1_lo,x
ldy #0
sta (sqr2_lo),y
lda mulf_sqr1_hi,x
sta (sqr2_hi),y
inc.z sqr2_hi
bne !+
inc.z sqr2_hi+1
!:
txa
clc
adc.z dir
tax
cpx #0
bne __b8
lda #1
sta.z dir
__b8:
inc.z sqr2_lo
bne !+
inc.z sqr2_lo+1
!:
jmp __b5
__b2:
inc.z c
lda #1
and.z c
cmp #0
bne __b3
inx
inc.z sqr
bne !+
inc.z sqr+1
!:
__b3:
lda.z sqr
ldy #0
sta (sqr1_lo),y
lda.z sqr+1
sta (sqr1_hi),y
inc.z sqr1_hi
bne !+
inc.z sqr1_hi+1
!:
txa
clc
adc.z sqr
sta.z sqr
bcc !+
inc.z sqr+1
!:
inc.z sqr1_lo
bne !+
inc.z sqr1_lo+1
!:
jmp __b1
}
// Initialize the multiplexer data structures
plexInit: {
ldx #0
__b1:
txa
sta PLEX_SORTED_IDX,x
inx
cpx #PLEX_COUNT-1+1
bne __b1
rts
}
// The x-positions of the multiplexer sprites ($000-$1ff)
PLEX_XPOS: .fill 2*PLEX_COUNT, 0
// The y-positions of the multiplexer sprites.
PLEX_YPOS: .fill PLEX_COUNT, 0
// The sprite pointers for the multiplexed sprites
PLEX_PTR: .fill PLEX_COUNT, 0
// Indexes of the plex-sprites sorted by sprite y-position. Each call to plexSort() will fix the sorting if changes to the Y-positions have ruined it.
PLEX_SORTED_IDX: .fill PLEX_COUNT, 0
// Contains the Y-position where each sprite is free again. PLEX_FREE_YPOS[s] holds the Y-position where sprite s is free to use again.
PLEX_FREE_YPOS: .fill 8, 0
// mulf_sqr tables will contain f(x)=int(x*x/4) and g(x) = f(x-255).
// <f(x) = <(( x * x )/4)
.align $100
mulf_sqr1_lo: .fill $200, 0
// >f(x) = >(( x * x )/4)
.align $100
mulf_sqr1_hi: .fill $200, 0
// <g(x) = <((( x - 255) * ( x - 255 ))/4)
.align $100
mulf_sqr2_lo: .fill $200, 0
// >g(x) = >((( x - 255) * ( x - 255 ))/4)
.align $100
mulf_sqr2_hi: .fill $200, 0
// Keyboard row bitmask as expected by CIA#1 Port A when reading a specific keyboard matrix row (rows are numbered 0-7)
keyboard_matrix_row_bitmask: .byte $fe, $fd, $fb, $f7, $ef, $df, $bf, $7f
// Keyboard matrix column bitmasks for a specific keybooard matrix column when reading the keyboard. (columns are numbered 0-7)
keyboard_matrix_col_bitmask: .byte 1, 2, 4, 8, $10, $20, $40, $80
// The BOB sprite
.align $1000
SPRITE:
.var pic = LoadPicture("smiley.png", List().add($000000, $ffffff))
.for (var y=0; y<21; y++)
.for (var x=0;x<3; x++)
.byte pic.getSinglecolorByte(x,y)
// Sine and Cosine tables
// Angles: $00=0, $80=PI,$100=2*PI
// Sine/Cosine: signed fixed [-$7f,$7f]
.align $40
SIN:
.for(var i=0;i<$140;i++)
.byte >round($7fff*sin(i*2*PI/256))

View File

@ -0,0 +1,453 @@
@begin: scope:[] from
[0] phi()
to:@1
@1: scope:[] from @begin
[1] phi()
[2] call main
to:@end
@end: scope:[] from @1
[3] phi()
(void()) main()
main: scope:[main] from @1
asm { sei }
[5] call init
to:main::@1
main::@1: scope:[main] from main
[6] phi()
[7] call loop
to:main::@2
main::@2: scope:[main] from main::@1
[8] phi()
[9] call exit
to:main::@3
main::@3: scope:[main] from main::@2
asm { cli }
to:main::@return
main::@return: scope:[main] from main::@3
[11] return
to:@return
(void()) exit()
exit: scope:[exit] from main::@2
[12] phi()
to:exit::@1
exit::@1: scope:[exit] from exit exit::@2
[13] phi()
[14] call keyboard_key_pressed
[15] (byte) keyboard_key_pressed::return#2 ← (byte) keyboard_key_pressed::return#0
to:exit::@2
exit::@2: scope:[exit] from exit::@1
[16] (byte~) exit::$0 ← (byte) keyboard_key_pressed::return#2
[17] if((byte) 0!=(byte~) exit::$0) goto exit::@1
to:exit::@return
exit::@return: scope:[exit] from exit::@2
[18] return
to:@return
(byte()) keyboard_key_pressed((byte) keyboard_key_pressed::key)
keyboard_key_pressed: scope:[keyboard_key_pressed] from exit::@1 loop::@10
[19] phi()
[20] call keyboard_matrix_read
[21] (byte) keyboard_matrix_read::return#2 ← (byte) keyboard_matrix_read::return#0
to:keyboard_key_pressed::@1
keyboard_key_pressed::@1: scope:[keyboard_key_pressed] from keyboard_key_pressed
[22] (byte~) keyboard_key_pressed::$2 ← (byte) keyboard_matrix_read::return#2
[23] (byte) keyboard_key_pressed::return#0 ← (byte~) keyboard_key_pressed::$2 & *((const byte*) keyboard_matrix_col_bitmask+(const byte) keyboard_key_pressed::colidx#0)
to:keyboard_key_pressed::@return
keyboard_key_pressed::@return: scope:[keyboard_key_pressed] from keyboard_key_pressed::@1
[24] return
to:@return
(byte()) keyboard_matrix_read((byte) keyboard_matrix_read::rowid)
keyboard_matrix_read: scope:[keyboard_matrix_read] from keyboard_key_pressed
[25] *((const byte*) CIA1_PORT_A) ← *((const byte*) keyboard_matrix_row_bitmask+(const byte) keyboard_key_pressed::rowidx#0)
[26] (byte) keyboard_matrix_read::return#0 ← ~ *((const byte*) CIA1_PORT_B)
to:keyboard_matrix_read::@return
keyboard_matrix_read::@return: scope:[keyboard_matrix_read] from keyboard_matrix_read
[27] return
to:@return
(void()) loop()
loop: scope:[loop] from main::@1
[28] phi()
to:loop::@1
loop::@1: scope:[loop] from loop loop::@15
[29] (byte) loop::angle#6 ← phi( loop/(byte) 0 loop::@15/(byte) loop::angle#1 )
to:loop::@2
loop::@2: scope:[loop] from loop::@1 loop::@2
[30] if(*((const byte*) RASTER)<(byte) $d8) goto loop::@2
to:loop::@3
loop::@3: scope:[loop] from loop::@2
[31] *((const byte*) BORDERCOL) ← (byte) $f
[32] (byte) loop::a#6 ← (byte) loop::angle#6
to:loop::@4
loop::@4: scope:[loop] from loop::@12 loop::@3
[33] (byte) loop::i#2 ← phi( loop::@12/(byte) loop::i#1 loop::@3/(byte) 0 )
[33] (byte) loop::a#2 ← phi( loop::@12/(byte) loop::a#1 loop::@3/(byte) loop::a#6 )
[33] (signed byte) loop::r#2 ← phi( loop::@12/(signed byte) loop::r#1 loop::@3/(signed byte) $1e )
[34] *((const byte*) BORDERCOL) ← (byte) 6
[35] (signed byte) mulf8s::a#0 ← (signed byte) loop::r#2
[36] (signed byte) mulf8s::b#0 ← *((const signed byte*) COS + (byte) loop::a#2)
[37] call mulf8s
[38] (signed word) mulf8s::return#2 ← (signed word) mulf8s::return#0
to:loop::@11
loop::@11: scope:[loop] from loop::@4
[39] (signed word~) loop::$1 ← (signed word) mulf8s::return#2
[40] (signed word~) loop::$2 ← (signed word~) loop::$1 << (byte) 1
[41] (signed word) loop::x#0 ← (signed word~) loop::$2 + (signed word)(number) $7d*(number) $100
[42] (byte~) loop::$4 ← > (signed word) loop::x#0
[43] (byte~) loop::$20 ← (byte) loop::i#2 << (byte) 1
[44] *((const word*) PLEX_XPOS + (byte~) loop::$20) ← (byte~) loop::$4
[45] (signed byte) mulf8s::a#1 ← (signed byte) loop::r#2
[46] (signed byte) mulf8s::b#1 ← *((const signed byte*) SIN + (byte) loop::a#2)
[47] call mulf8s
[48] (signed word) mulf8s::return#3 ← (signed word) mulf8s::return#0
to:loop::@12
loop::@12: scope:[loop] from loop::@11
[49] (signed word~) loop::$5 ← (signed word) mulf8s::return#3
[50] (signed word~) loop::$6 ← (signed word~) loop::$5 << (byte) 1
[51] (signed word) loop::y#0 ← (signed word~) loop::$6 + (signed word)(number) $7d*(number) $100
[52] (byte~) loop::$8 ← > (signed word) loop::y#0
[53] *((const byte*) PLEX_YPOS + (byte) loop::i#2) ← (byte~) loop::$8
[54] (byte) loop::a#1 ← (byte) loop::a#2 + (byte) $62
[55] (signed byte) loop::r#1 ← (signed byte) loop::r#2 + (signed byte) 3
[56] (byte) loop::i#1 ← ++ (byte) loop::i#2
[57] if((byte) loop::i#1!=(const byte) NUM_BOBS-(byte) 1+(byte) 1) goto loop::@4
to:loop::@5
loop::@5: scope:[loop] from loop::@12
[58] *((const byte*) BORDERCOL) ← (byte) 3
[59] call plexSort
to:loop::@13
loop::@13: scope:[loop] from loop::@5
[60] (byte) loop::angle#1 ← (byte) loop::angle#6 + (byte) 3
[61] *((const byte*) BORDERCOL) ← (const byte) BLACK
to:loop::@6
loop::@6: scope:[loop] from loop::@13 loop::@6
[62] (byte~) loop::$11 ← *((const byte*) D011) & (const byte) VIC_RST8
[63] if((byte~) loop::$11!=(byte) 0) goto loop::@6
to:loop::@7
loop::@7: scope:[loop] from loop::@14 loop::@6
[64] (byte) loop::i1#5 ← phi( loop::@6/(byte) 0 loop::@14/(byte) loop::i1#1 )
[64] (byte) plex_sprite_msb#43 ← phi( loop::@6/(byte) 1 loop::@14/(byte) plex_sprite_msb#16 )
[64] (byte) plex_show_idx#43 ← phi( loop::@6/(byte) 0 loop::@14/(byte) plex_show_idx#15 )
[64] (byte) plex_sprite_idx#43 ← phi( loop::@6/(byte) 0 loop::@14/(byte) plex_sprite_idx#15 )
[64] (byte) plex_free_next#17 ← phi( loop::@6/(byte) 0 loop::@14/(byte) plex_free_next#13 )
[65] *((const byte*) BORDERCOL) ← (const byte) BLACK
to:loop::plexFreeNextYpos1
loop::plexFreeNextYpos1: scope:[loop] from loop::@7
[66] (byte) loop::plexFreeNextYpos1_return#0 ← *((const byte*) PLEX_FREE_YPOS + (byte) plex_free_next#17)
to:loop::@8
loop::@8: scope:[loop] from loop::@8 loop::plexFreeNextYpos1
[67] if(*((const byte*) RASTER)<(byte) loop::plexFreeNextYpos1_return#0) goto loop::@8
to:loop::@9
loop::@9: scope:[loop] from loop::@8
[68] *((const byte*) BORDERCOL) ← ++ *((const byte*) BORDERCOL)
[69] call plexShowSprite
to:loop::@14
loop::@14: scope:[loop] from loop::@9
[70] (byte) loop::i1#1 ← ++ (byte) loop::i1#5
[71] if((byte) loop::i1#1!=(const byte) PLEX_COUNT-(byte) 1+(byte) 1) goto loop::@7
to:loop::@10
loop::@10: scope:[loop] from loop::@14
[72] *((const byte*) BORDERCOL) ← (const byte) BLACK
[73] call keyboard_key_pressed
[74] (byte) keyboard_key_pressed::return#3 ← (byte) keyboard_key_pressed::return#0
to:loop::@15
loop::@15: scope:[loop] from loop::@10
[75] (byte~) loop::$18 ← (byte) keyboard_key_pressed::return#3
[76] if((byte) 0!=(byte~) loop::$18) goto loop::@return
to:loop::@1
loop::@return: scope:[loop] from loop::@15
[77] return
to:@return
(void()) plexShowSprite()
plexShowSprite: scope:[plexShowSprite] from loop::@9
[78] (byte) plexShowSprite::plex_sprite_idx2#0 ← (byte) plex_sprite_idx#43 << (byte) 1
[79] (byte) plexShowSprite::plexFreeAdd1_ypos#0 ← *((const byte*) PLEX_YPOS + *((const byte*) PLEX_SORTED_IDX + (byte) plex_show_idx#43))
[80] *((const byte*) SPRITES_YPOS + (byte) plexShowSprite::plex_sprite_idx2#0) ← (byte) plexShowSprite::plexFreeAdd1_ypos#0
to:plexShowSprite::plexFreeAdd1
plexShowSprite::plexFreeAdd1: scope:[plexShowSprite] from plexShowSprite
[81] (byte~) plexShowSprite::plexFreeAdd1_$0 ← (byte) plexShowSprite::plexFreeAdd1_ypos#0 + (byte) $15
[82] *((const byte*) PLEX_FREE_YPOS + (byte) plex_free_next#17) ← (byte~) plexShowSprite::plexFreeAdd1_$0
[83] (byte~) plexShowSprite::plexFreeAdd1_$1 ← (byte) plex_free_next#17 + (byte) 1
[84] (byte) plex_free_next#13 ← (byte~) plexShowSprite::plexFreeAdd1_$1 & (byte) 7
to:plexShowSprite::@4
plexShowSprite::@4: scope:[plexShowSprite] from plexShowSprite::plexFreeAdd1
[85] *((const byte*) PLEX_SCREEN_PTR#1 + (byte) plex_sprite_idx#43) ← *((const byte*) PLEX_PTR + *((const byte*) PLEX_SORTED_IDX + (byte) plex_show_idx#43))
[86] (byte) plexShowSprite::xpos_idx#0 ← *((const byte*) PLEX_SORTED_IDX + (byte) plex_show_idx#43)
[87] (byte~) plexShowSprite::$11 ← (byte) plexShowSprite::xpos_idx#0 << (byte) 1
[88] (byte~) plexShowSprite::$2 ← < *((const word*) PLEX_XPOS + (byte~) plexShowSprite::$11)
[89] *((const byte*) SPRITES_XPOS + (byte) plexShowSprite::plex_sprite_idx2#0) ← (byte~) plexShowSprite::$2
[90] (byte~) plexShowSprite::$3 ← > *((const word*) PLEX_XPOS + (byte~) plexShowSprite::$11)
[91] if((byte~) plexShowSprite::$3!=(byte) 0) goto plexShowSprite::@1
to:plexShowSprite::@3
plexShowSprite::@3: scope:[plexShowSprite] from plexShowSprite::@4
[92] (byte~) plexShowSprite::$9 ← (byte) $ff ^ (byte) plex_sprite_msb#43
[93] *((const byte*) SPRITES_XMSB) ← *((const byte*) SPRITES_XMSB) & (byte~) plexShowSprite::$9
to:plexShowSprite::@2
plexShowSprite::@2: scope:[plexShowSprite] from plexShowSprite::@1 plexShowSprite::@3
[94] (byte~) plexShowSprite::$5 ← (byte) plex_sprite_idx#43 + (byte) 1
[95] (byte) plex_sprite_idx#15 ← (byte~) plexShowSprite::$5 & (byte) 7
[96] (byte) plex_show_idx#15 ← ++ (byte) plex_show_idx#43
[97] (byte) plex_sprite_msb#3 ← (byte) plex_sprite_msb#43 << (byte) 1
[98] if((byte) plex_sprite_msb#3!=(byte) 0) goto plexShowSprite::@5
to:plexShowSprite::@return
plexShowSprite::@5: scope:[plexShowSprite] from plexShowSprite::@2
[99] phi()
to:plexShowSprite::@return
plexShowSprite::@return: scope:[plexShowSprite] from plexShowSprite::@2 plexShowSprite::@5
[100] (byte) plex_sprite_msb#16 ← phi( plexShowSprite::@5/(byte) plex_sprite_msb#3 plexShowSprite::@2/(byte) 1 )
[101] return
to:@return
plexShowSprite::@1: scope:[plexShowSprite] from plexShowSprite::@4
[102] *((const byte*) SPRITES_XMSB) ← *((const byte*) SPRITES_XMSB) | (byte) plex_sprite_msb#43
to:plexShowSprite::@2
(void()) plexSort()
plexSort: scope:[plexSort] from loop::@5
[103] phi()
to:plexSort::@1
plexSort::@1: scope:[plexSort] from plexSort plexSort::@2
[104] (byte) plexSort::m#2 ← phi( plexSort/(byte) 0 plexSort::@2/(byte) plexSort::m#1 )
[105] (byte) plexSort::nxt_idx#0 ← *((const byte*) PLEX_SORTED_IDX+(byte) 1 + (byte) plexSort::m#2)
[106] (byte) plexSort::nxt_y#0 ← *((const byte*) PLEX_YPOS + (byte) plexSort::nxt_idx#0)
[107] if((byte) plexSort::nxt_y#0>=*((const byte*) PLEX_YPOS + *((const byte*) PLEX_SORTED_IDX + (byte) plexSort::m#2))) goto plexSort::@2
to:plexSort::@5
plexSort::@5: scope:[plexSort] from plexSort::@1
[108] (byte) plexSort::s#6 ← (byte) plexSort::m#2
to:plexSort::@3
plexSort::@3: scope:[plexSort] from plexSort::@5 plexSort::@6
[109] (byte) plexSort::s#3 ← phi( plexSort::@6/(byte) plexSort::s#1 plexSort::@5/(byte) plexSort::s#6 )
[110] *((const byte*) PLEX_SORTED_IDX+(byte) 1 + (byte) plexSort::s#3) ← *((const byte*) PLEX_SORTED_IDX + (byte) plexSort::s#3)
[111] (byte) plexSort::s#1 ← -- (byte) plexSort::s#3
[112] if((byte) plexSort::s#1==(byte) $ff) goto plexSort::@4
to:plexSort::@6
plexSort::@6: scope:[plexSort] from plexSort::@3
[113] if((byte) plexSort::nxt_y#0<*((const byte*) PLEX_YPOS + *((const byte*) PLEX_SORTED_IDX + (byte) plexSort::s#1))) goto plexSort::@3
to:plexSort::@4
plexSort::@4: scope:[plexSort] from plexSort::@3 plexSort::@6
[114] (byte) plexSort::s#2 ← ++ (byte) plexSort::s#1
[115] *((const byte*) PLEX_SORTED_IDX + (byte) plexSort::s#2) ← (byte) plexSort::nxt_idx#0
to:plexSort::@2
plexSort::@2: scope:[plexSort] from plexSort::@1 plexSort::@4
[116] (byte) plexSort::m#1 ← ++ (byte) plexSort::m#2
[117] if((byte) plexSort::m#1!=(const byte) PLEX_COUNT-(byte) 2+(byte) 1) goto plexSort::@1
to:plexSort::plexFreePrepare1
plexSort::plexFreePrepare1: scope:[plexSort] from plexSort::@2
[118] phi()
to:plexSort::plexFreePrepare1_@1
plexSort::plexFreePrepare1_@1: scope:[plexSort] from plexSort::plexFreePrepare1 plexSort::plexFreePrepare1_@1
[119] (byte) plexSort::plexFreePrepare1_s#2 ← phi( plexSort::plexFreePrepare1/(byte) 0 plexSort::plexFreePrepare1_@1/(byte) plexSort::plexFreePrepare1_s#1 )
[120] *((const byte*) PLEX_FREE_YPOS + (byte) plexSort::plexFreePrepare1_s#2) ← (byte) 0
[121] (byte) plexSort::plexFreePrepare1_s#1 ← ++ (byte) plexSort::plexFreePrepare1_s#2
[122] if((byte) plexSort::plexFreePrepare1_s#1!=(byte) 8) goto plexSort::plexFreePrepare1_@1
to:plexSort::@return
plexSort::@return: scope:[plexSort] from plexSort::plexFreePrepare1_@1
[123] return
to:@return
(signed word()) mulf8s((signed byte) mulf8s::a , (signed byte) mulf8s::b)
mulf8s: scope:[mulf8s] from loop::@11 loop::@4
[124] (signed byte) mulf8s::b#2 ← phi( loop::@11/(signed byte) mulf8s::b#1 loop::@4/(signed byte) mulf8s::b#0 )
[124] (signed byte) mulf8s::mulf8s_prepare1_a#0 ← phi( loop::@11/(signed byte) mulf8s::a#1 loop::@4/(signed byte) mulf8s::a#0 )
to:mulf8s::mulf8s_prepare1
mulf8s::mulf8s_prepare1: scope:[mulf8s] from mulf8s
[125] (byte) mulf8u_prepare::a#0 ← (byte)(signed byte) mulf8s::mulf8s_prepare1_a#0
[126] call mulf8u_prepare
to:mulf8s::@1
mulf8s::@1: scope:[mulf8s] from mulf8s::mulf8s_prepare1
[127] (signed byte) mulf8s_prepared::b#0 ← (signed byte) mulf8s::b#2
[128] call mulf8s_prepared
to:mulf8s::@2
mulf8s::@2: scope:[mulf8s] from mulf8s::@1
[129] (signed word) mulf8s::return#0 ← (signed word)(word) mulf8s_prepared::m#4
to:mulf8s::@return
mulf8s::@return: scope:[mulf8s] from mulf8s::@2
[130] return
to:@return
(signed word()) mulf8s_prepared((signed byte) mulf8s_prepared::b)
mulf8s_prepared: scope:[mulf8s_prepared] from mulf8s::@1
[131] (byte) mulf8u_prepared::b#0 ← (byte)(signed byte) mulf8s_prepared::b#0
[132] call mulf8u_prepared
[133] (word) mulf8u_prepared::return#2 ← (word) mulf8u_prepared::return#0
to:mulf8s_prepared::@5
mulf8s_prepared::@5: scope:[mulf8s_prepared] from mulf8s_prepared
[134] (word) mulf8s_prepared::m#0 ← (word) mulf8u_prepared::return#2
[135] if(*((const signed byte*) mulf8s_prepared::memA)>=(signed byte) 0) goto mulf8s_prepared::@1
to:mulf8s_prepared::@3
mulf8s_prepared::@3: scope:[mulf8s_prepared] from mulf8s_prepared::@5
[136] (byte~) mulf8s_prepared::$8 ← > (word) mulf8s_prepared::m#0
[137] (byte~) mulf8s_prepared::$15 ← (byte~) mulf8s_prepared::$8 - (byte)(signed byte) mulf8s_prepared::b#0
[138] (word) mulf8s_prepared::m#1 ← (word) mulf8s_prepared::m#0 hi= (byte~) mulf8s_prepared::$15
to:mulf8s_prepared::@1
mulf8s_prepared::@1: scope:[mulf8s_prepared] from mulf8s_prepared::@3 mulf8s_prepared::@5
[139] (word) mulf8s_prepared::m#5 ← phi( mulf8s_prepared::@3/(word) mulf8s_prepared::m#1 mulf8s_prepared::@5/(word) mulf8s_prepared::m#0 )
[140] if((signed byte) mulf8s_prepared::b#0>=(signed byte) 0) goto mulf8s_prepared::@2
to:mulf8s_prepared::@4
mulf8s_prepared::@4: scope:[mulf8s_prepared] from mulf8s_prepared::@1
[141] (byte~) mulf8s_prepared::$12 ← > (word) mulf8s_prepared::m#5
[142] (byte~) mulf8s_prepared::$16 ← (byte~) mulf8s_prepared::$12 - (byte)*((const signed byte*) mulf8s_prepared::memA)
[143] (word) mulf8s_prepared::m#2 ← (word) mulf8s_prepared::m#5 hi= (byte~) mulf8s_prepared::$16
to:mulf8s_prepared::@2
mulf8s_prepared::@2: scope:[mulf8s_prepared] from mulf8s_prepared::@1 mulf8s_prepared::@4
[144] (word) mulf8s_prepared::m#4 ← phi( mulf8s_prepared::@1/(word) mulf8s_prepared::m#5 mulf8s_prepared::@4/(word) mulf8s_prepared::m#2 )
to:mulf8s_prepared::@return
mulf8s_prepared::@return: scope:[mulf8s_prepared] from mulf8s_prepared::@2
[145] return
to:@return
(word()) mulf8u_prepared((byte) mulf8u_prepared::b)
mulf8u_prepared: scope:[mulf8u_prepared] from mulf8s_prepared
[146] *((const byte*) mulf8u_prepared::memB) ← (byte) mulf8u_prepared::b#0
asm { ldxmemB sec sm1: ldamulf_sqr1_lo,x sm2: sbcmulf_sqr2_lo,x staresL sm3: ldamulf_sqr1_hi,x sm4: sbcmulf_sqr2_hi,x stamemB }
[148] (word) mulf8u_prepared::return#0 ← *((const byte*) mulf8u_prepared::memB) w= *((const byte*) mulf8u_prepared::resL)
to:mulf8u_prepared::@return
mulf8u_prepared::@return: scope:[mulf8u_prepared] from mulf8u_prepared
[149] return
to:@return
(void()) mulf8u_prepare((byte) mulf8u_prepare::a)
mulf8u_prepare: scope:[mulf8u_prepare] from mulf8s::mulf8s_prepare1
[150] *((const byte*) mulf8u_prepare::memA) ← (byte) mulf8u_prepare::a#0
asm { ldamemA stamulf8u_prepared.sm1+1 stamulf8u_prepared.sm3+1 eor#$ff stamulf8u_prepared.sm2+1 stamulf8u_prepared.sm4+1 }
to:mulf8u_prepare::@return
mulf8u_prepare::@return: scope:[mulf8u_prepare] from mulf8u_prepare
[152] return
to:@return
(void()) init()
init: scope:[init] from main
[153] *((const byte*) D011) ← (const byte) VIC_DEN|(const byte) VIC_RSEL|(byte) 3
[154] call plexInit
to:init::@1
init::@1: scope:[init] from init init::@1
[155] (byte) init::i#2 ← phi( init::@1/(byte) init::i#1 init/(byte) 0 )
[156] *((const byte*) PLEX_PTR + (byte) init::i#2) ← (byte)(const byte*) SPRITE/(byte) $40
[157] (byte~) init::$10 ← (byte) init::i#2 << (byte) 2
[158] (byte~) init::$3 ← (byte~) init::$10 + (byte) init::i#2
[159] (byte~) init::$4 ← (byte) $18 + (byte~) init::$3
[160] (byte~) init::$9 ← (byte) init::i#2 << (byte) 1
[161] *((const word*) PLEX_XPOS + (byte~) init::$9) ← (byte~) init::$4
[162] (byte~) init::$5 ← (byte) init::i#2 << (byte) 3
[163] (byte~) init::$6 ← (byte) $32 + (byte~) init::$5
[164] *((const byte*) PLEX_YPOS + (byte) init::i#2) ← (byte~) init::$6
[165] (byte) init::i#1 ← ++ (byte) init::i#2
[166] if((byte) init::i#1!=(const byte) PLEX_COUNT-(byte) 1+(byte) 1) goto init::@1
to:init::@2
init::@2: scope:[init] from init::@1
[167] *((const byte*) SPRITES_ENABLE) ← (byte) $ff
to:init::@3
init::@3: scope:[init] from init::@2 init::@3
[168] (byte) init::i1#2 ← phi( init::@2/(byte) 0 init::@3/(byte) init::i1#1 )
[169] *((const byte*) SPRITES_COLS + (byte) init::i1#2) ← (const byte) GREEN
[170] (byte) init::i1#1 ← ++ (byte) init::i1#2
[171] if((byte) init::i1#1!=(byte) 8) goto init::@3
to:init::@4
init::@4: scope:[init] from init::@3
[172] phi()
[173] call mulf_init
to:init::@5
init::@5: scope:[init] from init::@4
[174] phi()
[175] call memset
to:init::@return
init::@return: scope:[init] from init::@5
[176] return
to:@return
(void*()) memset((void*) memset::str , (byte) memset::c , (word) memset::num)
memset: scope:[memset] from init::@5
[177] phi()
to:memset::@1
memset::@1: scope:[memset] from memset memset::@2
[178] (byte*) memset::dst#2 ← phi( memset/(byte*)(const void*) memset::str#0 memset::@2/(byte*) memset::dst#1 )
[179] if((byte*) memset::dst#2!=(const byte*) memset::end#0) goto memset::@2
to:memset::@return
memset::@return: scope:[memset] from memset::@1
[180] return
to:@return
memset::@2: scope:[memset] from memset::@1
[181] *((byte*) memset::dst#2) ← (const byte) memset::c#0
[182] (byte*) memset::dst#1 ← ++ (byte*) memset::dst#2
to:memset::@1
(void()) mulf_init()
mulf_init: scope:[mulf_init] from init::@4
[183] phi()
to:mulf_init::@1
mulf_init::@1: scope:[mulf_init] from mulf_init mulf_init::@3
[184] (byte) mulf_init::x_2#3 ← phi( mulf_init/(byte) 0 mulf_init::@3/(byte) mulf_init::x_2#2 )
[184] (byte*) mulf_init::sqr1_hi#2 ← phi( mulf_init/(const byte*) mulf_sqr1_hi+(byte) 1 mulf_init::@3/(byte*) mulf_init::sqr1_hi#1 )
[184] (word) mulf_init::sqr#4 ← phi( mulf_init/(byte) 0 mulf_init::@3/(word) mulf_init::sqr#1 )
[184] (byte) mulf_init::c#2 ← phi( mulf_init/(byte) 0 mulf_init::@3/(byte) mulf_init::c#1 )
[184] (byte*) mulf_init::sqr1_lo#2 ← phi( mulf_init/(const byte*) mulf_sqr1_lo+(byte) 1 mulf_init::@3/(byte*) mulf_init::sqr1_lo#1 )
[185] if((byte*) mulf_init::sqr1_lo#2!=(const byte*) mulf_sqr1_lo+(word) $200) goto mulf_init::@2
to:mulf_init::@5
mulf_init::@5: scope:[mulf_init] from mulf_init::@1 mulf_init::@8
[186] (byte) mulf_init::dir#2 ← phi( mulf_init::@8/(byte) mulf_init::dir#4 mulf_init::@1/(byte) $ff )
[186] (byte*) mulf_init::sqr2_hi#2 ← phi( mulf_init::@8/(byte*) mulf_init::sqr2_hi#1 mulf_init::@1/(const byte*) mulf_sqr2_hi )
[186] (byte) mulf_init::x_255#2 ← phi( mulf_init::@8/(byte) mulf_init::x_255#1 mulf_init::@1/(byte) -1 )
[186] (byte*) mulf_init::sqr2_lo#2 ← phi( mulf_init::@8/(byte*) mulf_init::sqr2_lo#1 mulf_init::@1/(const byte*) mulf_sqr2_lo )
[187] if((byte*) mulf_init::sqr2_lo#2!=(const byte*) mulf_sqr2_lo+(word) $1ff) goto mulf_init::@6
to:mulf_init::@7
mulf_init::@7: scope:[mulf_init] from mulf_init::@5
[188] *((const byte*) mulf_sqr2_lo+(word) $1ff) ← *((const byte*) mulf_sqr1_lo+(word) $100)
[189] *((const byte*) mulf_sqr2_hi+(word) $1ff) ← *((const byte*) mulf_sqr1_hi+(word) $100)
to:mulf_init::@return
mulf_init::@return: scope:[mulf_init] from mulf_init::@7
[190] return
to:@return
mulf_init::@6: scope:[mulf_init] from mulf_init::@5
[191] *((byte*) mulf_init::sqr2_lo#2) ← *((const byte*) mulf_sqr1_lo + (byte) mulf_init::x_255#2)
[192] *((byte*) mulf_init::sqr2_hi#2) ← *((const byte*) mulf_sqr1_hi + (byte) mulf_init::x_255#2)
[193] (byte*) mulf_init::sqr2_hi#1 ← ++ (byte*) mulf_init::sqr2_hi#2
[194] (byte) mulf_init::x_255#1 ← (byte) mulf_init::x_255#2 + (byte) mulf_init::dir#2
[195] if((byte) mulf_init::x_255#1!=(byte) 0) goto mulf_init::@9
to:mulf_init::@8
mulf_init::@9: scope:[mulf_init] from mulf_init::@6
[196] phi()
to:mulf_init::@8
mulf_init::@8: scope:[mulf_init] from mulf_init::@6 mulf_init::@9
[197] (byte) mulf_init::dir#4 ← phi( mulf_init::@9/(byte) mulf_init::dir#2 mulf_init::@6/(byte) 1 )
[198] (byte*) mulf_init::sqr2_lo#1 ← ++ (byte*) mulf_init::sqr2_lo#2
to:mulf_init::@5
mulf_init::@2: scope:[mulf_init] from mulf_init::@1
[199] (byte) mulf_init::c#1 ← ++ (byte) mulf_init::c#2
[200] (byte~) mulf_init::$1 ← (byte) mulf_init::c#1 & (byte) 1
[201] if((byte~) mulf_init::$1!=(byte) 0) goto mulf_init::@3
to:mulf_init::@4
mulf_init::@4: scope:[mulf_init] from mulf_init::@2
[202] (byte) mulf_init::x_2#1 ← ++ (byte) mulf_init::x_2#3
[203] (word) mulf_init::sqr#2 ← ++ (word) mulf_init::sqr#4
to:mulf_init::@3
mulf_init::@3: scope:[mulf_init] from mulf_init::@2 mulf_init::@4
[204] (byte) mulf_init::x_2#2 ← phi( mulf_init::@2/(byte) mulf_init::x_2#3 mulf_init::@4/(byte) mulf_init::x_2#1 )
[204] (word) mulf_init::sqr#3 ← phi( mulf_init::@2/(word) mulf_init::sqr#4 mulf_init::@4/(word) mulf_init::sqr#2 )
[205] (byte~) mulf_init::$4 ← < (word) mulf_init::sqr#3
[206] *((byte*) mulf_init::sqr1_lo#2) ← (byte~) mulf_init::$4
[207] (byte~) mulf_init::$5 ← > (word) mulf_init::sqr#3
[208] *((byte*) mulf_init::sqr1_hi#2) ← (byte~) mulf_init::$5
[209] (byte*) mulf_init::sqr1_hi#1 ← ++ (byte*) mulf_init::sqr1_hi#2
[210] (word) mulf_init::sqr#1 ← (word) mulf_init::sqr#3 + (byte) mulf_init::x_2#2
[211] (byte*) mulf_init::sqr1_lo#1 ← ++ (byte*) mulf_init::sqr1_lo#2
to:mulf_init::@1
(void()) plexInit((byte*) plexInit::screen)
plexInit: scope:[plexInit] from init
[212] phi()
to:plexInit::plexSetScreen1
plexInit::plexSetScreen1: scope:[plexInit] from plexInit
[213] phi()
to:plexInit::@1
plexInit::@1: scope:[plexInit] from plexInit::@1 plexInit::plexSetScreen1
[214] (byte) plexInit::i#2 ← phi( plexInit::@1/(byte) plexInit::i#1 plexInit::plexSetScreen1/(byte) 0 )
[215] *((const byte*) PLEX_SORTED_IDX + (byte) plexInit::i#2) ← (byte) plexInit::i#2
[216] (byte) plexInit::i#1 ← ++ (byte) plexInit::i#2
[217] if((byte) plexInit::i#1!=(const byte) PLEX_COUNT-(byte) 1+(byte) 1) goto plexInit::@1
to:plexInit::@return
plexInit::@return: scope:[plexInit] from plexInit::@1
[218] return
to:@return

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,383 @@
(label) @1
(label) @begin
(label) @end
(const byte) BLACK = (number) 0
(const byte*) BORDERCOL = (byte*) 53280
(const byte*) CIA1_PORT_A = (byte*) 56320
(const byte*) CIA1_PORT_B = (byte*) 56321
(const signed byte*) COS = (const signed byte*) SIN+(byte) $40
(const byte*) D011 = (byte*) 53265
(const byte) GREEN = (number) 5
(const byte) KEY_SPACE = (number) $3c
(const byte) NUM_BOBS = (number) $10
(const byte) PLEX_COUNT = (number) $20
(const byte*) PLEX_FREE_YPOS = { fill( 8, 0) }
(const byte*) PLEX_PTR = { fill( PLEX_COUNT, 0) }
(byte*) PLEX_SCREEN_PTR
(const byte*) PLEX_SCREEN_PTR#1 PLEX_SCREEN_PTR = (const byte*) SCREEN+(word) $3f8
(const byte*) PLEX_SORTED_IDX = { fill( PLEX_COUNT, 0) }
(const word*) PLEX_XPOS = { fill( PLEX_COUNT, 0) }
(const byte*) PLEX_YPOS = { fill( PLEX_COUNT, 0) }
(const byte*) RASTER = (byte*) 53266
(const byte*) SCREEN = (byte*) 1024
(const signed byte*) SIN = kickasm {{ .for(var i=0;i<$140;i++)
.byte >round($7fff*sin(i*2*PI/256))
}}
(const byte*) SPRITE = kickasm {{ .var pic = LoadPicture("smiley.png", List().add($000000, $ffffff))
.for (var y=0; y<21; y++)
.for (var x=0;x<3; x++)
.byte pic.getSinglecolorByte(x,y)
}}
(const byte*) SPRITES_COLS = (byte*) 53287
(const byte*) SPRITES_ENABLE = (byte*) 53269
(const byte*) SPRITES_XMSB = (byte*) 53264
(const byte*) SPRITES_XPOS = (byte*) 53248
(const byte*) SPRITES_YPOS = (byte*) 53249
(const byte) VIC_DEN = (number) $10
(const byte) VIC_RSEL = (number) 8
(const byte) VIC_RST8 = (number) $80
(void()) exit()
(byte~) exit::$0 reg byte a 22.0
(label) exit::@1
(label) exit::@2
(label) exit::@return
(void()) init()
(byte~) init::$10 reg byte a 22.0
(byte~) init::$3 reg byte a 22.0
(byte~) init::$4 reg byte x 11.0
(byte~) init::$5 reg byte a 22.0
(byte~) init::$6 reg byte a 22.0
(byte~) init::$9 reg byte a 22.0
(label) init::@1
(label) init::@2
(label) init::@3
(label) init::@4
(label) init::@5
(label) init::@return
(byte) init::i
(byte) init::i#1 i zp[1]:6 16.5
(byte) init::i#2 i zp[1]:6 8.799999999999999
(byte) init::i1
(byte) init::i1#1 reg byte x 16.5
(byte) init::i1#2 reg byte x 16.5
(byte()) keyboard_key_pressed((byte) keyboard_key_pressed::key)
(byte~) keyboard_key_pressed::$2 reg byte a 4.0
(label) keyboard_key_pressed::@1
(label) keyboard_key_pressed::@return
(byte) keyboard_key_pressed::colidx
(const byte) keyboard_key_pressed::colidx#0 colidx = (const byte) KEY_SPACE&(byte) 7
(byte) keyboard_key_pressed::key
(byte) keyboard_key_pressed::return
(byte) keyboard_key_pressed::return#0 reg byte a 6.0
(byte) keyboard_key_pressed::return#2 reg byte a 22.0
(byte) keyboard_key_pressed::return#3 reg byte a 22.0
(byte) keyboard_key_pressed::rowidx
(const byte) keyboard_key_pressed::rowidx#0 rowidx = (const byte) KEY_SPACE>>(byte) 3
(const byte*) keyboard_matrix_col_bitmask = { (byte) 1, (byte) 2, (byte) 4, (byte) 8, (byte) $10, (byte) $20, (byte) $40, (byte) $80 }
(byte()) keyboard_matrix_read((byte) keyboard_matrix_read::rowid)
(label) keyboard_matrix_read::@return
(byte) keyboard_matrix_read::return
(byte) keyboard_matrix_read::return#0 reg byte a 1.3333333333333333
(byte) keyboard_matrix_read::return#2 reg byte a 4.0
(byte) keyboard_matrix_read::row_pressed_bits
(byte) keyboard_matrix_read::rowid
(const byte*) keyboard_matrix_row_bitmask = { (byte) $fe, (byte) $fd, (byte) $fb, (byte) $f7, (byte) $ef, (byte) $df, (byte) $bf, (byte) $7f }
(void()) loop()
(signed word~) loop::$1 zp[2]:7 202.0
(byte~) loop::$11 reg byte a 202.0
(byte~) loop::$18 reg byte a 22.0
(signed word~) loop::$2 zp[2]:7 202.0
(byte~) loop::$20 reg byte a 202.0
(byte~) loop::$4 reg byte x 101.0
(signed word~) loop::$5 zp[2]:7 202.0
(signed word~) loop::$6 zp[2]:7 202.0
(byte~) loop::$8 reg byte a 202.0
(label) loop::@1
(label) loop::@10
(label) loop::@11
(label) loop::@12
(label) loop::@13
(label) loop::@14
(label) loop::@15
(label) loop::@2
(label) loop::@3
(label) loop::@4
(label) loop::@5
(label) loop::@6
(label) loop::@7
(label) loop::@8
(label) loop::@9
(label) loop::@return
(byte) loop::a
(byte) loop::a#1 a zp[1]:3 50.5
(byte) loop::a#2 a zp[1]:3 19.761904761904763
(byte) loop::a#6 a zp[1]:3 22.0
(byte) loop::angle
(byte) loop::angle#1 angle zp[1]:6 1.2941176470588236
(byte) loop::angle#6 angle zp[1]:6 1.064516129032258
(byte) loop::i
(byte) loop::i#1 i zp[1]:4 151.5
(byte) loop::i#2 i zp[1]:4 17.565217391304348
(byte) loop::i1
(byte) loop::i1#1 i1 zp[1]:18 151.5
(byte) loop::i1#5 i1 zp[1]:18 33.666666666666664
(label) loop::plexFreeNextYpos1
(byte) loop::plexFreeNextYpos1_return
(byte) loop::plexFreeNextYpos1_return#0 plexFreeNextYpos1_return zp[1]:17 551.0
(signed byte) loop::r
(signed byte) loop::r#1 r zp[1]:2 67.33333333333333
(signed byte) loop::r#2 r zp[1]:2 18.363636363636363
(byte) loop::rasterY
(signed word) loop::x
(signed word) loop::x#0 x zp[2]:7 202.0
(signed word) loop::y
(signed word) loop::y#0 y zp[2]:7 202.0
(void()) main()
(label) main::@1
(label) main::@2
(label) main::@3
(label) main::@return
(void*()) memset((void*) memset::str , (byte) memset::c , (word) memset::num)
(label) memset::@1
(label) memset::@2
(label) memset::@return
(byte) memset::c
(const byte) memset::c#0 c = (byte) ' '
(byte*) memset::dst
(byte*) memset::dst#1 dst zp[2]:7 22.0
(byte*) memset::dst#2 dst zp[2]:7 14.666666666666666
(byte*) memset::end
(const byte*) memset::end#0 end = (byte*)(const void*) memset::str#0+(const word) memset::num#0
(word) memset::num
(const word) memset::num#0 num = (word) $3e8
(void*) memset::return
(void*) memset::str
(const void*) memset::str#0 str = (void*)(const byte*) SCREEN
(signed word()) mulf8s((signed byte) mulf8s::a , (signed byte) mulf8s::b)
(label) mulf8s::@1
(label) mulf8s::@2
(label) mulf8s::@return
(signed byte) mulf8s::a
(signed byte) mulf8s::a#0 reg byte a 101.0
(signed byte) mulf8s::a#1 reg byte a 101.0
(signed byte) mulf8s::b
(signed byte) mulf8s::b#0 reg byte x 202.0
(signed byte) mulf8s::b#1 reg byte x 202.0
(signed byte) mulf8s::b#2 reg byte x 68.0
(label) mulf8s::mulf8s_prepare1
(signed byte) mulf8s::mulf8s_prepare1_a
(signed byte) mulf8s::mulf8s_prepare1_a#0 reg byte a 202.0
(signed word) mulf8s::return
(signed word) mulf8s::return#0 return zp[2]:7 51.0
(signed word) mulf8s::return#2 return zp[2]:7 202.0
(signed word) mulf8s::return#3 return zp[2]:7 202.0
(signed word()) mulf8s_prepared((signed byte) mulf8s_prepared::b)
(byte~) mulf8s_prepared::$12 reg byte a 4.0
(byte~) mulf8s_prepared::$15 reg byte a 4.0
(byte~) mulf8s_prepared::$16 reg byte a 4.0
(byte~) mulf8s_prepared::$8 reg byte a 4.0
(label) mulf8s_prepared::@1
(label) mulf8s_prepared::@2
(label) mulf8s_prepared::@3
(label) mulf8s_prepared::@4
(label) mulf8s_prepared::@5
(label) mulf8s_prepared::@return
(signed byte) mulf8s_prepared::b
(signed byte) mulf8s_prepared::b#0 b zp[1]:18 0.4
(word) mulf8s_prepared::m
(word) mulf8s_prepared::m#0 m zp[2]:7 2.0
(word) mulf8s_prepared::m#1 m zp[2]:7 4.0
(word) mulf8s_prepared::m#2 m zp[2]:7 4.0
(word) mulf8s_prepared::m#4 m zp[2]:7 1.3333333333333333
(word) mulf8s_prepared::m#5 m zp[2]:7 2.5
(const signed byte*) mulf8s_prepared::memA = (signed byte*) 253
(signed word) mulf8s_prepared::return
(void()) mulf8u_prepare((byte) mulf8u_prepare::a)
(label) mulf8u_prepare::@return
(byte) mulf8u_prepare::a
(byte) mulf8u_prepare::a#0 reg byte a 4.0
(const byte*) mulf8u_prepare::memA = (byte*) 253
(word()) mulf8u_prepared((byte) mulf8u_prepared::b)
(label) mulf8u_prepared::@return
(byte) mulf8u_prepared::b
(byte) mulf8u_prepared::b#0 reg byte a 4.0
(const byte*) mulf8u_prepared::memB = (byte*) 255
(const byte*) mulf8u_prepared::resL = (byte*) 254
(word) mulf8u_prepared::return
(word) mulf8u_prepared::return#0 return zp[2]:7 1.3333333333333333
(word) mulf8u_prepared::return#2 return zp[2]:7 4.0
(void()) mulf_init()
(byte~) mulf_init::$1 reg byte a 22.0
(byte~) mulf_init::$4 reg byte a 22.0
(byte~) mulf_init::$5 reg byte a 22.0
(label) mulf_init::@1
(label) mulf_init::@2
(label) mulf_init::@3
(label) mulf_init::@4
(label) mulf_init::@5
(label) mulf_init::@6
(label) mulf_init::@7
(label) mulf_init::@8
(label) mulf_init::@9
(label) mulf_init::@return
(byte) mulf_init::c
(byte) mulf_init::c#1 c zp[1]:18 2.5384615384615383
(byte) mulf_init::c#2 c zp[1]:18 11.0
(byte) mulf_init::dir
(byte) mulf_init::dir#2 dir zp[1]:17 4.125
(byte) mulf_init::dir#4 dir zp[1]:17 11.0
(word) mulf_init::sqr
(word) mulf_init::sqr#1 sqr zp[2]:15 11.0
(word) mulf_init::sqr#2 sqr zp[2]:15 22.0
(word) mulf_init::sqr#3 sqr zp[2]:15 9.166666666666666
(word) mulf_init::sqr#4 sqr zp[2]:15 5.5
(byte*) mulf_init::sqr1_hi
(byte*) mulf_init::sqr1_hi#1 sqr1_hi zp[2]:9 7.333333333333333
(byte*) mulf_init::sqr1_hi#2 sqr1_hi zp[2]:9 2.75
(byte*) mulf_init::sqr1_lo
(byte*) mulf_init::sqr1_lo#1 sqr1_lo zp[2]:7 22.0
(byte*) mulf_init::sqr1_lo#2 sqr1_lo zp[2]:7 3.142857142857143
(byte*) mulf_init::sqr2_hi
(byte*) mulf_init::sqr2_hi#1 sqr2_hi zp[2]:13 3.6666666666666665
(byte*) mulf_init::sqr2_hi#2 sqr2_hi zp[2]:13 8.25
(byte*) mulf_init::sqr2_lo
(byte*) mulf_init::sqr2_lo#1 sqr2_lo zp[2]:11 22.0
(byte*) mulf_init::sqr2_lo#2 sqr2_lo zp[2]:11 4.888888888888889
(byte) mulf_init::x_2
(byte) mulf_init::x_2#1 reg byte x 11.0
(byte) mulf_init::x_2#2 reg byte x 5.5
(byte) mulf_init::x_2#3 reg byte x 6.6000000000000005
(byte) mulf_init::x_255
(byte) mulf_init::x_255#1 reg byte x 6.6000000000000005
(byte) mulf_init::x_255#2 reg byte x 8.8
(const byte*) mulf_sqr1_hi = { fill( $200, 0) }
(const byte*) mulf_sqr1_lo = { fill( $200, 0) }
(const byte*) mulf_sqr2_hi = { fill( $200, 0) }
(const byte*) mulf_sqr2_lo = { fill( $200, 0) }
(void()) plexInit((byte*) plexInit::screen)
(label) plexInit::@1
(label) plexInit::@return
(byte) plexInit::i
(byte) plexInit::i#1 reg byte x 16.5
(byte) plexInit::i#2 reg byte x 22.0
(label) plexInit::plexSetScreen1
(byte*) plexInit::plexSetScreen1_screen
(byte*) plexInit::screen
(void()) plexShowSprite()
(byte~) plexShowSprite::$11 reg byte x 2.0
(byte~) plexShowSprite::$2 reg byte a 4.0
(byte~) plexShowSprite::$3 reg byte a 4.0
(byte~) plexShowSprite::$5 reg byte x 4.0
(byte~) plexShowSprite::$9 reg byte a 4.0
(label) plexShowSprite::@1
(label) plexShowSprite::@2
(label) plexShowSprite::@3
(label) plexShowSprite::@4
(label) plexShowSprite::@5
(label) plexShowSprite::@return
(label) plexShowSprite::plexFreeAdd1
(byte~) plexShowSprite::plexFreeAdd1_$0 reg byte a 4.0
(byte~) plexShowSprite::plexFreeAdd1_$1 reg byte x 4.0
(byte) plexShowSprite::plexFreeAdd1_ypos
(byte) plexShowSprite::plexFreeAdd1_ypos#0 reg byte a 3.0
(byte) plexShowSprite::plex_sprite_idx2
(byte) plexShowSprite::plex_sprite_idx2#0 plex_sprite_idx2 zp[1]:17 0.5454545454545454
(byte) plexShowSprite::xpos_idx
(byte) plexShowSprite::xpos_idx#0 reg byte a 4.0
(byte) plexShowSprite::ypos
(void()) plexSort()
(label) plexSort::@1
(label) plexSort::@2
(label) plexSort::@3
(label) plexSort::@4
(label) plexSort::@5
(label) plexSort::@6
(label) plexSort::@return
(byte) plexSort::m
(byte) plexSort::m#1 m zp[1]:5 151.5
(byte) plexSort::m#2 m zp[1]:5 42.08333333333333
(byte) plexSort::nxt_idx
(byte) plexSort::nxt_idx#0 nxt_idx zp[1]:17 30.299999999999997
(byte) plexSort::nxt_y
(byte) plexSort::nxt_y#0 nxt_y zp[1]:18 150.375
(label) plexSort::plexFreePrepare1
(label) plexSort::plexFreePrepare1_@1
(byte) plexSort::plexFreePrepare1_s
(byte) plexSort::plexFreePrepare1_s#1 reg byte x 151.5
(byte) plexSort::plexFreePrepare1_s#2 reg byte x 151.5
(byte) plexSort::s
(byte) plexSort::s#1 reg byte x 1368.3333333333335
(byte) plexSort::s#2 reg byte x 202.0
(byte) plexSort::s#3 reg byte x 2052.5
(byte) plexSort::s#6 reg byte x 202.0
(byte) plex_free_next
(byte) plex_free_next#13 plex_free_next zp[1]:2 4.681818181818182
(byte) plex_free_next#17 plex_free_next zp[1]:2 20.599999999999998
(byte) plex_show_idx
(byte) plex_show_idx#15 plex_show_idx zp[1]:4 11.444444444444443
(byte) plex_show_idx#43 plex_show_idx zp[1]:4 4.541666666666665
(byte) plex_sprite_idx
(byte) plex_sprite_idx#15 plex_sprite_idx zp[1]:3 10.299999999999999
(byte) plex_sprite_idx#43 plex_sprite_idx zp[1]:3 4.863636363636363
(byte) plex_sprite_msb
(byte) plex_sprite_msb#16 plex_sprite_msb zp[1]:5 20.599999999999998
(byte) plex_sprite_msb#3 plex_sprite_msb zp[1]:5 2.0
(byte) plex_sprite_msb#43 plex_sprite_msb zp[1]:5 4.28
zp[1]:2 [ plex_free_next#17 plex_free_next#13 loop::r#2 loop::r#1 ]
zp[1]:3 [ plex_sprite_idx#43 plex_sprite_idx#15 loop::a#2 loop::a#1 loop::a#6 ]
zp[1]:4 [ plex_show_idx#43 plex_show_idx#15 loop::i#2 loop::i#1 ]
zp[1]:5 [ plexSort::m#2 plexSort::m#1 plex_sprite_msb#43 plex_sprite_msb#16 plex_sprite_msb#3 ]
reg byte x [ plexSort::s#3 plexSort::s#1 plexSort::s#6 ]
reg byte x [ plexSort::plexFreePrepare1_s#2 plexSort::plexFreePrepare1_s#1 ]
reg byte a [ mulf8s::mulf8s_prepare1_a#0 mulf8s::a#1 mulf8s::a#0 ]
reg byte x [ mulf8s::b#2 mulf8s::b#1 mulf8s::b#0 ]
zp[1]:6 [ init::i#2 init::i#1 loop::angle#6 loop::angle#1 ]
reg byte x [ init::i1#2 init::i1#1 ]
zp[2]:7 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_lo#1 memset::dst#2 memset::dst#1 mulf8s_prepared::m#4 mulf8s_prepared::m#5 mulf8s_prepared::m#1 mulf8s_prepared::m#0 mulf8s_prepared::m#2 mulf8s::return#0 mulf8u_prepared::return#2 mulf8s::return#2 loop::$1 mulf8s::return#3 loop::$5 mulf8u_prepared::return#0 loop::$2 loop::x#0 loop::$6 loop::y#0 ]
zp[2]:9 [ mulf_init::sqr1_hi#2 mulf_init::sqr1_hi#1 ]
reg byte x [ mulf_init::x_2#3 mulf_init::x_2#2 mulf_init::x_2#1 ]
zp[2]:11 [ mulf_init::sqr2_lo#2 mulf_init::sqr2_lo#1 ]
reg byte x [ mulf_init::x_255#2 mulf_init::x_255#1 ]
zp[2]:13 [ mulf_init::sqr2_hi#2 mulf_init::sqr2_hi#1 ]
zp[2]:15 [ mulf_init::sqr#3 mulf_init::sqr#4 mulf_init::sqr#1 mulf_init::sqr#2 ]
reg byte x [ plexInit::i#2 plexInit::i#1 ]
reg byte a [ keyboard_key_pressed::return#2 ]
reg byte a [ exit::$0 ]
reg byte a [ keyboard_matrix_read::return#2 ]
reg byte a [ keyboard_key_pressed::$2 ]
reg byte a [ keyboard_key_pressed::return#0 ]
reg byte a [ keyboard_matrix_read::return#0 ]
reg byte x [ loop::$4 ]
reg byte a [ loop::$20 ]
reg byte a [ loop::$8 ]
reg byte a [ loop::$11 ]
reg byte a [ keyboard_key_pressed::return#3 ]
reg byte a [ loop::$18 ]
reg byte a [ plexShowSprite::plexFreeAdd1_ypos#0 ]
reg byte a [ plexShowSprite::plexFreeAdd1_$0 ]
reg byte x [ plexShowSprite::plexFreeAdd1_$1 ]
reg byte a [ plexShowSprite::xpos_idx#0 ]
reg byte x [ plexShowSprite::$11 ]
reg byte a [ plexShowSprite::$2 ]
reg byte a [ plexShowSprite::$3 ]
reg byte a [ plexShowSprite::$9 ]
reg byte x [ plexShowSprite::$5 ]
zp[1]:17 [ plexSort::nxt_idx#0 plexShowSprite::plex_sprite_idx2#0 loop::plexFreeNextYpos1_return#0 mulf_init::dir#2 mulf_init::dir#4 ]
reg byte x [ plexSort::s#2 ]
reg byte a [ mulf8u_prepare::a#0 ]
zp[1]:18 [ mulf8s_prepared::b#0 plexSort::nxt_y#0 mulf_init::c#2 mulf_init::c#1 loop::i1#5 loop::i1#1 ]
reg byte a [ mulf8u_prepared::b#0 ]
reg byte a [ mulf8s_prepared::$8 ]
reg byte a [ mulf8s_prepared::$15 ]
reg byte a [ mulf8s_prepared::$12 ]
reg byte a [ mulf8s_prepared::$16 ]
reg byte a [ init::$10 ]
reg byte a [ init::$3 ]
reg byte x [ init::$4 ]
reg byte a [ init::$9 ]
reg byte a [ init::$5 ]
reg byte a [ init::$6 ]
reg byte a [ mulf_init::$1 ]
reg byte a [ mulf_init::$4 ]
reg byte a [ mulf_init::$5 ]