uae_u16 v = get_word_mmu030(a7 + 0x36);
idxsize = v & 0xff;
idxsize_done = (v >> 8) & 0xff;
- for (int i = 0; i < idxsize_done; i++) {
+ for (int i = 0; i < idxsize_done + 1; i++) {
mmu030_ad_v[i].val = get_long_mmu030(a7 + 0x5c - (i + 1) * 4);
}
} else {
if (ssw & MMU030_SSW_RW) {
// Read and no DF: use value in data input buffer
- mmu030_ad_v[idxsize_done++].val = mmu030_data_buffer_in_v;
- }
+ mmu030_ad_v[idxsize_done].val = mmu030_data_buffer_in_v;
+ } // else: use value idxsize_done that was saved from regs.wb3_data;
+ idxsize_done++;
}
unalign_clear();
}
mmu030_data_buffer_out = mmu030_data_buffer_out_v;
mmu030_idx = idxsize;
mmu030_idx_done = idxsize_done;
- for (int i = 0; i < idxsize_done; i++) {
+ for (int i = 0; i < idxsize_done + 1; i++) {
mmu030_ad[i].val = mmu030_ad_v[i].val;
}
uae_u16 v = get_word_mmu030c(a7 + 0x36);
idxsize = v & 0xff;
idxsize_done = (v >> 8) & 0xff;
- for (int i = 0; i < idxsize_done; i++) {
+ for (int i = 0; i < idxsize_done + 1; i++) {
mmu030_ad_v[i].val = get_long_mmu030c(a7 + 0x5c - (i + 1) * 4);
}
} else {
if (ssw & MMU030_SSW_RW) {
// Read and no DF: use value in data input buffer
- mmu030_ad_v[idxsize_done++].val = mmu030_data_buffer_in_v;
+ mmu030_ad_v[idxsize_done].val = mmu030_data_buffer_in_v;
}
+ idxsize_done++;
}
unalign_clear();
}
mmu030_data_buffer_out = mmu030_data_buffer_out_v;
mmu030_idx = idxsize;
mmu030_idx_done = idxsize_done;
- for (int i = 0; i < idxsize_done; i++) {
+ for (int i = 0; i < idxsize_done + 1; i++) {
mmu030_ad[i].val = mmu030_ad_v[i].val;
}
}
#endif
if (!(ssw & MMU030_SSW_RW)) {
- mmu030_ad[mmu030_idx].val = regs.wb3_data;
+ // written value that caused fault but was not yet written to memory
+ // this value is used in cpummu030 when write is retried.
+ mmu030_ad[mmu030_idx_done].val = regs.wb3_data;
}
- for (i = 0; i < mmu030_idx_done; i++) {
+ for (i = 0; i < mmu030_idx_done + 1; i++) {
m68k_areg(regs, 7) -= 4;
x_put_long(m68k_areg(regs, 7), mmu030_ad[i].val);
}