From 99ca46275185c67405678c0978474686c5c4e69a Mon Sep 17 00:00:00 2001 From: Ivan Vangelista Date: Tue, 31 Dec 2013 16:22:45 +0000 Subject: [PATCH] Fix for MT04005 and possibly MT03976 too (NW) --- src/mame/drivers/ms32.c | 48 ++++++++++++------------- src/mame/includes/ms32.h | 24 ++++++++----- src/mame/video/ms32.c | 76 +++++++++++++++++++++------------------- 3 files changed, 79 insertions(+), 69 deletions(-) diff --git a/src/mame/drivers/ms32.c b/src/mame/drivers/ms32.c index e3f69f8b109..77c8d9dc0d0 100644 --- a/src/mame/drivers/ms32.c +++ b/src/mame/drivers/ms32.c @@ -254,74 +254,74 @@ WRITE8_MEMBER(ms32_state::ms32_nvram_w8) READ8_MEMBER(ms32_state::ms32_priram_r8) { - return m_priram_8[offset]; + return m_priram[offset]; } WRITE8_MEMBER(ms32_state::ms32_priram_w8) { - m_priram_8[offset] = data; + m_priram[offset] = data; } READ16_MEMBER(ms32_state::ms32_palram_r16) { - return m_palram_16[offset]; + return m_palram[offset]; } WRITE16_MEMBER(ms32_state::ms32_palram_w16) { - COMBINE_DATA(&m_palram_16[offset]); + COMBINE_DATA(&m_palram[offset]); } READ16_MEMBER(ms32_state::ms32_rozram_r16) { - return m_rozram_16[offset]; + return m_rozram[offset]; } WRITE16_MEMBER(ms32_state::ms32_rozram_w16) { - COMBINE_DATA(&m_rozram_16[offset]); + COMBINE_DATA(&m_rozram[offset]); m_roz_tilemap->mark_tile_dirty(offset/2); } READ16_MEMBER(ms32_state::ms32_lineram_r16) { - return m_lineram_16[offset]; + return m_lineram[offset]; } WRITE16_MEMBER(ms32_state::ms32_lineram_w16) { - COMBINE_DATA(&m_lineram_16[offset]); + COMBINE_DATA(&m_lineram[offset]); } READ16_MEMBER(ms32_state::ms32_sprram_r16) { - return m_sprram_16[offset]; + return m_sprram[offset]; } WRITE16_MEMBER(ms32_state::ms32_sprram_w16) { - COMBINE_DATA(&m_sprram_16[offset]); + COMBINE_DATA(&m_sprram[offset]); } READ16_MEMBER(ms32_state::ms32_txram_r16) { - return m_txram_16[offset]; + return m_txram[offset]; } WRITE16_MEMBER(ms32_state::ms32_txram_w16) { - COMBINE_DATA(&m_txram_16[offset]); + COMBINE_DATA(&m_txram[offset]); m_tx_tilemap->mark_tile_dirty(offset/2); } READ16_MEMBER(ms32_state::ms32_bgram_r16) { - return m_bgram_16[offset]; + return m_bgram[offset]; } WRITE16_MEMBER(ms32_state::ms32_bgram_w16) { - COMBINE_DATA(&m_bgram_16[offset]); + COMBINE_DATA(&m_bgram[offset]); m_bg_tilemap->mark_tile_dirty(offset/2); m_bg_tilemap_alt->mark_tile_dirty(offset/2); } @@ -339,18 +339,18 @@ static ADDRESS_MAP_START( ms32_map, AS_PROGRAM, 32, ms32_state ) /* RAM areas verified by testing on real hw - usually accessed at the 0xfc000000 + mirror */ AM_RANGE(0xc0000000, 0xc0007fff) AM_READWRITE8(ms32_nvram_r8, ms32_nvram_w8, 0x000000ff) AM_MIRROR(0x3c1fe000) // nvram is 8-bit wide, 0x2000 in size */ /* AM_RANGE(0xc0008000, 0xc01fffff) // mirrors of nvramram, handled above */ - AM_RANGE(0xc1180000, 0xc1187fff) AM_READWRITE8(ms32_priram_r8, ms32_priram_w8, 0x000000ff) AM_MIRROR(0x3c038000) /* priram is 8-bit wide, 0x2000 in size */ + AM_RANGE(0xc1180000, 0xc1187fff) AM_READWRITE8(ms32_priram_r8, ms32_priram_w8, 0x000000ff) AM_MIRROR(0x3c038000) AM_SHARE("priram") /* priram is 8-bit wide, 0x2000 in size */ /* AM_RANGE(0xc1188000, 0xc11bffff) // mirrors of priram, handled above */ - AM_RANGE(0xc1400000, 0xc143ffff) AM_READWRITE16(ms32_palram_r16, ms32_palram_w16, 0x0000ffff) AM_MIRROR(0x3c1c0000) /* palram is 16-bit wide, 0x20000 in size */ + AM_RANGE(0xc1400000, 0xc143ffff) AM_READWRITE16(ms32_palram_r16, ms32_palram_w16, 0x0000ffff) AM_MIRROR(0x3c1c0000) AM_SHARE("palram") /* palram is 16-bit wide, 0x20000 in size */ /* AM_RANGE(0xc1440000, 0xc145ffff) // mirrors of palram, handled above */ - AM_RANGE(0xc2000000, 0xc201ffff) AM_READWRITE16(ms32_rozram_r16, ms32_rozram_w16, 0x0000ffff) AM_MIRROR(0x3c1e0000) /* rozram is 16-bit wide, 0x10000 in size */ + AM_RANGE(0xc2000000, 0xc201ffff) AM_READWRITE16(ms32_rozram_r16, ms32_rozram_w16, 0x0000ffff) AM_MIRROR(0x3c1e0000) AM_SHARE("rozram") /* rozram is 16-bit wide, 0x10000 in size */ /* AM_RANGE(0xc2020000, 0xc21fffff) // mirrors of rozram, handled above */ - AM_RANGE(0xc2200000, 0xc2201fff) AM_READWRITE16(ms32_lineram_r16,ms32_lineram_w16,0x0000ffff) AM_MIRROR(0x3c1fe000) /* lineram is 16-bit wide, 0x1000 in size */ + AM_RANGE(0xc2200000, 0xc2201fff) AM_READWRITE16(ms32_lineram_r16,ms32_lineram_w16,0x0000ffff) AM_MIRROR(0x3c1fe000) AM_SHARE("lineram") /* lineram is 16-bit wide, 0x1000 in size */ /* AM_RANGE(0xc2202000, 0xc23fffff) // mirrors of lineram, handled above */ - AM_RANGE(0xc2800000, 0xc283ffff) AM_READWRITE16(ms32_sprram_r16, ms32_sprram_w16, 0x0000ffff) AM_MIRROR(0x3c1c0000) /* spriteram is 16-bit wide, 0x20000 in size */ + AM_RANGE(0xc2800000, 0xc283ffff) AM_READWRITE16(ms32_sprram_r16, ms32_sprram_w16, 0x0000ffff) AM_MIRROR(0x3c1c0000) AM_SHARE("sprram") /* spriteram is 16-bit wide, 0x20000 in size */ /* AM_RANGE(0xc2840000, 0xc29fffff) // mirrors of sprram, handled above */ - AM_RANGE(0xc2c00000, 0xc2c07fff) AM_READWRITE16(ms32_txram_r16, ms32_txram_w16, 0x0000ffff) AM_MIRROR(0x3c1f0000) /* txram is 16-bit wide, 0x4000 in size */ - AM_RANGE(0xc2c08000, 0xc2c0ffff) AM_READWRITE16(ms32_bgram_r16, ms32_bgram_w16, 0x0000ffff) AM_MIRROR(0x3c1f0000) /* bgram is 16-bit wide, 0x4000 in size */ + AM_RANGE(0xc2c00000, 0xc2c07fff) AM_READWRITE16(ms32_txram_r16, ms32_txram_w16, 0x0000ffff) AM_MIRROR(0x3c1f0000) AM_SHARE("txram") /* txram is 16-bit wide, 0x4000 in size */ + AM_RANGE(0xc2c08000, 0xc2c0ffff) AM_READWRITE16(ms32_bgram_r16, ms32_bgram_w16, 0x0000ffff) AM_MIRROR(0x3c1f0000) AM_SHARE("bgram") /* bgram is 16-bit wide, 0x4000 in size */ /* AM_RANGE(0xc2c10000, 0xc2dfffff) // mirrors of txram / bg, handled above */ AM_RANGE(0xc2e00000, 0xc2e1ffff) AM_RAM AM_SHARE("mainram") AM_MIRROR(0x3c0e0000) /* mainram is 32-bit wide, 0x20000 in size */ AM_RANGE(0xc3e00000, 0xc3ffffff) AM_ROMBANK("bank1") AM_MIRROR(0x3c000000) // ROM is 32-bit wide, 0x200000 in size */ @@ -381,12 +381,12 @@ ADDRESS_MAP_END WRITE16_MEMBER(ms32_state::ms32_extra_w16) { - COMBINE_DATA(&m_f1superb_extraram_16[offset]); + COMBINE_DATA(&m_f1superb_extraram[offset]); m_extra_tilemap->mark_tile_dirty(offset/2); } READ16_MEMBER(ms32_state::ms32_extra_r16) { - return m_f1superb_extraram_16[offset]; + return m_f1superb_extraram[offset]; } WRITE32_MEMBER(ms32_state::ms32_irq2_guess_w) @@ -417,7 +417,7 @@ static ADDRESS_MAP_START( f1superb_map, AS_PROGRAM, 32, ms32_state ) AM_RANGE(0xfd140000, 0xfd143fff) AM_RAM // used when you start enabling fpu ints AM_RANGE(0xfd144000, 0xfd145fff) AM_RAM // same data here - AM_RANGE(0xfdc00000, 0xfdc007ff) AM_READWRITE16(ms32_extra_r16, ms32_extra_w16, 0x0000ffff) // definitely line ram + AM_RANGE(0xfdc00000, 0xfdc007ff) AM_READWRITE16(ms32_extra_r16, ms32_extra_w16, 0x0000ffff) AM_SHARE("f1sb_extraram") // definitely line ram AM_RANGE(0xfde00000, 0xfde01fff) AM_RAM // scroll info for lineram? AM_IMPORT_FROM(ms32_map) diff --git a/src/mame/includes/ms32.h b/src/mame/includes/ms32.h index 058feff76a9..c30067dd04f 100644 --- a/src/mame/includes/ms32.h +++ b/src/mame/includes/ms32.h @@ -8,6 +8,14 @@ public: m_tx_scroll(*this, "tx_scroll"), m_bg_scroll(*this, "bg_scroll"), m_mahjong_input_select(*this, "mahjong_select"), + m_priram(*this, "priram", 32), + m_palram(*this, "palram", 32), + m_rozram(*this, "rozram", 32), + m_lineram(*this, "lineram", 32), + m_sprram(*this, "sprram", 32), + m_txram(*this, "txram", 32), + m_bgram(*this, "bgram", 32), + m_f1superb_extraram(*this, "f1sb_extraram", 32), m_maincpu(*this, "maincpu"), m_audiocpu(*this, "audiocpu") { } @@ -16,6 +24,14 @@ public: required_shared_ptr m_tx_scroll; required_shared_ptr m_bg_scroll; required_shared_ptr m_mahjong_input_select; + required_shared_ptr m_priram; + required_shared_ptr m_palram; + required_shared_ptr m_rozram; + required_shared_ptr m_lineram; + required_shared_ptr m_sprram; + required_shared_ptr m_txram; + required_shared_ptr m_bgram; + optional_shared_ptr m_f1superb_extraram; UINT8 *m_nvram_8; UINT32 m_to_main; UINT16 m_irqreq; @@ -23,15 +39,7 @@ public: tilemap_t *m_roz_tilemap; tilemap_t *m_bg_tilemap; tilemap_t *m_bg_tilemap_alt; - UINT8* m_priram_8; - UINT16* m_palram_16; - UINT16* m_rozram_16; - UINT16* m_lineram_16; - UINT16* m_sprram_16; - UINT16* m_txram_16; - UINT16* m_bgram_16; UINT32 m_tilemaplayoutcontrol; - UINT16* m_f1superb_extraram_16; tilemap_t* m_extra_tilemap; bitmap_ind16 m_temp_bitmap_tilemaps; bitmap_ind16 m_temp_bitmap_sprites; diff --git a/src/mame/video/ms32.c b/src/mame/video/ms32.c index 81f84563fb7..6f5e71e6ca7 100644 --- a/src/mame/video/ms32.c +++ b/src/mame/video/ms32.c @@ -24,8 +24,8 @@ TILE_GET_INFO_MEMBER(ms32_state::get_ms32_tx_tile_info) { int tileno, colour; - tileno = m_txram_16[tile_index *2] & 0xffff; - colour = m_txram_16[tile_index *2+1] & 0x000f; + tileno = m_txram[tile_index *2] & 0xffff; + colour = m_txram[tile_index *2+1] & 0x000f; SET_TILE_INFO_MEMBER(3,tileno,colour,0); } @@ -34,8 +34,8 @@ TILE_GET_INFO_MEMBER(ms32_state::get_ms32_roz_tile_info) { int tileno,colour; - tileno = m_rozram_16[tile_index *2] & 0xffff; - colour = m_rozram_16[tile_index *2+1] & 0x000f; + tileno = m_rozram[tile_index *2] & 0xffff; + colour = m_rozram[tile_index *2+1] & 0x000f; SET_TILE_INFO_MEMBER(1,tileno,colour,0); } @@ -44,8 +44,8 @@ TILE_GET_INFO_MEMBER(ms32_state::get_ms32_bg_tile_info) { int tileno,colour; - tileno = m_bgram_16[tile_index *2] & 0xffff; - colour = m_bgram_16[tile_index *2+1] & 0x000f; + tileno = m_bgram[tile_index *2] & 0xffff; + colour = m_bgram[tile_index *2+1] & 0x000f; SET_TILE_INFO_MEMBER(2,tileno,colour,0); } @@ -54,8 +54,8 @@ TILE_GET_INFO_MEMBER(ms32_state::get_ms32_extra_tile_info) { int tileno,colour; - tileno = m_f1superb_extraram_16[tile_index *2] & 0xffff; - colour = m_f1superb_extraram_16[tile_index *2+1] & 0x000f; + tileno = m_f1superb_extraram[tile_index *2] & 0xffff; + colour = m_f1superb_extraram[tile_index *2+1] & 0x000f; SET_TILE_INFO_MEMBER(4,tileno,colour+0x50,0); } @@ -64,14 +64,6 @@ TILE_GET_INFO_MEMBER(ms32_state::get_ms32_extra_tile_info) void ms32_state::video_start() { - m_priram_8 = auto_alloc_array_clear(machine(), UINT8, 0x2000); - m_palram_16 = auto_alloc_array_clear(machine(), UINT16, 0x20000); - m_rozram_16 = auto_alloc_array_clear(machine(), UINT16, 0x10000); - m_lineram_16 = auto_alloc_array_clear(machine(), UINT16, 0x1000); - m_sprram_16 = auto_alloc_array_clear(machine(), UINT16, 0x20000); - m_bgram_16 = auto_alloc_array_clear(machine(), UINT16, 0x4000); - m_txram_16 = auto_alloc_array_clear(machine(), UINT16, 0x4000); - m_tx_tilemap = &machine().tilemap().create(tilemap_get_info_delegate(FUNC(ms32_state::get_ms32_tx_tile_info),this),TILEMAP_SCAN_ROWS,8, 8,64,64); m_bg_tilemap = &machine().tilemap().create(tilemap_get_info_delegate(FUNC(ms32_state::get_ms32_bg_tile_info),this),TILEMAP_SCAN_ROWS,16,16,64,64); m_bg_tilemap_alt = &machine().tilemap().create(tilemap_get_info_delegate(FUNC(ms32_state::get_ms32_bg_tile_info),this),TILEMAP_SCAN_ROWS,16,16,256,16); // alt layout, controller by register? @@ -105,15 +97,25 @@ void ms32_state::video_start() // tp2m32 doesn't set the brightness registers so we need sensible defaults m_brt[0] = m_brt[1] = 0xffff; + + save_item(NAME(m_irqreq)); + save_item(NAME(m_temp_bitmap_tilemaps)); + save_item(NAME(m_temp_bitmap_sprites)); + save_item(NAME(m_temp_bitmap_sprites_pri)); + save_item(NAME(m_tilemaplayoutcontrol)); + save_item(NAME(m_reverse_sprite_order)); + save_item(NAME(m_flipscreen)); + save_item(NAME(m_brt)); + save_item(NAME(m_brt_r)); + save_item(NAME(m_brt_g)); + save_item(NAME(m_brt_b)); } VIDEO_START_MEMBER(ms32_state,f1superb) { ms32_state::video_start(); - m_f1superb_extraram_16 = auto_alloc_array_clear(machine(), UINT16, 0x10000); m_extra_tilemap = &machine().tilemap().create(tilemap_get_info_delegate(FUNC(ms32_state::get_ms32_extra_tile_info),this),TILEMAP_SCAN_ROWS,2048,1,1,0x400); - } /********** PALETTE WRITES **********/ @@ -129,15 +131,15 @@ void ms32_state::update_color(int color) */ if (~color & 0x4000) { - r = ((m_palram_16[color*2] & 0xff00) >>8 ) * m_brt_r / 0x100; - g = ((m_palram_16[color*2] & 0x00ff) >>0 ) * m_brt_g / 0x100; - b = ((m_palram_16[color*2+1] & 0x00ff) >>0 ) * m_brt_b / 0x100; + r = ((m_palram[color*2] & 0xff00) >>8 ) * m_brt_r / 0x100; + g = ((m_palram[color*2] & 0x00ff) >>0 ) * m_brt_g / 0x100; + b = ((m_palram[color*2+1] & 0x00ff) >>0 ) * m_brt_b / 0x100; } else { - r = ((m_palram_16[color*2] & 0xff00) >>8 ); - g = ((m_palram_16[color*2] & 0x00ff) >>0 ); - b = ((m_palram_16[color*2+1] & 0x00ff) >>0 ); + r = ((m_palram[color*2] & 0xff00) >>8 ); + g = ((m_palram[color*2] & 0x00ff) >>0 ); + b = ((m_palram[color*2+1] & 0x00ff) >>0 ); } palette_set_color(machine(),color,MAKE_RGB(r,g,b)); @@ -280,7 +282,7 @@ void ms32_state::draw_roz(screen_device &screen, bitmap_ind16 &bitmap, const rec while (y <= maxy) { - UINT16 *lineaddr = m_lineram_16 + 8 * (y & 0xff); + UINT16 *lineaddr = m_lineram + 8 * (y & 0xff); int start2x = (lineaddr[0x00/4] & 0xffff) | ((lineaddr[0x04/4] & 3) << 16); int start2y = (lineaddr[0x08/4] & 0xffff) | ((lineaddr[0x0c/4] & 3) << 16); @@ -390,24 +392,24 @@ UINT32 ms32_state::screen_update_ms32(screen_device &screen, bitmap_rgb32 &bitma m_temp_bitmap_sprites.fill(0, cliprect); m_temp_bitmap_sprites_pri.fill(0, cliprect); - draw_sprites(m_temp_bitmap_sprites, m_temp_bitmap_sprites_pri, cliprect, m_sprram_16, 0x20000, 0, m_reverse_sprite_order); + draw_sprites(m_temp_bitmap_sprites, m_temp_bitmap_sprites_pri, cliprect, m_sprram, 0x20000, 0, m_reverse_sprite_order); asc_pri = scr_pri = rot_pri = 0; - if((m_priram_8[0x2b00 / 2] & 0x00ff) == 0x0034) + if((m_priram[0x2b00 / 2] & 0x00ff) == 0x0034) asc_pri++; else rot_pri++; - if((m_priram_8[0x2e00 / 2] & 0x00ff) == 0x0034) + if((m_priram[0x2e00 / 2] & 0x00ff) == 0x0034) asc_pri++; else scr_pri++; - if((m_priram_8[0x3a00 / 2] & 0x00ff) == 0x000c) + if((m_priram[0x3a00 / 2] & 0x00ff) == 0x000c) scr_pri++; else rot_pri++; @@ -491,14 +493,14 @@ UINT32 ms32_state::screen_update_ms32(screen_device &screen, bitmap_rgb32 &bitma int primask = 0; // get sprite priority value back out of bitmap/colour data (this is done in draw_sprite for standalone hw) - if (m_priram_8[(spritepri | 0x0a00 | 0x1500) / 2] & 0x38) primask |= 1 << 0; - if (m_priram_8[(spritepri | 0x0a00 | 0x1400) / 2] & 0x38) primask |= 1 << 1; - if (m_priram_8[(spritepri | 0x0a00 | 0x1100) / 2] & 0x38) primask |= 1 << 2; - if (m_priram_8[(spritepri | 0x0a00 | 0x1000) / 2] & 0x38) primask |= 1 << 3; - if (m_priram_8[(spritepri | 0x0a00 | 0x0500) / 2] & 0x38) primask |= 1 << 4; - if (m_priram_8[(spritepri | 0x0a00 | 0x0400) / 2] & 0x38) primask |= 1 << 5; - if (m_priram_8[(spritepri | 0x0a00 | 0x0100) / 2] & 0x38) primask |= 1 << 6; - if (m_priram_8[(spritepri | 0x0a00 | 0x0000) / 2] & 0x38) primask |= 1 << 7; + if (m_priram[(spritepri | 0x0a00 | 0x1500) / 2] & 0x38) primask |= 1 << 0; + if (m_priram[(spritepri | 0x0a00 | 0x1400) / 2] & 0x38) primask |= 1 << 1; + if (m_priram[(spritepri | 0x0a00 | 0x1100) / 2] & 0x38) primask |= 1 << 2; + if (m_priram[(spritepri | 0x0a00 | 0x1000) / 2] & 0x38) primask |= 1 << 3; + if (m_priram[(spritepri | 0x0a00 | 0x0500) / 2] & 0x38) primask |= 1 << 4; + if (m_priram[(spritepri | 0x0a00 | 0x0400) / 2] & 0x38) primask |= 1 << 5; + if (m_priram[(spritepri | 0x0a00 | 0x0100) / 2] & 0x38) primask |= 1 << 6; + if (m_priram[(spritepri | 0x0a00 | 0x0000) / 2] & 0x38) primask |= 1 << 7; if (primask == 0x00)