mrgame.cpp: WIP. Most game are playable.

New machines marked as NOT_WORKING
----------------------------------
Motor Show (set 2)
Motor Show (set 3)
[Robbbert]
This commit is contained in:
Robbbert 2021-12-13 19:40:53 +11:00
parent 636d661e99
commit 6e0218c2fe
2 changed files with 313 additions and 136 deletions

View File

@ -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 <unsigned Bit> 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<palette_device> m_palette;
required_shared_ptr<uint8_t> m_p_videoram;
required_shared_ptr<uint8_t> m_p_objectram;
required_shared_ptr<u8> m_p_videoram;
required_shared_ptr<u8> m_p_objectram;
required_device<gfxdecode_device> m_gfxdecode;
required_device<m68000_device> m_maincpu;
@ -124,20 +150,22 @@ private:
required_device<ls259_device> m_selectlatch;
required_ioport m_io_dsw0;
required_ioport m_io_dsw1;
required_ioport m_io_x0;
required_ioport m_io_x1;
required_ioport_array<7> m_io_keyboard;
output_finder<128> m_io_outputs; // 24 solenoids + 104 lamps
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;
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();
if (m_row < 7)
return m_io_keyboard[m_row]->read();
else
if (m_row_data == 1)
return m_io_x1->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)
{
if ((data & 0x18)==0)
m_ackv = BIT(data, 7);
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::video_w(uint8_t data)
void mrgame_state::extadd_w(u8 data)
{
u8 t = m_sxx*8+(data&7);
m_io_outputs[t] = m_data & 1;
}
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 <unsigned Bit>
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_device>("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 )

View File

@ -30815,6 +30815,8 @@ dakar //
fasttrack //
macattck //
motrshow //
motrshowa //
motrshowb //
wcup90 //
@source:mrjong.cpp