summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author ajrhacker <ajrhacker@users.noreply.github.com>2020-03-18 18:46:05 -0400
committer GitHub <noreply@github.com>2020-03-18 18:46:05 -0400
commit8fbbb35a55111d2e9acbaa936677e9f322e7ad62 (patch)
tree0aa268e1afe9519a19aecef37f9dc107ede6ffde
parent0cc640b109f1f1e7ee95a96be7e23d4fdcaefff6 (diff)
parent93a3473cc75b929b76a07769233e915b5c399dc8 (diff)
Merge pull request #6457 from DavidHaywood/180320
new working clone
-rw-r--r--src/mame/drivers/segac2.cpp45
-rw-r--r--src/mame/machine/315_5296.cpp5
-rw-r--r--src/mame/machine/315_5296.h4
-rw-r--r--src/mame/mame.lst1
4 files changed, 44 insertions, 11 deletions
diff --git a/src/mame/drivers/segac2.cpp b/src/mame/drivers/segac2.cpp
index 851fec3629d..65fe28d0af1 100644
--- a/src/mame/drivers/segac2.cpp
+++ b/src/mame/drivers/segac2.cpp
@@ -110,12 +110,15 @@ public:
, m_upd7759(*this, "upd")
, m_screen(*this, "screen")
, m_palette(*this, "palette")
+ , m_io(*this, "io")
{
}
void segac2(machine_config &config);
void segac(machine_config &config);
+ void segac2_tfrceacjpb(machine_config &config);
+
void init_c2boot();
void init_bloxeedc();
void init_columns();
@@ -198,6 +201,7 @@ private:
optional_device<upd7759_device> m_upd7759;
optional_device<screen_device> m_screen;
required_device<palette_device> m_palette;
+ required_device<sega_315_5296_device> m_io;
int prot_func_dummy(int in);
int prot_func_columns(int in);
@@ -1597,15 +1601,15 @@ void segac2_state::segac(machine_config &config)
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1); // borencha requires 0xff fill or there is no sound (it lacks some of the init code of the borench set)
- sega_315_5296_device &io(SEGA_315_5296(config, "io", XL2_CLOCK/6)); // clock divider guessed
- io.in_pa_callback().set_ioport("P1");
- io.in_pb_callback().set_ioport("P2");
- io.in_pc_callback().set(FUNC(segac2_state::io_portc_r));
- io.out_pd_callback().set(FUNC(segac2_state::io_portd_w));
- io.in_pe_callback().set_ioport("SERVICE");
- io.in_pf_callback().set_ioport("COINAGE");
- io.in_pg_callback().set_ioport("DSW");
- io.out_ph_callback().set(FUNC(segac2_state::io_porth_w));
+ SEGA_315_5296(config, m_io, XL2_CLOCK/6); // clock divider guessed
+ m_io->in_pa_callback().set_ioport("P1");
+ m_io->in_pb_callback().set_ioport("P2");
+ m_io->in_pc_callback().set(FUNC(segac2_state::io_portc_r));
+ m_io->out_pd_callback().set(FUNC(segac2_state::io_portd_w));
+ m_io->in_pe_callback().set_ioport("SERVICE");
+ m_io->in_pf_callback().set_ioport("COINAGE");
+ m_io->in_pg_callback().set_ioport("DSW");
+ m_io->out_ph_callback().set(FUNC(segac2_state::io_porth_w));
/* video hardware */
SEGA315_5313(config, m_vdp, XL2_CLOCK, m_maincpu);
@@ -1653,6 +1657,12 @@ void segac2_state::segac2(machine_config &config)
UPD7759(config, m_upd7759, XL1_CLOCK).add_route(ALL_OUTPUTS, "mono", 0.50);
}
+void segac2_state::segac2_tfrceacjpb(machine_config& config)
+{
+ segac2(config);
+ m_io->set_ignore_read_direction();
+}
+
/******************************************************************************
@@ -1809,6 +1819,22 @@ ROM_START( tfrceacj ) /* Thunder Force AC (Japan) (c)1990 Technosoft / Sega - 8
ROM_LOAD( "epr-13655.ic4", 0x000000, 0x040000, CRC(e09961f6) SHA1(e109b5f41502b765d191f22e3bbcff97d6defaa1) )
ROM_END
+/* This set has significantly different code addresses to both the Genesis Thunder Force III and the arcade Thunder Force AC, and seems to sit somewhere between them
+ Some sources indicate it's a hack, but it might be a hack of an otherwise unsupported set, with the protection removed, for bootleggers to sell at a profit.
+ This specific dump was sourced from a PCB sold in Canada */
+ROM_START( tfrceacjpb ) // protection chip simply marked T-FORCE (not used outside of startup init?)
+ ROM_REGION( 0x200000, "maincpu", ROMREGION_ERASEFF )
+ ROM_LOAD16_BYTE( "ic32_t.f.ac_075f.ic32", 0x000000, 0x040000, CRC(2167dd93) SHA1(0e5b8eb87e07e6e5cecf096e6b62e15ff7406bba) )
+ ROM_LOAD16_BYTE( "ic31_t.f.ac_0d26.id31", 0x000001, 0x040000, CRC(ebf02bba) SHA1(effdc60837063ba04b7b4517e57a240b29a199e1) )
+ /* 0x080000 - 0x100000 Empty */
+ ROM_LOAD16_BYTE( "ic34_t.f.ac_549d.ic34", 0x100000, 0x040000, CRC(902ad2ec) SHA1(58db20ca5888110e97f80e7df9dac1b8e9817562) )
+ ROM_LOAD16_BYTE( "ic33_t.f.ac_d131.ic33", 0x100001, 0x040000, CRC(b162219d) SHA1(ad022307019b4a70cb532e1101cb5ed8d31f10e2) )
+
+ ROM_REGION( 0x040000, "upd", ROMREGION_ERASE00 )
+ // empty socket (not used)
+ROM_END
+
+
ROM_START( tfrceacb ) /* Thunder Force AC (Bootleg) (c)1990 Technosoft / Sega */
ROM_REGION( 0x200000, "maincpu", 0 )
@@ -2623,6 +2649,7 @@ GAME( 1990, column2j, columns2, segac, columns2, segac2_state, init_
GAME( 1990, tfrceac, 0, segac2, tfrceac, segac2_state, init_tfrceac, ROT0, "Technosoft / Sega", "Thunder Force AC", 0 )
GAME( 1990, tfrceacj, tfrceac, segac2, tfrceac, segac2_state, init_tfrceac, ROT0, "Technosoft / Sega", "Thunder Force AC (Japan)", 0 )
GAME( 1990, tfrceacb, tfrceac, segac2, tfrceac, segac2_state, init_tfrceacb, ROT0, "bootleg", "Thunder Force AC (bootleg)", 0 )
+GAME( 1990, tfrceacjpb,tfrceac, segac2_tfrceacjpb, tfrceac, segac2_state, init_tfrceac, ROT0, "Technosoft / Sega", "Thunder Force AC (Japan, prototype, bootleg)", 0 )
GAME( 1990, borench, 0, segac2, borench, segac2_state, init_borench, ROT0, "Sega", "Borench (set 1)", 0 )
GAME( 1990, borencha, borench, segac2, borench, segac2_state, init_borench, ROT0, "Sega", "Borench (set 2)", 0 )
diff --git a/src/mame/machine/315_5296.cpp b/src/mame/machine/315_5296.cpp
index dbea5edf2d7..52ddf998d40 100644
--- a/src/mame/machine/315_5296.cpp
+++ b/src/mame/machine/315_5296.cpp
@@ -36,7 +36,8 @@ sega_315_5296_device::sega_315_5296_device(const machine_config &mconfig, const
device_t(mconfig, SEGA_315_5296, tag, owner, clock),
m_in_port_cb(*this),
m_out_port_cb(*this),
- m_out_cnt_cb(*this)
+ m_out_cnt_cb(*this),
+ m_ignore_read_direction(false)
{
}
@@ -88,7 +89,7 @@ READ8_MEMBER( sega_315_5296_device::read )
// port A to H
case 0x0: case 0x1: case 0x2: case 0x3: case 0x4: case 0x5: case 0x6: case 0x7:
// if the port is configured as an output, return the last thing written
- if (m_dir & 1 << offset)
+ if ((m_dir & 1 << offset) && (m_ignore_read_direction == false))
return m_output_latch[offset];
// otherwise, return an input port
diff --git a/src/mame/machine/315_5296.h b/src/mame/machine/315_5296.h
index 8715d006436..c3cc2172de9 100644
--- a/src/mame/machine/315_5296.h
+++ b/src/mame/machine/315_5296.h
@@ -47,6 +47,8 @@ public:
auto out_cnt1_callback() { return m_out_cnt_cb[1].bind(); }
auto out_cnt2_callback() { return m_out_cnt_cb[2].bind(); }
+ void set_ignore_read_direction() { m_ignore_read_direction = true; }
+
DECLARE_READ8_MEMBER(read);
DECLARE_WRITE8_MEMBER(write);
@@ -65,6 +67,8 @@ private:
uint8_t m_output_latch[8];
uint8_t m_cnt;
uint8_t m_dir;
+
+ bool m_ignore_read_direction;
};
// device type definition
diff --git a/src/mame/mame.lst b/src/mame/mame.lst
index 00a2a2e1979..3d008905d32 100644
--- a/src/mame/mame.lst
+++ b/src/mame/mame.lst
@@ -35526,6 +35526,7 @@ tantrkor // (c) 1992 Sega
tfrceac // (c) 1990 Sega / Technosoft
tfrceacb // bootleg
tfrceacj // (c) 1990 Sega / Technosoft
+tfrceacjpb // prototype / bootleg
twinsqua // (c) 1991 Sega
wwmarine // (c) 1992 Sega
zunkyou // (c) 1994 Sega