aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAstatin <[email protected]>2024-11-05 19:41:14 +0900
committerAstatin <[email protected]>2024-11-05 19:41:14 +0900
commit3d2af841e601d960d2ed9c7b081cd957fa58e494 (patch)
treee9da63ff9b0bea7cb3d058f5f01fc59eb63ec427
parentdc89fa71b45eedbe1b69602b7bcfb8c7b309498f (diff)
Allow labels defined inside macros to be used as absolute 16b values
-rw-r--r--instructions.go22
-rw-r--r--macros.go56
-rw-r--r--parameters.go19
3 files changed, 38 insertions, 59 deletions
diff --git a/instructions.go b/instructions.go
index 94b48bd..46a0923 100644
--- a/instructions.go
+++ b/instructions.go
@@ -285,26 +285,6 @@ func InstructionSetNew() InstructionSet {
},
},
{
- Types: []ParamType{MacroLabel},
- Assembler: func(currentAddress uint16, args []uint16) ([]byte, error) {
- relativeAddress, err := absoluteJPValueToRelative(currentAddress, args[0])
- if err != nil {
- return nil, err
- }
- return []byte{0b00011000, relativeAddress}, nil
- },
- },
- {
- Types: []ParamType{Condition, MacroLabel},
- Assembler: func(currentAddress uint16, args []uint16) ([]byte, error) {
- relativeAddress, err := absoluteJPValueToRelative(currentAddress, args[1])
- if err != nil {
- return nil, err
- }
- return []byte{0b00100000 | (uint8(args[0]) << 3), relativeAddress}, nil
- },
- },
- {
Types: []ParamType{Raw16},
Assembler: func(currentAddress uint16, args []uint16) ([]byte, error) {
relativeAddress, err := absoluteJPValueToRelative(currentAddress, args[0])
@@ -313,7 +293,6 @@ func InstructionSetNew() InstructionSet {
}
return []byte{0b00011000, relativeAddress}, nil
},
- MacroForbidden: true,
},
{
Types: []ParamType{Condition, Raw16},
@@ -324,7 +303,6 @@ func InstructionSetNew() InstructionSet {
}
return []byte{0b00100000 | (uint8(args[0]) << 3), relativeAddress}, nil
},
- MacroForbidden: true,
},
}
result["CALL"] = []InstructionParams{
diff --git a/macros.go b/macros.go
index 30ab64a..8e8d4c1 100644
--- a/macros.go
+++ b/macros.go
@@ -152,33 +152,51 @@ func MacroParse(
(*line_nb) += 1
}
- state := ProgramState{
- Labels: Clone(state.Labels),
- Defs: Clone(state.Defs),
- IsMacro: true,
- }
-
if is_first_pass {
if _, ok := MacroInstructions[definedMacroName]; ok {
return fmt.Errorf("Macro %s is already defined", definedMacroName)
}
- new_instructions, err := firstPass("MACRO$"+definedMacroName, macroContent, 0, &state)
- if err != nil {
- return err
+ MacroInstructions["."+definedMacroName] = []InstructionParams{
+ {
+ Types: []ParamType{},
+ Assembler: func(currentAddress uint16, args []uint16) ([]uint8, error) {
+ state := ProgramState{
+ Labels: Clone(state.Labels),
+ Defs: Clone(state.Defs),
+ IsMacro: true,
+ }
+ new_instructions, err := firstPass("MACRO$"+definedMacroName, macroContent, 0, &state)
+ if err != nil {
+ return nil, err
+ }
+ return new_instructions, nil
+ },
+ },
}
- MacroInstructions["."+definedMacroName] = InlineMacroAssembler(new_instructions)
} else {
- _, err := firstPass("MACRO$"+definedMacroName, macroContent, 0, &state)
- if err != nil {
- return err
+ MacroInstructions["."+definedMacroName] = []InstructionParams{
+ {
+ Types: []ParamType{},
+ Assembler: func(currentAddress uint16, args []uint16) ([]uint8, error) {
+ state := ProgramState{
+ Labels: Clone(state.Labels),
+ Defs: Clone(state.Defs),
+ IsMacro: true,
+ }
+ _, err := firstPass("MACRO$"+definedMacroName, macroContent, uint(currentAddress), &state)
+ if err != nil {
+ return nil, err
+ }
+ new_instructions, err := secondPass("MACRO$"+definedMacroName, macroContent, uint(currentAddress), state)
+ if err != nil {
+ return nil, err
+ }
+
+ return new_instructions, nil
+ },
+ },
}
- new_instructions, err := secondPass("MACRO$"+definedMacroName, macroContent, 0, state)
- if err != nil {
- return err
- }
- MacroInstructions["."+definedMacroName] = InlineMacroAssembler(new_instructions)
-
}
} else {
return fmt.Errorf("Unknown macro \"%s\"", macroName)
diff --git a/parameters.go b/parameters.go
index 5e234f5..4c787f3 100644
--- a/parameters.go
+++ b/parameters.go
@@ -120,7 +120,7 @@ func Raw16(labels *Labels, defs *Definitions, param string) (uint16, error) {
return uint16(res), nil
}
- if strings.HasPrefix(param, "=") && !strings.HasPrefix(param, "=$") {
+ if strings.HasPrefix(param, "=") {
if labels == nil {
return 0, nil
}
@@ -144,23 +144,6 @@ func Raw16(labels *Labels, defs *Definitions, param string) (uint16, error) {
return uint16(res), err
}
-func MacroLabel(labels *Labels, defs *Definitions, param string) (uint16, error) {
- if strings.HasPrefix(param, "=$") {
- if labels == nil {
- return 0, nil
- }
-
- label := strings.ToUpper(strings.TrimPrefix(param, "="))
- labelValue, ok := (*labels)[label]
- if !ok {
- return 0, fmt.Errorf("Label \"%s\" not found", label)
- }
-
- return uint16(labelValue), nil
- }
- return 0, fmt.Errorf("Invalid macro label")
-}
-
func Reg16Indirect(_ *Labels, _ *Definitions, param string) (uint16, error) {
switch param {
case "(BC)":