mirror of
https://github.com/holub/mame
synced 2025-10-05 16:50:57 +03:00
tatsumi.cpp: added vertical text scrolling to Round Up 5 [Angelo Salese]
This commit is contained in:
parent
1a0ca46e48
commit
16428d169f
@ -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 */
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user