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)