From 13beade76785f999b81528dc4bcb642ba1c76e45 Mon Sep 17 00:00:00 2001 From: AJR Date: Tue, 12 Nov 2019 16:34:50 -0500 Subject: [PATCH] lbpc: Add ISA bus and EGA card so startup process can be visible (nw) v40, v50: Add timer 2 control input (nw) ncr5380n: This error really needs to be non-fatal (nw) --- src/devices/cpu/nec/v5x.h | 1 + src/devices/machine/ncr5380n.cpp | 2 +- src/mame/drivers/lbpc.cpp | 96 +++++++++++++++++++++++++++++++- 3 files changed, 97 insertions(+), 2 deletions(-) diff --git a/src/devices/cpu/nec/v5x.h b/src/devices/cpu/nec/v5x.h index 4fcde8143a9..9bae50be204 100644 --- a/src/devices/cpu/nec/v5x.h +++ b/src/devices/cpu/nec/v5x.h @@ -130,6 +130,7 @@ class v50_base_device : public nec_common_device, public device_v5x_interface public: template DECLARE_WRITE_LINE_MEMBER(dreq_w) { m_dmau->dreq_w(state); } DECLARE_WRITE_LINE_MEMBER(hack_w) { m_dmau->hack_w(state); } + DECLARE_WRITE_LINE_MEMBER(tctl2_w) { m_tcu->write_gate2(state); } protected: v50_base_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, bool is_16bit, uint8_t prefetch_size, uint8_t prefetch_cycles, uint32_t chip_type); diff --git a/src/devices/machine/ncr5380n.cpp b/src/devices/machine/ncr5380n.cpp index 7adb63800d9..bd7d2ee89ac 100644 --- a/src/devices/machine/ncr5380n.cpp +++ b/src/devices/machine/ncr5380n.cpp @@ -187,7 +187,7 @@ void ncr5380n_device::step(bool timeout) if(win != scsi_id) { scsi_bus->data_w(scsi_refid, 0); scsi_bus->ctrl_w(scsi_refid, 0, S_ALL); - fatalerror("need to wait for bus free\n"); + logerror("need to wait for bus free\n"); } state &= STATE_MASK; diff --git a/src/mame/drivers/lbpc.cpp b/src/mame/drivers/lbpc.cpp index 9d6c54589b7..19481e6b25f 100644 --- a/src/mame/drivers/lbpc.cpp +++ b/src/mame/drivers/lbpc.cpp @@ -14,13 +14,16 @@ ****************************************************************************/ #include "emu.h" -//#include "bus/isa/isa.h" +#include "bus/isa/isa.h" +#include "bus/isa/isa_cards.h" #include "bus/nscsi/devices.h" #include "bus/rs232/rs232.h" #include "cpu/nec/v5x.h" #include "machine/ins8250.h" #include "machine/ncr5380n.h" #include "machine/upd765.h" +#include "sound/spkrdev.h" +#include "speaker.h" class lbpc_state : public driver_device { @@ -28,19 +31,89 @@ public: lbpc_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag) , m_maincpu(*this, "maincpu") + , m_expbus(*this, "expbus") + , m_speaker(*this, "speaker") + , m_port61(0xff) + , m_speaker_data(false) { } void lbpc(machine_config &config); +protected: + virtual void machine_start() override; + virtual void machine_reset() override; + private: + u8 exp_dack1_r(); + void exp_dack1_w(u8 data); + DECLARE_WRITE_LINE_MEMBER(iochck_w); + u8 port61_r(); + void port61_w(u8 data); + DECLARE_WRITE_LINE_MEMBER(out2_w); + void mem_map(address_map &map); void io_map(address_map &map); required_device m_maincpu; + required_device m_expbus; + required_device m_speaker; + + u8 m_port61; + bool m_speaker_data; }; +void lbpc_state::machine_start() +{ + save_item(NAME(m_port61)); + save_item(NAME(m_speaker_data)); +} + +void lbpc_state::machine_reset() +{ + port61_w(0); +} + + +u8 lbpc_state::exp_dack1_r() +{ + return m_expbus->dack_r(0); +} + +void lbpc_state::exp_dack1_w(u8 data) +{ + m_expbus->dack_w(0, data); +} + +WRITE_LINE_MEMBER(lbpc_state::iochck_w) +{ + // TODO +} + +u8 lbpc_state::port61_r() +{ + return m_port61; +} + +void lbpc_state::port61_w(u8 data) +{ + if (BIT(m_port61, 1) && !BIT(data, 1)) + m_speaker->level_w(0); + else if (!BIT(m_port61, 1) && BIT(data, 1)) + m_speaker->level_w(m_speaker_data); + m_maincpu->tctl2_w(BIT(data, 0)); + + m_port61 = data; +} + +WRITE_LINE_MEMBER(lbpc_state::out2_w) +{ + m_speaker_data = state; + if (BIT(m_port61, 1)) + m_speaker->level_w(state); +} + void lbpc_state::mem_map(address_map &map) { map(0x00000, 0x9ffff).ram(); // 256K, 512K or 768K DRAM @@ -69,11 +142,21 @@ void lbpc_state::lbpc(machine_config &config) m_maincpu->set_clk<0>(14.318181_MHz_XTAL / 12); // TCLK input generated by ASIC1 m_maincpu->set_clk<1>(14.318181_MHz_XTAL / 12); m_maincpu->set_clk<2>(14.318181_MHz_XTAL / 12); + m_maincpu->out_handler<2>().set(FUNC(lbpc_state::out2_w)); + m_maincpu->out_hreq_cb().set_inputline(m_maincpu, INPUT_LINE_HALT); + m_maincpu->out_hreq_cb().append(m_maincpu, FUNC(v40_device::hack_w)); + m_maincpu->in_memr_cb().set([this] (offs_t offset) { return m_maincpu->space(AS_PROGRAM).read_byte(offset); }); + m_maincpu->out_memw_cb().set([this] (offs_t offset, u8 data) { m_maincpu->space(AS_PROGRAM).write_byte(offset, data); }); + m_maincpu->in_ior_cb<0>().set(FUNC(lbpc_state::exp_dack1_r)); + m_maincpu->out_iow_cb<0>().set(FUNC(lbpc_state::exp_dack1_w)); m_maincpu->in_ior_cb<1>().set("fdc", FUNC(wd37c65c_device::dma_r)); m_maincpu->out_iow_cb<1>().set("fdc", FUNC(wd37c65c_device::dma_w)); m_maincpu->in_ior_cb<2>().set("scsi:7:ncr", FUNC(ncr53c80_device::dma_r)); m_maincpu->out_iow_cb<2>().set("scsi:7:ncr", FUNC(ncr53c80_device::dma_w)); + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.5); + ins8250_device &com(INS8250(config, "com", 1.8432_MHz_XTAL)); // NS8250AV com.out_int_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ4); com.out_rts_callback().set("serial", FUNC(rs232_port_device::write_rts)); // J3 pin 4 @@ -102,6 +185,17 @@ void lbpc_state::lbpc(machine_config &config) serial.rxd_handler().set("com", FUNC(ins8250_device::rx_w)); // J3 pin 3 serial.cts_handler().set("com", FUNC(ins8250_device::cts_w)); // J3 pin 6 serial.ri_handler().set("com", FUNC(ins8250_device::ri_w)); // J3 pin 8 + + ISA8(config, m_expbus, 14.318181_MHz_XTAL / 2); + m_expbus->set_memspace(m_maincpu, AS_PROGRAM); + m_expbus->set_iospace(m_maincpu, AS_IO); + m_expbus->drq1_callback().set(m_maincpu, FUNC(v40_device::dreq_w<0>)); + m_expbus->irq2_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ2); + m_expbus->irq3_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ3); + m_expbus->irq5_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ5); + m_expbus->iochck_callback().set(FUNC(lbpc_state::iochck_w)); + + ISA8_SLOT(config, "exp", 0, m_expbus, pc_isa8_cards, "ega", false); }