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?)
This commit is contained in:
angelosa 2015-12-01 20:22:21 +01:00
parent 28c29a1598
commit 832107ea54
3 changed files with 42 additions and 9 deletions

View File

@ -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

View File

@ -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<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
optional_device<palette_device> m_palette2;
required_device<screen_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();

View File

@ -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