diff options
Diffstat (limited to 'src/mess/drivers/amiga.c')
-rw-r--r-- | src/mess/drivers/amiga.c | 2766 |
1 files changed, 1755 insertions, 1011 deletions
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 ) |