| 200 | } |
| 201 | |
| 202 | func parseTwoRegisterInstruction(name string, operands string) (Instruction, error) { |
| 203 | registers := TWO_REGISTER_EXTRACTOR.FindStringSubmatch(operands) |
| 204 | |
| 205 | if len(registers) != 3 { |
| 206 | return nil, fmt.Errorf("Instruction %s only supports two command separated registers", name) |
| 207 | } |
| 208 | |
| 209 | var register1 REGISTER |
| 210 | if v, ok := REGISTERS[registers[1]]; !ok { |
| 211 | return nil, fmt.Errorf("Unknown register %s for instruction %s", registers[1], name) |
| 212 | } else { |
| 213 | register1 = v |
| 214 | } |
| 215 | |
| 216 | var register2 REGISTER |
| 217 | if v, ok := REGISTERS[registers[2]]; !ok { |
| 218 | return nil, fmt.Errorf("Unknown register %s for instruction %s", registers[2], name) |
| 219 | } else { |
| 220 | register2 = v |
| 221 | } |
| 222 | |
| 223 | switch name { |
| 224 | case "ADD": |
| 225 | return ADD{register1, register2}, nil |
| 226 | case "AND": |
| 227 | return AND{register1, register2}, nil |
| 228 | case "XOR": |
| 229 | return XOR{register1, register2}, nil |
| 230 | case "OR": |
| 231 | return OR{register1, register2}, nil |
| 232 | case "LD": |
| 233 | return LOAD{register1, register2}, nil |
| 234 | case "ST": |
| 235 | return STORE{register1, register2}, nil |
| 236 | case "CMP": |
| 237 | return CMP{register1, register2}, nil |
| 238 | default: |
| 239 | return nil, fmt.Errorf("unknown/unsupported instruction %s", name) |
| 240 | } |
| 241 | } |
| 242 | |
| 243 | func parseOneRegisterInstruction(name string, operands string) (Instruction, error) { |
| 244 | registers := ONE_REGISTER_EXTRACTOR.FindStringSubmatch(operands) |