diff --git a/src/mame/drivers/cave.cpp b/src/mame/drivers/cave.cpp index 9b1dde95e6e..216eec536ae 100644 --- a/src/mame/drivers/cave.cpp +++ b/src/mame/drivers/cave.cpp @@ -52,6 +52,7 @@ To Do: - Max sprite number is possibly less than 1024 (ex: Boss explosion scene at most of cave shmups on real hardware) +- Tilemap scrolling issue in ppsatan right screen Stephh's notes (based on the games M68000 code and some tests) : @@ -178,19 +179,22 @@ WRITE_LINE_MEMBER(cave_state::sound_irq_gen) u16 cave_state::irq_cause_r(offs_t offset) { - int result = 0x0003; + u16 result = 0x0003; if (m_vblank_irq) result ^= 0x01; if (m_unknown_irq) result ^= 0x02; - if (offset == 4/2) - m_vblank_irq = 0; - if (offset == 6/2) - m_unknown_irq = 0; + if (!machine().side_effects_disabled()) + { + if (offset == 4/2) + m_vblank_irq = 0; + if (offset == 6/2) + m_unknown_irq = 0; - update_irq_state(); + update_irq_state(); + } /* sailormn and agallet wait for bit 2 of $b80001 to go 1 -> 0. @@ -227,7 +231,7 @@ u8 cave_state::soundflags_r() return 0; } -READ16_MEMBER(cave_state::soundflags_ack_r) +u16 cave_state::soundflags_ack_r() { // bit 0 is low: can write command // bit 1 is low: can read answer @@ -238,7 +242,7 @@ READ16_MEMBER(cave_state::soundflags_ack_r) } /* Main CPU: write a 16 bit sound latch and generate a NMI on the sound CPU */ -WRITE16_MEMBER(cave_state::sound_cmd_w) +void cave_state::sound_cmd_w(u16 data) { // m_sound_flag[0] = 1; // m_sound_flag[1] = 1; @@ -247,27 +251,30 @@ WRITE16_MEMBER(cave_state::sound_cmd_w) } /* Sound CPU: read the low 8 bits of the 16 bit sound latch */ -READ8_MEMBER(cave_state::soundlatch_lo_r) +u8 cave_state::soundlatch_lo_r() { // m_sound_flag[0] = 0; return m_soundlatch->read() & 0xff; } /* Sound CPU: read the high 8 bits of the 16 bit sound latch */ -READ8_MEMBER(cave_state::soundlatch_hi_r) +u8 cave_state::soundlatch_hi_r() { // m_sound_flag[1] = 0; return m_soundlatch->read() >> 8; } /* Main CPU: read the latch written by the sound CPU (acknowledge) */ -READ16_MEMBER(cave_state::soundlatch_ack_r) +u16 cave_state::soundlatch_ack_r() { if (!m_soundbuf_empty) { - uint8_t data = m_soundbuf_data[m_soundbuf_rptr]; - m_soundbuf_rptr = (m_soundbuf_rptr + 1) & 0x1f; - m_soundbuf_empty = m_soundbuf_rptr == m_soundbuf_wptr; + const u8 data = m_soundbuf_data[m_soundbuf_rptr]; + if (!machine().side_effects_disabled()) + { + m_soundbuf_rptr = (m_soundbuf_rptr + 1) & 0x1f; + m_soundbuf_empty = m_soundbuf_rptr == m_soundbuf_wptr; + } return data; } else @@ -279,7 +286,7 @@ READ16_MEMBER(cave_state::soundlatch_ack_r) /* Sound CPU: write latch for the main CPU (acknowledge) */ -WRITE8_MEMBER(cave_state::soundlatch_ack_w) +void cave_state::soundlatch_ack_w(u8 data) { if (m_soundbuf_empty || (m_soundbuf_wptr != m_soundbuf_rptr)) { @@ -416,10 +423,10 @@ void cave_state::metmqstr_eeprom_w(u8 data) ***************************************************************************/ template -WRITE16_MEMBER(cave_state::vram_w) +void cave_state::vram_w(offs_t offset, u16 data, u16 mem_mask) { - uint16_t *VRAM = m_vram[Chip]; - int TDIM = m_tiledim[Chip]; + u16 *VRAM = m_vram[Chip]; + const bool TDIM = m_tiledim[Chip]; tilemap_t *TILEMAP = m_tilemap[Chip]; if ((VRAM[offset] & mem_mask) == (data & mem_mask)) @@ -445,9 +452,9 @@ WRITE16_MEMBER(cave_state::vram_w) 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) +void cave_state::vram_8x8_w(offs_t offset, u16 data, u16 mem_mask) { - uint16_t *VRAM = m_vram[Chip]; + u16 *VRAM = m_vram[Chip]; tilemap_t *TILEMAP = m_tilemap[Chip]; offset %= 0x4000 / 2; @@ -483,7 +490,7 @@ void cave_state::dfeveron_map(address_map &map) map(0x400000, 0x40ffff).ram().share("spriteram.0"); // Sprites map(0x500000, 0x507fff).ram().w(FUNC(cave_state::vram_w<0>)).share("vram.0"); // Layer 0 map(0x600000, 0x607fff).ram().w(FUNC(cave_state::vram_w<1>)).share("vram.1"); // Layer 1 - map(0x708000, 0x708fff).ram().share("paletteram.0"); // Palette + map(0x708000, 0x708fff).ram().w(m_palette[0], FUNC(palette_device::write16)).share("palette.0"); // Palette map(0x710000, 0x710bff).readonly(); // ? map(0x710c00, 0x710fff).ram(); // ? map(0x800000, 0x80007f).writeonly().share("videoregs.0"); // Video Regs @@ -514,7 +521,7 @@ void cave_state::ddonpach_map(address_map &map) map(0x900000, 0x900005).ram().share("vctrl.0"); // Layer 0 Control map(0xa00000, 0xa00005).ram().share("vctrl.1"); // Layer 1 Control map(0xb00000, 0xb00005).ram().share("vctrl.2"); // Layer 2 Control - map(0xc00000, 0xc0ffff).ram().share("paletteram.0"); // Palette + map(0xc00000, 0xc0ffff).ram().w(m_palette[0], FUNC(palette_device::write16)).share("palette.0"); // Palette map(0xd00000, 0xd00001).portr("IN0"); // Inputs map(0xd00002, 0xd00003).portr("IN1"); // Inputs + EEPROM map(0xe00000, 0xe00000).w(FUNC(cave_state::eeprom_w)); // EEPROM @@ -525,7 +532,7 @@ void cave_state::ddonpach_map(address_map &map) Donpachi ***************************************************************************/ -READ16_MEMBER(cave_state::donpachi_videoregs_r) +u16 cave_state::donpachi_videoregs_r(offs_t offset) { switch (offset) { @@ -550,7 +557,7 @@ void cave_state::donpachi_map(address_map &map) map(0x700000, 0x700005).ram().share("vctrl.0"); // Layer 0 Control map(0x800000, 0x800005).ram().share("vctrl.2"); // Layer 2 Control map(0x900000, 0x90007f).ram().r(FUNC(cave_state::donpachi_videoregs_r)).share("videoregs.0"); // Video Regs - map(0xa08000, 0xa08fff).ram().share("paletteram.0"); // Palette + map(0xa08000, 0xa08fff).ram().w(m_palette[0], FUNC(palette_device::write16)).share("palette.0"); // Palette map(0xb00000, 0xb00003).rw("oki1", FUNC(okim6295_device::read), FUNC(okim6295_device::write)).umask16(0x00ff); // M6295 map(0xb00010, 0xb00013).rw("oki2", FUNC(okim6295_device::read), FUNC(okim6295_device::write)).umask16(0x00ff); // map(0xb00020, 0xb0002f).w("nmk112", FUNC(nmk112_device::okibank_w)).umask16(0x00ff); // @@ -578,7 +585,7 @@ void cave_state::esprade_map(address_map &map) map(0x900000, 0x900005).ram().share("vctrl.0"); // Layer 0 Control map(0xa00000, 0xa00005).ram().share("vctrl.1"); // Layer 1 Control map(0xb00000, 0xb00005).ram().share("vctrl.2"); // Layer 2 Control - map(0xc00000, 0xc0ffff).ram().share("paletteram.0"); // Palette + map(0xc00000, 0xc0ffff).ram().w(m_palette[0], FUNC(palette_device::write16)).share("palette.0"); // Palette map(0xd00000, 0xd00001).portr("IN0"); // Inputs map(0xd00002, 0xd00003).portr("IN1"); // Inputs + EEPROM map(0xe00000, 0xe00000).w(FUNC(cave_state::eeprom_w)); // EEPROM @@ -606,7 +613,7 @@ void cave_state::gaia_map(address_map &map) map(0x900000, 0x900005).ram().share("vctrl.0"); // Layer 0 Control map(0xa00000, 0xa00005).ram().share("vctrl.1"); // Layer 1 Control map(0xb00000, 0xb00005).ram().share("vctrl.2"); // Layer 2 Control - map(0xc00000, 0xc0ffff).ram().share("paletteram.0"); // Palette + map(0xc00000, 0xc0ffff).ram().w(m_palette[0], FUNC(palette_device::write16)).share("palette.0"); // Palette map(0xd00010, 0xd00011).portr("IN0"); // Inputs map(0xd00011, 0xd00011).w(FUNC(cave_state::gaia_coin_w)); // Coin counter only map(0xd00012, 0xd00013).portr("IN1"); // Inputs @@ -633,7 +640,7 @@ void cave_state::guwange_map(address_map &map) map(0x900000, 0x900005).ram().share("vctrl.0"); // Layer 0 Control map(0xa00000, 0xa00005).ram().share("vctrl.1"); // Layer 1 Control map(0xb00000, 0xb00005).ram().share("vctrl.2"); // Layer 2 Control -/**/map(0xc00000, 0xc0ffff).ram().share("paletteram.0"); // Palette +/**/map(0xc00000, 0xc0ffff).ram().w(m_palette[0], FUNC(palette_device::write16)).share("palette.0"); // Palette map(0xd00010, 0xd00011).portr("IN0"); // Inputs map(0xd00011, 0xd00011).w(FUNC(cave_state::guwange_eeprom_w)); // EEPROM map(0xd00012, 0xd00013).portr("IN1"); // Inputs + EEPROM @@ -648,24 +655,24 @@ void cave_state::guwange_map(address_map &map) void cave_state::hotdogst_map(address_map &map) { - map(0x000000, 0x0fffff).rom(); // ROM - map(0x300000, 0x30ffff).ram(); // RAM - map(0x408000, 0x408fff).ram().share("paletteram.0"); // Palette - map(0x880000, 0x887fff).ram().w(FUNC(cave_state::vram_w<0>)).share("vram.0"); // Layer 0 - map(0x900000, 0x907fff).ram().w(FUNC(cave_state::vram_w<1>)).share("vram.1"); // Layer 1 - map(0x980000, 0x987fff).ram().w(FUNC(cave_state::vram_w<2>)).share("vram.2"); // Layer 2 - map(0xa80000, 0xa8007f).writeonly().share("videoregs.0"); // Video Regs - map(0xa80000, 0xa80007).r(FUNC(cave_state::irq_cause_r)); // IRQ Cause -// map(0xa8006e, 0xa8006f).r(FUNC(cave_state::soundlatch_ack_r)); // From Sound CPU - map(0xa8006e, 0xa8006f).w(FUNC(cave_state::sound_cmd_w)); // To Sound CPU - map(0xb00000, 0xb00005).ram().share("vctrl.0"); // Layer 0 Control - map(0xb80000, 0xb80005).ram().share("vctrl.1"); // Layer 1 Control - map(0xc00000, 0xc00005).ram().share("vctrl.2"); // Layer 2 Control - map(0xc80000, 0xc80001).portr("IN0"); // Inputs - map(0xc80002, 0xc80003).portr("IN1"); // Inputs + EEPROM - map(0xd00000, 0xd00000).w(FUNC(cave_state::hotdogst_eeprom_w)); // EEPROM - map(0xd00002, 0xd00003).nopw(); // ??? - map(0xf00000, 0xf0ffff).ram().share("spriteram.0"); // Sprites + map(0x000000, 0x0fffff).rom(); // ROM + map(0x300000, 0x30ffff).ram(); // RAM + map(0x408000, 0x408fff).ram().w(m_palette[0], FUNC(palette_device::write16)).share("palette.0"); // Palette + map(0x880000, 0x887fff).ram().w(FUNC(cave_state::vram_w<0>)).share("vram.0"); // Layer 0 + map(0x900000, 0x907fff).ram().w(FUNC(cave_state::vram_w<1>)).share("vram.1"); // Layer 1 + map(0x980000, 0x987fff).ram().w(FUNC(cave_state::vram_w<2>)).share("vram.2"); // Layer 2 + map(0xa80000, 0xa8007f).writeonly().share("videoregs.0"); // Video Regs + map(0xa80000, 0xa80007).r(FUNC(cave_state::irq_cause_r)); // IRQ Cause +// map(0xa8006e, 0xa8006f).r(FUNC(cave_state::soundlatch_ack_r)); // From Sound CPU + map(0xa8006e, 0xa8006f).w(FUNC(cave_state::sound_cmd_w)); // To Sound CPU + map(0xb00000, 0xb00005).ram().share("vctrl.0"); // Layer 0 Control + map(0xb80000, 0xb80005).ram().share("vctrl.1"); // Layer 1 Control + map(0xc00000, 0xc00005).ram().share("vctrl.2"); // Layer 2 Control + map(0xc80000, 0xc80001).portr("IN0"); // Inputs + map(0xc80002, 0xc80003).portr("IN1"); // Inputs + EEPROM + map(0xd00000, 0xd00000).w(FUNC(cave_state::hotdogst_eeprom_w)); // EEPROM + map(0xd00002, 0xd00003).nopw(); // ??? + map(0xf00000, 0xf0ffff).ram().share("spriteram.0"); // Sprites } @@ -680,7 +687,7 @@ void cave_state::show_leds() #endif } -WRITE16_MEMBER(cave_state::korokoro_leds_w) +void cave_state::korokoro_leds_w(offs_t offset, u16 data, u16 mem_mask) { COMBINE_DATA(&m_leds[0]); @@ -736,39 +743,39 @@ CUSTOM_INPUT_MEMBER(cave_state::korokoro_hopper_r) void cave_state::korokoro_map(address_map &map) { - map(0x000000, 0x07ffff).rom(); // ROM - map(0x100000, 0x107fff).w(FUNC(cave_state::vram_w<0>)).share("vram.0"); // Layer 0 - map(0x140000, 0x140005).writeonly().share("vctrl.0"); // Layer 0 Control - map(0x180000, 0x187fff).writeonly().share("spriteram.0"); // Sprites - map(0x1c0000, 0x1c007f).writeonly().share("videoregs.0"); // Video Regs - map(0x1c0000, 0x1c0007).r(FUNC(cave_state::irq_cause_r)); // IRQ Cause - map(0x200000, 0x207fff).writeonly().share("paletteram.0"); // Palette -// map(0x240000, 0x240003).r("ymz", FUNC(ymz280b_device::read)).umask16(0x00ff); // YMZ280 - map(0x240000, 0x240003).w("ymz", FUNC(ymz280b_device::write)).umask16(0x00ff); // YMZ280 - map(0x280000, 0x280001).portr("IN0"); // Inputs + ??? - map(0x280002, 0x280003).portr("IN1"); // Inputs + EEPROM - map(0x280008, 0x280009).w(FUNC(cave_state::korokoro_leds_w)); // Leds - map(0x28000a, 0x28000b).w(FUNC(cave_state::korokoro_eeprom_w)); // EEPROM - map(0x28000c, 0x28000d).nopw(); // 0 (watchdog?) - map(0x300000, 0x30ffff).ram(); // RAM + map(0x000000, 0x07ffff).rom(); // ROM + map(0x100000, 0x107fff).w(FUNC(cave_state::vram_w<0>)).share("vram.0"); // Layer 0 + map(0x140000, 0x140005).writeonly().share("vctrl.0"); // Layer 0 Control + map(0x180000, 0x187fff).writeonly().share("spriteram.0"); // Sprites + map(0x1c0000, 0x1c007f).writeonly().share("videoregs.0"); // Video Regs + map(0x1c0000, 0x1c0007).r(FUNC(cave_state::irq_cause_r)); // IRQ Cause + map(0x200000, 0x207fff).writeonly().w(m_palette[0], FUNC(palette_device::write16)).share("palette.0"); // Palette +// map(0x240000, 0x240003).r("ymz", FUNC(ymz280b_device::read)).umask16(0x00ff); // YMZ280 + map(0x240000, 0x240003).w("ymz", FUNC(ymz280b_device::write)).umask16(0x00ff); // YMZ280 + map(0x280000, 0x280001).portr("IN0"); // Inputs + ??? + map(0x280002, 0x280003).portr("IN1"); // Inputs + EEPROM + map(0x280008, 0x280009).w(FUNC(cave_state::korokoro_leds_w)); // Leds + map(0x28000a, 0x28000b).w(FUNC(cave_state::korokoro_eeprom_w)); // EEPROM + map(0x28000c, 0x28000d).nopw(); // 0 (watchdog?) + map(0x300000, 0x30ffff).ram(); // RAM } void cave_state::crusherm_map(address_map &map) { - map(0x000000, 0x07ffff).rom(); // ROM - map(0x100000, 0x107fff).w(FUNC(cave_state::vram_w<0>)).share("vram.0"); // Layer 0 - map(0x140000, 0x140005).writeonly().share("vctrl.0"); // Layer 0 Control - map(0x180000, 0x187fff).writeonly().share("spriteram.0"); // Sprites - map(0x200000, 0x207fff).writeonly().share("paletteram.0"); // Palette - map(0x240000, 0x240003).w("ymz", FUNC(ymz280b_device::write)).umask16(0x00ff); // YMZ280 - map(0x280000, 0x280001).portr("IN0"); // Inputs + ??? - map(0x280002, 0x280003).portr("IN1"); // Inputs + EEPROM - map(0x280008, 0x280009).w(FUNC(cave_state::korokoro_leds_w)); // Leds - map(0x28000a, 0x28000b).w(FUNC(cave_state::korokoro_eeprom_w)); // EEPROM - map(0x28000c, 0x28000d).nopw(); // 0 (watchdog?) - map(0x300000, 0x30007f).writeonly().share("videoregs.0"); // Video Regs - map(0x300000, 0x300007).r(FUNC(cave_state::irq_cause_r)); // IRQ Cause - map(0x340000, 0x34ffff).ram(); // RAM + map(0x000000, 0x07ffff).rom(); // ROM + map(0x100000, 0x107fff).w(FUNC(cave_state::vram_w<0>)).share("vram.0"); // Layer 0 + map(0x140000, 0x140005).writeonly().share("vctrl.0"); // Layer 0 Control + map(0x180000, 0x187fff).writeonly().share("spriteram.0"); // Sprites + map(0x200000, 0x207fff).writeonly().w(m_palette[0], FUNC(palette_device::write16)).share("palette.0"); // Palette + map(0x240000, 0x240003).w("ymz", FUNC(ymz280b_device::write)).umask16(0x00ff); // YMZ280 + map(0x280000, 0x280001).portr("IN0"); // Inputs + ??? + map(0x280002, 0x280003).portr("IN1"); // Inputs + EEPROM + map(0x280008, 0x280009).w(FUNC(cave_state::korokoro_leds_w)); // Leds + map(0x28000a, 0x28000b).w(FUNC(cave_state::korokoro_eeprom_w)); // EEPROM + map(0x28000c, 0x28000d).nopw(); // 0 (watchdog?) + map(0x300000, 0x30007f).writeonly().share("videoregs.0"); // Video Regs + map(0x300000, 0x300007).r(FUNC(cave_state::irq_cause_r)); // IRQ Cause + map(0x340000, 0x34ffff).ram(); // RAM } /*************************************************************************** @@ -777,22 +784,22 @@ void cave_state::crusherm_map(address_map &map) void cave_state::mazinger_map(address_map &map) { - map(0x000000, 0x07ffff).rom(); // ROM - map(0x100000, 0x10ffff).ram(); // RAM - map(0x200000, 0x20ffff).ram().share("spriteram.0"); // Sprites - map(0x300000, 0x30007f).writeonly().share("videoregs.0"); // Video Regs - map(0x300000, 0x300007).r(FUNC(cave_state::irq_cause_r)); // IRQ Cause - map(0x300068, 0x300069).w("watchdog", FUNC(watchdog_timer_device::reset16_w)); // Watchdog - map(0x30006e, 0x30006f).rw(FUNC(cave_state::soundlatch_ack_r), FUNC(cave_state::sound_cmd_w)); // From Sound CPU - map(0x400000, 0x407fff).ram().w(FUNC(cave_state::vram_8x8_w<1>)).share("vram.1"); // Layer 1 - map(0x500000, 0x507fff).ram().w(FUNC(cave_state::vram_8x8_w<0>)).share("vram.0"); // Layer 0 - map(0x600000, 0x600005).ram().share("vctrl.1"); // Layer 1 Control - map(0x700000, 0x700005).ram().share("vctrl.0"); // Layer 0 Control - map(0x800000, 0x800001).portr("IN0"); // Inputs - map(0x800002, 0x800003).portr("IN1"); // Inputs + EEPROM - map(0x900000, 0x900000).w(FUNC(cave_state::eeprom_w)); // EEPROM - map(0xc08000, 0xc0ffff).ram().share("paletteram.0"); // Palette - map(0xd00000, 0xd7ffff).rom().region("user1", 0); // extra data ROM + map(0x000000, 0x07ffff).rom(); // ROM + map(0x100000, 0x10ffff).ram(); // RAM + map(0x200000, 0x20ffff).ram().share("spriteram.0"); // Sprites + map(0x300000, 0x30007f).writeonly().share("videoregs.0"); // Video Regs + map(0x300000, 0x300007).r(FUNC(cave_state::irq_cause_r)); // IRQ Cause + map(0x300068, 0x300069).w("watchdog", FUNC(watchdog_timer_device::reset16_w)); // Watchdog + map(0x30006e, 0x30006f).rw(FUNC(cave_state::soundlatch_ack_r), FUNC(cave_state::sound_cmd_w)); // From Sound CPU + map(0x400000, 0x407fff).ram().w(FUNC(cave_state::vram_8x8_w<1>)).share("vram.1"); // Layer 1 + map(0x500000, 0x507fff).ram().w(FUNC(cave_state::vram_8x8_w<0>)).share("vram.0"); // Layer 0 + map(0x600000, 0x600005).ram().share("vctrl.1"); // Layer 1 Control + map(0x700000, 0x700005).ram().share("vctrl.0"); // Layer 0 Control + map(0x800000, 0x800001).portr("IN0"); // Inputs + map(0x800002, 0x800003).portr("IN1"); // Inputs + EEPROM + map(0x900000, 0x900000).w(FUNC(cave_state::eeprom_w)); // EEPROM + map(0xc08000, 0xc0ffff).ram().w(m_palette[0], FUNC(palette_device::write16)).share("palette.0"); // Palette + map(0xd00000, 0xd7ffff).rom().region("user1", 0); // extra data ROM } @@ -802,29 +809,29 @@ void cave_state::mazinger_map(address_map &map) void cave_state::metmqstr_map(address_map &map) { - map(0x000000, 0x07ffff).rom(); // ROM - map(0x100000, 0x17ffff).rom(); // ROM - map(0x200000, 0x27ffff).rom(); // ROM - map(0x408000, 0x408fff).ram().share("paletteram.0"); // Palette - map(0x600000, 0x600001).r("watchdog", FUNC(watchdog_timer_device::reset16_r)); // Watchdog? - map(0x880000, 0x887fff).ram().w(FUNC(cave_state::vram_w<2>)).share("vram.2"); // Layer 2 - map(0x888000, 0x88ffff).ram(); // - map(0x900000, 0x907fff).ram().w(FUNC(cave_state::vram_w<1>)).share("vram.1"); // Layer 1 - map(0x908000, 0x90ffff).ram(); // - map(0x980000, 0x987fff).ram().w(FUNC(cave_state::vram_w<0>)).share("vram.0"); // Layer 0 - map(0x988000, 0x98ffff).ram(); // - map(0xa80000, 0xa8007f).writeonly().share("videoregs.0"); // Video Regs - map(0xa80000, 0xa80007).r(FUNC(cave_state::irq_cause_r)); // IRQ Cause - map(0xa80068, 0xa80069).w("watchdog", FUNC(watchdog_timer_device::reset16_w)); // Watchdog? - map(0xa8006c, 0xa8006d).r(FUNC(cave_state::soundflags_ack_r)).nopw(); // Communication - map(0xa8006e, 0xa8006f).rw(FUNC(cave_state::soundlatch_ack_r), FUNC(cave_state::sound_cmd_w)); // From Sound CPU - map(0xb00000, 0xb00005).ram().share("vctrl.2"); // Layer 2 Control - map(0xb80000, 0xb80005).ram().share("vctrl.1"); // Layer 1 Control - map(0xc00000, 0xc00005).ram().share("vctrl.0"); // Layer 0 Control - map(0xc80000, 0xc80001).portr("IN0"); // Inputs - map(0xc80002, 0xc80003).portr("IN1"); // Inputs + EEPROM - map(0xd00000, 0xd00000).w(FUNC(cave_state::metmqstr_eeprom_w)); // EEPROM - map(0xf00000, 0xf0ffff).ram().share("spriteram.0"); // Sprites + map(0x000000, 0x07ffff).rom(); // ROM + map(0x100000, 0x17ffff).rom(); // ROM + map(0x200000, 0x27ffff).rom(); // ROM + map(0x408000, 0x408fff).ram().w(m_palette[0], FUNC(palette_device::write16)).share("palette.0"); // Palette + map(0x600000, 0x600001).r("watchdog", FUNC(watchdog_timer_device::reset16_r)); // Watchdog? + map(0x880000, 0x887fff).ram().w(FUNC(cave_state::vram_w<2>)).share("vram.2"); // Layer 2 + map(0x888000, 0x88ffff).ram(); // + map(0x900000, 0x907fff).ram().w(FUNC(cave_state::vram_w<1>)).share("vram.1"); // Layer 1 + map(0x908000, 0x90ffff).ram(); // + map(0x980000, 0x987fff).ram().w(FUNC(cave_state::vram_w<0>)).share("vram.0"); // Layer 0 + map(0x988000, 0x98ffff).ram(); // + map(0xa80000, 0xa8007f).writeonly().share("videoregs.0"); // Video Regs + map(0xa80000, 0xa80007).r(FUNC(cave_state::irq_cause_r)); // IRQ Cause + map(0xa80068, 0xa80069).w("watchdog", FUNC(watchdog_timer_device::reset16_w)); // Watchdog? + map(0xa8006c, 0xa8006d).r(FUNC(cave_state::soundflags_ack_r)).nopw(); // Communication + map(0xa8006e, 0xa8006f).rw(FUNC(cave_state::soundlatch_ack_r), FUNC(cave_state::sound_cmd_w)); // From Sound CPU + map(0xb00000, 0xb00005).ram().share("vctrl.2"); // Layer 2 Control + map(0xb80000, 0xb80005).ram().share("vctrl.1"); // Layer 1 Control + map(0xc00000, 0xc00005).ram().share("vctrl.0"); // Layer 0 Control + map(0xc80000, 0xc80001).portr("IN0"); // Inputs + map(0xc80002, 0xc80003).portr("IN1"); // Inputs + EEPROM + map(0xd00000, 0xd00000).w(FUNC(cave_state::metmqstr_eeprom_w)); // EEPROM + map(0xf00000, 0xf0ffff).ram().share("spriteram.0"); // Sprites } @@ -832,17 +839,18 @@ void cave_state::metmqstr_map(address_map &map) Poka Poka Satan ***************************************************************************/ -WRITE16_MEMBER(cave_state::ppsatan_io_mux_w) +void cave_state::ppsatan_io_mux_w(offs_t offset, u16 data, u16 mem_mask) { COMBINE_DATA(&m_ppsatan_io_mux); } -uint16_t cave_state::ppsatan_touch_r(int player) +template +u16 cave_state::ppsatan_touch_r() { - uint8_t ret_x = 0, ret_y = 0; + u8 ret_x = 0, ret_y = 0; - uint16_t x = ioport(player ? "TOUCH2_X" : "TOUCH1_X")->read(); - uint16_t y = ioport(player ? "TOUCH2_Y" : "TOUCH1_Y")->read(); + u16 x = m_touch_x[Player]->read(); + u16 y = m_touch_y[Player]->read(); if (x & 0x8000) // touching { @@ -870,22 +878,13 @@ uint16_t cave_state::ppsatan_touch_r(int player) if ( ((m_ppsatan_io_mux >> 2) & (1 << slot_y)) || ((m_ppsatan_io_mux << 6) & (1 << slot_y)) ) ret_y |= 1 << (slot_y % 6); -// if (!player) popmessage("TOUCH %03x %03x -> %f -> %d", x, y, ((320.0f - 1 - x) - 12) / 20, slot_x); +// if (!Player) popmessage("TOUCH %03x %03x -> %f -> %d", x, y, ((320.0f - 1 - x) - 12) / 20, slot_x); } return ret_x | (ret_y << 8); } -READ16_MEMBER(cave_state::ppsatan_touch1_r) -{ - return ppsatan_touch_r(0); -} -READ16_MEMBER(cave_state::ppsatan_touch2_r) -{ - return ppsatan_touch_r(1); -} - -WRITE16_MEMBER(cave_state::ppsatan_out_w) +void cave_state::ppsatan_out_w(offs_t offset, u16 data, u16 mem_mask) { if (ACCESSING_BITS_0_7) { @@ -918,13 +917,13 @@ void cave_state::ppsatan_map(address_map &map) map(0x080000, 0x080005).ram().share("vctrl.1"); // Layer Control map(0x100000, 0x107fff).ram().w(FUNC(cave_state::vram_w<1>)).share("vram.1"); // Layer // map(0x180000, 0x1803ff).ram() // Palette (Tilemaps) -// map(0x187800, 0x188fff).ram().share("paletteram.1"); // Palette (Sprites) - map(0x180000, 0x188fff).ram().share("paletteram.1"); // Palette +// map(0x187800, 0x188fff).ram().w(m_palette[1], FUNC(palette_device::write16)).share("palette.1"); // Palette (Sprites) + map(0x180000, 0x188fff).ram().w(m_palette[1], FUNC(palette_device::write16)).share("palette.1"); // Palette map(0x1c0000, 0x1c7fff).ram().share("spriteram.1"); // Sprites map(0x200000, 0x200001).portr("SYSTEM"); // DSW + (unused) EEPROM map(0x200000, 0x200001).w(FUNC(cave_state::ppsatan_out_w)); // Outputs + OKI banking - map(0x200002, 0x200003).rw(FUNC(cave_state::ppsatan_touch2_r), FUNC(cave_state::ppsatan_eeprom_w)); // Touch Screen + (unused) EEPROM - map(0x200004, 0x200005).rw(FUNC(cave_state::ppsatan_touch1_r), FUNC(cave_state::ppsatan_io_mux_w)); // Touch Screen + map(0x200002, 0x200003).rw(FUNC(cave_state::ppsatan_touch_r<1>), FUNC(cave_state::ppsatan_eeprom_w)); // Touch Screen + (unused) EEPROM + map(0x200004, 0x200005).rw(FUNC(cave_state::ppsatan_touch_r<0>), FUNC(cave_state::ppsatan_io_mux_w)); // Touch Screen map(0x200006, 0x200007).nopw(); // Lev. 2 IRQ Ack? map(0x2c0000, 0x2c007f).writeonly().share("videoregs.1"); // Video Regs map(0x2c0000, 0x2c0007).r(FUNC(cave_state::irq_cause_r)); // IRQ Cause @@ -936,8 +935,8 @@ void cave_state::ppsatan_map(address_map &map) map(0x480000, 0x480005).ram().share("vctrl.2"); // Layer Control map(0x500000, 0x507fff).ram().w(FUNC(cave_state::vram_w<2>)).share("vram.2"); // Layer // map(0x580000, 0x5803ff).ram() // Palette (Tilemaps) -// map(0x587800, 0x588fff).ram().share("paletteram.2"); // Palette (Sprites) - map(0x580000, 0x588fff).ram().share("paletteram.2"); // Palette +// map(0x587800, 0x588fff).ram().w(m_palette[2], FUNC(palette_device::write16)).share("palette.2"); // Palette (Sprites) + map(0x580000, 0x588fff).ram().w(m_palette[2], FUNC(palette_device::write16)).share("palette.2"); // Palette map(0x5c0000, 0x5c7fff).ram().share("spriteram.2"); // Sprites map(0x6c0000, 0x6c007f).writeonly().share("videoregs.2"); // Video Regs @@ -945,8 +944,8 @@ void cave_state::ppsatan_map(address_map &map) map(0x880000, 0x880005).ram().share("vctrl.0"); // Layer Control map(0x900000, 0x907fff).ram().w(FUNC(cave_state::vram_w<0>)).share("vram.0"); // Layer // map(0x980000, 0x9803ff).ram(); // Palette (Tilemaps) -// map(0x987800, 0x988fff).ram().share("paletteram.0"); // Palette (Sprites) - map(0x980000, 0x988fff).ram().share("paletteram.0"); // Palette +// map(0x987800, 0x988fff).ram().w(m_palette[0], FUNC(palette_device::write16)).share("palette.0"); // Palette (Sprites) + map(0x980000, 0x988fff).ram().w(m_palette[0], FUNC(palette_device::write16)).share("palette.0"); // Palette map(0x9c0000, 0x9c7fff).ram().share("spriteram.0"); // Sprites map(0xac0000, 0xac007f).writeonly().share("videoregs.0"); // Video Regs } @@ -956,15 +955,15 @@ void cave_state::ppsatan_map(address_map &map) Power Instinct 2 ***************************************************************************/ -READ16_MEMBER(cave_state::pwrinst2_eeprom_r) +u16 cave_state::pwrinst2_eeprom_r() { return ~8 + ((m_eeprom->do_read() & 1) ? 8 : 0); } template -WRITE16_MEMBER(cave_state::pwrinst2_vctrl_w) +void cave_state::pwrinst2_vctrl_w(offs_t offset, u16 data, u16 mem_mask) { - uint16_t *VCTRL = m_vctrl[Chip]; + u16 *VCTRL = m_vctrl[Chip]; if (offset == 4 / 2) { switch (data & 0x000f) @@ -981,27 +980,27 @@ WRITE16_MEMBER(cave_state::pwrinst2_vctrl_w) void cave_state::pwrinst2_map(address_map &map) { - map(0x000000, 0x1fffff).rom(); // ROM - map(0x400000, 0x40ffff).ram(); // RAM - map(0x500000, 0x500001).portr("IN0"); // Inputs - map(0x500002, 0x500003).portr("IN1"); // - map(0x600000, 0x6fffff).rom().region("user1", 0); // extra data ROM space - map(0x700000, 0x700000).w(FUNC(cave_state::eeprom_w)); // EEPROM - map(0x800000, 0x807fff).ram().w(FUNC(cave_state::vram_w<2>)).share("vram.2"); // Layer 2 - map(0x880000, 0x887fff).ram().w(FUNC(cave_state::vram_w<0>)).share("vram.0"); // Layer 0 - map(0x900000, 0x907fff).ram().w(FUNC(cave_state::vram_w<1>)).share("vram.1"); // Layer 1 - map(0x980000, 0x987fff).ram().w(FUNC(cave_state::vram_8x8_w<3>)).share("vram.3"); // Layer 3 - map(0xa00000, 0xa0ffff).ram().share("spriteram.0"); // Sprites - map(0xa10000, 0xa1ffff).ram(); // Sprites? - map(0xa80000, 0xa8007f).ram().r(FUNC(cave_state::donpachi_videoregs_r)).share("videoregs.0"); // Video Regs - map(0xb00000, 0xb00005).ram().w(FUNC(cave_state::pwrinst2_vctrl_w<2>)).share("vctrl.2"); // Layer 2 Control - map(0xb80000, 0xb80005).ram().w(FUNC(cave_state::pwrinst2_vctrl_w<0>)).share("vctrl.0"); // Layer 0 Control - map(0xc00000, 0xc00005).ram().w(FUNC(cave_state::pwrinst2_vctrl_w<1>)).share("vctrl.1"); // Layer 1 Control - map(0xc80000, 0xc80005).ram().w(FUNC(cave_state::pwrinst2_vctrl_w<3>)).share("vctrl.3"); // Layer 3 Control - map(0xd80000, 0xd80001).r(FUNC(cave_state::soundlatch_ack_r)); // ? From Sound CPU - map(0xe00000, 0xe00001).w(FUNC(cave_state::sound_cmd_w)); // To Sound CPU - map(0xe80000, 0xe80001).r(FUNC(cave_state::pwrinst2_eeprom_r)); // EEPROM - map(0xf00000, 0xf04fff).ram().share("paletteram.0"); // Palette + map(0x000000, 0x1fffff).rom(); // ROM + map(0x400000, 0x40ffff).ram(); // RAM + map(0x500000, 0x500001).portr("IN0"); // Inputs + map(0x500002, 0x500003).portr("IN1"); // + map(0x600000, 0x6fffff).rom().region("user1", 0); // extra data ROM space + map(0x700000, 0x700000).w(FUNC(cave_state::eeprom_w)); // EEPROM + map(0x800000, 0x807fff).ram().w(FUNC(cave_state::vram_w<2>)).share("vram.2"); // Layer 2 + map(0x880000, 0x887fff).ram().w(FUNC(cave_state::vram_w<0>)).share("vram.0"); // Layer 0 + map(0x900000, 0x907fff).ram().w(FUNC(cave_state::vram_w<1>)).share("vram.1"); // Layer 1 + map(0x980000, 0x987fff).ram().w(FUNC(cave_state::vram_8x8_w<3>)).share("vram.3"); // Layer 3 + map(0xa00000, 0xa0ffff).ram().share("spriteram.0"); // Sprites + map(0xa10000, 0xa1ffff).ram(); // Sprites? + map(0xa80000, 0xa8007f).ram().r(FUNC(cave_state::donpachi_videoregs_r)).share("videoregs.0"); // Video Regs + map(0xb00000, 0xb00005).ram().w(FUNC(cave_state::pwrinst2_vctrl_w<2>)).share("vctrl.2"); // Layer 2 Control + map(0xb80000, 0xb80005).ram().w(FUNC(cave_state::pwrinst2_vctrl_w<0>)).share("vctrl.0"); // Layer 0 Control + map(0xc00000, 0xc00005).ram().w(FUNC(cave_state::pwrinst2_vctrl_w<1>)).share("vctrl.1"); // Layer 1 Control + map(0xc80000, 0xc80005).ram().w(FUNC(cave_state::pwrinst2_vctrl_w<3>)).share("vctrl.3"); // Layer 3 Control + map(0xd80000, 0xd80001).r(FUNC(cave_state::soundlatch_ack_r)); // ? From Sound CPU + map(0xe00000, 0xe00001).w(FUNC(cave_state::sound_cmd_w)); // To Sound CPU + map(0xe80000, 0xe80001).r(FUNC(cave_state::pwrinst2_eeprom_r)); // EEPROM + map(0xf00000, 0xf04fff).ram().w(m_palette[0], FUNC(palette_device::write16)).share("palette.0"); // Palette } @@ -1009,39 +1008,39 @@ void cave_state::pwrinst2_map(address_map &map) Sailor Moon ***************************************************************************/ -READ16_MEMBER(cave_state::sailormn_input0_r) +u16 cave_state::sailormn_input0_r() { // watchdog_reset16_r(0, 0); // written too rarely for mame. - return ioport("IN0")->read(); + return m_io_in0->read(); } void cave_state::sailormn_map(address_map &map) { - map(0x000000, 0x07ffff).rom(); // ROM - map(0x100000, 0x10ffff).ram(); // RAM - map(0x110000, 0x110001).ram(); // (agallet) - map(0x200000, 0x3fffff).rom(); // ROM - map(0x400000, 0x407fff).ram(); // (agallet) - map(0x408000, 0x40bfff).ram().share("paletteram.0"); // Palette - map(0x40c000, 0x40ffff).ram(); // (agallet) - map(0x410000, 0x410001).ram(); // (agallet) - map(0x500000, 0x50ffff).ram().share("spriteram.0"); // Sprites - map(0x510000, 0x510001).ram(); // (agallet) - map(0x600000, 0x600001).r(FUNC(cave_state::sailormn_input0_r)); // Inputs + Watchdog! - map(0x600002, 0x600003).portr("IN1"); // Inputs + EEPROM - map(0x700000, 0x700000).w(FUNC(cave_state::sailormn_eeprom_w)); // EEPROM - map(0x800000, 0x807fff).ram().w(FUNC(cave_state::vram_w<0>)).share("vram.0"); // Layer 0 - map(0x880000, 0x887fff).ram().w(FUNC(cave_state::vram_w<1>)).share("vram.1"); // Layer 1 - map(0x900000, 0x907fff).ram().w(FUNC(cave_state::vram_w<2>)).share("vram.2"); // Layer 2 - map(0x908000, 0x908001).ram(); // (agallet) - map(0xa00000, 0xa00005).ram().share("vctrl.0"); // Layer 0 Control - map(0xa80000, 0xa80005).ram().share("vctrl.1"); // Layer 1 Control - map(0xb00000, 0xb00005).ram().share("vctrl.2"); // Layer 2 Control - map(0xb80000, 0xb8007f).writeonly().share("videoregs.0"); // Video Regs - map(0xb80000, 0xb80007).r(FUNC(cave_state::irq_cause_r)); // IRQ Cause (bit 2 tested!) - map(0xb8006c, 0xb8006d).r(FUNC(cave_state::soundflags_ack_r)); // Communication - map(0xb8006e, 0xb8006f).r(FUNC(cave_state::soundlatch_ack_r)); // From Sound CPU - map(0xb8006e, 0xb8006f).w(FUNC(cave_state::sound_cmd_w)); // To Sound CPU + map(0x000000, 0x07ffff).rom(); // ROM + map(0x100000, 0x10ffff).ram(); // RAM + map(0x110000, 0x110001).ram(); // (agallet) + map(0x200000, 0x3fffff).rom(); // ROM + map(0x400000, 0x407fff).ram(); // (agallet) + map(0x408000, 0x40bfff).ram().w(m_palette[0], FUNC(palette_device::write16)).share("palette.0"); // Palette + map(0x40c000, 0x40ffff).ram(); // (agallet) + map(0x410000, 0x410001).ram(); // (agallet) + map(0x500000, 0x50ffff).ram().share("spriteram.0"); // Sprites + map(0x510000, 0x510001).ram(); // (agallet) + map(0x600000, 0x600001).r(FUNC(cave_state::sailormn_input0_r)); // Inputs + Watchdog! + map(0x600002, 0x600003).portr("IN1"); // Inputs + EEPROM + map(0x700000, 0x700000).w(FUNC(cave_state::sailormn_eeprom_w)); // EEPROM + map(0x800000, 0x807fff).ram().w(FUNC(cave_state::vram_w<0>)).share("vram.0"); // Layer 0 + map(0x880000, 0x887fff).ram().w(FUNC(cave_state::vram_w<1>)).share("vram.1"); // Layer 1 + map(0x900000, 0x907fff).ram().w(FUNC(cave_state::vram_w<2>)).share("vram.2"); // Layer 2 + map(0x908000, 0x908001).ram(); // (agallet) + map(0xa00000, 0xa00005).ram().share("vctrl.0"); // Layer 0 Control + map(0xa80000, 0xa80005).ram().share("vctrl.1"); // Layer 1 Control + map(0xb00000, 0xb00005).ram().share("vctrl.2"); // Layer 2 Control + map(0xb80000, 0xb8007f).writeonly().share("videoregs.0"); // Video Regs + map(0xb80000, 0xb80007).r(FUNC(cave_state::irq_cause_r)); // IRQ Cause (bit 2 tested!) + map(0xb8006c, 0xb8006d).r(FUNC(cave_state::soundflags_ack_r)); // Communication + map(0xb8006e, 0xb8006f).r(FUNC(cave_state::soundlatch_ack_r)); // From Sound CPU + map(0xb8006e, 0xb8006f).w(FUNC(cave_state::sound_cmd_w)); // To Sound CPU } @@ -1051,20 +1050,20 @@ void cave_state::sailormn_map(address_map &map) void cave_state::tekkencw_map(address_map &map) { - map(0x000000, 0x07ffff).rom(); // ROM - map(0x100000, 0x10ffff).ram().share("nvram"); // RAM (battery) - map(0x200000, 0x20ffff).ram().share("spriteram.0"); // Sprites - map(0x300000, 0x307fff).ram().w(FUNC(cave_state::vram_w<0>)).share("vram.0"); // Layer 0 - map(0x400000, 0x400001).portr("IN0"); // Inputs + EEPROM + Hopper - map(0x400002, 0x400003).portr("IN1"); // Inputs - map(0x500000, 0x500005).writeonly().share("vctrl.0"); // Layer 0 Control - map(0x600000, 0x60ffff).ram().share("paletteram.0"); // Palette - map(0x700000, 0x70007f).writeonly().share("videoregs.0"); // Video Regs - map(0x700000, 0x700007).r(FUNC(cave_state::irq_cause_r)); // IRQ Cause - map(0x700068, 0x700069).w("watchdog", FUNC(watchdog_timer_device::reset16_w)); // Watchdog - map(0x800001, 0x800001).rw("oki1", FUNC(okim6295_device::read), FUNC(okim6295_device::write)); // M6295 - map(0xc00001, 0xc00001).w(FUNC(cave_state::tjumpman_leds_w)); // Leds + Hopper - map(0xe00001, 0xe00001).w(FUNC(cave_state::tjumpman_eeprom_w)); // EEPROM + map(0x000000, 0x07ffff).rom(); // ROM + map(0x100000, 0x10ffff).ram().share("nvram"); // RAM (battery) + map(0x200000, 0x20ffff).ram().share("spriteram.0"); // Sprites + map(0x300000, 0x307fff).ram().w(FUNC(cave_state::vram_w<0>)).share("vram.0"); // Layer 0 + map(0x400000, 0x400001).portr("IN0"); // Inputs + EEPROM + Hopper + map(0x400002, 0x400003).portr("IN1"); // Inputs + map(0x500000, 0x500005).writeonly().share("vctrl.0"); // Layer 0 Control + map(0x600000, 0x60ffff).ram().w(m_palette[0], FUNC(palette_device::write16)).share("palette.0"); // Palette + map(0x700000, 0x70007f).writeonly().share("videoregs.0"); // Video Regs + map(0x700000, 0x700007).r(FUNC(cave_state::irq_cause_r)); // IRQ Cause + map(0x700068, 0x700069).w("watchdog", FUNC(watchdog_timer_device::reset16_w)); // Watchdog + map(0x800001, 0x800001).rw("oki1", FUNC(okim6295_device::read), FUNC(okim6295_device::write)); // M6295 + map(0xc00001, 0xc00001).w(FUNC(cave_state::tjumpman_leds_w)); // Leds + Hopper + map(0xe00001, 0xe00001).w(FUNC(cave_state::tjumpman_eeprom_w)); // EEPROM } @@ -1074,20 +1073,20 @@ void cave_state::tekkencw_map(address_map &map) void cave_state::tekkenbs_map(address_map &map) { - map(0x000000, 0x07ffff).rom(); // ROM - map(0x100000, 0x10ffff).ram().share("nvram"); // RAM (battery) - map(0x200000, 0x20ffff).ram().share("spriteram.0"); // Sprites - map(0x300000, 0x307fff).ram().w(FUNC(cave_state::vram_w<0>)).share("vram.0"); // Layer 0 - map(0x400000, 0x40ffff).ram().share("paletteram.0"); // Palette - map(0x500000, 0x500005).writeonly().share("vctrl.0"); // Layer 0 Control - map(0x600000, 0x600001).portr("IN0"); // Inputs + EEPROM + Hopper - map(0x600002, 0x600003).portr("IN1"); // Inputs - map(0x700000, 0x70007f).writeonly().share("videoregs.0"); // Video Regs - map(0x700000, 0x700007).r(FUNC(cave_state::irq_cause_r)); // IRQ Cause - map(0x700068, 0x700069).w("watchdog", FUNC(watchdog_timer_device::reset16_w)); // Watchdog - map(0x800001, 0x800001).rw("oki1", FUNC(okim6295_device::read), FUNC(okim6295_device::write)); // M6295 - map(0xc00001, 0xc00001).w(FUNC(cave_state::tjumpman_leds_w)); // Leds + Hopper - map(0xe00001, 0xe00001).w(FUNC(cave_state::tjumpman_eeprom_w)); // EEPROM + map(0x000000, 0x07ffff).rom(); // ROM + map(0x100000, 0x10ffff).ram().share("nvram"); // RAM (battery) + map(0x200000, 0x20ffff).ram().share("spriteram.0"); // Sprites + map(0x300000, 0x307fff).ram().w(FUNC(cave_state::vram_w<0>)).share("vram.0"); // Layer 0 + map(0x400000, 0x40ffff).ram().w(m_palette[0], FUNC(palette_device::write16)).share("palette.0"); // Palette + map(0x500000, 0x500005).writeonly().share("vctrl.0"); // Layer 0 Control + map(0x600000, 0x600001).portr("IN0"); // Inputs + EEPROM + Hopper + map(0x600002, 0x600003).portr("IN1"); // Inputs + map(0x700000, 0x70007f).writeonly().share("videoregs.0"); // Video Regs + map(0x700000, 0x700007).r(FUNC(cave_state::irq_cause_r)); // IRQ Cause + map(0x700068, 0x700069).w("watchdog", FUNC(watchdog_timer_device::reset16_w)); // Watchdog + map(0x800001, 0x800001).rw("oki1", FUNC(okim6295_device::read), FUNC(okim6295_device::write)); // M6295 + map(0xc00001, 0xc00001).w(FUNC(cave_state::tjumpman_leds_w)); // Leds + Hopper + map(0xe00001, 0xe00001).w(FUNC(cave_state::tjumpman_eeprom_w)); // EEPROM } @@ -1126,26 +1125,26 @@ void cave_state::tjumpman_leds_w(u8 data) CUSTOM_INPUT_MEMBER(cave_state::tjumpman_hopper_r) { - return (m_hopper && !(m_screen->frame_number() % 10)) ? 0 : 1; + return (m_hopper && !(m_screen[0]->frame_number() % 10)) ? 0 : 1; } void cave_state::tjumpman_map(address_map &map) { - map(0x000000, 0x07ffff).rom(); // ROM - map(0x100000, 0x10ffff).ram().share("nvram"); // RAM (battery) - map(0x200000, 0x20ffff).ram().share("spriteram.0"); // Sprites - map(0x300000, 0x307fff).ram().w(FUNC(cave_state::vram_w<0>)).share("vram.0"); // Layer 0 - map(0x304000, 0x307fff).w(FUNC(cave_state::vram_w<0>)); // Layer 0 - 16x16 tiles mapped here - map(0x400000, 0x400005).writeonly().share("vctrl.0"); // Layer 0 Control - map(0x500000, 0x50ffff).ram().share("paletteram.0"); // Palette - map(0x600000, 0x600001).portr("IN0"); // Inputs + EEPROM + Hopper - map(0x600002, 0x600003).portr("IN1"); // Inputs - map(0x700000, 0x70007f).writeonly().share("videoregs.0"); // Video Regs - map(0x700000, 0x700007).r(FUNC(cave_state::irq_cause_r)); // IRQ Cause - map(0x700068, 0x700069).w("watchdog", FUNC(watchdog_timer_device::reset16_w)); // Watchdog - map(0x800001, 0x800001).rw("oki1", FUNC(okim6295_device::read), FUNC(okim6295_device::write)); // M6295 - map(0xc00001, 0xc00001).w(FUNC(cave_state::tjumpman_leds_w)); // Leds + Hopper - map(0xe00001, 0xe00001).w(FUNC(cave_state::tjumpman_eeprom_w)); // EEPROM + map(0x000000, 0x07ffff).rom(); // ROM + map(0x100000, 0x10ffff).ram().share("nvram"); // RAM (battery) + map(0x200000, 0x20ffff).ram().share("spriteram.0"); // Sprites + map(0x300000, 0x307fff).ram().w(FUNC(cave_state::vram_w<0>)).share("vram.0"); // Layer 0 + map(0x304000, 0x307fff).w(FUNC(cave_state::vram_w<0>)); // Layer 0 - 16x16 tiles mapped here + map(0x400000, 0x400005).writeonly().share("vctrl.0"); // Layer 0 Control + map(0x500000, 0x50ffff).ram().w(m_palette[0], FUNC(palette_device::write16)).share("palette.0"); // Palette + map(0x600000, 0x600001).portr("IN0"); // Inputs + EEPROM + Hopper + map(0x600002, 0x600003).portr("IN1"); // Inputs + map(0x700000, 0x70007f).writeonly().share("videoregs.0"); // Video Regs + map(0x700000, 0x700007).r(FUNC(cave_state::irq_cause_r)); // IRQ Cause + map(0x700068, 0x700069).w("watchdog", FUNC(watchdog_timer_device::reset16_w)); // Watchdog + map(0x800001, 0x800001).rw("oki1", FUNC(okim6295_device::read), FUNC(okim6295_device::write)); // M6295 + map(0xc00001, 0xc00001).w(FUNC(cave_state::tjumpman_leds_w)); // Leds + Hopper + map(0xe00001, 0xe00001).w(FUNC(cave_state::tjumpman_eeprom_w)); // EEPROM } @@ -1168,20 +1167,20 @@ void cave_state::pacslot_leds_w(u8 data) void cave_state::pacslot_map(address_map &map) { - map(0x000000, 0x07ffff).rom(); // ROM - map(0x100000, 0x10ffff).ram().share("nvram"); // RAM (battery) - map(0x200000, 0x20ffff).ram().share("spriteram.0"); // Sprites - map(0x300000, 0x307fff).ram().w(FUNC(cave_state::vram_w<0>)).share("vram.0"); // Layer 0 - map(0x400000, 0x40007f).writeonly().share("videoregs.0"); // Video Regs - map(0x400000, 0x400007).r(FUNC(cave_state::irq_cause_r)); // IRQ Cause - map(0x400068, 0x400069).w("watchdog", FUNC(watchdog_timer_device::reset16_w)); // Watchdog - map(0x500000, 0x500005).writeonly().share("vctrl.0"); // Layer 0 Control - map(0x600000, 0x60ffff).ram().share("paletteram.0"); // Palette - map(0x700000, 0x700001).portr("IN0"); // Inputs + EEPROM + Hopper - map(0x700002, 0x700003).portr("IN1"); // Inputs - map(0x800001, 0x800001).rw("oki1", FUNC(okim6295_device::read), FUNC(okim6295_device::write)); // M6295 - map(0xc00001, 0xc00001).w(FUNC(cave_state::pacslot_leds_w)); // Leds + Hopper - map(0xe00001, 0xe00001).w(FUNC(cave_state::tjumpman_eeprom_w)); // EEPROM + map(0x000000, 0x07ffff).rom(); // ROM + map(0x100000, 0x10ffff).ram().share("nvram"); // RAM (battery) + map(0x200000, 0x20ffff).ram().share("spriteram.0"); // Sprites + map(0x300000, 0x307fff).ram().w(FUNC(cave_state::vram_w<0>)).share("vram.0"); // Layer 0 + map(0x400000, 0x40007f).writeonly().share("videoregs.0"); // Video Regs + map(0x400000, 0x400007).r(FUNC(cave_state::irq_cause_r)); // IRQ Cause + map(0x400068, 0x400069).w("watchdog", FUNC(watchdog_timer_device::reset16_w)); // Watchdog + map(0x500000, 0x500005).writeonly().share("vctrl.0"); // Layer 0 Control + map(0x600000, 0x60ffff).ram().w(m_palette[0], FUNC(palette_device::write16)).share("palette.0"); // Palette + map(0x700000, 0x700001).portr("IN0"); // Inputs + EEPROM + Hopper + map(0x700002, 0x700003).portr("IN1"); // Inputs + map(0x800001, 0x800001).rw("oki1", FUNC(okim6295_device::read), FUNC(okim6295_device::write)); // M6295 + map(0xc00001, 0xc00001).w(FUNC(cave_state::pacslot_leds_w)); // Leds + Hopper + map(0xe00001, 0xe00001).w(FUNC(cave_state::tjumpman_eeprom_w)); // EEPROM } @@ -1193,20 +1192,20 @@ void cave_state::pacslot_map(address_map &map) void cave_state::paceight_map(address_map &map) { - map(0x000000, 0x07ffff).rom(); // ROM - map(0x100000, 0x10ffff).ram().share("nvram"); // RAM (battery) - map(0x200000, 0x20ffff).ram().share("spriteram.0"); // Sprites - map(0x300000, 0x307fff).ram().w(FUNC(cave_state::vram_w<0>)).share("vram.0"); // Layer 0 - map(0x400000, 0x40ffff).ram().share("paletteram.0"); // Palette - map(0x500000, 0x500001).portr("IN0"); // Inputs + EEPROM + Hopper - map(0x500002, 0x500003).portr("IN1"); // Inputs - map(0x600000, 0x600005).writeonly().share("vctrl.0"); // Layer 0 Control - map(0x700000, 0x70007f).writeonly().share("videoregs.0"); // Video Regs - map(0x700000, 0x700007).r(FUNC(cave_state::irq_cause_r)); // IRQ Cause - map(0x700068, 0x700069).w("watchdog", FUNC(watchdog_timer_device::reset16_w)); // Watchdog - map(0x800001, 0x800001).rw("oki1", FUNC(okim6295_device::read), FUNC(okim6295_device::write)); // M6295 - map(0xc00000, 0xc00001).w(FUNC(cave_state::pacslot_leds_w)); // Leds + Hopper - map(0xe00001, 0xe00001).w(FUNC(cave_state::tjumpman_eeprom_w)); // EEPROM + map(0x000000, 0x07ffff).rom(); // ROM + map(0x100000, 0x10ffff).ram().share("nvram"); // RAM (battery) + map(0x200000, 0x20ffff).ram().share("spriteram.0"); // Sprites + map(0x300000, 0x307fff).ram().w(FUNC(cave_state::vram_w<0>)).share("vram.0"); // Layer 0 + map(0x400000, 0x40ffff).ram().w(m_palette[0], FUNC(palette_device::write16)).share("palette.0"); // Palette + map(0x500000, 0x500001).portr("IN0"); // Inputs + EEPROM + Hopper + map(0x500002, 0x500003).portr("IN1"); // Inputs + map(0x600000, 0x600005).writeonly().share("vctrl.0"); // Layer 0 Control + map(0x700000, 0x70007f).writeonly().share("videoregs.0"); // Video Regs + map(0x700000, 0x700007).r(FUNC(cave_state::irq_cause_r)); // IRQ Cause + map(0x700068, 0x700069).w("watchdog", FUNC(watchdog_timer_device::reset16_w)); // Watchdog + map(0x800001, 0x800001).rw("oki1", FUNC(okim6295_device::read), FUNC(okim6295_device::write)); // M6295 + map(0xc00000, 0xc00001).w(FUNC(cave_state::pacslot_leds_w)); // Leds + Hopper + map(0xe00001, 0xe00001).w(FUNC(cave_state::tjumpman_eeprom_w)); // EEPROM } /*************************************************************************** @@ -1223,7 +1222,7 @@ void cave_state::uopoko_map(address_map &map) map(0x600000, 0x60007f).writeonly().share("videoregs.0"); // Video Regs map(0x600000, 0x600007).r(FUNC(cave_state::irq_cause_r)); // IRQ Cause map(0x700000, 0x700005).ram().share("vctrl.0"); // Layer 0 Control - map(0x800000, 0x80ffff).ram().share("paletteram.0"); // Palette + map(0x800000, 0x80ffff).ram().w(m_palette[0], FUNC(palette_device::write16)).share("palette.0"); // Palette map(0x900000, 0x900001).portr("IN0"); // Inputs map(0x900002, 0x900003).portr("IN1"); // Inputs + EEPROM map(0xa00000, 0xa00000).w(FUNC(cave_state::eeprom_w)); // EEPROM @@ -1762,6 +1761,8 @@ INPUT_PORTS_END ***************************************************************************/ +// 6bpp tiles are accessible only 0x400 colors + /* 8x8x4 tiles */ static const gfx_layout layout_8x8x4 = { @@ -1830,14 +1831,9 @@ static const gfx_layout layout_sprites = ***************************************************************************/ static GFXDECODE_START( gfx_dfeveron ) - /* There are only $800 colors here, the first half for sprites - the second half for tiles. We use $8000 virtual colors instead - for consistency with games having $8000 real colors. - A palette_init function is thus needed for sprites */ - // "sprites" - GFXDECODE_ENTRY( "layer0", 0, layout_8x8x4, 0x4400, 0x40 ) // [0] Layer 0 - GFXDECODE_ENTRY( "layer1", 0, layout_8x8x4, 0x4400, 0x40 ) // [1] Layer 1 + GFXDECODE_ENTRY( "layer0", 0, layout_8x8x4, 0x0400, 0x40 ) // [0] Layer 0 + GFXDECODE_ENTRY( "layer1", 0, layout_8x8x4, 0x0400, 0x40 ) // [1] Layer 1 GFXDECODE_END /*************************************************************************** @@ -1845,12 +1841,6 @@ GFXDECODE_END ***************************************************************************/ static GFXDECODE_START( gfx_ddonpach ) - /* Layers 01 are 4 bit deep and use the first 16 of every 256 - colors for any given color code (a palette_init function - is provided for these layers, filling the 8000-83ff entries - in the color table). Layer 2 uses the whole 256 for any given - color code and the 4000-7fff range in the color table. */ - // "sprites" GFXDECODE_ENTRY( "layer0", 0, layout_8x8x4, 0x4000, 0x40 ) // [0] Layer 0 GFXDECODE_ENTRY( "layer1", 0, layout_8x8x4, 0x4000, 0x40 ) // [1] Layer 1 @@ -1862,15 +1852,10 @@ GFXDECODE_END ***************************************************************************/ static GFXDECODE_START( gfx_donpachi ) - /* There are only $800 colors here, the first half for sprites - the second half for tiles. We use $8000 virtual colors instead - for consistency with games having $8000 real colors. - A palette_init function is thus needed for sprites */ - // "sprites" - GFXDECODE_ENTRY( "layer0", 0, layout_8x8x4, 0x4400, 0x40 ) // [0] Layer 0 - GFXDECODE_ENTRY( "layer1", 0, layout_8x8x4, 0x4400, 0x40 ) // [1] Layer 1 - GFXDECODE_ENTRY( "layer2", 0, layout_8x8x4, 0x4400, 0x40 ) // [2] Layer 2 + GFXDECODE_ENTRY( "layer0", 0, layout_8x8x4, 0x0400, 0x40 ) // [0] Layer 0 + GFXDECODE_ENTRY( "layer1", 0, layout_8x8x4, 0x0400, 0x40 ) // [1] Layer 1 + GFXDECODE_ENTRY( "layer2", 0, layout_8x8x4, 0x0400, 0x40 ) // [2] Layer 2 GFXDECODE_END /*************************************************************************** @@ -1889,15 +1874,10 @@ GFXDECODE_END ***************************************************************************/ static GFXDECODE_START( gfx_hotdogst ) - /* There are only $800 colors here, the first half for sprites - the second half for tiles. We use $8000 virtual colors instead - for consistency with games having $8000 real colors. - A palette_init function is needed for sprites */ - // "sprites" - GFXDECODE_ENTRY( "layer0", 0, layout_8x8x4, 0x4000, 0x40 ) // [0] Layer 0 - GFXDECODE_ENTRY( "layer1", 0, layout_8x8x4, 0x4000, 0x40 ) // [1] Layer 1 - GFXDECODE_ENTRY( "layer2", 0, layout_8x8x4, 0x4000, 0x40 ) // [2] Layer 2 + GFXDECODE_ENTRY( "layer0", 0, layout_8x8x4, 0x0000, 0x40 ) // [0] Layer 0 + GFXDECODE_ENTRY( "layer1", 0, layout_8x8x4, 0x0000, 0x40 ) // [1] Layer 1 + GFXDECODE_ENTRY( "layer2", 0, layout_8x8x4, 0x0000, 0x40 ) // [2] Layer 2 GFXDECODE_END /*************************************************************************** @@ -1906,7 +1886,7 @@ GFXDECODE_END static GFXDECODE_START( gfx_korokoro ) // "sprites" - GFXDECODE_ENTRY( "layer0", 0, layout_8x8x4, 0x4400, 0x40 ) // [0] Layer 0 + GFXDECODE_ENTRY( "layer0", 0, layout_8x8x4, 0x0400, 0x40 ) // [0] Layer 0 GFXDECODE_END /*************************************************************************** @@ -1914,27 +1894,25 @@ GFXDECODE_END ***************************************************************************/ static GFXDECODE_START( gfx_mazinger ) - /* Sprites are 4 bit deep. - Layer 0 is 4 bit deep. - Layer 1 uses 64 color palettes, but the game only fills the - first 16 colors of each palette, Indeed, the gfx data in ROM - is empty in the top 4 bits. Additionally even if there are - $40 color codes, only $400 colors are addressable. - A palette_init function is thus needed for sprites and layer 0. */ - // "sprites" - GFXDECODE_ENTRY( "layer0", 0, layout_8x8x4, 0x4000, 0x40 ) // [0] Layer 0 - GFXDECODE_ENTRY( "layer1", 0, layout_8x8x6, 0x4400, 0x40 ) // [1] Layer 1 + GFXDECODE_ENTRY( "layer0", 0, layout_8x8x4, 0x0000, 0x40 ) // [0] Layer 0 + GFXDECODE_ENTRY( "layer1", 0, layout_8x8x6, 0x0400, 0x10 ) // [1] Layer 1 GFXDECODE_END /*************************************************************************** Poka Poka Satan ***************************************************************************/ -static GFXDECODE_START( gfx_ppsatan ) - GFXDECODE_ENTRY( "layer0", 0, layout_8x8x4, 0x4000, 0x40 ) // [0] Layer 0 - GFXDECODE_ENTRY( "layer1", 0, layout_8x8x4, 0x4000, 0x40 ) // [1] Layer 1 - GFXDECODE_ENTRY( "layer2", 0, layout_8x8x4, 0x4000, 0x40 ) // [2] Layer 2 +static GFXDECODE_START( gfx_ppsatan_0 ) + GFXDECODE_ENTRY( "layer0", 0, layout_8x8x4, 0x0000, 0x40 ) // [0] Layer 0 +GFXDECODE_END + +static GFXDECODE_START( gfx_ppsatan_1 ) + GFXDECODE_ENTRY( "layer1", 0, layout_8x8x4, 0x0000, 0x40 ) // [1] Layer 1 +GFXDECODE_END + +static GFXDECODE_START( gfx_ppsatan_2 ) + GFXDECODE_ENTRY( "layer2", 0, layout_8x8x4, 0x0000, 0x40 ) // [2] Layer 2 GFXDECODE_END /*************************************************************************** @@ -1943,10 +1921,10 @@ GFXDECODE_END static GFXDECODE_START( gfx_pwrinst2 ) // "sprites" - GFXDECODE_ENTRY( "layer0", 0, layout_8x8x4, 0x0800+0x8000, 0x40 ) // [0] Layer 0 - GFXDECODE_ENTRY( "layer1", 0, layout_8x8x4, 0x1000+0x8000, 0x40 ) // [1] Layer 1 - GFXDECODE_ENTRY( "layer2", 0, layout_8x8x4, 0x1800+0x8000, 0x40 ) // [2] Layer 2 - GFXDECODE_ENTRY( "layer3", 0, layout_8x8x4, 0x2000+0x8000, 0x40 ) // [3] Layer 3 + GFXDECODE_ENTRY( "layer0", 0, layout_8x8x4, 0x0800, 0x40 ) // [0] Layer 0 + GFXDECODE_ENTRY( "layer1", 0, layout_8x8x4, 0x1000, 0x40 ) // [1] Layer 1 + GFXDECODE_ENTRY( "layer2", 0, layout_8x8x4, 0x1800, 0x40 ) // [2] Layer 2 + GFXDECODE_ENTRY( "layer3", 0, layout_8x8x4, 0x2000, 0x40 ) // [3] Layer 3 GFXDECODE_END @@ -1955,11 +1933,10 @@ GFXDECODE_END ***************************************************************************/ static GFXDECODE_START( gfx_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_ENTRY( "layer0", 0, layout_8x8x4, 0x0400, 0x40 ) // [0] Layer 0 + GFXDECODE_ENTRY( "layer1", 0, layout_8x8x4, 0x0800, 0x40 ) // [1] Layer 1 + GFXDECODE_ENTRY( "layer2", 0, layout_8x8x6_2, 0x0c00, 0x10 ) // [2] Layer 2 GFXDECODE_END @@ -2013,18 +1990,18 @@ void cave_state::machine_reset() void cave_state::add_base_config(machine_config &config) { M68000(config, m_maincpu, 16_MHz_XTAL); - m_maincpu->set_vblank_int("screen", FUNC(cave_state::interrupt)); + m_maincpu->set_vblank_int("screen.0", FUNC(cave_state::interrupt)); TIMER(config, m_int_timer).configure_generic(FUNC(cave_state::vblank_start)); - SCREEN(config, m_screen, SCREEN_TYPE_RASTER); - m_screen->set_refresh_hz(15625/271.5); - m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0)); - m_screen->set_size(320, 240); - m_screen->set_visarea(0, 320-1, 0, 240-1); - m_screen->set_screen_update(FUNC(cave_state::screen_update)); + SCREEN(config, m_screen[0], SCREEN_TYPE_RASTER); + m_screen[0]->set_refresh_hz(15625/271.5); + m_screen[0]->set_vblank_time(ATTOSECONDS_IN_USEC(0)); + m_screen[0]->set_size(320, 240); + m_screen[0]->set_visarea(0, 320-1, 0, 240-1); + m_screen[0]->set_screen_update(FUNC(cave_state::screen_update)); - PALETTE(config, m_palette, FUNC(cave_state::cave_palette), 0x8000); + PALETTE(config, m_palette[0], palette_device::BLACK).set_format(palette_device::xGRB_555, 0x8000); } void cave_state::add_ymz(machine_config &config) @@ -2050,10 +2027,10 @@ void cave_state::dfeveron(machine_config &config) EEPROM_93C46_16BIT(config, m_eeprom); /* video hardware */ - GFXDECODE(config, m_gfxdecode, m_palette, gfx_dfeveron); - m_palette->set_init(FUNC(cave_state::dfeveron_palette)); // $8000 palette entries for consistency with the other games + GFXDECODE(config, m_gfxdecode[0], m_palette[0], gfx_dfeveron); + m_palette[0]->set_entries(0x1000/2); - MCFG_VIDEO_START_OVERRIDE(cave_state,cave_2_layers) + MCFG_VIDEO_START_OVERRIDE(cave_state,dfeveron) /* sound hardware */ add_ymz(config); @@ -2074,9 +2051,9 @@ void cave_state::ddonpach(machine_config &config) EEPROM_93C46_16BIT(config, m_eeprom); /* video hardware */ - GFXDECODE(config, m_gfxdecode, m_palette, gfx_ddonpach); + GFXDECODE(config, m_gfxdecode[0], m_palette[0], gfx_ddonpach); - MCFG_VIDEO_START_OVERRIDE(cave_state,cave_3_layers) + MCFG_VIDEO_START_OVERRIDE(cave_state,ddonpach) /* sound hardware */ add_ymz(config); @@ -2097,10 +2074,10 @@ void cave_state::donpachi(machine_config &config) EEPROM_93C46_16BIT(config, m_eeprom); /* video hardware */ - GFXDECODE(config, m_gfxdecode, m_palette, gfx_donpachi); - m_palette->set_init(FUNC(cave_state::dfeveron_palette)); // $8000 palette entries for consistency with the other games + GFXDECODE(config, m_gfxdecode[0], m_palette[0], gfx_donpachi); + m_palette[0]->set_entries(0x1000/2); - MCFG_VIDEO_START_OVERRIDE(cave_state,cave_3_layers) + MCFG_VIDEO_START_OVERRIDE(cave_state,donpachi) /* sound hardware */ SPEAKER(config, "mono").front_center(); @@ -2132,9 +2109,9 @@ void cave_state::esprade(machine_config &config) EEPROM_93C46_16BIT(config, m_eeprom); /* video hardware */ - GFXDECODE(config, m_gfxdecode, m_palette, gfx_esprade); + GFXDECODE(config, m_gfxdecode[0], m_palette[0], gfx_esprade); - MCFG_VIDEO_START_OVERRIDE(cave_state,cave_3_layers) + MCFG_VIDEO_START_OVERRIDE(cave_state,ddonpach) /* sound hardware */ add_ymz(config); @@ -2155,11 +2132,11 @@ void cave_state::gaia(machine_config &config) WATCHDOG_TIMER(config, "watchdog"); /* video hardware */ - m_screen->set_visarea(0, 320-1, 0, 224-1); + m_screen[0]->set_visarea(0, 320-1, 0, 224-1); - GFXDECODE(config, m_gfxdecode, m_palette, gfx_esprade); + GFXDECODE(config, m_gfxdecode[0], m_palette[0], gfx_esprade); - MCFG_VIDEO_START_OVERRIDE(cave_state,cave_3_layers) + MCFG_VIDEO_START_OVERRIDE(cave_state,ddonpach) /* sound hardware */ add_ymz(config); @@ -2180,9 +2157,9 @@ void cave_state::guwange(machine_config &config) EEPROM_93C46_16BIT(config, m_eeprom); /* video hardware */ - GFXDECODE(config, m_gfxdecode, m_palette, gfx_esprade); + GFXDECODE(config, m_gfxdecode[0], m_palette[0], gfx_esprade); - MCFG_VIDEO_START_OVERRIDE(cave_state,cave_3_layers) + MCFG_VIDEO_START_OVERRIDE(cave_state,ddonpach) /* sound hardware */ add_ymz(config); @@ -2207,13 +2184,13 @@ void cave_state::hotdogst(machine_config &config) EEPROM_93C46_16BIT(config, m_eeprom); /* video hardware */ - m_screen->set_size(384, 240); - m_screen->set_visarea(0, 384-1, 0, 240-1); + m_screen[0]->set_size(384, 240); + m_screen[0]->set_visarea(0, 384-1, 0, 240-1); - GFXDECODE(config, m_gfxdecode, m_palette, gfx_hotdogst); - m_palette->set_init(FUNC(cave_state::dfeveron_palette)); // $8000 palette entries for consistency with the other games + GFXDECODE(config, m_gfxdecode[0], m_palette[0], gfx_hotdogst); + m_palette[0]->set_entries(0x1000/2); - MCFG_VIDEO_START_OVERRIDE(cave_state,cave_3_layers) + MCFG_VIDEO_START_OVERRIDE(cave_state,donpachi) /* sound hardware */ SPEAKER(config, "mono").front_center(); @@ -2248,12 +2225,12 @@ void cave_state::korokoro(machine_config &config) EEPROM_93C46_16BIT(config, m_eeprom); /* video hardware */ - m_screen->set_visarea(0, 320-1-2, 0, 240-1-1); + m_screen[0]->set_visarea(0, 320-1-2, 0, 240-1-1); - GFXDECODE(config, m_gfxdecode, m_palette, gfx_korokoro); - m_palette->set_init(FUNC(cave_state::korokoro_palette)); // $8000 palette entries for consistency with the other games + GFXDECODE(config, m_gfxdecode[0], m_palette[0], gfx_korokoro); + m_palette[0]->set_entries(0x8000/2); - MCFG_VIDEO_START_OVERRIDE(cave_state,cave_1_layer) + MCFG_VIDEO_START_OVERRIDE(cave_state,korokoro) /* sound hardware */ add_ymz(config); @@ -2286,13 +2263,13 @@ void cave_state::mazinger(machine_config &config) EEPROM_93C46_16BIT(config, m_eeprom); /* video hardware */ - m_screen->set_size(384, 240); - m_screen->set_visarea(0, 384-1, 0, 240-1); + m_screen[0]->set_size(384, 240); + m_screen[0]->set_visarea(0, 384-1, 0, 240-1); - GFXDECODE(config, m_gfxdecode, m_palette, gfx_mazinger); - m_palette->set_init(FUNC(cave_state::mazinger_palette)); // $8000 palette entries for consistency with the other games + GFXDECODE(config, m_gfxdecode[0], m_palette[0], gfx_mazinger); + m_palette[0]->set_entries(0x8000/2); - MCFG_VIDEO_START_OVERRIDE(cave_state,cave_2_layers) + MCFG_VIDEO_START_OVERRIDE(cave_state,dfeveron) /* sound hardware */ SPEAKER(config, "mono").front_center(); @@ -2334,13 +2311,13 @@ void cave_state::metmqstr(machine_config &config) EEPROM_93C46_16BIT(config, m_eeprom); /* video hardware */ - m_screen->set_size(0x200, 240); - m_screen->set_visarea(0x7d, 0x7d + 0x180-1, 0, 240-1); + m_screen[0]->set_size(0x200, 240); + m_screen[0]->set_visarea(0x7d, 0x7d + 0x180-1, 0, 240-1); - GFXDECODE(config, m_gfxdecode, m_palette, gfx_donpachi); - m_palette->set_init(FUNC(cave_state::dfeveron_palette)); // $8000 palette entries for consistency with the other games + GFXDECODE(config, m_gfxdecode[0], m_palette[0], gfx_donpachi); + m_palette[0]->set_entries(0x1000/2); - MCFG_VIDEO_START_OVERRIDE(cave_state,cave_3_layers) + MCFG_VIDEO_START_OVERRIDE(cave_state,donpachi) /* sound hardware */ SPEAKER(config, "mono").front_center(); @@ -2381,12 +2358,12 @@ void cave_state::pacslot(machine_config &config) EEPROM_93C46_16BIT(config, m_eeprom, eeprom_serial_streaming::ENABLE); /* video hardware */ - m_screen->set_size(0x200, 240); - m_screen->set_visarea(0x80, 0x80 + 0x140-1, 0, 240-1); + m_screen[0]->set_size(0x200, 240); + m_screen[0]->set_visarea(0x80, 0x80 + 0x140-1, 0, 240-1); - GFXDECODE(config, m_gfxdecode, m_palette, gfx_uopoko); + GFXDECODE(config, m_gfxdecode[0], m_palette[0], gfx_uopoko); - MCFG_VIDEO_START_OVERRIDE(cave_state,cave_1_layer) + MCFG_VIDEO_START_OVERRIDE(cave_state,uopoko) /* sound hardware */ SPEAKER(config, "lspeaker").front_left(); @@ -2422,7 +2399,7 @@ void cave_state::ppsatan(machine_config &config) add_base_config(config); /* basic machine hardware */ - m_maincpu->set_vblank_int("screen", FUNC(cave_state::interrupt_ppsatan)); + m_maincpu->set_vblank_int("screen.0", FUNC(cave_state::interrupt_ppsatan)); m_maincpu->set_addrmap(AS_PROGRAM, &cave_state::ppsatan_map); WATCHDOG_TIMER(config, "watchdog").set_time(attotime::from_seconds(1)); /* a guess, and certainly wrong */ @@ -2432,33 +2409,37 @@ void cave_state::ppsatan(machine_config &config) TIMER(config, "timer_lev2").configure_periodic(FUNC(cave_state::timer_lev2_cb), attotime::from_hz(60)); /* video hardware */ - m_screen->set_visarea(0, 320-1, 0, 224-1); - m_screen->set_screen_update(FUNC(cave_state::screen_update_ppsatan_top)); + m_screen[0]->set_visarea(0, 320-1, 0, 224-1); + m_screen[0]->set_screen_update(FUNC(cave_state::screen_update_ppsatan_top)); subdevice("int_timer")->configure_generic(FUNC(cave_state::vblank_start)); - screen_device &screen_left(SCREEN(config, "screen_left", SCREEN_TYPE_RASTER)); - screen_left.set_refresh_hz(15625/271.5); - screen_left.set_vblank_time(ATTOSECONDS_IN_USEC(0)); - screen_left.set_size(320, 240); - screen_left.set_visarea(0, 320-1, 0, 224-1); - screen_left.set_screen_update(FUNC(cave_state::screen_update_ppsatan_left)); + SCREEN(config, m_screen[1], SCREEN_TYPE_RASTER); + m_screen[1]->set_refresh_hz(15625/271.5); + m_screen[1]->set_vblank_time(ATTOSECONDS_IN_USEC(0)); + m_screen[1]->set_size(320, 240); + m_screen[1]->set_visarea(0, 320-1, 0, 224-1); + m_screen[1]->set_screen_update(FUNC(cave_state::screen_update_ppsatan_left)); TIMER(config, "int_timer_left").configure_generic(FUNC(cave_state::vblank_start_left)); - screen_device &screen_right(SCREEN(config, "screen_right", SCREEN_TYPE_RASTER)); - screen_right.set_refresh_hz(15625/271.5); - screen_right.set_vblank_time(ATTOSECONDS_IN_USEC(0)); - screen_right.set_size(320, 240); - screen_right.set_visarea(0, 320-1, 0, 224-1); - screen_right.set_screen_update(FUNC(cave_state::screen_update_ppsatan_right)); + SCREEN(config, m_screen[2], SCREEN_TYPE_RASTER); + m_screen[2]->set_refresh_hz(15625/271.5); + m_screen[2]->set_vblank_time(ATTOSECONDS_IN_USEC(0)); + m_screen[2]->set_size(320, 240); + m_screen[2]->set_visarea(0, 320-1, 0, 224-1); + m_screen[2]->set_screen_update(FUNC(cave_state::screen_update_ppsatan_right)); TIMER(config, "int_timer_right").configure_generic(FUNC(cave_state::vblank_start_right)); - GFXDECODE(config, m_gfxdecode, m_palette, gfx_ppsatan); + GFXDECODE(config, m_gfxdecode[0], m_palette[0], gfx_ppsatan_0); + GFXDECODE(config, m_gfxdecode[1], m_palette[1], gfx_ppsatan_1); + GFXDECODE(config, m_gfxdecode[2], m_palette[2], gfx_ppsatan_2); - m_palette->set_init(FUNC(cave_state::ppsatan_palette)); + m_palette[0]->set_entries(0x9000/2); + PALETTE(config, m_palette[1], palette_device::BLACK).set_format(palette_device::xGRB_555, 0x9000/2); + PALETTE(config, m_palette[2], palette_device::BLACK).set_format(palette_device::xGRB_555, 0x9000/2); config.set_default_layout(layout_ppsatan); - MCFG_VIDEO_START_OVERRIDE(cave_state,cave_3_layers) + MCFG_VIDEO_START_OVERRIDE(cave_state,ppsatan) /* sound hardware */ SPEAKER(config, "lspeaker").front_left(); @@ -2490,14 +2471,13 @@ void cave_state::pwrinst2(machine_config &config) EEPROM_93C46_16BIT(config, m_eeprom); /* video hardware */ - m_screen->set_size(0x200, 240); - m_screen->set_visarea(0x70, 0x70 + 0x140-1, 0, 240-1); + m_screen[0]->set_size(0x200, 240); + m_screen[0]->set_visarea(0x70, 0x70 + 0x140-1, 0, 240-1); - GFXDECODE(config, m_gfxdecode, m_palette, gfx_pwrinst2); - m_palette->set_entries(0x8000+0x2800); - m_palette->set_init(FUNC(cave_state::pwrinst2_palette)); + GFXDECODE(config, m_gfxdecode[0], m_palette[0], gfx_pwrinst2); + m_palette[0]->set_entries(0x5000/2); - MCFG_VIDEO_START_OVERRIDE(cave_state,cave_4_layers) + MCFG_VIDEO_START_OVERRIDE(cave_state,pwrinst2) /* sound hardware */ SPEAKER(config, "mono").front_center(); @@ -2559,13 +2539,13 @@ void cave_state::sailormn(machine_config &config) EEPROM_93C46_16BIT(config, m_eeprom); /* video hardware */ - m_screen->set_size(320+1, 240); - m_screen->set_visarea(0+1, 320+1-1, 0, 240-1); + m_screen[0]->set_size(320+1, 240); + m_screen[0]->set_visarea(0+1, 320+1-1, 0, 240-1); - GFXDECODE(config, m_gfxdecode, m_palette, gfx_sailormn); // 4 bit sprites, 6 bit tiles - m_palette->set_init(FUNC(cave_state::sailormn_palette)); // $8000 palette entries for consistency with the other games + GFXDECODE(config, m_gfxdecode[0], m_palette[0], gfx_sailormn); // 4 bit sprites, 6 bit tiles + m_palette[0]->set_entries(0x4000/2); - MCFG_VIDEO_START_OVERRIDE(cave_state,sailormn_3_layers) /* Layer 2 has 1 banked ROM */ + MCFG_VIDEO_START_OVERRIDE(cave_state,sailormn) /* Layer 2 has 1 banked ROM */ /* sound hardware */ SPEAKER(config, "mono").front_center(); @@ -2608,12 +2588,12 @@ void cave_state::tekkencw(machine_config &config) EEPROM_93C46_16BIT(config, m_eeprom, eeprom_serial_streaming::ENABLE); /* video hardware */ - m_screen->set_size(0x200, 240); - m_screen->set_visarea(0x80, 0x80 + 0x140-1, 0, 240-1); + m_screen[0]->set_size(0x200, 240); + m_screen[0]->set_visarea(0x80, 0x80 + 0x140-1, 0, 240-1); - GFXDECODE(config, m_gfxdecode, m_palette, gfx_uopoko); + GFXDECODE(config, m_gfxdecode[0], m_palette[0], gfx_uopoko); - MCFG_VIDEO_START_OVERRIDE(cave_state,cave_1_layer) + MCFG_VIDEO_START_OVERRIDE(cave_state,uopoko) /* sound hardware */ SPEAKER(config, "lspeaker").front_left(); @@ -2652,12 +2632,12 @@ void cave_state::tjumpman(machine_config &config) EEPROM_93C46_16BIT(config, m_eeprom, eeprom_serial_streaming::ENABLE); /* video hardware */ - m_screen->set_size(0x200, 240); - m_screen->set_visarea(0x80, 0x80 + 0x140-1, 0, 240-1); + m_screen[0]->set_size(0x200, 240); + m_screen[0]->set_visarea(0x80, 0x80 + 0x140-1, 0, 240-1); - GFXDECODE(config, m_gfxdecode, m_palette, gfx_uopoko); + GFXDECODE(config, m_gfxdecode[0], m_palette[0], gfx_uopoko); - MCFG_VIDEO_START_OVERRIDE(cave_state,cave_1_layer) + MCFG_VIDEO_START_OVERRIDE(cave_state,uopoko) /* sound hardware */ SPEAKER(config, "lspeaker").front_left(); @@ -2685,9 +2665,9 @@ void cave_state::uopoko(machine_config &config) EEPROM_93C46_16BIT(config, m_eeprom); /* video hardware */ - GFXDECODE(config, m_gfxdecode, m_palette, gfx_uopoko); + GFXDECODE(config, m_gfxdecode[0], m_palette[0], gfx_uopoko); - MCFG_VIDEO_START_OVERRIDE(cave_state,cave_1_layer) + MCFG_VIDEO_START_OVERRIDE(cave_state,uopoko) /* sound hardware */ add_ymz(config); @@ -2705,14 +2685,14 @@ void cave_state::uopoko(machine_config &config) /* 4 bits -> 8 bits. Even and odd pixels are swapped */ void cave_state::unpack_sprites(int chip) { - 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; + const u32 len = m_spriteregion[chip]->bytes(); + u8 *rgn = m_spriteregion[chip]->base(); + u8 *src = rgn + len / 2 - 1; + u8 *dst = rgn + len - 1; - while(dst > src) + while (dst > src) { - uint8_t data = *src--; + const u8 data = *src--; /* swap even and odd pixels */ *dst-- = data >> 4; *dst-- = data & 0xF; } @@ -2722,14 +2702,14 @@ void cave_state::unpack_sprites(int chip) /* 4 bits -> 8 bits. Even and odd pixels are not swapped */ void cave_state::ddp_unpack_sprites(int chip) { - 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; + const u32 len = m_spriteregion[chip]->bytes(); + u8 *rgn = m_spriteregion[chip]->base(); + u8 *src = rgn + len / 2 - 1; + u8 *dst = rgn + len - 1; - while(dst > src) + while (dst > src) { - uint8_t data = *src--; + const u8 data = *src--; *dst-- = data & 0xf; *dst-- = data >> 4; } } @@ -2738,16 +2718,16 @@ void cave_state::ddp_unpack_sprites(int chip) /* 2 pages of 4 bits -> 8 bits */ void cave_state::esprade_unpack_sprites(int chip) { - uint8_t *src = m_spriteregion[chip]->base(); - uint8_t *dst = src + m_spriteregion[chip]->bytes(); + u8 *src = m_spriteregion[chip]->base(); + u8 *dst = src + m_spriteregion[chip]->bytes(); - while(src < dst) + while (src < dst) { - uint8_t data1 = src[0]; - uint8_t data2 = src[1]; + const u8 data1 = src[0]; + const u8 data2 = src[1]; - src[0] = ((data1 & 0x0f)<<4) + (data2 & 0x0f); - src[1] = (data1 & 0xf0) + ((data2 & 0xf0)>>4); + src[0] = ((data1 & 0x0f) << 4) + (data2 & 0x0f); + src[1] = (data1 & 0xf0) + ((data2 & 0xf0) >> 4); src += 2; } @@ -3472,7 +3452,7 @@ ROM_START( gaia ) ROM_LOAD16_BYTE( "prg1.127", 0x000000, 0x080000, CRC(47b904b2) SHA1(58b9b55f59cf00f70b690a0371096e86f4d723c2) ) ROM_LOAD16_BYTE( "prg2.128", 0x000001, 0x080000, CRC(469b7794) SHA1(502f855c51005a866900b19c3a0a170d9ea02392) ) - ROM_REGION( 0x1000000, "sprites0", 0 ) /* Sprites */ + ROM_REGION( 0x800000 * 2, "sprites0", 0 ) /* Sprites */ ROM_LOAD( "obj1.736", 0x000000, 0x400000, CRC(f4f84e5d) SHA1(8f445dd7a5c8a996939c211e5aec5742121a6e7e) ) ROM_LOAD( "obj2.738", 0x400000, 0x400000, CRC(15c2a9ce) SHA1(631eb2968395be86ef2403733e7d4ec769a013b9) ) @@ -3534,7 +3514,7 @@ ROM_START( theroes ) ROM_LOAD16_BYTE( "t-hero-epm1.u0127", 0x000000, 0x080000, CRC(09db7195) SHA1(6aa5aa80e3b74e405ed8f1b9b801ce4367756986) ) ROM_LOAD16_BYTE( "t-hero-epm0.u0129", 0x000001, 0x080000, CRC(2d4e3310) SHA1(7c3284a2adc7943db50933a209d037422f87f80b) ) - ROM_REGION( 0x1000000, "sprites0", 0 ) /* Sprites */ + ROM_REGION( 0x800000 * 2, "sprites0", 0 ) /* Sprites */ ROM_LOAD( "t-hero-obj1.u0736", 0x000000, 0x400000, CRC(35090f7c) SHA1(035e6c12a87d9c7241eea34fc7e2170bec842acc) ) ROM_LOAD( "t-hero-obj2.u0738", 0x400000, 0x400000, CRC(71605108) SHA1(6070c26d8f22fafc81d97cacfef96ae652e355d0) ) @@ -4863,14 +4843,14 @@ ROM_END Expand the 2 bit part into a 4 bit layout, so we can decode it */ void cave_state::sailormn_unpack_tiles(int chip) { - 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; + const u32 len= m_tileregion[chip]->bytes(); + u8 *rgn = m_tileregion[chip]->base(); + u8 *src = rgn + (len/4)*3 - 1; + u8 *dst = rgn + (len/4)*4 - 2; - while(src <= dst) + while (src <= dst) { - uint8_t data = src[0]; + u8 data = src[0]; dst[0] = ((data & 0x03) << 4) + ((data & 0x0c) >> 2); dst[1] = ((data & 0x30) >> 0) + ((data & 0xc0) >> 6); @@ -4891,15 +4871,15 @@ void cave_state::init_cave() void cave_state::init_z80_bank() { - uint8_t *ROM = m_z80region->base(); - uint32_t max = m_z80region->bytes() / 0x4000; + u8 *ROM = m_z80region->base(); + u32 max = m_z80region->bytes() / 0x4000; m_z80bank->configure_entries(0, max, &ROM[0x00000], 0x4000); } void cave_state::init_oki_bank(int chip) { - uint8_t *ROM = m_okiregion[chip]->base(); - uint32_t max = m_okiregion[chip]->bytes() / 0x20000; + u8 *ROM = m_okiregion[chip]->base(); + u32 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); } @@ -4942,8 +4922,8 @@ void cave_state::init_ddonpach() m_time_vblank_irq = 90; /* 4bpp but Only first 16 colors are used in palette index for Layer 0, 1. */ - m_gfxdecode->gfx(0)->set_granularity(256); - m_gfxdecode->gfx(1)->set_granularity(256); + m_gfxdecode[0]->gfx(0)->set_granularity(256); + m_gfxdecode[0]->gfx(1)->set_granularity(256); } void cave_state::init_donpachi() @@ -4964,7 +4944,7 @@ void cave_state::init_esprade() #if 0 //ROM PATCH { - uint16_t *rom = (uint16_t *)memregion("maincpu")->base(); + u16 *rom = (u16 *)memregion("maincpu")->base(); rom[0x118A/2] = 0x4e71; //palette fix 118A: 5548 SUBQ.W #2,A0 --> NOP } #endif @@ -5003,7 +4983,7 @@ void cave_state::init_hotdogst() void cave_state::init_mazinger() { - uint8_t *src = memregion("sprites0")->base(); + u8 *src = memregion("sprites0")->base(); int len = memregion("sprites0")->bytes(); init_cave(); @@ -5012,7 +4992,7 @@ void cave_state::init_mazinger() init_oki_bank(0); /* decrypt sprites */ - std::vector buffer(len); + std::vector buffer(len); { for (int 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)]; @@ -5056,14 +5036,14 @@ void cave_state::init_ppsatan() void cave_state::init_pwrinst2j() { - uint8_t *src = memregion("sprites0")->base(); + u8 *src = memregion("sprites0")->base(); int len = memregion("sprites0")->bytes(); init_cave(); init_z80_bank(); - std::vector buffer(len); + std::vector buffer(len); { for(int i = 0; i < len/2; i++) { @@ -5090,7 +5070,7 @@ void cave_state::init_pwrinst2() #if 1 //ROM PATCH { - uint16_t *rom = (uint16_t *)memregion("maincpu")->base(); + u16 *rom = (u16 *)memregion("maincpu")->base(); rom[0xd46c / 2] = 0xd482; // kurara dash fix 0xd400 -> 0xd482 } #endif @@ -5099,7 +5079,7 @@ void cave_state::init_pwrinst2() void cave_state::init_sailormn() { - uint8_t *src = memregion("sprites0")->base(); + u8 *src = memregion("sprites0")->base(); int len = memregion("sprites0")->bytes(); init_cave(); @@ -5109,7 +5089,7 @@ void cave_state::init_sailormn() init_oki_bank(1); /* decrypt sprites */ - std::vector buffer(len); + std::vector buffer(len); { for (int 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)]; diff --git a/src/mame/includes/cave.h b/src/mame/includes/cave.h index 6b11383cdf3..8aa51958f2a 100644 --- a/src/mame/includes/cave.h +++ b/src/mame/includes/cave.h @@ -27,7 +27,9 @@ public: , m_vram(*this, "vram.%u", 0) , m_vctrl(*this, "vctrl.%u", 0) , m_spriteram(*this, "spriteram.%u", 0) - , m_paletteram(*this, "paletteram.%u", 0) + , m_io_in0(*this, "IN0") + , m_touch_x(*this, "TOUCH%u_X", 1U) + , m_touch_y(*this, "TOUCH%u_Y", 1U) , m_spriteregion(*this, "sprites%u", 0) , m_tileregion(*this, "layer%u", 0) , m_okiregion(*this, "oki%u", 1) @@ -42,9 +44,9 @@ public: , m_int_timer_left(*this, "int_timer_left") , m_int_timer_right(*this, "int_timer_right") , m_eeprom(*this, "eeprom") - , m_gfxdecode(*this, "gfxdecode") - , m_screen(*this, "screen") - , m_palette(*this, "palette") + , m_gfxdecode(*this, "gfxdecode.%u", 0U) + , m_screen(*this, "screen.%u", 0U) + , m_palette(*this, "palette.%u", 0U) , m_soundlatch(*this, "soundlatch") , m_startup(*this, "startup") , m_led_outputs(*this, "led%u", 0U) @@ -105,46 +107,47 @@ private: u16 irq_cause_r(offs_t offset); u8 soundflags_r(); - DECLARE_READ16_MEMBER(soundflags_ack_r); - DECLARE_WRITE16_MEMBER(sound_cmd_w); - DECLARE_READ8_MEMBER(soundlatch_lo_r); - DECLARE_READ8_MEMBER(soundlatch_hi_r); - DECLARE_READ16_MEMBER(soundlatch_ack_r); - DECLARE_WRITE8_MEMBER(soundlatch_ack_w); + u16 soundflags_ack_r(); + void sound_cmd_w(u16 data); + u8 soundlatch_lo_r(); + u8 soundlatch_hi_r(); + u16 soundlatch_ack_r(); + void soundlatch_ack_w(u8 data); void gaia_coin_w(u8 data); - DECLARE_READ16_MEMBER(donpachi_videoregs_r); - DECLARE_WRITE16_MEMBER(korokoro_leds_w); - template DECLARE_WRITE16_MEMBER(pwrinst2_vctrl_w); - DECLARE_READ16_MEMBER(sailormn_input0_r); + u16 donpachi_videoregs_r(offs_t offset); + void korokoro_leds_w(offs_t offset, u16 data, u16 mem_mask); + template void pwrinst2_vctrl_w(offs_t offset, u16 data, u16 mem_mask); + u16 sailormn_input0_r(); void tjumpman_leds_w(u8 data); void pacslot_leds_w(u8 data); template void z80_rombank_w(u8 data); template void oki1_bank_w(u8 data); template void oki2_bank_w(u8 data); - template DECLARE_WRITE16_MEMBER(vram_w); - template DECLARE_WRITE16_MEMBER(vram_8x8_w); + template void vram_w(offs_t offset, u16 data, u16 mem_mask); + template void vram_8x8_w(offs_t offset, u16 data, u16 mem_mask); void eeprom_w(u8 data); void sailormn_eeprom_w(u8 data); void hotdogst_eeprom_w(u8 data); void guwange_eeprom_w(u8 data); void metmqstr_eeprom_w(u8 data); - void korokoro_eeprom_w(offs_t offset, uint16_t data, uint16_t mem_mask); - DECLARE_READ16_MEMBER(pwrinst2_eeprom_r); + void korokoro_eeprom_w(offs_t offset, u16 data, u16 mem_mask); + u16 pwrinst2_eeprom_r(); void tjumpman_eeprom_w(u8 data); - void ppsatan_eeprom_w(offs_t offset, uint16_t data, uint16_t mem_mask); - DECLARE_WRITE16_MEMBER(ppsatan_io_mux_w); - DECLARE_READ16_MEMBER(ppsatan_touch1_r); - DECLARE_READ16_MEMBER(ppsatan_touch2_r); - DECLARE_WRITE16_MEMBER(ppsatan_out_w); - uint16_t ppsatan_touch_r(int player); + void ppsatan_eeprom_w(offs_t offset, u16 data, u16 mem_mask); + void ppsatan_io_mux_w(offs_t offset, u16 data, u16 mem_mask); + template u16 ppsatan_touch_r(); + void ppsatan_out_w(offs_t offset, u16 data, u16 mem_mask); TILE_GET_INFO_MEMBER(sailormn_get_tile_info_2); - template TILE_GET_INFO_MEMBER(get_tile_info); + template TILE_GET_INFO_MEMBER(get_tile_info); DECLARE_MACHINE_RESET(sailormn); - DECLARE_VIDEO_START(cave_1_layer); - DECLARE_VIDEO_START(cave_2_layers); - DECLARE_VIDEO_START(cave_3_layers); - DECLARE_VIDEO_START(cave_4_layers); - DECLARE_VIDEO_START(sailormn_3_layers); + DECLARE_VIDEO_START(ddonpach); + DECLARE_VIDEO_START(dfeveron); + DECLARE_VIDEO_START(donpachi); + DECLARE_VIDEO_START(korokoro); + DECLARE_VIDEO_START(ppsatan); + DECLARE_VIDEO_START(pwrinst2); + DECLARE_VIDEO_START(sailormn); + DECLARE_VIDEO_START(uopoko); void cave_palette(palette_device &palette); void dfeveron_palette(palette_device &palette); void korokoro_palette(palette_device &palette); @@ -152,11 +155,11 @@ private: void pwrinst2_palette(palette_device &palette); void sailormn_palette(palette_device &palette); void ppsatan_palette(palette_device &palette); - uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); - uint32_t screen_update_ppsatan_core (screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, int chip); - uint32_t screen_update_ppsatan_top (screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); - uint32_t screen_update_ppsatan_left (screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); - uint32_t screen_update_ppsatan_right(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); + u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); + u32 screen_update_ppsatan_core (screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, int chip); + u32 screen_update_ppsatan_top (screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); + u32 screen_update_ppsatan_left (screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); + u32 screen_update_ppsatan_right(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); INTERRUPT_GEN_MEMBER(interrupt); INTERRUPT_GEN_MEMBER(interrupt_ppsatan); TIMER_CALLBACK_MEMBER(vblank_end); @@ -178,11 +181,14 @@ private: virtual void machine_reset() override; /* memory pointers */ - optional_shared_ptr_array m_videoregs; - optional_shared_ptr_array m_vram; - optional_shared_ptr_array m_vctrl; - optional_shared_ptr_array m_spriteram; - optional_shared_ptr_array m_paletteram; + optional_shared_ptr_array m_videoregs; + optional_shared_ptr_array m_vram; + optional_shared_ptr_array m_vctrl; + optional_shared_ptr_array m_spriteram; + + optional_ioport m_io_in0; + optional_ioport_array<2> m_touch_x; + optional_ioport_array<2> m_touch_y; /* memory regions */ optional_memory_region_array<4> m_spriteregion; @@ -206,7 +212,7 @@ private: int priority = 0, flags = 0; - const uint8_t *pen_data = nullptr; /* points to top left corner of tile data */ + const u8 *pen_data = nullptr; /* points to top left corner of tile data */ int line_offset = 0; pen_t base_pen = 0; @@ -218,64 +224,64 @@ private: struct { - int clip_left, clip_right, clip_top, clip_bottom; - uint8_t *baseaddr; - int line_offset; - uint8_t *baseaddr_zbuf; - int line_offset_zbuf; + int clip_left, clip_right, clip_top, clip_bottom; + u8 *baseaddr; + int line_offset; + u8 *baseaddr_zbuf; + int line_offset_zbuf; } m_blit; std::unique_ptr m_sprite[4]; sprite_cave *m_sprite_table[4][MAX_PRIORITY][MAX_SPRITE_NUM + 1]; - tilemap_t *m_tilemap[4]; - int m_tiledim[4]; - int m_old_tiledim[4]; + tilemap_t *m_tilemap[4]; + bool m_tiledim[4]; + bool m_old_tiledim[4]; - bitmap_ind16 m_sprite_zbuf; - uint16_t m_sprite_zbuf_baseval; + bitmap_ind16 m_sprite_zbuf[4]; + u16 m_sprite_zbuf_baseval; - int m_num_sprites[4]; + int m_num_sprites[4]; - int m_spriteram_bank[4]; - int m_spriteram_bank_delay[4]; + int m_spriteram_bank[4]; + int m_spriteram_bank_delay[4]; - std::unique_ptr m_palette_map[4]; + int m_layers_offs_x; + int m_layers_offs_y; + int m_row_effect_offs_n; + int m_row_effect_offs_f; + u16 m_background_pen[4]; - int m_layers_offs_x; - int m_layers_offs_y; - int m_row_effect_offs_n; - int m_row_effect_offs_f; - int m_background_pen; - - int m_spritetype[2]; - int m_kludge; + int m_spritetype[2]; + int m_kludge; emu_timer *m_vblank_end_timer; + u16 m_sprite_base_pal; + u16 m_sprite_granularity; /* 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; + int m_time_vblank_irq; + u8 m_irq_level; + u8 m_vblank_irq; + u8 m_sound_irq; + u8 m_unknown_irq; + u8 m_agallet_vblank_irq; /* sound related */ - int m_soundbuf_wptr; - int m_soundbuf_rptr; - uint8_t m_soundbuf_data[32]; - bool m_soundbuf_empty; - //uint8_t m_sound_flag[2]; + int m_soundbuf_wptr; + int m_soundbuf_rptr; + u8 m_soundbuf_data[32]; + bool m_soundbuf_empty; + //u8 m_sound_flag[2]; /* game specific */ // sailormn - int m_sailormn_tilebank; + int m_sailormn_tilebank; // korokoro - uint16_t m_leds[2]; - int m_hopper; + u16 m_leds[2]; + int m_hopper; // ppsatan - uint16_t m_ppsatan_io_mux; + u16 m_ppsatan_io_mux; /* devices */ required_device m_maincpu; @@ -285,9 +291,9 @@ private: optional_device m_int_timer_left; optional_device m_int_timer_right; optional_device m_eeprom; - required_device m_gfxdecode; - required_device m_screen; - required_device m_palette; + optional_device_array m_gfxdecode; + optional_device_array m_screen; + optional_device_array m_palette; optional_device m_soundlatch; optional_device m_startup; output_finder<9> m_led_outputs; @@ -295,21 +301,21 @@ private: int m_rasflag; int m_old_rasflag; - 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 tilemap_draw(int chip, screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, u32 flags, u32 priority, u32 priority2, int GFX); void set_pens(int chip); - void vh_start( int num ); + void vh_start(int num, u16 sprcol_base, u16 sprcol_granularity); void get_sprite_info_cave(int chip); void get_sprite_info_donpachi(int chip); - void sprite_init(); + void sprite_init(int chip); void sprite_check(int chip, screen_device &screen, const rectangle &clip); - void do_blit_zoom32( int chip, const sprite_cave *sprite ); - void do_blit_zoom32_zb( int chip, const sprite_cave *sprite ); - void do_blit_32( int chip, const sprite_cave *sprite ); - void do_blit_32_zb( int chip, const sprite_cave *sprite ); - void sprite_draw_cave( int chip, int priority ); - void sprite_draw_cave_zbuf( int chip, int priority ); - void sprite_draw_donpachi( int chip, int priority ); - void sprite_draw_donpachi_zbuf( int chip, int priority ); + void do_blit_zoom32(int chip, const sprite_cave *sprite); + void do_blit_zoom32_zb(int chip, const sprite_cave *sprite); + void do_blit_32(int chip, const sprite_cave *sprite); + void do_blit_32_zb(int chip, const sprite_cave *sprite); + void sprite_draw_cave(int chip, int priority); + void sprite_draw_cave_zbuf(int chip, int priority); + 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); diff --git a/src/mame/video/cave.cpp b/src/mame/video/cave.cpp index d27f9802db5..8763deaa707 100644 --- a/src/mame/video/cave.cpp +++ b/src/mame/video/cave.cpp @@ -59,110 +59,6 @@ Note: if MAME_DEBUG is defined, pressing: #define SPRITE_VISIBLE_CAVE 0x04 -/*************************************************************************** - - Palette Init Routines - - Function needed for games with 4 bit sprites, rather than 8 bit, - or games with an odd colors mapping for the layers. - -***************************************************************************/ - -void cave_state::cave_palette(palette_device &palette) -{ - for (int chip = 0; chip < 4; chip++) - { - // create a 1:1 palette map covering everything - m_palette_map[chip] = std::make_unique(palette.entries()); - - int const maxpens = m_paletteram[chip].bytes() / 2; - if (maxpens) - { - for (int pen = 0; pen < palette.entries(); pen++) - m_palette_map[chip][pen] = pen % maxpens; - } - } -} - -void cave_state::dfeveron_palette(palette_device &palette) -{ - /* Fill the 0-3fff range, used by sprites ($40 color codes * $100 pens) - Here sprites have 16 pens, but the sprite drawing routine always - multiplies the color code by $100 (for consistency). - That's why we need this function. */ - - cave_palette(palette); - - for (int color = 0; color < 0x40; color++) - for (int pen = 0; pen < 0x10; pen++) - m_palette_map[0][(color << 8) | pen] = (color << 4) | pen; -} - -void cave_state::mazinger_palette(palette_device &palette) -{ - cave_palette(palette); - - // sprites (encrypted) are 4 bit deep - for (int color = 0; color < 0x40; color++) - for (int pen = 0; pen < 0x100; pen++) - m_palette_map[0][(color << 8) | pen] = (color << 4) + pen; // yes, PLUS, not OR - - // layer 0 is 6 bit deep, there are 64 color codes but only $400 colors are actually addressable - for (int color = 0; color < 0x40; color++) - for (int pen = 0; pen < 0x40; pen++) - m_palette_map[0][0x4400 + ((color << 6) | pen)] = 0x400 | ((color & 0x0f) << 6) | pen; -} - -void cave_state::sailormn_palette(palette_device &palette) -{ - cave_palette(palette); - - // sprites (encrypted) are 4 bit deep - for (int color = 0; color < 0x40; color++) - for (int pen = 0; pen < 0x100; pen++) - m_palette_map[0][(color << 8) | pen] = (color << 4) + pen; // yes, PLUS, not OR - - // layer 2 is 6 bit deep, there are 64 color codes but only $400 colors are actually addressable - for (int color = 0; color < 0x40; color++) - for (int pen = 0; pen < 0x40; pen++) - m_palette_map[0][0x4c00 + ((color << 6) | pen)] = 0xc00 | ((color & 0x0f) << 6) | pen; -} - -void cave_state::pwrinst2_palette(palette_device &palette) -{ - cave_palette(palette); - - for (int color = 0; color < 0x80; color++) - for (int pen = 0; pen < 0x10; pen++) - m_palette_map[0][(color << 8) | pen] = (color << 4) | pen; - - for (int pen = 0x8000; pen < 0xa800; pen++) - m_palette_map[0][pen] = pen - 0x8000; -} - -void cave_state::korokoro_palette(palette_device &palette) -{ - cave_palette(palette); - - for (int color = 0; color < 0x40; color++) - for (int pen = 0; pen < 0x10; pen++) - m_palette_map[0][(color << 8) | pen] = 0x3c00 | (color << 4) | pen; -} - - -void cave_state::set_pens(int chip) -{ - for (int pen = 0; pen < m_palette->entries(); pen++) - { - uint16_t const data = m_paletteram[chip][m_palette_map[chip][pen]]; - - rgb_t const color(pal5bit(data >> 5), pal5bit(data >> 10), pal5bit(data >> 0)); - - m_palette->set_pen_color(pen, color); - } -} - - /*************************************************************************** Tiles Format @@ -186,12 +82,12 @@ void cave_state::set_pens(int chip) ***************************************************************************/ -template +template TILE_GET_INFO_MEMBER(cave_state::get_tile_info) { - uint16_t *VRAM = m_vram[Chip]; - int TDIM = m_tiledim[Chip]; - uint32_t code, color, pri, tile; + u16 *VRAM = m_vram[Chip]; + const bool TDIM = m_tiledim[Chip]; + u32 code, color, pri, tile; if (TDIM) { @@ -214,7 +110,7 @@ TILE_GET_INFO_MEMBER(cave_state::get_tile_info) code = (code & 0x00ffffff); } - SET_TILE_INFO_MEMBER(Chip, code, color, 0 ); + SET_TILE_INFO_MEMBER(Gfx, code, color, 0); tileinfo.category = pri; } @@ -232,11 +128,11 @@ void cave_state::sailormn_tilebank_w(int bank) TILE_GET_INFO_MEMBER(cave_state::sailormn_get_tile_info_2) { - uint32_t code, color, pri; + u32 code, color, pri; if (m_tiledim[2]) { - uint32_t tile; + u32 tile; tile = (tile_index % (512 / 8)) / 2 + ((tile_index / (512 / 8)) / 2) * (512 / 16); code = (m_vram[2][tile * 2 + 0x0000 / 2] << 16) + m_vram[2][tile * 2 + 0x0002 / 2]; @@ -258,7 +154,7 @@ TILE_GET_INFO_MEMBER(cave_state::sailormn_get_tile_info_2) code += 0x40000; } - SET_TILE_INFO_MEMBER(2, code, color, 0 ); + SET_TILE_INFO_MEMBER(2, code, color, 0); tileinfo.category = pri; } @@ -272,31 +168,32 @@ TILE_GET_INFO_MEMBER(cave_state::sailormn_get_tile_info_2) ***************************************************************************/ -void cave_state::vh_start( int num ) +void cave_state::vh_start(int num, u16 sprcol_base, u16 sprcol_granularity) { - assert(m_palette_map != nullptr); + m_sprite_base_pal = sprcol_base; + m_sprite_granularity = sprcol_granularity; m_tilemap[0] = nullptr; m_tilemap[1] = nullptr; m_tilemap[2] = nullptr; m_tilemap[3] = nullptr; - m_tiledim[0] = 0; - m_tiledim[1] = 0; - m_tiledim[2] = 0; - m_tiledim[3] = 0; + m_tiledim[0] = false; + m_tiledim[1] = false; + m_tiledim[2] = false; + m_tiledim[3] = false; - m_old_tiledim[0] = 0; - m_old_tiledim[1] = 0; - m_old_tiledim[2] = 0; - m_old_tiledim[3] = 0; + m_old_tiledim[0] = false; + m_old_tiledim[1] = false; + m_old_tiledim[2] = false; + m_old_tiledim[3] = false; assert((num >= 1) && (num <= 4)); 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[0], tilemap_get_info_delegate(&cave_state::get_tile_info<3, 3>, "screen0_layer3",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); @@ -304,7 +201,7 @@ void cave_state::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[0], tilemap_get_info_delegate(&cave_state::get_tile_info<2, 2>, "screen0_layer2",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); @@ -312,7 +209,7 @@ void cave_state::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[0], tilemap_get_info_delegate(&cave_state::get_tile_info<1, 1>, "screen0_layer1",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); @@ -320,7 +217,7 @@ void cave_state::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[0], tilemap_get_info_delegate(&cave_state::get_tile_info<0, 0>, "screen0_layer0",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); @@ -330,7 +227,7 @@ void cave_state::vh_start( int num ) break; } - sprite_init(); + sprite_init(0); m_layers_offs_x = 0x13; m_layers_offs_y = -0x12; @@ -338,9 +235,9 @@ void cave_state::vh_start( int num ) m_row_effect_offs_n = -1; m_row_effect_offs_f = 1; - m_background_pen = m_gfxdecode->gfx(0)->colorbase() + - (m_gfxdecode->gfx(0)->colors() - 1) * - m_gfxdecode->gfx(0)->granularity(); + m_background_pen[0] = m_gfxdecode[0]->gfx(0)->colorbase() + + (m_gfxdecode[0]->gfx(0)->colors() - 1) * + m_gfxdecode[0]->gfx(0)->granularity(); switch (m_kludge) { @@ -349,31 +246,98 @@ void cave_state::vh_start( int num ) m_row_effect_offs_f = -1; break; case 2: /* uopoko dfeveron */ - m_background_pen = 0x3f00; + m_background_pen[0] = m_gfxdecode[0]->gfx(0)->colorbase() - m_gfxdecode[0]->gfx(0)->granularity(); break; case 4: /* pwrinst2 */ - m_background_pen = 0x7f00; + m_background_pen[0] = m_gfxdecode[0]->gfx(0)->colorbase() - m_gfxdecode[0]->gfx(0)->granularity(); m_layers_offs_y++; break; } } -VIDEO_START_MEMBER(cave_state,cave_1_layer){ vh_start(1); } -VIDEO_START_MEMBER(cave_state,cave_2_layers){ vh_start(2); } -VIDEO_START_MEMBER(cave_state,cave_3_layers){ vh_start(3); } -VIDEO_START_MEMBER(cave_state,cave_4_layers){ vh_start(4); } - - -VIDEO_START_MEMBER(cave_state,sailormn_3_layers) +// ddonpach esprade gaia guwange (8bpp tilemap) +VIDEO_START_MEMBER(cave_state,ddonpach) { - vh_start(2); + vh_start(3, 0, 256); +} + +// dfeveron mazinger +VIDEO_START_MEMBER(cave_state,dfeveron) +{ + vh_start(2, 0, 16); +} + +// donpachi hotdogst metmqstr +VIDEO_START_MEMBER(cave_state,donpachi) +{ + vh_start(3, 0, 16); +} + +// korokoro (different sprite base palette) +VIDEO_START_MEMBER(cave_state,korokoro) +{ + vh_start(1, 0x3c00, 16); +} + +// ppsatan (3 screen) +VIDEO_START_MEMBER(cave_state,ppsatan) +{ + vh_start(1, 0x3c00, 16); + m_tilemap[2] = &machine().tilemap().create(*m_gfxdecode[2], tilemap_get_info_delegate(&cave_state::get_tile_info<2, 0>, "screen2_layer0",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); + save_item(NAME(m_tiledim[2])); + save_item(NAME(m_old_tiledim[2])); + + m_tilemap[1] = &machine().tilemap().create(*m_gfxdecode[1], tilemap_get_info_delegate(&cave_state::get_tile_info<1, 0>, "screen1_layer0",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); + save_item(NAME(m_tiledim[1])); + save_item(NAME(m_old_tiledim[1])); + + for (int chip = 1; chip < 3; chip++) + { + m_background_pen[chip] = m_gfxdecode[chip]->gfx(0)->colorbase() + + (m_gfxdecode[chip]->gfx(0)->colors() - 1) * + m_gfxdecode[chip]->gfx(0)->granularity(); + + switch (m_kludge) + { + case 2: /* uopoko dfeveron */ + case 4: /* pwrinst2 */ + m_background_pen[chip] = m_gfxdecode[chip]->gfx(0)->colorbase() - m_gfxdecode[chip]->gfx(0)->granularity(); + break; + } + } +} + +// pwrinst2 +VIDEO_START_MEMBER(cave_state,pwrinst2) +{ + vh_start(4, 0, 16); +} + +// sailormn agallet +VIDEO_START_MEMBER(cave_state,sailormn) +{ + vh_start(2, 0, 16); /* Layer 2 (8x8) needs to be handled differently */ - m_tilemap[2] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(cave_state::sailormn_get_tile_info_2),this), TILEMAP_SCAN_ROWS, 8, 8, 512 / 8, 512 / 8 ); + m_tilemap[2] = &machine().tilemap().create(*m_gfxdecode[0], tilemap_get_info_delegate(FUNC(cave_state::sailormn_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); + save_item(NAME(m_tiledim[2])); + save_item(NAME(m_old_tiledim[2])); +} + +// uopoko tjumpman (8bpp tilemap, but single tilemap layer) +VIDEO_START_MEMBER(cave_state,uopoko) +{ + vh_start(1, 0, 256); } /*************************************************************************** @@ -411,28 +375,23 @@ 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 uint8_t *base_gfx = m_spriteregion[chip]->base(); - int code_max = m_spriteregion[chip]->bytes() / (16*16); + const u8 *base_gfx = m_spriteregion[chip]->base(); + const int code_max = m_spriteregion[chip]->bytes() / (16*16); - uint16_t *source; - uint16_t *finish; sprite_cave *sprite = m_sprite[chip].get(); - int glob_flipx = m_videoregs[chip][0] & 0x8000; - int glob_flipy = m_videoregs[chip][1] & 0x8000; + const int glob_flipx = m_videoregs[chip][0] & 0x8000; + const int glob_flipy = m_videoregs[chip][1] & 0x8000; - int max_x = m_screen->width(); - int max_y = m_screen->height(); - - source = m_spriteram[chip] + (0x4000 / 2) * m_spriteram_bank[chip]; - - finish = source + (0x4000 / 2); + const int max_x = m_screen[chip]->width(); + const int max_y = m_screen[chip]->height(); + const u16 *source = m_spriteram[chip] + (0x4000 / 2) * m_spriteram_bank[chip]; + const u16 *finish = source + (0x4000 / 2); for (; source < finish; source += 8) { - int x, y, attr, code, zoomx, zoomy, size, flipx, flipy; + int x, y; int total_width_f, total_height_f; if (m_spritetype[0] == 2) /* Hot Dog Storm */ @@ -445,11 +404,11 @@ void cave_state::get_sprite_info_cave(int chip) x = source[0] << 2; y = source[1] << 2; } - attr = source[2]; - code = source[3] + ((attr & 3) << 16); - zoomx = source[4]; - zoomy = source[5]; - size = source[6]; + const u16 attr = source[2]; + u32 code = source[3] + ((attr & 3) << 16); + int zoomx = source[4]; + int zoomy = source[5]; + const u16 size = source[6]; sprite->tile_width = ((size >> 8) & 0x1f) * 16; sprite->tile_height = ((size >> 0) & 0x1f) * 16; @@ -461,8 +420,8 @@ void cave_state::get_sprite_info_cave(int chip) code %= code_max; sprite->pen_data = base_gfx + (16 * 16) * code; - flipx = attr & 0x0008; - flipy = attr & 0x0004; + int flipx = attr & 0x0008; + int flipy = attr & 0x0004; sprite->total_width = (total_width_f = sprite->tile_width * zoomx) / 0x100; sprite->total_height = (total_height_f = sprite->tile_height * zoomy) / 0x100; @@ -511,13 +470,13 @@ void cave_state::get_sprite_info_cave(int chip) if (x > 0x1ff) x -= 0x400; if (y > 0x1ff) y -= 0x400; - if (x + sprite->total_width <= 0 || x >= max_x || y + sprite->total_height <= 0 || y >= max_y ) + if (x + sprite->total_width <= 0 || x >= max_x || y + sprite->total_height <= 0 || y >= max_y) {continue;} sprite->priority = (attr & 0x0030) >> 4; sprite->flags = SPRITE_VISIBLE_CAVE; sprite->line_offset = sprite->tile_width; - sprite->base_pen = base_pal + (attr & 0x3f00); // first 0x4000 colors + sprite->base_pen = m_sprite_base_pal + (((attr & 0x3f00) >> 8) * m_sprite_granularity); // first 0x4000 colors if (glob_flipx) { x = max_x - x - sprite->total_width; flipx = !flipx; } if (glob_flipy) { y = max_y - y - sprite->total_height; flipy = !flipy; } @@ -536,39 +495,34 @@ 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 uint8_t *base_gfx = m_spriteregion[chip]->base(); - int code_max = m_spriteregion[chip]->bytes() / (16*16); - - uint16_t *source; - uint16_t *finish; + const u8 *base_gfx = m_spriteregion[chip]->base(); + const int code_max = m_spriteregion[chip]->bytes() / (16*16); sprite_cave *sprite = m_sprite[chip].get(); - int glob_flipx = m_videoregs[chip][0] & 0x8000; - int glob_flipy = m_videoregs[chip][1] & 0x8000; + const int glob_flipx = m_videoregs[chip][0] & 0x8000; + const int glob_flipy = m_videoregs[chip][1] & 0x8000; - int max_x = m_screen->width(); - int max_y = m_screen->height(); + const int max_x = m_screen[chip]->width(); + const int max_y = m_screen[chip]->height(); - source = m_spriteram[chip] + (0x4000 / 2) * m_spriteram_bank[chip]; - - finish = source + (0x4000 / 2); + const u16 *source = m_spriteram[chip] + (0x4000 / 2) * m_spriteram_bank[chip]; + const u16 *finish = source + (0x4000 / 2); for (; source < finish; source += 8) { - int x, y, attr, code, size, flipx, flipy; + int y; - attr = source[0]; - code = source[1] + ((attr & 3) << 16); - x = source[2] & 0x3ff; + const u16 attr = source[0]; + u32 code = source[1] + ((attr & 3) << 16); + int x = source[2] & 0x3ff; if (m_spritetype[0] == 3) /* pwrinst2 */ y = (source[3] + 1) & 0x3ff; else y = source[3] & 0x3ff; - size = source[4]; + const u16 size = source[4]; sprite->tile_width = sprite->total_width = ((size >> 8) & 0x1f) * 16; sprite->tile_height = sprite->total_height = ((size >> 0) & 0x1f) * 16; @@ -581,21 +535,21 @@ void cave_state::get_sprite_info_donpachi(int chip) if (y > 0x1ff) y -= 0x400; if (!sprite->tile_width || !sprite->tile_height || - x + sprite->total_width <= 0 || x >= max_x || y + sprite->total_height <= 0 || y >= max_y ) + x + sprite->total_width <= 0 || x >= max_x || y + sprite->total_height <= 0 || y >= max_y) {continue;} - flipx = attr & 0x0008; - flipy = attr & 0x0004; + int flipx = attr & 0x0008; + int flipy = attr & 0x0004; if (m_spritetype[0] == 3) /* pwrinst2 */ { sprite->priority = ((attr & 0x0010) >> 4) + 2; - sprite->base_pen = base_pal + (attr & 0x3f00) + 0x4000 * ((attr & 0x0020) >> 5); + sprite->base_pen = m_sprite_base_pal + ((((attr & 0x3f00) >> 8) + ((attr & 0x0020) << 1)) * m_sprite_granularity); } else { sprite->priority = (attr & 0x0030) >> 4; - sprite->base_pen = base_pal + (attr & 0x3f00); // first 0x4000 colors + sprite->base_pen = m_sprite_base_pal + (((attr & 0x3f00) >> 8) * m_sprite_granularity); // first 0x4000 colors } sprite->flags = SPRITE_VISIBLE_CAVE; @@ -616,8 +570,15 @@ void cave_state::get_sprite_info_donpachi(int chip) } -void cave_state::sprite_init() +void cave_state::sprite_init(int chip) { + m_screen[chip]->register_screen_bitmap(m_sprite_zbuf[chip]); + + save_item(NAME(m_sprite_zbuf[chip]), chip); + + if (chip != 0) + return; + if (m_spritetype[0] == 0 || m_spritetype[0] == 2) // most of the games { m_get_sprite_info = &cave_state::get_sprite_info_cave; @@ -630,7 +591,6 @@ void cave_state::sprite_init() } m_sprite_zbuf_baseval = 0x10000 - MAX_SPRITE_NUM; - m_screen->register_screen_bitmap(m_sprite_zbuf); for (int chip = 0; chip < 4; chip++) { @@ -644,7 +604,6 @@ void cave_state::sprite_init() m_sprite_draw = &cave_state::sprite_draw_donpachi; - save_item(NAME(m_sprite_zbuf)); save_item(NAME(m_sprite_zbuf_baseval)); save_item(NAME(m_num_sprites)); save_item(NAME(m_spriteram_bank)); @@ -659,10 +618,10 @@ void cave_state::sprite_init() void cave_state::sprite_check(int chip, screen_device &screen, const rectangle &clip) { { /* set clip */ - int left = clip.min_x; - int top = clip.min_y; - int right = clip.max_x + 1; - int bottom = clip.max_y + 1; + const int left = clip.min_x; + const int top = clip.min_y; + const int right = clip.max_x + 1; + const int bottom = clip.max_y + 1; m_blit.clip_left = left; m_blit.clip_top = top; @@ -681,11 +640,11 @@ void cave_state::sprite_check(int chip, screen_device &screen, const rectangle & while (sprite < finish) { if (sprite->x + sprite->total_width > m_blit.clip_left && sprite->x < m_blit.clip_right && - sprite->y + sprite->total_height > m_blit.clip_top && sprite->y < m_blit.clip_bottom ) + sprite->y + sprite->total_height > m_blit.clip_top && sprite->y < m_blit.clip_bottom ) { m_sprite_table[chip][sprite->priority][i[sprite->priority]++] = sprite; - if(!(spritetype & CAVE_SPRITETYPE_ZBUF)) + if (!(spritetype & CAVE_SPRITETYPE_ZBUF)) { if (priority_check > sprite->priority) spritetype |= CAVE_SPRITETYPE_ZBUF; @@ -711,8 +670,8 @@ void cave_state::sprite_check(int chip, screen_device &screen, const rectangle & m_sprite_draw = &cave_state::sprite_draw_cave_zbuf; if (clip.min_y == visarea.min_y) { - if(!(m_sprite_zbuf_baseval += MAX_SPRITE_NUM)) - m_sprite_zbuf.fill(0, visarea); + if (!(m_sprite_zbuf_baseval += MAX_SPRITE_NUM)) + m_sprite_zbuf[chip].fill(0, visarea); } break; @@ -720,8 +679,8 @@ void cave_state::sprite_check(int chip, screen_device &screen, const rectangle & m_sprite_draw = &cave_state::sprite_draw_donpachi_zbuf; if (clip.min_y == visarea.min_y) { - if(!(m_sprite_zbuf_baseval += MAX_SPRITE_NUM)) - m_sprite_zbuf.fill(0, visarea); + if (!(m_sprite_zbuf_baseval += MAX_SPRITE_NUM)) + m_sprite_zbuf[chip].fill(0, visarea); } break; @@ -732,7 +691,7 @@ void cave_state::sprite_check(int chip, screen_device &screen, const rectangle & } } -void cave_state::do_blit_zoom32( int chip, const sprite_cave *sprite ) +void cave_state::do_blit_zoom32(int chip, const sprite_cave *sprite) { /* assumes SPRITE_LIST_RAW_DATA flag is set */ int x1, x2, y1, y2, dx, dy; @@ -782,7 +741,7 @@ void cave_state::do_blit_zoom32( int chip, const sprite_cave *sprite ) return; } - if (sprite->flags & SPRITE_FLIPY_CAVE ) + if (sprite->flags & SPRITE_FLIPY_CAVE) { y2 = sprite->y; y1 = y2 + sprite->total_height; @@ -818,41 +777,36 @@ void cave_state::do_blit_zoom32( int chip, const sprite_cave *sprite ) y1++; } } - if (y2 > m_blit.clip_bottom ) + if (y2 > m_blit.clip_bottom) y2 = m_blit.clip_bottom; if (y1 >= y2) return; } { - const uint8_t *pen_data = sprite->pen_data -1 -sprite->line_offset; - pen_t base_pen = sprite->base_pen; - int x, y; - uint8_t pen; - int pitch = m_blit.line_offset * dy / 4; - uint32_t *dest = (uint32_t *)(m_blit.baseaddr + m_blit.line_offset * y1); + const u8 *pen_data = sprite->pen_data -1 -sprite->line_offset; + const pen_t base_pen = sprite->base_pen; + const int pitch = m_blit.line_offset * dy / 4; + u32 *dest = (u32 *)(m_blit.baseaddr + m_blit.line_offset * y1); int ycount = ycount0; - for (y = y1; y != y2; y += dy) + for (int y = y1; y != y2; y += dy) { - int xcount; - const uint8_t *source; - if (ycount & 0xffff0000) { - xcount = xcount0; + int xcount = xcount0; pen_data += sprite->line_offset * (ycount >> 16); ycount &= 0xffff; - source = pen_data; - for (x = x1; x != x2; x += dx) + const u8 *source = pen_data; + for (int x = x1; x != x2; x += dx) { if (xcount & 0xffff0000) { source += xcount >> 16; xcount &= 0xffff; - pen = *source; + const u8 pen = *source; if (pen) - dest[x] = m_palette->pen_color(base_pen + pen); + dest[x] = m_palette[chip]->pen_color(base_pen + pen); } xcount += sprite->zoomx_re; } @@ -864,7 +818,7 @@ void cave_state::do_blit_zoom32( int chip, const sprite_cave *sprite ) } -void cave_state::do_blit_zoom32_zb( int chip, const sprite_cave *sprite ) +void cave_state::do_blit_zoom32_zb(int chip, const sprite_cave *sprite) { /* assumes SPRITE_LIST_RAW_DATA flag is set */ int x1, x2, y1, y2, dx, dy; @@ -954,38 +908,33 @@ void cave_state::do_blit_zoom32_zb( int chip, const sprite_cave *sprite ) } { - const uint8_t *pen_data = sprite->pen_data - 1 - sprite->line_offset; - pen_t base_pen = sprite->base_pen; - int x, y; - uint8_t pen; - int pitch = m_blit.line_offset * dy / 4; - uint32_t *dest = (uint32_t *)(m_blit.baseaddr + m_blit.line_offset * y1); - int pitchz = m_blit.line_offset_zbuf * dy / 2; - uint16_t *zbf = (uint16_t *)(m_blit.baseaddr_zbuf + m_blit.line_offset_zbuf * y1); - uint16_t pri_sp = (uint16_t)(sprite - m_sprite[chip].get()) + m_sprite_zbuf_baseval; + const u8 *pen_data = sprite->pen_data - 1 - sprite->line_offset; + const pen_t base_pen = sprite->base_pen; + const int pitch = m_blit.line_offset * dy / 4; + u32 *dest = (u32 *)(m_blit.baseaddr + m_blit.line_offset * y1); + const int pitchz = m_blit.line_offset_zbuf * dy / 2; + u16 *zbf = (u16 *)(m_blit.baseaddr_zbuf + m_blit.line_offset_zbuf * y1); + const u16 pri_sp = (u16)(sprite - m_sprite[chip].get()) + m_sprite_zbuf_baseval; int ycount = ycount0; - for (y = y1; y != y2; y += dy) + for (int y = y1; y != y2; y += dy) { - int xcount; - const uint8_t *source; - if (ycount & 0xffff0000) { - xcount = xcount0; + int xcount = xcount0; pen_data += sprite->line_offset * (ycount >> 16); ycount &= 0xffff; - source = pen_data; - for (x = x1; x != x2; x += dx) + const u8 *source = pen_data; + for (int x = x1; x != x2; x += dx) { if (xcount & 0xffff0000) { source += xcount >> 16; xcount &= 0xffff; - pen = *source; + const u8 pen = *source; if (pen && (zbf[x] <= pri_sp)) { - dest[x] = m_palette->pen_color(base_pen + pen); + dest[x] = m_palette[chip]->pen_color(base_pen + pen); zbf[x] = pri_sp; } } @@ -999,7 +948,7 @@ void cave_state::do_blit_zoom32_zb( int chip, const sprite_cave *sprite ) } } -void cave_state::do_blit_32( int chip, const sprite_cave *sprite ) +void cave_state::do_blit_32(int chip, const sprite_cave *sprite) { /* assumes SPRITE_LIST_RAW_DATA flag is set */ int x1, x2, y1, y2, dx, dy; @@ -1056,7 +1005,7 @@ void cave_state::do_blit_32( int chip, const sprite_cave *sprite ) y1 = sprite->y; y2 = y1 + sprite->total_height; dy = 1; - if (y1 < m_blit.clip_top ) + if (y1 < m_blit.clip_top) { ycount0 = m_blit.clip_top - y1; y1 = m_blit.clip_top; @@ -1068,23 +1017,20 @@ void cave_state::do_blit_32( int chip, const sprite_cave *sprite ) } { - const uint8_t *pen_data = sprite->pen_data; - pen_t base_pen = sprite->base_pen; - int x, y; - uint8_t pen; - int pitch = m_blit.line_offset * dy / 4; - uint32_t *dest = (uint32_t *)(m_blit.baseaddr + m_blit.line_offset * y1); + const u8 *pen_data = sprite->pen_data; + const pen_t base_pen = sprite->base_pen; + const int pitch = m_blit.line_offset * dy / 4; + u32 *dest = (u32 *)(m_blit.baseaddr + m_blit.line_offset * y1); pen_data += sprite->line_offset * ycount0 + xcount0; - for (y = y1; y != y2; y += dy) + for (int y = y1; y != y2; y += dy) { - const uint8_t *source; - source = pen_data; - for (x = x1; x != x2; x += dx) + const u8 *source = pen_data; + for (int x = x1; x != x2; x += dx) { - pen = *source; + const u8 pen = *source; if (pen) - dest[x] = m_palette->pen_color(base_pen + pen); + dest[x] = m_palette[chip]->pen_color(base_pen + pen); source++; } pen_data += sprite->line_offset; @@ -1094,7 +1040,7 @@ void cave_state::do_blit_32( int chip, const sprite_cave *sprite ) } -void cave_state::do_blit_32_zb( int chip, const sprite_cave *sprite ) +void cave_state::do_blit_32_zb(int chip, const sprite_cave *sprite) { /* assumes SPRITE_LIST_RAW_DATA flag is set */ int x1, x2, y1, y2, dx, dy; @@ -1164,27 +1110,25 @@ void cave_state::do_blit_32_zb( int chip, const sprite_cave *sprite ) } { - const uint8_t *pen_data = sprite->pen_data; - pen_t base_pen = sprite->base_pen; - int x, y; - uint8_t pen; - int pitch = m_blit.line_offset * dy / 4; - uint32_t *dest = (uint32_t *)(m_blit.baseaddr + m_blit.line_offset * y1); - int pitchz = m_blit.line_offset_zbuf * dy / 2; - uint16_t *zbf = (uint16_t *)(m_blit.baseaddr_zbuf + m_blit.line_offset_zbuf * y1); - uint16_t pri_sp = (uint16_t)(sprite - m_sprite[chip].get()) + m_sprite_zbuf_baseval; + const u8 *pen_data = sprite->pen_data; + const pen_t base_pen = sprite->base_pen; + const int pitch = m_blit.line_offset * dy / 4; + u32 *dest = (u32 *)(m_blit.baseaddr + m_blit.line_offset * y1); + const int pitchz = m_blit.line_offset_zbuf * dy / 2; + u16 *zbf = (u16 *)(m_blit.baseaddr_zbuf + m_blit.line_offset_zbuf * y1); + const u16 pri_sp = (u16)(sprite - m_sprite[chip].get()) + m_sprite_zbuf_baseval; pen_data += sprite->line_offset * ycount0 + xcount0; - for (y = y1; y != y2; y += dy) + for (int y = y1; y != y2; y += dy) { - const uint8_t *source; + const u8 *source; source = pen_data; - for (x = x1; x != x2; x += dx) + for (int x = x1; x != x2; x += dx) { - pen = *source; + const u8 pen = *source; if (pen && (zbf[x] <= pri_sp)) { - dest[x] = m_palette->pen_color(base_pen + pen); + dest[x] = m_palette[chip]->pen_color(base_pen + pen); zbf[x] = pri_sp; } source++; @@ -1197,7 +1141,7 @@ void cave_state::do_blit_32_zb( int chip, const sprite_cave *sprite ) } -void cave_state::sprite_draw_cave( int chip, int priority ) +void cave_state::sprite_draw_cave(int chip, int priority) { int i = 0; while (m_sprite_table[chip][priority][i]) @@ -1210,7 +1154,7 @@ void cave_state::sprite_draw_cave( int chip, int priority ) } } -void cave_state::sprite_draw_cave_zbuf( int chip, int priority ) +void cave_state::sprite_draw_cave_zbuf(int chip, int priority) { int i = 0; while (m_sprite_table[chip][priority][i]) @@ -1223,14 +1167,14 @@ void cave_state::sprite_draw_cave_zbuf( int chip, int priority ) } } -void cave_state::sprite_draw_donpachi( int chip, int priority ) +void cave_state::sprite_draw_donpachi(int chip, int priority) { int i = 0; while (m_sprite_table[chip][priority][i]) do_blit_32(chip, m_sprite_table[chip][priority][i++]); } -void cave_state::sprite_draw_donpachi_zbuf( int chip, int priority ) +void cave_state::sprite_draw_donpachi_zbuf(int chip, int priority) { int i = 0; while (m_sprite_table[chip][priority][i]) @@ -1294,30 +1238,29 @@ void cave_state::sprite_draw_donpachi_zbuf( int chip, int priority ) ***************************************************************************/ -inline void cave_state::tilemap_draw( int chip, +inline void cave_state::tilemap_draw(int chip, screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, - uint32_t flags, uint32_t priority, uint32_t priority2, int GFX ) + u32 flags, u32 priority, u32 priority2, int GFX) { tilemap_t *TILEMAP = m_tilemap[GFX]; - uint16_t *VRAM = m_vram[GFX]; - uint16_t *VCTRL = m_vctrl[GFX]; - int sx, sy, flipx, flipy, offs_x, offs_y, offs_row; + const u16 *VRAM = m_vram[GFX]; + const u16 *VCTRL = m_vctrl[GFX]; /* Bail out if ... */ - if ( (!TILEMAP) || /* no tilemap; */ + if ((!TILEMAP) || /* no tilemap; */ ((VCTRL[2] & 0x0003) != priority2) || /* tilemap's global priority not the requested one; */ - ((VCTRL[2] & 0x0010)) ) /* tilemap's disabled. */ + ((VCTRL[2] & 0x0010))) /* tilemap's disabled. */ return; - flipx = ~VCTRL[0] & 0x8000; - flipy = ~VCTRL[1] & 0x8000; - TILEMAP->set_flip((flipx ? TILEMAP_FLIPX : 0) | (flipy ? TILEMAP_FLIPY : 0) ); + const bool flipx = ~VCTRL[0] & 0x8000; + const bool flipy = ~VCTRL[1] & 0x8000; + TILEMAP->set_flip((flipx ? TILEMAP_FLIPX : 0) | (flipy ? TILEMAP_FLIPY : 0)); - offs_x = m_layers_offs_x; - offs_y = m_layers_offs_y; + int offs_x = m_layers_offs_x; + const int offs_y = m_layers_offs_y; - offs_row = flipy ? m_row_effect_offs_f : m_row_effect_offs_n; + const int offs_row = flipy ? m_row_effect_offs_f : m_row_effect_offs_n; /* An additional 8 pixel offset for layers with 8x8 tiles. Plus Layer 0 is displaced by 1 pixel wrt Layer 1, so is Layer 2 wrt @@ -1327,13 +1270,13 @@ inline void cave_state::tilemap_draw( int chip, else if (TILEMAP == m_tilemap[2]) offs_x -= (m_tiledim[2] ? 3 : (3 + 8)); else if (TILEMAP == m_tilemap[3]) offs_x -= (m_tiledim[3] ? 4 : (4 + 8)); - sx = VCTRL[0] - m_videoregs[chip][0] + (flipx ? (offs_x + 2) : -offs_x); - sy = VCTRL[1] - m_videoregs[chip][1] + (flipy ? (offs_y + 2) : -offs_y); + const int sx = VCTRL[0] - m_videoregs[chip][0] + (flipx ? (offs_x + 2) : -offs_x); + const int sy = VCTRL[1] - m_videoregs[chip][1] + (flipy ? (offs_y + 2) : -offs_y); if (VCTRL[1] & 0x4000) // row-select { rectangle clip; - int startline, endline, vramdata0, vramdata1; + int endline, vramdata0, vramdata1; /* Row-select: @@ -1346,19 +1289,17 @@ inline void cave_state::tilemap_draw( int chip, clip.min_x = cliprect.min_x; clip.max_x = cliprect.max_x; - for (startline = cliprect.min_y; startline <= cliprect.max_y;) + for (int startline = cliprect.min_y; startline <= cliprect.max_y;) { /* Find the largest slice */ vramdata0 = (vramdata1 = VRAM[(0x1002 + (((sy + offs_row + startline) * 4) & 0x7ff)) / 2]); - for(endline = startline + 1; endline <= cliprect.max_y; endline++) - if((++vramdata1) != VRAM[(0x1002 + (((sy + offs_row + endline) * 4) & 0x7ff)) / 2]) break; + for (endline = startline + 1; endline <= cliprect.max_y; endline++) + if ((++vramdata1) != VRAM[(0x1002 + (((sy + offs_row + endline) * 4) & 0x7ff)) / 2]) break; TILEMAP->set_scrolly(0, vramdata0 - startline); if (VCTRL[0] & 0x4000) // row-scroll, row-select { - int line; - /* Row-scroll: @@ -1368,7 +1309,7 @@ inline void cave_state::tilemap_draw( int chip, */ TILEMAP->set_scroll_rows(512); - for(line = startline; line < endline; line++) + for (int line = startline; line < endline; line++) TILEMAP->set_scrollx((vramdata0 - startline + line) & 511, sx + VRAM[(0x1000 + (((sy + offs_row + line) * 4) & 0x7ff)) / 2]); } @@ -1396,17 +1337,16 @@ inline void cave_state::tilemap_draw( int chip, } else if (VCTRL[0] & 0x4000) // row-scroll, no row-select { - int line; TILEMAP->set_scroll_rows(512); - for(line = cliprect.min_y; line <= cliprect.max_y; line++) + for (int line = cliprect.min_y; line <= cliprect.max_y; line++) TILEMAP->set_scrollx((line + sy) & 511, - sx + VRAM[(0x1000+(((sy + offs_row + line) * 4) & 0x7ff)) / 2] ); + sx + VRAM[(0x1000+(((sy + offs_row + line) * 4) & 0x7ff)) / 2]); TILEMAP->set_scrolly(0, sy); TILEMAP->draw(screen, bitmap, cliprect, flags, priority); } else { - /* DEF_STR( Normal ) scrolling */ + /* DEF_STR(Normal) scrolling */ TILEMAP->set_scroll_rows(1); TILEMAP->set_scroll_cols(1); TILEMAP->set_scrollx(0, sx); @@ -1416,20 +1356,17 @@ inline void cave_state::tilemap_draw( int chip, } -uint32_t cave_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) +u32 cave_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { - int pri, pri2, GFX; int layers_ctrl = -1; - set_pens(0); - - m_blit.baseaddr = reinterpret_cast(bitmap.raw_pixptr(0)); + m_blit.baseaddr = reinterpret_cast(bitmap.raw_pixptr(0)); m_blit.line_offset = bitmap.rowbytes(); - m_blit.baseaddr_zbuf = reinterpret_cast(m_sprite_zbuf.raw_pixptr(0)); - m_blit.line_offset_zbuf = m_sprite_zbuf.rowbytes(); + m_blit.baseaddr_zbuf = reinterpret_cast(m_sprite_zbuf[0].raw_pixptr(0)); + m_blit.line_offset_zbuf = m_sprite_zbuf[0].rowbytes(); /* Choose the tilemap to display (8x8 tiles or 16x16 tiles) */ - for (GFX = 0; GFX < 4; GFX++) + for (int GFX = 0; GFX < 4; GFX++) { if (m_tilemap[GFX]) { @@ -1442,8 +1379,8 @@ uint32_t cave_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, #ifdef MAME_DEBUG { - if ( machine().input().code_pressed(KEYCODE_Z) || machine().input().code_pressed(KEYCODE_X) || machine().input().code_pressed(KEYCODE_C) || - machine().input().code_pressed(KEYCODE_V) || machine().input().code_pressed(KEYCODE_B) ) + if (machine().input().code_pressed(KEYCODE_Z) || machine().input().code_pressed(KEYCODE_X) || machine().input().code_pressed(KEYCODE_C) || + machine().input().code_pressed(KEYCODE_V) || machine().input().code_pressed(KEYCODE_B)) { int msk = 0, val = 0; @@ -1464,7 +1401,7 @@ uint32_t cave_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, /* Show the video registers (cave_videoregs) */ popmessage("%04X %04X %04X %04X %04X %04X %04X %04X", m_videoregs[0][0], m_videoregs[0][1], m_videoregs[0][2], m_videoregs[0][3], - m_videoregs[0][4], m_videoregs[0][5], m_videoregs[0][6], m_videoregs[0][7] ); + m_videoregs[0][4], m_videoregs[0][5], m_videoregs[0][6], m_videoregs[0][7]); #endif /* Show the scroll / flags registers of the selected layer */ if ((m_tilemap[0]) && (msk & 0x000f)) popmessage("x:%04X y:%04X f:%04X", m_vctrl[0][0],m_vctrl[0][1],m_vctrl[0][2]); @@ -1475,7 +1412,7 @@ uint32_t cave_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, /* Show the row / "column" scroll enable flags, when they change state */ m_rasflag = 0; - for (GFX = 0; GFX < 4; GFX++) + for (int GFX = 0; GFX < 4; GFX++) { if (m_tilemap[GFX]) { @@ -1490,7 +1427,7 @@ uint32_t cave_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, (m_rasflag & 0x0001) ? 'x' : ' ', (m_rasflag & 0x0002) ? 'y' : ' ', (m_rasflag & 0x0010) ? 'x' : ' ', (m_rasflag & 0x0020) ? 'y' : ' ', (m_rasflag & 0x0100) ? 'x' : ' ', (m_rasflag & 0x0200) ? 'y' : ' ', - (m_rasflag & 0x1000) ? 'x' : ' ', (m_rasflag & 0x2000) ? 'y' : ' ' ); + (m_rasflag & 0x1000) ? 'x' : ' ', (m_rasflag & 0x2000) ? 'y' : ' '); m_old_rasflag = m_rasflag; } } @@ -1498,7 +1435,7 @@ uint32_t cave_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, sprite_check(0, screen, cliprect); - bitmap.fill(m_palette->pen_color(m_background_pen), cliprect); + bitmap.fill(m_palette[0]->pen_color(m_background_pen[0]), cliprect); /* Tiles and sprites are ordered by priority (0 back, 3 front) with @@ -1512,11 +1449,11 @@ uint32_t cave_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, Tiles with the same priority *and* the same priority of their layer are ordered by layer (0 back, 2 front) */ - for (pri = 0; pri <= 3; pri++) // tile / sprite priority + for (int pri = 0; pri <= 3; pri++) // tile / sprite priority { if (layers_ctrl & (1 << (pri + 16))) (this->*m_sprite_draw)(0, pri); - for (pri2 = 0; pri2 <= 3; pri2++) // priority of the whole layer + for (int pri2 = 0; pri2 <= 3; pri2++) // priority of the whole layer { if (layers_ctrl & (1 << (pri + 0))) tilemap_draw(0, screen, bitmap, cliprect, pri, 0, pri2, 0); if (layers_ctrl & (1 << (pri + 4))) tilemap_draw(0, screen, bitmap, cliprect, pri, 0, pri2, 1); @@ -1536,7 +1473,7 @@ void cave_state::get_sprite_info(int chip) if (m_videoregs[chip] == nullptr) return; - int spriteram_bankmax = m_spriteram[chip].bytes() / 0x4000; + const int spriteram_bankmax = m_spriteram[chip].bytes() / 0x4000; if (m_kludge == 3) /* mazinger metmqstr */ { @@ -1565,32 +1502,12 @@ void cave_state::device_post_load() // Poka Poka Satan: 3 screens * (1 Sprite chip + 1 Tilemap chip) -void cave_state::ppsatan_palette(palette_device &palette) +u32 cave_state::screen_update_ppsatan_core(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, int chip) { - cave_palette(palette); - - for (int chip = 0; chip < 3; chip++) - { - // Sprites: 0x987800 - 0x988fff - for (int color = 0; color < 0x40; color++) - for (int pen = 0; pen < 0x10; pen++) - m_palette_map[chip][(color << 8) | pen] = 0x7800/2 + ((color << 4) | pen); - - // Tiles: 0x980000 - 0x9803ff - for (int color = 0; color < 0x40; color++) - for (int pen = 0; pen < 0x10; pen++) - m_palette_map[chip][0x4000 + ((color << 4) | pen)] = ((color << 4) | pen); - } -} - -uint32_t cave_state::screen_update_ppsatan_core(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, int chip) -{ - set_pens(chip); - - m_blit.baseaddr = reinterpret_cast(bitmap.raw_pixptr(0)); + m_blit.baseaddr = reinterpret_cast(bitmap.raw_pixptr(0)); m_blit.line_offset = bitmap.rowbytes(); - m_blit.baseaddr_zbuf = reinterpret_cast(m_sprite_zbuf.raw_pixptr(0)); - m_blit.line_offset_zbuf = m_sprite_zbuf.rowbytes(); + m_blit.baseaddr_zbuf = reinterpret_cast(m_sprite_zbuf[chip].raw_pixptr(0)); + m_blit.line_offset_zbuf = m_sprite_zbuf[chip].rowbytes(); m_tiledim[chip] = m_vctrl[chip][1] & 0x2000; if (m_tiledim[chip] != m_old_tiledim[chip]) @@ -1599,7 +1516,7 @@ uint32_t cave_state::screen_update_ppsatan_core(screen_device &screen, bitmap_rg sprite_check(chip, screen, cliprect); - bitmap.fill(m_palette->pen_color(m_background_pen), cliprect); + bitmap.fill(m_palette[chip]->pen_color(m_background_pen[chip]), cliprect); for (int pri = 0; pri <= 3; pri++) // tile / sprite priority { @@ -1612,16 +1529,16 @@ uint32_t cave_state::screen_update_ppsatan_core(screen_device &screen, bitmap_rg return 0; } -uint32_t cave_state::screen_update_ppsatan_top(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) +u32 cave_state::screen_update_ppsatan_top(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { return screen_update_ppsatan_core(screen, bitmap, cliprect, 0); } -uint32_t cave_state::screen_update_ppsatan_left(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) +u32 cave_state::screen_update_ppsatan_left(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { machine().crosshair().get_crosshair(1).set_screen(&screen); return screen_update_ppsatan_core(screen, bitmap, cliprect, 1); } -uint32_t cave_state::screen_update_ppsatan_right(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) +u32 cave_state::screen_update_ppsatan_right(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { machine().crosshair().get_crosshair(0).set_screen(&screen); return screen_update_ppsatan_core(screen, bitmap, cliprect, 2);