summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame
diff options
context:
space:
mode:
author smf- <smf-@users.noreply.github.com>2021-10-24 12:36:58 +0100
committer smf- <smf-@users.noreply.github.com>2021-10-24 12:38:15 +0100
commitd61685943cc278441443a296f4c747663ca92f40 (patch)
treeb1db4e546cb953d7fb07d19f35373ec5914347ae /src/mame
parent5a9ea65c0e1195be609f0dab001ee759e6e0e594 (diff)
Machines promoted to working
---------------------------- Monster Zero (set 1) [smf, Dillweed] New working clones ------------------ Monster Zero (set 2) [Dillweed]
Diffstat (limited to 'src/mame')
-rw-r--r--src/mame/drivers/galaxian.cpp156
-rw-r--r--src/mame/includes/galaxian.h40
-rw-r--r--src/mame/mame.lst1
3 files changed, 125 insertions, 72 deletions
diff --git a/src/mame/drivers/galaxian.cpp b/src/mame/drivers/galaxian.cpp
index 6747efeb852..a37db7fcf49 100644
--- a/src/mame/drivers/galaxian.cpp
+++ b/src/mame/drivers/galaxian.cpp
@@ -1059,56 +1059,27 @@ void taiyo_sfx_state::sample_control_w(uint8_t data)
*
*************************************/
-/* Preliminary protection notes (based on z80 disasm):
-
- The initial protection routine is on the maincpu at $c591-$c676.
- It accesses the 8255, expects an irq, and reads $d800 256 times which is xored against data
- starting at $0100 to confirm a checksum stored in $0011-$0019. Then it reads the (presumably)same
- block to store it in RAM at $3800-$3fff. 9 blocks in total.
- It is presumed that this data comes from another ROM, and scrambled/encrypted a bit.
- The data(code) in the extra RAM is later jumped/called to in many parts of the game.
-*/
-
-uint8_t taiyo_sfx_state::monsterz_protection_r()
+void monsterz_state::monsterz_ay8910_w(offs_t offset, uint8_t data)
{
- return m_protection_result;
+ if (offset & 0x04) m_dac2->write(data);
+ galaxian_state::konami_ay8910_w(offset, data);
}
-
-void taiyo_sfx_state::monsterz_set_latch()
+void monsterz_state::machine_start()
{
- // read from a rom (which one?? "a-3e.k3" from audiocpu ($2700-$2fff) looks very suspicious)
- uint8_t *rom = memregion("audiocpu")->base();
- m_protection_result = rom[0x2000 | (m_protection_state & 0x1fff)]; // probably needs a bitswap<8>
-
- // and an irq on the main z80 afterwards
- m_maincpu->set_input_line(0, HOLD_LINE );
-}
+ taiyo_sfx_state::machine_start();
+ m_monsterz_shift = 0x00;
+ m_monsterz_shift2 = 0x00;
+ m_monsterz_audio_portb = 0xff;
+ m_monsterz_sample_portc = 0xff;
-void taiyo_sfx_state::monsterz_porta_1_w(uint8_t data)
-{
- // d7 high: set latch + advance address high bits (and reset low bits?)
- if (data & 0x80)
- {
- monsterz_set_latch();
- m_protection_state = (m_protection_state + 0x100) & 0xff00;
- }
+ save_item(NAME(m_monsterz_shift));
+ save_item(NAME(m_monsterz_shift2));
+ save_item(NAME(m_monsterz_audio_portb));
+ save_item(NAME(m_monsterz_sample_portc));
}
-void taiyo_sfx_state::monsterz_portb_1_w(uint8_t data)
-{
- // d3 high: set latch + advance address low bits
- if (data & 0x08)
- {
- monsterz_set_latch();
- m_protection_state = ((m_protection_state + 1) & 0x00ff) | (m_protection_state & 0xff00);
- }
-}
-
-void taiyo_sfx_state::monsterz_portc_1_w(uint8_t data)
-{
-}
/*************************************
*
@@ -2392,7 +2363,7 @@ void taiyo_sfx_state::sfx_map(address_map &map)
}
-void taiyo_sfx_state::monsterz_map(address_map &map)
+void monsterz_state::monsterz_map(address_map &map)
{
map(0x0000, 0x37ff).rom();
map(0x3800, 0x3fff).ram(); // extra RAM used by protection
@@ -2407,9 +2378,10 @@ void taiyo_sfx_state::monsterz_map(address_map &map)
map(0x6805, 0x6805).mirror(0x07f8).w(FUNC(taiyo_sfx_state::scramble_background_green_w));
map(0x6806, 0x6806).mirror(0x07f8).w(FUNC(taiyo_sfx_state::galaxian_flip_screen_x_w));
map(0x6807, 0x6807).mirror(0x07f8).w(FUNC(taiyo_sfx_state::galaxian_flip_screen_y_w));
+ map(0x7000, 0x7000).nopr(); // watchdog?
map(0x8000, 0xbfff).rw(FUNC(taiyo_sfx_state::theend_ppi8255_r), FUNC(taiyo_sfx_state::theend_ppi8255_w));
map(0xc000, 0xd7ff).rom();
- map(0xd800, 0xd800).r(FUNC(taiyo_sfx_state::monsterz_protection_r));
+ map(0xd800, 0xdfff).lr8(NAME([this]() { return bitswap<8>(m_monsterz_shift ^ 0x40050, 7, 18, 0, 1, 4, 6, 5, 3); }));
}
@@ -2719,12 +2691,26 @@ void galaxian_state::konami_sound_portmap(address_map &map)
map(0x00, 0xff).rw(FUNC(galaxian_state::konami_ay8910_r), FUNC(galaxian_state::konami_ay8910_w));
}
-void taiyo_sfx_state::monsterz_sound_map(address_map &map)
+void monsterz_state::monsterz_sound_map(address_map &map)
{
konami_sound_map(map);
- map(0x0000, 0x3fff).rom().region("audiocpu", 0); // sound board has space for extra ROM
+ map(0x0000, 0x4fff).rom().region("audiocpu", 0); // sound board has space for extra ROM
+ map(0xd000, 0xd000).lr8(NAME([this]() { return bitswap<8>(m_monsterz_shift2 ^ 0x188, 14, 5, 8, 3, 7, 4, 2, 1); }));
+ map(0xd000, 0xd000).lw8(NAME([this](uint8_t data) { m_monsterz_shift = (m_monsterz_shift << 8) | data; }));
+}
+
+void monsterz_state::monsterz_sound_portmap(address_map& map)
+{
+ map.global_mask(0xff);
+ map(0x00, 0xff).rw(FUNC(galaxian_state::konami_ay8910_r), FUNC(monsterz_state::monsterz_ay8910_w));
}
+void monsterz_state::monsterz_sample_map(address_map& map)
+{
+ sfx_sample_map(map);
+ map(0x4000, 0x5fff).unmaprw();
+ map(0x4000, 0x4000).lw8(NAME([this](uint8_t data) { m_monsterz_shift2 = (m_monsterz_shift2 << 8) | data; }));
+}
// Checkman with 1 x AY-8910A
@@ -7887,19 +7873,34 @@ void taiyo_sfx_state::sfx(machine_config &config)
}
-void taiyo_sfx_state::monsterz(machine_config &config)
+void monsterz_state::monsterz(machine_config &config)
{
sfx(config);
// alternate memory map
- m_maincpu->set_addrmap(AS_PROGRAM, &taiyo_sfx_state::monsterz_map);
- m_audiocpu->set_addrmap(AS_PROGRAM, &taiyo_sfx_state::monsterz_sound_map);
+ m_maincpu->set_addrmap(AS_PROGRAM, &monsterz_state::monsterz_map);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &monsterz_state::monsterz_sound_map);
+ m_audiocpu->set_addrmap(AS_IO, &monsterz_state::monsterz_sound_portmap);
+ m_audio2->set_addrmap(AS_PROGRAM, &monsterz_state::monsterz_sample_map);
+
+ m_ay8910[0]->port_b_write_callback().set([this](uint8_t data)
+ {
+ if ((m_monsterz_audio_portb & 0x01) && !(data & 0x01))
+ m_maincpu->set_input_line(0, HOLD_LINE);
+ m_monsterz_audio_portb = data;
+ });
+
+ m_ppi8255[2]->out_pc_callback().set([this](uint8_t data)
+ {
+ if ((m_monsterz_sample_portc & 0x01) && !(data & 0x01))
+ m_audiocpu->set_input_line(0, HOLD_LINE);
+ m_monsterz_sample_portc = data;
+ });
- m_ppi8255[1]->out_pa_callback().set(FUNC(taiyo_sfx_state::monsterz_porta_1_w));
- m_ppi8255[1]->out_pb_callback().set(FUNC(taiyo_sfx_state::monsterz_portb_1_w));
- m_ppi8255[1]->out_pc_callback().set(FUNC(taiyo_sfx_state::monsterz_portc_1_w));
+ m_screen->set_raw(GALAXIAN_PIXEL_CLOCK, GALAXIAN_HTOTAL, GALAXIAN_HBEND + 3 * 8 * GALAXIAN_XSCALE, GALAXIAN_HBSTART - 2 * 8 * GALAXIAN_XSCALE, GALAXIAN_VTOTAL, GALAXIAN_VBEND, GALAXIAN_VBSTART);
- // there are likely other differences too, but those can wait until after protection is sorted out
+ /* DAC for the sample player */
+ DAC_8BIT_R2R(config, m_dac2, 0).add_route(ALL_OUTPUTS, "speaker", 1.0); // TODO: check dac type
}
@@ -14317,19 +14318,18 @@ ROM_START( monsterz )
ROM_LOAD( "b-6e.h1", 0xd000, 0x1000, CRC(77d7aa8d) SHA1(62aaf582ba55f7b21f6cf13b4fb6c2c54bb729f5) )
ROM_REGION( 0x10000, "audiocpu", 0 )
+ ROM_LOAD( "a-5e.k5", 0x0000, 0x1000, CRC(b5bcdb4e) SHA1(db0965e5636e0f4e9cd4f4a7d808c413ecf733db) )
+ ROM_LOAD( "a-6.k6", 0x1000, 0x1000, CRC(24832b2e) SHA1(2a67888e86ce1a3182303e841513ba2a07977359) )
+ ROM_LOAD( "a-7e.k7", 0x2000, 0x1000, CRC(20ebea81) SHA1(473c688365b256d8593663ff95768f4a5bb1289d) )
+ ROM_LOAD( "a-8.k8", 0x3000, 0x1000, CRC(b833a15b) SHA1(0d21aaa0ca5ccba89118b205a6b3b36b15663c47) )
+ ROM_LOAD( "a-9.k9", 0x4000, 0x1000, CRC(cbd76ec2) SHA1(9434350ee93ca71efe78018b69913386353306ff) )
+
+ ROM_REGION( 0x10000, "audio2", 0 )
ROM_LOAD( "a-1e.k1", 0x0000, 0x1000, CRC(b88ba44e) SHA1(85c141fb411d541b1e20412f5fefd18395f635ae) )
ROM_LOAD( "a-2.k2", 0x1000, 0x1000, CRC(8913c94e) SHA1(6c4fe065217a234d45761f8ad4d2c4e7078a0abd) )
ROM_LOAD( "a-3e.k3", 0x2000, 0x1000, CRC(a8fa5095) SHA1(5cabe5497a79a0c43e78a84ae87c824af60a2a3f) )
ROM_LOAD( "a-4.k4", 0x3000, 0x1000, CRC(93f81317) SHA1(167708be94cb9a47290067a20bc5ff6f018b93b6) )
- ROM_REGION( 0x10000, "audio2", 0 )
- ROM_LOAD( "a-5e.k5", 0x0000, 0x1000, CRC(b5bcdb4e) SHA1(db0965e5636e0f4e9cd4f4a7d808c413ecf733db) )
- ROM_LOAD( "a-6.k6", 0x1000, 0x1000, CRC(24832b2e) SHA1(2a67888e86ce1a3182303e841513ba2a07977359) )
- ROM_LOAD( "a-7e.k7", 0x2000, 0x1000, CRC(20ebea81) SHA1(473c688365b256d8593663ff95768f4a5bb1289d) )
- // 0x3000 empty ?
- ROM_LOAD( "a-8.k8", 0x4000, 0x1000, CRC(b833a15b) SHA1(0d21aaa0ca5ccba89118b205a6b3b36b15663c47) )
- ROM_LOAD( "a-9.k9", 0x5000, 0x1000, CRC(cbd76ec2) SHA1(9434350ee93ca71efe78018b69913386353306ff) )
-
ROM_REGION( 0x2000, "gfx1", 0 )
ROM_LOAD( "b-7e.a5", 0x0000, 0x1000, CRC(ddd4158d) SHA1(9701e2d8a0226455dfbed650e58bb4be05918fe8) )
ROM_LOAD( "b-8e.c5", 0x1000, 0x1000, CRC(b1331b4c) SHA1(fa1af406ecd6919b4846aea68d3edb70106f9273) )
@@ -14339,6 +14339,37 @@ ROM_START( monsterz )
ROM_END
+ROM_START( monsterza )
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD( "b-1.a1", 0x0000, 0x1000, CRC(97886542) SHA1(01f4f9bd55f9eae28162cbb22a26f7cda22cd3f3) )
+ ROM_LOAD( "b-2.b1", 0x1000, 0x1000, CRC(184ffcb4) SHA1(829d6ca13773aba7c3a81e122171befbe3666110) )
+ ROM_LOAD( "b-3.c1", 0x2000, 0x1000, CRC(b7b10ac7) SHA1(51d544d4db456df756a95d7f1853fffed9259647) )
+ ROM_LOAD( "b-4.e1", 0x3000, 0x1000, CRC(fb02c736) SHA1(24466116dd07b856b1afff62b8312c67ff466b95) )
+ ROM_LOAD( "b-5.f1", 0xc000, 0x1000, CRC(43be6f5b) SHA1(18fe89839187de7aa76597d391677b45521d679d) )
+ ROM_LOAD( "b-6.k1", 0xd000, 0x1000, CRC(a21ae2f6) SHA1(71695265de1fcb635d4260ccb129b652f003a7d2) )
+
+ ROM_REGION( 0x10000, "audiocpu", 0 )
+ ROM_LOAD( "a-5.kj5", 0x0000, 0x1000, CRC(b5bcdb4e) SHA1(db0965e5636e0f4e9cd4f4a7d808c413ecf733db) )
+ ROM_LOAD( "a-6.kj6", 0x1000, 0x1000, CRC(24832b2e) SHA1(2a67888e86ce1a3182303e841513ba2a07977359) )
+ ROM_LOAD( "a-7.kj7", 0x2000, 0x1000, CRC(20ebea81) SHA1(473c688365b256d8593663ff95768f4a5bb1289d) )
+ ROM_LOAD( "a-8.kj8", 0x3000, 0x1000, CRC(b833a15b) SHA1(0d21aaa0ca5ccba89118b205a6b3b36b15663c47) )
+ ROM_LOAD( "a-9.kj9", 0x4000, 0x1000, CRC(cbd76ec2) SHA1(9434350ee93ca71efe78018b69913386353306ff) )
+
+ ROM_REGION( 0x10000, "audio2", 0 )
+ ROM_LOAD( "a-1.kj1", 0x0000, 0x1000, CRC(b88ba44e) SHA1(85c141fb411d541b1e20412f5fefd18395f635ae) )
+ ROM_LOAD( "a-2.kj2", 0x1000, 0x1000, CRC(8913c94e) SHA1(6c4fe065217a234d45761f8ad4d2c4e7078a0abd) )
+ ROM_LOAD( "a-3.kj3", 0x2000, 0x1000, CRC(a8fa5095) SHA1(5cabe5497a79a0c43e78a84ae87c824af60a2a3f) )
+ ROM_LOAD( "a-4.kj4", 0x3000, 0x1000, CRC(93f81317) SHA1(167708be94cb9a47290067a20bc5ff6f018b93b6) )
+
+ ROM_REGION( 0x2000, "gfx1", 0 )
+ ROM_LOAD( "b-7.a5", 0x0000, 0x1000, CRC(ddd4158d) SHA1(9701e2d8a0226455dfbed650e58bb4be05918fe8) )
+ ROM_LOAD( "b-8.b5", 0x1000, 0x1000, CRC(b1331b4c) SHA1(fa1af406ecd6919b4846aea68d3edb70106f9273) )
+
+ ROM_REGION( 0x0020, "proms", 0 )
+ ROM_LOAD( "prom.g9", 0x0000, 0x0020, CRC(b7ea00d7) SHA1(f658c6ac8123ae1e6b68ae513cc02c4d9d2b4e47) )
+ROM_END
+
+
ROM_START( scobra )
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD( "epr1265.2c", 0x0000, 0x1000, CRC(a0744b3f) SHA1(8949298a04f8ba8a82d5d84a7b012a0e7cff11df) )
@@ -15471,7 +15502,8 @@ GAME( 19??, aracnis, scorpion, scorpnmc, aracnis, galaxian_state, i
// SF-X hardware; based on Scramble with extra Z80 and 8255 driving a DAC-based sample player
GAME( 1983, sfx, 0, sfx, sfx, taiyo_sfx_state, init_sfx, ORIENTATION_FLIP_X, "Taiyo System (Nichibutsu license)", "SF-X", MACHINE_SUPPORTS_SAVE )
GAME( 1983, skelagon, sfx, sfx, sfx, taiyo_sfx_state, init_sfx, ORIENTATION_FLIP_X, "Taiyo System (Nichibutsu USA license)", "Skelagon", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE)
-GAME( 1982, monsterz, 0, monsterz, sfx, taiyo_sfx_state, init_sfx, ORIENTATION_FLIP_X, "Taiyo System", "Monster Zero", MACHINE_UNEMULATED_PROTECTION | MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING )
+GAME( 1982, monsterz, 0, monsterz, sfx, monsterz_state, init_sfx, ORIENTATION_FLIP_X, "Taiyo System", "Monster Zero (set 1)", MACHINE_SUPPORTS_SAVE )
+GAME( 1982, monsterza, monsterz, monsterz, sfx, monsterz_state, init_sfx, ORIENTATION_FLIP_X, "Taiyo System", "Monster Zero (set 2)", MACHINE_SUPPORTS_SAVE )
/*
diff --git a/src/mame/includes/galaxian.h b/src/mame/includes/galaxian.h
index 081921da51c..cfda30fce72 100644
--- a/src/mame/includes/galaxian.h
+++ b/src/mame/includes/galaxian.h
@@ -779,31 +779,21 @@ public:
}
void sfx(machine_config &config);
- void monsterz(machine_config &config);
void init_sfx();
protected:
virtual void machine_start() override;
-private:
uint8_t sample_io_r(offs_t offset);
void sample_io_w(offs_t offset, uint8_t data);
void sample_control_w(uint8_t data);
- uint8_t monsterz_protection_r();
- void monsterz_porta_1_w(uint8_t data);
- void monsterz_portb_1_w(uint8_t data);
- void monsterz_portc_1_w(uint8_t data);
- void monsterz_set_latch();
-
void sfx_draw_background(bitmap_rgb32 &bitmap, const rectangle &cliprect);
void sfx_map(address_map &map);
void sfx_sample_map(address_map &map);
void sfx_sample_portmap(address_map &map);
- void monsterz_map(address_map &map);
- void monsterz_sound_map(address_map &map);
required_device<cpu_device> m_audio2;
required_device<dac_byte_interface> m_dac;
@@ -812,6 +802,36 @@ private:
};
+class monsterz_state : public taiyo_sfx_state
+{
+public:
+ monsterz_state(const machine_config& mconfig, device_type type, const char* tag)
+ : taiyo_sfx_state(mconfig, type, tag)
+ , m_dac2(*this, "dac2")
+ {
+ }
+
+ void monsterz(machine_config& config);
+
+protected:
+ virtual void machine_start() override;
+
+private:
+ void monsterz_map(address_map& map);
+ void monsterz_sound_map(address_map& map);
+ void monsterz_sound_portmap(address_map& map);
+ void monsterz_sample_map(address_map& map);
+ void monsterz_ay8910_w(offs_t offset, uint8_t data);
+
+ required_device<dac_byte_interface> m_dac2;
+
+ uint32_t m_monsterz_shift;
+ uint32_t m_monsterz_shift2;
+ uint8_t m_monsterz_audio_portb;
+ uint8_t m_monsterz_sample_portc;
+};
+
+
class moonwar_state : public galaxian_state
{
public:
diff --git a/src/mame/mame.lst b/src/mame/mame.lst
index 5dc3e166f1e..ea7595c616d 100644
--- a/src/mame/mame.lst
+++ b/src/mame/mame.lst
@@ -14548,6 +14548,7 @@ mimonscr // (c) 1982 bootleg
mimonscra // (c) 1982 bootleg
mltiwars // bootleg (Gayton Games)
monsterz // (c) 1982 Nihon (Arcade TV Game List - P.102, Left, 20 from top)
+monsterza // (c) 1982 Nihon (Arcade TV Game List - P.102, Left, 20 from top)
moonal2 // [1980] Nichibutsu
moonal2b // [1980] Nichibutsu
moonaln // [Nichibutsu] (Karateco license) or hack