summaryrefslogtreecommitdiffstatshomepage
path: root/trunk/src/mame/drivers/jaguar.c
diff options
context:
space:
mode:
Diffstat (limited to 'trunk/src/mame/drivers/jaguar.c')
-rw-r--r--trunk/src/mame/drivers/jaguar.c2479
1 files changed, 2479 insertions, 0 deletions
diff --git a/trunk/src/mame/drivers/jaguar.c b/trunk/src/mame/drivers/jaguar.c
new file mode 100644
index 00000000000..a2916da749c
--- /dev/null
+++ b/trunk/src/mame/drivers/jaguar.c
@@ -0,0 +1,2479 @@
+/***************************************************************************
+
+ Atari Jaguar (Home) & Atari CoJag (Arcade) hardware
+
+ The CoJag arcade system is based on the Jaguar system, but with an upgraded
+ main CPU (68020 or MIPS instead of the plain 68000 found in the Jaguar)
+
+ driver by Aaron Giles
+ console support originally by Nathan Woods
+
+ CoJag Games supported:
+ * Area 51 (3 Sets)
+ * Maximum Force (2 Sets)
+ * Area 51/Maximum Force Duo (2 Sets)
+ * Vicious Circle
+ * Fishin' Frenzy
+ * Freeze
+
+ To do:
+ * (CoJag) map out unused RAM per-game via memory_nop_read/write
+ * (Jaguar) support is very poor, most games aren't properly playable
+ or have severe performance issues or crashes related to the unsafe
+ blitter code. Only Pinball Fantasies is fully playable albeit
+ without sound.
+ * The code (GPU/DSP access) should probably be refactored around the
+ 16-bit interface from the plain 68k, the driver currently uses
+ trampoline functions due to the original driver being entirely
+ 32-bit due to the CPUs on CoJag.
+
+ Note: There is believed to be a 68020 version of Maximum Force
+ (not confirmed or dumped)
+
+****************************************************************************
+
+ Area51/Maximum Force (c)1997 Atari Games
+ Maximum Force
+ A055451
+
+ Components:
+ sdt79r3041-20j
+ Atari Jaguar CPU V1.0 6sc880hf106
+ Atari Jaguar DSP V1.0 sc414201ft (has Motorolla logo)
+ Altera epm7128elc84-15 marked A-21652
+ VIA vt83c461 IDE controller
+ Actel a1010b marked A-22096 near IDE and gun inputs
+ Dallas ds1232s watchdog
+ 52MHz osc near Altera PLCC
+ 40MHz osc near 79R3041
+ 14.318180MHz osc near Jag DSP
+ 12x hm514260cj7 RAM (near Jaguar CPU/DSP)
+ 4x sdt71256 RAM (near Boot ROMs's)
+ Atmel atf16v8b marked a-21647 (near Jag CPU)
+ Altera ep22lc-10 marked A-21648 (near Jag DSP)
+ ICT 22cv10aj marked A-21649 (near Jag CPU)
+ ICT 22cv10aj marked A-21650 (near Jag CPU)
+ ICT 22cv10aj marked A-21651 (near Jag CPU)
+ tea6320t
+ AKM ak4310vm
+ tda1554q amplifier
+ Microchip 28c16a-15 BRAM
+
+ ROM's:
+ 27c4001
+ R3K MAX/A51 KIT
+ LL
+ (c)1997 Atari
+ V 1.0
+
+ 27c4001
+ R3K MAX/A51 KIT
+ LH
+ (c)1997 Atari
+ V 1.0
+
+ 27c4001
+ R3K MAX/A51 KIT
+ HL
+ (c)1997 Atari
+ V 1.0
+
+ 27c4001
+ R3K MAX/A51 KIT
+ HH
+ (c)1997 Atari
+ V 1.0
+
+ Jumpers:
+ jsp1 (1/2 connected= w/sub 2/3 connected= normal speaker)
+ jsp2 (1/2 connected= w/sub 2/3 connected= normal speaker)
+ jamaud (1/2 connected=stereo 2/3 connected=mono)
+ jimpr (1/2 connected=hi video R impedance 2/3 connected=lo)
+ jimpg (1/2 connected=hi video G impedance 2/3 connected=lo)
+ jimpb (1/2 connected=hi video B impedance 2/3 connected=lo)
+
+ Connectors:
+ idea standard IDE connector
+ ideb laptop size IDE connector
+ jgun1 8 pin gun input
+ jgun2 8 pin gun input
+ xtracoin 1 6 pin (coin3/4 bills?)
+ jvupdn 3 pin (?)
+ jsync 3 pin (?)
+ JAMMA
+ jspkr left/right/subwoofer output
+ hdpower 4 pin PC power connector for HD
+
+****************************************************************************
+
+Area 51 (Time Warner Interactive License)
+Atari/Mesa Logic, 1995
+
+This game runs on Atari Cojag 68k hardware.
+
+PCB Layouts
+-----------
+
+Main Board:
+
+COJAG A053538
+ATARI GAMES (C) 1994
+(Atari comment near AMP - 'MMM, DONUTS.')
+|--------------------------------------------------|
+|TDA1554Q TEA6320T AK4310 JXCLKTRM |
+|JSPKR ST91D314 XC7336 |
+| JSP1 JWELLSR PAL4 PAL5 |
+| JSP4 JSP2 PAL1 45160 45160 * * |
+| HDPOWER JSP3 JWELLSB JXBUS|
+| SELFTEST PAL2 PAL6 45160 45160 * * |
+| LED JWELLSG |
+| LED |------|45160 45160 * * |
+|J LED |JAGUAR| |
+|A | CPU |45160 45160 * * |
+|M | | |
+|M |------| |
+|A |
+| 14.31818MHz |------| |
+| LM613 |JAGUAR| |
+| 52MHz PAL3 | DSP | |
+| | | |
+| JSYNC |------| |
+| JVUPDN DIP8 |
+| A1010B |
+|JPLY3 JVCR VT83C461 |
+| |
+| LED |
+| JPLY4 JGUN2 JGUN1 JIDEB |
+|--------------------------------------------------|
+Notes:
+ JAGUAR CPU - Atari Jaguar CPU (QFP208)
+ JAGUAR DSP - Atari Jaguar DSP (QFP160)
+ 45160 - TMS45160DZ-70 512K x16 DRAM (SOJ40)
+ Note: This RAM is in banks. There are 4 banks, each bank is 2MBytes x 64bit
+ Only banks 0 and 1 are populated.
+ * - Unpopulated DRAM positions (banks 2 and 3)
+ TDA1554Q - Philips TDA1554Q power AMP
+ TEA6320T - Philips TEA6320T op AMP (SOP32)
+ AK4310 - AKM AK4310VM (SOIC24)
+ ST91D314 - STS Microelectronics ST91D314 3403 op AMP (SOIC14)
+ PAL1 - ATMEL ATF16V8B PAL (labelled '136105-0006', PLCC20)
+ PAL2 - ATMEL ATF16V8B PAL (labelled '136105-0006', PLCC20)
+ PAL3 - ATMEL ATF16V8B PAL (labelled '136105-0007', PLCC20)
+ PAL4, PAL5 - Philips PL22V10-10A PAL (labelled 'MYF 136105-0008', PLCC28)
+ PAL6 - ATMEL ATF16V8B (labelled '136105-0005', PLCC20)
+ A1010B - ACTEL A1010B Complex Programmable Logic Device (labeled 'MYF 136105-0010', PLCC44)
+ XC7336 - Xilinx XC7336 Complex PRogrammable Logic Device (labelled 'MYF 136105-0009', PLCC44)
+ VT83C461 - VIA VT83C461 IDE Hard Drive Controller (QFP100)
+ LM613 - (DIP16)
+ SELFTEST - Test Switch
+ HDPOWER - Standard (PC-type) 4 pin hard drive power connector
+ JSP1 - 3 pin jumper block, set to 2-3
+ JSP2 - 3 pin jumper block, set to 2-3
+ JSP3 - 3 pin jumper block, jumper not installed
+ JSP4 - 3 pin jumper block, set to 2-3
+ JWELLSR - 3 pin jumper block, set to 2-3
+ JWELLSB - 3 pin jumper block, set to 2-3
+ JWELLSG - 3 pin jumper block, set to 2-3
+ JSYNC - 3 pin jumper block, jumper not installed
+ JVUPDN - 3 pin jumper block, jumper not installed
+ JVCR - 3 pin jumper block, jumper not installed
+ JXCLKTRM - 2 pin header, not shorted
+ JPLY3 - Connector for player 3 controls
+ JPLY4 - Connector for player 4 controls
+ JGUN1 - Connector for player 1 gun
+ JGUN2 - Connector for player 2 gun
+ JIDEB - Connector for 40 pin IDE cable connected to Quantum Fireball 1080AT IDE hard drive (C/H/S = 2112/16/63)
+ JSPKR - Connector for left/right speaker for stereo sound output
+ DIP8 - Unpopulated DIP8 socket
+ JXBUS - 96 pin connector to top board
+
+
+Top Board:
+
+EC20X32
+A053448
+ATARI GAMES (C) 1994
+|------------------------------|
+| 136105-0002C.3P|
+| 71256 |
+| 136105-0001C.3M|
+| 71256 |
+| 136105-0000C.3K|
+| 71256 |
+| 136105-0003C.3H|
+| 71256 |
+| LED |
+| |
+| AT28C16 DS1232 XC7354 |
+| |
+| |
+| MC68EC020 |
+| |
+| 50MHz |
+|------------------------------|
+Notes:
+ MC68EC020 - Motorola 68EC020FG25 CPU clocked at 25MHz (QFP100)
+ AT28C16 - ATMEL 2k x8 EEPROM (DIP24)
+ XC7354 - Xilinx XC7354 Complex Programmable Logic Device (labelled 'MYF 136105-0004', PLCC68, socketed)
+ DS1232 - Dallas DS1232 System Reset IC (DIP8)
+ 71256 - 32K x8 SRAM (SOJ28)
+ 136105-0002C.3P - 27C040 EPROM (labelled 'AREA 51 136105-0002C (C)1995 ATARI GMS CS 55FE', DIP32)
+ 136105-0001C.3M - 27C040 EPROM (labelled 'AREA 51 136105-0001C (C)1995 ATARI GMS CS 3DFD', DIP32)
+ 136105-0000C.3K - 27C040 EPROM (labelled 'AREA 51 136105-0000C (C)1995 ATARI GMS CS 63FC', DIP32)
+ 136105-0003C.3H - 27C040 EPROM (labelled 'AREA 51 136105-0003C (C)1995 ATARI GMS CS 45FF', DIP32)
+
+****************************************************************************
+
+Maximum Force
+Atari, 1997
+
+PCB Layout
+----------
+
+MAXIMUM FORCE A055451 ATARI GAMES (C) 1996
+|-----------------------------------------------------------------------------------|
+|HM514260CJ7 HM514260CJ7 HM514260CJ7 HM514260CJ7 AT28C16 |
+| |
+|HM514260CJ7 HM514260CJ7 HM514260CJ7 HM514260CJ7 PROGLL.17Y PROGLH.21Y |
+| |
+|HM514260CJ7 HM514260CJ7 HM514260CJ7 HM514260CJ7 PROGHL.21V PROGHH.21V |
+| |
+| |
+| |------| |------| |
+| |JAGUAR| |JAGUAR| |
+|GAL GAL |GPU | |DSP | |----------| |
+| |------| |------| | | |
+| |IDT | |
+|GAL GAL 40MHz |79R3041-20| |
+| GAL | | |
+| 14.31818MHz |----------| IDE |
+|AK4310VM CONN |
+| |-----------| |
+|LM78L05 52MHz |ALTERA MAX | |
+| |EPM7128ELC84 |
+| TEA6320 | | |
+|78L09 LM613 | | VIA |
+| MONO/STEREO |-----------| VT83C461 |
+|TDA1554 SELFTEST |
+| DS1232 ACTEL_A1010B |
+| HDD_PWR |
+| JSPKR |--| JAMMA |--| JSYNC JVUPDN XTRACOIN1 JGUN1 JGUN2|
+|-------| |----------------------------| |----------------------------------------|
+Notes:
+ JGUN1 / JGUN2 - Connector for Guns
+ VIA VT83C461 - IDE Controller
+ JSPKR - Speaker Output Connector (for use with Stereo jumper)
+
+****************************************************************************
+
+ Memory map (TBA)
+
+ ========================================================================
+ MAIN CPU
+ ========================================================================
+
+ ------------------------------------------------------------
+ 000000-3FFFFF R/W xxxxxxxx xxxxxxxx DRAM 0
+ 400000-7FFFFF R/W xxxxxxxx xxxxxxxx DRAM 1
+ 800000-BFFFFF R xxxxxxxx xxxxxxxx Graphic ROM bank
+ C00000-DFFFFF R xxxxxxxx xxxxxxxx Sound ROM bank
+ F00000-F000FF R/W xxxxxxxx xxxxxxxx Tom Internal Registers
+ F00400-F005FF R/W xxxxxxxx xxxxxxxx CLUT - color lookup table A
+ F00600-F007FF R/W xxxxxxxx xxxxxxxx CLUT - color lookup table B
+ F00800-F00D9F R/W xxxxxxxx xxxxxxxx LBUF - line buffer A
+ F01000-F0159F R/W xxxxxxxx xxxxxxxx LBUF - line buffer B
+ F01800-F01D9F R/W xxxxxxxx xxxxxxxx LBUF - line buffer currently selected
+ F02000-F021FF R/W xxxxxxxx xxxxxxxx GPU control registers
+ F02200-F022FF R/W xxxxxxxx xxxxxxxx Blitter registers
+ F03000-F03FFF R/W xxxxxxxx xxxxxxxx Local GPU RAM
+ F08800-F08D9F R/W xxxxxxxx xxxxxxxx LBUF - 32-bit access to line buffer A
+ F09000-F0959F R/W xxxxxxxx xxxxxxxx LBUF - 32-bit access to line buffer B
+ F09800-F09D9F R/W xxxxxxxx xxxxxxxx LBUF - 32-bit access to line buffer currently selected
+ F0B000-F0BFFF R/W xxxxxxxx xxxxxxxx 32-bit access to local GPU RAM
+ F10000-F13FFF R/W xxxxxxxx xxxxxxxx Jerry
+ F14000-F17FFF R/W xxxxxxxx xxxxxxxx Joysticks and GPIO0-5
+ F18000-F1AFFF R/W xxxxxxxx xxxxxxxx Jerry DSP
+ F1B000-F1CFFF R/W xxxxxxxx xxxxxxxx Local DSP RAM
+ F1D000-F1DFFF R xxxxxxxx xxxxxxxx Wavetable ROM
+ ------------------------------------------------------------
+
+ Jaguar System Notes:
+
+ Protection Check
+
+ At power on, a checksum is performed on the cart to ensure it has been
+ certified by Atari. The actual checksum calculation is performed by the GPU,
+ the result being left in GPU RAM at address f03000. The GPU is instructed to
+ do the calculation when the bios sends a 1 to f02114 while it is in the
+ initialisation stage. The bios then loops, waiting for the GPU to finish the
+ calculation. When it does, it sets bit 15 of f02114 high. The bios then does
+ the compare of the checksum. The checksum algorithm is unknown, but the
+ final result must be 03d0dead. The bios checks for this particular result,
+ and if found, the cart is allowed to start. Otherwise, the background turns
+ red, and the console freezes.
+
+
+ Jaguar Logo
+
+ A real Jaguar will show the red Jaguar logo, the falling white Atari letters,
+ and the turning jaguar's head, accompanied by the sound of a flushing toilet.
+ The cart will then start. All Jaguar emulators (including this one) skip the
+ logo with the appropriate memory hack. The cart can also instruct the logo
+ be skipped by placing non-zero at location 800408. We do the same thing when
+ the cart is loaded (see the DEVICE_IMAGE_LOAD section below).
+
+
+ Start Address
+
+ The start address of a cart may be found at 800404. It is normally 802000.
+
+***************************************************************************/
+
+
+#include "emu.h"
+#include "cpu/m68000/m68000.h"
+#include "cpu/mips/r3000.h"
+#include "cpu/jaguar/jaguar.h"
+#include "machine/idectrl.h"
+#include "machine/nvram.h"
+#include "sound/dac.h"
+#include "includes/jaguar.h"
+#include "emuopts.h"
+#include "imagedev/cartslot.h"
+#include "imagedev/snapquik.h"
+#include "sound/dac.h"
+#include "machine/eeprom.h"
+
+#define COJAG_CLOCK XTAL_52MHz
+#define R3000_CLOCK XTAL_40MHz
+#define M68K_CLOCK XTAL_50MHz
+
+static QUICKLOAD_LOAD( jaguar );
+static DEVICE_START( jaguar_cart );
+static DEVICE_IMAGE_LOAD( jaguar );
+
+
+class cojag_state : public driver_device
+{
+public:
+ cojag_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag),
+ m_nvram(*this, "nvram") { }
+
+ required_shared_ptr<UINT32> m_nvram;
+ cpu_device *m_main_cpu;
+ UINT32 m_misc_control_data;
+ UINT8 m_eeprom_enable;
+ UINT32 *m_rom_base;
+ UINT32 *m_gpu_jump_address;
+ UINT8 m_gpu_command_pending;
+ UINT32 m_gpu_spin_pc;
+ UINT32 *m_main_speedup;
+ int m_main_speedup_hits;
+ UINT64 m_main_speedup_last_cycles;
+ UINT64 m_main_speedup_max_cycles;
+ UINT32 *m_main_gpu_wait;
+};
+
+
+
+/*************************************
+ *
+ * Global variables
+ *
+ *************************************/
+
+UINT32 *jaguar_shared_ram;
+UINT32 *jaguar_gpu_ram;
+UINT32 *jaguar_gpu_clut;
+UINT32 *jaguar_dsp_ram;
+UINT32 *jaguar_wave_rom;
+UINT32* high_rom_base;
+UINT8 cojag_is_r3000;
+static int is_jaguar;
+
+
+
+/*************************************
+ *
+ * Local variables
+ *
+ *************************************/
+
+static UINT32 joystick_data;
+static UINT32 *rom_base;
+static size_t rom_size;
+static UINT32 *cart_base;
+static size_t cart_size;
+static UINT8 eeprom_bit_count;
+static UINT8 protection_check = 0; /* 0 = check hasn't started yet; 1= check in progress; 2 = check is finished. */
+extern UINT8 blitter_status;
+static UINT8 using_cart = 0;
+
+static IRQ_CALLBACK(jaguar_irq_callback)
+{
+ return (irqline == 6) ? 0x40 : -1;
+}
+
+
+
+/*************************************
+ *
+ * Machine init
+ *
+ *************************************/
+
+static MACHINE_RESET( cojag )
+{
+ cojag_state *state = machine.driver_data<cojag_state>();
+ UINT8 *rom = machine.region("user2")->base();
+
+ /* 68020 only: copy the interrupt vectors into RAM */
+ if (!cojag_is_r3000)
+ memcpy(jaguar_shared_ram, state->m_rom_base, 0x10);
+
+ /* configure banks for gfx/sound ROMs */
+ if (rom)
+ {
+ /* graphics banks */
+ if (cojag_is_r3000)
+ {
+ memory_configure_bank(machine, "bank1", 0, 2, rom + 0x800000, 0x400000);
+ memory_set_bank(machine, "bank1", 0);
+ }
+ memory_configure_bank(machine, "bank8", 0, 2, rom + 0x800000, 0x400000);
+ memory_set_bank(machine, "bank8", 0);
+
+ /* sound banks */
+ memory_configure_bank(machine, "bank2", 0, 8, rom + 0x000000, 0x200000);
+ memory_configure_bank(machine, "bank9", 0, 8, rom + 0x000000, 0x200000);
+ memory_set_bank(machine, "bank2", 0);
+ memory_set_bank(machine, "bank9", 0);
+ }
+
+ /* clear any spinuntil stuff */
+ jaguar_gpu_resume(machine);
+ jaguar_dsp_resume(machine);
+
+ /* halt the CPUs */
+ jaguargpu_ctrl_w(machine.device("gpu"), G_CTRL, 0, 0xffffffff);
+ jaguardsp_ctrl_w(machine.device("audiocpu"), D_CTRL, 0, 0xffffffff);
+
+ /* set blitter idle flag */
+ blitter_status = 1;
+
+ // normal handling of 'protection'
+ is_jaguar = 0;
+}
+
+
+static MACHINE_RESET( jaguar )
+{
+ device_set_irq_callback(machine.device("maincpu"), jaguar_irq_callback);
+
+ protection_check = 0;
+
+ /* Set up pointers for Jaguar logo */
+
+ memcpy(jaguar_shared_ram, rom_base, 0x400); // do not increase, or Doom breaks
+
+ device_set_input_line(machine.device("maincpu"), INPUT_LINE_RESET, PULSE_LINE);
+
+ /* clear any spinuntil stuff */
+ jaguar_gpu_resume(machine);
+ jaguar_dsp_resume(machine);
+
+ /* halt the CPUs */
+ jaguargpu_ctrl_w(machine.device("gpu"), G_CTRL, 0, 0xffffffff);
+ jaguardsp_ctrl_w(machine.device("audiocpu"), D_CTRL, 0, 0xffffffff);
+
+ joystick_data = 0xffffffff;
+ eeprom_bit_count = 0;
+ blitter_status = 1;
+ if ((using_cart) && (input_port_read(machine, "CONFIG") & 2))
+ {
+ cart_base[0x102] = 1;
+ using_cart = 0;
+ }
+
+ // custom handling of 'protection'
+ is_jaguar = 1;
+}
+
+
+/********************************************************************
+*
+* EEPROM
+* ======
+*
+* The EEPROM is accessed by a serial protocol using the registers
+* 0xF14000 (read data), F14800 (increment clock, write data), F15000 (reset for next word)
+*
+********************************************************************/
+/*
+static emu_file *jaguar_nvram_fopen( running_machine &machine, UINT32 openflags)
+{
+ device_image_interface *image = dynamic_cast<device_image_interface *>(machine.device("cart"));
+ astring *fname;
+ file_error filerr;
+ emu_file *file;
+ if (image->exists())
+ {
+ fname = astring_assemble_4( astring_alloc(), machine.system().name, PATH_SEPARATOR, image->basename_noext(), ".nv");
+ filerr = mame_fopen( SEARCHPATH_NVRAM, astring_c( fname), openflags, &file);
+ astring_free( fname);
+ return (filerr == FILERR_NONE) ? file : NULL;
+ }
+ else
+ return NULL;
+}
+
+static void jaguar_nvram_load(running_machine &machine)
+{
+ emu_file *nvram_file = NULL;
+ device_t *device;
+
+ for (device = machine.m_devicelist.first(); device != NULL; device = device->next())
+ {
+ device_nvram_func nvram = (device_nvram_func)device->get_config_fct(DEVINFO_FCT_NVRAM);
+ if (nvram != NULL)
+ {
+ if (nvram_file == NULL)
+ nvram_file = jaguar_nvram_fopen(machine, OPEN_FLAG_READ);
+ (*nvram)(device, nvram_file, 0);
+ }
+ }
+ if (nvram_file != NULL)
+ mame_fclose(nvram_file);
+}
+
+
+static void jaguar_nvram_save(running_machine &machine)
+{
+ emu_file *nvram_file = NULL;
+ device_t *device;
+
+ for (device = machine.m_devicelist.first(); device != NULL; device = device->next())
+ {
+ device_nvram_func nvram = (device_nvram_func)device->get_config_fct(DEVINFO_FCT_NVRAM);
+ if (nvram != NULL)
+ {
+ if (nvram_file == NULL)
+ nvram_file = jaguar_nvram_fopen(machine, OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS);
+ // check nvram_file to avoid crash when no image is mounted or cannot be created
+ if (nvram_file)
+ (*nvram)(device, nvram_file, 1);
+ }
+ }
+
+ if (nvram_file != NULL)
+ mame_fclose(nvram_file);
+}
+
+static NVRAM_HANDLER( jaguar )
+{
+ if (read_or_write) {
+ jaguar_nvram_save(machine);
+ }
+ else
+ {
+ if (file)
+ jaguar_nvram_load(machine);
+ }
+}
+*/
+static WRITE32_HANDLER( jaguar_eeprom_w )
+{
+ eeprom_device *eeprom = space->machine().device<eeprom_device>("eeprom");
+ eeprom_bit_count++;
+ if (eeprom_bit_count != 9) /* kill extra bit at end of address */
+ {
+ eeprom->write_bit(data >> 31);
+ eeprom->set_clock_line(PULSE_LINE);
+ }
+}
+
+static READ32_HANDLER( jaguar_eeprom_clk )
+{
+ eeprom_device *eeprom = space->machine().device<eeprom_device>("eeprom");
+ eeprom->set_clock_line(PULSE_LINE); /* get next bit when reading */
+ return 0;
+}
+
+static READ32_HANDLER( jaguar_eeprom_cs )
+{
+ eeprom_device *eeprom = space->machine().device<eeprom_device>("eeprom");
+ eeprom->set_cs_line(ASSERT_LINE); /* must do at end of an operation */
+ eeprom->set_cs_line(CLEAR_LINE); /* enable chip for next operation */
+ eeprom->write_bit(1); /* write a start bit */
+ eeprom->set_clock_line(PULSE_LINE);
+ eeprom_bit_count = 0;
+ return 0;
+}
+
+
+
+/*************************************
+ *
+ * Misc. control bits
+ *
+ *************************************/
+
+static READ32_HANDLER( misc_control_r )
+{
+ cojag_state *state = space->machine().driver_data<cojag_state>();
+ /* D7 = board reset (low)
+ D6 = audio must & reset (high)
+ D5 = volume control data (invert on write)
+ D4 = volume control clock
+ D3-D1 = audio bank 2-0
+ D0 = shared memory select (0=XBUS) */
+
+ return state->m_misc_control_data ^ 0x20;
+}
+
+
+static WRITE32_HANDLER( misc_control_w )
+{
+ cojag_state *state = space->machine().driver_data<cojag_state>();
+ logerror("%08X:misc_control_w(%02X)\n", cpu_get_previouspc(&space->device()), data);
+
+ /* D7 = board reset (low)
+ D6 = audio must & reset (high)
+ D5 = volume control data (invert on write)
+ D4 = volume control clock
+ D3-D1 = audio bank 2-0
+ D0 = shared memory select (0=XBUS) */
+
+ /* handle resetting the DSPs */
+ if (!(data & 0x80))
+ {
+ /* clear any spinuntil stuff */
+ jaguar_gpu_resume(space->machine());
+ jaguar_dsp_resume(space->machine());
+
+ /* halt the CPUs */
+ jaguargpu_ctrl_w(space->machine().device("gpu"), G_CTRL, 0, 0xffffffff);
+ jaguardsp_ctrl_w(space->machine().device("audiocpu"), D_CTRL, 0, 0xffffffff);
+ }
+
+ /* adjust banking */
+ if (space->machine().region("user2")->base())
+ {
+ memory_set_bank(space->machine(), "bank2", (data >> 1) & 7);
+ memory_set_bank(space->machine(), "bank9", (data >> 1) & 7);
+ }
+
+ COMBINE_DATA(&state->m_misc_control_data);
+}
+
+
+/*************************************
+ *
+ * 32-bit access to the GPU
+ *
+ *************************************/
+
+// shouldn't the DSPs be doing this calc, why is this needed for Jaguar?
+static READ32_HANDLER( gpuctrl_r )
+{
+ UINT32 result = jaguargpu_ctrl_r(space->machine().device("gpu"), offset);
+
+ if (is_jaguar)
+ {
+ if (protection_check != 1) return result;
+
+ protection_check++;
+ jaguar_gpu_ram[0] = 0x3d0dead;
+ return 0x80000000;
+ }
+ else
+ return result;
+}
+
+
+static WRITE32_HANDLER( gpuctrl_w )
+{
+ if (is_jaguar)
+ if ((!protection_check) && (offset == 5) && (data == 1)) protection_check++;
+
+ jaguargpu_ctrl_w(space->machine().device("gpu"), offset, data, mem_mask);
+}
+
+
+
+/*************************************
+ *
+ * 32-bit access to the DSP
+ *
+ *************************************/
+
+static READ32_HANDLER( dspctrl_r )
+{
+ return jaguardsp_ctrl_r(space->machine().device("audiocpu"), offset);
+}
+
+
+static WRITE32_HANDLER( dspctrl_w )
+{
+ jaguardsp_ctrl_w(space->machine().device("audiocpu"), offset, data, mem_mask);
+}
+
+
+static READ32_HANDLER( jaguar_wave_rom_r )
+{
+ return jaguar_wave_rom[offset];
+}
+
+
+/*************************************
+ *
+ * Input ports
+ *
+ * Information from "The Jaguar Underground Documentation"
+ * by Klaus and Nat!
+ *
+ *************************************/
+
+static READ32_HANDLER( joystick_r )
+{
+ UINT16 joystick_result = 0xfffe;
+ UINT16 joybuts_result = 0xffef;
+ int i;
+ static const char *const keynames[2][8] =
+ {
+ { "JOY0", "JOY1", "JOY2", "JOY3", "JOY4", "JOY5", "JOY6", "JOY7" },
+ { "BUTTONS0", "BUTTONS1", "BUTTONS2", "BUTTONS3", "BUTTONS4", "BUTTONS5", "BUTTONS6", "BUTTONS7" }
+ };
+
+ /*
+ * 16 12 8 4 0
+ * +---------+---------+---------^---------+
+ * | pad 1 | pad 0 | unused |
+ * +---------+---------+-------------------+
+ * 15...12 11...8 7...0
+ *
+ * Reading this register gives you the output of the selected columns
+ * of the pads.
+ * The buttons pressed will appear as cleared bits.
+ * See the description of the column addressing to map the bits
+ * to the buttons.
+ */
+
+ for (i = 0; i < 8; i++)
+ {
+ if ((joystick_data & (0x10000 << i)) == 0)
+ {
+ joystick_result &= input_port_read(space->machine(), keynames[0][i]);
+ joybuts_result &= input_port_read(space->machine(), keynames[1][i]);
+ }
+ }
+
+ joystick_result |= space->machine().device<eeprom_device>("eeprom")->read_bit();
+ joybuts_result |= (input_port_read(space->machine(), "CONFIG") & 0x10);
+
+ return (joystick_result << 16) | joybuts_result;
+}
+
+static WRITE32_HANDLER( joystick_w )
+{
+ /*
+ * 16 12 8 4 0
+ * +-+-------^------+--+---------+---------+
+ * |r| unused |mu| col 1 | col 0 |
+ * +-+--------------+--+---------+---------+
+ * 15 8 7...4 3...0
+ *
+ * col 0: column control of joypad 0
+ *
+ * Here you select which column of the joypad to poll.
+ * The columns are:
+ *
+ * Joystick Joybut
+ * col_bit|11 10 9 8 1 0
+ * -------+--+--+--+-- ---+------
+ * 0 | R L D U A PAUSE (RLDU = Joypad directions)
+ * 1 | 1 4 7 * B
+ * 2 | 2 5 8 0 C
+ * 3 | 3 6 9 # OPTION
+ *
+ * You select a column my clearing the appropriate bit and setting
+ * all the other "column" bits.
+ *
+ *
+ * col1: column control of joypad 1
+ *
+ * This is pretty much the same as for joypad EXCEPT that the
+ * column addressing is reversed (strange!!)
+ *
+ * Joystick Joybut
+ * col_bit|15 14 13 12 3 2
+ * -------+--+--+--+-- ---+------
+ * 4 | 3 6 9 # OPTION
+ * 5 | 2 5 8 0 C
+ * 6 | 1 4 7 * B
+ * 7 | R L D U A PAUSE (RLDU = Joypad directions)
+ *
+ * mute (mu): sound control
+ *
+ * You can turn off the sound by clearing this bit.
+ *
+ * read enable (r):
+ *
+ * Set this bit to read from the joysticks, clear it to write
+ * to them.
+ */
+ COMBINE_DATA(&joystick_data);
+}
+
+
+/*************************************
+ *
+ * Output ports
+ *
+ *************************************/
+
+static WRITE32_HANDLER( latch_w )
+{
+ logerror("%08X:latch_w(%X)\n", cpu_get_previouspc(&space->device()), data);
+
+ /* adjust banking */
+ if (space->machine().region("user2")->base())
+ {
+ if (cojag_is_r3000)
+ memory_set_bank(space->machine(), "bank1", data & 1);
+ memory_set_bank(space->machine(), "bank8", data & 1);
+ }
+}
+
+
+
+/*************************************
+ *
+ * EEPROM access
+ *
+ *************************************/
+
+static READ32_HANDLER( eeprom_data_r )
+{
+ cojag_state *state = space->machine().driver_data<cojag_state>();
+ if (cojag_is_r3000)
+ return state->m_nvram[offset] | 0xffffff00;
+ else
+ return state->m_nvram[offset] | 0x00ffffff;
+}
+
+
+static WRITE32_HANDLER( eeprom_enable_w )
+{
+ cojag_state *state = space->machine().driver_data<cojag_state>();
+ state->m_eeprom_enable = 1;
+}
+
+
+static WRITE32_HANDLER( eeprom_data_w )
+{
+ cojag_state *state = space->machine().driver_data<cojag_state>();
+// if (state->m_eeprom_enable)
+ {
+ if (cojag_is_r3000)
+ state->m_nvram[offset] = data & 0x000000ff;
+ else
+ state->m_nvram[offset] = data & 0xff000000;
+ }
+// else
+// logerror("%08X:error writing to disabled EEPROM\n", cpu_get_previouspc(&space->device()));
+ state->m_eeprom_enable = 0;
+}
+
+
+
+/*************************************
+ *
+ * GPU synchronization & speedup
+ *
+ *************************************/
+
+/*
+ Explanation:
+
+ The GPU generally sits in a tight loop waiting for the main CPU to store
+ a jump address into a specific memory location. This speedup is designed
+ to catch that loop, which looks like this:
+
+ load (r28),r21
+ jump (r21)
+ nop
+
+ When nothing is pending, the GPU keeps the address of the load instruction
+ at (r28) so that it loops back on itself. When the main CPU wants to execute
+ a command, it stores an alternate address to (r28).
+
+ Even if we don't optimize this case, we do need to detect when a command
+ is written to the GPU in order to improve synchronization until the GPU
+ has finished. To do this, we start a temporary high frequency timer and
+ run it until we get back to the spin loop.
+*/
+
+
+static TIMER_CALLBACK( gpu_sync_timer )
+{
+ cojag_state *state = machine.driver_data<cojag_state>();
+ /* if a command is still pending, and we haven't maxed out our timer, set a new one */
+ if (state->m_gpu_command_pending && param < 1000)
+ machine.scheduler().timer_set(attotime::from_usec(50), FUNC(gpu_sync_timer), ++param);
+}
+
+
+static WRITE32_HANDLER( gpu_jump_w )
+{
+ cojag_state *state = space->machine().driver_data<cojag_state>();
+ /* update the data in memory */
+ COMBINE_DATA(state->m_gpu_jump_address);
+ logerror("%08X:GPU jump address = %08X\n", cpu_get_previouspc(&space->device()), *state->m_gpu_jump_address);
+
+ /* if the GPU is suspended, release it now */
+ jaguar_gpu_resume(space->machine());
+
+ /* start the sync timer going, and note that there is a command pending */
+ space->machine().scheduler().synchronize(FUNC(gpu_sync_timer));
+ state->m_gpu_command_pending = 1;
+}
+
+
+static READ32_HANDLER( gpu_jump_r )
+{
+ cojag_state *state = space->machine().driver_data<cojag_state>();
+ /* if the current GPU command is just pointing back to the spin loop, and */
+ /* we're reading it from the spin loop, we can optimize */
+ if (*state->m_gpu_jump_address == state->m_gpu_spin_pc && cpu_get_previouspc(&space->device()) == state->m_gpu_spin_pc)
+ {
+#if ENABLE_SPEEDUP_HACKS
+ /* spin if we're allowed */
+ jaguar_gpu_suspend(space->machine());
+#endif
+
+ /* no command is pending */
+ state->m_gpu_command_pending = 0;
+ }
+
+ /* return the current value */
+ return *state->m_gpu_jump_address;
+}
+
+
+
+/*************************************
+ *
+ * Main CPU speedup (R3000 games)
+ *
+ *************************************/
+
+/*
+ Explanation:
+
+ Instead of sitting in a tight loop, the CPU will run the random number
+ generator over and over while waiting for an interrupt. In order to catch
+ that, we snoop the memory location it is polling, and see if it is read
+ at least 5 times in a row, each time less than 200 cycles apart. If so,
+ we assume it is spinning. Also, by waiting for 5 iterations, we let it
+ crank through some random numbers, just not several thousand every frame.
+*/
+
+#if ENABLE_SPEEDUP_HACKS
+
+
+static READ32_HANDLER( cojagr3k_main_speedup_r )
+{
+ cojag_state *state = space->machine().driver_data<cojag_state>();
+ UINT64 curcycles = state->m_main_cpu->total_cycles();
+
+ /* if it's been less than main_speedup_max_cycles cycles since the last time */
+ if (curcycles - state->m_main_speedup_last_cycles < state->m_main_speedup_max_cycles)
+ {
+ /* increment the count; if we hit 5, we can spin until an interrupt comes */
+ if (state->m_main_speedup_hits++ > 5)
+ {
+ device_spin_until_interrupt(&space->device());
+ state->m_main_speedup_hits = 0;
+ }
+ }
+
+ /* if it's been more than main_speedup_max_cycles cycles, reset our count */
+ else
+ state->m_main_speedup_hits = 0;
+
+ /* remember the last cycle count */
+ state->m_main_speedup_last_cycles = curcycles;
+
+ /* return the real value */
+ return *state->m_main_speedup;
+}
+
+#endif
+
+
+
+/*************************************
+ *
+ * Additional main CPU speedup
+ * (Freeze only)
+ *
+ *************************************/
+
+/*
+ Explanation:
+
+ The main CPU hands data off to the GPU to process. But rather than running
+ in parallel, the main CPU just sits and waits for the result. This speedup
+ makes sure we don't waste time emulating that spin loop.
+*/
+
+#if ENABLE_SPEEDUP_HACKS
+
+
+static READ32_HANDLER( main_gpu_wait_r )
+{
+ cojag_state *state = space->machine().driver_data<cojag_state>();
+ if (state->m_gpu_command_pending)
+ device_spin_until_interrupt(&space->device());
+ return *state->m_main_gpu_wait;
+}
+
+#endif
+
+
+
+/*************************************
+ *
+ * Main CPU speedup (Area 51)
+ *
+ *************************************/
+
+/*
+ Explanation:
+
+ Very similar to the R3000 code, except we need to verify that the value in
+ *main_speedup is actually 0.
+*/
+
+#if ENABLE_SPEEDUP_HACKS
+
+static WRITE32_HANDLER( area51_main_speedup_w )
+{
+ cojag_state *state = space->machine().driver_data<cojag_state>();
+ UINT64 curcycles = state->m_main_cpu->total_cycles();
+
+ /* store the data */
+ COMBINE_DATA(state->m_main_speedup);
+
+ /* if it's been less than 400 cycles since the last time */
+ if (*state->m_main_speedup == 0 && curcycles - state->m_main_speedup_last_cycles < 400)
+ {
+ /* increment the count; if we hit 5, we can spin until an interrupt comes */
+ if (state->m_main_speedup_hits++ > 5)
+ {
+ device_spin_until_interrupt(&space->device());
+ state->m_main_speedup_hits = 0;
+ }
+ }
+
+ /* if it's been more than 400 cycles, reset our count */
+ else
+ state->m_main_speedup_hits = 0;
+
+ /* remember the last cycle count */
+ state->m_main_speedup_last_cycles = curcycles;
+}
+
+
+/*
+ Explanation:
+
+ The Area 51/Maximum Force duo writes to a non-aligned address, so our check
+ against 0 must handle that explicitly.
+*/
+
+static WRITE32_HANDLER( area51mx_main_speedup_w )
+{
+ cojag_state *state = space->machine().driver_data<cojag_state>();
+ UINT64 curcycles = state->m_main_cpu->total_cycles();
+
+ /* store the data */
+ COMBINE_DATA(&state->m_main_speedup[offset]);
+
+ /* if it's been less than 450 cycles since the last time */
+ if (((state->m_main_speedup[0] << 16) | (state->m_main_speedup[1] >> 16)) == 0 && curcycles - state->m_main_speedup_last_cycles < 450)
+ {
+ /* increment the count; if we hit 5, we can spin until an interrupt comes */
+ if (state->m_main_speedup_hits++ > 10)
+ {
+ device_spin_until_interrupt(&space->device());
+ state->m_main_speedup_hits = 0;
+ }
+ }
+
+ /* if it's been more than 450 cycles, reset our count */
+ else
+ state->m_main_speedup_hits = 0;
+
+ /* remember the last cycle count */
+ state->m_main_speedup_last_cycles = curcycles;
+}
+
+#endif
+
+
+
+
+
+
+/*************************************
+ *
+ * Main CPU memory handlers
+ *
+ *************************************/
+
+// surely these should be 16-bit natively if the standard Jaguar is driven by a plain 68k?
+// all these trampolines are not good for performance ;-)
+
+static READ16_HANDLER( gpuctrl_r16 ) { if (!(offset&1)) { return gpuctrl_r(space, offset>>1, mem_mask<<16) >> 16; } else { return gpuctrl_r(space, offset>>1, mem_mask); } }
+static WRITE16_HANDLER( gpuctrl_w16 ) { if (!(offset&1)) { gpuctrl_w(space, offset>>1, data << 16, mem_mask << 16); } else { gpuctrl_w(space, offset>>1, data, mem_mask); } }
+static READ16_HANDLER( jaguar_blitter_r16 ) { if (!(offset&1)) { return jaguar_blitter_r(space, offset>>1, mem_mask<<16) >> 16; } else { return jaguar_blitter_r(space, offset>>1, mem_mask); } }
+static WRITE16_HANDLER( jaguar_blitter_w16 ) { if (!(offset&1)) { jaguar_blitter_w(space, offset>>1, data << 16, mem_mask << 16); } else { jaguar_blitter_w(space, offset>>1, data, mem_mask); } }
+static READ16_HANDLER( jaguar_serial_r16 ) { if (!(offset&1)) { return jaguar_serial_r(space, offset>>1, mem_mask<<16) >> 16; } else { return jaguar_serial_r(space, offset>>1, mem_mask); } }
+static WRITE16_HANDLER( jaguar_serial_w16 ) { if (!(offset&1)) { jaguar_serial_w(space, offset>>1, data << 16, mem_mask << 16); } else { jaguar_serial_w(space, offset>>1, data, mem_mask); } }
+static READ16_HANDLER( dspctrl_r16 ) { if (!(offset&1)) { return dspctrl_r(space, offset>>1, mem_mask<<16) >> 16; } else { return dspctrl_r(space, offset>>1, mem_mask); } }
+static WRITE16_HANDLER( dspctrl_w16 ) { if (!(offset&1)) { dspctrl_w(space, offset>>1, data << 16, mem_mask << 16); } else { dspctrl_w(space, offset>>1, data, mem_mask); } }
+static READ16_HANDLER( jaguar_eeprom_cs16 ) { if (!(offset&1)) { return jaguar_eeprom_cs(space, offset>>1, mem_mask<<16) >> 16; } else { return jaguar_eeprom_cs(space, offset>>1, mem_mask); } }
+static READ16_HANDLER( jaguar_eeprom_clk16 ) { if (!(offset&1)) { return jaguar_eeprom_clk(space, offset>>1, mem_mask<<16) >> 16; } else { return jaguar_eeprom_clk(space, offset>>1, mem_mask); } }
+static WRITE16_HANDLER( jaguar_eeprom_w16 ) { if (!(offset&1)) { jaguar_eeprom_w(space, offset>>1, data << 16, mem_mask << 16); } else { jaguar_eeprom_w(space, offset>>1, data, mem_mask); } }
+static READ16_HANDLER( joystick_r16 ) { if (!(offset&1)) { return joystick_r(space, offset>>1, mem_mask<<16) >> 16; } else { return joystick_r(space, offset>>1, mem_mask); } }
+static WRITE16_HANDLER( joystick_w16 ) { if (!(offset&1)) { joystick_w(space, offset>>1, data << 16, mem_mask << 16); } else { joystick_w(space, offset>>1, data, mem_mask); } }
+
+static READ32_HANDLER( jaguar_shared_ram_r ) { return jaguar_shared_ram[offset]; }
+static WRITE32_HANDLER( jaguar_shared_ram_w ) { COMBINE_DATA(&jaguar_shared_ram[offset]); }
+static READ32_HANDLER( jaguar_rom_base_r ) { return rom_base[offset]; }
+static WRITE32_HANDLER( jaguar_rom_base_w ) { /*ROM!*/ }
+static READ32_HANDLER( jaguar_cart_base_r ) { return cart_base[offset]; }
+static WRITE32_HANDLER( jaguar_cart_base_w ) { /*ROM!*/ }
+static READ32_HANDLER( high_rom_base_r ) { return high_rom_base[offset]; }
+static WRITE32_HANDLER( high_rom_base_w ) { /*ROM!*/ }
+static READ32_HANDLER( jaguar_dsp_ram_r ) { return jaguar_dsp_ram[offset]; }
+static WRITE32_HANDLER( jaguar_dsp_ram_w ) { COMBINE_DATA(&jaguar_dsp_ram[offset]); }
+static READ32_HANDLER( jaguar_gpu_clut_r ) { return jaguar_gpu_clut[offset]; }
+static WRITE32_HANDLER( jaguar_gpu_clut_w ) { COMBINE_DATA(&jaguar_gpu_clut[offset]); }
+static READ32_HANDLER( jaguar_gpu_ram_r ) { return jaguar_gpu_ram[offset]; }
+static WRITE32_HANDLER( jaguar_gpu_ram_w ) { COMBINE_DATA(&jaguar_gpu_ram[offset]); }
+
+static READ16_HANDLER( jaguar_shared_ram_r16 ) { if (!(offset&1)) { return jaguar_shared_ram_r(space, offset>>1, mem_mask<<16) >> 16; } else { return jaguar_shared_ram_r(space, offset>>1, mem_mask); } }
+static WRITE16_HANDLER( jaguar_shared_ram_w16 ) { if (!(offset&1)) { jaguar_shared_ram_w(space, offset>>1, data << 16, mem_mask << 16); } else { jaguar_shared_ram_w(space, offset>>1, data, mem_mask); } }
+static READ16_HANDLER( jaguar_rom_base_r16 ) { if (!(offset&1)) { return jaguar_rom_base_r(space, offset>>1, mem_mask<<16) >> 16; } else { return jaguar_rom_base_r(space, offset>>1, mem_mask); } }
+static WRITE16_HANDLER( jaguar_rom_base_w16 ) { if (!(offset&1)) { jaguar_rom_base_w(space, offset>>1, data << 16, mem_mask << 16); } else { jaguar_rom_base_w(space, offset>>1, data, mem_mask); } }
+static READ16_HANDLER( jaguar_cart_base_r16 ) { if (!(offset&1)) { return jaguar_cart_base_r(space, offset>>1, mem_mask<<16) >> 16; } else { return jaguar_cart_base_r(space, offset>>1, mem_mask); } }
+static WRITE16_HANDLER( jaguar_cart_base_w16 ) { if (!(offset&1)) { jaguar_cart_base_w(space, offset>>1, data << 16, mem_mask << 16); } else { jaguar_cart_base_w(space, offset>>1, data, mem_mask); } }
+static READ16_HANDLER( high_rom_base_r16 ) { if (!(offset&1)) { return high_rom_base_r(space, offset>>1, mem_mask<<16) >> 16; } else { return high_rom_base_r(space, offset>>1, mem_mask); } }
+static WRITE16_HANDLER( high_rom_base_w16 ) { if (!(offset&1)) { high_rom_base_w(space, offset>>1, data << 16, mem_mask << 16); } else { high_rom_base_w(space, offset>>1, data, mem_mask); } }
+
+static READ16_HANDLER( jaguar_dsp_ram_r16 ) { if (!(offset&1)) { return jaguar_dsp_ram_r(space, offset>>1, mem_mask<<16) >> 16; } else { return jaguar_dsp_ram_r(space, offset>>1, mem_mask); } }
+static WRITE16_HANDLER( jaguar_dsp_ram_w16 ) { if (!(offset&1)) { jaguar_dsp_ram_w(space, offset>>1, data << 16, mem_mask << 16); } else { jaguar_dsp_ram_w(space, offset>>1, data, mem_mask); } }
+static READ16_HANDLER( jaguar_gpu_clut_r16 ) { if (!(offset&1)) { return jaguar_gpu_clut_r(space, offset>>1, mem_mask<<16) >> 16; } else { return jaguar_gpu_clut_r(space, offset>>1, mem_mask); } }
+static WRITE16_HANDLER( jaguar_gpu_clut_w16 ) { if (!(offset&1)) { jaguar_gpu_clut_w(space, offset>>1, data << 16, mem_mask << 16); } else { jaguar_gpu_clut_w(space, offset>>1, data, mem_mask); } }
+static READ16_HANDLER( jaguar_gpu_ram_r16 ) { if (!(offset&1)) { return jaguar_gpu_ram_r(space, offset>>1, mem_mask<<16) >> 16; } else { return jaguar_gpu_ram_r(space, offset>>1, mem_mask); } }
+static WRITE16_HANDLER( jaguar_gpu_ram_w16 ) { if (!(offset&1)) { jaguar_gpu_ram_w(space, offset>>1, data << 16, mem_mask << 16); } else { jaguar_gpu_ram_w(space, offset>>1, data, mem_mask); } }
+
+static ADDRESS_MAP_START( jaguar_map, AS_PROGRAM, 16 )
+ ADDRESS_MAP_GLOBAL_MASK(0xffffff)
+ AM_RANGE(0x000000, 0x1fffff) AM_MIRROR(0x200000) AM_READWRITE( jaguar_shared_ram_r16, jaguar_shared_ram_w16 );
+ AM_RANGE(0x800000, 0xdfffff) AM_READWRITE( jaguar_cart_base_r16, jaguar_cart_base_w16 )
+ AM_RANGE(0xe00000, 0xe1ffff) AM_READWRITE( jaguar_rom_base_r16, jaguar_rom_base_w16 )
+ AM_RANGE(0xf00000, 0xf003ff) AM_READWRITE(jaguar_tom_regs_r, jaguar_tom_regs_w) // might be reversed endian of the others..
+ AM_RANGE(0xf00400, 0xf005ff) AM_MIRROR(0x000200) AM_READWRITE(jaguar_gpu_clut_r16, jaguar_gpu_clut_w16 )
+ AM_RANGE(0xf02100, 0xf021ff) AM_MIRROR(0x008000) AM_READWRITE(gpuctrl_r16, gpuctrl_w16)
+ AM_RANGE(0xf02200, 0xf022ff) AM_MIRROR(0x008000) AM_READWRITE(jaguar_blitter_r16, jaguar_blitter_w16)
+ AM_RANGE(0xf03000, 0xf03fff) AM_MIRROR(0x008000) AM_READWRITE( jaguar_gpu_ram_r16, jaguar_gpu_ram_w16 )
+ AM_RANGE(0xf10000, 0xf103ff) AM_READWRITE(jaguar_jerry_regs_r, jaguar_jerry_regs_w) // might be reversed endian of the others..
+ AM_RANGE(0xf14000, 0xf14003) AM_READWRITE(joystick_r16, joystick_w16)
+ AM_RANGE(0xf14800, 0xf14803) AM_READWRITE(jaguar_eeprom_clk16,jaguar_eeprom_w16) // GPI00
+ AM_RANGE(0xf15000, 0xf15003) AM_READ(jaguar_eeprom_cs16) // GPI01
+ AM_RANGE(0xf1a100, 0xf1a13f) AM_READWRITE(dspctrl_r16, dspctrl_w16)
+ AM_RANGE(0xf1a140, 0xf1a17f) AM_READWRITE(jaguar_serial_r16, jaguar_serial_w16)
+ AM_RANGE(0xf1b000, 0xf1cfff) AM_READWRITE(jaguar_dsp_ram_r16, jaguar_dsp_ram_w16)
+ AM_RANGE(0xf1d000, 0xf1dfff) AM_READWRITE( high_rom_base_r16, high_rom_base_w16 )
+ADDRESS_MAP_END
+
+
+
+/*************************************
+ *
+ * Main CPU memory handlers
+ *
+ *************************************/
+
+static ADDRESS_MAP_START( r3000_map, AS_PROGRAM, 32 )
+ AM_RANGE(0x04000000, 0x047fffff) AM_RAM AM_BASE(&jaguar_shared_ram) AM_SHARE("share1")
+ AM_RANGE(0x04800000, 0x04bfffff) AM_ROMBANK("bank1")
+ AM_RANGE(0x04c00000, 0x04dfffff) AM_ROMBANK("bank2")
+ AM_RANGE(0x04e00000, 0x04e003ff) AM_DEVREADWRITE("ide", ide_controller32_r, ide_controller32_w)
+ AM_RANGE(0x04f00000, 0x04f003ff) AM_READWRITE(jaguar_tom_regs32_r, jaguar_tom_regs32_w)
+ AM_RANGE(0x04f00400, 0x04f007ff) AM_RAM AM_BASE(&jaguar_gpu_clut) AM_SHARE("share2")
+ AM_RANGE(0x04f02100, 0x04f021ff) AM_READWRITE(gpuctrl_r, gpuctrl_w)
+ AM_RANGE(0x04f02200, 0x04f022ff) AM_READWRITE(jaguar_blitter_r, jaguar_blitter_w)
+ AM_RANGE(0x04f03000, 0x04f03fff) AM_MIRROR(0x00008000) AM_RAM AM_BASE(&jaguar_gpu_ram) AM_SHARE("share3")
+ AM_RANGE(0x04f10000, 0x04f103ff) AM_READWRITE(jaguar_jerry_regs32_r, jaguar_jerry_regs32_w)
+ AM_RANGE(0x04f16000, 0x04f1600b) AM_READ(cojag_gun_input_r) // GPI02
+ AM_RANGE(0x04f17000, 0x04f17003) AM_READ_PORT("SYSTEM") // GPI03
+ AM_RANGE(0x04f17800, 0x04f17803) AM_WRITE(latch_w) // GPI04
+ AM_RANGE(0x04f17c00, 0x04f17c03) AM_READ_PORT("P1_P2") // GPI05
+ AM_RANGE(0x04f1a100, 0x04f1a13f) AM_READWRITE(dspctrl_r, dspctrl_w)
+ AM_RANGE(0x04f1a140, 0x04f1a17f) AM_READWRITE(jaguar_serial_r, jaguar_serial_w)
+ AM_RANGE(0x04f1b000, 0x04f1cfff) AM_RAM AM_BASE(&jaguar_dsp_ram) AM_SHARE("share4")
+
+ AM_RANGE(0x06000000, 0x06000003) AM_READWRITE(misc_control_r, misc_control_w)
+ AM_RANGE(0x10000000, 0x1007ffff) AM_RAM
+ AM_RANGE(0x12000000, 0x120fffff) AM_RAM // tested in self-test only?
+ AM_RANGE(0x14000004, 0x14000007) AM_WRITE(watchdog_reset32_w)
+ AM_RANGE(0x16000000, 0x16000003) AM_WRITE(eeprom_enable_w)
+ AM_RANGE(0x18000000, 0x18001fff) AM_READWRITE(eeprom_data_r, eeprom_data_w) AM_SHARE("nvram")
+ AM_RANGE(0x1fc00000, 0x1fdfffff) AM_ROM AM_REGION("user1", 0) AM_BASE_MEMBER(cojag_state, m_rom_base)
+ADDRESS_MAP_END
+
+
+static ADDRESS_MAP_START( m68020_map, AS_PROGRAM, 32 )
+ AM_RANGE(0x000000, 0x7fffff) AM_RAM AM_BASE(&jaguar_shared_ram) AM_SHARE("share1")
+ AM_RANGE(0x800000, 0x9fffff) AM_ROM AM_REGION("user1", 0) AM_BASE_MEMBER(cojag_state, m_rom_base)
+ AM_RANGE(0xa00000, 0xa1ffff) AM_RAM
+ AM_RANGE(0xa20000, 0xa21fff) AM_READWRITE(eeprom_data_r, eeprom_data_w) AM_SHARE("nvram")
+ AM_RANGE(0xa30000, 0xa30003) AM_WRITE(watchdog_reset32_w)
+ AM_RANGE(0xa40000, 0xa40003) AM_WRITE(eeprom_enable_w)
+ AM_RANGE(0xb70000, 0xb70003) AM_READWRITE(misc_control_r, misc_control_w)
+ AM_RANGE(0xc00000, 0xdfffff) AM_ROMBANK("bank2")
+ AM_RANGE(0xe00000, 0xe003ff) AM_DEVREADWRITE("ide", ide_controller32_r, ide_controller32_w)
+ AM_RANGE(0xf00000, 0xf003ff) AM_READWRITE(jaguar_tom_regs32_r, jaguar_tom_regs32_w)
+ AM_RANGE(0xf00400, 0xf007ff) AM_RAM AM_BASE(&jaguar_gpu_clut) AM_SHARE("share2")
+ AM_RANGE(0xf02100, 0xf021ff) AM_READWRITE(gpuctrl_r, gpuctrl_w)
+ AM_RANGE(0xf02200, 0xf022ff) AM_READWRITE(jaguar_blitter_r, jaguar_blitter_w)
+ AM_RANGE(0xf03000, 0xf03fff) AM_MIRROR(0x008000) AM_RAM AM_BASE(&jaguar_gpu_ram) AM_SHARE("share3")
+ AM_RANGE(0xf10000, 0xf103ff) AM_READWRITE(jaguar_jerry_regs32_r, jaguar_jerry_regs32_w)
+ AM_RANGE(0xf16000, 0xf1600b) AM_READ(cojag_gun_input_r) // GPI02
+ AM_RANGE(0xf17000, 0xf17003) AM_READ_PORT("SYSTEM") // GPI03
+// AM_RANGE(0xf17800, 0xf17803) AM_WRITE(latch_w) // GPI04
+ AM_RANGE(0xf17c00, 0xf17c03) AM_READ_PORT("P1_P2") // GPI05
+ AM_RANGE(0xf1a100, 0xf1a13f) AM_READWRITE(dspctrl_r, dspctrl_w)
+ AM_RANGE(0xf1a140, 0xf1a17f) AM_READWRITE(jaguar_serial_r, jaguar_serial_w)
+ AM_RANGE(0xf1b000, 0xf1cfff) AM_RAM AM_BASE(&jaguar_dsp_ram) AM_SHARE("share4")
+ADDRESS_MAP_END
+
+
+
+/*************************************
+ *
+ * GPU memory handlers
+ *
+ *************************************/
+
+static ADDRESS_MAP_START( gpu_map, AS_PROGRAM, 32 )
+ AM_RANGE(0x000000, 0x7fffff) AM_RAM AM_SHARE("share1")
+ AM_RANGE(0x800000, 0xbfffff) AM_ROMBANK("bank8")
+ AM_RANGE(0xc00000, 0xdfffff) AM_ROMBANK("bank9")
+ AM_RANGE(0xe00000, 0xe003ff) AM_DEVREADWRITE("ide", ide_controller32_r, ide_controller32_w)
+ AM_RANGE(0xf00000, 0xf003ff) AM_READWRITE(jaguar_tom_regs32_r, jaguar_tom_regs32_w)
+ AM_RANGE(0xf00400, 0xf007ff) AM_RAM AM_SHARE("share2")
+ AM_RANGE(0xf02100, 0xf021ff) AM_READWRITE(gpuctrl_r, gpuctrl_w)
+ AM_RANGE(0xf02200, 0xf022ff) AM_READWRITE(jaguar_blitter_r, jaguar_blitter_w)
+ AM_RANGE(0xf03000, 0xf03fff) AM_RAM AM_SHARE("share3")
+ AM_RANGE(0xf10000, 0xf103ff) AM_READWRITE(jaguar_jerry_regs32_r, jaguar_jerry_regs32_w)
+ADDRESS_MAP_END
+
+
+
+/*************************************
+ *
+ * DSP memory handlers
+ *
+ *************************************/
+
+static ADDRESS_MAP_START( dsp_map, AS_PROGRAM, 32 )
+ AM_RANGE(0x000000, 0x7fffff) AM_RAM AM_SHARE("share1")
+ AM_RANGE(0x800000, 0xbfffff) AM_ROMBANK("bank8")
+ AM_RANGE(0xc00000, 0xdfffff) AM_ROMBANK("bank9")
+ AM_RANGE(0xf10000, 0xf103ff) AM_READWRITE(jaguar_jerry_regs32_r, jaguar_jerry_regs32_w)
+ AM_RANGE(0xf1a100, 0xf1a13f) AM_READWRITE(dspctrl_r, dspctrl_w)
+ AM_RANGE(0xf1a140, 0xf1a17f) AM_READWRITE(jaguar_serial_r, jaguar_serial_w)
+ AM_RANGE(0xf1b000, 0xf1cfff) AM_RAM AM_SHARE("share4")
+ AM_RANGE(0xf1d000, 0xf1dfff) AM_READ(jaguar_wave_rom_r) AM_BASE(&jaguar_wave_rom)
+ADDRESS_MAP_END
+
+/* ToDo, these maps SHOULD be merged with the ones above */
+
+static ADDRESS_MAP_START( jag_gpu_map, AS_PROGRAM, 32 )
+ ADDRESS_MAP_GLOBAL_MASK(0xffffff)
+ AM_RANGE(0x000000, 0x1fffff) AM_RAM AM_BASE(&jaguar_shared_ram) AM_MIRROR(0x200000) AM_SHARE("share1") AM_REGION("maincpu", 0)
+ AM_RANGE(0x800000, 0xdfffff) AM_ROM AM_BASE(&cart_base) AM_SIZE(&cart_size) AM_SHARE("share15") AM_REGION("maincpu", 0x800000)
+ AM_RANGE(0xe00000, 0xe1ffff) AM_ROM AM_BASE(&rom_base) AM_SIZE(&rom_size) AM_SHARE("share16") AM_REGION("maincpu", 0xe00000)
+ AM_RANGE(0xf00000, 0xf003ff) AM_READWRITE(jaguar_tom_regs32_r, jaguar_tom_regs32_w)
+ AM_RANGE(0xf00400, 0xf005ff) AM_BASE(&jaguar_gpu_clut) AM_MIRROR(0x000200) AM_RAM AM_SHARE("share2")
+ AM_RANGE(0xf02100, 0xf021ff) AM_MIRROR(0x008000) AM_READWRITE(gpuctrl_r, gpuctrl_w)
+ AM_RANGE(0xf02200, 0xf022ff) AM_MIRROR(0x008000) AM_READWRITE(jaguar_blitter_r, jaguar_blitter_w)
+ AM_RANGE(0xf03000, 0xf03fff) AM_BASE(&jaguar_gpu_ram) AM_MIRROR(0x008000) AM_RAM AM_SHARE("share3")
+ AM_RANGE(0xf10000, 0xf103ff) AM_READWRITE(jaguar_jerry_regs32_r, jaguar_jerry_regs32_w)
+ AM_RANGE(0xf14000, 0xf14003) AM_READWRITE(joystick_r, joystick_w)
+ AM_RANGE(0xf1a100, 0xf1a13f) AM_READWRITE(dspctrl_r, dspctrl_w)
+ AM_RANGE(0xf1a140, 0xf1a17f) AM_READWRITE(jaguar_serial_r, jaguar_serial_w)
+ AM_RANGE(0xf1b000, 0xf1cfff) AM_BASE(&jaguar_dsp_ram) AM_RAM AM_SHARE("share4")
+ AM_RANGE(0xf1d000, 0xf1dfff) AM_ROM AM_BASE(&high_rom_base) AM_REGION("maincpu", 0xf1d000)
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( jag_dsp_map, AS_PROGRAM, 32 )
+ ADDRESS_MAP_GLOBAL_MASK(0xffffff)
+ AM_RANGE(0x000000, 0x1fffff) AM_MIRROR(0x200000) AM_RAM AM_SHARE("share1") AM_REGION("maincpu", 0)
+ AM_RANGE(0x800000, 0xdfffff) AM_ROM AM_SHARE("share15") AM_REGION("maincpu", 0x800000)
+ AM_RANGE(0xe00000, 0xe1ffff) AM_ROM AM_SHARE("share16") AM_REGION("maincpu", 0xe00000)
+ AM_RANGE(0xf00000, 0xf003ff) AM_READWRITE(jaguar_tom_regs32_r, jaguar_tom_regs32_w)
+ AM_RANGE(0xf00400, 0xf005ff) AM_MIRROR(0x000200) AM_RAM AM_SHARE("share2")
+ AM_RANGE(0xf02100, 0xf021ff) AM_MIRROR(0x008000) AM_READWRITE(gpuctrl_r, gpuctrl_w)
+ AM_RANGE(0xf02200, 0xf022ff) AM_MIRROR(0x008000) AM_READWRITE(jaguar_blitter_r, jaguar_blitter_w)
+ AM_RANGE(0xf03000, 0xf03fff) AM_MIRROR(0x008000) AM_RAM AM_SHARE("share3")
+ AM_RANGE(0xf10000, 0xf103ff) AM_READWRITE(jaguar_jerry_regs32_r, jaguar_jerry_regs32_w)
+ AM_RANGE(0xf14000, 0xf14003) AM_READWRITE(joystick_r, joystick_w)
+ AM_RANGE(0xf1a100, 0xf1a13f) AM_READWRITE(dspctrl_r, dspctrl_w)
+ AM_RANGE(0xf1a140, 0xf1a17f) AM_READWRITE(jaguar_serial_r, jaguar_serial_w)
+ AM_RANGE(0xf1b000, 0xf1cfff) AM_RAM AM_SHARE("share4")
+ AM_RANGE(0xf1d000, 0xf1dfff) AM_ROM AM_REGION("maincpu", 0xf1d000)
+ADDRESS_MAP_END
+
+/*************************************
+ *
+ * Port definitions
+ *
+ *************************************/
+
+/* "FAKE0" is read at 0x04f17000
+ D23-20 = /SER-4-1
+ D19-16 = COINR4-1
+ D7 = /VSYNCNEQ
+ D6 = /S-TEST
+ D5 = /VOLUMEUP
+ D4 = /VOLUMEDOWN
+ D3-D0 = ACTC4-1
+*/
+static INPUT_PORTS_START( area51 )
+ PORT_START("P1_P2")
+ PORT_BIT( 0x000000ff, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x00000100, IP_ACTIVE_LOW, IPT_START2 )
+ PORT_BIT( 0x0000fe00, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_BIT( 0x00ff0000, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x01000000, IP_ACTIVE_LOW, IPT_START1 )
+ PORT_BIT( 0xfe000000, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START("SYSTEM")
+ PORT_BIT( 0x0000ffff, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM(custom_port_read, "FAKE0")
+ PORT_BIT( 0xffff0000, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM(custom_port_read, "FAKE0")
+
+ PORT_START("FAKE0")
+ PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_COIN1 )
+ PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_COIN2 )
+ PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_COIN3 )
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_COIN4 )
+ PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_VOLUME_DOWN )
+ PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_VOLUME_UP )
+ PORT_SERVICE( 0x0040, IP_ACTIVE_LOW ) // s-test
+ PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_SPECIAL ) // vsyncneq
+ PORT_BIT( 0xff00, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START("FAKE1_X") /* fake analog X */
+ PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_X ) PORT_CROSSHAIR(X, 320.0/(320.0 - 7 -7), 0, 0) PORT_SENSITIVITY(50) PORT_KEYDELTA(10)
+
+ PORT_START("FAKE1_Y") /* fake analog Y */
+ PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_Y ) PORT_CROSSHAIR(Y, (240.0 - 1)/240, 0.0, 0) PORT_SENSITIVITY(70) PORT_KEYDELTA(10)
+
+ PORT_START("FAKE2_X") /* fake analog X */
+ PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_X ) PORT_CROSSHAIR(X, 320.0/(320.0 - 7 -7), 0.0, 0) PORT_SENSITIVITY(50) PORT_KEYDELTA(10) PORT_PLAYER(2)
+
+ PORT_START("FAKE2_Y") /* fake analog Y */
+ PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_Y ) PORT_CROSSHAIR(Y, (240.0 - 1)/240, 0.0, 0) PORT_SENSITIVITY(70) PORT_KEYDELTA(10) PORT_PLAYER(2)
+
+ PORT_START("IN3") /* gun triggers */
+ PORT_BIT( 0x00010000, IP_ACTIVE_LOW, IPT_SPECIAL ) // gun data valid
+ PORT_BIT( 0x00020000, IP_ACTIVE_LOW, IPT_SPECIAL ) // gun data valid
+ PORT_BIT( 0x00040000, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2)
+ PORT_BIT( 0x00080000, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1)
+ PORT_BIT( 0xfff00000, IP_ACTIVE_LOW, IPT_UNKNOWN )
+INPUT_PORTS_END
+
+
+static INPUT_PORTS_START( freezeat )
+ PORT_START("P1_P2")
+ PORT_BIT( 0x000000ff, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x00000100, IP_ACTIVE_LOW, IPT_START2 )
+ PORT_BIT( 0x00000200, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2)
+ PORT_BIT( 0x00000400, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2)
+ PORT_BIT( 0x00000800, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2)
+ PORT_BIT( 0x00001000, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2)
+ PORT_BIT( 0x00002000, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2)
+ PORT_BIT( 0x00004000, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2)
+ PORT_BIT( 0x00008000, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(2)
+
+ PORT_BIT( 0x00ff0000, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x01000000, IP_ACTIVE_LOW, IPT_START1 )
+ PORT_BIT( 0x02000000, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1)
+ PORT_BIT( 0x04000000, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1)
+ PORT_BIT( 0x08000000, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1)
+ PORT_BIT( 0x10000000, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1)
+ PORT_BIT( 0x20000000, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1)
+ PORT_BIT( 0x40000000, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1)
+ PORT_BIT( 0x80000000, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(1)
+
+ PORT_START("SYSTEM")
+ PORT_BIT( 0x0000ffff, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM(custom_port_read, "FAKE0")
+ PORT_BIT( 0xffff0000, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM(custom_port_read, "FAKE0")
+
+ PORT_START("FAKE0")
+ PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_COIN1 )
+ PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_COIN2 )
+ PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_COIN3 )
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_COIN4 )
+ PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_SPECIAL ) // volume down
+ PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_SPECIAL ) // volume up
+ PORT_SERVICE( 0x0040, IP_ACTIVE_LOW ) // s-test
+ PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_SPECIAL ) // vsyncneq
+ PORT_BIT( 0xff00, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START("IN3")
+ PORT_BIT( 0x000f0000, IP_ACTIVE_HIGH, IPT_SPECIAL ) // coin returns
+ PORT_BIT( 0x00f00000, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0xff000000, IP_ACTIVE_LOW, IPT_UNUSED )
+INPUT_PORTS_END
+
+
+static INPUT_PORTS_START( fishfren )
+ PORT_START("P1_P2")
+ PORT_BIT( 0x000000ff, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x00000100, IP_ACTIVE_LOW, IPT_START2 )
+ PORT_BIT( 0x00000200, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2)
+ PORT_BIT( 0x00000400, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2)
+ PORT_BIT( 0x00000800, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2)
+ PORT_BIT( 0x00001000, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2)
+ PORT_BIT( 0x00002000, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2)
+ PORT_BIT( 0x00004000, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2)
+ PORT_BIT( 0x00008000, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(2)
+
+ PORT_BIT( 0x00ff0000, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x01000000, IP_ACTIVE_LOW, IPT_START1 )
+ PORT_BIT( 0x02000000, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1)
+ PORT_BIT( 0x04000000, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1)
+ PORT_BIT( 0x08000000, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1)
+ PORT_BIT( 0x10000000, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1)
+ PORT_BIT( 0x20000000, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1)
+ PORT_BIT( 0x40000000, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1)
+ PORT_BIT( 0x80000000, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(1)
+
+ PORT_START("SYSTEM")
+ PORT_BIT( 0x0000ffff, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM(custom_port_read, "FAKE0")
+ PORT_BIT( 0xffff0000, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM(custom_port_read, "FAKE0")
+
+ PORT_START("FAKE0")
+ PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_COIN1 )
+ PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_COIN2 )
+ PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_COIN3 )
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_COIN4 )
+ PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_SPECIAL ) // volume down
+ PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_SPECIAL ) // volume up
+ PORT_SERVICE( 0x0040, IP_ACTIVE_LOW ) // s-test
+ PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_SPECIAL ) // vsyncneq
+ PORT_BIT( 0xff00, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START("IN3")
+ PORT_BIT( 0x000f0000, IP_ACTIVE_HIGH, IPT_SPECIAL ) // coin returns
+ PORT_BIT( 0x00f00000, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0xff000000, IP_ACTIVE_LOW, IPT_UNUSED )
+INPUT_PORTS_END
+
+
+static INPUT_PORTS_START( vcircle )
+ PORT_START("P1_P2")
+ PORT_BIT( 0x00000001, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(2)
+ PORT_BIT( 0x00000002, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_PLAYER(2)
+ PORT_BIT( 0x00000004, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_PLAYER(2)
+ PORT_BIT( 0x000000f8, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x00000100, IP_ACTIVE_LOW, IPT_START2 )
+ PORT_BIT( 0x00000200, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2)
+ PORT_BIT( 0x00000400, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2)
+ PORT_BIT( 0x00000800, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2)
+ PORT_BIT( 0x00001000, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2)
+ PORT_BIT( 0x00002000, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2)
+ PORT_BIT( 0x00004000, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2)
+ PORT_BIT( 0x00008000, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(2)
+
+ PORT_BIT( 0x00010000, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(1)
+ PORT_BIT( 0x00020000, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_PLAYER(1)
+ PORT_BIT( 0x00040000, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_PLAYER(1)
+ PORT_BIT( 0x00f80000, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x01000000, IP_ACTIVE_LOW, IPT_START1 )
+ PORT_BIT( 0x02000000, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1)
+ PORT_BIT( 0x04000000, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1)
+ PORT_BIT( 0x08000000, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1)
+ PORT_BIT( 0x10000000, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1)
+ PORT_BIT( 0x20000000, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1)
+ PORT_BIT( 0x40000000, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1)
+ PORT_BIT( 0x80000000, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(1)
+
+ PORT_START("SYSTEM")
+ PORT_BIT( 0x0000ffff, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM(custom_port_read, "FAKE0")
+ PORT_BIT( 0xffff0000, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM(custom_port_read, "FAKE0")
+
+ PORT_START("FAKE0")
+ PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_COIN1 )
+ PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_COIN2 )
+ PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_COIN3 )
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_COIN4 )
+ PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_VOLUME_DOWN )
+ PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_VOLUME_UP )
+ PORT_SERVICE( 0x0040, IP_ACTIVE_LOW ) // s-test
+ PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_SPECIAL ) // vsyncneq
+ PORT_BIT( 0xff00, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START("IN3")
+ PORT_BIT( 0x000f0000, IP_ACTIVE_HIGH, IPT_SPECIAL ) // coin returns
+ PORT_BIT( 0x00f00000, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0xff000000, IP_ACTIVE_LOW, IPT_UNUSED )
+INPUT_PORTS_END
+
+
+static INPUT_PORTS_START( jaguar )
+ PORT_START("JOY0")
+ PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1)
+ PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1)
+ PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1)
+ PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(1)
+ PORT_BIT( 0xf0ff, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START("JOY1")
+ PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P1 Keypad 1") PORT_CODE(KEYCODE_1) PORT_PLAYER(1)
+ PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P1 Keypad 4") PORT_CODE(KEYCODE_4) PORT_PLAYER(1)
+ PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P1 Keypad 7") PORT_CODE(KEYCODE_7) PORT_PLAYER(1)
+ PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P1 Keypad *") PORT_CODE(KEYCODE_K) PORT_PLAYER(1)
+ PORT_BIT( 0xf0ff, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START("JOY2")
+ PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P1 Keypad 2") PORT_CODE(KEYCODE_2) PORT_PLAYER(1)
+ PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P1 Keypad 5") PORT_CODE(KEYCODE_5) PORT_PLAYER(1)
+ PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P1 Keypad 8") PORT_CODE(KEYCODE_8) PORT_PLAYER(1)
+ PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P1 Keypad 0") PORT_CODE(KEYCODE_0) PORT_PLAYER(1)
+ PORT_BIT( 0xf0ff, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START("JOY3")
+ PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P1 Keypad 3") PORT_CODE(KEYCODE_3) PORT_PLAYER(1)
+ PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P1 Keypad 6") PORT_CODE(KEYCODE_6) PORT_PLAYER(1)
+ PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P1 Keypad 9") PORT_CODE(KEYCODE_9) PORT_PLAYER(1)
+ PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P1 Keypad #") PORT_CODE(KEYCODE_L) PORT_PLAYER(1)
+ PORT_BIT( 0xf0ff, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START("JOY4")
+ PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 Keypad 3") PORT_PLAYER(2)
+ PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 Keypad 6") PORT_PLAYER(2)
+ PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 Keypad 9") PORT_PLAYER(2)
+ PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 Keypad #") PORT_PLAYER(2)
+ PORT_BIT( 0x0fff, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START("JOY5")
+ PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 Keypad 2") PORT_PLAYER(2)
+ PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 Keypad 5") PORT_PLAYER(2)
+ PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 Keypad 8") PORT_PLAYER(2)
+ PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 Keypad 0") PORT_PLAYER(2)
+ PORT_BIT( 0x0fff, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START("JOY6")
+ PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 Keypad 1") PORT_PLAYER(2)
+ PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 Keypad 4") PORT_PLAYER(2)
+ PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 Keypad 7") PORT_PLAYER(2)
+ PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 Keypad *") PORT_PLAYER(2)
+ PORT_BIT( 0x0fff, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START("JOY7")
+ PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2)
+ PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2)
+ PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2)
+ PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(2)
+ PORT_BIT( 0x0fff, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START("BUTTONS0")
+ PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_NAME("P1 Pause") PORT_CODE(KEYCODE_I) PORT_PLAYER(1)
+ PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("P1 A") PORT_PLAYER(1)
+ PORT_BIT( 0xfffc, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START("BUTTONS1")
+ PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("P1 B") PORT_PLAYER(1)
+ PORT_BIT( 0xfffd, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START("BUTTONS2")
+ PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("P1 C") PORT_PLAYER(1)
+ PORT_BIT( 0xfffd, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START("BUTTONS3")
+ PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME("P1 Option") PORT_CODE(KEYCODE_O) PORT_PLAYER(1)
+ PORT_BIT( 0xfffd, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START("BUTTONS4")
+ PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME("P2 Option") PORT_PLAYER(2)
+ PORT_BIT( 0xfffd, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START("BUTTONS5")
+ PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("P2 C") PORT_PLAYER(2)
+ PORT_BIT( 0xfffd, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START("BUTTONS6")
+ PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("P2 B") PORT_PLAYER(2)
+ PORT_BIT( 0xfffd, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START("BUTTONS7")
+ PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_NAME("P2 Pause") PORT_PLAYER(2)
+ PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("P2 A") PORT_PLAYER(2)
+ PORT_BIT( 0xfffc, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START("CONFIG")
+ PORT_CONFNAME( 0x02, 0x00, "Show Logo")
+ PORT_CONFSETTING( 0x00, "Yes")
+ PORT_CONFSETTING( 0x02, "No")
+ PORT_CONFNAME( 0x10, 0x10, "TV System")
+ PORT_CONFSETTING( 0x00, "PAL")
+ PORT_CONFSETTING( 0x10, "NTSC")
+INPUT_PORTS_END
+
+/*************************************
+ *
+ * Machine driver
+ *
+ *************************************/
+
+static const r3000_cpu_core r3000_config =
+{
+ 0, /* 1 if we have an FPU, 0 otherwise */
+ 4096, /* code cache size */
+ 4096 /* data cache size */
+};
+
+
+static const jaguar_cpu_config gpu_config =
+{
+ jaguar_gpu_cpu_int
+};
+
+
+static const jaguar_cpu_config dsp_config =
+{
+ jaguar_dsp_cpu_int
+};
+
+
+static MACHINE_CONFIG_START( cojagr3k, cojag_state )
+
+ /* basic machine hardware */
+ MCFG_CPU_ADD("maincpu", R3041BE, R3000_CLOCK)
+ MCFG_CPU_CONFIG(r3000_config)
+ MCFG_CPU_PROGRAM_MAP(r3000_map)
+
+ MCFG_CPU_ADD("gpu", JAGUARGPU, COJAG_CLOCK/2)
+ MCFG_CPU_CONFIG(gpu_config)
+ MCFG_CPU_PROGRAM_MAP(gpu_map)
+
+ MCFG_CPU_ADD("audiocpu", JAGUARDSP, COJAG_CLOCK/2)
+ MCFG_CPU_CONFIG(dsp_config)
+ MCFG_CPU_PROGRAM_MAP(dsp_map)
+
+ MCFG_MACHINE_RESET(cojag)
+ MCFG_NVRAM_ADD_1FILL("nvram")
+
+ MCFG_IDE_CONTROLLER_ADD("ide", jaguar_external_int)
+
+ MCFG_TIMER_ADD("serial_timer", jaguar_serial_callback)
+
+ /* video hardware */
+ MCFG_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK)
+
+ MCFG_SCREEN_ADD("screen", RASTER)
+ MCFG_SCREEN_RAW_PARAMS(COJAG_PIXEL_CLOCK/2, 456, 42, 402, 262, 17, 257)
+ MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32)
+ MCFG_SCREEN_UPDATE(cojag)
+
+ MCFG_VIDEO_START(cojag)
+
+ /* sound hardware */
+ MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
+
+ MCFG_SOUND_ADD("dac1", DAC, 0)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0)
+
+ MCFG_SOUND_ADD("dac2", DAC, 0)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0)
+MACHINE_CONFIG_END
+
+
+static MACHINE_CONFIG_DERIVED( cojag68k, cojagr3k )
+
+ /* basic machine hardware */
+ MCFG_CPU_REPLACE("maincpu", M68EC020, M68K_CLOCK/2)
+ MCFG_CPU_PROGRAM_MAP(m68020_map)
+MACHINE_CONFIG_END
+
+
+static MACHINE_CONFIG_START( jaguar, driver_device )
+
+ /* basic machine hardware */
+ MCFG_CPU_ADD("maincpu", M68000, JAGUAR_CLOCK/2)
+ MCFG_CPU_PROGRAM_MAP(jaguar_map)
+
+ MCFG_CPU_ADD("gpu", JAGUARGPU, JAGUAR_CLOCK)
+ MCFG_CPU_CONFIG(gpu_config)
+ MCFG_CPU_PROGRAM_MAP(jag_gpu_map)
+
+ MCFG_CPU_ADD("audiocpu", JAGUARDSP, JAGUAR_CLOCK)
+ MCFG_CPU_CONFIG(dsp_config)
+ MCFG_CPU_PROGRAM_MAP(jag_dsp_map)
+
+ MCFG_MACHINE_RESET(jaguar)
+// MCFG_NVRAM_HANDLER(jaguar)
+
+ MCFG_TIMER_ADD("serial_timer", jaguar_serial_callback)
+
+ /* video hardware */
+ MCFG_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK)
+ MCFG_SCREEN_ADD("screen", RASTER)
+ MCFG_SCREEN_REFRESH_RATE(60)
+ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
+ MCFG_SCREEN_RAW_PARAMS(JAGUAR_CLOCK, 456, 42, 402, 262, 17, 257)
+ MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32)
+ MCFG_SCREEN_UPDATE(cojag)
+
+ MCFG_VIDEO_START(jaguar)
+
+ /* sound hardware */
+ MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
+ MCFG_SOUND_ADD("dac1", DAC, 0)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0)
+ MCFG_SOUND_ADD("dac2", DAC, 0)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0)
+
+ /* quickload */
+ MCFG_QUICKLOAD_ADD("quickload", jaguar, "abs,bin,cof,jag,prg", 0)
+
+ /* cartridge */
+ MCFG_CARTSLOT_ADD("cart")
+ MCFG_CARTSLOT_EXTENSION_LIST("j64,rom")
+ MCFG_CARTSLOT_INTERFACE("jaguar_cart")
+ MCFG_CARTSLOT_START(jaguar_cart)
+ MCFG_CARTSLOT_LOAD(jaguar)
+
+ /* software lists */
+ MCFG_SOFTWARE_LIST_ADD("cart_list","jaguar")
+
+ MCFG_EEPROM_93C46_ADD("eeprom")
+MACHINE_CONFIG_END
+
+
+
+/*************************************
+ *
+ * Driver initialization
+ *
+ *************************************/
+
+static void jaguar_fix_endian( running_machine &machine, UINT32 addr, UINT32 size )
+{
+ UINT8 j[4], *RAM = machine.region("maincpu")->base();
+ UINT32 i;
+ size += addr;
+ logerror("File Loaded to address range %X to %X\n",addr,size-1);
+ for (i = addr; i < size; i+=4)
+ {
+ j[0] = RAM[i];
+ j[1] = RAM[i+1];
+ j[2] = RAM[i+2];
+ j[3] = RAM[i+3];
+ RAM[i] = j[3];
+ RAM[i+1] = j[2];
+ RAM[i+2] = j[1];
+ RAM[i+3] = j[0];
+ }
+}
+
+static DRIVER_INIT( jaguar )
+{
+ state_save_register_global(machine, joystick_data);
+ using_cart = 0;
+
+ for (int i=0;i<0x20000/4;i++) // the cd bios is bigger.. check
+ {
+ rom_base[i] = ((rom_base[i] & 0xffff0000)>>16) | ((rom_base[i] & 0x0000ffff)<<16);
+ }
+
+ for (int i=0;i<0x1000/4;i++)
+ {
+ high_rom_base[i] = ((high_rom_base[i] & 0xffff0000)>>16) | ((high_rom_base[i] & 0x0000ffff)<<16);
+ }
+}
+
+static QUICKLOAD_LOAD( jaguar )
+{
+ offs_t quickload_begin = 0x4000, start = quickload_begin, skip = 0;
+ memset(jaguar_shared_ram, 0, 0x200000);
+ quickload_size = MIN(quickload_size, 0x200000 - quickload_begin);
+
+ image.fread( &image.device().machine().region("maincpu")->base()[quickload_begin], quickload_size);
+
+ jaguar_fix_endian(image.device().machine(), quickload_begin, quickload_size);
+
+ /* Deal with some of the numerous homebrew header systems */
+ /* COF */
+ if ((jaguar_shared_ram[0x1000] & 0xffff0000) == 0x01500000)
+ {
+ start = jaguar_shared_ram[0x100e];
+ skip = jaguar_shared_ram[0x1011];
+ }
+ else /* PRG */
+ if (((jaguar_shared_ram[0x1000] & 0xffff0000) == 0x601A0000) && (jaguar_shared_ram[0x1007] == 0x4A414752))
+ {
+ UINT32 type = jaguar_shared_ram[0x1008] >> 16;
+ start = ((jaguar_shared_ram[0x1008] & 0xffff) << 16) | (jaguar_shared_ram[0x1009] >> 16);
+ skip = 28;
+ if (type == 2) skip = 42;
+ else if (type == 3) skip = 46;
+ }
+ else /* ABS with header */
+ if ((jaguar_shared_ram[0x1000] & 0xffff0000) == 0x601B0000)
+ {
+ start = ((jaguar_shared_ram[0x1005] & 0xffff) << 16) | (jaguar_shared_ram[0x1006] >> 16);
+ skip = 36;
+ }
+
+ else /* A header used by Badcoder */
+ if ((jaguar_shared_ram[0x1000] & 0xffff0000) == 0x72000000)
+ skip = 96;
+
+ else /* ABS binary */
+ if (!mame_stricmp(image.filetype(), "abs"))
+ start = 0xc000;
+
+ else /* JAG binary */
+ if (!mame_stricmp(image.filetype(), "jag"))
+ start = 0x5000;
+
+
+ /* Now that we have the info, reload the file */
+ if ((start != quickload_begin) || (skip))
+ {
+ memset(jaguar_shared_ram, 0, 0x200000);
+ image.fseek(0, SEEK_SET);
+ image.fread( &image.device().machine().region("maincpu")->base()[start-skip], quickload_size);
+ quickload_begin = start;
+ jaguar_fix_endian(image.device().machine(), (start-skip)&0xfffffc, quickload_size);
+ }
+
+
+ /* Some programs are too lazy to set a stack pointer */
+ cpu_set_reg(image.device().machine().device("maincpu"), STATE_GENSP, 0x1000);
+ jaguar_shared_ram[0]=0x1000;
+
+ /* Transfer control to image */
+ cpu_set_reg(image.device().machine().device("maincpu"), STATE_GENPC, quickload_begin);
+ jaguar_shared_ram[1]=quickload_begin;
+ return IMAGE_INIT_PASS;
+}
+
+static DEVICE_START( jaguar_cart )
+{
+ /* Initialize for no cartridge present */
+ using_cart = 0;
+ memset( cart_base, 0, cart_size );
+}
+
+static DEVICE_IMAGE_LOAD( jaguar )
+{
+ UINT32 size, load_offset = 0;
+
+ if (image.software_entry() == NULL)
+ {
+ size = image.length();
+
+ /* .rom files load & run at 802000 */
+ if (!mame_stricmp(image.filetype(), "rom"))
+ {
+ load_offset = 0x2000; // fix load address
+ cart_base[0x101]=0x802000; // fix exec address
+ }
+
+ /* Load cart into memory */
+ image.fread( &image.device().machine().region("maincpu")->base()[0x800000+load_offset], size);
+ }
+ else
+ {
+ size = image.get_software_region_length("rom");
+
+ memcpy(cart_base, image.get_software_region("rom"), size);
+ }
+
+ memset(jaguar_shared_ram, 0, 0x200000);
+
+ jaguar_fix_endian(image.device().machine(), 0x800000+load_offset, size);
+
+ /* Skip the logo */
+ using_cart = 1;
+// cart_base[0x102] = 1;
+
+ /* Transfer control to the bios */
+ cpu_set_reg(image.device().machine().device("maincpu"), STATE_GENPC, rom_base[1]);
+ return IMAGE_INIT_PASS;
+}
+
+/*************************************
+ *
+ * ROM definition(s)
+ *
+ * Date Information comes from either
+ * ROM labels or from the Self-Test
+ * as "Main"
+ *
+ *************************************/
+
+/* Home System */
+
+ROM_START( jaguar )
+ ROM_REGION( 0x1000000, "maincpu", 0 ) /* 4MB for RAM at 0 */
+ ROM_LOAD16_WORD( "jagboot.rom", 0xe00000, 0x020000, CRC(fb731aaa) SHA1(f8991b0c385f4e5002fa2a7e2f5e61e8c5213356) )
+ ROM_CART_LOAD("cart", 0x800000, 0x600000, ROM_NOMIRROR)
+ ROM_LOAD16_WORD("jagwave.rom", 0xf1d000, 0x1000, CRC(7a25ee5b) SHA1(58117e11fd6478c521fbd3fdbe157f39567552f0) )
+ROM_END
+
+ROM_START( jaguarcd )
+ ROM_REGION( 0x1000000, "maincpu", 0 )
+ ROM_SYSTEM_BIOS( 0, "default", "Jaguar CD" )
+ ROMX_LOAD( "jag_cd.bin", 0xe00000, 0x040000, CRC(687068d5) SHA1(73883e7a6e9b132452436f7ab1aeaeb0776428e5), ROM_BIOS(1) )
+ ROM_SYSTEM_BIOS( 1, "dev", "Jaguar Developer CD" )
+ ROMX_LOAD( "jagdevcd.bin", 0xe00000, 0x040000, CRC(55a0669c) SHA1(d61b7b5912118f114ef00cf44966a5ef62e455a5), ROM_BIOS(2) )
+ ROM_CART_LOAD("cart", 0x800000, 0x600000, ROM_NOMIRROR)
+ ROM_LOAD16_WORD("jagwave.rom", 0xf1d000, 0x1000, CRC(7a25ee5b) SHA1(58117e11fd6478c521fbd3fdbe157f39567552f0) )
+ROM_END
+
+
+/****************************************
+
+ ROM & Hard Disk based games
+
+****************************************/
+
+ROM_START( area51t ) /* 68020 based, Area51 Time Warner License Date: Nov 15, 1995 */
+ ROM_REGION32_BE( 0x200000, "user1", 0 ) /* 2MB for 68020 code */
+ ROM_LOAD32_BYTE( "136105-0003c.3h", 0x00000, 0x80000, CRC(e70a97c4) SHA1(39dabf6bf3dc6f717a587f362d040bfb332be9e1) )
+ ROM_LOAD32_BYTE( "136105-0002c.3p", 0x00001, 0x80000, CRC(e9c9f4bd) SHA1(7c6c50372d45dca8929767241b092339f3bab4d2) )
+ ROM_LOAD32_BYTE( "136105-0001c.3m", 0x00002, 0x80000, CRC(6f135a81) SHA1(2d9660f240b14481e8c46bc98713e9dc12035063) )
+ ROM_LOAD32_BYTE( "136105-0000c.3k", 0x00003, 0x80000, CRC(94f50c14) SHA1(a54552e3ac5c4f481ba4f2fc7d724534576fe76c) )
+
+ DISK_REGION( "ide" )
+ DISK_IMAGE( "area51t", 0, SHA1(d2865cc7b1bb08a4393a72013a90e18d8a8f9860) )
+ROM_END
+
+ROM_START( area51a ) /* 68020 based, Area51 Atari Games License Date: Oct 25, 1995 */
+ ROM_REGION32_BE( 0x200000, "user1", 0 ) /* 2MB for 68020 code */
+ ROM_LOAD32_BYTE( "136105-0003a.3h", 0x00000, 0x80000, CRC(116d37e6) SHA1(5d36cae792dd349faa77cd2d8018722a28ee55c1) )
+ ROM_LOAD32_BYTE( "136105-0002a.3p", 0x00001, 0x80000, CRC(eb10f539) SHA1(dadc4be5a442dd4bd17385033056555e528ed994) )
+ ROM_LOAD32_BYTE( "136105-0001a.3m", 0x00002, 0x80000, CRC(c6d8322b) SHA1(90cf848a4195c51b505653cc2c74a3b9e3c851b8) )
+ ROM_LOAD32_BYTE( "136105-0000a.3k", 0x00003, 0x80000, CRC(729eb1b7) SHA1(21864b4281b1ad17b2903e3aa294e4be74161e80) )
+
+ DISK_REGION( "ide" )
+ DISK_IMAGE( "area51", 0, SHA1(3b303bc37e206a6d7339352c869f050d04186f11) )
+ROM_END
+
+ROM_START( area51 ) /* R3000 based, labeled as "Area51 2-C" Date: Nov 11 1996 */
+ ROM_REGION32_BE( 0x200000, "user1", 0 ) /* 2MB for IDT 79R3041 code */
+ ROM_LOAD32_BYTE( "a51_2-c.hh", 0x00000, 0x80000, CRC(13af6a1e) SHA1(69da54ed6886e825156bbcc256e8d7abd4dc1ff8) )
+ ROM_LOAD32_BYTE( "a51_2-c.hl", 0x00001, 0x80000, CRC(8ab6649b) SHA1(9b4945bc04f8a73161638a2c5fa2fd84c6fd31b4) )
+ ROM_LOAD32_BYTE( "a51_2-c.lh", 0x00002, 0x80000, CRC(a6524f73) SHA1(ae377a6803a4f7d1bbcc111725af121a3e82317d) )
+ ROM_LOAD32_BYTE( "a51_2-c.ll", 0x00003, 0x80000, CRC(471b15d2) SHA1(4b5f45ee140b03a6be61475cae1c2dbef0f07457) )
+
+ DISK_REGION( "ide" )
+ DISK_IMAGE( "area51", 0, SHA1(3b303bc37e206a6d7339352c869f050d04186f11) )
+ROM_END
+
+ROM_START( maxforce ) /* R3000 based, labeled as "Maximum Force 5-23-97 v1.05" */
+ ROM_REGION32_BE( 0x200000, "user1", 0 ) /* 2MB for IDT 79R3041 code */
+ ROM_LOAD32_BYTE( "maxf_105.hh", 0x00000, 0x80000, CRC(ec7f8167) SHA1(0cf057bfb1f30c2c9621d3ed25021e7ba7bdd46e) )
+ ROM_LOAD32_BYTE( "maxf_105.hl", 0x00001, 0x80000, CRC(3172611c) SHA1(00f14f871b737c66c20f95743740d964d0be3f24) )
+ ROM_LOAD32_BYTE( "maxf_105.lh", 0x00002, 0x80000, CRC(84d49423) SHA1(88d9a6724f1118f2bbef5dfa27accc2b65c5ba1d) )
+ ROM_LOAD32_BYTE( "maxf_105.ll", 0x00003, 0x80000, CRC(16d0768d) SHA1(665a6d7602a7f2f5b1f332b0220b1533143d56b1) )
+
+ DISK_REGION( "ide" )
+ DISK_IMAGE( "maxforce", 0, SHA1(d54e7a8f3866bb2a1d28ae637e7c92ffa4dbe558) )
+ROM_END
+
+
+ROM_START( maxf_102 ) /* R3000 based, labeled as "Maximum Force 2-27-97 v1.02" */
+ ROM_REGION32_BE( 0x200000, "user1", 0 ) /* 2MB for IDT 79R3041 code */
+ ROM_LOAD32_BYTE( "maxf_102.hh", 0x00000, 0x80000, CRC(8ff7009d) SHA1(da22eae298a6e0e36f503fa091ac3913423dcd0f) )
+ ROM_LOAD32_BYTE( "maxf_102.hl", 0x00001, 0x80000, CRC(96c2cc1d) SHA1(b332b8c042b92c736131c478cefac1c3c2d2673b) )
+ ROM_LOAD32_BYTE( "maxf_102.lh", 0x00002, 0x80000, CRC(459ffba5) SHA1(adb40db6904e84c17f32ac6518fd2e994da7883f) )
+ ROM_LOAD32_BYTE( "maxf_102.ll", 0x00003, 0x80000, CRC(e491be7f) SHA1(cbe281c099a4aa87067752d68cf2bb0ab3900531) )
+
+ DISK_REGION( "ide" )
+ DISK_IMAGE( "maxforce", 0, SHA1(d54e7a8f3866bb2a1d28ae637e7c92ffa4dbe558) )
+ROM_END
+
+
+ROM_START( maxf_ng ) /* R3000 based, stickers say 'NO GORE' */
+ ROM_REGION32_BE( 0x200000, "user1", 0 ) /* 2MB for IDT 79R3041 code */
+ ROM_LOAD32_BYTE( "mf_ng_hh.21v", 0x00000, 0x80000, CRC(08791c02) SHA1(9befbff3201c7d345109b26c296fd8548dbfc95b) )
+ ROM_LOAD32_BYTE( "mf_ng_hl.17v", 0x00001, 0x80000, CRC(52cf482c) SHA1(ff98b3f04987acef82a97a2ad35a9085fa84e6d5) )
+ ROM_LOAD32_BYTE( "mf_ng_lh.21y", 0x00002, 0x80000, CRC(ab4ee992) SHA1(69f0fe111d3f5f31151d2922579e5073e484b1e1) )
+ ROM_LOAD32_BYTE( "mf_ng_ll.17y", 0x00003, 0x80000, CRC(674aab43) SHA1(f79d790538756d1100b7e4ffed192a62a031a2cb) )
+
+ ROM_REGION( 0x800, "user2", 0 ) /* 28C16 style eeprom, currently loaded but not used */
+ ROM_LOAD( "28c16.17z", 0x000, 0x800, CRC(1cdd9088) SHA1(4f01f02ff95f31ced87a3cdd7f171afd92551266) )
+
+ DISK_REGION( "ide" )
+ DISK_IMAGE( "maxforce", 0, SHA1(d54e7a8f3866bb2a1d28ae637e7c92ffa4dbe558) )
+ROM_END
+
+
+ROM_START( area51mx ) /* 68020 based, Labeled as "68020 MAX/A51 KIT 2.0" Date: Apr 22, 1998 */
+ ROM_REGION32_BE( 0x200000, "user1", 0 ) /* 2MB for 68020 code */
+ ROM_LOAD32_BYTE( "area51mx.3h", 0x00000, 0x80000, CRC(47cbf30b) SHA1(23377bcc65c0fc330d5bc7e76e233bae043ac364) )
+ ROM_LOAD32_BYTE( "area51mx.3p", 0x00001, 0x80000, CRC(a3c93684) SHA1(f6b3357bb69900a176fd6bc6b819b2f57b7d0f59) )
+ ROM_LOAD32_BYTE( "area51mx.3m", 0x00002, 0x80000, CRC(d800ac17) SHA1(3d515c8608d8101ee9227116175b3c3f1fe22e0c) )
+ ROM_LOAD32_BYTE( "area51mx.3k", 0x00003, 0x80000, CRC(0e78f308) SHA1(adc4c8e441eb8fe525d0a6220eb3a2a8791a7289) )
+
+ DISK_REGION( "ide" )
+ DISK_IMAGE( "area51mx", 0, SHA1(5ff10f4e87094d4449eabf3de7549564ca568c7e) )
+ROM_END
+
+
+ROM_START( a51mxr3k ) /* R3000 based, Labeled as "R3K Max/A51 Kit Ver 1.0" */
+ ROM_REGION32_BE( 0x200000, "user1", 0 ) /* 2MB for IDT 79R3041 code */
+ ROM_LOAD32_BYTE( "a51mxr3k.hh", 0x00000, 0x80000, CRC(a984dab2) SHA1(debb3bc11ff49e87a52e89a69533a1bab7db700e) )
+ ROM_LOAD32_BYTE( "a51mxr3k.hl", 0x00001, 0x80000, CRC(0af49d74) SHA1(c19f26056a823fd32293e9a7b3ea868640eabf49) )
+ ROM_LOAD32_BYTE( "a51mxr3k.lh", 0x00002, 0x80000, CRC(d7d94dac) SHA1(2060a74715f36a0d7f5dd0855eda48ad1f20f095) )
+ ROM_LOAD32_BYTE( "a51mxr3k.ll", 0x00003, 0x80000, CRC(ece9e5ae) SHA1(7e44402726f5afa6d1670b27aa43ad13d21c4ad9) )
+
+ DISK_REGION( "ide" )
+ DISK_IMAGE( "area51mx", 0, SHA1(5ff10f4e87094d4449eabf3de7549564ca568c7e) )
+ROM_END
+
+
+ROM_START( vcircle )
+ ROM_REGION32_BE( 0x200000, "user1", 0 ) /* 2MB for R3000 code */
+ ROM_LOAD32_BYTE( "hh", 0x00000, 0x80000, CRC(7276f5f5) SHA1(716287e370a4f300b1743103f8031afc82de38ca) )
+ ROM_LOAD32_BYTE( "hl", 0x00001, 0x80000, CRC(146060a1) SHA1(f291989f1f0ef228757f1990fb14da5ff8f3cf8d) )
+ ROM_LOAD32_BYTE( "lh", 0x00002, 0x80000, CRC(be4b2ef6) SHA1(4332b3036e9cb12685e914d085d9a63aa856f0be) )
+ ROM_LOAD32_BYTE( "ll", 0x00003, 0x80000, CRC(ba8753eb) SHA1(0322e0e37d814a38d08ba191b1a97fb1a55fe461) )
+
+ DISK_REGION( "ide" )
+ DISK_IMAGE( "vcircle", 0, SHA1(bfa79c4cacdc9c2cd6362f62a23056b3e35a2034) )
+ROM_END
+
+
+
+/****************************************
+
+ ROM based games
+
+****************************************/
+
+
+ROM_START( fishfren )
+ ROM_REGION32_BE( 0x200000, "user1", 0 ) /* 2MB for R3000 code */
+ ROM_LOAD32_BYTE( "hh", 0x00000, 0x80000, CRC(2ef79767) SHA1(abcea584f2cbd71b05f9d7e61f40ca9da6799215) )
+ ROM_LOAD32_BYTE( "hl", 0x00001, 0x80000, CRC(7eefd4a2) SHA1(181be04836704098082fd78cacc68ffa70e77892) )
+ ROM_LOAD32_BYTE( "lh", 0x00002, 0x80000, CRC(bbe9ed15) SHA1(889af29afe6d984b39105aa238400392a5dfb2c5) )
+ ROM_LOAD32_BYTE( "ll", 0x00003, 0x80000, CRC(d70d0f2c) SHA1(2689cbe56ae3d491348b241528b0fe345fa8484c) )
+
+ ROM_REGION32_BE( 0x1000000, "user2", 0 ) /* 16MB for 64-bit ROM data */
+ ROMX_LOAD( "l63-56", 0x000000, 0x100000, CRC(42764ea5) SHA1(805245f01006bd974fbac56f688cfcf137ddc914), ROM_SKIP(7) )
+ ROMX_LOAD( "l55-48", 0x000001, 0x100000, CRC(0c7592bb) SHA1(d5bd6b872abad58947842205f9eac46fd065e88f), ROM_SKIP(7) )
+ ROMX_LOAD( "l47-40", 0x000002, 0x100000, CRC(6d7dcdb1) SHA1(914dae3b9df5c861f794b683571c5fb0c2c3c3fd), ROM_SKIP(7) )
+ ROMX_LOAD( "l39-32", 0x000003, 0x100000, CRC(ef3b8d98) SHA1(858c3342e9693bfe887b91dde1116a1656a1a105), ROM_SKIP(7) )
+ ROMX_LOAD( "l31-24", 0x000004, 0x100000, CRC(132d628e) SHA1(3ff9fa86092eb01f21ca3ccf1ee1e3a583cbdecb), ROM_SKIP(7) )
+ ROMX_LOAD( "l23-16", 0x000005, 0x100000, CRC(b841f039) SHA1(79f661aee009aef2f5ad4122ae3e0ac94097a427), ROM_SKIP(7) )
+ ROMX_LOAD( "l15-08", 0x000006, 0x100000, CRC(0800214e) SHA1(5372f2c3470619a4967958c76055486f76b5f150), ROM_SKIP(7) )
+ ROMX_LOAD( "l07-00", 0x000007, 0x100000, CRC(f83b2e78) SHA1(83ee9d2bfba83e04fb794270926bd3e558c9aaa4), ROM_SKIP(7) )
+ ROMX_LOAD( "h63-56", 0x800000, 0x080000, CRC(67740765) SHA1(8b22413d25e0dbfe2227d1a8a023961a4c13cb76), ROM_SKIP(7) )
+ ROMX_LOAD( "h55-48", 0x800001, 0x080000, CRC(ffed0091) SHA1(6c8104acd7e6d95a111f9c7a4d3b6984293d72c4), ROM_SKIP(7) )
+ ROMX_LOAD( "h47-40", 0x800002, 0x080000, CRC(6f448f72) SHA1(3a298b9851e4ba7aa611aa6c2b0dcf06f4301463), ROM_SKIP(7) )
+ ROMX_LOAD( "h39-32", 0x800003, 0x080000, CRC(25a5bd67) SHA1(79f29bd36afb4574b9c923eee293964284713540), ROM_SKIP(7) )
+ ROMX_LOAD( "h31-24", 0x800004, 0x080000, CRC(e7088cc0) SHA1(4cb184de748c5633e669a4675e6db9920d34811e), ROM_SKIP(7) )
+ ROMX_LOAD( "h23-16", 0x800005, 0x080000, CRC(ab477a76) SHA1(ae9aa97dbc758cd741710fe08c6ea94a0a318451), ROM_SKIP(7) )
+ ROMX_LOAD( "h15-08", 0x800006, 0x080000, CRC(25a423f1) SHA1(7530cf2e28e0755bfcbd70789ef5cbbfb3d94f9f), ROM_SKIP(7) )
+ ROMX_LOAD( "h07-00", 0x800007, 0x080000, CRC(0f5f4cc6) SHA1(caa2b514fb1f2a815e63f7b8c6b79ce2dfa308c4), ROM_SKIP(7) )
+ ROM_COPY( "user2", 0x800000, 0xc00000, 0x400000 )
+ROM_END
+
+ROM_START( freezeat )
+ ROM_REGION32_BE( 0x200000, "user1", 0 ) /* 2MB for R3000 code */
+ ROM_LOAD32_BYTE( "prog_eng.hh", 0x000000, 0x040000, CRC(f7cffafd) SHA1(62369de4cf0a5abab86f6bcf9621028b9e171ec3) )
+ ROM_LOAD32_BYTE( "prog_eng.hl", 0x000001, 0x040000, CRC(17150705) SHA1(c5a32d334bffb58a816920cc1251a21acc5a6f92) )
+ ROM_LOAD32_BYTE( "prog_eng.lh", 0x000002, 0x040000, CRC(12a903bf) SHA1(41f5949d7ed2081917af8411f92666b754564b37) )
+ ROM_LOAD32_BYTE( "prog_eng.ll", 0x000003, 0x040000, CRC(cf69f971) SHA1(132b06f5fb49801fff7e5deb7aa71b44d5b1c6ca) )
+
+ ROM_REGION32_BE( 0x1000000, "user2", 0 ) /* 16MB for 64-bit ROM data */
+ ROMX_LOAD( "fish_gr0.63-56", 0x000000, 0x100000, CRC(b61061c5) SHA1(aeb409aa5073232d80ed81b27946e753290234f4), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr0.55-48", 0x000001, 0x100000, CRC(c85acf42) SHA1(c3365caeb126a83a7e7afcda25f05849ceb5c98b), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr0.47-40", 0x000002, 0x100000, CRC(67f78f59) SHA1(40b256a8939fad365c7e896cff4a959fcc70a477), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr0.39-32", 0x000003, 0x100000, CRC(6be0508a) SHA1(20f617278ce1666348822d80686cecd8d9b1bc78), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr0.31-24", 0x000004, 0x100000, CRC(905606e0) SHA1(866cd98ea2399fed96f76b16dce751e2c7cfdc98), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr0.23-16", 0x000005, 0x100000, CRC(cdeef6fa) SHA1(1b4d58951b662040540e7d51f88c1b6f282562ee), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr0.15-08", 0x000006, 0x100000, CRC(ad81f204) SHA1(58584a6c8c6cfb6366eaa10aba8a226e419f5ce9), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr0.07-00", 0x000007, 0x100000, CRC(10ce7254) SHA1(2a88d45dbe78ea8358ecd8522b38d775a2fdb34a), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_eng.63-56", 0x800000, 0x100000, CRC(4a03f971) SHA1(1ae5ad9a6cd2d612c6519193134dcd5a3f6a5049), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_eng.55-48", 0x800001, 0x100000, CRC(6bc00de0) SHA1(b1b180c33906826703452875ce250b28352e2797), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_eng.47-40", 0x800002, 0x100000, CRC(41ccc677) SHA1(76ee042632cfdcc99a9bfb75f2a4ef04e08f101b), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_eng.39-32", 0x800003, 0x100000, CRC(59a8fa03) SHA1(19e91a4791e0d2dbd8578cee0fa07c491204b0dc), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_eng.31-24", 0x800004, 0x100000, CRC(c3bb50a1) SHA1(b868ac0812d1c13feae82d293bb323a93a72e1d3), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_eng.23-16", 0x800005, 0x100000, CRC(237cfc93) SHA1(15f61dc621c5328cc7752c76b2b1dae265a5e886), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_eng.15-08", 0x800006, 0x100000, CRC(65bec279) SHA1(5e99972279ee9ad32e67866fc63799579a10f2dd), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_eng.07-00", 0x800007, 0x100000, CRC(13fa20ad) SHA1(0a04fdea025109c0e604ef2a6d58cfb3adce9bd1), ROM_SKIP(7) )
+ROM_END
+
+ROM_START( freezeatjp )
+ ROM_REGION32_BE( 0x200000, "user1", 0 ) /* 2MB for R3000 code */
+ ROM_LOAD32_BYTE( "prog_jpn.hh", 0x000000, 0x040000, CRC(989302bf) SHA1(232927ec0a52b8bb587a3c206af8e1c6cde67860) )
+ ROM_LOAD32_BYTE( "prog_jpn.hl", 0x000001, 0x040000, CRC(6262b760) SHA1(12ca749f5cdc6db7d19f88a21f5f955b80206784) )
+ ROM_LOAD32_BYTE( "prog_jpn.lh", 0x000002, 0x040000, CRC(c6a12b0c) SHA1(971242b5b09e15164e7c335e684b5043510c6462) )
+ ROM_LOAD32_BYTE( "prog_jpn.ll", 0x000003, 0x040000, CRC(241ea755) SHA1(0db3cfbe577fc78387528390ebb14dbb7a09c97d) )
+
+ ROM_REGION32_BE( 0x1000000, "user2", 0 ) /* 16MB for 64-bit ROM data */
+ ROMX_LOAD( "fish_gr0.63-56", 0x000000, 0x100000, CRC(b61061c5) SHA1(aeb409aa5073232d80ed81b27946e753290234f4), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr0.55-48", 0x000001, 0x100000, CRC(c85acf42) SHA1(c3365caeb126a83a7e7afcda25f05849ceb5c98b), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr0.47-40", 0x000002, 0x100000, CRC(67f78f59) SHA1(40b256a8939fad365c7e896cff4a959fcc70a477), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr0.39-32", 0x000003, 0x100000, CRC(6be0508a) SHA1(20f617278ce1666348822d80686cecd8d9b1bc78), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr0.31-24", 0x000004, 0x100000, CRC(905606e0) SHA1(866cd98ea2399fed96f76b16dce751e2c7cfdc98), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr0.23-16", 0x000005, 0x100000, CRC(cdeef6fa) SHA1(1b4d58951b662040540e7d51f88c1b6f282562ee), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr0.15-08", 0x000006, 0x100000, CRC(ad81f204) SHA1(58584a6c8c6cfb6366eaa10aba8a226e419f5ce9), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr0.07-00", 0x000007, 0x100000, CRC(10ce7254) SHA1(2a88d45dbe78ea8358ecd8522b38d775a2fdb34a), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_jpn.63-56", 0x800000, 0x100000, CRC(78c65a1f) SHA1(1a97737c222809930bde9df7a55e1ff1581a3202), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_jpn.55-48", 0x800001, 0x100000, CRC(9ffac0f1) SHA1(3ba5f8de32a5febb5d3d22f59ccb477834d33934), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_jpn.47-40", 0x800002, 0x100000, CRC(18543fb7) SHA1(4ab9969de9a66d6b7b70cfa5290c1cf7bce54838), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_jpn.39-32", 0x800003, 0x100000, CRC(22578f15) SHA1(4e314b22456ed4e4282406e990207e3b9bdf6203), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_jpn.31-24", 0x800004, 0x100000, CRC(5c41b91b) SHA1(ce354c8a4a3872b009e8af9f75e8f4f0892c7a7e), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_jpn.23-16", 0x800005, 0x100000, CRC(c2462646) SHA1(207d51a2aae076bc78548cf96325e670ea41609c), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_jpn.15-08", 0x800006, 0x100000, CRC(f8d998ec) SHA1(ffce4a16fbb2fff3dc0a29c0cede4dfe6316e97b), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_jpn.07-00", 0x800007, 0x100000, CRC(e7e0daa5) SHA1(108da84cc6b4df7ae88cfdacd27c1728e59cdb81), ROM_SKIP(7) )
+ROM_END
+
+ROM_START( freezeat2 )
+ ROM_REGION32_BE( 0x200000, "user1", 0 ) /* 2MB for R3000 code */
+ ROM_LOAD32_BYTE( "prog.hh", 0x000000, 0x040000, CRC(a8aefa52) SHA1(ba95da93035520de4b15245f68217c59dfb69dbd) )
+ ROM_LOAD32_BYTE( "prog.hl", 0x000001, 0x040000, CRC(152dd641) SHA1(52fa260baf1979ed8f15f8abcbbeebd8e595d0e4) )
+ ROM_LOAD32_BYTE( "prog.lh", 0x000002, 0x040000, CRC(416d26ed) SHA1(11cf3b88415a8a5d0bb8e1df08603a85202186ef) )
+ ROM_LOAD32_BYTE( "prog.ll", 0x000003, 0x040000, CRC(d6a5dbc8) SHA1(0e2176c35cbc59b2a5283366210409d0e930bac7) )
+
+ ROM_REGION32_BE( 0x1000000, "user2", 0 ) /* 16MB for 64-bit ROM data */
+ ROMX_LOAD( "fish_gr0.63-56", 0x000000, 0x100000, CRC(99d0dc75) SHA1(b32126eea70c7584d1c34a6ca33282fbaf4b03aa), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr0.55-48", 0x000001, 0x100000, CRC(2dfdfe62) SHA1(e0554d36ef5cf4b6ce171857ea4f2737f11286a5), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr0.47-40", 0x000002, 0x100000, CRC(722aee2a) SHA1(bc79433131bed5b08453d1b80324a28a552783de), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr0.39-32", 0x000003, 0x100000, CRC(919e31b4) SHA1(3807d4629d8277c780dba888c23d17ba47803f27), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr0.31-24", 0x000004, 0x100000, CRC(a957ac95) SHA1(ddfaca994c06976bee8b123857904e64f40b7f31), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr0.23-16", 0x000005, 0x100000, CRC(a147ec66) SHA1(6291008158d581b81e025ed34ff0950983c12c67), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr0.15-08", 0x000006, 0x100000, CRC(206d2f38) SHA1(6aca89df26d3602ff1da3c23f19e0782439623ff), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr0.07-00", 0x000007, 0x100000, CRC(06559831) SHA1(b2c022457425d7900337cfa2fd1622336c0c0bc5), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr1.63-56", 0x800000, 0x100000, CRC(30c624d2) SHA1(4ced77d1663169d0cb37d6728ec52e67f05064c5), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr1.55-48", 0x800001, 0x100000, CRC(049cd60f) SHA1(8a7615a76b57a4e6ef5d95a5ee6c56086671dbb6), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr1.47-40", 0x800002, 0x100000, CRC(d6aaf3bf) SHA1(1c597bdc0e61fd0941cff5a8a93f24f108bd0daa), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr1.39-32", 0x800003, 0x100000, CRC(7d6ebc69) SHA1(668769297f75f9c367bc5cde26419ed092fc9dd8), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr1.31-24", 0x800004, 0x100000, CRC(6e5fee1f) SHA1(1eca79c8d395f881d0a05f10073998fcae70c3b1), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr1.23-16", 0x800005, 0x100000, CRC(a8b1e9b4) SHA1(066285928e574e656510b90bc212a8d86660bd07), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr1.15-08", 0x800006, 0x100000, CRC(c90080e6) SHA1(a764bdd6b4e9e727f7468a53424a9211ec5fd5a8), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr1.07-00", 0x800007, 0x100000, CRC(1f20c020) SHA1(71b32386dc0444264f2f1e2a81899e0e9260994c), ROM_SKIP(7) )
+ROM_END
+
+ROM_START( freezeat3 )
+ ROM_REGION32_BE( 0x200000, "user1", 0 ) /* 2MB for R3000 code */
+ ROM_LOAD32_BYTE( "prog.hh", 0x000000, 0x040000, CRC(863942e6) SHA1(c7429c8a5c86ff93c64950e201cffca83dd7b7b0) )
+ ROM_LOAD32_BYTE( "prog.hl", 0x000001, 0x040000, CRC(2acc18ef) SHA1(ead02566f7641b1d1066bd2e257b695e5c7e8437) )
+ ROM_LOAD32_BYTE( "prog.lh", 0x000002, 0x040000, CRC(948cf20c) SHA1(86c757aa3c849ef5ba94ed4d5dbf10e833dab6bd) )
+ ROM_LOAD32_BYTE( "prog.ll", 0x000003, 0x040000, CRC(5f44969e) SHA1(32345d7c56a3a890e71f8c71f25414d442b60af8) )
+
+ ROM_REGION32_BE( 0x1000000, "user2", 0 ) /* 16MB for 64-bit ROM data */
+ ROMX_LOAD( "fish_gr0.63-56", 0x000000, 0x100000, CRC(36799449) SHA1(bb706fe7fdc68f840702a127eed7d4519dd45869), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr0.55-48", 0x000001, 0x100000, CRC(23959947) SHA1(a35a6e62c7b2be57d41b1b64be93713cbf897f0a), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr0.47-40", 0x000002, 0x100000, CRC(4657e4e0) SHA1(b6c07182babcb0a106bf4a8f2e3f524371dd882d), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr0.39-32", 0x000003, 0x100000, CRC(b6ea4b64) SHA1(176f94f14307c40b9c611d6f6bc9118e498cdfad), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr0.31-24", 0x000004, 0x100000, CRC(7d4ce71f) SHA1(a1cf5aa9df8dd29c777c10cfdce0925981584261), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr0.23-16", 0x000005, 0x100000, CRC(02db4fd1) SHA1(fce6f31802bf36d6b006f0b212f553bdf21f9374), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr0.15-08", 0x000006, 0x100000, CRC(7d496d6c) SHA1(f82db0621729a00acf4077482e9dfab040ac829b), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr0.07-00", 0x000007, 0x100000, CRC(3aa389d8) SHA1(52502f2f3c91d7c29261f60fe8f489a352399c96), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr1.63-56", 0x800000, 0x100000, CRC(ead678c9) SHA1(f83d467f6685965b6176b10adbd4e35ef808baf3), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr1.55-48", 0x800001, 0x100000, CRC(3591e752) SHA1(df242d2f724edfd78f7191f0ba7a8cde2c09b25f), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr1.47-40", 0x800002, 0x100000, CRC(e29a7a6c) SHA1(0bfb26076b390492eed81d4c4f0852c64fdccfce), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr1.39-32", 0x800003, 0x100000, CRC(e980f957) SHA1(78e8ef07f443ce7991a46005627d5802d36d731c), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr1.31-24", 0x800004, 0x100000, CRC(d90c5221) SHA1(7a330f39f3751d58157f872d92c3c2b91fe60d14), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr1.23-16", 0x800005, 0x100000, CRC(9be0d4de) SHA1(9bb67a1f1db77483e896fed7096c1e23c153ede4), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr1.15-08", 0x800006, 0x100000, CRC(122248af) SHA1(80dd5486106d475bd9f6d78919ebeb176e7becff), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr1.07-00", 0x800007, 0x100000, CRC(5ae08327) SHA1(822d8292793509ebfbfce27e92a74c78c4328bda), ROM_SKIP(7) )
+ROM_END
+
+ROM_START( freezeat4 )
+ ROM_REGION32_BE( 0x200000, "user1", 0 ) /* 2MB for R3000 code */
+ ROM_LOAD32_BYTE( "prog.hh", 0x000000, 0x040000, CRC(80336f5e) SHA1(9946e8eebec2cd68db059f40f535ea212f41913d) )
+ ROM_LOAD32_BYTE( "prog.hl", 0x000001, 0x040000, CRC(55125520) SHA1(13be4fbf32bcd94a2ea97fd690bd1dfdff146d33) )
+ ROM_LOAD32_BYTE( "prog.lh", 0x000002, 0x040000, CRC(9d99c794) SHA1(f443f05a5979db66d61ef4174f0369a1cf4b7793) )
+ ROM_LOAD32_BYTE( "prog.ll", 0x000003, 0x040000, CRC(e03700e0) SHA1(24d41750f02ee7e8fb379e517751b661400aa521) )
+
+ ROM_REGION32_BE( 0x1000000, "user2", 0 ) /* 16MB for 64-bit ROM data */
+ ROMX_LOAD( "fish_gr0.63-56", 0x000000, 0x100000, CRC(36799449) SHA1(bb706fe7fdc68f840702a127eed7d4519dd45869), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr0.55-48", 0x000001, 0x100000, CRC(23959947) SHA1(a35a6e62c7b2be57d41b1b64be93713cbf897f0a), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr0.47-40", 0x000002, 0x100000, CRC(4657e4e0) SHA1(b6c07182babcb0a106bf4a8f2e3f524371dd882d), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr0.39-32", 0x000003, 0x100000, CRC(b6ea4b64) SHA1(176f94f14307c40b9c611d6f6bc9118e498cdfad), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr0.31-24", 0x000004, 0x100000, CRC(7d4ce71f) SHA1(a1cf5aa9df8dd29c777c10cfdce0925981584261), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr0.23-16", 0x000005, 0x100000, CRC(02db4fd1) SHA1(fce6f31802bf36d6b006f0b212f553bdf21f9374), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr0.15-08", 0x000006, 0x100000, CRC(7d496d6c) SHA1(f82db0621729a00acf4077482e9dfab040ac829b), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr0.07-00", 0x000007, 0x100000, CRC(3aa389d8) SHA1(52502f2f3c91d7c29261f60fe8f489a352399c96), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr1.63-56", 0x800000, 0x100000, CRC(c91b6ee4) SHA1(58d2d6b1b9847150b8b3e358842c4a097ef91475), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr1.55-48", 0x800001, 0x100000, CRC(65528e55) SHA1(18020cababed379f77149b7e89e80b294766df31), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr1.47-40", 0x800002, 0x100000, CRC(8fe4187f) SHA1(c9ceec40688617e1251142465d0e608f80a83e40), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr1.39-32", 0x800003, 0x100000, CRC(fdf05a42) SHA1(849e224b68be2fb396ee4cb4729517470af7c282), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr1.31-24", 0x800004, 0x100000, CRC(bb2cd741) SHA1(ac55a54c702d222cb1b9bb480b0f7a71bc315878), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr1.23-16", 0x800005, 0x100000, CRC(ea8c5984) SHA1(eca1619c17dfac154a2024ec49b4b4f9f06a50c9), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr1.15-08", 0x800006, 0x100000, CRC(0b00c816) SHA1(879b0e9d92fe737d740c348dc1cc376c8abfbdb8), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr1.07-00", 0x800007, 0x100000, CRC(a84335c3) SHA1(340f5ddb9bff1ecd469eab8be36cc0ede84f1f5e), ROM_SKIP(7) )
+ROM_END
+
+ROM_START( freezeat5 )
+ ROM_REGION32_BE( 0x200000, "user1", 0 ) /* 2MB for R3000 code */
+ ROM_LOAD32_BYTE( "prog.hh", 0x000000, 0x040000, CRC(95c4fc64) SHA1(cd00efe7f760ef1e4cdc4bc8a3b368427cb15d8a) )
+ ROM_LOAD32_BYTE( "prog.hl", 0x000001, 0x040000, CRC(ffb9cb71) SHA1(35d6a5440d63bc5b94c4447645365039169da368) )
+ ROM_LOAD32_BYTE( "prog.lh", 0x000002, 0x040000, CRC(3ddacd80) SHA1(79f9650531847eefd83908b6ea1e8362688b377c) )
+ ROM_LOAD32_BYTE( "prog.ll", 0x000003, 0x040000, CRC(95ebefb0) SHA1(b88b12adabd7b0902c3a78919bcec8d9a2b04168) )
+
+ ROM_REGION32_BE( 0x1000000, "user2", 0 ) /* 16MB for 64-bit ROM data */
+ ROMX_LOAD( "fish_gr0.63-56", 0x000000, 0x100000, CRC(404a10c3) SHA1(8e353ac7608bd54f0fea610c85166ad14f2faadb), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr0.55-48", 0x000001, 0x100000, CRC(0b262f2f) SHA1(2a963cb5c3344091406d090edfdda498709c6aa6), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr0.47-40", 0x000002, 0x100000, CRC(43f86d26) SHA1(b31d36b11052514b5bcd5bf8e400457ca572c306), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr0.39-32", 0x000003, 0x100000, CRC(5cf0228f) SHA1(7a8c59cf9a7744e9f332db5f661f507323375968), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr0.31-24", 0x000004, 0x100000, CRC(7a24ff98) SHA1(db9e0e8bb417f187267a6e4fc1e66ff060ee4096), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr0.23-16", 0x000005, 0x100000, CRC(ea163c93) SHA1(d07ed26191d36497c56b15774625a49ecb958386), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr0.15-08", 0x000006, 0x100000, CRC(d364534f) SHA1(153908bb8929a898945f768f8bc3d853c6aeaceb), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr0.07-00", 0x000007, 0x100000, CRC(7ba4cb0d) SHA1(16bd487123f499b7080596dc76253081179a0f66), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr1.63-56", 0x800000, 0x100000, CRC(0e1fc4a9) SHA1(a200bb0af5f1e2c3f8d221ae4e9ba55b9dfb8550), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr1.55-48", 0x800001, 0x100000, CRC(b696b875) SHA1(16dc4d5cee3f08360cf19926584419c21d781f45), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr1.47-40", 0x800002, 0x100000, CRC(e78d9302) SHA1(f8b5ed992c433d63677edbeafd3e465b1d42b455), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr1.39-32", 0x800003, 0x100000, CRC(9b50374c) SHA1(d8af3c9d8e0459e24b974cdf2e75c7c39582912f), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr1.31-24", 0x800004, 0x100000, CRC(b6a19b7e) SHA1(5668b27db4dade8efb1524b8ecd1fe78498e8460), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr1.23-16", 0x800005, 0x100000, CRC(ff835b67) SHA1(19da2de1d067069871c33c8b25fd2eac2d03f627), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr1.15-08", 0x800006, 0x100000, CRC(8daf6995) SHA1(2f44031378b5fb1ba1f80a966dbe902316dc6fe8), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr1.07-00", 0x800007, 0x100000, CRC(3676ac70) SHA1(640c4d4f53ca2bcae2009e402fd6ad70e40defa4), ROM_SKIP(7) )
+ROM_END
+
+ROM_START( freezeat6 )
+ ROM_REGION32_BE( 0x200000, "user1", 0 ) /* 2MB for R3000 code */
+ ROM_LOAD32_BYTE( "prog.hh", 0x000000, 0x040000, CRC(120711fe) SHA1(387e3cc8a1a9ea7d65c528387891d09ed9889fe3) )
+ ROM_LOAD32_BYTE( "prog.hl", 0x000001, 0x040000, CRC(18dd292a) SHA1(00e79851140716985f43594142c97e510a06b24a) )
+ ROM_LOAD32_BYTE( "prog.lh", 0x000002, 0x040000, CRC(ce387e72) SHA1(021a274da0b828550a47c3778e1059d4e759693a) )
+ ROM_LOAD32_BYTE( "prog.ll", 0x000003, 0x040000, CRC(9b307b7c) SHA1(71b696802fe7c867525d2626351dcfacedabd696) )
+
+ ROM_REGION32_BE( 0x1000000, "user2", 0 ) /* 16MB for 64-bit ROM data */
+ ROMX_LOAD( "fish_gr0.63-56", 0x000000, 0x100000, CRC(293a3308) SHA1(e4c88759c3b8f8a359db83817dbd0428350b4f7e), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr0.55-48", 0x000001, 0x100000, CRC(18bb4bdf) SHA1(1f6c49b3b5946390fa7582b531f8d9af3baa2567), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr0.47-40", 0x000002, 0x100000, CRC(1faedcc6) SHA1(1e4ecbe4553fb3ebfbd03bd7e16066ccb531d00b), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr0.39-32", 0x000003, 0x100000, CRC(536bc349) SHA1(06d7ac38b2c8cdc85e2cb531bba9c836e50c8247), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr0.31-24", 0x000004, 0x100000, CRC(813d4a31) SHA1(e024f9da2f15a482d8142870baf487297b995ed9), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr0.23-16", 0x000005, 0x100000, CRC(f881514b) SHA1(a694f90621e2c1569a6a5ed8920838ba5506f72e), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr0.15-08", 0x000006, 0x100000, CRC(d7634655) SHA1(d7ac83c0fa5d0ec57d096d4d704fe99ee8160e09), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr0.07-00", 0x000007, 0x100000, CRC(3fca32a3) SHA1(22753a9678e04d9355238e013e58d9f45315579d), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr1.63-56", 0x800000, 0x100000, CRC(a2b89d3a) SHA1(9cfcd0b88dea192ba39efcdccc78d1a0fd8f3388), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr1.55-48", 0x800001, 0x100000, CRC(766822a8) SHA1(2c9b14542a5467c1a3451559ea296da09c2cfdb9), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr1.47-40", 0x800002, 0x100000, CRC(112b519c) SHA1(f0e1ed1b8ad271fa9708f513b11d5cca6e550668), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr1.39-32", 0x800003, 0x100000, CRC(435b5d37) SHA1(ecb6e7271d993f8e315b85e69166838e66dd41a8), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr1.31-24", 0x800004, 0x100000, CRC(2637ae7f) SHA1(5e0bd0e08d8c1eaae725b4d55030c2698abd46e7), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr1.23-16", 0x800005, 0x100000, CRC(e732f1bf) SHA1(a228aee0cc36a0089716f20bfa75d87750692adb), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr1.15-08", 0x800006, 0x100000, CRC(7d4e2d9e) SHA1(4cb9b754b7585df4cae6bdd7085a57729d53e643), ROM_SKIP(7) )
+ ROMX_LOAD( "fish_gr1.07-00", 0x800007, 0x100000, CRC(8ea036af) SHA1(1f9baec6712e0ba0e8a744529e41799217760194), ROM_SKIP(7) )
+ROM_END
+
+
+/*************************************
+ *
+ * Driver initialization
+ *
+ *************************************/
+
+static void cojag_common_init(running_machine &machine, UINT16 gpu_jump_offs, UINT16 spin_pc)
+{
+ cojag_state *state = machine.driver_data<cojag_state>();
+ /* copy over the ROM */
+ state->m_main_cpu = machine.device<cpu_device>("maincpu");
+ cojag_is_r3000 = (state->m_main_cpu->type() == R3041BE);
+
+ /* install synchronization hooks for GPU */
+ if (cojag_is_r3000)
+ machine.device("maincpu")->memory().space(AS_PROGRAM)->install_legacy_write_handler(0x04f0b000 + gpu_jump_offs, 0x04f0b003 + gpu_jump_offs, FUNC(gpu_jump_w));
+ else
+ machine.device("maincpu")->memory().space(AS_PROGRAM)->install_legacy_write_handler(0xf0b000 + gpu_jump_offs, 0xf0b003 + gpu_jump_offs, FUNC(gpu_jump_w));
+ machine.device("gpu")->memory().space(AS_PROGRAM)->install_legacy_read_handler(0xf03000 + gpu_jump_offs, 0xf03003 + gpu_jump_offs, FUNC(gpu_jump_r));
+ state->m_gpu_jump_address = &jaguar_gpu_ram[gpu_jump_offs/4];
+ state->m_gpu_spin_pc = 0xf03000 + spin_pc;
+
+ /* init the sound system and install DSP speedups */
+ cojag_sound_init(machine);
+}
+
+
+static DRIVER_INIT( area51a )
+{
+ cojag_common_init(machine, 0x5c4, 0x5a0);
+
+#if ENABLE_SPEEDUP_HACKS
+ {
+ cojag_state *state = machine.driver_data<cojag_state>();
+
+ /* install speedup for main CPU */
+ state->m_main_speedup = machine.device("maincpu")->memory().space(AS_PROGRAM)->install_legacy_write_handler(0xa02030, 0xa02033, FUNC(area51_main_speedup_w));
+ }
+#endif
+}
+
+
+static DRIVER_INIT( area51 )
+{
+ cojag_common_init(machine, 0x0c0, 0x09e);
+
+#if ENABLE_SPEEDUP_HACKS
+ {
+ cojag_state *state = machine.driver_data<cojag_state>();
+
+ /* install speedup for main CPU */
+ state->m_main_speedup_max_cycles = 120;
+ state->m_main_speedup = machine.device("maincpu")->memory().space(AS_PROGRAM)->install_legacy_read_handler(0x100062e8, 0x100062eb, FUNC(cojagr3k_main_speedup_r));
+ }
+#endif
+}
+
+static DRIVER_INIT( maxforce )
+{
+ cojag_state *state = machine.driver_data<cojag_state>();
+ cojag_common_init(machine, 0x0c0, 0x09e);
+
+ /* patch the protection */
+ state->m_rom_base[0x220/4] = 0x03e00008;
+
+#if ENABLE_SPEEDUP_HACKS
+ /* install speedup for main CPU */
+ state->m_main_speedup_max_cycles = 120;
+ state->m_main_speedup = machine.device("maincpu")->memory().space(AS_PROGRAM)->install_legacy_read_handler(0x1000865c, 0x1000865f, FUNC(cojagr3k_main_speedup_r));
+#endif
+}
+
+
+static DRIVER_INIT( area51mx )
+{
+ cojag_state *state = machine.driver_data<cojag_state>();
+ cojag_common_init(machine, 0x0c0, 0x09e);
+
+ /* patch the protection */
+ state->m_rom_base[0x418/4] = 0x4e754e75;
+
+#if ENABLE_SPEEDUP_HACKS
+ /* install speedup for main CPU */
+ state->m_main_speedup = machine.device("maincpu")->memory().space(AS_PROGRAM)->install_legacy_write_handler(0xa19550, 0xa19557, FUNC(area51mx_main_speedup_w));
+#endif
+}
+
+
+static DRIVER_INIT( a51mxr3k )
+{
+ cojag_state *state = machine.driver_data<cojag_state>();
+ cojag_common_init(machine, 0x0c0, 0x09e);
+
+ /* patch the protection */
+ state->m_rom_base[0x220/4] = 0x03e00008;
+
+#if ENABLE_SPEEDUP_HACKS
+ /* install speedup for main CPU */
+ state->m_main_speedup_max_cycles = 120;
+ state->m_main_speedup = machine.device("maincpu")->memory().space(AS_PROGRAM)->install_legacy_read_handler(0x10006f0c, 0x10006f0f, FUNC(cojagr3k_main_speedup_r));
+#endif
+}
+
+
+static DRIVER_INIT( fishfren )
+{
+ cojag_common_init(machine, 0x578, 0x554);
+
+#if ENABLE_SPEEDUP_HACKS
+ {
+ cojag_state *state = machine.driver_data<cojag_state>();
+
+ /* install speedup for main CPU */
+ state->m_main_speedup_max_cycles = 200;
+ state->m_main_speedup = machine.device("maincpu")->memory().space(AS_PROGRAM)->install_legacy_read_handler(0x10021b60, 0x10021b63, FUNC(cojagr3k_main_speedup_r));
+ }
+#endif
+}
+
+
+static void init_freeze_common(running_machine &machine, offs_t main_speedup_addr)
+{
+ cojag_common_init(machine, 0x0bc, 0x09c);
+
+#if ENABLE_SPEEDUP_HACKS
+ {
+ cojag_state *state = machine.driver_data<cojag_state>();
+
+ /* install speedup for main CPU */
+ state->m_main_speedup_max_cycles = 200;
+ if (main_speedup_addr != 0)
+ state->m_main_speedup = machine.device("maincpu")->memory().space(AS_PROGRAM)->install_legacy_read_handler(main_speedup_addr, main_speedup_addr + 3, FUNC(cojagr3k_main_speedup_r));
+ state->m_main_gpu_wait = machine.device("maincpu")->memory().space(AS_PROGRAM)->install_legacy_read_handler(0x0400d900, 0x0400d900 + 3, FUNC(main_gpu_wait_r));
+ }
+#endif
+}
+
+static DRIVER_INIT( freezeat ) { init_freeze_common(machine, 0x1001a9f4); }
+static DRIVER_INIT( freezeat2 ) { init_freeze_common(machine, 0x1001a8c4); }
+static DRIVER_INIT( freezeat3 ) { init_freeze_common(machine, 0x1001a134); }
+static DRIVER_INIT( freezeat4 ) { init_freeze_common(machine, 0x1001a134); }
+static DRIVER_INIT( freezeat5 ) { init_freeze_common(machine, 0x10019b34); }
+static DRIVER_INIT( freezeat6 ) { init_freeze_common(machine, 0x10019684); }
+
+
+static DRIVER_INIT( vcircle )
+{
+ cojag_common_init(machine, 0x5c0, 0x5a0);
+
+#if ENABLE_SPEEDUP_HACKS
+ {
+ cojag_state *state = machine.driver_data<cojag_state>();
+
+ /* install speedup for main CPU */
+ state->m_main_speedup_max_cycles = 50;
+ state->m_main_speedup = machine.device("maincpu")->memory().space(AS_PROGRAM)->install_legacy_read_handler(0x12005b34, 0x12005b37, FUNC(cojagr3k_main_speedup_r));
+ }
+#endif
+}
+
+
+
+/*************************************
+ *
+ * Game driver(s)
+ *
+ *************************************/
+
+/* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME */
+CONS( 1993, jaguar, 0, 0, jaguar, jaguar, jaguar, "Atari", "Jaguar", GAME_UNEMULATED_PROTECTION | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND | GAME_NOT_WORKING )
+CONS( 1995, jaguarcd, jaguar, 0, jaguar, jaguar, jaguar, "Atari", "Jaguar CD", GAME_UNEMULATED_PROTECTION | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND | GAME_NOT_WORKING )
+
+GAME( 1996, area51, 0, cojagr3k, area51, area51, ROT0, "Atari Games", "Area 51 (R3000)", 0 )
+GAME( 1995, area51t, area51, cojag68k, area51, area51a, ROT0, "Atari Games (Time Warner license)", "Area 51 (Time Warner license)", 0 )
+GAME( 1995, area51a, area51, cojag68k, area51, area51a, ROT0, "Atari Games", "Area 51 (Atari Games license)", 0 )
+GAME( 1995, fishfren, 0, cojagr3k, fishfren, fishfren, ROT0, "Time Warner Interactive", "Fishin' Frenzy (prototype)", 0 )
+GAME( 1996, freezeat, 0, cojagr3k, freezeat, freezeat, ROT0, "Atari Games", "Freeze (Atari) (prototype, English voice, 96/10/25)", 0 )
+GAME( 1996, freezeatjp,freezeat, cojagr3k, freezeat, freezeat, ROT0, "Atari Games", "Freeze (Atari) (prototype, Japanese voice, 96/10/25)", 0 )
+GAME( 1996, freezeat2, freezeat, cojagr3k, freezeat, freezeat2,ROT0, "Atari Games", "Freeze (Atari) (prototype, 96/10/18)", 0 )
+GAME( 1996, freezeat3, freezeat, cojagr3k, freezeat, freezeat3,ROT0, "Atari Games", "Freeze (Atari) (prototype, 96/10/07)", 0 )
+GAME( 1996, freezeat4, freezeat, cojagr3k, freezeat, freezeat4,ROT0, "Atari Games", "Freeze (Atari) (prototype, 96/10/03)", 0 )
+GAME( 1996, freezeat5, freezeat, cojagr3k, freezeat, freezeat5,ROT0, "Atari Games", "Freeze (Atari) (prototype, 96/09/20, AMOA-96)", 0 )
+GAME( 1996, freezeat6, freezeat, cojagr3k, freezeat, freezeat6,ROT0, "Atari Games", "Freeze (Atari) (prototype, 96/09/07, Jamma-96)", 0 )
+GAME( 1996, maxforce, 0, cojagr3k, area51, maxforce, ROT0, "Atari Games", "Maximum Force v1.05", 0 )
+GAME( 1996, maxf_102, maxforce, cojagr3k, area51, maxforce, ROT0, "Atari Games", "Maximum Force v1.02", 0 )
+GAME( 1996, maxf_ng, maxforce, cojagr3k, area51, maxforce, ROT0, "Atari Games", "Maximum Force (No Gore version)", 0 )
+GAME( 1998, area51mx, 0, cojag68k, area51, area51mx, ROT0, "Atari Games", "Area 51 / Maximum Force Duo v2.0", 0 )
+GAME( 1998, a51mxr3k, area51mx, cojagr3k, area51, a51mxr3k, ROT0, "Atari Games", "Area 51 / Maximum Force Duo (R3000)", 0 )
+GAME( 1996, vcircle, 0, cojagr3k, vcircle, vcircle, ROT0, "Atari Games", "Vicious Circle (prototype)", 0 )