Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
161 changes: 104 additions & 57 deletions src/mame/sega/model2.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,8 @@ void model2_state::machine_start()
// initialize custom debugger pool, @see machine/model2.cpp
debug_init();

m_lamps.resolve();

save_item(NAME(m_intreq));
save_item(NAME(m_intena));
save_item(NAME(m_coproctl));
Expand Down Expand Up @@ -1173,45 +1175,93 @@ u8 model2_state::lightgun_offscreen_r(offs_t offset)
// OUTPUTS
//**************************************************************************

void model2o_state::daytona_output_w(u8 data)
{
// 7------- leader led
// -6------ vr4 led
// --5----- vr3 led
// ---4---- vr2 led
// ----3--- vr1 led
// -----2-- start led
// ------1- coin counter 2
// -------0 coin counter 1

machine().bookkeeping().coin_counter_w(1, BIT(data, 1));
machine().bookkeeping().coin_counter_w(0, BIT(data, 0));
}
/*
Daytona
7------- leader lamp
-6------ vr4 lamp
--5----- vr3 lamp
---4---- vr2 lamp
----3--- vr1 lamp
-----2-- start lamp
------1- coin counter 2
-------0 coin counter 1
Desert
7------- cannon motor
-6------ machine gun motor
--5----- vr1 lamp
---4---- vr2 lamp
----3--- vr3 lamp
-----2-- start lamp
------1- coin counter 2
-------0 coin counter 1
Vcop
7654---- unknown (not used?)
----32-- start lamps (always set together)
------1- coin counter 2
-------0 coin counter 1
Srallyc
7------- leader lamp
-6------ unknown
--5----- vr lamp
---4---- unknown
----3--- unknown
-----2-- start lamp
------1- coin counter 2
-------0 coin counter 1
STCC
7------- unknown
-6------ unknown
--5----- view 2 (zoom out) lamp
---4---- view 1 (zoom in) lamp
----3--- rev max lamp
-----2-- start lamp
------1- coin counter 2
-------0 coin counter 1
Indy500
7------- race leader lamp
-6------ unknown
--5----- view 2 (zoom out) lamp
---4---- view 1 (zoom in) lamp
----3--- unknown
-----2-- start lamp
------1- coin counter 2
-------0 coin counter 1
Overrev
7------- unknown
-6------ unknown
--5----- view 2 lamp
---4---- view 1 lamp
----3--- unknown
-----2-- start lamp
------1- coin counter 2
-------0 coin counter 1
Sgt24h
7------- unknown
-6------ unknown
--5----- view 2 lamp
---4---- view 1 lamp
----3--- unknown
-----2-- start lamp
------1- coin counter 2
-------0 coin counter 1
*/

void model2o_state::desert_output_w(u8 data)
void model2_state::lamp_output_w(u8 data)
{
// 7------- cannon motor
// -6------ machine gun motor
// --5----- vr1
// ---4---- vr2
// ----3--- vr3
// -----2-- start
// ------1- coin counter 2
// -------0 coin counter 1

machine().bookkeeping().coin_counter_w(1, BIT(data, 1));
// Coin counters
machine().bookkeeping().coin_counter_w(0, BIT(data, 0));
}

void model2o_state::vcop_output_w(u8 data)
{
// 7654---- unknown (not used?)
// ----32-- start leds (always set together)
// ------1- coin counter 2
// -------0 coin counter 1
machine().bookkeeping().coin_counter_w(1, BIT(data, 1));

machine().bookkeeping().coin_counter_w(1, BIT(~data, 1));
machine().bookkeeping().coin_counter_w(0, BIT(~data, 0));
// Lamps (bits 2–7)
for (int i = 0; i < 6; i++)
m_lamps[i] = BIT(data, i + 2);
}


