From 87213fd0a4a7a4e5f947d3d14da694cdd6855a5a Mon Sep 17 00:00:00 2001 From: Mark Canlas Date: Wed, 26 Aug 2020 02:15:40 -0400 Subject: [PATCH] definitions can emit many --- .../com/htmlism/mos6502/dsl/AsmDocumentContext.scala | 8 +++++--- src/main/scala/com/htmlism/mos6502/dsl/Definable.scala | 6 +++++- .../scala/com/htmlism/mos6502/dsl/ReadWriteLocation.scala | 6 ++++-- .../scala/com/htmlism/mos6502/dsl/VolatileDevice.scala | 6 ++++-- 4 files changed, 18 insertions(+), 8 deletions(-) diff --git a/src/main/scala/com/htmlism/mos6502/dsl/AsmDocumentContext.scala b/src/main/scala/com/htmlism/mos6502/dsl/AsmDocumentContext.scala index 868950d..d334f02 100644 --- a/src/main/scala/com/htmlism/mos6502/dsl/AsmDocumentContext.scala +++ b/src/main/scala/com/htmlism/mos6502/dsl/AsmDocumentContext.scala @@ -65,7 +65,9 @@ class DefinitionGroupContext { ListBuffer() def push[A](x: A)(implicit ev: Definable[A]): Unit = - xs.append(ev.toDefinition(x)) + ev + .toDefinitions(x) + .foreach(xs.append) def toGroup(s: String): DefinitionGroup = DefinitionGroup(s, xs.toList) @@ -80,8 +82,8 @@ case class Definition[A: Operand](name: String, x: A) { object Definition { implicit def definitionDefinable[A]: Definable[Definition[A]] = new Definable[Definition[A]] { - def toDefinition(x: Definition[A]) = - x + def toDefinitions(x: Definition[A]): List[Definition[_]] = + List(x) } } diff --git a/src/main/scala/com/htmlism/mos6502/dsl/Definable.scala b/src/main/scala/com/htmlism/mos6502/dsl/Definable.scala index 5a0ed06..0a16ff0 100644 --- a/src/main/scala/com/htmlism/mos6502/dsl/Definable.scala +++ b/src/main/scala/com/htmlism/mos6502/dsl/Definable.scala @@ -1,5 +1,9 @@ package com.htmlism.mos6502.dsl trait Definable[A] { - def toDefinition(x: A): Definition[_] + + /** + * A `Definable` can emit multiple definitions. Usually in the case of `word`s being split across two byte-definitions + */ + def toDefinitions(x: A): List[Definition[_]] } diff --git a/src/main/scala/com/htmlism/mos6502/dsl/ReadWriteLocation.scala b/src/main/scala/com/htmlism/mos6502/dsl/ReadWriteLocation.scala index c5f95ed..56c28ca 100644 --- a/src/main/scala/com/htmlism/mos6502/dsl/ReadWriteLocation.scala +++ b/src/main/scala/com/htmlism/mos6502/dsl/ReadWriteLocation.scala @@ -22,7 +22,9 @@ case class ReadWriteLocation[A](name: String, address: Address) { object ReadWriteLocation { implicit def readWriteLocationDefinable[A]: Definable[ReadWriteLocation[A]] = new Definable[ReadWriteLocation[A]] { - def toDefinition(x: ReadWriteLocation[A]): Definition[ZeroAddress] = - Definition(x.name, 0x00.z) + def toDefinitions(x: ReadWriteLocation[A]): List[Definition[ZeroAddress]] = + List { + Definition(x.name, 0x00.z) + } } } diff --git a/src/main/scala/com/htmlism/mos6502/dsl/VolatileDevice.scala b/src/main/scala/com/htmlism/mos6502/dsl/VolatileDevice.scala index 8862148..6d89608 100644 --- a/src/main/scala/com/htmlism/mos6502/dsl/VolatileDevice.scala +++ b/src/main/scala/com/htmlism/mos6502/dsl/VolatileDevice.scala @@ -19,7 +19,9 @@ case class VolatileDevice[A](name: String, address: Address) { object VolatileDevice { implicit def volatileDeviceDefinable[A]: Definable[VolatileDevice[A]] = new Definable[VolatileDevice[A]] { - def toDefinition(x: VolatileDevice[A]): Definition[ZeroAddress] = - Definition(x.name, 0x00.z) + def toDefinitions(x: VolatileDevice[A]): List[Definition[ZeroAddress]] = + List { + Definition(x.name, 0x00.z) + } } }