return drZ80.Z80PC_BASE;
}
+static void dz80_noop_irq_ack(void) {}
+
#ifdef FAST_Z80SP
static u32 drz80_sp_base;
*/
#ifdef FAST_Z80SP
// drZ80 is locked in single bank
- drz80_sp_base = (PicoAHW & PAHW_SMS) ? 0xc000 : 0x0000;
+ drz80_sp_base = (PicoIn.AHW & PAHW_SMS) ? 0xc000 : 0x0000;
drZ80.Z80SP_BASE = z80_read_map[drz80_sp_base >> Z80_MEM_SHIFT] << 1;
#endif
- if (PicoAHW & PAHW_SMS)
+ drZ80.z80_irq_callback = NULL; // use auto-clear
+ if (PicoIn.AHW & PAHW_SMS) {
drZ80.Z80SP = drZ80.Z80SP_BASE + 0xdff0; // simulate BIOS
+ drZ80.z80_irq_callback = dz80_noop_irq_ack;
+ }
// XXX: since we use direct SP pointer, it might make sense to force it to RAM,
// but we'll rely on built-in stack protection for now
#endif
#ifdef _USE_CZ80
Cz80_Reset(&CZ80);
- if (PicoAHW & PAHW_SMS)
+ if (PicoIn.AHW & PAHW_SMS)
Cz80_Set_Reg(&CZ80, CZ80_SP, 0xdff0);
#endif
}
-/* save state stuff */
-static int z80_unpack_legacy(const void *data)
-{
-#if defined(_USE_DRZ80)
- if (*(int *)data == 0x015A7244) { // "DrZ" v1 save?
- u32 pc, sp;
- memcpy(&drZ80, data+4, 0x54);
- pc = (drZ80.Z80PC - drZ80.Z80PC_BASE) & 0xffff;
- sp = (drZ80.Z80SP - drZ80.Z80SP_BASE) & 0xffff;
- // update bases
- drz80_load_pcsp(pc, sp);
- return 0;
- }
-#elif defined(_USE_CZ80)
- if (*(int *)data == 0x00007a43) { // "Cz" save?
- memcpy(&CZ80, data+8, offsetof(cz80_struc, BasePC));
- Cz80_Set_Reg(&CZ80, CZ80_PC, *(int *)(data+4));
- return 0;
- }
-#endif
- return -1;
-}
-
struct z80sr_main {
u8 a, f;
u8 b, c;
{
const struct z80_state *s = data;
if (strcmp(s->magic, "Z80") != 0) {
- if (z80_unpack_legacy(data) != 0)
- goto fail;
- elprintf(EL_STATUS, "legacy z80 state");
+ elprintf(EL_STATUS, "legacy z80 state - ignored");
return 0;
}
Cz80_Set_Reg(&CZ80, CZ80_IRQ, s->irq_pending ? HOLD_LINE : CLEAR_LINE);
return 0;
}
+#else
+ return 0;
#endif
-
-fail:
- elprintf(EL_STATUS|EL_ANOMALY, "z80_unpack failed");
- z80_reset();
- z80_int();
- return -1;
}
void z80_exit(void)