mirror of
https://github.com/KarolS/millfork.git
synced 2024-10-30 21:30:52 +00:00
Fixed org option
This commit is contained in:
parent
34b827df38
commit
807a9df8ac
@ -17,8 +17,8 @@ class Platform(
|
|||||||
val flagOverrides: Map[CompilationFlag.Value, Boolean],
|
val flagOverrides: Map[CompilationFlag.Value, Boolean],
|
||||||
val startingModules: List[String],
|
val startingModules: List[String],
|
||||||
val outputPackager: OutputPackager,
|
val outputPackager: OutputPackager,
|
||||||
val allocator: VariableAllocator,
|
val codeAllocator: UpwardByteAllocator,
|
||||||
val org: Int,
|
val variableAllocator: VariableAllocator,
|
||||||
val fileExtension: String,
|
val fileExtension: String,
|
||||||
var defaultCodeBank: Int = 0,
|
var defaultCodeBank: Int = 0,
|
||||||
)
|
)
|
||||||
@ -30,11 +30,11 @@ object Platform {
|
|||||||
Map(),
|
Map(),
|
||||||
List("c64_hardware", "c64_loader"),
|
List("c64_hardware", "c64_loader"),
|
||||||
SequenceOutput(List(StartAddressOutput, AllocatedDataOutput)),
|
SequenceOutput(List(StartAddressOutput, AllocatedDataOutput)),
|
||||||
|
new UpwardByteAllocator(0x80D, 0xA000),
|
||||||
new VariableAllocator(
|
new VariableAllocator(
|
||||||
List(0xC1, 0xC3, 0xFB, 0xFD, 0x39, 0x3B, 0x3D, 0x43, 0x4B),
|
List(0xC1, 0xC3, 0xFB, 0xFD, 0x39, 0x3B, 0x3D, 0x43, 0x4B),
|
||||||
new AfterCodeByteAllocator(0xA000)
|
new AfterCodeByteAllocator(0xA000)
|
||||||
),
|
),
|
||||||
0x80D,
|
|
||||||
".prg"
|
".prg"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -98,11 +98,14 @@ object Platform {
|
|||||||
case "all" => List.tabulate(128)(_ * 2)
|
case "all" => List.tabulate(128)(_ * 2)
|
||||||
case xs => xs.split("[, ]+").map(parseNumber).toList
|
case xs => xs.split("[, ]+").map(parseNumber).toList
|
||||||
}
|
}
|
||||||
val byteAllocator = (as.get(classOf[String], "himem_start", ""), as.get(classOf[String], "himem_end", "")) match {
|
val himemEnd = as.get(classOf[String], "himem_end", "") match {
|
||||||
case ("", _) => ErrorReporting.fatal(s"Undefined himem_start")
|
case "" => ErrorReporting.fatal(s"Undefined himem_end")
|
||||||
case (_, "") => ErrorReporting.fatal(s"Undefined himem_end")
|
case end => parseNumber(end) + 1
|
||||||
case ("after_code", end) => new AfterCodeByteAllocator(parseNumber(end) + 1)
|
}
|
||||||
case (start, end) => new UpwardByteAllocator(parseNumber(start), 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")
|
val os = conf.getSection("output")
|
||||||
@ -120,7 +123,8 @@ object Platform {
|
|||||||
var fileExtension = os.get(classOf[String], "extension", ".bin")
|
var fileExtension = os.get(classOf[String], "extension", ".bin")
|
||||||
|
|
||||||
new Platform(cpu, flagOverrides, startingModules, outputPackager,
|
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)
|
if (fileExtension.startsWith(".")) fileExtension else "." + fileExtension)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -236,15 +236,14 @@ class Assembler(private val program: Program, private val rootEnv: Environment)
|
|||||||
case _ =>
|
case _ =>
|
||||||
}
|
}
|
||||||
|
|
||||||
var justAfterCode = platform.org
|
val codeAllocator = new VariableAllocator(Nil, platform.codeAllocator)
|
||||||
val allocator = platform.allocator
|
var justAfterCode = platform.codeAllocator.startAt
|
||||||
allocator.notifyAboutEndOfCode(platform.org)
|
|
||||||
env.allPreallocatables.foreach {
|
env.allPreallocatables.foreach {
|
||||||
case f: NormalFunction if f.address.isEmpty && f.name == "main" =>
|
case f: NormalFunction if f.address.isEmpty && f.name == "main" =>
|
||||||
val code = compiledFunctions(f.name)
|
val code = compiledFunctions(f.name)
|
||||||
if (code.nonEmpty) {
|
if (code.nonEmpty) {
|
||||||
val size = code.map(_.sizeInBytes).sum
|
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
|
labelMap(f.name) = index
|
||||||
justAfterCode = outputFunction(code, index, assembly, options)
|
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)
|
val code = compiledFunctions(f.name)
|
||||||
if (code.nonEmpty) {
|
if (code.nonEmpty) {
|
||||||
val size = code.map(_.sizeInBytes).sum
|
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
|
labelMap(f.name) = index
|
||||||
justAfterCode = outputFunction(code, index, assembly, options)
|
justAfterCode = outputFunction(code, index, assembly, options)
|
||||||
}
|
}
|
||||||
@ -263,7 +262,7 @@ class Assembler(private val program: Program, private val rootEnv: Environment)
|
|||||||
}
|
}
|
||||||
env.allPreallocatables.foreach {
|
env.allPreallocatables.foreach {
|
||||||
case InitializedArray(name, None, items) =>
|
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
|
labelMap(name) = index
|
||||||
assembly.append("* = $" + index.toHexString)
|
assembly.append("* = $" + index.toHexString)
|
||||||
assembly.append(name)
|
assembly.append(name)
|
||||||
@ -275,7 +274,7 @@ class Assembler(private val program: Program, private val rootEnv: Environment)
|
|||||||
initializedVariablesSize += items.length
|
initializedVariablesSize += items.length
|
||||||
justAfterCode = index
|
justAfterCode = index
|
||||||
case m@InitializedMemoryVariable(name, None, typ, value) =>
|
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
|
labelMap(name) = index
|
||||||
val altName = m.name.stripPrefix(env.prefix) + "`"
|
val altName = m.name.stripPrefix(env.prefix) + "`"
|
||||||
env.things += altName -> ConstantThing(altName, NumericConstant(index, 2), env.get[Type]("pointer"))
|
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
|
justAfterCode = index
|
||||||
case _ =>
|
case _ =>
|
||||||
}
|
}
|
||||||
allocator.notifyAboutEndOfCode(justAfterCode)
|
val variableAllocator = platform.variableAllocator
|
||||||
env.allocateVariables(None, bank0, callGraph, allocator, options, labelMap.put)
|
variableAllocator.notifyAboutEndOfCode(justAfterCode)
|
||||||
|
env.allocateVariables(None, bank0, callGraph, variableAllocator, options, labelMap.put)
|
||||||
|
|
||||||
env = rootEnv.allThings
|
env = rootEnv.allThings
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
package millfork.test.emu
|
package millfork.test.emu
|
||||||
|
|
||||||
import millfork.output.{AfterCodeByteAllocator, CurrentBankFragmentOutput, VariableAllocator}
|
import millfork.output.{AfterCodeByteAllocator, CurrentBankFragmentOutput, UpwardByteAllocator, VariableAllocator}
|
||||||
import millfork.{Cpu, Platform}
|
import millfork.{Cpu, Platform}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -12,8 +12,8 @@ object EmuPlatform {
|
|||||||
Map(),
|
Map(),
|
||||||
Nil,
|
Nil,
|
||||||
CurrentBankFragmentOutput(0, 0xffff),
|
CurrentBankFragmentOutput(0, 0xffff),
|
||||||
|
new UpwardByteAllocator(0x200, 0xb000),
|
||||||
new VariableAllocator((0 until 256 by 2).toList, new AfterCodeByteAllocator(0xff00)),
|
new VariableAllocator((0 until 256 by 2).toList, new AfterCodeByteAllocator(0xff00)),
|
||||||
0x200,
|
|
||||||
".bin"
|
".bin"
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -172,14 +172,14 @@ class EmuRun(cpu: millfork.Cpu.Value, nodeOptimizations: List[NodeOptimization],
|
|||||||
}
|
}
|
||||||
platform.cpu match {
|
platform.cpu match {
|
||||||
case millfork.Cpu.Cmos =>
|
case millfork.Cpu.Cmos =>
|
||||||
runViaSymon(memoryBank, platform.org, CpuBehavior.CMOS_6502)
|
runViaSymon(memoryBank, platform.codeAllocator.startAt, CpuBehavior.CMOS_6502)
|
||||||
case millfork.Cpu.Ricoh =>
|
case millfork.Cpu.Ricoh =>
|
||||||
runViaHalfnes(memoryBank, platform.org)
|
runViaHalfnes(memoryBank, platform.codeAllocator.startAt)
|
||||||
case millfork.Cpu.Mos =>
|
case millfork.Cpu.Mos =>
|
||||||
ErrorReporting.fatal("There's no NMOS emulator with decimal mode support")
|
ErrorReporting.fatal("There's no NMOS emulator with decimal mode support")
|
||||||
Timings(-1, -1) -> memoryBank
|
Timings(-1, -1) -> memoryBank
|
||||||
case millfork.Cpu.StrictMos | millfork.Cpu.StrictRicoh =>
|
case millfork.Cpu.StrictMos | millfork.Cpu.StrictRicoh =>
|
||||||
runViaSymon(memoryBank, platform.org, CpuBehavior.NMOS_6502)
|
runViaSymon(memoryBank, platform.codeAllocator.startAt, CpuBehavior.NMOS_6502)
|
||||||
case _ =>
|
case _ =>
|
||||||
ErrorReporting.trace("No emulation support for " + platform.cpu)
|
ErrorReporting.trace("No emulation support for " + platform.cpu)
|
||||||
Timings(-1, -1) -> memoryBank
|
Timings(-1, -1) -> memoryBank
|
||||||
|
Loading…
Reference in New Issue
Block a user