コード例 #1
0
ファイル: asm.go プロジェクト: DanB91/dcpu
func (a *assembler) buildBlockOperand(argv *[]cpu.Word, symbols *[]parser.Node, node parser.Node) (cpu.Word, error) {
	switch tt := node.(type) {
	case *parser.Name:
		if reg, ok := registers[tt.Data]; ok {
			if reg <= 0x7 {
				return reg + 0x10, nil
			}

			if reg == 0x1b {
				return 0x1a, nil
			}

			return 0, NewBuildError(
				a.ast.Files[tt.File()], tt.Line(), tt.Col(),
				"Illegal use of register %q.", tt.Data,
			)
		}

		if addr, ok := a.labels[tt.Data]; ok {
			*symbols = append(*symbols, tt)
			*argv = append(*argv, addr)
			return 0, nil
		}

		a.refs[cpu.Word(len(a.code)+1+len(*argv))] = tt
		*symbols = append(*symbols, tt)
		*argv = append(*argv, 0)
		return 0, nil

	case parser.NumericNode:
		num, err := tt.Parse()
		if err != nil {
			return 0, err
		}

		*symbols = append(*symbols, tt)
		*argv = append(*argv, num)
		return 0, nil
	}

	return 0, NewBuildError(
		a.ast.Files[node.File()], node.Line(), node.Col(),
		"Unexpected node %T. Want Name or Number.", node,
	)
}