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:
@@ -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
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user