📄 inasm68.c
字号:
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 + -