summaryrefslogtreecommitdiffstatshomepage
path: root/trunk/src/mame/drivers/dgpix.c
diff options
context:
space:
mode:
Diffstat (limited to 'trunk/src/mame/drivers/dgpix.c')
-rw-r--r--trunk/src/mame/drivers/dgpix.c620
1 files changed, 620 insertions, 0 deletions
diff --git a/trunk/src/mame/drivers/dgpix.c b/trunk/src/mame/drivers/dgpix.c
new file mode 100644
index 00000000000..a62ac083e26
--- /dev/null
+++ b/trunk/src/mame/drivers/dgpix.c
@@ -0,0 +1,620 @@
+/********************************************************************
+
+ "dgPIX" games driver
+
+ Games Supported:
+ ---------------------------------------------------------------------------
+ - X-Files (c) 1999 dgPIX Entertainment Inc.
+ - King of Dynast Gear (version 1.8) (c) 1999 EZ Graphics [*]
+ - Fishing Maniac 3 (c) 2002 Saero Entertainment
+
+ [*] the version number is written in the flash roms at the beginning of the game settings
+
+
+ Games Needed:
+ ---------------------------------------------------------------------------
+ - Elfin (c) 1999 dgPIX Entertainment Inc.
+
+
+ Original bugs:
+ - In King of Dynast Gear, Roger's fast attack shows some blank lines
+ in the sword "shadow" if you do it in the left direction
+
+ Info about the cpu inside KS0164 sound chip:
+ - "The 16-bit CPU core was Sequoia's design and was licensed to Samsung.
+ It was a 16-bit core with a nearly perfectly orthogonal instruction set.
+ You could even multiply the PC by the stack pointer if you wanted."
+
+
+ driver by Pierpaolo Prazzoli & Tomasz Slanina
+
+ - Pierpaolo Prazzoli 2006.05.06
+ - added Fishing Maniac 3
+
+ - Pierpaolo Prazzoli 2006.01.16
+ - added King of Dynast Gear (protection patched by Tomasz)
+ - fixed frame buffer drawing
+ - fixed flash roms reading
+ - added game settings writing to flash roms
+ - added coin counters
+
+ - TS 2005.02.15
+ Added double buffering
+
+ - TS 2005.02.06
+ Preliminary emulation of X-Files. VRender0- is probably just framebuffer.
+ Patch in DRIVER_INIT removes call at RAM adr $8f30 - protection ?
+ (without fix, game freezes int one of startup screens - like on real
+ board with protection PIC removed)
+
+*********************************************************************/
+
+#include "emu.h"
+#include "cpu/e132xs/e132xs.h"
+
+
+class dgpix_state : public driver_device
+{
+public:
+ dgpix_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag) { }
+
+ UINT32 *m_vram;
+ int m_vbuffer;
+ int m_flash_roms;
+ int m_old_vbuf;
+ UINT32 m_flash_cmd;
+ INT32 m_first_offset;
+};
+
+
+static READ32_HANDLER( flash_r )
+{
+ dgpix_state *state = space->machine().driver_data<dgpix_state>();
+ UINT32 *ROM = (UINT32 *)space->machine().region("user1")->base();
+
+ if(offset >= (0x2000000 - state->m_flash_roms * 0x400000) / 4)
+ {
+ if(state->m_flash_cmd == 0x90900000)
+ {
+ //read maker ID and chip ID
+ return 0x00890014;
+ }
+ else if(state->m_flash_cmd == 0x00700000)
+ {
+ //read status
+ return 0x80<<16;
+ }
+ else if(state->m_flash_cmd == 0x70700000)
+ {
+ //read status and ?
+ return 0x82<<16;
+ }
+ else if(state->m_flash_cmd == 0xe8e80000)
+ {
+ //read status ?
+ return 0x80<<16;
+ }
+ }
+
+ return ROM[offset];
+}
+
+static WRITE32_HANDLER( flash_w )
+{
+ dgpix_state *state = space->machine().driver_data<dgpix_state>();
+ if(state->m_flash_cmd == 0x20200000)
+ {
+ // erase game settings
+ if(data == 0xd0d00000)
+ {
+ // point to game settings
+ UINT8 *rom = (UINT8 *)space->machine().region("user1")->base() + offset*4;
+
+ // erase one block
+ memset(rom, 0xff, 0x10000);
+
+ state->m_flash_cmd = 0;
+ }
+ }
+ else if(state->m_flash_cmd == 0x0f0f0000)
+ {
+ if(data == 0xd0d00000 && offset == state->m_first_offset)
+ {
+ // finished
+ state->m_flash_cmd = 0;
+ state->m_first_offset = -1;
+ }
+ else
+ {
+ UINT16 *rom = (UINT16 *)space->machine().region("user1")->base();
+
+ // write game settings
+
+ if(ACCESSING_BITS_0_15)
+ rom[BYTE_XOR_BE(offset*2 + 1)] = data & 0xffff;
+ else
+ rom[BYTE_XOR_BE(offset*2 + 0)] = (data & 0xffff0000) >> 16;
+ }
+ }
+ else
+ {
+ state->m_flash_cmd = data;
+
+ if(state->m_flash_cmd == 0x0f0f0000 && state->m_first_offset == -1)
+ {
+ state->m_first_offset = offset;
+ }
+ }
+}
+
+static WRITE32_HANDLER( vram_w )
+{
+ dgpix_state *state = space->machine().driver_data<dgpix_state>();
+ UINT32 *dest = &state->m_vram[offset+(0x40000/4)*state->m_vbuffer];
+
+ if (mem_mask == 0xffffffff)
+ {
+ if (~data & 0x80000000)
+ *dest = (*dest & 0x0000ffff) | (data & 0xffff0000);
+
+ if (~data & 0x00008000)
+ *dest = (*dest & 0xffff0000) | (data & 0x0000ffff);
+ }
+ else if (((mem_mask == 0xffff0000) && (~data & 0x80000000)) ||
+ ((mem_mask == 0x0000ffff) && (~data & 0x00008000)))
+ COMBINE_DATA(dest);
+}
+
+static READ32_HANDLER( vram_r )
+{
+ dgpix_state *state = space->machine().driver_data<dgpix_state>();
+ return state->m_vram[offset+(0x40000/4)*state->m_vbuffer];
+}
+
+static WRITE32_HANDLER( vbuffer_w )
+{
+ dgpix_state *state = space->machine().driver_data<dgpix_state>();
+ if(state->m_old_vbuf == 3 && (data & 3) == 2)
+ {
+ state->m_vbuffer ^= 1;
+ }
+
+ state->m_old_vbuf = data & 3;
+}
+
+static WRITE32_HANDLER( coin_w )
+{
+ coin_counter_w(space->machine(), 0, data & 1);
+ coin_counter_w(space->machine(), 1, data & 2);
+}
+
+static READ32_HANDLER( vblank_r )
+{
+ /* burn a bunch of cycles because this is polled frequently during busy loops */
+ device_eat_cycles(&space->device(), 100);
+ return input_port_read(space->machine(), "VBLANK");
+}
+
+static ADDRESS_MAP_START( cpu_map, AS_PROGRAM, 32 )
+ AM_RANGE(0x00000000, 0x007fffff) AM_RAM
+ AM_RANGE(0x40000000, 0x4003ffff) AM_READWRITE(vram_r, vram_w)
+ AM_RANGE(0xe0000000, 0xe1ffffff) AM_READWRITE(flash_r, flash_w)
+ AM_RANGE(0xe2000000, 0xe3ffffff) AM_READWRITE(flash_r, flash_w)
+ AM_RANGE(0xffc00000, 0xffffffff) AM_ROM AM_REGION("user1", 0x1c00000)
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( io_map, AS_IO, 32 )
+ AM_RANGE(0x0200, 0x0203) AM_READNOP // used to sync with the protecion PIC? tested bits 0 and 1
+ AM_RANGE(0x0400, 0x0403) AM_READWRITE(vblank_r, vbuffer_w)
+ AM_RANGE(0x0a10, 0x0a13) AM_READ_PORT("INPUTS")
+ AM_RANGE(0x0200, 0x0203) AM_WRITE(coin_w)
+ AM_RANGE(0x0c00, 0x0c03) AM_WRITENOP // writes only: 1, 0, 1 at startup
+ AM_RANGE(0x0c80, 0x0c83) AM_WRITENOP // sound commands / latches
+ AM_RANGE(0x0c80, 0x0c83) AM_READNOP //read at startup -> cmp 0xFE
+ AM_RANGE(0x0c84, 0x0c87) AM_READNOP // sound status, checks bit 0x40 and 0x80
+ADDRESS_MAP_END
+
+
+static NVRAM_HANDLER( flashroms )
+{
+ if (read_or_write)
+ {
+ // point to game settings
+ UINT8 *rom = (UINT8 *)machine.region("user1")->base() + 0x1c00000 + 0x360000;
+ UINT8 tmp[0x40000];
+ int i;
+
+ // save the new settings
+ for( i = 0; i < 0x40000; i++ )
+ tmp[i] = rom[WORD_XOR_BE(i)];
+
+ file->write( tmp, 0x40000 );
+ }
+ else if (file)
+ {
+ // point to game settings
+ UINT8 *rom = (UINT8 *)machine.region("user1")->base() + 0x1c00000 + 0x360000;
+ UINT8 tmp[0x40000];
+ int i;
+
+ file->read( tmp, 0x40000 );
+
+ // overlap the default settings with the saved ones
+ for( i = 0; i < 0x40000; i++ )
+ rom[WORD_XOR_BE(i)] = tmp[i];
+ }
+}
+
+static INPUT_PORTS_START( dgpix )
+ PORT_START("VBLANK")
+ PORT_BIT( 0x00000003, IP_ACTIVE_LOW, IPT_VBLANK ) //value 2 is used by fmaniac3
+ PORT_BIT( 0xfffffffc, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START("INPUTS")
+ PORT_BIT( 0x00000001, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT( 0x00000002, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT( 0x00000004, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT( 0x00000008, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT( 0x00000010, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1)
+ PORT_BIT( 0x00000020, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1)
+ PORT_BIT( 0x00000040, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x00000080, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x00000100, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x00000200, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x00000400, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x00000800, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x00001000, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2)
+ PORT_BIT( 0x00002000, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2)
+ PORT_BIT( 0x00004000, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x00008000, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_SERVICE_NO_TOGGLE( 0x00010000, IP_ACTIVE_LOW )
+ PORT_BIT( 0x00020000, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x00040000, IP_ACTIVE_LOW, IPT_SERVICE1 )
+ PORT_BIT( 0x00080000, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x00100000, IP_ACTIVE_LOW, IPT_COIN1 )
+ PORT_BIT( 0x00200000, IP_ACTIVE_LOW, IPT_COIN2 )
+ PORT_BIT( 0x00400000, IP_ACTIVE_LOW, IPT_START1 )
+ PORT_BIT( 0x00800000, IP_ACTIVE_LOW, IPT_START2 )
+ PORT_BIT( 0xff000000, IP_ACTIVE_LOW, IPT_UNUSED )
+INPUT_PORTS_END
+
+static VIDEO_START( dgpix )
+{
+ dgpix_state *state = machine.driver_data<dgpix_state>();
+ state->m_vram = auto_alloc_array(machine, UINT32, 0x40000*2/4);
+}
+
+static SCREEN_UPDATE( dgpix )
+{
+ dgpix_state *state = screen->machine().driver_data<dgpix_state>();
+ int y;
+
+ for (y = 0; y < 240; y++)
+ {
+ int x;
+ UINT32 *src = &state->m_vram[(state->m_vbuffer ? 0 : 0x10000) | (y << 8)];
+ UINT16 *dest = BITMAP_ADDR16(bitmap, y, 0);
+
+ for (x = 0; x < 320; x += 2)
+ {
+ dest[0] = (*src >> 16) & 0x7fff;
+ dest[1] = (*src >> 0) & 0x7fff;
+
+ src++;
+ dest += 2;
+ }
+ }
+
+ return 0;
+}
+
+static MACHINE_RESET( dgpix )
+{
+ dgpix_state *state = machine.driver_data<dgpix_state>();
+ state->m_vbuffer = 0;
+ state->m_flash_cmd = 0;
+ state->m_first_offset = -1;
+ state->m_old_vbuf = 3;
+}
+
+
+static MACHINE_CONFIG_START( dgpix, dgpix_state )
+ MCFG_CPU_ADD("maincpu", E132XT, 20000000*4) /* 4x internal multiplier */
+ MCFG_CPU_PROGRAM_MAP(cpu_map)
+ MCFG_CPU_IO_MAP(io_map)
+
+/*
+ unknown 16bit sound cpu, embedded inside the KS0164 sound chip
+ running at 16.9MHz
+*/
+
+ MCFG_MACHINE_RESET(dgpix)
+ MCFG_NVRAM_HANDLER(flashroms)
+
+ /* video hardware */
+ MCFG_SCREEN_ADD("screen", RASTER)
+ MCFG_SCREEN_REFRESH_RATE(60)
+ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
+ MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
+ MCFG_SCREEN_SIZE(512, 256)
+ MCFG_SCREEN_VISIBLE_AREA(0, 319, 0, 239)
+ MCFG_SCREEN_UPDATE(dgpix)
+
+ MCFG_PALETTE_INIT(BBBBB_GGGGG_RRRRR)
+ MCFG_PALETTE_LENGTH(32768)
+
+ MCFG_VIDEO_START(dgpix)
+
+ /* sound hardware */
+ // KS0164 sound chip
+MACHINE_CONFIG_END
+
+/*
+
+X-Files
+dgPIX Entertainment Inc. 1999
+
+Contrary to what you might think on first hearing the title, this game
+is like Match It 2 etc. However, the quality of the graphics
+is outstanding, perhaps the most high quality seen in this "type" of game.
+At the end of the level, you are presented with a babe, where you can use
+the joystick and buttons to scroll up and down and zoom in for erm...
+a closer inspection of the 'merchandise' ;-))
+
+
+PCB Layout
+----------
+
+
+VRenderOMinus Rev4
+-------------------------------------------------------
+| |
+| DA1545A C-O-N-N-1 C |
+| O |
+| POT1 T2316162 SEC KS0164 N |
+| POT2 T2316162 N |
+|J 169NDK19: 3 |
+|A 20MHz CONN2 |
+|M KA4558 |
+|M |
+|A SEC KM6161002CJ-12 |
+| E1-32XT |
+| SEC KM6161002CJ-12 |
+| |
+| ST7705C SEC KM6161002CJ-12 |
+| B1 XCS05 |
+| B2 B3 14.31818MHz SEC KM6161002CJ-12 |
+-------------------------------------------------------
+
+
+Notes
+-----
+ST7705C : Reset/Watchdog IC (SOIC8)
+E1-32XT : Hyperstone E1-32XT CPU
+169NDK19 : Xtal, 16.9MHz
+CONN1,CONN2,CONN3: Connectors for small daughterboard containing
+ 3x DA28F320J5 (32M surface mounted SSOP56 Flash ROM)
+XCS05 : XILINX XCS05 PLD
+B1,B2,B3 : Push Buttons for TEST, SERVICE and RESET
+SEC KS0164 : Samsung Electronics KS0164 General Midi compliant 32-voice Wavetable Synthesizer Chip
+ with built-in 16bit CPU and MPU-401 compatibility. (QFP100)
+T2316162 : Main program RAM (SOJ44)
+SEC KM6161002 : Graphics RAM (SOJ44)
+
+*/
+
+ROM_START( xfiles )
+ ROM_REGION32_BE( 0x2000000, "user1", ROMREGION_ERASE00 ) /* Hyperstone CPU Code & Data */
+ /* 0 - 0x17fffff empty space */
+ ROM_LOAD16_WORD_SWAP( "u8.bin", 0x1800000, 0x400000, CRC(3b2c2bc1) SHA1(1c07fb5bd8a8c9b5fb169e6400fef845f3aee7aa) )
+ ROM_LOAD16_WORD_SWAP( "u9.bin", 0x1c00000, 0x400000, CRC(6ecdd1eb) SHA1(e26c9711e589865cc75ec693d382758fa52528b8) )
+
+ ROM_REGION( 0x400000, "cpu1", 0 ) /* sound rom */
+ ROM_LOAD16_WORD_SWAP( "u10.bin", 0x0000000, 0x400000, CRC(f2ef1eb9) SHA1(d033d140fce6716d7d78509aa5387829f0a1404c) )
+
+ ROM_REGION( 0x1000, "cpu2", 0 ) /* PIC */
+ ROM_LOAD( "xfiles_pic", 0x0000, 0x1000, NO_DUMP ) // protected
+ROM_END
+
+/*
+King of Dynast Gear
+EZ Graphics, 1999
+
+This game runs on the same hardware as X-Files.
+
+PCB Layout
+----------
+
+VRenderO Minus Rev5 dgPIX Entertainment Inc. 1999
+|-----------------------------------------------------|
+|TDA1515 C-O-N-N-1 |
+| DA1545A C |
+| O |
+| VOL1 K4E151611 KS0164 N |
+| VOL2 K4E151611 N |
+|J 169NDK19 3 |
+|A 20MHz CONN2 |
+|M KA4558 |
+|M |
+|A KM6161002 |
+| E1-32XT |
+| KM6161002 |
+| |
+| ST7705C KM6161002 |
+| B1 XCS05 |
+| B2 B3 14.31818MHz LED KM6161002 |
+|-----------------------------------------------------|
+Notes:
+ ST7705C - Reset/Watchdog IC (SOIC8)
+ E1-32XT - Hyperstone E1-32XT CPU (QFP144)
+ 169NDK19 - Xtal, 16.9344MHz
+ CONN1,CONN2, - Connectors for joining main board to small sub-board
+ CONN3
+ XCS05 - Xilinx Spartan XCS05 FPGA (QFP100)
+ B1,B2,B3 - Push Buttons for TEST, SERVICE and RESET
+ KS0164 - Samsung Electronics KS0164 General Midi compliant 32-voice Wavetable Synthesizer Chip
+ with built-in 16bit CPU and MPU-401 compatibility. (QFP100)
+ K4E151611 - Samsung K4E151611C-JC60 1M x16Bit CMOS EDO DRAM (SOJ44)
+ KM6161002 - Samsung KM6161002CJ-12 64k x16Bit High-Speed CMOS SRAM (SOJ44)
+
+Sub-Board
+---------
+
+Flash Module Type-A REV2 dgPIX Entertainment Inc. 1999
+|---------------------------------------|
+| C-O-N-N-1 U100 |
+|C FLASH.U3 FLASH.U5|
+|O FLASH.U2 FLASH.U4 |
+|N FLASH.U10 |
+|N |
+|3 FLASH.U7 FLASH.U9|
+| CONN2 FLASH.U6 FLASH.U8 |
+|---------------------------------------|
+Notes:
+ FLASH - Intel DA28F320J5 32M x8 StrataFlash surface-mounted FlashROM (SSOP56)
+ CONN1,CONN2,
+ CONN3 - Connectors for joining small sub-board to main board
+ U100 - A custom programmed PIC (Programmable Interrupt Controller), rebadged as 'dgPIX-PR1' (DIP18)
+
+*/
+
+ROM_START( kdynastg )
+ ROM_REGION32_BE( 0x2000000, "user1", ROMREGION_ERASE00 ) /* Hyperstone CPU Code & Data */
+ /* 0 - 0x0ffffff empty space */
+ ROM_LOAD16_WORD_SWAP( "flash.u6", 0x1000000, 0x400000, CRC(280dd64e) SHA1(0e23b227b1183fb5591c3a849b5a5fe7faa23cc8) )
+ ROM_LOAD16_WORD_SWAP( "flash.u7", 0x1400000, 0x400000, CRC(f9125894) SHA1(abaad31f7a02143ea7029e47e6baf2976365f70c) )
+ ROM_LOAD16_WORD_SWAP( "flash.u8", 0x1800000, 0x400000, CRC(1016b61c) SHA1(eab4934e1f41cc26259e5187a94ceebd45888a94) )
+ ROM_LOAD16_WORD_SWAP( "flash.u9", 0x1c00000, 0x400000, CRC(093d9243) SHA1(2a643acc7144193aaa3606a84b0c67aadb4c543b) )
+
+ ROM_REGION( 0x400000, "cpu1", 0 ) /* sound rom */
+ ROM_LOAD16_WORD_SWAP( "flash.u10", 0x0000000, 0x400000, CRC(3f103cb1) SHA1(2ff9bd73f3005f09d872018b81c915b01d6703f5) )
+
+ ROM_REGION( 0x1000, "cpu2", 0 ) /* PIC */
+ ROM_LOAD( "kdynastg_pic", 0x0000, 0x1000, NO_DUMP ) // protected
+ROM_END
+
+/*
+Fishing Maniac 3
+Saero Entertainment, 2002
+
+This game runs on hardware that is identical to XFiles and King Of Dynast Gear
+but with less ROMs and no PIC.
+
+PCB Layout
+----------
+
+VRenderO Minus Rev4 dgPIX Entertainment Inc. 1999
+|-----------------------------------------------------|
+|TDA1515 C-O-N-N-1 |
+| DA1545A C |
+| O |
+| VOL1 K4E151611 KS0164 N |
+| VOL2 K4E151611 N |
+|J 169NDK19 3 |
+|A 20MHz CONN2 |
+|M KA4558 |
+|M |
+|A KM6161002 |
+| E1-32XT |
+| KM6161002 |
+| |
+| ST7705C KM6161002 |
+| B1 XCS05 |
+| B2 B3 14.31818MHz LED KM6161002 |
+|-----------------------------------------------------|
+Notes:
+ ST7705C - Reset/Watchdog IC (SOIC8)
+ E1-32XT - Hyperstone E1-32XT CPU (QFP144)
+ 169NDK19 - Xtal, 16.9344MHz
+ CONN1,CONN2, - Connectors for joining main board to small sub-board
+ CONN3
+ XCS05 - Xilinx Spartan XCS05 FPGA (QFP100)
+ B1,B2,B3 - Push Buttons for TEST, SERVICE and RESET
+ KS0164 - Samsung Electronics KS0164 General Midi compliant 32-voice Wavetable Synthesizer Chip
+ with built-in 16bit CPU and MPU-401 compatibility. (QFP100)
+ K4E151611 - Samsung K4E151611C-JC60 1M x16 CMOS EDO DRAM (SOJ44)
+ KM6161002 - Samsung KM6161002CJ-12 64k x16 High-Speed CMOS SRAM (SOJ44)
+
+Sub-Board
+---------
+
+Flash Module Type-A REV2 dgPIX Entertainment Inc. 1999
+|---------------------------------------|
+| C-O-N-N-1 U100 |
+|C FLASH.U3 FLASH.U5|
+|O FLASH.U2 FLASH.U4 |
+|N FLASH.U10 |
+|N |
+|3 FLASH.U7 FLASH.U9|
+| CONN2 FLASH.U6 FLASH.U8 |
+|---------------------------------------|
+Notes:
+ FLASH - Intel DA28F320J5 32M x8 StrataFlash surface-mounted FlashROM (SSOP56)
+ Only U8, U9 & U10 are populated
+ CONN1,CONN2,
+ CONN3 - Connectors for joining small sub-board to main board
+ U100 - Empty 18 pin socket
+*/
+
+ROM_START( fmaniac3 )
+ ROM_REGION32_BE( 0x2000000, "user1", ROMREGION_ERASE00 ) /* Hyperstone CPU Code & Data */
+ /* 0 - 0x17fffff empty space */
+ ROM_LOAD16_WORD_SWAP( "flash.u8", 0x1800000, 0x400000, CRC(dc08a224) SHA1(4d14145eb84ad13674296f81e90b9d60403fa0de) )
+ ROM_LOAD16_WORD_SWAP( "flash.u9", 0x1c00000, 0x400000, CRC(c1fee95f) SHA1(0ed5ed9fa18e7da9242a6df2c210c46de25a2281) )
+
+ ROM_REGION( 0x400000, "cpu1", 0 ) /* sound rom */
+ ROM_LOAD16_WORD_SWAP( "flash.u10", 0x000000, 0x400000, CRC(dfeb91a0) SHA1(a4a79073c3f6135957ea8a4a66a9c71a3a39893c) )
+
+ ROM_REGION( 0x1000, "cpu2", ROMREGION_ERASEFF ) /* PIC */
+ // not present
+ROM_END
+
+static DRIVER_INIT( xfiles )
+{
+ dgpix_state *state = machine.driver_data<dgpix_state>();
+ UINT8 *rom = (UINT8 *)machine.region("user1")->base() + 0x1c00000;
+
+ rom[BYTE4_XOR_BE(0x3aa92e)] = 3;
+ rom[BYTE4_XOR_BE(0x3aa92f)] = 0;
+ rom[BYTE4_XOR_BE(0x3aa930)] = 3;
+ rom[BYTE4_XOR_BE(0x3aa931)] = 0;
+ rom[BYTE4_XOR_BE(0x3aa932)] = 3;
+ rom[BYTE4_XOR_BE(0x3aa933)] = 0;
+
+// protection related ?
+// machine.device("maincpu")->memory().space(AS_PROGRAM)->nop_read(0xf0c8b440, 0xf0c8b447);
+
+ state->m_flash_roms = 2;
+}
+
+static DRIVER_INIT( kdynastg )
+{
+ dgpix_state *state = machine.driver_data<dgpix_state>();
+ UINT8 *rom = (UINT8 *)machine.region("user1")->base() + 0x1c00000;
+
+ rom[BYTE4_XOR_BE(0x3aaa10)] = 3; // 129f0 - nopped call
+ rom[BYTE4_XOR_BE(0x3aaa11)] = 0;
+ rom[BYTE4_XOR_BE(0x3aaa12)] = 3;
+ rom[BYTE4_XOR_BE(0x3aaa13)] = 0;
+ rom[BYTE4_XOR_BE(0x3aaa14)] = 3;
+ rom[BYTE4_XOR_BE(0x3aaa15)] = 0;
+
+ rom[BYTE4_XOR_BE(0x3a45c8)] = 5; // c5a8 - added ret
+ rom[BYTE4_XOR_BE(0x3a45c9)] = 0;
+
+// protection related ?
+// machine.device("maincpu")->memory().space(AS_PROGRAM)->nop_read(0x12341234, 0x12341243);
+
+ state->m_flash_roms = 4;
+}
+
+static DRIVER_INIT( fmaniac3 )
+{
+ dgpix_state *state = machine.driver_data<dgpix_state>();
+ state->m_flash_roms = 2;
+}
+
+GAME( 1999, xfiles, 0, dgpix, dgpix, xfiles, ROT0, "dgPIX Entertainment Inc.", "X-Files", GAME_NO_SOUND )
+GAME( 1999, kdynastg, 0, dgpix, dgpix, kdynastg, ROT0, "EZ Graphics", "King of Dynast Gear (version 1.8)", GAME_NO_SOUND )
+GAME( 2002, fmaniac3, 0, dgpix, dgpix, fmaniac3, ROT0, "Saero Entertainment", "Fishing Maniac 3", GAME_NO_SOUND )