notaz.gp2x.de
/
picodrive.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
drop unmaintained mips code
[picodrive.git]
/
cpu
/
fame
/
famec_opcodes.h
diff --git
a/cpu/fame/famec_opcodes.h
b/cpu/fame/famec_opcodes.h
index
5e09a92
..
3ba7275
100644
(file)
--- a/
cpu/fame/famec_opcodes.h
+++ b/
cpu/fame/famec_opcodes.h
@@
-1,4
+1,10
@@
+#ifdef PICODRIVE_HACK
+#define NOT_POLLING g_m68kcontext->not_polling = 1;
+#else
+#define NOT_POLLING
+#endif
+
// ORI
OPCODE(0x0000)
{
// ORI
OPCODE(0x0000)
{
@@
-16930,18
+16936,20
@@
OPCODE(0x4800)
u32 adr, res;
u32 src, dst;
u32 adr, res;
u32 src, dst;
-
res
= DREGu8((Opcode >> 0) & 7);
- res =
0x9a - res
- ((flag_X >> M68K_SR_X_SFT) & 1);
+
dst
= DREGu8((Opcode >> 0) & 7);
+ res =
-dst
- ((flag_X >> M68K_SR_X_SFT) & 1);
- if (res != 0
x9a
)
+ if (res != 0)
{
{
- if ((res & 0x0f) == 0xa) res = (res & 0xf0) + 0x10;
- res &= 0xFF;
- DREGu8((Opcode >> 0) & 7) = res;
+ flag_V = res;
+ if (((res|dst) & 0x0f) == 0) res = (res & 0xf0) + 6;
+ res = (res + 0x9a) & 0xFF;
+ DREGu8((Opcode >> 0) & 7) = res;
+ flag_V &= ~res;
flag_NotZ |= res;
flag_X = flag_C = M68K_SR_C;
}
flag_NotZ |= res;
flag_X = flag_C = M68K_SR_C;
}
- else flag_X = flag_C = 0;
+ else flag_
V = flag_
X = flag_C = 0;
flag_N = res;
RET(6)
}
flag_N = res;
RET(6)
}
@@
-16954,18
+16962,20
@@
OPCODE(0x4810)
adr = AREG((Opcode >> 0) & 7);
PRE_IO
adr = AREG((Opcode >> 0) & 7);
PRE_IO
- READ_BYTE_F(adr,
res
)
- res =
0x9a - res
- ((flag_X >> M68K_SR_X_SFT) & 1);
+ READ_BYTE_F(adr,
dst
)
+ res =
-dst
- ((flag_X >> M68K_SR_X_SFT) & 1);
- if (res != 0
x9a
)
+ if (res != 0)
{
{
- if ((res & 0x0f) == 0xa) res = (res & 0xf0) + 0x10;
- res &= 0xFF;
- WRITE_BYTE_F(adr, res)
+ flag_V = res;
+ if (((res|dst) & 0x0f) == 0) res = (res & 0xf0) + 6;
+ res = (res + 0x9a) & 0xFF;
+ WRITE_BYTE_F(adr, res)
+ flag_V &= ~res;
flag_NotZ |= res;
flag_X = flag_C = M68K_SR_C;
}
flag_NotZ |= res;
flag_X = flag_C = M68K_SR_C;
}
- else flag_X = flag_C = 0;
+ else flag_
V = flag_
X = flag_C = 0;
flag_N = res;
POST_IO
RET(12)
flag_N = res;
POST_IO
RET(12)
@@
-16980,18
+16990,20
@@
OPCODE(0x4818)
adr = AREG((Opcode >> 0) & 7);
AREG((Opcode >> 0) & 7) += 1;
PRE_IO
adr = AREG((Opcode >> 0) & 7);
AREG((Opcode >> 0) & 7) += 1;
PRE_IO
- READ_BYTE_F(adr,
res
)
- res =
0x9a - res
- ((flag_X >> M68K_SR_X_SFT) & 1);
+ READ_BYTE_F(adr,
dst
)
+ res =
-dst
- ((flag_X >> M68K_SR_X_SFT) & 1);
- if (res != 0
x9a
)
+ if (res != 0)
{
{
- if ((res & 0x0f) == 0xa) res = (res & 0xf0) + 0x10;
- res &= 0xFF;
- WRITE_BYTE_F(adr, res)
+ flag_V = res;
+ if (((res|dst) & 0x0f) == 0) res = (res & 0xf0) + 6;
+ res = (res + 0x9a) & 0xFF;
+ WRITE_BYTE_F(adr, res)
+ flag_V &= ~res;
flag_NotZ |= res;
flag_X = flag_C = M68K_SR_C;
}
flag_NotZ |= res;
flag_X = flag_C = M68K_SR_C;
}
- else flag_X = flag_C = 0;
+ else flag_
V = flag_
X = flag_C = 0;
flag_N = res;
POST_IO
RET(12)
flag_N = res;
POST_IO
RET(12)
@@
-17006,18
+17018,20
@@
OPCODE(0x4820)
adr = AREG((Opcode >> 0) & 7) - 1;
AREG((Opcode >> 0) & 7) = adr;
PRE_IO
adr = AREG((Opcode >> 0) & 7) - 1;
AREG((Opcode >> 0) & 7) = adr;
PRE_IO
- READ_BYTE_F(adr,
res
)
- res =
0x9a - res
- ((flag_X >> M68K_SR_X_SFT) & 1);
+ READ_BYTE_F(adr,
dst
)
+ res =
-dst
- ((flag_X >> M68K_SR_X_SFT) & 1);
- if (res != 0
x9a
)
+ if (res != 0)
{
{
- if ((res & 0x0f) == 0xa) res = (res & 0xf0) + 0x10;
- res &= 0xFF;
- WRITE_BYTE_F(adr, res)
+ flag_V = res;
+ if (((res|dst) & 0x0f) == 0) res = (res & 0xf0) + 6;
+ res = (res + 0x9a) & 0xFF;
+ WRITE_BYTE_F(adr, res)
+ flag_V &= ~res;
flag_NotZ |= res;
flag_X = flag_C = M68K_SR_C;
}
flag_NotZ |= res;
flag_X = flag_C = M68K_SR_C;
}
- else flag_X = flag_C = 0;
+ else flag_
V = flag_
X = flag_C = 0;
flag_N = res;
POST_IO
RET(14)
flag_N = res;
POST_IO
RET(14)
@@
-17032,18
+17046,20
@@
OPCODE(0x4828)
FETCH_SWORD(adr);
adr += AREG((Opcode >> 0) & 7);
PRE_IO
FETCH_SWORD(adr);
adr += AREG((Opcode >> 0) & 7);
PRE_IO
- READ_BYTE_F(adr,
res
)
- res =
0x9a - res
- ((flag_X >> M68K_SR_X_SFT) & 1);
+ READ_BYTE_F(adr,
dst
)
+ res =
-dst
- ((flag_X >> M68K_SR_X_SFT) & 1);
- if (res != 0
x9a
)
+ if (res != 0)
{
{
- if ((res & 0x0f) == 0xa) res = (res & 0xf0) + 0x10;
- res &= 0xFF;
- WRITE_BYTE_F(adr, res)
+ flag_V = res;
+ if (((res|dst) & 0x0f) == 0) res = (res & 0xf0) + 6;
+ res = (res + 0x9a) & 0xFF;
+ WRITE_BYTE_F(adr, res)
+ flag_V &= ~res;
flag_NotZ |= res;
flag_X = flag_C = M68K_SR_C;
}
flag_NotZ |= res;
flag_X = flag_C = M68K_SR_C;
}
- else flag_X = flag_C = 0;
+ else flag_
V = flag_
X = flag_C = 0;
flag_N = res;
POST_IO
RET(16)
flag_N = res;
POST_IO
RET(16)
@@
-17058,18
+17074,20
@@
OPCODE(0x4830)
adr = AREG((Opcode >> 0) & 7);
DECODE_EXT_WORD
PRE_IO
adr = AREG((Opcode >> 0) & 7);
DECODE_EXT_WORD
PRE_IO
- READ_BYTE_F(adr,
res
)
- res =
0x9a - res
- ((flag_X >> M68K_SR_X_SFT) & 1);
+ READ_BYTE_F(adr,
dst
)
+ res =
-dst
- ((flag_X >> M68K_SR_X_SFT) & 1);
- if (res != 0
x9a
)
+ if (res != 0)
{
{
- if ((res & 0x0f) == 0xa) res = (res & 0xf0) + 0x10;
- res &= 0xFF;
- WRITE_BYTE_F(adr, res)
+ flag_V = res;
+ if (((res|dst) & 0x0f) == 0) res = (res & 0xf0) + 6;
+ res = (res + 0x9a) & 0xFF;
+ WRITE_BYTE_F(adr, res)
+ flag_V &= ~res;
flag_NotZ |= res;
flag_X = flag_C = M68K_SR_C;
}
flag_NotZ |= res;
flag_X = flag_C = M68K_SR_C;
}
- else flag_X = flag_C = 0;
+ else flag_
V = flag_
X = flag_C = 0;
flag_N = res;
POST_IO
RET(18)
flag_N = res;
POST_IO
RET(18)
@@
-17083,18
+17101,20
@@
OPCODE(0x4838)
FETCH_SWORD(adr);
PRE_IO
FETCH_SWORD(adr);
PRE_IO
- READ_BYTE_F(adr,
res
)
- res =
0x9a - res
- ((flag_X >> M68K_SR_X_SFT) & 1);
+ READ_BYTE_F(adr,
dst
)
+ res =
-dst
- ((flag_X >> M68K_SR_X_SFT) & 1);
- if (res != 0
x9a
)
+ if (res != 0)
{
{
- if ((res & 0x0f) == 0xa) res = (res & 0xf0) + 0x10;
- res &= 0xFF;
- WRITE_BYTE_F(adr, res)
+ flag_V = res;
+ if (((res|dst) & 0x0f) == 0) res = (res & 0xf0) + 6;
+ res = (res + 0x9a) & 0xFF;
+ WRITE_BYTE_F(adr, res)
+ flag_V &= ~res;
flag_NotZ |= res;
flag_X = flag_C = M68K_SR_C;
}
flag_NotZ |= res;
flag_X = flag_C = M68K_SR_C;
}
- else flag_X = flag_C = 0;
+ else flag_
V = flag_
X = flag_C = 0;
flag_N = res;
POST_IO
RET(16)
flag_N = res;
POST_IO
RET(16)
@@
-17108,18
+17128,20
@@
OPCODE(0x4839)
FETCH_LONG(adr);
PRE_IO
FETCH_LONG(adr);
PRE_IO
- READ_BYTE_F(adr,
res
)
- res =
0x9a - res
- ((flag_X >> M68K_SR_X_SFT) & 1);
+ READ_BYTE_F(adr,
dst
)
+ res =
-dst
- ((flag_X >> M68K_SR_X_SFT) & 1);
- if (res != 0
x9a
)
+ if (res != 0)
{
{
- if ((res & 0x0f) == 0xa) res = (res & 0xf0) + 0x10;
- res &= 0xFF;
- WRITE_BYTE_F(adr, res)
+ flag_V = res;
+ if (((res|dst) & 0x0f) == 0) res = (res & 0xf0) + 6;
+ res = (res + 0x9a) & 0xFF;
+ WRITE_BYTE_F(adr, res)
+ flag_V &= ~res;
flag_NotZ |= res;
flag_X = flag_C = M68K_SR_C;
}
flag_NotZ |= res;
flag_X = flag_C = M68K_SR_C;
}
- else flag_X = flag_C = 0;
+ else flag_
V = flag_
X = flag_C = 0;
flag_N = res;
POST_IO
RET(20)
flag_N = res;
POST_IO
RET(20)
@@
-17134,18
+17156,20
@@
OPCODE(0x481F)
adr = AREG(7);
AREG(7) += 2;
PRE_IO
adr = AREG(7);
AREG(7) += 2;
PRE_IO
- READ_BYTE_F(adr,
res
)
- res =
0x9a - res
- ((flag_X >> M68K_SR_X_SFT) & 1);
+ READ_BYTE_F(adr,
dst
)
+ res =
-dst
- ((flag_X >> M68K_SR_X_SFT) & 1);
- if (res != 0
x9a
)
+ if (res != 0)
{
{
- if ((res & 0x0f) == 0xa) res = (res & 0xf0) + 0x10;
- res &= 0xFF;
- WRITE_BYTE_F(adr, res)
+ flag_V = res;
+ if (((res|dst) & 0x0f) == 0) res = (res & 0xf0) + 6;
+ res = (res + 0x9a) & 0xFF;
+ WRITE_BYTE_F(adr, res)
+ flag_V &= ~res;
flag_NotZ |= res;
flag_X = flag_C = M68K_SR_C;
}
flag_NotZ |= res;
flag_X = flag_C = M68K_SR_C;
}
- else flag_X = flag_C = 0;
+ else flag_
V = flag_
X = flag_C = 0;
flag_N = res;
POST_IO
RET(12)
flag_N = res;
POST_IO
RET(12)
@@
-17160,18
+17184,20
@@
OPCODE(0x4827)
adr = AREG(7) - 2;
AREG(7) = adr;
PRE_IO
adr = AREG(7) - 2;
AREG(7) = adr;
PRE_IO
- READ_BYTE_F(adr,
res
)
- res =
0x9a - res
- ((flag_X >> M68K_SR_X_SFT) & 1);
+ READ_BYTE_F(adr,
dst
)
+ res =
-dst
- ((flag_X >> M68K_SR_X_SFT) & 1);
- if (res != 0
x9a
)
+ if (res != 0)
{
{
- if ((res & 0x0f) == 0xa) res = (res & 0xf0) + 0x10;
- res &= 0xFF;
- WRITE_BYTE_F(adr, res)
+ flag_V = res;
+ if (((res|dst) & 0x0f) == 0) res = (res & 0xf0) + 6;
+ res = (res + 0x9a) & 0xFF;
+ WRITE_BYTE_F(adr, res)
+ flag_V &= ~res;
flag_NotZ |= res;
flag_X = flag_C = M68K_SR_C;
}
flag_NotZ |= res;
flag_X = flag_C = M68K_SR_C;
}
- else flag_X = flag_C = 0;
+ else flag_
V = flag_
X = flag_C = 0;
flag_N = res;
POST_IO
RET(14)
flag_N = res;
POST_IO
RET(14)
@@
-18548,6
+18574,10
@@
RET(8)
// ILLEGAL
OPCODE(0x4AFC)
{
// ILLEGAL
OPCODE(0x4AFC)
{
+#ifdef PICODRIVE_HACK
+ extern void SekFinishIdleDet(void);
+ SekFinishIdleDet();
+#endif
SET_PC(execute_exception(M68K_ILLEGAL_INSTRUCTION_EX, GET_PC-2, GET_SR));
RET(0)
}
SET_PC(execute_exception(M68K_ILLEGAL_INSTRUCTION_EX, GET_PC-2, GET_SR));
RET(0)
}
@@
-19567,12
+19597,11
@@
RET(14)
// CHK
OPCODE(0x4180)
{
// CHK
OPCODE(0x4180)
{
- u32 adr, res;
- u32 src, dst;
+ s32 src, res;
- src = DREG
u
16((Opcode >> 0) & 7);
- res = DREG
u
16((Opcode >> 9) & 7);
- if ((
(s32)
res < 0) || (res > src))
+ src = DREG
s
16((Opcode >> 0) & 7);
+ res = DREG
s
16((Opcode >> 9) & 7);
+ if ((res < 0) || (res > src))
{
flag_N = res >> 8;
SET_PC(execute_exception(M68K_CHK_EX, GET_PC, GET_SR));
{
flag_N = res >> 8;
SET_PC(execute_exception(M68K_CHK_EX, GET_PC, GET_SR));
@@
-19583,14
+19612,14
@@
RET(10)
// CHK
OPCODE(0x4190)
{
// CHK
OPCODE(0x4190)
{
-
u32 adr
, res;
- u32
src, dst
;
+
s32 src
, res;
+ u32
adr
;
adr = AREG((Opcode >> 0) & 7);
PRE_IO
adr = AREG((Opcode >> 0) & 7);
PRE_IO
- READ_WORD_F(adr, src)
- res = DREG
u
16((Opcode >> 9) & 7);
- if ((
(s32)
res < 0) || (res > src))
+ READ
SX
_WORD_F(adr, src)
+ res = DREG
s
16((Opcode >> 9) & 7);
+ if ((res < 0) || (res > src))
{
flag_N = res >> 8;
SET_PC(execute_exception(M68K_CHK_EX, GET_PC, GET_SR));
{
flag_N = res >> 8;
SET_PC(execute_exception(M68K_CHK_EX, GET_PC, GET_SR));
@@
-19602,15
+19631,15
@@
RET(14)
// CHK
OPCODE(0x4198)
{
// CHK
OPCODE(0x4198)
{
-
u32 adr
, res;
- u32
src, dst
;
+
s32 src
, res;
+ u32
adr
;
adr = AREG((Opcode >> 0) & 7);
AREG((Opcode >> 0) & 7) += 2;
PRE_IO
adr = AREG((Opcode >> 0) & 7);
AREG((Opcode >> 0) & 7) += 2;
PRE_IO
- READ_WORD_F(adr, src)
- res = DREG
u
16((Opcode >> 9) & 7);
- if ((
(s32)
res < 0) || (res > src))
+ READ
SX
_WORD_F(adr, src)
+ res = DREG
s
16((Opcode >> 9) & 7);
+ if ((res < 0) || (res > src))
{
flag_N = res >> 8;
SET_PC(execute_exception(M68K_CHK_EX, GET_PC, GET_SR));
{
flag_N = res >> 8;
SET_PC(execute_exception(M68K_CHK_EX, GET_PC, GET_SR));
@@
-19622,15
+19651,15
@@
RET(14)
// CHK
OPCODE(0x41A0)
{
// CHK
OPCODE(0x41A0)
{
-
u32 adr
, res;
- u32
src, dst
;
+
s32 src
, res;
+ u32
adr
;
adr = AREG((Opcode >> 0) & 7) - 2;
AREG((Opcode >> 0) & 7) = adr;
PRE_IO
adr = AREG((Opcode >> 0) & 7) - 2;
AREG((Opcode >> 0) & 7) = adr;
PRE_IO
- READ_WORD_F(adr, src)
- res = DREG
u
16((Opcode >> 9) & 7);
- if ((
(s32)
res < 0) || (res > src))
+ READ
SX
_WORD_F(adr, src)
+ res = DREG
s
16((Opcode >> 9) & 7);
+ if ((res < 0) || (res > src))
{
flag_N = res >> 8;
SET_PC(execute_exception(M68K_CHK_EX, GET_PC, GET_SR));
{
flag_N = res >> 8;
SET_PC(execute_exception(M68K_CHK_EX, GET_PC, GET_SR));
@@
-19642,15
+19671,15
@@
RET(16)
// CHK
OPCODE(0x41A8)
{
// CHK
OPCODE(0x41A8)
{
-
u32 adr
, res;
- u32
src, dst
;
+
s32 src
, res;
+ u32
adr
;
FETCH_SWORD(adr);
adr += AREG((Opcode >> 0) & 7);
PRE_IO
FETCH_SWORD(adr);
adr += AREG((Opcode >> 0) & 7);
PRE_IO
- READ_WORD_F(adr, src)
- res = DREG
u
16((Opcode >> 9) & 7);
- if ((
(s32)
res < 0) || (res > src))
+ READ
SX
_WORD_F(adr, src)
+ res = DREG
s
16((Opcode >> 9) & 7);
+ if ((res < 0) || (res > src))
{
flag_N = res >> 8;
SET_PC(execute_exception(M68K_CHK_EX, GET_PC, GET_SR));
{
flag_N = res >> 8;
SET_PC(execute_exception(M68K_CHK_EX, GET_PC, GET_SR));
@@
-19662,15
+19691,15
@@
RET(18)
// CHK
OPCODE(0x41B0)
{
// CHK
OPCODE(0x41B0)
{
-
u32 adr
, res;
- u32
src, dst
;
+
s32 src
, res;
+ u32
adr
;
adr = AREG((Opcode >> 0) & 7);
DECODE_EXT_WORD
PRE_IO
adr = AREG((Opcode >> 0) & 7);
DECODE_EXT_WORD
PRE_IO
- READ_WORD_F(adr, src)
- res = DREG
u
16((Opcode >> 9) & 7);
- if ((
(s32)
res < 0) || (res > src))
+ READ
SX
_WORD_F(adr, src)
+ res = DREG
s
16((Opcode >> 9) & 7);
+ if ((res < 0) || (res > src))
{
flag_N = res >> 8;
SET_PC(execute_exception(M68K_CHK_EX, GET_PC, GET_SR));
{
flag_N = res >> 8;
SET_PC(execute_exception(M68K_CHK_EX, GET_PC, GET_SR));
@@
-19682,14
+19711,14
@@
RET(20)
// CHK
OPCODE(0x41B8)
{
// CHK
OPCODE(0x41B8)
{
-
u32 adr
, res;
- u32
src, dst
;
+
s32 src
, res;
+ u32
adr
;
FETCH_SWORD(adr);
PRE_IO
FETCH_SWORD(adr);
PRE_IO
- READ_WORD_F(adr, src)
- res = DREG
u
16((Opcode >> 9) & 7);
- if ((
(s32)
res < 0) || (res > src))
+ READ
SX
_WORD_F(adr, src)
+ res = DREG
s
16((Opcode >> 9) & 7);
+ if ((res < 0) || (res > src))
{
flag_N = res >> 8;
SET_PC(execute_exception(M68K_CHK_EX, GET_PC, GET_SR));
{
flag_N = res >> 8;
SET_PC(execute_exception(M68K_CHK_EX, GET_PC, GET_SR));
@@
-19701,14
+19730,14
@@
RET(18)
// CHK
OPCODE(0x41B9)
{
// CHK
OPCODE(0x41B9)
{
-
u32 adr
, res;
- u32
src, dst
;
+
s32 src
, res;
+ u32
adr
;
FETCH_LONG(adr);
PRE_IO
FETCH_LONG(adr);
PRE_IO
- READ_WORD_F(adr, src)
- res = DREG
u
16((Opcode >> 9) & 7);
- if ((
(s32)
res < 0) || (res > src))
+ READ
SX
_WORD_F(adr, src)
+ res = DREG
s
16((Opcode >> 9) & 7);
+ if ((res < 0) || (res > src))
{
flag_N = res >> 8;
SET_PC(execute_exception(M68K_CHK_EX, GET_PC, GET_SR));
{
flag_N = res >> 8;
SET_PC(execute_exception(M68K_CHK_EX, GET_PC, GET_SR));
@@
-19720,15
+19749,15
@@
RET(22)
// CHK
OPCODE(0x41BA)
{
// CHK
OPCODE(0x41BA)
{
-
u32 adr
, res;
- u32
src, dst
;
+
s32 src
, res;
+ u32
adr
;
adr = GET_SWORD + GET_PC;
PC++;
PRE_IO
adr = GET_SWORD + GET_PC;
PC++;
PRE_IO
- READ_WORD_F(adr, src)
- res = DREG
u
16((Opcode >> 9) & 7);
- if ((
(s32)
res < 0) || (res > src))
+ READ
SX
_WORD_F(adr, src)
+ res = DREG
s
16((Opcode >> 9) & 7);
+ if ((res < 0) || (res > src))
{
flag_N = res >> 8;
SET_PC(execute_exception(M68K_CHK_EX, GET_PC, GET_SR));
{
flag_N = res >> 8;
SET_PC(execute_exception(M68K_CHK_EX, GET_PC, GET_SR));
@@
-19740,15
+19769,15
@@
RET(18)
// CHK
OPCODE(0x41BB)
{
// CHK
OPCODE(0x41BB)
{
-
u32 adr
, res;
- u32
src, dst
;
+
s32 src
, res;
+ u32
adr
;
adr = GET_PC;
DECODE_EXT_WORD
PRE_IO
adr = GET_PC;
DECODE_EXT_WORD
PRE_IO
- READ_WORD_F(adr, src)
- res = DREG
u
16((Opcode >> 9) & 7);
- if ((
(s32)
res < 0) || (res > src))
+ READ
SX
_WORD_F(adr, src)
+ res = DREG
s
16((Opcode >> 9) & 7);
+ if ((res < 0) || (res > src))
{
flag_N = res >> 8;
SET_PC(execute_exception(M68K_CHK_EX, GET_PC, GET_SR));
{
flag_N = res >> 8;
SET_PC(execute_exception(M68K_CHK_EX, GET_PC, GET_SR));
@@
-19760,12
+19789,12
@@
RET(20)
// CHK
OPCODE(0x41BC)
{
// CHK
OPCODE(0x41BC)
{
-
u32 adr
, res;
- u32
src, dst
;
+
s32 src
, res;
+ u32
adr
;
- FETCH_WORD(src);
- res = DREG
u
16((Opcode >> 9) & 7);
- if ((
(s32)
res < 0) || (res > src))
+ FETCH_
S
WORD(src);
+ res = DREG
s
16((Opcode >> 9) & 7);
+ if ((res < 0) || (res > src))
{
flag_N = res >> 8;
SET_PC(execute_exception(M68K_CHK_EX, GET_PC, GET_SR));
{
flag_N = res >> 8;
SET_PC(execute_exception(M68K_CHK_EX, GET_PC, GET_SR));
@@
-19777,15
+19806,15
@@
RET(14)
// CHK
OPCODE(0x419F)
{
// CHK
OPCODE(0x419F)
{
-
u32 adr
, res;
- u32
src, dst
;
+
s32 src
, res;
+ u32
adr
;
adr = AREG(7);
AREG(7) += 2;
PRE_IO
adr = AREG(7);
AREG(7) += 2;
PRE_IO
- READ_WORD_F(adr, src)
- res = DREG
u
16((Opcode >> 9) & 7);
- if ((
(s32)
res < 0) || (res > src))
+ READ
SX
_WORD_F(adr, src)
+ res = DREG
s
16((Opcode >> 9) & 7);
+ if ((res < 0) || (res > src))
{
flag_N = res >> 8;
SET_PC(execute_exception(M68K_CHK_EX, GET_PC, GET_SR));
{
flag_N = res >> 8;
SET_PC(execute_exception(M68K_CHK_EX, GET_PC, GET_SR));
@@
-19797,15
+19826,15
@@
RET(14)
// CHK
OPCODE(0x41A7)
{
// CHK
OPCODE(0x41A7)
{
-
u32 adr
, res;
- u32
src, dst
;
+
s32 src
, res;
+ u32
adr
;
adr = AREG(7) - 2;
AREG(7) = adr;
PRE_IO
adr = AREG(7) - 2;
AREG(7) = adr;
PRE_IO
- READ_WORD_F(adr, src)
- res = DREG
u
16((Opcode >> 9) & 7);
- if ((
(s32)
res < 0) || (res > src))
+ READ
SX
_WORD_F(adr, src)
+ res = DREG
s
16((Opcode >> 9) & 7);
+ if ((res < 0) || (res > src))
{
flag_N = res >> 8;
SET_PC(execute_exception(M68K_CHK_EX, GET_PC, GET_SR));
{
flag_N = res >> 8;
SET_PC(execute_exception(M68K_CHK_EX, GET_PC, GET_SR));
@@
-23298,6
+23327,8
@@
OPCODE(0x51C8)
u32 adr, res;
u32 src, dst;
u32 adr, res;
u32 src, dst;
+ NOT_POLLING
+
res = DREGu16((Opcode >> 0) & 7);
res--;
DREGu16((Opcode >> 0) & 7) = res;
res = DREGu16((Opcode >> 0) & 7);
res--;
DREGu16((Opcode >> 0) & 7) = res;
@@
-23321,6
+23352,8
@@
OPCODE(0x52C8)
u32 adr, res;
u32 src, dst;
u32 adr, res;
u32 src, dst;
+ NOT_POLLING
+
if ((!flag_NotZ) || (flag_C & 0x100))
{
res = DREGu16((Opcode >> 0) & 7);
if ((!flag_NotZ) || (flag_C & 0x100))
{
res = DREGu16((Opcode >> 0) & 7);
@@
-23352,6
+23385,8
@@
OPCODE(0x53C8)
u32 adr, res;
u32 src, dst;
u32 adr, res;
u32 src, dst;
+ NOT_POLLING
+
if (flag_NotZ && (!(flag_C & 0x100)))
{
res = DREGu16((Opcode >> 0) & 7);
if (flag_NotZ && (!(flag_C & 0x100)))
{
res = DREGu16((Opcode >> 0) & 7);
@@
-23383,6
+23418,8
@@
OPCODE(0x54C8)
u32 adr, res;
u32 src, dst;
u32 adr, res;
u32 src, dst;
+ NOT_POLLING
+
if (flag_C & 0x100)
{
res = DREGu16((Opcode >> 0) & 7);
if (flag_C & 0x100)
{
res = DREGu16((Opcode >> 0) & 7);
@@
-23414,6
+23451,8
@@
OPCODE(0x55C8)
u32 adr, res;
u32 src, dst;
u32 adr, res;
u32 src, dst;
+ NOT_POLLING
+
if (!(flag_C & 0x100))
{
res = DREGu16((Opcode >> 0) & 7);
if (!(flag_C & 0x100))
{
res = DREGu16((Opcode >> 0) & 7);
@@
-23445,6
+23484,8
@@
OPCODE(0x56C8)
u32 adr, res;
u32 src, dst;
u32 adr, res;
u32 src, dst;
+ NOT_POLLING
+
if (!flag_NotZ)
{
res = DREGu16((Opcode >> 0) & 7);
if (!flag_NotZ)
{
res = DREGu16((Opcode >> 0) & 7);
@@
-23476,6
+23517,8
@@
OPCODE(0x57C8)
u32 adr, res;
u32 src, dst;
u32 adr, res;
u32 src, dst;
+ NOT_POLLING
+
if (flag_NotZ)
{
res = DREGu16((Opcode >> 0) & 7);
if (flag_NotZ)
{
res = DREGu16((Opcode >> 0) & 7);
@@
-23507,6
+23550,8
@@
OPCODE(0x58C8)
u32 adr, res;
u32 src, dst;
u32 adr, res;
u32 src, dst;
+ NOT_POLLING
+
if (flag_V & 0x80)
{
res = DREGu16((Opcode >> 0) & 7);
if (flag_V & 0x80)
{
res = DREGu16((Opcode >> 0) & 7);
@@
-23538,6
+23583,8
@@
OPCODE(0x59C8)
u32 adr, res;
u32 src, dst;
u32 adr, res;
u32 src, dst;
+ NOT_POLLING
+
if (!(flag_V & 0x80))
{
res = DREGu16((Opcode >> 0) & 7);
if (!(flag_V & 0x80))
{
res = DREGu16((Opcode >> 0) & 7);
@@
-23569,6
+23616,8
@@
OPCODE(0x5AC8)
u32 adr, res;
u32 src, dst;
u32 adr, res;
u32 src, dst;
+ NOT_POLLING
+
if (flag_N & 0x80)
{
res = DREGu16((Opcode >> 0) & 7);
if (flag_N & 0x80)
{
res = DREGu16((Opcode >> 0) & 7);
@@
-23600,6
+23649,8
@@
OPCODE(0x5BC8)
u32 adr, res;
u32 src, dst;
u32 adr, res;
u32 src, dst;
+ NOT_POLLING
+
if (!(flag_N & 0x80))
{
res = DREGu16((Opcode >> 0) & 7);
if (!(flag_N & 0x80))
{
res = DREGu16((Opcode >> 0) & 7);
@@
-23631,6
+23682,8
@@
OPCODE(0x5CC8)
u32 adr, res;
u32 src, dst;
u32 adr, res;
u32 src, dst;
+ NOT_POLLING
+
if ((flag_N ^ flag_V) & 0x80)
{
res = DREGu16((Opcode >> 0) & 7);
if ((flag_N ^ flag_V) & 0x80)
{
res = DREGu16((Opcode >> 0) & 7);
@@
-23662,6
+23715,8
@@
OPCODE(0x5DC8)
u32 adr, res;
u32 src, dst;
u32 adr, res;
u32 src, dst;
+ NOT_POLLING
+
if (!((flag_N ^ flag_V) & 0x80))
{
res = DREGu16((Opcode >> 0) & 7);
if (!((flag_N ^ flag_V) & 0x80))
{
res = DREGu16((Opcode >> 0) & 7);
@@
-23693,6
+23748,8
@@
OPCODE(0x5EC8)
u32 adr, res;
u32 src, dst;
u32 adr, res;
u32 src, dst;
+ NOT_POLLING
+
if ((!flag_NotZ) || ((flag_N ^ flag_V) & 0x80))
{
res = DREGu16((Opcode >> 0) & 7);
if ((!flag_NotZ) || ((flag_N ^ flag_V) & 0x80))
{
res = DREGu16((Opcode >> 0) & 7);
@@
-23724,6
+23781,8
@@
OPCODE(0x5FC8)
u32 adr, res;
u32 src, dst;
u32 adr, res;
u32 src, dst;
+ NOT_POLLING
+
if (flag_NotZ && (!((flag_N ^ flag_V) & 0x80)))
{
res = DREGu16((Opcode >> 0) & 7);
if (flag_NotZ && (!((flag_N ^ flag_V) & 0x80)))
{
res = DREGu16((Opcode >> 0) & 7);
@@
-26898,19
+26957,19
@@
OPCODE(0x8100)
{
u32 adr, res;
u32 src, dst;
{
u32 adr, res;
u32 src, dst;
+ u32 corf = 0;
src = DREGu8((Opcode >> 0) & 7);
dst = DREGu8((Opcode >> 9) & 7);
res = (dst & 0xF) - (src & 0xF) - ((flag_X >> M68K_SR_X_SFT) & 1);
src = DREGu8((Opcode >> 0) & 7);
dst = DREGu8((Opcode >> 9) & 7);
res = (dst & 0xF) - (src & 0xF) - ((flag_X >> M68K_SR_X_SFT) & 1);
- if (res >
9) res -
= 6;
+ if (res >
0xF) corf
= 6;
res += (dst & 0xF0) - (src & 0xF0);
res += (dst & 0xF0) - (src & 0xF0);
- if (res > 0x99)
- {
- res += 0xA0;
- flag_X = flag_C = M68K_SR_C;
- }
- else flag_X = flag_C = 0;
- flag_NotZ |= res & 0xFF;
+ flag_V = res;
+ flag_X = flag_C = (s32)res < (s32)corf ? M68K_SR_C : 0;
+ if (res > 0xff) res += 0xA0;
+ res = (res - corf) & 0xFF;
+ flag_V &= ~res;
+ flag_NotZ |= res;
flag_N = res;
DREGu8((Opcode >> 9) & 7) = res;
RET(6)
flag_N = res;
DREGu8((Opcode >> 9) & 7) = res;
RET(6)
@@
-26921,6
+26980,7
@@
OPCODE(0x8108)
{
u32 adr, res;
u32 src, dst;
{
u32 adr, res;
u32 src, dst;
+ u32 corf = 0;
adr = AREG((Opcode >> 0) & 7) - 1;
AREG((Opcode >> 0) & 7) = adr;
adr = AREG((Opcode >> 0) & 7) - 1;
AREG((Opcode >> 0) & 7) = adr;
@@
-26930,15
+26990,14
@@
OPCODE(0x8108)
AREG((Opcode >> 9) & 7) = adr;
READ_BYTE_F(adr, dst)
res = (dst & 0xF) - (src & 0xF) - ((flag_X >> M68K_SR_X_SFT) & 1);
AREG((Opcode >> 9) & 7) = adr;
READ_BYTE_F(adr, dst)
res = (dst & 0xF) - (src & 0xF) - ((flag_X >> M68K_SR_X_SFT) & 1);
- if (res >
9) res -
= 6;
+ if (res >
0xF) corf
= 6;
res += (dst & 0xF0) - (src & 0xF0);
res += (dst & 0xF0) - (src & 0xF0);
- if (res > 0x99)
- {
- res += 0xA0;
- flag_X = flag_C = M68K_SR_C;
- }
- else flag_X = flag_C = 0;
- flag_NotZ |= res & 0xFF;
+ flag_V = res;
+ flag_X = flag_C = (s32)res < (s32)corf ? M68K_SR_C : 0;
+ if (res > 0xff) res += 0xA0;
+ res = (res - corf) & 0xFF;
+ flag_V &= ~res;
+ flag_NotZ |= res;
flag_N = res;
WRITE_BYTE_F(adr, res)
POST_IO
flag_N = res;
WRITE_BYTE_F(adr, res)
POST_IO
@@
-26950,6
+27009,7
@@
OPCODE(0x810F)
{
u32 adr, res;
u32 src, dst;
{
u32 adr, res;
u32 src, dst;
+ u32 corf = 0;
adr = AREG(7) - 2;
AREG(7) = adr;
adr = AREG(7) - 2;
AREG(7) = adr;
@@
-26959,15
+27019,14
@@
OPCODE(0x810F)
AREG((Opcode >> 9) & 7) = adr;
READ_BYTE_F(adr, dst)
res = (dst & 0xF) - (src & 0xF) - ((flag_X >> M68K_SR_X_SFT) & 1);
AREG((Opcode >> 9) & 7) = adr;
READ_BYTE_F(adr, dst)
res = (dst & 0xF) - (src & 0xF) - ((flag_X >> M68K_SR_X_SFT) & 1);
- if (res >
9) res -
= 6;
+ if (res >
0xF) corf
= 6;
res += (dst & 0xF0) - (src & 0xF0);
res += (dst & 0xF0) - (src & 0xF0);
- if (res > 0x99)
- {
- res += 0xA0;
- flag_X = flag_C = M68K_SR_C;
- }
- else flag_X = flag_C = 0;
- flag_NotZ |= res & 0xFF;
+ flag_V = res;
+ flag_X = flag_C = (s32)res < (s32)corf ? M68K_SR_C : 0;
+ if (res > 0xff) res += 0xA0;
+ res = (res - corf) & 0xFF;
+ flag_V &= ~res;
+ flag_NotZ |= res;
flag_N = res;
WRITE_BYTE_F(adr, res)
POST_IO
flag_N = res;
WRITE_BYTE_F(adr, res)
POST_IO
@@
-26979,6
+27038,7
@@
OPCODE(0x8F08)
{
u32 adr, res;
u32 src, dst;
{
u32 adr, res;
u32 src, dst;
+ u32 corf = 0;
adr = AREG((Opcode >> 0) & 7) - 1;
AREG((Opcode >> 0) & 7) = adr;
adr = AREG((Opcode >> 0) & 7) - 1;
AREG((Opcode >> 0) & 7) = adr;
@@
-26988,15
+27048,14
@@
OPCODE(0x8F08)
AREG(7) = adr;
READ_BYTE_F(adr, dst)
res = (dst & 0xF) - (src & 0xF) - ((flag_X >> M68K_SR_X_SFT) & 1);
AREG(7) = adr;
READ_BYTE_F(adr, dst)
res = (dst & 0xF) - (src & 0xF) - ((flag_X >> M68K_SR_X_SFT) & 1);
- if (res >
9) res -
= 6;
+ if (res >
0xF) corf
= 6;
res += (dst & 0xF0) - (src & 0xF0);
res += (dst & 0xF0) - (src & 0xF0);
- if (res > 0x99)
- {
- res += 0xA0;
- flag_X = flag_C = M68K_SR_C;
- }
- else flag_X = flag_C = 0;
- flag_NotZ |= res & 0xFF;
+ flag_V = res;
+ flag_X = flag_C = (s32)res < (s32)corf ? M68K_SR_C : 0;
+ if (res > 0xff) res += 0xA0;
+ res = (res - corf) & 0xFF;
+ flag_V &= ~res;
+ flag_NotZ |= res;
flag_N = res;
WRITE_BYTE_F(adr, res)
POST_IO
flag_N = res;
WRITE_BYTE_F(adr, res)
POST_IO
@@
-27008,6
+27067,7
@@
OPCODE(0x8F0F)
{
u32 adr, res;
u32 src, dst;
{
u32 adr, res;
u32 src, dst;
+ u32 corf = 0;
adr = AREG(7) - 2;
AREG(7) = adr;
adr = AREG(7) - 2;
AREG(7) = adr;
@@
-27017,15
+27077,14
@@
OPCODE(0x8F0F)
AREG(7) = adr;
READ_BYTE_F(adr, dst)
res = (dst & 0xF) - (src & 0xF) - ((flag_X >> M68K_SR_X_SFT) & 1);
AREG(7) = adr;
READ_BYTE_F(adr, dst)
res = (dst & 0xF) - (src & 0xF) - ((flag_X >> M68K_SR_X_SFT) & 1);
- if (res >
9) res -
= 6;
+ if (res >
0xF) corf
= 6;
res += (dst & 0xF0) - (src & 0xF0);
res += (dst & 0xF0) - (src & 0xF0);
- if (res > 0x99)
- {
- res += 0xA0;
- flag_X = flag_C = M68K_SR_C;
- }
- else flag_X = flag_C = 0;
- flag_NotZ |= res & 0xFF;
+ flag_V = res;
+ flag_X = flag_C = (s32)res < (s32)corf ? M68K_SR_C : 0;
+ if (res > 0xff) res += 0xA0;
+ res = (res - corf) & 0xFF;
+ flag_V &= ~res;
+ flag_NotZ |= res;
flag_N = res;
WRITE_BYTE_F(adr, res)
POST_IO
flag_N = res;
WRITE_BYTE_F(adr, res)
POST_IO
@@
-27383,7
+27442,7
@@
OPCODE(0x80F9)
{
SET_PC(execute_exception(M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
#ifdef USE_CYCLONE_TIMING_DIV
{
SET_PC(execute_exception(M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
#ifdef USE_CYCLONE_TIMING_DIV
-RET(1
6
2)
+RET(1
5
2)
#else
RET(22)
#endif
#else
RET(22)
#endif
@@
-27399,7
+27458,7
@@
RET(22)
{
flag_V = M68K_SR_V;
#ifdef USE_CYCLONE_TIMING_DIV
{
flag_V = M68K_SR_V;
#ifdef USE_CYCLONE_TIMING_DIV
-RET(1
6
2)
+RET(1
5
2)
#else
RET(82)
#endif
#else
RET(82)
#endif
@@
-27412,7
+27471,7
@@
RET(162)
DREGu32((Opcode >> 9) & 7) = res;
}
#ifdef USE_CYCLONE_TIMING_DIV
DREGu32((Opcode >> 9) & 7) = res;
}
#ifdef USE_CYCLONE_TIMING_DIV
-RET(1
6
2)
+RET(1
5
2)
#else
RET(102)
#endif
#else
RET(102)
#endif
@@
-27481,7
+27540,7
@@
OPCODE(0x80FB)
{
SET_PC(execute_exception(M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
#ifdef USE_CYCLONE_TIMING_DIV
{
SET_PC(execute_exception(M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
#ifdef USE_CYCLONE_TIMING_DIV
-RET(1
6
0)
+RET(1
5
0)
#else
RET(20)
#endif
#else
RET(20)
#endif
@@
-27497,7
+27556,7
@@
RET(20)
{
flag_V = M68K_SR_V;
#ifdef USE_CYCLONE_TIMING_DIV
{
flag_V = M68K_SR_V;
#ifdef USE_CYCLONE_TIMING_DIV
-RET(1
6
0)
+RET(1
5
0)
#else
RET(80)
#endif
#else
RET(80)
#endif
@@
-27510,7
+27569,7
@@
RET(160)
DREGu32((Opcode >> 9) & 7) = res;
}
#ifdef USE_CYCLONE_TIMING_DIV
DREGu32((Opcode >> 9) & 7) = res;
}
#ifdef USE_CYCLONE_TIMING_DIV
-RET(1
6
0)
+RET(1
5
0)
#else
RET(100)
#endif
#else
RET(100)
#endif
@@
-34085,18
+34144,22
@@
OPCODE(0xC100)
{
u32 adr, res;
u32 src, dst;
{
u32 adr, res;
u32 src, dst;
+ u32 corf = 0;
src = DREGu8((Opcode >> 0) & 7);
dst = DREGu8((Opcode >> 9) & 7);
res = (dst & 0xF) + (src & 0xF) + ((flag_X >> M68K_SR_X_SFT) & 1);
src = DREGu8((Opcode >> 0) & 7);
dst = DREGu8((Opcode >> 9) & 7);
res = (dst & 0xF) + (src & 0xF) + ((flag_X >> M68K_SR_X_SFT) & 1);
- if (res > 9)
res +
= 6;
+ if (res > 9)
corf
= 6;
res += (dst & 0xF0) + (src & 0xF0);
res += (dst & 0xF0) + (src & 0xF0);
- if (res > 0x99)
+ flag_V = ~res;
+ res += corf;
+ if (res > 0x9F)
{
res -= 0xA0;
flag_X = flag_C = M68K_SR_C;
}
else flag_X = flag_C = 0;
{
res -= 0xA0;
flag_X = flag_C = M68K_SR_C;
}
else flag_X = flag_C = 0;
+ flag_V &= res;
flag_NotZ |= res & 0xFF;
flag_N = res;
DREGu8((Opcode >> 9) & 7) = res;
flag_NotZ |= res & 0xFF;
flag_N = res;
DREGu8((Opcode >> 9) & 7) = res;
@@
-34108,6
+34171,7
@@
OPCODE(0xC108)
{
u32 adr, res;
u32 src, dst;
{
u32 adr, res;
u32 src, dst;
+ u32 corf = 0;
adr = AREG((Opcode >> 0) & 7) - 1;
AREG((Opcode >> 0) & 7) = adr;
adr = AREG((Opcode >> 0) & 7) - 1;
AREG((Opcode >> 0) & 7) = adr;
@@
-34117,14
+34181,17
@@
OPCODE(0xC108)
AREG((Opcode >> 9) & 7) = adr;
READ_BYTE_F(adr, dst)
res = (dst & 0xF) + (src & 0xF) + ((flag_X >> M68K_SR_X_SFT) & 1);
AREG((Opcode >> 9) & 7) = adr;
READ_BYTE_F(adr, dst)
res = (dst & 0xF) + (src & 0xF) + ((flag_X >> M68K_SR_X_SFT) & 1);
- if (res > 9)
res +
= 6;
+ if (res > 9)
corf
= 6;
res += (dst & 0xF0) + (src & 0xF0);
res += (dst & 0xF0) + (src & 0xF0);
- if (res > 0x99)
+ flag_V = ~res;
+ res += corf;
+ if (res > 0x9F)
{
res -= 0xA0;
flag_X = flag_C = M68K_SR_C;
}
else flag_X = flag_C = 0;
{
res -= 0xA0;
flag_X = flag_C = M68K_SR_C;
}
else flag_X = flag_C = 0;
+ flag_V &= res;
flag_NotZ |= res & 0xFF;
flag_N = res;
WRITE_BYTE_F(adr, res)
flag_NotZ |= res & 0xFF;
flag_N = res;
WRITE_BYTE_F(adr, res)
@@
-34137,6
+34204,7
@@
OPCODE(0xC10F)
{
u32 adr, res;
u32 src, dst;
{
u32 adr, res;
u32 src, dst;
+ u32 corf = 0;
adr = AREG(7) - 2;
AREG(7) = adr;
adr = AREG(7) - 2;
AREG(7) = adr;
@@
-34146,14
+34214,17
@@
OPCODE(0xC10F)
AREG((Opcode >> 9) & 7) = adr;
READ_BYTE_F(adr, dst)
res = (dst & 0xF) + (src & 0xF) + ((flag_X >> M68K_SR_X_SFT) & 1);
AREG((Opcode >> 9) & 7) = adr;
READ_BYTE_F(adr, dst)
res = (dst & 0xF) + (src & 0xF) + ((flag_X >> M68K_SR_X_SFT) & 1);
- if (res > 9)
res +
= 6;
+ if (res > 9)
corf
= 6;
res += (dst & 0xF0) + (src & 0xF0);
res += (dst & 0xF0) + (src & 0xF0);
- if (res > 0x99)
+ flag_V = ~res;
+ res += corf;
+ if (res > 0x9F)
{
res -= 0xA0;
flag_X = flag_C = M68K_SR_C;
}
else flag_X = flag_C = 0;
{
res -= 0xA0;
flag_X = flag_C = M68K_SR_C;
}
else flag_X = flag_C = 0;
+ flag_V &= res;
flag_NotZ |= res & 0xFF;
flag_N = res;
WRITE_BYTE_F(adr, res)
flag_NotZ |= res & 0xFF;
flag_N = res;
WRITE_BYTE_F(adr, res)
@@
-34166,6
+34237,7
@@
OPCODE(0xCF08)
{
u32 adr, res;
u32 src, dst;
{
u32 adr, res;
u32 src, dst;
+ u32 corf = 0;
adr = AREG((Opcode >> 0) & 7) - 1;
AREG((Opcode >> 0) & 7) = adr;
adr = AREG((Opcode >> 0) & 7) - 1;
AREG((Opcode >> 0) & 7) = adr;
@@
-34175,14
+34247,17
@@
OPCODE(0xCF08)
AREG(7) = adr;
READ_BYTE_F(adr, dst)
res = (dst & 0xF) + (src & 0xF) + ((flag_X >> M68K_SR_X_SFT) & 1);
AREG(7) = adr;
READ_BYTE_F(adr, dst)
res = (dst & 0xF) + (src & 0xF) + ((flag_X >> M68K_SR_X_SFT) & 1);
- if (res > 9)
res +
= 6;
+ if (res > 9)
corf
= 6;
res += (dst & 0xF0) + (src & 0xF0);
res += (dst & 0xF0) + (src & 0xF0);
- if (res > 0x99)
+ flag_V = ~res;
+ res += corf;
+ if (res > 0x9F)
{
res -= 0xA0;
flag_X = flag_C = M68K_SR_C;
}
else flag_X = flag_C = 0;
{
res -= 0xA0;
flag_X = flag_C = M68K_SR_C;
}
else flag_X = flag_C = 0;
+ flag_V &= res;
flag_NotZ |= res & 0xFF;
flag_N = res;
WRITE_BYTE_F(adr, res)
flag_NotZ |= res & 0xFF;
flag_N = res;
WRITE_BYTE_F(adr, res)
@@
-34195,6
+34270,7
@@
OPCODE(0xCF0F)
{
u32 adr, res;
u32 src, dst;
{
u32 adr, res;
u32 src, dst;
+ u32 corf = 0;
adr = AREG(7) - 2;
AREG(7) = adr;
adr = AREG(7) - 2;
AREG(7) = adr;
@@
-34204,14
+34280,17
@@
OPCODE(0xCF0F)
AREG(7) = adr;
READ_BYTE_F(adr, dst)
res = (dst & 0xF) + (src & 0xF) + ((flag_X >> M68K_SR_X_SFT) & 1);
AREG(7) = adr;
READ_BYTE_F(adr, dst)
res = (dst & 0xF) + (src & 0xF) + ((flag_X >> M68K_SR_X_SFT) & 1);
- if (res > 9)
res +
= 6;
+ if (res > 9)
corf
= 6;
res += (dst & 0xF0) + (src & 0xF0);
res += (dst & 0xF0) + (src & 0xF0);
- if (res > 0x99)
+ flag_V = ~res;
+ res += corf;
+ if (res > 0x9F)
{
res -= 0xA0;
flag_X = flag_C = M68K_SR_C;
}
else flag_X = flag_C = 0;
{
res -= 0xA0;
flag_X = flag_C = M68K_SR_C;
}
else flag_X = flag_C = 0;
+ flag_V &= res;
flag_NotZ |= res & 0xFF;
flag_N = res;
WRITE_BYTE_F(adr, res)
flag_NotZ |= res & 0xFF;
flag_N = res;
WRITE_BYTE_F(adr, res)