⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 inasm68.c

📁 CC386 is a general-purpose 32-bit C compiler. It is not an optimizing compiler but given that the co
💻 C
📖 第 1 页 / 共 5 页
字号:
    needpunc(comma, 0);
    ap2 = asm_amode();
    if (!ap2)
        return (OCODE*) - 1;
    if (ap1->mode == am_immed)
    {
        if (ap2->mode != am_ccr && ap2->mode != am_sr)
            if (!vermode(ap2, TRUE, FALSE, TRUE, TRUE))
                return 0;
    }
    else
    {
        return (OCODE*) - 1;
    }
    return make_ocode(ap1, ap2, 0);
}

//-------------------------------------------------------------------------

static OCODE *ope_shift(void)
{
    AMODE *ap1,  *ap2;
    ap1 = asm_amode();
    if (!ap1)
        return (OCODE*) - 1;
    if (!theSize)
        theSize = 2;
    if (lastst == comma)
    {
        getsym();
        if (!intsize())
            return 0;
        ap2 = asm_amode();
        if (!ap2)
            return (OCODE*) - 1;
        if (ap2->mode != am_dreg || (ap1->mode != am_dreg && ap1->mode !=
            am_immed))
        {
            return (OCODE*) - 1;

        }
        return make_ocode(ap1, ap2, 0);

    }
    else
    {
        if (!vermode(ap1, FALSE, FALSE, FALSE, FALSE))
            return 0;
        if (theSize != 2 && theSize != 0)
            asm_err(ERR_AINVSIZE);
        return make_ocode(ap1, 0, 0);
    }
}

//-------------------------------------------------------------------------

static OCODE *ope_bra(void)
{
    ENODE *node = asm_ident();
    AMODE *ap1;
    if (!node)
        return (OCODE*) - 1;
    ap1 = xalloc(sizeof(AMODE));
    ap1->mode = am_direct;
    ap1->offset = node;
    return make_ocode(ap1, 0, 0);
}

//-------------------------------------------------------------------------

static OCODE *ope_bit(void)
{
    AMODE *ap1,  *ap2;
    ap1 = asm_amode();
    if (!ap1)
        return (OCODE*) - 1;
    if (!theSize)
        theSize = 2;
    needpunc(comma, 0);
    ap2 = asm_amode();
    if (!ap2)
        return (OCODE*) - 1;
    if (ap1->mode != am_dreg && ap1->mode != am_immed)
    {
        return (OCODE*) - 1;
    }
    else
        if (!vermode(ap2, TRUE, FALSE, FALSE, FALSE))
            return 0;

    if (ap2->mode == am_dreg)
        needsize(4);
    else
        needsize(1);
    return make_ocode(ap1, ap2, 0);

}

//-------------------------------------------------------------------------

static OCODE *ope_bf1(void)
{
    AMODE *ap1,  *ap2;
    if (!need_020())
        return 0;
    ap1 = asm_amode();
    if (!ap1)
        return (OCODE*) - 1;

    if (!vermode(ap1, TRUE, FALSE, FALSE, FALSE))
        return 0;
    if (!noincdec(ap1))
        return 0;
    ap2 = getbf();
    if (!ap2)
        return (OCODE*) - 1;
    if (theSize)
    {
        asm_err(ERR_AINVSIZE);
        return 0;
    }
    return make_ocode(ap1, ap2, 0);
}

//-------------------------------------------------------------------------

static OCODE *ope_bf2(void)
{
    AMODE *ap1,  *ap2,  *ap3;
    if (!need_020())
        return 0;
    needsize(0);
    ap1 = asm_amode();
    if (!ap1)
        return (OCODE*) - 1;
    if (!vermode(ap1, TRUE, FALSE, FALSE, FALSE))
        return 0;
    if (!noincdec(ap1))
        return 0;
    if (!(ap3 = getbf()))
        return (OCODE*) - 1;
    needpunc(comma, 0);
    ap2 = asm_amode();
    if (!dreg(ap2))
        return 0;
    if (theSize)
    {
        asm_err(ERR_AINVSIZE);
        return 0;
    }
    return make_ocode(ap1, ap3, ap2);
}

//-------------------------------------------------------------------------

static OCODE *ope_bf3(void)
{
    AMODE *ap1,  *ap2,  *ap3;
    if (!need_020())
        return 0;
    needsize(0);
    ap2 = asm_amode();
    if (!ap2)
        return (OCODE*) - 1;
    if (!dreg(ap2))
        return 0;
    needpunc(comma, 0);
    ap1 = asm_amode();
    if (!ap1)
        return (OCODE*) - 1;
    if (!vermode(ap1, TRUE, FALSE, FALSE, FALSE))
        return 0;
    if (!noincdec(ap1))
        return 0;
    if (!(ap3 = getbf()))
        return (OCODE*) - 1;
    if (theSize)
    {
        asm_err(ERR_AINVSIZE);
        return 0;
    }
    return make_ocode(ap2, ap1, ap3);
}

