From 6e0218c2fe666e997c577ca68b570f5d25b1cfdd Mon Sep 17 00:00:00 2001 From: Robbbert Date: Mon, 13 Dec 2021 19:40:53 +1100 Subject: mrgame.cpp: WIP. Most game are playable. New machines marked as NOT_WORKING ---------------------------------- Motor Show (set 2) Motor Show (set 3) [Robbbert] --- src/mame/drivers/mrgame.cpp | 449 ++++++++++++++++++++++++++++++-------------- src/mame/mame.lst | 2 + 2 files changed, 314 insertions(+), 137 deletions(-) diff --git a/src/mame/drivers/mrgame.cpp b/src/mame/drivers/mrgame.cpp index 5b54d48e89f..ebc82ca223c 100644 --- a/src/mame/drivers/mrgame.cpp +++ b/src/mame/drivers/mrgame.cpp @@ -1,35 +1,58 @@ // license:BSD-3-Clause // copyright-holders:Robbbert /**************************************************************************************** - PINBALL - Mr. Game 1B11188/0 +PINBALL +Mr. Game (Zaccaria) 1B11188/0 - These games have a M68000 and 3x Z80, and a M114 Sound IC. - They have a video screen upon which the scores and other info is displayed. +These games have a M68000 and 3x Z80, and a M114 Sound IC. +They have a video screen upon which the scores and other info is displayed. How to set up the machine (motor show, dakar, wcup90): - These machines need to be loaded with default settings before they can accept coins -- Press - key (minus in main keyboard) +- Press NUM-0 key - Press again until you see test 25 (Motor Show) or test 23 (Dakar) - In the dipswitch menu turn off the Ram Protect switch - Press Left shift and Right shift together (game stops responding) - Turn the Ram Protect Switch back on - Press F3 or reboot - The default settings have been saved to nvram and you can insert coins -- However, the game cannot be played due to missing balls. + + +Status: +- Most games are playable. All games are multiball, here are the key codes: + Start Game End Ball + Motor Show Hold AS, hit 1, release keys Hold A, hit X. release keys + Dakar Hold ASD, hit 1, release keys Hold AS, hit X, release keys + Mac Attack Hold AS, hit 1, release keys Hold AS, hit X, release keys + World Cup 90 Hold AS, hit 1, release keys. It's a timed game, you can't lose the ball. +- Balls indicates number of balls left, so 1 = last ball. + +Fast Track: +- There's no video, however it can still be set up and played. Do these steps slowly, + with several seconds between each one. +1. Start the game. Use the tab, dipswitch menu to turn the "Ram Protect" switch Off. +2. In the game, press NUM-0. +3. Press both shift keys together. +4. Use the Tab menu again to turn the "Ram Protect" back to On. +5. While still in the Dipswitch menu, choose Reset. +6. The setup has been saved, so to play in the future, start from here. +7. You can insert a coin (it will say Start Your Engines). +8. Follow the instructions for Motor Show (above), to start a game and play. ToDo: -- Video -- Outputs -- Inputs +- macattck: score is difficult to read +- Video sprites missing in all games +- wcup90: one attract screen is corrupted +- wcup90: sounds seem bad +- fasttrack: rom missing, game not working - Support for electronic volume control -- Audio rom banking - Most sounds missing due to unemulated M114 chip +- Mechanical sounds *****************************************************************************************/ #include "emu.h" - +#include "machine/genpin.h" #include "cpu/m68000/m68000.h" #include "cpu/z80/z80.h" #include "machine/74259.h" @@ -49,11 +72,11 @@ ToDo: namespace { -class mrgame_state : public driver_device +class mrgame_state : public genpin_class { public: mrgame_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) + : genpin_class(mconfig, type, tag) , m_palette(*this, "palette") , m_p_videoram(*this, "videoram") , m_p_objectram(*this, "objectram") @@ -65,39 +88,40 @@ public: , m_selectlatch(*this, "selectlatch") , m_io_dsw0(*this, "DSW0") , m_io_dsw1(*this, "DSW1") - , m_io_x0(*this, "X0") - , m_io_x1(*this, "X1") + , m_io_keyboard(*this, "X%d", 0U) + , m_io_outputs(*this, "out%d", 0U) { } void mrgame(machine_config &config); + void macattck(machine_config &config); void wcup90(machine_config &config); - void init_mrgame(); - protected: virtual void machine_start() override; virtual void machine_reset() override; private: void mrgame_palette(palette_device &palette) const; - void ack1_w(uint8_t data); - void ack2_w(uint8_t data); - void portb_w(uint8_t data); - void row_w(uint8_t data); - void sound_w(uint8_t data); - void triple_w(uint8_t data); - void video_w(uint8_t data); - void videoram_w(offs_t offset, uint8_t data); - void videoattr_w(offs_t offset, uint8_t data); + u8 ack1_r(); + void ack2_w(u8 data); + void portb_w(u8 data); + void data_w(u8 data) { m_data = data; } + void extadd_w(u8 data); + void row_w(u8 data); + void sound_w(u8 data); + void triple_w(u8 data); + void video_w(u8 data); + void videoram_w(offs_t offset, u8 data); + void videoattr_w(offs_t offset, u8 data); template DECLARE_WRITE_LINE_MEMBER(video_bank_w); DECLARE_WRITE_LINE_MEMBER(intst_w); DECLARE_WRITE_LINE_MEMBER(nmi_intst_w); DECLARE_WRITE_LINE_MEMBER(flip_w); - uint8_t col_r(); - uint8_t sound_r(); - uint8_t porta_r(); - uint8_t portc_r(); - uint8_t rsw_r(); + u8 col_r(); + u8 sound_r(); + u8 porta_r(); + u8 portc_r(); + u8 rsw_r(); DECLARE_WRITE_LINE_MEMBER(vblank_int_w); DECLARE_WRITE_LINE_MEMBER(vblank_nmi_w); TIMER_DEVICE_CALLBACK_MEMBER(irq_timer); @@ -110,11 +134,13 @@ private: void audio2_map(address_map &map); void main_map(address_map &map); void video_map(address_map &map); - void wcup90_video_map(address_map &map); + void macattck_video_map(address_map &map); + void macattck_audio1_map(address_map &map); + void wcup90_audio2_map(address_map &map); required_device m_palette; - required_shared_ptr m_p_videoram; - required_shared_ptr m_p_objectram; + required_shared_ptr m_p_videoram; + required_shared_ptr m_p_objectram; required_device m_gfxdecode; required_device m_maincpu; @@ -124,20 +150,22 @@ private: required_device m_selectlatch; required_ioport m_io_dsw0; required_ioport m_io_dsw1; - required_ioport m_io_x0; - required_ioport m_io_x1; - - bool m_ack1; - bool m_ack2; - bool m_ackv; - bool m_flip; - bool m_intst; - uint8_t m_irq_state; - uint8_t m_row_data; - uint8_t m_sound_data; - uint8_t m_gfx_bank; - uint8_t m_video_data; - uint8_t m_video_status; + required_ioport_array<7> m_io_keyboard; + output_finder<128> m_io_outputs; // 24 solenoids + 104 lamps + + bool m_ack1 = 0; + bool m_ack2 = 0; + bool m_ackv = 0; + bool m_flip = 0; + bool m_intst = 0; + u8 m_data = 0; + u8 m_sxx = 0; + u8 m_irq_state = 0; + u8 m_row = 0; + u8 m_sound_data = 0; + u8 m_gfx_bank = 0; + u8 m_video_data = 0; + u8 m_video_status = 0; tilemap_t *m_tilemap; }; @@ -145,16 +173,16 @@ private: void mrgame_state::main_map(address_map &map) { - map(0x000000, 0x00ffff).rom().region("roms", 0); + map(0x000000, 0x00ffff).rom(); map(0x020000, 0x02ffff).ram().share("nvram"); map(0x030001, 0x030001).r(FUNC(mrgame_state::rsw_r)); //RSW ACK map(0x030003, 0x030003).w(FUNC(mrgame_state::sound_w)); //W SOUND map(0x030004, 0x030004).w(FUNC(mrgame_state::video_w)); //W VID map(0x030007, 0x030007).w(FUNC(mrgame_state::triple_w)); //W CS - map(0x030008, 0x030009).nopw(); //W DATA - lamp/sol data + map(0x030009, 0x030009).w(FUNC(mrgame_state::data_w)); //W DATA map(0x03000b, 0x03000b).w(FUNC(mrgame_state::row_w)); //W ROW map(0x03000d, 0x03000d).r(FUNC(mrgame_state::col_r)); //R COL - map(0x03000e, 0x03000f).nopw(); //EXT ADD - lamp/sol data + map(0x03000f, 0x03000f).w(FUNC(mrgame_state::extadd_w)); //EXT ADD } void mrgame_state::video_map(address_map &map) @@ -169,7 +197,7 @@ void mrgame_state::video_map(address_map &map) map(0x8100, 0x8103).mirror(0x7efc).rw("ppi", FUNC(i8255_device::read), FUNC(i8255_device::write)); } -void mrgame_state::wcup90_video_map(address_map &map) +void mrgame_state::macattck_video_map(address_map &map) { map(0x0000, 0x7fff).rom().region("video", 0); map(0x8000, 0x87ff).ram(); @@ -183,8 +211,14 @@ void mrgame_state::wcup90_video_map(address_map &map) void mrgame_state::audio1_map(address_map &map) { - map(0x0000, 0x7fff).rom().region("audio1", 0); - map(0xfc00, 0xffff).ram(); + map(0x0000, 0xfbff).rom().region("audio1", 0); + map(0xfc00, 0xfcff).ram().mirror(0x300); // 2x 2112 +} + +void mrgame_state::macattck_audio1_map(address_map &map) +{ + map(0x0000, 0xfbff).rom().region("audio1", 0); + map(0xfc00, 0xffff).ram(); // 2x 2114 } void mrgame_state::audio1_io(address_map &map) @@ -192,14 +226,21 @@ void mrgame_state::audio1_io(address_map &map) map.global_mask(3); map(0x0000, 0x0000).w("dacvol", FUNC(dac_byte_interface::data_w)); //DA1 map(0x0001, 0x0001).r(FUNC(mrgame_state::sound_r)); //IN1 - map(0x0002, 0x0002).w(FUNC(mrgame_state::ack1_w)); //AKL1 + map(0x0002, 0x0002).r(FUNC(mrgame_state::ack1_r)); //AKL1 map(0x0003, 0x0003).nopw(); //SGS pass data to M114 } void mrgame_state::audio2_map(address_map &map) { - map(0x0000, 0x7fff).rom().region("audio2", 0); - map(0xfc00, 0xffff).ram(); + map(0x0000, 0xfbff).rom().region("audio2", 0); + map(0xfc00, 0xfcff).ram().mirror(0x300); // 2x 2112 +} + +void mrgame_state::wcup90_audio2_map(address_map &map) +{ + map.global_mask(0x7fff); + map(0x0000, 0x7bff).rom().region("audio2", 0); + map(0x7c00, 0x7fff).ram(); // no manual; assuming 2x 2114 } void mrgame_state::audio2_io(address_map &map) @@ -226,8 +267,8 @@ static INPUT_PORTS_START( mrgame ) PORT_DIPSETTING( 0x0a, "Belgium") PORT_DIPSETTING( 0x0c, "Yugoslavia") PORT_DIPSETTING( 0x0e, "U.S.A.") - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("R. Flipper") PORT_CODE(KEYCODE_RSHIFT) - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("L. Flipper") PORT_CODE(KEYCODE_LSHIFT) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("R. Flipper") PORT_CODE(KEYCODE_RSHIFT) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("L. Flipper") PORT_CODE(KEYCODE_LSHIFT) // These dips are only documented for Motor Show PORT_START("DSW1") @@ -245,10 +286,10 @@ static INPUT_PORTS_START( mrgame ) PORT_DIPSETTING( 0x00, DEF_STR( Hard )) PORT_START("X0") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SERVICE2 ) PORT_NAME("Advance Test") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SERVICE3 ) PORT_NAME("Return Test") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_TILT ) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_SERVICE ) + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("Advance Test") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("Return Test") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_NAME("Slam Tilt") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Credit Service") PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN3 ) @@ -256,43 +297,85 @@ static INPUT_PORTS_START( mrgame ) PORT_START("X1") PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_START1 ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_TILT ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_SERVICE4 ) PORT_NAME("Factory Burn Test") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_NAME("Tilt") + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("Factory Burn Test") PORT_BIT( 0xe9, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("X2") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("INP16") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("INP17") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("INP18") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("INP19") + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("INP20") + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("INP21") + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("INP22") + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("INP23") + + PORT_START("X3") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("INP24") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_G) PORT_NAME("INP25") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_H) PORT_NAME("INP26") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_I) PORT_NAME("INP27") + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_J) PORT_NAME("INP28") + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_K) PORT_NAME("INP29") + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_L) PORT_NAME("INP30") + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("INP31") + + PORT_START("X4") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_N) PORT_NAME("INP32") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_O) PORT_NAME("INP33") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_P) PORT_NAME("INP34") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("INP35") + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("INP36") + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("INP37") + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_U) PORT_NAME("INP38") + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_V) PORT_NAME("INP39") + + PORT_START("X5") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("INP40") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_Y) PORT_NAME("INP41") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_COMMA) PORT_NAME("INP42") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_NAME("INP43") + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("INP44") + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_COLON) PORT_NAME("INP45") + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_QUOTE) PORT_NAME("INP46") + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_NAME("INP47") + + PORT_START("X6") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_NAME("INP48") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_NAME("INP49") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_BACKSLASH) PORT_NAME("INP50") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("INP51") + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_EQUALS) PORT_NAME("INP52") + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("INP53") + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_HOME) PORT_NAME("INP54") + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_END) PORT_NAME("INP55") INPUT_PORTS_END -uint8_t mrgame_state::rsw_r() +u8 mrgame_state::rsw_r() { - return m_io_dsw0->read() | ((uint8_t)m_ack1 << 5) | ((uint8_t)m_ack2 << 4); + return m_io_dsw0->read() | ((u8)m_ack1 << 5) | ((u8)m_ack2 << 4); } -// this is like a keyboard, energise a row and read the column data -uint8_t mrgame_state::col_r() +u8 mrgame_state::col_r() { - if (m_row_data == 0) - return m_io_x0->read(); - else - if (m_row_data == 1) - return m_io_x1->read(); + if (m_row < 7) + return m_io_keyboard[m_row]->read(); else - if (m_row_data == 7) return m_video_status; - else - - return 0xff; } -void mrgame_state::row_w(uint8_t data) +void mrgame_state::row_w(u8 data) { - m_row_data = data & 7; + m_row = data & 7; } -uint8_t mrgame_state::sound_r() +u8 mrgame_state::sound_r() { return m_sound_data; } -void mrgame_state::sound_w(uint8_t data) +void mrgame_state::sound_w(u8 data) { m_sound_data = data; m_audiocpu1->set_input_line(INPUT_LINE_NMI, BIT(data, 7) ? CLEAR_LINE : ASSERT_LINE); @@ -300,24 +383,42 @@ void mrgame_state::sound_w(uint8_t data) } // this produces 24 outputs from three driver chips to drive lamps & solenoids -void mrgame_state::triple_w(uint8_t data) +void mrgame_state::triple_w(u8 data) +{ + switch (data & 0x18) + { + case 0x00: + m_ackv = BIT(data, 7); + break; + case 0x08: + m_sxx = data & 7; + break; + case 0x10: + m_sxx = 8U + (data & 7); + break; + default: + break; + } +} + +void mrgame_state::extadd_w(u8 data) { - if ((data & 0x18)==0) - m_ackv = BIT(data, 7); + u8 t = m_sxx*8+(data&7); + m_io_outputs[t] = m_data & 1; } -void mrgame_state::video_w(uint8_t data) +void mrgame_state::video_w(u8 data) { m_video_data = data; } -void mrgame_state::videoram_w(offs_t offset, uint8_t data) +void mrgame_state::videoram_w(offs_t offset, u8 data) { m_p_videoram[offset] = data; m_tilemap->mark_tile_dirty(offset); } -void mrgame_state::videoattr_w(offs_t offset, uint8_t data) +void mrgame_state::videoattr_w(offs_t offset, u8 data) { m_p_objectram[offset] = data; if (BIT(offset, 0)) @@ -334,8 +435,8 @@ void mrgame_state::videoattr_w(offs_t offset, uint8_t data) template WRITE_LINE_MEMBER(mrgame_state::video_bank_w) { - m_gfx_bank &= 0x0f & ~(uint8_t(1) << Bit); - m_gfx_bank |= uint8_t(state ? 1 : 0) << Bit; + m_gfx_bank &= 0x0f & ~(u8(1) << Bit); + m_gfx_bank |= u8(state ? 1 : 0) << Bit; m_tilemap->mark_all_dirty(); } @@ -359,30 +460,31 @@ WRITE_LINE_MEMBER(mrgame_state::flip_w) m_tilemap->mark_all_dirty(); } -void mrgame_state::ack1_w(uint8_t data) +u8 mrgame_state::ack1_r() { - m_ack1 = BIT(data, 0); + m_ack1 = 1; // this is weird + return 0xff; } -void mrgame_state::ack2_w(uint8_t data) +void mrgame_state::ack2_w(u8 data) { m_ack2 = BIT(data, 0); } -uint8_t mrgame_state::porta_r() +u8 mrgame_state::porta_r() { return m_video_data; } -void mrgame_state::portb_w(uint8_t data) +void mrgame_state::portb_w(u8 data) { m_video_status = data; m_ackv = 0; } -uint8_t mrgame_state::portc_r() +u8 mrgame_state::portc_r() { - return m_io_dsw1->read() | ((uint8_t)m_ackv << 4); + return m_io_dsw1->read() | (m_ackv ? 0x10 : 0); } void mrgame_state::machine_start() @@ -392,10 +494,31 @@ void mrgame_state::machine_start() tilemap_get_info_delegate(*this, FUNC(mrgame_state::get_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32); m_tilemap->set_scroll_cols(32); + + genpin_class::machine_start(); + + m_io_outputs.resolve(); + + save_item(NAME(m_ack1)); + save_item(NAME(m_ack2)); + save_item(NAME(m_ackv)); + save_item(NAME(m_flip)); + save_item(NAME(m_intst)); + save_item(NAME(m_irq_state)); + save_item(NAME(m_row)); + save_item(NAME(m_sxx)); + save_item(NAME(m_sound_data)); + save_item(NAME(m_gfx_bank)); + save_item(NAME(m_video_data)); + save_item(NAME(m_video_status)); } void mrgame_state::machine_reset() { + genpin_class::machine_reset(); + for (u8 i = 0; i < m_io_outputs.size(); i++) + m_io_outputs[i] = 0; + m_sound_data = 0xff; m_irq_state = 0xff; m_video_data = 0; @@ -405,11 +528,7 @@ void mrgame_state::machine_reset() m_ack2 = 0; m_ackv = 0; m_flip = 0; - m_row_data = 0; -} - -void mrgame_state::init_mrgame() -{ + m_row = 0; } WRITE_LINE_MEMBER(mrgame_state::vblank_int_w) @@ -503,7 +622,7 @@ GFXDECODE_END void mrgame_state::mrgame_palette(palette_device &palette) const { static constexpr int resistances[3] = { 1000, 470, 220 }; - uint8_t const *const color_prom = memregion("proms")->base(); + u8 const *const color_prom = memregion("proms")->base(); // compute the color output resistor weights double rweights[3], gweights[3], bweights[2]; @@ -513,26 +632,26 @@ void mrgame_state::mrgame_palette(palette_device &palette) const 2, &resistances[1], bweights, 0, 0); // create a lookup table for the palette - for (uint8_t i = 0; i < 32; i++) + for (u8 i = 0; i < 32; i++) { - uint8_t bit0, bit1, bit2; + u8 bit0, bit1, bit2; // red component bit0 = BIT(color_prom[i], 0); bit1 = BIT(color_prom[i], 1); bit2 = BIT(color_prom[i], 2); - uint8_t const r = combine_weights(rweights, bit0, bit1, bit2); + u8 const r = combine_weights(rweights, bit0, bit1, bit2); // green component bit0 = BIT(color_prom[i], 3); bit1 = BIT(color_prom[i], 4); bit2 = BIT(color_prom[i], 5); - uint8_t const g = combine_weights(gweights, bit0, bit1, bit2); + u8 const g = combine_weights(gweights, bit0, bit1, bit2); // blue component bit0 = BIT(color_prom[i], 6); bit1 = BIT(color_prom[i], 7); - uint8_t const b = combine_weights(bweights, bit0, bit1); + u8 const b = combine_weights(bweights, bit0, bit1); palette.set_pen_color(i, rgb_t(r, g, b)); palette.set_pen_color(i + 32, rgb_t(r, g, b)); @@ -596,6 +715,7 @@ void mrgame_state::mrgame(machine_config &config) GFXDECODE(config, m_gfxdecode, m_palette, gfx_2bpp); /* Sound */ + genpin_audio(config); SPEAKER(config, "lspeaker").front_left(); SPEAKER(config, "rspeaker").front_right(); DAC_8BIT_R2R(config, "ldac", 0).add_route(ALL_OUTPUTS, "lspeaker", 0.25); // unknown DAC @@ -622,11 +742,12 @@ void mrgame_state::mrgame(machine_config &config) ppi.in_pc_callback().set(FUNC(mrgame_state::portc_r)); } -void mrgame_state::wcup90(machine_config &config) +void mrgame_state::macattck(machine_config &config) { mrgame(config); - m_videocpu->set_addrmap(AS_PROGRAM, &mrgame_state::wcup90_video_map); + m_videocpu->set_addrmap(AS_PROGRAM, &mrgame_state::macattck_video_map); + m_audiocpu1->set_addrmap(AS_PROGRAM, &mrgame_state::macattck_audio1_map); m_gfxdecode->set_info(gfx_5bpp); @@ -636,11 +757,17 @@ void mrgame_state::wcup90(machine_config &config) subdevice("screen")->screen_vblank().set(FUNC(mrgame_state::vblank_int_w)); } +void mrgame_state::wcup90(machine_config &config) +{ + macattck(config); + m_audiocpu2->set_addrmap(AS_PROGRAM, &mrgame_state::wcup90_audio2_map); +} + /*------------------------------------------------------------------- / Dakar (06/1988) /-------------------------------------------------------------------*/ ROM_START(dakar) - ROM_REGION16_BE(0x10000, "roms", 0) + ROM_REGION16_BE(0x10000, "maincpu", 0) ROM_LOAD16_BYTE("cpu_ic13.rom", 0x000000, 0x8000, CRC(83183929) SHA1(977ac10a1e78c759eb0550794f2639fe0e2d1507)) ROM_LOAD16_BYTE("cpu_ic14.rom", 0x000001, 0x8000, CRC(2010d28d) SHA1(d262dabd9298566df43df298cf71c974bee1434a)) @@ -670,17 +797,9 @@ ROM_END / Motor Show (1989) /-------------------------------------------------------------------*/ ROM_START(motrshow) - ROM_REGION16_BE(0x10000, "roms", 0) - ROM_DEFAULT_BIOS("0") - ROM_SYSTEM_BIOS(0, "0", "0") - ROMX_LOAD( "cpu_0.ic13", 0x0000, 0x8000, CRC(e862ca71) SHA1(b02e5f39f9427d58b70b7999a5ff6075beff05ae), ROM_SKIP(1) | ROM_BIOS(0) ) - ROMX_LOAD( "cpu_0.ic14", 0x0001, 0x8000, CRC(c898ae25) SHA1(f0e1369284a1e0f394f1d40281fd46252016602e), ROM_SKIP(1) | ROM_BIOS(0) ) - ROM_SYSTEM_BIOS(1, "1", "1") - ROMX_LOAD( "cpu_1.ic13a", 0x0000, 0x8000, CRC(2dbdd9d4) SHA1(b404814a4e83ead6da3c57818ae97f23d380f9da), ROM_SKIP(1) | ROM_BIOS(1) ) - ROMX_LOAD( "cpu_1.ic14b", 0x0001, 0x8000, CRC(0bd98fec) SHA1(b90a7e997db59740398003ba94a69118b1ee70af), ROM_SKIP(1) | ROM_BIOS(1) ) - ROM_SYSTEM_BIOS(2, "2", "2") - ROMX_LOAD( "cpu_2.ic13b", 0x0000, 0x8000, CRC(9cd2d6f3) SHA1(6f123367ccbe1376b4bd8a5ee0f636efe42f9eac), ROM_SKIP(1) | ROM_BIOS(2) ) - ROMX_LOAD( "cpu_2.ic14b", 0x0001, 0x8000, CRC(0bd98fec) SHA1(b90a7e997db59740398003ba94a69118b1ee70af), ROM_SKIP(1) | ROM_BIOS(2) ) + ROM_REGION16_BE(0x10000, "maincpu", 0) + ROM_LOAD16_BYTE( "cpu_0.ic13", 0x0000, 0x8000, CRC(e862ca71) SHA1(b02e5f39f9427d58b70b7999a5ff6075beff05ae)) + ROM_LOAD16_BYTE( "cpu_0.ic14", 0x0001, 0x8000, CRC(c898ae25) SHA1(f0e1369284a1e0f394f1d40281fd46252016602e)) ROM_REGION(0x8000, "video", 0) ROM_LOAD("vid_ic14.rom", 0x0000, 0x8000, CRC(1d4568e2) SHA1(bfc2bb59708ce3a09f9a1b3460ed8d5269840c97)) @@ -692,7 +811,59 @@ ROM_START(motrshow) ROM_REGION(0x0020, "proms", 0) ROM_LOAD("vid_ic66.rom", 0x0000, 0x0020, CRC(5b585252) SHA1(b88e56ebdce2c3a4b170aff4b05018e7c21a79b8)) - ROM_REGION(0x10000, "audio1", 0) + ROM_REGION(0x10000, "audio1", ROMREGION_ERASEFF) + ROM_LOAD("snd_ic06.rom", 0x0000, 0x8000, CRC(fba5a8f1) SHA1(ddf989abebe05c569c9ecdd498bd8ea409df88ac)) + + ROM_REGION(0x4000, "m114", 0) + ROM_LOAD("snd_ic22.rom", 0x0000, 0x4000, CRC(e6c1098e) SHA1(06bf8917a27d5e46e4aab93e1f212918418e3a82)) + + ROM_REGION(0x10000, "audio2", 0) + ROM_LOAD("snd_ic35.rom", 0x0000, 0x8000, CRC(9dec153d) SHA1(8a0140257316aa19c0401456839e11b6896609b1)) + ROM_LOAD("snd_ic36.rom", 0x8000, 0x8000, CRC(4f42be6e) SHA1(684e988f413cd21c785ad5d60ef5eaddddaf72ab)) +ROM_END + +ROM_START(motrshowa) + ROM_REGION16_BE(0x10000, "maincpu", 0) + ROM_LOAD16_BYTE( "cpu_1.ic13a", 0x0000, 0x8000, CRC(2dbdd9d4) SHA1(b404814a4e83ead6da3c57818ae97f23d380f9da)) + ROM_LOAD16_BYTE( "cpu_1.ic14b", 0x0001, 0x8000, CRC(0bd98fec) SHA1(b90a7e997db59740398003ba94a69118b1ee70af)) + + ROM_REGION(0x8000, "video", 0) + ROM_LOAD("vid_ic14.rom", 0x0000, 0x8000, CRC(1d4568e2) SHA1(bfc2bb59708ce3a09f9a1b3460ed8d5269840c97)) + + ROM_REGION(0x10000, "chargen", 0) + ROM_LOAD("vid_ic55.rom", 0x0000, 0x8000, CRC(c27a4ded) SHA1(9c2c9b17f1e71afb74bdfbdcbabb99ef935d32db)) + ROM_LOAD("vid_ic56.rom", 0x8000, 0x8000, CRC(1664ec8d) SHA1(e7b15acdac7dfc51b668e908ca95f02a2b569737)) + + ROM_REGION(0x0020, "proms", 0) + ROM_LOAD("vid_ic66.rom", 0x0000, 0x0020, CRC(5b585252) SHA1(b88e56ebdce2c3a4b170aff4b05018e7c21a79b8)) + + ROM_REGION(0x10000, "audio1", ROMREGION_ERASEFF) + ROM_LOAD("snd_ic06.rom", 0x0000, 0x8000, CRC(fba5a8f1) SHA1(ddf989abebe05c569c9ecdd498bd8ea409df88ac)) + + ROM_REGION(0x4000, "m114", 0) + ROM_LOAD("snd_ic22.rom", 0x0000, 0x4000, CRC(e6c1098e) SHA1(06bf8917a27d5e46e4aab93e1f212918418e3a82)) + + ROM_REGION(0x10000, "audio2", 0) + ROM_LOAD("snd_ic35.rom", 0x0000, 0x8000, CRC(9dec153d) SHA1(8a0140257316aa19c0401456839e11b6896609b1)) + ROM_LOAD("snd_ic36.rom", 0x8000, 0x8000, CRC(4f42be6e) SHA1(684e988f413cd21c785ad5d60ef5eaddddaf72ab)) +ROM_END + +ROM_START(motrshowb) + ROM_REGION16_BE(0x10000, "maincpu", 0) + ROM_LOAD16_BYTE( "cpu_2.ic13b", 0x0000, 0x8000, CRC(9cd2d6f3) SHA1(6f123367ccbe1376b4bd8a5ee0f636efe42f9eac)) + ROM_LOAD16_BYTE( "cpu_2.ic14b", 0x0001, 0x8000, CRC(0bd98fec) SHA1(b90a7e997db59740398003ba94a69118b1ee70af)) + + ROM_REGION(0x8000, "video", 0) + ROM_LOAD("vid_ic14.rom", 0x0000, 0x8000, CRC(1d4568e2) SHA1(bfc2bb59708ce3a09f9a1b3460ed8d5269840c97)) + + ROM_REGION(0x10000, "chargen", 0) + ROM_LOAD("vid_ic55.rom", 0x0000, 0x8000, CRC(c27a4ded) SHA1(9c2c9b17f1e71afb74bdfbdcbabb99ef935d32db)) + ROM_LOAD("vid_ic56.rom", 0x8000, 0x8000, CRC(1664ec8d) SHA1(e7b15acdac7dfc51b668e908ca95f02a2b569737)) + + ROM_REGION(0x0020, "proms", 0) + ROM_LOAD("vid_ic66.rom", 0x0000, 0x0020, CRC(5b585252) SHA1(b88e56ebdce2c3a4b170aff4b05018e7c21a79b8)) + + ROM_REGION(0x10000, "audio1", ROMREGION_ERASEFF) ROM_LOAD("snd_ic06.rom", 0x0000, 0x8000, CRC(fba5a8f1) SHA1(ddf989abebe05c569c9ecdd498bd8ea409df88ac)) ROM_REGION(0x4000, "m114", 0) @@ -707,12 +878,14 @@ ROM_END / Fast Track (1989) A predecessor of Motor Show. Green Screen text only /-----------------------------------------------------------------------*/ ROM_START(fasttrack) - ROM_REGION16_BE(0x10000, "roms", 0) + ROM_REGION16_BE(0x10000, "maincpu", 0) ROM_LOAD16_BYTE("cpuic13.rom", 0x0000, 0x8000, CRC(675cbef6) SHA1(0561aee09bb459a79e54a903d39ef5e5288e8368)) ROM_LOAD16_BYTE("cpuic14.rom", 0x0001, 0x8000, CRC(57a1c42f) SHA1(fbfc7527068a1e68afa4c20d5c2650399a1ee3cd)) ROM_REGION(0x8000, "video", 0) ROM_LOAD("ft_vid1.764", 0x0000, 0x2000, NO_DUMP ) // only dump we found was all 0xF7 + ROM_FILL(0,1,0x18) // this is to prevent the error.log filling up the hard drive + ROM_FILL(1,1,0xfe) ROM_REGION(0x10000, "chargen", ROMREGION_ERASEFF) ROM_LOAD("ft_vid2.532", 0x0000, 0x001000, CRC(5145685b) SHA1(6857be53efee5d439311ddb93e9f509590ff26c9) ) // 2nd half is rubbish @@ -721,7 +894,7 @@ ROM_START(fasttrack) ROM_REGION(0x0020, "proms", 0) ROM_LOAD("vid_ic66.rom", 0x0000, 0x0020, CRC(5b585252) SHA1(b88e56ebdce2c3a4b170aff4b05018e7c21a79b8)) - ROM_REGION(0x10000, "audio1", 0) + ROM_REGION(0x10000, "audio1", ROMREGION_ERASEFF) ROM_LOAD("snd_ic06.rom", 0x0000, 0x8000, CRC(fba5a8f1) SHA1(ddf989abebe05c569c9ecdd498bd8ea409df88ac)) ROM_REGION(0x4000, "m114", 0) @@ -736,7 +909,7 @@ ROM_END / Mac Attack (1990) /-------------------------------------------------------------------*/ ROM_START(macattck) - ROM_REGION16_BE(0x10000, "roms", 0) + ROM_REGION16_BE(0x10000, "maincpu", 0) ROM_LOAD16_BYTE("cpu_ic13.rom", 0x0000, 0x8000, CRC(35cabad1) SHA1(01279df881b0d7d6586c1b8570b12bdc1fb9ff21) ) ROM_LOAD16_BYTE("cpu_ic14.rom", 0x0001, 0x8000, CRC(6a4d7b89) SHA1(090e1a6c069cb6e5efd26a0260df613375f0b063) ) @@ -753,7 +926,7 @@ ROM_START(macattck) ROM_REGION(0x0020, "proms", 0) ROM_LOAD("vid_ic61.rom", 0x0000, 0x0020, CRC(538c72ae) SHA1(f704492568257fcc4a4f1189207c6fb6526eb81c) BAD_DUMP) // from wcup90, assumed to be the same - ROM_REGION(0x10000, "audio1", 0) + ROM_REGION(0x10000, "audio1", ROMREGION_ERASEFF) ROM_LOAD("snd_ic06.rom", 0x0000, 0x8000, CRC(4ab94d16) SHA1(4c3755489f699c751d664f420b9852ef16bb3aa6) ) ROM_REGION(0x4000, "m114", 0) @@ -768,9 +941,9 @@ ROM_END / World Cup 90 (1990) /-------------------------------------------------------------------*/ ROM_START(wcup90) - ROM_REGION16_BE(0x10000, "roms", 0) - ROM_LOAD16_BYTE("cpu_ic13.rom", 0x000000, 0x8000, CRC(0e2edfb0) SHA1(862fb1f6509fb1f560d0b2bb8a5764f64b259f04)) - ROM_LOAD16_BYTE("cpu_ic14.rom", 0x000001, 0x8000, CRC(fdd03165) SHA1(6dc6e68197218f8808436098c26cd04fc3215b1c)) + ROM_REGION16_BE(0x10000, "maincpu", 0) + ROM_LOAD16_BYTE("cpu_ic13.rom", 0x0000, 0x8000, CRC(0e2edfb0) SHA1(862fb1f6509fb1f560d0b2bb8a5764f64b259f04)) + ROM_LOAD16_BYTE("cpu_ic14.rom", 0x0001, 0x8000, CRC(fdd03165) SHA1(6dc6e68197218f8808436098c26cd04fc3215b1c)) ROM_REGION(0x8000, "video", 0) ROM_LOAD("vid_ic91.rom", 0x0000, 0x8000, CRC(3287ad20) SHA1(d5a453efc7292670073f157dca04897be857b8ed)) @@ -785,7 +958,7 @@ ROM_START(wcup90) ROM_REGION(0x0020, "proms", 0) ROM_LOAD("vid_ic61.rom", 0x0000, 0x0020, CRC(538c72ae) SHA1(f704492568257fcc4a4f1189207c6fb6526eb81c)) - ROM_REGION(0x10000, "audio1", 0) + ROM_REGION(0x10000, "audio1", ROMREGION_ERASEFF) ROM_LOAD("snd_ic06.rom", 0x0000, 0x8000, CRC(19a66331) SHA1(fbd71bc378b5a04247fd1754529c66b086eb33d8)) ROM_REGION(0x4000, "user1", 0) @@ -795,15 +968,17 @@ ROM_START(wcup90) ROM_LOAD("snd_ic45.rom", 0x00000, 0x10000, CRC(265aa979) SHA1(9ca10c41526a2d227c21f246273ca14bec7f1bc7)) ROM_LOAD("snd_ic46.rom", 0x10000, 0x10000, CRC(7edb321e) SHA1(b242e94c24e996d2de803d339aa9bf6e93586a4c)) - ROM_REGION(0x10000, "audio2", 0) + ROM_REGION(0x8000, "audio2", 0) ROM_LOAD("snd_ic44.rom", 0x00000, 0x8000, CRC(00946570) SHA1(83e7dd89844679571ab2a803295c8ca8941a4ac7)) ROM_END } // anonymous namespace -GAME(1988, dakar, 0, mrgame, mrgame, mrgame_state, init_mrgame, ROT0, "Mr Game", "Dakar", MACHINE_MECHANICAL | MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) -GAME(1989, fasttrack, motrshow, mrgame, mrgame, mrgame_state, empty_init, ROT0, "Mr Game", "Fast Track", MACHINE_MECHANICAL | MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) -GAME(1989, motrshow, 0, mrgame, mrgame, mrgame_state, init_mrgame, ROT0, "Mr Game", "Motor Show", MACHINE_MECHANICAL | MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) -GAME(1990, macattck, 0, wcup90, mrgame, mrgame_state, init_mrgame, ROT0, "Mr Game", "Mac Attack", MACHINE_IS_SKELETON_MECHANICAL) -GAME(1990, wcup90, 0, wcup90, mrgame, mrgame_state, init_mrgame, ROT0, "Mr Game", "World Cup 90", MACHINE_MECHANICAL | MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) +GAME(1988, dakar, 0, mrgame, mrgame, mrgame_state, empty_init, ROT0, "Mr Game", "Dakar", MACHINE_IS_SKELETON_MECHANICAL ) +GAME(1989, fasttrack, motrshow, mrgame, mrgame, mrgame_state, empty_init, ROT0, "Mr Game", "Fast Track", MACHINE_IS_SKELETON_MECHANICAL ) +GAME(1989, motrshow, 0, mrgame, mrgame, mrgame_state, empty_init, ROT0, "Mr Game", "Motor Show (set 1)", MACHINE_IS_SKELETON_MECHANICAL ) +GAME(1989, motrshowa, motrshow, mrgame, mrgame, mrgame_state, empty_init, ROT0, "Mr Game", "Motor Show (set 2)", MACHINE_IS_SKELETON_MECHANICAL ) +GAME(1989, motrshowb, motrshow, mrgame, mrgame, mrgame_state, empty_init, ROT0, "Mr Game", "Motor Show (set 3)", MACHINE_IS_SKELETON_MECHANICAL ) +GAME(1990, macattck, 0, macattck, mrgame, mrgame_state, empty_init, ROT0, "Mr Game", "Mac Attack", MACHINE_IS_SKELETON_MECHANICAL ) +GAME(1990, wcup90, 0, wcup90, mrgame, mrgame_state, empty_init, ROT0, "Mr Game", "World Cup 90", MACHINE_IS_SKELETON_MECHANICAL ) diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 356cbeefb57..b365ec5b797 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -30815,6 +30815,8 @@ dakar // fasttrack // macattck // motrshow // +motrshowa // +motrshowb // wcup90 // @source:mrjong.cpp -- cgit v1.2.3