1
0
mirror of https://gitlab.com/camelot/kickc.git synced 2024-06-26 19:30:00 +00:00

Cleaned up scope getters. Might have caused a slow-down of compilation.

This commit is contained in:
jespergravgaard 2020-04-09 22:17:33 +02:00
parent ab10bd59b4
commit 096d7c0640
33 changed files with 579 additions and 525 deletions

View File

@ -1,6 +1,9 @@
package dk.camelot64.kickc.model;
import dk.camelot64.kickc.model.symbols.*;
import dk.camelot64.kickc.model.symbols.Procedure;
import dk.camelot64.kickc.model.symbols.ProgramScope;
import dk.camelot64.kickc.model.symbols.Scope;
import dk.camelot64.kickc.model.symbols.Variable;
import dk.camelot64.kickc.model.types.SymbolType;
import dk.camelot64.kickc.model.values.ConstantInteger;
import dk.camelot64.kickc.model.values.ConstantRef;
@ -14,6 +17,22 @@ import java.util.Collections;
public class CallingConventionStack {
/** Prefix of the constant holding the stack offset for parameters/return value. */
public static final String OFFSET_STACK = "OFFSET_STACK_";
/** Name of the constant holding the stack offset for the return value. */
public static final String OFFSET_STACK_RETURN = OFFSET_STACK + "RETURN";
/**
* Get the name of the constant variable containing the (byte) offset of a specific parameter on the stack
*
* @param parameterName The name of the struct member
* @return The name of the constant
*/
private static String getParameterOffsetConstantName(String parameterName) {
return OFFSET_STACK + parameterName.toUpperCase();
}
/**
* Get the constant variable containing the (byte) index of the return value on the stack
*
@ -21,12 +40,11 @@ public class CallingConventionStack {
* @return The return value stack offset constant
*/
public static ConstantRef getReturnOffsetConstant(Procedure procedure) {
String returnOffsetConstantName = "OFFSET_STACK_RETURN";
Variable returnOffsetConstant = procedure.getConstant(returnOffsetConstantName);
Variable returnOffsetConstant = procedure.getLocalConstant(OFFSET_STACK_RETURN);
if(returnOffsetConstant == null) {
// Constant not found - create it
long returnByteOffset = getReturnByteOffset(procedure);
returnOffsetConstant = Variable.createConstant(returnOffsetConstantName, SymbolType.BYTE, procedure, null, new ConstantInteger(returnByteOffset & 0xff, SymbolType.BYTE), Scope.SEGMENT_DATA_DEFAULT);
returnOffsetConstant = Variable.createConstant(OFFSET_STACK_RETURN, SymbolType.BYTE, procedure, null, new ConstantInteger(returnByteOffset & 0xff, SymbolType.BYTE), Scope.SEGMENT_DATA_DEFAULT);
procedure.add(returnOffsetConstant);
}
return returnOffsetConstant.getConstantRef();
@ -41,7 +59,7 @@ public class CallingConventionStack {
*/
public static ConstantRef getParameterOffsetConstant(Procedure procedure, Variable parameter) {
String paramOffsetConstantName = getParameterOffsetConstantName(parameter.getName());
Variable paramOffsetConstant = procedure.getConstant(paramOffsetConstantName);
Variable paramOffsetConstant = procedure.getLocalConstant(paramOffsetConstantName);
if(paramOffsetConstant == null) {
// Constant not found - create it
long paramByteOffset = getParameterByteOffset(procedure, parameter);
@ -51,15 +69,6 @@ public class CallingConventionStack {
return paramOffsetConstant.getConstantRef();
}
/**
* Get the name of the constant variable containing the (byte) offset of a specific parameter on the stack
*
* @param parameterName The name of the struct member
* @return The name of the constant
*/
private static String getParameterOffsetConstantName(String parameterName) {
return "OFFSET_STACK_" + parameterName.toUpperCase();
}
/**
* Get the number of bytes that needed on the stack to pass parameters/return value to/from a procedure
@ -78,6 +87,7 @@ public class CallingConventionStack {
/**
* Get the number of bytes needed on the stack to store the parameters from a procedure
*
* @param procedure The procedure
* @return The byte size of parameters
*/

View File

@ -43,7 +43,7 @@ public class OperatorTypeId extends OperatorUnary {
*/
public static ConstantRef getTypeIdConstantVar(ProgramScope programScope, SymbolType type) {
String typeConstName = "TYPEID_" + getTypeIdConstantName(type);
Variable typeIdConstant = programScope.getConstant(typeConstName);
Variable typeIdConstant = programScope.getLocalConstant(typeConstName);
if(typeIdConstant == null) {
// Constant not found - create it
long typeSize = getTypeId(type);

View File

@ -96,7 +96,7 @@ public class Procedure extends Scope {
public List<Variable> getParameters() {
ArrayList<Variable> parameters = new ArrayList<>();
for(String name : parameterNames) {
parameters.add(this.getVariable(name));
parameters.add(this.getLocalVariable(name));
}
return parameters;
}

View File

@ -5,7 +5,11 @@ import dk.camelot64.kickc.model.LiveRangeEquivalenceClassSet;
import dk.camelot64.kickc.model.Program;
import dk.camelot64.kickc.model.types.SymbolType;
import dk.camelot64.kickc.model.types.SymbolTypeProgram;
import dk.camelot64.kickc.model.values.ScopeRef;
import dk.camelot64.kickc.model.values.*;
import java.util.Arrays;
import java.util.Deque;
import java.util.LinkedList;
/** The program scope containing the symbols of a program */
public class ProgramScope extends Scope {
@ -21,6 +25,60 @@ public class ProgramScope extends Scope {
}
/**
* Get a symbol from it's full name.
*
* @param fullName The full '::'-separated symbol name.
* @return The symbol. Null if not found.
*/
public Symbol getGlobalSymbol(String fullName) {
final Deque<String> names = new LinkedList<>(Arrays.asList(fullName.split("::")));
Scope scope = this;
while(names.size() > 1) {
final String localName = names.removeFirst();
scope = scope.getLocalScope(localName);
if(scope == null)
return null;
}
return scope.getLocalSymbol(names.removeFirst());
}
public Symbol getSymbol(SymbolRef symbolRef) {
return getProgramScope().getGlobalSymbol(symbolRef.getFullName());
}
public Variable getVar(SymbolVariableRef variableRef) {
return (Variable) getSymbol(variableRef);
}
public Variable getVariable(SymbolVariableRef variableRef) {
return (Variable) getSymbol(variableRef);
}
public Variable getConstant(ConstantRef constantRef) {
return (Variable) getSymbol(constantRef);
}
public Label getLabel(LabelRef labelRef) {
return (Label) getSymbol(labelRef);
}
public Procedure getLocalProcedure(String name) {
return (Procedure) getLocalSymbol(name);
}
public Procedure getProcedure(ProcedureRef procedureRef) {
return (Procedure) getSymbol(procedureRef);
}
public Scope getScope(ScopeRef scopeRef) {
if(scopeRef.getFullName().equals("")) {
// Special case for the outer program scope
return this;
}
return (Scope) getSymbol(scopeRef);
}
@Override
public String toString(Program program, boolean onlyVars) {
LiveRangeEquivalenceClassSet liveRangeEquivalenceClassSet = program.getLiveRangeEquivalenceClassSet();
@ -50,14 +108,16 @@ public class ProgramScope extends Scope {
/**
* Get information about the size of the program
*
* @return Size information
*/
public String getSizeInfo() {
StringBuilder sizeInfo = new StringBuilder();
sizeInfo.append("SIZE procedures "+ getAllProcedures(true).size()).append("\n");
sizeInfo.append("SIZE scopes "+ getAllScopes(true).size()).append("\n");
sizeInfo.append("SIZE variables "+ getAllVariables(true).size()).append("\n");
sizeInfo.append("SIZE constants "+ getAllConstants(true).size()).append("\n");
sizeInfo.append("SIZE procedures " + getAllProcedures(true).size()).append("\n");
sizeInfo.append("SIZE scopes " + getAllScopes(true).size()).append("\n");
sizeInfo.append("SIZE variables " + getAllVariables(true).size()).append("\n");
sizeInfo.append("SIZE constants " + getAllConstants(true).size()).append("\n");
return sizeInfo.toString();
}
}

View File

@ -3,7 +3,7 @@ package dk.camelot64.kickc.model.symbols;
import dk.camelot64.kickc.model.InternalError;
import dk.camelot64.kickc.model.*;
import dk.camelot64.kickc.model.types.SymbolType;
import dk.camelot64.kickc.model.values.*;
import dk.camelot64.kickc.model.values.ScopeRef;
import java.io.Serializable;
import java.util.*;
@ -73,6 +73,18 @@ public abstract class Scope implements Symbol, Serializable {
setFullName();
}
/**
* Get the top-level program scope.
*
* @return The top-level scope. Null if not found.
*/
public ProgramScope getProgramScope() {
if(this instanceof ProgramScope)
return (ProgramScope) this;
else
return parentScope.getProgramScope();
}
@Override
public abstract SymbolType getType();
@ -85,6 +97,11 @@ public abstract class Scope implements Symbol, Serializable {
}
}
public void remove(Symbol symbol) {
symbols.remove(symbol.getLocalName());
}
public <T extends Symbol> T add(T symbol) {
if(symbols.get(symbol.getLocalName()) != null) {
throw new CompileError("Symbol already declared " + symbol.getLocalName());
@ -93,15 +110,49 @@ public abstract class Scope implements Symbol, Serializable {
return symbol;
}
public void remove(Symbol symbol) {
symbols.remove(symbol.getLocalName());
}
public Variable addVariableIntermediate() {
String name = allocateIntermediateVariableName();
return add(Variable.createIntermediate(name, this, getSegmentData()));
}
public Label addLabel(String name) {
return add(new Label(name, this, false));
}
public Label addLabelIntermediate() {
String name = "@" + intermediateLabelCount++;
return add(new Label(name, this, true));
}
public BlockScope addBlockScope() {
String name = ":" + blockCount++;
return add(new BlockScope(name, this));
}
/**
* Add a struct definition.
* The name can be either defined in the program or an intermediate name.
*
* @param name The name of the struct definition
*/
public StructDefinition addStructDefinition(String name) {
return add(new StructDefinition(name, this));
}
public String allocateIntermediateVariableName() {
return "$" + intermediateVarCount++;
}
/**
* Set the value of the counter used to number intermediate labels
*
* @param intermediateLabelCount The new counter value
*/
public void setIntermediateLabelCount(int intermediateLabelCount) {
this.intermediateLabelCount = intermediateLabelCount;
}
/**
* Get all versions of a PHI-master variable
*
@ -121,73 +172,45 @@ public abstract class Scope implements Symbol, Serializable {
return versions;
}
public String allocateIntermediateVariableName() {
return "$" + intermediateVarCount++;
}
public Symbol getSymbol(SymbolRef symbolRef) {
return getSymbol(symbolRef.getFullName());
}
public Symbol getSymbol(String name) {
int pos = name.indexOf("::");
if(pos >= 0) {
String scopeName = name.substring(0, pos);
String rest = name.substring(pos + 2);
Symbol scopeSym = getSymbol(scopeName);
if(scopeSym instanceof Scope) {
return ((Scope) scopeSym).getSymbol(rest);
} else {
return null;
//throw new RuntimeException("Error looking up symbol " + name);
}
} else {
Symbol symbol = symbols.get(name);
if(symbol == null) {
if(parentScope != null) {
symbol = parentScope.getSymbol(name);
}
}
return symbol;
}
}
/**
* Get a local symbol by name. Does not search parent scopes.
*
* @param name The symbol name to look for
* @return The symbol if found. null otherwise.
*/
public Symbol getLocalSymbol(String name) {
return symbols.get(name);
}
public Variable getVar(String name) {
return (Variable) getSymbol(name);
/**
* Look for a symbol by it's (short) name. Looks through this scope first and then through any parent scope.
*
* @param name The symbol name
* @return The found symbol. Null is not found.
*/
public Symbol findSymbol(String name) {
Symbol symbol = symbols.get(name);
if(symbol == null) {
if(parentScope != null) {
symbol = parentScope.findSymbol(name);
}
}
return symbol;
}
public Variable getVar(SymbolVariableRef variableRef) {
return getVar(variableRef.getFullName());
}
public Variable getVariable(String name) {
Variable symbol = (Variable) getSymbol(name);
if(symbol != null && !symbol.isVariable())
public Variable findVariable(String name) {
final Symbol symbol = findSymbol(name);
if(symbol!=null && !(symbol instanceof Variable))
throw new InternalError("Symbol is not a variable! " + symbol.toString());
return symbol;
return (Variable) symbol;
}
public Variable getVariable(SymbolVariableRef variableRef) {
return getVariable(variableRef.getFullName());
}
public Variable getConstant(String name) {
Variable symbol = (Variable) getSymbol(name);
if(symbol != null && !symbol.isKindConstant())
throw new InternalError("Symbol is not a constant! " + symbol.toString());
return symbol;
}
public Variable getConstant(ConstantRef constantRef) {
return getConstant(constantRef.getFullName());
public Collection<Symbol> getAllSymbols() {
return symbols.values();
}
/**
* Get all variables/constants
* Get all variables/constants in the scope
*
* @param includeSubScopes true to include sub-scopes
* @return all variables/constants
@ -275,80 +298,60 @@ public abstract class Scope implements Symbol, Serializable {
return allSymbols;
}
public Label addLabel(String name) {
return add(new Label(name, this, false));
public Variable getLocalVar(String name) {
final Symbol symbol = getLocalSymbol(name);
if(symbol!=null && !(symbol instanceof Variable))
throw new InternalError("Symbol is not a variable! " + symbol.toString());
return (Variable) symbol;
}
public Label addLabelIntermediate() {
String name = "@" + intermediateLabelCount++;
return add(new Label(name, this, true));
public Variable getLocalVariable(String name) {
final Variable var = getLocalVar(name);
if(var != null && !var.isVariable())
throw new InternalError("Symbol is not a variable! " + var.toString());
return var;
}
public Label getLabel(String name) {
return (Label) getSymbol(name);
public Variable getLocalConstant(String name) {
final Variable var = getLocalVar(name);
if(var != null && !var.isKindConstant())
throw new InternalError("Symbol is not a constant! " + var.toString());
return var;
}
public Label getLabel(LabelRef labelRef) {
return (Label) getSymbol(labelRef);
public Label getLocalLabel(String name) {
final Symbol symbol = getLocalSymbol(name);
if(symbol!=null && !(symbol instanceof Label))
throw new InternalError("Symbol is not a label! " + symbol.toString());
return (Label) getLocalSymbol(name);
}
public BlockScope addBlockScope() {
String name = ":" + blockCount++;
return add(new BlockScope(name, this));
public BlockScope getLocalBlockScope(String name) {
final Symbol symbol = getLocalSymbol(name);
if(symbol!=null && !(symbol instanceof BlockScope))
throw new InternalError("Symbol is not a block scope! " + symbol.toString());
return (BlockScope) symbol;
}
public BlockScope getBlockScope(String name) {
return (BlockScope) getSymbol(name);
public StructDefinition getLocalStructDefinition(String name) {
final Symbol symbol = getLocalSymbol(name);
if(symbol!=null && !(symbol instanceof StructDefinition))
throw new InternalError("Symbol is not a struct definition! " + symbol.toString());
return (StructDefinition) symbol;
}
public Procedure addProcedure(String name, SymbolType type, String codeSegment, String dataSegment, Procedure.CallingConvention callingConvention) {
return add(new Procedure(name, type, this, codeSegment, dataSegment, callingConvention));
public EnumDefinition getLocalEnumDefinition(String name) {
final Symbol symbol = getLocalSymbol(name);
if(symbol!=null && !(symbol instanceof EnumDefinition))
throw new InternalError("Symbol is not an enum definition! " + symbol.toString());
return (EnumDefinition) symbol;
}
public Procedure getProcedure(String name) {
Symbol symbol = getSymbol(name);
if(symbol != null && symbol instanceof Procedure) {
return (Procedure) symbol;
} else {
return null;
}
}
/**
* Add a struct definition.
* The name can be either defined in the program or an intermediate name.
*
* @param name
*/
public StructDefinition addStructDefinition(String name) {
return add(new StructDefinition(name, this));
}
public StructDefinition getStructDefinition(String name) {
return (StructDefinition) getSymbol(name);
}
public EnumDefinition getEnumDefinition(String name) {
return (EnumDefinition) getSymbol(name);
}
public Scope getScope(ScopeRef scopeRef) {
if(scopeRef.getFullName().equals("") && this instanceof ProgramScope) {
// Special case for the outer program scope
return this;
}
Symbol symbol = getSymbol(scopeRef);
if(symbol instanceof Scope) {
return (Scope) symbol;
} else {
return null;
}
}
public Procedure getProcedure(ProcedureRef ref) {
return (Procedure) getSymbol(ref);
public Scope getLocalScope(String name) {
final Symbol symbol = getLocalSymbol(name);
if(symbol!=null && !(symbol instanceof Scope))
throw new InternalError("Symbol is not a scope! " + symbol.toString());
return (Scope) symbol;
}
public String toString(Program program, boolean onlyVars) {
@ -410,19 +413,6 @@ public abstract class Scope implements Symbol, Serializable {
return res.toString();
}
public Collection<Symbol> getAllSymbols() {
return symbols.values();
}
/**
* Set the value of the counter used to number intermediate labels
*
* @param intermediateLabelCount The new counter value
*/
public void setIntermediateLabelCount(int intermediateLabelCount) {
this.intermediateLabelCount = intermediateLabelCount;
}
@Override
public boolean equals(Object o) {
if(this == o) {

View File

@ -314,7 +314,7 @@ public class Variable implements Symbol {
throw new InternalError("Cannot get PHI-master for non-PHI-version variable " + this.toString());
String name = getName();
String versionOfName = name.substring(0, name.indexOf("#"));
return getScope().getVariable(versionOfName);
return getScope().getLocalVariable(versionOfName);
}
private Kind getKind() {

View File

@ -103,8 +103,8 @@ public class SymbolTypeInference {
SymbolType structType = inferType(symbols, structMemberRef.getStruct());
if(structType instanceof SymbolTypeStruct) {
String typeName = ((SymbolTypeStruct) structType).getStructTypeName();
StructDefinition structDefinition = symbols.getStructDefinition(typeName);
Variable structMember = structDefinition.getVar(structMemberRef.getMemberName());
StructDefinition structDefinition = symbols.getLocalStructDefinition(typeName);
Variable structMember = structDefinition.getLocalVar(structMemberRef.getMemberName());
return structMember.getType();
} else {
throw new CompileError("Dot applied to non-struct "+ structMemberRef.getStruct().toString());

View File

@ -33,7 +33,7 @@ public class SymbolTypeStruct implements SymbolType {
}
public StructDefinition getStructDefinition(ProgramScope programScope) {
return programScope.getStructDefinition(name);
return programScope.getLocalStructDefinition(name);
}
@Override

View File

@ -3,6 +3,8 @@ package dk.camelot64.kickc.model.values;
import dk.camelot64.kickc.model.Program;
import dk.camelot64.kickc.model.symbols.Symbol;
import java.util.Objects;
/** A reference to a symbol (variable, procedure or label) */
public class SymbolRef implements Value {
@ -34,10 +36,8 @@ public class SymbolRef implements Value {
if(o == null || getClass() != o.getClass()) {
return false;
}
SymbolRef symbolRef = (SymbolRef) o;
return fullName != null ? fullName.equals(symbolRef.fullName) : symbolRef.fullName == null;
return Objects.equals(fullName, symbolRef.fullName);
}
@Override
@ -50,15 +50,11 @@ public class SymbolRef implements Value {
if(program == null) {
return fullName;
} else {
try {
Symbol symbol = program.getScope().getSymbol(fullName);
if(symbol==null) {
return fullName+"(null)";
}
return symbol.toString(program);
} catch(NullPointerException e) {
throw e;
Symbol symbol = program.getScope().getGlobalSymbol(fullName);
if(symbol == null) {
return fullName + "(null)";
}
return symbol.toString(program);
}
}

View File

@ -470,7 +470,7 @@ public class Pass0GenerateStatementSequence extends KickCParserBaseVisitor<Objec
public Object visitAsmDirectiveUses(KickCParser.AsmDirectiveUsesContext ctx) {
String varName = ctx.NAME().getText();
SymbolRef variableRef;
Symbol symbol = getCurrentScope().getSymbol(varName);
Symbol symbol = getCurrentScope().findSymbol(varName);
if(symbol != null) {
//Found an existing variable
variableRef = symbol.getRef();
@ -1451,7 +1451,7 @@ public class Pass0GenerateStatementSequence extends KickCParserBaseVisitor<Objec
VariableBuilder varBuilder = new VariableBuilder(varName, blockScope, false, varType, null, varDecl.getEffectiveDirectives(), currentDataSegment, variableBuilderConfig);
lValue = varBuilder.build();
} else {
lValue = getCurrentScope().getVariable(varName);
lValue = getCurrentScope().findVariable(varName);
if(lValue == null) {
throw new CompileError("Error! Loop variable not declared " + varName, statementSource);
}
@ -1609,7 +1609,7 @@ public class Pass0GenerateStatementSequence extends KickCParserBaseVisitor<Objec
String label = ctxLabel.ASM_NAME().toString();
if(!definedLabels.contains(label)) {
// Look for the symbol
Symbol symbol = getCurrentScope().getSymbol(ctxLabel.ASM_NAME().getText());
Symbol symbol = getCurrentScope().findSymbol(ctxLabel.ASM_NAME().getText());
if(symbol != null) {
referenced.put(label, symbol.getRef());
} else {
@ -1652,11 +1652,11 @@ public class Pass0GenerateStatementSequence extends KickCParserBaseVisitor<Objec
if(exprCtx != null) {
PrePostModifierHandler.addPreModifiers(this, exprCtx, new StatementSource(ctx));
rValue = (RValue) this.visit(exprCtx);
Variable returnVar = procedure.getVariable("return");
Variable returnVar = procedure.getLocalVariable("return");
sequence.addStatement(new StatementAssignment((LValue) returnVar.getRef(), rValue, false, new StatementSource(ctx), ensureUnusedComments(getCommentsSymbol(ctx))));
PrePostModifierHandler.addPostModifiers(this, exprCtx, new StatementSource(ctx));
}
Label returnLabel = procedure.getLabel(SymbolRef.PROCEXIT_BLOCK_NAME);
Label returnLabel = procedure.getLocalLabel(SymbolRef.PROCEXIT_BLOCK_NAME);
sequence.addStatement(new StatementJump(returnLabel.getRef(), new StatementSource(ctx), ensureUnusedComments(getCommentsSymbol(ctx))));
return null;
}
@ -1703,7 +1703,7 @@ public class Pass0GenerateStatementSequence extends KickCParserBaseVisitor<Objec
@Override
public Object visitStructRef(KickCParser.StructRefContext ctx) {
String structDefName = ctx.NAME().getText();
StructDefinition structDefinition = getCurrentScope().getStructDefinition(structDefName);
StructDefinition structDefinition = program.getScope().getLocalStructDefinition(structDefName);
if(structDefinition == null) {
throw new CompileError("Unknown struct type " + structDefName, new StatementSource(ctx));
}
@ -1787,7 +1787,7 @@ public class Pass0GenerateStatementSequence extends KickCParserBaseVisitor<Objec
@Override
public Object visitEnumRef(KickCParser.EnumRefContext ctx) {
String enumDefName = ctx.NAME().getText();
EnumDefinition enumDefinition = getCurrentScope().getEnumDefinition(enumDefName);
EnumDefinition enumDefinition = program.getScope().getLocalEnumDefinition(enumDefName);
if(enumDefinition == null) {
throw new CompileError("Unknown enum " + enumDefName, new StatementSource(ctx));
}
@ -1798,7 +1798,7 @@ public class Pass0GenerateStatementSequence extends KickCParserBaseVisitor<Objec
@Override
public Object visitTypeNamedRef(KickCParser.TypeNamedRefContext ctx) {
Scope typeDefScope = program.getScope().getTypeDefScope();
Variable typeDefVariable = typeDefScope.getVar(ctx.getText());
Variable typeDefVariable = typeDefScope.getLocalVar(ctx.getText());
if(typeDefVariable != null) {
varDecl.setDeclType(typeDefVariable.getType());
@ -2371,7 +2371,7 @@ public class Pass0GenerateStatementSequence extends KickCParserBaseVisitor<Objec
@Override
public RValue visitExprId(KickCParser.ExprIdContext ctx) {
Symbol symbol = getCurrentScope().getSymbol(ctx.NAME().getText());
Symbol symbol = getCurrentScope().findSymbol(ctx.NAME().getText());
if(symbol instanceof Variable) {
Variable variable = (Variable) symbol;
return variable.getRef();

View File

@ -85,7 +85,7 @@ public class Pass1AssertUsedVars extends Pass1Base {
StatementCall call = (StatementCall) statement;
Procedure procedure = getProgram().getScope().getProcedure(call.getProcedure());
for(String paramName : procedure.getParameterNames()) {
defined.add(procedure.getVariable(paramName).getRef());
defined.add(procedure.getLocalVariable(paramName).getRef());
}
ControlFlowBlock procedureStart = getProgram().getGraph().getBlock(call.getProcedure().getLabelRef());
assertUsedVars(procedureStart, block.getLabel(), referenceInfos, defined, visited);
@ -93,7 +93,7 @@ public class Pass1AssertUsedVars extends Pass1Base {
StatementCallPrepare call = (StatementCallPrepare) statement;
Procedure procedure = getProgram().getScope().getProcedure(call.getProcedure());
for(String paramName : procedure.getParameterNames()) {
defined.add(procedure.getVariable(paramName).getRef());
defined.add(procedure.getLocalVariable(paramName).getRef());
}
} else if(statement instanceof StatementCallExecute) {
StatementCallExecute call = (StatementCallExecute) statement;

View File

@ -109,7 +109,7 @@ public class Pass1CallPhiParameters {
call.setParameters(null);
// Update call LValue (call finalize)
Variable procReturnVar = procedure.getVariable("return");
Variable procReturnVar = procedure.getLocalVariable("return");
LValue procReturnVarRef = null;
if(procReturnVar != null) {
procReturnVarRef = (LValue) procReturnVar.getRef();

View File

@ -64,7 +64,7 @@ public class Pass1CallPhiReturn {
// Generate return value assignment (call finalize)
if(!SymbolType.VOID.equals(procedure.getReturnType())) {
// Find return variable final version
Label returnBlockLabel = procedure.getLabel(SymbolRef.PROCEXIT_BLOCK_NAME);
Label returnBlockLabel = procedure.getLocalLabel(SymbolRef.PROCEXIT_BLOCK_NAME);
ControlFlowBlock returnBlock = program.getGraph().getBlock(returnBlockLabel.getRef());
RValue returnVarFinal = null;
for(Statement statement : returnBlock.getStatements()) {

View File

@ -72,7 +72,7 @@ public class Pass1ExtractInlineStrings extends Pass1Base {
} else {
int nameHintIdx = 1;
name = nameHint;
while(blockScope.getSymbol(name) != null) {
while(blockScope.getLocalSymbol(name) != null) {
name = nameHint + nameHintIdx++;
}
}

View File

@ -81,10 +81,10 @@ public class Pass1ProcedureInline extends Pass1Base {
Symbol procBlockLabel = getScope().getSymbol(procBlockLabelRef);
Label inlinedBlockLabel;
if(procedure.equals(procBlockLabel)) {
inlinedBlockLabel = callScope.getLabel(procedure.getLocalName() + serial);
inlinedBlockLabel = callScope.getLocalLabel(procedure.getLocalName() + serial);
} else {
String inlinedBlockLabelName = getInlineSymbolName(procedure, procBlockLabel, serial);
inlinedBlockLabel = callScope.getLabel(inlinedBlockLabelName);
inlinedBlockLabel = callScope.getLocalLabel(inlinedBlockLabelName);
}
ControlFlowBlock inlineBlock = new ControlFlowBlock(inlinedBlockLabel.getRef(), callScope.getRef());
blocksIt.add(inlineBlock);
@ -111,9 +111,9 @@ public class Pass1ProcedureInline extends Pass1Base {
blocksIt.add(restBlock);
// Generate return assignment
if(!procedure.getReturnType().equals(SymbolType.VOID)) {
Variable procReturnVar = procedure.getVariable("return");
Variable procReturnVar = procedure.getLocalVariable("return");
String inlinedReturnVarName = getInlineSymbolName(procedure, procReturnVar, serial);
Variable inlinedReturnVar = callScope.getVariable(inlinedReturnVarName);
Variable inlinedReturnVar = callScope.getLocalVariable(inlinedReturnVarName);
restBlock.addStatement(new StatementAssignment(call.getlValue(), inlinedReturnVar.getRef(), false, call.getSource(), Comment.NO_COMMENTS));
} else {
// Remove the tmp var receiving the result
@ -133,7 +133,7 @@ public class Pass1ProcedureInline extends Pass1Base {
restBlock.setDefaultSuccessor(block.getDefaultSuccessor());
restBlock.setConditionalSuccessor(block.getConditionalSuccessor());
// Set default successor to the original block to the inlined procedure block
Label inlinedProcLabel = callScope.getLabel(procedure.getLocalName() + serial);
Label inlinedProcLabel = callScope.getLocalLabel(procedure.getLocalName() + serial);
block.setDefaultSuccessor(inlinedProcLabel.getRef());
// Set conditional successor of original block to null (as any condition has been moved to the rest block)
block.setConditionalSuccessor(null);
@ -149,7 +149,7 @@ public class Pass1ProcedureInline extends Pass1Base {
} else {
Label procBlockSuccessor = getScope().getLabel(procBlockSuccessorRef);
String inlinedSuccessorName = getInlineSymbolName(procedure, procBlockSuccessor, serial);
Label inlinedSuccessorLabel = callScope.getLabel(inlinedSuccessorName);
Label inlinedSuccessorLabel = callScope.getLocalLabel(inlinedSuccessorName);
inlinedSuccessor = inlinedSuccessorLabel.getRef();
}
return inlinedSuccessor;
@ -169,7 +169,7 @@ public class Pass1ProcedureInline extends Pass1Base {
int serial = 1;
while(true) {
String localName = procedure.getLocalName() + serial;
if(callScope.getLabel(localName) == null) {
if(callScope.getLocalLabel(localName) == null) {
return serial;
}
serial++;
@ -206,7 +206,7 @@ public class Pass1ProcedureInline extends Pass1Base {
Label inlinedDest = procDestination;
if(procDestination.getScope().equals(procedure)) {
String inlineSymbolName = getInlineSymbolName(procedure, procDestination, serial);
inlinedDest = callScope.getLabel(inlineSymbolName);
inlinedDest = callScope.getLocalLabel(inlineSymbolName);
}
StatementConditionalJump inlinedConditionalJump = new StatementConditionalJump(procConditional.getrValue1(), procConditional.getOperator(), procConditional.getrValue2(), inlinedDest.getRef(), procConditional.getSource(), Comment.NO_COMMENTS);
inlinedConditionalJump.setDeclaredUnroll(procConditional.isDeclaredUnroll());
@ -250,7 +250,7 @@ public class Pass1ProcedureInline extends Pass1Base {
Variable procVar = Pass1ProcedureInline.this.getScope().getVariable(procVarRef);
if(procVar.getScope().equals(procedure)) {
String inlineSymbolName = Pass1ProcedureInline.this.getInlineSymbolName(procedure, procVar, serial);
Variable inlineVar = callScope.getVariable(inlineSymbolName);
Variable inlineVar = callScope.getLocalVariable(inlineSymbolName);
programValue.set(inlineVar.getRef());
}
} else if(rValue instanceof PointerDereferenceSimple) {
@ -280,7 +280,7 @@ public class Pass1ProcedureInline extends Pass1Base {
for(int i = 0; i < parameterDecls.size(); i++) {
Variable parameterDecl = parameterDecls.get(i);
String inlineParameterVarName = getInlineSymbolName(procedure, parameterDecl, serial);
Variable inlineParameterVar = callScope.getVariable(inlineParameterVarName);
Variable inlineParameterVar = callScope.getLocalVariable(inlineParameterVarName);
RValue parameterValue = parameterValues.get(i);
statementsIt.add(new StatementAssignment((VariableRef)inlineParameterVar.getRef(), parameterValue, true, call.getSource(), Comment.NO_COMMENTS));
}

View File

@ -24,8 +24,7 @@ public class Pass1Procedures extends Pass2SsaOptimization {
if(statement instanceof StatementCall) {
StatementCall call = (StatementCall) statement;
String procedureName = call.getProcedureName();
Scope currentScope = getScope().getScope(block.getScope());
Procedure procedure = currentScope.getProcedure(procedureName);
Procedure procedure = getScope().getLocalProcedure(procedureName);
if(procedure == null) {
throw new CompileError("Called procedure not found. " + call.toString(getProgram(), false), statement.getSource());
}

View File

@ -23,7 +23,7 @@ public class Pass1ResolveForwardReferences extends Pass1Base {
if(rValue instanceof ForwardVariableRef) {
String varName = ((ForwardVariableRef) rValue).getName();
Scope currentScope = getScope().getScope(currentBlock.getScope());
Symbol symbol = currentScope.getSymbol(varName);
Symbol symbol = currentScope.findSymbol(varName);
if(symbol!=null) {
getLog().append("Resolved forward reference " + varName+" to "+symbol.toString(getProgram()));
programValue.set(symbol.getRef());

View File

@ -34,7 +34,7 @@ public class Pass2AssertSymbols extends Pass2SsaAssertion {
// Check that all symbols found in the code is also in the symbol table
for(Symbol codeSymbol : codeSymbols) {
if(codeSymbol.getFullName().equals(SymbolRef.PROCEXIT_BLOCK_NAME)) continue;
Symbol tableSymbol = getScope().getSymbol(codeSymbol.getFullName());
Symbol tableSymbol = getScope().getSymbol(codeSymbol.getRef());
if(tableSymbol == null) {
throw new AssertionFailed("Compile process error. Symbol found in code, but not in symbol table. " + codeSymbol.getFullName());
}

View File

@ -117,7 +117,7 @@ public class Pass2ConstantStringConsolidation extends Pass2SsaOptimization {
for(Variable constantVar : constantVars) {
if(!constantVar.getRef().isIntermediate()) {
String candidateName = constantVar.getLocalName();
if(getScope().getSymbol(candidateName) == null) {
if(getScope().getLocalSymbol(candidateName) == null) {
if(constName == null || constName.length() > candidateName.length()) {
constName = candidateName;
}
@ -131,7 +131,7 @@ public class Pass2ConstantStringConsolidation extends Pass2SsaOptimization {
int i = 0;
do {
String candidateName = "string_" + i;
if(getScope().getSymbol(candidateName) == null) {
if(getScope().getLocalSymbol(candidateName) == null) {
return candidateName;
}
} while(true);

View File

@ -122,7 +122,7 @@ public abstract class Pass2SsaOptimization extends Pass1Base implements PassStep
public static void deleteSymbols(ProgramScope programScope, Collection<? extends SymbolRef> symbols) {
for(SymbolRef symbolRef : symbols) {
Symbol symbol = programScope.getSymbol(symbolRef.getFullName());
Symbol symbol = programScope.getSymbol(symbolRef);
symbol.getScope().remove(symbol);
}
}

View File

@ -862,7 +862,7 @@ public class Pass4CodeGeneration {
Procedure procedure = null;
ScopeRef scope = block.getScope();
if(!scope.equals(ScopeRef.ROOT)) {
procedure = getScope().getProcedure(scope.getFullName());
procedure = getScope().getProcedure((ProcedureRef) scope);
}
if(procedure == null || procedure.getInterruptType() == null) {
asm.addInstruction("rts", AsmAddressingMode.NON, null, false);

View File

@ -112,7 +112,7 @@ public abstract class Pass4MemoryCoalesce extends Pass2Base {
Variable variable = program.getScope().getVariable(varRef);
ScopeRef scopeRef = variable.getScope().getRef();
if(scopeRef.equals(ScopeRef.ROOT)) {
ProcedureRef mainThreadHead = program.getScope().getProcedure(SymbolRef.MAIN_PROC_NAME).getRef();
ProcedureRef mainThreadHead = program.getScope().getLocalProcedure(SymbolRef.MAIN_PROC_NAME).getRef();
if(!threads.contains(mainThreadHead)) {
threads.add(mainThreadHead);
}

View File

@ -113,8 +113,7 @@ public class Pass4RegisterUpliftStatic extends Pass2Base {
private void setRegister(RegisterCombination combination, String varFullName, Registers.Register register) {
LiveRangeEquivalenceClassSet equivalenceClassSet = getProgram().getLiveRangeEquivalenceClassSet();
ProgramScope scope = getProgram().getScope();
SymbolVariableRef variableRef = scope.getVariable(varFullName).getRef();
SymbolVariableRef variableRef = (SymbolVariableRef) getProgram().getScope().getGlobalSymbol(varFullName).getRef();
LiveRangeEquivalenceClass equivalenceClass = equivalenceClassSet.getEquivalenceClass((VariableRef) variableRef);
combination.setRegister(equivalenceClass, register);
}
@ -122,9 +121,9 @@ public class Pass4RegisterUpliftStatic extends Pass2Base {
private void collapseEquivalenceClasses(String varFullName1, String varFullName2) {
LiveRangeEquivalenceClassSet equivalenceClassSet = getProgram().getLiveRangeEquivalenceClassSet();
ProgramScope scope = getProgram().getScope();
SymbolVariableRef variableRef1 = scope.getVariable(varFullName1).getRef();
SymbolVariableRef variableRef1 = (SymbolVariableRef) scope.getGlobalSymbol(varFullName1).getRef();
LiveRangeEquivalenceClass equivalenceClass1 = equivalenceClassSet.getEquivalenceClass((VariableRef) variableRef1);
SymbolVariableRef variableRef2 = scope.getVariable(varFullName2).getRef();
SymbolVariableRef variableRef2 = (SymbolVariableRef) scope.getGlobalSymbol(varFullName2).getRef();
LiveRangeEquivalenceClass equivalenceClass2 = equivalenceClassSet.getEquivalenceClass((VariableRef) variableRef2);
if(!equivalenceClass1.equals(equivalenceClass2)) {
equivalenceClassSet.consolidate(equivalenceClass1, equivalenceClass2);

View File

@ -22,7 +22,7 @@ public class SizeOfConstants {
*/
public static ConstantRef getSizeOfConstantVar(ProgramScope programScope, SymbolType type) {
String typeConstName = getSizeofConstantName(type);
Variable typeSizeConstant = programScope.getConstant(typeConstName);
Variable typeSizeConstant = programScope.getLocalConstant(typeConstName);
if(typeSizeConstant == null) {
// Constant not found - create it
long typeSize = type.getSizeBytes();
@ -40,7 +40,7 @@ public class SizeOfConstants {
*/
public static void fixSizeOfConstantVar(ProgramScope programScope, SymbolType type) {
String typeConstName = getSizeofConstantName(type);
Variable typeSizeConstant = programScope.getConstant(typeConstName);
Variable typeSizeConstant = programScope.getLocalConstant(typeConstName);
if(typeSizeConstant != null) {
// Constant found - update it
long typeSize = type.getSizeBytes();
@ -72,7 +72,7 @@ public class SizeOfConstants {
*/
public static ConstantRef getStructMemberOffsetConstant(ProgramScope programScope, StructDefinition structDefinition, String memberName) {
String typeConstName = getStructMemberOffsetConstantName(structDefinition, memberName);
Variable memberOffsetConstant = programScope.getConstant(typeConstName);
Variable memberOffsetConstant = programScope.getLocalConstant(typeConstName);
if(memberOffsetConstant == null) {
// Constant not found - create it
Variable memberDef = structDefinition.getMember(memberName);

View File

@ -267,7 +267,7 @@ public class Unroller {
String unrollLabelName;
do {
unrollLabelName = localName + "_" + unrollSerial++;
} while(blockScope.getLabel(unrollLabelName) != null);
} while(blockScope.getLocalLabel(unrollLabelName) != null);
// Create a label
Label unrollLabel = blockScope.addLabel(unrollLabelName);
blockToNewBlock.put(block.getLabel(), unrollLabel.getRef());

View File

@ -89,7 +89,7 @@ __bbegin:
jsr main
rts
main: {
.const toSpritePtr2_return = SIN_SPRITE/$40
.const toSpritePtr1_return = SIN_SPRITE/$40
.const vicSelectGfxBank1_toDd001_return = 3
.const toD0181_return = (>(PLAYFIELD_SCREEN_1&$3fff)*4)|(>PLAYFIELD_CHARSET)/4&$f
.label xpos = 3
@ -131,7 +131,7 @@ main: {
// SPRITES_COLS[s] = s-3
sta SPRITES_COLS,y
// PLAYFIELD_SPRITE_PTRS_1[s] = toSpritePtr(SIN_SPRITE)
lda #toSpritePtr2_return
lda #toSpritePtr1_return
sta PLAYFIELD_SPRITE_PTRS_1,y
// xpos += 24
lax.z xpos
@ -271,7 +271,7 @@ sprites_init: {
// Repeats 10 timers every 2 lines from line IRQ_RASTER_FIRST
// Utilizes duplicated gfx in the sprites to allow for some leeway in updating the sprite pointers
sprites_irq: {
.const toSpritePtr2_return = PLAYFIELD_SPRITES/$40
.const toSpritePtr1_return = PLAYFIELD_SPRITES/$40
.label raster_sprite_gfx_modify = $a
sta rega+1
stx regx+1
@ -384,7 +384,7 @@ sprites_irq: {
lda #SPRITES_FIRST_YPOS
sta.z irq_sprite_ypos
// irq_sprite_ptr = toSpritePtr(PLAYFIELD_SPRITES)
lda #toSpritePtr2_return
lda #toSpritePtr1_return
sta.z irq_sprite_ptr
jmp __b5
__b1:

View File

@ -73,12 +73,12 @@ main::@1: scope:[main] from main::@4 main::@5
[23] *((const nomodify byte*) SPRITES_YPOS + (byte) main::s2#0) ← (byte) main::ypos#2
[24] (byte~) main::$6 ← (byte) main::s#2 - (byte) 3
[25] *((const nomodify byte*) SPRITES_COLS + (byte) main::s#2) ← (byte~) main::$6
to:main::toSpritePtr2
main::toSpritePtr2: scope:[main] from main::@1
to:main::toSpritePtr1
main::toSpritePtr1: scope:[main] from main::@1
[26] phi()
to:main::@4
main::@4: scope:[main] from main::toSpritePtr2
[27] *((const nomodify byte*) PLAYFIELD_SPRITE_PTRS_1 + (byte) main::s#2) ← (const byte) main::toSpritePtr2_return#0
main::@4: scope:[main] from main::toSpritePtr1
[27] *((const nomodify byte*) PLAYFIELD_SPRITE_PTRS_1 + (byte) main::s#2) ← (const byte) main::toSpritePtr1_return#0
[28] (byte) main::xpos#1 ← (byte) main::xpos#2 + (byte) $18
[29] (byte) main::ypos#1 ← (byte) main::ypos#2 + (byte) $18
[30] (byte) main::s#1 ← ++ (byte) main::s#2
@ -215,12 +215,12 @@ sprites_irq::@4: scope:[sprites_irq] from sprites_irq::@6
sprites_irq::@3: scope:[sprites_irq] from sprites_irq::@2
[102] (volatile byte) irq_raster_next ← (volatile byte) irq_raster_next + (byte) $15
[103] (volatile byte) irq_sprite_ypos ← (const nomodify byte) SPRITES_FIRST_YPOS
to:sprites_irq::toSpritePtr2
sprites_irq::toSpritePtr2: scope:[sprites_irq] from sprites_irq::@3
to:sprites_irq::toSpritePtr1
sprites_irq::toSpritePtr1: scope:[sprites_irq] from sprites_irq::@3
[104] phi()
to:sprites_irq::@11
sprites_irq::@11: scope:[sprites_irq] from sprites_irq::toSpritePtr2
[105] (volatile byte) irq_sprite_ptr ← (const byte) sprites_irq::toSpritePtr2_return#0
sprites_irq::@11: scope:[sprites_irq] from sprites_irq::toSpritePtr1
[105] (volatile byte) irq_sprite_ptr ← (const byte) sprites_irq::toSpritePtr1_return#0
to:sprites_irq::@5
sprites_irq::@1: scope:[sprites_irq] from sprites_irq::@9
[106] *((const nomodify byte*) PLAYFIELD_SPRITE_PTRS_1) ← (byte) sprites_irq::ptr#0

View File

@ -24,14 +24,14 @@ Culled Empty Block (label) sprites_init::@2
Culled Empty Block (label) toSpritePtr1_@1
Culled Empty Block (label) @6
Culled Empty Block (label) sprites_irq::@14
Culled Empty Block (label) sprites_irq::toSpritePtr2_@1
Culled Empty Block (label) sprites_irq::toSpritePtr1_@1
Culled Empty Block (label) sprites_irq::@5
Culled Empty Block (label) sprites_irq::@9
Culled Empty Block (label) sprites_irq::@10
Culled Empty Block (label) main::vicSelectGfxBank1_toDd001_@1
Culled Empty Block (label) main::vicSelectGfxBank1_@return
Culled Empty Block (label) main::toD0181_@1
Culled Empty Block (label) main::toSpritePtr2_@1
Culled Empty Block (label) main::toSpritePtr1_@1
Culled Empty Block (label) @8
Culled Empty Block (label) loop::@2
Culled Empty Block (label) loop::@9
@ -174,22 +174,22 @@ sprites_irq::@2: scope:[sprites_irq] from sprites_irq::@1 sprites_irq::@13
sprites_irq::@3: scope:[sprites_irq] from sprites_irq::@2
(volatile byte) irq_raster_next ← (volatile byte) irq_raster_next + (number) $15
(volatile byte) irq_sprite_ypos ← (const nomodify byte) SPRITES_FIRST_YPOS
(byte*) sprites_irq::toSpritePtr2_sprite#0 ← (const nomodify byte*) PLAYFIELD_SPRITES
to:sprites_irq::toSpritePtr2
sprites_irq::toSpritePtr2: scope:[sprites_irq] from sprites_irq::@3
(byte*) sprites_irq::toSpritePtr2_sprite#1 ← phi( sprites_irq::@3/(byte*) sprites_irq::toSpritePtr2_sprite#0 )
(word~) sprites_irq::toSpritePtr2_$0 ← ((word)) (byte*) sprites_irq::toSpritePtr2_sprite#1
(number~) sprites_irq::toSpritePtr2_$1 ← (word~) sprites_irq::toSpritePtr2_$0 / (number) $40
(byte~) sprites_irq::toSpritePtr2_$2 ← ((byte)) (number~) sprites_irq::toSpritePtr2_$1
(byte) sprites_irq::toSpritePtr2_return#0 ← (byte~) sprites_irq::toSpritePtr2_$2
to:sprites_irq::toSpritePtr2_@return
sprites_irq::toSpritePtr2_@return: scope:[sprites_irq] from sprites_irq::toSpritePtr2
(byte) sprites_irq::toSpritePtr2_return#2 ← phi( sprites_irq::toSpritePtr2/(byte) sprites_irq::toSpritePtr2_return#0 )
(byte) sprites_irq::toSpritePtr2_return#1 ← (byte) sprites_irq::toSpritePtr2_return#2
(byte*) sprites_irq::toSpritePtr1_sprite#0 ← (const nomodify byte*) PLAYFIELD_SPRITES
to:sprites_irq::toSpritePtr1
sprites_irq::toSpritePtr1: scope:[sprites_irq] from sprites_irq::@3
(byte*) sprites_irq::toSpritePtr1_sprite#1 ← phi( sprites_irq::@3/(byte*) sprites_irq::toSpritePtr1_sprite#0 )
(word~) sprites_irq::toSpritePtr1_$0 ← ((word)) (byte*) sprites_irq::toSpritePtr1_sprite#1
(number~) sprites_irq::toSpritePtr1_$1 ← (word~) sprites_irq::toSpritePtr1_$0 / (number) $40
(byte~) sprites_irq::toSpritePtr1_$2 ← ((byte)) (number~) sprites_irq::toSpritePtr1_$1
(byte) sprites_irq::toSpritePtr1_return#0 ← (byte~) sprites_irq::toSpritePtr1_$2
to:sprites_irq::toSpritePtr1_@return
sprites_irq::toSpritePtr1_@return: scope:[sprites_irq] from sprites_irq::toSpritePtr1
(byte) sprites_irq::toSpritePtr1_return#2 ← phi( sprites_irq::toSpritePtr1/(byte) sprites_irq::toSpritePtr1_return#0 )
(byte) sprites_irq::toSpritePtr1_return#1 ← (byte) sprites_irq::toSpritePtr1_return#2
to:sprites_irq::@15
sprites_irq::@15: scope:[sprites_irq] from sprites_irq::toSpritePtr2_@return
(byte) sprites_irq::toSpritePtr2_return#3 ← phi( sprites_irq::toSpritePtr2_@return/(byte) sprites_irq::toSpritePtr2_return#1 )
(byte~) sprites_irq::$5 ← (byte) sprites_irq::toSpritePtr2_return#3
sprites_irq::@15: scope:[sprites_irq] from sprites_irq::toSpritePtr1_@return
(byte) sprites_irq::toSpritePtr1_return#3 ← phi( sprites_irq::toSpritePtr1_@return/(byte) sprites_irq::toSpritePtr1_return#1 )
(byte~) sprites_irq::$5 ← (byte) sprites_irq::toSpritePtr1_return#3
(volatile byte) irq_sprite_ptr ← (byte~) sprites_irq::$5
to:sprites_irq::@6
sprites_irq::@7: scope:[sprites_irq] from sprites_irq::@2
@ -301,34 +301,34 @@ main::@1: scope:[main] from main::@5 main::@6
*((const nomodify byte*) SPRITES_YPOS + (byte) main::s2#0) ← (byte) main::ypos#2
(number~) main::$6 ← (byte) main::s#2 - (number) 3
*((const nomodify byte*) SPRITES_COLS + (byte) main::s#2) ← (number~) main::$6
(byte*) main::toSpritePtr2_sprite#0 ← (const byte*) SIN_SPRITE
to:main::toSpritePtr2
main::toSpritePtr2: scope:[main] from main::@1
(byte*) main::toSpritePtr1_sprite#0 ← (const byte*) SIN_SPRITE
to:main::toSpritePtr1
main::toSpritePtr1: scope:[main] from main::@1
(byte) sin_idx#21 ← phi( main::@1/(byte) sin_idx#22 )
(byte) main::ypos#5 ← phi( main::@1/(byte) main::ypos#2 )
(byte) main::xpos#5 ← phi( main::@1/(byte) main::xpos#2 )
(byte) main::s#5 ← phi( main::@1/(byte) main::s#2 )
(byte*) main::toSpritePtr2_sprite#1 ← phi( main::@1/(byte*) main::toSpritePtr2_sprite#0 )
(word~) main::toSpritePtr2_$0 ← ((word)) (byte*) main::toSpritePtr2_sprite#1
(number~) main::toSpritePtr2_$1 ← (word~) main::toSpritePtr2_$0 / (number) $40
(byte~) main::toSpritePtr2_$2 ← ((byte)) (number~) main::toSpritePtr2_$1
(byte) main::toSpritePtr2_return#0 ← (byte~) main::toSpritePtr2_$2
to:main::toSpritePtr2_@return
main::toSpritePtr2_@return: scope:[main] from main::toSpritePtr2
(byte) sin_idx#20 ← phi( main::toSpritePtr2/(byte) sin_idx#21 )
(byte) main::ypos#4 ← phi( main::toSpritePtr2/(byte) main::ypos#5 )
(byte) main::xpos#4 ← phi( main::toSpritePtr2/(byte) main::xpos#5 )
(byte) main::s#4 ← phi( main::toSpritePtr2/(byte) main::s#5 )
(byte) main::toSpritePtr2_return#2 ← phi( main::toSpritePtr2/(byte) main::toSpritePtr2_return#0 )
(byte) main::toSpritePtr2_return#1 ← (byte) main::toSpritePtr2_return#2
(byte*) main::toSpritePtr1_sprite#1 ← phi( main::@1/(byte*) main::toSpritePtr1_sprite#0 )
(word~) main::toSpritePtr1_$0 ← ((word)) (byte*) main::toSpritePtr1_sprite#1
(number~) main::toSpritePtr1_$1 ← (word~) main::toSpritePtr1_$0 / (number) $40
(byte~) main::toSpritePtr1_$2 ← ((byte)) (number~) main::toSpritePtr1_$1
(byte) main::toSpritePtr1_return#0 ← (byte~) main::toSpritePtr1_$2
to:main::toSpritePtr1_@return
main::toSpritePtr1_@return: scope:[main] from main::toSpritePtr1
(byte) sin_idx#20 ← phi( main::toSpritePtr1/(byte) sin_idx#21 )
(byte) main::ypos#4 ← phi( main::toSpritePtr1/(byte) main::ypos#5 )
(byte) main::xpos#4 ← phi( main::toSpritePtr1/(byte) main::xpos#5 )
(byte) main::s#4 ← phi( main::toSpritePtr1/(byte) main::s#5 )
(byte) main::toSpritePtr1_return#2 ← phi( main::toSpritePtr1/(byte) main::toSpritePtr1_return#0 )
(byte) main::toSpritePtr1_return#1 ← (byte) main::toSpritePtr1_return#2
to:main::@5
main::@5: scope:[main] from main::toSpritePtr2_@return
(byte) sin_idx#19 ← phi( main::toSpritePtr2_@return/(byte) sin_idx#20 )
(byte) main::ypos#3 ← phi( main::toSpritePtr2_@return/(byte) main::ypos#4 )
(byte) main::xpos#3 ← phi( main::toSpritePtr2_@return/(byte) main::xpos#4 )
(byte) main::s#3 ← phi( main::toSpritePtr2_@return/(byte) main::s#4 )
(byte) main::toSpritePtr2_return#3 ← phi( main::toSpritePtr2_@return/(byte) main::toSpritePtr2_return#1 )
(byte~) main::$7 ← (byte) main::toSpritePtr2_return#3
main::@5: scope:[main] from main::toSpritePtr1_@return
(byte) sin_idx#19 ← phi( main::toSpritePtr1_@return/(byte) sin_idx#20 )
(byte) main::ypos#3 ← phi( main::toSpritePtr1_@return/(byte) main::ypos#4 )
(byte) main::xpos#3 ← phi( main::toSpritePtr1_@return/(byte) main::xpos#4 )
(byte) main::s#3 ← phi( main::toSpritePtr1_@return/(byte) main::s#4 )
(byte) main::toSpritePtr1_return#3 ← phi( main::toSpritePtr1_@return/(byte) main::toSpritePtr1_return#1 )
(byte~) main::$7 ← (byte) main::toSpritePtr1_return#3
*((const nomodify byte*) PLAYFIELD_SPRITE_PTRS_1 + (byte) main::s#3) ← (byte~) main::$7
(byte) main::xpos#1 ← (byte) main::xpos#3 + (number) $18
(byte) main::ypos#1 ← (byte) main::ypos#3 + (number) $18
@ -519,19 +519,19 @@ SYMBOL TABLE SSA
(byte*) main::toD0181_screen
(byte*) main::toD0181_screen#0
(byte*) main::toD0181_screen#1
(label) main::toSpritePtr2
(word~) main::toSpritePtr2_$0
(number~) main::toSpritePtr2_$1
(byte~) main::toSpritePtr2_$2
(label) main::toSpritePtr2_@return
(byte) main::toSpritePtr2_return
(byte) main::toSpritePtr2_return#0
(byte) main::toSpritePtr2_return#1
(byte) main::toSpritePtr2_return#2
(byte) main::toSpritePtr2_return#3
(byte*) main::toSpritePtr2_sprite
(byte*) main::toSpritePtr2_sprite#0
(byte*) main::toSpritePtr2_sprite#1
(label) main::toSpritePtr1
(word~) main::toSpritePtr1_$0
(number~) main::toSpritePtr1_$1
(byte~) main::toSpritePtr1_$2
(label) main::toSpritePtr1_@return
(byte) main::toSpritePtr1_return
(byte) main::toSpritePtr1_return#0
(byte) main::toSpritePtr1_return#1
(byte) main::toSpritePtr1_return#2
(byte) main::toSpritePtr1_return#3
(byte*) main::toSpritePtr1_sprite
(byte*) main::toSpritePtr1_sprite#0
(byte*) main::toSpritePtr1_sprite#1
(label) main::vicSelectGfxBank1
(byte~) main::vicSelectGfxBank1_$0
(label) main::vicSelectGfxBank1_@1
@ -645,19 +645,19 @@ interrupt(HARDWARE_CLOBBER)(void()) sprites_irq()
(byte) sprites_irq::ptr#5
(byte) sprites_irq::ptr#6
(volatile byte) sprites_irq::raster_sprite_gfx_modify loadstore
(label) sprites_irq::toSpritePtr2
(word~) sprites_irq::toSpritePtr2_$0
(number~) sprites_irq::toSpritePtr2_$1
(byte~) sprites_irq::toSpritePtr2_$2
(label) sprites_irq::toSpritePtr2_@return
(byte) sprites_irq::toSpritePtr2_return
(byte) sprites_irq::toSpritePtr2_return#0
(byte) sprites_irq::toSpritePtr2_return#1
(byte) sprites_irq::toSpritePtr2_return#2
(byte) sprites_irq::toSpritePtr2_return#3
(byte*) sprites_irq::toSpritePtr2_sprite
(byte*) sprites_irq::toSpritePtr2_sprite#0
(byte*) sprites_irq::toSpritePtr2_sprite#1
(label) sprites_irq::toSpritePtr1
(word~) sprites_irq::toSpritePtr1_$0
(number~) sprites_irq::toSpritePtr1_$1
(byte~) sprites_irq::toSpritePtr1_$2
(label) sprites_irq::toSpritePtr1_@return
(byte) sprites_irq::toSpritePtr1_return
(byte) sprites_irq::toSpritePtr1_return#0
(byte) sprites_irq::toSpritePtr1_return#1
(byte) sprites_irq::toSpritePtr1_return#2
(byte) sprites_irq::toSpritePtr1_return#3
(byte*) sprites_irq::toSpritePtr1_sprite
(byte*) sprites_irq::toSpritePtr1_sprite#0
(byte*) sprites_irq::toSpritePtr1_sprite#1
(byte) sprites_irq::ypos
(byte) sprites_irq::ypos#0
(void()) sprites_irq_init()
@ -706,8 +706,8 @@ Adding number conversion cast (unumber) 2 in *((const nomodify byte*) PLAYFIELD_
Adding number conversion cast (unumber) 3 in *((const nomodify byte*) PLAYFIELD_SPRITE_PTRS_2 + (number) 3) ← (byte) sprites_irq::ptr#4
Adding number conversion cast (unumber) 9 in (bool~) sprites_irq::$2 ← (volatile byte) irq_cnt == (number) 9
Adding number conversion cast (unumber) $15 in (volatile byte) irq_raster_next ← (volatile byte) irq_raster_next + (number) $15
Adding number conversion cast (unumber) $40 in (number~) sprites_irq::toSpritePtr2_$1 ← (word~) sprites_irq::toSpritePtr2_$0 / (number) $40
Adding number conversion cast (unumber) sprites_irq::toSpritePtr2_$1 in (number~) sprites_irq::toSpritePtr2_$1 ← (word~) sprites_irq::toSpritePtr2_$0 / (unumber)(number) $40
Adding number conversion cast (unumber) $40 in (number~) sprites_irq::toSpritePtr1_$1 ← (word~) sprites_irq::toSpritePtr1_$0 / (number) $40
Adding number conversion cast (unumber) sprites_irq::toSpritePtr1_$1 in (number~) sprites_irq::toSpritePtr1_$1 ← (word~) sprites_irq::toSpritePtr1_$0 / (unumber)(number) $40
Adding number conversion cast (unumber) $a in (bool~) sprites_irq::$3 ← (volatile byte) irq_cnt == (number) $a
Adding number conversion cast (unumber) 0 in (volatile byte) irq_cnt ← (number) 0
Adding number conversion cast (unumber) $15 in (volatile byte) irq_sprite_ypos ← (volatile byte) irq_sprite_ypos + (number) $15
@ -735,8 +735,8 @@ Adding number conversion cast (unumber) 2 in (number~) main::$5 ← (byte) main:
Adding number conversion cast (unumber) main::$5 in (number~) main::$5 ← (byte) main::s#2 * (unumber)(number) 2
Adding number conversion cast (unumber) 3 in (number~) main::$6 ← (byte) main::s#2 - (number) 3
Adding number conversion cast (unumber) main::$6 in (number~) main::$6 ← (byte) main::s#2 - (unumber)(number) 3
Adding number conversion cast (unumber) $40 in (number~) main::toSpritePtr2_$1 ← (word~) main::toSpritePtr2_$0 / (number) $40
Adding number conversion cast (unumber) main::toSpritePtr2_$1 in (number~) main::toSpritePtr2_$1 ← (word~) main::toSpritePtr2_$0 / (unumber)(number) $40
Adding number conversion cast (unumber) $40 in (number~) main::toSpritePtr1_$1 ← (word~) main::toSpritePtr1_$0 / (number) $40
Adding number conversion cast (unumber) main::toSpritePtr1_$1 in (number~) main::toSpritePtr1_$1 ← (word~) main::toSpritePtr1_$0 / (unumber)(number) $40
Adding number conversion cast (unumber) $18 in (byte) main::xpos#1 ← (byte) main::xpos#3 + (number) $18
Adding number conversion cast (unumber) $18 in (byte) main::ypos#1 ← (byte) main::ypos#3 + (number) $18
Adding number conversion cast (unumber) $ff in (bool~) loop::$0 ← *((const nomodify byte*) RASTER) != (number) $ff
@ -748,16 +748,16 @@ Inlining cast *((const nomodify byte*) SPRITES_ENABLE) ← (unumber)(number) $f
Inlining cast *((const nomodify byte*) SPRITES_MC) ← (unumber)(number) 0
Inlining cast (word~) toSpritePtr1_$0 ← (word)(byte*) toSpritePtr1_sprite#1
Inlining cast (byte~) toSpritePtr1_$2 ← (byte)(unumber~) toSpritePtr1_$1
Inlining cast (word~) sprites_irq::toSpritePtr2_$0 ← (word)(byte*) sprites_irq::toSpritePtr2_sprite#1
Inlining cast (byte~) sprites_irq::toSpritePtr2_$2 ← (byte)(unumber~) sprites_irq::toSpritePtr2_$1
Inlining cast (word~) sprites_irq::toSpritePtr1_$0 ← (word)(byte*) sprites_irq::toSpritePtr1_sprite#1
Inlining cast (byte~) sprites_irq::toSpritePtr1_$2 ← (byte)(unumber~) sprites_irq::toSpritePtr1_$1
Inlining cast (volatile byte) irq_cnt ← (unumber)(number) 0
Inlining cast *((const nomodify byte*) CIA2_PORT_A_DDR) ← (unumber)(number) 3
Inlining cast (word~) main::vicSelectGfxBank1_toDd001_$0 ← (word)(byte*) main::vicSelectGfxBank1_toDd001_gfx#1
Inlining cast (word~) main::toD0181_$0 ← (word)(byte*) main::toD0181_screen#1
Inlining cast (word~) main::toD0181_$4 ← (word)(byte*) main::toD0181_gfx#1
Inlining cast *((const nomodify byte*) SPRITES_ENABLE) ← (unumber)(number) $ff
Inlining cast (word~) main::toSpritePtr2_$0 ← (word)(byte*) main::toSpritePtr2_sprite#1
Inlining cast (byte~) main::toSpritePtr2_$2 ← (byte)(unumber~) main::toSpritePtr2_$1
Inlining cast (word~) main::toSpritePtr1_$0 ← (word)(byte*) main::toSpritePtr1_sprite#1
Inlining cast (byte~) main::toSpritePtr1_$2 ← (byte)(unumber~) main::toSpritePtr1_$1
Successful SSA optimization Pass2InlineCast
Simplifying constant pointer cast (byte*) 0
Simplifying constant pointer cast (byte*) 1
@ -887,7 +887,7 @@ Inferred type updated to byte in (unumber~) sprites_init::$1 ← (byte) sprites_
Inferred type updated to word in (unumber~) toSpritePtr1_$1 ← (word~) toSpritePtr1_$0 / (byte) $40
Inferred type updated to byte in (unumber~) $1 ← (byte~) $0 + (byte) 3
Inferred type updated to byte in (unumber~) sprites_irq::$0 ← (volatile byte) irq_raster_next + (byte) 1
Inferred type updated to word in (unumber~) sprites_irq::toSpritePtr2_$1 ← (word~) sprites_irq::toSpritePtr2_$0 / (byte) $40
Inferred type updated to word in (unumber~) sprites_irq::toSpritePtr1_$1 ← (word~) sprites_irq::toSpritePtr1_$0 / (byte) $40
Inferred type updated to byte in (unumber~) main::vicSelectGfxBank1_toDd001_$2 ← (byte~) main::vicSelectGfxBank1_toDd001_$1 / (byte) $40
Inferred type updated to byte in (unumber~) main::vicSelectGfxBank1_toDd001_$3 ← (byte) 3 ^ (byte~) main::vicSelectGfxBank1_toDd001_$2
Inferred type updated to word in (unumber~) main::toD0181_$1 ← (word~) main::toD0181_$0 & (word) $3fff
@ -898,16 +898,16 @@ Inferred type updated to byte in (unumber~) main::toD0181_$7 ← (byte~) main::t
Inferred type updated to byte in (unumber~) main::toD0181_$8 ← (byte~) main::toD0181_$3 | (byte~) main::toD0181_$7
Inferred type updated to byte in (unumber~) main::$5 ← (byte) main::s#2 * (byte) 2
Inferred type updated to byte in (unumber~) main::$6 ← (byte) main::s#2 - (byte) 3
Inferred type updated to word in (unumber~) main::toSpritePtr2_$1 ← (word~) main::toSpritePtr2_$0 / (byte) $40
Inferred type updated to word in (unumber~) main::toSpritePtr1_$1 ← (word~) main::toSpritePtr1_$0 / (byte) $40
Inferred type updated to byte in (unumber~) loop::$1 ← (byte) loop::s#2 * (byte) 2
Alias candidate removed (volatile)sprites_irq::toSpritePtr2_return#0 = irq_sprite_ptr $1 sprites_irq::toSpritePtr2_$2 sprites_irq::toSpritePtr2_return#2 sprites_irq::toSpritePtr2_return#1 sprites_irq::toSpritePtr2_return#3 sprites_irq::$5
Alias candidate removed (volatile)sprites_irq::toSpritePtr1_return#0 = irq_sprite_ptr $1 sprites_irq::toSpritePtr1_$2 sprites_irq::toSpritePtr1_return#2 sprites_irq::toSpritePtr1_return#1 sprites_irq::toSpritePtr1_return#3 sprites_irq::$5
Alias candidate removed (volatile)sprites_irq::raster_sprite_gfx_modify = sprites_irq::$0
Alias sprites_init::s2#0 = sprites_init::$0
Alias sprites_init::xpos#1 = sprites_init::$1
Alias toSpritePtr1_sprite#0 = toSpritePtr1_sprite#1
Alias toSpritePtr1_return#0 = toSpritePtr1_$2 toSpritePtr1_return#2 toSpritePtr1_return#1 toSpritePtr1_return#3 $0
Alias sprites_irq::ptr#0 = sprites_irq::ptr#5 sprites_irq::ptr#6
Alias sprites_irq::toSpritePtr2_sprite#0 = sprites_irq::toSpritePtr2_sprite#1
Alias sprites_irq::toSpritePtr1_sprite#0 = sprites_irq::toSpritePtr1_sprite#1
Alias main::vicSelectGfxBank1_gfx#0 = main::vicSelectGfxBank1_gfx#1 main::vicSelectGfxBank1_toDd001_gfx#0 main::vicSelectGfxBank1_toDd001_gfx#1
Alias sin_idx#23 = sin_idx#31 sin_idx#32 sin_idx#30 sin_idx#29 sin_idx#28 sin_idx#27 sin_idx#26 sin_idx#25 sin_idx#24
Alias main::vicSelectGfxBank1_toDd001_return#0 = main::vicSelectGfxBank1_toDd001_$3 main::vicSelectGfxBank1_toDd001_return#2 main::vicSelectGfxBank1_toDd001_return#1 main::vicSelectGfxBank1_toDd001_return#3 main::vicSelectGfxBank1_$0
@ -915,12 +915,12 @@ Alias main::toD0181_screen#0 = main::toD0181_screen#1
Alias main::toD0181_gfx#0 = main::toD0181_gfx#1
Alias main::toD0181_return#0 = main::toD0181_$8 main::toD0181_return#2 main::toD0181_return#1 main::toD0181_return#3 main::$1
Alias main::s2#0 = main::$5
Alias main::toSpritePtr2_sprite#0 = main::toSpritePtr2_sprite#1
Alias main::toSpritePtr1_sprite#0 = main::toSpritePtr1_sprite#1
Alias main::s#2 = main::s#5 main::s#4 main::s#3
Alias main::xpos#2 = main::xpos#5 main::xpos#4 main::xpos#3
Alias main::ypos#2 = main::ypos#5 main::ypos#4 main::ypos#3
Alias sin_idx#12 = sin_idx#21 sin_idx#22 sin_idx#20 sin_idx#19 sin_idx#17
Alias main::toSpritePtr2_return#0 = main::toSpritePtr2_$2 main::toSpritePtr2_return#2 main::toSpritePtr2_return#1 main::toSpritePtr2_return#3 main::$7
Alias main::toSpritePtr1_return#0 = main::toSpritePtr1_$2 main::toSpritePtr1_return#2 main::toSpritePtr1_return#1 main::toSpritePtr1_return#3 main::$7
Alias sin_idx#1 = sin_idx#6 sin_idx#7 sin_idx#2
Alias sin_idx#13 = sin_idx#8
Alias sin_idx#14 = sin_idx#9
@ -928,10 +928,10 @@ Alias sin_idx#10 = sin_idx#15 sin_idx#4
Alias sin_idx#0 = sin_idx#16
Alias sin_idx#11 = sin_idx#5
Successful SSA optimization Pass2AliasElimination
Alias candidate removed (volatile)sprites_irq::toSpritePtr2_return#0 = irq_sprite_ptr $1 sprites_irq::toSpritePtr2_$2 sprites_irq::toSpritePtr2_return#2 sprites_irq::toSpritePtr2_return#1 sprites_irq::toSpritePtr2_return#3 sprites_irq::$5
Alias candidate removed (volatile)sprites_irq::toSpritePtr1_return#0 = irq_sprite_ptr $1 sprites_irq::toSpritePtr1_$2 sprites_irq::toSpritePtr1_return#2 sprites_irq::toSpritePtr1_return#1 sprites_irq::toSpritePtr1_return#3 sprites_irq::$5
Alias candidate removed (volatile)sprites_irq::raster_sprite_gfx_modify = sprites_irq::$0
Identical Phi Values (byte) sprites_irq::toSpritePtr2_return#2 (byte) sprites_irq::toSpritePtr2_return#0
Identical Phi Values (byte) sprites_irq::toSpritePtr2_return#3 (byte) sprites_irq::toSpritePtr2_return#1
Identical Phi Values (byte) sprites_irq::toSpritePtr1_return#2 (byte) sprites_irq::toSpritePtr1_return#0
Identical Phi Values (byte) sprites_irq::toSpritePtr1_return#3 (byte) sprites_irq::toSpritePtr1_return#1
Identical Phi Values (byte) sin_idx#23 (byte) sin_idx#0
Identical Phi Values (byte) sin_idx#12 (byte) sin_idx#23
Identical Phi Values (byte) sin_idx#1 (byte) sin_idx#10
@ -952,7 +952,7 @@ Successful SSA optimization Pass2ConditionalJumpSimplification
Constant (const byte) sprites_init::xpos#0 = (byte)$18+$f*8
Constant (const byte) sprites_init::s#0 = 0
Constant (const byte*) toSpritePtr1_sprite#0 = PLAYFIELD_SPRITES
Constant (const byte*) sprites_irq::toSpritePtr2_sprite#0 = PLAYFIELD_SPRITES
Constant (const byte*) sprites_irq::toSpritePtr1_sprite#0 = PLAYFIELD_SPRITES
Constant (const byte) sin_idx#0 = 0
Constant (const byte*) main::vicSelectGfxBank1_gfx#0 = PLAYFIELD_SCREEN_1
Constant (const byte*) main::toD0181_screen#0 = PLAYFIELD_SCREEN_1
@ -960,15 +960,15 @@ Constant (const byte*) main::toD0181_gfx#0 = PLAYFIELD_CHARSET
Constant (const byte) main::xpos#0 = $18
Constant (const byte) main::ypos#0 = $32
Constant (const byte) main::s#0 = 4
Constant (const byte*) main::toSpritePtr2_sprite#0 = SIN_SPRITE
Constant (const byte*) main::toSpritePtr1_sprite#0 = SIN_SPRITE
Constant (const byte) loop::s#0 = 4
Successful SSA optimization Pass2ConstantIdentification
Constant (const word) toSpritePtr1_$0 = (word)toSpritePtr1_sprite#0
Constant (const word) sprites_irq::toSpritePtr2_$0 = (word)sprites_irq::toSpritePtr2_sprite#0
Constant (const word) sprites_irq::toSpritePtr1_$0 = (word)sprites_irq::toSpritePtr1_sprite#0
Constant (const word) main::vicSelectGfxBank1_toDd001_$0 = (word)main::vicSelectGfxBank1_gfx#0
Constant (const word) main::toD0181_$0 = (word)main::toD0181_screen#0
Constant (const word) main::toD0181_$4 = (word)main::toD0181_gfx#0
Constant (const word) main::toSpritePtr2_$0 = (word)main::toSpritePtr2_sprite#0
Constant (const word) main::toSpritePtr1_$0 = (word)main::toSpritePtr1_sprite#0
Successful SSA optimization Pass2ConstantIdentification
if() condition always true - replacing block destination [139] if(true) goto loop::@4
Successful SSA optimization Pass2ConstantIfs
@ -998,31 +998,31 @@ Finalized unsigned number type (byte) 4
Finalized unsigned number type (byte) 8
Finalized unsigned number type (byte) 8
Successful SSA optimization PassNFinalizeNumberTypeConversions
Alias candidate removed (volatile)sprites_irq::toSpritePtr2_return#0 = irq_sprite_ptr $1 sprites_irq::toSpritePtr2_$2 sprites_irq::toSpritePtr2_return#1 sprites_irq::$5
Alias candidate removed (volatile)sprites_irq::toSpritePtr1_return#0 = irq_sprite_ptr $1 sprites_irq::toSpritePtr1_$2 sprites_irq::toSpritePtr1_return#1 sprites_irq::$5
Alias candidate removed (volatile)sprites_irq::raster_sprite_gfx_modify = sprites_irq::$0
Constant right-side identified [16] (word~) toSpritePtr1_$1 ← (const word) toSpritePtr1_$0 / (byte) $40
Constant right-side identified [60] (word~) sprites_irq::toSpritePtr2_$1 ← (const word) sprites_irq::toSpritePtr2_$0 / (byte) $40
Constant right-side identified [60] (word~) sprites_irq::toSpritePtr1_$1 ← (const word) sprites_irq::toSpritePtr1_$0 / (byte) $40
Constant right-side identified [79] (byte~) main::vicSelectGfxBank1_toDd001_$1 ← > (const word) main::vicSelectGfxBank1_toDd001_$0
Constant right-side identified [83] (word~) main::toD0181_$1 ← (const word) main::toD0181_$0 & (word) $3fff
Constant right-side identified [86] (byte~) main::toD0181_$5 ← > (const word) main::toD0181_$4
Constant right-side identified [99] (word~) main::toSpritePtr2_$1 ← (const word) main::toSpritePtr2_$0 / (byte) $40
Constant right-side identified [99] (word~) main::toSpritePtr1_$1 ← (const word) main::toSpritePtr1_$0 / (byte) $40
Successful SSA optimization Pass2ConstantRValueConsolidation
Constant (const word) toSpritePtr1_$1 = toSpritePtr1_$0/$40
Constant (const word) sprites_irq::toSpritePtr2_$1 = sprites_irq::toSpritePtr2_$0/$40
Constant (const word) sprites_irq::toSpritePtr1_$1 = sprites_irq::toSpritePtr1_$0/$40
Constant (const byte) main::vicSelectGfxBank1_toDd001_$1 = >main::vicSelectGfxBank1_toDd001_$0
Constant (const word) main::toD0181_$1 = main::toD0181_$0&$3fff
Constant (const byte) main::toD0181_$5 = >main::toD0181_$4
Constant (const word) main::toSpritePtr2_$1 = main::toSpritePtr2_$0/$40
Constant (const word) main::toSpritePtr1_$1 = main::toSpritePtr1_$0/$40
Successful SSA optimization Pass2ConstantIdentification
Constant (const byte) toSpritePtr1_return#0 = (byte)toSpritePtr1_$1
Constant (const byte) sprites_irq::toSpritePtr2_$2 = (byte)sprites_irq::toSpritePtr2_$1
Constant (const byte) main::toSpritePtr2_return#0 = (byte)main::toSpritePtr2_$1
Constant (const byte) sprites_irq::toSpritePtr1_$2 = (byte)sprites_irq::toSpritePtr1_$1
Constant (const byte) main::toSpritePtr1_return#0 = (byte)main::toSpritePtr1_$1
Successful SSA optimization Pass2ConstantIdentification
Constant (const byte) sprites_irq::toSpritePtr2_return#0 = sprites_irq::toSpritePtr2_$2
Constant (const byte) sprites_irq::toSpritePtr1_return#0 = sprites_irq::toSpritePtr1_$2
Successful SSA optimization Pass2ConstantIdentification
Constant (const byte) sprites_irq::toSpritePtr2_return#1 = sprites_irq::toSpritePtr2_return#0
Constant (const byte) sprites_irq::toSpritePtr1_return#1 = sprites_irq::toSpritePtr1_return#0
Successful SSA optimization Pass2ConstantIdentification
Constant (const byte) sprites_irq::$5 = sprites_irq::toSpritePtr2_return#1
Constant (const byte) sprites_irq::$5 = sprites_irq::toSpritePtr1_return#1
Successful SSA optimization Pass2ConstantIdentification
Alias candidate removed (volatile)irq_sprite_ptr = $1
Alias candidate removed (volatile)sprites_irq::raster_sprite_gfx_modify = sprites_irq::$0
@ -1067,7 +1067,7 @@ Rewriting multiplication to use shift [93] (byte~) loop::$1 ← (byte) loop::s#2
Successful SSA optimization Pass2MultiplyToShiftRewriting
Inlining constant with var siblings (const byte) sprites_init::xpos#0
Inlining constant with var siblings (const byte) sprites_init::s#0
Inlining constant with different constant siblings (const byte) sprites_irq::toSpritePtr2_return#1
Inlining constant with different constant siblings (const byte) sprites_irq::toSpritePtr1_return#1
Inlining constant with var siblings (const byte) main::xpos#0
Inlining constant with var siblings (const byte) main::ypos#0
Inlining constant with var siblings (const byte) main::s#0
@ -1075,30 +1075,30 @@ Inlining constant with var siblings (const byte) loop::s#0
Inlining constant with var siblings (const byte) sin_idx#0
Constant inlined main::toD0181_screen#0 = (const nomodify byte*) PLAYFIELD_SCREEN_1
Constant inlined main::toD0181_gfx#0 = (const nomodify byte*) PLAYFIELD_CHARSET
Constant inlined sprites_irq::toSpritePtr2_return#1 = (const byte) sprites_irq::toSpritePtr2_return#0
Constant inlined sprites_irq::toSpritePtr2_$2 = (byte)(word)(const nomodify byte*) PLAYFIELD_SPRITES/(byte) $40
Constant inlined sprites_irq::$5 = (const byte) sprites_irq::toSpritePtr2_return#0
Constant inlined sprites_irq::toSpritePtr2_$1 = (word)(const nomodify byte*) PLAYFIELD_SPRITES/(byte) $40
Constant inlined main::toSpritePtr1_$0 = (word)(const byte*) SIN_SPRITE
Constant inlined sprites_irq::toSpritePtr1_sprite#0 = (const nomodify byte*) PLAYFIELD_SPRITES
Constant inlined sprites_irq::$5 = (const byte) sprites_irq::toSpritePtr1_return#0
Constant inlined sprites_init::xpos#0 = (byte)(number) $18+(number) $f*(number) 8
Constant inlined main::toSpritePtr2_sprite#0 = (const byte*) SIN_SPRITE
Constant inlined sprites_irq::toSpritePtr2_$0 = (word)(const nomodify byte*) PLAYFIELD_SPRITES
Constant inlined $1 = (const byte) toSpritePtr1_return#0+(byte) 3
Constant inlined toSpritePtr1_$0 = (word)(const nomodify byte*) PLAYFIELD_SPRITES
Constant inlined toSpritePtr1_$1 = (word)(const nomodify byte*) PLAYFIELD_SPRITES/(byte) $40
Constant inlined main::toSpritePtr1_$1 = (word)(const byte*) SIN_SPRITE/(byte) $40
Constant inlined sin_idx#0 = (byte) 0
Constant inlined sprites_irq::toSpritePtr1_return#1 = (const byte) sprites_irq::toSpritePtr1_return#0
Constant inlined main::toSpritePtr1_sprite#0 = (const byte*) SIN_SPRITE
Constant inlined sprites_init::s#0 = (byte) 0
Constant inlined main::xpos#0 = (byte) $18
Constant inlined main::s#0 = (byte) 4
Constant inlined main::toD0181_$7 = >(word)(const nomodify byte*) PLAYFIELD_CHARSET/(byte) 4&(byte) $f
Constant inlined main::toSpritePtr2_$1 = (word)(const byte*) SIN_SPRITE/(byte) $40
Constant inlined main::toSpritePtr2_$0 = (word)(const byte*) SIN_SPRITE
Constant inlined sprites_irq::toSpritePtr1_$2 = (byte)(word)(const nomodify byte*) PLAYFIELD_SPRITES/(byte) $40
Constant inlined main::toD0181_$2 = (word)(const nomodify byte*) PLAYFIELD_SCREEN_1&(word) $3fff*(byte) 4
Constant inlined sprites_irq::toSpritePtr1_$1 = (word)(const nomodify byte*) PLAYFIELD_SPRITES/(byte) $40
Constant inlined main::toD0181_$1 = (word)(const nomodify byte*) PLAYFIELD_SCREEN_1&(word) $3fff
Constant inlined sprites_irq::toSpritePtr1_$0 = (word)(const nomodify byte*) PLAYFIELD_SPRITES
Constant inlined main::toD0181_$0 = (word)(const nomodify byte*) PLAYFIELD_SCREEN_1
Constant inlined main::toD0181_$6 = >(word)(const nomodify byte*) PLAYFIELD_CHARSET/(byte) 4
Constant inlined main::toD0181_$5 = >(word)(const nomodify byte*) PLAYFIELD_CHARSET
Constant inlined main::toD0181_$4 = (word)(const nomodify byte*) PLAYFIELD_CHARSET
Constant inlined sprites_irq::toSpritePtr2_sprite#0 = (const nomodify byte*) PLAYFIELD_SPRITES
Constant inlined main::toD0181_$3 = >(word)(const nomodify byte*) PLAYFIELD_SCREEN_1&(word) $3fff*(byte) 4
Constant inlined main::ypos#0 = (byte) $32
Constant inlined toSpritePtr1_sprite#0 = (const nomodify byte*) PLAYFIELD_SPRITES
@ -1131,14 +1131,14 @@ Adding NOP phi() at start of main::vicSelectGfxBank1_toDd001_@return
Adding NOP phi() at start of main::@3
Adding NOP phi() at start of main::toD0181
Adding NOP phi() at start of main::toD0181_@return
Adding NOP phi() at start of main::toSpritePtr2
Adding NOP phi() at start of main::toSpritePtr2_@return
Adding NOP phi() at start of main::toSpritePtr1
Adding NOP phi() at start of main::toSpritePtr1_@return
Adding NOP phi() at start of main::@2
Adding NOP phi() at start of main::@7
Adding NOP phi() at start of main::@8
Adding NOP phi() at start of loop
Adding NOP phi() at start of sprites_irq::toSpritePtr2
Adding NOP phi() at start of sprites_irq::toSpritePtr2_@return
Adding NOP phi() at start of sprites_irq::toSpritePtr1
Adding NOP phi() at start of sprites_irq::toSpritePtr1_@return
CALL GRAPH
Calls in [] to main:11
Calls in [main] to sprites_init:23 sprites_irq_init:39 loop:41
@ -1159,12 +1159,12 @@ Culled Empty Block (label) @11
Culled Empty Block (label) main::vicSelectGfxBank1_toDd001_@return
Culled Empty Block (label) main::@3
Culled Empty Block (label) main::toD0181_@return
Culled Empty Block (label) main::toSpritePtr2_@return
Culled Empty Block (label) main::toSpritePtr1_@return
Culled Empty Block (label) main::@8
Culled Empty Block (label) main::@9
Culled Empty Block (label) loop::@11
Culled Empty Block (label) sprites_init::@3
Culled Empty Block (label) sprites_irq::toSpritePtr2_@return
Culled Empty Block (label) sprites_irq::toSpritePtr1_@return
Renumbering block @4 to @1
Renumbering block @5 to @2
Renumbering block @7 to @3
@ -1192,11 +1192,11 @@ Adding NOP phi() at start of @end
Adding NOP phi() at start of main
Adding NOP phi() at start of main::vicSelectGfxBank1_toDd001
Adding NOP phi() at start of main::toD0181
Adding NOP phi() at start of main::toSpritePtr2
Adding NOP phi() at start of main::toSpritePtr1
Adding NOP phi() at start of main::@2
Adding NOP phi() at start of main::@6
Adding NOP phi() at start of loop
Adding NOP phi() at start of sprites_irq::toSpritePtr2
Adding NOP phi() at start of sprites_irq::toSpritePtr1
FINAL CONTROL FLOW GRAPH
@begin: scope:[] from
@ -1274,12 +1274,12 @@ main::@1: scope:[main] from main::@4 main::@5
[23] *((const nomodify byte*) SPRITES_YPOS + (byte) main::s2#0) ← (byte) main::ypos#2
[24] (byte~) main::$6 ← (byte) main::s#2 - (byte) 3
[25] *((const nomodify byte*) SPRITES_COLS + (byte) main::s#2) ← (byte~) main::$6
to:main::toSpritePtr2
main::toSpritePtr2: scope:[main] from main::@1
to:main::toSpritePtr1
main::toSpritePtr1: scope:[main] from main::@1
[26] phi()
to:main::@4
main::@4: scope:[main] from main::toSpritePtr2
[27] *((const nomodify byte*) PLAYFIELD_SPRITE_PTRS_1 + (byte) main::s#2) ← (const byte) main::toSpritePtr2_return#0
main::@4: scope:[main] from main::toSpritePtr1
[27] *((const nomodify byte*) PLAYFIELD_SPRITE_PTRS_1 + (byte) main::s#2) ← (const byte) main::toSpritePtr1_return#0
[28] (byte) main::xpos#1 ← (byte) main::xpos#2 + (byte) $18
[29] (byte) main::ypos#1 ← (byte) main::ypos#2 + (byte) $18
[30] (byte) main::s#1 ← ++ (byte) main::s#2
@ -1416,12 +1416,12 @@ sprites_irq::@4: scope:[sprites_irq] from sprites_irq::@6
sprites_irq::@3: scope:[sprites_irq] from sprites_irq::@2
[102] (volatile byte) irq_raster_next ← (volatile byte) irq_raster_next + (byte) $15
[103] (volatile byte) irq_sprite_ypos ← (const nomodify byte) SPRITES_FIRST_YPOS
to:sprites_irq::toSpritePtr2
sprites_irq::toSpritePtr2: scope:[sprites_irq] from sprites_irq::@3
to:sprites_irq::toSpritePtr1
sprites_irq::toSpritePtr1: scope:[sprites_irq] from sprites_irq::@3
[104] phi()
to:sprites_irq::@11
sprites_irq::@11: scope:[sprites_irq] from sprites_irq::toSpritePtr2
[105] (volatile byte) irq_sprite_ptr ← (const byte) sprites_irq::toSpritePtr2_return#0
sprites_irq::@11: scope:[sprites_irq] from sprites_irq::toSpritePtr1
[105] (volatile byte) irq_sprite_ptr ← (const byte) sprites_irq::toSpritePtr1_return#0
to:sprites_irq::@5
sprites_irq::@1: scope:[sprites_irq] from sprites_irq::@9
[106] *((const nomodify byte*) PLAYFIELD_SPRITE_PTRS_1) ← (byte) sprites_irq::ptr#0
@ -1457,8 +1457,8 @@ VARIABLE REGISTER WEIGHTS
(byte*) main::toD0181_gfx
(byte) main::toD0181_return
(byte*) main::toD0181_screen
(byte) main::toSpritePtr2_return
(byte*) main::toSpritePtr2_sprite
(byte) main::toSpritePtr1_return
(byte*) main::toSpritePtr1_sprite
(byte*) main::vicSelectGfxBank1_gfx
(byte*) main::vicSelectGfxBank1_toDd001_gfx
(byte) main::vicSelectGfxBank1_toDd001_return
@ -1490,8 +1490,8 @@ interrupt(HARDWARE_CLOBBER)(void()) sprites_irq()
(byte) sprites_irq::ptr#3 2.6666666666666665
(byte) sprites_irq::ptr#4 4.0
(volatile byte) sprites_irq::raster_sprite_gfx_modify loadstore 6.5
(byte) sprites_irq::toSpritePtr2_return
(byte*) sprites_irq::toSpritePtr2_sprite
(byte) sprites_irq::toSpritePtr1_return
(byte*) sprites_irq::toSpritePtr1_sprite
(byte) sprites_irq::ypos
(byte) sprites_irq::ypos#0 2.5
(void()) sprites_irq_init()
@ -1703,7 +1703,7 @@ __bend_from___b4:
__bend:
// main
main: {
.const toSpritePtr2_return = SIN_SPRITE/$40
.const toSpritePtr1_return = SIN_SPRITE/$40
.const vicSelectGfxBank1_toDd001_return = 3
.const toD0181_return = (>(PLAYFIELD_SCREEN_1&$3fff)*4)|(>PLAYFIELD_CHARSET)/4&$f
.label __6 = $10
@ -1787,16 +1787,16 @@ main: {
lda.z __6
ldy.z s
sta SPRITES_COLS,y
// [26] phi from main::@1 to main::toSpritePtr2 [phi:main::@1->main::toSpritePtr2]
toSpritePtr2_from___b1:
jmp toSpritePtr2
// main::toSpritePtr2
toSpritePtr2:
// [26] phi from main::@1 to main::toSpritePtr1 [phi:main::@1->main::toSpritePtr1]
toSpritePtr1_from___b1:
jmp toSpritePtr1
// main::toSpritePtr1
toSpritePtr1:
jmp __b4
// main::@4
__b4:
// [27] *((const nomodify byte*) PLAYFIELD_SPRITE_PTRS_1 + (byte) main::s#2) ← (const byte) main::toSpritePtr2_return#0 -- pbuc1_derefidx_vbuz1=vbuc2
lda #toSpritePtr2_return
// [27] *((const nomodify byte*) PLAYFIELD_SPRITE_PTRS_1 + (byte) main::s#2) ← (const byte) main::toSpritePtr1_return#0 -- pbuc1_derefidx_vbuz1=vbuc2
lda #toSpritePtr1_return
ldy.z s
sta PLAYFIELD_SPRITE_PTRS_1,y
// [28] (byte) main::xpos#1 ← (byte) main::xpos#2 + (byte) $18 -- vbuz1=vbuz1_plus_vbuc1
@ -2019,7 +2019,7 @@ sprites_init: {
// Repeats 10 timers every 2 lines from line IRQ_RASTER_FIRST
// Utilizes duplicated gfx in the sprites to allow for some leeway in updating the sprite pointers
sprites_irq: {
.const toSpritePtr2_return = PLAYFIELD_SPRITES/$40
.const toSpritePtr1_return = PLAYFIELD_SPRITES/$40
.label __0 = $14
.label raster_sprite_gfx_modify = $15
.label ypos = $13
@ -2179,16 +2179,16 @@ sprites_irq: {
// [103] (volatile byte) irq_sprite_ypos ← (const nomodify byte) SPRITES_FIRST_YPOS -- vbuz1=vbuc1
lda #SPRITES_FIRST_YPOS
sta.z irq_sprite_ypos
// [104] phi from sprites_irq::@3 to sprites_irq::toSpritePtr2 [phi:sprites_irq::@3->sprites_irq::toSpritePtr2]
toSpritePtr2_from___b3:
jmp toSpritePtr2
// sprites_irq::toSpritePtr2
toSpritePtr2:
// [104] phi from sprites_irq::@3 to sprites_irq::toSpritePtr1 [phi:sprites_irq::@3->sprites_irq::toSpritePtr1]
toSpritePtr1_from___b3:
jmp toSpritePtr1
// sprites_irq::toSpritePtr1
toSpritePtr1:
jmp __b11
// sprites_irq::@11
__b11:
// [105] (volatile byte) irq_sprite_ptr ← (const byte) sprites_irq::toSpritePtr2_return#0 -- vbuz1=vbuc1
lda #toSpritePtr2_return
// [105] (volatile byte) irq_sprite_ptr ← (const byte) sprites_irq::toSpritePtr1_return#0 -- vbuz1=vbuc1
lda #toSpritePtr1_return
sta.z irq_sprite_ptr
jmp __b5
// sprites_irq::@1
@ -2260,7 +2260,7 @@ Statement [22] *((const nomodify byte*) SPRITES_XPOS + (byte) main::s2#0) ← (b
Removing always clobbered register reg byte a as potential for zp[1]:15 [ main::s2#0 ]
Statement [23] *((const nomodify byte*) SPRITES_YPOS + (byte) main::s2#0) ← (byte) main::ypos#2 [ main::s#2 main::xpos#2 main::ypos#2 ] ( main:10 [ main::s#2 main::xpos#2 main::ypos#2 ] { } ) always clobbers reg byte a
Statement [24] (byte~) main::$6 ← (byte) main::s#2 - (byte) 3 [ main::s#2 main::xpos#2 main::ypos#2 main::$6 ] ( main:10 [ main::s#2 main::xpos#2 main::ypos#2 main::$6 ] { } ) always clobbers reg byte a
Statement [27] *((const nomodify byte*) PLAYFIELD_SPRITE_PTRS_1 + (byte) main::s#2) ← (const byte) main::toSpritePtr2_return#0 [ main::s#2 main::xpos#2 main::ypos#2 ] ( main:10 [ main::s#2 main::xpos#2 main::ypos#2 ] { } ) always clobbers reg byte a
Statement [27] *((const nomodify byte*) PLAYFIELD_SPRITE_PTRS_1 + (byte) main::s#2) ← (const byte) main::toSpritePtr1_return#0 [ main::s#2 main::xpos#2 main::ypos#2 ] ( main:10 [ main::s#2 main::xpos#2 main::ypos#2 ] { } ) always clobbers reg byte a
Statement [28] (byte) main::xpos#1 ← (byte) main::xpos#2 + (byte) $18 [ main::s#2 main::ypos#2 main::xpos#1 ] ( main:10 [ main::s#2 main::ypos#2 main::xpos#1 ] { } ) always clobbers reg byte a
Statement [29] (byte) main::ypos#1 ← (byte) main::ypos#2 + (byte) $18 [ main::s#2 main::xpos#1 main::ypos#1 ] ( main:10 [ main::s#2 main::xpos#1 main::ypos#1 ] { } ) always clobbers reg byte a
Statement [39] if(*((const nomodify byte*) RASTER)!=(byte) $ff) goto loop::@2 [ sin_idx#10 ] ( main:10::loop:35 [ sin_idx#10 ] { } ) always clobbers reg byte a
@ -2306,7 +2306,7 @@ Statement [100] (volatile byte) irq_sprite_ypos ← (volatile byte) irq_sprite_y
Statement [101] (volatile byte) irq_sprite_ptr ← (volatile byte) irq_sprite_ptr + (byte) 3 [ irq_raster_next ] ( [ irq_raster_next ] { } ) always clobbers reg byte a reg byte x
Statement [102] (volatile byte) irq_raster_next ← (volatile byte) irq_raster_next + (byte) $15 [ irq_raster_next ] ( [ irq_raster_next ] { } ) always clobbers reg byte a reg byte x
Statement [103] (volatile byte) irq_sprite_ypos ← (const nomodify byte) SPRITES_FIRST_YPOS [ irq_raster_next ] ( [ irq_raster_next ] { } ) always clobbers reg byte a
Statement [105] (volatile byte) irq_sprite_ptr ← (const byte) sprites_irq::toSpritePtr2_return#0 [ irq_raster_next ] ( [ irq_raster_next ] { } ) always clobbers reg byte a
Statement [105] (volatile byte) irq_sprite_ptr ← (const byte) sprites_irq::toSpritePtr1_return#0 [ irq_raster_next ] ( [ irq_raster_next ] { } ) always clobbers reg byte a
Statement [1] (volatile byte) render_screen_showing ← (byte) 0 [ ] ( [ ] { } ) always clobbers reg byte a
Statement [3] (volatile byte) irq_raster_next ← (const nomodify byte) IRQ_RASTER_FIRST [ ] ( [ ] { } ) always clobbers reg byte a
Statement [4] (volatile byte) irq_sprite_ypos ← (const nomodify byte) SPRITES_FIRST_YPOS+(byte) $15 [ ] ( [ ] { } ) always clobbers reg byte a
@ -2320,7 +2320,7 @@ Statement [21] (byte) main::s2#0 ← (byte) main::s#2 << (byte) 1 [ main::s#2 ma
Statement [22] *((const nomodify byte*) SPRITES_XPOS + (byte) main::s2#0) ← (byte) main::xpos#2 [ main::s#2 main::xpos#2 main::ypos#2 main::s2#0 ] ( main:10 [ main::s#2 main::xpos#2 main::ypos#2 main::s2#0 ] { } ) always clobbers reg byte a
Statement [23] *((const nomodify byte*) SPRITES_YPOS + (byte) main::s2#0) ← (byte) main::ypos#2 [ main::s#2 main::xpos#2 main::ypos#2 ] ( main:10 [ main::s#2 main::xpos#2 main::ypos#2 ] { } ) always clobbers reg byte a
Statement [24] (byte~) main::$6 ← (byte) main::s#2 - (byte) 3 [ main::s#2 main::xpos#2 main::ypos#2 main::$6 ] ( main:10 [ main::s#2 main::xpos#2 main::ypos#2 main::$6 ] { } ) always clobbers reg byte a
Statement [27] *((const nomodify byte*) PLAYFIELD_SPRITE_PTRS_1 + (byte) main::s#2) ← (const byte) main::toSpritePtr2_return#0 [ main::s#2 main::xpos#2 main::ypos#2 ] ( main:10 [ main::s#2 main::xpos#2 main::ypos#2 ] { } ) always clobbers reg byte a
Statement [27] *((const nomodify byte*) PLAYFIELD_SPRITE_PTRS_1 + (byte) main::s#2) ← (const byte) main::toSpritePtr1_return#0 [ main::s#2 main::xpos#2 main::ypos#2 ] ( main:10 [ main::s#2 main::xpos#2 main::ypos#2 ] { } ) always clobbers reg byte a
Statement [28] (byte) main::xpos#1 ← (byte) main::xpos#2 + (byte) $18 [ main::s#2 main::ypos#2 main::xpos#1 ] ( main:10 [ main::s#2 main::ypos#2 main::xpos#1 ] { } ) always clobbers reg byte a
Statement [29] (byte) main::ypos#1 ← (byte) main::ypos#2 + (byte) $18 [ main::s#2 main::xpos#1 main::ypos#1 ] ( main:10 [ main::s#2 main::xpos#1 main::ypos#1 ] { } ) always clobbers reg byte a
Statement [39] if(*((const nomodify byte*) RASTER)!=(byte) $ff) goto loop::@2 [ sin_idx#10 ] ( main:10::loop:35 [ sin_idx#10 ] { } ) always clobbers reg byte a
@ -2360,7 +2360,7 @@ Statement [100] (volatile byte) irq_sprite_ypos ← (volatile byte) irq_sprite_y
Statement [101] (volatile byte) irq_sprite_ptr ← (volatile byte) irq_sprite_ptr + (byte) 3 [ irq_raster_next ] ( [ irq_raster_next ] { } ) always clobbers reg byte a reg byte x
Statement [102] (volatile byte) irq_raster_next ← (volatile byte) irq_raster_next + (byte) $15 [ irq_raster_next ] ( [ irq_raster_next ] { } ) always clobbers reg byte a reg byte x
Statement [103] (volatile byte) irq_sprite_ypos ← (const nomodify byte) SPRITES_FIRST_YPOS [ irq_raster_next ] ( [ irq_raster_next ] { } ) always clobbers reg byte a
Statement [105] (volatile byte) irq_sprite_ptr ← (const byte) sprites_irq::toSpritePtr2_return#0 [ irq_raster_next ] ( [ irq_raster_next ] { } ) always clobbers reg byte a
Statement [105] (volatile byte) irq_sprite_ptr ← (const byte) sprites_irq::toSpritePtr1_return#0 [ irq_raster_next ] ( [ irq_raster_next ] { } ) always clobbers reg byte a
Potential registers zp[1]:2 [ main::s#2 main::s#1 ] : zp[1]:2 , reg byte x , reg byte y ,
Potential registers zp[1]:3 [ main::xpos#2 main::xpos#1 ] : zp[1]:3 , reg byte x , reg byte y ,
Potential registers zp[1]:4 [ main::ypos#2 main::ypos#1 ] : zp[1]:4 , reg byte x , reg byte y ,
@ -2573,7 +2573,7 @@ __bend_from___b4:
__bend:
// main
main: {
.const toSpritePtr2_return = SIN_SPRITE/$40
.const toSpritePtr1_return = SIN_SPRITE/$40
.const vicSelectGfxBank1_toDd001_return = 3
.const toD0181_return = (>(PLAYFIELD_SCREEN_1&$3fff)*4)|(>PLAYFIELD_CHARSET)/4&$f
.label xpos = 3
@ -2649,16 +2649,16 @@ main: {
sbc #3
// [25] *((const nomodify byte*) SPRITES_COLS + (byte) main::s#2) ← (byte~) main::$6 -- pbuc1_derefidx_vbuyy=vbuaa
sta SPRITES_COLS,y
// [26] phi from main::@1 to main::toSpritePtr2 [phi:main::@1->main::toSpritePtr2]
toSpritePtr2_from___b1:
jmp toSpritePtr2
// main::toSpritePtr2
toSpritePtr2:
// [26] phi from main::@1 to main::toSpritePtr1 [phi:main::@1->main::toSpritePtr1]
toSpritePtr1_from___b1:
jmp toSpritePtr1
// main::toSpritePtr1
toSpritePtr1:
jmp __b4
// main::@4
__b4:
// [27] *((const nomodify byte*) PLAYFIELD_SPRITE_PTRS_1 + (byte) main::s#2) ← (const byte) main::toSpritePtr2_return#0 -- pbuc1_derefidx_vbuyy=vbuc2
lda #toSpritePtr2_return
// [27] *((const nomodify byte*) PLAYFIELD_SPRITE_PTRS_1 + (byte) main::s#2) ← (const byte) main::toSpritePtr1_return#0 -- pbuc1_derefidx_vbuyy=vbuc2
lda #toSpritePtr1_return
sta PLAYFIELD_SPRITE_PTRS_1,y
// [28] (byte) main::xpos#1 ← (byte) main::xpos#2 + (byte) $18 -- vbuz1=vbuz1_plus_vbuc1
lax.z xpos
@ -2867,7 +2867,7 @@ sprites_init: {
// Repeats 10 timers every 2 lines from line IRQ_RASTER_FIRST
// Utilizes duplicated gfx in the sprites to allow for some leeway in updating the sprite pointers
sprites_irq: {
.const toSpritePtr2_return = PLAYFIELD_SPRITES/$40
.const toSpritePtr1_return = PLAYFIELD_SPRITES/$40
.label raster_sprite_gfx_modify = $a
// entry interrupt(HARDWARE_CLOBBER)
sta rega+1
@ -3003,16 +3003,16 @@ sprites_irq: {
// [103] (volatile byte) irq_sprite_ypos ← (const nomodify byte) SPRITES_FIRST_YPOS -- vbuz1=vbuc1
lda #SPRITES_FIRST_YPOS
sta.z irq_sprite_ypos
// [104] phi from sprites_irq::@3 to sprites_irq::toSpritePtr2 [phi:sprites_irq::@3->sprites_irq::toSpritePtr2]
toSpritePtr2_from___b3:
jmp toSpritePtr2
// sprites_irq::toSpritePtr2
toSpritePtr2:
// [104] phi from sprites_irq::@3 to sprites_irq::toSpritePtr1 [phi:sprites_irq::@3->sprites_irq::toSpritePtr1]
toSpritePtr1_from___b3:
jmp toSpritePtr1
// sprites_irq::toSpritePtr1
toSpritePtr1:
jmp __b11
// sprites_irq::@11
__b11:
// [105] (volatile byte) irq_sprite_ptr ← (const byte) sprites_irq::toSpritePtr2_return#0 -- vbuz1=vbuc1
lda #toSpritePtr2_return
// [105] (volatile byte) irq_sprite_ptr ← (const byte) sprites_irq::toSpritePtr1_return#0 -- vbuz1=vbuc1
lda #toSpritePtr1_return
sta.z irq_sprite_ptr
jmp __b5
// sprites_irq::@1
@ -3074,7 +3074,7 @@ Removing instruction jmp toD0181
Removing instruction jmp __b3
Removing instruction jmp __b5
Removing instruction jmp __b1
Removing instruction jmp toSpritePtr2
Removing instruction jmp toSpritePtr1
Removing instruction jmp __b4
Removing instruction jmp __b2
Removing instruction jmp __b6
@ -3095,7 +3095,7 @@ Removing instruction jmp __b6
Removing instruction jmp __b7
Removing instruction jmp __b5
Removing instruction jmp __breturn
Removing instruction jmp toSpritePtr2
Removing instruction jmp toSpritePtr1
Removing instruction jmp __b11
Succesful ASM optimization Pass5NextJumpElimination
Removing instruction lda SPRITES_MC
@ -3117,8 +3117,8 @@ Removing instruction vicSelectGfxBank1_toDd001:
Removing instruction toD0181_from_vicSelectGfxBank1___b1:
Removing instruction toD0181:
Removing instruction __b1_from___b4:
Removing instruction toSpritePtr2_from___b1:
Removing instruction toSpritePtr2:
Removing instruction toSpritePtr1_from___b1:
Removing instruction toSpritePtr1:
Removing instruction __b2_from___b4:
Removing instruction __b6_from___b2:
Removing instruction loop_from___b6:
@ -3126,8 +3126,8 @@ Removing instruction __b1:
Removing instruction __b4_from___b4:
Removing instruction __b1_from___b1:
Removing instruction __breturn:
Removing instruction toSpritePtr2_from___b3:
Removing instruction toSpritePtr2:
Removing instruction toSpritePtr1_from___b3:
Removing instruction toSpritePtr1:
Succesful ASM optimization Pass5RedundantLabelElimination
Removing instruction __b2:
Removing instruction __b5:
@ -3246,10 +3246,10 @@ FINAL SYMBOL TABLE
(byte) main::toD0181_return
(const byte) main::toD0181_return#0 toD0181_return = >(word)(const nomodify byte*) PLAYFIELD_SCREEN_1&(word) $3fff*(byte) 4|>(word)(const nomodify byte*) PLAYFIELD_CHARSET/(byte) 4&(byte) $f
(byte*) main::toD0181_screen
(label) main::toSpritePtr2
(byte) main::toSpritePtr2_return
(const byte) main::toSpritePtr2_return#0 toSpritePtr2_return = (byte)(word)(const byte*) SIN_SPRITE/(byte) $40
(byte*) main::toSpritePtr2_sprite
(label) main::toSpritePtr1
(byte) main::toSpritePtr1_return
(const byte) main::toSpritePtr1_return#0 toSpritePtr1_return = (byte)(word)(const byte*) SIN_SPRITE/(byte) $40
(byte*) main::toSpritePtr1_sprite
(label) main::vicSelectGfxBank1
(label) main::vicSelectGfxBank1_@1
(byte*) main::vicSelectGfxBank1_gfx
@ -3299,10 +3299,10 @@ 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
(volatile byte) sprites_irq::raster_sprite_gfx_modify loadstore zp[1]:10 6.5
(label) sprites_irq::toSpritePtr2
(byte) sprites_irq::toSpritePtr2_return
(const byte) sprites_irq::toSpritePtr2_return#0 toSpritePtr2_return = (byte)(word)(const nomodify byte*) PLAYFIELD_SPRITES/(byte) $40
(byte*) sprites_irq::toSpritePtr2_sprite
(label) sprites_irq::toSpritePtr1
(byte) sprites_irq::toSpritePtr1_return
(const byte) sprites_irq::toSpritePtr1_return#0 toSpritePtr1_return = (byte)(word)(const nomodify byte*) PLAYFIELD_SPRITES/(byte) $40
(byte*) sprites_irq::toSpritePtr1_sprite
(byte) sprites_irq::ypos
(byte) sprites_irq::ypos#0 reg byte a 2.5
(void()) sprites_irq_init()
@ -3455,7 +3455,7 @@ __bbegin:
// @end
// main
main: {
.const toSpritePtr2_return = SIN_SPRITE/$40
.const toSpritePtr1_return = SIN_SPRITE/$40
.const vicSelectGfxBank1_toDd001_return = 3
.const toD0181_return = (>(PLAYFIELD_SCREEN_1&$3fff)*4)|(>PLAYFIELD_CHARSET)/4&$f
.label xpos = 3
@ -3523,12 +3523,12 @@ main: {
// SPRITES_COLS[s] = s-3
// [25] *((const nomodify byte*) SPRITES_COLS + (byte) main::s#2) ← (byte~) main::$6 -- pbuc1_derefidx_vbuyy=vbuaa
sta SPRITES_COLS,y
// [26] phi from main::@1 to main::toSpritePtr2 [phi:main::@1->main::toSpritePtr2]
// main::toSpritePtr2
// [26] phi from main::@1 to main::toSpritePtr1 [phi:main::@1->main::toSpritePtr1]
// main::toSpritePtr1
// main::@4
// PLAYFIELD_SPRITE_PTRS_1[s] = toSpritePtr(SIN_SPRITE)
// [27] *((const nomodify byte*) PLAYFIELD_SPRITE_PTRS_1 + (byte) main::s#2) ← (const byte) main::toSpritePtr2_return#0 -- pbuc1_derefidx_vbuyy=vbuc2
lda #toSpritePtr2_return
// [27] *((const nomodify byte*) PLAYFIELD_SPRITE_PTRS_1 + (byte) main::s#2) ← (const byte) main::toSpritePtr1_return#0 -- pbuc1_derefidx_vbuyy=vbuc2
lda #toSpritePtr1_return
sta PLAYFIELD_SPRITE_PTRS_1,y
// xpos += 24
// [28] (byte) main::xpos#1 ← (byte) main::xpos#2 + (byte) $18 -- vbuz1=vbuz1_plus_vbuc1
@ -3740,7 +3740,7 @@ sprites_init: {
// Repeats 10 timers every 2 lines from line IRQ_RASTER_FIRST
// Utilizes duplicated gfx in the sprites to allow for some leeway in updating the sprite pointers
sprites_irq: {
.const toSpritePtr2_return = PLAYFIELD_SPRITES/$40
.const toSpritePtr1_return = PLAYFIELD_SPRITES/$40
.label raster_sprite_gfx_modify = $a
// entry interrupt(HARDWARE_CLOBBER)
sta rega+1
@ -3895,12 +3895,12 @@ sprites_irq: {
// [103] (volatile byte) irq_sprite_ypos ← (const nomodify byte) SPRITES_FIRST_YPOS -- vbuz1=vbuc1
lda #SPRITES_FIRST_YPOS
sta.z irq_sprite_ypos
// [104] phi from sprites_irq::@3 to sprites_irq::toSpritePtr2 [phi:sprites_irq::@3->sprites_irq::toSpritePtr2]
// sprites_irq::toSpritePtr2
// [104] phi from sprites_irq::@3 to sprites_irq::toSpritePtr1 [phi:sprites_irq::@3->sprites_irq::toSpritePtr1]
// sprites_irq::toSpritePtr1
// sprites_irq::@11
// irq_sprite_ptr = toSpritePtr(PLAYFIELD_SPRITES)
// [105] (volatile byte) irq_sprite_ptr ← (const byte) sprites_irq::toSpritePtr2_return#0 -- vbuz1=vbuc1
lda #toSpritePtr2_return
// [105] (volatile byte) irq_sprite_ptr ← (const byte) sprites_irq::toSpritePtr1_return#0 -- vbuz1=vbuc1
lda #toSpritePtr1_return
sta.z irq_sprite_ptr
jmp __b5
// sprites_irq::@1

View File

@ -80,10 +80,10 @@
(byte) main::toD0181_return
(const byte) main::toD0181_return#0 toD0181_return = >(word)(const nomodify byte*) PLAYFIELD_SCREEN_1&(word) $3fff*(byte) 4|>(word)(const nomodify byte*) PLAYFIELD_CHARSET/(byte) 4&(byte) $f
(byte*) main::toD0181_screen
(label) main::toSpritePtr2
(byte) main::toSpritePtr2_return
(const byte) main::toSpritePtr2_return#0 toSpritePtr2_return = (byte)(word)(const byte*) SIN_SPRITE/(byte) $40
(byte*) main::toSpritePtr2_sprite
(label) main::toSpritePtr1
(byte) main::toSpritePtr1_return
(const byte) main::toSpritePtr1_return#0 toSpritePtr1_return = (byte)(word)(const byte*) SIN_SPRITE/(byte) $40
(byte*) main::toSpritePtr1_sprite
(label) main::vicSelectGfxBank1
(label) main::vicSelectGfxBank1_@1
(byte*) main::vicSelectGfxBank1_gfx
@ -133,10 +133,10 @@ 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
(volatile byte) sprites_irq::raster_sprite_gfx_modify loadstore zp[1]:10 6.5
(label) sprites_irq::toSpritePtr2
(byte) sprites_irq::toSpritePtr2_return
(const byte) sprites_irq::toSpritePtr2_return#0 toSpritePtr2_return = (byte)(word)(const nomodify byte*) PLAYFIELD_SPRITES/(byte) $40
(byte*) sprites_irq::toSpritePtr2_sprite
(label) sprites_irq::toSpritePtr1
(byte) sprites_irq::toSpritePtr1_return
(const byte) sprites_irq::toSpritePtr1_return#0 toSpritePtr1_return = (byte)(word)(const nomodify byte*) PLAYFIELD_SPRITES/(byte) $40
(byte*) sprites_irq::toSpritePtr1_sprite
(byte) sprites_irq::ypos
(byte) sprites_irq::ypos#0 reg byte a 2.5
(void()) sprites_irq_init()

View File

@ -1907,7 +1907,7 @@ sid_rnd_init: {
// Repeats 10 timers every 2 lines from line IRQ_RASTER_FIRST
// Utilizes duplicated gfx in the sprites to allow for some leeway in updating the sprite pointers
sprites_irq: {
.const toSpritePtr2_return = PLAYFIELD_SPRITES/$40
.const toSpritePtr1_return = PLAYFIELD_SPRITES/$40
.label raster_sprite_gfx_modify = $3d
sta rega+1
stx regx+1
@ -2020,7 +2020,7 @@ sprites_irq: {
lda #SPRITES_FIRST_YPOS
sta.z irq_sprite_ypos
// irq_sprite_ptr = toSpritePtr(PLAYFIELD_SPRITES)
lda #toSpritePtr2_return
lda #toSpritePtr1_return
sta.z irq_sprite_ptr
jmp __b5
__b1:

View File

@ -1244,12 +1244,12 @@ sprites_irq::@4: scope:[sprites_irq] from sprites_irq::@6
sprites_irq::@3: scope:[sprites_irq] from sprites_irq::@2
[579] (volatile byte) irq_raster_next ← (volatile byte) irq_raster_next + (byte) $15
[580] (volatile byte) irq_sprite_ypos ← (const nomodify byte) SPRITES_FIRST_YPOS
to:sprites_irq::toSpritePtr2
sprites_irq::toSpritePtr2: scope:[sprites_irq] from sprites_irq::@3
to:sprites_irq::toSpritePtr1
sprites_irq::toSpritePtr1: scope:[sprites_irq] from sprites_irq::@3
[581] phi()
to:sprites_irq::@11
sprites_irq::@11: scope:[sprites_irq] from sprites_irq::toSpritePtr2
[582] (volatile byte) irq_sprite_ptr ← (const byte) sprites_irq::toSpritePtr2_return#0
sprites_irq::@11: scope:[sprites_irq] from sprites_irq::toSpritePtr1
[582] (volatile byte) irq_sprite_ptr ← (const byte) sprites_irq::toSpritePtr1_return#0
to:sprites_irq::@5
sprites_irq::@1: scope:[sprites_irq] from sprites_irq::@9
[583] *((const nomodify byte*) PLAYFIELD_SPRITE_PTRS_1) ← (byte) sprites_irq::ptr#0

View File

@ -84,7 +84,7 @@ Culled Empty Block (label) sprites_init::@2
Culled Empty Block (label) toSpritePtr1_@1
Culled Empty Block (label) @24
Culled Empty Block (label) sprites_irq::@14
Culled Empty Block (label) sprites_irq::toSpritePtr2_@1
Culled Empty Block (label) sprites_irq::toSpritePtr1_@1
Culled Empty Block (label) sprites_irq::@5
Culled Empty Block (label) sprites_irq::@9
Culled Empty Block (label) sprites_irq::@10
@ -1255,22 +1255,22 @@ sprites_irq::@2: scope:[sprites_irq] from sprites_irq::@1 sprites_irq::@13
sprites_irq::@3: scope:[sprites_irq] from sprites_irq::@2
(volatile byte) irq_raster_next ← (volatile byte) irq_raster_next + (number) $15
(volatile byte) irq_sprite_ypos ← (const nomodify byte) SPRITES_FIRST_YPOS
(byte*) sprites_irq::toSpritePtr2_sprite#0 ← (const nomodify byte*) PLAYFIELD_SPRITES
to:sprites_irq::toSpritePtr2
sprites_irq::toSpritePtr2: scope:[sprites_irq] from sprites_irq::@3
(byte*) sprites_irq::toSpritePtr2_sprite#1 ← phi( sprites_irq::@3/(byte*) sprites_irq::toSpritePtr2_sprite#0 )
(word~) sprites_irq::toSpritePtr2_$0 ← ((word)) (byte*) sprites_irq::toSpritePtr2_sprite#1
(number~) sprites_irq::toSpritePtr2_$1 ← (word~) sprites_irq::toSpritePtr2_$0 / (number) $40
(byte~) sprites_irq::toSpritePtr2_$2 ← ((byte)) (number~) sprites_irq::toSpritePtr2_$1
(byte) sprites_irq::toSpritePtr2_return#0 ← (byte~) sprites_irq::toSpritePtr2_$2
to:sprites_irq::toSpritePtr2_@return
sprites_irq::toSpritePtr2_@return: scope:[sprites_irq] from sprites_irq::toSpritePtr2
(byte) sprites_irq::toSpritePtr2_return#2 ← phi( sprites_irq::toSpritePtr2/(byte) sprites_irq::toSpritePtr2_return#0 )
(byte) sprites_irq::toSpritePtr2_return#1 ← (byte) sprites_irq::toSpritePtr2_return#2
(byte*) sprites_irq::toSpritePtr1_sprite#0 ← (const nomodify byte*) PLAYFIELD_SPRITES
to:sprites_irq::toSpritePtr1
sprites_irq::toSpritePtr1: scope:[sprites_irq] from sprites_irq::@3
(byte*) sprites_irq::toSpritePtr1_sprite#1 ← phi( sprites_irq::@3/(byte*) sprites_irq::toSpritePtr1_sprite#0 )
(word~) sprites_irq::toSpritePtr1_$0 ← ((word)) (byte*) sprites_irq::toSpritePtr1_sprite#1
(number~) sprites_irq::toSpritePtr1_$1 ← (word~) sprites_irq::toSpritePtr1_$0 / (number) $40
(byte~) sprites_irq::toSpritePtr1_$2 ← ((byte)) (number~) sprites_irq::toSpritePtr1_$1
(byte) sprites_irq::toSpritePtr1_return#0 ← (byte~) sprites_irq::toSpritePtr1_$2
to:sprites_irq::toSpritePtr1_@return
sprites_irq::toSpritePtr1_@return: scope:[sprites_irq] from sprites_irq::toSpritePtr1
(byte) sprites_irq::toSpritePtr1_return#2 ← phi( sprites_irq::toSpritePtr1/(byte) sprites_irq::toSpritePtr1_return#0 )
(byte) sprites_irq::toSpritePtr1_return#1 ← (byte) sprites_irq::toSpritePtr1_return#2
to:sprites_irq::@15
sprites_irq::@15: scope:[sprites_irq] from sprites_irq::toSpritePtr2_@return
(byte) sprites_irq::toSpritePtr2_return#3 ← phi( sprites_irq::toSpritePtr2_@return/(byte) sprites_irq::toSpritePtr2_return#1 )
(byte~) sprites_irq::$5 ← (byte) sprites_irq::toSpritePtr2_return#3
sprites_irq::@15: scope:[sprites_irq] from sprites_irq::toSpritePtr1_@return
(byte) sprites_irq::toSpritePtr1_return#3 ← phi( sprites_irq::toSpritePtr1_@return/(byte) sprites_irq::toSpritePtr1_return#1 )
(byte~) sprites_irq::$5 ← (byte) sprites_irq::toSpritePtr1_return#3
(volatile byte) irq_sprite_ptr ← (byte~) sprites_irq::$5
to:sprites_irq::@6
sprites_irq::@7: scope:[sprites_irq] from sprites_irq::@2
@ -6209,19 +6209,19 @@ interrupt(HARDWARE_CLOBBER)(void()) sprites_irq()
(byte) sprites_irq::ptr#5
(byte) sprites_irq::ptr#6
(volatile byte) sprites_irq::raster_sprite_gfx_modify loadstore
(label) sprites_irq::toSpritePtr2
(word~) sprites_irq::toSpritePtr2_$0
(number~) sprites_irq::toSpritePtr2_$1
(byte~) sprites_irq::toSpritePtr2_$2
(label) sprites_irq::toSpritePtr2_@return
(byte) sprites_irq::toSpritePtr2_return
(byte) sprites_irq::toSpritePtr2_return#0
(byte) sprites_irq::toSpritePtr2_return#1
(byte) sprites_irq::toSpritePtr2_return#2
(byte) sprites_irq::toSpritePtr2_return#3
(byte*) sprites_irq::toSpritePtr2_sprite
(byte*) sprites_irq::toSpritePtr2_sprite#0
(byte*) sprites_irq::toSpritePtr2_sprite#1
(label) sprites_irq::toSpritePtr1
(word~) sprites_irq::toSpritePtr1_$0
(number~) sprites_irq::toSpritePtr1_$1
(byte~) sprites_irq::toSpritePtr1_$2
(label) sprites_irq::toSpritePtr1_@return
(byte) sprites_irq::toSpritePtr1_return
(byte) sprites_irq::toSpritePtr1_return#0
(byte) sprites_irq::toSpritePtr1_return#1
(byte) sprites_irq::toSpritePtr1_return#2
(byte) sprites_irq::toSpritePtr1_return#3
(byte*) sprites_irq::toSpritePtr1_sprite
(byte*) sprites_irq::toSpritePtr1_sprite#0
(byte*) sprites_irq::toSpritePtr1_sprite#1
(byte) sprites_irq::ypos
(byte) sprites_irq::ypos#0
(void()) sprites_irq_init()
@ -6366,8 +6366,8 @@ Adding number conversion cast (unumber) 2 in *((const nomodify byte*) PLAYFIELD_
Adding number conversion cast (unumber) 3 in *((const nomodify byte*) PLAYFIELD_SPRITE_PTRS_2 + (number) 3) ← (byte) sprites_irq::ptr#4
Adding number conversion cast (unumber) 9 in (bool~) sprites_irq::$2 ← (volatile byte) irq_cnt == (number) 9
Adding number conversion cast (unumber) $15 in (volatile byte) irq_raster_next ← (volatile byte) irq_raster_next + (number) $15
Adding number conversion cast (unumber) $40 in (number~) sprites_irq::toSpritePtr2_$1 ← (word~) sprites_irq::toSpritePtr2_$0 / (number) $40
Adding number conversion cast (unumber) sprites_irq::toSpritePtr2_$1 in (number~) sprites_irq::toSpritePtr2_$1 ← (word~) sprites_irq::toSpritePtr2_$0 / (unumber)(number) $40
Adding number conversion cast (unumber) $40 in (number~) sprites_irq::toSpritePtr1_$1 ← (word~) sprites_irq::toSpritePtr1_$0 / (number) $40
Adding number conversion cast (unumber) sprites_irq::toSpritePtr1_$1 in (number~) sprites_irq::toSpritePtr1_$1 ← (word~) sprites_irq::toSpritePtr1_$0 / (unumber)(number) $40
Adding number conversion cast (unumber) $a in (bool~) sprites_irq::$3 ← (volatile byte) irq_cnt == (number) $a
Adding number conversion cast (unumber) 0 in (volatile byte) irq_cnt ← (number) 0
Adding number conversion cast (unumber) $15 in (volatile byte) irq_sprite_ypos ← (volatile byte) irq_sprite_ypos + (number) $15
@ -6461,8 +6461,8 @@ Inlining cast *((const nomodify byte*) SPRITES_ENABLE) ← (unumber)(number) $f
Inlining cast *((const nomodify byte*) SPRITES_MC) ← (unumber)(number) 0
Inlining cast (word~) toSpritePtr1_$0 ← (word)(byte*) toSpritePtr1_sprite#1
Inlining cast (byte~) toSpritePtr1_$2 ← (byte)(unumber~) toSpritePtr1_$1
Inlining cast (word~) sprites_irq::toSpritePtr2_$0 ← (word)(byte*) sprites_irq::toSpritePtr2_sprite#1
Inlining cast (byte~) sprites_irq::toSpritePtr2_$2 ← (byte)(unumber~) sprites_irq::toSpritePtr2_$1
Inlining cast (word~) sprites_irq::toSpritePtr1_$0 ← (word)(byte*) sprites_irq::toSpritePtr1_sprite#1
Inlining cast (byte~) sprites_irq::toSpritePtr1_$2 ← (byte)(unumber~) sprites_irq::toSpritePtr1_$1
Inlining cast (volatile byte) irq_cnt ← (unumber)(number) 0
Inlining cast (byte) play_move_down::return#1 ← (unumber)(number) 0
Inlining cast (byte) current_movedown_counter#4 ← (unumber)(number) 0
@ -6847,7 +6847,7 @@ Inferred type updated to byte in (unumber~) sprites_init::$1 ← (byte) sprites_
Inferred type updated to word in (unumber~) toSpritePtr1_$1 ← (word~) toSpritePtr1_$0 / (byte) $40
Inferred type updated to byte in (unumber~) $1 ← (byte~) $0 + (byte) 3
Inferred type updated to byte in (unumber~) sprites_irq::$0 ← (volatile byte) irq_raster_next + (byte) 1
Inferred type updated to word in (unumber~) sprites_irq::toSpritePtr2_$1 ← (word~) sprites_irq::toSpritePtr2_$0 / (byte) $40
Inferred type updated to word in (unumber~) sprites_irq::toSpritePtr1_$1 ← (word~) sprites_irq::toSpritePtr1_$0 / (byte) $40
Inferred type updated to byte in (unumber~) play_move_down::$11 ← (byte) current_ypos#16 + (byte) 1
Inferred type updated to byte in (unumber~) play_move_leftright::$7 ← (byte) current_xpos#23 - (byte) 1
Inferred type updated to byte in (unumber~) play_move_leftright::$3 ← (byte) current_xpos#24 + (byte) 1
@ -6893,7 +6893,7 @@ Inversing boolean not [1027] (bool~) play_increase_level::$3 ← (byte~) play_in
Inversing boolean not [1135] (bool~) main::$18 ← (byte) main::render#2 == (byte) 0 from [1134] (bool~) main::$17 ← (byte) main::render#2 != (byte) 0
Successful SSA optimization Pass2UnaryNotSimplification
Alias candidate removed (volatile)render_screen_show#11 = render_screen_showing
Alias candidate removed (volatile)sprites_irq::toSpritePtr2_return#0 = irq_sprite_ptr $1 sprites_irq::toSpritePtr2_$2 sprites_irq::toSpritePtr2_return#2 sprites_irq::toSpritePtr2_return#1 sprites_irq::toSpritePtr2_return#3 sprites_irq::$5
Alias candidate removed (volatile)sprites_irq::toSpritePtr1_return#0 = irq_sprite_ptr $1 sprites_irq::toSpritePtr1_$2 sprites_irq::toSpritePtr1_return#2 sprites_irq::toSpritePtr1_return#1 sprites_irq::toSpritePtr1_return#3 sprites_irq::$5
Alias candidate removed (volatile)sprites_irq::raster_sprite_gfx_modify = sprites_irq::$0
Alias keyboard_matrix_read::return#0 = keyboard_matrix_read::row_pressed_bits#0 keyboard_matrix_read::$0 keyboard_matrix_read::return#3 keyboard_matrix_read::return#1
Alias keyboard_matrix_read::return#2 = keyboard_matrix_read::return#4
@ -7014,7 +7014,7 @@ Alias sprites_init::xpos#1 = sprites_init::$1
Alias toSpritePtr1_sprite#0 = toSpritePtr1_sprite#1
Alias toSpritePtr1_return#0 = toSpritePtr1_$2 toSpritePtr1_return#2 toSpritePtr1_return#1 toSpritePtr1_return#3 $0
Alias sprites_irq::ptr#0 = sprites_irq::ptr#5 sprites_irq::ptr#6
Alias sprites_irq::toSpritePtr2_sprite#0 = sprites_irq::toSpritePtr2_sprite#1
Alias sprites_irq::toSpritePtr1_sprite#0 = sprites_irq::toSpritePtr1_sprite#1
Alias level#13 = level#28
Alias current_movedown_slow#16 = current_movedown_slow#29 current_movedown_slow#2
Alias play_move_down::return#0 = play_move_down::return#4
@ -7408,7 +7408,7 @@ Alias level#11 = level#25
Alias level_bcd#12 = level_bcd#25
Successful SSA optimization Pass2AliasElimination
Alias candidate removed (volatile)render_screen_show#10 = render_screen_show#11 render_screen_showing
Alias candidate removed (volatile)sprites_irq::toSpritePtr2_return#0 = irq_sprite_ptr $1 sprites_irq::toSpritePtr2_$2 sprites_irq::toSpritePtr2_return#2 sprites_irq::toSpritePtr2_return#1 sprites_irq::toSpritePtr2_return#3 sprites_irq::$5
Alias candidate removed (volatile)sprites_irq::toSpritePtr1_return#0 = irq_sprite_ptr $1 sprites_irq::toSpritePtr1_$2 sprites_irq::toSpritePtr1_return#2 sprites_irq::toSpritePtr1_return#1 sprites_irq::toSpritePtr1_return#3 sprites_irq::$5
Alias candidate removed (volatile)sprites_irq::raster_sprite_gfx_modify = sprites_irq::$0
Alias keyboard_event_scan::keycode#10 = keyboard_event_scan::keycode#4
Alias keyboard_event_scan::col#2 = keyboard_event_scan::col#3
@ -7498,7 +7498,7 @@ Alias level#21 = level#77 level#65
Alias current_movedown_slow#65 = current_movedown_slow#72
Successful SSA optimization Pass2AliasElimination
Alias candidate removed (volatile)render_screen_show#10 = render_screen_show#11 render_screen_showing
Alias candidate removed (volatile)sprites_irq::toSpritePtr2_return#0 = irq_sprite_ptr $1 sprites_irq::toSpritePtr2_$2 sprites_irq::toSpritePtr2_return#2 sprites_irq::toSpritePtr2_return#1 sprites_irq::toSpritePtr2_return#3 sprites_irq::$5
Alias candidate removed (volatile)sprites_irq::toSpritePtr1_return#0 = irq_sprite_ptr $1 sprites_irq::toSpritePtr1_$2 sprites_irq::toSpritePtr1_return#2 sprites_irq::toSpritePtr1_return#1 sprites_irq::toSpritePtr1_return#3 sprites_irq::$5
Alias candidate removed (volatile)sprites_irq::raster_sprite_gfx_modify = sprites_irq::$0
Identical Phi Values (byte) keyboard_matrix_read::rowid#1 (byte) keyboard_matrix_read::rowid#0
Identical Phi Values (byte) keyboard_events_size#53 (byte) keyboard_events_size#26
@ -7531,8 +7531,8 @@ Identical Phi Values (byte) render_screen_render#41 (byte) render_screen_render#
Identical Phi Values (byte) current_xpos#78 (byte) current_xpos#16
Identical Phi Values (byte) render_next::next_piece_char#1 (byte) render_next::next_piece_char#3
Identical Phi Values (byte) render_next::l#2 (byte) render_next::l#7
Identical Phi Values (byte) sprites_irq::toSpritePtr2_return#2 (byte) sprites_irq::toSpritePtr2_return#0
Identical Phi Values (byte) sprites_irq::toSpritePtr2_return#3 (byte) sprites_irq::toSpritePtr2_return#1
Identical Phi Values (byte) sprites_irq::toSpritePtr1_return#2 (byte) sprites_irq::toSpritePtr1_return#0
Identical Phi Values (byte) sprites_irq::toSpritePtr1_return#3 (byte) sprites_irq::toSpritePtr1_return#1
Identical Phi Values (byte) level#44 (byte) level#100
Identical Phi Values (byte) level#13 (byte) level#44
Identical Phi Values (byte) current_movedown_slow#16 (byte) current_movedown_slow#1
@ -7924,7 +7924,7 @@ Constant (const byte) render_next::c#0 = 0
Constant (const byte) sprites_init::xpos#0 = (byte)$18+$f*8
Constant (const byte) sprites_init::s#0 = 0
Constant (const byte*) toSpritePtr1_sprite#0 = PLAYFIELD_SPRITES
Constant (const byte*) sprites_irq::toSpritePtr2_sprite#0 = PLAYFIELD_SPRITES
Constant (const byte*) sprites_irq::toSpritePtr1_sprite#0 = PLAYFIELD_SPRITES
Constant (const byte) next_piece_idx#0 = 0
Constant (const byte*) current_piece#0 = (byte*) 0
Constant (const byte) current_orientation#0 = 0
@ -7978,7 +7978,7 @@ Constant (const word) render_show::toD0181_$4 = (word)render_show::toD0181_gfx#0
Constant (const word) render_show::toD0182_$0 = (word)render_show::toD0182_screen#0
Constant (const word) render_show::toD0182_$4 = (word)render_show::toD0182_gfx#0
Constant (const word) toSpritePtr1_$0 = (word)toSpritePtr1_sprite#0
Constant (const word) sprites_irq::toSpritePtr2_$0 = (word)sprites_irq::toSpritePtr2_sprite#0
Constant (const word) sprites_irq::toSpritePtr1_$0 = (word)sprites_irq::toSpritePtr1_sprite#0
Constant (const byte) play_collision::orientation#4 = current_orientation#68
Successful SSA optimization Pass2ConstantIdentification
if() condition always true - replacing block destination [762] if(true) goto main::@4
@ -8184,14 +8184,14 @@ Finalized unsigned number type (byte) 1
Finalized unsigned number type (byte) 1
Finalized unsigned number type (byte) 5
Successful SSA optimization PassNFinalizeNumberTypeConversions
Alias candidate removed (volatile)sprites_irq::toSpritePtr2_return#0 = irq_sprite_ptr $1 sprites_irq::toSpritePtr2_$2 sprites_irq::toSpritePtr2_return#1 sprites_irq::$5
Alias candidate removed (volatile)sprites_irq::toSpritePtr1_return#0 = irq_sprite_ptr $1 sprites_irq::toSpritePtr1_$2 sprites_irq::toSpritePtr1_return#1 sprites_irq::$5
Alias candidate removed (volatile)sprites_irq::raster_sprite_gfx_modify = sprites_irq::$0
Alias render_init::$5 = render_init::$4
Alias play_movement::render#1 = play_movement::$0
Alias current_piece_gfx#74 = current_piece#5
Alias main::render#1 = main::render#2
Successful SSA optimization Pass2AliasElimination
Alias candidate removed (volatile)sprites_irq::toSpritePtr2_return#0 = irq_sprite_ptr $1 sprites_irq::toSpritePtr2_$2 sprites_irq::toSpritePtr2_return#1 sprites_irq::$5
Alias candidate removed (volatile)sprites_irq::toSpritePtr1_return#0 = irq_sprite_ptr $1 sprites_irq::toSpritePtr1_$2 sprites_irq::toSpritePtr1_return#1 sprites_irq::$5
Alias candidate removed (volatile)sprites_irq::raster_sprite_gfx_modify = sprites_irq::$0
Identical Phi Values (byte) current_movedown_slow#55 (byte) current_movedown_slow#21
Identical Phi Values (byte*) current_piece#50 (byte*) current_piece#15
@ -8213,7 +8213,7 @@ Constant right-side identified [90] (byte~) render_show::toD0181_$5 ← > (const
Constant right-side identified [94] (word~) render_show::toD0182_$1 ← (const word) render_show::toD0182_$0 & (word) $3fff
Constant right-side identified [97] (byte~) render_show::toD0182_$5 ← > (const word) render_show::toD0182_$4
Constant right-side identified [242] (word~) toSpritePtr1_$1 ← (const word) toSpritePtr1_$0 / (byte) $40
Constant right-side identified [286] (word~) sprites_irq::toSpritePtr2_$1 ← (const word) sprites_irq::toSpritePtr2_$0 / (byte) $40
Constant right-side identified [286] (word~) sprites_irq::toSpritePtr1_$1 ← (const word) sprites_irq::toSpritePtr1_$0 / (byte) $40
Constant right-side identified [343] (byte) play_move_down::movedown#1 ← ++ (const byte) play_move_down::movedown#0
Successful SSA optimization Pass2ConstantRValueConsolidation
Constant (const byte) render_init::vicSelectGfxBank1_toDd001_$1 = >render_init::vicSelectGfxBank1_toDd001_$0
@ -8222,17 +8222,17 @@ Constant (const byte) render_show::toD0181_$5 = >render_show::toD0181_$4
Constant (const word) render_show::toD0182_$1 = render_show::toD0182_$0&$3fff
Constant (const byte) render_show::toD0182_$5 = >render_show::toD0182_$4
Constant (const word) toSpritePtr1_$1 = toSpritePtr1_$0/$40
Constant (const word) sprites_irq::toSpritePtr2_$1 = sprites_irq::toSpritePtr2_$0/$40
Constant (const word) sprites_irq::toSpritePtr1_$1 = sprites_irq::toSpritePtr1_$0/$40
Constant (const byte) play_move_down::movedown#1 = ++play_move_down::movedown#0
Successful SSA optimization Pass2ConstantIdentification
Constant (const byte) toSpritePtr1_return#0 = (byte)toSpritePtr1_$1
Constant (const byte) sprites_irq::toSpritePtr2_$2 = (byte)sprites_irq::toSpritePtr2_$1
Constant (const byte) sprites_irq::toSpritePtr1_$2 = (byte)sprites_irq::toSpritePtr1_$1
Successful SSA optimization Pass2ConstantIdentification
Constant (const byte) sprites_irq::toSpritePtr2_return#0 = sprites_irq::toSpritePtr2_$2
Constant (const byte) sprites_irq::toSpritePtr1_return#0 = sprites_irq::toSpritePtr1_$2
Successful SSA optimization Pass2ConstantIdentification
Constant (const byte) sprites_irq::toSpritePtr2_return#1 = sprites_irq::toSpritePtr2_return#0
Constant (const byte) sprites_irq::toSpritePtr1_return#1 = sprites_irq::toSpritePtr1_return#0
Successful SSA optimization Pass2ConstantIdentification
Constant (const byte) sprites_irq::$5 = sprites_irq::toSpritePtr2_return#1
Constant (const byte) sprites_irq::$5 = sprites_irq::toSpritePtr1_return#1
Successful SSA optimization Pass2ConstantIdentification
Alias candidate removed (volatile)irq_sprite_ptr = $1
Alias candidate removed (volatile)sprites_irq::raster_sprite_gfx_modify = sprites_irq::$0
@ -8342,7 +8342,7 @@ Inlining constant with var siblings (const byte) render_next::l#0
Inlining constant with var siblings (const byte) render_next::c#0
Inlining constant with var siblings (const byte) sprites_init::xpos#0
Inlining constant with var siblings (const byte) sprites_init::s#0
Inlining constant with different constant siblings (const byte) sprites_irq::toSpritePtr2_return#1
Inlining constant with different constant siblings (const byte) sprites_irq::toSpritePtr1_return#1
Inlining constant with var siblings (const byte) play_init::idx#0
Inlining constant with var siblings (const byte*) play_init::pli#0
Inlining constant with var siblings (const byte) play_init::j#0
@ -8397,12 +8397,10 @@ Constant inlined render_show::toD0182_$0 = (word)(const nomodify byte*) PLAYFIEL
Constant inlined play_move_rotate::return#1 = (byte) 0
Constant inlined render_show::toD0182_$1 = (word)(const nomodify byte*) PLAYFIELD_SCREEN_2&(word) $3fff
Constant inlined play_move_rotate::return#4 = (byte) 1
Constant inlined sprites_irq::toSpritePtr1_sprite#0 = (const nomodify byte*) PLAYFIELD_SPRITES
Constant inlined render_show::toD0182_$2 = (word)(const nomodify byte*) PLAYFIELD_SCREEN_2&(word) $3fff*(byte) 4
Constant inlined play_move_rotate::return#3 = (byte) 0
Constant inlined sprites_irq::toSpritePtr2_$2 = (byte)(word)(const nomodify byte*) PLAYFIELD_SPRITES/(byte) $40
Constant inlined sprites_irq::toSpritePtr2_$1 = (word)(const nomodify byte*) PLAYFIELD_SPRITES/(byte) $40
Constant inlined current_movedown_counter#0 = (byte) 0
Constant inlined sprites_irq::toSpritePtr2_$0 = (word)(const nomodify byte*) PLAYFIELD_SPRITES
Constant inlined current_movedown_counter#4 = (byte) 0
Constant inlined render_screen_original::screen#1 = (const nomodify byte*) PLAYFIELD_SCREEN_2
Constant inlined render_screen_original::screen#0 = (const nomodify byte*) PLAYFIELD_SCREEN_1
@ -8429,7 +8427,7 @@ Constant inlined render_next::screen_next_area#1 = (const nomodify byte*) PLAYFI
Constant inlined render_next::screen_next_area#2 = (const nomodify byte*) PLAYFIELD_SCREEN_2+(const word) render_next::next_area_offset
Constant inlined keyboard_event_scan::col#0 = (byte) 0
Constant inlined lines_bcd#0 = (word) 0
Constant inlined sprites_irq::$5 = (const byte) sprites_irq::toSpritePtr2_return#0
Constant inlined sprites_irq::$5 = (const byte) sprites_irq::toSpritePtr1_return#0
Constant inlined render_show::toD0181_screen#0 = (const nomodify byte*) PLAYFIELD_SCREEN_1
Constant inlined render_playfield::l#0 = (byte) 2
Constant inlined render_moving::c#0 = (byte) 0
@ -8469,14 +8467,18 @@ Constant inlined play_spawn_current::piece_idx#0 = (byte) 7
Constant inlined play_remove_lines::removed#0 = (byte) 0
Constant inlined play_remove_lines::full#1 = (byte) 0
Constant inlined play_remove_lines::full#0 = (byte) 1
Constant inlined sprites_irq::toSpritePtr1_return#1 = (const byte) sprites_irq::toSpritePtr1_return#0
Constant inlined sprites_init::s#0 = (byte) 0
Constant inlined render_moving::l#0 = (byte) 0
Constant inlined play_move_leftright::return#1 = (byte) 1
Constant inlined play_move_leftright::return#4 = (byte) 1
Constant inlined play_move_leftright::return#3 = (byte) 0
Constant inlined next_piece_idx#0 = (byte) 0
Constant inlined sprites_irq::toSpritePtr1_$2 = (byte)(word)(const nomodify byte*) PLAYFIELD_SPRITES/(byte) $40
Constant inlined render_show::toD0181_$1 = (word)(const nomodify byte*) PLAYFIELD_SCREEN_1&(word) $3fff
Constant inlined render_show::toD0181_$0 = (word)(const nomodify byte*) PLAYFIELD_SCREEN_1
Constant inlined sprites_irq::toSpritePtr1_$1 = (word)(const nomodify byte*) PLAYFIELD_SPRITES/(byte) $40
Constant inlined sprites_irq::toSpritePtr1_$0 = (word)(const nomodify byte*) PLAYFIELD_SPRITES
Constant inlined keyboard_event_scan::keycode#0 = (byte) 0
Constant inlined play_collision::c#0 = (byte) 0
Constant inlined render_show::toD0181_$7 = >(word)(const nomodify byte*) PLAYFIELD_CHARSET/(byte) 4&(byte) $f
@ -8492,7 +8494,6 @@ Constant inlined play_remove_lines::w#0 = (const nomodify byte) PLAYFIELD_LINES*
Constant inlined play_init::j#0 = (byte) 0
Constant inlined render_screen_original::ocols#0 = (const to_nomodify byte*) PLAYFIELD_COLORS_ORIGINAL+(byte)(number) $20*(number) 2
Constant inlined play_lock_current::c#0 = (byte) 0
Constant inlined sprites_irq::toSpritePtr2_return#1 = (const byte) sprites_irq::toSpritePtr2_return#0
Constant inlined keyboard_event_scan::row#0 = (byte) 0
Constant inlined play_init::b#0 = (byte) 0
Constant inlined render_next::c#0 = (byte) 0
@ -8509,7 +8510,6 @@ Constant inlined render_score::screen#1 = (const nomodify byte*) PLAYFIELD_SCREE
Constant inlined play_increase_level::b#0 = (byte) 0
Constant inlined render_screen_show#1 = (byte) 0
Constant inlined render_score::screen#2 = (const nomodify byte*) PLAYFIELD_SCREEN_2
Constant inlined sprites_irq::toSpritePtr2_sprite#0 = (const nomodify byte*) PLAYFIELD_SPRITES
Constant inlined play_collision::l#0 = (byte) 0
Constant inlined keyboard_event_get::return#0 = (byte) $ff
Constant inlined render_init::li_1#0 = (const nomodify byte*) PLAYFIELD_SCREEN_1+(byte)(number) 2*(number) $28+(byte) $10
@ -8639,8 +8639,8 @@ Adding NOP phi() at start of render_init::vicSelectGfxBank1_toDd001_@return
Adding NOP phi() at start of render_init::@4
Adding NOP phi() at start of render_init::@5
Adding NOP phi() at start of render_init::@2
Adding NOP phi() at start of sprites_irq::toSpritePtr2
Adding NOP phi() at start of sprites_irq::toSpritePtr2_@return
Adding NOP phi() at start of sprites_irq::toSpritePtr1
Adding NOP phi() at start of sprites_irq::toSpritePtr1_@return
CALL GRAPH
Calls in [] to main:14
Calls in [main] to sid_rnd_init:18 render_init:20 sprites_init:22 sprites_irq_init:24 play_init:26 play_spawn_current:28 play_spawn_current:31 render_playfield:33 render_moving:38 render_next:40 render_show:52 keyboard_event_scan:54 keyboard_event_get:56 play_movement:63 render_playfield:68 render_moving:74 render_next:77 render_score:79 render_screen_swap:81
@ -9020,7 +9020,7 @@ Culled Empty Block (label) render_screen_original::@9
Culled Empty Block (label) render_screen_original::@14
Culled Empty Block (label) render_screen_original::@12
Culled Empty Block (label) render_screen_original::@10
Culled Empty Block (label) sprites_irq::toSpritePtr2_@return
Culled Empty Block (label) sprites_irq::toSpritePtr1_@return
Renumbering block @13 to @1
Renumbering block @22 to @2
Renumbering block @23 to @3
@ -9188,7 +9188,7 @@ Adding NOP phi() at start of play_init
Adding NOP phi() at start of render_init
Adding NOP phi() at start of render_init::vicSelectGfxBank1_toDd001
Adding NOP phi() at start of render_init::@3
Adding NOP phi() at start of sprites_irq::toSpritePtr2
Adding NOP phi() at start of sprites_irq::toSpritePtr1
FINAL CONTROL FLOW GRAPH
@begin: scope:[] from
@ -10437,12 +10437,12 @@ sprites_irq::@4: scope:[sprites_irq] from sprites_irq::@6
sprites_irq::@3: scope:[sprites_irq] from sprites_irq::@2
[579] (volatile byte) irq_raster_next ← (volatile byte) irq_raster_next + (byte) $15
[580] (volatile byte) irq_sprite_ypos ← (const nomodify byte) SPRITES_FIRST_YPOS
to:sprites_irq::toSpritePtr2
sprites_irq::toSpritePtr2: scope:[sprites_irq] from sprites_irq::@3
to:sprites_irq::toSpritePtr1
sprites_irq::toSpritePtr1: scope:[sprites_irq] from sprites_irq::@3
[581] phi()
to:sprites_irq::@11
sprites_irq::@11: scope:[sprites_irq] from sprites_irq::toSpritePtr2
[582] (volatile byte) irq_sprite_ptr ← (const byte) sprites_irq::toSpritePtr2_return#0
sprites_irq::@11: scope:[sprites_irq] from sprites_irq::toSpritePtr1
[582] (volatile byte) irq_sprite_ptr ← (const byte) sprites_irq::toSpritePtr1_return#0
to:sprites_irq::@5
sprites_irq::@1: scope:[sprites_irq] from sprites_irq::@9
[583] *((const nomodify byte*) PLAYFIELD_SPRITE_PTRS_1) ← (byte) sprites_irq::ptr#0
@ -11022,8 +11022,8 @@ interrupt(HARDWARE_CLOBBER)(void()) sprites_irq()
(byte) sprites_irq::ptr#3 2.6666666666666665
(byte) sprites_irq::ptr#4 4.0
(volatile byte) sprites_irq::raster_sprite_gfx_modify loadstore 6.5
(byte) sprites_irq::toSpritePtr2_return
(byte*) sprites_irq::toSpritePtr2_sprite
(byte) sprites_irq::toSpritePtr1_return
(byte*) sprites_irq::toSpritePtr1_sprite
(byte) sprites_irq::ypos
(byte) sprites_irq::ypos#0 2.5
(void()) sprites_irq_init()
@ -15295,7 +15295,7 @@ sid_rnd_init: {
// Repeats 10 timers every 2 lines from line IRQ_RASTER_FIRST
// Utilizes duplicated gfx in the sprites to allow for some leeway in updating the sprite pointers
sprites_irq: {
.const toSpritePtr2_return = PLAYFIELD_SPRITES/$40
.const toSpritePtr1_return = PLAYFIELD_SPRITES/$40
.label __0 = $d9
.label raster_sprite_gfx_modify = $da
.label ypos = $d8
@ -15455,16 +15455,16 @@ sprites_irq: {
// [580] (volatile byte) irq_sprite_ypos ← (const nomodify byte) SPRITES_FIRST_YPOS -- vbuz1=vbuc1
lda #SPRITES_FIRST_YPOS
sta.z irq_sprite_ypos
// [581] phi from sprites_irq::@3 to sprites_irq::toSpritePtr2 [phi:sprites_irq::@3->sprites_irq::toSpritePtr2]
toSpritePtr2_from___b3:
jmp toSpritePtr2
// sprites_irq::toSpritePtr2
toSpritePtr2:
// [581] phi from sprites_irq::@3 to sprites_irq::toSpritePtr1 [phi:sprites_irq::@3->sprites_irq::toSpritePtr1]
toSpritePtr1_from___b3:
jmp toSpritePtr1
// sprites_irq::toSpritePtr1
toSpritePtr1:
jmp __b11
// sprites_irq::@11
__b11:
// [582] (volatile byte) irq_sprite_ptr ← (const byte) sprites_irq::toSpritePtr2_return#0 -- vbuz1=vbuc1
lda #toSpritePtr2_return
// [582] (volatile byte) irq_sprite_ptr ← (const byte) sprites_irq::toSpritePtr1_return#0 -- vbuz1=vbuc1
lda #toSpritePtr1_return
sta.z irq_sprite_ptr
jmp __b5
// sprites_irq::@1
@ -15859,7 +15859,7 @@ Statement [577] (volatile byte) irq_sprite_ypos ← (volatile byte) irq_sprite_y
Statement [578] (volatile byte) irq_sprite_ptr ← (volatile byte) irq_sprite_ptr + (byte) 3 [ irq_raster_next ] ( [ irq_raster_next ] { } ) always clobbers reg byte a reg byte x
Statement [579] (volatile byte) irq_raster_next ← (volatile byte) irq_raster_next + (byte) $15 [ irq_raster_next ] ( [ irq_raster_next ] { } ) always clobbers reg byte a reg byte x
Statement [580] (volatile byte) irq_sprite_ypos ← (const nomodify byte) SPRITES_FIRST_YPOS [ irq_raster_next ] ( [ irq_raster_next ] { } ) always clobbers reg byte a
Statement [582] (volatile byte) irq_sprite_ptr ← (const byte) sprites_irq::toSpritePtr2_return#0 [ irq_raster_next ] ( [ irq_raster_next ] { } ) always clobbers reg byte a
Statement [582] (volatile byte) irq_sprite_ptr ← (const byte) sprites_irq::toSpritePtr1_return#0 [ irq_raster_next ] ( [ irq_raster_next ] { } ) always clobbers reg byte a
Statement [1] (volatile byte) render_screen_showing ← (byte) 0 [ ] ( [ ] { } ) always clobbers reg byte a
Statement [2] (volatile dword) score_bcd ← (dword) 0 [ score_bcd ] ( [ score_bcd ] { } ) always clobbers reg byte a
Statement [5] (volatile byte) irq_raster_next ← (const nomodify byte) IRQ_RASTER_FIRST [ score_bcd ] ( [ score_bcd ] { } ) always clobbers reg byte a
@ -16034,7 +16034,7 @@ Statement [577] (volatile byte) irq_sprite_ypos ← (volatile byte) irq_sprite_y
Statement [578] (volatile byte) irq_sprite_ptr ← (volatile byte) irq_sprite_ptr + (byte) 3 [ irq_raster_next ] ( [ irq_raster_next ] { } ) always clobbers reg byte a reg byte x
Statement [579] (volatile byte) irq_raster_next ← (volatile byte) irq_raster_next + (byte) $15 [ irq_raster_next ] ( [ irq_raster_next ] { } ) always clobbers reg byte a reg byte x
Statement [580] (volatile byte) irq_sprite_ypos ← (const nomodify byte) SPRITES_FIRST_YPOS [ irq_raster_next ] ( [ irq_raster_next ] { } ) always clobbers reg byte a
Statement [582] (volatile byte) irq_sprite_ptr ← (const byte) sprites_irq::toSpritePtr2_return#0 [ irq_raster_next ] ( [ irq_raster_next ] { } ) always clobbers reg byte a
Statement [582] (volatile byte) irq_sprite_ptr ← (const byte) sprites_irq::toSpritePtr1_return#0 [ irq_raster_next ] ( [ irq_raster_next ] { } ) always clobbers reg byte a
Statement [1] (volatile byte) render_screen_showing ← (byte) 0 [ ] ( [ ] { } ) always clobbers reg byte a
Statement [2] (volatile dword) score_bcd ← (dword) 0 [ score_bcd ] ( [ score_bcd ] { } ) always clobbers reg byte a
Statement [5] (volatile byte) irq_raster_next ← (const nomodify byte) IRQ_RASTER_FIRST [ score_bcd ] ( [ score_bcd ] { } ) always clobbers reg byte a
@ -16205,7 +16205,7 @@ Statement [577] (volatile byte) irq_sprite_ypos ← (volatile byte) irq_sprite_y
Statement [578] (volatile byte) irq_sprite_ptr ← (volatile byte) irq_sprite_ptr + (byte) 3 [ irq_raster_next ] ( [ irq_raster_next ] { } ) always clobbers reg byte a reg byte x
Statement [579] (volatile byte) irq_raster_next ← (volatile byte) irq_raster_next + (byte) $15 [ irq_raster_next ] ( [ irq_raster_next ] { } ) always clobbers reg byte a reg byte x
Statement [580] (volatile byte) irq_sprite_ypos ← (const nomodify byte) SPRITES_FIRST_YPOS [ irq_raster_next ] ( [ irq_raster_next ] { } ) always clobbers reg byte a
Statement [582] (volatile byte) irq_sprite_ptr ← (const byte) sprites_irq::toSpritePtr2_return#0 [ irq_raster_next ] ( [ irq_raster_next ] { } ) always clobbers reg byte a
Statement [582] (volatile byte) irq_sprite_ptr ← (const byte) sprites_irq::toSpritePtr1_return#0 [ irq_raster_next ] ( [ irq_raster_next ] { } ) always clobbers reg byte a
Potential registers zp[1]:2 [ render_screen_show#16 render_screen_show#13 ] : zp[1]:2 ,
Potential registers zp[1]:3 [ render_screen_render#18 render_screen_render#11 ] : zp[1]:3 ,
Potential registers zp[1]:4 [ current_movedown_counter#16 current_movedown_counter#14 current_movedown_counter#12 ] : zp[1]:4 ,
@ -20061,7 +20061,7 @@ sid_rnd_init: {
// Repeats 10 timers every 2 lines from line IRQ_RASTER_FIRST
// Utilizes duplicated gfx in the sprites to allow for some leeway in updating the sprite pointers
sprites_irq: {
.const toSpritePtr2_return = PLAYFIELD_SPRITES/$40
.const toSpritePtr1_return = PLAYFIELD_SPRITES/$40
.label raster_sprite_gfx_modify = $3d
// entry interrupt(HARDWARE_CLOBBER)
sta rega+1
@ -20197,16 +20197,16 @@ sprites_irq: {
// [580] (volatile byte) irq_sprite_ypos ← (const nomodify byte) SPRITES_FIRST_YPOS -- vbuz1=vbuc1
lda #SPRITES_FIRST_YPOS
sta.z irq_sprite_ypos
// [581] phi from sprites_irq::@3 to sprites_irq::toSpritePtr2 [phi:sprites_irq::@3->sprites_irq::toSpritePtr2]
toSpritePtr2_from___b3:
jmp toSpritePtr2
// sprites_irq::toSpritePtr2
toSpritePtr2:
// [581] phi from sprites_irq::@3 to sprites_irq::toSpritePtr1 [phi:sprites_irq::@3->sprites_irq::toSpritePtr1]
toSpritePtr1_from___b3:
jmp toSpritePtr1
// sprites_irq::toSpritePtr1
toSpritePtr1:
jmp __b11
// sprites_irq::@11
__b11:
// [582] (volatile byte) irq_sprite_ptr ← (const byte) sprites_irq::toSpritePtr2_return#0 -- vbuz1=vbuc1
lda #toSpritePtr2_return
// [582] (volatile byte) irq_sprite_ptr ← (const byte) sprites_irq::toSpritePtr1_return#0 -- vbuz1=vbuc1
lda #toSpritePtr1_return
sta.z irq_sprite_ptr
jmp __b5
// sprites_irq::@1
@ -20518,7 +20518,7 @@ Removing instruction jmp __b6
Removing instruction jmp __b7
Removing instruction jmp __b5
Removing instruction jmp __breturn
Removing instruction jmp toSpritePtr2
Removing instruction jmp toSpritePtr1
Removing instruction jmp __b11
Succesful ASM optimization Pass5NextJumpElimination
Removing instruction lda #<0
@ -20720,8 +20720,8 @@ Removing instruction __b3_from___b3:
Removing instruction __b4_from___b3:
Removing instruction __b4_from___b4:
Removing instruction __breturn:
Removing instruction toSpritePtr2_from___b3:
Removing instruction toSpritePtr2:
Removing instruction toSpritePtr1_from___b3:
Removing instruction toSpritePtr1:
Succesful ASM optimization Pass5RedundantLabelElimination
Removing instruction __b3:
Removing instruction __b5:
@ -21866,10 +21866,10 @@ 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
(volatile byte) sprites_irq::raster_sprite_gfx_modify loadstore zp[1]:61 6.5
(label) sprites_irq::toSpritePtr2
(byte) sprites_irq::toSpritePtr2_return
(const byte) sprites_irq::toSpritePtr2_return#0 toSpritePtr2_return = (byte)(word)(const nomodify byte*) PLAYFIELD_SPRITES/(byte) $40
(byte*) sprites_irq::toSpritePtr2_sprite
(label) sprites_irq::toSpritePtr1
(byte) sprites_irq::toSpritePtr1_return
(const byte) sprites_irq::toSpritePtr1_return#0 toSpritePtr1_return = (byte)(word)(const nomodify byte*) PLAYFIELD_SPRITES/(byte) $40
(byte*) sprites_irq::toSpritePtr1_sprite
(byte) sprites_irq::ypos
(byte) sprites_irq::ypos#0 reg byte a 2.5
(void()) sprites_irq_init()
@ -25128,7 +25128,7 @@ sid_rnd_init: {
// Repeats 10 timers every 2 lines from line IRQ_RASTER_FIRST
// Utilizes duplicated gfx in the sprites to allow for some leeway in updating the sprite pointers
sprites_irq: {
.const toSpritePtr2_return = PLAYFIELD_SPRITES/$40
.const toSpritePtr1_return = PLAYFIELD_SPRITES/$40
.label raster_sprite_gfx_modify = $3d
// entry interrupt(HARDWARE_CLOBBER)
sta rega+1
@ -25283,12 +25283,12 @@ sprites_irq: {
// [580] (volatile byte) irq_sprite_ypos ← (const nomodify byte) SPRITES_FIRST_YPOS -- vbuz1=vbuc1
lda #SPRITES_FIRST_YPOS
sta.z irq_sprite_ypos
// [581] phi from sprites_irq::@3 to sprites_irq::toSpritePtr2 [phi:sprites_irq::@3->sprites_irq::toSpritePtr2]
// sprites_irq::toSpritePtr2
// [581] phi from sprites_irq::@3 to sprites_irq::toSpritePtr1 [phi:sprites_irq::@3->sprites_irq::toSpritePtr1]
// sprites_irq::toSpritePtr1
// sprites_irq::@11
// irq_sprite_ptr = toSpritePtr(PLAYFIELD_SPRITES)
// [582] (volatile byte) irq_sprite_ptr ← (const byte) sprites_irq::toSpritePtr2_return#0 -- vbuz1=vbuc1
lda #toSpritePtr2_return
// [582] (volatile byte) irq_sprite_ptr ← (const byte) sprites_irq::toSpritePtr1_return#0 -- vbuz1=vbuc1
lda #toSpritePtr1_return
sta.z irq_sprite_ptr
jmp __b5
// sprites_irq::@1

View File

@ -901,10 +901,10 @@ 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
(volatile byte) sprites_irq::raster_sprite_gfx_modify loadstore zp[1]:61 6.5
(label) sprites_irq::toSpritePtr2
(byte) sprites_irq::toSpritePtr2_return
(const byte) sprites_irq::toSpritePtr2_return#0 toSpritePtr2_return = (byte)(word)(const nomodify byte*) PLAYFIELD_SPRITES/(byte) $40
(byte*) sprites_irq::toSpritePtr2_sprite
(label) sprites_irq::toSpritePtr1
(byte) sprites_irq::toSpritePtr1_return
(const byte) sprites_irq::toSpritePtr1_return#0 toSpritePtr1_return = (byte)(word)(const nomodify byte*) PLAYFIELD_SPRITES/(byte) $40
(byte*) sprites_irq::toSpritePtr1_sprite
(byte) sprites_irq::ypos
(byte) sprites_irq::ypos#0 reg byte a 2.5
(void()) sprites_irq_init()