6502-opcodes/src/test/scala/com/htmlism/mos6502/dsl/snake/Easy6502Spec.scala

169 lines
3.7 KiB
Scala
Raw Normal View History

2020-08-15 05:27:13 +00:00
package com.htmlism.mos6502.dsl
2020-08-21 20:43:23 +00:00
package snake
2020-08-15 05:27:13 +00:00
2023-10-03 20:15:10 +00:00
import cats.syntax.all.*
import org.scalatest.flatspec.*
import org.scalatest.matchers.*
2020-08-15 05:27:13 +00:00
2023-10-03 20:15:10 +00:00
import com.htmlism.mos6502.model.*
2020-08-16 15:33:49 +00:00
2022-02-14 23:11:45 +00:00
class Easy6502Spec extends AnyFlatSpec with should.Matchers:
2020-08-15 05:27:13 +00:00
2023-06-13 18:01:45 +00:00
"the three pixel demo" should "have the right instructions" in:
2020-08-15 05:27:13 +00:00
val doc =
withAssemblyContext { implicit ctx =>
val scr =
IndexedAddressCollection[Color](0x0200, "screen")
scr.write(0, Color.White)
scr.write(1, Color.Green)
scr.write(2, Color.Orange)
}
2024-04-11 13:49:30 +00:00
doc.printOut()
2020-08-15 05:27:13 +00:00
doc.triplets shouldEqual List(
2020-08-16 05:56:17 +00:00
("LDA", "#white".some, "write White to screen (0)".some),
2020-08-15 05:27:13 +00:00
("STA", "$0200".some, "".some),
2020-08-16 05:56:17 +00:00
("LDA", "#green".some, "write Green to screen (1)".some),
2020-08-15 05:27:13 +00:00
("STA", "$0201".some, "".some),
2020-08-16 05:56:17 +00:00
("LDA", "#orange".some, "write Orange to screen (2)".some),
2020-08-15 05:27:13 +00:00
("STA", "$0202".some, "".some)
)
2023-06-13 18:01:45 +00:00
"define style dsl" should "compile" in:
2020-08-16 04:16:10 +00:00
val doc =
asmDoc { implicit ctx =>
2022-02-14 18:20:51 +00:00
enumAsm[Color]
2020-08-16 04:58:25 +00:00
asm { implicit a =>
val scr =
IndexedAddressCollection[Color](0x0200, "screen")
scr.write(0, Color.White)
scr.write(1, Color.Green)
scr.write(2, Color.Orange)
}
2020-08-16 04:16:10 +00:00
}
2020-08-16 05:17:39 +00:00
println(
doc.toAsm
)
2020-08-16 04:16:10 +00:00
2023-06-13 18:01:45 +00:00
"loop demo" should "compile" in:
2020-08-16 15:33:49 +00:00
val doc =
asmDoc { implicit ctx =>
asm { implicit a =>
2024-01-01 00:05:35 +00:00
registers.X.loop("incrementing", 2.upTo(5)) { implicit a =>
2020-08-16 15:33:49 +00:00
a.push(INY)
}
}
}
println(
doc.toAsm
)
2023-06-13 18:01:45 +00:00
"snake" should "compile" in:
2022-12-02 01:44:59 +00:00
val sysRandom = VolatileDevice[Int]("sysRandom", 0xfe.z)
2020-08-26 06:06:54 +00:00
val sysLastKey = VolatileDevice[AsciiValue]("sysLastKey", 0xff.z)
2020-08-26 05:41:50 +00:00
2022-12-02 01:44:59 +00:00
val appleLocation = ReadWriteLocation[Int]("appleLocation", 0x00.z)
2020-08-26 05:41:50 +00:00
val snakeDirection = ReadWriteLocation[Direction]("snakeDirection", 0x02.z)
2022-12-02 01:44:59 +00:00
val snakeLength = ReadWriteLocation[Int]("snakeLength", 0x03.z)
2020-08-25 01:15:17 +00:00
2020-08-21 09:06:09 +00:00
val initSnake =
sub("initSnake") { implicit a =>
snakeDirection.write(Right)
2020-08-26 14:26:37 +00:00
snakeLength.write(4) // 2 * 2
2020-08-21 09:06:09 +00:00
}
val generateApplePosition =
sub("generateApplePosition") { implicit a =>
registers.X.incr
}
2020-08-16 16:55:21 +00:00
val init =
sub("init") { implicit a =>
2020-08-21 09:06:09 +00:00
jump(initSnake)
jump(generateApplePosition)
2020-08-16 16:55:21 +00:00
}
2020-08-21 08:58:07 +00:00
val readKeys =
sub("readKeys") { implicit a =>
val _ = a
}
val checkCollision =
sub("checkCollision") { implicit a =>
val _ = a
}
val updateSnake =
sub("updateSnake") { implicit a =>
val _ = a
}
val drawApple =
sub("drawApple") { implicit a =>
val _ = a
}
val drawSnake =
sub("drawSnake") { implicit a =>
val _ = a
}
val spinWheels =
sub("spinWheels") { implicit a =>
val _ = a
}
val loop =
sub("loop") { implicit a =>
jump(readKeys)
jump(checkCollision)
jump(updateSnake)
jump(drawApple)
jump(drawSnake)
jump(spinWheels)
}
2020-08-16 16:55:21 +00:00
val doc =
asmDoc { implicit ctx =>
2020-08-26 06:06:54 +00:00
group("6502js") { implicit g =>
g.push(sysRandom)
g.push(sysLastKey)
}
group("snake") { implicit g =>
2020-08-26 06:24:09 +00:00
g.push(appleLocation)
g.push(snakeDirection)
g.push(snakeLength)
2020-08-26 06:06:54 +00:00
}
2020-08-21 20:43:23 +00:00
bitField[Direction]
mapping[AsciiValue]
2020-08-16 16:55:21 +00:00
asm { implicit a =>
2020-08-25 01:15:17 +00:00
sysRandom.read
sysLastKey.read
2020-08-26 04:56:55 +00:00
appleLocation.read
2020-08-25 01:15:17 +00:00
2020-08-16 16:55:21 +00:00
jump(init)
2020-08-21 08:58:07 +00:00
jump(loop)
2020-08-16 16:55:21 +00:00
}
}
println(
doc.toAsm
)
2022-02-14 23:11:45 +00:00
def withAssemblyContext(f: AssemblyContext => Unit): AssemblyContext =
2020-08-15 05:27:13 +00:00
val ctx: AssemblyContext =
new AssemblyContext
f(ctx)
ctx