1
0
mirror of https://gitlab.com/camelot/kickc.git synced 2025-02-19 08:31:01 +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;
import dk.camelot64.kickc.model.Comment;
import dk.camelot64.kickc.model.CompileError;
import dk.camelot64.kickc.model.ControlFlowBlock;
import dk.camelot64.kickc.model.Program;
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.symbols.Variable;
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.SymbolTypePointer;
import dk.camelot64.kickc.model.values.ConstantRef;
@ -94,6 +96,9 @@ public class Pass1PointerSizeofFix extends Pass1Base {
Variable variable = getScope().getVariable(varRef);
if(variable.getType() instanceof SymbolTypePointer) {
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) {
// Binary operation on a non-byte pointer - sizeof()-handling is probably needed!
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);
if(variable.getType() instanceof SymbolTypePointer) {
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) {
// Unary operation on non-byte pointer type - sizeof()-handling is needed!
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.
typedef word size_t ;
// 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.
void* memcpy( void* destination, void* source, word num ) {
void* memcpy( void* destination, void* source, size_t num ) {
byte* src = source;
byte* dst = destination;
for( word i=0; i<num; i++) *dst++ = *src++;
for( size_t i=0; i<num; i++) *dst++ = *src++;
return destination;
}
// 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.
void* memmove( void* destination, void* source, word num ) {
void* memmove( void* destination, void* source, size_t num ) {
if((word)destination<(word)source) {
memcpy(destination, source, num);
} else {
// copy backwards
byte* src = source+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;
}
// 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).
byte* strcpy( byte* destination, byte* source ) {
byte* src = source;

View File

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

View File

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

View File

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

View File

@ -1,4 +1,5 @@
import "c64.kc"
import "string"
byte* SCREEN = $400;
byte* LOGO = $2000;
@ -17,8 +18,8 @@ void main() {
*BGCOL3 = BLACK;
*D018 = toD018(SCREEN, LOGO);
*D016 = VIC_MCM | VIC_CSEL;
fill(SCREEN, 40*25, BLACK);
fill(COLS, 40*25, WHITE|8);
memset(SCREEN, BLACK, 40*25);
memset(COLS, WHITE|8, 40*25);
for(byte ch: 0..239) {
SCREEN[ch] = ch;
}
@ -27,12 +28,3 @@ void main() {
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 "sinus.kc"
import "memory.kc"
import "string.kc"
import "bitmap2.kc"
byte* SCREEN = $400;
@ -30,7 +30,7 @@ void main() {
*D016 = VIC_CSEL;
*D018 = toD018(SCREEN, BITMAP);
fill(SCREEN, 1000, WHITE);
memset(SCREEN, WHITE, 1000);
bitmap_init(BITMAP);
bitmap_clear();
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
import "c64.kc"
import "keyboard.kc"
import "memory.kc"
import "string.kc"
import "multiply.kc"
const byte* screen = $400;
@ -25,8 +25,8 @@ void main() {
void init() {
init_sprites();
fill(screen,1000,0);
fill(colors,1000,BLACK);
memset(screen, 0, 1000);
memset(colors, BLACK, 1000);
*D018 = toD018(screen, charset);
asm {
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*) 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*) 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_COLORS in (byte*) MEDUSA_COLORS ← (number) $1400
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) @5
Culled Empty Block (label) @6
Culled Empty Block (label) @7
Culled Empty Block (label) main::@4
Culled Empty Block (label) main::@3
Culled Empty Block (label) main::@5
@ -75,7 +78,7 @@ CONTROL FLOW GRAPH SSA
(byte*) BGCOL#0 ← ((byte*)) (number) $d021
(byte*) COLS#0 ← ((byte*)) (number) $d800
(byte) BLACK#0 ← (number) 0
to:@7
to:@8
memcpy: scope:[memcpy] from main main::@7
(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 )
@ -106,7 +109,7 @@ memcpy::@return: scope:[memcpy] from memcpy::@2
(void*) memcpy::return#1 ← (void*) memcpy::return#4
return
to:@return
@7: scope:[] from @begin
@8: scope:[] from @begin
(byte*) MEDUSA_SCREEN#0 ← ((byte*)) (number) $1000
(byte*) MEDUSA_COLORS#0 ← ((byte*)) (number) $1400
(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)
.fill fileCols.getSize(), fileCols.get(i)
}}
to:@8
main: scope:[main] from @8
to:@9
main: scope:[main] from @9
*((byte*) BGCOL#0) ← (byte) BLACK#0
(void*) memcpy::destination#0 ← (void*)(byte*) 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
return
to:@return
@8: scope:[] from @7
call main
to:@9
@9: scope:[] from @8
call main
to:@10
@10: scope:[] from @9
to:@end
@end: scope:[] from @9
@end: scope:[] from @10
SYMBOL TABLE SSA
(label) @7
(label) @10
(label) @8
(label) @9
(label) @begin
@ -316,8 +319,8 @@ Identical Phi Values (word) memcpy::num#3 (word) $3e8
Successful SSA optimization Pass2IdenticalPhiElimination
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 @8
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 main::@7
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 [27] memcpy::i#3 ← memcpy::i#1
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::@1
Culled Empty Block (label) memcpy::@2
Culled Empty Block (label) memcpy::@4
Renumbering block @7 to @1
Renumbering block @8 to @2
Renumbering block @8 to @1
Renumbering block @9 to @2
Renumbering block main::@2 to main::@1
Renumbering block main::@7 to main::@2
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) @2
Culled Empty Block (label) @3
Culled Empty Block (label) @4
Culled Empty Block (label) @6
Culled Empty Block (label) @5
Culled Empty Block (label) keyboard_matrix_read::@1
Culled Empty Block (label) @6
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::@13
Culled Empty Block (label) keyboard_event_scan::@15
Culled Empty Block (label) keyboard_event_scan::@19
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) @11
Culled Empty Block (label) @10
Culled Empty Block (label) keyboard_event_get::@4
Culled Empty Block (label) keyboard_event_get::@2
Culled Empty Block (label) keyboard_event_get::@5
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_@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::toD0182_@1
Culled Empty Block (label) render_show::@4
Culled Empty Block (label) @15
Culled Empty Block (label) @16
Culled Empty Block (label) @17
Culled Empty Block (label) render_score::@4
Culled Empty Block (label) @17
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::@5
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) @21
Culled Empty Block (label) @20
Culled Empty Block (label) render_moving::@9
Culled Empty Block (label) render_moving::@7
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::@10
Culled Empty Block (label) render_next::@12
Culled Empty Block (label) sprites_init::@2
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::toSpritePtr2_@1
Culled Empty Block (label) sprites_irq::@5
Culled Empty Block (label) sprites_irq::@9
Culled Empty Block (label) sprites_irq::@10
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::@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::@11
Culled Empty Block (label) play_move_down::@16
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::@12
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::@10
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::@3
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::@13
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) @33
Culled Empty Block (label) @32
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::@6
Culled Empty Block (label) play_spawn_current::@7
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::@12
Culled Empty Block (label) play_remove_lines::@13
Culled Empty Block (label) play_remove_lines::@14
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::@4
Culled Empty Block (label) @36
Culled Empty Block (label) @35
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::@21
Culled Empty Block (label) main::@3
@ -262,8 +261,8 @@ CONTROL FLOW GRAPH SSA
(byte) GREY#0 ← (number) $c
(byte) LIGHT_GREEN#0 ← (number) $d
(byte) LIGHT_BLUE#0 ← (number) $e
to:@5
@5: scope:[] from @begin
to:@4
@4: scope:[] from @begin
(byte) KEY_Z#0 ← (number) $c
(byte) KEY_LSHIFT#0 ← (number) $f
(byte) KEY_X#0 ← (number) $17
@ -275,7 +274,7 @@ CONTROL FLOW GRAPH SSA
(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_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
(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)
@ -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
return
to:@return
@9: scope:[] from @5
@8: scope:[] from @4
(byte[8]) keyboard_events#0 ← { fill( 8, 0) }
(byte) keyboard_events_size#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_COMMODORE#0 ← (number) 8
(byte[8]) keyboard_scan_values#0 ← { fill( 8, 0) }
to:@12
to:@11
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_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
return
to:@return
@12: scope:[] from @9
(byte) keyboard_modifiers#58 ← phi( @9/(byte) keyboard_modifiers#0 )
(byte) keyboard_events_size#76 ← phi( @9/(byte) keyboard_events_size#0 )
@11: scope:[] from @8
(byte) keyboard_modifiers#58 ← phi( @8/(byte) keyboard_modifiers#0 )
(byte) keyboard_events_size#76 ← phi( @8/(byte) keyboard_events_size#0 )
(word*) SID_VOICE3_FREQ#0 ← ((word*)) (number) $d40e
(byte*) SID_VOICE3_CONTROL#0 ← ((byte*)) (number) $d412
(byte) SID_CONTROL_NOISE#0 ← (number) $80
(byte*) SID_VOICE3_OSC#0 ← ((byte*)) (number) $d41b
to:@14
to:@13
sid_rnd_init: scope:[sid_rnd_init] from main
*((word*) SID_VOICE3_FREQ#0) ← (number) $ffff
*((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
return
to:@return
@14: scope:[] from @12
(byte) keyboard_modifiers#56 ← phi( @12/(byte) keyboard_modifiers#58 )
(byte) keyboard_events_size#74 ← phi( @12/(byte) keyboard_events_size#76 )
@13: scope:[] from @11
(byte) keyboard_modifiers#56 ← phi( @11/(byte) keyboard_modifiers#58 )
(byte) keyboard_events_size#74 ← phi( @11/(byte) keyboard_events_size#76 )
(byte*) PLAYFIELD_SCREEN_1#0 ← ((byte*)) (number) $400
(byte*) PLAYFIELD_SCREEN_2#0 ← ((byte*)) (number) $2c00
(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*[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) }
to:@23
to:@22
render_init: scope:[render_init] from main::@25
(byte*) render_init::vicSelectGfxBank1_gfx#0 ← (byte*) PLAYFIELD_CHARSET#0
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
return
to:@return
@23: scope:[] from @14
(byte) level_bcd#95 ← phi( @14/(byte) level_bcd#0 )
(byte) level#103 ← phi( @14/(byte) level#0 )
(dword) score_bcd#78 ← phi( @14/(dword) score_bcd#0 )
(word) lines_bcd#82 ← phi( @14/(word) lines_bcd#0 )
(byte) keyboard_modifiers#54 ← phi( @14/(byte) keyboard_modifiers#56 )
(byte) keyboard_events_size#72 ← phi( @14/(byte) keyboard_events_size#74 )
(byte) render_screen_showing#42 ← phi( @14/(byte) render_screen_showing#0 )
(byte) game_over#85 ← phi( @14/(byte) game_over#0 )
(byte) current_ypos#97 ← phi( @14/(byte) current_ypos#0 )
(byte) current_xpos#118 ← phi( @14/(byte) current_xpos#0 )
(byte*) current_piece_gfx#111 ← phi( @14/(byte*) current_piece_gfx#0 )
(byte) current_piece_char#99 ← phi( @14/(byte) current_piece_char#0 )
(byte) render_screen_render#62 ← phi( @14/(byte) render_screen_render#0 )
(byte) render_screen_show#57 ← phi( @14/(byte) render_screen_show#0 )
@22: scope:[] from @13
(byte) level_bcd#95 ← phi( @13/(byte) level_bcd#0 )
(byte) level#103 ← phi( @13/(byte) level#0 )
(dword) score_bcd#78 ← phi( @13/(dword) score_bcd#0 )
(word) lines_bcd#82 ← phi( @13/(word) lines_bcd#0 )
(byte) keyboard_modifiers#54 ← phi( @13/(byte) keyboard_modifiers#56 )
(byte) keyboard_events_size#72 ← phi( @13/(byte) keyboard_events_size#74 )
(byte) render_screen_showing#42 ← phi( @13/(byte) render_screen_showing#0 )
(byte) game_over#85 ← phi( @13/(byte) game_over#0 )
(byte) current_ypos#97 ← phi( @13/(byte) current_ypos#0 )
(byte) current_xpos#118 ← phi( @13/(byte) current_xpos#0 )
(byte*) current_piece_gfx#111 ← phi( @13/(byte*) current_piece_gfx#0 )
(byte) current_piece_char#99 ← phi( @13/(byte) current_piece_char#0 )
(byte) render_screen_render#62 ← phi( @13/(byte) render_screen_render#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))
// Put the sprites into memory
.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
*((byte*) SPRITES_ENABLE#0) ← (number) $f
*((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
return
to:@return
@24: scope:[] from @23
(byte) level_bcd#92 ← phi( @23/(byte) level_bcd#95 )
(byte) level#99 ← phi( @23/(byte) level#103 )
(dword) score_bcd#76 ← phi( @23/(dword) score_bcd#78 )
(word) lines_bcd#79 ← phi( @23/(word) lines_bcd#82 )
(byte) keyboard_modifiers#51 ← phi( @23/(byte) keyboard_modifiers#54 )
(byte) keyboard_events_size#68 ← phi( @23/(byte) keyboard_events_size#72 )
(byte) render_screen_showing#39 ← phi( @23/(byte) render_screen_showing#42 )
(byte) game_over#83 ← phi( @23/(byte) game_over#85 )
(byte) current_ypos#96 ← phi( @23/(byte) current_ypos#97 )
(byte) current_xpos#117 ← phi( @23/(byte) current_xpos#118 )
(byte*) current_piece_gfx#110 ← phi( @23/(byte*) current_piece_gfx#111 )
(byte) current_piece_char#98 ← phi( @23/(byte) current_piece_char#99 )
(byte) render_screen_render#60 ← phi( @23/(byte) render_screen_render#62 )
(byte) render_screen_show#55 ← phi( @23/(byte) render_screen_show#57 )
@23: scope:[] from @22
(byte) level_bcd#92 ← phi( @22/(byte) level_bcd#95 )
(byte) level#99 ← phi( @22/(byte) level#103 )
(dword) score_bcd#76 ← phi( @22/(dword) score_bcd#78 )
(word) lines_bcd#79 ← phi( @22/(word) lines_bcd#82 )
(byte) keyboard_modifiers#51 ← phi( @22/(byte) keyboard_modifiers#54 )
(byte) keyboard_events_size#68 ← phi( @22/(byte) keyboard_events_size#72 )
(byte) render_screen_showing#39 ← phi( @22/(byte) render_screen_showing#42 )
(byte) game_over#83 ← phi( @22/(byte) game_over#85 )
(byte) current_ypos#96 ← phi( @22/(byte) current_ypos#97 )
(byte) current_xpos#117 ← phi( @22/(byte) current_xpos#118 )
(byte*) current_piece_gfx#110 ← phi( @22/(byte*) current_piece_gfx#111 )
(byte) current_piece_char#98 ← phi( @22/(byte) current_piece_char#99 )
(byte) render_screen_render#60 ← phi( @22/(byte) render_screen_render#62 )
(byte) render_screen_show#55 ← phi( @22/(byte) render_screen_show#57 )
(byte) SPRITES_FIRST_YPOS#0 ← (number) $31
(number~) $4 ← (byte) SPRITES_FIRST_YPOS#0 + (number) $13
(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*) toSpritePtr1_sprite#0 ← (byte*) PLAYFIELD_SPRITES#0
to:toSpritePtr1
toSpritePtr1: scope:[] from @24
(byte) level_bcd#85 ← phi( @24/(byte) level_bcd#92 )
(byte) level#92 ← phi( @24/(byte) level#99 )
(dword) score_bcd#70 ← phi( @24/(dword) score_bcd#76 )
(word) lines_bcd#73 ← phi( @24/(word) lines_bcd#79 )
(byte) keyboard_modifiers#48 ← phi( @24/(byte) keyboard_modifiers#51 )
(byte) keyboard_events_size#63 ← phi( @24/(byte) keyboard_events_size#68 )
(byte) render_screen_showing#36 ← phi( @24/(byte) render_screen_showing#39 )
(byte) game_over#78 ← phi( @24/(byte) game_over#83 )
(byte) current_ypos#93 ← phi( @24/(byte) current_ypos#96 )
(byte) current_xpos#114 ← phi( @24/(byte) current_xpos#117 )
(byte*) current_piece_gfx#105 ← phi( @24/(byte*) current_piece_gfx#110 )
(byte) current_piece_char#92 ← phi( @24/(byte) current_piece_char#98 )
(byte) render_screen_render#57 ← phi( @24/(byte) render_screen_render#60 )
(byte) render_screen_show#52 ← phi( @24/(byte) render_screen_show#55 )
(byte) irq_raster_next#24 ← phi( @24/(byte) irq_raster_next#0 )
(byte) irq_sprite_ypos#24 ← phi( @24/(byte) irq_sprite_ypos#0 )
(byte*) toSpritePtr1_sprite#1 ← phi( @24/(byte*) toSpritePtr1_sprite#0 )
toSpritePtr1: scope:[] from @23
(byte) level_bcd#85 ← phi( @23/(byte) level_bcd#92 )
(byte) level#92 ← phi( @23/(byte) level#99 )
(dword) score_bcd#70 ← phi( @23/(dword) score_bcd#76 )
(word) lines_bcd#73 ← phi( @23/(word) lines_bcd#79 )
(byte) keyboard_modifiers#48 ← phi( @23/(byte) keyboard_modifiers#51 )
(byte) keyboard_events_size#63 ← phi( @23/(byte) keyboard_events_size#68 )
(byte) render_screen_showing#36 ← phi( @23/(byte) render_screen_showing#39 )
(byte) game_over#78 ← phi( @23/(byte) game_over#83 )
(byte) current_ypos#93 ← phi( @23/(byte) current_ypos#96 )
(byte) current_xpos#114 ← phi( @23/(byte) current_xpos#117 )
(byte*) current_piece_gfx#105 ← phi( @23/(byte*) current_piece_gfx#110 )
(byte) current_piece_char#92 ← phi( @23/(byte) current_piece_char#98 )
(byte) render_screen_render#57 ← phi( @23/(byte) render_screen_render#60 )
(byte) render_screen_show#52 ← phi( @23/(byte) render_screen_show#55 )
(byte) irq_raster_next#24 ← phi( @23/(byte) irq_raster_next#0 )
(byte) irq_sprite_ypos#24 ← phi( @23/(byte) irq_sprite_ypos#0 )
(byte*) toSpritePtr1_sprite#1 ← phi( @23/(byte*) toSpritePtr1_sprite#0 )
(word~) toSpritePtr1_$0#0 ← ((word)) (byte*) toSpritePtr1_sprite#1
(number~) toSpritePtr1_$1#0 ← (word~) toSpritePtr1_$0#0 / (number) $40
(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) toSpritePtr1_return#2 ← phi( toSpritePtr1/(byte) toSpritePtr1_return#0 )
(byte) toSpritePtr1_return#1 ← (byte) toSpritePtr1_return#2
to:@39
@39: scope:[] from toSpritePtr1_@return
to:@38
@38: scope:[] from toSpritePtr1_@return
(byte) level_bcd#68 ← phi( toSpritePtr1_@return/(byte) level_bcd#78 )
(byte) level#72 ← phi( toSpritePtr1_@return/(byte) level#85 )
(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
(byte) irq_sprite_ptr#0 ← (number~) $7
(byte) irq_cnt#0 ← (number) 0
to:@26
to:@25
sprites_irq_init: scope:[sprites_irq_init] from main::@27
asm { sei }
*((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
to:@return
sprites_irq: scope:[sprites_irq] from
(byte) irq_cnt#15 ← phi( @38/(byte) irq_cnt#17 )
(byte) render_screen_showing#15 ← phi( @38/(byte) render_screen_showing#14 )
(byte) irq_sprite_ptr#12 ← phi( @38/(byte) irq_sprite_ptr#14 )
(byte) irq_raster_next#5 ← phi( @38/(byte) irq_raster_next#10 )
(byte) irq_sprite_ypos#5 ← phi( @38/(byte) irq_sprite_ypos#9 )
(byte) irq_cnt#15 ← phi( @37/(byte) irq_cnt#17 )
(byte) render_screen_showing#15 ← phi( @37/(byte) render_screen_showing#14 )
(byte) irq_sprite_ptr#12 ← phi( @37/(byte) irq_sprite_ptr#14 )
(byte) irq_raster_next#5 ← phi( @37/(byte) irq_raster_next#10 )
(byte) irq_sprite_ypos#5 ← phi( @37/(byte) irq_sprite_ypos#9 )
asm { cld }
(byte) sprites_irq::ypos#0 ← (byte) irq_sprite_ypos#5
*((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
return
to:@return
@26: scope:[] from @39
(byte) irq_cnt#20 ← phi( @39/(byte) irq_cnt#0 )
(byte) irq_sprite_ptr#18 ← phi( @39/(byte) irq_sprite_ptr#0 )
(byte) level_bcd#61 ← phi( @39/(byte) level_bcd#68 )
(byte) level#64 ← phi( @39/(byte) level#72 )
(dword) score_bcd#51 ← phi( @39/(dword) score_bcd#56 )
(word) lines_bcd#51 ← phi( @39/(word) lines_bcd#58 )
(byte) keyboard_modifiers#33 ← phi( @39/(byte) keyboard_modifiers#39 )
(byte) keyboard_events_size#40 ← phi( @39/(byte) keyboard_events_size#48 )
(byte) render_screen_showing#21 ← phi( @39/(byte) render_screen_showing#26 )
(byte) game_over#51 ← phi( @39/(byte) game_over#59 )
(byte) current_ypos#69 ← phi( @39/(byte) current_ypos#77 )
(byte) current_xpos#85 ← phi( @39/(byte) current_xpos#97 )
(byte*) current_piece_gfx#72 ← phi( @39/(byte*) current_piece_gfx#84 )
(byte) current_piece_char#58 ← phi( @39/(byte) current_piece_char#70 )
(byte) render_screen_render#43 ← phi( @39/(byte) render_screen_render#49 )
(byte) render_screen_show#35 ← phi( @39/(byte) render_screen_show#42 )
(byte) irq_raster_next#20 ← phi( @39/(byte) irq_raster_next#22 )
(byte) irq_sprite_ypos#18 ← phi( @39/(byte) irq_sprite_ypos#21 )
@25: scope:[] from @38
(byte) irq_cnt#20 ← phi( @38/(byte) irq_cnt#0 )
(byte) irq_sprite_ptr#18 ← phi( @38/(byte) irq_sprite_ptr#0 )
(byte) level_bcd#61 ← phi( @38/(byte) level_bcd#68 )
(byte) level#64 ← phi( @38/(byte) level#72 )
(dword) score_bcd#51 ← phi( @38/(dword) score_bcd#56 )
(word) lines_bcd#51 ← phi( @38/(word) lines_bcd#58 )
(byte) keyboard_modifiers#33 ← phi( @38/(byte) keyboard_modifiers#39 )
(byte) keyboard_events_size#40 ← phi( @38/(byte) keyboard_events_size#48 )
(byte) render_screen_showing#21 ← phi( @38/(byte) render_screen_showing#26 )
(byte) game_over#51 ← phi( @38/(byte) game_over#59 )
(byte) current_ypos#69 ← phi( @38/(byte) current_ypos#77 )
(byte) current_xpos#85 ← phi( @38/(byte) current_xpos#97 )
(byte*) current_piece_gfx#72 ← phi( @38/(byte*) current_piece_gfx#84 )
(byte) current_piece_char#58 ← phi( @38/(byte) current_piece_char#70 )
(byte) render_screen_render#43 ← phi( @38/(byte) render_screen_render#49 )
(byte) render_screen_show#35 ← phi( @38/(byte) render_screen_show#42 )
(byte) irq_raster_next#20 ← phi( @38/(byte) irq_raster_next#22 )
(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_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 }
@ -1583,7 +1582,7 @@ sprites_irq::@return: scope:[sprites_irq] from sprites_irq::@6
(byte) current_movedown_counter#0 ← (number) 0
(dword[]) SCORE_BASE_BCD#0 ← { (number) 0, (number) $40, (number) $100, (number) $300, (number) $1200 }
(dword[5]) score_add_bcd#0 ← { fill( 5, 0) }
to:@31
to:@30
play_init: scope:[play_init] from main::@28
(byte) level#44 ← phi( main::@28/(byte) level#58 )
(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) play_move_rotate::return#4 ← (number) 1
to:play_move_rotate::@return
@31: scope:[] from @26
(byte) irq_cnt#19 ← phi( @26/(byte) irq_cnt#20 )
(byte) irq_sprite_ptr#17 ← phi( @26/(byte) irq_sprite_ptr#18 )
(byte) level_bcd#54 ← phi( @26/(byte) level_bcd#61 )
(byte) level#55 ← phi( @26/(byte) level#64 )
(dword) score_bcd#44 ← phi( @26/(dword) score_bcd#51 )
(word) lines_bcd#44 ← phi( @26/(word) lines_bcd#51 )
(byte) current_movedown_counter#34 ← phi( @26/(byte) current_movedown_counter#0 )
(byte) keyboard_modifiers#32 ← phi( @26/(byte) keyboard_modifiers#33 )
(byte) keyboard_events_size#36 ← phi( @26/(byte) keyboard_events_size#40 )
(byte) render_screen_showing#20 ← phi( @26/(byte) render_screen_showing#21 )
(byte) next_piece_idx#46 ← phi( @26/(byte) next_piece_idx#0 )
(byte) game_over#45 ← phi( @26/(byte) game_over#51 )
(byte) current_ypos#64 ← phi( @26/(byte) current_ypos#69 )
(byte) current_xpos#75 ← phi( @26/(byte) current_xpos#85 )
(byte*) current_piece_gfx#63 ← phi( @26/(byte*) current_piece_gfx#72 )
(byte) current_orientation#62 ← phi( @26/(byte) current_orientation#0 )
(byte) current_piece_char#51 ← phi( @26/(byte) current_piece_char#58 )
(byte*) current_piece#54 ← phi( @26/(byte*) current_piece#0 )
(byte) current_movedown_slow#59 ← phi( @26/(byte) current_movedown_slow#0 )
(byte) render_screen_render#40 ← phi( @26/(byte) render_screen_render#43 )
(byte) render_screen_show#32 ← phi( @26/(byte) render_screen_show#35 )
(byte) irq_raster_next#17 ← phi( @26/(byte) irq_raster_next#20 )
(byte) irq_sprite_ypos#14 ← phi( @26/(byte) irq_sprite_ypos#18 )
@30: scope:[] from @25
(byte) irq_cnt#19 ← phi( @25/(byte) irq_cnt#20 )
(byte) irq_sprite_ptr#17 ← phi( @25/(byte) irq_sprite_ptr#18 )
(byte) level_bcd#54 ← phi( @25/(byte) level_bcd#61 )
(byte) level#55 ← phi( @25/(byte) level#64 )
(dword) score_bcd#44 ← phi( @25/(dword) score_bcd#51 )
(word) lines_bcd#44 ← phi( @25/(word) lines_bcd#51 )
(byte) current_movedown_counter#34 ← phi( @25/(byte) current_movedown_counter#0 )
(byte) keyboard_modifiers#32 ← phi( @25/(byte) keyboard_modifiers#33 )
(byte) keyboard_events_size#36 ← phi( @25/(byte) keyboard_events_size#40 )
(byte) render_screen_showing#20 ← phi( @25/(byte) render_screen_showing#21 )
(byte) next_piece_idx#46 ← phi( @25/(byte) next_piece_idx#0 )
(byte) game_over#45 ← phi( @25/(byte) game_over#51 )
(byte) current_ypos#64 ← phi( @25/(byte) current_ypos#69 )
(byte) current_xpos#75 ← phi( @25/(byte) current_xpos#85 )
(byte*) current_piece_gfx#63 ← phi( @25/(byte*) current_piece_gfx#72 )
(byte) current_orientation#62 ← phi( @25/(byte) current_orientation#0 )
(byte) current_piece_char#51 ← phi( @25/(byte) current_piece_char#58 )
(byte*) current_piece#54 ← phi( @25/(byte*) current_piece#0 )
(byte) current_movedown_slow#59 ← phi( @25/(byte) current_movedown_slow#0 )
(byte) render_screen_render#40 ← phi( @25/(byte) render_screen_render#43 )
(byte) render_screen_show#32 ← phi( @25/(byte) render_screen_show#35 )
(byte) irq_raster_next#17 ← phi( @25/(byte) irq_raster_next#20 )
(byte) irq_sprite_ypos#14 ← phi( @25/(byte) irq_sprite_ypos#18 )
(byte) COLLISION_NONE#0 ← (number) 0
(byte) COLLISION_PLAYFIELD#0 ← (number) 1
(byte) COLLISION_BOTTOM#0 ← (number) 2
(byte) COLLISION_LEFT#0 ← (number) 4
(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
(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 )
@ -2980,26 +2979,26 @@ play_increase_level::@return: scope:[play_increase_level] from play_increase_le
(byte) level_bcd#9 ← (byte) level_bcd#22
return
to:@return
main: scope:[main] from @38
(byte) level_bcd#100 ← phi( @38/(byte) level_bcd#41 )
(dword) score_bcd#83 ← phi( @38/(dword) score_bcd#32 )
(word) lines_bcd#87 ← phi( @38/(word) lines_bcd#32 )
(byte) current_movedown_counter#58 ← phi( @38/(byte) current_movedown_counter#26 )
(byte) keyboard_modifiers#61 ← phi( @38/(byte) keyboard_modifiers#24 )
(byte) keyboard_events_size#79 ← phi( @38/(byte) keyboard_events_size#28 )
(byte) render_screen_showing#47 ← phi( @38/(byte) render_screen_showing#14 )
(byte) level#100 ← phi( @38/(byte) level#41 )
(byte) game_over#81 ← phi( @38/(byte) game_over#34 )
(byte) current_ypos#94 ← phi( @38/(byte) current_ypos#49 )
(byte) current_xpos#115 ← phi( @38/(byte) current_xpos#58 )
(byte*) current_piece_gfx#108 ← phi( @38/(byte*) current_piece_gfx#45 )
(byte) current_orientation#92 ← phi( @38/(byte) current_orientation#49 )
(byte) current_piece_char#95 ← phi( @38/(byte) current_piece_char#36 )
(byte*) current_piece#88 ← phi( @38/(byte*) current_piece#39 )
(byte) next_piece_idx#75 ← phi( @38/(byte) next_piece_idx#35 )
(byte) current_movedown_slow#80 ← phi( @38/(byte) current_movedown_slow#46 )
(byte) render_screen_render#35 ← phi( @38/(byte) render_screen_render#29 )
(byte) render_screen_show#27 ← phi( @38/(byte) render_screen_show#24 )
main: scope:[main] from @37
(byte) level_bcd#100 ← phi( @37/(byte) level_bcd#41 )
(dword) score_bcd#83 ← phi( @37/(dword) score_bcd#32 )
(word) lines_bcd#87 ← phi( @37/(word) lines_bcd#32 )
(byte) current_movedown_counter#58 ← phi( @37/(byte) current_movedown_counter#26 )
(byte) keyboard_modifiers#61 ← phi( @37/(byte) keyboard_modifiers#24 )
(byte) keyboard_events_size#79 ← phi( @37/(byte) keyboard_events_size#28 )
(byte) render_screen_showing#47 ← phi( @37/(byte) render_screen_showing#14 )
(byte) level#100 ← phi( @37/(byte) level#41 )
(byte) game_over#81 ← phi( @37/(byte) game_over#34 )
(byte) current_ypos#94 ← phi( @37/(byte) current_ypos#49 )
(byte) current_xpos#115 ← phi( @37/(byte) current_xpos#58 )
(byte*) current_piece_gfx#108 ← phi( @37/(byte*) current_piece_gfx#45 )
(byte) current_orientation#92 ← phi( @37/(byte) current_orientation#49 )
(byte) current_piece_char#95 ← phi( @37/(byte) current_piece_char#36 )
(byte*) current_piece#88 ← phi( @37/(byte*) current_piece#39 )
(byte) next_piece_idx#75 ← phi( @37/(byte) next_piece_idx#35 )
(byte) current_movedown_slow#80 ← phi( @37/(byte) current_movedown_slow#46 )
(byte) render_screen_render#35 ← phi( @37/(byte) render_screen_render#29 )
(byte) render_screen_show#27 ← phi( @37/(byte) render_screen_show#24 )
call sid_rnd_init
to:main::@25
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
return
to:@return
@38: scope:[] from @31
(byte) irq_cnt#17 ← phi( @31/(byte) irq_cnt#19 )
(byte) irq_sprite_ptr#14 ← phi( @31/(byte) irq_sprite_ptr#17 )
(byte) level_bcd#41 ← phi( @31/(byte) level_bcd#54 )
(byte) level#41 ← phi( @31/(byte) level#55 )
(dword) score_bcd#32 ← phi( @31/(dword) score_bcd#44 )
(word) lines_bcd#32 ← phi( @31/(word) lines_bcd#44 )
(byte) current_movedown_counter#26 ← phi( @31/(byte) current_movedown_counter#34 )
(byte) keyboard_modifiers#24 ← phi( @31/(byte) keyboard_modifiers#32 )
(byte) keyboard_events_size#28 ← phi( @31/(byte) keyboard_events_size#36 )
(byte) render_screen_showing#14 ← phi( @31/(byte) render_screen_showing#20 )
(byte) next_piece_idx#35 ← phi( @31/(byte) next_piece_idx#46 )
(byte) game_over#34 ← phi( @31/(byte) game_over#45 )
(byte) current_ypos#49 ← phi( @31/(byte) current_ypos#64 )
(byte) current_xpos#58 ← phi( @31/(byte) current_xpos#75 )
(byte*) current_piece_gfx#45 ← phi( @31/(byte*) current_piece_gfx#63 )
(byte) current_orientation#49 ← phi( @31/(byte) current_orientation#62 )
(byte) current_piece_char#36 ← phi( @31/(byte) current_piece_char#51 )
(byte*) current_piece#39 ← phi( @31/(byte*) current_piece#54 )
(byte) current_movedown_slow#46 ← phi( @31/(byte) current_movedown_slow#59 )
(byte) render_screen_render#29 ← phi( @31/(byte) render_screen_render#40 )
(byte) render_screen_show#24 ← phi( @31/(byte) render_screen_show#32 )
(byte) irq_raster_next#10 ← phi( @31/(byte) irq_raster_next#17 )
(byte) irq_sprite_ypos#9 ← phi( @31/(byte) irq_sprite_ypos#14 )
@37: scope:[] from @30
(byte) irq_cnt#17 ← phi( @30/(byte) irq_cnt#19 )
(byte) irq_sprite_ptr#14 ← phi( @30/(byte) irq_sprite_ptr#17 )
(byte) level_bcd#41 ← phi( @30/(byte) level_bcd#54 )
(byte) level#41 ← phi( @30/(byte) level#55 )
(dword) score_bcd#32 ← phi( @30/(dword) score_bcd#44 )
(word) lines_bcd#32 ← phi( @30/(word) lines_bcd#44 )
(byte) current_movedown_counter#26 ← phi( @30/(byte) current_movedown_counter#34 )
(byte) keyboard_modifiers#24 ← phi( @30/(byte) keyboard_modifiers#32 )
(byte) keyboard_events_size#28 ← phi( @30/(byte) keyboard_events_size#36 )
(byte) render_screen_showing#14 ← phi( @30/(byte) render_screen_showing#20 )
(byte) next_piece_idx#35 ← phi( @30/(byte) next_piece_idx#46 )
(byte) game_over#34 ← phi( @30/(byte) game_over#45 )
(byte) current_ypos#49 ← phi( @30/(byte) current_ypos#64 )
(byte) current_xpos#58 ← phi( @30/(byte) current_xpos#75 )
(byte*) current_piece_gfx#45 ← phi( @30/(byte*) current_piece_gfx#63 )
(byte) current_orientation#49 ← phi( @30/(byte) current_orientation#62 )
(byte) current_piece_char#36 ← phi( @30/(byte) current_piece_char#51 )
(byte*) current_piece#39 ← phi( @30/(byte*) current_piece#54 )
(byte) current_movedown_slow#46 ← phi( @30/(byte) current_movedown_slow#59 )
(byte) render_screen_render#29 ← phi( @30/(byte) render_screen_render#40 )
(byte) render_screen_show#24 ← phi( @30/(byte) render_screen_show#32 )
(byte) irq_raster_next#10 ← phi( @30/(byte) irq_raster_next#17 )
(byte) irq_sprite_ypos#9 ← phi( @30/(byte) irq_sprite_ypos#14 )
call main
to:@40
@40: scope:[] from @38
(byte) level_bcd#25 ← phi( @38/(byte) level_bcd#11 )
(byte) level#25 ← phi( @38/(byte) level#10 )
(dword) score_bcd#19 ← phi( @38/(dword) score_bcd#8 )
(word) lines_bcd#20 ← phi( @38/(word) lines_bcd#8 )
(byte) current_movedown_counter#17 ← phi( @38/(byte) current_movedown_counter#7 )
(byte) keyboard_modifiers#17 ← phi( @38/(byte) keyboard_modifiers#8 )
(byte) keyboard_events_size#20 ← phi( @38/(byte) keyboard_events_size#8 )
(byte) render_screen_showing#10 ← phi( @38/(byte) render_screen_showing#4 )
(byte) next_piece_idx#23 ← phi( @38/(byte) next_piece_idx#10 )
(byte) game_over#22 ← phi( @38/(byte) game_over#10 )
(byte) current_ypos#29 ← phi( @38/(byte) current_ypos#11 )
(byte) current_xpos#35 ← phi( @38/(byte) current_xpos#14 )
(byte*) current_piece_gfx#28 ← phi( @38/(byte*) current_piece_gfx#13 )
(byte) current_orientation#31 ← phi( @38/(byte) current_orientation#13 )
(byte) current_piece_char#23 ← phi( @38/(byte) current_piece_char#10 )
(byte*) current_piece#23 ← phi( @38/(byte*) current_piece#10 )
(byte) current_movedown_slow#28 ← phi( @38/(byte) current_movedown_slow#14 )
(byte) render_screen_render#19 ← phi( @38/(byte) render_screen_render#7 )
(byte) render_screen_show#17 ← phi( @38/(byte) render_screen_show#7 )
to:@39
@39: scope:[] from @37
(byte) level_bcd#25 ← phi( @37/(byte) level_bcd#11 )
(byte) level#25 ← phi( @37/(byte) level#10 )
(dword) score_bcd#19 ← phi( @37/(dword) score_bcd#8 )
(word) lines_bcd#20 ← phi( @37/(word) lines_bcd#8 )
(byte) current_movedown_counter#17 ← phi( @37/(byte) current_movedown_counter#7 )
(byte) keyboard_modifiers#17 ← phi( @37/(byte) keyboard_modifiers#8 )
(byte) keyboard_events_size#20 ← phi( @37/(byte) keyboard_events_size#8 )
(byte) render_screen_showing#10 ← phi( @37/(byte) render_screen_showing#4 )
(byte) next_piece_idx#23 ← phi( @37/(byte) next_piece_idx#10 )
(byte) game_over#22 ← phi( @37/(byte) game_over#10 )
(byte) current_ypos#29 ← phi( @37/(byte) current_ypos#11 )
(byte) current_xpos#35 ← phi( @37/(byte) current_xpos#14 )
(byte*) current_piece_gfx#28 ← phi( @37/(byte*) current_piece_gfx#13 )
(byte) current_orientation#31 ← phi( @37/(byte) current_orientation#13 )
(byte) current_piece_char#23 ← phi( @37/(byte) current_piece_char#10 )
(byte*) current_piece#23 ← phi( @37/(byte*) current_piece#10 )
(byte) current_movedown_slow#28 ← phi( @37/(byte) current_movedown_slow#14 )
(byte) render_screen_render#19 ← phi( @37/(byte) render_screen_render#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_render#8 ← (byte) render_screen_render#19
(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_bcd#12 ← (byte) level_bcd#25
to:@end
@end: scope:[] from @40
@end: scope:[] from @39
SYMBOL TABLE SSA
(byte*~) $1
@ -3776,17 +3775,17 @@ SYMBOL TABLE SSA
(number~) $7
(word~) $8
(word~) $9
(label) @12
(label) @14
(label) @11
(label) @13
(label) @22
(label) @23
(label) @24
(label) @26
(label) @31
(label) @25
(label) @30
(label) @37
(label) @38
(label) @39
(label) @40
(label) @5
(label) @9
(label) @4
(label) @8
(label) @begin
(label) @end
(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 main::@44(between main::@19 and main::@1)
Adding NOP phi() at start of @begin
Adding NOP phi() at start of @5
Adding NOP phi() at start of @9
Adding NOP phi() at start of @12
Adding NOP phi() at start of @4
Adding NOP phi() at start of @8
Adding NOP phi() at start of @11
Adding NOP phi() at start of toSpritePtr1
Adding NOP phi() at start of toSpritePtr1_@return
Adding NOP phi() at start of @26
Adding NOP phi() at start of @31
Adding NOP phi() at start of @38
Adding NOP phi() at start of @40
Adding NOP phi() at start of @25
Adding NOP phi() at start of @30
Adding NOP phi() at start of @37
Adding NOP phi() at start of @39
Adding NOP phi() at start of @end
Adding NOP phi() at start of main
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 [906] irq_sprite_ptr#19 ← irq_sprite_ptr#1
Coalesced down to 99 phi equivalence classes
Culled Empty Block (label) @5
Culled Empty Block (label) @9
Culled Empty Block (label) @12
Culled Empty Block (label) @4
Culled Empty Block (label) @8
Culled Empty Block (label) @11
Culled Empty Block (label) toSpritePtr1_@return
Culled Empty Block (label) @26
Culled Empty Block (label) @31
Culled Empty Block (label) @40
Culled Empty Block (label) @25
Culled Empty Block (label) @30
Culled Empty Block (label) @39
Culled Empty Block (label) main::@12
Culled Empty Block (label) main::@43
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::@10
Culled Empty Block (label) sprites_irq::toSpritePtr2_@return
Renumbering block @14 to @1
Renumbering block @23 to @2
Renumbering block @24 to @3
Renumbering block @38 to @4
Renumbering block @39 to @5
Renumbering block @13 to @1
Renumbering block @22 to @2
Renumbering block @23 to @3
Renumbering block @37 to @4
Renumbering block @38 to @5
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::@7 to keyboard_event_scan::@6

View File

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

View File

@ -28,11 +28,11 @@ main::toD0181: scope:[main] from main
main::@3: scope:[main] from main::toD0181
[11] *((const byte*) D018#0) ← (const byte) main::toD0181_return#0
[12] *((const byte*) D016#0) ← (const byte) VIC_MCM#0
[13] call fill
[13] call memset
to:main::@4
main::@4: scope:[main] from main::@3
[14] phi()
[15] call fill
[15] call memset
to:main::@1
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 )
@ -433,17 +433,18 @@ divr16u::@6: scope:[divr16u] from divr16u::@3
divr16u::@return: scope:[divr16u] from divr16u::@6
[213] return
to:@return
fill: scope:[fill] 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*) fill::addr#0 ← phi( main::@3/(const byte*) SCREEN#0 main::@4/(const byte*) COLS#0 )
[215] (byte*) fill::end#0 ← (byte*) fill::addr#0 + (word) $3e8
to:fill::@1
fill::@1: scope:[fill] from fill fill::@1
[216] (byte*) fill::addr#2 ← phi( fill/(byte*) fill::addr#0 fill::@1/(byte*) fill::addr#1 )
[217] *((byte*) fill::addr#2) ← (byte) fill::val#3
[218] (byte*) fill::addr#1 ← ++ (byte*) fill::addr#2
[219] if((byte*) fill::addr#1!=(byte*) fill::end#0) goto fill::@1
to:fill::@return
fill::@return: scope:[fill] from fill::@1
[220] return
memset: scope:[memset] from main::@3 main::@4
[214] (byte) memset::c#3 ← phi( main::@3/(const byte) BLACK#0 main::@4/(const byte) WHITE#0|(byte) 8 )
[214] (void*) memset::str#2 ← phi( main::@3/(void*)(const byte*) SCREEN#0 main::@4/(void*)(const byte*) COLS#0 )
[215] (void*~) memset::$0 ← (void*) memset::str#2 + (word) $3e8
[216] (byte*~) memset::dst#3 ← (byte*)(void*) memset::str#2
to:memset::@1
memset::@1: scope:[memset] from memset memset::@1
[217] (byte*) memset::dst#2 ← phi( memset/(byte*~) memset::dst#3 memset::@1/(byte*) memset::dst#1 )
[218] *((byte*) memset::dst#2) ← (byte) memset::c#3
[219] (byte*) memset::dst#1 ← ++ (byte*) memset::dst#2
[220] if((byte*) memset::dst#1!=(byte*)(void*~) memset::$0) goto memset::@1
to:memset::@return
memset::@return: scope:[memset] from memset::@1
[221] 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#2 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()
(signed word*~) loop::$1 $1 zp ZP_WORD:43 22.0
(word~) loop::$5 $5 zp ZP_WORD:43 22.0
@ -136,6 +123,21 @@
(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
(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)
(word~) mul16s::$16 $16 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: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 [ fill::val#3 ]
zp ZP_WORD:41 [ fill::addr#2 fill::addr#0 fill::addr#1 ]
zp ZP_WORD:41 [ memset::str#2 memset::dst#2 memset::dst#3 memset::dst#1 ]
reg byte x [ memset::c#3 ]
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::$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 ]
reg byte a [ divr16u::$1 ]
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
ldx #BLACK
lda #<$28*$19
sta fill.size
sta memset.num
lda #>$28*$19
sta fill.size+1
sta memset.num+1
lda #<SCREEN
sta fill.addr
sta memset.str
lda #>SCREEN
sta fill.addr+1
jsr fill
sta memset.str+1
jsr memset
ldx #WHITE|8
lda #<$28*$19
sta fill.size
sta memset.num
lda #>$28*$19
sta fill.size+1
sta memset.num+1
lda #<COLS
sta fill.addr
sta memset.str
lda #>COLS
sta fill.addr+1
jsr fill
sta memset.str+1
jsr memset
ldx #0
b1:
txa
@ -62,31 +62,32 @@ main: {
inc $d020
jmp b2
}
// Fill some memory with a value
// fill(word zeropage(2) size, byte register(X) val)
fill: {
.label end = 2
.label addr = 4
.label size = 2
// Copies the character c (an unsigned char) to the first num characters of the object pointed to by the argument str.
// memset(void* zeropage(2) str, byte register(X) c, word zeropage(4) num)
memset: {
.label end = 4
.label dst = 2
.label str = 2
.label num = 4
lda end
clc
adc addr
adc str
sta end
lda end+1
adc addr+1
adc str+1
sta end+1
b1:
txa
ldy #0
sta (addr),y
inc addr
sta (dst),y
inc dst
bne !+
inc addr+1
inc dst+1
!:
lda addr+1
lda dst+1
cmp end+1
bne b1
lda addr
lda dst
cmp end
bne b1
rts

View File

@ -27,11 +27,11 @@ main::toD0181: scope:[main] from main
main::@3: scope:[main] from main::toD0181
[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
[12] call fill
[12] call memset
to:main::@4
main::@4: scope:[main] from main::@3
[13] phi()
[14] call fill
[14] call memset
to:main::@1
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 )
@ -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)
kickasm() {{ inc $d020 }}
to:main::@2
fill: scope:[fill] 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] (word) fill::size#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 )
[22] (byte*) fill::end#0 ← (byte*) fill::addr#0 + (word) fill::size#2
to:fill::@1
fill::@1: scope:[fill] from fill fill::@1
[23] (byte*) fill::addr#2 ← phi( fill/(byte*) fill::addr#0 fill::@1/(byte*) fill::addr#1 )
[24] *((byte*) fill::addr#2) ← (byte) fill::val#3
[25] (byte*) fill::addr#1 ← ++ (byte*) fill::addr#2
[26] if((byte*) fill::addr#1!=(byte*) fill::end#0) goto fill::@1
to:fill::@return
fill::@return: scope:[fill] from fill::@1
[27] return
memset: scope:[memset] from main::@3 main::@4
[21] (byte) memset::c#3 ← phi( main::@4/(const byte) WHITE#0|(byte) 8 main::@3/(const byte) BLACK#0 )
[21] (word) memset::num#2 ← phi( main::@4/(word)(number) $28*(number) $19 main::@3/(word)(number) $28*(number) $19 )
[21] (void*) memset::str#2 ← phi( main::@4/(void*)(const byte*) COLS#0 main::@3/(void*)(const byte*) SCREEN#0 )
[22] (void*) memset::end#0 ← (void*) memset::str#2 + (word) memset::num#2
[23] (byte*~) memset::dst#3 ← (byte*)(void*) memset::str#2
to:memset::@1
memset::@1: scope:[memset] from memset memset::@1
[24] (byte*) memset::dst#2 ← phi( memset/(byte*~) memset::dst#3 memset::@1/(byte*) memset::dst#1 )
[25] *((byte*) memset::dst#2) ← (byte) memset::c#3
[26] (byte*) memset::dst#1 ← ++ (byte*) memset::dst#2
[27] if((byte*) memset::dst#1!=(byte*)(void*) memset::end#0) goto memset::@1
to:memset::@return
memset::@return: scope:[memset] from memset::@1
[28] 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
(byte) WHITE
(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()
(label) main::@1
(label) main::@2
@ -66,8 +52,24 @@
(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
(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 ]
zp ZP_WORD:2 [ fill::size#2 fill::end#0 ]
reg byte x [ fill::val#3 ]
zp ZP_WORD:4 [ fill::addr#2 fill::addr#0 fill::addr#1 ]
zp ZP_WORD:2 [ memset::str#2 memset::dst#2 memset::dst#3 memset::dst#1 ]
zp ZP_WORD:4 [ memset::num#2 memset::end#0 ]
reg byte x [ memset::c#3 ]

View File

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

View File

@ -36,7 +36,7 @@ main::toD0181: scope:[main] from main::@2
to:main::@3
main::@3: scope:[main] from main::toD0181
[14] *((const byte*) D018#0) ← (const byte) main::toD0181_return#0
[15] call fill
[15] call memset
to:main::@4
main::@4: scope:[main] from main::@3
[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
[219] return
to:@return
fill: scope:[fill] from main::@3
memset: scope:[memset] from main::@3
[220] phi()
to:fill::@1
fill::@1: scope:[fill] from fill fill::@1
[221] (byte*) fill::addr#2 ← phi( fill/(const byte*) SCREEN#0 fill::@1/(byte*) fill::addr#1 )
[222] *((byte*) fill::addr#2) ← (const byte) WHITE#0
[223] (byte*) fill::addr#1 ← ++ (byte*) fill::addr#2
[224] if((byte*) fill::addr#1!=(const byte*) fill::end#0) goto fill::@1
to:fill::@return
fill::@return: scope:[fill] from fill::@1
to:memset::@1
memset::@1: scope:[memset] from memset memset::@1
[221] (byte*) memset::dst#2 ← phi( memset/(byte*)(const void*) memset::str#0 memset::@1/(byte*) memset::dst#1 )
[222] *((byte*) memset::dst#2) ← (const byte) WHITE#0
[223] (byte*) memset::dst#1 ← ++ (byte*) memset::dst#2
[224] if((byte*) memset::dst#1!=(const byte*) memset::end#0) goto memset::@1
to:memset::@return
memset::@return: scope:[memset] from memset::@1
[225] 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#2 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()
(label) main::@1
(label) main::@2
@ -205,6 +193,20 @@
(byte*) main::vicSelectGfxBank1_toDd001_gfx
(byte) main::vicSelectGfxBank1_toDd001_return
(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)
(word~) mul16s::$16 $16 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::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: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 x [ render_sine::ypos#0 ]
reg byte a [ wrap_y::return#1 ]

View File

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

View File

@ -96,11 +96,11 @@ init: scope:[init] from main
to:init::@2
init::@2: scope:[init] from init
[57] phi()
[58] call fill
[58] call memset
to:init::@3
init::@3: scope:[init] from init::@2
[59] phi()
[60] call fill
[60] call memset
to:init::toD0181
init::toD0181: scope:[init] from init::@3
[61] phi()
@ -117,28 +117,29 @@ init::@1: scope:[init] from init::toD0181
init::@return: scope:[init] from init::@1
[69] return
to:@return
fill: scope:[fill] from init::@2 init::@3
[70] (byte) fill::val#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 )
[71] (byte*) fill::end#0 ← (byte*) fill::addr#0 + (word) $3e8
to:fill::@1
fill::@1: scope:[fill] from fill fill::@1
[72] (byte*) fill::addr#2 ← phi( fill/(byte*) fill::addr#0 fill::@1/(byte*) fill::addr#1 )
[73] *((byte*) fill::addr#2) ← (byte) fill::val#3
[74] (byte*) fill::addr#1 ← ++ (byte*) fill::addr#2
[75] if((byte*) fill::addr#1!=(byte*) fill::end#0) goto fill::@1
to:fill::@return
fill::@return: scope:[fill] from fill::@1
[76] return
memset: scope:[memset] from init::@2 init::@3
[70] (byte) memset::c#3 ← phi( init::@2/(byte) 0 init::@3/(const byte) BLACK#0 )
[70] (void*) memset::str#2 ← phi( init::@2/(void*)(const byte*) screen#0 init::@3/(void*)(const byte*) colors#0 )
[71] (void*) memset::end#0 ← (void*) memset::str#2 + (word) $3e8
[72] (byte*~) memset::dst#3 ← (byte*)(void*) memset::str#2
to:memset::@1
memset::@1: scope:[memset] from memset memset::@1
[73] (byte*) memset::dst#2 ← phi( memset/(byte*~) memset::dst#3 memset::@1/(byte*) memset::dst#1 )
[74] *((byte*) memset::dst#2) ← (byte) memset::c#3
[75] (byte*) memset::dst#1 ← ++ (byte*) memset::dst#2
[76] if((byte*) memset::dst#1!=(byte*)(void*) memset::end#0) goto memset::@1
to:memset::@return
memset::@return: scope:[memset] from memset::@1
[77] return
to:@return
init_sprites: scope:[init_sprites] from init
[77] *((const byte*) SPRITES_ENABLE#0) ← (byte) 1
[78] *((const byte*) SPRITES_EXPAND_X#0) ← (byte) 0
[79] *((const byte*) SPRITES_EXPAND_Y#0) ← (byte) 0
[80] *((const byte*) SPRITES_XMSB#0) ← (byte) 0
[81] *((const byte*) SPRITES_COLS#0) ← (const byte) WHITE#0
[82] *((const byte*) SPRITES_MC#0) ← (byte) 0
[78] *((const byte*) SPRITES_ENABLE#0) ← (byte) 1
[79] *((const byte*) SPRITES_EXPAND_X#0) ← (byte) 0
[80] *((const byte*) SPRITES_EXPAND_Y#0) ← (byte) 0
[81] *((const byte*) SPRITES_XMSB#0) ← (byte) 0
[82] *((const byte*) SPRITES_COLS#0) ← (const byte) WHITE#0
[83] *((const byte*) SPRITES_MC#0) ← (byte) 0
to:init_sprites::@return
init_sprites::@return: scope:[init_sprites] from init_sprites
[83] return
[84] 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#0 z zp ZP_WORD:4 4.0
(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()
(label) init::@1
(label) init::@2
@ -120,6 +107,21 @@
(byte) main::y#2 y zp ZP_BYTE:3 57.714285714285715
(byte) main::z
(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)
(byte~) mul8u::$1 reg byte a 2002.0
(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 ]
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 ]
reg byte x [ fill::val#3 ]
zp ZP_WORD:8 [ fill::addr#2 fill::addr#0 fill::addr#1 ]
zp ZP_WORD:8 [ memset::str#2 memset::dst#2 memset::dst#3 memset::dst#1 ]
reg byte x [ memset::c#3 ]
reg byte a [ main::z#0 ]
reg byte a [ main::tile#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:25 [ draw_block::$17 ]
reg byte a [ mul8u::$1 ]
zp ZP_WORD:27 [ fill::end#0 ]
zp ZP_WORD:27 [ memset::end#0 ]