mirror of
https://gitlab.com/camelot/kickc.git
synced 2024-12-22 06:29:23 +00:00
Implemented C99 compatible union initializer method.
- Added test cases. - Reworked parser. - Added code redesign to avoid crashes in Initializers.java.
This commit is contained in:
parent
9db2d9b960
commit
c5f260e882
@ -217,12 +217,9 @@ commaExpr
|
|||||||
| commaExpr COMMA expr #commaSimple
|
| commaExpr COMMA expr #commaSimple
|
||||||
;
|
;
|
||||||
|
|
||||||
initMemberExpr
|
|
||||||
: expr
|
|
||||||
;
|
|
||||||
|
|
||||||
initExpr
|
initExpr
|
||||||
: (DOT initMemberExpr ASSIGN)? expr
|
: (DOT expr ASSIGN)? expr
|
||||||
;
|
;
|
||||||
|
|
||||||
|
|
||||||
@ -252,9 +249,9 @@ expr
|
|||||||
| expr ( '&&' ) expr #exprBinary
|
| expr ( '&&' ) expr #exprBinary
|
||||||
| expr ( '||' ) expr #exprBinary
|
| expr ( '||' ) expr #exprBinary
|
||||||
| expr '?' expr COLON expr #exprTernary
|
| expr '?' expr COLON expr #exprTernary
|
||||||
| CURLY_BEGIN initExpr (COMMA initExpr )* COMMA? CURLY_END #initList
|
|
||||||
| <assoc=right> expr '=' expr #exprAssignment
|
| <assoc=right> expr '=' expr #exprAssignment
|
||||||
| <assoc=right> expr ASSIGN_COMPOUND expr #exprAssignmentCompound
|
| <assoc=right> expr ASSIGN_COMPOUND expr #exprAssignmentCompound
|
||||||
|
| CURLY_BEGIN initExpr (COMMA initExpr )* COMMA? CURLY_END #initList
|
||||||
| NAME #exprId
|
| NAME #exprId
|
||||||
| NUMBER #exprNumber
|
| NUMBER #exprNumber
|
||||||
| STRING+ #exprString
|
| STRING+ #exprString
|
||||||
|
@ -169,21 +169,25 @@ public class Initializers {
|
|||||||
for(int i = 0; i < structInitNeedSize; i++) {
|
for(int i = 0; i < structInitNeedSize; i++) {
|
||||||
Variable memberDef = null;
|
Variable memberDef = null;
|
||||||
RValue memberValue = valueIt.next();
|
RValue memberValue = valueIt.next();
|
||||||
String memberUnionName = ((ValueStructList)valueList).getMember(memberValue);
|
if(structDefinition.isUnion()) {
|
||||||
if(memberUnionName != null) {
|
String memberUnionName = ((ValueStructList)valueList).getMember(memberValue);
|
||||||
boolean found = false;
|
if(memberUnionName != null) {
|
||||||
while (memberDefIt.hasNext()) {
|
boolean found = false;
|
||||||
memberDef = memberDefIt.next();
|
while (memberDefIt.hasNext()) {
|
||||||
if (memberDef.getLocalName().contentEquals(memberUnionName)) {
|
memberDef = memberDefIt.next();
|
||||||
found = true;
|
if (memberDef.getLocalName().contentEquals(memberUnionName)) {
|
||||||
break;
|
found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
if (!found)
|
||||||
|
throw new CompileError(
|
||||||
|
"Union initializer cannot find member field " + memberUnionName + "\n" +
|
||||||
|
" Union initializer: " + valueList.toString(program),
|
||||||
|
source);
|
||||||
|
} else {
|
||||||
|
memberDef = memberDefIt.next();
|
||||||
}
|
}
|
||||||
if(!found)
|
|
||||||
throw new CompileError(
|
|
||||||
"Union initializer cannot find member field " + memberUnionName + "\n" +
|
|
||||||
" Union initializer: " + valueList.toString(program),
|
|
||||||
source);
|
|
||||||
} else {
|
} else {
|
||||||
memberDef = memberDefIt.next();
|
memberDef = memberDefIt.next();
|
||||||
}
|
}
|
||||||
|
@ -1913,38 +1913,24 @@ public class Pass0GenerateStatementSequence extends KickCParserBaseVisitor<Objec
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public String visitInitExpr(KickCParser.InitExprContext ctx) {
|
|
||||||
List<RValue> initValues = new ArrayList<>();
|
|
||||||
HashMap<String, RValue> members = new HashMap<>();
|
|
||||||
|
|
||||||
String member = null;
|
|
||||||
if(ctx.initMemberExpr() != null) {
|
|
||||||
member = ctx.initMemberExpr().getText();
|
|
||||||
}
|
|
||||||
return member;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public RValue visitInitList(KickCParser.InitListContext ctx) {
|
public RValue visitInitList(KickCParser.InitListContext ctx) {
|
||||||
List<RValue> initValues = new ArrayList<>();
|
List<RValue> initValues = new ArrayList<>();
|
||||||
HashMap<RValue, String> members = new HashMap<>();
|
HashMap<RValue, String> initDesignators = new HashMap<>();
|
||||||
|
|
||||||
for(KickCParser.InitExprContext initializer : ctx.initExpr()) {
|
for(KickCParser.InitExprContext initializer : ctx.initExpr()) {
|
||||||
RValue member = null;
|
|
||||||
String initString = initializer.getText();
|
String initString = initializer.getText();
|
||||||
if (initializer.initMemberExpr() != null) {
|
if (initializer.expr().size() == 2) {
|
||||||
if(initializer.initMemberExpr().isEmpty() == false) {
|
RValue member = (RValue) visit(initializer.expr(0));
|
||||||
member = (RValue) visit(initializer.initMemberExpr());
|
RValue rValue = (RValue) visit(initializer.expr(1));
|
||||||
}
|
initValues.add(rValue);
|
||||||
}
|
initDesignators.put(rValue, member.toString());
|
||||||
RValue rValue = (RValue) visit(initializer.expr());
|
} else {
|
||||||
initValues.add(rValue);
|
RValue rValue = (RValue) visit(initializer.expr(0));
|
||||||
if(member!=null) {
|
initValues.add(rValue);
|
||||||
members.put(rValue, member.toString());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return new ValueStructList(members, initValues);
|
return new ValueStructList(initDesignators, initValues);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -2541,6 +2541,26 @@ public class TestProgramsFast extends TestPrograms {
|
|||||||
compileAndCompare("weeip-bbslist.c");
|
compileAndCompare("weeip-bbslist.c");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testUnion12() throws IOException {
|
||||||
|
compileAndCompare("union-12.c");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testUnion11() throws IOException {
|
||||||
|
compileAndCompare("union-11.c");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testUnion10() throws IOException {
|
||||||
|
compileAndCompare("union-10.c");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testUnion9() throws IOException {
|
||||||
|
compileAndCompare("union-9.c");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testUnion8() throws IOException {
|
public void testUnion8() throws IOException {
|
||||||
compileAndCompare("union-8.c");
|
compileAndCompare("union-8.c");
|
||||||
|
27
src/test/kc/union-10.c
Normal file
27
src/test/kc/union-10.c
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
// More extensive union with C99 style designator initialization behaviour of the second element.
|
||||||
|
|
||||||
|
struct Move {
|
||||||
|
char f;
|
||||||
|
char t;
|
||||||
|
char s;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct Turn {
|
||||||
|
char t;
|
||||||
|
char s;
|
||||||
|
char r;
|
||||||
|
char d;
|
||||||
|
};
|
||||||
|
|
||||||
|
union Data {
|
||||||
|
struct Move m;
|
||||||
|
struct Turn t;
|
||||||
|
};
|
||||||
|
|
||||||
|
union Data data = { .t={1,2,3,4} };
|
||||||
|
|
||||||
|
char* const SCREEN = (char*)0x0400;
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
SCREEN[0] = data.m.f;
|
||||||
|
}
|
27
src/test/kc/union-11.c
Normal file
27
src/test/kc/union-11.c
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
// More extensive union with C99 style designator initialization behaviour of the first element.
|
||||||
|
|
||||||
|
struct Move {
|
||||||
|
char f;
|
||||||
|
char t;
|
||||||
|
char s;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct Turn {
|
||||||
|
char t;
|
||||||
|
char s;
|
||||||
|
char r;
|
||||||
|
char d;
|
||||||
|
};
|
||||||
|
|
||||||
|
union Data {
|
||||||
|
struct Move m;
|
||||||
|
struct Turn t;
|
||||||
|
};
|
||||||
|
|
||||||
|
union Data data = { .m={1,2,3} };
|
||||||
|
|
||||||
|
char* const SCREEN = (char*)0x0400;
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
SCREEN[0] = data.m.f;
|
||||||
|
}
|
29
src/test/kc/union-12.c
Normal file
29
src/test/kc/union-12.c
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
// More extensive union with C99 style designator initialization behaviour using const expressions.
|
||||||
|
|
||||||
|
struct Move {
|
||||||
|
char f;
|
||||||
|
char t;
|
||||||
|
char s;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct Turn {
|
||||||
|
char t;
|
||||||
|
char s;
|
||||||
|
char r;
|
||||||
|
char d;
|
||||||
|
};
|
||||||
|
|
||||||
|
union Data {
|
||||||
|
struct Move m;
|
||||||
|
struct Turn t;
|
||||||
|
};
|
||||||
|
|
||||||
|
const struct Move move = {1,2,3};
|
||||||
|
|
||||||
|
union Data data = { .m=move };
|
||||||
|
|
||||||
|
char* const SCREEN = (char*)0x0400;
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
SCREEN[0] = data.m.f;
|
||||||
|
}
|
14
src/test/kc/union-9.c
Normal file
14
src/test/kc/union-9.c
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
// Minimal union with C99 style designator initialization behaviour.
|
||||||
|
|
||||||
|
union Data {
|
||||||
|
char b;
|
||||||
|
unsigned w;
|
||||||
|
};
|
||||||
|
|
||||||
|
union Data data = { .w=1234 };
|
||||||
|
|
||||||
|
char* const SCREEN = (char*)0x0400;
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
SCREEN[0] = data.b;
|
||||||
|
}
|
29
src/test/target/union-10.asm
Normal file
29
src/test/target/union-10.asm
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
// File Comments
|
||||||
|
// More extensive union with C99 style designator initialization behaviour.
|
||||||
|
// Upstart
|
||||||
|
.cpu _65c02
|
||||||
|
// Commodore 64 PRG executable file
|
||||||
|
.file [name="union-10.prg", type="prg", segments="Program"]
|
||||||
|
.segmentdef Program [segments="Basic, Code, Data"]
|
||||||
|
.segmentdef Basic [start=$0801]
|
||||||
|
.segmentdef Code [start=$80d]
|
||||||
|
.segmentdef Data [startAfter="Code"]
|
||||||
|
.segment Basic
|
||||||
|
:BasicUpstart(main)
|
||||||
|
// Global Constants & labels
|
||||||
|
.label SCREEN = $400
|
||||||
|
.segment Code
|
||||||
|
// main
|
||||||
|
main: {
|
||||||
|
// SCREEN[0] = data.m.f
|
||||||
|
// [0] *SCREEN = *((char *)(struct Move *)&data) -- _deref_pbuc1=_deref_pbuc2
|
||||||
|
lda data
|
||||||
|
sta SCREEN
|
||||||
|
// main::@return
|
||||||
|
// }
|
||||||
|
// [1] return
|
||||||
|
rts
|
||||||
|
}
|
||||||
|
// File Data
|
||||||
|
.segment Data
|
||||||
|
data: .byte 1, 2, 3, 4
|
67
src/test/target/union-10.dbg
Normal file
67
src/test/target/union-10.dbg
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
<C64debugger version="1.0">
|
||||||
|
<Sources values="INDEX,FILE">
|
||||||
|
0,KickAss.jar:/include/autoinclude.asm
|
||||||
|
1,D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\target\union-10.asm
|
||||||
|
</Sources>
|
||||||
|
|
||||||
|
<Segment name="Default" dest="" values="START,END,FILE_IDX,LINE1,COL1,LINE2,COL2">
|
||||||
|
</Segment>
|
||||||
|
|
||||||
|
<Segment name="Program" dest="" values="START,END,FILE_IDX,LINE1,COL1,LINE2,COL2">
|
||||||
|
<Block name="Basic">
|
||||||
|
$0801,$0802,0,38,2,38,6
|
||||||
|
$0803,$0804,0,39,5,39,9
|
||||||
|
$0805,$0805,0,40,5,40,9
|
||||||
|
$0806,$0809,0,41,2,41,6
|
||||||
|
$080a,$080a,0,42,2,42,6
|
||||||
|
$080b,$080c,0,44,5,44,9
|
||||||
|
</Block>
|
||||||
|
<Block name="Code">
|
||||||
|
$080d,$080f,1,20,5,20,7
|
||||||
|
$0810,$0812,1,21,5,21,7
|
||||||
|
$0813,$0813,1,25,5,25,7
|
||||||
|
</Block>
|
||||||
|
<Block name="Data">
|
||||||
|
$0814,$0817,1,29,9,29,13
|
||||||
|
</Block>
|
||||||
|
</Segment>
|
||||||
|
|
||||||
|
<Segment name="Basic" dest="" values="START,END,FILE_IDX,LINE1,COL1,LINE2,COL2">
|
||||||
|
<Block name="Basic">
|
||||||
|
$0801,$0802,0,38,2,38,6
|
||||||
|
$0803,$0804,0,39,5,39,9
|
||||||
|
$0805,$0805,0,40,5,40,9
|
||||||
|
$0806,$0809,0,41,2,41,6
|
||||||
|
$080a,$080a,0,42,2,42,6
|
||||||
|
$080b,$080c,0,44,5,44,9
|
||||||
|
</Block>
|
||||||
|
</Segment>
|
||||||
|
|
||||||
|
<Segment name="Code" dest="" values="START,END,FILE_IDX,LINE1,COL1,LINE2,COL2">
|
||||||
|
<Block name="Code">
|
||||||
|
$080d,$080f,1,20,5,20,7
|
||||||
|
$0810,$0812,1,21,5,21,7
|
||||||
|
$0813,$0813,1,25,5,25,7
|
||||||
|
</Block>
|
||||||
|
</Segment>
|
||||||
|
|
||||||
|
<Segment name="Data" dest="" values="START,END,FILE_IDX,LINE1,COL1,LINE2,COL2">
|
||||||
|
<Block name="Data">
|
||||||
|
$0814,$0817,1,29,9,29,13
|
||||||
|
</Block>
|
||||||
|
</Segment>
|
||||||
|
|
||||||
|
<Labels values="SEGMENT,ADDRESS,NAME,START,END,FILE_IDX,LINE1,COL1,LINE2,COL2">
|
||||||
|
Basic,$0400,SCREEN,1,14,10,14,15
|
||||||
|
Code,$080d,main,1,17,1,17,5
|
||||||
|
Basic,$080b,upstartEnd,0,43,1,43,11
|
||||||
|
Data,$0814,data,1,29,3,29,7
|
||||||
|
</Labels>
|
||||||
|
|
||||||
|
<Breakpoints values="SEGMENT,ADDRESS,ARGUMENT">
|
||||||
|
</Breakpoints>
|
||||||
|
|
||||||
|
<Watchpoints values="SEGMENT,ADDRESS1,ADDRESS2,ARGUMENT">
|
||||||
|
</Watchpoints>
|
||||||
|
|
||||||
|
</C64debugger>
|
23
src/test/target/union-10.klog
Normal file
23
src/test/target/union-10.klog
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
Output dir: D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\target
|
||||||
|
parsing
|
||||||
|
flex pass 1
|
||||||
|
flex pass 2
|
||||||
|
flex pass 3
|
||||||
|
Output pass
|
||||||
|
Writing prg file: union-10.prg
|
||||||
|
|
||||||
|
Memory Map
|
||||||
|
----------
|
||||||
|
Program-segment:
|
||||||
|
|
||||||
|
Basic-segment:
|
||||||
|
$0801-$080c Basic
|
||||||
|
|
||||||
|
Code-segment:
|
||||||
|
$080d-$0813 Code
|
||||||
|
|
||||||
|
Data-segment:
|
||||||
|
$0814-$0817 Data
|
||||||
|
|
||||||
|
Writing Vice symbol file: union-10.vs
|
||||||
|
Writing Symbol file: union-10.sym
|
BIN
src/test/target/union-10.prg
Normal file
BIN
src/test/target/union-10.prg
Normal file
Binary file not shown.
4
src/test/target/union-10.sym
Normal file
4
src/test/target/union-10.sym
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
.label SCREEN=$400
|
||||||
|
.label data=$814
|
||||||
|
.label main=$80d {
|
||||||
|
}
|
4
src/test/target/union-10.vs
Normal file
4
src/test/target/union-10.vs
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
al C:400 .SCREEN
|
||||||
|
al C:814 .data
|
||||||
|
al C:80b .upstartEnd
|
||||||
|
al C:80d .main
|
30
src/test/target/union-11.asm
Normal file
30
src/test/target/union-11.asm
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
// File Comments
|
||||||
|
// More extensive union with C99 style designator initialization behaviour.
|
||||||
|
// Upstart
|
||||||
|
.cpu _65c02
|
||||||
|
// Commodore 64 PRG executable file
|
||||||
|
.file [name="union-11.prg", type="prg", segments="Program"]
|
||||||
|
.segmentdef Program [segments="Basic, Code, Data"]
|
||||||
|
.segmentdef Basic [start=$0801]
|
||||||
|
.segmentdef Code [start=$80d]
|
||||||
|
.segmentdef Data [startAfter="Code"]
|
||||||
|
.segment Basic
|
||||||
|
:BasicUpstart(main)
|
||||||
|
// Global Constants & labels
|
||||||
|
.label SCREEN = $400
|
||||||
|
.segment Code
|
||||||
|
// main
|
||||||
|
main: {
|
||||||
|
// SCREEN[0] = data.m.f
|
||||||
|
// [0] *SCREEN = *((char *)(struct Move *)&data) -- _deref_pbuc1=_deref_pbuc2
|
||||||
|
lda data
|
||||||
|
sta SCREEN
|
||||||
|
// main::@return
|
||||||
|
// }
|
||||||
|
// [1] return
|
||||||
|
rts
|
||||||
|
}
|
||||||
|
// File Data
|
||||||
|
.segment Data
|
||||||
|
data: .byte 1, 2, 3
|
||||||
|
.fill 1, 0
|
69
src/test/target/union-11.dbg
Normal file
69
src/test/target/union-11.dbg
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
<C64debugger version="1.0">
|
||||||
|
<Sources values="INDEX,FILE">
|
||||||
|
0,KickAss.jar:/include/autoinclude.asm
|
||||||
|
1,D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\target\union-11.asm
|
||||||
|
</Sources>
|
||||||
|
|
||||||
|
<Segment name="Default" dest="" values="START,END,FILE_IDX,LINE1,COL1,LINE2,COL2">
|
||||||
|
</Segment>
|
||||||
|
|
||||||
|
<Segment name="Program" dest="" values="START,END,FILE_IDX,LINE1,COL1,LINE2,COL2">
|
||||||
|
<Block name="Basic">
|
||||||
|
$0801,$0802,0,38,2,38,6
|
||||||
|
$0803,$0804,0,39,5,39,9
|
||||||
|
$0805,$0805,0,40,5,40,9
|
||||||
|
$0806,$0809,0,41,2,41,6
|
||||||
|
$080a,$080a,0,42,2,42,6
|
||||||
|
$080b,$080c,0,44,5,44,9
|
||||||
|
</Block>
|
||||||
|
<Block name="Code">
|
||||||
|
$080d,$080f,1,20,5,20,7
|
||||||
|
$0810,$0812,1,21,5,21,7
|
||||||
|
$0813,$0813,1,25,5,25,7
|
||||||
|
</Block>
|
||||||
|
<Block name="Data">
|
||||||
|
$0814,$0816,1,29,9,29,13
|
||||||
|
$0817,$0817,1,30,3,30,7
|
||||||
|
</Block>
|
||||||
|
</Segment>
|
||||||
|
|
||||||
|
<Segment name="Basic" dest="" values="START,END,FILE_IDX,LINE1,COL1,LINE2,COL2">
|
||||||
|
<Block name="Basic">
|
||||||
|
$0801,$0802,0,38,2,38,6
|
||||||
|
$0803,$0804,0,39,5,39,9
|
||||||
|
$0805,$0805,0,40,5,40,9
|
||||||
|
$0806,$0809,0,41,2,41,6
|
||||||
|
$080a,$080a,0,42,2,42,6
|
||||||
|
$080b,$080c,0,44,5,44,9
|
||||||
|
</Block>
|
||||||
|
</Segment>
|
||||||
|
|
||||||
|
<Segment name="Code" dest="" values="START,END,FILE_IDX,LINE1,COL1,LINE2,COL2">
|
||||||
|
<Block name="Code">
|
||||||
|
$080d,$080f,1,20,5,20,7
|
||||||
|
$0810,$0812,1,21,5,21,7
|
||||||
|
$0813,$0813,1,25,5,25,7
|
||||||
|
</Block>
|
||||||
|
</Segment>
|
||||||
|
|
||||||
|
<Segment name="Data" dest="" values="START,END,FILE_IDX,LINE1,COL1,LINE2,COL2">
|
||||||
|
<Block name="Data">
|
||||||
|
$0814,$0816,1,29,9,29,13
|
||||||
|
$0817,$0817,1,30,3,30,7
|
||||||
|
</Block>
|
||||||
|
</Segment>
|
||||||
|
|
||||||
|
<Labels values="SEGMENT,ADDRESS,NAME,START,END,FILE_IDX,LINE1,COL1,LINE2,COL2">
|
||||||
|
Basic,$0400,SCREEN,1,14,10,14,15
|
||||||
|
Code,$080d,main,1,17,1,17,5
|
||||||
|
Basic,$080b,upstartEnd,0,43,1,43,11
|
||||||
|
Data,$0814,data,1,29,3,29,7
|
||||||
|
</Labels>
|
||||||
|
|
||||||
|
<Breakpoints values="SEGMENT,ADDRESS,ARGUMENT">
|
||||||
|
</Breakpoints>
|
||||||
|
|
||||||
|
<Watchpoints values="SEGMENT,ADDRESS1,ADDRESS2,ARGUMENT">
|
||||||
|
</Watchpoints>
|
||||||
|
|
||||||
|
</C64debugger>
|
23
src/test/target/union-11.klog
Normal file
23
src/test/target/union-11.klog
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
Output dir: D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\target
|
||||||
|
parsing
|
||||||
|
flex pass 1
|
||||||
|
flex pass 2
|
||||||
|
flex pass 3
|
||||||
|
Output pass
|
||||||
|
Writing prg file: union-11.prg
|
||||||
|
|
||||||
|
Memory Map
|
||||||
|
----------
|
||||||
|
Program-segment:
|
||||||
|
|
||||||
|
Basic-segment:
|
||||||
|
$0801-$080c Basic
|
||||||
|
|
||||||
|
Code-segment:
|
||||||
|
$080d-$0813 Code
|
||||||
|
|
||||||
|
Data-segment:
|
||||||
|
$0814-$0817 Data
|
||||||
|
|
||||||
|
Writing Vice symbol file: union-11.vs
|
||||||
|
Writing Symbol file: union-11.sym
|
BIN
src/test/target/union-11.prg
Normal file
BIN
src/test/target/union-11.prg
Normal file
Binary file not shown.
4
src/test/target/union-11.sym
Normal file
4
src/test/target/union-11.sym
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
.label SCREEN=$400
|
||||||
|
.label data=$814
|
||||||
|
.label main=$80d {
|
||||||
|
}
|
4
src/test/target/union-11.vs
Normal file
4
src/test/target/union-11.vs
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
al C:400 .SCREEN
|
||||||
|
al C:814 .data
|
||||||
|
al C:80b .upstartEnd
|
||||||
|
al C:80d .main
|
30
src/test/target/union-12.asm
Normal file
30
src/test/target/union-12.asm
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
// File Comments
|
||||||
|
// More extensive union with C99 style designator initialization behaviour using const expressions.
|
||||||
|
// Upstart
|
||||||
|
.cpu _65c02
|
||||||
|
// Commodore 64 PRG executable file
|
||||||
|
.file [name="union-12.prg", type="prg", segments="Program"]
|
||||||
|
.segmentdef Program [segments="Basic, Code, Data"]
|
||||||
|
.segmentdef Basic [start=$0801]
|
||||||
|
.segmentdef Code [start=$80d]
|
||||||
|
.segmentdef Data [startAfter="Code"]
|
||||||
|
.segment Basic
|
||||||
|
:BasicUpstart(main)
|
||||||
|
// Global Constants & labels
|
||||||
|
.label SCREEN = $400
|
||||||
|
.segment Code
|
||||||
|
// main
|
||||||
|
main: {
|
||||||
|
// SCREEN[0] = data.m.f
|
||||||
|
// [0] *SCREEN = *((char *)(struct Move *)&data) -- _deref_pbuc1=_deref_pbuc2
|
||||||
|
lda data
|
||||||
|
sta SCREEN
|
||||||
|
// main::@return
|
||||||
|
// }
|
||||||
|
// [1] return
|
||||||
|
rts
|
||||||
|
}
|
||||||
|
// File Data
|
||||||
|
.segment Data
|
||||||
|
move: .byte 1, 2, 3
|
||||||
|
data: .fill 1, 0
|
70
src/test/target/union-12.dbg
Normal file
70
src/test/target/union-12.dbg
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
<C64debugger version="1.0">
|
||||||
|
<Sources values="INDEX,FILE">
|
||||||
|
0,KickAss.jar:/include/autoinclude.asm
|
||||||
|
1,D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\target\union-12.asm
|
||||||
|
</Sources>
|
||||||
|
|
||||||
|
<Segment name="Default" dest="" values="START,END,FILE_IDX,LINE1,COL1,LINE2,COL2">
|
||||||
|
</Segment>
|
||||||
|
|
||||||
|
<Segment name="Program" dest="" values="START,END,FILE_IDX,LINE1,COL1,LINE2,COL2">
|
||||||
|
<Block name="Basic">
|
||||||
|
$0801,$0802,0,38,2,38,6
|
||||||
|
$0803,$0804,0,39,5,39,9
|
||||||
|
$0805,$0805,0,40,5,40,9
|
||||||
|
$0806,$0809,0,41,2,41,6
|
||||||
|
$080a,$080a,0,42,2,42,6
|
||||||
|
$080b,$080c,0,44,5,44,9
|
||||||
|
</Block>
|
||||||
|
<Block name="Code">
|
||||||
|
$080d,$080f,1,20,5,20,7
|
||||||
|
$0810,$0812,1,21,5,21,7
|
||||||
|
$0813,$0813,1,25,5,25,7
|
||||||
|
</Block>
|
||||||
|
<Block name="Data">
|
||||||
|
$0814,$0816,1,29,9,29,13
|
||||||
|
$0817,$0817,1,30,9,30,13
|
||||||
|
</Block>
|
||||||
|
</Segment>
|
||||||
|
|
||||||
|
<Segment name="Basic" dest="" values="START,END,FILE_IDX,LINE1,COL1,LINE2,COL2">
|
||||||
|
<Block name="Basic">
|
||||||
|
$0801,$0802,0,38,2,38,6
|
||||||
|
$0803,$0804,0,39,5,39,9
|
||||||
|
$0805,$0805,0,40,5,40,9
|
||||||
|
$0806,$0809,0,41,2,41,6
|
||||||
|
$080a,$080a,0,42,2,42,6
|
||||||
|
$080b,$080c,0,44,5,44,9
|
||||||
|
</Block>
|
||||||
|
</Segment>
|
||||||
|
|
||||||
|
<Segment name="Code" dest="" values="START,END,FILE_IDX,LINE1,COL1,LINE2,COL2">
|
||||||
|
<Block name="Code">
|
||||||
|
$080d,$080f,1,20,5,20,7
|
||||||
|
$0810,$0812,1,21,5,21,7
|
||||||
|
$0813,$0813,1,25,5,25,7
|
||||||
|
</Block>
|
||||||
|
</Segment>
|
||||||
|
|
||||||
|
<Segment name="Data" dest="" values="START,END,FILE_IDX,LINE1,COL1,LINE2,COL2">
|
||||||
|
<Block name="Data">
|
||||||
|
$0814,$0816,1,29,9,29,13
|
||||||
|
$0817,$0817,1,30,9,30,13
|
||||||
|
</Block>
|
||||||
|
</Segment>
|
||||||
|
|
||||||
|
<Labels values="SEGMENT,ADDRESS,NAME,START,END,FILE_IDX,LINE1,COL1,LINE2,COL2">
|
||||||
|
Basic,$0400,SCREEN,1,14,10,14,15
|
||||||
|
Code,$080d,main,1,17,1,17,5
|
||||||
|
Basic,$080b,upstartEnd,0,43,1,43,11
|
||||||
|
Data,$0814,move,1,29,3,29,7
|
||||||
|
Data,$0817,data,1,30,3,30,7
|
||||||
|
</Labels>
|
||||||
|
|
||||||
|
<Breakpoints values="SEGMENT,ADDRESS,ARGUMENT">
|
||||||
|
</Breakpoints>
|
||||||
|
|
||||||
|
<Watchpoints values="SEGMENT,ADDRESS1,ADDRESS2,ARGUMENT">
|
||||||
|
</Watchpoints>
|
||||||
|
|
||||||
|
</C64debugger>
|
23
src/test/target/union-12.klog
Normal file
23
src/test/target/union-12.klog
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
Output dir: D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\target
|
||||||
|
parsing
|
||||||
|
flex pass 1
|
||||||
|
flex pass 2
|
||||||
|
flex pass 3
|
||||||
|
Output pass
|
||||||
|
Writing prg file: union-12.prg
|
||||||
|
|
||||||
|
Memory Map
|
||||||
|
----------
|
||||||
|
Program-segment:
|
||||||
|
|
||||||
|
Basic-segment:
|
||||||
|
$0801-$080c Basic
|
||||||
|
|
||||||
|
Code-segment:
|
||||||
|
$080d-$0813 Code
|
||||||
|
|
||||||
|
Data-segment:
|
||||||
|
$0814-$0817 Data
|
||||||
|
|
||||||
|
Writing Vice symbol file: union-12.vs
|
||||||
|
Writing Symbol file: union-12.sym
|
BIN
src/test/target/union-12.prg
Normal file
BIN
src/test/target/union-12.prg
Normal file
Binary file not shown.
5
src/test/target/union-12.sym
Normal file
5
src/test/target/union-12.sym
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
.label move=$814
|
||||||
|
.label SCREEN=$400
|
||||||
|
.label data=$817
|
||||||
|
.label main=$80d {
|
||||||
|
}
|
5
src/test/target/union-12.vs
Normal file
5
src/test/target/union-12.vs
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
al C:814 .move
|
||||||
|
al C:400 .SCREEN
|
||||||
|
al C:817 .data
|
||||||
|
al C:80b .upstartEnd
|
||||||
|
al C:80d .main
|
29
src/test/target/union-9.asm
Normal file
29
src/test/target/union-9.asm
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
// File Comments
|
||||||
|
// Minimal union with C-Standard behavior
|
||||||
|
// Upstart
|
||||||
|
.cpu _65c02
|
||||||
|
// Commodore 64 PRG executable file
|
||||||
|
.file [name="union-9.prg", type="prg", segments="Program"]
|
||||||
|
.segmentdef Program [segments="Basic, Code, Data"]
|
||||||
|
.segmentdef Basic [start=$0801]
|
||||||
|
.segmentdef Code [start=$80d]
|
||||||
|
.segmentdef Data [startAfter="Code"]
|
||||||
|
.segment Basic
|
||||||
|
:BasicUpstart(main)
|
||||||
|
// Global Constants & labels
|
||||||
|
.label SCREEN = $400
|
||||||
|
.segment Code
|
||||||
|
// main
|
||||||
|
main: {
|
||||||
|
// SCREEN[0] = data.b
|
||||||
|
// [0] *SCREEN = *((char *)&data) -- _deref_pbuc1=_deref_pbuc2
|
||||||
|
lda data
|
||||||
|
sta SCREEN
|
||||||
|
// main::@return
|
||||||
|
// }
|
||||||
|
// [1] return
|
||||||
|
rts
|
||||||
|
}
|
||||||
|
// File Data
|
||||||
|
.segment Data
|
||||||
|
data: .word $4d2
|
67
src/test/target/union-9.dbg
Normal file
67
src/test/target/union-9.dbg
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
<C64debugger version="1.0">
|
||||||
|
<Sources values="INDEX,FILE">
|
||||||
|
0,KickAss.jar:/include/autoinclude.asm
|
||||||
|
1,D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\target\union-9.asm
|
||||||
|
</Sources>
|
||||||
|
|
||||||
|
<Segment name="Default" dest="" values="START,END,FILE_IDX,LINE1,COL1,LINE2,COL2">
|
||||||
|
</Segment>
|
||||||
|
|
||||||
|
<Segment name="Program" dest="" values="START,END,FILE_IDX,LINE1,COL1,LINE2,COL2">
|
||||||
|
<Block name="Basic">
|
||||||
|
$0801,$0802,0,38,2,38,6
|
||||||
|
$0803,$0804,0,39,5,39,9
|
||||||
|
$0805,$0805,0,40,5,40,9
|
||||||
|
$0806,$0809,0,41,2,41,6
|
||||||
|
$080a,$080a,0,42,2,42,6
|
||||||
|
$080b,$080c,0,44,5,44,9
|
||||||
|
</Block>
|
||||||
|
<Block name="Code">
|
||||||
|
$080d,$080f,1,20,5,20,7
|
||||||
|
$0810,$0812,1,21,5,21,7
|
||||||
|
$0813,$0813,1,25,5,25,7
|
||||||
|
</Block>
|
||||||
|
<Block name="Data">
|
||||||
|
$0814,$0815,1,29,9,29,13
|
||||||
|
</Block>
|
||||||
|
</Segment>
|
||||||
|
|
||||||
|
<Segment name="Basic" dest="" values="START,END,FILE_IDX,LINE1,COL1,LINE2,COL2">
|
||||||
|
<Block name="Basic">
|
||||||
|
$0801,$0802,0,38,2,38,6
|
||||||
|
$0803,$0804,0,39,5,39,9
|
||||||
|
$0805,$0805,0,40,5,40,9
|
||||||
|
$0806,$0809,0,41,2,41,6
|
||||||
|
$080a,$080a,0,42,2,42,6
|
||||||
|
$080b,$080c,0,44,5,44,9
|
||||||
|
</Block>
|
||||||
|
</Segment>
|
||||||
|
|
||||||
|
<Segment name="Code" dest="" values="START,END,FILE_IDX,LINE1,COL1,LINE2,COL2">
|
||||||
|
<Block name="Code">
|
||||||
|
$080d,$080f,1,20,5,20,7
|
||||||
|
$0810,$0812,1,21,5,21,7
|
||||||
|
$0813,$0813,1,25,5,25,7
|
||||||
|
</Block>
|
||||||
|
</Segment>
|
||||||
|
|
||||||
|
<Segment name="Data" dest="" values="START,END,FILE_IDX,LINE1,COL1,LINE2,COL2">
|
||||||
|
<Block name="Data">
|
||||||
|
$0814,$0815,1,29,9,29,13
|
||||||
|
</Block>
|
||||||
|
</Segment>
|
||||||
|
|
||||||
|
<Labels values="SEGMENT,ADDRESS,NAME,START,END,FILE_IDX,LINE1,COL1,LINE2,COL2">
|
||||||
|
Basic,$0400,SCREEN,1,14,10,14,15
|
||||||
|
Code,$080d,main,1,17,1,17,5
|
||||||
|
Basic,$080b,upstartEnd,0,43,1,43,11
|
||||||
|
Data,$0814,data,1,29,3,29,7
|
||||||
|
</Labels>
|
||||||
|
|
||||||
|
<Breakpoints values="SEGMENT,ADDRESS,ARGUMENT">
|
||||||
|
</Breakpoints>
|
||||||
|
|
||||||
|
<Watchpoints values="SEGMENT,ADDRESS1,ADDRESS2,ARGUMENT">
|
||||||
|
</Watchpoints>
|
||||||
|
|
||||||
|
</C64debugger>
|
23
src/test/target/union-9.klog
Normal file
23
src/test/target/union-9.klog
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
Output dir: D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\target
|
||||||
|
parsing
|
||||||
|
flex pass 1
|
||||||
|
flex pass 2
|
||||||
|
flex pass 3
|
||||||
|
Output pass
|
||||||
|
Writing prg file: union-9.prg
|
||||||
|
|
||||||
|
Memory Map
|
||||||
|
----------
|
||||||
|
Program-segment:
|
||||||
|
|
||||||
|
Basic-segment:
|
||||||
|
$0801-$080c Basic
|
||||||
|
|
||||||
|
Code-segment:
|
||||||
|
$080d-$0813 Code
|
||||||
|
|
||||||
|
Data-segment:
|
||||||
|
$0814-$0815 Data
|
||||||
|
|
||||||
|
Writing Vice symbol file: union-9.vs
|
||||||
|
Writing Symbol file: union-9.sym
|
BIN
src/test/target/union-9.prg
Normal file
BIN
src/test/target/union-9.prg
Normal file
Binary file not shown.
4
src/test/target/union-9.sym
Normal file
4
src/test/target/union-9.sym
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
.label SCREEN=$400
|
||||||
|
.label data=$814
|
||||||
|
.label main=$80d {
|
||||||
|
}
|
4
src/test/target/union-9.vs
Normal file
4
src/test/target/union-9.vs
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
al C:400 .SCREEN
|
||||||
|
al C:814 .data
|
||||||
|
al C:80b .upstartEnd
|
||||||
|
al C:80d .main
|
Loading…
Reference in New Issue
Block a user