New machines added as MACHINE_NOT_WORKING

-----------------------------------------
Tinker Bell [Darksoft, Team Europe, R. Belmont]

segam1.cpp: removed and games merged into the new segasm1.cpp. [R. Belmont]
This commit is contained in:
arbee 2022-06-04 21:19:44 -04:00
parent fd82da23ef
commit ce212a5e9a
4 changed files with 708 additions and 450 deletions

View File

@ -3569,7 +3569,7 @@ files {
MAME_DIR .. "src/mame/drivers/segas24.cpp",
MAME_DIR .. "src/mame/includes/segas24.h",
MAME_DIR .. "src/mame/video/segas24.cpp",
MAME_DIR .. "src/mame/drivers/segam1.cpp",
MAME_DIR .. "src/mame/drivers/segasm1.cpp",
MAME_DIR .. "src/mame/drivers/segas32.cpp",
MAME_DIR .. "src/mame/includes/segas32.h",
MAME_DIR .. "src/mame/machine/segas32.cpp",

View File

@ -1,445 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:David Haywood
/*
Sega M1 hardware (837-7571) (PCB)
Sega Bingo Multicart (837-10675) (Sticker on PCB)
used for redemption / gambling style machines in a satellite setup
based on Caribbean Boule the following hardware setup is used
One X-Board (segaxbd.cpp) drives a large rear-projection monitor which all players view to see the main game progress.
Multiple M1 boards ("satellite" board) for each player for them to view information privately.
One 'link' board which connects everything together. The link board has audio hardware, a 68K, and a Z80 as
well as a huge bank of UARTS and toslink connectors, but no video. It's possible the main game logic runs
on the 'link' board.
Unfortunately we don't have any dumps of anything other than an M1 board right now.
---
is this related to (or a component of?) bingoc.cpp, the EPR numbers are much lower there tho
so it's probably an earlier version of the same thing or one of the 'link' boards?
uses s24 style tilemaps (ram based?)
*/
#include "emu.h"
#include "cpu/m68000/m68000.h"
#include "cpu/z80/z80.h"
#include "machine/315_5296.h"
#include "machine/gen_latch.h"
#include "machine/i8251.h"
#include "machine/mb8421.h"
#include "sound/ymopn.h"
#include "video/segaic24.h"
#include "emupal.h"
#include "screen.h"
#include "speaker.h"
class segam1_state : public driver_device
{
public:
segam1_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_m1comm(*this, "m1comm")
, m_screen(*this, "screen")
, m_palette(*this, "palette")
, m_paletteram(*this, "paletteram")
, m_tile(*this, "tile")
, m_mixer(*this, "mixer")
, m_ymsnd(*this, "ymsnd")
{ }
void unkm1(machine_config &config);
void segam1(machine_config &config);
private:
void paletteram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
void sound_a0_bank_w(uint8_t data);
virtual void machine_start() override;
virtual void video_start() override;
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
required_device<cpu_device> m_maincpu;
required_device<z80_device> m_audiocpu;
required_device<z80_device> m_m1comm;
required_device<screen_device> m_screen;
required_device<palette_device> m_palette;
required_shared_ptr<u16> m_paletteram;
required_device<segas24_tile_device> m_tile;
required_device<segas24_mixer_device> m_mixer;
required_device<ym3438_device> m_ymsnd;
void segam1_comms_map(address_map &map);
void segam1_map(address_map &map);
void segam1_sound_io_map(address_map &map);
void segam1_sound_map(address_map &map);
void unkm1_sound_map(address_map &map);
};
void segam1_state::machine_start()
{
membank("soundbank")->configure_entries(0x00, 0x10, memregion("audiocpu")->base(), 0x2000);
}
void segam1_state::video_start()
{
}
void segam1_state::sound_a0_bank_w(uint8_t data)
{
membank("soundbank")->set_entry(data & 0x0f);
}
// 315-5242
void segam1_state::paletteram_w(offs_t offset, uint16_t data, uint16_t mem_mask)
{
COMBINE_DATA(&m_paletteram[offset]);
data = m_paletteram[offset];
u16 r = (data & 0x00f) << 4;
if(data & 0x1000)
r |= 8;
u16 g = data & 0x0f0;
if(data & 0x2000)
g |= 8;
u16 b = (data & 0xf00) >> 4;
if(data & 0x4000)
b |= 8;
r |= r >> 5;
g |= g >> 5;
b |= b >> 5;
m_palette->set_pen_color(offset, rgb_t(r, g, b));
if(data & 0x8000) {
r = 255-0.6*(255-r);
g = 255-0.6*(255-g);
b = 255-0.6*(255-b);
} else {
r = 0.6*r;
g = 0.6*g;
b = 0.6*b;
}
m_palette->set_pen_color(offset+m_palette->entries()/2, rgb_t(r, g, b));
}
// copied from segas24.cpp
namespace {
struct layer_sort {
layer_sort(segas24_mixer_device *_mixer) { mixer = _mixer; }
bool operator()(int l1, int l2) {
static const int default_pri[12] = { 0, 1, 2, 3, 4, 5, 6, 7, -4, -3, -2, -1 };
int p1 = mixer->get_reg(l1) & 7;
int p2 = mixer->get_reg(l2) & 7;
if(p1 != p2)
return p1 - p2 < 0;
return default_pri[l2] - default_pri[l1] < 0;
}
segas24_mixer_device *mixer;
};
}
// copied from segas24.cpp
uint32_t segam1_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
if (m_mixer->get_reg(13) & 1)
{
bitmap.fill(m_palette->black_pen());
return 0;
}
screen.priority().fill(0);
bitmap.fill(0, cliprect);
std::vector<int> order;
order.resize(12);
for(int i=0; i<12; i++)
order[i] = i;
std::sort(order.begin(), order.end(), layer_sort(m_mixer.target()));
int level = 0;
for(int i=0; i<12; i++)
if(order[i] < 8)
m_tile->draw(screen, bitmap, cliprect, order[i], level, 0);
else
level++;
return 0;
}
void segam1_state::segam1_map(address_map &map)
{
map(0x000000, 0x07ffff).rom();
map(0x340000, 0x340fff).rw("dpram", FUNC(mb8421_device::right_r), FUNC(mb8421_device::right_w)).umask16(0x00ff);
map(0xb00000, 0xb0ffff).rw(m_tile, FUNC(segas24_tile_device::tile_r), FUNC(segas24_tile_device::tile_w));
map(0xb20000, 0xb20001).nopw(); /* Horizontal split position (ABSEL) */
map(0xb40000, 0xb40001).nopw(); /* Scanline trigger position (XHOUT) */
map(0xb60000, 0xb60001).nopw(); /* Frame trigger position (XVOUT) */
map(0xb70000, 0xb70001).nopw(); /* Synchronization mode */
map(0xb80000, 0xbfffff).rw(m_tile, FUNC(segas24_tile_device::char_r), FUNC(segas24_tile_device::char_w));
map(0xc00000, 0xc03fff).ram().w(FUNC(segam1_state::paletteram_w)).share("paletteram");
map(0xc04000, 0xc0401f).rw(m_mixer, FUNC(segas24_mixer_device::read), FUNC(segas24_mixer_device::write));
map(0xe00000, 0xe0001f).rw("io1", FUNC(sega_315_5296_device::read), FUNC(sega_315_5296_device::write)).umask16(0x00ff);
map(0xe40000, 0xe40001).portr("INX");
map(0xe40002, 0xe40003).portr("INY");
map(0xe40005, 0xe40005).w("soundlatch", FUNC(generic_latch_8_device::write));
map(0xe40006, 0xe40007).nopw();
map(0xe40008, 0xe40009).portr("INZ");
map(0xe80000, 0xe8001f).rw("io2", FUNC(sega_315_5296_device::read), FUNC(sega_315_5296_device::write)).umask16(0x00ff);
map(0xf00000, 0xf03fff).mirror(0x0fc000).ram(); // NVRAM?
}
void segam1_state::segam1_sound_map(address_map &map)
{
map(0x0000, 0x7fff).rom();
map(0xa000, 0xbfff).bankr("soundbank");
map(0xf000, 0xffff).ram();
}
void segam1_state::unkm1_sound_map(address_map &map)
{
segam1_sound_map(map);
map(0xe000, 0xefff).ram();
}
void segam1_state::segam1_sound_io_map(address_map &map)
{
map.global_mask(0xff);
map(0x80, 0x83).rw(m_ymsnd, FUNC(ym3438_device::read), FUNC(ym3438_device::write));
map(0xa0, 0xa0).w(FUNC(segam1_state::sound_a0_bank_w));
map(0xc0, 0xc0).r("soundlatch", FUNC(generic_latch_8_device::read)).nopw();
}
void segam1_state::segam1_comms_map(address_map &map)
{
map(0x0000, 0x7fff).rom();
map(0x8000, 0x9fff).ram();
map(0xa000, 0xa7ff).rw("dpram", FUNC(mb8421_device::left_r), FUNC(mb8421_device::left_w));
map(0xc000, 0xc001).rw("uart", FUNC(i8251_device::read), FUNC(i8251_device::write));
map(0xe003, 0xe003).nopw(); // ???
}
static INPUT_PORTS_START( segam1 )
PORT_START("INA")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_START("INB")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_START("INC")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_START("IND")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_START("INE")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_START("INF")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_START("ING")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_START("INX")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_BIT(0xff00, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_START("INY")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_BIT(0xff00, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_START("INZ")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_UNKNOWN)
PORT_BIT(0xff00, IP_ACTIVE_LOW, IPT_UNUSED)
INPUT_PORTS_END
void segam1_state::segam1(machine_config &config)
{
M68000(config, m_maincpu, XTAL(20'000'000)/2);
m_maincpu->set_addrmap(AS_PROGRAM, &segam1_state::segam1_map);
m_maincpu->set_vblank_int("screen", FUNC(segam1_state::irq4_line_hold));
Z80(config, m_audiocpu, 4000000); // unknown clock
m_audiocpu->set_addrmap(AS_PROGRAM, &segam1_state::segam1_sound_map);
m_audiocpu->set_addrmap(AS_IO, &segam1_state::segam1_sound_io_map);
Z80(config, m_m1comm, 4000000); // unknown clock
m_m1comm->set_addrmap(AS_PROGRAM, &segam1_state::segam1_comms_map);
sega_315_5296_device &io1(SEGA_315_5296(config, "io1", 0)); // unknown clock
io1.in_pa_callback().set_ioport("INA");
io1.in_pb_callback().set_ioport("INB");
io1.in_pc_callback().set_ioport("INC");
io1.in_pd_callback().set_ioport("IND");
io1.in_pe_callback().set_ioport("INE");
io1.in_pf_callback().set_ioport("INF");
sega_315_5296_device &io2(SEGA_315_5296(config, "io2", 0)); // unknown clock
io2.in_pg_callback().set_ioport("ING");
I8251(config, "uart", 4000000); // unknown clock
mb8421_device &dpram(MB8421(config, "dpram"));
dpram.intl_callback().set_inputline("m1comm", 0);
S24TILE(config, m_tile, 0, 0x3fff).set_palette(m_palette);
S24MIXER(config, m_mixer, 0);
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
m_screen->set_video_attributes(VIDEO_UPDATE_AFTER_VBLANK);
m_screen->set_raw(16000000, 656, 0, 496, 424, 0, 384); // copied from segas24.cpp; may not be accurate
m_screen->set_screen_update(FUNC(segam1_state::screen_update));
m_screen->set_palette(m_palette);
PALETTE(config, m_palette).set_entries(8192*2);
// sound hardware
SPEAKER(config, "mono").front_center();
GENERIC_LATCH_8(config, "soundlatch").data_pending_callback().set_inputline("audiocpu", INPUT_LINE_NMI);
YM3438(config, m_ymsnd, 8000000);
m_ymsnd->add_route(ALL_OUTPUTS, "mono", 0.40);
//m_ymsnd->irq_handler().set(FUNC(segam1_state::ym3438_irq_handler));
}
void segam1_state::unkm1(machine_config &config)
{
segam1(config);
m_audiocpu->set_addrmap(AS_PROGRAM, &segam1_state::unkm1_sound_map);
m_m1comm->set_disable(); // not dumped yet
}
ROM_START( bingpty ) // 1994/05/01 string
ROM_REGION( 0x80000, "maincpu", 0 ) /* 68000 Code */
ROM_LOAD16_BYTE( "epr-16648b.bin", 0x00000, 0x20000, CRC(e4fceb4c) SHA1(0a248bb328d2f6d72d540baefbe62838f4b76585) )
ROM_LOAD16_BYTE( "epr-16649b.bin", 0x00001, 0x20000, CRC(736d8bbd) SHA1(c359ad513d4a7693cbb1a27ce26f89849e894d05) )
ROM_REGION( 0x20000, "audiocpu", 0 ) /* Z80 Code */
ROM_LOAD( "epr-14845.bin", 0x00000, 0x20000, CRC(90d47101) SHA1(7bc002c104e3dbde1986aaec54112d5658eab523) )
ROM_REGION( 0x8000, "m1comm", 0 ) /* Z80 Code */
ROM_LOAD( "epr-14221a.bin", 0x00000, 0x8000, CRC(a13e67a4) SHA1(4cd269c7f04a64ae7806c8784f86bf6553a25d85) )
// dumps of the X-Board part, and the LINK PCB are missing.
ROM_END
ROM_START( unkm1 ) // 1992.01.31 string
ROM_REGION( 0x80000, "maincpu", 0 ) /* 68000 Code */
ROM_LOAD16_BYTE( "epr-14427.ic8", 0x00000, 0x40000, CRC(2d904fc6) SHA1(7062f47d77d09906420118c85e1cb565bec345a7) )
ROM_LOAD16_BYTE( "epr-14428.ic7", 0x00001, 0x40000, CRC(97a317f4) SHA1(19bc4cf6b6c580caa44f36c929b445ed94b2d9eb) )
ROM_REGION( 0x20000, "audiocpu", 0 ) /* Z80 Code */
ROM_LOAD( "epr-14429.ic104", 0x00000, 0x20000, CRC(1ff8262d) SHA1(fb90bd877b2dc65eb3e5495d6e21dee1f871fb44) )
ROM_REGION( 0x8000, "m1comm", 0 )
ROM_LOAD( "epr-14426.ic2", 0x0000, 0x8000, NO_DUMP ) // on "SYSTEM M1 COM" board with Z80, MB8421 and TMP82C51AP
ROM_REGION( 0x100, "plds", 0 )
ROM_LOAD( "315-5472-01.ic22", 0x000, 0x0eb, CRC(828ee6e2) SHA1(f32dd0f6297cc8bd3049be4bca502c0f8ec738cf) )
// dumps of the X-Board part, and the LINK PCB are missing.
ROM_END
GAME( 1994, bingpty, 0, segam1, segam1, segam1_state, empty_init, ROT0, "Sega", "Bingo Party Multicart (Rev B) (M1 Satellite board)", MACHINE_NOT_WORKING )
GAME( 1992, unkm1, 0, unkm1, segam1, segam1_state, empty_init, ROT0, "Sega", "unknown Sega gambling game (M1 Satellite board)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND )

View File

@ -0,0 +1,702 @@
// license:BSD-3-Clause
// copyright-holders:R. Belmont, David Haywood
/************************************************************************************************************
Sega System M1 medal games board (834-7795 standlone, 837-7571 networked)
68000 - main CPU
Z80 - sound CPU
YM3438 - sound generator
315-5242 - color encoder
315-5292 - System 24/Model 1/Model 2 tilemaps
315-5294 - priority?
315-5296 - I/O (x2)
315-5388A - priority?
20 MHz and 32 MHz oscillators are present near the 68k, Z80, and YM3438.
A 4.9152 MHz oscillator is near the video chips.
TODO:
- Inputs (inserting a coin freezes some of the text on screen, what's next?)
- Verify sound latch location on Tinker Bell vs. the comms games
- Bingo Party puts up a message about ROM version mismatch with the RAM and says to press the reset switch.
However, when this is done, the code simply locks up (BRA to itself) and doesn't initialize the RAM.
Network version notes:
Based on Caribbean Boule the following hardware setup is used:
- One X-Board (segaxbd.cpp) drives a large rear-projection monitor which all players view to see the main game progress.
- Multiple M1 boards ("satellite" board) for each player for them to view information privately.
- One 'link' board which connects everything together. The link board has audio hardware, a 68K, and a Z80 as
well as a huge bank of UARTS and toslink connectors, but no video. It's possible the main game logic runs
on the 'link' board.
Unfortunately we don't have any dumps of anything other than an M1 board right now.
Is this related to (or a component of?) bingoc.cpp, the EPR numbers are much lower there tho
so it's probably an earlier version of the same thing or one of the 'link' boards?
************************************************************************************************************/
#include "emu.h"
#include "cpu/m68000/m68000.h"
#include "cpu/z80/z80.h"
#include "video/segaic24.h"
#include "machine/315_5296.h"
#include "machine/gen_latch.h"
#include "machine/i8251.h"
#include "machine/mb8421.h"
#include "machine/nvram.h"
#include "machine/timer.h"
#include "sound/ymopn.h"
#include "emupal.h"
#include "screen.h"
#include "speaker.h"
namespace {
class systemm1_state : public driver_device
{
public:
systemm1_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag)
, m_maincpu(*this, "maincpu")
, m_soundcpu(*this, "soundcpu")
, m_commcpu(*this, "m1comm")
, m_screen(*this, "screen")
, m_tiles(*this, "tilemap")
, m_mixer(*this, "mixer")
, m_palette(*this, "palette")
, m_ym(*this, "ym3438")
, m_io1(*this, "io1")
, m_io2(*this, "io2")
, m_soundlatch(*this, "soundlatch")
{
}
void m1base(machine_config &config);
void m1comm(machine_config &config);
private:
u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
void mem_map(address_map &map);
void mem_comm_map(address_map &map);
void z80_map(address_map &map);
void z80_io_map(address_map &map);
void comm_map(address_map &map);
required_device<m68000_device> m_maincpu;
required_device<z80_device> m_soundcpu;
optional_device<z80_device> m_commcpu;
required_device<screen_device> m_screen;
required_device<segas24_tile_device> m_tiles;
required_device<segas24_mixer_device> m_mixer;
required_device<palette_device> m_palette;
required_device<ym3438_device> m_ym;
required_device<sega_315_5296_device> m_io1, m_io2;
required_device<generic_latch_8_device> m_soundlatch;
void machine_start() override;
u16 m_paletteram[0x4000 / sizeof(u16)];
u16 paletteram_r(offs_t offset);
void paletteram_w(offs_t offset, u16 data, u16 mem_mask);
void sound_bank_w(u8 data);
TIMER_DEVICE_CALLBACK_MEMBER(scan_irq);
struct layer_sort
{
layer_sort(segas24_mixer_device *_mixer) { mixer = _mixer; }
bool operator()(int l1, int l2)
{
static const int default_pri[12] = {0, 1, 2, 3, 4, 5, 6, 7, -4, -3, -2, -1};
int p1 = mixer->get_reg(l1) & 7;
int p2 = mixer->get_reg(l2) & 7;
if (p1 != p2)
{
return p1 - p2 < 0;
}
return default_pri[l2] - default_pri[l1] < 0;
}
segas24_mixer_device *mixer;
};
};
u32 systemm1_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
if (m_mixer->get_reg(13) & 1)
{
bitmap.fill(m_palette->black_pen());
return 0;
}
screen.priority().fill(0);
bitmap.fill(0, cliprect);
std::vector<int> order;
order.resize(12);
for (int i = 0; i < 12; i++)
{
order[i] = i;
}
std::sort(order.begin(), order.end(), layer_sort(m_mixer.target()));
int level = 0;
for (int i = 0; i < 12; i++)
{
if (order[i] < 8)
{
m_tiles->draw(screen, bitmap, cliprect, order[i], level, 0);
}
else
{
level++;
}
}
return 0;
}
TIMER_DEVICE_CALLBACK_MEMBER(systemm1_state::scan_irq)
{
const int scanline = param;
if (scanline == 384)
{
m_maincpu->set_input_line(M68K_IRQ_4, ASSERT_LINE);
}
else if (scanline == 0)
{
m_maincpu->set_input_line(M68K_IRQ_4, CLEAR_LINE);
}
}
u16 systemm1_state::paletteram_r(offs_t offset)
{
return m_paletteram[offset];
}
void systemm1_state::paletteram_w(offs_t offset, u16 data, u16 mem_mask)
{
int r, g, b;
COMBINE_DATA(m_paletteram + offset);
data = m_paletteram[offset];
r = (data & 0x00f) << 4;
if (data & 0x1000)
r |= 8;
g = data & 0x0f0;
if (data & 0x2000)
g |= 8;
b = (data & 0xf00) >> 4;
if (data & 0x4000)
b |= 8;
r |= r >> 5;
g |= g >> 5;
b |= b >> 5;
m_palette->set_pen_color(offset, rgb_t(r, g, b));
if (data & 0x8000)
{
r = 255 - 0.6 * (255 - r);
g = 255 - 0.6 * (255 - g);
b = 255 - 0.6 * (255 - b);
}
else
{
r = 0.6 * r;
g = 0.6 * g;
b = 0.6 * b;
}
m_palette->set_pen_color(offset + m_palette->entries() / 2, rgb_t(r, g, b));
}
void systemm1_state::mem_map(address_map &map)
{
map(0x000000, 0x07ffff).rom().region("maincpu", 0);
map(0x100000, 0x17ffff).rom().region("maincpu", 0x80000);
map(0xb00000, 0xb0ffff).rw(m_tiles, FUNC(segas24_tile_device::tile_r), FUNC(segas24_tile_device::tile_w));
map(0xb20000, 0xb20001).nopw(); // Horizontal split position (ABSEL)
map(0xb40000, 0xb40001).nopw(); // Scanline trigger position (XHOUT)
map(0xb60000, 0xb60001).nopw(); // Frame trigger position (XVOUT)
map(0xb70000, 0xb70001).nopw(); // Synchronization mode
map(0xb80000, 0xbfffff).rw(m_tiles, FUNC(segas24_tile_device::char_r), FUNC(segas24_tile_device::char_w));
map(0xc00000, 0xc01fff).rw(FUNC(systemm1_state::paletteram_r), FUNC(systemm1_state::paletteram_w)).share("paletteram");
map(0xc04000, 0xc0401f).rw(m_mixer, FUNC(segas24_mixer_device::read), FUNC(segas24_mixer_device::write));
map(0xe00000, 0xe0003f).rw(m_io1, FUNC(sega_315_5296_device::read), FUNC(sega_315_5296_device::write)).umask16(0x00ff);
map(0xe40000, 0xe40001).portr("DIP1");
map(0xe40005, 0xe40005).w(m_soundlatch, FUNC(generic_latch_8_device::write));
map(0xe80000, 0xe8003f).rw(m_io2, FUNC(sega_315_5296_device::read), FUNC(sega_315_5296_device::write)).umask16(0x00ff);
map(0xf00000, 0xf03fff).mirror(0x0fc000).ram().share("nvram");
}
void systemm1_state::mem_comm_map(address_map &map)
{
mem_map(map);
map(0x340000, 0x340fff).rw("dpram", FUNC(mb8421_device::right_r), FUNC(mb8421_device::right_w)).umask16(0x00ff);
map(0xe40000, 0xe40001).portr("INX");
map(0xe40002, 0xe40003).portr("INY");
map(0xe40008, 0xe40009).portr("INZ");
}
// Sound system is based on System 32, minus the 5C68, the second YM, and YM IRQs
void systemm1_state::z80_map(address_map &map)
{
map(0x0000, 0x9fff).rom().region("soundcpu", 0);
map(0xa000, 0xbfff).bankr("soundbank");
map(0xe000, 0xffff).ram();
}
void systemm1_state::z80_io_map(address_map &map)
{
map.global_mask(0xff);
map(0x80, 0x83).mirror(0x0c).rw(m_ym, FUNC(ym3438_device::read), FUNC(ym3438_device::write));
map(0xa0, 0xa0).w(FUNC(systemm1_state::sound_bank_w));
map(0xc0, 0xc0).r(m_soundlatch, FUNC(generic_latch_8_device::read));
}
void systemm1_state::machine_start()
{
membank("soundbank")->configure_entries(0x00, 0x10, memregion("soundcpu")->base(), 0x2000);
}
void systemm1_state::sound_bank_w(u8 data)
{
membank("soundbank")->set_entry(data & 0x0f);
}
void systemm1_state::comm_map(address_map &map)
{
map(0x0000, 0x7fff).rom();
map(0x8000, 0x9fff).ram();
map(0xa000, 0xa7ff).rw("dpram", FUNC(mb8421_device::left_r), FUNC(mb8421_device::left_w));
map(0xc000, 0xc001).rw("uart", FUNC(i8251_device::read), FUNC(i8251_device::write));
map(0xe003, 0xe003).nopw(); // ???
}
static INPUT_PORTS_START(tinkerbl)
PORT_START("PC")
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("Reset Switch") PORT_CODE(KEYCODE_F1)
PORT_DIPNAME( 0x01, 0x01, "DIPC1" )
PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x02, 0x02, "DIPC2" )
PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x04, 0x04, "DIPC3" )
PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x08, 0x08, "DIPC4" )
PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x10, 0x10, "DIPC5" )
PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x40, 0x40, "DIPC7" )
PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x80, 0x80, "DIPC8" )
PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_START("PB")
PORT_DIPNAME( 0x01, 0x01, "DIPB1" )
PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x02, 0x02, "DIPB2" )
PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x04, 0x04, "DIPB3" )
PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x08, 0x08, "DIPB4" )
PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x10, 0x10, "DIPB5" )
PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x20, 0x20, "DIPB6" )
PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x40, 0x40, "DIPB7" )
PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x80, 0x80, "DIPB8" )
PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_START("PD")
PORT_DIPNAME( 0x01, 0x01, "DIPD1" )
PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x02, 0x02, "DIPD2" )
PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x04, 0x04, "DIPD3" )
PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x08, 0x08, "DIPD4" )
PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x10, 0x10, "DIPD5" )
PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x20, 0x20, "DIPD6" )
PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_IMPULSE(1)
PORT_DIPNAME( 0x80, 0x80, "DIPD8" )
PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_START("PE")
PORT_DIPNAME( 0x01, 0x01, "DIPE1" )
PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x02, 0x02, "DIPE2" )
PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x04, 0x04, "DIPE3" )
PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x08, 0x08, "DIPE4" )
PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x10, 0x10, "DIPE5" )
PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x20, 0x20, "DIPE6" )
PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x40, 0x40, "DIPE7" )
PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x80, 0x80, "DIPE8" )
PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_START("PF")
PORT_DIPNAME( 0x01, 0x01, "DIPF1" )
PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x02, 0x02, "DIPF2" )
PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x04, 0x04, "DIPF3" )
PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x08, 0x08, "DIPF4" )
PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x10, 0x10, "DIPF5" )
PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x20, 0x20, "DIPF6" )
PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x40, 0x40, "DIPF7" )
PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x80, 0x80, "DIPF8" )
PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_START("DIP1")
PORT_DIPNAME( 0x01, 0x01, "DIP1-1" )
PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x02, 0x02, "DIP1-2" )
PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x04, 0x04, "DIP1-3" )
PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x08, 0x08, "DIP1-4" )
PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x10, 0x10, "DIP1-5" )
PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x20, 0x20, "DIP1-6" )
PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x40, 0x40, "DIP1-7" )
PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x80, 0x80, "DIP1-8" )
PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
INPUT_PORTS_END
static INPUT_PORTS_START(bingpty)
PORT_START("PC")
PORT_DIPNAME( 0x01, 0x01, "DIPC1" )
PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x02, 0x02, "DIPC2" )
PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x04, 0x04, "DIPC3" )
PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x08, 0x08, "DIPC4" )
PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x10, 0x10, "DIPC5" )
PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x20, 0x20, "DIPC6" )
PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x40, 0x40, "DIPC7" )
PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x80, 0x80, "DIPC8" )
PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_START("PB")
PORT_DIPNAME( 0x01, 0x01, "DIPB1" )
PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x02, 0x02, "DIPB2" )
PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x04, 0x04, "DIPB3" )
PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x08, 0x08, "DIPB4" )
PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x10, 0x10, "DIPB5" )
PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x20, 0x20, "DIPB6" )
PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x40, 0x40, "DIPB7" )
PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x80, 0x80, "DIPB8" )
PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_START("PD")
PORT_DIPNAME( 0x01, 0x01, "DIPD1" )
PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x02, 0x02, "DIPD2" )
PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x04, 0x04, "DIPD3" )
PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x08, 0x08, "DIPD4" )
PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x10, 0x10, "DIPD5" )
PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x20, 0x20, "DIPD6" )
PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN1 )
PORT_DIPNAME( 0x80, 0x80, "DIPD8" )
PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_START("PE")
PORT_DIPNAME( 0x01, 0x01, "DIPE1" )
PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x02, 0x02, "DIPE2" )
PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x04, 0x04, "DIPE3" )
PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x08, 0x08, "DIPE4" )
PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x10, 0x10, "DIPE5" )
PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x20, 0x20, "DIPE6" )
PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x40, 0x40, "DIPE7" )
PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x80, 0x80, "DIPE8" )
PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_START("PF")
PORT_DIPNAME( 0x01, 0x01, "DIPF1" )
PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x02, 0x02, "DIPF2" )
PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("Reset Switch") PORT_CODE(KEYCODE_F1)
PORT_DIPNAME( 0x08, 0x08, "DIPF4" )
PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x10, 0x10, "DIPF5" )
PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x20, 0x20, "DIPF6" )
PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x40, 0x40, "DIPF7" )
PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x80, 0x80, "DIPF8" )
PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_START("INX")
PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_START("INY")
PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_START("INZ")
PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED )
INPUT_PORTS_END
void systemm1_state::m1base(machine_config &config)
{
M68000(config, m_maincpu, 10'000'000);
m_maincpu->set_addrmap(AS_PROGRAM, &systemm1_state::mem_map);
Z80(config, m_soundcpu, 4'000'000);
m_soundcpu->set_addrmap(AS_PROGRAM, &systemm1_state::z80_map);
m_soundcpu->set_addrmap(AS_IO, &systemm1_state::z80_io_map);
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
m_screen->set_video_attributes(VIDEO_UPDATE_AFTER_VBLANK);
// TODO: from System 24, might not be accurate for System M1
m_screen->set_raw(XTAL(16'000'000), 656, 0 /*+69*/, 496 /*+69*/, 424, 0 /*+25*/, 384 /*+25*/);
m_screen->set_screen_update(FUNC(systemm1_state::screen_update));
TIMER(config, "scantimer").configure_scanline(FUNC(systemm1_state::scan_irq), m_screen, 0, 1);
PALETTE(config, m_palette).set_entries(8192);
S24TILE(config, m_tiles, 0, 0x3fff);
m_tiles->set_palette(m_palette);
S24MIXER(config, m_mixer, 0);
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
YM3438(config, m_ym, XTAL(8'000'000));
m_ym->add_route(0, "lspeaker", 0.40);
m_ym->add_route(1, "rspeaker", 0.40);
SEGA_315_5296(config, m_io1, XTAL(16'000'000));
m_io1->in_pb_callback().set_ioport("PB");
m_io1->in_pc_callback().set_ioport("PC");
m_io1->in_pd_callback().set_ioport("PD");
m_io1->in_pe_callback().set_ioport("PE");
m_io1->in_pf_callback().set_ioport("PF");
SEGA_315_5296(config, m_io2, XTAL(16'000'000));
GENERIC_LATCH_8(config, m_soundlatch);
m_soundlatch->data_pending_callback().set_inputline(m_soundcpu, INPUT_LINE_NMI);
m_soundlatch->set_separate_acknowledge(false);
}
void systemm1_state::m1comm(machine_config &config)
{
m1base(config);
m_maincpu->set_addrmap(AS_PROGRAM, &systemm1_state::mem_comm_map);
Z80(config, m_commcpu, 4'000'000); // unknown clock
m_commcpu->set_addrmap(AS_PROGRAM, &systemm1_state::comm_map);
I8251(config, "uart", 4000000); // unknown clock
mb8421_device &dpram(MB8421(config, "dpram"));
dpram.intl_callback().set_inputline("m1comm", 0);
}
ROM_START(tinkerbl)
ROM_REGION(0x100000, "maincpu", 0)
ROM_LOAD16_BYTE("epr-a13637.ic8", 0x000000, 0x040000, CRC(de270e16) SHA1(e77fedbd11a698b1f7ed03feec64204f712c3cad))
ROM_LOAD16_BYTE("epr-a13639.ic7", 0x000001, 0x040000, CRC(56ade038) SHA1(c807b63e1ff7cc9577dc45689ebc67ede396f7b6))
ROM_LOAD16_BYTE("epr-13638.ic10", 0x080000, 0x040000, CRC(5fb6b19e) SHA1(795bd5e31c3261f981b2fb0fce38d9b04d2031c2))
ROM_LOAD16_BYTE("epr-13640.ic9", 0x080001, 0x040000, CRC(afce4c2a) SHA1(b37e2e11c240d9679216410d8f004d566e053f52))
ROM_REGION(0x20000, "soundcpu", 0)
ROM_LOAD("epr-13641.ic104", 0x000000, 0x020000, CRC(13142c1b) SHA1(b24535a4ac75780d9a3e0bcbecf673a5701c8be8))
ROM_REGION(0x40000, "gals", 0)
ROM_LOAD("gal18v8a_315-5391.ic103", 0x000000, 0x040000, CRC(29480530) SHA1(d3d629fb4c2a4ae851f14b1d9e5b72b37b567f0b))
ROM_END
ROM_START( bingpty ) // 1994/05/01 string
ROM_REGION( 0x100000, "maincpu", 0 ) /* 68000 Code */
ROM_LOAD16_BYTE( "epr-16648b.bin", 0x00000, 0x20000, CRC(e4fceb4c) SHA1(0a248bb328d2f6d72d540baefbe62838f4b76585) )
ROM_LOAD16_BYTE( "epr-16649b.bin", 0x00001, 0x20000, CRC(736d8bbd) SHA1(c359ad513d4a7693cbb1a27ce26f89849e894d05) )
ROM_REGION( 0x20000, "soundcpu", 0 ) /* Z80 Code */
ROM_LOAD( "epr-14845.bin", 0x00000, 0x20000, CRC(90d47101) SHA1(7bc002c104e3dbde1986aaec54112d5658eab523) )
ROM_REGION( 0x8000, "m1comm", 0 ) /* Z80 Code */
ROM_LOAD( "epr-14221a.bin", 0x00000, 0x8000, CRC(a13e67a4) SHA1(4cd269c7f04a64ae7806c8784f86bf6553a25d85) )
// dumps of the X-Board part, and the LINK PCB are missing.
ROM_END
ROM_START( unkm1 ) // 1992.01.31 string
ROM_REGION( 0x100000, "maincpu", 0 ) /* 68000 Code */
ROM_LOAD16_BYTE( "epr-14427.ic8", 0x00000, 0x40000, CRC(2d904fc6) SHA1(7062f47d77d09906420118c85e1cb565bec345a7) )
ROM_LOAD16_BYTE( "epr-14428.ic7", 0x00001, 0x40000, CRC(97a317f4) SHA1(19bc4cf6b6c580caa44f36c929b445ed94b2d9eb) )
ROM_REGION( 0x20000, "soundcpu", 0 ) /* Z80 Code */
ROM_LOAD( "epr-14429.ic104", 0x00000, 0x20000, CRC(1ff8262d) SHA1(fb90bd877b2dc65eb3e5495d6e21dee1f871fb44) )
ROM_REGION( 0x8000, "m1comm", 0 )
ROM_LOAD( "epr-14426.ic2", 0x0000, 0x8000, NO_DUMP ) // on "SYSTEM M1 COM" board with Z80, MB8421 and TMP82C51AP
ROM_REGION( 0x100, "plds", 0 )
ROM_LOAD( "315-5472-01.ic22", 0x000, 0x0eb, CRC(828ee6e2) SHA1(f32dd0f6297cc8bd3049be4bca502c0f8ec738cf) )
// dumps of the X-Board part, and the LINK PCB are missing.
ROM_END
} // anonymous namespace
// Standalone M1 games
GAME(1990, tinkerbl, 0, m1base, tinkerbl, systemm1_state, empty_init, ROT0, "Sega", "Tinker Bell", MACHINE_NOT_WORKING)
// M1 comm multi-board games
GAME(1994, bingpty, 0, m1comm, bingpty, systemm1_state, empty_init, ROT0, "Sega", "Bingo Party Multicart (Rev B) (M1 Satellite board)", MACHINE_NOT_WORKING)
GAME(1992, unkm1, 0, m1comm, bingpty, systemm1_state, empty_init, ROT0, "Sega", "unknown Sega gambling game (M1 Satellite board)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND)

View File

@ -37872,10 +37872,6 @@ galaxyr // (c) 1983
galaxyrp // (c) 1983
sblazerp // (c) 1983
@source:segam1.cpp
bingpty // ?
unkm1 // ?
@source:segaorun.cpp
outrun // Revision B
outrunb // 1986 (protected beta bootleg)
@ -38248,6 +38244,11 @@ titlef // 1993.?? Title Fight (World)
titlefj // 1993.03 Title Fight (Japan)
titlefu // 1993.04 Title Fight (US)
@source:segasm1.cpp
tinkerbl // (c) 1990 Sega
unkm1 // (c) 1992 Sega
bingpty // (c) 1994 Sega
@source:segasp.cpp
aminosan // 2010.?? Aminosan (satellite)
bingogal // 2009.05 Bingo Galaxy (main)