summaryrefslogtreecommitdiffstatshomepage
path: root/src/mess/drivers/m24.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mess/drivers/m24.c')
-rw-r--r--src/mess/drivers/m24.c86
1 files changed, 79 insertions, 7 deletions
diff --git a/src/mess/drivers/m24.c b/src/mess/drivers/m24.c
index b29edcf54ae..5f7ac2572e5 100644
--- a/src/mess/drivers/m24.c
+++ b/src/mess/drivers/m24.c
@@ -5,8 +5,12 @@
#include "bus/isa/isa.h"
#include "bus/isa/isa_cards.h"
#include "machine/m24_kbd.h"
+#include "machine/m24_z8000.h"
#include "machine/mm58274c.h"
#include "includes/genpc.h"
+#include "formats/pc_dsk.h"
+#include "formats/naslite_dsk.h"
+#include "formats/m20_dsk.h"
class m24_state : public driver_device
{
@@ -16,12 +20,14 @@ public:
m_maincpu(*this, "maincpu"),
m_mb(*this, "mb"),
m_kbc(*this, "kbc"),
- m_keyboard(*this, "keyboard")
+ m_keyboard(*this, "keyboard"),
+ m_z8000_apb(*this, "z8000_apb")
{ }
required_device<cpu_device> m_maincpu;
required_device<pc_noppi_mb_device> m_mb;
required_device<cpu_device> m_kbc;
required_device<m24_keyboard_device> m_keyboard;
+ optional_device<m24_z8000_device> m_z8000_apb;
DECLARE_READ8_MEMBER(keyboard_r);
DECLARE_WRITE8_MEMBER(keyboard_w);
@@ -30,11 +36,15 @@ public:
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 );
void machine_reset();
UINT8 m_sysctl, m_pa, m_kbcin, m_kbcout;
- bool m_kbcibf, m_kbdata;
+ bool m_kbcibf, m_kbdata, m_i86_halt, m_i86_halt_perm;
};
void m24_state::machine_reset()
@@ -43,6 +53,10 @@ void m24_state::machine_reset()
m_pa = 0x40;
m_kbcibf = false;
m_kbdata = true;
+ m_i86_halt = false;
+ m_i86_halt_perm = false;
+ if(m_z8000_apb)
+ m_z8000_apb->m_z8000->set_input_line(INPUT_LINE_HALT, ASSERT_LINE);
}
READ8_MEMBER(m24_state::keyboard_r)
@@ -58,7 +72,7 @@ READ8_MEMBER(m24_state::keyboard_r)
case 2:
return 0;
case 4:
- return m_kbcibf ? 2 : 0;
+ return (m_kbcibf ? 2 : 0) | ((m_pa & 0x40) ? 0 : 1);
}
return 0xff;
}
@@ -81,6 +95,10 @@ WRITE8_MEMBER(m24_state::keyboard_w)
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;
}
}
@@ -115,6 +133,33 @@ 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->m_z8000->set_input_line(INPUT_LINE_HALT, 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)
+ m_maincpu->set_input_line(INPUT_LINE_IRQ0, state ? ASSERT_LINE : CLEAR_LINE);
+ if(m_z8000_apb && !m_z8000_apb->halted())
+ m_z8000_apb->m_z8000->set_input_line(INPUT_LINE_IRQ1, state ? ASSERT_LINE : CLEAR_LINE);
+}
+
+WRITE_LINE_MEMBER(m24_state::halt_i86_w)
+{
+ if(m_i86_halt_perm)
+ return;
+ m_maincpu->set_input_line(INPUT_LINE_HALT, state ? ASSERT_LINE : CLEAR_LINE);
+ m_i86_halt = state ? true : false;
+}
+
static ADDRESS_MAP_START( m24_map, AS_PROGRAM, 16, m24_state )
ADDRESS_MAP_UNMAP_HIGH
AM_RANGE(0x00000, 0x9ffff) AM_RAMBANK("bank10")
@@ -127,6 +172,7 @@ static ADDRESS_MAP_START(m24_io, AS_IO, 16, m24_state )
AM_RANGE(0x0060, 0x0065) AM_READWRITE8(keyboard_r, keyboard_w, 0xffff)
AM_RANGE(0x0066, 0x0067) AM_READ_PORT("DSW0")
AM_RANGE(0x0070, 0x007f) AM_DEVREADWRITE8("mm58174an", mm58274c_device, read, write, 0xffff)
+ AM_RANGE(0x80c0, 0x80c1) AM_DEVREADWRITE8("z8000_apb", m24_z8000_device, handshake_r, handshake_w, 0xff00)
ADDRESS_MAP_END
static ADDRESS_MAP_START(kbc_map, AS_PROGRAM, 8, m24_state)
@@ -182,6 +228,20 @@ static INPUT_PORTS_START( m24 )
PORT_DIPSETTING( 0xc000, "4" )
INPUT_PORTS_END
+FLOPPY_FORMATS_MEMBER( m24_state::floppy_formats )
+ FLOPPY_PC_FORMAT,
+ FLOPPY_NASLITE_FORMAT,
+ FLOPPY_M20_FORMAT
+FLOPPY_FORMATS_END
+
+static MACHINE_CONFIG_FRAGMENT( cfg_m20_format )
+ MCFG_DEVICE_MODIFY("fdc:0")
+ static_cast<floppy_connector *>(device)->set_formats(m24_state::floppy_formats);
+
+ MCFG_DEVICE_MODIFY("fdc:1")
+ static_cast<floppy_connector *>(device)->set_formats(m24_state::floppy_formats);
+MACHINE_CONFIG_END
+
static MACHINE_CONFIG_START( olivetti, m24_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", I8086, XTAL_8MHz)
@@ -191,10 +251,15 @@ static MACHINE_CONFIG_START( olivetti, m24_state )
MCFG_PCNOPPI_MOTHERBOARD_ADD("mb", "maincpu")
- MCFG_ISA8_SLOT_ADD("mb:isa", "isa1", pc_isa8_cards, "cga", false)
- MCFG_ISA8_SLOT_ADD("mb:isa", "isa2", pc_isa8_cards, "fdc_xt", false)
- MCFG_ISA8_SLOT_ADD("mb:isa", "isa3", pc_isa8_cards, "lpt", false)
- MCFG_ISA8_SLOT_ADD("mb:isa", "isa4", pc_isa8_cards, "com", false)
+ MCFG_ISA8_SLOT_ADD("mb:isa", "mb1", pc_isa8_cards, "cga_m24", true)
+ MCFG_ISA8_SLOT_ADD("mb:isa", "mb2", pc_isa8_cards, "fdc_xt", true)
+ MCFG_SLOT_OPTION_MACHINE_CONFIG("fdc_xt", cfg_m20_format)
+ MCFG_ISA8_SLOT_ADD("mb:isa", "mb3", pc_isa8_cards, "lpt", true)
+ MCFG_ISA8_SLOT_ADD("mb:isa", "mb4", pc_isa8_cards, "com", true)
+
+ MCFG_ISA8_SLOT_ADD("mb:isa", "isa1", pc_isa8_cards, NULL, false)
+ MCFG_ISA8_SLOT_ADD("mb:isa", "isa2", pc_isa8_cards, NULL, false)
+ MCFG_ISA8_SLOT_ADD("mb:isa", "isa3", pc_isa8_cards, NULL, false)
/* internal ram */
MCFG_RAM_ADD(RAM_TAG)
@@ -211,6 +276,13 @@ static MACHINE_CONFIG_START( olivetti, m24_state )
MCFG_MM58274C_MODE24(1) // ?
MCFG_MM58274C_DAY1(1) // ?
+ MCFG_DEVICE_ADD("z8000_apb", M24_Z8000, 0)
+ MCFG_M24_Z8000_HALT(WRITELINE(m24_state, halt_i86_w))
+ MCFG_DEVICE_MODIFY("mb:dma8237")
+ MCFG_I8237_OUT_HREQ_CB(DEVWRITELINE(":", m24_state, dma_hrq_w))
+ MCFG_DEVICE_MODIFY("mb:pic8259")
+ devcb = &pic8259_device::static_set_out_int_callback(*device, DEVCB_DEVWRITELINE(":", m24_state, int_w));
+
/* software lists */
MCFG_SOFTWARE_LIST_ADD("disk_list","ibm5150")
MACHINE_CONFIG_END