1
0
mirror of https://github.com/KarolS/millfork.git synced 2025-04-13 05:39:54 +00:00

Allow adding fixed deltas to some outputs; #7 Fix Lynx output

This commit is contained in:
Karol Stasiak 2019-10-16 22:42:58 +02:00
parent 927c39585c
commit 1ec816496d
4 changed files with 45 additions and 20 deletions

View File

@ -179,15 +179,23 @@ Default: `main,*`
* `startaddr_be` the same, but big-endian
* `startpage` the high byte of `startaddr`
* `endaddr` little-endian 16-bit address of the last used byte of the compiled output (usually not the segment end)
* `endaddr_be` the same, but big-endian
* `startaddr+123`, `startaddr_be+123`, `endaddr+123`, `endaddr_be+123` the same, but incremented by the given number
* `startaddr-123`, `startaddr_be-123`, `endaddr-123`, `endaddr_be-123` the same, but decremented by the given number
* `startpage` the high byte of `startaddr`
* `length` little-endian 16-bit length of the compiled output; `endaddr - startaddr + 1`
* `length_be` the same, but big-endian
* `length+123`, `length_be+123` the same, but incremented by the given number
* `length-123`, `length_be-123` the same, but decremented by the given number
* `allocated` all used bytes

View File

@ -21,7 +21,7 @@ HAS_BITMAP_MODE=1
[output]
;TODO
style=single
format=$80,$08,$3,$00,length_be,$42,$53,$39,$33,allocated
format=$80,$08,$3,$00,length_be+10,$42,$53,$39,$33,allocated
extension=o

View File

@ -232,15 +232,28 @@ object Platform {
val os = conf.getSection("output")
val outputPackager = SequenceOutput(os.get(classOf[String], "format", "").split("[, \n\t\r]+").filter(_.nonEmpty).map {
case "startaddr" => StartAddressOutput
case "startaddr_be" => StartAddressOutputBe
case "startaddr" => StartAddressOutput(0)
case "startaddr_be" => StartAddressOutputBe(0)
case "startpage" => StartPageOutput
case "endaddr" => EndAddressOutput
case "endaddr_be" => EndAddressOutputBe
case "endaddr" => EndAddressOutput(0)
case "endaddr_be" => EndAddressOutputBe(0)
case l if l.startsWith("startaddr+") => StartAddressOutput(parseNumber(l.stripPrefix("startaddr+")))
case l if l.startsWith("startaddr-") => StartAddressOutput(-parseNumber(l.stripPrefix("startaddr-")))
case l if l.startsWith("startaddr_be+") => StartAddressOutputBe(parseNumber(l.stripPrefix("startaddr_be+")))
case l if l.startsWith("startaddr_be-") => StartAddressOutputBe(-parseNumber(l.stripPrefix("startaddr_be-")))
case l if l.startsWith("endaddr+") => EndAddressOutput(parseNumber(l.stripPrefix("endaddr+")))
case l if l.startsWith("endaddr-") => EndAddressOutput(-parseNumber(l.stripPrefix("endaddr-")))
case l if l.startsWith("endaddr_be+") => EndAddressOutputBe(parseNumber(l.stripPrefix("endaddr_be+")))
case l if l.startsWith("endaddr_be-") => EndAddressOutputBe(-parseNumber(l.stripPrefix("endaddr_be-")))
case "pagecount" => PageCountOutput
case "allocated" => AllocatedDataOutput
case "length" => AllocatedDataLength
case "length_be" => AllocatedDataLengthBe
case "length" => AllocatedDataLength(0)
case "length_be" => AllocatedDataLengthBe(0)
case l if l.startsWith("length+") => AllocatedDataLength(parseNumber(l.stripPrefix("length+")))
case l if l.startsWith("length_be+") => AllocatedDataLengthBe(parseNumber(l.stripPrefix("length_be+")))
case l if l.startsWith("length-") => AllocatedDataLength(-parseNumber(l.stripPrefix("length-")))
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 n => n.split(":").filter(_.nonEmpty) match {

View File

@ -38,17 +38,19 @@ case class BankFragmentOutput(alwaysBank: String, start: Int, end: Int) extends
}
}
object StartAddressOutput extends OutputPackager {
case class StartAddressOutput(bonus: Int) extends OutputPackager {
def packageOutput(mem: CompiledMemory, bank: String): Array[Byte] = {
val b = mem.banks(bank)
Array(b.start.toByte, b.start.>>(8).toByte)
val x = b.start + bonus
Array(x.toByte, x.>>(8).toByte)
}
}
object StartAddressOutputBe extends OutputPackager {
case class StartAddressOutputBe(bonus: Int) extends OutputPackager {
def packageOutput(mem: CompiledMemory, bank: String): Array[Byte] = {
val b = mem.banks(bank)
Array(b.start.>>(8).toByte, b.start.toByte)
val x = b.start + bonus
Array(x.>>(8).toByte, x.toByte)
}
}
@ -59,17 +61,19 @@ object StartPageOutput extends OutputPackager {
}
}
object EndAddressOutput extends OutputPackager {
case class EndAddressOutput(bonus: Int) extends OutputPackager {
def packageOutput(mem: CompiledMemory, bank: String): Array[Byte] = {
val b = mem.banks(bank)
val x = b.end + bonus
Array(b.end.toByte, b.end.>>(8).toByte)
}
}
object EndAddressOutputBe extends OutputPackager {
case class EndAddressOutputBe(bonus: Int) extends OutputPackager {
def packageOutput(mem: CompiledMemory, bank: String): Array[Byte] = {
val b = mem.banks(bank)
Array(b.end.>>(8).toByte, b.end.toByte)
val x = b.end + bonus
Array(x.>>(8).toByte, x.toByte)
}
}
@ -88,18 +92,18 @@ object AllocatedDataOutput extends OutputPackager {
}
}
object AllocatedDataLength extends OutputPackager {
case class AllocatedDataLength(bonus: Int) extends OutputPackager {
def packageOutput(mem: CompiledMemory, bank: String): Array[Byte] = {
val b = mem.banks(bank)
val size = b.end - b.start + 1
val size = b.end - b.start + 1 + bonus
Array(size.toByte, size.>>(8).toByte)
}
}
object AllocatedDataLengthBe extends OutputPackager {
case class AllocatedDataLengthBe(bonus: Int) extends OutputPackager {
def packageOutput(mem: CompiledMemory, bank: String): Array[Byte] = {
val b = mem.banks(bank)
val size = b.end - b.start + 1
val size = b.end - b.start + 1 + bonus
Array(size.>>(8).toByte, size.toByte)
}
}