diff --git a/scripts/target/mame/arcade.lua b/scripts/target/mame/arcade.lua index a01de413bd5..9cf25d0ec7b 100644 --- a/scripts/target/mame/arcade.lua +++ b/scripts/target/mame/arcade.lua @@ -2400,9 +2400,6 @@ files { MAME_DIR .. "src/mame/includes/88games.h", MAME_DIR .. "src/mame/video/88games.cpp", MAME_DIR .. "src/mame/drivers/ajax.cpp", - MAME_DIR .. "src/mame/includes/ajax.h", - MAME_DIR .. "src/mame/machine/ajax.cpp", - MAME_DIR .. "src/mame/video/ajax.cpp", MAME_DIR .. "src/mame/drivers/aliens.cpp", MAME_DIR .. "src/mame/includes/aliens.h", MAME_DIR .. "src/mame/video/aliens.cpp", @@ -2567,8 +2564,6 @@ files { MAME_DIR .. "src/mame/includes/pandoras.h", MAME_DIR .. "src/mame/video/pandoras.cpp", MAME_DIR .. "src/mame/drivers/parodius.cpp", - MAME_DIR .. "src/mame/includes/parodius.h", - MAME_DIR .. "src/mame/video/parodius.cpp", MAME_DIR .. "src/mame/drivers/pingpong.cpp", MAME_DIR .. "src/mame/includes/pingpong.h", MAME_DIR .. "src/mame/video/pingpong.cpp", diff --git a/src/mame/drivers/ajax.cpp b/src/mame/drivers/ajax.cpp index 2039f8c72d1..f7f39fec058 100644 --- a/src/mame/drivers/ajax.cpp +++ b/src/mame/drivers/ajax.cpp @@ -13,50 +13,433 @@ ***************************************************************************/ #include "emu.h" -#include "includes/ajax.h" -#include "includes/konamipt.h" -#include "cpu/z80/z80.h" +#include "includes/konamipt.h" +#include "video/k051316.h" +#include "video/k051960.h" +#include "video/k052109.h" +#include "video/konami_helper.h" + #include "cpu/m6809/hd6309.h" #include "cpu/m6809/konami.h" +#include "cpu/z80/z80.h" +#include "machine/gen_latch.h" +#include "machine/watchdog.h" +#include "sound/k007232.h" #include "sound/ymopm.h" + +#include "emupal.h" #include "speaker.h" -void ajax_state::ajax_main_map(address_map &map) +// configurable logging +#define LOG_LS138 (1U << 1) + +//#define VERBOSE (LOG_GENERAL | LOG_LS138) + +#include "logmacro.h" + +#define LOGLS138(...) LOGMASKED(LOG_LS138, __VA_ARGS__) + + +namespace { + +class ajax_state : public driver_device { - map(0x0000, 0x01c0).rw(FUNC(ajax_state::ls138_f10_r), FUNC(ajax_state::ls138_f10_w)); /* bankswitch + sound command + FIRQ command */ - map(0x0800, 0x0807).rw(m_k051960, FUNC(k051960_device::k051937_r), FUNC(k051960_device::k051937_w)); /* sprite control registers */ - map(0x0c00, 0x0fff).rw(m_k051960, FUNC(k051960_device::k051960_r), FUNC(k051960_device::k051960_w)); /* sprite RAM 2128SL at J7 */ - map(0x1000, 0x1fff).ram().w(m_palette, FUNC(palette_device::write8)).share("palette");/* palette */ - map(0x2000, 0x3fff).ram().share("share1"); /* shared RAM with the 6809 */ - map(0x4000, 0x5fff).ram(); /* RAM 6264L at K10 */ - map(0x6000, 0x7fff).bankr("mainbank"); /* banked ROM */ - map(0x8000, 0xffff).rom(); /* ROM N11 */ +public: + ajax_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_audiocpu(*this, "audiocpu"), + m_subcpu(*this, "sub"), + m_watchdog(*this, "watchdog"), + m_k007232(*this, "k007232_%u", 1U), + m_k052109(*this, "k052109"), + m_k051960(*this, "k051960"), + m_k051316(*this, "k051316"), + m_palette(*this, "palette"), + m_soundlatch(*this, "soundlatch"), + m_mainbank(*this, "mainbank"), + m_subbank(*this, "subbank"), + m_system(*this, "SYSTEM"), + m_pl(*this, "P%u", 1U), + m_dsw(*this, "DSW%u", 1U), + m_lamps(*this, "lamp%u", 0U) + { } + + void ajax(machine_config &config); + +protected: + virtual void machine_start() override; + virtual void machine_reset() override; + +private: + // devices + required_device m_maincpu; + required_device m_audiocpu; + required_device m_subcpu; + required_device m_watchdog; + required_device_array m_k007232; + required_device m_k052109; + required_device m_k051960; + required_device m_k051316; + required_device m_palette; + required_device m_soundlatch; + + required_memory_bank m_mainbank; + required_memory_bank m_subbank; + + required_ioport m_system; + required_ioport_array<2> m_pl; + required_ioport_array<3> m_dsw; + output_finder<8> m_lamps; + + // video-related + uint8_t m_priority = 0U; + + // misc + uint8_t m_firq_enable = 0; + + void sound_bank_w(uint8_t data); + uint8_t ls138_f10_r(offs_t offset); + void ls138_f10_w(offs_t offset, uint8_t data); + void sub_bankswitch_w(uint8_t data); + void main_bankswitch_w(uint8_t data); + void lamps_w(uint8_t data); + void k007232_extvol_w(uint8_t data); + uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + void volume_callback0(uint8_t data); + void volume_callback1(uint8_t data); + K051316_CB_MEMBER(zoom_callback); + K052109_CB_MEMBER(tile_callback); + K051960_CB_MEMBER(sprite_callback); + + void main_map(address_map &map); + void sound_map(address_map &map); + void sub_map(address_map &map); +}; + + +// video + +/*************************************************************************** + + Callbacks for the K052109 + +***************************************************************************/ + +K052109_CB_MEMBER(ajax_state::tile_callback) +{ + static const int layer_colorbase[] = { 1024 / 16, 0 / 16, 512 / 16 }; + + *code |= ((*color & 0x0f) << 8) | (bank << 12); + *color = layer_colorbase[layer] + ((*color & 0xf0) >> 4); } -void ajax_state::ajax_sub_map(address_map &map) + +/*************************************************************************** + + Callbacks for the K051960 + +***************************************************************************/ + +K051960_CB_MEMBER(ajax_state::sprite_callback) { - map(0x0000, 0x07ff).rw(m_k051316, FUNC(k051316_device::read), FUNC(k051316_device::write)); /* 051316 zoom/rotation layer */ - map(0x0800, 0x080f).w(m_k051316, FUNC(k051316_device::ctrl_w)); /* 051316 control registers */ - map(0x1000, 0x17ff).r(m_k051316, FUNC(k051316_device::rom_r)); /* 051316 (ROM test) */ - map(0x1800, 0x1800).w(FUNC(ajax_state::bankswitch_2_w)); /* bankswitch control */ - map(0x2000, 0x3fff).ram().share("share1"); /* shared RAM with the 052001 */ - map(0x4000, 0x7fff).rw(m_k052109, FUNC(k052109_device::read), FUNC(k052109_device::write)); /* video RAM + color RAM + video registers */ - map(0x8000, 0x9fff).bankr("subbank"); /* banked ROM */ - map(0xa000, 0xffff).rom().region("sub", 0x12000); /* ROM I16 */ + enum { sprite_colorbase = 256 / 16 }; + + /* priority bits: + 4 over zoom (0 = have priority) + 5 over B (0 = have priority) + 6 over A (1 = have priority) + never over F + */ + *priority = 0; + if ( *color & 0x10) *priority |= GFX_PMASK_4; // Z = 4 + if (~*color & 0x40) *priority |= GFX_PMASK_2; // A = 2 + if ( *color & 0x20) *priority |= GFX_PMASK_1; // B = 1 + *color = sprite_colorbase + (*color & 0x0f); } -void ajax_state::ajax_sound_map(address_map &map) + +/*************************************************************************** + + Callbacks for the K051316 + +***************************************************************************/ + +K051316_CB_MEMBER(ajax_state::zoom_callback) { - map(0x0000, 0x7fff).rom(); /* ROM F6 */ - map(0x8000, 0x87ff).ram(); /* RAM 2128SL at D16 */ - map(0x9000, 0x9000).w(FUNC(ajax_state::sound_bank_w)); /* 007232 bankswitch */ - map(0xa000, 0xa00d).rw(m_k007232_1, FUNC(k007232_device::read), FUNC(k007232_device::write)); /* 007232 registers (chip 1) */ - map(0xb000, 0xb00d).rw(m_k007232_2, FUNC(k007232_device::read), FUNC(k007232_device::write)); /* 007232 registers (chip 2) */ - map(0xb80c, 0xb80c).w(FUNC(ajax_state::k007232_extvol_w)); /* extra volume, goes to the 007232 w/ A11 */ - /* selecting a different latch for the external port */ - map(0xc000, 0xc001).rw("ymsnd", FUNC(ym2151_device::read), FUNC(ym2151_device::write)); /* YM2151 */ + enum { zoom_colorbase = 768 / 128 }; + + *code |= ((*color & 0x07) << 8); + *color = zoom_colorbase + ((*color & 0x08) >> 3); +} + + +/*************************************************************************** + + Display Refresh + +***************************************************************************/ + +uint32_t ajax_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +{ + m_k052109->tilemap_update(); + + screen.priority().fill(0, cliprect); + + bitmap.fill(m_palette->black_pen(), cliprect); + m_k052109->tilemap_draw(screen, bitmap, cliprect, 2, 0, 1); + if (m_priority) + { + // basic layer order is B, zoom, A, F + m_k051316->zoom_draw(screen, bitmap, cliprect, 0, 4); + m_k052109->tilemap_draw(screen, bitmap, cliprect, 1, 0, 2); + } + else + { + // basic layer order is B, A, zoom, F + m_k052109->tilemap_draw(screen, bitmap, cliprect, 1, 0, 2); + m_k051316->zoom_draw(screen, bitmap, cliprect, 0, 4); + } + m_k051960->k051960_sprites_draw(bitmap, cliprect, screen.priority(), -1, -1); + m_k052109->tilemap_draw(screen, bitmap, cliprect, 0, 0, 0); + return 0; +} + + +// machine + +/* main_bankswitch_w: + Handled by the LS273 Octal +ve edge trigger D-type Flip-flop with Reset at H11: + + Bit Description + --- ----------- + 7 MRB3 Selects ROM N11/N12 + 6 CCOUNT2 Coin Counter 2 (*) + 5 CCOUNT1 Coin Counter 1 (*) + 4 SRESET Slave CPU Reset? + 3 PRI0 Layer Priority Selector + 2 MRB2 \ + 1 MRB1 | ROM Bank Select + 0 MRB0 / + + (*) The Coin Counters are handled by the Konami Custom 051550 +*/ + +void ajax_state::main_bankswitch_w(uint8_t data) +{ + int bank = 0; + + // ROM select + if (!(data & 0x80)) + bank += 4; + + // coin counters + machine().bookkeeping().coin_counter_w(0, data & 0x20); + machine().bookkeeping().coin_counter_w(1, data & 0x40); + + // priority + m_priority = data & 0x08; + + // bank # (ROMS N11 and N12) + bank += (data & 0x07); + m_mainbank->set_entry(bank); +} + +/* lamps_w: + Handled by the LS273 Octal +ve edge trigger D-type Flip-flop with Reset at B9: + + Bit Description + --- ----------- + 7 LAMP7 & LAMP8 - Game over lamps (*) + 6 LAMP3 & LAMP4 - Game over lamps (*) + 5 LAMP1 - Start lamp (*) + 4 Control panel quaking (**) + 3 Joystick vibration (**) + 2 LAMP5 & LAMP6 - Power up lamps (*) + 1 LAMP2 - Super weapon lamp (*) + 0 unused + + (*) The Lamps are handled by the M54585P + (**)Vibration/Quaking handled by these chips: + Chip Location Description + ---- -------- ----------- + PS2401-4 B21 ??? + UPA1452H B22 ??? + LS74 H2 Dual +ve edge trigger D-type Flip-flop with SET and RESET + LS393 C20 Dual -ve edge trigger 4-bit Binary Ripple Counter with Resets +*/ + +void ajax_state::lamps_w(uint8_t data) +{ + m_lamps[1] = BIT(data, 1); // super weapon lamp + m_lamps[2] = BIT(data, 2); // power up lamps + m_lamps[5] = BIT(data, 2); // power up lamps + m_lamps[0] = BIT(data, 5); // start lamp + m_lamps[3] = BIT(data, 6); // game over lamps + m_lamps[6] = BIT(data, 6); // game over lamps + m_lamps[4] = BIT(data, 7); // game over lamps + m_lamps[7] = BIT(data, 7); // game over lamps +} + +/* ajax_ls138_f10: + The LS138 1-of-8 Decoder/Demultiplexer at F10 selects what to do: + + Address R/W Description + ------- --- ----------- + 0x0000 (r) ??? I think this read is because a CPU core bug + (w) 0x0000 NSFIRQ Trigger FIRQ on the M6809 + 0x0020 AFR Watchdog reset (handled by the 051550) + 0x0040 (w) SOUND Cause interrupt on the Z80 + 0x0080 (w) SOUNDDATA Sound code number + 0x00c0 (w) MBL1 Enables the LS273 at H11 (Banking + Coin counters) + 0x0100 (r) MBL2 Enables 2P Inputs reading + 0x0140 (w) MBL3 Enables the LS273 at B9 (Lamps + Vibration) + 0x0180 (r) MIO1 Enables 1P Inputs + DIPSW #1 & #2 reading + 0x01c0 (r) MIO2 Enables DIPSW #3 reading +*/ + +uint8_t ajax_state::ls138_f10_r(offs_t offset) +{ + int data = 0, index; + + switch ((offset & 0x01c0) >> 6) + { + case 0x00: // ??? + data = machine().rand(); + break; + case 0x04: // 2P inputs + data = m_pl[1]->read(); + break; + case 0x06: // 1P inputs + DIPSW #1 & #2 + index = offset & 0x01; + data = (offset & 0x02) ? m_dsw[index]->read() : index ? m_pl[0]->read() : m_system->read(); + break; + case 0x07: // DIPSW #3 + data = m_dsw[2]->read(); + break; + + default: + LOGLS138("%04x: (ls138_f10) read from an unknown address %02x\n", m_maincpu->pc(), offset); + } + + return data; +} + +void ajax_state::ls138_f10_w(offs_t offset, uint8_t data) +{ + switch ((offset & 0x01c0) >> 6) + { + case 0x00: // NSFIRQ + AFR + if (offset) + m_watchdog->watchdog_reset(); + else{ + if (m_firq_enable) // Cause interrupt on slave CPU + m_subcpu->set_input_line(M6809_FIRQ_LINE, HOLD_LINE); + } + break; + case 0x01: // Cause interrupt on audio CPU + m_audiocpu->set_input_line(0, HOLD_LINE); + break; + case 0x02: // Sound command number + m_soundlatch->write(data); + break; + case 0x03: // Bankswitch + coin counters + priority + main_bankswitch_w(data); + break; + case 0x05: // Lamps + Joystick vibration + Control panel quaking + lamps_w(data); + break; + + default: + LOGLS138("%04x: (ls138_f10) write %02x to an unknown address %02x\n", m_maincpu->pc(), data, offset); + } +} + +/* sub_bankswitch_w: + Handled by the LS273 Octal +ve edge trigger D-type Flip-flop with Reset at K14: + + Bit Description + --- ----------- + 7 unused + 6 RMRD Enable char ROM reading through the video RAM + 5 RVO enables 051316 wraparound + 4 FIRQST FIRQ control + 3 SRB3 \ + 2 SRB2 | + 1 SRB1 | ROM Bank Select + 0 SRB0 / +*/ + +void ajax_state::sub_bankswitch_w(uint8_t data) +{ + // enable char ROM reading through the video RAM + m_k052109->set_rmrd_line((data & 0x40) ? ASSERT_LINE : CLEAR_LINE); + + // bit 5 enables 051316 wraparound + m_k051316->wraparound_enable(data & 0x20); + + // FIRQ control + m_firq_enable = data & 0x10; + + // bank # (ROMS G16 and I16) + m_subbank->set_entry(data & 0x0f); +} + +void ajax_state::machine_start() +{ + uint8_t *main = memregion("maincpu")->base(); + uint8_t *sub = memregion("sub")->base(); + + m_lamps.resolve(); + m_mainbank->configure_entries(0, 4, &main[0x00000], 0x2000); + m_mainbank->configure_entries(4, 8, &main[0x10000], 0x2000); + m_subbank->configure_entries(0, 9, &sub[0x00000], 0x2000); + + save_item(NAME(m_priority)); + save_item(NAME(m_firq_enable)); +} + +void ajax_state::machine_reset() +{ + m_priority = 0; + m_firq_enable = 0; +} + +void ajax_state::main_map(address_map &map) +{ + map(0x0000, 0x01c0).rw(FUNC(ajax_state::ls138_f10_r), FUNC(ajax_state::ls138_f10_w)); // bankswitch + sound command + FIRQ command + map(0x0800, 0x0807).rw(m_k051960, FUNC(k051960_device::k051937_r), FUNC(k051960_device::k051937_w)); // sprite control registers + map(0x0c00, 0x0fff).rw(m_k051960, FUNC(k051960_device::k051960_r), FUNC(k051960_device::k051960_w)); // sprite RAM 2128SL at J7 + map(0x1000, 0x1fff).ram().w(m_palette, FUNC(palette_device::write8)).share("palette"); + map(0x2000, 0x3fff).ram().share("main_sub_ram"); // shared RAM with the 6809 + map(0x4000, 0x5fff).ram(); // RAM 6264L at K10 + map(0x6000, 0x7fff).bankr(m_mainbank); // banked ROM + map(0x8000, 0xffff).rom(); // ROM N11 +} + +void ajax_state::sub_map(address_map &map) +{ + map(0x0000, 0x07ff).rw(m_k051316, FUNC(k051316_device::read), FUNC(k051316_device::write)); // 051316 zoom/rotation layer + map(0x0800, 0x080f).w(m_k051316, FUNC(k051316_device::ctrl_w)); // 051316 control registers + map(0x1000, 0x17ff).r(m_k051316, FUNC(k051316_device::rom_r)); // 051316 (ROM test) + map(0x1800, 0x1800).w(FUNC(ajax_state::sub_bankswitch_w)); // bankswitch control + map(0x2000, 0x3fff).ram().share("main_sub_ram"); // shared RAM with the 052001 + map(0x4000, 0x7fff).rw(m_k052109, FUNC(k052109_device::read), FUNC(k052109_device::write)); // video RAM + color RAM + video registers + map(0x8000, 0x9fff).bankr(m_subbank); // banked ROM + map(0xa000, 0xffff).rom().region("sub", 0x12000); // ROM I16 +} + +void ajax_state::sound_map(address_map &map) +{ + map(0x0000, 0x7fff).rom(); // ROM F6 + map(0x8000, 0x87ff).ram(); // RAM 2128SL at D16 + map(0x9000, 0x9000).w(FUNC(ajax_state::sound_bank_w)); // 007232 bankswitch + map(0xa000, 0xa00d).rw(m_k007232[0], FUNC(k007232_device::read), FUNC(k007232_device::write)); + map(0xb000, 0xb00d).rw(m_k007232[1], FUNC(k007232_device::read), FUNC(k007232_device::write)); + map(0xb80c, 0xb80c).w(FUNC(ajax_state::k007232_extvol_w)); // extra volume, goes to the 007232 w/ A11 selecting a different latch for the external port + map(0xc000, 0xc001).rw("ymsnd", FUNC(ym2151_device::read), FUNC(ym2151_device::write)); // YM2151 map(0xe000, 0xe000).r(m_soundlatch, FUNC(generic_latch_8_device::read)); } @@ -64,7 +447,7 @@ void ajax_state::ajax_sound_map(address_map &map) static INPUT_PORTS_START( ajax ) PORT_START("DSW1") KONAMI_COINAGE_LOC(DEF_STR( Free_Play ), "No Coin B", SW1) - /* "No Coin B" = coins produce sound, but no effect on coin counter */ + // "No Coin B" = coins produce sound, but no effect on coin counter PORT_START("DSW2") PORT_DIPNAME( 0x03, 0x02, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:1,2") @@ -102,10 +485,10 @@ static INPUT_PORTS_START( ajax ) PORT_DIPSETTING( 0x00, "Inverted" ) PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_START("SYSTEM") /* COINSW & START */ + PORT_START("SYSTEM") // COINSW & START PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN3 ) /* service */ + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN3 ) // service PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_START1 ) PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_START2 ) PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED ) @@ -138,57 +521,55 @@ INPUT_PORTS_END void ajax_state::sound_bank_w(uint8_t data) { - int bank_A, bank_B; + // banks # for the 007232 (chip 1) + int bank_A = BIT(data, 1); + int bank_B = BIT(data, 0); + m_k007232[0]->set_bank(bank_A, bank_B); - /* banks # for the 007232 (chip 1) */ - bank_A = BIT(data, 1); - bank_B = BIT(data, 0); - m_k007232_1->set_bank(bank_A, bank_B); - - /* banks # for the 007232 (chip 2) */ + // banks # for the 007232 (chip 2) bank_A = ((data >> 4) & 0x03); bank_B = ((data >> 2) & 0x03); - m_k007232_2->set_bank(bank_A, bank_B); + m_k007232[1]->set_bank(bank_A, bank_B); } void ajax_state::volume_callback0(uint8_t data) { - m_k007232_1->set_volume(0, (data >> 4) * 0x11, 0); - m_k007232_1->set_volume(1, 0, (data & 0x0f) * 0x11); + m_k007232[0]->set_volume(0, (data >> 4) * 0x11, 0); + m_k007232[0]->set_volume(1, 0, (data & 0x0f) * 0x11); } void ajax_state::k007232_extvol_w(uint8_t data) { - /* channel A volume (mono) */ - m_k007232_2->set_volume(0, (data & 0x0f) * 0x11/2, (data & 0x0f) * 0x11/2); + // channel A volume (mono) + m_k007232[1]->set_volume(0, (data & 0x0f) * 0x11 / 2, (data & 0x0f) * 0x11 / 2); } void ajax_state::volume_callback1(uint8_t data) { - /* channel B volume/pan */ - m_k007232_2->set_volume(1, (data & 0x0f) * 0x11/2, (data >> 4) * 0x11/2); + // channel B volume/pan + m_k007232[1]->set_volume(1, (data & 0x0f) * 0x11 / 2, (data >> 4) * 0x11 / 2); } void ajax_state::ajax(machine_config &config) { - /* basic machine hardware */ - KONAMI(config, m_maincpu, XTAL(24'000'000)/2/4); /* 052001 12/4 MHz*/ - m_maincpu->set_addrmap(AS_PROGRAM, &ajax_state::ajax_main_map); + // basic machine hardware + KONAMI(config, m_maincpu, XTAL(24'000'000) / 2 / 4); // 052001 12/4 MHz + m_maincpu->set_addrmap(AS_PROGRAM, &ajax_state::main_map); - HD6309E(config, m_subcpu, 3000000); /* ? */ - m_subcpu->set_addrmap(AS_PROGRAM, &ajax_state::ajax_sub_map); + HD6309E(config, m_subcpu, 3000000); // ? + m_subcpu->set_addrmap(AS_PROGRAM, &ajax_state::sub_map); - Z80(config, m_audiocpu, 3579545); /* 3.58 MHz */ - m_audiocpu->set_addrmap(AS_PROGRAM, &ajax_state::ajax_sound_map); + Z80(config, m_audiocpu, 3579545); // 3.58 MHz + m_audiocpu->set_addrmap(AS_PROGRAM, &ajax_state::sound_map); config.set_maximum_quantum(attotime::from_hz(600)); WATCHDOG_TIMER(config, m_watchdog); - /* video hardware */ + // video hardware screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); - screen.set_raw(XTAL(24'000'000)/3, 528, 108, 412, 256, 16, 240); + screen.set_raw(XTAL(24'000'000) / 3, 528, 108, 412, 256, 16, 240); // 6MHz dotclock is more realistic, however needs drawing updates. replace when ready // screen.set_raw(XTAL(24'000'000)/4, 396, hbend, hbstart, 256, 16, 240); screen.set_screen_update(FUNC(ajax_state::screen_update)); @@ -214,7 +595,7 @@ void ajax_state::ajax(machine_config &config) m_k051316->set_bpp(7); m_k051316->set_zoom_callback(FUNC(ajax_state::zoom_callback)); - /* sound hardware */ + // sound hardware SPEAKER(config, "lspeaker").front_left(); SPEAKER(config, "rspeaker").front_right(); @@ -222,23 +603,23 @@ void ajax_state::ajax(machine_config &config) YM2151(config, "ymsnd", 3579545).add_route(0, "lspeaker", 1.0).add_route(1, "rspeaker", 1.0); - K007232(config, m_k007232_1, 3579545); - m_k007232_1->port_write().set(FUNC(ajax_state::volume_callback0)); - m_k007232_1->add_route(0, "lspeaker", 0.20); - m_k007232_1->add_route(0, "rspeaker", 0.20); - m_k007232_1->add_route(1, "lspeaker", 0.20); - m_k007232_1->add_route(1, "rspeaker", 0.20); + K007232(config, m_k007232[0], 3579545); + m_k007232[0]->port_write().set(FUNC(ajax_state::volume_callback0)); + m_k007232[0]->add_route(0, "lspeaker", 0.20); + m_k007232[0]->add_route(0, "rspeaker", 0.20); + m_k007232[0]->add_route(1, "lspeaker", 0.20); + m_k007232[0]->add_route(1, "rspeaker", 0.20); - K007232(config, m_k007232_2, 3579545); - m_k007232_2->port_write().set(FUNC(ajax_state::volume_callback1)); - m_k007232_2->add_route(0, "lspeaker", 0.50); - m_k007232_2->add_route(1, "rspeaker", 0.50); + K007232(config, m_k007232[1], 3579545); + m_k007232[1]->port_write().set(FUNC(ajax_state::volume_callback1)); + m_k007232[1]->add_route(0, "lspeaker", 0.50); + m_k007232[1]->add_route(1, "rspeaker", 0.50); } /* - This set is using 27512 Roms on a sub-board instead of Mask roms + This set is using 27512 ROMs on a sub-board instead of Mask ROMs -- info from Phil Morris These are normally on the main board in the form of large mask ROMs, but at one stage @@ -248,18 +629,18 @@ void ajax_state::ajax(machine_config &config) */ ROM_START( ajax ) - ROM_REGION( 0x20000, "maincpu", 0 ) /* 052001 code */ - ROM_LOAD( "770_m01.n11", 0x00000, 0x10000, CRC(4a64e53a) SHA1(acd249bfcb5f248c41b3e40c7c1bce1b8c645d3a) ) /* last 0x8000 fixed, first 0x8000 banked */ - ROM_LOAD( "770_l02.n12", 0x10000, 0x10000, CRC(ad7d592b) SHA1(c75d9696b16de231c479379dd02d33fe54021d88) ) /* banked ROM */ + ROM_REGION( 0x20000, "maincpu", 0 ) // 052001 code + ROM_LOAD( "770_m01.n11", 0x00000, 0x10000, CRC(4a64e53a) SHA1(acd249bfcb5f248c41b3e40c7c1bce1b8c645d3a) ) // last 0x8000 fixed, first 0x8000 banked + ROM_LOAD( "770_l02.n12", 0x10000, 0x10000, CRC(ad7d592b) SHA1(c75d9696b16de231c479379dd02d33fe54021d88) ) // banked ROM - ROM_REGION( 0x18000, "sub", 0 ) /* 96k */ - ROM_LOAD( "770_f04.g16", 0x00000, 0x10000, CRC(e0e4ec9c) SHA1(15ae09c3ad67ec626d8178ec1417f0c57ca4eca4) ) /* banked ROM */ - ROM_LOAD( "770_l05.i16", 0x10000, 0x08000, CRC(ed64fbb2) SHA1(429046edaf1299afa7fb9c385b4ef0c244ec2409) ) /* last 0x6000 fixed, first 0x2000 banked */ + ROM_REGION( 0x18000, "sub", 0 ) + ROM_LOAD( "770_f04.g16", 0x00000, 0x10000, CRC(e0e4ec9c) SHA1(15ae09c3ad67ec626d8178ec1417f0c57ca4eca4) ) // banked ROM + ROM_LOAD( "770_l05.i16", 0x10000, 0x08000, CRC(ed64fbb2) SHA1(429046edaf1299afa7fb9c385b4ef0c244ec2409) ) // last 0x6000 fixed, first 0x2000 banked - ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for the SOUND CPU */ + ROM_REGION( 0x08000, "audiocpu", 0 ) ROM_LOAD( "770_h03.f16", 0x00000, 0x08000, CRC(2ffd2afc) SHA1(ca2ef684f87bcf9b70b3ec66ec80685edaf04b9b) ) - ROM_REGION( 0x080000, "k052109", 0 ) /* tiles */ + ROM_REGION( 0x080000, "k052109", 0 ) // tiles ROM_LOAD32_BYTE( "770c13-a.f3", 0x000000, 0x010000, CRC(4ef6fff2) SHA1(0a2953f6907738b795d96184329431539386a463) ) ROM_LOAD32_BYTE( "770c13-c.f4", 0x000001, 0x010000, CRC(97ffbab6) SHA1(97d9a39600eed918e12908a9abed0d4161c20ef6) ) ROM_LOAD32_BYTE( "770c12-a.f5", 0x000002, 0x010000, CRC(6c0ade68) SHA1(35e4548a37e19210c767ef2ed4c514dbde6806c2) ) @@ -269,7 +650,7 @@ ROM_START( ajax ) ROM_LOAD32_BYTE( "770c12-b.e5", 0x040002, 0x010000, CRC(5f221cc6) SHA1(9a7a9c7853a3b582c4034b773cef08aee5391d6e) ) ROM_LOAD32_BYTE( "770c12-d.e6", 0x040003, 0x010000, CRC(f1edb2f4) SHA1(3e66cc711e25cbf6e6a747d43a9efec0710d5b7a) ) - ROM_REGION( 0x100000, "k051960", 0 ) /* sprites */ + ROM_REGION( 0x100000, "k051960", 0 ) // sprites ROM_LOAD32_BYTE( "770c09-a.f8", 0x000000, 0x010000, CRC(76690fb8) SHA1(afe267a37b65d63d3765dc3b88d8a8262446f786) ) ROM_LOAD32_BYTE( "770c09-e.f9", 0x000001, 0x010000, CRC(17b482c9) SHA1(3535197956f5bf5b564fec1ddbb3e3ea3bf1f7bd) ) ROM_LOAD32_BYTE( "770c08-a.f10", 0x000002, 0x010000, CRC(efd29a56) SHA1(2a9f138d1242a35162a3f092b0343dff899e3b83) ) @@ -287,20 +668,20 @@ ROM_START( ajax ) ROM_LOAD32_BYTE( "770c08-d.c10", 0x0c0002, 0x010000, CRC(91591777) SHA1(53f416a51f7075f070168bced7b6f925f54c7b84) ) ROM_LOAD32_BYTE( "770c08-h.c11", 0x0c0003, 0x010000, CRC(d97d4b15) SHA1(e3d7d7adeec8c8c808acb9f84641fd3a6bf249be) ) - ROM_REGION( 0x080000, "k051316", 0 ) /* zoom/rotate */ + ROM_REGION( 0x080000, "k051316", 0 ) // zoom/rotate ROM_LOAD( "770c06.f4", 0x000000, 0x040000, CRC(d0c592ee) SHA1(c1be73dd259f2779d715659b177e47513776a0d4) ) ROM_LOAD( "770c07.h4", 0x040000, 0x040000, CRC(0b399fb1) SHA1(fbe26f9aa9a655d08bebcdd79719d35134ca4dd5) ) ROM_REGION( 0x0200, "proms", 0 ) - ROM_LOAD( "63s241.j11", 0x0000, 0x0200, CRC(9bdd719f) SHA1(de98e562080a97714047a8ad17abc6662c188897) ) /* priority encoder (not used) */ + ROM_LOAD( "63s241.j11", 0x0000, 0x0200, CRC(9bdd719f) SHA1(de98e562080a97714047a8ad17abc6662c188897) ) // priority encoder (not used) - ROM_REGION( 0x040000, "k007232_1", 0 ) /* 007232 data (chip 1) */ + ROM_REGION( 0x040000, "k007232_1", 0 ) ROM_LOAD( "770c10-a.a7", 0x000000, 0x010000, CRC(e45ec094) SHA1(540c56e1d778e6082db23aa3da64f6179b1f3635) ) ROM_LOAD( "770c10-b.a6", 0x010000, 0x010000, CRC(349db7d3) SHA1(210da067038abeb021a77b3bf2664c9a49b3410a) ) ROM_LOAD( "770c10-c.a5", 0x020000, 0x010000, CRC(71cb1f05) SHA1(57399806746b659f52114fb7bd4e11a7992a2c5d) ) ROM_LOAD( "770c10-d.a4", 0x030000, 0x010000, CRC(e8ab1844) SHA1(dc22c4d11d6396a051398ba9ec6380aa3f856e71) ) - ROM_REGION( 0x080000, "k007232_2", 0 ) /* 007232 data (chip 2) */ + ROM_REGION( 0x080000, "k007232_2", 0 ) ROM_LOAD( "770c11-a.c6", 0x000000, 0x010000, CRC(8cccd9e0) SHA1(73e50a896ed212462046b7bfa04aad5e266425ca) ) ROM_LOAD( "770c11-b.c5", 0x010000, 0x010000, CRC(0af2fedd) SHA1(038189210a73f668a0d913ff2dfc4ffa2e6bd5f4) ) ROM_LOAD( "770c11-c.c4", 0x020000, 0x010000, CRC(7471f24a) SHA1(04d7a69ddc01017a773485fa891711d94c8ad47c) ) @@ -312,73 +693,75 @@ ROM_START( ajax ) ROM_END ROM_START( typhoon ) - ROM_REGION( 0x20000, "maincpu", 0 ) /* 052001 code */ - ROM_LOAD( "770_k01.n11", 0x00000, 0x10000, CRC(5ba74a22) SHA1(897d3309f2efb3bfa56e86581ee4a492e656788c) ) /* last 0x8000 fixed, first 0x8000 banked */ - ROM_LOAD( "770_k02.n12", 0x10000, 0x10000, CRC(3bcf782a) SHA1(4b6127bced0b2519f8ad30587f32588a16368071) ) /* banked ROM */ + ROM_REGION( 0x20000, "maincpu", 0 ) // 052001 code + ROM_LOAD( "770_k01.n11", 0x00000, 0x10000, CRC(5ba74a22) SHA1(897d3309f2efb3bfa56e86581ee4a492e656788c) ) // last 0x8000 fixed, first 0x8000 banked + ROM_LOAD( "770_k02.n12", 0x10000, 0x10000, CRC(3bcf782a) SHA1(4b6127bced0b2519f8ad30587f32588a16368071) ) // banked ROM - ROM_REGION( 0x18000, "sub", 0 ) /* 96k */ - ROM_LOAD( "770_f04.g16", 0x00000, 0x10000, CRC(e0e4ec9c) SHA1(15ae09c3ad67ec626d8178ec1417f0c57ca4eca4) ) /* banked ROM */ - ROM_LOAD( "770_k05.i16", 0x10000, 0x08000, CRC(0f1bebbb) SHA1(012a8867ee0febaaadd7bcbc91e462bda5d3a411) ) /* last 0x6000 fixed, first 0x2000 banked */ + ROM_REGION( 0x18000, "sub", 0 ) + ROM_LOAD( "770_f04.g16", 0x00000, 0x10000, CRC(e0e4ec9c) SHA1(15ae09c3ad67ec626d8178ec1417f0c57ca4eca4) ) // banked ROM + ROM_LOAD( "770_k05.i16", 0x10000, 0x08000, CRC(0f1bebbb) SHA1(012a8867ee0febaaadd7bcbc91e462bda5d3a411) ) // last 0x6000 fixed, first 0x2000 banked - ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for the SOUND CPU */ + ROM_REGION( 0x08000, "audiocpu", 0 ) ROM_LOAD( "770_h03.f16", 0x00000, 0x08000, CRC(2ffd2afc) SHA1(ca2ef684f87bcf9b70b3ec66ec80685edaf04b9b) ) - ROM_REGION( 0x080000, "k052109", 0 ) /* tiles */ + ROM_REGION( 0x080000, "k052109", 0 ) // tiles ROM_LOAD32_WORD( "770c13.n22", 0x000000, 0x040000, CRC(b859ca4e) SHA1(f58678d503683f78cca0d5ed2d79f6f68ab3495a) ) ROM_LOAD32_WORD( "770c12.k22", 0x000002, 0x040000, CRC(50d14b72) SHA1(e3ff4a5aeefa6c10b5f7fec18297948b7c5acfdf) ) - ROM_REGION( 0x100000, "k051960", 0 ) /* sprites */ + ROM_REGION( 0x100000, "k051960", 0 ) // sprites ROM_LOAD32_WORD( "770c09.n4", 0x000000, 0x080000, CRC(1ab4a7ff) SHA1(fa007b41027f95d29d2a9f931a2fe235844db637) ) ROM_LOAD32_WORD( "770c08.k4", 0x000002, 0x080000, CRC(a8e80586) SHA1(0401f59baa691905287cef94427f39e0c3f0adc6) ) - ROM_REGION( 0x080000, "k051316", 0 ) /* zoom/rotate */ + ROM_REGION( 0x080000, "k051316", 0 ) // zoom/rotate ROM_LOAD( "770c06.f4", 0x000000, 0x040000, CRC(d0c592ee) SHA1(c1be73dd259f2779d715659b177e47513776a0d4) ) ROM_LOAD( "770c07.h4", 0x040000, 0x040000, CRC(0b399fb1) SHA1(fbe26f9aa9a655d08bebcdd79719d35134ca4dd5) ) ROM_REGION( 0x0200, "proms", 0 ) - ROM_LOAD( "63s241.j11", 0x0000, 0x0200, CRC(9bdd719f) SHA1(de98e562080a97714047a8ad17abc6662c188897) ) /* priority encoder (not used) */ + ROM_LOAD( "63s241.j11", 0x0000, 0x0200, CRC(9bdd719f) SHA1(de98e562080a97714047a8ad17abc6662c188897) ) // priority encoder (not used) - ROM_REGION( 0x040000, "k007232_1", 0 ) /* 007232 data (chip 1) */ + ROM_REGION( 0x040000, "k007232_1", 0 ) ROM_LOAD( "770c10", 0x000000, 0x040000, CRC(7fac825f) SHA1(581522d7a02dad16d2803ff344b4db133f767e6b) ) - ROM_REGION( 0x080000, "k007232_2", 0 ) /* 007232 data (chip 2) */ + ROM_REGION( 0x080000, "k007232_2", 0 ) ROM_LOAD( "770c11", 0x000000, 0x080000, CRC(299a615a) SHA1(29cdcc21998c72f4cf311792b904b79bde236bab) ) ROM_END ROM_START( ajaxj ) - ROM_REGION( 0x20000, "maincpu", 0 ) /* 052001 code */ - ROM_LOAD( "770_l01.n11", 0x00000, 0x10000, CRC(7cea5274) SHA1(8e3b2b11a8189e3a1703b3b4b453fbb386f5537f) ) /* last 0x8000 fixed, first 0x8000 banked */ - ROM_LOAD( "770_l02.n12", 0x10000, 0x10000, CRC(ad7d592b) SHA1(c75d9696b16de231c479379dd02d33fe54021d88) ) /* banked ROM */ + ROM_REGION( 0x20000, "maincpu", 0 ) // 052001 code + ROM_LOAD( "770_l01.n11", 0x00000, 0x10000, CRC(7cea5274) SHA1(8e3b2b11a8189e3a1703b3b4b453fbb386f5537f) ) // last 0x8000 fixed, first 0x8000 banked + ROM_LOAD( "770_l02.n12", 0x10000, 0x10000, CRC(ad7d592b) SHA1(c75d9696b16de231c479379dd02d33fe54021d88) ) // banked ROM - ROM_REGION( 0x18000, "sub", 0 ) /* 96k */ - ROM_LOAD( "770_f04.g16", 0x00000, 0x10000, CRC(e0e4ec9c) SHA1(15ae09c3ad67ec626d8178ec1417f0c57ca4eca4) ) /* banked ROM */ - ROM_LOAD( "770_l05.i16", 0x10000, 0x8000, CRC(ed64fbb2) SHA1(429046edaf1299afa7fb9c385b4ef0c244ec2409) ) /* last 0x6000 fixed, first 0x2000 banked */ + ROM_REGION( 0x18000, "sub", 0 ) + ROM_LOAD( "770_f04.g16", 0x00000, 0x10000, CRC(e0e4ec9c) SHA1(15ae09c3ad67ec626d8178ec1417f0c57ca4eca4) ) // banked ROM + ROM_LOAD( "770_l05.i16", 0x10000, 0x08000, CRC(ed64fbb2) SHA1(429046edaf1299afa7fb9c385b4ef0c244ec2409) ) // last 0x6000 fixed, first 0x2000 banked - ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for the SOUND CPU */ + ROM_REGION( 0x08000, "audiocpu", 0 ) ROM_LOAD( "770_f03.f16", 0x00000, 0x08000, CRC(3fe914fd) SHA1(c691920402bd859e2bf765084704a8bfad302cfa) ) - ROM_REGION( 0x080000, "k052109", 0 ) /* tiles */ + ROM_REGION( 0x080000, "k052109", 0 ) // tiles ROM_LOAD32_WORD( "770c13.n22", 0x000000, 0x040000, CRC(b859ca4e) SHA1(f58678d503683f78cca0d5ed2d79f6f68ab3495a) ) ROM_LOAD32_WORD( "770c12.k22", 0x000002, 0x040000, CRC(50d14b72) SHA1(e3ff4a5aeefa6c10b5f7fec18297948b7c5acfdf) ) - ROM_REGION( 0x100000, "k051960", 0 ) /* sprites */ + ROM_REGION( 0x100000, "k051960", 0 ) // sprites ROM_LOAD32_WORD( "770c09.n4", 0x000000, 0x080000, CRC(1ab4a7ff) SHA1(fa007b41027f95d29d2a9f931a2fe235844db637) ) ROM_LOAD32_WORD( "770c08.k4", 0x000002, 0x080000, CRC(a8e80586) SHA1(0401f59baa691905287cef94427f39e0c3f0adc6) ) - ROM_REGION( 0x080000, "k051316", 0 ) /* zoom/rotate */ + ROM_REGION( 0x080000, "k051316", 0 ) // zoom/rotate ROM_LOAD( "770c06.f4", 0x000000, 0x040000, CRC(d0c592ee) SHA1(c1be73dd259f2779d715659b177e47513776a0d4) ) ROM_LOAD( "770c07.h4", 0x040000, 0x040000, CRC(0b399fb1) SHA1(fbe26f9aa9a655d08bebcdd79719d35134ca4dd5) ) ROM_REGION( 0x0200, "proms", 0 ) - ROM_LOAD( "63s241.j11", 0x0000, 0x0200, CRC(9bdd719f) SHA1(de98e562080a97714047a8ad17abc6662c188897) ) /* priority encoder (not used) */ + ROM_LOAD( "63s241.j11", 0x0000, 0x0200, CRC(9bdd719f) SHA1(de98e562080a97714047a8ad17abc6662c188897) ) // priority encoder (not used) - ROM_REGION( 0x040000, "k007232_1", 0 ) /* 007232 data (chip 1) */ + ROM_REGION( 0x040000, "k007232_1", 0 ) ROM_LOAD( "770c10", 0x000000, 0x040000, CRC(7fac825f) SHA1(581522d7a02dad16d2803ff344b4db133f767e6b) ) - ROM_REGION( 0x080000, "k007232_2", 0 ) /* 007232 data (chip 2) */ + ROM_REGION( 0x080000, "k007232_2", 0 ) ROM_LOAD( "770c11", 0x000000, 0x080000, CRC(299a615a) SHA1(29cdcc21998c72f4cf311792b904b79bde236bab) ) ROM_END +} // anonymous namespace + GAME( 1987, ajax, 0, ajax, ajax, ajax_state, empty_init, ROT90, "Konami", "Ajax", MACHINE_SUPPORTS_SAVE ) GAME( 1987, typhoon, ajax, ajax, ajax, ajax_state, empty_init, ROT90, "Konami", "Typhoon", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/drivers/parodius.cpp b/src/mame/drivers/parodius.cpp index d27d80ab357..bd59070b59d 100644 --- a/src/mame/drivers/parodius.cpp +++ b/src/mame/drivers/parodius.cpp @@ -9,89 +9,218 @@ ***************************************************************************/ #include "emu.h" -#include "includes/parodius.h" -#include "includes/konamipt.h" +#include "includes/konamipt.h" +#include "video/k052109.h" +#include "video/k053244_k053245.h" +#include "video/k053251.h" +#include "video/konami_helper.h" + +#include "cpu/m6809/konami.h" // for the callback and the firq irq definition #include "cpu/z80/z80.h" +#include "machine/bankdev.h" #include "machine/watchdog.h" #include "sound/k053260.h" #include "sound/ymopm.h" + #include "emupal.h" +#include "screen.h" #include "speaker.h" -void parodius_state::parodius_videobank_w(uint8_t data) +namespace { + +class parodius_state : public driver_device +{ +public: + parodius_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_audiocpu(*this, "audiocpu"), + m_bank0000(*this, "bank0000"), + m_k052109(*this, "k052109"), + m_k053245(*this, "k053245"), + m_k053251(*this, "k053251"), + m_mainbank(*this, "mainbank"), + m_view_2000(*this, "view_2000") + { } + + void parodius(machine_config &config); + +protected: + virtual void machine_start() override; + virtual void machine_reset() override; + +private: + // devices + required_device m_maincpu; + required_device m_audiocpu; + required_device m_bank0000; + required_device m_k052109; + required_device m_k053245; + required_device m_k053251; + + required_memory_bank m_mainbank; + memory_view m_view_2000; + + // video-related + uint8_t m_layer_colorbase[3]{}; + uint8_t m_sprite_colorbase = 0; + int m_layerpri[3]{}; + + // misc + emu_timer *m_nmi_timer = nullptr; + + void videobank_w(uint8_t data); + void _3fc0_w(uint8_t data); + void sh_irqtrigger_w(uint8_t data); + void sound_arm_nmi_w(uint8_t data); + TIMER_CALLBACK_MEMBER(nmi_timer); + uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + K05324X_CB_MEMBER(sprite_callback); + K052109_CB_MEMBER(tile_callback); + void banking_callback(uint8_t data); + + void bank0000_map(address_map &map); + void main_map(address_map &map); + void sound_map(address_map &map); +}; + + +// video + +/*************************************************************************** + + Callbacks for the K052109 + +***************************************************************************/ + +K052109_CB_MEMBER(parodius_state::tile_callback) +{ + *code |= ((*color & 0x03) << 8) | ((*color & 0x10) << 6) | ((*color & 0x0c) << 9) | (bank << 13); + *color = m_layer_colorbase[layer] + ((*color & 0xe0) >> 5); +} + +/*************************************************************************** + + Callbacks for the K053245 + +***************************************************************************/ + +K05324X_CB_MEMBER(parodius_state::sprite_callback) +{ + int pri = 0x20 | ((*color & 0x60) >> 2); + if (pri <= m_layerpri[2]) + *priority = 0; + else if (pri > m_layerpri[2] && pri <= m_layerpri[1]) + *priority = 0xf0; + else if (pri > m_layerpri[1] && pri <= m_layerpri[0]) + *priority = 0xf0 | 0xcc; + else + *priority = 0xf0 | 0xcc | 0xaa; + + *color = m_sprite_colorbase + (*color & 0x1f); +} + + +/*************************************************************************** + + Start the video hardware emulation. + +***************************************************************************/ + +uint32_t parodius_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +{ + int bg_colorbase = m_k053251->get_palette_index(k053251_device::CI0); + m_sprite_colorbase = m_k053251->get_palette_index(k053251_device::CI1); + m_layer_colorbase[0] = m_k053251->get_palette_index(k053251_device::CI2); + m_layer_colorbase[1] = m_k053251->get_palette_index(k053251_device::CI4); + m_layer_colorbase[2] = m_k053251->get_palette_index(k053251_device::CI3); + + m_k052109->tilemap_update(); + + int layer[3]; + + layer[0] = 0; + m_layerpri[0] = m_k053251->get_priority(k053251_device::CI2); + layer[1] = 1; + m_layerpri[1] = m_k053251->get_priority(k053251_device::CI4); + layer[2] = 2; + m_layerpri[2] = m_k053251->get_priority(k053251_device::CI3); + + konami_sortlayers3(layer, m_layerpri); + + screen.priority().fill(0, cliprect); + bitmap.fill(16 * bg_colorbase, cliprect); + m_k052109->tilemap_draw(screen, bitmap, cliprect, layer[0], 0, 1); + m_k052109->tilemap_draw(screen, bitmap, cliprect, layer[1], 0, 2); + m_k052109->tilemap_draw(screen, bitmap, cliprect, layer[2], 0, 4); + + m_k053245->sprites_draw(bitmap, cliprect, screen.priority()); + return 0; +} + + +// machine + +void parodius_state::videobank_w(uint8_t data) { if (data & 0xf8) - logerror("%04x: videobank = %02x\n",m_maincpu->pc(),data); + logerror("%04x: videobank = %02x\n", m_maincpu->pc(), data); - /* bit 0 = select palette or work RAM at 0000-07ff */ - /* bit 1 = select 052109 or 053245 at 2000-27ff */ - /* bit 2 = select palette bank 0 or 1 */ + // bit 0 = select palette or work RAM at 0000-07ff + // bit 1 = select 052109 or 053245 at 2000-27ff + // bit 2 = select palette bank 0 or 1 if (data & 1) m_bank0000->set_bank(2 + ((data & 4) >> 2)); else m_bank0000->set_bank(0); - m_bank2000->set_bank((data & 2) >> 1); + m_view_2000.select((data & 2) >> 1); } -void parodius_state::parodius_3fc0_w(uint8_t data) +void parodius_state::_3fc0_w(uint8_t data) { if ((data & 0xf4) != 0x10) - logerror("%04x: 3fc0 = %02x\n",m_maincpu->pc(),data); + logerror("%04x: 3fc0 = %02x\n", m_maincpu->pc(), data); - /* bit 0/1 = coin counters */ + // bit 0/1 = coin counters machine().bookkeeping().coin_counter_w(0, data & 0x01); machine().bookkeeping().coin_counter_w(1, data & 0x02); - /* bit 3 = enable char ROM reading through the video RAM */ + // bit 3 = enable char ROM reading through the video RAM m_k052109->set_rmrd_line((data & 0x08) ? ASSERT_LINE : CLEAR_LINE); - /* other bits unknown */ + // other bits unknown } -void parodius_state::parodius_sh_irqtrigger_w(uint8_t data) +void parodius_state::sh_irqtrigger_w(uint8_t data) { m_audiocpu->set_input_line_and_vector(0, HOLD_LINE, 0xff); // Z80 } -#if 0 -void parodius_state::sound_nmi_callback( int param ) +TIMER_CALLBACK_MEMBER(parodius_state::nmi_timer) { - m_audiocpu->set_input_line(INPUT_LINE_NMI, ( m_nmi_enabled ) ? CLEAR_LINE : ASSERT_LINE ); - - nmi_enabled = 0; -} -#endif - -void parodius_state::device_timer(emu_timer &timer, device_timer_id id, int param) -{ - switch (id) - { - case TIMER_NMI: - m_audiocpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE); - break; - default: - throw emu_fatalerror("Unknown id in parodius_state::device_timer"); - } + m_audiocpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE); } void parodius_state::sound_arm_nmi_w(uint8_t data) { m_audiocpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE); - timer_set(attotime::from_usec(50), TIMER_NMI); /* kludge until the K053260 is emulated correctly */ + m_nmi_timer->adjust(attotime::from_usec(50)); // kludge until the K053260 is emulated correctly } /********************************************/ -void parodius_state::parodius_map(address_map &map) +void parodius_state::main_map(address_map &map) { map(0x0000, 0x07ff).m(m_bank0000, FUNC(address_map_bank_device::amap8)); map(0x0800, 0x1fff).ram(); map(0x2000, 0x5fff).rw(m_k052109, FUNC(k052109_device::read), FUNC(k052109_device::write)); - map(0x2000, 0x27ff).m(m_bank2000, FUNC(address_map_bank_device::amap8)); + map(0x2000, 0x27ff).view(m_view_2000); + m_view_2000[0](0x2000, 0x27ff).rw(m_k052109, FUNC(k052109_device::read), FUNC(k052109_device::write)); + m_view_2000[1](0x2000, 0x27ff).rw(m_k053245, FUNC(k05324x_device::k053245_r), FUNC(k05324x_device::k053245_w)); map(0x3f8c, 0x3f8c).portr("P1"); map(0x3f8d, 0x3f8d).portr("P2"); map(0x3f8e, 0x3f8e).portr("DSW3"); @@ -99,11 +228,11 @@ void parodius_state::parodius_map(address_map &map) map(0x3f90, 0x3f90).portr("DSW2"); map(0x3fa0, 0x3faf).rw(m_k053245, FUNC(k05324x_device::k053244_r), FUNC(k05324x_device::k053244_w)); map(0x3fb0, 0x3fbf).w(m_k053251, FUNC(k053251_device::write)); - map(0x3fc0, 0x3fc0).r("watchdog", FUNC(watchdog_timer_device::reset_r)).w(FUNC(parodius_state::parodius_3fc0_w)); - map(0x3fc4, 0x3fc4).w(FUNC(parodius_state::parodius_videobank_w)); - map(0x3fc8, 0x3fc8).w(FUNC(parodius_state::parodius_sh_irqtrigger_w)); + map(0x3fc0, 0x3fc0).r("watchdog", FUNC(watchdog_timer_device::reset_r)).w(FUNC(parodius_state::_3fc0_w)); + map(0x3fc4, 0x3fc4).w(FUNC(parodius_state::videobank_w)); + map(0x3fc8, 0x3fc8).w(FUNC(parodius_state::sh_irqtrigger_w)); map(0x3fcc, 0x3fcd).rw("k053260", FUNC(k053260_device::main_read), FUNC(k053260_device::main_write)); - map(0x6000, 0x9fff).bankr("bank1"); /* banked ROM */ + map(0x6000, 0x9fff).bankr(m_mainbank); // banked ROM map(0xa000, 0xffff).rom().region("maincpu", 0x3a000); } @@ -113,13 +242,7 @@ void parodius_state::bank0000_map(address_map &map) map(0x1000, 0x1fff).ram().w("palette", FUNC(palette_device::write8)).share("palette"); } -void parodius_state::bank2000_map(address_map &map) -{ - map(0x0000, 0x07ff).rw(m_k052109, FUNC(k052109_device::read), FUNC(k052109_device::write)); - map(0x0800, 0x0fff).rw(m_k053245, FUNC(k05324x_device::k053245_r), FUNC(k05324x_device::k053245_w)); -} - -void parodius_state::parodius_sound_map(address_map &map) +void parodius_state::sound_map(address_map &map) { map(0x0000, 0xefff).rom(); map(0xf000, 0xf7ff).ram(); @@ -143,7 +266,7 @@ static INPUT_PORTS_START( parodius ) PORT_START("DSW1") KONAMI_COINAGE_LOC(DEF_STR( Free_Play ), "No Coin B", SW1) - /* "No Coin B" = coins produce sound, but no effect on coin counter */ + // "No Coin B" = coins produce sound, but no effect on coin counter PORT_START("DSW2") PORT_DIPNAME( 0x03, 0x02, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:1,2") @@ -193,8 +316,10 @@ INPUT_PORTS_END void parodius_state::machine_start() { - membank("bank1")->configure_entries(0, 16, memregion("maincpu")->base(), 0x4000); - membank("bank1")->set_entry(0); + m_mainbank->configure_entries(0, 16, memregion("maincpu")->base(), 0x4000); + m_mainbank->set_entry(0); + + m_nmi_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(parodius_state::nmi_timer), this)); save_item(NAME(m_sprite_colorbase)); save_item(NAME(m_layer_colorbase)); @@ -211,7 +336,6 @@ void parodius_state::machine_reset() m_sprite_colorbase = 0; m_bank0000->set_bank(0); - m_bank2000->set_bank(0); } void parodius_state::banking_callback(uint8_t data) @@ -219,31 +343,30 @@ void parodius_state::banking_callback(uint8_t data) if (data & 0xf0) logerror("%s: setlines %02x\n", machine().describe_context(), data); - membank("bank1")->set_entry((data & 0x0f) ^ 0x0f); + m_mainbank->set_entry((data & 0x0f) ^ 0x0f); } void parodius_state::parodius(machine_config &config) { - /* basic machine hardware */ - KONAMI(config, m_maincpu, 3000000); /* 053248 */ - m_maincpu->set_addrmap(AS_PROGRAM, &parodius_state::parodius_map); + // basic machine hardware + KONAMI(config, m_maincpu, 3000000); // 053248 + m_maincpu->set_addrmap(AS_PROGRAM, &parodius_state::main_map); m_maincpu->line().set(FUNC(parodius_state::banking_callback)); Z80(config, m_audiocpu, 3579545); - m_audiocpu->set_addrmap(AS_PROGRAM, &parodius_state::parodius_sound_map); /* NMIs are triggered by the 053260 */ + m_audiocpu->set_addrmap(AS_PROGRAM, &parodius_state::sound_map); // NMIs are triggered by the 053260 ADDRESS_MAP_BANK(config, "bank0000").set_map(&parodius_state::bank0000_map).set_options(ENDIANNESS_BIG, 8, 13, 0x800); - ADDRESS_MAP_BANK(config, "bank2000").set_map(&parodius_state::bank2000_map).set_options(ENDIANNESS_BIG, 8, 12, 0x800); WATCHDOG_TIMER(config, "watchdog"); - /* video hardware */ + // video hardware screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); screen.set_refresh_hz(60); screen.set_vblank_time(ATTOSECONDS_IN_USEC(0)); screen.set_size(64*8, 32*8); screen.set_visarea(14*8, (64-14)*8-1, 2*8, 30*8-1); - screen.set_screen_update(FUNC(parodius_state::screen_update_parodius)); + screen.set_screen_update(FUNC(parodius_state::screen_update)); screen.set_palette("palette"); PALETTE(config, "palette").set_format(palette_device::xBGR_555, 2048).enable_shadows(); @@ -260,7 +383,7 @@ void parodius_state::parodius(machine_config &config) K053251(config, m_k053251, 0); - /* sound hardware */ + // sound hardware SPEAKER(config, "lspeaker").front_left(); SPEAKER(config, "rspeaker").front_right(); @@ -278,85 +401,88 @@ void parodius_state::parodius(machine_config &config) ***************************************************************************/ ROM_START( parodius ) - ROM_REGION( 0x40000, "maincpu", 0 ) /* code + banked roms */ + ROM_REGION( 0x40000, "maincpu", 0 ) // code + banked ROMs ROM_LOAD( "955l01.f5", 0x00000, 0x20000, CRC(49a658eb) SHA1(dd53060c4da99b8e1f896ebfec572296ef2b5665) ) ROM_LOAD( "955l02.h5", 0x20000, 0x20000, CRC(161d7322) SHA1(a752f28c19c58263680221ad1119f2fd57df4723) ) - ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for the sound CPU */ + ROM_REGION( 0x10000, "audiocpu", 0 ) ROM_LOAD( "955e03.d14", 0x0000, 0x10000, CRC(940aa356) SHA1(e7466f049be48861fd2d929eed786bd48782b5bb) ) - ROM_REGION( 0x100000, "k052109", 0 ) /* tiles */ + ROM_REGION( 0x100000, "k052109", 0 ) // tiles ROM_LOAD32_WORD( "955d07.k19", 0x000000, 0x080000, CRC(89473fec) SHA1(0da18c4b078c3a30233a6f5c2b90032168136f58) ) ROM_LOAD32_WORD( "955d08.k24", 0x000002, 0x080000, CRC(43d5cda1) SHA1(2c51bad4857d1d31456c6dc1e7d41326ea35468b) ) - ROM_REGION( 0x100000, "k053245", 0 ) /* graphics */ - ROM_LOAD32_WORD( "955d05.k13", 0x000000, 0x080000, CRC(7a1e55e0) SHA1(7a0e04ebde28d1e7b60aef3de926dc0e78662b1e) ) /* sprites */ - ROM_LOAD32_WORD( "955d06.k8", 0x000002, 0x080000, CRC(f4252875) SHA1(490f2e19b30cf8724e4b03b8d9f089c470ec13bd) ) /* sprites */ + ROM_REGION( 0x100000, "k053245", 0 ) // sprites + ROM_LOAD32_WORD( "955d05.k13", 0x000000, 0x080000, CRC(7a1e55e0) SHA1(7a0e04ebde28d1e7b60aef3de926dc0e78662b1e) ) + ROM_LOAD32_WORD( "955d06.k8", 0x000002, 0x080000, CRC(f4252875) SHA1(490f2e19b30cf8724e4b03b8d9f089c470ec13bd) ) - ROM_REGION( 0x80000, "k053260", 0 ) /* 053260 samples */ + ROM_REGION( 0x80000, "k053260", 0 ) // samples ROM_LOAD( "955d04.c5", 0x00000, 0x80000, CRC(e671491a) SHA1(79e71cb5212eb7d14d3479b0734ea0270473a66d) ) ROM_END -ROM_START( parodiuse ) /* Earlier version? */ - ROM_REGION( 0x40000, "maincpu", 0 ) /* code + banked roms */ +ROM_START( parodiuse ) // Earlier version? + ROM_REGION( 0x40000, "maincpu", 0 ) // code + banked ROMs ROM_LOAD( "2.f5", 0x00000, 0x20000, CRC(26a6410b) SHA1(06de782f593ab0da6d65376b66e273d6410c6c56) ) ROM_LOAD( "3.h5", 0x20000, 0x20000, CRC(9410dbf2) SHA1(1c4d9317f83c33bace929a841ff4093d7178c428) ) - ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for the sound CPU */ + ROM_REGION( 0x10000, "audiocpu", 0 ) ROM_LOAD( "955e03.d14", 0x0000, 0x10000, CRC(940aa356) SHA1(e7466f049be48861fd2d929eed786bd48782b5bb) ) - ROM_REGION( 0x100000, "k052109", 0 ) /* tiles */ + ROM_REGION( 0x100000, "k052109", 0 ) // tiles ROM_LOAD32_WORD( "955d07.k19", 0x000000, 0x080000, CRC(89473fec) SHA1(0da18c4b078c3a30233a6f5c2b90032168136f58) ) ROM_LOAD32_WORD( "955d08.k24", 0x000002, 0x080000, CRC(43d5cda1) SHA1(2c51bad4857d1d31456c6dc1e7d41326ea35468b) ) - ROM_REGION( 0x100000, "k053245", 0 ) /* graphics */ - ROM_LOAD32_WORD( "955d05.k13", 0x000000, 0x080000, CRC(7a1e55e0) SHA1(7a0e04ebde28d1e7b60aef3de926dc0e78662b1e) ) /* sprites */ - ROM_LOAD32_WORD( "955d06.k8", 0x000002, 0x080000, CRC(f4252875) SHA1(490f2e19b30cf8724e4b03b8d9f089c470ec13bd) ) /* sprites */ + ROM_REGION( 0x100000, "k053245", 0 ) // sprites + ROM_LOAD32_WORD( "955d05.k13", 0x000000, 0x080000, CRC(7a1e55e0) SHA1(7a0e04ebde28d1e7b60aef3de926dc0e78662b1e) ) + ROM_LOAD32_WORD( "955d06.k8", 0x000002, 0x080000, CRC(f4252875) SHA1(490f2e19b30cf8724e4b03b8d9f089c470ec13bd) ) - ROM_REGION( 0x80000, "k053260", 0 ) /* 053260 samples */ + ROM_REGION( 0x80000, "k053260", 0 ) // samples ROM_LOAD( "955d04.c5", 0x00000, 0x80000, CRC(e671491a) SHA1(79e71cb5212eb7d14d3479b0734ea0270473a66d) ) ROM_END ROM_START( parodiusj ) - ROM_REGION( 0x40000, "maincpu", 0 ) /* code + banked roms */ + ROM_REGION( 0x40000, "maincpu", 0 ) // code + banked ROMs ROM_LOAD( "955e01.f5", 0x00000, 0x20000, CRC(49baa334) SHA1(8902fbb2228111b15de6537bd168241933df134d) ) ROM_LOAD( "955e02.h5", 0x20000, 0x20000, CRC(14010d6f) SHA1(69fe162ea08c3bd4b3e78e9d10d278bd15444af4) ) - ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for the sound CPU */ + ROM_REGION( 0x10000, "audiocpu", 0 ) ROM_LOAD( "955e03.d14", 0x0000, 0x10000, CRC(940aa356) SHA1(e7466f049be48861fd2d929eed786bd48782b5bb) ) - ROM_REGION( 0x100000, "k052109", 0 ) /* tiles */ + ROM_REGION( 0x100000, "k052109", 0 ) // tiles ROM_LOAD32_WORD( "955d07.k19", 0x000000, 0x080000, CRC(89473fec) SHA1(0da18c4b078c3a30233a6f5c2b90032168136f58) ) ROM_LOAD32_WORD( "955d08.k24", 0x000002, 0x080000, CRC(43d5cda1) SHA1(2c51bad4857d1d31456c6dc1e7d41326ea35468b) ) - ROM_REGION( 0x100000, "k053245", 0 ) /* graphics */ - ROM_LOAD32_WORD( "955d05.k13", 0x000000, 0x080000, CRC(7a1e55e0) SHA1(7a0e04ebde28d1e7b60aef3de926dc0e78662b1e) ) /* sprites */ - ROM_LOAD32_WORD( "955d06.k8", 0x000002, 0x080000, CRC(f4252875) SHA1(490f2e19b30cf8724e4b03b8d9f089c470ec13bd) ) /* sprites */ + ROM_REGION( 0x100000, "k053245", 0 ) // sprites + ROM_LOAD32_WORD( "955d05.k13", 0x000000, 0x080000, CRC(7a1e55e0) SHA1(7a0e04ebde28d1e7b60aef3de926dc0e78662b1e) ) + ROM_LOAD32_WORD( "955d06.k8", 0x000002, 0x080000, CRC(f4252875) SHA1(490f2e19b30cf8724e4b03b8d9f089c470ec13bd) ) - ROM_REGION( 0x80000, "k053260", 0 ) /* 053260 samples */ + ROM_REGION( 0x80000, "k053260", 0 ) // samples ROM_LOAD( "955d04.c5", 0x00000, 0x80000, CRC(e671491a) SHA1(79e71cb5212eb7d14d3479b0734ea0270473a66d) ) ROM_END ROM_START( parodiusa ) - ROM_REGION( 0x40000, "maincpu", 0 ) /* code + banked roms */ + ROM_REGION( 0x40000, "maincpu", 0 ) // code + banked ROMs ROM_LOAD( "b-18.f5", 0x00000, 0x20000, CRC(006356cd) SHA1(795011233059472c841c30831442a71579dff2b9) ) ROM_LOAD( "b-19.h5", 0x20000, 0x20000, CRC(e5a16417) SHA1(a49567817fd4948e33913fab66106b8e16100b6a) ) - ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for the sound CPU */ - ROM_LOAD( "955e03.d14", 0x0000, 0x10000, CRC(940aa356) SHA1(e7466f049be48861fd2d929eed786bd48782b5bb) ) /* Labeled as D-20 */ + ROM_REGION( 0x10000, "audiocpu", 0 ) + ROM_LOAD( "955e03.d14", 0x0000, 0x10000, CRC(940aa356) SHA1(e7466f049be48861fd2d929eed786bd48782b5bb) ) // Labeled as D-20 - ROM_REGION( 0x100000, "k052109", 0 ) /* tiles */ + ROM_REGION( 0x100000, "k052109", 0 ) // tiles ROM_LOAD32_WORD( "955d07.k19", 0x000000, 0x080000, CRC(89473fec) SHA1(0da18c4b078c3a30233a6f5c2b90032168136f58) ) ROM_LOAD32_WORD( "955d08.k24", 0x000002, 0x080000, CRC(43d5cda1) SHA1(2c51bad4857d1d31456c6dc1e7d41326ea35468b) ) - ROM_REGION( 0x100000, "k053245", 0 ) /* graphics */ - ROM_LOAD32_WORD( "955d05.k13", 0x000000, 0x080000, CRC(7a1e55e0) SHA1(7a0e04ebde28d1e7b60aef3de926dc0e78662b1e) ) /* sprites */ - ROM_LOAD32_WORD( "955d06.k8", 0x000002, 0x080000, CRC(f4252875) SHA1(490f2e19b30cf8724e4b03b8d9f089c470ec13bd) ) /* sprites */ + ROM_REGION( 0x100000, "k053245", 0 ) // sprites + ROM_LOAD32_WORD( "955d05.k13", 0x000000, 0x080000, CRC(7a1e55e0) SHA1(7a0e04ebde28d1e7b60aef3de926dc0e78662b1e) ) + ROM_LOAD32_WORD( "955d06.k8", 0x000002, 0x080000, CRC(f4252875) SHA1(490f2e19b30cf8724e4b03b8d9f089c470ec13bd) ) - ROM_REGION( 0x80000, "k053260", 0 ) /* 053260 samples */ + ROM_REGION( 0x80000, "k053260", 0 ) // samples ROM_LOAD( "955d04.c5", 0x00000, 0x80000, CRC(e671491a) SHA1(79e71cb5212eb7d14d3479b0734ea0270473a66d) ) ROM_END +} // anonymous namespace + + /*************************************************************************** Game driver(s) diff --git a/src/mame/includes/ajax.h b/src/mame/includes/ajax.h deleted file mode 100644 index eeec373d11c..00000000000 --- a/src/mame/includes/ajax.h +++ /dev/null @@ -1,81 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Manuel Abadia -#ifndef MAME_INCLUDES_AJAX_H -#define MAME_INCLUDES_AJAX_H - -#pragma once - -#include "machine/gen_latch.h" -#include "machine/watchdog.h" -#include "sound/k007232.h" -#include "video/k052109.h" -#include "video/k051960.h" -#include "video/k051316.h" -#include "video/konami_helper.h" -#include "emupal.h" - -class ajax_state : public driver_device -{ -public: - ajax_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_audiocpu(*this, "audiocpu"), - m_subcpu(*this, "sub"), - m_watchdog(*this, "watchdog"), - m_k007232_1(*this, "k007232_1"), - m_k007232_2(*this, "k007232_2"), - m_k052109(*this, "k052109"), - m_k051960(*this, "k051960"), - m_k051316(*this, "k051316"), - m_palette(*this, "palette"), - m_soundlatch(*this, "soundlatch"), - m_lamps(*this, "lamp%u", 0U) - { } - - void ajax(machine_config &config); - -private: - void sound_bank_w(uint8_t data); - uint8_t ls138_f10_r(offs_t offset); - void ls138_f10_w(offs_t offset, uint8_t data); - void bankswitch_2_w(uint8_t data); - void bankswitch_w(uint8_t data); - void lamps_w(uint8_t data); - void k007232_extvol_w(uint8_t data); - uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - void volume_callback0(uint8_t data); - void volume_callback1(uint8_t data); - K051316_CB_MEMBER(zoom_callback); - K052109_CB_MEMBER(tile_callback); - K051960_CB_MEMBER(sprite_callback); - void ajax_main_map(address_map &map); - void ajax_sound_map(address_map &map); - void ajax_sub_map(address_map &map); - -protected: - virtual void machine_start() override; - virtual void machine_reset() override; - - /* video-related */ - uint8_t m_priority = 0U; - - /* misc */ - int m_firq_enable = 0; - - /* devices */ - required_device m_maincpu; - required_device m_audiocpu; - required_device m_subcpu; - required_device m_watchdog; - required_device m_k007232_1; - required_device m_k007232_2; - required_device m_k052109; - required_device m_k051960; - required_device m_k051316; - required_device m_palette; - required_device m_soundlatch; - output_finder<8> m_lamps; -}; - -#endif // MAME_INCLUDES_AJAX_H diff --git a/src/mame/includes/parodius.h b/src/mame/includes/parodius.h deleted file mode 100644 index 81a8d0b81c6..00000000000 --- a/src/mame/includes/parodius.h +++ /dev/null @@ -1,75 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Nicola Salmoria -/************************************************************************* - - Parodius - -*************************************************************************/ -#ifndef MAME_INCLUDES_PARODIUS_H -#define MAME_INCLUDES_PARODIUS_H - -#pragma once - -#include "cpu/m6809/konami.h" /* for the callback and the firq irq definition */ -#include "machine/bankdev.h" -#include "video/k052109.h" -#include "video/k053244_k053245.h" -#include "video/k053251.h" -#include "video/konami_helper.h" - -class parodius_state : public driver_device -{ -public: - enum - { - TIMER_NMI - }; - - parodius_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_audiocpu(*this, "audiocpu"), - m_bank0000(*this, "bank0000"), - m_bank2000(*this, "bank2000"), - m_k052109(*this, "k052109"), - m_k053245(*this, "k053245"), - m_k053251(*this, "k053251") - { } - - /* video-related */ - int m_layer_colorbase[3]{}; - int m_sprite_colorbase = 0; - int m_layerpri[3]{}; - - /* misc */ - //int m_nmi_enabled; - - /* devices */ - required_device m_maincpu; - required_device m_audiocpu; - required_device m_bank0000; - required_device m_bank2000; - required_device m_k052109; - required_device m_k053245; - required_device m_k053251; - void parodius_videobank_w(uint8_t data); - void parodius_3fc0_w(uint8_t data); - void parodius_sh_irqtrigger_w(uint8_t data); - void sound_arm_nmi_w(uint8_t data); - virtual void machine_start() override; - virtual void machine_reset() override; - uint32_t screen_update_parodius(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - K05324X_CB_MEMBER(sprite_callback); - K052109_CB_MEMBER(tile_callback); - void banking_callback(uint8_t data); - - void parodius(machine_config &config); - void bank0000_map(address_map &map); - void bank2000_map(address_map &map); - void parodius_map(address_map &map); - void parodius_sound_map(address_map &map); -protected: - virtual void device_timer(emu_timer &timer, device_timer_id id, int param) override; -}; - -#endif // MAME_INCLUDES_PARODIUS_H diff --git a/src/mame/machine/ajax.cpp b/src/mame/machine/ajax.cpp deleted file mode 100644 index e7e2b57571c..00000000000 --- a/src/mame/machine/ajax.cpp +++ /dev/null @@ -1,215 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Manuel Abadia -/*************************************************************************** - - ajax.cpp - - Functions to emulate general aspects of the machine (RAM, ROM, interrupts, - I/O ports) - -***************************************************************************/ - -#include "emu.h" -#include "cpu/m6809/m6809.h" -#include "cpu/z80/z80.h" -#include "cpu/m6809/konami.h" - -#include "includes/ajax.h" - -/* bankswitch_w: - Handled by the LS273 Octal +ve edge trigger D-type Flip-flop with Reset at H11: - - Bit Description - --- ----------- - 7 MRB3 Selects ROM N11/N12 - 6 CCOUNT2 Coin Counter 2 (*) - 5 CCOUNT1 Coin Counter 1 (*) - 4 SRESET Slave CPU Reset? - 3 PRI0 Layer Priority Selector - 2 MRB2 \ - 1 MRB1 | ROM Bank Select - 0 MRB0 / - - (*) The Coin Counters are handled by the Konami Custom 051550 -*/ - -void ajax_state::bankswitch_w(uint8_t data) -{ - int bank = 0; - - /* rom select */ - if (!(data & 0x80)) - bank += 4; - - /* coin counters */ - machine().bookkeeping().coin_counter_w(0, data & 0x20); - machine().bookkeeping().coin_counter_w(1, data & 0x40); - - /* priority */ - m_priority = data & 0x08; - - /* bank # (ROMS N11 and N12) */ - bank += (data & 0x07); - membank("mainbank")->set_entry(bank); -} - -/* lamps_w: - Handled by the LS273 Octal +ve edge trigger D-type Flip-flop with Reset at B9: - - Bit Description - --- ----------- - 7 LAMP7 & LAMP8 - Game over lamps (*) - 6 LAMP3 & LAMP4 - Game over lamps (*) - 5 LAMP1 - Start lamp (*) - 4 Control panel quaking (**) - 3 Joystick vibration (**) - 2 LAMP5 & LAMP6 - Power up lamps (*) - 1 LAMP2 - Super weapon lamp (*) - 0 unused - - (*) The Lamps are handled by the M54585P - (**)Vibration/Quaking handled by these chips: - Chip Location Description - ---- -------- ----------- - PS2401-4 B21 ??? - UPA1452H B22 ??? - LS74 H2 Dual +ve edge trigger D-type Flip-flop with SET and RESET - LS393 C20 Dual -ve edge trigger 4-bit Binary Ripple Counter with Resets -*/ - -void ajax_state::lamps_w(uint8_t data) -{ - m_lamps[1] = BIT(data, 1); /* super weapon lamp */ - m_lamps[2] = BIT(data, 2); /* power up lamps */ - m_lamps[5] = BIT(data, 2); /* power up lamps */ - m_lamps[0] = BIT(data, 5); /* start lamp */ - m_lamps[3] = BIT(data, 6); /* game over lamps */ - m_lamps[6] = BIT(data, 6); /* game over lamps */ - m_lamps[4] = BIT(data, 7); /* game over lamps */ - m_lamps[7] = BIT(data, 7); /* game over lamps */ -} - -/* ajax_ls138_f10: - The LS138 1-of-8 Decoder/Demultiplexer at F10 selects what to do: - - Address R/W Description - ------- --- ----------- - 0x0000 (r) ??? I think this read is because a CPU core bug - (w) 0x0000 NSFIRQ Trigger FIRQ on the M6809 - 0x0020 AFR Watchdog reset (handled by the 051550) - 0x0040 (w) SOUND Cause interrupt on the Z80 - 0x0080 (w) SOUNDDATA Sound code number - 0x00c0 (w) MBL1 Enables the LS273 at H11 (Banking + Coin counters) - 0x0100 (r) MBL2 Enables 2P Inputs reading - 0x0140 (w) MBL3 Enables the LS273 at B9 (Lamps + Vibration) - 0x0180 (r) MIO1 Enables 1P Inputs + DIPSW #1 & #2 reading - 0x01c0 (r) MIO2 Enables DIPSW #3 reading -*/ - -uint8_t ajax_state::ls138_f10_r(offs_t offset) -{ - int data = 0, index; - static const char *const portnames[] = { "SYSTEM", "P1", "DSW1", "DSW2" }; - - switch ((offset & 0x01c0) >> 6) - { - case 0x00: /* ??? */ - data = machine().rand(); - break; - case 0x04: /* 2P inputs */ - data = ioport("P2")->read(); - break; - case 0x06: /* 1P inputs + DIPSW #1 & #2 */ - index = offset & 0x01; - data = ioport((offset & 0x02) ? portnames[2 + index] : portnames[index])->read(); - break; - case 0x07: /* DIPSW #3 */ - data = ioport("DSW3")->read(); - break; - - default: - logerror("%04x: (ls138_f10) read from an unknown address %02x\n",m_maincpu->pc(), offset); - } - - return data; -} - -void ajax_state::ls138_f10_w(offs_t offset, uint8_t data) -{ - switch ((offset & 0x01c0) >> 6) - { - case 0x00: /* NSFIRQ + AFR */ - if (offset) - m_watchdog->watchdog_reset(); - else{ - if (m_firq_enable) /* Cause interrupt on slave CPU */ - m_subcpu->set_input_line(M6809_FIRQ_LINE, HOLD_LINE); - } - break; - case 0x01: /* Cause interrupt on audio CPU */ - m_audiocpu->set_input_line(0, HOLD_LINE); - break; - case 0x02: /* Sound command number */ - m_soundlatch->write(data); - break; - case 0x03: /* Bankswitch + coin counters + priority*/ - bankswitch_w(data); - break; - case 0x05: /* Lamps + Joystick vibration + Control panel quaking */ - lamps_w(data); - break; - - default: - logerror("%04x: (ls138_f10) write %02x to an unknown address %02x\n", m_maincpu->pc(), data, offset); - } -} - -/* bankswitch_w_2: - Handled by the LS273 Octal +ve edge trigger D-type Flip-flop with Reset at K14: - - Bit Description - --- ----------- - 7 unused - 6 RMRD Enable char ROM reading through the video RAM - 5 RVO enables 051316 wraparound - 4 FIRQST FIRQ control - 3 SRB3 \ - 2 SRB2 | - 1 SRB1 | ROM Bank Select - 0 SRB0 / -*/ - -void ajax_state::bankswitch_2_w(uint8_t data) -{ - /* enable char ROM reading through the video RAM */ - m_k052109->set_rmrd_line((data & 0x40) ? ASSERT_LINE : CLEAR_LINE); - - /* bit 5 enables 051316 wraparound */ - m_k051316->wraparound_enable(data & 0x20); - - /* FIRQ control */ - m_firq_enable = data & 0x10; - - /* bank # (ROMS G16 and I16) */ - membank("subbank")->set_entry(data & 0x0f); -} - -void ajax_state::machine_start() -{ - uint8_t *MAIN = memregion("maincpu")->base(); - uint8_t *SUB = memregion("sub")->base(); - - m_lamps.resolve(); - membank("mainbank")->configure_entries(0, 4, &MAIN[0x00000], 0x2000); - membank("mainbank")->configure_entries(4, 8, &MAIN[0x10000], 0x2000); - membank("subbank")->configure_entries(0, 9, &SUB[0x00000], 0x2000); - - save_item(NAME(m_priority)); - save_item(NAME(m_firq_enable)); -} - -void ajax_state::machine_reset() -{ - m_priority = 0; - m_firq_enable = 0; -} diff --git a/src/mame/video/ajax.cpp b/src/mame/video/ajax.cpp deleted file mode 100644 index e0eae9fbe3a..00000000000 --- a/src/mame/video/ajax.cpp +++ /dev/null @@ -1,98 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Manuel Abadia -/*************************************************************************** - - ajax.cpp - - Functions to emulate the video hardware of the machine. - -***************************************************************************/ - -#include "emu.h" -#include "includes/ajax.h" - - -/*************************************************************************** - - Callbacks for the K052109 - -***************************************************************************/ - -K052109_CB_MEMBER(ajax_state::tile_callback) -{ - static const int layer_colorbase[] = { 1024 / 16, 0 / 16, 512 / 16 }; - - *code |= ((*color & 0x0f) << 8) | (bank << 12); - *color = layer_colorbase[layer] + ((*color & 0xf0) >> 4); -} - - -/*************************************************************************** - - Callbacks for the K051960 - -***************************************************************************/ - -K051960_CB_MEMBER(ajax_state::sprite_callback) -{ - enum { sprite_colorbase = 256 / 16 }; - - /* priority bits: - 4 over zoom (0 = have priority) - 5 over B (0 = have priority) - 6 over A (1 = have priority) - never over F - */ - *priority = 0; - if ( *color & 0x10) *priority |= GFX_PMASK_4; /* Z = 4 */ - if (~*color & 0x40) *priority |= GFX_PMASK_2; /* A = 2 */ - if ( *color & 0x20) *priority |= GFX_PMASK_1; /* B = 1 */ - *color = sprite_colorbase + (*color & 0x0f); -} - - -/*************************************************************************** - - Callbacks for the K051316 - -***************************************************************************/ - -K051316_CB_MEMBER(ajax_state::zoom_callback) -{ - enum { zoom_colorbase = 768 / 128 }; - - *code |= ((*color & 0x07) << 8); - *color = zoom_colorbase + ((*color & 0x08) >> 3); -} - - -/*************************************************************************** - - Display Refresh - -***************************************************************************/ - -uint32_t ajax_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) -{ - m_k052109->tilemap_update(); - - screen.priority().fill(0, cliprect); - - bitmap.fill(m_palette->black_pen(), cliprect); - m_k052109->tilemap_draw(screen, bitmap, cliprect, 2, 0, 1); - if (m_priority) - { - /* basic layer order is B, zoom, A, F */ - m_k051316->zoom_draw(screen, bitmap, cliprect, 0, 4); - m_k052109->tilemap_draw(screen, bitmap, cliprect, 1, 0, 2); - } - else - { - /* basic layer order is B, A, zoom, F */ - m_k052109->tilemap_draw(screen, bitmap, cliprect, 1, 0, 2); - m_k051316->zoom_draw(screen, bitmap, cliprect, 0, 4); - } - m_k051960->k051960_sprites_draw(bitmap, cliprect, screen.priority(), -1, -1); - m_k052109->tilemap_draw(screen, bitmap, cliprect, 0, 0, 0); - return 0; -} diff --git a/src/mame/video/parodius.cpp b/src/mame/video/parodius.cpp deleted file mode 100644 index f1ad727f21d..00000000000 --- a/src/mame/video/parodius.cpp +++ /dev/null @@ -1,78 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Nicola Salmoria - -#include "emu.h" -#include "includes/parodius.h" -#include "screen.h" - - -/*************************************************************************** - - Callbacks for the K052109 - -***************************************************************************/ - -K052109_CB_MEMBER(parodius_state::tile_callback) -{ - *code |= ((*color & 0x03) << 8) | ((*color & 0x10) << 6) | ((*color & 0x0c) << 9) | (bank << 13); - *color = m_layer_colorbase[layer] + ((*color & 0xe0) >> 5); -} - -/*************************************************************************** - - Callbacks for the K053245 - -***************************************************************************/ - -K05324X_CB_MEMBER(parodius_state::sprite_callback) -{ - int pri = 0x20 | ((*color & 0x60) >> 2); - if (pri <= m_layerpri[2]) - *priority = 0; - else if (pri > m_layerpri[2] && pri <= m_layerpri[1]) - *priority = 0xf0; - else if (pri > m_layerpri[1] && pri <= m_layerpri[0]) - *priority = 0xf0 | 0xcc; - else - *priority = 0xf0 | 0xcc | 0xaa; - - *color = m_sprite_colorbase + (*color & 0x1f); -} - - -/*************************************************************************** - - Start the video hardware emulation. - -***************************************************************************/ - -uint32_t parodius_state::screen_update_parodius(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) -{ - int layer[3], bg_colorbase; - - bg_colorbase = m_k053251->get_palette_index(k053251_device::CI0); - m_sprite_colorbase = m_k053251->get_palette_index(k053251_device::CI1); - m_layer_colorbase[0] = m_k053251->get_palette_index(k053251_device::CI2); - m_layer_colorbase[1] = m_k053251->get_palette_index(k053251_device::CI4); - m_layer_colorbase[2] = m_k053251->get_palette_index(k053251_device::CI3); - - m_k052109->tilemap_update(); - - layer[0] = 0; - m_layerpri[0] = m_k053251->get_priority(k053251_device::CI2); - layer[1] = 1; - m_layerpri[1] = m_k053251->get_priority(k053251_device::CI4); - layer[2] = 2; - m_layerpri[2] = m_k053251->get_priority(k053251_device::CI3); - - konami_sortlayers3(layer, m_layerpri); - - screen.priority().fill(0, cliprect); - bitmap.fill(16 * bg_colorbase, cliprect); - m_k052109->tilemap_draw(screen, bitmap, cliprect, layer[0], 0,1); - m_k052109->tilemap_draw(screen, bitmap, cliprect, layer[1], 0,2); - m_k052109->tilemap_draw(screen, bitmap, cliprect, layer[2], 0,4); - - m_k053245->sprites_draw(bitmap, cliprect, screen.priority()); - return 0; -}