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

Fixed problem with PHI-blocks still referencing blocks that no longer call them bacause of constant bool if()s.

This commit is contained in:
jespergravgaard 2018-04-19 01:46:41 +02:00
parent 2fb9619381
commit ee6e58f79c
16 changed files with 18845 additions and 17907 deletions

@ -7,6 +7,7 @@ import dk.camelot64.kickc.model.statements.StatementConditionalJump;
import dk.camelot64.kickc.model.values.ConstantBool;
import dk.camelot64.kickc.model.values.ConstantLiteral;
import dk.camelot64.kickc.model.values.ConstantValue;
import dk.camelot64.kickc.model.values.LabelRef;
import java.util.ListIterator;
@ -34,6 +35,7 @@ public class Pass2ConstantIfs extends Pass2SsaOptimization {
if(((ConstantBool) literal).getBool()) {
// if()-value always true - remove if and replace destination
getLog().append("if() condition always true - replacing block destination "+statement.toString(getProgram(), false));
Pass2EliminateUnusedBlocks.removePhiRValues(block.getLabel(), getGraph().getDefaultSuccessor(block), getLog());
block.setDefaultSuccessor(conditionalJump.getDestination());
statementsIt.remove();
block.setConditionalSuccessor(null);
@ -41,6 +43,7 @@ public class Pass2ConstantIfs extends Pass2SsaOptimization {
} else {
// if()-value always false - remove if()
getLog().append("if() condition always false - eliminating if "+statement.toString(getProgram(), false));
Pass2EliminateUnusedBlocks.removePhiRValues(block.getLabel(), getGraph().getConditionalSuccessor(block), getLog());
statementsIt.remove();
block.setConditionalSuccessor(null);
modified = true;

@ -1,12 +1,15 @@
package dk.camelot64.kickc.passes;
import dk.camelot64.kickc.CompileLog;
import dk.camelot64.kickc.model.ControlFlowBlock;
import dk.camelot64.kickc.model.Program;
import dk.camelot64.kickc.model.statements.StatementPhiBlock;
import dk.camelot64.kickc.model.symbols.Label;
import dk.camelot64.kickc.model.values.LabelRef;
import dk.camelot64.kickc.model.values.SymbolRef;
import java.util.LinkedHashSet;
import java.util.ListIterator;
import java.util.Set;
/** Pass that eliminates constant if's - they are either removed (if false) or replaces the default successor (if true). */
@ -32,11 +35,43 @@ public class Pass2EliminateUnusedBlocks extends Pass2SsaOptimization {
getGraph().remove(unusedBlock);
Label label = getScope().getLabel(unusedBlock);
label.getScope().remove(label);
removePhiRValues(unusedBlock);
getLog().append("Removing unused block "+unusedBlock);
}
return unusedBlocks.size()>0;
}
/**
* Remove all PHI RValues in any phi-statements referencing the passed block
* @param removeBlock The block to remove from PHI RValues
*/
private void removePhiRValues(LabelRef removeBlock) {
for(ControlFlowBlock block : getGraph().getAllBlocks()) {
removePhiRValues(removeBlock, block, getLog());
}
}
/**
* Remove all Phi RValues in phi-statements referencing the passed block
*
* @param removeBlock The block to remove from PHI RValues
* @param block The block to modify
*/
public static void removePhiRValues(LabelRef removeBlock, ControlFlowBlock block, CompileLog log) {
if(block.hasPhiBlock()) {
for(StatementPhiBlock.PhiVariable phiVariable : block.getPhiBlock().getPhiVariables()) {
ListIterator<StatementPhiBlock.PhiRValue> phiRValueIt = phiVariable.getValues().listIterator();
while(phiRValueIt.hasNext()) {
StatementPhiBlock.PhiRValue phiRValue = phiRValueIt.next();
if(phiRValue.getPredecessor().equals(removeBlock)) {
log.append("Removing PHI-reference to removed block ("+removeBlock+") in block "+block.getLabel());
phiRValueIt.remove();
}
}
}
}
}
/**
* Find all referenced block labels recursively
* @param block The block to add (inc. all blocks that this block calls or jumps to)

@ -45,6 +45,12 @@ public class TestPrograms {
AsmFragmentTemplateUsages.logUsages(log, false, false, false, false, false, false);
}
@Test
public void testEmptyBlockError() throws IOException, URISyntaxException {
compileAndCompare("emptyblock-error");
}
@Test
public void testBoolMin() throws IOException, URISyntaxException {
compileAndCompare("bool-min");

@ -0,0 +1,27 @@
// Error cleaning up unused blocks
void main() {
while(true) {
menu();
}
}
void menu() {
while(true) {
mode();
return;
}
}
byte a = 0;
byte *B = $1000;
void mode() {
while(true) {
if(*B == 0) {
a = *B;
}
}
}

@ -126,7 +126,6 @@
.label print_char_cursor = 5
.label print_line_cursor = $10
.label keyboard_events_size = 8
.label keyboard_modifiers = 7
.label form_cursor_count = $d
.label form_field_idx = $e
jsr main
@ -142,7 +141,6 @@ main: {
jsr gfx_init
lda #0
sta form_field_idx
sta keyboard_modifiers
sta keyboard_events_size
lda #FORM_CURSOR_BLINK/2
sta form_cursor_count
@ -537,39 +535,37 @@ keyboard_event_scan: {
jsr keyboard_event_pressed
cmp #0
beq b5
lda #0|KEY_MODIFIER_LSHIFT
sta keyboard_modifiers
ldx #0|KEY_MODIFIER_LSHIFT
jmp b9
b5:
lda #0
sta keyboard_modifiers
ldx #0
b9:
lda #KEY_RSHIFT
sta keyboard_event_pressed.keycode
jsr keyboard_event_pressed
cmp #0
beq b10
lda #KEY_MODIFIER_RSHIFT
ora keyboard_modifiers
sta keyboard_modifiers
txa
ora #KEY_MODIFIER_RSHIFT
tax
b10:
lda #KEY_CTRL
sta keyboard_event_pressed.keycode
jsr keyboard_event_pressed
cmp #0
beq b11
lda #KEY_MODIFIER_CTRL
ora keyboard_modifiers
sta keyboard_modifiers
txa
ora #KEY_MODIFIER_CTRL
tax
b11:
lda #KEY_COMMODORE
sta keyboard_event_pressed.keycode
jsr keyboard_event_pressed
cmp #0
beq breturn
lda #KEY_MODIFIER_COMMODORE
ora keyboard_modifiers
sta keyboard_modifiers
txa
ora #KEY_MODIFIER_COMMODORE
tax
breturn:
rts
b6:
@ -586,18 +582,20 @@ keyboard_event_scan: {
jmp b8
}
keyboard_event_pressed: {
.label row_bits = 7
.label keycode = 2
lda keycode
lsr
lsr
lsr
tax
ldy keyboard_scan_values,x
tay
lda keyboard_scan_values,y
sta row_bits
lda #7
and keycode
tax
tya
and keyboard_matrix_col_bitmask,x
tay
lda keyboard_matrix_col_bitmask,y
and row_bits
rts
}
keyboard_matrix_read: {
@ -1249,8 +1247,8 @@ form_control: {
ldy #0
and (field),y
sta (field),y
lda #KEY_MODIFIER_SHIFT
and keyboard_modifiers
txa
and #KEY_MODIFIER_SHIFT
cmp #0
bne b5
inc form_field_idx
@ -1276,8 +1274,8 @@ form_control: {
b4:
cmp #KEY_CRSR_RIGHT
bne b9
lda #KEY_MODIFIER_SHIFT
and keyboard_modifiers
txa
and #KEY_MODIFIER_SHIFT
cmp #0
bne b10
ldx form_field_idx

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

@ -558,18 +558,16 @@
(const byte*) form_ctrl_overs#0 form_ctrl_overs = (const byte[]) form_fields_val#0+(byte/signed byte/word/signed word/dword/signed dword) 9
(signed byte) form_cursor_count
(signed byte) form_cursor_count#1 form_cursor_count zp ZP_BYTE:13 0.3333333333333333
(signed byte) form_cursor_count#13 form_cursor_count zp ZP_BYTE:13 402.59999999999997
(signed byte) form_cursor_count#15 form_cursor_count zp ZP_BYTE:13 0.4
(signed byte) form_cursor_count#16 form_cursor_count zp ZP_BYTE:13 162.23076923076925
(signed byte) form_cursor_count#21 form_cursor_count zp ZP_BYTE:13 301.0
(signed byte) form_cursor_count#16 form_cursor_count zp ZP_BYTE:13 65.82352941176472
(signed byte) form_cursor_count#21 form_cursor_count zp ZP_BYTE:13 158.0
(signed byte) form_cursor_count#5 form_cursor_count zp ZP_BYTE:13 2.0
(byte*) form_dtv_palet
(const byte*) form_dtv_palet#0 form_dtv_palet = (const byte[]) form_fields_val#0+(byte/signed byte/word/signed word/dword/signed dword) 27
(byte) form_field_idx
(byte) form_field_idx#1 form_field_idx zp ZP_BYTE:14 0.3333333333333333
(byte) form_field_idx#14 form_field_idx zp ZP_BYTE:14 402.59999999999997
(byte) form_field_idx#18 form_field_idx zp ZP_BYTE:14 162.38461538461542
(byte) form_field_idx#28 form_field_idx zp ZP_BYTE:14 54.84615384615385
(byte) form_field_idx#18 form_field_idx zp ZP_BYTE:14 65.94117647058826
(byte) form_field_idx#28 form_field_idx zp ZP_BYTE:14 29.17948717948718
(byte) form_field_idx#32 form_field_idx zp ZP_BYTE:14 6.0
(byte) form_field_idx#44 form_field_idx zp ZP_BYTE:14 2.0
(byte) form_field_idx#45 form_field_idx zp ZP_BYTE:14 2.0
@ -1087,7 +1085,6 @@
(label) gfx_mode::@11
(label) gfx_mode::@13
(label) gfx_mode::@15
(label) gfx_mode::@16
(label) gfx_mode::@19
(label) gfx_mode::@2
(label) gfx_mode::@21
@ -1187,7 +1184,7 @@
(byte) keyboard_event_pressed::return#2 reg byte a 4.0
(byte) keyboard_event_pressed::return#3 reg byte a 4.0
(byte) keyboard_event_pressed::row_bits
(byte) keyboard_event_pressed::row_bits#0 reg byte y 2.0
(byte) keyboard_event_pressed::row_bits#0 row_bits zp ZP_BYTE:7 2.0
(void()) keyboard_event_scan()
(byte/word/dword~) keyboard_event_scan::$12 reg byte a 200002.0
(byte~) keyboard_event_scan::$16 reg byte a 4.0
@ -1241,18 +1238,15 @@
(byte) keyboard_events_size
(byte) keyboard_events_size#1 keyboard_events_size zp ZP_BYTE:8 200002.0
(byte) keyboard_events_size#100 keyboard_events_size zp ZP_BYTE:8 882.6176470588235
(byte) keyboard_events_size#11 keyboard_events_size zp ZP_BYTE:8 71.0
(byte) keyboard_events_size#110 keyboard_events_size zp ZP_BYTE:8 105.0
(byte) keyboard_events_size#118 keyboard_events_size zp ZP_BYTE:8 102001.2
(byte) keyboard_events_size#119 keyboard_events_size zp ZP_BYTE:8 4286.428571428572
(byte) keyboard_events_size#13 keyboard_events_size zp ZP_BYTE:8 16.571428571428573
(byte) keyboard_events_size#18 keyboard_events_size zp ZP_BYTE:8 81000.90000000001
(byte) keyboard_events_size#2 keyboard_events_size zp ZP_BYTE:8 200002.0
(byte) keyboard_events_size#24 keyboard_events_size zp ZP_BYTE:8 50.19565217391305
(byte) keyboard_events_size#24 keyboard_events_size zp ZP_BYTE:8 6.6923076923076925
(byte) keyboard_events_size#27 keyboard_events_size zp ZP_BYTE:8 0.3333333333333333
(byte) keyboard_events_size#4 keyboard_events_size zp ZP_BYTE:8 3.0
(byte) keyboard_events_size#45 keyboard_events_size zp ZP_BYTE:8 168.33333333333331
(byte) keyboard_events_size#47 keyboard_events_size zp ZP_BYTE:8 123.94117647058823
(byte) keyboard_events_size#47 keyboard_events_size zp ZP_BYTE:8 65.05882352941177
(void()) keyboard_init()
(label) keyboard_init::@return
(byte[8]) keyboard_matrix_col_bitmask
@ -1268,18 +1262,13 @@
(byte[8]) keyboard_matrix_row_bitmask
(const byte[8]) keyboard_matrix_row_bitmask#0 keyboard_matrix_row_bitmask = { (byte/word/signed word/dword/signed dword) 254, (byte/word/signed word/dword/signed dword) 253, (byte/word/signed word/dword/signed dword) 251, (byte/word/signed word/dword/signed dword) 247, (byte/word/signed word/dword/signed dword) 239, (byte/word/signed word/dword/signed dword) 223, (byte/word/signed word/dword/signed dword) 191, (byte/signed byte/word/signed word/dword/signed dword) 127 }
(byte) keyboard_modifiers
(byte) keyboard_modifiers#11 keyboard_modifiers zp ZP_BYTE:7 71.0
(byte) keyboard_modifiers#13 keyboard_modifiers zp ZP_BYTE:7 16.571428571428573
(byte) keyboard_modifiers#18 keyboard_modifiers zp ZP_BYTE:7 0.8
(byte) keyboard_modifiers#19 keyboard_modifiers zp ZP_BYTE:7 1.6
(byte) keyboard_modifiers#20 keyboard_modifiers zp ZP_BYTE:7 1.6
(byte) keyboard_modifiers#21 keyboard_modifiers zp ZP_BYTE:7 46.26
(byte) keyboard_modifiers#24 keyboard_modifiers zp ZP_BYTE:7 0.3333333333333333
(byte) keyboard_modifiers#3 keyboard_modifiers zp ZP_BYTE:7 4.0
(byte) keyboard_modifiers#4 keyboard_modifiers zp ZP_BYTE:7 4.0
(byte) keyboard_modifiers#42 keyboard_modifiers zp ZP_BYTE:7 4040.0
(byte) keyboard_modifiers#45 keyboard_modifiers zp ZP_BYTE:7 21050.0
(byte) keyboard_modifiers#5 keyboard_modifiers zp ZP_BYTE:7 4.0
(byte) keyboard_modifiers#18 reg byte x 0.8
(byte) keyboard_modifiers#19 reg byte x 1.6
(byte) keyboard_modifiers#20 reg byte x 1.6
(byte) keyboard_modifiers#21 reg byte x 0.7272727272727273
(byte) keyboard_modifiers#3 reg byte x 4.0
(byte) keyboard_modifiers#4 reg byte x 4.0
(byte) keyboard_modifiers#5 reg byte x 4.0
(byte[8]) keyboard_scan_values
(const byte[8]) keyboard_scan_values#0 keyboard_scan_values = { fill( 8, 0) }
(void()) main()
@ -1407,14 +1396,15 @@ reg byte x [ gfx_mode::i#2 gfx_mode::i#1 ]
reg byte x [ gfx_mode::j#2 gfx_mode::j#1 ]
reg byte a [ keyboard_event_get::return#2 keyboard_event_get::return#0 ]
reg byte x [ keyboard_event_scan::col#2 keyboard_event_scan::col#1 ]
zp ZP_BYTE:7 [ keyboard_event_scan::keycode#10 keyboard_event_scan::keycode#11 keyboard_event_scan::keycode#14 keyboard_event_scan::keycode#15 keyboard_event_scan::keycode#1 keyboard_modifiers#45 keyboard_modifiers#24 keyboard_modifiers#11 keyboard_modifiers#42 keyboard_modifiers#13 keyboard_modifiers#21 keyboard_modifiers#20 keyboard_modifiers#4 keyboard_modifiers#19 keyboard_modifiers#3 keyboard_modifiers#18 keyboard_modifiers#5 gfx_init_plane_fill::by#4 gfx_init_plane_fill::by#1 gfx_init_plane_charset8::cr#6 gfx_init_plane_charset8::cr#1 bitmap_line_ydxi::xd#2 bitmap_line_ydxi::xd#1 bitmap_line_ydxi::xd#0 bitmap_line::xd#1 bitmap_line::xd#0 bitmap_line_xdyi::xd#5 bitmap_line_xdyi::xd#0 bitmap_line_xdyi::xd#1 bitmap_line_ydxd::xd#2 bitmap_line_ydxd::xd#1 bitmap_line_ydxd::xd#0 bitmap_line_xdyd::xd#5 bitmap_line_xdyd::xd#0 bitmap_line_xdyd::xd#1 gfx_init_screen3::$1 gfx_init_screen2::col2#0 gfx_init_screen0::$1 ]
zp ZP_BYTE:8 [ keyboard_events_size#18 keyboard_events_size#119 keyboard_events_size#110 keyboard_events_size#47 keyboard_events_size#27 keyboard_events_size#11 keyboard_events_size#45 keyboard_events_size#13 keyboard_events_size#24 keyboard_events_size#4 keyboard_events_size#100 keyboard_events_size#118 keyboard_events_size#2 keyboard_events_size#1 gfx_init_plane_charset8::bits#2 gfx_init_plane_charset8::bits#0 gfx_init_plane_charset8::bits#1 bitmap_line_ydxi::yd#5 bitmap_line_ydxi::yd#1 bitmap_line_ydxi::yd#0 bitmap_line::yd#1 bitmap_line::yd#10 bitmap_line_xdyi::yd#2 bitmap_line_xdyi::yd#0 bitmap_line_xdyi::yd#1 bitmap_line_ydxd::yd#5 bitmap_line_ydxd::yd#1 bitmap_line_ydxd::yd#0 bitmap_line::yd#0 bitmap_line::yd#3 bitmap_line_xdyd::yd#2 bitmap_line_xdyd::yd#0 bitmap_line_xdyd::yd#1 ]
zp ZP_BYTE:7 [ keyboard_event_scan::keycode#10 keyboard_event_scan::keycode#11 keyboard_event_scan::keycode#14 keyboard_event_scan::keycode#15 keyboard_event_scan::keycode#1 gfx_init_plane_fill::by#4 gfx_init_plane_fill::by#1 gfx_init_plane_charset8::cr#6 gfx_init_plane_charset8::cr#1 bitmap_line_ydxi::xd#2 bitmap_line_ydxi::xd#1 bitmap_line_ydxi::xd#0 bitmap_line::xd#1 bitmap_line::xd#0 bitmap_line_xdyi::xd#5 bitmap_line_xdyi::xd#0 bitmap_line_xdyi::xd#1 bitmap_line_ydxd::xd#2 bitmap_line_ydxd::xd#1 bitmap_line_ydxd::xd#0 bitmap_line_xdyd::xd#5 bitmap_line_xdyd::xd#0 bitmap_line_xdyd::xd#1 keyboard_event_pressed::row_bits#0 gfx_init_screen3::$1 gfx_init_screen2::col2#0 gfx_init_screen0::$1 ]
zp ZP_BYTE:8 [ keyboard_events_size#18 keyboard_events_size#119 keyboard_events_size#110 keyboard_events_size#47 keyboard_events_size#27 keyboard_events_size#24 keyboard_events_size#4 keyboard_events_size#100 keyboard_events_size#118 keyboard_events_size#2 keyboard_events_size#1 gfx_init_plane_charset8::bits#2 gfx_init_plane_charset8::bits#0 gfx_init_plane_charset8::bits#1 bitmap_line_ydxi::yd#5 bitmap_line_ydxi::yd#1 bitmap_line_ydxi::yd#0 bitmap_line::yd#1 bitmap_line::yd#10 bitmap_line_xdyi::yd#2 bitmap_line_xdyi::yd#0 bitmap_line_xdyi::yd#1 bitmap_line_ydxd::yd#5 bitmap_line_ydxd::yd#1 bitmap_line_ydxd::yd#0 bitmap_line::yd#0 bitmap_line::yd#3 bitmap_line_xdyd::yd#2 bitmap_line_xdyd::yd#0 bitmap_line_xdyd::yd#1 ]
reg byte x [ keyboard_modifiers#21 keyboard_modifiers#20 keyboard_modifiers#4 keyboard_modifiers#19 keyboard_modifiers#3 keyboard_modifiers#18 keyboard_modifiers#5 ]
reg byte a [ get_vic_screen::idx#2 get_vic_screen::idx#0 get_vic_screen::idx#1 ]
reg byte a [ get_plane::idx#10 get_plane::idx#1 get_plane::idx#0 ]
zp ZP_DWORD:9 [ get_plane::return#1 get_plane::return#16 get_plane::return#17 gfx_mode::$31 gfx_mode::plane_a#0 gfx_mode::$45 gfx_mode::plane_b#0 gfx_init_plane_fill::plane_addr#3 ]
reg byte x [ form_mode::i#2 form_mode::i#1 ]
zp ZP_BYTE:13 [ form_cursor_count#21 form_cursor_count#1 form_cursor_count#13 form_cursor_count#16 form_cursor_count#15 form_cursor_count#5 gfx_init_plane_charset8::col#2 gfx_init_plane_charset8::col#5 gfx_init_plane_charset8::col#6 gfx_init_plane_charset8::col#1 bitmap_line_ydxi::y1#6 bitmap_line_ydxi::y1#1 bitmap_line_ydxi::y1#0 bitmap_line::y0#0 bitmap_line_xdyi::y#3 bitmap_line_xdyi::y#5 bitmap_line_xdyi::y#0 bitmap_line_xdyi::y#1 bitmap_line_xdyi::y#6 bitmap_line_xdyi::y#2 bitmap_line_ydxd::y1#6 bitmap_line_ydxd::y1#1 bitmap_line_ydxd::y1#0 bitmap_line_xdyd::y#3 bitmap_line_xdyd::y#5 bitmap_line_xdyd::y#0 bitmap_line_xdyd::y#1 bitmap_line_xdyd::y#6 bitmap_line_xdyd::y#2 ]
zp ZP_BYTE:14 [ form_field_idx#28 form_field_idx#1 form_field_idx#14 form_field_idx#18 form_field_idx#32 form_field_idx#44 form_field_idx#45 bitmap_line_ydxi::y#3 bitmap_line_ydxi::y#6 bitmap_line_ydxi::y#1 bitmap_line_ydxi::y#0 bitmap_line_ydxi::y#2 bitmap_line_xdyi::e#3 bitmap_line_xdyi::e#0 bitmap_line_xdyi::e#6 bitmap_line_xdyi::e#2 bitmap_line_xdyi::e#1 bitmap_line_ydxd::y#2 bitmap_line_ydxd::y#7 bitmap_line_ydxd::y#1 bitmap_line_ydxd::y#0 bitmap_line_ydxd::y#3 bitmap_line_xdyd::e#3 bitmap_line_xdyd::e#0 bitmap_line_xdyd::e#6 bitmap_line_xdyd::e#2 bitmap_line_xdyd::e#1 ]
zp ZP_BYTE:13 [ form_cursor_count#21 form_cursor_count#1 form_cursor_count#16 form_cursor_count#15 form_cursor_count#5 gfx_init_plane_charset8::col#2 gfx_init_plane_charset8::col#5 gfx_init_plane_charset8::col#6 gfx_init_plane_charset8::col#1 bitmap_line_ydxi::y1#6 bitmap_line_ydxi::y1#1 bitmap_line_ydxi::y1#0 bitmap_line::y0#0 bitmap_line_xdyi::y#3 bitmap_line_xdyi::y#5 bitmap_line_xdyi::y#0 bitmap_line_xdyi::y#1 bitmap_line_xdyi::y#6 bitmap_line_xdyi::y#2 bitmap_line_ydxd::y1#6 bitmap_line_ydxd::y1#1 bitmap_line_ydxd::y1#0 bitmap_line_xdyd::y#3 bitmap_line_xdyd::y#5 bitmap_line_xdyd::y#0 bitmap_line_xdyd::y#1 bitmap_line_xdyd::y#6 bitmap_line_xdyd::y#2 ]
zp ZP_BYTE:14 [ form_field_idx#28 form_field_idx#1 form_field_idx#18 form_field_idx#32 form_field_idx#44 form_field_idx#45 bitmap_line_ydxi::y#3 bitmap_line_ydxi::y#6 bitmap_line_ydxi::y#1 bitmap_line_ydxi::y#0 bitmap_line_ydxi::y#2 bitmap_line_xdyi::e#3 bitmap_line_xdyi::e#0 bitmap_line_xdyi::e#6 bitmap_line_xdyi::e#2 bitmap_line_xdyi::e#1 bitmap_line_ydxd::y#2 bitmap_line_ydxd::y#7 bitmap_line_ydxd::y#1 bitmap_line_ydxd::y#0 bitmap_line_ydxd::y#3 bitmap_line_xdyd::e#3 bitmap_line_xdyd::e#0 bitmap_line_xdyd::e#6 bitmap_line_xdyd::e#2 bitmap_line_xdyd::e#1 ]
zp ZP_BYTE:15 [ form_mode::preset_current#6 form_mode::preset_current#0 form_mode::preset_current#1 bitmap_line_ydxi::e#3 bitmap_line_ydxi::e#0 bitmap_line_ydxi::e#6 bitmap_line_ydxi::e#2 bitmap_line_ydxi::e#1 bitmap_line_xdyi::x1#6 bitmap_line_xdyi::x1#0 bitmap_line_xdyi::x1#1 bitmap_line::x0#0 bitmap_line_ydxd::e#3 bitmap_line_ydxd::e#0 bitmap_line_ydxd::e#6 bitmap_line_ydxd::e#2 bitmap_line_ydxd::e#1 bitmap_line_xdyd::$6 ]
reg byte a [ render_preset_name::idx#10 render_preset_name::idx#0 render_preset_name::idx#1 ]
reg byte x [ form_render_values::idx#2 form_render_values::idx#1 ]
@ -1495,7 +1485,6 @@ reg byte a [ keyboard_event_scan::$24 ]
reg byte a [ keyboard_event_pressed::return#3 ]
reg byte a [ keyboard_event_scan::$28 ]
reg byte a [ keyboard_event_pressed::$0 ]
reg byte y [ keyboard_event_pressed::row_bits#0 ]
reg byte a [ keyboard_event_pressed::$1 ]
reg byte a [ keyboard_event_pressed::return#10 ]
reg byte a [ keyboard_matrix_read::return#0 ]

@ -76,7 +76,7 @@
.const KEY_2 = $3b
.const KEY_SPACE = $3c
.label print_char_cursor = 5
.label dtv_control = 2
.label dtv_control = 4
.label print_line_cursor = $d
jsr main
main: {
@ -87,8 +87,6 @@ main: {
sta PROCPORT
lda #DTV_FEATURE_ENABLE
sta DTV_FEATURE
lda #0
sta dtv_control
b2:
jsr menu
jmp b2
@ -96,7 +94,7 @@ main: {
menu: {
.label SCREEN = $8000
.label CHARSET = $9800
.label c = 3
.label c = 2
lda #($ffffffff&CHARSET)/$10000
sta DTV_GRAPHICS_VIC_BANK
lda #DTV_COLOR_BANK_DEFAULT/$400
@ -145,16 +143,14 @@ menu: {
jsr print_set_screen
jsr print_cls
jsr print_str_lines
jmp b4
breturn:
rts
b4:
ldy #KEY_1
jsr keyboard_key_pressed
cmp #0
beq b6
jsr mode_stdchar
jmp breturn
breturn:
rts
b6:
ldy #KEY_2
jsr keyboard_key_pressed
@ -239,8 +235,8 @@ mode_8bppchunkybmm: {
.const PLANEB = $20000
.label _23 = $d
.label gfxb = 5
.label x = 3
.label y = 2
.label x = 2
.label y = 4
lda #DTV_HIGHCOLOR|DTV_LINEAR|DTV_CHUNKY|DTV_COLORRAM_OFF
sta DTV_CONTROL
lda #VIC_ECM|VIC_DEN|VIC_RSEL|3
@ -330,9 +326,6 @@ mode_8bppchunkybmm: {
rts
}
mode_ctrl: {
jmp b4
breturn:
rts
b4:
lda RASTER
cmp #$ff
@ -341,7 +334,7 @@ mode_ctrl: {
jsr keyboard_key_pressed
cmp #0
beq b7
jmp breturn
rts
b7:
ldx dtv_control
ldy #KEY_L
@ -439,14 +432,14 @@ mode_8bpppixelcell: {
.label PLANEA = $3c00
.label PLANEB = $4000
.label _14 = 7
.label gfxa = 3
.label ay = 2
.label gfxa = 2
.label ay = 4
.label bits = 8
.label chargen = 3
.label chargen = 2
.label gfxb = 5
.label col = 9
.label cr = 7
.label ch = 2
.label ch = 4
lda #DTV_HIGHCOLOR|DTV_LINEAR|DTV_CHUNKY
sta DTV_CONTROL
lda #VIC_ECM|VIC_DEN|VIC_RSEL|3
@ -577,12 +570,12 @@ mode_sixsfred: {
.label PLANEA = $4000
.label PLANEB = $6000
.label COLORS = $8000
.label col = 3
.label cy = 2
.label gfxa = 3
.label ay = 2
.label gfxb = 3
.label by = 2
.label col = 2
.label cy = 4
.label gfxa = 2
.label ay = 4
.label gfxb = 2
.label by = 4
lda #DTV_HIGHCOLOR|DTV_LINEAR
sta DTV_CONTROL
lda #VIC_ECM|VIC_BMM|VIC_DEN|VIC_RSEL|3
@ -711,12 +704,12 @@ mode_twoplanebitmap: {
.label PLANEB = $6000
.label COLORS = $8000
.label _16 = 7
.label col = 3
.label cy = 2
.label gfxa = 3
.label ay = 2
.label gfxb = 3
.label by = 2
.label col = 2
.label cy = 4
.label gfxa = 2
.label ay = 4
.label gfxb = 2
.label by = 4
lda #DTV_HIGHCOLOR|DTV_LINEAR
sta DTV_CONTROL
lda #VIC_ECM|VIC_BMM|VIC_DEN|VIC_RSEL|3
@ -864,12 +857,12 @@ mode_sixsfred2: {
.label PLANEB = $6000
.label COLORS = $8000
.label _15 = 7
.label col = 3
.label cy = 2
.label gfxa = 3
.label ay = 2
.label gfxb = 3
.label by = 2
.label col = 2
.label cy = 4
.label gfxa = 2
.label ay = 4
.label gfxb = 2
.label by = 4
lda #DTV_LINEAR
sta DTV_CONTROL
lda #VIC_ECM|VIC_BMM|VIC_DEN|VIC_RSEL|3
@ -1004,9 +997,9 @@ mode_hicolmcchar: {
.label CHARSET = $9000
.label COLORS = $8400
.label _26 = 7
.label col = 3
.label col = 2
.label ch = 5
.label cy = 2
.label cy = 4
lda #($ffffffff&CHARSET)/$10000
sta DTV_GRAPHICS_VIC_BANK
lda #COLORS/$400
@ -1092,9 +1085,9 @@ mode_hicolecmchar: {
.label CHARSET = $9000
.label COLORS = $8400
.label _26 = 7
.label col = 3
.label col = 2
.label ch = 5
.label cy = 2
.label cy = 4
lda #($ffffffff&CHARSET)/$10000
sta DTV_GRAPHICS_VIC_BANK
lda #COLORS/$400
@ -1182,9 +1175,9 @@ mode_hicolstdchar: {
.label CHARSET = $9000
.label COLORS = $8400
.label _25 = 7
.label col = 3
.label col = 2
.label ch = 5
.label cy = 2
.label cy = 4
lda #($ffffffff&CHARSET)/$10000
sta DTV_GRAPHICS_VIC_BANK
lda #COLORS/$400
@ -1265,9 +1258,9 @@ mode_stdbitmap: {
.label BITMAP = $6000
.const lines_cnt = 9
.label col2 = 7
.label ch = 3
.label cy = 2
.label l = 2
.label ch = 2
.label cy = 4
.label l = 4
lda #($ffffffff&BITMAP)/$10000
sta DTV_GRAPHICS_VIC_BANK
lda #0
@ -1487,8 +1480,8 @@ bitmap_line_ydxi: {
rts
}
bitmap_plot: {
.label _0 = 3
.label plotter_x = 3
.label _0 = 2
.label plotter_x = 2
.label plotter_y = 5
lda bitmap_plot_xhi,x
sta plotter_x+1
@ -1612,9 +1605,9 @@ bitmap_line_xdyd: {
rts
}
bitmap_clear: {
.label bitmap = 3
.label y = 2
.label _3 = 3
.label bitmap = 2
.label y = 4
.label _3 = 2
lda bitmap_plot_xlo+0
sta _3
lda bitmap_plot_xhi+0
@ -1641,8 +1634,8 @@ bitmap_clear: {
rts
}
bitmap_init: {
.label _6 = 2
.label yoffs = 3
.label _6 = 4
.label yoffs = 2
ldy #$80
ldx #0
b1:
@ -1698,9 +1691,9 @@ mode_mcchar: {
.label CHARSET = $9000
.label COLORS = $d800
.label _28 = 7
.label col = 3
.label col = 2
.label ch = 5
.label cy = 2
.label cy = 4
lda #($ffffffff&CHARSET)/$10000
sta DTV_GRAPHICS_VIC_BANK
lda #DTV_COLOR_BANK_DEFAULT/$400
@ -1789,9 +1782,9 @@ mode_ecmchar: {
.label CHARSET = $9000
.label COLORS = $d800
.label _28 = 7
.label col = 3
.label col = 2
.label ch = 5
.label cy = 2
.label cy = 4
lda #($ffffffff&CHARSET)/$10000
sta DTV_GRAPHICS_VIC_BANK
lda #DTV_COLOR_BANK_DEFAULT/$400
@ -1881,9 +1874,9 @@ mode_stdchar: {
.label CHARSET = $9000
.label COLORS = $d800
.label _27 = 7
.label col = 3
.label col = 2
.label ch = 5
.label cy = 2
.label cy = 4
lda #($ffffffff&CHARSET)/$10000
sta DTV_GRAPHICS_VIC_BANK
lda #DTV_COLOR_BANK_DEFAULT/$400
@ -1963,7 +1956,7 @@ mode_stdchar: {
rts
}
print_str_lines: {
.label str = 3
.label str = 2
lda #<menu.SCREEN
sta print_line_cursor
lda #>menu.SCREEN
@ -2027,7 +2020,7 @@ print_ln: {
rts
}
print_cls: {
.label sc = 3
.label sc = 2
lda #<menu.SCREEN
sta sc
lda #>menu.SCREEN

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -154,26 +154,26 @@
(byte) VIC_RSEL
(const byte) VIC_RSEL#0 VIC_RSEL = (byte/signed byte/word/signed word/dword/signed dword) 8
(void()) bitmap_clear()
(word~) bitmap_clear::$3 $3 zp ZP_WORD:3 2.0
(word~) bitmap_clear::$3 $3 zp ZP_WORD:2 2.0
(label) bitmap_clear::@1
(label) bitmap_clear::@2
(label) bitmap_clear::@3
(label) bitmap_clear::@return
(byte*) bitmap_clear::bitmap
(byte*) bitmap_clear::bitmap#1 bitmap zp ZP_WORD:3 420.59999999999997
(byte*) bitmap_clear::bitmap#2 bitmap zp ZP_WORD:3 1552.0
(byte*) bitmap_clear::bitmap#3 bitmap zp ZP_WORD:3 204.0
(byte*~) bitmap_clear::bitmap#5 bitmap zp ZP_WORD:3 4.0
(byte*) bitmap_clear::bitmap#1 bitmap zp ZP_WORD:2 420.59999999999997
(byte*) bitmap_clear::bitmap#2 bitmap zp ZP_WORD:2 1552.0
(byte*) bitmap_clear::bitmap#3 bitmap zp ZP_WORD:2 204.0
(byte*~) bitmap_clear::bitmap#5 bitmap zp ZP_WORD:2 4.0
(byte) bitmap_clear::x
(byte) bitmap_clear::x#1 reg byte x 1501.5
(byte) bitmap_clear::x#2 reg byte x 667.3333333333334
(byte) bitmap_clear::y
(byte) bitmap_clear::y#1 y zp ZP_BYTE:2 151.5
(byte) bitmap_clear::y#4 y zp ZP_BYTE:2 33.666666666666664
(byte) bitmap_clear::y#1 y zp ZP_BYTE:4 151.5
(byte) bitmap_clear::y#4 y zp ZP_BYTE:4 33.666666666666664
(void()) bitmap_init((byte*) bitmap_init::bitmap)
(byte~) bitmap_init::$0 reg byte a 202.0
(byte~) bitmap_init::$10 reg byte a 202.0
(byte~) bitmap_init::$6 $6 zp ZP_BYTE:2 101.0
(byte~) bitmap_init::$6 $6 zp ZP_BYTE:4 101.0
(byte~) bitmap_init::$7 reg byte a 202.0
(byte~) bitmap_init::$8 reg byte a 202.0
(byte~) bitmap_init::$9 reg byte a 202.0
@ -196,9 +196,9 @@
(byte) bitmap_init::y#1 reg byte x 151.5
(byte) bitmap_init::y#2 reg byte x 55.090909090909086
(byte*) bitmap_init::yoffs
(byte*) bitmap_init::yoffs#1 yoffs zp ZP_WORD:3 202.0
(byte*) bitmap_init::yoffs#2 yoffs zp ZP_WORD:3 56.11111111111111
(byte*) bitmap_init::yoffs#4 yoffs zp ZP_WORD:3 101.0
(byte*) bitmap_init::yoffs#1 yoffs zp ZP_WORD:2 202.0
(byte*) bitmap_init::yoffs#2 yoffs zp ZP_WORD:2 56.11111111111111
(byte*) bitmap_init::yoffs#4 yoffs zp ZP_WORD:2 101.0
(void()) bitmap_line((byte) bitmap_line::x0 , (byte) bitmap_line::x1 , (byte) bitmap_line::y0 , (byte) bitmap_line::y1)
(label) bitmap_line::@1
(label) bitmap_line::@10
@ -384,12 +384,12 @@
(byte) bitmap_line_ydxi::yd#1 yd zp ZP_BYTE:8 2.0
(byte) bitmap_line_ydxi::yd#5 yd zp ZP_BYTE:8 143.28571428571428
(void()) bitmap_plot((byte) bitmap_plot::x , (byte) bitmap_plot::y)
(word~) bitmap_plot::$0 $0 zp ZP_WORD:3 1.0
(word~) bitmap_plot::$0 $0 zp ZP_WORD:2 1.0
(byte~) bitmap_plot::$1 reg byte a 4.0
(label) bitmap_plot::@return
(byte*) bitmap_plot::plotter
(word) bitmap_plot::plotter_x
(word) bitmap_plot::plotter_x#0 plotter_x zp ZP_WORD:3 2.0
(word) bitmap_plot::plotter_x#0 plotter_x zp ZP_WORD:2 2.0
(word) bitmap_plot::plotter_y
(word) bitmap_plot::plotter_y#0 plotter_y zp ZP_WORD:5 4.0
(byte) bitmap_plot::x
@ -422,11 +422,9 @@
(byte) dtvSetCpuBankSegment1::cpuBankIdx#1 reg byte a 2002.0
(byte) dtvSetCpuBankSegment1::cpuBankIdx#3 reg byte a 1003.0
(byte) dtv_control
(byte) dtv_control#1 dtv_control zp ZP_BYTE:2 1.2727272727272727
(byte) dtv_control#114 dtv_control zp ZP_BYTE:2 24.19318181818182
(byte) dtv_control#145 dtv_control zp ZP_BYTE:2 2.0
(byte) dtv_control#17 dtv_control zp ZP_BYTE:2 67.33333333333333
(byte) dtv_control#3 dtv_control zp ZP_BYTE:2 45.3333333333333
(byte) dtv_control#114 dtv_control zp ZP_BYTE:4 42.099999999999994
(byte) dtv_control#145 dtv_control zp ZP_BYTE:4 2.0
(byte) dtv_control#17 dtv_control zp ZP_BYTE:4 67.33333333333333
(byte()) keyboard_key_pressed((byte) keyboard_key_pressed::key)
(byte~) keyboard_key_pressed::$2 reg byte a 4.0
(label) keyboard_key_pressed::@2
@ -472,9 +470,7 @@
(byte[8]) keyboard_matrix_row_bitmask
(const byte[8]) keyboard_matrix_row_bitmask#0 keyboard_matrix_row_bitmask = { (byte/word/signed word/dword/signed dword) 254, (byte/word/signed word/dword/signed dword) 253, (byte/word/signed word/dword/signed dword) 251, (byte/word/signed word/dword/signed dword) 247, (byte/word/signed word/dword/signed dword) 239, (byte/word/signed word/dword/signed dword) 223, (byte/word/signed word/dword/signed dword) 191, (byte/signed byte/word/signed word/dword/signed dword) 127 }
(void()) main()
(label) main::@1
(label) main::@2
(label) main::@return
(void()) menu()
(byte~) menu::$29 reg byte a 202.0
(byte~) menu::$33 reg byte a 202.0
@ -502,7 +498,6 @@
(label) menu::@24
(label) menu::@26
(label) menu::@28
(label) menu::@3
(label) menu::@30
(label) menu::@32
(label) menu::@34
@ -536,8 +531,8 @@
(byte*) menu::SCREEN
(const byte*) menu::SCREEN#0 SCREEN = ((byte*))(word/dword/signed dword) 32768
(byte*) menu::c
(byte*) menu::c#1 c zp ZP_WORD:3 151.5
(byte*) menu::c#2 c zp ZP_WORD:3 151.5
(byte*) menu::c#1 c zp ZP_WORD:2 151.5
(byte*) menu::c#2 c zp ZP_WORD:2 151.5
(byte) menu::i
(byte) menu::i#1 reg byte x 151.5
(byte) menu::i#2 reg byte x 202.0
@ -572,11 +567,11 @@
(byte) mode_8bppchunkybmm::i#1 reg byte x 151.5
(byte) mode_8bppchunkybmm::i#2 reg byte x 202.0
(word) mode_8bppchunkybmm::x
(word) mode_8bppchunkybmm::x#1 x zp ZP_WORD:3 1501.5
(word) mode_8bppchunkybmm::x#2 x zp ZP_WORD:3 300.29999999999995
(word) mode_8bppchunkybmm::x#1 x zp ZP_WORD:2 1501.5
(word) mode_8bppchunkybmm::x#2 x zp ZP_WORD:2 300.29999999999995
(byte) mode_8bppchunkybmm::y
(byte) mode_8bppchunkybmm::y#1 y zp ZP_BYTE:2 151.5
(byte) mode_8bppchunkybmm::y#6 y zp ZP_BYTE:2 92.53846153846155
(byte) mode_8bppchunkybmm::y#1 y zp ZP_BYTE:4 151.5
(byte) mode_8bppchunkybmm::y#6 y zp ZP_BYTE:4 92.53846153846155
(void()) mode_8bpppixelcell()
(byte~) mode_8bpppixelcell::$13 reg byte a 2002.0
(byte~) mode_8bpppixelcell::$14 $14 zp ZP_BYTE:7 1001.0
@ -606,8 +601,8 @@
(byte) mode_8bpppixelcell::ax#1 reg byte x 1501.5
(byte) mode_8bpppixelcell::ax#2 reg byte x 429.0
(byte) mode_8bpppixelcell::ay
(byte) mode_8bpppixelcell::ay#1 ay zp ZP_BYTE:2 151.5
(byte) mode_8bpppixelcell::ay#4 ay zp ZP_BYTE:2 120.29999999999998
(byte) mode_8bpppixelcell::ay#1 ay zp ZP_BYTE:4 151.5
(byte) mode_8bpppixelcell::ay#4 ay zp ZP_BYTE:4 120.29999999999998
(byte) mode_8bpppixelcell::bits
(byte) mode_8bpppixelcell::bits#0 bits zp ZP_BYTE:8 1001.0
(byte) mode_8bpppixelcell::bits#1 bits zp ZP_BYTE:8 5000.5
@ -616,12 +611,12 @@
(byte) mode_8bpppixelcell::c#2 reg byte a 20002.0
(byte~) mode_8bpppixelcell::c#3 reg byte a 20002.0
(byte) mode_8bpppixelcell::ch
(byte) mode_8bpppixelcell::ch#1 ch zp ZP_BYTE:2 151.5
(byte) mode_8bpppixelcell::ch#8 ch zp ZP_BYTE:2 11.882352941176471
(byte) mode_8bpppixelcell::ch#1 ch zp ZP_BYTE:4 151.5
(byte) mode_8bpppixelcell::ch#8 ch zp ZP_BYTE:4 11.882352941176471
(byte*) mode_8bpppixelcell::chargen
(byte*) mode_8bpppixelcell::chargen#1 chargen zp ZP_WORD:3 131.4375
(byte*) mode_8bpppixelcell::chargen#2 chargen zp ZP_WORD:3 1552.0
(byte*) mode_8bpppixelcell::chargen#4 chargen zp ZP_WORD:3 202.0
(byte*) mode_8bpppixelcell::chargen#1 chargen zp ZP_WORD:2 131.4375
(byte*) mode_8bpppixelcell::chargen#2 chargen zp ZP_WORD:2 1552.0
(byte*) mode_8bpppixelcell::chargen#4 chargen zp ZP_WORD:2 202.0
(byte) mode_8bpppixelcell::col
(byte) mode_8bpppixelcell::col#1 col zp ZP_BYTE:9 3014.857142857143
(byte) mode_8bpppixelcell::col#2 col zp ZP_BYTE:9 3875.5
@ -634,9 +629,9 @@
(byte) mode_8bpppixelcell::cr#1 cr zp ZP_BYTE:7 1501.5
(byte) mode_8bpppixelcell::cr#6 cr zp ZP_BYTE:7 143.0
(byte*) mode_8bpppixelcell::gfxa
(byte*) mode_8bpppixelcell::gfxa#1 gfxa zp ZP_WORD:3 420.59999999999997
(byte*) mode_8bpppixelcell::gfxa#2 gfxa zp ZP_WORD:3 517.3333333333334
(byte*) mode_8bpppixelcell::gfxa#3 gfxa zp ZP_WORD:3 202.0
(byte*) mode_8bpppixelcell::gfxa#1 gfxa zp ZP_WORD:2 420.59999999999997
(byte*) mode_8bpppixelcell::gfxa#2 gfxa zp ZP_WORD:2 517.3333333333334
(byte*) mode_8bpppixelcell::gfxa#3 gfxa zp ZP_WORD:2 202.0
(byte*) mode_8bpppixelcell::gfxb
(byte*) mode_8bpppixelcell::gfxb#1 gfxb zp ZP_WORD:5 2344.8888888888887
(byte*) mode_8bpppixelcell::gfxb#2 gfxb zp ZP_WORD:5 5167.333333333333
@ -722,15 +717,15 @@
(byte*) mode_ecmchar::ch#2 ch zp ZP_WORD:5 310.4
(byte*) mode_ecmchar::ch#3 ch zp ZP_WORD:5 202.0
(byte*) mode_ecmchar::col
(byte*) mode_ecmchar::col#1 col zp ZP_WORD:3 191.1818181818182
(byte*) mode_ecmchar::col#2 col zp ZP_WORD:3 776.0
(byte*) mode_ecmchar::col#3 col zp ZP_WORD:3 202.0
(byte*) mode_ecmchar::col#1 col zp ZP_WORD:2 191.1818181818182
(byte*) mode_ecmchar::col#2 col zp ZP_WORD:2 776.0
(byte*) mode_ecmchar::col#3 col zp ZP_WORD:2 202.0
(byte) mode_ecmchar::cx
(byte) mode_ecmchar::cx#1 reg byte x 1501.5
(byte) mode_ecmchar::cx#2 reg byte x 364.0
(byte) mode_ecmchar::cy
(byte) mode_ecmchar::cy#1 cy zp ZP_BYTE:2 151.5
(byte) mode_ecmchar::cy#4 cy zp ZP_BYTE:2 157.42857142857144
(byte) mode_ecmchar::cy#1 cy zp ZP_BYTE:4 151.5
(byte) mode_ecmchar::cy#4 cy zp ZP_BYTE:4 157.42857142857144
(byte) mode_ecmchar::i
(byte) mode_ecmchar::i#1 reg byte x 151.5
(byte) mode_ecmchar::i#2 reg byte x 202.0
@ -756,15 +751,15 @@
(byte*) mode_hicolecmchar::ch#2 ch zp ZP_WORD:5 388.0
(byte*) mode_hicolecmchar::ch#3 ch zp ZP_WORD:5 202.0
(byte*) mode_hicolecmchar::col
(byte*) mode_hicolecmchar::col#1 col zp ZP_WORD:3 300.42857142857144
(byte*) mode_hicolecmchar::col#2 col zp ZP_WORD:3 517.3333333333334
(byte*) mode_hicolecmchar::col#3 col zp ZP_WORD:3 202.0
(byte*) mode_hicolecmchar::col#1 col zp ZP_WORD:2 300.42857142857144
(byte*) mode_hicolecmchar::col#2 col zp ZP_WORD:2 517.3333333333334
(byte*) mode_hicolecmchar::col#3 col zp ZP_WORD:2 202.0
(byte) mode_hicolecmchar::cx
(byte) mode_hicolecmchar::cx#1 reg byte x 1501.5
(byte) mode_hicolecmchar::cx#2 reg byte x 333.6666666666667
(byte) mode_hicolecmchar::cy
(byte) mode_hicolecmchar::cy#1 cy zp ZP_BYTE:2 151.5
(byte) mode_hicolecmchar::cy#4 cy zp ZP_BYTE:2 100.25000000000001
(byte) mode_hicolecmchar::cy#1 cy zp ZP_BYTE:4 151.5
(byte) mode_hicolecmchar::cy#4 cy zp ZP_BYTE:4 100.25000000000001
(byte) mode_hicolecmchar::i
(byte) mode_hicolecmchar::i#1 reg byte x 151.5
(byte) mode_hicolecmchar::i#2 reg byte x 202.0
@ -792,15 +787,15 @@
(byte*) mode_hicolmcchar::ch#2 ch zp ZP_WORD:5 388.0
(byte*) mode_hicolmcchar::ch#3 ch zp ZP_WORD:5 202.0
(byte*) mode_hicolmcchar::col
(byte*) mode_hicolmcchar::col#1 col zp ZP_WORD:3 300.42857142857144
(byte*) mode_hicolmcchar::col#2 col zp ZP_WORD:3 517.3333333333334
(byte*) mode_hicolmcchar::col#3 col zp ZP_WORD:3 202.0
(byte*) mode_hicolmcchar::col#1 col zp ZP_WORD:2 300.42857142857144
(byte*) mode_hicolmcchar::col#2 col zp ZP_WORD:2 517.3333333333334
(byte*) mode_hicolmcchar::col#3 col zp ZP_WORD:2 202.0
(byte) mode_hicolmcchar::cx
(byte) mode_hicolmcchar::cx#1 reg byte x 1501.5
(byte) mode_hicolmcchar::cx#2 reg byte x 333.6666666666667
(byte) mode_hicolmcchar::cy
(byte) mode_hicolmcchar::cy#1 cy zp ZP_BYTE:2 151.5
(byte) mode_hicolmcchar::cy#4 cy zp ZP_BYTE:2 100.25000000000001
(byte) mode_hicolmcchar::cy#1 cy zp ZP_BYTE:4 151.5
(byte) mode_hicolmcchar::cy#4 cy zp ZP_BYTE:4 100.25000000000001
(byte) mode_hicolmcchar::i
(byte) mode_hicolmcchar::i#1 reg byte x 151.5
(byte) mode_hicolmcchar::i#2 reg byte x 202.0
@ -828,15 +823,15 @@
(byte*) mode_hicolstdchar::ch#2 ch zp ZP_WORD:5 388.0
(byte*) mode_hicolstdchar::ch#3 ch zp ZP_WORD:5 202.0
(byte*) mode_hicolstdchar::col
(byte*) mode_hicolstdchar::col#1 col zp ZP_WORD:3 300.42857142857144
(byte*) mode_hicolstdchar::col#2 col zp ZP_WORD:3 517.3333333333334
(byte*) mode_hicolstdchar::col#3 col zp ZP_WORD:3 202.0
(byte*) mode_hicolstdchar::col#1 col zp ZP_WORD:2 300.42857142857144
(byte*) mode_hicolstdchar::col#2 col zp ZP_WORD:2 517.3333333333334
(byte*) mode_hicolstdchar::col#3 col zp ZP_WORD:2 202.0
(byte) mode_hicolstdchar::cx
(byte) mode_hicolstdchar::cx#1 reg byte x 1501.5
(byte) mode_hicolstdchar::cx#2 reg byte x 333.6666666666667
(byte) mode_hicolstdchar::cy
(byte) mode_hicolstdchar::cy#1 cy zp ZP_BYTE:2 151.5
(byte) mode_hicolstdchar::cy#4 cy zp ZP_BYTE:2 100.25000000000001
(byte) mode_hicolstdchar::cy#1 cy zp ZP_BYTE:4 151.5
(byte) mode_hicolstdchar::cy#4 cy zp ZP_BYTE:4 100.25000000000001
(byte) mode_hicolstdchar::i
(byte) mode_hicolstdchar::i#1 reg byte x 151.5
(byte) mode_hicolstdchar::i#2 reg byte x 202.0
@ -867,15 +862,15 @@
(byte*) mode_mcchar::ch#2 ch zp ZP_WORD:5 310.4
(byte*) mode_mcchar::ch#3 ch zp ZP_WORD:5 202.0
(byte*) mode_mcchar::col
(byte*) mode_mcchar::col#1 col zp ZP_WORD:3 191.1818181818182
(byte*) mode_mcchar::col#2 col zp ZP_WORD:3 776.0
(byte*) mode_mcchar::col#3 col zp ZP_WORD:3 202.0
(byte*) mode_mcchar::col#1 col zp ZP_WORD:2 191.1818181818182
(byte*) mode_mcchar::col#2 col zp ZP_WORD:2 776.0
(byte*) mode_mcchar::col#3 col zp ZP_WORD:2 202.0
(byte) mode_mcchar::cx
(byte) mode_mcchar::cx#1 reg byte x 1501.5
(byte) mode_mcchar::cx#2 reg byte x 364.0
(byte) mode_mcchar::cy
(byte) mode_mcchar::cy#1 cy zp ZP_BYTE:2 151.5
(byte) mode_mcchar::cy#4 cy zp ZP_BYTE:2 157.42857142857144
(byte) mode_mcchar::cy#1 cy zp ZP_BYTE:4 151.5
(byte) mode_mcchar::cy#4 cy zp ZP_BYTE:4 157.42857142857144
(byte) mode_mcchar::i
(byte) mode_mcchar::i#1 reg byte x 151.5
(byte) mode_mcchar::i#2 reg byte x 202.0
@ -906,32 +901,32 @@
(byte) mode_sixsfred::ax#1 reg byte x 1501.5
(byte) mode_sixsfred::ax#2 reg byte x 400.4
(byte) mode_sixsfred::ay
(byte) mode_sixsfred::ay#1 ay zp ZP_BYTE:2 151.5
(byte) mode_sixsfred::ay#4 ay zp ZP_BYTE:2 150.375
(byte) mode_sixsfred::ay#1 ay zp ZP_BYTE:4 151.5
(byte) mode_sixsfred::ay#4 ay zp ZP_BYTE:4 150.375
(byte) mode_sixsfred::bx
(byte) mode_sixsfred::bx#1 reg byte x 1501.5
(byte) mode_sixsfred::bx#2 reg byte x 667.3333333333334
(byte) mode_sixsfred::by
(byte) mode_sixsfred::by#1 by zp ZP_BYTE:2 151.5
(byte) mode_sixsfred::by#4 by zp ZP_BYTE:2 33.666666666666664
(byte) mode_sixsfred::by#1 by zp ZP_BYTE:4 151.5
(byte) mode_sixsfred::by#4 by zp ZP_BYTE:4 33.666666666666664
(byte*) mode_sixsfred::col
(byte*) mode_sixsfred::col#1 col zp ZP_WORD:3 420.59999999999997
(byte*) mode_sixsfred::col#2 col zp ZP_WORD:3 776.0
(byte*) mode_sixsfred::col#3 col zp ZP_WORD:3 202.0
(byte*) mode_sixsfred::col#1 col zp ZP_WORD:2 420.59999999999997
(byte*) mode_sixsfred::col#2 col zp ZP_WORD:2 776.0
(byte*) mode_sixsfred::col#3 col zp ZP_WORD:2 202.0
(byte) mode_sixsfred::cx
(byte) mode_sixsfred::cx#1 reg byte x 1501.5
(byte) mode_sixsfred::cx#2 reg byte x 600.5999999999999
(byte) mode_sixsfred::cy
(byte) mode_sixsfred::cy#1 cy zp ZP_BYTE:2 151.5
(byte) mode_sixsfred::cy#4 cy zp ZP_BYTE:2 150.375
(byte) mode_sixsfred::cy#1 cy zp ZP_BYTE:4 151.5
(byte) mode_sixsfred::cy#4 cy zp ZP_BYTE:4 150.375
(byte*) mode_sixsfred::gfxa
(byte*) mode_sixsfred::gfxa#1 gfxa zp ZP_WORD:3 420.59999999999997
(byte*) mode_sixsfred::gfxa#2 gfxa zp ZP_WORD:3 776.0
(byte*) mode_sixsfred::gfxa#3 gfxa zp ZP_WORD:3 202.0
(byte*) mode_sixsfred::gfxa#1 gfxa zp ZP_WORD:2 420.59999999999997
(byte*) mode_sixsfred::gfxa#2 gfxa zp ZP_WORD:2 776.0
(byte*) mode_sixsfred::gfxa#3 gfxa zp ZP_WORD:2 202.0
(byte*) mode_sixsfred::gfxb
(byte*) mode_sixsfred::gfxb#1 gfxb zp ZP_WORD:3 420.59999999999997
(byte*) mode_sixsfred::gfxb#2 gfxb zp ZP_WORD:3 1552.0
(byte*) mode_sixsfred::gfxb#3 gfxb zp ZP_WORD:3 202.0
(byte*) mode_sixsfred::gfxb#1 gfxb zp ZP_WORD:2 420.59999999999997
(byte*) mode_sixsfred::gfxb#2 gfxb zp ZP_WORD:2 1552.0
(byte*) mode_sixsfred::gfxb#3 gfxb zp ZP_WORD:2 202.0
(byte) mode_sixsfred::i
(byte) mode_sixsfred::i#1 reg byte x 151.5
(byte) mode_sixsfred::i#2 reg byte x 202.0
@ -968,32 +963,32 @@
(byte) mode_sixsfred2::ax#1 reg byte x 1501.5
(byte) mode_sixsfred2::ax#2 reg byte x 400.4
(byte) mode_sixsfred2::ay
(byte) mode_sixsfred2::ay#1 ay zp ZP_BYTE:2 151.5
(byte) mode_sixsfred2::ay#4 ay zp ZP_BYTE:2 150.375
(byte) mode_sixsfred2::ay#1 ay zp ZP_BYTE:4 151.5
(byte) mode_sixsfred2::ay#4 ay zp ZP_BYTE:4 150.375
(byte) mode_sixsfred2::bx
(byte) mode_sixsfred2::bx#1 reg byte x 1501.5
(byte) mode_sixsfred2::bx#2 reg byte x 667.3333333333334
(byte) mode_sixsfred2::by
(byte) mode_sixsfred2::by#1 by zp ZP_BYTE:2 151.5
(byte) mode_sixsfred2::by#4 by zp ZP_BYTE:2 33.666666666666664
(byte) mode_sixsfred2::by#1 by zp ZP_BYTE:4 151.5
(byte) mode_sixsfred2::by#4 by zp ZP_BYTE:4 33.666666666666664
(byte*) mode_sixsfred2::col
(byte*) mode_sixsfred2::col#1 col zp ZP_WORD:3 420.59999999999997
(byte*) mode_sixsfred2::col#2 col zp ZP_WORD:3 517.3333333333334
(byte*) mode_sixsfred2::col#3 col zp ZP_WORD:3 202.0
(byte*) mode_sixsfred2::col#1 col zp ZP_WORD:2 420.59999999999997
(byte*) mode_sixsfred2::col#2 col zp ZP_WORD:2 517.3333333333334
(byte*) mode_sixsfred2::col#3 col zp ZP_WORD:2 202.0
(byte) mode_sixsfred2::cx
(byte) mode_sixsfred2::cx#1 reg byte x 1501.5
(byte) mode_sixsfred2::cx#2 reg byte x 429.0
(byte) mode_sixsfred2::cy
(byte) mode_sixsfred2::cy#1 cy zp ZP_BYTE:2 151.5
(byte) mode_sixsfred2::cy#4 cy zp ZP_BYTE:2 120.29999999999998
(byte) mode_sixsfred2::cy#1 cy zp ZP_BYTE:4 151.5
(byte) mode_sixsfred2::cy#4 cy zp ZP_BYTE:4 120.29999999999998
(byte*) mode_sixsfred2::gfxa
(byte*) mode_sixsfred2::gfxa#1 gfxa zp ZP_WORD:3 420.59999999999997
(byte*) mode_sixsfred2::gfxa#2 gfxa zp ZP_WORD:3 776.0
(byte*) mode_sixsfred2::gfxa#3 gfxa zp ZP_WORD:3 202.0
(byte*) mode_sixsfred2::gfxa#1 gfxa zp ZP_WORD:2 420.59999999999997
(byte*) mode_sixsfred2::gfxa#2 gfxa zp ZP_WORD:2 776.0
(byte*) mode_sixsfred2::gfxa#3 gfxa zp ZP_WORD:2 202.0
(byte*) mode_sixsfred2::gfxb
(byte*) mode_sixsfred2::gfxb#1 gfxb zp ZP_WORD:3 420.59999999999997
(byte*) mode_sixsfred2::gfxb#2 gfxb zp ZP_WORD:3 1552.0
(byte*) mode_sixsfred2::gfxb#3 gfxb zp ZP_WORD:3 202.0
(byte*) mode_sixsfred2::gfxb#1 gfxb zp ZP_WORD:2 420.59999999999997
(byte*) mode_sixsfred2::gfxb#2 gfxb zp ZP_WORD:2 1552.0
(byte*) mode_sixsfred2::gfxb#3 gfxb zp ZP_WORD:2 202.0
(byte) mode_sixsfred2::i
(byte) mode_sixsfred2::i#1 reg byte x 151.5
(byte) mode_sixsfred2::i#2 reg byte x 202.0
@ -1021,9 +1016,9 @@
(byte*) mode_stdbitmap::SCREEN
(const byte*) mode_stdbitmap::SCREEN#0 SCREEN = ((byte*))(word/signed word/dword/signed dword) 16384
(byte*) mode_stdbitmap::ch
(byte*) mode_stdbitmap::ch#1 ch zp ZP_WORD:3 420.59999999999997
(byte*) mode_stdbitmap::ch#2 ch zp ZP_WORD:3 443.42857142857144
(byte*) mode_stdbitmap::ch#3 ch zp ZP_WORD:3 202.0
(byte*) mode_stdbitmap::ch#1 ch zp ZP_WORD:2 420.59999999999997
(byte*) mode_stdbitmap::ch#2 ch zp ZP_WORD:2 443.42857142857144
(byte*) mode_stdbitmap::ch#3 ch zp ZP_WORD:2 202.0
(byte) mode_stdbitmap::col
(byte) mode_stdbitmap::col#0 reg byte y 1501.5
(byte) mode_stdbitmap::col2
@ -1032,14 +1027,14 @@
(byte) mode_stdbitmap::cx#1 reg byte x 1501.5
(byte) mode_stdbitmap::cx#2 reg byte x 375.375
(byte) mode_stdbitmap::cy
(byte) mode_stdbitmap::cy#1 cy zp ZP_BYTE:2 151.5
(byte) mode_stdbitmap::cy#4 cy zp ZP_BYTE:2 109.36363636363637
(byte) mode_stdbitmap::cy#1 cy zp ZP_BYTE:4 151.5
(byte) mode_stdbitmap::cy#4 cy zp ZP_BYTE:4 109.36363636363637
(byte) mode_stdbitmap::i
(byte) mode_stdbitmap::i#1 reg byte x 151.5
(byte) mode_stdbitmap::i#2 reg byte x 202.0
(byte) mode_stdbitmap::l
(byte) mode_stdbitmap::l#1 l zp ZP_BYTE:2 151.5
(byte) mode_stdbitmap::l#2 l zp ZP_BYTE:2 100.99999999999999
(byte) mode_stdbitmap::l#1 l zp ZP_BYTE:4 151.5
(byte) mode_stdbitmap::l#2 l zp ZP_BYTE:4 100.99999999999999
(byte) mode_stdbitmap::lines_cnt
(const byte) mode_stdbitmap::lines_cnt#0 lines_cnt = (byte/signed byte/word/signed word/dword/signed dword) 9
(byte[]) mode_stdbitmap::lines_x
@ -1071,15 +1066,15 @@
(byte*) mode_stdchar::ch#2 ch zp ZP_WORD:5 310.4
(byte*) mode_stdchar::ch#3 ch zp ZP_WORD:5 202.0
(byte*) mode_stdchar::col
(byte*) mode_stdchar::col#1 col zp ZP_WORD:3 191.1818181818182
(byte*) mode_stdchar::col#2 col zp ZP_WORD:3 776.0
(byte*) mode_stdchar::col#3 col zp ZP_WORD:3 202.0
(byte*) mode_stdchar::col#1 col zp ZP_WORD:2 191.1818181818182
(byte*) mode_stdchar::col#2 col zp ZP_WORD:2 776.0
(byte*) mode_stdchar::col#3 col zp ZP_WORD:2 202.0
(byte) mode_stdchar::cx
(byte) mode_stdchar::cx#1 reg byte x 1501.5
(byte) mode_stdchar::cx#2 reg byte x 364.0
(byte) mode_stdchar::cy
(byte) mode_stdchar::cy#1 cy zp ZP_BYTE:2 151.5
(byte) mode_stdchar::cy#4 cy zp ZP_BYTE:2 157.42857142857144
(byte) mode_stdchar::cy#1 cy zp ZP_BYTE:4 151.5
(byte) mode_stdchar::cy#4 cy zp ZP_BYTE:4 157.42857142857144
(byte) mode_stdchar::i
(byte) mode_stdchar::i#1 reg byte x 151.5
(byte) mode_stdchar::i#2 reg byte x 202.0
@ -1115,34 +1110,34 @@
(byte) mode_twoplanebitmap::ax#1 reg byte x 1501.5
(byte) mode_twoplanebitmap::ax#2 reg byte x 250.25
(byte) mode_twoplanebitmap::ay
(byte) mode_twoplanebitmap::ay#1 ay zp ZP_BYTE:2 151.5
(byte) mode_twoplanebitmap::ay#4 ay zp ZP_BYTE:2 109.36363636363637
(byte) mode_twoplanebitmap::ay#1 ay zp ZP_BYTE:4 151.5
(byte) mode_twoplanebitmap::ay#4 ay zp ZP_BYTE:4 109.36363636363637
(byte) mode_twoplanebitmap::bx
(byte) mode_twoplanebitmap::bx#1 reg byte x 1501.5
(byte) mode_twoplanebitmap::bx#2 reg byte x 667.3333333333334
(byte) mode_twoplanebitmap::by
(byte) mode_twoplanebitmap::by#1 by zp ZP_BYTE:2 151.5
(byte) mode_twoplanebitmap::by#4 by zp ZP_BYTE:2 33.666666666666664
(byte) mode_twoplanebitmap::by#1 by zp ZP_BYTE:4 151.5
(byte) mode_twoplanebitmap::by#4 by zp ZP_BYTE:4 33.666666666666664
(byte*) mode_twoplanebitmap::col
(byte*) mode_twoplanebitmap::col#1 col zp ZP_WORD:3 420.59999999999997
(byte*) mode_twoplanebitmap::col#2 col zp ZP_WORD:3 517.3333333333334
(byte*) mode_twoplanebitmap::col#3 col zp ZP_WORD:3 202.0
(byte*) mode_twoplanebitmap::col#1 col zp ZP_WORD:2 420.59999999999997
(byte*) mode_twoplanebitmap::col#2 col zp ZP_WORD:2 517.3333333333334
(byte*) mode_twoplanebitmap::col#3 col zp ZP_WORD:2 202.0
(byte) mode_twoplanebitmap::cx
(byte) mode_twoplanebitmap::cx#1 reg byte x 1501.5
(byte) mode_twoplanebitmap::cx#2 reg byte x 429.0
(byte) mode_twoplanebitmap::cy
(byte) mode_twoplanebitmap::cy#1 cy zp ZP_BYTE:2 151.5
(byte) mode_twoplanebitmap::cy#4 cy zp ZP_BYTE:2 120.29999999999998
(byte) mode_twoplanebitmap::cy#1 cy zp ZP_BYTE:4 151.5
(byte) mode_twoplanebitmap::cy#4 cy zp ZP_BYTE:4 120.29999999999998
(byte*) mode_twoplanebitmap::gfxa
(byte*) mode_twoplanebitmap::gfxa#1 gfxa zp ZP_WORD:3 2002.0
(byte*) mode_twoplanebitmap::gfxa#2 gfxa zp ZP_WORD:3 2002.0
(byte*) mode_twoplanebitmap::gfxa#3 gfxa zp ZP_WORD:3 1021.2
(byte*) mode_twoplanebitmap::gfxa#6 gfxa zp ZP_WORD:3 202.0
(byte*) mode_twoplanebitmap::gfxa#7 gfxa zp ZP_WORD:3 620.8
(byte*) mode_twoplanebitmap::gfxa#1 gfxa zp ZP_WORD:2 2002.0
(byte*) mode_twoplanebitmap::gfxa#2 gfxa zp ZP_WORD:2 2002.0
(byte*) mode_twoplanebitmap::gfxa#3 gfxa zp ZP_WORD:2 1021.2
(byte*) mode_twoplanebitmap::gfxa#6 gfxa zp ZP_WORD:2 202.0
(byte*) mode_twoplanebitmap::gfxa#7 gfxa zp ZP_WORD:2 620.8
(byte*) mode_twoplanebitmap::gfxb
(byte*) mode_twoplanebitmap::gfxb#1 gfxb zp ZP_WORD:3 420.59999999999997
(byte*) mode_twoplanebitmap::gfxb#2 gfxb zp ZP_WORD:3 1552.0
(byte*) mode_twoplanebitmap::gfxb#3 gfxb zp ZP_WORD:3 202.0
(byte*) mode_twoplanebitmap::gfxb#1 gfxb zp ZP_WORD:2 420.59999999999997
(byte*) mode_twoplanebitmap::gfxb#2 gfxb zp ZP_WORD:2 1552.0
(byte*) mode_twoplanebitmap::gfxb#3 gfxb zp ZP_WORD:2 202.0
(byte) mode_twoplanebitmap::i
(byte) mode_twoplanebitmap::i#1 reg byte x 151.5
(byte) mode_twoplanebitmap::i#2 reg byte x 202.0
@ -1156,8 +1151,8 @@
(label) print_cls::@1
(label) print_cls::@return
(byte*) print_cls::sc
(byte*) print_cls::sc#1 sc zp ZP_WORD:3 151.5
(byte*) print_cls::sc#2 sc zp ZP_WORD:3 151.5
(byte*) print_cls::sc#1 sc zp ZP_WORD:2 151.5
(byte*) print_cls::sc#2 sc zp ZP_WORD:2 151.5
(byte*) print_line_cursor
(byte*) print_line_cursor#17 print_line_cursor zp ZP_WORD:13 8.583333333333332
(byte*) print_line_cursor#18 print_line_cursor zp ZP_WORD:13 2004.0
@ -1179,14 +1174,14 @@
(byte) print_str_lines::ch
(byte) print_str_lines::ch#0 reg byte a 667.3333333333334
(byte*) print_str_lines::str
(byte*) print_str_lines::str#0 str zp ZP_WORD:3 233.66666666666669
(byte*) print_str_lines::str#2 str zp ZP_WORD:3 151.5
(byte*) print_str_lines::str#3 str zp ZP_WORD:3 1552.0
(byte*) print_str_lines::str#0 str zp ZP_WORD:2 233.66666666666669
(byte*) print_str_lines::str#2 str zp ZP_WORD:2 151.5
(byte*) print_str_lines::str#3 str zp ZP_WORD:2 1552.0
zp ZP_BYTE:2 [ dtv_control#1 dtv_control#3 dtv_control#114 dtv_control#145 dtv_control#17 mode_8bppchunkybmm::y#6 mode_8bppchunkybmm::y#1 mode_8bpppixelcell::ay#4 mode_8bpppixelcell::ay#1 mode_8bpppixelcell::ch#8 mode_8bpppixelcell::ch#1 mode_sixsfred::cy#4 mode_sixsfred::cy#1 mode_sixsfred::ay#4 mode_sixsfred::ay#1 mode_sixsfred::by#4 mode_sixsfred::by#1 mode_twoplanebitmap::cy#4 mode_twoplanebitmap::cy#1 mode_twoplanebitmap::ay#4 mode_twoplanebitmap::ay#1 mode_twoplanebitmap::by#4 mode_twoplanebitmap::by#1 mode_sixsfred2::cy#4 mode_sixsfred2::cy#1 mode_sixsfred2::ay#4 mode_sixsfred2::ay#1 mode_sixsfred2::by#4 mode_sixsfred2::by#1 mode_hicolmcchar::cy#4 mode_hicolmcchar::cy#1 mode_hicolecmchar::cy#4 mode_hicolecmchar::cy#1 mode_hicolstdchar::cy#4 mode_hicolstdchar::cy#1 mode_stdbitmap::cy#4 mode_stdbitmap::cy#1 mode_stdbitmap::l#2 mode_stdbitmap::l#1 bitmap_clear::y#4 bitmap_clear::y#1 mode_mcchar::cy#4 mode_mcchar::cy#1 mode_ecmchar::cy#4 mode_ecmchar::cy#1 mode_stdchar::cy#4 mode_stdchar::cy#1 bitmap_init::$6 ]
reg byte x [ menu::i#2 menu::i#1 ]
zp ZP_WORD:3 [ menu::c#2 menu::c#1 mode_8bppchunkybmm::x#2 mode_8bppchunkybmm::x#1 mode_8bpppixelcell::gfxa#2 mode_8bpppixelcell::gfxa#3 mode_8bpppixelcell::gfxa#1 mode_8bpppixelcell::chargen#2 mode_8bpppixelcell::chargen#4 mode_8bpppixelcell::chargen#1 mode_sixsfred::col#2 mode_sixsfred::col#3 mode_sixsfred::col#1 mode_sixsfred::gfxa#2 mode_sixsfred::gfxa#3 mode_sixsfred::gfxa#1 mode_sixsfred::gfxb#2 mode_sixsfred::gfxb#3 mode_sixsfred::gfxb#1 mode_twoplanebitmap::col#2 mode_twoplanebitmap::col#3 mode_twoplanebitmap::col#1 mode_twoplanebitmap::gfxa#3 mode_twoplanebitmap::gfxa#6 mode_twoplanebitmap::gfxa#7 mode_twoplanebitmap::gfxa#2 mode_twoplanebitmap::gfxa#1 mode_twoplanebitmap::gfxb#2 mode_twoplanebitmap::gfxb#3 mode_twoplanebitmap::gfxb#1 mode_sixsfred2::col#2 mode_sixsfred2::col#3 mode_sixsfred2::col#1 mode_sixsfred2::gfxa#2 mode_sixsfred2::gfxa#3 mode_sixsfred2::gfxa#1 mode_sixsfred2::gfxb#2 mode_sixsfred2::gfxb#3 mode_sixsfred2::gfxb#1 mode_hicolmcchar::col#2 mode_hicolmcchar::col#3 mode_hicolmcchar::col#1 mode_hicolecmchar::col#2 mode_hicolecmchar::col#3 mode_hicolecmchar::col#1 mode_hicolstdchar::col#2 mode_hicolstdchar::col#3 mode_hicolstdchar::col#1 mode_stdbitmap::ch#2 mode_stdbitmap::ch#3 mode_stdbitmap::ch#1 bitmap_clear::bitmap#2 bitmap_clear::bitmap#3 bitmap_clear::bitmap#5 bitmap_clear::bitmap#1 bitmap_clear::$3 bitmap_init::yoffs#2 bitmap_init::yoffs#4 bitmap_init::yoffs#1 mode_mcchar::col#2 mode_mcchar::col#3 mode_mcchar::col#1 mode_ecmchar::col#2 mode_ecmchar::col#3 mode_ecmchar::col#1 mode_stdchar::col#2 mode_stdchar::col#3 mode_stdchar::col#1 print_str_lines::str#3 print_str_lines::str#2 print_str_lines::str#0 print_cls::sc#2 print_cls::sc#1 bitmap_plot::plotter_x#0 bitmap_plot::$0 ]
zp ZP_WORD:2 [ menu::c#2 menu::c#1 mode_8bppchunkybmm::x#2 mode_8bppchunkybmm::x#1 mode_8bpppixelcell::gfxa#2 mode_8bpppixelcell::gfxa#3 mode_8bpppixelcell::gfxa#1 mode_8bpppixelcell::chargen#2 mode_8bpppixelcell::chargen#4 mode_8bpppixelcell::chargen#1 mode_sixsfred::col#2 mode_sixsfred::col#3 mode_sixsfred::col#1 mode_sixsfred::gfxa#2 mode_sixsfred::gfxa#3 mode_sixsfred::gfxa#1 mode_sixsfred::gfxb#2 mode_sixsfred::gfxb#3 mode_sixsfred::gfxb#1 mode_twoplanebitmap::col#2 mode_twoplanebitmap::col#3 mode_twoplanebitmap::col#1 mode_twoplanebitmap::gfxa#3 mode_twoplanebitmap::gfxa#6 mode_twoplanebitmap::gfxa#7 mode_twoplanebitmap::gfxa#2 mode_twoplanebitmap::gfxa#1 mode_twoplanebitmap::gfxb#2 mode_twoplanebitmap::gfxb#3 mode_twoplanebitmap::gfxb#1 mode_sixsfred2::col#2 mode_sixsfred2::col#3 mode_sixsfred2::col#1 mode_sixsfred2::gfxa#2 mode_sixsfred2::gfxa#3 mode_sixsfred2::gfxa#1 mode_sixsfred2::gfxb#2 mode_sixsfred2::gfxb#3 mode_sixsfred2::gfxb#1 mode_hicolmcchar::col#2 mode_hicolmcchar::col#3 mode_hicolmcchar::col#1 mode_hicolecmchar::col#2 mode_hicolecmchar::col#3 mode_hicolecmchar::col#1 mode_hicolstdchar::col#2 mode_hicolstdchar::col#3 mode_hicolstdchar::col#1 mode_stdbitmap::ch#2 mode_stdbitmap::ch#3 mode_stdbitmap::ch#1 bitmap_clear::bitmap#2 bitmap_clear::bitmap#3 bitmap_clear::bitmap#5 bitmap_clear::bitmap#1 bitmap_clear::$3 bitmap_init::yoffs#2 bitmap_init::yoffs#4 bitmap_init::yoffs#1 mode_mcchar::col#2 mode_mcchar::col#3 mode_mcchar::col#1 mode_ecmchar::col#2 mode_ecmchar::col#3 mode_ecmchar::col#1 mode_stdchar::col#2 mode_stdchar::col#3 mode_stdchar::col#1 print_str_lines::str#3 print_str_lines::str#2 print_str_lines::str#0 print_cls::sc#2 print_cls::sc#1 bitmap_plot::plotter_x#0 bitmap_plot::$0 ]
reg byte x [ mode_8bppchunkybmm::i#2 mode_8bppchunkybmm::i#1 ]
zp ZP_BYTE:4 [ mode_8bppchunkybmm::y#6 mode_8bppchunkybmm::y#1 dtv_control#114 dtv_control#145 dtv_control#17 mode_8bpppixelcell::ay#4 mode_8bpppixelcell::ay#1 mode_8bpppixelcell::ch#8 mode_8bpppixelcell::ch#1 mode_sixsfred::cy#4 mode_sixsfred::cy#1 mode_sixsfred::ay#4 mode_sixsfred::ay#1 mode_sixsfred::by#4 mode_sixsfred::by#1 mode_twoplanebitmap::cy#4 mode_twoplanebitmap::cy#1 mode_twoplanebitmap::ay#4 mode_twoplanebitmap::ay#1 mode_twoplanebitmap::by#4 mode_twoplanebitmap::by#1 mode_sixsfred2::cy#4 mode_sixsfred2::cy#1 mode_sixsfred2::ay#4 mode_sixsfred2::ay#1 mode_sixsfred2::by#4 mode_sixsfred2::by#1 mode_hicolmcchar::cy#4 mode_hicolmcchar::cy#1 mode_hicolecmchar::cy#4 mode_hicolecmchar::cy#1 mode_hicolstdchar::cy#4 mode_hicolstdchar::cy#1 mode_stdbitmap::cy#4 mode_stdbitmap::cy#1 mode_stdbitmap::l#2 mode_stdbitmap::l#1 bitmap_clear::y#4 bitmap_clear::y#1 mode_mcchar::cy#4 mode_mcchar::cy#1 mode_ecmchar::cy#4 mode_ecmchar::cy#1 mode_stdchar::cy#4 mode_stdchar::cy#1 bitmap_init::$6 ]
reg byte x [ mode_8bppchunkybmm::gfxbCpuBank#4 mode_8bppchunkybmm::gfxbCpuBank#7 mode_8bppchunkybmm::gfxbCpuBank#8 mode_8bppchunkybmm::gfxbCpuBank#2 ]
zp ZP_WORD:5 [ mode_8bppchunkybmm::gfxb#4 mode_8bppchunkybmm::gfxb#3 mode_8bppchunkybmm::gfxb#5 mode_8bppchunkybmm::gfxb#1 mode_8bpppixelcell::gfxb#2 mode_8bpppixelcell::gfxb#5 mode_8bpppixelcell::gfxb#7 mode_8bpppixelcell::gfxb#1 mode_hicolmcchar::ch#2 mode_hicolmcchar::ch#3 mode_hicolmcchar::ch#1 mode_hicolecmchar::ch#2 mode_hicolecmchar::ch#3 mode_hicolecmchar::ch#1 mode_hicolstdchar::ch#2 mode_hicolstdchar::ch#3 mode_hicolstdchar::ch#1 mode_mcchar::ch#2 mode_mcchar::ch#3 mode_mcchar::ch#1 mode_ecmchar::ch#2 mode_ecmchar::ch#3 mode_ecmchar::ch#1 mode_stdchar::ch#2 mode_stdchar::ch#3 mode_stdchar::ch#1 print_char_cursor#17 print_char_cursor#19 print_char_cursor#101 print_char_cursor#32 print_char_cursor#1 bitmap_plot::plotter_y#0 ]
reg byte x [ mode_ctrl::ctrl#14 mode_ctrl::ctrl#22 mode_ctrl::ctrl#6 mode_ctrl::ctrl#13 mode_ctrl::ctrl#5 mode_ctrl::ctrl#12 mode_ctrl::ctrl#4 mode_ctrl::ctrl#11 mode_ctrl::ctrl#3 mode_ctrl::ctrl#10 mode_ctrl::ctrl#2 mode_ctrl::ctrl#17 mode_ctrl::ctrl#1 mode_ctrl::ctrl#0 ]

@ -0,0 +1,22 @@
.pc = $801 "Basic"
:BasicUpstart(main)
.pc = $80d "Program"
.label B = $1000
jsr main
main: {
lda #0
b2:
jsr menu
jmp b2
}
menu: {
jsr mode
rts
}
mode: {
b2:
lda B
cmp #0
bne b2
jmp b2
}

@ -0,0 +1,41 @@
@begin: scope:[] from
[0] phi() [ ] ( )
to:@3
@3: scope:[] from @begin
[1] phi() [ ] ( )
[2] call main param-assignment [ ] ( )
to:@end
@end: scope:[] from @3
[3] phi() [ ] ( )
main: scope:[main] from @3
[4] phi() [ ] ( main:2 [ ] )
to:main::@1
main::@1: scope:[main] from main main::@2
[5] (byte) a#1 ← phi( main/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@2/(byte) a#12 ) [ a#1 ] ( main:2 [ a#1 ] )
to:main::@2
main::@2: scope:[main] from main::@1
[6] phi() [ a#1 ] ( main:2 [ a#1 ] )
[7] call menu param-assignment [ a#12 ] ( main:2 [ a#12 ] )
to:main::@1
menu: scope:[menu] from main::@2
[8] phi() [ a#1 ] ( main:2::menu:7 [ a#1 ] )
to:menu::@2
menu::@2: scope:[menu] from menu
[9] phi() [ a#1 ] ( main:2::menu:7 [ a#1 ] )
[10] call mode param-assignment [ a#12 ] ( main:2::menu:7 [ a#12 ] )
to:menu::@return
menu::@return: scope:[menu] from menu::@2
[11] return [ a#12 ] ( main:2::menu:7 [ a#12 ] )
to:@return
mode: scope:[mode] from menu::@2
[12] phi() [ a#1 ] ( main:2::menu:7::mode:10 [ a#1 ] )
to:mode::@1
mode::@1: scope:[mode] from mode mode::@2 mode::@7
[13] (byte) a#12 ← phi( mode/(byte) a#1 mode::@7/(byte) a#5 ) [ ] ( main:2::menu:7::mode:10 [ ] )
to:mode::@2
mode::@2: scope:[mode] from mode::@1
[14] if(*((const byte*) B#0)!=(byte/signed byte/word/signed word/dword/signed dword) 0) goto mode::@1 [ ] ( main:2::menu:7::mode:10 [ ] )
to:mode::@7
mode::@7: scope:[mode] from mode::@2
[15] (byte) a#5 ← *((const byte*) B#0) [ a#5 ] ( main:2::menu:7::mode:10 [ a#5 ] )
to:mode::@1

@ -0,0 +1,919 @@
PARSING src/test/java/dk/camelot64/kickc/test/kc/emptyblock-error.kc
// Error cleaning up unused blocks
void main() {
while(true) {
menu();
}
}
void menu() {
while(true) {
mode();
return;
}
}
byte a = 0;
byte *B = $1000;
void mode() {
while(true) {
if(*B == 0) {
a = *B;
}
}
}
STATEMENTS
proc (void()) main()
main::@1:
if(true) goto main::@2
goto main::@3
main::@2:
(void~) main::$0 ← call menu
goto main::@1
main::@3:
main::@return:
return
endproc // main()
proc (void()) menu()
menu::@1:
if(true) goto menu::@2
goto menu::@3
menu::@2:
(void~) menu::$0 ← call mode
goto menu::@return
goto menu::@1
menu::@3:
menu::@return:
return
endproc // menu()
(byte) a ← (byte/signed byte/word/signed word/dword/signed dword) 0
(byte*) B ← (word/signed word/dword/signed dword) 4096
proc (void()) mode()
mode::@1:
if(true) goto mode::@2
goto mode::@3
mode::@2:
(boolean~) mode::$0 ← *((byte*) B) == (byte/signed byte/word/signed word/dword/signed dword) 0
(boolean~) mode::$1 ← ! (boolean~) mode::$0
if((boolean~) mode::$1) goto mode::@4
(byte) a ← *((byte*) B)
mode::@4:
goto mode::@1
mode::@3:
mode::@return:
return
endproc // mode()
call main
SYMBOLS
(byte*) B
(byte) a
(void()) main()
(void~) main::$0
(label) main::@1
(label) main::@2
(label) main::@3
(label) main::@return
(void()) menu()
(void~) menu::$0
(label) menu::@1
(label) menu::@2
(label) menu::@3
(label) menu::@return
(void()) mode()
(boolean~) mode::$0
(boolean~) mode::$1
(label) mode::@1
(label) mode::@2
(label) mode::@3
(label) mode::@4
(label) mode::@return
Promoting word/signed word/dword/signed dword to byte* in B ← ((byte*)) 4096
INITIAL CONTROL FLOW GRAPH
@begin: scope:[] from
to:@1
main: scope:[main] from
to:main::@1
main::@1: scope:[main] from main main::@2
if(true) goto main::@2
to:main::@4
main::@2: scope:[main] from main::@1 main::@5
(void~) main::$0 ← call menu
to:main::@1
main::@4: scope:[main] from main::@1
to:main::@3
main::@3: scope:[main] from main::@4 main::@6
to:main::@return
main::@5: scope:[main] from
to:main::@2
main::@6: scope:[main] from
to:main::@3
main::@return: scope:[main] from main::@3
return
to:@return
@1: scope:[] from @begin
to:@2
menu: scope:[menu] from
to:menu::@1
menu::@1: scope:[menu] from menu menu::@6
if(true) goto menu::@2
to:menu::@4
menu::@2: scope:[menu] from menu::@1 menu::@5
(void~) menu::$0 ← call mode
to:menu::@return
menu::@4: scope:[menu] from menu::@1
to:menu::@3
menu::@3: scope:[menu] from menu::@4 menu::@7
to:menu::@return
menu::@5: scope:[menu] from
to:menu::@2
menu::@return: scope:[menu] from menu::@2 menu::@3
return
to:@return
menu::@6: scope:[menu] from
to:menu::@1
menu::@7: scope:[menu] from
to:menu::@3
@2: scope:[] from @1
(byte) a ← (byte/signed byte/word/signed word/dword/signed dword) 0
(byte*) B ← ((byte*)) (word/signed word/dword/signed dword) 4096
to:@3
mode: scope:[mode] from
to:mode::@1
mode::@1: scope:[mode] from mode mode::@4
if(true) goto mode::@2
to:mode::@5
mode::@2: scope:[mode] from mode::@1 mode::@6
(boolean~) mode::$0 ← *((byte*) B) == (byte/signed byte/word/signed word/dword/signed dword) 0
(boolean~) mode::$1 ← ! (boolean~) mode::$0
if((boolean~) mode::$1) goto mode::@4
to:mode::@7
mode::@5: scope:[mode] from mode::@1
to:mode::@3
mode::@3: scope:[mode] from mode::@5 mode::@8
to:mode::@return
mode::@6: scope:[mode] from
to:mode::@2
mode::@4: scope:[mode] from mode::@2 mode::@7
to:mode::@1
mode::@7: scope:[mode] from mode::@2
(byte) a ← *((byte*) B)
to:mode::@4
mode::@8: scope:[mode] from
to:mode::@3
mode::@return: scope:[mode] from mode::@3
return
to:@return
@3: scope:[] from @2
call main
to:@end
@end: scope:[] from @3
Eliminating unused variable - keeping the call (void~) main::$0
Eliminating unused variable - keeping the call (void~) menu::$0
Removing empty block main::@4
Removing empty block main::@3
Removing empty block main::@5
Removing empty block main::@6
Removing empty block @1
Removing empty block menu::@4
Removing empty block menu::@3
Removing empty block menu::@5
Removing empty block menu::@6
Removing empty block menu::@7
Removing empty block mode::@5
Removing empty block mode::@3
Removing empty block mode::@6
Removing empty block mode::@8
PROCEDURE MODIFY VARIABLE ANALYSIS
main modifies a
menu modifies a
mode modifies a
Completing Phi functions...
Completing Phi functions...
Completing Phi functions...
Completing Phi functions...
Completing Phi functions...
Completing Phi functions...
Completing Phi functions...
Completing Phi functions...
Completing Phi functions...
Completing Phi functions...
CONTROL FLOW GRAPH SSA WITH ASSIGNMENT CALL & RETURN
@begin: scope:[] from
to:@2
main: scope:[main] from @3
(byte*) B#11 ← phi( @3/(byte*) B#13 )
(byte) a#20 ← phi( @3/(byte) a#19 )
to:main::@1
main::@1: scope:[main] from main main::@7
(byte*) B#10 ← phi( main/(byte*) B#11 main::@7/(byte*) B#12 )
(byte) a#15 ← phi( main/(byte) a#20 main::@7/(byte) a#0 )
if(true) goto main::@2
to:main::@return
main::@2: scope:[main] from main::@1
(byte*) B#9 ← phi( main::@1/(byte*) B#10 )
(byte) a#14 ← phi( main::@1/(byte) a#15 )
call menu param-assignment
to:main::@7
main::@7: scope:[main] from main::@2
(byte*) B#12 ← phi( main::@2/(byte*) B#9 )
(byte) a#8 ← phi( main::@2/(byte) a#3 )
(byte) a#0 ← (byte) a#8
to:main::@1
main::@return: scope:[main] from main::@1
(byte) a#9 ← phi( main::@1/(byte) a#15 )
(byte) a#1 ← (byte) a#9
return
to:@return
menu: scope:[menu] from main::@2
(byte*) B#8 ← phi( main::@2/(byte*) B#9 )
(byte) a#21 ← phi( main::@2/(byte) a#14 )
to:menu::@1
menu::@1: scope:[menu] from menu
(byte*) B#7 ← phi( menu/(byte*) B#8 )
(byte) a#17 ← phi( menu/(byte) a#21 )
if(true) goto menu::@2
to:menu::@return
menu::@2: scope:[menu] from menu::@1
(byte*) B#6 ← phi( menu::@1/(byte*) B#7 )
(byte) a#16 ← phi( menu::@1/(byte) a#17 )
call mode param-assignment
to:menu::@8
menu::@8: scope:[menu] from menu::@2
(byte) a#10 ← phi( menu::@2/(byte) a#6 )
(byte) a#2 ← (byte) a#10
to:menu::@return
menu::@return: scope:[menu] from menu::@1 menu::@8
(byte) a#11 ← phi( menu::@1/(byte) a#17 menu::@8/(byte) a#2 )
(byte) a#3 ← (byte) a#11
return
to:@return
@2: scope:[] from @begin
(byte) a#4 ← (byte/signed byte/word/signed word/dword/signed dword) 0
(byte*) B#0 ← ((byte*)) (word/signed word/dword/signed dword) 4096
to:@3
mode: scope:[mode] from menu::@2
(byte) a#22 ← phi( menu::@2/(byte) a#16 )
(byte*) B#4 ← phi( menu::@2/(byte*) B#6 )
to:mode::@1
mode::@1: scope:[mode] from mode mode::@4 mode::@7
(byte) a#18 ← phi( mode/(byte) a#22 mode::@4/(byte) a#23 mode::@7/(byte) a#5 )
(byte*) B#3 ← phi( mode/(byte*) B#4 mode::@4/(byte*) B#5 mode::@7/(byte*) B#2 )
if(true) goto mode::@2
to:mode::@return
mode::@2: scope:[mode] from mode::@1
(byte) a#24 ← phi( mode::@1/(byte) a#18 )
(byte*) B#1 ← phi( mode::@1/(byte*) B#3 )
(boolean~) mode::$0 ← *((byte*) B#1) == (byte/signed byte/word/signed word/dword/signed dword) 0
(boolean~) mode::$1 ← ! (boolean~) mode::$0
if((boolean~) mode::$1) goto mode::@4
to:mode::@7
mode::@4: scope:[mode] from mode::@2
(byte) a#23 ← phi( mode::@2/(byte) a#24 )
(byte*) B#5 ← phi( mode::@2/(byte*) B#1 )
to:mode::@1
mode::@7: scope:[mode] from mode::@2
(byte*) B#2 ← phi( mode::@2/(byte*) B#1 )
(byte) a#5 ← *((byte*) B#2)
to:mode::@1
mode::@return: scope:[mode] from mode::@1
(byte) a#12 ← phi( mode::@1/(byte) a#18 )
(byte) a#6 ← (byte) a#12
return
to:@return
@3: scope:[] from @2
(byte*) B#13 ← phi( @2/(byte*) B#0 )
(byte) a#19 ← phi( @2/(byte) a#4 )
call main param-assignment
to:@4
@4: scope:[] from @3
(byte) a#13 ← phi( @3/(byte) a#1 )
(byte) a#7 ← (byte) a#13
to:@end
@end: scope:[] from @4
SYMBOL TABLE SSA
(label) @2
(label) @3
(label) @4
(label) @begin
(label) @end
(byte*) B
(byte*) B#0
(byte*) B#1
(byte*) B#10
(byte*) B#11
(byte*) B#12
(byte*) B#13
(byte*) B#2
(byte*) B#3
(byte*) B#4
(byte*) B#5
(byte*) B#6
(byte*) B#7
(byte*) B#8
(byte*) B#9
(byte) a
(byte) a#0
(byte) a#1
(byte) a#10
(byte) a#11
(byte) a#12
(byte) a#13
(byte) a#14
(byte) a#15
(byte) a#16
(byte) a#17
(byte) a#18
(byte) a#19
(byte) a#2
(byte) a#20
(byte) a#21
(byte) a#22
(byte) a#23
(byte) a#24
(byte) a#3
(byte) a#4
(byte) a#5
(byte) a#6
(byte) a#7
(byte) a#8
(byte) a#9
(void()) main()
(label) main::@1
(label) main::@2
(label) main::@7
(label) main::@return
(void()) menu()
(label) menu::@1
(label) menu::@2
(label) menu::@8
(label) menu::@return
(void()) mode()
(boolean~) mode::$0
(boolean~) mode::$1
(label) mode::@1
(label) mode::@2
(label) mode::@4
(label) mode::@7
(label) mode::@return
OPTIMIZING CONTROL FLOW GRAPH
Inversing boolean not (boolean~) mode::$1 ← *((byte*) B#1) != (byte/signed byte/word/signed word/dword/signed dword) 0 from (boolean~) mode::$0 ← *((byte*) B#1) == (byte/signed byte/word/signed word/dword/signed dword) 0
Succesful SSA optimization Pass2UnaryNotSimplification
Not aliassing across scopes: a#20 a#19
Not aliassing across scopes: B#11 B#13
Not aliassing across scopes: a#8 a#3
Not aliassing across scopes: a#21 a#14
Not aliassing across scopes: B#8 B#9
Not aliassing across scopes: a#10 a#6
Not aliassing across scopes: B#4 B#6
Not aliassing across scopes: a#22 a#16
Not aliassing across scopes: a#13 a#1
Alias (byte) a#1 = (byte) a#14 (byte) a#15 (byte) a#9
Alias (byte*) B#10 = (byte*) B#9 (byte*) B#12
Alias (byte) a#0 = (byte) a#8
Alias (byte) a#16 = (byte) a#17 (byte) a#21
Alias (byte*) B#6 = (byte*) B#7 (byte*) B#8
Alias (byte) a#10 = (byte) a#2
Alias (byte) a#11 = (byte) a#3
Alias (byte*) B#1 = (byte*) B#3 (byte*) B#5 (byte*) B#2
Alias (byte) a#12 = (byte) a#24 (byte) a#18 (byte) a#23 (byte) a#6
Alias (byte) a#19 = (byte) a#4
Alias (byte*) B#0 = (byte*) B#13
Alias (byte) a#13 = (byte) a#7
Succesful SSA optimization Pass2AliasElimination
Not aliassing across scopes: a#20 a#19
Not aliassing across scopes: B#11 B#0
Not aliassing across scopes: a#0 a#11
Not aliassing across scopes: a#16 a#1
Not aliassing across scopes: B#6 B#10
Not aliassing across scopes: a#10 a#12
Not aliassing across scopes: B#4 B#6
Not aliassing across scopes: a#22 a#16
Not aliassing across scopes: a#13 a#1
Self Phi Eliminated (byte*) B#10
Self Phi Eliminated (byte*) B#1
Self Phi Eliminated (byte*) B#1
Self Phi Eliminated (byte) a#12
Succesful SSA optimization Pass2SelfPhiElimination
Redundant Phi (byte) a#20 (byte) a#19
Redundant Phi (byte*) B#11 (byte*) B#0
Redundant Phi (byte*) B#10 (byte*) B#11
Redundant Phi (byte) a#0 (byte) a#11
Redundant Phi (byte) a#16 (byte) a#1
Redundant Phi (byte*) B#6 (byte*) B#10
Redundant Phi (byte) a#10 (byte) a#12
Redundant Phi (byte*) B#4 (byte*) B#6
Redundant Phi (byte) a#22 (byte) a#16
Redundant Phi (byte*) B#1 (byte*) B#4
Redundant Phi (byte) a#13 (byte) a#1
Succesful SSA optimization Pass2RedundantPhiElimination
Simple Condition (boolean~) mode::$1 if(*((byte*) B#0)!=(byte/signed byte/word/signed word/dword/signed dword) 0) goto mode::@4
Succesful SSA optimization Pass2ConditionalJumpSimplification
Constant (const byte) a#19 = 0
Constant (const byte*) B#0 = ((byte*))4096
Succesful SSA optimization Pass2ConstantIdentification
if() condition always true - replacing block destination if(true) goto main::@2
if() condition always true - replacing block destination if(true) goto menu::@2
Removing PHI-reference to removed block (menu::@1) in block menu::@return
if() condition always true - replacing block destination if(true) goto mode::@2
Succesful SSA optimization Pass2ConstantIfs
Removing unused block main::@return
Removing unused block mode::@return
Succesful SSA optimization Pass2EliminateUnusedBlocks
Culled Empty Block (label) main::@7
Culled Empty Block (label) menu::@1
Culled Empty Block (label) menu::@8
Culled Empty Block (label) @2
Culled Empty Block (label) mode::@4
Culled Empty Block (label) @4
Succesful SSA optimization Pass2CullEmptyBlocks
Not aliassing across scopes: a#11 a#12
Not aliassing across scopes: a#12 a#1
Redundant Phi (byte) a#11 (byte) a#12
Succesful SSA optimization Pass2RedundantPhiElimination
Not aliassing across scopes: a#12 a#1
OPTIMIZING CONTROL FLOW GRAPH
Inlining constant with var siblings (const byte) a#19
Inlining constant with var siblings (const byte) a#19
Inlining constant with var siblings (const byte) a#19
Constant inlined a#19 = (byte/signed byte/word/signed word/dword/signed dword) 0
Succesful SSA optimization Pass2ConstantInlining
Block Sequence Planned @begin @3 @end main main::@1 main::@2 menu menu::@2 menu::@return mode mode::@1 mode::@2 mode::@7
Block Sequence Planned @begin @3 @end main main::@1 main::@2 menu menu::@2 menu::@return mode mode::@1 mode::@2 mode::@7
Adding NOP phi() at start of @begin
Adding NOP phi() at start of @3
Adding NOP phi() at start of @end
Adding NOP phi() at start of main
Adding NOP phi() at start of main::@2
Adding NOP phi() at start of menu
Adding NOP phi() at start of menu::@2
CALL GRAPH
Calls in [] to main:2
Calls in [main] to menu:7
Calls in [menu] to mode:11
Propagating live ranges...
Propagating live ranges...
Propagating live ranges...
Propagating live ranges...
Propagating live ranges...
Created 2 initial phi equivalence classes
Coalesced [8] a#25 ← a#12
Coalesced (already) [13] a#26 ← a#1
Coalesced [17] a#27 ← a#5
Coalesced down to 1 phi equivalence classes
Block Sequence Planned @begin @3 @end main main::@1 main::@2 menu menu::@2 menu::@return mode mode::@1 mode::@2 mode::@7
Adding NOP phi() at start of @begin
Adding NOP phi() at start of @3
Adding NOP phi() at start of @end
Adding NOP phi() at start of main
Adding NOP phi() at start of main::@2
Adding NOP phi() at start of menu
Adding NOP phi() at start of menu::@2
Adding NOP phi() at start of mode
Propagating live ranges...
Propagating live ranges...
Propagating live ranges...
Propagating live ranges...
Propagating live ranges...
Propagating live ranges...
FINAL CONTROL FLOW GRAPH
@begin: scope:[] from
[0] phi() [ ] ( )
to:@3
@3: scope:[] from @begin
[1] phi() [ ] ( )
[2] call main param-assignment [ ] ( )
to:@end
@end: scope:[] from @3
[3] phi() [ ] ( )
main: scope:[main] from @3
[4] phi() [ ] ( main:2 [ ] )
to:main::@1
main::@1: scope:[main] from main main::@2
[5] (byte) a#1 ← phi( main/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@2/(byte) a#12 ) [ a#1 ] ( main:2 [ a#1 ] )
to:main::@2
main::@2: scope:[main] from main::@1
[6] phi() [ a#1 ] ( main:2 [ a#1 ] )
[7] call menu param-assignment [ a#12 ] ( main:2 [ a#12 ] )
to:main::@1
menu: scope:[menu] from main::@2
[8] phi() [ a#1 ] ( main:2::menu:7 [ a#1 ] )
to:menu::@2
menu::@2: scope:[menu] from menu
[9] phi() [ a#1 ] ( main:2::menu:7 [ a#1 ] )
[10] call mode param-assignment [ a#12 ] ( main:2::menu:7 [ a#12 ] )
to:menu::@return
menu::@return: scope:[menu] from menu::@2
[11] return [ a#12 ] ( main:2::menu:7 [ a#12 ] )
to:@return
mode: scope:[mode] from menu::@2
[12] phi() [ a#1 ] ( main:2::menu:7::mode:10 [ a#1 ] )
to:mode::@1
mode::@1: scope:[mode] from mode mode::@2 mode::@7
[13] (byte) a#12 ← phi( mode/(byte) a#1 mode::@7/(byte) a#5 ) [ ] ( main:2::menu:7::mode:10 [ ] )
to:mode::@2
mode::@2: scope:[mode] from mode::@1
[14] if(*((const byte*) B#0)!=(byte/signed byte/word/signed word/dword/signed dword) 0) goto mode::@1 [ ] ( main:2::menu:7::mode:10 [ ] )
to:mode::@7
mode::@7: scope:[mode] from mode::@2
[15] (byte) a#5 ← *((const byte*) B#0) [ a#5 ] ( main:2::menu:7::mode:10 [ a#5 ] )
to:mode::@1
DOMINATORS
@begin dominated by @begin
@3 dominated by @begin @3
@end dominated by @begin @end @3
main dominated by @begin main @3
main::@1 dominated by @begin main @3 main::@1
main::@2 dominated by @begin main @3 main::@1 main::@2
menu dominated by @begin main menu @3 main::@1 main::@2
menu::@2 dominated by @begin menu::@2 main menu @3 main::@1 main::@2
menu::@return dominated by @begin menu::@return menu::@2 main menu @3 main::@1 main::@2
mode dominated by @begin menu::@2 main menu mode @3 main::@1 main::@2
mode::@1 dominated by @begin menu::@2 main menu mode @3 mode::@1 main::@1 main::@2
mode::@2 dominated by @begin menu::@2 main menu mode @3 mode::@1 mode::@2 main::@1 main::@2
mode::@7 dominated by @begin menu::@2 main menu mode @3 mode::@1 mode::@2 main::@1 mode::@7 main::@2
NATURAL LOOPS
Found back edge: Loop head: main::@1 tails: main::@2 blocks: null
Found back edge: Loop head: mode::@1 tails: mode::@2 blocks: null
Found back edge: Loop head: mode::@1 tails: mode::@7 blocks: null
Populated: Loop head: main::@1 tails: main::@2 blocks: main::@2 main::@1
Populated: Loop head: mode::@1 tails: mode::@2 blocks: mode::@2 mode::@1
Populated: Loop head: mode::@1 tails: mode::@7 blocks: mode::@7 mode::@2 mode::@1
Loop head: main::@1 tails: main::@2 blocks: main::@2 main::@1
Loop head: mode::@1 tails: mode::@2 blocks: mode::@2 mode::@1
Loop head: mode::@1 tails: mode::@7 blocks: mode::@7 mode::@2 mode::@1
NATURAL LOOPS WITH DEPTH
Found 0 loops in scope []
Found 1 loops in scope [main]
Loop head: main::@1 tails: main::@2 blocks: main::@2 main::@1
Found 0 loops in scope [menu]
Found 2 loops in scope [mode]
Loop head: mode::@1 tails: mode::@2 blocks: mode::@2 mode::@1
Loop head: mode::@1 tails: mode::@7 blocks: mode::@7 mode::@2 mode::@1
Loop head: main::@1 tails: main::@2 blocks: main::@2 main::@1 depth: 1
Loop head: mode::@1 tails: mode::@2 blocks: mode::@2 mode::@1 depth: 3
Loop head: mode::@1 tails: mode::@7 blocks: mode::@7 mode::@2 mode::@1 depth: 2
VARIABLE REGISTER WEIGHTS
(byte*) B
(byte) a
(byte) a#1 2.6
(byte) a#12 38.0
(byte) a#5 202.0
(void()) main()
(void()) menu()
(void()) mode()
Initial phi equivalence classes
[ a#1 a#12 a#5 ]
Complete equivalence classes
[ a#1 a#12 a#5 ]
Allocated zp ZP_BYTE:2 [ a#1 a#12 a#5 ]
INITIAL ASM
//SEG0 Basic Upstart
.pc = $801 "Basic"
:BasicUpstart(main)
.pc = $80d "Program"
//SEG1 Global Constants & labels
.label B = $1000
.label a = 2
//SEG2 @begin
bbegin:
//SEG3 [1] phi from @begin to @3 [phi:@begin->@3]
b3_from_bbegin:
jmp b3
//SEG4 @3
b3:
//SEG5 [2] call main param-assignment [ ] ( )
//SEG6 [4] phi from @3 to main [phi:@3->main]
main_from_b3:
jsr main
//SEG7 [3] phi from @3 to @end [phi:@3->@end]
bend_from_b3:
jmp bend
//SEG8 @end
bend:
//SEG9 main
main: {
//SEG10 [5] phi from main to main::@1 [phi:main->main::@1]
b1_from_main:
//SEG11 [5] phi (byte) a#1 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->main::@1#0] -- vbuz1=vbuc1
lda #0
sta a
jmp b1
//SEG12 main::@1
b1:
//SEG13 [6] phi from main::@1 to main::@2 [phi:main::@1->main::@2]
b2_from_b1:
jmp b2
//SEG14 main::@2
b2:
//SEG15 [7] call menu param-assignment [ a#12 ] ( main:2 [ a#12 ] )
//SEG16 [8] phi from main::@2 to menu [phi:main::@2->menu]
menu_from_b2:
jsr menu
//SEG17 [5] phi from main::@2 to main::@1 [phi:main::@2->main::@1]
b1_from_b2:
//SEG18 [5] phi (byte) a#1 = (byte) a#12 [phi:main::@2->main::@1#0] -- register_copy
jmp b1
}
//SEG19 menu
menu: {
//SEG20 [9] phi from menu to menu::@2 [phi:menu->menu::@2]
b2_from_menu:
jmp b2
//SEG21 menu::@2
b2:
//SEG22 [10] call mode param-assignment [ a#12 ] ( main:2::menu:7 [ a#12 ] )
//SEG23 [12] phi from menu::@2 to mode [phi:menu::@2->mode]
mode_from_b2:
jsr mode
jmp breturn
//SEG24 menu::@return
breturn:
//SEG25 [11] return [ a#12 ] ( main:2::menu:7 [ a#12 ] )
rts
}
//SEG26 mode
mode: {
//SEG27 [13] phi from mode mode::@7 to mode::@1 [phi:mode/mode::@7->mode::@1]
b1_from_mode:
b1_from_b7:
//SEG28 [13] phi (byte) a#12 = (byte) a#1 [phi:mode/mode::@7->mode::@1#0] -- register_copy
jmp b1
//SEG29 [13] phi from mode::@2 to mode::@1 [phi:mode::@2->mode::@1]
b1_from_b2:
jmp b1
//SEG30 mode::@1
b1:
jmp b2
//SEG31 mode::@2
b2:
//SEG32 [14] if(*((const byte*) B#0)!=(byte/signed byte/word/signed word/dword/signed dword) 0) goto mode::@1 [ ] ( main:2::menu:7::mode:10 [ ] ) -- _deref_pbuc1_neq_0_then_la1
lda B
cmp #0
bne b1_from_b2
jmp b7
//SEG33 mode::@7
b7:
//SEG34 [15] (byte) a#5 ← *((const byte*) B#0) [ a#5 ] ( main:2::menu:7::mode:10 [ a#5 ] ) -- vbuz1=_deref_pbuc1
lda B
sta a
jmp b1_from_b7
}
REGISTER UPLIFT POTENTIAL REGISTERS
Statement [14] if(*((const byte*) B#0)!=(byte/signed byte/word/signed word/dword/signed dword) 0) goto mode::@1 [ ] ( main:2::menu:7::mode:10 [ ] ) always clobbers reg byte a
Potential registers zp ZP_BYTE:2 [ a#1 a#12 a#5 ] : zp ZP_BYTE:2 , reg byte a , reg byte x , reg byte y ,
REGISTER UPLIFT SCOPES
Uplift Scope [] 242.6: zp ZP_BYTE:2 [ a#1 a#12 a#5 ]
Uplift Scope [main]
Uplift Scope [menu]
Uplift Scope [mode]
Uplifting [] best 18376 combination reg byte a [ a#1 a#12 a#5 ]
Uplifting [main] best 18376 combination
Uplifting [menu] best 18376 combination
Uplifting [mode] best 18376 combination
ASSEMBLER BEFORE OPTIMIZATION
//SEG0 Basic Upstart
.pc = $801 "Basic"
:BasicUpstart(main)
.pc = $80d "Program"
//SEG1 Global Constants & labels
.label B = $1000
//SEG2 @begin
bbegin:
//SEG3 [1] phi from @begin to @3 [phi:@begin->@3]
b3_from_bbegin:
jmp b3
//SEG4 @3
b3:
//SEG5 [2] call main param-assignment [ ] ( )
//SEG6 [4] phi from @3 to main [phi:@3->main]
main_from_b3:
jsr main
//SEG7 [3] phi from @3 to @end [phi:@3->@end]
bend_from_b3:
jmp bend
//SEG8 @end
bend:
//SEG9 main
main: {
//SEG10 [5] phi from main to main::@1 [phi:main->main::@1]
b1_from_main:
//SEG11 [5] phi (byte) a#1 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->main::@1#0] -- vbuaa=vbuc1
lda #0
jmp b1
//SEG12 main::@1
b1:
//SEG13 [6] phi from main::@1 to main::@2 [phi:main::@1->main::@2]
b2_from_b1:
jmp b2
//SEG14 main::@2
b2:
//SEG15 [7] call menu param-assignment [ a#12 ] ( main:2 [ a#12 ] )
//SEG16 [8] phi from main::@2 to menu [phi:main::@2->menu]
menu_from_b2:
jsr menu
//SEG17 [5] phi from main::@2 to main::@1 [phi:main::@2->main::@1]
b1_from_b2:
//SEG18 [5] phi (byte) a#1 = (byte) a#12 [phi:main::@2->main::@1#0] -- register_copy
jmp b1
}
//SEG19 menu
menu: {
//SEG20 [9] phi from menu to menu::@2 [phi:menu->menu::@2]
b2_from_menu:
jmp b2
//SEG21 menu::@2
b2:
//SEG22 [10] call mode param-assignment [ a#12 ] ( main:2::menu:7 [ a#12 ] )
//SEG23 [12] phi from menu::@2 to mode [phi:menu::@2->mode]
mode_from_b2:
jsr mode
jmp breturn
//SEG24 menu::@return
breturn:
//SEG25 [11] return [ a#12 ] ( main:2::menu:7 [ a#12 ] )
rts
}
//SEG26 mode
mode: {
//SEG27 [13] phi from mode mode::@7 to mode::@1 [phi:mode/mode::@7->mode::@1]
b1_from_mode:
b1_from_b7:
//SEG28 [13] phi (byte) a#12 = (byte) a#1 [phi:mode/mode::@7->mode::@1#0] -- register_copy
jmp b1
//SEG29 [13] phi from mode::@2 to mode::@1 [phi:mode::@2->mode::@1]
b1_from_b2:
jmp b1
//SEG30 mode::@1
b1:
jmp b2
//SEG31 mode::@2
b2:
//SEG32 [14] if(*((const byte*) B#0)!=(byte/signed byte/word/signed word/dword/signed dword) 0) goto mode::@1 [ ] ( main:2::menu:7::mode:10 [ ] ) -- _deref_pbuc1_neq_0_then_la1
lda B
cmp #0
bne b1_from_b2
jmp b7
//SEG33 mode::@7
b7:
//SEG34 [15] (byte) a#5 ← *((const byte*) B#0) [ a#5 ] ( main:2::menu:7::mode:10 [ a#5 ] ) -- vbuaa=_deref_pbuc1
lda B
jmp b1_from_b7
}
ASSEMBLER OPTIMIZATIONS
Removing instruction jmp b3
Removing instruction jmp bend
Removing instruction jmp b1
Removing instruction jmp b2
Removing instruction jmp b2
Removing instruction jmp breturn
Removing instruction jmp b1
Removing instruction jmp b2
Removing instruction jmp b7
Succesful ASM optimization Pass5NextJumpElimination
Replacing label b1 with b2
Replacing label b1 with b2
Replacing label b1_from_b2 with b2
Removing instruction bbegin:
Removing instruction b3_from_bbegin:
Removing instruction main_from_b3:
Removing instruction bend_from_b3:
Removing instruction b1:
Removing instruction b2_from_b1:
Removing instruction menu_from_b2:
Removing instruction b2_from_menu:
Removing instruction mode_from_b2:
Removing instruction b1_from_mode:
Removing instruction b1_from_b2:
Removing instruction b1:
Succesful ASM optimization Pass5RedundantLabelElimination
Removing instruction b3:
Removing instruction bend:
Removing instruction b1_from_main:
Removing instruction b1_from_b2:
Removing instruction b2:
Removing instruction breturn:
Removing instruction b7:
Succesful ASM optimization Pass5UnusedLabelElimination
Skipping double jump to b2 in jmp b1_from_b7
Succesful ASM optimization Pass5DoubleJumpElimination
Relabelling long label b1_from_b7 to b1
Succesful ASM optimization Pass5RelabelLongLabels
Removing instruction jmp b2
Succesful ASM optimization Pass5NextJumpElimination
Removing instruction lda B
Succesful ASM optimization Pass5UnnecesaryLoadElimination
Removing instruction b1:
Succesful ASM optimization Pass5RedundantLabelElimination
FINAL SYMBOL TABLE
(label) @3
(label) @begin
(label) @end
(byte*) B
(const byte*) B#0 B = ((byte*))(word/signed word/dword/signed dword) 4096
(byte) a
(byte) a#1 reg byte a 2.6
(byte) a#12 reg byte a 38.0
(byte) a#5 reg byte a 202.0
(void()) main()
(label) main::@1
(label) main::@2
(void()) menu()
(label) menu::@2
(label) menu::@return
(void()) mode()
(label) mode::@1
(label) mode::@2
(label) mode::@7
reg byte a [ a#1 a#12 a#5 ]
FINAL ASSEMBLER
Score: 8874
//SEG0 Basic Upstart
.pc = $801 "Basic"
:BasicUpstart(main)
.pc = $80d "Program"
//SEG1 Global Constants & labels
.label B = $1000
//SEG2 @begin
//SEG3 [1] phi from @begin to @3 [phi:@begin->@3]
//SEG4 @3
//SEG5 [2] call main param-assignment [ ] ( )
//SEG6 [4] phi from @3 to main [phi:@3->main]
jsr main
//SEG7 [3] phi from @3 to @end [phi:@3->@end]
//SEG8 @end
//SEG9 main
main: {
//SEG10 [5] phi from main to main::@1 [phi:main->main::@1]
//SEG11 [5] phi (byte) a#1 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->main::@1#0] -- vbuaa=vbuc1
lda #0
//SEG12 main::@1
//SEG13 [6] phi from main::@1 to main::@2 [phi:main::@1->main::@2]
//SEG14 main::@2
b2:
//SEG15 [7] call menu param-assignment [ a#12 ] ( main:2 [ a#12 ] )
//SEG16 [8] phi from main::@2 to menu [phi:main::@2->menu]
jsr menu
//SEG17 [5] phi from main::@2 to main::@1 [phi:main::@2->main::@1]
//SEG18 [5] phi (byte) a#1 = (byte) a#12 [phi:main::@2->main::@1#0] -- register_copy
jmp b2
}
//SEG19 menu
menu: {
//SEG20 [9] phi from menu to menu::@2 [phi:menu->menu::@2]
//SEG21 menu::@2
//SEG22 [10] call mode param-assignment [ a#12 ] ( main:2::menu:7 [ a#12 ] )
//SEG23 [12] phi from menu::@2 to mode [phi:menu::@2->mode]
jsr mode
//SEG24 menu::@return
//SEG25 [11] return [ a#12 ] ( main:2::menu:7 [ a#12 ] )
rts
}
//SEG26 mode
mode: {
//SEG27 [13] phi from mode mode::@7 to mode::@1 [phi:mode/mode::@7->mode::@1]
//SEG28 [13] phi (byte) a#12 = (byte) a#1 [phi:mode/mode::@7->mode::@1#0] -- register_copy
//SEG29 [13] phi from mode::@2 to mode::@1 [phi:mode::@2->mode::@1]
//SEG30 mode::@1
//SEG31 mode::@2
b2:
//SEG32 [14] if(*((const byte*) B#0)!=(byte/signed byte/word/signed word/dword/signed dword) 0) goto mode::@1 [ ] ( main:2::menu:7::mode:10 [ ] ) -- _deref_pbuc1_neq_0_then_la1
lda B
cmp #0
bne b2
//SEG33 mode::@7
//SEG34 [15] (byte) a#5 ← *((const byte*) B#0) [ a#5 ] ( main:2::menu:7::mode:10 [ a#5 ] ) -- vbuaa=_deref_pbuc1
jmp b2
}

@ -0,0 +1,21 @@
(label) @3
(label) @begin
(label) @end
(byte*) B
(const byte*) B#0 B = ((byte*))(word/signed word/dword/signed dword) 4096
(byte) a
(byte) a#1 reg byte a 2.6
(byte) a#12 reg byte a 38.0
(byte) a#5 reg byte a 202.0
(void()) main()
(label) main::@1
(label) main::@2
(void()) menu()
(label) menu::@2
(label) menu::@return
(void()) mode()
(label) mode::@1
(label) mode::@2
(label) mode::@7
reg byte a [ a#1 a#12 a#5 ]