//-------------------------------------------------------------------------

static OCODE *ope_ead(void)
{
    AMODE *ap1,  *ap2;
    if (prm_68020)
    {
        if (!wordsize())
            return 0;
    }
    else
        if (!needsize(2))
            return 0;
    if (!theSize)
        theSize = 2;
    ap1 = asm_amode();
    if (!ap1)
        return (OCODE*) - 1;
    if (!vermode(ap1, TRUE, FALSE, TRUE, TRUE))
        return 0;
    needpunc(comma, 0);
    ap2 = asm_amode();
    if (!ap2)
        return (OCODE*) - 1;
    if (!dreg(ap2))
        return 0;
    return make_ocode(ap1, ap2, 0);
}

//-------------------------------------------------------------------------

static OCODE *ope_ear(void)
{
    AMODE *ap1,  *ap2;
    if (!need_020() || !intsize())
        return 0;
    if (!theSize)
        theSize = 4;
    ap1 = asm_amode();
    if (!ap1)
        return (OCODE*) - 1;
    if (!vermode(ap1, FALSE, FALSE, TRUE, FALSE))
        return 0;
    needpunc(comma, 0);
    ap2 = asm_amode();
    if (!ap2)
        return (OCODE*) - 1;
    if (ap2->mode != am_dreg && ap2->mode != am_areg)
    {
        return (OCODE*) - 1;
    }
    return make_ocode(ap1, ap2, 0);
}

//-------------------------------------------------------------------------

static OCODE *ope_ea(void)
{
    AMODE *ap1;
    if (!intsize())
        return 0;
    if (!theSize)
        theSize = 2;
    ap1 = asm_amode();
    if (!ap1)
        return (OCODE*) - 1;
    if (!vermode(ap1, TRUE, FALSE, FALSE, FALSE))
        return 0;
    return make_ocode(ap1, 0, 0);
}

//-------------------------------------------------------------------------

static OCODE *ope_jea(void)
{
    AMODE *ap1;
    if (!intsize())
        return 0;
    needsize(0);
    ap1 = asm_amode();
    if (!ap1)
        return (OCODE*) - 1;
    if (!vermode(ap1, FALSE, FALSE, TRUE, FALSE))
        return 0;
    if (ap1->mode == am_ainc || ap1->mode == am_adec)
    {
        asm_err(ERR_AINVINDXMODE);
        return 0;
    }
    return make_ocode(ap1, 0, 0);
}

//-------------------------------------------------------------------------

static OCODE *ope_cmp(void)
{
    AMODE *ap1,  *ap2;

    if (!intsize())
        return 0;
    if (!theSize)
        theSize = 2;
    ap1 = asm_amode();
    if (!ap1)
        return (OCODE*) - 1;
    if (!vermode(ap1, TRUE, TRUE, TRUE, TRUE))
        return 0;
    if (ap1->mode == am_areg)
        if (!wordsize())
            return 0;
    needpunc(comma, 0);
    ap2 = asm_amode();
    if (!ap2)
        return (OCODE*) - 1;
    if (!dreg(ap2))
        return 0;
    return make_ocode(ap1, ap2, 0);
}

//-------------------------------------------------------------------------

static OCODE *ope_eaa(void)
{
    AMODE *ap1,  *ap2;
    if (!wordsize())
        return 0;
    if (!theSize)
        theSize = 2;
    ap1 = asm_amode();
    if (!ap1)
        return (OCODE*) - 1;
    if (!vermode(ap1, TRUE, TRUE, TRUE, TRUE))
        return 0;
    needpunc(comma, 0);
    ap2 = asm_amode();
    if (!ap2)
        return (OCODE*) - 1;
    if (ap2->mode != am_areg)
    {
        return (OCODE*) - 1;
    }
    return make_ocode(ap1, ap2, 0);
}

//-------------------------------------------------------------------------

static OCODE *ope_tea(void)
{
    AMODE *ap1,  *ap2;
    if (!intsize())
        return 0;
    if (!theSize)
        theSize = 2;
    ap1 = asm_amode();
    if (!ap1)
        return (OCODE*) - 1;
    if (!vermode(ap1, TRUE, TRUE, TRUE, TRUE))
        return 0;
    return make_ocode(ap1, 0, 0);
}

//-------------------------------------------------------------------------

