}
}
+static void action_replay_cia_access_delay(uae_u32 v)
+{
+ if (v) {
+ armode_read = ARMODE_WRITE_BFD100;
+ action_replay_flag = ACTION_REPLAY_ACTIVATE;
+ set_special(SPCFLAG_ACTION_REPLAY);
+ } else {
+ armode_read = ARMODE_READ_BFE001;
+ action_replay_flag = ACTION_REPLAY_ACTIVATE;
+ set_special(SPCFLAG_ACTION_REPLAY);
+ }
+}
+
void action_replay_cia_access(bool write)
{
if (armodel < 2)
if (action_replay_flag == ACTION_REPLAY_INACTIVE)
return;
if ((armode_write & ARMODE_ACTIVATE_BFE001) && !write) {
- armode_read = ARMODE_READ_BFE001;
- action_replay_flag = ACTION_REPLAY_ACTIVATE;
- set_special (SPCFLAG_ACTION_REPLAY);
+ event2_newevent_xx(-1, 1, write, action_replay_cia_access_delay);
} else if ((armode_write & ARMODE_ACTIVATE_BFD100) && write) {
- armode_read = ARMODE_WRITE_BFD100;
- action_replay_flag = ACTION_REPLAY_ACTIVATE;
- set_special (SPCFLAG_ACTION_REPLAY);
+ event2_newevent_xx(-1, 1, write, action_replay_cia_access_delay);
}
}
*tod = bintod;
}
-static uae_u8 ReadCIAA (unsigned int addr)
+static uae_u8 ReadCIAA (unsigned int addr, uae_u32 *flags)
{
unsigned int tmp;
int reg = addr & 15;
switch (reg) {
case 0:
{
-#ifdef ACTION_REPLAY
- action_replay_cia_access(false);
-#endif
+ *flags |= 1;
uae_u8 v = DISK_status_ciaa() & 0x3c;
v |= handle_joystick_buttons (ciaapra, ciaadra);
v |= (ciaapra | (ciaadra ^ 3)) & 0x03;
return 0;
}
-static uae_u8 ReadCIAB (unsigned int addr)
+static uae_u8 ReadCIAB (unsigned int addr, uae_u32 *flags)
{
unsigned int tmp;
int reg = addr & 15;
return 0;
}
-static void WriteCIAA (uae_u16 addr, uae_u8 val)
+static void WriteCIAA (uae_u16 addr, uae_u8 val, uae_u32 *flags)
{
int reg = addr & 15;
}
}
-static void WriteCIAB (uae_u16 addr, uae_u8 val)
+static void WriteCIAB (uae_u16 addr, uae_u8 val, uae_u32 *flags)
{
int reg = addr & 15;
#endif
break;
case 1:
-#ifdef ACTION_REPLAY
- action_replay_cia_access(true);
-#endif
+ *flags |= 2;
#if DONGLE_DEBUG > 0
if (notinrom ())
write_log (_T("BFD100 W %02X %s\n"), val, debuginfo(0));
{
int r = (addr & 0xf00) >> 8;
uae_u8 v = 0;
+ uae_u32 flags = 0;
if (isgarynocia(addr))
return dummy_get(addr, 1, false, 0);
case 0:
if (!issinglecia ()) {
cia_wait_pre (1 | 2);
- v = (addr & 1) ? ReadCIAA (r) : ReadCIAB (r);
+ v = (addr & 1) ? ReadCIAA (r, &flags) : ReadCIAB (r, &flags);
cia_wait_post (1 | 2, v);
}
break;
case 1:
cia_wait_pre (2);
if (currprefs.cpu_model == 68000 && currprefs.cpu_compatible) {
- v = (addr & 1) ? regs.irc : ReadCIAB (r);
+ v = (addr & 1) ? regs.irc : ReadCIAB (r, &flags);
} else {
- v = (addr & 1) ? dummy_get_safe(addr, 1, false, 0) : ReadCIAB (r);
+ v = (addr & 1) ? dummy_get_safe(addr, 1, false, 0) : ReadCIAB (r, &flags);
}
cia_wait_post (2, v);
break;
case 2:
cia_wait_pre (1);
if (currprefs.cpu_model == 68000 && currprefs.cpu_compatible)
- v = (addr & 1) ? ReadCIAA (r) : regs.irc >> 8;
+ v = (addr & 1) ? ReadCIAA (r, &flags) : regs.irc >> 8;
else
- v = (addr & 1) ? ReadCIAA (r) : dummy_get_safe(addr, 1, false, 0);
+ v = (addr & 1) ? ReadCIAA (r, &flags) : dummy_get_safe(addr, 1, false, 0);
cia_wait_post (1, v);
break;
case 3:
}
break;
}
-
+#ifdef ACTION_REPLAY
+ if (flags) {
+ action_replay_cia_access((flags & 2) != 0);
+ }
+#endif
return v;
}
{
int r = (addr & 0xf00) >> 8;
uae_u16 v = 0;
+ uae_u32 flags = 0;
if (isgarynocia(addr))
return dummy_get(addr, 2, false, 0);
if (!issinglecia ())
{
cia_wait_pre (1 | 2);
- v = (ReadCIAB (r) << 8) | ReadCIAA (r);
+ v = (ReadCIAB (r, &flags) << 8) | ReadCIAA (r, &flags);
cia_wait_post (1 | 2, v);
}
break;
case 1:
cia_wait_pre (2);
- v = (ReadCIAB (r) << 8) | dummy_get_safe(addr, 1, false, 0);
+ v = (ReadCIAB (r, &flags) << 8) | dummy_get_safe(addr, 1, false, 0);
cia_wait_post (2, v);
break;
case 2:
cia_wait_pre (1);
- v = (dummy_get_safe(addr, 1, false, 0) << 8) | ReadCIAA (r);
+ v = (dummy_get_safe(addr, 1, false, 0) << 8) | ReadCIAA (r, &flags);
cia_wait_post (1, v);
break;
case 3:
}
break;
}
+#ifdef ACTION_REPLAY
+ if (flags) {
+ action_replay_cia_access((flags & 2) != 0);
+ }
+#endif
return v;
}
int cs = cia_chipselect(addr);
if (!issinglecia () || (cs & 3) != 0) {
+ uae_u32 flags = 0;
cia_wait_pre (((cs & 2) == 0 ? 1 : 0) | ((cs & 1) == 0 ? 2 : 0));
if ((cs & 2) == 0)
- WriteCIAB (r, value);
+ WriteCIAB (r, value, &flags);
if ((cs & 1) == 0)
- WriteCIAA (r, value);
+ WriteCIAA (r, value, &flags);
cia_wait_post (((cs & 2) == 0 ? 1 : 0) | ((cs & 1) == 0 ? 2 : 0), value);
if (((cs & 3) == 3) && (warned > 0 || currprefs.illegal_mem)) {
write_log (_T("cia_bput: unknown CIA address %08X=%02X PC=%08X\n"), addr, value & 0xff, M68K_GETPC);
warned--;
}
+#ifdef ACTION_REPLAY
+ if (flags) {
+ action_replay_cia_access((flags & 2) != 0);
+ }
+#endif
}
}
int cs = cia_chipselect(addr);
if (!issinglecia () || (cs & 3) != 0) {
+ uae_u32 flags = 0;
cia_wait_pre (((cs & 2) == 0 ? 1 : 0) | ((cs & 1) == 0 ? 2 : 0));
if ((cs & 2) == 0)
- WriteCIAB (r, value >> 8);
+ WriteCIAB (r, value >> 8, &flags);
if ((cs & 1) == 0)
- WriteCIAA (r, value & 0xff);
+ WriteCIAA (r, value & 0xff, &flags);
cia_wait_post (((cs & 2) == 0 ? 1 : 0) | ((cs & 1) == 0 ? 2 : 0), value);
if (((cs & 3) == 3) && (warned > 0 || currprefs.illegal_mem)) {
write_log (_T("cia_wput: unknown CIA address %08X=%04X %08X\n"), addr, value & 0xffff, M68K_GETPC);
warned--;
}
+#ifdef ACTION_REPLAY
+ if (flags) {
+ action_replay_cia_access((flags & 2) != 0);
+ }
+#endif
}
}