summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
author Angelo Salese <angelosa@users.noreply.github.com>2011-04-24 22:15:07 +0000
committer Angelo Salese <angelosa@users.noreply.github.com>2011-04-24 22:15:07 +0000
commitfed08e39f73ff6f29e68caf5d606c51122997d47 (patch)
treed8e73d7c3b4675a7ca74ebb9d1ad936e940dec25 /src
parent259d8afd62bb835c79f70ec9967d7f7bab3bdc7d (diff)
Haze: Merged CoJag and Jaguar (MESS side) drivers, nw
Diffstat (limited to 'src')
-rw-r--r--src/mame/drivers/jaguar.c (renamed from src/mame/drivers/cojag.c)787
-rw-r--r--src/mame/mame.mak2
-rw-r--r--src/mame/video/jaguar.c8
3 files changed, 780 insertions, 17 deletions
diff --git a/src/mame/drivers/cojag.c b/src/mame/drivers/jaguar.c
index ed605aaa942..c6e47ce6a54 100644
--- a/src/mame/drivers/cojag.c
+++ b/src/mame/drivers/jaguar.c
@@ -1,10 +1,14 @@
/***************************************************************************
- Atari CoJag hardware
+ 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
- Games supported:
+ CoJag Games supported:
* Area 51 (3 Sets)
* Maximum Force (2 Sets)
* Area 51/Maximum Force Duo (2 Sets)
@@ -13,7 +17,15 @@
* Freeze
To do:
- * map out unused RAM per-game via memory_nop_read/write
+ * (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)
@@ -285,6 +297,36 @@ Notes:
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.
+
***************************************************************************/
@@ -296,12 +338,20 @@ Notes:
#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
{
@@ -338,7 +388,9 @@ 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;
@@ -348,8 +400,20 @@ UINT8 cojag_is_r3000;
*
*************************************/
-
-
+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;
+}
@@ -397,6 +461,154 @@ static MACHINE_RESET( cojag )
/* 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 )
+{
+ device_t *eeprom = space->machine().device("eeprom");
+ eeprom_bit_count++;
+ if (eeprom_bit_count != 9) /* kill extra bit at end of address */
+ {
+ eeprom_write_bit(eeprom,data >> 31);
+ eeprom_set_clock_line(eeprom,PULSE_LINE);
+ }
+}
+
+static READ32_HANDLER( jaguar_eeprom_clk )
+{
+ device_t *eeprom = space->machine().device("eeprom");
+ eeprom_set_clock_line(eeprom,PULSE_LINE); /* get next bit when reading */
+ return 0;
+}
+
+static READ32_HANDLER( jaguar_eeprom_cs )
+{
+ device_t *eeprom = space->machine().device("eeprom");
+ eeprom_set_cs_line(eeprom,ASSERT_LINE); /* must do at end of an operation */
+ eeprom_set_cs_line(eeprom,CLEAR_LINE); /* enable chip for next operation */
+ eeprom_write_bit(eeprom,1); /* write a start bit */
+ eeprom_set_clock_line(eeprom,PULSE_LINE);
+ eeprom_bit_count = 0;
+ return 0;
}
@@ -456,21 +668,35 @@ static WRITE32_HANDLER( misc_control_w )
}
-
/*************************************
*
* 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 )
{
- return jaguargpu_ctrl_r(space->machine().device("gpu"), offset);
+ 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);
}
@@ -500,6 +726,106 @@ static READ32_HANDLER( jaguar_wave_rom_r )
}
+/*************************************
+ *
+ * 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 |= eeprom_read_bit(space->machine().device("eeprom"));
+ 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);
+}
+
/*************************************
*
@@ -799,6 +1125,85 @@ static WRITE32_HANDLER( area51mx_main_speedup_w )
+
+
+
+/*************************************
+ *
+ * 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
@@ -899,7 +1304,43 @@ static ADDRESS_MAP_START( dsp_map, AS_PROGRAM, 32 )
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
/*************************************
*
@@ -1100,6 +1541,105 @@ static INPUT_PORTS_START( vcircle )
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
/*************************************
*
@@ -1178,6 +1718,213 @@ static MACHINE_CONFIG_DERIVED( cojag68k, cojagr3k )
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;
+}
/*************************************
*
@@ -1189,6 +1936,26 @@ MACHINE_CONFIG_END
*
*************************************/
+/* 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
@@ -1674,6 +2441,10 @@ static DRIVER_INIT( vcircle )
*
*************************************/
+/* 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 )
diff --git a/src/mame/mame.mak b/src/mame/mame.mak
index df436fa8c44..7a71a0acd4b 100644
--- a/src/mame/mame.mak
+++ b/src/mame/mame.mak
@@ -416,7 +416,6 @@ $(MAMEOBJ)/atari.a: \
$(DRIVERS)/cloak.o $(VIDEO)/cloak.o \
$(DRIVERS)/cloud9.o $(VIDEO)/cloud9.o \
$(DRIVERS)/cmmb.o \
- $(DRIVERS)/cojag.o $(AUDIO)/jaguar.o $(VIDEO)/jaguar.o \
$(DRIVERS)/copsnrob.o $(AUDIO)/copsnrob.o $(VIDEO)/copsnrob.o \
$(DRIVERS)/cyberbal.o $(AUDIO)/cyberbal.o $(VIDEO)/cyberbal.o \
$(DRIVERS)/destroyr.o \
@@ -429,6 +428,7 @@ $(MAMEOBJ)/atari.a: \
$(DRIVERS)/gauntlet.o $(VIDEO)/gauntlet.o \
$(DRIVERS)/harddriv.o $(MACHINE)/harddriv.o $(AUDIO)/harddriv.o $(VIDEO)/harddriv.o \
$(DRIVERS)/irobot.o $(MACHINE)/irobot.o $(VIDEO)/irobot.o \
+ $(DRIVERS)/jaguar.o $(AUDIO)/jaguar.o $(VIDEO)/jaguar.o \
$(DRIVERS)/jedi.o $(AUDIO)/jedi.o $(VIDEO)/jedi.o \
$(DRIVERS)/klax.o $(VIDEO)/klax.o \
$(DRIVERS)/liberatr.o $(VIDEO)/liberatr.o \
diff --git a/src/mame/video/jaguar.c b/src/mame/video/jaguar.c
index 4695800c246..0e54d9d0815 100644
--- a/src/mame/video/jaguar.c
+++ b/src/mame/video/jaguar.c
@@ -221,12 +221,9 @@ static void blitter_09800009_000020_000020(running_machine &machine, UINT32 comm
static void blitter_01800009_000028_000028(running_machine &machine, UINT32 command, UINT32 a1flags, UINT32 a2flags);
static void blitter_01800001_000018_000018(running_machine &machine, UINT32 command, UINT32 a1flags, UINT32 a2flags);
static void blitter_01c00001_000018_000018(running_machine &machine, UINT32 command, UINT32 a1flags, UINT32 a2flags);
-
-#ifdef MESS
static void blitter_00010000_xxxxxx_xxxxxx(running_machine &machine, UINT32 command, UINT32 a1flags, UINT32 a2flags);
static void blitter_01800001_xxxxxx_xxxxxx(running_machine &machine, UINT32 command, UINT32 a1flags, UINT32 a2flags);
static void blitter_x1800x01_xxxxxx_xxxxxx(running_machine &machine, UINT32 command, UINT32 a1flags, UINT32 a2flags);
-#endif
@@ -545,7 +542,6 @@ static void blitter_run(running_machine &machine)
}
}
-#ifdef MESS
if (command == 0x00010000)
{
blitter_00010000_xxxxxx_xxxxxx(machine, blitter_regs[B_CMD], blitter_regs[A1_FLAGS], blitter_regs[A2_FLAGS]);
@@ -563,8 +559,6 @@ static void blitter_run(running_machine &machine)
blitter_x1800x01_xxxxxx_xxxxxx(machine, blitter_regs[B_CMD], blitter_regs[A1_FLAGS], blitter_regs[A2_FLAGS]);
return;
}
-#endif
-
if (LOG_BLITTER_STATS)
{
@@ -1028,7 +1022,6 @@ SCREEN_UPDATE( cojag )
#undef COMMAND
#undef FUNCNAME
-#ifdef MESS
#define FUNCNAME blitter_00010000_xxxxxx_xxxxxx
#define COMMAND 0x00010000
@@ -1060,4 +1053,3 @@ SCREEN_UPDATE( cojag )
#undef COMMAND
#undef FUNCNAME
-#endif /* MESS */