write to things

This commit is contained in:
Mark Canlas 2022-08-03 00:16:11 -04:00
parent 44875a4690
commit 6199265f26
6 changed files with 92 additions and 0 deletions

View File

@ -0,0 +1,3 @@
package com.htmlism.scratchpad
trait Enum[A] {}

View File

@ -0,0 +1,9 @@
package com.htmlism.scratchpad
trait Loadable[A]:
def show(x: A): String
object Loadable:
given intLoadable: Loadable[Int] with
def show(x: Int): String =
x.toString

View File

@ -0,0 +1,18 @@
package com.htmlism.scratchpad
sealed trait Register[A]:
def self: String
object Register:
given registerA: Register[A] with
def self: String = "A"
given registerX: Register[X] with
def self: String = "X"
given registerY: Register[Y] with
def self: String = "Y"
class A
class X
class Y

View File

@ -0,0 +1,24 @@
package com.htmlism.scratchpad
object Address:
def zero(n: Int): ZeroPageAddress =
ZeroPageAddress(n % 256)
def absolute(n: Int): GlobalAddress =
GlobalAddress(n % (256 * 256))
case class ZeroPageAddress(n: Int)
case class GlobalAddress(n: Int)
sealed trait ReadAddress:
def addr: ZeroPageAddress
sealed trait WriteAddress:
def addr: ZeroPageAddress
case class Volatile(addr: ZeroPageAddress) extends ReadAddress
case class ReadWriteAddress(addr: ZeroPageAddress) extends ReadAddress with WriteAddress
case class WriteOnlyAddress(addr: ZeroPageAddress) extends WriteAddress

View File

@ -0,0 +1,10 @@
package com.htmlism.scratchpad
package object syntax:
implicit class WriteRegisterOps(reg: WriteAddress):
def write[A: Loadable](x: A): PartiallyAppliedWrite[A] =
new PartiallyAppliedWrite(reg, x)
class PartiallyAppliedWrite[A: Loadable](reg: WriteAddress, x: A):
def apply[B: Register]: String =
reg.addr.n.toString + summon[Loadable[A]].show(x) + summon[Register[B]].self

View File

@ -0,0 +1,28 @@
package com.htmlism.scratchpad
import org.scalatest.funsuite.AnyFunSuite
import org.scalatest.matchers.should._
import com.htmlism.scratchpad.syntax._
class FeatureSpec extends AnyFunSuite with Matchers:
test("zero page address as write only supports writing") {
WriteOnlyAddress(Address.zero(0x01))
.write(2)[Register.A] shouldBe "12A"
}
test("zero page address as read/write supports writing") {
ReadWriteAddress(Address.zero(0x01))
.write(2)[Register.A] shouldBe "12A"
}
test("writing to an address can use A, X, and Y registers for bouncing ") {
ReadWriteAddress(Address.zero(0x01))
.write(2)[Register.A] shouldBe "12A"
ReadWriteAddress(Address.zero(0x01))
.write(2)[Register.X] shouldBe "12X"
ReadWriteAddress(Address.zero(0x01))
.write(2)[Register.Y] shouldBe "12Y"
}