summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
author Dirk Best <mail@dirk-best.de>2014-05-13 11:46:43 +0000
committer Dirk Best <mail@dirk-best.de>2014-05-13 11:46:43 +0000
commit39e6b343ed946a62e0442bc479f66f6a0497967a (patch)
treefd8071af73eaca4bf6b56149342738491670dbf1 /src
parent8882453f5a3236d20f75227b784e4a1edacd4496 (diff)
parent640354ad9efa2b8c0027c0bce444e652cb593333 (diff)
Merge branch 'master' of ssh://mess.org/mame
Diffstat (limited to 'src')
-rw-r--r--src/emu/bus/bus.mak12
-rw-r--r--src/emu/bus/zorro/a590.c346
-rw-r--r--src/emu/bus/zorro/a590.h135
-rw-r--r--src/emu/bus/zorro/action_replay.c150
-rw-r--r--src/emu/bus/zorro/action_replay.h83
-rw-r--r--src/emu/bus/zorro/cards.c31
-rw-r--r--src/emu/bus/zorro/cards.h38
-rw-r--r--src/emu/bus/zorro/zorro.c358
-rw-r--r--src/emu/bus/zorro/zorro.h443
-rw-r--r--src/emu/machine/6525tpi.c6
-rw-r--r--src/emu/machine/6525tpi.h12
-rw-r--r--src/emu/machine/akiko.c (renamed from src/mame/machine/cd32.c)124
-rw-r--r--src/emu/machine/akiko.h153
-rw-r--r--src/emu/machine/amigafdc.c7
-rw-r--r--src/emu/machine/autoconfig.c167
-rw-r--r--src/emu/machine/autoconfig.h72
-rw-r--r--src/emu/machine/cr511b.c123
-rw-r--r--src/emu/machine/cr511b.h152
-rw-r--r--src/emu/machine/dmac.c467
-rw-r--r--src/emu/machine/dmac.h173
-rw-r--r--src/emu/machine/machine.mak40
-rw-r--r--src/emu/sound/amiga.c (renamed from src/mame/audio/amiga.c)165
-rw-r--r--src/emu/sound/amiga.h63
-rw-r--r--src/emu/sound/sound.mak11
-rw-r--r--src/mame/drivers/alg.c300
-rw-r--r--src/mame/drivers/arcadia.c216
-rw-r--r--src/mame/drivers/cubo.c (renamed from src/mame/drivers/cd32.c)1168
-rw-r--r--src/mame/drivers/mquake.c185
-rw-r--r--src/mame/drivers/upscope.c163
-rw-r--r--src/mame/includes/amiga.h415
-rw-r--r--src/mame/machine/amiga.c845
-rw-r--r--src/mame/mame.lst2
-rw-r--r--src/mame/mame.mak6
-rw-r--r--src/mame/video/amiga.c41
-rw-r--r--src/mess/drivers/amiga.c2766
-rw-r--r--src/mess/machine/amigacd.c547
-rw-r--r--src/mess/machine/amigacd.h9
-rw-r--r--src/mess/machine/amigacrt.c464
-rw-r--r--src/mess/machine/amigacrt.h8
-rw-r--r--src/mess/machine/amigakbd.c67
-rw-r--r--src/mess/machine/amigakbd.h1
-rw-r--r--src/mess/mess.lst38
-rw-r--r--src/mess/mess.mak11
43 files changed, 6373 insertions, 4210 deletions
diff --git a/src/emu/bus/bus.mak b/src/emu/bus/bus.mak
index e47605433d8..9067f5bca1d 100644
--- a/src/emu/bus/bus.mak
+++ b/src/emu/bus/bus.mak
@@ -1082,3 +1082,15 @@ BUSOBJS += $(BUSOBJ)/a1bus/a1cassette.o
BUSOBJS += $(BUSOBJ)/a1bus/a1cffa.o
endif
+#-------------------------------------------------
+#
+#@src/emu/bus/zorro/zorro.h,BUSES += ZORRO
+#-------------------------------------------------
+
+ifneq ($(filter ZORRO,$(BUSES)),)
+OBJDIRS += $(BUSOBJ)/zorro
+BUSOBJS += $(BUSOBJ)/zorro/zorro.o
+BUSOBJS += $(BUSOBJ)/zorro/cards.o
+BUSOBJS += $(BUSOBJ)/zorro/a590.o
+BUSOBJS += $(BUSOBJ)/zorro/action_replay.o
+endif
diff --git a/src/emu/bus/zorro/a590.c b/src/emu/bus/zorro/a590.c
new file mode 100644
index 00000000000..d6ca7d12b6b
--- /dev/null
+++ b/src/emu/bus/zorro/a590.c
@@ -0,0 +1,346 @@
+/***************************************************************************
+
+ Commodore A590 / A2091
+
+ license: MAME, GPL-2.0+
+ copyright-holders: Dirk Best
+
+ DMAC based HD controller for the Amiga 500 and Zorro-II
+
+***************************************************************************/
+
+#include "a590.h"
+#include "bus/scsi/scsi.h"
+#include "bus/scsi/scsihd.h"
+
+
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
+const device_type A590 = &device_creator<a590_device>;
+const device_type A2091 = &device_creator<a2091_device>;
+
+//-------------------------------------------------
+// input_ports - device-specific input ports
+//-------------------------------------------------
+
+static INPUT_PORTS_START( a590_pcb )
+ PORT_START("dips")
+ PORT_DIPNAME(0x01, 0x01, "A590 Auto-Boot")
+ PORT_DIPLOCATION("DIP:1")
+ PORT_DIPSETTING(0x00, "Enabled")
+ PORT_DIPSETTING(0x01, "Disabled")
+ PORT_DIPNAME(0x02, 0x00, "A590 LUN")
+ PORT_DIPLOCATION("DIP:2")
+ PORT_DIPSETTING(0x00, "Disabled")
+ PORT_DIPSETTING(0x02, "Enabled")
+ PORT_DIPNAME(0x04, 0x04, "A590 Wait period")
+ PORT_DIPLOCATION("DIP:3")
+ PORT_DIPSETTING(0x00, "Short")
+ PORT_DIPSETTING(0x04, "Long")
+ PORT_DIPNAME(0x08, 0x00, "A590 Reserved")
+ PORT_DIPLOCATION("DIP:4")
+ PORT_DIPSETTING(0x00, "Enabled")
+ PORT_DIPSETTING(0x08, "Disabled")
+ PORT_START("jp1")
+ PORT_DIPNAME(0x0f, 0x01, "A590 Memory size")
+ PORT_DIPLOCATION("JP1:1,2,3,4")
+ PORT_DIPSETTING(0x01, "Amnesia")
+ PORT_DIPSETTING(0x02, "512K")
+ PORT_DIPSETTING(0x04, "1MB")
+ PORT_DIPSETTING(0x08, "2MB")
+ PORT_START("jp2")
+ PORT_DIPNAME(0x01, 0x00, "A590 Drive LED")
+ PORT_DIPLOCATION("JP2:1")
+ PORT_DIPSETTING(0x00, "XT Drive")
+ PORT_DIPSETTING(0x01, "SCSI Drive")
+ PORT_START("jp4")
+ PORT_DIPNAME(0x01, 0x00, "A590 Interrupt")
+ PORT_DIPLOCATION("JP4:1")
+ PORT_DIPSETTING(0x00, "INT 2")
+ PORT_DIPSETTING(0x01, "INT 6")
+INPUT_PORTS_END
+
+ioport_constructor a590_device::device_input_ports() const
+{
+ return INPUT_PORTS_NAME( a590_pcb );
+}
+
+static INPUT_PORTS_START( a2091_pcb )
+ PORT_START("jp1")
+ PORT_DIPNAME(0x0f, 0x01, "A2091 Memory size")
+ PORT_DIPLOCATION("JP1:1,2,3,4")
+ PORT_DIPSETTING(0x01, "0K")
+ PORT_DIPSETTING(0x02, "512K")
+ PORT_DIPSETTING(0x04, "1MB")
+ PORT_DIPSETTING(0x08, "2MB")
+ PORT_START("jp2")
+ PORT_DIPNAME(0x01, 0x00, "A2091 Auto-Boot")
+ PORT_DIPLOCATION("JP2:1")
+ PORT_DIPSETTING(0x00, "Enabled")
+ PORT_DIPSETTING(0x01, "Disabled")
+ PORT_START("jp3")
+ PORT_DIPNAME(0x01, 0x00, "A2091 Interrupt")
+ PORT_DIPLOCATION("JP3:1")
+ PORT_DIPSETTING(0x00, "INT 2")
+ PORT_DIPSETTING(0x01, "INT 6")
+ PORT_START("jp5")
+ PORT_DIPNAME(0x01, 0x00, "A2091 LUN")
+ PORT_DIPLOCATION("JP5:1")
+ PORT_DIPSETTING(0x00, "Disabled")
+ PORT_DIPSETTING(0x01, "Enabled")
+ PORT_DIPNAME(0x02, 0x00, "A2091 Time-Out")
+ PORT_DIPLOCATION("JP5:2")
+ PORT_DIPSETTING(0x00, "Short")
+ PORT_DIPSETTING(0x02, "Long")
+ PORT_DIPNAME(0x04, 0x00, "A2091 Reserved")
+ PORT_DIPLOCATION("JP5:3")
+ PORT_DIPSETTING(0x00, "Disabled")
+ PORT_DIPSETTING(0x02, "Enabled")
+ PORT_START("jp201")
+ PORT_DIPNAME(0x01, 0x00, "A2091 WD33C93 Clock")
+ PORT_DIPLOCATION("JP201:1")
+ PORT_DIPSETTING(0x00, "7 MHz")
+ PORT_DIPSETTING(0x01, "14 MHz")
+INPUT_PORTS_END
+
+ioport_constructor a2091_device::device_input_ports() const
+{
+ return INPUT_PORTS_NAME( a2091_pcb );
+}
+
+//-------------------------------------------------
+// machine_config_additions - device-specific
+// machine configurations
+//-------------------------------------------------
+
+static MACHINE_CONFIG_FRAGMENT( dmac_hdc )
+ MCFG_DMAC_ADD("dmac", 0)
+ MCFG_DMAC_SCSI_READ_HANDLER(READ8(dmac_hdc_device, dmac_scsi_r))
+ MCFG_DMAC_SCSI_WRITE_HANDLER(WRITE8(dmac_hdc_device, dmac_scsi_w))
+ MCFG_DMAC_INT_HANDLER(WRITELINE(dmac_hdc_device, dmac_int_w))
+ MCFG_DMAC_CFGOUT_HANDLER(WRITELINE(dmac_hdc_device, dmac_cfgout_w))
+ MCFG_DEVICE_ADD("scsi", SCSI_PORT, 0)
+ MCFG_SCSIDEV_ADD("scsi:" SCSI_PORT_DEVICE1, "harddisk", SCSIHD, SCSI_ID_1)
+ MCFG_DEVICE_ADD("scsi:wd33c93", WD33C93, 0)
+ MCFG_LEGACY_SCSI_PORT("scsi")
+ MCFG_WD33C93_IRQ_CB(DEVWRITELINE("^^", dmac_hdc_device, scsi_irq_w))
+MACHINE_CONFIG_END
+
+machine_config_constructor dmac_hdc_device::device_mconfig_additions() const
+{
+ return MACHINE_CONFIG_NAME( dmac_hdc );
+}
+
+
+//-------------------------------------------------
+// rom_region - device-specific ROM region
+//-------------------------------------------------
+
+ROM_START( dmac_hdc )
+ ROM_REGION16_BE(0x8000, "bootrom", 0)
+ ROM_DEFAULT_BIOS("v70")
+
+ ROM_SYSTEM_BIOS(0, "v60", "Version 6.0")
+ ROMX_LOAD("390388-03.u13", 0x0000, 0x2000, CRC(2e77bbff) SHA1(8a098845068f32cfa4d34a278cd290f61d35a52c), ROM_SKIP(1) | ROM_BIOS(1))
+ ROMX_LOAD("390389-03.u12", 0x0001, 0x2000, CRC(b0b8cf24) SHA1(fcf4017505f4d441814b45d559c19eab43816b30), ROM_SKIP(1) | ROM_BIOS(1))
+ ROMX_LOAD("390388-03.u13", 0x4000, 0x2000, CRC(2e77bbff) SHA1(8a098845068f32cfa4d34a278cd290f61d35a52c), ROM_SKIP(1) | ROM_BIOS(1))
+ ROMX_LOAD("390389-03.u12", 0x4001, 0x2000, CRC(b0b8cf24) SHA1(fcf4017505f4d441814b45d559c19eab43816b30), ROM_SKIP(1) | ROM_BIOS(1))
+
+ // changelog v6.1: prevent accesses to location 0 by application programs
+ ROM_SYSTEM_BIOS(1, "v61", "Version 6.1")
+ ROMX_LOAD("390721-01.u13", 0x0000, 0x2000, NO_DUMP, ROM_SKIP(1) | ROM_BIOS(2))
+ ROMX_LOAD("390722-01.u12", 0x0001, 0x2000, NO_DUMP, ROM_SKIP(1) | ROM_BIOS(2))
+ ROMX_LOAD("390721-01.u13", 0x4000, 0x2000, NO_DUMP, ROM_SKIP(1) | ROM_BIOS(2))
+ ROMX_LOAD("390722-01.u12", 0x4001, 0x2000, NO_DUMP, ROM_SKIP(1) | ROM_BIOS(2))
+
+ // changelog v6.6: fixes dual scsi problems with the wd33c93a controller
+ ROM_SYSTEM_BIOS(2, "v66", "Version 6.6")
+ ROMX_LOAD("390721-02.u13", 0x0000, 0x2000, CRC(c0871d25) SHA1(e155f18abb90cf820589c15e70559d3b6b391af8), ROM_SKIP(1) | ROM_BIOS(3))
+ ROMX_LOAD("390722-02.u12", 0x0001, 0x2000, CRC(e536bbb2) SHA1(fd7f8a6da18c1b02d07eb990c2467a24183ede12), ROM_SKIP(1) | ROM_BIOS(3))
+ ROMX_LOAD("390721-02.u13", 0x4000, 0x2000, CRC(c0871d25) SHA1(e155f18abb90cf820589c15e70559d3b6b391af8), ROM_SKIP(1) | ROM_BIOS(3))
+ ROMX_LOAD("390722-02.u12", 0x4001, 0x2000, CRC(e536bbb2) SHA1(fd7f8a6da18c1b02d07eb990c2467a24183ede12), ROM_SKIP(1) | ROM_BIOS(3))
+
+ // final commodore released version
+ ROM_SYSTEM_BIOS(3, "v70", "Version 7.0")
+ ROMX_LOAD("390721-03.u13", 0x0000, 0x2000, CRC(2942747a) SHA1(dbd7648e79c753337ff3e4f491de224bf05e6bb6), ROM_SKIP(1) | ROM_BIOS(4))
+ ROMX_LOAD("390722-03.u12", 0x0001, 0x2000, CRC(a9ccffed) SHA1(149f5bd52e2d29904e3de483b9ad772448e9278e), ROM_SKIP(1) | ROM_BIOS(4))
+ ROMX_LOAD("390721-03.u13", 0x4000, 0x2000, CRC(2942747a) SHA1(dbd7648e79c753337ff3e4f491de224bf05e6bb6), ROM_SKIP(1) | ROM_BIOS(4))
+ ROMX_LOAD("390722-03.u12", 0x4001, 0x2000, CRC(a9ccffed) SHA1(149f5bd52e2d29904e3de483b9ad772448e9278e), ROM_SKIP(1) | ROM_BIOS(4))
+
+ // third-party upgrade rom, requires a small rom adapter pcb
+ ROM_SYSTEM_BIOS(4, "g614", "Guru-ROM 6.14")
+ ROMX_LOAD("gururom_v614.bin", 0x0000, 0x8000, CRC(04e52f93) SHA1(6da21b6f5e8f8837d64507cd8a4d5cdcac4f426b), ROM_GROUPWORD | ROM_BIOS(5))
+ROM_END
+
+const rom_entry *dmac_hdc_device::device_rom_region() const
+{
+ return ROM_NAME( dmac_hdc );
+}
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// dmac_hdc_device - constructor
+//-------------------------------------------------
+
+dmac_hdc_device::dmac_hdc_device(const machine_config &mconfig, device_type type, const char *tag,
+ device_t *owner, UINT32 clock, const char *name, const char *shortname) :
+ device_t(mconfig, type, name, tag, owner, clock, shortname, __FILE__),
+ m_int6(false),
+ m_dmac(*this, "dmac"),
+ m_wdc(*this, "scsi:wd33c93")
+{
+}
+
+a590_device::a590_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
+ dmac_hdc_device(mconfig, A590, tag, owner, clock, "CBM A590 HD Controller", "a590"),
+ device_exp_card_interface(mconfig, *this),
+ m_dips(*this, "dips"),
+ m_jp1(*this, "jp1"),
+ m_jp2(*this, "jp2"),
+ m_jp4(*this, "jp4")
+{
+}
+
+a2091_device::a2091_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
+ dmac_hdc_device(mconfig, A2091, tag, owner, clock, "CBM A2091 HD Controller", "a2091"),
+ device_zorro2_card_interface(mconfig, *this),
+ m_jp1(*this, "jp1"),
+ m_jp2(*this, "jp2"),
+ m_jp3(*this, "jp3"),
+ m_jp5(*this, "jp5"),
+ m_jp201(*this, "jp201")
+{
+}
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void dmac_hdc_device::device_start()
+{
+}
+
+void a590_device::device_start()
+{
+ set_zorro_device();
+
+ // setup dmac
+ m_dmac->set_address_space(m_slot->m_space);
+ m_dmac->set_rom(memregion("bootrom")->base());
+}
+
+void a2091_device::device_start()
+{
+ set_zorro_device();
+
+ // setup dmac
+ m_dmac->set_address_space(m_slot->m_space);
+ m_dmac->set_rom(memregion("bootrom")->base());
+}
+
+//-------------------------------------------------
+// device_reset - device-specific reset
+//-------------------------------------------------
+
+void dmac_hdc_device::device_reset()
+{
+}
+
+void dmac_hdc_device::resize_ram(int config)
+{
+ // allocate space for ram
+ switch (config & 0x0f)
+ {
+ case 0x01:
+ m_ram.resize(0);
+ m_dmac->ramsz_w(0);
+ break;
+ case 0x02:
+ m_ram.resize(0x080000);
+ m_dmac->ramsz_w(1);
+ break;
+ case 0x04:
+ m_ram.resize(0x100000);
+ m_dmac->ramsz_w(2);
+ break;
+ case 0x08:
+ m_ram.resize(0x200000);
+ m_dmac->ramsz_w(3);
+ break;
+ }
+
+ m_dmac->set_ram(m_ram);
+}
+
+void a590_device::device_reset()
+{
+}
+
+void a2091_device::device_reset()
+{
+}
+
+
+//**************************************************************************
+// IMPLEMENTATION
+//**************************************************************************
+
+WRITE_LINE_MEMBER( a590_device::cfgin_w )
+{
+ // make sure we configure ourselves first
+ m_int6 = m_jp4->read() & 0x01;
+ resize_ram(m_dips->read() & 0x0f);
+
+ // then tell the dmac to start configuring
+ m_dmac->configin_w(state);
+}
+
+WRITE_LINE_MEMBER( a2091_device::cfgin_w )
+{
+ // make sure we configure ourselves first
+ m_int6 = m_jp3->read() & 0x01;
+ resize_ram(m_jp1->read() & 0x0f);
+
+ // then tell the dmac to start configuring
+ m_dmac->configin_w(state);
+}
+
+READ8_MEMBER( dmac_hdc_device::dmac_scsi_r )
+{
+ switch (offset)
+ {
+ case 0x48: return m_wdc->read(space, 0);
+ case 0x49: return m_wdc->read(space, 1);
+ }
+
+ return 0xff;
+}
+
+WRITE8_MEMBER( dmac_hdc_device::dmac_scsi_w )
+{
+ switch (offset)
+ {
+ case 0x48: m_wdc->write(space, 0, data); break;
+ case 0x49: m_wdc->write(space, 1, data); break;
+ }
+}
+
+WRITE_LINE_MEMBER( dmac_hdc_device::dmac_int_w )
+{
+ if (m_int6)
+ int6_w(state);
+ else
+ int2_w(state);
+}
+
+WRITE_LINE_MEMBER( dmac_hdc_device::scsi_irq_w )
+{
+ // should be or'ed with xt-ide irq
+ m_dmac->intx_w(state);
+}
diff --git a/src/emu/bus/zorro/a590.h b/src/emu/bus/zorro/a590.h
new file mode 100644
index 00000000000..4682c72903f
--- /dev/null
+++ b/src/emu/bus/zorro/a590.h
@@ -0,0 +1,135 @@
+/***************************************************************************
+
+ Commodore A590 / A2091
+
+ license: MAME, GPL-2.0+
+ copyright-holders: Dirk Best
+
+ DMAC based SCSI controller for the Amiga 500 and Zorro-II
+
+***************************************************************************/
+
+#pragma once
+
+#ifndef __A590_H__
+#define __A590_H__
+
+#include "emu.h"
+#include "zorro.h"
+#include "machine/dmac.h"
+#include "machine/wd33c93.h"
+
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> dmac_hdc_device
+
+class dmac_hdc_device : public device_t
+{
+public:
+ // construction/destruction
+ dmac_hdc_device(const machine_config &mconfig, device_type type, const char *tag,
+ device_t *owner, UINT32 clock, const char *name, const char *shortname);
+
+ // optional information overrides
+ virtual machine_config_constructor device_mconfig_additions() const;
+ virtual const rom_entry *device_rom_region() const;
+
+ DECLARE_READ8_MEMBER( dmac_scsi_r );
+ DECLARE_WRITE8_MEMBER( dmac_scsi_w );
+ DECLARE_WRITE_LINE_MEMBER( dmac_int_w );
+ DECLARE_WRITE_LINE_MEMBER( dmac_cfgout_w ) { cfgout_w(state); }
+ DECLARE_WRITE_LINE_MEMBER( scsi_irq_w );
+
+protected:
+ // device-level overrides
+ virtual void device_start();
+ virtual void device_reset();
+
+ // to slot
+ virtual void cfgout_w(int state) = 0;
+ virtual void int2_w(int state) = 0;
+ virtual void int6_w(int state) = 0;
+
+ // should be called when the ram size changes
+ void resize_ram(int config);
+
+ // amiga interrupt target, int 2 or 6
+ bool m_int6;
+
+ // sub-devices
+ required_device<dmac_device> m_dmac;
+ required_device<wd33c93_device> m_wdc;
+
+ dynamic_buffer m_ram;
+};
+
+// ======================> a590_device
+
+class a590_device : public dmac_hdc_device, public device_exp_card_interface
+{
+public:
+ // construction/destruction
+ a590_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+protected:
+ // device-level overrides
+ virtual void device_start();
+ virtual void device_reset();
+
+ // optional information overrides
+ virtual ioport_constructor device_input_ports() const;
+
+ // output to slot
+ virtual void cfgout_w(int state) { m_slot->cfgout_w(state); }
+ virtual void int2_w(int state) { m_slot->int2_w(state); }
+ virtual void int6_w(int state) { m_slot->int6_w(state); }
+
+ // input from slot
+ virtual DECLARE_WRITE_LINE_MEMBER( cfgin_w );
+
+private:
+ required_ioport m_dips;
+ required_ioport m_jp1;
+ required_ioport m_jp2;
+ required_ioport m_jp4;
+};
+
+// ======================> a2091_device
+
+class a2091_device : public dmac_hdc_device, public device_zorro2_card_interface
+{
+public:
+ // construction/destruction
+ a2091_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+ // device-level overrides
+ virtual void device_start();
+ virtual void device_reset();
+
+ // optional information overrides
+ virtual ioport_constructor device_input_ports() const;
+
+ // output to slot
+ virtual void cfgout_w(int state) { m_slot->cfgout_w(state); }
+ virtual void int2_w(int state) { m_slot->int2_w(state); }
+ virtual void int6_w(int state) { m_slot->int6_w(state); }
+
+ // input from slot
+ virtual DECLARE_WRITE_LINE_MEMBER( cfgin_w );
+
+private:
+ required_ioport m_jp1;
+ required_ioport m_jp2;
+ required_ioport m_jp3;
+ required_ioport m_jp5;
+ required_ioport m_jp201;
+};
+
+// device type definition
+extern const device_type A590;
+extern const device_type A2091;
+
+#endif
diff --git a/src/emu/bus/zorro/action_replay.c b/src/emu/bus/zorro/action_replay.c
new file mode 100644
index 00000000000..890e0081373
--- /dev/null
+++ b/src/emu/bus/zorro/action_replay.c
@@ -0,0 +1,150 @@
+/***************************************************************************
+
+ Datel Action Replay
+
+ license: MAME, GPL-2.0+
+ copyright-holders: Dirk Best
+
+ Freezer cartridge for Amiga 500 and Amiga 2000
+
+ Skeleton device, just loads the ROMs and generates the NMI
+ for now.
+
+ Hardware notes:
+ - http://www.mways.co.uk/amiga/howtocode/text/actionreplay.php
+
+***************************************************************************/
+
+#include "action_replay.h"
+
+
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
+const device_type ACTION_REPLAY_MK1 = &device_creator<action_replay_mk1_device>;
+const device_type ACTION_REPLAY_MK2 = &device_creator<action_replay_mk2_device>;
+const device_type ACTION_REPLAY_MK3 = &device_creator<action_replay_mk3_device>;
+
+//-------------------------------------------------
+// input_ports - device-specific input ports
+//-------------------------------------------------
+
+static INPUT_PORTS_START( ar_button )
+ PORT_START("freeze")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Freeze") PORT_CODE(KEYCODE_F12) PORT_CHANGED_MEMBER(DEVICE_SELF, action_replay_device, freeze, 0)
+INPUT_PORTS_END
+
+ioport_constructor action_replay_device::device_input_ports() const
+{
+ return INPUT_PORTS_NAME( ar_button );
+}
+
+//-------------------------------------------------
+// rom_region - device-specific ROM region
+//-------------------------------------------------
+
+ROM_START( ar_mk1 )
+ ROM_REGION(0x10000, "firmware", 0)
+ ROM_DEFAULT_BIOS("v150")
+ ROM_SYSTEM_BIOS(0, "v100", "Version 1.00")
+ ROMX_LOAD("ar1_v100.bin", 0x0000, 0x10000, BAD_DUMP CRC(2d921771) SHA1(1ead9dda2dad29146441f5ef7218375022e01248), ROM_BIOS(1))
+ ROM_SYSTEM_BIOS(1, "v150", "Version 1.50")
+ ROMX_LOAD("ar1_v150.bin", 0x0000, 0x10000, BAD_DUMP CRC(f82c4258) SHA1(843b433b2c56640e045d5fdc854dc6b1a4964e7c), ROM_BIOS(2))
+ROM_END
+
+const rom_entry *action_replay_mk1_device::device_rom_region() const
+{
+ return ROM_NAME( ar_mk1 );
+}
+
+ROM_START( ar_mk2 )
+ ROM_REGION(0x20000, "firmware", 0)
+ ROM_DEFAULT_BIOS("v214")
+ ROM_SYSTEM_BIOS(0, "v205", "Version 2.05")
+ ROMX_LOAD("ar2_v205.bin", 0x0000, 0x20000, BAD_DUMP CRC(4051eef8) SHA1(9df22b1d3285b522c223697c83d144d04e961a4a), ROM_BIOS(1))
+ ROM_SYSTEM_BIOS(1, "v212", "Version 2.12")
+ ROMX_LOAD("ar2_v212.bin", 0x0000, 0x20000, BAD_DUMP CRC(d29bdd86) SHA1(76c2900457badf22b742f0af48b78937e8b67694), ROM_BIOS(2))
+ ROM_SYSTEM_BIOS(2, "v214", "Version 2.14")
+ ROMX_LOAD("ar2_v214.bin", 0x0000, 0x20000, BAD_DUMP CRC(1bb3d0a8) SHA1(14b1f5a69efb6f4e2331970e6ca0f33c0f04ac91), ROM_BIOS(3))
+ROM_END
+
+const rom_entry *action_replay_mk2_device::device_rom_region() const
+{
+ return ROM_NAME( ar_mk2 );
+}
+
+ROM_START( ar_mk3 )
+ ROM_REGION(0x40000, "firmware", 0)
+ ROM_DEFAULT_BIOS("v309")
+ ROM_SYSTEM_BIOS(0, "v309", "Version 3.09")
+ ROMX_LOAD("ar3_v309.evn", 0x00000, 0x20000, CRC(2b84519f) SHA1(7841873bf009d8341dfa2794b3751bacf86adcc8), ROM_SKIP(1) | ROM_BIOS(1))
+ ROMX_LOAD("ar3_v309.odd", 0x00001, 0x20000, CRC(1d35bd56) SHA1(6464be1626b519499e76e4e3409e8016515d48b6), ROM_SKIP(1) | ROM_BIOS(1))
+ ROM_SYSTEM_BIOS(1, "v317", "Version 3.17")
+ ROMX_LOAD("ar3_v314.bin", 0x0000, 0x40000, BAD_DUMP CRC(009f7768) SHA1(0439d6ccc2a0e5c2e83fcf2389dc4d4a440a4c62), ROM_BIOS(2))
+ROM_END
+
+const rom_entry *action_replay_mk3_device::device_rom_region() const
+{
+ return ROM_NAME( ar_mk3 );
+}
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// action_replay_device - constructor
+//-------------------------------------------------
+
+action_replay_device::action_replay_device(const machine_config &mconfig, device_type type, const char *tag,
+ device_t *owner, UINT32 clock, const char *name, const char *shortname) :
+ device_t(mconfig, type, name, tag, owner, clock, shortname, __FILE__),
+ device_exp_card_interface(mconfig, *this),
+ m_button(*this, "freeze")
+{
+}
+
+action_replay_mk1_device::action_replay_mk1_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
+ action_replay_device(mconfig, ACTION_REPLAY_MK1, tag, owner, clock, "Datel Action Replay MK-I", "amiga_ar1")
+{
+}
+
+action_replay_mk2_device::action_replay_mk2_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
+ action_replay_device(mconfig, ACTION_REPLAY_MK1, tag, owner, clock, "Datel Action Replay MK-II", "amiga_ar2")
+{
+}
+
+action_replay_mk3_device::action_replay_mk3_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
+ action_replay_device(mconfig, ACTION_REPLAY_MK1, tag, owner, clock, "Datel Action Replay MK-III", "amiga_ar3")
+{
+}
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void action_replay_device::device_start()
+{
+ set_zorro_device();
+}
+
+//-------------------------------------------------
+// device_reset - device-specific reset
+//-------------------------------------------------
+
+void action_replay_device::device_reset()
+{
+}
+
+
+//**************************************************************************
+// IMPLEMENTATION
+//**************************************************************************
+
+INPUT_CHANGED_MEMBER( action_replay_device::freeze )
+{
+ // pushing the freeze button generates an nmi
+ m_slot->ipl_w(newval == 1 ? 7 : 0);
+}
diff --git a/src/emu/bus/zorro/action_replay.h b/src/emu/bus/zorro/action_replay.h
new file mode 100644
index 00000000000..f2520575fb7
--- /dev/null
+++ b/src/emu/bus/zorro/action_replay.h
@@ -0,0 +1,83 @@
+/***************************************************************************
+
+ Datel Action Replay
+
+ license: MAME, GPL-2.0+
+ copyright-holders: Dirk Best
+
+ Freezer cartridge for Amiga 500 and Amiga 2000
+
+***************************************************************************/
+
+#pragma once
+
+#ifndef __ACTION_REPLAY_H__
+#define __ACTION_REPLAY_H__
+
+#include "emu.h"
+#include "zorro.h"
+
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> action_replay_device
+
+class action_replay_device : public device_t, public device_exp_card_interface
+{
+public:
+ // construction/destruction
+ action_replay_device(const machine_config &mconfig, device_type type, const char *tag,
+ device_t *owner, UINT32 clock, const char *name, const char *shortname);
+
+ // optional information overrides
+ virtual ioport_constructor device_input_ports() const;
+
+ DECLARE_INPUT_CHANGED_MEMBER( freeze );
+
+protected:
+ // device-level overrides
+ virtual void device_start();
+ virtual void device_reset();
+
+private:
+ required_ioport m_button;
+};
+
+class action_replay_mk1_device : public action_replay_device
+{
+public:
+ // construction/destruction
+ action_replay_mk1_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+ // optional information overrides
+ virtual const rom_entry *device_rom_region() const;
+};
+
+class action_replay_mk2_device : public action_replay_device
+{
+public:
+ // construction/destruction
+ action_replay_mk2_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+ // optional information overrides
+ virtual const rom_entry *device_rom_region() const;
+};
+
+class action_replay_mk3_device : public action_replay_device
+{
+public:
+ // construction/destruction
+ action_replay_mk3_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+ // optional information overrides
+ virtual const rom_entry *device_rom_region() const;
+};
+
+// device type definition
+extern const device_type ACTION_REPLAY_MK1;
+extern const device_type ACTION_REPLAY_MK2;
+extern const device_type ACTION_REPLAY_MK3;
+
+#endif
diff --git a/src/emu/bus/zorro/cards.c b/src/emu/bus/zorro/cards.c
new file mode 100644
index 00000000000..68af08c60a5
--- /dev/null
+++ b/src/emu/bus/zorro/cards.c
@@ -0,0 +1,31 @@
+/***************************************************************************
+
+ Amiga Zorro Cards
+
+***************************************************************************/
+
+#include "cards.h"
+
+SLOT_INTERFACE_START( a1000_expansion_cards )
+SLOT_INTERFACE_END
+
+SLOT_INTERFACE_START( a500_expansion_cards )
+ SLOT_INTERFACE("ar1", ACTION_REPLAY_MK1)
+ SLOT_INTERFACE("ar2", ACTION_REPLAY_MK2)
+ SLOT_INTERFACE("ar3", ACTION_REPLAY_MK3)
+ SLOT_INTERFACE("a590", A590)
+SLOT_INTERFACE_END
+
+SLOT_INTERFACE_START( a2000_expansion_cards )
+ SLOT_INTERFACE("ar1", ACTION_REPLAY_MK1)
+ SLOT_INTERFACE("ar2", ACTION_REPLAY_MK2)
+ SLOT_INTERFACE("ar3", ACTION_REPLAY_MK3)
+SLOT_INTERFACE_END
+
+SLOT_INTERFACE_START( zorro2_cards )
+ SLOT_INTERFACE("a2091", A2091)
+SLOT_INTERFACE_END
+
+SLOT_INTERFACE_START( zorro3_cards )
+ SLOT_INTERFACE("a2091", A2091)
+SLOT_INTERFACE_END
diff --git a/src/emu/bus/zorro/cards.h b/src/emu/bus/zorro/cards.h
new file mode 100644
index 00000000000..6c34f9394fb
--- /dev/null
+++ b/src/emu/bus/zorro/cards.h
@@ -0,0 +1,38 @@
+/***************************************************************************
+
+ Amiga Zorro Cards
+
+ There are different card types and layouts:
+
+ * 86-pin expansion slot
+ - A1000
+ - A500 (rotated slot)
+ - A2000/B2000 (internal slot)
+ * Zorro-II
+ - A2000
+ - B2000
+ * Zorro-III
+ - A3000, A4000
+
+ For details see zorro.h. Zorro-II cards can be inserted into
+ Zorro-III slots.
+
+***************************************************************************/
+
+#pragma once
+
+#ifndef __CARDS_H__
+#define __CARDS_H__
+
+#include "emu.h"
+#include "a590.h"
+#include "action_replay.h"
+
+SLOT_INTERFACE_EXTERN( a1000_expansion_cards );
+SLOT_INTERFACE_EXTERN( a500_expansion_cards );
+SLOT_INTERFACE_EXTERN( a2000_expansion_cards );
+
+SLOT_INTERFACE_EXTERN( zorro2_cards );
+SLOT_INTERFACE_EXTERN( zorro3_cards );
+
+#endif // __CARDS_H__
diff --git a/src/emu/bus/zorro/zorro.c b/src/emu/bus/zorro/zorro.c
new file mode 100644
index 00000000000..91918c2ffea
--- /dev/null
+++ b/src/emu/bus/zorro/zorro.c
@@ -0,0 +1,358 @@
+/***************************************************************************
+
+ Amiga Zorro Slots
+
+ license: MAME, GPL-2.0+
+ copyright-holders: Dirk Best
+
+ 86-pin Expansion Slot (Zorro-I), Zorro-II, Zorro-III
+
+***************************************************************************/
+
+#include "zorro.h"
+
+
+//**************************************************************************
+// ZORRO SLOT DEVICE
+//**************************************************************************
+
+const device_type ZORRO_SLOT = &device_creator<zorro_slot_device>;
+
+//-------------------------------------------------
+// zorro_slot_device - constructor
+//-------------------------------------------------
+
+zorro_slot_device::zorro_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
+ device_t(mconfig, ZORRO_SLOT, "Zorro slot", tag, owner, clock, "zorro_slot", __FILE__),
+ device_slot_interface(mconfig, *this),
+ m_zorro_tag(NULL)
+{
+}
+
+zorro_slot_device::zorro_slot_device(const machine_config &mconfig, device_type type, const char *name,
+ const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source) :
+ device_t(mconfig, type, name, tag, owner, clock, shortname, source),
+ device_slot_interface(mconfig, *this),
+ m_zorro_tag(NULL)
+{
+}
+
+void zorro_slot_device::set_zorro_slot(device_t &device, device_t *owner, const char *zorro_tag)
+{
+ zorro_slot_device &zorro_card = dynamic_cast<zorro_slot_device &>(device);
+ zorro_card.m_owner = owner;
+ zorro_card.m_zorro_tag = zorro_tag;
+}
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void zorro_slot_device::device_start()
+{
+ device_zorro_card_interface *dev = dynamic_cast<device_zorro_card_interface *>(get_card_device());
+
+ if (dev)
+ {
+ zorro_device *m_zorro_bus = downcast<zorro_device *>(m_owner->subdevice(m_zorro_tag));
+ m_zorro_bus->add_card(dev);
+ }
+}
+
+
+//**************************************************************************
+// BASE ZORRO BUS DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// exp_slot_device - constructor
+//-------------------------------------------------
+
+zorro_device::zorro_device(const machine_config &mconfig, device_type type, const char *name,
+ const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source) :
+ device_t(mconfig, type, name, tag, owner, clock, shortname, source),
+ m_space(NULL),
+ m_cputag(NULL),
+ m_ovr_handler(*this),
+ m_int2_handler(*this),
+ m_int6_handler(*this)
+{
+}
+
+//-------------------------------------------------
+// set_cputag - set cpu we are attached to
+//-------------------------------------------------
+
+void zorro_device::set_cputag(device_t &device, const char *tag)
+{
+ zorro_device &zorro = downcast<zorro_device &>(device);
+ zorro.m_cputag = tag;
+}
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void zorro_device::device_start()
+{
+ // get address space
+ device_t *cpu = machine().device(m_cputag);
+ m_space = &cpu->memory().space(AS_PROGRAM);
+
+ // resolve callbacks
+ m_ovr_handler.resolve_safe();
+ m_int2_handler.resolve_safe();
+ m_int6_handler.resolve_safe();
+}
+
+// from slot device
+WRITE_LINE_MEMBER( zorro_device::ovr_w ) { m_ovr_handler(state); }
+WRITE_LINE_MEMBER( zorro_device::int2_w ) { m_int2_handler(state); }
+WRITE_LINE_MEMBER( zorro_device::int6_w ) { m_int6_handler(state); }
+
+
+//**************************************************************************
+// EXPANSION SLOT DEVICE
+//**************************************************************************
+
+const device_type EXP_SLOT = &device_creator<exp_slot_device>;
+
+//-------------------------------------------------
+// exp_slot_device - constructor
+//-------------------------------------------------
+
+exp_slot_device::exp_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
+ zorro_device(mconfig, EXP_SLOT, "86-pin expansion slot", tag, owner, clock, "exp_slot", __FILE__),
+ m_ipl_handler(*this),
+ m_dev(NULL)
+{
+}
+
+exp_slot_device::exp_slot_device(const machine_config &mconfig, device_type type, const char *name,
+ const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source) :
+ zorro_device(mconfig, type, name, tag, owner, clock, shortname, source),
+ m_ipl_handler(*this),
+ m_dev(NULL)
+{
+}
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void exp_slot_device::device_start()
+{
+ // resolve callbacks
+ m_ipl_handler.resolve_safe();
+
+ // call base device start
+ zorro_device::device_start();
+}
+
+//-------------------------------------------------
+// add_card - add new card to our bus
+//-------------------------------------------------
+
+void exp_slot_device::add_card(device_zorro_card_interface *card)
+{
+ m_dev = downcast<device_exp_card_interface *>(card);
+}
+
+// from slot device
+void exp_slot_device::ipl_w(int interrupt) { m_ipl_handler(0, interrupt, 0xff); }
+
+// from host
+void exp_slot_device::fc_w(int code) { if (m_dev) m_dev->fc_w(code); }
+
+
+//**************************************************************************
+// ZORRO2 DEVICE
+//**************************************************************************
+
+const device_type ZORRO2 = &device_creator<zorro2_device>;
+
+//-------------------------------------------------
+// zorro2_device - constructor
+//-------------------------------------------------
+
+zorro2_device::zorro2_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
+ zorro_device(mconfig, ZORRO2, "Zorro-II bus", tag, owner, clock, "zorro2", __FILE__),
+ m_eint1_handler(*this),
+ m_eint4_handler(*this),
+ m_eint5_handler(*this),
+ m_eint7_handler(*this),
+ m_autoconfig_device(NULL)
+{
+}
+
+zorro2_device::zorro2_device(const machine_config &mconfig, device_type type, const char *name,
+ const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source) :
+ zorro_device(mconfig, type, name, tag, owner, clock, shortname, source),
+ m_eint1_handler(*this),
+ m_eint4_handler(*this),
+ m_eint5_handler(*this),
+ m_eint7_handler(*this),
+ m_autoconfig_device(NULL)
+{
+}
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void zorro2_device::device_start()
+{
+ // resolve callbacks
+ m_eint1_handler.resolve_safe();
+ m_eint4_handler.resolve_safe();
+ m_eint5_handler.resolve_safe();
+ m_eint7_handler.resolve_safe();
+
+ // call base device start
+ zorro_device::device_start();
+}
+
+//-------------------------------------------------
+// device_reset - device-specific reset
+//-------------------------------------------------
+
+void zorro2_device::device_reset()
+{
+ // initiate autoconfig
+ m_autoconfig_device = m_dev.first();
+
+ // if we have a device, start the autoconfig chain
+ if (m_autoconfig_device)
+ m_autoconfig_device->cfgin_w(0);
+}
+
+//-------------------------------------------------
+// add_card - add new card to our bus
+//-------------------------------------------------
+
+void zorro2_device::add_card(device_zorro_card_interface *card)
+{
+ device_zorro2_card_interface *zorro2_card = downcast<device_zorro2_card_interface *>(card);
+ card->set_zorro_bus(this);
+ m_dev.append(*zorro2_card);
+}
+
+// from slot device
+WRITE_LINE_MEMBER( zorro2_device::eint1_w ) { m_eint1_handler(state); }
+WRITE_LINE_MEMBER( zorro2_device::eint4_w ) { m_eint4_handler(state); }
+WRITE_LINE_MEMBER( zorro2_device::eint5_w ) { m_eint5_handler(state); }
+WRITE_LINE_MEMBER( zorro2_device::eint7_w ) { m_eint7_handler(state); }
+
+WRITE_LINE_MEMBER( zorro2_device::cfgout_w )
+{
+ m_autoconfig_device = m_autoconfig_device->next();
+
+ // if there is still a device in the chain, tell it to configure itself
+ if (m_autoconfig_device)
+ m_autoconfig_device->cfgin_w(0);
+}
+
+// from host
+void zorro2_device::fc_w(int code)
+{
+ device_zorro2_card_interface *entry = m_dev.first();
+
+ while (entry)
+ {
+ entry->fc_w(code);
+ entry = entry->next();
+ }
+}
+
+
+//**************************************************************************
+// ZORRO INTERFACE
+//**************************************************************************
+
+//-------------------------------------------------
+// device_zorro_card_interface - constructor
+//-------------------------------------------------
+
+device_zorro_card_interface::device_zorro_card_interface(const machine_config &mconfig, device_t &device) :
+ device_slot_card_interface(mconfig, device),
+ m_zorro(NULL)
+{
+}
+
+//-------------------------------------------------
+// ~device_zorro_card_interface - destructor
+//-------------------------------------------------
+
+device_zorro_card_interface::~device_zorro_card_interface()
+{
+}
+
+void device_zorro_card_interface::set_zorro_bus(zorro_device *device)
+{
+ m_zorro = device;
+}
+
+void device_zorro_card_interface::fc_w(int code)
+{
+}
+
+WRITE_LINE_MEMBER( device_zorro_card_interface::cfgin_w )
+{
+}
+
+
+//**************************************************************************
+// EXPANSION CARD INTERFACE
+//**************************************************************************
+
+//-------------------------------------------------
+// device_exp_card_interface - constructor
+//-------------------------------------------------
+
+device_exp_card_interface::device_exp_card_interface(const machine_config &mconfig, device_t &device) :
+ device_zorro_card_interface(mconfig, device),
+ m_slot(NULL)
+{
+}
+
+//-------------------------------------------------
+// ~device_exp_card_interface - destructor
+//-------------------------------------------------
+
+device_exp_card_interface::~device_exp_card_interface()
+{
+}
+
+void device_exp_card_interface::set_zorro_device()
+{
+ m_slot = dynamic_cast<exp_slot_device *>(m_zorro);
+}
+
+
+//**************************************************************************
+// ZORRO-II CARD INTERFACE
+//**************************************************************************
+
+//-------------------------------------------------
+// device_zorro2_interface - constructor
+//-------------------------------------------------
+
+device_zorro2_card_interface::device_zorro2_card_interface(const machine_config &mconfig, device_t &device) :
+ device_zorro_card_interface(mconfig, device),
+ m_next(NULL),
+ m_slot(NULL)
+{
+}
+
+//-------------------------------------------------
+// ~device_zorro2_interface - destructor
+//-------------------------------------------------
+
+device_zorro2_card_interface::~device_zorro2_card_interface()
+{
+}
+
+void device_zorro2_card_interface::set_zorro_device()
+{
+ m_slot = dynamic_cast<zorro2_device *>(m_zorro);
+}
diff --git a/src/emu/bus/zorro/zorro.h b/src/emu/bus/zorro/zorro.h
new file mode 100644
index 00000000000..d018b217374
--- /dev/null
+++ b/src/emu/bus/zorro/zorro.h
@@ -0,0 +1,443 @@
+/***************************************************************************
+
+ Amiga Zorro Slots
+
+ license: MAME, GPL-2.0+
+ copyright-holders: Dirk Best
+
+ 86-pin Expansion Slot (Zorro-I), Zorro-II, Zorro-III
+
+ 86-pin Expansion Slot
+
+ 2 Ground 1 Ground
+ 4 Ground 3 Ground
+ 6 +5VDC 5 +5VDC
+ 8 -5VDC 7 N/C
+ 10 +12VDC 9 N/C *1
+ 12 CFGIN 11 N/C *2
+ 14 /C3 Clock 13 Ground
+ 16 /C1 Clock 15 CDAC
+ 18 XRDY 17 /OVR
+ 20 N/C *3 19 /INT2
+ 22 /INT6 21 A5
+ 24 A4 23 A6
+ 26 A3 25 Ground
+ 28 A7 27 A2
+ 30 A8 29 A1
+ 32 A9 31 FC0
+ 34 A10 33 FC1
+ 36 A11 35 FC2
+ 38 A12 37 Ground
+ 40 /IPL0 39 A13
+ 42 /IPL1 41 A14
+ 44 /IPL2 43 A15
+ 46 /BEER 45 A16
+ 48 /VPA 47 A17
+ 50 E Clock 49 Ground
+ 52 A18 51 /VMA
+ 54 A19 53 /RST
+ 56 A20 55 /HLT
+ 58 A21 57 A22
+ 60 /BR *4 59 A23
+ 62 /BGACK 61 Ground
+ 64 /BG *5 63 D15
+ 66 /DTACK 65 D14
+ 68 R/W 67 D13
+ 70 /LDS 69 D12
+ 72 /UDS 71 D11
+ 74 /AS 73 Ground
+ 76 D10 75 D0
+ 78 D9 77 D1
+ 80 D8 79 D2
+ 82 D7 81 D3
+ 84 D6 83 D4
+ 86 D5 85 Ground
+
+ *1 28 MHz Clock on A2000 and B2000
+ *2 /COPCFG on B2000
+ *3 /PALOPE on A1000, /BOSS on B2000
+ *4 /CBR on B2000
+ *5 /CBG on B2000
+
+ Zorro-II (differences only)
+
+ 7 /OWN
+ 9 /SLAVEn
+ 11 /CFGOUTn
+ 12 /CFGINn
+ 20 -12VDC
+ 40 /EINT7
+ 42 /EINT5
+ 44 /EINT4
+ 60 /BRn
+ 64 /BGn
+
+ 88 Ground 87 Ground
+ 90 Ground 89 Ground
+ 92 7 MHz 91 Ground
+ 94 /BURST 93 DOE
+ 96 /EINT1 95 /BG *5
+ 98 N/C 97 N/C
+ 100 Ground 99 Ground
+
+ *6 /GBG on B2000
+
+ Zorro-III
+
+ The Zorro-III is a multiplexed Zorro-II bus with address- and
+ data phases. Signals changes as follows:
+
+ 17 /CINH
+ 18 /MTCR
+ 29 /LOCK
+ 30 AD8 (D0)
+ 32 AD9 (D1)
+ 34 AD10 (D2)
+ 36 AD11 (D3)
+ 38 AD12 (D4)
+ 39 AD13 (D5)
+ 40 Reserved
+ 41 AD14 (D6)
+ 42 Reserved
+ 43 AD15 (D7)
+ 44 Reserved
+ 45 AD16 (D8)
+ 47 AD17 (D9)
+ 48 /MTACK
+ 51 /DS0
+ 52 AD18 (D10)
+ 54 AD19 (D11)
+ 56 AD20 (D12)
+ 57 AD22 (D14)
+ 58 AD21 (D13)
+ 59 AD23 (D15)
+ 63 AD31
+ 65 AD30
+ 67 AD29
+ 69 AD28
+ 70 /DS2
+ 71 AD27
+ 72 /DS3
+ 74 /CCS
+ 75 SD0 (D16)
+ 76 AD26
+ 77 SD1 (D17)
+ 78 AD25
+ 79 SD2 (D18)
+ 80 AD24
+ 81 SD3 (D19)
+ 82 SD7 (D23)
+ 83 SD4 (D20)
+ 84 SD6 (D22)
+ 86 SD5 (D21)
+ 91 Sense Z3
+ 94 /IORST
+ 95 /BCLR
+ 97 /FCS
+ 98 /DS1
+
+
+***************************************************************************/
+
+#pragma once
+
+#ifndef __ZORRO_H__
+#define __ZORRO_H__
+
+#include "emu.h"
+
+
+//**************************************************************************
+// INTERFACE CONFIGURATION MACROS
+//**************************************************************************
+
+#define MCFG_ZORRO_SLOT_ADD(_zorrotag, _tag, _slot_intf, _def_slot) \
+ MCFG_DEVICE_ADD(_tag, ZORRO_SLOT, 0) \
+ MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) \
+ zorro_slot_device::set_zorro_slot(*device, owner, _zorrotag);
+
+// ======================> expansion slot
+
+#define MCFG_EXPANSION_SLOT_ADD(_cputag, _slot_intf, _def_slot) \
+ MCFG_DEVICE_ADD("exp", EXP_SLOT, 0) \
+ zorro_device::set_cputag(*device, _cputag); \
+ MCFG_ZORRO_SLOT_ADD("exp", "slot", _slot_intf, _def_slot)
+
+// callbacks
+#define MCFG_EXPANSION_SLOT_OVR_HANDLER(_devcb) \
+ devcb = &zorro_device::set_ovr_handler(*device, DEVCB2_##_devcb);
+
+#define MCFG_EXPANSION_SLOT_INT2_HANDLER(_devcb) \
+ devcb = &zorro_device::set_int2_handler(*device, DEVCB2_##_devcb);
+
+#define MCFG_EXPANSION_SLOT_INT6_HANDLER(_devcb) \
+ devcb = &zorro_device::set_int6_handler(*device, DEVCB2_##_devcb);
+
+#define MCFG_EXPANSION_SLOT_IPL_HANDLER(_devcb) \
+ devcb = &exp_slot_device::set_ipl_handler(*device, DEVCB2_##_devcb);
+
+// ======================> zorro 2 bus
+
+#define MCFG_ZORRO2_ADD(_cputag) \
+ MCFG_DEVICE_ADD("zorrobus", ZORRO2, 0) \
+ zorro_device::set_cputag(*device, _cputag);
+
+#define MCFG_ZORRO2_SLOT_ADD(_tag, _slot_intf, _def_slot) \
+ MCFG_ZORRO_SLOT_ADD("zorrobus", _tag, _slot_intf, _def_slot)
+
+#define MCFG_ZORRO2_OVR_HANDLER(_devcb) \
+ devcb = &zorro_device::set_ovr_handler(*device, DEVCB2_##_devcb);
+
+#define MCFG_ZORRO2_INT2_HANDLER(_devcb) \
+ devcb = &zorro_device::set_int2_handler(*device, DEVCB2_##_devcb);
+
+#define MCFG_ZORRO2_INT6_HANDLER(_devcb) \
+ devcb = &zorro_device::set_int6_handler(*device, DEVCB2_##_devcb);
+
+#define MCFG_ZORRO2_EINT1_HANDLER(_devcb) \
+ devcb = &zorro2_device::set_eint1_handler(*device, DEVCB2_##_devcb);
+
+#define MCFG_ZORRO2_EINT4_HANDLER(_devcb) \
+ devcb = &zorro2_device::set_eint4_handler(*device, DEVCB2_##_devcb);
+
+#define MCFG_ZORRO2_EINT5_HANDLER(_devcb) \
+ devcb = &zorro2_device::set_eint5_handler(*device, DEVCB2_##_devcb);
+
+#define MCFG_ZORRO2_EINT7_HANDLER(_devcb) \
+ devcb = &zorro2_device::set_eint7_handler(*device, DEVCB2_##_devcb);
+
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// forward declaration of card interfaces
+class device_zorro_card_interface;
+class device_exp_card_interface;
+class device_zorro2_card_interface;
+
+// ======================> zorro slot device
+
+class zorro_slot_device : public device_t, public device_slot_interface
+{
+public:
+ // construction/destruction
+ zorro_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+ zorro_slot_device(const machine_config &mconfig, device_type type, const char *name,
+ const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source);
+
+ // device-level overrides
+ virtual void device_start();
+
+ // inline configuration
+ static void set_zorro_slot(device_t &device, device_t *owner, const char *zorro_tag);
+
+protected:
+ // configuration
+ const char *m_zorro_tag;
+};
+
+// device type definition
+extern const device_type ZORRO_SLOT;
+
+// ======================> base zorro bus device
+
+class zorro_device : public device_t
+{
+public:
+ // construction/destruction
+ zorro_device(const machine_config &mconfig, device_type type, const char *name,
+ const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source);
+
+ // static configuration helpers
+ static void set_cputag(device_t &device, const char *tag);
+
+ template<class _Object> static devcb2_base &set_int2_handler(device_t &device, _Object object)
+ { return downcast<zorro_device &>(device).m_int2_handler.set_callback(object); }
+ template<class _Object> static devcb2_base &set_int6_handler(device_t &device, _Object object)
+ { return downcast<zorro_device &>(device).m_int6_handler.set_callback(object); }
+ template<class _Object> static devcb2_base &set_ovr_handler(device_t &device, _Object object)
+ { return downcast<zorro_device &>(device).m_ovr_handler.set_callback(object); }
+
+ virtual void add_card(device_zorro_card_interface *card) = 0;
+
+ // interface (from slot device)
+ virtual DECLARE_WRITE_LINE_MEMBER( cfgout_w ) {};
+
+ DECLARE_WRITE_LINE_MEMBER( int2_w );
+ DECLARE_WRITE_LINE_MEMBER( int6_w );
+ DECLARE_WRITE_LINE_MEMBER( ovr_w );
+
+ // interface (from host)
+ virtual void fc_w(int code) = 0;
+
+ // access to the host space
+ address_space *m_space;
+
+protected:
+ // device-level overrides
+ virtual void device_start();
+
+private:
+ const char *m_cputag;
+
+ devcb2_write_line m_ovr_handler;
+ devcb2_write_line m_int2_handler;
+ devcb2_write_line m_int6_handler;
+};
+
+// ======================> expansion slot device
+
+class exp_slot_device : public zorro_device
+{
+public:
+ // construction/destruction
+ exp_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+ exp_slot_device(const machine_config &mconfig, device_type type, const char *name,
+ const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source);
+
+ template<class _Object> static devcb2_base &set_ipl_handler(device_t &device, _Object object)
+ { return downcast<exp_slot_device &>(device).m_ipl_handler.set_callback(object); }
+
+ // the expansion slot can only have a single card
+ virtual void add_card(device_zorro_card_interface *card);
+
+ // interface (from slot device)
+ void ipl_w(int interrupt);
+
+ // interface (from host)
+ virtual void fc_w(int code);
+
+protected:
+ // device-level overrides
+ virtual void device_start();
+
+private:
+ devcb2_write8 m_ipl_handler;
+
+ device_exp_card_interface *m_dev;
+};
+
+// device type definition
+extern const device_type EXP_SLOT;
+
+// ======================> zorro2 slot device
+
+class zorro2_device : public zorro_device
+{
+public:
+ // construction/destruction
+ zorro2_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+ zorro2_device(const machine_config &mconfig, device_type type, const char *name,
+ const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source);
+
+ template<class _Object> static devcb2_base &set_eint1_handler(device_t &device, _Object object)
+ { return downcast<zorro2_device &>(device).m_eint1_handler.set_callback(object); }
+ template<class _Object> static devcb2_base &set_eint4_handler(device_t &device, _Object object)
+ { return downcast<zorro2_device &>(device).m_eint4_handler.set_callback(object); }
+ template<class _Object> static devcb2_base &set_eint5_handler(device_t &device, _Object object)
+ { return downcast<zorro2_device &>(device).m_eint5_handler.set_callback(object); }
+ template<class _Object> static devcb2_base &set_eint7_handler(device_t &device, _Object object)
+ { return downcast<zorro2_device &>(device).m_eint7_handler.set_callback(object); }
+
+ // device-level overrides
+ virtual void device_reset();
+
+ // the zorro2 bus supports multiple cards
+ virtual void add_card(device_zorro_card_interface *card);
+
+ // interface (from slot device)
+ virtual DECLARE_WRITE_LINE_MEMBER( cfgout_w );
+
+ DECLARE_WRITE_LINE_MEMBER( eint1_w );
+ DECLARE_WRITE_LINE_MEMBER( eint4_w );
+ DECLARE_WRITE_LINE_MEMBER( eint5_w );
+ DECLARE_WRITE_LINE_MEMBER( eint7_w );
+
+ // interface (from host)
+ virtual void fc_w(int code);
+
+protected:
+ // device-level overrides
+ virtual void device_start();
+
+private:
+ devcb2_write_line m_eint1_handler;
+ devcb2_write_line m_eint4_handler;
+ devcb2_write_line m_eint5_handler;
+ devcb2_write_line m_eint7_handler;
+
+ simple_list<device_zorro2_card_interface> m_dev;
+
+ // the device which is currently configuring
+ device_zorro2_card_interface *m_autoconfig_device;
+};
+
+// device type definition
+extern const device_type ZORRO2;
+
+
+// ======================> base zorro card interface
+
+class device_zorro_card_interface : public device_slot_card_interface
+{
+public:
+ // construction/destruction
+ device_zorro_card_interface(const machine_config &mconfig, device_t &device);
+ virtual ~device_zorro_card_interface();
+
+ virtual void set_zorro_device() = 0;
+
+ void set_zorro_bus(zorro_device *device);
+
+ // interface (from device)
+ void cfgout_w(int state) { m_zorro->cfgout_w(state); }
+
+ // interface (from host)
+ virtual void fc_w(int code);
+ virtual DECLARE_WRITE_LINE_MEMBER( cfgin_w );
+
+protected:
+ zorro_device *m_zorro;
+};
+
+// ======================> expansion slot card interface
+
+class device_exp_card_interface : public device_zorro_card_interface
+{
+public:
+ // construction/destruction
+ device_exp_card_interface(const machine_config &mconfig, device_t &device);
+ virtual ~device_exp_card_interface();
+
+ virtual void set_zorro_device();
+
+protected:
+ exp_slot_device *m_slot;
+};
+
+// ======================> zorro2 card interface
+
+class device_zorro2_card_interface : public device_zorro_card_interface
+{
+public:
+ // construction/destruction
+ device_zorro2_card_interface(const machine_config &mconfig, device_t &device);
+ virtual ~device_zorro2_card_interface();
+
+ virtual void set_zorro_device();
+
+ device_zorro2_card_interface *next() const { return m_next; }
+ device_zorro2_card_interface *m_next;
+
+protected:
+ zorro2_device *m_slot;
+};
+
+
+// include this here so that you don't need to include it into every
+// driver that uses zorro slots
+#include "cards.h"
+
+
+#endif // __ZORRO_H__
diff --git a/src/emu/machine/6525tpi.c b/src/emu/machine/6525tpi.c
index 2d83a49527b..4589ff23ea7 100644
--- a/src/emu/machine/6525tpi.c
+++ b/src/emu/machine/6525tpi.c
@@ -535,6 +535,12 @@ WRITE8_MEMBER( tpi6525_device::write )
}
}
+void tpi6525_device::port_line_w(UINT8 &port, int line, int state)
+{
+ port &= ~(1 << line);
+ port |= state << line;
+}
+
/* this should probably be done better, needed for amigacd.c */
UINT8 tpi6525_device::get_ddr_a()
diff --git a/src/emu/machine/6525tpi.h b/src/emu/machine/6525tpi.h
index 6132fa45c18..a6bcea1f3c1 100644
--- a/src/emu/machine/6525tpi.h
+++ b/src/emu/machine/6525tpi.h
@@ -66,6 +66,15 @@ public:
DECLARE_WRITE8_MEMBER( pb_w );
DECLARE_WRITE8_MEMBER( pc_w );
+ WRITE_LINE_MEMBER( pb0_w ) { port_line_w(m_in_b, 0, state); }
+ WRITE_LINE_MEMBER( pb1_w ) { port_line_w(m_in_b, 1, state); }
+ WRITE_LINE_MEMBER( pb2_w ) { port_line_w(m_in_b, 2, state); }
+ WRITE_LINE_MEMBER( pb3_w ) { port_line_w(m_in_b, 3, state); }
+ WRITE_LINE_MEMBER( pb4_w ) { port_line_w(m_in_b, 4, state); }
+ WRITE_LINE_MEMBER( pb5_w ) { port_line_w(m_in_b, 5, state); }
+ WRITE_LINE_MEMBER( pb6_w ) { port_line_w(m_in_b, 6, state); }
+ WRITE_LINE_MEMBER( pb7_w ) { port_line_w(m_in_b, 7, state); }
+
UINT8 get_ddr_a();
UINT8 get_ddr_b();
UINT8 get_ddr_c();
@@ -104,6 +113,9 @@ private:
void set_interrupt();
void clear_interrupt();
+
+ // helper function to write a single line
+ static void port_line_w(UINT8 &port, int line, int state);
};
extern const device_type TPI6525;
diff --git a/src/mame/machine/cd32.c b/src/emu/machine/akiko.c
index 8061ff64522..c9eb0a30114 100644
--- a/src/mame/machine/cd32.c
+++ b/src/emu/machine/akiko.c
@@ -1,32 +1,58 @@
-#include "emu.h"
-#include "cdrom.h"
-#include "coreutil.h"
-#include "sound/cdda.h"
-#include "imagedev/chd_cd.h"
-#include "includes/cd32.h"
+/***************************************************************************
+
+ Akiko
+ ASIC used in the Amiga CD32. Commodore Part number 391563-01.
-/*********************************************************************************
+ - CD-ROM controller
+ - Builtin 1KB NVRAM
+ - Chunky to planar converter
+ - 2x CIA chips
- Akiko custom chip emulation
+***************************************************************************/
-The Akiko chip has:
-- built in 1KB NVRAM
-- chunky to planar converter
-- custom CDROM controller
+#include "akiko.h"
+#include "includes/amiga.h"
+#include "imagedev/chd_cd.h"
+#include "coreutil.h"
-TODO: Add CDDA support
-*********************************************************************************/
+//**************************************************************************
+// CONSTANTS / MACROS
+//**************************************************************************
#define LOG_AKIKO 0
#define LOG_AKIKO_CD 0
-#define CD_SECTOR_TIME (1000/((150*1024)/2048)) /* 1X CDROM sector time in msec (300KBps) */
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
const device_type AKIKO = &device_creator<akiko_device>;
+//-------------------------------------------------
+// machine_config_additions - device-specific
+// machine configurations
+//-------------------------------------------------
+
+static MACHINE_CONFIG_FRAGMENT( akiko )
+MACHINE_CONFIG_END
+
+machine_config_constructor akiko_device::device_mconfig_additions() const
+{
+ return MACHINE_CONFIG_NAME( akiko );
+}
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// akiko_device - constructor
+//-------------------------------------------------
+
akiko_device::akiko_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: device_t(mconfig, AKIKO, "CBM AKIKO", tag, owner, clock, "akiko", __FILE__),
m_c2p_input_index(0),
@@ -52,8 +78,10 @@ akiko_device::akiko_device(const machine_config &mconfig, const char *tag, devic
m_cdrom_toc(NULL),
m_dma_timer(NULL),
m_frame_timer(NULL),
- m_i2cmem(NULL),
- m_cdrom_is_device(0)
+ m_cdrom_is_device(0),
+ m_scl_w(*this),
+ m_sda_r(*this),
+ m_sda_w(*this)
{
for (int i = 0; i < 8; i++)
{
@@ -68,22 +96,29 @@ akiko_device::akiko_device(const machine_config &mconfig, const char *tag, devic
}
}
+
//-------------------------------------------------
-// device_config_complete - perform any
-// operations now that the configuration is
-// complete
+// set_cputag - set cpu tag for cpu we working on
//-------------------------------------------------
-void akiko_device::device_config_complete()
+void akiko_device::set_cputag(device_t &device, const char *tag)
{
+ akiko_device &akiko = downcast<akiko_device &>(device);
+ akiko.m_cputag = tag;
}
+
//-------------------------------------------------
// device_start - device-specific startup
//-------------------------------------------------
void akiko_device::device_start()
{
+ // resolve callbacks
+ m_scl_w.resolve_safe();
+ m_sda_r.resolve_safe(1);
+ m_sda_w.resolve_safe();
+
m_c2p_input_index = 0;
m_c2p_output_index = 0;
@@ -107,10 +142,12 @@ void akiko_device::device_start()
m_cdrom_cmd_end = 0;
m_cdrom_cmd_resp = 0;
+ device_t *cpu = machine().device(m_cputag);
+ m_space = &cpu->memory().space(AS_PROGRAM);
+
m_cdrom_toc = NULL;
m_dma_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(akiko_device::dma_proc), this));
m_frame_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(akiko_device::frame_proc), this));
- m_i2cmem = machine().device<i2cmem_device>("i2cmem");
m_cdda = machine().device<cdda_device>("cdda");
}
@@ -120,11 +157,9 @@ void akiko_device::device_start()
void akiko_device::device_reset()
{
- amiga_state *amiga = machine().driver_data<amiga_state>();
- m_space = amiga->m_maincpu_program_space;
-
cdrom_image_device *cddevice = machine().device<cdrom_image_device>("cdrom");
- if (cddevice!=NULL)
+
+ if (cddevice != NULL)
{
// MESS case
m_cdrom = cddevice->get_cdrom_file();
@@ -137,7 +172,6 @@ void akiko_device::device_reset()
m_cdrom_is_device = 0;
}
-
/* create the TOC table */
if ( m_cdrom != NULL && cdrom_get_last_track(m_cdrom) )
{
@@ -207,36 +241,26 @@ void akiko_device::device_stop()
void akiko_device::nvram_write(UINT32 data)
{
- m_i2c_scl_out = BIT(data,31);
- m_i2c_sda_out = BIT(data,30);
- m_i2c_scl_dir = BIT(data,15);
- m_i2c_sda_dir = BIT(data,14);
+ m_i2c_scl_out = BIT(data, 31);
+ m_i2c_sda_out = BIT(data, 30);
+ m_i2c_scl_dir = BIT(data, 15);
+ m_i2c_sda_dir = BIT(data, 14);
- m_i2cmem->write_scl( m_i2c_scl_out );
- m_i2cmem->write_sda( m_i2c_sda_out );
+ m_scl_w(m_i2c_scl_out);
+ m_sda_w(m_i2c_sda_out);
}
UINT32 akiko_device::nvram_read()
{
- UINT32 v = 0;
+ UINT32 v = 0;
- if ( m_i2c_scl_dir )
- {
+ if (m_i2c_scl_dir)
v |= m_i2c_scl_out << 31;
- }
- else
- {
- v |= 0 << 31;
- }
- if ( m_i2c_sda_dir )
- {
+ if (m_i2c_sda_dir)
v |= m_i2c_sda_out << 30;
- }
else
- {
- v |= m_i2cmem->read_sda() << 30;
- }
+ v |= m_sda_r() << 30;
v |= m_i2c_scl_dir << 15;
v |= m_i2c_sda_dir << 14;
@@ -393,8 +417,10 @@ void akiko_device::set_cd_status(UINT32 status)
if ( m_cdrom_status[0] & m_cdrom_status[1] )
{
- if (LOG_AKIKO_CD) logerror( "Akiko CD IRQ\n" );
- amiga->amiga_custom_w(*m_space, REG_INTREQ, 0x8000 | INTENA_PORTS, 0xffff);
+ if (LOG_AKIKO_CD)
+ logerror("Akiko CD IRQ\n");
+
+ amiga->custom_chip_w(REG_INTREQ, INTENA_SETCLR | INTENA_PORTS);
}
}
diff --git a/src/emu/machine/akiko.h b/src/emu/machine/akiko.h
new file mode 100644
index 00000000000..47fa22fee19
--- /dev/null
+++ b/src/emu/machine/akiko.h
@@ -0,0 +1,153 @@
+/***************************************************************************
+
+ Akiko
+
+ Used in the Amiga CD32
+
+ - CD-ROM controller
+ - Builtin 1KB NVRAM
+ - Chunky to planar converter
+
+***************************************************************************/
+
+#pragma once
+
+#ifndef __AKIKO_H__
+#define __AKIKO_H__
+
+#include "emu.h"
+#include "cdrom.h"
+#include "sound/cdda.h"
+
+
+//**************************************************************************
+// INTERFACE CONFIGURATION MACROS
+//**************************************************************************
+
+#define MCFG_AKIKO_ADD(_tag, _cputag) \
+ MCFG_DEVICE_ADD(_tag, AKIKO, 0) \
+ akiko_device::set_cputag(*device, _cputag);
+
+#define MCFG_AKIKO_SCL_HANDLER(_devcb) \
+ devcb = &akiko_device::set_scl_handler(*device, DEVCB2_##_devcb);
+
+#define MCFG_AKIKO_SDA_READ_HANDLER(_devcb) \
+ devcb = &akiko_device::set_sda_read_handler(*device, DEVCB2_##_devcb);
+
+#define MCFG_AKIKO_SDA_WRITE_HANDLER(_devcb) \
+ devcb = &akiko_device::set_sda_write_handler(*device, DEVCB2_##_devcb);
+
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> akiko_device
+
+class akiko_device : public device_t
+{
+public:
+ akiko_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+ ~akiko_device() {}
+
+ // callbacks
+ template<class _Object> static devcb2_base &set_scl_handler(device_t &device, _Object object)
+ { return downcast<akiko_device &>(device).m_scl_w.set_callback(object); }
+
+ template<class _Object> static devcb2_base &set_sda_read_handler(device_t &device, _Object object)
+ { return downcast<akiko_device &>(device).m_sda_r.set_callback(object); }
+
+ template<class _Object> static devcb2_base &set_sda_write_handler(device_t &device, _Object object)
+ { return downcast<akiko_device &>(device).m_sda_w.set_callback(object); }
+
+ DECLARE_READ32_MEMBER( read );
+ DECLARE_WRITE32_MEMBER( write );
+
+ // inline configuration
+ static void set_cputag(device_t &device, const char *tag);
+
+protected:
+ // device-level overrides
+ virtual void device_start();
+ virtual void device_stop();
+ virtual void device_reset();
+ virtual machine_config_constructor device_mconfig_additions() const;
+
+private:
+ // 1X CDROM sector time in msec (300KBps)
+ static const int CD_SECTOR_TIME = (1000/((150*1024)/2048));
+
+ // internal state
+ address_space *m_space;
+
+ // chunky to planar converter
+ UINT32 m_c2p_input_buffer[8];
+ UINT32 m_c2p_output_buffer[8];
+ UINT32 m_c2p_input_index;
+ UINT32 m_c2p_output_index;
+
+ // i2c bus
+ int m_i2c_scl_out;
+ int m_i2c_scl_dir;
+ int m_i2c_sda_out;
+ int m_i2c_sda_dir;
+
+ // cdrom
+ UINT32 m_cdrom_status[2];
+ UINT32 m_cdrom_address[2];
+ UINT32 m_cdrom_track_index;
+ UINT32 m_cdrom_lba_start;
+ UINT32 m_cdrom_lba_end;
+ UINT32 m_cdrom_lba_cur;
+ UINT16 m_cdrom_readmask;
+ UINT16 m_cdrom_readreqmask;
+ UINT32 m_cdrom_dmacontrol;
+ UINT32 m_cdrom_numtracks;
+ UINT8 m_cdrom_speed;
+ UINT8 m_cdrom_cmd_start;
+ UINT8 m_cdrom_cmd_end;
+ UINT8 m_cdrom_cmd_resp;
+
+ cdda_device *m_cdda;
+ cdrom_file *m_cdrom;
+
+ UINT8 *m_cdrom_toc;
+
+ emu_timer *m_dma_timer;
+ emu_timer *m_frame_timer;
+
+ int m_cdrom_is_device;
+
+ void nvram_write(UINT32 data);
+ UINT32 nvram_read();
+
+ void c2p_write(UINT32 data);
+ UINT32 c2p_read();
+
+ void cdda_stop();
+ void cdda_play(UINT32 lba, UINT32 num_blocks);
+ void cdda_pause(int pause);
+ UINT8 cdda_getstatus(UINT32 *lba);
+ void set_cd_status(UINT32 status);
+
+ TIMER_CALLBACK_MEMBER( frame_proc );
+ TIMER_CALLBACK_MEMBER( dma_proc );
+
+ void start_dma();
+ void setup_response( int len, UINT8 *r1 );
+
+ TIMER_CALLBACK_MEMBER( cd_delayed_cmd );
+ void update_cdrom();
+
+ // i2c interface
+ devcb2_write_line m_scl_w;
+ devcb2_read_line m_sda_r;
+ devcb2_write_line m_sda_w;
+
+ const char *m_cputag;
+};
+
+// device type definition
+extern const device_type AKIKO;
+
+#endif
diff --git a/src/emu/machine/amigafdc.c b/src/emu/machine/amigafdc.c
index 2349a3b7ce0..334c2032a11 100644
--- a/src/emu/machine/amigafdc.c
+++ b/src/emu/machine/amigafdc.c
@@ -63,8 +63,7 @@ void amiga_fdc::dma_done()
{
amiga_state *state = machine().driver_data<amiga_state>();
dma_state = DMA_IDLE;
- address_space &space = *state->m_maincpu_program_space;
- state->amiga_custom_w(space, REG_INTREQ, 0x8000 | INTENA_DSKBLK, 0xffff);
+ state->custom_chip_w(REG_INTREQ, INTENA_SETCLR | INTENA_DSKBLK);
}
void amiga_fdc::dma_write(UINT16 value)
@@ -202,8 +201,7 @@ void amiga_fdc::live_run(attotime limit)
cur_live.bit_counter = 0;
}
dskbyt |= 0x1000;
- address_space &space = *state->m_maincpu_program_space;
- state->amiga_custom_w(space, REG_INTREQ, 0x8000 | INTENA_DSKSYN, 0xffff);
+ state->custom_chip_w(REG_INTREQ, INTENA_SETCLR | INTENA_DSKSYN);
} else
dskbyt &= ~0x1000;
@@ -412,6 +410,7 @@ UINT8 amiga_fdc::ciaapra_r()
if(!floppy->dskchg_r())
ret &= ~0x04;
}
+
return ret;
}
diff --git a/src/emu/machine/autoconfig.c b/src/emu/machine/autoconfig.c
new file mode 100644
index 00000000000..3c93efa6cff
--- /dev/null
+++ b/src/emu/machine/autoconfig.c
@@ -0,0 +1,167 @@
+/***************************************************************************
+
+ Amiga Autoconfig
+
+***************************************************************************/
+
+#include "autoconfig.h"
+
+
+//**************************************************************************
+// CONSTANTS & MACROS
+//**************************************************************************
+
+#define VERBOSE 1
+
+
+//**************************************************************************
+// CONSTRUCTOR
+//**************************************************************************
+
+amiga_autoconfig::amiga_autoconfig()
+{
+ memset(m_cfg, 0xff, sizeof(m_cfg));
+
+ // interrupt status register, not inverted
+ m_cfg[0x20] = 0;
+ m_cfg[0x21] = 0;
+}
+
+amiga_autoconfig::~amiga_autoconfig()
+{
+}
+
+
+//**************************************************************************
+// AUTOCONFIG INFO SETTERS
+//**************************************************************************
+
+void amiga_autoconfig::autoconfig_board_type(board_type type)
+{
+ m_cfg[0x00] &= 0x3000;
+ m_cfg[0x00] |= (type << 2) << 12;
+}
+
+void amiga_autoconfig::autoconfig_board_size(board_size size)
+{
+ m_cfg[0x01] &= 0x8000;
+ m_cfg[0x01] |= (size << 0) << 12;
+}
+
+void amiga_autoconfig::autoconfig_rom_vector_valid(bool state)
+{
+ m_cfg[0x00] &= 0xe000;
+ m_cfg[0x00] |= (state ? 0x01 : 0x00) << 12;
+}
+
+void amiga_autoconfig::autoconfig_link_into_memory(bool state)
+{
+ m_cfg[0x00] &= 0xd000;
+ m_cfg[0x00] |= (state ? 0x02 : 0x00) << 12;
+}
+
+void amiga_autoconfig::autoconfig_multi_device(bool state)
+{
+ m_cfg[0x01] &= 0x7000;
+ m_cfg[0x01] |= (state ? 0x08 : 0x00) << 12;
+}
+
+void amiga_autoconfig::autoconfig_8meg_preferred(bool state)
+{
+ m_cfg[0x04] &= 0x7000;
+ m_cfg[0x04] |= (state ? 0x08 : 0x00) << 12;
+}
+
+void amiga_autoconfig::autoconfig_can_shutup(bool state)
+{
+ m_cfg[0x04] &= 0xb000;
+ m_cfg[0x04] |= (state ? 0x04 : 0x00) << 12;
+}
+
+void amiga_autoconfig::autoconfig_product(UINT8 data)
+{
+ m_cfg[0x02] = ~((data & 0xf0) >> 4) << 12;
+ m_cfg[0x03] = ~((data & 0x0f) >> 0) << 12;
+}
+
+void amiga_autoconfig::autoconfig_manufacturer(UINT16 data)
+{
+ m_cfg[0x08] = ~((data & 0xf000) >> 12) << 12;
+ m_cfg[0x09] = ~((data & 0x0f00) >> 8) << 12;
+ m_cfg[0x0a] = ~((data & 0x00f0) >> 4) << 12;
+ m_cfg[0x0b] = ~((data & 0x000f) >> 0) << 12;
+}
+
+void amiga_autoconfig::autoconfig_serial(UINT32 data)
+{
+ m_cfg[0x0c] = ~((data & 0xf0000000) >> 28) << 12;
+ m_cfg[0x0d] = ~((data & 0x0f000000) >> 24) << 12;
+ m_cfg[0x0e] = ~((data & 0x00f00000) >> 20) << 12;
+ m_cfg[0x0f] = ~((data & 0x000f0000) >> 16) << 12;
+ m_cfg[0x10] = ~((data & 0x0000f000) >> 12) << 12;
+ m_cfg[0x11] = ~((data & 0x00000f00) >> 8) << 12;
+ m_cfg[0x12] = ~((data & 0x000000f0) >> 4) << 12;
+ m_cfg[0x13] = ~((data & 0x0000000f) >> 0) << 12;
+}
+
+void amiga_autoconfig::autoconfig_rom_vector(UINT16 data)
+{
+ m_cfg[0x14] = ~((data & 0xf000) >> 12) << 12;
+ m_cfg[0x15] = ~((data & 0x0f00) >> 8) << 12;
+ m_cfg[0x16] = ~((data & 0x00f0) >> 4) << 12;
+ m_cfg[0x17] = ~((data & 0x000f) >> 0) << 12;
+}
+
+
+//**************************************************************************
+// MEMORY INTERFACE
+//**************************************************************************
+
+READ16_MEMBER( amiga_autoconfig::autoconfig_read )
+{
+ UINT16 data = m_cfg[offset] | 0x0fff;
+
+ if (VERBOSE && !space.debugger_access())
+ logerror("autoconfig_read %04x @ %02x [mask = %04x]\n", data, offset, mem_mask);
+
+ return data;
+}
+
+WRITE16_MEMBER( amiga_autoconfig::autoconfig_write )
+{
+ if (VERBOSE && !space.debugger_access())
+ logerror("autoconfig_write %04x @ %02x [mask = %04x]\n", data, offset, mem_mask);
+
+ switch (offset)
+ {
+ case 0x20:
+ // user-definable
+ break;
+
+ case 0x21:
+ // bit 0 = interrupt enable
+ // bit 1 = user-definable
+ // bit 2 = local reset
+ // bit 3 = user-definable
+ break;
+
+ case 0x24:
+ // base address register
+ m_cfg[0x24] = data & 0xf000;
+ autoconfig_base_address((m_cfg[0x24] << 8) | (m_cfg[0x25] << 4));
+ break;
+
+ case 0x25:
+ // latch low-nibble
+ m_cfg[0x25] = data & 0xf000;
+ break;
+
+ case 0x26:
+ // shut-up register
+ autoconfig_base_address(0);
+ break;
+
+ case 0x27:
+ break;
+ }
+}
diff --git a/src/emu/machine/autoconfig.h b/src/emu/machine/autoconfig.h
new file mode 100644
index 00000000000..5183f474af9
--- /dev/null
+++ b/src/emu/machine/autoconfig.h
@@ -0,0 +1,72 @@
+/***************************************************************************
+
+ Amiga Autoconfig
+
+***************************************************************************/
+
+#pragma once
+
+#ifndef __AUTOCONFIG_H__
+#define __AUTOCONFIG_H__
+
+#include "emu.h"
+
+class amiga_autoconfig
+{
+public:
+ amiga_autoconfig();
+ virtual ~amiga_autoconfig();
+
+ // read from autoconfig space
+ DECLARE_READ16_MEMBER( autoconfig_read );
+
+ // write to autoconfig space
+ DECLARE_WRITE16_MEMBER( autoconfig_write );
+
+protected:
+ enum board_type
+ {
+ BOARD_TYPE_ZORRO3 = 2,
+ BOARD_TYPE_ZORRO2 = 3
+ };
+
+ enum board_size
+ {
+ BOARD_SIZE_8M = 0,
+ BOARD_SIZE_64K = 1,
+ BOARD_SIZE_128K = 2,
+ BOARD_SIZE_256K = 3,
+ BOARD_SIZE_512K = 4,
+ BOARD_SIZE_1M = 5,
+ BOARD_SIZE_2M = 6,
+ BOARD_SIZE_4M = 7
+ };
+
+ // board type & size
+ void autoconfig_board_type(board_type type);
+ void autoconfig_board_size(board_size size);
+
+ // various flags
+ void autoconfig_rom_vector_valid(bool state);
+ void autoconfig_link_into_memory(bool state);
+ void autoconfig_multi_device(bool state);
+ void autoconfig_8meg_preferred(bool state);
+ void autoconfig_can_shutup(bool state);
+
+ // product number, manufacturer number, serial number
+ void autoconfig_product(UINT8 data);
+ void autoconfig_manufacturer(UINT16 data);
+ void autoconfig_serial(UINT32 data);
+
+ // rom vector
+ void autoconfig_rom_vector(UINT16 data);
+
+ // called once we have received a valid base address from the host system
+ virtual void autoconfig_base_address(offs_t address) = 0;
+
+private:
+ // configuration information about our autoconfig board, 256 nibbles
+ UINT16 m_cfg[0x40];
+};
+
+#endif // __AUTOCONFIG_H__
diff --git a/src/emu/machine/cr511b.c b/src/emu/machine/cr511b.c
new file mode 100644
index 00000000000..0a4ee90bf80
--- /dev/null
+++ b/src/emu/machine/cr511b.c
@@ -0,0 +1,123 @@
+/***************************************************************************
+
+ CR-511-B CD-ROM drive
+
+ license: MAME, GPL-2.0+
+ copyright-holders: Dirk Best
+
+ CD-ROM drive with a custom MKE/Panasonic interface as used in the
+ Commodore CDTV and early SoundBlaster cards.
+
+***************************************************************************/
+
+#include "cr511b.h"
+
+
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
+const device_type CR511B = &device_creator<cr511b_device>;
+
+//-------------------------------------------------
+// machine_config_additions - device-specific
+// machine configurations
+//-------------------------------------------------
+
+static MACHINE_CONFIG_FRAGMENT( cr511b )
+ MCFG_CDROM_ADD("cdrom")
+ MCFG_CDROM_INTERFACE("cdrom")
+ MCFG_SOUND_ADD("cdda", CDDA, 0)
+ MCFG_SOUND_ROUTE(0, ":lspeaker", 1.0)
+ MCFG_SOUND_ROUTE(1, ":rspeaker", 1.0)
+MACHINE_CONFIG_END
+
+machine_config_constructor cr511b_device::device_mconfig_additions() const
+{
+ return MACHINE_CONFIG_NAME( cr511b );
+}
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// cr511b_device - constructor
+//-------------------------------------------------
+
+cr511b_device::cr511b_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
+ device_t(mconfig, CR511B, "CR-511-B CD-ROM drive", tag, owner, clock, "cr511b", __FILE__),
+ m_cdrom(*this, "cdrom"),
+ m_cdda(*this, "cdda"),
+ m_stch_handler(*this),
+ m_sten_handler(*this),
+ m_drq_handler(*this),
+ m_dten_handler(*this),
+ m_scor_handler(*this),
+ m_xaen_handler(*this),
+ m_frame_timer(NULL),
+ m_motor(false),
+ m_enabled(-1),
+ m_cmd(-1)
+{
+}
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void cr511b_device::device_start()
+{
+ // resolve callbacks
+ m_stch_handler.resolve_safe();
+ m_sten_handler.resolve_safe();
+ m_drq_handler.resolve_safe();
+ m_dten_handler.resolve_safe();
+ m_scor_handler.resolve_safe();
+ m_xaen_handler.resolve_safe();
+
+ m_frame_timer = timer_alloc(0, NULL);
+ m_frame_timer->adjust(attotime::never);
+}
+
+//-------------------------------------------------
+// device_reset - device-specific reset
+//-------------------------------------------------
+
+void cr511b_device::device_reset()
+{
+}
+
+//-------------------------------------------------
+// device_timer - device-specific timer events
+//-------------------------------------------------
+
+void cr511b_device::device_timer(emu_timer &timer, device_timer_id tid, int param, void *ptr)
+{
+}
+
+
+//**************************************************************************
+// IMPLEMENTATION
+//**************************************************************************
+
+READ8_MEMBER( cr511b_device::read )
+{
+ return 0xff;
+}
+
+WRITE8_MEMBER ( cr511b_device::write )
+{
+
+}
+
+WRITE_LINE_MEMBER( cr511b_device::enable_w )
+{
+ m_enabled = state;
+}
+
+WRITE_LINE_MEMBER( cr511b_device::cmd_w )
+{
+ m_cmd = state;
+}
diff --git a/src/emu/machine/cr511b.h b/src/emu/machine/cr511b.h
new file mode 100644
index 00000000000..5def8947fc9
--- /dev/null
+++ b/src/emu/machine/cr511b.h
@@ -0,0 +1,152 @@
+/***************************************************************************
+
+ CR-511-B CD-ROM drive
+
+ license: MAME, GPL-2.0+
+ copyright-holders: Dirk Best
+
+ CD-ROM drive with a custom MKE/Panasonic interface as used in the
+ Commodore CDTV and early SoundBlaster cards.
+
+ 1 _RESET 2 GND
+ 3 EFFK 4 SCCK
+ 5 SBCP 6 SCOR
+ 7 GND 8 GND
+ 9 C16M 10 GND
+ 11 _XAEN 12 GND
+ 13 EMPASIS 14 D0
+ 15 LRCK 16 DSCK
+ 17 _MUTE 18 GND
+ 19 _BUSY 20 _STCH
+ 21 _ENABLE 22 DRQ
+ 23 _HWR 24 GND
+ 25 _DTEN 26 _HRD
+ 27 _STEN 28 _CMD
+ 29 _EOP 30 GND
+ 31 DB7 32 GND
+ 33 DB6 34 DB5
+ 35 DB4 36 GND
+ 37 DB3 38 DB2
+ 39 DB1 40 DB0
+
+***************************************************************************/
+
+#pragma once
+
+#ifndef __CR511B_H__
+#define __CR511B_H__
+
+#include "emu.h"
+#include "imagedev/chd_cd.h"
+#include "sound/cdda.h"
+
+
+//**************************************************************************
+// INTERFACE CONFIGURATION MACROS
+//**************************************************************************
+
+#define MCFG_CR511B_ADD(_tag) \
+ MCFG_DEVICE_ADD(_tag, CR511B, 0) \
+
+#define MCFG_CR511B_STCH_HANDLER(_devcb) \
+ devcb = &cr511b_device::set_stch_handler(*device, DEVCB2_##_devcb);
+
+#define MCFG_CR511B_STEN_HANDLER(_devcb) \
+ devcb = &cr511b_device::set_sten_handler(*device, DEVCB2_##_devcb);
+
+#define MCFG_CR511B_DRQ_HANDLER(_devcb) \
+ devcb = &cr511b_device::set_drq_handler(*device, DEVCB2_##_devcb);
+
+#define MCFG_CR511B_DTEN_HANDLER(_devcb) \
+ devcb = &cr511b_device::set_dten_handler(*device, DEVCB2_##_devcb);
+
+#define MCFG_CR511B_SCOR_HANDLER(_devcb) \
+ devcb = &cr511b_device::set_scor_handler(*device, DEVCB2_##_devcb);
+
+#define MCFG_CR511B_XAEN_HANDLER(_devcb) \
+ devcb = &cr511b_device::set_xaen_handler(*device, DEVCB2_##_devcb);
+
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> cr511b_device
+
+class cr511b_device : public device_t
+{
+public:
+ // construction/destruction
+ cr511b_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+ // callbacks
+ template<class _Object> static devcb2_base &set_stch_handler(device_t &device, _Object object)
+ { return downcast<cr511b_device &>(device).m_stch_handler.set_callback(object); }
+
+ template<class _Object> static devcb2_base &set_sten_handler(device_t &device, _Object object)
+ { return downcast<cr511b_device &>(device).m_sten_handler.set_callback(object); }
+
+ template<class _Object> static devcb2_base &set_drq_handler(device_t &device, _Object object)
+ { return downcast<cr511b_device &>(device).m_drq_handler.set_callback(object); }
+
+ template<class _Object> static devcb2_base &set_dten_handler(device_t &device, _Object object)
+ { return downcast<cr511b_device &>(device).m_dten_handler.set_callback(object); }
+
+ template<class _Object> static devcb2_base &set_scor_handler(device_t &device, _Object object)
+ { return downcast<cr511b_device &>(device).m_scor_handler.set_callback(object); }
+
+ template<class _Object> static devcb2_base &set_xaen_handler(device_t &device, _Object object)
+ { return downcast<cr511b_device &>(device).m_xaen_handler.set_callback(object); }
+
+ DECLARE_READ8_MEMBER( read );
+ DECLARE_WRITE8_MEMBER ( write );
+
+ DECLARE_WRITE_LINE_MEMBER( enable_w );
+ DECLARE_WRITE_LINE_MEMBER( cmd_w );
+
+protected:
+ // device-level overrides
+ virtual void device_start();
+ virtual void device_reset();
+ virtual machine_config_constructor device_mconfig_additions() const;
+ virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
+
+private:
+ enum
+ {
+ STATUS_DOOR_CLOSED = 0x80,
+ STATUS_MEDIA = 0x40,
+ STATUS_MOTOR = 0x20,
+ STATUS_ERROR = 0x10,
+ STATUS_SUCCESS = 0x08,
+ STATUS_PLAYING = 0x04,
+ STATUS_DOOR_LOCKED = 0x02,
+ STATUS_READY = 0x01
+ };
+
+ required_device<cdrom_image_device> m_cdrom;
+ required_device<cdda_device> m_cdda;
+
+ devcb2_write_line m_stch_handler;
+ devcb2_write_line m_sten_handler;
+ devcb2_write_line m_drq_handler;
+ devcb2_write_line m_dten_handler;
+ devcb2_write_line m_scor_handler;
+ devcb2_write_line m_xaen_handler;
+
+ emu_timer *m_frame_timer;
+
+ bool m_motor;
+
+ // state of lines
+ int m_enabled;
+ int m_cmd;
+
+ // data transfer
+ UINT8 m_sector_buffer[CD_MAX_SECTOR_DATA];
+};
+
+// device type definition
+extern const device_type CR511B;
+
+#endif
diff --git a/src/emu/machine/dmac.c b/src/emu/machine/dmac.c
new file mode 100644
index 00000000000..7f2f674a793
--- /dev/null
+++ b/src/emu/machine/dmac.c
@@ -0,0 +1,467 @@
+/***************************************************************************
+
+ DMAC
+
+ license: MAME, GPL-2.0+
+ copyright-holders: Dirk Best
+
+ DMA controller used in Amiga systems
+
+BOARDS:
+ CBM A590/A2091 HD controller: Prod=514/3($202/$3) (@$e90000 64K)
+ CBM A2052/58. RAM I 590/2091.RAM Prod=514/10($202/$a) (@$200000 2meg mem)
+
+***************************************************************************/
+
+#include "dmac.h"
+
+
+//**************************************************************************
+// CONSTANTS / MACROS
+//**************************************************************************
+
+#define VERBOSE 1
+
+
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
+const device_type DMAC = &device_creator<dmac_device>;
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// dmac_device - constructor
+//-------------------------------------------------
+
+dmac_device::dmac_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
+ device_t(mconfig, DMAC, "DMAC DMA Controller", tag, owner, clock, "dmac", __FILE__),
+ amiga_autoconfig(),
+ m_cfgout_handler(*this),
+ m_int_handler(*this),
+ m_xdack_handler(*this),
+ m_scsi_read_handler(*this),
+ m_scsi_write_handler(*this),
+ m_io_read_handler(*this),
+ m_io_write_handler(*this),
+ m_space(NULL),
+ m_rom(NULL),
+ m_ram(NULL),
+ m_ram_size(-1),
+ m_configured(false),
+ m_rst(-1),
+ m_cntr(0),
+ m_istr(0),
+ m_wtc(0),
+ m_acr(0),
+ m_dma_active(false)
+{
+}
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void dmac_device::device_start()
+{
+ // resolve callbacks
+ m_cfgout_handler.resolve_safe();
+ m_int_handler.resolve_safe();
+ m_xdack_handler.resolve_safe();
+ m_scsi_read_handler.resolve_safe(0);
+ m_scsi_write_handler.resolve_safe();
+ m_io_read_handler.resolve_safe(0);
+ m_io_write_handler.resolve_safe();
+}
+
+//-------------------------------------------------
+// device_reset - device-specific reset
+//-------------------------------------------------
+
+void dmac_device::device_reset()
+{
+ // fifo empty
+ m_istr |= ISTR_FE_FLG;
+}
+
+void dmac_device::autoconfig_base_address(offs_t address)
+{
+ if (VERBOSE)
+ logerror("%s('%s'): autoconfig_base_address received: 0x%06x\n", shortname(), basetag(), address);
+
+ if (!m_configured && m_ram_size > 0)
+ {
+ if (VERBOSE)
+ logerror("-> installing ram (%d bytes)\n", m_ram_size);
+
+ // install access to the ram space
+ if (address)
+ m_space->install_ram(address, address + (m_ram_size - 1), m_ram);
+
+ // prepare autoconfig for main device
+ autoconfig_board_size(BOARD_SIZE_64K);
+ autoconfig_product(0x03); // or 0x02 for rev 1
+ autoconfig_rom_vector(0x2000);
+ autoconfig_rom_vector_valid(true);
+ autoconfig_link_into_memory(false);
+ autoconfig_multi_device(false);
+
+ // first device configured
+ m_configured = true;
+ }
+ else
+ {
+ if (VERBOSE)
+ logerror("-> installing dmac\n");
+
+ // internal dmac registers
+ m_space->install_readwrite_handler(address, address + 0xff,
+ read16_delegate(FUNC(dmac_device::register_read), this),
+ write16_delegate(FUNC(dmac_device::register_write), this), 0xffff);
+
+ // install access to the rom space
+ if (m_rom)
+ {
+ m_space->install_rom(address + 0x2000, address + 0x7fff, m_rom + 0x2000);
+ m_space->install_rom(address + 0x8000, address + 0xffff, m_rom);
+ }
+
+ // stop responding to autoconfig
+ m_space->unmap_readwrite(0xe80000, 0xe8007f);
+
+ // we're done
+ m_cfgout_handler(0);
+ }
+}
+
+void dmac_device::check_interrupts()
+{
+ // interrupts enabled?
+ if (m_cntr & CNTR_INTEN)
+ {
+ // any interrupts pending?
+ if (m_istr & ISTR_INT_MASK)
+ m_istr |= ISTR_INT_P;
+ }
+ else
+ m_istr &= ~ISTR_INT_P;
+
+ // finally update interrupt line
+ m_int_handler((m_istr & ISTR_INT_P) ? 1 : 0);
+}
+
+void dmac_device::stop_dma()
+{
+ m_dma_active = false;
+ m_istr &= ~ISTR_E_INT;
+ check_interrupts();
+}
+
+void dmac_device::start_dma()
+{
+ m_dma_active = true;
+}
+
+
+//**************************************************************************
+// IMPLEMENTATION
+//**************************************************************************
+
+READ16_MEMBER( dmac_device::register_read )
+{
+ UINT16 data = 0xffff;
+
+ // autoconfig handles this
+ if (offset < 0x20)
+ return autoconfig_read(space, offset, mem_mask);
+
+ switch (offset)
+ {
+ case 0x20:
+ data = m_istr;
+
+ // reading clears fifo status (?)
+ m_istr &= ~0x0f;
+ check_interrupts();
+
+ if (VERBOSE)
+ logerror("%s('%s'): read istr %04x [mask = %04x]\n", shortname(), basetag(), data, mem_mask);
+
+ break;
+
+ case 0x21:
+ data = m_cntr;
+
+ if (VERBOSE)
+ logerror("%s('%s'): read cntr %04x [mask = %04x]\n", shortname(), basetag(), data, mem_mask);
+
+ break;
+
+ case 0x48:
+ case 0x49:
+ case 0x50:
+ case 0x58:
+ case 0x59:
+ case 0x5a:
+ case 0x5b:
+ case 0x5c:
+ case 0x5e:
+ case 0x5f:
+ data = m_scsi_read_handler(offset);
+
+ if (VERBOSE)
+ logerror("%s('%s'): read scsi data @ %02x %04x [mask = %04x]\n", shortname(), basetag(), offset, data, mem_mask);
+
+ break;
+
+ case 0x70:
+ if (VERBOSE)
+ logerror("%s('%s'): read dma start strobe %04x [mask = %04x]\n", shortname(), basetag(), data, mem_mask);
+
+ start_dma();
+ break;
+
+ case 0x71:
+ if (VERBOSE)
+ logerror("%s('%s'): read dma stop strobe %04x [mask = %04x]\n", shortname(), basetag(), data, mem_mask);
+
+ stop_dma();
+ break;
+
+ case 0x72:
+ if (VERBOSE)
+ logerror("%s('%s'): read clear irq strobe %04x [mask = %04x]\n", shortname(), basetag(), data, mem_mask);
+
+ // clear all interrupts
+ m_istr &= ~ISTR_INT_MASK;
+ check_interrupts();
+ break;
+
+ case 0x74:
+ if (VERBOSE)
+ logerror("%s('%s'): read flush fifo strobe %04x [mask = %04x]\n", shortname(), basetag(), data, mem_mask);
+
+ m_istr |= ISTR_FE_FLG;
+ break;
+
+ default:
+ if (VERBOSE)
+ logerror("%s('%s'): register_read %04x @ %02x [mask = %04x]\n", shortname(), basetag(), data, offset, mem_mask);
+ }
+
+ return data;
+}
+
+WRITE16_MEMBER( dmac_device::register_write )
+{
+ switch (offset)
+ {
+ case 0x21:
+ if (VERBOSE)
+ logerror("%s('%s'): write cntr %04x [mask = %04x]\n", shortname(), basetag(), data, mem_mask);
+
+ m_cntr = data;
+ check_interrupts();
+ break;
+
+ case 0x40:
+ if (VERBOSE)
+ logerror("%s('%s'): write wtc hi %04x [mask = %04x]\n", shortname(), basetag(), data, mem_mask);
+
+ m_wtc &= 0x0000ffff;
+ m_wtc |= ((UINT32) data) << 16;
+ break;
+
+ case 0x41:
+ if (VERBOSE)
+ logerror("%s('%s'): write wtc lo %04x [mask = %04x]\n", shortname(), basetag(), data, mem_mask);
+
+ m_wtc &= 0xffff0000;
+ m_wtc |= data;
+ break;
+
+ case 0x42:
+ if (VERBOSE)
+ logerror("%s('%s'): write acr hi %04x [mask = %04x]\n", shortname(), basetag(), data, mem_mask);
+
+ m_acr &= 0x0000ffff;
+ m_acr |= ((UINT32) data) << 16;
+ break;
+
+ case 0x43:
+ if (VERBOSE)
+ logerror("%s('%s'): write acr lo %04x [mask = %04x]\n", shortname(), basetag(), data, mem_mask);
+
+ m_acr &= 0xffff0000;
+ m_acr |= data;
+ break;
+
+ case 0x47:
+ if (VERBOSE)
+ logerror("%s('%s'): write dawr %04x [mask = %04x]\n", shortname(), basetag(), data, mem_mask);
+ break;
+
+ case 0x48:
+ case 0x49:
+ case 0x50:
+ case 0x58:
+ case 0x59:
+ case 0x5a:
+ case 0x5b:
+ case 0x5c:
+ case 0x5e:
+ case 0x5f:
+ if (VERBOSE)
+ logerror("%s('%s'): write scsi data @ %02x %04x [mask = %04x]\n", shortname(), basetag(), offset, data, mem_mask);
+
+ m_scsi_write_handler(offset, data, 0xff);
+ break;
+
+ case 0x70:
+ if (VERBOSE)
+ logerror("%s('%s'): write dma start strobe %04x [mask = %04x]\n", shortname(), basetag(), data, mem_mask);
+
+ start_dma();
+ break;
+
+ case 0x71:
+ if (VERBOSE)
+ logerror("%s('%s'): write dma stop strobe %04x [mask = %04x]\n", shortname(), basetag(), data, mem_mask);
+
+ stop_dma();
+ break;
+
+ case 0x72:
+ if (VERBOSE)
+ logerror("%s('%s'): write clear irq strobe %04x [mask = %04x]\n", shortname(), basetag(), data, mem_mask);
+
+ // clear all interrupts
+ m_istr &= ~ISTR_INT_MASK;
+ check_interrupts();
+ break;
+
+ case 0x74:
+ if (VERBOSE)
+ logerror("%s('%s'): write flush fifo strobe %04x [mask = %04x]\n", shortname(), basetag(), data, mem_mask);
+
+ m_istr |= ISTR_FE_FLG;
+ break;
+
+ default:
+ if (VERBOSE)
+ logerror("%s('%s'): write %04x @ %02x [mask = %04x]\n", shortname(), basetag(), data, offset, mem_mask);
+ }
+}
+
+// this signal tells us to expose our autoconfig values
+WRITE_LINE_MEMBER( dmac_device::configin_w )
+{
+ if (VERBOSE)
+ logerror("%s('%s'): configin_w (%d)\n", shortname(), basetag(), state);
+
+ if (state == 0 && !m_configured)
+ {
+ // common autoconfig values
+ autoconfig_board_type(BOARD_TYPE_ZORRO2);
+ autoconfig_manufacturer(0x0202);
+ autoconfig_serial(0x00000000);
+ autoconfig_8meg_preferred(false);
+ autoconfig_can_shutup(true);
+
+ // if we have ram, configure it first
+ if (m_ram_size > 0)
+ {
+ // product id 10
+ autoconfig_product(0x0a);
+
+ // board size
+ switch (m_ram_size)
+ {
+ case 0x080000: autoconfig_board_size(BOARD_SIZE_512K); break;
+ case 0x100000: autoconfig_board_size(BOARD_SIZE_1M); break;
+ case 0x200000: autoconfig_board_size(BOARD_SIZE_2M); break;
+ }
+
+ // no rom and link into free memory
+ autoconfig_rom_vector_valid(false);
+ autoconfig_link_into_memory(true);
+
+ // the main device follows
+ autoconfig_multi_device(true);
+ }
+ else
+ {
+ // just setup autoconfig for the main device
+ autoconfig_board_size(BOARD_SIZE_64K);
+ autoconfig_product(0x03); // or 0x02 for rev 1
+ autoconfig_rom_vector(0x2000);
+ autoconfig_rom_vector_valid(true);
+ autoconfig_link_into_memory(false);
+
+ // no more devices after this
+ autoconfig_multi_device(false);
+ }
+
+ // install autoconfig handler
+ m_space->install_readwrite_handler(0xe80000, 0xe8007f,
+ read16_delegate(FUNC(amiga_autoconfig::autoconfig_read), static_cast<amiga_autoconfig *>(this)),
+ write16_delegate(FUNC(amiga_autoconfig::autoconfig_write), static_cast<amiga_autoconfig *>(this)), 0xffff);
+ }
+}
+
+// this sets the ram size depending on the line voltage
+WRITE_LINE_MEMBER( dmac_device::ramsz_w )
+{
+ if (VERBOSE)
+ logerror("%s('%s'): ramsz_w (%d)\n", shortname(), basetag(), state);
+
+ switch (state)
+ {
+ case 0: m_ram_size = 0x000000; break;
+ case 1: m_ram_size = 0x080000; break;
+ case 2: m_ram_size = 0x100000; break;
+ case 3: m_ram_size = 0x200000; break;
+ }
+}
+
+// reset the device
+WRITE_LINE_MEMBER( dmac_device::rst_w )
+{
+ if (VERBOSE)
+ logerror("%s('%s'): rst_w (%d)\n", shortname(), basetag(), state);
+
+ if (m_rst == 1 && state == 0)
+ device_reset();
+
+ m_rst = state;
+}
+
+// external interrupt
+WRITE_LINE_MEMBER( dmac_device::intx_w )
+{
+ if (VERBOSE)
+ logerror("%s('%s'): intx_w (%d)\n", shortname(), basetag(), state);
+
+ if (state)
+ m_istr |= ISTR_INTS;
+ else
+ m_istr &= ~ISTR_INTS;
+
+ check_interrupts();
+}
+
+// data request
+WRITE_LINE_MEMBER( dmac_device::xdreq_w )
+{
+ if (VERBOSE)
+ logerror("%s('%s'): xdreq_w (%d)\n", shortname(), basetag(), state);
+
+ if (m_dma_active)
+ {
+
+ }
+}
diff --git a/src/emu/machine/dmac.h b/src/emu/machine/dmac.h
new file mode 100644
index 00000000000..ce3849d9ea5
--- /dev/null
+++ b/src/emu/machine/dmac.h
@@ -0,0 +1,173 @@
+/***************************************************************************
+
+ DMAC
+
+ license: MAME, GPL-2.0+
+ copyright-holders: Dirk Best
+
+ DMA controller used in Amiga systems
+
+***************************************************************************/
+
+#pragma once
+
+#ifndef __DMAC_H__
+#define __DMAC_H__
+
+#include "emu.h"
+#include "autoconfig.h"
+
+
+//**************************************************************************
+// INTERFACE CONFIGURATION MACROS
+//**************************************************************************
+
+#define MCFG_DMAC_ADD(_tag, _clock) \
+ MCFG_DEVICE_ADD(_tag, DMAC, _clock) \
+
+#define MCFG_DMAC_CFGOUT_HANDLER(_devcb) \
+ devcb = &dmac_device::set_cfgout_handler(*device, DEVCB2_##_devcb);
+
+#define MCFG_DMAC_INT_HANDLER(_devcb) \
+ devcb = &dmac_device::set_int_handler(*device, DEVCB2_##_devcb);
+
+#define MCFG_DMAC_XDACK_HANDLER(_devcb) \
+ devcb = &dmac_device::set_xdack_handler(*device, DEVCB2_##_devcb);
+
+#define MCFG_DMAC_SCSI_READ_HANDLER(_devcb) \
+ devcb = &dmac_device::set_scsi_read_handler(*device, DEVCB2_##_devcb);
+
+#define MCFG_DMAC_SCSI_WRITE_HANDLER(_devcb) \
+ devcb = &dmac_device::set_scsi_write_handler(*device, DEVCB2_##_devcb);
+
+#define MCFG_DMAC_IO_READ_HANDLER(_devcb) \
+ devcb = &dmac_device::set_io_read_handler(*device, DEVCB2_##_devcb);
+
+#define MCFG_DMAC_IO_WRITE_HANDLER(_devcb) \
+ devcb = &dmac_device::set_io_write_handler(*device, DEVCB2_##_devcb);
+
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> dmac_device
+
+class dmac_device : public device_t, public amiga_autoconfig
+{
+public:
+ // construction/destruction
+ dmac_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+ // callbacks
+ template<class _Object> static devcb2_base &set_cfgout_handler(device_t &device, _Object object)
+ { return downcast<dmac_device &>(device).m_cfgout_handler.set_callback(object); }
+
+ template<class _Object> static devcb2_base &set_int_handler(device_t &device, _Object object)
+ { return downcast<dmac_device &>(device).m_int_handler.set_callback(object); }
+
+ template<class _Object> static devcb2_base &set_xdack_handler(device_t &device, _Object object)
+ { return downcast<dmac_device &>(device).m_xdack_handler.set_callback(object); }
+
+ template<class _Object> static devcb2_base &set_scsi_read_handler(device_t &device, _Object object)
+ { return downcast<dmac_device &>(device).m_scsi_read_handler.set_callback(object); }
+
+ template<class _Object> static devcb2_base &set_scsi_write_handler(device_t &device, _Object object)
+ { return downcast<dmac_device &>(device).m_scsi_write_handler.set_callback(object); }
+
+ template<class _Object> static devcb2_base &set_io_read_handler(device_t &device, _Object object)
+ { return downcast<dmac_device &>(device).m_io_read_handler.set_callback(object); }
+
+ template<class _Object> static devcb2_base &set_io_write_handler(device_t &device, _Object object)
+ { return downcast<dmac_device &>(device).m_io_write_handler.set_callback(object); }
+
+ void set_address_space(address_space *space) { m_space = space; };
+ void set_rom(UINT8 *rom) { m_rom = rom; };
+ void set_ram(UINT8 *ram) { m_ram = ram; };
+
+ // input lines
+ DECLARE_WRITE_LINE_MEMBER( configin_w );
+ DECLARE_WRITE_LINE_MEMBER( ramsz_w );
+ DECLARE_WRITE_LINE_MEMBER( rst_w );
+ DECLARE_WRITE_LINE_MEMBER( intx_w );
+ DECLARE_WRITE_LINE_MEMBER( xdreq_w );
+
+ // dmac register access
+ DECLARE_READ16_MEMBER( register_read );
+ DECLARE_WRITE16_MEMBER( register_write );
+
+protected:
+ // device-level overrides
+ virtual void device_start();
+ virtual void device_reset();
+
+ // amiga_autoconfig overrides
+ virtual void autoconfig_base_address(offs_t address);
+
+private:
+
+ // control register flags
+ enum
+ {
+ CNTR_TCEN = 0x80, // terminal count enable
+ CNTR_PREST = 0x40, // peripheral reset
+ CNTR_PDMD = 0x20, // peripheral device mode select (1=scsi, 0=xt)
+ CNTR_INTEN = 0x10, // interrupt enable
+ CNTR_DDIR = 0x08 // device direction (1=rd host, wr to peripheral)
+ };
+
+ // interrupt status register
+ enum
+ {
+ ISTR_INTX = 0x100, // xt interrupt pending
+ ISTR_INT_F = 0x080, // interrupt follow
+ ISTR_INTS = 0x040, // scsi peripheral interrupt
+ ISTR_E_INT = 0x020, // end-of-process interrupt
+ ISTR_INT_P = 0x010, // interrupt pending
+ ISTR_UE_INT = 0x008, // under-run fifo error interrupt
+ ISTR_OE_INT = 0x004, // over-run fifo error interrupt
+ ISTR_FF_FLG = 0x002, // fifo-full flag
+ ISTR_FE_FLG = 0x001 // fifo-empty flag
+ };
+
+ static const int ISTR_INT_MASK = 0x1fc;
+
+ // callbacks
+ devcb2_write_line m_cfgout_handler;
+ devcb2_write_line m_int_handler;
+ devcb2_write_line m_xdack_handler;
+ devcb2_read8 m_scsi_read_handler;
+ devcb2_write8 m_scsi_write_handler;
+ devcb2_read8 m_io_read_handler;
+ devcb2_write8 m_io_write_handler;
+
+ address_space *m_space;
+ UINT8 *m_rom;
+ UINT8 *m_ram;
+ int m_ram_size;
+
+ // autoconfig state
+ bool m_configured;
+
+ // state of lines
+ int m_rst;
+
+ // register
+ UINT16 m_cntr; // control register
+ UINT16 m_istr; // interrupt status register
+ UINT32 m_wtc; // word transfer count
+ UINT32 m_acr; // address control register
+
+ bool m_dma_active;
+
+ void check_interrupts();
+ void start_dma();
+ void stop_dma();
+};
+
+
+// device type definition
+extern const device_type DMAC;
+
+
+#endif /* __DMAC_H__ */
diff --git a/src/emu/machine/machine.mak b/src/emu/machine/machine.mak
index 18897309000..de303b9dfa7 100644
--- a/src/emu/machine/machine.mak
+++ b/src/emu/machine/machine.mak
@@ -16,6 +16,46 @@ MACHINEOBJ = $(EMUOBJ)/machine
#-------------------------------------------------
#
+#@src/emu/machine/akiko.h,MACHINES += AKIKO
+#-------------------------------------------------
+
+ifneq ($(filter AKIKO,$(MACHINES)),)
+MACHINEOBJS += $(MACHINEOBJ)/akiko.o
+endif
+
+
+#-------------------------------------------------
+#
+#@src/emu/machine/autoconfig.h,MACHINES += AUTOCONFIG
+#-------------------------------------------------
+
+ifneq ($(filter AUTOCONFIG,$(MACHINES)),)
+MACHINEOBJS += $(MACHINEOBJ)/autoconfig.o
+endif
+
+
+#-------------------------------------------------
+#
+#@src/emu/machine/cr511b.h,MACHINES += CR511B
+#-------------------------------------------------
+
+ifneq ($(filter CR511B,$(MACHINES)),)
+MACHINEOBJS += $(MACHINEOBJ)/cr511b.o
+endif
+
+
+#-------------------------------------------------
+#
+#@src/emu/machine/dmac.h,MACHINES += DMAC
+#-------------------------------------------------
+
+ifneq ($(filter DMAC,$(MACHINES)),)
+MACHINEOBJS += $(MACHINEOBJ)/dmac.o
+endif
+
+
+#-------------------------------------------------
+#
#@src/emu/machine/40105.h,MACHINES += CMOS40105
#-------------------------------------------------
diff --git a/src/mame/audio/amiga.c b/src/emu/sound/amiga.c
index 22e5e0ef2a6..c4c9f045352 100644
--- a/src/mame/audio/amiga.c
+++ b/src/emu/sound/amiga.c
@@ -1,54 +1,40 @@
/***************************************************************************
- Amiga Computer / Arcadia Game System
-
- Driver by:
-
- Ernesto Corvi & Mariusz Wojcieszek
+ Amiga audio hardware
***************************************************************************/
-#include "emu.h"
+#include "amiga.h"
#include "includes/amiga.h"
-#include "cpu/m68000/m68000.h"
-/*************************************
- *
- * Debugging
- *
- *************************************/
+//**************************************************************************
+// CONSTANTS / MACROS
+//**************************************************************************
#define VERBOSE 0
#define LOG(x) do { if (VERBOSE) logerror x; } while (0)
-
-/*************************************
- *
- * Constants
- *
- *************************************/
-
-#define CLOCK_DIVIDER 16
-
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
const device_type AMIGA = &device_creator<amiga_sound_device>;
-amiga_sound_device::amiga_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
- : device_t(mconfig, AMIGA, "Amiga Paula", tag, owner, clock, "amiga_paula", __FILE__),
- device_sound_interface(mconfig, *this),
- m_stream(NULL)
-{
-}
+
+//*************************************************************************
+// LIVE DEVICE
+//**************************************************************************
//-------------------------------------------------
-// device_config_complete - perform any
-// operations now that the configuration is
-// complete
+// amiga_sound_device - constructor
//-------------------------------------------------
-void amiga_sound_device::device_config_complete()
+amiga_sound_device::amiga_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : device_t(mconfig, AMIGA, "Amiga Paula", tag, owner, clock, "amiga_paula", __FILE__),
+ device_sound_interface(mconfig, *this),
+ m_stream(NULL)
{
}
@@ -58,71 +44,66 @@ void amiga_sound_device::device_config_complete()
void amiga_sound_device::device_start()
{
- int i;
-
- for (i = 0; i < 4; i++)
+ // initialize channels
+ for (int i = 0; i < 4; i++)
{
m_channel[i].index = i;
m_channel[i].irq_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(amiga_sound_device::signal_irq), this));
- m_channel[i].curticks = 0;
- m_channel[i].latched = 0;
- m_channel[i].manualmode = 0;
- m_channel[i].curlocation = 0;
}
- /* create the stream */
+ // create the stream
m_stream = machine().sound().stream_alloc(*this, 0, 4, clock() / CLOCK_DIVIDER);
}
-/*************************************
- *
- * DMA reload/IRQ signalling
- *
- *************************************/
+//*************************************************************************
+// IMPLEMENTATION
+//**************************************************************************
+
+//-------------------------------------------------
+// signal_irq - irq signaling
+//-------------------------------------------------
TIMER_CALLBACK_MEMBER( amiga_sound_device::signal_irq )
{
amiga_state *state = machine().driver_data<amiga_state>();
- state->amiga_custom_w(*state->m_maincpu_program_space, REG_INTREQ, 0x8000 | (0x80 << param), 0xffff);
+
+ state->custom_chip_w(REG_INTREQ, INTENA_SETCLR | (0x80 << param));
}
+//-------------------------------------------------
+// dma_reload
+//-------------------------------------------------
-static void dma_reload(amiga_state *state, audio_channel *chan)
+void amiga_sound_device::dma_reload(audio_channel *chan)
{
+ amiga_state *state = machine().driver_data<amiga_state>();
+
chan->curlocation = CUSTOM_REG_LONG(REG_AUD0LCH + chan->index * 8);
chan->curlength = CUSTOM_REG(REG_AUD0LEN + chan->index * 8);
chan->irq_timer->adjust(attotime::from_hz(15750), chan->index);
+
LOG(("dma_reload(%d): offs=%05X len=%04X\n", chan->index, chan->curlocation, chan->curlength));
}
-
-
-/*************************************
- *
- * Manual mode data writer
- *
- *************************************/
+//-------------------------------------------------
+// data_w - manual mode data writer
+//-------------------------------------------------
void amiga_sound_device::data_w(int which, UINT16 data)
{
- m_channel[which].manualmode = TRUE;
+ m_channel[which].manualmode = true;
}
-
-
-/*************************************
- *
- * Stream updater
- *
- *************************************/
+//-------------------------------------------------
+// update - stream updater
+//-------------------------------------------------
void amiga_sound_device::update()
{
m_stream->update();
}
-
//-------------------------------------------------
// sound_stream_update - handle a stream update
//-------------------------------------------------
@@ -132,15 +113,15 @@ void amiga_sound_device::sound_stream_update(sound_stream &stream, stream_sample
amiga_state *state = machine().driver_data<amiga_state>();
int channum, sampoffs = 0;
- /* if all DMA off, disable all channels */
+ // if all DMA off, disable all channels
if (!(CUSTOM_REG(REG_DMACON) & 0x0200))
{
- m_channel[0].dmaenabled =
- m_channel[1].dmaenabled =
- m_channel[2].dmaenabled =
- m_channel[3].dmaenabled = FALSE;
+ m_channel[0].dma_enabled =
+ m_channel[1].dma_enabled =
+ m_channel[2].dma_enabled =
+ m_channel[3].dma_enabled = false;
- /* clear the sample data to 0 */
+ // clear the sample data to 0
for (channum = 0; channum < 4; channum++)
memset(outputs[channum], 0, sizeof(stream_sample_t) * samples);
return;
@@ -148,22 +129,22 @@ void amiga_sound_device::sound_stream_update(sound_stream &stream, stream_sample
samples *= CLOCK_DIVIDER;
- /* update the DMA states on each channel and reload if fresh */
+ // update the DMA states on each channel and reload if fresh
for (channum = 0; channum < 4; channum++)
{
audio_channel *chan = &m_channel[channum];
- if (!chan->dmaenabled && ((CUSTOM_REG(REG_DMACON) >> channum) & 1))
- dma_reload(state, chan);
- chan->dmaenabled = (CUSTOM_REG(REG_DMACON) >> channum) & 1;
+ if (!chan->dma_enabled && ((CUSTOM_REG(REG_DMACON) >> channum) & 1))
+ dma_reload(chan);
+ chan->dma_enabled = (CUSTOM_REG(REG_DMACON) >> channum) & 1;
}
- /* loop until done */
+ // loop until done
while (samples > 0)
{
int nextper, nextvol;
int ticks = samples;
- /* determine the number of ticks we can do in this chunk */
+ // determine the number of ticks we can do in this chunk
if (ticks > m_channel[0].curticks)
ticks = m_channel[0].curticks;
if (ticks > m_channel[1].curticks)
@@ -173,7 +154,7 @@ void amiga_sound_device::sound_stream_update(sound_stream &stream, stream_sample
if (ticks > m_channel[3].curticks)
ticks = m_channel[3].curticks;
- /* loop over channels */
+ // loop over channels
nextper = nextvol = -1;
for (channum = 0; channum < 4; channum++)
{
@@ -183,11 +164,11 @@ void amiga_sound_device::sound_stream_update(sound_stream &stream, stream_sample
stream_sample_t sample;
int i;
- /* normalize the volume value */
+ // normalize the volume value
volume = (volume & 0x40) ? 64 : (volume & 0x3f);
volume *= 4;
- /* are we modulating the period of the next channel? */
+ // are we modulating the period of the next channel?
if ((CUSTOM_REG(REG_ADKCON) >> channum) & 0x10)
{
nextper = CUSTOM_REG(REG_AUD0DAT + channum * 8);
@@ -195,7 +176,7 @@ void amiga_sound_device::sound_stream_update(sound_stream &stream, stream_sample
sample = 0;
}
- /* are we modulating the volume of the next channel? */
+ // are we modulating the volume of the next channel?
else if ((CUSTOM_REG(REG_ADKCON) >> channum) & 0x01)
{
nextper = -1;
@@ -203,56 +184,56 @@ void amiga_sound_device::sound_stream_update(sound_stream &stream, stream_sample
sample = 0;
}
- /* otherwise, we are generating data */
+ // otherwise, we are generating data
else
{
nextper = nextvol = -1;
sample = chan->latched * volume;
}
- /* fill the buffer with the sample */
+ // fill the buffer with the sample
for (i = 0; i < ticks; i += CLOCK_DIVIDER)
outputs[channum][(sampoffs + i) / CLOCK_DIVIDER] = sample;
- /* account for the ticks; if we hit 0, advance */
+ // account for the ticks; if we hit 0, advance
chan->curticks -= ticks;
if (chan->curticks == 0)
{
- /* reset the clock and ensure we're above the minimum ticks */
+ // reset the clock and ensure we're above the minimum ticks
chan->curticks = period;
if (chan->curticks < 124)
chan->curticks = 124;
- /* move forward one byte; if we move to an even byte, fetch new */
- if (chan->dmaenabled || chan->manualmode)
+ // move forward one byte; if we move to an even byte, fetch new
+ if (chan->dma_enabled || chan->manualmode)
chan->curlocation++;
- if (chan->dmaenabled && !(chan->curlocation & 1))
+ if (chan->dma_enabled && !(chan->curlocation & 1))
{
CUSTOM_REG(REG_AUD0DAT + channum * 8) = (*state->m_chip_ram_r)(state, chan->curlocation);
if (chan->curlength != 0)
chan->curlength--;
- /* if we run out of data, reload the dma */
+ // if we run out of data, reload the dma
if (chan->curlength == 0)
- dma_reload(state, chan);
+ dma_reload(chan);
}
- /* latch the next byte of the sample */
+ // latch the next byte of the sample
if (!(chan->curlocation & 1))
chan->latched = CUSTOM_REG(REG_AUD0DAT + channum * 8) >> 8;
else
chan->latched = CUSTOM_REG(REG_AUD0DAT + channum * 8) >> 0;
- /* if we're in manual mode, signal an interrupt once we latch the low byte */
- if (!chan->dmaenabled && chan->manualmode && (chan->curlocation & 1))
+ // if we're in manual mode, signal an interrupt once we latch the low byte
+ if (!chan->dma_enabled && chan->manualmode && (chan->curlocation & 1))
{
signal_irq(NULL, channum);
- chan->manualmode = FALSE;
+ chan->manualmode = false;
}
}
}
- /* bump ourselves forward by the number of ticks */
+ // bump ourselves forward by the number of ticks
sampoffs += ticks;
samples -= ticks;
}
diff --git a/src/emu/sound/amiga.h b/src/emu/sound/amiga.h
new file mode 100644
index 00000000000..56e092b248f
--- /dev/null
+++ b/src/emu/sound/amiga.h
@@ -0,0 +1,63 @@
+/***************************************************************************
+
+ Amiga audio hardware
+
+***************************************************************************/
+
+#pragma once
+
+#ifndef __SOUND_AMIGA_H__
+#define __SOUND_AMIGA_H__
+
+#include "emu.h"
+
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> amiga_sound_device
+
+class amiga_sound_device : public device_t, public device_sound_interface
+{
+public:
+ amiga_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+ ~amiga_sound_device() {}
+
+ void update();
+ void data_w(int which, UINT16 data);
+
+protected:
+ // device-level overrides
+ virtual void device_start();
+
+ // sound stream update overrides
+ virtual void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples);
+
+private:
+ static const int CLOCK_DIVIDER = 16;
+
+ struct audio_channel
+ {
+ emu_timer *irq_timer;
+ UINT32 curlocation;
+ UINT16 curlength;
+ UINT16 curticks;
+ UINT8 index;
+ bool dma_enabled;
+ bool manualmode;
+ INT8 latched;
+ };
+
+ void dma_reload(audio_channel *chan);
+
+ // internal state
+ audio_channel m_channel[4];
+ sound_stream *m_stream;
+
+ TIMER_CALLBACK_MEMBER( signal_irq );
+};
+
+extern const device_type AMIGA;
+
+#endif // __SOUND_AMIGA_H__
diff --git a/src/emu/sound/sound.mak b/src/emu/sound/sound.mak
index 070534c8e09..6a6a0cf0d0d 100644
--- a/src/emu/sound/sound.mak
+++ b/src/emu/sound/sound.mak
@@ -101,6 +101,17 @@ endif
#-------------------------------------------------
+# Amiga audio hardware
+#@src/emu/sound/amiga.h,SOUNDS += AMIGA
+#-------------------------------------------------
+
+ifneq ($(filter AMIGA,$(SOUNDS)),)
+SOUNDOBJS += $(SOUNDOBJ)/amiga.o
+endif
+
+
+
+#-------------------------------------------------
# Bally Astrocade sound system
#@src/emu/sound/astrocde.h,SOUNDS += ASTROCADE
#-------------------------------------------------
diff --git a/src/mame/drivers/alg.c b/src/mame/drivers/alg.c
index 7658aa321ce..c8a0d0e4f93 100644
--- a/src/mame/drivers/alg.c
+++ b/src/mame/drivers/alg.c
@@ -39,30 +39,36 @@ public:
: amiga_state(mconfig, type, tag),
m_laserdisc(*this, "laserdisc") { }
-
- required_device<sony_ldp1450_device> m_laserdisc;
- emu_timer *m_serial_timer;
- UINT8 m_serial_timer_active;
- UINT16 m_input_select;
DECLARE_CUSTOM_INPUT_MEMBER(lightgun_pos_r);
DECLARE_CUSTOM_INPUT_MEMBER(lightgun_trigger_r);
DECLARE_CUSTOM_INPUT_MEMBER(lightgun_holster_r);
- DECLARE_WRITE8_MEMBER(alg_cia_0_porta_w);
- DECLARE_READ8_MEMBER(alg_cia_0_porta_r);
- DECLARE_READ8_MEMBER(alg_cia_0_portb_r);
- DECLARE_WRITE8_MEMBER(alg_cia_0_portb_w);
- DECLARE_READ8_MEMBER(alg_cia_1_porta_r);
- DECLARE_WRITE8_MEMBER(alg_cia_1_porta_w);
+
DECLARE_DRIVER_INIT(aplatoon);
DECLARE_DRIVER_INIT(palr3);
DECLARE_DRIVER_INIT(palr1);
- DECLARE_DRIVER_INIT(none);
DECLARE_DRIVER_INIT(palr6);
- DECLARE_MACHINE_START(alg);
- DECLARE_MACHINE_RESET(alg);
+ DECLARE_DRIVER_INIT(ntsc);
+ DECLARE_DRIVER_INIT(pal);
+
DECLARE_VIDEO_START(alg);
TIMER_CALLBACK_MEMBER(response_timer);
- void alg_init();
+
+protected:
+ // driver_device overrides
+ virtual void machine_start();
+
+ // amiga_state overrides
+ virtual void vblank();
+ virtual void serdat_w(UINT16 data);
+ virtual void potgo_w(UINT16 data);
+
+private:
+ required_device<sony_ldp1450_device> m_laserdisc;
+
+ emu_timer *m_serial_timer;
+ UINT8 m_serial_timer_active;
+
+ UINT16 m_input_select;
};
@@ -116,21 +122,15 @@ VIDEO_START_MEMBER(alg_state,alg)
*
*************************************/
-MACHINE_START_MEMBER(alg_state,alg)
+void alg_state::machine_start()
{
- MACHINE_START_CALL_MEMBER(amiga);
+ amiga_state::machine_start();
m_serial_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(alg_state::response_timer),this));
m_serial_timer_active = FALSE;
}
-MACHINE_RESET_MEMBER(alg_state,alg)
-{
- MACHINE_RESET_CALL_MEMBER(amiga);
-}
-
-
/*************************************
*
@@ -146,42 +146,40 @@ TIMER_CALLBACK_MEMBER(alg_state::response_timer)
UINT8 data = m_laserdisc->data_r();
if (data != 0x0a)
osd_printf_debug("Sending serial data = %02X\n", data);
- amiga_serial_in_w(machine(), data);
+ serial_in_w(data);
}
/* if there's more to come, set another timer */
if (m_laserdisc->data_available_r() == ASSERT_LINE)
- m_serial_timer->adjust(amiga_get_serial_char_period(machine()));
+ m_serial_timer->adjust(serial_char_period());
else
m_serial_timer_active = FALSE;
}
-static void vsync_callback(running_machine &machine)
+void alg_state::vblank()
{
- alg_state *state = machine.driver_data<alg_state>();
+ amiga_state::vblank();
/* if we have data available, set a timer to read it */
- if (!state->m_serial_timer_active && state->m_laserdisc->data_available_r() == ASSERT_LINE)
+ if (!m_serial_timer_active && m_laserdisc->data_available_r() == ASSERT_LINE)
{
- state->m_serial_timer->adjust(amiga_get_serial_char_period(machine));
- state->m_serial_timer_active = TRUE;
+ m_serial_timer->adjust(serial_char_period());
+ m_serial_timer_active = TRUE;
}
}
-static void serial_w(running_machine &machine, UINT16 data)
+void alg_state::serdat_w(UINT16 data)
{
- alg_state *state = machine.driver_data<alg_state>();
-
/* write to the laserdisc player */
- state->m_laserdisc->data_w(data & 0xff);
+ m_laserdisc->data_w(data & 0xff);
/* if we have data available, set a timer to read it */
- if (!state->m_serial_timer_active && state->m_laserdisc->data_available_r() == ASSERT_LINE)
+ if (!m_serial_timer_active && m_laserdisc->data_available_r() == ASSERT_LINE)
{
- state->m_serial_timer->adjust(amiga_get_serial_char_period(machine));
- state->m_serial_timer_active = TRUE;
+ m_serial_timer->adjust(serial_char_period());
+ m_serial_timer_active = TRUE;
}
}
@@ -193,13 +191,11 @@ static void serial_w(running_machine &machine, UINT16 data)
*
*************************************/
-static void alg_potgo_w(running_machine &machine, UINT16 data)
+void alg_state::potgo_w(UINT16 data)
{
- alg_state *state = machine.driver_data<alg_state>();
-
/* bit 15 controls whether pin 9 is input/output */
/* bit 14 controls the value, which selects which player's controls to read */
- state->m_input_select = (data & 0x8000) ? ((data >> 14) & 1) : 0;
+ m_input_select = (data & 0x8000) ? ((data >> 14) & 1) : 0;
}
@@ -228,61 +224,6 @@ CUSTOM_INPUT_MEMBER(alg_state::lightgun_holster_r)
-/*************************************
- *
- * CIA port accesses
- *
- *************************************/
-
-WRITE8_MEMBER(alg_state::alg_cia_0_porta_w)
-{
- /* switch banks as appropriate */
- m_bank1->set_entry(data & 1);
-
- /* swap the write handlers between ROM and bank 1 based on the bit */
- if ((data & 1) == 0)
- /* overlay disabled, map RAM on 0x000000 */
- space.install_write_bank(0x000000, 0x07ffff, "bank1");
-
- else
- /* overlay enabled, map Amiga system ROM on 0x000000 */
- space.unmap_write(0x000000, 0x07ffff);
-}
-
-
-READ8_MEMBER(alg_state::alg_cia_0_porta_r)
-{
- return ioport("FIRE")->read() | 0x3f;
-}
-
-
-READ8_MEMBER(alg_state::alg_cia_0_portb_r)
-{
- logerror("%s:alg_cia_0_portb_r\n", machine().describe_context());
- return 0xff;
-}
-
-
-WRITE8_MEMBER(alg_state::alg_cia_0_portb_w)
-{
- /* parallel port */
- logerror("%s:alg_cia_0_portb_w(%02x)\n", machine().describe_context(), data);
-}
-
-
-READ8_MEMBER(alg_state::alg_cia_1_porta_r)
-{
- logerror("%s:alg_cia_1_porta_r\n", machine().describe_context());
- return 0xff;
-}
-
-
-WRITE8_MEMBER(alg_state::alg_cia_1_porta_w)
-{
- logerror("%s:alg_cia_1_porta_w(%02x)\n", machine().describe_context(), data);
-}
-
-
/*************************************
*
@@ -290,40 +231,39 @@ WRITE8_MEMBER(alg_state::alg_cia_1_porta_w)
*
*************************************/
-static ADDRESS_MAP_START( main_map_r1, AS_PROGRAM, 16, alg_state )
+static ADDRESS_MAP_START( overlay_512kb_map, AS_PROGRAM, 16, alg_state )
ADDRESS_MAP_UNMAP_HIGH
- AM_RANGE(0x000000, 0x07ffff) AM_RAMBANK("bank1") AM_SHARE("chip_ram")
- AM_RANGE(0xbfd000, 0xbfefff) AM_READWRITE(amiga_cia_r, amiga_cia_w)
- AM_RANGE(0xc00000, 0xdfffff) AM_READWRITE(amiga_custom_r, amiga_custom_w) AM_SHARE("custom_regs")
- AM_RANGE(0xe80000, 0xe8ffff) AM_READWRITE(amiga_autoconfig_r, amiga_autoconfig_w)
- AM_RANGE(0xfc0000, 0xffffff) AM_ROM AM_REGION("user1", 0) /* System ROM */
+ AM_RANGE(0x000000, 0x07ffff) AM_MIRROR(0x180000) AM_RAM AM_SHARE("chip_ram")
+ AM_RANGE(0x200000, 0x27ffff) AM_ROM AM_REGION("kickstart", 0)
+ADDRESS_MAP_END
+static ADDRESS_MAP_START( a500_mem, AS_PROGRAM, 16, alg_state )
+ ADDRESS_MAP_UNMAP_HIGH
+ AM_RANGE(0x000000, 0x1fffff) AM_DEVICE("overlay", address_map_bank_device, amap16)
+ AM_RANGE(0xa00000, 0xbfffff) AM_READWRITE(cia_r, cia_w)
+ AM_RANGE(0xc00000, 0xd7ffff) AM_READWRITE(custom_chip_r, custom_chip_w)
+ AM_RANGE(0xd80000, 0xddffff) AM_NOP
+ AM_RANGE(0xde0000, 0xdeffff) AM_READWRITE(custom_chip_r, custom_chip_w)
+ AM_RANGE(0xdf0000, 0xdfffff) AM_READWRITE(custom_chip_r, custom_chip_w) AM_SHARE("custom_regs")
+ AM_RANGE(0xe00000, 0xe7ffff) AM_WRITENOP AM_READ(rom_mirror_r)
+ AM_RANGE(0xe80000, 0xefffff) AM_NOP // autoconfig space (installed by devices)
+ AM_RANGE(0xf80000, 0xffffff) AM_ROM AM_REGION("kickstart", 0)
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( main_map_r1, AS_PROGRAM, 16, alg_state )
+ AM_IMPORT_FROM(a500_mem)
AM_RANGE(0xf00000, 0xf1ffff) AM_ROM AM_REGION("user2", 0) /* Custom ROM */
AM_RANGE(0xf54000, 0xf55fff) AM_RAM AM_SHARE("nvram")
ADDRESS_MAP_END
-
static ADDRESS_MAP_START( main_map_r2, AS_PROGRAM, 16, alg_state )
- ADDRESS_MAP_UNMAP_HIGH
- AM_RANGE(0x000000, 0x07ffff) AM_RAMBANK("bank1") AM_SHARE("chip_ram")
- AM_RANGE(0xbfd000, 0xbfefff) AM_READWRITE(amiga_cia_r, amiga_cia_w)
- AM_RANGE(0xc00000, 0xdfffff) AM_READWRITE(amiga_custom_r, amiga_custom_w) AM_SHARE("custom_regs")
- AM_RANGE(0xe80000, 0xe8ffff) AM_READWRITE(amiga_autoconfig_r, amiga_autoconfig_w)
- AM_RANGE(0xfc0000, 0xffffff) AM_ROM AM_REGION("user1", 0) /* System ROM */
-
+ AM_IMPORT_FROM(a500_mem)
AM_RANGE(0xf00000, 0xf3ffff) AM_ROM AM_REGION("user2", 0) /* Custom ROM */
AM_RANGE(0xf7c000, 0xf7dfff) AM_RAM AM_SHARE("nvram")
ADDRESS_MAP_END
-
static ADDRESS_MAP_START( main_map_picmatic, AS_PROGRAM, 16, alg_state )
- ADDRESS_MAP_UNMAP_HIGH
- AM_RANGE(0x000000, 0x07ffff) AM_RAMBANK("bank1") AM_SHARE("chip_ram")
- AM_RANGE(0xbfd000, 0xbfefff) AM_READWRITE(amiga_cia_r, amiga_cia_w)
- AM_RANGE(0xc00000, 0xdfffff) AM_READWRITE(amiga_custom_r, amiga_custom_w) AM_SHARE("custom_regs")
- AM_RANGE(0xe80000, 0xe8ffff) AM_READWRITE(amiga_autoconfig_r, amiga_autoconfig_w)
- AM_RANGE(0xfc0000, 0xffffff) AM_ROM AM_REGION("user1", 0) /* System ROM */
-
+ AM_IMPORT_FROM(a500_mem)
AM_RANGE(0xf00000, 0xf1ffff) AM_ROM AM_REGION("user2", 0) /* Custom ROM */
AM_RANGE(0xf40000, 0xf41fff) AM_RAM AM_SHARE("nvram")
ADDRESS_MAP_END
@@ -337,15 +277,15 @@ ADDRESS_MAP_END
*************************************/
static INPUT_PORTS_START( alg )
- PORT_START("JOY0DAT") /* read by Amiga core */
+ PORT_START("joy_0_dat") /* read by Amiga core */
PORT_BIT( 0x0303, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, alg_state,amiga_joystick_convert, 0)
PORT_BIT( 0xfcfc, IP_ACTIVE_HIGH, IPT_UNKNOWN )
- PORT_START("JOY1DAT") /* read by Amiga core */
+ PORT_START("joy_1_dat") /* read by Amiga core */
PORT_BIT( 0x0303, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, alg_state,amiga_joystick_convert, 1)
PORT_BIT( 0xfcfc, IP_ACTIVE_HIGH, IPT_UNKNOWN )
- PORT_START("POTGO") /* read by Amiga core */
+ PORT_START("potgo") /* read by Amiga core */
PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1)
@@ -359,13 +299,13 @@ static INPUT_PORTS_START( alg )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1)
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
- PORT_START("P1JOY") /* referenced by JOY0DAT */
+ PORT_START("p1_joy") /* referenced by JOY0DAT */
PORT_SERVICE_NO_TOGGLE( 0x01, IP_ACTIVE_HIGH )
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START1 )
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_COIN1 )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_COIN2 )
- PORT_START("P2JOY") /* referenced by JOY1DAT */
+ PORT_START("p2_joy") /* referenced by JOY1DAT */
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(1)
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED )
@@ -382,14 +322,14 @@ INPUT_PORTS_END
static INPUT_PORTS_START( alg_2p )
PORT_INCLUDE(alg)
- PORT_MODIFY("POTGO")
+ PORT_MODIFY("potgo")
PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_START2 )
PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, alg_state,lightgun_trigger_r, NULL)
PORT_MODIFY("FIRE")
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED )
- PORT_MODIFY("P2JOY")
+ PORT_MODIFY("p2_joy")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, alg_state,lightgun_holster_r, NULL)
PORT_START("GUN2X") /* referenced by lightgun_pos_r */
@@ -416,11 +356,16 @@ INPUT_PORTS_END
static MACHINE_CONFIG_START( alg_r1, alg_state )
/* basic machine hardware */
- MCFG_CPU_ADD("maincpu", M68000, AMIGA_68000_NTSC_CLOCK)
+ MCFG_CPU_ADD("maincpu", M68000, amiga_state::CLK_7M_NTSC)
MCFG_CPU_PROGRAM_MAP(main_map_r1)
- MCFG_MACHINE_START_OVERRIDE(alg_state,alg)
- MCFG_MACHINE_RESET_OVERRIDE(alg_state,alg)
+ MCFG_DEVICE_ADD("overlay", ADDRESS_MAP_BANK, 0)
+ MCFG_DEVICE_PROGRAM_MAP(overlay_512kb_map)
+ MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_BIG)
+ MCFG_ADDRESS_MAP_BANK_DATABUS_WIDTH(16)
+ MCFG_ADDRESS_MAP_BANK_ADDRBUS_WIDTH(22)
+ MCFG_ADDRESS_MAP_BANK_STRIDE(0x200000)
+
MCFG_NVRAM_ADD_0FILL("nvram")
MCFG_LASERDISC_LDP1450_ADD("laserdisc")
@@ -442,7 +387,7 @@ static MACHINE_CONFIG_START( alg_r1, alg_state )
/* sound hardware */
MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
- MCFG_SOUND_ADD("amiga", AMIGA, 3579545)
+ MCFG_SOUND_ADD("amiga", AMIGA, amiga_state::CLK_C1_NTSC)
MCFG_SOUND_ROUTE(0, "lspeaker", 0.25)
MCFG_SOUND_ROUTE(1, "rspeaker", 0.25)
MCFG_SOUND_ROUTE(2, "rspeaker", 0.25)
@@ -453,19 +398,15 @@ static MACHINE_CONFIG_START( alg_r1, alg_state )
MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
/* cia */
- MCFG_DEVICE_ADD("cia_0", LEGACY_MOS8520, AMIGA_68000_NTSC_CLOCK / 10)
- MCFG_MOS6526_IRQ_CALLBACK(WRITELINE(amiga_state, amiga_cia_0_irq))
- MCFG_MOS6526_PA_INPUT_CALLBACK(READ8(alg_state,alg_cia_0_porta_r))
- MCFG_MOS6526_PA_OUTPUT_CALLBACK(WRITE8(alg_state,alg_cia_0_porta_w))
- MCFG_MOS6526_PB_INPUT_CALLBACK(READ8(alg_state,alg_cia_0_portb_r))
- MCFG_MOS6526_PB_OUTPUT_CALLBACK(WRITE8(alg_state,alg_cia_0_portb_w))
- MCFG_DEVICE_ADD("cia_1", LEGACY_MOS8520, AMIGA_68000_NTSC_CLOCK / 10)
- MCFG_MOS6526_IRQ_CALLBACK(WRITELINE(amiga_state, amiga_cia_1_irq))
- MCFG_MOS6526_PA_INPUT_CALLBACK(READ8(alg_state,alg_cia_1_porta_r))
- MCFG_MOS6526_PA_OUTPUT_CALLBACK(WRITE8(alg_state,alg_cia_1_porta_w))
+ MCFG_DEVICE_ADD("cia_0", LEGACY_MOS8520, amiga_state::CLK_E_NTSC)
+ MCFG_MOS6526_IRQ_CALLBACK(WRITELINE(amiga_state, cia_0_irq))
+ MCFG_MOS6526_PA_INPUT_CALLBACK(IOPORT("FIRE"))
+ MCFG_MOS6526_PA_OUTPUT_CALLBACK(WRITE8(amiga_state, cia_0_port_a_write))
+ MCFG_DEVICE_ADD("cia_1", LEGACY_MOS8520, amiga_state::CLK_E_NTSC)
+ MCFG_MOS6526_IRQ_CALLBACK(WRITELINE(amiga_state, cia_1_irq))
/* fdc */
- MCFG_DEVICE_ADD("fdc", AMIGA_FDC, AMIGA_68000_NTSC_CLOCK)
+ MCFG_DEVICE_ADD("fdc", AMIGA_FDC, amiga_state::CLK_7M_NTSC)
MCFG_AMIGA_FDC_INDEX_CALLBACK(DEVWRITELINE("cia_1", legacy_mos6526_device, flag_w))
MACHINE_CONFIG_END
@@ -480,13 +421,22 @@ MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( picmatic, alg_r1 )
/* adjust for PAL specs */
- MCFG_CPU_REPLACE("maincpu", M68000, AMIGA_68000_PAL_CLOCK)
+ MCFG_CPU_REPLACE("maincpu", M68000, amiga_state::CLK_7M_PAL)
MCFG_CPU_PROGRAM_MAP(main_map_picmatic)
MCFG_SCREEN_MODIFY("screen")
MCFG_SCREEN_REFRESH_RATE(50)
MCFG_SCREEN_SIZE(512*2, 312)
MCFG_SCREEN_VISIBLE_AREA((129-8)*2, (449+8-1)*2, 44-8, 300+8-1)
+
+ MCFG_DEVICE_MODIFY("amiga")
+ MCFG_DEVICE_CLOCK(amiga_state::CLK_C1_PAL)
+ MCFG_DEVICE_MODIFY("cia_0")
+ MCFG_DEVICE_CLOCK(amiga_state::CLK_E_PAL)
+ MCFG_DEVICE_MODIFY("cia_1")
+ MCFG_DEVICE_CLOCK(amiga_state::CLK_E_PAL)
+ MCFG_DEVICE_MODIFY("fdc")
+ MCFG_DEVICE_CLOCK(amiga_state::CLK_7M_PAL)
MACHINE_CONFIG_END
@@ -497,13 +447,11 @@ MACHINE_CONFIG_END
*
*************************************/
-#define ROM_LOAD16_WORD_BIOS(bios,name,offset,length,hash) ROMX_LOAD(name, offset, length, hash, ROM_BIOS(bios+1))
-
#define ALG_BIOS \
- ROM_REGION16_BE( 0x80000, "user1", 0 ) \
- ROM_SYSTEM_BIOS( 0, "Kick1.3", "Kickstart 1.3") \
- ROM_LOAD16_WORD_BIOS(0, "kick13.rom", 0x000000, 0x40000, CRC(c4f0f55f) SHA1(891e9a547772fe0c6c19b610baf8bc4ea7fcb785)) \
- ROM_COPY( "user1", 0x000000, 0x040000, 0x040000 )
+ ROM_REGION16_BE(0x80000, "kickstart", 0) \
+ ROM_SYSTEM_BIOS(0, "kick13", "Kickstart 1.3 (34.5)") \
+ ROMX_LOAD("315093-02.u2", 0x00000, 0x40000, CRC(c4f0f55f) SHA1(891e9a547772fe0c6c19b610baf8bc4ea7fcb785), ROM_GROUPWORD | ROM_BIOS(1)) \
+ ROM_COPY("kickstart", 0x000000, 0x040000, 0x040000)
@@ -672,42 +620,29 @@ ROM_END
+
/*************************************
*
- * Generic driver init
+ * Per-game decryption
*
*************************************/
-void alg_state::alg_init()
+DRIVER_INIT_MEMBER( alg_state, ntsc )
{
- static const amiga_machine_interface alg_intf =
- {
- ANGUS_CHIP_RAM_MASK,
- NULL, NULL, alg_potgo_w,
- serial_w,
-
- vsync_callback,
- NULL,
- NULL,
- 0
- };
- amiga_machine_config(machine(), &alg_intf);
-
- /* set up memory */
- m_bank1->configure_entry(0, m_chip_ram);
- m_bank1->configure_entry(1, memregion("user1")->base());
+ m_agnus_id = AGNUS_HR_NTSC;
+ m_denise_id = DENISE;
}
-
-
-/*************************************
- *
- * Per-game decryption
- *
- *************************************/
+DRIVER_INIT_MEMBER( alg_state, pal )
+{
+ m_agnus_id = AGNUS_HR_PAL;
+ m_denise_id = DENISE;
+}
DRIVER_INIT_MEMBER(alg_state,palr1)
{
+ DRIVER_INIT_CALL(ntsc);
+
UINT32 length = memregion("user2")->bytes();
UINT8 *rom = memregion("user2")->base();
dynamic_buffer original(length);
@@ -721,12 +656,12 @@ DRIVER_INIT_MEMBER(alg_state,palr1)
if (srcaddr & 0x8000) dstaddr ^= 0x4000;
rom[dstaddr] = original[srcaddr];
}
-
- alg_init();
}
DRIVER_INIT_MEMBER(alg_state,palr3)
{
+ DRIVER_INIT_CALL(ntsc);
+
UINT32 length = memregion("user2")->bytes();
UINT8 *rom = memregion("user2")->base();
dynamic_buffer original(length);
@@ -739,12 +674,12 @@ DRIVER_INIT_MEMBER(alg_state,palr3)
if (srcaddr & 0x2000) dstaddr ^= 0x1000;
rom[dstaddr] = original[srcaddr];
}
-
- alg_init();
}
DRIVER_INIT_MEMBER(alg_state,palr6)
{
+ DRIVER_INIT_CALL(ntsc);
+
UINT32 length = memregion("user2")->bytes();
UINT8 *rom = memregion("user2")->base();
dynamic_buffer original(length);
@@ -759,12 +694,12 @@ DRIVER_INIT_MEMBER(alg_state,palr6)
dstaddr ^= 0x20000;
rom[dstaddr] = original[srcaddr];
}
-
- alg_init();
}
DRIVER_INIT_MEMBER(alg_state,aplatoon)
{
+ DRIVER_INIT_CALL(ntsc);
+
/* NOT DONE TODO FIGURE OUT THE RIGHT ORDER!!!! */
UINT8 *rom = memregion("user2")->base();
UINT8 *decrypted = auto_alloc_array(machine(), UINT8, 0x40000);
@@ -780,13 +715,8 @@ DRIVER_INIT_MEMBER(alg_state,aplatoon)
memcpy(decrypted + i * 0x1000, rom + shuffle[i] * 0x1000, 0x1000);
memcpy(rom, decrypted, 0x40000);
logerror("decrypt done\n ");
- alg_init();
}
-DRIVER_INIT_MEMBER(alg_state,none)
-{
- alg_init();
-}
@@ -797,7 +727,7 @@ DRIVER_INIT_MEMBER(alg_state,none)
*************************************/
/* BIOS */
-GAME( 199?, alg_bios, 0, alg_r1, alg, alg_state, none, ROT0, "American Laser Games", "American Laser Games BIOS", GAME_IS_BIOS_ROOT )
+GAME( 199?, alg_bios, 0, alg_r1, alg, alg_state, ntsc, ROT0, "American Laser Games", "American Laser Games BIOS", GAME_IS_BIOS_ROOT )
/* Rev. A board */
/* PAL R1 */
@@ -829,4 +759,4 @@ GAME( 1995, fastdraw, alg_bios, alg_r2, alg_2p, alg_state, palr6, ROT90, "A
GAME( 199?, aplatoon, alg_bios, alg_r2, alg, alg_state, aplatoon, ROT0, "Nova?", "Platoon V.?.? US", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_IMPERFECT_GRAPHICS )
/* Web Picmatic games PAL tv standard, own rom board */
-GAME( 1993, zortonbr, alg_bios, picmatic, alg, alg_state, none, ROT0, "Web Picmatic", "Zorton Brothers (Los Justicieros)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_IMPERFECT_GRAPHICS )
+GAME( 1993, zortonbr, alg_bios, picmatic, alg, alg_state, pal, ROT0, "Web Picmatic", "Zorton Brothers (Los Justicieros)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_IMPERFECT_GRAPHICS )
diff --git a/src/mame/drivers/arcadia.c b/src/mame/drivers/arcadia.c
index 381aa09d2d3..1f22b2fa1f8 100644
--- a/src/mame/drivers/arcadia.c
+++ b/src/mame/drivers/arcadia.c
@@ -63,17 +63,18 @@ public:
arcadia_amiga_state(const machine_config &mconfig, device_type type, const char *tag)
: amiga_state(mconfig, type, tag) { }
- UINT8 coin_counter[2];
+ UINT8 m_coin_counter[2];
+
DECLARE_WRITE16_MEMBER(arcadia_multibios_change_game);
DECLARE_CUSTOM_INPUT_MEMBER(coin_counter_r);
DECLARE_INPUT_CHANGED_MEMBER(coin_changed_callback);
- DECLARE_WRITE8_MEMBER(arcadia_cia_0_porta_w);
DECLARE_WRITE8_MEMBER(arcadia_cia_0_portb_w);
+
+ DECLARE_DRIVER_INIT(arcadia);
DECLARE_DRIVER_INIT(xeon);
DECLARE_DRIVER_INIT(sdwr);
DECLARE_DRIVER_INIT(dart);
DECLARE_DRIVER_INIT(bowl);
- DECLARE_DRIVER_INIT(none);
DECLARE_DRIVER_INIT(sprg);
DECLARE_DRIVER_INIT(rdwr);
DECLARE_DRIVER_INIT(ninj);
@@ -84,8 +85,11 @@ public:
DECLARE_DRIVER_INIT(pm);
DECLARE_DRIVER_INIT(dlta);
DECLARE_DRIVER_INIT(argh);
- void arcadia_init();
+
inline void generic_decode(const char *tag, int bit7, int bit6, int bit5, int bit4, int bit3, int bit2, int bit1, int bit0);
+
+protected:
+ virtual void machine_reset();
};
@@ -106,40 +110,6 @@ WRITE16_MEMBER(arcadia_amiga_state::arcadia_multibios_change_game)
-/*************************************
- *
- * CIA-A port A access:
- *
- * PA7 = game port 1, pin 6 (fire)
- * PA6 = game port 0, pin 6 (fire)
- * PA5 = /RDY (disk ready)
- * PA4 = /TK0 (disk track 00)
- * PA3 = /WPRO (disk write protect)
- * PA2 = /CHNG (disk change)
- * PA1 = /LED (LED, 0=bright / audio filter control)
- * PA0 = OVL (ROM/RAM overlay bit)
- *
- *************************************/
-
-WRITE8_MEMBER(arcadia_amiga_state::arcadia_cia_0_porta_w)
-{
- /* switch banks as appropriate */
- m_bank1->set_entry(data & 1);
-
- /* swap the write handlers between ROM and bank 1 based on the bit */
- if ((data & 1) == 0)
- /* overlay disabled, map RAM on 0x000000 */
- m_maincpu->space(AS_PROGRAM).install_write_bank(0x000000, 0x07ffff, "bank1");
-
- else
- /* overlay enabled, map Amiga system ROM on 0x000000 */
- m_maincpu->space(AS_PROGRAM).unmap_write(0x000000, 0x07ffff);
-
- /* bit 2 = Power Led on Amiga */
- set_led_status(machine(), 0, (data & 2) ? 0 : 1);
-}
-
-
/*************************************
*
@@ -161,10 +131,10 @@ WRITE8_MEMBER(arcadia_amiga_state::arcadia_cia_0_portb_w)
/* writing a 0 in the low bit clears one of the coins */
if ((data & 1) == 0)
{
- if (coin_counter[0] > 0)
- coin_counter[0]--;
- else if (coin_counter[1] > 0)
- coin_counter[1]--;
+ if (m_coin_counter[0] > 0)
+ m_coin_counter[0]--;
+ else if (m_coin_counter[1] > 0)
+ m_coin_counter[1]--;
}
}
@@ -181,7 +151,7 @@ CUSTOM_INPUT_MEMBER(arcadia_amiga_state::coin_counter_r)
int coin = (FPTR)param;
/* return coin counter values */
- return coin_counter[coin] & 3;
+ return m_coin_counter[coin] & 3;
}
@@ -190,17 +160,18 @@ INPUT_CHANGED_MEMBER(arcadia_amiga_state::coin_changed_callback)
int coin = (FPTR)param;
/* check for a 0 -> 1 transition */
- if (!oldval && newval && coin_counter[coin] < 3)
- coin_counter[coin] += 1;
+ if (!oldval && newval && m_coin_counter[coin] < 3)
+ m_coin_counter[coin] += 1;
}
-static void arcadia_reset_coins(running_machine &machine)
+void arcadia_amiga_state::machine_reset()
{
- UINT8 *coin_counter = machine.driver_data<arcadia_amiga_state>()->coin_counter;
+ // reset base machine
+ amiga_state::machine_reset();
- /* reset coin counters */
- coin_counter[0] = coin_counter[1] = 0;
+ // reset coin counters
+ m_coin_counter[0] = m_coin_counter[1] = 0;
}
@@ -211,14 +182,27 @@ static void arcadia_reset_coins(running_machine &machine)
*
*************************************/
-static ADDRESS_MAP_START( amiga_map, AS_PROGRAM, 16, arcadia_amiga_state )
+static ADDRESS_MAP_START( overlay_512kb_map, AS_PROGRAM, 16, arcadia_amiga_state )
+ ADDRESS_MAP_UNMAP_HIGH
+ AM_RANGE(0x000000, 0x07ffff) AM_MIRROR(0x180000) AM_RAM AM_SHARE("chip_ram")
+ AM_RANGE(0x200000, 0x27ffff) AM_ROM AM_REGION("kickstart", 0)
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( a500_mem, AS_PROGRAM, 16, arcadia_amiga_state )
ADDRESS_MAP_UNMAP_HIGH
- AM_RANGE(0x000000, 0x07ffff) AM_RAMBANK("bank1") AM_SHARE("chip_ram")
- AM_RANGE(0xbfd000, 0xbfefff) AM_READWRITE(amiga_cia_r, amiga_cia_w)
- AM_RANGE(0xc00000, 0xdfffff) AM_READWRITE(amiga_custom_r, amiga_custom_w) AM_SHARE("custom_regs")
- AM_RANGE(0xe80000, 0xe8ffff) AM_READWRITE(amiga_autoconfig_r, amiga_autoconfig_w)
- AM_RANGE(0xf80000, 0xffffff) AM_ROM AM_REGION("user1", 0) /* Kickstart BIOS */
+ AM_RANGE(0x000000, 0x1fffff) AM_DEVICE("overlay", address_map_bank_device, amap16)
+ AM_RANGE(0xa00000, 0xbfffff) AM_READWRITE(cia_r, cia_w)
+ AM_RANGE(0xc00000, 0xd7ffff) AM_READWRITE(custom_chip_r, custom_chip_w)
+ AM_RANGE(0xd80000, 0xddffff) AM_NOP
+ AM_RANGE(0xde0000, 0xdeffff) AM_READWRITE(custom_chip_r, custom_chip_w)
+ AM_RANGE(0xdf0000, 0xdfffff) AM_READWRITE(custom_chip_r, custom_chip_w) AM_SHARE("custom_regs")
+ AM_RANGE(0xe00000, 0xe7ffff) AM_WRITENOP AM_READ(rom_mirror_r)
+ AM_RANGE(0xe80000, 0xefffff) AM_NOP // autoconfig space (installed by devices)
+ AM_RANGE(0xf80000, 0xffffff) AM_ROM AM_REGION("kickstart", 0)
+ADDRESS_MAP_END
+static ADDRESS_MAP_START( arcadia_map, AS_PROGRAM, 16, arcadia_amiga_state )
+ AM_IMPORT_FROM(a500_mem)
AM_RANGE(0x800000, 0x97ffff) AM_ROMBANK("bank2") AM_REGION("user3", 0)
AM_RANGE(0x980000, 0x9fbfff) AM_ROM AM_REGION("user2", 0)
AM_RANGE(0x9fc000, 0x9ffffd) AM_RAM AM_SHARE("nvram")
@@ -227,13 +211,7 @@ static ADDRESS_MAP_START( amiga_map, AS_PROGRAM, 16, arcadia_amiga_state )
ADDRESS_MAP_END
static ADDRESS_MAP_START( argh_map, AS_PROGRAM, 16, arcadia_amiga_state )
- ADDRESS_MAP_UNMAP_HIGH
- AM_RANGE(0x000000, 0x07ffff) AM_RAMBANK("bank1") AM_SHARE("chip_ram")
- AM_RANGE(0xbfd000, 0xbfefff) AM_READWRITE(amiga_cia_r, amiga_cia_w)
- AM_RANGE(0xc00000, 0xdfffff) AM_READWRITE(amiga_custom_r, amiga_custom_w) AM_SHARE("custom_regs")
- AM_RANGE(0xe80000, 0xe8ffff) AM_READWRITE(amiga_autoconfig_r, amiga_autoconfig_w)
- AM_RANGE(0xf80000, 0xffffff) AM_ROM AM_REGION("user1", 0) /* Kickstart BIOS */
-
+ AM_IMPORT_FROM(a500_mem)
AM_RANGE(0x800000, 0x97ffff) AM_ROMBANK("bank2") AM_REGION("user3", 0)
// AM_RANGE(0x980000, 0x9fefff) AM_ROM AM_REGION("user3", 0)
AM_RANGE(0x9ff000, 0x9fffff) AM_RAM AM_SHARE("nvram")
@@ -262,28 +240,28 @@ static INPUT_PORTS_START( arcadia )
PORT_BIT( 0x30, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, arcadia_amiga_state,coin_counter_r, 0)
PORT_BIT( 0xc0, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, arcadia_amiga_state,coin_counter_r, 1)
- PORT_START("JOY0DAT")
+ PORT_START("joy_0_dat")
PORT_BIT( 0x0303, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, arcadia_amiga_state,amiga_joystick_convert, 0)
PORT_BIT( 0xfcfc, IP_ACTIVE_HIGH, IPT_UNUSED )
- PORT_START("JOY1DAT")
+ PORT_START("joy_1_dat")
PORT_BIT( 0x0303, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, arcadia_amiga_state,amiga_joystick_convert, 1)
PORT_BIT( 0xfcfc, IP_ACTIVE_HIGH, IPT_UNUSED )
- PORT_START("POTGO")
+ PORT_START("potgo")
PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_BUTTON2 )
PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_COCKTAIL
PORT_BIT( 0xaaff, IP_ACTIVE_HIGH, IPT_UNUSED )
- PORT_START("P1JOY")
+ PORT_START("p1_joy")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(1)
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1)
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1)
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1)
- PORT_START("P2JOY")
+ PORT_START("p2_joy")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(2)
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2)
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2)
@@ -305,11 +283,16 @@ INPUT_PORTS_END
static MACHINE_CONFIG_START( arcadia, arcadia_amiga_state )
/* basic machine hardware */
- MCFG_CPU_ADD("maincpu", M68000, AMIGA_68000_NTSC_CLOCK)
- MCFG_CPU_PROGRAM_MAP(amiga_map)
+ MCFG_CPU_ADD("maincpu", M68000, amiga_state::CLK_7M_NTSC)
+ MCFG_CPU_PROGRAM_MAP(arcadia_map)
+
+ MCFG_DEVICE_ADD("overlay", ADDRESS_MAP_BANK, 0)
+ MCFG_DEVICE_PROGRAM_MAP(overlay_512kb_map)
+ MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_BIG)
+ MCFG_ADDRESS_MAP_BANK_DATABUS_WIDTH(16)
+ MCFG_ADDRESS_MAP_BANK_ADDRBUS_WIDTH(22)
+ MCFG_ADDRESS_MAP_BANK_STRIDE(0x200000)
- MCFG_MACHINE_START_OVERRIDE(amiga_state, amiga )
- MCFG_MACHINE_RESET_OVERRIDE(arcadia_amiga_state,amiga)
MCFG_NVRAM_ADD_0FILL("nvram")
/* video hardware */
@@ -330,24 +313,24 @@ static MACHINE_CONFIG_START( arcadia, arcadia_amiga_state )
/* sound hardware */
MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
- MCFG_SOUND_ADD("amiga", AMIGA, 3579545)
+ MCFG_SOUND_ADD("amiga", AMIGA, amiga_state::CLK_C1_NTSC)
MCFG_SOUND_ROUTE(0, "lspeaker", 0.50)
MCFG_SOUND_ROUTE(1, "rspeaker", 0.50)
MCFG_SOUND_ROUTE(2, "rspeaker", 0.50)
MCFG_SOUND_ROUTE(3, "lspeaker", 0.50)
/* cia */
- MCFG_DEVICE_ADD("cia_0", LEGACY_MOS8520, AMIGA_68000_NTSC_CLOCK / 10)
- MCFG_MOS6526_IRQ_CALLBACK(WRITELINE(amiga_state, amiga_cia_0_irq))
+ MCFG_DEVICE_ADD("cia_0", LEGACY_MOS8520, amiga_state::CLK_E_NTSC)
+ MCFG_MOS6526_IRQ_CALLBACK(WRITELINE(amiga_state, cia_0_irq))
MCFG_MOS6526_PA_INPUT_CALLBACK(IOPORT("CIA0PORTA"))
- MCFG_MOS6526_PA_OUTPUT_CALLBACK(WRITE8(arcadia_amiga_state,arcadia_cia_0_porta_w))
+ MCFG_MOS6526_PA_OUTPUT_CALLBACK(WRITE8(amiga_state, cia_0_port_a_write))
MCFG_MOS6526_PB_INPUT_CALLBACK(IOPORT("CIA0PORTB"))
MCFG_MOS6526_PB_OUTPUT_CALLBACK(WRITE8(arcadia_amiga_state,arcadia_cia_0_portb_w))
- MCFG_DEVICE_ADD("cia_1", LEGACY_MOS8520, AMIGA_68000_NTSC_CLOCK / 10)
- MCFG_MOS6526_IRQ_CALLBACK(WRITELINE(amiga_state, amiga_cia_1_irq))
+ MCFG_DEVICE_ADD("cia_1", LEGACY_MOS8520, amiga_state::CLK_E_NTSC)
+ MCFG_MOS6526_IRQ_CALLBACK(WRITELINE(amiga_state, cia_1_irq))
/* fdc */
- MCFG_DEVICE_ADD("fdc", AMIGA_FDC, AMIGA_68000_NTSC_CLOCK)
+ MCFG_DEVICE_ADD("fdc", AMIGA_FDC, amiga_state::CLK_7M_NTSC)
MCFG_AMIGA_FDC_INDEX_CALLBACK(DEVWRITELINE("cia_1", legacy_mos6526_device, flag_w))
MACHINE_CONFIG_END
@@ -368,9 +351,9 @@ MACHINE_CONFIG_END
#define ROM_LOAD16_BYTE_BIOS(bios,name,offset,length,hash) ROMX_LOAD(name, offset, length, hash, ROM_SKIP(1) | ROM_BIOS(bios+1))
#define ARCADIA_BIOS \
- ROM_REGION16_BE(0x80000, "user1", 0 ) \
- ROM_LOAD16_WORD( "kick12.rom", 0x000000, 0x040000, CRC(a6ce1636) SHA1(11f9e62cf299f72184835b7b2a70a16333fc0d88) ) \
- ROM_COPY( "user1", 0x000000, 0x040000, 0x040000 ) \
+ ROM_REGION16_BE(0x80000, "kickstart", 0 ) \
+ ROM_LOAD16_WORD("315093-01.u2", 0x000000, 0x040000, CRC(a6ce1636) SHA1(11f9e62cf299f72184835b7b2a70a16333fc0d88)) \
+ ROM_COPY("kickstart", 0x000000, 0x040000, 0x040000) \
\
ROM_REGION16_BE( 0x80000, "user2", 0 ) \
ROM_SYSTEM_BIOS(0, "onep300", "OnePlay 3.00") \
@@ -866,9 +849,9 @@ ROM_END
ROM_START( ar_argh ) // this plugs directly into the a500 motherboard, no arcadia bios, just the a500 kickstart and game ROMs
- ROM_REGION16_BE(0x80000, "user1", 0 )
- ROM_LOAD16_WORD( "kick12.rom", 0x000000, 0x040000, CRC(a6ce1636) SHA1(11f9e62cf299f72184835b7b2a70a16333fc0d88) )
- ROM_COPY( "user1", 0x000000, 0x040000, 0x040000 )
+ ROM_REGION16_BE(0x80000, "kickstart", 0 )
+ ROM_LOAD16_WORD("315093-01.u2", 0x00000, 0x40000, CRC(a6ce1636) SHA1(11f9e62cf299f72184835b7b2a70a16333fc0d88))
+ ROM_COPY("kickstart", 0x00000, 0x40000, 0x40000 )
ROM_REGION16_BE( 0x180000, "user3", ROMREGION_ERASEFF )
ROM_LOAD16_BYTE( "argh-1-hi-11-28-87.u12", 0x000000, 0x10000, CRC(3b1f8075) SHA1(61aeff9f6a2dff6efe4276cb0bcbb80b495e26b6) )
@@ -940,28 +923,13 @@ void arcadia_amiga_state::generic_decode(const char *tag, int bit7, int bit6, in
*
*************************************/
-void arcadia_amiga_state::arcadia_init()
+DRIVER_INIT_MEMBER( arcadia_amiga_state, arcadia )
{
- static const amiga_machine_interface arcadia_intf =
- {
- ANGUS_CHIP_RAM_MASK,
- NULL, NULL, NULL,
- NULL,
- NULL, arcadia_reset_coins,
- NULL,
- 0
- };
- UINT16 *biosrom;
-
- /* configure our Amiga setup */
- amiga_machine_config(machine(), &arcadia_intf);
-
- /* set up memory */
- m_bank1->configure_entry(0, m_chip_ram);
- m_bank1->configure_entry(1, memregion("user1")->base());
+ m_agnus_id = AGNUS_HR_NTSC;
+ m_denise_id = DENISE;
/* OnePlay bios is encrypted, TenPlay is not */
- biosrom = (UINT16 *)memregion("user2")->base();
+ UINT16 *biosrom = (UINT16 *)memregion("user2")->base();
if (biosrom)
if (biosrom[0] != 0x4afc)
@@ -970,27 +938,27 @@ void arcadia_amiga_state::arcadia_init()
+
/*************************************
*
* Per-game decryption
*
*************************************/
-DRIVER_INIT_MEMBER(arcadia_amiga_state,none) { arcadia_init(); }
-DRIVER_INIT_MEMBER(arcadia_amiga_state,airh) { arcadia_init(); generic_decode("user3", 5, 0, 2, 4, 7, 6, 1, 3); }
-DRIVER_INIT_MEMBER(arcadia_amiga_state,bowl) { arcadia_init(); generic_decode("user3", 7, 6, 0, 1, 2, 3, 4, 5); }
-DRIVER_INIT_MEMBER(arcadia_amiga_state,blast){ arcadia_init(); generic_decode("user3", 4, 1, 7, 6, 2, 0, 3, 5); }
-DRIVER_INIT_MEMBER(arcadia_amiga_state,dart) { arcadia_init(); generic_decode("user3", 4, 0, 7, 6, 3, 1, 2, 5); }
-DRIVER_INIT_MEMBER(arcadia_amiga_state,ldrb) { arcadia_init(); generic_decode("user3", 2, 3, 4, 1, 0, 7, 5, 6); }
-DRIVER_INIT_MEMBER(arcadia_amiga_state,ninj) { arcadia_init(); generic_decode("user3", 1, 6, 5, 7, 4, 2, 0, 3); }
-DRIVER_INIT_MEMBER(arcadia_amiga_state,rdwr) { arcadia_init(); generic_decode("user3", 3, 1, 6, 4, 0, 5, 2, 7); }
-DRIVER_INIT_MEMBER(arcadia_amiga_state,sdwr) { arcadia_init(); generic_decode("user3", 6, 3, 4, 5, 2, 1, 0, 7); }
-DRIVER_INIT_MEMBER(arcadia_amiga_state,socc) { arcadia_init(); generic_decode("user3", 0, 7, 1, 6, 5, 4, 3, 2); }
-DRIVER_INIT_MEMBER(arcadia_amiga_state,sprg) { arcadia_init(); generic_decode("user3", 4, 7, 3, 0, 6, 5, 2, 1); }
-DRIVER_INIT_MEMBER(arcadia_amiga_state,xeon) { arcadia_init(); generic_decode("user3", 3, 1, 2, 4, 0, 5, 6, 7); }
-DRIVER_INIT_MEMBER(arcadia_amiga_state,pm) { arcadia_init(); generic_decode("user3", 7, 6, 5, 4, 3, 2, 1, 0); } // no scramble
-DRIVER_INIT_MEMBER(arcadia_amiga_state,dlta) { arcadia_init(); generic_decode("user3", 4, 1, 7, 6, 2, 0, 3, 5); }
-DRIVER_INIT_MEMBER(arcadia_amiga_state,argh) { arcadia_init(); generic_decode("user3", 5, 0, 2, 4, 7, 6, 1, 3); }
+DRIVER_INIT_MEMBER(arcadia_amiga_state,airh) { DRIVER_INIT_CALL(arcadia); generic_decode("user3", 5, 0, 2, 4, 7, 6, 1, 3); }
+DRIVER_INIT_MEMBER(arcadia_amiga_state,bowl) { DRIVER_INIT_CALL(arcadia); generic_decode("user3", 7, 6, 0, 1, 2, 3, 4, 5); }
+DRIVER_INIT_MEMBER(arcadia_amiga_state,blast){ DRIVER_INIT_CALL(arcadia); generic_decode("user3", 4, 1, 7, 6, 2, 0, 3, 5); }
+DRIVER_INIT_MEMBER(arcadia_amiga_state,dart) { DRIVER_INIT_CALL(arcadia); generic_decode("user3", 4, 0, 7, 6, 3, 1, 2, 5); }
+DRIVER_INIT_MEMBER(arcadia_amiga_state,ldrb) { DRIVER_INIT_CALL(arcadia); generic_decode("user3", 2, 3, 4, 1, 0, 7, 5, 6); }
+DRIVER_INIT_MEMBER(arcadia_amiga_state,ninj) { DRIVER_INIT_CALL(arcadia); generic_decode("user3", 1, 6, 5, 7, 4, 2, 0, 3); }
+DRIVER_INIT_MEMBER(arcadia_amiga_state,rdwr) { DRIVER_INIT_CALL(arcadia); generic_decode("user3", 3, 1, 6, 4, 0, 5, 2, 7); }
+DRIVER_INIT_MEMBER(arcadia_amiga_state,sdwr) { DRIVER_INIT_CALL(arcadia); generic_decode("user3", 6, 3, 4, 5, 2, 1, 0, 7); }
+DRIVER_INIT_MEMBER(arcadia_amiga_state,socc) { DRIVER_INIT_CALL(arcadia); generic_decode("user3", 0, 7, 1, 6, 5, 4, 3, 2); }
+DRIVER_INIT_MEMBER(arcadia_amiga_state,sprg) { DRIVER_INIT_CALL(arcadia); generic_decode("user3", 4, 7, 3, 0, 6, 5, 2, 1); }
+DRIVER_INIT_MEMBER(arcadia_amiga_state,xeon) { DRIVER_INIT_CALL(arcadia); generic_decode("user3", 3, 1, 2, 4, 0, 5, 6, 7); }
+DRIVER_INIT_MEMBER(arcadia_amiga_state,pm) { DRIVER_INIT_CALL(arcadia); generic_decode("user3", 7, 6, 5, 4, 3, 2, 1, 0); } // no scramble
+DRIVER_INIT_MEMBER(arcadia_amiga_state,dlta) { DRIVER_INIT_CALL(arcadia); generic_decode("user3", 4, 1, 7, 6, 2, 0, 3, 5); }
+DRIVER_INIT_MEMBER(arcadia_amiga_state,argh) { DRIVER_INIT_CALL(arcadia); generic_decode("user3", 5, 0, 2, 4, 7, 6, 1, 3); }
/*************************************
@@ -1000,7 +968,7 @@ DRIVER_INIT_MEMBER(arcadia_amiga_state,argh) { arcadia_init(); generic_decode("u
*************************************/
/* BIOS */
-GAME( 1988, ar_bios, 0, arcadia, arcadia, arcadia_amiga_state, none, ROT0, "Arcadia Systems", "Arcadia System BIOS", GAME_IS_BIOS_ROOT )
+GAME( 1988, ar_bios, 0, arcadia, arcadia, arcadia_amiga_state, arcadia, ROT0, "Arcadia Systems", "Arcadia System BIOS", GAME_IS_BIOS_ROOT )
GAME( 1988, ar_blast, ar_bios, arcadia, arcadia, arcadia_amiga_state, blast, ROT0, "Arcadia Systems", "Blastaball (Arcadia, V 2.1)", 0 )
@@ -1012,12 +980,12 @@ GAME( 1988, ar_bowl, ar_bios, arcadia, arcadia, arcadia_amiga_state, bowl, R
GAME( 1987, ar_dart, ar_bios, arcadia, arcadia, arcadia_amiga_state, dart, ROT0, "Arcadia Systems", "World Darts (Arcadia, set 1, V 2.1)", 0 )
GAME( 1987, ar_dart2, ar_dart, arcadia, arcadia, arcadia_amiga_state, dart, ROT0, "Arcadia Systems", "World Darts (Arcadia, set 2)", GAME_NOT_WORKING ) // bad dump
-GAME( 1988, ar_fast, ar_bios, arcadia, arcadia, arcadia_amiga_state, none, ROT0, "Arcadia Systems", "Magic Johnson's Fast Break (Arcadia, V 2.8)", 0 )
-GAME( 1988, ar_fasta, ar_fast, arcadia, arcadia, arcadia_amiga_state, none, ROT0, "Arcadia Systems", "Magic Johnson's Fast Break (Arcadia, V 2.7)", 0 )
+GAME( 1988, ar_fast, ar_bios, arcadia, arcadia, arcadia_amiga_state, arcadia, ROT0, "Arcadia Systems", "Magic Johnson's Fast Break (Arcadia, V 2.8)", 0 )
+GAME( 1988, ar_fasta, ar_fast, arcadia, arcadia, arcadia_amiga_state, arcadia, ROT0, "Arcadia Systems", "Magic Johnson's Fast Break (Arcadia, V 2.7)", 0 )
GAME( 1988, ar_ldrb, ar_bios, arcadia, arcadia, arcadia_amiga_state, ldrb, ROT0, "Arcadia Systems", "Leader Board (Arcadia, set 1, V 2.5)", 0 )
-GAME( 1988, ar_ldrba, ar_ldrb, arcadia, arcadia, arcadia_amiga_state, none, ROT0, "Arcadia Systems", "Leader Board (Arcadia, set 2, V 2.4)", 0 )
-GAME( 1988, ar_ldrbb, ar_ldrb, arcadia, arcadia, arcadia_amiga_state, none, ROT0, "Arcadia Systems", "Leader Board (Arcadia, set 3)", 0 )
+GAME( 1988, ar_ldrba, ar_ldrb, arcadia, arcadia, arcadia_amiga_state, arcadia, ROT0, "Arcadia Systems", "Leader Board (Arcadia, set 2, V 2.4)", 0 )
+GAME( 1988, ar_ldrbb, ar_ldrb, arcadia, arcadia, arcadia_amiga_state, arcadia, ROT0, "Arcadia Systems", "Leader Board (Arcadia, set 3)", 0 )
GAME( 1987, ar_ninj, ar_bios, arcadia, arcadia, arcadia_amiga_state, ninj, ROT0, "Arcadia Systems", "Ninja Mission (Arcadia, set 1, V 2.5)", 0 )
GAME( 1987, ar_ninj2, ar_ninj, arcadia, arcadia, arcadia_amiga_state, ninj, ROT0, "Arcadia Systems", "Ninja Mission (Arcadia, set 2)", 0 )
@@ -1029,7 +997,7 @@ GAME( 1988, ar_sdwr2, ar_sdwr, arcadia, arcadia, arcadia_amiga_state, sdwr, R
GAME( 1989, ar_socc, ar_bios, arcadia, arcadia, arcadia_amiga_state, socc, ROT0, "Arcadia Systems", "World Trophy Soccer (Arcadia, V 3.0)", 0 )
-GAME( 1990, ar_spot, ar_bios, arcadia, arcadia, arcadia_amiga_state, none, ROT0, "Arcadia Systems", "Spot (Arcadia, V 2.0)", 0 )
+GAME( 1990, ar_spot, ar_bios, arcadia, arcadia, arcadia_amiga_state, arcadia, ROT0, "Arcadia Systems", "Spot (Arcadia, V 2.0)", 0 )
GAME( 1987, ar_sprg, ar_bios, arcadia, arcadia, arcadia_amiga_state, sprg, ROT0, "Arcadia Systems", "Space Ranger (Arcadia, V 2.0)", 0 )
diff --git a/src/mame/drivers/cd32.c b/src/mame/drivers/cubo.c
index 4bb0fc1abe1..4f04f342a3d 100644
--- a/src/mame/drivers/cd32.c
+++ b/src/mame/drivers/cubo.c
@@ -1,43 +1,315 @@
/*
- Commodore Amiga CD-32 and related hardware
- (Cubo CD32 for arcades)
-
- Driver by Mariusz Wojcieszek
- CD-ROM controller by Ernesto Corvi
- Inputs by stephh
-
- This is basically a CD32 (Amiga 68020, AGA based games system) hacked up to run arcade games.
- see http://ninjaw.ifrance.com/cd32/cubo/ for a brief overview.
-
- Several of the games have Audio tracks, therefore the CRC / SHA1 information you get when
- reading your own CDs may not match those in the driver. There is currently no 100% accurate
- way to rip the audio data with full sub-track and offset information.
-
- CD32 Hardware Specs (from Wikipedia, http://en.wikipedia.org/wiki/Amiga_CD32)
- * Main Processor: Motorola 68EC020 at 14.3 MHz
- * System Memory: 2 MB Chip RAM
- * 1 MB ROM with Kickstart ROM 3.1 and integrated cdfs.filesystem
- * 1KB of FlashROM for game saves
- * Graphics/Chipset: AGA Chipset
- * Akiko chip, which handles CD-ROM and can do Chunky to Planar conversion
- * Proprietary (MKE) CD-ROM drive at 2x speed
- * Expansion socket for MPEG cartridge, as well as 3rd party devices such as the SX-1 and SX32 expansion packs.
- * 4 8-bit audio channels (2 for left, 2 for right)
- * Gamepad, Serial port, 2 Gameports, Interfaces for keyboard
+
+ Cubo CD32 (additional hardware and games by CD Express, Milan, Italy)
+
+ The CuboCD32 is a stock retail CD32 unit with additional hardware to adapt it
+ for JAMMA use.
+
+ copyright-holders: Aaron Giles, Mariusz Wojcieszek, Ernesto Corvi, Stephh, Dirk Best
+
+ Known Games:
+ Title | rev. | year
+ ----------------------------------------------
+ Candy Puzzle | 1.0 | 1995
+ Harem Challenge | | 1995
+ Laser Quiz | | 1995
+ Laser Quiz 2 "Italy" | 1.0 | 1995
+ Laser Strixx | | 1995
+ Laser Strixx 2 | | 1995
+ Magic Premium | 1.1 | 1996
+ Laser Quiz France | 1.0 | 1995
+ Odeon Twister | | 199x
+ Odeon Twister 2 |202.19| 1999
+
+
+ ToDo:
+ - remove the hack needed to make inputs working
+
+
+Stephh's notes (based on the game M68EC020 code and some tests) :
+
+
+1) "Candy Puzzle"
+
+settings (A5=0x059ac0) :
+
+ - 051ba0.w (-$7f20,A5) : difficulty player 1 (0)
+ - 051ba2.w (-$7f1e,A5) : difficulty player 2 (0)
+ - 051ba4.w (-$7f1c,A5) : challenge rounds (3)
+ - 051ba6.w (-$7f1a,A5) : death in 2P mode (0) - 0 = NO / 1 = YES
+ - 051ba8.w (-$7f18,A5) : play x credit (1)
+ - 051bac.w (-$7f14,A5) : coin x 1 play (1)
+ - 051bb0.w (-$7f10,A5) : maxpalleattack (2)
+ - : reset high score - NO* / YES
+ - 051baa.w (-$7f16,A5) : 1 coin 2 players (1) - 0 = NO / 1 = YES
+
+useful addresses :
+
+ - 051c02.w (-$7ebe,A5) : must be 0x0000 instead of 0x0001 to accept coins !
+ - 051c04.b (-$7ebc,A5) : credits
+ - 051c10.l (-$7eb0,A5) : basic address for inputs = 0006fd18 :
+ * BA + 1 x 6 + 4 : start 2 (bit 5)
+ * BA + 1 x 6 + 0 : player 2 L/R (-1/0/1)
+ * BA + 1 x 6 + 2 : player 2 U/D (-1/0/1)
+ * BA + 0 x 6 + 4 : start 1 (bit 5)
+ * BA + 0 x 6 + 0 : player 1 L/R (-1/0/1)
+ * BA + 0 x 6 + 2 : player 1 U/D (-1/0/1)
+
+routines :
+
+ - 07acae : inputs read
+ - 092c8a : buttons + coin read
+ * D0 = 0 : read potgo (player 2)
+ * D0 = 1 : read potgo (player 1)
+ - 092baa : joy read - test bits 1 and 9 : 1 if bit 1, -1 if bit 9, 0 if none
+ * D0 = 0 : read joy_0_dat (player 2)
+ * D0 = 1 : read joy_1_dat (player 1)
+ - 092bd4 : joy read - test bits 0 and 8 : 1 if bit 0, -1 if bit 8, 0 if none ("eor.w read, read >> 1" before test)
+ * D0 = 0 : read joy_0_dat (player 2)
+ * D0 = 1 : read joy_1_dat (player 1)
+
+ - 07ada4 : coin verification
+ - 07d0fe : start buttons verification
+
+
+2) "Harem Challenge"
+
+settings (A5=0x00a688 & A2=0x0028e8) :
+
+ - : photo level - soft* / erotic / porno
+ - 002906.b (A2 + 0x1e) : difficulty (2) - 1 = LOW / 2 = NORMAL / 3 = HIGH
+ - 0028fc.b (A2 + 0x14) : deadly selftouch (0) - 0 = NO / 1 = YES
+ - 0028ff.b (A2 + 0x17) : energy supply - 100%* / 0% / 50%
+ - 002900.b (A2 + 0x18) : area to cover 1P - 75% / 80%* / 85%
+ - 002901.b (A2 + 0x19) : area to cover 2P - 70% / 75%* / 80%
+ - 002902.w (A2 + 0x1a) : level time (00C8) - 0096 = 1:00 / 00C8 = 1:20 / 00FA = 1:40
+ - 002904.b (A2 + 0x1c) : tournament mode (2) - 0 = NO CHALLENGE / 2 = BEST OF 3 / 3 = BEST OF 5
+ - : reset hi-score - NO* / YES
+ - 0028fd.b (A2 + 0x15) : coin x 1 play (1) <=> number of credits used for each play
+ - 0028fe.b (A2 + 0x16) : play x credit (1) <=> credits awarded for each coin
+ - : demo photo level - soft* / erot
+
+useful addresses :
+
+ - 002907.b (-$7f00,A5 -> $1f,A2) : must be 0x00 instead of 0x01 to accept coins !
+ - 00278c.w (-$7efc,A5) : player 2 inputs
+ - 00278e.w (-$7efa,A5) : player 1 inputs
+ - 002790.b (-$7ef8,A5) : credits
+
+ - 0028e8.b (A2 ) : level - range (0x01 - 0x09 and 0x00 when in "attract mode")
+ - 0028ea.w (A2 + 0x02) : time (not used for "continue play") - range (0x0000 - 0x0014 with 0x0000 being max)
+
+ - 026fe8.l (-$7fa0,A5 -> A2 + $18 x 0 + 0x00) : player 1 energy (in MSW after swap) - range (0x00000000 - 0x00270000)
+ - 026fec.l (-$7fa0,A5 -> A2 + $18 x 0 + 0x04) : player 1 score
+ - 026ff8.w (-$7fa0,A5 -> A2 + $18 x 0 + 0x10) : player 1 girls
+ - 027000.l (-$7fa0,A5 -> A2 + $18 x 1 + 0x00) : player 2 energy (in MSW after swap) - range (0x00000000 - 0x00270000)
+ - 027004.l (-$7fa0,A5 -> A2 + $18 x 1 + 0x04) : player 2 score
+ - 027010.w (-$7fa0,A5 -> A2 + $18 x 1 + 0x10) : player 2 girls
+
+routines :
+
+ - 04a5de : inputs read
+ - 061928 : buttons + coin read
+ * D0 = 0 : read potgo (player 2)
+ * D0 = 1 : read potgo (player 1)
+
+ - 04a692 : coin verification
+ - 050b8c : start buttons verification
+
+
+3) "Laser Quiz"
+
+settings (A5=0x00a580 & A2=0x001e08) :
+
+ - 001a54.w (see below) : numero di vite (2)
+ - 001e08.w (A2 ) : primo bonus dom. (5)
+ - 001e0a.w (A2 + 0x02) : max dom. facili (7)
+ - 001e0c.w (A2 + 0x04) : incremento dom. (2)
+ - 001e0e.w (A2 + 0x06) : inizio dom. diff. (10)
+ - 001e10.w (A2 + 0x08) : risposte a video (4)
+ - 001e12.w (A2 + 0x0a) : checkmark risp. (1) - 0 = CONTEMPORANEO / 1 = IMMEDIATO
+ - 001e16.w (A2 + 0x0e) : vel. chronometro (32) - 3C = LENTA / 32 = NORMALE / 28 = VELOCE
+ - 001e14.w (A2 + 0x0c) : volume musica (14) - 14 = NORMALE / 0A = BASSO / 00 = NO MUSICA
+ - 001e18.b (A2 + 0x10) : vita premio bonus (1) - 0 = PER IL PRIMO / 1 = PER EMTRAMBI
+ - : reset hi-score - NO* / SI
+ - 001e19.b (A2 + 0x11) : coin x 1 play (1) <=> number of credits used for each play
+ - 001e1a.b (A2 + 0x12) : foto erotiche (1) - 1 = SI / 2 = NO
+
+useful addresses :
+
+ - 001e1b.b (-$7fe0,A5 -> $13,A2) : must be 0x00 instead of 0x01 to accept coins !
+ - 0026a4.w (-$7f0c,A5) : player 2 inputs
+ - 0026a6.w (-$7f0a,A5) : player 1 inputs
+ - 002606.b (-$7faa,A5) : credits
+
+ - 001a54.w (-$7fe4,A5 -> $04,A2) : lives at start
+ - 001a59.b (-$7fe4,A5 -> $09,A2) : bonus level (so lives aren't decremented) ? 0x00 = NO / 0x01 YES
+ - 001a5a.b (-$7fe4,A5 -> $0a,A2) : level - range 0x00-0x63
+
+ - 00c9b0.b (-$7fdc,A5 -> A2 + $06 x 0 + 0x00) : player 1 active ? 0x00 = NO / 0x01 YES / 0x02 = "ATTENDI"
+ - 00c9b1.b (-$7fdc,A5 -> A2 + $06 x 0 + 0x01) : player 1 lives - range 0x00-0x63
+ - 00c9b2.l (-$7fdc,A5 -> A2 + $06 x 0 + 0x02) : player 1 score
+ - 00c9b6.b (-$7fdc,A5 -> A2 + $06 x 1 + 0x00) : player 2 active ? 0x00 = NO / 0x01 YES / 0x02 = "ATTENDI"
+ - 00c9b7.b (-$7fdc,A5 -> A2 + $06 x 1 + 0x01) : player 2 lives - range 0x00-0x63
+ - 00c9b8.l (-$7fdc,A5 -> A2 + $06 x 1 + 0x02) : player 2 score
+
+ - 02327c.l (-$50,A4) : player 1 inputs (ingame)
+ - 023280.l (-$4c,A4) : player 2 inputs (ingame)
+
+routines :
+
+ - 0cedf8 : inputs read
+ - 0d8150 : buttons + coin read
+ * D0 = 0 : read potgo (player 2)
+ * D0 = 1 : read potgo (player 1)
+
+ - 0cee42 : coin verification
+ - 0cefc6 : start buttons verification
+
+ - 0cb40c : inputs (ingame) read
+
+
+4) "Laser Quiz 2"
+
+settings (A5=0x0531e8 & A2=0x0460f0) :
+
+ - 0460f0.w (A2 ) : numero di vite (2)
+ - 0460f0.w (A2 + 0x02) : primo bonus dom. (5)
+ - 0460f0.w (A2 + 0x04) : max dom. facili (7)
+ - 0460f0.w (A2 + 0x06) : incremento dom. (2)
+ - 0460f0.w (A2 + 0x08) : inizio dom. diff. (10)
+ - 0460f0.w (A2 + 0x0a) : risposte a video (4)
+ - 0460f0.w (A2 + 0x0c) : checkmark risp. (1) - 0 = CONTEMPORANEO / 1 = IMMEDIATO
+ - 0460f0.w (A2 + 0x10) : vel. chronometro (5) - 5 = LENTA / 4 = NORMALE / 3 = VELOCE
+ - 0460f0.w (A2 + 0x0e) : volume musica (3F) - 3F = NORMALE / 20 = BASSO / 00 = NO MUSICA
+ - 0460f0.b (A2 + 0x12) : vita premio bonus (1) - 0 = PER IL PRIMO / 1 = PER TUTTI
+ - : reset hi-score - NO* / SI
+ - 0460f0.b (A2 + 0x13) : coin x 1 play (1) <=> number of credits used for each play
+ - 0460f0.b (A2 + 0x14) : play x credit (1) <=> credits awarded for each coin
+ - 0460f0.b (A2 + 0x15) : foto erotiche (1) - 1 = SI / 2 = NO
+ - 0460f0.b (A2 + 0x16) : numero giocatori (0) - 0 = 2 / 1 = 4
+
+useful addresses :
+
+ - 046107.b (-$7fdc,A5 -> $17,A2) : must be 0x00 instead of 0x01 to accept coins !
+ - 04b250.w (-$7f98,A5) : player 2 inputs
+ - 04b252.w (-$7f96,A5) : player 1 inputs
+ - 04b254.w (-$7f94,A5) : player 3 inputs
+ - 04b256.w (-$7f92,A5) : player 4 inputs
+ - 04b248.b (-$7fa0,A5) : credits
+
+ - 04570d.b (-$7fe0,A5 -> $05,A2) : bonus level (so lives aren't decremented) ? 0x00 = NO / 0x01 YES
+ - 04570e.b (-$7fe4,A5 -> $06,A2) : level - range 0x00-0x63
+
+ - 051fc0.b (-$7fd8,A5 -> A2 + $12 x 0 + 0x00) : player 1 active ? 0x00 = NO / 0x01 = YES / 0x02 = "ATTENDI"
+ - 051fc1.b (-$7fd8,A5 -> A2 + $12 x 0 + 0x01) : player 1 lives - range 0x00-0x63
+ - 051fc2.l (-$7fd8,A5 -> A2 + $12 x 0 + 0x02) : player 1 score
+ - 051fd2.b (-$7fd8,A5 -> A2 + $12 x 1 + 0x00) : player 2 active ? 0x00 = NO / 0x01 = YES / 0x02 = "ATTENDI"
+ - 051fd3.b (-$7fd8,A5 -> A2 + $12 x 1 + 0x01) : player 2 lives - range 0x00-0x63
+ - 051fd4.l (-$7fd8,A5 -> A2 + $12 x 1 + 0x02) : player 2 score
+ - 051fe4.b (-$7fd8,A5 -> A2 + $12 x 2 + 0x00) : player 3 active ? 0x00 = NO / 0x01 = YES / 0x02 = "ATTENDI"
+ - 051fe5.b (-$7fd8,A5 -> A2 + $12 x 2 + 0x01) : player 3 lives - range 0x00-0x63
+ - 051fe6.l (-$7fd8,A5 -> A2 + $12 x 2 + 0x02) : player 3 score
+ - 051ff6.b (-$7fd8,A5 -> A2 + $12 x 3 + 0x00) : player 4 active ? 0x00 = NO / 0x01 = YES / 0x02 = "ATTENDI"
+ - 051ff7.b (-$7fd8,A5 -> A2 + $12 x 3 + 0x01) : player 4 lives - range 0x00-0x63
+ - 051ff8.l (-$7fd8,A5 -> A2 + $12 x 3 + 0x02) : player 4 score
+
+routines :
+
+ - 0746d6 : inputs read
+ - 08251a : buttons + coin read
+ * D0 = 0 : read potgo (player 2)
+ * D0 = 1 : read potgo (player 1)
+
+ - 07472e : coin verification
+
+
+5) "Laser Strixx 2"
+
+settings (A5=0x00a688 & A2=0x0027f8) :
+
+ - : photo level - soft* / erotic / porno
+ - 002910.l (A2 + 0x18) : difficulty (00010000) - 00008000 = LOW / 00010000 = NORMAL / 00018000 = HIGH
+ - 002818.b (A2 + 0x20) : deadly selftouch (0) - 0 = NO / 1 = YES
+ - 00281b.b (A2 + 0x23) : energy supply - 100%* / 0% / 50%
+ - 002819.b (A2 + 0x21) : coin x 1 play (1) <=> number of credits used for each play
+ - 00281a.b (A2 + 0x22) : play x credit (1) <=> credits awarded for each coin
+
+useful addresses :
+
+ - 00281c.b (-$7fa2,A5 -> $24,A2) : must be 0x00 instead of 0x01 to accept coins !
+ - 0026f4.l (-$7f94,A5) : player 1 inputs (in MSW after swap)
+ - 0026ee.b (-$7f9a,A5) : credits
+
+ - 0027f8.l (A2 + 0x00) : player 1 energy (in MSW after swap) - range (0x00000000 - 0x00270000)
+ - 0027fc.b (A2 + 0x04) : level - range (0x01 - 0x09 and 0x00 when in "attract mode")
+ - 0027fe.w (A2 + 0x06) : time (not used for "continue play") - range (0x0000 - 0x0014 with 0x0000 being max)
+ - 002800.l (A2 + 0x08) : player 1 score
+ - 00280a.b (A2 + 0x12) : mouth status (0x00 = not out - 0x01 = out - 0x02 = captured = LIVE STRIP at the end of level)
+ - 00280b.b (A2 + 0x13) : strip phase (0x01 - n with 0x01 being last phase)
+ Ann : n = 0x05
+ Eva : n = 0x04
+ Jo : n = 0x06
+ Sue : n = 0x04
+ Bob : n = 0x05
+
+routines :
+
+ - 04d1ae : inputs read
+ - 058340 : buttons + coin read
+ * D0 = 0 : read potgo (player 2)
+ * D0 = 1 : read potgo (player 1)
+
+ - 04d1da : coin verification
+
+
+6) "Magic Number"
+
+settings (A5=0x053e78 & A2=0x03f540) : TO DO !
+
+useful addresses :
+
+ - 04bfa0.l (-$7ed8,A5) : must be 0x00000000 instead of 0x00010000 to accept coins !
+ - 04bf18.w (-$7f60,A5) : player 1 inputs (in MSW after swap)
+ - 04bf78.l (-$7e00,A5) : player 2 inputs (in MSW after swap)
+ - 03f547.b (-$7f92,A5 -> $7,A2) : credits
+
+routines :
+
+ - 07a480 : inputs read
+ - 085bb8 : buttons + coin read
+ * D0 = 0 : read potgo (player 2)
+ * D0 = 1 : read potgo (player 1)
+
+ - 07a50e : coin verification
+
+
+7) "Magic Premium"
+
+settings (A5=0x04ce48 & A2=0x0419b0) : TO DO !
+
+useful addresses :
+
+ - 044f7e.b (-$7eca,A5) : must be 0x00 instead of 0x01 to accept coins !
+ - 044f02.w (-$7f94,A5) : player 1 inputs
+ - 044f6a.l (-$7ede,A5) : player 2 inputs (in MSW after swap)
+ - 0419b1.b (-$7fc0,A5 -> $1,A2) : credits - range 0x00-0x09
+
+routines :
+
+ - 0707d6 : inputs read
+ - 07b3b2 : buttons + coin read
+ * D0 = 0 : read potgo (player 2)
+ * D0 = 1 : read potgo (player 1)
+
+ - 070802 : coin verification
*/
#include "emu.h"
-#include "cpu/m68000/m68000.h"
-#include "sound/cdda.h"
-#include "machine/6526cia.h"
-#include "includes/cd32.h"
+#include "includes/amiga.h"
#include "imagedev/chd_cd.h"
-#include "machine/amigafdc.h"
-
-#define CD32PAL_XTAL_X1 XTAL_28_37516MHz
-#define CD32PAL_XTAL_X2 XTAL_4_433619MHz
-#define CD32PAL_XTAL_X3 XTAL_16_9344MHz
+#include "machine/microtch.h"
/* set to 0 to use control panel with only buttons (as in quiz games) - joy is default in dispenser setup */
@@ -45,26 +317,63 @@
#define MGNUMBER_USE_JOY 1
+class cubo_state : public amiga_state
+{
+public:
+ cubo_state(const machine_config &mconfig, device_type type, const char *tag) :
+ amiga_state(mconfig, type, tag),
+ m_p1_port(*this, "P1"),
+ m_p2_port(*this, "P2"),
+ m_microtouch(*this, "microtouch"),
+ m_cdda(*this, "cdda")
+ { }
+
+ DECLARE_WRITE8_MEMBER(microtouch_tx);
+
+ DECLARE_CUSTOM_INPUT_MEMBER(cubo_input);
+ DECLARE_CUSTOM_INPUT_MEMBER(cd32_sel_mirror_input);
+
+ DECLARE_WRITE8_MEMBER( akiko_cia_0_port_a_write );
+
+ DECLARE_DRIVER_INIT(cubo);
+ DECLARE_DRIVER_INIT(mgprem11);
+ DECLARE_DRIVER_INIT(odeontw2);
+ DECLARE_DRIVER_INIT(cndypuzl);
+ DECLARE_DRIVER_INIT(haremchl);
+ DECLARE_DRIVER_INIT(mgnumber);
+ DECLARE_DRIVER_INIT(lsrquiz2);
+ DECLARE_DRIVER_INIT(lasstixx);
+ DECLARE_DRIVER_INIT(lsrquiz);
+
+ required_ioport m_p1_port;
+ required_ioport m_p2_port;
+
+ int m_oldstate[2];
+ int m_cd32_shifter[2];
+ UINT16 m_potgo_value;
+
+protected:
+ virtual void serdat_w(UINT16 data);
+ virtual void potgo_w(UINT16 data);
+
+private:
+ required_device<microtouch_device> m_microtouch;
+ required_device<cdda_device> m_cdda;
+
+ typedef void (cubo_state::*input_hack_func)();
+ input_hack_func m_input_hack;
+
+ void cndypuzl_input_hack();
+ void haremchl_input_hack();
+ void lsrquiz_input_hack();
+ void lsrquiz2_input_hack();
+ void lasstixx_input_hack();
+ void mgnumber_input_hack();
+ void mgprem11_input_hack();
+};
+
static void handle_cd32_joystick_cia(running_machine &machine, UINT8 pra, UINT8 dra);
-WRITE32_MEMBER(cd32_state::aga_overlay_w)
-{
- if (ACCESSING_BITS_16_23)
- {
- data = (data >> 16) & 1;
-
- /* switch banks as appropriate */
- m_bank1->set_entry(data & 1);
-
- /* swap the write handlers between ROM and bank 1 based on the bit */
- if ((data & 1) == 0)
- /* overlay disabled, map RAM on 0x000000 */
- space.install_write_bank(0x000000, 0x1fffff, "bank1");
- else
- /* overlay enabled, map Amiga system ROM on 0x000000 */
- space.unmap_write(0x000000, 0x1fffff);
- }
-}
/*************************************
*
@@ -81,7 +390,8 @@ WRITE32_MEMBER(cd32_state::aga_overlay_w)
*
*************************************/
-WRITE8_MEMBER(cd32_state::cd32_cia_0_porta_w)
+
+WRITE8_MEMBER( cubo_state::akiko_cia_0_port_a_write )
{
/* bit 1 = cd audio mute */
m_cdda->set_output_gain( 0, ( data & 1 ) ? 0.0 : 1.0 );
@@ -92,64 +402,43 @@ WRITE8_MEMBER(cd32_state::cd32_cia_0_porta_w)
handle_cd32_joystick_cia(machine(), data, m_cia_0->read(space, 2));
}
-/*************************************
- *
- * CIA-A port B access:
- *
- * PB7 = parallel data 7
- * PB6 = parallel data 6
- * PB5 = parallel data 5
- * PB4 = parallel data 4
- * PB3 = parallel data 3
- * PB2 = parallel data 2
- * PB1 = parallel data 1
- * PB0 = parallel data 0
- *
- *************************************/
-READ8_MEMBER(cd32_state::cd32_cia_0_portb_r)
-{
- /* parallel port */
- logerror("%s:CIA0_portb_r\n", machine().describe_context());
- return 0xff;
-}
-WRITE8_MEMBER(cd32_state::cd32_cia_0_portb_w)
-{
- /* parallel port */
- logerror("%s:CIA0_portb_w(%02x)\n", machine().describe_context(), data);
-}
+static ADDRESS_MAP_START( overlay_2mb_map32, AS_PROGRAM, 32, cubo_state )
+ ADDRESS_MAP_UNMAP_HIGH
+ AM_RANGE(0x000000, 0x1fffff) AM_RAM AM_SHARE("chip_ram")
+ AM_RANGE(0x200000, 0x27ffff) AM_ROM AM_REGION("kickstart", 0)
+ADDRESS_MAP_END
-static ADDRESS_MAP_START( cd32_map, AS_PROGRAM, 32, cd32_state )
+static ADDRESS_MAP_START( cubo_mem, AS_PROGRAM, 32, cubo_state )
ADDRESS_MAP_UNMAP_HIGH
- AM_RANGE(0x000000, 0x1fffff) AM_RAMBANK("bank1") AM_SHARE("chip_ram")
+ AM_RANGE(0x000000, 0x1fffff) AM_DEVICE("overlay", address_map_bank_device, amap32)
AM_RANGE(0x800000, 0x800003) AM_READ_PORT("DIPSW1")
AM_RANGE(0x800010, 0x800013) AM_READ_PORT("DIPSW2")
AM_RANGE(0xb80000, 0xb8003f) AM_DEVREADWRITE("akiko", akiko_device, read, write)
- AM_RANGE(0xbfa000, 0xbfa003) AM_WRITE(aga_overlay_w)
- AM_RANGE(0xbfd000, 0xbfefff) AM_READWRITE16(amiga_cia_r, amiga_cia_w, 0xffffffff)
- AM_RANGE(0xc00000, 0xdfffff) AM_READWRITE16(amiga_custom_r, amiga_custom_w, 0xffffffff) AM_SHARE("custom_regs")
- AM_RANGE(0xe00000, 0xe7ffff) AM_ROM AM_REGION("user1", 0x80000) /* CD32 Extended ROM */
+ AM_RANGE(0xbf0000, 0xbfffff) AM_READWRITE16(cia_r, gayle_cia_w, 0xffffffff)
+ AM_RANGE(0xc00000, 0xdfffff) AM_READWRITE16(custom_chip_r, custom_chip_w, 0xffffffff) AM_SHARE("custom_regs")
+ AM_RANGE(0xe00000, 0xe7ffff) AM_ROM AM_REGION("kickstart", 0x80000)
AM_RANGE(0xa00000, 0xf7ffff) AM_NOP
- AM_RANGE(0xf80000, 0xffffff) AM_ROM AM_REGION("user1", 0x0) /* Kickstart */
+ AM_RANGE(0xf80000, 0xffffff) AM_ROM AM_REGION("kickstart", 0)
ADDRESS_MAP_END
+
/*************************************
*
* Inputs
*
*************************************/
-static void cd32_potgo_w(running_machine &machine, UINT16 data)
+void cubo_state::potgo_w(UINT16 data)
{
- cd32_state *state = machine.driver_data<cd32_state>();
int i;
- if (state->m_input_hack != NULL)
- (*state->m_input_hack)(machine);
+ if (m_input_hack != NULL)
+ (this->*m_input_hack)();
- state->m_potgo_value = state->m_potgo_value & 0x5500;
- state->m_potgo_value |= data & 0xaa00;
+ m_potgo_value = m_potgo_value & 0x5500;
+ m_potgo_value |= data & 0xaa00;
for (i = 0; i < 8; i += 2)
{
@@ -157,22 +446,22 @@ static void cd32_potgo_w(running_machine &machine, UINT16 data)
if (data & dir)
{
UINT16 d = 0x0100 << i;
- state->m_potgo_value &= ~d;
- state->m_potgo_value |= data & d;
+ m_potgo_value &= ~d;
+ m_potgo_value |= data & d;
}
}
for (i = 0; i < 2; i++)
{
UINT16 p5dir = 0x0200 << (i * 4); /* output enable P5 */
UINT16 p5dat = 0x0100 << (i * 4); /* data P5 */
- if ((state->m_potgo_value & p5dir) && (state->m_potgo_value & p5dat))
- state->m_cd32_shifter[i] = 8;
+ if ((m_potgo_value & p5dir) && (m_potgo_value & p5dat))
+ m_cd32_shifter[i] = 8;
}
}
static void handle_cd32_joystick_cia(running_machine &machine, UINT8 pra, UINT8 dra)
{
- cd32_state *state = machine.driver_data<cd32_state>();
+ cubo_state *state = machine.driver_data<cubo_state>();
int i;
for (i = 0; i < 2; i++)
@@ -199,7 +488,7 @@ static void handle_cd32_joystick_cia(running_machine &machine, UINT8 pra, UINT8
static UINT16 handle_joystick_potgor(running_machine &machine, UINT16 potgor)
{
- cd32_state *state = machine.driver_data<cd32_state>();
+ cubo_state *state = machine.driver_data<cubo_state>();
ioport_port * player_portname[] = { state->m_p2_port, state->m_p1_port };
int i;
@@ -227,14 +516,12 @@ static UINT16 handle_joystick_potgor(running_machine &machine, UINT16 potgor)
return potgor;
}
-CUSTOM_INPUT_MEMBER(cd32_state::cubo_input)
+CUSTOM_INPUT_MEMBER( cubo_state::cubo_input )
{
return handle_joystick_potgor(machine(), m_potgo_value) >> 8;
}
-
-
-CUSTOM_INPUT_MEMBER(cd32_state::cd32_sel_mirror_input)
+CUSTOM_INPUT_MEMBER( cubo_state::cd32_sel_mirror_input )
{
ioport_port* ports[2]= { m_p1_port, m_p2_port };
UINT8 bits = ports[(int)(FPTR)param]->read();
@@ -243,26 +530,26 @@ CUSTOM_INPUT_MEMBER(cd32_state::cd32_sel_mirror_input)
-static INPUT_PORTS_START( cd32 )
+static INPUT_PORTS_START( cubo )
PORT_START("CIA0PORTA")
PORT_BIT( 0x3f, IP_ACTIVE_LOW, IPT_SPECIAL )
/* this is the regular port for reading a single button joystick on the Amiga, many CD32 games require this to mirror the pad start button! */
- PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, cd32_state,cd32_sel_mirror_input, 1)
- PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, cd32_state,cd32_sel_mirror_input, 0)
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, cubo_state,cd32_sel_mirror_input, 1)
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, cubo_state,cd32_sel_mirror_input, 0)
PORT_START("CIA0PORTB")
PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNKNOWN )
- PORT_START("JOY0DAT")
- PORT_BIT( 0x0303, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, cd32_state,amiga_joystick_convert, 1)
+ PORT_START("joy_0_dat")
+ PORT_BIT( 0x0303, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, cubo_state, amiga_joystick_convert, 1)
PORT_BIT( 0xfcfc, IP_ACTIVE_HIGH, IPT_UNUSED )
- PORT_START("JOY1DAT")
- PORT_BIT( 0x0303, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, cd32_state,amiga_joystick_convert, 0)
+ PORT_START("joy_1_dat")
+ PORT_BIT( 0x0303, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, cubo_state, amiga_joystick_convert, 0)
PORT_BIT( 0xfcfc, IP_ACTIVE_HIGH, IPT_UNUSED )
- PORT_START("POTGO")
- PORT_BIT( 0xff00, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, cd32_state,cubo_input, 0)
+ PORT_START("potgo")
+ PORT_BIT( 0xff00, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, cubo_state,cubo_input, 0)
PORT_BIT( 0x00ff, IP_ACTIVE_HIGH, IPT_UNUSED )
@@ -275,7 +562,7 @@ static INPUT_PORTS_START( cd32 )
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_PLAYER(1) PORT_NAME("P1 Yellow") /* BUTTON4 */
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_PLAYER(1) PORT_NAME("P1 Red / SELECT") /* BUTTON1 = START1 */
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON7 ) PORT_PLAYER(1) PORT_NAME("P1 Blue / STOP") /* BUTTON2 */
- PORT_START("P1JOY")
+ PORT_START("p1_joy")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(1)
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1)
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1)
@@ -290,7 +577,7 @@ static INPUT_PORTS_START( cd32 )
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_PLAYER(2) PORT_NAME("P2 Yellow") /* BUTTON4 */
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_PLAYER(2) PORT_NAME("P2 Red / SELECT") /* BUTTON1 = START2 */
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON7 ) PORT_PLAYER(2) PORT_NAME("P2 Blue / STOP") /* BUTTON2 */
- PORT_START("P2JOY")
+ PORT_START("p2_joy")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(2)
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2)
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2)
@@ -352,7 +639,7 @@ static INPUT_PORTS_START( cd32 )
INPUT_PORTS_END
static INPUT_PORTS_START( cndypuzl )
- PORT_INCLUDE( cd32 )
+ PORT_INCLUDE( cubo )
PORT_MODIFY("P1")
PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_UNKNOWN )
@@ -385,7 +672,7 @@ static INPUT_PORTS_START( cndypuzl )
INPUT_PORTS_END
static INPUT_PORTS_START( haremchl )
- PORT_INCLUDE( cd32 )
+ PORT_INCLUDE( cubo )
PORT_MODIFY("P1")
PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_UNKNOWN )
@@ -418,15 +705,15 @@ static INPUT_PORTS_START( haremchl )
INPUT_PORTS_END
static INPUT_PORTS_START( lsrquiz )
- PORT_INCLUDE( cd32 )
+ PORT_INCLUDE( cubo )
- PORT_MODIFY("P1JOY")
+ PORT_MODIFY("p1_joy")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNKNOWN )
- PORT_MODIFY("P2JOY")
+ PORT_MODIFY("p2_joy")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNKNOWN )
@@ -463,15 +750,15 @@ static INPUT_PORTS_START( lsrquiz )
INPUT_PORTS_END
static INPUT_PORTS_START( lsrquiz2 )
- PORT_INCLUDE( cd32 )
+ PORT_INCLUDE( cubo )
- PORT_MODIFY("P1JOY")
+ PORT_MODIFY("p1_joy")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNKNOWN )
- PORT_MODIFY("P2JOY")
+ PORT_MODIFY("p2_joy")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNKNOWN )
@@ -521,12 +808,12 @@ static INPUT_PORTS_START( lsrquiz2 )
INPUT_PORTS_END
static INPUT_PORTS_START( lasstixx )
- PORT_INCLUDE( cd32 )
+ PORT_INCLUDE( cubo )
PORT_MODIFY("CIA0PORTA")
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START1 )
- PORT_MODIFY("P2JOY")
+ PORT_MODIFY("p2_joy")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNKNOWN )
@@ -563,11 +850,11 @@ static INPUT_PORTS_START( lasstixx )
INPUT_PORTS_END
static INPUT_PORTS_START( mgnumber )
- PORT_INCLUDE( cd32 )
+ PORT_INCLUDE( cubo )
#if MGNUMBER_USE_JOY
- /* P1JOY, P2JOY, P1 and P2 inputs when control panel is set to "joystick" in the dispenser setup */
- PORT_MODIFY("P2JOY")
+ /* p1_joy, p2_joy, P1 and P2 inputs when control panel is set to "joystick" in the dispenser setup */
+ PORT_MODIFY("p2_joy")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNKNOWN )
@@ -593,9 +880,9 @@ static INPUT_PORTS_START( mgnumber )
PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_UNKNOWN )
#else
- /* P1JOY, P2JOY, P1 and P2 inputs when control panel is set to "buttons" ("pulsanti") in the dispenser setup */
- /* P1JOY is still needed in the dispenser setup, so I don't remove it even if it isn't needed to play the game */
- PORT_MODIFY("P2JOY")
+ /* p1_joy, p2_joy, P1 and P2 inputs when control panel is set to "buttons" ("pulsanti") in the dispenser setup */
+ /* p1_joy is still needed in the dispenser setup, so I don't remove it even if it isn't needed to play the game */
+ PORT_MODIFY("p2_joy")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNKNOWN )
@@ -638,15 +925,15 @@ static INPUT_PORTS_START( mgnumber )
INPUT_PORTS_END
static INPUT_PORTS_START( mgprem11 )
- PORT_INCLUDE( cd32 )
+ PORT_INCLUDE( cubo )
#if MGPREM11_USE_JOY
- /* P1JOY, P2JOY, P1 and P2 inputs when control panel is set to "joystick" in the dispenser setup */
- PORT_MODIFY("P1JOY")
+ /* p1_joy, p2_joy, P1 and P2 inputs when control panel is set to "joystick" in the dispenser setup */
+ PORT_MODIFY("p1_joy")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNKNOWN )
- PORT_MODIFY("P2JOY")
+ PORT_MODIFY("p2_joy")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNKNOWN )
@@ -672,15 +959,15 @@ static INPUT_PORTS_START( mgprem11 )
PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_BUTTON10 ) PORT_PLAYER(1) PORT_NAME( "P2 B (setup)" )
PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_UNKNOWN )
#else
- /* P1JOY, P2JOY, P1 and P2 inputs when control panel is set to "buttons" ("pulsanti") in the dispenser setup */
- /* P1JOY is still needed in the dispenser setup, so I don't remove it even if it isn't needed to play the game */
- PORT_MODIFY("P1JOY")
+ /* p1_joy, p2_joy, P1 and P2 inputs when control panel is set to "buttons" ("pulsanti") in the dispenser setup */
+ /* p1_joy is still needed in the dispenser setup, so I don't remove it even if it isn't needed to play the game */
+ PORT_MODIFY("p1_joy")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNKNOWN )
- PORT_MODIFY("P2JOY")
+ PORT_MODIFY("p2_joy")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNKNOWN )
@@ -730,427 +1017,91 @@ static INPUT_PORTS_START( mgprem11 )
INPUT_PORTS_END
-/*************************************
- *
- * Sound definitions
- *
- *************************************/
-
-#define NVRAM_SIZE 1024
-#define NVRAM_PAGE_SIZE 16 /* max size of one write request */
-static MACHINE_CONFIG_START( cd32base, cd32_state )
+static MACHINE_CONFIG_START( cubo, cubo_state )
/* basic machine hardware */
- MCFG_CPU_ADD("maincpu", M68EC020, AMIGA_68EC020_PAL_CLOCK) /* 14.3 Mhz */
- MCFG_CPU_PROGRAM_MAP(cd32_map)
- MCFG_DEVICE_ADD("akiko", AKIKO, 0)
+ MCFG_CPU_ADD("maincpu", M68EC020, amiga_state::CLK_28M_PAL / 2)
+ MCFG_CPU_PROGRAM_MAP(cubo_mem)
- MCFG_MACHINE_START_OVERRIDE(amiga_state, amiga )
- MCFG_MACHINE_RESET_OVERRIDE(amiga_state,amiga)
+ MCFG_DEVICE_ADD("overlay", ADDRESS_MAP_BANK, 0)
+ MCFG_DEVICE_PROGRAM_MAP(overlay_2mb_map32)
+ MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_BIG)
+ MCFG_ADDRESS_MAP_BANK_DATABUS_WIDTH(32)
+ MCFG_ADDRESS_MAP_BANK_ADDRBUS_WIDTH(22)
+ MCFG_ADDRESS_MAP_BANK_STRIDE(0x200000)
MCFG_I2CMEM_ADD("i2cmem")
- MCFG_I2CMEM_PAGE_SIZE(NVRAM_PAGE_SIZE)
- MCFG_I2CMEM_DATA_SIZE(NVRAM_SIZE)
+ MCFG_I2CMEM_PAGE_SIZE(16)
+ MCFG_I2CMEM_DATA_SIZE(1024)
- /* video hardware */
+ MCFG_AKIKO_ADD("akiko", "maincpu")
+ MCFG_AKIKO_SCL_HANDLER(DEVWRITELINE("i2cmem", i2cmem_device, write_scl))
+ MCFG_AKIKO_SDA_READ_HANDLER(DEVREADLINE("i2cmem", i2cmem_device, read_sda))
+ MCFG_AKIKO_SDA_WRITE_HANDLER(DEVWRITELINE("i2cmem", i2cmem_device, write_sda))
+
+ // video hardware
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK)
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(512*2, 312)
- MCFG_SCREEN_VISIBLE_AREA((129-8-8)*2, (449+8-1+8)*2, 44-8, 300+8-1)
+ MCFG_SCREEN_RAW_PARAMS(amiga_state::CLK_28M_PAL / 4 * 2, 910, 186, 910, 312, 29 /* 26 */, 312)
MCFG_SCREEN_UPDATE_DRIVER(amiga_state, screen_update_amiga_aga)
- MCFG_VIDEO_START_OVERRIDE(cd32_state,amiga_aga)
+ MCFG_VIDEO_START_OVERRIDE(amiga_state, amiga_aga)
/* sound hardware */
MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
- MCFG_SOUND_ADD("amiga", AMIGA, 3579545)
+ MCFG_SOUND_ADD("amiga", AMIGA, amiga_state::CLK_C1_PAL)
MCFG_SOUND_ROUTE(0, "lspeaker", 0.25)
MCFG_SOUND_ROUTE(1, "rspeaker", 0.25)
MCFG_SOUND_ROUTE(2, "rspeaker", 0.25)
MCFG_SOUND_ROUTE(3, "lspeaker", 0.25)
- MCFG_SOUND_ADD( "cdda", CDDA, 0 )
- MCFG_SOUND_ROUTE( 0, "lspeaker", 0.50 )
- MCFG_SOUND_ROUTE( 1, "rspeaker", 0.50 )
+ MCFG_SOUND_ADD("cdda", CDDA, 0)
+ MCFG_SOUND_ROUTE(0, "lspeaker", 0.50)
+ MCFG_SOUND_ROUTE(1, "rspeaker", 0.50)
/* cia */
// these are setup differently on other amiga drivers (needed for floppy to work) which is correct / why?
- MCFG_DEVICE_ADD("cia_0", LEGACY_MOS8520, AMIGA_68EC020_PAL_CLOCK / 10)
- MCFG_MOS6526_IRQ_CALLBACK(WRITELINE(amiga_state, amiga_cia_0_irq))
+ MCFG_DEVICE_ADD("cia_0", LEGACY_MOS8520, amiga_state::CLK_E_PAL)
+ MCFG_MOS6526_IRQ_CALLBACK(WRITELINE(amiga_state, cia_0_irq))
MCFG_MOS6526_PA_INPUT_CALLBACK(IOPORT("CIA0PORTA"))
- MCFG_MOS6526_PA_OUTPUT_CALLBACK(WRITE8(cd32_state,cd32_cia_0_porta_w))
- MCFG_MOS6526_PB_INPUT_CALLBACK(READ8(cd32_state,cd32_cia_0_portb_r))
- MCFG_MOS6526_PB_OUTPUT_CALLBACK(WRITE8(cd32_state,cd32_cia_0_portb_w))
- MCFG_DEVICE_ADD("cia_1", LEGACY_MOS8520, AMIGA_68EC020_PAL_CLOCK / 10)
- MCFG_MOS6526_IRQ_CALLBACK(WRITELINE(amiga_state, amiga_cia_1_irq))
+ MCFG_MOS6526_PA_OUTPUT_CALLBACK(WRITE8(cubo_state, akiko_cia_0_port_a_write))
+ MCFG_DEVICE_ADD("cia_1", LEGACY_MOS8520, amiga_state::CLK_E_PAL)
+ MCFG_MOS6526_IRQ_CALLBACK(WRITELINE(amiga_state, cia_1_irq))
+
+ MCFG_MICROTOUCH_ADD("microtouch", WRITE8(cubo_state, microtouch_tx))
- MCFG_MICROTOUCH_ADD( "microtouch", WRITE8(cd32_state, microtouch_tx) )
+ MCFG_CDROM_ADD("cd32_cdrom")
+ MCFG_CDROM_INTERFACE("cd32_cdrom")
/* fdc */
- MCFG_DEVICE_ADD("fdc", AMIGA_FDC, AMIGA_68000_NTSC_CLOCK)
+ MCFG_DEVICE_ADD("fdc", AMIGA_FDC, amiga_state::CLK_7M_PAL)
MCFG_AMIGA_FDC_INDEX_CALLBACK(DEVWRITELINE("cia_1", legacy_mos6526_device, flag_w))
MACHINE_CONFIG_END
-static MACHINE_CONFIG_DERIVED( cd32, cd32base )
- MCFG_CDROM_ADD( "cdrom" )
- MCFG_CDROM_INTERFACE("cd32_cdrom")
- MCFG_SOFTWARE_LIST_ADD("cd_list","cd32")
-MACHINE_CONFIG_END
-
#define ROM_LOAD16_WORD_BIOS(bios,name,offset,length,hash) ROMX_LOAD(name, offset, length, hash, ROM_BIOS(bios+1))
#define CD32_BIOS \
- ROM_REGION32_BE(0x100000, "user1", 0 ) \
+ ROM_REGION32_BE(0x100000, "kickstart", 0 ) \
ROM_SYSTEM_BIOS(0, "cd32", "Kickstart v3.1 rev 40.60 with CD32 Extended-ROM" ) \
ROM_LOAD16_WORD_BIOS(0, "391640-03.u6a", 0x000000, 0x100000, CRC(d3837ae4) SHA1(06807db3181637455f4d46582d9972afec8956d9) )
-ROM_START( cd32 )
+ROM_START( cubo )
CD32_BIOS
ROM_END
-ROM_START( cd32bios )
- CD32_BIOS
-ROM_END
/***************************************************************************************************/
-DRIVER_INIT_MEMBER(cd32_state,cd32)
+DRIVER_INIT_MEMBER( cubo_state, cubo )
{
- static const amiga_machine_interface cd32_intf =
- {
- AGA_CHIP_RAM_MASK,
- NULL, NULL, cd32_potgo_w,
- NULL,
- NULL, NULL,
- NULL,
- FLAGS_AGA_CHIPSET | FLAGS_IS_32BIT
- };
-
- /* configure our Amiga setup */
- amiga_machine_config(machine(), &cd32_intf);
-
- /* set up memory */
- m_bank1->configure_entry(0, m_chip_ram);
- m_bank1->configure_entry(1, memregion("user1")->base());
-
- /* input hack */
+ m_agnus_id = ALICE_PAL_NEW;
+ m_denise_id = LISA;
m_input_hack = NULL;
}
-/* BIOS */
-CONS( 1993, cd32, 0, 0, cd32, cd32, cd32_state, cd32, "Commodore Business Machines", "Amiga CD32 (PAL)" , GAME_NOT_WORKING )
-
-
-/*
-
- Cubo CD32 (additional hardware and games by CD Express, Milan, Italy)
-
- The CuboCD32 is a stock retail CD32 unit with additional hardware to adapt it
- for JAMMA use
-
- Known Games:
- Title | rev. | year
- ----------------------------------------------
- Candy Puzzle | 1.0 | 1995
- Harem Challenge | | 1995
- Laser Quiz | | 1995
- Laser Quiz 2 "Italy" | 1.0 | 1995
- Laser Strixx | | 1995
- Laser Strixx 2 | | 1995
- Magic Premium | 1.1 | 1996
- Laser Quiz France | 1.0 | 1995
- Odeon Twister | | 199x
- Odeon Twister 2 |202.19| 1999
-
-
- ToDo:
- - remove the hack needed to make inputs working
-
-
-Stephh's notes (based on the game M68EC020 code and some tests) :
-
-
-1) "Candy Puzzle"
-
-settings (A5=0x059ac0) :
-
- - 051ba0.w (-$7f20,A5) : difficulty player 1 (0)
- - 051ba2.w (-$7f1e,A5) : difficulty player 2 (0)
- - 051ba4.w (-$7f1c,A5) : challenge rounds (3)
- - 051ba6.w (-$7f1a,A5) : death in 2P mode (0) - 0 = NO / 1 = YES
- - 051ba8.w (-$7f18,A5) : play x credit (1)
- - 051bac.w (-$7f14,A5) : coin x 1 play (1)
- - 051bb0.w (-$7f10,A5) : maxpalleattack (2)
- - : reset high score - NO* / YES
- - 051baa.w (-$7f16,A5) : 1 coin 2 players (1) - 0 = NO / 1 = YES
-
-useful addresses :
-
- - 051c02.w (-$7ebe,A5) : must be 0x0000 instead of 0x0001 to accept coins !
- - 051c04.b (-$7ebc,A5) : credits
- - 051c10.l (-$7eb0,A5) : basic address for inputs = 0006fd18 :
- * BA + 1 x 6 + 4 : start 2 (bit 5)
- * BA + 1 x 6 + 0 : player 2 L/R (-1/0/1)
- * BA + 1 x 6 + 2 : player 2 U/D (-1/0/1)
- * BA + 0 x 6 + 4 : start 1 (bit 5)
- * BA + 0 x 6 + 0 : player 1 L/R (-1/0/1)
- * BA + 0 x 6 + 2 : player 1 U/D (-1/0/1)
-
-routines :
-
- - 07acae : inputs read
- - 092c8a : buttons + coin read
- * D0 = 0 : read POTGO (player 2)
- * D0 = 1 : read POTGO (player 1)
- - 092baa : joy read - test bits 1 and 9 : 1 if bit 1, -1 if bit 9, 0 if none
- * D0 = 0 : read JOY0DAT (player 2)
- * D0 = 1 : read JOY1DAT (player 1)
- - 092bd4 : joy read - test bits 0 and 8 : 1 if bit 0, -1 if bit 8, 0 if none ("eor.w read, read >> 1" before test)
- * D0 = 0 : read JOY0DAT (player 2)
- * D0 = 1 : read JOY1DAT (player 1)
-
- - 07ada4 : coin verification
- - 07d0fe : start buttons verification
-
-
-2) "Harem Challenge"
-
-settings (A5=0x00a688 & A2=0x0028e8) :
-
- - : photo level - soft* / erotic / porno
- - 002906.b (A2 + 0x1e) : difficulty (2) - 1 = LOW / 2 = NORMAL / 3 = HIGH
- - 0028fc.b (A2 + 0x14) : deadly selftouch (0) - 0 = NO / 1 = YES
- - 0028ff.b (A2 + 0x17) : energy supply - 100%* / 0% / 50%
- - 002900.b (A2 + 0x18) : area to cover 1P - 75% / 80%* / 85%
- - 002901.b (A2 + 0x19) : area to cover 2P - 70% / 75%* / 80%
- - 002902.w (A2 + 0x1a) : level time (00C8) - 0096 = 1:00 / 00C8 = 1:20 / 00FA = 1:40
- - 002904.b (A2 + 0x1c) : tournament mode (2) - 0 = NO CHALLENGE / 2 = BEST OF 3 / 3 = BEST OF 5
- - : reset hi-score - NO* / YES
- - 0028fd.b (A2 + 0x15) : coin x 1 play (1) <=> number of credits used for each play
- - 0028fe.b (A2 + 0x16) : play x credit (1) <=> credits awarded for each coin
- - : demo photo level - soft* / erot
-
-useful addresses :
-
- - 002907.b (-$7f00,A5 -> $1f,A2) : must be 0x00 instead of 0x01 to accept coins !
- - 00278c.w (-$7efc,A5) : player 2 inputs
- - 00278e.w (-$7efa,A5) : player 1 inputs
- - 002790.b (-$7ef8,A5) : credits
-
- - 0028e8.b (A2 ) : level - range (0x01 - 0x09 and 0x00 when in "attract mode")
- - 0028ea.w (A2 + 0x02) : time (not used for "continue play") - range (0x0000 - 0x0014 with 0x0000 being max)
-
- - 026fe8.l (-$7fa0,A5 -> A2 + $18 x 0 + 0x00) : player 1 energy (in MSW after swap) - range (0x00000000 - 0x00270000)
- - 026fec.l (-$7fa0,A5 -> A2 + $18 x 0 + 0x04) : player 1 score
- - 026ff8.w (-$7fa0,A5 -> A2 + $18 x 0 + 0x10) : player 1 girls
- - 027000.l (-$7fa0,A5 -> A2 + $18 x 1 + 0x00) : player 2 energy (in MSW after swap) - range (0x00000000 - 0x00270000)
- - 027004.l (-$7fa0,A5 -> A2 + $18 x 1 + 0x04) : player 2 score
- - 027010.w (-$7fa0,A5 -> A2 + $18 x 1 + 0x10) : player 2 girls
-
-routines :
-
- - 04a5de : inputs read
- - 061928 : buttons + coin read
- * D0 = 0 : read POTGO (player 2)
- * D0 = 1 : read POTGO (player 1)
-
- - 04a692 : coin verification
- - 050b8c : start buttons verification
-
-
-3) "Laser Quiz"
-
-settings (A5=0x00a580 & A2=0x001e08) :
-
- - 001a54.w (see below) : numero di vite (2)
- - 001e08.w (A2 ) : primo bonus dom. (5)
- - 001e0a.w (A2 + 0x02) : max dom. facili (7)
- - 001e0c.w (A2 + 0x04) : incremento dom. (2)
- - 001e0e.w (A2 + 0x06) : inizio dom. diff. (10)
- - 001e10.w (A2 + 0x08) : risposte a video (4)
- - 001e12.w (A2 + 0x0a) : checkmark risp. (1) - 0 = CONTEMPORANEO / 1 = IMMEDIATO
- - 001e16.w (A2 + 0x0e) : vel. chronometro (32) - 3C = LENTA / 32 = NORMALE / 28 = VELOCE
- - 001e14.w (A2 + 0x0c) : volume musica (14) - 14 = NORMALE / 0A = BASSO / 00 = NO MUSICA
- - 001e18.b (A2 + 0x10) : vita premio bonus (1) - 0 = PER IL PRIMO / 1 = PER EMTRAMBI
- - : reset hi-score - NO* / SI
- - 001e19.b (A2 + 0x11) : coin x 1 play (1) <=> number of credits used for each play
- - 001e1a.b (A2 + 0x12) : foto erotiche (1) - 1 = SI / 2 = NO
-
-useful addresses :
-
- - 001e1b.b (-$7fe0,A5 -> $13,A2) : must be 0x00 instead of 0x01 to accept coins !
- - 0026a4.w (-$7f0c,A5) : player 2 inputs
- - 0026a6.w (-$7f0a,A5) : player 1 inputs
- - 002606.b (-$7faa,A5) : credits
-
- - 001a54.w (-$7fe4,A5 -> $04,A2) : lives at start
- - 001a59.b (-$7fe4,A5 -> $09,A2) : bonus level (so lives aren't decremented) ? 0x00 = NO / 0x01 YES
- - 001a5a.b (-$7fe4,A5 -> $0a,A2) : level - range 0x00-0x63
-
- - 00c9b0.b (-$7fdc,A5 -> A2 + $06 x 0 + 0x00) : player 1 active ? 0x00 = NO / 0x01 YES / 0x02 = "ATTENDI"
- - 00c9b1.b (-$7fdc,A5 -> A2 + $06 x 0 + 0x01) : player 1 lives - range 0x00-0x63
- - 00c9b2.l (-$7fdc,A5 -> A2 + $06 x 0 + 0x02) : player 1 score
- - 00c9b6.b (-$7fdc,A5 -> A2 + $06 x 1 + 0x00) : player 2 active ? 0x00 = NO / 0x01 YES / 0x02 = "ATTENDI"
- - 00c9b7.b (-$7fdc,A5 -> A2 + $06 x 1 + 0x01) : player 2 lives - range 0x00-0x63
- - 00c9b8.l (-$7fdc,A5 -> A2 + $06 x 1 + 0x02) : player 2 score
-
- - 02327c.l (-$50,A4) : player 1 inputs (ingame)
- - 023280.l (-$4c,A4) : player 2 inputs (ingame)
-
-routines :
-
- - 0cedf8 : inputs read
- - 0d8150 : buttons + coin read
- * D0 = 0 : read POTGO (player 2)
- * D0 = 1 : read POTGO (player 1)
-
- - 0cee42 : coin verification
- - 0cefc6 : start buttons verification
-
- - 0cb40c : inputs (ingame) read
-
-
-4) "Laser Quiz 2"
-
-settings (A5=0x0531e8 & A2=0x0460f0) :
-
- - 0460f0.w (A2 ) : numero di vite (2)
- - 0460f0.w (A2 + 0x02) : primo bonus dom. (5)
- - 0460f0.w (A2 + 0x04) : max dom. facili (7)
- - 0460f0.w (A2 + 0x06) : incremento dom. (2)
- - 0460f0.w (A2 + 0x08) : inizio dom. diff. (10)
- - 0460f0.w (A2 + 0x0a) : risposte a video (4)
- - 0460f0.w (A2 + 0x0c) : checkmark risp. (1) - 0 = CONTEMPORANEO / 1 = IMMEDIATO
- - 0460f0.w (A2 + 0x10) : vel. chronometro (5) - 5 = LENTA / 4 = NORMALE / 3 = VELOCE
- - 0460f0.w (A2 + 0x0e) : volume musica (3F) - 3F = NORMALE / 20 = BASSO / 00 = NO MUSICA
- - 0460f0.b (A2 + 0x12) : vita premio bonus (1) - 0 = PER IL PRIMO / 1 = PER TUTTI
- - : reset hi-score - NO* / SI
- - 0460f0.b (A2 + 0x13) : coin x 1 play (1) <=> number of credits used for each play
- - 0460f0.b (A2 + 0x14) : play x credit (1) <=> credits awarded for each coin
- - 0460f0.b (A2 + 0x15) : foto erotiche (1) - 1 = SI / 2 = NO
- - 0460f0.b (A2 + 0x16) : numero giocatori (0) - 0 = 2 / 1 = 4
-
-useful addresses :
-
- - 046107.b (-$7fdc,A5 -> $17,A2) : must be 0x00 instead of 0x01 to accept coins !
- - 04b250.w (-$7f98,A5) : player 2 inputs
- - 04b252.w (-$7f96,A5) : player 1 inputs
- - 04b254.w (-$7f94,A5) : player 3 inputs
- - 04b256.w (-$7f92,A5) : player 4 inputs
- - 04b248.b (-$7fa0,A5) : credits
-
- - 04570d.b (-$7fe0,A5 -> $05,A2) : bonus level (so lives aren't decremented) ? 0x00 = NO / 0x01 YES
- - 04570e.b (-$7fe4,A5 -> $06,A2) : level - range 0x00-0x63
-
- - 051fc0.b (-$7fd8,A5 -> A2 + $12 x 0 + 0x00) : player 1 active ? 0x00 = NO / 0x01 = YES / 0x02 = "ATTENDI"
- - 051fc1.b (-$7fd8,A5 -> A2 + $12 x 0 + 0x01) : player 1 lives - range 0x00-0x63
- - 051fc2.l (-$7fd8,A5 -> A2 + $12 x 0 + 0x02) : player 1 score
- - 051fd2.b (-$7fd8,A5 -> A2 + $12 x 1 + 0x00) : player 2 active ? 0x00 = NO / 0x01 = YES / 0x02 = "ATTENDI"
- - 051fd3.b (-$7fd8,A5 -> A2 + $12 x 1 + 0x01) : player 2 lives - range 0x00-0x63
- - 051fd4.l (-$7fd8,A5 -> A2 + $12 x 1 + 0x02) : player 2 score
- - 051fe4.b (-$7fd8,A5 -> A2 + $12 x 2 + 0x00) : player 3 active ? 0x00 = NO / 0x01 = YES / 0x02 = "ATTENDI"
- - 051fe5.b (-$7fd8,A5 -> A2 + $12 x 2 + 0x01) : player 3 lives - range 0x00-0x63
- - 051fe6.l (-$7fd8,A5 -> A2 + $12 x 2 + 0x02) : player 3 score
- - 051ff6.b (-$7fd8,A5 -> A2 + $12 x 3 + 0x00) : player 4 active ? 0x00 = NO / 0x01 = YES / 0x02 = "ATTENDI"
- - 051ff7.b (-$7fd8,A5 -> A2 + $12 x 3 + 0x01) : player 4 lives - range 0x00-0x63
- - 051ff8.l (-$7fd8,A5 -> A2 + $12 x 3 + 0x02) : player 4 score
-
-routines :
-
- - 0746d6 : inputs read
- - 08251a : buttons + coin read
- * D0 = 0 : read POTGO (player 2)
- * D0 = 1 : read POTGO (player 1)
-
- - 07472e : coin verification
-
-
-5) "Laser Strixx 2"
-
-settings (A5=0x00a688 & A2=0x0027f8) :
-
- - : photo level - soft* / erotic / porno
- - 002910.l (A2 + 0x18) : difficulty (00010000) - 00008000 = LOW / 00010000 = NORMAL / 00018000 = HIGH
- - 002818.b (A2 + 0x20) : deadly selftouch (0) - 0 = NO / 1 = YES
- - 00281b.b (A2 + 0x23) : energy supply - 100%* / 0% / 50%
- - 002819.b (A2 + 0x21) : coin x 1 play (1) <=> number of credits used for each play
- - 00281a.b (A2 + 0x22) : play x credit (1) <=> credits awarded for each coin
-
-useful addresses :
-
- - 00281c.b (-$7fa2,A5 -> $24,A2) : must be 0x00 instead of 0x01 to accept coins !
- - 0026f4.l (-$7f94,A5) : player 1 inputs (in MSW after swap)
- - 0026ee.b (-$7f9a,A5) : credits
-
- - 0027f8.l (A2 + 0x00) : player 1 energy (in MSW after swap) - range (0x00000000 - 0x00270000)
- - 0027fc.b (A2 + 0x04) : level - range (0x01 - 0x09 and 0x00 when in "attract mode")
- - 0027fe.w (A2 + 0x06) : time (not used for "continue play") - range (0x0000 - 0x0014 with 0x0000 being max)
- - 002800.l (A2 + 0x08) : player 1 score
- - 00280a.b (A2 + 0x12) : mouth status (0x00 = not out - 0x01 = out - 0x02 = captured = LIVE STRIP at the end of level)
- - 00280b.b (A2 + 0x13) : strip phase (0x01 - n with 0x01 being last phase)
- Ann : n = 0x05
- Eva : n = 0x04
- Jo : n = 0x06
- Sue : n = 0x04
- Bob : n = 0x05
-
-routines :
-
- - 04d1ae : inputs read
- - 058340 : buttons + coin read
- * D0 = 0 : read POTGO (player 2)
- * D0 = 1 : read POTGO (player 1)
-
- - 04d1da : coin verification
-
-
-6) "Magic Number"
-
-settings (A5=0x053e78 & A2=0x03f540) : TO DO !
-
-useful addresses :
-
- - 04bfa0.l (-$7ed8,A5) : must be 0x00000000 instead of 0x00010000 to accept coins !
- - 04bf18.w (-$7f60,A5) : player 1 inputs (in MSW after swap)
- - 04bf78.l (-$7e00,A5) : player 2 inputs (in MSW after swap)
- - 03f547.b (-$7f92,A5 -> $7,A2) : credits
-
-routines :
-
- - 07a480 : inputs read
- - 085bb8 : buttons + coin read
- * D0 = 0 : read POTGO (player 2)
- * D0 = 1 : read POTGO (player 1)
-
- - 07a50e : coin verification
-
-
-7) "Magic Premium"
-
-settings (A5=0x04ce48 & A2=0x0419b0) : TO DO !
-
-useful addresses :
-
- - 044f7e.b (-$7eca,A5) : must be 0x00 instead of 0x01 to accept coins !
- - 044f02.w (-$7f94,A5) : player 1 inputs
- - 044f6a.l (-$7ede,A5) : player 2 inputs (in MSW after swap)
- - 0419b1.b (-$7fc0,A5 -> $1,A2) : credits - range 0x00-0x09
-
-routines :
-
- - 0707d6 : inputs read
- - 07b3b2 : buttons + coin read
- * D0 = 0 : read POTGO (player 2)
- * D0 = 1 : read POTGO (player 1)
-
- - 070802 : coin verification
-
-*/
ROM_START( cndypuzl )
@@ -1217,149 +1168,114 @@ ROM_END
*
*************************************/
-static void cndypuzl_input_hack(running_machine &machine)
+void cubo_state::cndypuzl_input_hack()
{
- cd32_state *state = machine.driver_data<cd32_state>();
- cpu_device* thiscpu = (cpu_device*)state->m_maincpu;
-
- if (thiscpu->pc() < state->m_chip_ram.bytes())
+ if (m_maincpu->pc < m_chip_ram.bytes())
{
- //(*state->m_chip_ram_w)(0x051c02, 0x0000);
-
- UINT32 r_A5 = state->m_maincpu->state_int(M68K_A5);
- (*state->m_chip_ram_w)(state, r_A5 - 0x7ebe, 0x0000);
+ UINT32 r_A5 = m_maincpu->state_int(M68K_A5);
+ (*m_chip_ram_w)(this, r_A5 - 0x7ebe, 0x0000);
}
}
-DRIVER_INIT_MEMBER(cd32_state,cndypuzl)
+DRIVER_INIT_MEMBER( cubo_state, cndypuzl )
{
- DRIVER_INIT_CALL(cd32);
- m_input_hack = cndypuzl_input_hack;
+ DRIVER_INIT_CALL(cubo);
+ m_input_hack = &cubo_state::cndypuzl_input_hack;
}
-static void haremchl_input_hack(running_machine &machine)
+void cubo_state::haremchl_input_hack()
{
- cd32_state *state = machine.driver_data<cd32_state>();
- cpu_device* thiscpu = (cpu_device*)state->m_maincpu;
-
- if (thiscpu->pc() < state->m_chip_ram.bytes())
+ if (m_maincpu->pc < m_chip_ram.bytes())
{
- //amiga_chip_ram_w8(state, 0x002907, 0x00);
-
- UINT32 r_A5 = state->m_maincpu->state_int(M68K_A5);
- UINT32 r_A2 = ((*state->m_chip_ram_r)(state, r_A5 - 0x7f00 + 0) << 16) | ((*state->m_chip_ram_r)(state, r_A5 - 0x7f00 + 2));
- amiga_chip_ram_w8(state, r_A2 + 0x1f, 0x00);
+ UINT32 r_A5 = m_maincpu->state_int(M68K_A5);
+ UINT32 r_A2 = ((*m_chip_ram_r)(this, r_A5 - 0x7f00 + 0) << 16) | ((*m_chip_ram_r)(this, r_A5 - 0x7f00 + 2));
+ amiga_chip_ram_w8(this, r_A2 + 0x1f, 0x00);
}
}
-DRIVER_INIT_MEMBER(cd32_state,haremchl)
+DRIVER_INIT_MEMBER( cubo_state, haremchl )
{
- DRIVER_INIT_CALL(cd32);
- m_input_hack = haremchl_input_hack;
+ DRIVER_INIT_CALL(cubo);
+ m_input_hack = &cubo_state::haremchl_input_hack;
}
-static void lsrquiz_input_hack(running_machine &machine)
+void cubo_state::lsrquiz_input_hack()
{
- cd32_state *state = machine.driver_data<cd32_state>();
- cpu_device* thiscpu = (cpu_device*)state->m_maincpu;
-
- if (thiscpu->pc() < state->m_chip_ram.bytes())
+ if (m_maincpu->pc < m_chip_ram.bytes())
{
- //amiga_chip_ram_w8(state, 0x001e1b, 0x00);
-
- UINT32 r_A5 = state->m_maincpu->state_int(M68K_A5);
- UINT32 r_A2 = ((*state->m_chip_ram_r)(state, r_A5 - 0x7fe0 + 0) << 16) | ((*state->m_chip_ram_r)(state, r_A5 - 0x7fe0 + 2));
- amiga_chip_ram_w8(state, r_A2 + 0x13, 0x00);
+ UINT32 r_A5 = m_maincpu->state_int(M68K_A5);
+ UINT32 r_A2 = ((*m_chip_ram_r)(this, r_A5 - 0x7fe0 + 0) << 16) | ((*m_chip_ram_r)(this, r_A5 - 0x7fe0 + 2));
+ amiga_chip_ram_w8(this, r_A2 + 0x13, 0x00);
}
}
-DRIVER_INIT_MEMBER(cd32_state,lsrquiz)
+DRIVER_INIT_MEMBER( cubo_state, lsrquiz )
{
- DRIVER_INIT_CALL(cd32);
- m_input_hack = lsrquiz_input_hack;
+ DRIVER_INIT_CALL(cubo);
+ m_input_hack = &cubo_state::lsrquiz_input_hack;
}
/* The hack isn't working if you exit the test mode with P1 button 2 ! */
-static void lsrquiz2_input_hack(running_machine &machine)
+void cubo_state::lsrquiz2_input_hack()
{
- cd32_state *state = machine.driver_data<cd32_state>();
- cpu_device* thiscpu = (cpu_device*)state->m_maincpu;
-
- if (thiscpu->pc() < state->m_chip_ram.bytes())
+ if (m_maincpu->pc < m_chip_ram.bytes())
{
- //amiga_chip_ram_w8(state, 0x046107, 0x00);
-
- UINT32 r_A5 = state->m_maincpu->state_int(M68K_A5);
- UINT32 r_A2 = ((*state->m_chip_ram_r)(state, r_A5 - 0x7fdc + 0) << 16) | ((*state->m_chip_ram_r)(state, r_A5 - 0x7fdc + 2));
- amiga_chip_ram_w8(state, r_A2 + 0x17, 0x00);
+ UINT32 r_A5 = m_maincpu->state_int(M68K_A5);
+ UINT32 r_A2 = ((*m_chip_ram_r)(this, r_A5 - 0x7fdc + 0) << 16) | ((*m_chip_ram_r)(this, r_A5 - 0x7fdc + 2));
+ amiga_chip_ram_w8(this, r_A2 + 0x17, 0x00);
}
}
-DRIVER_INIT_MEMBER(cd32_state,lsrquiz2)
+DRIVER_INIT_MEMBER( cubo_state, lsrquiz2 )
{
- DRIVER_INIT_CALL(cd32);
- m_input_hack = lsrquiz2_input_hack;
+ DRIVER_INIT_CALL(cubo);
+ m_input_hack = &cubo_state::lsrquiz2_input_hack;
}
-static void lasstixx_input_hack(running_machine &machine)
+void cubo_state::lasstixx_input_hack()
{
- cd32_state *state = machine.driver_data<cd32_state>();
- cpu_device* thiscpu = (cpu_device*)state->m_maincpu;
-
- if (thiscpu->pc() < state->m_chip_ram.bytes())
+ if (m_maincpu->pc < m_chip_ram.bytes())
{
- //amiga_chip_ram_w8(state, 0x00281c, 0x00);
-
- UINT32 r_A5 = state->m_maincpu->state_int(M68K_A5);
- UINT32 r_A2 = ((*state->m_chip_ram_r)(state, r_A5 - 0x7fa2 + 0) << 16) | ((*state->m_chip_ram_r)(state, r_A5 - 0x7fa2 + 2));
- amiga_chip_ram_w8(state, r_A2 + 0x24, 0x00);
+ UINT32 r_A5 = m_maincpu->state_int(M68K_A5);
+ UINT32 r_A2 = ((*m_chip_ram_r)(this, r_A5 - 0x7fa2 + 0) << 16) | ((*m_chip_ram_r)(this, r_A5 - 0x7fa2 + 2));
+ amiga_chip_ram_w8(this, r_A2 + 0x24, 0x00);
}
}
-DRIVER_INIT_MEMBER(cd32_state,lasstixx)
+DRIVER_INIT_MEMBER(cubo_state, lasstixx)
{
- DRIVER_INIT_CALL(cd32);
- m_input_hack = lasstixx_input_hack;
+ DRIVER_INIT_CALL(cubo);
+ m_input_hack = &cubo_state::lasstixx_input_hack;
}
-static void mgnumber_input_hack(running_machine &machine)
+void cubo_state::mgnumber_input_hack()
{
- cd32_state *state = machine.driver_data<cd32_state>();
- cpu_device* thiscpu = (cpu_device*)state->m_maincpu;
-
- if (thiscpu->pc() < state->m_chip_ram.bytes())
+ if (m_maincpu->pc < m_chip_ram.bytes())
{
- //(*state->m_chip_ram_w)(0x04bfa0, 0x0000);
-
- UINT32 r_A5 = state->m_maincpu->state_int(M68K_A5);
- (*state->m_chip_ram_w)(state, r_A5 - 0x7ed8, 0x0000);
+ UINT32 r_A5 = m_maincpu->state_int(M68K_A5);
+ (*m_chip_ram_w)(this, r_A5 - 0x7ed8, 0x0000);
}
}
-DRIVER_INIT_MEMBER(cd32_state,mgnumber)
+DRIVER_INIT_MEMBER( cubo_state, mgnumber )
{
- DRIVER_INIT_CALL(cd32);
- m_input_hack = mgnumber_input_hack;
+ DRIVER_INIT_CALL(cubo);
+ m_input_hack = &cubo_state::mgnumber_input_hack;
}
-static void mgprem11_input_hack(running_machine &machine)
+void cubo_state::mgprem11_input_hack()
{
- cd32_state *state = machine.driver_data<cd32_state>();
- cpu_device* thiscpu = (cpu_device*)state->m_maincpu;
-
- if (thiscpu->pc() < state->m_chip_ram.bytes())
+ if (m_maincpu->pc < m_chip_ram.bytes())
{
- //amiga_chip_ram_w8(state, 0x044f7e, 0x00);
-
- UINT32 r_A5 = state->m_maincpu->state_int(M68K_A5);
- amiga_chip_ram_w8(state, r_A5 - 0x7eca, 0x00);
+ UINT32 r_A5 = m_maincpu->state_int(M68K_A5);
+ amiga_chip_ram_w8(this, r_A5 - 0x7eca, 0x00);
}
}
-DRIVER_INIT_MEMBER(cd32_state,mgprem11)
+DRIVER_INIT_MEMBER( cubo_state, mgprem11 )
{
- DRIVER_INIT_CALL(cd32);
- m_input_hack = mgprem11_input_hack;
+ DRIVER_INIT_CALL(cubo);
+ m_input_hack = &cubo_state::mgprem11_input_hack;
}
static INPUT_PORTS_START( odeontw2 )
@@ -1425,51 +1341,27 @@ static INPUT_PORTS_START( odeontw2 )
INPUT_PORTS_END
-static void serial_w(running_machine &machine, UINT16 data)
-{
- cd32_state *state = machine.driver_data<cd32_state>();
- UINT8 data8 = data & 0xff;
- if ( data8 != 0x00 )
- state->m_microtouch->rx(machine.driver_data()->generic_space(), 0, data8);
-}
-WRITE8_MEMBER (cd32_state::microtouch_tx)
+void cubo_state::serdat_w(UINT16 data)
{
- amiga_serial_in_w(machine(), data);
+ data &= 0xff;
+ if (data)
+ m_microtouch->rx(generic_space(), 0, data);
}
-DRIVER_INIT_MEMBER(cd32_state,odeontw2)
+WRITE8_MEMBER( cubo_state::microtouch_tx )
{
- static const amiga_machine_interface cd32_intf =
- {
- AGA_CHIP_RAM_MASK,
- NULL, NULL, cd32_potgo_w,
- serial_w,
- NULL, NULL,
- NULL,
- FLAGS_AGA_CHIPSET
- };
-
- /* configure our Amiga setup */
- amiga_machine_config(machine(), &cd32_intf);
-
- /* set up memory */
- m_bank1->configure_entry(0, m_chip_ram);
- m_bank1->configure_entry(1, memregion("user1")->base());
-
- /* input hack */
- m_input_hack = NULL;
+ serial_in_w(data);
}
-/***************************************************************************************************/
-// these are clones of the cd32 SYSTEM because they run on a stock retail unit, with additional HW
-GAME( 1993, cd32bios, 0, cd32base, cd32, cd32_state, cd32, ROT0, "Commodore Business Machines", "CD32 Bios", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND | GAME_IS_BIOS_ROOT )
-GAME( 1995, cndypuzl, cd32bios, cd32base, cndypuzl, cd32_state, cndypuzl, ROT0, "CD Express", "Candy Puzzle (v1.0)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND )
-GAME( 1995, haremchl, cd32bios, cd32base, haremchl, cd32_state, haremchl, ROT0, "CD Express", "Harem Challenge", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND )
-GAME( 1995, lsrquiz, cd32bios, cd32base, lsrquiz, cd32_state, lsrquiz, ROT0, "CD Express", "Laser Quiz Italy", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND ) /* no player 2 inputs (ingame) */
-GAME( 1995, lsrquiz2, cd32bios, cd32base, lsrquiz2, cd32_state, lsrquiz2, ROT0, "CD Express", "Laser Quiz 2 Italy (v1.0)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND )
-GAME( 1995, lasstixx, cd32bios, cd32base, lasstixx, cd32_state, lasstixx, ROT0, "CD Express", "Laser Strixx 2", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND )
-GAME( 1995, mgnumber, cd32bios, cd32base, mgnumber, cd32_state, mgnumber, ROT0, "CD Express", "Magic Number", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND )
-GAME( 1996, mgprem11, cd32bios, cd32base, mgprem11, cd32_state, mgprem11, ROT0, "CD Express", "Magic Premium (v1.1)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND )
-GAME( 1999, odeontw2, cd32bios, cd32base, odeontw2, cd32_state, odeontw2, ROT0, "CD Express", "Odeon Twister 2 (v202.19)", GAME_NOT_WORKING )
+
+GAME( 1993, cubo, 0, cubo, cubo, cubo_state, cubo, ROT0, "Commodore", "Cubo BIOS", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND | GAME_IS_BIOS_ROOT )
+GAME( 1995, cndypuzl, cubo, cubo, cndypuzl, cubo_state, cndypuzl, ROT0, "CD Express", "Candy Puzzle (v1.0)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND )
+GAME( 1995, haremchl, cubo, cubo, haremchl, cubo_state, haremchl, ROT0, "CD Express", "Harem Challenge", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND )
+GAME( 1995, lsrquiz, cubo, cubo, lsrquiz, cubo_state, lsrquiz, ROT0, "CD Express", "Laser Quiz Italy", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) /* no player 2 inputs (ingame) */
+GAME( 1995, lsrquiz2, cubo, cubo, lsrquiz2, cubo_state, lsrquiz2, ROT0, "CD Express", "Laser Quiz 2 Italy (v1.0)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND )
+GAME( 1995, lasstixx, cubo, cubo, lasstixx, cubo_state, lasstixx, ROT0, "CD Express", "Laser Strixx 2", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND )
+GAME( 1995, mgnumber, cubo, cubo, mgnumber, cubo_state, mgnumber, ROT0, "CD Express", "Magic Number", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND )
+GAME( 1996, mgprem11, cubo, cubo, mgprem11, cubo_state, mgprem11, ROT0, "CD Express", "Magic Premium (v1.1)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND )
+GAME( 1999, odeontw2, cubo, cubo, odeontw2, cubo_state, cubo, ROT0, "CD Express", "Odeon Twister 2 (v202.19)", GAME_NOT_WORKING )
diff --git a/src/mame/drivers/mquake.c b/src/mame/drivers/mquake.c
index 1784448c805..a16785a476d 100644
--- a/src/mame/drivers/mquake.c
+++ b/src/mame/drivers/mquake.c
@@ -40,82 +40,28 @@
#include "machine/nvram.h"
#include "machine/amigafdc.h"
+
class mquake_state : public amiga_state
{
public:
mquake_state(const machine_config &mconfig, device_type type, const char *tag)
- : amiga_state(mconfig, type, tag) { }
+ : amiga_state(mconfig, type, tag),
+ m_es5503(*this, "es5503"),
+ m_es5503_rom(*this, "es5503")
+ { }
DECLARE_DRIVER_INIT(mquake);
- DECLARE_MACHINE_RESET(mquake);
- DECLARE_WRITE8_MEMBER( mquake_cia_0_porta_w );
- DECLARE_READ8_MEMBER( mquake_cia_0_portb_r );
- DECLARE_WRITE8_MEMBER( mquake_cia_0_portb_w );
+
DECLARE_READ8_MEMBER( es5503_sample_r );
DECLARE_WRITE16_MEMBER( output_w );
DECLARE_READ16_MEMBER( coin_chip_r );
DECLARE_WRITE16_MEMBER( coin_chip_w );
-};
-
-/*************************************
- *
- * CIA-A port A access:
- *
- * PA7 = game port 1, pin 6 (fire)
- * PA6 = game port 0, pin 6 (fire)
- * PA5 = /RDY (disk ready)
- * PA4 = /TK0 (disk track 00)
- * PA3 = /WPRO (disk write protect)
- * PA2 = /CHNG (disk change)
- * PA1 = /LED (LED, 0=bright / audio filter control)
- * PA0 = OVL (ROM/RAM overlay bit)
- *
- *************************************/
-
-WRITE8_MEMBER(mquake_state::mquake_cia_0_porta_w)
-{
- /* switch banks as appropriate */
- m_bank1->set_entry(data & 1);
-
- /* swap the write handlers between ROM and bank 1 based on the bit */
- if ((data & 1) == 0)
- /* overlay disabled, map RAM on 0x000000 */
- m_maincpu->space(AS_PROGRAM).install_write_bank(0x000000, 0x07ffff, "bank1");
-
- else
- /* overlay enabled, map Amiga system ROM on 0x000000 */
- m_maincpu->space(AS_PROGRAM).unmap_write(0x000000, 0x07ffff);
-}
-
-
-
-/*************************************
- *
- * CIA-A port B access:
- *
- * PB7 = parallel data 7
- * PB6 = parallel data 6
- * PB5 = parallel data 5
- * PB4 = parallel data 4
- * PB3 = parallel data 3
- * PB2 = parallel data 2
- * PB1 = parallel data 1
- * PB0 = parallel data 0
- *
- *************************************/
-READ8_MEMBER(mquake_state::mquake_cia_0_portb_r)
-{
- /* parallel port */
- logerror("%s:CIA0_portb_r\n", machine().describe_context());
- return 0xff;
-}
+private:
+ required_device<es5503_device> m_es5503;
+ required_memory_region m_es5503_rom;
+};
-WRITE8_MEMBER(mquake_state::mquake_cia_0_portb_w)
-{
- /* parallel port */
- logerror("%s:CIA0_portb_w(%02x)\n", machine().describe_context(), data);
-}
@@ -125,26 +71,23 @@ WRITE8_MEMBER(mquake_state::mquake_cia_0_portb_w)
*
*************************************/
-READ8_MEMBER(mquake_state::es5503_sample_r)
+READ8_MEMBER( mquake_state::es5503_sample_r )
{
- UINT8 *rom = memregion("es5503")->base();
- es5503_device *es5503 = machine().device<es5503_device>("es5503");
-
- return rom[offset + (es5503->get_channel_strobe() * 0x10000)];
+ return m_es5503_rom->base()[offset + (m_es5503->get_channel_strobe() * 0x10000)];
}
static ADDRESS_MAP_START( mquake_es5503_map, AS_0, 8, mquake_state )
AM_RANGE(0x000000, 0x1ffff) AM_READ(es5503_sample_r)
ADDRESS_MAP_END
-WRITE16_MEMBER(mquake_state::output_w)
+WRITE16_MEMBER( mquake_state::output_w )
{
if (ACCESSING_BITS_0_7)
logerror("%06x:output_w(%x) = %02x\n", space.device().safe_pc(), offset, data);
}
-READ16_MEMBER(mquake_state::coin_chip_r)
+READ16_MEMBER( mquake_state::coin_chip_r )
{
if (offset == 1)
return ioport("COINCHIP")->read();
@@ -152,7 +95,7 @@ READ16_MEMBER(mquake_state::coin_chip_r)
return 0xffff;
}
-WRITE16_MEMBER(mquake_state::coin_chip_w)
+WRITE16_MEMBER( mquake_state::coin_chip_w )
{
logerror("%06x:coin_chip_w(%02x) = %04x & %04x\n", space.device().safe_pc(), offset, data, mem_mask);
}
@@ -171,14 +114,27 @@ WRITE16_MEMBER(mquake_state::coin_chip_w)
*
*************************************/
-static ADDRESS_MAP_START( main_map, AS_PROGRAM, 16, mquake_state )
+static ADDRESS_MAP_START( overlay_512kb_map, AS_PROGRAM, 16, mquake_state )
ADDRESS_MAP_UNMAP_HIGH
- AM_RANGE(0x000000, 0x07ffff) AM_RAMBANK("bank1") AM_SHARE("chip_ram")
- AM_RANGE(0xbfd000, 0xbfefff) AM_READWRITE(amiga_cia_r, amiga_cia_w)
- AM_RANGE(0xc00000, 0xdfffff) AM_READWRITE(amiga_custom_r, amiga_custom_w) AM_SHARE("custom_regs")
- AM_RANGE(0xe80000, 0xe8ffff) AM_READWRITE(amiga_autoconfig_r, amiga_autoconfig_w)
- AM_RANGE(0xfc0000, 0xffffff) AM_ROM AM_REGION("user1", 0) /* System ROM */
+ AM_RANGE(0x000000, 0x07ffff) AM_MIRROR(0x180000) AM_RAM AM_SHARE("chip_ram")
+ AM_RANGE(0x200000, 0x27ffff) AM_ROM AM_REGION("kickstart", 0)
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( a500_mem, AS_PROGRAM, 16, mquake_state )
+ ADDRESS_MAP_UNMAP_HIGH
+ AM_RANGE(0x000000, 0x1fffff) AM_DEVICE("overlay", address_map_bank_device, amap16)
+ AM_RANGE(0xa00000, 0xbfffff) AM_READWRITE(cia_r, cia_w)
+ AM_RANGE(0xc00000, 0xd7ffff) AM_READWRITE(custom_chip_r, custom_chip_w)
+ AM_RANGE(0xd80000, 0xddffff) AM_NOP
+ AM_RANGE(0xde0000, 0xdeffff) AM_READWRITE(custom_chip_r, custom_chip_w)
+ AM_RANGE(0xdf0000, 0xdfffff) AM_READWRITE(custom_chip_r, custom_chip_w) AM_SHARE("custom_regs")
+ AM_RANGE(0xe00000, 0xe7ffff) AM_WRITENOP AM_READ(rom_mirror_r)
+ AM_RANGE(0xe80000, 0xefffff) AM_NOP // autoconfig space (installed by devices)
+ AM_RANGE(0xf80000, 0xffffff) AM_ROM AM_REGION("kickstart", 0)
+ADDRESS_MAP_END
+static ADDRESS_MAP_START( main_map, AS_PROGRAM, 16, mquake_state )
+ AM_IMPORT_FROM(a500_mem)
AM_RANGE(0x200000, 0x203fff) AM_RAM AM_SHARE("nvram")
AM_RANGE(0x204000, 0x2041ff) AM_DEVREADWRITE8("es5503", es5503_device, read, write, 0x00ff)
AM_RANGE(0x282000, 0x282001) AM_READ_PORT("SW.LO")
@@ -203,21 +159,21 @@ static INPUT_PORTS_START( mquake )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) /* JS0SW */
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) /* JS1SW */
- PORT_START("JOY0DAT")
+ PORT_START("joy_0_dat")
PORT_BIT( 0x0303, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, mquake_state,amiga_joystick_convert, 0)
PORT_BIT( 0xfcfc, IP_ACTIVE_HIGH, IPT_UNKNOWN )
- PORT_START("JOY1DAT")
+ PORT_START("joy_1_dat")
PORT_BIT( 0x0303, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, mquake_state,amiga_joystick_convert, 1)
PORT_BIT( 0xfcfc, IP_ACTIVE_HIGH, IPT_UNKNOWN )
- PORT_START("P1JOY")
+ PORT_START("p1_joy")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(1)
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1)
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1)
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1)
- PORT_START("P2JOY")
+ PORT_START("p2_joy")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(2)
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2)
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2)
@@ -336,16 +292,6 @@ INPUT_PORTS_END
-/*************************************
- *
- * Sound definitions
- *
- *************************************/
-
-MACHINE_RESET_MEMBER(mquake_state,mquake)
-{
- MACHINE_RESET_CALL_MEMBER(amiga);
-}
/*************************************
*
@@ -356,11 +302,16 @@ MACHINE_RESET_MEMBER(mquake_state,mquake)
static MACHINE_CONFIG_START( mquake, mquake_state )
/* basic machine hardware */
- MCFG_CPU_ADD("maincpu", M68000, AMIGA_68000_NTSC_CLOCK)
+ MCFG_CPU_ADD("maincpu", M68000, amiga_state::CLK_7M_NTSC)
MCFG_CPU_PROGRAM_MAP(main_map)
- MCFG_MACHINE_START_OVERRIDE(amiga_state, amiga)
- MCFG_MACHINE_RESET_OVERRIDE(mquake_state,mquake)
+ MCFG_DEVICE_ADD("overlay", ADDRESS_MAP_BANK, 0)
+ MCFG_DEVICE_PROGRAM_MAP(overlay_512kb_map)
+ MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_BIG)
+ MCFG_ADDRESS_MAP_BANK_DATABUS_WIDTH(16)
+ MCFG_ADDRESS_MAP_BANK_ADDRBUS_WIDTH(22)
+ MCFG_ADDRESS_MAP_BANK_STRIDE(0x200000)
+
MCFG_NVRAM_ADD_0FILL("nvram")
/* video hardware */
@@ -381,30 +332,28 @@ static MACHINE_CONFIG_START( mquake, mquake_state )
/* sound hardware */
MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
- MCFG_SOUND_ADD("amiga", AMIGA, 3579545)
+ MCFG_SOUND_ADD("amiga", AMIGA, amiga_state::CLK_C1_NTSC)
MCFG_SOUND_ROUTE(0, "lspeaker", 0.50)
MCFG_SOUND_ROUTE(1, "rspeaker", 0.50)
MCFG_SOUND_ROUTE(2, "rspeaker", 0.50)
MCFG_SOUND_ROUTE(3, "lspeaker", 0.50)
- MCFG_ES5503_ADD("es5503", 7159090) /* ES5503 is likely mono due to channel strobe used as bank select */
+ MCFG_ES5503_ADD("es5503", amiga_state::CLK_7M_NTSC) /* ES5503 is likely mono due to channel strobe used as bank select */
MCFG_ES5503_OUTPUT_CHANNELS(1)
MCFG_DEVICE_ADDRESS_MAP(AS_0, mquake_es5503_map)
MCFG_SOUND_ROUTE(0, "lspeaker", 0.50)
MCFG_SOUND_ROUTE(0, "rspeaker", 0.50)
/* cia */
- MCFG_DEVICE_ADD("cia_0", LEGACY_MOS8520, AMIGA_68000_NTSC_CLOCK / 10)
- MCFG_MOS6526_IRQ_CALLBACK(WRITELINE(amiga_state, amiga_cia_0_irq))
+ MCFG_DEVICE_ADD("cia_0", LEGACY_MOS8520, amiga_state::CLK_E_NTSC)
+ MCFG_MOS6526_IRQ_CALLBACK(WRITELINE(amiga_state, cia_0_irq))
MCFG_MOS6526_PA_INPUT_CALLBACK(IOPORT("CIA0PORTA"))
- MCFG_MOS6526_PA_OUTPUT_CALLBACK(WRITE8(mquake_state,mquake_cia_0_porta_w))
- MCFG_MOS6526_PB_INPUT_CALLBACK(READ8(mquake_state,mquake_cia_0_portb_r))
- MCFG_MOS6526_PB_OUTPUT_CALLBACK(WRITE8(mquake_state,mquake_cia_0_portb_w))
- MCFG_DEVICE_ADD("cia_1", LEGACY_MOS8520, AMIGA_68000_NTSC_CLOCK / 10)
- MCFG_MOS6526_IRQ_CALLBACK(WRITELINE(amiga_state, amiga_cia_1_irq))
+ MCFG_MOS6526_PA_OUTPUT_CALLBACK(WRITE8(amiga_state, cia_0_port_a_write))
+ MCFG_DEVICE_ADD("cia_1", LEGACY_MOS8520, amiga_state::CLK_E_NTSC)
+ MCFG_MOS6526_IRQ_CALLBACK(WRITELINE(amiga_state, cia_1_irq))
/* fdc */
- MCFG_DEVICE_ADD("fdc", AMIGA_FDC, AMIGA_68000_NTSC_CLOCK)
+ MCFG_DEVICE_ADD("fdc", AMIGA_FDC, amiga_state::CLK_7M_NTSC)
MCFG_AMIGA_FDC_INDEX_CALLBACK(DEVWRITELINE("cia_1", legacy_mos6526_device, flag_w))
MACHINE_CONFIG_END
@@ -417,9 +366,9 @@ MACHINE_CONFIG_END
*************************************/
ROM_START( mquake )
- ROM_REGION(0x80000, "user1", 0)
- ROM_LOAD16_WORD_SWAP( "kick12.rom", 0x000000, 0x40000, CRC(a6ce1636) SHA1(11f9e62cf299f72184835b7b2a70a16333fc0d88) )
- ROM_COPY( "user1", 0x000000, 0x040000, 0x040000 )
+ ROM_REGION(0x80000, "kickstart", 0)
+ ROM_LOAD16_WORD_SWAP("315093-01.u2", 0x00000, 0x40000, CRC(a6ce1636) SHA1(11f9e62cf299f72184835b7b2a70a16333fc0d88))
+ ROM_COPY("kickstart", 0x00000, 0x40000, 0x40000)
ROM_REGION(0xc0000, "user2", 0)
ROM_LOAD16_BYTE( "rom0l.bin", 0x00000, 0x10000, CRC(60c35ec3) SHA1(84fe88af54903cbd46044ef52bb50e8f94a94dcd) )
@@ -447,32 +396,22 @@ ROM_END
+
/*************************************
*
* Driver init
*
*************************************/
-DRIVER_INIT_MEMBER(mquake_state,mquake)
+DRIVER_INIT_MEMBER( mquake_state, mquake )
{
- static const amiga_machine_interface mquake_intf =
- {
- ANGUS_CHIP_RAM_MASK,
- NULL, NULL, NULL,
- NULL,
- NULL, NULL,
- NULL,
- 0
- };
- amiga_machine_config(machine(), &mquake_intf);
-
- /* set up memory */
- m_bank1->configure_entry(0, m_chip_ram);
- m_bank1->configure_entry(1, memregion("user1")->base());
+ m_agnus_id = AGNUS_HR_NTSC;
+ m_denise_id = DENISE;
}
+
/*************************************
*
* Game drivers
diff --git a/src/mame/drivers/upscope.c b/src/mame/drivers/upscope.c
index ae4adf50aaf..132ae5b8d15 100644
--- a/src/mame/drivers/upscope.c
+++ b/src/mame/drivers/upscope.c
@@ -35,19 +35,26 @@ class upscope_state : public amiga_state
{
public:
upscope_state(const machine_config &mconfig, device_type type, const char *tag)
- : amiga_state(mconfig, type, tag) { }
+ : amiga_state(mconfig, type, tag),
+ m_prev_cia1_porta(0xff),
+ m_parallel_data(0xff)
+ { }
- UINT8 m_nvram[0x100];
+ UINT8 m_nvram[0x100];
UINT8 m_prev_cia1_porta;
UINT8 m_parallel_data;
UINT8 m_nvram_address_latch;
UINT8 m_nvram_data_latch;
- DECLARE_WRITE8_MEMBER(upscope_cia_0_porta_w);
- DECLARE_WRITE8_MEMBER(upscope_cia_0_portb_w);
+
DECLARE_READ8_MEMBER(upscope_cia_0_portb_r);
+ DECLARE_WRITE8_MEMBER(upscope_cia_0_portb_w);
DECLARE_READ8_MEMBER(upscope_cia_1_porta_r);
DECLARE_WRITE8_MEMBER(upscope_cia_1_porta_w);
+
DECLARE_DRIVER_INIT(upscope);
+
+protected:
+ virtual void machine_reset();
};
@@ -67,67 +74,21 @@ public:
*
*************************************/
-static void upscope_reset(running_machine &machine)
+void upscope_state::machine_reset()
{
- upscope_state *state = machine.driver_data<upscope_state>();
- state->m_prev_cia1_porta = 0xff;
-}
-
-
-
-/*************************************
- *
- * CIA-A port A access:
- *
- * PA7 = game port 1, pin 6 (fire)
- * PA6 = game port 0, pin 6 (fire)
- * PA5 = /RDY (disk ready)
- * PA4 = /TK0 (disk track 00)
- * PA3 = /WPRO (disk write protect)
- * PA2 = /CHNG (disk change)
- * PA1 = /LED (LED, 0=bright / audio filter control)
- * PA0 = OVL (ROM/RAM overlay bit)
- *
- *************************************/
-
-WRITE8_MEMBER(upscope_state::upscope_cia_0_porta_w)
-{
- /* switch banks as appropriate */
- m_bank1->set_entry(data & 1);
-
- /* swap the write handlers between ROM and bank 1 based on the bit */
- if ((data & 1) == 0)
- /* overlay disabled, map RAM on 0x000000 */
- m_maincpu->space(AS_PROGRAM).install_write_bank(0x000000, 0x07ffff, "bank1");
+ // reset base machine
+ amiga_state::machine_reset();
- else
- /* overlay enabled, map Amiga system ROM on 0x000000 */
- m_maincpu->space(AS_PROGRAM).unmap_write(0x000000, 0x07ffff);
+ m_prev_cia1_porta = 0xff;
}
-
-/*************************************
- *
- * CIA-A port B access:
- *
- * PB7 = parallel data 7
- * PB6 = parallel data 6
- * PB5 = parallel data 5
- * PB4 = parallel data 4
- * PB3 = parallel data 3
- * PB2 = parallel data 2
- * PB1 = parallel data 1
- * PB0 = parallel data 0
- *
- *************************************/
-
-WRITE8_MEMBER(upscope_state::upscope_cia_0_portb_w)
+WRITE8_MEMBER( upscope_state::upscope_cia_0_portb_w )
{
m_parallel_data = data;
}
-READ8_MEMBER(upscope_state::upscope_cia_0_portb_r)
+READ8_MEMBER( upscope_state::upscope_cia_0_portb_r )
{
return m_nvram_data_latch;
}
@@ -149,12 +110,12 @@ READ8_MEMBER(upscope_state::upscope_cia_0_portb_r)
*
*************************************/
-READ8_MEMBER(upscope_state::upscope_cia_1_porta_r)
+READ8_MEMBER( upscope_state::upscope_cia_1_porta_r )
{
return 0xf8 | (m_prev_cia1_porta & 0x07);
}
-WRITE8_MEMBER(upscope_state::upscope_cia_1_porta_w)
+WRITE8_MEMBER( upscope_state::upscope_cia_1_porta_w )
{
/* on a low transition of POUT, we latch stuff for the NVRAM */
if ((m_prev_cia1_porta & 2) && !(data & 2))
@@ -243,14 +204,27 @@ WRITE8_MEMBER(upscope_state::upscope_cia_1_porta_w)
*
*************************************/
-static ADDRESS_MAP_START( main_map, AS_PROGRAM, 16, upscope_state )
+static ADDRESS_MAP_START( overlay_512kb_map, AS_PROGRAM, 16, upscope_state )
ADDRESS_MAP_UNMAP_HIGH
- AM_RANGE(0x000000, 0x07ffff) AM_RAMBANK("bank1") AM_SHARE("chip_ram")
- AM_RANGE(0xbfd000, 0xbfefff) AM_READWRITE(amiga_cia_r, amiga_cia_w)
- AM_RANGE(0xc00000, 0xdfffff) AM_READWRITE(amiga_custom_r, amiga_custom_w) AM_SHARE("custom_regs")
- AM_RANGE(0xe80000, 0xe8ffff) AM_READWRITE(amiga_autoconfig_r, amiga_autoconfig_w)
- AM_RANGE(0xfc0000, 0xffffff) AM_ROM AM_REGION("user1", 0) /* System ROM */
+ AM_RANGE(0x000000, 0x07ffff) AM_MIRROR(0x180000) AM_RAM AM_SHARE("chip_ram")
+ AM_RANGE(0x200000, 0x27ffff) AM_ROM AM_REGION("kickstart", 0)
+ADDRESS_MAP_END
+static ADDRESS_MAP_START( a500_mem, AS_PROGRAM, 16, upscope_state )
+ ADDRESS_MAP_UNMAP_HIGH
+ AM_RANGE(0x000000, 0x1fffff) AM_DEVICE("overlay", address_map_bank_device, amap16)
+ AM_RANGE(0xa00000, 0xbfffff) AM_READWRITE(cia_r, cia_w)
+ AM_RANGE(0xc00000, 0xd7ffff) AM_READWRITE(custom_chip_r, custom_chip_w)
+ AM_RANGE(0xd80000, 0xddffff) AM_NOP
+ AM_RANGE(0xde0000, 0xdeffff) AM_READWRITE(custom_chip_r, custom_chip_w)
+ AM_RANGE(0xdf0000, 0xdfffff) AM_READWRITE(custom_chip_r, custom_chip_w) AM_SHARE("custom_regs")
+ AM_RANGE(0xe00000, 0xe7ffff) AM_WRITENOP AM_READ(rom_mirror_r)
+ AM_RANGE(0xe80000, 0xefffff) AM_NOP // autoconfig space (installed by devices)
+ AM_RANGE(0xf80000, 0xffffff) AM_ROM AM_REGION("kickstart", 0)
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( main_map, AS_PROGRAM, 16, upscope_state )
+ AM_IMPORT_FROM(a500_mem)
AM_RANGE(0xf00000, 0xf7ffff) AM_ROM AM_REGION("user2", 0)
ADDRESS_MAP_END
@@ -286,11 +260,16 @@ INPUT_PORTS_END
static MACHINE_CONFIG_START( upscope, upscope_state )
/* basic machine hardware */
- MCFG_CPU_ADD("maincpu", M68000, AMIGA_68000_NTSC_CLOCK)
+ MCFG_CPU_ADD("maincpu", M68000, amiga_state::CLK_7M_NTSC)
MCFG_CPU_PROGRAM_MAP(main_map)
- MCFG_MACHINE_START_OVERRIDE(amiga_state, amiga )
- MCFG_MACHINE_RESET_OVERRIDE(upscope_state,amiga)
+ MCFG_DEVICE_ADD("overlay", ADDRESS_MAP_BANK, 0)
+ MCFG_DEVICE_PROGRAM_MAP(overlay_512kb_map)
+ MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_BIG)
+ MCFG_ADDRESS_MAP_BANK_DATABUS_WIDTH(16)
+ MCFG_ADDRESS_MAP_BANK_ADDRBUS_WIDTH(22)
+ MCFG_ADDRESS_MAP_BANK_STRIDE(0x200000)
+
MCFG_NVRAM_ADD_0FILL("nvram")
/* video hardware */
@@ -311,25 +290,25 @@ static MACHINE_CONFIG_START( upscope, upscope_state )
/* sound hardware */
MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
- MCFG_SOUND_ADD("amiga", AMIGA, 3579545)
+ MCFG_SOUND_ADD("amiga", AMIGA, amiga_state::CLK_C1_NTSC)
MCFG_SOUND_ROUTE(0, "rspeaker", 0.50)
MCFG_SOUND_ROUTE(1, "lspeaker", 0.50)
MCFG_SOUND_ROUTE(2, "lspeaker", 0.50)
MCFG_SOUND_ROUTE(3, "rspeaker", 0.50)
/* cia */
- MCFG_DEVICE_ADD("cia_0", LEGACY_MOS8520, AMIGA_68000_NTSC_CLOCK / 10)
- MCFG_MOS6526_IRQ_CALLBACK(WRITELINE(amiga_state, amiga_cia_0_irq))
- MCFG_MOS6526_PA_OUTPUT_CALLBACK(WRITE8(upscope_state,upscope_cia_0_porta_w))
- MCFG_MOS6526_PB_INPUT_CALLBACK(READ8(upscope_state,upscope_cia_0_portb_r))
- MCFG_MOS6526_PB_OUTPUT_CALLBACK(WRITE8(upscope_state,upscope_cia_0_portb_w))
- MCFG_DEVICE_ADD("cia_1", LEGACY_MOS8520, AMIGA_68000_NTSC_CLOCK / 10)
- MCFG_MOS6526_IRQ_CALLBACK(WRITELINE(amiga_state, amiga_cia_1_irq))
- MCFG_MOS6526_PA_INPUT_CALLBACK(READ8(upscope_state,upscope_cia_1_porta_r))
- MCFG_MOS6526_PA_OUTPUT_CALLBACK(WRITE8(upscope_state,upscope_cia_1_porta_w))
+ MCFG_DEVICE_ADD("cia_0", LEGACY_MOS8520, amiga_state::CLK_E_NTSC)
+ MCFG_MOS6526_IRQ_CALLBACK(WRITELINE(amiga_state, cia_0_irq))
+ MCFG_MOS6526_PA_OUTPUT_CALLBACK(WRITE8(amiga_state, cia_0_port_a_write))
+ MCFG_MOS6526_PB_INPUT_CALLBACK(READ8(upscope_state, upscope_cia_0_portb_r))
+ MCFG_MOS6526_PB_OUTPUT_CALLBACK(WRITE8(upscope_state, upscope_cia_0_portb_w))
+ MCFG_DEVICE_ADD("cia_1", LEGACY_MOS8520, amiga_state::CLK_E_NTSC)
+ MCFG_MOS6526_IRQ_CALLBACK(WRITELINE(amiga_state, cia_1_irq))
+ MCFG_MOS6526_PA_INPUT_CALLBACK(READ8(upscope_state, upscope_cia_1_porta_r))
+ MCFG_MOS6526_PA_OUTPUT_CALLBACK(WRITE8(upscope_state, upscope_cia_1_porta_w))
/* fdc */
- MCFG_DEVICE_ADD("fdc", AMIGA_FDC, AMIGA_68000_NTSC_CLOCK)
+ MCFG_DEVICE_ADD("fdc", AMIGA_FDC, amiga_state::CLK_7M_NTSC)
MCFG_AMIGA_FDC_INDEX_CALLBACK(DEVWRITELINE("cia_1", legacy_mos6526_device, flag_w))
MACHINE_CONFIG_END
@@ -342,9 +321,9 @@ MACHINE_CONFIG_END
*************************************/
ROM_START( upscope )
- ROM_REGION(0x80000, "user1", 0)
- ROM_LOAD16_WORD_SWAP( "kick12.rom", 0x000000, 0x40000, CRC(a6ce1636) SHA1(11f9e62cf299f72184835b7b2a70a16333fc0d88) )
- ROM_COPY( "user1", 0x000000, 0x040000, 0x040000 )
+ ROM_REGION(0x80000, "kickstart", 0)
+ ROM_LOAD16_WORD_SWAP("315093-01.u2", 0x00000, 0x40000, CRC(a6ce1636) SHA1(11f9e62cf299f72184835b7b2a70a16333fc0d88))
+ ROM_COPY("kickstart", 0x00000, 0x40000, 0x40000)
ROM_REGION(0x080000, "user2", 0)
ROM_LOAD16_BYTE( "upscope.u5", 0x000000, 0x008000, CRC(c109912e) SHA1(dcac9522e3c4818b2a02212b9173540fcf4bd463) )
@@ -371,25 +350,13 @@ ROM_END
*
*************************************/
-DRIVER_INIT_MEMBER(upscope_state,upscope)
+DRIVER_INIT_MEMBER(upscope_state, upscope)
{
- static const amiga_machine_interface upscope_intf =
- {
- ANGUS_CHIP_RAM_MASK,
- NULL, NULL, NULL,
- NULL,
- NULL, upscope_reset,
- NULL,
- 0
- };
- amiga_machine_config(machine(), &upscope_intf);
-
- /* allocate NVRAM */
- machine().device<nvram_device>("nvram")->set_base(m_nvram, sizeof(m_nvram));
+ m_agnus_id = AGNUS_HR_NTSC;
+ m_denise_id = DENISE;
- /* set up memory */
- m_bank1->configure_entry(0, m_chip_ram);
- m_bank1->configure_entry(1, memregion("user1")->base());
+ // allocate nvram
+ machine().device<nvram_device>("nvram")->set_base(m_nvram, sizeof(m_nvram));
}
diff --git a/src/mame/includes/amiga.h b/src/mame/includes/amiga.h
index 01aed8c4e93..806397ecdbf 100644
--- a/src/mame/includes/amiga.h
+++ b/src/mame/includes/amiga.h
@@ -10,11 +10,15 @@ Ernesto Corvi & Mariusz Wojcieszek
#ifndef __AMIGA_H__
#define __AMIGA_H__
+#include "cpu/m68000/m68000.h"
+#include "machine/bankdev.h"
#include "bus/centronics/ctronics.h"
#include "machine/6526cia.h"
#include "machine/amigafdc.h"
#include "machine/msm6242.h"
-#include "cpu/m68000/m68000.h"
+#include "machine/akiko.h"
+#include "machine/i2cmem.h"
+#include "sound/amiga.h"
/*************************************
@@ -308,139 +312,59 @@ Ernesto Corvi & Mariusz Wojcieszek
#define MAX_PLANES 6 /* 0 to 6, inclusive ( but we count from 0 to 5 ) */
-/* Clock speeds */
-#define AMIGA_68000_NTSC_CLOCK XTAL_28_63636MHz/4
-#define AMIGA_68000_PAL_CLOCK XTAL_28_37516MHz/4
-#define AMIGA_68EC020_NTSC_CLOCK XTAL_28_63636MHz/2
-#define AMIGA_68EC020_PAL_CLOCK XTAL_28_37516MHz/2
-#define CDTV_CLOCK_X1 XTAL_28_63636MHz
-#define CDTV_CLOCK_X5 XTAL_28_37516MHz
-
-
-#define ANGUS_CHIP_RAM_MASK 0x07fffe
-#define FAT_ANGUS_CHIP_RAM_MASK 0x0ffffe
-#define ECS_CHIP_RAM_MASK 0x1ffffe
-#define AGA_CHIP_RAM_MASK 0x1ffffe
-
-#define FLAGS_AGA_CHIPSET (1 << 0)
-#define FLAGS_IS_32BIT (1 << 1)
-
-struct amiga_machine_interface
-{
- UINT32 chip_ram_mask;
-
- UINT16 (*joy0dat_r)(running_machine &machine);
- UINT16 (*joy1dat_r)(running_machine &machine);
- void (*potgo_w)(running_machine &machine, UINT16 data);
- void (*serdat_w)(running_machine &machine, UINT16 data);
+// chipset
+#define IS_OCS(state) (state->m_denise_id == 0xff)
+#define IS_ECS(state) (state->m_denise_id == 0xfc)
+#define IS_AGA(state) (state->m_denise_id == 0xf8)
- void (*scanline0_callback)(running_machine &machine);
- void (*reset_callback)(running_machine &machine);
- void (*nmi_callback)(running_machine &machine);
-
- UINT32 flags;
-};
-
-#define IS_AGA(intf) ( intf->chip_ram_mask == AGA_CHIP_RAM_MASK && (( intf->flags & FLAGS_AGA_CHIPSET) != 0))
-#define IS_ECS(intf) ( intf->chip_ram_mask == ECS_CHIP_RAM_MASK && (( intf->flags & FLAGS_AGA_CHIPSET) == 0))
-#define IS_ECS_OR_AGA(intf) ( intf->chip_ram_mask == ECS_CHIP_RAM_MASK)
-#define IS_32BIT(intf) (( intf->flags & FLAGS_IS_32BIT) != 0)
-
-struct amiga_autoconfig_device
-{
- UINT8 link_memory; /* link into free memory list */
- UINT8 rom_vector_valid; /* ROM vector offset valid */
- UINT8 multi_device; /* multiple devices on card */
- UINT8 size; /* number of 64k pages */
- UINT16 product_number; /* product number */
- UINT8 prefer_8meg; /* prefer 8MB address space */
- UINT8 can_shutup; /* can be shut up */
- UINT16 mfr_number; /* manufacturers number */
- UINT32 serial_number; /* serial number */
- UINT16 rom_vector; /* ROM vector offset */
- UINT8 (*int_control_r)(running_machine &machine); /* interrupt control read */
- void (*int_control_w)(running_machine &machine, UINT8 data); /* interrupt control write */
- void (*install)(running_machine &machine, offs_t base); /* memory installation */
- void (*uninstall)(running_machine &machine, offs_t base); /* memory uninstallation */
-};
-
-struct autoconfig_device
-{
- autoconfig_device * next;
- amiga_autoconfig_device device;
- offs_t base;
-};
-
-class amiga_sound_device;
class amiga_state : public driver_device
{
public:
- enum
- {
- TIMER_SCANLINE,
- TIMER_AMIGA_IRQ,
- TIMER_AMIGA_BLITTER,
- TIMER_FINISH_SERIAL_WRITE
- };
-
- amiga_state(const machine_config &mconfig, device_type type, const char *tag)
- : driver_device(mconfig, type, tag),
- m_maincpu(*this, "maincpu"), /* accelerator cards may present an interesting challenge because the maincpu will be the one on the card instead */
- m_cia_0(*this, "cia_0"),
- m_cia_1(*this, "cia_1"),
- m_centronics(*this, "centronics"),
- m_sound(*this, "amiga"),
- m_rtc(*this, "rtc"),
- m_fdc(*this, "fdc"),
- m_chip_ram(*this, "chip_ram", 0),
- m_custom_regs(*this, "custom_regs", 0),
- m_joy0dat_port(*this, "JOY0DAT"),
- m_joy1dat_port(*this, "JOY1DAT"),
- m_potgo_port(*this, "POTGO"),
- m_pot0dat_port(*this, "POT0DAT"),
- m_pot1dat_port(*this, "POT1DAT"),
- m_p1joy_port(*this, "P1JOY"),
- m_p2joy_port(*this, "P2JOY"),
- m_bank1(*this, "bank1"),
- m_screen(*this, "screen"),
- m_palette(*this, "palette")
-
+ amiga_state(const machine_config &mconfig, device_type type, const char *tag) :
+ driver_device(mconfig, type, tag),
+ m_chip_ram(*this, "chip_ram", 0),
+ m_custom_regs(*this, "custom_regs", 0),
+ m_agnus_id(AGNUS_NTSC),
+ m_denise_id(DENISE),
+ m_maincpu(*this, "maincpu"),
+ m_cia_0(*this, "cia_0"),
+ m_cia_1(*this, "cia_1"),
+ m_centronics(*this, "centronics"),
+ m_sound(*this, "amiga"),
+ m_fdc(*this, "fdc"),
+ m_screen(*this, "screen"),
+ m_palette(*this, "palette"),
+ m_overlay(*this, "overlay"),
+ m_kickstart(*this, "kickstart"),
+ m_input_device(*this, "input"),
+ m_joy0dat_port(*this, "joy_0_dat"),
+ m_joy1dat_port(*this, "joy_1_dat"),
+ m_potgo_port(*this, "potgo"),
+ m_pot0dat_port(*this, "POT0DAT"),
+ m_pot1dat_port(*this, "POT1DAT"),
+ m_p1joy_port(*this, "p1_joy"),
+ m_p2joy_port(*this, "p2_joy"),
+ m_p1_mouse_x(*this, "p1_mouse_x"),
+ m_p1_mouse_y(*this, "p1_mouse_y"),
+ m_p2_mouse_x(*this, "p2_mouse_x"),
+ m_p2_mouse_y(*this, "p2_mouse_y"),
+ m_chip_ram_mask(0),
+ m_chip_ram_mirror(0),
+ m_cia_0_irq(0),
+ m_cia_1_irq(0),
+ m_centronics_busy(0),
+ m_centronics_perror(0),
+ m_centronics_select(0),
+ m_gayle_reset(false)
{ }
- required_device<m68000_base_device> m_maincpu;
- required_device<legacy_mos6526_device> m_cia_0;
- required_device<legacy_mos6526_device> m_cia_1;
- optional_device<centronics_device> m_centronics;
- required_device<amiga_sound_device> m_sound;
- optional_device<msm6242_device> m_rtc;
- optional_device<amiga_fdc> m_fdc;
- required_shared_ptr<UINT16> m_chip_ram;
+
UINT16 (*m_chip_ram_r)(amiga_state *state, offs_t offset);
void (*m_chip_ram_w)(amiga_state *state, offs_t offset, UINT16 data);
- required_shared_ptr<UINT16> m_custom_regs;
-
- optional_ioport m_joy0dat_port;
- optional_ioport m_joy1dat_port;
- optional_ioport m_potgo_port;
- optional_ioport m_pot0dat_port;
- optional_ioport m_pot1dat_port;
- optional_ioport m_p1joy_port;
- optional_ioport m_p2joy_port;
- optional_memory_bank m_bank1;
-
- required_device<screen_device> m_screen;
- optional_device<palette_device> m_palette;
-
- address_space* m_maincpu_program_space;
-
- const amiga_machine_interface *m_intf;
- autoconfig_device *m_autoconfig_list;
- autoconfig_device *m_cur_autoconfig;
- emu_timer * m_irq_timer;
- emu_timer * m_blitter_timer;
+
/* sprite states */
UINT8 m_sprite_comparitor_enable_mask;
UINT8 m_sprite_dma_reload_mask;
@@ -480,132 +404,185 @@ public:
int m_aga_sprite_fetched_words;
int m_aga_sprite_dma_used_words[8];
- DECLARE_CUSTOM_INPUT_MEMBER( amiga_joystick_convert );
- DECLARE_DRIVER_INIT(amiga);
- DECLARE_DRIVER_INIT(cdtv);
- DECLARE_DRIVER_INIT(a3000);
- DECLARE_MACHINE_START(amiga);
- DECLARE_MACHINE_RESET(amiga);
- DECLARE_VIDEO_START(amiga);
- DECLARE_PALETTE_INIT(amiga);
- DECLARE_VIDEO_START(amiga_aga);
+ DECLARE_VIDEO_START( amiga );
+ DECLARE_VIDEO_START( amiga_aga );
+ DECLARE_PALETTE_INIT( amiga );
+
UINT32 screen_update_amiga(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
UINT32 screen_update_amiga_aga(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
- TIMER_CALLBACK_MEMBER(scanline_callback);
- TIMER_CALLBACK_MEMBER(amiga_irq_proc);
- TIMER_CALLBACK_MEMBER(amiga_blitter_proc);
- TIMER_CALLBACK_MEMBER(finish_serial_write);
- DECLARE_WRITE_LINE_MEMBER(amiga_cia_0_irq);
- DECLARE_WRITE_LINE_MEMBER(amiga_cia_1_irq);
- DECLARE_READ8_MEMBER( amiga_cia_0_portA_r );
- DECLARE_WRITE8_MEMBER( amiga_cia_0_portA_w );
-
- DECLARE_READ16_MEMBER( amiga_clock_r );
- DECLARE_WRITE16_MEMBER( amiga_clock_w );
-
- DECLARE_READ8_MEMBER(amiga_cia_1_porta_r);
- DECLARE_WRITE_LINE_MEMBER( write_centronics_ack );
- DECLARE_WRITE_LINE_MEMBER( write_centronics_busy );
- DECLARE_WRITE_LINE_MEMBER( write_centronics_perror );
- DECLARE_WRITE_LINE_MEMBER( write_centronics_select );
-
- DECLARE_READ16_MEMBER( amiga_custom_r );
- DECLARE_WRITE16_MEMBER( amiga_custom_w );
-
- DECLARE_READ16_MEMBER( amiga_autoconfig_r );
- DECLARE_WRITE16_MEMBER( amiga_autoconfig_w );
-
- DECLARE_READ16_MEMBER( amiga_cia_r );
- DECLARE_WRITE16_MEMBER( amiga_cia_w );
- // action replay
- DECLARE_READ16_MEMBER( amiga_ar23_cia_r );
- DECLARE_READ16_MEMBER( amiga_ar23_mode_r );
- DECLARE_WRITE16_MEMBER( amiga_ar23_mode_w );
- void amiga_ar23_init( running_machine &machine, int ar3 );
-
- DECLARE_READ8_MEMBER( amigacd_tpi6525_portc_r );
- DECLARE_WRITE8_MEMBER( amigacd_tpi6525_portb_w );
- DECLARE_WRITE_LINE_MEMBER( amigacd_tpi6525_irq );
-
- DECLARE_WRITE_LINE_MEMBER(amiga_m68k_reset);
-
- IRQ_CALLBACK_MEMBER(amiga_ar1_irqack);
- DECLARE_WRITE16_MEMBER( amiga_ar1_chipmem_w );
- DECLARE_WRITE16_MEMBER( amiga_ar23_chipmem_w );
- DECLARE_READ16_MEMBER( amiga_dmac_r );
- DECLARE_WRITE16_MEMBER( amiga_dmac_w );
+ TIMER_CALLBACK_MEMBER( scanline_callback );
+ TIMER_CALLBACK_MEMBER (amiga_irq_proc );
+ TIMER_CALLBACK_MEMBER( amiga_blitter_proc );
+ TIMER_CALLBACK_MEMBER( finish_serial_write );
+
+ void update_irqs();
+
+ void serial_in_w(UINT16 data);
+ attotime serial_char_period();
+
+ DECLARE_CUSTOM_INPUT_MEMBER( amiga_joystick_convert );
+ DECLARE_CUSTOM_INPUT_MEMBER( floppy_drive_status );
+
+ DECLARE_WRITE_LINE_MEMBER( m68k_reset );
+
+ DECLARE_READ16_MEMBER( cia_r );
+ DECLARE_WRITE16_MEMBER( cia_w );
+ DECLARE_WRITE16_MEMBER( gayle_cia_w );
+ DECLARE_WRITE8_MEMBER( cia_0_port_a_write );
+ DECLARE_WRITE_LINE_MEMBER( cia_0_irq );
+ DECLARE_READ8_MEMBER( cia_1_port_a_read );
+ DECLARE_WRITE_LINE_MEMBER( cia_1_irq );
- int m_centronics_busy;
- int m_centronics_perror;
- int m_centronics_select;
+ DECLARE_WRITE_LINE_MEMBER( centronics_ack_w );
+ DECLARE_WRITE_LINE_MEMBER( centronics_busy_w );
+ DECLARE_WRITE_LINE_MEMBER( centronics_perror_w );
+ DECLARE_WRITE_LINE_MEMBER( centronics_select_w );
+
+ DECLARE_READ16_MEMBER( custom_chip_r );
+ DECLARE_WRITE16_MEMBER( custom_chip_w );
+
+ DECLARE_READ16_MEMBER( rom_mirror_r );
+ DECLARE_READ32_MEMBER( rom_mirror32_r );
+
+ // standard clocks
+ static const int CLK_28M_PAL = XTAL_28_37516MHz;
+ static const int CLK_7M_PAL = CLK_28M_PAL / 4;
+ static const int CLK_C1_PAL = CLK_28M_PAL / 8;
+ static const int CLK_E_PAL = CLK_7M_PAL / 10;
+
+ static const int CLK_28M_NTSC = XTAL_28_63636MHz;
+ static const int CLK_7M_NTSC = CLK_28M_NTSC / 4;
+ static const int CLK_C1_NTSC = CLK_28M_NTSC / 8;
+ static const int CLK_E_NTSC = CLK_7M_NTSC / 10;
+
+ required_shared_ptr<UINT16> m_chip_ram;
+ required_shared_ptr<UINT16> m_custom_regs;
+
+ emu_timer *m_blitter_timer;
+
+ UINT16 m_agnus_id;
+ UINT16 m_denise_id;
+
+ void custom_chip_w(UINT16 offset, UINT16 data, UINT16 mem_mask = 0xffff)
+ {
+ custom_chip_w(m_maincpu->space(AS_PROGRAM), offset, data, mem_mask);
+ }
protected:
+ // agnus/alice chip id
+ enum
+ {
+ AGNUS_PAL = 0x00,
+ AGNUS_NTSC = 0x10,
+ AGNUS_HR_PAL = 0x20,
+ AGNUS_HR_PAL_NEW = 0x21,
+ AGNUS_HR_NTSC = 0x30,
+ AGNUS_HR_NTSC_NEW = 0x31,
+ ALICE_PAL = 0x22,
+ ALICE_PAL_NEW = 0x23,
+ ALICE_NTSC = 0x32,
+ ALICE_NTSC_NEW = 0x33
+ };
+
+ // denise/lisa chip id
+ enum
+ {
+ DENISE = 0xffff, // actually this register doesn't exist on ocs
+ DENISE_HR = 0x00fc,
+ LISA = 0x00f8
+ };
+
+ // driver_device overrides
+ virtual void machine_start();
+ virtual void machine_reset();
+
+ // device_t overrides
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
-};
+ void custom_chip_reset();
-/*----------- defined in machine/amiga.c -----------*/
+ // interrupts
+ void set_interrupt(int interrupt);
-extern const char *const amiga_custom_names[0x100];
+ virtual void update_irq2()
+ {
+ set_interrupt((m_cia_0_irq ? 0x8000 : 0x0000) | INTENA_PORTS);
+ }
-void amiga_chip_ram_w8(amiga_state *state, offs_t offset, UINT8 data);
+ virtual void update_irq6()
+ {
+ set_interrupt((m_cia_1_irq ? 0x8000 : 0x0000) | INTENA_EXTER);
+ }
-void amiga_machine_config(running_machine &machine, const amiga_machine_interface *intf);
+ virtual void vblank();
+ virtual void potgo_w(UINT16 data) {};
+ virtual void serdat_w(UINT16 data) {};
+ // joystick/mouse
+ virtual UINT16 joy0dat_r();
+ virtual UINT16 joy1dat_r();
+ // devices
+ required_device<m68000_base_device> m_maincpu;
+ required_device<legacy_mos6526_device> m_cia_0;
+ required_device<legacy_mos6526_device> m_cia_1;
+ optional_device<centronics_device> m_centronics;
+ required_device<amiga_sound_device> m_sound;
+ optional_device<amiga_fdc> m_fdc;
+ required_device<screen_device> m_screen;
+ optional_device<palette_device> m_palette;
+ required_device<address_map_bank_device> m_overlay;
+ optional_memory_region m_kickstart;
+ // i/o ports
+ optional_ioport m_input_device;
+ optional_ioport m_joy0dat_port;
+ optional_ioport m_joy1dat_port;
+ optional_ioport m_potgo_port;
+ optional_ioport m_pot0dat_port;
+ optional_ioport m_pot1dat_port;
+ optional_ioport m_p1joy_port;
+ optional_ioport m_p2joy_port;
+ optional_ioport m_p1_mouse_x;
+ optional_ioport m_p1_mouse_y;
+ optional_ioport m_p2_mouse_x;
+ optional_ioport m_p2_mouse_y;
-void amiga_serial_in_w(running_machine &machine, UINT16 data);
-attotime amiga_get_serial_char_period(running_machine &machine);
+ UINT32 m_chip_ram_mask;
+ UINT32 m_chip_ram_mirror;
-void amiga_add_autoconfig(running_machine &machine, const amiga_autoconfig_device *device);
+ int m_cia_0_irq;
+ int m_cia_1_irq;
-const amiga_machine_interface *amiga_get_interface(running_machine &machine);
+private:
+ enum
+ {
+ TIMER_SCANLINE,
+ TIMER_AMIGA_IRQ,
+ TIMER_AMIGA_BLITTER,
+ TIMER_FINISH_SERIAL_WRITE
+ };
+ int m_centronics_busy;
+ int m_centronics_perror;
+ int m_centronics_select;
-/*----------- defined in audio/amiga.c -----------*/
+ emu_timer *m_irq_timer;
-struct audio_channel
-{
- emu_timer * irq_timer;
- UINT32 curlocation;
- UINT16 curlength;
- UINT16 curticks;
- UINT8 index;
- UINT8 dmaenabled;
- UINT8 manualmode;
- INT8 latched;
+ bool m_gayle_reset;
};
-class amiga_sound_device : public device_t,
- public device_sound_interface
-{
-public:
- amiga_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
- ~amiga_sound_device() {}
- void update();
- void data_w(int which, UINT16 data);
+/*----------- defined in machine/amiga.c -----------*/
-protected:
- // device-level overrides
- virtual void device_config_complete();
- virtual void device_start();
+extern const char *const amiga_custom_names[0x100];
- // sound stream update overrides
- virtual void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples);
-private:
- // internal state
- audio_channel m_channel[4];
- sound_stream * m_stream;
+void amiga_chip_ram_w8(amiga_state *state, offs_t offset, UINT8 data);
- TIMER_CALLBACK_MEMBER( signal_irq );
-};
-extern const device_type AMIGA;
/*----------- defined in video/amiga.c -----------*/
diff --git a/src/mame/machine/amiga.c b/src/mame/machine/amiga.c
index 0538a38c76a..09cda3d589b 100644
--- a/src/mame/machine/amiga.c
+++ b/src/mame/machine/amiga.c
@@ -133,34 +133,18 @@ const char *const amiga_custom_names[0x100] =
/*************************************
*
- * Prototypes
- *
- *************************************/
-
-static void custom_reset(running_machine &machine);
-static void autoconfig_reset(running_machine &machine);
-
-
-
-
-
-
-/*************************************
- *
* Chipmem 16/32 bit access
*
*************************************/
static UINT16 amiga_chip_ram16_r(amiga_state *state, offs_t offset)
{
- offset &= state->m_intf->chip_ram_mask;
+ // logerror("chip ram read %08x\n", offset);
return (offset < state->m_chip_ram.bytes()) ? state->m_chip_ram[offset/2] : 0xffff;
}
static UINT16 amiga_chip_ram32_r(amiga_state *state, offs_t offset)
{
- offset &= state->m_intf->chip_ram_mask;
-
if (offset < state->m_chip_ram.bytes())
{
UINT32 *amiga_chip_ram32 = reinterpret_cast<UINT32 *>(state->m_chip_ram.target());
@@ -177,16 +161,12 @@ static UINT16 amiga_chip_ram32_r(amiga_state *state, offs_t offset)
static void amiga_chip_ram16_w(amiga_state *state, offs_t offset, UINT16 data)
{
- offset &= state->m_intf->chip_ram_mask;
-
if (offset < state->m_chip_ram.bytes())
state->m_chip_ram[offset/2] = data;
}
static void amiga_chip_ram32_w(amiga_state *state, offs_t offset, UINT16 data)
{
- offset &= state->m_intf->chip_ram_mask;
-
if (offset < state->m_chip_ram.bytes())
{
UINT32 *amiga_chip_ram32 = reinterpret_cast<UINT32 *>(state->m_chip_ram.target());
@@ -226,80 +206,77 @@ void amiga_chip_ram_w8(amiga_state *state, offs_t offset, UINT8 data)
(*state->m_chip_ram_w)(state, offset, dat);
}
+
+
/*************************************
*
- * Machine config/reset
+ * Machine reset
*
*************************************/
-void amiga_machine_config(running_machine &machine, const amiga_machine_interface *intf)
+void amiga_state::machine_start()
{
- amiga_state *state = machine.driver_data<amiga_state>();
- state->m_intf = intf;
+ // add callback for RESET instruction
+ m_maincpu->set_reset_callback(write_line_delegate(FUNC(amiga_state::m68k_reset), this));
- /* setup chipmem handlers */
- if ( IS_32BIT(intf) )
+ switch (m_maincpu->space(AS_PROGRAM).data_width())
{
- state->m_chip_ram_r = amiga_chip_ram32_r;
- state->m_chip_ram_w = amiga_chip_ram32_w;
- }
- else
- {
- state->m_chip_ram_r = amiga_chip_ram16_r;
- state->m_chip_ram_w = amiga_chip_ram16_w;
+ case 16:
+ m_chip_ram_r = amiga_chip_ram16_r;
+ m_chip_ram_w = amiga_chip_ram16_w;
+ break;
+ case 32:
+ m_chip_ram_r = amiga_chip_ram32_r;
+ m_chip_ram_w = amiga_chip_ram32_w;
+ break;
+ default:
+ fatalerror("Invalid data bus width\n");
}
- /* setup the timers */
- state->m_irq_timer = state->timer_alloc(amiga_state::TIMER_AMIGA_IRQ);
- state->m_blitter_timer = state->timer_alloc(amiga_state::TIMER_AMIGA_BLITTER);
+ m_chip_ram_mask = m_chip_ram.mask() & ~1;
+ m_chip_ram_mirror = ~m_chip_ram.mask() & 0x1fffff;
-}
+ // setup the timers
+ m_irq_timer = timer_alloc(TIMER_AMIGA_IRQ);
+ m_blitter_timer = timer_alloc(TIMER_AMIGA_BLITTER);
+ // start the scanline timer
+ timer_set(m_screen->time_until_pos(0), TIMER_SCANLINE);
+}
-WRITE_LINE_MEMBER(amiga_state::amiga_m68k_reset)
+WRITE_LINE_MEMBER( amiga_state::m68k_reset )
{
- address_space &space = m_maincpu->space(AS_PROGRAM);
-
- logerror("Executed RESET at PC=%06x\n", space.device().safe_pc());
+ logerror("%s: Executed RESET\n", space().machine().describe_context());
+ machine_reset();
+}
- /* Initialize the various chips */
+void amiga_state::machine_reset()
+{
+ // reset cia chips
m_cia_0->reset();
m_cia_1->reset();
- custom_reset(machine());
- autoconfig_reset(machine());
- /* set the overlay bit */
- if ( IS_AGA(m_intf) )
- {
- space.write_byte( 0xbfa001, 1 );
- }
- else
- {
- amiga_cia_w(space, 0x1001/2, 1, 0xffff);
- }
+ // reset custom chip registers
+ custom_chip_reset();
+
+ // map kickstart rom to location 0
+ // this either done by reseting the cia chips
+ // or directly by gayle where available
+ m_gayle_reset = true;
+ m_overlay->set_bank(1);
}
-MACHINE_START_MEMBER(amiga_state,amiga)
+// simple mirror of region 0xf80000 to 0xfbffff
+READ16_MEMBER( amiga_state::rom_mirror_r )
{
- m_maincpu_program_space = &m_maincpu->space(AS_PROGRAM);
+ return m_maincpu->space(AS_PROGRAM).read_word(offset + 0xf80000, mem_mask);
}
-MACHINE_RESET_MEMBER(amiga_state,amiga)
+READ32_MEMBER( amiga_state::rom_mirror32_r )
{
- /* set m68k reset function */
- m_maincpu->set_reset_callback(write_line_delegate(FUNC(amiga_state::amiga_m68k_reset),this));
-
- amiga_m68k_reset(1);
-
- /* call the system-specific callback */
- if (m_intf->reset_callback)
- (*m_intf->reset_callback)(machine());
-
- /* start the scanline timer */
- timer_set(m_screen->time_until_pos(0), TIMER_SCANLINE);
+ return m_maincpu->space(AS_PROGRAM).read_dword(offset + 0xf80000, mem_mask);
}
-
void amiga_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
{
switch (id)
@@ -328,33 +305,32 @@ void amiga_state::device_timer(emu_timer &timer, device_timer_id id, int param,
*
*************************************/
-TIMER_CALLBACK_MEMBER(amiga_state::scanline_callback)
+void amiga_state::vblank()
{
- int scanline = param;
+ // signal vblank irq
+ set_interrupt(INTENA_SETCLR | INTENA_VERTB);
- /* on the first scanline, we do some extra bookkeeping */
- if (scanline == 0)
- {
- /* signal VBLANK IRQ */
- amiga_custom_w(m_maincpu->space(AS_PROGRAM), REG_INTREQ, 0x8000 | INTENA_VERTB, 0xffff);
+ // clock cia a (todo: this can be connected to either a fixed 50/60hz signal from the power supply, or the vblank)
+ m_cia_0->tod_w(1);
+ m_cia_0->tod_w(0);
+}
- /* clock the first CIA TOD */
- m_cia_0->tod_w(1);
- m_cia_0->tod_w(0);
+TIMER_CALLBACK_MEMBER( amiga_state::scanline_callback )
+{
+ int scanline = param;
- /* call the system-specific callback */
- if (m_intf->scanline0_callback != NULL)
- (*m_intf->scanline0_callback)(machine());
- }
+ // on the first scanline, we do some extra bookkeeping
+ if (scanline == 0)
+ vblank();
- /* on every scanline, clock the second CIA TOD */
+ // on every scanline, clock the second cia tod
m_cia_1->tod_w(1);
m_cia_1->tod_w(0);
- /* render up to this scanline */
+ // render up to this scanline
if (!m_screen->update_partial(scanline))
{
- if (IS_AGA(m_intf))
+ if (IS_AGA(this))
{
bitmap_rgb32 dummy_bitmap;
amiga_aga_render_scanline(machine(), dummy_bitmap, scanline);
@@ -366,10 +342,10 @@ TIMER_CALLBACK_MEMBER(amiga_state::scanline_callback)
}
}
- /* force a sound update */
+ // force a sound update
m_sound->update();
- /* set timer for next line */
+ // set timer for next line
scanline = (scanline + 1) % m_screen->height();
timer_set(m_screen->time_until_pos(scanline), TIMER_SCANLINE, scanline);
}
@@ -382,64 +358,71 @@ TIMER_CALLBACK_MEMBER(amiga_state::scanline_callback)
*
*************************************/
-static void update_irqs(running_machine &machine)
+void amiga_state::set_interrupt(int interrupt)
{
- amiga_state *state = machine.driver_data<amiga_state>();
+ custom_chip_w(m_maincpu->space(AS_PROGRAM), REG_INTREQ, interrupt, 0xffff);
+}
+
+void amiga_state::update_irqs()
+{
+ amiga_state *state = this;
int ints = CUSTOM_REG(REG_INTENA) & CUSTOM_REG(REG_INTREQ);
- /* Master interrupt switch */
- if (CUSTOM_REG(REG_INTENA) & 0x4000)
+ // master interrupt switch
+ if (CUSTOM_REG(REG_INTENA) & INTENA_INTEN)
{
- /* Serial transmit buffer empty, disk block finished, software interrupts */
- state->m_maincpu->set_input_line(1, ints & 0x0007 ? ASSERT_LINE : CLEAR_LINE);
-
- /* I/O ports and timer interrupts */
- state->m_maincpu->set_input_line(2, ints & 0x0008 ? ASSERT_LINE : CLEAR_LINE);
-
- /* Copper, VBLANK, blitter interrupts */
- state->m_maincpu->set_input_line(3, ints & 0x0070 ? ASSERT_LINE : CLEAR_LINE);
-
- /* Audio interrupts */
- state->m_maincpu->set_input_line(4, ints & 0x0780 ? ASSERT_LINE : CLEAR_LINE);
-
- /* Serial receive buffer full, disk sync match */
- state->m_maincpu->set_input_line(5, ints & 0x1800 ? ASSERT_LINE : CLEAR_LINE);
-
- /* External interrupts */
- state->m_maincpu->set_input_line(6, ints & 0x2000 ? ASSERT_LINE : CLEAR_LINE);
+ m_maincpu->set_input_line(1, ints & (INTENA_TBE | INTENA_DSKBLK | INTENA_SOFT) ? ASSERT_LINE : CLEAR_LINE);
+ m_maincpu->set_input_line(2, ints & (INTENA_PORTS) ? ASSERT_LINE : CLEAR_LINE);
+ m_maincpu->set_input_line(3, ints & (INTENA_COPER | INTENA_VERTB | INTENA_BLIT) ? ASSERT_LINE : CLEAR_LINE);
+ m_maincpu->set_input_line(4, ints & (INTENA_AUD0 | INTENA_AUD1 | INTENA_AUD2 | INTENA_AUD3) ? ASSERT_LINE : CLEAR_LINE);
+ m_maincpu->set_input_line(5, ints & (INTENA_RBF | INTENA_DSKSYN) ? ASSERT_LINE : CLEAR_LINE);
+ m_maincpu->set_input_line(6, ints & (INTENA_EXTER) ? ASSERT_LINE : CLEAR_LINE);
}
else
{
- state->m_maincpu->set_input_line(1, CLEAR_LINE);
- state->m_maincpu->set_input_line(2, CLEAR_LINE);
- state->m_maincpu->set_input_line(3, CLEAR_LINE);
- state->m_maincpu->set_input_line(4, CLEAR_LINE);
- state->m_maincpu->set_input_line(5, CLEAR_LINE);
- state->m_maincpu->set_input_line(6, CLEAR_LINE);
+ m_maincpu->set_input_line(1, CLEAR_LINE);
+ m_maincpu->set_input_line(2, CLEAR_LINE);
+ m_maincpu->set_input_line(3, CLEAR_LINE);
+ m_maincpu->set_input_line(4, CLEAR_LINE);
+ m_maincpu->set_input_line(5, CLEAR_LINE);
+ m_maincpu->set_input_line(6, CLEAR_LINE);
}
}
-
-TIMER_CALLBACK_MEMBER(amiga_state::amiga_irq_proc)
+TIMER_CALLBACK_MEMBER( amiga_state::amiga_irq_proc )
{
- update_irqs(machine());
- m_irq_timer->reset( );
+ update_irqs();
+ m_irq_timer->reset();
}
+//**************************************************************************
+// INPUTS
+//**************************************************************************
-/*************************************
- *
- * Standard joystick conversion
- *
- *************************************/
+UINT16 amiga_state::joy0dat_r()
+{
+ if (m_input_device->read_safe(0xff) & 0x10)
+ return m_joy0dat_port->read_safe(0xffff);
+ else
+ return (m_p1_mouse_y->read_safe(0xff) << 8) | m_p1_mouse_x->read_safe(0xff);
+}
+
+UINT16 amiga_state::joy1dat_r()
+{
+ if (m_input_device->read_safe(0xff) & 0x20)
+ return m_joy1dat_port->read_safe(0xffff);
+ else
+ return (m_p2_mouse_y->read_safe(0xff) << 8) | m_p2_mouse_x->read_safe(0xff);
+}
CUSTOM_INPUT_MEMBER( amiga_state::amiga_joystick_convert )
{
- ioport_port* ports[2] = { m_p1joy_port, m_p2joy_port };
- UINT8 bits;
- if (ports[(int)(FPTR)param]) bits = ports[(int)(FPTR)param]->read();
- else bits = 0xff;
+ ioport_port *ports[2] = { m_p1joy_port, m_p2joy_port };
+ UINT8 bits = 0xff;
+
+ if (ports[(int)(FPTR)param])
+ bits = ports[(int)(FPTR)param]->read();
int up = (bits >> 0) & 1;
int down = (bits >> 1) & 1;
@@ -483,6 +466,7 @@ static UINT32 blit_ascending(amiga_state *state)
/* fetch data for A */
if (CUSTOM_REG(REG_BLTCON0) & 0x0800)
{
+ //CUSTOM_REG(REG_BLTADAT) = state->m_maincpu->space(AS_PROGRAM).read_word(CUSTOM_REG_LONG(REG_BLTAPTH));
CUSTOM_REG(REG_BLTADAT) = (*state->m_chip_ram_r)(state, CUSTOM_REG_LONG(REG_BLTAPTH));
CUSTOM_REG_LONG(REG_BLTAPTH) += 2;
}
@@ -913,7 +897,7 @@ static UINT32 blit_line(amiga_state *state)
*
*************************************/
-TIMER_CALLBACK_MEMBER(amiga_state::amiga_blitter_proc)
+TIMER_CALLBACK_MEMBER( amiga_state::amiga_blitter_proc )
{
amiga_state *state = machine().driver_data<amiga_state>();
UINT32 blitsum = 0;
@@ -960,11 +944,11 @@ TIMER_CALLBACK_MEMBER(amiga_state::amiga_blitter_proc)
/* no longer busy */
CUSTOM_REG(REG_DMACON) &= ~0x4000;
- /* signal an interrupt */
- amiga_custom_w(m_maincpu->space(AS_PROGRAM), REG_INTREQ, 0x8000 | INTENA_BLIT, 0xffff);
+ // signal an interrupt
+ set_interrupt(0x8000 | INTENA_BLIT);
/* reset the blitter timer */
- m_blitter_timer->reset( );
+ m_blitter_timer->reset();
}
@@ -1022,7 +1006,7 @@ static void blitter_setup(address_space &space)
}
/* AGA has twice the bus bandwidth, so blits take half the time */
- if ( IS_AGA(state->m_intf) )
+ if (IS_AGA(state))
blittime /= 2;
/* signal blitter busy */
@@ -1033,141 +1017,147 @@ static void blitter_setup(address_space &space)
}
+//**************************************************************************
+// CENTRONICS
+//**************************************************************************
-/*************************************
- *
- * 8520 CIA read handler
- *
- *************************************/
+WRITE_LINE_MEMBER( amiga_state::centronics_ack_w )
+{
+ m_cia_0->flag_w(state);
+}
-READ16_MEMBER( amiga_state::amiga_cia_r )
+WRITE_LINE_MEMBER( amiga_state::centronics_busy_w )
{
- UINT8 data;
- int shift;
+ m_centronics_busy = state;
+ m_cia_1->sp_w(state);
+}
- /* offsets 0000-07ff reference CIA B, and are accessed via the MSB */
- if ((offset & 0x0800) == 0)
- {
- data = m_cia_1->read(space, offset >> 7);
- shift = 8;
- }
+WRITE_LINE_MEMBER( amiga_state::centronics_perror_w )
+{
+ m_centronics_perror = state;
+ m_cia_1->cnt_w(state);
+}
- /* offsets 0800-0fff reference CIA A, and are accessed via the LSB */
- else
- {
- data = m_cia_0->read(space, offset >> 7);
- shift = 0;
- }
+WRITE_LINE_MEMBER( amiga_state::centronics_select_w )
+{
+ m_centronics_select = state;
+}
- if (LOG_CIA)
- logerror("%06x:cia_%c_read(%03x) = %04x & %04x\n", space.device().safe_pc(), 'A' + ((~offset & 0x0800) >> 11), offset * 2, data << shift, mem_mask);
- return data << shift;
-}
+//**************************************************************************
+// 8520 CIA
+//**************************************************************************
+// CIA-A access: 101x xxxx xxx0 oooo xxxx xxx1
+// CIA-B access: 101x xxxx xx0x oooo xxxx xxx0
+READ16_MEMBER( amiga_state::cia_r )
+{
+ UINT16 data = 0;
-/*************************************
- *
- * 8520 CIA write handler
- *
- *************************************/
+ if ((offset & 0x1000/2) == 0 && ACCESSING_BITS_0_7)
+ data |= m_cia_0->read(space, offset >> 7);
-WRITE16_MEMBER( amiga_state::amiga_cia_w )
+ if ((offset & 0x2000/2) == 0 && ACCESSING_BITS_8_15)
+ data |= m_cia_1->read(space, offset >> 7) << 8;
+
+ if (LOG_CIA)
+ logerror("%s: cia_r(%06x) = %04x & %04x\n", space.machine().describe_context(), offset, data, mem_mask);
+
+ return data;
+}
+
+WRITE16_MEMBER( amiga_state::cia_w )
{
if (LOG_CIA)
- logerror("%06x:cia_%c_write(%03x) = %04x & %04x\n", space.device().safe_pc(), 'A' + ((~offset & 0x0800) >> 11), offset * 2, data, mem_mask);
+ logerror("%s: cia_w(%06x) = %04x & %04x\n", space.machine().describe_context(), offset, data, mem_mask);
- /* offsets 0000-07ff reference CIA B, and are accessed via the MSB */
- if ((offset & 0x0800) == 0)
- {
- if (!ACCESSING_BITS_8_15)
- return;
- m_cia_1->write(space, offset >> 7, (UINT8) data);
- data >>= 8;
- }
+ if ((offset & 0x1000/2) == 0 && ACCESSING_BITS_0_7)
+ m_cia_0->write(space, offset >> 7, data & 0xff);
- /* offsets 0800-0fff reference CIA A, and are accessed via the LSB */
- else
+ if ((offset & 0x2000/2) == 0 && ACCESSING_BITS_8_15)
+ m_cia_1->write(space, offset >> 7, data >> 8);
+}
+
+WRITE16_MEMBER( amiga_state::gayle_cia_w )
+{
+ // the first write to cia 0 after a reset switches in chip ram
+ if (m_gayle_reset && (offset & 0x1000/2) == 0 && ACCESSING_BITS_0_7)
{
- if (!ACCESSING_BITS_0_7)
- return;
- m_cia_0->write(space, offset >> 7, (UINT8) data);
- data &= 0xff;
+ m_gayle_reset = false;
+ m_overlay->set_bank(0);
}
+
+ // hand down to the standard cia handler
+ cia_w(space, offset, data, mem_mask);
}
+CUSTOM_INPUT_MEMBER( amiga_state::floppy_drive_status )
+{
+ return m_fdc->ciaapra_r();
+}
+WRITE8_MEMBER( amiga_state::cia_0_port_a_write )
+{
+ // bit 0, kickstart overlay
+ m_overlay->set_bank(BIT(data, 0));
-/*************************************
- *
- * CIA interrupt callbacks
- *
- *************************************/
+ // bit 1, power led
+ set_led_status(space.machine(), 0, !BIT(data, 1));
+ output_set_value("power_led", !BIT(data, 1));
+}
-WRITE_LINE_MEMBER(amiga_state::amiga_cia_0_irq)
+WRITE_LINE_MEMBER( amiga_state::cia_0_irq )
{
- amiga_custom_w(m_maincpu->space(AS_PROGRAM), REG_INTREQ, (state ? 0x8000 : 0x0000) | INTENA_PORTS, 0xffff);
+ m_cia_0_irq = state;
+ update_irq2();
}
-
-WRITE_LINE_MEMBER(amiga_state::amiga_cia_1_irq)
+READ8_MEMBER( amiga_state::cia_1_port_a_read )
{
- amiga_custom_w(m_maincpu->space(AS_PROGRAM), REG_INTREQ, (state ? 0x8000 : 0x0000) | INTENA_EXTER, 0xffff);
+ UINT8 data = 0;
+
+ // centronics
+ data |= m_centronics_busy << 0;
+ data |= m_centronics_perror << 1;
+ data |= m_centronics_select << 2; // shared with rs232 "ring indicator" (not emulated)
+
+ // bit 3 to 7, serial line (not emulated)
+
+ return data;
}
+WRITE_LINE_MEMBER( amiga_state::cia_1_irq )
+{
+ m_cia_1_irq = state;
+ update_irq6();
+}
-/*************************************
- *
- * Custom chip reset
- *
- *************************************/
+//**************************************************************************
+// CUSTOM CHIPS
+//**************************************************************************
-static void custom_reset(running_machine &machine)
+void amiga_state::custom_chip_reset()
{
- amiga_state *state = machine.driver_data<amiga_state>();
- int clock = state->m_maincpu->unscaled_clock();
- UINT16 vidmode = (clock == AMIGA_68000_NTSC_CLOCK || clock == AMIGA_68EC020_NTSC_CLOCK ) ? 0x1000 : 0x0000; /* NTSC or PAL? */
+ amiga_state *state = this;
+ CUSTOM_REG(REG_DENISEID) = m_denise_id;
+ CUSTOM_REG(REG_VPOSR) = m_agnus_id << 8;
CUSTOM_REG(REG_DDFSTRT) = 0x18;
CUSTOM_REG(REG_DDFSTOP) = 0xd8;
CUSTOM_REG(REG_INTENA) = 0x0000;
- CUSTOM_REG(REG_VPOSR) = vidmode;
CUSTOM_REG(REG_SERDATR) = 0x3000;
-
- switch (state->m_intf->chip_ram_mask)
- {
- case ANGUS_CHIP_RAM_MASK:
- case FAT_ANGUS_CHIP_RAM_MASK:
- CUSTOM_REG(REG_DENISEID) = 0x00FF;
- break;
-
- case ECS_CHIP_RAM_MASK:
- CUSTOM_REG(REG_VPOSR) |= 0x2000;
- CUSTOM_REG(REG_DENISEID) = 0x00FC;
- if (IS_AGA(state->m_intf))
- {
- CUSTOM_REG(REG_VPOSR) |= 0x0300;
- CUSTOM_REG(REG_DENISEID) = 0x00F8;
- }
- break;
- }
}
-
-
-/*************************************
- *
- * Custom chip register read
- *
- *************************************/
-
-READ16_MEMBER( amiga_state::amiga_custom_r )
+READ16_MEMBER( amiga_state::custom_chip_r )
{
- amiga_state *state = space.machine().driver_data<amiga_state>();
+ amiga_state *state = this;
UINT16 temp;
+ if (LOG_CUSTOM)
+ logerror("%06X:read from custom %s\n", space.device().safe_pc(), amiga_custom_names[offset & 0xff]);
+
switch (offset & 0xff)
{
case REG_BLTDDAT:
@@ -1193,18 +1183,10 @@ READ16_MEMBER( amiga_state::amiga_custom_r )
return CUSTOM_REG(REG_SERDATR);
case REG_JOY0DAT:
- if (state->m_intf->joy0dat_r != NULL)
- return (*state->m_intf->joy0dat_r)(space.machine());
-
- if (state->m_joy0dat_port) return state->m_joy0dat_port->read();
- else return 0xffff;
+ return joy0dat_r();
case REG_JOY1DAT:
- if (state->m_intf->joy1dat_r != NULL)
- return (*state->m_intf->joy1dat_r)(space.machine());
-
- if (state->m_joy1dat_port) return state->m_joy1dat_port->read();
- else return 0xffff;
+ return joy1dat_r();
case REG_POTGOR:
if (state->m_potgo_port) return state->m_potgo_port->read();
@@ -1257,33 +1239,10 @@ READ16_MEMBER( amiga_state::amiga_custom_r )
break;
}
- if (LOG_CUSTOM)
- logerror("%06X:read from custom %s\n", space.device().safe_pc(), amiga_custom_names[offset & 0xff]);
-
return 0xffff;
}
-
-
-/*************************************
- *
- * Custom chip register write
- *
- *************************************/
-
-TIMER_CALLBACK_MEMBER(amiga_state::finish_serial_write)
-{
- amiga_state *state = machine().driver_data<amiga_state>();
-
- /* mark the transfer buffer empty */
- CUSTOM_REG(REG_SERDATR) |= 0x3000;
-
- /* signal an interrupt */
- amiga_custom_w(state->m_maincpu->space(AS_PROGRAM), REG_INTREQ, 0x8000 | INTENA_TBE, 0xffff);
-}
-
-
-WRITE16_MEMBER( amiga_state::amiga_custom_w )
+WRITE16_MEMBER( amiga_state::custom_chip_w )
{
amiga_state *state = space.machine().driver_data<amiga_state>();
UINT16 temp;
@@ -1322,15 +1281,13 @@ WRITE16_MEMBER( amiga_state::amiga_custom_w )
break;
case REG_POTGO:
- if (state->m_intf->potgo_w != NULL)
- (*state->m_intf->potgo_w)(space.machine(), data);
+ potgo_w(data);
break;
case REG_SERDAT:
- if (state->m_intf->serdat_w != NULL)
- (*state->m_intf->serdat_w)(space.machine(), data);
+ serdat_w(data);
CUSTOM_REG(REG_SERDATR) &= ~0x3000;
- timer_set(amiga_get_serial_char_period(space.machine()), TIMER_FINISH_SERIAL_WRITE);
+ timer_set(serial_char_period(), TIMER_FINISH_SERIAL_WRITE);
break;
case REG_BLTSIZE:
@@ -1342,16 +1299,16 @@ WRITE16_MEMBER( amiga_state::amiga_custom_w )
blitter_setup(space);
break;
- case REG_BLTSIZV: /* ECS-AGA only */
- if ( IS_ECS_OR_AGA(state->m_intf) )
+ case REG_BLTSIZV:
+ if (IS_ECS(state) || IS_AGA(state))
{
CUSTOM_REG(REG_BLTSIZV) = data & 0x7fff;
if ( CUSTOM_REG(REG_BLTSIZV) == 0 ) CUSTOM_REG(REG_BLTSIZV) = 0x8000;
}
break;
- case REG_BLTSIZH: /* ECS-AGA only */
- if ( IS_ECS_OR_AGA(state->m_intf) )
+ case REG_BLTSIZH:
+ if (IS_ECS(state) || IS_AGA(state))
{
CUSTOM_REG(REG_BLTSIZH) = data & 0x7ff;
if ( CUSTOM_REG(REG_BLTSIZH) == 0 ) CUSTOM_REG(REG_BLTSIZH) = 0x800;
@@ -1359,8 +1316,8 @@ WRITE16_MEMBER( amiga_state::amiga_custom_w )
}
break;
- case REG_BLTCON0L: /* ECS-AGA only */
- if ( IS_ECS_OR_AGA(state->m_intf) )
+ case REG_BLTCON0L:
+ if (IS_ECS(state) || IS_AGA(state))
{
CUSTOM_REG(REG_BLTCON0) &= 0xff00;
CUSTOM_REG(REG_BLTCON0) |= data & 0xff;
@@ -1369,7 +1326,7 @@ WRITE16_MEMBER( amiga_state::amiga_custom_w )
case REG_SPR0PTH: case REG_SPR1PTH: case REG_SPR2PTH: case REG_SPR3PTH:
case REG_SPR4PTH: case REG_SPR5PTH: case REG_SPR6PTH: case REG_SPR7PTH:
- data &= ( state->m_intf->chip_ram_mask >> 16 );
+ data &= ( state->m_chip_ram_mask >> 16 );
break;
case REG_SPR0PTL: case REG_SPR1PTL: case REG_SPR2PTL: case REG_SPR3PTL:
@@ -1390,7 +1347,7 @@ WRITE16_MEMBER( amiga_state::amiga_custom_w )
break;
case REG_COP1LCH: case REG_COP2LCH:
- data &= ( state->m_intf->chip_ram_mask >> 16 );
+ data &= ( state->m_chip_ram_mask >> 16 );
break;
case REG_COPJMP1:
@@ -1425,37 +1382,39 @@ WRITE16_MEMBER( amiga_state::amiga_custom_w )
/* if 'blitter-nasty' has been turned on and we have a blit pending, reschedule it */
if ( ( data & 0x400 ) && ( CUSTOM_REG(REG_DMACON) & 0x4000 ) )
- state->m_blitter_timer->adjust( downcast<cpu_device *>(&space.device())->cycles_to_attotime( BLITTER_NASTY_DELAY ));
+ m_blitter_timer->adjust(m_maincpu->cycles_to_attotime(BLITTER_NASTY_DELAY));
break;
case REG_INTENA:
temp = data;
- data = (data & 0x8000) ? (CUSTOM_REG(offset) | (data & 0x7fff)) : (CUSTOM_REG(offset) & ~(data & 0x7fff));
+ data = (data & INTENA_SETCLR) ? (CUSTOM_REG(offset) | (data & 0x7fff)) : (CUSTOM_REG(offset) & ~(data & 0x7fff));
CUSTOM_REG(offset) = data;
- if ( temp & 0x8000 ) /* if we're enabling irq's, delay a bit */
- state->m_irq_timer->adjust( downcast<cpu_device *>(&space.device())->cycles_to_attotime( AMIGA_IRQ_DELAY_CYCLES ));
- else /* if we're disabling irq's, process right away */
- update_irqs(space.machine());
+ if (temp & INTENA_SETCLR)
+ // if we're enabling irq's, delay a bit
+ m_irq_timer->adjust(m_maincpu->cycles_to_attotime(AMIGA_IRQ_DELAY_CYCLES));
+ else
+ // if we're disabling irq's, process right away
+ update_irqs();
break;
case REG_INTREQ:
temp = data;
- /* Update serial data line status if appropiate */
- if (!(data & 0x8000) && (data & INTENA_RBF))
- CUSTOM_REG(REG_SERDATR) &= ~0x8000;
+ // update serial data line status if appropriate */
+ if (!(data & INTENA_SETCLR) && (data & INTENA_RBF))
+ CUSTOM_REG(REG_SERDATR) &= ~INTENA_SETCLR;
- data = (data & 0x8000) ? (CUSTOM_REG(offset) | (data & 0x7fff)) : (CUSTOM_REG(offset) & ~(data & 0x7fff));
- if ( state->m_cia_0->irq_r() ) data |= INTENA_PORTS;
- if ( state->m_cia_1->irq_r() ) data |= INTENA_EXTER;
+ data = (data & INTENA_SETCLR) ? (CUSTOM_REG(offset) | (data & 0x7fff)) : (CUSTOM_REG(offset) & ~(data & 0x7fff));
CUSTOM_REG(offset) = data;
- if ( temp & 0x8000 ) /* if we're generating irq's, delay a bit */
- state->m_irq_timer->adjust( state->m_maincpu->cycles_to_attotime( AMIGA_IRQ_DELAY_CYCLES ));
- else /* if we're clearing irq's, process right away */
- update_irqs(space.machine());
+ if (temp & INTENA_SETCLR)
+ // if we're generating irq's, delay a bit
+ m_irq_timer->adjust(m_maincpu->cycles_to_attotime(AMIGA_IRQ_DELAY_CYCLES));
+ else
+ // if we're clearing irq's, process right away
+ update_irqs();
break;
case REG_ADKCON:
@@ -1477,7 +1436,7 @@ WRITE16_MEMBER( amiga_state::amiga_custom_w )
case REG_BPL1PTH: case REG_BPL2PTH: case REG_BPL3PTH: case REG_BPL4PTH:
case REG_BPL5PTH: case REG_BPL6PTH:
- data &= ( state->m_intf->chip_ram_mask >> 16 );
+ data &= ( state->m_chip_ram_mask >> 16 );
break;
case REG_BPLCON0:
@@ -1497,7 +1456,7 @@ WRITE16_MEMBER( amiga_state::amiga_custom_w )
case REG_COLOR20: case REG_COLOR21: case REG_COLOR22: case REG_COLOR23:
case REG_COLOR24: case REG_COLOR25: case REG_COLOR26: case REG_COLOR27:
case REG_COLOR28: case REG_COLOR29: case REG_COLOR30: case REG_COLOR31:
- if (IS_AGA(state->m_intf))
+ if (IS_AGA(state))
{
amiga_aga_palette_write(space.machine(), offset - REG_COLOR00, data);
}
@@ -1509,11 +1468,11 @@ WRITE16_MEMBER( amiga_state::amiga_custom_w )
break;
case REG_DIWSTRT:
case REG_DIWSTOP:
- if (IS_AGA(state->m_intf))
+ if (IS_AGA(state))
amiga_aga_diwhigh_written(space.machine(), 0);
break;
case REG_DIWHIGH:
- if (IS_AGA(state->m_intf))
+ if (IS_AGA(state))
amiga_aga_diwhigh_written(space.machine(), 1);
break;
@@ -1521,7 +1480,7 @@ WRITE16_MEMBER( amiga_state::amiga_custom_w )
break;
}
- if (IS_AGA(state->m_intf))
+ if (IS_AGA(state))
CUSTOM_REG(offset) = data;
else
if (offset <= REG_COLOR31)
@@ -1529,298 +1488,48 @@ WRITE16_MEMBER( amiga_state::amiga_custom_w )
}
+//**************************************************************************
+// SERIAL
+//**************************************************************************
-/*************************************
- *
- * Serial writes
- *
- *************************************/
+TIMER_CALLBACK_MEMBER( amiga_state::finish_serial_write )
+{
+ amiga_state *state = machine().driver_data<amiga_state>();
+
+ // mark the transfer buffer empty
+ CUSTOM_REG(REG_SERDATR) |= 0x3000;
+
+ // signal an interrupt
+ set_interrupt(INTENA_SETCLR | INTENA_TBE);
+}
-void amiga_serial_in_w(running_machine &machine, UINT16 data)
+void amiga_state::serial_in_w(UINT16 data)
{
- amiga_state *state = machine.driver_data<amiga_state>();
- address_space &space = state->m_maincpu->space(AS_PROGRAM);
+ amiga_state *state = this;
int mask = (CUSTOM_REG(REG_SERPER) & 0x8000) ? 0x1ff : 0xff;
- /* copy the data to the low 8 bits of SERDATR and set RBF */
+ // copy the data to the low 8 bits of SERDATR and set RBF
CUSTOM_REG(REG_SERDATR) &= ~0x3ff;
CUSTOM_REG(REG_SERDATR) |= (data & mask) | (mask + 1) | 0x4000;
- /* set overrun if we weren't cleared */
+ // set overrun if we weren't cleared
if (CUSTOM_REG(REG_INTREQ) & INTENA_RBF)
{
osd_printf_debug("Serial data overflow\n");
CUSTOM_REG(REG_SERDATR) |= 0x8000;
}
- /* signal an interrupt */
- state->amiga_custom_w(space, REG_INTREQ, 0x8000 | INTENA_RBF, 0xffff);
+ // signal an interrupt
+ set_interrupt(INTENA_SETCLR | INTENA_RBF);
}
-
-attotime amiga_get_serial_char_period(running_machine &machine)
+attotime amiga_state::serial_char_period()
{
- amiga_state *state = machine.driver_data<amiga_state>();
+ amiga_state *state = this;
+
UINT32 divisor = (CUSTOM_REG(REG_SERPER) & 0x7fff) + 1;
- UINT32 baud = state->m_maincpu->unscaled_clock() / 2 / divisor;
+ UINT32 baud = m_maincpu->unscaled_clock() / 2 / divisor;
UINT32 numbits = 2 + ((CUSTOM_REG(REG_SERPER) & 0x8000) ? 9 : 8);
- return attotime::from_hz(baud) * numbits;
-}
-
-
-
-/*************************************
- *
- * Autoconfig registration
- *
- *************************************/
-
-void amiga_add_autoconfig(running_machine &machine, const amiga_autoconfig_device *device)
-{
- amiga_state *state = machine.driver_data<amiga_state>();
- autoconfig_device *dev, **d;
-
- /* validate the data */
- assert_always(machine.phase() == MACHINE_PHASE_INIT, "Can only call amiga_add_autoconfig at init time!");
- assert_always((device->size & (device->size - 1)) == 0, "device->size must be power of 2!");
-
- /* allocate memory and link it in at the end of the list */
- dev = auto_alloc(machine, autoconfig_device);
- dev->next = NULL;
- for (d = &state->m_autoconfig_list; *d; d = &(*d)->next) ;
- *d = dev;
-
- /* fill in the data */
- dev->device = *device;
- dev->base = 0;
-}
-
-
-/*************************************
- *
- * Autoconfig reset
- *
- *************************************/
-
-static void autoconfig_reset(running_machine &machine)
-{
- amiga_state *state = machine.driver_data<amiga_state>();
- autoconfig_device *dev;
-
- /* uninstall any installed devices */
- for (dev = state->m_autoconfig_list; dev; dev = dev->next)
- if (dev->base && dev->device.uninstall)
- {
- (*dev->device.uninstall)(machine, dev->base);
- dev->base = 0;
- }
-
- /* reset the current autoconfig */
- state->m_cur_autoconfig = state->m_autoconfig_list;
-}
-
-
-
-/*************************************
- *
- * Autoconfig space read
- *
- *************************************/
-
-READ16_MEMBER( amiga_state::amiga_autoconfig_r )
-{
- amiga_state *state = space.machine().driver_data<amiga_state>();
- autoconfig_device *cur_autoconfig = state->m_cur_autoconfig;
- UINT8 byte;
- int i;
-
- /* if nothing present, just return */
- if (!cur_autoconfig)
- {
- logerror("autoconfig_r(%02X) but no device selected\n", offset);
- return 0;
- }
-
- /* switch off of the base offset */
- switch (offset/2)
- {
- /*
- 00/02 1 1 x x x 0 0 0 = 8 Megabytes
- ^ ^ ^ 0 0 1 = 64 Kbytes
- | | | 0 1 0 = 128 Kbytes
- | | | 0 1 1 = 256 Kbytes
- | | | 1 0 0 = 1 Megabyte
- | | | 1 1 0 = 2 Megabytes
- | | | 1 1 1 = 4 Megabytes
- | | |
- | | `-- 1 = multiple devices on this card
- | `-------- 1 = ROM vector offset is valid
- `----------- 1 = link into free memory list
- */
- case 0x00/4:
- byte = 0xc0;
- if (cur_autoconfig->device.link_memory)
- byte |= 0x20;
- if (cur_autoconfig->device.rom_vector_valid)
- byte |= 0x10;
- if (cur_autoconfig->device.multi_device)
- byte |= 0x08;
- for (i = 0; i < 8; i++)
- if (cur_autoconfig->device.size & (1 << i))
- break;
- byte |= (i + 1) & 7;
- break;
-
- /*
- 04/06 product number (all bits inverted)
- */
- case 0x04/4:
- byte = ~cur_autoconfig->device.product_number;
- break;
-
- /*
- 08/0a x x 1 1 1 1 1 1
- ^ ^
- | |
- | `-- 1 = this board can be shut up
- `----- 0 = prefer 8 Meg address space
- */
- case 0x08/4:
- byte = 0x3f;
- if (!cur_autoconfig->device.prefer_8meg)
- byte |= 0x80;
- if (cur_autoconfig->device.can_shutup)
- byte |= 0x40;
- break;
-
- /*
- 10/12 manufacturers number (high byte, all inverted)
- 14/16 '' (low byte, all inverted)
- */
- case 0x10/4:
- byte = ~cur_autoconfig->device.mfr_number >> 8;
- break;
-
- case 0x14/4:
- byte = ~cur_autoconfig->device.mfr_number >> 0;
- break;
-
- /*
- 18/1a optional serial number (all bits inverted) byte0
- 1c/1e '' byte1
- 20/22 '' byte2
- 24/26 '' byte3
- */
- case 0x18/4:
- byte = ~cur_autoconfig->device.serial_number >> 24;
- break;
-
- case 0x1c/4:
- byte = ~cur_autoconfig->device.serial_number >> 16;
- break;
-
- case 0x20/4:
- byte = ~cur_autoconfig->device.serial_number >> 8;
- break;
-
- case 0x24/4:
- byte = ~cur_autoconfig->device.serial_number >> 0;
- break;
-
- /*
- 28/2a optional ROM vector offset (all bits inverted) high byte
- 2c/2e '' low byte
- */
- case 0x28/4:
- byte = ~cur_autoconfig->device.rom_vector >> 8;
- break;
-
- case 0x2c/4:
- byte = ~cur_autoconfig->device.rom_vector >> 0;
- break;
-
- /*
- 40/42 optional interrupt control and status register
- */
- case 0x40/4:
- byte = 0x00;
- if (cur_autoconfig->device.int_control_r)
- byte = (*cur_autoconfig->device.int_control_r)(space.machine());
- break;
-
- default:
- byte = 0xff;
- break;
- }
-
- /* return the appropriate nibble */
- logerror("autoconfig_r(%02X) = %04X\n", offset, (offset & 1) ? ((byte << 12) | 0xfff) : ((byte << 8) | 0xfff));
- return (offset & 1) ? ((byte << 12) | 0xfff) : ((byte << 8) | 0xfff);
-}
-
-
-
-/*************************************
- *
- * Autoconfig space write
- *
- *************************************/
-
-WRITE16_MEMBER( amiga_state::amiga_autoconfig_w )
-{
- amiga_state *state = space.machine().driver_data<amiga_state>();
- autoconfig_device *cur_autoconfig = state->m_cur_autoconfig;
- int move_to_next = FALSE;
-
- logerror("autoconfig_w(%02X) = %04X & %04X\n", offset, data, mem_mask);
-
- /* if no current device, bail */
- if (!cur_autoconfig || !ACCESSING_BITS_8_15)
- return;
-
- /* switch off of the base offset */
- switch (offset/2)
- {
- /*
- 48/4a write-only register for base address (A23-A16)
- */
- case 0x48/4:
- if ((offset & 1) == 0)
- cur_autoconfig->base = (cur_autoconfig->base & ~0xf00000) | ((data & 0xf000) << 8);
- else
- cur_autoconfig->base = (cur_autoconfig->base & ~0x0f0000) | ((data & 0xf000) << 4);
- move_to_next = TRUE;
- break;
-
- /*
- 4c/4e optional write-only 'shutup' trigger
- */
- case 0x4c/4:
- cur_autoconfig->base = 0;
- move_to_next = TRUE;
- break;
- }
-
- /* install and move to the next device if requested */
- if (move_to_next && (offset & 1) == 0)
- {
- logerror("Install to %06X\n", cur_autoconfig->base);
- if (cur_autoconfig->base && cur_autoconfig->device.install)
- (*cur_autoconfig->device.install)(space.machine(), cur_autoconfig->base);
- state->m_cur_autoconfig = cur_autoconfig->next;
- }
-}
-
-
-
-/*************************************
- *
- * Get interface
- *
- *************************************/
-
-const amiga_machine_interface *amiga_get_interface(running_machine &machine)
-{
- return machine.driver_data<amiga_state>()->m_intf;
+ return attotime::from_hz(baud) * numbits;
}
diff --git a/src/mame/mame.lst b/src/mame/mame.lst
index 98418b5309b..fbfaee8948f 100644
--- a/src/mame/mame.lst
+++ b/src/mame/mame.lst
@@ -9916,7 +9916,7 @@ mquake // (c) 1987
upscope // (c) 1986 Grand products
// Cubo32 (Commodore CD32-based HW)
-cd32bios // Base unit
+cubo // Base unit
cndypuzl // (c) 1995
haremchl // (c) 1995
lsrquiz // (c) 1995
diff --git a/src/mame/mame.mak b/src/mame/mame.mak
index d6d34e80446..b8c40855ba5 100644
--- a/src/mame/mame.mak
+++ b/src/mame/mame.mak
@@ -177,6 +177,7 @@ SOUNDS += SN76496
SOUNDS += POKEY
SOUNDS += TIA
SOUNDS += NES_APU
+SOUNDS += AMIGA
SOUNDS += ASTROCADE
SOUNDS += NAMCO
SOUNDS += NAMCO_15XX
@@ -338,6 +339,7 @@ VIDEOS += VOODOO
# specify available machine cores
#-------------------------------------------------
+MACHINES += AKIKO
MACHINES += NCR53C7XX
MACHINES += LSI53C810
MACHINES += 6522VIA
@@ -777,9 +779,9 @@ $(MAMEOBJ)/alpha.a: \
$(MAMEOBJ)/amiga.a: \
$(DRIVERS)/alg.o \
- $(MACHINE)/amiga.o $(AUDIO)/amiga.o $(VIDEO)/amiga.o $(VIDEO)/amigaaga.o\
+ $(MACHINE)/amiga.o $(VIDEO)/amiga.o $(VIDEO)/amigaaga.o\
$(DRIVERS)/arcadia.o \
- $(DRIVERS)/cd32.o $(MACHINE)/cd32.o \
+ $(DRIVERS)/cubo.o \
$(DRIVERS)/mquake.o \
$(DRIVERS)/upscope.o \
diff --git a/src/mame/video/amiga.c b/src/mame/video/amiga.c
index 30a1080b832..335edfbcb5b 100644
--- a/src/mame/video/amiga.c
+++ b/src/mame/video/amiga.c
@@ -206,7 +206,7 @@ int amiga_copper_execute_next(running_machine &machine, int xpos)
{
if (LOG_COPPER)
logerror("%02X.%02X: Write to %s = %04x\n", state->m_last_scanline, xpos / 2, amiga_custom_names[state->m_copper_pending_offset & 0xff], state->m_copper_pending_data);
- state->amiga_custom_w(*state->m_maincpu_program_space, state->m_copper_pending_offset, state->m_copper_pending_data, 0xffff);
+ state->custom_chip_w(state->m_copper_pending_offset, state->m_copper_pending_data);
state->m_copper_pending_offset = 0;
}
@@ -262,7 +262,7 @@ int amiga_copper_execute_next(running_machine &machine, int xpos)
{
if (LOG_COPPER)
logerror("%02X.%02X: Write to %s = %04x\n", state->m_last_scanline, xpos / 2, amiga_custom_names[word0 & 0xff], word1);
- state->amiga_custom_w(*state->m_maincpu_program_space, word0, word1, 0xffff);
+ state->custom_chip_w(word0, word1);
}
else // additional 2 cycles needed for non-Agnus registers
{
@@ -624,6 +624,7 @@ void amiga_render_scanline(running_machine &machine, bitmap_ind16 &bitmap, int s
UINT16 save_color0 = CUSTOM_REG(REG_COLOR00);
int ddf_start_pixel = 0, ddf_stop_pixel = 0;
int hires = 0, dualpf = 0, ham = 0;
+ //int lace = 0;
int hstart = 0, hstop = 0;
int vstart = 0, vstop = 0;
int pf1pri = 0, pf2pri = 0;
@@ -663,7 +664,7 @@ void amiga_render_scanline(running_machine &machine, bitmap_ind16 &bitmap, int s
/* loop over the line */
next_copper_x = 0;
- for (x = 0; x < 0xe4*2; x++)
+ for (x = 0; x < 227.5*2; x++)
{
int sprpix;
@@ -682,11 +683,13 @@ void amiga_render_scanline(running_machine &machine, bitmap_ind16 &bitmap, int s
hires = CUSTOM_REG(REG_BPLCON0) & BPLCON0_HIRES;
ham = CUSTOM_REG(REG_BPLCON0) & BPLCON0_HOMOD;
dualpf = CUSTOM_REG(REG_BPLCON0) & BPLCON0_DBLPF;
-// lace = CUSTOM_REG(REG_BPLCON0) & BPLCON0_LACE;
+ //lace = CUSTOM_REG(REG_BPLCON0) & BPLCON0_LACE;
/* compute the pixel fetch parameters */
- ddf_start_pixel = ( CUSTOM_REG(REG_DDFSTRT) & 0xfc ) * 2 + (hires ? 9 : 17);
- ddf_stop_pixel = ( CUSTOM_REG(REG_DDFSTOP) & 0xfc ) * 2 + (hires ? (9 + defbitoffs) : (17 + defbitoffs));
+ ddf_start_pixel = (CUSTOM_REG(REG_DDFSTRT) & (hires ? 0xfc : 0xf8)) * 2;
+ ddf_start_pixel += hires ? 9 : 17;
+ ddf_stop_pixel = (CUSTOM_REG(REG_DDFSTOP) & (hires ? 0xfc : 0xf8)) * 2;
+ ddf_stop_pixel += hires ? (9 + defbitoffs) : (17 + defbitoffs);
if ( ( CUSTOM_REG(REG_DDFSTRT) ^ CUSTOM_REG(REG_DDFSTOP) ) & 0x04 )
ddf_stop_pixel += 8;
@@ -943,24 +946,27 @@ void amiga_render_scanline(running_machine &machine, bitmap_ind16 &bitmap, int s
}
#if 0
- if ( m_screen->frame_number() % 64 == 0 && scanline == 100 )
+ if ( machine.first_screen()->frame_number() % 64 == 0 && scanline == 100 )
{
+#if 0
const char *m_lores = "LORES";
const char *m_hires = "HIRES";
const char *m_ham = "HAM";
const char *m_dualpf = "DUALPF";
- const char *m_lace = "LACE";
- const char *m_hilace = "HI-LACE";
+ //const char *m_lace = "LACE";
+ //const char *m_hilace = "HI-LACE";
const char *p = m_lores;
if ( hires ) p = m_hires;
if ( ham ) p = m_ham;
if ( dualpf ) p = m_dualpf;
- if ( lace ) p = m_lace;
-
- if ( hires && lace ) p = m_hilace;
+ //if ( lace ) p = m_lace;
- popmessage("%s(%d pl od=%04x ed=%04x start=%04x stop=%04x)", p, planes, odelay, edelay, CUSTOM_REG(REG_DDFSTRT), CUSTOM_REG(REG_DDFSTOP) );
+ //if ( hires && lace ) p = m_hilace;
+#endif
+ //popmessage("%s(%d pl od=%04x ed=%04x start=%04x stop=%04x)", p, planes, odelay, edelay, CUSTOM_REG(REG_DDFSTRT), CUSTOM_REG(REG_DDFSTOP) );
+ //popmessage("%s(%d pl y=%d vstart=%04x vstop=%04x start=%04x stop=%04x)", p, planes, scanline, vstart, vstop, CUSTOM_REG(REG_DDFSTRT), CUSTOM_REG(REG_DDFSTOP) );
+ popmessage("DDFSTRT=%04x, DDFSTOP=%04x, DIWSTRT=%04x, DIWSTOP=%04x", CUSTOM_REG(REG_DDFSTRT), CUSTOM_REG(REG_DDFSTOP), CUSTOM_REG(REG_DIWSTRT), CUSTOM_REG(REG_DIWSTOP));
}
#endif
@@ -974,6 +980,9 @@ void amiga_render_scanline(running_machine &machine, bitmap_ind16 &bitmap, int s
/* update even planes */
for (pl = 1; pl < planes; pl += 2)
CUSTOM_REG_LONG(REG_BPL1PTH + pl * 2) += CUSTOM_REG_SIGNED(REG_BPL2MOD);
+
+ if (machine.input().code_pressed(KEYCODE_Q))
+ printf("%03d BPL1MOD=%04x BPL2MOD=%04x BPLCON1=%04x\n", scanline, CUSTOM_REG(REG_BPL1MOD), CUSTOM_REG(REG_BPL2MOD), CUSTOM_REG(REG_BPLCON1));
}
/* restore color00 */
@@ -1001,10 +1010,8 @@ void amiga_render_scanline(running_machine &machine, bitmap_ind16 &bitmap, int s
/* TODO: alg.c requires that this uses RGB32 */
UINT32 amiga_state::screen_update_amiga(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
- int y;
-
- /* render each scanline in the visible region */
- for (y = cliprect.min_y; y <= cliprect.max_y; y++)
+ // render each scanline in the visible region
+ for (int y = cliprect.min_y; y <= cliprect.max_y; y++)
amiga_render_scanline(machine(), bitmap, y);
return 0;
diff --git a/src/mess/drivers/amiga.c b/src/mess/drivers/amiga.c
index 72a00a2f8cc..17b78ad2947 100644
--- a/src/mess/drivers/amiga.c
+++ b/src/mess/drivers/amiga.c
@@ -1,1290 +1,1957 @@
/***************************************************************************
-Commodore Amiga - (c) 1985, Commodore Business Machines Co.
-Preliminary driver by:
+ Commodore Amiga
-Ernesto Corvi
-
-Note 1: The 'fast-mem' memory detector in Kickstart 1.2 expects to
-see the custom chips at the end of any present fast memory (mapped
-from $C00000 onwards). I assume this is a bug, given that the routine
-was entirely rewritten for Kickstart 1.3. So the strategy is, for
-any machine that can run Kickstart 1.2 (a500,a1000 and a2000), we
-map a mirror of the custom chips right after any fast-mem we mapped.
-If we didn't map any, then we still put a mirror, but where fast-mem
-would commence ($C00000).
-
-Note 2: when you do disk swapping it often causes crashes in the system.
-This is because you have to UNLOAD the image first then LOAD whatever image
-the program asked to. Just like on a real system, apparently the Amiga is
-very fussy with the state machine.
+ license: MAME, GPL-2.0+
+ copyright-holders: Dirk Best
***************************************************************************/
-/*
- Amiga 1200
-
- Preliminary MAME driver by Mariusz Wojcieszek
- CD-ROM controller by Ernesto Corvi
- Borrowed by incog for MESS
-
- 2009-05 Fabio Priuli:
- Amiga 1200 support is just sketched (I basically took cd32 and removed Akiko). I connected
- the floppy drive in the same way as in amiga.c but it seems to be not working, since I
- tried to load WB3.1 with no success. However, this problem may be due to anything: maybe
- the floppy code must be connected elsewhere, or the .adf image is broken, or I made some
- stupid mistake in the CIA interfaces.
- Later, it could be wise to re-factor this source and merge the non-AGA code with
- mess/drivers/amiga.c
-*/
-
-/* Core includes */
+
#include "emu.h"
#include "includes/amiga.h"
-#include "includes/cd32.h"
-
-/* Components */
+#include "bus/zorro/zorro.h"
#include "cpu/m68000/m68000.h"
#include "cpu/m6502/m6502.h"
+#include "machine/bankdev.h"
#include "machine/6525tpi.h"
#include "machine/6526cia.h"
-#include "machine/amigafdc.h"
-#include "machine/amigakbd.h"
-#include "machine/amigacd.h"
-#include "machine/amigacrt.h"
+#include "machine/dmac.h"
#include "machine/nvram.h"
-#include "sound/cdda.h"
#include "machine/i2cmem.h"
-#include "amiga.lh"
+#include "machine/amigafdc.h"
+#include "machine/amigakbd.h"
+#include "machine/cr511b.h"
+#include "machine/rp5c01.h"
+
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
-/* Devices */
-#include "imagedev/chd_cd.h"
-#include "imagedev/cartslot.h"
+class a1000_state : public amiga_state
+{
+public:
+ a1000_state(const machine_config &mconfig, device_type type, const char *tag) :
+ amiga_state(mconfig, type, tag),
+ m_bootrom(*this, "bootrom"),
+ m_wom(*this, "wom")
+ { }
+
+ DECLARE_DRIVER_INIT( pal );
+ DECLARE_DRIVER_INIT( ntsc );
+
+ DECLARE_WRITE16_MEMBER( write_protect_w );
+
+protected:
+ virtual void machine_start();
+ virtual void machine_reset();
+
+private:
+ required_device<address_map_bank_device> m_bootrom;
+ required_memory_bank m_wom;
+ dynamic_array<UINT16> m_wom_ram;
+};
+
+class a2000_state : public amiga_state
+{
+public:
+ a2000_state(const machine_config &mconfig, device_type type, const char *tag) :
+ amiga_state(mconfig, type, tag),
+ m_rtc(*this, "u65"),
+ m_zorro2_int2(0),
+ m_zorro2_int6(0)
+ { }
+
+ DECLARE_DRIVER_INIT( pal );
+ DECLARE_DRIVER_INIT( ntsc );
+
+ DECLARE_WRITE_LINE_MEMBER( zorro2_int2_w );
+ DECLARE_WRITE_LINE_MEMBER( zorro2_int6_w );
+
+ DECLARE_READ16_MEMBER( clock_r );
+ DECLARE_WRITE16_MEMBER( clock_w );
+
+protected:
+ // amiga_state overrides
+ virtual void update_int2();
+ virtual void update_int6();
+
+private:
+ // devices
+ required_device<msm6242_device> m_rtc;
+
+ // internal state
+ int m_zorro2_int2;
+ int m_zorro2_int6;
+};
+
+class a500_state : public amiga_state
+{
+public:
+ a500_state(const machine_config &mconfig, device_type type, const char *tag) :
+ amiga_state(mconfig, type, tag),
+ m_side_int2(0),
+ m_side_int6(0)
+ { }
+
+ DECLARE_DRIVER_INIT( pal );
+ DECLARE_DRIVER_INIT( ntsc );
+
+protected:
+
+private:
+ // internal state
+ int m_side_int2;
+ int m_side_int6;
+};
class cdtv_state : public amiga_state
{
public:
- cdtv_state(const machine_config &mconfig, device_type type, const char *tag)
- : amiga_state(mconfig, type, tag) { }
+ cdtv_state(const machine_config &mconfig, device_type type, const char *tag) :
+ amiga_state(mconfig, type, tag),
+ m_rtc(*this, "u61"),
+ m_dmac(*this, "u36"),
+ m_tpi(*this, "u32"),
+ m_cdrom(*this, "cdrom"),
+ m_dmac_irq(0),
+ m_tpi_irq(0)
+ { }
+
+ DECLARE_DRIVER_INIT( pal );
+ DECLARE_DRIVER_INIT( ntsc );
+
+ DECLARE_READ16_MEMBER( clock_r );
+ DECLARE_WRITE16_MEMBER( clock_w );
+
+ DECLARE_READ8_MEMBER( dmac_scsi_data_read );
+ DECLARE_WRITE8_MEMBER( dmac_scsi_data_write );
+ DECLARE_READ8_MEMBER( dmac_io_read );
+ DECLARE_WRITE8_MEMBER( dmac_io_write );
+ DECLARE_WRITE_LINE_MEMBER( dmac_int_w );
+
+ DECLARE_WRITE8_MEMBER( tpi_port_b_write );
+ DECLARE_WRITE_LINE_MEMBER( tpi_int_w );
+
+protected:
+ // driver_device overrides
+ virtual void machine_start();
+
+ // amiga_state overrides
+ virtual void update_int2();
+ virtual void update_int6();
+
+private:
+ // devices
+ required_device<msm6242_device> m_rtc;
+ required_device<dmac_device> m_dmac;
+ required_device<tpi6525_device> m_tpi;
+ required_device<cr511b_device> m_cdrom;
+
+ // internal state
+ int m_dmac_irq;
+ int m_tpi_irq;
+};
+
+class a3000_state : public amiga_state
+{
+public:
+ a3000_state(const machine_config &mconfig, device_type type, const char *tag) :
+ amiga_state(mconfig, type, tag),
+ m_rtc(*this, "u190")
+ { }
+
+ DECLARE_READ32_MEMBER( clock_r );
+ DECLARE_WRITE32_MEMBER( clock_w );
+ DECLARE_READ32_MEMBER( scsi_r );
+ DECLARE_WRITE32_MEMBER( scsi_w );
+ DECLARE_READ32_MEMBER( motherboard_r );
+ DECLARE_WRITE32_MEMBER( motherboard_w );
+
+ DECLARE_DRIVER_INIT( pal );
+ DECLARE_DRIVER_INIT( ntsc );
+
+protected:
+
+private:
+ required_device<rp5c01_device> m_rtc;
+};
+
+class a500p_state : public amiga_state
+{
+public:
+ a500p_state(const machine_config &mconfig, device_type type, const char *tag) :
+ amiga_state(mconfig, type, tag),
+ m_rtc(*this, "u9"),
+ m_side_int2(0),
+ m_side_int6(0)
+ { }
+
+ DECLARE_READ16_MEMBER( clock_r );
+ DECLARE_WRITE16_MEMBER( clock_w );
+
+ DECLARE_DRIVER_INIT( pal );
+ DECLARE_DRIVER_INIT( ntsc );
+
+protected:
+
+private:
+ // devices
+ required_device<msm6242_device> m_rtc;
- DECLARE_MACHINE_START(cdtv);
- DECLARE_MACHINE_RESET(cdtv);
+ // internal state
+ int m_side_int2;
+ int m_side_int6;
};
+class a600_state : public amiga_state
+{
+public:
+ a600_state(const machine_config &mconfig, device_type type, const char *tag) :
+ amiga_state(mconfig, type, tag),
+ m_gayle_id_count(0)
+ { }
+
+ DECLARE_READ16_MEMBER( ide_r );
+ DECLARE_WRITE16_MEMBER( ide_w );
+ DECLARE_READ16_MEMBER( gayle_r );
+ DECLARE_WRITE16_MEMBER( gayle_w );
+ DECLARE_READ16_MEMBER( gayle_id_r );
+ DECLARE_WRITE16_MEMBER( gayle_id_w );
+
+ DECLARE_DRIVER_INIT( pal );
+ DECLARE_DRIVER_INIT( ntsc );
+
+protected:
+ virtual void machine_reset();
+private:
+ static const int GAYLE_ID = 0xd0;
+
+ int m_gayle_id_count;
+ UINT8 m_gayle_reg[4];
+};
class a1200_state : public amiga_state
{
public:
- a1200_state(const machine_config &mconfig, device_type type, const char *tag)
- : amiga_state(mconfig, type, tag) { }
+ a1200_state(const machine_config &mconfig, device_type type, const char *tag) :
+ amiga_state(mconfig, type, tag),
+ m_gayle_id_count(0)
+ { }
- UINT16 m_potgo_value;
- int m_cd32_shifter[2];
- int m_oldstate[2];
- DECLARE_WRITE32_MEMBER(aga_overlay_w);
- DECLARE_DRIVER_INIT(a1200);
- DECLARE_WRITE8_MEMBER(ami1200_cia_0_porta_w);
- DECLARE_READ8_MEMBER(ami1200_cia_0_portb_r);
- DECLARE_WRITE8_MEMBER(ami1200_cia_0_portb_w);
- DECLARE_READ8_MEMBER(a1200_cia_0_portA_r);
+ DECLARE_READ32_MEMBER( ide_r );
+ DECLARE_WRITE32_MEMBER( ide_w );
+ DECLARE_READ32_MEMBER( gayle_r );
+ DECLARE_WRITE32_MEMBER( gayle_w );
+
+ DECLARE_DRIVER_INIT( pal );
+ DECLARE_DRIVER_INIT( ntsc );
+
+protected:
+ virtual void machine_reset();
+
+private:
+ static const int GAYLE_ID = 0xd1;
+
+ int m_gayle_id_count;
+ UINT8 m_gayle_reg[4];
};
+class a4000_state : public amiga_state
+{
+public:
+ a4000_state(const machine_config &mconfig, device_type type, const char *tag) :
+ amiga_state(mconfig, type, tag),
+ m_rtc(*this, "rtc"),
+ m_ramsey_config(0),
+ m_gary_coldboot(1),
+ m_gary_timeout(0),
+ m_gary_toenb(0)
+ { }
+
+ DECLARE_READ32_MEMBER( scsi_r );
+ DECLARE_WRITE32_MEMBER( scsi_w );
+ DECLARE_READ32_MEMBER( ide_r );
+ DECLARE_WRITE32_MEMBER( ide_w );
+ DECLARE_READ32_MEMBER( clock_r );
+ DECLARE_WRITE32_MEMBER( clock_w );
+ DECLARE_READ32_MEMBER( motherboard_r );
+ DECLARE_WRITE32_MEMBER( motherboard_w );
+
+ DECLARE_DRIVER_INIT( pal );
+ DECLARE_DRIVER_INIT( ntsc );
+
+protected:
+
+private:
+ required_device<rp5c01_device> m_rtc;
+
+ int m_ramsey_config;
+ int m_gary_coldboot;
+ int m_gary_timeout;
+ int m_gary_toenb;
+};
+class cd32_state : public amiga_state
+{
+public:
+ cd32_state(const machine_config &mconfig, device_type type, const char *tag) :
+ amiga_state(mconfig, type, tag),
+ m_p1_port(*this, "p1_cd32_buttons"),
+ m_p2_port(*this, "p2_cd32_buttons"),
+ m_cdda(*this, "cdda")
+ { }
-#define A1200PAL_XTAL_X1 XTAL_28_37516MHz
-#define A1200PAL_XTAL_X2 XTAL_4_433619MHz
+ DECLARE_WRITE8_MEMBER( akiko_cia_0_port_a_write );
+ DECLARE_CUSTOM_INPUT_MEMBER( cd32_input );
+ DECLARE_CUSTOM_INPUT_MEMBER( cd32_sel_mirror_input );
+ DECLARE_DRIVER_INIT( pal );
+ DECLARE_DRIVER_INIT( ntsc );
+ required_ioport m_p1_port;
+ required_ioport m_p2_port;
+ int m_oldstate[2];
+ int m_cd32_shifter[2];
+ UINT16 m_potgo_value;
-/***************************************************************************
- Battery Backed-Up Clock (MSM6264)
-***************************************************************************/
+protected:
+ // amiga_state overrides
+ virtual void potgo_w(UINT16 data);
-READ16_MEMBER( amiga_state::amiga_clock_r )
+private:
+ required_device<cdda_device> m_cdda;
+};
+
+
+//**************************************************************************
+// REAL TIME CLOCK
+//**************************************************************************
+
+READ16_MEMBER( cdtv_state::clock_r )
{
return m_rtc->read(space, offset / 2);
}
+WRITE16_MEMBER( cdtv_state::clock_w )
+{
+ m_rtc->write(space, offset / 2, data);
+}
-WRITE16_MEMBER( amiga_state::amiga_clock_w )
+READ16_MEMBER( a2000_state::clock_r )
+{
+ return m_rtc->read(space, offset / 2);
+}
+
+WRITE16_MEMBER( a2000_state::clock_w )
{
m_rtc->write(space, offset / 2, data);
}
+READ32_MEMBER( a3000_state::clock_r )
+{
+ return m_rtc->read(space, offset / 4);
+}
-/***************************************************************************
- CENTRONICS PORT
-***************************************************************************/
+WRITE32_MEMBER( a3000_state::clock_w )
+{
+ m_rtc->write(space, offset / 4, data);
+}
-READ8_MEMBER( amiga_state::amiga_cia_1_porta_r )
+READ16_MEMBER( a500p_state::clock_r )
{
- UINT8 result = 0;
+ return m_rtc->read(space, offset / 2);
+}
- /* centronics status is stored in PA0 to PA2 */
- result |= m_centronics_busy << 0;
- result |= m_centronics_perror << 1;
- result |= m_centronics_select << 2; // shared with rs232 "ring indicator" (not emulated)
+WRITE16_MEMBER( a500p_state::clock_w )
+{
+ m_rtc->write(space, offset / 2, data);
+}
- /* PA3 to PA7 store the serial line status (not emulated) */
+READ32_MEMBER( a4000_state::clock_r )
+{
+ return m_rtc->read(space, offset / 4);
+}
- return result;
+WRITE32_MEMBER( a4000_state::clock_w )
+{
+ m_rtc->write(space, offset / 4, data);
}
-WRITE_LINE_MEMBER( amiga_state::write_centronics_ack )
+
+//**************************************************************************
+// CD-ROM CONTROLLER
+//**************************************************************************
+
+READ8_MEMBER( cdtv_state::dmac_scsi_data_read )
{
- m_cia_0->flag_w(state);
+ if (offset >= 0xb0 && offset <= 0xbf)
+ return m_tpi->read(space, offset);
+
+ return 0xff;
}
-WRITE_LINE_MEMBER( amiga_state::write_centronics_busy )
+WRITE8_MEMBER( cdtv_state::dmac_scsi_data_write )
{
- m_centronics_busy = state;
- m_cia_1->sp_w(state);
+ if (offset >= 0xb0 && offset <= 0xbf)
+ m_tpi->write(space, offset, data);
}
-WRITE_LINE_MEMBER( amiga_state::write_centronics_perror )
+READ8_MEMBER( cdtv_state::dmac_io_read )
{
- m_centronics_perror = state;
- m_cia_1->cnt_w(state);
+ return m_cdrom->read(space, 0);
}
-WRITE_LINE_MEMBER( amiga_state::write_centronics_select )
+WRITE8_MEMBER( cdtv_state::dmac_io_write )
{
- m_centronics_select = state;
+ m_cdrom->write(space, 0, data);
}
-/***************************************************************************
- Address maps
-***************************************************************************/
+WRITE_LINE_MEMBER( cdtv_state::dmac_int_w )
+{
+ m_dmac_irq = state;
+ update_int2();
+}
-static ADDRESS_MAP_START(amiga_mem, AS_PROGRAM, 16, amiga_state )
- ADDRESS_MAP_UNMAP_HIGH
- AM_RANGE(0x000000, 0x07ffff) AM_MIRROR(0x80000) AM_RAMBANK("bank1") AM_SHARE("chip_ram")
- AM_RANGE(0xbfd000, 0xbfefff) AM_READWRITE(amiga_cia_r, amiga_cia_w)
- AM_RANGE(0xc00000, 0xc7ffff) AM_RAM /* slow-mem */
- AM_RANGE(0xc80000, 0xcfffff) AM_READWRITE(amiga_custom_r, amiga_custom_w) /* see Note 1 above */
- AM_RANGE(0xdf0000, 0xdfffff) AM_READWRITE(amiga_custom_r, amiga_custom_w) AM_SHARE("custom_regs") /* Custom Chips */
- AM_RANGE(0xe80000, 0xe8ffff) AM_READWRITE(amiga_autoconfig_r, amiga_autoconfig_w)
- AM_RANGE(0xf80000, 0xffffff) AM_ROM AM_REGION("user1", 0) /* System ROM - mirror */
-ADDRESS_MAP_END
+WRITE8_MEMBER( cdtv_state::tpi_port_b_write )
+{
+ m_cdrom->cmd_w(BIT(data, 0));
+ m_cdrom->enable_w(BIT(data, 1));
+}
-static ADDRESS_MAP_START( a1200_map, AS_PROGRAM, 32, a1200_state )
- ADDRESS_MAP_UNMAP_HIGH
- AM_RANGE(0x000000, 0x1fffff) AM_RAMBANK("bank1") AM_SHARE("chip_ram")
- AM_RANGE(0xbfa000, 0xbfa003) AM_WRITE(aga_overlay_w)
- AM_RANGE(0xbfd000, 0xbfefff) AM_READWRITE16(amiga_cia_r, amiga_cia_w, 0xffffffff)
- AM_RANGE(0xc00000, 0xdfffff) AM_READWRITE16(amiga_custom_r, amiga_custom_w, 0xffffffff) AM_SHARE("custom_regs")
- AM_RANGE(0xe80000, 0xe8ffff) AM_READWRITE16(amiga_autoconfig_r, amiga_autoconfig_w, 0xffffffff)
- AM_RANGE(0xf80000, 0xffffff) AM_ROM AM_REGION("user1", 0) /* Kickstart */
-ADDRESS_MAP_END
+WRITE_LINE_MEMBER( cdtv_state::tpi_int_w )
+{
+ m_tpi_irq = state;
+ update_int2();
+}
-static ADDRESS_MAP_START( amiga_mem32, AS_PROGRAM, 32, amiga_state )
- ADDRESS_MAP_UNMAP_HIGH
-// ADDRESS_MAP_GLOBAL_MASK(0xffffff) // not sure
- AM_RANGE(0x000000, 0x1fffff) AM_RAMBANK("bank1") AM_SHARE("chip_ram")
- AM_RANGE(0xbfd000, 0xbfefff) AM_READWRITE16(amiga_cia_r, amiga_cia_w, 0xffffffff)
- AM_RANGE(0xc00000, 0xdfffff) AM_READWRITE16(amiga_custom_r, amiga_custom_w, 0xffffffff) AM_SHARE("custom_regs")
- AM_RANGE(0xe80000, 0xe8ffff) AM_READWRITE16(amiga_autoconfig_r, amiga_autoconfig_w, 0xffffffff)
- AM_RANGE(0xf80000, 0xffffff) AM_ROM AM_REGION("user1", 0) /* Kickstart */
-ADDRESS_MAP_END
-static ADDRESS_MAP_START(keyboard_mem, AS_PROGRAM, 8, amiga_state )
- AM_RANGE(0x0000, 0x003f) AM_RAM /* internal user ram */
- AM_RANGE(0x0040, 0x007f) AM_NOP /* unassigned */
- AM_RANGE(0x0080, 0x0080) AM_NOP /* port a */
- AM_RANGE(0x0081, 0x0081) AM_NOP /* port b */
- AM_RANGE(0x0082, 0x0082) AM_NOP /* port c */
- AM_RANGE(0x0083, 0x0083) AM_NOP /* port d */
- AM_RANGE(0x0084, 0x0085) AM_NOP /* latch */
- AM_RANGE(0x0086, 0x0087) AM_NOP /* count */
- AM_RANGE(0x0088, 0x0088) AM_NOP /* upper latch & transfer latch to counter */
- AM_RANGE(0x0089, 0x0089) AM_NOP /* clear pa0 pos edge detected */
- AM_RANGE(0x008a, 0x008a) AM_NOP /* clear pa1 neg edge detected */
- AM_RANGE(0x008b, 0x008e) AM_NOP /* unassigned */
- AM_RANGE(0x008f, 0x008f) AM_NOP /* control register */
- AM_RANGE(0x0090, 0x07ff) AM_NOP /* unassigned */
- AM_RANGE(0x0800, 0x0fff) AM_ROM AM_REGION("keyboard", 0) /* internal mask rom */
-ADDRESS_MAP_END
+//**************************************************************************
+// DRIVER INIT
+//**************************************************************************
+// ocs chipset (agnus with support for 512k or 1mb chip ram, denise)
+DRIVER_INIT_MEMBER( a1000_state, pal )
+{
+ m_agnus_id = AGNUS_PAL; // 8367
+ m_denise_id = DENISE; // 8362
+}
-/*
- * CDTV memory map (source: http://www.l8r.net/technical/cdtv-technical.html)
- *
- * 000000-0FFFFF Chip memory
- * 100000-1FFFFF Space for extra chip memory (Megachip)
- * 200000-9FFFFF Space for AutoConfig memory
- * A00000-BFFFFF CIA chips
- * C00000-C7FFFF Space for slow-fast memory
- * C80000-DBFFFF Space
- * DC0000-DC7FFF Power backed-up real time clock
- * DC8000-DC87FF Non-volatile RAM
- * DC8800-DCFFFF Space in non-volatile RAM decoded area
- * DD0000-DEFFFF Space
- * DF0000-DFFFFF Custom chips
- * E00000-E7FFFF Memory card address space for front panel memory card
- * E80000-E8FFFF AutoConfig configuration space
- * E90000-E9FFFF First AutoConfig device, used by DMAC
- * EA0000-EFFFFF Space for other AutoConfig devices
- * F00000-F3FFFF CDTV ROM
- * F40000-F7FFFF Space in CDTV ROM decoded area
- * F80000-FBFFFF Space in Kickstart ROM decoded area (used by Kickstart 2)
- * FC0000-FFFFFF Kickstart ROM
- *
- */
-
-static ADDRESS_MAP_START(cdtv_mem, AS_PROGRAM, 16, amiga_state )
- AM_RANGE(0x000000, 0x0fffff) AM_RAMBANK("bank1") AM_SHARE("chip_ram")
- AM_RANGE(0xbfd000, 0xbfefff) AM_READWRITE(amiga_cia_r, amiga_cia_w)
- AM_RANGE(0xdc0000, 0xdc003f) AM_READWRITE(amiga_clock_r, amiga_clock_w)
- AM_RANGE(0xdc8000, 0xdc87ff) AM_RAM AM_SHARE("nvram")
- AM_RANGE(0xdf0000, 0xdfffff) AM_READWRITE(amiga_custom_r, amiga_custom_w) AM_SHARE("custom_regs") /* Custom Chips */
- AM_RANGE(0xe80000, 0xe8ffff) AM_READWRITE(amiga_autoconfig_r, amiga_autoconfig_w)
- AM_RANGE(0xf00000, 0xffffff) AM_ROM AM_REGION("user1", 0) /* CDTV & System ROM */
-ADDRESS_MAP_END
+DRIVER_INIT_MEMBER( a1000_state, ntsc )
+{
+ m_agnus_id = AGNUS_NTSC; // 8361
+ m_denise_id = DENISE; // 8362
+}
-static ADDRESS_MAP_START(cdtv_rcmcu_mem, AS_PROGRAM, 8, amiga_state )
- AM_RANGE(0x0000, 0x003f) AM_RAM /* internal user ram */
- AM_RANGE(0x0040, 0x007f) AM_NOP /* unassigned */
- AM_RANGE(0x0080, 0x0080) AM_NOP /* port a */
- AM_RANGE(0x0081, 0x0081) AM_NOP /* port b */
- AM_RANGE(0x0082, 0x0082) AM_NOP /* port c */
- AM_RANGE(0x0083, 0x0083) AM_NOP /* port d */
- AM_RANGE(0x0084, 0x0085) AM_NOP /* latch */
- AM_RANGE(0x0086, 0x0087) AM_NOP /* count */
- AM_RANGE(0x0088, 0x0088) AM_NOP /* upper latch & transfer latch to counter */
- AM_RANGE(0x0089, 0x0089) AM_NOP /* clear pa0 pos edge detected */
- AM_RANGE(0x008a, 0x008a) AM_NOP /* clear pa1 neg edge detected */
- AM_RANGE(0x008b, 0x008e) AM_NOP /* unassigned */
- AM_RANGE(0x008f, 0x008f) AM_NOP /* control register */
- AM_RANGE(0x0090, 0x07ff) AM_NOP /* unassigned */
- AM_RANGE(0x0800, 0x0fff) AM_ROM AM_REGION("rcmcu", 0) /* internal mask rom */
-ADDRESS_MAP_END
+DRIVER_INIT_MEMBER( a2000_state, pal )
+{
+ m_agnus_id = AGNUS_HR_PAL; // 8371 (later versions 8372A)
+ m_denise_id = DENISE; // 8362
+}
-static ADDRESS_MAP_START(a1000_mem, AS_PROGRAM, 16, amiga_state )
- AM_RANGE(0x000000, 0x03ffff) AM_MIRROR(0xc0000) AM_RAMBANK("bank1") AM_SHARE("chip_ram")
- AM_RANGE(0xbfd000, 0xbfefff) AM_READWRITE(amiga_cia_r, amiga_cia_w)
- AM_RANGE(0xc00000, 0xc3ffff) AM_READWRITE(amiga_custom_r, amiga_custom_w) /* See Note 1 above */
- AM_RANGE(0xdf0000, 0xdfffff) AM_READWRITE(amiga_custom_r, amiga_custom_w) AM_SHARE("custom_regs") /* Custom Chips */
- AM_RANGE(0xe80000, 0xe8ffff) AM_READWRITE(amiga_autoconfig_r, amiga_autoconfig_w)
- AM_RANGE(0xf80000, 0xfbffff) AM_ROM AM_REGION("user1", 0) /* Bootstrap ROM */
- AM_RANGE(0xfc0000, 0xffffff) AM_RAMBANK("bank2") /* Writable Control Store RAM */
-ADDRESS_MAP_END
+DRIVER_INIT_MEMBER( a2000_state, ntsc )
+{
+ m_agnus_id = AGNUS_HR_NTSC; // 8370 (later versions 8372A)
+ m_denise_id = DENISE; // 8362
+}
+DRIVER_INIT_MEMBER( a500_state, pal )
+{
+ m_agnus_id = AGNUS_HR_PAL; // 8371 (later versions 8372A)
+ m_denise_id = 0x0097; /*DENISE;*/ // 8362
+ m_denise_id = 0x00fc;
+}
-/***************************************************************************
- Inputs
-***************************************************************************/
+DRIVER_INIT_MEMBER( a500_state, ntsc )
+{
+ m_agnus_id = AGNUS_HR_NTSC; // 8370 (later versions 8372A)
+ m_denise_id = DENISE; // 8362
+}
-static INPUT_PORTS_START( amiga_common )
- PORT_START("input")
- PORT_CONFNAME( 0x20, 0x00, "Input Port 0 Device")
- PORT_CONFSETTING( 0x00, "Mouse" )
- PORT_CONFSETTING( 0x20, DEF_STR(Joystick) )
- PORT_CONFNAME( 0x10, 0x10, "Input Port 1 Device")
- PORT_CONFSETTING( 0x00, "Mouse" )
- PORT_CONFSETTING( 0x10, DEF_STR(Joystick) )
-
- PORT_START("CIA0PORTA")
- PORT_BIT( 0x3f, IP_ACTIVE_LOW, IPT_SPECIAL )
- PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1)
- PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2)
+DRIVER_INIT_MEMBER( cdtv_state, pal )
+{
+ m_agnus_id = AGNUS_HR_PAL; // 8372A
+ m_denise_id = DENISE; // 8362
+}
- PORT_START("JOY0DAT")
- PORT_BIT( 0x0303, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, amiga_state,amiga_joystick_convert, 0)
- PORT_BIT( 0xfcfc, IP_ACTIVE_HIGH, IPT_UNUSED )
+DRIVER_INIT_MEMBER( cdtv_state, ntsc )
+{
+ m_agnus_id = AGNUS_HR_NTSC; // 8372A
+ m_denise_id = DENISE; // 8362
+}
- PORT_START("JOY1DAT")
- PORT_BIT( 0x0303, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, amiga_state,amiga_joystick_convert, 1)
- PORT_BIT( 0xfcfc, IP_ACTIVE_HIGH, IPT_UNUSED )
+// ecs chipset (agnus with support for 2mb chip ram, super denise)
+DRIVER_INIT_MEMBER( a3000_state, pal )
+{
+ m_agnus_id = AGNUS_HR_PAL_NEW; // 8372B (early versions: 8372AB)
+ m_denise_id = DENISE_HR; // 8373
+}
- PORT_START("POTGO")
- PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_UNUSED )
- PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1)
- PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_UNUSED )
- PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2)
- PORT_BIT( 0xaaff, IP_ACTIVE_HIGH, IPT_UNUSED )
+DRIVER_INIT_MEMBER( a3000_state, ntsc )
+{
+ m_agnus_id = AGNUS_HR_NTSC_NEW; // 8372B (early versions: 8372AB)
+ m_denise_id = DENISE_HR; // 8373
+}
- PORT_START("P1JOY")
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(1)
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1)
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1)
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1)
+DRIVER_INIT_MEMBER( a500p_state, pal )
+{
+ m_agnus_id = AGNUS_HR_PAL; // 8375 (390544-01)
+ m_denise_id = DENISE_HR; // 8373
+}
- PORT_START("P2JOY")
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(2)
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2)
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2)
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2)
+DRIVER_INIT_MEMBER( a500p_state, ntsc )
+{
+ m_agnus_id = AGNUS_HR_NTSC; // 8375 (390544-02)
+ m_denise_id = DENISE_HR; // 8373
+}
- PORT_START("P0MOUSEX")
- PORT_BIT( 0xff, 0x00, IPT_MOUSE_X) PORT_SENSITIVITY(100) PORT_KEYDELTA(5) PORT_MINMAX(0, 255) PORT_PLAYER(1)
+DRIVER_INIT_MEMBER( a600_state, pal )
+{
+ m_agnus_id = AGNUS_HR_PAL; // 8375 (390544-01)
+ m_denise_id = DENISE_HR; // 8373
+}
- PORT_START("P0MOUSEY")
- PORT_BIT( 0xff, 0x00, IPT_MOUSE_Y) PORT_SENSITIVITY(100) PORT_KEYDELTA(5) PORT_MINMAX(0, 255) PORT_PLAYER(1)
+DRIVER_INIT_MEMBER( a600_state, ntsc )
+{
+ m_agnus_id = AGNUS_HR_NTSC; // 8375 (390544-02)
+ m_denise_id = DENISE_HR; // 8373
+}
- PORT_START("P1MOUSEX")
- PORT_BIT( 0xff, 0x00, IPT_MOUSE_X) PORT_SENSITIVITY(100) PORT_KEYDELTA(5) PORT_MINMAX(0, 255) PORT_PLAYER(2)
+// aga chipset (alice and lisa)
+DRIVER_INIT_MEMBER( a1200_state, pal )
+{
+ m_agnus_id = ALICE_PAL_NEW;
+ m_denise_id = LISA;
+}
- PORT_START("P1MOUSEY")
- PORT_BIT( 0xff, 0x00, IPT_MOUSE_Y) PORT_SENSITIVITY(100) PORT_KEYDELTA(5) PORT_MINMAX(0, 255) PORT_PLAYER(2)
-INPUT_PORTS_END
+DRIVER_INIT_MEMBER( a1200_state, ntsc )
+{
+ m_agnus_id = ALICE_NTSC_NEW;
+ m_denise_id = LISA;
+}
+
+DRIVER_INIT_MEMBER( a4000_state, pal )
+{
+ m_agnus_id = ALICE_PAL_NEW;
+ m_denise_id = LISA;
+}
+DRIVER_INIT_MEMBER( a4000_state, ntsc )
+{
+ m_agnus_id = ALICE_NTSC_NEW;
+ m_denise_id = LISA;
+}
-static INPUT_PORTS_START( amiga )
- PORT_START("hardware")
- PORT_CONFNAME( 0x08, 0x08, "Battery backed-up RTC")
- PORT_CONFSETTING( 0x00, "Not Installed" )
- PORT_CONFSETTING( 0x08, "Installed" )
+DRIVER_INIT_MEMBER( cd32_state, pal )
+{
+ m_agnus_id = ALICE_PAL_NEW;
+ m_denise_id = LISA;
+}
- PORT_INCLUDE( amiga_common )
-INPUT_PORTS_END
+DRIVER_INIT_MEMBER( cd32_state, ntsc )
+{
+ m_agnus_id = ALICE_NTSC_NEW;
+ m_denise_id = LISA;
+}
-/* TODO: Support for the CDTV remote control */
-static INPUT_PORTS_START( cdtv )
- PORT_INCLUDE( amiga_common )
-INPUT_PORTS_END
+//**************************************************************************
+// MACHINE EMULATION
+//**************************************************************************
+void a1000_state::machine_start()
+{
+ // start base machine
+ amiga_state::machine_start();
-/***************************************************************************
- Machine drivers
-***************************************************************************/
+ // allocate 256kb for wom
+ m_wom_ram.resize(256 * 1024 / 2);
+ m_wom->set_base(m_wom_ram);
+}
+void a1000_state::machine_reset()
+{
+ // base reset
+ amiga_state::machine_reset();
-static void handle_cd32_joystick_cia(a1200_state *state, UINT8 pra, UINT8 dra);
+ // bootrom visible, wom writable
+ m_bootrom->set_bank(0);
+ m_maincpu->space(AS_PROGRAM).install_write_bank(0xfc0000, 0xffffff, "wom");
+}
-WRITE32_MEMBER(a1200_state::aga_overlay_w)
+// any write to this area will write protect the wom and disable the bootrom
+WRITE16_MEMBER( a1000_state::write_protect_w )
{
- if (ACCESSING_BITS_16_23)
- {
- data = (data >> 16) & 1;
-
- /* switch banks as appropriate */
- m_bank1->set_entry(data & 1);
-
- /* swap the write handlers between ROM and bank 1 based on the bit */
- if ((data & 1) == 0)
- /* overlay disabled, map RAM on 0x000000 */
- space.install_write_bank(0x000000, 0x1fffff, "bank1");
- else
- /* overlay enabled, map Amiga system ROM on 0x000000 */
- space.unmap_write(0x000000, 0x1fffff);
- }
+ m_bootrom->set_bank(1);
+ m_maincpu->space(AS_PROGRAM).nop_write(0xfc0000, 0xffffff);
}
-/*************************************
- *
- * CIA-A port A access:
- *
- * PA7 = game port 1, pin 6 (fire)
- * PA6 = game port 0, pin 6 (fire)
- * PA5 = /RDY (disk ready)
- * PA4 = /TK0 (disk track 00)
- * PA3 = /WPRO (disk write protect)
- * PA2 = /CHNG (disk change)
- * PA1 = /LED (LED, 0=bright / audio filter control)
- * PA0 = MUTE
- *
- *************************************/
+WRITE_LINE_MEMBER( a2000_state::zorro2_int2_w )
+{
+ m_zorro2_int2 = state;
+ update_irq2();
+}
-WRITE8_MEMBER(a1200_state::ami1200_cia_0_porta_w)
+WRITE_LINE_MEMBER( a2000_state::zorro2_int6_w )
{
- /* bit 2 = Power Led on Amiga */
- output_set_value("audio_led", !BIT(data, 1));
+ m_zorro2_int6 = state;
+ update_irq6();
+}
- handle_cd32_joystick_cia(this, data, m_cia_0->read(space, 2));
+void a2000_state::update_int2()
+{
+ int state = (m_cia_0_irq || m_zorro2_int2);
+ set_interrupt((state ? INTENA_SETCLR : 0x0000) | INTENA_PORTS);
}
-/*************************************
- *
- * CIA-A port B access:
- *
- * PB7 = parallel data 7
- * PB6 = parallel data 6
- * PB5 = parallel data 5
- * PB4 = parallel data 4
- * PB3 = parallel data 3
- * PB2 = parallel data 2
- * PB1 = parallel data 1
- * PB0 = parallel data 0
- *
- *************************************/
+void a2000_state::update_int6()
+{
+ int state = (m_cia_1_irq || m_zorro2_int6);
+ set_interrupt((state ? INTENA_SETCLR : 0x0000) | INTENA_EXTER);
+}
+void cdtv_state::machine_start()
+{
+ // start base machine
+ amiga_state::machine_start();
+ // setup dmac
+ m_dmac->set_address_space(&m_maincpu->space(AS_PROGRAM));
+ m_dmac->ramsz_w(0);
+}
+void cdtv_state::update_int2()
+{
+ int state = (m_cia_0_irq || m_dmac_irq || m_tpi_irq);
+ set_interrupt((state ? INTENA_SETCLR : 0x0000) | INTENA_PORTS);
+}
-//int cd32_input_port_val = 0;
-//int cd32_input_select = 0;
-#if 0
-static void cd32_potgo_w(running_machine &machine, UINT16 data)
+void cdtv_state::update_int6()
{
- a1200_state *state = machine.driver_data<a1200_state>();
- int i;
+ int state = (m_cia_1_irq);
+ set_interrupt((state ? INTENA_SETCLR : 0x0000) | INTENA_EXTER);
+}
- state->m_potgo_value = state->m_potgo_value & 0x5500;
- state->m_potgo_value |= data & 0xaa00;
+READ32_MEMBER( a3000_state::scsi_r )
+{
+ UINT32 data = 0xffffffff;
+ logerror("scsi_r(%06x): %08x & %08x\n", offset, data, mem_mask);
+ return data;
+}
- for (i = 0; i < 8; i += 2)
- {
- UINT16 dir = 0x0200 << i;
- if (data & dir)
- {
- UINT16 d = 0x0100 << i;
- state->m_potgo_value &= ~d;
- state->m_potgo_value |= data & d;
- }
- }
- for (i = 0; i < 2; i++)
- {
- UINT16 p5dir = 0x0200 << (i * 4); /* output enable P5 */
- UINT16 p5dat = 0x0100 << (i * 4); /* data P5 */
- if ((state->m_potgo_value & p5dir) && (state->m_potgo_value & p5dat))
- state->m_cd32_shifter[i] = 8;
- }
+WRITE32_MEMBER( a3000_state::scsi_w )
+{
+ logerror("scsi_w(%06x): %08x & %08x\n", offset, data, mem_mask);
}
-#endif
-static void handle_cd32_joystick_cia(a1200_state *state, UINT8 pra, UINT8 dra)
+READ32_MEMBER( a3000_state::motherboard_r )
{
- int i;
+ UINT32 data = 0xffffffff;
+ logerror("motherboard_r(%06x): %08x & %08x\n", offset, data, mem_mask);
+ return data;
+}
- for (i = 0; i < 2; i++)
- {
- UINT8 but = 0x40 << i;
- UINT16 p5dir = 0x0200 << (i * 4); /* output enable P5 */
- UINT16 p5dat = 0x0100 << (i * 4); /* data P5 */
- if (!(state->m_potgo_value & p5dir) || !(state->m_potgo_value & p5dat))
- {
- if ((dra & but) && (pra & but) != state->m_oldstate[i])
- {
- if (!(pra & but))
- {
- state->m_cd32_shifter[i]--;
- if (state->m_cd32_shifter[i] < 0)
- state->m_cd32_shifter[i] = 0;
- }
- }
- }
- state->m_oldstate[i] = pra & but;
- }
+WRITE32_MEMBER( a3000_state::motherboard_w )
+{
+ logerror("motherboard_w(%06x): %08x & %08x\n", offset, data, mem_mask);
}
+void a600_state::machine_reset()
+{
+ // base reset
+ amiga_state::machine_reset();
+ m_gayle_reg[0] = 0;
+ m_gayle_reg[1] = 0;
+ m_gayle_reg[2] = 0;
+ m_gayle_reg[3] = 0;
+}
-READ8_MEMBER(a1200_state::ami1200_cia_0_portb_r)
+// note: for ide a12 = cs0/cs1, offset >> 2 for reg
+READ16_MEMBER( a600_state::ide_r )
{
- /* parallel port */
- logerror("%s:CIA0_portb_r\n", machine().describe_context());
- return 0xff;
+ UINT16 data = 0xffff;
+ logerror("ide_r(%06x): %08x & %08x\n", offset, data, mem_mask);
+ return data;
}
-WRITE8_MEMBER(a1200_state::ami1200_cia_0_portb_w)
+WRITE16_MEMBER( a600_state::ide_w )
{
- /* parallel port */
- logerror("%s:CIA0_portb_w(%02x)\n", machine().describe_context(), data);
+ logerror("ide_w(%06x): %08x & %08x\n", offset, data, mem_mask);
}
+READ16_MEMBER( a600_state::gayle_r )
+{
+ UINT16 data = 0xffff;
+ switch (offset)
+ {
+ case 0x0000: data = m_gayle_reg[0]; break;
+ case 0x1000: data = m_gayle_reg[1]; break;
+ case 0x2000: data = m_gayle_reg[2]; break;
+ case 0x3000: data = m_gayle_reg[3]; break;
+ }
-MACHINE_START_MEMBER(cdtv_state,cdtv)
-{
- MACHINE_START_CALL_MEMBER(amiga);
- amigacd_start(machine());
+ logerror("gayle_r(%06x): %08x & %08x\n", offset, data, mem_mask);
+ return data;
}
-
-MACHINE_RESET_MEMBER(cdtv_state,cdtv)
+WRITE16_MEMBER( a600_state::gayle_w )
{
- MACHINE_RESET_CALL_MEMBER( amiga );
+ logerror("gayle_w(%06x): %08x & %08x\n", offset, data, mem_mask);
- /* initialize the cdrom controller */
- amigacd_reset(machine());
+ switch (offset)
+ {
+ case 0x0000:
+ break;
+ case 0x1000:
+ break;
+ case 0x2000:
+ break;
+ case 0x3000:
+ break;
+ }
}
-READ8_MEMBER(a1200_state::a1200_cia_0_portA_r)
+READ16_MEMBER( a600_state::gayle_id_r )
{
- UINT8 ret = ioport("CIA0PORTA")->read() & 0xc0; /* Gameport 1 and 0 buttons */
- ret |= machine().device<amiga_fdc>("fdc")->ciaapra_r();
- return ret;
+ if (ACCESSING_BITS_8_15)
+ return ((GAYLE_ID << m_gayle_id_count++) & 0x80) << 8;
+ else
+ return 0xffff;
}
-#if 0
-static const legacy_mos6526_interface a1200_cia_0_intf =
-{
- DEVCB_DRIVER_LINE_MEMBER(amiga_state, amiga_cia_0_irq), /* irq_func */
- DEVCB_NULL, /* pc_func */
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_DRIVER_MEMBER(a1200_state,a1200_cia_0_portA_r),
- DEVCB_DRIVER_MEMBER(a1200_state,ami1200_cia_0_porta_w), /* port A */
- DEVCB_DRIVER_MEMBER(a1200_state,ami1200_cia_0_portb_r),
- DEVCB_DRIVER_MEMBER(a1200_state,ami1200_cia_0_portb_w) /* port B */
-};
+WRITE16_MEMBER( a600_state::gayle_id_w )
+{
+ m_gayle_id_count = 0;
+}
-static const legacy_mos6526_interface a1200_cia_1_intf =
+void a1200_state::machine_reset()
{
- DEVCB_DRIVER_LINE_MEMBER(amiga_state, amiga_cia_1_irq), /* irq_func */
- DEVCB_NULL, /* pc_func */
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL, /* port A */
- DEVCB_NULL,
- DEVCB_DEVICE_MEMBER("fdc", amiga_fdc, ciaaprb_w) /* port B */
-};
-#endif
+ // base reset
+ amiga_state::machine_reset();
+ m_gayle_reg[0] = 0;
+ m_gayle_reg[1] = 0;
+ m_gayle_reg[2] = 0;
+ m_gayle_reg[3] = 0;
+}
-static SLOT_INTERFACE_START( amiga_floppies )
- SLOT_INTERFACE( "35dd", FLOPPY_35_DD )
-SLOT_INTERFACE_END
+READ32_MEMBER( a1200_state::ide_r )
+{
+ UINT16 data = 0xffff;
+ logerror("ide_r(%06x): %08x & %08x\n", offset, data, mem_mask);
+ return data;
+}
-static MACHINE_CONFIG_FRAGMENT( amiga_cartslot )
- MCFG_CARTSLOT_ADD("cart")
- MCFG_CARTSLOT_EXTENSION_LIST("rom,bin")
- MCFG_CARTSLOT_NOT_MANDATORY
-MACHINE_CONFIG_END
+WRITE32_MEMBER( a1200_state::ide_w )
+{
+ logerror("ide_w(%06x): %08x & %08x\n", offset, data, mem_mask);
+}
+READ32_MEMBER( a1200_state::gayle_r )
+{
+ UINT16 data = 0xffff;
-static MACHINE_CONFIG_START( ntsc, amiga_state )
- /* basic machine hardware */
- MCFG_CPU_ADD("maincpu", M68000, AMIGA_68000_NTSC_CLOCK)
- MCFG_CPU_PROGRAM_MAP(amiga_mem)
+ switch (offset)
+ {
+ case 0x0000: data = m_gayle_reg[0]; break;
+ case 0x1000: data = m_gayle_reg[1]; break;
+ case 0x2000: data = m_gayle_reg[2]; break;
+ case 0x3000: data = m_gayle_reg[3]; break;
+ }
- MCFG_CPU_ADD("keyboard", M6502, XTAL_1MHz) /* 1 MHz? */
- MCFG_CPU_PROGRAM_MAP(keyboard_mem)
- MCFG_DEVICE_DISABLE()
+ logerror("gayle_r(%06x): %08x & %08x\n", offset, data, mem_mask);
+ return data;
+}
- MCFG_SCREEN_ADD("screen", RASTER)
-// MCFG_SCREEN_REFRESH_RATE(59.997)
-// MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
+WRITE32_MEMBER( a1200_state::gayle_w )
+{
+ logerror("gayle_w(%06x): %08x & %08x\n", offset, data, mem_mask);
- MCFG_MACHINE_START_OVERRIDE(amiga_state, amiga )
- MCFG_MACHINE_RESET_OVERRIDE(amiga_state, amiga )
+ switch (offset)
+ {
+ case 0x0000:
+ break;
+ case 0x1000:
+ break;
+ case 0x2000:
+ break;
+ case 0x3000:
+ break;
+ }
+}
- MCFG_DEFAULT_LAYOUT(layout_amiga)
+READ32_MEMBER( a4000_state::scsi_r )
+{
+ UINT16 data = 0xffff;
+ logerror("scsi_r(%06x): %08x & %08x\n", offset, data, mem_mask);
+ return data;
+}
- /* video hardware */
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK)
-// MCFG_SCREEN_SIZE(228*4, 262)
-// MCFG_SCREEN_VISIBLE_AREA(214, (228*4)-1, 34, 262-1)
- MCFG_SCREEN_RAW_PARAMS(AMIGA_68000_NTSC_CLOCK*2,228*4,214,228*4,262,34,262)
- MCFG_SCREEN_UPDATE_DRIVER(amiga_state, screen_update_amiga)
- MCFG_SCREEN_PALETTE("palette")
+WRITE32_MEMBER( a4000_state::scsi_w )
+{
+ logerror("scsi_w(%06x): %08x & %08x\n", offset, data, mem_mask);
+}
- MCFG_PALETTE_ADD("palette", 4096)
- MCFG_PALETTE_INIT_OWNER(amiga_state, amiga )
+READ32_MEMBER( a4000_state::ide_r )
+{
+ UINT16 data = 0xffff;
+ logerror("ide_r(%06x): %08x & %08x\n", offset, data, mem_mask);
+ return data;
+}
- MCFG_VIDEO_START_OVERRIDE(amiga_state,amiga)
+WRITE32_MEMBER( a4000_state::ide_w )
+{
+ logerror("ide_w(%06x): %08x & %08x\n", offset, data, mem_mask);
+}
- /* devices */
- MCFG_DEVICE_ADD("rtc", MSM6242, XTAL_32_768kHz)
- MCFG_CENTRONICS_ADD("centronics", centronics_printers, "printer")
- MCFG_CENTRONICS_ACK_HANDLER(WRITELINE(amiga_state, write_centronics_ack))
- MCFG_CENTRONICS_BUSY_HANDLER(WRITELINE(amiga_state, write_centronics_busy))
- MCFG_CENTRONICS_PERROR_HANDLER(WRITELINE(amiga_state, write_centronics_perror))
- MCFG_CENTRONICS_SELECT_HANDLER(WRITELINE(amiga_state, write_centronics_select))
+READ32_MEMBER( a4000_state::motherboard_r )
+{
+ UINT32 data = 0;
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics")
+ if (offset == 0)
+ {
+ if (ACCESSING_BITS_0_7)
+ data |= m_ramsey_config & 0xff;
+ if (ACCESSING_BITS_8_15)
+ data |= (m_gary_coldboot << 7 | 0x7f) << 8;
+ if (ACCESSING_BITS_16_23)
+ data |= (m_gary_toenb << 7 | 0x7f) << 16;
+ if (ACCESSING_BITS_24_31)
+ data |= (m_gary_timeout << 7 | 0x7f) << 24;
+ }
+ else
+ data = 0xffffffff;
- /* sound hardware */
- MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
+ logerror("motherboard_r(%06x): %08x & %08x\n", offset, data, mem_mask);
- MCFG_SOUND_ADD("amiga", AMIGA, 3579545)
- MCFG_SOUND_ROUTE(0, "lspeaker", 0.50)
- MCFG_SOUND_ROUTE(1, "rspeaker", 0.50)
- MCFG_SOUND_ROUTE(2, "rspeaker", 0.50)
- MCFG_SOUND_ROUTE(3, "lspeaker", 0.50)
+ return data;
+}
- /* cia */
- MCFG_DEVICE_ADD("cia_0", LEGACY_MOS8520, AMIGA_68000_NTSC_CLOCK / 10)
- MCFG_MOS6526_TOD(60)
- MCFG_MOS6526_IRQ_CALLBACK(WRITELINE(amiga_state, amiga_cia_0_irq))
- MCFG_MOS6526_PC_CALLBACK(DEVWRITELINE("centronics", centronics_device, write_strobe))
- MCFG_MOS6526_PA_INPUT_CALLBACK(READ8(amiga_state, amiga_cia_0_portA_r))
- MCFG_MOS6526_PA_OUTPUT_CALLBACK(WRITE8(amiga_state, amiga_cia_0_portA_w))
- MCFG_MOS6526_PB_OUTPUT_CALLBACK(DEVWRITE8("cent_data_out", output_latch_device, write))
- MCFG_DEVICE_ADD("cia_1", LEGACY_MOS8520, AMIGA_68000_NTSC_CLOCK / 10)
- MCFG_MOS6526_IRQ_CALLBACK(WRITELINE(amiga_state, amiga_cia_1_irq))
- MCFG_MOS6526_PA_INPUT_CALLBACK(READ8(amiga_state, amiga_cia_1_porta_r))
- MCFG_MOS6526_PB_OUTPUT_CALLBACK(DEVWRITE8("fdc", amiga_fdc, ciaaprb_w))
+WRITE32_MEMBER( a4000_state::motherboard_w )
+{
+ if (offset == 0)
+ {
+ if (ACCESSING_BITS_0_7)
+ m_ramsey_config = data & 0xff;
+ if (ACCESSING_BITS_8_15)
+ m_gary_coldboot = BIT(data, 7);
+ if (ACCESSING_BITS_16_23)
+ m_gary_toenb = BIT(data, 7);
+ if (ACCESSING_BITS_24_31)
+ m_gary_timeout = BIT(data, 7);
+ }
- /* fdc */
- MCFG_DEVICE_ADD("fdc", AMIGA_FDC, AMIGA_68000_NTSC_CLOCK)
- MCFG_AMIGA_FDC_INDEX_CALLBACK(DEVWRITELINE("cia_1", legacy_mos6526_device, flag_w))
- MCFG_FLOPPY_DRIVE_ADD("fdc:0", amiga_floppies, "35dd", amiga_fdc::floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("fdc:1", amiga_floppies, 0, amiga_fdc::floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("fdc:2", amiga_floppies, 0, amiga_fdc::floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("fdc:3", amiga_floppies, 0, amiga_fdc::floppy_formats)
+ logerror("motherboard_w(%06x): %08x & %08x\n", offset, data, mem_mask);
+}
- MCFG_DEVICE_ADD("kbd", AMIGAKBD, 0)
- MCFG_AMIGA_KEYBOARD_KCLK_CALLBACK(DEVWRITELINE("cia_0", legacy_mos6526_device, cnt_w))
- MCFG_AMIGA_KEYBOARD_KDAT_CALLBACK(DEVWRITELINE("cia_0", legacy_mos6526_device, sp_w))
-MACHINE_CONFIG_END
+void cd32_state::potgo_w(UINT16 data)
+{
+ int i;
-static MACHINE_CONFIG_DERIVED( a1000ntsc, ntsc )
- MCFG_CPU_MODIFY("maincpu")
- MCFG_CPU_PROGRAM_MAP(a1000_mem)
-MACHINE_CONFIG_END
+ m_potgo_value = m_potgo_value & 0x5500;
+ m_potgo_value |= data & 0xaa00;
-static MACHINE_CONFIG_DERIVED( a500ntsc, ntsc )
- MCFG_DEVICE_MODIFY("cia_0")
- MCFG_MOS6526_TOD(0)
+ for (i = 0; i < 8; i += 2)
+ {
+ UINT16 dir = 0x0200 << i;
+ if (data & dir)
+ {
+ UINT16 d = 0x0100 << i;
+ m_potgo_value &= ~d;
+ m_potgo_value |= data & d;
+ }
+ }
+ for (i = 0; i < 2; i++)
+ {
+ UINT16 p5dir = 0x0200 << (i * 4); /* output enable P5 */
+ UINT16 p5dat = 0x0100 << (i * 4); /* data P5 */
+ if ((m_potgo_value & p5dir) && (m_potgo_value & p5dat))
+ m_cd32_shifter[i] = 8;
+ }
+}
- MCFG_FRAGMENT_ADD(amiga_cartslot)
+static void handle_cd32_joystick_cia(running_machine &machine, UINT8 pra, UINT8 dra)
+{
+ cd32_state *state = machine.driver_data<cd32_state>();
+ int i;
- MCFG_SOFTWARE_LIST_ADD("flop_misc","amiga_flop")
- MCFG_SOFTWARE_LIST_ADD("flop_ocs","amigaocs_flop")
- MCFG_SOFTWARE_LIST_ADD("flop_ecs","amigaecs_flop")
-MACHINE_CONFIG_END
+ for (i = 0; i < 2; i++)
+ {
+ UINT8 but = 0x40 << i;
+ UINT16 p5dir = 0x0200 << (i * 4); /* output enable P5 */
+ UINT16 p5dat = 0x0100 << (i * 4); /* data P5 */
-static MACHINE_CONFIG_DERIVED_CLASS( cdtv, ntsc, cdtv_state)
- MCFG_CPU_REPLACE("maincpu", M68000, CDTV_CLOCK_X1 / 4)
- MCFG_CPU_PROGRAM_MAP(cdtv_mem)
+ if (!(state->m_potgo_value & p5dir) || !(state->m_potgo_value & p5dat))
+ {
+ if ((dra & but) && (pra & but) != state->m_oldstate[i])
+ {
+ if (!(pra & but))
+ {
+ state->m_cd32_shifter[i]--;
+ if (state->m_cd32_shifter[i] < 0)
+ state->m_cd32_shifter[i] = 0;
+ }
+ }
+ }
+ state->m_oldstate[i] = pra & but;
+ }
+}
- MCFG_DEVICE_REMOVE("keyboard")
+static UINT16 handle_joystick_potgor(running_machine &machine, UINT16 potgor)
+{
+ cd32_state *state = machine.driver_data<cd32_state>();
+ ioport_port * player_portname[] = { state->m_p1_port, state->m_p2_port };
+ int i;
- MCFG_CPU_ADD("rcmcu", M6502, XTAL_1MHz) /* 1 MHz? */
- MCFG_CPU_PROGRAM_MAP(cdtv_rcmcu_mem)
- MCFG_DEVICE_DISABLE()
+ for (i = 0; i < 2; i++)
+ {
+ UINT16 p9dir = 0x0800 << (i * 4); /* output enable P9 */
+ UINT16 p9dat = 0x0400 << (i * 4); /* data P9 */
+ UINT16 p5dir = 0x0200 << (i * 4); /* output enable P5 */
+ UINT16 p5dat = 0x0100 << (i * 4); /* data P5 */
-// MCFG_CPU_ADD("lcd", LC6554, XTAL_4MHz) /* 4 MHz? */
-// MCFG_CPU_PROGRAM_MAP(cdtv_lcd_mem)
+ /* p5 is floating in input-mode */
+ potgor &= ~p5dat;
+ potgor |= state->m_potgo_value & p5dat;
+ if (!(state->m_potgo_value & p9dir))
+ potgor |= p9dat;
+ /* P5 output and 1 -> shift register is kept reset (Blue button) */
+ if ((state->m_potgo_value & p5dir) && (state->m_potgo_value & p5dat))
+ state->m_cd32_shifter[i] = 8;
+ /* shift at 1 == return one, >1 = return button states */
+ if (state->m_cd32_shifter[i] == 0)
+ potgor &= ~p9dat; /* shift at zero == return zero */
+ if (state->m_cd32_shifter[i] >= 2 && ((player_portname[i])->read() & (1 << (state->m_cd32_shifter[i] - 2))))
+ potgor &= ~p9dat;
+ }
+ return potgor;
+}
- MCFG_MACHINE_START_OVERRIDE(cdtv_state, cdtv )
- MCFG_MACHINE_RESET_OVERRIDE(cdtv_state, cdtv )
+CUSTOM_INPUT_MEMBER( cd32_state::cd32_input )
+{
+ return handle_joystick_potgor(machine(), m_potgo_value) >> 8;
+}
- MCFG_NVRAM_ADD_0FILL("nvram")
+CUSTOM_INPUT_MEMBER( cd32_state::cd32_sel_mirror_input )
+{
+ ioport_port* ports[2]= { m_p1_port, m_p2_port };
+ UINT8 bits = ports[(int)(FPTR)param]->read();
+ return (bits & 0x20)>>5;
+}
- MCFG_SOUND_ADD( "cdda", CDDA, 0 )
- MCFG_SOUND_ROUTE( 0, "lspeaker", 1.0 )
- MCFG_SOUND_ROUTE( 1, "rspeaker", 1.0 )
+WRITE8_MEMBER( cd32_state::akiko_cia_0_port_a_write )
+{
+ // bit 0, cd audio mute
+ m_cdda->set_output_gain(0, BIT(data, 0) ? 0.0 : 1.0);
- /* cdrom */
- MCFG_CDROM_ADD( "cdrom")
- MCFG_CDROM_INTERFACE("cdrom")
-
- MCFG_SOFTWARE_LIST_ADD("cd_list", "cdtv")
+ // bit 1, power led
+ set_led_status(machine(), 0, BIT(data, 1) ? 0 : 1);
- MCFG_DEVICE_ADD("tpi6525", TPI6525, 0)
- MCFG_TPI6525_OUT_IRQ_CB(WRITELINE(amiga_state, amigacd_tpi6525_irq))
- MCFG_TPI6525_OUT_PB_CB(WRITE8(amiga_state, amigacd_tpi6525_portb_w))
- MCFG_TPI6525_IN_PC_CB(READ8(amiga_state, amigacd_tpi6525_portc_r))
-
- MCFG_DEVICE_MODIFY("cia_0")
- MCFG_MOS6526_TOD(0) // connected to vsync
-MACHINE_CONFIG_END
+ handle_cd32_joystick_cia(machine(), data, m_cia_0->read(space, 2));
+}
-static MACHINE_CONFIG_DERIVED( pal, ntsc )
+//**************************************************************************
+// ADDRESS MAPS
+//**************************************************************************
- /* adjust for PAL specs */
- MCFG_CPU_MODIFY("maincpu")
- MCFG_CPU_CLOCK( AMIGA_68000_PAL_CLOCK)
+// The first Amiga systems used a PAL to decode chip selects, later systems
+// switched to the "Gary" chip, the A3000 and A4000 used the "Super Gary"
+// chip. The A600 and A1200 use the Gayle chip, while the CD32 uses its
+// Akiko custom chip.
- // Change the FDC clock too?
+#if 0
+static ADDRESS_MAP_START( a1000_overlay_map, AS_PROGRAM, 16, a1000_state )
+ AM_RANGE(0x000000, 0x03ffff) AM_MIRROR(0x1c0000) AM_RAM AM_SHARE("chip_ram")
+ AM_RANGE(0x200000, 0x201fff) AM_MIRROR(0x03e000) AM_ROM AM_REGION("bootrom", 0)
+ AM_RANGE(0x280000, 0x2bffff) AM_MIRROR(0x040000) AM_RAM AM_SHARE("chip_ram")
+ AM_RANGE(0x300000, 0x33ffff) AM_MIRROR(0x040000) AM_RAM AM_SHARE("chip_ram")
+ AM_RANGE(0x380000, 0x381fff) AM_MIRROR(0x03e000) AM_ROM AM_REGION("bootrom", 0)
+ADDRESS_MAP_END
+#endif
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_RAW_PARAMS(AMIGA_68000_PAL_CLOCK*2,228*4,214,228*4,312,34,312)
-// MCFG_SCREEN_REFRESH_RATE(50)
-// MCFG_SCREEN_SIZE(228*4, 312)
-// MCFG_SCREEN_VISIBLE_AREA(214, (228*4)-1, 34, 312-1)
+static ADDRESS_MAP_START( a1000_overlay_map, AS_PROGRAM, 16, a1000_state )
+ AM_RANGE(0x000000, 0x07ffff) AM_MIRROR(0x180000) AM_RAM AM_SHARE("chip_ram")
+ AM_RANGE(0x200000, 0x201fff) AM_MIRROR(0x03e000) AM_ROM AM_REGION("bootrom", 0)
+ AM_RANGE(0x280000, 0x2fffff) AM_RAM AM_SHARE("chip_ram")
+ AM_RANGE(0x300000, 0x37ffff) AM_RAM AM_SHARE("chip_ram")
+ AM_RANGE(0x380000, 0x381fff) AM_MIRROR(0x03e000) AM_ROM AM_REGION("bootrom", 0)
+ADDRESS_MAP_END
- /* cia */
- MCFG_DEVICE_MODIFY("cia_0")
- MCFG_DEVICE_CLOCK(AMIGA_68000_PAL_CLOCK / 10)
- MCFG_MOS6526_TOD(50)
- MCFG_DEVICE_MODIFY("cia_1")
- MCFG_DEVICE_CLOCK(AMIGA_68000_PAL_CLOCK / 10)
+static ADDRESS_MAP_START( a1000_bootrom_map, AS_PROGRAM, 16, a1000_state )
+ AM_RANGE(0x000000, 0x001fff) AM_MIRROR(0x3e000) AM_ROM AM_REGION("bootrom", 0) AM_WRITE(write_protect_w)
+ AM_RANGE(0x040000, 0x07ffff) AM_ROMBANK("wom")
+ADDRESS_MAP_END
- /* fdc */
- MCFG_DEVICE_MODIFY("fdc")
- MCFG_DEVICE_CLOCK(AMIGA_68000_PAL_CLOCK)
-MACHINE_CONFIG_END
+static ADDRESS_MAP_START( a1000_mem, AS_PROGRAM, 16, a1000_state )
+ ADDRESS_MAP_UNMAP_HIGH
+ AM_RANGE(0x000000, 0x1fffff) AM_DEVICE("overlay", address_map_bank_device, amap16)
+ AM_RANGE(0xa00000, 0xbfffff) AM_READWRITE(cia_r, cia_w)
+ AM_RANGE(0xc00000, 0xdfffff) AM_READWRITE(custom_chip_r, custom_chip_w) AM_SHARE("custom_regs")
+ AM_RANGE(0xe00000, 0xe7ffff) AM_WRITENOP AM_READ(rom_mirror_r)
+ AM_RANGE(0xe80000, 0xefffff) AM_NOP // autoconfig space (installed by devices)
+ AM_RANGE(0xf80000, 0xfbffff) AM_DEVICE("bootrom", address_map_bank_device, amap16)
+ AM_RANGE(0xfc0000, 0xffffff) AM_READWRITE_BANK("wom")
+ADDRESS_MAP_END
-static MACHINE_CONFIG_DERIVED( a500p, pal )
- MCFG_DEVICE_MODIFY("cia_0")
- MCFG_MOS6526_TOD(0) // connected to vsync
+// Gary/Super Gary/Gayle with 512KB chip RAM
+static ADDRESS_MAP_START( overlay_512kb_map, AS_PROGRAM, 16, amiga_state )
+ ADDRESS_MAP_UNMAP_HIGH
+ AM_RANGE(0x000000, 0x07ffff) AM_MIRROR(0x180000) AM_RAM AM_SHARE("chip_ram")
+ AM_RANGE(0x200000, 0x27ffff) AM_ROM AM_REGION("kickstart", 0)
+ADDRESS_MAP_END
- MCFG_FRAGMENT_ADD(amiga_cartslot)
+// Gary/Super Gary/Gayle with 1MB chip RAM
+static ADDRESS_MAP_START( overlay_1mb_map, AS_PROGRAM, 16, amiga_state )
+ ADDRESS_MAP_UNMAP_HIGH
+ AM_RANGE(0x000000, 0x0fffff) AM_MIRROR(0x100000) AM_RAM AM_SHARE("chip_ram")
+ AM_RANGE(0x200000, 0x27ffff) AM_ROM AM_REGION("kickstart", 0)
+ADDRESS_MAP_END
- MCFG_SOFTWARE_LIST_ADD("flop_misc","amiga_flop")
- MCFG_SOFTWARE_LIST_ADD("flop_ocs","amigaocs_flop")
- MCFG_SOFTWARE_LIST_ADD("flop_ecs","amigaecs_flop")
-MACHINE_CONFIG_END
+// Gary/Super Gary/Gayle with 1MB chip RAM (32 bit system)
+static ADDRESS_MAP_START( overlay_1mb_map32, AS_PROGRAM, 32, amiga_state )
+ ADDRESS_MAP_UNMAP_HIGH
+ AM_RANGE(0x000000, 0x0fffff) AM_MIRROR(0x100000) AM_RAM AM_SHARE("chip_ram")
+ AM_RANGE(0x200000, 0x27ffff) AM_ROM AM_REGION("kickstart", 0)
+ADDRESS_MAP_END
-static MACHINE_CONFIG_DERIVED( a1000p, pal )
- MCFG_CPU_MODIFY("maincpu")
- MCFG_CPU_PROGRAM_MAP(a1000_mem)
-MACHINE_CONFIG_END
+// Gary/Super Gary/Gayle with 2MB chip RAM (32 bit system)
+static ADDRESS_MAP_START( overlay_2mb_map32, AS_PROGRAM, 32, amiga_state )
+ ADDRESS_MAP_UNMAP_HIGH
+ AM_RANGE(0x000000, 0x1fffff) AM_RAM AM_SHARE("chip_ram")
+ AM_RANGE(0x200000, 0x27ffff) AM_ROM AM_REGION("kickstart", 0)
+ADDRESS_MAP_END
-/* Machine definitions with Software List associations for system software */
+// 512KB chip RAM, 512KB slow RAM, RTC
+static ADDRESS_MAP_START( a2000_mem, AS_PROGRAM, 16, a2000_state )
+ ADDRESS_MAP_UNMAP_HIGH
+ AM_RANGE(0x000000, 0x1fffff) AM_DEVICE("overlay", address_map_bank_device, amap16)
+ AM_RANGE(0xa00000, 0xbfffff) AM_READWRITE(cia_r, cia_w)
+ AM_RANGE(0xc00000, 0xc7ffff) AM_RAM
+ AM_RANGE(0xc80000, 0xd7ffff) AM_READWRITE(custom_chip_r, custom_chip_w)
+ AM_RANGE(0xd80000, 0xdbffff) AM_NOP
+ AM_RANGE(0xdc0000, 0xdc7fff) AM_READWRITE(clock_r, clock_w)
+ AM_RANGE(0xd80000, 0xddffff) AM_NOP
+ AM_RANGE(0xde0000, 0xdeffff) AM_READWRITE(custom_chip_r, custom_chip_w)
+ AM_RANGE(0xdf0000, 0xdfffff) AM_READWRITE(custom_chip_r, custom_chip_w) AM_SHARE("custom_regs")
+ AM_RANGE(0xe00000, 0xe7ffff) AM_WRITENOP AM_READ(rom_mirror_r)
+ AM_RANGE(0xe80000, 0xefffff) AM_NOP // autoconfig space (installed by devices)
+ AM_RANGE(0xf80000, 0xffffff) AM_ROM AM_REGION("kickstart", 0)
+ADDRESS_MAP_END
-/* Amiga 1000 */
+// 512KB chip RAM and no clock
+static ADDRESS_MAP_START( a500_mem, AS_PROGRAM, 16, a500_state )
+ ADDRESS_MAP_UNMAP_HIGH
+ AM_RANGE(0x000000, 0x1fffff) AM_DEVICE("overlay", address_map_bank_device, amap16)
+ AM_RANGE(0xa00000, 0xbfffff) AM_READWRITE(cia_r, cia_w)
+ AM_RANGE(0xc00000, 0xd7ffff) AM_READWRITE(custom_chip_r, custom_chip_w)
+ AM_RANGE(0xd80000, 0xddffff) AM_NOP
+ AM_RANGE(0xde0000, 0xdeffff) AM_READWRITE(custom_chip_r, custom_chip_w)
+ AM_RANGE(0xdf0000, 0xdfffff) AM_READWRITE(custom_chip_r, custom_chip_w) AM_SHARE("custom_regs")
+ AM_RANGE(0xe00000, 0xe7ffff) AM_WRITENOP AM_READ(rom_mirror_r)
+ AM_RANGE(0xe80000, 0xefffff) AM_NOP // autoconfig space (installed by devices)
+ AM_RANGE(0xf80000, 0xffffff) AM_ROM AM_REGION("kickstart", 0)
+ADDRESS_MAP_END
-static MACHINE_CONFIG_DERIVED( a1000, a1000p )
- MCFG_SOFTWARE_LIST_ADD("flop_list","amiga1000_flop")
-MACHINE_CONFIG_END
+// 1MB chip RAM, RTC and CDTV specific hardware
+static ADDRESS_MAP_START( cdtv_mem, AS_PROGRAM, 16, cdtv_state )
+ ADDRESS_MAP_UNMAP_HIGH
+ AM_RANGE(0x000000, 0x1fffff) AM_DEVICE("overlay", address_map_bank_device, amap16)
+ AM_RANGE(0xa00000, 0xbfffff) AM_READWRITE(cia_r, cia_w)
+ AM_RANGE(0xc00000, 0xd7ffff) AM_READWRITE(custom_chip_r, custom_chip_w)
+ AM_RANGE(0xd80000, 0xdbffff) AM_NOP
+ AM_RANGE(0xdc0000, 0xdc7fff) AM_READWRITE(clock_r, clock_w)
+ AM_RANGE(0xdc8000, 0xdc87ff) AM_MIRROR(0x7800) AM_RAM AM_SHARE("sram")
+ AM_RANGE(0xdd0000, 0xddffff) AM_NOP
+ AM_RANGE(0xde0000, 0xdeffff) AM_READWRITE(custom_chip_r, custom_chip_w)
+ AM_RANGE(0xdf0000, 0xdfffff) AM_READWRITE(custom_chip_r, custom_chip_w) AM_SHARE("custom_regs")
+ AM_RANGE(0xe00000, 0xe3ffff) AM_MIRROR(0x40000) AM_RAM AM_SHARE("memcard")
+ AM_RANGE(0xe80000, 0xefffff) AM_NOP // autoconfig space (installed by devices)
+ AM_RANGE(0xf00000, 0xf3ffff) AM_MIRROR(0x40000) AM_ROM AM_REGION("cdrom", 0)
+ AM_RANGE(0xf80000, 0xffffff) AM_ROM AM_REGION("kickstart", 0)
+ADDRESS_MAP_END
-static MACHINE_CONFIG_DERIVED( a1000n, a1000ntsc )
- MCFG_SOFTWARE_LIST_ADD("flop_list","amiga1000_flop")
-MACHINE_CONFIG_END
+static ADDRESS_MAP_START( cdtv_rc_mem, AS_PROGRAM, 8, cdtv_state )
+ AM_RANGE(0x0800, 0x0fff) AM_ROM AM_REGION("rcmcu", 0)
+ADDRESS_MAP_END
-/* Amiga 500 */
+static ADDRESS_MAP_START( a3000_mem, AS_PROGRAM, 32, a3000_state )
+ ADDRESS_MAP_UNMAP_HIGH
+ AM_RANGE(0x00000000, 0x001fffff) AM_DEVICE("overlay", address_map_bank_device, amap32)
+ AM_RANGE(0x00b80000, 0x00bfffff) AM_READWRITE16(cia_r, cia_w, 0xffffffff)
+ AM_RANGE(0x00c00000, 0x00cfffff) AM_READWRITE16(custom_chip_r, custom_chip_w, 0xffffffff)
+ AM_RANGE(0x00d00000, 0x00dbffff) AM_NOP
+ AM_RANGE(0x00dc0000, 0x00dcffff) AM_READWRITE(clock_r, clock_w)
+ AM_RANGE(0x00dd0000, 0x00ddffff) AM_READWRITE(scsi_r, scsi_w)
+ AM_RANGE(0x00de0000, 0x00deffff) AM_READWRITE(motherboard_r, motherboard_w)
+ AM_RANGE(0x00df0000, 0x00dfffff) AM_READWRITE16(custom_chip_r, custom_chip_w, 0xffffffff) AM_SHARE("custom_regs")
+ AM_RANGE(0x00e80000, 0x00efffff) AM_NOP // autoconfig space (installed by devices)
+ AM_RANGE(0x00f00000, 0x00f7ffff) AM_NOP // cartridge space
+ AM_RANGE(0x00f80000, 0x00ffffff) AM_ROM AM_REGION("kickstart", 0)
+ AM_RANGE(0x07f00000, 0x07ffffff) AM_RAM // motherboard ram (up to 16mb), grows downward
+ADDRESS_MAP_END
-static MACHINE_CONFIG_DERIVED( a500, a500p )
- MCFG_SOFTWARE_LIST_ADD("flop_list","amiga500_flop")
-MACHINE_CONFIG_END
+// 1MB chip RAM and RTC
+static ADDRESS_MAP_START( a500p_mem, AS_PROGRAM, 16, a500p_state )
+ ADDRESS_MAP_UNMAP_HIGH
+ AM_RANGE(0x000000, 0x1fffff) AM_DEVICE("overlay", address_map_bank_device, amap16)
+ AM_RANGE(0xa00000, 0xbfffff) AM_READWRITE(cia_r, cia_w)
+ AM_RANGE(0xc00000, 0xc7ffff) AM_RAM
+ AM_RANGE(0xc80000, 0xd7ffff) AM_READWRITE(custom_chip_r, custom_chip_w)
+ AM_RANGE(0xd80000, 0xdbffff) AM_NOP
+ AM_RANGE(0xdc0000, 0xdc7fff) AM_READWRITE(clock_r, clock_w)
+ AM_RANGE(0xd80000, 0xddffff) AM_NOP
+ AM_RANGE(0xde0000, 0xdeffff) AM_READWRITE(custom_chip_r, custom_chip_w)
+ AM_RANGE(0xdf0000, 0xdfffff) AM_READWRITE(custom_chip_r, custom_chip_w) AM_SHARE("custom_regs")
+ AM_RANGE(0xe00000, 0xe7ffff) AM_WRITENOP AM_READ(rom_mirror_r)
+ AM_RANGE(0xe80000, 0xefffff) AM_NOP // autoconfig space (installed by devices)
+ AM_RANGE(0xf80000, 0xffffff) AM_ROM AM_REGION("kickstart", 0)
+ADDRESS_MAP_END
-static MACHINE_CONFIG_DERIVED( a500n, a500ntsc )
- MCFG_SOFTWARE_LIST_ADD("flop_list","amiga500_flop")
-MACHINE_CONFIG_END
+// 1MB chip RAM, IDE and PCMCIA
+static ADDRESS_MAP_START( a600_mem, AS_PROGRAM, 16, a600_state )
+ ADDRESS_MAP_UNMAP_HIGH
+ AM_RANGE(0x000000, 0x1fffff) AM_DEVICE("overlay", address_map_bank_device, amap16)
+ AM_RANGE(0x200000, 0xa7ffff) AM_NOP
+ AM_RANGE(0xa80000, 0xafffff) AM_WRITENOP AM_READ(rom_mirror_r)
+ AM_RANGE(0xb00000, 0xb7ffff) AM_WRITENOP AM_READ(rom_mirror_r)
+ AM_RANGE(0xb80000, 0xbeffff) AM_NOP // reserved (cdtv)
+ AM_RANGE(0xbf0000, 0xbfffff) AM_READWRITE(cia_r, gayle_cia_w)
+ AM_RANGE(0xc00000, 0xd7ffff) AM_NOP // slow mem
+// AM_RANGE(0xd80000, 0xd8ffff) AM_NOP // spare chip select
+// AM_RANGE(0xd90000, 0xd9ffff) AM_NOP // arcnet chip select
+ AM_RANGE(0xda0000, 0xda3fff) AM_READWRITE(ide_r, ide_w)
+// AM_RANGE(0xda4000, 0xda7fff) AM_NOP // ide reserved
+ AM_RANGE(0xda8000, 0xdaffff) AM_READWRITE(gayle_r, gayle_w)
+// AM_RANGE(0xdb0000, 0xdbffff) AM_NOP // reserved (external ide)
+ AM_RANGE(0xdc0000, 0xdcffff) AM_NOP // rtc
+// AM_RANGE(0xdd0000, 0xddffff) AM_NOP // reserved (dma controller)
+ AM_RANGE(0xde0000, 0xdeffff) AM_READWRITE(gayle_id_r, gayle_id_w)
+ AM_RANGE(0xdf0000, 0xdfffff) AM_READWRITE(custom_chip_r, custom_chip_w) AM_SHARE("custom_regs")
+ AM_RANGE(0xe00000, 0xe7ffff) AM_WRITENOP AM_READ(rom_mirror_r)
+ AM_RANGE(0xe80000, 0xefffff) AM_NOP // autoconfig space (installed by devices)
+ AM_RANGE(0xf00000, 0xf7ffff) AM_NOP // cartridge space
+ AM_RANGE(0xf80000, 0xffffff) AM_ROM AM_REGION("kickstart", 0)
+ADDRESS_MAP_END
-/* Amiga 500 Plus */
+// 2MB chip RAM, IDE and PCMCIA
+static ADDRESS_MAP_START( a1200_mem, AS_PROGRAM, 32, a1200_state )
+ ADDRESS_MAP_UNMAP_HIGH
+ AM_RANGE(0x000000, 0x1fffff) AM_DEVICE("overlay", address_map_bank_device, amap32)
+ AM_RANGE(0x200000, 0xa7ffff) AM_NOP
+ AM_RANGE(0xa80000, 0xafffff) AM_WRITENOP AM_READ(rom_mirror32_r)
+ AM_RANGE(0xb00000, 0xb7ffff) AM_WRITENOP AM_READ(rom_mirror32_r)
+ AM_RANGE(0xb80000, 0xbeffff) AM_NOP // reserved (cdtv)
+ AM_RANGE(0xbf0000, 0xbfffff) AM_READWRITE16(cia_r, gayle_cia_w, 0xffffffff)
+ AM_RANGE(0xc00000, 0xd7ffff) AM_NOP // slow mem
+ AM_RANGE(0xd80000, 0xd8ffff) AM_NOP // spare chip select
+ AM_RANGE(0xd90000, 0xd9ffff) AM_NOP // arcnet chip select
+ AM_RANGE(0xda0000, 0xda3fff) AM_READWRITE(ide_r, ide_w)
+ AM_RANGE(0xda4000, 0xda7fff) AM_NOP // ide reserved
+ AM_RANGE(0xda8000, 0xdaffff) AM_READWRITE(gayle_r, gayle_w)
+ AM_RANGE(0xdb0000, 0xdbffff) AM_NOP // reserved (external ide)
+ AM_RANGE(0xdc0000, 0xdcffff) AM_NOP // rtc
+ AM_RANGE(0xdd0000, 0xddffff) AM_NOP // reserved (dma controller)
+ AM_RANGE(0xde0000, 0xdeffff) AM_NOP // reserved (mb resources)
+ AM_RANGE(0xdf0000, 0xdfffff) AM_READWRITE16(custom_chip_r, custom_chip_w, 0xffffffff) AM_SHARE("custom_regs")
+ AM_RANGE(0xe00000, 0xe7ffff) AM_WRITENOP AM_READ(rom_mirror32_r)
+ AM_RANGE(0xe80000, 0xefffff) AM_NOP // autoconfig space (installed by devices)
+ AM_RANGE(0xf00000, 0xf7ffff) AM_NOP // cartridge space
+ AM_RANGE(0xf80000, 0xffffff) AM_ROM AM_REGION("kickstart", 0)
+ADDRESS_MAP_END
-static MACHINE_CONFIG_DERIVED( a500pls, a500p )
- MCFG_SOFTWARE_LIST_ADD("flop_list","amiga500plus_flop")
-MACHINE_CONFIG_END
+// 2MB chip RAM, 4 MB fast RAM, RTC and IDE
+static ADDRESS_MAP_START( a4000_mem, AS_PROGRAM, 32, a4000_state )
+ ADDRESS_MAP_UNMAP_HIGH
+ AM_RANGE(0x00000000, 0x001fffff) AM_DEVICE("overlay", address_map_bank_device, amap32)
+ AM_RANGE(0x00200000, 0x009fffff) AM_NOP // zorro2 expansion
+ AM_RANGE(0x00a00000, 0x00b7ffff) AM_NOP
+ AM_RANGE(0x00b80000, 0x00beffff) AM_NOP
+ AM_RANGE(0x00bf0000, 0x00bfffff) AM_READWRITE16(cia_r, cia_w, 0xffffffff)
+ AM_RANGE(0x00c00000, 0x00cfffff) AM_READWRITE16(custom_chip_r, custom_chip_w, 0xffffffff)
+ AM_RANGE(0x00d00000, 0x00d9ffff) AM_NOP
+ AM_RANGE(0x00da0000, 0x00dbffff) AM_NOP
+ AM_RANGE(0x00dc0000, 0x00dcffff) AM_READWRITE(clock_r, clock_w)
+ AM_RANGE(0x00dd0000, 0x00dd0fff) AM_NOP
+ AM_RANGE(0x00dd1000, 0x00dd3fff) AM_READWRITE(ide_r, ide_w)
+ AM_RANGE(0x00dd4000, 0x00ddffff) AM_NOP
+ AM_RANGE(0x00de0000, 0x00deffff) AM_READWRITE(motherboard_r, motherboard_w)
+ AM_RANGE(0x00df0000, 0x00dfffff) AM_READWRITE16(custom_chip_r, custom_chip_w, 0xffffffff) AM_SHARE("custom_regs")
+ AM_RANGE(0x00e00000, 0x00e7ffff) AM_WRITENOP AM_READ(rom_mirror32_r)
+ AM_RANGE(0x00e80000, 0x00efffff) AM_NOP // zorro2 autoconfig space (installed by devices)
+ AM_RANGE(0x00f00000, 0x00f7ffff) AM_NOP // cartridge space
+ AM_RANGE(0x00f80000, 0x00ffffff) AM_ROM AM_REGION("kickstart", 0)
+ AM_RANGE(0x01000000, 0x017fffff) AM_NOP // reserved (8 mb chip ram)
+ AM_RANGE(0x01800000, 0x06ffffff) AM_NOP // reserved (motherboard fast ram expansion)
+ AM_RANGE(0x07000000, 0x07bfffff) AM_NOP // motherboard ram
+ AM_RANGE(0x07c00000, 0x07ffffff) AM_RAM // motherboard ram (up to 16mb), grows downward
+ADDRESS_MAP_END
-static MACHINE_CONFIG_DERIVED( a500plsn, a500ntsc )
- MCFG_SOFTWARE_LIST_ADD("flop_list","amiga500plus_flop")
-MACHINE_CONFIG_END
+// 2MB chip RAM, 2 MB fast RAM, RTC and IDE
+static ADDRESS_MAP_START( a400030_mem, AS_PROGRAM, 32, a4000_state )
+ ADDRESS_MAP_UNMAP_HIGH
+ AM_IMPORT_FROM(a4000_mem)
+ AM_RANGE(0x07000000, 0x07dfffff) AM_NOP // motherboard ram
+ AM_RANGE(0x07e00000, 0x07ffffff) AM_RAM // motherboard ram (up to 16mb), grows downward
+ADDRESS_MAP_END
-/* Amiga 600 */
+// 2MB chip RAM and CD-ROM
+static ADDRESS_MAP_START( cd32_mem, AS_PROGRAM, 32, cd32_state )
+ ADDRESS_MAP_UNMAP_HIGH
+ AM_RANGE(0x000000, 0x1fffff) AM_DEVICE("overlay", address_map_bank_device, amap32)
+ AM_RANGE(0xb80000, 0xb8003f) AM_DEVREADWRITE("akiko", akiko_device, read, write)
+ AM_RANGE(0xbf0000, 0xbfffff) AM_READWRITE16(cia_r, gayle_cia_w, 0xffffffff)
+ AM_RANGE(0xc00000, 0xdfffff) AM_READWRITE16(custom_chip_r, custom_chip_w, 0xffffffff) AM_SHARE("custom_regs")
+ AM_RANGE(0xe00000, 0xe7ffff) AM_ROM AM_REGION("kickstart", 0x80000)
+ AM_RANGE(0xa00000, 0xf7ffff) AM_NOP
+ AM_RANGE(0xf80000, 0xffffff) AM_ROM AM_REGION("kickstart", 0)
+ADDRESS_MAP_END
-static MACHINE_CONFIG_DERIVED( a600, a500p )
- MCFG_SOFTWARE_LIST_ADD("flop_list","amiga600_flop")
-MACHINE_CONFIG_END
+// 2 MB chip RAM, IDE, RTC and SCSI
+static ADDRESS_MAP_START( a4000t_mem, AS_PROGRAM, 32, a4000_state )
+ ADDRESS_MAP_UNMAP_HIGH
+ AM_IMPORT_FROM(a4000_mem)
+ AM_RANGE(0x00dd0000, 0x00dd0fff) AM_READWRITE(scsi_r, scsi_w)
+ADDRESS_MAP_END
-static MACHINE_CONFIG_DERIVED( a600n, a500ntsc )
- MCFG_SOFTWARE_LIST_ADD("flop_list","amiga600_flop")
-MACHINE_CONFIG_END
+//**************************************************************************
+// INPUTS
+//**************************************************************************
+static INPUT_PORTS_START( amiga )
+ PORT_START("input")
+ PORT_CONFNAME(0x10, 0x00, "Game Port 0 Device")
+ PORT_CONFSETTING(0x00, "Mouse")
+ PORT_CONFSETTING(0x10, DEF_STR(Joystick))
+ PORT_CONFNAME(0x20, 0x20, "Game Port 1 Device")
+ PORT_CONFSETTING(0x00, "Mouse")
+ PORT_CONFSETTING(0x20, DEF_STR(Joystick) )
+
+ PORT_START("cia_0_port_a")
+ PORT_BIT(0x3f, IP_ACTIVE_HIGH, IPT_SPECIAL) PORT_CUSTOM_MEMBER(DEVICE_SELF, amiga_state, floppy_drive_status, 0)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_BUTTON1) PORT_PLAYER(1)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_BUTTON1) PORT_PLAYER(2)
+
+ PORT_START("joy_0_dat")
+ PORT_BIT(0x0303, IP_ACTIVE_HIGH, IPT_SPECIAL) PORT_CUSTOM_MEMBER(DEVICE_SELF, amiga_state, amiga_joystick_convert, 0)
+ PORT_BIT(0xfcfc, IP_ACTIVE_HIGH, IPT_UNUSED)
+
+ PORT_START("joy_1_dat")
+ PORT_BIT(0x0303, IP_ACTIVE_HIGH, IPT_SPECIAL) PORT_CUSTOM_MEMBER(DEVICE_SELF, amiga_state, amiga_joystick_convert, 1)
+ PORT_BIT(0xfcfc, IP_ACTIVE_HIGH, IPT_UNUSED)
+
+ PORT_START("potgo")
+ PORT_BIT(0x0100, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x0400, IP_ACTIVE_LOW, IPT_BUTTON2) PORT_PLAYER(1)
+ PORT_BIT(0x1000, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x4000, IP_ACTIVE_LOW, IPT_BUTTON2) PORT_PLAYER(2)
+ PORT_BIT(0xaaff, IP_ACTIVE_HIGH, IPT_UNUSED)
+
+ PORT_START("p1_joy")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP) PORT_PLAYER(1)
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN) PORT_PLAYER(1)
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT) PORT_PLAYER(1)
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT) PORT_PLAYER(1)
+
+ PORT_START("p2_joy")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP) PORT_PLAYER(2)
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN) PORT_PLAYER(2)
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT) PORT_PLAYER(2)
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT) PORT_PLAYER(2)
+
+ PORT_START("p1_mouse_x")
+ PORT_BIT(0xff, 0x00, IPT_MOUSE_X) PORT_SENSITIVITY(100) PORT_KEYDELTA(5) PORT_MINMAX(0, 255) PORT_PLAYER(1)
+
+ PORT_START("p1_mouse_y")
+ PORT_BIT(0xff, 0x00, IPT_MOUSE_Y) PORT_SENSITIVITY(100) PORT_KEYDELTA(5) PORT_MINMAX(0, 255) PORT_PLAYER(1)
+
+ PORT_START("p2_mouse_x")
+ PORT_BIT(0xff, 0x00, IPT_MOUSE_X) PORT_SENSITIVITY(100) PORT_KEYDELTA(5) PORT_MINMAX(0, 255) PORT_PLAYER(2)
+
+ PORT_START("p2_mouse_y")
+ PORT_BIT(0xff, 0x00, IPT_MOUSE_Y) PORT_SENSITIVITY(100) PORT_KEYDELTA(5) PORT_MINMAX(0, 255) PORT_PLAYER(2)
+INPUT_PORTS_END
-static MACHINE_CONFIG_START( a1200n, a1200_state )
+INPUT_PORTS_START( cd32 )
+ PORT_INCLUDE(amiga)
- /* basic machine hardware */
- MCFG_CPU_ADD("maincpu", M68EC020, AMIGA_68EC020_NTSC_CLOCK) /* 14.3 Mhz */
- MCFG_CPU_PROGRAM_MAP(a1200_map)
+ PORT_MODIFY("cia_0_port_a")
+ PORT_BIT( 0x3f, IP_ACTIVE_LOW, IPT_SPECIAL )
+ // this is the regular port for reading a single button joystick on the Amiga, many CD32 games require this to mirror the pad start button!
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, cd32_state, cd32_sel_mirror_input, 0)
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, cd32_state, cd32_sel_mirror_input, 1)
- MCFG_CPU_ADD("keyboard", M6502, XTAL_1MHz) /* 1 MHz? */
- MCFG_CPU_PROGRAM_MAP(keyboard_mem)
- MCFG_DEVICE_DISABLE()
+ PORT_MODIFY("joy_0_dat")
+ PORT_BIT( 0x0303, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, amiga_state, amiga_joystick_convert, 0)
+ PORT_BIT( 0xfcfc, IP_ACTIVE_HIGH, IPT_UNUSED )
- MCFG_MACHINE_START_OVERRIDE(amiga_state, amiga )
- MCFG_MACHINE_RESET_OVERRIDE(amiga_state, amiga )
+ PORT_MODIFY("joy_1_dat")
+ PORT_BIT( 0x0303, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, amiga_state, amiga_joystick_convert, 1)
+ PORT_BIT( 0xfcfc, IP_ACTIVE_HIGH, IPT_UNUSED )
- /* TODO: params */
- MCFG_SCREEN_ADD("screen", RASTER)
-// MCFG_SCREEN_REFRESH_RATE(59.997)
-// MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
-// MCFG_SCREEN_SIZE(512*2, 312)
-// MCFG_SCREEN_VISIBLE_AREA((129-8-8)*2, (449+8-1+8)*2, 44-8, 300+8-1)
-// MCFG_SCREEN_RAW_PARAMS(AMIGA_68EC020_NTSC_CLOCK,512*2,(129-8-8)*2,(449+8-1+8)*2,312,44-8,300+8)
- MCFG_SCREEN_RAW_PARAMS(AMIGA_68EC020_NTSC_CLOCK,228*4,214,228*4,262,34,262)
+ PORT_MODIFY("potgo")
+ PORT_BIT( 0xff00, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, cd32_state, cd32_input, 0)
+ PORT_BIT( 0x00ff, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ // CD32 '11' button pad (4 dpad directions + 7 buttons), not read directly
+ PORT_START("p1_cd32_buttons")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1) PORT_NAME("P1 Play/Pause")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(1) PORT_NAME("P1 Left Trigger/Rewind")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(1) PORT_NAME("P1 Right Trigger/Forward")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(1) PORT_NAME("P1 Green/Stop")
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_PLAYER(1) PORT_NAME("P1 Yellow/Shuffle")
+ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_PLAYER(1) PORT_NAME("P1 Red/Select")
+ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON7 ) PORT_PLAYER(1) PORT_NAME("P1 Blue/Loop")
+
+ // CD32 '11' button pad (4 dpad directions + 7 buttons), not read directly
+ PORT_START("p2_cd32_buttons")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_NAME("P2 Play/Pause")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(2) PORT_NAME("P2 Left Trigger/Rewind")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(2) PORT_NAME("P2 Right Trigger/Forward")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(2) PORT_NAME("P2 Green/Stop")
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_PLAYER(2) PORT_NAME("P2 Yellow/Shuffle")
+ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_PLAYER(2) PORT_NAME("P2 Red/Select")
+ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON7 ) PORT_PLAYER(2) PORT_NAME("P2 Blue/Loop")
+INPUT_PORTS_END
- MCFG_SCREEN_UPDATE_DRIVER(a1200_state, screen_update_amiga_aga)
- MCFG_VIDEO_START_OVERRIDE(a1200_state,amiga_aga)
+//**************************************************************************
+// MACHINE DRIVERS
+//**************************************************************************
- MCFG_DEFAULT_LAYOUT(layout_amiga)
+static SLOT_INTERFACE_START( amiga_floppies )
+ SLOT_INTERFACE("35dd", FLOPPY_35_DD)
+SLOT_INTERFACE_END
+
+// basic elements common to all amigas
+static MACHINE_CONFIG_START( amiga_base, amiga_state )
+ // video
+ MCFG_SCREEN_ADD("screen", RASTER)
+ MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK)
+ MCFG_SCREEN_RAW_PARAMS(amiga_state::CLK_28M_PAL / 4 * 2, 910, 186, 910, 312, 29 /* 26 */, 312)
+ MCFG_SCREEN_UPDATE_DRIVER(amiga_state, screen_update_amiga)
+ MCFG_SCREEN_PALETTE("palette")
MCFG_PALETTE_ADD("palette", 4096)
- MCFG_PALETTE_INIT_OWNER(amiga_state, amiga )
+ MCFG_PALETTE_INIT_OWNER(amiga_state, amiga)
- MCFG_VIDEO_START_OVERRIDE(amiga_state,amiga)
+ MCFG_VIDEO_START_OVERRIDE(amiga_state, amiga)
- /* devices */
- MCFG_DEVICE_ADD("rtc", MSM6242, XTAL_32_768kHz)
- MCFG_CENTRONICS_ADD("centronics", centronics_printers, "printer")
- MCFG_CENTRONICS_ACK_HANDLER(WRITELINE(amiga_state, write_centronics_ack))
- MCFG_CENTRONICS_BUSY_HANDLER(WRITELINE(amiga_state, write_centronics_busy))
- MCFG_CENTRONICS_PERROR_HANDLER(WRITELINE(amiga_state, write_centronics_perror))
- MCFG_CENTRONICS_SELECT_HANDLER(WRITELINE(amiga_state, write_centronics_select))
+ // cia
+ MCFG_DEVICE_ADD("cia_0", LEGACY_MOS8520, amiga_state::CLK_E_PAL)
+ MCFG_MOS6526_IRQ_CALLBACK(WRITELINE(amiga_state, cia_0_irq))
+ MCFG_MOS6526_PC_CALLBACK(DEVWRITELINE("centronics", centronics_device, write_strobe))
+ MCFG_MOS6526_PA_INPUT_CALLBACK(IOPORT("cia_0_port_a"))
+ MCFG_MOS6526_PA_OUTPUT_CALLBACK(WRITE8(amiga_state, cia_0_port_a_write))
+ MCFG_MOS6526_PB_OUTPUT_CALLBACK(DEVWRITE8("cent_data_out", output_latch_device, write))
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics")
+ MCFG_DEVICE_ADD("cia_1", LEGACY_MOS8520, amiga_state::CLK_E_PAL)
+ MCFG_MOS6526_IRQ_CALLBACK(WRITELINE(amiga_state, cia_1_irq))
+ MCFG_MOS6526_PA_INPUT_CALLBACK(READ8(amiga_state, cia_1_port_a_read))
+ MCFG_MOS6526_PB_OUTPUT_CALLBACK(DEVWRITE8("fdc", amiga_fdc, ciaaprb_w))
- /* sound hardware */
+ // audio
MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
-
- MCFG_SOUND_ADD("amiga", AMIGA, 3579545)
+ MCFG_SOUND_ADD("amiga", AMIGA, amiga_state::CLK_C1_PAL)
MCFG_SOUND_ROUTE(0, "lspeaker", 0.50)
MCFG_SOUND_ROUTE(1, "rspeaker", 0.50)
MCFG_SOUND_ROUTE(2, "rspeaker", 0.50)
MCFG_SOUND_ROUTE(3, "lspeaker", 0.50)
- /* cia */
- MCFG_DEVICE_ADD("cia_0", LEGACY_MOS8520, AMIGA_68EC020_NTSC_CLOCK /2 / 10)
- MCFG_MOS6526_IRQ_CALLBACK(WRITELINE(amiga_state, amiga_cia_0_irq))
- MCFG_MOS6526_PC_CALLBACK(DEVWRITELINE("centronics", centronics_device, write_strobe))
- MCFG_MOS6526_PA_INPUT_CALLBACK(READ8(amiga_state, amiga_cia_0_portA_r))
- MCFG_MOS6526_PA_OUTPUT_CALLBACK(WRITE8(amiga_state, amiga_cia_0_portA_w))
- MCFG_MOS6526_PB_OUTPUT_CALLBACK(DEVWRITE8("cent_data_out", output_latch_device, write))
- MCFG_DEVICE_ADD("cia_1", LEGACY_MOS8520, AMIGA_68EC020_NTSC_CLOCK /2 / 10)
- MCFG_MOS6526_IRQ_CALLBACK(WRITELINE(amiga_state, amiga_cia_1_irq))
- MCFG_MOS6526_PA_INPUT_CALLBACK(READ8(amiga_state, amiga_cia_1_porta_r))
- MCFG_MOS6526_PB_OUTPUT_CALLBACK(DEVWRITE8("fdc", amiga_fdc, ciaaprb_w))
-
- /* fdc */
- MCFG_DEVICE_ADD("fdc", AMIGA_FDC, AMIGA_68EC020_NTSC_CLOCK / 2)
- MCFG_AMIGA_FDC_INDEX_CALLBACK(DEVWRITELINE("cia_1", legacy_mos6526_device, flag_w))
+ // floppy drives
+ MCFG_DEVICE_ADD("fdc", AMIGA_FDC, amiga_state::CLK_7M_PAL)
MCFG_FLOPPY_DRIVE_ADD("fdc:0", amiga_floppies, "35dd", amiga_fdc::floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("fdc:1", amiga_floppies, 0, amiga_fdc::floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("fdc:2", amiga_floppies, 0, amiga_fdc::floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("fdc:3", amiga_floppies, 0, amiga_fdc::floppy_formats)
+ MCFG_FLOPPY_DRIVE_ADD("fdc:1", amiga_floppies, 0, amiga_fdc::floppy_formats)
+ MCFG_FLOPPY_DRIVE_ADD("fdc:2", amiga_floppies, 0, amiga_fdc::floppy_formats)
+ MCFG_FLOPPY_DRIVE_ADD("fdc:3", amiga_floppies, 0, amiga_fdc::floppy_formats)
+
+ // centronics
+ MCFG_CENTRONICS_ADD("centronics", centronics_printers, "printer")
+ MCFG_CENTRONICS_ACK_HANDLER(WRITELINE(amiga_state, centronics_ack_w))
+ MCFG_CENTRONICS_BUSY_HANDLER(WRITELINE(amiga_state, centronics_busy_w))
+ MCFG_CENTRONICS_PERROR_HANDLER(WRITELINE(amiga_state, centronics_perror_w))
+ MCFG_CENTRONICS_SELECT_HANDLER(WRITELINE(amiga_state, centronics_select_w))
+ MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics")
+
+ // todo: rs232
+ // keyboard
MCFG_DEVICE_ADD("kbd", AMIGAKBD, 0)
MCFG_AMIGA_KEYBOARD_KCLK_CALLBACK(DEVWRITELINE("cia_0", legacy_mos6526_device, cnt_w))
MCFG_AMIGA_KEYBOARD_KDAT_CALLBACK(DEVWRITELINE("cia_0", legacy_mos6526_device, sp_w))
-
- MCFG_SOFTWARE_LIST_ADD("flop_list","amiga1200_flop")
- MCFG_SOFTWARE_LIST_ADD("flop_misc","amiga_flop")
- MCFG_SOFTWARE_LIST_ADD("flop_ocs","amigaocs_flop")
- MCFG_SOFTWARE_LIST_ADD("flop_ecs","amigaecs_flop")
- MCFG_SOFTWARE_LIST_ADD("flop_aga","amigaaga_flop")
-
-
-
MACHINE_CONFIG_END
+static MACHINE_CONFIG_DERIVED_CLASS( a1000, amiga_base, a1000_state )
+ // main cpu
+ MCFG_CPU_ADD("maincpu", M68000, amiga_state::CLK_7M_PAL)
+ MCFG_CPU_PROGRAM_MAP(a1000_mem)
-static MACHINE_CONFIG_DERIVED( a1200, a1200n )
-
- /* adjust for PAL specs */
- MCFG_CPU_MODIFY("maincpu")
- MCFG_CPU_CLOCK(AMIGA_68EC020_PAL_CLOCK) /* 14.18758 MHz */
+ MCFG_DEVICE_ADD("overlay", ADDRESS_MAP_BANK, 0)
+ MCFG_DEVICE_PROGRAM_MAP(a1000_overlay_map)
+ MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_BIG)
+ MCFG_ADDRESS_MAP_BANK_DATABUS_WIDTH(16)
+ MCFG_ADDRESS_MAP_BANK_ADDRBUS_WIDTH(22)
+ MCFG_ADDRESS_MAP_BANK_STRIDE(0x200000)
+
+ MCFG_DEVICE_ADD("bootrom", ADDRESS_MAP_BANK, 0)
+ MCFG_DEVICE_PROGRAM_MAP(a1000_bootrom_map)
+ MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_BIG)
+ MCFG_ADDRESS_MAP_BANK_DATABUS_WIDTH(16)
+ MCFG_ADDRESS_MAP_BANK_ADDRBUS_WIDTH(19)
+ MCFG_ADDRESS_MAP_BANK_STRIDE(0x40000)
+MACHINE_CONFIG_END
- /* video hardware */
- /* TODO: params */
- MCFG_SCREEN_MODIFY("screen")
-// MCFG_SCREEN_RAW_PARAMS(AMIGA_68EC020_PAL_CLOCK,512*2,(129-8-8)*2,(449+8-1+8)*2,312,44-8,300+8)
- MCFG_SCREEN_RAW_PARAMS(AMIGA_68EC020_PAL_CLOCK,228*4,214,228*4,312,34,312)
+static MACHINE_CONFIG_DERIVED_CLASS( a1000n, a1000, a1000_state )
+ MCFG_DEVICE_MODIFY("maincpu")
+ MCFG_DEVICE_CLOCK(amiga_state::CLK_7M_NTSC)
+ MCFG_DEVICE_MODIFY("screen")
+ MCFG_SCREEN_RAW_PARAMS(amiga_state::CLK_28M_NTSC / 4 * 2, 910, 186, 910, 262, 21, 262)
+ MCFG_DEVICE_MODIFY("amiga")
+ MCFG_DEVICE_CLOCK(amiga_state::CLK_C1_NTSC)
+ MCFG_DEVICE_MODIFY("cia_0")
+ MCFG_DEVICE_CLOCK(amiga_state::CLK_E_NTSC)
+ MCFG_DEVICE_MODIFY("cia_1")
+ MCFG_DEVICE_CLOCK(amiga_state::CLK_E_NTSC)
+ MCFG_DEVICE_MODIFY("fdc")
+ MCFG_DEVICE_CLOCK(amiga_state::CLK_7M_NTSC)
+MACHINE_CONFIG_END
- /* sound hardware */
- MCFG_SOUND_MODIFY("amiga")
- MCFG_SOUND_CLOCK(AMIGA_68EC020_PAL_CLOCK/4) /* 3.546895 MHz */
+static MACHINE_CONFIG_DERIVED_CLASS( a2000, amiga_base, a2000_state )
+ // main cpu
+ MCFG_CPU_ADD("maincpu", M68000, amiga_state::CLK_7M_PAL)
+ MCFG_CPU_PROGRAM_MAP(a2000_mem)
+
+ MCFG_DEVICE_ADD("overlay", ADDRESS_MAP_BANK, 0)
+ MCFG_DEVICE_PROGRAM_MAP(overlay_512kb_map)
+ MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_BIG)
+ MCFG_ADDRESS_MAP_BANK_DATABUS_WIDTH(16)
+ MCFG_ADDRESS_MAP_BANK_ADDRBUS_WIDTH(22)
+ MCFG_ADDRESS_MAP_BANK_STRIDE(0x200000)
+
+ // real-time clock
+ MCFG_DEVICE_ADD("u65", MSM6242, XTAL_32_768kHz)
+
+ // cpu slot
+ MCFG_EXPANSION_SLOT_ADD("maincpu", a2000_expansion_cards, NULL)
+
+ // zorro slots
+ MCFG_ZORRO2_ADD("maincpu")
+ MCFG_ZORRO2_INT2_HANDLER(WRITELINE(a2000_state, zorro2_int2_w))
+ MCFG_ZORRO2_INT6_HANDLER(WRITELINE(a2000_state, zorro2_int6_w))
+ MCFG_ZORRO2_SLOT_ADD("zorro1", zorro2_cards, NULL)
+ MCFG_ZORRO2_SLOT_ADD("zorro2", zorro2_cards, NULL)
+ MCFG_ZORRO2_SLOT_ADD("zorro3", zorro2_cards, NULL)
+ MCFG_ZORRO2_SLOT_ADD("zorro4", zorro2_cards, NULL)
+ MCFG_ZORRO2_SLOT_ADD("zorro5", zorro2_cards, NULL)
+MACHINE_CONFIG_END
- /* cia */
+static MACHINE_CONFIG_DERIVED_CLASS( a2000n, a2000, a2000_state )
+ MCFG_DEVICE_MODIFY("maincpu")
+ MCFG_DEVICE_CLOCK(amiga_state::CLK_7M_NTSC)
+ MCFG_DEVICE_MODIFY("screen")
+ MCFG_SCREEN_RAW_PARAMS(amiga_state::CLK_28M_NTSC / 4 * 2, 910, 186, 910, 262, 21, 262)
+ MCFG_DEVICE_MODIFY("amiga")
+ MCFG_DEVICE_CLOCK(amiga_state::CLK_C1_NTSC)
MCFG_DEVICE_MODIFY("cia_0")
- MCFG_DEVICE_CLOCK(AMIGA_68EC020_PAL_CLOCK/10/2)
+ MCFG_DEVICE_CLOCK(amiga_state::CLK_E_NTSC)
MCFG_DEVICE_MODIFY("cia_1")
- MCFG_DEVICE_CLOCK(AMIGA_68EC020_PAL_CLOCK/10/2)
-
- /* fdc */
+ MCFG_DEVICE_CLOCK(amiga_state::CLK_E_NTSC)
MCFG_DEVICE_MODIFY("fdc")
- MCFG_DEVICE_CLOCK(AMIGA_68EC020_PAL_CLOCK/2)
+ MCFG_DEVICE_CLOCK(amiga_state::CLK_7M_NTSC)
MACHINE_CONFIG_END
+static MACHINE_CONFIG_DERIVED_CLASS( a500, amiga_base, a500_state )
+ // main cpu
+ MCFG_CPU_ADD("maincpu", M68000, amiga_state::CLK_7M_PAL)
+ MCFG_CPU_PROGRAM_MAP(a500_mem)
+
+ MCFG_DEVICE_ADD("overlay", ADDRESS_MAP_BANK, 0)
+ //MCFG_DEVICE_PROGRAM_MAP(overlay_512kb_map)
+ MCFG_DEVICE_PROGRAM_MAP(overlay_1mb_map)
+ MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_BIG)
+ MCFG_ADDRESS_MAP_BANK_DATABUS_WIDTH(16)
+ MCFG_ADDRESS_MAP_BANK_ADDRBUS_WIDTH(22)
+ MCFG_ADDRESS_MAP_BANK_STRIDE(0x200000)
+
+ // cpu slot
+ MCFG_EXPANSION_SLOT_ADD("maincpu", a500_expansion_cards, NULL)
+MACHINE_CONFIG_END
-// 16mhz and 25mhz versions were available
-// 68030 / 68040 options available
-#define A3000_XTAL XTAL_25MHz
-
-/* ToDo: proper A3000 clocks */
+static MACHINE_CONFIG_DERIVED_CLASS( a500n, a500, a500_state )
+ MCFG_DEVICE_MODIFY("maincpu")
+ MCFG_DEVICE_CLOCK(amiga_state::CLK_7M_NTSC)
+ MCFG_DEVICE_MODIFY("screen")
+ MCFG_SCREEN_RAW_PARAMS(amiga_state::CLK_28M_NTSC / 4 * 2, 910, 186, 910, 262, 21, 262)
+ MCFG_DEVICE_MODIFY("amiga")
+ MCFG_DEVICE_CLOCK(amiga_state::CLK_C1_NTSC)
+ MCFG_DEVICE_MODIFY("cia_0")
+ MCFG_DEVICE_CLOCK(amiga_state::CLK_E_NTSC)
+ MCFG_DEVICE_MODIFY("cia_1")
+ MCFG_DEVICE_CLOCK(amiga_state::CLK_E_NTSC)
+ MCFG_DEVICE_MODIFY("fdc")
+ MCFG_DEVICE_CLOCK(amiga_state::CLK_7M_NTSC)
+MACHINE_CONFIG_END
-static MACHINE_CONFIG_START( a3000n, amiga_state )
- /* basic machine hardware */
- MCFG_CPU_ADD("maincpu", M68030, A3000_XTAL)
- MCFG_CPU_PROGRAM_MAP(amiga_mem32)
+static MACHINE_CONFIG_DERIVED_CLASS( cdtv, amiga_base, cdtv_state )
+ // main cpu
+ MCFG_CPU_ADD("maincpu", M68000, amiga_state::CLK_7M_PAL)
+ MCFG_CPU_PROGRAM_MAP(cdtv_mem)
- MCFG_CPU_ADD("keyboard", M6502, XTAL_1MHz) /* 1 MHz? */
- MCFG_CPU_PROGRAM_MAP(keyboard_mem)
+ // remote control input converter
+ MCFG_CPU_ADD("u75", M6502, XTAL_3MHz)
+ MCFG_CPU_PROGRAM_MAP(cdtv_rc_mem)
MCFG_DEVICE_DISABLE()
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(59.997)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
+ // lcd controller
+#if 0
+ MCFG_CPU_ADD("u62", LC6554, XTAL_4MHz)
+ MCFG_CPU_PROGRAM_MAP(lcd_mem)
+#endif
- MCFG_MACHINE_START_OVERRIDE(amiga_state, amiga )
- MCFG_MACHINE_RESET_OVERRIDE(amiga_state, amiga )
+ MCFG_DEVICE_ADD("overlay", ADDRESS_MAP_BANK, 0)
+ MCFG_DEVICE_PROGRAM_MAP(overlay_1mb_map)
+ MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_BIG)
+ MCFG_ADDRESS_MAP_BANK_DATABUS_WIDTH(16)
+ MCFG_ADDRESS_MAP_BANK_ADDRBUS_WIDTH(22)
+ MCFG_ADDRESS_MAP_BANK_STRIDE(0x200000)
+
+ // standard sram
+ MCFG_NVRAM_ADD_0FILL("sram")
+
+ // 256kb memory card
+ MCFG_NVRAM_ADD_0FILL("memcard")
+
+ // real-time clock
+ MCFG_DEVICE_ADD("u61", MSM6242, XTAL_32_768kHz)
+
+ // cd-rom controller
+ MCFG_DMAC_ADD("u36", amiga_state::CLK_7M_PAL)
+ MCFG_DMAC_SCSI_READ_HANDLER(READ8(cdtv_state, dmac_scsi_data_read))
+ MCFG_DMAC_SCSI_WRITE_HANDLER(WRITE8(cdtv_state, dmac_scsi_data_write))
+ MCFG_DMAC_IO_READ_HANDLER(READ8(cdtv_state, dmac_io_read))
+ MCFG_DMAC_IO_WRITE_HANDLER(WRITE8(cdtv_state, dmac_io_write))
+ MCFG_DMAC_INT_HANDLER(WRITELINE(cdtv_state, dmac_int_w))
+
+ MCFG_DEVICE_ADD("u32", TPI6525, 0)
+ MCFG_TPI6525_OUT_IRQ_CB(WRITELINE(cdtv_state, tpi_int_w))
+ MCFG_TPI6525_OUT_PB_CB(WRITE8(cdtv_state, tpi_port_b_write))
+
+ // cd-rom
+ MCFG_CR511B_ADD("cdrom")
+ MCFG_CR511B_SCOR_HANDLER(DEVWRITELINE("u32", tpi6525_device, i1_w)) MCFG_DEVCB_INVERT
+ MCFG_CR511B_STCH_HANDLER(DEVWRITELINE("u32", tpi6525_device, i2_w)) MCFG_DEVCB_INVERT
+ MCFG_CR511B_STEN_HANDLER(DEVWRITELINE("u32", tpi6525_device, i3_w))
+ MCFG_CR511B_XAEN_HANDLER(DEVWRITELINE("u32", tpi6525_device, pb2_w))
+ MCFG_CR511B_DRQ_HANDLER(DEVWRITELINE("u36", dmac_device, xdreq_w))
+ MCFG_CR511B_DTEN_HANDLER(DEVWRITELINE("u36", dmac_device, xdreq_w))
- MCFG_DEFAULT_LAYOUT(layout_amiga)
+ MCFG_SOFTWARE_LIST_ADD("cd_list", "cdtv")
+MACHINE_CONFIG_END
- /* video hardware */
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK)
- MCFG_SCREEN_RAW_PARAMS(A3000_XTAL,228*4,214,228*4,262,34,262)
-// MCFG_SCREEN_SIZE(228*4, 262)
-// MCFG_SCREEN_VISIBLE_AREA(214, (228*4)-1, 34, 262-1)
- MCFG_SCREEN_UPDATE_DRIVER(amiga_state, screen_update_amiga)
- MCFG_SCREEN_PALETTE("palette")
+static MACHINE_CONFIG_DERIVED_CLASS( cdtvn, cdtv, cdtv_state )
+ MCFG_DEVICE_MODIFY("maincpu")
+ MCFG_DEVICE_CLOCK(amiga_state::CLK_7M_NTSC)
+ MCFG_DEVICE_MODIFY("screen")
+ MCFG_SCREEN_RAW_PARAMS(amiga_state::CLK_28M_NTSC / 4 * 2, 910, 186, 910, 262, 21, 262)
+ MCFG_DEVICE_MODIFY("amiga")
+ MCFG_DEVICE_CLOCK(amiga_state::CLK_C1_NTSC)
+ MCFG_DEVICE_MODIFY("cia_0")
+ MCFG_DEVICE_CLOCK(amiga_state::CLK_E_NTSC)
+ MCFG_DEVICE_MODIFY("cia_1")
+ MCFG_DEVICE_CLOCK(amiga_state::CLK_E_NTSC)
+ MCFG_DEVICE_MODIFY("u36")
+ MCFG_DEVICE_CLOCK(amiga_state::CLK_7M_NTSC)
+ MCFG_DEVICE_MODIFY("fdc")
+ MCFG_DEVICE_CLOCK(amiga_state::CLK_7M_NTSC)
+MACHINE_CONFIG_END
- MCFG_PALETTE_ADD("palette", 4096)
- MCFG_PALETTE_INIT_OWNER(amiga_state, amiga )
+static MACHINE_CONFIG_DERIVED_CLASS( a3000, amiga_base, a3000_state )
+ // main cpu
+ MCFG_CPU_ADD("maincpu", M68030, XTAL_32MHz / 2)
+ MCFG_CPU_PROGRAM_MAP(a3000_mem)
- MCFG_VIDEO_START_OVERRIDE(amiga_state,amiga)
+ MCFG_DEVICE_ADD("overlay", ADDRESS_MAP_BANK, 0)
+ MCFG_DEVICE_PROGRAM_MAP(overlay_1mb_map32)
+ MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_BIG)
+ MCFG_ADDRESS_MAP_BANK_DATABUS_WIDTH(32)
+ MCFG_ADDRESS_MAP_BANK_ADDRBUS_WIDTH(22)
+ MCFG_ADDRESS_MAP_BANK_STRIDE(0x200000)
- /* devices */
- MCFG_DEVICE_ADD("rtc", MSM6242, XTAL_32_768kHz)
- MCFG_CENTRONICS_ADD("centronics", centronics_printers, "printer")
- MCFG_CENTRONICS_ACK_HANDLER(WRITELINE(amiga_state, write_centronics_ack))
- MCFG_CENTRONICS_BUSY_HANDLER(WRITELINE(amiga_state, write_centronics_busy))
- MCFG_CENTRONICS_PERROR_HANDLER(WRITELINE(amiga_state, write_centronics_perror))
- MCFG_CENTRONICS_SELECT_HANDLER(WRITELINE(amiga_state, write_centronics_select))
+ // real-time clock
+ MCFG_DEVICE_ADD("u190", RP5C01, XTAL_32_768kHz)
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics")
+ // todo: zorro3 slots, super dmac, scsi
+MACHINE_CONFIG_END
- /* sound hardware */
- MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
+static MACHINE_CONFIG_DERIVED_CLASS( a3000n, a3000, a3000_state )
+ MCFG_DEVICE_MODIFY("screen")
+ MCFG_SCREEN_RAW_PARAMS(amiga_state::CLK_28M_NTSC / 4 * 2, 910, 186, 910, 262, 21, 262)
+ MCFG_DEVICE_MODIFY("cia_0")
+ MCFG_DEVICE_CLOCK(amiga_state::CLK_E_NTSC)
+ MCFG_DEVICE_MODIFY("cia_1")
+ MCFG_DEVICE_CLOCK(amiga_state::CLK_E_NTSC)
+ MCFG_DEVICE_MODIFY("fdc")
+ MCFG_DEVICE_CLOCK(amiga_state::CLK_7M_NTSC)
+MACHINE_CONFIG_END
- MCFG_SOUND_ADD("amiga", AMIGA, 3579545)
- MCFG_SOUND_ROUTE(0, "lspeaker", 0.50)
- MCFG_SOUND_ROUTE(1, "rspeaker", 0.50)
- MCFG_SOUND_ROUTE(2, "rspeaker", 0.50)
- MCFG_SOUND_ROUTE(3, "lspeaker", 0.50)
+static MACHINE_CONFIG_DERIVED_CLASS( a500p, amiga_base, a500p_state )
+ // main cpu
+ MCFG_CPU_ADD("maincpu", M68000, amiga_state::CLK_7M_PAL)
+ MCFG_CPU_PROGRAM_MAP(a500p_mem)
- /* cia */
- MCFG_DEVICE_ADD("cia_0", LEGACY_MOS8520, AMIGA_68000_NTSC_CLOCK / 10)
- MCFG_MOS6526_TOD(60) // jumper selectable TICK or VSYNC
- MCFG_MOS6526_IRQ_CALLBACK(WRITELINE(amiga_state, amiga_cia_0_irq))
- MCFG_MOS6526_PC_CALLBACK(DEVWRITELINE("centronics", centronics_device, write_strobe))
- MCFG_MOS6526_PA_INPUT_CALLBACK(READ8(amiga_state, amiga_cia_0_portA_r))
- MCFG_MOS6526_PA_OUTPUT_CALLBACK(WRITE8(amiga_state, amiga_cia_0_portA_w))
- MCFG_MOS6526_PB_OUTPUT_CALLBACK(DEVWRITE8("cent_data_out", output_latch_device, write))
- MCFG_DEVICE_ADD("cia_1", LEGACY_MOS8520, AMIGA_68000_NTSC_CLOCK / 10)
- MCFG_MOS6526_IRQ_CALLBACK(WRITELINE(amiga_state, amiga_cia_1_irq))
- MCFG_MOS6526_PA_INPUT_CALLBACK(READ8(amiga_state, amiga_cia_1_porta_r))
- MCFG_MOS6526_PB_OUTPUT_CALLBACK(DEVWRITE8("fdc", amiga_fdc, ciaaprb_w))
+ MCFG_DEVICE_ADD("overlay", ADDRESS_MAP_BANK, 0)
+ MCFG_DEVICE_PROGRAM_MAP(overlay_1mb_map)
+ MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_BIG)
+ MCFG_ADDRESS_MAP_BANK_DATABUS_WIDTH(16)
+ MCFG_ADDRESS_MAP_BANK_ADDRBUS_WIDTH(22)
+ MCFG_ADDRESS_MAP_BANK_STRIDE(0x200000)
- /* fdc */
- MCFG_DEVICE_ADD("fdc", AMIGA_FDC, AMIGA_68000_NTSC_CLOCK)
- MCFG_AMIGA_FDC_INDEX_CALLBACK(DEVWRITELINE("cia_1", legacy_mos6526_device, flag_w))
- MCFG_FLOPPY_DRIVE_ADD("fdc:0", amiga_floppies, "35dd", amiga_fdc::floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("fdc:1", amiga_floppies, 0, amiga_fdc::floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("fdc:2", amiga_floppies, 0, amiga_fdc::floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("fdc:3", amiga_floppies, 0, amiga_fdc::floppy_formats)
+ // real-time clock
+ MCFG_DEVICE_ADD("u9", MSM6242, XTAL_32_768kHz)
- MCFG_DEVICE_ADD("kbd", AMIGAKBD, 0)
- MCFG_AMIGA_KEYBOARD_KCLK_CALLBACK(DEVWRITELINE("cia_0", legacy_mos6526_device, cnt_w))
- MCFG_AMIGA_KEYBOARD_KDAT_CALLBACK(DEVWRITELINE("cia_0", legacy_mos6526_device, sp_w))
+ // cpu slot
+ MCFG_EXPANSION_SLOT_ADD("maincpu", a500_expansion_cards, NULL)
+MACHINE_CONFIG_END
- MCFG_SOFTWARE_LIST_ADD("flop_misc","amiga_flop")
- MCFG_SOFTWARE_LIST_ADD("flop_ocs","amigaocs_flop")
- MCFG_SOFTWARE_LIST_ADD("flop_ecs","amigaecs_flop")
- MCFG_SOFTWARE_LIST_ADD("flop_list","amiga3000_flop")
+static MACHINE_CONFIG_DERIVED_CLASS( a500pn, a500p, a500p_state )
+ MCFG_DEVICE_MODIFY("maincpu")
+ MCFG_DEVICE_CLOCK(amiga_state::CLK_7M_NTSC)
+ MCFG_DEVICE_MODIFY("screen")
+ MCFG_SCREEN_RAW_PARAMS(amiga_state::CLK_28M_NTSC / 4 * 2, 910, 186, 910, 262, 21, 262)
+ MCFG_DEVICE_MODIFY("amiga")
+ MCFG_DEVICE_CLOCK(amiga_state::CLK_C1_NTSC)
+ MCFG_DEVICE_MODIFY("cia_0")
+ MCFG_DEVICE_CLOCK(amiga_state::CLK_E_NTSC)
+ MCFG_DEVICE_MODIFY("cia_1")
+ MCFG_DEVICE_CLOCK(amiga_state::CLK_E_NTSC)
+ MCFG_DEVICE_MODIFY("fdc")
+ MCFG_DEVICE_CLOCK(amiga_state::CLK_7M_NTSC)
MACHINE_CONFIG_END
-static MACHINE_CONFIG_DERIVED( a3000, a3000n )
+static MACHINE_CONFIG_DERIVED_CLASS( a600, amiga_base, a600_state )
+ // main cpu
+ MCFG_CPU_ADD("maincpu", M68000, amiga_state::CLK_7M_PAL)
+ MCFG_CPU_PROGRAM_MAP(a600_mem)
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_RAW_PARAMS(A3000_XTAL,228*4,214,228*4,312,34,312)
-// MCFG_SCREEN_REFRESH_RATE(50)
-// MCFG_SCREEN_SIZE(228*4, 312)
-// MCFG_SCREEN_VISIBLE_AREA(214, (228*4)-1, 34, 312-1)
+ MCFG_DEVICE_ADD("overlay", ADDRESS_MAP_BANK, 0)
+ MCFG_DEVICE_PROGRAM_MAP(overlay_1mb_map)
+ MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_BIG)
+ MCFG_ADDRESS_MAP_BANK_DATABUS_WIDTH(16)
+ MCFG_ADDRESS_MAP_BANK_ADDRBUS_WIDTH(22)
+ MCFG_ADDRESS_MAP_BANK_STRIDE(0x200000)
+
+ // todo: ide, pcmcia
+MACHINE_CONFIG_END
- /* cia */
+static MACHINE_CONFIG_DERIVED_CLASS( a600n, a600, a600_state )
+ MCFG_DEVICE_MODIFY("maincpu")
+ MCFG_DEVICE_CLOCK(amiga_state::CLK_7M_NTSC)
+ MCFG_DEVICE_MODIFY("screen")
+ MCFG_SCREEN_RAW_PARAMS(amiga_state::CLK_28M_NTSC / 4 * 2, 910, 186, 910, 262, 21, 262)
+ MCFG_DEVICE_MODIFY("amiga")
+ MCFG_DEVICE_CLOCK(amiga_state::CLK_C1_NTSC)
MCFG_DEVICE_MODIFY("cia_0")
- MCFG_DEVICE_CLOCK(AMIGA_68000_PAL_CLOCK / 10)
- MCFG_MOS6526_TOD(50) // jumper selectable TICK or VSYNC
+ MCFG_DEVICE_CLOCK(amiga_state::CLK_E_NTSC)
MCFG_DEVICE_MODIFY("cia_1")
- MCFG_DEVICE_CLOCK(AMIGA_68000_PAL_CLOCK / 10)
-
- /* fdc */
+ MCFG_DEVICE_CLOCK(amiga_state::CLK_E_NTSC)
MCFG_DEVICE_MODIFY("fdc")
- MCFG_DEVICE_CLOCK(AMIGA_68000_PAL_CLOCK)
+ MCFG_DEVICE_CLOCK(amiga_state::CLK_7M_NTSC)
MACHINE_CONFIG_END
-/***************************************************************************
+static MACHINE_CONFIG_DERIVED_CLASS( a1200, amiga_base, a1200_state )
+ // main cpu
+ MCFG_CPU_ADD("maincpu", M68EC020, amiga_state::CLK_28M_PAL / 2)
+ MCFG_CPU_PROGRAM_MAP(a1200_mem)
- Amiga specific stuff
+ MCFG_DEVICE_ADD("overlay", ADDRESS_MAP_BANK, 0)
+ MCFG_DEVICE_PROGRAM_MAP(overlay_2mb_map32)
+ MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_BIG)
+ MCFG_ADDRESS_MAP_BANK_DATABUS_WIDTH(32)
+ MCFG_ADDRESS_MAP_BANK_ADDRBUS_WIDTH(22)
+ MCFG_ADDRESS_MAP_BANK_STRIDE(0x200000)
-***************************************************************************/
+ MCFG_DEVICE_MODIFY("screen")
+ MCFG_SCREEN_UPDATE_DRIVER(amiga_state, screen_update_amiga_aga)
+ MCFG_DEVICE_REMOVE("palette")
-READ8_MEMBER( amiga_state::amiga_cia_0_portA_r )
-{
- UINT8 ret = space.machine().root_device().ioport("CIA0PORTA")->read() & 0xc0; /* Gameport 1 and 0 buttons */
- ret |= space.machine().device<amiga_fdc>("fdc")->ciaapra_r();
- return ret;
-}
+ MCFG_VIDEO_START_OVERRIDE(amiga_state, amiga_aga)
+ // todo: ide, pcmcia
+MACHINE_CONFIG_END
+static MACHINE_CONFIG_DERIVED_CLASS( a1200n, a1200, a1200_state )
+ MCFG_DEVICE_MODIFY("maincpu")
+ MCFG_DEVICE_CLOCK(amiga_state::CLK_28M_NTSC / 2)
+ MCFG_DEVICE_MODIFY("screen")
+ MCFG_SCREEN_RAW_PARAMS(amiga_state::CLK_28M_NTSC / 4 * 2, 910, 186, 910, 262, 21, 262)
+ MCFG_DEVICE_MODIFY("amiga")
+ MCFG_DEVICE_CLOCK(amiga_state::CLK_C1_NTSC)
+ MCFG_DEVICE_MODIFY("cia_0")
+ MCFG_DEVICE_CLOCK(amiga_state::CLK_E_NTSC)
+ MCFG_DEVICE_MODIFY("cia_1")
+ MCFG_DEVICE_CLOCK(amiga_state::CLK_E_NTSC)
+ MCFG_DEVICE_MODIFY("fdc")
+ MCFG_DEVICE_CLOCK(amiga_state::CLK_7M_NTSC)
+MACHINE_CONFIG_END
-WRITE8_MEMBER( amiga_state::amiga_cia_0_portA_w )
-{
- /* switch banks as appropriate */
- m_bank1->set_entry(data & 1);
+static MACHINE_CONFIG_DERIVED_CLASS( a4000, amiga_base, a4000_state )
+ // main cpu
+ MCFG_CPU_ADD("maincpu", M68040, XTAL_50MHz / 2)
+ MCFG_CPU_PROGRAM_MAP(a4000_mem)
- /* swap the write handlers between ROM and bank 1 based on the bit */
- if ((data & 1) == 0) {
- UINT32 mirror_mask = m_chip_ram.bytes();
+ MCFG_DEVICE_ADD("overlay", ADDRESS_MAP_BANK, 0)
+ MCFG_DEVICE_PROGRAM_MAP(overlay_2mb_map32)
+ MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_BIG)
+ MCFG_ADDRESS_MAP_BANK_DATABUS_WIDTH(32)
+ MCFG_ADDRESS_MAP_BANK_ADDRBUS_WIDTH(22)
+ MCFG_ADDRESS_MAP_BANK_STRIDE(0x200000)
- while( (mirror_mask<<1) < 0x100000 ) {
- mirror_mask |= ( mirror_mask << 1 );
- }
+ MCFG_DEVICE_MODIFY("screen")
+ MCFG_SCREEN_UPDATE_DRIVER(amiga_state, screen_update_amiga_aga)
- /* overlay disabled, map RAM on 0x000000 */
- m_maincpu_program_space->install_write_bank(0x000000, m_chip_ram.bytes() - 1, 0, mirror_mask, "bank1");
+ MCFG_DEVICE_REMOVE("palette")
- /* if there is a cart region, check for cart overlay */
- if (space.machine().root_device().memregion("user2")->base() != NULL)
- amiga_cart_check_overlay(space.machine());
- }
- else
- /* overlay enabled, map Amiga system ROM on 0x000000 */
- m_maincpu_program_space->unmap_write(0x000000, m_chip_ram.bytes() - 1);
+ MCFG_VIDEO_START_OVERRIDE(amiga_state, amiga_aga)
- set_led_status( space.machine(), 0, ( data & 2 ) ? 0 : 1 ); /* bit 2 = Power Led on Amiga */
- output_set_value("power_led", ( data & 2 ) ? 0 : 1);
-}
+ // real-time clock
+ MCFG_DEVICE_ADD("rtc", RP5C01, XTAL_32_768kHz)
-static UINT16 amiga_read_joy0dat(running_machine &machine)
-{
- if ( machine.root_device().ioport("input")->read() & 0x20 ) {
- /* Joystick */
- return machine.root_device().ioport("JOY0DAT")->read_safe(0xffff);
- } else {
- /* Mouse */
- int input;
- input = ( machine.root_device().ioport("P0MOUSEX")->read() & 0xff );
- input |= ( machine.root_device().ioport("P0MOUSEY")->read() & 0xff ) << 8;
- return input;
- }
-}
+ // todo: ide, zorro3
+MACHINE_CONFIG_END
-static UINT16 amiga_read_joy1dat(running_machine &machine)
-{
- if ( machine.root_device().ioport("input")->read() & 0x10 ) {
- /* Joystick */
- return machine.root_device().ioport("JOY1DAT")->read_safe(0xffff);
- } else {
- /* Mouse */
- int input;
- input = ( machine.root_device().ioport("P1MOUSEX")->read() & 0xff );
- input |= ( machine.root_device().ioport("P1MOUSEY")->read() & 0xff ) << 8;
- return input;
- }
-}
+static MACHINE_CONFIG_DERIVED_CLASS( a4000n, a4000, a4000_state )
+ MCFG_DEVICE_MODIFY("screen")
+ MCFG_SCREEN_RAW_PARAMS(amiga_state::CLK_28M_NTSC / 4 * 2, 910, 186, 910, 262, 21, 262)
+ MCFG_DEVICE_MODIFY("amiga")
+ MCFG_DEVICE_CLOCK(amiga_state::CLK_C1_NTSC)
+ MCFG_DEVICE_MODIFY("cia_0")
+ MCFG_DEVICE_CLOCK(amiga_state::CLK_E_NTSC)
+ MCFG_DEVICE_MODIFY("cia_1")
+ MCFG_DEVICE_CLOCK(amiga_state::CLK_E_NTSC)
+ MCFG_DEVICE_MODIFY("fdc")
+ MCFG_DEVICE_CLOCK(amiga_state::CLK_7M_NTSC)
+MACHINE_CONFIG_END
-static void amiga_reset(running_machine &machine)
-{
- amiga_state *state = machine.driver_data<amiga_state>();
- if (machine.root_device().ioport("hardware")->read() & 0x08)
- {
- /* Install RTC */
- state->m_maincpu_program_space->install_readwrite_handler(0xdc0000, 0xdc003f, read16_delegate(FUNC(amiga_state::amiga_clock_r), state), write16_delegate(FUNC(amiga_state::amiga_clock_w), state));
- }
- else
- {
- /* No RTC support */
- state->m_maincpu_program_space->unmap_readwrite(0xdc0000, 0xdc003f);
- }
-}
+static MACHINE_CONFIG_DERIVED_CLASS( a400030, a4000, a4000_state )
+ // main cpu
+ MCFG_DEVICE_REMOVE("maincpu")
+ MCFG_CPU_ADD("maincpu", M68EC030, XTAL_50MHz / 2)
+ MCFG_CPU_PROGRAM_MAP(a400030_mem)
-DRIVER_INIT_MEMBER(amiga_state,amiga)
-{
- static const amiga_machine_interface amiga_intf =
- {
- ANGUS_CHIP_RAM_MASK,
- amiga_read_joy0dat, amiga_read_joy1dat, /* joy0dat_r & joy1dat_r */
- NULL, /* potgo_w */
- NULL, /* serdat_w */
- NULL, /* scanline0_callback */
- amiga_reset, /* reset_callback */
- amiga_cart_nmi, /* nmi_callback */
- 0 /* flags */
- };
+ // todo: ide
+MACHINE_CONFIG_END
- amiga_machine_config(machine(), &amiga_intf);
+static MACHINE_CONFIG_DERIVED_CLASS( a400030n, a400030, a4000_state )
+ MCFG_DEVICE_MODIFY("screen")
+ MCFG_SCREEN_RAW_PARAMS(amiga_state::CLK_28M_NTSC / 4 * 2, 910, 186, 910, 262, 21, 262)
+ MCFG_DEVICE_MODIFY("amiga")
+ MCFG_DEVICE_CLOCK(amiga_state::CLK_C1_NTSC)
+ MCFG_DEVICE_MODIFY("cia_0")
+ MCFG_DEVICE_CLOCK(amiga_state::CLK_E_NTSC)
+ MCFG_DEVICE_MODIFY("cia_1")
+ MCFG_DEVICE_CLOCK(amiga_state::CLK_E_NTSC)
+ MCFG_DEVICE_MODIFY("fdc")
+ MCFG_DEVICE_CLOCK(amiga_state::CLK_7M_NTSC)
+MACHINE_CONFIG_END
- /* set up memory */
- m_bank1->configure_entry(0, m_chip_ram);
- m_bank1->configure_entry(1, memregion("user1")->base());
+static MACHINE_CONFIG_DERIVED_CLASS( cd32, amiga_base, cd32_state )
+ // main cpu
+ MCFG_CPU_ADD("maincpu", M68EC020, amiga_state::CLK_28M_PAL / 2)
+ MCFG_CPU_PROGRAM_MAP(cd32_mem)
- /* initialize cartridge (if present) */
- amiga_cart_init(machine());
-}
+ MCFG_DEVICE_ADD("overlay", ADDRESS_MAP_BANK, 0)
+ MCFG_DEVICE_PROGRAM_MAP(overlay_2mb_map32)
+ MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_BIG)
+ MCFG_ADDRESS_MAP_BANK_DATABUS_WIDTH(32)
+ MCFG_ADDRESS_MAP_BANK_ADDRBUS_WIDTH(22)
+ MCFG_ADDRESS_MAP_BANK_STRIDE(0x200000)
+ MCFG_I2CMEM_ADD("i2cmem")
+ MCFG_I2CMEM_PAGE_SIZE(16)
+ MCFG_I2CMEM_DATA_SIZE(1024)
+ MCFG_AKIKO_ADD("akiko", "maincpu")
+ MCFG_AKIKO_SCL_HANDLER(DEVWRITELINE("i2cmem", i2cmem_device, write_scl))
+ MCFG_AKIKO_SDA_READ_HANDLER(DEVREADLINE("i2cmem", i2cmem_device, read_sda))
+ MCFG_AKIKO_SDA_WRITE_HANDLER(DEVWRITELINE("i2cmem", i2cmem_device, write_sda))
-DRIVER_INIT_MEMBER(amiga_state,cdtv)
-{
- static const amiga_machine_interface amiga_intf =
- {
- ECS_CHIP_RAM_MASK,
- amiga_read_joy0dat, amiga_read_joy1dat, /* joy0dat_r & joy1dat_r */
- NULL, /* potgo_w */
- NULL, /* serdat_w */
- NULL, /* scanline0_callback */
- NULL, /* reset_callback */
- NULL, /* nmi_callback */
- 0 /* flags */
- };
+ MCFG_DEVICE_MODIFY("screen")
+ MCFG_SCREEN_UPDATE_DRIVER(amiga_state, screen_update_amiga_aga)
- amiga_machine_config(machine(), &amiga_intf);
+ MCFG_DEVICE_REMOVE("palette")
- /* set up memory */
- m_bank1->configure_entry(0, m_chip_ram);
- m_bank1->configure_entry(1, memregion("user1")->base());
-}
+ MCFG_VIDEO_START_OVERRIDE(amiga_state, amiga_aga)
-DRIVER_INIT_MEMBER(a1200_state,a1200)
-{
- static const amiga_machine_interface cd32_intf =
- {
- AGA_CHIP_RAM_MASK,
- amiga_read_joy0dat, amiga_read_joy1dat, /* joy0dat_r & joy1dat_r */
- NULL, /* potgo_w */
- NULL, /* serdat_w */
- NULL, /* scanline0_callback */
- NULL, /* reset_callback */
- NULL, /* nmi_callback */
- FLAGS_AGA_CHIPSET | FLAGS_IS_32BIT /* flags */
- };
+ MCFG_SOUND_ADD("cdda", CDDA, 0)
+ MCFG_SOUND_ROUTE(0, "lspeaker", 0.50)
+ MCFG_SOUND_ROUTE(1, "rspeaker", 0.50)
- /* configure our Amiga setup */
- amiga_machine_config(machine(), &cd32_intf);
+ MCFG_DEVICE_MODIFY("cia_0")
+ MCFG_MOS6526_PA_OUTPUT_CALLBACK(WRITE8(cd32_state, akiko_cia_0_port_a_write))
- /* set up memory */
- m_bank1->configure_entry(0, m_chip_ram);
- m_bank1->configure_entry(1, memregion("user1")->base());
-}
+ MCFG_CDROM_ADD("cdrom")
+ MCFG_CDROM_INTERFACE("cd32_cdrom")
-DRIVER_INIT_MEMBER(amiga_state,a3000)
-{
- static const amiga_machine_interface a3000_intf =
- {
- ECS_CHIP_RAM_MASK,
- amiga_read_joy0dat, amiga_read_joy1dat, /* joy0dat_r & joy1dat_r */
- NULL, /* potgo_w */
- NULL, /* serdat_w */
- NULL, /* scanline0_callback */
- NULL, /* reset_callback */
- NULL, /* nmi_callback */
- FLAGS_IS_32BIT, /* flags */
- };
+ MCFG_DEVICE_REMOVE("kbd")
+MACHINE_CONFIG_END
- /* configure our Amiga setup */
- amiga_machine_config(machine(), &a3000_intf);
+static MACHINE_CONFIG_DERIVED_CLASS( cd32n, cd32, cd32_state )
+ MCFG_DEVICE_MODIFY("maincpu")
+ MCFG_DEVICE_CLOCK(amiga_state::CLK_28M_NTSC / 2)
+ MCFG_DEVICE_MODIFY("screen")
+ MCFG_SCREEN_RAW_PARAMS(amiga_state::CLK_28M_NTSC / 4 * 2, 910, 186, 910, 262, 21, 262)
+ MCFG_DEVICE_MODIFY("amiga")
+ MCFG_DEVICE_CLOCK(amiga_state::CLK_C1_NTSC)
+ MCFG_DEVICE_MODIFY("cia_0")
+ MCFG_DEVICE_CLOCK(amiga_state::CLK_E_NTSC)
+ MCFG_DEVICE_MODIFY("cia_1")
+ MCFG_DEVICE_CLOCK(amiga_state::CLK_E_NTSC)
+ MCFG_DEVICE_MODIFY("fdc")
+ MCFG_DEVICE_CLOCK(amiga_state::CLK_7M_NTSC)
+MACHINE_CONFIG_END
- /* set up memory */
- m_bank1->configure_entry(0, m_chip_ram);
- m_bank1->configure_entry(1, memregion("user1")->base());
-}
+static MACHINE_CONFIG_DERIVED_CLASS( a4000t, a4000, a4000_state )
+ // main cpu
+ MCFG_DEVICE_REMOVE("maincpu")
+ MCFG_CPU_ADD("maincpu", M68040, XTAL_50MHz / 2)
+ MCFG_CPU_PROGRAM_MAP(a4000t_mem)
+ // todo: ide, zorro3, scsi, super dmac
+MACHINE_CONFIG_END
+static MACHINE_CONFIG_DERIVED_CLASS( a4000tn, a4000, a4000_state )
+ MCFG_DEVICE_MODIFY("screen")
+ MCFG_SCREEN_RAW_PARAMS(amiga_state::CLK_28M_NTSC / 4 * 2, 910, 186, 910, 262, 21, 262)
+ MCFG_DEVICE_MODIFY("amiga")
+ MCFG_DEVICE_CLOCK(amiga_state::CLK_C1_NTSC)
+ MCFG_DEVICE_MODIFY("cia_0")
+ MCFG_DEVICE_CLOCK(amiga_state::CLK_E_NTSC)
+ MCFG_DEVICE_MODIFY("cia_1")
+ MCFG_DEVICE_CLOCK(amiga_state::CLK_E_NTSC)
+ MCFG_DEVICE_MODIFY("fdc")
+ MCFG_DEVICE_CLOCK(amiga_state::CLK_7M_NTSC)
+MACHINE_CONFIG_END
-/***************************************************************************
- ROM DEFINITIONS
-***************************************************************************/
-ROM_START( a1000 )
- ROM_REGION16_BE(0x080000, "user1", 0)
- ROM_LOAD16_BYTE("252179-01.u5n", 0x000000, 0x001000, CRC(42553bc4) SHA1(8855a97f7a44e3f62d1c88d938fee1f4c606af5b))
- ROM_LOAD16_BYTE("252180-01.u5p", 0x000001, 0x001000, CRC(8e5b9a37) SHA1(d10f1564b99f5ffe108fa042362e877f569de2c3))
+//**************************************************************************
+// ROM DEFINITIONS
+//**************************************************************************
- /* Kickstart needed to be loaded from floppy */
+// Amiga 1000
+//
+// Shipped with a small bootrom to load kickstart from disk because the
+// Kickstart wasn't finished in time.
- /* keyboard controller, mos 6500/1 mcu */
- ROM_REGION(0x800, "keyboard", 0)
- ROM_LOAD("328191-01.bin", 0x000, 0x800, NO_DUMP)
+ROM_START( a1000 )
+ ROM_REGION16_BE(0x2000, "bootrom", 0)
+ ROM_LOAD16_BYTE("252179-01.u5n", 0x0000, 0x1000, CRC(42553bc4) SHA1(8855a97f7a44e3f62d1c88d938fee1f4c606af5b))
+ ROM_LOAD16_BYTE("252180-01.u5p", 0x0001, 0x1000, CRC(8e5b9a37) SHA1(d10f1564b99f5ffe108fa042362e877f569de2c3))
+
+ // PALs, all of type PAL16L8
+ ROM_REGION(0x104, "dpalen", 0)
+ ROM_LOAD("252128-01.u4t", 0, 0x104, CRC(28209ff2) SHA1(20c03b6b8e7254231f4b3014dc2c4d9274d469d2))
+ ROM_REGION(0x104, "dpalcas", 0)
+ ROM_LOAD("252128-02.u6p", 0, 0x104, CRC(b928efd2) SHA1(430794a544d9160e1b786e97e0dec5f25502a00a))
+ ROM_REGION(0x104, "daugen", 0)
+ ROM_LOAD("252128-03.u4s", 0, 0x104, CRC(87747964) SHA1(00d72ec707c582363525fde56176973c7327b1d7))
+ ROM_REGION(0x104, "daugcas", 0)
+ ROM_LOAD("252128-04.u6n", 0, 0x104, CRC(f903adb4) SHA1(4c8fb696fd1aaf9bb8c9efddeac24bb36f119c5f))
ROM_END
-#define rom_a1000n rom_a1000
+#define rom_a1000n rom_a1000
+// Amiga 2000 and Amiga 500
+//
+// Early models shipped with Kickstart 1.2, later versions with Kickstart 1.3.
+// Kickstart 2.04 and 3.1 upgrade available. The Kickstart 2.04 upgrade was also
+// available as a special version that included a jumper wire, which was needed
+// for some early motherboard revisions (P/N: 363968-01).
-
-ROM_START( a500 )
- ROM_REGION16_BE(0x080000, "user1", 0)
+ROM_START( a2000 )
+ ROM_REGION16_BE(0x80000, "kickstart", 0)
ROM_DEFAULT_BIOS("kick13")
-
- /* early models had Kickstart 1.2 */
ROM_SYSTEM_BIOS(0, "kick12", "Kickstart 1.2 (33.180)")
- ROMX_LOAD("315093-01.u6", 0x000000, 0x040000, CRC(a6ce1636) SHA1(11f9e62cf299f72184835b7b2a70a16333fc0d88), ROM_GROUPWORD | ROM_BIOS(1))
- /* most models had Kickstart 1.3 */
+ ROMX_LOAD("315093-01.u2", 0x00000, 0x40000, CRC(a6ce1636) SHA1(11f9e62cf299f72184835b7b2a70a16333fc0d88), ROM_GROUPWORD | ROM_BIOS(1))
+ ROM_COPY("kickstart", 0x00000, 0x40000, 0x40000)
ROM_SYSTEM_BIOS(1, "kick13", "Kickstart 1.3 (34.5)")
- ROMX_LOAD("315093-02.u6", 0x000000, 0x040000, CRC(c4f0f55f) SHA1(891e9a547772fe0c6c19b610baf8bc4ea7fcb785), ROM_GROUPWORD | ROM_BIOS(2))
- ROM_COPY("user1", 0x000000, 0x040000, 0x040000)
- /* why would you run kick31 on an a500? */
- ROM_SYSTEM_BIOS(2, "kick31", "Kickstart 3.1 (40.63)")
- ROMX_LOAD("kick40063.u6", 0x000000, 0x080000, CRC(fc24ae0d) SHA1(3b7f1493b27e212830f989f26ca76c02049f09ca), ROM_GROUPWORD | ROM_BIOS(4)) /* part number? */
+ ROMX_LOAD("315093-02.u2", 0x00000, 0x40000, CRC(c4f0f55f) SHA1(891e9a547772fe0c6c19b610baf8bc4ea7fcb785), ROM_GROUPWORD | ROM_BIOS(2))
+ ROM_COPY("kickstart", 0x00000, 0x40000, 0x40000)
+ ROM_SYSTEM_BIOS(2, "kick204", "Kickstart 2.04 (37.175)")
+ ROMX_LOAD("390979-01.u2", 0x00000, 0x80000, CRC(c3bdb240) SHA1(c5839f5cb98a7a8947065c3ed2f14f5f42e334a1), ROM_GROUPWORD | ROM_BIOS(3))
+ ROM_SYSTEM_BIOS(3, "kick31", "Kickstart 3.1 (40.63)")
+ ROMX_LOAD("kick40063.u2", 0x00000, 0x80000, CRC(fc24ae0d) SHA1(3b7f1493b27e212830f989f26ca76c02049f09ca), ROM_GROUPWORD | ROM_BIOS(4))
+ROM_END
- /* action replay cartridge */
- ROM_REGION16_BE(0x080000, "user2", ROMREGION_ERASEFF )
- ROM_CART_LOAD("cart", 0x0000, 0x080000, ROM_NOMIRROR | ROM_OPTIONAL)
+// Amiga 2000CR chip location: U500
+#define rom_a2000n rom_a2000
- /* keyboard controller, mos 6500/1 mcu */
- ROM_REGION(0x800, "keyboard", 0)
- ROM_LOAD("328191-02.ic1", 0x000, 0x800, NO_DUMP)
-ROM_END
+// Amiga 500 chip location: U6
+#define rom_a500 rom_a2000
+#define rom_a500n rom_a2000
-#define rom_a500n rom_a500
+// Amiga 500+
+//
+// Shipped with Kickstart 2.04. Kickstart 3.1 upgrade available.
-ROM_START( a500pl )
- ROM_REGION16_BE(0x080000, "user1", 0)
+ROM_START( a500p )
+ ROM_REGION16_BE(0x80000, "kickstart", 0)
ROM_DEFAULT_BIOS("kick204")
-
ROM_SYSTEM_BIOS(0, "kick204", "Kickstart 2.04 (37.175)")
- ROMX_LOAD("390979-01.u6", 0x000000, 0x080000, CRC(c3bdb240) SHA1(c5839f5cb98a7a8947065c3ed2f14f5f42e334a1), ROM_GROUPWORD | ROM_BIOS(0)) /* identical to 363968.01 */
-
- /* action replay cartridge */
- ROM_REGION16_BE(0x080000, "user2", ROMREGION_ERASEFF )
- ROM_CART_LOAD("cart", 0x0000, 0x080000, ROM_NOMIRROR | ROM_OPTIONAL)
-
- /* keyboard controller, mos 6500/1 mcu */
- ROM_REGION(0x800, "keyboard", 0)
- ROM_LOAD("328191-02.ic1", 0x000, 0x800, NO_DUMP)
+ ROMX_LOAD("390979-01.u6", 0x00000, 0x80000, CRC(c3bdb240) SHA1(c5839f5cb98a7a8947065c3ed2f14f5f42e334a1), ROM_GROUPWORD | ROM_BIOS(1))
+ ROM_SYSTEM_BIOS(1, "kick31", "Kickstart 3.1 (40.63)")
+ ROMX_LOAD("kick40063.u6", 0x00000, 0x80000, CRC(fc24ae0d) SHA1(3b7f1493b27e212830f989f26ca76c02049f09ca), ROM_GROUPWORD | ROM_BIOS(2))
ROM_END
-#define rom_a500pln rom_a500pl
+#define rom_a500pn rom_a500p
-ROM_START( a600 )
- ROM_REGION16_BE(0x080000, "user1", 0)
- ROM_DEFAULT_BIOS("kick205")
+// Commodore CDTV
+//
+// Shipped with a standard Kickstart 1.3 and the needed additional drivers
+// in two extra chips.
- ROM_SYSTEM_BIOS(0, "kick205", "Kickstart 2.05 (37.299)")
- ROMX_LOAD("kickstart v2.05 r37.299 (1991)(commodore)(a600)[!].rom", 0x000000, 0x080000, CRC(83028fb5) SHA1(87508de834dc7eb47359cede72d2e3c8a2e5d8db), ROM_GROUPWORD | ROM_BIOS(0))
+ROM_START( cdtv )
+ // cd-rom driver
+ ROM_REGION16_BE(0x40000, "cdrom", 0)
+ ROM_LOAD16_BYTE("391008-01.u34", 0x00000, 0x20000, CRC(791cb14b) SHA1(277a1778924496353ffe56be68063d2a334360e4))
+ ROM_LOAD16_BYTE("391009-01.u35", 0x00001, 0x20000, CRC(accbbc2e) SHA1(41b06d1679c6e6933c3378b7626025f7641ebc5c))
- // from A600HD (had HDD by default)
- ROM_SYSTEM_BIOS(1, "kick205a", "Kickstart 2.05 (37.300)")
- ROMX_LOAD("kickstart v2.05 r37.300 (1991)(commodore)(a600hd).rom", 0x000000, 0x080000, CRC(64466c2a) SHA1(f72d89148dac39c696e30b10859ebc859226637b), ROM_GROUPWORD | ROM_BIOS(1))
- ROM_SYSTEM_BIOS(2, "kick205b", "Kickstart 2.05 (37.300)")
- ROMX_LOAD("kickstart v2.05 r37.350 (1992)(commodore)(a600hd)[!].rom", 0x000000, 0x080000, CRC(43b0df7b) SHA1(02843c4253bbd29aba535b0aa3bd9a85034ecde4), ROM_GROUPWORD | ROM_BIOS(2))
+ // standard amiga kickstart 1.3
+ ROM_REGION16_BE(0x80000, "kickstart", 0)
+ ROMX_LOAD("315093-02.u13", 0x00000, 0x40000, CRC(c4f0f55f) SHA1(891e9a547772fe0c6c19b610baf8bc4ea7fcb785), ROM_GROUPWORD)
+ ROM_COPY("kickstart", 0x00000, 0x40000, 0x40000)
- /* action replay cartridge */
- ROM_REGION16_BE(0x080000, "user2", ROMREGION_ERASEFF )
- ROM_CART_LOAD("cart", 0x0000, 0x080000, ROM_NOMIRROR | ROM_OPTIONAL)
+ // remote control input converter, mos 6500/1 mcu
+ ROM_REGION(0x800, "rcmcu", 0)
+ ROM_LOAD("252609-02.u75", 0x000, 0x800, NO_DUMP)
- /* keyboard controller, mos 6500/1 mcu */
- ROM_REGION(0x800, "keyboard", 0)
- ROM_LOAD("328191-02.ic1", 0x000, 0x800, NO_DUMP)
+ // lcd controller, sanyo lc6554h
+ ROM_REGION(0x1000, "lcd", 0)
+ ROM_LOAD("252608-01.u62", 0x0000, 0x1000, NO_DUMP)
ROM_END
-#define rom_a600n rom_a600
-
+#define rom_cdtvn rom_cdtv
-ROM_START( a1200 )
- ROM_REGION32_BE(0x080000, "user1", 0)
- ROM_DEFAULT_BIOS("kick31")
- ROM_SYSTEM_BIOS(0, "kick30", "Kickstart 3.0 (39.106)")
- ROMX_LOAD("391523-01.u6a", 0x000000, 0x040000, CRC(c742a412) SHA1(999eb81c65dfd07a71ee19315d99c7eb858ab186), ROM_GROUPWORD | ROM_REVERSE | ROM_SKIP(2) | ROM_BIOS(1))
- ROMX_LOAD("391524-01.u6b", 0x000002, 0x040000, CRC(d55c6ec6) SHA1(3341108d3a402882b5ef9d3b242cbf3c8ab1a3e9), ROM_GROUPWORD | ROM_REVERSE | ROM_SKIP(2) | ROM_BIOS(1))
-// ROMX_LOAD("kickstart v3.0 r39.106 (1992)(commodore)(a1200)[!].rom", 0x000000, 0x080000, CRC(6c9b07d2) SHA1(70033828182fffc7ed106e5373a8b89dda76faa5), ROM_BIOS(1))
+// Amiga 3000
+//
+// Early models have Kickstart 1.4 Alpha in ROM and boot either
+// Kickstart 1.3 or 2.0 from Hard Disk. Later versions have
+// Kickstart 2.04 installed as ROM. Upgrade available for
+// Kickstart 3.1.
- ROM_SYSTEM_BIOS(1, "kick31", "Kickstart 3.1 (40.068)")
- ROMX_LOAD("391773-01.u6a", 0x000000, 0x040000, CRC(08dbf275) SHA1(b8800f5f909298109ea69690b1b8523fa22ddb37), ROM_GROUPWORD | ROM_REVERSE | ROM_SKIP(2) | ROM_BIOS(2))
- ROMX_LOAD("391774-01.u6b", 0x000002, 0x040000, CRC(16c07bf8) SHA1(90e331be1970b0e53f53a9b0390b51b59b3869c2), ROM_GROUPWORD | ROM_REVERSE | ROM_SKIP(2) | ROM_BIOS(2))
-
- // COMMODORE | 391508-01 REV0 | KEYBOARD MPU
- ROM_REGION(0x1040, "keyboard", 0)
- ROM_LOAD("391508-01.u13", 0x0000, 0x1040, NO_DUMP)
-
- // Amiga Tech REV1 Keyboard MPU
- ROM_REGION(0x2f40, "keyboard_rev1", 0)
- ROM_LOAD("391508-02.u13", 0x0000, 0x2f40, NO_DUMP)
-ROM_END
-
-#define rom_a1200n rom_a1200
-
-/* Note: I think those ROMs are correct, but they should be verified */
ROM_START( a3000 )
- ROM_REGION32_BE(0x80000, "user1", 0)
+ ROM_REGION32_BE(0x80000, "kickstart", 0)
ROM_DEFAULT_BIOS("kick14")
ROM_SYSTEM_BIOS(0, "kick14", "Kickstart 1.4 (36.16)")
- /* COPYRIGHT 1990 CAI // ALL RIGHTS RESERVED // ALPHA 5 ROM 0 CS=9713 */
+ // COPYRIGHT 1990 CAI // ALL RIGHTS RESERVED // ALPHA 5 ROM 0 CS=9713
ROMX_LOAD("390629-02.u182", 0x00000, 0x40000, CRC(58327536) SHA1(d1713d7f31474a5948e6d488e33686061cf3d1e2), ROM_GROUPWORD | ROM_REVERSE | ROM_SKIP(2) | ROM_BIOS(1))
- /* COPYRIGHT 1990 CAI // ALL RIGHTS RESERVED // ALPHA 5 ROM 1 CS=9B21 */
+ // COPYRIGHT 1990 CAI // ALL RIGHTS RESERVED // ALPHA 5 ROM 1 CS=9B21
ROMX_LOAD("390630-02.u183", 0x00002, 0x40000, CRC(fe2f7fb9) SHA1(c05c9c52d014c66f9019152b3f2a2adc2c678794), ROM_GROUPWORD | ROM_REVERSE | ROM_SKIP(2) | ROM_BIOS(1))
ROM_SYSTEM_BIOS(1, "kick204", "Kickstart 2.04 (37.175)")
ROMX_LOAD("390629-03.u182", 0x00000, 0x40000, CRC(a245dbdf) SHA1(83bab8e95d378b55b0c6ae6561385a96f638598f), ROM_GROUPWORD | ROM_REVERSE | ROM_SKIP(2) | ROM_BIOS(2))
@@ -1292,69 +1959,146 @@ ROM_START( a3000 )
ROM_SYSTEM_BIOS(2, "kick31", "Kickstart 3.1 (40.68)")
ROMX_LOAD("kick31.u182", 0x00000, 0x40000, CRC(286b9a0d) SHA1(6763a2258ec493f7408cf663110dae9a17803ad1), ROM_GROUPWORD | ROM_REVERSE | ROM_SKIP(2) | ROM_BIOS(3))
ROMX_LOAD("kick31.u183", 0x00002, 0x40000, CRC(0b8cde6a) SHA1(5f02e97b48ebbba87d516a56b0400c6fc3434d8d), ROM_GROUPWORD | ROM_REVERSE | ROM_SKIP(2) | ROM_BIOS(3))
-
- ROM_REGION(0x1040, "keyboard", 0)
- ROM_LOAD("keyboard", 0x0000, 0x1040, NO_DUMP)
-ROM_END
-
-#define rom_a3000n rom_a3000
-
-ROM_START( cdtv )
- ROM_REGION16_BE(0x100000, "user1", 0)
- ROM_LOAD16_BYTE("391008-01.u34", 0x000000, 0x020000, CRC(791cb14b) SHA1(277a1778924496353ffe56be68063d2a334360e4))
- ROM_LOAD16_BYTE("391009-01.u35", 0x000001, 0x020000, CRC(accbbc2e) SHA1(41b06d1679c6e6933c3378b7626025f7641ebc5c))
- ROM_COPY("user1", 0x000000, 0x040000, 0x040000)
- ROMX_LOAD( "315093-02.u13", 0x080000, 0x040000, CRC(c4f0f55f) SHA1(891e9a547772fe0c6c19b610baf8bc4ea7fcb785), ROM_GROUPWORD)
- ROM_COPY("user1", 0x080000, 0x0c0000, 0x040000)
-
- /* remote control input converter, mos 6500/1 mcu */
- ROM_REGION(0x800, "rcmcu", 0)
- ROM_LOAD("252609-02.u75", 0x000, 0x800, NO_DUMP)
-
- /* lcd controller, sanyo lc6554h */
- ROM_REGION(0x1000, "lcd", 0)
- ROM_LOAD("252608-01.u62", 0x000, 0x1000, NO_DUMP)
ROM_END
-/***************************************************************************
- GAME DRIVERS
-***************************************************************************/
+#define rom_a3000n rom_a3000
-/* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME FLAGS */
-/* High-end market line */
+// Amiga 600
+//
+// According to Greg Donner's Workbench page, very early models shipped with
+// Kickstart 2.04.
+//
+// Kickstart 2.05 differences:
+// - 2.05 37.299: No HDD support
+// - 2.05 37.300: HDD support
+// - 2.05 37.350: HDD size limits removed
+//
+// Kickstart 3.1 upgrade available.
+//
+// The keyboard controller is included on the motherboard, still based on the
+// 6500/1.
-COMP( 1985, a1000, 0, 0, a1000, amiga, amiga_state, amiga, "Commodore Business Machines", "Amiga 1000 (PAL)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS )
-COMP( 1985, a1000n, a1000, 0, a1000n, amiga, amiga_state, amiga, "Commodore Business Machines", "Amiga 1000 (NTSC)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS )
+ROM_START( a600 )
+ ROM_REGION16_BE(0x80000, "kickstart", 0)
+ ROM_DEFAULT_BIOS("kick205-350")
+ ROM_SYSTEM_BIOS(0, "kick204", "Kickstart 2.04 (37.175)")
+ ROMX_LOAD("390979-01.u6", 0x00000, 0x80000, CRC(c3bdb240) SHA1(c5839f5cb98a7a8947065c3ed2f14f5f42e334a1), ROM_GROUPWORD | ROM_BIOS(1))
+ ROM_SYSTEM_BIOS(1, "kick205-299", "Kickstart 2.05 (37.299)")
+ ROMX_LOAD("391388-01.u6", 0x00000, 0x80000, CRC(83028fb5) SHA1(87508de834dc7eb47359cede72d2e3c8a2e5d8db), ROM_GROUPWORD | ROM_BIOS(2))
+ ROM_SYSTEM_BIOS(2, "kick205-300", "Kickstart 2.05 (37.300)")
+ ROMX_LOAD("391304-01.u6", 0x00000, 0x80000, CRC(64466c2a) SHA1(f72d89148dac39c696e30b10859ebc859226637b), ROM_GROUPWORD | ROM_BIOS(3))
+ ROM_SYSTEM_BIOS(3, "kick205-350", "Kickstart 2.05 (37.300)")
+ ROMX_LOAD("391304-02.u6", 0x00000, 0x80000, CRC(43b0df7b) SHA1(02843c4253bbd29aba535b0aa3bd9a85034ecde4), ROM_GROUPWORD | ROM_BIOS(4))
+ ROM_SYSTEM_BIOS(4, "kick31", "Kickstart 3.1 (40.63)")
+ ROMX_LOAD("kick40063.u6", 0x00000, 0x80000, CRC(fc24ae0d) SHA1(3b7f1493b27e212830f989f26ca76c02049f09ca), ROM_GROUPWORD | ROM_BIOS(5))
+ ROM_REGION(0x800, "keyboard", 0)
+ ROM_LOAD("391079-01.u13", 0x000, 0x800, NO_DUMP)
+ROM_END
+#define rom_a600n rom_a600
-/* Low-end market line */
+// Amiga 1200
+//
+// Early models shipped with Kickstart 3.0, later versions with
+// Kickstart 3.1. Keyboard controller is included on the motherboard,
+// but was changed to a 68HC05 core.
-COMP( 1987, a500, 0, 0, a500, amiga, amiga_state, amiga, "Commodore Business Machines", "Amiga 500 (PAL, OCS)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS )
-COMP( 1987, a500n, a500, 0, a500n, amiga, amiga_state, amiga, "Commodore Business Machines", "Amiga 500 (NTSC, OCS)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS )
+ROM_START( a1200 )
+ ROM_REGION32_BE(0x80000, "kickstart", 0)
+ ROM_DEFAULT_BIOS("kick31")
+ ROM_SYSTEM_BIOS(0, "kick30", "Kickstart 3.0 (39.106)")
+ ROMX_LOAD("391523-01.u6a", 0x00000, 0x40000, CRC(c742a412) SHA1(999eb81c65dfd07a71ee19315d99c7eb858ab186), ROM_GROUPWORD | ROM_REVERSE | ROM_SKIP(2) | ROM_BIOS(1))
+ ROMX_LOAD("391524-01.u6b", 0x00002, 0x40000, CRC(d55c6ec6) SHA1(3341108d3a402882b5ef9d3b242cbf3c8ab1a3e9), ROM_GROUPWORD | ROM_REVERSE | ROM_SKIP(2) | ROM_BIOS(1))
+ ROM_SYSTEM_BIOS(1, "kick31", "Kickstart 3.1 (40.68)")
+ ROMX_LOAD("391773-01.u6a", 0x00000, 0x40000, CRC(08dbf275) SHA1(b8800f5f909298109ea69690b1b8523fa22ddb37), ROM_GROUPWORD | ROM_REVERSE | ROM_SKIP(2) | ROM_BIOS(2))
+ ROMX_LOAD("391774-01.u6b", 0x00002, 0x40000, CRC(16c07bf8) SHA1(90e331be1970b0e53f53a9b0390b51b59b3869c2), ROM_GROUPWORD | ROM_REVERSE | ROM_SKIP(2) | ROM_BIOS(2))
+
+ ROM_REGION(0x4000, "keyboard", 0)
+ ROM_LOAD("391508-01.u13", 0x0000, 0x1040, NO_DUMP) // COMMODORE | 391508-01 REV0 | KEYBOARD MPU (MC68HC05C4AFN)
+ ROM_LOAD("391508-02.u13", 0x0000, 0x2f40, NO_DUMP) // Amiga Tech REV1 Keyboard MPU (MC68HC05C12FN)
+ROM_END
-COMP( 1991, a500pl, 0, 0, a500pls, amiga, amiga_state, amiga, "Commodore Business Machines", "Amiga 500+ (PAL, ECS)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS )
-COMP( 1991, a500pln, a500pl, 0, a500plsn, amiga, amiga_state, amiga, "Commodore Business Machines", "Amiga 500+ (NTSC, ECS)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS )
+#define rom_a1200n rom_a1200
-COMP( 1992, a600, 0, 0, a600, amiga, amiga_state, amiga, "Commodore Business Machines", "Amiga 600 (PAL, ECS)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS )
-COMP( 1992, a600n, a600, 0, a600n, amiga, amiga_state, amiga, "Commodore Business Machines", "Amiga 600 (NTSC, ECS)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS )
+// Amiga 4000
+//
+// Shipped with Kickstart 3.0, upgradable to Kickstart 3.1.
-COMP( 1992, a1200, 0, 0, a1200, amiga, a1200_state,a1200, "Commodore Business Machines", "Amiga 1200 (PAL, AGA)" , GAME_NOT_WORKING )
-COMP( 1992, a1200n, a1200, 0, a1200n, amiga, a1200_state,a1200, "Commodore Business Machines", "Amiga 1200 (NTSC, AGA)" , GAME_NOT_WORKING )
+ROM_START( a4000 )
+ ROM_REGION32_BE(0x80000, "kickstart", 0)
+ ROM_DEFAULT_BIOS("kick30")
+ ROM_SYSTEM_BIOS(0, "kick30", "Kickstart 3.0 (39.106)")
+ ROMX_LOAD("391513-02.u175", 0x00000, 0x40000, CRC(36f64dd0) SHA1(196e9f3f9cad934e181c07da33083b1f0a3c702f), ROM_GROUPWORD | ROM_REVERSE | ROM_SKIP(2) | ROM_BIOS(1))
+ ROMX_LOAD("391514-02.u176", 0x00002, 0x40000, CRC(17266a55) SHA1(42fbed3453d1f11ccbde89a9826f2d1175cca5cc), ROM_GROUPWORD | ROM_REVERSE | ROM_SKIP(2) | ROM_BIOS(1))
+ ROM_SYSTEM_BIOS(1, "kick31-68", "Kickstart 3.1 (40.68)")
+ ROMX_LOAD("kick40068.u175", 0x00000, 0x40000, CRC(b2af34f8) SHA1(24e52b5efc02049517387ab7b1a1475fc540350e), ROM_GROUPWORD | ROM_REVERSE | ROM_SKIP(2) | ROM_BIOS(2))
+ ROMX_LOAD("kick40068.u176", 0x00002, 0x40000, CRC(e65636a3) SHA1(313c7cbda5779e56f19a41d34e760f517626d882), ROM_GROUPWORD | ROM_REVERSE | ROM_SKIP(2) | ROM_BIOS(2))
+ ROM_SYSTEM_BIOS(2, "kick31-70", "Kickstart 3.1 (40.70)")
+ ROMX_LOAD("kick40070.u175", 0x00000, 0x40000, CRC(f9cbecc9) SHA1(138d8cb43b8312fe16d69070de607469b3d4078e), ROM_GROUPWORD | ROM_REVERSE | ROM_SKIP(2) | ROM_BIOS(2))
+ ROMX_LOAD("kick40070.u176", 0x00002, 0x40000, CRC(f8248355) SHA1(c23795479fae3910c185512ca268b82f1ae4fe05), ROM_GROUPWORD | ROM_REVERSE | ROM_SKIP(2) | ROM_BIOS(2))
+ROM_END
-COMP( 1992, a3000, 0, 0, a3000, amiga, amiga_state, a3000, "Commodore Business Machines", "Amiga 3000 (PAL, ECS, 68030)" , GAME_NOT_WORKING )
-COMP( 1992, a3000n, a3000, 0, a3000n, amiga, amiga_state, a3000, "Commodore Business Machines", "Amiga 3000 (NTSC, ECS, 68030)" , GAME_NOT_WORKING )
+#define rom_a4000n rom_a4000
+#define rom_a400030 rom_a4000
+#define rom_a400030n rom_a4000
+// Amiga 4000T
+//
+// Shipped with Kickstart 3.1 (40.70).
+ROM_START( a4000t )
+ ROM_REGION32_BE(0x80000, "kickstart", 0)
+ ROMX_LOAD("391657-01.u175", 0x00000, 0x40000, CRC(0ca94f70) SHA1(b3806edacb3362fc16a154ce1eeec5bf5bc24789), ROM_GROUPWORD | ROM_REVERSE | ROM_SKIP(2) | ROM_BIOS(1))
+ ROMX_LOAD("391658-01.u176", 0x00002, 0x40000, CRC(dfe03120) SHA1(cd7a706c431b04d87814d3a2d8b397100cf44c0c), ROM_GROUPWORD | ROM_REVERSE | ROM_SKIP(2) | ROM_BIOS(1))
+ROM_END
-COMP( 1991, cdtv, 0, 0, cdtv, cdtv, amiga_state, cdtv, "Commodore Business Machines", "CDTV (NTSC)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS )
+#define rom_a4000tn rom_a4000t
-/* other official models */
-/* Amiga 2000 - similar to 1000 */
-/* Amiga 1500 - Amiga 2000 with two floppy drives (2nd replacing the HDD) */
-/* Amiga 2500 - Amiga 2000 with 68020 accelerator card */
-/* Amiga 4000 - AGA chipset, 68040 / 68060 CPU */
+// Amiga CD32
+//
+// Shipped with Kickstart 3.1 and additional software interleaved in a 1MB rom chip.
+ROM_START( cd32 )
+ ROM_REGION32_BE(0x100000, "kickstart", 0)
+// ROM_LOAD16_WORD("391640-03.u6a", 0x000000, 0x100000, CRC(a4fbc94a) SHA1(816ce6c5077875850c7d43452230a9ba3a2902db)) // todo: this is the real dump
+ ROM_LOAD16_WORD("391640-03.u6a", 0x000000, 0x100000, CRC(d3837ae4) SHA1(06807db3181637455f4d46582d9972afec8956d9))
+ROM_END
-/* CD32 - see cd32.c */
+#define rom_cd32n rom_cd32
+
+
+//**************************************************************************
+// SYSTEM DRIVERS
+//**************************************************************************
+
+// OCS Chipset
+COMP( 1985, a1000, 0, 0, a1000, amiga, a1000_state, pal, "Commodore", "Amiga 1000 (PAL)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS )
+COMP( 1985, a1000n, a1000, 0, a1000n, amiga, a1000_state, ntsc, "Commodore", "Amiga 1000 (NTSC)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS )
+COMP( 1987, a2000, 0, 0, a2000, amiga, a2000_state, pal, "Commodore", "Amiga 2000 (PAL)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS )
+COMP( 1987, a2000n, a2000, 0, a2000n, amiga, a2000_state, ntsc, "Commodore", "Amiga 2000 (NTSC)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS )
+COMP( 1987, a500, 0, 0, a500, amiga, a500_state, pal, "Commodore", "Amiga 500 (PAL)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS )
+COMP( 1987, a500n, a500, 0, a500n, amiga, a500_state, ntsc, "Commodore", "Amiga 500 (NTSC)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS )
+COMP( 1990, cdtv, 0, 0, cdtv, amiga, cdtv_state, pal, "Commodore", "CDTV (PAL)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS )
+COMP( 1990, cdtvn, cdtv, 0, cdtvn, amiga, cdtv_state, ntsc, "Commodore", "CDTV (NTSC)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS )
+
+// ECS Chipset
+COMP( 1990, a3000, 0, 0, a3000, amiga, a3000_state, pal, "Commodore", "Amiga 3000 (PAL)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS )
+COMP( 1990, a3000n, a3000, 0, a3000n, amiga, a3000_state, ntsc, "Commodore", "Amiga 3000 (NTSC)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS )
+COMP( 1992, a500p, 0, 0, a500p, amiga, a500p_state, pal, "Commodore", "Amiga 500 Plus (PAL)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS )
+COMP( 1992, a500pn, a500p, 0, a500pn, amiga, a500p_state, ntsc, "Commodore", "Amiga 500 Plus (NTSC)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS )
+COMP( 1992, a600, 0, 0, a600, amiga, a600_state, pal, "Commodore", "Amiga 600 (PAL)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS )
+COMP( 1992, a600n, a600, 0, a600n, amiga, a600_state, ntsc, "Commodore", "Amiga 600 (NTSC)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS )
+
+// AGA Chipset
+COMP( 1992, a1200, 0, 0, a1200, amiga, a1200_state, pal, "Commodore", "Amiga 1200 (PAL)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS )
+COMP( 1992, a1200n, a1200, 0, a1200n, amiga, a1200_state, ntsc, "Commodore", "Amiga 1200 (NTSC)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS )
+COMP( 1992, a4000, 0, 0, a4000, amiga, a4000_state, pal, "Commodore", "Amiga 4000/040 (PAL)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS )
+COMP( 1992, a4000n, a4000, 0, a4000n, amiga, a4000_state, ntsc, "Commodore", "Amiga 4000/040 (NTSC)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS )
+COMP( 1993, a400030, a4000, 0, a400030, amiga, a4000_state, pal, "Commodore", "Amiga 4000/030 (PAL)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS )
+COMP( 1993, a400030n, a4000, 0, a400030n, amiga, a4000_state, ntsc, "Commodore", "Amiga 4000/030 (NTSC)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS )
+COMP( 1993, cd32, 0, 0, cd32, cd32, cd32_state, pal, "Commodore", "Amiga CD32 (PAL)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS )
+COMP( 1993, cd32n, cd32, 0, cd32n, cd32, cd32_state, ntsc, "Commodore", "Amiga CD32 (NTSC)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS )
+COMP( 1994, a4000t, 0, 0, a4000t, amiga, a4000_state, pal, "Commodore", "Amiga 4000T (PAL)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS )
+COMP( 1994, a4000tn, a4000t, 0, a4000tn, amiga, a4000_state, ntsc, "Commodore", "Amiga 4000T (NTSC)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS )
diff --git a/src/mess/machine/amigacd.c b/src/mess/machine/amigacd.c
deleted file mode 100644
index 165ecc60c60..00000000000
--- a/src/mess/machine/amigacd.c
+++ /dev/null
@@ -1,547 +0,0 @@
-/***************************************************************************
-
- Amiga CD-ROM controller emulation
-
-Notes:
-Many thanks to Toni Wilen for all the help and information about the
-DMAC controller.
-
-***************************************************************************/
-
-
-#include "emu.h"
-#include "includes/amiga.h"
-#include "amigacd.h"
-#include "machine/6525tpi.h"
-#include "imagedev/chd_cd.h"
-#include "machine/matsucd.h"
-
-
-#define VERBOSE_DMAC 0
-
-#define LOG(x) do { if (VERBOSE_DMAC) logerror x; } while (0)
-
-/* constants */
-#define CD_SECTOR_TIME (1000/((300*1024)/2048)) /* 2X CDROM sector time in msec (300KBps) */
-
-/***************************************************************************
-
- DMAC
-
-***************************************************************************/
-
-/*
- * value to go into DAWR
- */
-#define DAWR_ATZSC 3 /* according to A3000T service-manual */
-
-/*
- * bits defined for CNTR
- */
-#define CNTR_TCEN (1<<7) /* Terminal Count Enable */
-#define CNTR_PREST (1<<6) /* Perp Reset (not implemented :-((( ) */
-#define CNTR_PDMD (1<<5) /* Perp Device Mode Select (1=SCSI,0=XT/AT) */
-#define CNTR_INTEN (1<<4) /* Interrupt Enable */
-#define CNTR_DDIR (1<<3) /* Device Direction. 1==rd host, wr to perp */
-
-/*
- * bits defined for ISTR
- */
-#define ISTR_INTX (1<<8) /* XT/AT Interrupt pending */
-#define ISTR_INT_F (1<<7) /* Interrupt Follow */
-#define ISTR_INTS (1<<6) /* SCSI Peripheral Interrupt */
-#define ISTR_E_INT (1<<5) /* End-Of-Process Interrupt */
-#define ISTR_INT_P (1<<4) /* Interrupt Pending */
-#define ISTR_UE_INT (1<<3) /* Under-Run FIFO Error Interrupt */
-#define ISTR_OE_INT (1<<2) /* Over-Run FIFO Error Interrupt */
-#define ISTR_FF_FLG (1<<1) /* FIFO-Full Flag */
-#define ISTR_FE_FLG (1<<0) /* FIFO-Empty Flag */
-
-struct dmac_data_t
-{
- UINT16 istr; /* Interrupt Status Register (R) */
- UINT16 cntr; /* Control Register (RW) */
- UINT32 wtc; /* Word Transfer Count Register (RW) */
- UINT32 acr; /* Address Count Register (RW) */
- UINT16 dawr; /* DACK Width Register (W) */
- emu_timer *dma_timer;
-};
-
-static dmac_data_t dmac_data;
-
-static void check_interrupts( running_machine &machine )
-{
- amiga_state *state = machine.driver_data<amiga_state>();
-
- /* if interrupts are disabled, bail */
- if ( (dmac_data.cntr & CNTR_INTEN) == 0 )
- return;
-
- /* if no interrupts are pending, bail */
- if ( (dmac_data.istr & ISTR_INT_P) == 0 )
- return;
-
- /* otherwise, generate the IRQ */
- state->amiga_custom_w(*state->m_maincpu_program_space, REG_INTREQ, 0x8000 | INTENA_PORTS, 0xffff);
-}
-
-static TIMER_CALLBACK(dmac_dma_proc)
-{
- amiga_state *state = machine.driver_data<amiga_state>();
- while( dmac_data.wtc > 0 )
- {
- UINT16 dat16;
- UINT8 dat8;
-
- if ( matsucd_get_next_byte( &dat8 ) < 0 )
- break;
-
- dat16 = dat8;
-
- if ( matsucd_get_next_byte( &dat8 ) < 0 )
- break;
-
- dat16 <<= 8;
- dat16 |= dat8;
-
- (*state->m_chip_ram_w)(state, dmac_data.acr, dat16);
-
- dmac_data.acr += 2;
- dmac_data.wtc--;
- }
-
- if ( dmac_data.wtc > 0 )
- {
- matsucd_read_next_block();
- dmac_data.dma_timer->adjust(attotime::from_msec( CD_SECTOR_TIME ));
- }
- else
- {
- dmac_data.istr |= ISTR_INT_P | ISTR_E_INT;
- check_interrupts( machine );
- }
-}
-
-READ16_MEMBER( amiga_state::amiga_dmac_r )
-{
- offset &= 0xff;
-
- switch( offset )
- {
- case 0x20:
- {
- UINT8 v = dmac_data.istr;
- LOG(( "DMAC: PC=%08x - ISTR Read(%04x)\n", space.device().safe_pc(), dmac_data.istr ));
-
- dmac_data.istr &= ~0x0f;
- return v;
- }
- break;
-
- case 0x21:
- {
- LOG(( "DMAC: PC=%08x - CNTR Read(%04x)\n", space.device().safe_pc(), dmac_data.cntr ));
- return dmac_data.cntr;
- }
- break;
-
- case 0x40: /* wtc hi */
- {
- LOG(( "DMAC: PC=%08x - WTC HI Read\n", space.device().safe_pc() ));
- return (dmac_data.wtc >> 16);
- }
- break;
-
- case 0x41: /* wtc lo */
- {
- LOG(( "DMAC: PC=%08x - WTC LO Read\n", space.device().safe_pc() ));
- return dmac_data.wtc;
- }
- break;
-
- case 0x42: /* acr hi */
- {
- LOG(( "DMAC: PC=%08x - ACR HI Read\n", space.device().safe_pc() ));
- return (dmac_data.acr >> 16);
- }
- break;
-
- case 0x43: /* acr lo */
- {
- LOG(( "DMAC: PC=%08x - ACR LO Read\n", space.device().safe_pc() ));
- return dmac_data.acr;
- }
- break;
-
- case 0x48: /* wd33c93 SCSI expansion */
- case 0x49:
- {
- LOG(( "DMAC: PC=%08x - WD33C93 Read(%d)\n", space.device().safe_pc(), offset & 1 ));
- return 0x00; /* Not available without SCSI expansion */
- }
- break;
-
- case 0x50:
- {
- LOG(( "DMAC: PC=%08x - CDROM RESP Read\n", space.device().safe_pc() ));
- return matsucd_response_r(space.machine());
- }
- break;
-
- case 0x51: /* XT IO */
- case 0x52:
- case 0x53:
- {
- LOG(( "DMAC: PC=%08x - XT IO Read(%d)\n", space.device().safe_pc(), (offset & 3)-1 ));
- return 0xff;
- }
- break;
-
- case 0x58: /* TPI6525 */
- case 0x59:
- case 0x5A:
- case 0x5B:
- case 0x5C:
- case 0x5D:
- case 0x5E:
- case 0x5F:
- case 0x60:
- case 0x61:
- case 0x62:
- case 0x63:
- case 0x64:
- case 0x65:
- case 0x66:
- case 0x67:
- {
- tpi6525_device *tpi = space.machine().device<tpi6525_device>("tpi6525");
- LOG(( "DMAC: PC=%08x - TPI6525 Read(%d)\n", space.device().safe_pc(), (offset - 0x58) ));
- return tpi->read(space, offset - 0x58);
- }
- break;
-
- case 0x70: /* DMA start strobe */
- {
- LOG(( "DMAC: PC=%08x - DMA Start Strobe\n", space.device().safe_pc() ));
- dmac_data.dma_timer->adjust(attotime::from_msec( CD_SECTOR_TIME ));
- }
- break;
-
- case 0x71: /* DMA stop strobe */
- {
- LOG(( "DMAC: PC=%08x - DMA Stop Strobe\n", space.device().safe_pc() ));
- dmac_data.dma_timer->reset( );
- }
- break;
-
- case 0x72: /* Clear IRQ strobe */
- {
- LOG(( "DMAC: PC=%08x - IRQ Clear Strobe\n", space.device().safe_pc() ));
- dmac_data.istr &= ~ISTR_INT_P;
- }
- break;
-
- case 0x74: /* Flush strobe */
- {
- LOG(( "DMAC: PC=%08x - Flush Strobe\n", space.device().safe_pc() ));
- dmac_data.istr |= ISTR_FE_FLG;
- }
- break;
-
- default:
- logerror( "DMAC-READ: PC=%08x, offset = %02x\n", space.device().safe_pc(), offset );
- break;
- }
-
- return 0;
-}
-
-WRITE16_MEMBER( amiga_state::amiga_dmac_w )
-{
- offset &= 0xff;
-
- switch( offset )
- {
- case 0x21: /* control write */
- {
- LOG(( "DMAC: PC=%08x - CNTR Write(%04x)\n", space.device().safe_pc(), data ));
- dmac_data.cntr = data;
- check_interrupts(space.machine());
- }
- break;
-
- case 0x40: /* wtc hi */
- {
- LOG(( "DMAC: PC=%08x - WTC HI Write - data = %04x\n", space.device().safe_pc(), data ));
- dmac_data.wtc &= 0x0000ffff;
- dmac_data.wtc |= ((UINT32)data) << 16;
- }
- break;
-
- case 0x41: /* wtc lo */
- {
- LOG(( "DMAC: PC=%08x - WTC LO Write - data = %04x\n", space.device().safe_pc(), data ));
- dmac_data.wtc &= 0xffff0000;
- dmac_data.wtc |= data;
- }
- break;
-
- case 0x42: /* acr hi */
- {
- LOG(( "DMAC: PC=%08x - ACR HI Write - data = %04x\n", space.device().safe_pc(), data ));
- dmac_data.acr &= 0x0000ffff;
- dmac_data.acr |= ((UINT32)data) << 16;
- }
- break;
-
- case 0x43: /* acr lo */
- {
- LOG(( "DMAC: PC=%08x - ACR LO Write - data = %04x\n", space.device().safe_pc(), data ));
- dmac_data.acr &= 0xffff0000;
- dmac_data.acr |= data;
- }
- break;
-
- case 0x47: /* dawr */
- {
- LOG(( "DMAC: PC=%08x - DAWR Write - data = %04x\n", space.device().safe_pc(), data ));
- dmac_data.dawr = data;
- }
- break;
-
- case 0x48: /* wd33c93 SCSI expansion */
- case 0x49:
- {
- LOG(( "DMAC: PC=%08x - WD33C93 Write(%d) - data = %04x\n", space.device().safe_pc(), offset & 1, data ));
- /* Not available without SCSI expansion */
- }
- break;
-
- case 0x50:
- {
- LOG(( "DMAC: PC=%08x - CDROM CMD Write - data = %04x\n", space.device().safe_pc(), data ));
- matsucd_command_w(space.machine(), data );
- }
- break;
-
- case 0x58: /* TPI6525 */
- case 0x59:
- case 0x5A:
- case 0x5B:
- case 0x5C:
- case 0x5D:
- case 0x5E:
- case 0x5F:
- case 0x60:
- case 0x61:
- case 0x62:
- case 0x63:
- case 0x64:
- case 0x65:
- case 0x66:
- case 0x67:
- {
- tpi6525_device *tpi = space.machine().device<tpi6525_device>("tpi6525");
- LOG(( "DMAC: PC=%08x - TPI6525 Write(%d) - data = %04x\n", space.device().safe_pc(), (offset - 0x58), data ));
- tpi->write(space, offset - 0x58, data);
- }
- break;
-
- case 0x70: /* DMA start strobe */
- {
- LOG(( "DMAC: PC=%08x - DMA Start Strobe\n", space.device().safe_pc() ));
- dmac_data.dma_timer->adjust(attotime::from_msec( CD_SECTOR_TIME ));
- }
- break;
-
- case 0x71: /* DMA stop strobe */
- {
- LOG(( "DMAC: PC=%08x - DMA Stop Strobe\n", space.device().safe_pc() ));
- dmac_data.dma_timer->reset( );
- }
- break;
-
- case 0x72: /* Clear IRQ strobe */
- {
- LOG(( "DMAC: PC=%08x - IRQ Clear Strobe\n", space.device().safe_pc() ));
- dmac_data.istr &= ~ISTR_INT_P;
- }
- break;
-
- case 0x74: /* Flush Strobe */
- {
- LOG(( "DMAC: PC=%08x - Flush Strobe\n", space.device().safe_pc() ));
- dmac_data.istr |= ISTR_FE_FLG;
- }
- break;
-
- default:
- logerror( "DMAC-WRITE: PC=%08x, offset = %02x, data = %04x\n", space.device().safe_pc(), offset, data );
- break;
- }
-}
-
-/***************************************************************************
-
- Autoconfig
-
-***************************************************************************/
-
-static void dmac_install(running_machine &machine, offs_t base)
-{
- amiga_state *state = machine.driver_data<amiga_state>();
- address_space &space = *state->m_maincpu_program_space;
- space.install_read_handler(base, base + 0xFFFF, read16_delegate(FUNC(amiga_state::amiga_dmac_r),state));
- space.install_write_handler(base, base + 0xFFFF, write16_delegate(FUNC(amiga_state::amiga_dmac_w),state));
-}
-
-static void dmac_uninstall(running_machine &machine, offs_t base)
-{
- amiga_state *state = machine.driver_data<amiga_state>();
- address_space &space = *state->m_maincpu_program_space;
- space.unmap_readwrite(base, base + 0xFFFF);
-}
-
-static const amiga_autoconfig_device dmac_device =
-{
- 0, /* link into free memory list */
- 0, /* ROM vector offset valid */
- 0, /* multiple devices on card */
- 1, /* number of 64k pages */
- 3, /* product number (DMAC) */
- 0, /* prefer 8MB address space */
- 0, /* can be shut up */
- 0x0202, /* manufacturers number (Commodore) */
- 0, /* serial number */
- 0, /* ROM vector offset */
- NULL, /* interrupt control read */
- NULL, /* interrupt control write */
- dmac_install, /* memory installation */
- dmac_uninstall /* memory uninstallation */
-};
-
-/***************************************************************************
-
- TPI6525
-
-***************************************************************************/
-
-READ8_MEMBER( amiga_state::amigacd_tpi6525_portc_r )
-{
- int ret = 0;
-
- tpi6525_device *tpi = space.machine().device<tpi6525_device>("tpi6525");
-
- if ( (tpi->get_ddr_c() & 0x04) == 0 ) /* if pin 2 is set to input */
- {
- ret |= matsucd_stch_r() ? 0x00 : 0x04; /* read status change signal */
- }
-
- if ( (tpi->get_ddr_c() & 0x08) == 0 ) /* if pin 3 is set to input */
- ret |= matsucd_sten_r() ? 0x08 : 0x00; /* read enable signal */
-
- return ret;
-}
-
-WRITE8_MEMBER( amiga_state::amigacd_tpi6525_portb_w )
-{
- tpi6525_device *tpi = space.machine().device<tpi6525_device>("tpi6525");
-
- if ( tpi->get_ddr_b() & 0x01 ) /* if pin 0 is set to output */
- matsucd_cmd_w( data & 1 ); /* write to the /CMD signal */
-
- if ( tpi->get_ddr_b() & 0x02 ) /* if pin 1 is set to output */
- matsucd_enable_w( data & 2 ); /* write to the /ENABLE signal */
-}
-
-static emu_timer *tp6525_delayed_timer;
-
-static TIMER_CALLBACK(tp6525_delayed_irq)
-{
- amiga_state *state = machine.driver_data<amiga_state>();
- (void)param;
-
- if ( (CUSTOM_REG(REG_INTREQ) & INTENA_PORTS) == 0 )
- {
- state->amiga_custom_w(*state->m_maincpu_program_space, REG_INTREQ, 0x8000 | INTENA_PORTS, 0xffff);
- }
- else
- {
- tp6525_delayed_timer->adjust(attotime::from_msec(1));
- }
-}
-
-static void amigacd_tpi6525_irq_trampoline(device_t *device, int level)
-{
- amiga_state *state = device->machine().driver_data<amiga_state>();
- LOG(( "TPI6525 Interrupt: level = %d\n", level ));
-
- if ( level )
- {
- if ( (CUSTOM_REG(REG_INTREQ) & INTENA_PORTS) == 0 )
- {
- state->amiga_custom_w(*state->m_maincpu_program_space, REG_INTREQ, 0x8000 | INTENA_PORTS, 0xffff);
- }
- else
- {
- /* we *have to* deliver the irq, so if we can't, delay it and try again later */
- tp6525_delayed_timer->adjust(attotime::from_msec(1));
- }
- }
-}
-
-WRITE_LINE_MEMBER( amiga_state::amigacd_tpi6525_irq )
-{
- tpi6525_device *tpi = machine().device<tpi6525_device>("tpi6525");
-
- amigacd_tpi6525_irq_trampoline(tpi, state);
-}
-
-static void cdrom_status_enabled( running_machine &machine, int level )
-{
- tpi6525_device *tpi = machine.device<tpi6525_device>("tpi6525");
-
- /* PC3 on the 6525 */
- tpi->i3_w(level);
-}
-
-static void cdrom_status_change( running_machine &machine, int level )
-{
- tpi6525_device *tpi = machine.device<tpi6525_device>("tpi6525");
-
- /* invert */
- level = level ? 0 : 1;
-
- /* PC2 on the 6525 */
- tpi->i2_w(level);
-}
-
-static void cdrom_subcode_ready( running_machine &machine, int level )
-{
- tpi6525_device *tpi = machine.device<tpi6525_device>("tpi6525");
-
- /* PC1 on the 6525 */
- tpi->i1_w(level);
-}
-
-void amigacd_start(running_machine &machine)
-{
- /* initialize the dmac */
- memset( &dmac_data, 0, sizeof( dmac_data ) );
-
- dmac_data.dma_timer = machine.scheduler().timer_alloc(FUNC(dmac_dma_proc));
- tp6525_delayed_timer = machine.scheduler().timer_alloc(FUNC(tp6525_delayed_irq));
-
- /* set up DMAC with autoconfig */
- amiga_add_autoconfig( machine, &dmac_device );
-
- matsucd_init( machine.device<cdrom_image_device>("cdrom"), "cdda" );
-}
-
-void amigacd_reset(running_machine &machine)
-{
- /* initialize the cdrom */
- matsucd_set_status_enabled_callback( cdrom_status_enabled );
- matsucd_set_status_changed_callback( cdrom_status_change );
- matsucd_set_subcode_ready_callback( cdrom_subcode_ready );
-}
diff --git a/src/mess/machine/amigacd.h b/src/mess/machine/amigacd.h
deleted file mode 100644
index 5cc820ef2a1..00000000000
--- a/src/mess/machine/amigacd.h
+++ /dev/null
@@ -1,9 +0,0 @@
-#ifndef __AMIGACD_H__
-#define __AMIGACD_H__
-
-
-void amigacd_start(running_machine &machine);
-void amigacd_reset(running_machine &machine);
-
-
-#endif /* __AMIGACD_H__ */
diff --git a/src/mess/machine/amigacrt.c b/src/mess/machine/amigacrt.c
deleted file mode 100644
index dd1ab1bed0d..00000000000
--- a/src/mess/machine/amigacrt.c
+++ /dev/null
@@ -1,464 +0,0 @@
-/***************************************************************************
-
- Amiga cartridge emulation
-
-TODO:
-- Investigate why the AR2/3 sometimes garble the video on exit from the cart
-- Add Nordic Power and similar carts
-- Add HRTMon A1200 cart
-
-***************************************************************************/
-
-
-#include "emu.h"
-#include "includes/amiga.h"
-#include "cpu/m68000/m68000.h"
-#include "machine/amigacrt.h"
-
-enum
-{
- /* supported cartridges */
- ACTION_REPLAY = 0,
- ACTION_REPLAY_MKII,
- ACTION_REPLAY_MKIII
-};
-
-struct amigacrt_t
-{
- int cart_type;
- int ar1_spurious;
- UINT16 ar23_mode;
-};
-static amigacrt_t amigacrt;
-
-/***************************************************************************
-
- Utilities
-
-***************************************************************************/
-
-static int check_kickstart_12_13( running_machine &machine, const char *cart_name )
-{
- UINT16 * ksmem = (UINT16 *)(*machine.root_device().memregion( "user1" ));
-
- if ( ksmem[2] == 0x00FC )
- return 1;
-
- logerror( "%s requires Kickstart version 1.2 or 1.3 - Cart not installed\n", cart_name );
-
- return 0;
-}
-
-/***************************************************************************
-
- Amiga Action Replay 1
-
- Whenever you push the button, an NMI interrupt is generated.
-
- The cartridge protects itself from being removed from memory by
- generating an interrupt whenever either the spurious interrupt
- vector is written at $60, or the nmi interrupt vector is written at
- $7c. If the spurious interrupt vector at $60 is written, then
- a NMI is generated, and the spurious irq vector is restored. If the
- NMI vector at $7c is written, then a spurious interrupt is generated,
- and the NMI vector is restored.
-
- When breakpoints are set, the target address is replaced by a trap
- instruction, and the original contents of the address are kept in
- the cartridge's RAM. A trap handler is installed pointing to $40
- in RAM, where code that clears memory address $60 followed by two
- nops are written. There seems to be a small delay between the write
- to $60 and until the actual NMI is generated, since the cart expects
- the PC to be at $46 (at the second nop).
-
-***************************************************************************/
-
-IRQ_CALLBACK_MEMBER(amiga_state::amiga_ar1_irqack)
-{
- if ( irqline == 7 && amigacrt.ar1_spurious )
- {
- return M68K_INT_ACK_SPURIOUS;
- }
-
- return (24+irqline);
-}
-
-static TIMER_CALLBACK( amiga_ar1_delayed_nmi )
-{
- (void)param;
- machine.device("maincpu")->execute().set_input_line(7, PULSE_LINE);
-}
-
-static void amiga_ar1_nmi( running_machine &machine )
-{
- amiga_state *state = machine.driver_data<amiga_state>();
- /* get the cart's built-in ram */
- UINT16 *ar_ram = (UINT16 *)(state->m_maincpu_program_space->get_write_ptr(0x9fc000));
-
- if ( ar_ram != NULL )
- {
- int i;
-
- /* copy custom register values */
- for( i = 0; i < 256; i++ )
- ar_ram[0x1800+i] = CUSTOM_REG(i);
-
- /* trigger NMI irq */
- amigacrt.ar1_spurious = 0;
- machine.scheduler().timer_set(machine.device<cpu_device>("maincpu")->cycles_to_attotime(28), FUNC(amiga_ar1_delayed_nmi));
- }
-}
-
-WRITE16_MEMBER( amiga_state::amiga_ar1_chipmem_w )
-{
- int pc = space.device().safe_pc();
-
- /* see if we're inside the AR1 rom */
- if ( ((pc >> 16) & 0xff ) != 0xf0 )
- {
- /* if we're not, see if either the Spurious IRQ vector
- or the NMI vector are being overwritten */
- if ( offset == (0x60/2) || offset == (0x7c/2) )
- {
- /* trigger an NMI or spurious irq */
- amigacrt.ar1_spurious = (offset == 0x60/2) ? 0 : 1;
- space.machine().scheduler().timer_set(space.machine().device<cpu_device>("maincpu")->cycles_to_attotime(28), FUNC(amiga_ar1_delayed_nmi));
- }
- }
-
- (*m_chip_ram_w)(this, offset * 2, data );
-}
-
-static void amiga_ar1_check_overlay( running_machine &machine )
-{
- amiga_state *state = machine.driver_data<amiga_state>();
-
- state->m_maincpu_program_space->install_write_handler(0x000000, 0x00007f, write16_delegate(FUNC(amiga_state::amiga_ar1_chipmem_w),state));
-}
-
-static void amiga_ar1_init( running_machine &machine )
-{
- amiga_state *state = machine.driver_data<amiga_state>();
- void *ar_ram;
-
- /* check kickstart version */
- if ( !check_kickstart_12_13( machine, "Amiga Action Replay" ) )
- {
- amigacrt.cart_type = -1;
- return;
- }
-
- /* setup the cart ram */
- ar_ram = auto_alloc_array(machine, UINT8, 0x4000);
- memset(ar_ram, 0, 0x4000);
-
- /* Install ROM */
- state->m_maincpu_program_space->install_read_bank(0xf00000, 0xf7ffff, "bank2");
- state->m_maincpu_program_space->unmap_write(0xf00000, 0xf7ffff);
-
- /* Install RAM */
- state->m_maincpu_program_space->install_readwrite_bank(0x9fc000, 0x9fffff, "bank3");
-
- /* Configure Banks */
- state->membank("bank2")->set_base(machine.root_device().memregion("user2")->base());
- state->membank("bank3")->set_base(ar_ram);
-
- amigacrt.ar1_spurious = 0;
-
- /* Install IRQ ACK callback */
- device_execute_interface::static_set_irq_acknowledge_callback(*machine.device<cpu_device>("maincpu"), device_irq_acknowledge_delegate(FUNC(amiga_state::amiga_ar1_irqack), state));
-}
-
-/***************************************************************************
-
- Amiga Action Replay MKII/MKIII
-
- Whenever you push the button, an overlay of the cartridge appears
- in RAM and an NMI interrupt is generated. Only reads are overlayed.
- Writes go directly to chipmem (so that the CPU can write the stack
- information for the NMI). Once the interrupt is taken, the cart
- disables the ROM overlay and checks it's internal mode register
- to see why it was invoked.
-
- When a breakpoint is set the cart replaces the target instruction
- with a trap, and adds a trap handler that it locates in the $100-$120
- area. The handler simply has one instruction: TST.B $BFE001. This cia
- access is monitored, and the conditions match (PC < 120 and a previous
- command requested the monitoring of the cia) then the cart is invoked.
-
-***************************************************************************/
-
-static void amiga_ar23_freeze( running_machine &machine );
-
-READ16_MEMBER( amiga_state::amiga_ar23_cia_r )
-{
- int pc = space.device().safe_pc();
-
- if ( ACCESSING_BITS_0_7 && offset == 2048 && pc >= 0x40 && pc < 0x120 )
- {
- amiga_ar23_freeze(space.machine());
- }
-
- return amiga_cia_r( space, offset, mem_mask );
-}
-
-WRITE16_MEMBER( amiga_state::amiga_ar23_mode_w )
-{
- if ( data & 2 )
- {
- space.install_read_handler(0xbfd000, 0xbfefff, read16_delegate(FUNC(amiga_state::amiga_ar23_cia_r), this));
- }
- else
- {
- space.install_read_handler(0xbfd000, 0xbfefff, read16_delegate(FUNC(amiga_state::amiga_cia_r), this));
- }
-
- amigacrt.ar23_mode = (data&0x3);
- if ( amigacrt.ar23_mode == 0 )
- amigacrt.ar23_mode = 1;
-
-}
-
-READ16_MEMBER( amiga_state::amiga_ar23_mode_r )
-{
- amiga_state *state = space.machine().driver_data<amiga_state>();
- UINT16 *mem = (UINT16 *)(*state->memregion( "user2" ));
-
- if ( ACCESSING_BITS_0_7 )
- {
- if ( offset < 2 )
- return (mem[offset] | (amigacrt.ar23_mode&3));
-
- if ( offset == 0x03 ) /* disable cart overlay on chip mem */
- {
- UINT32 mirror_mask = state->m_chip_ram.bytes();
-
- state->membank("bank1")->set_entry(0);
-
- while( (mirror_mask<<1) < 0x100000 )
- {
- mirror_mask |= ( mirror_mask << 1 );
- }
-
- /* overlay disabled, map RAM on 0x000000 */
- space.install_write_bank(0x000000, state->m_chip_ram.bytes() - 1, 0, mirror_mask, "bank1");
- }
- }
-
- return mem[offset];
-}
-
-WRITE16_MEMBER( amiga_state::amiga_ar23_chipmem_w )
-{
- if ( offset == (0x08/2) )
- {
- if ( amigacrt.ar23_mode & 1 )
- amiga_ar23_freeze(space.machine());
- }
-
- (*m_chip_ram_w)(this, offset * 2, data );
-}
-
-static void amiga_ar23_freeze( running_machine &machine )
-{
- amiga_state *state = machine.driver_data<amiga_state>();
- int pc = machine.device("maincpu")->safe_pc();
-
- /* only freeze if we're not inside the cart's ROM */
- if ( ((pc >> 16) & 0xfe ) != 0x40 )
- {
- /* get the cart's built-in ram */
- UINT16 *ar_ram = (UINT16 *)state->m_maincpu_program_space->get_write_ptr(0x440000);
-
- if ( ar_ram != NULL )
- {
- int i;
-
- for( i = 0; i < 0x100; i++ )
- ar_ram[0x7800+i] = CUSTOM_REG(i);
- }
-
- /* overlay the cart rom's in chipram */
- state->membank("bank1")->set_entry(2);
-
- /* writes go to chipram */
- state->m_maincpu_program_space->install_write_handler(0x000000, state->m_chip_ram.bytes() - 1, write16_delegate(FUNC(amiga_state::amiga_ar23_chipmem_w),state));
-
- /* trigger NMI irq */
- machine.device("maincpu")->execute().set_input_line(7, PULSE_LINE);
- }
-}
-
-static void amiga_ar23_nmi( running_machine &machine )
-{
- amigacrt.ar23_mode = 0;
- amiga_ar23_freeze(machine);
-}
-
-#if 0
-static WRITE16_HANDLER( amiga_ar23_custom_w )
-{
- int pc = space.device().safe_pc();
-
- /* see if we're inside the AR2 rom */
- if ( ((pc >> 16) & 0xfe ) != 0x40 )
- {
- /* get the cart's built-in ram */
- UINT16 *ar_ram = (UINT16 *)memory_get_write_ptr(0, AS_PROGRAM, 0x440000);
-
- if ( ar_ram != NULL )
- {
- ar_ram[0x7800+offset] = data;
- }
- }
-
- amiga_custom_w( offset, data, mem_mask );
-}
-
-static READ16_HANDLER( amiga_ar23_custom_r )
-{
- UINT16 data = amiga_custom_r( offset, mem_mask );
-
- int pc = space.device().safe_pc();
-
- /* see if we're inside the AR2 rom */
- if ( ((pc >> 16) & 0xfe ) != 0x40 )
- {
- /* get the cart's built-in ram */
- UINT16 *ar_ram = (UINT16 *)memory_get_write_ptr(0, AS_PROGRAM, 0x440000);
-
- if ( ar_ram != NULL )
- {
- ar_ram[0x7800+offset] = data;
- }
- }
-
- return data;
-}
-#endif
-
-static void amiga_ar23_check_overlay( running_machine &machine )
-{
- amiga_state *state = machine.driver_data<amiga_state>();
- amigacrt.ar23_mode = 3;
- state->m_maincpu_program_space->install_write_handler(0x000000, 0x00000f, write16_delegate(FUNC(amiga_state::amiga_ar23_chipmem_w),state));
-}
-
-void amiga_state::amiga_ar23_init( running_machine &machine, int ar3 )
-{
- amiga_state *state = machine.driver_data<amiga_state>();
- UINT32 mirror = 0x20000, size = 0x1ffff;
- void *ar_ram;
-
- /* check kickstart version */
- if ( !check_kickstart_12_13( machine, "Action Replay MKII or MKIII" ) )
- {
- amigacrt.cart_type = -1;
- return;
- }
-
- /* setup the cart ram */
- ar_ram = auto_alloc_array_clear(machine, UINT8,0x10000);
-
- if ( ar3 )
- {
- mirror = 0;
- size = 0x3ffff;
- }
-
- /* Install ROM */
- state->m_maincpu_program_space->install_read_bank(0x400000, 0x400000+size, 0, mirror, "bank2");
- state->m_maincpu_program_space->unmap_write(0x400000, 0x400000+size, 0, mirror);
-
- /* Install RAM */
- state->m_maincpu_program_space->install_read_bank(0x440000, 0x44ffff, "bank3");
- state->m_maincpu_program_space->install_write_bank(0x440000, 0x44ffff, "bank3");
-
- /* Install Custom chip monitor */
-// state->m_maincpu_program_space->install_legacy_read_handler(0xdff000, 0xdff1ff, FUNC(amiga_ar23_custom_r));
-// state->m_maincpu_program_space->install_legacy_write_handler(0xdff000, 0xdff1ff, FUNC(amiga_ar23_custom_w));
-
- /* Install status/mode handlers */
- state->m_maincpu_program_space->install_read_handler( 0x400000, 0x400007, 0, mirror, read16_delegate( FUNC(amiga_state::amiga_ar23_mode_r), this));
- state->m_maincpu_program_space->install_write_handler(0x400000, 0x400003, 0, mirror, write16_delegate(FUNC(amiga_state::amiga_ar23_mode_w), this));
-
- /* Configure Banks */
- state->membank("bank2")->set_base(machine.root_device().memregion("user2")->base());
- state->membank("bank3")->set_base(ar_ram);
-
- state->membank("bank1")->configure_entries(0, 2, state->m_chip_ram, 0);
- state->membank("bank1")->configure_entries(1, 2, machine.root_device().memregion("user1")->base(), 0);
- state->membank("bank1")->configure_entries(2, 2, machine.root_device().memregion("user2")->base(), 0);
-
- amigacrt.ar23_mode = 3;
-}
-
-/***************************************************************************
-
- MAME/MESS hooks
-
-***************************************************************************/
-
-void amiga_cart_init( running_machine &machine )
-{
- /* see what is there */
- UINT16 *mem = (UINT16 *)(*machine.root_device().memregion( "user2" ));
- amiga_state *state = machine.driver_data<amiga_state>();
-
- amigacrt.cart_type = -1;
-
- if ( mem != NULL )
- {
- if ( mem[0x00] == 0x1111 )
- {
- amigacrt.cart_type = ACTION_REPLAY;
- amiga_ar1_init(machine);
- }
- else if ( mem[0x0C] == 0x4D6B )
- {
- amigacrt.cart_type = ACTION_REPLAY_MKII;
- state->amiga_ar23_init(machine, 0);
- }
- else if ( mem[0x0C] == 0x4D4B )
- {
- amigacrt.cart_type = ACTION_REPLAY_MKIII;
- state->amiga_ar23_init(machine, 1);
- }
- }
-}
-
-void amiga_cart_check_overlay( running_machine &machine )
-{
- if ( amigacrt.cart_type < 0 )
- return;
-
- switch( amigacrt.cart_type )
- {
- case ACTION_REPLAY:
- amiga_ar1_check_overlay(machine);
- break;
-
- case ACTION_REPLAY_MKII:
- case ACTION_REPLAY_MKIII:
- amiga_ar23_check_overlay(machine);
- break;
- }
-}
-
-void amiga_cart_nmi( running_machine &machine )
-{
- if ( amigacrt.cart_type < 0 )
- return;
-
- switch( amigacrt.cart_type )
- {
- case ACTION_REPLAY:
- amiga_ar1_nmi(machine);
- break;
-
- case ACTION_REPLAY_MKII:
- case ACTION_REPLAY_MKIII:
- amiga_ar23_nmi(machine);
- break;
- }
-}
diff --git a/src/mess/machine/amigacrt.h b/src/mess/machine/amigacrt.h
deleted file mode 100644
index 6e603ed8b98..00000000000
--- a/src/mess/machine/amigacrt.h
+++ /dev/null
@@ -1,8 +0,0 @@
-#ifndef AMIGACRT_H
-#define AMIGACRT_H
-
-void amiga_cart_init( running_machine &machine );
-void amiga_cart_check_overlay( running_machine &machine );
-void amiga_cart_nmi( running_machine &machine );
-
-#endif /* AMIGACRT_H */
diff --git a/src/mess/machine/amigakbd.c b/src/mess/machine/amigakbd.c
index 5bd49545dab..f8f103e5cb2 100644
--- a/src/mess/machine/amigakbd.c
+++ b/src/mess/machine/amigakbd.c
@@ -21,7 +21,11 @@ const device_type AMIGAKBD = &device_creator<amigakbd_device>;
amigakbd_device::amigakbd_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: device_t(mconfig, AMIGAKBD, "Amiga Keyboard", tag, owner, clock, "amigakbd", __FILE__),
m_write_kclk(*this),
- m_write_kdat(*this)
+ m_write_kdat(*this),
+ m_buf(NULL),
+ m_buf_pos(0),
+ m_cur_pos(0),
+ m_timer(NULL)
{
}
@@ -36,8 +40,6 @@ void amigakbd_device::device_start()
/* allocate a keyboard buffer */
m_buf = auto_alloc_array(machine(), UINT8, KEYBOARD_BUFFER_SIZE);
- m_buf_pos = 0;
- m_cur_pos = 0;
m_timer = timer_alloc(0);
m_timer->reset();
}
@@ -82,46 +84,33 @@ void amigakbd_device::device_timer(emu_timer &timer, device_timer_id id, int par
}
}
-INPUT_CHANGED_MEMBER(amigakbd_device::kbd_update)
+INPUT_CHANGED_MEMBER( amigakbd_device::kbd_update )
{
int index = (int)(FPTR)param, i;
UINT32 oldvalue = oldval * field.mask(), newvalue = newval * field.mask();
UINT32 delta = oldvalue ^ newvalue;
- /* Special case Page UP, which we will use as Action Replay button */
- if ( (index == 3) && ( delta & 0x80000000 ) && ( newvalue & 0x80000000 ) )
- {
- const amiga_machine_interface *amiga_intf = amiga_get_interface(machine());
+ int key_buf_was_empty = ( m_buf_pos == m_cur_pos ) ? 1 : 0;
- if ( amiga_intf != NULL && amiga_intf->nmi_callback )
- {
- (*amiga_intf->nmi_callback)(machine());
- }
- }
- else
+ for( i = 0; i < 32; i++ )
{
- int key_buf_was_empty = ( m_buf_pos == m_cur_pos ) ? 1 : 0;
-
- for( i = 0; i < 32; i++ )
+ if ( delta & ( 1 << i ) )
{
- if ( delta & ( 1 << i ) )
- {
- int down = ( newvalue & ( 1 << i ) ) ? 0 : 1;
- int scancode = ( ( (index*32)+i ) << 1 ) | down;
- int amigacode = ~scancode;
-
- /* add the keycode to the buffer */
- m_buf[m_buf_pos++] = amigacode & 0xff;
- m_buf_pos %= KEYBOARD_BUFFER_SIZE;
- }
- }
+ int down = ( newvalue & ( 1 << i ) ) ? 0 : 1;
+ int scancode = ( ( (index*32)+i ) << 1 ) | down;
+ int amigacode = ~scancode;
- /* if the buffer was empty and we have new data, start a timer to send the keystrokes */
- if ( key_buf_was_empty && ( m_buf_pos != m_cur_pos ) )
- {
- m_timer->adjust(machine().first_screen()->frame_period() / 4);
+ /* add the keycode to the buffer */
+ m_buf[m_buf_pos++] = amigacode & 0xff;
+ m_buf_pos %= KEYBOARD_BUFFER_SIZE;
}
}
+
+ /* if the buffer was empty and we have new data, start a timer to send the keystrokes */
+ if ( key_buf_was_empty && ( m_buf_pos != m_cur_pos ) )
+ {
+ m_timer->adjust(machine().first_screen()->frame_period() / 4);
+ }
}
/*********************************************************************************************/
@@ -274,3 +263,17 @@ ioport_constructor amigakbd_device::device_input_ports() const
{
return INPUT_PORTS_NAME( amiga_us_keyboard );
}
+
+//-------------------------------------------------
+// rom_region - device-specific ROM region
+//-------------------------------------------------
+
+ROM_START( keyboard_mpu )
+ ROM_REGION(0x800, "keyboard", 0)
+ ROM_LOAD("328191-01.ic1", 0x000, 0x800, NO_DUMP)
+ROM_END
+
+const rom_entry *amigakbd_device::device_rom_region() const
+{
+ return ROM_NAME( keyboard_mpu );
+}
diff --git a/src/mess/machine/amigakbd.h b/src/mess/machine/amigakbd.h
index 904e3c61350..bec639c6c35 100644
--- a/src/mess/machine/amigakbd.h
+++ b/src/mess/machine/amigakbd.h
@@ -30,6 +30,7 @@ public:
// optional information overrides
virtual ioport_constructor device_input_ports() const;
+ virtual const rom_entry *device_rom_region() const;
DECLARE_INPUT_CHANGED_MEMBER( kbd_update );
diff --git a/src/mess/mess.lst b/src/mess/mess.lst
index 8d5b53777d6..97809d66ede 100644
--- a/src/mess/mess.lst
+++ b/src/mess/mess.lst
@@ -699,20 +699,30 @@ c128dcr_de
c128dcr_se
c128d81
-a1000 // Commodore Amiga 1000
-a1000n //
-a500 // Commodore Amiga 500
-a500n //
-a500pl // Commodore Amiga 500+
-a500pln //
-a600 // Commodore Amiga 600
-a600n //
-a3000 // Commodore Amiga 3000
-a3000n //
-a1200 // Commodore Amiga 1200
-a1200n //
-cdtv // Commodore CDTV
-cd32 // Commodore Amiga CD32
+a1000 // Commodore Amiga 1000
+a1000n
+a2000 // Commodore Amiga 2000
+a2000n
+a500 // Commodore Amiga 500
+a500n
+cdtv // Commodore CDTV
+cdtvn
+a3000 // Commodore Amiga 3000
+a3000n
+a500p // Commodore Amiga 500 Plus
+a500pn
+a600 // Commodore Amiga 600
+a600n
+a1200 // Commodore Amiga 1200
+a1200n
+a4000 // Commodore Amiga 4000/040
+a4000n
+a400030 // Commodore Amiga 4000/030
+a400030n
+cd32 // Commodore Amiga CD32
+cd32n
+a4000t // Commodore Amiga 4000T
+a4000tn
c65 // 1991 C65 / C64DX (Prototype, NTSC)
c64dx // 1991 C65 / C64DX (Prototype, German PAL)
diff --git a/src/mess/mess.mak b/src/mess/mess.mak
index a1638fc85b0..e2ae5ac268a 100644
--- a/src/mess/mess.mak
+++ b/src/mess/mess.mak
@@ -163,6 +163,7 @@ SOUNDS += SN76496
SOUNDS += POKEY
SOUNDS += TIA
SOUNDS += NES_APU
+SOUNDS += AMIGA
SOUNDS += ASTROCADE
#SOUNDS += NAMCO
#SOUNDS += NAMCO_15XX
@@ -324,6 +325,10 @@ VIDEOS += VIC4567
# specify available machine cores
#-------------------------------------------------
+MACHINES += AKIKO
+MACHINES += AUTOCONFIG
+MACHINES += CR511B
+MACHINES += DMAC
#MACHINES += NCR53C7XX
#MACHINES += LSI53C810
MACHINES += 6522VIA
@@ -610,6 +615,7 @@ BUSES += VIP
BUSES += WANGPC
BUSES += X68K
BUSES += Z88
+BUSES += ZORRO
#-------------------------------------------------
# this is the list of driver libraries that
@@ -812,8 +818,6 @@ $(MESSOBJ)/mame.a: \
$(MAME_VIDEO)/amiga.o \
$(MAME_VIDEO)/amigaaga.o \
$(MAME_MACHINE)/amiga.o \
- $(MAME_AUDIO)/amiga.o \
- $(MAME_MACHINE)/cd32.o \
$(MAME_VIDEO)/tia.o \
$(MAME_MACHINE)/atari.o \
$(MAME_VIDEO)/atari.o \
@@ -860,7 +864,6 @@ $(MESSOBJ)/mame.a: \
$(MAME_MACHINE)/cdicdic.o \
$(MAME_MACHINE)/cdislave.o \
$(MAME_VIDEO)/mcd212.o \
- $(MAME_DRIVERS)/cd32.o \
$(MAME_DRIVERS)/3do.o \
$(MAME_MACHINE)/3do.o \
$(MAME_DRIVERS)/vectrex.o \
@@ -928,8 +931,6 @@ $(MESSOBJ)/altos.a: \
$(MESS_DRIVERS)/altos5.o \
$(MESSOBJ)/amiga.a: \
- $(MESS_MACHINE)/amigacrt.o \
- $(MESS_MACHINE)/amigacd.o \
$(MESS_MACHINE)/amigakbd.o \
$(MESS_DRIVERS)/amiga.o \