implement nested jump registry

This commit is contained in:
Mark Canlas 2020-08-21 04:58:07 -04:00
parent 53214fad91
commit 72c3aa4292
3 changed files with 45 additions and 4 deletions

View File

@ -25,7 +25,7 @@ class AsmDocumentContext {
def toDoc: AsmDocument = {
val asmFragmentsAndSubroutines =
xs.toList ::: jumps.toList
xs.toList ::: jumps.toList ++ jumps.flatMap(_.jumpRegistry).toList
AsmDocument(asmFragmentsAndSubroutines)
}
@ -40,7 +40,7 @@ case class AsmFragment(xs: List[Statement]) extends TopLevelAsmDocumentFragment
xs.map(_.toAsm).mkString("\n")
}
case class Subroutine(name: String, fragment: AsmFragment) extends TopLevelAsmDocumentFragment {
case class Subroutine(name: String, fragment: AsmFragment, jumpRegistry: ListSet[Subroutine]) extends TopLevelAsmDocumentFragment {
def toAsm: String =
name + ":" + "\n" + fragment.toAsm
}

View File

@ -14,7 +14,7 @@ trait AsmSyntax {
f(ctx)
Subroutine(s, ctx.toFragment)
Subroutine(s, ctx.toFragment, ctx.getJumps)
}
def jump(s: Subroutine)(implicit ctx: AssemblyContext): Unit = {

View File

@ -66,16 +66,57 @@ class Easy6502Spec extends AnyFlatSpec with should.Matchers {
)
}
"sub demo" should "compile" in {
"snake" should "compile" in {
val init =
sub("init") { implicit a =>
registers.X.incr
}
val readKeys =
sub("readKeys") { implicit a =>
val _ = a
}
val checkCollision =
sub("checkCollision") { implicit a =>
val _ = a
}
val updateSnake =
sub("updateSnake") { implicit a =>
val _ = a
}
val drawApple =
sub("drawApple") { implicit a =>
val _ = a
}
val drawSnake =
sub("drawSnake") { implicit a =>
val _ = a
}
val spinWheels =
sub("spinWheels") { implicit a =>
val _ = a
}
val loop =
sub("loop") { implicit a =>
jump(readKeys)
jump(checkCollision)
jump(updateSnake)
jump(drawApple)
jump(drawSnake)
jump(spinWheels)
}
val doc =
asmDoc { implicit ctx =>
asm { implicit a =>
jump(init)
jump(loop)
}
}