twincobr.cpp, wardner.cpp : Updates

Simplify handlers, Fix minor namings, Remove register_postload, Fix some code styles, Use shorter type values
Mark tilemap dirty when ROM/RAM bank is changed
This commit is contained in:
cam900 2019-03-20 18:02:52 +09:00
parent dd888d052d
commit 5423b11991
5 changed files with 176 additions and 179 deletions

View File

@ -413,7 +413,7 @@ void twincobr_state::main_program_map(address_map &map)
map(0x078008, 0x078009).portr("VBLANK"); /* V-Blank & FShark Coin/Start */
map(0x07800b, 0x07800b).w(m_coinlatch, FUNC(ls259_device::write_nibble_d0)); /* Flying Shark DSP Comms & coin stuff */
map(0x07800d, 0x07800d).w(m_mainlatch, FUNC(ls259_device::write_nibble_d0)); /* Twin Cobra DSP Comms & system control */
map(0x07a000, 0x07afff).rw(FUNC(twincobr_state::twincobr_sharedram_r), FUNC(twincobr_state::twincobr_sharedram_w)); /* 16-bit on 68000 side, 8-bit on Z80 side */
map(0x07a000, 0x07afff).rw(FUNC(twincobr_state::twincobr_sharedram_r), FUNC(twincobr_state::twincobr_sharedram_w)).umask16(0x00ff); /* 16-bit on 68000 side, 8-bit on Z80 side */
map(0x07e000, 0x07e001).rw(FUNC(twincobr_state::twincobr_txram_r), FUNC(twincobr_state::twincobr_txram_w)); /* data for text video RAM */
map(0x07e002, 0x07e003).rw(FUNC(twincobr_state::twincobr_bgram_r), FUNC(twincobr_state::twincobr_bgram_w)); /* data for bg video RAM */
map(0x07e004, 0x07e005).rw(FUNC(twincobr_state::twincobr_fgram_r), FUNC(twincobr_state::twincobr_fgram_w)); /* data for fg video RAM */
@ -626,8 +626,8 @@ static const gfx_layout charlayout =
RGN_FRAC(1,3), /* 2048 characters */
3, /* 3 bits per pixel */
{ RGN_FRAC(0,3), RGN_FRAC(1,3), RGN_FRAC(2,3) },
{ 0, 1, 2, 3, 4, 5, 6, 7 },
{ 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 },
{ STEP8(0,1) },
{ STEP8(0,8) },
8*8 /* every char takes 8 consecutive bytes */
};
@ -637,8 +637,8 @@ static const gfx_layout tilelayout =
RGN_FRAC(1,4), /* 4096/8192 tiles */
4, /* 4 bits per pixel */
{ RGN_FRAC(0,4), RGN_FRAC(1,4), RGN_FRAC(2,4), RGN_FRAC(3,4) },
{ 0, 1, 2, 3, 4, 5, 6, 7 },
{ 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 },
{ STEP8(0,1) },
{ STEP8(0,8) },
8*8 /* every tile takes 8 consecutive bytes */
};
@ -667,8 +667,6 @@ void twincobr_state::twincobr(machine_config &config)
config.m_minimum_quantum = attotime::from_hz(6000);
MCFG_MACHINE_RESET_OVERRIDE(twincobr_state,twincobr)
LS259(config, m_mainlatch);
m_mainlatch->q_out_cb<2>().set(FUNC(twincobr_state::int_enable_w));
m_mainlatch->q_out_cb<3>().set(FUNC(twincobr_state::flipscreen_w));
@ -698,7 +696,7 @@ void twincobr_state::twincobr(machine_config &config)
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
m_screen->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK);
m_screen->set_raw(28_MHz_XTAL/4, 446, 0, 320, 286, 0, 240);
m_screen->set_screen_update(FUNC(twincobr_state::screen_update_toaplan0));
m_screen->set_screen_update(FUNC(twincobr_state::screen_update));
m_screen->screen_vblank().set(m_spriteram16, FUNC(buffered_spriteram16_device::vblank_copy_rising));
m_screen->screen_vblank().append(FUNC(twincobr_state::twincobr_vblank_irq));
m_screen->set_palette(m_palette);
@ -1296,7 +1294,7 @@ ROM_END
void twincobr_state::init_twincobr()
{
twincobr_driver_savestate();
driver_savestate();
}

View File

