aboutsummaryrefslogtreecommitdiff
path: root/macros.go
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 /macros.go
parentdc89fa71b45eedbe1b69602b7bcfb8c7b309498f (diff)
Allow labels defined inside macros to be used as absolute 16b values
Diffstat (limited to 'macros.go')
-rw-r--r--macros.go56
1 files changed, 37 insertions, 19 deletions
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)