static OCODE *ope_lea(void)
{
    AMODE *ap1,  *ap2;
    if (!wordsize())
        return 0;
    if (!theSize)
        theSize = 2;
    ap1 = asm_amode();
    if (!ap1)
        return (OCODE*) - 1;
    if (!vermode(ap1, FALSE, FALSE, TRUE, FALSE))
        return 0;
    if (ap1->mode == am_ainc || ap1->mode == am_adec)
    {
        asm_err(ERR_AINVINDXMODE);
        return 0;
    }
    needpunc(comma, 0);
    ap2 = asm_amode();
    if (!ap2)
        return (OCODE*) - 1;
    if (ap2->mode != am_areg)
    {
        return (OCODE*) - 1;
    }
    return make_ocode(ap1, ap2, 0);
}

//-------------------------------------------------------------------------

static OCODE *ope_iea(void)
{
    AMODE *ap1,  *ap2;
    if (!intsize())
        return 0;
    if (!theSize)
        theSize = 2;
    ap2 = asm_amode();
    if (!ap2)
        return (OCODE*) - 1;
    if (ap2->mode != am_immed)
    {
        return (OCODE*) - 1;
    }
    needpunc(comma, 0);
    ap1 = asm_amode();
    if (!ap1)
        return (OCODE*) - 1;
    if (!vermode(ap1, TRUE, FALSE, TRUE, FALSE))
        return 0;
    return make_ocode(ap2, ap1, 0);
}

//-------------------------------------------------------------------------

static OCODE *ope_posbcd(void)
{
    AMODE *ap1,  *ap2;
    if (!intsize())
        return 0;
    if (!theSize)
        theSize = 2;
    ap1 = asm_amode();
    if (!ap1)
        return (OCODE*) - 1;
    if (ap1->mode != am_ainc)
    {
        return (OCODE*) - 1;
    }
    needpunc(comma, 0);
    ap2 = asm_amode();
    if (!ap2)
        return (OCODE*) - 1;
    if (ap2->mode != am_ainc)
    {
        return (OCODE*) - 1;
    }
    return make_ocode(ap1, ap2, 0);

}

//-------------------------------------------------------------------------

static OCODE *ope_dbr(void)
{
    AMODE *ap1,  *ap2;
    if (!wordsize())
        return 0;
    if (!need_dreg(&ap1))
        return 0;
    needpunc(comma, 0);
    ap2 = asm_amode();
    if (!ap2)
        return (OCODE*) - 1;
    if (ap2->mode != am_immed)
        return (OCODE*) - 1;
    if (ap2->offset->nodetype != en_nalabcon && ap2->offset->nodetype !=
        en_labcon)
        return (OCODE*) - 1;
    return make_ocode(ap1, ap2, 0);
}

//-------------------------------------------------------------------------

static OCODE *ope_div(void)
{
    AMODE *ap1,  *ap2,  *ap3;
    if (theSize == 4)
    {
        if (!need_020())
            return 0;
    }
    else
        if (!needsize(2))
            return 0;
    if (!theSize)
        theSize = 2;
    ap1 = asm_amode();
    if (!ap1)
        return (OCODE*) - 1;
    needpunc(comma, 0);
    if (!ap1)
        return 0;
    if (!vermode(ap1, TRUE, FALSE, TRUE, TRUE))
        return 0;
    ap2 = asm_amode();
    if (!ap2)
        return (OCODE*) - 1;
    if (ap2->mode != am_divsl && !dreg(ap2))
        return (OCODE*) - 1;
    if (ap2->mode == am_divsl)
    {
        if (!need_020())
            return 0;
        if (theSize == 2)
        {
            asm_err(ERR_AINVSIZE);
            return 0;
        }
    }
    return make_ocode(ap1, ap2, 0);

}

//-------------------------------------------------------------------------

static OCODE *ope_divl(void)
{
    AMODE *ap1,  *ap2,  *ap3;
    if (!need_020())
        return 0;
    if (!needsize(4))
        return 0;
    ap1 = asm_amode();
    if (!ap1)
        return (OCODE*) - 1;
    needpunc(comma, 0);
    if (!ap1)
        return 0;
    if (!vermode(ap1, TRUE, FALSE, TRUE, TRUE))
        return 0;
    ap2 = asm_amode();
    if (!ap2)
        return (OCODE*) - 1;
    if (ap2->mode != am_divsl)
        return (OCODE*) - 1;
    return make_ocode(ap1, ap2, 0);
}

//-------------------------------------------------------------------------

static OCODE *ope_eor(void)
{
    AMODE *ap1,  *ap2;
    if (!intsize())
        return 0;
    if (!theSize)
        theSize = 2;
    ap2 = asm_amode();
    if (!ap2)
        return (OCODE*) - 1;
    if (!dreg(ap2))
        return 0;
    needpunc(comma, 0);
    ap1 = asm_amode();
    if (!ap1)
        return (OCODE*) - 1;
    if (!vermode(ap1, TRUE, FALSE, FALSE, FALSE))
        return 0;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -