6502-opcodes/firepower-core/src/main/scala/com/htmlism/firepower/core/CodeGenerator.scala

105 lines
3.1 KiB
Scala

package com.htmlism.firepower.core
object CodeGenerator extends App:
val allLetters =
('A' to 'Z')
.map(_.toString)
for n <- 1 to 3 do
val letters =
allLetters.take(n)
val nextLetter =
allLetters(n)
val typeParameterList =
letters.mkString(", ")
println(s"sealed trait Asm$n[$typeParameterList]:")
println(" def xs: List[String]")
println
println(" def oComment: Option[String]")
println
println(s" def comment(s: String): Asm$n[$typeParameterList]")
println
println(s" def andThen(that: Asm$n[$typeParameterList]): Asm$n[$typeParameterList] =")
println(s" AndThen$n[$typeParameterList](this, that, None)")
println
println(s" def widenWith[$nextLetter]: Asm${n + 1}[$typeParameterList, $nextLetter] =")
println(s" Asm${n + 1}Instructions(xs, oComment)")
println
println(
s"case class AndThen${n}[$typeParameterList](left: Asm$n[$typeParameterList], right: Asm$n[$typeParameterList], oComment: Option[String]) extends Asm${n}[$typeParameterList]:"
)
println(" def xs: List[String] =")
println(" left.xs ++ right.xs")
println
println(s" def comment(s: String): Asm$n[$typeParameterList] =")
println(" copy(oComment = Some(s))")
println
println(
s"case class Asm${n}Instructions[$typeParameterList](xs: List[String], oComment: Option[String] = None) extends Asm${n}[$typeParameterList]:"
)
println(s" def comment(s: String): Asm$n[$typeParameterList] =")
println(" copy(oComment = Some(s))")
println
for n <- 1 to 3 do
val classNum =
n
val letters =
allLetters.take(n)
val typeParametersLong =
letters
.flatMap { s =>
List(s"$s : Reg", s"M$s <: MutationStatus")
}
.appended("Z : Monoid")
.mkString(", ")
val typeParametersShort =
letters
.flatMap { s =>
List(s"$s", s"M$s")
}
.mkString(", ")
val parameters =
letters
.map { s =>
s"${s.toLowerCase}: StatefulRegister[$s, M$s]"
}
.appended("z: Z")
.mkString(", ")
val nPlus =
n + 1
val arguments =
letters
.map(_.toLowerCase)
.mkString(", ")
val newLetter =
allLetters(n)
println(s"case class AsmProgram$classNum[$typeParametersLong]($parameters):")
println(
s" def andThen(that: AsmProgram$classNum[$typeParametersShort, Z]): AsmProgram$classNum[$typeParametersShort, Z] ="
)
println(s" AsmProgram$classNum($arguments, z |+| that.z)")
println()
println(s" def widen[$newLetter : Reg]: AsmProgram$nPlus[$typeParametersShort, $newLetter, Ignores, Z] =")
println(s" AsmProgram$nPlus($arguments, ??? : StatefulRegister[$newLetter, Ignores], z)")
println()
println(s" def name(s: String): SubRoutine$classNum[$typeParametersShort, Z] =")
println(s" SubRoutine$classNum(s, this)")
println()
println(
s"case class SubRoutine$classNum[$typeParametersLong](name: String, program: AsmProgram$classNum[$typeParametersShort, Z])"
)
println()