diff options
author | Astatin <[email protected]> | 2024-11-05 19:41:14 +0900 |
---|---|---|
committer | Astatin <[email protected]> | 2024-11-05 19:41:14 +0900 |
commit | 3d2af841e601d960d2ed9c7b081cd957fa58e494 (patch) | |
tree | e9da63ff9b0bea7cb3d058f5f01fc59eb63ec427 | |
parent | dc89fa71b45eedbe1b69602b7bcfb8c7b309498f (diff) |
Allow labels defined inside macros to be used as absolute 16b values
-rw-r--r-- | instructions.go | 22 | ||||
-rw-r--r-- | macros.go | 56 | ||||
-rw-r--r-- | parameters.go | 19 |
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{ @@ -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)": |