static int atcindextable[32];
static int tt_enabled;
-int mmu030_idx;
+int mmu030_idx, mmu030_idx_done;
uae_u32 mm030_stageb_address;
bool mmu030_retry;
#endif
#if 0
- if (addr == 0xBFE201)
+ if (addr == 0x00016060)
write_log("!");
+#endif
+#if 0
if (mmu030_state[1] & MMU030_STATEFLAG1_SUBACCESS0)
write_log("!");
if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM1)
uae_u32 mmu030_data_buffer_out_v = get_long_mmu030(a7 + 0x18);
// Internal register, our opcode storage area
uae_u32 oc = get_long_mmu030(a7 + 0x14);
- int idxsize = -1;
+ int idxsize = -1, idxsize_done = -1;
// Fetch last word, real CPU does it to allow OS bus handler to map
// the page if frame crosses pages and following page is not resident.
mmu030_state[1] = mmu030_state_1;
mmu030_state[2] = 0;
mmu030_opcode = oc;
- mmu030_idx = 0;
+ mmu030_idx = mmu030_idx_done = 0;
m68k_areg(regs, 7) += 32;
mmu030_fmovem_store_1 = get_long_mmu030(a7 + 0x5c - (8 + 1) * 4);
}
- idxsize = get_word_mmu030(a7 + 0x36);
- for (int i = 0; i < idxsize + 1; i++) {
- mmu030_ad_v[i].done = i < idxsize;
+ uae_u16 v = get_word_mmu030(a7 + 0x36);
+ idxsize = v & 0xff;
+ idxsize_done = (v >> 8) & 0xff;
+ for (int i = 0; i < idxsize_done; i++) {
mmu030_ad_v[i].val = get_long_mmu030(a7 + 0x5c - (i + 1) * 4);
}
- mmu030_ad_v[idxsize + 1].done = false;
// did we have data fault but DF bit cleared?
if (ssw & (MMU030_SSW_DF << 1) && !(ssw & MMU030_SSW_DF)) {
// if movem, skip next move
mmu030_state_1 |= MMU030_STATEFLAG1_MOVEM2;
} else {
- mmu030_ad_v[idxsize].done = true;
if (ssw & MMU030_SSW_RW) {
// Read and no DF: use value in data input buffer
- mmu030_ad_v[idxsize].val = mmu030_data_buffer_in_v;
+ mmu030_ad_v[idxsize_done++].val = mmu030_data_buffer_in_v;
}
}
unalign_clear();
mmu030_opcode_stageb = stageb;
write_log(_T("Software fixed stage B! opcode = %04x\n"), stageb);
} else {
- mmu030_ad_v[idxsize].done = true;
mmu030_ad_v[idxsize].val = stageb;
+ idxsize_done = idxsize;
write_log(_T("Software fixed stage B! opcode = %04X, opword = %04x\n"), mmu030_opcode_v, stageb);
}
}
mmu030_fmovem_store[1] = mmu030_fmovem_store_1;
mmu030_data_buffer_out = mmu030_data_buffer_out_v;
mmu030_idx = idxsize;
- for (int i = 0; i <= mmu030_idx + 1; i++) {
- mmu030_ad[i].done = mmu030_ad_v[i].done;
+ mmu030_idx_done = idxsize_done;
+ for (int i = 0; i < idxsize_done; i++) {
mmu030_ad[i].val = mmu030_ad_v[i].val;
}
if ((ssw & MMU030_SSW_DF) && (ssw & MMU030_SSW_RM)) {
// Locked-Read-Modify-Write restarts whole instruction.
- mmu030_ad[0].done = false;
+ idxsize_done = 0;
} else if (ssw & MMU030_SSW_DF) {
if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM1) {
mmu030_state[1] |= MMU030_STATEFLAG1_MOVEM2;
} else if (idxsize >= 0) {
- mmu030_ad[idxsize].val = mmu030_data_buffer_out;
- mmu030_ad[idxsize].done = true;
+ mmu030_ad[mmu030_idx_done].val = mmu030_data_buffer_out;
+ mmu030_idx_done++;
}
} else {
if (mmu030_state[1] & MMU030_STATEFLAG1_SUBACCESS0) {
if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM1) {
mmu030_state[1] |= MMU030_STATEFLAG1_MOVEM2;
} else if (idxsize >= 0) {
- mmu030_ad[idxsize].done = true;
+ mmu030_idx_done++;
}
}
uae_u16 dp;
int reg;
uae_u32 v;
- int oldidx;
+ int oldidx, oldidx2;
int pcadd = 0;
// we need to do this hack here because in worst case we don't have enough
}
oldidx = mmu030_idx;
+ oldidx2 = mmu030_idx_done;
dp = next_iword_mmu030_state ();
pcadd += 1;
mmu030_state[2] |= pcadd << (idx * 4);
mmu030_disp_store[idx] = v;
mmu030_idx = oldidx;
- mmu030_ad[mmu030_idx].done = false;
+ mmu030_idx_done = oldidx2;
return v;
}
uae_u16 dp;
int reg;
uae_u32 v;
- int oldidx;
+ int oldidx, oldidx2;
int pcadd = 0;
// we need to do this hack here because in worst case we don't have enough
}
oldidx = mmu030_idx;
+ oldidx2 = mmu030_idx_done;
dp = next_iword_mmu030c_state ();
pcadd += 1;
mmu030_state[2] |= pcadd << (idx * 4);
mmu030_disp_store[idx] = v;
mmu030_idx = oldidx;
- mmu030_ad[mmu030_idx].done = false;
+ mmu030_idx_done = oldidx2;
return v;
}
uae_u32 oc = get_long_mmu030c(a7 + 0x14);
uae_u32 stagesbc = get_long_mmu030c(a7 + 12);
- int idxsize = -1;
+ int idxsize = -1, idxsize_done = -1;
bool doprefetch = true;
// Fetch last word, real CPU does it to allow OS bus handler to map
mmu030_state[0] = 0;
mmu030_state[1] = mmu030_state_1;
mmu030_state[2] = 0;
- mmu030_idx = 0;
+ mmu030_idx = mmu030_idx_done = 0;
doprefetch = false;
mmu030_fmovem_store_1 = get_long_mmu030c(a7 + 0x5c - (8 + 1) * 4);
}
- idxsize = get_word_mmu030c(a7 + 0x36);
- for (int i = 0; i < idxsize + 1; i++) {
- mmu030_ad_v[i].done = i < idxsize;
+ uae_u16 v = get_word_mmu030c(a7 + 0x36);
+ idxsize = v & 0xff;
+ idxsize_done = (v >> 8) & 0xff;
+ for (int i = 0; i < idxsize_done; i++) {
mmu030_ad_v[i].val = get_long_mmu030c(a7 + 0x5c - (i + 1) * 4);
}
- mmu030_ad_v[idxsize + 1].done = false;
// did we have data fault but DF bit cleared?
if (ssw & (MMU030_SSW_DF << 1) && !(ssw & MMU030_SSW_DF)) {
// if movem, skip next move
mmu030_state_1 |= MMU030_STATEFLAG1_MOVEM2;
} else {
- mmu030_ad_v[idxsize].done = true;
if (ssw & MMU030_SSW_RW) {
// Read and no DF: use value in data input buffer
- mmu030_ad_v[idxsize].val = mmu030_data_buffer_in_v;
+ mmu030_ad_v[idxsize_done++].val = mmu030_data_buffer_in_v;
}
}
unalign_clear();
mmu030_fmovem_store[1] = mmu030_fmovem_store_1;
mmu030_data_buffer_out = mmu030_data_buffer_out_v;
mmu030_idx = idxsize;
- for (int i = 0; i <= mmu030_idx + 1; i++) {
- mmu030_ad[i].done = mmu030_ad_v[i].done;
+ mmu030_idx_done = idxsize_done;
+ for (int i = 0; i < idxsize_done; i++) {
mmu030_ad[i].val = mmu030_ad_v[i].val;
}
if ((ssw & MMU030_SSW_DF) && (ssw & MMU030_SSW_RM)) {
// Locked-Read-Modify-Write restarts whole instruction.
- mmu030_ad[0].done = false;
+ mmu030_idx_done = 0;
} else if (ssw & MMU030_SSW_DF) {
// retry faulted access
if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM1) {
mmu030_state[1] |= MMU030_STATEFLAG1_MOVEM2;
} else if (idxsize >= 0) {
- mmu030_ad[idxsize].val = mmu030_data_buffer_out;
- mmu030_ad[idxsize].done = true;
+ mmu030_ad[mmu030_idx_done].val = mmu030_data_buffer_out;
+ mmu030_idx_done++;
}
} else {
if (mmu030_state[1] & MMU030_STATEFLAG1_SUBACCESS0) {
if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM1) {
mmu030_state[1] |= MMU030_STATEFLAG1_MOVEM2;
} else if (idxsize >= 0) {
- mmu030_ad[idxsize].done = true;
+ mmu030_idx_done++;
}
}
}
#define MAX_MMU030_ACCESS 9
extern uae_u32 mm030_stageb_address;
-extern int mmu030_idx;
+extern int mmu030_idx, mmu030_idx_done;
extern bool mmu030_retry;
extern int mmu030_opcode, mmu030_opcode_stageb;
extern int mmu030_fake_prefetch;
struct mmu030_access
{
- bool done;
uae_u32 val;
};
extern struct mmu030_access mmu030_ad[MAX_MMU030_ACCESS + 1];
mmu030_put_byte(addr, val, fc);
}
-
#define ACCESS_CHECK_PUT \
- if (!mmu030_ad[mmu030_idx].done) { \
- mmu030_data_buffer_out = v; \
- } else { \
- mmu030_idx++; \
+ if (mmu030_idx++ < mmu030_idx_done) { \
return; \
+ } else { \
+ mmu030_data_buffer_out = v; \
}
#define ACCESS_CHECK_GET \
- if (mmu030_ad[mmu030_idx].done) { \
- v = mmu030_ad[mmu030_idx].val; \
- mmu030_idx++; \
+ if (mmu030_idx++ < mmu030_idx_done) { \
+ v = mmu030_ad[mmu030_idx - 1].val; \
return v; \
}
#define ACCESS_CHECK_GET_PC(pc) \
- if (mmu030_ad[mmu030_idx].done) { \
- v = mmu030_ad[mmu030_idx].val; \
- mmu030_idx++; \
- m68k_incpci (pc); \
+ if (mmu030_idx++ < mmu030_idx_done) { \
+ v = mmu030_ad[mmu030_idx - 1].val; \
+ m68k_incpci(pc); \
return v; \
}
#define ACCESS_EXIT_PUT \
- mmu030_ad[mmu030_idx].val = mmu030_data_buffer_out; \
- mmu030_ad[mmu030_idx].done = true; \
- mmu030_idx++; \
- mmu030_ad[mmu030_idx].done = false;
+ mmu030_ad[mmu030_idx_done++].val = mmu030_data_buffer_out;
#define ACCESS_EXIT_GET \
- mmu030_ad[mmu030_idx].val = v; \
- mmu030_ad[mmu030_idx].done = true; \
- mmu030_idx++; \
- mmu030_ad[mmu030_idx].done = false;
+ mmu030_ad[mmu030_idx_done++].val = v;
+
+STATIC_INLINE uae_u32 state_store_mmu030(uae_u32 v)
+{
+ if (mmu030_idx++ < mmu030_idx_done) {
+ v = mmu030_ad[mmu030_idx - 1].val;
+ } else {
+ mmu030_ad[mmu030_idx_done++].val = v;
+ }
+ return v;
+}
// non-cache
return v;
}
-STATIC_INLINE uae_u32 state_store_mmu030(uae_u32 v)
-{
- if (mmu030_ad[mmu030_idx].done) {
- v = mmu030_ad[mmu030_idx].val;
- mmu030_idx++;
- } else {
- mmu030_ad[mmu030_idx].val = v;
- mmu030_ad[mmu030_idx].done = true;
- mmu030_idx++;
- mmu030_ad[mmu030_idx].done = false;
- }
- return v;
-}
-
extern void m68k_do_rts_mmu030 (void);
extern void m68k_do_rte_mmu030 (uaecptr a7);
extern void flush_mmu030 (uaecptr, int);
static ALWAYS_INLINE uae_u32 sfc030c_get_long(uaecptr addr)
{
#if MMUDEBUG > 2
- write_log(_T("sfc030_get_long: FC = %i\n"),fc);
+ write_log(_T("sfc030_get_long: FC = %i\n"), regs.sfc);
#endif
return read_data_030_fc_lget(addr, regs.sfc);
}
static ALWAYS_INLINE uae_u16 sfc030c_get_word(uaecptr addr)
{
#if MMUDEBUG > 2
- write_log(_T("sfc030_get_word: FC = %i\n"),fc);
+ write_log(_T("sfc030_get_word: FC = %i\n"), regs.sfc);
#endif
return read_data_030_fc_wget(addr, regs.sfc);
}
static ALWAYS_INLINE uae_u8 sfc030c_get_byte(uaecptr addr)
{
#if MMUDEBUG > 2
- write_log(_T("sfc030_get_byte: FC = %i\n"),fc);
+ write_log(_T("sfc030_get_byte: FC = %i\n"), regs.sfc);
#endif
return read_data_030_fc_bget(addr, regs.sfc);
}
static ALWAYS_INLINE void dfc030c_put_long(uaecptr addr, uae_u32 val)
{
#if MMUDEBUG > 2
- write_log(_T("dfc030_put_long: %08X = %08X FC = %i\n"), addr, val, fc);
+ write_log(_T("dfc030_put_long: %08X = %08X FC = %i\n"), addr, val, regs.dfc);
#endif
write_data_030_fc_lput(addr, val, regs.dfc);
}
static ALWAYS_INLINE void dfc030c_put_word(uaecptr addr, uae_u16 val)
{
#if MMUDEBUG > 2
- write_log(_T("dfc030_put_word: %08X = %04X FC = %i\n"), addr, val, fc);
+ write_log(_T("dfc030_put_word: %08X = %04X FC = %i\n"), addr, val, regs.dfc);
#endif
write_data_030_fc_wput(addr, val, regs.dfc);
}
static ALWAYS_INLINE void dfc030c_put_byte(uaecptr addr, uae_u8 val)
{
#if MMUDEBUG > 2
- write_log(_T("dfc030_put_byte: %08X = %02X FC = %i\n"), addr, val, fc);
+ write_log(_T("dfc030_put_byte: %08X = %02X FC = %i\n"), addr, val, regs.dfc);
#endif
write_data_030_fc_bput(addr, val, regs.dfc);
}