mirror of
https://github.com/RaySollium99/picodrive.git
synced 2025-09-05 07:17:45 -04:00
some irq hacks
notes to self (derived from Nemesis): H32: 0x10A .. 0x127 0x1D2 .. 0x1FF 0x000 0x001 pclk 30 46 1 |0x109 mclk 770 | 2650 = 3420 68kclk 110 378.5 ~= 488.5 H40: 0x14A .. 0x16C 0x1C9 .. 0x1FF 0x000 0x001 pclk 35 55 1 mclk 35*8 4*8+314+10+19*8 |0x149*8 788 | 2632 = 3420 68kclk 112.5 376 ~= 488.5
This commit is contained in:
parent
e015ad3c1b
commit
22814963cc
5 changed files with 39 additions and 38 deletions
36
pico/sek.c
36
pico/sek.c
|
@ -25,15 +25,29 @@ M68K_CONTEXT PicoCpuFM68k;
|
|||
#endif
|
||||
|
||||
|
||||
static int do_ack(int level)
|
||||
{
|
||||
struct PicoVideo *pv = &Pico.video;
|
||||
|
||||
elprintf(EL_INTS, "%cack: @ %06x [%u], p=%02x",
|
||||
level == 6 ? 'v' : 'h', SekPc, SekCyclesDone(), pv->pending_ints);
|
||||
// the VDP doesn't look at the 68k level
|
||||
if (pv->pending_ints & pv->reg[1] & 0x20) {
|
||||
pv->pending_ints &= ~0x20;
|
||||
return (pv->reg[0] & pv->pending_ints & 0x10) >> 2;
|
||||
}
|
||||
else if (pv->pending_ints & pv->reg[0] & 0x10)
|
||||
pv->pending_ints &= ~0x10;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* callbacks */
|
||||
#ifdef EMU_C68K
|
||||
// interrupt acknowledgment
|
||||
static int SekIntAck(int level)
|
||||
{
|
||||
// try to emulate VDP's reaction to 68000 int ack
|
||||
if (level == 4) { Pico.video.pending_ints = 0; elprintf(EL_INTS, "hack: @ %06x [%u]", SekPc, Pico.t.m68c_cnt); }
|
||||
else if(level == 6) { Pico.video.pending_ints &= ~0x20; elprintf(EL_INTS, "vack: @ %06x [%u]", SekPc, Pico.t.m68c_cnt); }
|
||||
PicoCpuCM68k.irq = 0;
|
||||
PicoCpuCM68k.irq = do_ack(level);
|
||||
return CYCLONE_INT_ACK_AUTOVECTOR;
|
||||
}
|
||||
|
||||
|
@ -71,9 +85,7 @@ static int SekUnrecognizedOpcode()
|
|||
#ifdef EMU_M68K
|
||||
static int SekIntAckM68K(int level)
|
||||
{
|
||||
if (level == 4) { Pico.video.pending_ints = 0; elprintf(EL_INTS, "hack: @ %06x [%u]", SekPc, Pico.t.m68c_cnt); }
|
||||
else if(level == 6) { Pico.video.pending_ints &= ~0x20; elprintf(EL_INTS, "vack: @ %06x [%u]", SekPc, Pico.t.m68c_cnt); }
|
||||
CPU_INT_LEVEL = 0;
|
||||
CPU_INT_LEVEL = do_ack(level) << 8;
|
||||
return M68K_INT_ACK_AUTOVECTOR;
|
||||
}
|
||||
|
||||
|
@ -87,15 +99,7 @@ static int SekTasCallback(void)
|
|||
#ifdef EMU_F68K
|
||||
static void SekIntAckF68K(unsigned level)
|
||||
{
|
||||
if (level == 4) {
|
||||
Pico.video.pending_ints = 0;
|
||||
elprintf(EL_INTS, "hack: @ %06x [%u]", SekPc, SekCyclesDone());
|
||||
}
|
||||
else if(level == 6) {
|
||||
Pico.video.pending_ints &= ~0x20;
|
||||
elprintf(EL_INTS, "vack: @ %06x [%u]", SekPc, SekCyclesDone());
|
||||
}
|
||||
PicoCpuFM68k.interrupts[0] = 0;
|
||||
PicoCpuFM68k.interrupts[0] = do_ack(level);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue