summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/amiga.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/amiga.cpp')
-rw-r--r--src/mame/drivers/amiga.cpp2473
1 files changed, 0 insertions, 2473 deletions
diff --git a/src/mame/drivers/amiga.cpp b/src/mame/drivers/amiga.cpp
deleted file mode 100644
index f8aed0bf07c..00000000000
--- a/src/mame/drivers/amiga.cpp
+++ /dev/null
@@ -1,2473 +0,0 @@
-// license:GPL-2.0+
-// copyright-holders:Dirk Best
-/***************************************************************************
-
- Commodore Amiga
-
-***************************************************************************/
-
-#include "emu.h"
-#include "includes/amiga.h"
-
-#include "bus/amiga/keyboard/keyboard.h"
-#include "bus/amiga/zorro/zorro.h"
-#include "bus/ata/ataintf.h"
-#include "cpu/m68000/m68000.h"
-#include "cpu/m6502/m6502.h"
-#include "machine/bankdev.h"
-#include "machine/6525tpi.h"
-#include "machine/mos6526.h"
-#include "machine/gayle.h"
-#include "machine/dmac.h"
-#include "machine/nvram.h"
-#include "machine/i2cmem.h"
-#include "machine/amigafdc.h"
-#include "machine/cr511b.h"
-#include "machine/rp5c01.h"
-#include "softlist.h"
-#include "speaker.h"
-
-
-//**************************************************************************
-// CONSTANTS / MACROS
-//**************************************************************************
-
-#define EXP_SLOT_TAG "exp"
-
-
-//**************************************************************************
-// PRIVATE DEVICES
-//**************************************************************************
-
-/*
-The keyboard reset/power-on reset circuit for the Amiga 2000 is built
-around the LM339 at U805 (top left on sheet 3 of the schematic). To
-simplify things, we assume all components are ideal.
-
-In stead idle state:
-* /KBCLK is high
-* U805 pin 1 is driven low, holding C813 discharged
-* U805 pin 2 is not driven, allowing C814 to remain charged
-* U805 pin 13 is driven low setting thresholds to 2.0V and 1.0V
-* U805 pin 14 is not driven, leaving /KBRST deasserted
-
-When /KBCLK is asserted, C814 is allowed to charge. A short pulse will
-not give it sufficient time to charge past the 2.0V threshold on pin 5
-and the circuit will remain in idle.
-
-If /KBCLK is asserted for over 112ms:
-* U805 pin 1 is not driven, allowing C813 to charge past 2.0V
-* U805 pin 2 is driven low, discharging C814
-* U805 pin 13 is not driven, raising thresholds to 2.86V and 3.57V
-* U805 pin 14 is driven low, asserting /KBRST
-
-The thresholds changing will cause U805 pin 2 to float, allowing C814 to
-begin charging. If /KBCLK is asserted for a further 74 milliseconds,
-U805 pin 2 will be driven low keeping C814 discharged until /KBCLK is
-deasserted.
-
-C814 (22µF) will charge via R805 (47kΩ) until it reaches the 3.57V
-threshold, ensuring the minimum length of a reset pulse is 1.294s.
-
-The power-on reset signal is also allowed to discharge C814, but we
-ignore this for simplicity. Earlier boards use a 1N4148 signal diode,
-while later boards replace it with a PST518B at XU1.
-
-The equivalent circuit in the Amiga 1000 works similarly, but has
-different components:
-* 10µF/22kΩ (C104/R62) for timing /KBCLK pulse
-* 10µF/100kΩ (C105/R63) for minimum /KBRESET pulse duration
-* Thresholds of 2.499/2.501V and 2.474V/2.526V
-* BAS32L diode for power-on reset
-* This gives delays of 152ms, 176µs, and 704ms
-
-The equivalent circuit in the Amiga CDTV has the same thresholds as the
-Amiga 2000, but uses 1kΩ resistors for timing. This gives delays of
-11.2ms, 7.43ms, and 27.5ms.
-
-*/
-
-DECLARE_DEVICE_TYPE(A1000_KBRESET, a1000_kbreset_device)
-
-class a1000_kbreset_device : public device_t
-{
-public:
- a1000_kbreset_device(machine_config const &config, char const *tag, device_t *owner, u32 clock = 0U) :
- device_t(config, A1000_KBRESET, tag, owner, clock),
- m_kbrst_cb(*this)
- {
- }
-
- auto kbrst_cb() { return m_kbrst_cb.bind(); }
-
- a1000_kbreset_device &set_delays(attotime detect, attotime stray, attotime output)
- {
- m_detect_time = detect;
- m_stray_time = stray;
- m_output_time = output;
- return *this;
- }
-
- DECLARE_WRITE_LINE_MEMBER(kbclk_w)
- {
- if (bool(state) != bool(m_kbclk))
- {
- m_kbclk = state ? 1U : 0U;
- if (state)
- {
- // U805 pin 1 driven low - discharges C813
- m_c813_level = 0U;
- m_c813_timer->reset();
-
- // U805 pin 2 floating - allows C814 to charge
- if (!m_c814_charging)
- {
- m_c814_charging = 1U;
- m_c814_timer->adjust(m_output_time); // 0V to 3.57V
- }
- }
- else
- {
- // U805 pin 1 floating - allows C813 to charge
- assert(0U == m_c813_level);
- m_c813_timer->adjust(m_detect_time); // 0V to 2V
- }
- }
- }
-
-protected:
- virtual void device_resolve_objects() override
- {
- m_kbrst_cb.resolve_safe();
- }
-
- virtual void device_start() override
- {
- // allocate resources
- m_c813_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(a1000_kbreset_device::c813_charged), this));
- m_c814_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(a1000_kbreset_device::c814_charged), this));
-
- // start in idle state
- m_kbclk = 1U;
- m_kbrst = 1U;
- m_c813_level = 0U;
- m_c814_charging = 1U;
-
- // always better to save state
- save_item(NAME(m_kbclk));
- save_item(NAME(m_kbrst));
- save_item(NAME(m_c813_level));
- save_item(NAME(m_c814_charging));
- }
-
-private:
- TIMER_CALLBACK_MEMBER(c813_charged)
- {
- assert(2U > m_c813_level);
- if (2U > ++m_c813_level)
- m_c813_timer->adjust(m_stray_time); // 2V to 2.86V
-
- if ((m_kbrst ? 0U : 1U) < m_c813_level)
- {
- // U805 pin 2 driven low - discharges C814
- if (2U > m_c813_level)
- {
- assert(m_c814_charging);
- m_c814_timer->adjust(m_output_time); // 0V to 3.57V
- }
- else
- {
- m_c814_charging = 0U;
- m_c814_timer->reset();
- }
- if (m_kbrst)
- m_kbrst_cb(m_kbrst = 0U);
- }
- }
-
- TIMER_CALLBACK_MEMBER(c814_charged)
- {
- // C814 above high threshold - /KBRST deasserted
- assert(m_c814_charging);
- assert(!m_kbrst);
- m_kbrst_cb(m_kbrst = 1U);
-
- // if C813 is between 2.0V and 2.86V, lowering the threshold will discharge C814
- assert(2U > m_c813_level);
- if (0U < m_c813_level)
- {
- // threshold is bumped back up
- m_kbrst_cb(m_kbrst = 0U);
- m_c814_timer->adjust(m_output_time); // 0V to 3.57V
- }
- }
-
- attotime m_detect_time = attotime::from_msec(112);
- attotime m_stray_time = attotime::from_msec(74);
- attotime m_output_time = attotime::from_msec(1294);
-
- devcb_write_line m_kbrst_cb;
-
- emu_timer *m_c813_timer = nullptr; // C813 = 22µF, R802 = 10kΩ
- emu_timer *m_c814_timer = nullptr; // C814 = 22µF, R805 = 47kΩ
-
- u8 m_kbclk = 1U; // /KBCLK input
- u8 m_kbrst = 1U; // /KBRST output
- u8 m_c813_level = 0U; // 0 = 0V-2V, 1 = 2V - 2.86V, 2 = 2.86V - 5V
- u8 m_c814_charging = 1U; // U805 pin 2
-};
-
-DEFINE_DEVICE_TYPE(A1000_KBRESET, a1000_kbreset_device, "a1000kbrst", "Amiga 1000/2000/CDTV keyboard reset circuit")
-
-
-//**************************************************************************
-// TYPE DEFINITIONS
-//**************************************************************************
-
-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")
- { }
-
- void init_pal();
- void init_ntsc();
-
- DECLARE_WRITE16_MEMBER( write_protect_w );
-
- void a1000(machine_config &config);
- void a1000n(machine_config &config);
- void a1000_bootrom_map(address_map &map);
- void a1000_mem(address_map &map);
- void a1000_overlay_map(address_map &map);
-protected:
- virtual void machine_start() override;
- virtual void machine_reset() override;
-
-private:
- required_device<address_map_bank_device> m_bootrom;
- required_memory_bank m_wom;
- std::vector<u16> 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_zorro(*this, "zorrobus"),
- m_zorro2_int2(0),
- m_zorro2_int6(0)
- { }
-
- void init_pal();
- void 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 );
-
- void a2000(machine_config &config);
- void a2000n(machine_config &config);
- void a2000_mem(address_map &map);
-protected:
- virtual void machine_reset() override;
-
- // amiga_state overrides
- virtual bool int2_pending() override;
- virtual bool int6_pending() override;
-
-private:
- // devices
- required_device<msm6242_device> m_rtc;
- required_device<zorro2_bus_device> m_zorro;
-
- // 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(*this, EXP_SLOT_TAG),
- m_side_int2(0),
- m_side_int6(0)
- { }
-
- void init_pal();
- void init_ntsc();
-
- DECLARE_WRITE_LINE_MEMBER( side_int2_w );
- DECLARE_WRITE_LINE_MEMBER( side_int6_w );
-
- void a500n(machine_config &config);
- void a500(machine_config &config);
- void a500_mem(address_map &map);
-protected:
- virtual void machine_reset() override;
-
- // amiga_state overrides
- virtual bool int2_pending() override;
- virtual bool int6_pending() override;
-
-private:
- // devices
- required_device<exp_slot_device> m_side;
-
- // 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),
- m_rtc(*this, "u61"),
- m_dmac(*this, "u36"),
- m_tpi(*this, "u32"),
- m_cdrom(*this, "cdrom"),
- m_dmac_irq(0),
- m_tpi_irq(0)
- { }
-
- void init_pal();
- void 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 );
-
- void cdtv(machine_config &config);
- void cdtvn(machine_config &config);
- void cdtv_mem(address_map &map);
- void cdtv_rc_mem(address_map &map);
-protected:
- // driver_device overrides
- virtual void machine_start() override;
-
- // amiga_state overrides
- virtual bool int2_pending() override;
- virtual bool int6_pending() override;
-
-private:
- // devices
- required_device<msm6242_device> m_rtc;
- required_device<amiga_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)
- { }
-
- DECLARE_READ32_MEMBER( scsi_r );
- DECLARE_WRITE32_MEMBER( scsi_w );
- DECLARE_READ32_MEMBER( motherboard_r );
- DECLARE_WRITE32_MEMBER( motherboard_w );
-
- void init_pal();
- void init_ntsc();
-
- void a3000(machine_config &config);
- void a3000n(machine_config &config);
- void a3000_mem(address_map &map);
-protected:
-
-private:
-};
-
-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(*this, EXP_SLOT_TAG),
- m_side_int2(0),
- m_side_int6(0)
- { }
-
- DECLARE_READ16_MEMBER( clock_r );
- DECLARE_WRITE16_MEMBER( clock_w );
-
- void init_pal();
- void init_ntsc();
-
- void a500pn(machine_config &config);
- void a500p(machine_config &config);
- void a500p_mem(address_map &map);
-protected:
- virtual void machine_reset() override;
-
- // amiga_state overrides
- virtual bool int2_pending() override;
- virtual bool int6_pending() override;
-
-private:
- // devices
- required_device<msm6242_device> m_rtc;
- required_device<exp_slot_device> m_side;
-
- // 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_int2(0)
- { }
-
- DECLARE_WRITE_LINE_MEMBER( gayle_int2_w );
-
- void init_pal();
- void init_ntsc();
-
- static const u8 GAYLE_ID = 0xd0;
-
- void a600n(machine_config &config);
- void a600(machine_config &config);
- void a600_mem(address_map &map);
-protected:
- virtual bool int2_pending() override;
-
-private:
- int m_gayle_int2;
-};
-
-class a1200_state : public amiga_state
-{
-public:
- a1200_state(const machine_config &mconfig, device_type type, const char *tag) :
- amiga_state(mconfig, type, tag),
- m_gayle_int2(0)
- { }
-
- DECLARE_WRITE_LINE_MEMBER( gayle_int2_w );
-
- void init_pal();
- void init_ntsc();
-
- static const u8 GAYLE_ID = 0xd1;
-
- void a1200(machine_config &config);
- void a1200n(machine_config &config);
- void a1200_mem(address_map &map);
-protected:
- virtual bool int2_pending() override;
-
-private:
- int m_gayle_int2;
-};
-
-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_ata(*this, "ata"),
- m_ramsey_config(0),
- m_gary_coldboot(1),
- m_gary_timeout(0),
- m_gary_toenb(0),
- m_ide_interrupt(0)
- { }
-
- DECLARE_READ32_MEMBER( scsi_r );
- DECLARE_WRITE32_MEMBER( scsi_w );
- DECLARE_READ16_MEMBER( ide_r );
- DECLARE_WRITE16_MEMBER( ide_w );
- DECLARE_WRITE_LINE_MEMBER( ide_interrupt_w );
- DECLARE_READ32_MEMBER( motherboard_r );
- DECLARE_WRITE32_MEMBER( motherboard_w );
-
- void init_pal();
- void init_ntsc();
-
- void a400030n(machine_config &config);
- void a4000tn(machine_config &config);
- void a4000t(machine_config &config);
- void a4000n(machine_config &config);
- void a4000(machine_config &config);
- void a400030(machine_config &config);
- void a400030_mem(address_map &map);
- void a4000_mem(address_map &map);
- void a4000t_mem(address_map &map);
-protected:
-
-private:
- required_device<ata_interface_device> m_ata;
-
- int m_ramsey_config;
- int m_gary_coldboot;
- int m_gary_timeout;
- int m_gary_toenb;
- int m_ide_interrupt;
-};
-
-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_player_ports(*this, {"p1_cd32_buttons", "p2_cd32_buttons"}),
- m_cdda(*this, "cdda")
- { }
-
- DECLARE_WRITE_LINE_MEMBER( akiko_int_w );
- DECLARE_WRITE8_MEMBER( akiko_cia_0_port_a_write );
-
- void handle_joystick_cia(u8 pra, u8 dra);
- u16 handle_joystick_potgor(u16 potgor);
-
- DECLARE_CUSTOM_INPUT_MEMBER( cd32_input );
- template <int P> DECLARE_READ_LINE_MEMBER( cd32_sel_mirror_input );
-
- void init_pal();
- void init_ntsc();
-
- required_ioport_array<2> m_player_ports;
-
- int m_oldstate[2];
- int m_cd32_shifter[2];
- u16 m_potgo_value;
-
- void cd32n(machine_config &config);
- void cd32(machine_config &config);
- void cd32_mem(address_map &map);
-protected:
- // amiga_state overrides
- virtual void potgo_w(u16 data) override;
-
-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);
-}
-
-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);
-}
-
-READ16_MEMBER( a500p_state::clock_r )
-{
- return m_rtc->read(space, offset / 2);
-}
-
-WRITE16_MEMBER( a500p_state::clock_w )
-{
- m_rtc->write(space, offset / 2, data);
-}
-
-
-//**************************************************************************
-// CD-ROM CONTROLLER
-//**************************************************************************
-
-READ8_MEMBER( cdtv_state::dmac_scsi_data_read )
-{
- if (offset >= 0xb0 && offset <= 0xbf)
- return m_tpi->read(offset);
-
- return 0xff;
-}
-
-WRITE8_MEMBER( cdtv_state::dmac_scsi_data_write )
-{
- if (offset >= 0xb0 && offset <= 0xbf)
- m_tpi->write(offset, data);
-}
-
-READ8_MEMBER( cdtv_state::dmac_io_read )
-{
- return m_cdrom->read(space, 0);
-}
-
-WRITE8_MEMBER( cdtv_state::dmac_io_write )
-{
- m_cdrom->write(space, 0, data);
-}
-
-WRITE_LINE_MEMBER( cdtv_state::dmac_int_w )
-{
- m_dmac_irq = state;
- update_int2();
-}
-
-WRITE8_MEMBER( cdtv_state::tpi_port_b_write )
-{
- m_cdrom->cmd_w(BIT(data, 0));
- m_cdrom->enable_w(BIT(data, 1));
-}
-
-WRITE_LINE_MEMBER( cdtv_state::tpi_int_w )
-{
- m_tpi_irq = state;
- update_int2();
-}
-
-
-//**************************************************************************
-// DRIVER INIT
-//**************************************************************************
-
-// ocs chipset (agnus with support for 512k or 1mb chip ram, denise)
-void a1000_state::init_pal()
-{
- m_agnus_id = AGNUS_PAL; // 8367
- m_denise_id = DENISE; // 8362
-}
-
-void a1000_state::init_ntsc()
-{
- m_agnus_id = AGNUS_NTSC; // 8361
- m_denise_id = DENISE; // 8362
-}
-
-void a2000_state::init_pal()
-{
- m_agnus_id = AGNUS_PAL; // 8371 (later versions 8372A)
- m_denise_id = DENISE; // 8362
-}
-
-void a2000_state::init_ntsc()
-{
- m_agnus_id = AGNUS_NTSC; // 8370 (later versions 8372A)
- m_denise_id = DENISE; // 8362
-}
-
-void a500_state::init_pal()
-{
- m_agnus_id = AGNUS_PAL; // 8371 (later versions 8372A)
- m_denise_id = DENISE; // 8362
-}
-
-void a500_state::init_ntsc()
-{
- m_agnus_id = AGNUS_NTSC; // 8370 (later versions 8372A)
- m_denise_id = DENISE; // 8362
-}
-
-void cdtv_state::init_pal()
-{
- m_agnus_id = AGNUS_HR_PAL; // 8372A
- m_denise_id = DENISE; // 8362
-}
-
-void cdtv_state::init_ntsc()
-{
- m_agnus_id = AGNUS_HR_NTSC; // 8372A
- m_denise_id = DENISE; // 8362
-}
-
-// ecs chipset (agnus with support for 2mb chip ram, super denise)
-void a3000_state::init_pal()
-{
- m_agnus_id = AGNUS_HR_PAL_NEW; // 8372B (early versions: 8372AB)
- m_denise_id = DENISE_HR; // 8373
-}
-
-void a3000_state::init_ntsc()
-{
- m_agnus_id = AGNUS_HR_NTSC_NEW; // 8372B (early versions: 8372AB)
- m_denise_id = DENISE_HR; // 8373
-}
-
-void a500p_state::init_pal()
-{
- m_agnus_id = AGNUS_HR_PAL; // 8375 (390544-01)
- m_denise_id = DENISE_HR; // 8373
-}
-
-void a500p_state::init_ntsc()
-{
- m_agnus_id = AGNUS_HR_NTSC; // 8375 (390544-02)
- m_denise_id = DENISE_HR; // 8373
-}
-
-void a600_state::init_pal()
-{
- m_agnus_id = AGNUS_HR_PAL; // 8375 (390544-01)
- m_denise_id = DENISE_HR; // 8373
-}
-
-void a600_state::init_ntsc()
-{
- m_agnus_id = AGNUS_HR_NTSC; // 8375 (390544-02)
- m_denise_id = DENISE_HR; // 8373
-}
-
-// aga chipset (alice and lisa)
-void a1200_state::init_pal()
-{
- m_agnus_id = ALICE_PAL_NEW;
- m_denise_id = LISA;
-}
-
-void a1200_state::init_ntsc()
-{
- m_agnus_id = ALICE_NTSC_NEW;
- m_denise_id = LISA;
-}
-
-void a4000_state::init_pal()
-{
- m_agnus_id = ALICE_PAL_NEW;
- m_denise_id = LISA;
-}
-
-void a4000_state::init_ntsc()
-{
- m_agnus_id = ALICE_NTSC_NEW;
- m_denise_id = LISA;
-}
-
-void cd32_state::init_pal()
-{
- m_agnus_id = ALICE_PAL_NEW;
- m_denise_id = LISA;
-}
-
-void cd32_state::init_ntsc()
-{
- m_agnus_id = ALICE_NTSC_NEW;
- m_denise_id = LISA;
-}
-
-
-//**************************************************************************
-// MACHINE EMULATION
-//**************************************************************************
-
-void a1000_state::machine_start()
-{
- // start base machine
- amiga_state::machine_start();
-
- // allocate 256kb for wom
- m_wom_ram.resize(256 * 1024 / 2);
- m_wom->set_base(&m_wom_ram[0]);
-}
-
-void a1000_state::machine_reset()
-{
- // base reset
- amiga_state::machine_reset();
-
- // bootrom visible, wom writable
- m_bootrom->set_bank(0);
- m_maincpu->space(AS_PROGRAM).install_write_bank(0xfc0000, 0xffffff, "wom");
-}
-
-// any write to this area will write protect the wom and disable the bootrom
-WRITE16_MEMBER( a1000_state::write_protect_w )
-{
- m_bootrom->set_bank(1);
- m_maincpu->space(AS_PROGRAM).nop_write(0xfc0000, 0xffffff);
-}
-
-void a2000_state::machine_reset()
-{
- // base reset
- amiga_state::machine_reset();
-
- // reset zorro devices
- m_zorro->reset();
-}
-
-WRITE_LINE_MEMBER( a2000_state::zorro2_int2_w )
-{
- m_zorro2_int2 = state;
- update_int2();
-}
-
-WRITE_LINE_MEMBER( a2000_state::zorro2_int6_w )
-{
- m_zorro2_int6 = state;
- update_int6();
-}
-
-bool a2000_state::int2_pending()
-{
- return m_cia_0_irq || m_zorro2_int2;
-}
-
-bool a2000_state::int6_pending()
-{
- return m_cia_1_irq || m_zorro2_int6;
-}
-
-void a500_state::machine_reset()
-{
- // base reset
- amiga_state::machine_reset();
-
- // reset side expansion slot device
- m_side->reset();
-}
-
-WRITE_LINE_MEMBER( a500_state::side_int2_w )
-{
- m_side_int2 = state;
- update_int2();
-}
-
-WRITE_LINE_MEMBER( a500_state::side_int6_w )
-{
- m_side_int6 = state;
- update_int6();
-}
-
-bool a500_state::int2_pending()
-{
- return m_cia_0_irq || m_side_int2;
-}
-
-bool a500_state::int6_pending()
-{
- return m_cia_1_irq || m_side_int6;
-}
-
-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);
-}
-
-bool cdtv_state::int2_pending()
-{
- return m_cia_0_irq || m_dmac_irq || m_tpi_irq;
-}
-
-bool cdtv_state::int6_pending()
-{
- return m_cia_1_irq;
-}
-
-READ32_MEMBER( a3000_state::scsi_r )
-{
- u32 data = 0xffffffff;
- logerror("scsi_r(%06x): %08x & %08x\n", offset, data, mem_mask);
- return data;
-}
-
-WRITE32_MEMBER( a3000_state::scsi_w )
-{
- logerror("scsi_w(%06x): %08x & %08x\n", offset, data, mem_mask);
-}
-
-READ32_MEMBER( a3000_state::motherboard_r )
-{
- u32 data = 0xffffffff;
- logerror("motherboard_r(%06x): %08x & %08x\n", offset, data, mem_mask);
- return data;
-}
-
-WRITE32_MEMBER( a3000_state::motherboard_w )
-{
- logerror("motherboard_w(%06x): %08x & %08x\n", offset, data, mem_mask);
-}
-
-void a500p_state::machine_reset()
-{
- // base reset
- amiga_state::machine_reset();
-
- // reset side expansion slot device
- m_side->reset();
-}
-
-bool a500p_state::int2_pending()
-{
- return m_cia_0_irq || m_side_int2;
-}
-
-bool a500p_state::int6_pending()
-{
- return m_cia_1_irq || m_side_int6;
-}
-
-bool a600_state::int2_pending()
-{
- return m_cia_0_irq || m_gayle_int2;
-}
-
-WRITE_LINE_MEMBER( a600_state::gayle_int2_w )
-{
- m_gayle_int2 = state;
- update_int2();
-}
-
-bool a1200_state::int2_pending()
-{
- return m_cia_0_irq || m_gayle_int2;
-}
-
-WRITE_LINE_MEMBER( a1200_state::gayle_int2_w )
-{
- m_gayle_int2 = state;
- update_int2();
-}
-
-READ32_MEMBER( a4000_state::scsi_r )
-{
- u16 data = 0xffff;
- logerror("scsi_r(%06x): %08x & %08x\n", offset, data, mem_mask);
- return data;
-}
-
-WRITE32_MEMBER( a4000_state::scsi_w )
-{
- logerror("scsi_w(%06x): %08x & %08x\n", offset, data, mem_mask);
-}
-
-READ16_MEMBER( a4000_state::ide_r )
-{
- u16 data = 0xffff;
-
- // ide interrupt register
- if (offset == 0x1010)
- return m_ide_interrupt << 15;
-
- // swap
- mem_mask = (mem_mask << 8) | (mem_mask >> 8);
-
- // this very likely doesn't respond to all the addresses, figure out which ones
- if (BIT(offset, 12))
- data = m_ata->read_cs1((offset >> 1) & 0x07, mem_mask);
- else
- data = m_ata->read_cs0((offset >> 1) & 0x07, mem_mask);
-
- // swap
- data = (data << 8) | (data >> 8);
-
- return data;
-}
-
-WRITE16_MEMBER( a4000_state::ide_w )
-{
- // ide interrupt register, read only
- if (offset == 0x1010)
- return;
-
- // swap
- mem_mask = (mem_mask << 8) | (mem_mask >> 8);
- data = (data << 8) | (data >> 8);
-
- // this very likely doesn't respond to all the addresses, figure out which ones
- if (BIT(offset, 12))
- m_ata->write_cs1((offset >> 1) & 0x07, data, mem_mask);
- else
- m_ata->write_cs0((offset >> 1) & 0x07, data, mem_mask);
-}
-
-WRITE_LINE_MEMBER( a4000_state::ide_interrupt_w )
-{
- m_ide_interrupt = state;
-}
-
-READ32_MEMBER( a4000_state::motherboard_r )
-{
- u32 data = 0;
-
- 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;
-
- logerror("motherboard_r(%06x): %08x & %08x\n", offset, data, mem_mask);
-
- return data;
-}
-
-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);
- }
-
- logerror("motherboard_w(%06x): %08x & %08x\n", offset, data, mem_mask);
-}
-
-WRITE_LINE_MEMBER(cd32_state::akiko_int_w)
-{
- set_interrupt(INTENA_SETCLR | INTENA_PORTS);
-}
-
-void cd32_state::potgo_w(u16 data)
-{
- int i;
-
- m_potgo_value = m_potgo_value & 0x5500;
- m_potgo_value |= data & 0xaa00;
-
- for (i = 0; i < 8; i += 2)
- {
- u16 dir = 0x0200 << i;
- if (data & dir)
- {
- u16 d = 0x0100 << i;
- m_potgo_value &= ~d;
- m_potgo_value |= data & d;
- }
- }
- for (i = 0; i < 2; i++)
- {
- u16 p5dir = 0x0200 << (i * 4); /* output enable P5 */
- u16 p5dat = 0x0100 << (i * 4); /* data P5 */
- if ((m_potgo_value & p5dir) && (m_potgo_value & p5dat))
- m_cd32_shifter[i] = 8;
- }
-}
-
-void cd32_state::handle_joystick_cia(u8 pra, u8 dra)
-{
- for (int i = 0; i < 2; i++)
- {
- u8 but = 0x40 << i;
- u16 p5dir = 0x0200 << (i * 4); /* output enable P5 */
- u16 p5dat = 0x0100 << (i * 4); /* data P5 */
-
- if (!(m_potgo_value & p5dir) || !(m_potgo_value & p5dat))
- {
- if ((dra & but) && (pra & but) != m_oldstate[i])
- {
- if (!(pra & but))
- {
- m_cd32_shifter[i]--;
- if (m_cd32_shifter[i] < 0)
- m_cd32_shifter[i] = 0;
- }
- }
- }
- m_oldstate[i] = pra & but;
- }
-}
-
-u16 cd32_state::handle_joystick_potgor(u16 potgor)
-{
- for (int i = 0; i < 2; i++)
- {
- u16 p9dir = 0x0800 << (i * 4); /* output enable P9 */
- u16 p9dat = 0x0400 << (i * 4); /* data P9 */
- u16 p5dir = 0x0200 << (i * 4); /* output enable P5 */
- u16 p5dat = 0x0100 << (i * 4); /* data P5 */
-
- /* p5 is floating in input-mode */
- potgor &= ~p5dat;
- potgor |= m_potgo_value & p5dat;
- if (!(m_potgo_value & p9dir))
- potgor |= p9dat;
- /* P5 output and 1 -> shift register is kept reset (Blue button) */
- if ((m_potgo_value & p5dir) && (m_potgo_value & p5dat))
- m_cd32_shifter[i] = 8;
- /* shift at 1 == return one, >1 = return button states */
- if (m_cd32_shifter[i] == 0)
- potgor &= ~p9dat; /* shift at zero == return zero */
- if (m_cd32_shifter[i] >= 2 && ((m_player_ports[i])->read() & (1 << (m_cd32_shifter[i] - 2))))
- potgor &= ~p9dat;
- }
- return potgor;
-}
-
-CUSTOM_INPUT_MEMBER( cd32_state::cd32_input )
-{
- return handle_joystick_potgor(m_potgo_value) >> 8;
-}
-
-template <int P>
-READ_LINE_MEMBER( cd32_state::cd32_sel_mirror_input )
-{
- u8 bits = m_player_ports[P]->read();
- return (bits & 0x20)>>5;
-}
-
-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);
-
- // bit 1, power led
- m_power_led = BIT(~data, 1);
-
- handle_joystick_cia(data, m_cia_0->read(2));
-}
-
-
-//**************************************************************************
-// ADDRESS MAPS
-//**************************************************************************
-
-// 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.
-
-#if 0
-void a1000_state::a1000_overlay_map(address_map &map)
-{
- map(0x000000, 0x03ffff).mirror(0x1c0000).ram().share("chip_ram");
- map(0x200000, 0x20ffff).mirror(0x030000).rom().region("bootrom", 0);
- map(0x280000, 0x2bffff).mirror(0x040000).ram().share("chip_ram");
- map(0x300000, 0x33ffff).mirror(0x040000).ram().share("chip_ram");
- map(0x380000, 0x38ffff).mirror(0x030000).rom().region("bootrom", 0);
-}
-#endif
-
-void a1000_state::a1000_overlay_map(address_map &map)
-{
- map(0x000000, 0x07ffff).mirror(0x180000).ram().share("chip_ram");
- map(0x200000, 0x20ffff).mirror(0x030000).rom().region("bootrom", 0);
- map(0x280000, 0x2fffff).ram().share("chip_ram");
- map(0x300000, 0x37ffff).ram().share("chip_ram");
- map(0x380000, 0x38ffff).mirror(0x030000).rom().region("bootrom", 0);
-}
-
-void a1000_state::a1000_bootrom_map(address_map &map)
-{
- map(0x000000, 0x00ffff).mirror(0x30000).rom().region("bootrom", 0).w(FUNC(a1000_state::write_protect_w));
- map(0x040000, 0x07ffff).bankr("wom");
-}
-
-void a1000_state::a1000_mem(address_map &map)
-{
- map.unmap_value_high();
- map(0x000000, 0x1fffff).m(m_overlay, FUNC(address_map_bank_device::amap16));
- map(0xa00000, 0xbfffff).rw(FUNC(a1000_state::cia_r), FUNC(a1000_state::cia_w));
- map(0xc00000, 0xdfffff).rw(FUNC(a1000_state::custom_chip_r), FUNC(a1000_state::custom_chip_w));
- map(0xe00000, 0xe7ffff).nopw().r(FUNC(a1000_state::rom_mirror_r));
- map(0xe80000, 0xefffff).noprw(); // autoconfig space (installed by devices)
- map(0xf80000, 0xfbffff).m(m_bootrom, FUNC(address_map_bank_device::amap16));
- map(0xfc0000, 0xffffff).bankrw("wom");
-}
-
-// Gary/Super Gary/Gayle with 512KB chip RAM
-void amiga_state::overlay_512kb_map(address_map &map)
-{
- map.unmap_value_high();
- map(0x000000, 0x07ffff).mirror(0x180000).ram().share("chip_ram");
- map(0x200000, 0x27ffff).rom().region("kickstart", 0);
-}
-
-// Gary/Super Gary/Gayle with 1MB chip RAM
-void amiga_state::overlay_1mb_map(address_map &map)
-{
- map.unmap_value_high();
- map(0x000000, 0x0fffff).mirror(0x100000).ram().share("chip_ram");
- map(0x200000, 0x27ffff).rom().region("kickstart", 0);
-}
-
-// Gary/Super Gary/Gayle with 1MB chip RAM (32 bit system)
-void amiga_state::overlay_1mb_map32(address_map &map)
-{
- map.unmap_value_high();
- map(0x000000, 0x0fffff).mirror(0x100000).ram().share("chip_ram");
- map(0x200000, 0x27ffff).rom().region("kickstart", 0);
-}
-
-// Gary/Super Gary/Gayle with 2MB chip RAM (32 bit system)
-void amiga_state::overlay_2mb_map16(address_map &map)
-{
- map.unmap_value_high();
- map(0x000000, 0x1fffff).ram().share("chip_ram");
- map(0x200000, 0x27ffff).rom().region("kickstart", 0);
-}
-
-// Gary/Super Gary/Gayle with 2MB chip RAM (32 bit system)
-void amiga_state::overlay_2mb_map32(address_map &map)
-{
- map.unmap_value_high();
- map(0x000000, 0x1fffff).ram().share("chip_ram");
- map(0x200000, 0x27ffff).rom().region("kickstart", 0);
-}
-
-// 512KB chip RAM, 512KB slow RAM, RTC
-void a2000_state::a2000_mem(address_map &map)
-{
- map.unmap_value_high();
- map(0x000000, 0x1fffff).m(m_overlay, FUNC(address_map_bank_device::amap16));
- map(0xa00000, 0xbfffff).rw(FUNC(a2000_state::cia_r), FUNC(a2000_state::cia_w));
- map(0xc00000, 0xc7ffff).ram();
- map(0xc80000, 0xd7ffff).rw(FUNC(a2000_state::custom_chip_r), FUNC(a2000_state::custom_chip_w));
- map(0xd80000, 0xdbffff).noprw();
- map(0xdc0000, 0xdc7fff).rw(FUNC(a2000_state::clock_r), FUNC(a2000_state::clock_w));
- map(0xdc8000, 0xddffff).noprw();
- map(0xde0000, 0xdeffff).rw(FUNC(a2000_state::custom_chip_r), FUNC(a2000_state::custom_chip_w));
- map(0xdf0000, 0xdfffff).rw(FUNC(a2000_state::custom_chip_r), FUNC(a2000_state::custom_chip_w));
- map(0xe00000, 0xe7ffff).nopw().r(FUNC(a2000_state::rom_mirror_r));
- map(0xe80000, 0xefffff).noprw(); // autoconfig space (installed by devices)
- map(0xf00000, 0xf7ffff).noprw(); // cartridge space
- map(0xf80000, 0xffffff).rom().region("kickstart", 0);
-}
-
-// 512KB chip RAM and no clock
-void a500_state::a500_mem(address_map &map)
-{
- map.unmap_value_high();
- map(0x000000, 0x1fffff).m(m_overlay, FUNC(address_map_bank_device::amap16));
- map(0xa00000, 0xbfffff).rw(FUNC(a500_state::cia_r), FUNC(a500_state::cia_w));
- map(0xc00000, 0xd7ffff).rw(FUNC(a500_state::custom_chip_r), FUNC(a500_state::custom_chip_w));
- map(0xd80000, 0xddffff).noprw();
- map(0xde0000, 0xdeffff).rw(FUNC(a500_state::custom_chip_r), FUNC(a500_state::custom_chip_w));
- map(0xdf0000, 0xdfffff).rw(FUNC(a500_state::custom_chip_r), FUNC(a500_state::custom_chip_w));
- map(0xe00000, 0xe7ffff).nopw().r(FUNC(a500_state::rom_mirror_r));
- map(0xe80000, 0xefffff).noprw(); // autoconfig space (installed by devices)
- map(0xf00000, 0xf7ffff).noprw(); // cartridge space
- map(0xf80000, 0xffffff).rom().region("kickstart", 0);
-}
-
-// 1MB chip RAM, RTC and CDTV specific hardware
-void cdtv_state::cdtv_mem(address_map &map)
-{
- map.unmap_value_high();
- map(0x000000, 0x1fffff).m(m_overlay, FUNC(address_map_bank_device::amap16));
- map(0xa00000, 0xbfffff).rw(FUNC(cdtv_state::cia_r), FUNC(cdtv_state::cia_w));
- map(0xc00000, 0xd7ffff).rw(FUNC(cdtv_state::custom_chip_r), FUNC(cdtv_state::custom_chip_w));
- map(0xd80000, 0xdbffff).noprw();
- map(0xdc0000, 0xdc7fff).rw(FUNC(cdtv_state::clock_r), FUNC(cdtv_state::clock_w));
- map(0xdc8000, 0xdc87ff).mirror(0x7800).ram().share("sram");
- map(0xdd0000, 0xddffff).noprw();
- map(0xde0000, 0xdeffff).rw(FUNC(cdtv_state::custom_chip_r), FUNC(cdtv_state::custom_chip_w));
- map(0xdf0000, 0xdfffff).rw(FUNC(cdtv_state::custom_chip_r), FUNC(cdtv_state::custom_chip_w));
- map(0xe00000, 0xe3ffff).mirror(0x40000).ram().share("memcard");
- map(0xe80000, 0xefffff).noprw(); // autoconfig space (installed by devices)
- map(0xf00000, 0xf3ffff).mirror(0x40000).rom().region("cdrom", 0);
- map(0xf80000, 0xffffff).rom().region("kickstart", 0);
-}
-
-void cdtv_state::cdtv_rc_mem(address_map &map)
-{
- map(0x0800, 0x0fff).rom().region("rcmcu", 0);
-}
-
-void a3000_state::a3000_mem(address_map &map)
-{
- map.unmap_value_high();
- map(0x00000000, 0x001fffff).m(m_overlay, FUNC(address_map_bank_device::amap32));
- map(0x00b80000, 0x00bfffff).rw(FUNC(a3000_state::cia_r), FUNC(a3000_state::cia_w));
- map(0x00c00000, 0x00cfffff).rw(FUNC(a3000_state::custom_chip_r), FUNC(a3000_state::custom_chip_w));
- map(0x00d00000, 0x00dbffff).noprw();
- map(0x00dc0000, 0x00dcffff).rw("rtc", FUNC(rp5c01_device::read), FUNC(rp5c01_device::write)).umask32(0x000000ff);
- map(0x00dd0000, 0x00ddffff).rw(FUNC(a3000_state::scsi_r), FUNC(a3000_state::scsi_w));
- map(0x00de0000, 0x00deffff).rw(FUNC(a3000_state::motherboard_r), FUNC(a3000_state::motherboard_w));
- map(0x00df0000, 0x00dfffff).rw(FUNC(a3000_state::custom_chip_r), FUNC(a3000_state::custom_chip_w));
- map(0x00e80000, 0x00efffff).noprw(); // autoconfig space (installed by devices)
- map(0x00f00000, 0x00f7ffff).noprw(); // cartridge space
- map(0x00f80000, 0x00ffffff).rom().region("kickstart", 0);
- map(0x07f00000, 0x07ffffff).ram(); // motherboard ram (up to 16mb), grows downward
- map(0xfff80000, 0xffffffff).rom().region("kickstart", 0);
-}
-
-// 1MB chip RAM and RTC
-void a500p_state::a500p_mem(address_map &map)
-{
- map.unmap_value_high();
- map(0x000000, 0x1fffff).m(m_overlay, FUNC(address_map_bank_device::amap16));
- map(0xa00000, 0xbfffff).rw(FUNC(a500p_state::cia_r), FUNC(a500p_state::cia_w));
- map(0xc00000, 0xc7ffff).ram();
- map(0xc80000, 0xd7ffff).rw(FUNC(a500p_state::custom_chip_r), FUNC(a500p_state::custom_chip_w));
- map(0xd80000, 0xdbffff).noprw();
- map(0xdc0000, 0xdc7fff).rw(FUNC(a500p_state::clock_r), FUNC(a500p_state::clock_w));
- map(0xdc8000, 0xddffff).noprw();
- map(0xde0000, 0xdeffff).rw(FUNC(a500p_state::custom_chip_r), FUNC(a500p_state::custom_chip_w));
- map(0xdf0000, 0xdfffff).rw(FUNC(a500p_state::custom_chip_r), FUNC(a500p_state::custom_chip_w));
- map(0xe00000, 0xe7ffff).nopw().r(FUNC(a500p_state::rom_mirror_r));
- map(0xe80000, 0xefffff).noprw(); // autoconfig space (installed by devices)
- map(0xf80000, 0xffffff).rom().region("kickstart", 0);
-}
-
-// 1MB chip RAM, IDE and PCMCIA
-void a600_state::a600_mem(address_map &map)
-{
- map.unmap_value_high();
- map(0x000000, 0x1fffff).m(m_overlay, FUNC(address_map_bank_device::amap16));
- map(0x200000, 0xa7ffff).noprw();
- map(0xa80000, 0xafffff).nopw().r(FUNC(a600_state::rom_mirror_r));
- map(0xb00000, 0xb7ffff).nopw().r(FUNC(a600_state::rom_mirror_r));
- map(0xb80000, 0xbeffff).noprw(); // reserved (cdtv)
- map(0xbf0000, 0xbfffff).rw(FUNC(a600_state::cia_r), FUNC(a600_state::gayle_cia_w));
- map(0xc00000, 0xd7ffff).noprw(); // slow mem
- map(0xd80000, 0xd8ffff).noprw(); // spare chip select
- map(0xd90000, 0xd9ffff).noprw(); // arcnet chip select
- map(0xda0000, 0xdaffff).rw("gayle", FUNC(gayle_device::gayle_r), FUNC(gayle_device::gayle_w));
- map(0xdb0000, 0xdbffff).noprw(); // reserved (external ide)
- map(0xdc0000, 0xdcffff).noprw(); // rtc
- map(0xdd0000, 0xddffff).noprw(); // reserved (dma controller)
- map(0xde0000, 0xdeffff).rw("gayle", FUNC(gayle_device::gayle_id_r), FUNC(gayle_device::gayle_id_w));
- map(0xdf0000, 0xdfffff).rw(FUNC(a600_state::custom_chip_r), FUNC(a600_state::custom_chip_w));
- map(0xe00000, 0xe7ffff).nopw().r(FUNC(a600_state::rom_mirror_r));
- map(0xe80000, 0xefffff).noprw(); // autoconfig space (installed by devices)
- map(0xf00000, 0xf7ffff).noprw(); // cartridge space
- map(0xf80000, 0xffffff).rom().region("kickstart", 0);
-}
-
-// 2MB chip RAM, IDE and PCMCIA
-void a1200_state::a1200_mem(address_map &map)
-{
- map.unmap_value_high();
- map(0x000000, 0x1fffff).m(m_overlay, FUNC(address_map_bank_device::amap32));
- map(0x200000, 0xa7ffff).noprw();
- map(0xa80000, 0xafffff).nopw().r(FUNC(a1200_state::rom_mirror32_r));
- map(0xb00000, 0xb7ffff).nopw().r(FUNC(a1200_state::rom_mirror32_r));
- map(0xb80000, 0xbeffff).noprw(); // reserved (cdtv)
- map(0xbf0000, 0xbfffff).rw(FUNC(a1200_state::cia_r), FUNC(a1200_state::gayle_cia_w));
- map(0xc00000, 0xd7ffff).noprw(); // slow mem
- map(0xd80000, 0xd8ffff).noprw(); // spare chip select
- map(0xd90000, 0xd9ffff).noprw(); // arcnet chip select
- map(0xda0000, 0xdaffff).rw("gayle", FUNC(gayle_device::gayle_r), FUNC(gayle_device::gayle_w));
- map(0xdb0000, 0xdbffff).noprw(); // reserved (external ide)
- map(0xdc0000, 0xdcffff).noprw(); // rtc
- map(0xdd0000, 0xddffff).noprw(); // reserved (dma controller)
- map(0xde0000, 0xdeffff).rw("gayle", FUNC(gayle_device::gayle_id_r), FUNC(gayle_device::gayle_id_w));
- map(0xdf0000, 0xdfffff).rw(FUNC(a1200_state::custom_chip_r), FUNC(a1200_state::custom_chip_w));
- map(0xe00000, 0xe7ffff).nopw().r(FUNC(a1200_state::rom_mirror32_r));
- map(0xe80000, 0xefffff).noprw(); // autoconfig space (installed by devices)
- map(0xf00000, 0xf7ffff).noprw(); // cartridge space
- map(0xf80000, 0xffffff).rom().region("kickstart", 0);
-}
-
-// 2MB chip RAM, 4 MB fast RAM, RTC and IDE
-void a4000_state::a4000_mem(address_map &map)
-{
- map.unmap_value_high();
- map(0x00000000, 0x001fffff).m(m_overlay, FUNC(address_map_bank_device::amap32));
- map(0x00200000, 0x009fffff).noprw(); // zorro2 expansion
- map(0x00a00000, 0x00b7ffff).noprw();
- map(0x00b80000, 0x00beffff).noprw();
- map(0x00bf0000, 0x00bfffff).rw(FUNC(a4000_state::cia_r), FUNC(a4000_state::cia_w));
- map(0x00c00000, 0x00cfffff).rw(FUNC(a4000_state::custom_chip_r), FUNC(a4000_state::custom_chip_w));
- map(0x00d00000, 0x00d9ffff).noprw();
- map(0x00da0000, 0x00dbffff).noprw();
- map(0x00dc0000, 0x00dcffff).rw("rtc", FUNC(rp5c01_device::read), FUNC(rp5c01_device::write)).umask32(0x000000ff);
- map(0x00dd0000, 0x00dd0fff).noprw();
- map(0x00dd1000, 0x00dd3fff).rw(FUNC(a4000_state::ide_r), FUNC(a4000_state::ide_w));
- map(0x00dd4000, 0x00ddffff).noprw();
- map(0x00de0000, 0x00deffff).rw(FUNC(a4000_state::motherboard_r), FUNC(a4000_state::motherboard_w));
- map(0x00df0000, 0x00dfffff).rw(FUNC(a4000_state::custom_chip_r), FUNC(a4000_state::custom_chip_w));
- map(0x00e00000, 0x00e7ffff).nopw().r(FUNC(a4000_state::rom_mirror32_r));
- map(0x00e80000, 0x00efffff).noprw(); // zorro2 autoconfig space (installed by devices)
- map(0x00f00000, 0x00f7ffff).noprw(); // cartridge space
- map(0x00f80000, 0x00ffffff).rom().region("kickstart", 0);
- map(0x01000000, 0x017fffff).noprw(); // reserved (8 mb chip ram)
- map(0x01800000, 0x06ffffff).noprw(); // reserved (motherboard fast ram expansion)
- map(0x07000000, 0x07bfffff).noprw(); // motherboard ram
- map(0x07c00000, 0x07ffffff).ram(); // motherboard ram (up to 16mb), grows downward
- map(0xfff80000, 0xffffffff).rom().region("kickstart", 0);
-}
-
-// 2MB chip RAM, 2 MB fast RAM, RTC and IDE
-void a4000_state::a400030_mem(address_map &map)
-{
- map.unmap_value_high();
- a4000_mem(map);
- map(0x07000000, 0x07dfffff).noprw(); // Drop the first 2Mb
-}
-
-// 2MB chip RAM and CD-ROM
-void cd32_state::cd32_mem(address_map &map)
-{
- map.unmap_value_high();
- map(0x000000, 0x1fffff).m(m_overlay, FUNC(address_map_bank_device::amap32));
- map(0xb80000, 0xb8003f).rw("akiko", FUNC(akiko_device::read), FUNC(akiko_device::write));
- map(0xbf0000, 0xbfffff).rw(FUNC(cd32_state::cia_r), FUNC(cd32_state::gayle_cia_w));
- map(0xc00000, 0xdfffff).rw(FUNC(cd32_state::custom_chip_r), FUNC(cd32_state::custom_chip_w));
- map(0xe00000, 0xe7ffff).rom().region("kickstart", 0x80000);
- map(0xe80000, 0xf7ffff).noprw();
- map(0xf80000, 0xffffff).rom().region("kickstart", 0);
-}
-
-// 2 MB chip RAM, IDE, RTC and SCSI
-void a4000_state::a4000t_mem(address_map &map)
-{
- map.unmap_value_high();
- a4000_mem(map);
- map(0x00dd0000, 0x00dd0fff).rw(FUNC(a4000_state::scsi_r), FUNC(a4000_state::scsi_w));
-}
-
-
-//**************************************************************************
-// INPUTS
-//**************************************************************************
-
-template <int P>
-CUSTOM_INPUT_MEMBER( amiga_state::amiga_joystick_convert )
-{
- uint8_t bits = m_joy_ports[P].read_safe(0xff);
-
- int up = (bits >> 0) & 1;
- int down = (bits >> 1) & 1;
- int left = (bits >> 2) & 1;
- int right = (bits >> 3) & 1;
-
- if (left) up ^= 1;
- if (right) down ^= 1;
-
- return down | (right << 1) | (up << 8) | (left << 9);
-}
-
-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_CUSTOM) PORT_CUSTOM_MEMBER(amiga_state, floppy_drive_status)
- 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_CUSTOM) PORT_CUSTOM_MEMBER(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_CUSTOM) PORT_CUSTOM_MEMBER(amiga_state, amiga_joystick_convert<1>)
- PORT_BIT(0xfcfc, IP_ACTIVE_HIGH, IPT_UNUSED)
-
- PORT_START("potgo")
- PORT_BIT(0x0100, IP_ACTIVE_LOW, IPT_BUTTON3) PORT_PLAYER(1)
- PORT_BIT(0x0400, IP_ACTIVE_LOW, IPT_BUTTON2) PORT_PLAYER(1)
- PORT_BIT(0x1000, IP_ACTIVE_LOW, IPT_BUTTON3) PORT_PLAYER(2)
- 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
-
-INPUT_PORTS_START( cd32 )
- PORT_INCLUDE(amiga)
-
- PORT_MODIFY("cia_0_port_a")
- PORT_BIT( 0x3f, IP_ACTIVE_LOW, IPT_CUSTOM )
- // 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_CUSTOM ) PORT_READ_LINE_MEMBER(cd32_state, cd32_sel_mirror_input<0>)
- PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(cd32_state, cd32_sel_mirror_input<1>)
-
- PORT_MODIFY("joy_0_dat")
- PORT_BIT( 0x0303, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(amiga_state, amiga_joystick_convert<0>)
- PORT_BIT( 0xfcfc, IP_ACTIVE_HIGH, IPT_UNUSED )
-
- PORT_MODIFY("joy_1_dat")
- PORT_BIT( 0x0303, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(amiga_state, amiga_joystick_convert<1>)
- PORT_BIT( 0xfcfc, IP_ACTIVE_HIGH, IPT_UNUSED )
-
- PORT_MODIFY("potgo")
- PORT_BIT( 0xff00, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(cd32_state, cd32_input)
- 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
-
-
-//**************************************************************************
-// MACHINE DRIVERS
-//**************************************************************************
-
-static void amiga_floppies(device_slot_interface &device)
-{
- device.option_add("35dd", FLOPPY_35_DD);
-}
-
-// basic elements common to all amigas
-void amiga_state::amiga_base(machine_config &config)
-{
- // video
- pal_video(config);
-
- PALETTE(config, m_palette, FUNC(amiga_state::amiga_palette), 4096);
-
- MCFG_VIDEO_START_OVERRIDE(amiga_state, amiga)
-
- // cia
- MOS8520(config, m_cia_0, amiga_state::CLK_E_PAL);
- m_cia_0->irq_wr_callback().set(FUNC(amiga_state::cia_0_irq));
- m_cia_0->pa_rd_callback().set_ioport("cia_0_port_a");
- m_cia_0->pa_wr_callback().set(FUNC(amiga_state::cia_0_port_a_write));
- m_cia_0->pb_wr_callback().set("cent_data_out", FUNC(output_latch_device::bus_w));
- m_cia_0->pc_wr_callback().set(m_centronics, FUNC(centronics_device::write_strobe));
- m_cia_0->sp_wr_callback().set("kbd", FUNC(amiga_keyboard_bus_device::kdat_in_w)).invert();
-
- MOS8520(config, m_cia_1, amiga_state::CLK_E_PAL);
- m_cia_1->irq_wr_callback().set(FUNC(amiga_state::cia_1_irq));
- m_cia_1->pa_rd_callback().set(FUNC(amiga_state::cia_1_port_a_read));
- m_cia_1->pa_wr_callback().set(FUNC(amiga_state::cia_1_port_a_write));
- m_cia_1->pb_wr_callback().set(m_fdc, FUNC(amiga_fdc_device::ciaaprb_w));
-
- // audio
- SPEAKER(config, "lspeaker").front_left();
- SPEAKER(config, "rspeaker").front_right();
- PAULA_8364(config, m_paula, amiga_state::CLK_C1_PAL);
- m_paula->add_route(0, "lspeaker", 0.50);
- m_paula->add_route(1, "rspeaker", 0.50);
- m_paula->add_route(2, "rspeaker", 0.50);
- m_paula->add_route(3, "lspeaker", 0.50);
- m_paula->mem_read_cb().set(FUNC(amiga_state::chip_ram_r));
- m_paula->int_cb().set(FUNC(amiga_state::paula_int_w));
-
- // floppy drives
- AMIGA_FDC(config, m_fdc, amiga_state::CLK_7M_PAL);
- m_fdc->read_dma_callback().set(FUNC(amiga_state::chip_ram_r));
- m_fdc->write_dma_callback().set(FUNC(amiga_state::chip_ram_w));
- m_fdc->dskblk_callback().set(FUNC(amiga_state::fdc_dskblk_w));
- m_fdc->dsksyn_callback().set(FUNC(amiga_state::fdc_dsksyn_w));
- FLOPPY_CONNECTOR(config, "fdc:0", amiga_floppies, "35dd", amiga_fdc_device::floppy_formats).enable_sound(true);
- FLOPPY_CONNECTOR(config, "fdc:1", amiga_floppies, nullptr, amiga_fdc_device::floppy_formats).enable_sound(true);
- FLOPPY_CONNECTOR(config, "fdc:2", amiga_floppies, nullptr, amiga_fdc_device::floppy_formats).enable_sound(true);
- FLOPPY_CONNECTOR(config, "fdc:3", amiga_floppies, nullptr, amiga_fdc_device::floppy_formats).enable_sound(true);
-
- // rs232
- rs232_port_device &rs232(RS232_PORT(config, "rs232", default_rs232_devices, nullptr));
- rs232.rxd_handler().set(FUNC(amiga_state::rs232_rx_w));
- rs232.dcd_handler().set(FUNC(amiga_state::rs232_dcd_w));
- rs232.dsr_handler().set(FUNC(amiga_state::rs232_dsr_w));
- rs232.ri_handler().set(FUNC(amiga_state::rs232_ri_w));
- rs232.cts_handler().set(FUNC(amiga_state::rs232_cts_w));
-
- // centronics
- CENTRONICS(config, m_centronics, centronics_devices, "printer");
- m_centronics->ack_handler().set(FUNC(amiga_state::centronics_ack_w));
- m_centronics->busy_handler().set(FUNC(amiga_state::centronics_busy_w));
- m_centronics->perror_handler().set(FUNC(amiga_state::centronics_perror_w));
- m_centronics->select_handler().set(FUNC(amiga_state::centronics_select_w));
-
- output_latch_device &cent_data_out(OUTPUT_LATCH(config, "cent_data_out"));
- m_centronics->set_output_latch(cent_data_out);
-
- // software
- SOFTWARE_LIST(config, "wb_list").set_original("amiga_workbench");
- SOFTWARE_LIST(config, "hardware_list").set_original("amiga_hardware");
- SOFTWARE_LIST(config, "apps_list").set_original("amiga_apps");
- SOFTWARE_LIST(config, "flop_list").set_original("amiga_flop");
- SOFTWARE_LIST(config, "ocs_list").set_original("amigaocs_flop");
-}
-
-void a1000_state::a1000(machine_config &config)
-{
- amiga_base(config);
-
- // keyboard
- auto &kbd(AMIGA_KEYBOARD_INTERFACE(config, "kbd", amiga_keyboard_devices, "a1000_us"));
- kbd.kclk_handler().set("cia_0", FUNC(mos8520_device::cnt_w));
- kbd.kclk_handler().append("kbrst", FUNC(a1000_kbreset_device::kbclk_w));
- kbd.kdat_handler().set("cia_0", FUNC(mos8520_device::sp_w));
- A1000_KBRESET(config, "kbrst")
- .set_delays(attotime::from_msec(152), attotime::from_usec(176), attotime::from_msec(704))
- .kbrst_cb().set(FUNC(a1000_state::kbreset_w));
-
- // main cpu
- M68000(config, m_maincpu, amiga_state::CLK_7M_PAL);
- m_maincpu->set_addrmap(AS_PROGRAM, &a1000_state::a1000_mem);
- m_maincpu->set_cpu_space(AS_PROGRAM);
-
- ADDRESS_MAP_BANK(config, "overlay").set_map(&a1000_state::a1000_overlay_map).set_options(ENDIANNESS_BIG, 16, 22, 0x200000);
- ADDRESS_MAP_BANK(config, "bootrom").set_map(&a1000_state::a1000_bootrom_map).set_options(ENDIANNESS_BIG, 16, 19, 0x40000);
-
- SOFTWARE_LIST(config, "a1000_list").set_original("amiga_a1000");
-}
-
-void a1000_state::a1000n(machine_config &config)
-{
- a1000(config);
-
- m_maincpu->set_clock(amiga_state::CLK_7M_NTSC);
- config.device_remove("screen");
- ntsc_video(config);
- m_paula->set_clock(amiga_state::CLK_C1_NTSC);
- m_cia_0->set_clock(amiga_state::CLK_E_NTSC);
- m_cia_1->set_clock(amiga_state::CLK_E_NTSC);
- m_fdc->set_clock(amiga_state::CLK_7M_NTSC);
-}
-
-void a2000_state::a2000(machine_config &config)
-{
- amiga_base(config);
-
- // keyboard
- auto &kbd(AMIGA_KEYBOARD_INTERFACE(config, "kbd", amiga_keyboard_devices, "a2000_us"));
- kbd.kclk_handler().set("cia_0", FUNC(mos8520_device::cnt_w));
- kbd.kclk_handler().append("kbrst", FUNC(a1000_kbreset_device::kbclk_w));
- kbd.kdat_handler().set("cia_0", FUNC(mos8520_device::sp_w));
- A1000_KBRESET(config, "kbrst")
- .set_delays(attotime::from_msec(112), attotime::from_msec(74), attotime::from_msec(1294))
- .kbrst_cb().set(FUNC(a2000_state::kbreset_w));
-
- // main cpu
- M68000(config, m_maincpu, amiga_state::CLK_7M_PAL);
- m_maincpu->set_addrmap(AS_PROGRAM, &a2000_state::a2000_mem);
- m_maincpu->set_cpu_space(AS_PROGRAM);
-
- ADDRESS_MAP_BANK(config, "overlay").set_map(&amiga_state::overlay_512kb_map).set_options(ENDIANNESS_BIG, 16, 22, 0x200000);
-
- // real-time clock
- MSM6242(config, m_rtc, XTAL(32'768));
-
- // cpu slot
- EXP_SLOT(config, EXP_SLOT_TAG, 0).set_space(m_maincpu, AS_PROGRAM);
- ZORRO_SLOT(config, "slot", EXP_SLOT_TAG, a2000_expansion_cards, nullptr);
-
- // zorro slots
- ZORRO2(config, m_zorro, 0);
- m_zorro->set_space(m_maincpu, AS_PROGRAM);
- m_zorro->int2_handler().set(FUNC(a2000_state::zorro2_int2_w));
- m_zorro->int6_handler().set(FUNC(a2000_state::zorro2_int6_w));
- ZORRO_SLOT(config, "zorro1", m_zorro, zorro2_cards, nullptr);
- ZORRO_SLOT(config, "zorro2", m_zorro, zorro2_cards, nullptr);
- ZORRO_SLOT(config, "zorro3", m_zorro, zorro2_cards, nullptr);
- ZORRO_SLOT(config, "zorro4", m_zorro, zorro2_cards, nullptr);
- ZORRO_SLOT(config, "zorro5", m_zorro, zorro2_cards, nullptr);
-}
-
-void a2000_state::a2000n(machine_config &config)
-{
- a2000(config);
-
- m_maincpu->set_clock(amiga_state::CLK_7M_NTSC);
- config.device_remove("screen");
- ntsc_video(config);
- m_paula->set_clock(amiga_state::CLK_C1_NTSC);
- m_cia_0->set_clock(amiga_state::CLK_E_NTSC);
- m_cia_1->set_clock(amiga_state::CLK_E_NTSC);
- m_fdc->set_clock(amiga_state::CLK_7M_NTSC);
-}
-
-void a500_state::a500(machine_config &config)
-{
- amiga_base(config);
-
- // keyboard
- auto &kbd(AMIGA_KEYBOARD_INTERFACE(config, "kbd", a500_keyboard_devices, "a500_us"));
- kbd.kclk_handler().set("cia_0", FUNC(mos8520_device::cnt_w));
- kbd.kdat_handler().set("cia_0", FUNC(mos8520_device::sp_w));
- kbd.krst_handler().set(FUNC(amiga_state::kbreset_w));
-
- // main cpu
- M68000(config, m_maincpu, amiga_state::CLK_7M_PAL);
- m_maincpu->set_addrmap(AS_PROGRAM, &a500_state::a500_mem);
- m_maincpu->set_cpu_space(AS_PROGRAM);
-
- ADDRESS_MAP_BANK(config, "overlay").set_map(&amiga_state::overlay_1mb_map).set_options(ENDIANNESS_BIG, 16, 22, 0x200000);
-
- // cpu slot
- EXP_SLOT(config, m_side, 0).set_space(m_maincpu, AS_PROGRAM);
- m_side->int2_handler().set(FUNC(a500_state::side_int2_w));
- m_side->int6_handler().set(FUNC(a500_state::side_int6_w));
- ZORRO_SLOT(config, "slot", m_side, a500_expansion_cards, nullptr);
-}
-
-void a500_state::a500n(machine_config &config)
-{
- a500(config);
- m_maincpu->set_clock(amiga_state::CLK_7M_NTSC);
- config.device_remove("screen");
- ntsc_video(config);
- m_paula->set_clock(amiga_state::CLK_C1_NTSC);
- m_cia_0->set_clock(amiga_state::CLK_E_NTSC);
- m_cia_1->set_clock(amiga_state::CLK_E_NTSC);
- m_fdc->set_clock(amiga_state::CLK_7M_NTSC);
-}
-
-void cdtv_state::cdtv(machine_config &config)
-{
- amiga_base(config);
-
- // keyboard
- auto &kbd(AMIGA_KEYBOARD_INTERFACE(config, "kbd", amiga_keyboard_devices, "a2000_us"));
- kbd.kclk_handler().set("cia_0", FUNC(mos8520_device::cnt_w));
- kbd.kclk_handler().append("kbrst", FUNC(a1000_kbreset_device::kbclk_w));
- kbd.kdat_handler().set("cia_0", FUNC(mos8520_device::sp_w));
- A1000_KBRESET(config, "kbrst")
- .set_delays(attotime::from_usec(11238), attotime::from_usec(7432), attotime::from_usec(27539))
- .kbrst_cb().set(FUNC(a1000_state::kbreset_w));
-
- // main cpu
- M68000(config, m_maincpu, amiga_state::CLK_7M_PAL);
- m_maincpu->set_addrmap(AS_PROGRAM, &cdtv_state::cdtv_mem);
- m_maincpu->set_cpu_space(AS_PROGRAM);
-
- // remote control input converter
- m6502_device &u75(M6502(config, "u75", XTAL(3'000'000)));
- u75.set_addrmap(AS_PROGRAM, &cdtv_state::cdtv_rc_mem);
- u75.set_disable();
-
- // lcd controller
-#if 0
- lc6554_device &u62(LC6554(config, "u62", XTAL(4'000'000))); // device isn't emulated yet
- u62.set_addrmap(AS_PROGRAM, &cdtv_state::lcd_mem);
-#endif
-
- ADDRESS_MAP_BANK(config, "overlay").set_map(&amiga_state::overlay_1mb_map).set_options(ENDIANNESS_BIG, 16, 22, 0x200000);
-
- // standard sram
- NVRAM(config, "sram", nvram_device::DEFAULT_ALL_0);
-
- // 256kb memory card
- NVRAM(config, "memcard", nvram_device::DEFAULT_ALL_0);
-
- // real-time clock
- MSM6242(config, m_rtc, XTAL(32'768));
-
- // cd-rom controller
- AMIGA_DMAC(config, m_dmac, amiga_state::CLK_7M_PAL);
- m_dmac->scsi_read_handler().set(FUNC(cdtv_state::dmac_scsi_data_read));
- m_dmac->scsi_write_handler().set(FUNC(cdtv_state::dmac_scsi_data_write));
- m_dmac->io_read_handler().set(FUNC(cdtv_state::dmac_io_read));
- m_dmac->io_write_handler().set(FUNC(cdtv_state::dmac_io_write));
- m_dmac->int_handler().set(FUNC(cdtv_state::dmac_int_w));
-
- TPI6525(config, m_tpi, 0);
- m_tpi->out_irq_cb().set(FUNC(cdtv_state::tpi_int_w));
- m_tpi->out_pb_cb().set(FUNC(cdtv_state::tpi_port_b_write));
-
- // cd-rom
- CR511B(config, m_cdrom, 0);
- m_cdrom->scor_handler().set(m_tpi, FUNC(tpi6525_device::i1_w)).invert();
- m_cdrom->stch_handler().set(m_tpi, FUNC(tpi6525_device::i2_w)).invert();
- m_cdrom->sten_handler().set(m_tpi, FUNC(tpi6525_device::i3_w));
- m_cdrom->xaen_handler().set(m_tpi, FUNC(tpi6525_device::pb2_w));
- m_cdrom->drq_handler().set(m_dmac, FUNC(amiga_dmac_device::xdreq_w));
- m_cdrom->dten_handler().set(m_dmac, FUNC(amiga_dmac_device::xdreq_w));
-
- // software
- SOFTWARE_LIST(config, "cd_list").set_original("cdtv");
-}
-
-void cdtv_state::cdtvn(machine_config &config)
-{
- cdtv(config);
- m_maincpu->set_clock(amiga_state::CLK_7M_NTSC);
- config.device_remove("screen");
- ntsc_video(config);
- m_paula->set_clock(amiga_state::CLK_C1_NTSC);
- m_cia_0->set_clock(amiga_state::CLK_E_NTSC);
- m_cia_1->set_clock(amiga_state::CLK_E_NTSC);
- m_dmac->set_clock(amiga_state::CLK_7M_NTSC);
- m_fdc->set_clock(amiga_state::CLK_7M_NTSC);
-}
-
-void a3000_state::a3000(machine_config &config)
-{
- amiga_base(config);
-
- // keyboard
- auto &kbd(AMIGA_KEYBOARD_INTERFACE(config, "kbd", amiga_keyboard_devices, "a2000_us"));
- kbd.kclk_handler().set("cia_0", FUNC(mos8520_device::cnt_w));
- kbd.kdat_handler().set("cia_0", FUNC(mos8520_device::sp_w));
-
- // main cpu
- M68030(config, m_maincpu, XTAL(32'000'000) / 2);
- m_maincpu->set_addrmap(AS_PROGRAM, &a3000_state::a3000_mem);
- m_maincpu->set_cpu_space(AS_PROGRAM);
-
- ADDRESS_MAP_BANK(config, "overlay").set_map(&amiga_state::overlay_1mb_map32).set_options(ENDIANNESS_BIG, 32, 22, 0x200000);
-
- // real-time clock
- RP5C01(config, "rtc", XTAL(32'768));
-
- // todo: zorro3 slots, super dmac, scsi
-
- // software
- SOFTWARE_LIST(config, "a3000_list").set_original("amiga_a3000");
- SOFTWARE_LIST(config, "ecs_list").set_original("amigaecs_flop");
-}
-
-void a3000_state::a3000n(machine_config &config)
-{
- a3000(config);
- config.device_remove("screen");
- ntsc_video(config);
- m_cia_0->set_clock(amiga_state::CLK_E_NTSC);
- m_cia_1->set_clock(amiga_state::CLK_E_NTSC);
- m_fdc->set_clock(amiga_state::CLK_7M_NTSC);
-}
-
-void a500p_state::a500p(machine_config &config)
-{
- amiga_base(config);
-
- // keyboard
- auto &kbd(AMIGA_KEYBOARD_INTERFACE(config, "kbd", a500_keyboard_devices, "a500_us"));
- kbd.kclk_handler().set("cia_0", FUNC(mos8520_device::cnt_w));
- kbd.kdat_handler().set("cia_0", FUNC(mos8520_device::sp_w));
- kbd.krst_handler().set(FUNC(amiga_state::kbreset_w));
-
- // main cpu
- M68000(config, m_maincpu, amiga_state::CLK_7M_PAL);
- m_maincpu->set_addrmap(AS_PROGRAM, &a500p_state::a500p_mem);
- m_maincpu->set_cpu_space(AS_PROGRAM);
-
- ADDRESS_MAP_BANK(config, "overlay").set_map(&amiga_state::overlay_1mb_map).set_options(ENDIANNESS_BIG, 16, 22, 0x200000);
-
- // real-time clock
- MSM6242(config, m_rtc, XTAL(32'768));
-
- // cpu slot
- EXP_SLOT(config, m_side, 0).set_space(m_maincpu, AS_PROGRAM);
- ZORRO_SLOT(config, "slot", m_side, a500_expansion_cards, nullptr);
-
- // software
- SOFTWARE_LIST(config, "ecs_list").set_original("amigaecs_flop");
-}
-
-void a500p_state::a500pn(machine_config &config)
-{
- a500p(config);
- m_maincpu->set_clock(amiga_state::CLK_7M_NTSC);
- config.device_remove("screen");
- ntsc_video(config);
- m_paula->set_clock(amiga_state::CLK_C1_NTSC);
- m_cia_0->set_clock(amiga_state::CLK_E_NTSC);
- m_cia_1->set_clock(amiga_state::CLK_E_NTSC);
- m_fdc->set_clock(amiga_state::CLK_7M_NTSC);
-}
-
-void a600_state::a600(machine_config &config)
-{
- amiga_base(config);
-
- // keyboard
- auto &kbd(AMIGA_KEYBOARD_INTERFACE(config, "kbd", a600_keyboard_devices, "a600_us"));
- kbd.kclk_handler().set("cia_0", FUNC(mos8520_device::cnt_w));
- kbd.kdat_handler().set("cia_0", FUNC(mos8520_device::sp_w));
- kbd.krst_handler().set(FUNC(amiga_state::kbreset_w));
-
- // main cpu
- M68000(config, m_maincpu, amiga_state::CLK_7M_PAL);
- m_maincpu->set_addrmap(AS_PROGRAM, &a600_state::a600_mem);
- m_maincpu->set_cpu_space(AS_PROGRAM);
-
- ADDRESS_MAP_BANK(config, "overlay").set_map(&amiga_state::overlay_2mb_map16).set_options(ENDIANNESS_BIG, 16, 22, 0x200000);
-
- gayle_device &gayle(GAYLE(config, "gayle", amiga_state::CLK_28M_PAL / 2));
- gayle.set_id(a600_state::GAYLE_ID);
- gayle.int2_handler().set(FUNC(a600_state::gayle_int2_w));
- gayle.cs0_read_handler().set("ata", FUNC(ata_interface_device::cs0_r));
- gayle.cs0_write_handler().set("ata", FUNC(ata_interface_device::cs0_w));
- gayle.cs1_read_handler().set("ata", FUNC(ata_interface_device::cs1_r));
- gayle.cs1_write_handler().set("ata", FUNC(ata_interface_device::cs1_w));
-
- ata_interface_device &ata(ATA_INTERFACE(config, "ata").options(ata_devices, "hdd", nullptr, false));
- ata.irq_handler().set("gayle", FUNC(gayle_device::ide_interrupt_w));
-
- // todo: pcmcia
-
- // software
- SOFTWARE_LIST(config, "ecs_list").set_original("amigaecs_flop");
-}
-
-void a600_state::a600n(machine_config &config)
-{
- a600(config);
- m_maincpu->set_clock(amiga_state::CLK_7M_NTSC);
- subdevice<gayle_device>("gayle")->set_clock(amiga_state::CLK_28M_NTSC / 2);
- config.device_remove("screen");
- ntsc_video(config);
- m_paula->set_clock(amiga_state::CLK_C1_NTSC);
- m_cia_0->set_clock(amiga_state::CLK_E_NTSC);
- m_cia_1->set_clock(amiga_state::CLK_E_NTSC);
- m_fdc->set_clock(amiga_state::CLK_7M_NTSC);
-}
-
-void a1200_state::a1200(machine_config &config)
-{
- amiga_base(config);
-
- // keyboard
- auto &kbd(AMIGA_KEYBOARD_INTERFACE(config, "kbd", amiga_keyboard_devices, "a1200_us")); // FIXME: replace with Amiga 1200 devices when we have mask ROM dump
- kbd.kclk_handler().set("cia_0", FUNC(mos8520_device::cnt_w));
- kbd.kdat_handler().set("cia_0", FUNC(mos8520_device::sp_w));
- kbd.krst_handler().set(FUNC(amiga_state::kbreset_w));
-
- // main cpu
- M68EC020(config, m_maincpu, amiga_state::CLK_28M_PAL / 2);
- m_maincpu->set_addrmap(AS_PROGRAM, &a1200_state::a1200_mem);
- m_maincpu->set_cpu_space(AS_PROGRAM);
-
- ADDRESS_MAP_BANK(config, "overlay").set_map(&amiga_state::overlay_2mb_map32).set_options(ENDIANNESS_BIG, 32, 22, 0x200000);
-
- m_screen->set_screen_update(FUNC(amiga_state::screen_update_amiga_aga));
-
- config.device_remove("palette");
-
- MCFG_VIDEO_START_OVERRIDE(amiga_state, amiga_aga)
-
- gayle_device &gayle(GAYLE(config, "gayle", amiga_state::CLK_28M_PAL / 2));
- gayle.set_id(a1200_state::GAYLE_ID);
- gayle.int2_handler().set(FUNC(a1200_state::gayle_int2_w));
- gayle.cs0_read_handler().set("ata", FUNC(ata_interface_device::cs0_r));
- gayle.cs0_write_handler().set("ata", FUNC(ata_interface_device::cs0_w));
- gayle.cs1_read_handler().set("ata", FUNC(ata_interface_device::cs1_r));
- gayle.cs1_write_handler().set("ata", FUNC(ata_interface_device::cs1_w));
-
- ata_interface_device &ata(ATA_INTERFACE(config, "ata").options(ata_devices, "hdd", nullptr, false));
- ata.irq_handler().set("gayle", FUNC(gayle_device::ide_interrupt_w));
-
- // keyboard
-#if 0
- subdevice<amiga_keyboard_bus_device>("kbd").set_default_option("a1200_us");
-#endif
-
- // todo: pcmcia
-
- // software
- SOFTWARE_LIST(config, "aga_list").set_original("amigaaga_flop");
- SOFTWARE_LIST(config, "ecs_list").set_original("amigaecs_flop");
-}
-
-void a1200_state::a1200n(machine_config &config)
-{
- a1200(config);
- m_maincpu->set_clock(amiga_state::CLK_28M_NTSC / 2);
- subdevice<gayle_device>("gayle")->set_clock(amiga_state::CLK_28M_NTSC / 2);
- config.device_remove("screen");
- ntsc_video(config);
- m_screen->set_screen_update(FUNC(amiga_state::screen_update_amiga_aga));
- m_paula->set_clock(amiga_state::CLK_C1_NTSC);
- m_cia_0->set_clock(amiga_state::CLK_E_NTSC);
- m_cia_1->set_clock(amiga_state::CLK_E_NTSC);
- m_fdc->set_clock(amiga_state::CLK_7M_NTSC);
-}
-
-void a4000_state::a4000(machine_config &config)
-{
- amiga_base(config);
-
- // keyboard
- auto &kbd(AMIGA_KEYBOARD_INTERFACE(config, "kbd", amiga_keyboard_devices, "a2000_us"));
- kbd.kclk_handler().set("cia_0", FUNC(mos8520_device::cnt_w));
- kbd.kdat_handler().set("cia_0", FUNC(mos8520_device::sp_w));
-
- // main cpu
- M68040(config, m_maincpu, XTAL(50'000'000) / 2);
- m_maincpu->set_addrmap(AS_PROGRAM, &a4000_state::a4000_mem);
- m_maincpu->set_cpu_space(AS_PROGRAM);
-
- ADDRESS_MAP_BANK(config, "overlay").set_map(&amiga_state::overlay_2mb_map32).set_options(ENDIANNESS_BIG, 32, 22, 0x200000);
-
- m_screen->set_screen_update(FUNC(amiga_state::screen_update_amiga_aga));
-
- config.device_remove("palette");
-
- MCFG_VIDEO_START_OVERRIDE(amiga_state, amiga_aga)
-
- // real-time clock
- RP5C01(config, "rtc", XTAL(32'768));
-
- // ide
- ata_interface_device &ata(ATA_INTERFACE(config, "ata").options(ata_devices, "hdd", nullptr, false));
- ata.irq_handler().set(FUNC(a4000_state::ide_interrupt_w));
-
- // todo: zorro3
-
- // software
- SOFTWARE_LIST(config, "aga_list").set_original("amigaaga_flop");
- SOFTWARE_LIST(config, "ecs_list").set_original("amigaecs_flop");
-}
-
-void a4000_state::a4000n(machine_config &config)
-{
- a4000(config);
-
- config.device_remove("screen");
- ntsc_video(config);
- m_screen->set_screen_update(FUNC(amiga_state::screen_update_amiga_aga));
- m_paula->set_clock(amiga_state::CLK_C1_NTSC);
- m_cia_0->set_clock(amiga_state::CLK_E_NTSC);
- m_cia_1->set_clock(amiga_state::CLK_E_NTSC);
- m_fdc->set_clock(amiga_state::CLK_7M_NTSC);
-}
-
-void a4000_state::a400030(machine_config &config)
-{
- a4000(config);
- // main cpu
- M68EC030(config.replace(), m_maincpu, XTAL(50'000'000) / 2);
- m_maincpu->set_addrmap(AS_PROGRAM, &a4000_state::a400030_mem);
- m_maincpu->set_cpu_space(AS_PROGRAM);
-
- // todo: ide
-}
-
-void a4000_state::a400030n(machine_config &config)
-{
- a400030(config);
- config.device_remove("screen");
- ntsc_video(config);
- m_screen->set_screen_update(FUNC(amiga_state::screen_update_amiga_aga));
- m_paula->set_clock(amiga_state::CLK_C1_NTSC);
- m_cia_0->set_clock(amiga_state::CLK_E_NTSC);
- m_cia_1->set_clock(amiga_state::CLK_E_NTSC);
- m_fdc->set_clock(amiga_state::CLK_7M_NTSC);
-}
-
-void cd32_state::cd32(machine_config &config)
-{
- amiga_base(config);
-
- // main cpu
- M68EC020(config, m_maincpu, amiga_state::CLK_28M_PAL / 2);
- m_maincpu->set_addrmap(AS_PROGRAM, &cd32_state::cd32_mem);
- m_maincpu->set_cpu_space(AS_PROGRAM);
-
- ADDRESS_MAP_BANK(config, "overlay").set_map(&amiga_state::overlay_2mb_map32).set_options(ENDIANNESS_BIG, 32, 22, 0x200000);
-
- I2CMEM(config, "i2cmem", 0).set_page_size(16).set_data_size(1024);
-
- akiko_device &akiko(AKIKO(config, "akiko", 0));
- akiko.mem_r_callback().set(FUNC(amiga_state::chip_ram_r));
- akiko.mem_w_callback().set(FUNC(amiga_state::chip_ram_w));
- akiko.int_callback().set(FUNC(cd32_state::akiko_int_w));
- akiko.scl_callback().set("i2cmem", FUNC(i2cmem_device::write_scl));
- akiko.sda_r_callback().set("i2cmem", FUNC(i2cmem_device::read_sda));
- akiko.sda_w_callback().set("i2cmem", FUNC(i2cmem_device::write_sda));
-
- m_screen->set_screen_update(FUNC(amiga_state::screen_update_amiga_aga));
-
- config.device_remove("palette");
-
- MCFG_VIDEO_START_OVERRIDE(amiga_state, amiga_aga)
-
- CDDA(config, m_cdda);
- m_cdda->add_route(0, "lspeaker", 0.50);
- m_cdda->add_route(1, "rspeaker", 0.50);
-
- m_cia_0->pa_wr_callback().set(FUNC(cd32_state::akiko_cia_0_port_a_write));
- m_cia_0->sp_wr_callback().set_nop();
-
- CDROM(config, "cdrom").set_interface("cd32_cdrom");
- SOFTWARE_LIST(config, "cd_list").set_original("cd32");
-}
-
-void cd32_state::cd32n(machine_config &config)
-{
- cd32(config);
-
- m_maincpu->set_clock(amiga_state::CLK_28M_NTSC / 2);
- config.device_remove("screen");
- ntsc_video(config);
- m_screen->set_screen_update(FUNC(amiga_state::screen_update_amiga_aga));
- m_paula->set_clock(amiga_state::CLK_C1_NTSC);
- m_cia_0->set_clock(amiga_state::CLK_E_NTSC);
- m_cia_1->set_clock(amiga_state::CLK_E_NTSC);
- m_fdc->set_clock(amiga_state::CLK_7M_NTSC);
-}
-
-void a4000_state::a4000t(machine_config &config)
-{
- a4000(config);
- // main cpu
- M68040(config.replace(), m_maincpu, XTAL(50'000'000) / 2);
- m_maincpu->set_addrmap(AS_PROGRAM, &a4000_state::a4000t_mem);
- m_maincpu->set_cpu_space(AS_PROGRAM);
-
- // todo: ide, zorro3, scsi, super dmac
-}
-
-void a4000_state::a4000tn(machine_config &config)
-{
- a4000(config);
-
- config.device_remove("screen");
- ntsc_video(config);
- m_screen->set_screen_update(FUNC(amiga_state::screen_update_amiga_aga));
- m_paula->set_clock(amiga_state::CLK_C1_NTSC);
- m_cia_0->set_clock(amiga_state::CLK_E_NTSC);
- m_cia_1->set_clock(amiga_state::CLK_E_NTSC);
- m_fdc->set_clock(amiga_state::CLK_7M_NTSC);
-}
-
-
-//**************************************************************************
-// ROM DEFINITIONS
-//**************************************************************************
-
-// Amiga 1000
-//
-// Shipped with a small bootrom to load kickstart from disk because the
-// Kickstart wasn't finished in time. ROM type is 23256, but only the
-// first 4kb of it are used.
-
-ROM_START( a1000 )
- ROM_REGION16_BE(0x10000, "bootrom", 0)
- ROM_LOAD16_BYTE("252179-01.u5n", 0x0000, 0x8000, CRC(76bd46ec) SHA1(2155b4887f064c5e01e0a2ebb4a0cc2a3e88d9e8))
- ROM_LOAD16_BYTE("252180-01.u5p", 0x0001, 0x8000, CRC(dd516b6d) SHA1(2c307d02f10ad332a479b50767fd0463efc2844b))
-
- // 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
-
-// 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( a2000 )
- ROM_REGION16_BE(0x80000, "kickstart", 0)
- ROM_DEFAULT_BIOS("kick13")
- ROM_SYSTEM_BIOS(0, "kick12", "Kickstart 1.2 (33.180)")
- ROMX_LOAD("315093-01.u2", 0x00000, 0x40000, CRC(a6ce1636) SHA1(11f9e62cf299f72184835b7b2a70a16333fc0d88), ROM_GROUPWORD | ROM_BIOS(0))
- ROM_COPY("kickstart", 0x00000, 0x40000, 0x40000)
- ROM_SYSTEM_BIOS(1, "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", 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(2))
- ROM_SYSTEM_BIOS(3, "kick31", "Kickstart 3.1 (40.63)")
- ROMX_LOAD("kick40063.u2", 0x00000, 0x80000, CRC(fc24ae0d) SHA1(3b7f1493b27e212830f989f26ca76c02049f09ca), ROM_GROUPWORD | ROM_BIOS(3))
- ROM_SYSTEM_BIOS(4, "logica2", "Logica Diagnostic 2.0")
- ROMX_LOAD("logica2.u2", 0x00000, 0x80000, CRC(8484f426) SHA1(ba10d16166b2e2d6177c979c99edf8462b21651e), ROM_GROUPWORD | ROM_BIOS(4))
-ROM_END
-
-// Amiga 2000CR chip location: U500
-#define rom_a2000n rom_a2000
-
-// Amiga 500 chip location: U6
-#define rom_a500 rom_a2000
-#define rom_a500n rom_a2000
-
-// Amiga 500+
-//
-// Shipped with Kickstart 2.04. Kickstart 3.1 upgrade available.
-
-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", 0x00000, 0x80000, CRC(c3bdb240) SHA1(c5839f5cb98a7a8947065c3ed2f14f5f42e334a1), ROM_GROUPWORD | ROM_BIOS(0))
- ROM_SYSTEM_BIOS(1, "kick31", "Kickstart 3.1 (40.63)")
- ROMX_LOAD("kick40063.u6", 0x00000, 0x80000, CRC(fc24ae0d) SHA1(3b7f1493b27e212830f989f26ca76c02049f09ca), ROM_GROUPWORD | ROM_BIOS(1))
- ROM_SYSTEM_BIOS(2, "logica2", "Logica Diagnostic 2.0")
- ROMX_LOAD("logica2.u6", 0x00000, 0x80000, CRC(8484f426) SHA1(ba10d16166b2e2d6177c979c99edf8462b21651e), ROM_GROUPWORD | ROM_BIOS(2))
-ROM_END
-
-#define rom_a500pn rom_a500p
-
-// Commodore CDTV
-//
-// Shipped with a standard Kickstart 1.3 and the needed additional drivers
-// in two extra chips.
-
-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))
-
- // 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)
-
- // 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", 0x0000, 0x1000, NO_DUMP)
-ROM_END
-
-#define rom_cdtvn rom_cdtv
-
-// Amiga 3000
-//
-// Early models have a special version of Kickstart 1.4/2.0 that boots
-// Kickstart 1.3 or 2.0 from hard disk or floppy. Later versions have
-// Kickstart 2.04 installed as ROM. Upgrade available for
-// Kickstart 3.1.
-
-ROM_START( a3000 )
- ROM_REGION32_BE(0x80000, "kickstart", 0)
- ROM_DEFAULT_BIOS("kick20")
- ROM_SYSTEM_BIOS(0, "kick14", "Kickstart 1.4 (3312.20085?)")
- ROMX_LOAD("390629-01.u182", 0x00000, 0x40000, NO_DUMP, ROM_GROUPWORD | ROM_REVERSE | ROM_SKIP(2) | ROM_BIOS(0))
- ROMX_LOAD("390630-01.u183", 0x00002, 0x40000, NO_DUMP, ROM_GROUPWORD | ROM_REVERSE | ROM_SKIP(2) | ROM_BIOS(0))
- ROM_SYSTEM_BIOS(1, "kick20", "Kickstart 2.0 (36.16)")
- // 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
- ROMX_LOAD("390630-02.u183", 0x00002, 0x40000, CRC(fe2f7fb9) SHA1(c05c9c52d014c66f9019152b3f2a2adc2c678794), ROM_GROUPWORD | ROM_REVERSE | ROM_SKIP(2) | ROM_BIOS(1))
- ROM_SYSTEM_BIOS(2, "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))
- ROMX_LOAD("390630-03.u183", 0x00002, 0x40000, CRC(7db1332b) SHA1(48f14b31279da6757848df6feb5318818f8f576c), ROM_GROUPWORD | ROM_REVERSE | ROM_SKIP(2) | ROM_BIOS(2))
- ROM_SYSTEM_BIOS(3, "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_SYSTEM_BIOS(4, "logica2", "Logica Diagnostic 2.0")
- ROMX_LOAD("logica2.u182", 0x00000, 0x40000, CRC(566bc3f9) SHA1(891d3b7892843517d800d24593168b1d8f1646ca), ROM_GROUPWORD | ROM_REVERSE | ROM_SKIP(2) | ROM_BIOS(4))
- ROMX_LOAD("logica2.u183", 0x00002, 0x40000, CRC(aac94759) SHA1(da8a4f9ae1aa84f5e2a5dcc5c9d7e4378a9698b7), ROM_GROUPWORD | ROM_REVERSE | ROM_SKIP(2) | ROM_BIOS(4))
-ROM_END
-
-#define rom_a3000n rom_a3000
-
-
-// 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.
-
-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(0))
- 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(1))
- 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(2))
- ROM_SYSTEM_BIOS(3, "kick205-350", "Kickstart 2.05 (37.350)")
- ROMX_LOAD("391304-02.u6", 0x00000, 0x80000, CRC(43b0df7b) SHA1(02843c4253bbd29aba535b0aa3bd9a85034ecde4), ROM_GROUPWORD | ROM_BIOS(3))
- ROM_SYSTEM_BIOS(4, "kick31", "Kickstart 3.1 (40.63)")
- ROMX_LOAD("kick40063.u6", 0x00000, 0x80000, CRC(fc24ae0d) SHA1(3b7f1493b27e212830f989f26ca76c02049f09ca), ROM_GROUPWORD | ROM_BIOS(4))
- ROM_SYSTEM_BIOS(5, "logica2", "Logica Diagnostic 2.0")
- ROMX_LOAD("logica2.u6", 0x00000, 0x80000, CRC(8484f426) SHA1(ba10d16166b2e2d6177c979c99edf8462b21651e), 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
-
-// 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.
-
-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(0))
- ROMX_LOAD("391524-01.u6b", 0x00002, 0x40000, CRC(d55c6ec6) SHA1(3341108d3a402882b5ef9d3b242cbf3c8ab1a3e9), ROM_GROUPWORD | ROM_REVERSE | ROM_SKIP(2) | ROM_BIOS(0))
- 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(1))
- ROMX_LOAD("391774-01.u6b", 0x00002, 0x40000, CRC(16c07bf8) SHA1(90e331be1970b0e53f53a9b0390b51b59b3869c2), ROM_GROUPWORD | ROM_REVERSE | ROM_SKIP(2) | ROM_BIOS(1))
- ROM_SYSTEM_BIOS(2, "logica2", "Logica Diagnostic 2.0")
- ROMX_LOAD("logica2.u6a", 0x00000, 0x40000, CRC(566bc3f9) SHA1(891d3b7892843517d800d24593168b1d8f1646ca), ROM_GROUPWORD | ROM_REVERSE | ROM_SKIP(2) | ROM_BIOS(2))
- ROMX_LOAD("logica2.u6b", 0x00002, 0x40000, CRC(aac94759) SHA1(da8a4f9ae1aa84f5e2a5dcc5c9d7e4378a9698b7), ROM_GROUPWORD | ROM_REVERSE | ROM_SKIP(2) | ROM_BIOS(2))
-ROM_END
-
-#define rom_a1200n rom_a1200
-
-// Amiga 4000
-//
-// Shipped with Kickstart 3.0, upgradable to Kickstart 3.1.
-
-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(0))
- ROMX_LOAD("391514-02.u176", 0x00002, 0x40000, CRC(17266a55) SHA1(42fbed3453d1f11ccbde89a9826f2d1175cca5cc), ROM_GROUPWORD | ROM_REVERSE | ROM_SKIP(2) | ROM_BIOS(0))
- 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(1))
- ROMX_LOAD("kick40068.u176", 0x00002, 0x40000, CRC(e65636a3) SHA1(313c7cbda5779e56f19a41d34e760f517626d882), ROM_GROUPWORD | ROM_REVERSE | ROM_SKIP(2) | ROM_BIOS(1))
- 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_SYSTEM_BIOS(3, "logica2", "Logica Diagnostic 2.0")
- ROMX_LOAD("logica2.u6a", 0x00000, 0x40000, CRC(566bc3f9) SHA1(891d3b7892843517d800d24593168b1d8f1646ca), ROM_GROUPWORD | ROM_REVERSE | ROM_SKIP(2) | ROM_BIOS(3))
- ROMX_LOAD("logica2.u6b", 0x00002, 0x40000, CRC(aac94759) SHA1(da8a4f9ae1aa84f5e2a5dcc5c9d7e4378a9698b7), ROM_GROUPWORD | ROM_REVERSE | ROM_SKIP(2) | ROM_BIOS(3))
-ROM_END
-
-#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)
- ROM_DEFAULT_BIOS("kick31")
- ROM_SYSTEM_BIOS(0, "kick31", "Kickstart 3.1 (40.70)")
- ROMX_LOAD("391657-01.u175", 0x00000, 0x40000, CRC(0ca94f70) SHA1(b3806edacb3362fc16a154ce1eeec5bf5bc24789), ROM_GROUPWORD | ROM_REVERSE | ROM_SKIP(2) | ROM_BIOS(0))
- ROMX_LOAD("391658-01.u176", 0x00002, 0x40000, CRC(dfe03120) SHA1(cd7a706c431b04d87814d3a2d8b397100cf44c0c), ROM_GROUPWORD | ROM_REVERSE | ROM_SKIP(2) | ROM_BIOS(0))
- ROM_SYSTEM_BIOS(1, "logica2", "Logica Diagnostic 2.0")
- ROMX_LOAD("logica2.u6a", 0x00000, 0x40000, CRC(566bc3f9) SHA1(891d3b7892843517d800d24593168b1d8f1646ca), ROM_GROUPWORD | ROM_REVERSE | ROM_SKIP(2) | ROM_BIOS(1))
- ROMX_LOAD("logica2.u6b", 0x00002, 0x40000, CRC(aac94759) SHA1(da8a4f9ae1aa84f5e2a5dcc5c9d7e4378a9698b7), ROM_GROUPWORD | ROM_REVERSE | ROM_SKIP(2) | ROM_BIOS(1))
-ROM_END
-
-#define rom_a4000tn rom_a4000t
-
-// 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
-
-#define rom_cd32n rom_cd32
-
-
-//**************************************************************************
-// SYSTEM DRIVERS
-//**************************************************************************
-
-// OCS Chipset
-COMP( 1985, a1000, 0, 0, a1000, amiga, a1000_state, init_pal, "Commodore", "Amiga 1000 (PAL)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS )
-COMP( 1985, a1000n, a1000, 0, a1000n, amiga, a1000_state, init_ntsc, "Commodore", "Amiga 1000 (NTSC)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS )
-COMP( 1987, a2000, 0, 0, a2000, amiga, a2000_state, init_pal, "Commodore", "Amiga 2000 (PAL)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS )
-COMP( 1987, a2000n, a2000, 0, a2000n, amiga, a2000_state, init_ntsc, "Commodore", "Amiga 2000 (NTSC)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS )
-COMP( 1987, a500, 0, 0, a500, amiga, a500_state, init_pal, "Commodore", "Amiga 500 (PAL)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS )
-COMP( 1987, a500n, a500, 0, a500n, amiga, a500_state, init_ntsc, "Commodore", "Amiga 500 (NTSC)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS )
-COMP( 1990, cdtv, 0, 0, cdtv, amiga, cdtv_state, init_pal, "Commodore", "CDTV (PAL)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS )
-COMP( 1990, cdtvn, cdtv, 0, cdtvn, amiga, cdtv_state, init_ntsc, "Commodore", "CDTV (NTSC)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS )
-
-// ECS Chipset
-COMP( 1990, a3000, 0, 0, a3000, amiga, a3000_state, init_pal, "Commodore", "Amiga 3000 (PAL)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS )
-COMP( 1990, a3000n, a3000, 0, a3000n, amiga, a3000_state, init_ntsc, "Commodore", "Amiga 3000 (NTSC)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS )
-COMP( 1992, a500p, 0, 0, a500p, amiga, a500p_state, init_pal, "Commodore", "Amiga 500 Plus (PAL)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS )
-COMP( 1992, a500pn, a500p, 0, a500pn, amiga, a500p_state, init_ntsc, "Commodore", "Amiga 500 Plus (NTSC)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS )
-COMP( 1992, a600, 0, 0, a600, amiga, a600_state, init_pal, "Commodore", "Amiga 600 (PAL)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS )
-COMP( 1992, a600n, a600, 0, a600n, amiga, a600_state, init_ntsc, "Commodore", "Amiga 600 (NTSC)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS )
-
-// AGA Chipset
-COMP( 1992, a1200, 0, 0, a1200, amiga, a1200_state, init_pal, "Commodore", "Amiga 1200 (PAL)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS )
-COMP( 1992, a1200n, a1200, 0, a1200n, amiga, a1200_state, init_ntsc, "Commodore", "Amiga 1200 (NTSC)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS )
-COMP( 1992, a4000, 0, 0, a4000, amiga, a4000_state, init_pal, "Commodore", "Amiga 4000/040 (PAL)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS )
-COMP( 1992, a4000n, a4000, 0, a4000n, amiga, a4000_state, init_ntsc, "Commodore", "Amiga 4000/040 (NTSC)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS )
-COMP( 1993, a400030, a4000, 0, a400030, amiga, a4000_state, init_pal, "Commodore", "Amiga 4000/030 (PAL)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS )
-COMP( 1993, a400030n, a4000, 0, a400030n, amiga, a4000_state, init_ntsc, "Commodore", "Amiga 4000/030 (NTSC)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS )
-COMP( 1993, cd32, 0, 0, cd32, cd32, cd32_state, init_pal, "Commodore", "Amiga CD32 (PAL)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS )
-COMP( 1993, cd32n, cd32, 0, cd32n, cd32, cd32_state, init_ntsc, "Commodore", "Amiga CD32 (NTSC)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS )
-COMP( 1994, a4000t, 0, 0, a4000t, amiga, a4000_state, init_pal, "Commodore", "Amiga 4000T (PAL)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS )
-COMP( 1994, a4000tn, a4000t, 0, a4000tn, amiga, a4000_state, init_ntsc, "Commodore", "Amiga 4000T (NTSC)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS )