mirror of
https://github.com/holub/mame
synced 2025-04-23 00:39:36 +03:00
m24: Reimplement motherboard devices based on Olivetti schematics
This commit is contained in:
parent
1fffeaceea
commit
831e9554b5
@ -15,13 +15,21 @@
|
||||
|
||||
#include "emu.h"
|
||||
|
||||
#include "bus/isa/isa.h"
|
||||
#include "bus/isa/isa_cards.h"
|
||||
#include "cpu/i86/i86.h"
|
||||
#include "cpu/tms7000/tms7000.h"
|
||||
#include "imagedev/floppy.h"
|
||||
#include "machine/am9517a.h"
|
||||
#include "machine/i8087.h"
|
||||
#include "machine/m24_kbd.h"
|
||||
#include "machine/m24_z8000.h"
|
||||
#include "machine/mm58274c.h"
|
||||
#include "machine/genpc.h"
|
||||
#include "machine/pit8253.h"
|
||||
#include "machine/pic8259.h"
|
||||
#include "machine/ram.h"
|
||||
#include "sound/spkrdev.h"
|
||||
#include "speaker.h"
|
||||
|
||||
#include "formats/pc_dsk.h"
|
||||
#include "formats/naslite_dsk.h"
|
||||
@ -35,35 +43,83 @@ public:
|
||||
m24_state(const machine_config &mconfig, device_type type, const char *tag) :
|
||||
driver_device(mconfig, type, tag),
|
||||
m_maincpu(*this, "maincpu"),
|
||||
m_mb(*this, "mb"),
|
||||
m_ram(*this, RAM_TAG),
|
||||
m_isabus(*this, "isabus"),
|
||||
m_dmac(*this, "dmac"),
|
||||
m_pic(*this, "pic"),
|
||||
m_pit(*this, "pit"),
|
||||
m_speaker(*this, "speaker"),
|
||||
m_kbc(*this, "kbc"),
|
||||
m_keyboard(*this, "keyboard"),
|
||||
m_z8000_apb(*this, "z8000_apb")
|
||||
m_z8000_apb(*this, "z8000_apb"),
|
||||
m_dsw0(*this, "DSW0")
|
||||
{ }
|
||||
|
||||
void olivetti(machine_config &config);
|
||||
|
||||
protected:
|
||||
void machine_reset() override;
|
||||
virtual void machine_start() override;
|
||||
virtual void machine_reset() override;
|
||||
|
||||
private:
|
||||
required_device<cpu_device> m_maincpu;
|
||||
required_device<pc_noppi_mb_device> m_mb;
|
||||
void dma_segment_w(offs_t offset, u8 data);
|
||||
DECLARE_WRITE_LINE_MEMBER(dma_hrq_w);
|
||||
u8 dma_memory_read(offs_t offset);
|
||||
void dma_memory_write(offs_t offset, u8 data);
|
||||
template <int Channel> u8 dma_io_read(offs_t offset);
|
||||
template <int Channel> void dma_io_write(offs_t offset, u8 data);
|
||||
template <int Channel> DECLARE_WRITE_LINE_MEMBER(dma_dack_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(dma_tc_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(dreq0_ck_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(speaker_ck_w);
|
||||
void update_speaker();
|
||||
|
||||
u8 keyboard_data_r();
|
||||
u8 keyboard_status_r();
|
||||
void keyboard_data_w(u8 data);
|
||||
|
||||
void ctrlport_a_w(u8 data);
|
||||
u8 ctrlport_a_r();
|
||||
u8 ctrlport_b_r();
|
||||
|
||||
void alt_w(u8 data);
|
||||
DECLARE_WRITE_LINE_MEMBER(chck_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(int87_w);
|
||||
void nmi_enable_w(u8 data);
|
||||
void update_nmi();
|
||||
|
||||
required_device<i8086_cpu_device> m_maincpu;
|
||||
required_device<ram_device> m_ram;
|
||||
required_device<isa8_device> m_isabus;
|
||||
required_device<am9517a_device> m_dmac;
|
||||
required_device<pic8259_device> m_pic;
|
||||
required_device<pit8253_device> m_pit;
|
||||
required_device<speaker_sound_device> m_speaker;
|
||||
required_device<tms7000_device> m_kbc;
|
||||
required_device<m24_keyboard_device> m_keyboard;
|
||||
optional_device<m24_z8000_device> m_z8000_apb;
|
||||
required_ioport m_dsw0;
|
||||
|
||||
uint8_t m_sysctl, m_pa, m_kbcin, m_kbcout;
|
||||
u8 m_dma_segment[4];
|
||||
u8 m_dma_active;
|
||||
bool m_tc;
|
||||
bool m_dreq0_ck;
|
||||
|
||||
u8 m_ctrlport_a;
|
||||
u8 m_ctrlport_b;
|
||||
|
||||
bool m_87int;
|
||||
bool m_chck_active;
|
||||
bool m_nmi_enable;
|
||||
|
||||
u8 m_pa, m_kbcin, m_kbcout;
|
||||
bool m_kbcibf, m_kbdata, m_i86_halt, m_i86_halt_perm;
|
||||
|
||||
DECLARE_READ8_MEMBER(keyboard_r);
|
||||
DECLARE_WRITE8_MEMBER(keyboard_w);
|
||||
DECLARE_READ8_MEMBER(pa_r);
|
||||
DECLARE_WRITE8_MEMBER(pb_w);
|
||||
DECLARE_READ8_MEMBER(kbcdata_r);
|
||||
DECLARE_WRITE8_MEMBER(kbcdata_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(kbcin_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(dma_hrq_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(int_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(halt_i86_w);
|
||||
DECLARE_FLOPPY_FORMATS( floppy_formats );
|
||||
@ -74,9 +130,44 @@ private:
|
||||
void m24_map(address_map &map);
|
||||
};
|
||||
|
||||
void m24_state::machine_start()
|
||||
{
|
||||
m_maincpu->space(AS_PROGRAM).install_ram(0, m_ram->size() - 1, m_ram->pointer());
|
||||
|
||||
std::fill_n(&m_dma_segment[0], 4, 0);
|
||||
m_dma_active = 0;
|
||||
m_tc = false;
|
||||
m_dreq0_ck = true;
|
||||
|
||||
m_ctrlport_a = 0;
|
||||
m_ctrlport_b = 0;
|
||||
|
||||
m_87int = false;
|
||||
m_chck_active = false;
|
||||
m_nmi_enable = false;
|
||||
|
||||
save_item(NAME(m_dma_segment));
|
||||
save_item(NAME(m_dma_active));
|
||||
save_item(NAME(m_tc));
|
||||
save_item(NAME(m_dreq0_ck));
|
||||
save_item(NAME(m_ctrlport_a));
|
||||
save_item(NAME(m_ctrlport_b));
|
||||
save_item(NAME(m_87int));
|
||||
save_item(NAME(m_chck_active));
|
||||
save_item(NAME(m_nmi_enable));
|
||||
save_item(NAME(m_pa));
|
||||
save_item(NAME(m_kbcin));
|
||||
save_item(NAME(m_kbcout));
|
||||
save_item(NAME(m_kbcibf));
|
||||
save_item(NAME(m_kbdata));
|
||||
save_item(NAME(m_i86_halt));
|
||||
save_item(NAME(m_i86_halt_perm));
|
||||
}
|
||||
|
||||
void m24_state::machine_reset()
|
||||
{
|
||||
m_sysctl = 0;
|
||||
ctrlport_a_w(0);
|
||||
nmi_enable_w(0);
|
||||
m_pa = 0x40;
|
||||
m_kbcibf = false;
|
||||
m_kbdata = true;
|
||||
@ -86,47 +177,216 @@ void m24_state::machine_reset()
|
||||
m_z8000_apb->halt_w(ASSERT_LINE);
|
||||
}
|
||||
|
||||
READ8_MEMBER(m24_state::keyboard_r)
|
||||
void m24_state::dma_segment_w(offs_t offset, u8 data)
|
||||
{
|
||||
switch(offset)
|
||||
{
|
||||
case 0:
|
||||
m_pa |= 0x40;
|
||||
m_mb->m_pic8259->ir1_w(0);
|
||||
return m_kbcout;
|
||||
case 1:
|
||||
return m_sysctl;
|
||||
case 2:
|
||||
return 0;
|
||||
case 4:
|
||||
return (m_kbcibf ? 2 : 0) | ((m_pa & 0x40) ? 0 : 1);
|
||||
}
|
||||
return 0xff;
|
||||
m_dma_segment[offset] = data & 0x0f;
|
||||
}
|
||||
|
||||
WRITE8_MEMBER(m24_state::keyboard_w)
|
||||
WRITE_LINE_MEMBER(m24_state::dma_hrq_w)
|
||||
{
|
||||
switch(offset)
|
||||
if(!m_i86_halt)
|
||||
m_maincpu->set_input_line(INPUT_LINE_HALT, state ? ASSERT_LINE : CLEAR_LINE);
|
||||
if(m_z8000_apb && !m_z8000_apb->halted())
|
||||
m_z8000_apb->halt_w(state ? ASSERT_LINE : CLEAR_LINE);
|
||||
|
||||
/* Assert HLDA */
|
||||
m_dmac->hack_w(state);
|
||||
}
|
||||
|
||||
u8 m24_state::dma_memory_read(offs_t offset)
|
||||
{
|
||||
const int seg = (BIT(m_dma_active, 2) ? 0 : 2) | (BIT(m_dma_active, 3) ? 0 : 1);
|
||||
return m_maincpu->space(AS_PROGRAM).read_byte(offset | u32(m_dma_segment[seg]) << 16);
|
||||
}
|
||||
|
||||
void m24_state::dma_memory_write(offs_t offset, u8 data)
|
||||
{
|
||||
const int seg = (BIT(m_dma_active, 2) ? 0 : 2) | (BIT(m_dma_active, 3) ? 0 : 1);
|
||||
m_maincpu->space(AS_PROGRAM).write_byte(offset | u32(m_dma_segment[seg]) << 16, data);
|
||||
}
|
||||
|
||||
template <int Channel>
|
||||
u8 m24_state::dma_io_read(offs_t offset)
|
||||
{
|
||||
return m_isabus->dack_r(Channel);
|
||||
}
|
||||
|
||||
template <int Channel>
|
||||
void m24_state::dma_io_write(offs_t offset, u8 data)
|
||||
{
|
||||
m_isabus->dack_w(Channel, data);
|
||||
}
|
||||
|
||||
template <int Channel>
|
||||
WRITE_LINE_MEMBER(m24_state::dma_dack_w)
|
||||
{
|
||||
m_isabus->dack_line_w(Channel, state);
|
||||
|
||||
if (!state)
|
||||
{
|
||||
case 0:
|
||||
m_kbc->set_input_line(TMS7000_INT1_LINE, ASSERT_LINE);
|
||||
m_kbcibf = true;
|
||||
m_kbcin = data;
|
||||
break;
|
||||
case 1:
|
||||
m_sysctl = data;
|
||||
m_mb->m_pit8253->write_gate2(BIT(data, 0));
|
||||
m_mb->pc_speaker_set_spkrdata(BIT(data, 1));
|
||||
if(BIT(data, 6))
|
||||
m_pa |= 4;
|
||||
else
|
||||
m_pa &= ~4;
|
||||
break;
|
||||
case 5:
|
||||
m_maincpu->set_input_line(INPUT_LINE_HALT, (data & 0x40) ? ASSERT_LINE : CLEAR_LINE);
|
||||
m_i86_halt = true;
|
||||
m_i86_halt_perm = true;
|
||||
m_dma_active |= 1 << Channel;
|
||||
if (Channel == 0)
|
||||
m_dmac->dreq0_w(0);
|
||||
if (m_tc)
|
||||
m_isabus->eop_w(Channel, ASSERT_LINE);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_dma_active &= ~(1 << Channel);
|
||||
if (m_tc)
|
||||
m_isabus->eop_w(Channel, CLEAR_LINE);
|
||||
}
|
||||
}
|
||||
|
||||
WRITE_LINE_MEMBER(m24_state::dma_tc_w)
|
||||
{
|
||||
m_tc = (state == ASSERT_LINE);
|
||||
for (int channel = 0; channel < 4; channel++)
|
||||
if (BIT(m_dma_active, channel))
|
||||
m_isabus->eop_w(channel, state);
|
||||
}
|
||||
|
||||
WRITE_LINE_MEMBER(m24_state::dreq0_ck_w)
|
||||
{
|
||||
if (state && !m_dreq0_ck && !BIT(m_dma_active, 0))
|
||||
m_dmac->dreq0_w(1);
|
||||
|
||||
m_dreq0_ck = state;
|
||||
}
|
||||
|
||||
WRITE_LINE_MEMBER(m24_state::speaker_ck_w)
|
||||
{
|
||||
if (state)
|
||||
m_ctrlport_b |= 0x20;
|
||||
else
|
||||
m_ctrlport_b &= 0xdf;
|
||||
|
||||
update_speaker();
|
||||
}
|
||||
|
||||
void m24_state::update_speaker()
|
||||
{
|
||||
if (BIT(m_ctrlport_a, 1) && BIT(m_ctrlport_b, 5))
|
||||
{
|
||||
m_speaker->level_w(1);
|
||||
m_ctrlport_b &= 0xef;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_speaker->level_w(0);
|
||||
m_ctrlport_b |= 0x10;
|
||||
}
|
||||
}
|
||||
|
||||
u8 m24_state::keyboard_data_r()
|
||||
{
|
||||
if (!machine().side_effects_disabled())
|
||||
{
|
||||
m_pa |= 0x40;
|
||||
m_pic->ir1_w(0);
|
||||
}
|
||||
return m_kbcout;
|
||||
}
|
||||
|
||||
u8 m24_state::keyboard_status_r()
|
||||
{
|
||||
return (m_kbcibf ? 2 : 0) | ((m_pa & 0x40) ? 0 : 1);
|
||||
}
|
||||
|
||||
void m24_state::keyboard_data_w(u8 data)
|
||||
{
|
||||
m_kbc->set_input_line(TMS7000_INT1_LINE, ASSERT_LINE);
|
||||
m_kbcibf = true;
|
||||
m_kbcin = data;
|
||||
}
|
||||
|
||||
void m24_state::ctrlport_a_w(u8 data)
|
||||
{
|
||||
const bool spkrdata_en_dis = BIT(data ^ m_ctrlport_a, 1);
|
||||
const bool iochk_en_dis = BIT(data ^ m_ctrlport_a, 4);
|
||||
|
||||
m_pit->write_gate2(BIT(data, 0));
|
||||
|
||||
if (BIT(m_ctrlport_a, 4) && !m_chck_active)
|
||||
m_ctrlport_b &= 0xbf;
|
||||
|
||||
if (BIT(data, 6))
|
||||
m_pa |= 4;
|
||||
else
|
||||
m_pa &= ~4;
|
||||
|
||||
m_ctrlport_a = data;
|
||||
|
||||
if (spkrdata_en_dis)
|
||||
update_speaker();
|
||||
if (iochk_en_dis)
|
||||
update_nmi();
|
||||
}
|
||||
|
||||
u8 m24_state::ctrlport_a_r()
|
||||
{
|
||||
return m_ctrlport_a;
|
||||
}
|
||||
|
||||
u8 m24_state::ctrlport_b_r()
|
||||
{
|
||||
// Bit 0 = NC
|
||||
// Bit 1 = SW4 (8087 present)
|
||||
// Bit 2 = ~R11
|
||||
// Bit 3 = ~DSR1
|
||||
// Bit 4 = OUT2 (8253)
|
||||
// Bit 5 = SPKR
|
||||
// Bit 6 = IOCHK
|
||||
// Bit 7 = memory parity error (page 4)
|
||||
|
||||
if (BIT(m_dsw0->read(), 4))
|
||||
m_ctrlport_b |= 0x02;
|
||||
else
|
||||
m_ctrlport_b &= 0xfd;
|
||||
|
||||
return m_ctrlport_b;
|
||||
}
|
||||
|
||||
void m24_state::alt_w(u8 data)
|
||||
{
|
||||
m_maincpu->set_input_line(INPUT_LINE_HALT, (data & 0x40) ? ASSERT_LINE : CLEAR_LINE);
|
||||
m_i86_halt = true;
|
||||
m_i86_halt_perm = true;
|
||||
}
|
||||
|
||||
WRITE_LINE_MEMBER(m24_state::chck_w)
|
||||
{
|
||||
m_chck_active = (state == ASSERT_LINE);
|
||||
if (m_chck_active)
|
||||
{
|
||||
if (!BIT(m_ctrlport_b, 6))
|
||||
{
|
||||
m_ctrlport_b |= 0x40;
|
||||
update_nmi();
|
||||
}
|
||||
}
|
||||
else if (BIT(m_ctrlport_a, 4))
|
||||
m_ctrlport_b &= 0xbf;
|
||||
}
|
||||
|
||||
WRITE_LINE_MEMBER(m24_state::int87_w)
|
||||
{
|
||||
m_87int = state;
|
||||
update_nmi();
|
||||
}
|
||||
|
||||
void m24_state::nmi_enable_w(u8 data)
|
||||
{
|
||||
m_nmi_enable = BIT(data, 7);
|
||||
update_nmi();
|
||||
}
|
||||
|
||||
void m24_state::update_nmi()
|
||||
{
|
||||
if (m_nmi_enable && ((m_87int && BIT(m_dsw0->read(), 4)) || (BIT(m_ctrlport_b, 6) && !BIT(m_ctrlport_a, 4))))
|
||||
m_maincpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE);
|
||||
else
|
||||
m_maincpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE);
|
||||
}
|
||||
|
||||
READ8_MEMBER(m24_state::pa_r)
|
||||
@ -151,7 +411,7 @@ READ8_MEMBER(m24_state::kbcdata_r)
|
||||
WRITE8_MEMBER(m24_state::kbcdata_w)
|
||||
{
|
||||
m_pa &= ~0x40;
|
||||
m_mb->m_pic8259->ir1_w(1);
|
||||
m_pic->ir1_w(1);
|
||||
m_kbcout = data;
|
||||
}
|
||||
|
||||
@ -160,17 +420,6 @@ WRITE_LINE_MEMBER(m24_state::kbcin_w)
|
||||
m_kbdata = state;
|
||||
}
|
||||
|
||||
WRITE_LINE_MEMBER(m24_state::dma_hrq_w)
|
||||
{
|
||||
if(!m_i86_halt)
|
||||
m_maincpu->set_input_line(INPUT_LINE_HALT, state ? ASSERT_LINE : CLEAR_LINE);
|
||||
if(m_z8000_apb && !m_z8000_apb->halted())
|
||||
m_z8000_apb->halt_w(state ? ASSERT_LINE : CLEAR_LINE);
|
||||
|
||||
/* Assert HLDA */
|
||||
m_mb->m_dma8237->hack_w(state);
|
||||
}
|
||||
|
||||
WRITE_LINE_MEMBER(m24_state::int_w)
|
||||
{
|
||||
if(!m_i86_halt)
|
||||
@ -196,10 +445,18 @@ void m24_state::m24_map(address_map &map)
|
||||
void m24_state::m24_io(address_map &map)
|
||||
{
|
||||
map.unmap_value_high();
|
||||
map(0x0000, 0x00ff).m(m_mb, FUNC(pc_noppi_mb_device::map));
|
||||
map(0x0060, 0x0065).rw(FUNC(m24_state::keyboard_r), FUNC(m24_state::keyboard_w));
|
||||
map(0x0000, 0x000f).rw(m_dmac, FUNC(am9517a_device::read), FUNC(am9517a_device::write));
|
||||
map(0x0020, 0x0021).mirror(0xe).rw(m_pic, FUNC(pic8259_device::read), FUNC(pic8259_device::write));
|
||||
map(0x0040, 0x0043).mirror(0xc).rw(m_pit, FUNC(pit8253_device::read), FUNC(pit8253_device::write));
|
||||
map(0x0060, 0x0060).rw(FUNC(m24_state::keyboard_data_r), FUNC(m24_state::keyboard_data_w));
|
||||
map(0x0061, 0x0061).rw(FUNC(m24_state::ctrlport_a_r), FUNC(m24_state::ctrlport_a_w));
|
||||
map(0x0062, 0x0062).r(FUNC(m24_state::ctrlport_b_r));
|
||||
map(0x0064, 0x0064).r(FUNC(m24_state::keyboard_status_r));
|
||||
map(0x0065, 0x0065).w(FUNC(m24_state::alt_w));
|
||||
map(0x0066, 0x0067).portr("DSW0");
|
||||
map(0x0070, 0x007f).rw("mm58174an", FUNC(mm58274c_device::read), FUNC(mm58274c_device::write));
|
||||
map(0x0080, 0x0083).mirror(0xc).w(FUNC(m24_state::dma_segment_w));
|
||||
map(0x00a0, 0x00a1).mirror(0xe).w(FUNC(m24_state::nmi_enable_w));
|
||||
map(0x80c1, 0x80c1).rw(m_z8000_apb, FUNC(m24_z8000_device::handshake_r), FUNC(m24_z8000_device::handshake_w));
|
||||
}
|
||||
|
||||
@ -266,28 +523,77 @@ void m24_state::cfg_m20_format(device_t *device)
|
||||
|
||||
MACHINE_CONFIG_START(m24_state::olivetti)
|
||||
/* basic machine hardware */
|
||||
MCFG_DEVICE_ADD("maincpu", I8086, XTAL(8'000'000))
|
||||
MCFG_DEVICE_PROGRAM_MAP(m24_map)
|
||||
MCFG_DEVICE_IO_MAP(m24_io)
|
||||
MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("mb:pic8259", pic8259_device, inta_cb)
|
||||
I8086(config, m_maincpu, 24_MHz_XTAL / 3);
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &m24_state::m24_map);
|
||||
m_maincpu->set_addrmap(AS_IO, &m24_state::m24_io);
|
||||
m_maincpu->set_irq_acknowledge_callback("pic", FUNC(pic8259_device::inta_cb));
|
||||
m_maincpu->esc_opcode_handler().set("ndp", FUNC(i8087_device::insn_w));
|
||||
m_maincpu->esc_data_handler().set("ndp", FUNC(i8087_device::addr_w));
|
||||
|
||||
MCFG_PCNOPPI_MOTHERBOARD_ADD("mb", "maincpu")
|
||||
i8087_device &i8087(I8087(config, "ndp", 24_MHz_XTAL / 3));
|
||||
i8087.set_addrmap(AS_PROGRAM, &m24_state::m24_map);
|
||||
i8087.set_data_width(16);
|
||||
i8087.irq().set(FUNC(m24_state::int87_w));
|
||||
i8087.busy().set_inputline(m_maincpu, INPUT_LINE_TEST);
|
||||
|
||||
// FIXME: determine ISA bus clock
|
||||
MCFG_DEVICE_ADD("mb1", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, "cga_m24", true)
|
||||
MCFG_DEVICE_ADD("mb2", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, "fdc_xt", true)
|
||||
AM9517A(config, m_dmac, 24_MHz_XTAL / 6); // 8237A-4
|
||||
m_dmac->out_hreq_callback().set(FUNC(m24_state::dma_hrq_w));
|
||||
m_dmac->in_memr_callback().set(FUNC(m24_state::dma_memory_read));
|
||||
m_dmac->out_memw_callback().set(FUNC(m24_state::dma_memory_write));
|
||||
m_dmac->in_ior_callback<1>().set(FUNC(m24_state::dma_io_read<1>));
|
||||
m_dmac->in_ior_callback<2>().set(FUNC(m24_state::dma_io_read<2>));
|
||||
m_dmac->in_ior_callback<3>().set(FUNC(m24_state::dma_io_read<3>));
|
||||
m_dmac->out_iow_callback<1>().set(FUNC(m24_state::dma_io_write<1>));
|
||||
m_dmac->out_iow_callback<2>().set(FUNC(m24_state::dma_io_write<2>));
|
||||
m_dmac->out_iow_callback<3>().set(FUNC(m24_state::dma_io_write<3>));
|
||||
m_dmac->out_dack_callback<0>().set(FUNC(m24_state::dma_dack_w<0>));
|
||||
m_dmac->out_dack_callback<1>().set(FUNC(m24_state::dma_dack_w<1>));
|
||||
m_dmac->out_dack_callback<2>().set(FUNC(m24_state::dma_dack_w<2>));
|
||||
m_dmac->out_dack_callback<3>().set(FUNC(m24_state::dma_dack_w<3>));
|
||||
m_dmac->out_eop_callback().set(FUNC(m24_state::dma_tc_w));
|
||||
|
||||
PIC8259(config, m_pic);
|
||||
m_pic->in_sp_callback().set_constant(1);
|
||||
m_pic->out_int_callback().set(FUNC(m24_state::int_w));
|
||||
|
||||
PIT8253(config, m_pit); // 8253-5
|
||||
m_pit->set_clk<0>(3.6864_MHz_XTAL / 3); // divided by LS175 at 8T
|
||||
m_pit->set_clk<1>(3.6864_MHz_XTAL / 3);
|
||||
m_pit->set_clk<2>(3.6864_MHz_XTAL / 3);
|
||||
m_pit->out_handler<0>().set(m_pic, FUNC(pic8259_device::ir0_w));
|
||||
m_pit->out_handler<1>().set(FUNC(m24_state::dreq0_ck_w));
|
||||
m_pit->out_handler<2>().set(FUNC(m24_state::speaker_ck_w));
|
||||
|
||||
SPEAKER(config, "mono").front_center();
|
||||
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 1.00);
|
||||
|
||||
ISA8(config, m_isabus, 24_MHz_XTAL / 6);
|
||||
m_isabus->set_cputag(m_maincpu);
|
||||
m_isabus->irq2_callback().set(m_pic, FUNC(pic8259_device::ir2_w));
|
||||
m_isabus->irq3_callback().set(m_pic, FUNC(pic8259_device::ir3_w));
|
||||
m_isabus->irq4_callback().set(m_pic, FUNC(pic8259_device::ir4_w));
|
||||
m_isabus->irq5_callback().set(m_pic, FUNC(pic8259_device::ir5_w));
|
||||
m_isabus->irq6_callback().set(m_pic, FUNC(pic8259_device::ir6_w));
|
||||
m_isabus->irq7_callback().set(m_pic, FUNC(pic8259_device::ir7_w));
|
||||
m_isabus->drq1_callback().set(m_dmac, FUNC(am9517a_device::dreq1_w));
|
||||
m_isabus->drq2_callback().set(m_dmac, FUNC(am9517a_device::dreq2_w));
|
||||
m_isabus->drq3_callback().set(m_dmac, FUNC(am9517a_device::dreq3_w));
|
||||
m_isabus->iochck_callback().set(FUNC(m24_state::chck_w));
|
||||
|
||||
MCFG_DEVICE_ADD("mb1", ISA8_SLOT, 0, m_isabus, pc_isa8_cards, "cga_m24", true)
|
||||
MCFG_DEVICE_ADD("mb2", ISA8_SLOT, 0, m_isabus, pc_isa8_cards, "fdc_xt", true)
|
||||
MCFG_SLOT_OPTION_MACHINE_CONFIG("fdc_xt", cfg_m20_format)
|
||||
MCFG_DEVICE_ADD("mb3", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, "lpt", true)
|
||||
MCFG_DEVICE_ADD("mb4", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, "com", true)
|
||||
MCFG_DEVICE_ADD("mb3", ISA8_SLOT, 0, m_isabus, pc_isa8_cards, "lpt", true)
|
||||
MCFG_DEVICE_ADD("mb4", ISA8_SLOT, 0, m_isabus, pc_isa8_cards, "com", true)
|
||||
|
||||
MCFG_DEVICE_ADD("isa1", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, nullptr, false)
|
||||
MCFG_DEVICE_ADD("isa2", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, nullptr, false)
|
||||
MCFG_DEVICE_ADD("isa3", ISA8_SLOT, 0, "mb:isa", pc_isa8_cards, nullptr, false)
|
||||
MCFG_DEVICE_ADD("isa1", ISA8_SLOT, 0, m_isabus, pc_isa8_cards, nullptr, false)
|
||||
MCFG_DEVICE_ADD("isa2", ISA8_SLOT, 0, m_isabus, pc_isa8_cards, nullptr, false)
|
||||
MCFG_DEVICE_ADD("isa3", ISA8_SLOT, 0, m_isabus, pc_isa8_cards, nullptr, false)
|
||||
|
||||
/* internal ram */
|
||||
RAM(config, RAM_TAG).set_default_size("640K").set_extra_options("64K, 128K, 256K, 512K");
|
||||
RAM(config, m_ram).set_default_size("640K").set_extra_options("64K, 128K, 256K, 512K");
|
||||
|
||||
TMS7000(config, m_kbc, XTAL(4'000'000));
|
||||
TMS7000(config, m_kbc, 24_MHz_XTAL / 6);
|
||||
m_kbc->set_addrmap(AS_PROGRAM, &m24_state::kbc_map);
|
||||
m_kbc->in_porta().set(FUNC(m24_state::pa_r));
|
||||
m_kbc->out_portb().set(FUNC(m24_state::pb_w));
|
||||
@ -295,7 +601,7 @@ MACHINE_CONFIG_START(m24_state::olivetti)
|
||||
M24_KEYBOARD(config, m_keyboard, 0);
|
||||
m_keyboard->out_data_handler().set(FUNC(m24_state::kbcin_w));
|
||||
|
||||
mm58274c_device &mm58174an(MM58274C(config, "mm58174an", 0));
|
||||
mm58274c_device &mm58174an(MM58274C(config, "mm58174an", 32.768_kHz_XTAL));
|
||||
// this is all guess
|
||||
mm58174an.set_mode24(1); // ?
|
||||
mm58174an.set_day1(1); // ?
|
||||
@ -303,9 +609,6 @@ MACHINE_CONFIG_START(m24_state::olivetti)
|
||||
M24_Z8000(config, m_z8000_apb, 0);
|
||||
m_z8000_apb->halt_callback().set(FUNC(m24_state::halt_i86_w));
|
||||
|
||||
subdevice<am9517a_device>("mb:dma8237")->out_hreq_callback().set(FUNC(m24_state::dma_hrq_w));
|
||||
subdevice<pic8259_device>("mb:pic8259")->out_int_callback().set(FUNC(m24_state::int_w));
|
||||
|
||||
/* software lists */
|
||||
MCFG_SOFTWARE_LIST_ADD("disk_list","ibm5150")
|
||||
MACHINE_CONFIG_END
|
||||
|
@ -9,7 +9,7 @@ m24_z8000_device::m24_z8000_device(const machine_config &mconfig, const char *ta
|
||||
device_t(mconfig, M24_Z8000, tag, owner, clock),
|
||||
m_z8000(*this, "z8000"),
|
||||
m_maincpu(*this, ":maincpu"),
|
||||
m_pic(*this, ":mb:pic8259"),
|
||||
m_pic(*this, ":pic"),
|
||||
m_halt_out(*this),
|
||||
m_z8000_halt(true)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user