diff options
| author | 2012-12-14 18:48:49 +0000 | |
|---|---|---|
| committer | 2012-12-14 18:48:49 +0000 | |
| commit | 66a59a104a9ddd11926122b0b71bc3c8bdfcb02a (patch) | |
| tree | 4c6f471894a0e1b51bc492a4ff6317b1142c2437 | |
| parent | e759cbccab31c406d0cd9f85a9dce17a541b0c89 (diff) | |
added audiocpu interrupts
| -rw-r--r-- | src/mame/drivers/kurukuru.c | 179 |
1 files changed, 91 insertions, 88 deletions
diff --git a/src/mame/drivers/kurukuru.c b/src/mame/drivers/kurukuru.c index de6a9145552..3b31f8dc32d 100644 --- a/src/mame/drivers/kurukuru.c +++ b/src/mame/drivers/kurukuru.c @@ -105,17 +105,27 @@ class kurukuru_state : public driver_device public: kurukuru_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), - m_v9938(*this, "v9938") { } + m_audiocpu(*this, "audiocpu"), + m_v9938(*this, "v9938") + { } + required_device<cpu_device> m_audiocpu; required_device<v9938_device> m_v9938; - + + UINT8 m_sound_irq_cause; + UINT8 m_sound_irq_mask; + DECLARE_WRITE8_MEMBER(kurukuru_bankswitch_w); - DECLARE_WRITE8_MEMBER(kurukuru_samples_w); - DECLARE_WRITE8_MEMBER(kurukuru_outport_w); + DECLARE_WRITE8_MEMBER(kurukuru_soundlatch_w); + DECLARE_READ8_MEMBER(kurukuru_soundlatch_r); + DECLARE_WRITE8_MEMBER(kurukuru_sound_irqmask_w); + DECLARE_READ8_MEMBER(kurukuru_sound_timer_irqack_r); + void update_sound_irq(UINT8 cause); virtual void machine_start(); virtual void machine_reset(); - TIMER_DEVICE_CALLBACK_MEMBER(kurukuru_interrupt); + TIMER_DEVICE_CALLBACK_MEMBER(kurukuru_vdp_scanline); + INTERRUPT_GEN_MEMBER(kurukuru_sound_timer_irq); }; #define MAIN_CLOCK XTAL_21_4772MHz @@ -132,45 +142,68 @@ public: /************************************************* -* Video Hardware * +* Interrupts * *************************************************/ -static void kurukuru_vdp0_interrupt(device_t *, v99x8_device &device, int i) +static void kurukuru_vdp_interrupt(device_t *, v99x8_device &device, int i) { - device.machine().device("maincpu")->execute().set_input_line(0, (i ? HOLD_LINE : CLEAR_LINE)); + device.machine().device("maincpu")->execute().set_input_line(0, (i ? ASSERT_LINE : CLEAR_LINE)); } -/************************************************* -* I/O * -*************************************************/ - -WRITE8_MEMBER(kurukuru_state::kurukuru_bankswitch_w) +TIMER_DEVICE_CALLBACK_MEMBER(kurukuru_state::kurukuru_vdp_scanline) { - // d4,d5: bank - membank("bank1")->set_entry(data >> 4 & 3); - - // d3: ? - // other bits: always set + m_v9938->set_resolution(0); + m_v9938->interrupt(); } -WRITE8_MEMBER(kurukuru_state::kurukuru_outport_w) +void kurukuru_state::update_sound_irq(UINT8 cause) { -// logerror("%02x\n", data); + m_sound_irq_cause = cause & 3; + UINT8 mask = m_sound_irq_cause & m_sound_irq_mask; + if (mask) + { + // use bit 0 for latch irq, and bit 1 for timer irq + // latch irq vector is $ef (rst $28) + // timer irq vector is $f7 (rst $30) + // if both are asserted, the vector becomes $f7 AND $ef = $e7 (rst $20) + const UINT8 irq_vector[4] = { 0x00, 0xef, 0xf7, 0xe7 }; + m_audiocpu->set_input_line_and_vector(0, ASSERT_LINE, irq_vector[mask]); + } + else + { + m_audiocpu->set_input_line(0, CLEAR_LINE); + } } -WRITE8_MEMBER(kurukuru_state::kurukuru_samples_w) +INTERRUPT_GEN_MEMBER(kurukuru_state::kurukuru_sound_timer_irq) { - popmessage("triggered sample: %02X", data); + update_sound_irq(m_sound_irq_cause | 2); } /************************************************* -* Memory Map * +* Memory Map / I/O * *************************************************/ +// Main CPU + +WRITE8_MEMBER(kurukuru_state::kurukuru_bankswitch_w) +{ + // d4,d5: bank + // other bits: ? + membank("bank1")->set_entry(data >> 4 & 3); +} + +WRITE8_MEMBER(kurukuru_state::kurukuru_soundlatch_w) +{ + soundlatch_byte_w(space, 0, data); + update_sound_irq(m_sound_irq_cause | 1); +} + + static ADDRESS_MAP_START( kurukuru_map, AS_PROGRAM, 8, kurukuru_state ) AM_RANGE(0x0000, 0x3fff) AM_ROM AM_RANGE(0x6000, 0xdfff) AM_ROMBANK("bank1") @@ -179,9 +212,9 @@ ADDRESS_MAP_END static ADDRESS_MAP_START( kurukuru_io, AS_IO, 8, kurukuru_state ) ADDRESS_MAP_GLOBAL_MASK(0xff) -// AM_RANGE(0x00, 0x00) AM_WRITENOP // seems for switch cpu... or irq? +// AM_RANGE(0x00, 0x00) AM_WRITENOP // seems for switch cpu... or irq? or hopper? AM_RANGE(0x10, 0x10) AM_READ_PORT("DSW1") - AM_RANGE(0x20, 0x20) AM_WRITE(kurukuru_samples_w) // trigger the m5205 sample number. + AM_RANGE(0x20, 0x20) AM_WRITE(kurukuru_soundlatch_w) AM_RANGE(0x80, 0x83) AM_DEVREADWRITE( "v9938", v9938_device, read, write ) AM_RANGE(0x90, 0x90) AM_WRITE(kurukuru_bankswitch_w) AM_RANGE(0xa0, 0xa0) AM_READ_PORT("IN0") @@ -203,6 +236,30 @@ ADDRESS_MAP_END */ +// Audio CPU + +WRITE8_MEMBER(kurukuru_state::kurukuru_sound_irqmask_w) +{ + // d0: sound latch irq enable + // d1: sound timer irq enable + // other bits: ? + m_sound_irq_mask = data; + update_sound_irq(m_sound_irq_cause); +} + +READ8_MEMBER(kurukuru_state::kurukuru_soundlatch_r) +{ + update_sound_irq(m_sound_irq_cause & ~1); + return soundlatch_byte_r(space, 0); +} + +READ8_MEMBER(kurukuru_state::kurukuru_sound_timer_irqack_r) +{ + update_sound_irq(m_sound_irq_cause & ~2); + return 0; +} + + static ADDRESS_MAP_START( audio_map, AS_PROGRAM, 8, kurukuru_state ) AM_RANGE(0x0000, 0xbfff) AM_ROM AM_RANGE(0xf800, 0xffff) AM_RAM @@ -210,56 +267,12 @@ ADDRESS_MAP_END static ADDRESS_MAP_START( audio_io, AS_IO, 8, kurukuru_state ) ADDRESS_MAP_GLOBAL_MASK(0xff) -// AM_RANGE(0x00, 0x00) seems for switch cpu... or irqack? -// AM_RANGE(0xff, 0xff) AM_WRITE(kurukuru_outport_w) +// AM_RANGE(0x40, 0x40) AM_WRITENOP + AM_RANGE(0x50, 0x50) AM_WRITE(kurukuru_sound_irqmask_w) + AM_RANGE(0x60, 0x60) AM_READ(kurukuru_soundlatch_r) + AM_RANGE(0x70, 0x70) AM_READ(kurukuru_sound_timer_irqack_r) ADDRESS_MAP_END -/* - 0x40 Write - 0x50 Write (0x0b) - 0x60 Read - 0x70 Read -*/ - -/* - Interrupts for audio CPU - Vectors for IM0 - 20h - 28h - 30h - - 20h: - - 0020 jp $0093 - 008e ld a,$0b - 0090 out ($50),a - 0092 ret - 0093 out ($40),a - 0095 in a,($70) ; maybe irqack? - 0097 in a,($60) ; soundlatch? - 0099 cp $0e - 009b jr nc,$00aa - 009d ld ($f800),a - 00a0 call $008e - 00a3 ld sp,$0000 - 00a6 ld hl,$0033 - 00a9 push hl - 00aa ei - 00ab reti - - 28h: - - 0028 jp $0097 - 0097 -> see above - - 30h: - - 0030 jp $00ad - 00ad out ($40),a - 00af in a,($70) - 00b1 ei - 00b2 reti - -*/ - /************************************************* * Input Ports Definitions * @@ -350,17 +363,8 @@ void kurukuru_state::machine_start() void kurukuru_state::machine_reset() { -} - - -/************************************************* -* R/W Handlers and Interrupt Routines * -*************************************************/ - -TIMER_DEVICE_CALLBACK_MEMBER(kurukuru_state::kurukuru_interrupt) -{ - m_v9938->set_resolution(0); - m_v9938->interrupt(); + m_sound_irq_mask = 0; + update_sound_irq(0); } @@ -389,21 +393,20 @@ static MACHINE_CONFIG_START( kurukuru, kurukuru_state ) MCFG_CPU_ADD("maincpu",Z80,MAIN_CLOCK/6) MCFG_CPU_PROGRAM_MAP(kurukuru_map) MCFG_CPU_IO_MAP(kurukuru_io) - MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", kurukuru_state, kurukuru_interrupt, "screen", 0, 1) + MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", kurukuru_state, kurukuru_vdp_scanline, "screen", 0, 1) MCFG_CPU_ADD("audiocpu", Z80, MAIN_CLOCK/6) MCFG_CPU_PROGRAM_MAP(audio_map) MCFG_CPU_IO_MAP(audio_io) - // need interrupts... + MCFG_CPU_PERIODIC_INT_DRIVER(kurukuru_state, kurukuru_sound_timer_irq, 4*60) // from M5205? need to fix that MCFG_NVRAM_ADD_0FILL("nvram") - /* video hardware */ MCFG_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK) MCFG_V9938_ADD("v9938", "screen", VDP_MEM) - MCFG_V99X8_INTERRUPT_CALLBACK_STATIC(kurukuru_vdp0_interrupt) + MCFG_V99X8_INTERRUPT_CALLBACK_STATIC(kurukuru_vdp_interrupt) MCFG_SCREEN_ADD("screen",RASTER) MCFG_SCREEN_REFRESH_RATE(60) |
