summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author angelosa <salese_corp_ltd@email.it>2018-05-28 00:25:32 +0200
committer angelosa <salese_corp_ltd@email.it>2018-05-28 01:39:44 +0200
commit16428d169f8e968cd025b5178a0b142334b49063 (patch)
tree08d5dc414ca6f4c5094c93a4e9b3b9588db750b1
parent1a0ca46e484a460b5ed8856fc0749ef71215211a (diff)
tatsumi.cpp: added vertical text scrolling to Round Up 5 [Angelo Salese]
-rw-r--r--src/mame/drivers/tatsumi.cpp32
-rw-r--r--src/mame/includes/tatsumi.h12
-rw-r--r--src/mame/video/tatsumi.cpp48
3 files changed, 70 insertions, 22 deletions
diff --git a/src/mame/drivers/tatsumi.cpp b/src/mame/drivers/tatsumi.cpp
index 7c2f9102b76..f73dfbd3951 100644
--- a/src/mame/drivers/tatsumi.cpp
+++ b/src/mame/drivers/tatsumi.cpp
@@ -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 */
diff --git a/src/mame/includes/tatsumi.h b/src/mame/includes/tatsumi.h
index 7e8b9bf6766..7a43dca4ff6 100644
--- a/src/mame/includes/tatsumi.h
+++ b/src/mame/includes/tatsumi.h
@@ -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);
diff --git a/src/mame/video/tatsumi.cpp b/src/mame/video/tatsumi.cpp
index ebb58068256..6b69e6b0b5c 100644
--- a/src/mame/video/tatsumi.cpp
+++ b/src/mame/video/tatsumi.cpp
@@ -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);