package com.htmlism.mos6502.dsl import cats.syntax.all.* import com.htmlism.mos6502.model.Instruction sealed trait Statement: def toAsm: String def toTriplet: (String, Option[String], Option[String]) object Statement: val indent: String = " " case class UnaryInstruction(instruction: Instruction, comment: Option[String]) extends Statement: def toAsm: String = val left = instruction.toString comment match case Some(c) => Statement.indent + f"$left%-16s ; " + c case None => Statement.indent + left def toTriplet: (String, Option[String], Option[String]) = (instruction.toString, None, comment) case class InstructionWithOperand[A](instruction: Instruction, operand: A, comment: Option[String])(using ev: Operand[A] ) extends Statement: def toAsm: String = val left = instruction.toString val operandStr = ev.toAddressLiteral(operand) comment match case Some(c) => Statement.indent + f"$left%-5s $operandStr%-11s; " + c case None => Statement.indent + f"$left%-5s $operandStr" def toTriplet: (String, Option[String], Option[String]) = (instruction.toString, ev.toAddressLiteral(operand).some, comment) case class Label(s: String) extends Statement: def toAsm: String = s + ":" def toTriplet: (String, Option[String], Option[String]) = (s, None, None) case class BranchingInstruction(instruction: Instruction, label: String) extends Statement: def toAsm: String = Statement.indent + instruction.toString + " " + label def toTriplet: (String, Option[String], Option[String]) = (instruction.toString, label.some, None)