@ -181,14 +181,14 @@ void wardner_state::main_program_map(address_map &map)
{
map(0x0000, 0x6fff).rom();
map(0x7000, 0x7fff).ram();
map(0x8000, 0x8fff).w(FUNC(wardner_state::wardner_sprite_w)); // AM_SHARE("spriteram8")
map(0xa000, 0xafff).w(m_palette, FUNC(palette_device::write8)); // AM_SHARE("palette")
map(0x8000, 0x8fff).w(FUNC(wardner_state::wardner_sprite_w)); // .share("spriteram8")
map(0xa000, 0xafff).w(m_palette, FUNC(palette_device::write8)); // .share("palette")
map(0xc000, 0xc7ff).writeonly().share("sharedram");
map(0x8000, 0xffff).r(m_membank, FUNC(address_map_bank_device::read8));
}
// Overlapped RAM/Banked ROM
// Can't use AM_RANGE(0x00000, 0x3ffff) for ROM because the shared pointers get messed up somehow
// Can't use map(0x00000, 0x3ffff) for ROM because the shared pointers get messed up somehow
void wardner_state::main_bank_map(address_map &map)
{
map(0x00000, 0x00fff).r(FUNC(wardner_state::wardner_sprite_r)).share("spriteram8");
@ -339,22 +339,22 @@ INPUT_PORTS_END
static const gfx_layout charlayout =
{
8,8, /* 8*8 characters */
2048, /* 2048 characters */
RGN_FRAC(1,3), /* 2048 characters */
3, /* 3 bits per pixel */
{ 0*2048*8*8, 1*2048*8*8, 2*2048*8*8 }, /* the bitplanes are separated */
{ 0, 1, 2, 3, 4, 5, 6, 7 },
{ 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 },
{ RGN_FRAC(0,3), RGN_FRAC(1,3), RGN_FRAC(2,3) }, /* the bitplanes are separated */
{ STEP8(0,1) },
{ STEP8(0,8) },
8*8 /* every char takes 8 consecutive bytes */
};
static const gfx_layout tilelayout =
{
8,8, /* 8*8 tiles */
4096, /* 4096 tiles */
RGN_FRAC(1,4), /* 4096 tiles */
4, /* 4 bits per pixel */
{ 0*4096*8*8, 1*4096*8*8, 2*4096*8*8, 3*4096*8*8 }, /* the bitplanes are separated */
{ 0, 1, 2, 3, 4, 5, 6, 7 },
{ 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 },
{ RGN_FRAC(0,4), RGN_FRAC(1,4), RGN_FRAC(2,4), RGN_FRAC(3,4) }, /* the bitplanes are separated */
{ STEP8(0,1) },
{ STEP8(0,8) },
8*8 /* every tile takes 8 consecutive bytes */
};
@ -369,12 +369,12 @@ GFXDECODE_END
void wardner_state::driver_start()
{
/* Save-State stuff in src/machine/twincobr.cpp */
twincobr_driver_savestate();
driver_savestate();
}
void wardner_state::machine_reset()
{
MACHINE_RESET_CALL_MEMBER(twincobr);
twincobr_state::machine_reset();
m_membank->set_bank(0);
}
@ -429,7 +429,7 @@ void wardner_state::wardner(machine_config &config)
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
m_screen->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK);
m_screen->set_raw(14_MHz_XTAL/2, 446, 0, 320, 286, 0, 240);
m_screen->set_screen_update(FUNC(wardner_state::screen_update_toaplan0));
m_screen->set_screen_update(FUNC(wardner_state::screen_update));
m_screen->screen_vblank().set(m_spriteram8, FUNC(buffered_spriteram8_device::vblank_copy_rising));
m_screen->screen_vblank().append(FUNC(wardner_state::wardner_vblank_irq));
m_screen->set_palette(m_palette);

View File

