mirror of
https://gitlab.com/camelot/kickc.git
synced 2024-09-08 17:54:40 +00:00
Removed comments from ASM output
This commit is contained in:
parent
67b4257ad9
commit
f6eeb5ff83
@ -2,11 +2,9 @@ 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.
|
||||
- Implement Register Allocation (that utilize real registers - and non-zeropage memory)
|
||||
- Add Fixed Point number types
|
||||
- Create a proper main function for the compiler
|
||||
- Add a for loop for(init;condition;increment) {stmt} -> { init; do { stmt; increment } while (condition) }
|
||||
- Add imports
|
||||
- Add structs
|
||||
- Add ++/-- incrementing/decrementing operators.
|
||||
- Let { stmt } introduce a new anonymous scope.
|
||||
- Add preprocessing / find a way to allow some functions to run at compile time
|
||||
- Implement inline compilation of functions (and a mechanism for choosing which methods / calls to inline)
|
||||
@ -14,20 +12,22 @@ Features
|
||||
- Add ability to call KC code from ASM. (Maybe declare some functions external to ensure their interface is well defined. Maybe generate ASM call stubs.)
|
||||
- Add inline ASM (maybe?)
|
||||
- Handle long branches
|
||||
+ Create a proper main function for the compiler
|
||||
+ Add ++/-- incrementing/decrementing operators.
|
||||
|
||||
Process/Code Structure Improvement
|
||||
- Make each phase return a separate object graph (allowing for keeeping the history in memory & performing rollbacks)
|
||||
- Implemenent Assertions for the output of different phases (ensuring that the result of the phase is consistent)
|
||||
- Refactor Expression Operator Implementation & Evaluation into one class per operator
|
||||
- Improve error messages to give better context
|
||||
- Offer to compile resulting ASM with KickAssembler
|
||||
+ Implemenent Assertions for the output of different phases (ensuring that the result of the phase is consistent)
|
||||
|
||||
Testing
|
||||
- Test that the parse tree for specific KC syntax is as expected. Use a print function for the parse tree to generate output for comparison.
|
||||
- Test the ICL result of a specific phase on a specific ICL input. Create an ICL syntax for parsing directly to ICL and a printer for the syntax.
|
||||
- Test the ASM program output resulting from compiling specific KC program input.
|
||||
- Emulate/Run the ASM for a specific KC program compiled. Compare the emulated ASM output to output calculated by executing directly on the KC tree.
|
||||
- Add assert statements to the language. Create KC programs that test the compiler by compiling, running and testing assertions.
|
||||
+ Test the ASM program output resulting from compiling specific KC program input.
|
||||
|
||||
Optimizations
|
||||
- Optimize phi transitions by ensuring that identical phi-transitions with regards to register allocation are collected into a single transition.
|
||||
|
@ -8,6 +8,10 @@ public class AsmComment implements AsmLine {
|
||||
this.comment = comment;
|
||||
}
|
||||
|
||||
public String getComment() {
|
||||
return comment;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getLineBytes() {
|
||||
return 0;
|
||||
|
@ -33,10 +33,14 @@ public class AsmProgram {
|
||||
addLine(new AsmInstruction(instructionType, parameter, 1));
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
public String toString(boolean comments) {
|
||||
StringBuffer out = new StringBuffer();
|
||||
for (AsmLine line : lines) {
|
||||
if(line instanceof AsmComment && !comments) {
|
||||
if(!((AsmComment) line).getComment().contains("Fragment")) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if(line instanceof AsmComment || line instanceof AsmInstruction) {
|
||||
out.append(" ");
|
||||
}
|
||||
@ -45,4 +49,9 @@ public class AsmProgram {
|
||||
return out.toString();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return toString(true);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -40,7 +40,7 @@ public class TestCompilationOutput {
|
||||
CharStream input = CharStreams.fromFileName(inputPath);
|
||||
Compiler compiler = new Compiler();
|
||||
Compiler.CompilationResult output = compiler.compile(input);
|
||||
assertOutput(fileName, ".asm", output.getAsmProgram().toString());
|
||||
assertOutput(fileName, ".asm", output.getAsmProgram().toString(false));
|
||||
assertOutput(fileName, ".sym", output.getSymbols().getSymbolTableContents());
|
||||
assertOutput(fileName, ".cfg", output.getGraph().toString());
|
||||
assertOutput(fileName, ".log", output.getLog().toString());
|
||||
|
@ -1,46 +1,35 @@
|
||||
BBEGIN:
|
||||
B1_from_BBEGIN:
|
||||
// (byte) y#2 = (byte) 0 // zpby1=coby1
|
||||
lda #0
|
||||
sta 14
|
||||
// (byte) e#3 = (byte) 12 // zpby1=coby1
|
||||
lda #12
|
||||
sta 13
|
||||
// (byte) x#2 = (byte) 0 // zpby1=coby1
|
||||
lda #0
|
||||
sta 12
|
||||
// (byte*) cursor#3 = (word) 1024 // zpptrby1=cowo1
|
||||
lda #<1024
|
||||
sta 10
|
||||
lda #>1024
|
||||
sta 10+1
|
||||
jmp B1
|
||||
B1_from_B3:
|
||||
// (byte) y#2 = (byte) y#5 // zpby1=zpby2
|
||||
lda 18
|
||||
sta 14
|
||||
// (byte) e#3 = (byte) e#5 // zpby1=zpby2
|
||||
lda 15
|
||||
sta 13
|
||||
// (byte) x#2 = (byte) x#1 // zpby1=zpby2
|
||||
lda 2
|
||||
sta 12
|
||||
// (byte*) cursor#3 = (byte*) cursor#5 // zpptrby1=zpptrby2
|
||||
lda 16
|
||||
sta 10
|
||||
lda 16+1
|
||||
sta 10+1
|
||||
B1:
|
||||
// *((byte*) cursor#3) ← (byte) 81 // zpiby1=coby1
|
||||
ldy #0
|
||||
lda #81
|
||||
sta (10),y
|
||||
// (byte) x#1 ← (byte) x#2 + (byte) 1 // zpby1=zpby2_plus_1
|
||||
lda 12
|
||||
clc
|
||||
adc #1
|
||||
sta 2
|
||||
// (byte*) cursor#1 ← (byte*) cursor#3 + (byte) 1 // zpptrby1=zpptrby2_plus_1
|
||||
lda 10
|
||||
clc
|
||||
adc #1
|
||||
@ -48,40 +37,32 @@ B1:
|
||||
lda 10+1
|
||||
adc #0
|
||||
sta 3+1
|
||||
// (byte) e#1 ← (byte) e#3 + (byte) 24 // zpby1=zpby2_plus_coby1
|
||||
lda 13
|
||||
clc
|
||||
adc #24
|
||||
sta 5
|
||||
// if((byte) 39<(byte) e#1) goto @2 // coby1_lt_zpby1_then_la1
|
||||
lda #39
|
||||
cmp 5
|
||||
bcc B2
|
||||
B3_from_B1:
|
||||
// (byte) y#5 = (byte) y#2 // zpby1=zpby2
|
||||
lda 14
|
||||
sta 18
|
||||
// (byte*) cursor#5 = (byte*) cursor#1 // zpptrby1=zpptrby2
|
||||
lda 3
|
||||
sta 16
|
||||
lda 3+1
|
||||
sta 16+1
|
||||
// (byte) e#5 = (byte) e#1 // zpby1=zpby2
|
||||
lda 5
|
||||
sta 15
|
||||
B3:
|
||||
// if((byte) x#1<(byte) 40) goto @1 // zpby1_lt_coby1_then_la1
|
||||
lda 2
|
||||
cmp #40
|
||||
bcc B1_from_B3
|
||||
BEND:
|
||||
B2:
|
||||
// (byte) y#1 ← (byte) y#2 + (byte) 1 // zpby1=zpby2_plus_1
|
||||
lda 14
|
||||
clc
|
||||
adc #1
|
||||
sta 6
|
||||
// (byte*) cursor#2 ← (byte*) cursor#1 + (byte) 40 // zpptrby1=zpptrby2_plus_coby1
|
||||
lda #40
|
||||
clc
|
||||
adc 3
|
||||
@ -89,21 +70,17 @@ B2:
|
||||
lda #0
|
||||
adc 3+1
|
||||
sta 7+1
|
||||
// (byte) e#2 ← (byte) e#1 - (byte) 39 // zpby1=zpby2_minus_coby1
|
||||
lda 5
|
||||
sec
|
||||
sbc #39
|
||||
sta 9
|
||||
B3_from_B2:
|
||||
// (byte) y#5 = (byte) y#1 // zpby1=zpby2
|
||||
lda 6
|
||||
sta 18
|
||||
// (byte*) cursor#5 = (byte*) cursor#2 // zpptrby1=zpptrby2
|
||||
lda 7
|
||||
sta 16
|
||||
lda 7+1
|
||||
sta 16+1
|
||||
// (byte) e#5 = (byte) e#2 // zpby1=zpby2
|
||||
lda 9
|
||||
sta 15
|
||||
jmp B3
|
||||
|
@ -1,31 +1,22 @@
|
||||
BBEGIN:
|
||||
jsr prepare
|
||||
B2_from_BBEGIN:
|
||||
// (byte) c#2 = (byte) 25 // xby=coby1
|
||||
ldx #25
|
||||
jmp B2
|
||||
B2_from_B20:
|
||||
// (byte) c#2 = (byte) 25 // xby=coby1
|
||||
ldx #25
|
||||
B2_from_B6:
|
||||
// (byte) c#2 = (byte) c#1 // register copy
|
||||
B2:
|
||||
B3:
|
||||
// (byte~) $1 ← * (word) 53266 // aby=_star_cowo1
|
||||
lda 53266
|
||||
// if((byte~) $1!=(byte) 254) goto @3 // aby_neq_coby1_then_la1
|
||||
cmp #254
|
||||
bne B3
|
||||
B4:
|
||||
// (byte~) $3 ← * (word) 53266 // aby=_star_cowo1
|
||||
lda 53266
|
||||
// if((byte~) $3!=(byte) 255) goto @4 // aby_neq_coby1_then_la1
|
||||
cmp #255
|
||||
bne B4
|
||||
B6:
|
||||
// (byte) c#1 ← -- (byte) c#2 // xby=_dec_xby
|
||||
dex
|
||||
// if((byte) c#1!=(byte) 0) goto @2 // xby_neq_0_then_la1
|
||||
cpx #0
|
||||
bne B2_from_B6
|
||||
B7:
|
||||
@ -33,47 +24,30 @@ B7:
|
||||
B19:
|
||||
jsr plot
|
||||
B20:
|
||||
// if(true) goto @2 // true_then_la1
|
||||
jmp B2_from_B20
|
||||
BEND:
|
||||
plot:
|
||||
plot__B1_from_plot:
|
||||
// (byte) plot::y#2 = (byte) 16 // zpby1=coby1
|
||||
lda #16
|
||||
sta 100
|
||||
// (byte) plot::i#3 = (byte) 0 // xby=coby1
|
||||
ldx #0
|
||||
// (byte*) plot::line#2 = (word) 1236 // zpptrby1=cowo1
|
||||
lda #<1236
|
||||
sta 101
|
||||
lda #>1236
|
||||
sta 101+1
|
||||
plot__B1_from_B15:
|
||||
// (byte) plot::y#2 = (byte) plot::y#1 // register copy
|
||||
// (byte) plot::i#3 = (byte) plot::i#1 // register copy
|
||||
// (byte*) plot::line#2 = (byte*) plot::line#1 // register copy
|
||||
plot__B1:
|
||||
plot__B2_from_B1:
|
||||
// (byte) plot::x#2 = (byte) 0 // yby=coby1
|
||||
ldy #0
|
||||
// (byte) plot::i#2 = (byte) plot::i#3 // register copy
|
||||
plot__B2_from_B2:
|
||||
// (byte) plot::x#2 = (byte) plot::x#1 // register copy
|
||||
// (byte) plot::i#2 = (byte) plot::i#1 // register copy
|
||||
plot__B2:
|
||||
// (byte~) plot::$3 ← (word) 4096 *idx (byte) plot::i#2 // aby=cowo1_staridx_xby
|
||||
lda 4096,x
|
||||
// *((byte*) plot::line#2 + (byte) plot::x#2) ← (byte~) plot::$3 // ptr_zpptrby1_yby=aby
|
||||
sta (101),y
|
||||
// (byte) plot::i#1 ← ++ (byte) plot::i#2 // xby=_inc_xby
|
||||
inx
|
||||
// (byte) plot::x#1 ← ++ (byte) plot::x#2 // yby=_inc_yby
|
||||
iny
|
||||
// if((byte) plot::x#1<(byte) 16) goto plot::@2 // yby_lt_coby1_then_la1
|
||||
cpy #16
|
||||
bcc plot__B2_from_B2
|
||||
B15:
|
||||
// (byte*) plot::line#1 ← (byte*) plot::line#2 + (byte) 40 // zpptrby1=zpptrby1_plus_coby1
|
||||
lda 101
|
||||
clc
|
||||
adc #40
|
||||
@ -81,92 +55,58 @@ B15:
|
||||
bcc !+
|
||||
inc 101+1
|
||||
!:
|
||||
// (byte) plot::y#1 ← -- (byte) plot::y#2 // zpby1=_dec_zpby1
|
||||
dec 100
|
||||
// if((byte) plot::y#1!=(byte) 0) goto plot::@1 // zpby1_neq_0_then_la1
|
||||
lda 100
|
||||
bne plot__B1_from_B15
|
||||
plot__Breturn:
|
||||
rts
|
||||
flip:
|
||||
flip__B1_from_flip:
|
||||
// (byte) flip::r#2 = (byte) 16 // zpby1=coby1
|
||||
lda #16
|
||||
sta 104
|
||||
// (byte) flip::srcIdx#3 = (byte) 0 // xby=coby1
|
||||
ldx #0
|
||||
// (byte) flip::dstIdx#5 = (byte) 15 // yby=coby1
|
||||
ldy #15
|
||||
flip__B1_from_B11:
|
||||
// (byte) flip::r#2 = (byte) flip::r#1 // register copy
|
||||
// (byte) flip::srcIdx#3 = (byte) flip::srcIdx#1 // register copy
|
||||
// (byte) flip::dstIdx#5 = (byte) flip::dstIdx#2 // register copy
|
||||
flip__B1:
|
||||
flip__B2_from_B1:
|
||||
// (byte) flip::c#2 = (byte) 16 // zpby1=coby1
|
||||
lda #16
|
||||
sta 103
|
||||
// (byte) flip::dstIdx#3 = (byte) flip::dstIdx#5 // register copy
|
||||
// (byte) flip::srcIdx#2 = (byte) flip::srcIdx#3 // register copy
|
||||
flip__B2_from_B2:
|
||||
// (byte) flip::c#2 = (byte) flip::c#1 // register copy
|
||||
// (byte) flip::dstIdx#3 = (byte) flip::dstIdx#1 // register copy
|
||||
// (byte) flip::srcIdx#2 = (byte) flip::srcIdx#1 // register copy
|
||||
flip__B2:
|
||||
// (byte~) flip::$0 ← (word) 4096 *idx (byte) flip::srcIdx#2 // aby=cowo1_staridx_xby
|
||||
lda 4096,x
|
||||
// *((word) 4352 + (byte) flip::dstIdx#3) ← (byte~) flip::$0 // ptr_cowo1_yby=aby
|
||||
sta 4352,y
|
||||
// (byte) flip::srcIdx#1 ← ++ (byte) flip::srcIdx#2 // xby=_inc_xby
|
||||
inx
|
||||
// (byte) flip::dstIdx#1 ← (byte) flip::dstIdx#3 + (byte) 16 // yby=yby_plus_coby1
|
||||
tya
|
||||
clc
|
||||
adc #16
|
||||
tay
|
||||
// (byte) flip::c#1 ← -- (byte) flip::c#2 // zpby1=_dec_zpby1
|
||||
dec 103
|
||||
// if((byte) flip::c#1!=(byte) 0) goto flip::@2 // zpby1_neq_0_then_la1
|
||||
lda 103
|
||||
bne flip__B2_from_B2
|
||||
B11:
|
||||
// (byte) flip::dstIdx#2 ← -- (byte) flip::dstIdx#1 // yby=_dec_yby
|
||||
dey
|
||||
// (byte) flip::r#1 ← -- (byte) flip::r#2 // zpby1=_dec_zpby1
|
||||
dec 104
|
||||
// if((byte) flip::r#1!=(byte) 0) goto flip::@1 // zpby1_neq_0_then_la1
|
||||
lda 104
|
||||
bne flip__B1_from_B11
|
||||
flip__B3_from_B11:
|
||||
// (byte) flip::i#2 = (byte) 0 // xby=coby1
|
||||
ldx #0
|
||||
flip__B3_from_B3:
|
||||
// (byte) flip::i#2 = (byte) flip::i#1 // register copy
|
||||
flip__B3:
|
||||
// (byte~) flip::$4 ← (word) 4352 *idx (byte) flip::i#2 // aby=cowo1_staridx_xby
|
||||
lda 4352,x
|
||||
// *((word) 4096 + (byte) flip::i#2) ← (byte~) flip::$4 // ptr_cowo1_xby=aby
|
||||
sta 4096,x
|
||||
// (byte) flip::i#1 ← ++ (byte) flip::i#2 // xby=_inc_xby
|
||||
inx
|
||||
// if((byte) flip::i#1!=(byte) 0) goto flip::@3 // xby_neq_0_then_la1
|
||||
cpx #0
|
||||
bne flip__B3_from_B3
|
||||
flip__Breturn:
|
||||
rts
|
||||
prepare:
|
||||
prepare__B1_from_prepare:
|
||||
// (byte) prepare::i#2 = (byte) 0 // xby=coby1
|
||||
ldx #0
|
||||
prepare__B1_from_B1:
|
||||
// (byte) prepare::i#2 = (byte) prepare::i#1 // register copy
|
||||
prepare__B1:
|
||||
// *((word) 4096 + (byte) prepare::i#2) ← (byte) prepare::i#2 // ptr_cowo1_xby=xby
|
||||
txa
|
||||
sta 4096,x
|
||||
// (byte) prepare::i#1 ← ++ (byte) prepare::i#2 // xby=_inc_xby
|
||||
inx
|
||||
// if((byte) prepare::i#1!=(byte) 0) goto prepare::@1 // xby_neq_0_then_la1
|
||||
cpx #0
|
||||
bne prepare__B1_from_B1
|
||||
prepare__Breturn:
|
||||
|
Loading…
Reference in New Issue
Block a user