From c14deb78862f420734c53f746d1991ca25528402 Mon Sep 17 00:00:00 2001 From: AJR Date: Sat, 7 Apr 2018 12:43:41 -0400 Subject: backfire: Add ADC for potentiometer controls (currently only working in test mode) --- src/mame/drivers/backfire.cpp | 181 +++++++++++++++++++++--------------------- 1 file changed, 89 insertions(+), 92 deletions(-) diff --git a/src/mame/drivers/backfire.cpp b/src/mame/drivers/backfire.cpp index 66a20a70b09..633d9c01c05 100644 --- a/src/mame/drivers/backfire.cpp +++ b/src/mame/drivers/backfire.cpp @@ -6,14 +6,15 @@ inputs are incomplete (p2 side.., alt control modes etc.) - there may still be some problems with the 156 co-processor, but it seems to be mostly correct + Potentiometer controls (which set 2 has as default) are mapped now, but don't seem to work in-game - set 2 defaults to wheel controls, so until they're mapped you must change back to joystick in test mode + there may still be some problems with the 156 co-processor, but it seems to be mostly correct */ #define DE156CPU ARM #include "emu.h" +#include "machine/adc0808.h" #include "machine/decocrpt.h" #include "machine/deco156.h" #include "machine/eepromser.h" @@ -45,9 +46,43 @@ public: m_io_in1(*this, "IN1"), m_io_in2(*this, "IN2"), m_io_in3(*this, "IN3"), - m_palette(*this, "palette") + m_adc(*this, "adc"), + m_palette(*this, "palette"), + m_lscreen(*this, "lscreen") { } + void backfire(machine_config &config); + DECLARE_DRIVER_INIT(backfire); + +private: + DECLARE_READ32_MEMBER(control2_r); + DECLARE_READ32_MEMBER(pf1_rowscroll_r); + DECLARE_READ32_MEMBER(pf2_rowscroll_r); + DECLARE_READ32_MEMBER(pf3_rowscroll_r); + DECLARE_READ32_MEMBER(pf4_rowscroll_r); + DECLARE_WRITE32_MEMBER(pf1_rowscroll_w); + DECLARE_WRITE32_MEMBER(pf2_rowscroll_w); + DECLARE_WRITE32_MEMBER(pf3_rowscroll_w); + DECLARE_WRITE32_MEMBER(pf4_rowscroll_w); + DECLARE_READ32_MEMBER(spriteram1_r); + DECLARE_WRITE32_MEMBER(spriteram1_w); + DECLARE_READ32_MEMBER(spriteram2_r); + DECLARE_WRITE32_MEMBER(spriteram2_w); + DECLARE_READ32_MEMBER(backfire_speedup_r); + DECLARE_READ32_MEMBER(eeprom_r); + DECLARE_WRITE32_MEMBER(eeprom_w); + DECLARE_READ32_MEMBER(pot_select_r); + virtual void machine_start() override; + virtual void video_start() override; + uint32_t screen_update_left(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + uint32_t screen_update_right(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + DECLARE_WRITE_LINE_MEMBER(deco32_vbl_interrupt); + void descramble_sound(); + DECO16IC_BANK_CB_MEMBER(bank_callback); + DECOSPR_PRIORITY_CB_MEMBER(pri_callback); + + void backfire_map(address_map &map); + /* memory pointers */ std::unique_ptr m_spriteram_1; std::unique_ptr m_spriteram_2; @@ -73,39 +108,14 @@ public: uint16_t m_pf2_rowscroll[0x0800/2]; uint16_t m_pf3_rowscroll[0x0800/2]; uint16_t m_pf4_rowscroll[0x0800/2]; - DECLARE_READ32_MEMBER(backfire_control2_r); - DECLARE_READ32_MEMBER(backfire_pf1_rowscroll_r); - DECLARE_READ32_MEMBER(backfire_pf2_rowscroll_r); - DECLARE_READ32_MEMBER(backfire_pf3_rowscroll_r); - DECLARE_READ32_MEMBER(backfire_pf4_rowscroll_r); - DECLARE_WRITE32_MEMBER(backfire_pf1_rowscroll_w); - DECLARE_WRITE32_MEMBER(backfire_pf2_rowscroll_w); - DECLARE_WRITE32_MEMBER(backfire_pf3_rowscroll_w); - DECLARE_WRITE32_MEMBER(backfire_pf4_rowscroll_w); - DECLARE_READ32_MEMBER(backfire_spriteram1_r); - DECLARE_WRITE32_MEMBER(backfire_spriteram1_w); - DECLARE_READ32_MEMBER(backfire_spriteram2_r); - DECLARE_WRITE32_MEMBER(backfire_spriteram2_w); - DECLARE_READ32_MEMBER(backfire_speedup_r); - DECLARE_READ32_MEMBER(backfire_eeprom_r); - DECLARE_WRITE32_MEMBER(backfire_eeprom_w); - DECLARE_DRIVER_INIT(backfire); - virtual void machine_start() override; - virtual void video_start() override; - uint32_t screen_update_backfire_left(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - uint32_t screen_update_backfire_right(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - INTERRUPT_GEN_MEMBER(deco32_vbl_interrupt); - void descramble_sound(); - DECO16IC_BANK_CB_MEMBER(bank_callback); - DECOSPR_PRIORITY_CB_MEMBER(pri_callback); required_ioport m_io_in0; required_ioport m_io_in1; required_ioport m_io_in2; required_ioport m_io_in3; + required_device m_adc; required_device m_palette; - void backfire(machine_config &config); - void backfire_map(address_map &map); + required_device m_lscreen; }; //uint32_t *backfire_180010, *backfire_188010; @@ -134,7 +144,7 @@ void backfire_state::video_start() -uint32_t backfire_state::screen_update_backfire_left(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +uint32_t backfire_state::screen_update_left(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { // sprites are flipped relative to tilemaps m_sprgen->set_flip_screen(true); @@ -165,7 +175,7 @@ uint32_t backfire_state::screen_update_backfire_left(screen_device &screen, bitm return 0; } -uint32_t backfire_state::screen_update_backfire_right(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +uint32_t backfire_state::screen_update_right(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { // sprites are flipped relative to tilemaps m_sprgen2->set_flip_screen(true); @@ -198,23 +208,21 @@ uint32_t backfire_state::screen_update_backfire_right(screen_device &screen, bit -READ32_MEMBER(backfire_state::backfire_eeprom_r) +READ32_MEMBER(backfire_state::eeprom_r) { - /* some kind of screen indicator? checked by backfirea set before it will boot */ - int backfire_screen = machine().rand() & 1; return ((m_eeprom->do_read() << 24) | m_io_in0->read() | ((m_io_in2->read() & 0xbf) << 16) - | ((m_io_in3->read() & 0x40) << 16)) ^ (backfire_screen << 26) ; + | ((m_io_in3->read() & 0x40) << 16)) ^ (m_adc->eoc_r() << 26) ; } -READ32_MEMBER(backfire_state::backfire_control2_r) +READ32_MEMBER(backfire_state::control2_r) { // logerror("%08x:Read eprom %08x (%08x)\n", m_maincpu->pc(), offset << 1, mem_mask); return (m_eeprom->do_read() << 24) | m_io_in1->read() | (m_io_in1->read() << 16); } #ifdef UNUSED_FUNCTION -READ32_MEMBER(backfire_state::backfire_control3_r) +READ32_MEMBER(backfire_state::control3_r) { // logerror("%08x:Read eprom %08x (%08x)\n", m_maincpu->pc(), offset << 1, mem_mask); return (m_eeprom->do_read() << 24) | m_io_in2->read() | (m_io_in2->read() << 16); @@ -222,9 +230,9 @@ READ32_MEMBER(backfire_state::backfire_control3_r) #endif -WRITE32_MEMBER(backfire_state::backfire_eeprom_w) +WRITE32_MEMBER(backfire_state::eeprom_w) { - logerror("%s:write eprom %08x (%08x) %08x\n",machine().describe_context(),offset<<1,mem_mask,data); +// logerror("%s:write eprom %08x (%08x) %08x\n",machine().describe_context(),offset<<1,mem_mask,data); if (ACCESSING_BITS_0_7) { m_eeprom->clk_write(BIT(data, 1) ? ASSERT_LINE : CLEAR_LINE); @@ -236,40 +244,30 @@ WRITE32_MEMBER(backfire_state::backfire_eeprom_w) /* map 32-bit writes to 16-bit */ -READ32_MEMBER(backfire_state::backfire_pf1_rowscroll_r){ return m_pf1_rowscroll[offset] ^ 0xffff0000; } -READ32_MEMBER(backfire_state::backfire_pf2_rowscroll_r){ return m_pf2_rowscroll[offset] ^ 0xffff0000; } -READ32_MEMBER(backfire_state::backfire_pf3_rowscroll_r){ return m_pf3_rowscroll[offset] ^ 0xffff0000; } -READ32_MEMBER(backfire_state::backfire_pf4_rowscroll_r){ return m_pf4_rowscroll[offset] ^ 0xffff0000; } -WRITE32_MEMBER(backfire_state::backfire_pf1_rowscroll_w){ data &= 0x0000ffff; mem_mask &= 0x0000ffff; COMBINE_DATA(&m_pf1_rowscroll[offset]); } -WRITE32_MEMBER(backfire_state::backfire_pf2_rowscroll_w){ data &= 0x0000ffff; mem_mask &= 0x0000ffff; COMBINE_DATA(&m_pf2_rowscroll[offset]); } -WRITE32_MEMBER(backfire_state::backfire_pf3_rowscroll_w){ data &= 0x0000ffff; mem_mask &= 0x0000ffff; COMBINE_DATA(&m_pf3_rowscroll[offset]); } -WRITE32_MEMBER(backfire_state::backfire_pf4_rowscroll_w){ data &= 0x0000ffff; mem_mask &= 0x0000ffff; COMBINE_DATA(&m_pf4_rowscroll[offset]); } - - -#ifdef UNUSED_FUNCTION -READ32_MEMBER(backfire_state::backfire_unknown_wheel_r) -{ - return ioport("PADDLE0")->read(); -} +READ32_MEMBER(backfire_state::pf1_rowscroll_r){ return m_pf1_rowscroll[offset] ^ 0xffff0000; } +READ32_MEMBER(backfire_state::pf2_rowscroll_r){ return m_pf2_rowscroll[offset] ^ 0xffff0000; } +READ32_MEMBER(backfire_state::pf3_rowscroll_r){ return m_pf3_rowscroll[offset] ^ 0xffff0000; } +READ32_MEMBER(backfire_state::pf4_rowscroll_r){ return m_pf4_rowscroll[offset] ^ 0xffff0000; } +WRITE32_MEMBER(backfire_state::pf1_rowscroll_w){ data &= 0x0000ffff; mem_mask &= 0x0000ffff; COMBINE_DATA(&m_pf1_rowscroll[offset]); } +WRITE32_MEMBER(backfire_state::pf2_rowscroll_w){ data &= 0x0000ffff; mem_mask &= 0x0000ffff; COMBINE_DATA(&m_pf2_rowscroll[offset]); } +WRITE32_MEMBER(backfire_state::pf3_rowscroll_w){ data &= 0x0000ffff; mem_mask &= 0x0000ffff; COMBINE_DATA(&m_pf3_rowscroll[offset]); } +WRITE32_MEMBER(backfire_state::pf4_rowscroll_w){ data &= 0x0000ffff; mem_mask &= 0x0000ffff; COMBINE_DATA(&m_pf4_rowscroll[offset]); } -READ32_MEMBER(backfire_state::backfire_wheel1_r) -{ - return machine().rand(); -} -READ32_MEMBER(backfire_state::backfire_wheel2_r) +READ32_MEMBER(backfire_state::pot_select_r) { - return machine().rand(); + if (!machine().side_effects_disabled()) + m_adc->address_offset_start_w(space, offset, 0); + return 0; } -#endif -READ32_MEMBER(backfire_state::backfire_spriteram1_r) +READ32_MEMBER(backfire_state::spriteram1_r) { return m_spriteram_1[offset] ^ 0xffff0000; } -WRITE32_MEMBER(backfire_state::backfire_spriteram1_w) +WRITE32_MEMBER(backfire_state::spriteram1_w) { data &= 0x0000ffff; mem_mask &= 0x0000ffff; @@ -277,12 +275,12 @@ WRITE32_MEMBER(backfire_state::backfire_spriteram1_w) COMBINE_DATA(&m_spriteram_1[offset]); } -READ32_MEMBER(backfire_state::backfire_spriteram2_r) +READ32_MEMBER(backfire_state::spriteram2_r) { return m_spriteram_2[offset] ^ 0xffff0000; } -WRITE32_MEMBER(backfire_state::backfire_spriteram2_w) +WRITE32_MEMBER(backfire_state::spriteram2_w) { data &= 0x0000ffff; mem_mask &= 0x0000ffff; @@ -298,33 +296,31 @@ void backfire_state::backfire_map(address_map &map) map(0x100000, 0x10001f).rw(m_deco_tilegen1, FUNC(deco16ic_device::pf_control_dword_r), FUNC(deco16ic_device::pf_control_dword_w)); map(0x110000, 0x111fff).rw(m_deco_tilegen1, FUNC(deco16ic_device::pf1_data_dword_r), FUNC(deco16ic_device::pf1_data_dword_w)); map(0x114000, 0x115fff).rw(m_deco_tilegen1, FUNC(deco16ic_device::pf2_data_dword_r), FUNC(deco16ic_device::pf2_data_dword_w)); - map(0x120000, 0x120fff).rw(this, FUNC(backfire_state::backfire_pf1_rowscroll_r), FUNC(backfire_state::backfire_pf1_rowscroll_w)); - map(0x124000, 0x124fff).rw(this, FUNC(backfire_state::backfire_pf2_rowscroll_r), FUNC(backfire_state::backfire_pf2_rowscroll_w)); + map(0x120000, 0x120fff).rw(this, FUNC(backfire_state::pf1_rowscroll_r), FUNC(backfire_state::pf1_rowscroll_w)); + map(0x124000, 0x124fff).rw(this, FUNC(backfire_state::pf2_rowscroll_r), FUNC(backfire_state::pf2_rowscroll_w)); map(0x130000, 0x13001f).rw(m_deco_tilegen2, FUNC(deco16ic_device::pf_control_dword_r), FUNC(deco16ic_device::pf_control_dword_w)); map(0x140000, 0x141fff).rw(m_deco_tilegen2, FUNC(deco16ic_device::pf1_data_dword_r), FUNC(deco16ic_device::pf1_data_dword_w)); map(0x144000, 0x145fff).rw(m_deco_tilegen2, FUNC(deco16ic_device::pf2_data_dword_r), FUNC(deco16ic_device::pf2_data_dword_w)); - map(0x150000, 0x150fff).rw(this, FUNC(backfire_state::backfire_pf3_rowscroll_r), FUNC(backfire_state::backfire_pf3_rowscroll_w)); - map(0x154000, 0x154fff).rw(this, FUNC(backfire_state::backfire_pf4_rowscroll_r), FUNC(backfire_state::backfire_pf4_rowscroll_w)); + map(0x150000, 0x150fff).rw(this, FUNC(backfire_state::pf3_rowscroll_r), FUNC(backfire_state::pf3_rowscroll_w)); + map(0x154000, 0x154fff).rw(this, FUNC(backfire_state::pf4_rowscroll_r), FUNC(backfire_state::pf4_rowscroll_w)); map(0x160000, 0x161fff).rw(m_palette, FUNC(palette_device::read16), FUNC(palette_device::write16)).umask32(0x0000ffff).share("palette"); map(0x170000, 0x177fff).ram().share("mainram");// main ram -// AM_RANGE(0x180010, 0x180013) AM_RAM AM_SHARE("backfire_180010") // always 180010 ? -// AM_RANGE(0x188010, 0x188013) AM_RAM AM_SHARE("backfire_188010") // always 188010 ? + map(0x180010, 0x180013).nopw(); // always 180010 ? + map(0x188010, 0x188013).nopw(); // always 188010 ? - map(0x184000, 0x185fff).rw(this, FUNC(backfire_state::backfire_spriteram1_r), FUNC(backfire_state::backfire_spriteram1_w)); - map(0x18c000, 0x18dfff).rw(this, FUNC(backfire_state::backfire_spriteram2_r), FUNC(backfire_state::backfire_spriteram2_w)); - map(0x190000, 0x190003).r(this, FUNC(backfire_state::backfire_eeprom_r)); - map(0x194000, 0x194003).r(this, FUNC(backfire_state::backfire_control2_r)); - map(0x1a4000, 0x1a4003).w(this, FUNC(backfire_state::backfire_eeprom_w)); + map(0x184000, 0x185fff).rw(this, FUNC(backfire_state::spriteram1_r), FUNC(backfire_state::spriteram1_w)); + map(0x18c000, 0x18dfff).rw(this, FUNC(backfire_state::spriteram2_r), FUNC(backfire_state::spriteram2_w)); + map(0x190000, 0x190003).r(this, FUNC(backfire_state::eeprom_r)); + map(0x194000, 0x194003).r(this, FUNC(backfire_state::control2_r)); + map(0x1a4000, 0x1a4003).w(this, FUNC(backfire_state::eeprom_w)); map(0x1a8000, 0x1a8003).ram().share("left_priority"); map(0x1ac000, 0x1ac003).ram().share("right_priority"); -// AM_RANGE(0x1b0000, 0x1b0003) AM_WRITENOP // always 1b0000 + map(0x1b0000, 0x1b0003).nopw(); // always 1b0000 - /* when set to pentometer in test mode */ -// AM_RANGE(0x1e4000, 0x1e4003) AM_READ(backfire_unknown_wheel_r) -// AM_RANGE(0x1e8000, 0x1e8003) AM_READ(backfire_wheel1_r) -// AM_RANGE(0x1e8004, 0x1e8007) AM_READ(backfire_wheel2_r) + map(0x1e4000, 0x1e4000).r("adc", FUNC(adc0808_device::data_r)); + map(0x1e8000, 0x1e8007).r(this, FUNC(backfire_state::pot_select_r)); map(0x1c0000, 0x1c0007).rw("ymz", FUNC(ymz280b_device::read), FUNC(ymz280b_device::write)).umask32(0x000000ff); } @@ -375,13 +371,10 @@ static INPUT_PORTS_START( backfire ) PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_START("PADDLE0") - PORT_BIT ( 0x00ff, 0x0080, IPT_PADDLE ) PORT_SENSITIVITY(30) PORT_KEYDELTA(1) + PORT_BIT ( 0xff, 0x80, IPT_PADDLE ) PORT_PLAYER(1) PORT_MINMAX(0x40, 0xc0) PORT_SENSITIVITY(100) PORT_KEYDELTA(4) PORT_REVERSE PORT_START("PADDLE1") - PORT_BIT ( 0x00ff, 0x0080, IPT_PADDLE ) PORT_SENSITIVITY(30) PORT_KEYDELTA(1) - - PORT_START("UNK") - /* ?? */ + PORT_BIT ( 0xff, 0x80, IPT_PADDLE ) PORT_PLAYER(2) PORT_MINMAX(0x40, 0xc0) PORT_SENSITIVITY(100) PORT_KEYDELTA(4) PORT_REVERSE INPUT_PORTS_END @@ -433,9 +426,10 @@ static GFXDECODE_START( backfire ) GFXDECODE_END -INTERRUPT_GEN_MEMBER(backfire_state::deco32_vbl_interrupt) +WRITE_LINE_MEMBER(backfire_state::deco32_vbl_interrupt) { - device.execute().set_input_line(ARM_IRQ_LINE, HOLD_LINE); + if (state) + m_maincpu->set_input_line(ARM_IRQ_LINE, HOLD_LINE); } @@ -469,10 +463,12 @@ MACHINE_CONFIG_START(backfire_state::backfire) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", ARM, 28000000/4) /* Unconfirmed */ MCFG_CPU_PROGRAM_MAP(backfire_map) - MCFG_CPU_VBLANK_INT_DRIVER("lscreen", backfire_state, deco32_vbl_interrupt) /* or is it "rscreen?" */ MCFG_EEPROM_SERIAL_93C46_ADD("eeprom") + MCFG_DEVICE_ADD("adc", ADC0808, 1000000) // unknown clock + MCFG_ADC0808_IN0_CB(IOPORT("PADDLE0")) + MCFG_ADC0808_IN1_CB(IOPORT("PADDLE1")) /* video hardware */ MCFG_PALETTE_ADD("palette", 2048) @@ -486,15 +482,16 @@ MACHINE_CONFIG_START(backfire_state::backfire) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE_DRIVER(backfire_state, screen_update_backfire_left) + MCFG_SCREEN_UPDATE_DRIVER(backfire_state, screen_update_left) MCFG_SCREEN_PALETTE("palette") + MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(backfire_state, deco32_vbl_interrupt)) MCFG_SCREEN_ADD("rscreen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE_DRIVER(backfire_state, screen_update_backfire_right) + MCFG_SCREEN_UPDATE_DRIVER(backfire_state, screen_update_right) MCFG_SCREEN_PALETTE("palette") MCFG_DEVICE_ADD("tilegen1", DECO16IC, 0) -- cgit v1.2.3