From: Toni Wilen Date: Sun, 16 Feb 2020 10:46:12 +0000 (+0200) Subject: 68000 prefetch bus error BTST Dn,#x, NBCD.B and LSLW fix. Reformatting. X-Git-Tag: 4400~121 X-Git-Url: https://git.unchartedbackwaters.co.uk/w/?a=commitdiff_plain;h=75b9d8ad704c9edd215a160646d0eeb28e23bdaa;p=francis%2Fwinuae.git 68000 prefetch bus error BTST Dn,#x, NBCD.B and LSLW fix. Reformatting. --- diff --git a/cputest/readme.txt b/cputest/readme.txt index d42131ab..793834ba 100644 --- a/cputest/readme.txt +++ b/cputest/readme.txt @@ -125,12 +125,20 @@ If mismatch is detected, opcode word(s), instruction disassembly, registers befo Change log: -18.01.2020 +16.02.2020 -- Cycle count validation (Amiga, 68000 only), including exceptions (except bus errors). -- Interrupt testing (Amiga only, INTREQ bits set one by one, validate correct exception). -- Multiple test sets can be generated and tested in single step. -- Stack usage reduced, gzip decompression works with default 4096 byte stack. +- 68000 prefetch bus error BTST Dn,#x, NBCD.B and LSLW fix. All prefetch bus error tests verified. +- 68000 read bus errors re-verified. + +15.02.2020 + +- 68000 Address error timing fix (CHK.W cycle count error) +- 68000 MOVE to memory address error cycle order fixed. +- 68000 re-verified (except bus errors) + +09.02.2020 + +- All 68000 tests are 100% confirmed, including full cycle-count support. 26.01.2020 @@ -141,12 +149,10 @@ Change log: - added -skipexcccr parameter. Skip CCR check if instruction generates bus, address, divide by zero or CHK exception. - added -skipmem (ignore memory write mismatches) -skipreg (ignore register mismatched) -skipccr (ignored CCR mismatch) parameters. -09.02.2020 - -- All 68000 tests are 100% confirmed, including full cycle-count support. +18.01.2020 -15.02.2020 +- Cycle count validation (Amiga, 68000 only), including exceptions (except bus errors). +- Interrupt testing (Amiga only, INTREQ bits set one by one, validate correct exception). +- Multiple test sets can be generated and tested in single step. +- Stack usage reduced, gzip decompression works with default 4096 byte stack. -- 68000 Address error timing fix (CHK.W cycle count error) -- 68000 MOVE to memory address error cycle order fixed. -- 68000 re-verified (except bus errors) diff --git a/gencpu.cpp b/gencpu.cpp index 76bf9b84..f01125bd 100644 --- a/gencpu.cpp +++ b/gencpu.cpp @@ -5523,14 +5523,12 @@ static void gen_opcode (unsigned int opcode) break; case i_NBCD: genamode(curi, curi->smode, "srcreg", curi->size, "src", 1, 0, GF_RMW); - if (isreg (curi->smode)) - addcycles000(2); out("uae_u16 newv_lo = - (src & 0xF) - (GET_XFLG() ? 1 : 0);\n"); out("uae_u16 newv_hi = - (src & 0xF0);\n"); out("uae_u16 newv;\n"); out("int cflg, tmp_newv;\n"); out("tmp_newv = newv_hi + newv_lo;\n"); - out("if (newv_lo > 9) { newv_lo -= 6; }\n"); + out("if (newv_lo > 9) newv_lo -= 6;\n"); out("newv = newv_hi + newv_lo;\n"); out("cflg = (newv & 0x1F0) > 0x90;\n"); out("if (cflg) newv -= 0x60;\n"); @@ -5552,7 +5550,12 @@ static void gen_opcode (unsigned int opcode) } else { out("SET_VFLG((tmp_newv & 0x80) != 0 && (newv & 0x80) == 0);\n"); } - fill_prefetch_next_after(1, NULL); + if (isreg(curi->smode)) { + fill_prefetch_next_after(1, NULL); + addcycles000(2); + } else { + fill_prefetch_next_after(1, NULL); + } genastore("newv", curi->smode, "srcreg", curi->size, "src"); break; case i_CLR: @@ -5678,8 +5681,8 @@ static void gen_opcode (unsigned int opcode) bsetcycles(curi); if (curi->dmode == imm) { // btst dn,#x - addcycles000(2); fill_prefetch_next_after(1, NULL); + addcycles000(2); out("SET_ZFLG(1 ^ ((dst >> src) & 1));\n"); } else { out("SET_ZFLG(1 ^ ((dst >> src) & 1));\n"); @@ -7403,11 +7406,11 @@ bccl_not68020: out("uae_s32 upper,lower,reg = regs.regs[(extra >> 12) & 15];\n"); switch (curi->size) { case sz_byte: - out("lower = (uae_s32)(uae_s8)%s(dsta); upper = (uae_s32)(uae_s8)%s(dsta + 1);\n", srcb, srcb); + out("lower = (uae_s32)(uae_s8)%s(dsta);\nupper = (uae_s32)(uae_s8)%s(dsta + 1);\n", srcb, srcb); out("if ((extra & 0x8000) == 0) reg = (uae_s32)(uae_s8)reg;\n"); break; case sz_word: - out("lower = (uae_s32)(uae_s16)%s(dsta); upper = (uae_s32)(uae_s16)%s(dsta + 2);\n", srcw, srcw); + out("lower = (uae_s32)(uae_s16)%s(dsta);\nupper = (uae_s32)(uae_s16)%s(dsta + 2);\n", srcw, srcw); out("if ((extra & 0x8000) == 0) reg = (uae_s32)(uae_s16)reg;\n"); break; case sz_long: @@ -7442,9 +7445,9 @@ bccl_not68020: } out("CLEAR_CZNV();\n"); if (curi->size == sz_long) { - fill_prefetch_next_noopcodecopy("SET_NFLG(val & 0x8000);SET_ZFLG(!(val & 0xffff));\n"); + fill_prefetch_next_noopcodecopy("SET_NFLG(val & 0x8000);\nSET_ZFLG(!(val & 0xffff));\n"); } else { - fill_prefetch_next_noopcodecopy("SET_ZFLG(!(val & %s));SET_NFLG(val & %s);\n", bit_mask(curi->size), cmask(curi->size)); + fill_prefetch_next_noopcodecopy("SET_ZFLG(!(val & %s));\nSET_NFLG(val & %s);\n", bit_mask(curi->size), cmask(curi->size)); } out("uae_u32 sign = (%s & val) >> %d;\n", cmask (curi->size), bit_size (curi->size) - 1); out("int ccnt = cnt & 63;\n"); @@ -7482,9 +7485,9 @@ bccl_not68020: } out("CLEAR_CZNV();\n"); if (curi->size == sz_long) { - fill_prefetch_next_noopcodecopy("SET_NFLG(val & 0x8000);SET_ZFLG(!(val & 0xffff));\n"); + fill_prefetch_next_noopcodecopy("SET_NFLG(val & 0x8000);\nSET_ZFLG(!(val & 0xffff));\n"); } else { - fill_prefetch_next_noopcodecopy("SET_ZFLG(!(val & %s));SET_NFLG(val & %s);\n", bit_mask(curi->size), cmask(curi->size)); + fill_prefetch_next_noopcodecopy("SET_ZFLG(!(val & %s));\nSET_NFLG(val & %s);\n", bit_mask(curi->size), cmask(curi->size)); } out("int ccnt = cnt & 63;\n"); out("cnt &= 63;\n"); @@ -7525,9 +7528,9 @@ bccl_not68020: } out("CLEAR_CZNV();\n"); if (curi->size == sz_long) { - fill_prefetch_next_noopcodecopy("SET_NFLG(val & 0x8000);SET_ZFLG(!(val & 0xffff));\n"); + fill_prefetch_next_noopcodecopy("SET_NFLG(val & 0x8000);\nSET_ZFLG(!(val & 0xffff));\n"); } else { - fill_prefetch_next_noopcodecopy("SET_ZFLG(!(val & %s));SET_NFLG(val & %s);\n", bit_mask(curi->size), cmask(curi->size)); + fill_prefetch_next_noopcodecopy("SET_ZFLG(!(val & %s));\nSET_NFLG(val & %s);\n", bit_mask(curi->size), cmask(curi->size)); } out("int ccnt = cnt & 63;\n"); out("cnt &= 63;\n"); @@ -7561,9 +7564,9 @@ bccl_not68020: } out("CLEAR_CZNV();\n"); if (curi->size == sz_long) { - fill_prefetch_next_noopcodecopy("SET_NFLG(val & 0x8000);SET_ZFLG(!(val & 0xffff));\n"); + fill_prefetch_next_noopcodecopy("SET_NFLG(val & 0x8000);\nSET_ZFLG(!(val & 0xffff));\n"); } else { - fill_prefetch_next_noopcodecopy("SET_ZFLG(!(val & %s));SET_NFLG(val & %s);\n", bit_mask(curi->size), cmask(curi->size)); + fill_prefetch_next_noopcodecopy("SET_ZFLG(!(val & %s));\nSET_NFLG(val & %s);\n", bit_mask(curi->size), cmask(curi->size)); } out("int ccnt = cnt & 63;\n"); out("cnt &= 63;\n"); @@ -7597,9 +7600,9 @@ bccl_not68020: } out("CLEAR_CZNV();\n"); if (curi->size == sz_long) { - fill_prefetch_next_noopcodecopy("SET_NFLG(val & 0x8000);SET_ZFLG(!(val & 0xffff));\n"); + fill_prefetch_next_noopcodecopy("SET_NFLG(val & 0x8000);\nSET_ZFLG(!(val & 0xffff));\n"); } else { - fill_prefetch_next_noopcodecopy("SET_ZFLG(!(val & %s));SET_NFLG(val & %s);\n", bit_mask(curi->size), cmask(curi->size)); + fill_prefetch_next_noopcodecopy("SET_ZFLG(!(val & %s));\nSET_NFLG(val & %s);\n", bit_mask(curi->size), cmask(curi->size)); } out("int ccnt = cnt & 63;\n"); out("cnt &= 63;\n"); @@ -7631,9 +7634,9 @@ bccl_not68020: } out("CLEAR_CZNV();\n"); if (curi->size == sz_long) { - fill_prefetch_next_noopcodecopy("SET_NFLG(val & 0x8000);SET_ZFLG(!(val & 0xffff));\n"); + fill_prefetch_next_noopcodecopy("SET_NFLG(val & 0x8000);\nSET_ZFLG(!(val & 0xffff));\n"); } else { - fill_prefetch_next_noopcodecopy("SET_ZFLG(!(val & %s));SET_NFLG(val & %s);\n", bit_mask(curi->size), cmask(curi->size)); + fill_prefetch_next_noopcodecopy("SET_ZFLG(!(val & %s));\nSET_NFLG(val & %s);\n", bit_mask(curi->size), cmask(curi->size)); } out("int ccnt = cnt & 63;\n"); out("cnt &= 63;\n"); @@ -7665,9 +7668,9 @@ bccl_not68020: } out("CLEAR_CZNV();\n"); if (curi->size == sz_long) { - fill_prefetch_next_noopcodecopy("SET_NFLG(val & 0x8000);SET_ZFLG(!(val & 0xffff));SET_CFLG(GET_XFLG());\n"); + fill_prefetch_next_noopcodecopy("SET_NFLG(val & 0x8000);\nSET_ZFLG(!(val & 0xffff));\nSET_CFLG(GET_XFLG());\n"); } else { - fill_prefetch_next_noopcodecopy("SET_ZFLG(!(val & %s));SET_NFLG(val & %s);SET_CFLG(GET_XFLG());\n", bit_mask(curi->size), cmask(curi->size)); + fill_prefetch_next_noopcodecopy("SET_ZFLG(!(val & %s));\nSET_NFLG(val & %s);\nSET_CFLG(GET_XFLG());\n", bit_mask(curi->size), cmask(curi->size)); } out("int ccnt = cnt & 63;\n"); out("cnt &= 63;\n"); @@ -7703,9 +7706,9 @@ bccl_not68020: } out("CLEAR_CZNV();\n"); if (curi->size == sz_long) { - fill_prefetch_next_noopcodecopy("SET_NFLG(val & 0x8000);SET_ZFLG(!(val & 0xffff));SET_CFLG(GET_XFLG());\n"); + fill_prefetch_next_noopcodecopy("SET_NFLG(val & 0x8000);\nSET_ZFLG(!(val & 0xffff));\nSET_CFLG(GET_XFLG());\n"); } else { - fill_prefetch_next_noopcodecopy("SET_ZFLG(!(val & %s));SET_NFLG(val & %s);SET_CFLG(GET_XFLG());\n", bit_mask(curi->size), cmask(curi->size)); + fill_prefetch_next_noopcodecopy("SET_ZFLG(!(val & %s));\nSET_NFLG(val & %s);\nSET_CFLG(GET_XFLG());\n", bit_mask(curi->size), cmask(curi->size)); } out("int ccnt = cnt & 63;\n"); out("cnt &= 63;\n"); @@ -7740,7 +7743,7 @@ bccl_not68020: case sz_long: out("uae_u32 val = data;\n"); break; default: term(); } - fill_prefetch_next_noopcodecopy("CLEAR_CZNV();SET_CFLG(val & 1);SET_ZFLG(!(val >> 1));SET_NFLG(val & 0x8000);SET_XFLG(GET_CFLG());\n"); + fill_prefetch_next_noopcodecopy("CLEAR_CZNV();\nSET_CFLG(val & 1);\nSET_ZFLG(!(val >> 1));\nSET_NFLG(val & 0x8000);\nSET_XFLG(GET_CFLG());\n"); out("uae_u32 sign = %s & val;\n", cmask (curi->size)); out("uae_u32 cflg = val & 1;\n"); out("val = (val >> 1) | sign;\n"); @@ -7758,7 +7761,7 @@ bccl_not68020: case sz_long: out("uae_u32 val = data;\n"); break; default: term(); } - fill_prefetch_next_noopcodecopy("CLEAR_CZNV();SET_CFLG(val & %s);SET_ZFLG(!((val << 1) & 0x7fff));SET_NFLG(val & 0x4000);SET_XFLG(GET_CFLG());SET_VFLG((val & 0x8000) != ((val << 1) & 0x8000));\n", cmask(curi->size)); + fill_prefetch_next_noopcodecopy("CLEAR_CZNV();\nSET_CFLG(val & %s);\nSET_ZFLG(!((val << 1) & 0x7fff));\nSET_NFLG(val & 0x4000);\nSET_XFLG(GET_CFLG());\nSET_VFLG((val & 0x8000) != ((val << 1) & 0x8000));\n", cmask(curi->size)); out("uae_u32 sign = %s & val;\n", cmask (curi->size)); out("uae_u32 sign2;\n"); out("val <<= 1;\n"); @@ -7778,7 +7781,7 @@ bccl_not68020: case sz_long: out("uae_u32 val = data;\n"); break; default: term(); } - fill_prefetch_next_noopcodecopy("CLEAR_CZNV();SET_CFLG(val & 1);SET_ZFLG(!(val >> 1));SET_NFLG(0);SET_XFLG(GET_CFLG());\n"); + fill_prefetch_next_noopcodecopy("CLEAR_CZNV();\nSET_CFLG(val & 1);\nSET_ZFLG(!(val & 0xfffe));\nSET_NFLG(0);\nSET_XFLG(GET_CFLG());\n"); out("uae_u32 carry = val & 1;\n"); out("val >>= 1;\n"); genflags (flag_logical, curi->size, "val", "", ""); @@ -7795,7 +7798,7 @@ bccl_not68020: case sz_long: out("uae_u32 val = data;\n"); break; default: term(); } - fill_prefetch_next_noopcodecopy("CLEAR_CZNV();SET_CFLG(val & %s);SET_ZFLG(!(val << 1));SET_NFLG(val & 0x4000);SET_XFLG(GET_CFLG());\n", cmask(curi->size)); + fill_prefetch_next_noopcodecopy("CLEAR_CZNV();\nSET_CFLG(val & %s);\nSET_ZFLG(!(val & 0x7fff));\nSET_NFLG(val & 0x4000);\nSET_XFLG(GET_CFLG());\n", cmask(curi->size)); out("uae_u32 carry = val & %s;\n", cmask (curi->size)); out("val <<= 1;\n"); genflags (flag_logical, curi->size, "val", "", ""); @@ -7812,7 +7815,7 @@ bccl_not68020: case sz_long: out("uae_u32 val = data;\n"); break; default: term(); } - fill_prefetch_next_noopcodecopy("CLEAR_CZNV();SET_CFLG(val & %s);SET_ZFLG(!val);SET_NFLG(val & 0x4000);\n", cmask(curi->size)); + fill_prefetch_next_noopcodecopy("CLEAR_CZNV();SET_CFLG(val & %s);\nSET_ZFLG(!val);\nSET_NFLG(val & 0x4000);\n", cmask(curi->size)); out("uae_u32 carry = val & %s;\n", cmask (curi->size)); out("val <<= 1;\n"); out("if (carry) val |= 1;\n"); @@ -7829,7 +7832,7 @@ bccl_not68020: case sz_long: out("uae_u32 val = data;\n"); break; default: term(); } - fill_prefetch_next_noopcodecopy("CLEAR_CZNV();SET_CFLG(val & 1);SET_ZFLG(!val);SET_NFLG(val & 0x0001);\n"); + fill_prefetch_next_noopcodecopy("CLEAR_CZNV();\nSET_CFLG(val & 1);\nSET_ZFLG(!val);\nSET_NFLG(val & 0x0001);\n"); out("uae_u32 carry = val & 1;\n"); out("val >>= 1;\n"); out("if (carry) val |= %s;\n", cmask (curi->size)); @@ -7846,7 +7849,7 @@ bccl_not68020: case sz_long: out("uae_u32 val = data;\n"); break; default: term(); } - fill_prefetch_next_noopcodecopy("CLEAR_CZNV();SET_CFLG(val & 0x8000);SET_ZFLG(!((val << 1) | GET_XFLG()));SET_NFLG(val & 0x4000);SET_XFLG(GET_CFLG());\n", cmask(curi->size)); + fill_prefetch_next_noopcodecopy("CLEAR_CZNV();\nSET_CFLG(val & 0x8000);\nSET_ZFLG(!((val << 1) | GET_XFLG()));\nSET_NFLG(val & 0x4000);\nSET_XFLG(GET_CFLG());\n", cmask(curi->size)); out("uae_u32 carry = val & %s;\n", cmask (curi->size)); out("val <<= 1;\n"); out("if (GET_XFLG()) val |= 1;\n"); @@ -7864,7 +7867,7 @@ bccl_not68020: case sz_long: out("uae_u32 val = data;\n"); break; default: term(); } - fill_prefetch_next_noopcodecopy("CLEAR_CZNV();SET_CFLG(val & 1);SET_ZFLG(!((val >> 1) | GET_XFLG()));SET_NFLG(GET_XFLG());SET_XFLG(GET_CFLG());\n", cmask(curi->size)); + fill_prefetch_next_noopcodecopy("CLEAR_CZNV();SET_CFLG(val & 1);\nSET_ZFLG(!((val >> 1) | GET_XFLG()))\n;SET_NFLG(GET_XFLG())\n;SET_XFLG(GET_CFLG());\n", cmask(curi->size)); out("uae_u32 carry = val & 1;\n"); out("val >>= 1;\n"); out("if (GET_XFLG()) val |= %s;\n", cmask (curi->size));