X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=cpu%2Ffame%2Ffamec_opcodes.h;h=99ba3791edabe9aa206af6cab41d13ec84a02e8e;hb=c6e1e9779a5652b58ae638e40f4b01ccb223b0d0;hp=8586603b2c9369b952326378c5a67856b1be4c4c;hpb=d0ae0cb4bb73e6e2fc10e7b19a5a72a012db6d6a;p=picodrive.git diff --git a/cpu/fame/famec_opcodes.h b/cpu/fame/famec_opcodes.h index 8586603..99ba379 100644 --- 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) { @@ -3826,7 +3832,7 @@ OPCODE(0x083A) FETCH_BYTE(src); src = 1 << (src & 7); - adr = GET_SWORD + ((u32)(PC) - BasePC); + adr = GET_SWORD + GET_PC; PC++; PRE_IO READ_BYTE_F(adr, res) @@ -3843,7 +3849,7 @@ OPCODE(0x083B) FETCH_BYTE(src); src = 1 << (src & 7); - adr = (u32)(PC) - BasePC; + adr = (uptr)(PC) - BasePC; DECODE_EXT_WORD PRE_IO READ_BYTE_F(adr, res) @@ -4572,7 +4578,7 @@ OPCODE(0x013A) src = DREGu8((Opcode >> 9) & 7); src = 1 << (src & 7); - adr = GET_SWORD + ((u32)(PC) - BasePC); + adr = GET_SWORD + GET_PC; PC++; PRE_IO READ_BYTE_F(adr, res) @@ -4589,7 +4595,7 @@ OPCODE(0x013B) src = DREGu8((Opcode >> 9) & 7); src = 1 << (src & 7); - adr = (u32)(PC) - BasePC; + adr = (uptr)(PC) - BasePC; DECODE_EXT_WORD PRE_IO READ_BYTE_F(adr, res) @@ -7116,7 +7122,7 @@ OPCODE(0x103A) u32 adr, res; u32 src, dst; - adr = GET_SWORD + ((u32)(PC) - BasePC); + adr = GET_SWORD + GET_PC; PC++; PRE_IO READ_BYTE_F(adr, res) @@ -7135,7 +7141,7 @@ OPCODE(0x10BA) u32 adr, res; u32 src, dst; - adr = GET_SWORD + ((u32)(PC) - BasePC); + adr = GET_SWORD + GET_PC; PC++; PRE_IO READ_BYTE_F(adr, res) @@ -7155,7 +7161,7 @@ OPCODE(0x10FA) u32 adr, res; u32 src, dst; - adr = GET_SWORD + ((u32)(PC) - BasePC); + adr = GET_SWORD + GET_PC; PC++; PRE_IO READ_BYTE_F(adr, res) @@ -7176,7 +7182,7 @@ OPCODE(0x113A) u32 adr, res; u32 src, dst; - adr = GET_SWORD + ((u32)(PC) - BasePC); + adr = GET_SWORD + GET_PC; PC++; PRE_IO READ_BYTE_F(adr, res) @@ -7197,7 +7203,7 @@ OPCODE(0x117A) u32 adr, res; u32 src, dst; - adr = GET_SWORD + ((u32)(PC) - BasePC); + adr = GET_SWORD + GET_PC; PC++; PRE_IO READ_BYTE_F(adr, res) @@ -7218,7 +7224,7 @@ OPCODE(0x11BA) u32 adr, res; u32 src, dst; - adr = GET_SWORD + ((u32)(PC) - BasePC); + adr = GET_SWORD + GET_PC; PC++; PRE_IO READ_BYTE_F(adr, res) @@ -7239,7 +7245,7 @@ OPCODE(0x11FA) u32 adr, res; u32 src, dst; - adr = GET_SWORD + ((u32)(PC) - BasePC); + adr = GET_SWORD + GET_PC; PC++; PRE_IO READ_BYTE_F(adr, res) @@ -7259,7 +7265,7 @@ OPCODE(0x13FA) u32 adr, res; u32 src, dst; - adr = GET_SWORD + ((u32)(PC) - BasePC); + adr = GET_SWORD + GET_PC; PC++; PRE_IO READ_BYTE_F(adr, res) @@ -7279,7 +7285,7 @@ OPCODE(0x1EFA) u32 adr, res; u32 src, dst; - adr = GET_SWORD + ((u32)(PC) - BasePC); + adr = GET_SWORD + GET_PC; PC++; PRE_IO READ_BYTE_F(adr, res) @@ -7300,7 +7306,7 @@ OPCODE(0x1F3A) u32 adr, res; u32 src, dst; - adr = GET_SWORD + ((u32)(PC) - BasePC); + adr = GET_SWORD + GET_PC; PC++; PRE_IO READ_BYTE_F(adr, res) @@ -7321,7 +7327,7 @@ OPCODE(0x103B) u32 adr, res; u32 src, dst; - adr = (u32)(PC) - BasePC; + adr = (uptr)(PC) - BasePC; DECODE_EXT_WORD PRE_IO READ_BYTE_F(adr, res) @@ -7340,7 +7346,7 @@ OPCODE(0x10BB) u32 adr, res; u32 src, dst; - adr = (u32)(PC) - BasePC; + adr = (uptr)(PC) - BasePC; DECODE_EXT_WORD PRE_IO READ_BYTE_F(adr, res) @@ -7360,7 +7366,7 @@ OPCODE(0x10FB) u32 adr, res; u32 src, dst; - adr = (u32)(PC) - BasePC; + adr = (uptr)(PC) - BasePC; DECODE_EXT_WORD PRE_IO READ_BYTE_F(adr, res) @@ -7381,7 +7387,7 @@ OPCODE(0x113B) u32 adr, res; u32 src, dst; - adr = (u32)(PC) - BasePC; + adr = (uptr)(PC) - BasePC; DECODE_EXT_WORD PRE_IO READ_BYTE_F(adr, res) @@ -7402,7 +7408,7 @@ OPCODE(0x117B) u32 adr, res; u32 src, dst; - adr = (u32)(PC) - BasePC; + adr = (uptr)(PC) - BasePC; DECODE_EXT_WORD PRE_IO READ_BYTE_F(adr, res) @@ -7423,7 +7429,7 @@ OPCODE(0x11BB) u32 adr, res; u32 src, dst; - adr = (u32)(PC) - BasePC; + adr = (uptr)(PC) - BasePC; DECODE_EXT_WORD PRE_IO READ_BYTE_F(adr, res) @@ -7444,7 +7450,7 @@ OPCODE(0x11FB) u32 adr, res; u32 src, dst; - adr = (u32)(PC) - BasePC; + adr = (uptr)(PC) - BasePC; DECODE_EXT_WORD PRE_IO READ_BYTE_F(adr, res) @@ -7464,7 +7470,7 @@ OPCODE(0x13FB) u32 adr, res; u32 src, dst; - adr = (u32)(PC) - BasePC; + adr = (uptr)(PC) - BasePC; DECODE_EXT_WORD PRE_IO READ_BYTE_F(adr, res) @@ -7484,7 +7490,7 @@ OPCODE(0x1EFB) u32 adr, res; u32 src, dst; - adr = (u32)(PC) - BasePC; + adr = (uptr)(PC) - BasePC; DECODE_EXT_WORD PRE_IO READ_BYTE_F(adr, res) @@ -7505,7 +7511,7 @@ OPCODE(0x1F3B) u32 adr, res; u32 src, dst; - adr = (u32)(PC) - BasePC; + adr = (uptr)(PC) - BasePC; DECODE_EXT_WORD PRE_IO READ_BYTE_F(adr, res) @@ -9890,7 +9896,7 @@ OPCODE(0x203A) u32 adr, res; u32 src, dst; - adr = GET_SWORD + ((u32)(PC) - BasePC); + adr = GET_SWORD + GET_PC; PC++; PRE_IO READ_LONG_F(adr, res) @@ -9909,7 +9915,7 @@ OPCODE(0x20BA) u32 adr, res; u32 src, dst; - adr = GET_SWORD + ((u32)(PC) - BasePC); + adr = GET_SWORD + GET_PC; PC++; PRE_IO READ_LONG_F(adr, res) @@ -9929,7 +9935,7 @@ OPCODE(0x20FA) u32 adr, res; u32 src, dst; - adr = GET_SWORD + ((u32)(PC) - BasePC); + adr = GET_SWORD + GET_PC; PC++; PRE_IO READ_LONG_F(adr, res) @@ -9950,7 +9956,7 @@ OPCODE(0x213A) u32 adr, res; u32 src, dst; - adr = GET_SWORD + ((u32)(PC) - BasePC); + adr = GET_SWORD + GET_PC; PC++; PRE_IO READ_LONG_F(adr, res) @@ -9971,7 +9977,7 @@ OPCODE(0x217A) u32 adr, res; u32 src, dst; - adr = GET_SWORD + ((u32)(PC) - BasePC); + adr = GET_SWORD + GET_PC; PC++; PRE_IO READ_LONG_F(adr, res) @@ -9992,7 +9998,7 @@ OPCODE(0x21BA) u32 adr, res; u32 src, dst; - adr = GET_SWORD + ((u32)(PC) - BasePC); + adr = GET_SWORD + GET_PC; PC++; PRE_IO READ_LONG_F(adr, res) @@ -10013,7 +10019,7 @@ OPCODE(0x21FA) u32 adr, res; u32 src, dst; - adr = GET_SWORD + ((u32)(PC) - BasePC); + adr = GET_SWORD + GET_PC; PC++; PRE_IO READ_LONG_F(adr, res) @@ -10033,7 +10039,7 @@ OPCODE(0x23FA) u32 adr, res; u32 src, dst; - adr = GET_SWORD + ((u32)(PC) - BasePC); + adr = GET_SWORD + GET_PC; PC++; PRE_IO READ_LONG_F(adr, res) @@ -10053,7 +10059,7 @@ OPCODE(0x2EFA) u32 adr, res; u32 src, dst; - adr = GET_SWORD + ((u32)(PC) - BasePC); + adr = GET_SWORD + GET_PC; PC++; PRE_IO READ_LONG_F(adr, res) @@ -10074,7 +10080,7 @@ OPCODE(0x2F3A) u32 adr, res; u32 src, dst; - adr = GET_SWORD + ((u32)(PC) - BasePC); + adr = GET_SWORD + GET_PC; PC++; PRE_IO READ_LONG_F(adr, res) @@ -10095,7 +10101,7 @@ OPCODE(0x203B) u32 adr, res; u32 src, dst; - adr = (u32)(PC) - BasePC; + adr = GET_PC; DECODE_EXT_WORD PRE_IO READ_LONG_F(adr, res) @@ -10114,7 +10120,7 @@ OPCODE(0x20BB) u32 adr, res; u32 src, dst; - adr = (u32)(PC) - BasePC; + adr = GET_PC; DECODE_EXT_WORD PRE_IO READ_LONG_F(adr, res) @@ -10134,7 +10140,7 @@ OPCODE(0x20FB) u32 adr, res; u32 src, dst; - adr = (u32)(PC) - BasePC; + adr = GET_PC; DECODE_EXT_WORD PRE_IO READ_LONG_F(adr, res) @@ -10155,7 +10161,7 @@ OPCODE(0x213B) u32 adr, res; u32 src, dst; - adr = (u32)(PC) - BasePC; + adr = GET_PC; DECODE_EXT_WORD PRE_IO READ_LONG_F(adr, res) @@ -10176,7 +10182,7 @@ OPCODE(0x217B) u32 adr, res; u32 src, dst; - adr = (u32)(PC) - BasePC; + adr = GET_PC; DECODE_EXT_WORD PRE_IO READ_LONG_F(adr, res) @@ -10197,7 +10203,7 @@ OPCODE(0x21BB) u32 adr, res; u32 src, dst; - adr = (u32)(PC) - BasePC; + adr = GET_PC; DECODE_EXT_WORD PRE_IO READ_LONG_F(adr, res) @@ -10218,7 +10224,7 @@ OPCODE(0x21FB) u32 adr, res; u32 src, dst; - adr = (u32)(PC) - BasePC; + adr = GET_PC; DECODE_EXT_WORD PRE_IO READ_LONG_F(adr, res) @@ -10238,7 +10244,7 @@ OPCODE(0x23FB) u32 adr, res; u32 src, dst; - adr = (u32)(PC) - BasePC; + adr = GET_PC; DECODE_EXT_WORD PRE_IO READ_LONG_F(adr, res) @@ -10258,7 +10264,7 @@ OPCODE(0x2EFB) u32 adr, res; u32 src, dst; - adr = (u32)(PC) - BasePC; + adr = GET_PC; DECODE_EXT_WORD PRE_IO READ_LONG_F(adr, res) @@ -10279,7 +10285,7 @@ OPCODE(0x2F3B) u32 adr, res; u32 src, dst; - adr = (u32)(PC) - BasePC; + adr = GET_PC; DECODE_EXT_WORD PRE_IO READ_LONG_F(adr, res) @@ -11017,7 +11023,7 @@ OPCODE(0x207A) u32 adr, res; u32 src, dst; - adr = GET_SWORD + ((u32)(PC) - BasePC); + adr = GET_SWORD + GET_PC; PC++; PRE_IO READSX_LONG_F(adr, res) @@ -11032,7 +11038,7 @@ OPCODE(0x207B) u32 adr, res; u32 src, dst; - adr = (u32)(PC) - BasePC; + adr = GET_PC; DECODE_EXT_WORD PRE_IO READSX_LONG_F(adr, res) @@ -12859,7 +12865,7 @@ OPCODE(0x303A) u32 adr, res; u32 src, dst; - adr = GET_SWORD + ((u32)(PC) - BasePC); + adr = GET_SWORD + GET_PC; PC++; PRE_IO READ_WORD_F(adr, res) @@ -12878,7 +12884,7 @@ OPCODE(0x30BA) u32 adr, res; u32 src, dst; - adr = GET_SWORD + ((u32)(PC) - BasePC); + adr = GET_SWORD + GET_PC; PC++; PRE_IO READ_WORD_F(adr, res) @@ -12898,7 +12904,7 @@ OPCODE(0x30FA) u32 adr, res; u32 src, dst; - adr = GET_SWORD + ((u32)(PC) - BasePC); + adr = GET_SWORD + GET_PC; PC++; PRE_IO READ_WORD_F(adr, res) @@ -12919,7 +12925,7 @@ OPCODE(0x313A) u32 adr, res; u32 src, dst; - adr = GET_SWORD + ((u32)(PC) - BasePC); + adr = GET_SWORD + GET_PC; PC++; PRE_IO READ_WORD_F(adr, res) @@ -12940,7 +12946,7 @@ OPCODE(0x317A) u32 adr, res; u32 src, dst; - adr = GET_SWORD + ((u32)(PC) - BasePC); + adr = GET_SWORD + GET_PC; PC++; PRE_IO READ_WORD_F(adr, res) @@ -12961,7 +12967,7 @@ OPCODE(0x31BA) u32 adr, res; u32 src, dst; - adr = GET_SWORD + ((u32)(PC) - BasePC); + adr = GET_SWORD + GET_PC; PC++; PRE_IO READ_WORD_F(adr, res) @@ -12982,7 +12988,7 @@ OPCODE(0x31FA) u32 adr, res; u32 src, dst; - adr = GET_SWORD + ((u32)(PC) - BasePC); + adr = GET_SWORD + GET_PC; PC++; PRE_IO READ_WORD_F(adr, res) @@ -13002,7 +13008,7 @@ OPCODE(0x33FA) u32 adr, res; u32 src, dst; - adr = GET_SWORD + ((u32)(PC) - BasePC); + adr = GET_SWORD + GET_PC; PC++; PRE_IO READ_WORD_F(adr, res) @@ -13022,7 +13028,7 @@ OPCODE(0x3EFA) u32 adr, res; u32 src, dst; - adr = GET_SWORD + ((u32)(PC) - BasePC); + adr = GET_SWORD + GET_PC; PC++; PRE_IO READ_WORD_F(adr, res) @@ -13043,7 +13049,7 @@ OPCODE(0x3F3A) u32 adr, res; u32 src, dst; - adr = GET_SWORD + ((u32)(PC) - BasePC); + adr = GET_SWORD + GET_PC; PC++; PRE_IO READ_WORD_F(adr, res) @@ -13064,7 +13070,7 @@ OPCODE(0x303B) u32 adr, res; u32 src, dst; - adr = (u32)(PC) - BasePC; + adr = GET_PC; DECODE_EXT_WORD PRE_IO READ_WORD_F(adr, res) @@ -13083,7 +13089,7 @@ OPCODE(0x30BB) u32 adr, res; u32 src, dst; - adr = (u32)(PC) - BasePC; + adr = GET_PC; DECODE_EXT_WORD PRE_IO READ_WORD_F(adr, res) @@ -13103,7 +13109,7 @@ OPCODE(0x30FB) u32 adr, res; u32 src, dst; - adr = (u32)(PC) - BasePC; + adr = GET_PC; DECODE_EXT_WORD PRE_IO READ_WORD_F(adr, res) @@ -13124,7 +13130,7 @@ OPCODE(0x313B) u32 adr, res; u32 src, dst; - adr = (u32)(PC) - BasePC; + adr = GET_PC; DECODE_EXT_WORD PRE_IO READ_WORD_F(adr, res) @@ -13145,7 +13151,7 @@ OPCODE(0x317B) u32 adr, res; u32 src, dst; - adr = (u32)(PC) - BasePC; + adr = GET_PC; DECODE_EXT_WORD PRE_IO READ_WORD_F(adr, res) @@ -13166,7 +13172,7 @@ OPCODE(0x31BB) u32 adr, res; u32 src, dst; - adr = (u32)(PC) - BasePC; + adr = GET_PC; DECODE_EXT_WORD PRE_IO READ_WORD_F(adr, res) @@ -13187,7 +13193,7 @@ OPCODE(0x31FB) u32 adr, res; u32 src, dst; - adr = (u32)(PC) - BasePC; + adr = GET_PC; DECODE_EXT_WORD PRE_IO READ_WORD_F(adr, res) @@ -13207,7 +13213,7 @@ OPCODE(0x33FB) u32 adr, res; u32 src, dst; - adr = (u32)(PC) - BasePC; + adr = GET_PC; DECODE_EXT_WORD PRE_IO READ_WORD_F(adr, res) @@ -13227,7 +13233,7 @@ OPCODE(0x3EFB) u32 adr, res; u32 src, dst; - adr = (u32)(PC) - BasePC; + adr = GET_PC; DECODE_EXT_WORD PRE_IO READ_WORD_F(adr, res) @@ -13248,7 +13254,7 @@ OPCODE(0x3F3B) u32 adr, res; u32 src, dst; - adr = (u32)(PC) - BasePC; + adr = GET_PC; DECODE_EXT_WORD PRE_IO READ_WORD_F(adr, res) @@ -13986,7 +13992,7 @@ OPCODE(0x307A) u32 adr, res; u32 src, dst; - adr = GET_SWORD + ((u32)(PC) - BasePC); + adr = GET_SWORD + GET_PC; PC++; PRE_IO READSX_WORD_F(adr, res) @@ -14001,7 +14007,7 @@ OPCODE(0x307B) u32 adr, res; u32 src, dst; - adr = (u32)(PC) - BasePC; + adr = GET_PC; DECODE_EXT_WORD PRE_IO READSX_WORD_F(adr, res) @@ -16479,7 +16485,7 @@ OPCODE(0x44FA) u32 adr, res; u32 src, dst; - adr = GET_SWORD + ((u32)(PC) - BasePC); + adr = GET_SWORD + GET_PC; PC++; PRE_IO READ_WORD_F(adr, res) @@ -16494,7 +16500,7 @@ OPCODE(0x44FB) u32 adr, res; u32 src, dst; - adr = (u32)(PC) - BasePC; + adr = GET_PC; DECODE_EXT_WORD PRE_IO READ_WORD_F(adr, res) @@ -16786,7 +16792,7 @@ OPCODE(0x46FA) if (flag_S) { - adr = GET_SWORD + ((u32)(PC) - BasePC); + adr = GET_SWORD + GET_PC; PC++; PRE_IO READ_WORD_F(adr, res) @@ -16816,7 +16822,7 @@ OPCODE(0x46FB) if (flag_S) { - adr = (u32)(PC) - BasePC; + adr = GET_PC; DECODE_EXT_WORD PRE_IO READ_WORD_F(adr, res) @@ -16930,18 +16936,20 @@ OPCODE(0x4800) 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 != 0x9a) + 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; } - else flag_X = flag_C = 0; + else flag_V = flag_X = flag_C = 0; flag_N = res; RET(6) } @@ -16954,18 +16962,20 @@ OPCODE(0x4810) 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 != 0x9a) + 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; } - else flag_X = flag_C = 0; + else flag_V = flag_X = flag_C = 0; 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 - 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 != 0x9a) + 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; } - else flag_X = flag_C = 0; + else flag_V = flag_X = flag_C = 0; 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 - 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 != 0x9a) + 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; } - else flag_X = flag_C = 0; + else flag_V = flag_X = flag_C = 0; flag_N = res; POST_IO RET(14) @@ -17032,18 +17046,20 @@ OPCODE(0x4828) 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 != 0x9a) + 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; } - else flag_X = flag_C = 0; + else flag_V = flag_X = flag_C = 0; flag_N = res; POST_IO RET(16) @@ -17058,18 +17074,20 @@ OPCODE(0x4830) 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 != 0x9a) + 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; } - else flag_X = flag_C = 0; + else flag_V = flag_X = flag_C = 0; flag_N = res; POST_IO RET(18) @@ -17083,18 +17101,20 @@ OPCODE(0x4838) 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 != 0x9a) + 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; } - else flag_X = flag_C = 0; + else flag_V = flag_X = flag_C = 0; flag_N = res; POST_IO RET(16) @@ -17108,18 +17128,20 @@ OPCODE(0x4839) 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 != 0x9a) + 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; } - else flag_X = flag_C = 0; + else flag_V = flag_X = flag_C = 0; flag_N = res; POST_IO RET(20) @@ -17134,18 +17156,20 @@ OPCODE(0x481F) 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 != 0x9a) + 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; } - else flag_X = flag_C = 0; + else flag_V = flag_X = flag_C = 0; flag_N = res; POST_IO RET(12) @@ -17160,18 +17184,20 @@ OPCODE(0x4827) 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 != 0x9a) + 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; } - else flag_X = flag_C = 0; + else flag_V = flag_X = flag_C = 0; flag_N = res; POST_IO RET(14) @@ -17250,7 +17276,7 @@ OPCODE(0x487A) u32 adr, res; u32 src, dst; - adr = GET_SWORD + ((u32)(PC) - BasePC); + adr = GET_SWORD + GET_PC; PC++; PRE_IO PUSH_32_F(adr) @@ -17264,7 +17290,7 @@ OPCODE(0x487B) u32 adr, res; u32 src, dst; - adr = (u32)(PC) - BasePC; + adr = GET_PC; DECODE_EXT_WORD PRE_IO PUSH_32_F(adr) @@ -18292,8 +18318,19 @@ OPCODE(0x4AD0) flag_V = 0; flag_NotZ = res; flag_N = res; +#ifdef PICODRIVE_HACK + if (g_m68kcontext == &PicoCpuFS68k) { + res |= 0x80; + WRITE_BYTE_F(adr, res); + } +#endif + POST_IO +#ifdef USE_CYCLONE_TIMING +RET(18) +#else RET(8) +#endif } // TAS @@ -18310,8 +18347,20 @@ OPCODE(0x4AD8) flag_V = 0; flag_NotZ = res; flag_N = res; + +#ifdef PICODRIVE_HACK + if (g_m68kcontext == &PicoCpuFS68k) { + res |= 0x80; + WRITE_BYTE_F(adr, res); + } +#endif + POST_IO +#ifdef USE_CYCLONE_TIMING +RET(18) +#else RET(8) +#endif } // TAS @@ -18328,8 +18377,20 @@ OPCODE(0x4AE0) flag_V = 0; flag_NotZ = res; flag_N = res; + +#ifdef PICODRIVE_HACK + if (g_m68kcontext == &PicoCpuFS68k) { + res |= 0x80; + WRITE_BYTE_F(adr, res); + } +#endif + POST_IO +#ifdef USE_CYCLONE_TIMING +RET(20) +#else RET(10) +#endif } // TAS @@ -18346,8 +18407,20 @@ OPCODE(0x4AE8) flag_V = 0; flag_NotZ = res; flag_N = res; + +#ifdef PICODRIVE_HACK + if (g_m68kcontext == &PicoCpuFS68k) { + res |= 0x80; + WRITE_BYTE_F(adr, res); + } +#endif + POST_IO +#ifdef USE_CYCLONE_TIMING +RET(22) +#else RET(12) +#endif } // TAS @@ -18364,8 +18437,20 @@ OPCODE(0x4AF0) flag_V = 0; flag_NotZ = res; flag_N = res; + +#ifdef PICODRIVE_HACK + if (g_m68kcontext == &PicoCpuFS68k) { + res |= 0x80; + WRITE_BYTE_F(adr, res); + } +#endif + POST_IO +#ifdef USE_CYCLONE_TIMING +RET(24) +#else RET(14) +#endif } // TAS @@ -18381,8 +18466,20 @@ OPCODE(0x4AF8) flag_V = 0; flag_NotZ = res; flag_N = res; + +#ifdef PICODRIVE_HACK + if (g_m68kcontext == &PicoCpuFS68k) { + res |= 0x80; + WRITE_BYTE_F(adr, res); + } +#endif + POST_IO +#ifdef USE_CYCLONE_TIMING +RET(22) +#else RET(12) +#endif } // TAS @@ -18398,8 +18495,20 @@ OPCODE(0x4AF9) flag_V = 0; flag_NotZ = res; flag_N = res; + +#ifdef PICODRIVE_HACK + if (g_m68kcontext == &PicoCpuFS68k) { + res |= 0x80; + WRITE_BYTE_F(adr, res); + } +#endif + POST_IO +#ifdef USE_CYCLONE_TIMING +RET(26) +#else RET(16) +#endif } // TAS @@ -18416,8 +18525,20 @@ OPCODE(0x4ADF) flag_V = 0; flag_NotZ = res; flag_N = res; + +#ifdef PICODRIVE_HACK + if (g_m68kcontext == &PicoCpuFS68k) { + res |= 0x80; + WRITE_BYTE_F(adr, res); + } +#endif + POST_IO +#ifdef USE_CYCLONE_TIMING +RET(18) +#else RET(8) +#endif } // TAS @@ -18434,8 +18555,20 @@ OPCODE(0x4AE7) flag_V = 0; flag_NotZ = res; flag_N = res; + +#ifdef PICODRIVE_HACK + if (g_m68kcontext == &PicoCpuFS68k) { + res |= 0x80; + WRITE_BYTE_F(adr, res); + } +#endif + POST_IO -RET(10) +#ifdef USE_CYCLONE_TIMING +RET(20) +#else +RET(8) +#endif } // ILLEGAL @@ -18653,7 +18786,7 @@ OPCODE(0x4CBA) s32 *psrc; FETCH_WORD(res); - adr = GET_SWORD + ((u32)(PC) - BasePC); + adr = GET_SWORD + GET_PC; PC++; psrc = &DREGs32(0); dst = adr; @@ -18685,7 +18818,7 @@ OPCODE(0x4CBB) s32 *psrc; FETCH_WORD(res); - adr = (u32)(PC) - BasePC; + adr = GET_PC; DECODE_EXT_WORD psrc = &DREGs32(0); dst = adr; @@ -18930,7 +19063,7 @@ OPCODE(0x4CFA) u32 *psrc; FETCH_WORD(res); - adr = GET_SWORD + ((u32)(PC) - BasePC); + adr = GET_SWORD + GET_PC; PC++; psrc = &DREGu32(0); dst = adr; @@ -18962,7 +19095,7 @@ OPCODE(0x4CFB) u32 *psrc; FETCH_WORD(res); - adr = (u32)(PC) - BasePC; + adr = GET_PC; DECODE_EXT_WORD psrc = &DREGu32(0); dst = adr; @@ -19156,8 +19289,7 @@ OPCODE(0x4E72) ASP = res; } m68kcontext.execinfo |= FM68K_HALTED; - m68kcontext.io_cycle_counter = 0; -RET(4) +RET0() } // RTE @@ -19236,7 +19368,7 @@ OPCODE(0x4E90) { u32 oldPC; - oldPC = (u32)(PC) - BasePC; + oldPC = GET_PC; PRE_IO PUSH_32_F(oldPC) } @@ -19257,7 +19389,7 @@ OPCODE(0x4EA8) { u32 oldPC; - oldPC = (u32)(PC) - BasePC; + oldPC = GET_PC; PRE_IO PUSH_32_F(oldPC) } @@ -19278,7 +19410,7 @@ OPCODE(0x4EB0) { u32 oldPC; - oldPC = (u32)(PC) - BasePC; + oldPC = GET_PC; PRE_IO PUSH_32_F(oldPC) } @@ -19298,7 +19430,7 @@ OPCODE(0x4EB8) { u32 oldPC; - oldPC = (u32)(PC) - BasePC; + oldPC = GET_PC; PRE_IO PUSH_32_F(oldPC) } @@ -19318,7 +19450,7 @@ OPCODE(0x4EB9) { u32 oldPC; - oldPC = (u32)(PC) - BasePC; + oldPC = GET_PC; PRE_IO PUSH_32_F(oldPC) } @@ -19334,12 +19466,12 @@ OPCODE(0x4EBA) u32 adr, res; u32 src, dst; - adr = GET_SWORD + ((u32)(PC) - BasePC); + adr = GET_SWORD + GET_PC; PC++; { u32 oldPC; - oldPC = (u32)(PC) - BasePC; + oldPC = GET_PC; PRE_IO PUSH_32_F(oldPC) } @@ -19355,12 +19487,12 @@ OPCODE(0x4EBB) u32 adr, res; u32 src, dst; - adr = (u32)(PC) - BasePC; + adr = GET_PC; DECODE_EXT_WORD { u32 oldPC; - oldPC = (u32)(PC) - BasePC; + oldPC = GET_PC; PRE_IO PUSH_32_F(oldPC) } @@ -19438,7 +19570,7 @@ OPCODE(0x4EFA) u32 adr, res; u32 src, dst; - adr = GET_SWORD + ((u32)(PC) - BasePC); + adr = GET_SWORD + GET_PC; PC++; SET_PC(adr) CHECK_BRANCH_EXCEPTION(adr) @@ -19451,7 +19583,7 @@ OPCODE(0x4EFB) u32 adr, res; u32 src, dst; - adr = (u32)(PC) - BasePC; + adr = GET_PC; DECODE_EXT_WORD SET_PC(adr) CHECK_BRANCH_EXCEPTION(adr) @@ -19461,12 +19593,11 @@ RET(14) // CHK OPCODE(0x4180) { - u32 adr, res; - u32 src, dst; + s32 src, res; - src = DREGu16((Opcode >> 0) & 7); - res = DREGu16((Opcode >> 9) & 7); - if (((s32)res < 0) || (res > src)) + src = DREGs16((Opcode >> 0) & 7); + res = DREGs16((Opcode >> 9) & 7); + if ((res < 0) || (res > src)) { flag_N = res >> 8; SET_PC(execute_exception(M68K_CHK_EX, GET_PC, GET_SR)); @@ -19477,14 +19608,14 @@ RET(10) // CHK OPCODE(0x4190) { - u32 adr, res; - u32 src, dst; + s32 src, res; + u32 adr; adr = AREG((Opcode >> 0) & 7); PRE_IO - READ_WORD_F(adr, src) - res = DREGu16((Opcode >> 9) & 7); - if (((s32)res < 0) || (res > src)) + READSX_WORD_F(adr, src) + res = DREGs16((Opcode >> 9) & 7); + if ((res < 0) || (res > src)) { flag_N = res >> 8; SET_PC(execute_exception(M68K_CHK_EX, GET_PC, GET_SR)); @@ -19496,15 +19627,15 @@ RET(14) // 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 - READ_WORD_F(adr, src) - res = DREGu16((Opcode >> 9) & 7); - if (((s32)res < 0) || (res > src)) + READSX_WORD_F(adr, src) + res = DREGs16((Opcode >> 9) & 7); + if ((res < 0) || (res > src)) { flag_N = res >> 8; SET_PC(execute_exception(M68K_CHK_EX, GET_PC, GET_SR)); @@ -19516,15 +19647,15 @@ RET(14) // 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 - READ_WORD_F(adr, src) - res = DREGu16((Opcode >> 9) & 7); - if (((s32)res < 0) || (res > src)) + READSX_WORD_F(adr, src) + res = DREGs16((Opcode >> 9) & 7); + if ((res < 0) || (res > src)) { flag_N = res >> 8; SET_PC(execute_exception(M68K_CHK_EX, GET_PC, GET_SR)); @@ -19536,15 +19667,15 @@ RET(16) // CHK OPCODE(0x41A8) { - u32 adr, res; - u32 src, dst; + s32 src, res; + u32 adr; FETCH_SWORD(adr); adr += AREG((Opcode >> 0) & 7); PRE_IO - READ_WORD_F(adr, src) - res = DREGu16((Opcode >> 9) & 7); - if (((s32)res < 0) || (res > src)) + READSX_WORD_F(adr, src) + res = DREGs16((Opcode >> 9) & 7); + if ((res < 0) || (res > src)) { flag_N = res >> 8; SET_PC(execute_exception(M68K_CHK_EX, GET_PC, GET_SR)); @@ -19556,15 +19687,15 @@ RET(18) // CHK OPCODE(0x41B0) { - u32 adr, res; - u32 src, dst; + s32 src, res; + u32 adr; adr = AREG((Opcode >> 0) & 7); DECODE_EXT_WORD PRE_IO - READ_WORD_F(adr, src) - res = DREGu16((Opcode >> 9) & 7); - if (((s32)res < 0) || (res > src)) + READSX_WORD_F(adr, src) + res = DREGs16((Opcode >> 9) & 7); + if ((res < 0) || (res > src)) { flag_N = res >> 8; SET_PC(execute_exception(M68K_CHK_EX, GET_PC, GET_SR)); @@ -19576,14 +19707,14 @@ RET(20) // CHK OPCODE(0x41B8) { - u32 adr, res; - u32 src, dst; + s32 src, res; + u32 adr; FETCH_SWORD(adr); PRE_IO - READ_WORD_F(adr, src) - res = DREGu16((Opcode >> 9) & 7); - if (((s32)res < 0) || (res > src)) + READSX_WORD_F(adr, src) + res = DREGs16((Opcode >> 9) & 7); + if ((res < 0) || (res > src)) { flag_N = res >> 8; SET_PC(execute_exception(M68K_CHK_EX, GET_PC, GET_SR)); @@ -19595,14 +19726,14 @@ RET(18) // CHK OPCODE(0x41B9) { - u32 adr, res; - u32 src, dst; + s32 src, res; + u32 adr; FETCH_LONG(adr); PRE_IO - READ_WORD_F(adr, src) - res = DREGu16((Opcode >> 9) & 7); - if (((s32)res < 0) || (res > src)) + READSX_WORD_F(adr, src) + res = DREGs16((Opcode >> 9) & 7); + if ((res < 0) || (res > src)) { flag_N = res >> 8; SET_PC(execute_exception(M68K_CHK_EX, GET_PC, GET_SR)); @@ -19614,15 +19745,15 @@ RET(22) // CHK OPCODE(0x41BA) { - u32 adr, res; - u32 src, dst; + s32 src, res; + u32 adr; - adr = GET_SWORD + ((u32)(PC) - BasePC); + adr = GET_SWORD + GET_PC; PC++; PRE_IO - READ_WORD_F(adr, src) - res = DREGu16((Opcode >> 9) & 7); - if (((s32)res < 0) || (res > src)) + READSX_WORD_F(adr, src) + res = DREGs16((Opcode >> 9) & 7); + if ((res < 0) || (res > src)) { flag_N = res >> 8; SET_PC(execute_exception(M68K_CHK_EX, GET_PC, GET_SR)); @@ -19634,15 +19765,15 @@ RET(18) // CHK OPCODE(0x41BB) { - u32 adr, res; - u32 src, dst; + s32 src, res; + u32 adr; - adr = (u32)(PC) - BasePC; + adr = GET_PC; DECODE_EXT_WORD PRE_IO - READ_WORD_F(adr, src) - res = DREGu16((Opcode >> 9) & 7); - if (((s32)res < 0) || (res > src)) + READSX_WORD_F(adr, src) + res = DREGs16((Opcode >> 9) & 7); + if ((res < 0) || (res > src)) { flag_N = res >> 8; SET_PC(execute_exception(M68K_CHK_EX, GET_PC, GET_SR)); @@ -19654,12 +19785,12 @@ RET(20) // CHK OPCODE(0x41BC) { - u32 adr, res; - u32 src, dst; + s32 src, res; + u32 adr; - FETCH_WORD(src); - res = DREGu16((Opcode >> 9) & 7); - if (((s32)res < 0) || (res > src)) + FETCH_SWORD(src); + res = DREGs16((Opcode >> 9) & 7); + if ((res < 0) || (res > src)) { flag_N = res >> 8; SET_PC(execute_exception(M68K_CHK_EX, GET_PC, GET_SR)); @@ -19671,15 +19802,15 @@ RET(14) // CHK OPCODE(0x419F) { - u32 adr, res; - u32 src, dst; + s32 src, res; + u32 adr; adr = AREG(7); AREG(7) += 2; PRE_IO - READ_WORD_F(adr, src) - res = DREGu16((Opcode >> 9) & 7); - if (((s32)res < 0) || (res > src)) + READSX_WORD_F(adr, src) + res = DREGs16((Opcode >> 9) & 7); + if ((res < 0) || (res > src)) { flag_N = res >> 8; SET_PC(execute_exception(M68K_CHK_EX, GET_PC, GET_SR)); @@ -19691,15 +19822,15 @@ RET(14) // CHK OPCODE(0x41A7) { - u32 adr, res; - u32 src, dst; + s32 src, res; + u32 adr; adr = AREG(7) - 2; AREG(7) = adr; PRE_IO - READ_WORD_F(adr, src) - res = DREGu16((Opcode >> 9) & 7); - if (((s32)res < 0) || (res > src)) + READSX_WORD_F(adr, src) + res = DREGs16((Opcode >> 9) & 7); + if ((res < 0) || (res > src)) { flag_N = res >> 8; SET_PC(execute_exception(M68K_CHK_EX, GET_PC, GET_SR)); @@ -19776,7 +19907,7 @@ OPCODE(0x41FA) u32 adr, res; u32 src, dst; - adr = GET_SWORD + ((u32)(PC) - BasePC); + adr = GET_SWORD + GET_PC; PC++; res = adr; AREG((Opcode >> 9) & 7) = res; @@ -19789,7 +19920,7 @@ OPCODE(0x41FB) u32 adr, res; u32 src, dst; - adr = (u32)(PC) - BasePC; + adr = GET_PC; DECODE_EXT_WORD res = adr; AREG((Opcode >> 9) & 7) = res; @@ -23192,6 +23323,8 @@ OPCODE(0x51C8) u32 adr, res; u32 src, dst; + NOT_POLLING + res = DREGu16((Opcode >> 0) & 7); res--; DREGu16((Opcode >> 0) & 7) = res; @@ -23199,7 +23332,7 @@ OPCODE(0x51C8) { u32 newPC; - newPC = (u32)(PC) - BasePC; + newPC = GET_PC; newPC += GET_SWORD; SET_PC(newPC); CHECK_BRANCH_EXCEPTION(newPC) @@ -23215,6 +23348,8 @@ OPCODE(0x52C8) u32 adr, res; u32 src, dst; + NOT_POLLING + if ((!flag_NotZ) || (flag_C & 0x100)) { res = DREGu16((Opcode >> 0) & 7); @@ -23224,7 +23359,7 @@ OPCODE(0x52C8) { u32 newPC; - newPC = (u32)(PC) - BasePC; + newPC = GET_PC; newPC += GET_SWORD; SET_PC(newPC); CHECK_BRANCH_EXCEPTION(newPC) @@ -23246,6 +23381,8 @@ OPCODE(0x53C8) u32 adr, res; u32 src, dst; + NOT_POLLING + if (flag_NotZ && (!(flag_C & 0x100))) { res = DREGu16((Opcode >> 0) & 7); @@ -23255,7 +23392,7 @@ OPCODE(0x53C8) { u32 newPC; - newPC = (u32)(PC) - BasePC; + newPC = GET_PC; newPC += GET_SWORD; SET_PC(newPC); CHECK_BRANCH_EXCEPTION(newPC) @@ -23277,6 +23414,8 @@ OPCODE(0x54C8) u32 adr, res; u32 src, dst; + NOT_POLLING + if (flag_C & 0x100) { res = DREGu16((Opcode >> 0) & 7); @@ -23286,7 +23425,7 @@ OPCODE(0x54C8) { u32 newPC; - newPC = (u32)(PC) - BasePC; + newPC = GET_PC; newPC += GET_SWORD; SET_PC(newPC); CHECK_BRANCH_EXCEPTION(newPC) @@ -23308,6 +23447,8 @@ OPCODE(0x55C8) u32 adr, res; u32 src, dst; + NOT_POLLING + if (!(flag_C & 0x100)) { res = DREGu16((Opcode >> 0) & 7); @@ -23317,7 +23458,7 @@ OPCODE(0x55C8) { u32 newPC; - newPC = (u32)(PC) - BasePC; + newPC = GET_PC; newPC += GET_SWORD; SET_PC(newPC); CHECK_BRANCH_EXCEPTION(newPC) @@ -23339,6 +23480,8 @@ OPCODE(0x56C8) u32 adr, res; u32 src, dst; + NOT_POLLING + if (!flag_NotZ) { res = DREGu16((Opcode >> 0) & 7); @@ -23348,7 +23491,7 @@ OPCODE(0x56C8) { u32 newPC; - newPC = (u32)(PC) - BasePC; + newPC = GET_PC; newPC += GET_SWORD; SET_PC(newPC); CHECK_BRANCH_EXCEPTION(newPC) @@ -23370,6 +23513,8 @@ OPCODE(0x57C8) u32 adr, res; u32 src, dst; + NOT_POLLING + if (flag_NotZ) { res = DREGu16((Opcode >> 0) & 7); @@ -23379,7 +23524,7 @@ OPCODE(0x57C8) { u32 newPC; - newPC = (u32)(PC) - BasePC; + newPC = GET_PC; newPC += GET_SWORD; SET_PC(newPC); CHECK_BRANCH_EXCEPTION(newPC) @@ -23401,6 +23546,8 @@ OPCODE(0x58C8) u32 adr, res; u32 src, dst; + NOT_POLLING + if (flag_V & 0x80) { res = DREGu16((Opcode >> 0) & 7); @@ -23410,7 +23557,7 @@ OPCODE(0x58C8) { u32 newPC; - newPC = (u32)(PC) - BasePC; + newPC = GET_PC; newPC += GET_SWORD; SET_PC(newPC); CHECK_BRANCH_EXCEPTION(newPC) @@ -23432,6 +23579,8 @@ OPCODE(0x59C8) u32 adr, res; u32 src, dst; + NOT_POLLING + if (!(flag_V & 0x80)) { res = DREGu16((Opcode >> 0) & 7); @@ -23441,7 +23590,7 @@ OPCODE(0x59C8) { u32 newPC; - newPC = (u32)(PC) - BasePC; + newPC = GET_PC; newPC += GET_SWORD; SET_PC(newPC); CHECK_BRANCH_EXCEPTION(newPC) @@ -23463,6 +23612,8 @@ OPCODE(0x5AC8) u32 adr, res; u32 src, dst; + NOT_POLLING + if (flag_N & 0x80) { res = DREGu16((Opcode >> 0) & 7); @@ -23472,7 +23623,7 @@ OPCODE(0x5AC8) { u32 newPC; - newPC = (u32)(PC) - BasePC; + newPC = GET_PC; newPC += GET_SWORD; SET_PC(newPC); CHECK_BRANCH_EXCEPTION(newPC) @@ -23494,6 +23645,8 @@ OPCODE(0x5BC8) u32 adr, res; u32 src, dst; + NOT_POLLING + if (!(flag_N & 0x80)) { res = DREGu16((Opcode >> 0) & 7); @@ -23503,7 +23656,7 @@ OPCODE(0x5BC8) { u32 newPC; - newPC = (u32)(PC) - BasePC; + newPC = GET_PC; newPC += GET_SWORD; SET_PC(newPC); CHECK_BRANCH_EXCEPTION(newPC) @@ -23525,6 +23678,8 @@ OPCODE(0x5CC8) u32 adr, res; u32 src, dst; + NOT_POLLING + if ((flag_N ^ flag_V) & 0x80) { res = DREGu16((Opcode >> 0) & 7); @@ -23534,7 +23689,7 @@ OPCODE(0x5CC8) { u32 newPC; - newPC = (u32)(PC) - BasePC; + newPC = GET_PC; newPC += GET_SWORD; SET_PC(newPC); CHECK_BRANCH_EXCEPTION(newPC) @@ -23556,6 +23711,8 @@ OPCODE(0x5DC8) u32 adr, res; u32 src, dst; + NOT_POLLING + if (!((flag_N ^ flag_V) & 0x80)) { res = DREGu16((Opcode >> 0) & 7); @@ -23565,7 +23722,7 @@ OPCODE(0x5DC8) { u32 newPC; - newPC = (u32)(PC) - BasePC; + newPC = GET_PC; newPC += GET_SWORD; SET_PC(newPC); CHECK_BRANCH_EXCEPTION(newPC) @@ -23587,6 +23744,8 @@ OPCODE(0x5EC8) u32 adr, res; u32 src, dst; + NOT_POLLING + if ((!flag_NotZ) || ((flag_N ^ flag_V) & 0x80)) { res = DREGu16((Opcode >> 0) & 7); @@ -23596,7 +23755,7 @@ OPCODE(0x5EC8) { u32 newPC; - newPC = (u32)(PC) - BasePC; + newPC = GET_PC; newPC += GET_SWORD; SET_PC(newPC); CHECK_BRANCH_EXCEPTION(newPC) @@ -23618,6 +23777,8 @@ OPCODE(0x5FC8) u32 adr, res; u32 src, dst; + NOT_POLLING + if (flag_NotZ && (!((flag_N ^ flag_V) & 0x80))) { res = DREGu16((Opcode >> 0) & 7); @@ -23627,7 +23788,7 @@ OPCODE(0x5FC8) { u32 newPC; - newPC = (u32)(PC) - BasePC; + newPC = GET_PC; newPC += GET_SWORD; SET_PC(newPC); CHECK_BRANCH_EXCEPTION(newPC) @@ -25083,7 +25244,7 @@ OPCODE(0x6200) { u32 newPC; - newPC = (u32)(PC) - BasePC; + newPC = GET_PC; newPC += GET_SWORD; SET_PC(newPC); CHECK_BRANCH_EXCEPTION(newPC) @@ -25103,7 +25264,7 @@ OPCODE(0x6300) { u32 newPC; - newPC = (u32)(PC) - BasePC; + newPC = GET_PC; newPC += GET_SWORD; SET_PC(newPC); CHECK_BRANCH_EXCEPTION(newPC) @@ -25123,7 +25284,7 @@ OPCODE(0x6400) { u32 newPC; - newPC = (u32)(PC) - BasePC; + newPC = GET_PC; newPC += GET_SWORD; SET_PC(newPC); CHECK_BRANCH_EXCEPTION(newPC) @@ -25143,7 +25304,7 @@ OPCODE(0x6500) { u32 newPC; - newPC = (u32)(PC) - BasePC; + newPC = GET_PC; newPC += GET_SWORD; SET_PC(newPC); CHECK_BRANCH_EXCEPTION(newPC) @@ -25163,7 +25324,7 @@ OPCODE(0x6600) { u32 newPC; - newPC = (u32)(PC) - BasePC; + newPC = GET_PC; newPC += GET_SWORD; SET_PC(newPC); CHECK_BRANCH_EXCEPTION(newPC) @@ -25183,7 +25344,7 @@ OPCODE(0x6700) { u32 newPC; - newPC = (u32)(PC) - BasePC; + newPC = GET_PC; newPC += GET_SWORD; SET_PC(newPC); CHECK_BRANCH_EXCEPTION(newPC) @@ -25203,7 +25364,7 @@ OPCODE(0x6800) { u32 newPC; - newPC = (u32)(PC) - BasePC; + newPC = GET_PC; newPC += GET_SWORD; SET_PC(newPC); CHECK_BRANCH_EXCEPTION(newPC) @@ -25223,7 +25384,7 @@ OPCODE(0x6900) { u32 newPC; - newPC = (u32)(PC) - BasePC; + newPC = GET_PC; newPC += GET_SWORD; SET_PC(newPC); CHECK_BRANCH_EXCEPTION(newPC) @@ -25243,7 +25404,7 @@ OPCODE(0x6A00) { u32 newPC; - newPC = (u32)(PC) - BasePC; + newPC = GET_PC; newPC += GET_SWORD; SET_PC(newPC); CHECK_BRANCH_EXCEPTION(newPC) @@ -25263,7 +25424,7 @@ OPCODE(0x6B00) { u32 newPC; - newPC = (u32)(PC) - BasePC; + newPC = GET_PC; newPC += GET_SWORD; SET_PC(newPC); CHECK_BRANCH_EXCEPTION(newPC) @@ -25283,7 +25444,7 @@ OPCODE(0x6C00) { u32 newPC; - newPC = (u32)(PC) - BasePC; + newPC = GET_PC; newPC += GET_SWORD; SET_PC(newPC); CHECK_BRANCH_EXCEPTION(newPC) @@ -25303,7 +25464,7 @@ OPCODE(0x6D00) { u32 newPC; - newPC = (u32)(PC) - BasePC; + newPC = GET_PC; newPC += GET_SWORD; SET_PC(newPC); CHECK_BRANCH_EXCEPTION(newPC) @@ -25323,7 +25484,7 @@ OPCODE(0x6E00) { u32 newPC; - newPC = (u32)(PC) - BasePC; + newPC = GET_PC; newPC += GET_SWORD; SET_PC(newPC); CHECK_BRANCH_EXCEPTION(newPC) @@ -25343,7 +25504,7 @@ OPCODE(0x6F00) { u32 newPC; - newPC = (u32)(PC) - BasePC; + newPC = GET_PC; newPC += GET_SWORD; SET_PC(newPC); CHECK_BRANCH_EXCEPTION(newPC) @@ -25357,7 +25518,7 @@ RET(12) OPCODE(0x6001) { #ifdef FAMEC_CHECK_BRANCHES - u32 newPC = (u32)(PC) - BasePC; + u32 newPC = GET_PC; s8 offs=Opcode; newPC += offs; SET_PC(newPC); @@ -25377,7 +25538,7 @@ OPCODE(0x6000) { u32 newPC; - newPC = (u32)(PC) - BasePC; + newPC = GET_PC; newPC += GET_SWORD; SET_PC(newPC); CHECK_BRANCH_EXCEPTION(newPC) @@ -25395,7 +25556,7 @@ OPCODE(0x6101) PRE_IO - oldPC = (u32)(PC) - BasePC; + oldPC = GET_PC; PUSH_32_F(oldPC) #ifdef FAMEC_CHECK_BRANCHES offs = Opcode; @@ -25419,7 +25580,7 @@ OPCODE(0x6100) { u32 oldPC, newPC; - newPC = (u32)(PC) - BasePC; + newPC = GET_PC; oldPC = newPC + 2; PUSH_32_F(oldPC) newPC += GET_SWORD; @@ -25610,7 +25771,7 @@ OPCODE(0x803A) u32 adr, res; u32 src, dst; - adr = GET_SWORD + ((u32)(PC) - BasePC); + adr = GET_SWORD + GET_PC; PC++; PRE_IO READ_BYTE_F(adr, src) @@ -25631,7 +25792,7 @@ OPCODE(0x803B) u32 adr, res; u32 src, dst; - adr = (u32)(PC) - BasePC; + adr = GET_PC; DECODE_EXT_WORD PRE_IO READ_BYTE_F(adr, src) @@ -25872,7 +26033,7 @@ OPCODE(0x807A) u32 adr, res; u32 src, dst; - adr = GET_SWORD + ((u32)(PC) - BasePC); + adr = GET_SWORD + GET_PC; PC++; PRE_IO READ_WORD_F(adr, src) @@ -25893,7 +26054,7 @@ OPCODE(0x807B) u32 adr, res; u32 src, dst; - adr = (u32)(PC) - BasePC; + adr = GET_PC; DECODE_EXT_WORD PRE_IO READ_WORD_F(adr, src) @@ -26134,7 +26295,7 @@ OPCODE(0x80BA) u32 adr, res; u32 src, dst; - adr = GET_SWORD + ((u32)(PC) - BasePC); + adr = GET_SWORD + GET_PC; PC++; PRE_IO READ_LONG_F(adr, src) @@ -26155,7 +26316,7 @@ OPCODE(0x80BB) u32 adr, res; u32 src, dst; - adr = (u32)(PC) - BasePC; + adr = GET_PC; DECODE_EXT_WORD PRE_IO READ_LONG_F(adr, src) @@ -26792,19 +26953,19 @@ OPCODE(0x8100) { 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); - if (res > 9) res -= 6; + if (res > 0xF) corf = 6; 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) @@ -26815,6 +26976,7 @@ OPCODE(0x8108) { u32 adr, res; u32 src, dst; + u32 corf = 0; adr = AREG((Opcode >> 0) & 7) - 1; AREG((Opcode >> 0) & 7) = adr; @@ -26824,15 +26986,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); - if (res > 9) res -= 6; + if (res > 0xF) corf = 6; 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 @@ -26844,6 +27005,7 @@ OPCODE(0x810F) { u32 adr, res; u32 src, dst; + u32 corf = 0; adr = AREG(7) - 2; AREG(7) = adr; @@ -26853,15 +27015,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); - if (res > 9) res -= 6; + if (res > 0xF) corf = 6; 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 @@ -26873,6 +27034,7 @@ OPCODE(0x8F08) { u32 adr, res; u32 src, dst; + u32 corf = 0; adr = AREG((Opcode >> 0) & 7) - 1; AREG((Opcode >> 0) & 7) = adr; @@ -26882,15 +27044,14 @@ OPCODE(0x8F08) 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); - 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 @@ -26902,6 +27063,7 @@ OPCODE(0x8F0F) { u32 adr, res; u32 src, dst; + u32 corf = 0; adr = AREG(7) - 2; AREG(7) = adr; @@ -26911,15 +27073,14 @@ OPCODE(0x8F0F) 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); - 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 @@ -27277,7 +27438,7 @@ OPCODE(0x80F9) { SET_PC(execute_exception(M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR)); #ifdef USE_CYCLONE_TIMING_DIV -RET(162) +RET(152) #else RET(22) #endif @@ -27293,7 +27454,7 @@ RET(22) { flag_V = M68K_SR_V; #ifdef USE_CYCLONE_TIMING_DIV -RET(162) +RET(152) #else RET(82) #endif @@ -27306,7 +27467,7 @@ RET(162) DREGu32((Opcode >> 9) & 7) = res; } #ifdef USE_CYCLONE_TIMING_DIV -RET(162) +RET(152) #else RET(102) #endif @@ -27318,7 +27479,7 @@ OPCODE(0x80FA) u32 adr, res; u32 src, dst; - adr = GET_SWORD + ((u32)(PC) - BasePC); + adr = GET_SWORD + GET_PC; PC++; PRE_IO READ_WORD_F(adr, src) @@ -27367,7 +27528,7 @@ OPCODE(0x80FB) u32 adr, res; u32 src, dst; - adr = (u32)(PC) - BasePC; + adr = GET_PC; DECODE_EXT_WORD PRE_IO READ_WORD_F(adr, src) @@ -27375,7 +27536,7 @@ OPCODE(0x80FB) { SET_PC(execute_exception(M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR)); #ifdef USE_CYCLONE_TIMING_DIV -RET(160) +RET(150) #else RET(20) #endif @@ -27391,7 +27552,7 @@ RET(20) { flag_V = M68K_SR_V; #ifdef USE_CYCLONE_TIMING_DIV -RET(160) +RET(150) #else RET(80) #endif @@ -27404,7 +27565,7 @@ RET(160) DREGu32((Opcode >> 9) & 7) = res; } #ifdef USE_CYCLONE_TIMING_DIV -RET(160) +RET(150) #else RET(100) #endif @@ -28010,7 +28171,7 @@ OPCODE(0x81FA) u32 adr, res; u32 src, dst; - adr = GET_SWORD + ((u32)(PC) - BasePC); + adr = GET_SWORD + GET_PC; PC++; PRE_IO READSX_WORD_F(adr, src) @@ -28067,7 +28228,7 @@ OPCODE(0x81FB) u32 adr, res; u32 src, dst; - adr = (u32)(PC) - BasePC; + adr = GET_PC; DECODE_EXT_WORD PRE_IO READSX_WORD_F(adr, src) @@ -28468,7 +28629,7 @@ OPCODE(0x903A) u32 adr, res; u32 src, dst; - adr = GET_SWORD + ((u32)(PC) - BasePC); + adr = GET_SWORD + GET_PC; PC++; PRE_IO READ_BYTE_F(adr, src) @@ -28488,7 +28649,7 @@ OPCODE(0x903B) u32 adr, res; u32 src, dst; - adr = (u32)(PC) - BasePC; + adr = GET_PC; DECODE_EXT_WORD PRE_IO READ_BYTE_F(adr, src) @@ -28733,7 +28894,7 @@ OPCODE(0x907A) u32 adr, res; u32 src, dst; - adr = GET_SWORD + ((u32)(PC) - BasePC); + adr = GET_SWORD + GET_PC; PC++; PRE_IO READ_WORD_F(adr, src) @@ -28753,7 +28914,7 @@ OPCODE(0x907B) u32 adr, res; u32 src, dst; - adr = (u32)(PC) - BasePC; + adr = GET_PC; DECODE_EXT_WORD PRE_IO READ_WORD_F(adr, src) @@ -29007,7 +29168,7 @@ OPCODE(0x90BA) u32 adr, res; u32 src, dst; - adr = GET_SWORD + ((u32)(PC) - BasePC); + adr = GET_SWORD + GET_PC; PC++; PRE_IO READ_LONG_F(adr, src) @@ -29028,7 +29189,7 @@ OPCODE(0x90BB) u32 adr, res; u32 src, dst; - adr = (u32)(PC) - BasePC; + adr = GET_PC; DECODE_EXT_WORD PRE_IO READ_LONG_F(adr, src) @@ -30135,7 +30296,7 @@ OPCODE(0x90FA) u32 adr, res; u32 src, dst; - adr = GET_SWORD + ((u32)(PC) - BasePC); + adr = GET_SWORD + GET_PC; PC++; PRE_IO READSX_WORD_F(adr, src) @@ -30156,7 +30317,7 @@ OPCODE(0x90FB) u32 adr, res; u32 src, dst; - adr = (u32)(PC) - BasePC; + adr = GET_PC; DECODE_EXT_WORD PRE_IO READSX_WORD_F(adr, src) @@ -30382,7 +30543,7 @@ OPCODE(0x91FA) u32 adr, res; u32 src, dst; - adr = GET_SWORD + ((u32)(PC) - BasePC); + adr = GET_SWORD + GET_PC; PC++; PRE_IO READSX_LONG_F(adr, src) @@ -30399,7 +30560,7 @@ OPCODE(0x91FB) u32 adr, res; u32 src, dst; - adr = (u32)(PC) - BasePC; + adr = GET_PC; DECODE_EXT_WORD PRE_IO READSX_LONG_F(adr, src) @@ -30634,7 +30795,7 @@ OPCODE(0xB03A) u32 adr, res; u32 src, dst; - adr = GET_SWORD + ((u32)(PC) - BasePC); + adr = GET_SWORD + GET_PC; PC++; PRE_IO READ_BYTE_F(adr, src) @@ -30653,7 +30814,7 @@ OPCODE(0xB03B) u32 adr, res; u32 src, dst; - adr = (u32)(PC) - BasePC; + adr = GET_PC; DECODE_EXT_WORD PRE_IO READ_BYTE_F(adr, src) @@ -30885,7 +31046,7 @@ OPCODE(0xB07A) u32 adr, res; u32 src, dst; - adr = GET_SWORD + ((u32)(PC) - BasePC); + adr = GET_SWORD + GET_PC; PC++; PRE_IO READ_WORD_F(adr, src) @@ -30904,7 +31065,7 @@ OPCODE(0xB07B) u32 adr, res; u32 src, dst; - adr = (u32)(PC) - BasePC; + adr = GET_PC; DECODE_EXT_WORD PRE_IO READ_WORD_F(adr, src) @@ -31145,7 +31306,7 @@ OPCODE(0xB0BA) u32 adr, res; u32 src, dst; - adr = GET_SWORD + ((u32)(PC) - BasePC); + adr = GET_SWORD + GET_PC; PC++; PRE_IO READ_LONG_F(adr, src) @@ -31165,7 +31326,7 @@ OPCODE(0xB0BB) u32 adr, res; u32 src, dst; - adr = (u32)(PC) - BasePC; + adr = GET_PC; DECODE_EXT_WORD PRE_IO READ_LONG_F(adr, src) @@ -32275,7 +32436,7 @@ OPCODE(0xB0FA) u32 adr, res; u32 src, dst; - adr = GET_SWORD + ((u32)(PC) - BasePC); + adr = GET_SWORD + GET_PC; PC++; PRE_IO READSX_WORD_F(adr, src) @@ -32295,7 +32456,7 @@ OPCODE(0xB0FB) u32 adr, res; u32 src, dst; - adr = (u32)(PC) - BasePC; + adr = GET_PC; DECODE_EXT_WORD PRE_IO READSX_WORD_F(adr, src) @@ -32540,7 +32701,7 @@ OPCODE(0xB1FA) u32 adr, res; u32 src, dst; - adr = GET_SWORD + ((u32)(PC) - BasePC); + adr = GET_SWORD + GET_PC; PC++; PRE_IO READSX_LONG_F(adr, src) @@ -32560,7 +32721,7 @@ OPCODE(0xB1FB) u32 adr, res; u32 src, dst; - adr = (u32)(PC) - BasePC; + adr = GET_PC; DECODE_EXT_WORD PRE_IO READSX_LONG_F(adr, src) @@ -32797,7 +32958,7 @@ OPCODE(0xC03A) u32 adr, res; u32 src, dst; - adr = GET_SWORD + ((u32)(PC) - BasePC); + adr = GET_SWORD + GET_PC; PC++; PRE_IO READ_BYTE_F(adr, src) @@ -32818,7 +32979,7 @@ OPCODE(0xC03B) u32 adr, res; u32 src, dst; - adr = (u32)(PC) - BasePC; + adr = GET_PC; DECODE_EXT_WORD PRE_IO READ_BYTE_F(adr, src) @@ -33059,7 +33220,7 @@ OPCODE(0xC07A) u32 adr, res; u32 src, dst; - adr = GET_SWORD + ((u32)(PC) - BasePC); + adr = GET_SWORD + GET_PC; PC++; PRE_IO READ_WORD_F(adr, src) @@ -33080,7 +33241,7 @@ OPCODE(0xC07B) u32 adr, res; u32 src, dst; - adr = (u32)(PC) - BasePC; + adr = GET_PC; DECODE_EXT_WORD PRE_IO READ_WORD_F(adr, src) @@ -33321,7 +33482,7 @@ OPCODE(0xC0BA) u32 adr, res; u32 src, dst; - adr = GET_SWORD + ((u32)(PC) - BasePC); + adr = GET_SWORD + GET_PC; PC++; PRE_IO READ_LONG_F(adr, src) @@ -33342,7 +33503,7 @@ OPCODE(0xC0BB) u32 adr, res; u32 src, dst; - adr = (u32)(PC) - BasePC; + adr = GET_PC; DECODE_EXT_WORD PRE_IO READ_LONG_F(adr, src) @@ -33979,18 +34140,22 @@ OPCODE(0xC100) { 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); - if (res > 9) res += 6; + if (res > 9) corf = 6; 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; + flag_V &= res; flag_NotZ |= res & 0xFF; flag_N = res; DREGu8((Opcode >> 9) & 7) = res; @@ -34002,6 +34167,7 @@ OPCODE(0xC108) { u32 adr, res; u32 src, dst; + u32 corf = 0; adr = AREG((Opcode >> 0) & 7) - 1; AREG((Opcode >> 0) & 7) = adr; @@ -34011,14 +34177,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); - if (res > 9) res += 6; + if (res > 9) corf = 6; 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; + flag_V &= res; flag_NotZ |= res & 0xFF; flag_N = res; WRITE_BYTE_F(adr, res) @@ -34031,6 +34200,7 @@ OPCODE(0xC10F) { u32 adr, res; u32 src, dst; + u32 corf = 0; adr = AREG(7) - 2; AREG(7) = adr; @@ -34040,14 +34210,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); - if (res > 9) res += 6; + if (res > 9) corf = 6; 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; + flag_V &= res; flag_NotZ |= res & 0xFF; flag_N = res; WRITE_BYTE_F(adr, res) @@ -34060,6 +34233,7 @@ OPCODE(0xCF08) { u32 adr, res; u32 src, dst; + u32 corf = 0; adr = AREG((Opcode >> 0) & 7) - 1; AREG((Opcode >> 0) & 7) = adr; @@ -34069,14 +34243,17 @@ OPCODE(0xCF08) 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); - 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; + flag_V &= res; flag_NotZ |= res & 0xFF; flag_N = res; WRITE_BYTE_F(adr, res) @@ -34089,6 +34266,7 @@ OPCODE(0xCF0F) { u32 adr, res; u32 src, dst; + u32 corf = 0; adr = AREG(7) - 2; AREG(7) = adr; @@ -34098,14 +34276,17 @@ OPCODE(0xCF0F) 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); - 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; + flag_V &= res; flag_NotZ |= res & 0xFF; flag_N = res; WRITE_BYTE_F(adr, res) @@ -34304,7 +34485,7 @@ OPCODE(0xC0FA) u32 adr, res; u32 src, dst; - adr = GET_SWORD + ((u32)(PC) - BasePC); + adr = GET_SWORD + GET_PC; PC++; PRE_IO READ_WORD_F(adr, src) @@ -34328,7 +34509,7 @@ OPCODE(0xC0FB) u32 adr, res; u32 src, dst; - adr = (u32)(PC) - BasePC; + adr = GET_PC; DECODE_EXT_WORD PRE_IO READ_WORD_F(adr, src) @@ -34605,7 +34786,7 @@ OPCODE(0xC1FA) u32 adr, res; u32 src, dst; - adr = GET_SWORD + ((u32)(PC) - BasePC); + adr = GET_SWORD + GET_PC; PC++; PRE_IO READSX_WORD_F(adr, src) @@ -34629,7 +34810,7 @@ OPCODE(0xC1FB) u32 adr, res; u32 src, dst; - adr = (u32)(PC) - BasePC; + adr = GET_PC; DECODE_EXT_WORD PRE_IO READSX_WORD_F(adr, src) @@ -34939,7 +35120,7 @@ OPCODE(0xD03A) u32 adr, res; u32 src, dst; - adr = GET_SWORD + ((u32)(PC) - BasePC); + adr = GET_SWORD + GET_PC; PC++; PRE_IO READ_BYTE_F(adr, src) @@ -34959,7 +35140,7 @@ OPCODE(0xD03B) u32 adr, res; u32 src, dst; - adr = (u32)(PC) - BasePC; + adr = GET_PC; DECODE_EXT_WORD PRE_IO READ_BYTE_F(adr, src) @@ -35204,7 +35385,7 @@ OPCODE(0xD07A) u32 adr, res; u32 src, dst; - adr = GET_SWORD + ((u32)(PC) - BasePC); + adr = GET_SWORD + GET_PC; PC++; PRE_IO READ_WORD_F(adr, src) @@ -35224,7 +35405,7 @@ OPCODE(0xD07B) u32 adr, res; u32 src, dst; - adr = (u32)(PC) - BasePC; + adr = GET_PC; DECODE_EXT_WORD PRE_IO READ_WORD_F(adr, src) @@ -35478,7 +35659,7 @@ OPCODE(0xD0BA) u32 adr, res; u32 src, dst; - adr = GET_SWORD + ((u32)(PC) - BasePC); + adr = GET_SWORD + GET_PC; PC++; PRE_IO READ_LONG_F(adr, src) @@ -35499,7 +35680,7 @@ OPCODE(0xD0BB) u32 adr, res; u32 src, dst; - adr = (u32)(PC) - BasePC; + adr = GET_PC; DECODE_EXT_WORD PRE_IO READ_LONG_F(adr, src) @@ -36606,7 +36787,7 @@ OPCODE(0xD0FA) u32 adr, res; u32 src, dst; - adr = GET_SWORD + ((u32)(PC) - BasePC); + adr = GET_SWORD + GET_PC; PC++; PRE_IO READSX_WORD_F(adr, src) @@ -36627,7 +36808,7 @@ OPCODE(0xD0FB) u32 adr, res; u32 src, dst; - adr = (u32)(PC) - BasePC; + adr = GET_PC; DECODE_EXT_WORD PRE_IO READSX_WORD_F(adr, src) @@ -36853,7 +37034,7 @@ OPCODE(0xD1FA) u32 adr, res; u32 src, dst; - adr = GET_SWORD + ((u32)(PC) - BasePC); + adr = GET_SWORD + GET_PC; PC++; PRE_IO READSX_LONG_F(adr, src) @@ -36870,7 +37051,7 @@ OPCODE(0xD1FB) u32 adr, res; u32 src, dst; - adr = (u32)(PC) - BasePC; + adr = GET_PC; DECODE_EXT_WORD PRE_IO READSX_LONG_F(adr, src) @@ -39854,3 +40035,98 @@ OPCODE(0xE7E7) RET(14) } +#ifdef PICODRIVE_HACK +#if 0 +#define UPDATE_IDLE_COUNT { \ + extern int idle_hit_counter; \ + idle_hit_counter++; \ +} +#else +#define UPDATE_IDLE_COUNT +#endif + +// BRA +OPCODE(0x6001_idle) +{ +#ifdef FAMEC_CHECK_BRANCHES + u32 newPC = GET_PC; + s8 offs=Opcode; + newPC += offs; + SET_PC(newPC); + CHECK_BRANCH_EXCEPTION(offs) +#else + PC += ((s8)(Opcode & 0xFE)) >> 1; +#endif + UPDATE_IDLE_COUNT +RET0() +} + +// BCC +OPCODE(0x6601_idle) +{ + if (flag_NotZ) + { + UPDATE_IDLE_COUNT + PC += ((s8)(Opcode & 0xFE)) >> 1; + //if (idle_hit) + RET0() + } +RET(8) +} + +OPCODE(0x6701_idle) +{ + if (!flag_NotZ) + { + UPDATE_IDLE_COUNT + PC += ((s8)(Opcode & 0xFE)) >> 1; + //if (idle_hit) + RET0() + } +RET(8) +} + + +extern int SekIsIdleReady(void); +extern int SekIsIdleCode(unsigned short *dst, int bytes); +extern int SekRegisterIdlePatch(unsigned int pc, int oldop, int newop, void *ctx); + +OPCODE(idle_detector_bcc8) +{ + int frame_count, cond_true, bytes, ret, newop; + u16 *dest_pc; + + dest_pc = PC + (((s8)(Opcode & 0xFE)) >> 1); + + if (!SekIsIdleReady()) + goto end; + + bytes = 0 - (s8)(Opcode & 0xFE) - 2; + ret = SekIsIdleCode(dest_pc, bytes); + newop = (Opcode & 0xfe) | 0x7100; + if (!ret) newop |= 0x200; + if ( Opcode & 0x0100) newop |= 0x400; // beq + if (!(Opcode & 0x0f00)) newop |= 0xc00; // bra + + ret = SekRegisterIdlePatch(GET_PC - 2, Opcode, newop, &m68kcontext); + switch (ret) + { + case 0: PC[-1] = newop; break; + case 1: break; + case 2: JumpTable[Opcode] = (Opcode & 0x0f00) ? + ((Opcode & 0x0100) ? CAST_OP(0x6701) : CAST_OP(0x6601)) : + CAST_OP(0x6001); break; + } + +end: + if ((Opcode & 0xff00) == 0x6000) cond_true = 1; + else cond_true = (Opcode & 0x0100) ? !flag_NotZ : flag_NotZ; // beq? + if (cond_true) + { + PC = dest_pc; + m68kcontext.io_cycle_counter -= 2; + } +RET(8) +} + +#endif // PICODRIVE_HACK