From 94064e44746c6abcdfbf15bfb64b8ed6b72705fe Mon Sep 17 00:00:00 2001 From: David Haywood <28625134+DavidHaywood@users.noreply.github.com> Date: Sat, 10 Jul 2021 18:32:01 +0100 Subject: [PATCH] batman.cpp - offset layers to align with real PCB videos (#8275) --- src/mame/drivers/batman.cpp | 6 +++++- src/mame/includes/batman.h | 4 +++- src/mame/video/atarimo.cpp | 3 ++- src/mame/video/atarimo.h | 4 ++++ src/mame/video/atarivad.cpp | 7 ++++--- src/mame/video/atarivad.h | 4 ++++ 6 files changed, 22 insertions(+), 6 deletions(-) diff --git a/src/mame/drivers/batman.cpp b/src/mame/drivers/batman.cpp index d284fbd1eb5..b3b76b07636 100644 --- a/src/mame/drivers/batman.cpp +++ b/src/mame/drivers/batman.cpp @@ -199,10 +199,14 @@ void batman_state::batman(machine_config &config) ATARI_VAD(config, m_vad, 0, m_screen); m_vad->scanline_int_cb().set_inputline(m_maincpu, M68K_IRQ_4); + m_vad->set_xoffsets(2, 6); + TILEMAP(config, "vad:playfield", "gfxdecode", 2, 8, 8, TILEMAP_SCAN_COLS, 64, 64).set_info_callback(FUNC(batman_state::get_playfield_tile_info)); TILEMAP(config, "vad:playfield2", "gfxdecode", 2, 8, 8, TILEMAP_SCAN_COLS, 64, 64, 0).set_info_callback(FUNC(batman_state::get_playfield2_tile_info)); TILEMAP(config, "vad:alpha", "gfxdecode", 2, 8, 8, TILEMAP_SCAN_ROWS, 64, 32, 0).set_info_callback(FUNC(batman_state::get_alpha_tile_info)); - ATARI_MOTION_OBJECTS(config, "vad:mob", 0, m_screen, batman_state::s_mob_config).set_gfxdecode("gfxdecode"); + + ATARI_MOTION_OBJECTS(config, m_mob, 0, m_screen, batman_state::s_mob_config).set_gfxdecode("gfxdecode"); + m_mob->set_xoffset(-1); SCREEN(config, m_screen, SCREEN_TYPE_RASTER); m_screen->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK); diff --git a/src/mame/includes/batman.h b/src/mame/includes/batman.h index 219118a7e8a..9820d7f33f6 100644 --- a/src/mame/includes/batman.h +++ b/src/mame/includes/batman.h @@ -25,7 +25,8 @@ public: m_maincpu(*this, "maincpu"), m_screen(*this, "screen"), m_jsa(*this, "jsa"), - m_vad(*this, "vad") + m_vad(*this, "vad"), + m_mob(*this, "vad:mob") { } void init_batman(); @@ -46,6 +47,7 @@ private: required_device m_screen; required_device m_jsa; required_device m_vad; + required_device m_mob; uint16_t m_latch_data; uint8_t m_alpha_tile_bank; diff --git a/src/mame/video/atarimo.cpp b/src/mame/video/atarimo.cpp index c17dc39e324..8611de1bbb4 100644 --- a/src/mame/video/atarimo.cpp +++ b/src/mame/video/atarimo.cpp @@ -150,6 +150,7 @@ atari_motion_objects_device::atari_motion_objects_device(const machine_config &m , m_activelast(nullptr) , m_last_xpos(0) , m_next_xpos(0) + , m_xoffset(0) , m_gfxdecode(*this, finder_base::DUMMY_TAG) { } @@ -438,7 +439,7 @@ void atari_motion_objects_device::render_object(bitmap_ind16 &bitmap, const rect // extract data from the various words int code = m_codelookup[rawcode]; int color = m_colorlookup[m_colormask.extract(entry)]; - int xpos = m_xposmask.extract(entry); + int xpos = m_xposmask.extract(entry) + m_xoffset; int ypos = -m_yposmask.extract(entry); int hflip = m_hflipmask.extract(entry); int vflip = m_vflipmask.extract(entry); diff --git a/src/mame/video/atarimo.h b/src/mame/video/atarimo.h index be98a3ad8a8..3f5c72a5f48 100644 --- a/src/mame/video/atarimo.h +++ b/src/mame/video/atarimo.h @@ -83,6 +83,7 @@ public: // configuration template void set_gfxdecode(T &&tag) { m_gfxdecode.set_tag(std::forward(tag)); } void set_config(const atari_motion_objects_config &config) { static_cast(*this) = config; } + void set_xoffset(int xoffset) { m_xoffset = xoffset; } // getters int bank() const { return m_bank; } @@ -217,6 +218,9 @@ private: uint32_t m_last_xpos; // (during processing) the previous X position uint32_t m_next_xpos; // (during processing) the next X position + + int m_xoffset; // global xoffset for sprites + required_device m_gfxdecode; }; diff --git a/src/mame/video/atarivad.cpp b/src/mame/video/atarivad.cpp index 6588d2faab9..40c418945e7 100644 --- a/src/mame/video/atarivad.cpp +++ b/src/mame/video/atarivad.cpp @@ -44,6 +44,8 @@ atari_vad_device::atari_vad_device(const machine_config &mconfig, const char *ta , m_pf1_yscroll(0) , m_mo_xscroll(0) , m_mo_yscroll(0) + , m_pf_xoffset(0) + , m_pf2_xoffset(4) { } @@ -362,12 +364,11 @@ void atari_vad_device::internal_control_write(offs_t offset, uint16_t newword) inline void atari_vad_device::update_pf_xscrolls() { - m_playfield_tilemap->set_scrollx(0, m_pf0_xscroll_raw + ((m_pf1_xscroll_raw) & 7)); + m_playfield_tilemap->set_scrollx(0, m_pf0_xscroll_raw + ((m_pf1_xscroll_raw) & 7) + m_pf_xoffset); if (m_playfield2_tilemap != nullptr) - m_playfield2_tilemap->set_scrollx(0, m_pf1_xscroll_raw + 4); + m_playfield2_tilemap->set_scrollx(0, m_pf1_xscroll_raw + m_pf2_xoffset); } - //------------------------------------------------- // update_parameter: Update parameters, shared // between end-of-frame, tilerow updates, and diff --git a/src/mame/video/atarivad.h b/src/mame/video/atarivad.h index c63f4262b58..b0ea3dcac70 100644 --- a/src/mame/video/atarivad.h +++ b/src/mame/video/atarivad.h @@ -38,6 +38,7 @@ public: // configuration helpers auto scanline_int_cb() { return m_scanline_int_cb.bind(); } + void set_xoffsets(int xoffset, int xoffset2) { m_pf_xoffset = xoffset; m_pf2_xoffset = xoffset2; } // getters tilemap_device &alpha() const { return *m_alpha_tilemap; } @@ -102,6 +103,9 @@ private: uint32_t m_mo_yscroll; // sprite xscroll uint16_t m_control[0x40/2]; // control data + + int m_pf_xoffset; + int m_pf2_xoffset; };