mirror of
https://github.com/KarolS/millfork.git
synced 2024-08-30 19:29:42 +00:00
Fixed object allocation fixes, assembly output improvements
This commit is contained in:
parent
2b182ee2c7
commit
a414feedec
12
src/main/scala/millfork/env/Environment.scala
vendored
12
src/main/scala/millfork/env/Environment.scala
vendored
@ -68,6 +68,18 @@ class Environment(val parent: Option[Environment], val prefix: String) {
|
|||||||
case _ => Nil
|
case _ => Nil
|
||||||
}.toList
|
}.toList
|
||||||
|
|
||||||
|
def getAllFixedAddressObjects: List[(Int, Int)] = {
|
||||||
|
things.values.flatMap {
|
||||||
|
case RelativeArray(_, NumericConstant(addr, _), size) =>
|
||||||
|
List(addr.toInt -> size)
|
||||||
|
case RelativeVariable(_, NumericConstant(addr, _), typ, _) =>
|
||||||
|
List(addr.toInt -> typ.size)
|
||||||
|
case f: NormalFunction =>
|
||||||
|
f.environment.getAllFixedAddressObjects
|
||||||
|
case _ => Nil
|
||||||
|
}.toList
|
||||||
|
}
|
||||||
|
|
||||||
def allocateVariables(nf: Option[NormalFunction], mem: MemoryBank, callGraph: CallGraph, allocator: VariableAllocator, options: CompilationOptions, onEachVariable: (String, Int) => Unit): Unit = {
|
def allocateVariables(nf: Option[NormalFunction], mem: MemoryBank, callGraph: CallGraph, allocator: VariableAllocator, options: CompilationOptions, onEachVariable: (String, Int) => Unit): Unit = {
|
||||||
val b = get[Type]("byte")
|
val b = get[Type]("byte")
|
||||||
val p = get[Type]("pointer")
|
val p = get[Type]("pointer")
|
||||||
|
@ -31,6 +31,7 @@ object ErrorReporting {
|
|||||||
flushOutput()
|
flushOutput()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@inline
|
||||||
private def flushOutput(): Unit = {
|
private def flushOutput(): Unit = {
|
||||||
System.out.flush()
|
System.out.flush()
|
||||||
System.err.flush()
|
System.err.flush()
|
||||||
@ -55,6 +56,7 @@ object ErrorReporting {
|
|||||||
hasErrors = true
|
hasErrors = true
|
||||||
println("FATAL: " + f(position) + msg)
|
println("FATAL: " + f(position) + msg)
|
||||||
flushOutput()
|
flushOutput()
|
||||||
|
System.exit(1)
|
||||||
throw new RuntimeException(msg)
|
throw new RuntimeException(msg)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -89,8 +89,7 @@ class Assembler(private val program: Program, private val rootEnv: Environment)
|
|||||||
}
|
}
|
||||||
} catch {
|
} catch {
|
||||||
case e: StackOverflowError =>
|
case e: StackOverflowError =>
|
||||||
e.printStackTrace()
|
ErrorReporting.fatal("Stack overflow " + c)
|
||||||
ErrorReporting.fatal("Stack overflow")
|
|
||||||
}
|
}
|
||||||
case HalfWordConstant(cc, true) => deepConstResolve(cc).>>>(8).&(0xff)
|
case HalfWordConstant(cc, true) => deepConstResolve(cc).>>>(8).&(0xff)
|
||||||
case HalfWordConstant(cc, false) => deepConstResolve(cc).&(0xff)
|
case HalfWordConstant(cc, false) => deepConstResolve(cc).&(0xff)
|
||||||
@ -212,13 +211,15 @@ class Assembler(private val program: Program, private val rootEnv: Environment)
|
|||||||
assembly.append(name)
|
assembly.append(name)
|
||||||
for (item <- items) {
|
for (item <- items) {
|
||||||
writeByte(0, index, item)
|
writeByte(0, index, item)
|
||||||
assembly.append(" !byte " + item)
|
|
||||||
bank0.occupied(index) = true
|
bank0.occupied(index) = true
|
||||||
bank0.initialized(index) = true
|
bank0.initialized(index) = true
|
||||||
bank0.writeable(index) = true
|
bank0.writeable(index) = true
|
||||||
bank0.readable(index) = true
|
bank0.readable(index) = true
|
||||||
index += 1
|
index += 1
|
||||||
}
|
}
|
||||||
|
items.grouped(16).foreach {group =>
|
||||||
|
assembly.append(" !byte " + group.mkString(", "))
|
||||||
|
}
|
||||||
initializedVariablesSize += items.length
|
initializedVariablesSize += items.length
|
||||||
case InitializedArray(name, Some(_), items) => ???
|
case InitializedArray(name, Some(_), items) => ???
|
||||||
case f: NormalFunction if f.address.isDefined =>
|
case f: NormalFunction if f.address.isDefined =>
|
||||||
@ -268,9 +269,11 @@ class Assembler(private val program: Program, private val rootEnv: Environment)
|
|||||||
assembly.append(name)
|
assembly.append(name)
|
||||||
for (item <- items) {
|
for (item <- items) {
|
||||||
writeByte(0, index, item)
|
writeByte(0, index, item)
|
||||||
assembly.append(" !byte " + item)
|
|
||||||
index += 1
|
index += 1
|
||||||
}
|
}
|
||||||
|
items.grouped(16).foreach {group =>
|
||||||
|
assembly.append(" !byte " + group.mkString(", "))
|
||||||
|
}
|
||||||
initializedVariablesSize += items.length
|
initializedVariablesSize += items.length
|
||||||
justAfterCode = index
|
justAfterCode = index
|
||||||
case m@InitializedMemoryVariable(name, None, typ, value) =>
|
case m@InitializedMemoryVariable(name, None, typ, value) =>
|
||||||
@ -289,6 +292,11 @@ class Assembler(private val program: Program, private val rootEnv: Environment)
|
|||||||
justAfterCode = index
|
justAfterCode = index
|
||||||
case _ =>
|
case _ =>
|
||||||
}
|
}
|
||||||
|
env.getAllFixedAddressObjects.foreach {
|
||||||
|
case (addr, size) =>
|
||||||
|
println(addr)
|
||||||
|
for(i <- 0 until size) bank0.occupied(addr + i) = true
|
||||||
|
}
|
||||||
val variableAllocator = platform.variableAllocator
|
val variableAllocator = platform.variableAllocator
|
||||||
variableAllocator.notifyAboutEndOfCode(justAfterCode)
|
variableAllocator.notifyAboutEndOfCode(justAfterCode)
|
||||||
env.allocateVariables(None, bank0, callGraph, variableAllocator, options, labelMap.put)
|
env.allocateVariables(None, bank0, callGraph, variableAllocator, options, labelMap.put)
|
||||||
|
Loading…
Reference in New Issue
Block a user