diff --git a/src/main/scala/com/htmlism/mos6502/dsl/Address.scala b/src/main/scala/com/htmlism/mos6502/dsl/Address.scala index d23c576..d7a3a12 100644 --- a/src/main/scala/com/htmlism/mos6502/dsl/Address.scala +++ b/src/main/scala/com/htmlism/mos6502/dsl/Address.scala @@ -13,12 +13,12 @@ object ZeroAddress { def toShow(x: ZeroAddress): String = String.format("zero address 0x%02x", x.n) - def toDefinitionLiteral(x: ZeroAddress): String = - toAddressLiteral(x) - def toAddressLiteral(x: ZeroAddress): String = String.format("$%02x", x.n) } + + implicit val definitionValueForZero: DefinitionValue[ZeroAddress] = + operandZero.toAddressLiteral(_) } case class ZeroAddress(n: Int) extends Address @@ -32,12 +32,12 @@ object GlobalAddress { def toShow(x: GlobalAddress): String = String.format("global address 0x%04x", x.n) - def toDefinitionLiteral(x: GlobalAddress): String = - toAddressLiteral(x) - def toAddressLiteral(x: GlobalAddress): String = String.format("$%04x", x.n) } + + implicit val definitionValueForGlobal: DefinitionValue[GlobalAddress] = + operandGlobal.toAddressLiteral(_) } case class GlobalAddress(n: Int) extends Address diff --git a/src/main/scala/com/htmlism/mos6502/dsl/AsmDocumentContext.scala b/src/main/scala/com/htmlism/mos6502/dsl/AsmDocumentContext.scala index b4c5276..c2dd961 100644 --- a/src/main/scala/com/htmlism/mos6502/dsl/AsmDocumentContext.scala +++ b/src/main/scala/com/htmlism/mos6502/dsl/AsmDocumentContext.scala @@ -86,10 +86,10 @@ class DefinitionGroupContext { /** * @param comment Typically used by resources to describe their type safety */ -case class Definition[A: Operand](name: String, x: A, comment: Option[String]) { +case class Definition[A](name: String, x: A, comment: Option[String])(implicit ev: DefinitionValue[A]) { lazy val value: String = - implicitly[Operand[A]] - .toDefinitionLiteral(x) + ev + .value(x) } object Definition { @@ -99,10 +99,10 @@ object Definition { List(x) } - def apply[A: Operand](name: String, x: A): Definition[A] = + def apply[A: DefinitionValue](name: String, x: A): Definition[A] = Definition(name, x, None) - def apply[A: Operand](name: String, x: A, comment: String): Definition[A] = + def apply[A: DefinitionValue](name: String, x: A, comment: String): Definition[A] = Definition(name, x, comment.some) } diff --git a/src/main/scala/com/htmlism/mos6502/dsl/Color.scala b/src/main/scala/com/htmlism/mos6502/dsl/Color.scala index d2a51eb..be5e9f0 100644 --- a/src/main/scala/com/htmlism/mos6502/dsl/Color.scala +++ b/src/main/scala/com/htmlism/mos6502/dsl/Color.scala @@ -15,9 +15,6 @@ object Color { def operandType: OperandType = ValueLiteral - - def toDefinitionLiteral(x: Color): String = - toByte(x).toString } implicit val colorEnum: EnumAsm[Color] = @@ -52,26 +49,6 @@ object Color { x.toString } - def toByte(x: Color): Int = - x match { - case Black => 0x0 - case White => 0x1 - case Red => 0x2 - case Cyan => 0x3 - case Purple => 0x4 - case Green => 0x5 - case Blue => 0x6 - case Yellow => 0x7 - case Orange => 0x8 - case Brown => 0x9 - case LightRed => 0xa - case DarkGrey => 0xb - case Grey => 0xc - case LightGreen => 0xd - case LightBlue => 0xe - case LightGrey => 0xf - } - case object Black extends Color case object White extends Color case object Red extends Color diff --git a/src/main/scala/com/htmlism/mos6502/dsl/DefinitionValue.scala b/src/main/scala/com/htmlism/mos6502/dsl/DefinitionValue.scala new file mode 100644 index 0000000..67244ed --- /dev/null +++ b/src/main/scala/com/htmlism/mos6502/dsl/DefinitionValue.scala @@ -0,0 +1,15 @@ +package com.htmlism.mos6502.dsl + +trait DefinitionValue[A] { + + /** + * The value as presented in a `define` declaration (i.e. where no alias is possible) + */ + def value(x: A): String +} + +object DefinitionValue { + implicit val definitionValueForInt: DefinitionValue[Int] = + Operand.operandInt + .toAddressLiteral(_) +} diff --git a/src/main/scala/com/htmlism/mos6502/dsl/Operand.scala b/src/main/scala/com/htmlism/mos6502/dsl/Operand.scala index 72fd600..1cf48d1 100644 --- a/src/main/scala/com/htmlism/mos6502/dsl/Operand.scala +++ b/src/main/scala/com/htmlism/mos6502/dsl/Operand.scala @@ -11,11 +11,6 @@ trait Operand[A] { def toShow(x: A): String def operandType: OperandType - - /** - * The value as presented in a `define` declaration (i.e. where no alias is possible) - */ - def toDefinitionLiteral(x: A): String } object Operand { @@ -27,9 +22,6 @@ object Operand { def toShow(x: Int): String = x.toString - def toDefinitionLiteral(x: Int): String = - x.toString - def toAddressLiteral(x: Int): String = String.format("#$%02x", x) } diff --git a/src/main/scala/com/htmlism/mos6502/dsl/syntax/DefinitionGroupSyntax.scala b/src/main/scala/com/htmlism/mos6502/dsl/syntax/DefinitionGroupSyntax.scala index 13c2fba..b1e8780 100644 --- a/src/main/scala/com/htmlism/mos6502/dsl/syntax/DefinitionGroupSyntax.scala +++ b/src/main/scala/com/htmlism/mos6502/dsl/syntax/DefinitionGroupSyntax.scala @@ -2,7 +2,7 @@ package com.htmlism.mos6502.dsl package syntax trait DefinitionGroupSyntax { - def define[A <: Address: Operand](name: String, x: A)(implicit ctx: DefinitionGroupContext): Definition[A] = { + def define[A <: Address: DefinitionValue](name: String, x: A)(implicit ctx: DefinitionGroupContext): Definition[A] = { val definition = Definition(name, x)