mirror of
https://gitlab.com/camelot/kickc.git
synced 2025-02-09 03:30:40 +00:00
Added main method to flipper. Fixed a few bugs in compiler.
This commit is contained in:
parent
f6eeb5ff83
commit
a7e0e2b1d0
@ -12,6 +12,7 @@ public class CompileLog {
|
|||||||
public void append(String msg) {
|
public void append(String msg) {
|
||||||
log.append(msg);
|
log.append(msg);
|
||||||
log.append("\n");
|
log.append("\n");
|
||||||
|
//System.out.printf(msg+"\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
public StringBuilder getLog() {
|
public StringBuilder getLog() {
|
||||||
|
@ -43,113 +43,131 @@ public class Compiler {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public CompilationResult compile(final CharStream input) throws IOException {
|
public CompilationResult compile(final CharStream input) {
|
||||||
CompileLog log = new CompileLog();
|
CompileLog log = new CompileLog();
|
||||||
log.append(input.toString());
|
try {
|
||||||
KickCLexer lexer = new KickCLexer(input);
|
log.append(input.toString());
|
||||||
KickCParser parser = new KickCParser(new CommonTokenStream(lexer));
|
KickCLexer lexer = new KickCLexer(input);
|
||||||
parser.setBuildParseTree(true);
|
KickCParser parser = new KickCParser(new CommonTokenStream(lexer));
|
||||||
parser.addErrorListener(new BaseErrorListener() {
|
parser.setBuildParseTree(true);
|
||||||
@Override
|
parser.addErrorListener(new BaseErrorListener() {
|
||||||
public void syntaxError(Recognizer<?, ?> recognizer, Object offendingSymbol, int line, int charPositionInLine, String msg, RecognitionException e) {
|
@Override
|
||||||
throw new RuntimeException("Error parsing file "+input.getSourceName()+"\n - Line: "+line+"\n - Message: "+msg);
|
public void syntaxError(
|
||||||
}
|
Recognizer<?, ?> recognizer,
|
||||||
});
|
Object offendingSymbol,
|
||||||
KickCParser.FileContext file = parser.file();
|
int line,
|
||||||
Pass1GenerateStatementSequence pass1GenerateStatementSequence = new Pass1GenerateStatementSequence(log);
|
int charPositionInLine,
|
||||||
pass1GenerateStatementSequence.generate(file);
|
String msg,
|
||||||
StatementSequence statementSequence = pass1GenerateStatementSequence.getSequence();
|
RecognitionException e) {
|
||||||
Scope programScope = pass1GenerateStatementSequence.getProgramScope();
|
throw new RuntimeException("Error parsing file " + input.getSourceName() + "\n - Line: " + line + "\n - Message: " + msg);
|
||||||
Pass1TypeInference pass1TypeInference = new Pass1TypeInference();
|
}
|
||||||
pass1TypeInference.inferTypes(statementSequence, programScope);
|
});
|
||||||
|
KickCParser.FileContext file = parser.file();
|
||||||
|
Pass1GenerateStatementSequence pass1GenerateStatementSequence = new Pass1GenerateStatementSequence(log);
|
||||||
|
pass1GenerateStatementSequence.generate(file);
|
||||||
|
StatementSequence statementSequence = pass1GenerateStatementSequence.getSequence();
|
||||||
|
Scope programScope = pass1GenerateStatementSequence.getProgramScope();
|
||||||
|
Pass1TypeInference pass1TypeInference = new Pass1TypeInference();
|
||||||
|
pass1TypeInference.inferTypes(statementSequence, programScope);
|
||||||
|
|
||||||
log.append("PROGRAM");
|
log.append("PROGRAM");
|
||||||
log.append(statementSequence.toString());
|
log.append(statementSequence.toString());
|
||||||
log.append("SYMBOLS");
|
log.append("SYMBOLS");
|
||||||
log.append(programScope.getSymbolTableContents());
|
log.append(programScope.getSymbolTableContents());
|
||||||
|
|
||||||
Pass1GenerateControlFlowGraph pass1GenerateControlFlowGraph = new Pass1GenerateControlFlowGraph(programScope);
|
Pass1GenerateControlFlowGraph pass1GenerateControlFlowGraph = new Pass1GenerateControlFlowGraph(programScope);
|
||||||
ControlFlowGraph controlFlowGraph = pass1GenerateControlFlowGraph.generate(statementSequence);
|
ControlFlowGraph controlFlowGraph = pass1GenerateControlFlowGraph.generate(statementSequence);
|
||||||
log.append("INITIAL CONTROL FLOW GRAPH");
|
log.append("INITIAL CONTROL FLOW GRAPH");
|
||||||
log.append(controlFlowGraph.toString());
|
log.append(controlFlowGraph.toString());
|
||||||
|
|
||||||
Pass1ProcedureCallParameters pass1ProcedureCallParameters =
|
Pass1ProcedureCallParameters pass1ProcedureCallParameters =
|
||||||
new Pass1ProcedureCallParameters(programScope, controlFlowGraph);
|
new Pass1ProcedureCallParameters(programScope, controlFlowGraph);
|
||||||
controlFlowGraph = pass1ProcedureCallParameters.generate();
|
controlFlowGraph = pass1ProcedureCallParameters.generate();
|
||||||
log.append("CONTROL FLOW GRAPH WITH ASSIGNMENT CALL");
|
log.append("CONTROL FLOW GRAPH WITH ASSIGNMENT CALL");
|
||||||
log.append(controlFlowGraph.toString());
|
log.append(controlFlowGraph.toString());
|
||||||
|
|
||||||
Pass1GenerateSingleStaticAssignmentForm pass1GenerateSingleStaticAssignmentForm =
|
Pass1GenerateSingleStaticAssignmentForm pass1GenerateSingleStaticAssignmentForm =
|
||||||
new Pass1GenerateSingleStaticAssignmentForm(log, programScope, controlFlowGraph);
|
new Pass1GenerateSingleStaticAssignmentForm(log, programScope, controlFlowGraph);
|
||||||
pass1GenerateSingleStaticAssignmentForm.generate();
|
pass1GenerateSingleStaticAssignmentForm.generate();
|
||||||
|
|
||||||
log.append("CONTROL FLOW GRAPH SSA");
|
log.append("CONTROL FLOW GRAPH SSA");
|
||||||
log.append(controlFlowGraph.toString());
|
log.append(controlFlowGraph.toString());
|
||||||
|
|
||||||
Pass1ProcedureCallsReturnValue pass1ProcedureCallsReturnValue =
|
Pass1ProcedureCallsReturnValue pass1ProcedureCallsReturnValue =
|
||||||
new Pass1ProcedureCallsReturnValue(programScope, controlFlowGraph);
|
new Pass1ProcedureCallsReturnValue(programScope, controlFlowGraph);
|
||||||
controlFlowGraph = pass1ProcedureCallsReturnValue.generate();
|
controlFlowGraph = pass1ProcedureCallsReturnValue.generate();
|
||||||
log.append("CONTROL FLOW GRAPH WITH ASSIGNMENT CALL & RETURN");
|
log.append("CONTROL FLOW GRAPH WITH ASSIGNMENT CALL & RETURN");
|
||||||
log.append(controlFlowGraph.toString());
|
log.append(controlFlowGraph.toString());
|
||||||
|
|
||||||
List<Pass2SsaOptimization> optimizations = new ArrayList<>();
|
List<Pass2SsaOptimization> optimizations = new ArrayList<>();
|
||||||
optimizations.add(new Pass2CullEmptyBlocks(controlFlowGraph, programScope, log));
|
optimizations.add(new Pass2CullEmptyBlocks(controlFlowGraph, programScope, log));
|
||||||
optimizations.add(new Pass2ConstantPropagation(controlFlowGraph, programScope, log));
|
optimizations.add(new Pass2ConstantPropagation(controlFlowGraph, programScope, log));
|
||||||
optimizations.add(new Pass2ConstantAdditionElimination(controlFlowGraph, programScope, log));
|
optimizations.add(new Pass2ConstantAdditionElimination(controlFlowGraph, programScope, log));
|
||||||
optimizations.add(new Pass2AliasElimination(controlFlowGraph, programScope, log));
|
optimizations.add(new Pass2AliasElimination(controlFlowGraph, programScope, log));
|
||||||
optimizations.add(new Pass2RedundantPhiElimination(controlFlowGraph, programScope, log));
|
optimizations.add(new Pass2RedundantPhiElimination(controlFlowGraph, programScope, log));
|
||||||
optimizations.add(new Pass2SelfPhiElimination(controlFlowGraph, programScope, log));
|
optimizations.add(new Pass2SelfPhiElimination(controlFlowGraph, programScope, log));
|
||||||
optimizations.add(new Pass2ConditionalJumpSimplification(controlFlowGraph, programScope, log));
|
optimizations.add(new Pass2ConditionalJumpSimplification(controlFlowGraph, programScope, log));
|
||||||
|
|
||||||
List<Pass2SsaAssertion> assertions = new ArrayList<>();
|
List<Pass2SsaAssertion> assertions = new ArrayList<>();
|
||||||
assertions.add(new Pass2AssertSymbols(controlFlowGraph, programScope));
|
assertions.add(new Pass2AssertSymbols(controlFlowGraph, programScope));
|
||||||
assertions.add(new Pass2AssertBlocks(controlFlowGraph, programScope));
|
assertions.add(new Pass2AssertBlocks(controlFlowGraph, programScope));
|
||||||
|
|
||||||
boolean ssaOptimized = true;
|
boolean ssaOptimized = true;
|
||||||
while (ssaOptimized) {
|
while (ssaOptimized) {
|
||||||
for (Pass2SsaAssertion assertion : assertions) {
|
for (Pass2SsaAssertion assertion : assertions) {
|
||||||
assertion.check();
|
assertion.check();
|
||||||
}
|
}
|
||||||
ssaOptimized = false;
|
ssaOptimized = false;
|
||||||
for (Pass2SsaOptimization optimization : optimizations) {
|
for (Pass2SsaOptimization optimization : optimizations) {
|
||||||
boolean stepOptimized = optimization.optimize();
|
boolean stepOptimized = optimization.optimize();
|
||||||
if (stepOptimized) {
|
if (stepOptimized) {
|
||||||
log.append("Succesful SSA optimization "+optimization.getClass().getSimpleName()+"");
|
log.append("Succesful SSA optimization " + optimization.getClass().getSimpleName() + "");
|
||||||
ssaOptimized = true;
|
ssaOptimized = true;
|
||||||
log.append("CONTROL FLOW GRAPH");
|
log.append("CONTROL FLOW GRAPH");
|
||||||
log.append(controlFlowGraph.toString());
|
log.append(controlFlowGraph.toString());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
Pass3BlockSequencePlanner pass3BlockSequencePlanner = new Pass3BlockSequencePlanner(controlFlowGraph, programScope);
|
Pass3BlockSequencePlanner pass3BlockSequencePlanner = new Pass3BlockSequencePlanner(
|
||||||
pass3BlockSequencePlanner.plan();
|
controlFlowGraph,
|
||||||
Pass3RegisterAllocation pass3RegisterAllocation = new Pass3RegisterAllocation(controlFlowGraph, programScope);
|
programScope);
|
||||||
pass3RegisterAllocation.allocate();
|
pass3BlockSequencePlanner.plan();
|
||||||
Pass3CodeGeneration pass3CodeGeneration = new Pass3CodeGeneration(controlFlowGraph, programScope);
|
Pass3RegisterAllocation pass3RegisterAllocation = new Pass3RegisterAllocation(controlFlowGraph, programScope);
|
||||||
AsmProgram asmProgram = pass3CodeGeneration.generate();
|
pass3RegisterAllocation.allocate();
|
||||||
|
Pass3CodeGeneration pass3CodeGeneration = new Pass3CodeGeneration(controlFlowGraph, programScope);
|
||||||
|
AsmProgram asmProgram = pass3CodeGeneration.generate();
|
||||||
|
|
||||||
log.append("INITIAL ASM");
|
log.append("INITIAL ASM");
|
||||||
log.append(asmProgram.toString());
|
log.append(asmProgram.toString());
|
||||||
|
|
||||||
List<Pass4AsmOptimization> pass4Optimizations = new ArrayList<>();
|
List<Pass4AsmOptimization> pass4Optimizations = new ArrayList<>();
|
||||||
pass4Optimizations.add(new Pass4NextJumpElimination(asmProgram, log));
|
pass4Optimizations.add(new Pass4NextJumpElimination(asmProgram, log));
|
||||||
pass4Optimizations.add(new Pass4UnnecesaryLoadElimination(asmProgram, log));
|
pass4Optimizations.add(new Pass4UnnecesaryLoadElimination(asmProgram, log));
|
||||||
boolean asmOptimized = true;
|
boolean asmOptimized = true;
|
||||||
while(asmOptimized) {
|
while (asmOptimized) {
|
||||||
asmOptimized = false;
|
asmOptimized = false;
|
||||||
for (Pass4AsmOptimization optimization : pass4Optimizations) {
|
for (Pass4AsmOptimization optimization : pass4Optimizations) {
|
||||||
boolean stepOtimized = optimization.optimize();
|
boolean stepOtimized = optimization.optimize();
|
||||||
if(stepOtimized) {
|
if (stepOtimized) {
|
||||||
log.append("Succesful ASM optimization "+optimization.getClass().getSimpleName());
|
log.append("Succesful ASM optimization " + optimization.getClass().getSimpleName());
|
||||||
asmOptimized = true;
|
asmOptimized = true;
|
||||||
log.append("ASSEMBLER");
|
log.append("ASSEMBLER");
|
||||||
log.append(asmProgram.toString());
|
log.append(asmProgram.toString());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
return new CompilationResult(asmProgram, controlFlowGraph, programScope, log);
|
log.append("FINAL SYMBOL TABLE");
|
||||||
|
log.append(programScope.getSymbolTableContents());
|
||||||
|
log.append("FINAL CODE");
|
||||||
|
log.append(asmProgram.toString());
|
||||||
|
|
||||||
|
return new CompilationResult(asmProgram, controlFlowGraph, programScope, log);
|
||||||
|
} catch (Exception e) {
|
||||||
|
System.out.println(log.getLog());
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
Features
|
Features
|
||||||
- Move the main code into a main() function, and disallow code outside functions. The main function per default has no parameters and exits with RTS.
|
- Move the main code into a main() function, and disallow code outside functions. The main function per default has no parameters and exits with RTS.
|
||||||
|
- Add a for loop for(init;condition;increment) {stmt} -> { init; do { stmt; increment } while (condition) }
|
||||||
- Implement Register Allocation (that utilize real registers - and non-zeropage memory)
|
- Implement Register Allocation (that utilize real registers - and non-zeropage memory)
|
||||||
- Add Fixed Point number types
|
- Add Fixed Point number types
|
||||||
- Add a for loop for(init;condition;increment) {stmt} -> { init; do { stmt; increment } while (condition) }
|
|
||||||
- Add imports
|
- Add imports
|
||||||
- Add structs
|
- Add structs
|
||||||
- Let { stmt } introduce a new anonymous scope.
|
- Let { stmt } introduce a new anonymous scope.
|
||||||
|
@ -44,7 +44,8 @@ public class Pass1ProcedureCallParameters extends ControlFlowGraphCopyVisitor {
|
|||||||
// No return type. Remove variable receiving the result.
|
// No return type. Remove variable receiving the result.
|
||||||
LValue lValue = origCall.getLValue();
|
LValue lValue = origCall.getLValue();
|
||||||
if(lValue instanceof Variable) {
|
if(lValue instanceof Variable) {
|
||||||
scope.remove((Variable) lValue);
|
Variable lVar = (Variable) lValue;
|
||||||
|
lVar.getScope().remove(lVar);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -62,7 +62,7 @@ public class Pass2CullEmptyBlocks extends Pass2SsaOptimization {
|
|||||||
};
|
};
|
||||||
phiFixVisitor.visitBlock(successor);
|
phiFixVisitor.visitBlock(successor);
|
||||||
getGraph().getAllBlocks().remove(removeBlock);
|
getGraph().getAllBlocks().remove(removeBlock);
|
||||||
getSymbols().remove(removeBlock.getLabel());
|
removeBlock.getLabel().getScope().remove(removeBlock.getLabel());
|
||||||
log.append("Culled Empty Block " + removeBlock.getLabel());
|
log.append("Culled Empty Block " + removeBlock.getLabel());
|
||||||
}
|
}
|
||||||
return remove.size()>0;
|
return remove.size()>0;
|
||||||
|
@ -139,13 +139,13 @@ public class Pass3RegisterAllocation {
|
|||||||
allocation.allocate(symbols.getVariable("flip::$0"), RegisterAllocation.getRegisterA());
|
allocation.allocate(symbols.getVariable("flip::$0"), RegisterAllocation.getRegisterA());
|
||||||
allocation.allocate(symbols.getVariable("flip::$8"), RegisterAllocation.getRegisterA());
|
allocation.allocate(symbols.getVariable("flip::$8"), RegisterAllocation.getRegisterA());
|
||||||
allocation.allocate(symbols.getVariable("flip::$4"), RegisterAllocation.getRegisterA());
|
allocation.allocate(symbols.getVariable("flip::$4"), RegisterAllocation.getRegisterA());
|
||||||
allocation.allocate(symbols.getVariable("$1"), RegisterAllocation.getRegisterA());
|
allocation.allocate(symbols.getVariable("main::$1"), RegisterAllocation.getRegisterA());
|
||||||
allocation.allocate(symbols.getVariable("$3"), RegisterAllocation.getRegisterA());
|
allocation.allocate(symbols.getVariable("main::$3"), RegisterAllocation.getRegisterA());
|
||||||
allocation.allocate(symbols.getVariable("c#0"), RegisterAllocation.getRegisterX());
|
allocation.allocate(symbols.getVariable("main::c#0"), RegisterAllocation.getRegisterX());
|
||||||
allocation.allocate(symbols.getVariable("c#1"), RegisterAllocation.getRegisterX());
|
allocation.allocate(symbols.getVariable("main::c#1"), RegisterAllocation.getRegisterX());
|
||||||
allocation.allocate(symbols.getVariable("c#2"), RegisterAllocation.getRegisterX());
|
allocation.allocate(symbols.getVariable("main::c#2"), RegisterAllocation.getRegisterX());
|
||||||
allocation.allocate(symbols.getVariable("c#3"), RegisterAllocation.getRegisterX());
|
allocation.allocate(symbols.getVariable("main::c#3"), RegisterAllocation.getRegisterX());
|
||||||
allocation.allocate(symbols.getVariable("c#4"), RegisterAllocation.getRegisterX());
|
allocation.allocate(symbols.getVariable("main::c#4"), RegisterAllocation.getRegisterX());
|
||||||
symbols.setAllocation(allocation);
|
symbols.setAllocation(allocation);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,20 +1,23 @@
|
|||||||
byte[1000] SCREEN = $0400;
|
byte[1000] SCREEN = $0400;
|
||||||
byte[16*16] buffer1 = $1000;
|
byte[16*16] buffer1 = $1000;
|
||||||
byte[16*16] buffer2 = $1100;
|
byte[16*16] buffer2 = $1100;
|
||||||
|
|
||||||
byte *RASTER = $d012;
|
byte *RASTER = $d012;
|
||||||
|
|
||||||
prepare();
|
main();
|
||||||
do {
|
|
||||||
byte c = 25;
|
void main() {
|
||||||
do{
|
prepare();
|
||||||
do { } while(*RASTER!=254)
|
do {
|
||||||
do { } while(*RASTER!=255)
|
byte c = 25;
|
||||||
c--;
|
do{
|
||||||
} while(c!=0)
|
do { } while(*RASTER!=254)
|
||||||
flip();
|
do { } while(*RASTER!=255)
|
||||||
plot();
|
c--;
|
||||||
} while(true)
|
} while(c!=0)
|
||||||
|
flip();
|
||||||
|
plot();
|
||||||
|
} while(true)
|
||||||
|
}
|
||||||
|
|
||||||
// Prepare buffer
|
// Prepare buffer
|
||||||
void prepare() {
|
void prepare() {
|
||||||
|
@ -1,31 +1,35 @@
|
|||||||
BBEGIN:
|
BBEGIN:
|
||||||
|
jsr main
|
||||||
|
BEND:
|
||||||
|
main:
|
||||||
jsr prepare
|
jsr prepare
|
||||||
B2_from_BBEGIN:
|
main__B2_from_main:
|
||||||
ldx #25
|
ldx #25
|
||||||
jmp B2
|
jmp main__B2
|
||||||
B2_from_B20:
|
main__B2_from_B18:
|
||||||
ldx #25
|
ldx #25
|
||||||
B2_from_B6:
|
main__B2_from_B2:
|
||||||
B2:
|
main__B2:
|
||||||
B3:
|
main__B3:
|
||||||
lda 53266
|
lda 53266
|
||||||
cmp #254
|
cmp #254
|
||||||
bne B3
|
bne main__main__B3
|
||||||
B4:
|
main__B4:
|
||||||
lda 53266
|
lda 53266
|
||||||
cmp #255
|
cmp #255
|
||||||
bne B4
|
bne main__main__B4
|
||||||
B6:
|
B2:
|
||||||
dex
|
dex
|
||||||
cpx #0
|
cpx #0
|
||||||
bne B2_from_B6
|
bne main__B2_from_B2
|
||||||
B7:
|
B3:
|
||||||
jsr flip
|
jsr flip
|
||||||
B19:
|
B17:
|
||||||
jsr plot
|
jsr plot
|
||||||
B20:
|
B18:
|
||||||
jmp B2_from_B20
|
jmp main__B2_from_B18
|
||||||
BEND:
|
main__Breturn:
|
||||||
|
rts
|
||||||
plot:
|
plot:
|
||||||
plot__B1_from_plot:
|
plot__B1_from_plot:
|
||||||
lda #16
|
lda #16
|
||||||
@ -35,7 +39,7 @@ plot__B1_from_plot:
|
|||||||
sta 101
|
sta 101
|
||||||
lda #>1236
|
lda #>1236
|
||||||
sta 101+1
|
sta 101+1
|
||||||
plot__B1_from_B15:
|
plot__B1_from_B12:
|
||||||
plot__B1:
|
plot__B1:
|
||||||
plot__B2_from_B1:
|
plot__B2_from_B1:
|
||||||
ldy #0
|
ldy #0
|
||||||
@ -47,7 +51,7 @@ plot__B2:
|
|||||||
iny
|
iny
|
||||||
cpy #16
|
cpy #16
|
||||||
bcc plot__B2_from_B2
|
bcc plot__B2_from_B2
|
||||||
B15:
|
B12:
|
||||||
lda 101
|
lda 101
|
||||||
clc
|
clc
|
||||||
adc #40
|
adc #40
|
||||||
@ -57,7 +61,7 @@ B15:
|
|||||||
!:
|
!:
|
||||||
dec 100
|
dec 100
|
||||||
lda 100
|
lda 100
|
||||||
bne plot__B1_from_B15
|
bne plot__B1_from_B12
|
||||||
plot__Breturn:
|
plot__Breturn:
|
||||||
rts
|
rts
|
||||||
flip:
|
flip:
|
||||||
@ -66,7 +70,7 @@ flip__B1_from_flip:
|
|||||||
sta 104
|
sta 104
|
||||||
ldx #0
|
ldx #0
|
||||||
ldy #15
|
ldy #15
|
||||||
flip__B1_from_B11:
|
flip__B1_from_B8:
|
||||||
flip__B1:
|
flip__B1:
|
||||||
flip__B2_from_B1:
|
flip__B2_from_B1:
|
||||||
lda #16
|
lda #16
|
||||||
@ -83,12 +87,12 @@ flip__B2:
|
|||||||
dec 103
|
dec 103
|
||||||
lda 103
|
lda 103
|
||||||
bne flip__B2_from_B2
|
bne flip__B2_from_B2
|
||||||
B11:
|
B8:
|
||||||
dey
|
dey
|
||||||
dec 104
|
dec 104
|
||||||
lda 104
|
lda 104
|
||||||
bne flip__B1_from_B11
|
bne flip__B1_from_B8
|
||||||
flip__B3_from_B11:
|
flip__B3_from_B8:
|
||||||
ldx #0
|
ldx #0
|
||||||
flip__B3_from_B3:
|
flip__B3_from_B3:
|
||||||
flip__B3:
|
flip__B3:
|
||||||
|
@ -1,31 +1,37 @@
|
|||||||
@BEGIN: from
|
@BEGIN: from
|
||||||
call prepare param-assignment
|
call main param-assignment
|
||||||
to:@2
|
|
||||||
@2: from @20 @6 @BEGIN
|
|
||||||
(byte) c#2 ← phi( @20/(byte) 25 @6/(byte) c#1 @BEGIN/(byte) 25 )
|
|
||||||
to:@3
|
|
||||||
@3: from @2 @3
|
|
||||||
(byte~) $1 ← * (word) 53266
|
|
||||||
if((byte~) $1!=(byte) 254) goto @3
|
|
||||||
to:@4
|
|
||||||
@4: from @3 @4
|
|
||||||
(byte~) $3 ← * (word) 53266
|
|
||||||
if((byte~) $3!=(byte) 255) goto @4
|
|
||||||
to:@6
|
|
||||||
@6: from @4
|
|
||||||
(byte) c#1 ← -- (byte) c#2
|
|
||||||
if((byte) c#1!=(byte) 0) goto @2
|
|
||||||
to:@7
|
|
||||||
@7: from @6
|
|
||||||
call flip param-assignment
|
|
||||||
to:@19
|
|
||||||
@19: from @7
|
|
||||||
call plot param-assignment
|
|
||||||
to:@20
|
|
||||||
@20: from @19
|
|
||||||
if(true) goto @2
|
|
||||||
to:@END
|
to:@END
|
||||||
prepare: from @BEGIN
|
main: from @BEGIN
|
||||||
|
call prepare param-assignment
|
||||||
|
to:main::@2
|
||||||
|
main::@2: from @18 @2 main
|
||||||
|
(byte) main::c#2 ← phi( @2/(byte) main::c#1 @18/(byte) 25 main/(byte) 25 )
|
||||||
|
to:main::@3
|
||||||
|
main::@3: from main::@2 main::@3
|
||||||
|
(byte~) main::$1 ← * (word) 53266
|
||||||
|
if((byte~) main::$1!=(byte) 254) goto main::@3
|
||||||
|
to:main::@4
|
||||||
|
main::@4: from main::@3 main::@4
|
||||||
|
(byte~) main::$3 ← * (word) 53266
|
||||||
|
if((byte~) main::$3!=(byte) 255) goto main::@4
|
||||||
|
to:@2
|
||||||
|
@2: from main::@4
|
||||||
|
(byte) main::c#1 ← -- (byte) main::c#2
|
||||||
|
if((byte) main::c#1!=(byte) 0) goto main::@2
|
||||||
|
to:@3
|
||||||
|
@3: from @2
|
||||||
|
call flip param-assignment
|
||||||
|
to:@17
|
||||||
|
@17: from @3
|
||||||
|
call plot param-assignment
|
||||||
|
to:@18
|
||||||
|
@18: from @17
|
||||||
|
if(true) goto main::@2
|
||||||
|
to:main::@return
|
||||||
|
main::@return: from @18
|
||||||
|
return
|
||||||
|
to:@RETURN
|
||||||
|
prepare: from main
|
||||||
to:prepare::@1
|
to:prepare::@1
|
||||||
prepare::@1: from prepare prepare::@1
|
prepare::@1: from prepare prepare::@1
|
||||||
(byte) prepare::i#2 ← phi( prepare/(byte) 0 prepare::@1/(byte) prepare::i#1 )
|
(byte) prepare::i#2 ← phi( prepare/(byte) 0 prepare::@1/(byte) prepare::i#1 )
|
||||||
@ -36,12 +42,12 @@ prepare::@1: from prepare prepare::@1
|
|||||||
prepare::@return: from prepare::@1
|
prepare::@return: from prepare::@1
|
||||||
return
|
return
|
||||||
to:@RETURN
|
to:@RETURN
|
||||||
flip: from @7
|
flip: from @3
|
||||||
to:flip::@1
|
to:flip::@1
|
||||||
flip::@1: from @11 flip
|
flip::@1: from @8 flip
|
||||||
(byte) flip::r#2 ← phi( @11/(byte) flip::r#1 flip/(byte) 16 )
|
(byte) flip::r#2 ← phi( @8/(byte) flip::r#1 flip/(byte) 16 )
|
||||||
(byte) flip::srcIdx#3 ← phi( @11/(byte) flip::srcIdx#1 flip/(byte) 0 )
|
(byte) flip::srcIdx#3 ← phi( @8/(byte) flip::srcIdx#1 flip/(byte) 0 )
|
||||||
(byte) flip::dstIdx#5 ← phi( @11/(byte) flip::dstIdx#2 flip/(byte) 15 )
|
(byte) flip::dstIdx#5 ← phi( @8/(byte) flip::dstIdx#2 flip/(byte) 15 )
|
||||||
to:flip::@2
|
to:flip::@2
|
||||||
flip::@2: from flip::@1 flip::@2
|
flip::@2: from flip::@1 flip::@2
|
||||||
(byte) flip::c#2 ← phi( flip::@1/(byte) 16 flip::@2/(byte) flip::c#1 )
|
(byte) flip::c#2 ← phi( flip::@1/(byte) 16 flip::@2/(byte) flip::c#1 )
|
||||||
@ -53,14 +59,14 @@ flip::@2: from flip::@1 flip::@2
|
|||||||
(byte) flip::dstIdx#1 ← (byte) flip::dstIdx#3 + (byte) 16
|
(byte) flip::dstIdx#1 ← (byte) flip::dstIdx#3 + (byte) 16
|
||||||
(byte) flip::c#1 ← -- (byte) flip::c#2
|
(byte) flip::c#1 ← -- (byte) flip::c#2
|
||||||
if((byte) flip::c#1!=(byte) 0) goto flip::@2
|
if((byte) flip::c#1!=(byte) 0) goto flip::@2
|
||||||
to:@11
|
to:@8
|
||||||
@11: from flip::@2
|
@8: from flip::@2
|
||||||
(byte) flip::dstIdx#2 ← -- (byte) flip::dstIdx#1
|
(byte) flip::dstIdx#2 ← -- (byte) flip::dstIdx#1
|
||||||
(byte) flip::r#1 ← -- (byte) flip::r#2
|
(byte) flip::r#1 ← -- (byte) flip::r#2
|
||||||
if((byte) flip::r#1!=(byte) 0) goto flip::@1
|
if((byte) flip::r#1!=(byte) 0) goto flip::@1
|
||||||
to:flip::@3
|
to:flip::@3
|
||||||
flip::@3: from @11 flip::@3
|
flip::@3: from @8 flip::@3
|
||||||
(byte) flip::i#2 ← phi( @11/(byte) 0 flip::@3/(byte) flip::i#1 )
|
(byte) flip::i#2 ← phi( @8/(byte) 0 flip::@3/(byte) flip::i#1 )
|
||||||
(byte~) flip::$4 ← (word) 4352 *idx (byte) flip::i#2
|
(byte~) flip::$4 ← (word) 4352 *idx (byte) flip::i#2
|
||||||
*((word) 4096 + (byte) flip::i#2) ← (byte~) flip::$4
|
*((word) 4096 + (byte) flip::i#2) ← (byte~) flip::$4
|
||||||
(byte) flip::i#1 ← ++ (byte) flip::i#2
|
(byte) flip::i#1 ← ++ (byte) flip::i#2
|
||||||
@ -69,12 +75,12 @@ flip::@3: from @11 flip::@3
|
|||||||
flip::@return: from flip::@3
|
flip::@return: from flip::@3
|
||||||
return
|
return
|
||||||
to:@RETURN
|
to:@RETURN
|
||||||
plot: from @19
|
plot: from @17
|
||||||
to:plot::@1
|
to:plot::@1
|
||||||
plot::@1: from @15 plot
|
plot::@1: from @12 plot
|
||||||
(byte) plot::y#2 ← phi( @15/(byte) plot::y#1 plot/(byte) 16 )
|
(byte) plot::y#2 ← phi( @12/(byte) plot::y#1 plot/(byte) 16 )
|
||||||
(byte) plot::i#3 ← phi( @15/(byte) plot::i#1 plot/(byte) 0 )
|
(byte) plot::i#3 ← phi( @12/(byte) plot::i#1 plot/(byte) 0 )
|
||||||
(byte*) plot::line#2 ← phi( @15/(byte*) plot::line#1 plot/(word) 1236 )
|
(byte*) plot::line#2 ← phi( @12/(byte*) plot::line#1 plot/(word) 1236 )
|
||||||
to:plot::@2
|
to:plot::@2
|
||||||
plot::@2: from plot::@1 plot::@2
|
plot::@2: from plot::@1 plot::@2
|
||||||
(byte) plot::x#2 ← phi( plot::@1/(byte) 0 plot::@2/(byte) plot::x#1 )
|
(byte) plot::x#2 ← phi( plot::@1/(byte) 0 plot::@2/(byte) plot::x#1 )
|
||||||
@ -84,13 +90,13 @@ plot::@2: from plot::@1 plot::@2
|
|||||||
(byte) plot::i#1 ← ++ (byte) plot::i#2
|
(byte) plot::i#1 ← ++ (byte) plot::i#2
|
||||||
(byte) plot::x#1 ← ++ (byte) plot::x#2
|
(byte) plot::x#1 ← ++ (byte) plot::x#2
|
||||||
if((byte) plot::x#1<(byte) 16) goto plot::@2
|
if((byte) plot::x#1<(byte) 16) goto plot::@2
|
||||||
to:@15
|
to:@12
|
||||||
@15: from plot::@2
|
@12: from plot::@2
|
||||||
(byte*) plot::line#1 ← (byte*) plot::line#2 + (byte) 40
|
(byte*) plot::line#1 ← (byte*) plot::line#2 + (byte) 40
|
||||||
(byte) plot::y#1 ← -- (byte) plot::y#2
|
(byte) plot::y#1 ← -- (byte) plot::y#2
|
||||||
if((byte) plot::y#1!=(byte) 0) goto plot::@1
|
if((byte) plot::y#1!=(byte) 0) goto plot::@1
|
||||||
to:plot::@return
|
to:plot::@return
|
||||||
plot::@return: from @15
|
plot::@return: from @12
|
||||||
return
|
return
|
||||||
to:@RETURN
|
to:@RETURN
|
||||||
@END: from @20
|
@END: from @BEGIN
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -1,23 +1,15 @@
|
|||||||
(byte~) $1 reg byte a
|
(label) @12
|
||||||
(byte~) $3 reg byte a
|
(label) @17
|
||||||
(label) @11
|
(label) @18
|
||||||
(label) @15
|
|
||||||
(label) @19
|
|
||||||
(label) @2
|
(label) @2
|
||||||
(label) @20
|
|
||||||
(label) @3
|
(label) @3
|
||||||
(label) @4
|
(label) @8
|
||||||
(label) @6
|
|
||||||
(label) @7
|
|
||||||
(label) @BEGIN
|
(label) @BEGIN
|
||||||
(label) @END
|
(label) @END
|
||||||
(byte*) RASTER
|
(byte*) RASTER
|
||||||
(byte[1000]) SCREEN
|
(byte[1000]) SCREEN
|
||||||
(byte[256]) buffer1
|
(byte[256]) buffer1
|
||||||
(byte[256]) buffer2
|
(byte[256]) buffer2
|
||||||
(byte) c
|
|
||||||
(byte) c#1 reg byte x
|
|
||||||
(byte) c#2 reg byte x
|
|
||||||
(void()) flip()
|
(void()) flip()
|
||||||
(byte~) flip::$0 reg byte a
|
(byte~) flip::$0 reg byte a
|
||||||
(byte~) flip::$4 reg byte a
|
(byte~) flip::$4 reg byte a
|
||||||
@ -44,6 +36,17 @@
|
|||||||
(byte) flip::srcIdx#2 reg byte x
|
(byte) flip::srcIdx#2 reg byte x
|
||||||
(byte) flip::srcIdx#3 reg byte x
|
(byte) flip::srcIdx#3 reg byte x
|
||||||
|
|
||||||
|
(void()) main()
|
||||||
|
(byte~) main::$1 reg byte a
|
||||||
|
(byte~) main::$3 reg byte a
|
||||||
|
(label) main::@2
|
||||||
|
(label) main::@3
|
||||||
|
(label) main::@4
|
||||||
|
(label) main::@return
|
||||||
|
(byte) main::c
|
||||||
|
(byte) main::c#1 reg byte x
|
||||||
|
(byte) main::c#2 reg byte x
|
||||||
|
|
||||||
(void()) plot()
|
(void()) plot()
|
||||||
(byte~) plot::$3 reg byte a
|
(byte~) plot::$3 reg byte a
|
||||||
(label) plot::@1
|
(label) plot::@1
|
||||||
|
Loading…
x
Reference in New Issue
Block a user