mirror of
https://github.com/holub/mame
synced 2025-07-01 08:18:59 +03:00
m20: 8086 apb [Carl, rfka01, Christian Groessler]
This commit is contained in:
parent
e4a9c91fa1
commit
201b1ba302
@ -1892,6 +1892,7 @@ createMESSProjects(_target, _subtarget, "olivetti")
|
|||||||
files {
|
files {
|
||||||
MAME_DIR .. "src/mess/drivers/m20.c",
|
MAME_DIR .. "src/mess/drivers/m20.c",
|
||||||
MAME_DIR .. "src/mess/machine/m20_kbd.c",
|
MAME_DIR .. "src/mess/machine/m20_kbd.c",
|
||||||
|
MAME_DIR .. "src/mess/machine/m20_8086.c",
|
||||||
MAME_DIR .. "src/mess/drivers/m24.c",
|
MAME_DIR .. "src/mess/drivers/m24.c",
|
||||||
MAME_DIR .. "src/mess/machine/m24_kbd.c",
|
MAME_DIR .. "src/mess/machine/m24_kbd.c",
|
||||||
MAME_DIR .. "src/mess/machine/m24_z8000.c"
|
MAME_DIR .. "src/mess/machine/m24_z8000.c"
|
||||||
|
@ -47,8 +47,10 @@ E I1 Vectored interrupt error
|
|||||||
#include "machine/pit8253.h"
|
#include "machine/pit8253.h"
|
||||||
#include "machine/pic8259.h"
|
#include "machine/pic8259.h"
|
||||||
#include "formats/m20_dsk.h"
|
#include "formats/m20_dsk.h"
|
||||||
|
#include "formats/pc_dsk.h"
|
||||||
#include "machine/m20_kbd.h"
|
#include "machine/m20_kbd.h"
|
||||||
#include "bus/rs232/rs232.h"
|
#include "bus/rs232/rs232.h"
|
||||||
|
#include "machine/m20_8086.h"
|
||||||
|
|
||||||
class m20_state : public driver_device
|
class m20_state : public driver_device
|
||||||
{
|
{
|
||||||
@ -64,6 +66,7 @@ public:
|
|||||||
m_fd1797(*this, "fd1797"),
|
m_fd1797(*this, "fd1797"),
|
||||||
m_floppy0(*this, "fd1797:0:5dd"),
|
m_floppy0(*this, "fd1797:0:5dd"),
|
||||||
m_floppy1(*this, "fd1797:1:5dd"),
|
m_floppy1(*this, "fd1797:1:5dd"),
|
||||||
|
m_apb(*this, "apb"),
|
||||||
m_p_videoram(*this, "p_videoram"),
|
m_p_videoram(*this, "p_videoram"),
|
||||||
m_palette(*this, "palette")
|
m_palette(*this, "palette")
|
||||||
{
|
{
|
||||||
@ -78,6 +81,7 @@ public:
|
|||||||
required_device<fd1797_t> m_fd1797;
|
required_device<fd1797_t> m_fd1797;
|
||||||
required_device<floppy_image_device> m_floppy0;
|
required_device<floppy_image_device> m_floppy0;
|
||||||
required_device<floppy_image_device> m_floppy1;
|
required_device<floppy_image_device> m_floppy1;
|
||||||
|
optional_device<m20_8086_device> m_apb;
|
||||||
|
|
||||||
required_shared_ptr<UINT16> m_p_videoram;
|
required_shared_ptr<UINT16> m_p_videoram;
|
||||||
required_device<palette_device> m_palette;
|
required_device<palette_device> m_palette;
|
||||||
@ -92,6 +96,8 @@ public:
|
|||||||
DECLARE_WRITE_LINE_MEMBER(tty_clock_tick_w);
|
DECLARE_WRITE_LINE_MEMBER(tty_clock_tick_w);
|
||||||
DECLARE_WRITE_LINE_MEMBER(kbd_clock_tick_w);
|
DECLARE_WRITE_LINE_MEMBER(kbd_clock_tick_w);
|
||||||
DECLARE_WRITE_LINE_MEMBER(timer_tick_w);
|
DECLARE_WRITE_LINE_MEMBER(timer_tick_w);
|
||||||
|
DECLARE_WRITE_LINE_MEMBER(halt_apb_w);
|
||||||
|
DECLARE_WRITE_LINE_MEMBER(int_w);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
offs_t m_memsize;
|
offs_t m_memsize;
|
||||||
@ -226,7 +232,9 @@ WRITE_LINE_MEMBER( m20_state::timer_tick_w )
|
|||||||
* 8253 is programmed in square wave mode, not rate
|
* 8253 is programmed in square wave mode, not rate
|
||||||
* generator mode.
|
* generator mode.
|
||||||
*/
|
*/
|
||||||
m_maincpu->set_input_line(0, state ? HOLD_LINE /*ASSERT_LINE*/ : CLEAR_LINE);
|
if(m_apb)
|
||||||
|
m_apb->nvi_w(state);
|
||||||
|
m_maincpu->set_input_line(INPUT_LINE_IRQ0, state ? HOLD_LINE /*ASSERT_LINE*/ : CLEAR_LINE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -714,24 +722,9 @@ static ADDRESS_MAP_START(m20_io, AS_IO, 16, m20_state)
|
|||||||
|
|
||||||
AM_RANGE(0x140, 0x143) AM_READWRITE(m20_i8259_r, m20_i8259_w)
|
AM_RANGE(0x140, 0x143) AM_READWRITE(m20_i8259_r, m20_i8259_w)
|
||||||
|
|
||||||
|
AM_RANGE(0x3ffa, 0x3ffd) AM_DEVWRITE("apb", m20_8086_device, handshake_w)
|
||||||
ADDRESS_MAP_END
|
ADDRESS_MAP_END
|
||||||
|
|
||||||
#if 0
|
|
||||||
static ADDRESS_MAP_START(m20_apb_mem, AS_PROGRAM, 16, m20_state)
|
|
||||||
ADDRESS_MAP_UNMAP_HIGH
|
|
||||||
AM_RANGE( 0x00000, 0x007ff ) AM_RAM
|
|
||||||
AM_RANGE( 0xf0000, 0xf7fff ) AM_RAM //mirrored?
|
|
||||||
AM_RANGE( 0xfc000, 0xfffff ) AM_ROM AM_REGION("apb_bios",0)
|
|
||||||
ADDRESS_MAP_END
|
|
||||||
|
|
||||||
static ADDRESS_MAP_START(m20_apb_io, AS_IO, 16, m20_state)
|
|
||||||
ADDRESS_MAP_UNMAP_HIGH
|
|
||||||
ADDRESS_MAP_GLOBAL_MASK(0xff) // may not be needed
|
|
||||||
//0x4060 crtc address
|
|
||||||
//0x4062 crtc data
|
|
||||||
ADDRESS_MAP_END
|
|
||||||
#endif
|
|
||||||
|
|
||||||
IRQ_CALLBACK_MEMBER(m20_state::m20_irq_callback)
|
IRQ_CALLBACK_MEMBER(m20_state::m20_irq_callback)
|
||||||
{
|
{
|
||||||
if (! irqline)
|
if (! irqline)
|
||||||
@ -740,6 +733,13 @@ IRQ_CALLBACK_MEMBER(m20_state::m20_irq_callback)
|
|||||||
return m_i8259->acknowledge();
|
return m_i8259->acknowledge();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
WRITE_LINE_MEMBER(m20_state::int_w)
|
||||||
|
{
|
||||||
|
if(m_apb && !m_apb->halted())
|
||||||
|
m_apb->vi_w(state);
|
||||||
|
m_maincpu->set_input_line(INPUT_LINE_IRQ1, state ? ASSERT_LINE : CLEAR_LINE);
|
||||||
|
}
|
||||||
|
|
||||||
void m20_state::machine_start()
|
void m20_state::machine_start()
|
||||||
{
|
{
|
||||||
install_memory();
|
install_memory();
|
||||||
@ -762,6 +762,8 @@ void m20_state::machine_reset()
|
|||||||
|
|
||||||
memcpy(RAM, ROM, 8); // we need only the reset vector
|
memcpy(RAM, ROM, 8); // we need only the reset vector
|
||||||
m_maincpu->reset(); // reset the CPU to ensure it picks up the new vector
|
m_maincpu->reset(); // reset the CPU to ensure it picks up the new vector
|
||||||
|
if(m_apb)
|
||||||
|
m_apb->m_8086->set_input_line(INPUT_LINE_HALT, ASSERT_LINE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -770,7 +772,8 @@ static SLOT_INTERFACE_START( m20_floppies )
|
|||||||
SLOT_INTERFACE_END
|
SLOT_INTERFACE_END
|
||||||
|
|
||||||
FLOPPY_FORMATS_MEMBER( m20_state::floppy_formats )
|
FLOPPY_FORMATS_MEMBER( m20_state::floppy_formats )
|
||||||
FLOPPY_M20_FORMAT
|
FLOPPY_M20_FORMAT,
|
||||||
|
FLOPPY_PC_FORMAT
|
||||||
FLOPPY_FORMATS_END
|
FLOPPY_FORMATS_END
|
||||||
|
|
||||||
static SLOT_INTERFACE_START(keyboard)
|
static SLOT_INTERFACE_START(keyboard)
|
||||||
@ -790,13 +793,6 @@ static MACHINE_CONFIG_START( m20, m20_state )
|
|||||||
MCFG_RAM_DEFAULT_VALUE(0)
|
MCFG_RAM_DEFAULT_VALUE(0)
|
||||||
MCFG_RAM_EXTRA_OPTIONS("128K,192K,224K,256K,384K,512K")
|
MCFG_RAM_EXTRA_OPTIONS("128K,192K,224K,256K,384K,512K")
|
||||||
|
|
||||||
#if 0
|
|
||||||
MCFG_CPU_ADD("apb", I8086, MAIN_CLOCK)
|
|
||||||
MCFG_CPU_PROGRAM_MAP(m20_apb_mem)
|
|
||||||
MCFG_CPU_IO_MAP(m20_apb_io)
|
|
||||||
MCFG_DEVICE_DISABLE()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* video hardware */
|
/* video hardware */
|
||||||
MCFG_SCREEN_ADD("screen", RASTER)
|
MCFG_SCREEN_ADD("screen", RASTER)
|
||||||
MCFG_SCREEN_REFRESH_RATE(60)
|
MCFG_SCREEN_REFRESH_RATE(60)
|
||||||
@ -832,11 +828,13 @@ static MACHINE_CONFIG_START( m20, m20_state )
|
|||||||
MCFG_PIT8253_CLK2(1230782)
|
MCFG_PIT8253_CLK2(1230782)
|
||||||
MCFG_PIT8253_OUT2_HANDLER(WRITELINE(m20_state, timer_tick_w))
|
MCFG_PIT8253_OUT2_HANDLER(WRITELINE(m20_state, timer_tick_w))
|
||||||
|
|
||||||
MCFG_PIC8259_ADD("i8259", INPUTLINE("maincpu", 1), VCC, NULL)
|
MCFG_PIC8259_ADD("i8259", WRITELINE(m20_state, int_w), VCC, NULL)
|
||||||
|
|
||||||
MCFG_RS232_PORT_ADD("kbd", keyboard, "m20")
|
MCFG_RS232_PORT_ADD("kbd", keyboard, "m20")
|
||||||
MCFG_RS232_RXD_HANDLER(DEVWRITELINE("i8251_1", i8251_device, write_rxd))
|
MCFG_RS232_RXD_HANDLER(DEVWRITELINE("i8251_1", i8251_device, write_rxd))
|
||||||
|
|
||||||
|
MCFG_DEVICE_ADD("apb", M20_8086, 0)
|
||||||
|
|
||||||
MCFG_SOFTWARE_LIST_ADD("flop_list","m20")
|
MCFG_SOFTWARE_LIST_ADD("flop_list","m20")
|
||||||
MACHINE_CONFIG_END
|
MACHINE_CONFIG_END
|
||||||
|
|
||||||
|
119
src/mess/machine/m20_8086.c
Normal file
119
src/mess/machine/m20_8086.c
Normal file
@ -0,0 +1,119 @@
|
|||||||
|
// license:BSD-3-Clause
|
||||||
|
// copyright-holders:Carl
|
||||||
|
#include "m20_8086.h"
|
||||||
|
#include "machine/ram.h"
|
||||||
|
|
||||||
|
const device_type M20_8086 = &device_creator<m20_8086_device>;
|
||||||
|
|
||||||
|
m20_8086_device::m20_8086_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
|
||||||
|
device_t(mconfig, M20_8086, "Olivetti M20 8086 Adapter", tag, owner, clock, "m20_8086", __FILE__),
|
||||||
|
m_8086(*this, "8086"),
|
||||||
|
m_maincpu(*this, ":maincpu"),
|
||||||
|
m_pic(*this, ":i8259"),
|
||||||
|
m_8086_halt(true)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void m20_8086_device::device_start()
|
||||||
|
{
|
||||||
|
UINT8* ram = machine().device<ram_device>("ram")->pointer();
|
||||||
|
m_8086->space(AS_PROGRAM).install_readwrite_bank(0x00000, machine().device<ram_device>("ram")->size() - 0x4001, "mainram");
|
||||||
|
membank("highram")->set_base(ram);
|
||||||
|
membank("mainram")->set_base(&ram[0x4000]);
|
||||||
|
membank("vram")->set_base(memshare(":p_videoram")->ptr());
|
||||||
|
membank("vram2")->set_base(memshare(":p_videoram")->ptr());
|
||||||
|
}
|
||||||
|
|
||||||
|
void m20_8086_device::device_reset()
|
||||||
|
{
|
||||||
|
m_8086_halt = true;
|
||||||
|
m_nvi = m_vi = 0;
|
||||||
|
m_8086->set_input_line(INPUT_LINE_HALT, ASSERT_LINE);
|
||||||
|
}
|
||||||
|
|
||||||
|
ROM_START( m20_8086 )
|
||||||
|
ROM_REGION(0x4000, "8086", 0)
|
||||||
|
ROM_LOAD("apb-1086-2.0.bin", 0x0000, 0x4000, CRC(8c05be93) SHA1(2bb424afd874cc6562e9642780eaac2391308053))
|
||||||
|
ROM_END
|
||||||
|
|
||||||
|
|
||||||
|
const rom_entry *m20_8086_device::device_rom_region() const
|
||||||
|
{
|
||||||
|
return ROM_NAME( m20_8086 );
|
||||||
|
}
|
||||||
|
|
||||||
|
static ADDRESS_MAP_START(i86_prog, AS_PROGRAM, 16, m20_8086_device)
|
||||||
|
AM_RANGE(0xe0000, 0xe3fff) AM_RAMBANK("vram2")
|
||||||
|
AM_RANGE(0xf0000, 0xf3fff) AM_RAMBANK("highram")
|
||||||
|
AM_RANGE(0xf4000, 0xf7fff) AM_RAMBANK("vram")
|
||||||
|
AM_RANGE(0xfc000, 0xfffff) AM_ROM AM_REGION("8086",0)
|
||||||
|
ADDRESS_MAP_END
|
||||||
|
|
||||||
|
static ADDRESS_MAP_START(i86_io, AS_IO, 16, m20_8086_device)
|
||||||
|
AM_RANGE(0x4000, 0x4fff) AM_READWRITE(z8000_io_r, z8000_io_w)
|
||||||
|
AM_RANGE(0x7ffa, 0x7ffd) AM_WRITE(handshake_w)
|
||||||
|
ADDRESS_MAP_END
|
||||||
|
|
||||||
|
static MACHINE_CONFIG_FRAGMENT( m20_8086 )
|
||||||
|
MCFG_CPU_ADD("8086", I8086, XTAL_24MHz/3)
|
||||||
|
MCFG_CPU_PROGRAM_MAP(i86_prog)
|
||||||
|
MCFG_CPU_IO_MAP(i86_io)
|
||||||
|
MCFG_CPU_IRQ_ACKNOWLEDGE_DRIVER(m20_8086_device, int_cb)
|
||||||
|
MACHINE_CONFIG_END
|
||||||
|
|
||||||
|
machine_config_constructor m20_8086_device::device_mconfig_additions() const
|
||||||
|
{
|
||||||
|
return MACHINE_CONFIG_NAME( m20_8086 );
|
||||||
|
}
|
||||||
|
|
||||||
|
READ16_MEMBER(m20_8086_device::z8000_io_r)
|
||||||
|
{
|
||||||
|
return m_maincpu->space(AS_IO).read_word(offset << 1, mem_mask);
|
||||||
|
}
|
||||||
|
|
||||||
|
WRITE16_MEMBER(m20_8086_device::z8000_io_w)
|
||||||
|
{
|
||||||
|
m_maincpu->space(AS_IO).write_word(offset << 1, data, mem_mask);
|
||||||
|
}
|
||||||
|
|
||||||
|
IRQ_CALLBACK_MEMBER(m20_8086_device::int_cb)
|
||||||
|
{
|
||||||
|
if(m_nvi)
|
||||||
|
{
|
||||||
|
m_nvi = false;
|
||||||
|
m_8086->set_input_line(INPUT_LINE_IRQ0, m_vi ? ASSERT_LINE : CLEAR_LINE);
|
||||||
|
return 0xff;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return m_pic->acknowledge() << 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
WRITE_LINE_MEMBER(m20_8086_device::nvi_w)
|
||||||
|
{
|
||||||
|
m_nvi = state;
|
||||||
|
m_8086->set_input_line(INPUT_LINE_IRQ0, (state || m_vi) ? ASSERT_LINE : CLEAR_LINE);
|
||||||
|
}
|
||||||
|
|
||||||
|
WRITE_LINE_MEMBER(m20_8086_device::vi_w)
|
||||||
|
{
|
||||||
|
m_vi = state;
|
||||||
|
m_8086->set_input_line(INPUT_LINE_IRQ0, (state || m_nvi) ? ASSERT_LINE : CLEAR_LINE);
|
||||||
|
}
|
||||||
|
|
||||||
|
WRITE16_MEMBER(m20_8086_device::handshake_w)
|
||||||
|
{
|
||||||
|
if(!offset)
|
||||||
|
{
|
||||||
|
m_8086->set_input_line(INPUT_LINE_HALT, ASSERT_LINE);
|
||||||
|
m_maincpu->set_input_line(INPUT_LINE_HALT, CLEAR_LINE);
|
||||||
|
m_maincpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE);
|
||||||
|
m_8086_halt = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_8086->set_input_line(INPUT_LINE_HALT, CLEAR_LINE);
|
||||||
|
m_8086->set_input_line(INPUT_LINE_RESET, PULSE_LINE);
|
||||||
|
m_maincpu->set_input_line(INPUT_LINE_HALT, ASSERT_LINE);
|
||||||
|
m_8086_halt = false;
|
||||||
|
}
|
||||||
|
}
|
40
src/mess/machine/m20_8086.h
Normal file
40
src/mess/machine/m20_8086.h
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
// license:BSD-3-Clause
|
||||||
|
// copyright-holders:Carl
|
||||||
|
#ifndef M20_8086_H_
|
||||||
|
#define M20_8086_H_
|
||||||
|
|
||||||
|
#include "emu.h"
|
||||||
|
#include "cpu/i86/i86.h"
|
||||||
|
#include "machine/pic8259.h"
|
||||||
|
|
||||||
|
class m20_8086_device : public device_t
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
m20_8086_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||||
|
|
||||||
|
virtual const rom_entry *device_rom_region() const;
|
||||||
|
virtual machine_config_constructor device_mconfig_additions() const;
|
||||||
|
|
||||||
|
DECLARE_READ16_MEMBER(z8000_io_r);
|
||||||
|
DECLARE_WRITE16_MEMBER(z8000_io_w);
|
||||||
|
DECLARE_WRITE_LINE_MEMBER(vi_w);
|
||||||
|
DECLARE_WRITE_LINE_MEMBER(nvi_w);
|
||||||
|
DECLARE_WRITE16_MEMBER(handshake_w);
|
||||||
|
IRQ_CALLBACK_MEMBER(int_cb);
|
||||||
|
bool halted() { return m_8086_halt; }
|
||||||
|
required_device<cpu_device> m_8086;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void device_start();
|
||||||
|
void device_reset();
|
||||||
|
|
||||||
|
private:
|
||||||
|
required_device<cpu_device> m_maincpu;
|
||||||
|
required_device<pic8259_device> m_pic;
|
||||||
|
bool m_8086_halt;
|
||||||
|
int m_nvi, m_vi;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern const device_type M20_8086;
|
||||||
|
|
||||||
|
#endif /* M20_8086_H_ */
|
Loading…
Reference in New Issue
Block a user