aboutsummaryrefslogtreecommitdiff
path: root/parameters.go
diff options
context:
space:
mode:
authorAstatin <[email protected]>2024-09-24 15:01:58 +0900
committerAstatin <astatin@redacted>2024-09-24 15:01:58 +0900
commit748e8ba9e9afd67695ca62f3b691970f943071a6 (patch)
tree0bc707517ca95fe02e046a11616b18fbd685aa1f /parameters.go
parent1680bc5146b25d3631e6b7bfee3946ef59d906fd (diff)
Add labels in go assembler
Diffstat (limited to 'parameters.go')
-rw-r--r--parameters.go47
1 files changed, 34 insertions, 13 deletions
diff --git a/parameters.go b/parameters.go
index 665c551..02991cf 100644
--- a/parameters.go
+++ b/parameters.go
@@ -3,9 +3,10 @@ package main
import (
"fmt"
"strconv"
+ "strings"
)
-func Reg8(param string) (uint16, error) {
+func Reg8(_ *ProgramState, param string) (uint16, error) {
switch param {
case "A":
return 7, nil
@@ -27,35 +28,35 @@ func Reg8(param string) (uint16, error) {
return 0, fmt.Errorf("Invalid reg8")
}
-func A(param string) (uint16, error) {
+func A(_ *ProgramState, param string) (uint16, error) {
if param == "A" {
return 0, nil
}
return 0, fmt.Errorf("Invalid A")
}
-func HL(param string) (uint16, error) {
+func HL(_ *ProgramState, param string) (uint16, error) {
if param == "HL" {
return 0, nil
}
return 0, fmt.Errorf("Invalid HL")
}
-func SP(param string) (uint16, error) {
+func SP(_ *ProgramState, param string) (uint16, error) {
if param == "SP" {
return 0, nil
}
return 0, fmt.Errorf("Invalid SP")
}
-func IndirectC(param string) (uint16, error) {
+func IndirectC(_ *ProgramState, param string) (uint16, error) {
if param == "(C)" {
return 0, nil
}
return 0, fmt.Errorf("Invalid (C)")
}
-func Reg16(param string) (uint16, error) {
+func Reg16(_ *ProgramState, param string) (uint16, error) {
switch param {
case "BC":
return 0, nil
@@ -72,17 +73,37 @@ func Reg16(param string) (uint16, error) {
return 0, fmt.Errorf("Invalid reg16")
}
-func Raw8(param string) (uint16, error) {
+func Raw8(_ *ProgramState, param string) (uint16, error) {
res, err := strconv.ParseInt(param, 0, 8)
return uint16(res), err
}
-func Raw16(param string) (uint16, error) {
+func Raw16(state *ProgramState, param string) (uint16, error) {
res, err := strconv.ParseInt(param, 0, 16)
+
+ if strings.HasPrefix(param, "=") {
+ if state == nil {
+ return 0, nil
+ }
+
+ label := strings.ToUpper(strings.TrimPrefix(param, "="))
+ labelValue, ok := state.Labels[label]
+ if !ok {
+ return 0, fmt.Errorf("Label \"%s\" not found", label)
+ }
+
+ // TODO: Manage when multiple MBC
+ if labelValue > 0x8000 {
+ panic("Switchable ROM banks are not implemented yet")
+ }
+
+ return uint16(labelValue), nil
+ }
+
return uint16(res), err
}
-func Reg16Indirect(param string) (uint16, error) {
+func Reg16Indirect(_ *ProgramState, param string) (uint16, error) {
switch param {
case "(BC)":
return 0, nil
@@ -96,7 +117,7 @@ func Reg16Indirect(param string) (uint16, error) {
return 0, fmt.Errorf("Invalid reg16 indirect")
}
-func Raw8Indirect(param string) (uint16, error) {
+func Raw8Indirect(_ *ProgramState, param string) (uint16, error) {
if len(param) < 2 || param[0] != '(' || param[len(param)-1] != ')' {
return 0, fmt.Errorf("Invalid raw8indirect")
}
@@ -105,7 +126,7 @@ func Raw8Indirect(param string) (uint16, error) {
return uint16(res), err
}
-func Raw16Indirect(param string) (uint16, error) {
+func Raw16Indirect(_ *ProgramState, param string) (uint16, error) {
if len(param) < 2 || param[0] != '(' || param[len(param)-1] != ')' {
return 0, fmt.Errorf("Invalid raw16indirect")
}
@@ -114,7 +135,7 @@ func Raw16Indirect(param string) (uint16, error) {
return uint16(res), err
}
-func Condition(param string) (uint16, error) {
+func Condition(_ *ProgramState, param string) (uint16, error) {
switch param {
case "NZ":
return 0, nil
@@ -128,7 +149,7 @@ func Condition(param string) (uint16, error) {
return 0, fmt.Errorf("Invalid condition")
}
-func BitOrdinal(param string) (uint16, error) {
+func BitOrdinal(_ *ProgramState, param string) (uint16, error) {
res, err := strconv.ParseInt(param, 0, 3)
return uint16(res), err
}