add support for second alternative emulator (box16 in case of cx16 target)

This commit is contained in:
Irmen de Jong 2021-07-05 22:47:51 +02:00
parent a7736d88a9
commit 6367c6d116
6 changed files with 35 additions and 11 deletions

View File

@ -31,7 +31,8 @@ fun pathFrom(stringPath: String, vararg rest: String): Path = FileSystems.getDe
private fun compileMain(args: Array<String>): Boolean { private fun compileMain(args: Array<String>): Boolean {
val cli = ArgParser("prog8compiler", prefixStyle = ArgParser.OptionPrefixStyle.JVM) val cli = ArgParser("prog8compiler", prefixStyle = ArgParser.OptionPrefixStyle.JVM)
val startEmulator by cli.option(ArgType.Boolean, fullName = "emu", description = "auto-start emulator after successful compilation") val startEmulator1 by cli.option(ArgType.Boolean, fullName = "emu", description = "auto-start emulator after successful compilation")
val startEmulator2 by cli.option(ArgType.Boolean, fullName = "emu2", description = "auto-start alternative emulator after successful compilation")
val outputDir by cli.option(ArgType.String, fullName = "out", description = "directory for output files instead of current directory").default(".") val outputDir by cli.option(ArgType.String, fullName = "out", description = "directory for output files instead of current directory").default(".")
val dontWriteAssembly by cli.option(ArgType.Boolean, fullName = "noasm", description="don't create assembly code") val dontWriteAssembly by cli.option(ArgType.Boolean, fullName = "noasm", description="don't create assembly code")
val dontOptimize by cli.option(ArgType.Boolean, fullName = "noopt", description = "don't perform any optimizations") val dontOptimize by cli.option(ArgType.Boolean, fullName = "noopt", description = "don't perform any optimizations")
@ -119,13 +120,17 @@ private fun compileMain(args: Array<String>): Boolean {
return false return false
} }
if (startEmulator==true) { if(startEmulator1==true || startEmulator2==true) {
if (compilationResult.programName.isEmpty()) if (compilationResult.programName.isEmpty()) {
println("\nCan't start emulator because no program was assembled.") println("\nCan't start emulator because no program was assembled.")
else { return true
compilationResult.compTarget.machine.launchEmulator(compilationResult.programName)
} }
} }
if (startEmulator1==true)
compilationResult.compTarget.machine.launchEmulator(1, compilationResult.programName)
else if (startEmulator2==true)
compilationResult.compTarget.machine.launchEmulator(2, compilationResult.programName)
} }
} }

View File

@ -32,6 +32,6 @@ interface IMachineDefinition {
fun getFloat(num: Number): IMachineFloat fun getFloat(num: Number): IMachineFloat
fun importLibs(compilerOptions: CompilationOptions, compilationTargetName: String): List<String> fun importLibs(compilerOptions: CompilationOptions, compilationTargetName: String): List<String>
fun launchEmulator(programName: String) fun launchEmulator(selectedEmulator: Int, programName: String)
fun isRegularRAMaddress(address: Int): Boolean fun isRegularRAMaddress(address: Int): Boolean
} }

View File

