diff --git a/scratchpad/src/main/scala/com/htmlism/scratchpad/ByteLike.scala b/scratchpad/src/main/scala/com/htmlism/scratchpad/ByteLike.scala deleted file mode 100644 index 7c2a3c9..0000000 --- a/scratchpad/src/main/scala/com/htmlism/scratchpad/ByteLike.scala +++ /dev/null @@ -1,4 +0,0 @@ -package com.htmlism.scratchpad - -// anything can be encoded as a byte -trait ByteLike[A] {} diff --git a/scratchpad/src/main/scala/com/htmlism/scratchpad/Encoded.scala b/scratchpad/src/main/scala/com/htmlism/scratchpad/Encoded.scala new file mode 100644 index 0000000..504cd77 --- /dev/null +++ b/scratchpad/src/main/scala/com/htmlism/scratchpad/Encoded.scala @@ -0,0 +1,6 @@ +package com.htmlism.scratchpad + +object Encoded: + trait Byte[A] + + trait Word[A] diff --git a/scratchpad/src/main/scala/com/htmlism/scratchpad/Load.scala b/scratchpad/src/main/scala/com/htmlism/scratchpad/Load.scala new file mode 100644 index 0000000..f6ce2c1 --- /dev/null +++ b/scratchpad/src/main/scala/com/htmlism/scratchpad/Load.scala @@ -0,0 +1,9 @@ +package com.htmlism.scratchpad + +object Load: + def const[R: Register, X: Encoded.Byte](x: X): Asm1[R] = + Const(x) + + case class Const[R, X: Encoded.Byte](x: X)(using R: Register[R]) extends Asm1[R]: + def xs: List[String] = + List("LD" + R.name) diff --git a/scratchpad/src/main/scala/com/htmlism/scratchpad/Move.scala b/scratchpad/src/main/scala/com/htmlism/scratchpad/Move.scala index b3e59ad..7886dcb 100644 --- a/scratchpad/src/main/scala/com/htmlism/scratchpad/Move.scala +++ b/scratchpad/src/main/scala/com/htmlism/scratchpad/Move.scala @@ -2,13 +2,14 @@ package com.htmlism.scratchpad // https://mads.atari8.info/mads_eng.html#_mv object Move: - def const[R: Register, A: WriteLease, X: ByteLike](x: X): Asm2[R, A] = - // TODO freeze this into a data structure or a composition of data structures of load and store - Asm2Instructions(List("")) + def const[R: Register, A: WriteLease.Byte, X: Encoded.Byte](x: X): Asm2[R, A] = + Load + .const[R, X](x) + .widenWith[A] andThen Store.from[R, A] - def from[R: Register, A: ReadLease, B: WriteLease]: Asm3[R, A, B] = + def from[R: Register, A: ReadLease.Byte, B: WriteLease.Byte]: Asm3[R, A, B] = Asm3Instructions(List("")) object Word: - def const[R: Register, A: WriteLease, X: WordLike](x: X): Asm2[R, A] = + def const[R: Register, A: WriteLease.Word, X: Encoded.Word](x: X): Asm2[R, A] = Asm2Instructions(List("")) diff --git a/scratchpad/src/main/scala/com/htmlism/scratchpad/ReadLease.scala b/scratchpad/src/main/scala/com/htmlism/scratchpad/ReadLease.scala index cb0a0ab..f2d8ec1 100644 --- a/scratchpad/src/main/scala/com/htmlism/scratchpad/ReadLease.scala +++ b/scratchpad/src/main/scala/com/htmlism/scratchpad/ReadLease.scala @@ -1,3 +1,6 @@ package com.htmlism.scratchpad -trait ReadLease[A] {} +object ReadLease: + trait Byte[A] + + trait Word[A] diff --git a/scratchpad/src/main/scala/com/htmlism/scratchpad/Store.scala b/scratchpad/src/main/scala/com/htmlism/scratchpad/Store.scala new file mode 100644 index 0000000..eaf2d6e --- /dev/null +++ b/scratchpad/src/main/scala/com/htmlism/scratchpad/Store.scala @@ -0,0 +1,9 @@ +package com.htmlism.scratchpad + +object Store: + def from[R: Register, A: WriteLease.Byte]: Asm2[R, A] = + Byte[R, A]() + + case class Byte[R, A]()(using R: Register[R], A: WriteLease.Byte[A]) extends Asm2[R, A]: + def xs: List[String] = + List("ST" + R.name) diff --git a/scratchpad/src/main/scala/com/htmlism/scratchpad/WordLike.scala b/scratchpad/src/main/scala/com/htmlism/scratchpad/WordLike.scala deleted file mode 100644 index 6ddbd4e..0000000 --- a/scratchpad/src/main/scala/com/htmlism/scratchpad/WordLike.scala +++ /dev/null @@ -1,4 +0,0 @@ -package com.htmlism.scratchpad - -// anything can be encoded as a word (two bytes) -trait WordLike[A] {} diff --git a/scratchpad/src/main/scala/com/htmlism/scratchpad/WriteLease.scala b/scratchpad/src/main/scala/com/htmlism/scratchpad/WriteLease.scala index bae7f38..e12ca3f 100644 --- a/scratchpad/src/main/scala/com/htmlism/scratchpad/WriteLease.scala +++ b/scratchpad/src/main/scala/com/htmlism/scratchpad/WriteLease.scala @@ -1,3 +1,6 @@ package com.htmlism.scratchpad -trait WriteLease[A] {} +object WriteLease: + trait Byte[A] + + trait Word[A] diff --git a/scratchpad/src/main/scala/com/htmlism/scratchpad/asm.scala b/scratchpad/src/main/scala/com/htmlism/scratchpad/asm.scala index 9f2dc81..f6e5d89 100644 --- a/scratchpad/src/main/scala/com/htmlism/scratchpad/asm.scala +++ b/scratchpad/src/main/scala/com/htmlism/scratchpad/asm.scala @@ -3,17 +3,18 @@ package com.htmlism.scratchpad trait Asm1[A]: def xs: List[String] -case class Asm1Instructions[A](xs: List[String]) extends Asm1[A]: - def and[B]: Asm2Instructions[A, B] = + def widenWith[B]: Asm2[A, B] = Asm2Instructions(xs) +case class Asm1Instructions[A](xs: List[String]) extends Asm1[A] + trait Asm2[A, B]: def xs: List[String] -case class Asm2Instructions[A, B](xs: List[String]) extends Asm2[A, B]: - def andThen(that: Asm2Instructions[A, B]): Asm2[A, B] = + def andThen(that: Asm2[A, B]): Asm2[A, B] = AndThen2(this, that) +case class Asm2Instructions[A, B](xs: List[String]) extends Asm2[A, B]: // TODO not tested // B type needs to be a class type, with evidence, not a case class def swap[AA, BB](f: (R[A], R[B]) => (R[AA], R[BB])): Asm2Instructions[AA, BB] =