From 9cd1af602e63476ace70a2451b8faded30679ce9 Mon Sep 17 00:00:00 2001 From: cam900 Date: Thu, 22 Feb 2018 23:07:51 +0900 Subject: cave : Cleanup duplicates, Notes (#3225) * cave : Cleanup duplicates, Notes * cave.cpp : Fix spacing * cave : Build fixes * cave : Fix compile --- src/mame/drivers/cave.cpp | 738 +++++++++++++++++++++------------------------- src/mame/includes/cave.h | 93 +++--- src/mame/video/cave.cpp | 120 ++------ 3 files changed, 402 insertions(+), 549 deletions(-) diff --git a/src/mame/drivers/cave.cpp b/src/mame/drivers/cave.cpp index 223e1cc1115..8f8e2565684 100644 --- a/src/mame/drivers/cave.cpp +++ b/src/mame/drivers/cave.cpp @@ -49,6 +49,9 @@ To Do: - Sprite lag in some games (e.g. metmqstr). The sprites chip probably generates interrupts (unknown_irq) +- Max sprite number is possibly less than 1024 + (ex: Boss explosion scene at most of cave shmups on real hardware) + Stephh's notes (based on the games M68000 code and some tests) : @@ -86,6 +89,7 @@ Versions known to exist but not dumped: #include "sound/ym2151.h" #include "sound/ymz280b.h" #include "speaker.h" +#include #include "ppsatan.lh" @@ -227,9 +231,9 @@ READ16_MEMBER(cave_state::soundflags_ack_r) // bit 0 is low: can write command // bit 1 is low: can read answer // return ((m_sound_flag1 | m_sound_flag2) ? 1 : 0) | -// ((m_soundbuf_len > 0) ? 0 : 2) ; +// ((m_soundbuf_wptr != m_soundbuf_rptr) ? 0 : 2) ; - return ((m_soundbuf_len > 0) ? 0 : 2) ; + return ((m_soundbuf_wptr != m_soundbuf_rptr) ? 0 : 2) ; } /* Main CPU: write a 16 bit sound latch and generate a NMI on the sound CPU */ @@ -238,7 +242,6 @@ WRITE16_MEMBER(cave_state::sound_cmd_w) // m_sound_flag1 = 1; // m_sound_flag2 = 1; m_soundlatch->write(space, offset, data, mem_mask); - m_audiocpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE); m_maincpu->spin_until_time(attotime::from_usec(50)); // Allow the other cpu to reply } @@ -259,11 +262,10 @@ READ8_MEMBER(cave_state::soundlatch_hi_r) /* Main CPU: read the latch written by the sound CPU (acknowledge) */ READ16_MEMBER(cave_state::soundlatch_ack_r) { - if (m_soundbuf_len > 0) + if (m_soundbuf_wptr != m_soundbuf_rptr) { - uint8_t data = m_soundbuf_data[0]; - memmove(m_soundbuf_data, m_soundbuf_data + 1, (32 - 1) * sizeof(m_soundbuf_data[0])); - m_soundbuf_len--; + uint8_t data = m_soundbuf_data[m_soundbuf_rptr]; + m_soundbuf_rptr = (m_soundbuf_rptr + 1) & 0x1f; return data; } else @@ -277,11 +279,13 @@ READ16_MEMBER(cave_state::soundlatch_ack_r) /* Sound CPU: write latch for the main CPU (acknowledge) */ WRITE8_MEMBER(cave_state::soundlatch_ack_w) { - m_soundbuf_data[m_soundbuf_len] = data; - if (m_soundbuf_len < 32) - m_soundbuf_len++; + if (m_soundbuf_wptr != m_soundbuf_rptr) + { + m_soundbuf_data[m_soundbuf_wptr] = data; + m_soundbuf_wptr = (m_soundbuf_wptr + 1) & 0x1f; + } else - logerror("CPU #1 - PC %04X: Sound Buffer 2 Overflow Error\n", m_audiocpu->pc()); + logerror("CPU #2 - PC %04X: Sound Buffer 2 Overflow Error\n", m_audiocpu->pc()); } @@ -418,6 +422,57 @@ WRITE16_MEMBER(cave_state::metmqstr_eeprom_msb_w) } } +/*************************************************************************** + + + VRAM + + +***************************************************************************/ + +template +WRITE16_MEMBER(cave_state::vram_w) +{ + uint16_t *VRAM = m_vram[Chip]; + tilemap_t *TILEMAP = m_tilemap[Chip]; + + if ((VRAM[offset] & mem_mask) == (data & mem_mask)) + return; + + COMBINE_DATA(&VRAM[offset]); + offset /= 2; + if (offset < 0x1000 / 4) // 16x16 tilemap + { + offset = (offset % (512 / 16)) * 2 + (offset / (512 / 16)) * (512 / 8) * 2; + TILEMAP->mark_tile_dirty(offset + 0); + TILEMAP->mark_tile_dirty(offset + 1); + TILEMAP->mark_tile_dirty(offset + 0 + 512 / 8); + TILEMAP->mark_tile_dirty(offset + 1 + 512 / 8); + } + else if (offset >= 0x4000 / 4) // 8x8 tilemap + TILEMAP->mark_tile_dirty(offset - 0x4000 / 4); +} + +/* Some games, that only ever use the 8x8 tiles and no line scroll, + use mirror ram. For example in donpachi, writes to 400000-403fff + and 408000-407fff both go to the 8x8 tilemap ram. Use this function + in this cases. Note that the get_tile_info function looks in the + 4000-7fff range for tiles, so we have to write the data there. */ +template +WRITE16_MEMBER(cave_state::vram_8x8_w) +{ + uint16_t *VRAM = m_vram[Chip]; + tilemap_t *TILEMAP = m_tilemap[Chip]; + + offset %= 0x4000 / 2; + if ((VRAM[offset] & mem_mask) == (data & mem_mask)) + return; + + COMBINE_DATA(&VRAM[offset + 0x0000 / 2]); + COMBINE_DATA(&VRAM[offset + 0x4000 / 2]); + TILEMAP->mark_tile_dirty(offset / 2); +} + /*************************************************************************** @@ -438,17 +493,16 @@ ADDRESS_MAP_START(cave_state::dfeveron_map) AM_RANGE(0x000000, 0x0fffff) AM_ROM // ROM AM_RANGE(0x100000, 0x10ffff) AM_RAM // RAM AM_RANGE(0x300000, 0x300003) AM_DEVREADWRITE8("ymz", ymz280b_device, read, write, 0x00ff) // YMZ280 -/**/AM_RANGE(0x400000, 0x407fff) AM_RAM AM_SHARE("spriteram.0") // Sprites -/**/AM_RANGE(0x408000, 0x40ffff) AM_RAM AM_SHARE("spriteram_2.0") // Sprites? -/**/AM_RANGE(0x500000, 0x507fff) AM_RAM_WRITE(cave_vram_0_w) AM_SHARE("vram.0") // Layer 0 -/**/AM_RANGE(0x600000, 0x607fff) AM_RAM_WRITE(cave_vram_1_w) AM_SHARE("vram.1") // Layer 1 -/**/AM_RANGE(0x708000, 0x708fff) AM_RAM AM_SHARE("paletteram.0") // Palette -/**/AM_RANGE(0x710000, 0x710bff) AM_READONLY // ? + AM_RANGE(0x400000, 0x40ffff) AM_RAM AM_SHARE("spriteram.0") // Sprites + AM_RANGE(0x500000, 0x507fff) AM_RAM_WRITE(vram_w<0>) AM_SHARE("vram.0") // Layer 0 + AM_RANGE(0x600000, 0x607fff) AM_RAM_WRITE(vram_w<1>) AM_SHARE("vram.1") // Layer 1 + AM_RANGE(0x708000, 0x708fff) AM_RAM AM_SHARE("paletteram.0") // Palette + AM_RANGE(0x710000, 0x710bff) AM_READONLY // ? AM_RANGE(0x710c00, 0x710fff) AM_RAM // ? AM_RANGE(0x800000, 0x80007f) AM_WRITEONLY AM_SHARE("videoregs.0") // Video Regs AM_RANGE(0x800000, 0x800007) AM_READ(cave_irq_cause_r) // IRQ Cause -/**/AM_RANGE(0x900000, 0x900005) AM_RAM AM_SHARE("vctrl.0") // Layer 0 Control -/**/AM_RANGE(0xa00000, 0xa00005) AM_RAM AM_SHARE("vctrl.1") // Layer 1 Control + AM_RANGE(0x900000, 0x900005) AM_RAM AM_SHARE("vctrl.0") // Layer 0 Control + AM_RANGE(0xa00000, 0xa00005) AM_RAM AM_SHARE("vctrl.1") // Layer 1 Control AM_RANGE(0xb00000, 0xb00001) AM_READ_PORT("IN0") // Inputs AM_RANGE(0xb00002, 0xb00003) AM_READ_PORT("IN1") // Inputs + EEPROM AM_RANGE(0xc00000, 0xc00001) AM_WRITE(cave_eeprom_msb_w) // EEPROM @@ -463,17 +517,16 @@ ADDRESS_MAP_START(cave_state::ddonpach_map) AM_RANGE(0x000000, 0x0fffff) AM_ROM // ROM AM_RANGE(0x100000, 0x10ffff) AM_RAM // RAM AM_RANGE(0x300000, 0x300003) AM_DEVREADWRITE8("ymz", ymz280b_device, read, write, 0x00ff) // YMZ280 -/**/AM_RANGE(0x400000, 0x407fff) AM_RAM AM_SHARE("spriteram.0") // Sprites -/**/AM_RANGE(0x408000, 0x40ffff) AM_RAM AM_SHARE("spriteram_2.0") // Sprites? -/**/AM_RANGE(0x500000, 0x507fff) AM_RAM_WRITE(cave_vram_0_w) AM_SHARE("vram.0") // Layer 0 -/**/AM_RANGE(0x600000, 0x607fff) AM_RAM_WRITE(cave_vram_1_w) AM_SHARE("vram.1") // Layer 1 -/**/AM_RANGE(0x700000, 0x70ffff) AM_RAM_WRITE(cave_vram_2_8x8_w) AM_SHARE("vram.2") // Layer 2 + AM_RANGE(0x400000, 0x40ffff) AM_RAM AM_SHARE("spriteram.0") // Sprites + AM_RANGE(0x500000, 0x507fff) AM_RAM_WRITE(vram_w<0>) AM_SHARE("vram.0") // Layer 0 + AM_RANGE(0x600000, 0x607fff) AM_RAM_WRITE(vram_w<1>) AM_SHARE("vram.1") // Layer 1 + AM_RANGE(0x700000, 0x70ffff) AM_RAM_WRITE(vram_8x8_w<2>) AM_SHARE("vram.2") // Layer 2 AM_RANGE(0x800000, 0x80007f) AM_WRITEONLY AM_SHARE("videoregs.0") // Video Regs AM_RANGE(0x800000, 0x800007) AM_READ(cave_irq_cause_r) // IRQ Cause -/**/AM_RANGE(0x900000, 0x900005) AM_RAM AM_SHARE("vctrl.0") // Layer 0 Control -/**/AM_RANGE(0xa00000, 0xa00005) AM_RAM AM_SHARE("vctrl.1") // Layer 1 Control -/**/AM_RANGE(0xb00000, 0xb00005) AM_RAM AM_SHARE("vctrl.2") // Layer 2 Control -/**/AM_RANGE(0xc00000, 0xc0ffff) AM_RAM AM_SHARE("paletteram.0") // Palette + AM_RANGE(0x900000, 0x900005) AM_RAM AM_SHARE("vctrl.0") // Layer 0 Control + AM_RANGE(0xa00000, 0xa00005) AM_RAM AM_SHARE("vctrl.1") // Layer 1 Control + AM_RANGE(0xb00000, 0xb00005) AM_RAM AM_SHARE("vctrl.2") // Layer 2 Control + AM_RANGE(0xc00000, 0xc0ffff) AM_RAM AM_SHARE("paletteram.0") // Palette AM_RANGE(0xd00000, 0xd00001) AM_READ_PORT("IN0") // Inputs AM_RANGE(0xd00002, 0xd00003) AM_READ_PORT("IN1") // Inputs + EEPROM AM_RANGE(0xe00000, 0xe00001) AM_WRITE(cave_eeprom_msb_w) // EEPROM @@ -500,16 +553,15 @@ READ16_MEMBER(cave_state::donpachi_videoregs_r) ADDRESS_MAP_START(cave_state::donpachi_map) AM_RANGE(0x000000, 0x07ffff) AM_ROM // ROM AM_RANGE(0x100000, 0x10ffff) AM_RAM // RAM - AM_RANGE(0x200000, 0x207fff) AM_RAM_WRITE(cave_vram_1_w) AM_SHARE("vram.1") // Layer 1 - AM_RANGE(0x300000, 0x307fff) AM_RAM_WRITE(cave_vram_0_w) AM_SHARE("vram.0") // Layer 0 - AM_RANGE(0x400000, 0x407fff) AM_RAM_WRITE(cave_vram_2_8x8_w) AM_SHARE("vram.2") // Layer 2 - AM_RANGE(0x500000, 0x507fff) AM_RAM AM_SHARE("spriteram.0") // Sprites - AM_RANGE(0x508000, 0x50ffff) AM_RAM AM_SHARE("spriteram_2.0") // Sprites? -/**/AM_RANGE(0x600000, 0x600005) AM_RAM AM_SHARE("vctrl.1") // Layer 1 Control -/**/AM_RANGE(0x700000, 0x700005) AM_RAM AM_SHARE("vctrl.0") // Layer 0 Control -/**/AM_RANGE(0x800000, 0x800005) AM_RAM AM_SHARE("vctrl.2") // Layer 2 Control + AM_RANGE(0x200000, 0x207fff) AM_RAM_WRITE(vram_w<1>) AM_SHARE("vram.1") // Layer 1 + AM_RANGE(0x300000, 0x307fff) AM_RAM_WRITE(vram_w<0>) AM_SHARE("vram.0") // Layer 0 + AM_RANGE(0x400000, 0x407fff) AM_RAM_WRITE(vram_8x8_w<2>) AM_SHARE("vram.2") // Layer 2 + AM_RANGE(0x500000, 0x50ffff) AM_RAM AM_SHARE("spriteram.0") // Sprites + AM_RANGE(0x600000, 0x600005) AM_RAM AM_SHARE("vctrl.1") // Layer 1 Control + AM_RANGE(0x700000, 0x700005) AM_RAM AM_SHARE("vctrl.0") // Layer 0 Control + AM_RANGE(0x800000, 0x800005) AM_RAM AM_SHARE("vctrl.2") // Layer 2 Control AM_RANGE(0x900000, 0x90007f) AM_RAM_READ(donpachi_videoregs_r) AM_SHARE("videoregs.0") // Video Regs -/**/AM_RANGE(0xa08000, 0xa08fff) AM_RAM AM_SHARE("paletteram.0") // Palette + AM_RANGE(0xa08000, 0xa08fff) AM_RAM AM_SHARE("paletteram.0") // Palette AM_RANGE(0xb00000, 0xb00003) AM_DEVREADWRITE8("oki1", okim6295_device, read, write, 0x00ff) // M6295 AM_RANGE(0xb00010, 0xb00013) AM_DEVREADWRITE8("oki2", okim6295_device, read, write, 0x00ff) // AM_RANGE(0xb00020, 0xb0002f) AM_DEVWRITE8("nmk112", nmk112_device, okibank_w, 0x00ff) // @@ -527,17 +579,16 @@ ADDRESS_MAP_START(cave_state::esprade_map) AM_RANGE(0x000000, 0x0fffff) AM_ROM // ROM AM_RANGE(0x100000, 0x10ffff) AM_RAM // RAM AM_RANGE(0x300000, 0x300003) AM_DEVREADWRITE8("ymz", ymz280b_device, read, write, 0x00ff) // YMZ280 -/**/AM_RANGE(0x400000, 0x407fff) AM_RAM AM_SHARE("spriteram.0") // Sprites -/**/AM_RANGE(0x408000, 0x40ffff) AM_RAM AM_SHARE("spriteram_2.0") // Sprites? -/**/AM_RANGE(0x500000, 0x507fff) AM_RAM_WRITE(cave_vram_0_w) AM_SHARE("vram.0") // Layer 0 -/**/AM_RANGE(0x600000, 0x607fff) AM_RAM_WRITE(cave_vram_1_w) AM_SHARE("vram.1") // Layer 1 -/**/AM_RANGE(0x700000, 0x707fff) AM_RAM_WRITE(cave_vram_2_w) AM_SHARE("vram.2") // Layer 2 + AM_RANGE(0x400000, 0x40ffff) AM_RAM AM_SHARE("spriteram.0") // Sprites + AM_RANGE(0x500000, 0x507fff) AM_RAM_WRITE(vram_w<0>) AM_SHARE("vram.0") // Layer 0 + AM_RANGE(0x600000, 0x607fff) AM_RAM_WRITE(vram_w<1>) AM_SHARE("vram.1") // Layer 1 + AM_RANGE(0x700000, 0x707fff) AM_RAM_WRITE(vram_w<2>) AM_SHARE("vram.2") // Layer 2 AM_RANGE(0x800000, 0x80007f) AM_WRITEONLY AM_SHARE("videoregs.0") // Video Regs AM_RANGE(0x800000, 0x800007) AM_READ(cave_irq_cause_r) // IRQ Cause -/**/AM_RANGE(0x900000, 0x900005) AM_RAM AM_SHARE("vctrl.0") // Layer 0 Control -/**/AM_RANGE(0xa00000, 0xa00005) AM_RAM AM_SHARE("vctrl.1") // Layer 1 Control -/**/AM_RANGE(0xb00000, 0xb00005) AM_RAM AM_SHARE("vctrl.2") // Layer 2 Control -/**/AM_RANGE(0xc00000, 0xc0ffff) AM_RAM AM_SHARE("paletteram.0") // Palette + AM_RANGE(0x900000, 0x900005) AM_RAM AM_SHARE("vctrl.0") // Layer 0 Control + AM_RANGE(0xa00000, 0xa00005) AM_RAM AM_SHARE("vctrl.1") // Layer 1 Control + AM_RANGE(0xb00000, 0xb00005) AM_RAM AM_SHARE("vctrl.2") // Layer 2 Control + AM_RANGE(0xc00000, 0xc0ffff) AM_RAM AM_SHARE("paletteram.0") // Palette AM_RANGE(0xd00000, 0xd00001) AM_READ_PORT("IN0" ) // Inputs AM_RANGE(0xd00002, 0xd00003) AM_READ_PORT("IN1" ) // Inputs + EEPROM AM_RANGE(0xe00000, 0xe00001) AM_WRITE(cave_eeprom_msb_w) // EEPROM @@ -552,19 +603,18 @@ ADDRESS_MAP_START(cave_state::gaia_map) AM_RANGE(0x000000, 0x0fffff) AM_ROM // ROM AM_RANGE(0x100000, 0x10ffff) AM_RAM // RAM AM_RANGE(0x300000, 0x300003) AM_DEVREADWRITE8("ymz", ymz280b_device, read, write, 0x00ff) // YMZ280 - AM_RANGE(0x400000, 0x407fff) AM_RAM AM_SHARE("spriteram.0") // Sprite bank 1 - AM_RANGE(0x408000, 0x40ffff) AM_RAM AM_SHARE("spriteram_2.0") // Sprite bank 2 - AM_RANGE(0x500000, 0x507fff) AM_RAM_WRITE(cave_vram_0_w) AM_SHARE("vram.0") // Layer 0 + AM_RANGE(0x400000, 0x40ffff) AM_RAM AM_SHARE("spriteram.0") // Sprite + AM_RANGE(0x500000, 0x507fff) AM_RAM_WRITE(vram_w<0>) AM_SHARE("vram.0") // Layer 0 AM_RANGE(0x508000, 0x50ffff) AM_RAM // More Layer 0, Tested but not used? - AM_RANGE(0x600000, 0x607fff) AM_RAM_WRITE(cave_vram_1_w) AM_SHARE("vram.1") // Layer 1 + AM_RANGE(0x600000, 0x607fff) AM_RAM_WRITE(vram_w<1>) AM_SHARE("vram.1") // Layer 1 AM_RANGE(0x608000, 0x60ffff) AM_RAM // More Layer 1, Tested but not used? - AM_RANGE(0x700000, 0x707fff) AM_RAM_WRITE(cave_vram_2_w) AM_SHARE("vram.2") // Layer 2 + AM_RANGE(0x700000, 0x707fff) AM_RAM_WRITE(vram_w<2>) AM_SHARE("vram.2") // Layer 2 AM_RANGE(0x708000, 0x70ffff) AM_RAM // More Layer 2, Tested but not used? AM_RANGE(0x800000, 0x80007f) AM_WRITEONLY AM_SHARE("videoregs.0") // Video Regs AM_RANGE(0x800000, 0x800007) AM_READ(cave_irq_cause_r) // IRQ Cause -/**/AM_RANGE(0x900000, 0x900005) AM_RAM AM_SHARE("vctrl.0") // Layer 0 Control -/**/AM_RANGE(0xa00000, 0xa00005) AM_RAM AM_SHARE("vctrl.1") // Layer 1 Control -/**/AM_RANGE(0xb00000, 0xb00005) AM_RAM AM_SHARE("vctrl.2") // Layer 2 Control + AM_RANGE(0x900000, 0x900005) AM_RAM AM_SHARE("vctrl.0") // Layer 0 Control + AM_RANGE(0xa00000, 0xa00005) AM_RAM AM_SHARE("vctrl.1") // Layer 1 Control + AM_RANGE(0xb00000, 0xb00005) AM_RAM AM_SHARE("vctrl.2") // Layer 2 Control AM_RANGE(0xc00000, 0xc0ffff) AM_RAM AM_SHARE("paletteram.0") // Palette AM_RANGE(0xd00010, 0xd00011) AM_READ_PORT("IN0") // Inputs AM_RANGE(0xd00010, 0xd00011) AM_WRITE(gaia_coin_lsb_w) // Coin counter only @@ -583,15 +633,14 @@ ADDRESS_MAP_START(cave_state::guwange_map) AM_RANGE(0x200000, 0x20ffff) AM_RAM // RAM AM_RANGE(0x300000, 0x30007f) AM_WRITEONLY AM_SHARE("videoregs.0") // Video Regs AM_RANGE(0x300000, 0x300007) AM_READ(cave_irq_cause_r) // IRQ Cause -/**/AM_RANGE(0x400000, 0x407fff) AM_RAM AM_SHARE("spriteram.0") // Sprites -/**/AM_RANGE(0x408000, 0x40ffff) AM_RAM AM_SHARE("spriteram_2.0") // Sprites? -/**/AM_RANGE(0x500000, 0x507fff) AM_RAM_WRITE(cave_vram_0_w) AM_SHARE("vram.0") // Layer 0 -/**/AM_RANGE(0x600000, 0x607fff) AM_RAM_WRITE(cave_vram_1_w) AM_SHARE("vram.1") // Layer 1 -/**/AM_RANGE(0x700000, 0x707fff) AM_RAM_WRITE(cave_vram_2_w) AM_SHARE("vram.2") // Layer 2 + AM_RANGE(0x400000, 0x40ffff) AM_RAM AM_SHARE("spriteram.0") // Sprites + AM_RANGE(0x500000, 0x507fff) AM_RAM_WRITE(vram_w<0>) AM_SHARE("vram.0") // Layer 0 + AM_RANGE(0x600000, 0x607fff) AM_RAM_WRITE(vram_w<1>) AM_SHARE("vram.1") // Layer 1 + AM_RANGE(0x700000, 0x707fff) AM_RAM_WRITE(vram_w<2>) AM_SHARE("vram.2") // Layer 2 AM_RANGE(0x800000, 0x800003) AM_DEVREADWRITE8("ymz", ymz280b_device, read, write, 0x00ff) // YMZ280 -/**/AM_RANGE(0x900000, 0x900005) AM_RAM AM_SHARE("vctrl.0") // Layer 0 Control -/**/AM_RANGE(0xa00000, 0xa00005) AM_RAM AM_SHARE("vctrl.1") // Layer 1 Control -/**/AM_RANGE(0xb00000, 0xb00005) AM_RAM AM_SHARE("vctrl.2") // Layer 2 Control + AM_RANGE(0x900000, 0x900005) AM_RAM AM_SHARE("vctrl.0") // Layer 0 Control + AM_RANGE(0xa00000, 0xa00005) AM_RAM AM_SHARE("vctrl.1") // Layer 1 Control + AM_RANGE(0xb00000, 0xb00005) AM_RAM AM_SHARE("vctrl.2") // Layer 2 Control /**/AM_RANGE(0xc00000, 0xc0ffff) AM_RAM AM_SHARE("paletteram.0") // Palette AM_RANGE(0xd00010, 0xd00011) AM_READ_PORT("IN0") // Inputs AM_RANGE(0xd00010, 0xd00011) AM_WRITE(cave_eeprom_lsb_w) // EEPROM @@ -608,23 +657,22 @@ ADDRESS_MAP_END ADDRESS_MAP_START(cave_state::hotdogst_map) AM_RANGE(0x000000, 0x0fffff) AM_ROM // ROM AM_RANGE(0x300000, 0x30ffff) AM_RAM // RAM -/**/AM_RANGE(0x408000, 0x408fff) AM_RAM AM_SHARE("paletteram.0") // Palette -/**/AM_RANGE(0x880000, 0x887fff) AM_RAM_WRITE(cave_vram_0_w) AM_SHARE("vram.0") // Layer 0 -/**/AM_RANGE(0x900000, 0x907fff) AM_RAM_WRITE(cave_vram_1_w) AM_SHARE("vram.1") // Layer 1 -/**/AM_RANGE(0x980000, 0x987fff) AM_RAM_WRITE(cave_vram_2_w) AM_SHARE("vram.2") // Layer 2 + AM_RANGE(0x408000, 0x408fff) AM_RAM AM_SHARE("paletteram.0") // Palette + AM_RANGE(0x880000, 0x887fff) AM_RAM_WRITE(vram_w<0>) AM_SHARE("vram.0") // Layer 0 + AM_RANGE(0x900000, 0x907fff) AM_RAM_WRITE(vram_w<1>) AM_SHARE("vram.1") // Layer 1 + AM_RANGE(0x980000, 0x987fff) AM_RAM_WRITE(vram_w<2>) AM_SHARE("vram.2") // Layer 2 AM_RANGE(0xa80000, 0xa8007f) AM_WRITEONLY AM_SHARE("videoregs.0") // Video Regs AM_RANGE(0xa80000, 0xa80007) AM_READ(cave_irq_cause_r) // IRQ Cause // AM_RANGE(0xa8006e, 0xa8006f) AM_READ(soundlatch_ack_r) // From Sound CPU AM_RANGE(0xa8006e, 0xa8006f) AM_WRITE(sound_cmd_w) // To Sound CPU -/**/AM_RANGE(0xb00000, 0xb00005) AM_RAM AM_SHARE("vctrl.0") // Layer 0 Control -/**/AM_RANGE(0xb80000, 0xb80005) AM_RAM AM_SHARE("vctrl.1") // Layer 1 Control -/**/AM_RANGE(0xc00000, 0xc00005) AM_RAM AM_SHARE("vctrl.2") // Layer 2 Control + AM_RANGE(0xb00000, 0xb00005) AM_RAM AM_SHARE("vctrl.0") // Layer 0 Control + AM_RANGE(0xb80000, 0xb80005) AM_RAM AM_SHARE("vctrl.1") // Layer 1 Control + AM_RANGE(0xc00000, 0xc00005) AM_RAM AM_SHARE("vctrl.2") // Layer 2 Control AM_RANGE(0xc80000, 0xc80001) AM_READ_PORT("IN0") // Inputs AM_RANGE(0xc80002, 0xc80003) AM_READ_PORT("IN1") // Inputs + EEPROM AM_RANGE(0xd00000, 0xd00001) AM_WRITE(hotdogst_eeprom_msb_w) // EEPROM AM_RANGE(0xd00002, 0xd00003) AM_WRITENOP // ??? -/**/AM_RANGE(0xf00000, 0xf07fff) AM_RAM AM_SHARE("spriteram.0") // Sprites -/**/AM_RANGE(0xf08000, 0xf0ffff) AM_RAM AM_SHARE("spriteram_2.0") // Sprites? + AM_RANGE(0xf00000, 0xf0ffff) AM_RAM AM_SHARE("spriteram.0") // Sprites ADDRESS_MAP_END @@ -695,7 +743,7 @@ CUSTOM_INPUT_MEMBER(cave_state::korokoro_hopper_r) ADDRESS_MAP_START(cave_state::korokoro_map) AM_RANGE(0x000000, 0x07ffff) AM_ROM // ROM - AM_RANGE(0x100000, 0x107fff) AM_WRITE(cave_vram_0_w) AM_SHARE("vram.0") // Layer 0 + AM_RANGE(0x100000, 0x107fff) AM_WRITE(vram_w<0>) AM_SHARE("vram.0") // Layer 0 AM_RANGE(0x140000, 0x140005) AM_WRITEONLY AM_SHARE("vctrl.0") // Layer 0 Control AM_RANGE(0x180000, 0x187fff) AM_WRITEONLY AM_SHARE("spriteram.0") // Sprites AM_RANGE(0x1c0000, 0x1c007f) AM_WRITEONLY AM_SHARE("videoregs.0") // Video Regs @@ -713,7 +761,7 @@ ADDRESS_MAP_END ADDRESS_MAP_START(cave_state::crusherm_map) AM_RANGE(0x000000, 0x07ffff) AM_ROM // ROM - AM_RANGE(0x100000, 0x107fff) AM_WRITE(cave_vram_0_w) AM_SHARE("vram.0") // Layer 0 + AM_RANGE(0x100000, 0x107fff) AM_WRITE(vram_w<0>) AM_SHARE("vram.0") // Layer 0 AM_RANGE(0x140000, 0x140005) AM_WRITEONLY AM_SHARE("vctrl.0") // Layer 0 Control AM_RANGE(0x180000, 0x187fff) AM_WRITEONLY AM_SHARE("spriteram.0") // Sprites AM_RANGE(0x200000, 0x207fff) AM_WRITEONLY AM_SHARE("paletteram.0") // Palette @@ -735,20 +783,19 @@ ADDRESS_MAP_END ADDRESS_MAP_START(cave_state::mazinger_map) AM_RANGE(0x000000, 0x07ffff) AM_ROM // ROM AM_RANGE(0x100000, 0x10ffff) AM_RAM // RAM -/**/AM_RANGE(0x200000, 0x207fff) AM_RAM AM_SHARE("spriteram.0") // Sprites -/**/AM_RANGE(0x208000, 0x20ffff) AM_RAM AM_SHARE("spriteram_2.0") // Sprites? + AM_RANGE(0x200000, 0x20ffff) AM_RAM AM_SHARE("spriteram.0") // Sprites AM_RANGE(0x300000, 0x30007f) AM_WRITEONLY AM_SHARE("videoregs.0") // Video Regs AM_RANGE(0x300000, 0x300007) AM_READ(cave_irq_cause_r) // IRQ Cause AM_RANGE(0x300068, 0x300069) AM_DEVWRITE("watchdog", watchdog_timer_device, reset16_w) // Watchdog AM_RANGE(0x30006e, 0x30006f) AM_READWRITE(soundlatch_ack_r, sound_cmd_w) // From Sound CPU - AM_RANGE(0x400000, 0x407fff) AM_RAM_WRITE(cave_vram_1_8x8_w) AM_SHARE("vram.1") // Layer 1 -/**/AM_RANGE(0x500000, 0x507fff) AM_RAM_WRITE(cave_vram_0_8x8_w) AM_SHARE("vram.0") // Layer 0 -/**/AM_RANGE(0x600000, 0x600005) AM_RAM AM_SHARE("vctrl.1") // Layer 1 Control -/**/AM_RANGE(0x700000, 0x700005) AM_RAM AM_SHARE("vctrl.0") // Layer 0 Control + AM_RANGE(0x400000, 0x407fff) AM_RAM_WRITE(vram_8x8_w<1>) AM_SHARE("vram.1") // Layer 1 + AM_RANGE(0x500000, 0x507fff) AM_RAM_WRITE(vram_8x8_w<0>) AM_SHARE("vram.0") // Layer 0 + AM_RANGE(0x600000, 0x600005) AM_RAM AM_SHARE("vctrl.1") // Layer 1 Control + AM_RANGE(0x700000, 0x700005) AM_RAM AM_SHARE("vctrl.0") // Layer 0 Control AM_RANGE(0x800000, 0x800001) AM_READ_PORT("IN0") // Inputs AM_RANGE(0x800002, 0x800003) AM_READ_PORT("IN1") // Inputs + EEPROM AM_RANGE(0x900000, 0x900001) AM_WRITE(cave_eeprom_msb_w) // EEPROM -/**/AM_RANGE(0xc08000, 0xc0ffff) AM_RAM AM_SHARE("paletteram.0") // Palette + AM_RANGE(0xc08000, 0xc0ffff) AM_RAM AM_SHARE("paletteram.0") // Palette AM_RANGE(0xd00000, 0xd7ffff) AM_ROM AM_REGION("user1", 0) // extra data ROM ADDRESS_MAP_END @@ -763,25 +810,24 @@ ADDRESS_MAP_START(cave_state::metmqstr_map) AM_RANGE(0x200000, 0x27ffff) AM_ROM // ROM AM_RANGE(0x408000, 0x408fff) AM_RAM AM_SHARE("paletteram.0") // Palette AM_RANGE(0x600000, 0x600001) AM_DEVREAD("watchdog", watchdog_timer_device, reset16_r) // Watchdog? - AM_RANGE(0x880000, 0x887fff) AM_RAM_WRITE(cave_vram_2_w) AM_SHARE("vram.2") // Layer 2 + AM_RANGE(0x880000, 0x887fff) AM_RAM_WRITE(vram_w<2>) AM_SHARE("vram.2") // Layer 2 AM_RANGE(0x888000, 0x88ffff) AM_RAM // - AM_RANGE(0x900000, 0x907fff) AM_RAM_WRITE(cave_vram_1_w) AM_SHARE("vram.1") // Layer 1 + AM_RANGE(0x900000, 0x907fff) AM_RAM_WRITE(vram_w<1>) AM_SHARE("vram.1") // Layer 1 AM_RANGE(0x908000, 0x90ffff) AM_RAM // - AM_RANGE(0x980000, 0x987fff) AM_RAM_WRITE(cave_vram_0_w) AM_SHARE("vram.0") // Layer 0 + AM_RANGE(0x980000, 0x987fff) AM_RAM_WRITE(vram_w<0>) AM_SHARE("vram.0") // Layer 0 AM_RANGE(0x988000, 0x98ffff) AM_RAM // AM_RANGE(0xa80000, 0xa8007f) AM_WRITEONLY AM_SHARE("videoregs.0") // Video Regs AM_RANGE(0xa80000, 0xa80007) AM_READ(cave_irq_cause_r) // IRQ Cause AM_RANGE(0xa80068, 0xa80069) AM_DEVWRITE("watchdog", watchdog_timer_device, reset16_w) // Watchdog? AM_RANGE(0xa8006c, 0xa8006d) AM_READ(soundflags_ack_r) AM_WRITENOP // Communication AM_RANGE(0xa8006e, 0xa8006f) AM_READWRITE(soundlatch_ack_r, sound_cmd_w) // From Sound CPU -/**/AM_RANGE(0xb00000, 0xb00005) AM_RAM AM_SHARE("vctrl.2") // Layer 2 Control -/**/AM_RANGE(0xb80000, 0xb80005) AM_RAM AM_SHARE("vctrl.1") // Layer 1 Control -/**/AM_RANGE(0xc00000, 0xc00005) AM_RAM AM_SHARE("vctrl.0") // Layer 0 Control + AM_RANGE(0xb00000, 0xb00005) AM_RAM AM_SHARE("vctrl.2") // Layer 2 Control + AM_RANGE(0xb80000, 0xb80005) AM_RAM AM_SHARE("vctrl.1") // Layer 1 Control + AM_RANGE(0xc00000, 0xc00005) AM_RAM AM_SHARE("vctrl.0") // Layer 0 Control AM_RANGE(0xc80000, 0xc80001) AM_READ_PORT("IN0") // Inputs AM_RANGE(0xc80002, 0xc80003) AM_READ_PORT("IN1") // Inputs + EEPROM AM_RANGE(0xd00000, 0xd00001) AM_WRITE(metmqstr_eeprom_msb_w) // EEPROM - AM_RANGE(0xf00000, 0xf07fff) AM_RAM AM_SHARE("spriteram.0") // Sprites - AM_RANGE(0xf08000, 0xf0ffff) AM_RAM AM_SHARE("spriteram_2.0") // RAM + AM_RANGE(0xf00000, 0xf0ffff) AM_RAM AM_SHARE("spriteram.0") // Sprites ADDRESS_MAP_END @@ -860,7 +906,7 @@ WRITE16_MEMBER(cave_state::ppsatan_out_w) output().set_led_value(6, data & 0x0400); // not tested in service mode output().set_led_value(7, data & 0x0800); // not tested in service mode - m_oki->set_rom_bank((data & 0x8000) >> 15); + m_oki[0]->set_rom_bank((data & 0x8000) >> 15); } // popmessage("OUT %04x", data); @@ -872,7 +918,7 @@ ADDRESS_MAP_START(cave_state::ppsatan_map) // Left Screen (Player 2) AM_RANGE(0x080000, 0x080005) AM_RAM AM_SHARE("vctrl.1") // Layer Control - AM_RANGE(0x100000, 0x107fff) AM_RAM_WRITE(cave_vram_1_w) AM_SHARE("vram.1") // Layer + AM_RANGE(0x100000, 0x107fff) AM_RAM_WRITE(vram_w<1>) AM_SHARE("vram.1") // Layer // AM_RANGE(0x180000, 0x1803ff) AM_RAM // Palette (Tilemaps) // AM_RANGE(0x187800, 0x188fff) AM_RAM AM_SHARE("paletteram.1") // Palette (Sprites) AM_RANGE(0x180000, 0x188fff) AM_RAM AM_SHARE("paletteram.1") // Palette @@ -886,11 +932,11 @@ ADDRESS_MAP_START(cave_state::ppsatan_map) AM_RANGE(0x2c0000, 0x2c0007) AM_READ(cave_irq_cause_r) // IRQ Cause AM_RANGE(0x2c0068, 0x2c0069) AM_DEVWRITE("watchdog", watchdog_timer_device, reset16_w) // Watchdog - AM_RANGE(0x300000, 0x300001) AM_DEVREADWRITE8("oki", okim6295_device, read, write, 0x00ff) // M6295 + AM_RANGE(0x300000, 0x300001) AM_DEVREADWRITE8("oki1", okim6295_device, read, write, 0x00ff) // M6295 // Right Screen (Player 1) AM_RANGE(0x480000, 0x480005) AM_RAM AM_SHARE("vctrl.2") // Layer Control - AM_RANGE(0x500000, 0x507fff) AM_RAM_WRITE(cave_vram_2_w) AM_SHARE("vram.2") // Layer + AM_RANGE(0x500000, 0x507fff) AM_RAM_WRITE(vram_w<2>) AM_SHARE("vram.2") // Layer // AM_RANGE(0x580000, 0x5803ff) AM_RAM // Palette (Tilemaps) // AM_RANGE(0x587800, 0x588fff) AM_RAM //AM_SHARE("paletteram.2") // Palette (Sprites) AM_RANGE(0x580000, 0x588fff) AM_RAM AM_SHARE("paletteram.2") // Palette @@ -899,7 +945,7 @@ ADDRESS_MAP_START(cave_state::ppsatan_map) // Top Screen AM_RANGE(0x880000, 0x880005) AM_RAM AM_SHARE("vctrl.0") // Layer Control - AM_RANGE(0x900000, 0x907fff) AM_RAM_WRITE(cave_vram_0_w) AM_SHARE("vram.0") // Layer + AM_RANGE(0x900000, 0x907fff) AM_RAM_WRITE(vram_w<0>) AM_SHARE("vram.0") // Layer // AM_RANGE(0x980000, 0x9803ff) AM_RAM // Palette (Tilemaps) // AM_RANGE(0x987800, 0x988fff) AM_RAM AM_SHARE("paletteram.0") // Palette (Sprites) AM_RANGE(0x980000, 0x988fff) AM_RAM AM_SHARE("paletteram.0") // Palette @@ -917,9 +963,10 @@ READ16_MEMBER(cave_state::pwrinst2_eeprom_r) return ~8 + ((m_eeprom->do_read() & 1) ? 8 : 0); } -inline void cave_state::vctrl_w(address_space &space, offs_t offset, uint16_t data, uint16_t mem_mask, int GFX) +template +WRITE16_MEMBER(cave_state::pwrinst2_vctrl_w) { - uint16_t *VCTRL = m_vctrl[GFX]; + uint16_t *VCTRL = m_vctrl[Chip]; if (offset == 4 / 2) { switch (data & 0x000f) @@ -933,10 +980,6 @@ inline void cave_state::vctrl_w(address_space &space, offs_t offset, uint16_t da } COMBINE_DATA(&VCTRL[offset]); } -WRITE16_MEMBER(cave_state::pwrinst2_vctrl_0_w){ vctrl_w(space, offset, data, mem_mask, 0); } -WRITE16_MEMBER(cave_state::pwrinst2_vctrl_1_w){ vctrl_w(space, offset, data, mem_mask, 1); } -WRITE16_MEMBER(cave_state::pwrinst2_vctrl_2_w){ vctrl_w(space, offset, data, mem_mask, 2); } -WRITE16_MEMBER(cave_state::pwrinst2_vctrl_3_w){ vctrl_w(space, offset, data, mem_mask, 3); } ADDRESS_MAP_START(cave_state::pwrinst2_map) AM_RANGE(0x000000, 0x1fffff) AM_ROM // ROM @@ -945,18 +988,17 @@ ADDRESS_MAP_START(cave_state::pwrinst2_map) AM_RANGE(0x500002, 0x500003) AM_READ_PORT("IN1") // AM_RANGE(0x600000, 0x6fffff) AM_ROM AM_REGION("user1", 0) // extra data ROM space AM_RANGE(0x700000, 0x700001) AM_WRITE(cave_eeprom_msb_w) // EEPROM - AM_RANGE(0x800000, 0x807fff) AM_RAM_WRITE(cave_vram_2_w) AM_SHARE("vram.2") // Layer 2 - AM_RANGE(0x880000, 0x887fff) AM_RAM_WRITE(cave_vram_0_w) AM_SHARE("vram.0") // Layer 0 - AM_RANGE(0x900000, 0x907fff) AM_RAM_WRITE(cave_vram_1_w) AM_SHARE("vram.1") // Layer 1 - AM_RANGE(0x980000, 0x987fff) AM_RAM_WRITE(cave_vram_3_8x8_w) AM_SHARE("vram.3") // Layer 3 - AM_RANGE(0xa00000, 0xa07fff) AM_RAM AM_SHARE("spriteram.0") // Sprites - AM_RANGE(0xa08000, 0xa0ffff) AM_RAM AM_SHARE("spriteram_2.0") // Sprites? + AM_RANGE(0x800000, 0x807fff) AM_RAM_WRITE(vram_w<2>) AM_SHARE("vram.2") // Layer 2 + AM_RANGE(0x880000, 0x887fff) AM_RAM_WRITE(vram_w<0>) AM_SHARE("vram.0") // Layer 0 + AM_RANGE(0x900000, 0x907fff) AM_RAM_WRITE(vram_w<1>) AM_SHARE("vram.1") // Layer 1 + AM_RANGE(0x980000, 0x987fff) AM_RAM_WRITE(vram_8x8_w<3>) AM_SHARE("vram.3") // Layer 3 + AM_RANGE(0xa00000, 0xa0ffff) AM_RAM AM_SHARE("spriteram.0") // Sprites AM_RANGE(0xa10000, 0xa1ffff) AM_RAM // Sprites? AM_RANGE(0xa80000, 0xa8007f) AM_RAM_READ(donpachi_videoregs_r) AM_SHARE("videoregs.0") // Video Regs -/**/AM_RANGE(0xb00000, 0xb00005) AM_RAM_WRITE(pwrinst2_vctrl_2_w) AM_SHARE("vctrl.2") // Layer 2 Control -/**/AM_RANGE(0xb80000, 0xb80005) AM_RAM_WRITE(pwrinst2_vctrl_0_w) AM_SHARE("vctrl.0") // Layer 0 Control -/**/AM_RANGE(0xc00000, 0xc00005) AM_RAM_WRITE(pwrinst2_vctrl_1_w) AM_SHARE("vctrl.1") // Layer 1 Control -/**/AM_RANGE(0xc80000, 0xc80005) AM_RAM_WRITE(pwrinst2_vctrl_3_w) AM_SHARE("vctrl.3") // Layer 3 Control + AM_RANGE(0xb00000, 0xb00005) AM_RAM_WRITE(pwrinst2_vctrl_w<2>) AM_SHARE("vctrl.2") // Layer 2 Control + AM_RANGE(0xb80000, 0xb80005) AM_RAM_WRITE(pwrinst2_vctrl_w<0>) AM_SHARE("vctrl.0") // Layer 0 Control + AM_RANGE(0xc00000, 0xc00005) AM_RAM_WRITE(pwrinst2_vctrl_w<1>) AM_SHARE("vctrl.1") // Layer 1 Control + AM_RANGE(0xc80000, 0xc80005) AM_RAM_WRITE(pwrinst2_vctrl_w<3>) AM_SHARE("vctrl.3") // Layer 3 Control AM_RANGE(0xd80000, 0xd80001) AM_READ(soundlatch_ack_r) // ? From Sound CPU AM_RANGE(0xe00000, 0xe00001) AM_WRITE(sound_cmd_w) // To Sound CPU AM_RANGE(0xe80000, 0xe80001) AM_READ(pwrinst2_eeprom_r) // EEPROM @@ -983,19 +1025,18 @@ ADDRESS_MAP_START(cave_state::sailormn_map) AM_RANGE(0x408000, 0x40bfff) AM_RAM AM_SHARE("paletteram.0") // Palette AM_RANGE(0x40c000, 0x40ffff) AM_RAM // (agallet) AM_RANGE(0x410000, 0x410001) AM_RAM // (agallet) - AM_RANGE(0x500000, 0x507fff) AM_RAM AM_SHARE("spriteram.0") // Sprites - AM_RANGE(0x508000, 0x50ffff) AM_RAM AM_SHARE("spriteram_2.0") // Sprites? + AM_RANGE(0x500000, 0x50ffff) AM_RAM AM_SHARE("spriteram.0") // Sprites AM_RANGE(0x510000, 0x510001) AM_RAM // (agallet) AM_RANGE(0x600000, 0x600001) AM_READ(sailormn_input0_r) // Inputs + Watchdog! AM_RANGE(0x600002, 0x600003) AM_READ_PORT("IN1") // Inputs + EEPROM AM_RANGE(0x700000, 0x700001) AM_WRITE(sailormn_eeprom_msb_w) // EEPROM - AM_RANGE(0x800000, 0x807fff) AM_RAM_WRITE(cave_vram_0_w) AM_SHARE("vram.0") // Layer 0 - AM_RANGE(0x880000, 0x887fff) AM_RAM_WRITE(cave_vram_1_w) AM_SHARE("vram.1") // Layer 1 - AM_RANGE(0x900000, 0x907fff) AM_RAM_WRITE(cave_vram_2_w) AM_SHARE("vram.2") // Layer 2 + AM_RANGE(0x800000, 0x807fff) AM_RAM_WRITE(vram_w<0>) AM_SHARE("vram.0") // Layer 0 + AM_RANGE(0x880000, 0x887fff) AM_RAM_WRITE(vram_w<1>) AM_SHARE("vram.1") // Layer 1 + AM_RANGE(0x900000, 0x907fff) AM_RAM_WRITE(vram_w<2>) AM_SHARE("vram.2") // Layer 2 AM_RANGE(0x908000, 0x908001) AM_RAM // (agallet) -/**/AM_RANGE(0xa00000, 0xa00005) AM_RAM AM_SHARE("vctrl.0") // Layer 0 Control -/**/AM_RANGE(0xa80000, 0xa80005) AM_RAM AM_SHARE("vctrl.1") // Layer 1 Control -/**/AM_RANGE(0xb00000, 0xb00005) AM_RAM AM_SHARE("vctrl.2") // Layer 2 Control + AM_RANGE(0xa00000, 0xa00005) AM_RAM AM_SHARE("vctrl.0") // Layer 0 Control + AM_RANGE(0xa80000, 0xa80005) AM_RAM AM_SHARE("vctrl.1") // Layer 1 Control + AM_RANGE(0xb00000, 0xb00005) AM_RAM AM_SHARE("vctrl.2") // Layer 2 Control AM_RANGE(0xb80000, 0xb8007f) AM_WRITEONLY AM_SHARE("videoregs.0") // Video Regs AM_RANGE(0xb80000, 0xb80007) AM_READ(cave_irq_cause_r) // IRQ Cause (bit 2 tested!) AM_RANGE(0xb8006c, 0xb8006d) AM_READ(soundflags_ack_r) // Communication @@ -1011,9 +1052,8 @@ ADDRESS_MAP_END ADDRESS_MAP_START(cave_state::tekkencw_map) AM_RANGE(0x000000, 0x07ffff) AM_ROM // ROM AM_RANGE(0x100000, 0x10ffff) AM_RAM AM_SHARE("nvram") // RAM (battery) - AM_RANGE(0x200000, 0x207fff) AM_RAM AM_SHARE("spriteram.0") // Sprites - AM_RANGE(0x208000, 0x20ffff) AM_RAM AM_SHARE("spriteram_2.0") // Sprite bank 2 - AM_RANGE(0x300000, 0x307fff) AM_RAM_WRITE(cave_vram_0_w) AM_SHARE("vram.0") // Layer 0 + AM_RANGE(0x200000, 0x20ffff) AM_RAM AM_SHARE("spriteram.0") // Sprites + AM_RANGE(0x300000, 0x307fff) AM_RAM_WRITE(vram_w<0>) AM_SHARE("vram.0") // Layer 0 AM_RANGE(0x400000, 0x400001) AM_READ_PORT("IN0") // Inputs + EEPROM + Hopper AM_RANGE(0x400002, 0x400003) AM_READ_PORT("IN1") // Inputs AM_RANGE(0x500000, 0x500005) AM_WRITEONLY AM_SHARE("vctrl.0") // Layer 0 Control @@ -1034,9 +1074,8 @@ ADDRESS_MAP_END ADDRESS_MAP_START(cave_state::tekkenbs_map) AM_RANGE(0x000000, 0x07ffff) AM_ROM // ROM AM_RANGE(0x100000, 0x10ffff) AM_RAM AM_SHARE("nvram") // RAM (battery) - AM_RANGE(0x200000, 0x207fff) AM_RAM AM_SHARE("spriteram.0") // Sprites - AM_RANGE(0x208000, 0x20ffff) AM_RAM AM_SHARE("spriteram_2.0") // Sprite bank 2 - AM_RANGE(0x300000, 0x307fff) AM_RAM_WRITE(cave_vram_0_w) AM_SHARE("vram.0") // Layer 0 + AM_RANGE(0x200000, 0x20ffff) AM_RAM AM_SHARE("spriteram.0") // Sprites + AM_RANGE(0x300000, 0x307fff) AM_RAM_WRITE(vram_w<0>) AM_SHARE("vram.0") // Layer 0 AM_RANGE(0x400000, 0x40ffff) AM_RAM AM_SHARE("paletteram.0") // Palette AM_RANGE(0x500000, 0x500005) AM_WRITEONLY AM_SHARE("vctrl.0") // Layer 0 Control AM_RANGE(0x600000, 0x600001) AM_READ_PORT("IN0") // Inputs + EEPROM + Hopper @@ -1097,10 +1136,9 @@ CUSTOM_INPUT_MEMBER(cave_state::tjumpman_hopper_r) ADDRESS_MAP_START(cave_state::tjumpman_map) AM_RANGE(0x000000, 0x07ffff) AM_ROM // ROM AM_RANGE(0x100000, 0x10ffff) AM_RAM AM_SHARE("nvram") // RAM (battery) - AM_RANGE(0x200000, 0x207fff) AM_RAM AM_SHARE("spriteram.0") // Sprites - AM_RANGE(0x208000, 0x20ffff) AM_RAM AM_SHARE("spriteram_2.0") // Sprite bank 2 - AM_RANGE(0x300000, 0x307fff) AM_RAM_WRITE(cave_vram_0_w) AM_SHARE("vram.0") // Layer 0 - AM_RANGE(0x304000, 0x307fff) AM_WRITE(cave_vram_0_w) // Layer 0 - 16x16 tiles mapped here + AM_RANGE(0x200000, 0x20ffff) AM_RAM AM_SHARE("spriteram.0") // Sprites + AM_RANGE(0x300000, 0x307fff) AM_RAM_WRITE(vram_w<0>) AM_SHARE("vram.0") // Layer 0 + AM_RANGE(0x304000, 0x307fff) AM_WRITE(vram_w<0>) // Layer 0 - 16x16 tiles mapped here AM_RANGE(0x400000, 0x400005) AM_WRITEONLY AM_SHARE("vctrl.0") // Layer 0 Control AM_RANGE(0x500000, 0x50ffff) AM_RAM AM_SHARE("paletteram.0") // Palette AM_RANGE(0x600000, 0x600001) AM_READ_PORT("IN0") // Inputs + EEPROM + Hopper @@ -1137,9 +1175,8 @@ WRITE16_MEMBER(cave_state::pacslot_leds_w) ADDRESS_MAP_START(cave_state::pacslot_map) AM_RANGE(0x000000, 0x07ffff) AM_ROM // ROM AM_RANGE(0x100000, 0x10ffff) AM_RAM AM_SHARE("nvram") // RAM (battery) - AM_RANGE(0x200000, 0x207fff) AM_RAM AM_SHARE("spriteram.0") // Sprites - AM_RANGE(0x208000, 0x20ffff) AM_RAM AM_SHARE("spriteram_2.0") // Sprite bank 2 - AM_RANGE(0x300000, 0x307fff) AM_RAM_WRITE(cave_vram_0_w) AM_SHARE("vram.0") // Layer 0 + AM_RANGE(0x200000, 0x20ffff) AM_RAM AM_SHARE("spriteram.0") // Sprites + AM_RANGE(0x300000, 0x307fff) AM_RAM_WRITE(vram_w<0>) AM_SHARE("vram.0") // Layer 0 AM_RANGE(0x400000, 0x40007f) AM_WRITEONLY AM_SHARE("videoregs.0") // Video Regs AM_RANGE(0x400000, 0x400007) AM_READ(cave_irq_cause_r) // IRQ Cause AM_RANGE(0x400068, 0x400069) AM_DEVWRITE("watchdog", watchdog_timer_device, reset16_w) // Watchdog @@ -1162,9 +1199,8 @@ ADDRESS_MAP_END ADDRESS_MAP_START(cave_state::paceight_map) AM_RANGE(0x000000, 0x07ffff) AM_ROM // ROM AM_RANGE(0x100000, 0x10ffff) AM_RAM AM_SHARE("nvram") // RAM (battery) - AM_RANGE(0x200000, 0x207fff) AM_RAM AM_SHARE("spriteram.0") // Sprites - AM_RANGE(0x208000, 0x20ffff) AM_RAM AM_SHARE("spriteram_2.0") // Sprite bank 2 - AM_RANGE(0x300000, 0x307fff) AM_RAM_WRITE(cave_vram_0_w) AM_SHARE("vram.0") // Layer 0 + AM_RANGE(0x200000, 0x20ffff) AM_RAM AM_SHARE("spriteram.0") // Sprites + AM_RANGE(0x300000, 0x307fff) AM_RAM_WRITE(vram_w<0>) AM_SHARE("vram.0") // Layer 0 AM_RANGE(0x400000, 0x40ffff) AM_RAM AM_SHARE("paletteram.0") // Palette AM_RANGE(0x500000, 0x500001) AM_READ_PORT("IN0") // Inputs + EEPROM + Hopper AM_RANGE(0x500002, 0x500003) AM_READ_PORT("IN1") // Inputs @@ -1185,13 +1221,12 @@ ADDRESS_MAP_START(cave_state::uopoko_map) AM_RANGE(0x000000, 0x0fffff) AM_ROM // ROM AM_RANGE(0x100000, 0x10ffff) AM_RAM // RAM AM_RANGE(0x300000, 0x300003) AM_DEVREADWRITE8("ymz", ymz280b_device, read, write, 0x00ff) // YMZ280 -/**/AM_RANGE(0x400000, 0x407fff) AM_RAM AM_SHARE("spriteram.0") // Sprites -/**/AM_RANGE(0x408000, 0x40ffff) AM_RAM AM_SHARE("spriteram_2.0") // Sprites? -/**/AM_RANGE(0x500000, 0x507fff) AM_RAM_WRITE(cave_vram_0_w) AM_SHARE("vram.0") // Layer 0 + AM_RANGE(0x400000, 0x40ffff) AM_RAM AM_SHARE("spriteram.0") // Sprites + AM_RANGE(0x500000, 0x507fff) AM_RAM_WRITE(vram_w<0>) AM_SHARE("vram.0") // Layer 0 AM_RANGE(0x600000, 0x60007f) AM_WRITEONLY AM_SHARE("videoregs.0") // Video Regs AM_RANGE(0x600000, 0x600007) AM_READ(cave_irq_cause_r) // IRQ Cause -/**/AM_RANGE(0x700000, 0x700005) AM_RAM AM_SHARE("vctrl.0") // Layer 0 Control -/**/AM_RANGE(0x800000, 0x80ffff) AM_RAM AM_SHARE("paletteram.0") // Palette + AM_RANGE(0x700000, 0x700005) AM_RAM AM_SHARE("vctrl.0") // Layer 0 Control + AM_RANGE(0x800000, 0x80ffff) AM_RAM AM_SHARE("paletteram.0") // Palette AM_RANGE(0x900000, 0x900001) AM_READ_PORT("IN0") // Inputs AM_RANGE(0x900002, 0x900003) AM_READ_PORT("IN1") // Inputs + EEPROM AM_RANGE(0xa00000, 0xa00001) AM_WRITE(cave_eeprom_msb_w) // EEPROM @@ -1207,15 +1242,42 @@ ADDRESS_MAP_END ***************************************************************************/ +template +WRITE8_MEMBER(cave_state::z80_rombank_w) +{ + if (data & ~Mask) + logerror("CPU #1 - PC %04X: Bank %02X\n", m_audiocpu->pc(), data); + + m_z80bank->set_entry(data & Mask); +} + +template +WRITE8_MEMBER(cave_state::oki1_bank_w) +{ + int bank1 = (data >> 0) & Mask; + int bank2 = (data >> 4) & Mask; + m_okibank_lo[0]->set_entry(bank1); + m_okibank_hi[0]->set_entry(bank2); +} + +template +WRITE8_MEMBER(cave_state::oki2_bank_w) +{ + int bank1 = (data >> 0) & Mask; + int bank2 = (data >> 4) & Mask; + m_okibank_lo[1]->set_entry(bank1); + m_okibank_hi[1]->set_entry(bank2); +} + ADDRESS_MAP_START(cave_state::oki_map) - AM_RANGE(0x00000, 0x1ffff) AM_ROMBANK("okibank1") - AM_RANGE(0x20000, 0x3ffff) AM_ROMBANK("okibank2") + AM_RANGE(0x00000, 0x1ffff) AM_ROMBANK("oki1_banklo") + AM_RANGE(0x20000, 0x3ffff) AM_ROMBANK("oki1_bankhi") ADDRESS_MAP_END ADDRESS_MAP_START(cave_state::oki2_map) - AM_RANGE(0x00000, 0x1ffff) AM_ROMBANK("oki2bank1") - AM_RANGE(0x20000, 0x3ffff) AM_ROMBANK("oki2bank2") + AM_RANGE(0x00000, 0x1ffff) AM_ROMBANK("oki2_banklo") + AM_RANGE(0x20000, 0x3ffff) AM_ROMBANK("oki2_bankhi") ADDRESS_MAP_END @@ -1223,22 +1285,6 @@ ADDRESS_MAP_END Hotdog Storm ***************************************************************************/ -WRITE8_MEMBER(cave_state::hotdogst_rombank_w) -{ - if (data & ~0x0f) - logerror("CPU #1 - PC %04X: Bank %02X\n", m_audiocpu->pc(), data); - - membank("z80bank")->set_entry(data & 0x0f); -} - -WRITE8_MEMBER(cave_state::hotdogst_okibank_w) -{ - int bank1 = (data >> 0) & 0x3; - int bank2 = (data >> 4) & 0x3; - membank("okibank1")->set_entry(bank1); - membank("okibank2")->set_entry(bank2); -} - ADDRESS_MAP_START(cave_state::hotdogst_sound_map) AM_RANGE(0x0000, 0x3fff) AM_ROM // ROM AM_RANGE(0x4000, 0x7fff) AM_ROMBANK("z80bank") // ROM (Banked) @@ -1247,12 +1293,12 @@ ADDRESS_MAP_END ADDRESS_MAP_START(cave_state::hotdogst_sound_portmap) ADDRESS_MAP_GLOBAL_MASK(0xff) - AM_RANGE(0x00, 0x00) AM_WRITE(hotdogst_rombank_w) // ROM bank + AM_RANGE(0x00, 0x00) AM_WRITE(z80_rombank_w<0x0f>) // ROM bank AM_RANGE(0x30, 0x30) AM_READ(soundlatch_lo_r) // From Main CPU AM_RANGE(0x40, 0x40) AM_READ(soundlatch_hi_r) // AM_RANGE(0x50, 0x51) AM_DEVREADWRITE("ymsnd", ym2203_device, read, write) // - AM_RANGE(0x60, 0x60) AM_DEVREADWRITE("oki", okim6295_device, read, write) // M6295 - AM_RANGE(0x70, 0x70) AM_WRITE(hotdogst_okibank_w) // Samples bank + AM_RANGE(0x60, 0x60) AM_DEVREADWRITE("oki1", okim6295_device, read, write) // M6295 + AM_RANGE(0x70, 0x70) AM_WRITE(oki1_bank_w<0x3>) // Samples bank ADDRESS_MAP_END @@ -1260,14 +1306,6 @@ ADDRESS_MAP_END Mazinger Z ***************************************************************************/ -WRITE8_MEMBER(cave_state::mazinger_rombank_w) -{ - if (data & ~0x07) - logerror("CPU #1 - PC %04X: Bank %02X\n", m_audiocpu->pc(), data); - - membank("z80bank")->set_entry(data & 0x07); -} - ADDRESS_MAP_START(cave_state::mazinger_sound_map) AM_RANGE(0x0000, 0x3fff) AM_ROM // ROM AM_RANGE(0x4000, 0x7fff) AM_ROMBANK("z80bank") // ROM (Banked) @@ -1277,13 +1315,13 @@ ADDRESS_MAP_END ADDRESS_MAP_START(cave_state::mazinger_sound_portmap) ADDRESS_MAP_GLOBAL_MASK(0xff) - AM_RANGE(0x00, 0x00) AM_WRITE(mazinger_rombank_w) // ROM bank + AM_RANGE(0x00, 0x00) AM_WRITE(z80_rombank_w<0x07>) // ROM bank AM_RANGE(0x10, 0x10) AM_WRITE(soundlatch_ack_w) // To Main CPU AM_RANGE(0x30, 0x30) AM_READ(soundlatch_lo_r) // From Main CPU AM_RANGE(0x50, 0x51) AM_DEVWRITE("ymsnd", ym2203_device, write) // YM2203 AM_RANGE(0x52, 0x53) AM_DEVREAD("ymsnd", ym2203_device, read) // YM2203 - AM_RANGE(0x70, 0x70) AM_DEVWRITE("oki", okim6295_device, write) // M6295 - AM_RANGE(0x74, 0x74) AM_WRITE(hotdogst_okibank_w) // Samples bank + AM_RANGE(0x70, 0x70) AM_DEVWRITE("oki1", okim6295_device, write) // M6295 + AM_RANGE(0x74, 0x74) AM_WRITE(oki1_bank_w<0x3>) // Samples bank ADDRESS_MAP_END @@ -1291,30 +1329,6 @@ ADDRESS_MAP_END Metamoqester ***************************************************************************/ -WRITE8_MEMBER(cave_state::metmqstr_rombank_w) -{ - if (data & ~0x0f) - logerror("CPU #1 - PC %04X: Bank %02X\n", m_audiocpu->pc(), data); - - membank("z80bank")->set_entry(data & 0x0f); -} - -WRITE8_MEMBER(cave_state::metmqstr_okibank_w) -{ - int bank1 = (data >> 0) & 0x7; - int bank2 = (data >> 4) & 0x7; - membank("okibank1")->set_entry(bank1); - membank("okibank2")->set_entry(bank2); -} - -WRITE8_MEMBER(cave_state::metmqstr_oki2bank_w) -{ - int bank1 = (data >> 0) & 0x7; - int bank2 = (data >> 4) & 0x7; - membank("oki2bank1")->set_entry(bank1); - membank("oki2bank2")->set_entry(bank2); -} - ADDRESS_MAP_START(cave_state::metmqstr_sound_map) AM_RANGE(0x0000, 0x3fff) AM_ROM // ROM AM_RANGE(0x4000, 0x7fff) AM_ROMBANK("z80bank") // ROM (Banked) @@ -1323,15 +1337,15 @@ ADDRESS_MAP_END ADDRESS_MAP_START(cave_state::metmqstr_sound_portmap) ADDRESS_MAP_GLOBAL_MASK(0xff) - AM_RANGE(0x00, 0x00) AM_WRITE(metmqstr_rombank_w) // Rom Bank + AM_RANGE(0x00, 0x00) AM_WRITE(z80_rombank_w<0x0f>) // Rom Bank AM_RANGE(0x20, 0x20) AM_READ(soundflags_r) // Communication AM_RANGE(0x30, 0x30) AM_READ(soundlatch_lo_r) // From Main CPU AM_RANGE(0x40, 0x40) AM_READ(soundlatch_hi_r) // AM_RANGE(0x50, 0x51) AM_DEVREADWRITE("ymsnd", ym2151_device, read, write) // YM2151 AM_RANGE(0x60, 0x60) AM_DEVWRITE("oki1", okim6295_device, write) // M6295 #0 - AM_RANGE(0x70, 0x70) AM_WRITE(metmqstr_okibank_w) // Samples Bank #0 + AM_RANGE(0x70, 0x70) AM_WRITE(oki1_bank_w<0x7>) // Samples Bank #0 AM_RANGE(0x80, 0x80) AM_DEVWRITE("oki2", okim6295_device, write) // M6295 #1 - AM_RANGE(0x90, 0x90) AM_WRITE(metmqstr_oki2bank_w) // Samples Bank #1 + AM_RANGE(0x90, 0x90) AM_WRITE(oki2_bank_w<0x7>) // Samples Bank #1 ADDRESS_MAP_END @@ -1339,14 +1353,6 @@ ADDRESS_MAP_END Power Instinct 2 ***************************************************************************/ -WRITE8_MEMBER(cave_state::pwrinst2_rombank_w) -{ - if (data & ~0x07) - logerror("CPU #1 - PC %04X: Bank %02X\n", m_audiocpu->pc(), data); - - membank("z80bank")->set_entry(data & 0x07); -} - ADDRESS_MAP_START(cave_state::pwrinst2_sound_map) AM_RANGE(0x0000, 0x7fff) AM_ROM // ROM AM_RANGE(0x8000, 0xbfff) AM_ROMBANK("z80bank") // ROM (Banked) @@ -1361,7 +1367,7 @@ ADDRESS_MAP_START(cave_state::pwrinst2_sound_portmap) AM_RANGE(0x40, 0x41) AM_DEVREADWRITE("ymsnd", ym2203_device, read, write) // AM_RANGE(0x50, 0x50) AM_WRITE(soundlatch_ack_w) // To Main CPU // AM_RANGE(0x51, 0x51) AM_WRITENOP // ?? volume - AM_RANGE(0x80, 0x80) AM_WRITE(pwrinst2_rombank_w) // ROM bank + AM_RANGE(0x80, 0x80) AM_WRITE(z80_rombank_w<0x07>) // ROM bank AM_RANGE(0x60, 0x60) AM_READ(soundlatch_hi_r) // From Main CPU AM_RANGE(0x70, 0x70) AM_READ(soundlatch_lo_r) // ADDRESS_MAP_END @@ -1371,30 +1377,6 @@ ADDRESS_MAP_END Sailor Moon ***************************************************************************/ -WRITE8_MEMBER(cave_state::sailormn_rombank_w) -{ - if (data & ~0x1f) - logerror("CPU #1 - PC %04X: Bank %02X\n", m_audiocpu->pc(), data); - - membank("z80bank")->set_entry(data & 0x1f); -} - -WRITE8_MEMBER(cave_state::sailormn_okibank_w) -{ - int bank1 = (data >> 0) & 0xf; - int bank2 = (data >> 4) & 0xf; - membank("okibank1")->set_entry(bank1); - membank("okibank2")->set_entry(bank2); -} - -WRITE8_MEMBER(cave_state::sailormn_oki2bank_w) -{ - int bank1 = (data >> 0) & 0xf; - int bank2 = (data >> 4) & 0xf; - membank("oki2bank1")->set_entry(bank1); - membank("oki2bank2")->set_entry(bank2); -} - ADDRESS_MAP_START(cave_state::sailormn_sound_map) AM_RANGE(0x0000, 0x3fff) AM_ROM // ROM AM_RANGE(0x4000, 0x7fff) AM_ROMBANK("z80bank") // ROM (Banked) @@ -1403,16 +1385,16 @@ ADDRESS_MAP_END ADDRESS_MAP_START(cave_state::sailormn_sound_portmap) ADDRESS_MAP_GLOBAL_MASK(0xff) - AM_RANGE(0x00, 0x00) AM_WRITE(sailormn_rombank_w) // Rom Bank + AM_RANGE(0x00, 0x00) AM_WRITE(z80_rombank_w<0x1f>) // Rom Bank AM_RANGE(0x10, 0x10) AM_WRITE(soundlatch_ack_w) // To Main CPU AM_RANGE(0x20, 0x20) AM_READ(soundflags_r) // Communication AM_RANGE(0x30, 0x30) AM_READ(soundlatch_lo_r) // From Main CPU AM_RANGE(0x40, 0x40) AM_READ(soundlatch_hi_r) // AM_RANGE(0x50, 0x51) AM_DEVREADWRITE("ymsnd", ym2151_device, read, write) // YM2151 AM_RANGE(0x60, 0x60) AM_DEVREADWRITE("oki1", okim6295_device, read, write) // M6295 #0 - AM_RANGE(0x70, 0x70) AM_WRITE(sailormn_okibank_w) // Samples Bank #0 + AM_RANGE(0x70, 0x70) AM_WRITE(oki1_bank_w<0xf>) // Samples Bank #0 AM_RANGE(0x80, 0x80) AM_DEVREADWRITE("oki2", okim6295_device, read, write) // M6295 #1 - AM_RANGE(0xc0, 0xc0) AM_WRITE(sailormn_oki2bank_w) // Samples Bank #1 + AM_RANGE(0xc0, 0xc0) AM_WRITE(oki2_bank_w<0xf>) // Samples Bank #1 ADDRESS_MAP_END @@ -1876,18 +1858,6 @@ static const gfx_layout layout_8x8x8 = 8*8*8 }; -/* 8x8x8 tiles, split in two roms (low / high nibble) */ -static const gfx_layout layout_8x8x8_split = -{ - 8,8, - RGN_FRAC(1,2), - 8, - {STEP4(RGN_FRAC(1,2),1), STEP4(0,1)}, - {STEP8(0,4)}, - {STEP8(0,4*8)}, - 8*8*4 -}; - #if 0 /* 16x16x8 Zooming Sprites - No need to decode them */ static const gfx_layout layout_sprites = @@ -2034,19 +2004,9 @@ GFXDECODE_END static GFXDECODE_START( sailormn ) /* 4 bit sprites ? */ // "sprites" - GFXDECODE_ENTRY( "layer0", 0, layout_8x8x4, 0x4400, 0x40 ) // [0] Layer 0 - GFXDECODE_ENTRY( "layer1", 0, layout_8x8x4, 0x4800, 0x40 ) // [1] Layer 1 - GFXDECODE_ENTRY( "layer2", 0, layout_8x8x6_2, 0x4c00, 0x40 ) // [2] Layer 2 -GFXDECODE_END - - -/*************************************************************************** - Tobikose! Jumpman -***************************************************************************/ - -static GFXDECODE_START( tjumpman ) -// "sprites" - GFXDECODE_ENTRY( "layer0", 0, layout_8x8x8_split, 0x4000, 0x40 ) // [0] Layer 0 + GFXDECODE_ENTRY( "layer0", 0, layout_8x8x4, 0x4400, 0x40 ) // [0] Layer 0 + GFXDECODE_ENTRY( "layer1", 0, layout_8x8x4, 0x4800, 0x40 ) // [1] Layer 1 + GFXDECODE_ENTRY( "layer2", 0, layout_8x8x6_2, 0x4c00, 0x40 ) // [2] Layer 2 GFXDECODE_END @@ -2071,8 +2031,9 @@ GFXDECODE_END MACHINE_START_MEMBER(cave_state,cave) { m_vblank_end_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(cave_state::cave_vblank_end), this)); - - save_item(NAME(m_soundbuf_len)); + + save_item(NAME(m_soundbuf_wptr)); + save_item(NAME(m_soundbuf_rptr)); save_item(NAME(m_soundbuf_data)); save_item(NAME(m_vblank_irq)); @@ -2083,8 +2044,9 @@ MACHINE_START_MEMBER(cave_state,cave) MACHINE_RESET_MEMBER(cave_state,cave) { - memset(m_soundbuf_data, 0, 32); - m_soundbuf_len = 0; + std::fill(std::begin(m_soundbuf_data), std::end(m_soundbuf_data), 0); + m_soundbuf_wptr = 0; + m_soundbuf_rptr = 0; m_vblank_irq = 0; m_sound_irq = 0; @@ -2379,6 +2341,7 @@ MACHINE_CONFIG_START(cave_state::hotdogst) MCFG_SPEAKER_STANDARD_MONO("mono") MCFG_GENERIC_LATCH_16_ADD("soundlatch") + MCFG_GENERIC_LATCH_DATA_PENDING_CB(INPUTLINE("audiocpu", INPUT_LINE_NMI)) MCFG_SOUND_ADD("ymsnd", YM2203, 32_MHz_XTAL/8) MCFG_YM2203_IRQ_HANDLER(INPUTLINE("audiocpu", 0)) @@ -2387,7 +2350,7 @@ MACHINE_CONFIG_START(cave_state::hotdogst) MCFG_SOUND_ROUTE(2, "mono", 0.20) MCFG_SOUND_ROUTE(3, "mono", 0.80) - MCFG_OKIM6295_ADD("oki", 32_MHz_XTAL/16, PIN7_HIGH) // pin 7 not verified + MCFG_OKIM6295_ADD("oki1", 32_MHz_XTAL/16, PIN7_HIGH) // pin 7 not verified MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) MCFG_DEVICE_ADDRESS_MAP(0, oki_map) MACHINE_CONFIG_END @@ -2481,6 +2444,7 @@ MACHINE_CONFIG_START(cave_state::mazinger) MCFG_SPEAKER_STANDARD_MONO("mono") MCFG_GENERIC_LATCH_16_ADD("soundlatch") + MCFG_GENERIC_LATCH_DATA_PENDING_CB(INPUTLINE("audiocpu", INPUT_LINE_NMI)) MCFG_SOUND_ADD("ymsnd", YM2203, 4_MHz_XTAL) MCFG_YM2203_IRQ_HANDLER(INPUTLINE("audiocpu", 0)) @@ -2489,7 +2453,7 @@ MACHINE_CONFIG_START(cave_state::mazinger) MCFG_SOUND_ROUTE(2, "mono", 0.20) MCFG_SOUND_ROUTE(3, "mono", 0.60) - MCFG_OKIM6295_ADD("oki", 1.056_MHz_XTAL, PIN7_HIGH) // clock frequency & pin 7 not verified + MCFG_OKIM6295_ADD("oki1", 1.056_MHz_XTAL, PIN7_HIGH) // clock frequency & pin 7 not verified MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 2.0) MCFG_DEVICE_ADDRESS_MAP(0, oki_map) MACHINE_CONFIG_END @@ -2537,6 +2501,7 @@ MACHINE_CONFIG_START(cave_state::metmqstr) MCFG_SPEAKER_STANDARD_MONO("mono") MCFG_GENERIC_LATCH_16_ADD("soundlatch") + MCFG_GENERIC_LATCH_DATA_PENDING_CB(INPUTLINE("audiocpu", INPUT_LINE_NMI)) MCFG_YM2151_ADD("ymsnd", 16_MHz_XTAL / 4) MCFG_YM2151_IRQ_HANDLER(INPUTLINE("audiocpu", 0)) @@ -2584,7 +2549,7 @@ MACHINE_CONFIG_START(cave_state::pacslot) MCFG_SCREEN_VISIBLE_AREA(0x80, 0x80 + 0x140-1, 0, 240-1) MCFG_SCREEN_UPDATE_DRIVER(cave_state, screen_update_cave) - MCFG_GFXDECODE_ADD("gfxdecode", "palette", tjumpman) + MCFG_GFXDECODE_ADD("gfxdecode", "palette", uopoko) MCFG_PALETTE_ADD("palette", 0x8000) MCFG_PALETTE_INIT_OWNER(cave_state,cave) @@ -2668,7 +2633,7 @@ MACHINE_CONFIG_START(cave_state::ppsatan) /* sound hardware */ MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") - MCFG_OKIM6295_ADD("oki", 1.056_MHz_XTAL, PIN7_HIGH) // clock frequency & pin 7 not verified + MCFG_OKIM6295_ADD("oki1", 1.056_MHz_XTAL, PIN7_HIGH) // clock frequency & pin 7 not verified MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 2.0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 2.0) MACHINE_CONFIG_END @@ -2715,6 +2680,7 @@ MACHINE_CONFIG_START(cave_state::pwrinst2) MCFG_SPEAKER_STANDARD_MONO("mono") MCFG_GENERIC_LATCH_16_ADD("soundlatch") + MCFG_GENERIC_LATCH_DATA_PENDING_CB(INPUTLINE("audiocpu", INPUT_LINE_NMI)) MCFG_SOUND_ADD("ymsnd", YM2203, 16_MHz_XTAL / 4) MCFG_YM2203_IRQ_HANDLER(INPUTLINE("audiocpu", 0)) @@ -2791,6 +2757,7 @@ MACHINE_CONFIG_START(cave_state::sailormn) MCFG_SPEAKER_STANDARD_MONO("mono") MCFG_GENERIC_LATCH_16_ADD("soundlatch") + MCFG_GENERIC_LATCH_DATA_PENDING_CB(INPUTLINE("audiocpu", INPUT_LINE_NMI)) MCFG_YM2151_ADD("ymsnd", 16_MHz_XTAL/4) MCFG_YM2151_IRQ_HANDLER(INPUTLINE("audiocpu", 0)) @@ -2840,7 +2807,7 @@ MACHINE_CONFIG_START(cave_state::tekkencw) MCFG_SCREEN_VISIBLE_AREA(0x80, 0x80 + 0x140-1, 0, 240-1) MCFG_SCREEN_UPDATE_DRIVER(cave_state, screen_update_cave) - MCFG_GFXDECODE_ADD("gfxdecode", "palette", tjumpman) + MCFG_GFXDECODE_ADD("gfxdecode", "palette", uopoko) MCFG_PALETTE_ADD("palette", 0x8000) MCFG_PALETTE_INIT_OWNER(cave_state,cave) @@ -2895,7 +2862,7 @@ MACHINE_CONFIG_START(cave_state::tjumpman) MCFG_SCREEN_VISIBLE_AREA(0x80, 0x80 + 0x140-1, 0, 240-1) MCFG_SCREEN_UPDATE_DRIVER(cave_state, screen_update_cave) - MCFG_GFXDECODE_ADD("gfxdecode", "palette", tjumpman) + MCFG_GFXDECODE_ADD("gfxdecode", "palette", uopoko) MCFG_PALETTE_ADD("palette", 0x8000) MCFG_PALETTE_INIT_OWNER(cave_state,cave) @@ -2960,10 +2927,10 @@ MACHINE_CONFIG_END ***************************************************************************/ /* 4 bits -> 8 bits. Even and odd pixels are swapped */ -void cave_state::unpack_sprites(const char *region) +void cave_state::unpack_sprites(int chip) { - const uint32_t len = memregion(region)->bytes(); - uint8_t *rgn = memregion(region)->base(); + const uint32_t len = m_spriteregion[chip]->bytes(); + uint8_t *rgn = m_spriteregion[chip]->base(); uint8_t *src = rgn + len / 2 - 1; uint8_t *dst = rgn + len - 1; @@ -2976,35 +2943,11 @@ void cave_state::unpack_sprites(const char *region) } -/* 4 bits -> 8 bits. Even and odd pixels and even and odd words, are swapped */ -void cave_state::ddonpach_unpack_sprites(const char *region) -{ - const uint32_t len = memregion(region)->bytes(); - uint8_t *rgn = memregion(region)->base(); - uint8_t *src = rgn + len / 2 - 1; - uint8_t *dst = rgn + len - 1; - - while(dst > src) - { - uint8_t data1 = *src--; - uint8_t data2 = *src--; - uint8_t data3 = *src--; - uint8_t data4 = *src--; - - /* swap even and odd pixels, and even and odd words */ - *dst-- = data2 & 0xF; *dst-- = data2 >> 4; - *dst-- = data1 & 0xF; *dst-- = data1 >> 4; - *dst-- = data4 & 0xF; *dst-- = data4 >> 4; - *dst-- = data3 & 0xF; *dst-- = data3 >> 4; - } -} - - /* 2 pages of 4 bits -> 8 bits */ -void cave_state::esprade_unpack_sprites(const char *region) +void cave_state::esprade_unpack_sprites(int chip) { - uint8_t *src = memregion(region)->base(); - uint8_t *dst = src + memregion(region)->bytes(); + uint8_t *src = m_spriteregion[chip]->base(); + uint8_t *dst = src + m_spriteregion[chip]->bytes(); while(src < dst) { @@ -3343,10 +3286,10 @@ ROM_START( ddonpach ) ROM_LOAD16_BYTE( "b2.u26", 0x000001, 0x080000, CRC(6bbb063a) SHA1(e5de64b9c3efc0a38a2e0e16b78ee393bff63558) ) ROM_REGION( 0x800000 * 2, "sprites0", 0 ) /* Sprites: * 2 */ - ROM_LOAD( "u50.bin", 0x000000, 0x200000, CRC(14b260ec) SHA1(33bda210302428d5500115d0c7a839cdfcb67d17) ) - ROM_LOAD( "u51.bin", 0x200000, 0x200000, CRC(e7ba8cce) SHA1(ad74a6b7d53760b19587c4a6dbea937daa7e87ce) ) - ROM_LOAD( "u52.bin", 0x400000, 0x200000, CRC(02492ee0) SHA1(64d9cc64a4ad189a8b03cf6a749ddb732b4a0014) ) - ROM_LOAD( "u53.bin", 0x600000, 0x200000, CRC(cb4c10f0) SHA1(a622e8bd0c938b5d38b392b247400b744d8be288) ) + ROM_LOAD16_WORD_SWAP( "u50.bin", 0x000000, 0x200000, CRC(14b260ec) SHA1(33bda210302428d5500115d0c7a839cdfcb67d17) ) + ROM_LOAD16_WORD_SWAP( "u51.bin", 0x200000, 0x200000, CRC(e7ba8cce) SHA1(ad74a6b7d53760b19587c4a6dbea937daa7e87ce) ) + ROM_LOAD16_WORD_SWAP( "u52.bin", 0x400000, 0x200000, CRC(02492ee0) SHA1(64d9cc64a4ad189a8b03cf6a749ddb732b4a0014) ) + ROM_LOAD16_WORD_SWAP( "u53.bin", 0x600000, 0x200000, CRC(cb4c10f0) SHA1(a622e8bd0c938b5d38b392b247400b744d8be288) ) ROM_REGION( 0x200000, "layer0", 0 ) /* Layer 0 */ ROM_LOAD( "u60.bin", 0x000000, 0x200000, CRC(903096a7) SHA1(a243e903fef7c4a7b71383263e82e42acd869261) ) @@ -3372,10 +3315,10 @@ ROM_START( ddonpachj ) ROM_LOAD16_BYTE( "u26.bin", 0x000001, 0x080000, CRC(4f3a914a) SHA1(ae98eba049f1462aa1145f6959b9f9a32c97278f) ) ROM_REGION( 0x800000 * 2, "sprites0", 0 ) /* Sprites: * 2 */ - ROM_LOAD( "u50.bin", 0x000000, 0x200000, CRC(14b260ec) SHA1(33bda210302428d5500115d0c7a839cdfcb67d17) ) - ROM_LOAD( "u51.bin", 0x200000, 0x200000, CRC(e7ba8cce) SHA1(ad74a6b7d53760b19587c4a6dbea937daa7e87ce) ) - ROM_LOAD( "u52.bin", 0x400000, 0x200000, CRC(02492ee0) SHA1(64d9cc64a4ad189a8b03cf6a749ddb732b4a0014) ) - ROM_LOAD( "u53.bin", 0x600000, 0x200000, CRC(cb4c10f0) SHA1(a622e8bd0c938b5d38b392b247400b744d8be288) ) + ROM_LOAD16_WORD_SWAP( "u50.bin", 0x000000, 0x200000, CRC(14b260ec) SHA1(33bda210302428d5500115d0c7a839cdfcb67d17) ) + ROM_LOAD16_WORD_SWAP( "u51.bin", 0x200000, 0x200000, CRC(e7ba8cce) SHA1(ad74a6b7d53760b19587c4a6dbea937daa7e87ce) ) + ROM_LOAD16_WORD_SWAP( "u52.bin", 0x400000, 0x200000, CRC(02492ee0) SHA1(64d9cc64a4ad189a8b03cf6a749ddb732b4a0014) ) + ROM_LOAD16_WORD_SWAP( "u53.bin", 0x600000, 0x200000, CRC(cb4c10f0) SHA1(a622e8bd0c938b5d38b392b247400b744d8be288) ) ROM_REGION( 0x200000, "layer0", 0 ) /* Layer 0 */ ROM_LOAD( "u60.bin", 0x000000, 0x200000, CRC(903096a7) SHA1(a243e903fef7c4a7b71383263e82e42acd869261) ) @@ -3401,10 +3344,10 @@ ROM_START( ddonpacha ) ROM_LOAD16_BYTE( "arrange_u26.bin", 0x000001, 0x080000, CRC(727a09a8) SHA1(91876386855f19e8a3d8d1df71dfe9b3d98e9ea9) ) ROM_REGION( 0x800000 * 2, "sprites0", 0 ) /* Sprites: * 2 */ - ROM_LOAD( "u50.bin", 0x000000, 0x200000, CRC(14b260ec) SHA1(33bda210302428d5500115d0c7a839cdfcb67d17) ) - ROM_LOAD( "arrange_u51.bin", 0x200000, 0x200000, CRC(0f3e5148) SHA1(3016f4d075940feae691389606cd2aa7ac53849e) ) - ROM_LOAD( "u52.bin", 0x400000, 0x200000, CRC(02492ee0) SHA1(64d9cc64a4ad189a8b03cf6a749ddb732b4a0014) ) - ROM_LOAD( "u53.bin", 0x600000, 0x200000, CRC(cb4c10f0) SHA1(a622e8bd0c938b5d38b392b247400b744d8be288) ) + ROM_LOAD16_WORD_SWAP( "u50.bin", 0x000000, 0x200000, CRC(14b260ec) SHA1(33bda210302428d5500115d0c7a839cdfcb67d17) ) + ROM_LOAD16_WORD_SWAP( "arrange_u51.bin", 0x200000, 0x200000, CRC(0f3e5148) SHA1(3016f4d075940feae691389606cd2aa7ac53849e) ) + ROM_LOAD16_WORD_SWAP( "u52.bin", 0x400000, 0x200000, CRC(02492ee0) SHA1(64d9cc64a4ad189a8b03cf6a749ddb732b4a0014) ) + ROM_LOAD16_WORD_SWAP( "u53.bin", 0x600000, 0x200000, CRC(cb4c10f0) SHA1(a622e8bd0c938b5d38b392b247400b744d8be288) ) ROM_REGION( 0x200000, "layer0", 0 ) /* Layer 0 */ ROM_LOAD( "u60.bin", 0x000000, 0x200000, CRC(903096a7) SHA1(a243e903fef7c4a7b71383263e82e42acd869261) ) @@ -3467,8 +3410,8 @@ ROM_START( donpachi ) ROM_LOAD16_WORD_SWAP( "prgu.u29", 0x00000, 0x80000, CRC(89c36802) SHA1(7857c726cecca5a4fce282e0d2b873774d2c1b1d) ) ROM_REGION( 0x400000 * 2, "sprites0", 0 ) /* Sprites: * 2 */ - ROM_LOAD( "atdp.u44", 0x000000, 0x200000, CRC(7189e953) SHA1(53adbe6ea5e01ecb48575e9db82cc3d0dc8a3726) ) - ROM_LOAD( "atdp.u45", 0x200000, 0x200000, CRC(6984173f) SHA1(625dd6674adeb206815855b8b6a1fba79ed5c4cd) ) + ROM_LOAD16_WORD_SWAP( "atdp.u44", 0x000000, 0x200000, CRC(7189e953) SHA1(53adbe6ea5e01ecb48575e9db82cc3d0dc8a3726) ) + ROM_LOAD16_WORD_SWAP( "atdp.u45", 0x200000, 0x200000, CRC(6984173f) SHA1(625dd6674adeb206815855b8b6a1fba79ed5c4cd) ) ROM_REGION( 0x100000, "layer0", 0 ) /* Layer 0 */ ROM_LOAD( "atdp.u54", 0x000000, 0x100000, CRC(6bda6b66) SHA1(6472e6706505bac17484fb8bf4e8922ced4adf63) ) @@ -3500,8 +3443,8 @@ ROM_START( donpachij ) ROM_LOAD16_WORD_SWAP( "prg.u29", 0x00000, 0x80000, CRC(6be14af6) SHA1(5b1158071f160efeded816ae4c4edca1d00d6e05) ) ROM_REGION( 0x400000 * 2, "sprites0", 0 ) /* Sprites: * 2 */ - ROM_LOAD( "atdp.u44", 0x000000, 0x200000, CRC(7189e953) SHA1(53adbe6ea5e01ecb48575e9db82cc3d0dc8a3726) ) - ROM_LOAD( "atdp.u45", 0x200000, 0x200000, CRC(6984173f) SHA1(625dd6674adeb206815855b8b6a1fba79ed5c4cd) ) + ROM_LOAD16_WORD_SWAP( "atdp.u44", 0x000000, 0x200000, CRC(7189e953) SHA1(53adbe6ea5e01ecb48575e9db82cc3d0dc8a3726) ) + ROM_LOAD16_WORD_SWAP( "atdp.u45", 0x200000, 0x200000, CRC(6984173f) SHA1(625dd6674adeb206815855b8b6a1fba79ed5c4cd) ) ROM_REGION( 0x100000, "layer0", 0 ) /* Layer 0 */ ROM_LOAD( "atdp.u54", 0x000000, 0x100000, CRC(6bda6b66) SHA1(6472e6706505bac17484fb8bf4e8922ced4adf63) ) @@ -3533,8 +3476,8 @@ ROM_START( donpachikr ) ROM_LOAD16_WORD_SWAP( "prgk.u26", 0x00000, 0x80000, CRC(bbaf4c8b) SHA1(0f9d42c8c4c5b69e3d39bf768bc4b663f66b4f36) ) ROM_REGION( 0x400000 * 2, "sprites0", 0 ) /* Sprites: * 2 */ - ROM_LOAD( "atdp.u44", 0x000000, 0x200000, CRC(7189e953) SHA1(53adbe6ea5e01ecb48575e9db82cc3d0dc8a3726) ) - ROM_LOAD( "atdp.u45", 0x200000, 0x200000, CRC(6984173f) SHA1(625dd6674adeb206815855b8b6a1fba79ed5c4cd) ) + ROM_LOAD16_WORD_SWAP( "atdp.u44", 0x000000, 0x200000, CRC(7189e953) SHA1(53adbe6ea5e01ecb48575e9db82cc3d0dc8a3726) ) + ROM_LOAD16_WORD_SWAP( "atdp.u45", 0x200000, 0x200000, CRC(6984173f) SHA1(625dd6674adeb206815855b8b6a1fba79ed5c4cd) ) ROM_REGION( 0x100000, "layer0", 0 ) /* Layer 0 */ ROM_LOAD( "atdp.u54", 0x000000, 0x100000, CRC(6bda6b66) SHA1(6472e6706505bac17484fb8bf4e8922ced4adf63) ) @@ -3566,8 +3509,8 @@ ROM_START( donpachihk ) ROM_LOAD16_WORD_SWAP( "37.u29", 0x00000, 0x80000, CRC(71f39f30) SHA1(08a028208f21c073d450a29061604f27775786a8) ) ROM_REGION( 0x400000 * 2, "sprites0", 0 ) /* Sprites: * 2 */ - ROM_LOAD( "atdp.u44", 0x000000, 0x200000, CRC(7189e953) SHA1(53adbe6ea5e01ecb48575e9db82cc3d0dc8a3726) ) - ROM_LOAD( "atdp.u45", 0x200000, 0x200000, CRC(6984173f) SHA1(625dd6674adeb206815855b8b6a1fba79ed5c4cd) ) + ROM_LOAD16_WORD_SWAP( "atdp.u44", 0x000000, 0x200000, CRC(7189e953) SHA1(53adbe6ea5e01ecb48575e9db82cc3d0dc8a3726) ) + ROM_LOAD16_WORD_SWAP( "atdp.u45", 0x200000, 0x200000, CRC(6984173f) SHA1(625dd6674adeb206815855b8b6a1fba79ed5c4cd) ) ROM_REGION( 0x100000, "layer0", 0 ) /* Layer 0 */ ROM_LOAD( "atdp.u54", 0x000000, 0x100000, CRC(6bda6b66) SHA1(6472e6706505bac17484fb8bf4e8922ced4adf63) ) @@ -3976,7 +3919,7 @@ ROM_START( hotdogst ) ROM_REGION( 0x80000, "layer2", 0 ) /* Layer 2 */ ROM_LOAD( "mp5.u64", 0x00000, 0x80000, CRC(9b26458c) SHA1(acef62422fa3f92e6ca1eba0ee6fb914cd1ee190) ) - ROM_REGION( 0x80000, "oki", 0 ) /* Samples */ + ROM_REGION( 0x80000, "oki1", 0 ) /* Samples */ ROM_LOAD( "mp1.u65", 0x00000, 0x80000, CRC(4868be1b) SHA1(32b8234b19fdbe07fa5057fa7965e36807e35e77) ) // 1xxxxxxxxxxxxxxxxxx = 0xFF, 4 x 0x20000 ROM_REGION16_BE( 0x80, "eeprom", 0 ) @@ -4106,7 +4049,7 @@ U55 ROM_REGION( 0x200000, "layer1", 0 ) \ ROM_LOAD( "bp943a-0.u63", 0x000000, 0x200000, CRC(c1fed98a) SHA1(c276505f80a49b129862966a19db507f97153e45) ) \ \ - ROM_REGION( 0x080000, "oki", 0 ) \ + ROM_REGION( 0x080000, "oki1", 0 ) \ ROM_LOAD( "bp943a-4.u64", 0x000000, 0x080000, CRC(3fc7f29a) SHA1(feb21b918243c0a03dfa4a80cc80b86be4f62680) ) /* the regions differ only in the EEPROM, hence the macro above - all EEPROMs are Factory Defaulted */ @@ -4271,8 +4214,8 @@ ROM_START( pacslot ) ROM_LOAD16_BYTE( "pa1-obj1.u53", 0x00001, 0x80000, CRC(6eb76a04) SHA1(66c8e36bee4439c203a02b30898e4f741205d681) ) ROM_REGION( 0x80000, "layer0", 0 ) /* Layer 0 */ - ROM_LOAD( "pa1-cha0.u60", 0x00000, 0x40000, CRC(314b51a6) SHA1(eef102c4f0c0e0f668a7cf228cd4fbe45b2ce45f) ) - ROM_LOAD( "pa1-cha1.u61", 0x40000, 0x40000, CRC(f7a2c846) SHA1(3b505a7a3c7f30e6cd87803f5ae7e962205fc1f0) ) + ROM_LOAD16_BYTE( "pa1-cha0.u60", 0x00000, 0x40000, CRC(314b51a6) SHA1(eef102c4f0c0e0f668a7cf228cd4fbe45b2ce45f) ) + ROM_LOAD16_BYTE( "pa1-cha1.u61", 0x00001, 0x40000, CRC(f7a2c846) SHA1(3b505a7a3c7f30e6cd87803f5ae7e962205fc1f0) ) ROM_REGION( 0x40000, "oki1", 0 ) /* OKIM6295 #1 Samples */ ROM_LOAD( "pa1-voi0.u27", 0x00000, 0x40000, CRC(e3e623e1) SHA1(396accc7f7384277b700f019b5083def8a48ccd7) ) @@ -4315,8 +4258,8 @@ ROM_START( paceight ) ROM_LOAD16_BYTE( "pae1-obj1.u53", 0x00001, 0x80000, CRC(9ae2685b) SHA1(5eed5f00d28d803358c8ffaf42c4979af23a0a8c) ) // "" ROM_REGION( 0x80000, "layer0", 0 ) /* Layer 0 */ - ROM_LOAD( "pae1-cha0.u60", 0x00000, 0x40000, CRC(757263e3) SHA1(668060e9e209752474f48362752a3f819ff82d72) ) // 27c020? not readable - ROM_LOAD( "pae1-cha1.u61", 0x40000, 0x40000, CRC(0396d241) SHA1(79382805fa4486d8dae792f9afc0f02aee1bbb33) ) // "" + ROM_LOAD16_BYTE( "pae1-cha0.u60", 0x00000, 0x40000, CRC(757263e3) SHA1(668060e9e209752474f48362752a3f819ff82d72) ) // 27c020? not readable + ROM_LOAD16_BYTE( "pae1-cha1.u61", 0x00001, 0x40000, CRC(0396d241) SHA1(79382805fa4486d8dae792f9afc0f02aee1bbb33) ) // "" ROM_REGION( 0x40000, "oki1", 0 ) /* OKIM6295 #1 Samples */ ROM_LOAD( "pae1-vo10.u27", 0x00000, 0x40000, CRC(0be7b94f) SHA1(4179e2ab2d2d1df0cc6cfd71e277ea114578f147) ) // 27c? not readable @@ -4378,7 +4321,7 @@ ROM_START( ppsatan ) ROM_REGION( 0x80000, "layer2", 0 ) /* Layer 2 */ ROM_LOAD( "ver1.0.u53", 0x00000, 0x80000, CRC(f21787b0) SHA1(e29ffcf948ef55f8ee11949903e5a363e6c4fa44) ) // 1xxxxxxxxxxxxxxxxxx = 0x00 - ROM_REGION( 0x80000, "oki", 0 ) /* Samples */ + ROM_REGION( 0x80000, "oki1", 0 ) /* Samples */ ROM_LOAD( "7a1f.u83", 0x000000, 0x80000, CRC(2ae77933) SHA1(a5eb0915813efd538b0812a6bbd5239b4b203f4a) ) ROM_REGION( 0x117, "plds", 0 ) @@ -4970,8 +4913,8 @@ ROM_START( tekkencw ) ROM_LOAD16_BYTE( "obj1.u53", 0x00001, 0x80000, CRC(8069b731) SHA1(9f0409c28466503092b74f635602962d9f127de8) ) // "" ROM_REGION( 0x80000, "layer0", 0 ) /* Layer 0 */ - ROM_LOAD( "cha0.u60", 0x00000, 0x40000, CRC(2a245ade) SHA1(7217017975c88c3edea613152ee6f2158f8777d7) ) // 27c020 - ROM_LOAD( "cha1.u61", 0x40000, 0x40000, CRC(43f62cce) SHA1(aa12ed0ccb94115ff8f9acf17850e1186c68bcf9) ) // "" + ROM_LOAD16_BYTE( "cha0.u60", 0x00000, 0x40000, CRC(2a245ade) SHA1(7217017975c88c3edea613152ee6f2158f8777d7) ) // 27c020 + ROM_LOAD16_BYTE( "cha1.u61", 0x00001, 0x40000, CRC(43f62cce) SHA1(aa12ed0ccb94115ff8f9acf17850e1186c68bcf9) ) // "" ROM_REGION( 0x40000, "oki1", 0 ) /* OKIM6295 #1 Samples */ ROM_LOAD( "voi0.u27", 0x00000, 0x40000, CRC(3bcd9b7d) SHA1(7ecb47127733187f385a75b9db655e35c249de18) ) // 27c020 @@ -5010,8 +4953,8 @@ ROM_START( tekkenbs ) ROM_LOAD16_BYTE( "tbs1_obj-1a.u53", 0x00001, 0x80000, CRC(73d8f520) SHA1(70ab5abeeaf0b3f5a263a7ece21d000a27148994) ) // "" ROM_REGION( 0x100000, "layer0", 0 ) /* Layer 0 */ - ROM_LOAD( "tbs1_cha-0a.u60", 0x00000, 0x80000, CRC(73e5c069) SHA1(5e4e8a0bc1fdf57e4cdf7075704dc0b60d9629e3) ) // 27c4001 - ROM_LOAD( "tbs1_cha-1a.u61", 0x80000, 0x80000, CRC(f41d3f2f) SHA1(d44f1506110fe9b7ef74ca05874146526ddaf020) ) // "" + ROM_LOAD16_BYTE( "tbs1_cha-0a.u60", 0x00000, 0x80000, CRC(73e5c069) SHA1(5e4e8a0bc1fdf57e4cdf7075704dc0b60d9629e3) ) // 27c4001 + ROM_LOAD16_BYTE( "tbs1_cha-1a.u61", 0x00001, 0x80000, CRC(f41d3f2f) SHA1(d44f1506110fe9b7ef74ca05874146526ddaf020) ) // "" ROM_REGION( 0x40000, "oki1", 0 ) /* OKIM6295 #1 Samples */ ROM_LOAD( "tbs1_voi-0a.u27", 0x00000, 0x40000, CRC(bdccb92e) SHA1(7efcce4028fe492891e6f47b266d68a22dbe4c63) ) // 27c2001 @@ -5050,8 +4993,8 @@ ROM_START( tjumpman ) ROM_LOAD16_BYTE( "tj1_obj-1a.u53", 0x00001, 0x80000, CRC(5f0124d7) SHA1(4d9cfa464159998c176a178c668273d128dedff8) ) ROM_REGION( 0x80000, "layer0", 0 ) /* Layer 0 */ - ROM_LOAD( "tj1_cha-0a.u60", 0x00000, 0x40000, CRC(8aa08a38) SHA1(92b4df72fb8a833bb686ea478811243c5b868470) ) - ROM_LOAD( "tj1_cha-1a.u61", 0x40000, 0x40000, CRC(50072c82) SHA1(f8823e5a865afb8824cafd3b6483e2b6250ee77f) ) + ROM_LOAD16_BYTE( "tj1_cha-0a.u60", 0x00000, 0x40000, CRC(8aa08a38) SHA1(92b4df72fb8a833bb686ea478811243c5b868470) ) + ROM_LOAD16_BYTE( "tj1_cha-1a.u61", 0x00001, 0x40000, CRC(50072c82) SHA1(f8823e5a865afb8824cafd3b6483e2b6250ee77f) ) ROM_REGION( 0x40000, "oki1", 0 ) /* OKIM6295 #1 Samples */ ROM_LOAD( "tj1_voi-0a.u27", 0x00000, 0x40000, CRC(b5693aae) SHA1(8887ae98030cb5d184e3d57d2b4e48bf1e76a232) ) @@ -5131,10 +5074,10 @@ ROM_END /* Tiles are 6 bit, 4 bits stored in one rom, 2 bits in the other. Expand the 2 bit part into a 4 bit layout, so we can decode it */ -void cave_state::sailormn_unpack_tiles( const char *region ) +void cave_state::sailormn_unpack_tiles(int chip) { - const uint32_t len = memregion(region)->bytes(); - uint8_t *rgn = memregion(region)->base(); + const uint32_t len= m_tileregion[chip]->bytes(); + uint8_t *rgn = m_tileregion[chip]->base(); uint8_t *src = rgn + (len/4)*3 - 1; uint8_t *dst = rgn + (len/4)*4 - 2; @@ -5159,32 +5102,40 @@ void cave_state::init_cave() m_irq_level = 1; } +void cave_state::init_z80_bank() +{ + uint8_t *ROM = m_z80region->base(); + uint32_t max = m_z80region->bytes() / 0x4000; + m_z80bank->configure_entries(0, max, &ROM[0x00000], 0x4000); +} -DRIVER_INIT_MEMBER(cave_state,agallet) +void cave_state::init_oki_bank(int chip) { - uint8_t *ROM = memregion("audiocpu")->base(); - init_cave(); + uint8_t *ROM = m_okiregion[chip]->base(); + uint32_t max = m_okiregion[chip]->bytes() / 0x20000; + m_okibank_lo[chip]->configure_entries(0, max, &ROM[0x00000], 0x20000); + m_okibank_hi[chip]->configure_entries(0, max, &ROM[0x00000], 0x20000); +} - membank("z80bank")->configure_entries(0, 0x20, &ROM[0x00000], 0x4000); - ROM = memregion("oki1")->base(); - membank("okibank1")->configure_entries(0, 0x10, &ROM[0x00000], 0x20000); - membank("okibank2")->configure_entries(0, 0x10, &ROM[0x00000], 0x20000); +DRIVER_INIT_MEMBER(cave_state,agallet) +{ + init_cave(); - ROM = memregion("oki2")->base(); - membank("oki2bank1")->configure_entries(0, 0x10, &ROM[0x00000], 0x20000); - membank("oki2bank2")->configure_entries(0, 0x10, &ROM[0x00000], 0x20000); + init_z80_bank(); + init_oki_bank(0); + init_oki_bank(1); - sailormn_unpack_tiles("layer2"); + sailormn_unpack_tiles(2); - unpack_sprites("sprites0"); + unpack_sprites(0); } DRIVER_INIT_MEMBER(cave_state,dfeveron) { init_cave(); - unpack_sprites("sprites0"); + unpack_sprites(0); m_kludge = 2; } @@ -5192,7 +5143,7 @@ DRIVER_INIT_MEMBER(cave_state,feversos) { init_cave(); - unpack_sprites("sprites0"); + unpack_sprites(0); m_kludge = 2; } @@ -5200,7 +5151,7 @@ DRIVER_INIT_MEMBER(cave_state,ddonpach) { init_cave(); - ddonpach_unpack_sprites("sprites0"); + unpack_sprites(0); m_spritetype[0] = 1; // "different" sprites (no zooming?) m_time_vblank_irq = 90; } @@ -5209,7 +5160,7 @@ DRIVER_INIT_MEMBER(cave_state,donpachi) { init_cave(); - ddonpach_unpack_sprites("sprites0"); + unpack_sprites(0); m_spritetype[0] = 1; // "different" sprites (no zooming?) m_time_vblank_irq = 90; } @@ -5219,7 +5170,7 @@ DRIVER_INIT_MEMBER(cave_state,esprade) { init_cave(); - esprade_unpack_sprites("sprites0"); + esprade_unpack_sprites(0); m_time_vblank_irq = 2000; /**/ #if 0 //ROM PATCH @@ -5236,7 +5187,7 @@ DRIVER_INIT_MEMBER(cave_state,gaia) /* No EEPROM */ - unpack_sprites("sprites0"); + unpack_sprites(0); m_spritetype[0] = 2; // Normal sprites with different position handling m_time_vblank_irq = 2000; /**/ } @@ -5245,40 +5196,31 @@ DRIVER_INIT_MEMBER(cave_state,guwange) { init_cave(); - esprade_unpack_sprites("sprites0"); + esprade_unpack_sprites(0); m_time_vblank_irq = 2000; /**/ } DRIVER_INIT_MEMBER(cave_state,hotdogst) { - uint8_t *ROM = memregion("audiocpu")->base(); - init_cave(); - membank("z80bank")->configure_entries(0, 0x10, &ROM[0x00000], 0x4000); + init_z80_bank(); + init_oki_bank(0); - ROM = memregion("oki")->base(); - membank("okibank1")->configure_entries(0, 4, &ROM[0x00000], 0x20000); - membank("okibank2")->configure_entries(0, 4, &ROM[0x00000], 0x20000); - - unpack_sprites("sprites0"); + unpack_sprites(0); m_spritetype[0] = 2; // Normal sprites with different position handling m_time_vblank_irq = 2000; /**/ } DRIVER_INIT_MEMBER(cave_state,mazinger) { - uint8_t *ROM = memregion("audiocpu")->base(); uint8_t *src = memregion("sprites0")->base(); int len = memregion("sprites0")->bytes(); init_cave(); - membank("z80bank")->configure_entries(0, 8, &ROM[0x00000], 0x4000); - - ROM = memregion("oki")->base(); - membank("okibank1")->configure_entries(0, 4, &ROM[0x00000], 0x20000); - membank("okibank2")->configure_entries(0, 4, &ROM[0x00000], 0x20000); + init_z80_bank(); + init_oki_bank(0); /* decrypt sprites */ std::vector buffer(len); @@ -5286,10 +5228,10 @@ DRIVER_INIT_MEMBER(cave_state,mazinger) int i; for (i = 0; i < len; i++) buffer[i ^ 0xdf88] = src[bitswap<24>(i,23,22,21,20,19,9,7,3,15,4,17,14,18,2,16,5,11,8,6,13,1,10,12,0)]; - memcpy(src, &buffer[0], len); + std::copy(buffer.begin(), buffer.end(), &src[0]); } - unpack_sprites("sprites0"); + unpack_sprites(0); m_spritetype[0] = 2; // Normal sprites with different position handling m_kludge = 3; m_time_vblank_irq = 2100; @@ -5297,21 +5239,13 @@ DRIVER_INIT_MEMBER(cave_state,mazinger) DRIVER_INIT_MEMBER(cave_state,metmqstr) { - uint8_t *ROM = memregion("audiocpu")->base(); - init_cave(); - membank("z80bank")->configure_entries(0, 0x10, &ROM[0x00000], 0x4000); - - ROM = memregion("oki1")->base(); - membank("okibank1")->configure_entries(0, 8, &ROM[0x00000], 0x20000); - membank("okibank2")->configure_entries(0, 8, &ROM[0x00000], 0x20000); + init_z80_bank(); + init_oki_bank(0); + init_oki_bank(1); - ROM = memregion("oki2")->base(); - membank("oki2bank1")->configure_entries(0, 8, &ROM[0x00000], 0x20000); - membank("oki2bank2")->configure_entries(0, 8, &ROM[0x00000], 0x20000); - - unpack_sprites("sprites0"); + unpack_sprites(0); m_spritetype[0] = 2; // Normal sprites with different position handling m_kludge = 3; m_time_vblank_irq = 17376; @@ -5321,9 +5255,9 @@ DRIVER_INIT_MEMBER(cave_state,ppsatan) { init_cave(); - unpack_sprites("sprites0"); - unpack_sprites("sprites1"); - unpack_sprites("sprites2"); + unpack_sprites(0); + unpack_sprites(1); + unpack_sprites(2); m_spritetype[0] = 2; m_time_vblank_irq = 2000; /**/ @@ -5334,14 +5268,13 @@ DRIVER_INIT_MEMBER(cave_state,ppsatan) DRIVER_INIT_MEMBER(cave_state,pwrinst2j) { - uint8_t *ROM = memregion("audiocpu")->base(); uint8_t *src = memregion("sprites0")->base(); int len = memregion("sprites0")->bytes(); int i, j; init_cave(); - membank("z80bank")->configure_entries(0, 8, &ROM[0x00000], 0x4000); + init_z80_bank(); std::vector buffer(len); { @@ -5353,10 +5286,10 @@ DRIVER_INIT_MEMBER(cave_state,pwrinst2j) buffer[j ^ 7] = (src[i] >> 4) | (src[i] << 4); } - memcpy(src,&buffer[0],len); + std::copy(buffer.begin(), buffer.end(), &src[0]); } - unpack_sprites("sprites0"); + unpack_sprites(0); m_spritetype[0] = 3; m_kludge = 4; m_time_vblank_irq = 2000; /**/ @@ -5379,21 +5312,14 @@ DRIVER_INIT_MEMBER(cave_state,pwrinst2) DRIVER_INIT_MEMBER(cave_state,sailormn) { - uint8_t *ROM = memregion("audiocpu")->base(); uint8_t *src = memregion("sprites0")->base(); int len = memregion("sprites0")->bytes(); init_cave(); - membank("z80bank")->configure_entries(0, 0x20, &ROM[0x00000], 0x4000); - - ROM = memregion("oki1")->base(); - membank("okibank1")->configure_entries(0, 0x10, &ROM[0x00000], 0x20000); - membank("okibank2")->configure_entries(0, 0x10, &ROM[0x00000], 0x20000); - - ROM = memregion("oki2")->base(); - membank("oki2bank1")->configure_entries(0, 0x10, &ROM[0x00000], 0x20000); - membank("oki2bank2")->configure_entries(0, 0x10, &ROM[0x00000], 0x20000); + init_z80_bank(); + init_oki_bank(0); + init_oki_bank(1); /* decrypt sprites */ std::vector buffer(len); @@ -5401,12 +5327,12 @@ DRIVER_INIT_MEMBER(cave_state,sailormn) int i; for (i = 0; i < len; i++) buffer[i ^ 0x950c4] = src[bitswap<24>(i,23,22,21,20,15,10,12,6,11,1,13,3,16,17,2,5,14,7,18,8,4,19,9,0)]; - memcpy(src, &buffer[0], len); + std::copy(buffer.begin(), buffer.end(), &src[0]); } - sailormn_unpack_tiles("layer2"); + sailormn_unpack_tiles(2); - unpack_sprites("sprites0"); + unpack_sprites(0); m_spritetype[0] = 2; // Normal sprites with different position handling m_kludge = 1; m_time_vblank_irq = 2000; @@ -5419,7 +5345,7 @@ DRIVER_INIT_MEMBER(cave_state,tjumpman) { init_cave(); - unpack_sprites("sprites0"); + unpack_sprites(0); m_spritetype[0] = 2; // Normal sprites with different position handling m_kludge = 3; m_time_vblank_irq = 17376; @@ -5432,7 +5358,7 @@ DRIVER_INIT_MEMBER(cave_state,uopoko) { init_cave(); - unpack_sprites("sprites0"); + unpack_sprites(0); m_kludge = 2; m_time_vblank_irq = 2000; /**/ } @@ -5443,7 +5369,7 @@ DRIVER_INIT_MEMBER(cave_state,korokoro) m_irq_level = 2; - unpack_sprites("sprites0"); + unpack_sprites(0); m_time_vblank_irq = 2000; /**/ m_leds[0] = 0; diff --git a/src/mame/includes/cave.h b/src/mame/includes/cave.h index 3e252256e6b..2c190ae6d9a 100644 --- a/src/mame/includes/cave.h +++ b/src/mame/includes/cave.h @@ -49,11 +49,17 @@ public: , m_vram(*this, "vram.%u", 0) , m_vctrl(*this, "vctrl.%u", 0) , m_spriteram(*this, "spriteram.%u", 0) - , m_spriteram_2(*this, "spriteram_2.%u", 0) , m_paletteram(*this, "paletteram.%u", 0) + , m_spriteregion(*this, "sprites%u", 0) + , m_tileregion(*this, "layer%u", 0) + , m_okiregion(*this, "oki%u", 1) + , m_z80region(*this, "audiocpu") + , m_z80bank(*this, "z80bank") + , m_okibank_lo(*this, "oki%u_banklo", 1) + , m_okibank_hi(*this, "oki%u_bankhi", 1) , m_maincpu(*this, "maincpu") , m_audiocpu(*this, "audiocpu") - , m_oki(*this, "oki") + , m_oki(*this, "oki%u", 1) , m_int_timer(*this, "int_timer") , m_int_timer_left(*this, "int_timer_left") , m_int_timer_right(*this, "int_timer_right") @@ -68,9 +74,17 @@ public: optional_shared_ptr_array m_vram; optional_shared_ptr_array m_vctrl; optional_shared_ptr_array m_spriteram; - optional_shared_ptr_array m_spriteram_2; optional_shared_ptr_array m_paletteram; + /* memory regions */ + optional_memory_region_array<4> m_spriteregion; + optional_memory_region_array<4> m_tileregion; + optional_memory_region_array<2> m_okiregion; + optional_memory_region m_z80region; + optional_memory_bank m_z80bank; + optional_memory_bank_array<2> m_okibank_lo; + optional_memory_bank_array<2> m_okibank_hi; + /* video-related */ std::unique_ptr m_sprite[4]; sprite_cave *m_sprite_table[4][MAX_PRIORITY][MAX_SPRITE_NUM + 1]; @@ -93,7 +107,7 @@ public: int m_old_tiledim[4]; bitmap_ind16 m_sprite_zbuf; - uint16_t m_sprite_zbuf_baseval; + uint16_t m_sprite_zbuf_baseval; int m_num_sprites[4]; @@ -115,31 +129,32 @@ public: /* misc */ int m_time_vblank_irq; - uint8_t m_irq_level; - uint8_t m_vblank_irq; - uint8_t m_sound_irq; - uint8_t m_unknown_irq; - uint8_t m_agallet_vblank_irq; + uint8_t m_irq_level; + uint8_t m_vblank_irq; + uint8_t m_sound_irq; + uint8_t m_unknown_irq; + uint8_t m_agallet_vblank_irq; /* sound related */ - int m_soundbuf_len; - uint8_t m_soundbuf_data[32]; - //uint8_t m_sound_flag1; - //uint8_t m_sound_flag2; + int m_soundbuf_wptr; + int m_soundbuf_rptr; + uint8_t m_soundbuf_data[32]; + //uint8_t m_sound_flag1; + //uint8_t m_sound_flag2; /* game specific */ // sailormn int m_sailormn_tilebank; // korokoro - uint16_t m_leds[2]; + uint16_t m_leds[2]; int m_hopper; // ppsatan - uint16_t m_ppsatan_io_mux; + uint16_t m_ppsatan_io_mux; /* devices */ required_device m_maincpu; optional_device m_audiocpu; - optional_device m_oki; + optional_device_array m_oki; required_device m_int_timer; optional_device m_int_timer_left; optional_device m_int_timer_right; @@ -162,31 +177,15 @@ public: DECLARE_WRITE16_MEMBER(gaia_coin_lsb_w); DECLARE_READ16_MEMBER(donpachi_videoregs_r); DECLARE_WRITE16_MEMBER(korokoro_leds_w); - DECLARE_WRITE16_MEMBER(pwrinst2_vctrl_0_w); - DECLARE_WRITE16_MEMBER(pwrinst2_vctrl_1_w); - DECLARE_WRITE16_MEMBER(pwrinst2_vctrl_2_w); - DECLARE_WRITE16_MEMBER(pwrinst2_vctrl_3_w); + template DECLARE_WRITE16_MEMBER(pwrinst2_vctrl_w); DECLARE_READ16_MEMBER(sailormn_input0_r); DECLARE_WRITE16_MEMBER(tjumpman_leds_w); DECLARE_WRITE16_MEMBER(pacslot_leds_w); - DECLARE_WRITE8_MEMBER(hotdogst_rombank_w); - DECLARE_WRITE8_MEMBER(hotdogst_okibank_w); - DECLARE_WRITE8_MEMBER(mazinger_rombank_w); - DECLARE_WRITE8_MEMBER(metmqstr_rombank_w); - DECLARE_WRITE8_MEMBER(metmqstr_okibank_w); - DECLARE_WRITE8_MEMBER(metmqstr_oki2bank_w); - DECLARE_WRITE8_MEMBER(pwrinst2_rombank_w); - DECLARE_WRITE8_MEMBER(sailormn_rombank_w); - DECLARE_WRITE8_MEMBER(sailormn_okibank_w); - DECLARE_WRITE8_MEMBER(sailormn_oki2bank_w); - DECLARE_WRITE16_MEMBER(cave_vram_0_w); - DECLARE_WRITE16_MEMBER(cave_vram_1_w); - DECLARE_WRITE16_MEMBER(cave_vram_2_w); - DECLARE_WRITE16_MEMBER(cave_vram_3_w); - DECLARE_WRITE16_MEMBER(cave_vram_0_8x8_w); - DECLARE_WRITE16_MEMBER(cave_vram_1_8x8_w); - DECLARE_WRITE16_MEMBER(cave_vram_2_8x8_w); - DECLARE_WRITE16_MEMBER(cave_vram_3_8x8_w); + template DECLARE_WRITE8_MEMBER(z80_rombank_w); + template DECLARE_WRITE8_MEMBER(oki1_bank_w); + template DECLARE_WRITE8_MEMBER(oki2_bank_w); + template DECLARE_WRITE16_MEMBER(vram_w); + template DECLARE_WRITE16_MEMBER(vram_8x8_w); DECLARE_CUSTOM_INPUT_MEMBER(korokoro_hopper_r); DECLARE_CUSTOM_INPUT_MEMBER(tjumpman_hopper_r); DECLARE_WRITE16_MEMBER(cave_eeprom_msb_w); @@ -222,10 +221,7 @@ public: DECLARE_DRIVER_INIT(metmqstr); DECLARE_DRIVER_INIT(ppsatan); TILE_GET_INFO_MEMBER(sailormn_get_tile_info_2); - TILE_GET_INFO_MEMBER(get_tile_info_0); - TILE_GET_INFO_MEMBER(get_tile_info_1); - TILE_GET_INFO_MEMBER(get_tile_info_2); - TILE_GET_INFO_MEMBER(get_tile_info_3); + template TILE_GET_INFO_MEMBER(get_tile_info); DECLARE_MACHINE_START(cave); DECLARE_MACHINE_RESET(cave); DECLARE_MACHINE_RESET(sailormn); @@ -260,10 +256,9 @@ public: void sailormn_tilebank_w(int bank); DECLARE_WRITE_LINE_MEMBER(sound_irq_gen); void update_irq_state(); - void unpack_sprites(const char *region); - void ddonpach_unpack_sprites(const char *region); - void esprade_unpack_sprites(const char *region); - void sailormn_unpack_tiles(const char *region); + void unpack_sprites(int chip); + void esprade_unpack_sprites(int chip); + void sailormn_unpack_tiles(int chip); void uopoko(machine_config &config); void sailormn(machine_config &config); @@ -318,11 +313,7 @@ public: void tjumpman_map(address_map &map); void uopoko_map(address_map &map); private: - inline void get_tile_info( tile_data &tileinfo, int tile_index, int GFX ); inline void tilemap_draw( int chip, screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, uint32_t flags, uint32_t priority, uint32_t priority2, int GFX ); - inline void vram_w( address_space &space, ATTR_UNUSED offs_t offset, ATTR_UNUSED uint16_t data, ATTR_UNUSED uint16_t mem_mask, int GFX ); - inline void vram_8x8_w( address_space &space, ATTR_UNUSED offs_t offset, ATTR_UNUSED uint16_t data, ATTR_UNUSED uint16_t mem_mask, int GFX ); - inline void vctrl_w( address_space &space, offs_t offset, uint16_t data, uint16_t mem_mask, int GFX ); void set_pens(int chip); void cave_vh_start( int num ); void get_sprite_info_cave(int chip); @@ -338,6 +329,8 @@ private: void sprite_draw_donpachi( int chip, int priority ); void sprite_draw_donpachi_zbuf( int chip, int priority ); void init_cave(); + void init_z80_bank(); + void init_oki_bank(int chip); void show_leds(); }; diff --git a/src/mame/video/cave.cpp b/src/mame/video/cave.cpp index 75d32eafeb2..de08a215d20 100644 --- a/src/mame/video/cave.cpp +++ b/src/mame/video/cave.cpp @@ -33,8 +33,8 @@ Note: if MAME_DEBUG is defined, pressing: [ 1024 Zooming Sprites ] - There are 2 sprite RAMs. A hardware register's bit selects - the one to display (sprites double buffering). + There are 2 or 4 0x4000 Sprite RAM Areas. A hardware register's + bit selects an area to display (sprites double buffering). The sprites are NOT tile based: the "tile" size and start address is selectable for each sprite with a 16 pixel granularity. @@ -58,8 +58,6 @@ Note: if MAME_DEBUG is defined, pressing: #define SPRITE_FLIPY_CAVE 0x02 #define SPRITE_VISIBLE_CAVE 0x04 -#define SWAP(X,Y) { int temp = X; X = Y; Y = temp; } - /*************************************************************************** @@ -218,10 +216,11 @@ void cave_state::set_pens(int chip) ***************************************************************************/ -inline void cave_state::get_tile_info( tile_data &tileinfo, int tile_index, int GFX ) +template +TILE_GET_INFO_MEMBER(cave_state::get_tile_info) { - uint16_t *VRAM = m_vram[GFX]; - int TDIM = m_tiledim[GFX]; + uint16_t *VRAM = m_vram[Chip]; + int TDIM = m_tiledim[Chip]; uint32_t code, color, pri, tile; if (TDIM) @@ -245,7 +244,7 @@ inline void cave_state::get_tile_info( tile_data &tileinfo, int tile_index, int code = (code & 0x00ffffff); } - SET_TILE_INFO_MEMBER(GFX, code, color, 0 ); + SET_TILE_INFO_MEMBER(Chip, code, color, 0 ); tileinfo.category = pri; } @@ -294,64 +293,6 @@ TILE_GET_INFO_MEMBER(cave_state::sailormn_get_tile_info_2) } -inline void cave_state::vram_w( address_space &space, ATTR_UNUSED offs_t offset, ATTR_UNUSED uint16_t data, ATTR_UNUSED uint16_t mem_mask, int GFX ) -{ - uint16_t *VRAM = m_vram[GFX]; - tilemap_t *TILEMAP = m_tilemap[GFX]; - - if ((VRAM[offset] & mem_mask) == (data & mem_mask)) - return; - - COMBINE_DATA(&VRAM[offset]); - offset /= 2; - if (offset < 0x1000 / 4) // 16x16 tilemap - { - offset = (offset % (512 / 16)) * 2 + (offset / (512 / 16)) * (512 / 8) * 2; - TILEMAP->mark_tile_dirty(offset + 0); - TILEMAP->mark_tile_dirty(offset + 1); - TILEMAP->mark_tile_dirty(offset + 0 + 512 / 8); - TILEMAP->mark_tile_dirty(offset + 1 + 512 / 8); - } - else if (offset >= 0x4000 / 4) // 8x8 tilemap - TILEMAP->mark_tile_dirty(offset - 0x4000 / 4); -} - -/* Some games, that only ever use the 8x8 tiles and no line scroll, - use mirror ram. For example in donpachi, writes to 400000-403fff - and 408000-407fff both go to the 8x8 tilemap ram. Use this function - in this cases. Note that the get_tile_info function looks in the - 4000-7fff range for tiles, so we have to write the data there. */ -inline void cave_state::vram_8x8_w( address_space &space, ATTR_UNUSED offs_t offset, ATTR_UNUSED uint16_t data, ATTR_UNUSED uint16_t mem_mask, int GFX ) -{ - uint16_t *VRAM = m_vram[GFX]; - tilemap_t *TILEMAP = m_tilemap[GFX]; - - offset %= 0x4000 / 2; - if ((VRAM[offset] & mem_mask) == (data & mem_mask)) - return; - - COMBINE_DATA(&VRAM[offset + 0x0000 / 2]); - COMBINE_DATA(&VRAM[offset + 0x4000 / 2]); - TILEMAP->mark_tile_dirty(offset / 2); -} - - -TILE_GET_INFO_MEMBER(cave_state::get_tile_info_0){ get_tile_info(tileinfo, tile_index, 0); } -TILE_GET_INFO_MEMBER(cave_state::get_tile_info_1){ get_tile_info(tileinfo, tile_index, 1); } -TILE_GET_INFO_MEMBER(cave_state::get_tile_info_2){ get_tile_info(tileinfo, tile_index, 2); } -TILE_GET_INFO_MEMBER(cave_state::get_tile_info_3){ get_tile_info(tileinfo, tile_index, 3); } - -WRITE16_MEMBER(cave_state::cave_vram_0_w){ vram_w(space, offset, data, mem_mask, 0); } -WRITE16_MEMBER(cave_state::cave_vram_1_w){ vram_w(space, offset, data, mem_mask, 1); } -WRITE16_MEMBER(cave_state::cave_vram_2_w){ vram_w(space, offset, data, mem_mask, 2); } -WRITE16_MEMBER(cave_state::cave_vram_3_w){ vram_w(space, offset, data, mem_mask, 3); } - -WRITE16_MEMBER(cave_state::cave_vram_0_8x8_w){ vram_8x8_w(space, offset, data, mem_mask, 0); } -WRITE16_MEMBER(cave_state::cave_vram_1_8x8_w){ vram_8x8_w(space, offset, data, mem_mask, 1); } -WRITE16_MEMBER(cave_state::cave_vram_2_8x8_w){ vram_8x8_w(space, offset, data, mem_mask, 2); } -WRITE16_MEMBER(cave_state::cave_vram_3_8x8_w){ vram_8x8_w(space, offset, data, mem_mask, 3); } - - /*************************************************************************** Video Init Routines @@ -385,7 +326,7 @@ void cave_state::cave_vh_start( int num ) switch (num) { case 4: - m_tilemap[3] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(cave_state::get_tile_info_3),this), TILEMAP_SCAN_ROWS, 8, 8, 512 / 8, 512 / 8); + m_tilemap[3] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(cave_state::get_tile_info<3>),this), TILEMAP_SCAN_ROWS, 8, 8, 512 / 8, 512 / 8); m_tilemap[3]->set_transparent_pen(0); m_tilemap[3]->set_scroll_rows(1); m_tilemap[3]->set_scroll_cols(1); @@ -393,7 +334,7 @@ void cave_state::cave_vh_start( int num ) save_item(NAME(m_old_tiledim[3])); case 3: - m_tilemap[2] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(cave_state::get_tile_info_2),this), TILEMAP_SCAN_ROWS, 8, 8, 512 / 8, 512 / 8); + m_tilemap[2] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(cave_state::get_tile_info<2>),this), TILEMAP_SCAN_ROWS, 8, 8, 512 / 8, 512 / 8); m_tilemap[2]->set_transparent_pen(0); m_tilemap[2]->set_scroll_rows(1); m_tilemap[2]->set_scroll_cols(1); @@ -401,7 +342,7 @@ void cave_state::cave_vh_start( int num ) save_item(NAME(m_old_tiledim[2])); case 2: - m_tilemap[1] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(cave_state::get_tile_info_1),this), TILEMAP_SCAN_ROWS, 8, 8, 512 / 8, 512 / 8); + m_tilemap[1] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(cave_state::get_tile_info<1>),this), TILEMAP_SCAN_ROWS, 8, 8, 512 / 8, 512 / 8); m_tilemap[1]->set_transparent_pen(0); m_tilemap[1]->set_scroll_rows(1); m_tilemap[1]->set_scroll_cols(1); @@ -409,7 +350,7 @@ void cave_state::cave_vh_start( int num ) save_item(NAME(m_old_tiledim[1])); case 1: - m_tilemap[0] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(cave_state::get_tile_info_0),this), TILEMAP_SCAN_ROWS, 8, 8, 512 / 8, 512 / 8); + m_tilemap[0] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(cave_state::get_tile_info<0>),this), TILEMAP_SCAN_ROWS, 8, 8, 512 / 8, 512 / 8); m_tilemap[0]->set_transparent_pen(0); m_tilemap[0]->set_scroll_rows(1); m_tilemap[0]->set_scroll_cols(1); @@ -499,10 +440,10 @@ VIDEO_START_MEMBER(cave_state,sailormn_3_layers) void cave_state::get_sprite_info_cave(int chip) { + chip %= 4; pen_t base_pal = 0; - const char *region[4] = { "sprites0", "sprites1", "sprites2", "sprites3" }; - const uint8_t *base_gfx = memregion(region[chip])->base(); - int code_max = memregion(region[chip])->bytes() / (16*16); + const uint8_t *base_gfx = m_spriteregion[chip]->base(); + int code_max = m_spriteregion[chip]->bytes() / (16*16); uint16_t *source; uint16_t *finish; @@ -514,13 +455,9 @@ void cave_state::get_sprite_info_cave(int chip) int max_x = m_screen->width(); int max_y = m_screen->height(); - source = m_spriteram[chip] + ((m_spriteram[chip].bytes() / 2) / 2) * m_spriteram_bank[chip%4]; + source = m_spriteram[chip] + (0x4000 / 2) * m_spriteram_bank[chip]; - if (m_videoregs[chip][4] & 0x02) - if (m_spriteram_2[chip]) - source = m_spriteram_2[chip] + ((m_spriteram[chip].bytes() / 2) / 2) * m_spriteram_bank[chip]; - - finish = source + ((m_spriteram[chip].bytes() / 2) / 2); + finish = source + (0x4000 / 2); for (; source < finish; source += 8) @@ -628,10 +565,10 @@ void cave_state::get_sprite_info_cave(int chip) void cave_state::get_sprite_info_donpachi(int chip) { + chip %= 4; pen_t base_pal = 0; - const char *region[4] = { "sprites0", "sprites1", "sprites2", "sprites3" }; - const uint8_t *base_gfx = memregion(region[chip])->base(); - int code_max = memregion(region[chip])->bytes() / (16*16); + const uint8_t *base_gfx = m_spriteregion[chip]->base(); + int code_max = m_spriteregion[chip]->bytes() / (16*16); uint16_t *source; uint16_t *finish; @@ -643,14 +580,10 @@ void cave_state::get_sprite_info_donpachi(int chip) int max_x = m_screen->width(); int max_y = m_screen->height(); + + source = m_spriteram[chip] + (0x4000 / 2) * m_spriteram_bank[chip]; - source = m_spriteram[chip] + ((m_spriteram[chip].bytes() / 2) / 2) * m_spriteram_bank[chip%4]; - - if (m_videoregs[chip][4] & 0x02) - if (m_spriteram_2[chip]) - source = m_spriteram_2[chip] + ((m_spriteram[chip].bytes() / 2) / 2) * m_spriteram_bank[chip]; - - finish = source + ((m_spriteram[chip].bytes() / 2) / 2); + finish = source + (0x4000 / 2); for (; source < finish; source += 8) { @@ -1386,8 +1319,8 @@ void cave_state::sprite_draw_donpachi_zbuf( int chip, int priority ) .. - 8.w fedc ba98 7654 321- - ---- ---- ---- ---0 Sprite RAM Bank + 8.w fedc ba98 7654 32-- + ---- ---- ---- --10 Sprite RAM Bank There are more! @@ -1632,6 +1565,7 @@ uint32_t cave_state::screen_update_cave(screen_device &screen, bitmap_rgb32 &bit void cave_state::cave_get_sprite_info(int chip) { + int spriteram_bankmax = m_spriteram[chip].bytes() / 0x4000; if (m_videoregs[chip] == nullptr) return; @@ -1642,13 +1576,13 @@ void cave_state::cave_get_sprite_info(int chip) m_spriteram_bank[chip] = m_spriteram_bank_delay[chip]; (this->*m_get_sprite_info)(chip); } - m_spriteram_bank_delay[chip] = m_videoregs[chip][4] & 1; + m_spriteram_bank_delay[chip] = (m_videoregs[chip][4] & 3) % spriteram_bankmax; } else { if (machine().video().skip_this_frame() == 0) { - m_spriteram_bank[chip] = m_videoregs[chip][4] & 1; + m_spriteram_bank[chip] = (m_videoregs[chip][4] & 3) % spriteram_bankmax; (this->*m_get_sprite_info)(chip); } } -- cgit v1.2.3