From 3d2af841e601d960d2ed9c7b081cd957fa58e494 Mon Sep 17 00:00:00 2001 From: Astatin Date: Tue, 5 Nov 2024 19:41:14 +0900 Subject: Allow labels defined inside macros to be used as absolute 16b values --- macros.go | 56 +++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 37 insertions(+), 19 deletions(-) (limited to 'macros.go') 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) -- cgit v1.2.3-70-g09d2