1
0
mirror of https://gitlab.com/camelot/kickc.git synced 2024-10-21 02:24:34 +00:00

Removed all calls to ConstantIdentification.isAddressOfUsed(VarRef) since inferedVolatile now handles these situations. Structs are now working. Closes #57

This commit is contained in:
jespergravgaard 2019-06-17 00:11:01 +02:00
parent 40df42067b
commit 4dfc4432c7
29 changed files with 7486 additions and 7268 deletions

View File

@ -32,17 +32,15 @@ public class Pass1EarlyConstantIdentification extends Pass1Base {
if(!isParameter(variableRef)) {
Collection<StatementLValue> assignments = getAssignments(variable);
if(assignments.size() == 1) {
if(!Pass2ConstantIdentification.isAddressOfUsed(variableRef, getProgram())) {
StatementLValue assignment = assignments.iterator().next();
if(assignment instanceof StatementAssignment) {
StatementAssignment assign = (StatementAssignment) assignment;
if(assign.getrValue1() == null && assign.getOperator() == null && assign.getrValue2() instanceof ConstantValue) {
getLog().append("Identified constant variable " + variable.toString(getProgram()));
earlyConstants.add(variableRef);
} else if(assign.getrValue1() == null && assign.getOperator() instanceof OperatorCastPtr && assign.getrValue2() instanceof ConstantValue) {
getLog().append("Identified constant variable " + variable.toString(getProgram()));
earlyConstants.add(variableRef);
}
StatementLValue assignment = assignments.iterator().next();
if(assignment instanceof StatementAssignment) {
StatementAssignment assign = (StatementAssignment) assignment;
if(assign.getrValue1() == null && assign.getOperator() == null && assign.getrValue2() instanceof ConstantValue) {
getLog().append("Identified constant variable " + variable.toString(getProgram()));
earlyConstants.add(variableRef);
} else if(assign.getrValue1() == null && assign.getOperator() instanceof OperatorCastPtr && assign.getrValue2() instanceof ConstantValue) {
getLog().append("Identified constant variable " + variable.toString(getProgram()));
earlyConstants.add(variableRef);
}
}
}
@ -55,6 +53,7 @@ public class Pass1EarlyConstantIdentification extends Pass1Base {
/**
* Examines whether a variable is a procedure parameter
*
* @param variableRef The variable
* @return true if the variable is a procedure parameter
*/

View File

@ -44,29 +44,8 @@ public class Pass2ConstantIdentification extends Pass2SsaOptimization {
Set<VariableRef> constVars = new LinkedHashSet<>(constants.keySet());
for(VariableRef constRef : constVars) {
Variable variable = getProgram().getScope().getVariable(constRef);
ConstantVariableValue constVarVal = constants.get(constRef);
// Weed out all variables that are affected by the address-of operator
if(isAddressOfUsed(constRef, getProgram())) {
// If the assignment has an operator then replace it with the single constant value
if(constVarVal.getAssignment() instanceof StatementAssignment) {
StatementAssignment assignment = (StatementAssignment) constVarVal.getAssignment();
if(assignment.getOperator() != null) {
getLog().append("Constant right-side identified " + assignment.toString(getProgram(), false));
assignment.setOperator(null);
assignment.setrValue1(null);
assignment.setrValue2(constVarVal.getConstantValue());
}
}
// But do not remove the variable
constants.remove(constRef);
continue;
}
Scope constScope = variable.getScope();
ConstantValue constVal = constVarVal.getConstantValue();
SymbolType valueType = SymbolTypeInference.inferType(getScope(), constVal);
SymbolType variableType = variable.getType();
@ -295,17 +274,17 @@ public class Pass2ConstantIdentification extends Pass2SsaOptimization {
/**
* Determines if the variable is ever operated on by the address-of operator
*
* @param symbolRef tHe variable to examine
* @param procedureRef tHe variable to examine
* @return true if the address-of operator is used on the variable
*/
public static boolean isAddressOfUsed(SymbolRef symbolRef, Program program) {
public static boolean isAddressOfUsed(ProcedureRef procedureRef, Program program) {
final boolean[] found = {false};
// Examine all program values in expressions
ProgramValueIterator.execute(program, (programValue, currentStmt, stmtIt, currentBlock) -> {
Value value = programValue.get();
if(value instanceof ConstantSymbolPointer) {
ConstantSymbolPointer constantSymbolPointer = (ConstantSymbolPointer) value;
if(constantSymbolPointer.getToSymbol().equals(symbolRef)) {
if(constantSymbolPointer.getToSymbol().equals(procedureRef)) {
found[0] = true;
}
}
@ -319,20 +298,13 @@ public class Pass2ConstantIdentification extends Pass2SsaOptimization {
for(Statement statement : block.getStatements()) {
if(statement instanceof StatementAssignment) {
StatementAssignment assignment = (StatementAssignment) statement;
if(Operators.ADDRESS_OF.equals(assignment.getOperator()) && symbolRef.equals(assignment.getrValue2())) {
if(Operators.ADDRESS_OF.equals(assignment.getOperator()) && procedureRef.equals(assignment.getrValue2())) {
return true;
}
}
}
}
// If the symbol is part of an unwound struct - look at the struct itself
StructUnwinding structUnwinding = program.getStructUnwinding();
VariableRef structVarRef = structUnwinding.getContainingStructVariable(symbolRef);
if(structVarRef != null) {
return isAddressOfUsed(structVarRef, program);
}
return false;
}

View File

@ -46,12 +46,12 @@ public class Pass4RegisterUpliftPotentialInitialize extends Pass2Base {
Registers.RegisterType registerType = defaultRegister.getType();
List<Registers.Register> potentials = new ArrayList<>();
potentials.add(defaultRegister);
if(registerType.equals(Registers.RegisterType.ZP_BYTE) && !isAddressOfUsed(equivalenceClass) &&!varVolatile(equivalenceClass)) {
if(registerType.equals(Registers.RegisterType.ZP_BYTE) &&!varVolatile(equivalenceClass)) {
potentials.add(Registers.getRegisterA());
potentials.add(Registers.getRegisterX());
potentials.add(Registers.getRegisterY());
}
if(registerType.equals(Registers.RegisterType.ZP_BOOL) && !isAddressOfUsed(equivalenceClass) &&!varVolatile(equivalenceClass)) {
if(registerType.equals(Registers.RegisterType.ZP_BOOL) &&!varVolatile(equivalenceClass)) {
potentials.add(Registers.getRegisterA());
}
registerPotentials.setPotentialRegisters(equivalenceClass, potentials);
@ -75,18 +75,5 @@ public class Pass4RegisterUpliftPotentialInitialize extends Pass2Base {
return false;
}
/**
* Determines if a variable reference is ever created for the variable using the address-of "&" operator
* @param equivalenceClass The equivalence class
* @return true if a variable reference is extracted
*/
private boolean isAddressOfUsed(LiveRangeEquivalenceClass equivalenceClass) {
for(VariableRef variableRef : equivalenceClass.getVariables()) {
if(Pass2ConstantIdentification.isAddressOfUsed(variableRef, getProgram())) {
return true;
}
}
return false;
}
}

View File

@ -40,7 +40,7 @@ public class PassNEliminateUnusedVars extends Pass2SsaOptimization {
if(statement instanceof StatementAssignment) {
StatementAssignment assignment = (StatementAssignment) statement;
LValue lValue = assignment.getlValue();
if(lValue instanceof VariableRef && referenceInfos.isUnused((VariableRef) lValue) && !Pass2ConstantIdentification.isAddressOfUsed((VariableRef) lValue, getProgram())) {
if(lValue instanceof VariableRef && referenceInfos.isUnused((VariableRef) lValue)) {
Variable variable = getScope().getVariable((VariableRef) lValue);
boolean eliminate = false;
if(variable == null) {
@ -74,30 +74,34 @@ public class PassNEliminateUnusedVars extends Pass2SsaOptimization {
} else if(statement instanceof StatementCall) {
StatementCall call = (StatementCall) statement;
LValue lValue = call.getlValue();
if(lValue instanceof VariableRef && referenceInfos.isUnused((VariableRef) lValue) && !Pass2ConstantIdentification.isAddressOfUsed((VariableRef) lValue, getProgram())) {
if(pass2 || getLog().isVerbosePass1CreateSsa()) {
getLog().append("Eliminating unused variable - keeping the call " + lValue.toString(getProgram()));
}
if(lValue instanceof VariableRef && referenceInfos.isUnused((VariableRef) lValue)) {
Variable variable = getScope().getVariable((VariableRef) lValue);
if(variable != null) {
variable.getScope().remove(variable);
if(!variable.isVolatile()) {
if(pass2 || getLog().isVerbosePass1CreateSsa()) {
getLog().append("Eliminating unused variable - keeping the call " + lValue.toString(getProgram()));
}
if(variable != null) {
variable.getScope().remove(variable);
}
call.setlValue(null);
modified = true;
}
call.setlValue(null);
modified = true;
}
} else if(statement instanceof StatementCallPointer) {
StatementCallPointer call = (StatementCallPointer) statement;
LValue lValue = call.getlValue();
if(lValue instanceof VariableRef && referenceInfos.isUnused((VariableRef) lValue) && !Pass2ConstantIdentification.isAddressOfUsed((VariableRef) lValue, getProgram())) {
if(pass2 || getLog().isVerbosePass1CreateSsa()) {
getLog().append("Eliminating unused variable - keeping the call " + lValue.toString(getProgram()));
}
if(lValue instanceof VariableRef && referenceInfos.isUnused((VariableRef) lValue)) {
Variable variable = getScope().getVariable((VariableRef) lValue);
if(variable != null) {
variable.getScope().remove(variable);
if(!variable.isVolatile()) {
if(pass2 || getLog().isVerbosePass1CreateSsa()) {
getLog().append("Eliminating unused variable - keeping the call " + lValue.toString(getProgram()));
}
if(variable != null) {
variable.getScope().remove(variable);
}
call.setlValue(null);
modified = true;
}
call.setlValue(null);
modified = true;
}
} else if(statement instanceof StatementPhiBlock) {
StatementPhiBlock statementPhi = (StatementPhiBlock) statement;
@ -105,16 +109,18 @@ public class PassNEliminateUnusedVars extends Pass2SsaOptimization {
while(phiVarIt.hasNext()) {
StatementPhiBlock.PhiVariable phiVariable = phiVarIt.next();
VariableRef variableRef = phiVariable.getVariable();
if(referenceInfos.isUnused(variableRef) && !Pass2ConstantIdentification.isAddressOfUsed(variableRef, getProgram())) {
if(pass2 || getLog().isVerbosePass1CreateSsa()) {
getLog().append("Eliminating unused variable - keeping the phi block " + variableRef.toString(getProgram()));
}
if(referenceInfos.isUnused(variableRef)) {
Variable variable = getScope().getVariable(variableRef);
if(variable != null) {
variable.getScope().remove(variable);
if(!variable.isVolatile()) {
if(pass2 || getLog().isVerbosePass1CreateSsa()) {
getLog().append("Eliminating unused variable - keeping the phi block " + variableRef.toString(getProgram()));
}
if(variable != null) {
variable.getScope().remove(variable);
}
phiVarIt.remove();
modified = true;
}
phiVarIt.remove();
modified = true;
}
}
}

View File

@ -1257,7 +1257,6 @@ public class TestPrograms {
compileAndCompare("var-init-problem");
}
@Test
public void testFastMultiply8() throws IOException, URISyntaxException {
compileAndCompare("examples/fastmultiply/fastmultiply8");

View File

@ -195,6 +195,9 @@ sprites_irq::@7: scope:[sprites_irq] from sprites_irq::@6
[95] (byte) irq_sprite_ptr#3 ← (byte) irq_sprite_ptr#0 + (byte) 3
to:sprites_irq::@5
sprites_irq::@5: scope:[sprites_irq] from sprites_irq::@11 sprites_irq::@4 sprites_irq::@7
[96] (byte) irq_sprite_ptr#11 ← phi( sprites_irq::@11/(byte) irq_sprite_ptr#1 sprites_irq::@4/(byte) irq_sprite_ptr#2 sprites_irq::@7/(byte) irq_sprite_ptr#3 )
[96] (byte) irq_sprite_ypos#11 ← phi( sprites_irq::@11/(byte) irq_sprite_ypos#1 sprites_irq::@4/(byte) irq_sprite_ypos#2 sprites_irq::@7/(byte) irq_sprite_ypos#3 )
[96] (byte) irq_cnt#3 ← phi( sprites_irq::@11/(byte) irq_cnt#1 sprites_irq::@4/(byte) irq_cnt#2 sprites_irq::@7/(byte) irq_cnt#1 )
[96] (byte) irq_raster_next#4 ← phi( sprites_irq::@11/(byte) irq_raster_next#1 sprites_irq::@4/(byte) irq_raster_next#2 sprites_irq::@7/(byte) irq_raster_next#3 )
[97] *((const byte*) RASTER#0) ← (byte) irq_raster_next#4
[98] *((const byte*) IRQ_STATUS#0) ← (const byte) IRQ_RASTER#0

View File

@ -1492,10 +1492,6 @@ Simplifying expression containing zero SPRITES_YPOS#0 in [89] *((const byte*) SP
Simplifying expression containing zero PLAYFIELD_SPRITE_PTRS_1#0 in [103] *((byte*) PLAYFIELD_SPRITE_PTRS_1#0 + (byte) 0) ← (byte) sprites_irq::ptr#0
Simplifying expression containing zero PLAYFIELD_SPRITE_PTRS_2#0 in [110] *((byte*) PLAYFIELD_SPRITE_PTRS_2#0 + (byte) 0) ← (byte) sprites_irq::ptr#0
Successful SSA optimization PassNSimplifyExpressionWithZero
Eliminating unused variable - keeping the phi block (byte) irq_cnt#3
Eliminating unused variable - keeping the phi block (byte) irq_sprite_ypos#11
Eliminating unused variable - keeping the phi block (byte) irq_sprite_ptr#11
Successful SSA optimization PassNEliminateUnusedVars
Removing unused block loop::@return
Successful SSA optimization Pass2EliminateUnusedBlocks
Adding number conversion cast (unumber) 4 in if((byte) sprites_init::s#1!=(number) 4) goto sprites_init::@1
@ -1698,7 +1694,7 @@ CALL GRAPH
Calls in [] to main:12
Calls in [main] to sprites_init:24 sprites_irq_init:40 loop:42
Created 9 initial phi equivalence classes
Created 12 initial phi equivalence classes
Coalesced [45] main::s#6 ← main::s#1
Coalesced [46] main::xpos#6 ← main::xpos#1
Coalesced [47] main::ypos#6 ← main::ypos#1
@ -1709,9 +1705,18 @@ Coalesced [62] loop::idx#4 ← loop::idx#1
Coalesced [87] sprites_init::s#3 ← sprites_init::s#1
Coalesced [88] sprites_init::xpos#3 ← sprites_init::xpos#1
Coalesced [112] irq_raster_next#26 ← irq_raster_next#3
Coalesced [121] irq_raster_next#25 ← irq_raster_next#2
Coalesced [127] irq_raster_next#24 ← irq_raster_next#1
Coalesced down to 9 phi equivalence classes
Coalesced [113] irq_cnt#22 ← irq_cnt#1
Coalesced [114] irq_sprite_ypos#26 ← irq_sprite_ypos#3
Coalesced [115] irq_sprite_ptr#20 ← irq_sprite_ptr#3
Coalesced [124] irq_raster_next#25 ← irq_raster_next#2
Coalesced [125] irq_cnt#21 ← irq_cnt#2
Coalesced [126] irq_sprite_ypos#25 ← irq_sprite_ypos#2
Coalesced [127] irq_sprite_ptr#19 ← irq_sprite_ptr#2
Coalesced [133] irq_raster_next#24 ← irq_raster_next#1
Coalesced (already) [134] irq_cnt#20 ← irq_cnt#1
Coalesced [135] irq_sprite_ypos#24 ← irq_sprite_ypos#1
Coalesced [136] irq_sprite_ptr#18 ← irq_sprite_ptr#1
Coalesced down to 12 phi equivalence classes
Culled Empty Block (label) toSpritePtr1_@return
Culled Empty Block (label) @11
Culled Empty Block (label) main::vicSelectGfxBank1_toDd001_@return
@ -1954,6 +1959,9 @@ sprites_irq::@7: scope:[sprites_irq] from sprites_irq::@6
[95] (byte) irq_sprite_ptr#3 ← (byte) irq_sprite_ptr#0 + (byte) 3
to:sprites_irq::@5
sprites_irq::@5: scope:[sprites_irq] from sprites_irq::@11 sprites_irq::@4 sprites_irq::@7
[96] (byte) irq_sprite_ptr#11 ← phi( sprites_irq::@11/(byte) irq_sprite_ptr#1 sprites_irq::@4/(byte) irq_sprite_ptr#2 sprites_irq::@7/(byte) irq_sprite_ptr#3 )
[96] (byte) irq_sprite_ypos#11 ← phi( sprites_irq::@11/(byte) irq_sprite_ypos#1 sprites_irq::@4/(byte) irq_sprite_ypos#2 sprites_irq::@7/(byte) irq_sprite_ypos#3 )
[96] (byte) irq_cnt#3 ← phi( sprites_irq::@11/(byte) irq_cnt#1 sprites_irq::@4/(byte) irq_cnt#2 sprites_irq::@7/(byte) irq_cnt#1 )
[96] (byte) irq_raster_next#4 ← phi( sprites_irq::@11/(byte) irq_raster_next#1 sprites_irq::@4/(byte) irq_raster_next#2 sprites_irq::@7/(byte) irq_raster_next#3 )
[97] *((const byte*) RASTER#0) ← (byte) irq_raster_next#4
[98] *((const byte*) IRQ_STATUS#0) ← (const byte) IRQ_RASTER#0
@ -2024,8 +2032,9 @@ VARIABLE REGISTER WEIGHTS
(byte*) VIC_CONTROL
(byte) irq_cnt
(byte) irq_cnt#0 0.17391304347826086
(byte) irq_cnt#1 3.0
(byte) irq_cnt#2 20.0
(byte) irq_cnt#1 1.0
(byte) irq_cnt#2 1.0
(byte) irq_cnt#3 60.0
(byte) irq_raster_next
(byte) irq_raster_next#0 0.3076923076923077
(byte) irq_raster_next#1 1.0
@ -2034,14 +2043,16 @@ VARIABLE REGISTER WEIGHTS
(byte) irq_raster_next#4 8.0
(byte) irq_sprite_ptr
(byte) irq_sprite_ptr#0 0.25806451612903225
(byte) irq_sprite_ptr#1 20.0
(byte) irq_sprite_ptr#2 20.0
(byte) irq_sprite_ptr#3 20.0
(byte) irq_sprite_ptr#1 4.0
(byte) irq_sprite_ptr#11 60.0
(byte) irq_sprite_ptr#2 4.0
(byte) irq_sprite_ptr#3 4.0
(byte) irq_sprite_ypos
(byte) irq_sprite_ypos#0 0.27586206896551724
(byte) irq_sprite_ypos#1 20.0
(byte) irq_sprite_ypos#2 20.0
(byte) irq_sprite_ypos#3 20.0
(byte) irq_sprite_ypos#1 1.3333333333333333
(byte) irq_sprite_ypos#11 60.0
(byte) irq_sprite_ypos#2 2.0
(byte) irq_sprite_ypos#3 2.0
(void()) loop()
(byte~) loop::$1 202.0
(byte) loop::idx
@ -2137,15 +2148,13 @@ Initial phi equivalence classes
[ sprites_init::s#2 sprites_init::s#1 ]
[ sprites_init::xpos#2 sprites_init::xpos#1 ]
[ irq_raster_next#4 irq_raster_next#1 irq_raster_next#2 irq_raster_next#3 ]
[ irq_cnt#3 irq_cnt#1 irq_cnt#2 ]
[ irq_sprite_ypos#11 irq_sprite_ypos#1 irq_sprite_ypos#2 irq_sprite_ypos#3 ]
[ irq_sprite_ptr#11 irq_sprite_ptr#1 irq_sprite_ptr#2 irq_sprite_ptr#3 ]
Coalescing volatile variable equivalence classes [ irq_raster_next#0 ] and [ irq_raster_next#4 irq_raster_next#1 irq_raster_next#2 irq_raster_next#3 ]
Coalescing volatile variable equivalence classes [ irq_sprite_ypos#0 ] and [ irq_sprite_ypos#1 ]
Coalescing volatile variable equivalence classes [ irq_sprite_ypos#0 irq_sprite_ypos#1 ] and [ irq_sprite_ypos#2 ]
Coalescing volatile variable equivalence classes [ irq_sprite_ypos#0 irq_sprite_ypos#1 irq_sprite_ypos#2 ] and [ irq_sprite_ypos#3 ]
Coalescing volatile variable equivalence classes [ irq_sprite_ptr#0 ] and [ irq_sprite_ptr#1 ]
Coalescing volatile variable equivalence classes [ irq_sprite_ptr#0 irq_sprite_ptr#1 ] and [ irq_sprite_ptr#2 ]
Coalescing volatile variable equivalence classes [ irq_sprite_ptr#0 irq_sprite_ptr#1 irq_sprite_ptr#2 ] and [ irq_sprite_ptr#3 ]
Coalescing volatile variable equivalence classes [ irq_cnt#0 ] and [ irq_cnt#1 ]
Coalescing volatile variable equivalence classes [ irq_cnt#0 irq_cnt#1 ] and [ irq_cnt#2 ]
Coalescing volatile variable equivalence classes [ irq_sprite_ypos#0 ] and [ irq_sprite_ypos#11 irq_sprite_ypos#1 irq_sprite_ypos#2 irq_sprite_ypos#3 ]
Coalescing volatile variable equivalence classes [ irq_sprite_ptr#0 ] and [ irq_sprite_ptr#11 irq_sprite_ptr#1 irq_sprite_ptr#2 irq_sprite_ptr#3 ]
Coalescing volatile variable equivalence classes [ irq_cnt#0 ] and [ irq_cnt#3 irq_cnt#1 irq_cnt#2 ]
Added variable main::s2#0 to zero page equivalence class [ main::s2#0 ]
Added variable main::$6 to zero page equivalence class [ main::$6 ]
Added variable loop::$1 to zero page equivalence class [ loop::$1 ]
@ -2169,9 +2178,9 @@ Complete equivalence classes
[ sprites_irq::raster_sprite_gfx_modify#0 ]
[ render_screen_showing#0 ]
[ irq_raster_next#0 irq_raster_next#4 irq_raster_next#1 irq_raster_next#2 irq_raster_next#3 ]
[ irq_sprite_ypos#0 irq_sprite_ypos#1 irq_sprite_ypos#2 irq_sprite_ypos#3 ]
[ irq_sprite_ptr#0 irq_sprite_ptr#1 irq_sprite_ptr#2 irq_sprite_ptr#3 ]
[ irq_cnt#0 irq_cnt#1 irq_cnt#2 ]
[ irq_sprite_ypos#0 irq_sprite_ypos#11 irq_sprite_ypos#1 irq_sprite_ypos#2 irq_sprite_ypos#3 ]
[ irq_sprite_ptr#0 irq_sprite_ptr#11 irq_sprite_ptr#1 irq_sprite_ptr#2 irq_sprite_ptr#3 ]
[ irq_cnt#0 irq_cnt#3 irq_cnt#1 irq_cnt#2 ]
[ main::s2#0 ]
[ main::$6 ]
[ loop::$1 ]
@ -2194,9 +2203,9 @@ Allocated zp ZP_BYTE:9 [ sprites_init::xpos#2 sprites_init::xpos#1 ]
Allocated zp ZP_BYTE:10 [ sprites_irq::raster_sprite_gfx_modify#0 ]
Allocated zp ZP_BYTE:11 [ render_screen_showing#0 ]
Allocated zp ZP_BYTE:12 [ irq_raster_next#0 irq_raster_next#4 irq_raster_next#1 irq_raster_next#2 irq_raster_next#3 ]
Allocated zp ZP_BYTE:13 [ irq_sprite_ypos#0 irq_sprite_ypos#1 irq_sprite_ypos#2 irq_sprite_ypos#3 ]
Allocated zp ZP_BYTE:14 [ irq_sprite_ptr#0 irq_sprite_ptr#1 irq_sprite_ptr#2 irq_sprite_ptr#3 ]
Allocated zp ZP_BYTE:15 [ irq_cnt#0 irq_cnt#1 irq_cnt#2 ]
Allocated zp ZP_BYTE:13 [ irq_sprite_ypos#0 irq_sprite_ypos#11 irq_sprite_ypos#1 irq_sprite_ypos#2 irq_sprite_ypos#3 ]
Allocated zp ZP_BYTE:14 [ irq_sprite_ptr#0 irq_sprite_ptr#11 irq_sprite_ptr#1 irq_sprite_ptr#2 irq_sprite_ptr#3 ]
Allocated zp ZP_BYTE:15 [ irq_cnt#0 irq_cnt#3 irq_cnt#1 irq_cnt#2 ]
Allocated zp ZP_BYTE:16 [ main::s2#0 ]
Allocated zp ZP_BYTE:17 [ main::$6 ]
Allocated zp ZP_BYTE:18 [ loop::$1 ]
@ -2769,22 +2778,25 @@ sprites_irq: {
b5_from_b11:
b5_from_b4:
b5_from_b7:
//SEG159 [96] phi (byte) irq_raster_next#4 = (byte) irq_raster_next#1 [phi:sprites_irq::@11/sprites_irq::@4/sprites_irq::@7->sprites_irq::@5#0] -- register_copy
//SEG159 [96] phi (byte) irq_sprite_ptr#11 = (byte) irq_sprite_ptr#1 [phi:sprites_irq::@11/sprites_irq::@4/sprites_irq::@7->sprites_irq::@5#0] -- register_copy
//SEG160 [96] phi (byte) irq_sprite_ypos#11 = (byte) irq_sprite_ypos#1 [phi:sprites_irq::@11/sprites_irq::@4/sprites_irq::@7->sprites_irq::@5#1] -- register_copy
//SEG161 [96] phi (byte) irq_cnt#3 = (byte) irq_cnt#1 [phi:sprites_irq::@11/sprites_irq::@4/sprites_irq::@7->sprites_irq::@5#2] -- register_copy
//SEG162 [96] phi (byte) irq_raster_next#4 = (byte) irq_raster_next#1 [phi:sprites_irq::@11/sprites_irq::@4/sprites_irq::@7->sprites_irq::@5#3] -- register_copy
jmp b5
//SEG160 sprites_irq::@5
//SEG163 sprites_irq::@5
b5:
//SEG161 [97] *((const byte*) RASTER#0) ← (byte) irq_raster_next#4 -- _deref_pbuc1=vbuz1
//SEG164 [97] *((const byte*) RASTER#0) ← (byte) irq_raster_next#4 -- _deref_pbuc1=vbuz1
// Setup next interrupt
lda irq_raster_next
sta RASTER
//SEG162 [98] *((const byte*) IRQ_STATUS#0) ← (const byte) IRQ_RASTER#0 -- _deref_pbuc1=vbuc2
//SEG165 [98] *((const byte*) IRQ_STATUS#0) ← (const byte) IRQ_RASTER#0 -- _deref_pbuc1=vbuc2
// Acknowledge the IRQ and setup the next one
lda #IRQ_RASTER
sta IRQ_STATUS
jmp breturn
//SEG163 sprites_irq::@return
//SEG166 sprites_irq::@return
breturn:
//SEG164 [99] return - exit interrupt(HARDWARE_CLOBBER)
//SEG167 [99] return - exit interrupt(HARDWARE_CLOBBER)
rega:
lda #00
regx:
@ -2792,64 +2804,64 @@ sprites_irq: {
regy:
ldy #00
rti
//SEG165 sprites_irq::@4
//SEG168 sprites_irq::@4
b4:
//SEG166 [100] (byte) irq_cnt#2 ← (byte) 0 -- vbuz1=vbuc1
//SEG169 [100] (byte) irq_cnt#2 ← (byte) 0 -- vbuz1=vbuc1
lda #0
sta irq_cnt
//SEG167 [101] (byte) irq_raster_next#2 ← (const byte) IRQ_RASTER_FIRST#0 -- vbuz1=vbuc1
//SEG170 [101] (byte) irq_raster_next#2 ← (const byte) IRQ_RASTER_FIRST#0 -- vbuz1=vbuc1
lda #IRQ_RASTER_FIRST
sta irq_raster_next
//SEG168 [102] (byte) irq_sprite_ypos#2 ← (byte) irq_sprite_ypos#0 + (byte) $15 -- vbuz1=vbuz1_plus_vbuc1
//SEG171 [102] (byte) irq_sprite_ypos#2 ← (byte) irq_sprite_ypos#0 + (byte) $15 -- vbuz1=vbuz1_plus_vbuc1
lax irq_sprite_ypos
axs #-[$15]
stx irq_sprite_ypos
//SEG169 [103] (byte) irq_sprite_ptr#2 ← (byte) irq_sprite_ptr#0 + (byte) 3 -- vbuz1=vbuz1_plus_vbuc1
//SEG172 [103] (byte) irq_sprite_ptr#2 ← (byte) irq_sprite_ptr#0 + (byte) 3 -- vbuz1=vbuz1_plus_vbuc1
lax irq_sprite_ptr
axs #-[3]
stx irq_sprite_ptr
jmp b5_from_b4
//SEG170 sprites_irq::@3
//SEG173 sprites_irq::@3
b3:
//SEG171 [104] (byte) irq_raster_next#1 ← (byte) irq_raster_next#0 + (byte) $15 -- vbuz1=vbuz1_plus_vbuc1
//SEG174 [104] (byte) irq_raster_next#1 ← (byte) irq_raster_next#0 + (byte) $15 -- vbuz1=vbuz1_plus_vbuc1
lax irq_raster_next
axs #-[$15]
stx irq_raster_next
//SEG172 [105] (byte) irq_sprite_ypos#1 ← (const byte) SPRITES_FIRST_YPOS#0 -- vbuz1=vbuc1
//SEG175 [105] (byte) irq_sprite_ypos#1 ← (const byte) SPRITES_FIRST_YPOS#0 -- vbuz1=vbuc1
lda #SPRITES_FIRST_YPOS
sta irq_sprite_ypos
//SEG173 [106] phi from sprites_irq::@3 to sprites_irq::toSpritePtr2 [phi:sprites_irq::@3->sprites_irq::toSpritePtr2]
//SEG176 [106] phi from sprites_irq::@3 to sprites_irq::toSpritePtr2 [phi:sprites_irq::@3->sprites_irq::toSpritePtr2]
toSpritePtr2_from_b3:
jmp toSpritePtr2
//SEG174 sprites_irq::toSpritePtr2
//SEG177 sprites_irq::toSpritePtr2
toSpritePtr2:
jmp b11
//SEG175 sprites_irq::@11
//SEG178 sprites_irq::@11
b11:
//SEG176 [107] (byte) irq_sprite_ptr#1 ← (const byte) sprites_irq::toSpritePtr2_return#0 -- vbuz1=vbuc1
//SEG179 [107] (byte) irq_sprite_ptr#1 ← (const byte) sprites_irq::toSpritePtr2_return#0 -- vbuz1=vbuc1
lda #toSpritePtr2_return
sta irq_sprite_ptr
jmp b5_from_b11
//SEG177 sprites_irq::@1
//SEG180 sprites_irq::@1
b1:
//SEG178 [108] *((const byte*) PLAYFIELD_SPRITE_PTRS_1#0) ← (byte) sprites_irq::ptr#0 -- _deref_pbuc1=vbuz1
//SEG181 [108] *((const byte*) PLAYFIELD_SPRITE_PTRS_1#0) ← (byte) sprites_irq::ptr#0 -- _deref_pbuc1=vbuz1
lda ptr
sta PLAYFIELD_SPRITE_PTRS_1
//SEG179 [109] (byte) sprites_irq::ptr#1 ← ++ (byte) sprites_irq::ptr#0 -- vbuz1=_inc_vbuz2
//SEG182 [109] (byte) sprites_irq::ptr#1 ← ++ (byte) sprites_irq::ptr#0 -- vbuz1=_inc_vbuz2
ldy ptr
iny
sty ptr_1
//SEG180 [110] *((const byte*) PLAYFIELD_SPRITE_PTRS_1#0+(byte) 1) ← (byte) sprites_irq::ptr#1 -- _deref_pbuc1=vbuz1
//SEG183 [110] *((const byte*) PLAYFIELD_SPRITE_PTRS_1#0+(byte) 1) ← (byte) sprites_irq::ptr#1 -- _deref_pbuc1=vbuz1
lda ptr_1
sta PLAYFIELD_SPRITE_PTRS_1+1
//SEG181 [111] *((const byte*) PLAYFIELD_SPRITE_PTRS_1#0+(byte) 2) ← (byte) sprites_irq::ptr#1 -- _deref_pbuc1=vbuz1
//SEG184 [111] *((const byte*) PLAYFIELD_SPRITE_PTRS_1#0+(byte) 2) ← (byte) sprites_irq::ptr#1 -- _deref_pbuc1=vbuz1
lda ptr_1
sta PLAYFIELD_SPRITE_PTRS_1+2
//SEG182 [112] (byte) sprites_irq::ptr#2 ← ++ (byte) sprites_irq::ptr#1 -- vbuz1=_inc_vbuz2
//SEG185 [112] (byte) sprites_irq::ptr#2 ← ++ (byte) sprites_irq::ptr#1 -- vbuz1=_inc_vbuz2
ldy ptr_1
iny
sty ptr_2
//SEG183 [113] *((const byte*) PLAYFIELD_SPRITE_PTRS_1#0+(byte) 3) ← (byte) sprites_irq::ptr#2 -- _deref_pbuc1=vbuz1
//SEG186 [113] *((const byte*) PLAYFIELD_SPRITE_PTRS_1#0+(byte) 3) ← (byte) sprites_irq::ptr#2 -- _deref_pbuc1=vbuz1
lda ptr_2
sta PLAYFIELD_SPRITE_PTRS_1+3
jmp b2
@ -2931,20 +2943,20 @@ Statement [81] if(*((const byte*) RASTER#0)<(byte) sprites_irq::raster_sprite_gf
Statement [83] if((byte) render_screen_showing#0==(byte) 0) goto sprites_irq::@1 [ irq_raster_next#0 irq_sprite_ypos#0 irq_sprite_ptr#0 irq_cnt#0 sprites_irq::ptr#0 ] ( [ irq_raster_next#0 irq_sprite_ypos#0 irq_sprite_ptr#0 irq_cnt#0 sprites_irq::ptr#0 ] ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp ZP_BYTE:22 [ sprites_irq::ptr#0 ]
Statement [91] if((byte) irq_cnt#1==(byte) 9) goto sprites_irq::@3 [ irq_raster_next#0 irq_sprite_ypos#0 irq_sprite_ptr#0 irq_cnt#1 ] ( [ irq_raster_next#0 irq_sprite_ypos#0 irq_sprite_ptr#0 irq_cnt#1 ] ) always clobbers reg byte a
Statement [92] if((byte) irq_cnt#1==(byte) $a) goto sprites_irq::@4 [ irq_raster_next#0 irq_sprite_ypos#0 irq_sprite_ptr#0 ] ( [ irq_raster_next#0 irq_sprite_ypos#0 irq_sprite_ptr#0 ] ) always clobbers reg byte a
Statement [93] (byte) irq_raster_next#3 ← (byte) irq_raster_next#0 + (byte) $14 [ irq_sprite_ypos#0 irq_sprite_ptr#0 irq_raster_next#3 ] ( [ irq_sprite_ypos#0 irq_sprite_ptr#0 irq_raster_next#3 ] ) always clobbers reg byte a reg byte x
Statement [94] (byte) irq_sprite_ypos#3 ← (byte) irq_sprite_ypos#0 + (byte) $15 [ irq_sprite_ptr#0 irq_raster_next#3 ] ( [ irq_sprite_ptr#0 irq_raster_next#3 ] ) always clobbers reg byte a reg byte x
Statement [95] (byte) irq_sprite_ptr#3 ← (byte) irq_sprite_ptr#0 + (byte) 3 [ irq_raster_next#3 ] ( [ irq_raster_next#3 ] ) always clobbers reg byte a reg byte x
Statement [92] if((byte) irq_cnt#1==(byte) $a) goto sprites_irq::@4 [ irq_raster_next#0 irq_sprite_ypos#0 irq_sprite_ptr#0 irq_cnt#1 ] ( [ irq_raster_next#0 irq_sprite_ypos#0 irq_sprite_ptr#0 irq_cnt#1 ] ) always clobbers reg byte a
Statement [93] (byte) irq_raster_next#3 ← (byte) irq_raster_next#0 + (byte) $14 [ irq_sprite_ypos#0 irq_sprite_ptr#0 irq_cnt#1 irq_raster_next#3 ] ( [ irq_sprite_ypos#0 irq_sprite_ptr#0 irq_cnt#1 irq_raster_next#3 ] ) always clobbers reg byte a reg byte x
Statement [94] (byte) irq_sprite_ypos#3 ← (byte) irq_sprite_ypos#0 + (byte) $15 [ irq_sprite_ptr#0 irq_cnt#1 irq_raster_next#3 irq_sprite_ypos#3 ] ( [ irq_sprite_ptr#0 irq_cnt#1 irq_raster_next#3 irq_sprite_ypos#3 ] ) always clobbers reg byte a reg byte x
Statement [95] (byte) irq_sprite_ptr#3 ← (byte) irq_sprite_ptr#0 + (byte) 3 [ irq_cnt#1 irq_raster_next#3 irq_sprite_ypos#3 irq_sprite_ptr#3 ] ( [ irq_cnt#1 irq_raster_next#3 irq_sprite_ypos#3 irq_sprite_ptr#3 ] ) always clobbers reg byte a reg byte x
Statement [97] *((const byte*) RASTER#0) ← (byte) irq_raster_next#4 [ ] ( [ ] ) always clobbers reg byte a
Statement [98] *((const byte*) IRQ_STATUS#0) ← (const byte) IRQ_RASTER#0 [ ] ( [ ] ) always clobbers reg byte a
Statement [99] return [ ] ( [ ] ) always clobbers reg byte a reg byte x reg byte y
Statement [100] (byte) irq_cnt#2 ← (byte) 0 [ irq_sprite_ypos#0 irq_sprite_ptr#0 ] ( [ irq_sprite_ypos#0 irq_sprite_ptr#0 ] ) always clobbers reg byte a
Statement [101] (byte) irq_raster_next#2 ← (const byte) IRQ_RASTER_FIRST#0 [ irq_sprite_ypos#0 irq_sprite_ptr#0 irq_raster_next#2 ] ( [ irq_sprite_ypos#0 irq_sprite_ptr#0 irq_raster_next#2 ] ) always clobbers reg byte a
Statement [102] (byte) irq_sprite_ypos#2 ← (byte) irq_sprite_ypos#0 + (byte) $15 [ irq_sprite_ptr#0 irq_raster_next#2 ] ( [ irq_sprite_ptr#0 irq_raster_next#2 ] ) always clobbers reg byte a reg byte x
Statement [103] (byte) irq_sprite_ptr#2 ← (byte) irq_sprite_ptr#0 + (byte) 3 [ irq_raster_next#2 ] ( [ irq_raster_next#2 ] ) always clobbers reg byte a reg byte x
Statement [104] (byte) irq_raster_next#1 ← (byte) irq_raster_next#0 + (byte) $15 [ irq_raster_next#1 ] ( [ irq_raster_next#1 ] ) always clobbers reg byte a reg byte x
Statement [105] (byte) irq_sprite_ypos#1 ← (const byte) SPRITES_FIRST_YPOS#0 [ irq_raster_next#1 ] ( [ irq_raster_next#1 ] ) always clobbers reg byte a
Statement [107] (byte) irq_sprite_ptr#1 ← (const byte) sprites_irq::toSpritePtr2_return#0 [ irq_raster_next#1 ] ( [ irq_raster_next#1 ] ) always clobbers reg byte a
Statement [100] (byte) irq_cnt#2 ← (byte) 0 [ irq_sprite_ypos#0 irq_sprite_ptr#0 irq_cnt#2 ] ( [ irq_sprite_ypos#0 irq_sprite_ptr#0 irq_cnt#2 ] ) always clobbers reg byte a
Statement [101] (byte) irq_raster_next#2 ← (const byte) IRQ_RASTER_FIRST#0 [ irq_sprite_ypos#0 irq_sprite_ptr#0 irq_raster_next#2 irq_cnt#2 ] ( [ irq_sprite_ypos#0 irq_sprite_ptr#0 irq_raster_next#2 irq_cnt#2 ] ) always clobbers reg byte a
Statement [102] (byte) irq_sprite_ypos#2 ← (byte) irq_sprite_ypos#0 + (byte) $15 [ irq_sprite_ptr#0 irq_raster_next#2 irq_cnt#2 irq_sprite_ypos#2 ] ( [ irq_sprite_ptr#0 irq_raster_next#2 irq_cnt#2 irq_sprite_ypos#2 ] ) always clobbers reg byte a reg byte x
Statement [103] (byte) irq_sprite_ptr#2 ← (byte) irq_sprite_ptr#0 + (byte) 3 [ irq_raster_next#2 irq_cnt#2 irq_sprite_ypos#2 irq_sprite_ptr#2 ] ( [ irq_raster_next#2 irq_cnt#2 irq_sprite_ypos#2 irq_sprite_ptr#2 ] ) always clobbers reg byte a reg byte x
Statement [104] (byte) irq_raster_next#1 ← (byte) irq_raster_next#0 + (byte) $15 [ irq_cnt#1 irq_raster_next#1 ] ( [ irq_cnt#1 irq_raster_next#1 ] ) always clobbers reg byte a reg byte x
Statement [105] (byte) irq_sprite_ypos#1 ← (const byte) SPRITES_FIRST_YPOS#0 [ irq_cnt#1 irq_raster_next#1 irq_sprite_ypos#1 ] ( [ irq_cnt#1 irq_raster_next#1 irq_sprite_ypos#1 ] ) always clobbers reg byte a
Statement [107] (byte) irq_sprite_ptr#1 ← (const byte) sprites_irq::toSpritePtr2_return#0 [ irq_cnt#1 irq_raster_next#1 irq_sprite_ypos#1 irq_sprite_ptr#1 ] ( [ irq_cnt#1 irq_raster_next#1 irq_sprite_ypos#1 irq_sprite_ptr#1 ] ) always clobbers reg byte a
Statement [1] (byte) render_screen_showing#0 ← (byte) 0 [ ] ( ) always clobbers reg byte a
Statement [3] (byte) irq_raster_next#0 ← (const byte) IRQ_RASTER_FIRST#0 [ ] ( ) always clobbers reg byte a
Statement [4] (byte) irq_sprite_ypos#0 ← (const byte) SPRITES_FIRST_YPOS#0+(byte) $15 [ ] ( ) always clobbers reg byte a
@ -2985,20 +2997,20 @@ Statement [69] (byte) sprites_init::xpos#1 ← (byte) sprites_init::xpos#2 + (by
Statement [81] if(*((const byte*) RASTER#0)<(byte) sprites_irq::raster_sprite_gfx_modify#0) goto sprites_irq::@8 [ render_screen_showing#0 irq_raster_next#0 irq_sprite_ypos#0 irq_sprite_ptr#0 irq_cnt#0 sprites_irq::raster_sprite_gfx_modify#0 ] ( [ render_screen_showing#0 irq_raster_next#0 irq_sprite_ypos#0 irq_sprite_ptr#0 irq_cnt#0 sprites_irq::raster_sprite_gfx_modify#0 ] ) always clobbers reg byte a
Statement [83] if((byte) render_screen_showing#0==(byte) 0) goto sprites_irq::@1 [ irq_raster_next#0 irq_sprite_ypos#0 irq_sprite_ptr#0 irq_cnt#0 sprites_irq::ptr#0 ] ( [ irq_raster_next#0 irq_sprite_ypos#0 irq_sprite_ptr#0 irq_cnt#0 sprites_irq::ptr#0 ] ) always clobbers reg byte a
Statement [91] if((byte) irq_cnt#1==(byte) 9) goto sprites_irq::@3 [ irq_raster_next#0 irq_sprite_ypos#0 irq_sprite_ptr#0 irq_cnt#1 ] ( [ irq_raster_next#0 irq_sprite_ypos#0 irq_sprite_ptr#0 irq_cnt#1 ] ) always clobbers reg byte a
Statement [92] if((byte) irq_cnt#1==(byte) $a) goto sprites_irq::@4 [ irq_raster_next#0 irq_sprite_ypos#0 irq_sprite_ptr#0 ] ( [ irq_raster_next#0 irq_sprite_ypos#0 irq_sprite_ptr#0 ] ) always clobbers reg byte a
Statement [93] (byte) irq_raster_next#3 ← (byte) irq_raster_next#0 + (byte) $14 [ irq_sprite_ypos#0 irq_sprite_ptr#0 irq_raster_next#3 ] ( [ irq_sprite_ypos#0 irq_sprite_ptr#0 irq_raster_next#3 ] ) always clobbers reg byte a reg byte x
Statement [94] (byte) irq_sprite_ypos#3 ← (byte) irq_sprite_ypos#0 + (byte) $15 [ irq_sprite_ptr#0 irq_raster_next#3 ] ( [ irq_sprite_ptr#0 irq_raster_next#3 ] ) always clobbers reg byte a reg byte x
Statement [95] (byte) irq_sprite_ptr#3 ← (byte) irq_sprite_ptr#0 + (byte) 3 [ irq_raster_next#3 ] ( [ irq_raster_next#3 ] ) always clobbers reg byte a reg byte x
Statement [92] if((byte) irq_cnt#1==(byte) $a) goto sprites_irq::@4 [ irq_raster_next#0 irq_sprite_ypos#0 irq_sprite_ptr#0 irq_cnt#1 ] ( [ irq_raster_next#0 irq_sprite_ypos#0 irq_sprite_ptr#0 irq_cnt#1 ] ) always clobbers reg byte a
Statement [93] (byte) irq_raster_next#3 ← (byte) irq_raster_next#0 + (byte) $14 [ irq_sprite_ypos#0 irq_sprite_ptr#0 irq_cnt#1 irq_raster_next#3 ] ( [ irq_sprite_ypos#0 irq_sprite_ptr#0 irq_cnt#1 irq_raster_next#3 ] ) always clobbers reg byte a reg byte x
Statement [94] (byte) irq_sprite_ypos#3 ← (byte) irq_sprite_ypos#0 + (byte) $15 [ irq_sprite_ptr#0 irq_cnt#1 irq_raster_next#3 irq_sprite_ypos#3 ] ( [ irq_sprite_ptr#0 irq_cnt#1 irq_raster_next#3 irq_sprite_ypos#3 ] ) always clobbers reg byte a reg byte x
Statement [95] (byte) irq_sprite_ptr#3 ← (byte) irq_sprite_ptr#0 + (byte) 3 [ irq_cnt#1 irq_raster_next#3 irq_sprite_ypos#3 irq_sprite_ptr#3 ] ( [ irq_cnt#1 irq_raster_next#3 irq_sprite_ypos#3 irq_sprite_ptr#3 ] ) always clobbers reg byte a reg byte x
Statement [97] *((const byte*) RASTER#0) ← (byte) irq_raster_next#4 [ ] ( [ ] ) always clobbers reg byte a
Statement [98] *((const byte*) IRQ_STATUS#0) ← (const byte) IRQ_RASTER#0 [ ] ( [ ] ) always clobbers reg byte a
Statement [99] return [ ] ( [ ] ) always clobbers reg byte a reg byte x reg byte y
Statement [100] (byte) irq_cnt#2 ← (byte) 0 [ irq_sprite_ypos#0 irq_sprite_ptr#0 ] ( [ irq_sprite_ypos#0 irq_sprite_ptr#0 ] ) always clobbers reg byte a
Statement [101] (byte) irq_raster_next#2 ← (const byte) IRQ_RASTER_FIRST#0 [ irq_sprite_ypos#0 irq_sprite_ptr#0 irq_raster_next#2 ] ( [ irq_sprite_ypos#0 irq_sprite_ptr#0 irq_raster_next#2 ] ) always clobbers reg byte a
Statement [102] (byte) irq_sprite_ypos#2 ← (byte) irq_sprite_ypos#0 + (byte) $15 [ irq_sprite_ptr#0 irq_raster_next#2 ] ( [ irq_sprite_ptr#0 irq_raster_next#2 ] ) always clobbers reg byte a reg byte x
Statement [103] (byte) irq_sprite_ptr#2 ← (byte) irq_sprite_ptr#0 + (byte) 3 [ irq_raster_next#2 ] ( [ irq_raster_next#2 ] ) always clobbers reg byte a reg byte x
Statement [104] (byte) irq_raster_next#1 ← (byte) irq_raster_next#0 + (byte) $15 [ irq_raster_next#1 ] ( [ irq_raster_next#1 ] ) always clobbers reg byte a reg byte x
Statement [105] (byte) irq_sprite_ypos#1 ← (const byte) SPRITES_FIRST_YPOS#0 [ irq_raster_next#1 ] ( [ irq_raster_next#1 ] ) always clobbers reg byte a
Statement [107] (byte) irq_sprite_ptr#1 ← (const byte) sprites_irq::toSpritePtr2_return#0 [ irq_raster_next#1 ] ( [ irq_raster_next#1 ] ) always clobbers reg byte a
Statement [100] (byte) irq_cnt#2 ← (byte) 0 [ irq_sprite_ypos#0 irq_sprite_ptr#0 irq_cnt#2 ] ( [ irq_sprite_ypos#0 irq_sprite_ptr#0 irq_cnt#2 ] ) always clobbers reg byte a
Statement [101] (byte) irq_raster_next#2 ← (const byte) IRQ_RASTER_FIRST#0 [ irq_sprite_ypos#0 irq_sprite_ptr#0 irq_raster_next#2 irq_cnt#2 ] ( [ irq_sprite_ypos#0 irq_sprite_ptr#0 irq_raster_next#2 irq_cnt#2 ] ) always clobbers reg byte a
Statement [102] (byte) irq_sprite_ypos#2 ← (byte) irq_sprite_ypos#0 + (byte) $15 [ irq_sprite_ptr#0 irq_raster_next#2 irq_cnt#2 irq_sprite_ypos#2 ] ( [ irq_sprite_ptr#0 irq_raster_next#2 irq_cnt#2 irq_sprite_ypos#2 ] ) always clobbers reg byte a reg byte x
Statement [103] (byte) irq_sprite_ptr#2 ← (byte) irq_sprite_ptr#0 + (byte) 3 [ irq_raster_next#2 irq_cnt#2 irq_sprite_ypos#2 irq_sprite_ptr#2 ] ( [ irq_raster_next#2 irq_cnt#2 irq_sprite_ypos#2 irq_sprite_ptr#2 ] ) always clobbers reg byte a reg byte x
Statement [104] (byte) irq_raster_next#1 ← (byte) irq_raster_next#0 + (byte) $15 [ irq_cnt#1 irq_raster_next#1 ] ( [ irq_cnt#1 irq_raster_next#1 ] ) always clobbers reg byte a reg byte x
Statement [105] (byte) irq_sprite_ypos#1 ← (const byte) SPRITES_FIRST_YPOS#0 [ irq_cnt#1 irq_raster_next#1 irq_sprite_ypos#1 ] ( [ irq_cnt#1 irq_raster_next#1 irq_sprite_ypos#1 ] ) always clobbers reg byte a
Statement [107] (byte) irq_sprite_ptr#1 ← (const byte) sprites_irq::toSpritePtr2_return#0 [ irq_cnt#1 irq_raster_next#1 irq_sprite_ypos#1 irq_sprite_ptr#1 ] ( [ irq_cnt#1 irq_raster_next#1 irq_sprite_ypos#1 irq_sprite_ptr#1 ] ) always clobbers reg byte a
Potential registers zp ZP_BYTE:2 [ main::s#2 main::s#1 ] : zp ZP_BYTE:2 , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:3 [ main::xpos#2 main::xpos#1 ] : zp ZP_BYTE:3 , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:4 [ main::ypos#2 main::ypos#1 ] : zp ZP_BYTE:4 , reg byte x , reg byte y ,
@ -3010,9 +3022,9 @@ Potential registers zp ZP_BYTE:9 [ sprites_init::xpos#2 sprites_init::xpos#1 ] :
Potential registers zp ZP_BYTE:10 [ sprites_irq::raster_sprite_gfx_modify#0 ] : zp ZP_BYTE:10 ,
Potential registers zp ZP_BYTE:11 [ render_screen_showing#0 ] : zp ZP_BYTE:11 ,
Potential registers zp ZP_BYTE:12 [ irq_raster_next#0 irq_raster_next#4 irq_raster_next#1 irq_raster_next#2 irq_raster_next#3 ] : zp ZP_BYTE:12 ,
Potential registers zp ZP_BYTE:13 [ irq_sprite_ypos#0 irq_sprite_ypos#1 irq_sprite_ypos#2 irq_sprite_ypos#3 ] : zp ZP_BYTE:13 ,
Potential registers zp ZP_BYTE:14 [ irq_sprite_ptr#0 irq_sprite_ptr#1 irq_sprite_ptr#2 irq_sprite_ptr#3 ] : zp ZP_BYTE:14 ,
Potential registers zp ZP_BYTE:15 [ irq_cnt#0 irq_cnt#1 irq_cnt#2 ] : zp ZP_BYTE:15 ,
Potential registers zp ZP_BYTE:13 [ irq_sprite_ypos#0 irq_sprite_ypos#11 irq_sprite_ypos#1 irq_sprite_ypos#2 irq_sprite_ypos#3 ] : zp ZP_BYTE:13 ,
Potential registers zp ZP_BYTE:14 [ irq_sprite_ptr#0 irq_sprite_ptr#11 irq_sprite_ptr#1 irq_sprite_ptr#2 irq_sprite_ptr#3 ] : zp ZP_BYTE:14 ,
Potential registers zp ZP_BYTE:15 [ irq_cnt#0 irq_cnt#3 irq_cnt#1 irq_cnt#2 ] : zp ZP_BYTE:15 ,
Potential registers zp ZP_BYTE:16 [ main::s2#0 ] : zp ZP_BYTE:16 , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:17 [ main::$6 ] : zp ZP_BYTE:17 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:18 [ loop::$1 ] : zp ZP_BYTE:18 , reg byte a , reg byte x , reg byte y ,
@ -3027,14 +3039,14 @@ Potential registers zp ZP_BYTE:26 [ sprites_irq::ptr#2 ] : zp ZP_BYTE:26 , reg b
REGISTER UPLIFT SCOPES
Uplift Scope [loop] 227.25: zp ZP_BYTE:6 [ loop::s#2 loop::s#1 ] 202: zp ZP_BYTE:18 [ loop::$1 ] 194: zp ZP_BYTE:7 [ loop::idx#2 loop::idx#0 loop::idx#1 ]
Uplift Scope [] 60.28: zp ZP_BYTE:13 [ irq_sprite_ypos#0 irq_sprite_ypos#1 irq_sprite_ypos#2 irq_sprite_ypos#3 ] 60.26: zp ZP_BYTE:14 [ irq_sprite_ptr#0 irq_sprite_ptr#1 irq_sprite_ptr#2 irq_sprite_ptr#3 ] 25.67: zp ZP_BYTE:5 [ sin_idx#10 sin_idx#3 ] 23.17: zp ZP_BYTE:15 [ irq_cnt#0 irq_cnt#1 irq_cnt#2 ] 11.97: zp ZP_BYTE:12 [ irq_raster_next#0 irq_raster_next#4 irq_raster_next#1 irq_raster_next#2 irq_raster_next#3 ] 0.4: zp ZP_BYTE:11 [ render_screen_showing#0 ]
Uplift Scope [] 72.26: zp ZP_BYTE:14 [ irq_sprite_ptr#0 irq_sprite_ptr#11 irq_sprite_ptr#1 irq_sprite_ptr#2 irq_sprite_ptr#3 ] 65.61: zp ZP_BYTE:13 [ irq_sprite_ypos#0 irq_sprite_ypos#11 irq_sprite_ypos#1 irq_sprite_ypos#2 irq_sprite_ypos#3 ] 62.17: zp ZP_BYTE:15 [ irq_cnt#0 irq_cnt#3 irq_cnt#1 irq_cnt#2 ] 25.67: zp ZP_BYTE:5 [ sin_idx#10 sin_idx#3 ] 11.97: zp ZP_BYTE:12 [ irq_raster_next#0 irq_raster_next#4 irq_raster_next#1 irq_raster_next#2 irq_raster_next#3 ] 0.4: zp ZP_BYTE:11 [ render_screen_showing#0 ]
Uplift Scope [main] 23.1: zp ZP_BYTE:2 [ main::s#2 main::s#1 ] 22: zp ZP_BYTE:17 [ main::$6 ] 16.5: zp ZP_BYTE:16 [ main::s2#0 ] 11: zp ZP_BYTE:4 [ main::ypos#2 main::ypos#1 ] 9.62: zp ZP_BYTE:3 [ main::xpos#2 main::xpos#1 ]
Uplift Scope [sprites_init] 25.3: zp ZP_BYTE:8 [ sprites_init::s#2 sprites_init::s#1 ] 22: zp ZP_BYTE:19 [ sprites_init::s2#0 ] 15.58: zp ZP_BYTE:9 [ sprites_init::xpos#2 sprites_init::xpos#1 ]
Uplift Scope [sprites_irq] 6.5: zp ZP_BYTE:10 [ sprites_irq::raster_sprite_gfx_modify#0 ] 4: zp ZP_BYTE:21 [ sprites_irq::$0 ] 4: zp ZP_BYTE:24 [ sprites_irq::ptr#4 ] 4: zp ZP_BYTE:26 [ sprites_irq::ptr#2 ] 2.67: zp ZP_BYTE:23 [ sprites_irq::ptr#3 ] 2.67: zp ZP_BYTE:25 [ sprites_irq::ptr#1 ] 2.5: zp ZP_BYTE:20 [ sprites_irq::ypos#0 ] 2.5: zp ZP_BYTE:22 [ sprites_irq::ptr#0 ]
Uplift Scope [sprites_irq_init]
Uplifting [loop] best 9610 combination zp ZP_BYTE:6 [ loop::s#2 loop::s#1 ] reg byte a [ loop::$1 ] reg byte x [ loop::idx#2 loop::idx#0 loop::idx#1 ]
Uplifting [] best 9610 combination zp ZP_BYTE:13 [ irq_sprite_ypos#0 irq_sprite_ypos#1 irq_sprite_ypos#2 irq_sprite_ypos#3 ] zp ZP_BYTE:14 [ irq_sprite_ptr#0 irq_sprite_ptr#1 irq_sprite_ptr#2 irq_sprite_ptr#3 ] zp ZP_BYTE:5 [ sin_idx#10 sin_idx#3 ] zp ZP_BYTE:15 [ irq_cnt#0 irq_cnt#1 irq_cnt#2 ] zp ZP_BYTE:12 [ irq_raster_next#0 irq_raster_next#4 irq_raster_next#1 irq_raster_next#2 irq_raster_next#3 ] zp ZP_BYTE:11 [ render_screen_showing#0 ]
Uplifting [] best 9610 combination zp ZP_BYTE:14 [ irq_sprite_ptr#0 irq_sprite_ptr#11 irq_sprite_ptr#1 irq_sprite_ptr#2 irq_sprite_ptr#3 ] zp ZP_BYTE:13 [ irq_sprite_ypos#0 irq_sprite_ypos#11 irq_sprite_ypos#1 irq_sprite_ypos#2 irq_sprite_ypos#3 ] zp ZP_BYTE:15 [ irq_cnt#0 irq_cnt#3 irq_cnt#1 irq_cnt#2 ] zp ZP_BYTE:5 [ sin_idx#10 sin_idx#3 ] zp ZP_BYTE:12 [ irq_raster_next#0 irq_raster_next#4 irq_raster_next#1 irq_raster_next#2 irq_raster_next#3 ] zp ZP_BYTE:11 [ render_screen_showing#0 ]
Uplifting [main] best 9330 combination reg byte y [ main::s#2 main::s#1 ] reg byte a [ main::$6 ] reg byte x [ main::s2#0 ] zp ZP_BYTE:4 [ main::ypos#2 main::ypos#1 ] zp ZP_BYTE:3 [ main::xpos#2 main::xpos#1 ]
Limited combination testing to 100 combinations of 324 possible.
Uplifting [sprites_init] best 9160 combination reg byte y [ sprites_init::s#2 sprites_init::s#1 ] reg byte x [ sprites_init::s2#0 ] zp ZP_BYTE:9 [ sprites_init::xpos#2 sprites_init::xpos#1 ]
@ -3043,14 +3055,14 @@ Limited combination testing to 100 combinations of 12288 possible.
Uplifting [sprites_irq_init] best 9136 combination
Attempting to uplift remaining variables inzp ZP_BYTE:6 [ loop::s#2 loop::s#1 ]
Uplifting [loop] best 9136 combination zp ZP_BYTE:6 [ loop::s#2 loop::s#1 ]
Attempting to uplift remaining variables inzp ZP_BYTE:13 [ irq_sprite_ypos#0 irq_sprite_ypos#1 irq_sprite_ypos#2 irq_sprite_ypos#3 ]
Uplifting [] best 9136 combination zp ZP_BYTE:13 [ irq_sprite_ypos#0 irq_sprite_ypos#1 irq_sprite_ypos#2 irq_sprite_ypos#3 ]
Attempting to uplift remaining variables inzp ZP_BYTE:14 [ irq_sprite_ptr#0 irq_sprite_ptr#1 irq_sprite_ptr#2 irq_sprite_ptr#3 ]
Uplifting [] best 9136 combination zp ZP_BYTE:14 [ irq_sprite_ptr#0 irq_sprite_ptr#1 irq_sprite_ptr#2 irq_sprite_ptr#3 ]
Attempting to uplift remaining variables inzp ZP_BYTE:14 [ irq_sprite_ptr#0 irq_sprite_ptr#11 irq_sprite_ptr#1 irq_sprite_ptr#2 irq_sprite_ptr#3 ]
Uplifting [] best 9136 combination zp ZP_BYTE:14 [ irq_sprite_ptr#0 irq_sprite_ptr#11 irq_sprite_ptr#1 irq_sprite_ptr#2 irq_sprite_ptr#3 ]
Attempting to uplift remaining variables inzp ZP_BYTE:13 [ irq_sprite_ypos#0 irq_sprite_ypos#11 irq_sprite_ypos#1 irq_sprite_ypos#2 irq_sprite_ypos#3 ]
Uplifting [] best 9136 combination zp ZP_BYTE:13 [ irq_sprite_ypos#0 irq_sprite_ypos#11 irq_sprite_ypos#1 irq_sprite_ypos#2 irq_sprite_ypos#3 ]
Attempting to uplift remaining variables inzp ZP_BYTE:15 [ irq_cnt#0 irq_cnt#3 irq_cnt#1 irq_cnt#2 ]
Uplifting [] best 9136 combination zp ZP_BYTE:15 [ irq_cnt#0 irq_cnt#3 irq_cnt#1 irq_cnt#2 ]
Attempting to uplift remaining variables inzp ZP_BYTE:5 [ sin_idx#10 sin_idx#3 ]
Uplifting [] best 9136 combination zp ZP_BYTE:5 [ sin_idx#10 sin_idx#3 ]
Attempting to uplift remaining variables inzp ZP_BYTE:15 [ irq_cnt#0 irq_cnt#1 irq_cnt#2 ]
Uplifting [] best 9136 combination zp ZP_BYTE:15 [ irq_cnt#0 irq_cnt#1 irq_cnt#2 ]
Attempting to uplift remaining variables inzp ZP_BYTE:9 [ sprites_init::xpos#2 sprites_init::xpos#1 ]
Uplifting [sprites_init] best 9136 combination zp ZP_BYTE:9 [ sprites_init::xpos#2 sprites_init::xpos#1 ]
Attempting to uplift remaining variables inzp ZP_BYTE:12 [ irq_raster_next#0 irq_raster_next#4 irq_raster_next#1 irq_raster_next#2 irq_raster_next#3 ]
@ -3077,13 +3089,13 @@ Allocated (was zp ZP_BYTE:9) zp ZP_BYTE:6 [ sprites_init::xpos#2 sprites_init::x
Allocated (was zp ZP_BYTE:10) zp ZP_BYTE:7 [ sprites_irq::raster_sprite_gfx_modify#0 ]
Allocated (was zp ZP_BYTE:11) zp ZP_BYTE:8 [ render_screen_showing#0 ]
Allocated (was zp ZP_BYTE:12) zp ZP_BYTE:9 [ irq_raster_next#0 irq_raster_next#4 irq_raster_next#1 irq_raster_next#2 irq_raster_next#3 ]
Allocated (was zp ZP_BYTE:13) zp ZP_BYTE:10 [ irq_sprite_ypos#0 irq_sprite_ypos#1 irq_sprite_ypos#2 irq_sprite_ypos#3 ]
Allocated (was zp ZP_BYTE:14) zp ZP_BYTE:11 [ irq_sprite_ptr#0 irq_sprite_ptr#1 irq_sprite_ptr#2 irq_sprite_ptr#3 ]
Allocated (was zp ZP_BYTE:15) zp ZP_BYTE:12 [ irq_cnt#0 irq_cnt#1 irq_cnt#2 ]
Allocated (was zp ZP_BYTE:13) zp ZP_BYTE:10 [ irq_sprite_ypos#0 irq_sprite_ypos#11 irq_sprite_ypos#1 irq_sprite_ypos#2 irq_sprite_ypos#3 ]
Allocated (was zp ZP_BYTE:14) zp ZP_BYTE:11 [ irq_sprite_ptr#0 irq_sprite_ptr#11 irq_sprite_ptr#1 irq_sprite_ptr#2 irq_sprite_ptr#3 ]
Allocated (was zp ZP_BYTE:15) zp ZP_BYTE:12 [ irq_cnt#0 irq_cnt#3 irq_cnt#1 irq_cnt#2 ]
Interrupt procedure sprites_irq clobbers AXCNZV
Removing interrupt register storage sty regy+1 in SEG128 entry interrupt(HARDWARE_CLOBBER)
Removing interrupt register storage regy: in SEG164 [99] return - exit interrupt(HARDWARE_CLOBBER)
Removing interrupt register storage ldy #00 in SEG164 [99] return - exit interrupt(HARDWARE_CLOBBER)
Removing interrupt register storage regy: in SEG167 [99] return - exit interrupt(HARDWARE_CLOBBER)
Removing interrupt register storage ldy #00 in SEG167 [99] return - exit interrupt(HARDWARE_CLOBBER)
ASSEMBLER BEFORE OPTIMIZATION
//SEG0 File Comments
@ -3601,79 +3613,82 @@ sprites_irq: {
b5_from_b11:
b5_from_b4:
b5_from_b7:
//SEG159 [96] phi (byte) irq_raster_next#4 = (byte) irq_raster_next#1 [phi:sprites_irq::@11/sprites_irq::@4/sprites_irq::@7->sprites_irq::@5#0] -- register_copy
//SEG159 [96] phi (byte) irq_sprite_ptr#11 = (byte) irq_sprite_ptr#1 [phi:sprites_irq::@11/sprites_irq::@4/sprites_irq::@7->sprites_irq::@5#0] -- register_copy
//SEG160 [96] phi (byte) irq_sprite_ypos#11 = (byte) irq_sprite_ypos#1 [phi:sprites_irq::@11/sprites_irq::@4/sprites_irq::@7->sprites_irq::@5#1] -- register_copy
//SEG161 [96] phi (byte) irq_cnt#3 = (byte) irq_cnt#1 [phi:sprites_irq::@11/sprites_irq::@4/sprites_irq::@7->sprites_irq::@5#2] -- register_copy
//SEG162 [96] phi (byte) irq_raster_next#4 = (byte) irq_raster_next#1 [phi:sprites_irq::@11/sprites_irq::@4/sprites_irq::@7->sprites_irq::@5#3] -- register_copy
jmp b5
//SEG160 sprites_irq::@5
//SEG163 sprites_irq::@5
b5:
//SEG161 [97] *((const byte*) RASTER#0) ← (byte) irq_raster_next#4 -- _deref_pbuc1=vbuz1
//SEG164 [97] *((const byte*) RASTER#0) ← (byte) irq_raster_next#4 -- _deref_pbuc1=vbuz1
// Setup next interrupt
lda irq_raster_next
sta RASTER
//SEG162 [98] *((const byte*) IRQ_STATUS#0) ← (const byte) IRQ_RASTER#0 -- _deref_pbuc1=vbuc2
//SEG165 [98] *((const byte*) IRQ_STATUS#0) ← (const byte) IRQ_RASTER#0 -- _deref_pbuc1=vbuc2
// Acknowledge the IRQ and setup the next one
lda #IRQ_RASTER
sta IRQ_STATUS
jmp breturn
//SEG163 sprites_irq::@return
//SEG166 sprites_irq::@return
breturn:
//SEG164 [99] return - exit interrupt(HARDWARE_CLOBBER)
//SEG167 [99] return - exit interrupt(HARDWARE_CLOBBER)
rega:
lda #00
regx:
ldx #00
rti
//SEG165 sprites_irq::@4
//SEG168 sprites_irq::@4
b4:
//SEG166 [100] (byte) irq_cnt#2 ← (byte) 0 -- vbuz1=vbuc1
//SEG169 [100] (byte) irq_cnt#2 ← (byte) 0 -- vbuz1=vbuc1
lda #0
sta irq_cnt
//SEG167 [101] (byte) irq_raster_next#2 ← (const byte) IRQ_RASTER_FIRST#0 -- vbuz1=vbuc1
//SEG170 [101] (byte) irq_raster_next#2 ← (const byte) IRQ_RASTER_FIRST#0 -- vbuz1=vbuc1
lda #IRQ_RASTER_FIRST
sta irq_raster_next
//SEG168 [102] (byte) irq_sprite_ypos#2 ← (byte) irq_sprite_ypos#0 + (byte) $15 -- vbuz1=vbuz1_plus_vbuc1
//SEG171 [102] (byte) irq_sprite_ypos#2 ← (byte) irq_sprite_ypos#0 + (byte) $15 -- vbuz1=vbuz1_plus_vbuc1
lax irq_sprite_ypos
axs #-[$15]
stx irq_sprite_ypos
//SEG169 [103] (byte) irq_sprite_ptr#2 ← (byte) irq_sprite_ptr#0 + (byte) 3 -- vbuz1=vbuz1_plus_vbuc1
//SEG172 [103] (byte) irq_sprite_ptr#2 ← (byte) irq_sprite_ptr#0 + (byte) 3 -- vbuz1=vbuz1_plus_vbuc1
lax irq_sprite_ptr
axs #-[3]
stx irq_sprite_ptr
jmp b5_from_b4
//SEG170 sprites_irq::@3
//SEG173 sprites_irq::@3
b3:
//SEG171 [104] (byte) irq_raster_next#1 ← (byte) irq_raster_next#0 + (byte) $15 -- vbuz1=vbuz1_plus_vbuc1
//SEG174 [104] (byte) irq_raster_next#1 ← (byte) irq_raster_next#0 + (byte) $15 -- vbuz1=vbuz1_plus_vbuc1
lax irq_raster_next
axs #-[$15]
stx irq_raster_next
//SEG172 [105] (byte) irq_sprite_ypos#1 ← (const byte) SPRITES_FIRST_YPOS#0 -- vbuz1=vbuc1
//SEG175 [105] (byte) irq_sprite_ypos#1 ← (const byte) SPRITES_FIRST_YPOS#0 -- vbuz1=vbuc1
lda #SPRITES_FIRST_YPOS
sta irq_sprite_ypos
//SEG173 [106] phi from sprites_irq::@3 to sprites_irq::toSpritePtr2 [phi:sprites_irq::@3->sprites_irq::toSpritePtr2]
//SEG176 [106] phi from sprites_irq::@3 to sprites_irq::toSpritePtr2 [phi:sprites_irq::@3->sprites_irq::toSpritePtr2]
toSpritePtr2_from_b3:
jmp toSpritePtr2
//SEG174 sprites_irq::toSpritePtr2
//SEG177 sprites_irq::toSpritePtr2
toSpritePtr2:
jmp b11
//SEG175 sprites_irq::@11
//SEG178 sprites_irq::@11
b11:
//SEG176 [107] (byte) irq_sprite_ptr#1 ← (const byte) sprites_irq::toSpritePtr2_return#0 -- vbuz1=vbuc1
//SEG179 [107] (byte) irq_sprite_ptr#1 ← (const byte) sprites_irq::toSpritePtr2_return#0 -- vbuz1=vbuc1
lda #toSpritePtr2_return
sta irq_sprite_ptr
jmp b5_from_b11
//SEG177 sprites_irq::@1
//SEG180 sprites_irq::@1
b1:
//SEG178 [108] *((const byte*) PLAYFIELD_SPRITE_PTRS_1#0) ← (byte) sprites_irq::ptr#0 -- _deref_pbuc1=vbuxx
//SEG181 [108] *((const byte*) PLAYFIELD_SPRITE_PTRS_1#0) ← (byte) sprites_irq::ptr#0 -- _deref_pbuc1=vbuxx
stx PLAYFIELD_SPRITE_PTRS_1
//SEG179 [109] (byte) sprites_irq::ptr#1 ← ++ (byte) sprites_irq::ptr#0 -- vbuxx=_inc_vbuxx
//SEG182 [109] (byte) sprites_irq::ptr#1 ← ++ (byte) sprites_irq::ptr#0 -- vbuxx=_inc_vbuxx
inx
//SEG180 [110] *((const byte*) PLAYFIELD_SPRITE_PTRS_1#0+(byte) 1) ← (byte) sprites_irq::ptr#1 -- _deref_pbuc1=vbuxx
//SEG183 [110] *((const byte*) PLAYFIELD_SPRITE_PTRS_1#0+(byte) 1) ← (byte) sprites_irq::ptr#1 -- _deref_pbuc1=vbuxx
stx PLAYFIELD_SPRITE_PTRS_1+1
//SEG181 [111] *((const byte*) PLAYFIELD_SPRITE_PTRS_1#0+(byte) 2) ← (byte) sprites_irq::ptr#1 -- _deref_pbuc1=vbuxx
//SEG184 [111] *((const byte*) PLAYFIELD_SPRITE_PTRS_1#0+(byte) 2) ← (byte) sprites_irq::ptr#1 -- _deref_pbuc1=vbuxx
stx PLAYFIELD_SPRITE_PTRS_1+2
//SEG182 [112] (byte) sprites_irq::ptr#2 ← ++ (byte) sprites_irq::ptr#1 -- vbuaa=_inc_vbuxx
//SEG185 [112] (byte) sprites_irq::ptr#2 ← ++ (byte) sprites_irq::ptr#1 -- vbuaa=_inc_vbuxx
inx
txa
//SEG183 [113] *((const byte*) PLAYFIELD_SPRITE_PTRS_1#0+(byte) 3) ← (byte) sprites_irq::ptr#2 -- _deref_pbuc1=vbuaa
//SEG186 [113] *((const byte*) PLAYFIELD_SPRITE_PTRS_1#0+(byte) 3) ← (byte) sprites_irq::ptr#2 -- _deref_pbuc1=vbuaa
sta PLAYFIELD_SPRITE_PTRS_1+3
jmp b2
}
@ -3890,8 +3905,9 @@ FINAL SYMBOL TABLE
(const byte*) VIC_CONTROL#0 VIC_CONTROL = (byte*) 53265
(byte) irq_cnt
(byte) irq_cnt#0 irq_cnt zp ZP_BYTE:12 0.17391304347826086
(byte) irq_cnt#1 irq_cnt zp ZP_BYTE:12 3.0
(byte) irq_cnt#2 irq_cnt zp ZP_BYTE:12 20.0
(byte) irq_cnt#1 irq_cnt zp ZP_BYTE:12 1.0
(byte) irq_cnt#2 irq_cnt zp ZP_BYTE:12 1.0
(byte) irq_cnt#3 irq_cnt zp ZP_BYTE:12 60.0
(byte) irq_raster_next
(byte) irq_raster_next#0 irq_raster_next zp ZP_BYTE:9 0.3076923076923077
(byte) irq_raster_next#1 irq_raster_next zp ZP_BYTE:9 1.0
@ -3900,14 +3916,16 @@ FINAL SYMBOL TABLE
(byte) irq_raster_next#4 irq_raster_next zp ZP_BYTE:9 8.0
(byte) irq_sprite_ptr
(byte) irq_sprite_ptr#0 irq_sprite_ptr zp ZP_BYTE:11 0.25806451612903225
(byte) irq_sprite_ptr#1 irq_sprite_ptr zp ZP_BYTE:11 20.0
(byte) irq_sprite_ptr#2 irq_sprite_ptr zp ZP_BYTE:11 20.0
(byte) irq_sprite_ptr#3 irq_sprite_ptr zp ZP_BYTE:11 20.0
(byte) irq_sprite_ptr#1 irq_sprite_ptr zp ZP_BYTE:11 4.0
(byte) irq_sprite_ptr#11 irq_sprite_ptr zp ZP_BYTE:11 60.0
(byte) irq_sprite_ptr#2 irq_sprite_ptr zp ZP_BYTE:11 4.0
(byte) irq_sprite_ptr#3 irq_sprite_ptr zp ZP_BYTE:11 4.0
(byte) irq_sprite_ypos
(byte) irq_sprite_ypos#0 irq_sprite_ypos zp ZP_BYTE:10 0.27586206896551724
(byte) irq_sprite_ypos#1 irq_sprite_ypos zp ZP_BYTE:10 20.0
(byte) irq_sprite_ypos#2 irq_sprite_ypos zp ZP_BYTE:10 20.0
(byte) irq_sprite_ypos#3 irq_sprite_ypos zp ZP_BYTE:10 20.0
(byte) irq_sprite_ypos#1 irq_sprite_ypos zp ZP_BYTE:10 1.3333333333333333
(byte) irq_sprite_ypos#11 irq_sprite_ypos zp ZP_BYTE:10 60.0
(byte) irq_sprite_ypos#2 irq_sprite_ypos zp ZP_BYTE:10 2.0
(byte) irq_sprite_ypos#3 irq_sprite_ypos zp ZP_BYTE:10 2.0
(void()) loop()
(byte~) loop::$1 reg byte a 202.0
(label) loop::@1
@ -4043,9 +4061,9 @@ zp ZP_BYTE:6 [ sprites_init::xpos#2 sprites_init::xpos#1 ]
zp ZP_BYTE:7 [ sprites_irq::raster_sprite_gfx_modify#0 ]
zp ZP_BYTE:8 [ render_screen_showing#0 ]
zp ZP_BYTE:9 [ irq_raster_next#0 irq_raster_next#4 irq_raster_next#1 irq_raster_next#2 irq_raster_next#3 ]
zp ZP_BYTE:10 [ irq_sprite_ypos#0 irq_sprite_ypos#1 irq_sprite_ypos#2 irq_sprite_ypos#3 ]
zp ZP_BYTE:11 [ irq_sprite_ptr#0 irq_sprite_ptr#1 irq_sprite_ptr#2 irq_sprite_ptr#3 ]
zp ZP_BYTE:12 [ irq_cnt#0 irq_cnt#1 irq_cnt#2 ]
zp ZP_BYTE:10 [ irq_sprite_ypos#0 irq_sprite_ypos#11 irq_sprite_ypos#1 irq_sprite_ypos#2 irq_sprite_ypos#3 ]
zp ZP_BYTE:11 [ irq_sprite_ptr#0 irq_sprite_ptr#11 irq_sprite_ptr#1 irq_sprite_ptr#2 irq_sprite_ptr#3 ]
zp ZP_BYTE:12 [ irq_cnt#0 irq_cnt#3 irq_cnt#1 irq_cnt#2 ]
reg byte x [ main::s2#0 ]
reg byte a [ main::$6 ]
reg byte a [ loop::$1 ]
@ -4492,71 +4510,74 @@ sprites_irq: {
axs #-[3]
stx irq_sprite_ptr
//SEG158 [96] phi from sprites_irq::@11 sprites_irq::@4 sprites_irq::@7 to sprites_irq::@5 [phi:sprites_irq::@11/sprites_irq::@4/sprites_irq::@7->sprites_irq::@5]
//SEG159 [96] phi (byte) irq_raster_next#4 = (byte) irq_raster_next#1 [phi:sprites_irq::@11/sprites_irq::@4/sprites_irq::@7->sprites_irq::@5#0] -- register_copy
//SEG160 sprites_irq::@5
//SEG159 [96] phi (byte) irq_sprite_ptr#11 = (byte) irq_sprite_ptr#1 [phi:sprites_irq::@11/sprites_irq::@4/sprites_irq::@7->sprites_irq::@5#0] -- register_copy
//SEG160 [96] phi (byte) irq_sprite_ypos#11 = (byte) irq_sprite_ypos#1 [phi:sprites_irq::@11/sprites_irq::@4/sprites_irq::@7->sprites_irq::@5#1] -- register_copy
//SEG161 [96] phi (byte) irq_cnt#3 = (byte) irq_cnt#1 [phi:sprites_irq::@11/sprites_irq::@4/sprites_irq::@7->sprites_irq::@5#2] -- register_copy
//SEG162 [96] phi (byte) irq_raster_next#4 = (byte) irq_raster_next#1 [phi:sprites_irq::@11/sprites_irq::@4/sprites_irq::@7->sprites_irq::@5#3] -- register_copy
//SEG163 sprites_irq::@5
b5:
//SEG161 [97] *((const byte*) RASTER#0) ← (byte) irq_raster_next#4 -- _deref_pbuc1=vbuz1
//SEG164 [97] *((const byte*) RASTER#0) ← (byte) irq_raster_next#4 -- _deref_pbuc1=vbuz1
// Setup next interrupt
lda irq_raster_next
sta RASTER
//SEG162 [98] *((const byte*) IRQ_STATUS#0) ← (const byte) IRQ_RASTER#0 -- _deref_pbuc1=vbuc2
//SEG165 [98] *((const byte*) IRQ_STATUS#0) ← (const byte) IRQ_RASTER#0 -- _deref_pbuc1=vbuc2
// Acknowledge the IRQ and setup the next one
lda #IRQ_RASTER
sta IRQ_STATUS
//SEG163 sprites_irq::@return
//SEG164 [99] return - exit interrupt(HARDWARE_CLOBBER)
//SEG166 sprites_irq::@return
//SEG167 [99] return - exit interrupt(HARDWARE_CLOBBER)
rega:
lda #00
regx:
ldx #00
rti
//SEG165 sprites_irq::@4
//SEG168 sprites_irq::@4
b4:
//SEG166 [100] (byte) irq_cnt#2 ← (byte) 0 -- vbuz1=vbuc1
//SEG169 [100] (byte) irq_cnt#2 ← (byte) 0 -- vbuz1=vbuc1
lda #0
sta irq_cnt
//SEG167 [101] (byte) irq_raster_next#2 ← (const byte) IRQ_RASTER_FIRST#0 -- vbuz1=vbuc1
//SEG170 [101] (byte) irq_raster_next#2 ← (const byte) IRQ_RASTER_FIRST#0 -- vbuz1=vbuc1
lda #IRQ_RASTER_FIRST
sta irq_raster_next
//SEG168 [102] (byte) irq_sprite_ypos#2 ← (byte) irq_sprite_ypos#0 + (byte) $15 -- vbuz1=vbuz1_plus_vbuc1
//SEG171 [102] (byte) irq_sprite_ypos#2 ← (byte) irq_sprite_ypos#0 + (byte) $15 -- vbuz1=vbuz1_plus_vbuc1
lax irq_sprite_ypos
axs #-[$15]
stx irq_sprite_ypos
//SEG169 [103] (byte) irq_sprite_ptr#2 ← (byte) irq_sprite_ptr#0 + (byte) 3 -- vbuz1=vbuz1_plus_vbuc1
//SEG172 [103] (byte) irq_sprite_ptr#2 ← (byte) irq_sprite_ptr#0 + (byte) 3 -- vbuz1=vbuz1_plus_vbuc1
lax irq_sprite_ptr
axs #-[3]
stx irq_sprite_ptr
jmp b5
//SEG170 sprites_irq::@3
//SEG173 sprites_irq::@3
b3:
//SEG171 [104] (byte) irq_raster_next#1 ← (byte) irq_raster_next#0 + (byte) $15 -- vbuz1=vbuz1_plus_vbuc1
//SEG174 [104] (byte) irq_raster_next#1 ← (byte) irq_raster_next#0 + (byte) $15 -- vbuz1=vbuz1_plus_vbuc1
lax irq_raster_next
axs #-[$15]
stx irq_raster_next
//SEG172 [105] (byte) irq_sprite_ypos#1 ← (const byte) SPRITES_FIRST_YPOS#0 -- vbuz1=vbuc1
//SEG175 [105] (byte) irq_sprite_ypos#1 ← (const byte) SPRITES_FIRST_YPOS#0 -- vbuz1=vbuc1
lda #SPRITES_FIRST_YPOS
sta irq_sprite_ypos
//SEG173 [106] phi from sprites_irq::@3 to sprites_irq::toSpritePtr2 [phi:sprites_irq::@3->sprites_irq::toSpritePtr2]
//SEG174 sprites_irq::toSpritePtr2
//SEG175 sprites_irq::@11
//SEG176 [107] (byte) irq_sprite_ptr#1 ← (const byte) sprites_irq::toSpritePtr2_return#0 -- vbuz1=vbuc1
//SEG176 [106] phi from sprites_irq::@3 to sprites_irq::toSpritePtr2 [phi:sprites_irq::@3->sprites_irq::toSpritePtr2]
//SEG177 sprites_irq::toSpritePtr2
//SEG178 sprites_irq::@11
//SEG179 [107] (byte) irq_sprite_ptr#1 ← (const byte) sprites_irq::toSpritePtr2_return#0 -- vbuz1=vbuc1
lda #toSpritePtr2_return
sta irq_sprite_ptr
jmp b5
//SEG177 sprites_irq::@1
//SEG180 sprites_irq::@1
b1:
//SEG178 [108] *((const byte*) PLAYFIELD_SPRITE_PTRS_1#0) ← (byte) sprites_irq::ptr#0 -- _deref_pbuc1=vbuxx
//SEG181 [108] *((const byte*) PLAYFIELD_SPRITE_PTRS_1#0) ← (byte) sprites_irq::ptr#0 -- _deref_pbuc1=vbuxx
stx PLAYFIELD_SPRITE_PTRS_1
//SEG179 [109] (byte) sprites_irq::ptr#1 ← ++ (byte) sprites_irq::ptr#0 -- vbuxx=_inc_vbuxx
//SEG182 [109] (byte) sprites_irq::ptr#1 ← ++ (byte) sprites_irq::ptr#0 -- vbuxx=_inc_vbuxx
inx
//SEG180 [110] *((const byte*) PLAYFIELD_SPRITE_PTRS_1#0+(byte) 1) ← (byte) sprites_irq::ptr#1 -- _deref_pbuc1=vbuxx
//SEG183 [110] *((const byte*) PLAYFIELD_SPRITE_PTRS_1#0+(byte) 1) ← (byte) sprites_irq::ptr#1 -- _deref_pbuc1=vbuxx
stx PLAYFIELD_SPRITE_PTRS_1+1
//SEG181 [111] *((const byte*) PLAYFIELD_SPRITE_PTRS_1#0+(byte) 2) ← (byte) sprites_irq::ptr#1 -- _deref_pbuc1=vbuxx
//SEG184 [111] *((const byte*) PLAYFIELD_SPRITE_PTRS_1#0+(byte) 2) ← (byte) sprites_irq::ptr#1 -- _deref_pbuc1=vbuxx
stx PLAYFIELD_SPRITE_PTRS_1+2
//SEG182 [112] (byte) sprites_irq::ptr#2 ← ++ (byte) sprites_irq::ptr#1 -- vbuaa=_inc_vbuxx
//SEG185 [112] (byte) sprites_irq::ptr#2 ← ++ (byte) sprites_irq::ptr#1 -- vbuaa=_inc_vbuxx
inx
txa
//SEG183 [113] *((const byte*) PLAYFIELD_SPRITE_PTRS_1#0+(byte) 3) ← (byte) sprites_irq::ptr#2 -- _deref_pbuc1=vbuaa
//SEG186 [113] *((const byte*) PLAYFIELD_SPRITE_PTRS_1#0+(byte) 3) ← (byte) sprites_irq::ptr#2 -- _deref_pbuc1=vbuaa
sta PLAYFIELD_SPRITE_PTRS_1+3
jmp b2
}

View File

@ -75,8 +75,9 @@
(const byte*) VIC_CONTROL#0 VIC_CONTROL = (byte*) 53265
(byte) irq_cnt
(byte) irq_cnt#0 irq_cnt zp ZP_BYTE:12 0.17391304347826086
(byte) irq_cnt#1 irq_cnt zp ZP_BYTE:12 3.0
(byte) irq_cnt#2 irq_cnt zp ZP_BYTE:12 20.0
(byte) irq_cnt#1 irq_cnt zp ZP_BYTE:12 1.0
(byte) irq_cnt#2 irq_cnt zp ZP_BYTE:12 1.0
(byte) irq_cnt#3 irq_cnt zp ZP_BYTE:12 60.0
(byte) irq_raster_next
(byte) irq_raster_next#0 irq_raster_next zp ZP_BYTE:9 0.3076923076923077
(byte) irq_raster_next#1 irq_raster_next zp ZP_BYTE:9 1.0
@ -85,14 +86,16 @@
(byte) irq_raster_next#4 irq_raster_next zp ZP_BYTE:9 8.0
(byte) irq_sprite_ptr
(byte) irq_sprite_ptr#0 irq_sprite_ptr zp ZP_BYTE:11 0.25806451612903225
(byte) irq_sprite_ptr#1 irq_sprite_ptr zp ZP_BYTE:11 20.0
(byte) irq_sprite_ptr#2 irq_sprite_ptr zp ZP_BYTE:11 20.0
(byte) irq_sprite_ptr#3 irq_sprite_ptr zp ZP_BYTE:11 20.0
(byte) irq_sprite_ptr#1 irq_sprite_ptr zp ZP_BYTE:11 4.0
(byte) irq_sprite_ptr#11 irq_sprite_ptr zp ZP_BYTE:11 60.0
(byte) irq_sprite_ptr#2 irq_sprite_ptr zp ZP_BYTE:11 4.0
(byte) irq_sprite_ptr#3 irq_sprite_ptr zp ZP_BYTE:11 4.0
(byte) irq_sprite_ypos
(byte) irq_sprite_ypos#0 irq_sprite_ypos zp ZP_BYTE:10 0.27586206896551724
(byte) irq_sprite_ypos#1 irq_sprite_ypos zp ZP_BYTE:10 20.0
(byte) irq_sprite_ypos#2 irq_sprite_ypos zp ZP_BYTE:10 20.0
(byte) irq_sprite_ypos#3 irq_sprite_ypos zp ZP_BYTE:10 20.0
(byte) irq_sprite_ypos#1 irq_sprite_ypos zp ZP_BYTE:10 1.3333333333333333
(byte) irq_sprite_ypos#11 irq_sprite_ypos zp ZP_BYTE:10 60.0
(byte) irq_sprite_ypos#2 irq_sprite_ypos zp ZP_BYTE:10 2.0
(byte) irq_sprite_ypos#3 irq_sprite_ypos zp ZP_BYTE:10 2.0
(void()) loop()
(byte~) loop::$1 reg byte a 202.0
(label) loop::@1
@ -228,9 +231,9 @@ zp ZP_BYTE:6 [ sprites_init::xpos#2 sprites_init::xpos#1 ]
zp ZP_BYTE:7 [ sprites_irq::raster_sprite_gfx_modify#0 ]
zp ZP_BYTE:8 [ render_screen_showing#0 ]
zp ZP_BYTE:9 [ irq_raster_next#0 irq_raster_next#4 irq_raster_next#1 irq_raster_next#2 irq_raster_next#3 ]
zp ZP_BYTE:10 [ irq_sprite_ypos#0 irq_sprite_ypos#1 irq_sprite_ypos#2 irq_sprite_ypos#3 ]
zp ZP_BYTE:11 [ irq_sprite_ptr#0 irq_sprite_ptr#1 irq_sprite_ptr#2 irq_sprite_ptr#3 ]
zp ZP_BYTE:12 [ irq_cnt#0 irq_cnt#1 irq_cnt#2 ]
zp ZP_BYTE:10 [ irq_sprite_ypos#0 irq_sprite_ypos#11 irq_sprite_ypos#1 irq_sprite_ypos#2 irq_sprite_ypos#3 ]
zp ZP_BYTE:11 [ irq_sprite_ptr#0 irq_sprite_ptr#11 irq_sprite_ptr#1 irq_sprite_ptr#2 irq_sprite_ptr#3 ]
zp ZP_BYTE:12 [ irq_cnt#0 irq_cnt#3 irq_cnt#1 irq_cnt#2 ]
reg byte x [ main::s2#0 ]
reg byte a [ main::$6 ]
reg byte a [ loop::$1 ]

View File

@ -118,45 +118,45 @@
// The line of the first IRQ
.const IRQ_RASTER_FIRST = SPRITES_FIRST_YPOS+$13
.const toSpritePtr1_return = PLAYFIELD_SPRITES/$40
.label keyboard_events_size = $42
.label render_screen_showing = $55
.label score_bcd = $28
.label keyboard_events_size = $43
.label render_screen_showing = 4
.label score_bcd = $29
.label irq_raster_next = $56
.label irq_sprite_ypos = $57
.label irq_sprite_ptr = $58
.label irq_cnt = $59
.label current_movedown_slow = $2d
.label current_ypos = $25
.label current_xpos = $35
.label current_orientation = $32
.label current_piece_gfx = $33
.label current_piece_char = $31
.label level_bcd = $2e
.label current_piece = $2f
.label game_over = $37
.label next_piece_idx = $36
.label level = $2c
.label current_movedown_slow = $2e
.label current_ypos = $26
.label current_xpos = $36
.label current_orientation = $33
.label current_piece_gfx = $34
.label current_piece_char = $32
.label level_bcd = $2f
.label current_piece = $30
.label game_over = $38
.label next_piece_idx = $37
.label level = $2d
.label render_screen_render = 3
.label render_screen_show = 2
.label current_movedown_counter = 4
.label lines_bcd = $26
.label current_piece_17 = $1e
.label render_screen_render_33 = $e
.label current_xpos_59 = $f
.label current_piece_gfx_64 = $10
.label current_piece_char_68 = $12
.label render_screen_render_65 = $e
.label current_xpos_119 = $f
.label current_xpos_120 = $f
.label current_piece_gfx_112 = $10
.label current_piece_gfx_113 = $10
.label current_piece_char_100 = $12
.label current_piece_char_101 = $12
.label current_piece_96 = $1e
.label current_piece_97 = $1e
.label current_piece_98 = $1e
.label current_piece_99 = $1e
.label current_piece_100 = $1e
.label current_movedown_counter = 5
.label lines_bcd = $27
.label current_piece_17 = $1f
.label render_screen_render_33 = $f
.label current_xpos_59 = $10
.label current_piece_gfx_64 = $11
.label current_piece_char_68 = $13
.label render_screen_render_65 = $f
.label current_xpos_119 = $10
.label current_xpos_120 = $10
.label current_piece_gfx_112 = $11
.label current_piece_gfx_113 = $11
.label current_piece_char_100 = $13
.label current_piece_char_101 = $13
.label current_piece_96 = $1f
.label current_piece_97 = $1f
.label current_piece_98 = $1f
.label current_piece_99 = $1f
.label current_piece_100 = $1f
bbegin:
// The screen currently being showed to the user. $00 for screen 1 / $20 for screen 2.
lda #0
@ -290,7 +290,7 @@ render_score: {
.const score_offset = $28*5+$1c
.const lines_offset = $28*1+$16
.const level_offset = $28*$13+$1f
.label screen = 5
.label screen = 6
lda render_screen_render
cmp #0
beq b1
@ -356,12 +356,12 @@ render_score: {
// - offset: offset on the screen
// - bcd: The BCD-value to render
// - only_low: if non-zero only renders the low digit
// render_bcd(byte* zeropage(5) screen, word zeropage(7) offset, byte register(X) bcd, byte register(Y) only_low)
// render_bcd(byte* zeropage(6) screen, word zeropage(8) offset, byte register(X) bcd, byte register(Y) only_low)
render_bcd: {
.const ZERO_CHAR = $35
.label screen = 5
.label screen_pos = 7
.label offset = 7
.label screen = 6
.label screen_pos = 8
.label offset = 8
lda screen_pos
clc
adc screen
@ -398,9 +398,9 @@ render_next: {
// Find the screen area
.const next_area_offset = $28*$c+$18+4
.label next_piece_char = $5b
.label next_piece_gfx = $a
.label screen_next_area = $c
.label l = 9
.label next_piece_gfx = $b
.label screen_next_area = $d
.label l = $a
cmp #0
beq b1
lda #<PLAYFIELD_SCREEN_2+next_area_offset
@ -468,11 +468,11 @@ render_next: {
// Render the current moving piece at position (current_xpos, current_ypos)
// Ignores cases where parts of the tetromino is outside the playfield (sides/bottom) since the movement collision routine prevents this.
render_moving: {
.label ypos = $13
.label ypos = $14
.label screen_line = $5c
.label xpos = $16
.label i = $15
.label l = $14
.label xpos = $17
.label i = $16
.label l = $15
stx ypos
lda #0
sta l
@ -522,10 +522,10 @@ render_moving: {
}
// Render the static playfield on the screen (all pieces already locked into place)
render_playfield: {
.label screen_line = $19
.label i = $18
.label c = $1b
.label l = $17
.label screen_line = $1a
.label i = $19
.label c = $1c
.label l = $18
lda #PLAYFIELD_COLS*2
sta i
lda #2
@ -567,8 +567,8 @@ render_playfield: {
// Returns a byte signaling whether rendering is needed. (0 no render, >0 render needed)
// play_movement(byte zeropage($5a) key_event)
play_movement: {
.label render = $1c
.label return = $1c
.label render = $1d
.label return = $1d
.label key_event = $5a
lda key_event
jsr play_move_down
@ -595,7 +595,7 @@ play_movement: {
// Return non-zero if a render is needed
// play_move_rotate(byte register(A) key_event)
play_move_rotate: {
.label orientation = $1d
.label orientation = $1e
cmp #KEY_Z
beq b1
cmp #KEY_X
@ -640,20 +640,20 @@ play_move_rotate: {
}
// Test if there is a collision between the current piece moved to (x, y) and anything on the playfield or the playfield boundaries
// Returns information about the type of the collision detected
// play_collision(byte zeropage($20) xpos, byte zeropage($21) ypos, byte register(X) orientation)
// play_collision(byte zeropage($21) xpos, byte zeropage($22) ypos, byte register(X) orientation)
play_collision: {
.label xpos = $20
.label ypos = $21
.label piece_gfx = $1e
.label yp = $21
.label xpos = $21
.label ypos = $22
.label piece_gfx = $1f
.label yp = $22
.label playfield_line = $5e
.label i = $60
.label xp = $24
.label l = $22
.label i_2 = $23
.label i_3 = $23
.label i_10 = $23
.label i_12 = $23
.label xp = $25
.label l = $23
.label i_2 = $24
.label i_3 = $24
.label i_10 = $24
.label i_12 = $24
txa
clc
adc piece_gfx
@ -850,7 +850,7 @@ play_move_down: {
// Moves the next piece into the current and spawns a new next piece
play_spawn_current: {
.label _7 = $61
.label piece_idx = $36
.label piece_idx = $37
// Move next piece into current
ldx next_piece_idx
txa
@ -1001,10 +1001,10 @@ play_increase_level: {
// Returns the number of lines removed
play_remove_lines: {
.label c = $67
.label x = $3a
.label y = $38
.label removed = $39
.label full = $3b
.label x = $3b
.label y = $39
.label removed = $3a
.label full = $3c
lda #0
sta removed
sta y
@ -1056,15 +1056,15 @@ play_remove_lines: {
}
// Lock the current piece onto the playfield
play_lock_current: {
.label yp = $25
.label yp = $26
.label playfield_line = $68
.label xp = $3e
.label xp = $3f
.label i = $6a
.label l = $3c
.label i_2 = $3d
.label i_3 = $3d
.label i_7 = $3d
.label i_9 = $3d
.label l = $3d
.label i_2 = $3e
.label i_3 = $3e
.label i_7 = $3e
.label i_9 = $3e
lda #0
sta l
sta i_3
@ -1112,10 +1112,10 @@ play_lock_current: {
}
// Determine if a specific key is currently pressed based on the last keyboard_event_scan()
// Returns 0 is not pressed and non-0 if pressed
// keyboard_event_pressed(byte zeropage($3f) keycode)
// keyboard_event_pressed(byte zeropage($40) keycode)
keyboard_event_pressed: {
.label row_bits = $6b
.label keycode = $3f
.label keycode = $40
lda keycode
lsr
lsr
@ -1151,8 +1151,8 @@ keyboard_event_get: {
// Also stores current status of modifiers in keyboard_modifiers.
keyboard_event_scan: {
.label row_scan = $6c
.label keycode = $41
.label row = $40
.label keycode = $42
.label row = $41
lda #0
sta keycode
sta row
@ -1266,8 +1266,8 @@ render_show: {
}
// Initialize play data tables
play_init: {
.label pli = $43
.label idx = $45
.label pli = $44
.label idx = $46
lda #0
sta idx
lda #<playfield
@ -1357,7 +1357,7 @@ sprites_irq_init: {
}
// Setup the sprites
sprites_init: {
.label xpos = $46
.label xpos = $47
lda #$f
sta SPRITES_ENABLE
lda #0
@ -1386,8 +1386,8 @@ sprites_init: {
// Initialize rendering
render_init: {
.const vicSelectGfxBank1_toDd001_return = 3
.label li_1 = $47
.label li_2 = $49
.label li_1 = $48
.label li_2 = $4a
lda #3
sta CIA2_PORT_A_DDR
lda #vicSelectGfxBank1_toDd001_return
@ -1456,14 +1456,14 @@ render_init: {
}
// Copy the original screen data to the passed screen
// Also copies colors to $d800
// render_screen_original(byte* zeropage($50) screen)
// render_screen_original(byte* zeropage($51) screen)
render_screen_original: {
.const SPACE = 0
.label screen = $50
.label cols = $52
.label oscr = $4c
.label ocols = $4e
.label y = $4b
.label screen = $51
.label cols = $53
.label oscr = $4d
.label ocols = $4f
.label y = $4c
lda #0
sta y
lda #<PLAYFIELD_COLORS_ORIGINAL+$20*2
@ -1563,7 +1563,7 @@ sid_rnd_init: {
// Utilizes duplicated gfx in the sprites to allow for some leeway in updating the sprite pointers
sprites_irq: {
.const toSpritePtr2_return = PLAYFIELD_SPRITES/$40
.label raster_sprite_gfx_modify = $54
.label raster_sprite_gfx_modify = $55
sta rega+1
stx regx+1
//(*BGCOL)++;

View File

@ -107,6 +107,7 @@ main::@1: scope:[main] from main::@17 main::@25 main::@6
[40] (word) lines_bcd#19 ← phi( main::@6/(word) lines_bcd#15 main::@17/(byte) 0 main::@25/(word) lines_bcd#15 )
[40] (byte) current_movedown_counter#16 ← phi( main::@6/(byte) current_movedown_counter#14 main::@17/(byte) 0 main::@25/(byte) current_movedown_counter#14 )
[40] (byte) keyboard_events_size#19 ← phi( main::@6/(byte) keyboard_events_size#16 main::@17/(byte) 0 main::@25/(byte) keyboard_events_size#16 )
[40] (byte) render_screen_showing#13 ← phi( main::@6/(byte) render_screen_showing#1 main::@17/(byte) render_screen_showing#0 main::@25/(byte) render_screen_showing#1 )
[40] (byte) next_piece_idx#10 ← phi( main::@6/(byte) next_piece_idx#16 main::@17/(byte) play_spawn_current::piece_idx#2 main::@25/(byte) next_piece_idx#16 )
[40] (byte) game_over#10 ← phi( main::@6/(byte) game_over#15 main::@17/(byte) game_over#52 main::@25/(byte) game_over#15 )
[40] (byte) current_ypos#11 ← phi( main::@6/(byte) current_ypos#19 main::@17/(byte) current_ypos#6 main::@25/(byte) current_ypos#19 )
@ -1186,6 +1187,9 @@ sprites_irq::@7: scope:[sprites_irq] from sprites_irq::@6
[573] (byte) irq_sprite_ptr#3 ← (byte) irq_sprite_ptr#0 + (byte) 3
to:sprites_irq::@5
sprites_irq::@5: scope:[sprites_irq] from sprites_irq::@11 sprites_irq::@4 sprites_irq::@7
[574] (byte) irq_sprite_ptr#11 ← phi( sprites_irq::@11/(byte) irq_sprite_ptr#1 sprites_irq::@4/(byte) irq_sprite_ptr#2 sprites_irq::@7/(byte) irq_sprite_ptr#3 )
[574] (byte) irq_sprite_ypos#11 ← phi( sprites_irq::@11/(byte) irq_sprite_ypos#1 sprites_irq::@4/(byte) irq_sprite_ypos#2 sprites_irq::@7/(byte) irq_sprite_ypos#3 )
[574] (byte) irq_cnt#3 ← phi( sprites_irq::@11/(byte) irq_cnt#1 sprites_irq::@4/(byte) irq_cnt#2 sprites_irq::@7/(byte) irq_cnt#1 )
[574] (byte) irq_raster_next#4 ← phi( sprites_irq::@11/(byte) irq_raster_next#1 sprites_irq::@4/(byte) irq_raster_next#2 sprites_irq::@7/(byte) irq_raster_next#3 )
[575] *((const byte*) RASTER#0) ← (byte) irq_raster_next#4
[576] *((const byte*) IRQ_STATUS#0) ← (const byte) IRQ_RASTER#0

File diff suppressed because it is too large Load Diff

View File

@ -196,89 +196,90 @@
(byte) VIC_RSEL
(const byte) VIC_RSEL#0 VIC_RSEL = (byte) 8
(byte) current_movedown_counter
(byte) current_movedown_counter#12 current_movedown_counter zp ZP_BYTE:4 0.5333333333333333
(byte) current_movedown_counter#14 current_movedown_counter zp ZP_BYTE:4 3.081081081081081
(byte) current_movedown_counter#16 current_movedown_counter zp ZP_BYTE:4 8.769230769230768
(byte) current_movedown_counter#12 current_movedown_counter zp ZP_BYTE:5 0.5333333333333333
(byte) current_movedown_counter#14 current_movedown_counter zp ZP_BYTE:5 3.081081081081081
(byte) current_movedown_counter#16 current_movedown_counter zp ZP_BYTE:5 8.769230769230768
(byte) current_movedown_fast
(const byte) current_movedown_fast#0 current_movedown_fast = (byte) $a
(byte) current_movedown_slow
(byte) current_movedown_slow#1 current_movedown_slow zp ZP_BYTE:45 0.17391304347826086
(byte) current_movedown_slow#10 current_movedown_slow zp ZP_BYTE:45 4.0
(byte) current_movedown_slow#14 current_movedown_slow zp ZP_BYTE:45 2.214285714285714
(byte) current_movedown_slow#21 current_movedown_slow zp ZP_BYTE:45 3.135135135135135
(byte) current_movedown_slow#23 current_movedown_slow zp ZP_BYTE:45 1.1428571428571428
(byte) current_movedown_slow#37 current_movedown_slow zp ZP_BYTE:45 6.0
(byte) current_movedown_slow#66 current_movedown_slow zp ZP_BYTE:45 0.26666666666666666
(byte) current_movedown_slow#1 current_movedown_slow zp ZP_BYTE:46 0.17391304347826086
(byte) current_movedown_slow#10 current_movedown_slow zp ZP_BYTE:46 4.0
(byte) current_movedown_slow#14 current_movedown_slow zp ZP_BYTE:46 2.214285714285714
(byte) current_movedown_slow#21 current_movedown_slow zp ZP_BYTE:46 3.135135135135135
(byte) current_movedown_slow#23 current_movedown_slow zp ZP_BYTE:46 1.1428571428571428
(byte) current_movedown_slow#37 current_movedown_slow zp ZP_BYTE:46 6.0
(byte) current_movedown_slow#66 current_movedown_slow zp ZP_BYTE:46 0.26666666666666666
(byte) current_orientation
(byte) current_orientation#13 current_orientation zp ZP_BYTE:50 3.189189189189189
(byte) current_orientation#17 current_orientation zp ZP_BYTE:50 5.523809523809523
(byte) current_orientation#20 current_orientation zp ZP_BYTE:50 0.36734693877551017
(byte) current_orientation#25 current_orientation zp ZP_BYTE:50 1.3333333333333333
(byte) current_orientation#37 current_orientation zp ZP_BYTE:50 4.0
(byte) current_orientation#7 current_orientation zp ZP_BYTE:50 3.0
(byte) current_orientation#13 current_orientation zp ZP_BYTE:51 3.189189189189189
(byte) current_orientation#17 current_orientation zp ZP_BYTE:51 5.523809523809523
(byte) current_orientation#20 current_orientation zp ZP_BYTE:51 0.36734693877551017
(byte) current_orientation#25 current_orientation zp ZP_BYTE:51 1.3333333333333333
(byte) current_orientation#37 current_orientation zp ZP_BYTE:51 4.0
(byte) current_orientation#7 current_orientation zp ZP_BYTE:51 3.0
(byte*) current_piece
(byte*) current_piece#10 current_piece zp ZP_WORD:47 3.243243243243243
(byte*~) current_piece#100 current_piece#100 zp ZP_WORD:30 4.0
(byte*~) current_piece#102 current_piece zp ZP_WORD:47 2.0
(byte*) current_piece#15 current_piece zp ZP_WORD:47 1.5897435897435892
(byte*) current_piece#17 current_piece#17 zp ZP_WORD:30 12.0
(byte*) current_piece#28 current_piece zp ZP_WORD:47 6.0
(byte*~) current_piece#93 current_piece zp ZP_WORD:47 2.0
(byte*~) current_piece#96 current_piece#96 zp ZP_WORD:30 4.0
(byte*~) current_piece#97 current_piece#97 zp ZP_WORD:30 4.0
(byte*~) current_piece#98 current_piece#98 zp ZP_WORD:30 4.0
(byte*~) current_piece#99 current_piece#99 zp ZP_WORD:30 4.0
(byte*) current_piece#10 current_piece zp ZP_WORD:48 3.243243243243243
(byte*~) current_piece#100 current_piece#100 zp ZP_WORD:31 4.0
(byte*~) current_piece#102 current_piece zp ZP_WORD:48 2.0
(byte*) current_piece#15 current_piece zp ZP_WORD:48 1.5897435897435892
(byte*) current_piece#17 current_piece#17 zp ZP_WORD:31 12.0
(byte*) current_piece#28 current_piece zp ZP_WORD:48 6.0
(byte*~) current_piece#93 current_piece zp ZP_WORD:48 2.0
(byte*~) current_piece#96 current_piece#96 zp ZP_WORD:31 4.0
(byte*~) current_piece#97 current_piece#97 zp ZP_WORD:31 4.0
(byte*~) current_piece#98 current_piece#98 zp ZP_WORD:31 4.0
(byte*~) current_piece#99 current_piece#99 zp ZP_WORD:31 4.0
(byte) current_piece_char
(byte) current_piece_char#10 current_piece_char zp ZP_BYTE:49 183.9818181818182
(byte~) current_piece_char#100 current_piece_char#100 zp ZP_BYTE:18 4.0
(byte~) current_piece_char#101 current_piece_char#101 zp ZP_BYTE:18 22.0
(byte) current_piece_char#16 current_piece_char zp ZP_BYTE:49 3.4324324324324325
(byte) current_piece_char#29 current_piece_char zp ZP_BYTE:49 6.0
(byte) current_piece_char#5 current_piece_char zp ZP_BYTE:49 0.25
(byte) current_piece_char#68 current_piece_char#68 zp ZP_BYTE:18 48.285714285714285
(byte) current_piece_char#10 current_piece_char zp ZP_BYTE:50 183.9818181818182
(byte~) current_piece_char#100 current_piece_char#100 zp ZP_BYTE:19 4.0
(byte~) current_piece_char#101 current_piece_char#101 zp ZP_BYTE:19 22.0
(byte) current_piece_char#16 current_piece_char zp ZP_BYTE:50 3.4324324324324325
(byte) current_piece_char#29 current_piece_char zp ZP_BYTE:50 6.0
(byte) current_piece_char#5 current_piece_char zp ZP_BYTE:50 0.25
(byte) current_piece_char#68 current_piece_char#68 zp ZP_BYTE:19 48.285714285714285
(byte*) current_piece_gfx
(byte*~) current_piece_gfx#112 current_piece_gfx#112 zp ZP_WORD:16 2.0
(byte*~) current_piece_gfx#113 current_piece_gfx#113 zp ZP_WORD:16 11.0
(byte*~) current_piece_gfx#117 current_piece_gfx zp ZP_WORD:51 4.0
(byte*~) current_piece_gfx#124 current_piece_gfx zp ZP_WORD:51 4.0
(byte*) current_piece_gfx#13 current_piece_gfx zp ZP_WORD:51 183.9818181818182
(byte*) current_piece_gfx#18 current_piece_gfx zp ZP_WORD:51 6.047619047619047
(byte*) current_piece_gfx#20 current_piece_gfx zp ZP_WORD:51 0.37037037037037035
(byte*) current_piece_gfx#21 current_piece_gfx zp ZP_WORD:51 1.3333333333333333
(byte*) current_piece_gfx#35 current_piece_gfx zp ZP_WORD:51 6.0
(byte*) current_piece_gfx#64 current_piece_gfx#64 zp ZP_WORD:16 48.285714285714285
(byte*) current_piece_gfx#7 current_piece_gfx zp ZP_WORD:51 4.0
(byte*~) current_piece_gfx#112 current_piece_gfx#112 zp ZP_WORD:17 2.0
(byte*~) current_piece_gfx#113 current_piece_gfx#113 zp ZP_WORD:17 11.0
(byte*~) current_piece_gfx#117 current_piece_gfx zp ZP_WORD:52 4.0
(byte*~) current_piece_gfx#124 current_piece_gfx zp ZP_WORD:52 4.0
(byte*) current_piece_gfx#13 current_piece_gfx zp ZP_WORD:52 183.9818181818182
(byte*) current_piece_gfx#18 current_piece_gfx zp ZP_WORD:52 6.047619047619047
(byte*) current_piece_gfx#20 current_piece_gfx zp ZP_WORD:52 0.37037037037037035
(byte*) current_piece_gfx#21 current_piece_gfx zp ZP_WORD:52 1.3333333333333333
(byte*) current_piece_gfx#35 current_piece_gfx zp ZP_WORD:52 6.0
(byte*) current_piece_gfx#64 current_piece_gfx#64 zp ZP_WORD:17 48.285714285714285
(byte*) current_piece_gfx#7 current_piece_gfx zp ZP_WORD:52 4.0
(byte) current_xpos
(byte) current_xpos#100 current_xpos zp ZP_BYTE:53 0.3225806451612903
(byte~) current_xpos#119 current_xpos#119 zp ZP_BYTE:15 1.3333333333333333
(byte~) current_xpos#120 current_xpos#120 zp ZP_BYTE:15 7.333333333333333
(byte) current_xpos#14 current_xpos zp ZP_BYTE:53 20.38181818181818
(byte) current_xpos#19 current_xpos zp ZP_BYTE:53 6.047619047619047
(byte) current_xpos#22 current_xpos zp ZP_BYTE:53 0.7999999999999999
(byte) current_xpos#26 current_xpos zp ZP_BYTE:53 0.4666666666666666
(byte) current_xpos#43 current_xpos zp ZP_BYTE:53 6.0
(byte) current_xpos#59 current_xpos#59 zp ZP_BYTE:15 5.428571428571429
(byte) current_xpos#6 current_xpos zp ZP_BYTE:53 4.0
(byte) current_xpos#8 current_xpos zp ZP_BYTE:53 4.0
(byte) current_xpos#100 current_xpos zp ZP_BYTE:54 0.3225806451612903
(byte~) current_xpos#119 current_xpos#119 zp ZP_BYTE:16 1.3333333333333333
(byte~) current_xpos#120 current_xpos#120 zp ZP_BYTE:16 7.333333333333333
(byte) current_xpos#14 current_xpos zp ZP_BYTE:54 20.38181818181818
(byte) current_xpos#19 current_xpos zp ZP_BYTE:54 6.047619047619047
(byte) current_xpos#22 current_xpos zp ZP_BYTE:54 0.7999999999999999
(byte) current_xpos#26 current_xpos zp ZP_BYTE:54 0.4666666666666666
(byte) current_xpos#43 current_xpos zp ZP_BYTE:54 6.0
(byte) current_xpos#59 current_xpos#59 zp ZP_BYTE:16 5.428571428571429
(byte) current_xpos#6 current_xpos zp ZP_BYTE:54 4.0
(byte) current_xpos#8 current_xpos zp ZP_BYTE:54 4.0
(byte) current_ypos
(byte) current_ypos#11 current_ypos zp ZP_BYTE:37 3.297297297297297
(byte) current_ypos#11 current_ypos zp ZP_BYTE:38 3.297297297297297
(byte) current_ypos#13 reg byte x 15.0
(byte) current_ypos#19 current_ypos zp ZP_BYTE:37 1.7051282051282046
(byte) current_ypos#3 current_ypos zp ZP_BYTE:37 4.0
(byte) current_ypos#38 current_ypos zp ZP_BYTE:37 6.0
(byte) current_ypos#6 current_ypos zp ZP_BYTE:37 0.3333333333333333
(byte) current_ypos#19 current_ypos zp ZP_BYTE:38 1.7051282051282046
(byte) current_ypos#3 current_ypos zp ZP_BYTE:38 4.0
(byte) current_ypos#38 current_ypos zp ZP_BYTE:38 6.0
(byte) current_ypos#6 current_ypos zp ZP_BYTE:38 0.3333333333333333
(byte~) current_ypos#98 reg byte x 1.0
(byte~) current_ypos#99 reg byte x 4.4
(byte) game_over
(byte) game_over#10 game_over zp ZP_BYTE:55 4.804347826086958
(byte) game_over#15 game_over zp ZP_BYTE:55 3.189189189189189
(byte) game_over#27 game_over zp ZP_BYTE:55 6.0
(byte) game_over#52 game_over zp ZP_BYTE:55 0.34782608695652173
(byte) game_over#65 game_over zp ZP_BYTE:55 0.42857142857142855
(byte) game_over#10 game_over zp ZP_BYTE:56 4.804347826086958
(byte) game_over#15 game_over zp ZP_BYTE:56 3.189189189189189
(byte) game_over#27 game_over zp ZP_BYTE:56 6.0
(byte) game_over#52 game_over zp ZP_BYTE:56 0.34782608695652173
(byte) game_over#65 game_over zp ZP_BYTE:56 0.42857142857142855
(byte) irq_cnt
(byte) irq_cnt#0 irq_cnt zp ZP_BYTE:89 0.17391304347826086
(byte) irq_cnt#1 irq_cnt zp ZP_BYTE:89 3.0
(byte) irq_cnt#2 irq_cnt zp ZP_BYTE:89 20.0
(byte) irq_cnt#1 irq_cnt zp ZP_BYTE:89 1.0
(byte) irq_cnt#2 irq_cnt zp ZP_BYTE:89 1.0
(byte) irq_cnt#3 irq_cnt zp ZP_BYTE:89 60.0
(byte) irq_raster_next
(byte) irq_raster_next#0 irq_raster_next zp ZP_BYTE:86 0.3076923076923077
(byte) irq_raster_next#1 irq_raster_next zp ZP_BYTE:86 1.0
@ -287,14 +288,16 @@
(byte) irq_raster_next#4 irq_raster_next zp ZP_BYTE:86 8.0
(byte) irq_sprite_ptr
(byte) irq_sprite_ptr#0 irq_sprite_ptr zp ZP_BYTE:88 0.25806451612903225
(byte) irq_sprite_ptr#1 irq_sprite_ptr zp ZP_BYTE:88 20.0
(byte) irq_sprite_ptr#2 irq_sprite_ptr zp ZP_BYTE:88 20.0
(byte) irq_sprite_ptr#3 irq_sprite_ptr zp ZP_BYTE:88 20.0
(byte) irq_sprite_ptr#1 irq_sprite_ptr zp ZP_BYTE:88 4.0
(byte) irq_sprite_ptr#11 irq_sprite_ptr zp ZP_BYTE:88 60.0
(byte) irq_sprite_ptr#2 irq_sprite_ptr zp ZP_BYTE:88 4.0
(byte) irq_sprite_ptr#3 irq_sprite_ptr zp ZP_BYTE:88 4.0
(byte) irq_sprite_ypos
(byte) irq_sprite_ypos#0 irq_sprite_ypos zp ZP_BYTE:87 0.27586206896551724
(byte) irq_sprite_ypos#1 irq_sprite_ypos zp ZP_BYTE:87 20.0
(byte) irq_sprite_ypos#2 irq_sprite_ypos zp ZP_BYTE:87 20.0
(byte) irq_sprite_ypos#3 irq_sprite_ypos zp ZP_BYTE:87 20.0
(byte) irq_sprite_ypos#1 irq_sprite_ypos zp ZP_BYTE:87 1.3333333333333333
(byte) irq_sprite_ypos#11 irq_sprite_ypos zp ZP_BYTE:87 60.0
(byte) irq_sprite_ypos#2 irq_sprite_ypos zp ZP_BYTE:87 2.0
(byte) irq_sprite_ypos#3 irq_sprite_ypos zp ZP_BYTE:87 2.0
(byte()) keyboard_event_get()
(label) keyboard_event_get::@1
(label) keyboard_event_get::@return
@ -307,7 +310,7 @@
(byte~) keyboard_event_pressed::$1 reg byte a 4.0
(label) keyboard_event_pressed::@return
(byte) keyboard_event_pressed::keycode
(byte) keyboard_event_pressed::keycode#5 keycode zp ZP_BYTE:63 1.3333333333333333
(byte) keyboard_event_pressed::keycode#5 keycode zp ZP_BYTE:64 1.3333333333333333
(byte) keyboard_event_pressed::return
(byte) keyboard_event_pressed::return#0 reg byte a 4.0
(byte) keyboard_event_pressed::return#1 reg byte a 4.0
@ -355,28 +358,28 @@
(byte) keyboard_event_scan::event_type
(byte) keyboard_event_scan::event_type#0 reg byte a 20002.0
(byte) keyboard_event_scan::keycode
(byte) keyboard_event_scan::keycode#1 keycode zp ZP_BYTE:65 2002.0
(byte) keyboard_event_scan::keycode#10 keycode zp ZP_BYTE:65 3154.230769230769
(byte) keyboard_event_scan::keycode#11 keycode zp ZP_BYTE:65 500.5
(byte) keyboard_event_scan::keycode#13 keycode zp ZP_BYTE:65 1001.0
(byte) keyboard_event_scan::keycode#14 keycode zp ZP_BYTE:65 5250.75
(byte) keyboard_event_scan::keycode#1 keycode zp ZP_BYTE:66 2002.0
(byte) keyboard_event_scan::keycode#10 keycode zp ZP_BYTE:66 3154.230769230769
(byte) keyboard_event_scan::keycode#11 keycode zp ZP_BYTE:66 500.5
(byte) keyboard_event_scan::keycode#13 keycode zp ZP_BYTE:66 1001.0
(byte) keyboard_event_scan::keycode#14 keycode zp ZP_BYTE:66 5250.75
(byte) keyboard_event_scan::row
(byte) keyboard_event_scan::row#1 row zp ZP_BYTE:64 1501.5
(byte) keyboard_event_scan::row#2 row zp ZP_BYTE:64 600.24
(byte) keyboard_event_scan::row#1 row zp ZP_BYTE:65 1501.5
(byte) keyboard_event_scan::row#2 row zp ZP_BYTE:65 600.24
(byte) keyboard_event_scan::row_scan
(byte) keyboard_event_scan::row_scan#0 row_scan zp ZP_BYTE:108 1278.0555555555554
(byte[8]) keyboard_events
(const byte[8]) keyboard_events#0 keyboard_events = { fill( 8, 0) }
(byte) keyboard_events_size
(byte) keyboard_events_size#1 keyboard_events_size zp ZP_BYTE:66 20002.0
(byte) keyboard_events_size#10 keyboard_events_size zp ZP_BYTE:66 8100.9000000000015
(byte) keyboard_events_size#13 keyboard_events_size zp ZP_BYTE:66 97.06451612903226
(byte) keyboard_events_size#16 keyboard_events_size zp ZP_BYTE:66 4.461538461538461
(byte) keyboard_events_size#19 keyboard_events_size zp ZP_BYTE:66 18.999999999999996
(byte) keyboard_events_size#2 keyboard_events_size zp ZP_BYTE:66 20002.0
(byte) keyboard_events_size#29 keyboard_events_size zp ZP_BYTE:66 10201.2
(byte) keyboard_events_size#30 keyboard_events_size zp ZP_BYTE:66 429.2857142857143
(byte) keyboard_events_size#4 keyboard_events_size zp ZP_BYTE:66 3.0
(byte) keyboard_events_size#1 keyboard_events_size zp ZP_BYTE:67 20002.0
(byte) keyboard_events_size#10 keyboard_events_size zp ZP_BYTE:67 8100.9000000000015
(byte) keyboard_events_size#13 keyboard_events_size zp ZP_BYTE:67 97.06451612903226
(byte) keyboard_events_size#16 keyboard_events_size zp ZP_BYTE:67 4.461538461538461
(byte) keyboard_events_size#19 keyboard_events_size zp ZP_BYTE:67 18.999999999999996
(byte) keyboard_events_size#2 keyboard_events_size zp ZP_BYTE:67 20002.0
(byte) keyboard_events_size#29 keyboard_events_size zp ZP_BYTE:67 10201.2
(byte) keyboard_events_size#30 keyboard_events_size zp ZP_BYTE:67 429.2857142857143
(byte) keyboard_events_size#4 keyboard_events_size zp ZP_BYTE:67 3.0
(byte[8]) keyboard_matrix_col_bitmask
(const byte[8]) keyboard_matrix_col_bitmask#0 keyboard_matrix_col_bitmask = { (byte) 1, (byte) 2, (byte) 4, (byte) 8, (byte) $10, (byte) $20, (byte) $40, (byte) $80 }
(byte()) keyboard_matrix_read((byte) keyboard_matrix_read::rowid)
@ -393,25 +396,25 @@
(byte[8]) keyboard_scan_values
(const byte[8]) keyboard_scan_values#0 keyboard_scan_values = { fill( 8, 0) }
(byte) level
(byte) level#10 level zp ZP_BYTE:44 1.909090909090909
(byte) level#17 level zp ZP_BYTE:44 3.135135135135135
(byte) level#19 level zp ZP_BYTE:44 1.1428571428571428
(byte) level#21 level zp ZP_BYTE:44 0.4444444444444444
(byte) level#33 level zp ZP_BYTE:44 6.0
(byte) level#10 level zp ZP_BYTE:45 1.909090909090909
(byte) level#17 level zp ZP_BYTE:45 3.135135135135135
(byte) level#19 level zp ZP_BYTE:45 1.1428571428571428
(byte) level#21 level zp ZP_BYTE:45 0.4444444444444444
(byte) level#33 level zp ZP_BYTE:45 6.0
(byte) level_bcd
(byte) level_bcd#11 level_bcd zp ZP_BYTE:46 2.0
(byte) level_bcd#17 level_bcd zp ZP_BYTE:46 1.9999999999999998
(byte) level_bcd#19 level_bcd zp ZP_BYTE:46 1.1428571428571428
(byte) level_bcd#21 level_bcd zp ZP_BYTE:46 2.6666666666666665
(byte) level_bcd#31 level_bcd zp ZP_BYTE:46 6.0
(byte) level_bcd#62 level_bcd zp ZP_BYTE:46 0.6000000000000001
(byte) level_bcd#8 level_bcd zp ZP_BYTE:46 4.0
(byte) level_bcd#11 level_bcd zp ZP_BYTE:47 2.0
(byte) level_bcd#17 level_bcd zp ZP_BYTE:47 1.9999999999999998
(byte) level_bcd#19 level_bcd zp ZP_BYTE:47 1.1428571428571428
(byte) level_bcd#21 level_bcd zp ZP_BYTE:47 2.6666666666666665
(byte) level_bcd#31 level_bcd zp ZP_BYTE:47 6.0
(byte) level_bcd#62 level_bcd zp ZP_BYTE:47 0.6000000000000001
(byte) level_bcd#8 level_bcd zp ZP_BYTE:47 4.0
(word) lines_bcd
(word) lines_bcd#15 lines_bcd zp ZP_WORD:38 2.0338983050847457
(word) lines_bcd#17 lines_bcd zp ZP_WORD:38 1.1428571428571428
(word) lines_bcd#19 lines_bcd zp ZP_WORD:38 2.4400000000000004
(word) lines_bcd#26 lines_bcd zp ZP_WORD:38 6.0
(word) lines_bcd#29 lines_bcd zp ZP_WORD:38 1.0
(word) lines_bcd#15 lines_bcd zp ZP_WORD:39 2.0338983050847457
(word) lines_bcd#17 lines_bcd zp ZP_WORD:39 1.1428571428571428
(word) lines_bcd#19 lines_bcd zp ZP_WORD:39 2.4400000000000004
(word) lines_bcd#26 lines_bcd zp ZP_WORD:39 6.0
(word) lines_bcd#29 lines_bcd zp ZP_WORD:39 1.0
(void()) main()
(label) main::@1
(label) main::@10
@ -443,11 +446,11 @@
(byte) main::render
(byte) main::render#1 reg byte a 202.0
(byte) next_piece_idx
(byte) next_piece_idx#10 next_piece_idx zp ZP_BYTE:54 2.608695652173914
(byte) next_piece_idx#10 next_piece_idx zp ZP_BYTE:55 2.608695652173914
(byte) next_piece_idx#12 reg byte x 3.4
(byte) next_piece_idx#16 next_piece_idx zp ZP_BYTE:54 3.4324324324324325
(byte) next_piece_idx#17 next_piece_idx zp ZP_BYTE:54 6.0
(byte) next_piece_idx#30 next_piece_idx zp ZP_BYTE:54 6.0
(byte) next_piece_idx#16 next_piece_idx zp ZP_BYTE:55 3.4324324324324325
(byte) next_piece_idx#17 next_piece_idx zp ZP_BYTE:55 6.0
(byte) next_piece_idx#30 next_piece_idx zp ZP_BYTE:55 6.0
(byte~) next_piece_idx#77 reg byte x 4.0
(byte~) next_piece_idx#78 reg byte x 22.0
(byte()) play_collision((byte) play_collision::xpos , (byte) play_collision::ypos , (byte) play_collision::orientation)
@ -469,13 +472,13 @@
(byte) play_collision::c#2 reg byte x 2222.4444444444443
(byte) play_collision::i
(byte) play_collision::i#1 i zp ZP_BYTE:96 1615.6153846153845
(byte~) play_collision::i#10 i#10 zp ZP_BYTE:35 2002.0
(byte~) play_collision::i#12 i#12 zp ZP_BYTE:35 20002.0
(byte) play_collision::i#2 i#2 zp ZP_BYTE:35 15502.0
(byte) play_collision::i#3 i#3 zp ZP_BYTE:35 500.5
(byte~) play_collision::i#10 i#10 zp ZP_BYTE:36 2002.0
(byte~) play_collision::i#12 i#12 zp ZP_BYTE:36 20002.0
(byte) play_collision::i#2 i#2 zp ZP_BYTE:36 15502.0
(byte) play_collision::i#3 i#3 zp ZP_BYTE:36 500.5
(byte) play_collision::l
(byte) play_collision::l#1 l zp ZP_BYTE:34 1001.0
(byte) play_collision::l#6 l zp ZP_BYTE:34 117.76470588235294
(byte) play_collision::l#1 l zp ZP_BYTE:35 1001.0
(byte) play_collision::l#6 l zp ZP_BYTE:35 117.76470588235294
(byte) play_collision::orientation
(byte) play_collision::orientation#0 reg byte x 2.0
(byte) play_collision::orientation#1 reg byte x 2.0
@ -483,7 +486,7 @@
(byte) play_collision::orientation#3 reg byte x 2.0
(byte) play_collision::orientation#5 reg byte x 10.0
(byte*) play_collision::piece_gfx
(byte*) play_collision::piece_gfx#0 piece_gfx zp ZP_WORD:30 476.3333333333333
(byte*) play_collision::piece_gfx#0 piece_gfx zp ZP_WORD:31 476.3333333333333
(byte*) play_collision::playfield_line
(byte*) play_collision::playfield_line#0 playfield_line zp ZP_WORD:94 785.8571428571429
(byte) play_collision::return
@ -494,26 +497,26 @@
(byte) play_collision::return#14 reg byte a 4.0
(byte) play_collision::return#15 reg byte a 1.4285714285714284
(byte) play_collision::xp
(byte) play_collision::xp#1 xp zp ZP_BYTE:36 5000.5
(byte) play_collision::xp#2 xp zp ZP_BYTE:36 6375.75
(byte~) play_collision::xp#8 xp zp ZP_BYTE:36 2002.0
(byte) play_collision::xp#1 xp zp ZP_BYTE:37 5000.5
(byte) play_collision::xp#2 xp zp ZP_BYTE:37 6375.75
(byte~) play_collision::xp#8 xp zp ZP_BYTE:37 2002.0
(byte) play_collision::xpos
(byte) play_collision::xpos#0 xpos zp ZP_BYTE:32 1.3333333333333333
(byte) play_collision::xpos#1 xpos zp ZP_BYTE:32 1.0
(byte) play_collision::xpos#2 xpos zp ZP_BYTE:32 1.0
(byte) play_collision::xpos#3 xpos zp ZP_BYTE:32 1.0
(byte) play_collision::xpos#4 xpos zp ZP_BYTE:32 1.3333333333333333
(byte) play_collision::xpos#6 xpos zp ZP_BYTE:32 45.95454545454545
(byte) play_collision::xpos#0 xpos zp ZP_BYTE:33 1.3333333333333333
(byte) play_collision::xpos#1 xpos zp ZP_BYTE:33 1.0
(byte) play_collision::xpos#2 xpos zp ZP_BYTE:33 1.0
(byte) play_collision::xpos#3 xpos zp ZP_BYTE:33 1.0
(byte) play_collision::xpos#4 xpos zp ZP_BYTE:33 1.3333333333333333
(byte) play_collision::xpos#6 xpos zp ZP_BYTE:33 45.95454545454545
(byte) play_collision::yp
(byte) play_collision::yp#0 yp zp ZP_BYTE:33 6.0
(byte) play_collision::yp#1 yp zp ZP_BYTE:33 500.5
(byte) play_collision::yp#2 yp zp ZP_BYTE:33 812.875
(byte) play_collision::yp#0 yp zp ZP_BYTE:34 6.0
(byte) play_collision::yp#1 yp zp ZP_BYTE:34 500.5
(byte) play_collision::yp#2 yp zp ZP_BYTE:34 812.875
(byte) play_collision::ypos
(byte) play_collision::ypos#0 ypos zp ZP_BYTE:33 1.0
(byte) play_collision::ypos#1 ypos zp ZP_BYTE:33 1.3333333333333333
(byte) play_collision::ypos#2 ypos zp ZP_BYTE:33 1.3333333333333333
(byte) play_collision::ypos#3 ypos zp ZP_BYTE:33 1.3333333333333333
(byte) play_collision::ypos#4 ypos zp ZP_BYTE:33 2.0
(byte) play_collision::ypos#0 ypos zp ZP_BYTE:34 1.0
(byte) play_collision::ypos#1 ypos zp ZP_BYTE:34 1.3333333333333333
(byte) play_collision::ypos#2 ypos zp ZP_BYTE:34 1.3333333333333333
(byte) play_collision::ypos#3 ypos zp ZP_BYTE:34 1.3333333333333333
(byte) play_collision::ypos#4 ypos zp ZP_BYTE:34 2.0
(void()) play_increase_level()
(byte~) play_increase_level::$1 reg byte a 4.0
(byte~) play_increase_level::$5 reg byte a 4004.0
@ -538,14 +541,14 @@
(byte) play_init::b#1 reg byte x 16.5
(byte) play_init::b#2 reg byte x 11.0
(byte) play_init::idx
(byte) play_init::idx#1 idx zp ZP_BYTE:69 7.333333333333333
(byte) play_init::idx#2 idx zp ZP_BYTE:69 6.6000000000000005
(byte) play_init::idx#1 idx zp ZP_BYTE:70 7.333333333333333
(byte) play_init::idx#2 idx zp ZP_BYTE:70 6.6000000000000005
(byte) play_init::j
(byte) play_init::j#1 reg byte y 16.5
(byte) play_init::j#2 reg byte y 7.333333333333333
(byte*) play_init::pli
(byte*) play_init::pli#1 pli zp ZP_WORD:67 5.5
(byte*) play_init::pli#2 pli zp ZP_WORD:67 8.25
(byte*) play_init::pli#1 pli zp ZP_WORD:68 5.5
(byte*) play_init::pli#2 pli zp ZP_WORD:68 8.25
(void()) play_lock_current()
(byte~) play_lock_current::$4 reg byte a 2002.0
(label) play_lock_current::@1
@ -561,23 +564,23 @@
(byte) play_lock_current::c#2 reg byte x 4000.4
(byte) play_lock_current::i
(byte) play_lock_current::i#1 i zp ZP_BYTE:106 2333.6666666666665
(byte) play_lock_current::i#2 i#2 zp ZP_BYTE:61 15502.0
(byte) play_lock_current::i#3 i#3 zp ZP_BYTE:61 500.5
(byte~) play_lock_current::i#7 i#7 zp ZP_BYTE:61 2002.0
(byte~) play_lock_current::i#9 i#9 zp ZP_BYTE:61 20002.0
(byte) play_lock_current::i#2 i#2 zp ZP_BYTE:62 15502.0
(byte) play_lock_current::i#3 i#3 zp ZP_BYTE:62 500.5
(byte~) play_lock_current::i#7 i#7 zp ZP_BYTE:62 2002.0
(byte~) play_lock_current::i#9 i#9 zp ZP_BYTE:62 20002.0
(byte) play_lock_current::l
(byte) play_lock_current::l#1 l zp ZP_BYTE:60 1001.0
(byte) play_lock_current::l#6 l zp ZP_BYTE:60 154.0
(byte) play_lock_current::l#1 l zp ZP_BYTE:61 1001.0
(byte) play_lock_current::l#6 l zp ZP_BYTE:61 154.0
(byte*) play_lock_current::playfield_line
(byte*) play_lock_current::playfield_line#0 playfield_line zp ZP_WORD:104 1100.2
(byte) play_lock_current::xp
(byte) play_lock_current::xp#0 xp zp ZP_BYTE:62 2002.0
(byte) play_lock_current::xp#1 xp zp ZP_BYTE:62 5000.5
(byte) play_lock_current::xp#2 xp zp ZP_BYTE:62 7751.0
(byte) play_lock_current::xp#0 xp zp ZP_BYTE:63 2002.0
(byte) play_lock_current::xp#1 xp zp ZP_BYTE:63 5000.5
(byte) play_lock_current::xp#2 xp zp ZP_BYTE:63 7751.0
(byte) play_lock_current::yp
(byte) play_lock_current::yp#0 yp zp ZP_BYTE:37 4.0
(byte) play_lock_current::yp#1 yp zp ZP_BYTE:37 500.5
(byte) play_lock_current::yp#2 yp zp ZP_BYTE:37 250.41666666666669
(byte) play_lock_current::yp#0 yp zp ZP_BYTE:38 4.0
(byte) play_lock_current::yp#1 yp zp ZP_BYTE:38 500.5
(byte) play_lock_current::yp#2 yp zp ZP_BYTE:38 250.41666666666669
(byte()) play_move_down((byte) play_move_down::key_event)
(byte~) play_move_down::$12 reg byte a 4.0
(byte~) play_move_down::$2 reg byte a 4.0
@ -642,9 +645,9 @@
(byte) play_move_rotate::key_event
(byte) play_move_rotate::key_event#0 reg byte a 3.0
(byte) play_move_rotate::orientation
(byte) play_move_rotate::orientation#1 orientation zp ZP_BYTE:29 4.0
(byte) play_move_rotate::orientation#2 orientation zp ZP_BYTE:29 4.0
(byte) play_move_rotate::orientation#3 orientation zp ZP_BYTE:29 0.8888888888888888
(byte) play_move_rotate::orientation#1 orientation zp ZP_BYTE:30 4.0
(byte) play_move_rotate::orientation#2 orientation zp ZP_BYTE:30 4.0
(byte) play_move_rotate::orientation#3 orientation zp ZP_BYTE:30 0.8888888888888888
(byte) play_move_rotate::return
(byte) play_move_rotate::return#0 reg byte a 4.0
(byte) play_move_rotate::return#2 reg byte a 0.6666666666666666
@ -659,11 +662,11 @@
(byte) play_movement::key_event
(byte) play_movement::key_event#0 key_event zp ZP_BYTE:90 9.727272727272727
(byte) play_movement::render
(byte) play_movement::render#1 render zp ZP_BYTE:28 1.0
(byte) play_movement::render#2 render zp ZP_BYTE:28 0.8
(byte) play_movement::render#1 render zp ZP_BYTE:29 1.0
(byte) play_movement::render#2 render zp ZP_BYTE:29 0.8
(byte) play_movement::return
(byte) play_movement::return#0 return zp ZP_BYTE:28 4.0
(byte) play_movement::return#2 return zp ZP_BYTE:28 34.99999999999999
(byte) play_movement::return#0 return zp ZP_BYTE:29 4.0
(byte) play_movement::return#2 return zp ZP_BYTE:29 34.99999999999999
(byte) play_movement::return#3 reg byte a 202.0
(byte()) play_remove_lines()
(label) play_remove_lines::@1
@ -679,16 +682,16 @@
(byte) play_remove_lines::c
(byte) play_remove_lines::c#0 c zp ZP_BYTE:103 6000.6
(byte) play_remove_lines::full
(byte) play_remove_lines::full#2 full zp ZP_BYTE:59 4200.6
(byte) play_remove_lines::full#4 full zp ZP_BYTE:59 4000.4
(byte) play_remove_lines::full#2 full zp ZP_BYTE:60 4200.6
(byte) play_remove_lines::full#4 full zp ZP_BYTE:60 4000.4
(byte) play_remove_lines::r
(byte) play_remove_lines::r#1 reg byte y 1500.2142857142858
(byte) play_remove_lines::r#2 reg byte y 15502.0
(byte) play_remove_lines::r#3 reg byte y 2002.0
(byte) play_remove_lines::removed
(byte) play_remove_lines::removed#1 removed zp ZP_BYTE:57 2002.0
(byte) play_remove_lines::removed#11 removed zp ZP_BYTE:57 231.0
(byte) play_remove_lines::removed#8 removed zp ZP_BYTE:57 333.8888888888889
(byte) play_remove_lines::removed#1 removed zp ZP_BYTE:58 2002.0
(byte) play_remove_lines::removed#11 removed zp ZP_BYTE:58 231.0
(byte) play_remove_lines::removed#8 removed zp ZP_BYTE:58 333.8888888888889
(byte) play_remove_lines::return
(byte) play_remove_lines::return#0 reg byte a 4.0
(byte) play_remove_lines::w
@ -700,11 +703,11 @@
(byte) play_remove_lines::w#4 reg byte x 4429.142857142857
(byte) play_remove_lines::w#6 reg byte x 1668.3333333333335
(byte) play_remove_lines::x
(byte) play_remove_lines::x#1 x zp ZP_BYTE:58 15001.5
(byte) play_remove_lines::x#2 x zp ZP_BYTE:58 2500.25
(byte) play_remove_lines::x#1 x zp ZP_BYTE:59 15001.5
(byte) play_remove_lines::x#2 x zp ZP_BYTE:59 2500.25
(byte) play_remove_lines::y
(byte) play_remove_lines::y#1 y zp ZP_BYTE:56 1501.5
(byte) play_remove_lines::y#8 y zp ZP_BYTE:56 133.46666666666667
(byte) play_remove_lines::y#1 y zp ZP_BYTE:57 1501.5
(byte) play_remove_lines::y#8 y zp ZP_BYTE:57 133.46666666666667
(void()) play_spawn_current()
(byte~) play_spawn_current::$1 reg byte a 4.0
(byte~) play_spawn_current::$7 $7 zp ZP_BYTE:97 0.06451612903225806
@ -717,8 +720,8 @@
(byte) play_spawn_current::current_piece_idx
(byte) play_spawn_current::current_piece_idx#0 reg byte x 2.5
(byte) play_spawn_current::piece_idx
(byte) play_spawn_current::piece_idx#1 piece_idx zp ZP_BYTE:54 2002.0
(byte) play_spawn_current::piece_idx#2 piece_idx zp ZP_BYTE:54 100.5
(byte) play_spawn_current::piece_idx#1 piece_idx zp ZP_BYTE:55 2002.0
(byte) play_spawn_current::piece_idx#2 piece_idx zp ZP_BYTE:55 100.5
(label) play_spawn_current::sid_rnd1
(byte) play_spawn_current::sid_rnd1_return
(byte) play_spawn_current::sid_rnd1_return#0 reg byte a 2002.0
@ -762,21 +765,21 @@
(byte) render_bcd::bcd#5 reg byte x 4.0
(byte) render_bcd::bcd#6 reg byte x 2.0
(word) render_bcd::offset
(word) render_bcd::offset#6 offset zp ZP_WORD:7 2.0
(word) render_bcd::offset#6 offset zp ZP_WORD:8 2.0
(byte) render_bcd::only_low
(byte) render_bcd::only_low#6 reg byte y 1.0
(byte*) render_bcd::screen
(byte*) render_bcd::screen#0 screen zp ZP_WORD:5 2.0
(byte*) render_bcd::screen#1 screen zp ZP_WORD:5 2.0
(byte*) render_bcd::screen#2 screen zp ZP_WORD:5 2.0
(byte*) render_bcd::screen#3 screen zp ZP_WORD:5 4.0
(byte*) render_bcd::screen#4 screen zp ZP_WORD:5 4.0
(byte*) render_bcd::screen#5 screen zp ZP_WORD:5 2.0
(byte*) render_bcd::screen#6 screen zp ZP_WORD:5 14.0
(byte*) render_bcd::screen#0 screen zp ZP_WORD:6 2.0
(byte*) render_bcd::screen#1 screen zp ZP_WORD:6 2.0
(byte*) render_bcd::screen#2 screen zp ZP_WORD:6 2.0
(byte*) render_bcd::screen#3 screen zp ZP_WORD:6 4.0
(byte*) render_bcd::screen#4 screen zp ZP_WORD:6 4.0
(byte*) render_bcd::screen#5 screen zp ZP_WORD:6 2.0
(byte*) render_bcd::screen#6 screen zp ZP_WORD:6 14.0
(byte*) render_bcd::screen_pos
(byte*) render_bcd::screen_pos#0 screen_pos zp ZP_WORD:7 1.6
(byte*) render_bcd::screen_pos#2 screen_pos zp ZP_WORD:7 4.0
(byte*) render_bcd::screen_pos#3 screen_pos zp ZP_WORD:7 2.0
(byte*) render_bcd::screen_pos#0 screen_pos zp ZP_WORD:8 1.6
(byte*) render_bcd::screen_pos#2 screen_pos zp ZP_WORD:8 4.0
(byte*) render_bcd::screen_pos#3 screen_pos zp ZP_WORD:8 2.0
(void()) render_init()
(byte~) render_init::$15 reg byte x 16.5
(label) render_init::@1
@ -787,11 +790,11 @@
(byte) render_init::i#1 reg byte y 16.5
(byte) render_init::i#2 reg byte y 5.5
(byte*) render_init::li_1
(byte*) render_init::li_1#1 li_1 zp ZP_WORD:71 5.5
(byte*) render_init::li_1#2 li_1 zp ZP_WORD:71 8.25
(byte*) render_init::li_1#1 li_1 zp ZP_WORD:72 5.5
(byte*) render_init::li_1#2 li_1 zp ZP_WORD:72 8.25
(byte*) render_init::li_2
(byte*) render_init::li_2#1 li_2 zp ZP_WORD:73 7.333333333333333
(byte*) render_init::li_2#2 li_2 zp ZP_WORD:73 6.6000000000000005
(byte*) render_init::li_2#1 li_2 zp ZP_WORD:74 7.333333333333333
(byte*) render_init::li_2#2 li_2 zp ZP_WORD:74 6.6000000000000005
(label) render_init::vicSelectGfxBank1
(byte~) render_init::vicSelectGfxBank1_$0
(label) render_init::vicSelectGfxBank1_@1
@ -821,24 +824,24 @@
(byte) render_moving::current_cell
(byte) render_moving::current_cell#0 reg byte a 1001.0
(byte) render_moving::i
(byte) render_moving::i#1 i zp ZP_BYTE:21 202.0
(byte) render_moving::i#2 i zp ZP_BYTE:21 500.5
(byte) render_moving::i#3 i zp ZP_BYTE:21 50.5
(byte) render_moving::i#4 i zp ZP_BYTE:21 1552.0
(byte) render_moving::i#8 i zp ZP_BYTE:21 300.75
(byte) render_moving::i#1 i zp ZP_BYTE:22 202.0
(byte) render_moving::i#2 i zp ZP_BYTE:22 500.5
(byte) render_moving::i#3 i zp ZP_BYTE:22 50.5
(byte) render_moving::i#4 i zp ZP_BYTE:22 1552.0
(byte) render_moving::i#8 i zp ZP_BYTE:22 300.75
(byte) render_moving::l
(byte) render_moving::l#1 l zp ZP_BYTE:20 151.5
(byte) render_moving::l#4 l zp ZP_BYTE:20 11.882352941176471
(byte) render_moving::l#1 l zp ZP_BYTE:21 151.5
(byte) render_moving::l#4 l zp ZP_BYTE:21 11.882352941176471
(byte*) render_moving::screen_line
(byte*) render_moving::screen_line#0 screen_line zp ZP_WORD:92 110.19999999999999
(byte) render_moving::xpos
(byte) render_moving::xpos#0 xpos zp ZP_BYTE:22 202.0
(byte) render_moving::xpos#1 xpos zp ZP_BYTE:22 667.3333333333334
(byte) render_moving::xpos#2 xpos zp ZP_BYTE:22 620.8
(byte) render_moving::xpos#0 xpos zp ZP_BYTE:23 202.0
(byte) render_moving::xpos#1 xpos zp ZP_BYTE:23 667.3333333333334
(byte) render_moving::xpos#2 xpos zp ZP_BYTE:23 620.8
(byte) render_moving::ypos
(byte) render_moving::ypos#0 ypos zp ZP_BYTE:19 4.0
(byte) render_moving::ypos#1 ypos zp ZP_BYTE:19 67.33333333333333
(byte) render_moving::ypos#2 ypos zp ZP_BYTE:19 25.375
(byte) render_moving::ypos#0 ypos zp ZP_BYTE:20 4.0
(byte) render_moving::ypos#1 ypos zp ZP_BYTE:20 67.33333333333333
(byte) render_moving::ypos#2 ypos zp ZP_BYTE:20 25.375
(void()) render_next()
(byte~) render_next::$9 reg byte y 1.0
(label) render_next::@1
@ -856,23 +859,23 @@
(byte) render_next::cell
(byte) render_next::cell#0 reg byte a 1001.0
(byte) render_next::l
(byte) render_next::l#1 l zp ZP_BYTE:9 151.5
(byte) render_next::l#7 l zp ZP_BYTE:9 18.363636363636363
(byte) render_next::l#1 l zp ZP_BYTE:10 151.5
(byte) render_next::l#7 l zp ZP_BYTE:10 18.363636363636363
(word) render_next::next_area_offset
(const word) render_next::next_area_offset#0 next_area_offset = (number) $28*(number) $c+(number) $18+(number) 4
(byte) render_next::next_piece_char
(byte) render_next::next_piece_char#0 next_piece_char zp ZP_BYTE:91 66.86666666666667
(byte*) render_next::next_piece_gfx
(byte*) render_next::next_piece_gfx#1 next_piece_gfx zp ZP_WORD:10 210.29999999999998
(byte*) render_next::next_piece_gfx#2 next_piece_gfx zp ZP_WORD:10 1552.0
(byte*) render_next::next_piece_gfx#3 next_piece_gfx zp ZP_WORD:10 204.0
(byte*~) render_next::next_piece_gfx#9 next_piece_gfx zp ZP_WORD:10 4.0
(byte*) render_next::next_piece_gfx#1 next_piece_gfx zp ZP_WORD:11 210.29999999999998
(byte*) render_next::next_piece_gfx#2 next_piece_gfx zp ZP_WORD:11 1552.0
(byte*) render_next::next_piece_gfx#3 next_piece_gfx zp ZP_WORD:11 204.0
(byte*~) render_next::next_piece_gfx#9 next_piece_gfx zp ZP_WORD:11 4.0
(byte*) render_next::screen_next_area
(byte*) render_next::screen_next_area#10 screen_next_area zp ZP_WORD:12 204.0
(byte*) render_next::screen_next_area#11 screen_next_area zp ZP_WORD:12 0.5
(byte*) render_next::screen_next_area#3 screen_next_area zp ZP_WORD:12 701.0
(byte*) render_next::screen_next_area#4 screen_next_area zp ZP_WORD:12 67.33333333333333
(byte*) render_next::screen_next_area#5 screen_next_area zp ZP_WORD:12 684.1666666666667
(byte*) render_next::screen_next_area#10 screen_next_area zp ZP_WORD:13 204.0
(byte*) render_next::screen_next_area#11 screen_next_area zp ZP_WORD:13 0.5
(byte*) render_next::screen_next_area#3 screen_next_area zp ZP_WORD:13 701.0
(byte*) render_next::screen_next_area#4 screen_next_area zp ZP_WORD:13 67.33333333333333
(byte*) render_next::screen_next_area#5 screen_next_area zp ZP_WORD:13 684.1666666666667
(void()) render_playfield()
(byte~) render_playfield::$2 reg byte a 202.0
(byte~) render_playfield::$6 reg byte a 202.0
@ -881,19 +884,19 @@
(label) render_playfield::@3
(label) render_playfield::@return
(byte) render_playfield::c
(byte) render_playfield::c#1 c zp ZP_BYTE:27 1501.5
(byte) render_playfield::c#2 c zp ZP_BYTE:27 500.5
(byte) render_playfield::c#1 c zp ZP_BYTE:28 1501.5
(byte) render_playfield::c#2 c zp ZP_BYTE:28 500.5
(byte) render_playfield::i
(byte) render_playfield::i#1 i zp ZP_BYTE:24 420.59999999999997
(byte) render_playfield::i#2 i zp ZP_BYTE:24 1034.6666666666667
(byte) render_playfield::i#3 i zp ZP_BYTE:24 50.5
(byte) render_playfield::i#1 i zp ZP_BYTE:25 420.59999999999997
(byte) render_playfield::i#2 i zp ZP_BYTE:25 1034.6666666666667
(byte) render_playfield::i#3 i zp ZP_BYTE:25 50.5
(byte) render_playfield::l
(byte) render_playfield::l#1 l zp ZP_BYTE:23 151.5
(byte) render_playfield::l#2 l zp ZP_BYTE:23 30.299999999999997
(byte) render_playfield::l#1 l zp ZP_BYTE:24 151.5
(byte) render_playfield::l#2 l zp ZP_BYTE:24 30.299999999999997
(byte*) render_playfield::screen_line
(byte*) render_playfield::screen_line#0 screen_line zp ZP_WORD:25 202.0
(byte*) render_playfield::screen_line#1 screen_line zp ZP_WORD:25 500.5
(byte*) render_playfield::screen_line#2 screen_line zp ZP_WORD:25 1552.0
(byte*) render_playfield::screen_line#0 screen_line zp ZP_WORD:26 202.0
(byte*) render_playfield::screen_line#1 screen_line zp ZP_WORD:26 500.5
(byte*) render_playfield::screen_line#2 screen_line zp ZP_WORD:26 1552.0
(void()) render_score()
(label) render_score::@1
(label) render_score::@2
@ -912,7 +915,7 @@
(word) render_score::score_offset
(const word) render_score::score_offset#0 score_offset = (number) $28*(number) 5+(number) $1c
(byte*) render_score::screen
(byte*) render_score::screen#3 screen zp ZP_WORD:5 0.75
(byte*) render_score::screen#3 screen zp ZP_WORD:6 0.75
(void()) render_screen_original((byte*) render_screen_original::screen)
(label) render_screen_original::@1
(label) render_screen_original::@2
@ -923,30 +926,30 @@
(byte) render_screen_original::SPACE
(const byte) render_screen_original::SPACE#0 SPACE = (byte) 0
(byte*) render_screen_original::cols
(byte*) render_screen_original::cols#1 cols zp ZP_WORD:82 101.0
(byte*) render_screen_original::cols#2 cols zp ZP_WORD:82 75.75
(byte*) render_screen_original::cols#3 cols zp ZP_WORD:82 42.599999999999994
(byte*) render_screen_original::cols#4 cols zp ZP_WORD:82 78.5
(byte*) render_screen_original::cols#5 cols zp ZP_WORD:82 80.8
(byte*) render_screen_original::cols#6 cols zp ZP_WORD:82 101.0
(byte*) render_screen_original::cols#7 cols zp ZP_WORD:82 22.0
(byte*) render_screen_original::cols#1 cols zp ZP_WORD:83 101.0
(byte*) render_screen_original::cols#2 cols zp ZP_WORD:83 75.75
(byte*) render_screen_original::cols#3 cols zp ZP_WORD:83 42.599999999999994
(byte*) render_screen_original::cols#4 cols zp ZP_WORD:83 78.5
(byte*) render_screen_original::cols#5 cols zp ZP_WORD:83 80.8
(byte*) render_screen_original::cols#6 cols zp ZP_WORD:83 101.0
(byte*) render_screen_original::cols#7 cols zp ZP_WORD:83 22.0
(byte*) render_screen_original::ocols
(byte*) render_screen_original::ocols#1 ocols zp ZP_WORD:78 17.75
(byte*) render_screen_original::ocols#2 ocols zp ZP_WORD:78 67.33333333333333
(byte*) render_screen_original::ocols#4 ocols zp ZP_WORD:78 14.0
(byte*) render_screen_original::ocols#1 ocols zp ZP_WORD:79 17.75
(byte*) render_screen_original::ocols#2 ocols zp ZP_WORD:79 67.33333333333333
(byte*) render_screen_original::ocols#4 ocols zp ZP_WORD:79 14.0
(byte*) render_screen_original::oscr
(byte*) render_screen_original::oscr#1 oscr zp ZP_WORD:76 14.2
(byte*) render_screen_original::oscr#2 oscr zp ZP_WORD:76 134.66666666666666
(byte*) render_screen_original::oscr#4 oscr zp ZP_WORD:76 14.0
(byte*) render_screen_original::oscr#1 oscr zp ZP_WORD:77 14.2
(byte*) render_screen_original::oscr#2 oscr zp ZP_WORD:77 134.66666666666666
(byte*) render_screen_original::oscr#4 oscr zp ZP_WORD:77 14.0
(byte*) render_screen_original::screen
(byte*) render_screen_original::screen#10 screen zp ZP_WORD:80 30.42857142857143
(byte*) render_screen_original::screen#2 screen zp ZP_WORD:80 60.599999999999994
(byte*) render_screen_original::screen#3 screen zp ZP_WORD:80 43.285714285714285
(byte*) render_screen_original::screen#5 screen zp ZP_WORD:80 157.0
(byte*) render_screen_original::screen#6 screen zp ZP_WORD:80 202.0
(byte*) render_screen_original::screen#7 screen zp ZP_WORD:80 202.0
(byte*) render_screen_original::screen#8 screen zp ZP_WORD:80 24.0
(byte*) render_screen_original::screen#9 screen zp ZP_WORD:80 2.0
(byte*) render_screen_original::screen#10 screen zp ZP_WORD:81 30.42857142857143
(byte*) render_screen_original::screen#2 screen zp ZP_WORD:81 60.599999999999994
(byte*) render_screen_original::screen#3 screen zp ZP_WORD:81 43.285714285714285
(byte*) render_screen_original::screen#5 screen zp ZP_WORD:81 157.0
(byte*) render_screen_original::screen#6 screen zp ZP_WORD:81 202.0
(byte*) render_screen_original::screen#7 screen zp ZP_WORD:81 202.0
(byte*) render_screen_original::screen#8 screen zp ZP_WORD:81 24.0
(byte*) render_screen_original::screen#9 screen zp ZP_WORD:81 2.0
(byte) render_screen_original::x
(byte) render_screen_original::x#1 reg byte x 202.0
(byte) render_screen_original::x#2 reg byte x 202.0
@ -955,23 +958,24 @@
(byte) render_screen_original::x#5 reg byte x 43.285714285714285
(byte) render_screen_original::x#6 reg byte x 60.599999999999994
(byte) render_screen_original::y
(byte) render_screen_original::y#1 y zp ZP_BYTE:75 16.5
(byte) render_screen_original::y#6 y zp ZP_BYTE:75 0.9166666666666666
(byte) render_screen_original::y#1 y zp ZP_BYTE:76 16.5
(byte) render_screen_original::y#6 y zp ZP_BYTE:76 0.9166666666666666
(byte) render_screen_render
(byte) render_screen_render#11 render_screen_render zp ZP_BYTE:3 3.25
(byte) render_screen_render#15 reg byte a 13.0
(byte) render_screen_render#18 render_screen_render zp ZP_BYTE:3 0.923076923076923
(byte) render_screen_render#22 reg byte x 8.615384615384615
(byte) render_screen_render#33 render_screen_render#33 zp ZP_BYTE:14 5.333333333333333
(byte) render_screen_render#33 render_screen_render#33 zp ZP_BYTE:15 5.333333333333333
(byte~) render_screen_render#64 reg byte x 22.0
(byte~) render_screen_render#65 render_screen_render#65 zp ZP_BYTE:14 5.5
(byte~) render_screen_render#65 render_screen_render#65 zp ZP_BYTE:15 5.5
(byte~) render_screen_render#66 reg byte a 11.0
(byte) render_screen_show
(byte) render_screen_show#13 render_screen_show zp ZP_BYTE:2 4.333333333333333
(byte) render_screen_show#16 render_screen_show zp ZP_BYTE:2 0.425
(byte) render_screen_showing
(byte) render_screen_showing#0 render_screen_showing zp ZP_BYTE:85 0.4
(byte) render_screen_showing#1 render_screen_showing zp ZP_BYTE:85 20.0
(byte) render_screen_showing#0 render_screen_showing zp ZP_BYTE:4 0.1276595744680851
(byte) render_screen_showing#1 render_screen_showing zp ZP_BYTE:4 3.8000000000000003
(byte) render_screen_showing#13 render_screen_showing zp ZP_BYTE:4 1140.0
(void()) render_screen_swap()
(label) render_screen_swap::@return
(void()) render_show()
@ -1010,12 +1014,12 @@
(dword[5]) score_add_bcd
(const dword[5]) score_add_bcd#0 score_add_bcd = { fill( 5, 0) }
(dword) score_bcd
(dword) score_bcd#0 score_bcd zp ZP_DWORD:40 0.1111111111111111
(dword) score_bcd#14 score_bcd zp ZP_DWORD:40 3.135135135135135
(dword) score_bcd#16 score_bcd zp ZP_DWORD:40 1.1428571428571428
(dword) score_bcd#18 score_bcd zp ZP_DWORD:40 2.3921568627450975
(dword) score_bcd#26 score_bcd zp ZP_DWORD:40 6.0
(dword) score_bcd#29 score_bcd zp ZP_DWORD:40 0.8571428571428571
(dword) score_bcd#0 score_bcd zp ZP_DWORD:41 0.1111111111111111
(dword) score_bcd#14 score_bcd zp ZP_DWORD:41 3.135135135135135
(dword) score_bcd#16 score_bcd zp ZP_DWORD:41 1.1428571428571428
(dword) score_bcd#18 score_bcd zp ZP_DWORD:41 2.3921568627450975
(dword) score_bcd#26 score_bcd zp ZP_DWORD:41 6.0
(dword) score_bcd#29 score_bcd zp ZP_DWORD:41 0.8571428571428571
(byte*[PLAYFIELD_LINES#0]) screen_lines_1
(const byte*[PLAYFIELD_LINES#0]) screen_lines_1#0 screen_lines_1 = { fill( PLAYFIELD_LINES#0, 0) }
(byte*[PLAYFIELD_LINES#0]) screen_lines_2
@ -1031,8 +1035,8 @@
(byte) sprites_init::s2
(byte) sprites_init::s2#0 reg byte x 22.0
(byte) sprites_init::xpos
(byte) sprites_init::xpos#1 xpos zp ZP_BYTE:70 7.333333333333333
(byte) sprites_init::xpos#2 xpos zp ZP_BYTE:70 8.25
(byte) sprites_init::xpos#1 xpos zp ZP_BYTE:71 7.333333333333333
(byte) sprites_init::xpos#2 xpos zp ZP_BYTE:71 8.25
interrupt(HARDWARE_CLOBBER)(void()) sprites_irq()
(byte~) sprites_irq::$0 reg byte x 4.0
(label) sprites_irq::@1
@ -1054,7 +1058,7 @@ interrupt(HARDWARE_CLOBBER)(void()) sprites_irq()
(byte) sprites_irq::ptr#3 reg byte a 2.6666666666666665
(byte) sprites_irq::ptr#4 reg byte a 4.0
(byte) sprites_irq::raster_sprite_gfx_modify
(byte) sprites_irq::raster_sprite_gfx_modify#0 raster_sprite_gfx_modify zp ZP_BYTE:84 6.5
(byte) sprites_irq::raster_sprite_gfx_modify#0 raster_sprite_gfx_modify zp ZP_BYTE:85 6.5
(label) sprites_irq::toSpritePtr2
(word~) sprites_irq::toSpritePtr2_$0
(number~) sprites_irq::toSpritePtr2_$1
@ -1076,99 +1080,99 @@ interrupt(HARDWARE_CLOBBER)(void()) sprites_irq()
zp ZP_BYTE:2 [ render_screen_show#16 render_screen_show#13 ]
zp ZP_BYTE:3 [ render_screen_render#18 render_screen_render#11 ]
zp ZP_BYTE:4 [ current_movedown_counter#16 current_movedown_counter#14 current_movedown_counter#12 ]
zp ZP_WORD:5 [ render_score::screen#3 render_bcd::screen#6 render_bcd::screen#0 render_bcd::screen#1 render_bcd::screen#2 render_bcd::screen#3 render_bcd::screen#4 render_bcd::screen#5 ]
zp ZP_WORD:7 [ render_bcd::offset#6 render_bcd::screen_pos#3 render_bcd::screen_pos#0 render_bcd::screen_pos#2 ]
zp ZP_BYTE:4 [ render_screen_showing#13 render_screen_showing#1 render_screen_showing#0 ]
zp ZP_BYTE:5 [ current_movedown_counter#16 current_movedown_counter#14 current_movedown_counter#12 ]
zp ZP_WORD:6 [ render_score::screen#3 render_bcd::screen#6 render_bcd::screen#0 render_bcd::screen#1 render_bcd::screen#2 render_bcd::screen#3 render_bcd::screen#4 render_bcd::screen#5 ]
zp ZP_WORD:8 [ render_bcd::offset#6 render_bcd::screen_pos#3 render_bcd::screen_pos#0 render_bcd::screen_pos#2 ]
reg byte y [ render_bcd::only_low#6 ]
reg byte x [ render_bcd::bcd#6 render_bcd::bcd#0 render_bcd::bcd#1 render_bcd::bcd#2 render_bcd::bcd#3 render_bcd::bcd#4 render_bcd::bcd#5 ]
reg byte a [ render_screen_render#15 render_screen_render#66 ]
reg byte x [ next_piece_idx#12 next_piece_idx#77 next_piece_idx#78 ]
zp ZP_BYTE:9 [ render_next::l#7 render_next::l#1 ]
zp ZP_WORD:10 [ render_next::next_piece_gfx#2 render_next::next_piece_gfx#3 render_next::next_piece_gfx#1 render_next::next_piece_gfx#9 ]
zp ZP_WORD:12 [ render_next::screen_next_area#5 render_next::screen_next_area#10 render_next::screen_next_area#4 render_next::screen_next_area#11 render_next::screen_next_area#3 ]
zp ZP_BYTE:10 [ render_next::l#7 render_next::l#1 ]
zp ZP_WORD:11 [ render_next::next_piece_gfx#2 render_next::next_piece_gfx#3 render_next::next_piece_gfx#1 render_next::next_piece_gfx#9 ]
zp ZP_WORD:13 [ render_next::screen_next_area#5 render_next::screen_next_area#10 render_next::screen_next_area#4 render_next::screen_next_area#11 render_next::screen_next_area#3 ]
reg byte x [ render_next::c#2 render_next::c#1 ]
reg byte x [ current_ypos#13 current_ypos#98 current_ypos#99 ]
zp ZP_BYTE:14 [ render_screen_render#33 render_screen_render#65 ]
zp ZP_BYTE:15 [ current_xpos#59 current_xpos#119 current_xpos#120 ]
zp ZP_WORD:16 [ current_piece_gfx#64 current_piece_gfx#112 current_piece_gfx#113 ]
zp ZP_BYTE:18 [ current_piece_char#68 current_piece_char#100 current_piece_char#101 ]
zp ZP_BYTE:19 [ render_moving::ypos#2 render_moving::ypos#0 render_moving::ypos#1 ]
zp ZP_BYTE:20 [ render_moving::l#4 render_moving::l#1 ]
zp ZP_BYTE:21 [ render_moving::i#4 render_moving::i#3 render_moving::i#8 render_moving::i#2 render_moving::i#1 ]
zp ZP_BYTE:22 [ render_moving::xpos#2 render_moving::xpos#0 render_moving::xpos#1 ]
zp ZP_BYTE:15 [ render_screen_render#33 render_screen_render#65 ]
zp ZP_BYTE:16 [ current_xpos#59 current_xpos#119 current_xpos#120 ]
zp ZP_WORD:17 [ current_piece_gfx#64 current_piece_gfx#112 current_piece_gfx#113 ]
zp ZP_BYTE:19 [ current_piece_char#68 current_piece_char#100 current_piece_char#101 ]
zp ZP_BYTE:20 [ render_moving::ypos#2 render_moving::ypos#0 render_moving::ypos#1 ]
zp ZP_BYTE:21 [ render_moving::l#4 render_moving::l#1 ]
zp ZP_BYTE:22 [ render_moving::i#4 render_moving::i#3 render_moving::i#8 render_moving::i#2 render_moving::i#1 ]
zp ZP_BYTE:23 [ render_moving::xpos#2 render_moving::xpos#0 render_moving::xpos#1 ]
reg byte x [ render_moving::c#2 render_moving::c#1 ]
reg byte x [ render_screen_render#22 render_screen_render#64 ]
zp ZP_BYTE:23 [ render_playfield::l#2 render_playfield::l#1 ]
zp ZP_BYTE:24 [ render_playfield::i#2 render_playfield::i#3 render_playfield::i#1 ]
zp ZP_WORD:25 [ render_playfield::screen_line#2 render_playfield::screen_line#0 render_playfield::screen_line#1 ]
zp ZP_BYTE:27 [ render_playfield::c#2 render_playfield::c#1 ]
zp ZP_BYTE:28 [ play_movement::return#2 play_movement::render#1 play_movement::return#0 play_movement::render#2 ]
zp ZP_BYTE:24 [ render_playfield::l#2 render_playfield::l#1 ]
zp ZP_BYTE:25 [ render_playfield::i#2 render_playfield::i#3 render_playfield::i#1 ]
zp ZP_WORD:26 [ render_playfield::screen_line#2 render_playfield::screen_line#0 render_playfield::screen_line#1 ]
zp ZP_BYTE:28 [ render_playfield::c#2 render_playfield::c#1 ]
zp ZP_BYTE:29 [ play_movement::return#2 play_movement::render#1 play_movement::return#0 play_movement::render#2 ]
reg byte a [ play_move_rotate::return#2 ]
zp ZP_BYTE:29 [ play_move_rotate::orientation#3 play_move_rotate::orientation#1 play_move_rotate::orientation#2 ]
zp ZP_WORD:30 [ current_piece#17 current_piece#96 current_piece#97 current_piece#98 current_piece#99 current_piece#100 play_collision::piece_gfx#0 ]
zp ZP_BYTE:30 [ play_move_rotate::orientation#3 play_move_rotate::orientation#1 play_move_rotate::orientation#2 ]
zp ZP_WORD:31 [ current_piece#17 current_piece#96 current_piece#97 current_piece#98 current_piece#99 current_piece#100 play_collision::piece_gfx#0 ]
reg byte x [ play_collision::orientation#5 play_collision::orientation#0 play_collision::orientation#1 play_collision::orientation#2 play_collision::orientation#3 ]
zp ZP_BYTE:32 [ play_collision::xpos#6 play_collision::xpos#0 play_collision::xpos#1 play_collision::xpos#2 play_collision::xpos#3 play_collision::xpos#4 ]
zp ZP_BYTE:33 [ play_collision::yp#2 play_collision::yp#0 play_collision::ypos#0 play_collision::ypos#1 play_collision::ypos#2 play_collision::ypos#3 play_collision::ypos#4 play_collision::yp#1 ]
zp ZP_BYTE:34 [ play_collision::l#6 play_collision::l#1 ]
zp ZP_BYTE:35 [ play_collision::i#2 play_collision::i#3 play_collision::i#10 play_collision::i#12 ]
zp ZP_BYTE:36 [ play_collision::xp#2 play_collision::xp#8 play_collision::xp#1 ]
zp ZP_BYTE:33 [ play_collision::xpos#6 play_collision::xpos#0 play_collision::xpos#1 play_collision::xpos#2 play_collision::xpos#3 play_collision::xpos#4 ]
zp ZP_BYTE:34 [ play_collision::yp#2 play_collision::yp#0 play_collision::ypos#0 play_collision::ypos#1 play_collision::ypos#2 play_collision::ypos#3 play_collision::ypos#4 play_collision::yp#1 ]
zp ZP_BYTE:35 [ play_collision::l#6 play_collision::l#1 ]
zp ZP_BYTE:36 [ play_collision::i#2 play_collision::i#3 play_collision::i#10 play_collision::i#12 ]
zp ZP_BYTE:37 [ play_collision::xp#2 play_collision::xp#8 play_collision::xp#1 ]
reg byte x [ play_collision::c#2 play_collision::c#1 ]
reg byte a [ play_collision::return#15 ]
reg byte a [ play_move_leftright::return#2 ]
reg byte x [ play_move_down::movedown#6 play_move_down::movedown#7 play_move_down::movedown#10 play_move_down::movedown#2 play_move_down::movedown#3 ]
zp ZP_BYTE:37 [ current_ypos#38 current_ypos#3 current_ypos#11 current_ypos#19 current_ypos#6 play_lock_current::yp#2 play_lock_current::yp#0 play_lock_current::yp#1 ]
zp ZP_WORD:38 [ lines_bcd#26 lines_bcd#19 lines_bcd#15 lines_bcd#17 lines_bcd#29 ]
zp ZP_DWORD:40 [ score_bcd#26 score_bcd#18 score_bcd#14 score_bcd#0 score_bcd#16 score_bcd#29 ]
zp ZP_BYTE:44 [ level#33 level#10 level#17 level#19 level#21 ]
zp ZP_BYTE:45 [ current_movedown_slow#37 current_movedown_slow#14 current_movedown_slow#21 current_movedown_slow#1 current_movedown_slow#23 current_movedown_slow#66 current_movedown_slow#10 ]
zp ZP_BYTE:46 [ level_bcd#31 level_bcd#11 level_bcd#17 level_bcd#19 level_bcd#62 level_bcd#21 level_bcd#8 ]
zp ZP_WORD:47 [ current_piece#28 current_piece#10 current_piece#15 current_piece#102 current_piece#93 ]
zp ZP_BYTE:49 [ current_piece_char#29 current_piece_char#10 current_piece_char#16 current_piece_char#5 ]
zp ZP_BYTE:50 [ current_orientation#37 current_orientation#13 current_orientation#17 current_orientation#20 current_orientation#25 current_orientation#7 ]
zp ZP_WORD:51 [ current_piece_gfx#35 current_piece_gfx#13 current_piece_gfx#18 current_piece_gfx#124 current_piece_gfx#20 current_piece_gfx#21 current_piece_gfx#7 current_piece_gfx#117 ]
zp ZP_BYTE:53 [ current_xpos#43 current_xpos#14 current_xpos#19 current_xpos#100 current_xpos#22 current_xpos#26 current_xpos#6 current_xpos#8 ]
zp ZP_BYTE:38 [ current_ypos#38 current_ypos#3 current_ypos#11 current_ypos#19 current_ypos#6 play_lock_current::yp#2 play_lock_current::yp#0 play_lock_current::yp#1 ]
zp ZP_WORD:39 [ lines_bcd#26 lines_bcd#19 lines_bcd#15 lines_bcd#17 lines_bcd#29 ]
zp ZP_DWORD:41 [ score_bcd#26 score_bcd#18 score_bcd#14 score_bcd#0 score_bcd#16 score_bcd#29 ]
zp ZP_BYTE:45 [ level#33 level#10 level#17 level#19 level#21 ]
zp ZP_BYTE:46 [ current_movedown_slow#37 current_movedown_slow#14 current_movedown_slow#21 current_movedown_slow#1 current_movedown_slow#23 current_movedown_slow#66 current_movedown_slow#10 ]
zp ZP_BYTE:47 [ level_bcd#31 level_bcd#11 level_bcd#17 level_bcd#19 level_bcd#62 level_bcd#21 level_bcd#8 ]
zp ZP_WORD:48 [ current_piece#28 current_piece#10 current_piece#15 current_piece#102 current_piece#93 ]
zp ZP_BYTE:50 [ current_piece_char#29 current_piece_char#10 current_piece_char#16 current_piece_char#5 ]
zp ZP_BYTE:51 [ current_orientation#37 current_orientation#13 current_orientation#17 current_orientation#20 current_orientation#25 current_orientation#7 ]
zp ZP_WORD:52 [ current_piece_gfx#35 current_piece_gfx#13 current_piece_gfx#18 current_piece_gfx#124 current_piece_gfx#20 current_piece_gfx#21 current_piece_gfx#7 current_piece_gfx#117 ]
zp ZP_BYTE:54 [ current_xpos#43 current_xpos#14 current_xpos#19 current_xpos#100 current_xpos#22 current_xpos#26 current_xpos#6 current_xpos#8 ]
reg byte x [ play_move_down::return#3 ]
zp ZP_BYTE:54 [ next_piece_idx#17 next_piece_idx#30 next_piece_idx#10 next_piece_idx#16 play_spawn_current::piece_idx#2 play_spawn_current::piece_idx#1 ]
zp ZP_BYTE:55 [ game_over#65 game_over#27 game_over#10 game_over#15 game_over#52 ]
zp ZP_BYTE:55 [ next_piece_idx#17 next_piece_idx#30 next_piece_idx#10 next_piece_idx#16 play_spawn_current::piece_idx#2 play_spawn_current::piece_idx#1 ]
zp ZP_BYTE:56 [ game_over#65 game_over#27 game_over#10 game_over#15 game_over#52 ]
reg byte x [ play_increase_level::b#2 play_increase_level::b#1 ]
zp ZP_BYTE:56 [ play_remove_lines::y#8 play_remove_lines::y#1 ]
zp ZP_BYTE:57 [ play_remove_lines::removed#11 play_remove_lines::removed#8 play_remove_lines::removed#1 ]
zp ZP_BYTE:57 [ play_remove_lines::y#8 play_remove_lines::y#1 ]
zp ZP_BYTE:58 [ play_remove_lines::removed#11 play_remove_lines::removed#8 play_remove_lines::removed#1 ]
reg byte y [ play_remove_lines::r#2 play_remove_lines::r#3 play_remove_lines::r#1 ]
zp ZP_BYTE:58 [ play_remove_lines::x#2 play_remove_lines::x#1 ]
zp ZP_BYTE:59 [ play_remove_lines::full#4 play_remove_lines::full#2 ]
zp ZP_BYTE:59 [ play_remove_lines::x#2 play_remove_lines::x#1 ]
zp ZP_BYTE:60 [ play_remove_lines::full#4 play_remove_lines::full#2 ]
reg byte x [ play_remove_lines::w#6 play_remove_lines::w#3 play_remove_lines::w#4 play_remove_lines::w#12 play_remove_lines::w#11 play_remove_lines::w#1 play_remove_lines::w#2 ]
zp ZP_BYTE:60 [ play_lock_current::l#6 play_lock_current::l#1 ]
zp ZP_BYTE:61 [ play_lock_current::i#2 play_lock_current::i#3 play_lock_current::i#7 play_lock_current::i#9 ]
zp ZP_BYTE:62 [ play_lock_current::xp#2 play_lock_current::xp#0 play_lock_current::xp#1 ]
zp ZP_BYTE:61 [ play_lock_current::l#6 play_lock_current::l#1 ]
zp ZP_BYTE:62 [ play_lock_current::i#2 play_lock_current::i#3 play_lock_current::i#7 play_lock_current::i#9 ]
zp ZP_BYTE:63 [ play_lock_current::xp#2 play_lock_current::xp#0 play_lock_current::xp#1 ]
reg byte x [ play_lock_current::c#2 play_lock_current::c#1 ]
zp ZP_BYTE:63 [ keyboard_event_pressed::keycode#5 ]
zp ZP_BYTE:64 [ keyboard_event_pressed::keycode#5 ]
reg byte x [ keyboard_event_get::return#2 keyboard_event_get::return#1 ]
zp ZP_BYTE:64 [ keyboard_event_scan::row#2 keyboard_event_scan::row#1 ]
zp ZP_BYTE:65 [ keyboard_event_scan::row#2 keyboard_event_scan::row#1 ]
reg byte x [ keyboard_event_scan::col#2 keyboard_event_scan::col#1 ]
zp ZP_BYTE:65 [ keyboard_event_scan::keycode#10 keyboard_event_scan::keycode#11 keyboard_event_scan::keycode#13 keyboard_event_scan::keycode#14 keyboard_event_scan::keycode#1 ]
zp ZP_BYTE:66 [ keyboard_events_size#10 keyboard_events_size#30 keyboard_events_size#19 keyboard_events_size#16 keyboard_events_size#13 keyboard_events_size#4 keyboard_events_size#29 keyboard_events_size#1 keyboard_events_size#2 ]
zp ZP_BYTE:66 [ keyboard_event_scan::keycode#10 keyboard_event_scan::keycode#11 keyboard_event_scan::keycode#13 keyboard_event_scan::keycode#14 keyboard_event_scan::keycode#1 ]
zp ZP_BYTE:67 [ keyboard_events_size#10 keyboard_events_size#30 keyboard_events_size#19 keyboard_events_size#16 keyboard_events_size#13 keyboard_events_size#4 keyboard_events_size#29 keyboard_events_size#1 keyboard_events_size#2 ]
reg byte a [ render_show::d018val#3 ]
reg byte y [ play_init::j#2 play_init::j#1 ]
zp ZP_WORD:67 [ play_init::pli#2 play_init::pli#1 ]
zp ZP_BYTE:69 [ play_init::idx#2 play_init::idx#1 ]
zp ZP_WORD:68 [ play_init::pli#2 play_init::pli#1 ]
zp ZP_BYTE:70 [ play_init::idx#2 play_init::idx#1 ]
reg byte x [ play_init::b#2 play_init::b#1 ]
reg byte y [ sprites_init::s#2 sprites_init::s#1 ]
zp ZP_BYTE:70 [ sprites_init::xpos#2 sprites_init::xpos#1 ]
zp ZP_BYTE:71 [ sprites_init::xpos#2 sprites_init::xpos#1 ]
reg byte y [ render_init::i#2 render_init::i#1 ]
zp ZP_WORD:71 [ render_init::li_1#2 render_init::li_1#1 ]
zp ZP_WORD:73 [ render_init::li_2#2 render_init::li_2#1 ]
zp ZP_BYTE:75 [ render_screen_original::y#6 render_screen_original::y#1 ]
zp ZP_WORD:76 [ render_screen_original::oscr#2 render_screen_original::oscr#4 render_screen_original::oscr#1 ]
zp ZP_WORD:78 [ render_screen_original::ocols#2 render_screen_original::ocols#4 render_screen_original::ocols#1 ]
zp ZP_WORD:80 [ render_screen_original::screen#7 render_screen_original::screen#6 render_screen_original::screen#5 render_screen_original::screen#8 render_screen_original::screen#9 render_screen_original::screen#10 render_screen_original::screen#2 render_screen_original::screen#3 ]
zp ZP_WORD:82 [ render_screen_original::cols#6 render_screen_original::cols#5 render_screen_original::cols#4 render_screen_original::cols#7 render_screen_original::cols#3 render_screen_original::cols#1 render_screen_original::cols#2 ]
zp ZP_WORD:72 [ render_init::li_1#2 render_init::li_1#1 ]
zp ZP_WORD:74 [ render_init::li_2#2 render_init::li_2#1 ]
zp ZP_BYTE:76 [ render_screen_original::y#6 render_screen_original::y#1 ]
zp ZP_WORD:77 [ render_screen_original::oscr#2 render_screen_original::oscr#4 render_screen_original::oscr#1 ]
zp ZP_WORD:79 [ render_screen_original::ocols#2 render_screen_original::ocols#4 render_screen_original::ocols#1 ]
zp ZP_WORD:81 [ render_screen_original::screen#7 render_screen_original::screen#6 render_screen_original::screen#5 render_screen_original::screen#8 render_screen_original::screen#9 render_screen_original::screen#10 render_screen_original::screen#2 render_screen_original::screen#3 ]
zp ZP_WORD:83 [ render_screen_original::cols#6 render_screen_original::cols#5 render_screen_original::cols#4 render_screen_original::cols#7 render_screen_original::cols#3 render_screen_original::cols#1 render_screen_original::cols#2 ]
reg byte x [ render_screen_original::x#6 render_screen_original::x#5 render_screen_original::x#4 render_screen_original::x#1 render_screen_original::x#2 render_screen_original::x#3 ]
zp ZP_BYTE:84 [ sprites_irq::raster_sprite_gfx_modify#0 ]
zp ZP_BYTE:85 [ render_screen_showing#0 render_screen_showing#1 ]
zp ZP_BYTE:85 [ sprites_irq::raster_sprite_gfx_modify#0 ]
zp ZP_BYTE:86 [ irq_raster_next#0 irq_raster_next#4 irq_raster_next#1 irq_raster_next#2 irq_raster_next#3 ]
zp ZP_BYTE:87 [ irq_sprite_ypos#0 irq_sprite_ypos#1 irq_sprite_ypos#2 irq_sprite_ypos#3 ]
zp ZP_BYTE:88 [ irq_sprite_ptr#0 irq_sprite_ptr#1 irq_sprite_ptr#2 irq_sprite_ptr#3 ]
zp ZP_BYTE:89 [ irq_cnt#0 irq_cnt#1 irq_cnt#2 ]
zp ZP_BYTE:87 [ irq_sprite_ypos#0 irq_sprite_ypos#11 irq_sprite_ypos#1 irq_sprite_ypos#2 irq_sprite_ypos#3 ]
zp ZP_BYTE:88 [ irq_sprite_ptr#0 irq_sprite_ptr#11 irq_sprite_ptr#1 irq_sprite_ptr#2 irq_sprite_ptr#3 ]
zp ZP_BYTE:89 [ irq_cnt#0 irq_cnt#3 irq_cnt#1 irq_cnt#2 ]
reg byte x [ keyboard_event_get::return#3 ]
reg byte x [ main::key_event#0 ]
zp ZP_BYTE:90 [ play_movement::key_event#0 ]

View File

@ -45,11 +45,12 @@ table_driven_irq::@6: scope:[table_driven_irq] from table_driven_irq::@5
[24] (byte) irq_idx#2 ← (byte) 0
to:table_driven_irq::@return
table_driven_irq::@return: scope:[table_driven_irq] from table_driven_irq::@5 table_driven_irq::@6
[25] return
[25] (byte) irq_idx#3 ← phi( table_driven_irq::@5/(byte) irq_idx#1 table_driven_irq::@6/(byte) irq_idx#2 )
[26] return
to:@return
table_driven_irq::@3: scope:[table_driven_irq] from table_driven_irq::@4
[26] *((const byte*) SCREEN#0+-(const byte) VIC_SIZE#0+(word) $3f8 + (byte) table_driven_irq::idx#0) ← (byte) table_driven_irq::val#0
[27] *((const byte*) SCREEN#0+-(const byte) VIC_SIZE#0+(word) $3f8 + (byte) table_driven_irq::idx#0) ← (byte) table_driven_irq::val#0
to:table_driven_irq::@1
table_driven_irq::@2: scope:[table_driven_irq] from table_driven_irq::@1
[27] *((const byte*) VIC_BASE#0 + (byte) table_driven_irq::idx#0) ← (byte) table_driven_irq::val#0
[28] *((const byte*) VIC_BASE#0 + (byte) table_driven_irq::idx#0) ← (byte) table_driven_irq::val#0
to:table_driven_irq::@1

View File

@ -359,8 +359,6 @@ if() condition always true - replacing block destination [53] if(true) goto tabl
Successful SSA optimization Pass2ConstantIfs
De-inlining pointer[w] to *(pointer+w) [41] *((const byte*) SCREEN#0 + (word~) table_driven_irq::$6) ← (byte) table_driven_irq::val#0
Successful SSA optimization Pass2DeInlineWordDerefIdx
Eliminating unused variable - keeping the phi block (byte) irq_idx#3
Successful SSA optimization PassNEliminateUnusedVars
Constant right-side identified [9] (byte[]) IRQ_CHANGE_IDX#0 ← { (byte) $20, (byte) $21, (const byte) IRQ_CHANGE_NEXT#0, (byte) $20, (byte) $21, (const byte) IRQ_CHANGE_NEXT#0, (byte) $20, (byte) $21, (const byte) IRQ_CHANGE_NEXT#0, (byte) $20, (byte) $21, (const byte) IRQ_CHANGE_NEXT#0 }
Constant right-side identified [17] (byte~) table_driven_irq::$1 ← (const byte) VIC_SIZE#0 + (byte) 8
Successful SSA optimization Pass2ConstantRValueConsolidation
@ -382,6 +380,7 @@ Converting *(pointer+n) to pointer[n] [19] *((byte*~) table_driven_irq::$7) ←
Successful SSA optimization Pass2InlineDerefIdx
Eliminating unused variable (byte*~) table_driven_irq::$7 and assignment [17] (byte*~) table_driven_irq::$7 ← (const byte*) SCREEN#0+-(const byte) VIC_SIZE#0+(word) $3f8 + (byte) table_driven_irq::idx#0
Successful SSA optimization PassNEliminateUnusedVars
Added new block during phi lifting table_driven_irq::@14(between table_driven_irq::@10 and table_driven_irq::@return)
Adding NOP phi() at start of @begin
Adding NOP phi() at start of @4
Adding NOP phi() at start of @6
@ -390,12 +389,15 @@ Adding NOP phi() at start of @end
CALL GRAPH
Calls in [] to main:4
Created 1 initial phi equivalence classes
Created 2 initial phi equivalence classes
Coalesced [16] irq_idx#13 ← irq_idx#0
Coalesced [29] irq_idx#14 ← irq_idx#1
Coalesced [27] irq_idx#16 ← irq_idx#2
Coalesced [30] irq_idx#15 ← irq_idx#1
Coalesced [32] irq_idx#14 ← irq_idx#1
Coalesced down to 1 phi equivalence classes
Culled Empty Block (label) @4
Culled Empty Block (label) @7
Culled Empty Block (label) table_driven_irq::@14
Culled Empty Block (label) table_driven_irq::@8
Renumbering block @5 to @1
Renumbering block @6 to @2
@ -455,13 +457,14 @@ table_driven_irq::@6: scope:[table_driven_irq] from table_driven_irq::@5
[24] (byte) irq_idx#2 ← (byte) 0
to:table_driven_irq::@return
table_driven_irq::@return: scope:[table_driven_irq] from table_driven_irq::@5 table_driven_irq::@6
[25] return
[25] (byte) irq_idx#3 ← phi( table_driven_irq::@5/(byte) irq_idx#1 table_driven_irq::@6/(byte) irq_idx#2 )
[26] return
to:@return
table_driven_irq::@3: scope:[table_driven_irq] from table_driven_irq::@4
[26] *((const byte*) SCREEN#0+-(const byte) VIC_SIZE#0+(word) $3f8 + (byte) table_driven_irq::idx#0) ← (byte) table_driven_irq::val#0
[27] *((const byte*) SCREEN#0+-(const byte) VIC_SIZE#0+(word) $3f8 + (byte) table_driven_irq::idx#0) ← (byte) table_driven_irq::val#0
to:table_driven_irq::@1
table_driven_irq::@2: scope:[table_driven_irq] from table_driven_irq::@1
[27] *((const byte*) VIC_BASE#0 + (byte) table_driven_irq::idx#0) ← (byte) table_driven_irq::val#0
[28] *((const byte*) VIC_BASE#0 + (byte) table_driven_irq::idx#0) ← (byte) table_driven_irq::val#0
to:table_driven_irq::@1
@ -482,8 +485,9 @@ VARIABLE REGISTER WEIGHTS
(byte) VIC_SIZE
(byte) irq_idx
(byte) irq_idx#0 4.0
(byte) irq_idx#1 6.6000000000000005
(byte) irq_idx#2 20.0
(byte) irq_idx#1 4.375
(byte) irq_idx#2 4.0
(byte) irq_idx#3 40.0
(byte) irq_idx#4 19.0
(void()) main()
interrupt(KERNEL_MIN)(void()) table_driven_irq()
@ -493,15 +497,14 @@ interrupt(KERNEL_MIN)(void()) table_driven_irq()
(byte) table_driven_irq::val#0 6.166666666666666
Initial phi equivalence classes
[ irq_idx#4 irq_idx#0 irq_idx#1 ]
Coalescing volatile variable equivalence classes [ irq_idx#4 irq_idx#0 irq_idx#1 ] and [ irq_idx#2 ]
[ irq_idx#3 irq_idx#4 irq_idx#0 irq_idx#1 irq_idx#2 ]
Added variable table_driven_irq::idx#0 to zero page equivalence class [ table_driven_irq::idx#0 ]
Added variable table_driven_irq::val#0 to zero page equivalence class [ table_driven_irq::val#0 ]
Complete equivalence classes
[ irq_idx#4 irq_idx#0 irq_idx#1 irq_idx#2 ]
[ irq_idx#3 irq_idx#4 irq_idx#0 irq_idx#1 irq_idx#2 ]
[ table_driven_irq::idx#0 ]
[ table_driven_irq::val#0 ]
Allocated zp ZP_BYTE:2 [ irq_idx#4 irq_idx#0 irq_idx#1 irq_idx#2 ]
Allocated zp ZP_BYTE:2 [ irq_idx#3 irq_idx#4 irq_idx#0 irq_idx#1 irq_idx#2 ]
Allocated zp ZP_BYTE:3 [ table_driven_irq::idx#0 ]
Allocated zp ZP_BYTE:4 [ table_driven_irq::val#0 ]
@ -638,28 +641,32 @@ table_driven_irq: {
ldy val
sta $ff
cpy $ff
bcs breturn
bcs breturn_from_b5
jmp b6
//SEG37 table_driven_irq::@6
b6:
//SEG38 [24] (byte) irq_idx#2 ← (byte) 0 -- vbuz1=vbuc1
lda #0
sta irq_idx
//SEG39 [25] phi from table_driven_irq::@5 table_driven_irq::@6 to table_driven_irq::@return [phi:table_driven_irq::@5/table_driven_irq::@6->table_driven_irq::@return]
breturn_from_b5:
breturn_from_b6:
//SEG40 [25] phi (byte) irq_idx#3 = (byte) irq_idx#1 [phi:table_driven_irq::@5/table_driven_irq::@6->table_driven_irq::@return#0] -- register_copy
jmp breturn
//SEG39 table_driven_irq::@return
//SEG41 table_driven_irq::@return
breturn:
//SEG40 [25] return - exit interrupt(KERNEL_MIN)
//SEG42 [26] return - exit interrupt(KERNEL_MIN)
jmp $ea81
//SEG41 table_driven_irq::@3
//SEG43 table_driven_irq::@3
b3:
//SEG42 [26] *((const byte*) SCREEN#0+-(const byte) VIC_SIZE#0+(word) $3f8 + (byte) table_driven_irq::idx#0) ← (byte) table_driven_irq::val#0 -- pbuc1_derefidx_vbuz1=vbuz2
//SEG44 [27] *((const byte*) SCREEN#0+-(const byte) VIC_SIZE#0+(word) $3f8 + (byte) table_driven_irq::idx#0) ← (byte) table_driven_irq::val#0 -- pbuc1_derefidx_vbuz1=vbuz2
lda val
ldy idx
sta SCREEN+-VIC_SIZE+$3f8,y
jmp b1_from_b3
//SEG43 table_driven_irq::@2
//SEG45 table_driven_irq::@2
b2:
//SEG44 [27] *((const byte*) VIC_BASE#0 + (byte) table_driven_irq::idx#0) ← (byte) table_driven_irq::val#0 -- pbuc1_derefidx_vbuz1=vbuz2
//SEG46 [28] *((const byte*) VIC_BASE#0 + (byte) table_driven_irq::idx#0) ← (byte) table_driven_irq::val#0 -- pbuc1_derefidx_vbuz1=vbuz2
lda val
ldy idx
sta VIC_BASE,y
@ -679,11 +686,11 @@ Statement [11] *((const void()**) KERNEL_IRQ#0) ← &interrupt(KERNEL_MIN)(void(
Statement [16] (byte) table_driven_irq::idx#0 ← *((const byte[]) IRQ_CHANGE_IDX#0 + (byte) irq_idx#4) [ irq_idx#4 table_driven_irq::idx#0 ] ( [ irq_idx#4 table_driven_irq::idx#0 ] ) always clobbers reg byte y
Statement [17] (byte) table_driven_irq::val#0 ← *((const byte[]) IRQ_CHANGE_VAL#0 + (byte) irq_idx#4) [ irq_idx#4 table_driven_irq::idx#0 table_driven_irq::val#0 ] ( [ irq_idx#4 table_driven_irq::idx#0 table_driven_irq::val#0 ] ) always clobbers reg byte y
Removing always clobbered register reg byte y as potential for zp ZP_BYTE:3 [ table_driven_irq::idx#0 ]
Statement [21] *((const byte*) IRQ_STATUS#0) ← (const byte) IRQ_RASTER#0 [ table_driven_irq::val#0 ] ( [ table_driven_irq::val#0 ] ) always clobbers reg byte a
Statement [21] *((const byte*) IRQ_STATUS#0) ← (const byte) IRQ_RASTER#0 [ irq_idx#1 table_driven_irq::val#0 ] ( [ irq_idx#1 table_driven_irq::val#0 ] ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp ZP_BYTE:4 [ table_driven_irq::val#0 ]
Statement [24] (byte) irq_idx#2 ← (byte) 0 [ ] ( [ ] ) always clobbers reg byte a
Statement [26] *((const byte*) SCREEN#0+-(const byte) VIC_SIZE#0+(word) $3f8 + (byte) table_driven_irq::idx#0) ← (byte) table_driven_irq::val#0 [ irq_idx#1 ] ( [ irq_idx#1 ] ) always clobbers reg byte a
Statement [27] *((const byte*) VIC_BASE#0 + (byte) table_driven_irq::idx#0) ← (byte) table_driven_irq::val#0 [ irq_idx#1 ] ( [ irq_idx#1 ] ) always clobbers reg byte a
Statement [24] (byte) irq_idx#2 ← (byte) 0 [ irq_idx#2 ] ( [ irq_idx#2 ] ) always clobbers reg byte a
Statement [27] *((const byte*) SCREEN#0+-(const byte) VIC_SIZE#0+(word) $3f8 + (byte) table_driven_irq::idx#0) ← (byte) table_driven_irq::val#0 [ irq_idx#1 ] ( [ irq_idx#1 ] ) always clobbers reg byte a
Statement [28] *((const byte*) VIC_BASE#0 + (byte) table_driven_irq::idx#0) ← (byte) table_driven_irq::val#0 [ irq_idx#1 ] ( [ irq_idx#1 ] ) always clobbers reg byte a
Statement [1] (byte) irq_idx#0 ← (byte) 0 [ ] ( ) always clobbers reg byte a
Statement [6] *((const byte*) CIA1_INTERRUPT#0) ← (const byte) CIA_INTERRUPT_CLEAR#0 [ ] ( main:3 [ ] ) always clobbers reg byte a
Statement [7] *((const byte*) VIC_CONTROL#0) ← *((const byte*) VIC_CONTROL#0) & (byte) $7f [ ] ( main:3 [ ] ) always clobbers reg byte a
@ -693,24 +700,24 @@ Statement [10] *((const byte*) IRQ_STATUS#0) ← (const byte) IRQ_RASTER#0 [ ] (
Statement [11] *((const void()**) KERNEL_IRQ#0) ← &interrupt(KERNEL_MIN)(void()) table_driven_irq() [ ] ( main:3 [ ] ) always clobbers reg byte a
Statement [16] (byte) table_driven_irq::idx#0 ← *((const byte[]) IRQ_CHANGE_IDX#0 + (byte) irq_idx#4) [ irq_idx#4 table_driven_irq::idx#0 ] ( [ irq_idx#4 table_driven_irq::idx#0 ] ) always clobbers reg byte y
Statement [17] (byte) table_driven_irq::val#0 ← *((const byte[]) IRQ_CHANGE_VAL#0 + (byte) irq_idx#4) [ irq_idx#4 table_driven_irq::idx#0 table_driven_irq::val#0 ] ( [ irq_idx#4 table_driven_irq::idx#0 table_driven_irq::val#0 ] ) always clobbers reg byte y
Statement [21] *((const byte*) IRQ_STATUS#0) ← (const byte) IRQ_RASTER#0 [ table_driven_irq::val#0 ] ( [ table_driven_irq::val#0 ] ) always clobbers reg byte a
Statement [24] (byte) irq_idx#2 ← (byte) 0 [ ] ( [ ] ) always clobbers reg byte a
Statement [26] *((const byte*) SCREEN#0+-(const byte) VIC_SIZE#0+(word) $3f8 + (byte) table_driven_irq::idx#0) ← (byte) table_driven_irq::val#0 [ irq_idx#1 ] ( [ irq_idx#1 ] ) always clobbers reg byte a
Statement [27] *((const byte*) VIC_BASE#0 + (byte) table_driven_irq::idx#0) ← (byte) table_driven_irq::val#0 [ irq_idx#1 ] ( [ irq_idx#1 ] ) always clobbers reg byte a
Potential registers zp ZP_BYTE:2 [ irq_idx#4 irq_idx#0 irq_idx#1 irq_idx#2 ] : zp ZP_BYTE:2 ,
Statement [21] *((const byte*) IRQ_STATUS#0) ← (const byte) IRQ_RASTER#0 [ irq_idx#1 table_driven_irq::val#0 ] ( [ irq_idx#1 table_driven_irq::val#0 ] ) always clobbers reg byte a
Statement [24] (byte) irq_idx#2 ← (byte) 0 [ irq_idx#2 ] ( [ irq_idx#2 ] ) always clobbers reg byte a
Statement [27] *((const byte*) SCREEN#0+-(const byte) VIC_SIZE#0+(word) $3f8 + (byte) table_driven_irq::idx#0) ← (byte) table_driven_irq::val#0 [ irq_idx#1 ] ( [ irq_idx#1 ] ) always clobbers reg byte a
Statement [28] *((const byte*) VIC_BASE#0 + (byte) table_driven_irq::idx#0) ← (byte) table_driven_irq::val#0 [ irq_idx#1 ] ( [ irq_idx#1 ] ) always clobbers reg byte a
Potential registers zp ZP_BYTE:2 [ irq_idx#3 irq_idx#4 irq_idx#0 irq_idx#1 irq_idx#2 ] : zp ZP_BYTE:2 ,
Potential registers zp ZP_BYTE:3 [ table_driven_irq::idx#0 ] : zp ZP_BYTE:3 , reg byte a , reg byte x ,
Potential registers zp ZP_BYTE:4 [ table_driven_irq::val#0 ] : zp ZP_BYTE:4 , reg byte x , reg byte y ,
REGISTER UPLIFT SCOPES
Uplift Scope [] 49.6: zp ZP_BYTE:2 [ irq_idx#4 irq_idx#0 irq_idx#1 irq_idx#2 ]
Uplift Scope [] 71.38: zp ZP_BYTE:2 [ irq_idx#3 irq_idx#4 irq_idx#0 irq_idx#1 irq_idx#2 ]
Uplift Scope [table_driven_irq] 11: zp ZP_BYTE:3 [ table_driven_irq::idx#0 ] 6.17: zp ZP_BYTE:4 [ table_driven_irq::val#0 ]
Uplift Scope [main]
Uplifting [] best 928 combination zp ZP_BYTE:2 [ irq_idx#4 irq_idx#0 irq_idx#1 irq_idx#2 ]
Uplifting [] best 928 combination zp ZP_BYTE:2 [ irq_idx#3 irq_idx#4 irq_idx#0 irq_idx#1 irq_idx#2 ]
Uplifting [table_driven_irq] best 762 combination reg byte a [ table_driven_irq::idx#0 ] reg byte x [ table_driven_irq::val#0 ]
Uplifting [main] best 762 combination
Attempting to uplift remaining variables inzp ZP_BYTE:2 [ irq_idx#4 irq_idx#0 irq_idx#1 irq_idx#2 ]
Uplifting [] best 762 combination zp ZP_BYTE:2 [ irq_idx#4 irq_idx#0 irq_idx#1 irq_idx#2 ]
Attempting to uplift remaining variables inzp ZP_BYTE:2 [ irq_idx#3 irq_idx#4 irq_idx#0 irq_idx#1 irq_idx#2 ]
Uplifting [] best 762 combination zp ZP_BYTE:2 [ irq_idx#3 irq_idx#4 irq_idx#0 irq_idx#1 irq_idx#2 ]
ASSEMBLER BEFORE OPTIMIZATION
//SEG0 File Comments
@ -837,28 +844,32 @@ table_driven_irq: {
ldy RASTER
sty $ff
cpx $ff
bcs breturn
bcs breturn_from_b5
jmp b6
//SEG37 table_driven_irq::@6
b6:
//SEG38 [24] (byte) irq_idx#2 ← (byte) 0 -- vbuz1=vbuc1
lda #0
sta irq_idx
//SEG39 [25] phi from table_driven_irq::@5 table_driven_irq::@6 to table_driven_irq::@return [phi:table_driven_irq::@5/table_driven_irq::@6->table_driven_irq::@return]
breturn_from_b5:
breturn_from_b6:
//SEG40 [25] phi (byte) irq_idx#3 = (byte) irq_idx#1 [phi:table_driven_irq::@5/table_driven_irq::@6->table_driven_irq::@return#0] -- register_copy
jmp breturn
//SEG39 table_driven_irq::@return
//SEG41 table_driven_irq::@return
breturn:
//SEG40 [25] return - exit interrupt(KERNEL_MIN)
//SEG42 [26] return - exit interrupt(KERNEL_MIN)
jmp $ea81
//SEG41 table_driven_irq::@3
//SEG43 table_driven_irq::@3
b3:
//SEG42 [26] *((const byte*) SCREEN#0+-(const byte) VIC_SIZE#0+(word) $3f8 + (byte) table_driven_irq::idx#0) ← (byte) table_driven_irq::val#0 -- pbuc1_derefidx_vbuaa=vbuxx
//SEG44 [27] *((const byte*) SCREEN#0+-(const byte) VIC_SIZE#0+(word) $3f8 + (byte) table_driven_irq::idx#0) ← (byte) table_driven_irq::val#0 -- pbuc1_derefidx_vbuaa=vbuxx
tay
txa
sta SCREEN+-VIC_SIZE+$3f8,y
jmp b1_from_b3
//SEG43 table_driven_irq::@2
//SEG45 table_driven_irq::@2
b2:
//SEG44 [27] *((const byte*) VIC_BASE#0 + (byte) table_driven_irq::idx#0) ← (byte) table_driven_irq::val#0 -- pbuc1_derefidx_vbuaa=vbuxx
//SEG46 [28] *((const byte*) VIC_BASE#0 + (byte) table_driven_irq::idx#0) ← (byte) table_driven_irq::val#0 -- pbuc1_derefidx_vbuaa=vbuxx
tay
txa
sta VIC_BASE,y
@ -881,6 +892,7 @@ Succesful ASM optimization Pass5NextJumpElimination
Removing instruction lda #IRQ_RASTER
Removing instruction ldy irq_idx
Succesful ASM optimization Pass5UnnecesaryLoadElimination
Replacing label breturn_from_b5 with breturn
Replacing label b1_from_b3 with b1
Replacing label b1_from_b2 with b1
Removing instruction b1:
@ -889,6 +901,8 @@ Removing instruction bend_from_b2:
Removing instruction b1_from_table_driven_irq:
Removing instruction b1_from_b2:
Removing instruction b1_from_b3:
Removing instruction breturn_from_b5:
Removing instruction breturn_from_b6:
Succesful ASM optimization Pass5RedundantLabelElimination
Removing instruction b2:
Removing instruction bend:
@ -940,8 +954,9 @@ FINAL SYMBOL TABLE
(const byte) VIC_SIZE#0 VIC_SIZE = (byte) $30
(byte) irq_idx
(byte) irq_idx#0 irq_idx zp ZP_BYTE:2 4.0
(byte) irq_idx#1 irq_idx zp ZP_BYTE:2 6.6000000000000005
(byte) irq_idx#2 irq_idx zp ZP_BYTE:2 20.0
(byte) irq_idx#1 irq_idx zp ZP_BYTE:2 4.375
(byte) irq_idx#2 irq_idx zp ZP_BYTE:2 4.0
(byte) irq_idx#3 irq_idx zp ZP_BYTE:2 40.0
(byte) irq_idx#4 irq_idx zp ZP_BYTE:2 19.0
(void()) main()
(label) main::@return
@ -958,7 +973,7 @@ interrupt(KERNEL_MIN)(void()) table_driven_irq()
(byte) table_driven_irq::val
(byte) table_driven_irq::val#0 reg byte x 6.166666666666666
zp ZP_BYTE:2 [ irq_idx#4 irq_idx#0 irq_idx#1 irq_idx#2 ]
zp ZP_BYTE:2 [ irq_idx#3 irq_idx#4 irq_idx#0 irq_idx#1 irq_idx#2 ]
reg byte a [ table_driven_irq::idx#0 ]
reg byte x [ table_driven_irq::val#0 ]
@ -1078,19 +1093,21 @@ table_driven_irq: {
//SEG38 [24] (byte) irq_idx#2 ← (byte) 0 -- vbuz1=vbuc1
lda #0
sta irq_idx
//SEG39 table_driven_irq::@return
//SEG40 [25] return - exit interrupt(KERNEL_MIN)
//SEG39 [25] phi from table_driven_irq::@5 table_driven_irq::@6 to table_driven_irq::@return [phi:table_driven_irq::@5/table_driven_irq::@6->table_driven_irq::@return]
//SEG40 [25] phi (byte) irq_idx#3 = (byte) irq_idx#1 [phi:table_driven_irq::@5/table_driven_irq::@6->table_driven_irq::@return#0] -- register_copy
//SEG41 table_driven_irq::@return
//SEG42 [26] return - exit interrupt(KERNEL_MIN)
jmp $ea81
//SEG41 table_driven_irq::@3
//SEG43 table_driven_irq::@3
b3:
//SEG42 [26] *((const byte*) SCREEN#0+-(const byte) VIC_SIZE#0+(word) $3f8 + (byte) table_driven_irq::idx#0) ← (byte) table_driven_irq::val#0 -- pbuc1_derefidx_vbuaa=vbuxx
//SEG44 [27] *((const byte*) SCREEN#0+-(const byte) VIC_SIZE#0+(word) $3f8 + (byte) table_driven_irq::idx#0) ← (byte) table_driven_irq::val#0 -- pbuc1_derefidx_vbuaa=vbuxx
tay
txa
sta SCREEN+-VIC_SIZE+$3f8,y
jmp b1
//SEG43 table_driven_irq::@2
//SEG45 table_driven_irq::@2
b2:
//SEG44 [27] *((const byte*) VIC_BASE#0 + (byte) table_driven_irq::idx#0) ← (byte) table_driven_irq::val#0 -- pbuc1_derefidx_vbuaa=vbuxx
//SEG46 [28] *((const byte*) VIC_BASE#0 + (byte) table_driven_irq::idx#0) ← (byte) table_driven_irq::val#0 -- pbuc1_derefidx_vbuaa=vbuxx
tay
txa
sta VIC_BASE,y

View File

@ -32,8 +32,9 @@
(const byte) VIC_SIZE#0 VIC_SIZE = (byte) $30
(byte) irq_idx
(byte) irq_idx#0 irq_idx zp ZP_BYTE:2 4.0
(byte) irq_idx#1 irq_idx zp ZP_BYTE:2 6.6000000000000005
(byte) irq_idx#2 irq_idx zp ZP_BYTE:2 20.0
(byte) irq_idx#1 irq_idx zp ZP_BYTE:2 4.375
(byte) irq_idx#2 irq_idx zp ZP_BYTE:2 4.0
(byte) irq_idx#3 irq_idx zp ZP_BYTE:2 40.0
(byte) irq_idx#4 irq_idx zp ZP_BYTE:2 19.0
(void()) main()
(label) main::@return
@ -50,6 +51,6 @@ interrupt(KERNEL_MIN)(void()) table_driven_irq()
(byte) table_driven_irq::val
(byte) table_driven_irq::val#0 reg byte x 6.166666666666666
zp ZP_BYTE:2 [ irq_idx#4 irq_idx#0 irq_idx#1 irq_idx#2 ]
zp ZP_BYTE:2 [ irq_idx#3 irq_idx#4 irq_idx#0 irq_idx#1 irq_idx#2 ]
reg byte a [ table_driven_irq::idx#0 ]
reg byte x [ table_driven_irq::val#0 ]

View File

@ -38,13 +38,13 @@ main: {
lda #>irq
sta KERNEL_IRQ+1
cli
b1:
b2:
lda RASTER
cmp #$14
bcs b1
bcs b2
lda #1
sta framedone
jmp b1
jmp b2
}
irq: {
inc BGCOL

View File

@ -19,23 +19,27 @@ main: scope:[main] from @2
[10] *((const void()**) KERNEL_IRQ#0) ← &interrupt(KERNEL_MIN)(void()) irq()
asm { cli }
to:main::@1
main::@1: scope:[main] from main main::@1 main::@2
[12] if(*((const byte*) RASTER#0)>=(byte) $14) goto main::@1
main::@1: scope:[main] from main main::@2 main::@3
[12] (bool) framedone#1 ← phi( main/(bool) framedone#11 main::@3/(bool) framedone#0 )
to:main::@2
main::@2: scope:[main] from main::@1
[13] (bool) framedone#0 ← true
[13] if(*((const byte*) RASTER#0)>=(byte) $14) goto main::@1
to:main::@3
main::@3: scope:[main] from main::@2
[14] (bool) framedone#0 ← true
to:main::@1
irq: scope:[irq] from
[14] *((const byte*) BGCOL#0) ← ++ *((const byte*) BGCOL#0)
[15] *((const byte*) IRQ_STATUS#0) ← (const byte) IRQ_RASTER#0
[16] if(*((const byte*) RASTER#0)<(byte) $32+(byte) 1) goto irq::@1
[15] *((const byte*) BGCOL#0) ← ++ *((const byte*) BGCOL#0)
[16] *((const byte*) IRQ_STATUS#0) ← (const byte) IRQ_RASTER#0
[17] if(*((const byte*) RASTER#0)<(byte) $32+(byte) 1) goto irq::@1
to:irq::@2
irq::@2: scope:[irq] from irq
[17] (bool) framedone#3 ← false
[18] (bool) framedone#3 ← false
to:irq::@1
irq::@1: scope:[irq] from irq irq::@2
[18] *((const byte*) BGCOL#0) ← -- *((const byte*) BGCOL#0)
[19] (bool) framedone#10 ← phi( irq/(bool) framedone#11 irq::@2/(bool) framedone#3 )
[20] *((const byte*) BGCOL#0) ← -- *((const byte*) BGCOL#0)
to:irq::@return
irq::@return: scope:[irq] from irq::@1
[19] return
[21] return
to:@return

View File

@ -214,9 +214,6 @@ Successful SSA optimization Pass2ConstantIdentification
if() condition always true - replacing block destination [19] if(true) goto main::@2
Successful SSA optimization Pass2ConstantIfs
Rewriting conditional comparison [34] if(*((const byte*) RASTER#0)<=(byte) $32) goto irq::@1
Eliminating unused variable - keeping the phi block (bool) framedone#1
Eliminating unused variable - keeping the phi block (bool) framedone#10
Successful SSA optimization PassNEliminateUnusedVars
Removing unused block main::@return
Successful SSA optimization Pass2EliminateUnusedBlocks
Adding number conversion cast (unumber) $32+1 in if(*((const byte*) RASTER#0)<(byte) $32+(number) 1) goto irq::@1
@ -229,20 +226,23 @@ Finalized unsigned number type (byte) 1
Successful SSA optimization PassNFinalizeNumberTypeConversions
Constant inlined main::$0 = &interrupt(KERNEL_MIN)(void()) irq()
Successful SSA optimization Pass2ConstantInlining
Added new block during phi lifting irq::@3(between irq and irq::@1)
Adding NOP phi() at start of @begin
Adding NOP phi() at start of @2
Adding NOP phi() at start of @3
Adding NOP phi() at start of @end
Adding NOP phi() at start of main::@1
CALL GRAPH
Calls in [] to main:3
Created 0 initial phi equivalence classes
Coalesced down to 0 phi equivalence classes
Created 2 initial phi equivalence classes
Coalesced [13] framedone#15 ← framedone#11
Coalesced [17] framedone#16 ← framedone#0
Coalesced [22] framedone#18 ← framedone#3
Coalesced [26] framedone#17 ← framedone#11
Coalesced down to 1 phi equivalence classes
Culled Empty Block (label) @3
Culled Empty Block (label) main::@1
Renumbering block main::@2 to main::@1
Renumbering block main::@7 to main::@2
Culled Empty Block (label) irq::@3
Renumbering block main::@7 to main::@3
Adding NOP phi() at start of @begin
Adding NOP phi() at start of @2
Adding NOP phi() at start of @end
@ -269,25 +269,29 @@ main: scope:[main] from @2
[10] *((const void()**) KERNEL_IRQ#0) ← &interrupt(KERNEL_MIN)(void()) irq()
asm { cli }
to:main::@1
main::@1: scope:[main] from main main::@1 main::@2
[12] if(*((const byte*) RASTER#0)>=(byte) $14) goto main::@1
main::@1: scope:[main] from main main::@2 main::@3
[12] (bool) framedone#1 ← phi( main/(bool) framedone#11 main::@3/(bool) framedone#0 )
to:main::@2
main::@2: scope:[main] from main::@1
[13] (bool) framedone#0 ← true
[13] if(*((const byte*) RASTER#0)>=(byte) $14) goto main::@1
to:main::@3
main::@3: scope:[main] from main::@2
[14] (bool) framedone#0 ← true
to:main::@1
irq: scope:[irq] from
[14] *((const byte*) BGCOL#0) ← ++ *((const byte*) BGCOL#0)
[15] *((const byte*) IRQ_STATUS#0) ← (const byte) IRQ_RASTER#0
[16] if(*((const byte*) RASTER#0)<(byte) $32+(byte) 1) goto irq::@1
[15] *((const byte*) BGCOL#0) ← ++ *((const byte*) BGCOL#0)
[16] *((const byte*) IRQ_STATUS#0) ← (const byte) IRQ_RASTER#0
[17] if(*((const byte*) RASTER#0)<(byte) $32+(byte) 1) goto irq::@1
to:irq::@2
irq::@2: scope:[irq] from irq
[17] (bool) framedone#3 ← false
[18] (bool) framedone#3 ← false
to:irq::@1
irq::@1: scope:[irq] from irq irq::@2
[18] *((const byte*) BGCOL#0) ← -- *((const byte*) BGCOL#0)
[19] (bool) framedone#10 ← phi( irq/(bool) framedone#11 irq::@2/(bool) framedone#3 )
[20] *((const byte*) BGCOL#0) ← -- *((const byte*) BGCOL#0)
to:irq::@return
irq::@return: scope:[irq] from irq::@1
[19] return
[21] return
to:@return
@ -302,18 +306,19 @@ VARIABLE REGISTER WEIGHTS
(byte*) RASTER
(byte*) VIC_CONTROL
(bool) framedone
(bool) framedone#0 110.0
(bool) framedone#11 20.0
(bool) framedone#3 20.0
(bool) framedone#0 22.0
(bool) framedone#1 130.0
(bool) framedone#10 40.0
(bool) framedone#11 0.5
(bool) framedone#3 4.0
interrupt(KERNEL_MIN)(void()) irq()
(void()) main()
Initial phi equivalence classes
Coalescing volatile variable equivalence classes [ framedone#0 ] and [ framedone#3 ]
Coalescing volatile variable equivalence classes [ framedone#0 framedone#3 ] and [ framedone#11 ]
[ framedone#10 framedone#1 framedone#11 framedone#0 framedone#3 ]
Complete equivalence classes
[ framedone#0 framedone#3 framedone#11 ]
Allocated zp ZP_BOOL:2 [ framedone#0 framedone#3 framedone#11 ]
[ framedone#10 framedone#1 framedone#11 framedone#0 framedone#3 ]
Allocated zp ZP_BOOL:2 [ framedone#10 framedone#1 framedone#11 framedone#0 framedone#3 ]
INITIAL ASM
//SEG0 File Comments
@ -382,73 +387,87 @@ main: {
sta KERNEL_IRQ+1
//SEG18 asm { cli }
cli
//SEG19 [12] phi from main main::@3 to main::@1 [phi:main/main::@3->main::@1]
b1_from_main:
b1_from_b3:
//SEG20 [12] phi (bool) framedone#1 = (bool) framedone#11 [phi:main/main::@3->main::@1#0] -- register_copy
jmp b1
//SEG19 main::@1
//SEG21 [12] phi from main::@2 to main::@1 [phi:main::@2->main::@1]
b1_from_b2:
jmp b1
//SEG22 main::@1
b1:
//SEG20 [12] if(*((const byte*) RASTER#0)>=(byte) $14) goto main::@1 -- _deref_pbuc1_ge_vbuc2_then_la1
jmp b2
//SEG23 main::@2
b2:
//SEG24 [13] if(*((const byte*) RASTER#0)>=(byte) $14) goto main::@1 -- _deref_pbuc1_ge_vbuc2_then_la1
lda RASTER
cmp #$14
bcs b1
jmp b2
//SEG21 main::@2
b2:
//SEG22 [13] (bool) framedone#0 ← true -- vboz1=vboc1
bcs b1_from_b2
jmp b3
//SEG25 main::@3
b3:
//SEG26 [14] (bool) framedone#0 ← true -- vboz1=vboc1
lda #1
sta framedone
jmp b1
jmp b1_from_b3
}
//SEG23 irq
//SEG27 irq
irq: {
//SEG24 entry interrupt(KERNEL_MIN)
//SEG25 [14] *((const byte*) BGCOL#0) ← ++ *((const byte*) BGCOL#0) -- _deref_pbuc1=_inc__deref_pbuc1
//SEG28 entry interrupt(KERNEL_MIN)
//SEG29 [15] *((const byte*) BGCOL#0) ← ++ *((const byte*) BGCOL#0) -- _deref_pbuc1=_inc__deref_pbuc1
inc BGCOL
//SEG26 [15] *((const byte*) IRQ_STATUS#0) ← (const byte) IRQ_RASTER#0 -- _deref_pbuc1=vbuc2
//SEG30 [16] *((const byte*) IRQ_STATUS#0) ← (const byte) IRQ_RASTER#0 -- _deref_pbuc1=vbuc2
lda #IRQ_RASTER
sta IRQ_STATUS
//SEG27 [16] if(*((const byte*) RASTER#0)<(byte) $32+(byte) 1) goto irq::@1 -- _deref_pbuc1_lt_vbuc2_then_la1
//SEG31 [17] if(*((const byte*) RASTER#0)<(byte) $32+(byte) 1) goto irq::@1 -- _deref_pbuc1_lt_vbuc2_then_la1
lda RASTER
cmp #$32+1
bcc b1
bcc b1_from_irq
jmp b2
//SEG28 irq::@2
//SEG32 irq::@2
b2:
//SEG29 [17] (bool) framedone#3 ← false -- vboz1=vboc1
//SEG33 [18] (bool) framedone#3 ← false -- vboz1=vboc1
lda #0
sta framedone
//SEG34 [19] phi from irq irq::@2 to irq::@1 [phi:irq/irq::@2->irq::@1]
b1_from_irq:
b1_from_b2:
//SEG35 [19] phi (bool) framedone#10 = (bool) framedone#11 [phi:irq/irq::@2->irq::@1#0] -- register_copy
jmp b1
//SEG30 irq::@1
//SEG36 irq::@1
b1:
//SEG31 [18] *((const byte*) BGCOL#0) ← -- *((const byte*) BGCOL#0) -- _deref_pbuc1=_dec__deref_pbuc1
//SEG37 [20] *((const byte*) BGCOL#0) ← -- *((const byte*) BGCOL#0) -- _deref_pbuc1=_dec__deref_pbuc1
dec BGCOL
jmp breturn
//SEG32 irq::@return
//SEG38 irq::@return
breturn:
//SEG33 [19] return - exit interrupt(KERNEL_MIN)
//SEG39 [21] return - exit interrupt(KERNEL_MIN)
jmp $ea81
}
REGISTER UPLIFT POTENTIAL REGISTERS
Statement [1] (bool) framedone#11 ← false [ ] ( ) always clobbers reg byte a
Statement [6] *((const byte*) CIA1_INTERRUPT#0) ← (const byte) CIA_INTERRUPT_CLEAR#0 [ ] ( main:3 [ ] ) always clobbers reg byte a
Statement [7] *((const byte*) VIC_CONTROL#0) ← *((const byte*) VIC_CONTROL#0) & (byte) $7f [ ] ( main:3 [ ] ) always clobbers reg byte a
Statement [8] *((const byte*) RASTER#0) ← (byte) $fd [ ] ( main:3 [ ] ) always clobbers reg byte a
Statement [9] *((const byte*) IRQ_ENABLE#0) ← (const byte) IRQ_RASTER#0 [ ] ( main:3 [ ] ) always clobbers reg byte a
Statement [10] *((const void()**) KERNEL_IRQ#0) ← &interrupt(KERNEL_MIN)(void()) irq() [ ] ( main:3 [ ] ) always clobbers reg byte a
Statement [12] if(*((const byte*) RASTER#0)>=(byte) $14) goto main::@1 [ ] ( main:3 [ ] ) always clobbers reg byte a
Statement [13] (bool) framedone#0 ← true [ ] ( main:3 [ ] ) always clobbers reg byte a
Statement [15] *((const byte*) IRQ_STATUS#0) ← (const byte) IRQ_RASTER#0 [ ] ( [ ] ) always clobbers reg byte a
Statement [16] if(*((const byte*) RASTER#0)<(byte) $32+(byte) 1) goto irq::@1 [ ] ( [ ] ) always clobbers reg byte a
Statement [17] (bool) framedone#3 ← false [ ] ( [ ] ) always clobbers reg byte a
Potential registers zp ZP_BOOL:2 [ framedone#0 framedone#3 framedone#11 ] : zp ZP_BOOL:2 ,
Statement [1] (bool) framedone#11 ← false [ framedone#11 ] ( ) always clobbers reg byte a
Statement [6] *((const byte*) CIA1_INTERRUPT#0) ← (const byte) CIA_INTERRUPT_CLEAR#0 [ framedone#11 ] ( main:3 [ framedone#11 ] ) always clobbers reg byte a
Statement [7] *((const byte*) VIC_CONTROL#0) ← *((const byte*) VIC_CONTROL#0) & (byte) $7f [ framedone#11 ] ( main:3 [ framedone#11 ] ) always clobbers reg byte a
Statement [8] *((const byte*) RASTER#0) ← (byte) $fd [ framedone#11 ] ( main:3 [ framedone#11 ] ) always clobbers reg byte a
Statement [9] *((const byte*) IRQ_ENABLE#0) ← (const byte) IRQ_RASTER#0 [ framedone#11 ] ( main:3 [ framedone#11 ] ) always clobbers reg byte a
Statement [10] *((const void()**) KERNEL_IRQ#0) ← &interrupt(KERNEL_MIN)(void()) irq() [ framedone#11 ] ( main:3 [ framedone#11 ] ) always clobbers reg byte a
Statement [13] if(*((const byte*) RASTER#0)>=(byte) $14) goto main::@1 [ ] ( main:3 [ ] ) always clobbers reg byte a
Statement [14] (bool) framedone#0 ← true [ framedone#0 ] ( main:3 [ framedone#0 ] ) always clobbers reg byte a
Statement [16] *((const byte*) IRQ_STATUS#0) ← (const byte) IRQ_RASTER#0 [ framedone#11 ] ( [ framedone#11 ] ) always clobbers reg byte a
Statement [17] if(*((const byte*) RASTER#0)<(byte) $32+(byte) 1) goto irq::@1 [ framedone#11 ] ( [ framedone#11 ] ) always clobbers reg byte a
Statement [18] (bool) framedone#3 ← false [ framedone#3 ] ( [ framedone#3 ] ) always clobbers reg byte a
Potential registers zp ZP_BOOL:2 [ framedone#10 framedone#1 framedone#11 framedone#0 framedone#3 ] : zp ZP_BOOL:2 ,
REGISTER UPLIFT SCOPES
Uplift Scope [] 150: zp ZP_BOOL:2 [ framedone#0 framedone#3 framedone#11 ]
Uplift Scope [] 196.5: zp ZP_BOOL:2 [ framedone#10 framedone#1 framedone#11 framedone#0 framedone#3 ]
Uplift Scope [main]
Uplift Scope [irq]
Uplifting [] best 1367 combination zp ZP_BOOL:2 [ framedone#0 framedone#3 framedone#11 ]
Uplifting [main] best 1367 combination
Uplifting [irq] best 1367 combination
Uplifting [] best 1994 combination zp ZP_BOOL:2 [ framedone#10 framedone#1 framedone#11 framedone#0 framedone#3 ]
Uplifting [main] best 1994 combination
Uplifting [irq] best 1994 combination
ASSEMBLER BEFORE OPTIMIZATION
//SEG0 File Comments
@ -517,48 +536,62 @@ main: {
sta KERNEL_IRQ+1
//SEG18 asm { cli }
cli
//SEG19 [12] phi from main main::@3 to main::@1 [phi:main/main::@3->main::@1]
b1_from_main:
b1_from_b3:
//SEG20 [12] phi (bool) framedone#1 = (bool) framedone#11 [phi:main/main::@3->main::@1#0] -- register_copy
jmp b1
//SEG19 main::@1
//SEG21 [12] phi from main::@2 to main::@1 [phi:main::@2->main::@1]
b1_from_b2:
jmp b1
//SEG22 main::@1
b1:
//SEG20 [12] if(*((const byte*) RASTER#0)>=(byte) $14) goto main::@1 -- _deref_pbuc1_ge_vbuc2_then_la1
jmp b2
//SEG23 main::@2
b2:
//SEG24 [13] if(*((const byte*) RASTER#0)>=(byte) $14) goto main::@1 -- _deref_pbuc1_ge_vbuc2_then_la1
lda RASTER
cmp #$14
bcs b1
jmp b2
//SEG21 main::@2
b2:
//SEG22 [13] (bool) framedone#0 ← true -- vboz1=vboc1
bcs b1_from_b2
jmp b3
//SEG25 main::@3
b3:
//SEG26 [14] (bool) framedone#0 ← true -- vboz1=vboc1
lda #1
sta framedone
jmp b1
jmp b1_from_b3
}
//SEG23 irq
//SEG27 irq
irq: {
//SEG24 entry interrupt(KERNEL_MIN)
//SEG25 [14] *((const byte*) BGCOL#0) ← ++ *((const byte*) BGCOL#0) -- _deref_pbuc1=_inc__deref_pbuc1
//SEG28 entry interrupt(KERNEL_MIN)
//SEG29 [15] *((const byte*) BGCOL#0) ← ++ *((const byte*) BGCOL#0) -- _deref_pbuc1=_inc__deref_pbuc1
inc BGCOL
//SEG26 [15] *((const byte*) IRQ_STATUS#0) ← (const byte) IRQ_RASTER#0 -- _deref_pbuc1=vbuc2
//SEG30 [16] *((const byte*) IRQ_STATUS#0) ← (const byte) IRQ_RASTER#0 -- _deref_pbuc1=vbuc2
lda #IRQ_RASTER
sta IRQ_STATUS
//SEG27 [16] if(*((const byte*) RASTER#0)<(byte) $32+(byte) 1) goto irq::@1 -- _deref_pbuc1_lt_vbuc2_then_la1
//SEG31 [17] if(*((const byte*) RASTER#0)<(byte) $32+(byte) 1) goto irq::@1 -- _deref_pbuc1_lt_vbuc2_then_la1
lda RASTER
cmp #$32+1
bcc b1
bcc b1_from_irq
jmp b2
//SEG28 irq::@2
//SEG32 irq::@2
b2:
//SEG29 [17] (bool) framedone#3 ← false -- vboz1=vboc1
//SEG33 [18] (bool) framedone#3 ← false -- vboz1=vboc1
lda #0
sta framedone
//SEG34 [19] phi from irq irq::@2 to irq::@1 [phi:irq/irq::@2->irq::@1]
b1_from_irq:
b1_from_b2:
//SEG35 [19] phi (bool) framedone#10 = (bool) framedone#11 [phi:irq/irq::@2->irq::@1#0] -- register_copy
jmp b1
//SEG30 irq::@1
//SEG36 irq::@1
b1:
//SEG31 [18] *((const byte*) BGCOL#0) ← -- *((const byte*) BGCOL#0) -- _deref_pbuc1=_dec__deref_pbuc1
//SEG37 [20] *((const byte*) BGCOL#0) ← -- *((const byte*) BGCOL#0) -- _deref_pbuc1=_dec__deref_pbuc1
dec BGCOL
jmp breturn
//SEG32 irq::@return
//SEG38 irq::@return
breturn:
//SEG33 [19] return - exit interrupt(KERNEL_MIN)
//SEG39 [21] return - exit interrupt(KERNEL_MIN)
jmp $ea81
}
@ -568,22 +601,39 @@ Removing instruction jmp b2
Removing instruction jmp bend
Removing instruction jmp b1
Removing instruction jmp b2
Removing instruction jmp b3
Removing instruction jmp b2
Removing instruction jmp b1
Removing instruction jmp breturn
Succesful ASM optimization Pass5NextJumpElimination
Replacing label b1 with b2
Replacing label b1_from_b2 with b2
Replacing label b1_from_irq with b1
Removing instruction b1:
Removing instruction b2_from_b1:
Removing instruction bend_from_b2:
Removing instruction b1_from_main:
Removing instruction b1_from_b2:
Removing instruction b1:
Removing instruction b1_from_irq:
Removing instruction b1_from_b2:
Succesful ASM optimization Pass5RedundantLabelElimination
Removing instruction b2:
Removing instruction bend:
Removing instruction b2:
Removing instruction b3:
Removing instruction b2:
Removing instruction breturn:
Succesful ASM optimization Pass5UnusedLabelElimination
Skipping double jump to b2 in jmp b1_from_b3
Succesful ASM optimization Pass5DoubleJumpElimination
Relabelling long label b1_from_b3 to b1
Succesful ASM optimization Pass5RelabelLongLabels
Adding RTS to root block
Succesful ASM optimization Pass5AddMainRts
Removing instruction jmp b2
Succesful ASM optimization Pass5NextJumpElimination
Removing instruction b1:
Succesful ASM optimization Pass5RedundantLabelElimination
FINAL SYMBOL TABLE
(label) @1
@ -609,9 +659,11 @@ FINAL SYMBOL TABLE
(byte*) VIC_CONTROL
(const byte*) VIC_CONTROL#0 VIC_CONTROL = (byte*) 53265
(bool) framedone
(bool) framedone#0 framedone zp ZP_BOOL:2 110.0
(bool) framedone#11 framedone zp ZP_BOOL:2 20.0
(bool) framedone#3 framedone zp ZP_BOOL:2 20.0
(bool) framedone#0 framedone zp ZP_BOOL:2 22.0
(bool) framedone#1 framedone zp ZP_BOOL:2 130.0
(bool) framedone#10 framedone zp ZP_BOOL:2 40.0
(bool) framedone#11 framedone zp ZP_BOOL:2 0.5
(bool) framedone#3 framedone zp ZP_BOOL:2 4.0
interrupt(KERNEL_MIN)(void()) irq()
(label) irq::@1
(label) irq::@2
@ -619,8 +671,9 @@ interrupt(KERNEL_MIN)(void()) irq()
(void()) main()
(label) main::@1
(label) main::@2
(label) main::@3
zp ZP_BOOL:2 [ framedone#0 framedone#3 framedone#11 ]
zp ZP_BOOL:2 [ framedone#10 framedone#1 framedone#11 framedone#0 framedone#3 ]
FINAL ASSEMBLER
@ -685,40 +738,46 @@ main: {
sta KERNEL_IRQ+1
//SEG18 asm { cli }
cli
//SEG19 main::@1
b1:
//SEG20 [12] if(*((const byte*) RASTER#0)>=(byte) $14) goto main::@1 -- _deref_pbuc1_ge_vbuc2_then_la1
//SEG19 [12] phi from main main::@3 to main::@1 [phi:main/main::@3->main::@1]
//SEG20 [12] phi (bool) framedone#1 = (bool) framedone#11 [phi:main/main::@3->main::@1#0] -- register_copy
//SEG21 [12] phi from main::@2 to main::@1 [phi:main::@2->main::@1]
//SEG22 main::@1
//SEG23 main::@2
b2:
//SEG24 [13] if(*((const byte*) RASTER#0)>=(byte) $14) goto main::@1 -- _deref_pbuc1_ge_vbuc2_then_la1
lda RASTER
cmp #$14
bcs b1
//SEG21 main::@2
//SEG22 [13] (bool) framedone#0 ← true -- vboz1=vboc1
bcs b2
//SEG25 main::@3
//SEG26 [14] (bool) framedone#0 ← true -- vboz1=vboc1
lda #1
sta framedone
jmp b1
jmp b2
}
//SEG23 irq
//SEG27 irq
irq: {
//SEG24 entry interrupt(KERNEL_MIN)
//SEG25 [14] *((const byte*) BGCOL#0) ← ++ *((const byte*) BGCOL#0) -- _deref_pbuc1=_inc__deref_pbuc1
//SEG28 entry interrupt(KERNEL_MIN)
//SEG29 [15] *((const byte*) BGCOL#0) ← ++ *((const byte*) BGCOL#0) -- _deref_pbuc1=_inc__deref_pbuc1
inc BGCOL
//SEG26 [15] *((const byte*) IRQ_STATUS#0) ← (const byte) IRQ_RASTER#0 -- _deref_pbuc1=vbuc2
//SEG30 [16] *((const byte*) IRQ_STATUS#0) ← (const byte) IRQ_RASTER#0 -- _deref_pbuc1=vbuc2
lda #IRQ_RASTER
sta IRQ_STATUS
//SEG27 [16] if(*((const byte*) RASTER#0)<(byte) $32+(byte) 1) goto irq::@1 -- _deref_pbuc1_lt_vbuc2_then_la1
//SEG31 [17] if(*((const byte*) RASTER#0)<(byte) $32+(byte) 1) goto irq::@1 -- _deref_pbuc1_lt_vbuc2_then_la1
lda RASTER
cmp #$32+1
bcc b1
//SEG28 irq::@2
//SEG29 [17] (bool) framedone#3 ← false -- vboz1=vboc1
//SEG32 irq::@2
//SEG33 [18] (bool) framedone#3 ← false -- vboz1=vboc1
lda #0
sta framedone
//SEG30 irq::@1
//SEG34 [19] phi from irq irq::@2 to irq::@1 [phi:irq/irq::@2->irq::@1]
//SEG35 [19] phi (bool) framedone#10 = (bool) framedone#11 [phi:irq/irq::@2->irq::@1#0] -- register_copy
//SEG36 irq::@1
b1:
//SEG31 [18] *((const byte*) BGCOL#0) ← -- *((const byte*) BGCOL#0) -- _deref_pbuc1=_dec__deref_pbuc1
//SEG37 [20] *((const byte*) BGCOL#0) ← -- *((const byte*) BGCOL#0) -- _deref_pbuc1=_dec__deref_pbuc1
dec BGCOL
//SEG32 irq::@return
//SEG33 [19] return - exit interrupt(KERNEL_MIN)
//SEG38 irq::@return
//SEG39 [21] return - exit interrupt(KERNEL_MIN)
jmp $ea81
}

View File

@ -21,9 +21,11 @@
(byte*) VIC_CONTROL
(const byte*) VIC_CONTROL#0 VIC_CONTROL = (byte*) 53265
(bool) framedone
(bool) framedone#0 framedone zp ZP_BOOL:2 110.0
(bool) framedone#11 framedone zp ZP_BOOL:2 20.0
(bool) framedone#3 framedone zp ZP_BOOL:2 20.0
(bool) framedone#0 framedone zp ZP_BOOL:2 22.0
(bool) framedone#1 framedone zp ZP_BOOL:2 130.0
(bool) framedone#10 framedone zp ZP_BOOL:2 40.0
(bool) framedone#11 framedone zp ZP_BOOL:2 0.5
(bool) framedone#3 framedone zp ZP_BOOL:2 4.0
interrupt(KERNEL_MIN)(void()) irq()
(label) irq::@1
(label) irq::@2
@ -31,5 +33,6 @@ interrupt(KERNEL_MIN)(void()) irq()
(void()) main()
(label) main::@1
(label) main::@2
(label) main::@3
zp ZP_BOOL:2 [ framedone#0 framedone#3 framedone#11 ]
zp ZP_BOOL:2 [ framedone#10 framedone#1 framedone#11 framedone#0 framedone#3 ]

View File

@ -28,5 +28,6 @@ irq::@1: scope:[irq] from irq
[11] (byte) col#3 ← ++ (byte) col#0
to:irq::@return
irq::@return: scope:[irq] from irq irq::@1
[12] return
[12] (byte) col#10 ← phi( irq/(byte) col#0 irq::@1/(byte) col#3 )
[13] return
to:@return

View File

@ -153,8 +153,6 @@ Successful SSA optimization Pass2ConstantIdentification
if() condition always true - replacing block destination [7] if(true) goto main::@2
Successful SSA optimization Pass2ConstantIfs
Rewriting conditional comparison [11] if((byte) col#12<=(byte) $a) goto main::@1
Eliminating unused variable - keeping the phi block (byte) col#10
Successful SSA optimization PassNEliminateUnusedVars
Removing unused block main::@return
Successful SSA optimization Pass2EliminateUnusedBlocks
Adding number conversion cast (unumber) $a+1 in if((byte) col#12<(byte) $a+(number) 1) goto main::@1
@ -167,17 +165,21 @@ Finalized unsigned number type (byte) 1
Successful SSA optimization PassNFinalizeNumberTypeConversions
Constant inlined main::$0 = &interrupt(KERNEL_MIN)(void()) irq()
Successful SSA optimization Pass2ConstantInlining
Added new block during phi lifting irq::@3(between irq and irq::@return)
Adding NOP phi() at start of @2
Adding NOP phi() at start of @3
Adding NOP phi() at start of @end
CALL GRAPH
Calls in [] to main:2
Created 1 initial phi equivalence classes
Created 2 initial phi equivalence classes
Coalesced [6] col#15 ← col#0
Coalesced [10] col#16 ← col#1
Coalesced [15] col#18 ← col#3
Coalesced [18] col#17 ← col#0
Coalesced down to 1 phi equivalence classes
Culled Empty Block (label) @3
Culled Empty Block (label) irq::@3
Renumbering block @2 to @1
Renumbering block main::@7 to main::@3
Renumbering block irq::@2 to irq::@1
@ -215,7 +217,8 @@ irq::@1: scope:[irq] from irq
[11] (byte) col#3 ← ++ (byte) col#0
to:irq::@return
irq::@return: scope:[irq] from irq irq::@1
[12] return
[12] (byte) col#10 ← phi( irq/(byte) col#0 irq::@1/(byte) col#3 )
[13] return
to:@return
@ -223,19 +226,19 @@ VARIABLE REGISTER WEIGHTS
(byte*) BGCOL
(void()**) KERNEL_IRQ
(byte) col
(byte) col#0 1.6666666666666665
(byte) col#0 1.9999999999999998
(byte) col#1 22.0
(byte) col#10 40.0
(byte) col#12 114.0
(byte) col#3 20.0
(byte) col#3 4.0
interrupt(KERNEL_MIN)(void()) irq()
(void()) main()
Initial phi equivalence classes
[ col#12 col#0 col#1 ]
Coalescing volatile variable equivalence classes [ col#12 col#0 col#1 ] and [ col#3 ]
[ col#10 col#12 col#0 col#1 col#3 ]
Complete equivalence classes
[ col#12 col#0 col#1 col#3 ]
Allocated zp ZP_BYTE:2 [ col#12 col#0 col#1 col#3 ]
[ col#10 col#12 col#0 col#1 col#3 ]
Allocated zp ZP_BYTE:2 [ col#10 col#12 col#0 col#1 col#3 ]
INITIAL ASM
//SEG0 File Comments
@ -308,16 +311,20 @@ irq: {
//SEG24 [10] if((byte) col#0==(byte) 0) goto irq::@return -- vbuz1_eq_0_then_la1
lda col
cmp #0
beq breturn
beq breturn_from_irq
jmp b1
//SEG25 irq::@1
b1:
//SEG26 [11] (byte) col#3 ← ++ (byte) col#0 -- vbuz1=_inc_vbuz1
inc col
//SEG27 [12] phi from irq irq::@1 to irq::@return [phi:irq/irq::@1->irq::@return]
breturn_from_irq:
breturn_from_b1:
//SEG28 [12] phi (byte) col#10 = (byte) col#0 [phi:irq/irq::@1->irq::@return#0] -- register_copy
jmp breturn
//SEG27 irq::@return
//SEG29 irq::@return
breturn:
//SEG28 [12] return - exit interrupt(KERNEL_MIN)
//SEG30 [13] return - exit interrupt(KERNEL_MIN)
jmp $ea81
}
@ -329,18 +336,18 @@ Statement [7] (byte) col#1 ← (byte) 0 [ col#1 ] ( main:2 [ col#1 ] ) always cl
Statement asm { lda$dc0d } always clobbers reg byte a
Statement [9] *((const byte*) BGCOL#0) ← (byte) col#0 [ col#0 ] ( [ col#0 ] ) always clobbers reg byte a
Statement [10] if((byte) col#0==(byte) 0) goto irq::@return [ col#0 ] ( [ col#0 ] ) always clobbers reg byte a
Potential registers zp ZP_BYTE:2 [ col#12 col#0 col#1 col#3 ] : zp ZP_BYTE:2 ,
Potential registers zp ZP_BYTE:2 [ col#10 col#12 col#0 col#1 col#3 ] : zp ZP_BYTE:2 ,
REGISTER UPLIFT SCOPES
Uplift Scope [] 157.67: zp ZP_BYTE:2 [ col#12 col#0 col#1 col#3 ]
Uplift Scope [] 182: zp ZP_BYTE:2 [ col#10 col#12 col#0 col#1 col#3 ]
Uplift Scope [main]
Uplift Scope [irq]
Uplifting [] best 1821 combination zp ZP_BYTE:2 [ col#12 col#0 col#1 col#3 ]
Uplifting [] best 1821 combination zp ZP_BYTE:2 [ col#10 col#12 col#0 col#1 col#3 ]
Uplifting [main] best 1821 combination
Uplifting [irq] best 1821 combination
Attempting to uplift remaining variables inzp ZP_BYTE:2 [ col#12 col#0 col#1 col#3 ]
Uplifting [] best 1821 combination zp ZP_BYTE:2 [ col#12 col#0 col#1 col#3 ]
Attempting to uplift remaining variables inzp ZP_BYTE:2 [ col#10 col#12 col#0 col#1 col#3 ]
Uplifting [] best 1821 combination zp ZP_BYTE:2 [ col#10 col#12 col#0 col#1 col#3 ]
ASSEMBLER BEFORE OPTIMIZATION
//SEG0 File Comments
@ -413,16 +420,20 @@ irq: {
//SEG24 [10] if((byte) col#0==(byte) 0) goto irq::@return -- vbuz1_eq_0_then_la1
lda col
cmp #0
beq breturn
beq breturn_from_irq
jmp b1
//SEG25 irq::@1
b1:
//SEG26 [11] (byte) col#3 ← ++ (byte) col#0 -- vbuz1=_inc_vbuz1
inc col
//SEG27 [12] phi from irq irq::@1 to irq::@return [phi:irq/irq::@1->irq::@return]
breturn_from_irq:
breturn_from_b1:
//SEG28 [12] phi (byte) col#10 = (byte) col#0 [phi:irq/irq::@1->irq::@return#0] -- register_copy
jmp breturn
//SEG27 irq::@return
//SEG29 irq::@return
breturn:
//SEG28 [12] return - exit interrupt(KERNEL_MIN)
//SEG30 [13] return - exit interrupt(KERNEL_MIN)
jmp $ea81
}
@ -437,11 +448,14 @@ Removing instruction jmp breturn
Succesful ASM optimization Pass5NextJumpElimination
Replacing label b1 with b2
Replacing label b1_from_b2 with b2
Replacing label breturn_from_irq with breturn
Removing instruction b1_from_bbegin:
Removing instruction bend_from_b1:
Removing instruction b1_from_main:
Removing instruction b1_from_b2:
Removing instruction b1:
Removing instruction breturn_from_irq:
Removing instruction breturn_from_b1:
Succesful ASM optimization Pass5RedundantLabelElimination
Removing instruction b1:
Removing instruction bend:
@ -472,10 +486,11 @@ FINAL SYMBOL TABLE
(void()**) KERNEL_IRQ
(const void()**) KERNEL_IRQ#0 KERNEL_IRQ = (void()**) 788
(byte) col
(byte) col#0 col zp ZP_BYTE:2 1.6666666666666665
(byte) col#0 col zp ZP_BYTE:2 1.9999999999999998
(byte) col#1 col zp ZP_BYTE:2 22.0
(byte) col#10 col zp ZP_BYTE:2 40.0
(byte) col#12 col zp ZP_BYTE:2 114.0
(byte) col#3 col zp ZP_BYTE:2 20.0
(byte) col#3 col zp ZP_BYTE:2 4.0
interrupt(KERNEL_MIN)(void()) irq()
(label) irq::@1
(label) irq::@return
@ -484,7 +499,7 @@ interrupt(KERNEL_MIN)(void()) irq()
(label) main::@2
(label) main::@3
zp ZP_BYTE:2 [ col#12 col#0 col#1 col#3 ]
zp ZP_BYTE:2 [ col#10 col#12 col#0 col#1 col#3 ]
FINAL ASSEMBLER
@ -552,8 +567,10 @@ irq: {
//SEG25 irq::@1
//SEG26 [11] (byte) col#3 ← ++ (byte) col#0 -- vbuz1=_inc_vbuz1
inc col
//SEG27 irq::@return
//SEG28 [12] return - exit interrupt(KERNEL_MIN)
//SEG27 [12] phi from irq irq::@1 to irq::@return [phi:irq/irq::@1->irq::@return]
//SEG28 [12] phi (byte) col#10 = (byte) col#0 [phi:irq/irq::@1->irq::@return#0] -- register_copy
//SEG29 irq::@return
//SEG30 [13] return - exit interrupt(KERNEL_MIN)
jmp $ea81
}

View File

@ -6,10 +6,11 @@
(void()**) KERNEL_IRQ
(const void()**) KERNEL_IRQ#0 KERNEL_IRQ = (void()**) 788
(byte) col
(byte) col#0 col zp ZP_BYTE:2 1.6666666666666665
(byte) col#0 col zp ZP_BYTE:2 1.9999999999999998
(byte) col#1 col zp ZP_BYTE:2 22.0
(byte) col#10 col zp ZP_BYTE:2 40.0
(byte) col#12 col zp ZP_BYTE:2 114.0
(byte) col#3 col zp ZP_BYTE:2 20.0
(byte) col#3 col zp ZP_BYTE:2 4.0
interrupt(KERNEL_MIN)(void()) irq()
(label) irq::@1
(label) irq::@return
@ -18,4 +19,4 @@ interrupt(KERNEL_MIN)(void()) irq()
(label) main::@2
(label) main::@3
zp ZP_BYTE:2 [ col#12 col#0 col#1 col#3 ]
zp ZP_BYTE:2 [ col#10 col#12 col#0 col#1 col#3 ]

View File

@ -36,8 +36,8 @@
.label PLEX_SCREEN_PTR = $400+$3f8
.label plex_show_idx = 7
.label plex_sprite_idx = 6
.label plex_sprite_msb = 8
.label plex_free_next = 9
.label plex_sprite_msb = 9
.label plex_free_next = 8
.label framedone = $a
bbegin:
// The index in the PLEX tables of the next sprite to show
@ -263,7 +263,7 @@ plex_irq: {
plexShowSprite: {
.label _6 = 6
.label plex_sprite_idx2 = $e
.label plexFreeAdd1__2 = 9
.label plexFreeAdd1__2 = 8
lda plex_sprite_idx
asl
sta plex_sprite_idx2

View File

@ -47,6 +47,10 @@ loop: scope:[loop] from main::@1
to:loop::@1
loop::@1: scope:[loop] from loop loop::@6
[17] (byte) loop::sin_idx#6 ← phi( loop/(byte) 0 loop::@6/(byte) loop::sin_idx#1 )
[17] (byte) plex_free_next#10 ← phi( loop/(byte) plex_free_next#31 loop::@6/(byte) plex_free_next#0 )
[17] (byte) plex_sprite_msb#11 ← phi( loop/(byte) plex_sprite_msb#0 loop::@6/(byte) plex_sprite_msb#1 )
[17] (byte) plex_sprite_idx#10 ← phi( loop/(byte) plex_sprite_idx#0 loop::@6/(byte) plex_sprite_idx#1 )
[17] (byte) plex_show_idx#10 ← phi( loop/(byte) plex_show_idx#0 loop::@6/(byte) plex_show_idx#1 )
[17] (bool) framedone#12 ← phi( loop/(bool) framedone#17 loop::@6/(bool) framedone#5 )
to:loop::@2
loop::@2: scope:[loop] from loop::@1 loop::@2
@ -201,52 +205,53 @@ plex_irq::@5: scope:[plex_irq] from plex_irq::@4
[95] (bool) framedone#3 ← true
to:plex_irq::@2
plex_irq::@2: scope:[plex_irq] from plex_irq::@1 plex_irq::@5
[96] *((const byte*) BORDERCOL#0) ← (byte) 0
[96] (bool) framedone#10 ← phi( plex_irq::@1/(bool) framedone#17 plex_irq::@5/(bool) framedone#3 )
[97] *((const byte*) BORDERCOL#0) ← (byte) 0
to:plex_irq::@return
plex_irq::@return: scope:[plex_irq] from plex_irq::@2
[97] return
[98] return
to:@return
plex_irq::@1: scope:[plex_irq] from plex_irq::@4
[98] *((const byte*) RASTER#0) ← (byte) plex_irq::plexFreeNextYpos1_return#0
[99] *((const byte*) RASTER#0) ← (byte) plex_irq::plexFreeNextYpos1_return#0
to:plex_irq::@2
plexShowSprite: scope:[plexShowSprite] from plex_irq::@3
[99] (byte) plexShowSprite::plex_sprite_idx2#0 ← (byte) plex_sprite_idx#25 << (byte) 1
[100] (byte) plexShowSprite::plexFreeAdd1_ypos#0 ← *((const byte[PLEX_COUNT#0]) PLEX_YPOS#0 + *((const byte[PLEX_COUNT#0]) PLEX_SORTED_IDX#0 + (byte) plex_show_idx#27))
[101] *((const byte*) SPRITES_YPOS#0 + (byte) plexShowSprite::plex_sprite_idx2#0) ← (byte) plexShowSprite::plexFreeAdd1_ypos#0
[100] (byte) plexShowSprite::plex_sprite_idx2#0 ← (byte) plex_sprite_idx#25 << (byte) 1
[101] (byte) plexShowSprite::plexFreeAdd1_ypos#0 ← *((const byte[PLEX_COUNT#0]) PLEX_YPOS#0 + *((const byte[PLEX_COUNT#0]) PLEX_SORTED_IDX#0 + (byte) plex_show_idx#27))
[102] *((const byte*) SPRITES_YPOS#0 + (byte) plexShowSprite::plex_sprite_idx2#0) ← (byte) plexShowSprite::plexFreeAdd1_ypos#0
to:plexShowSprite::plexFreeAdd1
plexShowSprite::plexFreeAdd1: scope:[plexShowSprite] from plexShowSprite
[102] (byte~) plexShowSprite::plexFreeAdd1_$0#0 ← (byte) plexShowSprite::plexFreeAdd1_ypos#0 + (byte) $15
[103] *((const byte[8]) PLEX_FREE_YPOS#0 + (byte) plex_free_next#27) ← (byte~) plexShowSprite::plexFreeAdd1_$0#0
[104] (byte~) plexShowSprite::plexFreeAdd1_$1#0 ← (byte) plex_free_next#27 + (byte) 1
[105] (byte~) plexShowSprite::plexFreeAdd1_$2#0 ← (byte~) plexShowSprite::plexFreeAdd1_$1#0 & (byte) 7
[103] (byte~) plexShowSprite::plexFreeAdd1_$0#0 ← (byte) plexShowSprite::plexFreeAdd1_ypos#0 + (byte) $15
[104] *((const byte[8]) PLEX_FREE_YPOS#0 + (byte) plex_free_next#27) ← (byte~) plexShowSprite::plexFreeAdd1_$0#0
[105] (byte~) plexShowSprite::plexFreeAdd1_$1#0 ← (byte) plex_free_next#27 + (byte) 1
[106] (byte~) plexShowSprite::plexFreeAdd1_$2#0 ← (byte~) plexShowSprite::plexFreeAdd1_$1#0 & (byte) 7
to:plexShowSprite::@5
plexShowSprite::@5: scope:[plexShowSprite] from plexShowSprite::plexFreeAdd1
[106] *((const byte*) PLEX_SCREEN_PTR#0 + (byte) plex_sprite_idx#25) ← *((const byte[PLEX_COUNT#0]) PLEX_PTR#0 + *((const byte[PLEX_COUNT#0]) PLEX_SORTED_IDX#0 + (byte) plex_show_idx#27))
[107] (byte) plexShowSprite::xpos_idx#0 ← *((const byte[PLEX_COUNT#0]) PLEX_SORTED_IDX#0 + (byte) plex_show_idx#27)
[108] (byte~) plexShowSprite::$11 ← (byte) plexShowSprite::xpos_idx#0 << (byte) 1
[109] (byte~) plexShowSprite::$2 ← < *((const word[PLEX_COUNT#0]) PLEX_XPOS#0 + (byte~) plexShowSprite::$11)
[110] *((const byte*) SPRITES_XPOS#0 + (byte) plexShowSprite::plex_sprite_idx2#0) ← (byte~) plexShowSprite::$2
[111] (byte~) plexShowSprite::$3 ← > *((const word[PLEX_COUNT#0]) PLEX_XPOS#0 + (byte~) plexShowSprite::$11)
[112] if((byte~) plexShowSprite::$3!=(byte) 0) goto plexShowSprite::@1
[107] *((const byte*) PLEX_SCREEN_PTR#0 + (byte) plex_sprite_idx#25) ← *((const byte[PLEX_COUNT#0]) PLEX_PTR#0 + *((const byte[PLEX_COUNT#0]) PLEX_SORTED_IDX#0 + (byte) plex_show_idx#27))
[108] (byte) plexShowSprite::xpos_idx#0 ← *((const byte[PLEX_COUNT#0]) PLEX_SORTED_IDX#0 + (byte) plex_show_idx#27)
[109] (byte~) plexShowSprite::$11 ← (byte) plexShowSprite::xpos_idx#0 << (byte) 1
[110] (byte~) plexShowSprite::$2 ← < *((const word[PLEX_COUNT#0]) PLEX_XPOS#0 + (byte~) plexShowSprite::$11)
[111] *((const byte*) SPRITES_XPOS#0 + (byte) plexShowSprite::plex_sprite_idx2#0) ← (byte~) plexShowSprite::$2
[112] (byte~) plexShowSprite::$3 ← > *((const word[PLEX_COUNT#0]) PLEX_XPOS#0 + (byte~) plexShowSprite::$11)
[113] if((byte~) plexShowSprite::$3!=(byte) 0) goto plexShowSprite::@1
to:plexShowSprite::@3
plexShowSprite::@3: scope:[plexShowSprite] from plexShowSprite::@5
[113] (byte~) plexShowSprite::$9 ← (byte) $ff ^ (byte) plex_sprite_msb#28
[114] *((const byte*) SPRITES_XMSB#0) ← *((const byte*) SPRITES_XMSB#0) & (byte~) plexShowSprite::$9
[114] (byte~) plexShowSprite::$9 ← (byte) $ff ^ (byte) plex_sprite_msb#28
[115] *((const byte*) SPRITES_XMSB#0) ← *((const byte*) SPRITES_XMSB#0) & (byte~) plexShowSprite::$9
to:plexShowSprite::@2
plexShowSprite::@2: scope:[plexShowSprite] from plexShowSprite::@1 plexShowSprite::@3
[115] (byte~) plexShowSprite::$5 ← (byte) plex_sprite_idx#25 + (byte) 1
[116] (byte~) plexShowSprite::$6 ← (byte~) plexShowSprite::$5 & (byte) 7
[117] (byte) plex_show_idx#16 ← ++ (byte) plex_show_idx#27
[118] (byte) plex_sprite_msb#3 ← (byte) plex_sprite_msb#28 << (byte) 1
[119] if((byte) plex_sprite_msb#3!=(byte) 0) goto plexShowSprite::@return
[116] (byte~) plexShowSprite::$5 ← (byte) plex_sprite_idx#25 + (byte) 1
[117] (byte~) plexShowSprite::$6 ← (byte~) plexShowSprite::$5 & (byte) 7
[118] (byte) plex_show_idx#16 ← ++ (byte) plex_show_idx#27
[119] (byte) plex_sprite_msb#3 ← (byte) plex_sprite_msb#28 << (byte) 1
[120] if((byte) plex_sprite_msb#3!=(byte) 0) goto plexShowSprite::@return
to:plexShowSprite::@4
plexShowSprite::@4: scope:[plexShowSprite] from plexShowSprite::@2
[120] (byte) plex_sprite_msb#4 ← (byte) 1
[121] (byte) plex_sprite_msb#4 ← (byte) 1
to:plexShowSprite::@return
plexShowSprite::@return: scope:[plexShowSprite] from plexShowSprite::@2 plexShowSprite::@4
[121] (byte) plex_sprite_msb#17 ← phi( plexShowSprite::@2/(byte) plex_sprite_msb#3 plexShowSprite::@4/(byte) plex_sprite_msb#4 )
[122] return
[122] (byte) plex_sprite_msb#17 ← phi( plexShowSprite::@2/(byte) plex_sprite_msb#3 plexShowSprite::@4/(byte) plex_sprite_msb#4 )
[123] return
to:@return
plexShowSprite::@1: scope:[plexShowSprite] from plexShowSprite::@5
[123] *((const byte*) SPRITES_XMSB#0) ← *((const byte*) SPRITES_XMSB#0) | (byte) plex_sprite_msb#28
[124] *((const byte*) SPRITES_XMSB#0) ← *((const byte*) SPRITES_XMSB#0) | (byte) plex_sprite_msb#28
to:plexShowSprite::@2

File diff suppressed because it is too large Load Diff

View File

@ -65,9 +65,10 @@
(byte*) YSIN
(const byte*) YSIN#0 YSIN = (byte*) 8448
(bool) framedone
(bool) framedone#10 framedone zp ZP_BOOL:10 40.0
(bool) framedone#12 framedone zp ZP_BOOL:10 57.0
(bool) framedone#17 framedone zp ZP_BOOL:10 0.6666666666666666
(bool) framedone#3 framedone zp ZP_BOOL:10 20.0
(bool) framedone#17 framedone zp ZP_BOOL:10 0.375
(bool) framedone#3 framedone zp ZP_BOOL:10 4.0
(bool) framedone#5 framedone zp ZP_BOOL:10 7.333333333333333
(void()) init()
(byte~) init::$9 reg byte a 22.0
@ -134,7 +135,7 @@
(number~) plexShowSprite::plexFreeAdd1_$1
(byte~) plexShowSprite::plexFreeAdd1_$1#0 reg byte x 4.0
(number~) plexShowSprite::plexFreeAdd1_$2
(byte~) plexShowSprite::plexFreeAdd1_$2#0 plexFreeAdd1_$2 zp ZP_BYTE:9 1.0
(byte~) plexShowSprite::plexFreeAdd1_$2#0 plexFreeAdd1_$2 zp ZP_BYTE:8 1.0
(byte) plexShowSprite::plexFreeAdd1_ypos
(byte) plexShowSprite::plexFreeAdd1_ypos#0 reg byte a 3.0
(byte) plexShowSprite::plex_sprite_idx2
@ -171,9 +172,10 @@
(byte) plexSort::s#3 reg byte x 2052.5
(byte~) plexSort::s#6 reg byte x 202.0
(byte) plex_free_next
(byte) plex_free_next#0 plex_free_next zp ZP_BYTE:9 20.0
(byte) plex_free_next#27 plex_free_next zp ZP_BYTE:9 2.8333333333333335
(byte) plex_free_next#31 plex_free_next zp ZP_BYTE:9 4.0
(byte) plex_free_next#0 plex_free_next zp ZP_BYTE:8 1.8571428571428572
(byte) plex_free_next#10 plex_free_next zp ZP_BYTE:8 130.0
(byte) plex_free_next#27 plex_free_next zp ZP_BYTE:8 2.8333333333333335
(byte) plex_free_next#31 plex_free_next zp ZP_BYTE:8 0.6000000000000001
interrupt(KERNEL_MIN)(void()) plex_irq()
(byte~) plex_irq::$4 $4 zp ZP_BYTE:13 11.0
(label) plex_irq::@1
@ -189,21 +191,24 @@ interrupt(KERNEL_MIN)(void()) plex_irq()
(byte) plex_irq::plexFreeNextYpos1_return#0 reg byte x 4.0
(byte) plex_irq::rasterY
(byte) plex_show_idx
(byte) plex_show_idx#0 plex_show_idx zp ZP_BYTE:7 4.0
(byte) plex_show_idx#1 plex_show_idx zp ZP_BYTE:7 20.0
(byte) plex_show_idx#0 plex_show_idx zp ZP_BYTE:7 0.46153846153846156
(byte) plex_show_idx#1 plex_show_idx zp ZP_BYTE:7 0.8666666666666666
(byte) plex_show_idx#10 plex_show_idx zp ZP_BYTE:7 130.0
(byte) plex_show_idx#16 plex_show_idx zp ZP_BYTE:7 2.1666666666666665
(byte) plex_show_idx#27 plex_show_idx zp ZP_BYTE:7 1.05
(byte) plex_sprite_idx
(byte) plex_sprite_idx#0 plex_sprite_idx zp ZP_BYTE:6 4.0
(byte) plex_sprite_idx#1 plex_sprite_idx zp ZP_BYTE:6 20.0
(byte) plex_sprite_idx#0 plex_sprite_idx zp ZP_BYTE:6 0.5
(byte) plex_sprite_idx#1 plex_sprite_idx zp ZP_BYTE:6 0.9285714285714286
(byte) plex_sprite_idx#10 plex_sprite_idx zp ZP_BYTE:6 130.0
(byte) plex_sprite_idx#25 plex_sprite_idx zp ZP_BYTE:6 1.0555555555555558
(byte) plex_sprite_msb
(byte) plex_sprite_msb#0 plex_sprite_msb zp ZP_BYTE:8 4.0
(byte) plex_sprite_msb#1 plex_sprite_msb zp ZP_BYTE:8 20.0
(byte) plex_sprite_msb#17 plex_sprite_msb zp ZP_BYTE:8 2.142857142857143
(byte) plex_sprite_msb#28 plex_sprite_msb zp ZP_BYTE:8 0.9047619047619048
(byte) plex_sprite_msb#3 plex_sprite_msb zp ZP_BYTE:8 3.0
(byte) plex_sprite_msb#4 plex_sprite_msb zp ZP_BYTE:8 4.0
(byte) plex_sprite_msb#0 plex_sprite_msb zp ZP_BYTE:9 0.5454545454545454
(byte) plex_sprite_msb#1 plex_sprite_msb zp ZP_BYTE:9 1.0
(byte) plex_sprite_msb#11 plex_sprite_msb zp ZP_BYTE:9 130.0
(byte) plex_sprite_msb#17 plex_sprite_msb zp ZP_BYTE:9 2.142857142857143
(byte) plex_sprite_msb#28 plex_sprite_msb zp ZP_BYTE:9 0.9047619047619048
(byte) plex_sprite_msb#3 plex_sprite_msb zp ZP_BYTE:9 3.0
(byte) plex_sprite_msb#4 plex_sprite_msb zp ZP_BYTE:9 4.0
zp ZP_BYTE:2 [ loop::sin_idx#6 loop::sin_idx#1 ]
reg byte x [ loop::y_idx#2 loop::y_idx#1 loop::y_idx#4 ]
@ -215,11 +220,11 @@ reg byte x [ init::sx#2 init::sx#1 ]
zp ZP_WORD:4 [ init::xp#2 init::xp#1 ]
reg byte x [ init::ss#2 init::ss#1 ]
reg byte x [ plexInit::i#2 plexInit::i#1 ]
zp ZP_BYTE:6 [ plex_sprite_idx#25 plex_sprite_idx#0 plexShowSprite::$6 plex_sprite_idx#1 ]
zp ZP_BYTE:7 [ plex_show_idx#27 plex_show_idx#0 plex_show_idx#16 plex_show_idx#1 ]
zp ZP_BYTE:8 [ plex_sprite_msb#28 plex_sprite_msb#0 plex_sprite_msb#17 plex_sprite_msb#3 plex_sprite_msb#4 plex_sprite_msb#1 ]
zp ZP_BYTE:9 [ plex_free_next#0 plex_free_next#27 plex_free_next#31 plexShowSprite::plexFreeAdd1_$2#0 ]
zp ZP_BOOL:10 [ framedone#3 framedone#12 framedone#17 framedone#5 ]
zp ZP_BYTE:6 [ plex_sprite_idx#25 plex_sprite_idx#10 plex_sprite_idx#0 plex_sprite_idx#1 plexShowSprite::$6 ]
zp ZP_BYTE:7 [ plex_show_idx#27 plex_show_idx#10 plex_show_idx#0 plex_show_idx#1 plex_show_idx#16 ]
zp ZP_BYTE:8 [ plex_free_next#27 plex_free_next#10 plex_free_next#31 plex_free_next#0 plexShowSprite::plexFreeAdd1_$2#0 ]
zp ZP_BYTE:9 [ plex_sprite_msb#28 plex_sprite_msb#11 plex_sprite_msb#0 plex_sprite_msb#1 plex_sprite_msb#17 plex_sprite_msb#3 plex_sprite_msb#4 ]
zp ZP_BOOL:10 [ framedone#10 framedone#12 framedone#17 framedone#5 framedone#3 ]
zp ZP_BYTE:11 [ plexSort::nxt_idx#0 ]
zp ZP_BYTE:12 [ plexSort::nxt_y#0 ]
reg byte x [ plexSort::s#2 ]

View File

@ -28,8 +28,9 @@ irq::@2: scope:[irq] from irq
[11] (byte) col#4 ← (byte) col#0 + (byte) 2
to:irq::@return
irq::@return: scope:[irq] from irq::@1 irq::@2
[12] return
[12] (byte) col#12 ← phi( irq::@1/(byte) col#3 irq::@2/(byte) col#4 )
[13] return
to:@return
irq::@1: scope:[irq] from irq
[13] (byte) col#3 ← ++ (byte) col#0
[14] (byte) col#3 ← ++ (byte) col#0
to:irq::@return

View File

@ -161,8 +161,6 @@ Successful SSA optimization Pass2ConstantIdentification
if() condition always true - replacing block destination [7] if(true) goto main::@2
Successful SSA optimization Pass2ConstantIfs
Rewriting conditional comparison [11] if((byte) col#14<=(byte) $a) goto main::@1
Eliminating unused variable - keeping the phi block (byte) col#12
Successful SSA optimization PassNEliminateUnusedVars
Removing unused block main::@return
Successful SSA optimization Pass2EliminateUnusedBlocks
Adding number conversion cast (unumber) $a+1 in if((byte) col#14<(byte) $a+(number) 1) goto main::@1
@ -181,10 +179,12 @@ Adding NOP phi() at start of @end
CALL GRAPH
Calls in [] to main:2
Created 1 initial phi equivalence classes
Created 2 initial phi equivalence classes
Coalesced [6] col#17 ← col#0
Coalesced [10] col#18 ← col#1
Coalesced down to 1 phi equivalence classes
Coalesced [15] col#20 ← col#4
Coalesced [19] col#19 ← col#3
Coalesced down to 2 phi equivalence classes
Culled Empty Block (label) @3
Renumbering block @2 to @1
Renumbering block main::@7 to main::@3
@ -223,10 +223,11 @@ irq::@2: scope:[irq] from irq
[11] (byte) col#4 ← (byte) col#0 + (byte) 2
to:irq::@return
irq::@return: scope:[irq] from irq::@1 irq::@2
[12] return
[12] (byte) col#12 ← phi( irq::@1/(byte) col#3 irq::@2/(byte) col#4 )
[13] return
to:@return
irq::@1: scope:[irq] from irq
[13] (byte) col#3 ← ++ (byte) col#0
[14] (byte) col#3 ← ++ (byte) col#0
to:irq::@return
@ -236,19 +237,20 @@ VARIABLE REGISTER WEIGHTS
(byte) col
(byte) col#0 1.9999999999999998
(byte) col#1 22.0
(byte) col#12 40.0
(byte) col#14 114.0
(byte) col#3 20.0
(byte) col#4 20.0
(byte) col#3 4.0
(byte) col#4 4.0
interrupt(KERNEL_MIN)(void()) irq()
(void()) main()
Initial phi equivalence classes
[ col#14 col#0 col#1 ]
Coalescing volatile variable equivalence classes [ col#14 col#0 col#1 ] and [ col#3 ]
Coalescing volatile variable equivalence classes [ col#14 col#0 col#1 col#3 ] and [ col#4 ]
[ col#12 col#3 col#4 ]
Coalescing volatile variable equivalence classes [ col#14 col#0 col#1 ] and [ col#12 col#3 col#4 ]
Complete equivalence classes
[ col#14 col#0 col#1 col#3 col#4 ]
Allocated zp ZP_BYTE:2 [ col#14 col#0 col#1 col#3 col#4 ]
[ col#14 col#0 col#1 col#12 col#3 col#4 ]
Allocated zp ZP_BYTE:2 [ col#14 col#0 col#1 col#12 col#3 col#4 ]
INITIAL ASM
//SEG0 File Comments
@ -331,16 +333,20 @@ irq: {
clc
adc #2
sta col
//SEG27 [12] phi from irq::@1 irq::@2 to irq::@return [phi:irq::@1/irq::@2->irq::@return]
breturn_from_b1:
breturn_from_b2:
//SEG28 [12] phi (byte) col#12 = (byte) col#3 [phi:irq::@1/irq::@2->irq::@return#0] -- register_copy
jmp breturn
//SEG27 irq::@return
//SEG29 irq::@return
breturn:
//SEG28 [12] return - exit interrupt(KERNEL_MIN)
//SEG30 [13] return - exit interrupt(KERNEL_MIN)
jmp $ea81
//SEG29 irq::@1
//SEG31 irq::@1
b1:
//SEG30 [13] (byte) col#3 ← ++ (byte) col#0 -- vbuz1=_inc_vbuz1
//SEG32 [14] (byte) col#3 ← ++ (byte) col#0 -- vbuz1=_inc_vbuz1
inc col
jmp breturn
jmp breturn_from_b1
}
REGISTER UPLIFT POTENTIAL REGISTERS
@ -351,19 +357,19 @@ Statement [7] (byte) col#1 ← (byte) 0 [ col#1 ] ( main:2 [ col#1 ] ) always cl
Statement asm { lda$dc0d } always clobbers reg byte a
Statement [9] *((const byte*) BGCOL#0) ← (byte) col#0 [ col#0 ] ( [ col#0 ] ) always clobbers reg byte a
Statement [10] if((byte) col#0!=(byte) 0) goto irq::@1 [ col#0 ] ( [ col#0 ] ) always clobbers reg byte a
Statement [11] (byte) col#4 ← (byte) col#0 + (byte) 2 [ ] ( [ ] ) always clobbers reg byte a
Potential registers zp ZP_BYTE:2 [ col#14 col#0 col#1 col#3 col#4 ] : zp ZP_BYTE:2 ,
Statement [11] (byte) col#4 ← (byte) col#0 + (byte) 2 [ col#4 ] ( [ col#4 ] ) always clobbers reg byte a
Potential registers zp ZP_BYTE:2 [ col#14 col#0 col#1 col#12 col#3 col#4 ] : zp ZP_BYTE:2 ,
REGISTER UPLIFT SCOPES
Uplift Scope [] 178: zp ZP_BYTE:2 [ col#14 col#0 col#1 col#3 col#4 ]
Uplift Scope [] 186: zp ZP_BYTE:2 [ col#14 col#0 col#1 col#12 col#3 col#4 ]
Uplift Scope [main]
Uplift Scope [irq]
Uplifting [] best 1834 combination zp ZP_BYTE:2 [ col#14 col#0 col#1 col#3 col#4 ]
Uplifting [] best 1834 combination zp ZP_BYTE:2 [ col#14 col#0 col#1 col#12 col#3 col#4 ]
Uplifting [main] best 1834 combination
Uplifting [irq] best 1834 combination
Attempting to uplift remaining variables inzp ZP_BYTE:2 [ col#14 col#0 col#1 col#3 col#4 ]
Uplifting [] best 1834 combination zp ZP_BYTE:2 [ col#14 col#0 col#1 col#3 col#4 ]
Attempting to uplift remaining variables inzp ZP_BYTE:2 [ col#14 col#0 col#1 col#12 col#3 col#4 ]
Uplifting [] best 1834 combination zp ZP_BYTE:2 [ col#14 col#0 col#1 col#12 col#3 col#4 ]
ASSEMBLER BEFORE OPTIMIZATION
//SEG0 File Comments
@ -446,16 +452,20 @@ irq: {
clc
adc #2
sta col
//SEG27 [12] phi from irq::@1 irq::@2 to irq::@return [phi:irq::@1/irq::@2->irq::@return]
breturn_from_b1:
breturn_from_b2:
//SEG28 [12] phi (byte) col#12 = (byte) col#3 [phi:irq::@1/irq::@2->irq::@return#0] -- register_copy
jmp breturn
//SEG27 irq::@return
//SEG29 irq::@return
breturn:
//SEG28 [12] return - exit interrupt(KERNEL_MIN)
//SEG30 [13] return - exit interrupt(KERNEL_MIN)
jmp $ea81
//SEG29 irq::@1
//SEG31 irq::@1
b1:
//SEG30 [13] (byte) col#3 ← ++ (byte) col#0 -- vbuz1=_inc_vbuz1
//SEG32 [14] (byte) col#3 ← ++ (byte) col#0 -- vbuz1=_inc_vbuz1
inc col
jmp breturn
jmp breturn_from_b1
}
ASSEMBLER OPTIMIZATIONS
@ -469,11 +479,14 @@ Removing instruction jmp breturn
Succesful ASM optimization Pass5NextJumpElimination
Replacing label b1 with b2
Replacing label b1_from_b2 with b2
Replacing label breturn_from_b1 with breturn
Removing instruction b1_from_bbegin:
Removing instruction bend_from_b1:
Removing instruction b1_from_main:
Removing instruction b1_from_b2:
Removing instruction b1:
Removing instruction breturn_from_b1:
Removing instruction breturn_from_b2:
Succesful ASM optimization Pass5RedundantLabelElimination
Removing instruction b1:
Removing instruction bend:
@ -507,9 +520,10 @@ FINAL SYMBOL TABLE
(byte) col
(byte) col#0 col zp ZP_BYTE:2 1.9999999999999998
(byte) col#1 col zp ZP_BYTE:2 22.0
(byte) col#12 col zp ZP_BYTE:2 40.0
(byte) col#14 col zp ZP_BYTE:2 114.0
(byte) col#3 col zp ZP_BYTE:2 20.0
(byte) col#4 col zp ZP_BYTE:2 20.0
(byte) col#3 col zp ZP_BYTE:2 4.0
(byte) col#4 col zp ZP_BYTE:2 4.0
interrupt(KERNEL_MIN)(void()) irq()
(label) irq::@1
(label) irq::@2
@ -519,7 +533,7 @@ interrupt(KERNEL_MIN)(void()) irq()
(label) main::@2
(label) main::@3
zp ZP_BYTE:2 [ col#14 col#0 col#1 col#3 col#4 ]
zp ZP_BYTE:2 [ col#14 col#0 col#1 col#12 col#3 col#4 ]
FINAL ASSEMBLER
@ -588,12 +602,14 @@ irq: {
clc
adc #2
sta col
//SEG27 irq::@return
//SEG28 [12] return - exit interrupt(KERNEL_MIN)
//SEG27 [12] phi from irq::@1 irq::@2 to irq::@return [phi:irq::@1/irq::@2->irq::@return]
//SEG28 [12] phi (byte) col#12 = (byte) col#3 [phi:irq::@1/irq::@2->irq::@return#0] -- register_copy
//SEG29 irq::@return
//SEG30 [13] return - exit interrupt(KERNEL_MIN)
jmp $ea81
//SEG29 irq::@1
//SEG31 irq::@1
b1:
//SEG30 [13] (byte) col#3 ← ++ (byte) col#0 -- vbuz1=_inc_vbuz1
//SEG32 [14] (byte) col#3 ← ++ (byte) col#0 -- vbuz1=_inc_vbuz1
inc col
jmp $ea81
}

View File

@ -8,9 +8,10 @@
(byte) col
(byte) col#0 col zp ZP_BYTE:2 1.9999999999999998
(byte) col#1 col zp ZP_BYTE:2 22.0
(byte) col#12 col zp ZP_BYTE:2 40.0
(byte) col#14 col zp ZP_BYTE:2 114.0
(byte) col#3 col zp ZP_BYTE:2 20.0
(byte) col#4 col zp ZP_BYTE:2 20.0
(byte) col#3 col zp ZP_BYTE:2 4.0
(byte) col#4 col zp ZP_BYTE:2 4.0
interrupt(KERNEL_MIN)(void()) irq()
(label) irq::@1
(label) irq::@2
@ -20,4 +21,4 @@ interrupt(KERNEL_MIN)(void()) irq()
(label) main::@2
(label) main::@3
zp ZP_BYTE:2 [ col#14 col#0 col#1 col#3 col#4 ]
zp ZP_BYTE:2 [ col#14 col#0 col#1 col#12 col#3 col#4 ]