📄 opcodee.c
字号:
#include "cpudefs.h"
void op_e000(void) /* ASR */
{
ULONG srcreg = imm8_table[((opcode >> 9) & 7)];
ULONG dstreg = opcode & 7;
{{ ULONG cnt = srcreg;
{ BYTE data = regs.d[dstreg].D;
{ UBYTE val = data;
ULONG cmask = 0x80;
ULONG sign = cmask & val;
cnt &= 63;
CLEARFLGS;
if (!cnt) { CFLG = 0; } else {
if (cnt >= 8) {
val = sign ? 0xff : 0;
CFLG=regs.x= sign ? 1 : 0;
} else {
CFLG=regs.x=(val >> (cnt-1)) & 1;
val >>= cnt;
if (sign) val |= 0xff << (8 - cnt);
}}
regs.d[dstreg].B.l = val;
NFLG = sign != 0;
ZFLG = val == 0;
}}}}}
void op_e008(void) /* LSR */
{
ULONG srcreg = imm8_table[((opcode >> 9) & 7)];
ULONG dstreg = opcode & 7;
{{ ULONG cnt = srcreg;
{ BYTE data = regs.d[dstreg].D;
{ UBYTE val = data;
ULONG cmask = 0x80;
cnt &= 63;
if (!cnt) { CFLG = 0; } else {
if (cnt >= 8) {
CFLG=regs.x = cnt == 8 ? (val & cmask ? 1 : 0) : 0;
val = 0;
} else {
CFLG=regs.x=(val >> (cnt-1)) & 1;
val >>= cnt;
}}
regs.d[dstreg].B.l = val;
NFLG = (val & cmask) != 0; ZFLG = val == 0; VFLG = 0;
}}}}}
void op_e010(void) /* ROXR */
{
ULONG srcreg = imm8_table[((opcode >> 9) & 7)];
ULONG dstreg = opcode & 7;
{{ ULONG cnt = srcreg;
{ BYTE data = regs.d[dstreg].D;
{ UBYTE val = data;
ULONG cmask = 0x80;
ULONG carry;
cnt &= 63;
for(;cnt;--cnt){
carry=val&1; val >>= 1;
if(regs.x) val |= cmask;
regs.x = carry;
}
regs.d[dstreg].B.l = val;
CFLG = regs.x;
NFLG = (val & cmask) != 0; ZFLG = val == 0; VFLG = 0;
}}}}}
void op_e018(void) /* ROR */
{
ULONG srcreg = imm8_table[((opcode >> 9) & 7)];
ULONG dstreg = opcode & 7;
{{ ULONG cnt = srcreg;
{ BYTE data = regs.d[dstreg].D;
{ UBYTE val = data;
ULONG cmask = 0x80;
cnt &= 63;
if (!cnt) { CFLG = 0; } else { ULONG carry;
for(;cnt;--cnt){
carry=val&1; val = val >> 1;
if(carry) val |= cmask;
}
CFLG = carry;
}
NFLG = (val & cmask) != 0; ZFLG = val == 0; VFLG = 0;
regs.d[dstreg].B.l = val;
}}}}}
void op_e020(void) /* ASR */
{
ULONG srcreg = ((opcode >> 9) & 7);
ULONG dstreg = opcode & 7;
{{ BYTE cnt = regs.d[srcreg].D;
{ BYTE data = regs.d[dstreg].D;
{ UBYTE val = data;
ULONG cmask = 0x80;
ULONG sign = cmask & val;
cnt &= 63;
VFLG = 0;
if (!cnt) { CFLG = 0; } else {
if (cnt >= 8) {
val = sign ? 0xff : 0;
CFLG=regs.x= sign ? 1 : 0;
} else {
CFLG=regs.x=(val >> (cnt-1)) & 1;
val >>= cnt;
if (sign) val |= 0xff << (8 - cnt);
}}
regs.d[dstreg].B.l = val;
NFLG = sign != 0;
ZFLG = val == 0;
}}}}}
void op_e028(void) /* LSR */
{
ULONG srcreg = ((opcode >> 9) & 7);
ULONG dstreg = opcode & 7;
{{ BYTE cnt = regs.d[srcreg].D;
{ BYTE data = regs.d[dstreg].D;
{ UBYTE val = data;
ULONG cmask = 0x80;
cnt &= 63;
if (!cnt) { CFLG = 0; } else {
if (cnt >= 8) {
CFLG=regs.x = cnt == 8 ? (val & cmask ? 1 : 0) : 0;
val = 0;
} else {
CFLG=regs.x=(val >> (cnt-1)) & 1;
val >>= cnt;
}}
regs.d[dstreg].B.l = val;
NFLG = (val & cmask) != 0; ZFLG = val == 0; VFLG = 0;
}}}}}
void op_e030(void) /* ROXR */
{
ULONG srcreg = ((opcode >> 9) & 7);
ULONG dstreg = opcode & 7;
{{ BYTE cnt = regs.d[srcreg].D;
{ BYTE data = regs.d[dstreg].D;
{ UBYTE val = data;
ULONG cmask = 0x80;
ULONG carry;
cnt &= 63;
for(;cnt;--cnt){
carry=val&1; val >>= 1;
if(regs.x) val |= cmask;
regs.x = carry;
}
regs.d[dstreg].B.l = val;
CFLG = regs.x;
NFLG = (val & cmask) != 0; ZFLG = val == 0; VFLG = 0;
}}}}}
void op_e038(void) /* ROR */
{
ULONG srcreg = ((opcode >> 9) & 7);
ULONG dstreg = opcode & 7;
{{ BYTE cnt = regs.d[srcreg].D;
{ BYTE data = regs.d[dstreg].D;
{ UBYTE val = data;
ULONG cmask = 0x80;
cnt &= 63;
if (!cnt) { CFLG = 0; } else { ULONG carry;
for(;cnt;--cnt){
carry=val&1; val = val >> 1;
if(carry) val |= cmask;
}
CFLG = carry;
}
regs.d[dstreg].B.l = val;
NFLG = (val & cmask) != 0; ZFLG = val == 0; VFLG = 0;
}}}}}
void op_e040(void) /* ASR */
{
ULONG srcreg = imm8_table[((opcode >> 9) & 7)];
ULONG dstreg = opcode & 7;
{{ ULONG cnt = srcreg;
{ WORD data = regs.d[dstreg].D;
{ UWORD val = data;
ULONG cmask = 0x8000;
ULONG sign = cmask & val;
cnt &= 63;
CLEARFLGS;
if (!cnt) { CFLG = 0; } else {
if (cnt >= 16) {
val = sign ? 0xffff : 0;
CFLG=regs.x= sign ? 1 : 0;
} else {
CFLG=regs.x=(val >> (cnt-1)) & 1;
val >>= cnt;
if (sign) val |= 0xffff << (16 - cnt);
}}
regs.d[dstreg].W.l = val;
NFLG = sign != 0;
ZFLG = val == 0;
}}}}}
void op_e048(void) /* LSR */
{
ULONG srcreg = imm8_table[((opcode >> 9) & 7)];
ULONG dstreg = opcode & 7;
{{ ULONG cnt = srcreg;
{ WORD data = regs.d[dstreg].D;
{ UWORD val = data;
ULONG cmask = 0x8000;
CLEARFLGS;
cnt &= 63;
if (!cnt) { CFLG = 0; } else {
if (cnt >= 16) {
CFLG=regs.x = cnt == 16 ? (val & cmask ? 1 : 0) : 0;
val = 0;
} else {
CFLG=regs.x=(val >> (cnt-1)) & 1;
val >>= cnt;
}}
regs.d[dstreg].W.l = val;
NFLG = (val & cmask) != 0; ZFLG = val == 0;
}}}}}
void op_e050(void) /* ROXR */
{
ULONG srcreg = imm8_table[((opcode >> 9) & 7)];
ULONG dstreg = opcode & 7;
{{ ULONG cnt = srcreg;
{ WORD data = regs.d[dstreg].D;
{ UWORD val = data;
ULONG cmask = 0x8000;
ULONG carry;
cnt &= 63;
for(;cnt;--cnt){
carry=val&1; val >>= 1;
if(regs.x) val |= cmask;
regs.x = carry;
}
CFLG = regs.x;
NFLG = (val & cmask) != 0; ZFLG = val == 0; VFLG = 0;
regs.d[dstreg].W.l = val;
}}}}}
void op_e058(void) /* ROR */
{
ULONG srcreg = imm8_table[((opcode >> 9) & 7)];
ULONG dstreg = opcode & 7;
{{ ULONG cnt = srcreg;
{ WORD data = regs.d[dstreg].D;
{ UWORD val = data;
ULONG cmask = 0x8000;
cnt &= 63;
if (!cnt) { CFLG = 0; } else { ULONG carry;
for(;cnt;--cnt){
carry=val&1; val = val >> 1;
if(carry) val |= cmask;
}
CFLG = carry;
}
NFLG = (val & cmask) != 0; ZFLG = val == 0; VFLG = 0;
regs.d[dstreg].W.l = val;
}}}}}
void op_e060(void) /* ASR */
{
ULONG srcreg = ((opcode >> 9) & 7);
ULONG dstreg = opcode & 7;
{{ WORD cnt = regs.d[srcreg].D;
{ WORD data = regs.d[dstreg].D;
{ UWORD val = data;
ULONG cmask = 0x8000;
ULONG sign = cmask & val;
cnt &= 63;
VFLG = 0;
if (!cnt) { CFLG = 0; } else {
if (cnt >= 16) {
val = sign ? 0xffff : 0;
CFLG=regs.x= sign ? 1 : 0;
} else {
CFLG=regs.x=(val >> (cnt-1)) & 1;
val >>= cnt;
if (sign) val |= 0xffff << (16 - cnt);
}}
NFLG = sign != 0;
ZFLG = val == 0;
regs.d[dstreg].W.l = val;
}}}}}
void op_e068(void) /* LSR */
{
ULONG srcreg = ((opcode >> 9) & 7);
ULONG dstreg = opcode & 7;
{{ WORD cnt = regs.d[srcreg].D;
{ WORD data = regs.d[dstreg].D;
{ UWORD val = data;
ULONG cmask = 0x8000;
cnt &= 63;
if (!cnt) { CFLG = 0; } else {
if (cnt >= 16) {
CFLG=regs.x = cnt == 16 ? (val & cmask ? 1 : 0) : 0;
val = 0;
} else {
CFLG=regs.x=(val >> (cnt-1)) & 1;
val >>= cnt;
}}
NFLG = (val & cmask) != 0; ZFLG = val == 0; VFLG = 0;
regs.d[dstreg].W.l = val;
}}}}}
void op_e070(void) /* ROXR */
{
ULONG srcreg = ((opcode >> 9) & 7);
ULONG dstreg = opcode & 7;
{{ WORD cnt = regs.d[srcreg].D;
{ WORD data = regs.d[dstreg].D;
{ UWORD val = data;
ULONG cmask = 0x8000;
ULONG carry;
cnt &= 63;
for(;cnt;--cnt){
carry=val&1; val >>= 1;
if(regs.x) val |= cmask;
regs.x = carry;
}
CFLG = regs.x;
NFLG = (val & cmask) != 0; ZFLG = val == 0; VFLG = 0;
regs.d[dstreg].W.l = val;
}}}}}
void op_e078(void) /* ROR */
{
ULONG srcreg = ((opcode >> 9) & 7);
ULONG dstreg = opcode & 7;
{{ WORD cnt = regs.d[srcreg].D;
{ WORD data = regs.d[dstreg].D;
{ UWORD val = data;
ULONG cmask = 0x8000;
cnt &= 63;
if (!cnt) { CFLG = 0; } else { ULONG carry;
for(;cnt;--cnt){
carry=val&1; val = val >> 1;
if(carry) val |= cmask;
}
CFLG = carry;
}
NFLG = (val & cmask) != 0; ZFLG = val == 0; VFLG = 0;
regs.d[dstreg].W.l = val;
}}}}}
void op_e080(void) /* ASR */
{
ULONG srcreg = imm8_table[((opcode >> 9) & 7)];
ULONG dstreg = opcode & 7;
{{ ULONG cnt = srcreg;
{ LONG data = regs.d[dstreg].D;
{ ULONG val = data;
ULONG cmask = 0x80000000;
ULONG sign = cmask & val;
cnt &= 63;
VFLG = 0;
if (!cnt) { CFLG = 0; } else {
if (cnt >= 32) {
val = sign ? 0xffffffff : 0;
CFLG=regs.x= sign ? 1 : 0;
} else {
CFLG=regs.x=(val >> (cnt-1)) & 1;
val >>= cnt;
if (sign) val |= 0xffffffff << (32 - cnt);
}}
NFLG = sign != 0;
ZFLG = val == 0;
regs.d[dstreg].D = (val);
}}}}}
void op_e088(void) /* LSR */
{
ULONG srcreg = imm8_table[((opcode >> 9) & 7)];
ULONG dstreg = opcode & 7;
{{ ULONG cnt = srcreg;
{ LONG data = regs.d[dstreg].D;
{ ULONG val = data;
ULONG cmask = 0x80000000;
cnt &= 63;
if (!cnt) { CFLG = 0; } else {
if (cnt >= 32) {
CFLG=regs.x = cnt == 32 ? (val & cmask ? 1 : 0) : 0;
val = 0;
} else {
CFLG=regs.x=(val >> (cnt-1)) & 1;
val >>= cnt;
}}
NFLG = (val & cmask) != 0; ZFLG = val == 0; VFLG = 0;
regs.d[dstreg].D = (val);
}}}}}
void op_e090(void) /* ROXR */
{
ULONG srcreg = imm8_table[((opcode >> 9) & 7)];
ULONG dstreg = opcode & 7;
{{ ULONG cnt = srcreg;
{ LONG data = regs.d[dstreg].D;
{ ULONG val = data;
ULONG cmask = 0x80000000;
ULONG carry;
cnt &= 63;
for(;cnt;--cnt){
carry=val&1; val >>= 1;
if(regs.x) val |= cmask;
regs.x = carry;
}
CFLG = regs.x;
NFLG = (val & cmask) != 0; ZFLG = val == 0; VFLG = 0;
regs.d[dstreg].D = (val);
}}}}}
void op_e098(void) /* ROR */
{
ULONG srcreg = imm8_table[((opcode >> 9) & 7)];
ULONG dstreg = opcode & 7;
{{ ULONG cnt = srcreg;
{ LONG data = regs.d[dstreg].D;
{ ULONG val = data;
ULONG cmask = 0x80000000;
cnt &= 63;
if (!cnt) { CFLG = 0; } else { ULONG carry;
for(;cnt;--cnt){
carry=val&1; val = val >> 1;
if(carry) val |= cmask;
}
CFLG = carry;
}
NFLG = (val & cmask) != 0; ZFLG = val == 0; VFLG = 0;
regs.d[dstreg].D = (val);
}}}}}
void op_e0a0(void) /* ASR */
{
ULONG srcreg = ((opcode >> 9) & 7);
ULONG dstreg = opcode & 7;
{{ LONG cnt = regs.d[srcreg].D;
{ LONG data = regs.d[dstreg].D;
{ ULONG val = data;
ULONG cmask = 0x80000000;
ULONG sign = cmask & val;
cnt &= 63;
VFLG = 0;
if (!cnt) { CFLG = 0; } else {
if (cnt >= 32) {
val = sign ? 0xffffffff : 0;
CFLG=regs.x= sign ? 1 : 0;
} else {
CFLG=regs.x=(val >> (cnt-1)) & 1;
val >>= cnt;
if (sign) val |= 0xffffffff << (32 - cnt);
}}
NFLG = sign != 0;
ZFLG = val == 0;
regs.d[dstreg].D = (val);
}}}}}
void op_e0a8(void) /* LSR */
{
ULONG srcreg = ((opcode >> 9) & 7);
ULONG dstreg = opcode & 7;
{{ LONG cnt = regs.d[srcreg].D;
{ LONG data = regs.d[dstreg].D;
{ ULONG val = data;
ULONG cmask = 0x80000000;
cnt &= 63;
if (!cnt) { CFLG = 0; } else {
if (cnt >= 32) {
CFLG=regs.x = cnt == 32 ? (val & cmask ? 1 : 0) : 0;
val = 0;
} else {
CFLG=regs.x=(val >> (cnt-1)) & 1;
val >>= cnt;
}}
NFLG = (val & cmask) != 0; ZFLG = val == 0; VFLG = 0;
regs.d[dstreg].D = (val);
}}}}}
void op_e0b0(void) /* ROXR */
{
ULONG srcreg = ((opcode >> 9) & 7);
ULONG dstreg = opcode & 7;
{{ LONG cnt = regs.d[srcreg].D;
{ LONG data = regs.d[dstreg].D;
{ ULONG val = data;
ULONG cmask = 0x80000000;
ULONG carry;
cnt &= 63;
for(;cnt;--cnt){
carry=val&1; val >>= 1;
if(regs.x) val |= cmask;
regs.x = carry;
}
CFLG = regs.x;
NFLG = (val & cmask) != 0; ZFLG = val == 0; VFLG = 0;
regs.d[dstreg].D = (val);
}}}}}
void op_e0b8(void) /* ROR */
{
ULONG srcreg = ((opcode >> 9) & 7);
ULONG dstreg = opcode & 7;
{{ LONG cnt = regs.d[srcreg].D;
{ LONG data = regs.d[dstreg].D;
{ ULONG val = data;
ULONG cmask = 0x80000000;
cnt &= 63;
if (!cnt) { CFLG = 0; } else { ULONG carry;
for(;cnt;--cnt){
carry=val&1; val = val >> 1;
if(carry) val |= cmask;
}
CFLG = carry;
}
NFLG = (val & cmask) != 0; ZFLG = val == 0; VFLG = 0;
regs.d[dstreg].D = (val);
}}}}}
void op_e0d0(void) /* ASRW */
{
ULONG srcreg = (opcode & 7);
{{ CPTR dataa = regs.a[srcreg];
WORD data = get_word(dataa);
VFLG = 0;
{ UWORD val = data;
ULONG cmask = 0x8000;
ULONG sign = cmask & val;
CFLG=regs.x=val&1; val = (val >> 1) | sign;
NFLG = sign != 0;
ZFLG = val == 0;
put_word(dataa,val);
}}}}
void op_e0d8(void) /* ASRW */
{
ULONG srcreg = (opcode & 7);
{{ CPTR dataa = regs.a[srcreg];
WORD data = get_word(dataa);
{ regs.a[srcreg] += 2;
VFLG = 0;
{ UWORD val = data;
ULONG cmask = 0x8000;
ULONG sign = cmask & val;
CFLG=regs.x=val&1; val = (val >> 1) | sign;
NFLG = sign != 0;
ZFLG = val == 0;
put_word(dataa,val);
}}}}}
void op_e0e0(void) /* ASRW */
{
ULONG srcreg = (opcode & 7);
{{ regs.a[srcreg] -= 2;
{ CPTR dataa = regs.a[srcreg];
WORD data = get_word(dataa);
VFLG = 0;
{ UWORD val = data;
ULONG cmask = 0x8000;
ULONG sign = cmask & val;
CFLG=regs.x=val&1; val = (val >> 1) | sign;
NFLG = sign != 0;
ZFLG = val == 0;
put_word(dataa,val);
}}}}}
void op_e0e8(void) /* ASRW */
{
ULONG srcreg = (opcode & 7);
{{ CPTR dataa = regs.a[srcreg] + (LONG)(WORD)nextiword();
WORD data = get_word(dataa);
VFLG = 0;
{ UWORD val = data;
ULONG cmask = 0x8000;
ULONG sign = cmask & val;
CFLG=regs.x=val&1; val = (val >> 1) | sign;
NFLG = sign != 0;
ZFLG = val == 0;
put_word(dataa,val);
}}}}
void op_e0f0(void) /* ASRW */
{
ULONG srcreg = (opcode & 7);
{{ CPTR dataa = get_disp_ea(regs.a[srcreg]);
{ WORD data = get_word(dataa);
VFLG = 0;
{ UWORD val = data;
ULONG cmask = 0x8000;
ULONG sign = cmask & val;
CFLG=regs.x=val&1; val = (val >> 1) | sign;
NFLG = sign != 0;
ZFLG = val == 0;
put_word(dataa,val);
}}}}}
void op_e0f8(void) /* ASRW */
{
{{ CPTR dataa = (LONG)(WORD)nextiword();
WORD data = get_word(dataa);
VFLG = 0;
{ UWORD val = data;
ULONG cmask = 0x8000;
ULONG sign = cmask & val;
CFLG=regs.x=val&1; val = (val >> 1) | sign;
NFLG = sign != 0;
ZFLG = val == 0;
put_word(dataa,val);
}}}}
void op_e0f9(void) /* ASRW */
{
{{ CPTR dataa = nextilong();
WORD data = get_word(dataa);
VFLG = 0;
{ UWORD val = data;
ULONG cmask = 0x8000;
ULONG sign = cmask & val;
CFLG=regs.x=val&1; val = (val >> 1) | sign;
NFLG = sign != 0;
ZFLG = val == 0;
put_word(dataa,val);
}}}}
void op_e100(void) /* ASL */
{
ULONG srcreg = imm8_table[((opcode >> 9) & 7)];
ULONG dstreg = opcode & 7;
{{ ULONG cnt = srcreg;
{ BYTE data = regs.d[dstreg].D;
{ UBYTE val = data;
ULONG cmask = 0x80;
cnt &= 63;
VFLG = 0;
if (!cnt) { CFLG = 0; } else {
if (cnt >= 8) {
VFLG = val != 0;
CFLG=regs.x = cnt == 8 ? val & 1 : 0;
val = 0;
} else {
ULONG mask = aslmask_ubyte[cnt];
CFLG=regs.x=(val << (cnt-1)) & cmask ? 1 : 0;
VFLG = (val & mask) != mask && (val & mask) != 0;
val <<= cnt;
}}
NFLG = (val&cmask) != 0;
ZFLG = val == 0;
regs.d[dstreg].B.l = val;
}}}}}
void op_e108(void) /* LSL */
{
ULONG srcreg = imm8_table[((opcode >> 9) & 7)];
ULONG dstreg = opcode & 7;
{{ ULONG cnt = srcreg;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -