From 899d36f7febf476a174ad8e0e89afd83bc91f78f Mon Sep 17 00:00:00 2001 From: Mark Canlas Date: Tue, 6 Dec 2022 14:30:35 -0500 Subject: [PATCH] definable --- data/print-three-lower.asm | 10 +++++----- data/print-three-upper.asm | 10 +++++----- .../firepower/core/AssemblerOptions.scala | 2 +- .../com/htmlism/firepower/demo/Definable.scala | 6 ++++++ .../com/htmlism/firepower/demo/Easy6502.scala | 16 ++++++++++++++++ .../htmlism/firepower/demo/PrintPrograms.scala | 4 ++-- .../com/htmlism/firepower/demo/PrintThree.scala | 17 ++++++++++------- 7 files changed, 45 insertions(+), 20 deletions(-) create mode 100644 firepower-demo/src/main/scala/com/htmlism/firepower/demo/Definable.scala create mode 100644 firepower-demo/src/main/scala/com/htmlism/firepower/demo/Easy6502.scala diff --git a/data/print-three-lower.asm b/data/print-three-lower.asm index 08ddd3c..563c31e 100644 --- a/data/print-three-lower.asm +++ b/data/print-three-lower.asm @@ -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 diff --git a/data/print-three-upper.asm b/data/print-three-upper.asm index 21a2f4f..698b60a 100644 --- a/data/print-three-upper.asm +++ b/data/print-three-upper.asm @@ -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 diff --git a/firepower-core/src/main/scala/com/htmlism/firepower/core/AssemblerOptions.scala b/firepower-core/src/main/scala/com/htmlism/firepower/core/AssemblerOptions.scala index 204e5f2..eb263f6 100644 --- a/firepower-core/src/main/scala/com/htmlism/firepower/core/AssemblerOptions.scala +++ b/firepower-core/src/main/scala/com/htmlism/firepower/core/AssemblerOptions.scala @@ -7,7 +7,7 @@ case class AssemblerOptions( object AssemblerOptions: enum DefinitionsMode: - case InlineDefinitions, UseDefinitions, UseDefinitionsWithMath + case UseLiterals, UseDefinitions, UseDefinitionsWithMath enum InstructionCase: case Uppercase, Lowercase diff --git a/firepower-demo/src/main/scala/com/htmlism/firepower/demo/Definable.scala b/firepower-demo/src/main/scala/com/htmlism/firepower/demo/Definable.scala new file mode 100644 index 0000000..c61c8e4 --- /dev/null +++ b/firepower-demo/src/main/scala/com/htmlism/firepower/demo/Definable.scala @@ -0,0 +1,6 @@ +package com.htmlism.firepower.demo + +trait Definable[A]: + extension (x: A) def toComment: String + + extension (x: A) def toValue: Int diff --git a/firepower-demo/src/main/scala/com/htmlism/firepower/demo/Easy6502.scala b/firepower-demo/src/main/scala/com/htmlism/firepower/demo/Easy6502.scala new file mode 100644 index 0000000..da397d8 --- /dev/null +++ b/firepower-demo/src/main/scala/com/htmlism/firepower/demo/Easy6502.scala @@ -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 diff --git a/firepower-demo/src/main/scala/com/htmlism/firepower/demo/PrintPrograms.scala b/firepower-demo/src/main/scala/com/htmlism/firepower/demo/PrintPrograms.scala index f21e5c8..4f8290d 100644 --- a/firepower-demo/src/main/scala/com/htmlism/firepower/demo/PrintPrograms.scala +++ b/firepower-demo/src/main/scala/com/htmlism/firepower/demo/PrintPrograms.scala @@ -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) ) ) diff --git a/firepower-demo/src/main/scala/com/htmlism/firepower/demo/PrintThree.scala b/firepower-demo/src/main/scala/com/htmlism/firepower/demo/PrintThree.scala index 12a3f9d..b6251df 100644 --- a/firepower-demo/src/main/scala/com/htmlism/firepower/demo/PrintThree.scala +++ b/firepower-demo/src/main/scala/com/htmlism/firepower/demo/PrintThree.scala @@ -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) ) )