| 634 | } |
| 635 | |
| 636 | func (c CALL) Emit(labelResolver LabelResolver, symbolResolver SymbolResolver) ([]uint16, error) { |
| 637 | nextInsAddress, err := symbolResolver(SYMBOL{NEXTINSTRUCTION}) |
| 638 | if err != nil { |
| 639 | return nil, err |
| 640 | } |
| 641 | |
| 642 | compositeInstructions := []Instruction{ |
| 643 | DATA{REG3, NUMBER{nextInsAddress}}, |
| 644 | JMP{c.Routine}, |
| 645 | } |
| 646 | |
| 647 | emitted := []uint16{} |
| 648 | for _, ins := range compositeInstructions { |
| 649 | if e, err := ins.Emit(labelResolver, symbolResolver); err == nil { |
| 650 | emitted = append(emitted, e...) |
| 651 | } else { |
| 652 | return nil, err |
| 653 | } |
| 654 | } |
| 655 | |
| 656 | return emitted, nil |
| 657 | } |
| 658 | |
| 659 | func (c CALL) String() string { |
| 660 | return fmt.Sprintf("CALL %s", c.Routine) |