c65gm/internal/compiler/conststr.go

74 lines
1.5 KiB
Go

package compiler
import "c65gm/internal/preproc"
const (
asmStringDeclStart = " !raw "
asmStringDeclEnd = " !8 0"
asmCBMStringDeclStart = " !pet "
asmCBMStringDeclEnd = " !8 0"
)
type ConstantString struct {
label string
value string
compressable bool
useCBMStrings bool
}
type ConstantStringHandler struct {
strings []*ConstantString
compressMap map[string]string
}
func NewConstantStringHandler() *ConstantStringHandler {
return &ConstantStringHandler{
strings: make([]*ConstantString, 0),
compressMap: make(map[string]string),
}
}
func (h *ConstantStringHandler) AddConstStr(label, value string, compress bool, ps preproc.PragmaSet) string {
useCBM := ps.GetPragma("_P_USE_CBM_STRINGS") != ""
if compress {
if existingLabel, exists := h.compressMap[value]; exists {
return existingLabel
}
}
cs := &ConstantString{
label: label,
value: value,
compressable: compress,
useCBMStrings: useCBM,
}
h.strings = append(h.strings, cs)
if compress {
h.compressMap[value] = label
}
return label
}
func (h *ConstantStringHandler) GenerateConstStrDecls() []string {
result := make([]string, 0, len(h.strings)*3)
for _, cs := range h.strings {
startStr := asmStringDeclStart
endStr := asmStringDeclEnd
if cs.useCBMStrings {
startStr = asmCBMStringDeclStart
endStr = asmCBMStringDeclEnd
}
result = append(result, cs.label)
result = append(result, startStr+cs.value)
result = append(result, endStr)
}
return result
}