definable

This commit is contained in:
Mark Canlas 2022-12-06 14:30:35 -05:00
parent aad7c33c42
commit 899d36f7fe
7 changed files with 45 additions and 20 deletions

View File

@ -1,11 +1,11 @@
; $0200 = #$01
; $0200 = White
lda #$01
sta $0200
; $0201 = #$03
lda #$03
; $0201 = Green
lda #$05
sta $0201
; $0202 = #$05
lda #$05
; $0202 = Orange
lda #$08
sta $0202

View File

@ -1,11 +1,11 @@
; $0200 = #$01
; $0200 = White
LDA #$01
STA $0200
; $0201 = #$03
LDA #$03
; $0201 = Green
LDA #$05
STA $0201
; $0202 = #$05
LDA #$05
; $0202 = Orange
LDA #$08
STA $0202

View File

@ -7,7 +7,7 @@ case class AssemblerOptions(
object AssemblerOptions:
enum DefinitionsMode:
case InlineDefinitions, UseDefinitions, UseDefinitionsWithMath
case UseLiterals, UseDefinitions, UseDefinitionsWithMath
enum InstructionCase:
case Uppercase, Lowercase

View File

@ -0,0 +1,6 @@
package com.htmlism.firepower.demo
trait Definable[A]:
extension (x: A) def toComment: String
extension (x: A) def toValue: Int

View File

@ -0,0 +1,16 @@
package com.htmlism.firepower.demo
object Easy6502:
enum Color:
case Black, White, Red, Cyan, Purple, Green, Blue, Yellow, Orange, Brown, LightRed, DarkGrey, Grey, LightGreen,
LightBlue, LightGrey
object Color:
given Definable[Color] with
extension (x: Color)
def toComment: String =
x.toString
extension (x: Color)
def toValue: Int =
x.ordinal

View File

@ -31,10 +31,10 @@ object PrintPrograms extends ZIOAppDefault:
.pipe(Line.mkString),
"annotated-snake.asm" -> AnnotatedSnake.program,
"print-three-upper.asm" -> PrintThree.assemble(
AssemblerOptions(InstructionCase.Uppercase, DefinitionsMode.InlineDefinitions)
AssemblerOptions(InstructionCase.Uppercase, DefinitionsMode.UseLiterals)
),
"print-three-lower.asm" -> PrintThree.assemble(
AssemblerOptions(InstructionCase.Lowercase, DefinitionsMode.InlineDefinitions)
AssemblerOptions(InstructionCase.Lowercase, DefinitionsMode.UseLiterals)
)
)

View File

@ -8,22 +8,25 @@ import com.htmlism.firepower.core.AsmBlock._
import com.htmlism.firepower.core._
object PrintThree:
case class Move(src: String, dest: String)
case class Move[A: Definable](src: A, dest: String)
val program: List[Move] =
val program: List[Move[Easy6502.Color]] =
List(
Move("#$01", "$0200"),
Move("#$03", "$0201"),
Move("#$05", "$0202")
Move(Easy6502.Color.White, "$0200"),
Move(Easy6502.Color.Green, "$0201"),
Move(Easy6502.Color.Orange, "$0202")
)
def assemble(opt: AssemblerOptions): String =
program
.map { mv =>
val hex =
f"#$$${mv.src.toValue}%02X"
AsmBlock.Intent(
s"${mv.dest} = ${mv.src}".some,
s"${mv.dest} = ${mv.src.toComment}".some,
List(
AsmBlock.Intent.Instruction(instruction("LDA", opt.instructionCase) + " " + mv.src, None),
AsmBlock.Intent.Instruction(instruction("LDA", opt.instructionCase) + " " + hex, None),
AsmBlock.Intent.Instruction(instruction("STA", opt.instructionCase) + " " + mv.dest, None)
)
)