diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/mame/drivers/m72.c | 32 | ||||
-rw-r--r-- | src/mame/includes/m72.h | 23 | ||||
-rw-r--r-- | src/mame/video/m72.c | 108 |
3 files changed, 82 insertions, 81 deletions
diff --git a/src/mame/drivers/m72.c b/src/mame/drivers/m72.c index fc6e659fe88..4e973efc1e8 100644 --- a/src/mame/drivers/m72.c +++ b/src/mame/drivers/m72.c @@ -123,7 +123,7 @@ Ken-Go / Lightning Swords 1991 M84-A-A + M84-B-B Encrypted Hammering Harry TODO: -- majtitle_gfx_ctrl_w is unknown, it seems to be used to disable rowscroll, +- m82_gfx_ctrl_w is unknown, it seems to be used to disable rowscroll, and maybe other things - Maybe there is a layer enable register, e.g. nspirit shows (for an instant) @@ -1038,7 +1038,7 @@ static ADDRESS_MAP_START( poundfor_portmap, AS_IO, 16, m72_state ) AM_RANGE(0x86, 0x87) AM_WRITE(scrollx2_w) ADDRESS_MAP_END -static ADDRESS_MAP_START( majtitle_portmap, AS_IO, 16, m72_state ) +static ADDRESS_MAP_START( m82_portmap, AS_IO, 16, m72_state ) AM_RANGE(0x00, 0x01) AM_READ_PORT("IN0") AM_RANGE(0x02, 0x03) AM_READ_PORT("IN1") AM_RANGE(0x04, 0x05) AM_READ_PORT("DSW") @@ -1049,7 +1049,10 @@ static ADDRESS_MAP_START( majtitle_portmap, AS_IO, 16, m72_state ) AM_RANGE(0x82, 0x83) AM_WRITE(scrollx1_w) AM_RANGE(0x84, 0x85) AM_WRITE(scrolly2_w) AM_RANGE(0x86, 0x87) AM_WRITE(scrollx2_w) - AM_RANGE(0x8e, 0x8f) AM_WRITE(majtitle_gfx_ctrl_w) + + // these ports control the tilemap sizes, rowscroll etc. that m82 has, exact bit usage not known (maybe one for each layer?) + AM_RANGE(0x8c, 0x8d) AM_WRITE(m82_tm_ctrl_w) + AM_RANGE(0x8e, 0x8f) AM_WRITE(m82_gfx_ctrl_w) ADDRESS_MAP_END static ADDRESS_MAP_START( m81_portmap, AS_IO, 16, m72_state ) @@ -2071,12 +2074,12 @@ M82-A-A as the top board M82-B-A and as the bottom board */ -static MACHINE_CONFIG_START( m82_large, m72_state ) +static MACHINE_CONFIG_START( m82, m72_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", V30,MASTER_CLOCK/2/2) /* 16 MHz external freq (8MHz internal) */ MCFG_CPU_PROGRAM_MAP(majtitle_map) - MCFG_CPU_IO_MAP(majtitle_portmap) + MCFG_CPU_IO_MAP(m82_portmap) MCFG_CPU_IRQ_ACKNOWLEDGE_DEVICE("upd71059c", pic8259_device, inta_cb) MCFG_CPU_ADD("soundcpu", Z80, SOUND_CLOCK) @@ -2093,23 +2096,14 @@ static MACHINE_CONFIG_START( m82_large, m72_state ) MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK/4, 512, 64, 448, 284, 0, 256) - MCFG_SCREEN_UPDATE_DRIVER(m72_state, screen_update_majtitle) + MCFG_SCREEN_UPDATE_DRIVER(m72_state, screen_update_m82) MCFG_SCREEN_PALETTE("palette") - MCFG_VIDEO_START_OVERRIDE(m72_state,m82_large) + MCFG_VIDEO_START_OVERRIDE(m72_state,m82) MCFG_FRAGMENT_ADD(m72_audio_chips) MACHINE_CONFIG_END -// this is a conversion of Major Title -static MACHINE_CONFIG_DERIVED( m82_small, m82_large ) // m82 - MCFG_VIDEO_START_OVERRIDE(m72_state,m82_small) -MACHINE_CONFIG_END - - - - - /* Pound for Pound uses M85-A-B / M85-B @@ -3722,8 +3716,8 @@ GAME( 1989, rtype2, 0, rtype2, rtype2, driver_device, 0, GAME( 1989, rtype2j, rtype2, rtype2, rtype2, driver_device, 0, ROT0, "Irem", "R-Type II (Japan)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) GAME( 1989, rtype2jc, rtype2, rtype2, rtype2, driver_device, 0, ROT0, "Irem", "R-Type II (Japan, revision C)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) -GAME( 1990, majtitle, 0, m82_large, rtype2, driver_device, 0, ROT0, "Irem", "Major Title (World)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) // M82-A-A + M82-B-A -GAME( 1990, majtitlej, majtitle, m82_large, rtype2, driver_device, 0, ROT0, "Irem", "Major Title (Japan)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) // ^ +GAME( 1990, majtitle, 0, m82, rtype2, driver_device, 0, ROT0, "Irem", "Major Title (World)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) // M82-A-A + M82-B-A +GAME( 1990, majtitlej, majtitle, m82, rtype2, driver_device, 0, ROT0, "Irem", "Major Title (Japan)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) // ^ GAME( 1990, hharry, 0, m81_hharry, m81_hharry,driver_device,0, ROT0, "Irem", "Hammerin' Harry (World, M81)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) GAME( 1990, hharryu, hharry, hharryu, hharry, driver_device, 0, ROT0, "Irem America", "Hammerin' Harry (US, M84)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) @@ -3734,7 +3728,7 @@ GAME( 1990, poundfor, 0, poundfor, poundfor, driver_device, 0, GAME( 1990, poundforj, poundfor, poundfor, poundfor, driver_device, 0, ROT270, "Irem", "Pound for Pound (Japan)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) // ^ GAME( 1990, poundforu, poundfor, poundfor, poundfor, driver_device, 0, ROT270, "Irem America", "Pound for Pound (US)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) // ^ -GAME( 1990, airduel, 0, m82_small, airduel, driver_device, 0, ROT270, "Irem", "Air Duel (World, M82-A-A + M82-B-A)", MACHINE_SUPPORTS_SAVE ) // Major Title conversion +GAME( 1990, airduel, 0, m82, airduel, driver_device, 0, ROT270, "Irem", "Air Duel (World, M82-A-A + M82-B-A)", MACHINE_SUPPORTS_SAVE ) // Major Title conversion GAME( 1990, airduelm72, airduel, m72, airduel, m72_state, airduelm72, ROT270, "Irem", "Air Duel (Japan, M72)", MACHINE_SUPPORTS_SAVE ) GAME( 1991, cosmccop, 0, cosmccop, gallop, driver_device, 0, ROT0, "Irem", "Cosmic Cop (World)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/includes/m72.h b/src/mame/includes/m72.h index f023d0b653b..692d2485bc9 100644 --- a/src/mame/includes/m72.h +++ b/src/mame/includes/m72.h @@ -37,7 +37,7 @@ public: m_spriteram(*this, "spriteram"), m_videoram1(*this, "videoram1"), m_videoram2(*this, "videoram2"), - m_majtitle_rowscrollram(*this, "majtitle_rowscr"), + m_m82_rowscrollram(*this, "majtitle_rowscr"), m_spriteram2(*this, "spriteram2"), m_soundram(*this, "soundram"), m_generic_paletteram_16(*this, "paletteram"), @@ -45,7 +45,9 @@ public: m_upd71059c(*this, "upd71059c"), m_fg_source(0), m_bg_source(0), - m_m81_b_b_j3(*this, "JumperJ3") + m_m81_b_b_j3(*this, "JumperJ3"), + m_m82_rowscroll(0), + m_m82_tmcontrol(0) { } required_device<cpu_device> m_maincpu; @@ -60,7 +62,7 @@ public: required_shared_ptr<UINT16> m_spriteram; required_shared_ptr<UINT16> m_videoram1; required_shared_ptr<UINT16> m_videoram2; - optional_shared_ptr<UINT16> m_majtitle_rowscrollram; + optional_shared_ptr<UINT16> m_m82_rowscrollram; optional_shared_ptr<UINT16> m_spriteram2; optional_shared_ptr<UINT8> m_soundram; required_shared_ptr<UINT16> m_generic_paletteram_16; @@ -75,6 +77,7 @@ public: UINT16 *m_buffered_spriteram; tilemap_t *m_fg_tilemap; tilemap_t *m_bg_tilemap; + tilemap_t *m_bg_tilemap_large; INT32 m_scrollx1; INT32 m_scrolly1; INT32 m_scrollx2; @@ -90,7 +93,8 @@ public: int m_diff[4]; // majtitle specific - int m_majtitle_rowscroll; + int m_m82_rowscroll; + UINT16 m_m82_tmcontrol; // m72_i8751 specific UINT8 m_mcu_snd_cmd_latch; @@ -141,7 +145,8 @@ public: DECLARE_WRITE16_MEMBER(gallop_sample_trigger_w); DECLARE_READ16_MEMBER(poundfor_trackball_r); DECLARE_WRITE16_MEMBER(rtype2_port02_w); - DECLARE_WRITE16_MEMBER(majtitle_gfx_ctrl_w); + DECLARE_WRITE16_MEMBER(m82_gfx_ctrl_w); + DECLARE_WRITE16_MEMBER(m82_tm_ctrl_w); TILE_GET_INFO_MEMBER(get_bg_tile_info); TILE_GET_INFO_MEMBER(get_fg_tile_info); @@ -149,7 +154,7 @@ public: TILE_GET_INFO_MEMBER(rtype2_get_bg_tile_info); TILE_GET_INFO_MEMBER(rtype2_get_fg_tile_info); - TILEMAP_MAPPER_MEMBER(majtitle_scan_rows); + TILEMAP_MAPPER_MEMBER(m82_scan_rows); void machine_start(); void machine_reset(); @@ -157,9 +162,7 @@ public: DECLARE_VIDEO_START(xmultipl); DECLARE_VIDEO_START(hharry); DECLARE_VIDEO_START(rtype2); - DECLARE_VIDEO_START(m82_common); - DECLARE_VIDEO_START(m82_small); - DECLARE_VIDEO_START(m82_large); + DECLARE_VIDEO_START(m82); DECLARE_VIDEO_START(hharryu); DECLARE_VIDEO_START(poundfor); DECLARE_MACHINE_START(kengo); @@ -184,7 +187,7 @@ public: UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); UINT32 screen_update_m81(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - UINT32 screen_update_majtitle(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + UINT32 screen_update_m82(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); inline void m72_m81_get_tile_info(tile_data &tileinfo,int tile_index,const UINT16 *vram,int gfxnum); inline void m82_m84_get_tile_info(tile_data &tileinfo,int tile_index,const UINT16 *vram,int gfxnum); void register_savestate(); diff --git a/src/mame/video/m72.c b/src/mame/video/m72.c index b8de6d823f4..34faa8913d5 100644 --- a/src/mame/video/m72.c +++ b/src/mame/video/m72.c @@ -170,68 +170,54 @@ VIDEO_START_MEMBER(m72_state,hharry) } -// M82 -VIDEO_START_MEMBER(m72_state, m82_common) -{ - m_fg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(m72_state::rtype2_get_fg_tile_info),this),TILEMAP_SCAN_ROWS,8,8,64,64); - - m_buffered_spriteram = auto_alloc_array(machine(), UINT16, m_spriteram.bytes()/2); - - m_fg_tilemap->set_transmask(0,0xffff,0x0001); - m_fg_tilemap->set_transmask(1,0x00ff,0xff01); - m_fg_tilemap->set_transmask(2,0x0001,0xffff); - - m_bg_tilemap->set_transmask(0,0xffff,0x0000); - m_bg_tilemap->set_transmask(1,0x00ff,0xff00); - m_bg_tilemap->set_transmask(2,0x0001,0xfffe); - - memset(m_buffered_spriteram,0,m_spriteram.bytes()); - - register_savestate(); - save_item(NAME(m_majtitle_rowscroll)); -} - /* Major Title has a larger background RAM, and rowscroll */ // the Air Duel conversion on the same PCB does not, is it jumper selectable, or a register, or a different RAM chip? -TILEMAP_MAPPER_MEMBER(m72_state::majtitle_scan_rows) +TILEMAP_MAPPER_MEMBER(m72_state::m82_scan_rows) { /* logical (col,row) -> memory offset */ return row*256 + col; } -VIDEO_START_MEMBER(m72_state,m82_large) +VIDEO_START_MEMBER(m72_state,m82) { + m_fg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(m72_state::rtype2_get_fg_tile_info),this),TILEMAP_SCAN_ROWS,8,8,64,64); + m_bg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(m72_state::rtype2_get_bg_tile_info),this),TILEMAP_SCAN_ROWS,8,8,64,64); // The tilemap can be 256x64, but seems to be used at 128x64 (scroll wraparound). // The layout ramains 256x64, the right half is just not displayed. -// m_bg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(m72_state::rtype2_get_bg_tile_info),this),TILEMAP_SCAN_ROWS,8,8,256,64); - m_bg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(m72_state::rtype2_get_bg_tile_info),this),tilemap_mapper_delegate(FUNC(m72_state::majtitle_scan_rows),this),8,8,128,64); + m_bg_tilemap_large = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(m72_state::rtype2_get_bg_tile_info),this),tilemap_mapper_delegate(FUNC(m72_state::m82_scan_rows),this),8,8,128,64); - VIDEO_START_CALL_MEMBER(m82_common); + m_fg_tilemap->set_transmask(0,0xffff,0x0001); + m_fg_tilemap->set_transmask(1,0x00ff,0xff01); + m_fg_tilemap->set_transmask(2,0x0001,0xffff); + + m_bg_tilemap->set_transmask(0,0xffff,0x0000); + m_bg_tilemap->set_transmask(1,0x00ff,0xff00); + m_bg_tilemap->set_transmask(2,0x0001,0xfffe); + + m_bg_tilemap_large->set_transmask(0,0xffff,0x0000); + m_bg_tilemap_large->set_transmask(1,0x00ff,0xff00); + m_bg_tilemap_large->set_transmask(2,0x0001,0xfffe); m_fg_tilemap->set_scrolldx(4,0); m_fg_tilemap->set_scrolldy(-128,-128); - m_bg_tilemap->set_scrolldx(4,0); + m_bg_tilemap->set_scrolldx(6-256,0); m_bg_tilemap->set_scrolldy(-128,-128); -} - -VIDEO_START_MEMBER(m72_state, m82_small) -{ -// Air Duel expects the regular tilemap size - m_bg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(m72_state::rtype2_get_bg_tile_info),this),TILEMAP_SCAN_ROWS,8,8,64,64); - VIDEO_START_CALL_MEMBER(m82_common); + m_bg_tilemap_large->set_scrolldx(4,0); + m_bg_tilemap_large->set_scrolldy(-128,-128); -// why do the offsets also differ? - m_fg_tilemap->set_scrolldx(4,3); - m_fg_tilemap->set_scrolldy(-128,-128); + m_buffered_spriteram = auto_alloc_array(machine(), UINT16, m_spriteram.bytes()/2); + memset(m_buffered_spriteram,0,m_spriteram.bytes()); - m_bg_tilemap->set_scrolldx(6-256,0); - m_bg_tilemap->set_scrolldy(-128,-128); + register_savestate(); + save_item(NAME(m_m82_rowscroll)); + save_item(NAME(m_m82_tmcontrol)); } + // M84 VIDEO_START_MEMBER(m72_state,rtype2) { @@ -349,6 +335,11 @@ WRITE16_MEMBER(m72_state::videoram2_w) { COMBINE_DATA(&m_videoram2[offset]); m_bg_tilemap->mark_tile_dirty(offset/2); + + // m82 has selectable tilemap size + if (m_bg_tilemap_large) + m_bg_tilemap_large->mark_tile_dirty(offset/2); + } WRITE16_MEMBER(m72_state::irq_line_w) @@ -432,13 +423,21 @@ WRITE16_MEMBER(m72_state::rtype2_port02_w) /* the following is mostly a kludge. This register seems to be used for something else */ -WRITE16_MEMBER(m72_state::majtitle_gfx_ctrl_w) +WRITE16_MEMBER(m72_state::m82_gfx_ctrl_w) { if (ACCESSING_BITS_8_15) { - if (data & 0xff00) m_majtitle_rowscroll = 1; - else m_majtitle_rowscroll = 0; + if (data & 0xff00) m_m82_rowscroll = 1; + else m_m82_rowscroll = 0; } +// printf("m82_gfx_ctrl_w %04x\n", data); + +} + +WRITE16_MEMBER(m72_state::m82_tm_ctrl_w) +{ + COMBINE_DATA(&m_m82_tmcontrol); + printf("tmcontrol %04x\n", m_m82_tmcontrol); } @@ -585,10 +584,15 @@ UINT32 m72_state::screen_update_m81(screen_device &screen, bitmap_ind16 &bitmap, } -UINT32 m72_state::screen_update_majtitle(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +UINT32 m72_state::screen_update_m82(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { int i; + tilemap_t* tm; + + if (m_m82_tmcontrol & 0x40) tm = m_bg_tilemap_large; + else tm = m_bg_tilemap; + if (m_video_off) { @@ -599,25 +603,25 @@ UINT32 m72_state::screen_update_majtitle(screen_device &screen, bitmap_ind16 &bi m_fg_tilemap->set_scrollx(0,m_scrollx1); m_fg_tilemap->set_scrolly(0,m_scrolly1); - if (m_majtitle_rowscroll) + if (m_m82_rowscroll) { - m_bg_tilemap->set_scroll_rows(512); + tm->set_scroll_rows(512); for (i = 0;i < 512;i++) - m_bg_tilemap->set_scrollx((i+m_scrolly2)&0x1ff, - 256 + m_majtitle_rowscrollram[i]); + tm->set_scrollx((i+m_scrolly2)&0x1ff, + 256 + m_m82_rowscrollram[i]); } else { - m_bg_tilemap->set_scroll_rows(1); - m_bg_tilemap->set_scrollx(0,256 + m_scrollx2); + tm->set_scroll_rows(1); + tm->set_scrollx(0,256 + m_scrollx2); } - m_bg_tilemap->set_scrolly(0,m_scrolly2); - m_bg_tilemap->draw(screen, bitmap, cliprect, TILEMAP_DRAW_LAYER1,0); + tm->set_scrolly(0,m_scrolly2); + tm->draw(screen, bitmap, cliprect, TILEMAP_DRAW_LAYER1, 0); m_fg_tilemap->draw(screen, bitmap, cliprect, TILEMAP_DRAW_LAYER1,0); majtitle_draw_sprites(bitmap,cliprect); draw_sprites(bitmap,cliprect); - m_bg_tilemap->draw(screen, bitmap, cliprect, TILEMAP_DRAW_LAYER0,0); + tm->draw(screen, bitmap, cliprect, TILEMAP_DRAW_LAYER0, 0); m_fg_tilemap->draw(screen, bitmap, cliprect, TILEMAP_DRAW_LAYER0,0); return 0; } |