diff options
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 |
commit | 16428d169f8e968cd025b5178a0b142334b49063 (patch) | |
tree | 08d5dc414ca6f4c5094c93a4e9b3b9588db750b1 | |
parent | 1a0ca46e484a460b5ed8856fc0749ef71215211a (diff) |
tatsumi.cpp: added vertical text scrolling to Round Up 5 [Angelo Salese]
-rw-r--r-- | src/mame/drivers/tatsumi.cpp | 32 | ||||
-rw-r--r-- | src/mame/includes/tatsumi.h | 12 | ||||
-rw-r--r-- | src/mame/video/tatsumi.cpp | 48 |
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); |