mirror of
https://github.com/mcanlas/6502-opcodes.git
synced 2025-08-09 07:25:08 +00:00
write to things
This commit is contained in:
@@ -0,0 +1,3 @@
|
|||||||
|
package com.htmlism.scratchpad
|
||||||
|
|
||||||
|
trait Enum[A] {}
|
@@ -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
|
@@ -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
|
@@ -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
|
@@ -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
|
@@ -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"
|
||||||
|
}
|
Reference in New Issue
Block a user