mirror of
https://github.com/mcanlas/6502-opcodes.git
synced 2025-02-07 22:31:10 +00:00
write to things
This commit is contained in:
parent
44875a4690
commit
6199265f26
@ -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"
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user