diff options
author | 2018-03-29 12:44:00 +1100 | |
---|---|---|
committer | 2018-03-29 12:44:00 +1100 | |
commit | af143199f8e0a5f252617f6607f234d76eaae224 (patch) | |
tree | 53cc97447e7c5cd6546e7ecb695c981f7816d461 | |
parent | a7262c8358b1550f70f1c43acb4a5d32bdab7a4b (diff) |
neogeo: Split into real models:
* Moved common stuff (mostly video) into a base memory map.
* Split common edge connector inputs into JAMMA and MVS.
* Added clones with different numbers of game slots, edge connector, controller ports, memory card, and speakers.
* Based fixed-software drivers on MV-1 JAMMA board configuration.
* Removed memory card and controller ports from single-PCB games and converted to mono output.
* Coin lockouts/counters still not connected, and LED/EL output isn't suppressed for variants that lack it.
(nw) suppress leading space in RAM option names
-rw-r--r-- | src/devices/machine/ram.cpp | 4 | ||||
-rw-r--r-- | src/mame/drivers/neogeo.cpp | 678 | ||||
-rw-r--r-- | src/mame/drivers/neogeocd.cpp | 23 | ||||
-rw-r--r-- | src/mame/drivers/neopcb.cpp | 4 | ||||
-rw-r--r-- | src/mame/includes/neogeo.h | 91 | ||||
-rw-r--r-- | src/mame/mame.lst | 7 | ||||
-rw-r--r-- | src/mame/video/neogeo.cpp | 28 |
7 files changed, 462 insertions, 373 deletions
diff --git a/src/devices/machine/ram.cpp b/src/devices/machine/ram.cpp index da73376f7fe..6aca1ceeff8 100644 --- a/src/devices/machine/ram.cpp +++ b/src/devices/machine/ram.cpp @@ -75,6 +75,10 @@ ram_device::extra_option_vector calculate_extra_options(const char *extra_option bool done(false); for (std::string::size_type start = 0, end = options.find_first_of(','); !done; start = end + 1, end = options.find_first_of(',', start)) { + // ignore spaces + while ((end > start) && (options.length() > start) && ((' ' == options[start]) || ('\t' == options[start]))) + ++start; + // parse the option std::string ram_option_string(options.substr(start, (end == -1) ? -1 : end - start)); u32 const ram_option = parse_string(ram_option_string.c_str()); diff --git a/src/mame/drivers/neogeo.cpp b/src/mame/drivers/neogeo.cpp index b82aa064d91..07b3dba5ad1 100644 --- a/src/mame/drivers/neogeo.cpp +++ b/src/mame/drivers/neogeo.cpp @@ -132,21 +132,21 @@ Mainboard features ================== - +------+-----+-----+-----+--------+--------+-------+-------+-------+-----+---+--------+-------+ - | |Slots|Edge |Coins|Counters|Lockouts|Mahjong|Mono/St|Memcard|7-seg|EL | BIOS |Data In| - +------+-----+-----+-----+--------+--------+-------+-------+-------+-----+---+--------+-------+ - |MV-1 | 1 |JAMMA| 2 | 2 | 2 | 2 |switch |header | yes |no | socket | yes | - |MV-1A | 1 |JAMMA| 2 | 2 | 0 | 0 | mono | none | no |no | socket | no | - |MV-1AX| 1 |JAMMA| 2 | 2 | 0 | 0 | mono | none | no |no |soldered| no | - |MV-1B | 1 |JAMMA| 2 | 2 | 0 | 0 | mono | none | no |no |soldered| no | - |MV-1C | 1 |JAMMA| 2 | 2 | 0 | 0 | mono | none | no |no |soldered| no | - |MV-1F | 1 |JAMMA| 2 | 2 | 2 | 2 |switch | none | yes |no | socket | no | - |MV-1FZ| 1 |JAMMA| 2 | 2 | 2 | 0 | mono | none | no |no | socket | yes | - |MV-1T | 1 |JAMMA| 2 | 2 | 0 | 2 |switch | none | yes |no | socket | no | - |MV-2F | 2 | MVS | 4 | 2 | 2 | 2 | both |onboard| yes |yes| socket | no | - |MV-4F | 4 | MVS | 4 | 2 | 2 | 2 | both |header | yes |yes| socket | no | - |MV-6F | 6 | MVS | 4 | 2 | 2 | 2 | both |header | yes |yes| socket | no | - +------+-----+-----+-----+--------+--------+-------+-------+-------+-----+---+--------+-------+ + +------+-----+-----+-----+--------+--------+-------+-------+-------+-----+---+--------+-------+------+ + | |Slots|Edge |Coins|Counters|Lockouts|Mahjong|Mono/St|Memcard|7-seg|EL | BIOS |Data In|Orient| + +------+-----+-----+-----+--------+--------+-------+-------+-------+-----+---+--------+-------+------+ + |MV-1 | 1 |JAMMA| 2 | 2 | 2 | 2 |switch |header | yes |no | socket | yes |horiz | + |MV-1A | 1 |JAMMA| 2 | 2 | 0 | 0 | mono | none | no |no | socket | no |horiz | + |MV-1AX| 1 |JAMMA| 2 | 2 | 0 | 0 | mono | none | no |no |soldered| no |horiz | + |MV-1B | 1 |JAMMA| 2 | 2 | 0 | 0 | mono | none | no |no |soldered| no |horiz | + |MV-1C | 1 |JAMMA| 2 | 2 | 0 | 0 | mono | none | no |no |soldered| no | vert | + |MV-1F | 1 |JAMMA| 2 | 2 | 2 | 2 |switch | none | yes |no | socket | no |horiz | + |MV-1FZ| 1 |JAMMA| 2 | 2 | 2 | 0 | mono | none | no |no | socket | yes |horiz | + |MV-1T | 1 |JAMMA| 2 | 2 | 0 | 2 |switch | none | yes |no | socket | no |horiz | + |MV-2F | 2 | MVS | 4 | 2 | 2 | 2 | both |onboard| yes |yes| socket | no | vert | + |MV-4F | 4 | MVS | 4 | 2 | 2 | 2 | both |header | yes |yes| socket | no | vert | + |MV-6F | 6 | MVS | 4 | 2 | 2 | 2 | both |header | yes |yes| socket | no | vert | + +------+-----+-----+-----+--------+--------+-------+-------+-------+-----+---+--------+-------+------+ * Function of the data input switch is unknown * MVS connector has high-level single-ended stereo outputs and low-level mono output @@ -536,7 +536,12 @@ public: DECLARE_CUSTOM_INPUT_MEMBER(kizuna4p_start_r); // mainboard configurations - void mvs(machine_config &config); + void mv1(machine_config &config); + void mv1f(machine_config &config); + void mv1fz(machine_config &config); + void mv2f(machine_config &config); + void mv4f(machine_config &config); + void mv6f(machine_config &config); // fixed software configurations void neobase(machine_config &config); @@ -612,6 +617,8 @@ protected: virtual DECLARE_WRITE8_MEMBER(io_control_w) override; + void mv1_fixed(machine_config &config); + private: void set_output_latch(uint8_t data); void set_output_data(uint8_t data); @@ -642,10 +649,12 @@ protected: virtual void machine_start() override; virtual void neogeo_postload() override; + + void aes_main_map(address_map &map); }; -void neogeo_state::adjust_display_position_interrupt_timer() +void neogeo_base_state::adjust_display_position_interrupt_timer() { attotime period = attotime::from_ticks((uint64_t)m_display_counter + 1, NEOGEO_PIXEL_CLOCK); if (LOG_VIDEO_SYSTEM) logerror("adjust_display_position_interrupt_timer current y: %02x current x: %02x target y: %x target x: %x\n", m_screen->vpos(), m_screen->hpos(), (m_display_counter + 1) / NEOGEO_HTOTAL, (m_display_counter + 1) % NEOGEO_HTOTAL); @@ -654,13 +663,13 @@ void neogeo_state::adjust_display_position_interrupt_timer() } -void neogeo_state::set_display_position_interrupt_control(uint16_t data) +void neogeo_base_state::set_display_position_interrupt_control(uint16_t data) { m_display_position_interrupt_control = data; } -void neogeo_state::set_display_counter_msb(uint16_t data) +void neogeo_base_state::set_display_counter_msb(uint16_t data) { m_display_counter = (m_display_counter & 0x0000ffff) | ((uint32_t)data << 16); @@ -668,7 +677,7 @@ void neogeo_state::set_display_counter_msb(uint16_t data) } -void neogeo_state::set_display_counter_lsb(uint16_t data) +void neogeo_base_state::set_display_counter_lsb(uint16_t data) { m_display_counter = (m_display_counter & 0xffff0000) | data; @@ -682,7 +691,7 @@ void neogeo_state::set_display_counter_lsb(uint16_t data) } -void neogeo_state::update_interrupts() +void neogeo_base_state::update_interrupts() { m_maincpu->set_input_line(3, m_irq3_pending ? ASSERT_LINE : CLEAR_LINE); m_maincpu->set_input_line(m_raster_level, m_display_position_interrupt_pending ? ASSERT_LINE : CLEAR_LINE); @@ -690,7 +699,7 @@ void neogeo_state::update_interrupts() } -void neogeo_state::acknowledge_interrupt(uint16_t data) +void neogeo_base_state::acknowledge_interrupt(uint16_t data) { if (data & 0x01) m_irq3_pending = 0; @@ -703,7 +712,7 @@ void neogeo_state::acknowledge_interrupt(uint16_t data) } -TIMER_CALLBACK_MEMBER(neogeo_state::display_position_interrupt_callback) +TIMER_CALLBACK_MEMBER(neogeo_base_state::display_position_interrupt_callback) { if (LOG_VIDEO_SYSTEM) logerror("--- Scanline @ %d,%d\n", m_screen->vpos(), m_screen->hpos()); @@ -723,7 +732,7 @@ TIMER_CALLBACK_MEMBER(neogeo_state::display_position_interrupt_callback) } -TIMER_CALLBACK_MEMBER(neogeo_state::display_position_vblank_callback) +TIMER_CALLBACK_MEMBER(neogeo_base_state::display_position_vblank_callback) { if (m_display_position_interrupt_control & IRQ2CTRL_AUTOLOAD_VBLANK) { @@ -736,7 +745,7 @@ TIMER_CALLBACK_MEMBER(neogeo_state::display_position_vblank_callback) } -TIMER_CALLBACK_MEMBER(neogeo_state::vblank_interrupt_callback) +TIMER_CALLBACK_MEMBER(neogeo_base_state::vblank_interrupt_callback) { if (LOG_VIDEO_SYSTEM) logerror("+++ VBLANK @ %d,%d\n", m_screen->vpos(), m_screen->hpos()); @@ -748,15 +757,15 @@ TIMER_CALLBACK_MEMBER(neogeo_state::vblank_interrupt_callback) } -void neogeo_state::create_interrupt_timers() +void neogeo_base_state::create_interrupt_timers() { - m_display_position_interrupt_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(neogeo_state::display_position_interrupt_callback),this)); - m_display_position_vblank_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(neogeo_state::display_position_vblank_callback),this)); - m_vblank_interrupt_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(neogeo_state::vblank_interrupt_callback),this)); + m_display_position_interrupt_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(neogeo_base_state::display_position_interrupt_callback),this)); + m_display_position_vblank_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(neogeo_base_state::display_position_vblank_callback),this)); + m_vblank_interrupt_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(neogeo_base_state::vblank_interrupt_callback),this)); } -void neogeo_state::start_interrupt_timers() +void neogeo_base_state::start_interrupt_timers() { m_vblank_interrupt_timer->adjust(m_screen->time_until_pos(NEOGEO_VBSTART) + NEOGEO_VBLANK_IRQ_HTIM); m_display_position_vblank_timer->adjust(m_screen->time_until_pos(NEOGEO_VBSTART) + NEOGEO_VBLANK_RELOAD_HTIM); @@ -770,16 +779,10 @@ void neogeo_state::start_interrupt_timers() * *************************************/ -void neogeo_state::audio_cpu_check_nmi() -{ - m_audiocpu->set_input_line(INPUT_LINE_NMI, (m_audio_cpu_nmi_enabled && m_audio_cpu_nmi_pending) ? ASSERT_LINE : CLEAR_LINE); -} - -WRITE8_MEMBER(neogeo_state::audio_cpu_enable_nmi_w) +WRITE8_MEMBER(neogeo_base_state::audio_cpu_enable_nmi_w) { // out ($08) enables the nmi, out ($18) disables it - m_audio_cpu_nmi_enabled = !(offset & 0x10); - audio_cpu_check_nmi(); + m_audionmi->in_w<1>(BIT(~offset, 4)); } @@ -790,12 +793,22 @@ WRITE8_MEMBER(neogeo_state::audio_cpu_enable_nmi_w) * *************************************/ -READ16_MEMBER(ngarcade_base_state::in0_r) +READ16_MEMBER(ngarcade_base_state::in0_edge_r) +{ + return (m_edge->in0_r(space, offset) << 8) | m_dsw->read(); +} + +READ16_MEMBER(ngarcade_base_state::in0_edge_joy_r) { return ((m_edge->in0_r(space, offset) & m_ctrl1->ctrl_r(space, offset)) << 8) | m_dsw->read(); } -READ16_MEMBER(ngarcade_base_state::in1_r) +READ16_MEMBER(ngarcade_base_state::in1_edge_r) +{ + return (m_edge->in1_r(space, offset) << 8) | 0xff; +} + +READ16_MEMBER(ngarcade_base_state::in1_edge_joy_r) { return ((m_edge->in1_r(space, offset) & m_ctrl2->ctrl_r(space, offset)) << 8) | 0xff; } @@ -805,7 +818,7 @@ CUSTOM_INPUT_MEMBER(mvs_state::kizuna4p_start_r) return (m_edge->read_start_sel() & 0x05) | ~0x05; } -WRITE8_MEMBER(neogeo_state::io_control_w) +WRITE8_MEMBER(neogeo_base_state::io_control_w) { switch (offset) { @@ -847,7 +860,7 @@ WRITE8_MEMBER(ngarcade_base_state::io_control_w) // case 0x33: break; // coin lockout default: - neogeo_state::io_control_w(space, offset, data, mem_mask); + neogeo_base_state::io_control_w(space, offset, data, mem_mask); } } @@ -879,7 +892,7 @@ WRITE8_MEMBER(mvs_state::io_control_w) * *************************************/ -READ16_MEMBER(neogeo_state::unmapped_r) +READ16_MEMBER(neogeo_base_state::unmapped_r) { uint16_t ret; @@ -926,15 +939,15 @@ WRITE16_MEMBER(ngarcade_base_state::save_ram_w) * *************************************/ -CUSTOM_INPUT_MEMBER(neogeo_state::get_memcard_status) +CUSTOM_INPUT_MEMBER(neogeo_base_state::get_memcard_status) { // D0 and D1 are memcard 1 and 2 presence indicators, D2 indicates memcard // write protect status (we are always write enabled) - return (m_memcard->present() == -1) ? 0x07 : 0x00; + return (!m_memcard || (m_memcard->present() == -1)) ? 0x07 : 0x00; } -READ16_MEMBER(neogeo_state::memcard_r) +READ16_MEMBER(neogeo_base_state::memcard_r) { m_maincpu->eat_cycles(2); // insert waitstate @@ -949,7 +962,7 @@ READ16_MEMBER(neogeo_state::memcard_r) } -WRITE16_MEMBER(neogeo_state::memcard_w) +WRITE16_MEMBER(neogeo_base_state::memcard_w) { m_maincpu->eat_cycles(2); // insert waitstate @@ -966,30 +979,8 @@ WRITE16_MEMBER(neogeo_state::memcard_w) * *************************************/ -WRITE8_MEMBER(neogeo_state::audio_command_w) -{ - m_soundlatch->write(space, 0, data); - - m_audio_cpu_nmi_pending = true; - audio_cpu_check_nmi(); - - /* boost the interleave to let the audio CPU read the command */ - machine().scheduler().boost_interleave(attotime::zero, attotime::from_usec(50)); -} - -READ8_MEMBER(neogeo_state::audio_command_r) -{ - uint8_t ret = m_soundlatch->read(space, 0); - - m_audio_cpu_nmi_pending = false; - audio_cpu_check_nmi(); - - return ret; -} - - -CUSTOM_INPUT_MEMBER(neogeo_state::get_audio_result) +CUSTOM_INPUT_MEMBER(neogeo_base_state::get_audio_result) { uint8_t ret = m_soundlatch2->read(m_audiocpu->space(AS_PROGRAM), 0); @@ -1003,7 +994,7 @@ CUSTOM_INPUT_MEMBER(neogeo_state::get_audio_result) * *************************************/ -READ8_MEMBER(neogeo_state::audio_cpu_bank_select_r) +READ8_MEMBER(neogeo_base_state::audio_cpu_bank_select_r) { m_bank_audio_cart[offset & 3]->set_entry(offset >> 8); @@ -1018,13 +1009,13 @@ READ8_MEMBER(neogeo_state::audio_cpu_bank_select_r) *************************************/ -WRITE_LINE_MEMBER(neogeo_state::set_use_cart_vectors) +WRITE_LINE_MEMBER(neogeo_base_state::set_use_cart_vectors) { m_use_cart_vectors = state; } -WRITE_LINE_MEMBER(neogeo_state::set_use_cart_audio) +WRITE_LINE_MEMBER(neogeo_base_state::set_use_cart_audio) { m_use_cart_audio = state; m_sprgen->neogeo_set_fixed_layer_source(state); @@ -1032,7 +1023,7 @@ WRITE_LINE_MEMBER(neogeo_state::set_use_cart_audio) } -WRITE16_MEMBER(neogeo_state::write_banksel) +WRITE16_MEMBER(neogeo_base_state::write_banksel) { uint32_t len = (!m_slots[m_curr_slot] || m_slots[m_curr_slot]->get_rom_size() == 0) ? m_region_maincpu->bytes() : m_slots[m_curr_slot]->get_rom_size(); @@ -1120,13 +1111,13 @@ void mvs_state::set_output_data(uint8_t data) // FIXME: These are a temporary workaround for slot-driven bankswitch with protected carts. // A cleaner implementation is in progress. -WRITE16_MEMBER(neogeo_state::write_bankprot) +WRITE16_MEMBER(neogeo_base_state::write_bankprot) { m_bank_base = m_slots[m_curr_slot]->get_bank_base(data); m_bank_cartridge->set_base((uint8_t *)m_slots[m_curr_slot]->get_rom_base() + m_bank_base); } -WRITE16_MEMBER(neogeo_state::write_bankprot_pvc) +WRITE16_MEMBER(neogeo_base_state::write_bankprot_pvc) { // write to cart ram m_slots[m_curr_slot]->protection_w(space, offset, data, mem_mask); @@ -1139,7 +1130,7 @@ WRITE16_MEMBER(neogeo_state::write_bankprot_pvc) } } -WRITE16_MEMBER(neogeo_state::write_bankprot_kf2k3bl) +WRITE16_MEMBER(neogeo_base_state::write_bankprot_kf2k3bl) { // write to cart ram m_slots[m_curr_slot]->protection_w(space, offset, data, mem_mask); @@ -1152,7 +1143,7 @@ WRITE16_MEMBER(neogeo_state::write_bankprot_kf2k3bl) } } -WRITE16_MEMBER(neogeo_state::write_bankprot_ms5p) +WRITE16_MEMBER(neogeo_base_state::write_bankprot_ms5p) { logerror("ms5plus bankswitch - offset: %06x PC %06x: set banking %04x\n", offset, m_maincpu->pc(), data); @@ -1168,7 +1159,7 @@ WRITE16_MEMBER(neogeo_state::write_bankprot_ms5p) } } -WRITE16_MEMBER(neogeo_state::write_bankprot_kof10th) +WRITE16_MEMBER(neogeo_base_state::write_bankprot_kof10th) { m_slots[m_curr_slot]->protection_w(space, offset, data, mem_mask); @@ -1180,7 +1171,7 @@ WRITE16_MEMBER(neogeo_state::write_bankprot_kof10th) } } -READ16_MEMBER(neogeo_state::read_lorom_kof10th) +READ16_MEMBER(neogeo_base_state::read_lorom_kof10th) { uint16_t* rom = (m_slots[m_curr_slot] && m_slots[m_curr_slot]->get_rom_size() > 0) ? m_slots[m_curr_slot]->get_rom_base() : (uint16_t*)m_region_maincpu->base(); if (offset + 0x80/2 >= 0x10000/2) @@ -1194,7 +1185,7 @@ READ16_MEMBER(neogeo_state::read_lorom_kof10th) * *************************************/ -void neogeo_state::init_cpu() +void neogeo_base_state::init_cpu() { uint8_t *ROM = (!m_slots[m_curr_slot] || m_slots[m_curr_slot]->get_rom_size() == 0) ? m_region_maincpu->base() : (uint8_t *)m_slots[m_curr_slot]->get_rom_base(); uint32_t len = (!m_slots[m_curr_slot] || m_slots[m_curr_slot]->get_rom_size() == 0) ? m_region_maincpu->bytes() : m_slots[m_curr_slot]->get_rom_size(); @@ -1207,7 +1198,7 @@ void neogeo_state::init_cpu() m_bank_cartridge->set_base(ROM + m_bank_base); } -void neogeo_state::init_audio() +void neogeo_base_state::init_audio() { uint8_t *ROM = (!m_slots[m_curr_slot] || m_slots[m_curr_slot]->get_audio_size() == 0) ? m_region_audiocpu->base() : m_slots[m_curr_slot]->get_audio_base(); uint32_t len = (!m_slots[m_curr_slot] || m_slots[m_curr_slot]->get_audio_size() == 0) ? m_region_audiocpu->bytes() : m_slots[m_curr_slot]->get_audio_size(); @@ -1247,7 +1238,7 @@ void neogeo_state::init_audio() m_bank_audio_cart[3]->set_entry(0x02); } -void neogeo_state::init_ym() +void neogeo_base_state::init_ym() { uint8_t *ROM; uint32_t len; @@ -1283,7 +1274,7 @@ void neogeo_state::init_ym() m_ym->reset(); // reset it again to get the new pointers } -void neogeo_state::init_sprites() +void neogeo_base_state::init_sprites() { if (m_slots[m_curr_slot] && m_slots[m_curr_slot]->get_sprites_size() > 0) { @@ -1303,7 +1294,7 @@ void neogeo_state::init_sprites() } -void neogeo_state::set_slot_idx(int slot) +void neogeo_base_state::set_slot_idx(int slot) { if (slot != m_curr_slot) { @@ -1324,7 +1315,7 @@ void neogeo_state::set_slot_idx(int slot) space.install_read_bank(0x200000, 0x2fffff, "cartridge"); - space.install_write_handler(0x2ffff0, 0x2fffff, write16_delegate(FUNC(neogeo_state::write_banksel),this)); + space.install_write_handler(0x2ffff0, 0x2fffff, write16_delegate(FUNC(neogeo_base_state::write_banksel),this)); m_bank_cartridge = membank("cartridge"); init_cpu(); @@ -1354,34 +1345,34 @@ void neogeo_state::set_slot_idx(int slot) break; case NEOGEO_KOF99: // addon_r here gives SMA random number - space.install_write_handler(0x2ffff0, 0x2ffff1, write16_delegate(FUNC(neogeo_state::write_bankprot),this)); + space.install_write_handler(0x2ffff0, 0x2ffff1, write16_delegate(FUNC(neogeo_base_state::write_bankprot),this)); space.install_read_handler(0x2fe446, 0x2fe447, read16_delegate(FUNC(neogeo_cart_slot_device::protection_r),(neogeo_cart_slot_device*)m_slots[m_curr_slot])); space.install_read_handler(0x2ffff8, 0x2ffff9, read16_delegate(FUNC(neogeo_cart_slot_device::addon_r),(neogeo_cart_slot_device*)m_slots[m_curr_slot])); space.install_read_handler(0x2ffffa, 0x2ffffb, read16_delegate(FUNC(neogeo_cart_slot_device::addon_r),(neogeo_cart_slot_device*)m_slots[m_curr_slot])); break; case NEOGEO_GAROU: // addon_r here gives SMA random number - space.install_write_handler(0x2fffc0, 0x2fffc1, write16_delegate(FUNC(neogeo_state::write_bankprot),this)); + space.install_write_handler(0x2fffc0, 0x2fffc1, write16_delegate(FUNC(neogeo_base_state::write_bankprot),this)); space.install_read_handler(0x2fe446, 0x2fe447, read16_delegate(FUNC(neogeo_cart_slot_device::protection_r),(neogeo_cart_slot_device*)m_slots[m_curr_slot])); space.install_read_handler(0x2fffcc, 0x2fffcd, read16_delegate(FUNC(neogeo_cart_slot_device::addon_r),(neogeo_cart_slot_device*)m_slots[m_curr_slot])); space.install_read_handler(0x2ffff0, 0x2ffff1, read16_delegate(FUNC(neogeo_cart_slot_device::addon_r),(neogeo_cart_slot_device*)m_slots[m_curr_slot])); break; case NEOGEO_GAROUH: // addon_r here gives SMA random number - space.install_write_handler(0x2fffc0, 0x2fffc1, write16_delegate(FUNC(neogeo_state::write_bankprot),this)); + space.install_write_handler(0x2fffc0, 0x2fffc1, write16_delegate(FUNC(neogeo_base_state::write_bankprot),this)); space.install_read_handler(0x2fe446, 0x2fe447, read16_delegate(FUNC(neogeo_cart_slot_device::protection_r),(neogeo_cart_slot_device*)m_slots[m_curr_slot])); space.install_read_handler(0x2fffcc, 0x2fffcd, read16_delegate(FUNC(neogeo_cart_slot_device::addon_r),(neogeo_cart_slot_device*)m_slots[m_curr_slot])); space.install_read_handler(0x2ffff0, 0x2ffff1, read16_delegate(FUNC(neogeo_cart_slot_device::addon_r),(neogeo_cart_slot_device*)m_slots[m_curr_slot])); break; case NEOGEO_MSLUG3: - space.install_write_handler(0x2fffe4, 0x2fffe5, write16_delegate(FUNC(neogeo_state::write_bankprot),this)); + space.install_write_handler(0x2fffe4, 0x2fffe5, write16_delegate(FUNC(neogeo_base_state::write_bankprot),this)); space.install_read_handler(0x2fe446, 0x2fe447, read16_delegate(FUNC(neogeo_cart_slot_device::protection_r),(neogeo_cart_slot_device*)m_slots[m_curr_slot])); //space.install_read_handler(0x2ffff8, 0x2ffff9, read16_delegate(FUNC(neogeo_cart_slot_device::addon_r),(neogeo_cart_slot_device*)m_slots[m_curr_slot])); //space.install_read_handler(0x2ffffa, 0x2ffffb, read16_delegate(FUNC(neogeo_cart_slot_device::addon_r),(neogeo_cart_slot_device*)m_slots[m_curr_slot])); break; case NEOGEO_KOF2K: // addon_r here gives SMA random number - space.install_write_handler(0x2fffec, 0x2fffed, write16_delegate(FUNC(neogeo_state::write_bankprot),this)); + space.install_write_handler(0x2fffec, 0x2fffed, write16_delegate(FUNC(neogeo_base_state::write_bankprot),this)); space.install_read_handler(0x2fe446, 0x2fe447, read16_delegate(FUNC(neogeo_cart_slot_device::protection_r),(neogeo_cart_slot_device*)m_slots[m_curr_slot])); space.install_read_handler(0x2fffd8, 0x2fffd9, read16_delegate(FUNC(neogeo_cart_slot_device::addon_r),(neogeo_cart_slot_device*)m_slots[m_curr_slot])); space.install_read_handler(0x2fffda, 0x2fffdb, read16_delegate(FUNC(neogeo_cart_slot_device::addon_r),(neogeo_cart_slot_device*)m_slots[m_curr_slot])); @@ -1392,14 +1383,14 @@ void neogeo_state::set_slot_idx(int slot) case NEOGEO_KOF2K3H: case NEOGEO_SVCBOOT: case NEOGEO_SVCSPLUS: - space.install_readwrite_handler(0x2fe000, 0x2fffff, read16_delegate(FUNC(neogeo_cart_slot_device::protection_r),(neogeo_cart_slot_device*)m_slots[m_curr_slot]), write16_delegate(FUNC(neogeo_state::write_bankprot_pvc),this)); + space.install_readwrite_handler(0x2fe000, 0x2fffff, read16_delegate(FUNC(neogeo_cart_slot_device::protection_r),(neogeo_cart_slot_device*)m_slots[m_curr_slot]), write16_delegate(FUNC(neogeo_base_state::write_bankprot_pvc),this)); break; case NEOGEO_CTHD2K3: case NEOGEO_CT2K3SP: - space.install_write_handler(0x2ffff0, 0x2ffff1, write16_delegate(FUNC(neogeo_state::write_bankprot),this)); + space.install_write_handler(0x2ffff0, 0x2ffff1, write16_delegate(FUNC(neogeo_base_state::write_bankprot),this)); break; case NEOGEO_MSLUG5P: - space.install_readwrite_handler(0x2ffff0, 0x2fffff, read16_delegate(FUNC(neogeo_cart_slot_device::protection_r),(neogeo_cart_slot_device*)m_slots[m_curr_slot]), write16_delegate(FUNC(neogeo_state::write_bankprot_ms5p),this)); + space.install_readwrite_handler(0x2ffff0, 0x2fffff, read16_delegate(FUNC(neogeo_cart_slot_device::protection_r),(neogeo_cart_slot_device*)m_slots[m_curr_slot]), write16_delegate(FUNC(neogeo_base_state::write_bankprot_ms5p),this)); break; case NEOGEO_KOG: space.install_read_handler(0x0ffffe, 0x0fffff, read16_delegate(FUNC(neogeo_cart_slot_device::protection_r),(neogeo_cart_slot_device*)m_slots[m_curr_slot])); @@ -1407,11 +1398,11 @@ void neogeo_state::set_slot_idx(int slot) case NEOGEO_KOF2K3B: case NEOGEO_KOF2K3UP: // addon_r here gives m_overlay member from bootleg protection (possibly hack?) - space.install_readwrite_handler(0x2fe000, 0x2fffff, read16_delegate(FUNC(neogeo_cart_slot_device::protection_r),(neogeo_cart_slot_device*)m_slots[m_curr_slot]), write16_delegate(FUNC(neogeo_state::write_bankprot_kf2k3bl),this)); + space.install_readwrite_handler(0x2fe000, 0x2fffff, read16_delegate(FUNC(neogeo_cart_slot_device::protection_r),(neogeo_cart_slot_device*)m_slots[m_curr_slot]), write16_delegate(FUNC(neogeo_base_state::write_bankprot_kf2k3bl),this)); space.install_read_handler(0x58196, 0x58197, read16_delegate(FUNC(neogeo_cart_slot_device::addon_r),(neogeo_cart_slot_device*)m_slots[m_curr_slot])); break; case NEOGEO_KOF2K3P: - space.install_readwrite_handler(0x2fe000, 0x2fffff, read16_delegate(FUNC(neogeo_cart_slot_device::protection_r),(neogeo_cart_slot_device*)m_slots[m_curr_slot]), write16_delegate(FUNC(neogeo_state::write_bankprot_kf2k3bl),this)); + space.install_readwrite_handler(0x2fe000, 0x2fffff, read16_delegate(FUNC(neogeo_cart_slot_device::protection_r),(neogeo_cart_slot_device*)m_slots[m_curr_slot]), write16_delegate(FUNC(neogeo_base_state::write_bankprot_kf2k3bl),this)); break; case NEOGEO_SBP: // there seems to be a protection device living around here.. @@ -1423,11 +1414,11 @@ void neogeo_state::set_slot_idx(int slot) break; case NEOGEO_KOF10TH: // addon_r here reads from ram2 bank - space.install_read_handler(0x000080, 0x0dffff, read16_delegate(FUNC(neogeo_state::read_lorom_kof10th),this)); + space.install_read_handler(0x000080, 0x0dffff, read16_delegate(FUNC(neogeo_base_state::read_lorom_kof10th),this)); space.install_read_handler(0x0e0000, 0x0fffff, read16_delegate(FUNC(neogeo_cart_slot_device::addon_r),(neogeo_cart_slot_device*)m_slots[m_curr_slot])); space.install_read_handler(0x2fe000, 0x2fffff, read16_delegate(FUNC(neogeo_cart_slot_device::protection_r),(neogeo_cart_slot_device*)m_slots[m_curr_slot])); // REVIEW ME: we might possibly need to split this, by adding further write handlers - space.install_write_handler(0x200000, 0x2fffff, write16_delegate(FUNC(neogeo_state::write_bankprot_kof10th),this)); + space.install_write_handler(0x200000, 0x2fffff, write16_delegate(FUNC(neogeo_base_state::write_bankprot_kof10th),this)); break; case NEOGEO_JOCKEYGP: space.install_readwrite_handler(0x200000, 0x201fff, read16_delegate(FUNC(neogeo_cart_slot_device::ram_r),(neogeo_cart_slot_device*)m_slots[m_curr_slot]), write16_delegate(FUNC(neogeo_cart_slot_device::ram_w),(neogeo_cart_slot_device*)m_slots[m_curr_slot])); @@ -1449,7 +1440,7 @@ void neogeo_state::set_slot_idx(int slot) * *************************************/ -void neogeo_state::machine_start() +void neogeo_base_state::machine_start() { m_use_cart_vectors = 0; @@ -1468,25 +1459,35 @@ void neogeo_state::machine_start() save_item(NAME(m_vblank_interrupt_pending)); save_item(NAME(m_display_position_interrupt_pending)); save_item(NAME(m_irq3_pending)); - save_item(NAME(m_audio_cpu_nmi_enabled)); - save_item(NAME(m_audio_cpu_nmi_pending)); save_item(NAME(m_curr_slot)); save_item(NAME(m_bank_base)); save_item(NAME(m_use_cart_vectors)); save_item(NAME(m_use_cart_audio)); - machine().save().register_postload(save_prepost_delegate(FUNC(neogeo_state::neogeo_postload), this)); + machine().save().register_postload(save_prepost_delegate(FUNC(neogeo_base_state::neogeo_postload), this)); } void ngarcade_base_state::machine_start() { - neogeo_state::machine_start(); + neogeo_base_state::machine_start(); + + address_space &main_program_space(m_maincpu->space(AS_PROGRAM)); - // install controllers if (m_ctrl1) - m_maincpu->space(AS_PROGRAM).install_read_handler(0x300000, 0x300001, 0, 0x01ff7e, 0, read16_delegate(FUNC(ngarcade_base_state::in0_r), this)); + main_program_space.install_read_handler(0x300000, 0x300001, 0, 0x01ff7e, 0, read16_delegate(FUNC(ngarcade_base_state::in0_edge_joy_r), this)); + else if (m_edge) + main_program_space.install_read_handler(0x300000, 0x300001, 0, 0x01ff7e, 0, read16_delegate(FUNC(ngarcade_base_state::in0_edge_r), this)); + if (m_ctrl2) - m_maincpu->space(AS_PROGRAM).install_read_handler(0x340000, 0x340001, 0, 0x01fffe, 0, read16_delegate(FUNC(ngarcade_base_state::in1_r), this)); + main_program_space.install_read_handler(0x340000, 0x340001, 0, 0x01fffe, 0, read16_delegate(FUNC(ngarcade_base_state::in1_edge_joy_r), this)); + else if (m_edge) + main_program_space.install_read_handler(0x340000, 0x340001, 0, 0x01fffe, 0, read16_delegate(FUNC(ngarcade_base_state::in1_edge_r), this)); + + if (m_memcard) + { + main_program_space.unmap_readwrite(0x800000, 0x800fff); + main_program_space.install_readwrite_handler(0x800000, 0x800fff, read16_delegate(FUNC(ngarcade_base_state::memcard_r), this), write16_delegate(FUNC(ngarcade_base_state::memcard_w), this)); + } // enable rtc and serial mode m_upd4990a->cs_w(1); @@ -1519,7 +1520,7 @@ void mvs_state::machine_start() } -void neogeo_state::neogeo_postload() +void neogeo_base_state::neogeo_postload() { m_bank_audio_main->set_entry(m_use_cart_audio); } @@ -1541,12 +1542,11 @@ void mvs_state::neogeo_postload() *************************************/ -void neogeo_state::machine_reset() +void neogeo_base_state::machine_reset() { // disable audiocpu nmi - m_audio_cpu_nmi_enabled = false; - m_audio_cpu_nmi_pending = false; - audio_cpu_check_nmi(); + m_audionmi->in_w<1>(0); + m_soundlatch->acknowledge_r(machine().dummy_space(), 0); m_maincpu->reset(); @@ -1566,7 +1566,7 @@ void neogeo_state::machine_reset() *************************************/ -READ16_MEMBER(neogeo_state::banked_vectors_r) +READ16_MEMBER(neogeo_base_state::banked_vectors_r) { if (!m_use_cart_vectors) { @@ -1586,38 +1586,37 @@ READ16_MEMBER(neogeo_state::banked_vectors_r) * *************************************/ +void neogeo_base_state::base_main_map(address_map &map) +{ + map(0x320000, 0x320000).mirror(0x01fffe).w(m_soundlatch, FUNC(generic_latch_8_device::write)); + map(0x360000, 0x37ffff).r(this, FUNC(aes_base_state::unmapped_r)); + map(0x380000, 0x38007f).mirror(0x01ff80).w(this, FUNC(neogeo_base_state::io_control_w)).umask16(0x00ff); + map(0x3a0000, 0x3a001f).mirror(0x01ffe0).r(this, FUNC(neogeo_base_state::unmapped_r)); + map(0x3a0000, 0x3a001f).mirror(0x01ffe0).w("systemlatch", FUNC(hc259_device::write_a3)).umask16(0x00ff); // BITW1 (system control registers) + map(0x3c0000, 0x3c0007).mirror(0x01fff8).r(this, FUNC(neogeo_base_state::video_register_r)); + map(0x3c0000, 0x3c000f).mirror(0x01fff0).w(this, FUNC(neogeo_base_state::video_register_w)); + map(0x3e0000, 0x3fffff).r(this, FUNC(ngarcade_base_state::unmapped_r)); + map(0x400000, 0x401fff).mirror(0x3fe000).rw(this, FUNC(neogeo_base_state::paletteram_r), FUNC(neogeo_base_state::paletteram_w)); +} + void ngarcade_base_state::neogeo_main_map(address_map &map) { + base_main_map(map); + map(0x000000, 0x00007f).r(this, FUNC(ngarcade_base_state::banked_vectors_r)); map(0x100000, 0x10ffff).mirror(0x0f0000).ram(); - /* some games have protection devices in the 0x200000 region, it appears to map to cart space, not surprising, the ROM is read here too */ + // some games have protection devices in the 0x200000 region, it appears to map to cart space, not surprising, the ROM is read here too map(0x300080, 0x300081).mirror(0x01ff7e).portr("TEST"); map(0x300001, 0x300001).mirror(0x01fffe).w("watchdog", FUNC(watchdog_timer_device::reset_w)); map(0x320000, 0x320001).mirror(0x01fffe).portr("AUDIO/COIN"); - map(0x320000, 0x320000).mirror(0x01fffe).w(this, FUNC(ngarcade_base_state::audio_command_w)); - map(0x360000, 0x37ffff).r(this, FUNC(ngarcade_base_state::unmapped_r)); map(0x380000, 0x380001).mirror(0x01fffe).portr("SYSTEM"); - map(0x380000, 0x38007f).mirror(0x01ff80).w(this, FUNC(ngarcade_base_state::io_control_w)).umask16(0x00ff); - map(0x3a0000, 0x3a001f).mirror(0x01ffe0).r(this, FUNC(ngarcade_base_state::unmapped_r)); - map(0x3a0000, 0x3a001f).mirror(0x01ffe0).w("systemlatch", FUNC(hc259_device::write_a3)).umask16(0x00ff); // BITW1 (system control registers) - map(0x3c0000, 0x3c0007).mirror(0x01fff8).r(this, FUNC(ngarcade_base_state::video_register_r)); - map(0x3c0000, 0x3c000f).mirror(0x01fff0).w(this, FUNC(ngarcade_base_state::video_register_w)); - map(0x3e0000, 0x3fffff).r(this, FUNC(ngarcade_base_state::unmapped_r)); - map(0x400000, 0x401fff).mirror(0x3fe000).rw(this, FUNC(ngarcade_base_state::paletteram_r), FUNC(ngarcade_base_state::paletteram_w)); - map(0x800000, 0x800fff).rw(this, FUNC(ngarcade_base_state::memcard_r), FUNC(ngarcade_base_state::memcard_w)); + map(0x800000, 0x800fff).r(this, FUNC(ngarcade_base_state::unmapped_r)); // memory card mapped here if present map(0xc00000, 0xc1ffff).mirror(0x0e0000).rom().region("mainbios", 0); map(0xd00000, 0xd0ffff).mirror(0x0f0000).ram().w(this, FUNC(ngarcade_base_state::save_ram_w)).share("saveram"); map(0xe00000, 0xffffff).r(this, FUNC(ngarcade_base_state::unmapped_r)); } -void ngarcade_base_state::main_map_slot(address_map &map) -{ - neogeo_main_map(map); - map(0x000000, 0x00007f).r(this, FUNC(ngarcade_base_state::banked_vectors_r)); -} - - READ16_MEMBER(aes_base_state::aes_in2_r) { @@ -1627,27 +1626,26 @@ READ16_MEMBER(aes_base_state::aes_in2_r) return ret; } -void aes_base_state::aes_main_map(address_map &map) +void aes_base_state::aes_base_main_map(address_map &map) { - map(0x000000, 0x00007f).r(this, FUNC(aes_base_state::banked_vectors_r)); - map(0x100000, 0x10ffff).mirror(0x0f0000).ram(); - // some games have protection devices in the 0x200000 region, it appears to map to cart space, not surprising, the ROM is read here too + base_main_map(map); + map(0x300000, 0x300000).mirror(0x01fffe).r(m_ctrl1, FUNC(neogeo_control_port_device::ctrl_r)); map(0x320000, 0x320001).mirror(0x01fffe).portr("AUDIO"); - map(0x320000, 0x320000).mirror(0x01fffe).w(this, FUNC(aes_base_state::audio_command_w)); map(0x340000, 0x340000).mirror(0x01fffe).r(m_ctrl2, FUNC(neogeo_control_port_device::ctrl_r)); - map(0x360000, 0x37ffff).r(this, FUNC(aes_base_state::unmapped_r)); map(0x380000, 0x380001).mirror(0x01fffe).r(this, FUNC(aes_base_state::aes_in2_r)); - map(0x380000, 0x38007f).mirror(0x01ff80).w(this, FUNC(aes_base_state::io_control_w)).umask16(0x00ff); - map(0x3a0000, 0x3a001f).mirror(0x01ffe0).r(this, FUNC(aes_base_state::unmapped_r)); - map(0x3a0000, 0x3a001f).mirror(0x01ffe0).w("systemlatch", FUNC(hc259_device::write_a3)).umask16(0x00ff); - map(0x3c0000, 0x3c0007).mirror(0x01fff8).r(this, FUNC(aes_base_state::video_register_r)); - map(0x3c0000, 0x3c000f).mirror(0x01fff0).w(this, FUNC(aes_base_state::video_register_w)); - map(0x3e0000, 0x3fffff).r(this, FUNC(aes_base_state::unmapped_r)); - map(0x400000, 0x401fff).mirror(0x3fe000).rw(this, FUNC(aes_base_state::paletteram_r), FUNC(aes_base_state::paletteram_w)); - map(0x800000, 0x800fff).rw(this, FUNC(aes_base_state::memcard_r), FUNC(aes_base_state::memcard_w)); +} + +void aes_state::aes_main_map(address_map &map) +{ + aes_base_main_map(map); + + map(0x000000, 0x00007f).r(this, FUNC(aes_state::banked_vectors_r)); + map(0x100000, 0x10ffff).mirror(0x0f0000).ram(); + // some games have protection devices in the 0x200000 region, it appears to map to cart space, not surprising, the ROM is read here too + map(0x800000, 0x800fff).rw(this, FUNC(aes_state::memcard_r), FUNC(aes_state::memcard_w)); map(0xc00000, 0xc1ffff).mirror(0x0e0000).rom().region("mainbios", 0); - map(0xd00000, 0xffffff).r(this, FUNC(aes_base_state::unmapped_r)); + map(0xd00000, 0xffffff).r(this, FUNC(aes_state::unmapped_r)); } @@ -1657,7 +1655,7 @@ void aes_base_state::aes_main_map(address_map &map) * *************************************/ -void neogeo_state::audio_map(address_map &map) +void neogeo_base_state::audio_map(address_map &map) { map(0x0000, 0x7fff).bankr("audio_main"); map(0x8000, 0xbfff).bankr("audio_8000"); @@ -1675,12 +1673,12 @@ void neogeo_state::audio_map(address_map &map) * *************************************/ -void neogeo_state::audio_io_map(address_map &map) +void neogeo_base_state::audio_io_map(address_map &map) { - map(0x00, 0x00).mirror(0xff00).r(this, FUNC(neogeo_state::audio_command_r)).w(m_soundlatch, FUNC(generic_latch_8_device::clear_w)); + map(0x00, 0x00).mirror(0xff00).rw(m_soundlatch, FUNC(generic_latch_8_device::read), FUNC(generic_latch_8_device::clear_w)); map(0x04, 0x07).mirror(0xff00).rw(m_ym, FUNC(ym2610_device::read), FUNC(ym2610_device::write)); - map(0x08, 0x08).mirror(0xff00).select(0x0010).w(this, FUNC(neogeo_state::audio_cpu_enable_nmi_w)); - map(0x08, 0x0b).mirror(0x00f0).select(0xff00).r(this, FUNC(neogeo_state::audio_cpu_bank_select_r)); + map(0x08, 0x08).mirror(0xff00).select(0x0010).w(this, FUNC(neogeo_base_state::audio_cpu_enable_nmi_w)); + map(0x08, 0x0b).mirror(0x00f0).select(0xff00).r(this, FUNC(neogeo_base_state::audio_cpu_bank_select_r)); map(0x0c, 0x0c).mirror(0xff00).w(m_soundlatch2, FUNC(generic_latch_8_device::write)); } @@ -1722,22 +1720,21 @@ INPUT_PORTS_START( neogeo ) PORT_START("SYSTEM") PORT_BIT( 0x00ff, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_START1 ) - PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("Next Game") PORT_CODE(KEYCODE_3) + PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_START2 ) - PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("Previous Game") PORT_CODE(KEYCODE_4) - PORT_BIT( 0x7000, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(DEVICE_SELF, neogeo_state, get_memcard_status, nullptr) + PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x7000, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(DEVICE_SELF, neogeo_base_state, get_memcard_status, nullptr) PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_SPECIAL ) /* Hardware type (AES=0, MVS=1). Some games check this and show a piracy warning screen if the hardware and BIOS don't match */ PORT_START("AUDIO/COIN") - PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_COIN1 ) - PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_COIN2 ) + PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_COIN1 ) // coin 1 (combined) or P1 coin 1 (separate) for BIOS that supports it + PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_COIN2 ) // coin 2 (combined) or P2 coin 1 (separate) for BIOS that supports it PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_SERVICE1 ) - PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_COIN3 ) /* What is this? "us-e" BIOS uses it as a coin input; Universe BIOS uses it to detect MVS or AES hardware */ - PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_COIN4 ) /* What is this? "us-e" BIOS uses it as a coin input; Universe BIOS uses it to detect MVS or AES hardware */ + PORT_BIT( 0x0018, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_SPECIAL ) /* what is this? When ACTIVE_HIGH + IN4 bit 6 ACTIVE_LOW MVS-4 slot is detected */ PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_READ_LINE_DEVICE_MEMBER("upd4990a", upd1990a_device, tp_r) PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_READ_LINE_DEVICE_MEMBER("upd4990a", upd1990a_device, data_out_r) - PORT_BIT( 0xff00, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(DEVICE_SELF, neogeo_state,get_audio_result, nullptr) + PORT_BIT( 0xff00, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(DEVICE_SELF, neogeo_base_state,get_audio_result, nullptr) PORT_START("TEST") PORT_BIT( 0x003f, IP_ACTIVE_HIGH, IPT_UNUSED ) @@ -1746,9 +1743,17 @@ INPUT_PORTS_START( neogeo ) PORT_BIT( 0xff00, IP_ACTIVE_LOW, IPT_UNUSED ) INPUT_PORTS_END -static INPUT_PORTS_START( neogeo_6slot ) +static INPUT_PORTS_START( neogeo_mvs ) PORT_INCLUDE( neogeo ) + PORT_MODIFY("SYSTEM") + PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("Next Game") PORT_CODE(KEYCODE_3) + PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("Previous Game") PORT_CODE(KEYCODE_4) + + PORT_MODIFY("AUDIO/COIN") + PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_COIN3 ) // P1 coin 2 (separate) for BIOS that supports it + PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_COIN4 ) // P2 coin 2 (separate) for BIOS that supports it + PORT_MODIFY("TEST") PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_SPECIAL ) INPUT_PORTS_END @@ -1759,14 +1764,14 @@ INPUT_PORTS_START( aes ) PORT_START("IN2") PORT_BIT( 0x0fff, IP_ACTIVE_LOW, IPT_UNUSED ) // Start & Select are read from controller slot device - PORT_BIT( 0x7000, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(DEVICE_SELF, neogeo_state, get_memcard_status, nullptr) + PORT_BIT( 0x7000, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(DEVICE_SELF, neogeo_base_state, get_memcard_status, nullptr) PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_SPECIAL ) /* Hardware type (AES=0, MVS=1) Some games check this and show a piracy warning screen if the hardware and BIOS don't match */ PORT_START("AUDIO") PORT_BIT( 0x0007, IP_ACTIVE_HIGH, IPT_UNUSED ) /* AES has no coin slots, it's a console */ PORT_BIT( 0x0018, IP_ACTIVE_HIGH, IPT_UNKNOWN ) /* what is this? Universe BIOS uses these bits to detect MVS or AES hardware */ PORT_BIT( 0x00e0, IP_ACTIVE_HIGH, IPT_UNUSED ) /* AES has no upd4990a */ - PORT_BIT( 0xff00, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(DEVICE_SELF, neogeo_state, get_audio_result, nullptr) + PORT_BIT( 0xff00, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(DEVICE_SELF, neogeo_base_state, get_audio_result, nullptr) PORT_START("JP") // JP1 and JP2 are jumpers or solderpads depending on AES board revision, intended for use on the Development BIOS PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Short JP1 (Debug Monitor)") PORT_CODE(KEYCODE_F1) PORT_CHANGED_MEMBER(DEVICE_SELF, aes_state, aes_jp1, 0) @@ -1789,7 +1794,7 @@ INPUT_CHANGED_MEMBER(aes_base_state::aes_jp1) * *************************************/ -MACHINE_CONFIG_START(neogeo_state::neogeo_base) +MACHINE_CONFIG_START(neogeo_base_state::neogeo_base) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, NEOGEO_MAIN_CPU_CLOCK) @@ -1799,12 +1804,12 @@ MACHINE_CONFIG_START(neogeo_state::neogeo_base) MCFG_CPU_IO_MAP(audio_io_map) MCFG_DEVICE_ADD("systemlatch", HC259, 0) - MCFG_ADDRESSABLE_LATCH_Q0_OUT_CB(WRITELINE(neogeo_state, set_screen_shadow)) - MCFG_ADDRESSABLE_LATCH_Q1_OUT_CB(WRITELINE(neogeo_state, set_use_cart_vectors)) + MCFG_ADDRESSABLE_LATCH_Q0_OUT_CB(WRITELINE(neogeo_base_state, set_screen_shadow)) + MCFG_ADDRESSABLE_LATCH_Q1_OUT_CB(WRITELINE(neogeo_base_state, set_use_cart_vectors)) MCFG_ADDRESSABLE_LATCH_Q2_OUT_CB(NOOP) // memory card 1: write enable/disable MCFG_ADDRESSABLE_LATCH_Q3_OUT_CB(NOOP) // memory card 2: write disable/enable MCFG_ADDRESSABLE_LATCH_Q4_OUT_CB(NOOP) // memory card: register select enable/set to normal (what does it mean?) - MCFG_ADDRESSABLE_LATCH_Q7_OUT_CB(WRITELINE(neogeo_state, set_palette_bank)) + MCFG_ADDRESSABLE_LATCH_Q7_OUT_CB(WRITELINE(neogeo_base_state, set_palette_bank)) MCFG_WATCHDOG_ADD("watchdog") @@ -1813,7 +1818,7 @@ MACHINE_CONFIG_START(neogeo_state::neogeo_base) MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_RAW_PARAMS(NEOGEO_PIXEL_CLOCK, NEOGEO_HTOTAL, NEOGEO_HBEND, NEOGEO_HBSTART, NEOGEO_VTOTAL, NEOGEO_VBEND, NEOGEO_VBSTART) - MCFG_SCREEN_UPDATE_DRIVER(neogeo_state, screen_update_neogeo) + MCFG_SCREEN_UPDATE_DRIVER(neogeo_base_state, screen_update_neogeo) /* 4096 colors * two banks * normal and shadow */ MCFG_PALETTE_ADD_INIT_BLACK("palette", 4096*2*2) @@ -1821,13 +1826,24 @@ MACHINE_CONFIG_START(neogeo_state::neogeo_base) MCFG_DEVICE_ADD("spritegen", NEOGEO_SPRITE_OPTIMZIED, 0) /* audio hardware */ - MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") + MCFG_INPUT_MERGER_ALL_HIGH("audionmi") + MCFG_INPUT_MERGER_OUTPUT_HANDLER(INPUTLINE("audiocpu", INPUT_LINE_NMI)); MCFG_GENERIC_LATCH_8_ADD("soundlatch") + MCFG_GENERIC_LATCH_SEPARATE_ACKNOWLEDGE(false) + MCFG_GENERIC_LATCH_DATA_PENDING_CB(DEVWRITELINE("audionmi", input_merger_device, in_w<0>)) + MCFG_GENERIC_LATCH_8_ADD("soundlatch2") MCFG_SOUND_ADD("ymsnd", YM2610, NEOGEO_YM2610_CLOCK) MCFG_YM2610_IRQ_HANDLER(INPUTLINE("audiocpu", 0)) +MACHINE_CONFIG_END + + +MACHINE_CONFIG_START(neogeo_base_state::neogeo_stereo) + MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") + + MCFG_DEVICE_MODIFY("ymsnd") MCFG_SOUND_ROUTE(0, "lspeaker", 0.28) MCFG_SOUND_ROUTE(0, "rspeaker", 0.28) MCFG_SOUND_ROUTE(1, "lspeaker", 0.98) @@ -1837,8 +1853,9 @@ MACHINE_CONFIG_END MACHINE_CONFIG_START(ngarcade_base_state::neogeo_arcade) neogeo_base(config); + MCFG_CPU_MODIFY("maincpu") - MCFG_CPU_PROGRAM_MAP(main_map_slot) + MCFG_CPU_PROGRAM_MAP(neogeo_main_map) MCFG_DEVICE_MODIFY("systemlatch") MCFG_ADDRESSABLE_LATCH_Q5_OUT_CB(WRITELINE(ngarcade_base_state, set_use_cart_audio)) @@ -1849,72 +1866,144 @@ MACHINE_CONFIG_START(ngarcade_base_state::neogeo_arcade) MCFG_UPD4990A_ADD("upd4990a", XTAL(32'768), NOOP, NOOP) MCFG_NVRAM_ADD_0FILL("saveram") - MCFG_NEOGEO_MEMCARD_ADD("memcard") +MACHINE_CONFIG_END - MCFG_NEOGEO_CONTROL_EDGE_CONNECTOR_ADD("edge", neogeo_arc_edge, "joy", true) - MCFG_NEOGEO_CONTROL_PORT_ADD("ctrl1", neogeo_arc_pin15, "", true) - MCFG_NEOGEO_CONTROL_PORT_ADD("ctrl2", neogeo_arc_pin15, "", true) +MACHINE_CONFIG_START(ngarcade_base_state::neogeo_mono) + MCFG_SPEAKER_STANDARD_MONO("speaker") + + MCFG_DEVICE_MODIFY("ymsnd") + MCFG_SOUND_ROUTE(0, "speaker", 0.28) + MCFG_SOUND_ROUTE(1, "speaker", 0.49) + MCFG_SOUND_ROUTE(2, "speaker", 0.49) MACHINE_CONFIG_END // configurable slot -// for the moment we use only the six slot version, but we might want to support other PCBs as well #define NEOGEO_CONFIG_CARTSLOT(_tag) \ MCFG_NEOGEO_CARTRIDGE_ADD(_tag, neogeo_cart, nullptr) -// a single cartslot (MV-1 and later) -#define NEOGEO_CONFIG_ONE_CARTSLOT \ +// non-configurable slot (to be used for non-softlist sets, until we introduce some 'template' concept) +// a single cart in slot 1, with pre-defined cart type +#define NEOGEO_CONFIG_ONE_FIXED_CARTSLOT(_default) \ + MCFG_NEOGEO_CARTRIDGE_ADD("cslot1", neogeo_cart, _default) \ + MCFG_SET_IMAGE_LOADABLE(false) + +MACHINE_CONFIG_START(mvs_state::mv1) + neogeo_arcade(config); + neogeo_stereo(config); + + MCFG_NEOGEO_MEMCARD_ADD("memcard") + + MCFG_NEOGEO_CONTROL_EDGE_CONNECTOR_ADD("edge", neogeo_arc_edge, "joy", false) + + MCFG_NEOGEO_CONTROL_PORT_ADD("ctrl1", neogeo_arc_pin15, "", false) + MCFG_NEOGEO_CONTROL_PORT_ADD("ctrl2", neogeo_arc_pin15, "", false) + NEOGEO_CONFIG_CARTSLOT("cslot1") -// two cartslots (MV-2F) -#define NEOGEO_CONFIG_TWO_CARTSLOTS \ - NEOGEO_CONFIG_CARTSLOT("cslot1") \ + MCFG_SOFTWARE_LIST_ADD("cart_list", "neogeo") +MACHINE_CONFIG_END + +MACHINE_CONFIG_START(mvs_state::mv1f) + neogeo_arcade(config); + neogeo_stereo(config); + + MCFG_NEOGEO_CONTROL_EDGE_CONNECTOR_ADD("edge", neogeo_arc_edge, "joy", false) + + MCFG_NEOGEO_CONTROL_PORT_ADD("ctrl1", neogeo_arc_pin15, "", false) + MCFG_NEOGEO_CONTROL_PORT_ADD("ctrl2", neogeo_arc_pin15, "", false) + + NEOGEO_CONFIG_CARTSLOT("cslot1") + + MCFG_SOFTWARE_LIST_ADD("cart_list", "neogeo") +MACHINE_CONFIG_END + +MACHINE_CONFIG_START(mvs_state::mv1fz) + neogeo_arcade(config); + neogeo_mono(config); + + MCFG_NEOGEO_CONTROL_EDGE_CONNECTOR_ADD("edge", neogeo_arc_edge, "joy", false) + + NEOGEO_CONFIG_CARTSLOT("cslot1") + + MCFG_SOFTWARE_LIST_ADD("cart_list", "neogeo") +MACHINE_CONFIG_END + +MACHINE_CONFIG_START(mvs_state::mv2f) + neogeo_arcade(config); + neogeo_stereo(config); + + MCFG_NEOGEO_MEMCARD_ADD("memcard") + + MCFG_NEOGEO_CONTROL_EDGE_CONNECTOR_ADD("edge", neogeo_arc_edge, "joy", false) + + MCFG_NEOGEO_CONTROL_PORT_ADD("ctrl1", neogeo_arc_pin15, "", false) + MCFG_NEOGEO_CONTROL_PORT_ADD("ctrl2", neogeo_arc_pin15, "", false) + + NEOGEO_CONFIG_CARTSLOT("cslot1") NEOGEO_CONFIG_CARTSLOT("cslot2") -// four cartslots (MV-4F) -#define NEOGEO_CONFIG_FOUR_CARTSLOTS \ - NEOGEO_CONFIG_CARTSLOT("cslot1") \ - NEOGEO_CONFIG_CARTSLOT("cslot2") \ - NEOGEO_CONFIG_CARTSLOT("cslot3") \ - NEOGEO_CONFIG_CARTSLOT("cslot4") + MCFG_SOFTWARE_LIST_ADD("cart_list", "neogeo") +MACHINE_CONFIG_END -// six cartslots (MV-6F) -#define NEOGEO_CONFIG_SIX_CARTSLOTS \ - NEOGEO_CONFIG_CARTSLOT("cslot1") \ - NEOGEO_CONFIG_CARTSLOT("cslot2") \ - NEOGEO_CONFIG_CARTSLOT("cslot3") \ - NEOGEO_CONFIG_CARTSLOT("cslot4") \ - NEOGEO_CONFIG_CARTSLOT("cslot5") \ - NEOGEO_CONFIG_CARTSLOT("cslot6") +MACHINE_CONFIG_START(mvs_state::mv4f) + neogeo_arcade(config); + neogeo_stereo(config); + MCFG_NEOGEO_MEMCARD_ADD("memcard") -// non-configurable slot (to be used for non-softlist sets, until we introduce some 'template' concept) -// a single cart in slot 1, with pre-defined cart type -#define NEOGEO_CONFIG_ONE_FIXED_CARTSLOT(_default) \ - MCFG_NEOGEO_CARTRIDGE_ADD("cslot1", neogeo_cart, _default) \ - MCFG_SET_IMAGE_LOADABLE(false) + MCFG_NEOGEO_CONTROL_EDGE_CONNECTOR_ADD("edge", neogeo_arc_edge, "joy", false) + + MCFG_NEOGEO_CONTROL_PORT_ADD("ctrl1", neogeo_arc_pin15, "", false) + MCFG_NEOGEO_CONTROL_PORT_ADD("ctrl2", neogeo_arc_pin15, "", false) + + NEOGEO_CONFIG_CARTSLOT("cslot1") + NEOGEO_CONFIG_CARTSLOT("cslot2") + NEOGEO_CONFIG_CARTSLOT("cslot3") + NEOGEO_CONFIG_CARTSLOT("cslot4") + + MCFG_SOFTWARE_LIST_ADD("cart_list", "neogeo") +MACHINE_CONFIG_END -MACHINE_CONFIG_START(mvs_state::mvs) +MACHINE_CONFIG_START(mvs_state::mv6f) neogeo_arcade(config); - MCFG_DEVICE_REMOVE("edge") + neogeo_stereo(config); + + MCFG_NEOGEO_MEMCARD_ADD("memcard") + MCFG_NEOGEO_CONTROL_EDGE_CONNECTOR_ADD("edge", neogeo_arc_edge, "joy", false) - MCFG_DEVICE_REMOVE("ctrl1") - MCFG_DEVICE_REMOVE("ctrl2") MCFG_NEOGEO_CONTROL_PORT_ADD("ctrl1", neogeo_arc_pin15, "", false) MCFG_NEOGEO_CONTROL_PORT_ADD("ctrl2", neogeo_arc_pin15, "", false) - NEOGEO_CONFIG_SIX_CARTSLOTS + NEOGEO_CONFIG_CARTSLOT("cslot1") + NEOGEO_CONFIG_CARTSLOT("cslot2") + NEOGEO_CONFIG_CARTSLOT("cslot3") + NEOGEO_CONFIG_CARTSLOT("cslot4") + NEOGEO_CONFIG_CARTSLOT("cslot5") + NEOGEO_CONFIG_CARTSLOT("cslot6") MCFG_SOFTWARE_LIST_ADD("cart_list", "neogeo") MACHINE_CONFIG_END +MACHINE_CONFIG_START(mvs_state::mv1_fixed) + neogeo_arcade(config); + neogeo_stereo(config); + + MCFG_NEOGEO_MEMCARD_ADD("memcard") + + MCFG_NEOGEO_CONTROL_EDGE_CONNECTOR_ADD("edge", neogeo_arc_edge, "joy", true) + + MCFG_NEOGEO_CONTROL_PORT_ADD("ctrl1", neogeo_arc_pin15, "", true) + MCFG_NEOGEO_CONTROL_PORT_ADD("ctrl2", neogeo_arc_pin15, "", true) +MACHINE_CONFIG_END + void aes_base_state::machine_start() { - neogeo_state::machine_start(); + neogeo_base_state::machine_start(); m_sprgen->m_fixed_layer_bank_type = 0; m_sprgen->set_screen(m_screen); @@ -1942,6 +2031,8 @@ void aes_state::neogeo_postload() MACHINE_CONFIG_START(aes_state::aes) neogeo_base(config); + neogeo_stereo(config); + MCFG_CPU_MODIFY("maincpu") MCFG_CPU_PROGRAM_MAP(aes_main_map) @@ -2140,7 +2231,7 @@ MACHINE_CONFIG_END -/* dummy entry for the dummy bios driver */ +// dummy entry for the dummy bios driver ROM_START( neogeo ) NEOGEO_BIOS @@ -2164,15 +2255,20 @@ ROM_START( neogeo ) ROM_REGION( 0x100000, "sprites", ROMREGION_ERASEFF ) ROM_END +#define rom_ng_mv4f rom_neogeo +#define rom_ng_mv2f rom_neogeo +#define rom_ng_mv1 rom_neogeo +#define rom_ng_mv1f rom_neogeo +#define rom_ng_mv1fz rom_neogeo ROM_START( aes ) ROM_REGION16_BE( 0x20000, "mainbios", 0 ) ROM_SYSTEM_BIOS( 0, "asia", "Asia AES" ) - ROM_LOAD16_WORD_SWAP_BIOS( 0, "neo-epo.bin", 0x00000, 0x020000, CRC(d27a71f1) SHA1(1b3b22092f30c4d1b2c15f04d1670eb1e9fbea07) ) /* AES Console (Asia?) Bios */ + ROM_LOAD16_WORD_SWAP_BIOS( 0, "neo-epo.bin", 0x00000, 0x020000, CRC(d27a71f1) SHA1(1b3b22092f30c4d1b2c15f04d1670eb1e9fbea07) ) // AES Console (Asia?) Bios ROM_SYSTEM_BIOS( 1, "japan", "Japan AES" ) - ROM_LOAD16_WORD_SWAP_BIOS( 1, "neo-po.bin", 0x00000, 0x020000, CRC(16d0c132) SHA1(4e4a440cae46f3889d20234aebd7f8d5f522e22c) ) /* AES Console (Japan) Bios */ + ROM_LOAD16_WORD_SWAP_BIOS( 1, "neo-po.bin", 0x00000, 0x020000, CRC(16d0c132) SHA1(4e4a440cae46f3889d20234aebd7f8d5f522e22c) ) // AES Console (Japan) Bios ROM_SYSTEM_BIOS( 2, "devel", "Development System ROM" ) - ROM_LOAD16_WORD_SWAP_BIOS( 2, "neodebug.rom", 0x00000, 0x020000, CRC(698ebb7d) SHA1(081c49aa8cc7dad5939833dc1b18338321ea0a07) ) /* Official debug (development) ROM, for home-use base board */ + ROM_LOAD16_WORD_SWAP_BIOS( 2, "neodebug.rom", 0x00000, 0x020000, CRC(698ebb7d) SHA1(081c49aa8cc7dad5939833dc1b18338321ea0a07) ) // Official debug (development) ROM, for home-use base board NEOGEO_UNIBIOS(3) ROM_REGION( 0x200000, "maincpu", ROMREGION_ERASEFF ) @@ -2193,9 +2289,14 @@ ROM_END -// YEAR NAME PARENT COMPAT MACHINE INPUT STATE INIT -CONS( 1990, neogeo, 0, 0, mvs, neogeo_6slot, mvs_state, 0, "SNK", "Neo-Geo MVS", MACHINE_IS_BIOS_ROOT | MACHINE_SUPPORTS_SAVE ) -CONS( 1990, aes, 0, 0, aes, aes, aes_state, 0, "SNK", "Neo-Geo AES", MACHINE_SUPPORTS_SAVE ) +// YEAR NAME PARENT COMPAT MACHINE INPUT STATE INIT +CONS( 1990, neogeo, 0, 0, mv6f, neogeo_mvs, mvs_state, 0, "SNK", "Neo-Geo MV-6F", MACHINE_IS_BIOS_ROOT | MACHINE_SUPPORTS_SAVE ) +CONS( 1990, ng_mv4f, neogeo, 0, mv4f, neogeo_mvs, mvs_state, 0, "SNK", "Neo-Geo MV-4F", MACHINE_SUPPORTS_SAVE ) +CONS( 1990, ng_mv2f, neogeo, 0, mv2f, neogeo_mvs, mvs_state, 0, "SNK", "Neo-Geo MV-2F", MACHINE_SUPPORTS_SAVE ) +CONS( 1990, ng_mv1, neogeo, 0, mv1, neogeo, mvs_state, 0, "SNK", "Neo-Geo MV-1", MACHINE_SUPPORTS_SAVE ) +CONS( 1990, ng_mv1f, neogeo, 0, mv1f, neogeo, mvs_state, 0, "SNK", "Neo-Geo MV-1F", MACHINE_SUPPORTS_SAVE ) +CONS( 1990, ng_mv1fz, neogeo, 0, mv1fz, neogeo, mvs_state, 0, "SNK", "Neo-Geo MV-1FZ", MACHINE_SUPPORTS_SAVE ) +CONS( 1990, aes, 0, 0, aes, aes, aes_state, 0, "SNK", "Neo-Geo AES", MACHINE_SUPPORTS_SAVE ) @@ -2210,18 +2311,18 @@ CONS( 1990, aes, 0, 0, aes, aes, aes_state, 0, " // machine config for one-game fixed config, loaded without using softlists MACHINE_CONFIG_START(mvs_state::neobase) - neogeo_arcade(config); + mv1_fixed(config); NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("rom") MACHINE_CONFIG_END // used by fatfury2 & ssideki MACHINE_CONFIG_START(mvs_state::fatfur2) - neogeo_arcade(config); + mv1_fixed(config); NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("rom_fatfur2") MACHINE_CONFIG_END MACHINE_CONFIG_START(mvs_state::kizuna4p) - neogeo_arcade(config); + mv1_fixed(config); MCFG_DEVICE_REMOVE("edge") MCFG_NEOGEO_CONTROL_EDGE_CONNECTOR_ADD("edge", neogeo_arc_edge_fixed, "kiz4p", true) @@ -2229,17 +2330,17 @@ MACHINE_CONFIG_START(mvs_state::kizuna4p) MACHINE_CONFIG_END MACHINE_CONFIG_START(mvs_state::kof97oro) - neogeo_arcade(config); + mv1_fixed(config); NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("boot_kof97oro") MACHINE_CONFIG_END MACHINE_CONFIG_START(mvs_state::kog) - neogeo_arcade(config); + mv1_fixed(config); NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("boot_kog") MACHINE_CONFIG_END MACHINE_CONFIG_START(mvs_state::irrmaze) - neogeo_arcade(config); + mv1_fixed(config); MCFG_DEVICE_REMOVE("edge") MCFG_NEOGEO_CONTROL_EDGE_CONNECTOR_ADD("edge", neogeo_arc_edge_fixed, "irrmaze", true) @@ -2247,217 +2348,217 @@ MACHINE_CONFIG_START(mvs_state::irrmaze) MACHINE_CONFIG_END MACHINE_CONFIG_START(mvs_state::kof98) - neogeo_arcade(config); + mv1_fixed(config); NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("rom_kof98") MACHINE_CONFIG_END MACHINE_CONFIG_START(mvs_state::mslugx) - neogeo_arcade(config); + mv1_fixed(config); NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("rom_mslugx") MACHINE_CONFIG_END MACHINE_CONFIG_START(mvs_state::kof99) - neogeo_arcade(config); + mv1_fixed(config); NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("sma_kof99") MACHINE_CONFIG_END MACHINE_CONFIG_START(mvs_state::kof99k) - neogeo_arcade(config); + mv1_fixed(config); NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("cmc42_kof99k") MACHINE_CONFIG_END MACHINE_CONFIG_START(mvs_state::garou) - neogeo_arcade(config); + mv1_fixed(config); NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("sma_garou") MACHINE_CONFIG_END MACHINE_CONFIG_START(mvs_state::garouh) - neogeo_arcade(config); + mv1_fixed(config); NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("sma_garouh") MACHINE_CONFIG_END MACHINE_CONFIG_START(mvs_state::garoubl) - neogeo_arcade(config); + mv1_fixed(config); NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("boot_garoubl") MACHINE_CONFIG_END MACHINE_CONFIG_START(mvs_state::mslug3) - neogeo_arcade(config); + mv1_fixed(config); NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("sma_mslug3") MACHINE_CONFIG_END MACHINE_CONFIG_START(mvs_state::mslug3h) - neogeo_arcade(config); + mv1_fixed(config); NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("cmc42_mslug3h") MACHINE_CONFIG_END MACHINE_CONFIG_START(mvs_state::mslug3b6) - neogeo_arcade(config); + mv1_fixed(config); NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("boot_mslug3b6") MACHINE_CONFIG_END MACHINE_CONFIG_START(mvs_state::kof2000) - neogeo_arcade(config); + mv1_fixed(config); NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("sma_kof2k") MACHINE_CONFIG_END MACHINE_CONFIG_START(mvs_state::kof2000n) - neogeo_arcade(config); + mv1_fixed(config); NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("cmc50_kof2000n") MACHINE_CONFIG_END MACHINE_CONFIG_START(mvs_state::zupapa) - neogeo_arcade(config); + mv1_fixed(config); NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("cmc42_zupapa") MACHINE_CONFIG_END MACHINE_CONFIG_START(mvs_state::sengoku3) - neogeo_arcade(config); + mv1_fixed(config); NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("cmc42_sengoku3") MACHINE_CONFIG_END MACHINE_CONFIG_START(mvs_state::kof2001) - neogeo_arcade(config); + mv1_fixed(config); NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("cmc50_kof2001") MACHINE_CONFIG_END MACHINE_CONFIG_START(mvs_state::cthd2k3) - neogeo_arcade(config); + mv1_fixed(config); NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("boot_cthd2k3") MACHINE_CONFIG_END MACHINE_CONFIG_START(mvs_state::ct2k3sp) - neogeo_arcade(config); + mv1_fixed(config); NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("boot_ct2k3sp") MACHINE_CONFIG_END MACHINE_CONFIG_START(mvs_state::ct2k3sa) - neogeo_arcade(config); + mv1_fixed(config); NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("boot_ct2k3sa") MACHINE_CONFIG_END MACHINE_CONFIG_START(mvs_state::kof2002) - neogeo_arcade(config); + mv1_fixed(config); NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("k2k2_kof2k2") MACHINE_CONFIG_END MACHINE_CONFIG_START(mvs_state::kof2002b) - neogeo_arcade(config); + mv1_fixed(config); NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("boot_kf2k2b") MACHINE_CONFIG_END MACHINE_CONFIG_START(mvs_state::kf2k2pls) - neogeo_arcade(config); + mv1_fixed(config); NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("k2k2_kf2k2p") MACHINE_CONFIG_END MACHINE_CONFIG_START(mvs_state::kf2k2mp) - neogeo_arcade(config); + mv1_fixed(config); NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("boot_kf2k2mp") MACHINE_CONFIG_END MACHINE_CONFIG_START(mvs_state::kf2k2mp2) - neogeo_arcade(config); + mv1_fixed(config); NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("boot_kf2k2mp2") MACHINE_CONFIG_END MACHINE_CONFIG_START(mvs_state::kof10th) - neogeo_arcade(config); + mv1_fixed(config); NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("boot_kf10th") MACHINE_CONFIG_END MACHINE_CONFIG_START(mvs_state::kf10thep) - neogeo_arcade(config); + mv1_fixed(config); NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("boot_kf10thep") MACHINE_CONFIG_END MACHINE_CONFIG_START(mvs_state::kf2k5uni) - neogeo_arcade(config); + mv1_fixed(config); NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("boot_kf2k5uni") MACHINE_CONFIG_END MACHINE_CONFIG_START(mvs_state::kof2k4se) - neogeo_arcade(config); + mv1_fixed(config); NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("boot_kf2k4se") MACHINE_CONFIG_END MACHINE_CONFIG_START(mvs_state::mslug5) - neogeo_arcade(config); + mv1_fixed(config); NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("pvc_mslug5") MACHINE_CONFIG_END MACHINE_CONFIG_START(mvs_state::ms5plus) - neogeo_arcade(config); + mv1_fixed(config); NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("boot_ms5plus") MACHINE_CONFIG_END MACHINE_CONFIG_START(mvs_state::svc) - neogeo_arcade(config); + mv1_fixed(config); NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("pvc_svc") MACHINE_CONFIG_END MACHINE_CONFIG_START(mvs_state::svcboot) - neogeo_arcade(config); + mv1_fixed(config); NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("boot_svcboot") MACHINE_CONFIG_END MACHINE_CONFIG_START(mvs_state::svcplus) - neogeo_arcade(config); + mv1_fixed(config); NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("boot_svcplus") MACHINE_CONFIG_END MACHINE_CONFIG_START(mvs_state::svcplusa) - neogeo_arcade(config); + mv1_fixed(config); NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("boot_svcplusa") MACHINE_CONFIG_END MACHINE_CONFIG_START(mvs_state::svcsplus) - neogeo_arcade(config); + mv1_fixed(config); NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("boot_svcsplus") MACHINE_CONFIG_END MACHINE_CONFIG_START(mvs_state::samsho5) - neogeo_arcade(config); + mv1_fixed(config); NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("k2k2_samsh5") MACHINE_CONFIG_END MACHINE_CONFIG_START(mvs_state::samsho5b) - neogeo_arcade(config); + mv1_fixed(config); NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("boot_samsho5b") MACHINE_CONFIG_END MACHINE_CONFIG_START(mvs_state::kof2003) - neogeo_arcade(config); + mv1_fixed(config); NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("pvc_kf2k3") MACHINE_CONFIG_END MACHINE_CONFIG_START(mvs_state::kof2003h) - neogeo_arcade(config); + mv1_fixed(config); NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("pvc_kf2k3h") MACHINE_CONFIG_END MACHINE_CONFIG_START(mvs_state::kf2k3bl) - neogeo_arcade(config); + mv1_fixed(config); NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("boot_kf2k3bl") MACHINE_CONFIG_END MACHINE_CONFIG_START(mvs_state::kf2k3pl) - neogeo_arcade(config); + mv1_fixed(config); NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("boot_kf2k3pl") MACHINE_CONFIG_END MACHINE_CONFIG_START(mvs_state::kf2k3upl) - neogeo_arcade(config); + mv1_fixed(config); NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("boot_kf2k3upl") MACHINE_CONFIG_END MACHINE_CONFIG_START(mvs_state::samsh5sp) - neogeo_arcade(config); + mv1_fixed(config); NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("k2k2_sams5s") MACHINE_CONFIG_END MACHINE_CONFIG_START(mvs_state::neogeo_mj) - neogeo_arcade(config); + mv1_fixed(config); //no joystick panel MCFG_DEVICE_REMOVE("edge") MCFG_NEOGEO_CONTROL_EDGE_CONNECTOR_ADD("edge", neogeo_arc_edge_fixed, "", true) @@ -2472,32 +2573,32 @@ MACHINE_CONFIG_START(mvs_state::neogeo_mj) MACHINE_CONFIG_END MACHINE_CONFIG_START(mvs_state::preisle2) - neogeo_arcade(config); + mv1_fixed(config); NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("cmc42_preisle2") MACHINE_CONFIG_END MACHINE_CONFIG_START(mvs_state::nitd) - neogeo_arcade(config); + mv1_fixed(config); NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("cmc42_nitd") MACHINE_CONFIG_END MACHINE_CONFIG_START(mvs_state::s1945p) - neogeo_arcade(config); + mv1_fixed(config); NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("cmc42_s1945p") MACHINE_CONFIG_END MACHINE_CONFIG_START(mvs_state::lans2004) - neogeo_arcade(config); + mv1_fixed(config); NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("boot_lans2004") MACHINE_CONFIG_END MACHINE_CONFIG_START(mvs_state::pnyaa) - neogeo_arcade(config); + mv1_fixed(config); NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("pcm2_pnyaa") MACHINE_CONFIG_END MACHINE_CONFIG_START(mvs_state::popbounc) - neogeo_arcade(config); + mv1_fixed(config); MCFG_DEVICE_REMOVE("edge") MCFG_NEOGEO_CONTROL_EDGE_CONNECTOR_ADD("edge", neogeo_arc_edge_fixed, "dial", true) @@ -2505,47 +2606,47 @@ MACHINE_CONFIG_START(mvs_state::popbounc) MACHINE_CONFIG_END MACHINE_CONFIG_START(mvs_state::ganryu) - neogeo_arcade(config); + mv1_fixed(config); NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("cmc42_ganryu") MACHINE_CONFIG_END MACHINE_CONFIG_START(mvs_state::bangbead) - neogeo_arcade(config); + mv1_fixed(config); NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("cmc42_bangbead") MACHINE_CONFIG_END MACHINE_CONFIG_START(mvs_state::mslug4) - neogeo_arcade(config); + mv1_fixed(config); NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("pcm2_mslug4") MACHINE_CONFIG_END MACHINE_CONFIG_START(mvs_state::ms4plus) - neogeo_arcade(config); + mv1_fixed(config); NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("pcm2_ms4p") MACHINE_CONFIG_END MACHINE_CONFIG_START(mvs_state::rotd) - neogeo_arcade(config); + mv1_fixed(config); NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("pcm2_rotd") MACHINE_CONFIG_END MACHINE_CONFIG_START(mvs_state::matrim) - neogeo_arcade(config); + mv1_fixed(config); NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("k2k2_matrim") MACHINE_CONFIG_END MACHINE_CONFIG_START(mvs_state::matrimbl) - neogeo_arcade(config); + mv1_fixed(config); NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("boot_matrimbl") MACHINE_CONFIG_END MACHINE_CONFIG_START(mvs_state::jockeygp) - neogeo_arcade(config); + mv1_fixed(config); NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("cmc50_jockeygp") MACHINE_CONFIG_END MACHINE_CONFIG_START(mvs_state::vliner) - neogeo_arcade(config); + mv1_fixed(config); // input handlers are installed at DRIVER_INIT... MCFG_DEVICE_REMOVE("edge") MCFG_DEVICE_REMOVE("ctrl1") @@ -2555,7 +2656,7 @@ MACHINE_CONFIG_START(mvs_state::vliner) MACHINE_CONFIG_END MACHINE_CONFIG_START(mvs_state::sbp) - neogeo_arcade(config); + mv1_fixed(config); NEOGEO_CONFIG_ONE_FIXED_CARTSLOT("boot_sbp") MACHINE_CONFIG_END @@ -2668,15 +2769,6 @@ MACHINE_CONFIG_END // Game specific input definitions -static INPUT_PORTS_START( mjneogeo ) - PORT_INCLUDE( neogeo ) - - PORT_MODIFY("DSW") - PORT_DIPNAME( 0x04, 0x00, DEF_STR( Controller ) ) PORT_DIPLOCATION("SW:3") - PORT_DIPSETTING( 0x04, DEF_STR( Joystick ) ) - PORT_DIPSETTING( 0x00, "Mahjong Panel" ) -INPUT_PORTS_END - static INPUT_PORTS_START( kizuna4p ) PORT_INCLUDE( neogeo ) @@ -2689,14 +2781,6 @@ static INPUT_PORTS_START( kizuna4p ) PORT_BIT( 0x0f00, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(DEVICE_SELF, mvs_state, kizuna4p_start_r, nullptr) INPUT_PORTS_END -static INPUT_PORTS_START( irrmaze ) - PORT_INCLUDE( neogeo ) - - PORT_MODIFY("SYSTEM") - PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_UNUSED ) -INPUT_PORTS_END - static INPUT_PORTS_START( vliner ) PORT_INCLUDE( neogeo ) @@ -11090,7 +11174,7 @@ GAME( 1990, nam1975, neogeo, neobase, neogeo, mvs_state, 0, ROT0, " GAME( 1990, bstars, neogeo, neobase, neogeo, mvs_state, 0, ROT0, "SNK", "Baseball Stars Professional (NGM-002)", MACHINE_SUPPORTS_SAVE ) GAME( 1990, bstarsh, bstars, neobase, neogeo, mvs_state, 0, ROT0, "SNK", "Baseball Stars Professional (NGH-002)", MACHINE_SUPPORTS_SAVE ) GAME( 1990, tpgolf, neogeo, neobase, neogeo, mvs_state, 0, ROT0, "SNK", "Top Player's Golf (NGM-003 ~ NGH-003)", MACHINE_SUPPORTS_SAVE ) -GAME( 1990, mahretsu, neogeo, neogeo_mj, mjneogeo, mvs_state, 0, ROT0, "SNK", "Mahjong Kyo Retsuden (NGM-004 ~ NGH-004)", MACHINE_SUPPORTS_SAVE ) // does not support mahjong panel in MVS mode <- it actually works fine??? +GAME( 1990, mahretsu, neogeo, neogeo_mj, neogeo, mvs_state, 0, ROT0, "SNK", "Mahjong Kyo Retsuden (NGM-004 ~ NGH-004)", MACHINE_SUPPORTS_SAVE ) // does not support mahjong panel in MVS mode <- it actually works fine??? GAME( 1990, ridhero, neogeo, neobase, neogeo, mvs_state, 0, ROT0, "SNK", "Riding Hero (NGM-006 ~ NGH-006)", MACHINE_NODEVICE_LAN | MACHINE_SUPPORTS_SAVE ) GAME( 1990, ridheroh, ridhero, neobase, neogeo, mvs_state, 0, ROT0, "SNK", "Riding Hero (set 2)", MACHINE_NODEVICE_LAN | MACHINE_SUPPORTS_SAVE ) GAME( 1991, alpham2, neogeo, neobase, neogeo, mvs_state, 0, ROT0, "SNK", "Alpha Mission II / ASO II - Last Guardian (NGM-007 ~ NGH-007)", MACHINE_SUPPORTS_SAVE ) @@ -11180,7 +11264,7 @@ GAME( 1997, kog, kof97, kog, neogeo, mvs_state, 0, ROT0, " GAME( 1997, lastblad, neogeo, neobase, neogeo, mvs_state, 0, ROT0, "SNK", "The Last Blade / Bakumatsu Roman - Gekka no Kenshi (NGM-2340)", MACHINE_SUPPORTS_SAVE ) GAME( 1997, lastbladh, lastblad, neobase, neogeo, mvs_state, 0, ROT0, "SNK", "The Last Blade / Bakumatsu Roman - Gekka no Kenshi (NGH-2340)", MACHINE_SUPPORTS_SAVE ) GAME( 1997, lastsold, lastblad, neobase, neogeo, mvs_state, 0, ROT0, "SNK", "The Last Soldier (Korean release of The Last Blade)", MACHINE_SUPPORTS_SAVE ) -GAME( 1997, irrmaze, neogeo, irrmaze, irrmaze, mvs_state, 0, ROT0, "SNK / Saurus", "The Irritating Maze / Ultra Denryu Iraira Bou", MACHINE_SUPPORTS_SAVE ) +GAME( 1997, irrmaze, neogeo, irrmaze, neogeo, mvs_state, 0, ROT0, "SNK / Saurus", "The Irritating Maze / Ultra Denryu Iraira Bou", MACHINE_SUPPORTS_SAVE ) GAME( 1998, rbff2, neogeo, neobase, neogeo, mvs_state, 0, ROT0, "SNK", "Real Bout Fatal Fury 2 - The Newcomers / Real Bout Garou Densetsu 2 - The Newcomers (NGM-2400)", MACHINE_SUPPORTS_SAVE ) GAME( 1998, rbff2h, rbff2, neobase, neogeo, mvs_state, 0, ROT0, "SNK", "Real Bout Fatal Fury 2 - The Newcomers / Real Bout Garou Densetsu 2 - The Newcomers (NGH-2400)", MACHINE_SUPPORTS_SAVE ) GAME( 1998, rbff2k, rbff2, neobase, neogeo, mvs_state, 0, ROT0, "SNK", "Real Bout Fatal Fury 2 - The Newcomers (Korean release)", MACHINE_SUPPORTS_SAVE ) // no Japanese title / mode @@ -11275,7 +11359,7 @@ GAME( 1996, crswd2bl, neogeo, neobase, neogeo, mvs_state, 0, ROT0, " // Aicom (was a part of Sammy) / Yumekobo (changed name in 1996) GAME( 1992, viewpoin, neogeo, neobase, neogeo, mvs_state, 0, ROT0, "Sammy / Aicom", "Viewpoint", MACHINE_SUPPORTS_SAVE ) -GAME( 1994, janshin, neogeo, neogeo_mj, mjneogeo, mvs_state, 0, ROT0, "Aicom", "Janshin Densetsu - Quest of Jongmaster", MACHINE_SUPPORTS_SAVE ) +GAME( 1994, janshin, neogeo, neogeo_mj, neogeo, mvs_state, 0, ROT0, "Aicom", "Janshin Densetsu - Quest of Jongmaster", MACHINE_SUPPORTS_SAVE ) GAME( 1995, pulstar, neogeo, neobase, neogeo, mvs_state, 0, ROT0, "Aicom", "Pulstar", MACHINE_SUPPORTS_SAVE ) GAME( 1998, blazstar, neogeo, neobase, neogeo, mvs_state, 0, ROT0, "Yumekobo", "Blazing Star", MACHINE_SUPPORTS_SAVE ) GAME( 1999, preisle2, neogeo, preisle2, neogeo, mvs_state, 0, ROT0, "Yumekobo", "Prehistoric Isle 2" , MACHINE_SUPPORTS_SAVE ) /* Encrypted GFX */ @@ -11304,8 +11388,8 @@ GAME( 1995, kabukikl, neogeo, neobase, neogeo, mvs_state, 0, ROT0, " GAME( 1997, neobombe, neogeo, neobase, neogeo, mvs_state, 0, ROT0, "Hudson", "Neo Bomberman", MACHINE_SUPPORTS_SAVE ) // Monolith Corp. -GAME( 1990, minasan, neogeo, neogeo_mj, mjneogeo, mvs_state, 0, ROT0, "Monolith Corp.", "Minasan no Okagesamadesu! Dai Sugoroku Taikai (MOM-001 ~ MOH-001)", MACHINE_SUPPORTS_SAVE ) -GAME( 1991, bakatono, neogeo, neogeo_mj, mjneogeo, mvs_state, 0, ROT0, "Monolith Corp.", "Bakatonosama Mahjong Manyuuki (MOM-002 ~ MOH-002)", MACHINE_SUPPORTS_SAVE ) +GAME( 1990, minasan, neogeo, neogeo_mj, neogeo, mvs_state, 0, ROT0, "Monolith Corp.", "Minasan no Okagesamadesu! Dai Sugoroku Taikai (MOM-001 ~ MOH-001)", MACHINE_SUPPORTS_SAVE ) +GAME( 1991, bakatono, neogeo, neogeo_mj, neogeo, mvs_state, 0, ROT0, "Monolith Corp.", "Bakatonosama Mahjong Manyuuki (MOM-002 ~ MOH-002)", MACHINE_SUPPORTS_SAVE ) // Nazca (later acquired by SNK) GAME( 1996, turfmast, neogeo, neobase, neogeo, mvs_state, 0, ROT0, "Nazca", "Neo Turf Masters / Big Tournament Golf", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/drivers/neogeocd.cpp b/src/mame/drivers/neogeocd.cpp index ddfaa2c62a5..6fd779f8198 100644 --- a/src/mame/drivers/neogeocd.cpp +++ b/src/mame/drivers/neogeocd.cpp @@ -886,23 +886,11 @@ void ngcd_state::machine_reset() void ngcd_state::neocd_main_map(address_map &map) { -// AM_RANGE(0x000000, 0x00007f) AM_READ_BANK("vectors") // writes will fall through to area below + aes_base_main_map(map); + map(0x000000, 0x1fffff).ram().region("maincpu", 0x00000); - map(0x000000, 0x00007f).r(this, FUNC(ngcd_state::banked_vectors_r)); - - map(0x300000, 0x300000).mirror(0x01fffe).r(m_ctrl1, FUNC(neogeo_control_port_device::ctrl_r)); - map(0x320000, 0x320001).mirror(0x01fffe).portr("AUDIO"); - map(0x320000, 0x320000).mirror(0x01fffe).w(this, FUNC(ngcd_state::audio_command_w)); - map(0x340000, 0x340000).mirror(0x01fffe).r(m_ctrl2, FUNC(neogeo_control_port_device::ctrl_r)); - map(0x360000, 0x37ffff).r(this, FUNC(ngcd_state::unmapped_r)); - map(0x380000, 0x380001).mirror(0x01fffe).r(this, FUNC(ngcd_state::aes_in2_r)); - map(0x380000, 0x38007f).mirror(0x01ff80).w(this, FUNC(ngcd_state::io_control_w)).umask16(0x00ff); - map(0x3a0000, 0x3a001f).mirror(0x01ffe0).r(this, FUNC(ngcd_state::unmapped_r)); - map(0x3a0000, 0x3a001f).mirror(0x01ffe0).w("systemlatch", FUNC(hc259_device::write_a3)).umask16(0x00ff); - map(0x3c0000, 0x3c0007).mirror(0x01fff8).r(this, FUNC(ngcd_state::video_register_r)); - map(0x3c0000, 0x3c000f).mirror(0x01fff0).w(this, FUNC(ngcd_state::video_register_w)); - map(0x3e0000, 0x3fffff).r(this, FUNC(ngcd_state::unmapped_r)); - map(0x400000, 0x401fff).mirror(0x3fe000).rw(this, FUNC(ngcd_state::paletteram_r), FUNC(ngcd_state::paletteram_w)); + map(0x000000, 0x00007f).r(this, FUNC(ngcd_state::banked_vectors_r)); // writes will fall through to area above + map(0x800000, 0x803fff).rw(this, FUNC(ngcd_state::neocd_memcard_r), FUNC(ngcd_state::neocd_memcard_w)); map(0xc00000, 0xc7ffff).mirror(0x080000).rom().region("mainbios", 0); map(0xd00000, 0xdfffff).r(this, FUNC(ngcd_state::unmapped_r)); @@ -928,7 +916,7 @@ void ngcd_state::neocd_audio_map(address_map &map) void ngcd_state::neocd_audio_io_map(address_map &map) { - map(0x00, 0x00).mirror(0xff00).r(this, FUNC(ngcd_state::audio_command_r)).w(m_soundlatch, FUNC(generic_latch_8_device::clear_w)); + map(0x00, 0x00).mirror(0xff00).rw(m_soundlatch, FUNC(generic_latch_8_device::read), FUNC(generic_latch_8_device::clear_w)); map(0x04, 0x07).mirror(0xff00).rw(m_ym, FUNC(ym2610_device::read), FUNC(ym2610_device::write)); map(0x08, 0x08).mirror(0xff00).select(0x0010).w(this, FUNC(ngcd_state::audio_cpu_enable_nmi_w)); // banking reads are actually NOP on NeoCD? but some games still access them @@ -1043,6 +1031,7 @@ uint32_t ngcd_state::screen_update_neocd(screen_device &screen, bitmap_rgb32 &bi MACHINE_CONFIG_START(ngcd_state::neocd) neogeo_base(config); + neogeo_stereo(config); MCFG_CPU_MODIFY("maincpu") MCFG_CPU_PROGRAM_MAP(neocd_main_map) diff --git a/src/mame/drivers/neopcb.cpp b/src/mame/drivers/neopcb.cpp index f07aa8ec476..ac4a765f447 100644 --- a/src/mame/drivers/neopcb.cpp +++ b/src/mame/drivers/neopcb.cpp @@ -72,6 +72,10 @@ void neopcb_state::neogeo_postload() MACHINE_CONFIG_START(neopcb_state::neopcb) neogeo_arcade(config); + neogeo_mono(config); + + MCFG_NEOGEO_CONTROL_EDGE_CONNECTOR_ADD("edge", neogeo_arc_edge, "joy", true) + MCFG_CMC_PROT_ADD("cmc50") MCFG_PCM2_PROT_ADD("pcm2") MCFG_PVC_PROT_ADD("pvc") diff --git a/src/mame/includes/neogeo.h b/src/mame/includes/neogeo.h index e569617ad44..883b707ec2f 100644 --- a/src/mame/includes/neogeo.h +++ b/src/mame/includes/neogeo.h @@ -15,6 +15,7 @@ #include "cpu/z80/z80.h" #include "sound/2610intf.h" #include "machine/gen_latch.h" +#include "machine/input_merger.h" #include "machine/upd1990a.h" #include "machine/ng_memcard.h" #include "video/neogeo_spr.h" @@ -31,40 +32,43 @@ #define NEOGEO_VBLANK_IRQ_HTIM (attotime::from_ticks(56+2, NEOGEO_MASTER_CLOCK)) -class neogeo_state : public driver_device +class neogeo_base_state : public driver_device { public: - neogeo_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_ym(*this, "ymsnd"), - m_sprgen(*this, "spritegen"), - m_screen(*this, "screen"), - m_palette(*this, "palette"), - m_memcard(*this, "memcard"), - m_soundlatch(*this, "soundlatch"), - m_soundlatch2(*this, "soundlatch2"), - m_region_maincpu(*this, "maincpu"), - m_region_sprites(*this, "sprites"), - m_region_fixed(*this, "fixed"), - m_region_fixedbios(*this, "fixedbios"), - m_region_mainbios(*this, "mainbios"), - m_region_audiobios(*this, "audiobios"), - m_region_audiocpu(*this, "audiocpu"), - m_bank_audio_main(*this, "audio_main"), - m_edge(*this, "edge"), - m_ctrl1(*this, "ctrl1"), - m_ctrl2(*this, "ctrl2"), - m_use_cart_vectors(0), - m_use_cart_audio(0), - m_slots(*this, "cslot%u", 1U) + DECLARE_CUSTOM_INPUT_MEMBER(get_memcard_status); + DECLARE_CUSTOM_INPUT_MEMBER(get_audio_result); + +protected: + neogeo_base_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_ym(*this, "ymsnd") + , m_sprgen(*this, "spritegen") + , m_screen(*this, "screen") + , m_palette(*this, "palette") + , m_memcard(*this, "memcard") + , m_soundlatch(*this, "soundlatch") + , m_soundlatch2(*this, "soundlatch2") + , m_region_maincpu(*this, "maincpu") + , m_region_sprites(*this, "sprites") + , m_region_fixed(*this, "fixed") + , m_region_fixedbios(*this, "fixedbios") + , m_region_mainbios(*this, "mainbios") + , m_region_audiobios(*this, "audiobios") + , m_region_audiocpu(*this, "audiocpu") + , m_bank_audio_main(*this, "audio_main") + , m_edge(*this, "edge") + , m_ctrl1(*this, "ctrl1") + , m_ctrl2(*this, "ctrl2") + , m_use_cart_vectors(0) + , m_use_cart_audio(0) + , m_slots(*this, "cslot%u", 1U) + , m_audionmi(*this, "audionmi") { } DECLARE_READ16_MEMBER(memcard_r); DECLARE_WRITE16_MEMBER(memcard_w); - DECLARE_WRITE8_MEMBER(audio_command_w); - DECLARE_READ8_MEMBER(audio_command_r); DECLARE_READ8_MEMBER(audio_cpu_bank_select_r); DECLARE_WRITE8_MEMBER(audio_cpu_enable_nmi_w); DECLARE_READ16_MEMBER(unmapped_r); @@ -73,9 +77,6 @@ public: DECLARE_READ16_MEMBER(video_register_r); DECLARE_WRITE16_MEMBER(video_register_w); - DECLARE_CUSTOM_INPUT_MEMBER(get_memcard_status); - DECLARE_CUSTOM_INPUT_MEMBER(get_audio_result); - TIMER_CALLBACK_MEMBER(display_position_interrupt_callback); TIMER_CALLBACK_MEMBER(display_position_vblank_callback); TIMER_CALLBACK_MEMBER(vblank_interrupt_callback); @@ -98,10 +99,12 @@ public: DECLARE_WRITE_LINE_MEMBER(set_palette_bank); void neogeo_base(machine_config &config); + void neogeo_stereo(machine_config &config); + + void base_main_map(address_map &map); void audio_io_map(address_map &map); void audio_map(address_map &map); -protected: // device overrides virtual void machine_start() override; virtual void machine_reset() override; @@ -178,12 +181,8 @@ private: void create_rgb_lookups(); void set_pens(); - void audio_cpu_check_nmi(); - // internal state bool m_recurse; - bool m_audio_cpu_nmi_enabled; - bool m_audio_cpu_nmi_pending; emu_timer *m_display_position_interrupt_timer; emu_timer *m_display_position_vblank_timer; @@ -196,6 +195,8 @@ private: uint16_t get_video_control(); + required_device<input_merger_device> m_audionmi; + // color/palette related std::vector<uint16_t> m_paletteram; uint8_t m_palette_lookup[32][4]; @@ -204,11 +205,11 @@ private: }; -class ngarcade_base_state : public neogeo_state +class ngarcade_base_state : public neogeo_base_state { protected: ngarcade_base_state(const machine_config &mconfig, device_type type, const char *tag) - : neogeo_state(mconfig, type, tag) + : neogeo_base_state(mconfig, type, tag) , m_save_ram(*this, "saveram") , m_upd4990a(*this, "upd4990a") , m_dsw(*this, "DSW") @@ -220,13 +221,15 @@ protected: virtual DECLARE_WRITE8_MEMBER(io_control_w) override; DECLARE_WRITE_LINE_MEMBER(set_save_ram_unlock); DECLARE_WRITE16_MEMBER(save_ram_w); - DECLARE_READ16_MEMBER(in0_r); - DECLARE_READ16_MEMBER(in1_r); + DECLARE_READ16_MEMBER(in0_edge_r); + DECLARE_READ16_MEMBER(in0_edge_joy_r); + DECLARE_READ16_MEMBER(in1_edge_r); + DECLARE_READ16_MEMBER(in1_edge_joy_r); void neogeo_arcade(machine_config &config); + void neogeo_mono(machine_config &config); void neogeo_main_map(address_map &map); - void main_map_slot(address_map &map); private: required_shared_ptr<uint16_t> m_save_ram; @@ -237,14 +240,14 @@ private: }; -class aes_base_state : public neogeo_state +class aes_base_state : public neogeo_base_state { public: DECLARE_INPUT_CHANGED_MEMBER(aes_jp1); protected: aes_base_state(const machine_config &mconfig, device_type type, const char *tag) - : neogeo_state(mconfig, type, tag) + : neogeo_base_state(mconfig, type, tag) , m_io_in2(*this, "IN2") { } @@ -253,7 +256,7 @@ protected: virtual void machine_start() override; - void aes_main_map(address_map &map); + void aes_base_main_map(address_map &map); private: required_ioport m_io_in2; diff --git a/src/mame/mame.lst b/src/mame/mame.lst index a574c571852..d8097a57494 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -29560,7 +29560,12 @@ salamandj // GX587 (c) 1986 twinbee // GX412 (c) 1985 @source:neogeo.cpp -neogeo // NeoGeo MVS +neogeo // NeoGeo MV-6F +ng_mv4f // NeoGeo MV-4F +ng_mv2f // NeoGeo MV-2F +ng_mv1 // NeoGeo MV-1 +ng_mv1f // NeoGeo MV-1F +ng_mv1fz // NeoGeo MV-1FZ aes // NeoGeo AES 2020bb // 0030 (c) 1991 SNK / Pallas 2020bba // 0030 (c) 1991 SNK / Pallas diff --git a/src/mame/video/neogeo.cpp b/src/mame/video/neogeo.cpp index 79ff2235298..f2f23f46010 100644 --- a/src/mame/video/neogeo.cpp +++ b/src/mame/video/neogeo.cpp @@ -22,7 +22,7 @@ * *************************************/ -void neogeo_state::create_rgb_lookups() +void neogeo_base_state::create_rgb_lookups() { static const int resistances[] = {3900, 2200, 1000, 470, 220}; @@ -66,7 +66,7 @@ void neogeo_state::create_rgb_lookups() } } -void neogeo_state::set_pens() +void neogeo_base_state::set_pens() { const pen_t *pen_base = m_palette->pens() + m_palette_bank + (m_screen_shadow ? 0x2000 : 0); m_sprgen->set_pens(pen_base); @@ -74,27 +74,27 @@ void neogeo_state::set_pens() } -WRITE_LINE_MEMBER(neogeo_state::set_screen_shadow) +WRITE_LINE_MEMBER(neogeo_base_state::set_screen_shadow) { m_screen_shadow = state; set_pens(); } -WRITE_LINE_MEMBER(neogeo_state::set_palette_bank) +WRITE_LINE_MEMBER(neogeo_base_state::set_palette_bank) { m_palette_bank = state ? 0x1000 : 0; set_pens(); } -READ16_MEMBER(neogeo_state::paletteram_r) +READ16_MEMBER(neogeo_base_state::paletteram_r) { return m_paletteram[m_palette_bank + offset]; } -WRITE16_MEMBER(neogeo_state::paletteram_w) +WRITE16_MEMBER(neogeo_base_state::paletteram_w) { offset += m_palette_bank; data = COMBINE_DATA(&m_paletteram[offset]); @@ -123,7 +123,7 @@ WRITE16_MEMBER(neogeo_state::paletteram_w) * *************************************/ -void neogeo_state::video_start() +void neogeo_base_state::video_start() { create_rgb_lookups(); @@ -136,7 +136,7 @@ void neogeo_state::video_start() save_item(NAME(m_paletteram)); save_item(NAME(m_screen_shadow)); save_item(NAME(m_palette_bank)); - machine().save().register_postload(save_prepost_delegate(FUNC(neogeo_state::set_pens), this)); + machine().save().register_postload(save_prepost_delegate(FUNC(neogeo_base_state::set_pens), this)); set_pens(); } @@ -149,7 +149,7 @@ void neogeo_state::video_start() * *************************************/ -void neogeo_state::video_reset() +void neogeo_base_state::video_reset() { } @@ -161,7 +161,7 @@ void neogeo_state::video_reset() * *************************************/ -uint32_t neogeo_state::screen_update_neogeo(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) +uint32_t neogeo_base_state::screen_update_neogeo(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { // fill with background color first bitmap.fill(*m_bg_pen, cliprect); @@ -181,7 +181,7 @@ uint32_t neogeo_state::screen_update_neogeo(screen_device &screen, bitmap_rgb32 * *************************************/ -uint16_t neogeo_state::get_video_control() +uint16_t neogeo_base_state::get_video_control() { uint16_t ret; uint16_t v_counter; @@ -221,7 +221,7 @@ uint16_t neogeo_state::get_video_control() } -void neogeo_state::set_video_control(uint16_t data) +void neogeo_base_state::set_video_control(uint16_t data) { if (VERBOSE) logerror("%s: video control write %04x\n", machine().describe_context(), data); @@ -232,7 +232,7 @@ void neogeo_state::set_video_control(uint16_t data) } -READ16_MEMBER(neogeo_state::video_register_r) +READ16_MEMBER(neogeo_base_state::video_register_r) { uint16_t ret; @@ -255,7 +255,7 @@ READ16_MEMBER(neogeo_state::video_register_r) } -WRITE16_MEMBER(neogeo_state::video_register_w) +WRITE16_MEMBER(neogeo_base_state::video_register_w) { /* accessing the LSB only is not mapped */ if (mem_mask != 0x00ff) |