X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=cpu%2Fsh2mame%2Fsh2pico.c;h=414985c48da6fcca941657973d4325ca6553ea16;hb=b78efee2b2213cf62a1b8a3b7a5adf05e39b4e4e;hp=e77329c76dc4a9b59c6c8d29968e8da9e95a6545;hpb=3cf9570bacd8952713106a2a2e3176852d811d18;p=picodrive.git diff --git a/cpu/sh2mame/sh2pico.c b/cpu/sh2mame/sh2pico.c index e77329c..414985c 100644 --- a/cpu/sh2mame/sh2pico.c +++ b/cpu/sh2mame/sh2pico.c @@ -9,19 +9,19 @@ typedef unsigned short UINT16; typedef unsigned char UINT8; // pico memhandlers -unsigned int pico32x_read8(unsigned int a); -unsigned int pico32x_read16(unsigned int a); -unsigned int pico32x_read32(unsigned int a); -void pico32x_write8(unsigned int a, unsigned int d); -void pico32x_write16(unsigned int a, unsigned int d); -void pico32x_write32(unsigned int a, unsigned int d); - -#define RB pico32x_read8 -#define RW pico32x_read16 -#define RL pico32x_read32 -#define WB pico32x_write8 -#define WW pico32x_write16 -#define WL pico32x_write32 +unsigned int p32x_sh2_read8(unsigned int a, int id); +unsigned int p32x_sh2_read16(unsigned int a, int id); +unsigned int p32x_sh2_read32(unsigned int a, int id); +void p32x_sh2_write8(unsigned int a, unsigned int d, int id); +void p32x_sh2_write16(unsigned int a, unsigned int d, int id); +void p32x_sh2_write32(unsigned int a, unsigned int d, int id); + +#define RB(a) p32x_sh2_read8(a,sh2->is_slave) +#define RW(a) p32x_sh2_read16(a,sh2->is_slave) +#define RL(a) p32x_sh2_read32(a,sh2->is_slave) +#define WB(a,d) p32x_sh2_write8(a,d,sh2->is_slave) +#define WW(a,d) p32x_sh2_write16(a,d,sh2->is_slave) +#define WL(a,d) p32x_sh2_write32(a,d,sh2->is_slave) // some stuff from sh2comn.h #define T 0x00000001 @@ -42,15 +42,15 @@ void pico32x_write32(unsigned int a, unsigned int d); void sh2_reset(SH2 *sh2) { int save_is_slave; -// cpu_irq_callback save_irqcallback; + void *save_irqcallback; -// save_irqcallback = sh2->irq_callback; + save_irqcallback = sh2->irq_callback; save_is_slave = sh2->is_slave; memset(sh2, 0, sizeof(SH2)); sh2->is_slave = save_is_slave; -// sh2->irq_callback = save_irqcallback; + sh2->irq_callback = save_irqcallback; sh2->pc = RL(0); sh2->r[15] = RL(4); @@ -103,7 +103,8 @@ int sh2_execute(SH2 *sh2_, int cycles) if (sh2->test_irq && !sh2->delay) { -// CHECK_PENDING_IRQ("mame_sh2_execute"); + if (sh2->pending_irq) + sh2_irl_irq(sh2, sh2->pending_irq); sh2->test_irq = 0; } sh2_icount--; @@ -113,9 +114,37 @@ int sh2_execute(SH2 *sh2_, int cycles) return cycles - sh2_icount; } -void sh2_init(SH2 *sh2) +void sh2_init(SH2 *sh2, int is_slave) { memset(sh2, 0, sizeof(*sh2)); + sh2->is_slave = is_slave; } +void sh2_irl_irq(SH2 *sh2, int level) +{ + int vector; + + sh2->pending_irq = level; + + if (level <= ((sh2->sr >> 4) & 0x0f)) + /* masked */ + return; + + sh2->irq_callback(sh2->is_slave, level); + vector = 64 + level/2; + + sh2->r[15] -= 4; + WL(sh2->r[15], sh2->sr); /* push SR onto stack */ + sh2->r[15] -= 4; + WL(sh2->r[15], sh2->pc); /* push PC onto stack */ + + /* set I flags in SR */ + sh2->sr = (sh2->sr & ~I) | (level << 4); + + /* fetch PC */ + sh2->pc = RL(sh2->vbr + vector * 4); + + /* 13 cycles at best */ + sh2_icount -= 13; +}