@ -43,50 +43,52 @@ public:
void init_twincobr();
protected:
virtual void device_post_load() override;
virtual void machine_reset() override;
virtual void video_start() override;
optional_shared_ptr<uint8_t> m_sharedram;
optional_shared_ptr<u8> m_sharedram;
optional_device<buffered_spriteram8_device> m_spriteram8;
optional_device<buffered_spriteram16_device> m_spriteram16;
int32_t m_fg_rom_bank;
int32_t m_bg_ram_bank;
u32 m_fg_rom_bank;
u32 m_bg_ram_bank;
int m_intenable;
int m_dsp_on;
int m_dsp_bio;
int m_fsharkbt_8741;
int m_dsp_execute;
uint32_t m_dsp_addr_w;
uint32_t m_main_ram_seg;
std::unique_ptr<uint16_t[]> m_bgvideoram16;
std::unique_ptr<uint16_t[]> m_fgvideoram16;
std::unique_ptr<uint16_t[]> m_txvideoram16;
u32 m_dsp_addr_w;
u32 m_main_ram_seg;
std::unique_ptr<u16[]> m_bgvideoram16;
std::unique_ptr<u16[]> m_fgvideoram16;
std::unique_ptr<u16[]> m_txvideoram16;
size_t m_bgvideoram_size;
size_t m_fgvideoram_size;
size_t m_txvideoram_size;
int32_t m_txscrollx;
int32_t m_txscrolly;
int32_t m_fgscrollx;
int32_t m_fgscrolly;
int32_t m_bgscrollx;
int32_t m_bgscrolly;
int32_t m_txoffs;
int32_t m_fgoffs;
int32_t m_bgoffs;
int32_t m_display_on;
s32 m_txscrollx;
s32 m_txscrolly;
s32 m_fgscrollx;
s32 m_fgscrolly;
s32 m_bgscrollx;
s32 m_bgscrolly;
s32 m_txoffs;
s32 m_fgoffs;
s32 m_bgoffs;
s32 m_display_on;
tilemap_t *m_bg_tilemap;
tilemap_t *m_fg_tilemap;
tilemap_t *m_tx_tilemap;
DECLARE_WRITE16_MEMBER(twincobr_dsp_addrsel_w);
DECLARE_READ16_MEMBER(twincobr_dsp_r);
DECLARE_WRITE16_MEMBER(twincobr_dsp_w);
DECLARE_WRITE16_MEMBER(wardner_dsp_addrsel_w);
DECLARE_READ16_MEMBER(wardner_dsp_r);
DECLARE_WRITE16_MEMBER(wardner_dsp_w);
DECLARE_WRITE16_MEMBER(twincobr_dsp_bio_w);
DECLARE_READ16_MEMBER(fsharkbt_dsp_r);
DECLARE_WRITE16_MEMBER(fsharkbt_dsp_w);
void twincobr_dsp_addrsel_w(u16 data);
u16 twincobr_dsp_r();
void twincobr_dsp_w(u16 data);
void wardner_dsp_addrsel_w(u16 data);
u16 wardner_dsp_r();
void wardner_dsp_w(u16 data);
void twincobr_dsp_bio_w(u16 data);
u16 fsharkbt_dsp_r();
void fsharkbt_dsp_w(u16 data);
DECLARE_READ_LINE_MEMBER(twincobr_bio_r);
DECLARE_WRITE_LINE_MEMBER(int_enable_w);
DECLARE_WRITE_LINE_MEMBER(dsp_int_w);
@ -94,47 +96,45 @@ protected:
DECLARE_WRITE_LINE_MEMBER(coin_counter_2_w);
DECLARE_WRITE_LINE_MEMBER(coin_lockout_1_w);
DECLARE_WRITE_LINE_MEMBER(coin_lockout_2_w);
DECLARE_READ16_MEMBER(twincobr_sharedram_r);
DECLARE_WRITE16_MEMBER(twincobr_sharedram_w);
DECLARE_WRITE16_MEMBER(twincobr_txoffs_w);
DECLARE_READ16_MEMBER(twincobr_txram_r);
DECLARE_WRITE16_MEMBER(twincobr_txram_w);
DECLARE_WRITE16_MEMBER(twincobr_bgoffs_w);
DECLARE_READ16_MEMBER(twincobr_bgram_r);
DECLARE_WRITE16_MEMBER(twincobr_bgram_w);
DECLARE_WRITE16_MEMBER(twincobr_fgoffs_w);
DECLARE_READ16_MEMBER(twincobr_fgram_r);
DECLARE_WRITE16_MEMBER(twincobr_fgram_w);
DECLARE_WRITE16_MEMBER(twincobr_txscroll_w);
DECLARE_WRITE16_MEMBER(twincobr_bgscroll_w);
DECLARE_WRITE16_MEMBER(twincobr_fgscroll_w);
DECLARE_WRITE16_MEMBER(twincobr_exscroll_w);
DECLARE_WRITE8_MEMBER(wardner_txlayer_w);
DECLARE_WRITE8_MEMBER(wardner_bglayer_w);
DECLARE_WRITE8_MEMBER(wardner_fglayer_w);
DECLARE_WRITE8_MEMBER(wardner_txscroll_w);
DECLARE_WRITE8_MEMBER(wardner_bgscroll_w);
DECLARE_WRITE8_MEMBER(wardner_fgscroll_w);
DECLARE_WRITE8_MEMBER(wardner_exscroll_w);
DECLARE_READ8_MEMBER(wardner_videoram_r);
DECLARE_WRITE8_MEMBER(wardner_videoram_w);
DECLARE_READ8_MEMBER(wardner_sprite_r);
DECLARE_WRITE8_MEMBER(wardner_sprite_w);
u8 twincobr_sharedram_r(offs_t offset);
void twincobr_sharedram_w(offs_t offset, u8 data);
void twincobr_txoffs_w(offs_t offset, u16 data, u16 mem_mask = ~0);
u16 twincobr_txram_r();
void twincobr_txram_w(offs_t offset, u16 data, u16 mem_mask = ~0);
void twincobr_bgoffs_w(offs_t offset, u16 data, u16 mem_mask = ~0);
u16 twincobr_bgram_r();
void twincobr_bgram_w(offs_t offset, u16 data, u16 mem_mask = ~0);
void twincobr_fgoffs_w(offs_t offset, u16 data, u16 mem_mask = ~0);
u16 twincobr_fgram_r();
void twincobr_fgram_w(offs_t offset, u16 data, u16 mem_mask = ~0);
void twincobr_txscroll_w(offs_t offset, u16 data, u16 mem_mask = ~0);
void twincobr_bgscroll_w(offs_t offset, u16 data, u16 mem_mask = ~0);
void twincobr_fgscroll_w(offs_t offset, u16 data, u16 mem_mask = ~0);
void twincobr_exscroll_w(offs_t offset, u16 data);
void wardner_txlayer_w(offs_t offset, u8 data);
void wardner_bglayer_w(offs_t offset, u8 data);
void wardner_fglayer_w(offs_t offset, u8 data);
void wardner_txscroll_w(offs_t offset, u8 data);
void wardner_bgscroll_w(offs_t offset, u8 data);
void wardner_fgscroll_w(offs_t offset, u8 data);
void wardner_exscroll_w(offs_t offset, u8 data);
u8 wardner_videoram_r(offs_t offset);
void wardner_videoram_w(offs_t offset, u8 data);
u8 wardner_sprite_r(offs_t offset);
void wardner_sprite_w(offs_t offset, u8 data);
TILE_GET_INFO_MEMBER(get_bg_tile_info);
TILE_GET_INFO_MEMBER(get_fg_tile_info);
TILE_GET_INFO_MEMBER(get_tx_tile_info);
DECLARE_MACHINE_RESET(twincobr);
uint32_t screen_update_toaplan0(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
DECLARE_WRITE_LINE_MEMBER(twincobr_vblank_irq);
DECLARE_WRITE_LINE_MEMBER(wardner_vblank_irq);
void twincobr_restore_dsp();
void twincobr_create_tilemaps();
DECLARE_WRITE_LINE_MEMBER(display_on_w);
DECLARE_WRITE_LINE_MEMBER(flipscreen_w);
DECLARE_WRITE_LINE_MEMBER(bg_ram_bank_w);
DECLARE_WRITE_LINE_MEMBER(fg_rom_bank_w);
void twincobr_log_vram();
void twincobr_driver_savestate();
void log_vram();
void driver_savestate();
required_device<cpu_device> m_maincpu;
required_device<tms32010_device> m_dsp;
required_device<toaplan_scu_device> m_spritegen;

View File

@ -34,7 +34,7 @@ WRITE_LINE_MEMBER(twincobr_state::wardner_vblank_irq)
}
WRITE16_MEMBER(twincobr_state::twincobr_dsp_addrsel_w)
void twincobr_state::twincobr_dsp_addrsel_w(u16 data)
{
/* This sets the main CPU RAM address the DSP should */
/* read/write, via the DSP IO port 0 */
@ -50,11 +50,11 @@ WRITE16_MEMBER(twincobr_state::twincobr_dsp_addrsel_w)
LOG(("DSP PC:%04x IO write %04x (%08x) at port 0\n",m_dsp->pcbase(),data,m_main_ram_seg + m_dsp_addr_w));
}
READ16_MEMBER(twincobr_state::twincobr_dsp_r)
u16 twincobr_state::twincobr_dsp_r()
{
/* DSP can read data from main CPU RAM via DSP IO port 1 */
uint16_t input_data = 0;
u16 input_data = 0;
switch (m_main_ram_seg)
{
case 0x30000:
@ -68,7 +68,7 @@ READ16_MEMBER(twincobr_state::twincobr_dsp_r)
return input_data;
}
WRITE16_MEMBER(twincobr_state::twincobr_dsp_w)
void twincobr_state::twincobr_dsp_w(u16 data)
{
/* Data written to main CPU RAM via DSP IO port 1 */
m_dsp_execute = 0;
@ -84,7 +84,7 @@ WRITE16_MEMBER(twincobr_state::twincobr_dsp_w)
LOG(("DSP PC:%04x IO write %04x at %08x (port 1)\n",m_dsp->pcbase(),data,m_main_ram_seg + m_dsp_addr_w));
}
WRITE16_MEMBER(twincobr_state::wardner_dsp_addrsel_w)
void twincobr_state::wardner_dsp_addrsel_w(u16 data)
{
/* This sets the main CPU RAM address the DSP should */
/* read/write, via the DSP IO port 0 */
@ -99,11 +99,11 @@ WRITE16_MEMBER(twincobr_state::wardner_dsp_addrsel_w)
LOG(("DSP PC:%04x IO write %04x (%08x) at port 0\n",m_dsp->pcbase(),data,m_main_ram_seg + m_dsp_addr_w));
}
READ16_MEMBER(twincobr_state::wardner_dsp_r)
u16 twincobr_state::wardner_dsp_r()
{
/* DSP can read data from main CPU RAM via DSP IO port 1 */
uint16_t input_data = 0;
u16 input_data = 0;
switch (m_main_ram_seg)
{
case 0x7000:
@ -118,7 +118,7 @@ READ16_MEMBER(twincobr_state::wardner_dsp_r)
return input_data;
}
WRITE16_MEMBER(twincobr_state::wardner_dsp_w)
void twincobr_state::wardner_dsp_w(u16 data)
{
/* Data written to main CPU RAM via DSP IO port 1 */
m_dsp_execute = 0;
@ -135,7 +135,7 @@ WRITE16_MEMBER(twincobr_state::wardner_dsp_w)
LOG(("DSP PC:%04x IO write %04x at %08x (port 1)\n",m_dsp->pcbase(),data,m_main_ram_seg + m_dsp_addr_w));
}
WRITE16_MEMBER(twincobr_state::twincobr_dsp_bio_w)
void twincobr_state::twincobr_dsp_bio_w(u16 data)
{
/* data 0xffff means inhibit BIO line to DSP and enable */
/* communication to main processor */
@ -159,7 +159,7 @@ WRITE16_MEMBER(twincobr_state::twincobr_dsp_bio_w)
}
}
READ16_MEMBER(twincobr_state::fsharkbt_dsp_r)
u16 twincobr_state::fsharkbt_dsp_r()
{
/* IO Port 2 used by Flying Shark bootleg */
/* DSP reads data from an extra MCU (8741) at IO port 2 */
@ -170,7 +170,7 @@ READ16_MEMBER(twincobr_state::fsharkbt_dsp_r)
return (m_fsharkbt_8741 & 1);
}
WRITE16_MEMBER(twincobr_state::fsharkbt_dsp_w)
void twincobr_state::fsharkbt_dsp_w(u16 data)
{
/* Flying Shark bootleg DSP writes data to an extra MCU (8741) at IO port 2 */
#if 0
@ -209,7 +209,7 @@ WRITE_LINE_MEMBER(twincobr_state::dsp_int_w)
}
}
void twincobr_state::twincobr_restore_dsp()
void twincobr_state::device_post_load()
{
dsp_int_w(m_dsp_on);
}
@ -236,21 +236,18 @@ WRITE_LINE_MEMBER(twincobr_state::coin_lockout_2_w)
}
READ16_MEMBER(twincobr_state::twincobr_sharedram_r)
u8 twincobr_state::twincobr_sharedram_r(offs_t offset)
{
return m_sharedram[offset];
}
WRITE16_MEMBER(twincobr_state::twincobr_sharedram_w)
void twincobr_state::twincobr_sharedram_w(offs_t offset, u8 data)
{
if (ACCESSING_BITS_0_7)
{
m_sharedram[offset] = data & 0xff;
}
m_sharedram[offset] = data;
}
MACHINE_RESET_MEMBER(twincobr_state,twincobr)
void twincobr_state::machine_reset()
{
m_dsp_addr_w = 0;
m_main_ram_seg = 0;
@ -259,7 +256,7 @@ MACHINE_RESET_MEMBER(twincobr_state,twincobr)
m_fsharkbt_8741 = -1;
}
void twincobr_state::twincobr_driver_savestate()
void twincobr_state::driver_savestate()
{
save_item(NAME(m_intenable));
save_item(NAME(m_dsp_on));
@ -268,6 +265,4 @@ void twincobr_state::twincobr_driver_savestate()
save_item(NAME(m_dsp_bio));
save_item(NAME(m_dsp_execute));
save_item(NAME(m_fsharkbt_8741));
machine().save().register_postload(save_prepost_delegate(FUNC(twincobr_state::twincobr_restore_dsp), this));
}

