diff options
author | 2021-09-07 03:02:56 +1000 | |
---|---|---|
committer | 2021-09-07 03:02:56 +1000 | |
commit | b26e425161869268d97aecaf4137a033711e95d3 (patch) | |
tree | 5bba0dfe3bbcfe5f8ce103b12a837874f1e10e64 | |
parent | c916de50a65932ce5d3139390e1fefebebbef772 (diff) |
barni.cpp : wip
-rw-r--r-- | src/mame/drivers/barni.cpp | 271 | ||||
-rw-r--r-- | src/mame/layout/barni.lay | 98 |
2 files changed, 321 insertions, 48 deletions
diff --git a/src/mame/drivers/barni.cpp b/src/mame/drivers/barni.cpp index 47aa413f01a..c3dd2a91b67 100644 --- a/src/mame/drivers/barni.cpp +++ b/src/mame/drivers/barni.cpp @@ -2,7 +2,7 @@ // copyright-holders:Ivan Vangelista // PINBALL // Skeleton driver for Barni pinballs. -// Known pinballs to be dumped: Shield (1985) +// Known pinballs to be dumped: Shield (1985) - different electronics // Hardware listing and ROM definitions from PinMAME. /* @@ -13,6 +13,19 @@ 1x VIA 6522 DISPLAY: 5x6 digit 7 or 16 segment display SOUND: basically the same as Bally's Squalk & Talk -61 board but missing AY8912 synth chip + +Undumped 16L8 at position U9 + +TODO: +- Almost everything +- Value of crystal on audio cpu +- Outputs (solenoids, lamps) +- Inputs (switches, dips) +- Display needs to be done properly, SDA2131 to be a device. +- How to trigger sounds? +- Does speech work? DAC works by poking $5D in audio cpu. +- Manuals are difficult to read, and don't show everything we need. + */ #include "emu.h" @@ -22,66 +35,228 @@ #include "machine/6522via.h" #include "machine/6821pia.h" #include "sound/tms5220.h" +#include "sound/dac.h" +#include "speaker.h" +#include "barni.lh" class barni_state : public genpin_class { public: barni_state(const machine_config &mconfig, device_type type, const char *tag) : genpin_class(mconfig, type, tag) - , m_maincpu(*this, "maincpu") { } + , m_maincpu(*this, "maincpu") + , m_subcpu(*this, "subcpu") + , m_audiocpu(*this, "audiocpu") + , m_pia1(*this, "pia1") + , m_pia2(*this, "pia2") + , m_pias1(*this, "pias1") + , m_pias2(*this, "pias2") + , m_via(*this, "via") + , m_speech(*this, "tms5220") + , m_dac(*this, "dac") + , m_dac2(*this, "dac2") + , m_digits(*this, "digit%u", 0U) + { } - void barni(machine_config &config); - void audiocpu_map(address_map &map); - void maincpu_map(address_map &map); - void subcpu_map(address_map &map); + void barni(machine_config &config); + void audiocpu_map(address_map &map); + void maincpu_map(address_map &map); + void subcpu_map(address_map &map); private: - required_device<cpu_device> m_maincpu; + u8 soundcmd_r(); + u8 set_firq(); + void clear_firq(u8); + void via_pa_w(u8); + void via_pb_w(u8); + void pias1_pb_w(u8); + void pias2_pb_w(u8); + void showseg(u8, u8); + u8 m_via_pa = 0; + u8 m_bitcount = 0; + u8 m_soundcmd = 0; + //void machine_reset() override; + void machine_start() override { m_digits.resolve(); } + required_device<mc6809e_device> m_maincpu; + required_device<mc6809e_device> m_subcpu; + required_device<m6802_cpu_device> m_audiocpu; + required_device<pia6821_device> m_pia1; + required_device<pia6821_device> m_pia2; + required_device<pia6821_device> m_pias1; + required_device<pia6821_device> m_pias2; + required_device<via6522_device> m_via; + required_device<tms5220_device> m_speech; + required_device<dac_byte_interface> m_dac; + required_device<dac_4bit_r2r_device> m_dac2; + output_finder<90> m_digits; }; void barni_state::maincpu_map(address_map &map) { map.unmap_value_high(); - map(0x0000, 0x00ff).ram(); - map(0xa100, 0xa7ff).ram(); - map(0xc000, 0xffff).rom(); + map(0x0000, 0x03ff).mirror(0x1c00).ram().share("common"); // U21,U22 2x 2114 + map(0x2000, 0x3fff).nopw(); // goes to 16L8 + map(0x4000, 0x5fff).r(FUNC(barni_state::set_firq)); // set FIRQ + map(0x6000, 0x7fff).nopr(); // watchdog + map(0x8000, 0x800f).mirror(0x1ff0).m(m_via, FUNC(via6522_device::map)); // U32 + map(0xa000, 0xa7ff).mirror(0x1800).ram(); // U14 5128 battery-backed + map(0xc000, 0xffff).rom().region("maincpu",0); // U15,U16 } void barni_state::subcpu_map(address_map &map) { map.unmap_value_high(); - map(0x0000, 0x03ff).ram(); - map(0xe000, 0xffff).rom(); + map(0x0000, 0x03ff).mirror(0x1c00).ram().share("common"); // same ram as above + map(0x2000, 0x3fff).w(FUNC(barni_state::clear_firq)); // clear FIRQ + map(0x4000, 0x5fff); // goes to 16L8 + map(0x6000, 0x7fff); // goes to 16L8 + map(0x8000, 0x8003).mirror(0x1ffc).rw(m_pia1, FUNC(pia6821_device::read), FUNC(pia6821_device::write)); // U38, also goes to 16L8 + map(0xa000, 0xa003).mirror(0x1ffc).rw(m_pia2, FUNC(pia6821_device::read), FUNC(pia6821_device::write)); // U41, also goes to 16L8 + map(0xc000, 0xdfff); // ROM not fitted U28 + map(0xe000, 0xffff).rom().region("subcpu",0); // U27 } void barni_state::audiocpu_map(address_map &map) { - map(0xc000, 0xffff).rom(); + map.global_mask(0xbfff); // A14 not connected? + map(0x0080, 0x0083).mirror(0x0c).rw(m_pias2, FUNC(pia6821_device::read), FUNC(pia6821_device::write)); + map(0x0090, 0x0093).mirror(0x0c).rw(m_pias1, FUNC(pia6821_device::read), FUNC(pia6821_device::write)); + map(0x1000, 0x1000).w(m_dac, FUNC(dac_byte_interface::data_w)); + map(0x2000, 0x2000).r(FUNC(barni_state::soundcmd_r)); + map(0x8000, 0xbfff).rom().region("audiocpu",0); } static INPUT_PORTS_START( barni ) INPUT_PORTS_END +u8 barni_state::set_firq() +{ + m_maincpu->set_input_line(M6809_FIRQ_LINE, HOLD_LINE); + return 0xff; +} + +void barni_state::clear_firq(u8 data) +{ + m_maincpu->set_input_line(M6809_FIRQ_LINE, CLEAR_LINE); +} + +void barni_state::via_pa_w(u8 data) +{ + //printf("VIA PA = %X ",data); + m_via_pa = data; + m_bitcount = 0; +} + +void barni_state::via_pb_w(u8 data) +{ + //printf("VIA PB = %X ",data); + switch (BIT(m_via_pa, 4, 4)) + { + case 0: + // snd command + m_soundcmd = data; + m_pias2->cb1_w(1); + break; + case 1: + if (!(m_bitcount % 8)) + { + u8 segnum = 31 - (m_bitcount ? 0 : 1) - (2 * m_via_pa & 15); + showseg(segnum, data); + } + m_bitcount++; + break; + case 5: + // solenoids, lamps + break; + case 7: + // something... + break; + default: + break; + } +} + +void barni_state::showseg(u8 segnum, u8 data) +{ + u8 seg = 32 + segnum / 6; + u8 bit = 1 << (segnum % 6); + // player scores + m_digits[segnum] = data & 0x7f; + // digits in the middle + if (BIT(data , 7)) + m_digits[seg] = m_digits[seg] | bit; + else + m_digits[seg] = (m_digits[seg] & 0x3f) ^ bit; +} + +void barni_state::pias1_pb_w(u8 data) +{ + m_speech->rsq_w(BIT(data, 0)); + m_speech->wsq_w(BIT(data, 1)); +} + +void barni_state::pias2_pb_w(u8 data) +{ + m_dac2->write(BIT(data, 4, 4)); +} + +u8 barni_state::soundcmd_r() +{ + m_pias2->cb1_w(0); + return m_soundcmd; +} + void barni_state::barni(machine_config &config) { - /* basic machine hardware */ + // MAIN BOARD MC6809E(config, m_maincpu, XTAL(4'000'000) / 4); m_maincpu->set_addrmap(AS_PROGRAM, &barni_state::maincpu_map); - mc6809e_device &subcpu(MC6809E(config, "subcpu", XTAL(4'000'000) / 4)); - subcpu.set_addrmap(AS_PROGRAM, &barni_state::subcpu_map); - - m6802_cpu_device &audiocpu(M6802(config, "audiocpu", 4000000)); // uses own XTAL, but what is the value? - audiocpu.set_addrmap(AS_PROGRAM, &barni_state::audiocpu_map); + MC6809E(config, m_subcpu, XTAL(4'000'000) / 4); + m_subcpu->set_addrmap(AS_PROGRAM, &barni_state::subcpu_map); /* video hardware */ - //config.set_default_layout(); + config.set_default_layout(layout_barni); - //6522via - //6821pia + PIA6821(config, m_pia1, 0); +// m_pia1->writepa_handler().set(FUNC(barni_state::pia1_pa_w)); +// m_pia1->writepb_handler().set(FUNC(barni_state::pia1_pb_w)); +// m_pia1->readpa_handler().set(FUNC(barni_state::pia1_pa_r)); - /* sound hardware */ - //tmms5220 + PIA6821(config, m_pia2, 0); +// m_pia2->writepa_handler().set(FUNC(barni_state::pia2_pa_w)); +// m_pia2->writepb_handler().set(FUNC(barni_state::pia2_pb_w)); +// m_pia2->readpa_handler().set(FUNC(barni_state::pia2_pa_r)); + + MOS6522(config, m_via, 4'000'000 / 4); // to check + m_via->irq_handler().set_inputline(m_maincpu, M6809_IRQ_LINE); + m_via->writepa_handler().set(FUNC(barni_state::via_pa_w)); + m_via->writepb_handler().set(FUNC(barni_state::via_pb_w)); +// m_via->ca2_handler().set(FUNC(barni_state::via_ca2_w)); +// m_via->cb2_handler().set(FUNC(barni_state::via_cb2_w)); + + // SOUND BOARD + M6802(config, m_audiocpu, 4000000); // guess - crystal value not shown + m_audiocpu->set_addrmap(AS_PROGRAM, &barni_state::audiocpu_map); + + PIA6821(config, m_pias1, 0); // U12 + m_pias1->writepa_handler().set(m_speech, FUNC(tms5200_device::data_w)); + m_pias1->writepb_handler().set(FUNC(barni_state::pias1_pb_w)); + m_pias1->irqa_handler().set_inputline(m_maincpu, M6802_IRQ_LINE); + m_pias1->irqb_handler().set_inputline(m_maincpu, M6802_IRQ_LINE); + + PIA6821(config, m_pias2, 0); // U17 + m_pias2->writepb_handler().set(FUNC(barni_state::pias2_pb_w)); + m_pias2->irqa_handler().set_inputline(m_maincpu, M6802_IRQ_LINE); + m_pias2->irqb_handler().set_inputline(m_maincpu, M6802_IRQ_LINE); + + SPEAKER(config, "mono").front_center(); + TMS5220C(config, m_speech, 640000); // unknown clock + m_speech->irq_cb().set(m_pias1, FUNC(pia6821_device::cb1_w)); + m_speech->ready_cb().set(m_pias1, FUNC(pia6821_device::ca2_w)); + m_speech->add_route(ALL_OUTPUTS, "mono", 1.0); //dac + MC1408(config, m_dac, 0).add_route(ALL_OUTPUTS, "mono", 0.275); + DAC_4BIT_R2R(config, m_dac2, 0).add_route(ALL_OUTPUTS, "mono", 0.5); // discrete parts genpin_audio(config); } @@ -90,18 +265,18 @@ void barni_state::barni(machine_config &config) / Champion 85 /-------------------------------*/ ROM_START(champion) - ROM_REGION(0x10000, "maincpu", 0) - ROM_LOAD("che.bin", 0xe000, 0x2000, CRC(c5dc9228) SHA1(5306980a9c73118cfb843dbce0d56f516d054220)) - ROM_LOAD("chc.bin", 0xc000, 0x2000, CRC(6ab0f232) SHA1(0638d33f86c62ee93dff924a16a5b9309392d9e8)) - - ROM_REGION(0x10000, "subcpu", 0) - ROM_LOAD("chan.bin", 0xe000, 0x2000, CRC(3f148587) SHA1(e44dc9cce15830f522dc781aaa13c659a43371f3)) - - ROM_REGION(0x10000, "audiocpu", 0) - ROM_LOAD("voz1.bin", 0xf000, 0x1000, CRC(48665778) SHA1(c295dfe7f4a98756f508391eb326f37a5aac37ff)) - ROM_LOAD("voz2.bin", 0xe000, 0x1000, CRC(30e7da5e) SHA1(3054cf9b09e0f89c242e1ad35bb31d9bd77248e4)) - ROM_LOAD("voz3.bin", 0xd000, 0x1000, CRC(3cd8058e) SHA1(fa4fd0cf4124263d4021c5a86033af9e5aa66eed)) - ROM_LOAD("voz4.bin", 0xc000, 0x1000, CRC(0d00d8cc) SHA1(10f64d2fc3fc3e276bbd0e108815a3b395dcf0c9)) + ROM_REGION(0x4000, "maincpu", 0) + ROM_LOAD("chc.u15", 0x0000, 0x2000, CRC(6ab0f232) SHA1(0638d33f86c62ee93dff924a16a5b9309392d9e8)) + ROM_LOAD("che.u16", 0x2000, 0x2000, CRC(c5dc9228) SHA1(5306980a9c73118cfb843dbce0d56f516d054220)) + + ROM_REGION(0x2000, "subcpu", 0) + ROM_LOAD("chan.bin", 0x0000, 0x2000, CRC(3f148587) SHA1(e44dc9cce15830f522dc781aaa13c659a43371f3)) + + ROM_REGION(0x4000, "audiocpu", 0) + ROM_LOAD("voz1.bin", 0x3000, 0x1000, CRC(48665778) SHA1(c295dfe7f4a98756f508391eb326f37a5aac37ff)) + ROM_LOAD("voz2.bin", 0x2000, 0x1000, CRC(30e7da5e) SHA1(3054cf9b09e0f89c242e1ad35bb31d9bd77248e4)) + ROM_LOAD("voz3.bin", 0x1000, 0x1000, CRC(3cd8058e) SHA1(fa4fd0cf4124263d4021c5a86033af9e5aa66eed)) + ROM_LOAD("voz4.bin", 0x0000, 0x1000, CRC(0d00d8cc) SHA1(10f64d2fc3fc3e276bbd0e108815a3b395dcf0c9)) ROM_END @@ -109,18 +284,18 @@ ROM_END / Red Baron /-------------------------------*/ ROM_START(redbarnp) - ROM_REGION(0x10000, "maincpu", 0) - ROM_LOAD("redbaron.r1", 0xe000, 0x2000, CRC(fd401d3f) SHA1(33c0f178c798e16a9b4489a0e469f0a227882e79)) - ROM_LOAD("redbaron.r2", 0xc000, 0x2000, CRC(0506e53e) SHA1(a1eaa39181cb3e5a1c281d217d680a42e39c856a)) - - ROM_REGION(0x10000, "subcpu", 0) - ROM_LOAD("redbaron.r3", 0xe000, 0x2000, CRC(45bca0b8) SHA1(77e2d6b04ea8d6fa7e30b59232696b9aa5307286)) - - ROM_REGION(0x10000, "audiocpu", 0) - ROM_LOAD("rbsnd1.732", 0xf000, 0x1000, CRC(674389ce) SHA1(595bbfe51dc3af266f4344e3865c0e48dd96acea)) - ROM_LOAD("rbsnd2.732", 0xe000, 0x1000, CRC(30e7da5e) SHA1(3054cf9b09e0f89c242e1ad35bb31d9bd77248e4)) - ROM_LOAD("rbsnd3.732", 0xd000, 0x1000, CRC(a4ba0f72) SHA1(e46148a2f5125914944973f37e73a62001c76aaa)) - ROM_LOAD("rbsnd4.732", 0xc000, 0x1000, CRC(fd8db899) SHA1(0978213f14f73ccc4a24eb42a39db00d9299c5d0)) + ROM_REGION(0x4000, "maincpu", 0) + ROM_LOAD("redbaron.r2", 0x0000, 0x2000, CRC(0506e53e) SHA1(a1eaa39181cb3e5a1c281d217d680a42e39c856a)) + ROM_LOAD("redbaron.r1", 0x2000, 0x2000, CRC(fd401d3f) SHA1(33c0f178c798e16a9b4489a0e469f0a227882e79)) + + ROM_REGION(0x2000, "subcpu", 0) + ROM_LOAD("redbaron.r3", 0x0000, 0x2000, CRC(45bca0b8) SHA1(77e2d6b04ea8d6fa7e30b59232696b9aa5307286)) + + ROM_REGION(0x4000, "audiocpu", 0) + ROM_LOAD("rbsnd1.732", 0x3000, 0x1000, CRC(674389ce) SHA1(595bbfe51dc3af266f4344e3865c0e48dd96acea)) + ROM_LOAD("rbsnd2.732", 0x2000, 0x1000, CRC(30e7da5e) SHA1(3054cf9b09e0f89c242e1ad35bb31d9bd77248e4)) + ROM_LOAD("rbsnd3.732", 0x1000, 0x1000, CRC(a4ba0f72) SHA1(e46148a2f5125914944973f37e73a62001c76aaa)) + ROM_LOAD("rbsnd4.732", 0x0000, 0x1000, CRC(fd8db899) SHA1(0978213f14f73ccc4a24eb42a39db00d9299c5d0)) ROM_END diff --git a/src/mame/layout/barni.lay b/src/mame/layout/barni.lay new file mode 100644 index 00000000000..22951f9281d --- /dev/null +++ b/src/mame/layout/barni.lay @@ -0,0 +1,98 @@ +<?xml version="1.0"?> +<!-- +license:CC0 +copyright-holders:Robbbert +--> +<mamelayout version="2"> + <element name="digit" defstate="0"> + <led7seg> + <color red="0.75" green="0" blue="0.0" /> + </led7seg> + </element> + <element name="red_led" defstate="0"> + <disk state="1"> + <color red="0.75" green="0.0" blue="0.0" /> + </disk> + <disk state="0"> + <color red="0.09375" green="0.0" blue="0.0" /> + </disk> + </element> + + <element name="T1"><text string="FIRST PLAYER"><color red="1.0" green="1.0" blue="1.0" /></text></element> + <element name="T2"><text string="SECOND PLAYER"><color red="1.0" green="1.0" blue="1.0" /></text></element> + <element name="T3"><text string="BALL"><color red="1.0" green="1.0" blue="1.0" /></text></element> + <element name="T4"><text string="CREDIT"><color red="1.0" green="1.0" blue="1.0" /></text></element> + + <group name="7x7"> + <repeat count="7"> + <param name="n" start="~s~" increment="1" /> + <param name="x" start="~t~" increment="20" /> + <param name="y" start="~u~" increment="0" /> + <element name="digit~n~" ref="digit"> + <bounds x="~x~" y="~y~" width="18" height="24" /> + </element> + </repeat> + </group> + + <group name="2x7"> + <repeat count="2"> + <param name="n" start="~s~" increment="1" /> + <param name="x" start="~t~" increment="20" /> + <param name="y" start="60" increment="0" /> + <element name="digit~n~" ref="digit"> + <bounds x="~x~" y="~y~" width="18" height="24" /> + </element> + </repeat> + </group> + + <view name="Standard"> + <bounds left="5" top="5" right="520" bottom="140" /> + + <!-- Player 1 --> + <param name="s" value="0" /><!-- first digit number --> + <param name="t" value="30" /><!-- first x-coordinate --> + <param name="u" value="30" /><!-- first y-coordinate --> + <group ref="7x7"></group> + + <!-- Player 2 --> + <param name="s" value="8" /> + <param name="t" value="360" /> + <param name="u" value="30" /> + <group ref="7x7"></group> + + <!-- Player 3 --> + <param name="s" value="16" /> + <param name="t" value="30" /> + <param name="u" value="90" /> + <group ref="7x7"></group> + + <!-- Player 4 --> + <param name="s" value="24" /> + <param name="t" value="360" /> + <param name="u" value="90" /> + <group ref="7x7"></group> + + <!-- Ball in play --> + <param name="s" value="32" /> + <param name="t" value="190" /> + <group ref="2x7"></group> + + <!-- Credits --> + <param name="s" value="34" /> + <param name="t" value="240" /> + <group ref="2x7"></group> + + <!-- Match --> + <param name="s" value="36" /> + <param name="t" value="290" /> + <group ref="2x7"></group> + + <!-- Player-up LED --> + <element name="led5" ref="red_led"><!-- Player 1's turn --> + <bounds x="40" y="12" width="7" height="7" /> + </element> + <element name="led6" ref="red_led"> + <bounds x="310" y="12" width="7" height="7" /> + </element> + </view> +</mamelayout> |