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)
This commit is contained in:
AJR 2019-11-12 16:34:50 -05:00
parent 2e052f7e98
commit 13beade767
3 changed files with 97 additions and 2 deletions

View File

@ -130,6 +130,7 @@ class v50_base_device : public nec_common_device, public device_v5x_interface
public:
template <unsigned Channel> DECLARE_WRITE_LINE_MEMBER(dreq_w) { m_dmau->dreq_w<Channel>(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);

View File

@ -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;

View File

@ -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<v40_device> m_maincpu;
required_device<isa8_device> m_expbus;
required_device<speaker_sound_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);
}