View File

@ -24,11 +24,9 @@
TILE_GET_INFO_MEMBER(twincobr_state::get_bg_tile_info)
{
int code, tile_number, color;
code = m_bgvideoram16[tile_index+m_bg_ram_bank];
tile_number = code & 0x0fff;
color = (code & 0xf000) >> 12;
const u16 code = m_bgvideoram16[tile_index+m_bg_ram_bank];
const u32 tile_number = code & 0x0fff;
const u32 color = (code & 0xf000) >> 12;
SET_TILE_INFO_MEMBER(2,
tile_number,
color,
@ -37,11 +35,9 @@ TILE_GET_INFO_MEMBER(twincobr_state::get_bg_tile_info)
TILE_GET_INFO_MEMBER(twincobr_state::get_fg_tile_info)
{
int code, tile_number, color;
code = m_fgvideoram16[tile_index];
tile_number = (code & 0x0fff) | m_fg_rom_bank;
color = (code & 0xf000) >> 12;
const u16 code = m_fgvideoram16[tile_index];
const u32 tile_number = (code & 0x0fff) | m_fg_rom_bank;
const u32 color = (code & 0xf000) >> 12;
SET_TILE_INFO_MEMBER(1,
tile_number,
color,
@ -50,11 +46,9 @@ TILE_GET_INFO_MEMBER(twincobr_state::get_fg_tile_info)
TILE_GET_INFO_MEMBER(twincobr_state::get_tx_tile_info)
{
int code, tile_number, color;
code = m_txvideoram16[tile_index];
tile_number = code & 0x07ff;
color = (code & 0xf800) >> 11;
const u16 code = m_txvideoram16[tile_index];
const u32 tile_number = code & 0x07ff;
const u32 color = (code & 0xf800) >> 11;
SET_TILE_INFO_MEMBER(0,
tile_number,
color,
@ -93,9 +87,9 @@ void twincobr_state::video_start()
twincobr_create_tilemaps();
m_txvideoram16 = make_unique_clear<uint16_t[]>(m_txvideoram_size);
m_fgvideoram16 = make_unique_clear<uint16_t[]>(m_fgvideoram_size);
m_bgvideoram16 = make_unique_clear<uint16_t[]>(m_bgvideoram_size);
m_txvideoram16 = make_unique_clear<u16[]>(m_txvideoram_size);
m_fgvideoram16 = make_unique_clear<u16[]>(m_fgvideoram_size);
m_bgvideoram16 = make_unique_clear<u16[]>(m_bgvideoram_size);
m_display_on = 0;
@ -135,140 +129,148 @@ WRITE_LINE_MEMBER(twincobr_state::flipscreen_w)
WRITE_LINE_MEMBER(twincobr_state::bg_ram_bank_w)
{
m_bg_ram_bank = state ? 0x1000 : 0x0000;
m_bg_tilemap->mark_all_dirty();
}
WRITE_LINE_MEMBER(twincobr_state::fg_rom_bank_w)
{
m_fg_rom_bank = state ? 0x1000 : 0x0000;
m_fg_tilemap->mark_all_dirty();
}
WRITE16_MEMBER(twincobr_state::twincobr_txoffs_w)
void twincobr_state::twincobr_txoffs_w(offs_t offset, u16 data, u16 mem_mask)
{
COMBINE_DATA(&m_txoffs);
m_txoffs %= m_txvideoram_size;
}
READ16_MEMBER(twincobr_state::twincobr_txram_r)
u16 twincobr_state::twincobr_txram_r()
{
return m_txvideoram16[m_txoffs];
}
WRITE16_MEMBER(twincobr_state::twincobr_txram_w)
void twincobr_state::twincobr_txram_w(offs_t offset, u16 data, u16 mem_mask)
{
COMBINE_DATA(&m_txvideoram16[m_txoffs]);
m_tx_tilemap->mark_tile_dirty(m_txoffs);
}
WRITE16_MEMBER(twincobr_state::twincobr_bgoffs_w)
void twincobr_state::twincobr_bgoffs_w(offs_t offset, u16 data, u16 mem_mask)
{
COMBINE_DATA(&m_bgoffs);
m_bgoffs %= (m_bgvideoram_size >> 1);
}
READ16_MEMBER(twincobr_state::twincobr_bgram_r)
u16 twincobr_state::twincobr_bgram_r()
{
return m_bgvideoram16[m_bgoffs+m_bg_ram_bank];
}
WRITE16_MEMBER(twincobr_state::twincobr_bgram_w)
void twincobr_state::twincobr_bgram_w(offs_t offset, u16 data, u16 mem_mask)
{
COMBINE_DATA(&m_bgvideoram16[m_bgoffs+m_bg_ram_bank]);
m_bg_tilemap->mark_tile_dirty((m_bgoffs+m_bg_ram_bank));
}
WRITE16_MEMBER(twincobr_state::twincobr_fgoffs_w)
void twincobr_state::twincobr_fgoffs_w(offs_t offset, u16 data, u16 mem_mask)
{
COMBINE_DATA(&m_fgoffs);
m_fgoffs %= m_fgvideoram_size;
}
READ16_MEMBER(twincobr_state::twincobr_fgram_r)
u16 twincobr_state::twincobr_fgram_r()
{
return m_fgvideoram16[m_fgoffs];
}
WRITE16_MEMBER(twincobr_state::twincobr_fgram_w)
void twincobr_state::twincobr_fgram_w(offs_t offset, u16 data, u16 mem_mask)
{
COMBINE_DATA(&m_fgvideoram16[m_fgoffs]);
m_fg_tilemap->mark_tile_dirty(m_fgoffs);
}
WRITE16_MEMBER(twincobr_state::twincobr_txscroll_w)
void twincobr_state::twincobr_txscroll_w(offs_t offset, u16 data, u16 mem_mask)
{
if (offset == 0) {
if (offset == 0)
{
COMBINE_DATA(&m_txscrollx);
m_tx_tilemap->set_scrollx(0, m_txscrollx);
}
else {
else
{
COMBINE_DATA(&m_txscrolly);
m_tx_tilemap->set_scrolly(0, m_txscrolly);
}
}
WRITE16_MEMBER(twincobr_state::twincobr_bgscroll_w)
void twincobr_state::twincobr_bgscroll_w(offs_t offset, u16 data, u16 mem_mask)
{
if (offset == 0) {
if (offset == 0)
{
COMBINE_DATA(&m_bgscrollx);
m_bg_tilemap->set_scrollx(0, m_bgscrollx);
}
else {
else
{
COMBINE_DATA(&m_bgscrolly);
m_bg_tilemap->set_scrolly(0, m_bgscrolly);
}
}
WRITE16_MEMBER(twincobr_state::twincobr_fgscroll_w)
void twincobr_state::twincobr_fgscroll_w(offs_t offset, u16 data, u16 mem_mask)
{
if (offset == 0) {
if (offset == 0)
{
COMBINE_DATA(&m_fgscrollx);
m_fg_tilemap->set_scrollx(0, m_fgscrollx);
}
else {
else
{
COMBINE_DATA(&m_fgscrolly);
m_fg_tilemap->set_scrolly(0, m_fgscrolly);
}
}
WRITE16_MEMBER(twincobr_state::twincobr_exscroll_w)/* Extra unused video layer */
void twincobr_state::twincobr_exscroll_w(offs_t offset, u16 data)/* Extra unused video layer */
{
if (offset == 0) logerror("PC - write %04x to unknown video scroll Y register\n",data);
else logerror("PC - write %04x to unknown video scroll X register\n",data);
}
/******************** Wardner interface to this hardware ********************/
WRITE8_MEMBER(twincobr_state::wardner_txlayer_w)
void twincobr_state::wardner_txlayer_w(offs_t offset, u8 data)
{
int shift = 8 * (offset & 1);
twincobr_txoffs_w(space, offset / 2, data << shift, 0xff << shift);
twincobr_txoffs_w(offset / 2, data << shift, 0xff << shift);
}
WRITE8_MEMBER(twincobr_state::wardner_bglayer_w)
void twincobr_state::wardner_bglayer_w(offs_t offset, u8 data)
{
int shift = 8 * (offset & 1);
twincobr_bgoffs_w(space, offset / 2, data << shift, 0xff << shift);
twincobr_bgoffs_w(offset / 2, data << shift, 0xff << shift);
}
WRITE8_MEMBER(twincobr_state::wardner_fglayer_w)
void twincobr_state::wardner_fglayer_w(offs_t offset, u8 data)
{
int shift = 8 * (offset & 1);
twincobr_fgoffs_w(space, offset / 2, data << shift, 0xff << shift);
twincobr_fgoffs_w(offset / 2, data << shift, 0xff << shift);
}
WRITE8_MEMBER(twincobr_state::wardner_txscroll_w)
void twincobr_state::wardner_txscroll_w(offs_t offset, u8 data)
{
int shift = 8 * (offset & 1);
twincobr_txscroll_w(space, offset / 2, data << shift, 0xff << shift);
twincobr_txscroll_w(offset / 2, data << shift, 0xff << shift);
}
WRITE8_MEMBER(twincobr_state::wardner_bgscroll_w)
void twincobr_state::wardner_bgscroll_w(offs_t offset, u8 data)
{
int shift = 8 * (offset & 1);
twincobr_bgscroll_w(space, offset / 2, data << shift, 0xff << shift);
twincobr_bgscroll_w(offset / 2, data << shift, 0xff << shift);
}
WRITE8_MEMBER(twincobr_state::wardner_fgscroll_w)
void twincobr_state::wardner_fgscroll_w(offs_t offset, u8 data)
{
int shift = 8 * (offset & 1);
twincobr_fgscroll_w(space, offset / 2, data << shift, 0xff << shift);
twincobr_fgscroll_w(offset / 2, data << shift, 0xff << shift);
}
WRITE8_MEMBER(twincobr_state::wardner_exscroll_w)/* Extra unused video layer */
void twincobr_state::wardner_exscroll_w(offs_t offset, u8 data)/* Extra unused video layer */
{
switch (offset)
{
@ -279,37 +281,39 @@ WRITE8_MEMBER(twincobr_state::wardner_exscroll_w)/* Extra unused video layer */
}
}
READ8_MEMBER(twincobr_state::wardner_videoram_r)
u8 twincobr_state::wardner_videoram_r(offs_t offset)
{
int shift = 8 * (offset & 1);
switch (offset/2) {
case 0: return twincobr_txram_r(space,0,0xffff) >> shift;
case 1: return twincobr_bgram_r(space,0,0xffff) >> shift;
case 2: return twincobr_fgram_r(space,0,0xffff) >> shift;
switch (offset / 2)
{
case 0: return twincobr_txram_r() >> shift;
case 1: return twincobr_bgram_r() >> shift;
case 2: return twincobr_fgram_r() >> shift;
}
return 0;
}
WRITE8_MEMBER(twincobr_state::wardner_videoram_w)
void twincobr_state::wardner_videoram_w(offs_t offset, u8 data)
{
int shift = 8 * (offset & 1);
switch (offset/2) {
case 0: twincobr_txram_w(space,0,data << shift, 0xff << shift); break;
case 1: twincobr_bgram_w(space,0,data << shift, 0xff << shift); break;
case 2: twincobr_fgram_w(space,0,data << shift, 0xff << shift); break;
switch (offset / 2)
{
case 0: twincobr_txram_w(0,data << shift, 0xff << shift); break;
case 1: twincobr_bgram_w(0,data << shift, 0xff << shift); break;
case 2: twincobr_fgram_w(0,data << shift, 0xff << shift); break;
}
}
READ8_MEMBER(twincobr_state::wardner_sprite_r)
u8 twincobr_state::wardner_sprite_r(offs_t offset)
{
uint16_t *spriteram16 = reinterpret_cast<uint16_t *>(m_spriteram8->live());
u16 *spriteram16 = reinterpret_cast<u16 *>(m_spriteram8->live());
int shift = (offset & 1) * 8;
return spriteram16[offset/2] >> shift;
}
WRITE8_MEMBER(twincobr_state::wardner_sprite_w)
void twincobr_state::wardner_sprite_w(offs_t offset, u8 data)
{
uint16_t *spriteram16 = reinterpret_cast<uint16_t *>(m_spriteram8->live());
u16 *spriteram16 = reinterpret_cast<u16 *>(m_spriteram8->live());
if (offset & 1)
spriteram16[offset/2] = (spriteram16[offset/2] & 0x00ff) | (data << 8);
else
@ -320,7 +324,7 @@ WRITE8_MEMBER(twincobr_state::wardner_sprite_w)
void twincobr_state::twincobr_log_vram()
void twincobr_state::log_vram()
{
#ifdef MAME_DEBUG
@ -360,12 +364,12 @@ void twincobr_state::twincobr_log_vram()
}
uint32_t twincobr_state::screen_update_toaplan0(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
u32 twincobr_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
twincobr_log_vram();
log_vram();
uint16_t *buffered_spriteram16;
uint32_t bytes;
u16 *buffered_spriteram16;
u32 bytes;
if (m_spriteram16 != nullptr)
{
buffered_spriteram16 = m_spriteram16->buffer();
@ -373,7 +377,7 @@ uint32_t twincobr_state::screen_update_toaplan0(screen_device &screen, bitmap_in
}
else
{
buffered_spriteram16 = reinterpret_cast<uint16_t *>(m_spriteram8->buffer());
buffered_spriteram16 = reinterpret_cast<u16 *>(m_spriteram8->buffer());
bytes = m_spriteram8->bytes();
}