tatsumi.cpp: added vertical text scrolling to Round Up 5 [Angelo Salese]

This commit is contained in:
angelosa 2018-05-28 00:25:32 +02:00
parent 1a0ca46e48
commit 16428d169f
3 changed files with 70 additions and 22 deletions

View File

@ -34,6 +34,7 @@
checkable in attract mode;
- Split these games into individual drivers, write new devices for video routines.
- Dip switches
- Deviceify HD6445 (superset of 6845)
- Various other things..
@ -220,6 +221,14 @@ WRITE16_MEMBER(cyclwarr_state::cyclwarr_videoram_w)
}
}
WRITE16_MEMBER(cyclwarr_state::output_w)
{
machine().bookkeeping().coin_counter_w(0, data & 1);
machine().bookkeeping().coin_counter_w(1, data & 2);
if(data & 0xfffc)
logerror("output_w = %04x & %04x\n",data,mem_mask);
}
/***************************************************************************/
void apache3_state::apache3_v30_map(address_map &map)
@ -228,7 +237,7 @@ void apache3_state::apache3_v30_map(address_map &map)
map(0x04000, 0x07fff).ram().share("nvram");
map(0x08000, 0x08fff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette");
map(0x0c000, 0x0dfff).ram().w(this, FUNC(apache3_state::text_w)).share("videoram");
map(0x0e800, 0x0e803).nopw(); // CRT
map(0x0e800, 0x0e803).w(this, FUNC(tatsumi_state::hd6445_crt_w)).umask16(0x00ff);
map(0x0f000, 0x0f001).portr("DSW");
map(0x0f000, 0x0f001).nopw(); // todo
map(0x0f800, 0x0f801).rw(this, FUNC(apache3_state::apache3_bank_r), FUNC(apache3_state::apache3_bank_w));
@ -242,7 +251,7 @@ void apache3_state::apache3_68000_map(address_map &map)
map(0x00000, 0x7ffff).rom();
map(0x80000, 0x83fff).ram().share("68k_ram");
map(0x90000, 0x93fff).ram().share("spriteram");
map(0x9a000, 0x9a1ff).w(this, FUNC(apache3_state::tatsumi_sprite_control_w)).share("sprite_ctlram");
map(0x9a000, 0x9a1ff).rw(this, FUNC(apache3_state::tatsumi_sprite_control_r), FUNC(apache3_state::tatsumi_sprite_control_w)).share("sprite_ctlram");
map(0xa0000, 0xa0001).w(this, FUNC(apache3_state::apache3_rotate_w)); // /BNKCS
map(0xb0000, 0xb0001).w(this, FUNC(apache3_state::apache3_z80_ctrl_w));
map(0xc0000, 0xc0001).w(this, FUNC(apache3_state::apache3_road_z_w)); // /LINCS
@ -273,7 +282,7 @@ void roundup5_state::roundup5_v30_map(address_map &map)
{
map(0x00000, 0x07fff).ram();
map(0x08000, 0x0bfff).ram().w(this, FUNC(roundup5_state::text_w)).share("videoram");
map(0x0c000, 0x0c003).w(this, FUNC(roundup5_state::roundup5_crt_w));
map(0x0c000, 0x0c003).w(this, FUNC(tatsumi_state::hd6445_crt_w)).umask16(0x00ff);
map(0x0d000, 0x0d001).portr("DSW");
map(0x0d400, 0x0d40f).writeonly().share("ru5_unknown0");
map(0x0d800, 0x0d801).writeonly().share("ru5_unknown1"); // VRAM2 X scroll (todo)
@ -291,7 +300,7 @@ void roundup5_state::roundup5_68000_map(address_map &map)
map(0x00000, 0x7ffff).rom();
map(0x80000, 0x83fff).ram().share("68k_ram");
map(0x90000, 0x93fff).ram().share("spriteram");
map(0x9a000, 0x9a1ff).w(this, FUNC(roundup5_state::tatsumi_sprite_control_w)).share("sprite_ctlram");
map(0x9a000, 0x9a1ff).rw(this, FUNC(roundup5_state::tatsumi_sprite_control_r), FUNC(roundup5_state::tatsumi_sprite_control_w)).share("sprite_ctlram");
map(0xa0000, 0xa0fff).ram().share("roundup_r_ram"); // Road control data
map(0xb0000, 0xb0fff).ram().share("roundup_p_ram"); // Road pixel data
map(0xc0000, 0xc0fff).ram().share("roundup_l_ram"); // Road colour data
@ -322,12 +331,14 @@ void cyclwarr_state::cyclwarr_68000a_map(address_map &map)
map(0x0a2000, 0x0a2007).w(this, FUNC(cyclwarr_state::bigfight_a20000_w));
map(0x0a4000, 0x0a4001).w(this, FUNC(cyclwarr_state::bigfight_a40000_w));
map(0x0a6000, 0x0a6001).w(this, FUNC(cyclwarr_state::bigfight_a60000_w));
map(0x0ac000, 0x0ac003).w(this, FUNC(tatsumi_state::hd6445_crt_w)).umask16(0x00ff);
map(0x0b8000, 0x0b8001).w(this, FUNC(cyclwarr_state::cyclwarr_sound_w)).umask16(0xff00);
map(0x0b9000, 0x0b900f).rw("io1", FUNC(cxd1095_device::read), FUNC(cxd1095_device::write)).umask16(0x00ff).cswidth(16);
map(0x0ba000, 0x0ba00f).rw("io2", FUNC(cxd1095_device::read), FUNC(cxd1095_device::write)).umask16(0x00ff).cswidth(16);
map(0x0bc000, 0x0bc001).w(this, FUNC(cyclwarr_state::output_w));
map(0x0c0000, 0x0c3fff).rw(this, FUNC(cyclwarr_state::cyclwarr_sprite_r), FUNC(cyclwarr_state::cyclwarr_sprite_w)).share("spriteram");
map(0x0ca000, 0x0ca1ff).w(this, FUNC(cyclwarr_state::tatsumi_sprite_control_w)).share("sprite_ctlram");
map(0x0ca000, 0x0ca1ff).rw(this, FUNC(cyclwarr_state::tatsumi_sprite_control_r), FUNC(cyclwarr_state::tatsumi_sprite_control_w)).share("sprite_ctlram");
map(0x0d0000, 0x0d3fff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette");
map(0x140000, 0x1bffff).bankr("bank2"); /* CPU B ROM */
map(0x2c0000, 0x33ffff).bankr("bank1"); /* CPU A ROM */
@ -347,7 +358,7 @@ void cyclwarr_state::cyclwarr_68000b_map(address_map &map)
map(0x0b9000, 0x0b900f).rw("io1", FUNC(cxd1095_device::read), FUNC(cxd1095_device::write)).umask16(0x00ff).cswidth(16);
map(0x0ba000, 0x0ba00f).rw("io2", FUNC(cxd1095_device::read), FUNC(cxd1095_device::write)).umask16(0x00ff).cswidth(16);
map(0x0c0000, 0x0c3fff).rw(this, FUNC(cyclwarr_state::cyclwarr_sprite_r), FUNC(cyclwarr_state::cyclwarr_sprite_w));
map(0x0ca000, 0x0ca1ff).w(this, FUNC(cyclwarr_state::tatsumi_sprite_control_w));
map(0x0ca000, 0x0ca1ff).rw(this, FUNC(cyclwarr_state::tatsumi_sprite_control_r), FUNC(cyclwarr_state::tatsumi_sprite_control_w)).share("sprite_ctlram");
map(0x0d0000, 0x0d3fff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette");
map(0x140000, 0x1bffff).bankr("bank2"); /* CPU B ROM */
map(0x2c0000, 0x33ffff).bankr("bank1"); /* CPU A ROM */
@ -365,6 +376,7 @@ void cyclwarr_state::cyclwarr_z80_map(address_map &map)
/******************************************************************************/
// TODO: merge with above
void cyclwarr_state::bigfight_68000a_map(address_map &map)
{
map(0x000000, 0x00ffff).ram().share("cw_cpua_ram");
@ -378,12 +390,14 @@ void cyclwarr_state::bigfight_68000a_map(address_map &map)
map(0x0a2000, 0x0a2007).w(this, FUNC(cyclwarr_state::bigfight_a20000_w));
map(0x0a4000, 0x0a4001).w(this, FUNC(cyclwarr_state::bigfight_a40000_w));
map(0x0a6000, 0x0a6001).w(this, FUNC(cyclwarr_state::bigfight_a60000_w));
map(0x0ac000, 0x0ac003).w(this, FUNC(tatsumi_state::hd6445_crt_w)).umask16(0x00ff);
map(0x0b8000, 0x0b8001).w(this, FUNC(cyclwarr_state::cyclwarr_sound_w)).umask16(0xff00);
map(0x0b9000, 0x0b900f).rw("io1", FUNC(cxd1095_device::read), FUNC(cxd1095_device::write)).umask16(0x00ff).cswidth(16);
map(0x0ba000, 0x0ba00f).rw("io2", FUNC(cxd1095_device::read), FUNC(cxd1095_device::write)).umask16(0x00ff).cswidth(16);
map(0x0bc000, 0x0bc001).w(this, FUNC(cyclwarr_state::output_w));
map(0x0c0000, 0x0c3fff).rw(this, FUNC(cyclwarr_state::cyclwarr_sprite_r), FUNC(cyclwarr_state::cyclwarr_sprite_w)).share("spriteram");
map(0x0ca000, 0x0ca1ff).w(this, FUNC(cyclwarr_state::tatsumi_sprite_control_w)).share("sprite_ctlram");
map(0x0ca000, 0x0ca1ff).rw(this, FUNC(cyclwarr_state::tatsumi_sprite_control_r), FUNC(cyclwarr_state::tatsumi_sprite_control_w)).share("sprite_ctlram");
map(0x0d0000, 0x0d3fff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette");
map(0x100000, 0x17ffff).bankr("bank2"); /* CPU A ROM */
map(0x200000, 0x27ffff).bankr("bank1"); /* CPU B ROM */
@ -401,7 +415,7 @@ void cyclwarr_state::bigfight_68000b_map(address_map &map)
map(0x0b9000, 0x0b900f).rw("io1", FUNC(cxd1095_device::read), FUNC(cxd1095_device::write)).umask16(0x00ff).cswidth(16);
map(0x0ba000, 0x0ba00f).rw("io2", FUNC(cxd1095_device::read), FUNC(cxd1095_device::write)).umask16(0x00ff).cswidth(16);
map(0x0c0000, 0x0c3fff).rw(this, FUNC(cyclwarr_state::cyclwarr_sprite_r), FUNC(cyclwarr_state::cyclwarr_sprite_w));
map(0x0ca000, 0x0ca1ff).w(this, FUNC(cyclwarr_state::tatsumi_sprite_control_w));
map(0x0ca000, 0x0ca1ff).rw(this, FUNC(cyclwarr_state::tatsumi_sprite_control_r), FUNC(cyclwarr_state::tatsumi_sprite_control_w)).share("sprite_ctlram");
map(0x0d0000, 0x0d3fff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette");
map(0x100000, 0x17ffff).bankr("bank2"); /* CPU A ROM */
map(0x200000, 0x27ffff).bankr("bank1"); /* CPU B ROM */

View File

@ -52,17 +52,25 @@ public:
DECLARE_WRITE16_MEMBER(text_w);
DECLARE_READ16_MEMBER(tatsumi_v30_68000_r);
DECLARE_WRITE16_MEMBER(tatsumi_v30_68000_w);
DECLARE_READ16_MEMBER(tatsumi_sprite_control_r);
DECLARE_WRITE16_MEMBER(tatsumi_sprite_control_w);
TILE_GET_INFO_MEMBER(get_text_tile_info);
INTERRUPT_GEN_MEMBER(v30_interrupt);
DECLARE_READ8_MEMBER(tatsumi_hack_ym2151_r);
DECLARE_READ8_MEMBER(tatsumi_hack_oki_r);
DECLARE_WRITE8_MEMBER(hd6445_crt_w);
void tatsumi_reset();
template<class _BitmapClass> void draw_sprites(_BitmapClass &bitmap, const rectangle &cliprect, int write_priority_only, int rambank);
template<class _BitmapClass> inline void roundupt_drawgfxzoomrotate( _BitmapClass &dest_bmp, const rectangle &clip,
gfx_element *gfx, uint32_t code,uint32_t color,int flipx,int flipy,uint32_t ssx,uint32_t ssy,
int scalex, int scaley, int rotate, int write_priority_only );
void update_cluts(int fake_palette_offset, int object_base, int length);
protected:
uint8_t m_hd6445_reg[64];
private:
uint8_t m_hd6445_address;
};
class apache3_state : public tatsumi_state
@ -142,7 +150,6 @@ public:
DECLARE_WRITE16_MEMBER(roundup5_e0000_w);
DECLARE_READ16_MEMBER(roundup5_vram_r);
DECLARE_WRITE16_MEMBER(roundup5_vram_w);
DECLARE_WRITE16_MEMBER(roundup5_crt_w);
void init_roundup5();
DECLARE_VIDEO_START(roundup5);
@ -166,8 +173,6 @@ private:
required_shared_ptr<uint16_t> m_roundup_l_ram;
std::unique_ptr<uint16_t[]> m_roundup5_vram;
uint8_t m_roundupt_crt_selected_reg;
uint8_t m_roundupt_crt_reg[64];
};
class cyclwarr_state : public tatsumi_state
@ -190,6 +195,7 @@ public:
DECLARE_WRITE16_MEMBER(bigfight_a60000_w);
DECLARE_WRITE8_MEMBER(cyclwarr_control_w);
DECLARE_WRITE8_MEMBER(cyclwarr_sound_w);
DECLARE_WRITE16_MEMBER(output_w);
template<int Bank> DECLARE_READ16_MEMBER(cyclwarr_videoram_r);
template<int Bank> DECLARE_WRITE16_MEMBER(cyclwarr_videoram_w);

View File

@ -7,6 +7,11 @@
/******************************************************************************/
READ16_MEMBER(tatsumi_state::tatsumi_sprite_control_r)
{
return m_sprite_control_ram[offset];
}
WRITE16_MEMBER(tatsumi_state::tatsumi_sprite_control_w)
{
COMBINE_DATA(&m_sprite_control_ram[offset]);
@ -56,14 +61,33 @@ WRITE16_MEMBER(tatsumi_state::text_w)
m_tx_layer->mark_tile_dirty(offset);
}
WRITE16_MEMBER(roundup5_state::roundup5_crt_w)
// TODO: move into device
WRITE8_MEMBER(tatsumi_state::hd6445_crt_w)
{
if (offset==0 && ACCESSING_BITS_0_7)
m_roundupt_crt_selected_reg=data&0x3f;
if (offset==1 && ACCESSING_BITS_0_7) {
m_roundupt_crt_reg[m_roundupt_crt_selected_reg]=data;
// if (m_roundupt_crt_selected_reg!=0xa && m_roundupt_crt_selected_reg!=0xb && m_roundupt_crt_selected_reg!=29)
// logerror("%s: Crt write %02x %02x\n",m_maincpu->pc(),m_roundupt_crt_selected_reg,data);
if (offset==0)
m_hd6445_address = data & 0x3f;
if (offset==1)
{
m_hd6445_reg[m_hd6445_address] = data;
static const char *regnames[40] =
{
"Horizontal Total Characters", "Horizontal Displayed Characters", "Horizontal Sync Position", "Sync Width",
"Vertical Total Rows", "Vertical Total Adjust", "Vertical Displayed Rows", "Vertical Sync Position",
"Interlace Mode and Skew", "Max Raster Address", "Cursor 1 Start", "Cursor 1 End",
"Screen 1 Start Address (H)", "Screen 1 Start Address (L)", "Cursor 1 Address (H)", "Cursor 1 Address (L)",
"Light Pen (H) (RO)", "Light Pen (L) (RO)", "Screen 2 Start Position", "Screen 2 Start Address (H)",
"Screen 2 Start Address (L)", "Screen 3 Start Position", "Screen 3 Start Address (H)", "Screen 3 Start Address (L)",
"Screen 4 Start Position", "Screen 4 Start Address (H)", "Screen 4 Start Address (L)", "Vertical Sync Position Adjust",
"Light Pen Raster (RO)", "Smooth Scrolling", "Control 1", "Control 2",
"Control 3", "Memory Width Offset", "Cursor 2 Start", "Cursor 2 End",
"Cursor 2 Address (H)", "Cursor 2 Address (L)", "Cursor 1 Width", "Cursor 2 Width"
};
if(m_hd6445_address < 40)
logerror("HD6445: register %s [%02x R%d] set %02x\n",regnames[m_hd6445_address],m_hd6445_address,m_hd6445_address,data);
else
logerror("HD6445: illegal register access [%02x R%d] set %02x\n",m_hd6445_address,m_hd6445_address,data);
}
}
@ -1019,11 +1043,15 @@ uint32_t roundup5_state::screen_update_roundup5(screen_device &screen, bitmap_rg
{
// uint16_t bg_x_scroll=m_roundup5_unknown1[0];
// uint16_t bg_y_scroll=m_roundup5_unknown2[0];
int tx_start_addr;
tx_start_addr = (m_hd6445_reg[0xc] << 8) | (m_hd6445_reg[0xd]);
tx_start_addr &= 0x3fff;
update_cluts(1024, 512, 4096);
m_tx_layer->set_scrollx(0,24);
m_tx_layer->set_scrolly(0,0); //(((m_roundupt_crt_reg[0xe]<<8)|m_roundupt_crt_reg[0xf])>>5) + 96);
m_tx_layer->set_scrolly(0,(tx_start_addr >> 4) | m_hd6445_reg[0x1d]);
bitmap.fill(m_palette->pen(384), cliprect); // todo
screen.priority().fill(0, cliprect);