Expand Down Expand Up @@ -1528,7 +1578,8 @@ void model2_state::rchase2_drive_board_w(u8 data)
void model2_state::drive_board_w(u8 data)
{
m_driveio_comm_data = data;
m_drivecpu->set_input_line(0, HOLD_LINE);
if (m_drivecpu)
m_drivecpu->set_input_line(0, HOLD_LINE);
}


Expand Down Expand Up @@ -1569,12 +1620,11 @@ u8 model2_state::in0_r()
ioport_value model2_state::daytona_gearbox_r()
{
u8 res = m_gears.read_safe(0);
int i;
const u8 gearvalue[5] = { 0, 2, 1, 6, 5 };

for(i=0;i<5;i++)
for (int i = 0; i < 5; i++)
{
if(res & 1<<i)
if (BIT(res, i))
{
m_gearsel = i;
return gearvalue[i];
Expand Down Expand Up @@ -2623,7 +2673,7 @@ void model2o_state::daytona(machine_config &config)
ioboard.an_callback<0>().set_ioport("STEER");
ioboard.an_callback<1>().set_ioport("ACCEL");
ioboard.an_callback<2>().set_ioport("BRAKE");
ioboard.output_callback().set(FUNC(model2o_state::daytona_output_w));
ioboard.output_callback().set(FUNC(model2_state::lamp_output_w));
}

void model2o_maxx_state::daytona_maxx(machine_config &config)
Expand All @@ -2648,7 +2698,7 @@ void model2o_state::desert(machine_config &config)
ioboard.an_callback<0>().set_ioport("STEER");
ioboard.an_callback<1>().set_ioport("ACCEL");
ioboard.an_callback<2>().set_ioport("BRAKE");
ioboard.output_callback().set(FUNC(model2o_state::desert_output_w));
ioboard.output_callback().set(FUNC(model2_state::lamp_output_w));
}

void model2o_state::vcop(machine_config &config)
Expand All @@ -2662,7 +2712,7 @@ void model2o_state::vcop(machine_config &config)
ioboard.in_callback<0>().set_ioport("IN0");
ioboard.in_callback<1>().set_ioport("IN1");
ioboard.in_callback<2>().set_ioport("IN2");
ioboard.output_callback().set(FUNC(model2o_state::vcop_output_w));
ioboard.output_callback().set(FUNC(model2_state::lamp_output_w));
ioboard.set_lightgun_p1x_tag("P1_X");
ioboard.set_lightgun_p1y_tag("P1_Y");
ioboard.set_lightgun_p2x_tag("P2_X");
Expand Down Expand Up @@ -2696,6 +2746,7 @@ void model2a_state::model2a(machine_config &config)
io.in_pd_callback().set_ioport("IN2");
io.in_pg_callback().set_ioport("SW");
io.out_pe_callback().set([this] (u8 data) { m_billboard->write(data); });
io.out_pf_callback().set(FUNC(model2_state::lamp_output_w));

model2_timers(config);
model2_screen(config);
Expand Down Expand Up @@ -2748,6 +2799,7 @@ void model2a_state::srallyc(machine_config &config)

sega_315_5649_device &io(*subdevice<sega_315_5649_device>("io"));
io.out_pe_callback().set(FUNC(model2a_state::drive_board_w));
io.out_pf_callback().set(FUNC(model2_state::lamp_output_w));
io.an_port_callback<0>().set_ioport("STEER");
io.an_port_callback<1>().set_ioport("ACCEL");
io.an_port_callback<2>().set_ioport("BRAKE");
Expand All @@ -2773,8 +2825,8 @@ void model2a_state::skytargt(machine_config &config)

u16 model2_state::crypt_read_callback(u32 addr)
{
u16 dat= m_maincpu->space().read_word((0x1d80000+2*addr));
return ((dat&0xff00)>>8)|((dat&0x00ff)<<8);
u16 dat= m_maincpu->space().read_word((0x1d80000 + 2*addr));
return ((dat & 0xff00) >> 8) | ((dat & 0x00ff) << 8);
}

void model2a_state::model2a_5881(machine_config &config)
Expand Down Expand Up @@ -2831,6 +2883,7 @@ void model2b_state::model2b(machine_config &config)
io.in_pd_callback().set_ioport("IN2");
io.in_pg_callback().set_ioport("SW");
io.out_pe_callback().set([this] (u8 data) { m_billboard->write(data); });
io.out_pf_callback().set(FUNC(model2_state::lamp_output_w));

model2_timers(config);
model2_screen(config);
Expand Down Expand Up @@ -2868,16 +2921,7 @@ void model2b_state::indy500(machine_config &config)
model2b(config);

sega_315_5649_device &io(*subdevice<sega_315_5649_device>("io"));
io.an_port_callback<0>().set_ioport("STEER");
io.an_port_callback<1>().set_ioport("ACCEL");
io.an_port_callback<2>().set_ioport("BRAKE");
}

