diff --git a/src/mame/drivers/dorachan.cpp b/src/mame/drivers/dorachan.cpp index 5012c96dab7..dca16872560 100644 --- a/src/mame/drivers/dorachan.cpp +++ b/src/mame/drivers/dorachan.cpp @@ -8,6 +8,13 @@ Similar to Beam Invader Todo: - discrete sound - dips (if any) - bits 5,6,7 of input port 0 ? + +Gameplay: run over dots in lower half while avoiding monsters and trees. This draws +back the red curtain blocking access to top part of the screen. Go through and new dots +below are worth more points. + +It appears that unused bits in port 03 are to operate the discrete sound channels. + */ #include "emu.h" @@ -19,14 +26,31 @@ class dorachan_state : public driver_device { public: dorachan_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_screen(*this, "screen"), - m_palette(*this, "palette"), - m_videoram(*this, "videoram"), - m_colors(*this, "colors") + : driver_device(mconfig, type, tag) + , m_maincpu(*this, "maincpu") + , m_screen(*this, "screen") + , m_palette(*this, "palette") + , m_videoram(*this, "videoram") + , m_colors(*this, "colors") { } + DECLARE_WRITE8_MEMBER(control_w); + DECLARE_WRITE8_MEMBER(protection_w); + DECLARE_READ8_MEMBER(protection_r); + DECLARE_READ8_MEMBER(v128_r); + uint32_t screen_update_dorachan(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); + void dorachan(machine_config &config); + void dorachan_io_map(address_map &map); + void dorachan_map(address_map &map); + +private: + // internal state + uint8_t m_flip_screen; + uint16_t m_prot_value; + + virtual void machine_start() override; + virtual void machine_reset() override; + // devices, memory pointers required_device m_maincpu; required_device m_screen; @@ -34,20 +58,6 @@ public: required_shared_ptr m_videoram; required_region_ptr m_colors; - - // internal state - uint8_t m_flip_screen; - - DECLARE_WRITE8_MEMBER(control_w); - DECLARE_READ8_MEMBER(protection_r); - DECLARE_READ8_MEMBER(v128_r); - uint32_t screen_update_dorachan(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); - - virtual void machine_start() override; - virtual void machine_reset() override; - void dorachan(machine_config &config); - void dorachan_io_map(address_map &map); - void dorachan_map(address_map &map); }; @@ -79,11 +89,8 @@ uint32_t dorachan_state::screen_update_dorachan(screen_device &screen, bitmap_rg for (int i = 0; i < 8; i++) { - uint8_t color = (data & 0x01) ? fore_color : 0; - bitmap.pix32(y, x) = m_palette->pen_color(color); - - data = data >> 1; - x = x + 1; + uint8_t color = BIT(data, i) ? fore_color : 0; + bitmap.pix32(y, x++) = m_palette->pen_color(color); } } @@ -98,35 +105,45 @@ uint32_t dorachan_state::screen_update_dorachan(screen_device &screen, bitmap_rg * *************************************/ +WRITE8_MEMBER(dorachan_state::protection_w) +{ + // e0 seems like some sort of control byte? + // ignore f3 writes, written after every command? + if (data != 0xf3) + { + m_prot_value <<= 8; + m_prot_value |= data; + } +} + READ8_MEMBER(dorachan_state::protection_r) { - uint8_t ret = 0; - - switch (m_maincpu->pcbase()) + switch (m_prot_value) { - case 0x70ce: ret = 0xf2; break; - case 0x72a2: ret = 0xd5; break; - case 0x72b5: ret = 0xcb; break; + case 0xfbf7: + return 0xf2; - default: - osd_printf_debug("unhandled $2400 read @ %x\n", m_maincpu->pcbase()); - break; + case 0xf9f7: + return 0xd5; + + case 0xf7f4: + return 0xcb; } - return ret; + return 0; } READ8_MEMBER(dorachan_state::v128_r) { // to avoid resetting (when player 2 starts) bit 0 need to be inverted when screen is flipped - return 0xfe | ((m_screen->vpos() >> 7 & 1) ^ m_flip_screen); + return 0xfe | (BIT(m_screen->vpos(), 7) ^ m_flip_screen); } WRITE8_MEMBER(dorachan_state::control_w) { // d6: flip screen // other: ? - m_flip_screen = data >> 6 & 1; + m_flip_screen = BIT(data, 6); } @@ -147,7 +164,7 @@ void dorachan_state::dorachan_io_map(address_map &map) { map.global_mask(0xff); map(0x01, 0x01).nopw(); - map(0x02, 0x02).nopw(); + map(0x02, 0x02).w(this, FUNC(dorachan_state::protection_w)); map(0x03, 0x03).w(this, FUNC(dorachan_state::control_w)); } @@ -198,11 +215,13 @@ INPUT_PORTS_END void dorachan_state::machine_start() { save_item(NAME(m_flip_screen)); + save_item(NAME(m_prot_value)); } void dorachan_state::machine_reset() { m_flip_screen = 0; + m_prot_value = 0; } MACHINE_CONFIG_START(dorachan_state::dorachan)