mirror of
https://gitlab.com/camelot/kickc.git
synced 2025-04-08 14:37:40 +00:00
Cleaned up scope getters. Might have caused a slow-down of compilation.
This commit is contained in:
parent
ab10bd59b4
commit
096d7c0640
@ -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
|
||||
*/
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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) {
|
||||
|
@ -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() {
|
||||
|
@ -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());
|
||||
|
@ -33,7 +33,7 @@ public class SymbolTypeStruct implements SymbolType {
|
||||
}
|
||||
|
||||
public StructDefinition getStructDefinition(ProgramScope programScope) {
|
||||
return programScope.getStructDefinition(name);
|
||||
return programScope.getLocalStructDefinition(name);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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();
|
||||
|
@ -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;
|
||||
|
@ -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();
|
||||
|
@ -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()) {
|
||||
|
@ -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++;
|
||||
}
|
||||
}
|
||||
|
@ -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));
|
||||
}
|
||||
|
@ -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());
|
||||
}
|
||||
|
@ -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());
|
||||
|
@ -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());
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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());
|
||||
|
@ -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:
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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()
|
||||
|
@ -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:
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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()
|
||||
|
Loading…
x
Reference in New Issue
Block a user