From 00be0b552e2dc8089a4883f3089785fc71936338 Mon Sep 17 00:00:00 2001 From: Karol Stasiak Date: Tue, 3 Jul 2018 22:36:15 +0200 Subject: [PATCH] Use target file name as disk label --- src/main/scala/millfork/CompilationOptions.scala | 2 +- src/main/scala/millfork/Main.scala | 2 +- .../scala/millfork/output/AbstractAssembler.scala | 1 + .../scala/millfork/output/CompiledMemory.scala | 3 +-- src/main/scala/millfork/output/D88Output.scala | 14 +++++++++----- 5 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/main/scala/millfork/CompilationOptions.scala b/src/main/scala/millfork/CompilationOptions.scala index a6bc6441..371d837e 100644 --- a/src/main/scala/millfork/CompilationOptions.scala +++ b/src/main/scala/millfork/CompilationOptions.scala @@ -5,7 +5,7 @@ import millfork.error.ErrorReporting /** * @author Karol Stasiak */ -case class CompilationOptions(platform: Platform, commandLineFlags: Map[CompilationFlag.Value, Boolean]) { +case class CompilationOptions(platform: Platform, commandLineFlags: Map[CompilationFlag.Value, Boolean], outputFileName: Option[String]) { import CompilationFlag._ import Cpu._ diff --git a/src/main/scala/millfork/Main.scala b/src/main/scala/millfork/Main.scala index 05e705f0..5c055657 100644 --- a/src/main/scala/millfork/Main.scala +++ b/src/main/scala/millfork/Main.scala @@ -73,7 +73,7 @@ object Main { ErrorReporting.info("No platform selected, defaulting to `c64`") "c64" }) - val options = CompilationOptions(platform, c.flags) + val options = CompilationOptions(platform, c.flags, c.outputFileName) ErrorReporting.debug("Effective flags: ") options.flags.toSeq.sortBy(_._1).foreach{ case (f, b) => ErrorReporting.debug(f" $f%-30s : $b%s") diff --git a/src/main/scala/millfork/output/AbstractAssembler.scala b/src/main/scala/millfork/output/AbstractAssembler.scala index a39a734e..c0563322 100644 --- a/src/main/scala/millfork/output/AbstractAssembler.scala +++ b/src/main/scala/millfork/output/AbstractAssembler.scala @@ -177,6 +177,7 @@ abstract class AbstractAssembler[T <: AbstractCode](private val program: Program storeDecimalValueInNormalRespresentation(f(parseNormalToDecimalValue(a), parseNormalToDecimalValue(b))) def assemble(callGraph: CallGraph, optimizations: Seq[AssemblyOptimization[T]], options: CompilationOptions): AssemblerOutput = { + mem.programName = options.outputFileName.getOrElse("MILLFORK") val platform = options.platform val variableAllocators = platform.variableAllocators val zpOccupied = mem.banks("default").occupied diff --git a/src/main/scala/millfork/output/CompiledMemory.scala b/src/main/scala/millfork/output/CompiledMemory.scala index 79876da6..25acfe71 100644 --- a/src/main/scala/millfork/output/CompiledMemory.scala +++ b/src/main/scala/millfork/output/CompiledMemory.scala @@ -1,13 +1,12 @@ package millfork.output -import millfork.error.ErrorReporting - import scala.collection.mutable /** * @author Karol Stasiak */ class CompiledMemory(bankNames: List[String]) { + var programName = "MILLFORK" val banks = mutable.Map(bankNames.map(_ -> new MemoryBank): _*) } diff --git a/src/main/scala/millfork/output/D88Output.scala b/src/main/scala/millfork/output/D88Output.scala index ff463aa6..95bf48ba 100644 --- a/src/main/scala/millfork/output/D88Output.scala +++ b/src/main/scala/millfork/output/D88Output.scala @@ -1,5 +1,7 @@ package millfork.output +import java.nio.charset.StandardCharsets + import scala.collection.mutable /** @@ -24,7 +26,7 @@ object D88Output extends OutputPackager { override def packageOutput(mem: CompiledMemory, bank: String): Array[Byte] = { val b = mem.banks(bank) val start = b.start - val header = new D88Header + val header = new D88Header(mem.programName.take(16)) val trackList = new D88TrackList val sectors = mutable.ListBuffer[D88Sector]() var trackOffset = 688 @@ -67,13 +69,15 @@ sealed trait D88Part { def toArray: Array[Byte] } -class D88Header extends D88Part { +class D88Header(programName: String) extends D88Part { var totalSize: Long = 0 + def isAlphanum(c: Char): Boolean = (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') + def toArray: Array[Byte] = { - Array( - 'M', 'I', 'L', 'L', 'F', 'O', 'R', 'K', - 0, 0, 0, 0, 0, 0, 0, 0, + programName.map(c => + if (c == 0 || isAlphanum(c)) c.toByte else '_'.toByte + ).padTo(16, 0.toByte).toArray ++ Array( 0, // NUL 0, 0, 0, 0, 0, 0, 0, 0, 0, // reserved 0, // not write protected