1
0
mirror of https://github.com/KarolS/millfork.git synced 2026-04-20 03:16:45 +00:00

Configurable entry point for ZX Spectrum, Z1013, TRS-80 and CoCo (#78)

This commit is contained in:
Karol Stasiak
2020-11-19 18:47:50 +01:00
parent 7e45967b0c
commit f2f53a4b28
6 changed files with 19 additions and 12 deletions
+4 -2
View File
@@ -285,8 +285,10 @@ object Platform {
case l if l.startsWith("length_be-") => AllocatedDataLengthBe(-parseNumber(l.stripPrefix("length_be-")))
case "length_be" => AllocatedDataLengthBe(0)
case "d88" => D88Output
case "tap" => TapOutput
case "trscmd" => TrsCmdOutput
case "tap" => new TapOutput("main")
case l if l.startsWith("tap:") => new TapOutput(l.stripPrefix("tap:").trim)
case "trscmd" => new TrsCmdOutput("main")
case l if l.startsWith("trscmd:") => new TrsCmdOutput(l.stripPrefix("trscmd:").trim)
case n => n.split(":").filter(_.nonEmpty) match {
case Array(b, s, e) => BankFragmentOutput(b, parseNumber(s), parseNumber(e))
case Array(s, e) =>
@@ -5,7 +5,7 @@ import java.nio.charset.StandardCharsets
/**
* @author Karol Stasiak
*/
object TapOutput extends OutputPackager {
class TapOutput(val symbol: String) extends OutputPackager {
def isAlphanum(c: Char): Boolean = (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9')
@@ -15,7 +15,7 @@ object TapOutput extends OutputPackager {
val code = b.output.slice(b.start, b.end + 1)
val codeDataBlock = new DataBlock(code)
val codeHeaderBlock = new HeaderBlock(3, "CODE", code.length, b.start, 32768)
val loaderDataBlock = new DataBlock(ZxSpectrumBasic.loader("CODE", filteredName, b.start))
val loaderDataBlock = new DataBlock(ZxSpectrumBasic.loader("CODE", filteredName, b.start, mem.getAddress(symbol)))
val loaderHeaderBlock = new HeaderBlock(0, "LOADER", loaderDataBlock.inputData.length, 10, loaderDataBlock.inputData.length)
val result = Array(loaderHeaderBlock, loaderDataBlock, codeHeaderBlock, codeDataBlock).map(_.toArray)
result.flatten
@@ -86,13 +86,13 @@ object ZxSpectrumBasic {
private def quoted(a: Any): Snippet = "\"" + a + "\""
def loader(filename: String, rem: String, loadAddress: Int): Array[Byte] = {
def loader(filename: String, rem: String, loadAddress: Int, runAddress: Int): Array[Byte] = {
Array(
line(10, REM, rem),
line(20, BORDER, VAL, quoted(7), colon, INK, NOT, PI, colon, PAPER, VAL, quoted(7), colon, CLS),
line(30, CLEAR, VAL, quoted(loadAddress - 1)),
line(40, LOAD, quoted(filename), CODE),
line(50, CLS, colon, PRINT, AT, NOT, PI, ",", NOT, PI, ";", colon, RANDOMIZE, USR, VAL, quoted(loadAddress))
line(50, CLS, colon, PRINT, AT, NOT, PI, ",", NOT, PI, ";", colon, RANDOMIZE, USR, VAL, quoted(runAddress))
).flatten
}
}
@@ -3,10 +3,11 @@ package millfork.output
/**
* @author Karol Stasiak
*/
object TrsCmdOutput extends OutputPackager {
class TrsCmdOutput(symbol: String) extends OutputPackager {
override def packageOutput(mem: CompiledMemory, bank: String): Array[Byte] = {
val b = mem.banks(bank)
val start = b.start
val run = mem.getAddress(symbol)
b.output.slice(start, b.end + 1).grouped(256).zipWithIndex.flatMap{ case (chunk, index) =>
// chunk type 1: data
// chunk length: 1 byte, includes the load address, goes 3-258
@@ -16,7 +17,7 @@ object TrsCmdOutput extends OutputPackager {
// chunk type 2: relocation address
// chunk length: for type 2, it's always 2 bytes
// relocation address: 2 bytes, little-endian
2, 2, b.start.toByte, b.start.>>(8).toByte
2, 2, run.toByte, run.>>(8).toByte
)
}
}