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

105 lines
3.1 KiB
Scala
Raw Normal View History

2022-12-04 23:36:11 +00:00
package com.htmlism.firepower.core
2022-05-16 15:37:29 +00:00
2022-10-03 02:43:22 +00:00
object CodeGenerator extends App:
2022-05-16 15:37:29 +00:00
val allLetters =
('A' to 'Z')
.map(_.toString)
2023-10-03 20:15:10 +00:00
for n <- 1 to 3 do
2022-11-20 08:33:37 +00:00
val letters =
allLetters.take(n)
val nextLetter =
allLetters(n)
val typeParameterList =
letters.mkString(", ")
2022-11-21 15:36:36 +00:00
println(s"sealed trait Asm$n[$typeParameterList]:")
2022-11-20 08:33:37 +00:00
println(" def xs: List[String]")
println
println(" def oComment: Option[String]")
println
println(s" def comment(s: String): Asm$n[$typeParameterList]")
println
2022-11-20 08:48:42 +00:00
println(s" def andThen(that: Asm$n[$typeParameterList]): Asm$n[$typeParameterList] =")
println(s" AndThen$n[$typeParameterList](this, that, None)")
println
2022-11-20 08:33:37 +00:00
println(s" def widenWith[$nextLetter]: Asm${n + 1}[$typeParameterList, $nextLetter] =")
println(s" Asm${n + 1}Instructions(xs, oComment)")
println
2022-11-20 08:48:42 +00:00
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
2022-11-20 08:33:37 +00:00
println(
2022-11-21 15:36:36 +00:00
s"case class Asm${n}Instructions[$typeParameterList](xs: List[String], oComment: Option[String] = None) extends Asm${n}[$typeParameterList]:"
2022-11-20 08:33:37 +00:00
)
println(s" def comment(s: String): Asm$n[$typeParameterList] =")
println(" copy(oComment = Some(s))")
println
2023-10-03 20:15:10 +00:00
for n <- 1 to 3 do
2022-05-16 15:37:29 +00:00
val classNum =
2022-10-03 02:43:22 +00:00
n
2022-05-16 15:37:29 +00:00
val letters =
allLetters.take(n)
val typeParametersLong =
2022-06-20 15:49:25 +00:00
letters
.flatMap { s =>
List(s"$s : Reg", s"M$s <: MutationStatus")
}
.appended("Z : Monoid")
.mkString(", ")
2022-05-16 15:37:29 +00:00
val typeParametersShort =
2022-06-20 15:49:25 +00:00
letters
.flatMap { s =>
List(s"$s", s"M$s")
}
2022-05-16 15:37:29 +00:00
.mkString(", ")
val parameters =
2022-06-20 15:49:25 +00:00
letters
.map { s =>
s"${s.toLowerCase}: StatefulRegister[$s, M$s]"
}
2022-05-16 15:37:29 +00:00
.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):")
2022-06-20 15:49:25 +00:00
println(
s" def andThen(that: AsmProgram$classNum[$typeParametersShort, Z]): AsmProgram$classNum[$typeParametersShort, Z] ="
)
2022-05-23 15:11:57 +00:00
println(s" AsmProgram$classNum($arguments, z |+| that.z)")
2022-05-16 15:37:29 +00:00
println()
2022-07-27 02:51:46 +00:00
println(s" def widen[$newLetter : Reg]: AsmProgram$nPlus[$typeParametersShort, $newLetter, Ignores, Z] =")
println(s" AsmProgram$nPlus($arguments, ??? : StatefulRegister[$newLetter, Ignores], z)")
2022-05-16 15:37:29 +00:00
println()
2022-05-23 15:11:57 +00:00
println(s" def name(s: String): SubRoutine$classNum[$typeParametersShort, Z] =")
println(s" SubRoutine$classNum(s, this)")
println()
2022-05-16 15:37:29 +00:00
2022-06-20 15:49:25 +00:00
println(
s"case class SubRoutine$classNum[$typeParametersLong](name: String, program: AsmProgram$classNum[$typeParametersShort, Z])"
)
2022-05-23 15:11:57 +00:00
println()