From 832107ea548406cc8139b2a4327858fca7f4ef94 Mon Sep 17 00:00:00 2001 From: angelosa Date: Tue, 1 Dec 2015 20:22:21 +0100 Subject: [PATCH] Experimental Run & Gun base address setup. Added Palette and Text Layers, correctly drawn to each screen. (TBD: how to declare a new m_paletteram base?) --- src/mame/drivers/rungun.cpp | 29 +++++++++++++++++++++++++---- src/mame/includes/rungun.h | 10 +++++++++- src/mame/video/rungun.cpp | 12 ++++++++---- 3 files changed, 42 insertions(+), 9 deletions(-) diff --git a/src/mame/drivers/rungun.cpp b/src/mame/drivers/rungun.cpp index a272ce6388e..aa4493f0f37 100644 --- a/src/mame/drivers/rungun.cpp +++ b/src/mame/drivers/rungun.cpp @@ -121,6 +121,7 @@ WRITE16_MEMBER(rungun_state::rng_sysregs_w) if (ACCESSING_BITS_0_7) { membank("spriteram_bank")->set_entry((data & 0x80) >> 7); + m_video_mux_bank = ((data & 0x80) >> 7) ^ 1; ioport("EEPROMOUT")->write(data, 0xff); } if (ACCESSING_BITS_8_15) @@ -186,9 +187,24 @@ READ8_MEMBER(rungun_state::rng_53936_rom_r) return m_roz_rom[rom_addr]; } +READ16_MEMBER(rungun_state::palette_read) +{ + return m_video_mux_bank == 0 ? m_palette->read(space,offset,mem_mask) : m_palette2->read(space,offset,mem_mask); +} + +WRITE16_MEMBER(rungun_state::palette_write) +{ + if(m_video_mux_bank == 0) + m_palette->write(space,offset,data,mem_mask); + else + m_palette2->write(space,offset,data,mem_mask); + +} + static ADDRESS_MAP_START( rungun_map, AS_PROGRAM, 16, rungun_state ) AM_RANGE(0x000000, 0x2fffff) AM_ROM // main program + data - AM_RANGE(0x300000, 0x3007ff) AM_RAM_DEVWRITE("palette", palette_device, write) AM_SHARE("palette") + AM_RANGE(0x300000, 0x3007ff) AM_READWRITE(palette_read,palette_write) AM_SHARE("palette") + AM_RANGE(0x300800, 0x300fff) AM_RAM AM_SHARE("palette2") // TODO: paletteram declaration AM_RANGE(0x380000, 0x39ffff) AM_RAM // work RAM AM_RANGE(0x400000, 0x43ffff) AM_READ8(rng_53936_rom_r,0x00ff) // '936 ROM readback window AM_RANGE(0x480000, 0x48001f) AM_READWRITE(rng_sysregs_r, rng_sysregs_w) AM_SHARE("sysreg") @@ -361,7 +377,7 @@ void rungun_state::machine_start() save_item(NAME(m_sound_ctrl)); save_item(NAME(m_sound_status)); save_item(NAME(m_sound_nmi_clk)); - save_item(NAME(m_ttl_vram)); + //save_item(NAME(m_ttl_vram)); } void rungun_state::machine_reset() @@ -369,7 +385,7 @@ void rungun_state::machine_reset() m_k054539_1->init_flags(k054539_device::REVERSE_STEREO); memset(m_sysreg, 0, 0x20); - memset(m_ttl_vram, 0, 0x1000 * sizeof(UINT16)); + //memset(m_ttl_vram, 0, 0x1000 * sizeof(UINT16)); m_sound_ctrl = 0; m_sound_status = 0; @@ -451,6 +467,11 @@ static MACHINE_CONFIG_DERIVED( rng_dual, rng ) MCFG_SCREEN_UPDATE_DRIVER(rungun_state, screen_update_rng_dual_left) MCFG_SCREEN_PALETTE("palette") + MCFG_PALETTE_ADD("palette2", 1024) + MCFG_PALETTE_FORMAT(xBBBBBGGGGGRRRRR) + MCFG_PALETTE_ENABLE_SHADOWS() + MCFG_PALETTE_ENABLE_HILIGHTS() + MCFG_SCREEN_ADD("demultiplex2", RASTER) MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK) MCFG_SCREEN_REFRESH_RATE(60) @@ -458,7 +479,7 @@ static MACHINE_CONFIG_DERIVED( rng_dual, rng ) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(88, 88+384-1, 24, 24+224-1) MCFG_SCREEN_UPDATE_DRIVER(rungun_state, screen_update_rng_dual_right) - MCFG_SCREEN_PALETTE("palette") + MCFG_SCREEN_PALETTE("palette2") MACHINE_CONFIG_END // Older non-US 53936/A13 roms were all returning bad from the mask ROM check. Using the US ROM on non-US reports good therefore I guess that data matches for that diff --git a/src/mame/includes/rungun.h b/src/mame/includes/rungun.h index 41bdc4baca7..26395e8832c 100644 --- a/src/mame/includes/rungun.h +++ b/src/mame/includes/rungun.h @@ -27,6 +27,7 @@ public: m_936_videoram(*this, "936_videoram"), m_gfxdecode(*this, "gfxdecode"), m_palette(*this, "palette"), + m_palette2(*this, "palette2"), m_screen(*this, "screen") { } @@ -45,12 +46,14 @@ public: required_device m_gfxdecode; required_device m_palette; + optional_device m_palette2; required_device m_screen; /* video-related */ tilemap_t *m_ttl_tilemap; tilemap_t *m_936_tilemap; - UINT16 m_ttl_vram[0x1000]; + UINT16 *m_ttl_vram; + UINT8 m_current_frame_number; int m_ttl_gfx_index; int m_sprite_colorbase; @@ -65,6 +68,7 @@ public: bool m_video_priority_mode; UINT16 *m_banked_ram; bool m_single_screen_mode; + UINT8 m_video_mux_bank; DECLARE_READ16_MEMBER(rng_sysregs_r); DECLARE_WRITE16_MEMBER(rng_sysregs_w); @@ -81,6 +85,10 @@ public: TILE_GET_INFO_MEMBER(ttl_get_tile_info); TILE_GET_INFO_MEMBER(get_rng_936_tile_info); DECLARE_WRITE_LINE_MEMBER(k054539_nmi_gen); + DECLARE_READ16_MEMBER(palette_read); + DECLARE_WRITE16_MEMBER(palette_write); + + K055673_CB_MEMBER(sprite_callback); virtual void machine_start(); diff --git a/src/mame/video/rungun.cpp b/src/mame/video/rungun.cpp index efab92da0f1..6ca8f6eebfb 100644 --- a/src/mame/video/rungun.cpp +++ b/src/mame/video/rungun.cpp @@ -18,8 +18,10 @@ /* TTL text plane stuff */ TILE_GET_INFO_MEMBER(rungun_state::ttl_get_tile_info) { - UINT8 *lvram = (UINT8 *)m_ttl_vram; + UINT8 *lvram = (UINT8 *)m_ttl_vram + (m_current_frame_number * 0x2000); int attr, code; + + //tile_index += 1 * 0x1000; attr = (lvram[BYTE_XOR_LE(tile_index<<2)] & 0xf0) >> 4; code = ((lvram[BYTE_XOR_LE(tile_index<<2)] & 0x0f) << 8) | (lvram[BYTE_XOR_LE((tile_index<<2)+2)]); @@ -34,12 +36,12 @@ K055673_CB_MEMBER(rungun_state::sprite_callback) READ16_MEMBER(rungun_state::rng_ttl_ram_r) { - return m_ttl_vram[offset]; + return m_ttl_vram[offset+(m_video_mux_bank*0x1000)]; } WRITE16_MEMBER(rungun_state::rng_ttl_ram_w) { - COMBINE_DATA(&m_ttl_vram[offset]); + COMBINE_DATA(&m_ttl_vram[offset+(m_video_mux_bank*0x1000)]); } /* 53936 (PSAC2) rotation/zoom plane */ @@ -76,6 +78,7 @@ void rungun_state::video_start() int gfx_index; + m_ttl_vram = auto_alloc_array(machine(), UINT16, 0x1000*2); m_936_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(rungun_state::get_rng_936_tile_info),this), TILEMAP_SCAN_ROWS, 16, 16, 128, 128); m_936_tilemap->set_transparent_pen(0); @@ -105,6 +108,8 @@ UINT32 rungun_state::screen_update_rng(screen_device &screen, bitmap_ind16 &bitm { bitmap.fill(m_palette->black_pen(), cliprect); screen.priority().fill(0, cliprect); + m_current_frame_number = machine().first_screen()->frame_number() & 1; + m_ttl_tilemap->mark_all_dirty(); if(m_video_priority_mode == false) { @@ -117,7 +122,6 @@ UINT32 rungun_state::screen_update_rng(screen_device &screen, bitmap_ind16 &bitm m_k053936->zoom_draw(screen, bitmap, cliprect, m_936_tilemap, 0, 0, 1); } - m_ttl_tilemap->mark_all_dirty(); m_ttl_tilemap->draw(screen, bitmap, cliprect, 0, 0); // copy frame output to temp buffers so we can demultiplex it for the dual screen output