summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/seibu/metlfrzr.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/seibu/metlfrzr.cpp')
-rw-r--r--src/mame/seibu/metlfrzr.cpp165
1 files changed, 82 insertions, 83 deletions
diff --git a/src/mame/seibu/metlfrzr.cpp b/src/mame/seibu/metlfrzr.cpp
index 8ca2c880143..04b79f1aa6e 100644
--- a/src/mame/seibu/metlfrzr.cpp
+++ b/src/mame/seibu/metlfrzr.cpp
@@ -43,7 +43,8 @@ public:
m_vram(*this, "vram"),
m_video_regs(*this, "vregs"),
m_palette(*this, "palette"),
- m_gfxdecode(*this, "gfxdecode")
+ m_gfxdecode(*this, "gfxdecode"),
+ m_mainbank(*this, "mainbank")
{ }
void metlfrzr(machine_config &config);
@@ -51,15 +52,20 @@ public:
void init_metlfrzr();
protected:
- virtual void machine_start() override;
- virtual void machine_reset() override;
- virtual void video_start() override;
+ virtual void machine_start() override ATTR_COLD;
+ virtual void machine_reset() override ATTR_COLD;
+ virtual void video_start() override ATTR_COLD;
private:
void legacy_bg_draw(bitmap_ind16 &bitmap, const rectangle &cliprect);
void legacy_obj_draw(bitmap_ind16 &bitmap, const rectangle &cliprect);
uint32_t screen_update_metlfrzr(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+ void output_w(uint8_t data);
+ TIMER_DEVICE_CALLBACK_MEMBER(scanline);
+ void decrypted_opcodes_map(address_map &map) ATTR_COLD;
+ void metlfrzr_map(address_map &map) ATTR_COLD;
+
required_device<cpu_device> m_maincpu;
required_shared_ptr<uint8_t> m_decrypted_opcodes;
required_shared_ptr<uint8_t> m_work_ram;
@@ -68,12 +74,10 @@ private:
required_device<palette_device> m_palette;
required_device<gfxdecode_device> m_gfxdecode;
- void output_w(uint8_t data);
- TIMER_DEVICE_CALLBACK_MEMBER(scanline);
+ required_memory_bank m_mainbank;
+
uint8_t m_fg_tilebank = 0;
bool m_rowscroll_enable = false;
- void decrypted_opcodes_map(address_map &map);
- void metlfrzr_map(address_map &map);
};
@@ -102,34 +106,29 @@ void metlfrzr_state::legacy_bg_draw(bitmap_ind16 &bitmap,const rectangle &clipre
{
gfx_element *gfx = m_gfxdecode->gfx(m_fg_tilebank);
const uint16_t vram_mask = (m_vram.length() - 1) >> 1;
- int count;
- int x_scroll_base;
- int x_scroll_shift;
- uint16_t x_scroll_value;
- x_scroll_value = m_video_regs[0x17] + ((m_video_regs[0x06] & 1) << 8);
- x_scroll_base = (x_scroll_value >> 3) * 32;
-
- for (count=0;count<32*33;count++)
+ uint16_t x_scroll_value = m_video_regs[0x17] + ((m_video_regs[0x06] & 1) << 8);
+ int x_scroll_base = (x_scroll_value >> 3) * 32;
+
+ for (int count = 0; count< 32 * 33; count++)
{
int tile_base = count;
- int y = (count % 32);
- if(y > 7 || m_rowscroll_enable == false)
+ int y = (count & 0x1f);
+ int x_scroll_shift;
+ if (y > 7 || m_rowscroll_enable == false)
{
- tile_base+= x_scroll_base;
+ tile_base += x_scroll_base;
x_scroll_shift = (x_scroll_value & 7);
}
else
x_scroll_shift = 0;
tile_base &= vram_mask;
- int x = (count / 32);
-
+ int x = (count >> 5);
- uint16_t tile = m_vram[tile_base*2+0] + ((m_vram[tile_base*2+1] & 0xf0) << 4);
- uint8_t color = m_vram[tile_base*2+1] & 0xf;
+ const uint16_t tile = m_vram[tile_base * 2 + 0] + ((m_vram[tile_base * 2 + 1] & 0xf0) << 4);
+ const uint8_t color = m_vram[tile_base * 2 + 1] & 0xf;
- gfx->transpen(bitmap,cliprect,tile,color,0,0,x*8-x_scroll_shift,y*8,0xf);
+ gfx->transpen(bitmap, cliprect, tile, color, 0, 0, x * 8 - x_scroll_shift, y * 8, 0xf);
}
-
}
/*
@@ -149,21 +148,20 @@ void metlfrzr_state::legacy_obj_draw(bitmap_ind16 &bitmap,const rectangle &clipr
{
gfx_element *gfx_2 = m_gfxdecode->gfx(2);
gfx_element *gfx_3 = m_gfxdecode->gfx(3);
- int count;
- uint8_t *base_spriteram = m_work_ram + 0xe00;
+ uint8_t const *const base_spriteram = m_work_ram + 0xe00;
- for(count=0x200-4;count>-1;count-=4)
+ for (int count = 0x200 - 4; count > -1; count -= 4)
{
- gfx_element *cur_gfx = base_spriteram[count+1] & 0x40 ? gfx_3 : gfx_2;
- uint8_t tile_bank = (base_spriteram[count+1] & 0x30) >> 4;
- uint16_t tile = base_spriteram[count] | (tile_bank << 8);
- uint8_t color = base_spriteram[count+1] & 0xf;
- int y = base_spriteram[count+2];
- int x = base_spriteram[count+3];
- if(base_spriteram[count+1] & 0x80)
- x-=256;
-
- cur_gfx->transpen(bitmap,cliprect,tile,color,0,0,x,y,0xf);
+ gfx_element *cur_gfx = base_spriteram[count + 1] & 0x40 ? gfx_3 : gfx_2;
+ const uint8_t tile_bank = (base_spriteram[count + 1] & 0x30) >> 4;
+ const uint16_t tile = base_spriteram[count] | (tile_bank << 8);
+ const uint8_t color = base_spriteram[count + 1] & 0xf;
+ int y = base_spriteram[count + 2];
+ int x = base_spriteram[count + 3];
+ if (BIT(base_spriteram[count + 1], 7))
+ x -= 256;
+
+ cur_gfx->transpen(bitmap, cliprect, tile, color, 0, 0, x, y, 0xf);
}
}
@@ -171,8 +169,8 @@ uint32_t metlfrzr_state::screen_update_metlfrzr(screen_device &screen, bitmap_in
{
bitmap.fill(m_palette->black_pen(), cliprect);
- legacy_bg_draw(bitmap,cliprect);
- legacy_obj_draw(bitmap,cliprect);
+ legacy_bg_draw(bitmap, cliprect);
+ legacy_obj_draw(bitmap, cliprect);
return 0;
}
@@ -185,11 +183,11 @@ void metlfrzr_state::output_w(uint8_t data)
// bit 1: enabled during gameplay, rowscroll enable?
// bit 0: enabled , unknown purpose (lamp?)
// TODO: bits 1-0 might actually be sprite DMA enable mask/request
- machine().bookkeeping().coin_lockout_w(1, BIT(data,6) );
- machine().bookkeeping().coin_lockout_w(0, BIT(data,5) );
+ machine().bookkeeping().coin_lockout_w(1, BIT(data, 6));
+ machine().bookkeeping().coin_lockout_w(0, BIT(data, 5));
m_fg_tilebank = (data & 0x10) >> 4;
- membank("bank1")->set_entry((data & 0xc) >> 2);
- m_rowscroll_enable = bool(BIT(data,1));
+ m_mainbank->set_entry((data & 0xc) >> 2);
+ m_rowscroll_enable = bool(BIT(data, 1));
// popmessage("%02x %02x",m_fg_tilebank,data & 3);
}
@@ -197,7 +195,7 @@ void metlfrzr_state::output_w(uint8_t data)
void metlfrzr_state::metlfrzr_map(address_map &map)
{
map(0x0000, 0x7fff).rom();
- map(0x8000, 0xbfff).bankr("bank1");
+ map(0x8000, 0xbfff).bankr(m_mainbank);
map(0xc000, 0xcfff).ram().share(m_vram);
map(0xd000, 0xd1ff).ram().w(m_palette, FUNC(palette_device::write_indirect)).share("palette");
map(0xd200, 0xd3ff).ram().w(m_palette, FUNC(palette_device::write_indirect_ext)).share("palette_ext");
@@ -209,7 +207,7 @@ void metlfrzr_state::metlfrzr_map(address_map &map)
map(0xd602, 0xd602).portr("START");
map(0xd603, 0xd603).portr("DSW1");
map(0xd604, 0xd604).portr("DSW2");
- map(0xd600, 0xd61f).writeonly().share("vregs");
+ map(0xd600, 0xd61f).writeonly().share(m_video_regs);
map(0xd700, 0xd700).w(FUNC(metlfrzr_state::output_w));
map(0xd710, 0xd710).w("t5182", FUNC(t5182_device::sound_irq_w));
@@ -220,14 +218,14 @@ void metlfrzr_state::metlfrzr_map(address_map &map)
map(0xd800, 0xdfff).ram();
map(0xe000, 0xefff).ram();
- map(0xf000, 0xffff).ram().share("wram");
+ map(0xf000, 0xffff).ram().share(m_work_ram);
}
void metlfrzr_state::decrypted_opcodes_map(address_map &map)
{
- map(0x0000, 0x7fff).rom().share("decrypted_opcodes");
- map(0x8000, 0xbfff).bankr("bank1");
- map(0xf000, 0xffff).ram().share("wram"); // executes code at 0xf5d5
+ map(0x0000, 0x7fff).rom().share(m_decrypted_opcodes);
+ map(0x8000, 0xbfff).bankr(m_mainbank);
+ map(0xf000, 0xffff).ram().share(m_work_ram); // executes code at 0xf5d5
}
@@ -326,13 +324,12 @@ INPUT_PORTS_END
void metlfrzr_state::machine_start()
{
- membank("bank1")->configure_entries(0, 4, memregion("maincpu")->base() + 0x10000, 0x4000);
+ m_mainbank->configure_entries(0, 4, memregion("maincpu")->base() + 0x10000, 0x4000);
}
void metlfrzr_state::machine_reset()
{
- membank("bank1")->set_entry(0);
-
+ m_mainbank->set_entry(0);
}
@@ -360,39 +357,41 @@ static const gfx_layout sprite_layout =
static GFXDECODE_START(gfx_metlfrzr)
- GFXDECODE_ENTRY("gfx1", 0, tile_layout, 0x100, 16)
- GFXDECODE_ENTRY("gfx2", 0, tile_layout, 0x100, 16)
- GFXDECODE_ENTRY("gfx3", 0, sprite_layout, 0, 16)
- GFXDECODE_ENTRY("gfx4", 0, sprite_layout, 0, 16)
+ GFXDECODE_ENTRY("tiles1", 0, tile_layout, 0x100, 16)
+ GFXDECODE_ENTRY("tiles2", 0, tile_layout, 0x100, 16)
+ GFXDECODE_ENTRY("sprites1", 0, sprite_layout, 0, 16)
+ GFXDECODE_ENTRY("sprites2", 0, sprite_layout, 0, 16)
GFXDECODE_END
TIMER_DEVICE_CALLBACK_MEMBER(metlfrzr_state::scanline)
{
int scanline = param;
- if(scanline == 240) // vblank-out irq
- m_maincpu->set_input_line_and_vector(0, HOLD_LINE,0xd7); /* Z80 - RST 10h */
+ if (scanline == 240) // vblank-out irq
+ m_maincpu->set_input_line_and_vector(0, HOLD_LINE, 0xd7); // Z80 - RST 10h
// TODO: check this irq.
- if(scanline == 0) // vblank-in irq
- m_maincpu->set_input_line_and_vector(0, HOLD_LINE,0xcf); /* Z80 - RST 08h */
+ if (scanline == 0) // vblank-in irq
+ m_maincpu->set_input_line_and_vector(0, HOLD_LINE, 0xcf); // Z80 - RST 08h
}
void metlfrzr_state::metlfrzr(machine_config &config)
{
- /* basic machine hardware */
+ // basic machine hardware
Z80(config, m_maincpu, XTAL(12'000'000) / 2);
m_maincpu->set_addrmap(AS_PROGRAM, &metlfrzr_state::metlfrzr_map);
m_maincpu->set_addrmap(AS_OPCODES, &metlfrzr_state::decrypted_opcodes_map);
TIMER(config, "scantimer").configure_scanline(FUNC(metlfrzr_state::scanline), "screen", 0, 1);
- T5182(config, "t5182", 0);
+ t5182_device &t5182(T5182(config, "t5182", XTAL(14'318'181)/4));
+ t5182.ym_read_callback().set("ymsnd", FUNC(ym2151_device::read));
+ t5182.ym_write_callback().set("ymsnd", FUNC(ym2151_device::write));
PALETTE(config, m_palette).set_format(palette_device::xBGR_444, 0x200).set_indirect_entries(256 * 2);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_metlfrzr);
- /* video hardware */
+ // video hardware
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
screen.set_refresh_hz(60);
screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
@@ -401,10 +400,10 @@ void metlfrzr_state::metlfrzr(machine_config &config)
screen.set_screen_update(FUNC(metlfrzr_state::screen_update_metlfrzr));
screen.set_palette(m_palette);
- /* sound hardware */
+ // sound hardware
SPEAKER(config, "mono").front_center();
- ym2151_device &ymsnd(YM2151(config, "ymsnd", XTAL(14'318'181) / 4)); /* 3.579545 MHz */
+ ym2151_device &ymsnd(YM2151(config, "ymsnd", XTAL(14'318'181) / 4)); // 3.579545 MHz
ymsnd.irq_handler().set("t5182", FUNC(t5182_device::ym2151_irq_handler));
ymsnd.add_route(0, "mono", 0.5);
ymsnd.add_route(1, "mono", 0.5);
@@ -417,22 +416,22 @@ ROM_START(metlfrzr)
ROM_LOAD("1.15j", 0x00000, 0x08000, CRC(f59b5fa2) SHA1(6033967dad5e64f45afbcb1b45c8eb79e0787afb))
ROM_LOAD("2.14j", 0x10000, 0x10000, CRC(21ecc248) SHA1(2fccf7db73890faf7c489bfc43c88ded54d5052d))
- ROM_REGION(0x8000, "t5182_z80", 0) /* Toshiba T5182 external data ROM */
+ ROM_REGION(0x8000, "t5182:external", 0) // Toshiba T5182 external data ROM
ROM_LOAD("3.4h", 0x0000, 0x8000, CRC(36f88e54) SHA1(5cbea56c7e547c353ae2f9256caaceb20e5e8503))
- ROM_REGION(0x20000, "gfx1", 0)
+ ROM_REGION(0x20000, "tiles1", 0)
ROM_LOAD16_BYTE("10.5a", 0x00001, 0x10000, CRC(3313e74a) SHA1(8622dfb5c013173d5bb037254f4c23b1282404e1))
ROM_LOAD16_BYTE("12.7a", 0x00000, 0x10000, CRC(6da5fda9) SHA1(9d7b0b26598f31da589fece3535a4d1405b03fc2))
- ROM_REGION(0x20000, "gfx2", 0)
+ ROM_REGION(0x20000, "tiles2", 0)
ROM_LOAD16_BYTE("11.6a", 0x00001, 0x10000, CRC(fa6490b8) SHA1(9a4c1e09b9e8fb256fec0a5ed120fece8a12e1c8))
ROM_LOAD16_BYTE("13.9a", 0x00000, 0x10000, CRC(a4f689ec) SHA1(e58bfede3fabf4cfca76c20aafb3e9fb604777c9))
- ROM_REGION(0x20000, "gfx3", 0)
+ ROM_REGION(0x20000, "sprites1", 0)
ROM_LOAD16_BYTE("14.13a", 0x00001, 0x10000, CRC(a9cd5225) SHA1(f3d5e29ee08fb563fdc1af3c64128f2cd2feb987))
ROM_LOAD16_BYTE("16.11a", 0x00000, 0x10000, CRC(92f2cb49) SHA1(498021d94b0fde216207076491702af2324a2dcc))
- ROM_REGION(0x20000, "gfx4", 0)
+ ROM_REGION(0x20000, "sprites2", 0)
ROM_LOAD16_BYTE("15.12a", 0x00001, 0x10000, CRC(ce5c4c8b) SHA1(2351d66ba51e80097ce53bfd448ac24901844cda))
ROM_LOAD16_BYTE("17.10a", 0x00000, 0x10000, CRC(3fec33f7) SHA1(af086ba30fc4521a0114da2824f5baa04d225a89))
@@ -449,32 +448,32 @@ ROM_END
void metlfrzr_state::init_metlfrzr()
{
- // same as cshooter.cpp
+ // same as seibu/airraid.cpp
uint8_t *rom = memregion("maincpu")->base();
- for (int A = 0x0000;A < 0x8000;A++)
+ for (int A = 0x0000; A < 0x8000; A++)
{
- /* decode the opcodes */
+ // decode the opcodes
m_decrypted_opcodes[A] = rom[A];
- if (BIT(A,5) && !BIT(A,3))
+ if (BIT(A, 5) && !BIT(A, 3))
m_decrypted_opcodes[A] ^= 0x40;
- if (BIT(A,10) && !BIT(A,9) && BIT(A,3))
+ if (BIT(A, 10) && !BIT(A, 9) && BIT(A, 3))
m_decrypted_opcodes[A] ^= 0x20;
- if ((BIT(A,10) ^ BIT(A,9)) && BIT(A,1))
+ if ((BIT(A, 10) ^ BIT(A, 9)) && BIT(A, 1))
m_decrypted_opcodes[A] ^= 0x02;
- if (BIT(A,9) || !BIT(A,5) || BIT(A,3))
- m_decrypted_opcodes[A] = bitswap<8>(m_decrypted_opcodes[A],7,6,1,4,3,2,5,0);
+ if (BIT(A, 9) || !BIT(A, 5) || BIT(A, 3))
+ m_decrypted_opcodes[A] = bitswap<8>(m_decrypted_opcodes[A], 7, 6, 1, 4, 3, 2, 5, 0);
- /* decode the data */
- if (BIT(A,5))
+ // decode the data
+ if (BIT(A, 5))
rom[A] ^= 0x40;
- if (BIT(A,9) || !BIT(A,5))
- rom[A] = bitswap<8>(rom[A],7,6,1,4,3,2,5,0);
+ if (BIT(A, 9) || !BIT(A, 5))
+ rom[A] = bitswap<8>(rom[A], 7, 6, 1, 4, 3, 2, 5, 0);
}
}