MAME:MC68000 Register* A 更换所有下标取值,改为直接指针运算解引用
This commit is contained in:
parent
7ecd7d45a0
commit
79ada55c3c
@ -64,10 +64,10 @@ namespace cpu.m68000
|
||||
int dstReg = ((op >> 9) & 0x07);
|
||||
int srcMode = ((op >> 3) & 0x07);
|
||||
int srcReg = (op & 0x07);
|
||||
|
||||
Register* A_dstReg = A + dstReg;
|
||||
if (size == 3) // Word
|
||||
{
|
||||
A[dstReg].s32 = ReadValueW(srcMode, srcReg);
|
||||
A_dstReg->s32 = ReadValueW(srcMode, srcReg);
|
||||
switch (srcMode)
|
||||
{
|
||||
case 0: pendingCycles -= 4; break;
|
||||
@ -92,7 +92,7 @@ namespace cpu.m68000
|
||||
}
|
||||
else
|
||||
{ // Long
|
||||
A[dstReg].s32 = ReadValueL(srcMode, srcReg);
|
||||
A_dstReg->s32 = ReadValueL(srcMode, srcReg);
|
||||
switch (srcMode)
|
||||
{
|
||||
case 0: pendingCycles -= 4; break;
|
||||
@ -124,17 +124,18 @@ namespace cpu.m68000
|
||||
int dir = ((op >> 7) & 0x01);
|
||||
int size = ((op >> 6) & 0x01);
|
||||
int aReg = (op & 0x07);
|
||||
Register* A_ptr_aReg = A + aReg;
|
||||
if (dir == 0 && size == 0)
|
||||
{
|
||||
int ea;
|
||||
ea = A[aReg].s32 + ReadOpWord(PC); PC += 2;
|
||||
ea = A_ptr_aReg->s32 + ReadOpWord(PC); PC += 2;
|
||||
D[dReg].u32 = (D[dReg].u32 & 0xffff0000) | (ushort)(((byte)ReadByte(ea) << 8) + (byte)ReadByte(ea + 2));
|
||||
pendingCycles -= 16;
|
||||
}
|
||||
else if (dir == 0 && size == 1)
|
||||
{
|
||||
int ea;
|
||||
ea = A[aReg].s32 + ReadOpWord(PC); PC += 2;
|
||||
ea = A_ptr_aReg->s32 + ReadOpWord(PC); PC += 2;
|
||||
D[dReg].u32 = (uint)(((byte)ReadByte(ea) << 24) + ((byte)ReadByte(ea + 2) << 16) + ((byte)ReadByte(ea + 4) << 8) + (byte)ReadByte(ea + 6));
|
||||
pendingCycles -= 24;
|
||||
}
|
||||
@ -142,7 +143,7 @@ namespace cpu.m68000
|
||||
{
|
||||
uint src;
|
||||
int ea;
|
||||
ea = A[aReg].s32 + ReadOpWord(PC); PC += 2;
|
||||
ea = A_ptr_aReg->s32 + ReadOpWord(PC); PC += 2;
|
||||
src = D[dReg].u32;
|
||||
WriteByte(ea, (sbyte)((src >> 8) & 0xff));
|
||||
WriteByte(ea + 2, (sbyte)(src & 0xff));
|
||||
@ -152,7 +153,7 @@ namespace cpu.m68000
|
||||
{
|
||||
uint src;
|
||||
int ea;
|
||||
ea = A[aReg].s32 + ReadOpWord(PC); PC += 2;
|
||||
ea = A_ptr_aReg->s32 + ReadOpWord(PC); PC += 2;
|
||||
src = D[dReg].u32;
|
||||
WriteByte(ea, (sbyte)((src >> 24) & 0xff));
|
||||
WriteByte(ea + 2, (sbyte)((src >> 16) & 0xff));
|
||||
@ -240,6 +241,7 @@ namespace cpu.m68000
|
||||
int address = ReadAddress(dstMode, dstReg);
|
||||
int regCount = 0;
|
||||
|
||||
Register* A_dstReg = A + dstReg;
|
||||
if (size == 0)
|
||||
{
|
||||
// word-assign
|
||||
@ -250,7 +252,7 @@ namespace cpu.m68000
|
||||
if ((registers & 1) == 1)
|
||||
{
|
||||
address -= 2;
|
||||
WriteWord(address, A[i].s16);
|
||||
WriteWord(address, (A + i)->s16);
|
||||
regCount++;
|
||||
}
|
||||
registers >>= 1;
|
||||
@ -265,7 +267,7 @@ namespace cpu.m68000
|
||||
}
|
||||
registers >>= 1;
|
||||
}
|
||||
A[dstReg].s32 = address;
|
||||
A_dstReg->s32 = address;
|
||||
}
|
||||
else
|
||||
{ // increment address
|
||||
@ -283,7 +285,7 @@ namespace cpu.m68000
|
||||
{
|
||||
if ((registers & 1) == 1)
|
||||
{
|
||||
WriteWord(address, A[i].s16);
|
||||
WriteWord(address, (A + i)->s16);
|
||||
address += 2;
|
||||
regCount++;
|
||||
}
|
||||
@ -302,7 +304,7 @@ namespace cpu.m68000
|
||||
if ((registers & 1) == 1)
|
||||
{
|
||||
address -= 4;
|
||||
WriteLong(address, A[i].s32);
|
||||
WriteLong(address, (A + i)->s32);
|
||||
regCount++;
|
||||
}
|
||||
registers >>= 1;
|
||||
@ -317,7 +319,7 @@ namespace cpu.m68000
|
||||
}
|
||||
registers >>= 1;
|
||||
}
|
||||
A[dstReg].s32 = address;
|
||||
A_dstReg->s32 = address;
|
||||
}
|
||||
else
|
||||
{ // increment address
|
||||
@ -335,7 +337,7 @@ namespace cpu.m68000
|
||||
{
|
||||
if ((registers & 1) == 1)
|
||||
{
|
||||
WriteLong(address, A[i].s32);
|
||||
WriteLong(address, (A + i)->s32);
|
||||
address += 4;
|
||||
regCount++;
|
||||
}
|
||||
@ -400,11 +402,11 @@ namespace cpu.m68000
|
||||
{
|
||||
if (srcMode == 7 && (srcReg == 2 || srcReg == 3))
|
||||
{
|
||||
A[i].s32 = ReadPcrelWord(address);
|
||||
(A + i)->s32 = ReadPcrelWord(address);
|
||||
}
|
||||
else
|
||||
{
|
||||
A[i].s32 = ReadWord(address);
|
||||
(A + i)->s32 = ReadWord(address);
|
||||
}
|
||||
address += 2;
|
||||
regCount++;
|
||||
@ -413,7 +415,7 @@ namespace cpu.m68000
|
||||
}
|
||||
pendingCycles -= regCount * 4;
|
||||
if (srcMode == 3)
|
||||
A[srcReg].s32 = address;
|
||||
(A + srcReg)->s32 = address;
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -441,11 +443,11 @@ namespace cpu.m68000
|
||||
{
|
||||
if (srcMode == 7 && (srcReg == 2 || srcReg == 3))
|
||||
{
|
||||
A[i].s32 = ReadPcrelLong(address);
|
||||
(A + i)->s32 = ReadPcrelLong(address);
|
||||
}
|
||||
else
|
||||
{
|
||||
A[i].s32 = ReadLong(address);
|
||||
(A + i)->s32 = ReadLong(address);
|
||||
}
|
||||
address += 4;
|
||||
regCount++;
|
||||
@ -454,7 +456,7 @@ namespace cpu.m68000
|
||||
}
|
||||
pendingCycles -= regCount * 8;
|
||||
if (srcMode == 3)
|
||||
A[srcReg].s32 = address;
|
||||
(A + srcReg)->s32 = address;
|
||||
}
|
||||
|
||||
switch (srcMode)
|
||||
@ -482,7 +484,7 @@ namespace cpu.m68000
|
||||
int sReg = (op >> 0) & 7;
|
||||
int dReg = (op >> 9) & 7;
|
||||
|
||||
A[dReg].u32 = (uint)ReadAddress(mode, sReg);
|
||||
(A + dReg)->u32 = (uint)ReadAddress(mode, sReg);
|
||||
switch (mode)
|
||||
{
|
||||
case 2: pendingCycles -= 4; break;
|
||||
|
||||
@ -253,16 +253,17 @@ namespace cpu.m68000
|
||||
int mode = (op >> 3) & 7;
|
||||
int reg = (op >> 0) & 7;
|
||||
|
||||
Register* A_ptr_aReg = A + aReg;
|
||||
if (size == 0) // word
|
||||
{
|
||||
int value = ReadValueW(mode, reg);
|
||||
A[aReg].s32 += value;
|
||||
A_ptr_aReg->s32 += value;
|
||||
pendingCycles -= 8 + EACyclesBW[mode, reg];
|
||||
}
|
||||
else
|
||||
{ // long
|
||||
int value = ReadValueL(mode, reg);
|
||||
A[aReg].s32 += value;
|
||||
A_ptr_aReg->s32 += value;
|
||||
if (mode == 0 || mode == 1 || (mode == 7 && reg == 4))
|
||||
pendingCycles -= 8 + EACyclesL[mode, reg];
|
||||
else
|
||||
@ -514,16 +515,17 @@ namespace cpu.m68000
|
||||
int mode = (op >> 3) & 7;
|
||||
int reg = (op >> 0) & 7;
|
||||
|
||||
Register* A_ptr_aReg = A + aReg;
|
||||
if (size == 0) // word
|
||||
{
|
||||
int value = ReadValueW(mode, reg);
|
||||
A[aReg].s32 -= value;
|
||||
A_ptr_aReg->s32 -= value;
|
||||
pendingCycles -= 8 + EACyclesBW[mode, reg];
|
||||
}
|
||||
else
|
||||
{ // long
|
||||
int value = ReadValueL(mode, reg);
|
||||
A[aReg].s32 -= value;
|
||||
A_ptr_aReg->s32 -= value;
|
||||
if (mode == 0 || mode == 1 || (mode == 7 && reg == 4))
|
||||
pendingCycles -= 8 + EACyclesL[mode, reg];
|
||||
else
|
||||
@ -775,25 +777,27 @@ namespace cpu.m68000
|
||||
{
|
||||
int dstReg = (op >> 9) & 0x07;
|
||||
int srcReg = op & 0x07;
|
||||
Register* A_srcReg = A + srcReg;
|
||||
Register* A_dstReg = A + dstReg;
|
||||
uint src, dst, res;
|
||||
if (srcReg == 7)
|
||||
{
|
||||
A[srcReg].u32 -= 2;
|
||||
A_srcReg->u32 -= 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
A[srcReg].u32--;
|
||||
A_srcReg->u32--;
|
||||
}
|
||||
if (dstReg == 7)
|
||||
{
|
||||
A[dstReg].u32 -= 2;
|
||||
A_dstReg->u32 -= 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
A[dstReg].u32--;
|
||||
A_dstReg->u32--;
|
||||
}
|
||||
src = (uint)ReadByte(A[srcReg].s32);
|
||||
dst = (uint)ReadByte(A[dstReg].s32);
|
||||
src = (uint)ReadByte(A_srcReg->s32);
|
||||
dst = (uint)ReadByte(A_dstReg->s32);
|
||||
res = (uint)((dst & 0x0f) - (src & 0x0f) - (X ? 1 : 0));
|
||||
V = false;
|
||||
if (res > 9)
|
||||
@ -813,7 +817,7 @@ namespace cpu.m68000
|
||||
}
|
||||
res = res & 0xff;
|
||||
Z &= (res == 0);
|
||||
WriteByte(A[dstReg].s32, (sbyte)res);
|
||||
WriteByte(A_dstReg->s32, (sbyte)res);
|
||||
pendingCycles -= 18;
|
||||
}
|
||||
|
||||
@ -850,25 +854,27 @@ namespace cpu.m68000
|
||||
{
|
||||
int dstReg = (op >> 9) & 0x07;
|
||||
int srcReg = op & 0x07;
|
||||
Register* A_srcReg = A + srcReg;
|
||||
Register* A_dstReg = A + dstReg;
|
||||
uint src, dst, res;
|
||||
if (srcReg == 7)
|
||||
{
|
||||
A[srcReg].u32 -= 2;
|
||||
A_srcReg->u32 -= 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
A[srcReg].u32--;
|
||||
A_srcReg->u32--;
|
||||
}
|
||||
if (dstReg == 7)
|
||||
{
|
||||
A[dstReg].u32 -= 2;
|
||||
A_dstReg->u32 -= 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
A[dstReg].u32--;
|
||||
A_dstReg->u32--;
|
||||
}
|
||||
src = (uint)ReadByte(A[srcReg].s32);
|
||||
dst = (uint)ReadByte(A[dstReg].s32);
|
||||
src = (uint)ReadByte(A_srcReg->s32);
|
||||
dst = (uint)ReadByte(A_dstReg->s32);
|
||||
res = (uint)((src & 0x0f) + (dst & 0x0f) + (X ? 1 : 0));
|
||||
V = (((~res) & 0x80) != 0);
|
||||
if (res > 9)
|
||||
@ -885,7 +891,7 @@ namespace cpu.m68000
|
||||
N = ((res & 0x80) != 0);
|
||||
res = res & 0xff;
|
||||
Z &= (res == 0);
|
||||
WriteByte(A[dstReg].s32, (sbyte)res);
|
||||
WriteByte(A_dstReg->s32, (sbyte)res);
|
||||
pendingCycles -= 18;
|
||||
}
|
||||
|
||||
@ -907,9 +913,11 @@ namespace cpu.m68000
|
||||
int reg_a = (op >> 9) & 0x07;
|
||||
int reg_b = op & 0x07;
|
||||
uint tmp;
|
||||
tmp = A[reg_a].u32;
|
||||
A[reg_a].u32 = A[reg_b].u32;
|
||||
A[reg_b].u32 = tmp;
|
||||
Register* A_ptr_reg_a = A + reg_a;
|
||||
Register* A_ptr_reg_b = A + reg_b;
|
||||
tmp = A_ptr_reg_a->u32;
|
||||
A_ptr_reg_a->u32 = A_ptr_reg_b->u32;
|
||||
A_ptr_reg_b->u32 = tmp;
|
||||
pendingCycles -= 6;
|
||||
}
|
||||
|
||||
@ -918,10 +926,11 @@ namespace cpu.m68000
|
||||
{
|
||||
int reg_a = (op >> 9) & 0x07;
|
||||
int reg_b = op & 0x07;
|
||||
Register* A_ptr_reg_b = A + reg_b;
|
||||
uint tmp;
|
||||
tmp = D[reg_a].u32;
|
||||
D[reg_a].u32 = A[reg_b].u32;
|
||||
A[reg_b].u32 = tmp;
|
||||
D[reg_a].u32 = A_ptr_reg_b->u32;
|
||||
A_ptr_reg_b->u32 = tmp;
|
||||
pendingCycles -= 6;
|
||||
}
|
||||
|
||||
@ -986,28 +995,30 @@ namespace cpu.m68000
|
||||
int dstReg = (op >> 9) & 0x07;
|
||||
int size = (op >> 6) & 0x03;
|
||||
int srcReg = op & 0x07;
|
||||
Register* A_srcReg = A + srcReg;
|
||||
Register* A_dstReg = A + dstReg;
|
||||
switch (size)
|
||||
{
|
||||
case 0:
|
||||
{
|
||||
if (srcReg == 7)
|
||||
{
|
||||
A[srcReg].u32 -= 2;
|
||||
A_srcReg->u32 -= 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
A[srcReg].u32--;
|
||||
A_srcReg->u32--;
|
||||
}
|
||||
if (dstReg == 7)
|
||||
{
|
||||
A[dstReg].u32 -= 2;
|
||||
A_dstReg->u32 -= 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
A[dstReg].u32--;
|
||||
A_dstReg->u32--;
|
||||
}
|
||||
uint src = (uint)ReadByte(A[srcReg].s32);
|
||||
uint dst = (uint)ReadByte(A[dstReg].s32);
|
||||
uint src = (uint)ReadByte(A_srcReg->s32);
|
||||
uint dst = (uint)ReadByte(A_dstReg->s32);
|
||||
uint res;
|
||||
res = (uint)(dst + src + (X ? 1 : 0));
|
||||
N = ((res & 0x80) != 0);
|
||||
@ -1015,16 +1026,16 @@ namespace cpu.m68000
|
||||
X = C = ((res & 0x100) != 0);
|
||||
res = res & 0xff;
|
||||
Z &= (res == 0);
|
||||
WriteByte(A[dstReg].s32, (sbyte)res);
|
||||
WriteByte(A_dstReg->s32, (sbyte)res);
|
||||
pendingCycles -= 18;
|
||||
return;
|
||||
}
|
||||
case 1:
|
||||
{
|
||||
A[srcReg].u32 -= 2;
|
||||
uint src = (uint)ReadWord(A[srcReg].s32);
|
||||
A[dstReg].u32 -= 2;
|
||||
uint dst = (uint)ReadWord(A[dstReg].s32);
|
||||
A_srcReg->u32 -= 2;
|
||||
uint src = (uint)ReadWord(A_srcReg->s32);
|
||||
A_dstReg->u32 -= 2;
|
||||
uint dst = (uint)ReadWord(A_dstReg->s32);
|
||||
uint res;
|
||||
res = (uint)(dst + src + (X ? 1 : 0));
|
||||
N = ((res & 0x8000) != 0);
|
||||
@ -1032,23 +1043,23 @@ namespace cpu.m68000
|
||||
X = C = ((res & 0x10000) != 0);
|
||||
res = res & 0xffff;
|
||||
Z &= (res == 0);
|
||||
WriteWord(A[dstReg].s32, (short)res);
|
||||
WriteWord(A_dstReg->s32, (short)res);
|
||||
pendingCycles -= 18;
|
||||
return;
|
||||
}
|
||||
case 2:
|
||||
{
|
||||
A[srcReg].u32 -= 4;
|
||||
uint src = (uint)ReadLong(A[srcReg].s32);
|
||||
A[dstReg].u32 -= 4;
|
||||
uint dst = (uint)ReadWord(A[dstReg].s32);
|
||||
A_srcReg->u32 -= 4;
|
||||
uint src = (uint)ReadLong(A_srcReg->s32);
|
||||
A_dstReg->u32 -= 4;
|
||||
uint dst = (uint)ReadWord(A_dstReg->s32);
|
||||
uint res;
|
||||
res = (uint)(dst + src + (X ? 1 : 0));
|
||||
N = ((res & 0x80000000) != 0);
|
||||
V = (((((src ^ res) & (dst ^ res)) >> 24) & 0x80) != 0);
|
||||
X = C = (((((src & dst) | (~res & (src | dst))) >> 23) & 0x100) != 0);
|
||||
Z &= (res == 0);
|
||||
WriteLong(A[dstReg].s32, (int)res);
|
||||
WriteLong(A_dstReg->s32, (int)res);
|
||||
pendingCycles -= 30;
|
||||
return;
|
||||
}
|
||||
@ -1116,28 +1127,30 @@ namespace cpu.m68000
|
||||
int dstReg = (op >> 9) & 0x07;
|
||||
int size = (op >> 6) & 0x03;
|
||||
int srcReg = op & 0x07;
|
||||
Register* A_srcReg = A + srcReg;
|
||||
Register* A_dstReg = A + dstReg;
|
||||
switch (size)
|
||||
{
|
||||
case 0:
|
||||
{
|
||||
if (srcReg == 7)
|
||||
{
|
||||
A[srcReg].u32 -= 2;
|
||||
A_srcReg->u32 -= 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
A[srcReg].u32--;
|
||||
A_srcReg->u32--;
|
||||
}
|
||||
if (dstReg == 7)
|
||||
{
|
||||
A[dstReg].u32 -= 2;
|
||||
A_dstReg->u32 -= 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
A[dstReg].u32--;
|
||||
A_dstReg->u32--;
|
||||
}
|
||||
uint src = (uint)ReadByte(A[srcReg].s32);
|
||||
uint dst = (uint)ReadByte(A[dstReg].s32);
|
||||
uint src = (uint)ReadByte(A_srcReg->s32);
|
||||
uint dst = (uint)ReadByte(A_dstReg->s32);
|
||||
uint res;
|
||||
res = (uint)(dst - src - (X ? 1 : 0));
|
||||
N = ((res & 0x80) != 0);
|
||||
@ -1145,16 +1158,16 @@ namespace cpu.m68000
|
||||
V = ((((src ^ dst) & (res ^ dst)) & 0x80) != 0);
|
||||
res = res & 0xff;
|
||||
Z &= (res == 0);
|
||||
WriteByte(A[dstReg].s32, (sbyte)res);
|
||||
WriteByte(A_dstReg->s32, (sbyte)res);
|
||||
pendingCycles -= 18;
|
||||
return;
|
||||
}
|
||||
case 1:
|
||||
{
|
||||
A[srcReg].u32 -= 2;
|
||||
uint src = (uint)ReadWord(A[srcReg].s32);
|
||||
A[dstReg].u32 -= 2;
|
||||
uint dst = (uint)ReadWord(A[dstReg].s32);
|
||||
A_srcReg->u32 -= 2;
|
||||
uint src = (uint)ReadWord(A_srcReg->s32);
|
||||
A_dstReg->u32 -= 2;
|
||||
uint dst = (uint)ReadWord(A_dstReg->s32);
|
||||
uint res;
|
||||
res = (uint)(dst - src - (X ? 1 : 0));
|
||||
N = ((res & 0x8000) != 0);
|
||||
@ -1162,23 +1175,23 @@ namespace cpu.m68000
|
||||
V = ((((src ^ dst) & (res ^ dst)) & 0x8000) != 0);
|
||||
res = res & 0xffff;
|
||||
Z &= (res == 0);
|
||||
WriteWord(A[dstReg].s32, (short)res);
|
||||
WriteWord(A_dstReg->s32, (short)res);
|
||||
pendingCycles -= 18;
|
||||
return;
|
||||
}
|
||||
case 2:
|
||||
{
|
||||
A[srcReg].u32 -= 4;
|
||||
uint src = (uint)ReadLong(A[srcReg].s32);
|
||||
A[dstReg].u32 -= 4;
|
||||
uint dst = (uint)ReadWord(A[dstReg].s32);
|
||||
A_srcReg->u32 -= 4;
|
||||
uint src = (uint)ReadLong(A_srcReg->s32);
|
||||
A_dstReg->u32 -= 4;
|
||||
uint dst = (uint)ReadWord(A_dstReg->s32);
|
||||
uint res;
|
||||
res = (uint)(dst - src - (X ? 1 : 0));
|
||||
N = ((res & 0x80000000) != 0);
|
||||
X = C = (((((src & res) | (~dst & (src | res))) >> 23) & 0x100) != 0);
|
||||
V = (((((src ^ dst) & (res ^ dst)) >> 24) & 0x80) != 0);
|
||||
Z &= (res == 0);
|
||||
WriteLong(A[dstReg].s32, (int)res);
|
||||
WriteLong(A_dstReg->s32, (int)res);
|
||||
pendingCycles -= 30;
|
||||
return;
|
||||
}
|
||||
@ -1290,11 +1303,12 @@ namespace cpu.m68000
|
||||
int mode = (op >> 3) & 7;
|
||||
int reg = (op >> 0) & 7;
|
||||
|
||||
Register* A_ptr_aReg = A + aReg;
|
||||
switch (size)
|
||||
{
|
||||
case 0: // word
|
||||
{
|
||||
int a = A[aReg].s32;
|
||||
int a = A_ptr_aReg->s32;
|
||||
short b = ReadValueW(mode, reg);
|
||||
long result = a - b;
|
||||
N = (result & 0x80000000) != 0;
|
||||
@ -1306,7 +1320,7 @@ namespace cpu.m68000
|
||||
}
|
||||
case 1: // long
|
||||
{
|
||||
int a = A[aReg].s32;
|
||||
int a = A_ptr_aReg->s32;
|
||||
int b = ReadValueL(mode, reg);
|
||||
long result = a - b;
|
||||
N = (result & 0x80000000) != 0;
|
||||
@ -1326,12 +1340,14 @@ namespace cpu.m68000
|
||||
int size = (op >> 6) & 3;
|
||||
int ayReg = (op >> 0) & 7;
|
||||
|
||||
Register* A_axReg = A + axReg;
|
||||
Register* A_ayReg = A + ayReg;
|
||||
switch (size)
|
||||
{
|
||||
case 0: // byte
|
||||
{
|
||||
sbyte a = ReadByte(A[axReg].s32); A[axReg].s32 += 1; // Does A7 stay word aligned???
|
||||
sbyte b = ReadByte(A[ayReg].s32); A[ayReg].s32 += 1;
|
||||
sbyte a = ReadByte(A_axReg->s32); A_axReg->s32 += 1; // Does A7 stay word aligned???
|
||||
sbyte b = ReadByte(A_ayReg->s32); A_ayReg->s32 += 1;
|
||||
int result = a - b;
|
||||
N = (result & 0x80) != 0;
|
||||
Z = (result & 0xff) == 0;
|
||||
@ -1342,8 +1358,8 @@ namespace cpu.m68000
|
||||
}
|
||||
case 1: // word
|
||||
{
|
||||
short a = ReadWord(A[axReg].s32); A[axReg].s32 += 2;
|
||||
short b = ReadWord(A[ayReg].s32); A[ayReg].s32 += 2;
|
||||
short a = ReadWord(A_axReg->s32); A_axReg->s32 += 2;
|
||||
short b = ReadWord(A_ayReg->s32); A_ayReg->s32 += 2;
|
||||
int result = a - b;
|
||||
N = (result & 0x8000) != 0;
|
||||
Z = (result & 0xffff) == 0;
|
||||
@ -1354,8 +1370,8 @@ namespace cpu.m68000
|
||||
}
|
||||
case 2: // long
|
||||
{
|
||||
int a = ReadLong(A[axReg].s32); A[axReg].s32 += 4;
|
||||
int b = ReadLong(A[ayReg].s32); A[ayReg].s32 += 4;
|
||||
int a = ReadLong(A_axReg->s32); A_axReg->s32 += 4;
|
||||
int b = ReadLong(A_ayReg->s32); A_ayReg->s32 += 4;
|
||||
long result = a - b;
|
||||
N = (result & 0x80000000) != 0;
|
||||
Z = (uint)result == 0;
|
||||
@ -1424,6 +1440,7 @@ namespace cpu.m68000
|
||||
int size = (op >> 6) & 3;
|
||||
int mode = (op >> 3) & 7;
|
||||
int reg = (op >> 0) & 7;
|
||||
Register* A_ptr_reg = A + reg;
|
||||
|
||||
switch (size)
|
||||
{
|
||||
@ -1439,21 +1456,21 @@ namespace cpu.m68000
|
||||
case 0: // Dn
|
||||
a = D[reg].s8; break;
|
||||
case 1: // An
|
||||
a = A[reg].s8; break;
|
||||
a = A_ptr_reg->s8; break;
|
||||
case 2: // (An)
|
||||
a = ReadByte(A[reg].s32); break;
|
||||
a = ReadByte(A_ptr_reg->s32); break;
|
||||
case 3: // (An)+
|
||||
value = ReadByte(A[reg].s32);
|
||||
A[reg].s32 += reg == 7 ? 2 : 1;
|
||||
value = ReadByte(A_ptr_reg->s32);
|
||||
A_ptr_reg->s32 += reg == 7 ? 2 : 1;
|
||||
a = value; break;
|
||||
case 4: // -(An)
|
||||
A[reg].s32 -= reg == 7 ? 2 : 1;
|
||||
a = ReadByte(A[reg].s32); break;
|
||||
A_ptr_reg->s32 -= reg == 7 ? 2 : 1;
|
||||
a = ReadByte(A_ptr_reg->s32); break;
|
||||
case 5: // (d16,An)
|
||||
value = ReadByte((A[reg].s32 + ReadOpWord(PC))); PC += 2;
|
||||
value = ReadByte((A_ptr_reg->s32 + ReadOpWord(PC))); PC += 2;
|
||||
a = value; break;
|
||||
case 6: // (d8,An,Xn)
|
||||
a = ReadByte(A[reg].s32 + GetIndex()); break;
|
||||
a = ReadByte(A_ptr_reg->s32 + GetIndex()); break;
|
||||
case 7:
|
||||
switch (reg)
|
||||
{
|
||||
|
||||
@ -1,4 +1,5 @@
|
||||
using System;
|
||||
using System.Text.RegularExpressions;
|
||||
|
||||
namespace cpu.m68000
|
||||
{
|
||||
@ -499,10 +500,11 @@ namespace cpu.m68000
|
||||
int reg = op & 7;
|
||||
|
||||
Register* ptrA7 = &A[7];
|
||||
Register* A_ptr_reg = A + reg;
|
||||
ptrA7->s32 -= 4;
|
||||
short offset = ReadOpWord(PC); PC += 2;
|
||||
WriteLong(ptrA7->s32, A[reg].s32);
|
||||
A[reg].s32 = ptrA7->s32;
|
||||
WriteLong(ptrA7->s32, A_ptr_reg->s32);
|
||||
A_ptr_reg->s32 = ptrA7->s32;
|
||||
ptrA7->s32 += offset;
|
||||
pendingCycles -= 16;
|
||||
}
|
||||
@ -512,8 +514,9 @@ namespace cpu.m68000
|
||||
{
|
||||
int reg = op & 7;
|
||||
Register* ptrA7 = &A[7];
|
||||
ptrA7->s32 = A[reg].s32;
|
||||
A[reg].s32 = ReadLong(ptrA7->s32);
|
||||
Register* A_ptr_reg = A + reg;
|
||||
ptrA7->s32 = A_ptr_reg->s32;
|
||||
A_ptr_reg->s32 = ReadLong(ptrA7->s32);
|
||||
ptrA7->s32 += 4;
|
||||
pendingCycles -= 12;
|
||||
}
|
||||
|
||||
@ -61,13 +61,14 @@ namespace cpu.m68000
|
||||
}
|
||||
else
|
||||
{
|
||||
Register* A_ptr_reg = A + reg;
|
||||
if (dir == 0)
|
||||
{
|
||||
usp = A[reg].s32;
|
||||
usp = A_ptr_reg->s32;
|
||||
}
|
||||
else
|
||||
{
|
||||
A[reg].s32 = usp;
|
||||
A_ptr_reg->s32 = usp;
|
||||
}
|
||||
}
|
||||
pendingCycles -= 4;
|
||||
|
||||
@ -12,21 +12,21 @@ namespace cpu.m68000
|
||||
// case 0: // Dn
|
||||
// return D[reg].s8;
|
||||
// case 1: // An
|
||||
// return A[reg].s8;
|
||||
// return A_ptr_reg->s8;
|
||||
// case 2: // (An)
|
||||
// return ReadByte(A[reg].s32);
|
||||
// return ReadByte(A_ptr_reg->s32);
|
||||
// case 3: // (An)+
|
||||
// value = ReadByte(A[reg].s32);
|
||||
// A[reg].s32 += reg == 7 ? 2 : 1;
|
||||
// value = ReadByte(A_ptr_reg->s32);
|
||||
// A_ptr_reg->s32 += reg == 7 ? 2 : 1;
|
||||
// return value;
|
||||
// case 4: // -(An)
|
||||
// A[reg].s32 -= reg == 7 ? 2 : 1;
|
||||
// return ReadByte(A[reg].s32);
|
||||
// A_ptr_reg->s32 -= reg == 7 ? 2 : 1;
|
||||
// return ReadByte(A_ptr_reg->s32);
|
||||
// case 5: // (d16,An)
|
||||
// value = ReadByte((A[reg].s32 + ReadOpWord(PC))); PC += 2;
|
||||
// value = ReadByte((A_ptr_reg->s32 + ReadOpWord(PC))); PC += 2;
|
||||
// return value;
|
||||
// case 6: // (d8,An,Xn)
|
||||
// return ReadByte(A[reg].s32 + GetIndex());
|
||||
// return ReadByte(A_ptr_reg->s32 + GetIndex());
|
||||
// case 7:
|
||||
// switch (reg)
|
||||
// {
|
||||
@ -65,14 +65,14 @@ namespace cpu.m68000
|
||||
return ReadByte((A + reg)->s32);
|
||||
case 3: // (An)+
|
||||
{
|
||||
Register* ptr = &A[reg];
|
||||
Register* ptr = A + reg;
|
||||
value = ReadByte(ptr->s32);
|
||||
ptr->s32 += reg == 7 ? 2 : 1;
|
||||
}
|
||||
return value;
|
||||
case 4: // -(An)
|
||||
{
|
||||
Register* ptr = &A[reg];
|
||||
Register* ptr = A + reg;
|
||||
ptr->s32 -= reg == 7 ? 2 : 1;
|
||||
return ReadByte(ptr->s32);
|
||||
}
|
||||
@ -115,21 +115,21 @@ namespace cpu.m68000
|
||||
// case 0: // Dn
|
||||
// return D[reg].s16;
|
||||
// case 1: // An
|
||||
// return A[reg].s16;
|
||||
// return A_ptr_reg->s16;
|
||||
// case 2: // (An)
|
||||
// return ReadWord(A[reg].s32);
|
||||
// return ReadWord(A_ptr_reg->s32);
|
||||
// case 3: // (An)+
|
||||
// value = ReadWord(A[reg].s32);
|
||||
// A[reg].s32 += 2;
|
||||
// value = ReadWord(A_ptr_reg->s32);
|
||||
// A_ptr_reg->s32 += 2;
|
||||
// return value;
|
||||
// case 4: // -(An)
|
||||
// A[reg].s32 -= 2;
|
||||
// return ReadWord(A[reg].s32);
|
||||
// A_ptr_reg->s32 -= 2;
|
||||
// return ReadWord(A_ptr_reg->s32);
|
||||
// case 5: // (d16,An)
|
||||
// value = ReadWord((A[reg].s32 + ReadOpWord(PC))); PC += 2;
|
||||
// value = ReadWord((A_ptr_reg->s32 + ReadOpWord(PC))); PC += 2;
|
||||
// return value;
|
||||
// case 6: // (d8,An,Xn)
|
||||
// return ReadWord(A[reg].s32 + GetIndex());
|
||||
// return ReadWord(A_ptr_reg->s32 + GetIndex());
|
||||
// case 7:
|
||||
// switch (reg)
|
||||
// {
|
||||
@ -168,14 +168,14 @@ namespace cpu.m68000
|
||||
return ReadWord((A + reg)->s32);
|
||||
case 3: // (An)+
|
||||
{
|
||||
Register* ptr = &A[reg];
|
||||
Register* ptr = A + reg;
|
||||
value = ReadWord(ptr->s32);
|
||||
ptr->s32 += 2;
|
||||
return value;
|
||||
}
|
||||
case 4: // -(An)
|
||||
{
|
||||
Register* ptr = &A[reg];
|
||||
Register* ptr = A + reg;
|
||||
ptr->s32 -= 2;
|
||||
return ReadWord(ptr->s32);
|
||||
}
|
||||
@ -217,21 +217,21 @@ namespace cpu.m68000
|
||||
// case 0: // Dn
|
||||
// return D[reg].s32;
|
||||
// case 1: // An
|
||||
// return A[reg].s32;
|
||||
// return A_ptr_reg->s32;
|
||||
// case 2: // (An)
|
||||
// return ReadLong(A[reg].s32);
|
||||
// return ReadLong(A_ptr_reg->s32);
|
||||
// case 3: // (An)+
|
||||
// value = ReadLong(A[reg].s32);
|
||||
// A[reg].s32 += 4;
|
||||
// value = ReadLong(A_ptr_reg->s32);
|
||||
// A_ptr_reg->s32 += 4;
|
||||
// return value;
|
||||
// case 4: // -(An)
|
||||
// A[reg].s32 -= 4;
|
||||
// return ReadLong(A[reg].s32);
|
||||
// A_ptr_reg->s32 -= 4;
|
||||
// return ReadLong(A_ptr_reg->s32);
|
||||
// case 5: // (d16,An)
|
||||
// value = ReadLong((A[reg].s32 + ReadOpWord(PC))); PC += 2;
|
||||
// value = ReadLong((A_ptr_reg->s32 + ReadOpWord(PC))); PC += 2;
|
||||
// return value;
|
||||
// case 6: // (d8,An,Xn)
|
||||
// return ReadLong(A[reg].s32 + GetIndex());
|
||||
// return ReadLong(A_ptr_reg->s32 + GetIndex());
|
||||
// case 7:
|
||||
// switch (reg)
|
||||
// {
|
||||
@ -271,14 +271,14 @@ namespace cpu.m68000
|
||||
return ReadLong((A + reg)->s32);
|
||||
case 3: // (An)+
|
||||
{
|
||||
Register* ptr = &A[reg];
|
||||
Register* ptr = A + reg;
|
||||
value = ReadLong(ptr->s32);
|
||||
ptr->s32 += 4;
|
||||
}
|
||||
return value;
|
||||
case 4: // -(An)
|
||||
{
|
||||
Register* ptr = &A[reg];
|
||||
Register* ptr = A + reg;
|
||||
ptr->s32 -= 4;
|
||||
return ReadLong(ptr->s32);
|
||||
}
|
||||
@ -321,20 +321,39 @@ namespace cpu.m68000
|
||||
case 0: // Dn
|
||||
return D[reg].s8;
|
||||
case 1: // An
|
||||
return A[reg].s8;
|
||||
{
|
||||
Register* A_ptr_reg = A + reg;
|
||||
return A_ptr_reg->s8;
|
||||
}
|
||||
case 2: // (An)
|
||||
return ReadByte(A[reg].s32);
|
||||
{
|
||||
Register* A_ptr_reg = A + reg;
|
||||
return ReadByte(A_ptr_reg->s32);
|
||||
}
|
||||
case 3: // (An)+
|
||||
value = ReadByte(A[reg].s32);
|
||||
return value;
|
||||
{
|
||||
|
||||
Register* A_ptr_reg = A + reg;
|
||||
value = ReadByte(A_ptr_reg->s32);
|
||||
return value;
|
||||
}
|
||||
case 4: // -(An)
|
||||
value = ReadByte(A[reg].s32 - (reg == 7 ? 2 : 1));
|
||||
return value;
|
||||
{
|
||||
Register* A_ptr_reg = A + reg;
|
||||
value = ReadByte(A_ptr_reg->s32 - (reg == 7 ? 2 : 1));
|
||||
return value;
|
||||
}
|
||||
case 5: // (d16,An)
|
||||
value = ReadByte((A[reg].s32 + ReadOpWord(PC)));
|
||||
return value;
|
||||
{
|
||||
Register* A_ptr_reg = A + reg;
|
||||
value = ReadByte((A_ptr_reg->s32 + ReadOpWord(PC)));
|
||||
return value;
|
||||
}
|
||||
case 6: // (d8,An,Xn)
|
||||
return ReadByte(A[reg].s32 + PeekIndex());
|
||||
{
|
||||
Register* A_ptr_reg = A + reg;
|
||||
return ReadByte(A_ptr_reg->s32 + PeekIndex());
|
||||
}
|
||||
case 7:
|
||||
switch (reg)
|
||||
{
|
||||
@ -367,20 +386,40 @@ namespace cpu.m68000
|
||||
case 0: // Dn
|
||||
return D[reg].s16;
|
||||
case 1: // An
|
||||
return A[reg].s16;
|
||||
{
|
||||
|
||||
Register* A_ptr_reg = A + reg;
|
||||
return A_ptr_reg->s16;
|
||||
}
|
||||
case 2: // (An)
|
||||
return ReadWord(A[reg].s32);
|
||||
{
|
||||
Register* A_ptr_reg = A + reg;
|
||||
return ReadWord(A_ptr_reg->s32);
|
||||
}
|
||||
case 3: // (An)+
|
||||
value = ReadWord(A[reg].s32);
|
||||
return value;
|
||||
{
|
||||
Register* A_ptr_reg = A + reg;
|
||||
value = ReadWord(A_ptr_reg->s32);
|
||||
return value;
|
||||
}
|
||||
case 4: // -(An)
|
||||
value = ReadWord(A[reg].s32 - 2);
|
||||
return value;
|
||||
{
|
||||
|
||||
Register* A_ptr_reg = A + reg;
|
||||
value = ReadWord(A_ptr_reg->s32 - 2);
|
||||
return value;
|
||||
}
|
||||
case 5: // (d16,An)
|
||||
value = ReadWord((A[reg].s32 + ReadOpWord(PC)));
|
||||
return value;
|
||||
{
|
||||
Register* A_ptr_reg = A + reg;
|
||||
value = ReadWord((A_ptr_reg->s32 + ReadOpWord(PC)));
|
||||
return value;
|
||||
}
|
||||
case 6: // (d8,An,Xn)
|
||||
return ReadWord(A[reg].s32 + PeekIndex());
|
||||
{
|
||||
Register* A_ptr_reg = A + reg;
|
||||
return ReadWord(A_ptr_reg->s32 + PeekIndex());
|
||||
}
|
||||
case 7:
|
||||
switch (reg)
|
||||
{
|
||||
@ -413,20 +452,38 @@ namespace cpu.m68000
|
||||
case 0: // Dn
|
||||
return D[reg].s32;
|
||||
case 1: // An
|
||||
return A[reg].s32;
|
||||
{
|
||||
Register* A_ptr_reg = A + reg;
|
||||
return A_ptr_reg->s32;
|
||||
}
|
||||
case 2: // (An)
|
||||
return ReadLong(A[reg].s32);
|
||||
{
|
||||
Register* A_ptr_reg = A + reg;
|
||||
return ReadLong(A_ptr_reg->s32);
|
||||
}
|
||||
case 3: // (An)+
|
||||
value = ReadLong(A[reg].s32);
|
||||
return value;
|
||||
{
|
||||
Register* A_ptr_reg = A + reg;
|
||||
value = ReadLong(A_ptr_reg->s32);
|
||||
return value;
|
||||
}
|
||||
case 4: // -(An)
|
||||
value = ReadLong(A[reg].s32 - 4);
|
||||
return value;
|
||||
{
|
||||
Register* A_ptr_reg = A + reg;
|
||||
value = ReadLong(A_ptr_reg->s32 - 4);
|
||||
return value;
|
||||
}
|
||||
case 5: // (d16,An)
|
||||
value = ReadLong((A[reg].s32 + ReadOpWord(PC)));
|
||||
return value;
|
||||
{
|
||||
Register* A_ptr_reg = A + reg;
|
||||
value = ReadLong((A_ptr_reg->s32 + ReadOpWord(PC)));
|
||||
return value;
|
||||
}
|
||||
case 6: // (d8,An,Xn)
|
||||
return ReadLong(A[reg].s32 + PeekIndex());
|
||||
{
|
||||
Register* A_ptr_reg = A + reg;
|
||||
return ReadLong(A_ptr_reg->s32 + PeekIndex());
|
||||
}
|
||||
case 7:
|
||||
switch (reg)
|
||||
{
|
||||
@ -458,11 +515,11 @@ namespace cpu.m68000
|
||||
{
|
||||
case 0: throw new Exception("Invalid addressing mode!"); // Dn
|
||||
case 1: throw new Exception("Invalid addressing mode!"); // An
|
||||
case 2: return A[reg].s32; // (An)
|
||||
case 3: return A[reg].s32; // (An)+
|
||||
case 4: return A[reg].s32; // -(An)
|
||||
case 5: addr = A[reg].s32 + ReadOpWord(PC); PC += 2; return addr; // (d16,An)
|
||||
case 6: return A[reg].s32 + GetIndex(); // (d8,An,Xn)
|
||||
case 2: return (A + reg)->s32; // (An)
|
||||
case 3: return (A + reg)->s32; // (An)+
|
||||
case 4: return (A + reg)->s32; // -(An)
|
||||
case 5: addr = (A + reg)->s32 + ReadOpWord(PC); PC += 2; return addr; // (d16,An)
|
||||
case 6: return (A + reg)->s32 + GetIndex(); // (d8,An,Xn)
|
||||
case 7:
|
||||
switch (reg)
|
||||
{
|
||||
@ -486,24 +543,24 @@ namespace cpu.m68000
|
||||
// D[reg].s8 = value;
|
||||
// return;
|
||||
// case 0x01: // An
|
||||
// A[reg].s32 = value;
|
||||
// A_ptr_reg->s32 = value;
|
||||
// return;
|
||||
// case 0x02: // (An)
|
||||
// WriteByte(A[reg].s32, value);
|
||||
// WriteByte(A_ptr_reg->s32, value);
|
||||
// return;
|
||||
// case 0x03: // (An)+
|
||||
// WriteByte(A[reg].s32, value);
|
||||
// A[reg].s32 += reg == 7 ? 2 : 1;
|
||||
// WriteByte(A_ptr_reg->s32, value);
|
||||
// A_ptr_reg->s32 += reg == 7 ? 2 : 1;
|
||||
// return;
|
||||
// case 0x04: // -(An)
|
||||
// A[reg].s32 -= reg == 7 ? 2 : 1;
|
||||
// WriteByte(A[reg].s32, value);
|
||||
// A_ptr_reg->s32 -= reg == 7 ? 2 : 1;
|
||||
// WriteByte(A_ptr_reg->s32, value);
|
||||
// return;
|
||||
// case 0x05: // (d16,An)
|
||||
// WriteByte(A[reg].s32 + ReadOpWord(PC), value); PC += 2;
|
||||
// WriteByte(A_ptr_reg->s32 + ReadOpWord(PC), value); PC += 2;
|
||||
// return;
|
||||
// case 0x06: // (d8,An,Xn)
|
||||
// WriteByte(A[reg].s32 + GetIndex(), value);
|
||||
// WriteByte(A_ptr_reg->s32 + GetIndex(), value);
|
||||
// return;
|
||||
// case 0x07:
|
||||
// switch (reg)
|
||||
@ -542,14 +599,14 @@ namespace cpu.m68000
|
||||
return;
|
||||
case 0x03: // (An)+
|
||||
{
|
||||
Register* ptr = &A[reg];
|
||||
Register* ptr = A + reg;
|
||||
WriteByte(ptr->s32, value);
|
||||
ptr->s32 += reg == 7 ? 2 : 1;
|
||||
}
|
||||
return;
|
||||
case 0x04: // -(An)
|
||||
{
|
||||
Register* ptr = &A[reg];
|
||||
Register* ptr = A + reg;
|
||||
ptr->s32 -= reg == 7 ? 2 : 1;
|
||||
WriteByte(ptr->s32, value);
|
||||
}
|
||||
@ -590,24 +647,24 @@ namespace cpu.m68000
|
||||
// D[reg].s16 = value;
|
||||
// return;
|
||||
// case 0x01: // An
|
||||
// A[reg].s32 = value;
|
||||
// A_ptr_reg->s32 = value;
|
||||
// return;
|
||||
// case 0x02: // (An)
|
||||
// WriteWord(A[reg].s32, value);
|
||||
// WriteWord(A_ptr_reg->s32, value);
|
||||
// return;
|
||||
// case 0x03: // (An)+
|
||||
// WriteWord(A[reg].s32, value);
|
||||
// A[reg].s32 += 2;
|
||||
// WriteWord(A_ptr_reg->s32, value);
|
||||
// A_ptr_reg->s32 += 2;
|
||||
// return;
|
||||
// case 0x04: // -(An)
|
||||
// A[reg].s32 -= 2;
|
||||
// WriteWord(A[reg].s32, value);
|
||||
// A_ptr_reg->s32 -= 2;
|
||||
// WriteWord(A_ptr_reg->s32, value);
|
||||
// return;
|
||||
// case 0x05: // (d16,An)
|
||||
// WriteWord(A[reg].s32 + ReadOpWord(PC), value); PC += 2;
|
||||
// WriteWord(A_ptr_reg->s32 + ReadOpWord(PC), value); PC += 2;
|
||||
// return;
|
||||
// case 0x06: // (d8,An,Xn)
|
||||
// WriteWord(A[reg].s32 + GetIndex(), value);
|
||||
// WriteWord(A_ptr_reg->s32 + GetIndex(), value);
|
||||
// return;
|
||||
// case 0x07:
|
||||
// switch (reg)
|
||||
@ -647,14 +704,14 @@ namespace cpu.m68000
|
||||
return;
|
||||
case 0x03: // (An)+
|
||||
{
|
||||
Register* ptr = &A[reg];
|
||||
Register* ptr = A + reg;
|
||||
WriteWord(ptr->s32, value);
|
||||
ptr->s32 += 2;
|
||||
}
|
||||
return;
|
||||
case 0x04: // -(An)
|
||||
{
|
||||
Register* ptr = &A[reg];
|
||||
Register* ptr = A + reg;
|
||||
ptr->s32 -= 2;
|
||||
WriteWord(ptr->s32, value);
|
||||
}
|
||||
@ -702,14 +759,14 @@ namespace cpu.m68000
|
||||
return;
|
||||
case 0x03: // (An)+
|
||||
{
|
||||
Register* ptr = &A[reg];
|
||||
Register* ptr = A + reg;
|
||||
WriteLong(ptr->s32, value);
|
||||
ptr->s32 += 4;
|
||||
}
|
||||
return;
|
||||
case 0x04: // -(An)
|
||||
{
|
||||
Register* ptr = &A[reg];
|
||||
Register* ptr = A + reg;
|
||||
ptr->s32 -= 4;
|
||||
WriteLong(ptr->s32, value);
|
||||
}
|
||||
@ -766,7 +823,7 @@ namespace cpu.m68000
|
||||
if (da == 0)
|
||||
indexReg *= size == 0 ? D[reg].s16 : D[reg].s32;
|
||||
else
|
||||
indexReg *= size == 0 ? A[reg].s16 : A[reg].s32;
|
||||
indexReg *= size == 0 ? (A + reg)->s16 : (A + reg)->s32;
|
||||
|
||||
return displacement + indexReg;
|
||||
}
|
||||
@ -794,7 +851,10 @@ namespace cpu.m68000
|
||||
if (da == 0)
|
||||
indexReg *= size == 0 ? D[reg].s16 : D[reg].s32;
|
||||
else
|
||||
indexReg *= size == 0 ? A[reg].s16 : A[reg].s32;
|
||||
{
|
||||
Register* A_ptr_reg = A + reg;
|
||||
indexReg *= size == 0 ? A_ptr_reg->s16 : A_ptr_reg->s32;
|
||||
}
|
||||
|
||||
return displacement + indexReg;
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user