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(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(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(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(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(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 */ 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 */ RGN_FRAC(1,3), /* 2048 characters */
3, /* 3 bits per pixel */ 3, /* 3 bits per pixel */
{ RGN_FRAC(0,3), RGN_FRAC(1,3), RGN_FRAC(2,3) }, { RGN_FRAC(0,3), RGN_FRAC(1,3), RGN_FRAC(2,3) },
{ 0, 1, 2, 3, 4, 5, 6, 7 }, { STEP8(0,1) },
{ 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 }, { STEP8(0,8) },
8*8 /* every char takes 8 consecutive bytes */ 8*8 /* every char takes 8 consecutive bytes */
}; };
@ -637,8 +637,8 @@ static const gfx_layout tilelayout =
RGN_FRAC(1,4), /* 4096/8192 tiles */ RGN_FRAC(1,4), /* 4096/8192 tiles */
4, /* 4 bits per pixel */ 4, /* 4 bits per pixel */
{ RGN_FRAC(0,4), RGN_FRAC(1,4), RGN_FRAC(2,4), RGN_FRAC(3,4) }, { RGN_FRAC(0,4), RGN_FRAC(1,4), RGN_FRAC(2,4), RGN_FRAC(3,4) },
{ 0, 1, 2, 3, 4, 5, 6, 7 }, { STEP8(0,1) },
{ 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 }, { STEP8(0,8) },
8*8 /* every tile takes 8 consecutive bytes */ 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); config.m_minimum_quantum = attotime::from_hz(6000);
MCFG_MACHINE_RESET_OVERRIDE(twincobr_state,twincobr)
LS259(config, m_mainlatch); LS259(config, m_mainlatch);
m_mainlatch->q_out_cb<2>().set(FUNC(twincobr_state::int_enable_w)); 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)); 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); SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
m_screen->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK); 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_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().set(m_spriteram16, FUNC(buffered_spriteram16_device::vblank_copy_rising));
m_screen->screen_vblank().append(FUNC(twincobr_state::twincobr_vblank_irq)); m_screen->screen_vblank().append(FUNC(twincobr_state::twincobr_vblank_irq));
m_screen->set_palette(m_palette); m_screen->set_palette(m_palette);
@ -1296,7 +1294,7 @@ ROM_END
void twincobr_state::init_twincobr() 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(0x0000, 0x6fff).rom();
map(0x7000, 0x7fff).ram(); map(0x7000, 0x7fff).ram();
map(0x8000, 0x8fff).w(FUNC(wardner_state::wardner_sprite_w)); // AM_SHARE("spriteram8") map(0x8000, 0x8fff).w(FUNC(wardner_state::wardner_sprite_w)); // .share("spriteram8")
map(0xa000, 0xafff).w(m_palette, FUNC(palette_device::write8)); // AM_SHARE("palette") map(0xa000, 0xafff).w(m_palette, FUNC(palette_device::write8)); // .share("palette")
map(0xc000, 0xc7ff).writeonly().share("sharedram"); map(0xc000, 0xc7ff).writeonly().share("sharedram");
map(0x8000, 0xffff).r(m_membank, FUNC(address_map_bank_device::read8)); map(0x8000, 0xffff).r(m_membank, FUNC(address_map_bank_device::read8));
} }
// Overlapped RAM/Banked ROM // 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) void wardner_state::main_bank_map(address_map &map)
{ {
map(0x00000, 0x00fff).r(FUNC(wardner_state::wardner_sprite_r)).share("spriteram8"); map(0x00000, 0x00fff).r(FUNC(wardner_state::wardner_sprite_r)).share("spriteram8");
@ -338,24 +338,24 @@ INPUT_PORTS_END
static const gfx_layout charlayout = static const gfx_layout charlayout =
{ {
8,8, /* 8*8 characters */ 8,8, /* 8*8 characters */
2048, /* 2048 characters */ RGN_FRAC(1,3), /* 2048 characters */
3, /* 3 bits per pixel */ 3, /* 3 bits per pixel */
{ 0*2048*8*8, 1*2048*8*8, 2*2048*8*8 }, /* the bitplanes are separated */ { RGN_FRAC(0,3), RGN_FRAC(1,3), RGN_FRAC(2,3) }, /* the bitplanes are separated */
{ 0, 1, 2, 3, 4, 5, 6, 7 }, { STEP8(0,1) },
{ 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 }, { STEP8(0,8) },
8*8 /* every char takes 8 consecutive bytes */ 8*8 /* every char takes 8 consecutive bytes */
}; };
static const gfx_layout tilelayout = static const gfx_layout tilelayout =
{ {
8,8, /* 8*8 tiles */ 8,8, /* 8*8 tiles */
4096, /* 4096 tiles */ RGN_FRAC(1,4), /* 4096 tiles */
4, /* 4 bits per pixel */ 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 */ { RGN_FRAC(0,4), RGN_FRAC(1,4), RGN_FRAC(2,4), RGN_FRAC(3,4) }, /* the bitplanes are separated */
{ 0, 1, 2, 3, 4, 5, 6, 7 }, { STEP8(0,1) },
{ 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 }, { STEP8(0,8) },
8*8 /* every tile takes 8 consecutive bytes */ 8*8 /* every tile takes 8 consecutive bytes */
}; };
@ -369,12 +369,12 @@ GFXDECODE_END
void wardner_state::driver_start() void wardner_state::driver_start()
{ {
/* Save-State stuff in src/machine/twincobr.cpp */ /* Save-State stuff in src/machine/twincobr.cpp */
twincobr_driver_savestate(); driver_savestate();
} }
void wardner_state::machine_reset() void wardner_state::machine_reset()
{ {
MACHINE_RESET_CALL_MEMBER(twincobr); twincobr_state::machine_reset();
m_membank->set_bank(0); m_membank->set_bank(0);
} }
@ -429,7 +429,7 @@ void wardner_state::wardner(machine_config &config)
SCREEN(config, m_screen, SCREEN_TYPE_RASTER); SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
m_screen->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK); 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_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().set(m_spriteram8, FUNC(buffered_spriteram8_device::vblank_copy_rising));
m_screen->screen_vblank().append(FUNC(wardner_state::wardner_vblank_irq)); m_screen->screen_vblank().append(FUNC(wardner_state::wardner_vblank_irq));
m_screen->set_palette(m_palette); m_screen->set_palette(m_palette);

View File

@ -43,50 +43,52 @@ public:
void init_twincobr(); void init_twincobr();
protected: protected:
virtual void device_post_load() override;
virtual void machine_reset() override;
virtual void video_start() 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_spriteram8_device> m_spriteram8;
optional_device<buffered_spriteram16_device> m_spriteram16; optional_device<buffered_spriteram16_device> m_spriteram16;
int32_t m_fg_rom_bank; u32 m_fg_rom_bank;
int32_t m_bg_ram_bank; u32 m_bg_ram_bank;
int m_intenable; int m_intenable;
int m_dsp_on; int m_dsp_on;
int m_dsp_bio; int m_dsp_bio;
int m_fsharkbt_8741; int m_fsharkbt_8741;
int m_dsp_execute; int m_dsp_execute;
uint32_t m_dsp_addr_w; u32 m_dsp_addr_w;
uint32_t m_main_ram_seg; u32 m_main_ram_seg;
std::unique_ptr<uint16_t[]> m_bgvideoram16; std::unique_ptr<u16[]> m_bgvideoram16;
std::unique_ptr<uint16_t[]> m_fgvideoram16; std::unique_ptr<u16[]> m_fgvideoram16;
std::unique_ptr<uint16_t[]> m_txvideoram16; std::unique_ptr<u16[]> m_txvideoram16;
size_t m_bgvideoram_size; size_t m_bgvideoram_size;
size_t m_fgvideoram_size; size_t m_fgvideoram_size;
size_t m_txvideoram_size; size_t m_txvideoram_size;
int32_t m_txscrollx; s32 m_txscrollx;
int32_t m_txscrolly; s32 m_txscrolly;
int32_t m_fgscrollx; s32 m_fgscrollx;
int32_t m_fgscrolly; s32 m_fgscrolly;
int32_t m_bgscrollx; s32 m_bgscrollx;
int32_t m_bgscrolly; s32 m_bgscrolly;
int32_t m_txoffs; s32 m_txoffs;
int32_t m_fgoffs; s32 m_fgoffs;
int32_t m_bgoffs; s32 m_bgoffs;
int32_t m_display_on; s32 m_display_on;
tilemap_t *m_bg_tilemap; tilemap_t *m_bg_tilemap;
tilemap_t *m_fg_tilemap; tilemap_t *m_fg_tilemap;
tilemap_t *m_tx_tilemap; tilemap_t *m_tx_tilemap;
DECLARE_WRITE16_MEMBER(twincobr_dsp_addrsel_w); void twincobr_dsp_addrsel_w(u16 data);
DECLARE_READ16_MEMBER(twincobr_dsp_r); u16 twincobr_dsp_r();
DECLARE_WRITE16_MEMBER(twincobr_dsp_w); void twincobr_dsp_w(u16 data);
DECLARE_WRITE16_MEMBER(wardner_dsp_addrsel_w); void wardner_dsp_addrsel_w(u16 data);
DECLARE_READ16_MEMBER(wardner_dsp_r); u16 wardner_dsp_r();
DECLARE_WRITE16_MEMBER(wardner_dsp_w); void wardner_dsp_w(u16 data);
DECLARE_WRITE16_MEMBER(twincobr_dsp_bio_w); void twincobr_dsp_bio_w(u16 data);
DECLARE_READ16_MEMBER(fsharkbt_dsp_r); u16 fsharkbt_dsp_r();
DECLARE_WRITE16_MEMBER(fsharkbt_dsp_w); void fsharkbt_dsp_w(u16 data);
DECLARE_READ_LINE_MEMBER(twincobr_bio_r); DECLARE_READ_LINE_MEMBER(twincobr_bio_r);
DECLARE_WRITE_LINE_MEMBER(int_enable_w); DECLARE_WRITE_LINE_MEMBER(int_enable_w);
DECLARE_WRITE_LINE_MEMBER(dsp_int_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_counter_2_w);
DECLARE_WRITE_LINE_MEMBER(coin_lockout_1_w); DECLARE_WRITE_LINE_MEMBER(coin_lockout_1_w);
DECLARE_WRITE_LINE_MEMBER(coin_lockout_2_w); DECLARE_WRITE_LINE_MEMBER(coin_lockout_2_w);
DECLARE_READ16_MEMBER(twincobr_sharedram_r); u8 twincobr_sharedram_r(offs_t offset);
DECLARE_WRITE16_MEMBER(twincobr_sharedram_w); void twincobr_sharedram_w(offs_t offset, u8 data);
DECLARE_WRITE16_MEMBER(twincobr_txoffs_w); void twincobr_txoffs_w(offs_t offset, u16 data, u16 mem_mask = ~0);
DECLARE_READ16_MEMBER(twincobr_txram_r); u16 twincobr_txram_r();
DECLARE_WRITE16_MEMBER(twincobr_txram_w); void twincobr_txram_w(offs_t offset, u16 data, u16 mem_mask = ~0);
DECLARE_WRITE16_MEMBER(twincobr_bgoffs_w); void twincobr_bgoffs_w(offs_t offset, u16 data, u16 mem_mask = ~0);
DECLARE_READ16_MEMBER(twincobr_bgram_r); u16 twincobr_bgram_r();
DECLARE_WRITE16_MEMBER(twincobr_bgram_w); void twincobr_bgram_w(offs_t offset, u16 data, u16 mem_mask = ~0);
DECLARE_WRITE16_MEMBER(twincobr_fgoffs_w); void twincobr_fgoffs_w(offs_t offset, u16 data, u16 mem_mask = ~0);
DECLARE_READ16_MEMBER(twincobr_fgram_r); u16 twincobr_fgram_r();
DECLARE_WRITE16_MEMBER(twincobr_fgram_w); void twincobr_fgram_w(offs_t offset, u16 data, u16 mem_mask = ~0);
DECLARE_WRITE16_MEMBER(twincobr_txscroll_w); void twincobr_txscroll_w(offs_t offset, u16 data, u16 mem_mask = ~0);
DECLARE_WRITE16_MEMBER(twincobr_bgscroll_w); void twincobr_bgscroll_w(offs_t offset, u16 data, u16 mem_mask = ~0);
DECLARE_WRITE16_MEMBER(twincobr_fgscroll_w); void twincobr_fgscroll_w(offs_t offset, u16 data, u16 mem_mask = ~0);
DECLARE_WRITE16_MEMBER(twincobr_exscroll_w); void twincobr_exscroll_w(offs_t offset, u16 data);
DECLARE_WRITE8_MEMBER(wardner_txlayer_w); void wardner_txlayer_w(offs_t offset, u8 data);
DECLARE_WRITE8_MEMBER(wardner_bglayer_w); void wardner_bglayer_w(offs_t offset, u8 data);
DECLARE_WRITE8_MEMBER(wardner_fglayer_w); void wardner_fglayer_w(offs_t offset, u8 data);
DECLARE_WRITE8_MEMBER(wardner_txscroll_w); void wardner_txscroll_w(offs_t offset, u8 data);
DECLARE_WRITE8_MEMBER(wardner_bgscroll_w); void wardner_bgscroll_w(offs_t offset, u8 data);
DECLARE_WRITE8_MEMBER(wardner_fgscroll_w); void wardner_fgscroll_w(offs_t offset, u8 data);
DECLARE_WRITE8_MEMBER(wardner_exscroll_w); void wardner_exscroll_w(offs_t offset, u8 data);
DECLARE_READ8_MEMBER(wardner_videoram_r); u8 wardner_videoram_r(offs_t offset);
DECLARE_WRITE8_MEMBER(wardner_videoram_w); void wardner_videoram_w(offs_t offset, u8 data);
DECLARE_READ8_MEMBER(wardner_sprite_r); u8 wardner_sprite_r(offs_t offset);
DECLARE_WRITE8_MEMBER(wardner_sprite_w); void wardner_sprite_w(offs_t offset, u8 data);
TILE_GET_INFO_MEMBER(get_bg_tile_info); TILE_GET_INFO_MEMBER(get_bg_tile_info);
TILE_GET_INFO_MEMBER(get_fg_tile_info); TILE_GET_INFO_MEMBER(get_fg_tile_info);
TILE_GET_INFO_MEMBER(get_tx_tile_info); TILE_GET_INFO_MEMBER(get_tx_tile_info);
DECLARE_MACHINE_RESET(twincobr); u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
uint32_t screen_update_toaplan0(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
DECLARE_WRITE_LINE_MEMBER(twincobr_vblank_irq); DECLARE_WRITE_LINE_MEMBER(twincobr_vblank_irq);
DECLARE_WRITE_LINE_MEMBER(wardner_vblank_irq); DECLARE_WRITE_LINE_MEMBER(wardner_vblank_irq);
void twincobr_restore_dsp();
void twincobr_create_tilemaps(); void twincobr_create_tilemaps();
DECLARE_WRITE_LINE_MEMBER(display_on_w); DECLARE_WRITE_LINE_MEMBER(display_on_w);
DECLARE_WRITE_LINE_MEMBER(flipscreen_w); DECLARE_WRITE_LINE_MEMBER(flipscreen_w);
DECLARE_WRITE_LINE_MEMBER(bg_ram_bank_w); DECLARE_WRITE_LINE_MEMBER(bg_ram_bank_w);
DECLARE_WRITE_LINE_MEMBER(fg_rom_bank_w); DECLARE_WRITE_LINE_MEMBER(fg_rom_bank_w);
void twincobr_log_vram(); void log_vram();
void twincobr_driver_savestate(); void driver_savestate();
required_device<cpu_device> m_maincpu; required_device<cpu_device> m_maincpu;
required_device<tms32010_device> m_dsp; required_device<tms32010_device> m_dsp;
required_device<toaplan_scu_device> m_spritegen; 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 */ /* This sets the main CPU RAM address the DSP should */
/* read/write, via the DSP IO port 0 */ /* 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)); 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 */ /* 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) switch (m_main_ram_seg)
{ {
case 0x30000: case 0x30000:
@ -68,7 +68,7 @@ READ16_MEMBER(twincobr_state::twincobr_dsp_r)
return input_data; 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 */ /* Data written to main CPU RAM via DSP IO port 1 */
m_dsp_execute = 0; 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)); 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 */ /* This sets the main CPU RAM address the DSP should */
/* read/write, via the DSP IO port 0 */ /* 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)); 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 */ /* 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) switch (m_main_ram_seg)
{ {
case 0x7000: case 0x7000:
@ -118,7 +118,7 @@ READ16_MEMBER(twincobr_state::wardner_dsp_r)
return input_data; 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 */ /* Data written to main CPU RAM via DSP IO port 1 */
m_dsp_execute = 0; 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)); 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 */ /* data 0xffff means inhibit BIO line to DSP and enable */
/* communication to main processor */ /* 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 */ /* IO Port 2 used by Flying Shark bootleg */
/* DSP reads data from an extra MCU (8741) at IO port 2 */ /* 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); 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 */ /* Flying Shark bootleg DSP writes data to an extra MCU (8741) at IO port 2 */
#if 0 #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); 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]; 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;
{
m_sharedram[offset] = data & 0xff;
}
} }
MACHINE_RESET_MEMBER(twincobr_state,twincobr) void twincobr_state::machine_reset()
{ {
m_dsp_addr_w = 0; m_dsp_addr_w = 0;
m_main_ram_seg = 0; m_main_ram_seg = 0;
@ -259,7 +256,7 @@ MACHINE_RESET_MEMBER(twincobr_state,twincobr)
m_fsharkbt_8741 = -1; m_fsharkbt_8741 = -1;
} }
void twincobr_state::twincobr_driver_savestate() void twincobr_state::driver_savestate()
{ {
save_item(NAME(m_intenable)); save_item(NAME(m_intenable));
save_item(NAME(m_dsp_on)); 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_bio));
save_item(NAME(m_dsp_execute)); save_item(NAME(m_dsp_execute));
save_item(NAME(m_fsharkbt_8741)); 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) TILE_GET_INFO_MEMBER(twincobr_state::get_bg_tile_info)
{ {
int code, tile_number, color; const u16 code = m_bgvideoram16[tile_index+m_bg_ram_bank];
const u32 tile_number = code & 0x0fff;
code = m_bgvideoram16[tile_index+m_bg_ram_bank]; const u32 color = (code & 0xf000) >> 12;
tile_number = code & 0x0fff;
color = (code & 0xf000) >> 12;
SET_TILE_INFO_MEMBER(2, SET_TILE_INFO_MEMBER(2,
tile_number, tile_number,
color, 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) TILE_GET_INFO_MEMBER(twincobr_state::get_fg_tile_info)
{ {
int code, tile_number, color; const u16 code = m_fgvideoram16[tile_index];
const u32 tile_number = (code & 0x0fff) | m_fg_rom_bank;
code = m_fgvideoram16[tile_index]; const u32 color = (code & 0xf000) >> 12;
tile_number = (code & 0x0fff) | m_fg_rom_bank;
color = (code & 0xf000) >> 12;
SET_TILE_INFO_MEMBER(1, SET_TILE_INFO_MEMBER(1,
tile_number, tile_number,
color, 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) TILE_GET_INFO_MEMBER(twincobr_state::get_tx_tile_info)
{ {
int code, tile_number, color; const u16 code = m_txvideoram16[tile_index];
const u32 tile_number = code & 0x07ff;
code = m_txvideoram16[tile_index]; const u32 color = (code & 0xf800) >> 11;
tile_number = code & 0x07ff;
color = (code & 0xf800) >> 11;
SET_TILE_INFO_MEMBER(0, SET_TILE_INFO_MEMBER(0,
tile_number, tile_number,
color, color,
@ -93,9 +87,9 @@ void twincobr_state::video_start()
twincobr_create_tilemaps(); twincobr_create_tilemaps();
m_txvideoram16 = make_unique_clear<uint16_t[]>(m_txvideoram_size); m_txvideoram16 = make_unique_clear<u16[]>(m_txvideoram_size);
m_fgvideoram16 = make_unique_clear<uint16_t[]>(m_fgvideoram_size); m_fgvideoram16 = make_unique_clear<u16[]>(m_fgvideoram_size);
m_bgvideoram16 = make_unique_clear<uint16_t[]>(m_bgvideoram_size); m_bgvideoram16 = make_unique_clear<u16[]>(m_bgvideoram_size);
m_display_on = 0; m_display_on = 0;
@ -135,140 +129,148 @@ WRITE_LINE_MEMBER(twincobr_state::flipscreen_w)
WRITE_LINE_MEMBER(twincobr_state::bg_ram_bank_w) WRITE_LINE_MEMBER(twincobr_state::bg_ram_bank_w)
{ {
m_bg_ram_bank = state ? 0x1000 : 0x0000; m_bg_ram_bank = state ? 0x1000 : 0x0000;
m_bg_tilemap->mark_all_dirty();
} }
WRITE_LINE_MEMBER(twincobr_state::fg_rom_bank_w) WRITE_LINE_MEMBER(twincobr_state::fg_rom_bank_w)
{ {
m_fg_rom_bank = state ? 0x1000 : 0x0000; 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); COMBINE_DATA(&m_txoffs);
m_txoffs %= m_txvideoram_size; m_txoffs %= m_txvideoram_size;
} }
READ16_MEMBER(twincobr_state::twincobr_txram_r) u16 twincobr_state::twincobr_txram_r()
{ {
return m_txvideoram16[m_txoffs]; 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]); COMBINE_DATA(&m_txvideoram16[m_txoffs]);
m_tx_tilemap->mark_tile_dirty(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); COMBINE_DATA(&m_bgoffs);
m_bgoffs %= (m_bgvideoram_size >> 1); 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]; 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]); COMBINE_DATA(&m_bgvideoram16[m_bgoffs+m_bg_ram_bank]);
m_bg_tilemap->mark_tile_dirty((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); COMBINE_DATA(&m_fgoffs);
m_fgoffs %= m_fgvideoram_size; m_fgoffs %= m_fgvideoram_size;
} }
READ16_MEMBER(twincobr_state::twincobr_fgram_r) u16 twincobr_state::twincobr_fgram_r()
{ {
return m_fgvideoram16[m_fgoffs]; 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]); COMBINE_DATA(&m_fgvideoram16[m_fgoffs]);
m_fg_tilemap->mark_tile_dirty(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); COMBINE_DATA(&m_txscrollx);
m_tx_tilemap->set_scrollx(0, m_txscrollx); m_tx_tilemap->set_scrollx(0, m_txscrollx);
} }
else { else
{
COMBINE_DATA(&m_txscrolly); COMBINE_DATA(&m_txscrolly);
m_tx_tilemap->set_scrolly(0, 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); COMBINE_DATA(&m_bgscrollx);
m_bg_tilemap->set_scrollx(0, m_bgscrollx); m_bg_tilemap->set_scrollx(0, m_bgscrollx);
} }
else { else
{
COMBINE_DATA(&m_bgscrolly); COMBINE_DATA(&m_bgscrolly);
m_bg_tilemap->set_scrolly(0, 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); COMBINE_DATA(&m_fgscrollx);
m_fg_tilemap->set_scrollx(0, m_fgscrollx); m_fg_tilemap->set_scrollx(0, m_fgscrollx);
} }
else { else
{
COMBINE_DATA(&m_fgscrolly); COMBINE_DATA(&m_fgscrolly);
m_fg_tilemap->set_scrolly(0, 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); 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); else logerror("PC - write %04x to unknown video scroll X register\n",data);
} }
/******************** Wardner interface to this hardware ********************/ /******************** 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); 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); 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); 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); 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); 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); 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) 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); int shift = 8 * (offset & 1);
switch (offset/2) { switch (offset / 2)
case 0: return twincobr_txram_r(space,0,0xffff) >> shift; {
case 1: return twincobr_bgram_r(space,0,0xffff) >> shift; case 0: return twincobr_txram_r() >> shift;
case 2: return twincobr_fgram_r(space,0,0xffff) >> shift; case 1: return twincobr_bgram_r() >> shift;
case 2: return twincobr_fgram_r() >> shift;
} }
return 0; 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); int shift = 8 * (offset & 1);
switch (offset/2) { 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 0: twincobr_txram_w(0,data << shift, 0xff << shift); break;
case 2: twincobr_fgram_w(space,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; int shift = (offset & 1) * 8;
return spriteram16[offset/2] >> shift; 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) if (offset & 1)
spriteram16[offset/2] = (spriteram16[offset/2] & 0x00ff) | (data << 8); spriteram16[offset/2] = (spriteram16[offset/2] & 0x00ff) | (data << 8);
else 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 #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; u16 *buffered_spriteram16;
uint32_t bytes; u32 bytes;
if (m_spriteram16 != nullptr) if (m_spriteram16 != nullptr)
{ {
buffered_spriteram16 = m_spriteram16->buffer(); buffered_spriteram16 = m_spriteram16->buffer();
@ -373,7 +377,7 @@ uint32_t twincobr_state::screen_update_toaplan0(screen_device &screen, bitmap_in
} }
else else
{ {
buffered_spriteram16 = reinterpret_cast<uint16_t *>(m_spriteram8->buffer()); buffered_spriteram16 = reinterpret_cast<u16 *>(m_spriteram8->buffer());
bytes = m_spriteram8->bytes(); bytes = m_spriteram8->bytes();
} }