summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/cubocd32.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/cubocd32.c')
-rw-r--r--src/mame/drivers/cubocd32.c400
1 files changed, 400 insertions, 0 deletions
diff --git a/src/mame/drivers/cubocd32.c b/src/mame/drivers/cubocd32.c
new file mode 100644
index 00000000000..f2c4dd4b015
--- /dev/null
+++ b/src/mame/drivers/cubocd32.c
@@ -0,0 +1,400 @@
+/* Cubo CD32 (Original hardware by Commodore, additional hardware and games by CD Express, Milan, Italy)
+
+ This is basically a CD32 (Amiga 68020, AGA based games system) hacked up to run arcade games.
+ see http://ninjaw.ifrance.com/cd32/cubo/ for a brief overview.
+
+ Several of the games have Audio tracks, therefore the CRC / SHA1 information you get when
+ reading your own CDs may not match those in the driver. There is currently no 100% accurate
+ way to rip the audio data with full sub-track and offset information.
+
+ CD32 Hardware Specs (from Wikipedia, http://en.wikipedia.org/wiki/Amiga_CD32)
+ * Main Processor: Motorola 68EC020 at 14.3 MHz
+ * System Memory: 2 MB Chip RAM
+ * 1 MB ROM with Kickstart ROM 3.1 and integrated cdfs.filesystem
+ * 1KB of FlashROM for game saves
+ * Graphics/Chipset: AGA Chipset
+ * Akiko chip, which handles CD-ROM and can do Chunky to Planar conversion
+ * Proprietary (MKE) CD-ROM drive at 2x speed
+ * Expansion socket for MPEG cartridge, as well as 3rd party devices such as the SX-1 and SX32 expansion packs.
+ * 4 8-bit audio channels (2 for left, 2 for right)
+ * Gamepad, Serial port, 2 Gameports, Interfaces for keyboard
+
+
+ ToDo:
+
+ Everything - This is a skeleton driver.
+ Add full AGA (68020 based systems, Amiga 1200 / CD32) support to Amiga driver
+ Add CD Controller emulation for CD32.
+ ... work from there
+
+
+ Known Games:
+ Title | rev. | year
+ ----------------------------------------------
+ Candy Puzzle | 1.0 | 1995
+ Harem Challenge | | 1995
+ Laser Quiz | | 1995
+ Laser Quiz 2 "Italy" | 1.0 | 1995
+ Laser Strixx | | 1995
+ Magic Premium | 1.1 | 1996
+ Laser Quiz France | 1.0 | 1995
+ Odeon Twister | | 199x
+ Odeon Twister 2 |202.19| 1999
+
+
+*/
+
+#include "driver.h"
+#include "sound/custom.h"
+#include "includes/amiga.h"
+#include "includes/cubocd32.h"
+//#include "memconv.h"
+
+//READWRITE16BETO32BE(amiga_cia32,amiga_cia_r,amiga_cia_w)
+//READWRITE16BETO32BE(amiga_custom32,amiga_custom_r,amiga_custom_w)
+
+static READ32_HANDLER( amiga_cia32_r )
+{
+ UINT32 result = 0;
+ if ((mem_mask & 0xffff0000) != 0xffff0000)
+ result |= amiga_cia_r(offset * 2 + 0, mem_mask >> 16) << 16;
+ if ((mem_mask & 0x0000ffff) != 0x0000ffff)
+ result |= amiga_cia_r(offset * 2 + 1, mem_mask) << 0;
+ return result;
+}
+
+static WRITE32_HANDLER( amiga_cia32_w )
+{
+ if ((mem_mask & 0xffff0000) != 0xffff0000)
+ amiga_cia_w( offset * 2 + 0, data >> 16, mem_mask >> 16);
+ if ((mem_mask & 0x0000ffff) != 0x0000ffff)
+ amiga_cia_w( offset * 2 + 1, data, mem_mask);
+}
+
+static READ32_HANDLER( amiga_custom32_r )
+{
+ UINT32 result = 0;
+ if ((mem_mask & 0xffff0000) != 0xffff0000)
+ result |= amiga_custom_r(offset * 2 + 0, mem_mask >> 16) << 16;
+ if ((mem_mask & 0x0000ffff) != 0x0000ffff)
+ result |= amiga_custom_r(offset * 2 + 1, mem_mask) << 0;
+ return result;
+}
+
+static WRITE32_HANDLER( amiga_custom32_w )
+{
+ if ((mem_mask & 0xffff0000) != 0xffff0000)
+ amiga_custom_w( offset * 2 + 0, data >> 16, mem_mask >> 16);
+ if ((mem_mask & 0x0000ffff) != 0x0000ffff)
+ amiga_custom_w( offset * 2 + 1, data, mem_mask);
+}
+
+static WRITE32_HANDLER( aga_overlay_w )
+{
+ if ((mem_mask & 0x00ff0000) != 0x00ff0000)
+ {
+ data = (data >> 16) & 1;
+
+ /* switch banks as appropriate */
+ memory_set_bank(1, 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 */
+ memory_install_write32_handler(0, ADDRESS_SPACE_PROGRAM, 0x000000, 0x1fffff, 0, 0, MWA32_BANK1);
+ else
+ /* overlay enabled, map Amiga system ROM on 0x000000 */
+ memory_install_write32_handler(0, ADDRESS_SPACE_PROGRAM, 0x000000, 0x1fffff, 0, 0, MWA32_ROM);
+ }
+}
+
+/*************************************
+ *
+ * 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
+ *
+ *************************************/
+
+static UINT8 cd32_cia_0_porta_r(void)
+{
+ return readinputportbytag("CIA0PORTA");
+}
+
+static void cd32_cia_0_porta_w(UINT8 data)
+{
+ /* bit 1 = cd audio mute */
+ sndti_set_output_gain(SOUND_CDDA, 0, 0, ( data & 1 ) ? 0.0 : 1.0 );
+
+ /* bit 2 = Power Led on Amiga */
+ set_led_status(0, (data & 2) ? 0 : 1);
+}
+
+/*************************************
+ *
+ * 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
+ *
+ *************************************/
+
+static UINT8 cd32_cia_0_portb_r(void)
+{
+ /* parallel port */
+ logerror("%06x:CIA0_portb_r\n", activecpu_get_pc());
+ return 0xff;
+}
+
+static void cd32_cia_0_portb_w(UINT8 data)
+{
+ /* parallel port */
+ logerror("%06x:CIA0_portb_w(%02x)\n", activecpu_get_pc(), data);
+}
+
+static READ32_HANDLER( dipswitch_r )
+{
+ return readinputportbytag("DIPSW1");
+}
+
+static ADDRESS_MAP_START( cd32_map, ADDRESS_SPACE_PROGRAM, 32 )
+ ADDRESS_MAP_FLAGS( AMEF_UNMAP(1) )
+ AM_RANGE(0x000000, 0x1fffff) AM_RAMBANK(1) AM_BASE(&amiga_chip_ram32) AM_SIZE(&amiga_chip_ram_size)
+ AM_RANGE(0x800000, 0x800003) AM_READ( dipswitch_r )
+ AM_RANGE(0xb80000, 0xb8003f) AM_READWRITE(amiga_akiko32_r, amiga_akiko32_w)
+ AM_RANGE(0xbfa000, 0xbfa003) AM_WRITE(aga_overlay_w)
+ AM_RANGE(0xbfd000, 0xbfefff) AM_READWRITE(amiga_cia32_r, amiga_cia32_w)
+ AM_RANGE(0xc00000, 0xdfffff) AM_READWRITE(amiga_custom32_r, amiga_custom32_w) AM_BASE((UINT32**)&amiga_custom_regs)
+ AM_RANGE(0xe00000, 0xe7ffff) AM_ROM AM_REGION(REGION_USER1, 0x80000) /* CD32 Extended ROM */
+ AM_RANGE(0xa00000, 0xf7ffff) AM_NOP
+ AM_RANGE(0xf80000, 0xffffff) AM_ROM AM_REGION(REGION_USER1, 0x0) /* Kickstart */
+ADDRESS_MAP_END
+
+
+
+static INPUT_PORTS_START( cd32 )
+ PORT_START_TAG("CIA0PORTA")
+ PORT_BIT( 0x3f, IP_ACTIVE_LOW, IPT_SPECIAL )
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON1 )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL
+
+ PORT_START_TAG("CIA0PORTB")
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_START2 )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_START1 )
+
+ PORT_START_TAG("JOY0DAT")
+ PORT_BIT( 0x0303, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM(amiga_joystick_convert, "P1JOY")
+ PORT_BIT( 0xfcfc, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_START_TAG("JOY1DAT")
+ PORT_BIT( 0x0303, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM(amiga_joystick_convert, "P2JOY")
+ PORT_BIT( 0xfcfc, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_START_TAG("POTGO")
+ PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_BUTTON2 )
+ PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_COCKTAIL
+ PORT_BIT( 0xaaff, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_START_TAG("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)
+
+ PORT_START_TAG("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)
+
+ PORT_START_TAG("COINS")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 )
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_COIN2 )
+
+ PORT_START_TAG("DIPSW1")
+ PORT_DIPNAME( 0x01, 0x01, "DSW1 1" )
+ PORT_DIPSETTING( 0x01, "Reset" )
+ PORT_DIPSETTING( 0x00, "Set" )
+ PORT_DIPNAME( 0x02, 0x02, "DSW1 2" )
+ PORT_DIPSETTING( 0x02, "Reset" )
+ PORT_DIPSETTING( 0x00, "Set" )
+ PORT_DIPNAME( 0x04, 0x04, "DSW1 3" )
+ PORT_DIPSETTING( 0x04, "Reset" )
+ PORT_DIPSETTING( 0x00, "Set" )
+ PORT_DIPNAME( 0x08, 0x08, "DSW1 4" )
+ PORT_DIPSETTING( 0x08, "Reset" )
+ PORT_DIPSETTING( 0x00, "Set" )
+ PORT_DIPNAME( 0x10, 0x10, "DSW1 5" )
+ PORT_DIPSETTING( 0x10, "Reset" )
+ PORT_DIPSETTING( 0x00, "Set" )
+ PORT_DIPNAME( 0x20, 0x20, "DSW1 6" )
+ PORT_DIPSETTING( 0x20, "Reset" )
+ PORT_DIPSETTING( 0x00, "Set" )
+ PORT_SERVICE( 0x40, IP_ACTIVE_HIGH )
+ PORT_DIPNAME( 0x80, 0x80, "DSW1 8" )
+ PORT_DIPSETTING( 0x80, "Reset" )
+ PORT_DIPSETTING( 0x00, "Set" )
+INPUT_PORTS_END
+
+/*************************************
+ *
+ * Sound definitions
+ *
+ *************************************/
+
+static struct CustomSound_interface amiga_custom_interface =
+{
+ amiga_sh_start
+};
+
+
+static MACHINE_DRIVER_START( cd32 )
+
+ /* basic machine hardware */
+ MDRV_CPU_ADD(M68EC020, AMIGA_68EC020_PAL_CLOCK) /* 14.3 Mhz */
+ MDRV_CPU_PROGRAM_MAP(cd32_map,0)
+ MDRV_CPU_VBLANK_INT(amiga_scanline_callback, 312)
+
+ MDRV_SCREEN_REFRESH_RATE(59.997)
+ MDRV_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
+
+ MDRV_MACHINE_RESET(amiga)
+ MDRV_NVRAM_HANDLER(cd32)
+
+ /* video hardware */
+ MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER | VIDEO_UPDATE_BEFORE_VBLANK)
+ MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
+ MDRV_SCREEN_SIZE(512*2, 312)
+ MDRV_SCREEN_VISIBLE_AREA((129-8)*2, (449+8-1)*2, 44-8, 300+8-1)
+ MDRV_PALETTE_LENGTH(4096)
+ MDRV_PALETTE_INIT(amiga)
+
+ MDRV_VIDEO_START(amiga)
+ MDRV_VIDEO_UPDATE(generic_bitmapped)
+
+ /* sound hardware */
+ MDRV_SPEAKER_STANDARD_STEREO("left", "right")
+
+ MDRV_SOUND_ADD(CUSTOM, 3579545)
+ MDRV_SOUND_CONFIG(amiga_custom_interface)
+ MDRV_SOUND_ROUTE(0, "left", 0.25)
+ MDRV_SOUND_ROUTE(1, "right", 0.25)
+ MDRV_SOUND_ROUTE(2, "right", 0.25)
+ MDRV_SOUND_ROUTE(3, "left", 0.25)
+
+ MDRV_SOUND_ADD( CDDA, 0 )
+ MDRV_SOUND_ROUTE( 0, "left", 0.50 )
+ MDRV_SOUND_ROUTE( 1, "right", 0.50 )
+MACHINE_DRIVER_END
+
+
+
+#define ROM_LOAD16_WORD_BIOS(bios,name,offset,length,hash) ROMX_LOAD(name, offset, length, hash, ROM_BIOS(bios+1))
+
+#define CD32_BIOS \
+ ROM_REGION32_BE(0x100000, REGION_USER1, 0 ) \
+ ROM_SYSTEM_BIOS(0, "cd32", "Kickstart v3.1 rev 40.60 with CD32 Extended-ROM" ) \
+ ROM_LOAD16_WORD_BIOS(0, "391640-03.u6a", 0x000000, 0x100000, CRC(d3837ae4) SHA1(06807db3181637455f4d46582d9972afec8956d9) ) \
+
+
+ROM_START( cd32 )
+ CD32_BIOS
+ROM_END
+
+ROM_START( cndypuzl )
+ CD32_BIOS
+
+ DISK_REGION( REGION_DISKS )
+ DISK_IMAGE_READONLY( "cndypuzl", 0, SHA1(21093753a1875dc4fb97f23232ed3d8776b48c06) MD5(dcb6cdd7d81d5468c1290a3baf4265cb) )
+ROM_END
+
+ROM_START( haremchl )
+ CD32_BIOS
+
+ DISK_REGION( REGION_DISKS )
+ DISK_IMAGE_READONLY( "haremchl", 0, SHA1(4d5df2b64b376e8d0574100110f3471d3190765c) MD5(00adbd944c05747e9445446306f904be) )
+ROM_END
+
+ROM_START( lsrquiz )
+ CD32_BIOS
+
+ DISK_REGION( REGION_DISKS )
+ DISK_IMAGE_READONLY( "lsrquiz", 0, SHA1(4250c94ab77504104005229b28f24cfabe7c9e48) MD5(12a94f573fe5d218db510166b86fdda5) )
+ROM_END
+
+ROM_START( lsrquiz2 )
+ CD32_BIOS
+
+ DISK_REGION( REGION_DISKS )
+ DISK_IMAGE_READONLY( "lsrquiz2", 0, SHA1(ea92df0e53bf36bb86d99ad19fca21c6129e61d7) MD5(df63c32aca815f6c97889e08c10b77bc) )
+ROM_END
+
+ROM_START( mgprem11 )
+ CD32_BIOS
+
+ DISK_REGION( REGION_DISKS )
+ DISK_IMAGE_READONLY( "mgprem11", 0, SHA1(a8a32d10148ba968b57b8186fdf4d4cd378fb0d5) MD5(e0e4d00c6f981c19a1d20d5e7090b0db) )
+ROM_END
+
+ROM_START( lasstixx )
+ CD32_BIOS
+
+ DISK_REGION( REGION_DISKS )
+ DISK_IMAGE_READONLY( "lasstixx", 0, SHA1(29c2525d43a696da54648caffac9952cec85fd37) MD5(6242dd8a3c0b15ef9eafb930b7a7e87f) )
+ROM_END
+
+/***************************************************************************************************/
+
+static DRIVER_INIT( cd32 )
+{
+ static const amiga_machine_interface cubocd32_intf =
+ {
+ AGA_CHIP_RAM_MASK,
+ cd32_cia_0_porta_r, cd32_cia_0_portb_r,
+ cd32_cia_0_porta_w, cd32_cia_0_portb_w,
+ NULL, NULL,
+ NULL, NULL,
+ NULL, NULL, NULL,
+ NULL, NULL, NULL,
+ NULL, NULL,
+ NULL,
+ FLAGS_AGA_CHIPSET
+ };
+
+ /* configure our Amiga setup */
+ amiga_machine_config(&cubocd32_intf);
+
+ /* set up memory */
+ memory_configure_bank(1, 0, 1, amiga_chip_ram32, 0);
+ memory_configure_bank(1, 1, 1, memory_region(REGION_USER1), 0);
+
+ /* intialize akiko */
+ amiga_akiko_init();
+}
+
+/***************************************************************************************************/
+
+/* BIOS */
+GAME( 1993, cd32, 0, cd32, cd32, cd32, ROT0, "Commodore", "Amiga CD32 Bios", GAME_IS_BIOS_ROOT )
+
+GAME( 1995, cndypuzl, cd32, cd32, cd32, cd32, ROT0, "CD Express", "Candy Puzzle (v1.0)", GAME_NOT_WORKING|GAME_NO_SOUND )
+GAME( 1995, haremchl, cd32, cd32, cd32, cd32, ROT0, "CD Express", "Harem Challenge", GAME_NOT_WORKING|GAME_NO_SOUND )
+GAME( 1995, lsrquiz, cd32, cd32, cd32, cd32, ROT0, "CD Express", "Laser Quiz", GAME_NOT_WORKING|GAME_NO_SOUND )
+GAME( 1995, lsrquiz2, cd32, cd32, cd32, cd32, ROT0, "CD Express", "Laser Quiz '2' Italy (v1.0)", GAME_NOT_WORKING|GAME_NO_SOUND )
+GAME( 1996, mgprem11, cd32, cd32, cd32, cd32, ROT0, "CD Express", "Magic Premium (v1.1)", GAME_NOT_WORKING|GAME_NO_SOUND )
+GAME( 1995, lasstixx, cd32, cd32, cd32, cd32, ROT0, "CD Express", "Laser Strixx", GAME_NOT_WORKING|GAME_NO_SOUND )