aboutsummaryrefslogtreecommitdiff
path: root/parameters.go
diff options
context:
space:
mode:
Diffstat (limited to 'parameters.go')
-rw-r--r--parameters.go134
1 files changed, 134 insertions, 0 deletions
diff --git a/parameters.go b/parameters.go
new file mode 100644
index 0000000..665c551
--- /dev/null
+++ b/parameters.go
@@ -0,0 +1,134 @@
+package main
+
+import (
+ "fmt"
+ "strconv"
+)
+
+func Reg8(param string) (uint16, error) {
+ switch param {
+ case "A":
+ return 7, nil
+ case "B":
+ return 0, nil
+ case "C":
+ return 1, nil
+ case "D":
+ return 2, nil
+ case "E":
+ return 3, nil
+ case "H":
+ return 4, nil
+ case "L":
+ return 5, nil
+ case "(HL)":
+ return 6, nil
+ }
+ return 0, fmt.Errorf("Invalid reg8")
+}
+
+func A(param string) (uint16, error) {
+ if param == "A" {
+ return 0, nil
+ }
+ return 0, fmt.Errorf("Invalid A")
+}
+
+func HL(param string) (uint16, error) {
+ if param == "HL" {
+ return 0, nil
+ }
+ return 0, fmt.Errorf("Invalid HL")
+}
+
+func SP(param string) (uint16, error) {
+ if param == "SP" {
+ return 0, nil
+ }
+ return 0, fmt.Errorf("Invalid SP")
+}
+
+func IndirectC(param string) (uint16, error) {
+ if param == "(C)" {
+ return 0, nil
+ }
+ return 0, fmt.Errorf("Invalid (C)")
+}
+
+func Reg16(param string) (uint16, error) {
+ switch param {
+ case "BC":
+ return 0, nil
+ case "DE":
+ return 1, nil
+ case "HL":
+ return 2, nil
+ case "AF":
+ return 3, nil
+ // TODO Split in two different for push and not push instructions
+ case "SP":
+ return 3, nil
+ }
+ return 0, fmt.Errorf("Invalid reg16")
+}
+
+func Raw8(param string) (uint16, error) {
+ res, err := strconv.ParseInt(param, 0, 8)
+ return uint16(res), err
+}
+
+func Raw16(param string) (uint16, error) {
+ res, err := strconv.ParseInt(param, 0, 16)
+ return uint16(res), err
+}
+
+func Reg16Indirect(param string) (uint16, error) {
+ switch param {
+ case "(BC)":
+ return 0, nil
+ case "(DE)":
+ return 1, nil
+ case "(HL+)":
+ return 2, nil
+ case "(HL-)":
+ return 3, nil
+ }
+ return 0, fmt.Errorf("Invalid reg16 indirect")
+}
+
+func Raw8Indirect(param string) (uint16, error) {
+ if len(param) < 2 || param[0] != '(' || param[len(param)-1] != ')' {
+ return 0, fmt.Errorf("Invalid raw8indirect")
+ }
+
+ res, err := strconv.ParseInt(param[1:len(param)-1], 0, 8)
+ return uint16(res), err
+}
+
+func Raw16Indirect(param string) (uint16, error) {
+ if len(param) < 2 || param[0] != '(' || param[len(param)-1] != ')' {
+ return 0, fmt.Errorf("Invalid raw16indirect")
+ }
+
+ res, err := strconv.ParseInt(param[1:len(param)-1], 0, 16)
+ return uint16(res), err
+}
+
+func Condition(param string) (uint16, error) {
+ switch param {
+ case "NZ":
+ return 0, nil
+ case "Z":
+ return 1, nil
+ case "NC":
+ return 2, nil
+ case "C":
+ return 3, nil
+ }
+ return 0, fmt.Errorf("Invalid condition")
+}
+
+func BitOrdinal(param string) (uint16, error) {
+ res, err := strconv.ParseInt(param, 0, 3)
+ return uint16(res), err
+}