diff options
| author | 2026-01-23 17:47:59 +0100 | |
|---|---|---|
| committer | 2026-01-23 17:47:59 +0100 | |
| commit | 6b9155397d3ee3187887fe50f1c893a32f25633d (patch) | |
| tree | c654a832f9a193c475296757e69895e921192a84 | |
| parent | f77baf021c39f400a879265316989a5326a978ae (diff) | |
tecmo/shadoww_ms.cpp: fleshed out the driver. Most glaring remaining problem is sound isn't hooked up
| -rw-r--r-- | src/mame/tecmo/gaiden.cpp | 11 | ||||
| -rw-r--r-- | src/mame/tecmo/shadoww_ms.cpp | 421 |
2 files changed, 348 insertions, 84 deletions
diff --git a/src/mame/tecmo/gaiden.cpp b/src/mame/tecmo/gaiden.cpp index 48ebb2bd04d..0d2f9514244 100644 --- a/src/mame/tecmo/gaiden.cpp +++ b/src/mame/tecmo/gaiden.cpp @@ -2189,16 +2189,7 @@ void mastninj_state::descramble_gfx(uint8_t* src) std::vector<uint8_t> buffer(len); for (int i = 0;i < len; i++) { - buffer[i] = src[bitswap<24>(i, 23, 22, 21, 20, 19, 18, 17, 16, 15, 5, 14, 13, 12, 11, 10, 9, 8, 7, 6, 4, 3, 2, 1, 0)]; - } - std::copy(buffer.begin(), buffer.end(), &src[0]); - } - - { - std::vector<uint8_t> buffer(len); - for (int i = 0; i < len; i++) - { - buffer[i] = src[bitswap<24>(i, 23, 22, 21, 20, 19, 18, 17, 16, 15, 6, 14, 13, 12, 11, 10, 9, 8, 7, 5, 4, 3, 2, 1, 0)]; + buffer[i] = src[bitswap<24>(i, 23, 22, 21, 20, 19, 18, 17, 16, 15, 5, 6, 14, 13, 12, 11, 10, 9, 8, 7, 4, 3, 2, 1, 0)]; } std::copy(buffer.begin(), buffer.end(), &src[0]); } diff --git a/src/mame/tecmo/shadoww_ms.cpp b/src/mame/tecmo/shadoww_ms.cpp index 9b2b33a5ed6..e5008be4fde 100644 --- a/src/mame/tecmo/shadoww_ms.cpp +++ b/src/mame/tecmo/shadoww_ms.cpp @@ -16,8 +16,13 @@ PCB pics, dip switches, and more info: https://www.recreativas.org/modular-system-shadow-warriors-554-ervisa + Very similar to mastninj in tecmo/gaiden.cpp. However the differences (palette and sprite RAM format, scrolling registers, sound system) + maybe make it worthwhile to leave it as a separate driver. + TODO: - - everything, + - sound; + - tilemaps y scroll needs slight adjustment; + - sprites positioning may be slightly off. */ @@ -25,6 +30,8 @@ #include "cpu/m68000/m68000.h" #include "cpu/z80/z80.h" +#include "machine/gen_latch.h" +#include "sound/msm5205.h" #include "sound/ymopn.h" #include "emupal.h" @@ -41,136 +48,385 @@ public: shadoww_ms_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), - m_screen(*this, "screen") + m_gfxdecode(*this, "gfxdecode"), + m_screen(*this, "screen"), + m_msm(*this, "msm5205"), + m_spriteram(*this, "spriteram"), + m_videoram(*this, "videoram%u", 1) { } - void shadowwm(machine_config &config); + void shadowwm(machine_config &config) ATTR_COLD; + + void init_gfx() ATTR_COLD; protected: - virtual void machine_start() override; + virtual void video_start() override ATTR_COLD; private: required_device<cpu_device> m_maincpu; + required_device<gfxdecode_device> m_gfxdecode; required_device<screen_device> m_screen; - + required_device<msm5205_device> m_msm; + + required_shared_ptr<uint16_t> m_spriteram; + required_shared_ptr_array<uint16_t, 3> m_videoram; + + tilemap_t *m_text_layer = nullptr; + tilemap_t *m_foreground = nullptr; + tilemap_t *m_background = nullptr; + + TILE_GET_INFO_MEMBER(get_bg_tile_info); + TILE_GET_INFO_MEMBER(get_fg_tile_info); + TILE_GET_INFO_MEMBER(get_tx_tile_info); + void bg_videoram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); + void fg_videoram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); + void tx_videoram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); + void draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - void main_map(address_map &map); + void main_map(address_map &map) ATTR_COLD; + void sound_map(address_map &map) ATTR_COLD; }; -uint32_t shadoww_ms_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +void shadoww_ms_state::video_start() { - return 0; + m_background = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(shadoww_ms_state::get_bg_tile_info)), TILEMAP_SCAN_ROWS, 16, 16, 64, 32); + m_foreground = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(shadoww_ms_state::get_fg_tile_info)), TILEMAP_SCAN_ROWS, 16, 16, 64, 32); + m_text_layer = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(shadoww_ms_state::get_tx_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32); + + m_foreground->set_transparent_pen(15); + m_text_layer->set_transparent_pen(15); +} + +TILE_GET_INFO_MEMBER(shadoww_ms_state::get_bg_tile_info) +{ + uint16_t const *const videoram1 = &m_videoram[2][0x0800]; + uint16_t const *const videoram2 = m_videoram[2]; + tileinfo.set(1, + videoram1[tile_index] & 0x0fff, + (videoram2[tile_index] & 0xf0) >> 4, + 0); +} + +TILE_GET_INFO_MEMBER(shadoww_ms_state::get_fg_tile_info) +{ + uint16_t const *const videoram1 = &m_videoram[1][0x0800]; + uint16_t const *const videoram2 = m_videoram[1]; + tileinfo.set(2, + videoram1[tile_index] & 0x0fff, + (videoram2[tile_index] & 0xf0) >> 4, + 0); +} + +TILE_GET_INFO_MEMBER(shadoww_ms_state::get_tx_tile_info) +{ + uint16_t const *const videoram1 = &m_videoram[0][0x0400]; + uint16_t const *const videoram2 = m_videoram[0]; + tileinfo.set(0, videoram1[tile_index] & 0x07ff, (videoram2[tile_index] & 0xf0) >> 4, 0); +} + +void shadoww_ms_state::bg_videoram_w(offs_t offset, uint16_t data, uint16_t mem_mask) +{ + COMBINE_DATA(&m_videoram[2][offset]); + m_background->mark_tile_dirty(offset & 0x07ff); } +void shadoww_ms_state::fg_videoram_w(offs_t offset, uint16_t data, uint16_t mem_mask) +{ + COMBINE_DATA(&m_videoram[1][offset]); + m_foreground->mark_tile_dirty(offset & 0x07ff); +} -void shadoww_ms_state::machine_start() +void shadoww_ms_state::tx_videoram_w(offs_t offset, uint16_t data, uint16_t mem_mask) { + COMBINE_DATA(&m_videoram[0][offset]); + m_text_layer->mark_tile_dirty(offset & 0x03ff); +} + +void shadoww_ms_state::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +{ + const int NUM_SPRITES = 0x100; + const int X_EXTRA_OFFSET = -0x10; + + for (int i = 0; i < NUM_SPRITES; i += 2) + { + gfx_element *gfx = m_gfxdecode->gfx(3); + + uint16_t const attr0 = m_spriteram[i + 0]; + uint16_t const attr1 = m_spriteram[i + 1]; + + uint16_t const attr2 = m_spriteram[i + NUM_SPRITES]; + //uint16_t const attr3 = m_spriteram[i + NUM_SPRITES + 1]; // unused? + + if (!(attr2 & 0x8000)) + continue; + + int ypos = attr0 & 0x00ff; + int const xpos = (attr1 & 0xff00) >> 8; + + ypos = (0xff - ypos); + + int tile = (attr0 & 0xff00) >> 8; + tile |= (attr1 & 0x001f) << 8; + + int const col = (attr2 & 0x0f00) >> 8; + + int const flipx = (attr1 & 0x0040); + int const flipy = (attr2 & 0x4000); + + int const pri_mask = (col & 0x08) ? 0x00 : 0xf0 | 0xcc; + + gfx->prio_transpen(bitmap, cliprect, tile, col, flipx, flipy, xpos - 16 - X_EXTRA_OFFSET, ypos - 16, screen.priority(), pri_mask, 15); + } +} + +uint32_t shadoww_ms_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +{ + screen.priority().fill(0, cliprect); + + m_background->draw(screen, bitmap, cliprect, 0, 1); + m_foreground->draw(screen, bitmap, cliprect, 0, 2); + m_text_layer->draw(screen, bitmap, cliprect, 0, 4); + draw_sprites(screen, bitmap, cliprect); + + return 0; } void shadoww_ms_state::main_map(address_map &map) { + map(0x000000, 0x03ffff).rom(); + map(0x060000, 0x063fff).ram(); + map(0x070000, 0x070fff).ram().w(FUNC(shadoww_ms_state::tx_videoram_w)).share(m_videoram[0]); + map(0x072000, 0x073fff).ram().ram().w(FUNC(shadoww_ms_state::fg_videoram_w)).share(m_videoram[1]); + map(0x074000, 0x075fff).ram().ram().w(FUNC(shadoww_ms_state::bg_videoram_w)).share(m_videoram[2]); + map(0x076000, 0x076fff).ram().share(m_spriteram); + map(0x078000, 0x0783ff).ram().w("palette", FUNC(palette_device::write16)).share("palette"); + map(0x078400, 0x0787ff).ram().w("palette", FUNC(palette_device::write16_ext)).share("palette_ext"); + map(0x078800, 0x079fff).ram(); + map(0x07a000, 0x07a001).portr("SYSTEM"); + map(0x07a002, 0x07a003).portr("P1_P2"); + map(0x07a004, 0x07a005).portr("DSW"); + map(0x07e000, 0x07e000).lw8(NAME([this] (uint8_t data) { m_maincpu->set_input_line(5, CLEAR_LINE); })); + map(0x07f000, 0x07f001).lw16(NAME([this] (uint16_t data) { m_foreground->set_scrollx(0, (0x33 - data) & 0x3ff); })); + map(0x07f002, 0x07f003).lw16(NAME([this] (uint16_t data) { m_foreground->set_scrolly(0, -data & 0x1ff); })); // not 100% correct + map(0x07f004, 0x07f005).lw16(NAME([this] (uint16_t data) { m_background->set_scrollx(0, (0x30 - data) & 0x3ff); })); + map(0x07f006, 0x07f007).lw16(NAME([this] (uint16_t data) { m_background->set_scrolly(0, -data & 0x1ff); })); // not 100% correct +} + +void shadoww_ms_state::sound_map(address_map &map) +{ + map(0x0000, 0x7fff).rom(); + // map(0x8000, 0x8000).w() // MSM5205? + map(0xc000, 0xc001).w("ym1", FUNC(ym2203_device::write)); + map(0xc002, 0xc003).w("ym2", FUNC(ym2203_device::write)); + map(0xc008, 0xc009).r("ym1", FUNC(ym2203_device::read)); + map(0xc00a, 0xc00b).r("ym2", FUNC(ym2203_device::read)); + map(0xf000, 0xffff).ram(); } static INPUT_PORTS_START( shadowwm ) - PORT_START("DSW") - PORT_DIPUNKNOWN_DIPLOC(0x0001, 0x0001, "SW1:1") - PORT_DIPUNKNOWN_DIPLOC(0x0002, 0x0002, "SW1:2") - PORT_DIPUNKNOWN_DIPLOC(0x0004, 0x0004, "SW1:3") - PORT_DIPUNKNOWN_DIPLOC(0x0008, 0x0008, "SW1:4") - PORT_DIPUNKNOWN_DIPLOC(0x0010, 0x0010, "SW1:5") - PORT_DIPUNKNOWN_DIPLOC(0x0020, 0x0020, "SW1:6") - PORT_DIPUNKNOWN_DIPLOC(0x0040, 0x0040, "SW1:7") - PORT_DIPUNKNOWN_DIPLOC(0x0080, 0x0080, "SW1:8") - PORT_DIPUNKNOWN_DIPLOC(0x0100, 0x0100, "SW2:1") - PORT_DIPUNKNOWN_DIPLOC(0x0200, 0x0200, "SW2:2") - PORT_DIPUNKNOWN_DIPLOC(0x0400, 0x0400, "SW2:3") - PORT_DIPUNKNOWN_DIPLOC(0x0800, 0x0800, "SW2:4") - PORT_DIPUNKNOWN_DIPLOC(0x1000, 0x1000, "SW2:5") - PORT_DIPUNKNOWN_DIPLOC(0x2000, 0x2000, "SW2:6") - PORT_DIPUNKNOWN_DIPLOC(0x4000, 0x4000, "SW2:7") - PORT_DIPUNKNOWN_DIPLOC(0x8000, 0x8000, "SW2:8") + PORT_START("SYSTEM") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START1 ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_START2 ) + 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_COIN1 ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN2 ) + + PORT_START("P1_P2") + PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(1) + PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(1) + PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(1) + PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(1) + PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) + PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) + PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1) + PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(2) + PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(2) + PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(2) + PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(2) + PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) + PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) + PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2) + PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_START("DSW") // from manual + PORT_DIPNAME( 0x00e0, 0x00e0, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SW1:3,2,1") + PORT_DIPSETTING( 0x0000, DEF_STR( 5C_1C ) ) + PORT_DIPSETTING( 0x0080, DEF_STR( 4C_1C ) ) + PORT_DIPSETTING( 0x0040, DEF_STR( 3C_1C ) ) + PORT_DIPSETTING( 0x0020, DEF_STR( 2C_1C ) ) + PORT_DIPSETTING( 0x00e0, DEF_STR( 1C_1C ) ) + PORT_DIPSETTING( 0x0060, DEF_STR( 1C_2C ) ) + PORT_DIPSETTING( 0x00a0, DEF_STR( 1C_3C ) ) + PORT_DIPSETTING( 0x00c0, DEF_STR( 1C_4C ) ) + PORT_DIPNAME( 0x001c, 0x001c, DEF_STR( Coin_B ) ) PORT_DIPLOCATION("SW1:6,5,4") + PORT_DIPSETTING( 0x0000, DEF_STR( 5C_1C ) ) + PORT_DIPSETTING( 0x0010, DEF_STR( 4C_1C ) ) + PORT_DIPSETTING( 0x0008, DEF_STR( 3C_1C ) ) + PORT_DIPSETTING( 0x0004, DEF_STR( 2C_1C ) ) + PORT_DIPSETTING( 0x001c, DEF_STR( 1C_1C ) ) + PORT_DIPSETTING( 0x000c, DEF_STR( 1C_2C ) ) + PORT_DIPSETTING( 0x0014, DEF_STR( 1C_3C ) ) + PORT_DIPSETTING( 0x0018, DEF_STR( 1C_4C ) ) + PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW1:7") // Flip Screen on original, listed empty in this game manual + PORT_DIPSETTING( 0x0002, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0001, 0x0001, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW1:8") + PORT_DIPSETTING( 0x0000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0001, DEF_STR( On ) ) + PORT_DIPNAME( 0xc000, 0xc000, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:2,1") + PORT_DIPSETTING( 0x0000, "0" ) + PORT_DIPSETTING( 0xc000, "1" ) + PORT_DIPSETTING( 0x4000, "2" ) + PORT_DIPSETTING( 0x8000, "3" ) + PORT_DIPNAME( 0x3000, 0x3000, "Energy" ) PORT_DIPLOCATION("SW2:4,3") + PORT_DIPSETTING( 0x0000, "2" ) + PORT_DIPSETTING( 0x3000, "3" ) + PORT_DIPSETTING( 0x1000, "4" ) + PORT_DIPSETTING( 0x2000, "5" ) + PORT_DIPNAME( 0x0c00, 0x0c00, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:6,5") + PORT_DIPSETTING( 0x0c00, DEF_STR( Normal ) ) + PORT_DIPSETTING( 0x0400, "TBL 1" ) + PORT_DIPSETTING( 0x0800, "TBL 2" ) + PORT_DIPSETTING( 0x0000, "TBL 3" ) + PORT_DIPUNUSED_DIPLOC( 0x0200, 0x0200, "SW2:7" ) // listed as 'don't change' + PORT_DIPUNUSED_DIPLOC( 0x0100, 0x0100, "SW2:8" ) // listed as 'don't change' + INPUT_PORTS_END + +static const gfx_layout tile_layout = +{ + 16, 16, + RGN_FRAC(1, 1), + 4, + { STEP4(24, -8) }, + { STEP8(0, 1), STEP8(256, 1) }, + { STEP8(0, 32), STEP8(512, 32) }, + 32 * 32 +}; + +static const gfx_layout sprites_layout = +{ + 16, 16, + RGN_FRAC(1, 1), + 4, + { STEP4(0, 8) }, + { STEP8(0, 1), STEP8(512, 1) }, + { STEP16(0,32) }, + 16 * 16 * 4 +}; + + +static GFXDECODE_START( gfx_shadowmm ) + GFXDECODE_ENTRY( "txtiles", 0, gfx_8x8x4_planar, 0, 16 ) + GFXDECODE_ENTRY( "tiles", 0, tile_layout, 0x300, 16 ) + GFXDECODE_ENTRY( "tiles", 0x80000, tile_layout, 0x200, 16 ) + GFXDECODE_ENTRY( "sprites", 0, sprites_layout, 0x100, 16 ) +GFXDECODE_END + + void shadoww_ms_state::shadowwm(machine_config &config) { // basic machine hardware M68000(config, m_maincpu, 20_MHz_XTAL / 2); // divisor unknown m_maincpu->set_addrmap(AS_PROGRAM, &shadoww_ms_state::main_map); + m_maincpu->set_vblank_int("screen", FUNC(shadoww_ms_state::irq5_line_assert)); - Z80(config, "audiocpu", 20_MHz_XTAL / 5).set_disable(); // divisor unknown + z80_device &audiocpu(Z80(config, "audiocpu", 20_MHz_XTAL / 5)); // divisor unknown + audiocpu.set_addrmap(AS_PROGRAM, &shadoww_ms_state::sound_map); // video hardware SCREEN(config, m_screen, SCREEN_TYPE_RASTER); // all wrong m_screen->set_refresh_hz(60); m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500)); m_screen->set_size(256, 256); - m_screen->set_visarea(0, 256-1, 0, 256-32-1); + m_screen->set_visarea(0, 256-1, 16, 240-1); m_screen->set_screen_update(FUNC(shadoww_ms_state::screen_update)); m_screen->set_palette("palette"); - PALETTE(config, "palette").set_format(palette_device::IRGB_1555, 256).set_membits(8); + GFXDECODE(config, "gfxdecode", "palette", gfx_shadowmm); + + PALETTE(config, "palette").set_format(palette_device::xBGR_444, 0x400); // sound hardware SPEAKER(config, "mono").front_center(); + GENERIC_LATCH_8(config, "soundlatch"); + YM2203(config, "ym1", 20_MHz_XTAL / 5).add_route(ALL_OUTPUTS, "mono", 0.15); // divisor unknown YM2203(config, "ym2", 20_MHz_XTAL / 5).add_route(ALL_OUTPUTS, "mono", 0.15); // divisor unknown + + MSM5205(config, m_msm, XTAL(384'000)); // unknown clock + m_msm->set_prescaler_selector(msm5205_device::S48_4B); // unverified + m_msm->add_route(ALL_OUTPUTS, "mono", 0.25); } + ROM_START( shadowwm ) - ROM_REGION( 0x40000, "maincpu", 0 ) // on MOD 6/1 board - ROM_LOAD( "mod_6-1_3sw_603.ic17", 0x00000, 0x10000, CRC(a74f4849) SHA1(8c2e50bb1795e6bef3dc76c15a9087771300bdaa) ) - ROM_LOAD( "mod_6-1_3sw_606.ic8", 0x10000, 0x10000, CRC(bd51890f) SHA1(ffad07f01618363e144428823bd0e83be27db6c3) ) - ROM_LOAD( "mod_6-1_3sw_602.ic20", 0x20000, 0x10000, CRC(e642241b) SHA1(7abcda6b86595ba86ae12874d6787ef8dcd64f84) ) - ROM_LOAD( "mod_6-1_3sw_605.ic11", 0x30000, 0x08000, CRC(4aba6041) SHA1(22a9913e6894d7b567d17fca38c4f053ca4fb159) ) + ROM_REGION( 0x40000, "maincpu", 0 ) // on MOD 6/1 board, very similar to mastninj + ROM_LOAD16_BYTE( "mod_6-1_3sw_603.ic17", 0x00000, 0x10000, CRC(a74f4849) SHA1(8c2e50bb1795e6bef3dc76c15a9087771300bdaa) ) + ROM_LOAD16_BYTE( "mod_6-1_3sw_606.ic8", 0x00001, 0x10000, CRC(bd51890f) SHA1(ffad07f01618363e144428823bd0e83be27db6c3) ) + ROM_LOAD16_BYTE( "mod_6-1_3sw_605.ic11", 0x20001, 0x08000, CRC(4aba6041) SHA1(22a9913e6894d7b567d17fca38c4f053ca4fb159) ) + ROM_LOAD16_BYTE( "mod_6-1_3sw_602.ic20", 0x30001, 0x08000, CRC(e642241b) SHA1(7abcda6b86595ba86ae12874d6787ef8dcd64f84) ) + ROM_CONTINUE( 0x20000, 0x08000 ) // some weird addressing ROM_REGION( 0x10000, "audiocpu", 0 ) // on MOD 1/3 board ROM_LOAD( "mod_1-3_3sw_415.ic12", 0x00000, 0x10000, CRC(4dba665b) SHA1(8d068cd588f31cbe944a2f07dbbb81a74d80bcac) ) - ROM_REGION( 0x140000, "tiles", 0 ) // on MOD 8 board - ROM_LOAD( "mod_8_821_3sw.ic10", 0x000000, 0x10000, CRC(72e5c1c2) SHA1(0e744407c52a61ed657557978cdfe455fe5e931e) ) - ROM_LOAD( "mod_8_3sw.ic11", 0x010000, 0x10000, CRC(e3987e0f) SHA1(8805443e56575fc455d21703bd2f9ebef434e262) ) - ROM_LOAD( "mod_8_3sw.ic12", 0x020000, 0x10000, CRC(dd162ce7) SHA1(70ec5a722ea31434be2a4b3104f9c54a48b8ec05) ) - ROM_LOAD( "mod_8_3sw.ic13", 0x030000, 0x10000, CRC(ae043a2e) SHA1(3513b21d4ee7f869c9ebda68707845d030b0ecad) ) - ROM_LOAD( "mod_8_801_3sw.ic15", 0x040000, 0x08000, CRC(8af36af3) SHA1(5fd1e65b9e481cd6135710629d7d74a5edd94378) ) // 1ST AND 2ND HALF IDENTICAL - ROM_LOAD( "mod_8_822_3sw.ic17", 0x050000, 0x10000, CRC(55affaf8) SHA1(c121a904ba44dc53c8a10b8d56c4c25ab879d8be) ) - ROM_LOAD( "mod_8_3sw.ic18", 0x060000, 0x10000, CRC(5e8afc68) SHA1(ecef113a947b9bda6abbef5f75557cd201e355b3) ) - ROM_LOAD( "mod_8_3sw.ic19", 0x070000, 0x10000, CRC(edd65385) SHA1(3b5c0115ae1972bfe696a22edd2da9e6fb9739f4) ) - ROM_LOAD( "mod_8_3sw.ic20", 0x080000, 0x10000, CRC(e197fd97) SHA1(1e92139ae6a1c15de629039757c21e32cacc42d6) ) - ROM_LOAD( "mod_8_802_3sw.ic22", 0x090000, 0x08000, CRC(1c3aadc2) SHA1(e14c46cf41713632d8514a0baa6bbf4581a90e7a) ) // 1ST AND 2ND HALF IDENTICAL - ROM_LOAD( "mod_8_823_3sw.ic25", 0x0a0000, 0x10000, CRC(bd76fd53) SHA1(bc2ad054b63573f16c99f82c680f0f6de2ee4683) ) - ROM_LOAD( "mod_8_3sw.ic26", 0x0b0000, 0x10000, CRC(2713e9f1) SHA1(87614a79596216d2b710925167f3130d4c2e07c9) ) - ROM_LOAD( "mod_8_3sw.ic27", 0x0c0000, 0x10000, CRC(ca691635) SHA1(177f94a17cfaf67c764c2a2dff48475039207fae) ) - ROM_LOAD( "mod_8_3sw.ic28", 0x0d0000, 0x10000, CRC(0871971c) SHA1(ede9bb5d6d968fc532217b4eb1cd4c0d7ea9a4a1) ) - ROM_LOAD( "mod_8_803_3sw.ic30", 0x0e0000, 0x08000, CRC(829f8213) SHA1(4adbddf1a31d9ba766ded3a701d57e12fca56de7) ) // 1ST AND 2ND HALF IDENTICAL - ROM_LOAD( "mod_8_824_3sw.ic32", 0x0f0000, 0x10000, CRC(f3bfcfd6) SHA1(7d73a2ae00825979b3d09502f52d78f61f3ea1a9) ) - ROM_LOAD( "mod_8_3sw.ic33", 0x100000, 0x10000, CRC(ca59280f) SHA1(d5a1d85f75ea667812708758915f43f01c8c9830) ) - ROM_LOAD( "mod_8_3sw.ic34", 0x110000, 0x10000, CRC(2ae70f42) SHA1(aad89dbd0309a5e3a786aa028995b56859d5b5ff) ) - ROM_LOAD( "mod_8_3sw.ic35", 0x120000, 0x10000, CRC(6850aea3) SHA1(670820ba2df040ded8739907bfdde4ac97373200) ) - ROM_LOAD( "mod_8_804_3sw.ic37", 0x130000, 0x08000, CRC(4543e707) SHA1(b6e3a8ed9e8b4014007a0b254400baae7aa050bf) ) // 1ST AND 2ND HALF IDENTICAL - - ROM_REGION( 0x100000, "sprites", 0 ) // MODULAR SYSTEM 2 MOD 5/1 - ROM_LOAD( "mod_5-1_3sw_5a01.ic03", 0x00000, 0x10000, CRC(216eeef5) SHA1(5167af8cef220a5092add2bf578e8323360132a5) ) - ROM_LOAD( "mod_5-1_3sw_5a02.ic04", 0x10000, 0x10000, CRC(f72f8bfd) SHA1(ccf0aab11987e76c927a73f12e5cd4bb125c1258) ) - ROM_LOAD( "mod_5-1_3sw_5a03.ic05", 0x20000, 0x10000, CRC(6de96087) SHA1(0b9028320cb622dad07cf8bde015428eba7f8a5e) ) - ROM_LOAD( "mod_5-1_3sw_5a04.ic06", 0x30000, 0x10000, CRC(44275bc9) SHA1(72bfc098561e47f2820c676e551e8eaa402c88fc) ) - ROM_LOAD( "mod_5-1_3sw_5b1.ic12", 0x40000, 0x10000, CRC(012da98d) SHA1(413e1f02e2e3267fb4b893b14f627105789aa1c9) ) - ROM_LOAD( "mod_5-1_3sw_5b2.ic13", 0x50000, 0x10000, CRC(fa32da96) SHA1(5e240f6f91813bdafacf1d29ea65704f2c4f2ae6) ) - ROM_LOAD( "mod_5-1_3sw_5b3.ic14", 0x60000, 0x10000, CRC(910fccdb) SHA1(99523b53ae0dbf82783ab5a731df3c02984c72fe) ) - ROM_LOAD( "mod_5-1_3sw_5b4.ic15", 0x70000, 0x10000, CRC(bb9a59e3) SHA1(5e674305267e7e20172c97b5b85f6b58ce51962c) ) - ROM_LOAD( "mod_5-1_3sw_5c01.ic18", 0x80000, 0x10000, CRC(940f3dbb) SHA1(4e2f224ed2ec1b8da992bd375d3ab1cf6fbfdd1f) ) - ROM_LOAD( "mod_5-1_3sw_5c02.ic19", 0x90000, 0x10000, CRC(f6baccb0) SHA1(2244d16127efe67fcf59a59e50eabc54e3081dd1) ) - ROM_LOAD( "mod_5-1_3sw_5c03.ic20", 0xa0000, 0x10000, CRC(bb46ef1b) SHA1(4c8f9e06fa4d7f14206f6180a999b3f32681785a) ) - ROM_LOAD( "mod_5-1_3sw_5c04.ic21", 0xb0000, 0x10000, CRC(065591f5) SHA1(84481c023d722a54682c22421f97f3d221237195) ) - ROM_LOAD( "mod_5-1_3sw_5d01.ic24", 0xc0000, 0x10000, CRC(3c117e62) SHA1(dee45d6bbe053996e0b3faaba0293a273faf1ffa) ) - ROM_LOAD( "mod_5-1_3sw_5d02.ic25", 0xd0000, 0x10000, CRC(f6d6422d) SHA1(933487b09d3bcff9714fb2469b3d751b38459cfd) ) - ROM_LOAD( "mod_5-1_3sw_5d03.ic26", 0xe0000, 0x10000, CRC(642f06e7) SHA1(5b30b5029884b7eddcad201224a639f94ee27823) ) - ROM_LOAD( "mod_5-1_3sw_5d04.ic27", 0xf0000, 0x10000, CRC(7f7f70b6) SHA1(727333a7825a04d9eb2bdea49b8203bbec7b9c24) ) + ROM_REGION( 0x10000, "txtiles", 0 ) // on MOD 8 board + ROM_LOAD( "mod_8_801_3sw.ic15", 0x0000, 0x4000, CRC(8af36af3) SHA1(5fd1e65b9e481cd6135710629d7d74a5edd94378) ) // 1ST AND 2ND HALF IDENTICAL + ROM_IGNORE( 0x4000 ) + ROM_LOAD( "mod_8_802_3sw.ic22", 0x4000, 0x4000, CRC(1c3aadc2) SHA1(e14c46cf41713632d8514a0baa6bbf4581a90e7a) ) // 1ST AND 2ND HALF IDENTICAL + ROM_IGNORE( 0x4000 ) + ROM_LOAD( "mod_8_803_3sw.ic30", 0x8000, 0x4000, CRC(829f8213) SHA1(4adbddf1a31d9ba766ded3a701d57e12fca56de7) ) // 1ST AND 2ND HALF IDENTICAL + ROM_IGNORE( 0x4000 ) + ROM_LOAD( "mod_8_804_3sw.ic37", 0xc000, 0x4000, CRC(4543e707) SHA1(b6e3a8ed9e8b4014007a0b254400baae7aa050bf) ) // 1ST AND 2ND HALF IDENTICAL + ROM_IGNORE( 0x4000 ) + + ROM_REGION( 0x100000, "tiles", 0 ) // on MOD 8 board + ROM_LOAD32_BYTE( "mod_8_3sw.ic11", 0x00000, 0x10000, CRC(e3987e0f) SHA1(8805443e56575fc455d21703bd2f9ebef434e262) ) + ROM_LOAD32_BYTE( "mod_8_3sw.ic18", 0x00001, 0x10000, CRC(5e8afc68) SHA1(ecef113a947b9bda6abbef5f75557cd201e355b3) ) + ROM_LOAD32_BYTE( "mod_8_3sw.ic26", 0x00002, 0x10000, CRC(2713e9f1) SHA1(87614a79596216d2b710925167f3130d4c2e07c9) ) + ROM_LOAD32_BYTE( "mod_8_3sw.ic33", 0x00003, 0x10000, CRC(ca59280f) SHA1(d5a1d85f75ea667812708758915f43f01c8c9830) ) + ROM_LOAD32_BYTE( "mod_8_821_3sw.ic10", 0x40000, 0x10000, CRC(72e5c1c2) SHA1(0e744407c52a61ed657557978cdfe455fe5e931e) ) + ROM_LOAD32_BYTE( "mod_8_822_3sw.ic17", 0x40001, 0x10000, CRC(55affaf8) SHA1(c121a904ba44dc53c8a10b8d56c4c25ab879d8be) ) + ROM_LOAD32_BYTE( "mod_8_823_3sw.ic25", 0x40002, 0x10000, CRC(bd76fd53) SHA1(bc2ad054b63573f16c99f82c680f0f6de2ee4683) ) + ROM_LOAD32_BYTE( "mod_8_824_3sw.ic32", 0x40003, 0x10000, CRC(f3bfcfd6) SHA1(7d73a2ae00825979b3d09502f52d78f61f3ea1a9) ) + ROM_LOAD32_BYTE( "mod_8_3sw.ic13", 0x80000, 0x10000, CRC(ae043a2e) SHA1(3513b21d4ee7f869c9ebda68707845d030b0ecad) ) + ROM_LOAD32_BYTE( "mod_8_3sw.ic20", 0x80001, 0x10000, CRC(e197fd97) SHA1(1e92139ae6a1c15de629039757c21e32cacc42d6) ) + ROM_LOAD32_BYTE( "mod_8_3sw.ic28", 0x80002, 0x10000, CRC(0871971c) SHA1(ede9bb5d6d968fc532217b4eb1cd4c0d7ea9a4a1) ) + ROM_LOAD32_BYTE( "mod_8_3sw.ic35", 0x80003, 0x10000, CRC(6850aea3) SHA1(670820ba2df040ded8739907bfdde4ac97373200) ) + ROM_LOAD32_BYTE( "mod_8_3sw.ic12", 0xc0000, 0x10000, CRC(dd162ce7) SHA1(70ec5a722ea31434be2a4b3104f9c54a48b8ec05) ) + ROM_LOAD32_BYTE( "mod_8_3sw.ic19", 0xc0001, 0x10000, CRC(edd65385) SHA1(3b5c0115ae1972bfe696a22edd2da9e6fb9739f4) ) + ROM_LOAD32_BYTE( "mod_8_3sw.ic27", 0xc0002, 0x10000, CRC(ca691635) SHA1(177f94a17cfaf67c764c2a2dff48475039207fae) ) + ROM_LOAD32_BYTE( "mod_8_3sw.ic34", 0xc0003, 0x10000, CRC(2ae70f42) SHA1(aad89dbd0309a5e3a786aa028995b56859d5b5ff) ) + + ROM_REGION( 0x100000, "sprites", ROMREGION_INVERT ) // MODULAR SYSTEM 2 MOD 5/1 + ROM_LOAD32_BYTE( "mod_5-1_3sw_5d01.ic24", 0x00000, 0x10000, CRC(3c117e62) SHA1(dee45d6bbe053996e0b3faaba0293a273faf1ffa) ) + ROM_LOAD32_BYTE( "mod_5-1_3sw_5c01.ic18", 0x00001, 0x10000, CRC(940f3dbb) SHA1(4e2f224ed2ec1b8da992bd375d3ab1cf6fbfdd1f) ) + ROM_LOAD32_BYTE( "mod_5-1_3sw_5b1.ic12", 0x00002, 0x10000, CRC(012da98d) SHA1(413e1f02e2e3267fb4b893b14f627105789aa1c9) ) + ROM_LOAD32_BYTE( "mod_5-1_3sw_5a01.ic03", 0x00003, 0x10000, CRC(216eeef5) SHA1(5167af8cef220a5092add2bf578e8323360132a5) ) + ROM_LOAD32_BYTE( "mod_5-1_3sw_5d02.ic25", 0x40000, 0x10000, CRC(f6d6422d) SHA1(933487b09d3bcff9714fb2469b3d751b38459cfd) ) + ROM_LOAD32_BYTE( "mod_5-1_3sw_5c02.ic19", 0x40001, 0x10000, CRC(f6baccb0) SHA1(2244d16127efe67fcf59a59e50eabc54e3081dd1) ) + ROM_LOAD32_BYTE( "mod_5-1_3sw_5b2.ic13", 0x40002, 0x10000, CRC(fa32da96) SHA1(5e240f6f91813bdafacf1d29ea65704f2c4f2ae6) ) + ROM_LOAD32_BYTE( "mod_5-1_3sw_5a02.ic04", 0x40003, 0x10000, CRC(f72f8bfd) SHA1(ccf0aab11987e76c927a73f12e5cd4bb125c1258) ) + ROM_LOAD32_BYTE( "mod_5-1_3sw_5d03.ic26", 0x80000, 0x10000, CRC(642f06e7) SHA1(5b30b5029884b7eddcad201224a639f94ee27823) ) + ROM_LOAD32_BYTE( "mod_5-1_3sw_5c03.ic20", 0x80001, 0x10000, CRC(bb46ef1b) SHA1(4c8f9e06fa4d7f14206f6180a999b3f32681785a) ) + ROM_LOAD32_BYTE( "mod_5-1_3sw_5b3.ic14", 0x80002, 0x10000, CRC(910fccdb) SHA1(99523b53ae0dbf82783ab5a731df3c02984c72fe) ) + ROM_LOAD32_BYTE( "mod_5-1_3sw_5a03.ic05", 0x80003, 0x10000, CRC(6de96087) SHA1(0b9028320cb622dad07cf8bde015428eba7f8a5e) ) + ROM_LOAD32_BYTE( "mod_5-1_3sw_5d04.ic27", 0xc0000, 0x10000, CRC(7f7f70b6) SHA1(727333a7825a04d9eb2bdea49b8203bbec7b9c24) ) + ROM_LOAD32_BYTE( "mod_5-1_3sw_5c04.ic21", 0xc0001, 0x10000, CRC(065591f5) SHA1(84481c023d722a54682c22421f97f3d221237195) ) + ROM_LOAD32_BYTE( "mod_5-1_3sw_5b4.ic15", 0xc0002, 0x10000, CRC(bb9a59e3) SHA1(5e674305267e7e20172c97b5b85f6b58ce51962c) ) + ROM_LOAD32_BYTE( "mod_5-1_3sw_5a04.ic06", 0xc0003, 0x10000, CRC(44275bc9) SHA1(72bfc098561e47f2820c676e551e8eaa402c88fc) ) ROM_REGION( 0x100, "proms", 0 ) // PROMs (function unknown) ROM_LOAD( "mod_51-3_502_82s129.ic10", 0x000, 0x100, CRC(15085e44) SHA1(646e7100fcb112594023cf02be036bd3d42cc13c) ) @@ -190,7 +446,24 @@ ROM_START( shadowwm ) ROM_LOAD( "mod_51-3_503_gal16v8.ic46", 0x000, 0x117, CRC(11470ea1) SHA1(cfcafbcc7e55be717348f895df61e144fdd0cc9b) ) ROM_END + +void shadoww_ms_state::init_gfx() +{ + uint8_t *src = memregion("tiles")->base(); + int const len = 0x100000; + + // rearrange gfx + { + std::vector<uint8_t> buffer(len); + for (int i = 0;i < len; i++) + { + buffer[i] = src[bitswap<24>(i, 23, 22, 21, 20, 19, 18, 17, 16, 15, 5, 6, 14, 13, 12, 11, 10, 9, 8, 7, 4, 3, 2, 1, 0)]; + } + std::copy(buffer.begin(), buffer.end(), &src[0]); + } +} + } // anonymous namespace -GAME( 1988, shadowwm, shadoww, shadowwm, shadowwm, shadoww_ms_state, empty_init, ROT0, "bootleg (Gaelco / Ervisa)", "Shadow Warriors (Modular System)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING ) +GAME( 1988, shadowwm, shadoww, shadowwm, shadowwm, shadoww_ms_state, init_gfx, ROT0, "bootleg (Gaelco / Ervisa)", "Shadow Warriors (Modular System)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_NO_SOUND | MACHINE_NOT_WORKING ) |
