mirror of
https://github.com/mcanlas/6502-opcodes.git
synced 2025-02-09 05:30:33 +00:00
syntax traits
This commit is contained in:
parent
31d56060c5
commit
3f61977efb
@ -60,4 +60,4 @@ case class Label(s: String) extends Statement {
|
|||||||
|
|
||||||
def toTriplet: (String, Option[String], Option[String]) =
|
def toTriplet: (String, Option[String], Option[String]) =
|
||||||
(s, None, None)
|
(s, None, None)
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
package com.htmlism.mos6502
|
package com.htmlism.mos6502
|
||||||
|
|
||||||
package object dsl {
|
package object dsl extends syntax.DefinitionGroupSyntax with syntax.AsmDocSyntax with syntax.AsmSyntax {
|
||||||
def asmDoc(f: AsmDocumentContext => Unit): AsmDocument = {
|
def asmDoc(f: AsmDocumentContext => Unit): AsmDocument = {
|
||||||
val ctx: AsmDocumentContext =
|
val ctx: AsmDocumentContext =
|
||||||
new AsmDocumentContext
|
new AsmDocumentContext
|
||||||
@ -10,115 +10,6 @@ package object dsl {
|
|||||||
ctx.toDoc
|
ctx.toDoc
|
||||||
}
|
}
|
||||||
|
|
||||||
def asm(f: AssemblyContext => Unit)(implicit ctx: AsmDocumentContext): Unit = {
|
|
||||||
val asmCtx: AssemblyContext =
|
|
||||||
new AssemblyContext
|
|
||||||
|
|
||||||
f(asmCtx)
|
|
||||||
|
|
||||||
ctx
|
|
||||||
.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
|
|
||||||
|
|
||||||
val ret =
|
|
||||||
f(g)
|
|
||||||
|
|
||||||
ctx
|
|
||||||
.push(g.toGroup(s))
|
|
||||||
|
|
||||||
ret
|
|
||||||
}
|
|
||||||
|
|
||||||
def enum[A](implicit ctx: AsmDocumentContext, ev: EnumAsm[A]): Unit = {
|
|
||||||
val xs =
|
|
||||||
ev.all
|
|
||||||
.map(ev.label)
|
|
||||||
.toList
|
|
||||||
.zip(List.iterate(0, ev.all.size)(_ + 1))
|
|
||||||
|
|
||||||
val grp =
|
|
||||||
DefinitionGroup(
|
|
||||||
ev.comment,
|
|
||||||
xs
|
|
||||||
.map {
|
|
||||||
case (s, n) =>
|
|
||||||
Definition(s, n)
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
ctx
|
|
||||||
.push(grp)
|
|
||||||
}
|
|
||||||
|
|
||||||
def bitField[A](implicit ctx: AsmDocumentContext, ev: BitField[A]): Unit = {
|
|
||||||
val xs =
|
|
||||||
ev.all
|
|
||||||
.map(ev.label)
|
|
||||||
.toList
|
|
||||||
.zip(List.iterate(1, ev.all.size)(_ << 1))
|
|
||||||
|
|
||||||
val grp =
|
|
||||||
DefinitionGroup(
|
|
||||||
ev.comment,
|
|
||||||
xs
|
|
||||||
.map {
|
|
||||||
case (s, n) =>
|
|
||||||
Definition(s, n)
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
ctx
|
|
||||||
.push(grp)
|
|
||||||
}
|
|
||||||
|
|
||||||
def mapping[A](implicit ctx: AsmDocumentContext, ev: Mapping[A]): Unit = {
|
|
||||||
val xs =
|
|
||||||
ev.all
|
|
||||||
.map(x => ev.label(x) -> ev.value(x))
|
|
||||||
.toList
|
|
||||||
|
|
||||||
val grp =
|
|
||||||
DefinitionGroup(
|
|
||||||
ev.comment,
|
|
||||||
xs
|
|
||||||
.map {
|
|
||||||
case (s, n) =>
|
|
||||||
Definition(s, n)
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
ctx
|
|
||||||
.push(grp)
|
|
||||||
}
|
|
||||||
|
|
||||||
def define[A <: Address: Operand](name: String, x: A)(implicit ctx: DefinitionGroupContext): Definition[A] = {
|
|
||||||
val definition =
|
|
||||||
Definition(name, x)
|
|
||||||
|
|
||||||
ctx
|
|
||||||
.push(Definition(name, x))
|
|
||||||
|
|
||||||
definition
|
|
||||||
}
|
|
||||||
|
|
||||||
def constant(name: String, x: Int)(implicit ctx: DefinitionGroupContext): Definition[Int] = {
|
|
||||||
val definition =
|
|
||||||
Definition(name, x)
|
|
||||||
|
|
||||||
ctx
|
|
||||||
.push(Definition(name, x))
|
|
||||||
|
|
||||||
definition
|
|
||||||
}
|
|
||||||
|
|
||||||
implicit class AddressOps(n: Int) {
|
implicit class AddressOps(n: Int) {
|
||||||
def z: ZeroAddress =
|
def z: ZeroAddress =
|
||||||
ZeroAddress(n)
|
ZeroAddress(n)
|
||||||
|
@ -0,0 +1,89 @@
|
|||||||
|
package com.htmlism.mos6502.dsl
|
||||||
|
package syntax
|
||||||
|
|
||||||
|
trait AsmDocSyntax {
|
||||||
|
def asm(f: AssemblyContext => Unit)(implicit ctx: AsmDocumentContext): Unit = {
|
||||||
|
val asmCtx: AssemblyContext =
|
||||||
|
new AssemblyContext
|
||||||
|
|
||||||
|
f(asmCtx)
|
||||||
|
|
||||||
|
ctx
|
||||||
|
.push(asmCtx.toFragment)
|
||||||
|
}
|
||||||
|
|
||||||
|
def group[A](s: String)(f: DefinitionGroupContext => A)(implicit ctx: AsmDocumentContext): A = {
|
||||||
|
val g: DefinitionGroupContext =
|
||||||
|
new DefinitionGroupContext
|
||||||
|
|
||||||
|
val ret =
|
||||||
|
f(g)
|
||||||
|
|
||||||
|
ctx
|
||||||
|
.push(g.toGroup(s))
|
||||||
|
|
||||||
|
ret
|
||||||
|
}
|
||||||
|
|
||||||
|
def enum[A](implicit ctx: AsmDocumentContext, ev: EnumAsm[A]): Unit = {
|
||||||
|
val xs =
|
||||||
|
ev.all
|
||||||
|
.map(ev.label)
|
||||||
|
.toList
|
||||||
|
.zip(List.iterate(0, ev.all.size)(_ + 1))
|
||||||
|
|
||||||
|
val grp =
|
||||||
|
DefinitionGroup(
|
||||||
|
ev.comment,
|
||||||
|
xs
|
||||||
|
.map {
|
||||||
|
case (s, n) =>
|
||||||
|
Definition(s, n)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
ctx
|
||||||
|
.push(grp)
|
||||||
|
}
|
||||||
|
|
||||||
|
def bitField[A](implicit ctx: AsmDocumentContext, ev: BitField[A]): Unit = {
|
||||||
|
val xs =
|
||||||
|
ev.all
|
||||||
|
.map(ev.label)
|
||||||
|
.toList
|
||||||
|
.zip(List.iterate(1, ev.all.size)(_ << 1))
|
||||||
|
|
||||||
|
val grp =
|
||||||
|
DefinitionGroup(
|
||||||
|
ev.comment,
|
||||||
|
xs
|
||||||
|
.map {
|
||||||
|
case (s, n) =>
|
||||||
|
Definition(s, n)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
ctx
|
||||||
|
.push(grp)
|
||||||
|
}
|
||||||
|
|
||||||
|
def mapping[A](implicit ctx: AsmDocumentContext, ev: Mapping[A]): Unit = {
|
||||||
|
val xs =
|
||||||
|
ev.all
|
||||||
|
.map(x => ev.label(x) -> ev.value(x))
|
||||||
|
.toList
|
||||||
|
|
||||||
|
val grp =
|
||||||
|
DefinitionGroup(
|
||||||
|
ev.comment,
|
||||||
|
xs
|
||||||
|
.map {
|
||||||
|
case (s, n) =>
|
||||||
|
Definition(s, n)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
ctx
|
||||||
|
.push(grp)
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,8 @@
|
|||||||
|
package com.htmlism.mos6502.dsl
|
||||||
|
package syntax
|
||||||
|
|
||||||
|
trait AsmSyntax {
|
||||||
|
def label(s: String)(implicit ctx: AssemblyContext): Unit =
|
||||||
|
ctx
|
||||||
|
.push(s)
|
||||||
|
}
|
@ -0,0 +1,24 @@
|
|||||||
|
package com.htmlism.mos6502.dsl
|
||||||
|
package syntax
|
||||||
|
|
||||||
|
trait DefinitionGroupSyntax {
|
||||||
|
def define[A <: Address: Operand](name: String, x: A)(implicit ctx: DefinitionGroupContext): Definition[A] = {
|
||||||
|
val definition =
|
||||||
|
Definition(name, x)
|
||||||
|
|
||||||
|
ctx
|
||||||
|
.push(Definition(name, x))
|
||||||
|
|
||||||
|
definition
|
||||||
|
}
|
||||||
|
|
||||||
|
def constant(name: String, x: Int)(implicit ctx: DefinitionGroupContext): Definition[Int] = {
|
||||||
|
val definition =
|
||||||
|
Definition(name, x)
|
||||||
|
|
||||||
|
ctx
|
||||||
|
.push(Definition(name, x))
|
||||||
|
|
||||||
|
definition
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user