# -*- coding: utf-8 -*-

from amoco.arch.core import Formatter


def mnemo(i):
    return i.mnemonic.lower().ljust(8, " ")


def op0(i):
    return str(i.operands[0])


def rel0(i):
    return "*%s" % i.misc["to"]


def op1(i):
    return ", " + str(i.operands[1])


def dest1(i):
    return ", %s" % str(i.dst)


def bitb(i):
    return ", %d" % i.operands[1]


def accessbank(i):
    return ", BANKED" if i.a == 1 else ", ACCESS"


def adr(i):
    x = str(i.operands[0])
    return x + ", fast" if i.misc["fast"] is True else x


def tblrw(i):
    m = i.mnemonic.lower()
    if i.misc["postinc"]:
        return m + "*+"
    elif i.misc["postdec"]:
        return m + "*-"
    elif i.misc["preinc"]:
        return m + "+*"
    return m


format_byte = [mnemo, op0, dest1, accessbank]
format_bit = [mnemo, op0, bitb, accessbank]
format_imm = [mnemo, op0]
format_rel = [mnemo, rel0]
format_call = [mnemo, adr]

PIC_full_formats = {
    "byte_oriented": format_byte,
    "bit_oriented": format_bit,
    "control": format_imm,
    "control_rel": format_rel,
    "noop": [mnemo],
    "tblrw": [tblrw],
    "literal": format_imm,
    "LFSR": [mnemo, op0, op1],
    "decode_movff": [mnemo, op0, op1],
    "CALL": format_call,
    "MOVWF": [mnemo, op0, accessbank],
    "CLRF": [mnemo, op0, accessbank],
    "MULWF": [mnemo, op0, accessbank],
}

PIC_full = Formatter(PIC_full_formats)
