diff --git a/src/main/scala/millfork/Platform.scala b/src/main/scala/millfork/Platform.scala index 49bca854..73a515b8 100644 --- a/src/main/scala/millfork/Platform.scala +++ b/src/main/scala/millfork/Platform.scala @@ -17,8 +17,8 @@ class Platform( val flagOverrides: Map[CompilationFlag.Value, Boolean], val startingModules: List[String], val outputPackager: OutputPackager, - val allocator: VariableAllocator, - val org: Int, + val codeAllocator: UpwardByteAllocator, + val variableAllocator: VariableAllocator, val fileExtension: String, var defaultCodeBank: Int = 0, ) @@ -30,11 +30,11 @@ object Platform { Map(), List("c64_hardware", "c64_loader"), SequenceOutput(List(StartAddressOutput, AllocatedDataOutput)), + new UpwardByteAllocator(0x80D, 0xA000), new VariableAllocator( List(0xC1, 0xC3, 0xFB, 0xFD, 0x39, 0x3B, 0x3D, 0x43, 0x4B), new AfterCodeByteAllocator(0xA000) ), - 0x80D, ".prg" ) @@ -98,11 +98,14 @@ object Platform { case "all" => List.tabulate(128)(_ * 2) case xs => xs.split("[, ]+").map(parseNumber).toList } - val byteAllocator = (as.get(classOf[String], "himem_start", ""), as.get(classOf[String], "himem_end", "")) match { - case ("", _) => ErrorReporting.fatal(s"Undefined himem_start") - case (_, "") => ErrorReporting.fatal(s"Undefined himem_end") - case ("after_code", end) => new AfterCodeByteAllocator(parseNumber(end) + 1) - case (start, end) => new UpwardByteAllocator(parseNumber(start), parseNumber(end) + 1) + val himemEnd = as.get(classOf[String], "himem_end", "") match { + case "" => ErrorReporting.fatal(s"Undefined himem_end") + case end => parseNumber(end) + 1 + } + val byteAllocator = as.get(classOf[String], "himem_start", "") match { + case "" => ErrorReporting.fatal(s"Undefined himem_start") + case "after_code" => new AfterCodeByteAllocator(himemEnd) + case start => new UpwardByteAllocator(parseNumber(start), himemEnd) } val os = conf.getSection("output") @@ -120,7 +123,8 @@ object Platform { var fileExtension = os.get(classOf[String], "extension", ".bin") new Platform(cpu, flagOverrides, startingModules, outputPackager, - new VariableAllocator(freePointers, byteAllocator), org, + new UpwardByteAllocator(org, 0xffff), + new VariableAllocator(freePointers, byteAllocator), if (fileExtension.startsWith(".")) fileExtension else "." + fileExtension) } diff --git a/src/main/scala/millfork/output/Assembler.scala b/src/main/scala/millfork/output/Assembler.scala index ca3bf335..0e7207bb 100644 --- a/src/main/scala/millfork/output/Assembler.scala +++ b/src/main/scala/millfork/output/Assembler.scala @@ -236,15 +236,14 @@ class Assembler(private val program: Program, private val rootEnv: Environment) case _ => } - var justAfterCode = platform.org - val allocator = platform.allocator - allocator.notifyAboutEndOfCode(platform.org) + val codeAllocator = new VariableAllocator(Nil, platform.codeAllocator) + var justAfterCode = platform.codeAllocator.startAt env.allPreallocatables.foreach { case f: NormalFunction if f.address.isEmpty && f.name == "main" => val code = compiledFunctions(f.name) if (code.nonEmpty) { val size = code.map(_.sizeInBytes).sum - val index = allocator.allocateBytes(bank0, options, size, initialized = true, writeable = false) + val index = codeAllocator.allocateBytes(bank0, options, size, initialized = true, writeable = false) labelMap(f.name) = index justAfterCode = outputFunction(code, index, assembly, options) } @@ -255,7 +254,7 @@ class Assembler(private val program: Program, private val rootEnv: Environment) val code = compiledFunctions(f.name) if (code.nonEmpty) { val size = code.map(_.sizeInBytes).sum - val index = allocator.allocateBytes(bank0, options, size, initialized = true, writeable = false) + val index = codeAllocator.allocateBytes(bank0, options, size, initialized = true, writeable = false) labelMap(f.name) = index justAfterCode = outputFunction(code, index, assembly, options) } @@ -263,7 +262,7 @@ class Assembler(private val program: Program, private val rootEnv: Environment) } env.allPreallocatables.foreach { case InitializedArray(name, None, items) => - var index = allocator.allocateBytes(bank0, options, items.size, initialized = true, writeable = true) + var index = codeAllocator.allocateBytes(bank0, options, items.size, initialized = true, writeable = true) labelMap(name) = index assembly.append("* = $" + index.toHexString) assembly.append(name) @@ -275,7 +274,7 @@ class Assembler(private val program: Program, private val rootEnv: Environment) initializedVariablesSize += items.length justAfterCode = index case m@InitializedMemoryVariable(name, None, typ, value) => - var index = allocator.allocateBytes(bank0, options, typ.size, initialized = true, writeable = true) + var index = codeAllocator.allocateBytes(bank0, options, typ.size, initialized = true, writeable = true) labelMap(name) = index val altName = m.name.stripPrefix(env.prefix) + "`" env.things += altName -> ConstantThing(altName, NumericConstant(index, 2), env.get[Type]("pointer")) @@ -290,8 +289,9 @@ class Assembler(private val program: Program, private val rootEnv: Environment) justAfterCode = index case _ => } - allocator.notifyAboutEndOfCode(justAfterCode) - env.allocateVariables(None, bank0, callGraph, allocator, options, labelMap.put) + val variableAllocator = platform.variableAllocator + variableAllocator.notifyAboutEndOfCode(justAfterCode) + env.allocateVariables(None, bank0, callGraph, variableAllocator, options, labelMap.put) env = rootEnv.allThings diff --git a/src/test/scala/millfork/test/emu/EmuPlatform.scala b/src/test/scala/millfork/test/emu/EmuPlatform.scala index 4caca5f3..6e0083a9 100644 --- a/src/test/scala/millfork/test/emu/EmuPlatform.scala +++ b/src/test/scala/millfork/test/emu/EmuPlatform.scala @@ -1,6 +1,6 @@ package millfork.test.emu -import millfork.output.{AfterCodeByteAllocator, CurrentBankFragmentOutput, VariableAllocator} +import millfork.output.{AfterCodeByteAllocator, CurrentBankFragmentOutput, UpwardByteAllocator, VariableAllocator} import millfork.{Cpu, Platform} /** @@ -12,8 +12,8 @@ object EmuPlatform { Map(), Nil, CurrentBankFragmentOutput(0, 0xffff), + new UpwardByteAllocator(0x200, 0xb000), new VariableAllocator((0 until 256 by 2).toList, new AfterCodeByteAllocator(0xff00)), - 0x200, ".bin" ) } diff --git a/src/test/scala/millfork/test/emu/EmuRun.scala b/src/test/scala/millfork/test/emu/EmuRun.scala index e4815f17..e427a261 100644 --- a/src/test/scala/millfork/test/emu/EmuRun.scala +++ b/src/test/scala/millfork/test/emu/EmuRun.scala @@ -172,14 +172,14 @@ class EmuRun(cpu: millfork.Cpu.Value, nodeOptimizations: List[NodeOptimization], } platform.cpu match { case millfork.Cpu.Cmos => - runViaSymon(memoryBank, platform.org, CpuBehavior.CMOS_6502) + runViaSymon(memoryBank, platform.codeAllocator.startAt, CpuBehavior.CMOS_6502) case millfork.Cpu.Ricoh => - runViaHalfnes(memoryBank, platform.org) + runViaHalfnes(memoryBank, platform.codeAllocator.startAt) case millfork.Cpu.Mos => ErrorReporting.fatal("There's no NMOS emulator with decimal mode support") Timings(-1, -1) -> memoryBank case millfork.Cpu.StrictMos | millfork.Cpu.StrictRicoh => - runViaSymon(memoryBank, platform.org, CpuBehavior.NMOS_6502) + runViaSymon(memoryBank, platform.codeAllocator.startAt, CpuBehavior.NMOS_6502) case _ => ErrorReporting.trace("No emulation support for " + platform.cpu) Timings(-1, -1) -> memoryBank