From 8c60c8cf7acb3563b31d9d17ba1303efe3f0aa39 Mon Sep 17 00:00:00 2001 From: Astatin Date: Fri, 7 Mar 2025 23:54:34 +0900 Subject: add high/low paramters modifiers, parameters to macros & print symbols to stdout --- macros.go | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) (limited to 'macros.go') 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) -- cgit v1.2.3-70-g09d2