From 31d56060c5d9b090239d59af298567a3bb77486a Mon Sep 17 00:00:00 2001 From: Mark Canlas Date: Sun, 16 Aug 2020 02:17:04 -0400 Subject: [PATCH] add label support --- .../com/htmlism/mos6502/dsl/DslDemo.scala | 3 +++ .../com/htmlism/mos6502/dsl/Statement.scala | 8 ++++++++ .../com/htmlism/mos6502/dsl/package.scala | 4 ++++ .../com/htmlism/mos6502/dsl/DslSpec.scala | 19 +++++++++++++++++++ 4 files changed, 34 insertions(+) diff --git a/src/main/scala/com/htmlism/mos6502/dsl/DslDemo.scala b/src/main/scala/com/htmlism/mos6502/dsl/DslDemo.scala index d150cb5..4586b04 100644 --- a/src/main/scala/com/htmlism/mos6502/dsl/DslDemo.scala +++ b/src/main/scala/com/htmlism/mos6502/dsl/DslDemo.scala @@ -113,6 +113,9 @@ class AssemblyContext { def push(instruction: Instruction, s: String): Unit = xs.append(UnaryInstruction(instruction, s.some)) + def push(s: String): Unit = + xs.append(Label(s)) + def push[A: Operand](instruction: Instruction, x: A): Unit = xs.append(InstructionWithOperand(instruction, x, None)) diff --git a/src/main/scala/com/htmlism/mos6502/dsl/Statement.scala b/src/main/scala/com/htmlism/mos6502/dsl/Statement.scala index 295ad53..b0371ea 100644 --- a/src/main/scala/com/htmlism/mos6502/dsl/Statement.scala +++ b/src/main/scala/com/htmlism/mos6502/dsl/Statement.scala @@ -53,3 +53,11 @@ case class InstructionWithOperand[A](instruction: Instruction, operand: A, comme def toTriplet: (String, Option[String], Option[String]) = (instruction.toString, ev.toAddressLiteral(operand).some, comment) } + +case class Label(s: String) extends Statement { + def toAsm: String = + s + ":" + + def toTriplet: (String, Option[String], Option[String]) = + (s, None, None) +} \ No newline at end of file diff --git a/src/main/scala/com/htmlism/mos6502/dsl/package.scala b/src/main/scala/com/htmlism/mos6502/dsl/package.scala index 9934c62..3d84912 100644 --- a/src/main/scala/com/htmlism/mos6502/dsl/package.scala +++ b/src/main/scala/com/htmlism/mos6502/dsl/package.scala @@ -20,6 +20,10 @@ package object dsl { .push(asmCtx.toFragment) } + def label(s: String)(implicit ctx: AssemblyContext): Unit = + ctx + .push(s) + def group[A](s: String)(f: DefinitionGroupContext => A)(implicit ctx: AsmDocumentContext): A = { val g: DefinitionGroupContext = new DefinitionGroupContext diff --git a/src/test/scala/com/htmlism/mos6502/dsl/DslSpec.scala b/src/test/scala/com/htmlism/mos6502/dsl/DslSpec.scala index 1d361d8..63f27dc 100644 --- a/src/test/scala/com/htmlism/mos6502/dsl/DslSpec.scala +++ b/src/test/scala/com/htmlism/mos6502/dsl/DslSpec.scala @@ -126,6 +126,25 @@ class DslSpec extends AnyFlatSpec with should.Matchers { ) ) } + + "label" should "compile" in { + val doc = + asmDoc { implicit ctx => + asm { implicit a => + label("init") + } + } + + doc shouldEqual AsmDocument( + List( + AsmFragment( + List( + Label("init") + ) + ) + ) + ) + } } sealed trait Triforce