@ -35,7 +35,12 @@ internal object C64MachineDefinition: IMachineDefinition {
emptyList() emptyList()
} }
override fun launchEmulator(programName: String) { override fun launchEmulator(selectedEmulator: Int, programName: String) {
if(selectedEmulator!=1) {
System.err.println("The c64 target only supports the main emulator (Vice).")
return
}
for(emulator in listOf("x64sc", "x64")) { for(emulator in listOf("x64sc", "x64")) {
println("\nStarting C-64 emulator $emulator...") println("\nStarting C-64 emulator $emulator...")
val cmdline = listOf(emulator, "-silent", "-moncommands", "$programName.vice-mon-list", val cmdline = listOf(emulator, "-silent", "-moncommands", "$programName.vice-mon-list",

View File

@ -32,8 +32,17 @@ internal object CX16MachineDefinition: IMachineDefinition {
emptyList() emptyList()
} }
override fun launchEmulator(programName: String) { override fun launchEmulator(selectedEmulator: Int, programName: String) {
for(emulator in listOf("x16emu")) { val emulatorName: String = when(selectedEmulator) {
1 -> "x16emu"
2 -> "box16"
else -> {
System.err.println("Cx16 target only supports x16emu and box16 emulators.")
return
}
}
for(emulator in listOf(emulatorName)) {
println("\nStarting Commander X16 emulator $emulator...") println("\nStarting Commander X16 emulator $emulator...")
val cmdline = listOf(emulator, "-scale", "2", "-run", "-prg", "$programName.prg") val cmdline = listOf(emulator, "-scale", "2", "-run", "-prg", "$programName.prg")
val processb = ProcessBuilder(cmdline).inheritIO() val processb = ProcessBuilder(cmdline).inheritIO()

View File

@ -166,7 +166,9 @@ For MacOS you can use the Homebrew system to install a recent version of OpenJDK
Finally: an **emulator** (or a real machine ofcourse) to test and run your programs on. Finally: an **emulator** (or a real machine ofcourse) to test and run your programs on.
In C64 mode, the compiler assumes the presence of the `Vice emulator <http://vice-emu.sourceforge.net/>`_. In C64 mode, the compiler assumes the presence of the `Vice emulator <http://vice-emu.sourceforge.net/>`_.
If you're targeting the CommanderX16 instead, there's the `x16emu <https://github.com/commanderx16/x16-emulator>`_. If you're targeting the CommanderX16 instead, there's a choice of the official `x16emu <https://github.com/commanderx16/x16-emulator>`_
and the unofficial `box16 <https://github.com/indigodarkwolf/box16>`_ (you can select which one you want to launch
using the ``-emu`` or ``-emu2`` command line options)
.. attention:: **Commander-X16 V38 versus V39** .. attention:: **Commander-X16 V38 versus V39**

View File

@ -3,7 +3,7 @@ TODO
For next release For next release
^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^
- add -sym vicemonlist support when launching box16 emulator (requires box16 bugfix to not freeze)
- rename libdirs option to srcdirs? - rename libdirs option to srcdirs?
- can we derive module.name from module.source (taking just the filename base)? - can we derive module.name from module.source (taking just the filename base)?
- can Position.file be a Path- making the source variable for nodes unnecessary? - can Position.file be a Path- making the source variable for nodes unnecessary?
@ -29,6 +29,9 @@ Future
- refactor the compiler optimizers into own project submodule - refactor the compiler optimizers into own project submodule
- make it possible to use cpu opcodes such as 'nop' as variable names by prefixing all asm vars with something such as ``v_`` - make it possible to use cpu opcodes such as 'nop' as variable names by prefixing all asm vars with something such as ``v_``
- [problematic due to 64tass:] add a compiler option to not remove unused subroutines. this allows for building library programs. But this won't work with 64tass's .proc ... - [problematic due to 64tass:] add a compiler option to not remove unused subroutines. this allows for building library programs. But this won't work with 64tass's .proc ...
Perhaps replace all uses of .proc/.pend by .block/.bend will fix that?
(but we lose the optimizing aspect of the assembler where it strips out unused code.
There's not really a dynamic switch possible as all assembly lib code is static and uses one or the other)
- introduce byte-index operator to avoid index multiplications in loops over arrays? - introduce byte-index operator to avoid index multiplications in loops over arrays?
see https://www.reddit.com/r/programming/comments/alhj59/creating_a_programming_language_and_cross/eg898b9?utm_source=share&utm_medium=web2x&context=3 see https://www.reddit.com/r/programming/comments/alhj59/creating_a_programming_language_and_cross/eg898b9?utm_source=share&utm_medium=web2x&context=3