(codeStartOffset uint16, instructions []Instruction)
| 95 | } |
| 96 | |
| 97 | func (a *Assembler) ToString(codeStartOffset uint16, instructions []Instruction) (string, error) { |
| 98 | a.labels = make(map[string]uint16) |
| 99 | a.symbols = make(map[string]uint16) |
| 100 | position := uint16(0) |
| 101 | |
| 102 | //calculate lengths |
| 103 | for _, ins := range instructions { |
| 104 | position += uint16(ins.Size()) |
| 105 | |
| 106 | if label, ok := ins.(DEFLABEL); ok { |
| 107 | a.labels[label.Name] = position + codeStartOffset |
| 108 | } |
| 109 | |
| 110 | if symbol, ok := ins.(DEFSYMBOL); ok { |
| 111 | a.symbols[symbol.Name] = symbol.Value |
| 112 | } |
| 113 | } |
| 114 | |
| 115 | result := strings.Builder{} |
| 116 | |
| 117 | position = 0 |
| 118 | for index, ins := range instructions { |
| 119 | if _, ok := ins.(DEFLABEL); ok { |
| 120 | l := ins.(DEFLABEL) |
| 121 | result.WriteString("\n") |
| 122 | result.WriteString(l.Name) |
| 123 | result.WriteString(":") |
| 124 | } else if _, ok := ins.(DEFSYMBOL); ok { |
| 125 | s := ins.(DEFSYMBOL) |
| 126 | result.WriteString(s.String()) |
| 127 | } else { |
| 128 | a.symbols[CURRENTINSTRUCTION] = position + codeStartOffset |
| 129 | a.symbols[NEXTINSTRUCTION] = getNextExecutableInstructionLoc(a.symbols[CURRENTINSTRUCTION], index, instructions) |
| 130 | result.WriteString("\t") |
| 131 | result.WriteString(fmt.Sprintf("%s:\t", utils.ValueToString(position+codeStartOffset))) |
| 132 | |
| 133 | emit, err := ins.Emit(a.ResolveLabel, a.ResolveSymbol) |
| 134 | if err != nil { |
| 135 | return "", err |
| 136 | } |
| 137 | result.WriteString("{") |
| 138 | for i := 0; i < ins.Size(); i++ { |
| 139 | result.WriteString(fmt.Sprintf("%s", utils.ValueToString(emit[i]))) |
| 140 | if i < ins.Size()-1 { |
| 141 | result.WriteString(" ") |
| 142 | } |
| 143 | } |
| 144 | result.WriteString("}") |
| 145 | switch ins.Size() { |
| 146 | case 4: |
| 147 | result.WriteString("\t") |
| 148 | default: |
| 149 | result.WriteString(strings.Repeat("\t", 3)) |
| 150 | } |
| 151 | result.WriteString(ins.String()) |
| 152 | position += uint16(ins.Size()) |
| 153 | } |
| 154 | result.WriteString("\n") |
no test coverage detected