aboutsummaryrefslogtreecommitdiff
path: root/macros.go
diff options
context:
space:
mode:
Diffstat (limited to 'macros.go')
-rw-r--r--macros.go29
1 files changed, 23 insertions, 6 deletions
diff --git a/macros.go b/macros.go
index bf91eaa..22c300f 100644
--- a/macros.go
+++ b/macros.go
@@ -165,10 +165,14 @@ func MacroParse(
state.Defs[name] = definedValue
} else if macroName == ".MACRODEF" && !state.IsMacro {
- if len(words) != 2 {
- return fmt.Errorf(".MACRODEF should have one argument, followed by the definition")
+ if len(words) < 2 {
+ return fmt.Errorf(".MACRODEF should have at least one argument, followed by the definition")
}
definedMacroName := strings.ToUpper(words[1])
+ definedMacroArguments := words[2:]
+ for i := range definedMacroArguments {
+ definedMacroArguments[i] = strings.ToUpper(definedMacroArguments[i])
+ }
(*lineNb) += 1
macroContent := []byte{}
for *lineNb < len(lines) && strings.TrimSpace(strings.Split(lines[*lineNb], ";")[0]) != ".END" {
@@ -176,6 +180,11 @@ func MacroParse(
(*lineNb) += 1
}
+ parameterTypes := make([]ParamType, len(definedMacroArguments))
+ for i := range definedMacroArguments {
+ parameterTypes[i] = Raw16
+ }
+
if isFirstPass {
if _, ok := MacroInstructions[definedMacroName]; ok {
return fmt.Errorf("Macro %s is already defined", definedMacroName)
@@ -183,11 +192,15 @@ func MacroParse(
MacroInstructions["."+definedMacroName] = []InstructionParams{
{
- Types: []ParamType{},
+ Types: parameterTypes,
Assembler: func(currentAddress uint16, args []uint16) ([]uint8, error) {
+ definitions := Clone(state.Defs)
+ for i, macroArg := range definedMacroArguments {
+ definitions[macroArg] = Raw16b(args[i])
+ }
state := ProgramState{
Labels: Clone(state.Labels),
- Defs: Clone(state.Defs),
+ Defs: definitions,
IsMacro: true,
}
new_instructions, err := firstPass("MACRO$"+definedMacroName, macroContent, 0, &state)
@@ -201,11 +214,15 @@ func MacroParse(
} else {
MacroInstructions["."+definedMacroName] = []InstructionParams{
{
- Types: []ParamType{},
+ Types: parameterTypes,
Assembler: func(currentAddress uint16, args []uint16) ([]uint8, error) {
+ definitions := Clone(state.Defs)
+ for i, macroArg := range definedMacroArguments {
+ definitions[macroArg] = Raw16b(args[i])
+ }
state := ProgramState{
Labels: Clone(state.Labels),
- Defs: Clone(state.Defs),
+ Defs: definitions,
IsMacro: true,
}
_, err := firstPass("MACRO$"+definedMacroName, macroContent, uint(currentAddress), &state)