1
0
mirror of https://gitlab.com/camelot/kickc.git synced 2024-11-26 12:49:21 +00:00

Added support for #pragma emulator() specifying which emulator to execute.

This commit is contained in:
jespergravgaard 2020-05-09 08:12:28 +02:00
parent 7e859fa8ae
commit c3a9ced0f5
14 changed files with 1006 additions and 892 deletions

View File

@ -393,7 +393,19 @@ public class KickC implements Callable<Void> {
// Assemble the asm-file if instructed
String prgFileName = outputFileNameBase + ".prg";
Path prgPath = outputDir.resolve(prgFileName);
if(assemble || execute || debug || (emulator != null)) {
// Find emulator - if set by #pragma
if(emulator == null) {
if(program.getEmulatorCommand() != null)
emulator = program.getEmulatorCommand();
else if(debug) {
emulator = "C64Debugger";
} else if(execute) {
emulator = "x64sc";
}
}
if(assemble || emulator != null) {
Path kasmLogPath = outputDir.resolve(outputFileNameBase + ".klog");
System.out.println("Assembling to " + prgPath.toString());
String[] assembleCommand = {asmPath.toString(), "-log", kasmLogPath.toString(), "-o", prgPath.toString(), "-vicesymbols", "-showmem", "-debugdump"};
@ -422,26 +434,22 @@ public class KickC implements Callable<Void> {
}
}
if(debug) {
emulator = "C64Debugger";
}
if(execute) {
emulator = "x64sc";
}
String emuOptions = "";
if(emulator.equals("C64Debugger")) {
Path viceSymbolsPath = outputDir.resolve(outputFileNameBase + ".vs");
emuOptions = "-symbols " + viceSymbolsPath + " -wait 2500" + " ";
}
// The program names used by VICE emulators
List<String> viceEmus = Arrays.asList("x64", "x64sc", "x128", "x64dtv", "xcbm2", "xcbm5x0", "xpet", "xplus4", "xscpu64", "xvic");
if(viceEmus.contains(emulator)) {
Path viceSymbolsPath = outputDir.resolve(outputFileNameBase + ".vs");
emuOptions = "-moncommands " + viceSymbolsPath.toAbsolutePath().toString() + " ";
}
// Execute the prg-file if instructed
if(emulator != null) {
// Find commandline options for the emulator
String emuOptions = "";
if(emulator.equals("C64Debugger")) {
Path viceSymbolsPath = outputDir.resolve(outputFileNameBase + ".vs");
emuOptions = "-symbols " + viceSymbolsPath + " -wait 2500" + " ";
}
// The program names used by VICE emulators
List<String> viceEmus = Arrays.asList("x64", "x64sc", "x128", "x64dtv", "xcbm2", "xcbm5x0", "xpet", "xplus4", "xscpu64", "xvic");
if(viceEmus.contains(emulator)) {
Path viceSymbolsPath = outputDir.resolve(outputFileNameBase + ".vs");
emuOptions = "-moncommands " + viceSymbolsPath.toAbsolutePath().toString() + " ";
}
System.out.println("Executing " + prgPath + " using " + emulator);
String executeCommand = emulator + " " + emuOptions + prgPath.toAbsolutePath().toString();
if(verbose) {

View File

@ -49,6 +49,8 @@ public class Program {
private Path linkScriptFilePath;
/** Body to any custom link script file used for linking (STATIC) */
private String linkScriptBody;
/** The program name for the emulator to pass the compiled program to. */
private String emulatorCommand;
/** Absolute start address of the code. Null to start ad 0x080d. PASS 0-5 (STATIC) */
private Number programPc;
@ -506,6 +508,14 @@ public class Program {
return programPc;
}
public void setEmulatorCommand(String emulatorCommand) {
this.emulatorCommand = emulatorCommand;
}
public String getEmulatorCommand() {
return emulatorCommand;
}
public CompileLog getLog() {
return log;
}

View File

@ -66,6 +66,7 @@ RESERVE:'reserve' ;
PC:'pc';
TARGET:'target';
LINK:'link';
EMULATOR:'emulator';
CPU:'cpu';
CODESEG:'code_seg';
DATASEG:'data_seg';

View File

@ -41,124 +41,125 @@ RESERVE=40
PC=41
TARGET=42
LINK=43
CPU=44
CODESEG=45
DATASEG=46
ENCODING=47
CONST=48
EXTERN=49
EXPORT=50
ALIGN=51
INLINE=52
VOLATILE=53
STATIC=54
INTERRUPT=55
REGISTER=56
ADDRESS=57
ADDRESS_ZEROPAGE=58
ADDRESS_MAINMEM=59
FORM_SSA=60
FORM_MA=61
INTRINSIC=62
CALLING=63
CALLINGCONVENTION=64
VARMODEL=65
IF=66
ELSE=67
WHILE=68
DO=69
FOR=70
SWITCH=71
RETURN=72
BREAK=73
CONTINUE=74
ASM=75
DEFAULT=76
CASE=77
STRUCT=78
ENUM=79
SIZEOF=80
TYPEID=81
DEFINED=82
KICKASM=83
RESOURCE=84
USES=85
CLOBBERS=86
BYTES=87
CYCLES=88
LOGIC_NOT=89
SIGNEDNESS=90
SIMPLETYPE=91
BOOLEAN=92
KICKASM_BODY=93
IMPORT=94
INCLUDE=95
PRAGMA=96
DEFINE=97
DEFINE_CONTINUE=98
UNDEF=99
IFDEF=100
IFNDEF=101
IFIF=102
ELIF=103
IFELSE=104
ENDIF=105
NUMBER=106
NUMFLOAT=107
BINFLOAT=108
DECFLOAT=109
HEXFLOAT=110
NUMINT=111
BININTEGER=112
DECINTEGER=113
HEXINTEGER=114
NAME=115
STRING=116
CHAR=117
WS=118
COMMENT_LINE=119
COMMENT_BLOCK=120
ASM_BYTE=121
ASM_MNEMONIC=122
ASM_IMM=123
ASM_COLON=124
ASM_COMMA=125
ASM_PAR_BEGIN=126
ASM_PAR_END=127
ASM_BRACKET_BEGIN=128
ASM_BRACKET_END=129
ASM_DOT=130
ASM_SHIFT_LEFT=131
ASM_SHIFT_RIGHT=132
ASM_PLUS=133
ASM_MINUS=134
ASM_LESS_THAN=135
ASM_GREATER_THAN=136
ASM_MULTIPLY=137
ASM_DIVIDE=138
ASM_CURLY_BEGIN=139
ASM_CURLY_END=140
ASM_NUMBER=141
ASM_NUMFLOAT=142
ASM_BINFLOAT=143
ASM_DECFLOAT=144
ASM_HEXFLOAT=145
ASM_NUMINT=146
ASM_BININTEGER=147
ASM_DECINTEGER=148
ASM_HEXINTEGER=149
ASM_CHAR=150
ASM_MULTI_REL=151
ASM_MULTI_NAME=152
ASM_NAME=153
ASM_WS=154
ASM_COMMENT_LINE=155
ASM_COMMENT_BLOCK=156
IMPORT_SYSTEMFILE=157
IMPORT_LOCALFILE=158
IMPORT_WS=159
IMPORT_COMMENT_LINE=160
IMPORT_COMMENT_BLOCK=161
EMULATOR=44
CPU=45
CODESEG=46
DATASEG=47
ENCODING=48
CONST=49
EXTERN=50
EXPORT=51
ALIGN=52
INLINE=53
VOLATILE=54
STATIC=55
INTERRUPT=56
REGISTER=57
ADDRESS=58
ADDRESS_ZEROPAGE=59
ADDRESS_MAINMEM=60
FORM_SSA=61
FORM_MA=62
INTRINSIC=63
CALLING=64
CALLINGCONVENTION=65
VARMODEL=66
IF=67
ELSE=68
WHILE=69
DO=70
FOR=71
SWITCH=72
RETURN=73
BREAK=74
CONTINUE=75
ASM=76
DEFAULT=77
CASE=78
STRUCT=79
ENUM=80
SIZEOF=81
TYPEID=82
DEFINED=83
KICKASM=84
RESOURCE=85
USES=86
CLOBBERS=87
BYTES=88
CYCLES=89
LOGIC_NOT=90
SIGNEDNESS=91
SIMPLETYPE=92
BOOLEAN=93
KICKASM_BODY=94
IMPORT=95
INCLUDE=96
PRAGMA=97
DEFINE=98
DEFINE_CONTINUE=99
UNDEF=100
IFDEF=101
IFNDEF=102
IFIF=103
ELIF=104
IFELSE=105
ENDIF=106
NUMBER=107
NUMFLOAT=108
BINFLOAT=109
DECFLOAT=110
HEXFLOAT=111
NUMINT=112
BININTEGER=113
DECINTEGER=114
HEXINTEGER=115
NAME=116
STRING=117
CHAR=118
WS=119
COMMENT_LINE=120
COMMENT_BLOCK=121
ASM_BYTE=122
ASM_MNEMONIC=123
ASM_IMM=124
ASM_COLON=125
ASM_COMMA=126
ASM_PAR_BEGIN=127
ASM_PAR_END=128
ASM_BRACKET_BEGIN=129
ASM_BRACKET_END=130
ASM_DOT=131
ASM_SHIFT_LEFT=132
ASM_SHIFT_RIGHT=133
ASM_PLUS=134
ASM_MINUS=135
ASM_LESS_THAN=136
ASM_GREATER_THAN=137
ASM_MULTIPLY=138
ASM_DIVIDE=139
ASM_CURLY_BEGIN=140
ASM_CURLY_END=141
ASM_NUMBER=142
ASM_NUMFLOAT=143
ASM_BINFLOAT=144
ASM_DECFLOAT=145
ASM_HEXFLOAT=146
ASM_NUMINT=147
ASM_BININTEGER=148
ASM_DECINTEGER=149
ASM_HEXINTEGER=150
ASM_CHAR=151
ASM_MULTI_REL=152
ASM_MULTI_NAME=153
ASM_NAME=154
ASM_WS=155
ASM_COMMENT_LINE=156
ASM_COMMENT_BLOCK=157
IMPORT_SYSTEMFILE=158
IMPORT_LOCALFILE=159
IMPORT_WS=160
IMPORT_COMMENT_LINE=161
IMPORT_COMMENT_BLOCK=162
';'=8
'..'=11
'...'=12
@ -183,61 +184,62 @@ IMPORT_COMMENT_BLOCK=161
'pc'=41
'target'=42
'link'=43
'cpu'=44
'code_seg'=45
'data_seg'=46
'encoding'=47
'const'=48
'extern'=49
'export'=50
'align'=51
'inline'=52
'volatile'=53
'static'=54
'interrupt'=55
'register'=56
'__address'=57
'__zp'=58
'__mem'=59
'__ssa'=60
'__ma'=61
'__intrinsic'=62
'calling'=63
'var_model'=65
'if'=66
'else'=67
'while'=68
'do'=69
'for'=70
'switch'=71
'return'=72
'break'=73
'continue'=74
'asm'=75
'default'=76
'case'=77
'struct'=78
'enum'=79
'sizeof'=80
'typeid'=81
'defined'=82
'kickasm'=83
'resource'=84
'uses'=85
'clobbers'=86
'bytes'=87
'cycles'=88
'!'=89
'#import'=94
'#include'=95
'#pragma'=96
'#define'=97
'#undef'=99
'#ifdef'=100
'#ifndef'=101
'#if'=102
'#elif'=103
'#else'=104
'#endif'=105
'.byte'=121
'#'=123
'emulator'=44
'cpu'=45
'code_seg'=46
'data_seg'=47
'encoding'=48
'const'=49
'extern'=50
'export'=51
'align'=52
'inline'=53
'volatile'=54
'static'=55
'interrupt'=56
'register'=57
'__address'=58
'__zp'=59
'__mem'=60
'__ssa'=61
'__ma'=62
'__intrinsic'=63
'calling'=64
'var_model'=66
'if'=67
'else'=68
'while'=69
'do'=70
'for'=71
'switch'=72
'return'=73
'break'=74
'continue'=75
'asm'=76
'default'=77
'case'=78
'struct'=79
'enum'=80
'sizeof'=81
'typeid'=82
'defined'=83
'kickasm'=84
'resource'=85
'uses'=86
'clobbers'=87
'bytes'=88
'cycles'=89
'!'=90
'#import'=95
'#include'=96
'#pragma'=97
'#define'=98
'#undef'=100
'#ifdef'=101
'#ifndef'=102
'#if'=103
'#elif'=104
'#else'=105
'#endif'=106
'.byte'=122
'#'=124

View File

@ -151,6 +151,7 @@ globalDirective
| (PRAGMA TARGET) PAR_BEGIN NAME PAR_END #globalDirectivePlatform
| (PRAGMA CPU) PAR_BEGIN NAME PAR_END #globalDirectiveCpu
| (PRAGMA LINK) PAR_BEGIN STRING PAR_END #globalDirectiveLinkScript
| (PRAGMA EMULATOR) PAR_BEGIN STRING PAR_END #globalDirectiveEmulator
| (PRAGMA CODESEG) PAR_BEGIN NAME PAR_END #globalDirectiveCodeSeg
| (PRAGMA DATASEG) PAR_BEGIN NAME PAR_END #globalDirectiveDataSeg
| (PRAGMA ENCODING) PAR_BEGIN NAME PAR_END #globalDirectiveEncoding

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@ -159,6 +159,7 @@ IMPORT_LOCALFILE=158
IMPORT_WS=159
IMPORT_COMMENT_LINE=160
IMPORT_COMMENT_BLOCK=161
EMULATOR=162
';'=8
'..'=11
'...'=12

View File

@ -577,6 +577,18 @@ public class KickCParserBaseListener implements KickCParserListener {
* <p>The default implementation does nothing.</p>
*/
@Override public void exitGlobalDirectiveLinkScript(KickCParser.GlobalDirectiveLinkScriptContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void enterGlobalDirectiveEmulator(KickCParser.GlobalDirectiveEmulatorContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void exitGlobalDirectiveEmulator(KickCParser.GlobalDirectiveEmulatorContext ctx) { }
/**
* {@inheritDoc}
*

View File

@ -342,6 +342,13 @@ public class KickCParserBaseVisitor<T> extends AbstractParseTreeVisitor<T> imple
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitGlobalDirectiveLinkScript(KickCParser.GlobalDirectiveLinkScriptContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitGlobalDirectiveEmulator(KickCParser.GlobalDirectiveEmulatorContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*

View File

@ -531,6 +531,18 @@ public interface KickCParserListener extends ParseTreeListener {
* @param ctx the parse tree
*/
void exitGlobalDirectiveLinkScript(KickCParser.GlobalDirectiveLinkScriptContext ctx);
/**
* Enter a parse tree produced by the {@code globalDirectiveEmulator}
* labeled alternative in {@link KickCParser#globalDirective}.
* @param ctx the parse tree
*/
void enterGlobalDirectiveEmulator(KickCParser.GlobalDirectiveEmulatorContext ctx);
/**
* Exit a parse tree produced by the {@code globalDirectiveEmulator}
* labeled alternative in {@link KickCParser#globalDirective}.
* @param ctx the parse tree
*/
void exitGlobalDirectiveEmulator(KickCParser.GlobalDirectiveEmulatorContext ctx);
/**
* Enter a parse tree produced by the {@code globalDirectiveCodeSeg}
* labeled alternative in {@link KickCParser#globalDirective}.

View File

@ -320,6 +320,13 @@ public interface KickCParserVisitor<T> extends ParseTreeVisitor<T> {
* @return the visitor result
*/
T visitGlobalDirectiveLinkScript(KickCParser.GlobalDirectiveLinkScriptContext ctx);
/**
* Visit a parse tree produced by the {@code globalDirectiveEmulator}
* labeled alternative in {@link KickCParser#globalDirective}.
* @param ctx the parse tree
* @return the visitor result
*/
T visitGlobalDirectiveEmulator(KickCParser.GlobalDirectiveEmulatorContext ctx);
/**
* Visit a parse tree produced by the {@code globalDirectiveCodeSeg}
* labeled alternative in {@link KickCParser#globalDirective}.

View File

@ -136,6 +136,14 @@ public class Pass0GenerateStatementSequence extends KickCParserBaseVisitor<Objec
return null;
}
@Override
public Object visitGlobalDirectiveEmulator(KickCParser.GlobalDirectiveEmulatorContext ctx) {
String emuName = ctx.STRING().getText();
emuName = emuName.substring(1, emuName.length() - 1);
program.setEmulatorCommand(emuName);
return null;
}
@Override
public Object visitGlobalDirectiveReserve(KickCParser.GlobalDirectiveReserveContext ctx) {
List<Integer> reservedZps = new ArrayList<>();

View File

@ -1,5 +1,6 @@
// Random walk with color fading for Commodore Plus/4 / C16
#pragma link("plus4.ld")
#pragma emulator("xplus4")
#include <string.h>
#include <stdlib.h>