void model2b_state::overrev2b(machine_config &config)
{
model2b(config);

sega_315_5649_device &io(*subdevice<sega_315_5649_device>("io"));
io.out_pe_callback().set(FUNC(model2b_state::drive_board_w));
io.an_port_callback<0>().set_ioport("STEER");
io.an_port_callback<1>().set_ioport("ACCEL");
io.an_port_callback<2>().set_ioport("BRAKE");
Expand Down Expand Up @@ -2979,6 +3023,7 @@ void model2c_state::model2c(machine_config &config)
io.in_pc_callback().set_ioport("IN1");
io.in_pd_callback().set_ioport("IN2");
io.in_pg_callback().set_ioport("SW");
io.out_pf_callback().set(FUNC(model2_state::lamp_output_w));

model2_timers(config);
model2_screen(config);
Expand All @@ -3001,6 +3046,7 @@ void model2c_state::stcc(machine_config &config)
model2c(config);

sega_315_5649_device &io(*subdevice<sega_315_5649_device>("io"));
io.out_pf_callback().set(FUNC(model2_state::lamp_output_w));
io.an_port_callback<0>().set_ioport("STEER");
io.an_port_callback<1>().set_ioport("ACCEL");
io.an_port_callback<2>().set_ioport("BRAKE");
Expand Down Expand Up @@ -3058,6 +3104,7 @@ void model2c_state::overrev2c(machine_config &config)
model2c(config);

sega_315_5649_device &io(*subdevice<sega_315_5649_device>("io"));
io.out_pf_callback().set(FUNC(model2_state::lamp_output_w));
io.an_port_callback<0>().set_ioport("STEER");
io.an_port_callback<1>().set_ioport("ACCEL");
io.an_port_callback<2>().set_ioport("BRAKE");
Expand Down Expand Up @@ -7580,14 +7627,14 @@ GAME( 1996, lastbrnxu, lastbrnx, model2b, vf2, model2b_state, empty_
GAME( 1996, lastbrnxj, lastbrnx, model2b, vf2, model2b_state, empty_init, ROT0, "Sega", "Last Bronx: Tokyo Bangaichi (Japan, Revision A)", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_GRAPHICS )
GAME( 1996, doa, 0, model2b_0229, doa, model2b_state, init_doa, ROT0, "Tecmo", "Dead or Alive (Model 2B, Revision C)", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_GRAPHICS ) // Jan 10 1997
GAME( 1996, doab, doa, model2b_0229, doa, model2b_state, init_doa, ROT0, "Tecmo", "Dead or Alive (Model 2B, Revision B)", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_GRAPHICS ) // Dec 4 1996
GAME( 1996, sgt24h, 0, overrev2b, sgt24h, model2b_state, init_sgt24h, ROT0, "Jaleco", "Super GT 24h", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_GRAPHICS )
GAME( 1996, sgt24h, 0, indy500, sgt24h, model2b_state, init_sgt24h, ROT0, "Jaleco", "Super GT 24h", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_GRAPHICS )
GAME( 1996, powsled, 0, powsled, powsled, model2b_state, empty_init, ROT0, "Sega", "Power Sled (Slave, Revision A)", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_GRAPHICS )
GAME( 1996, powsledr, powsled, powsled, powsled, model2b_state, empty_init, ROT0, "Sega", "Power Sled (Relay, Revision A)", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_GRAPHICS )
GAME( 1996, powsledm, powsled, powsled, powsled, model2b_state, init_powsledm, ROT0, "Sega", "Power Sled (Main, hack of Relay)", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_GRAPHICS )
GAME( 1996, dynabb, 0, dynabb, dynabb, model2b_state, empty_init, ROT0, "Sega", "Dynamite Baseball", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_GRAPHICS )
GAME( 1997, dynabb97, 0, dynabb, dynabb, model2b_state, empty_init, ROT0, "Sega", "Dynamite Baseball 97 (Revision A)", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_GRAPHICS )
GAME( 1997, overrevb, overrev, overrev2b, overrev, model2b_state, empty_init, ROT0, "Jaleco", "Over Rev (Model 2B, Revision B)", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_GRAPHICS )
GAME( 1997, overrevba, overrev, overrev2b, overrev, model2b_state, empty_init, ROT0, "Jaleco", "Over Rev (Model 2B, Revision A)", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_GRAPHICS )
GAME( 1997, overrevb, overrev, indy500, overrev, model2b_state, empty_init, ROT0, "Jaleco", "Over Rev (Model 2B, Revision B)", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_GRAPHICS )
GAME( 1997, overrevba, overrev, indy500, overrev, model2b_state, empty_init, ROT0, "Jaleco", "Over Rev (Model 2B, Revision A)", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_GRAPHICS )
GAME( 1997, zerogun, 0, zerogun, zerogun, model2b_state, init_zerogun, ROT0, "Psikyo", "Zero Gunner (Export, Model 2B)", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_GRAPHICS )
GAME( 1997, zerogunj, zerogun, zerogun, zerogun, model2b_state, init_zerogun, ROT0, "Psikyo", "Zero Gunner (Japan, Model 2B)", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_GRAPHICS )
GAME( 1998, dynamcopb, dynamcop, model2b_5881, dynamcop, model2b_state, empty_init, ROT0, "Sega", "Dynamite Cop (Export, Model 2B)", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_GRAPHICS )
Expand Down
8 changes: 5 additions & 3 deletions src/mame/sega/model2.h
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,8 @@ class model2_state : public driver_device
m_copro_data(*this, "copro_data"),
m_in0(*this, "IN0"),
m_gears(*this, "GEARS"),
m_lightgun_ports(*this, {"P1_Y", "P1_X", "P2_Y", "P2_X"})
m_lightgun_ports(*this, {"P1_Y", "P1_X", "P2_Y", "P2_X"}),
m_lamps(*this, "lamp%u", 0U)
{ }

/* Public for access by the rendering functions */
Expand Down Expand Up @@ -101,6 +102,7 @@ class model2_state : public driver_device
void init_sgt24h();
void init_srallyc();
void init_powsledm();
void lamp_output_w(u8 data);

protected:
virtual void machine_start() override ATTR_COLD;
Expand Down Expand Up @@ -135,7 +137,8 @@ class model2_state : public driver_device
required_ioport m_in0;
optional_ioport m_gears;
optional_ioport_array<4> m_lightgun_ports;

output_finder<6> m_lamps;

u32 m_timervals[4]{};
u32 m_timerorig[4]{};
int m_timerrun[4]{};
Expand Down Expand Up @@ -525,7 +528,6 @@ class model2b_state : public model2_state
void model2b_0229(machine_config &config);
void model2b_5881(machine_config &config);
void indy500(machine_config &config);
void overrev2b(machine_config &config);
void powsled(machine_config &config);
void rchase2(machine_config &config);
void gunblade(machine_config &config);
Expand Down
Loading