1
0
mirror of https://gitlab.com/camelot/kickc.git synced 2025-01-07 07:29:49 +00:00

Temporary implementation for arrays of structs

This commit is contained in:
jespergravgaard 2019-05-29 08:05:34 +02:00
parent 837104f4fd
commit 007985111a
15 changed files with 86 additions and 4 deletions

View File

@ -0,0 +1,2 @@
sta {c1},x

View File

@ -0,0 +1,2 @@
sta {c1}+1,x

View File

@ -0,0 +1,2 @@
sta {c1},y

View File

@ -0,0 +1,2 @@
sta {c1}+1,y

View File

@ -0,0 +1 @@
lda {c1}

View File

@ -0,0 +1 @@
lda {c1}+1

View File

@ -0,0 +1 @@
lda {c1},x

View File

@ -0,0 +1 @@
lda {c1}+1,x

View File

@ -0,0 +1 @@
lda {c1},y

View File

@ -0,0 +1 @@
lda {c1}+1,y

View File

@ -383,6 +383,8 @@ public class AsmFragmentInstanceSpecFactory {
return "ppr";
} else if(elementType instanceof SymbolTypePointer) {
return "ppt";
} else if(elementType instanceof SymbolTypeStruct) {
return "pss";
} else {
throw new RuntimeException("Not implemented " + type);
}

View File

@ -6,10 +6,7 @@ import dk.camelot64.kickc.model.*;
import dk.camelot64.kickc.model.operators.Operators;
import dk.camelot64.kickc.model.statements.*;
import dk.camelot64.kickc.model.symbols.*;
import dk.camelot64.kickc.model.types.SymbolType;
import dk.camelot64.kickc.model.types.SymbolTypeArray;
import dk.camelot64.kickc.model.types.SymbolTypePointer;
import dk.camelot64.kickc.model.types.SymbolTypeProcedure;
import dk.camelot64.kickc.model.types.*;
import dk.camelot64.kickc.model.values.*;
import java.util.*;
@ -438,6 +435,11 @@ public class Pass4CodeGeneration {
String asmSize = AsmFormat.getAsmConstant(program, new ConstantBinary(new ConstantInteger(2L), Operators.MULTIPLY, arraySize), 99, scopeRef);
asm.addDataFilled(asmName.replace("#", "_").replace("$", "_"), AsmDataNumeric.Type.WORD, asmSize, size, "0");
added.add(asmName);
} else if(constantArrayFilled.getElementType() instanceof SymbolTypeStruct) {
SymbolTypeStruct structElementType = (SymbolTypeStruct) constantArrayFilled.getElementType();
String asmSize = AsmFormat.getAsmConstant(program, new ConstantBinary(new ConstantInteger((long) structElementType.getSizeBytes()), Operators.MULTIPLY, arraySize), 99, scopeRef);
asm.addDataFilled(asmName.replace("#", "_").replace("$", "_"), AsmDataNumeric.Type.WORD, asmSize, size, "0");
added.add(asmName);
} else {
throw new RuntimeException("Unhandled constant array element type " + constantArrayFilled.toString(program));
}

View File

@ -32,6 +32,11 @@ public class TestPrograms {
public TestPrograms() {
}
@Test
public void testStruct3() throws IOException, URISyntaxException {
compileAndCompare("struct-3", log().verboseParse().verboseCreateSsa().verboseStatementSequence().verboseFragmentLog());
}
@Test
public void testStruct2() throws IOException, URISyntaxException {
compileAndCompare("struct-2");

20
src/test/kc/struct-3.kc Normal file
View File

@ -0,0 +1,20 @@
// Minimal struct - different instances and copying
struct Point {
byte x;
byte y;
};
struct Point[4] points;
void main() {
for( byte i: 0..4) {
points[i].x = i;
points[i].y = i+1;
}
const byte* SCREEN = 0x0400;
for( byte i: 0..4) {
SCREEN[i] = points[i].x;
(SCREEN+40)[i] = points[i].y;
}
}

39
src/test/ref/struct-3.asm Normal file
View File

@ -0,0 +1,39 @@
// Minimal struct - different instances and copying
.pc = $801 "Basic"
:BasicUpstart(main)
.pc = $80d "Program"
main: {
.label SCREEN = $400
.label _5 = 2
ldx #0
b1:
txa
asl
sta _5
tay
txa
sta points,y
txa
tay
iny
tya
ldy _5
sta points+1,y
inx
cpx #5
bne b1
ldy #0
b2:
tya
asl
tax
lda points,x
sta SCREEN,y
lda points+1,x
sta SCREEN+$28,y
iny
cpy #5
bne b2
rts
}
points: .fill 2*4, 0