summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mame/drivers/m72.c32
-rw-r--r--src/mame/includes/m72.h23
-rw-r--r--src/mame/video/m72.c108
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;
}