1
0
mirror of https://gitlab.com/camelot/kickc.git synced 2025-02-21 22:29:07 +00:00

Dropped memory.kc and fill() - Instead added C stdlib memset() to string.kc.

Pointer math on void pointer now results in an error.
This commit is contained in:
jespergravgaard 2019-06-21 20:06:57 +02:00
parent 1150cf859f
commit b461fcfa74
28 changed files with 2459 additions and 2182 deletions

View File

@ -1,6 +1,7 @@
package dk.camelot64.kickc.passes; package dk.camelot64.kickc.passes;
import dk.camelot64.kickc.model.Comment; import dk.camelot64.kickc.model.Comment;
import dk.camelot64.kickc.model.CompileError;
import dk.camelot64.kickc.model.ControlFlowBlock; import dk.camelot64.kickc.model.ControlFlowBlock;
import dk.camelot64.kickc.model.Program; import dk.camelot64.kickc.model.Program;
import dk.camelot64.kickc.model.iterator.ProgramValueIterator; import dk.camelot64.kickc.model.iterator.ProgramValueIterator;
@ -10,6 +11,7 @@ import dk.camelot64.kickc.model.statements.Statement;
import dk.camelot64.kickc.model.statements.StatementAssignment; import dk.camelot64.kickc.model.statements.StatementAssignment;
import dk.camelot64.kickc.model.symbols.Variable; import dk.camelot64.kickc.model.symbols.Variable;
import dk.camelot64.kickc.model.symbols.VariableIntermediate; import dk.camelot64.kickc.model.symbols.VariableIntermediate;
import dk.camelot64.kickc.model.types.SymbolType;
import dk.camelot64.kickc.model.types.SymbolTypeInference; import dk.camelot64.kickc.model.types.SymbolTypeInference;
import dk.camelot64.kickc.model.types.SymbolTypePointer; import dk.camelot64.kickc.model.types.SymbolTypePointer;
import dk.camelot64.kickc.model.values.ConstantRef; import dk.camelot64.kickc.model.values.ConstantRef;
@ -94,6 +96,9 @@ public class Pass1PointerSizeofFix extends Pass1Base {
Variable variable = getScope().getVariable(varRef); Variable variable = getScope().getVariable(varRef);
if(variable.getType() instanceof SymbolTypePointer) { if(variable.getType() instanceof SymbolTypePointer) {
SymbolTypePointer pointerType = (SymbolTypePointer) variable.getType(); SymbolTypePointer pointerType = (SymbolTypePointer) variable.getType();
if(SymbolType.VOID.equals(pointerType.getElementType())) {
throw new CompileError("Void pointer math not allowed. ", assignment);
}
if(pointerType.getElementType().getSizeBytes() > 1) { if(pointerType.getElementType().getSizeBytes() > 1) {
// Binary operation on a non-byte pointer - sizeof()-handling is probably needed! // Binary operation on a non-byte pointer - sizeof()-handling is probably needed!
if(Operators.PLUS.equals(assignment.getOperator()) || Operators.MINUS.equals(assignment.getOperator())) { if(Operators.PLUS.equals(assignment.getOperator()) || Operators.MINUS.equals(assignment.getOperator())) {
@ -122,6 +127,9 @@ public class Pass1PointerSizeofFix extends Pass1Base {
Variable variable = getScope().getVariable(varRef); Variable variable = getScope().getVariable(varRef);
if(variable.getType() instanceof SymbolTypePointer) { if(variable.getType() instanceof SymbolTypePointer) {
SymbolTypePointer pointerType = (SymbolTypePointer) variable.getType(); SymbolTypePointer pointerType = (SymbolTypePointer) variable.getType();
if(SymbolType.VOID.equals(pointerType.getElementType())) {
throw new CompileError("Void pointer math not allowed. ", assignment);
}
if(pointerType.getElementType().getSizeBytes() > 1) { if(pointerType.getElementType().getSizeBytes() > 1) {
// Unary operation on non-byte pointer type - sizeof()-handling is needed! // Unary operation on non-byte pointer type - sizeof()-handling is needed!
if(Operators.INCREMENT.equals(assignment.getOperator())) { if(Operators.INCREMENT.equals(assignment.getOperator())) {

View File

@ -1,9 +0,0 @@
// Simple routines for working with memory
// Fill some memory with a value
void fill(byte* start, word size, byte val) {
byte* end = start + size;
for(byte* addr = start; addr!=end; addr++) {
*addr = val;
}
}

View File

@ -1,28 +1,38 @@
// Standard C strings.h - functions to manipulate C strings and arrays. // Standard C strings.h - functions to manipulate C strings and arrays.
typedef word size_t ;
// Copy block of memory (forwards) // Copy block of memory (forwards)
// Copies the values of num bytes from the location pointed to by source directly to the memory block pointed to by destination. // Copies the values of num bytes from the location pointed to by source directly to the memory block pointed to by destination.
void* memcpy( void* destination, void* source, word num ) { void* memcpy( void* destination, void* source, size_t num ) {
byte* src = source; byte* src = source;
byte* dst = destination; byte* dst = destination;
for( word i=0; i<num; i++) *dst++ = *src++; for( size_t i=0; i<num; i++) *dst++ = *src++;
return destination; return destination;
} }
// Move block of memory // Move block of memory
// Copies the values of num bytes from the location pointed by source to the memory block pointed by destination. Copying takes place as if an intermediate buffer were used, allowing the destination and source to overlap. // Copies the values of num bytes from the location pointed by source to the memory block pointed by destination. Copying takes place as if an intermediate buffer were used, allowing the destination and source to overlap.
void* memmove( void* destination, void* source, word num ) { void* memmove( void* destination, void* source, size_t num ) {
if((word)destination<(word)source) { if((word)destination<(word)source) {
memcpy(destination, source, num); memcpy(destination, source, num);
} else { } else {
// copy backwards // copy backwards
byte* src = source+num; byte* src = source+num;
byte* dst = destination+num; byte* dst = destination+num;
for( word i=0; i<num; i++) *--dst = *--src; for( size_t i=0; i<num; i++) *--dst = *--src;
} }
return destination; return destination;
} }
// Copies the character c (an unsigned char) to the first num characters of the object pointed to by the argument str.
void *memset(void *str, byte c, size_t num) {
byte* end = str + num;
for(byte* dst = str; dst!=end; dst++)
*dst = c;
return str;
}
// Copies the C string pointed by source into the array pointed by destination, including the terminating null character (and stopping at that point). // Copies the C string pointed by source into the array pointed by destination, including the terminating null character (and stopping at that point).
byte* strcpy( byte* destination, byte* source ) { byte* strcpy( byte* destination, byte* source ) {
byte* src = source; byte* src = source;

View File

@ -40,6 +40,11 @@ public class TestPrograms {
compileAndCompare("call-parameter-autocast"); compileAndCompare("call-parameter-autocast");
} }
@Test
public void testPointerVoidErr0() throws IOException, URISyntaxException {
assertError("pointer-void-err-0", "Void pointer math not allowed.");
}
@Test @Test
public void testPointerVoid2() throws IOException, URISyntaxException { public void testPointerVoid2() throws IOException, URISyntaxException {
compileAndCompare("pointer-void-2"); compileAndCompare("pointer-void-2");

View File

@ -3,7 +3,6 @@
// Source: https://meatfighter.com/nintendotetrisai/ // Source: https://meatfighter.com/nintendotetrisai/
import "c64" import "c64"
import "memory"
import "keyboard" import "keyboard"
import "sid" import "sid"
import "tetris-data" import "tetris-data"

View File

@ -1,6 +1,6 @@
import "c64.kc" import "c64.kc"
import "sinus.kc" import "sinus.kc"
import "memory.kc" import "string.kc"
byte* SCREEN = $400; byte* SCREEN = $400;
byte* LOGO = $2000; byte* LOGO = $2000;
@ -23,8 +23,8 @@ void main() {
*BGCOL3 = BLACK; *BGCOL3 = BLACK;
*D018 = toD018(SCREEN, LOGO); *D018 = toD018(SCREEN, LOGO);
*D016 = VIC_MCM; *D016 = VIC_MCM;
fill(SCREEN, 1000, BLACK); memset(SCREEN, BLACK, 1000);
fill(COLS, 1000, WHITE|8); memset(COLS, WHITE|8, 1000);
for(byte ch: 0..239) { for(byte ch: 0..239) {
SCREEN[ch] = ch; SCREEN[ch] = ch;
} }

View File

@ -1,4 +1,5 @@
import "c64.kc" import "c64.kc"
import "string"
byte* SCREEN = $400; byte* SCREEN = $400;
byte* LOGO = $2000; byte* LOGO = $2000;
@ -17,8 +18,8 @@ void main() {
*BGCOL3 = BLACK; *BGCOL3 = BLACK;
*D018 = toD018(SCREEN, LOGO); *D018 = toD018(SCREEN, LOGO);
*D016 = VIC_MCM | VIC_CSEL; *D016 = VIC_MCM | VIC_CSEL;
fill(SCREEN, 40*25, BLACK); memset(SCREEN, BLACK, 40*25);
fill(COLS, 40*25, WHITE|8); memset(COLS, WHITE|8, 40*25);
for(byte ch: 0..239) { for(byte ch: 0..239) {
SCREEN[ch] = ch; SCREEN[ch] = ch;
} }
@ -27,12 +28,3 @@ void main() {
kickasm {{ inc $d020 }} kickasm {{ inc $d020 }}
} }
} }
// Fill some memory with a value
void fill(byte* start, word size, byte val) {
byte* end = start + size;
for(byte* addr = start; addr!=end; addr++) {
*addr = val;
}
}

View File

@ -2,7 +2,7 @@
import "c64.kc" import "c64.kc"
import "sinus.kc" import "sinus.kc"
import "memory.kc" import "string.kc"
import "bitmap2.kc" import "bitmap2.kc"
byte* SCREEN = $400; byte* SCREEN = $400;
@ -30,7 +30,7 @@ void main() {
*D016 = VIC_CSEL; *D016 = VIC_CSEL;
*D018 = toD018(SCREEN, BITMAP); *D018 = toD018(SCREEN, BITMAP);
fill(SCREEN, 1000, WHITE); memset(SCREEN, WHITE, 1000);
bitmap_init(BITMAP); bitmap_init(BITMAP);
bitmap_clear(); bitmap_clear();
sin16s_gen2(sin, SIN_SIZE, -320, 320); sin16s_gen2(sin, SIN_SIZE, -320, 320);

View File

@ -0,0 +1,11 @@
// Test simple void pointer - void pointer addition should fail
void main() {
void* SCREEN = 0x0400;
byte idx = 0;
*((byte*)SCREEN) = idx;
SCREEN++;
*((byte*)SCREEN) = idx;
}

View File

@ -1,7 +1,7 @@
// Illustrates a problem with a missing fragment - pbuc1_derefidx_vwuz1=vbuz2 // Illustrates a problem with a missing fragment - pbuc1_derefidx_vwuz1=vbuz2
import "c64.kc" import "c64.kc"
import "keyboard.kc" import "keyboard.kc"
import "memory.kc" import "string.kc"
import "multiply.kc" import "multiply.kc"
const byte* screen = $400; const byte* screen = $400;
@ -25,8 +25,8 @@ void main() {
void init() { void init() {
init_sprites(); init_sprites();
fill(screen,1000,0); memset(screen, 0, 1000);
fill(colors,1000,BLACK); memset(colors, BLACK, 1000);
*D018 = toD018(screen, charset); *D018 = toD018(screen, charset);
asm { asm {
lda #$5b // as there are more than 256 rasterlines, the topmost bit of $d011 serves as lda #$5b // as there are more than 256 rasterlines, the topmost bit of $d011 serves as

View File

@ -46,6 +46,8 @@ Adding pointer type conversion cast to void pointer (byte*) memcpy::source in (b
Adding pointer type conversion cast to void pointer (byte*) memcpy::destination in (byte*) memcpy::dst ← (void*) memcpy::destination Adding pointer type conversion cast to void pointer (byte*) memcpy::destination in (byte*) memcpy::dst ← (void*) memcpy::destination
Adding pointer type conversion cast to void pointer (byte*) memmove::$3 in (byte*) memmove::src ← (void*~) memmove::$3 Adding pointer type conversion cast to void pointer (byte*) memmove::$3 in (byte*) memmove::src ← (void*~) memmove::$3
Adding pointer type conversion cast to void pointer (byte*) memmove::$4 in (byte*) memmove::dst ← (void*~) memmove::$4 Adding pointer type conversion cast to void pointer (byte*) memmove::$4 in (byte*) memmove::dst ← (void*~) memmove::$4
Adding pointer type conversion cast to void pointer (byte*) memset::$0 in (byte*) memset::end ← (void*~) memset::$0
Adding pointer type conversion cast to void pointer (byte*) memset::str in (byte*) memset::dst ← (void*) memset::str
Adding pointer type conversion cast (byte*) MEDUSA_SCREEN in (byte*) MEDUSA_SCREEN ← (number) $1000 Adding pointer type conversion cast (byte*) MEDUSA_SCREEN in (byte*) MEDUSA_SCREEN ← (number) $1000
Adding pointer type conversion cast (byte*) MEDUSA_COLORS in (byte*) MEDUSA_COLORS ← (number) $1400 Adding pointer type conversion cast (byte*) MEDUSA_COLORS in (byte*) MEDUSA_COLORS ← (number) $1400
Adding pointer type conversion cast (byte*) SCREEN in (byte*) SCREEN ← (number) $400 Adding pointer type conversion cast (byte*) SCREEN in (byte*) SCREEN ← (number) $400
@ -65,6 +67,7 @@ Culled Empty Block (label) @4
Culled Empty Block (label) memcpy::@3 Culled Empty Block (label) memcpy::@3
Culled Empty Block (label) @5 Culled Empty Block (label) @5
Culled Empty Block (label) @6 Culled Empty Block (label) @6
Culled Empty Block (label) @7
Culled Empty Block (label) main::@4 Culled Empty Block (label) main::@4
Culled Empty Block (label) main::@3 Culled Empty Block (label) main::@3
Culled Empty Block (label) main::@5 Culled Empty Block (label) main::@5
@ -75,7 +78,7 @@ CONTROL FLOW GRAPH SSA
(byte*) BGCOL#0 ← ((byte*)) (number) $d021 (byte*) BGCOL#0 ← ((byte*)) (number) $d021
(byte*) COLS#0 ← ((byte*)) (number) $d800 (byte*) COLS#0 ← ((byte*)) (number) $d800
(byte) BLACK#0 ← (number) 0 (byte) BLACK#0 ← (number) 0
to:@7 to:@8
memcpy: scope:[memcpy] from main main::@7 memcpy: scope:[memcpy] from main main::@7
(word) memcpy::num#3 ← phi( main/(word) memcpy::num#0 main::@7/(word) memcpy::num#1 ) (word) memcpy::num#3 ← phi( main/(word) memcpy::num#0 main::@7/(word) memcpy::num#1 )
(void*) memcpy::destination#2 ← phi( main/(void*) memcpy::destination#0 main::@7/(void*) memcpy::destination#1 ) (void*) memcpy::destination#2 ← phi( main/(void*) memcpy::destination#0 main::@7/(void*) memcpy::destination#1 )
@ -106,7 +109,7 @@ memcpy::@return: scope:[memcpy] from memcpy::@2
(void*) memcpy::return#1 ← (void*) memcpy::return#4 (void*) memcpy::return#1 ← (void*) memcpy::return#4
return return
to:@return to:@return
@7: scope:[] from @begin @8: scope:[] from @begin
(byte*) MEDUSA_SCREEN#0 ← ((byte*)) (number) $1000 (byte*) MEDUSA_SCREEN#0 ← ((byte*)) (number) $1000
(byte*) MEDUSA_COLORS#0 ← ((byte*)) (number) $1400 (byte*) MEDUSA_COLORS#0 ← ((byte*)) (number) $1400
(byte*) SCREEN#0 ← ((byte*)) (number) $400 (byte*) SCREEN#0 ← ((byte*)) (number) $400
@ -116,8 +119,8 @@ memcpy::@return: scope:[memcpy] from memcpy::@2
kickasm(location (byte*) MEDUSA_COLORS#0) {{ .var fileCols = LoadBinary("medusac.prg", BF_C64FILE) kickasm(location (byte*) MEDUSA_COLORS#0) {{ .var fileCols = LoadBinary("medusac.prg", BF_C64FILE)
.fill fileCols.getSize(), fileCols.get(i) .fill fileCols.getSize(), fileCols.get(i)
}} }}
to:@8 to:@9
main: scope:[main] from @8 main: scope:[main] from @9
*((byte*) BGCOL#0) ← (byte) BLACK#0 *((byte*) BGCOL#0) ← (byte) BLACK#0
(void*) memcpy::destination#0 ← (void*)(byte*) SCREEN#0 (void*) memcpy::destination#0 ← (void*)(byte*) SCREEN#0
(void*) memcpy::source#0 ← (void*)(byte*) MEDUSA_SCREEN#0 (void*) memcpy::source#0 ← (void*)(byte*) MEDUSA_SCREEN#0
@ -144,15 +147,15 @@ main::@2: scope:[main] from main::@1
main::@return: scope:[main] from main::@1 main::@return: scope:[main] from main::@1
return return
to:@return to:@return
@8: scope:[] from @7
call main
to:@9
@9: scope:[] from @8 @9: scope:[] from @8
call main
to:@10
@10: scope:[] from @9
to:@end to:@end
@end: scope:[] from @9 @end: scope:[] from @10
SYMBOL TABLE SSA SYMBOL TABLE SSA
(label) @7 (label) @10
(label) @8 (label) @8
(label) @9 (label) @9
(label) @begin (label) @begin
@ -316,8 +319,8 @@ Identical Phi Values (word) memcpy::num#3 (word) $3e8
Successful SSA optimization Pass2IdenticalPhiElimination Successful SSA optimization Pass2IdenticalPhiElimination
Added new block during phi lifting memcpy::@4(between memcpy::@1 and memcpy::@1) Added new block during phi lifting memcpy::@4(between memcpy::@1 and memcpy::@1)
Adding NOP phi() at start of @begin Adding NOP phi() at start of @begin
Adding NOP phi() at start of @8
Adding NOP phi() at start of @9 Adding NOP phi() at start of @9
Adding NOP phi() at start of @10
Adding NOP phi() at start of @end Adding NOP phi() at start of @end
Adding NOP phi() at start of main::@7 Adding NOP phi() at start of main::@7
Adding NOP phi() at start of main::@8 Adding NOP phi() at start of main::@8
@ -332,13 +335,13 @@ Coalesced [25] memcpy::src#4 ← memcpy::src#1
Coalesced [26] memcpy::dst#4 ← memcpy::dst#1 Coalesced [26] memcpy::dst#4 ← memcpy::dst#1
Coalesced [27] memcpy::i#3 ← memcpy::i#1 Coalesced [27] memcpy::i#3 ← memcpy::i#1
Coalesced down to 5 phi equivalence classes Coalesced down to 5 phi equivalence classes
Culled Empty Block (label) @9 Culled Empty Block (label) @10
Culled Empty Block (label) main::@8 Culled Empty Block (label) main::@8
Culled Empty Block (label) main::@1 Culled Empty Block (label) main::@1
Culled Empty Block (label) memcpy::@2 Culled Empty Block (label) memcpy::@2
Culled Empty Block (label) memcpy::@4 Culled Empty Block (label) memcpy::@4
Renumbering block @7 to @1 Renumbering block @8 to @1
Renumbering block @8 to @2 Renumbering block @9 to @2
Renumbering block main::@2 to main::@1 Renumbering block main::@2 to main::@1
Renumbering block main::@7 to main::@2 Renumbering block main::@7 to main::@2
Adding NOP phi() at start of @begin Adding NOP phi() at start of @begin

View File

@ -96,66 +96,65 @@ Inlined call (byte~) play_spawn_current::$5 ← call sid_rnd
Culled Empty Block (label) @1 Culled Empty Block (label) @1
Culled Empty Block (label) @2 Culled Empty Block (label) @2
Culled Empty Block (label) @3 Culled Empty Block (label) @3
Culled Empty Block (label) @4 Culled Empty Block (label) @5
Culled Empty Block (label) @6
Culled Empty Block (label) keyboard_matrix_read::@1 Culled Empty Block (label) keyboard_matrix_read::@1
Culled Empty Block (label) @6
Culled Empty Block (label) @7 Culled Empty Block (label) @7
Culled Empty Block (label) @8
Culled Empty Block (label) keyboard_event_scan::@22 Culled Empty Block (label) keyboard_event_scan::@22
Culled Empty Block (label) keyboard_event_scan::@13 Culled Empty Block (label) keyboard_event_scan::@13
Culled Empty Block (label) keyboard_event_scan::@15 Culled Empty Block (label) keyboard_event_scan::@15
Culled Empty Block (label) keyboard_event_scan::@19 Culled Empty Block (label) keyboard_event_scan::@19
Culled Empty Block (label) keyboard_event_scan::@4 Culled Empty Block (label) keyboard_event_scan::@4
Culled Empty Block (label) @10 Culled Empty Block (label) @9
Culled Empty Block (label) keyboard_event_pressed::@1 Culled Empty Block (label) keyboard_event_pressed::@1
Culled Empty Block (label) @11 Culled Empty Block (label) @10
Culled Empty Block (label) keyboard_event_get::@4 Culled Empty Block (label) keyboard_event_get::@4
Culled Empty Block (label) keyboard_event_get::@2 Culled Empty Block (label) keyboard_event_get::@2
Culled Empty Block (label) keyboard_event_get::@5 Culled Empty Block (label) keyboard_event_get::@5
Culled Empty Block (label) keyboard_event_get::@6 Culled Empty Block (label) keyboard_event_get::@6
Culled Empty Block (label) @13 Culled Empty Block (label) @12
Culled Empty Block (label) render_init::vicSelectGfxBank1_toDd001_@1 Culled Empty Block (label) render_init::vicSelectGfxBank1_toDd001_@1
Culled Empty Block (label) render_init::vicSelectGfxBank1_@return Culled Empty Block (label) render_init::vicSelectGfxBank1_@return
Culled Empty Block (label) @15 Culled Empty Block (label) @14
Culled Empty Block (label) render_show::toD0181_@1 Culled Empty Block (label) render_show::toD0181_@1
Culled Empty Block (label) render_show::toD0182_@1 Culled Empty Block (label) render_show::toD0182_@1
Culled Empty Block (label) render_show::@4 Culled Empty Block (label) render_show::@4
Culled Empty Block (label) @15
Culled Empty Block (label) @16 Culled Empty Block (label) @16
Culled Empty Block (label) @17
Culled Empty Block (label) render_score::@4 Culled Empty Block (label) render_score::@4
Culled Empty Block (label) @17
Culled Empty Block (label) @18 Culled Empty Block (label) @18
Culled Empty Block (label) @19
Culled Empty Block (label) render_screen_original::@3 Culled Empty Block (label) render_screen_original::@3
Culled Empty Block (label) render_screen_original::@5 Culled Empty Block (label) render_screen_original::@5
Culled Empty Block (label) render_screen_original::@8 Culled Empty Block (label) render_screen_original::@8
Culled Empty Block (label) @20 Culled Empty Block (label) @19
Culled Empty Block (label) render_playfield::@4 Culled Empty Block (label) render_playfield::@4
Culled Empty Block (label) @21 Culled Empty Block (label) @20
Culled Empty Block (label) render_moving::@9 Culled Empty Block (label) render_moving::@9
Culled Empty Block (label) render_moving::@7 Culled Empty Block (label) render_moving::@7
Culled Empty Block (label) render_moving::@10 Culled Empty Block (label) render_moving::@10
Culled Empty Block (label) @22 Culled Empty Block (label) @21
Culled Empty Block (label) render_next::@4 Culled Empty Block (label) render_next::@4
Culled Empty Block (label) render_next::@10 Culled Empty Block (label) render_next::@10
Culled Empty Block (label) render_next::@12 Culled Empty Block (label) render_next::@12
Culled Empty Block (label) sprites_init::@2 Culled Empty Block (label) sprites_init::@2
Culled Empty Block (label) toSpritePtr1_@1 Culled Empty Block (label) toSpritePtr1_@1
Culled Empty Block (label) @25 Culled Empty Block (label) @24
Culled Empty Block (label) sprites_irq::@14 Culled Empty Block (label) sprites_irq::@14
Culled Empty Block (label) sprites_irq::toSpritePtr2_@1 Culled Empty Block (label) sprites_irq::toSpritePtr2_@1
Culled Empty Block (label) sprites_irq::@5 Culled Empty Block (label) sprites_irq::@5
Culled Empty Block (label) sprites_irq::@9 Culled Empty Block (label) sprites_irq::@9
Culled Empty Block (label) sprites_irq::@10 Culled Empty Block (label) sprites_irq::@10
Culled Empty Block (label) play_init::@4 Culled Empty Block (label) play_init::@4
Culled Empty Block (label) @27 Culled Empty Block (label) @26
Culled Empty Block (label) play_movement::@3 Culled Empty Block (label) play_movement::@3
Culled Empty Block (label) play_movement::@4 Culled Empty Block (label) play_movement::@4
Culled Empty Block (label) @28 Culled Empty Block (label) @27
Culled Empty Block (label) play_move_down::@13 Culled Empty Block (label) play_move_down::@13
Culled Empty Block (label) play_move_down::@11 Culled Empty Block (label) play_move_down::@11
Culled Empty Block (label) play_move_down::@16 Culled Empty Block (label) play_move_down::@16
Culled Empty Block (label) play_move_down::@12 Culled Empty Block (label) play_move_down::@12
Culled Empty Block (label) @29 Culled Empty Block (label) @28
Culled Empty Block (label) play_move_leftright::@2 Culled Empty Block (label) play_move_leftright::@2
Culled Empty Block (label) play_move_leftright::@12 Culled Empty Block (label) play_move_leftright::@12
Culled Empty Block (label) play_move_leftright::@7 Culled Empty Block (label) play_move_leftright::@7
@ -163,7 +162,7 @@ Culled Empty Block (label) play_move_leftright::@8
Culled Empty Block (label) play_move_leftright::@13 Culled Empty Block (label) play_move_leftright::@13
Culled Empty Block (label) play_move_leftright::@10 Culled Empty Block (label) play_move_leftright::@10
Culled Empty Block (label) play_move_leftright::@11 Culled Empty Block (label) play_move_leftright::@11
Culled Empty Block (label) @30 Culled Empty Block (label) @29
Culled Empty Block (label) play_move_rotate::@8 Culled Empty Block (label) play_move_rotate::@8
Culled Empty Block (label) play_move_rotate::@3 Culled Empty Block (label) play_move_rotate::@3
Culled Empty Block (label) play_move_rotate::@9 Culled Empty Block (label) play_move_rotate::@9
@ -176,26 +175,26 @@ Culled Empty Block (label) play_collision::@11
Culled Empty Block (label) play_collision::@7 Culled Empty Block (label) play_collision::@7
Culled Empty Block (label) play_collision::@13 Culled Empty Block (label) play_collision::@13
Culled Empty Block (label) play_collision::@19 Culled Empty Block (label) play_collision::@19
Culled Empty Block (label) @32 Culled Empty Block (label) @31
Culled Empty Block (label) play_lock_current::@6 Culled Empty Block (label) play_lock_current::@6
Culled Empty Block (label) @33 Culled Empty Block (label) @32
Culled Empty Block (label) play_spawn_current::@4 Culled Empty Block (label) play_spawn_current::@4
Culled Empty Block (label) play_spawn_current::sid_rnd1_@1 Culled Empty Block (label) play_spawn_current::sid_rnd1_@1
Culled Empty Block (label) play_spawn_current::@6 Culled Empty Block (label) play_spawn_current::@6
Culled Empty Block (label) play_spawn_current::@7 Culled Empty Block (label) play_spawn_current::@7
Culled Empty Block (label) play_spawn_current::@8 Culled Empty Block (label) play_spawn_current::@8
Culled Empty Block (label) @34 Culled Empty Block (label) @33
Culled Empty Block (label) play_remove_lines::@8 Culled Empty Block (label) play_remove_lines::@8
Culled Empty Block (label) play_remove_lines::@12 Culled Empty Block (label) play_remove_lines::@12
Culled Empty Block (label) play_remove_lines::@13 Culled Empty Block (label) play_remove_lines::@13
Culled Empty Block (label) play_remove_lines::@14 Culled Empty Block (label) play_remove_lines::@14
Culled Empty Block (label) play_remove_lines::@15 Culled Empty Block (label) play_remove_lines::@15
Culled Empty Block (label) @35 Culled Empty Block (label) @34
Culled Empty Block (label) play_update_score::@1 Culled Empty Block (label) play_update_score::@1
Culled Empty Block (label) play_update_score::@4 Culled Empty Block (label) play_update_score::@4
Culled Empty Block (label) @36 Culled Empty Block (label) @35
Culled Empty Block (label) play_increase_level::@5 Culled Empty Block (label) play_increase_level::@5
Culled Empty Block (label) @37 Culled Empty Block (label) @36
Culled Empty Block (label) main::@2 Culled Empty Block (label) main::@2
Culled Empty Block (label) main::@21 Culled Empty Block (label) main::@21
Culled Empty Block (label) main::@3 Culled Empty Block (label) main::@3
@ -262,8 +261,8 @@ CONTROL FLOW GRAPH SSA
(byte) GREY#0 ← (number) $c (byte) GREY#0 ← (number) $c
(byte) LIGHT_GREEN#0 ← (number) $d (byte) LIGHT_GREEN#0 ← (number) $d
(byte) LIGHT_BLUE#0 ← (number) $e (byte) LIGHT_BLUE#0 ← (number) $e
to:@5 to:@4
@5: scope:[] from @begin @4: scope:[] from @begin
(byte) KEY_Z#0 ← (number) $c (byte) KEY_Z#0 ← (number) $c
(byte) KEY_LSHIFT#0 ← (number) $f (byte) KEY_LSHIFT#0 ← (number) $f
(byte) KEY_X#0 ← (number) $17 (byte) KEY_X#0 ← (number) $17
@ -275,7 +274,7 @@ CONTROL FLOW GRAPH SSA
(byte) KEY_COMMODORE#0 ← (number) $3d (byte) KEY_COMMODORE#0 ← (number) $3d
(byte[8]) keyboard_matrix_row_bitmask#0 ← { (number) $fe, (number) $fd, (number) $fb, (number) $f7, (number) $ef, (number) $df, (number) $bf, (number) $7f } (byte[8]) keyboard_matrix_row_bitmask#0 ← { (number) $fe, (number) $fd, (number) $fb, (number) $f7, (number) $ef, (number) $df, (number) $bf, (number) $7f }
(byte[8]) keyboard_matrix_col_bitmask#0 ← { (number) 1, (number) 2, (number) 4, (number) 8, (number) $10, (number) $20, (number) $40, (number) $80 } (byte[8]) keyboard_matrix_col_bitmask#0 ← { (number) 1, (number) 2, (number) 4, (number) 8, (number) $10, (number) $20, (number) $40, (number) $80 }
to:@9 to:@8
keyboard_matrix_read: scope:[keyboard_matrix_read] from keyboard_event_scan::@8 keyboard_matrix_read: scope:[keyboard_matrix_read] from keyboard_event_scan::@8
(byte) keyboard_matrix_read::rowid#1 ← phi( keyboard_event_scan::@8/(byte) keyboard_matrix_read::rowid#0 ) (byte) keyboard_matrix_read::rowid#1 ← phi( keyboard_event_scan::@8/(byte) keyboard_matrix_read::rowid#0 )
*((byte*) CIA1_PORT_A#0) ← *((byte[8]) keyboard_matrix_row_bitmask#0 + (byte) keyboard_matrix_read::rowid#1) *((byte*) CIA1_PORT_A#0) ← *((byte[8]) keyboard_matrix_row_bitmask#0 + (byte) keyboard_matrix_read::rowid#1)
@ -288,7 +287,7 @@ keyboard_matrix_read::@return: scope:[keyboard_matrix_read] from keyboard_matri
(byte) keyboard_matrix_read::return#1 ← (byte) keyboard_matrix_read::return#3 (byte) keyboard_matrix_read::return#1 ← (byte) keyboard_matrix_read::return#3
return return
to:@return to:@return
@9: scope:[] from @5 @8: scope:[] from @4
(byte[8]) keyboard_events#0 ← { fill( 8, 0) } (byte[8]) keyboard_events#0 ← { fill( 8, 0) }
(byte) keyboard_events_size#0 ← (number) 0 (byte) keyboard_events_size#0 ← (number) 0
(byte) keyboard_modifiers#0 ← (number) 0 (byte) keyboard_modifiers#0 ← (number) 0
@ -297,7 +296,7 @@ keyboard_matrix_read::@return: scope:[keyboard_matrix_read] from keyboard_matri
(byte) KEY_MODIFIER_CTRL#0 ← (number) 4 (byte) KEY_MODIFIER_CTRL#0 ← (number) 4
(byte) KEY_MODIFIER_COMMODORE#0 ← (number) 8 (byte) KEY_MODIFIER_COMMODORE#0 ← (number) 8
(byte[8]) keyboard_scan_values#0 ← { fill( 8, 0) } (byte[8]) keyboard_scan_values#0 ← { fill( 8, 0) }
to:@12 to:@11
keyboard_event_scan: scope:[keyboard_event_scan] from main::@35 keyboard_event_scan: scope:[keyboard_event_scan] from main::@35
(byte) keyboard_events_size#53 ← phi( main::@35/(byte) keyboard_events_size#26 ) (byte) keyboard_events_size#53 ← phi( main::@35/(byte) keyboard_events_size#26 )
(byte) keyboard_event_scan::keycode#0 ← (number) 0 (byte) keyboard_event_scan::keycode#0 ← (number) 0
@ -542,14 +541,14 @@ keyboard_event_get::@return: scope:[keyboard_event_get] from keyboard_event_get
(byte) keyboard_events_size#5 ← (byte) keyboard_events_size#16 (byte) keyboard_events_size#5 ← (byte) keyboard_events_size#16
return return
to:@return to:@return
@12: scope:[] from @9 @11: scope:[] from @8
(byte) keyboard_modifiers#58 ← phi( @9/(byte) keyboard_modifiers#0 ) (byte) keyboard_modifiers#58 ← phi( @8/(byte) keyboard_modifiers#0 )
(byte) keyboard_events_size#76 ← phi( @9/(byte) keyboard_events_size#0 ) (byte) keyboard_events_size#76 ← phi( @8/(byte) keyboard_events_size#0 )
(word*) SID_VOICE3_FREQ#0 ← ((word*)) (number) $d40e (word*) SID_VOICE3_FREQ#0 ← ((word*)) (number) $d40e
(byte*) SID_VOICE3_CONTROL#0 ← ((byte*)) (number) $d412 (byte*) SID_VOICE3_CONTROL#0 ← ((byte*)) (number) $d412
(byte) SID_CONTROL_NOISE#0 ← (number) $80 (byte) SID_CONTROL_NOISE#0 ← (number) $80
(byte*) SID_VOICE3_OSC#0 ← ((byte*)) (number) $d41b (byte*) SID_VOICE3_OSC#0 ← ((byte*)) (number) $d41b
to:@14 to:@13
sid_rnd_init: scope:[sid_rnd_init] from main sid_rnd_init: scope:[sid_rnd_init] from main
*((word*) SID_VOICE3_FREQ#0) ← (number) $ffff *((word*) SID_VOICE3_FREQ#0) ← (number) $ffff
*((byte*) SID_VOICE3_CONTROL#0) ← (byte) SID_CONTROL_NOISE#0 *((byte*) SID_VOICE3_CONTROL#0) ← (byte) SID_CONTROL_NOISE#0
@ -557,9 +556,9 @@ sid_rnd_init: scope:[sid_rnd_init] from main
sid_rnd_init::@return: scope:[sid_rnd_init] from sid_rnd_init sid_rnd_init::@return: scope:[sid_rnd_init] from sid_rnd_init
return return
to:@return to:@return
@14: scope:[] from @12 @13: scope:[] from @11
(byte) keyboard_modifiers#56 ← phi( @12/(byte) keyboard_modifiers#58 ) (byte) keyboard_modifiers#56 ← phi( @11/(byte) keyboard_modifiers#58 )
(byte) keyboard_events_size#74 ← phi( @12/(byte) keyboard_events_size#76 ) (byte) keyboard_events_size#74 ← phi( @11/(byte) keyboard_events_size#76 )
(byte*) PLAYFIELD_SCREEN_1#0 ← ((byte*)) (number) $400 (byte*) PLAYFIELD_SCREEN_1#0 ← ((byte*)) (number) $400
(byte*) PLAYFIELD_SCREEN_2#0 ← ((byte*)) (number) $2c00 (byte*) PLAYFIELD_SCREEN_2#0 ← ((byte*)) (number) $2c00
(byte*~) $1 ← (byte*) PLAYFIELD_SCREEN_1#0 + (word) SPRITE_PTRS#0 (byte*~) $1 ← (byte*) PLAYFIELD_SCREEN_1#0 + (word) SPRITE_PTRS#0
@ -604,7 +603,7 @@ sid_rnd_init::@return: scope:[sid_rnd_init] from sid_rnd_init
(byte[]) PIECES_COLORS_2#0 ← { (byte) CYAN#0, (byte) LIGHT_GREEN#0, (byte) PINK#0, (byte) LIGHT_GREEN#0, (byte) LIGHT_GREEN#0, (byte) LIGHT_BLUE#0, (byte) DARK_GREY#0, (byte) PURPLE#0, (byte) RED#0, (byte) ORANGE#0, (byte) CYAN#0, (byte) LIGHT_GREEN#0, (byte) PINK#0, (byte) LIGHT_GREEN#0, (byte) LIGHT_GREEN#0, (byte) LIGHT_BLUE#0, (byte) DARK_GREY#0, (byte) PURPLE#0, (byte) RED#0, (byte) ORANGE#0, (byte) CYAN#0, (byte) LIGHT_GREEN#0, (byte) PINK#0, (byte) LIGHT_GREEN#0, (byte) LIGHT_GREEN#0, (byte) LIGHT_BLUE#0, (byte) DARK_GREY#0, (byte) PURPLE#0, (byte) RED#0, (byte) ORANGE#0 } (byte[]) PIECES_COLORS_2#0 ← { (byte) CYAN#0, (byte) LIGHT_GREEN#0, (byte) PINK#0, (byte) LIGHT_GREEN#0, (byte) LIGHT_GREEN#0, (byte) LIGHT_BLUE#0, (byte) DARK_GREY#0, (byte) PURPLE#0, (byte) RED#0, (byte) ORANGE#0, (byte) CYAN#0, (byte) LIGHT_GREEN#0, (byte) PINK#0, (byte) LIGHT_GREEN#0, (byte) LIGHT_GREEN#0, (byte) LIGHT_BLUE#0, (byte) DARK_GREY#0, (byte) PURPLE#0, (byte) RED#0, (byte) ORANGE#0, (byte) CYAN#0, (byte) LIGHT_GREEN#0, (byte) PINK#0, (byte) LIGHT_GREEN#0, (byte) LIGHT_GREEN#0, (byte) LIGHT_BLUE#0, (byte) DARK_GREY#0, (byte) PURPLE#0, (byte) RED#0, (byte) ORANGE#0 }
(byte*[PLAYFIELD_LINES#0]) screen_lines_1#0 ← { fill( PLAYFIELD_LINES#0, 0) } (byte*[PLAYFIELD_LINES#0]) screen_lines_1#0 ← { fill( PLAYFIELD_LINES#0, 0) }
(byte*[PLAYFIELD_LINES#0]) screen_lines_2#0 ← { fill( PLAYFIELD_LINES#0, 0) } (byte*[PLAYFIELD_LINES#0]) screen_lines_2#0 ← { fill( PLAYFIELD_LINES#0, 0) }
to:@23 to:@22
render_init: scope:[render_init] from main::@25 render_init: scope:[render_init] from main::@25
(byte*) render_init::vicSelectGfxBank1_gfx#0 ← (byte*) PLAYFIELD_CHARSET#0 (byte*) render_init::vicSelectGfxBank1_gfx#0 ← (byte*) PLAYFIELD_CHARSET#0
to:render_init::vicSelectGfxBank1 to:render_init::vicSelectGfxBank1
@ -1226,21 +1225,21 @@ render_next::@11: scope:[render_next] from render_next::@8
render_next::@return: scope:[render_next] from render_next::@11 render_next::@return: scope:[render_next] from render_next::@11
return return
to:@return to:@return
@23: scope:[] from @14 @22: scope:[] from @13
(byte) level_bcd#95 ← phi( @14/(byte) level_bcd#0 ) (byte) level_bcd#95 ← phi( @13/(byte) level_bcd#0 )
(byte) level#103 ← phi( @14/(byte) level#0 ) (byte) level#103 ← phi( @13/(byte) level#0 )
(dword) score_bcd#78 ← phi( @14/(dword) score_bcd#0 ) (dword) score_bcd#78 ← phi( @13/(dword) score_bcd#0 )
(word) lines_bcd#82 ← phi( @14/(word) lines_bcd#0 ) (word) lines_bcd#82 ← phi( @13/(word) lines_bcd#0 )
(byte) keyboard_modifiers#54 ← phi( @14/(byte) keyboard_modifiers#56 ) (byte) keyboard_modifiers#54 ← phi( @13/(byte) keyboard_modifiers#56 )
(byte) keyboard_events_size#72 ← phi( @14/(byte) keyboard_events_size#74 ) (byte) keyboard_events_size#72 ← phi( @13/(byte) keyboard_events_size#74 )
(byte) render_screen_showing#42 ← phi( @14/(byte) render_screen_showing#0 ) (byte) render_screen_showing#42 ← phi( @13/(byte) render_screen_showing#0 )
(byte) game_over#85 ← phi( @14/(byte) game_over#0 ) (byte) game_over#85 ← phi( @13/(byte) game_over#0 )
(byte) current_ypos#97 ← phi( @14/(byte) current_ypos#0 ) (byte) current_ypos#97 ← phi( @13/(byte) current_ypos#0 )
(byte) current_xpos#118 ← phi( @14/(byte) current_xpos#0 ) (byte) current_xpos#118 ← phi( @13/(byte) current_xpos#0 )
(byte*) current_piece_gfx#111 ← phi( @14/(byte*) current_piece_gfx#0 ) (byte*) current_piece_gfx#111 ← phi( @13/(byte*) current_piece_gfx#0 )
(byte) current_piece_char#99 ← phi( @14/(byte) current_piece_char#0 ) (byte) current_piece_char#99 ← phi( @13/(byte) current_piece_char#0 )
(byte) render_screen_render#62 ← phi( @14/(byte) render_screen_render#0 ) (byte) render_screen_render#62 ← phi( @13/(byte) render_screen_render#0 )
(byte) render_screen_show#57 ← phi( @14/(byte) render_screen_show#0 ) (byte) render_screen_show#57 ← phi( @13/(byte) render_screen_show#0 )
kickasm(location (byte*) PLAYFIELD_SPRITES#0) {{ .var sprites = LoadPicture("playfield-sprites.png", List().add($010101, $000000)) kickasm(location (byte*) PLAYFIELD_SPRITES#0) {{ .var sprites = LoadPicture("playfield-sprites.png", List().add($010101, $000000))
// Put the sprites into memory // Put the sprites into memory
.for(var sy=0;sy<10;sy++) { .for(var sy=0;sy<10;sy++) {
@ -1256,7 +1255,7 @@ render_next::@return: scope:[render_next] from render_next::@11
} }
} }
}} }}
to:@24 to:@23
sprites_init: scope:[sprites_init] from main::@26 sprites_init: scope:[sprites_init] from main::@26
*((byte*) SPRITES_ENABLE#0) ← (number) $f *((byte*) SPRITES_ENABLE#0) ← (number) $f
*((byte*) SPRITES_MC#0) ← (number) 0 *((byte*) SPRITES_MC#0) ← (number) 0
@ -1281,21 +1280,21 @@ sprites_init::@1: scope:[sprites_init] from sprites_init sprites_init::@1
sprites_init::@return: scope:[sprites_init] from sprites_init::@1 sprites_init::@return: scope:[sprites_init] from sprites_init::@1
return return
to:@return to:@return
@24: scope:[] from @23 @23: scope:[] from @22
(byte) level_bcd#92 ← phi( @23/(byte) level_bcd#95 ) (byte) level_bcd#92 ← phi( @22/(byte) level_bcd#95 )
(byte) level#99 ← phi( @23/(byte) level#103 ) (byte) level#99 ← phi( @22/(byte) level#103 )
(dword) score_bcd#76 ← phi( @23/(dword) score_bcd#78 ) (dword) score_bcd#76 ← phi( @22/(dword) score_bcd#78 )
(word) lines_bcd#79 ← phi( @23/(word) lines_bcd#82 ) (word) lines_bcd#79 ← phi( @22/(word) lines_bcd#82 )
(byte) keyboard_modifiers#51 ← phi( @23/(byte) keyboard_modifiers#54 ) (byte) keyboard_modifiers#51 ← phi( @22/(byte) keyboard_modifiers#54 )
(byte) keyboard_events_size#68 ← phi( @23/(byte) keyboard_events_size#72 ) (byte) keyboard_events_size#68 ← phi( @22/(byte) keyboard_events_size#72 )
(byte) render_screen_showing#39 ← phi( @23/(byte) render_screen_showing#42 ) (byte) render_screen_showing#39 ← phi( @22/(byte) render_screen_showing#42 )
(byte) game_over#83 ← phi( @23/(byte) game_over#85 ) (byte) game_over#83 ← phi( @22/(byte) game_over#85 )
(byte) current_ypos#96 ← phi( @23/(byte) current_ypos#97 ) (byte) current_ypos#96 ← phi( @22/(byte) current_ypos#97 )
(byte) current_xpos#117 ← phi( @23/(byte) current_xpos#118 ) (byte) current_xpos#117 ← phi( @22/(byte) current_xpos#118 )
(byte*) current_piece_gfx#110 ← phi( @23/(byte*) current_piece_gfx#111 ) (byte*) current_piece_gfx#110 ← phi( @22/(byte*) current_piece_gfx#111 )
(byte) current_piece_char#98 ← phi( @23/(byte) current_piece_char#99 ) (byte) current_piece_char#98 ← phi( @22/(byte) current_piece_char#99 )
(byte) render_screen_render#60 ← phi( @23/(byte) render_screen_render#62 ) (byte) render_screen_render#60 ← phi( @22/(byte) render_screen_render#62 )
(byte) render_screen_show#55 ← phi( @23/(byte) render_screen_show#57 ) (byte) render_screen_show#55 ← phi( @22/(byte) render_screen_show#57 )
(byte) SPRITES_FIRST_YPOS#0 ← (number) $31 (byte) SPRITES_FIRST_YPOS#0 ← (number) $31
(number~) $4 ← (byte) SPRITES_FIRST_YPOS#0 + (number) $13 (number~) $4 ← (byte) SPRITES_FIRST_YPOS#0 + (number) $13
(byte) IRQ_RASTER_FIRST#0 ← (number~) $4 (byte) IRQ_RASTER_FIRST#0 ← (number~) $4
@ -1304,24 +1303,24 @@ sprites_init::@return: scope:[sprites_init] from sprites_init::@1
(byte) irq_sprite_ypos#0 ← (number~) $5 (byte) irq_sprite_ypos#0 ← (number~) $5
(byte*) toSpritePtr1_sprite#0 ← (byte*) PLAYFIELD_SPRITES#0 (byte*) toSpritePtr1_sprite#0 ← (byte*) PLAYFIELD_SPRITES#0
to:toSpritePtr1 to:toSpritePtr1
toSpritePtr1: scope:[] from @24 toSpritePtr1: scope:[] from @23
(byte) level_bcd#85 ← phi( @24/(byte) level_bcd#92 ) (byte) level_bcd#85 ← phi( @23/(byte) level_bcd#92 )
(byte) level#92 ← phi( @24/(byte) level#99 ) (byte) level#92 ← phi( @23/(byte) level#99 )
(dword) score_bcd#70 ← phi( @24/(dword) score_bcd#76 ) (dword) score_bcd#70 ← phi( @23/(dword) score_bcd#76 )
(word) lines_bcd#73 ← phi( @24/(word) lines_bcd#79 ) (word) lines_bcd#73 ← phi( @23/(word) lines_bcd#79 )
(byte) keyboard_modifiers#48 ← phi( @24/(byte) keyboard_modifiers#51 ) (byte) keyboard_modifiers#48 ← phi( @23/(byte) keyboard_modifiers#51 )
(byte) keyboard_events_size#63 ← phi( @24/(byte) keyboard_events_size#68 ) (byte) keyboard_events_size#63 ← phi( @23/(byte) keyboard_events_size#68 )
(byte) render_screen_showing#36 ← phi( @24/(byte) render_screen_showing#39 ) (byte) render_screen_showing#36 ← phi( @23/(byte) render_screen_showing#39 )
(byte) game_over#78 ← phi( @24/(byte) game_over#83 ) (byte) game_over#78 ← phi( @23/(byte) game_over#83 )
(byte) current_ypos#93 ← phi( @24/(byte) current_ypos#96 ) (byte) current_ypos#93 ← phi( @23/(byte) current_ypos#96 )
(byte) current_xpos#114 ← phi( @24/(byte) current_xpos#117 ) (byte) current_xpos#114 ← phi( @23/(byte) current_xpos#117 )
(byte*) current_piece_gfx#105 ← phi( @24/(byte*) current_piece_gfx#110 ) (byte*) current_piece_gfx#105 ← phi( @23/(byte*) current_piece_gfx#110 )
(byte) current_piece_char#92 ← phi( @24/(byte) current_piece_char#98 ) (byte) current_piece_char#92 ← phi( @23/(byte) current_piece_char#98 )
(byte) render_screen_render#57 ← phi( @24/(byte) render_screen_render#60 ) (byte) render_screen_render#57 ← phi( @23/(byte) render_screen_render#60 )
(byte) render_screen_show#52 ← phi( @24/(byte) render_screen_show#55 ) (byte) render_screen_show#52 ← phi( @23/(byte) render_screen_show#55 )
(byte) irq_raster_next#24 ← phi( @24/(byte) irq_raster_next#0 ) (byte) irq_raster_next#24 ← phi( @23/(byte) irq_raster_next#0 )
(byte) irq_sprite_ypos#24 ← phi( @24/(byte) irq_sprite_ypos#0 ) (byte) irq_sprite_ypos#24 ← phi( @23/(byte) irq_sprite_ypos#0 )
(byte*) toSpritePtr1_sprite#1 ← phi( @24/(byte*) toSpritePtr1_sprite#0 ) (byte*) toSpritePtr1_sprite#1 ← phi( @23/(byte*) toSpritePtr1_sprite#0 )
(word~) toSpritePtr1_$0#0 ← ((word)) (byte*) toSpritePtr1_sprite#1 (word~) toSpritePtr1_$0#0 ← ((word)) (byte*) toSpritePtr1_sprite#1
(number~) toSpritePtr1_$1#0 ← (word~) toSpritePtr1_$0#0 / (number) $40 (number~) toSpritePtr1_$1#0 ← (word~) toSpritePtr1_$0#0 / (number) $40
(byte~) toSpritePtr1_$2#0 ← ((byte)) (number~) toSpritePtr1_$1#0 (byte~) toSpritePtr1_$2#0 ← ((byte)) (number~) toSpritePtr1_$1#0
@ -1346,8 +1345,8 @@ toSpritePtr1_@return: scope:[] from toSpritePtr1
(byte) irq_sprite_ypos#22 ← phi( toSpritePtr1/(byte) irq_sprite_ypos#24 ) (byte) irq_sprite_ypos#22 ← phi( toSpritePtr1/(byte) irq_sprite_ypos#24 )
(byte) toSpritePtr1_return#2 ← phi( toSpritePtr1/(byte) toSpritePtr1_return#0 ) (byte) toSpritePtr1_return#2 ← phi( toSpritePtr1/(byte) toSpritePtr1_return#0 )
(byte) toSpritePtr1_return#1 ← (byte) toSpritePtr1_return#2 (byte) toSpritePtr1_return#1 ← (byte) toSpritePtr1_return#2
to:@39 to:@38
@39: scope:[] from toSpritePtr1_@return @38: scope:[] from toSpritePtr1_@return
(byte) level_bcd#68 ← phi( toSpritePtr1_@return/(byte) level_bcd#78 ) (byte) level_bcd#68 ← phi( toSpritePtr1_@return/(byte) level_bcd#78 )
(byte) level#72 ← phi( toSpritePtr1_@return/(byte) level#85 ) (byte) level#72 ← phi( toSpritePtr1_@return/(byte) level#85 )
(dword) score_bcd#56 ← phi( toSpritePtr1_@return/(dword) score_bcd#65 ) (dword) score_bcd#56 ← phi( toSpritePtr1_@return/(dword) score_bcd#65 )
@ -1369,7 +1368,7 @@ toSpritePtr1_@return: scope:[] from toSpritePtr1
(number~) $7 ← (byte~) $6 + (number) 3 (number~) $7 ← (byte~) $6 + (number) 3
(byte) irq_sprite_ptr#0 ← (number~) $7 (byte) irq_sprite_ptr#0 ← (number~) $7
(byte) irq_cnt#0 ← (number) 0 (byte) irq_cnt#0 ← (number) 0
to:@26 to:@25
sprites_irq_init: scope:[sprites_irq_init] from main::@27 sprites_irq_init: scope:[sprites_irq_init] from main::@27
asm { sei } asm { sei }
*((byte*) IRQ_STATUS#0) ← (byte) IRQ_RASTER#0 *((byte*) IRQ_STATUS#0) ← (byte) IRQ_RASTER#0
@ -1388,11 +1387,11 @@ sprites_irq_init::@return: scope:[sprites_irq_init] from sprites_irq_init
return return
to:@return to:@return
sprites_irq: scope:[sprites_irq] from sprites_irq: scope:[sprites_irq] from
(byte) irq_cnt#15 ← phi( @38/(byte) irq_cnt#17 ) (byte) irq_cnt#15 ← phi( @37/(byte) irq_cnt#17 )
(byte) render_screen_showing#15 ← phi( @38/(byte) render_screen_showing#14 ) (byte) render_screen_showing#15 ← phi( @37/(byte) render_screen_showing#14 )
(byte) irq_sprite_ptr#12 ← phi( @38/(byte) irq_sprite_ptr#14 ) (byte) irq_sprite_ptr#12 ← phi( @37/(byte) irq_sprite_ptr#14 )
(byte) irq_raster_next#5 ← phi( @38/(byte) irq_raster_next#10 ) (byte) irq_raster_next#5 ← phi( @37/(byte) irq_raster_next#10 )
(byte) irq_sprite_ypos#5 ← phi( @38/(byte) irq_sprite_ypos#9 ) (byte) irq_sprite_ypos#5 ← phi( @37/(byte) irq_sprite_ypos#9 )
asm { cld } asm { cld }
(byte) sprites_irq::ypos#0 ← (byte) irq_sprite_ypos#5 (byte) sprites_irq::ypos#0 ← (byte) irq_sprite_ypos#5
*((byte*) SPRITES_YPOS#0 + (number) 0) ← (byte) sprites_irq::ypos#0 *((byte*) SPRITES_YPOS#0 + (number) 0) ← (byte) sprites_irq::ypos#0
@ -1533,25 +1532,25 @@ sprites_irq::@return: scope:[sprites_irq] from sprites_irq::@6
(byte) irq_sprite_ptr#4 ← (byte) irq_sprite_ptr#8 (byte) irq_sprite_ptr#4 ← (byte) irq_sprite_ptr#8
return return
to:@return to:@return
@26: scope:[] from @39 @25: scope:[] from @38
(byte) irq_cnt#20 ← phi( @39/(byte) irq_cnt#0 ) (byte) irq_cnt#20 ← phi( @38/(byte) irq_cnt#0 )
(byte) irq_sprite_ptr#18 ← phi( @39/(byte) irq_sprite_ptr#0 ) (byte) irq_sprite_ptr#18 ← phi( @38/(byte) irq_sprite_ptr#0 )
(byte) level_bcd#61 ← phi( @39/(byte) level_bcd#68 ) (byte) level_bcd#61 ← phi( @38/(byte) level_bcd#68 )
(byte) level#64 ← phi( @39/(byte) level#72 ) (byte) level#64 ← phi( @38/(byte) level#72 )
(dword) score_bcd#51 ← phi( @39/(dword) score_bcd#56 ) (dword) score_bcd#51 ← phi( @38/(dword) score_bcd#56 )
(word) lines_bcd#51 ← phi( @39/(word) lines_bcd#58 ) (word) lines_bcd#51 ← phi( @38/(word) lines_bcd#58 )
(byte) keyboard_modifiers#33 ← phi( @39/(byte) keyboard_modifiers#39 ) (byte) keyboard_modifiers#33 ← phi( @38/(byte) keyboard_modifiers#39 )
(byte) keyboard_events_size#40 ← phi( @39/(byte) keyboard_events_size#48 ) (byte) keyboard_events_size#40 ← phi( @38/(byte) keyboard_events_size#48 )
(byte) render_screen_showing#21 ← phi( @39/(byte) render_screen_showing#26 ) (byte) render_screen_showing#21 ← phi( @38/(byte) render_screen_showing#26 )
(byte) game_over#51 ← phi( @39/(byte) game_over#59 ) (byte) game_over#51 ← phi( @38/(byte) game_over#59 )
(byte) current_ypos#69 ← phi( @39/(byte) current_ypos#77 ) (byte) current_ypos#69 ← phi( @38/(byte) current_ypos#77 )
(byte) current_xpos#85 ← phi( @39/(byte) current_xpos#97 ) (byte) current_xpos#85 ← phi( @38/(byte) current_xpos#97 )
(byte*) current_piece_gfx#72 ← phi( @39/(byte*) current_piece_gfx#84 ) (byte*) current_piece_gfx#72 ← phi( @38/(byte*) current_piece_gfx#84 )
(byte) current_piece_char#58 ← phi( @39/(byte) current_piece_char#70 ) (byte) current_piece_char#58 ← phi( @38/(byte) current_piece_char#70 )
(byte) render_screen_render#43 ← phi( @39/(byte) render_screen_render#49 ) (byte) render_screen_render#43 ← phi( @38/(byte) render_screen_render#49 )
(byte) render_screen_show#35 ← phi( @39/(byte) render_screen_show#42 ) (byte) render_screen_show#35 ← phi( @38/(byte) render_screen_show#42 )
(byte) irq_raster_next#20 ← phi( @39/(byte) irq_raster_next#22 ) (byte) irq_raster_next#20 ← phi( @38/(byte) irq_raster_next#22 )
(byte) irq_sprite_ypos#18 ← phi( @39/(byte) irq_sprite_ypos#21 ) (byte) irq_sprite_ypos#18 ← phi( @38/(byte) irq_sprite_ypos#21 )
(byte[4*4*4]) PIECE_T#0 ← { (number) 0, (number) 0, (number) 0, (number) 0, (number) 1, (number) 1, (number) 1, (number) 0, (number) 0, (number) 1, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0, (number) 1, (number) 0, (number) 0, (number) 1, (number) 1, (number) 0, (number) 0, (number) 0, (number) 1, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0, (number) 1, (number) 0, (number) 0, (number) 1, (number) 1, (number) 1, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0, (number) 1, (number) 0, (number) 0, (number) 0, (number) 1, (number) 1, (number) 0, (number) 0, (number) 1, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0 } (byte[4*4*4]) PIECE_T#0 ← { (number) 0, (number) 0, (number) 0, (number) 0, (number) 1, (number) 1, (number) 1, (number) 0, (number) 0, (number) 1, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0, (number) 1, (number) 0, (number) 0, (number) 1, (number) 1, (number) 0, (number) 0, (number) 0, (number) 1, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0, (number) 1, (number) 0, (number) 0, (number) 1, (number) 1, (number) 1, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0, (number) 1, (number) 0, (number) 0, (number) 0, (number) 1, (number) 1, (number) 0, (number) 0, (number) 1, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0 }
(byte[4*4*4]) PIECE_S#0 ← { (number) 0, (number) 0, (number) 0, (number) 0, (number) 0, (number) 1, (number) 1, (number) 0, (number) 1, (number) 1, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0, (number) 1, (number) 0, (number) 0, (number) 0, (number) 1, (number) 1, (number) 0, (number) 0, (number) 0, (number) 1, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0, (number) 1, (number) 1, (number) 0, (number) 1, (number) 1, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0, (number) 1, (number) 0, (number) 0, (number) 0, (number) 1, (number) 1, (number) 0, (number) 0, (number) 0, (number) 1, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0 } (byte[4*4*4]) PIECE_S#0 ← { (number) 0, (number) 0, (number) 0, (number) 0, (number) 0, (number) 1, (number) 1, (number) 0, (number) 1, (number) 1, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0, (number) 1, (number) 0, (number) 0, (number) 0, (number) 1, (number) 1, (number) 0, (number) 0, (number) 0, (number) 1, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0, (number) 1, (number) 1, (number) 0, (number) 1, (number) 1, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0, (number) 1, (number) 0, (number) 0, (number) 0, (number) 1, (number) 1, (number) 0, (number) 0, (number) 0, (number) 1, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0 }
(byte[4*4*4]) PIECE_Z#0 ← { (number) 0, (number) 0, (number) 0, (number) 0, (number) 1, (number) 1, (number) 0, (number) 0, (number) 0, (number) 1, (number) 1, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0, (number) 1, (number) 0, (number) 0, (number) 1, (number) 1, (number) 0, (number) 0, (number) 1, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0, (number) 1, (number) 1, (number) 0, (number) 0, (number) 0, (number) 1, (number) 1, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0, (number) 1, (number) 0, (number) 0, (number) 1, (number) 1, (number) 0, (number) 0, (number) 1, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0 } (byte[4*4*4]) PIECE_Z#0 ← { (number) 0, (number) 0, (number) 0, (number) 0, (number) 1, (number) 1, (number) 0, (number) 0, (number) 0, (number) 1, (number) 1, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0, (number) 1, (number) 0, (number) 0, (number) 1, (number) 1, (number) 0, (number) 0, (number) 1, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0, (number) 1, (number) 1, (number) 0, (number) 0, (number) 0, (number) 1, (number) 1, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0, (number) 1, (number) 0, (number) 0, (number) 1, (number) 1, (number) 0, (number) 0, (number) 1, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0, (number) 0 }
@ -1583,7 +1582,7 @@ sprites_irq::@return: scope:[sprites_irq] from sprites_irq::@6
(byte) current_movedown_counter#0 ← (number) 0 (byte) current_movedown_counter#0 ← (number) 0
(dword[]) SCORE_BASE_BCD#0 ← { (number) 0, (number) $40, (number) $100, (number) $300, (number) $1200 } (dword[]) SCORE_BASE_BCD#0 ← { (number) 0, (number) $40, (number) $100, (number) $300, (number) $1200 }
(dword[5]) score_add_bcd#0 ← { fill( 5, 0) } (dword[5]) score_add_bcd#0 ← { fill( 5, 0) }
to:@31 to:@30
play_init: scope:[play_init] from main::@28 play_init: scope:[play_init] from main::@28
(byte) level#44 ← phi( main::@28/(byte) level#58 ) (byte) level#44 ← phi( main::@28/(byte) level#58 )
(byte) play_init::idx#0 ← (number) 0 (byte) play_init::idx#0 ← (number) 0
@ -2375,36 +2374,36 @@ play_move_rotate::@11: scope:[play_move_rotate] from play_move_rotate::@14
(byte*) current_piece_gfx#7 ← (byte*~) play_move_rotate::$9 (byte*) current_piece_gfx#7 ← (byte*~) play_move_rotate::$9
(byte) play_move_rotate::return#4 ← (number) 1 (byte) play_move_rotate::return#4 ← (number) 1
to:play_move_rotate::@return to:play_move_rotate::@return
@31: scope:[] from @26 @30: scope:[] from @25
(byte) irq_cnt#19 ← phi( @26/(byte) irq_cnt#20 ) (byte) irq_cnt#19 ← phi( @25/(byte) irq_cnt#20 )
(byte) irq_sprite_ptr#17 ← phi( @26/(byte) irq_sprite_ptr#18 ) (byte) irq_sprite_ptr#17 ← phi( @25/(byte) irq_sprite_ptr#18 )
(byte) level_bcd#54 ← phi( @26/(byte) level_bcd#61 ) (byte) level_bcd#54 ← phi( @25/(byte) level_bcd#61 )
(byte) level#55 ← phi( @26/(byte) level#64 ) (byte) level#55 ← phi( @25/(byte) level#64 )
(dword) score_bcd#44 ← phi( @26/(dword) score_bcd#51 ) (dword) score_bcd#44 ← phi( @25/(dword) score_bcd#51 )
(word) lines_bcd#44 ← phi( @26/(word) lines_bcd#51 ) (word) lines_bcd#44 ← phi( @25/(word) lines_bcd#51 )
(byte) current_movedown_counter#34 ← phi( @26/(byte) current_movedown_counter#0 ) (byte) current_movedown_counter#34 ← phi( @25/(byte) current_movedown_counter#0 )
(byte) keyboard_modifiers#32 ← phi( @26/(byte) keyboard_modifiers#33 ) (byte) keyboard_modifiers#32 ← phi( @25/(byte) keyboard_modifiers#33 )
(byte) keyboard_events_size#36 ← phi( @26/(byte) keyboard_events_size#40 ) (byte) keyboard_events_size#36 ← phi( @25/(byte) keyboard_events_size#40 )
(byte) render_screen_showing#20 ← phi( @26/(byte) render_screen_showing#21 ) (byte) render_screen_showing#20 ← phi( @25/(byte) render_screen_showing#21 )
(byte) next_piece_idx#46 ← phi( @26/(byte) next_piece_idx#0 ) (byte) next_piece_idx#46 ← phi( @25/(byte) next_piece_idx#0 )
(byte) game_over#45 ← phi( @26/(byte) game_over#51 ) (byte) game_over#45 ← phi( @25/(byte) game_over#51 )
(byte) current_ypos#64 ← phi( @26/(byte) current_ypos#69 ) (byte) current_ypos#64 ← phi( @25/(byte) current_ypos#69 )
(byte) current_xpos#75 ← phi( @26/(byte) current_xpos#85 ) (byte) current_xpos#75 ← phi( @25/(byte) current_xpos#85 )
(byte*) current_piece_gfx#63 ← phi( @26/(byte*) current_piece_gfx#72 ) (byte*) current_piece_gfx#63 ← phi( @25/(byte*) current_piece_gfx#72 )
(byte) current_orientation#62 ← phi( @26/(byte) current_orientation#0 ) (byte) current_orientation#62 ← phi( @25/(byte) current_orientation#0 )
(byte) current_piece_char#51 ← phi( @26/(byte) current_piece_char#58 ) (byte) current_piece_char#51 ← phi( @25/(byte) current_piece_char#58 )
(byte*) current_piece#54 ← phi( @26/(byte*) current_piece#0 ) (byte*) current_piece#54 ← phi( @25/(byte*) current_piece#0 )
(byte) current_movedown_slow#59 ← phi( @26/(byte) current_movedown_slow#0 ) (byte) current_movedown_slow#59 ← phi( @25/(byte) current_movedown_slow#0 )
(byte) render_screen_render#40 ← phi( @26/(byte) render_screen_render#43 ) (byte) render_screen_render#40 ← phi( @25/(byte) render_screen_render#43 )
(byte) render_screen_show#32 ← phi( @26/(byte) render_screen_show#35 ) (byte) render_screen_show#32 ← phi( @25/(byte) render_screen_show#35 )
(byte) irq_raster_next#17 ← phi( @26/(byte) irq_raster_next#20 ) (byte) irq_raster_next#17 ← phi( @25/(byte) irq_raster_next#20 )
(byte) irq_sprite_ypos#14 ← phi( @26/(byte) irq_sprite_ypos#18 ) (byte) irq_sprite_ypos#14 ← phi( @25/(byte) irq_sprite_ypos#18 )
(byte) COLLISION_NONE#0 ← (number) 0 (byte) COLLISION_NONE#0 ← (number) 0
(byte) COLLISION_PLAYFIELD#0 ← (number) 1 (byte) COLLISION_PLAYFIELD#0 ← (number) 1
(byte) COLLISION_BOTTOM#0 ← (number) 2 (byte) COLLISION_BOTTOM#0 ← (number) 2
(byte) COLLISION_LEFT#0 ← (number) 4 (byte) COLLISION_LEFT#0 ← (number) 4
(byte) COLLISION_RIGHT#0 ← (number) 8 (byte) COLLISION_RIGHT#0 ← (number) 8
to:@38 to:@37
play_collision: scope:[play_collision] from play_move_down::@9 play_move_leftright::@1 play_move_leftright::@5 play_move_rotate::@4 play_spawn_current play_collision: scope:[play_collision] from play_move_down::@9 play_move_leftright::@1 play_move_leftright::@5 play_move_rotate::@4 play_spawn_current
(byte) play_collision::xpos#6 ← phi( play_move_down::@9/(byte) play_collision::xpos#0 play_move_leftright::@1/(byte) play_collision::xpos#1 play_move_leftright::@5/(byte) play_collision::xpos#2 play_move_rotate::@4/(byte) play_collision::xpos#3 play_spawn_current/(byte) play_collision::xpos#4 ) (byte) play_collision::xpos#6 ← phi( play_move_down::@9/(byte) play_collision::xpos#0 play_move_leftright::@1/(byte) play_collision::xpos#1 play_move_leftright::@5/(byte) play_collision::xpos#2 play_move_rotate::@4/(byte) play_collision::xpos#3 play_spawn_current/(byte) play_collision::xpos#4 )
(byte) play_collision::ypos#5 ← phi( play_move_down::@9/(byte) play_collision::ypos#0 play_move_leftright::@1/(byte) play_collision::ypos#1 play_move_leftright::@5/(byte) play_collision::ypos#2 play_move_rotate::@4/(byte) play_collision::ypos#3 play_spawn_current/(byte) play_collision::ypos#4 ) (byte) play_collision::ypos#5 ← phi( play_move_down::@9/(byte) play_collision::ypos#0 play_move_leftright::@1/(byte) play_collision::ypos#1 play_move_leftright::@5/(byte) play_collision::ypos#2 play_move_rotate::@4/(byte) play_collision::ypos#3 play_spawn_current/(byte) play_collision::ypos#4 )
@ -2980,26 +2979,26 @@ play_increase_level::@return: scope:[play_increase_level] from play_increase_le
(byte) level_bcd#9 ← (byte) level_bcd#22 (byte) level_bcd#9 ← (byte) level_bcd#22
return return
to:@return to:@return
main: scope:[main] from @38 main: scope:[main] from @37
(byte) level_bcd#100 ← phi( @38/(byte) level_bcd#41 ) (byte) level_bcd#100 ← phi( @37/(byte) level_bcd#41 )
(dword) score_bcd#83 ← phi( @38/(dword) score_bcd#32 ) (dword) score_bcd#83 ← phi( @37/(dword) score_bcd#32 )
(word) lines_bcd#87 ← phi( @38/(word) lines_bcd#32 ) (word) lines_bcd#87 ← phi( @37/(word) lines_bcd#32 )
(byte) current_movedown_counter#58 ← phi( @38/(byte) current_movedown_counter#26 ) (byte) current_movedown_counter#58 ← phi( @37/(byte) current_movedown_counter#26 )
(byte) keyboard_modifiers#61 ← phi( @38/(byte) keyboard_modifiers#24 ) (byte) keyboard_modifiers#61 ← phi( @37/(byte) keyboard_modifiers#24 )
(byte) keyboard_events_size#79 ← phi( @38/(byte) keyboard_events_size#28 ) (byte) keyboard_events_size#79 ← phi( @37/(byte) keyboard_events_size#28 )
(byte) render_screen_showing#47 ← phi( @38/(byte) render_screen_showing#14 ) (byte) render_screen_showing#47 ← phi( @37/(byte) render_screen_showing#14 )
(byte) level#100 ← phi( @38/(byte) level#41 ) (byte) level#100 ← phi( @37/(byte) level#41 )
(byte) game_over#81 ← phi( @38/(byte) game_over#34 ) (byte) game_over#81 ← phi( @37/(byte) game_over#34 )
(byte) current_ypos#94 ← phi( @38/(byte) current_ypos#49 ) (byte) current_ypos#94 ← phi( @37/(byte) current_ypos#49 )
(byte) current_xpos#115 ← phi( @38/(byte) current_xpos#58 ) (byte) current_xpos#115 ← phi( @37/(byte) current_xpos#58 )
(byte*) current_piece_gfx#108 ← phi( @38/(byte*) current_piece_gfx#45 ) (byte*) current_piece_gfx#108 ← phi( @37/(byte*) current_piece_gfx#45 )
(byte) current_orientation#92 ← phi( @38/(byte) current_orientation#49 ) (byte) current_orientation#92 ← phi( @37/(byte) current_orientation#49 )
(byte) current_piece_char#95 ← phi( @38/(byte) current_piece_char#36 ) (byte) current_piece_char#95 ← phi( @37/(byte) current_piece_char#36 )
(byte*) current_piece#88 ← phi( @38/(byte*) current_piece#39 ) (byte*) current_piece#88 ← phi( @37/(byte*) current_piece#39 )
(byte) next_piece_idx#75 ← phi( @38/(byte) next_piece_idx#35 ) (byte) next_piece_idx#75 ← phi( @37/(byte) next_piece_idx#35 )
(byte) current_movedown_slow#80 ← phi( @38/(byte) current_movedown_slow#46 ) (byte) current_movedown_slow#80 ← phi( @37/(byte) current_movedown_slow#46 )
(byte) render_screen_render#35 ← phi( @38/(byte) render_screen_render#29 ) (byte) render_screen_render#35 ← phi( @37/(byte) render_screen_render#29 )
(byte) render_screen_show#27 ← phi( @38/(byte) render_screen_show#24 ) (byte) render_screen_show#27 ← phi( @37/(byte) render_screen_show#24 )
call sid_rnd_init call sid_rnd_init
to:main::@25 to:main::@25
main::@25: scope:[main] from main main::@25: scope:[main] from main
@ -3692,52 +3691,52 @@ main::@return: scope:[main] from main::@1
(byte) level_bcd#11 ← (byte) level_bcd#24 (byte) level_bcd#11 ← (byte) level_bcd#24
return return
to:@return to:@return
@38: scope:[] from @31 @37: scope:[] from @30
(byte) irq_cnt#17 ← phi( @31/(byte) irq_cnt#19 ) (byte) irq_cnt#17 ← phi( @30/(byte) irq_cnt#19 )
(byte) irq_sprite_ptr#14 ← phi( @31/(byte) irq_sprite_ptr#17 ) (byte) irq_sprite_ptr#14 ← phi( @30/(byte) irq_sprite_ptr#17 )
(byte) level_bcd#41 ← phi( @31/(byte) level_bcd#54 ) (byte) level_bcd#41 ← phi( @30/(byte) level_bcd#54 )
(byte) level#41 ← phi( @31/(byte) level#55 ) (byte) level#41 ← phi( @30/(byte) level#55 )
(dword) score_bcd#32 ← phi( @31/(dword) score_bcd#44 ) (dword) score_bcd#32 ← phi( @30/(dword) score_bcd#44 )
(word) lines_bcd#32 ← phi( @31/(word) lines_bcd#44 ) (word) lines_bcd#32 ← phi( @30/(word) lines_bcd#44 )
(byte) current_movedown_counter#26 ← phi( @31/(byte) current_movedown_counter#34 ) (byte) current_movedown_counter#26 ← phi( @30/(byte) current_movedown_counter#34 )
(byte) keyboard_modifiers#24 ← phi( @31/(byte) keyboard_modifiers#32 ) (byte) keyboard_modifiers#24 ← phi( @30/(byte) keyboard_modifiers#32 )
(byte) keyboard_events_size#28 ← phi( @31/(byte) keyboard_events_size#36 ) (byte) keyboard_events_size#28 ← phi( @30/(byte) keyboard_events_size#36 )
(byte) render_screen_showing#14 ← phi( @31/(byte) render_screen_showing#20 ) (byte) render_screen_showing#14 ← phi( @30/(byte) render_screen_showing#20 )
(byte) next_piece_idx#35 ← phi( @31/(byte) next_piece_idx#46 ) (byte) next_piece_idx#35 ← phi( @30/(byte) next_piece_idx#46 )
(byte) game_over#34 ← phi( @31/(byte) game_over#45 ) (byte) game_over#34 ← phi( @30/(byte) game_over#45 )
(byte) current_ypos#49 ← phi( @31/(byte) current_ypos#64 ) (byte) current_ypos#49 ← phi( @30/(byte) current_ypos#64 )
(byte) current_xpos#58 ← phi( @31/(byte) current_xpos#75 ) (byte) current_xpos#58 ← phi( @30/(byte) current_xpos#75 )
(byte*) current_piece_gfx#45 ← phi( @31/(byte*) current_piece_gfx#63 ) (byte*) current_piece_gfx#45 ← phi( @30/(byte*) current_piece_gfx#63 )
(byte) current_orientation#49 ← phi( @31/(byte) current_orientation#62 ) (byte) current_orientation#49 ← phi( @30/(byte) current_orientation#62 )
(byte) current_piece_char#36 ← phi( @31/(byte) current_piece_char#51 ) (byte) current_piece_char#36 ← phi( @30/(byte) current_piece_char#51 )
(byte*) current_piece#39 ← phi( @31/(byte*) current_piece#54 ) (byte*) current_piece#39 ← phi( @30/(byte*) current_piece#54 )
(byte) current_movedown_slow#46 ← phi( @31/(byte) current_movedown_slow#59 ) (byte) current_movedown_slow#46 ← phi( @30/(byte) current_movedown_slow#59 )
(byte) render_screen_render#29 ← phi( @31/(byte) render_screen_render#40 ) (byte) render_screen_render#29 ← phi( @30/(byte) render_screen_render#40 )
(byte) render_screen_show#24 ← phi( @31/(byte) render_screen_show#32 ) (byte) render_screen_show#24 ← phi( @30/(byte) render_screen_show#32 )
(byte) irq_raster_next#10 ← phi( @31/(byte) irq_raster_next#17 ) (byte) irq_raster_next#10 ← phi( @30/(byte) irq_raster_next#17 )
(byte) irq_sprite_ypos#9 ← phi( @31/(byte) irq_sprite_ypos#14 ) (byte) irq_sprite_ypos#9 ← phi( @30/(byte) irq_sprite_ypos#14 )
call main call main
to:@40 to:@39
@40: scope:[] from @38 @39: scope:[] from @37
(byte) level_bcd#25 ← phi( @38/(byte) level_bcd#11 ) (byte) level_bcd#25 ← phi( @37/(byte) level_bcd#11 )
(byte) level#25 ← phi( @38/(byte) level#10 ) (byte) level#25 ← phi( @37/(byte) level#10 )
(dword) score_bcd#19 ← phi( @38/(dword) score_bcd#8 ) (dword) score_bcd#19 ← phi( @37/(dword) score_bcd#8 )
(word) lines_bcd#20 ← phi( @38/(word) lines_bcd#8 ) (word) lines_bcd#20 ← phi( @37/(word) lines_bcd#8 )
(byte) current_movedown_counter#17 ← phi( @38/(byte) current_movedown_counter#7 ) (byte) current_movedown_counter#17 ← phi( @37/(byte) current_movedown_counter#7 )
(byte) keyboard_modifiers#17 ← phi( @38/(byte) keyboard_modifiers#8 ) (byte) keyboard_modifiers#17 ← phi( @37/(byte) keyboard_modifiers#8 )
(byte) keyboard_events_size#20 ← phi( @38/(byte) keyboard_events_size#8 ) (byte) keyboard_events_size#20 ← phi( @37/(byte) keyboard_events_size#8 )
(byte) render_screen_showing#10 ← phi( @38/(byte) render_screen_showing#4 ) (byte) render_screen_showing#10 ← phi( @37/(byte) render_screen_showing#4 )
(byte) next_piece_idx#23 ← phi( @38/(byte) next_piece_idx#10 ) (byte) next_piece_idx#23 ← phi( @37/(byte) next_piece_idx#10 )
(byte) game_over#22 ← phi( @38/(byte) game_over#10 ) (byte) game_over#22 ← phi( @37/(byte) game_over#10 )
(byte) current_ypos#29 ← phi( @38/(byte) current_ypos#11 ) (byte) current_ypos#29 ← phi( @37/(byte) current_ypos#11 )
(byte) current_xpos#35 ← phi( @38/(byte) current_xpos#14 ) (byte) current_xpos#35 ← phi( @37/(byte) current_xpos#14 )
(byte*) current_piece_gfx#28 ← phi( @38/(byte*) current_piece_gfx#13 ) (byte*) current_piece_gfx#28 ← phi( @37/(byte*) current_piece_gfx#13 )
(byte) current_orientation#31 ← phi( @38/(byte) current_orientation#13 ) (byte) current_orientation#31 ← phi( @37/(byte) current_orientation#13 )
(byte) current_piece_char#23 ← phi( @38/(byte) current_piece_char#10 ) (byte) current_piece_char#23 ← phi( @37/(byte) current_piece_char#10 )
(byte*) current_piece#23 ← phi( @38/(byte*) current_piece#10 ) (byte*) current_piece#23 ← phi( @37/(byte*) current_piece#10 )
(byte) current_movedown_slow#28 ← phi( @38/(byte) current_movedown_slow#14 ) (byte) current_movedown_slow#28 ← phi( @37/(byte) current_movedown_slow#14 )
(byte) render_screen_render#19 ← phi( @38/(byte) render_screen_render#7 ) (byte) render_screen_render#19 ← phi( @37/(byte) render_screen_render#7 )
(byte) render_screen_show#17 ← phi( @38/(byte) render_screen_show#7 ) (byte) render_screen_show#17 ← phi( @37/(byte) render_screen_show#7 )
(byte) render_screen_show#8 ← (byte) render_screen_show#17 (byte) render_screen_show#8 ← (byte) render_screen_show#17
(byte) render_screen_render#8 ← (byte) render_screen_render#19 (byte) render_screen_render#8 ← (byte) render_screen_render#19
(byte) current_movedown_slow#15 ← (byte) current_movedown_slow#28 (byte) current_movedown_slow#15 ← (byte) current_movedown_slow#28
@ -3758,7 +3757,7 @@ main::@return: scope:[main] from main::@1
(byte) level#11 ← (byte) level#25 (byte) level#11 ← (byte) level#25
(byte) level_bcd#12 ← (byte) level_bcd#25 (byte) level_bcd#12 ← (byte) level_bcd#25
to:@end to:@end
@end: scope:[] from @40 @end: scope:[] from @39
SYMBOL TABLE SSA SYMBOL TABLE SSA
(byte*~) $1 (byte*~) $1
@ -3776,17 +3775,17 @@ SYMBOL TABLE SSA
(number~) $7 (number~) $7
(word~) $8 (word~) $8
(word~) $9 (word~) $9
(label) @12 (label) @11
(label) @14 (label) @13
(label) @22
(label) @23 (label) @23
(label) @24 (label) @25
(label) @26 (label) @30
(label) @31 (label) @37
(label) @38 (label) @38
(label) @39 (label) @39
(label) @40 (label) @4
(label) @5 (label) @8
(label) @9
(label) @begin (label) @begin
(label) @end (label) @end
(byte*) BGCOL1 (byte*) BGCOL1
@ -10792,15 +10791,15 @@ Added new block during phi lifting play_increase_level::@9(between play_increase
Added new block during phi lifting play_increase_level::@10(between play_increase_level::@7 and play_increase_level::@7) Added new block during phi lifting play_increase_level::@10(between play_increase_level::@7 and play_increase_level::@7)
Added new block during phi lifting main::@44(between main::@19 and main::@1) Added new block during phi lifting main::@44(between main::@19 and main::@1)
Adding NOP phi() at start of @begin Adding NOP phi() at start of @begin
Adding NOP phi() at start of @5 Adding NOP phi() at start of @4
Adding NOP phi() at start of @9 Adding NOP phi() at start of @8
Adding NOP phi() at start of @12 Adding NOP phi() at start of @11
Adding NOP phi() at start of toSpritePtr1 Adding NOP phi() at start of toSpritePtr1
Adding NOP phi() at start of toSpritePtr1_@return Adding NOP phi() at start of toSpritePtr1_@return
Adding NOP phi() at start of @26 Adding NOP phi() at start of @25
Adding NOP phi() at start of @31 Adding NOP phi() at start of @30
Adding NOP phi() at start of @38 Adding NOP phi() at start of @37
Adding NOP phi() at start of @40 Adding NOP phi() at start of @39
Adding NOP phi() at start of @end Adding NOP phi() at start of @end
Adding NOP phi() at start of main Adding NOP phi() at start of main
Adding NOP phi() at start of main::@26 Adding NOP phi() at start of main::@26
@ -11191,13 +11190,13 @@ Coalesced (already) [904] irq_cnt#21 ← irq_cnt#1
Coalesced [905] irq_sprite_ypos#25 ← irq_sprite_ypos#1 Coalesced [905] irq_sprite_ypos#25 ← irq_sprite_ypos#1
Coalesced [906] irq_sprite_ptr#19 ← irq_sprite_ptr#1 Coalesced [906] irq_sprite_ptr#19 ← irq_sprite_ptr#1
Coalesced down to 99 phi equivalence classes Coalesced down to 99 phi equivalence classes
Culled Empty Block (label) @5 Culled Empty Block (label) @4
Culled Empty Block (label) @9 Culled Empty Block (label) @8
Culled Empty Block (label) @12 Culled Empty Block (label) @11
Culled Empty Block (label) toSpritePtr1_@return Culled Empty Block (label) toSpritePtr1_@return
Culled Empty Block (label) @26 Culled Empty Block (label) @25
Culled Empty Block (label) @31 Culled Empty Block (label) @30
Culled Empty Block (label) @40 Culled Empty Block (label) @39
Culled Empty Block (label) main::@12 Culled Empty Block (label) main::@12
Culled Empty Block (label) main::@43 Culled Empty Block (label) main::@43
Culled Empty Block (label) main::@44 Culled Empty Block (label) main::@44
@ -11266,11 +11265,11 @@ Culled Empty Block (label) render_screen_original::@14
Culled Empty Block (label) render_screen_original::@12 Culled Empty Block (label) render_screen_original::@12
Culled Empty Block (label) render_screen_original::@10 Culled Empty Block (label) render_screen_original::@10
Culled Empty Block (label) sprites_irq::toSpritePtr2_@return Culled Empty Block (label) sprites_irq::toSpritePtr2_@return
Renumbering block @14 to @1 Renumbering block @13 to @1
Renumbering block @23 to @2 Renumbering block @22 to @2
Renumbering block @24 to @3 Renumbering block @23 to @3
Renumbering block @38 to @4 Renumbering block @37 to @4
Renumbering block @39 to @5 Renumbering block @38 to @5
Renumbering block keyboard_event_scan::@5 to keyboard_event_scan::@4 Renumbering block keyboard_event_scan::@5 to keyboard_event_scan::@4
Renumbering block keyboard_event_scan::@6 to keyboard_event_scan::@5 Renumbering block keyboard_event_scan::@6 to keyboard_event_scan::@5
Renumbering block keyboard_event_scan::@7 to keyboard_event_scan::@6 Renumbering block keyboard_event_scan::@7 to keyboard_event_scan::@6

View File

@ -43,16 +43,16 @@ main: {
sta D016 sta D016
ldx #BLACK ldx #BLACK
lda #<SCREEN lda #<SCREEN
sta fill.addr sta memset.str
lda #>SCREEN lda #>SCREEN
sta fill.addr+1 sta memset.str+1
jsr fill jsr memset
ldx #WHITE|8 ldx #WHITE|8
lda #<COLS lda #<COLS
sta fill.addr sta memset.str
lda #>COLS lda #>COLS
sta fill.addr+1 sta memset.str+1
jsr fill jsr memset
ldx #0 ldx #0
b1: b1:
txa txa
@ -722,31 +722,32 @@ divr16u: {
bne b1 bne b1
rts rts
} }
// Fill some memory with a value // Copies the character c (an unsigned char) to the first num characters of the object pointed to by the argument str.
// fill(byte register(X) val) // memset(void* zeropage($29) str, byte register(X) c)
fill: { memset: {
.label end = $3e .label _0 = $3e
.label addr = $29 .label dst = $29
lda addr .label str = $29
lda str
clc clc
adc #<$3e8 adc #<$3e8
sta end sta _0
lda addr+1 lda str+1
adc #>$3e8 adc #>$3e8
sta end+1 sta _0+1
b1: b1:
txa txa
ldy #0 ldy #0
sta (addr),y sta (dst),y
inc addr inc dst
bne !+ bne !+
inc addr+1 inc dst+1
!: !:
lda addr+1 lda dst+1
cmp end+1 cmp _0+1
bne b1 bne b1
lda addr lda dst
cmp end cmp _0
bne b1 bne b1
rts rts
} }

View File

@ -28,11 +28,11 @@ main::toD0181: scope:[main] from main
main::@3: scope:[main] from main::toD0181 main::@3: scope:[main] from main::toD0181
[11] *((const byte*) D018#0) ← (const byte) main::toD0181_return#0 [11] *((const byte*) D018#0) ← (const byte) main::toD0181_return#0
[12] *((const byte*) D016#0) ← (const byte) VIC_MCM#0 [12] *((const byte*) D016#0) ← (const byte) VIC_MCM#0
[13] call fill [13] call memset
to:main::@4 to:main::@4
main::@4: scope:[main] from main::@3 main::@4: scope:[main] from main::@3
[14] phi() [14] phi()
[15] call fill [15] call memset
to:main::@1 to:main::@1
main::@1: scope:[main] from main::@1 main::@4 main::@1: scope:[main] from main::@1 main::@4
[16] (byte) main::ch#2 ← phi( main::@1/(byte) main::ch#1 main::@4/(byte) 0 ) [16] (byte) main::ch#2 ← phi( main::@1/(byte) main::ch#1 main::@4/(byte) 0 )
@ -433,17 +433,18 @@ divr16u::@6: scope:[divr16u] from divr16u::@3
divr16u::@return: scope:[divr16u] from divr16u::@6 divr16u::@return: scope:[divr16u] from divr16u::@6
[213] return [213] return
to:@return to:@return
fill: scope:[fill] from main::@3 main::@4 memset: scope:[memset] from main::@3 main::@4
[214] (byte) fill::val#3 ← phi( main::@3/(const byte) BLACK#0 main::@4/(const byte) WHITE#0|(byte) 8 ) [214] (byte) memset::c#3 ← phi( main::@3/(const byte) BLACK#0 main::@4/(const byte) WHITE#0|(byte) 8 )
[214] (byte*) fill::addr#0 ← phi( main::@3/(const byte*) SCREEN#0 main::@4/(const byte*) COLS#0 ) [214] (void*) memset::str#2 ← phi( main::@3/(void*)(const byte*) SCREEN#0 main::@4/(void*)(const byte*) COLS#0 )
[215] (byte*) fill::end#0 ← (byte*) fill::addr#0 + (word) $3e8 [215] (void*~) memset::$0 ← (void*) memset::str#2 + (word) $3e8
to:fill::@1 [216] (byte*~) memset::dst#3 ← (byte*)(void*) memset::str#2
fill::@1: scope:[fill] from fill fill::@1 to:memset::@1
[216] (byte*) fill::addr#2 ← phi( fill/(byte*) fill::addr#0 fill::@1/(byte*) fill::addr#1 ) memset::@1: scope:[memset] from memset memset::@1
[217] *((byte*) fill::addr#2) ← (byte) fill::val#3 [217] (byte*) memset::dst#2 ← phi( memset/(byte*~) memset::dst#3 memset::@1/(byte*) memset::dst#1 )
[218] (byte*) fill::addr#1 ← ++ (byte*) fill::addr#2 [218] *((byte*) memset::dst#2) ← (byte) memset::c#3
[219] if((byte*) fill::addr#1!=(byte*) fill::end#0) goto fill::@1 [219] (byte*) memset::dst#1 ← ++ (byte*) memset::dst#2
to:fill::@return [220] if((byte*) memset::dst#1!=(byte*)(void*~) memset::$0) goto memset::@1
fill::@return: scope:[fill] from fill::@1 to:memset::@return
[220] return memset::@return: scope:[memset] from memset::@1
[221] return
to:@return to:@return

File diff suppressed because it is too large Load Diff

View File

@ -88,19 +88,6 @@
(word) divr16u::return#0 return zp ZP_WORD:39 5.285714285714286 (word) divr16u::return#0 return zp ZP_WORD:39 5.285714285714286
(word) divr16u::return#2 return zp ZP_WORD:39 4.0 (word) divr16u::return#2 return zp ZP_WORD:39 4.0
(word) divr16u::return#3 return zp ZP_WORD:39 4.0 (word) divr16u::return#3 return zp ZP_WORD:39 4.0
(void()) fill((byte*) fill::start , (word) fill::size , (byte) fill::val)
(label) fill::@1
(label) fill::@return
(byte*) fill::addr
(byte*) fill::addr#0 addr zp ZP_WORD:41 2.0
(byte*) fill::addr#1 addr zp ZP_WORD:41 16.5
(byte*) fill::addr#2 addr zp ZP_WORD:41 17.5
(byte*) fill::end
(byte*) fill::end#0 end zp ZP_WORD:62 2.6
(word) fill::size
(byte*) fill::start
(byte) fill::val
(byte) fill::val#3 reg byte x 1.8333333333333333
(void()) loop() (void()) loop()
(signed word*~) loop::$1 $1 zp ZP_WORD:43 22.0 (signed word*~) loop::$1 $1 zp ZP_WORD:43 22.0
(word~) loop::$5 $5 zp ZP_WORD:43 22.0 (word~) loop::$5 $5 zp ZP_WORD:43 22.0
@ -136,6 +123,21 @@
(byte) main::toD0181_return (byte) main::toD0181_return
(const byte) main::toD0181_return#0 toD0181_return = >(word)(const byte*) SCREEN#0&(word) $3fff*(byte) 4|>(word)(const byte*) LOGO#0/(byte) 4&(byte) $f (const byte) main::toD0181_return#0 toD0181_return = >(word)(const byte*) SCREEN#0&(word) $3fff*(byte) 4|>(word)(const byte*) LOGO#0/(byte) 4&(byte) $f
(byte*) main::toD0181_screen (byte*) main::toD0181_screen
(void*()) memset((void*) memset::str , (byte) memset::c , (word) memset::num)
(void*~) memset::$0 $0 zp ZP_WORD:62 0.3333333333333333
(label) memset::@1
(label) memset::@return
(byte) memset::c
(byte) memset::c#3 reg byte x 1.5714285714285714
(byte*) memset::dst
(byte*) memset::dst#1 dst zp ZP_WORD:41 16.5
(byte*) memset::dst#2 dst zp ZP_WORD:41 17.5
(byte*~) memset::dst#3 dst zp ZP_WORD:41 4.0
(byte*) memset::end
(word) memset::num
(void*) memset::return
(void*) memset::str
(void*) memset::str#2 str zp ZP_WORD:41 1.0
(signed dword()) mul16s((signed word) mul16s::a , (signed word) mul16s::b) (signed dword()) mul16s((signed word) mul16s::a , (signed word) mul16s::b)
(word~) mul16s::$16 $16 zp ZP_WORD:54 4.0 (word~) mul16s::$16 $16 zp ZP_WORD:54 4.0
(word~) mul16s::$9 $9 zp ZP_WORD:54 4.0 (word~) mul16s::$9 $9 zp ZP_WORD:54 4.0
@ -382,8 +384,8 @@ zp ZP_WORD:35 [ divr16u::rem#5 divr16u::rem#10 divr16u::rem#4 divr16u::rem#11 di
zp ZP_WORD:37 [ divr16u::dividend#3 divr16u::dividend#5 divr16u::dividend#0 ] zp ZP_WORD:37 [ divr16u::dividend#3 divr16u::dividend#5 divr16u::dividend#0 ]
zp ZP_WORD:39 [ divr16u::quotient#3 divr16u::return#0 divr16u::quotient#1 divr16u::quotient#2 divr16u::return#2 divr16u::return#3 div32u16u::quotient_lo#0 ] zp ZP_WORD:39 [ divr16u::quotient#3 divr16u::return#0 divr16u::quotient#1 divr16u::quotient#2 divr16u::return#2 divr16u::return#3 div32u16u::quotient_lo#0 ]
reg byte x [ divr16u::i#2 divr16u::i#1 ] reg byte x [ divr16u::i#2 divr16u::i#1 ]
reg byte x [ fill::val#3 ] zp ZP_WORD:41 [ memset::str#2 memset::dst#2 memset::dst#3 memset::dst#1 ]
zp ZP_WORD:41 [ fill::addr#2 fill::addr#0 fill::addr#1 ] reg byte x [ memset::c#3 ]
zp ZP_WORD:43 [ loop::$5 loop::$1 loop::xpos#0 render_logo::xpos#0 ] zp ZP_WORD:43 [ loop::$5 loop::$1 loop::xpos#0 render_logo::xpos#0 ]
reg byte a [ render_logo::$0 ] reg byte a [ render_logo::$0 ]
reg byte a [ render_logo::$1 ] reg byte a [ render_logo::$1 ]
@ -410,4 +412,4 @@ zp ZP_WORD:58 [ mulu16_sel::return#0 mulu16_sel::return#12 mulu16_sel::return#2
zp ZP_WORD:60 [ div32u16u::quotient_hi#0 ] zp ZP_WORD:60 [ div32u16u::quotient_hi#0 ]
reg byte a [ divr16u::$1 ] reg byte a [ divr16u::$1 ]
reg byte a [ divr16u::$2 ] reg byte a [ divr16u::$2 ]
zp ZP_WORD:62 [ fill::end#0 ] zp ZP_WORD:62 [ memset::$0 ]

View File

@ -32,24 +32,24 @@ main: {
sta D016 sta D016
ldx #BLACK ldx #BLACK
lda #<$28*$19 lda #<$28*$19
sta fill.size sta memset.num
lda #>$28*$19 lda #>$28*$19
sta fill.size+1 sta memset.num+1
lda #<SCREEN lda #<SCREEN
sta fill.addr sta memset.str
lda #>SCREEN lda #>SCREEN
sta fill.addr+1 sta memset.str+1
jsr fill jsr memset
ldx #WHITE|8 ldx #WHITE|8
lda #<$28*$19 lda #<$28*$19
sta fill.size sta memset.num
lda #>$28*$19 lda #>$28*$19
sta fill.size+1 sta memset.num+1
lda #<COLS lda #<COLS
sta fill.addr sta memset.str
lda #>COLS lda #>COLS
sta fill.addr+1 sta memset.str+1
jsr fill jsr memset
ldx #0 ldx #0
b1: b1:
txa txa
@ -62,31 +62,32 @@ main: {
inc $d020 inc $d020
jmp b2 jmp b2
} }
// Fill some memory with a value // Copies the character c (an unsigned char) to the first num characters of the object pointed to by the argument str.
// fill(word zeropage(2) size, byte register(X) val) // memset(void* zeropage(2) str, byte register(X) c, word zeropage(4) num)
fill: { memset: {
.label end = 2 .label end = 4
.label addr = 4 .label dst = 2
.label size = 2 .label str = 2
.label num = 4
lda end lda end
clc clc
adc addr adc str
sta end sta end
lda end+1 lda end+1
adc addr+1 adc str+1
sta end+1 sta end+1
b1: b1:
txa txa
ldy #0 ldy #0
sta (addr),y sta (dst),y
inc addr inc dst
bne !+ bne !+
inc addr+1 inc dst+1
!: !:
lda addr+1 lda dst+1
cmp end+1 cmp end+1
bne b1 bne b1
lda addr lda dst
cmp end cmp end
bne b1 bne b1
rts rts

View File

@ -27,11 +27,11 @@ main::toD0181: scope:[main] from main
main::@3: scope:[main] from main::toD0181 main::@3: scope:[main] from main::toD0181
[10] *((const byte*) D018#0) ← (const byte) main::toD0181_return#0 [10] *((const byte*) D018#0) ← (const byte) main::toD0181_return#0
[11] *((const byte*) D016#0) ← (const byte) VIC_MCM#0|(const byte) VIC_CSEL#0 [11] *((const byte*) D016#0) ← (const byte) VIC_MCM#0|(const byte) VIC_CSEL#0
[12] call fill [12] call memset
to:main::@4 to:main::@4
main::@4: scope:[main] from main::@3 main::@4: scope:[main] from main::@3
[13] phi() [13] phi()
[14] call fill [14] call memset
to:main::@1 to:main::@1
main::@1: scope:[main] from main::@1 main::@4 main::@1: scope:[main] from main::@1 main::@4
[15] (byte) main::ch#2 ← phi( main::@1/(byte) main::ch#1 main::@4/(byte) 0 ) [15] (byte) main::ch#2 ← phi( main::@1/(byte) main::ch#1 main::@4/(byte) 0 )
@ -43,18 +43,19 @@ main::@2: scope:[main] from main::@1 main::@2
[19] *((const byte*) SCREEN#0+(word) $3e7) ← ++ *((const byte*) SCREEN#0+(word) $3e7) [19] *((const byte*) SCREEN#0+(word) $3e7) ← ++ *((const byte*) SCREEN#0+(word) $3e7)
kickasm() {{ inc $d020 }} kickasm() {{ inc $d020 }}
to:main::@2 to:main::@2
fill: scope:[fill] from main::@3 main::@4 memset: scope:[memset] from main::@3 main::@4
[21] (byte) fill::val#3 ← phi( main::@4/(const byte) WHITE#0|(byte) 8 main::@3/(const byte) BLACK#0 ) [21] (byte) memset::c#3 ← phi( main::@4/(const byte) WHITE#0|(byte) 8 main::@3/(const byte) BLACK#0 )
[21] (word) fill::size#2 ← phi( main::@4/(word)(number) $28*(number) $19 main::@3/(word)(number) $28*(number) $19 ) [21] (word) memset::num#2 ← phi( main::@4/(word)(number) $28*(number) $19 main::@3/(word)(number) $28*(number) $19 )
[21] (byte*) fill::addr#0 ← phi( main::@4/(const byte*) COLS#0 main::@3/(const byte*) SCREEN#0 ) [21] (void*) memset::str#2 ← phi( main::@4/(void*)(const byte*) COLS#0 main::@3/(void*)(const byte*) SCREEN#0 )
[22] (byte*) fill::end#0 ← (byte*) fill::addr#0 + (word) fill::size#2 [22] (void*) memset::end#0 ← (void*) memset::str#2 + (word) memset::num#2
to:fill::@1 [23] (byte*~) memset::dst#3 ← (byte*)(void*) memset::str#2
fill::@1: scope:[fill] from fill fill::@1 to:memset::@1
[23] (byte*) fill::addr#2 ← phi( fill/(byte*) fill::addr#0 fill::@1/(byte*) fill::addr#1 ) memset::@1: scope:[memset] from memset memset::@1
[24] *((byte*) fill::addr#2) ← (byte) fill::val#3 [24] (byte*) memset::dst#2 ← phi( memset/(byte*~) memset::dst#3 memset::@1/(byte*) memset::dst#1 )
[25] (byte*) fill::addr#1 ← ++ (byte*) fill::addr#2 [25] *((byte*) memset::dst#2) ← (byte) memset::c#3
[26] if((byte*) fill::addr#1!=(byte*) fill::end#0) goto fill::@1 [26] (byte*) memset::dst#1 ← ++ (byte*) memset::dst#2
to:fill::@return [27] if((byte*) memset::dst#1!=(byte*)(void*) memset::end#0) goto memset::@1
fill::@return: scope:[fill] from fill::@1 to:memset::@return
[27] return memset::@return: scope:[memset] from memset::@1
[28] return
to:@return to:@return

File diff suppressed because it is too large Load Diff

View File

@ -30,20 +30,6 @@
(const byte) VIC_MCM#0 VIC_MCM = (byte) $10 (const byte) VIC_MCM#0 VIC_MCM = (byte) $10
(byte) WHITE (byte) WHITE
(const byte) WHITE#0 WHITE = (byte) 1 (const byte) WHITE#0 WHITE = (byte) 1
(void()) fill((byte*) fill::start , (word) fill::size , (byte) fill::val)
(label) fill::@1
(label) fill::@return
(byte*) fill::addr
(byte*) fill::addr#0 addr zp ZP_WORD:4 2.0
(byte*) fill::addr#1 addr zp ZP_WORD:4 16.5
(byte*) fill::addr#2 addr zp ZP_WORD:4 17.5
(byte*) fill::end
(byte*) fill::end#0 end zp ZP_WORD:2 2.6
(word) fill::size
(word) fill::size#2 size zp ZP_WORD:2 2.0
(byte*) fill::start
(byte) fill::val
(byte) fill::val#3 reg byte x 1.8333333333333333
(void()) main() (void()) main()
(label) main::@1 (label) main::@1
(label) main::@2 (label) main::@2
@ -66,8 +52,24 @@
(byte) main::toD0181_return (byte) main::toD0181_return
(const byte) main::toD0181_return#0 toD0181_return = >(word)(const byte*) SCREEN#0&(word) $3fff*(byte) 4|>(word)(const byte*) LOGO#0/(byte) 4&(byte) $f (const byte) main::toD0181_return#0 toD0181_return = >(word)(const byte*) SCREEN#0&(word) $3fff*(byte) 4|>(word)(const byte*) LOGO#0/(byte) 4&(byte) $f
(byte*) main::toD0181_screen (byte*) main::toD0181_screen
(void*()) memset((void*) memset::str , (byte) memset::c , (word) memset::num)
(label) memset::@1
(label) memset::@return
(byte) memset::c
(byte) memset::c#3 reg byte x 1.5714285714285714
(byte*) memset::dst
(byte*) memset::dst#1 dst zp ZP_WORD:2 16.5
(byte*) memset::dst#2 dst zp ZP_WORD:2 17.5
(byte*~) memset::dst#3 dst zp ZP_WORD:2 4.0
(byte*) memset::end
(void*) memset::end#0 end zp ZP_WORD:4 0.3333333333333333
(word) memset::num
(word) memset::num#2 num zp ZP_WORD:4 2.0
(void*) memset::return
(void*) memset::str
(void*) memset::str#2 str zp ZP_WORD:2 1.0
reg byte x [ main::ch#2 main::ch#1 ] reg byte x [ main::ch#2 main::ch#1 ]
zp ZP_WORD:2 [ fill::size#2 fill::end#0 ] zp ZP_WORD:2 [ memset::str#2 memset::dst#2 memset::dst#3 memset::dst#1 ]
reg byte x [ fill::val#3 ] zp ZP_WORD:4 [ memset::num#2 memset::end#0 ]
zp ZP_WORD:4 [ fill::addr#2 fill::addr#0 fill::addr#1 ] reg byte x [ memset::c#3 ]

View File

@ -55,7 +55,7 @@ main: {
sta D016 sta D016
lda #toD0181_return lda #toD0181_return
sta D018 sta D018
jsr fill jsr memset
jsr bitmap_init jsr bitmap_init
jsr bitmap_clear jsr bitmap_clear
jsr sin16s_gen2 jsr sin16s_gen2
@ -790,27 +790,28 @@ bitmap_init: {
bne b3 bne b3
rts rts
} }
// Fill some memory with a value // Copies the character c (an unsigned char) to the first num characters of the object pointed to by the argument str.
fill: { memset: {
.const size = $3e8 .const num = $3e8
.label end = SCREEN+size .label str = SCREEN
.label addr = $30 .label end = str+num
lda #<SCREEN .label dst = $30
sta addr lda #<str
lda #>SCREEN sta dst
sta addr+1 lda #>str
sta dst+1
b1: b1:
lda #WHITE lda #WHITE
ldy #0 ldy #0
sta (addr),y sta (dst),y
inc addr inc dst
bne !+ bne !+
inc addr+1 inc dst+1
!: !:
lda addr+1 lda dst+1
cmp #>end cmp #>end
bne b1 bne b1
lda addr lda dst
cmp #<end cmp #<end
bne b1 bne b1
rts rts

View File

@ -36,7 +36,7 @@ main::toD0181: scope:[main] from main::@2
to:main::@3 to:main::@3
main::@3: scope:[main] from main::toD0181 main::@3: scope:[main] from main::toD0181
[14] *((const byte*) D018#0) ← (const byte) main::toD0181_return#0 [14] *((const byte*) D018#0) ← (const byte) main::toD0181_return#0
[15] call fill [15] call memset
to:main::@4 to:main::@4
main::@4: scope:[main] from main::@3 main::@4: scope:[main] from main::@3
[16] phi() [16] phi()
@ -427,15 +427,15 @@ bitmap_init::@4: scope:[bitmap_init] from bitmap_init::@3 bitmap_init::@5
bitmap_init::@return: scope:[bitmap_init] from bitmap_init::@4 bitmap_init::@return: scope:[bitmap_init] from bitmap_init::@4
[219] return [219] return
to:@return to:@return
fill: scope:[fill] from main::@3 memset: scope:[memset] from main::@3
[220] phi() [220] phi()
to:fill::@1 to:memset::@1
fill::@1: scope:[fill] from fill fill::@1 memset::@1: scope:[memset] from memset memset::@1
[221] (byte*) fill::addr#2 ← phi( fill/(const byte*) SCREEN#0 fill::@1/(byte*) fill::addr#1 ) [221] (byte*) memset::dst#2 ← phi( memset/(byte*)(const void*) memset::str#0 memset::@1/(byte*) memset::dst#1 )
[222] *((byte*) fill::addr#2) ← (const byte) WHITE#0 [222] *((byte*) memset::dst#2) ← (const byte) WHITE#0
[223] (byte*) fill::addr#1 ← ++ (byte*) fill::addr#2 [223] (byte*) memset::dst#1 ← ++ (byte*) memset::dst#2
[224] if((byte*) fill::addr#1!=(const byte*) fill::end#0) goto fill::@1 [224] if((byte*) memset::dst#1!=(const byte*) memset::end#0) goto memset::@1
to:fill::@return to:memset::@return
fill::@return: scope:[fill] from fill::@1 memset::@return: scope:[memset] from memset::@1
[225] return [225] return
to:@return to:@return

File diff suppressed because it is too large Load Diff

View File

@ -159,18 +159,6 @@
(word) divr16u::return#0 return zp ZP_WORD:41 5.285714285714286 (word) divr16u::return#0 return zp ZP_WORD:41 5.285714285714286
(word) divr16u::return#2 return zp ZP_WORD:41 4.0 (word) divr16u::return#2 return zp ZP_WORD:41 4.0
(word) divr16u::return#3 return zp ZP_WORD:41 4.0 (word) divr16u::return#3 return zp ZP_WORD:41 4.0
(void()) fill((byte*) fill::start , (word) fill::size , (byte) fill::val)
(label) fill::@1
(label) fill::@return
(byte*) fill::addr
(byte*) fill::addr#1 addr zp ZP_WORD:48 16.5
(byte*) fill::addr#2 addr zp ZP_WORD:48 16.5
(byte*) fill::end
(const byte*) fill::end#0 end = (const byte*) SCREEN#0+(const word) fill::size#0
(word) fill::size
(const word) fill::size#0 size = (word) $3e8
(byte*) fill::start
(byte) fill::val
(void()) main() (void()) main()
(label) main::@1 (label) main::@1
(label) main::@2 (label) main::@2
@ -205,6 +193,20 @@
(byte*) main::vicSelectGfxBank1_toDd001_gfx (byte*) main::vicSelectGfxBank1_toDd001_gfx
(byte) main::vicSelectGfxBank1_toDd001_return (byte) main::vicSelectGfxBank1_toDd001_return
(const byte) main::vicSelectGfxBank1_toDd001_return#0 vicSelectGfxBank1_toDd001_return = (byte) 3 (const byte) main::vicSelectGfxBank1_toDd001_return#0 vicSelectGfxBank1_toDd001_return = (byte) 3
(void*()) memset((void*) memset::str , (byte) memset::c , (word) memset::num)
(label) memset::@1
(label) memset::@return
(byte) memset::c
(byte*) memset::dst
(byte*) memset::dst#1 dst zp ZP_WORD:48 16.5
(byte*) memset::dst#2 dst zp ZP_WORD:48 16.5
(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#0
(signed dword()) mul16s((signed word) mul16s::a , (signed word) mul16s::b) (signed dword()) mul16s((signed word) mul16s::a , (signed word) mul16s::b)
(word~) mul16s::$16 $16 zp ZP_WORD:60 4.0 (word~) mul16s::$16 $16 zp ZP_WORD:60 4.0
(word~) mul16s::$9 $9 zp ZP_WORD:60 4.0 (word~) mul16s::$9 $9 zp ZP_WORD:60 4.0
@ -430,7 +432,7 @@ reg byte a [ bitmap_init::bits#3 bitmap_init::bits#4 bitmap_init::bits#1 ]
reg byte x [ bitmap_init::x#2 bitmap_init::x#1 ] reg byte x [ bitmap_init::x#2 bitmap_init::x#1 ]
reg byte x [ bitmap_init::y#2 bitmap_init::y#1 ] reg byte x [ bitmap_init::y#2 bitmap_init::y#1 ]
zp ZP_WORD:46 [ bitmap_init::yoffs#2 bitmap_init::yoffs#4 bitmap_init::yoffs#1 ] zp ZP_WORD:46 [ bitmap_init::yoffs#2 bitmap_init::yoffs#4 bitmap_init::yoffs#1 ]
zp ZP_WORD:48 [ fill::addr#2 fill::addr#1 ] zp ZP_WORD:48 [ memset::dst#2 memset::dst#1 ]
reg byte a [ wrap_y::return#0 ] reg byte a [ wrap_y::return#0 ]
reg byte x [ render_sine::ypos#0 ] reg byte x [ render_sine::ypos#0 ]
reg byte a [ wrap_y::return#1 ] reg byte a [ wrap_y::return#1 ]

View File

@ -208,16 +208,16 @@ init: {
jsr init_sprites jsr init_sprites
ldx #0 ldx #0
lda #<screen lda #<screen
sta fill.addr sta memset.str
lda #>screen lda #>screen
sta fill.addr+1 sta memset.str+1
jsr fill jsr memset
ldx #BLACK ldx #BLACK
lda #<colors lda #<colors
sta fill.addr sta memset.str
lda #>colors lda #>colors
sta fill.addr+1 sta memset.str+1
jsr fill jsr memset
lda #toD0181_return lda #toD0181_return
sta D018 sta D018
lda #$5b lda #$5b
@ -233,30 +233,31 @@ init: {
sta BGCOL4 sta BGCOL4
rts rts
} }
// Fill some memory with a value // Copies the character c (an unsigned char) to the first num characters of the object pointed to by the argument str.
// fill(byte register(X) val) // memset(void* zeropage(8) str, byte register(X) c)
fill: { memset: {
.label end = $1b .label end = $1b
.label addr = 8 .label dst = 8
lda addr .label str = 8
lda str
clc clc
adc #<$3e8 adc #<$3e8
sta end sta end
lda addr+1 lda str+1
adc #>$3e8 adc #>$3e8
sta end+1 sta end+1
b1: b1:
txa txa
ldy #0 ldy #0
sta (addr),y sta (dst),y
inc addr inc dst
bne !+ bne !+
inc addr+1 inc dst+1
!: !:
lda addr+1 lda dst+1
cmp end+1 cmp end+1
bne b1 bne b1
lda addr lda dst
cmp end cmp end
bne b1 bne b1
rts rts

View File

@ -96,11 +96,11 @@ init: scope:[init] from main
to:init::@2 to:init::@2
init::@2: scope:[init] from init init::@2: scope:[init] from init
[57] phi() [57] phi()
[58] call fill [58] call memset
to:init::@3 to:init::@3
init::@3: scope:[init] from init::@2 init::@3: scope:[init] from init::@2
[59] phi() [59] phi()
[60] call fill [60] call memset
to:init::toD0181 to:init::toD0181
init::toD0181: scope:[init] from init::@3 init::toD0181: scope:[init] from init::@3
[61] phi() [61] phi()
@ -117,28 +117,29 @@ init::@1: scope:[init] from init::toD0181
init::@return: scope:[init] from init::@1 init::@return: scope:[init] from init::@1
[69] return [69] return
to:@return to:@return
fill: scope:[fill] from init::@2 init::@3 memset: scope:[memset] from init::@2 init::@3
[70] (byte) fill::val#3 ← phi( init::@2/(byte) 0 init::@3/(const byte) BLACK#0 ) [70] (byte) memset::c#3 ← phi( init::@2/(byte) 0 init::@3/(const byte) BLACK#0 )
[70] (byte*) fill::addr#0 ← phi( init::@2/(const byte*) screen#0 init::@3/(const byte*) colors#0 ) [70] (void*) memset::str#2 ← phi( init::@2/(void*)(const byte*) screen#0 init::@3/(void*)(const byte*) colors#0 )
[71] (byte*) fill::end#0 ← (byte*) fill::addr#0 + (word) $3e8 [71] (void*) memset::end#0 ← (void*) memset::str#2 + (word) $3e8
to:fill::@1 [72] (byte*~) memset::dst#3 ← (byte*)(void*) memset::str#2
fill::@1: scope:[fill] from fill fill::@1 to:memset::@1
[72] (byte*) fill::addr#2 ← phi( fill/(byte*) fill::addr#0 fill::@1/(byte*) fill::addr#1 ) memset::@1: scope:[memset] from memset memset::@1
[73] *((byte*) fill::addr#2) ← (byte) fill::val#3 [73] (byte*) memset::dst#2 ← phi( memset/(byte*~) memset::dst#3 memset::@1/(byte*) memset::dst#1 )
[74] (byte*) fill::addr#1 ← ++ (byte*) fill::addr#2 [74] *((byte*) memset::dst#2) ← (byte) memset::c#3
[75] if((byte*) fill::addr#1!=(byte*) fill::end#0) goto fill::@1 [75] (byte*) memset::dst#1 ← ++ (byte*) memset::dst#2
to:fill::@return [76] if((byte*) memset::dst#1!=(byte*)(void*) memset::end#0) goto memset::@1
fill::@return: scope:[fill] from fill::@1 to:memset::@return
[76] return memset::@return: scope:[memset] from memset::@1
[77] return
to:@return to:@return
init_sprites: scope:[init_sprites] from init init_sprites: scope:[init_sprites] from init
[77] *((const byte*) SPRITES_ENABLE#0) ← (byte) 1 [78] *((const byte*) SPRITES_ENABLE#0) ← (byte) 1
[78] *((const byte*) SPRITES_EXPAND_X#0) ← (byte) 0 [79] *((const byte*) SPRITES_EXPAND_X#0) ← (byte) 0
[79] *((const byte*) SPRITES_EXPAND_Y#0) ← (byte) 0 [80] *((const byte*) SPRITES_EXPAND_Y#0) ← (byte) 0
[80] *((const byte*) SPRITES_XMSB#0) ← (byte) 0 [81] *((const byte*) SPRITES_XMSB#0) ← (byte) 0
[81] *((const byte*) SPRITES_COLS#0) ← (const byte) WHITE#0 [82] *((const byte*) SPRITES_COLS#0) ← (const byte) WHITE#0
[82] *((const byte*) SPRITES_MC#0) ← (byte) 0 [83] *((const byte*) SPRITES_MC#0) ← (byte) 0
to:init_sprites::@return to:init_sprites::@return
init_sprites::@return: scope:[init_sprites] from init_sprites init_sprites::@return: scope:[init_sprites] from init_sprites
[83] return [84] return
to:@return to:@return

File diff suppressed because it is too large Load Diff

View File

@ -68,19 +68,6 @@
(word) draw_block::z (word) draw_block::z
(word) draw_block::z#0 z zp ZP_WORD:4 4.0 (word) draw_block::z#0 z zp ZP_WORD:4 4.0
(word) draw_block::z#1 z#1 zp ZP_WORD:11 1.125 (word) draw_block::z#1 z#1 zp ZP_WORD:11 1.125
(void()) fill((byte*) fill::start , (word) fill::size , (byte) fill::val)
(label) fill::@1
(label) fill::@return
(byte*) fill::addr
(byte*) fill::addr#0 addr zp ZP_WORD:8 2.0
(byte*) fill::addr#1 addr zp ZP_WORD:8 16.5
(byte*) fill::addr#2 addr zp ZP_WORD:8 17.5
(byte*) fill::end
(byte*) fill::end#0 end zp ZP_WORD:27 2.6
(word) fill::size
(byte*) fill::start
(byte) fill::val
(byte) fill::val#3 reg byte x 1.8333333333333333
(void()) init() (void()) init()
(label) init::@1 (label) init::@1
(label) init::@2 (label) init::@2
@ -120,6 +107,21 @@
(byte) main::y#2 y zp ZP_BYTE:3 57.714285714285715 (byte) main::y#2 y zp ZP_BYTE:3 57.714285714285715
(byte) main::z (byte) main::z
(byte) main::z#0 reg byte a 202.0 (byte) main::z#0 reg byte a 202.0
(void*()) memset((void*) memset::str , (byte) memset::c , (word) memset::num)
(label) memset::@1
(label) memset::@return
(byte) memset::c
(byte) memset::c#3 reg byte x 1.5714285714285714
(byte*) memset::dst
(byte*) memset::dst#1 dst zp ZP_WORD:8 16.5
(byte*) memset::dst#2 dst zp ZP_WORD:8 17.5
(byte*~) memset::dst#3 dst zp ZP_WORD:8 4.0
(byte*) memset::end
(void*) memset::end#0 end zp ZP_WORD:27 0.3333333333333333
(word) memset::num
(void*) memset::return
(void*) memset::str
(void*) memset::str#2 str zp ZP_WORD:8 1.0
(word()) mul8u((byte) mul8u::a , (byte) mul8u::b) (word()) mul8u((byte) mul8u::a , (byte) mul8u::b)
(byte~) mul8u::$1 reg byte a 2002.0 (byte~) mul8u::$1 reg byte a 2002.0
(label) mul8u::@1 (label) mul8u::@1
@ -152,8 +154,8 @@ zp ZP_BYTE:3 [ main::y#2 main::y#1 ]
reg byte x [ mul8u::a#2 mul8u::a#1 mul8u::a#0 ] reg byte x [ mul8u::a#2 mul8u::a#1 mul8u::a#0 ]
zp ZP_WORD:4 [ mul8u::res#2 mul8u::res#6 mul8u::res#1 mul8u::return#2 draw_block::z#0 ] zp ZP_WORD:4 [ mul8u::res#2 mul8u::res#6 mul8u::res#1 mul8u::return#2 draw_block::z#0 ]
zp ZP_WORD:6 [ mul8u::mb#2 mul8u::mb#1 ] zp ZP_WORD:6 [ mul8u::mb#2 mul8u::mb#1 ]
reg byte x [ fill::val#3 ] zp ZP_WORD:8 [ memset::str#2 memset::dst#2 memset::dst#3 memset::dst#1 ]
zp ZP_WORD:8 [ fill::addr#2 fill::addr#0 fill::addr#1 ] reg byte x [ memset::c#3 ]
reg byte a [ main::z#0 ] reg byte a [ main::z#0 ]
reg byte a [ main::tile#0 ] reg byte a [ main::tile#0 ]
reg byte a [ draw_block::tileno#0 ] reg byte a [ draw_block::tileno#0 ]
@ -171,4 +173,4 @@ zp ZP_WORD:21 [ draw_block::$15 ]
zp ZP_WORD:23 [ draw_block::$16 ] zp ZP_WORD:23 [ draw_block::$16 ]
zp ZP_WORD:25 [ draw_block::$17 ] zp ZP_WORD:25 [ draw_block::$17 ]
reg byte a [ mul8u::$1 ] reg byte a [ mul8u::$1 ]
zp ZP_WORD:27 [ fill::end#0 ] zp ZP_WORD:27 [ memset::end#0 ]