summaryrefslogtreecommitdiffstatshomepage
path: root/trunk/src/mame/drivers/expro02.c
diff options
context:
space:
mode:
Diffstat (limited to 'trunk/src/mame/drivers/expro02.c')
-rw-r--r--trunk/src/mame/drivers/expro02.c792
1 files changed, 792 insertions, 0 deletions
diff --git a/trunk/src/mame/drivers/expro02.c b/trunk/src/mame/drivers/expro02.c
new file mode 100644
index 00000000000..3ab0e9c11d6
--- /dev/null
+++ b/trunk/src/mame/drivers/expro02.c
@@ -0,0 +1,792 @@
+/*
+
+ Kaneko EXPRO-02 board
+
+ Used by the newer revisions of Gals Panic
+
+ Notes:
+ - In gfx data banking function, some strange gfx are shown. Timing issue?
+
+ TODO:
+ - irq sources are unknown at current time
+
+
+Gals Panic
+Kaneko, 1990
+
+PCB Layout
+----------
+
+EXPRO-02
+|-------------------------------------------------------------------------|
+| M6295 PM007E.U47 12MHz PM000E.U74 PM004E.U86 |
+| VOL PM008E.U46 16MHz 62256 PM002E.U76 PM109U_U88-01.U88|
+|LA4460 |
+| PAL PAL PAL |
+| PAL PAL PAL PM001E.U73 PM005E.U85 |
+| PAL 62256 PM003E.U75 PM110U_U87-01.U87|
+| |--------------------| |
+| | 68000 | |
+| | | 41464 |
+| |--------------------| 41464 PM017E.U84 |
+| GP-U27 PAL 41464 |---------| |
+|J PAL GP-U41 41464 |KANEKO | |
+|A MC-8282 PAL 41464 |VU-002 | PM006E.U83 PM018E.U94 |
+|M 6116 41464 | | |
+|M | | PM019U_U93-01.U93|
+|A 6116 |---------| PM206E.U82 |
+| HM53461 |
+| PAL HM53461 PAL |-------| CALC1-CHIP |
+| HM53461 PAL |KANEKO | PM016E.U92 |
+| PAL HM53461 PAL |VIEW2- | 6264 |
+| HM53461 PAL | CHIP| PM015E.U91 |
+| PAL HM53461 PAL |-------| 6264 |
+|DSW2 6116 PAL PAL PM014E.U90 |
+| PAL PAL |
+|DSW1 6116 PAL PM013E.U89 |
+|-------------------------------------------------------------------------|
+
+ Notes
+ -----
+ GP-U27/U41 - These are DIP40 chips, but are not MCUs because there is no stable
+ clock input on any of the pins of these chips. They're not ROMs either
+ because the pinout doesn't match any known EPROMs.
+ There are no markings on the chips other than 'GP-U27' & 'GP-U41'
+ If GP-U41 is removed, on bootup the PCB gives an error 'BG ERROR' and
+ a memory address. If GP-U27 is removed, the PCB works but there are no
+ background graphics.
+
+ 68000 clock - 12.0MHz
+ CALC1-CHIP clock - 16.0MHz
+ GP-U41 clocks - pins 21 & 22 - 12.0MHz, pins 1 & 2 - 6.0MHz, pins 8 & 9 - 15.6249kHz (HSync?)
+ GP-U27 clock - none (so it's not an MCU)
+
+ (TODO: which is correct?)
+ OKI M6295 clock - 2.0MHz (12/6). pin7 = low
+ OKI M6295 clock - 2.000 MHz [16/8]. Sample rate 2000000/165
+
+ VSync - 60Hz
+ HSync - 15.68kHz
+ MC-8282 - Kaneko custom I/O JAMMA ceramic module
+ 41464 - 64k x4 DRAM
+ HM53461 - 64k x4 Multiport CMOS VRAM
+ 6116 - 2k x8 SRAM
+ 6264 - 8k x8 SRAM
+ 62256 - 32k x8 SRAM
+
+**************************************************************************************************
+
+Gals Panic (Japan)
+(C)1990 Kaneko
+
+EXPRO-02 PCB
+M6100575A GALS PANIC (PCB manufactured by Taito)
+
+CPU: MC68000
+Sound: M6295
+OSC: 12.0000MHz, 16.0000MHz
+Custom: VU-002, VIEW2, CACL1
+
+ROMs:
+PM109J.U88 (OKI M271000ZB) - Main programs
+PM110J.U87 (OKI M271000ZB)
+PM004E.U86
+PM005E.U85
+PM-002E.U76
+PM-003E.U75
+PM-000E.U74
+PM-001E.U73
+
+PM006E.U83 - Sprites
+PM206E.U82
+PM018E.U94
+
+PM-013E.U89 (40pin mask)
+PM-014E.U90
+PM-015E.U91
+PM-016E.U92
+
+GP-U41.U41 (40pin mask?)
+GP-U27.U27
+
+
+PAL/GALs:
+U10 (18CV8)
+U11 (18CV8)
+U12 (18CV8)
+U15 (22CV10)
+GP-U28 (16V8)
+U29 (18CV8)
+U32 (18CV8)
+U33 (18CV8)
+U34 (18CV8)
+U35 (18CV8)
+U36 (22CV10)
+U37 (22CV10)
+U38 (18CV8)
+U42 (18CV8)
+GP-U44 (16V8)
+U45 (18CV8)
+U48 (18CV8)
+GP-U57 (16V8)
+GP-U58 (16V8)
+GP-U60 (16V8)
+U77 (22CV10)
+U78 (22CV10)
+
+------------- Comad games ------------------
+
+The Comad games are clearly derived from this version of the game, not
+the one in galspanic.c. Fantasia even still has the encrypted tile
+roms and makes use of the extra layer. The other games write to the
+RAM for this layer, but don't have any roms.
+
+the layer is misplaced however, different scroll regs?
+
+
+
+*/
+
+#include "emu.h"
+#include "cpu/m68000/m68000.h"
+#include "includes/kaneko16.h"
+#include "sound/okim6295.h"
+
+
+class expro02_state : public kaneko16_state
+{
+public:
+ expro02_state(const machine_config &mconfig, device_type type, const char *tag)
+ : kaneko16_state(mconfig, type, tag) { }
+
+ UINT16 m_vram_0_bank_num;
+ UINT16 m_vram_1_bank_num;
+ //UINT8 *m_spriteram;
+ //size_t m_spriteram_size;
+};
+
+
+/*************************************
+ *
+ * Game-specific port definitions
+ *
+ *************************************/
+
+static INPUT_PORTS_START( galsnew )
+
+ PORT_START("DSW1")
+ PORT_DIPNAME( 0x0003, 0x0003, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SWA:1,2")
+ PORT_DIPSETTING( 0x0002, DEF_STR( Easy ) )
+ PORT_DIPSETTING( 0x0003, DEF_STR( Normal ) )
+ PORT_DIPSETTING( 0x0001, DEF_STR( Hard ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Hardest ) )
+ PORT_DIPNAME( 0x000C, 0x000C, DEF_STR( Lives ) ) PORT_DIPLOCATION("SWA:3,4")
+ PORT_DIPSETTING( 0x0004, "2" )
+ PORT_DIPSETTING( 0x000C, "3" )
+ PORT_DIPSETTING( 0x0008, "4" )
+ PORT_DIPSETTING( 0x0000, "5" )
+ PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SWA:5")
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0010, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0020, 0x0020, "Use Button" ) PORT_DIPLOCATION("SWA:6")
+ PORT_DIPSETTING( 0x0000, DEF_STR( No ) )
+ PORT_DIPSETTING( 0x0020, DEF_STR( Yes ) )
+ PORT_DIPNAME( 0x0040, 0x0040, "Censored Girls" ) PORT_DIPLOCATION("SWA:7")
+ PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0080, 0x0080, "Show Ending Picture" ) PORT_DIPLOCATION("SWA:8")
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0080, DEF_STR( On ) )
+
+ PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_4WAY PORT_PLAYER(1)
+ PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_4WAY PORT_PLAYER(1)
+ PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_4WAY PORT_PLAYER(1)
+ PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_4WAY PORT_PLAYER(1)
+ PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1)
+ PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) /* "Shot2" in "test mode" */
+ PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START("DSW2")
+ PORT_DIPUNUSED_DIPLOC( 0x0001, 0x0001, "SWB:1" )
+ PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SWB:2")
+ PORT_DIPSETTING( 0x0002, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_SERVICE_DIPLOC( 0x0004, IP_ACTIVE_LOW, "SWB:3" )
+ PORT_DIPNAME( 0x0038, 0x0038, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SWB:4,5,6")
+ PORT_DIPSETTING( 0x0028, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING( 0x0038, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x0018, DEF_STR( 1C_2C ) )
+ PORT_DIPSETTING( 0x0010, DEF_STR( 1C_3C ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( 1C_4C ) )
+ PORT_DIPSETTING( 0x0008, DEF_STR( 1C_6C ) )
+ PORT_DIPNAME( 0x00c0, 0x00c0, DEF_STR( Coin_B ) ) PORT_DIPLOCATION("SWB:7,8")
+ PORT_DIPSETTING( 0x0080, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING( 0x00c0, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x0040, DEF_STR( 1C_2C ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( 1C_6C ) )
+
+
+ PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_4WAY PORT_PLAYER(2)
+ PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_4WAY PORT_PLAYER(2)
+ PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_4WAY PORT_PLAYER(2)
+ PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_4WAY PORT_PLAYER(2)
+ PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2)
+ PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) /* "Shot2" in "test mode" */
+ PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START("DSW3")
+ PORT_BIT( 0x00ff, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_START1 )
+ PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_START2 )
+ PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_COIN1 )
+ PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_COIN2 )
+ PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_TILT )
+ PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_SERVICE1 )
+ PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_UNKNOWN )
+INPUT_PORTS_END
+
+
+static INPUT_PORTS_START( galsnewa )
+ PORT_INCLUDE( galsnew )
+
+ PORT_MODIFY("DSW1")
+ PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SWA:3")
+ PORT_DIPSETTING( 0x0004, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SWA:4")
+ PORT_DIPSETTING( 0x0008, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0030, 0x0030, DEF_STR( Lives ) ) PORT_DIPLOCATION("SWA:5,6")
+ PORT_DIPSETTING( 0x0010, "2" )
+ PORT_DIPSETTING( 0x0030, "3" )
+ PORT_DIPSETTING( 0x0020, "4" )
+ PORT_DIPSETTING( 0x0000, "5" )
+ PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SWA:7")
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0040, DEF_STR( On ) )
+INPUT_PORTS_END
+
+
+static INPUT_PORTS_START( galsnewj )
+ PORT_INCLUDE( galsnewa )
+
+ PORT_MODIFY("DSW1")
+ PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SWA:8")
+ PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+
+ PORT_MODIFY("DSW2")
+ PORT_DIPUNUSED_DIPLOC( 0x0008, 0x0008, "SWB:4" )
+ PORT_DIPNAME( 0x0030, 0x0030, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SWB:5,6")
+ PORT_DIPSETTING( 0x0010, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING( 0x0030, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( 2C_3C ) )
+ PORT_DIPSETTING( 0x0020, DEF_STR( 1C_2C ) )
+ PORT_DIPNAME( 0x00c0, 0x00c0, DEF_STR( Coin_B ) ) PORT_DIPLOCATION("SWB:7,8")
+ PORT_DIPSETTING( 0x0040, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING( 0x00c0, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( 2C_3C ) )
+ PORT_DIPSETTING( 0x0080, DEF_STR( 1C_2C ) )
+INPUT_PORTS_END
+
+
+static INPUT_PORTS_START( fantasia )
+ PORT_INCLUDE( galsnewa )
+
+ PORT_MODIFY("DSW1")
+ PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SWA:8")
+ PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+INPUT_PORTS_END
+
+/*************************************
+ *
+ * Sound handlers
+ *
+ *************************************/
+
+static WRITE16_HANDLER( galsnew_6295_bankswitch_w )
+{
+ if (ACCESSING_BITS_8_15)
+ {
+ UINT8 *rom = space->machine().region("oki")->base();
+ memcpy(&rom[0x30000],&rom[0x40000 + ((data >> 8) & 0x0f) * 0x10000],0x10000);
+ }
+}
+
+/*************************************
+ *
+ * Video handlers
+ *
+ *************************************/
+
+static WRITE16_HANDLER( galsnew_paletteram_w )
+{
+ data = COMBINE_DATA(&space->machine().generic.paletteram.u16[offset]);
+ palette_set_color_rgb(space->machine(),offset,pal5bit(data >> 6),pal5bit(data >> 11),pal5bit(data >> 1));
+}
+
+
+static WRITE16_HANDLER(galsnew_vram_0_bank_w)
+{
+ expro02_state *state = space->machine().driver_data<expro02_state>();
+ int i;
+ if(state->m_vram_0_bank_num != data)
+ {
+ for(i = 0; i < 0x1000 / 2; i += 2)
+ {
+ if(state->m_vram[0][i])
+ {
+ kaneko16_vram_0_w(space, i+1, data << 8, 0xFF00);
+ }
+ }
+ state->m_vram_0_bank_num = data;
+ }
+}
+
+static WRITE16_HANDLER(galsnew_vram_1_bank_w)
+{
+ expro02_state *state = space->machine().driver_data<expro02_state>();
+ int i;
+ if(state->m_vram_1_bank_num != data)
+ {
+ for(i = 0; i < 0x1000 / 2; i += 2)
+ {
+ if(state->m_vram[1][i])
+ {
+ kaneko16_vram_1_w(space, i+1, data << 8, 0xFF00);
+ }
+ }
+ state->m_vram_1_bank_num = data;
+ }
+}
+
+/*************************************
+ *
+ * CPU memory handlers
+ *
+ *************************************/
+
+static ADDRESS_MAP_START( galsnew_map, AS_PROGRAM, 16 )
+ AM_RANGE(0x000000, 0x03ffff) AM_ROM // main program
+ AM_RANGE(0x080000, 0x0fffff) AM_ROM AM_REGION("user2",0) // other data
+ AM_RANGE(0x100000, 0x3fffff) AM_ROM AM_REGION("user1",0) // main data
+ AM_RANGE(0x400000, 0x400001) AM_DEVREADWRITE8_MODERN("oki", okim6295_device, read, write, 0x00ff)
+
+
+ AM_RANGE(0x500000, 0x51ffff) AM_RAM AM_BASE_MEMBER(expro02_state, m_galsnew_bg_pixram)
+ AM_RANGE(0x520000, 0x53ffff) AM_RAM AM_BASE_MEMBER(expro02_state, m_galsnew_fg_pixram)
+
+ AM_RANGE(0x580000, 0x580fff) AM_RAM_WRITE(kaneko16_vram_1_w) AM_BASE_MEMBER(expro02_state, m_vram[1]) // Layers 0
+ AM_RANGE(0x581000, 0x581fff) AM_RAM_WRITE(kaneko16_vram_0_w) AM_BASE_MEMBER(expro02_state, m_vram[0]) //
+ AM_RANGE(0x582000, 0x582fff) AM_RAM AM_BASE_MEMBER(expro02_state, m_vscroll[1]) //
+ AM_RANGE(0x583000, 0x583fff) AM_RAM AM_BASE_MEMBER(expro02_state, m_vscroll[0]) //
+
+ AM_RANGE(0x600000, 0x600fff) AM_RAM_WRITE(galsnew_paletteram_w) AM_BASE_GENERIC(paletteram) // palette?
+
+ AM_RANGE(0x680000, 0x68001f) AM_RAM_WRITE(kaneko16_layers_0_regs_w) AM_BASE_MEMBER(expro02_state, m_layers_0_regs) // sprite regs? tileregs?
+
+ AM_RANGE(0x700000, 0x700fff) AM_RAM AM_BASE_SIZE_GENERIC(spriteram) // sprites? 0x72f words tested
+
+ AM_RANGE(0x780000, 0x78001f) AM_RAM_WRITE(kaneko16_sprites_regs_w) AM_BASE_MEMBER(expro02_state, m_sprites_regs) // sprite regs? tileregs?
+
+ AM_RANGE(0x800000, 0x800001) AM_READ_PORT("DSW1")
+ AM_RANGE(0x800002, 0x800003) AM_READ_PORT("DSW2")
+ AM_RANGE(0x800004, 0x800005) AM_READ_PORT("DSW3")
+
+ AM_RANGE(0x900000, 0x900001) AM_WRITE(galsnew_6295_bankswitch_w)
+
+ AM_RANGE(0xa00000, 0xa00001) AM_WRITENOP /* ??? */
+
+ AM_RANGE(0xc80000, 0xc8ffff) AM_RAM
+
+ AM_RANGE(0xd80000, 0xd80001) AM_WRITE(galsnew_vram_1_bank_w) /* ??? */
+
+ AM_RANGE(0xe00000, 0xe00015) AM_READWRITE(galpanib_calc_r,galpanib_calc_w) /* CALC1 MCU interaction (simulated) */
+
+ AM_RANGE(0xe80000, 0xe80001) AM_WRITE(galsnew_vram_0_bank_w) /* ??? */
+ADDRESS_MAP_END
+
+
+// bigger rom space, OKI commands moved
+// no CALC mcu
+static ADDRESS_MAP_START( fantasia_map, AS_PROGRAM, 16 )
+ AM_RANGE(0x000000, 0x4fffff) AM_ROM
+ AM_RANGE(0x500000, 0x51ffff) AM_RAM AM_BASE_MEMBER(expro02_state, m_galsnew_bg_pixram)
+ AM_RANGE(0x520000, 0x53ffff) AM_RAM AM_BASE_MEMBER(expro02_state, m_galsnew_fg_pixram)
+ AM_RANGE(0x580000, 0x580fff) AM_RAM_WRITE(kaneko16_vram_1_w) AM_BASE_MEMBER(expro02_state, m_vram[1]) // Layers 0
+ AM_RANGE(0x581000, 0x581fff) AM_RAM_WRITE(kaneko16_vram_0_w) AM_BASE_MEMBER(expro02_state, m_vram[0]) //
+ AM_RANGE(0x582000, 0x582fff) AM_RAM AM_BASE_MEMBER(expro02_state, m_vscroll[1]) //
+ AM_RANGE(0x583000, 0x583fff) AM_RAM AM_BASE_MEMBER(expro02_state, m_vscroll[0]) //
+ AM_RANGE(0x600000, 0x600fff) AM_RAM_WRITE(galsnew_paletteram_w) AM_BASE_GENERIC(paletteram) // palette?
+ AM_RANGE(0x680000, 0x68001f) AM_RAM_WRITE(kaneko16_layers_0_regs_w) AM_BASE_MEMBER(expro02_state, m_layers_0_regs) // sprite regs? tileregs?
+ AM_RANGE(0x700000, 0x700fff) AM_RAM AM_BASE_SIZE_GENERIC(spriteram) // sprites? 0x72f words tested
+ AM_RANGE(0x780000, 0x78001f) AM_RAM_WRITE(kaneko16_sprites_regs_w) AM_BASE_MEMBER(expro02_state, m_sprites_regs) // sprite regs? tileregs?
+ AM_RANGE(0x800000, 0x800001) AM_READ_PORT("DSW1")
+ AM_RANGE(0x800002, 0x800003) AM_READ_PORT("DSW2")
+ AM_RANGE(0x800004, 0x800005) AM_READ_PORT("DSW3")
+ AM_RANGE(0x800006, 0x800007) AM_NOP // ? used ?
+ AM_RANGE(0x900000, 0x900001) AM_WRITE(galsnew_6295_bankswitch_w)
+ AM_RANGE(0xa00000, 0xa00001) AM_WRITENOP /* ??? */
+ AM_RANGE(0xc80000, 0xc8ffff) AM_RAM
+ AM_RANGE(0xd80000, 0xd80001) AM_WRITE(galsnew_vram_1_bank_w) /* ??? */
+ //AM_RANGE(0xe00000, 0xe00015) AM_READWRITE(galpanib_calc_r,galpanib_calc_w) /* CALC1 MCU interaction (simulated) */
+ AM_RANGE(0xe80000, 0xe80001) AM_WRITE(galsnew_vram_0_bank_w) /* ??? */
+ AM_RANGE(0xf00000, 0xf00001) AM_DEVREADWRITE8_MODERN("oki", okim6295_device, read, write, 0xff00)
+ADDRESS_MAP_END
+
+/*************************************
+ *
+ * Initialization & interrupts
+ *
+ *************************************/
+
+static TIMER_DEVICE_CALLBACK( expro02_scanline )
+{
+ int scanline = param;
+
+ if(scanline == 224) // vblank-out irq
+ cputag_set_input_line(timer.machine(), "maincpu", 3, HOLD_LINE);
+ else if(scanline == 0) // vblank-in irq?
+ cputag_set_input_line(timer.machine(), "maincpu", 5, HOLD_LINE);
+ else if(scanline == 112) // VDP end task? (controls sprite colors in gameplay)
+ cputag_set_input_line(timer.machine(), "maincpu", 4, HOLD_LINE);
+}
+
+static MACHINE_RESET( galsnew )
+{
+ expro02_state *state = machine.driver_data<expro02_state>();
+ state->m_sprite_type = 0;
+
+ state->m_sprite_xoffs = 0;
+ state->m_sprite_yoffs = -1*0x40; // align testgrid with bitmap in service mode
+
+ // priorities not verified
+ state->m_priority.sprite[0] = 8; // above all
+ state->m_priority.sprite[1] = 8; // above all
+ state->m_priority.sprite[2] = 8; // above all
+ state->m_priority.sprite[3] = 8; // above all
+}
+
+/*************************************
+ *
+ * Graphics definitions
+ *
+ *************************************/
+
+static const gfx_layout layout_16x16x4 =
+{
+ 16,16,
+ RGN_FRAC(1,1),
+ 4,
+ { STEP4(0,1) },
+ { STEP8(8*8*4*0,4), STEP8(8*8*4*1,4) },
+ { STEP8(8*8*4*0,8*4), STEP8(8*8*4*2,8*4) },
+ 16*16*4
+};
+
+
+static GFXDECODE_START( 1x4bit_1x4bit )
+ GFXDECODE_ENTRY( "gfx1", 0, layout_16x16x4, 0x100, 0x40 ) // [0] Sprites
+ GFXDECODE_ENTRY( "gfx2", 0, layout_16x16x4, 0x400, 0x40 ) // [0] bg tiles
+GFXDECODE_END
+
+/*************************************
+ *
+ * Machine driver
+ *
+ *************************************/
+
+static MACHINE_CONFIG_START( galsnew, expro02_state )
+
+ /* basic machine hardware */
+ MCFG_CPU_ADD("maincpu", M68000, 12000000)
+ MCFG_CPU_PROGRAM_MAP(galsnew_map)
+ MCFG_TIMER_ADD_SCANLINE("scantimer", expro02_scanline, "screen", 0, 1)
+
+ /* CALC01 MCU @ 16Mhz (unknown type, simulated) */
+
+ /* 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(256, 256)
+ MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 0, 256-32-1)
+ MCFG_SCREEN_UPDATE(galsnew)
+
+ MCFG_GFXDECODE(1x4bit_1x4bit)
+ MCFG_PALETTE_LENGTH(2048 + 32768)
+ MCFG_MACHINE_RESET( galsnew )
+
+ MCFG_VIDEO_START(galsnew)
+ MCFG_PALETTE_INIT(berlwall)
+
+ /* arm watchdog */
+ MCFG_WATCHDOG_TIME_INIT(attotime::from_seconds(3)) /* a guess, and certainly wrong */
+
+ /* sound hardware */
+ MCFG_SPEAKER_STANDARD_MONO("mono")
+
+ MCFG_OKIM6295_ADD("oki", 12000000/6, OKIM6295_PIN7_LOW)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+
+MACHINE_CONFIG_END
+
+
+static MACHINE_CONFIG_DERIVED( fantasia, galsnew )
+
+ /* basic machine hardware */
+ MCFG_CPU_MODIFY("maincpu")
+ MCFG_CPU_PROGRAM_MAP(fantasia_map)
+
+ MCFG_WATCHDOG_TIME_INIT(attotime::from_seconds(0)) /* a guess, and certainly wrong */
+
+MACHINE_CONFIG_END
+
+/*************************************
+ *
+ * ROM definition(s)
+ *
+ *************************************/
+
+ROM_START( galsnew ) /* EXPRO-02 PCB */
+ ROM_REGION( 0x40000, "maincpu", 0 ) /* 68000 code */
+ ROM_LOAD16_BYTE( "pm110u_u87-01.u87", 0x000000, 0x20000, CRC(b793a57d) SHA1(12d57b2b4add532f0d0453c25b30d34b3449d717) ) /* US region */
+ ROM_LOAD16_BYTE( "pm109u_u88-01.u88", 0x000001, 0x20000, CRC(35b936f8) SHA1(d272067f10542d511a777802cafa4d72b93fa5e8) )
+
+ ROM_REGION16_BE( 0x300000, "user1", 0 ) /* 68000 data */
+ ROM_LOAD16_BYTE( "pm004e.u86", 0x000001, 0x80000, CRC(d3af52bc) SHA1(46be057106388578defecab1cdd1793ec76ebe92) )
+ ROM_LOAD16_BYTE( "pm005e.u85", 0x000000, 0x80000, CRC(d7ec650c) SHA1(6c2250c74381497154bf516e0cf1db6bb56bb446) )
+ ROM_LOAD16_BYTE( "pm000e.u74", 0x100001, 0x80000, CRC(5d220f3f) SHA1(7ff373e01027c8832712f7a2d732f8e49b875878) )
+ ROM_LOAD16_BYTE( "pm001e.u73", 0x100000, 0x80000, CRC(90433eb1) SHA1(8688a85747ad9ecac395d782f130baa64fb9d12b) )
+ ROM_LOAD16_BYTE( "pm002e.u76", 0x200001, 0x80000, CRC(713ee898) SHA1(c9f608a57fb90e5ee15eb76a74a7afcc406d5b4e) )
+ ROM_LOAD16_BYTE( "pm003e.u75", 0x200000, 0x80000, CRC(6bb060fd) SHA1(4fc3946866c5a55e8340b62b5ad9beae723ce0da) )
+
+ ROM_REGION16_BE( 0x80000, "user2", 0 ) /* contains real (non-cartoon) women, used after each 3rd round */
+ ROM_LOAD16_WORD_SWAP( "pm017e.u84", 0x00000, 0x80000, CRC(bc41b6ca) SHA1(0aeaf024dd7c84550e7df27230a1d4f04cc1d61c) )
+
+ ROM_REGION( 0x200000, "gfx1", ROMREGION_ERASEFF ) /* sprites */
+ /* the 06e rom from the other type gals panic board ends up split across 2 roms here */
+ ROM_LOAD( "pm006e.u83", 0x000000, 0x080000, CRC(a7555d9a) SHA1(f95821b3358d9ab03ca9ead38fd358062259d89d) )
+ ROM_LOAD( "pm206e.u82", 0x080000, 0x080000, CRC(cc978baa) SHA1(59a95bcbaeca9d356f61ea42af4da116afbb1491) )
+ ROM_LOAD( "pm018e.u94", 0x100000, 0x080000, CRC(f542d708) SHA1(f515cca9e96401303ed45b4372f6079f29b7a999) )
+ ROM_LOAD( "pm019u_u93-01.u93", 0x180000, 0x010000, CRC(3cb79005) SHA1(05a0b993b9071467265067c3762644f46343d8de) ) // ?? seems to be an extra / replacement enemy?, not sure where it maps, or when it's used, it might load over another rom
+
+ ROM_REGION( 0x200000, "gfx2", ROMREGION_ERASEFF ) /* sprites */
+
+ ROM_REGION( 0x200000, "gfx3", 0 ) /* sprites - encrypted */
+ ROM_LOAD( "pm013e.u89", 0x000000, 0x080000, CRC(10f27b05) SHA1(0f8ade713f6b430b5a23370a17326d53229951de) )
+ ROM_LOAD( "pm014e.u90", 0x080000, 0x080000, CRC(2f367106) SHA1(1cd16e286e77e8e1b7668bbb6f2978101656b720) )
+ ROM_LOAD( "pm015e.u91", 0x100000, 0x080000, CRC(a563f8ef) SHA1(6e4171746e4d401992bf3a7619d5bed0063d57e5) )
+ ROM_LOAD( "pm016e.u92", 0x180000, 0x080000, CRC(c0b9494c) SHA1(f0b066dd78eb9fcf947da90ddb6c7b62299c5743) )
+
+
+ ROM_REGION( 0x140000, "oki", 0 ) /* OKIM6295 samples */
+ /* 00000-2ffff is fixed, 30000-3ffff is bank switched from all the ROMs */
+ ROM_LOAD( "pm008e.u46", 0x00000, 0x80000, CRC(d9379ba8) SHA1(5ae7c743319b1a12f2b101a9f0f8fe0728ed1476) )
+ ROM_RELOAD( 0x40000, 0x80000 )
+ ROM_LOAD( "pm007e.u47", 0xc0000, 0x80000, CRC(c7ed7950) SHA1(133258b058d3c562208d0d00b9fac71202647c32) )
+ROM_END
+
+ROM_START( galsnewa ) /* EXPRO-02 PCB */
+ ROM_REGION( 0x40000, "maincpu", 0 )
+ /* 68000 code */
+ ROM_LOAD16_BYTE( "pm110e.u87-01", 0x000000, 0x20000, CRC(34e1ee0d) SHA1(567df65b04667a6d35725c4a131fb174acb3ad0a) ) /* Export region */
+ ROM_LOAD16_BYTE( "pm109e.u88-01", 0x000001, 0x20000, CRC(c694255a) SHA1(16faf5ea5ff69a0e7a981021ea5fc09a0aefd7cf) )
+
+ ROM_REGION16_BE( 0x300000, "user1", 0 ) /* 68000 data */
+ ROM_LOAD16_BYTE( "pm004e.u86", 0x000001, 0x80000, CRC(d3af52bc) SHA1(46be057106388578defecab1cdd1793ec76ebe92) )
+ ROM_LOAD16_BYTE( "pm005e.u85", 0x000000, 0x80000, CRC(d7ec650c) SHA1(6c2250c74381497154bf516e0cf1db6bb56bb446) )
+ ROM_LOAD16_BYTE( "pm000e.u74", 0x100001, 0x80000, CRC(5d220f3f) SHA1(7ff373e01027c8832712f7a2d732f8e49b875878) )
+ ROM_LOAD16_BYTE( "pm001e.u73", 0x100000, 0x80000, CRC(90433eb1) SHA1(8688a85747ad9ecac395d782f130baa64fb9d12b) )
+ ROM_LOAD16_BYTE( "pm002e.u76", 0x200001, 0x80000, CRC(713ee898) SHA1(c9f608a57fb90e5ee15eb76a74a7afcc406d5b4e) )
+ ROM_LOAD16_BYTE( "pm003e.u75", 0x200000, 0x80000, CRC(6bb060fd) SHA1(4fc3946866c5a55e8340b62b5ad9beae723ce0da) )
+
+ ROM_REGION16_BE( 0x80000, "user2", 0 ) /* contains real (non-cartoon) women, used after each 3rd round */
+ ROM_LOAD16_WORD_SWAP( "pm017e.u84", 0x00000, 0x80000, CRC(bc41b6ca) SHA1(0aeaf024dd7c84550e7df27230a1d4f04cc1d61c) )
+
+ ROM_REGION( 0x200000, "gfx1", ROMREGION_ERASEFF ) /* sprites */
+ /* the 06e rom from the other type gals panic board ends up split across 2 roms here */
+ ROM_LOAD( "pm006e.u83", 0x000000, 0x080000, CRC(a7555d9a) SHA1(f95821b3358d9ab03ca9ead38fd358062259d89d) )
+ ROM_LOAD( "pm206e.u82", 0x080000, 0x080000, CRC(cc978baa) SHA1(59a95bcbaeca9d356f61ea42af4da116afbb1491) )
+ ROM_LOAD( "pm018e.u94", 0x100000, 0x080000, CRC(f542d708) SHA1(f515cca9e96401303ed45b4372f6079f29b7a999) )
+ /* U93 is an empty socket and not used with this set */
+
+ ROM_REGION( 0x200000, "gfx2", ROMREGION_ERASEFF ) /* sprites */
+
+ ROM_REGION( 0x200000, "gfx3", 0 ) /* tiles - encrypted */
+ ROM_LOAD( "pm013e.u89", 0x000000, 0x080000, CRC(10f27b05) SHA1(0f8ade713f6b430b5a23370a17326d53229951de) )
+ ROM_LOAD( "pm014e.u90", 0x080000, 0x080000, CRC(2f367106) SHA1(1cd16e286e77e8e1b7668bbb6f2978101656b720) )
+ ROM_LOAD( "pm015e.u91", 0x100000, 0x080000, CRC(a563f8ef) SHA1(6e4171746e4d401992bf3a7619d5bed0063d57e5) )
+ ROM_LOAD( "pm016e.u92", 0x180000, 0x080000, CRC(c0b9494c) SHA1(f0b066dd78eb9fcf947da90ddb6c7b62299c5743) )
+
+ ROM_REGION( 0x140000, "oki", 0 ) /* OKIM6295 samples */
+ /* 00000-2ffff is fixed, 30000-3ffff is bank switched from all the ROMs */
+ ROM_LOAD( "pm008e.u46", 0x00000, 0x80000, CRC(d9379ba8) SHA1(5ae7c743319b1a12f2b101a9f0f8fe0728ed1476) )
+ ROM_RELOAD( 0x40000, 0x80000 )
+ ROM_LOAD( "pm007e.u47", 0xc0000, 0x80000, CRC(c7ed7950) SHA1(133258b058d3c562208d0d00b9fac71202647c32) )
+ROM_END
+
+ROM_START( galsnewj ) /* EXPRO-02 PCB */
+ ROM_REGION( 0x40000, "maincpu", 0 )
+ /* 68000 code */
+ ROM_LOAD16_BYTE( "pm110j.u87", 0x000000, 0x20000, CRC(220b6df5) SHA1(d653b67bc66ca341bc660c2bb39b05dcf186fcb7) ) /* Japan region */
+ ROM_LOAD16_BYTE( "pm109j.u88", 0x000001, 0x20000, CRC(17721444) SHA1(9d97fe1ddac99105798fc22375a0b89ab316459a) )
+
+ ROM_REGION16_BE( 0x300000, "user1", 0 ) /* 68000 data */
+ ROM_LOAD16_BYTE( "pm004e.u86", 0x000001, 0x80000, CRC(d3af52bc) SHA1(46be057106388578defecab1cdd1793ec76ebe92) )
+ ROM_LOAD16_BYTE( "pm005e.u85", 0x000000, 0x80000, CRC(d7ec650c) SHA1(6c2250c74381497154bf516e0cf1db6bb56bb446) )
+ ROM_LOAD16_BYTE( "pm000e.u74", 0x100001, 0x80000, CRC(5d220f3f) SHA1(7ff373e01027c8832712f7a2d732f8e49b875878) )
+ ROM_LOAD16_BYTE( "pm001e.u73", 0x100000, 0x80000, CRC(90433eb1) SHA1(8688a85747ad9ecac395d782f130baa64fb9d12b) )
+ ROM_LOAD16_BYTE( "pm002e.u76", 0x200001, 0x80000, CRC(713ee898) SHA1(c9f608a57fb90e5ee15eb76a74a7afcc406d5b4e) )
+ ROM_LOAD16_BYTE( "pm003e.u75", 0x200000, 0x80000, CRC(6bb060fd) SHA1(4fc3946866c5a55e8340b62b5ad9beae723ce0da) )
+
+ ROM_REGION16_BE( 0x80000, "user2", ROMREGION_ERASEFF ) /* contains real (non-cartoon) women, used after each 3rd round */
+ /* U84 is an empty socket and not used with this set */
+
+ ROM_REGION( 0x200000, "gfx1", ROMREGION_ERASEFF ) /* sprites */
+ /* the 06e rom from the other type gals panic board ends up split across 2 roms here */
+ ROM_LOAD( "pm006e.u83", 0x000000, 0x080000, CRC(a7555d9a) SHA1(f95821b3358d9ab03ca9ead38fd358062259d89d) )
+ ROM_LOAD( "pm206e.u82", 0x080000, 0x080000, CRC(cc978baa) SHA1(59a95bcbaeca9d356f61ea42af4da116afbb1491) )
+ ROM_LOAD( "pm018e.u94", 0x100000, 0x080000, CRC(f542d708) SHA1(f515cca9e96401303ed45b4372f6079f29b7a999) )
+ /* U93 is an empty socket and not used with this set */
+
+ ROM_REGION( 0x200000, "gfx2", ROMREGION_ERASEFF ) /* sprites */
+
+ ROM_REGION( 0x200000, "gfx3", 0 ) /* tiles - encrypted */
+ ROM_LOAD( "pm013e.u89", 0x000000, 0x080000, CRC(10f27b05) SHA1(0f8ade713f6b430b5a23370a17326d53229951de) )
+ ROM_LOAD( "pm014e.u90", 0x080000, 0x080000, CRC(2f367106) SHA1(1cd16e286e77e8e1b7668bbb6f2978101656b720) )
+ ROM_LOAD( "pm015e.u91", 0x100000, 0x080000, CRC(a563f8ef) SHA1(6e4171746e4d401992bf3a7619d5bed0063d57e5) )
+ ROM_LOAD( "pm016e.u92", 0x180000, 0x080000, CRC(c0b9494c) SHA1(f0b066dd78eb9fcf947da90ddb6c7b62299c5743) )
+
+ ROM_REGION( 0x140000, "oki", 0 ) /* OKIM6295 samples */
+ /* 00000-2ffff is fixed, 30000-3ffff is bank switched from all the ROMs */
+ ROM_LOAD( "pm008j.u46", 0x00000, 0x80000, CRC(f394670e) SHA1(171f8dc519a13f352e6440aaadebe490c82361f0) )
+ ROM_RELOAD( 0x40000, 0x80000 )
+ ROM_LOAD( "pm007j.u47", 0xc0000, 0x80000, CRC(06780287) SHA1(8b9b57f6604b86d6dff42e5e51cd59a7111e1e79) )
+ROM_END
+
+ROM_START( galsnewk ) /* EXPRO-02 PCB, Korean title is "Ddang Dda Meok Gi" */
+ ROM_REGION( 0x40000, "maincpu", 0 ) /* 68000 code */
+ ROM_LOAD16_BYTE( "pm110k.u87", 0x000000, 0x20000, CRC(babe6a71) SHA1(91a5fc5e93affd01f8c6d5a4851233edcf8746f0) )
+ ROM_LOAD16_BYTE( "pm109k.u88", 0x000001, 0x20000, CRC(e486d98f) SHA1(9923f1dc69bd2746c06da6a5e518211391052259) )
+
+ ROM_REGION16_BE( 0x300000, "user1", 0 ) /* 68000 data */
+ ROM_LOAD16_BYTE( "pm004k.u86", 0x000001, 0x80000, CRC(9a14c8a3) SHA1(c3992eceb8d7d65f781b31dc77bebc73cf9303b6) )
+ ROM_LOAD16_BYTE( "pm005k.u85", 0x000000, 0x80000, CRC(33b5d0e3) SHA1(88eef6aff8054b07173da3bb1383fb47a1f7980c) )
+ ROM_LOAD16_BYTE( "pm000e.u74", 0x100001, 0x80000, CRC(5d220f3f) SHA1(7ff373e01027c8832712f7a2d732f8e49b875878) )
+ ROM_LOAD16_BYTE( "pm001e.u73", 0x100000, 0x80000, CRC(90433eb1) SHA1(8688a85747ad9ecac395d782f130baa64fb9d12b) )
+ ROM_LOAD16_BYTE( "pm002e.u76", 0x200001, 0x80000, CRC(713ee898) SHA1(c9f608a57fb90e5ee15eb76a74a7afcc406d5b4e) )
+ ROM_LOAD16_BYTE( "pm003e.u75", 0x200000, 0x80000, CRC(6bb060fd) SHA1(4fc3946866c5a55e8340b62b5ad9beae723ce0da) )
+
+ ROM_REGION16_BE( 0x80000, "user2", 0 ) /* contains real (non-cartoon) women, used after each 3rd round */
+ ROM_LOAD16_WORD_SWAP( "pm017k.u84", 0x00000, 0x80000, CRC(0c656fb5) SHA1(4610800a460c9f50f7a2ee7b2984bf8e79b62124) )
+
+ ROM_REGION( 0x200000, "gfx1", ROMREGION_ERASEFF ) /* sprites */
+ /* the 06e rom from the other type gals panic board ends up split across 2 roms here */
+ ROM_LOAD( "pm006e.u83", 0x000000, 0x080000, CRC(a7555d9a) SHA1(f95821b3358d9ab03ca9ead38fd358062259d89d) )
+ ROM_LOAD( "pm206e.u82", 0x080000, 0x080000, CRC(cc978baa) SHA1(59a95bcbaeca9d356f61ea42af4da116afbb1491) )
+ ROM_LOAD( "pm018e.u94", 0x100000, 0x080000, CRC(f542d708) SHA1(f515cca9e96401303ed45b4372f6079f29b7a999) )
+ ROM_LOAD( "pm19k.u93", 0x180000, 0x010000, CRC(c17d2989) SHA1(895f44a58dcf0065d42125d439dcc10f41563a94) ) // ?? seems to be an extra / replacement enemy?, not sure where it maps, or when it's used, it might load over another rom
+
+ ROM_REGION( 0x200000, "gfx2", ROMREGION_ERASEFF ) /* sprites */
+
+ ROM_REGION( 0x200000, "gfx3", 0 ) /* sprites - encrypted */
+ ROM_LOAD( "pm013e.u89", 0x000000, 0x080000, CRC(10f27b05) SHA1(0f8ade713f6b430b5a23370a17326d53229951de) )
+ ROM_LOAD( "pm014e.u90", 0x080000, 0x080000, CRC(2f367106) SHA1(1cd16e286e77e8e1b7668bbb6f2978101656b720) )
+ ROM_LOAD( "pm015e.u91", 0x100000, 0x080000, CRC(a563f8ef) SHA1(6e4171746e4d401992bf3a7619d5bed0063d57e5) )
+ ROM_LOAD( "pm016e.u92", 0x180000, 0x080000, CRC(c0b9494c) SHA1(f0b066dd78eb9fcf947da90ddb6c7b62299c5743) )
+
+
+ ROM_REGION( 0x140000, "oki", 0 ) /* OKIM6295 samples */
+ /* 00000-2ffff is fixed, 30000-3ffff is bank switched from all the ROMs */
+ ROM_LOAD( "pm008k.u46", 0x00000, 0x80000, CRC(7498483f) SHA1(d1f7461c8d1469704cc34460d7283f0a914afc29) )
+ ROM_RELOAD( 0x40000, 0x80000 )
+ ROM_LOAD( "pm007k.u47", 0xc0000, 0x80000, CRC(a8dc1fd5) SHA1(c324f7eab7302e4a71d505c915ab2ad591b8ff33) )
+ROM_END
+
+
+ROM_START( fantasia )
+ ROM_REGION( 0x500000, "maincpu", 0 ) /* 68000 code */
+ ROM_LOAD16_BYTE( "prog2_16.rom", 0x000000, 0x80000, CRC(e27c6c57) SHA1(420b66928c46e76fa2496f221691dd6c34542287) )
+ ROM_LOAD16_BYTE( "prog1_13.rom", 0x000001, 0x80000, CRC(68d27413) SHA1(84cb7d6523325496469d621f6f4da1b719162147) )
+ ROM_LOAD16_BYTE( "iscr6_09.rom", 0x100000, 0x80000, CRC(2a588393) SHA1(ef66ed94dd40a95a9b0fb5c3b075c1f654f60927) )
+ ROM_LOAD16_BYTE( "iscr5_05.rom", 0x100001, 0x80000, CRC(6160e0f0) SHA1(faec9d082c9039885afa4560aa87c05e9ecb5217) )
+ ROM_LOAD16_BYTE( "iscr4_08.rom", 0x200000, 0x80000, CRC(f776b743) SHA1(bd4d666ede454a56181e109745ac4b3203b2a87c) )
+ ROM_LOAD16_BYTE( "iscr3_04.rom", 0x200001, 0x80000, CRC(5df0dff2) SHA1(62ebd3c79f2e8ab30d6862cc4bf80f1b56f1f572) )
+ ROM_LOAD16_BYTE( "iscr2_07.rom", 0x300000, 0x80000, CRC(5707d861) SHA1(33f1cff693dfcb04edbf8738d3ea2a1884e6ff0c) )
+ ROM_LOAD16_BYTE( "iscr1_03.rom", 0x300001, 0x80000, CRC(36cb811a) SHA1(403cef012990b0e01b481b8afc6b5811e7137833) )
+ ROM_LOAD16_BYTE( "imag2_10.rom", 0x400000, 0x80000, CRC(1f14a395) SHA1(12ca5a5a30963ecf90f5a006029aa1098b9ee1df) )
+ ROM_LOAD16_BYTE( "imag1_06.rom", 0x400001, 0x80000, CRC(faf870e4) SHA1(163a9aa3e5c550d3760d32e31048a7aa1f93db7f) )
+
+ ROM_REGION( 0x80000, "gfx1", 0 ) /* sprites */
+ ROM_LOAD( "obj1_17.rom", 0x00000, 0x80000, CRC(aadb6eb7) SHA1(6eaa994ad7b4e8341360eaf5ddb46240316b7274) )
+
+ ROM_REGION( 0x140000, "oki", 0 ) /* OKIM6295 samples */
+ /* 00000-2ffff is fixed, 30000-3ffff is bank switched from all the ROMs */
+ ROM_LOAD( "mus-1_01.rom", 0x00000, 0x80000, CRC(22955efb) SHA1(791c18d1aa0c10810da05c199108f51f99fe1d49) )
+ ROM_RELOAD( 0x40000, 0x80000 )
+ ROM_LOAD( "mus-2_02.rom", 0xc0000, 0x80000, CRC(4cd4d6c3) SHA1(a617472a810aef6d82f5fe75ef2980c03c21c2fa) )
+
+ ROM_REGION( 0x200000, "gfx2", ROMREGION_ERASEFF ) /* sprites */
+
+ ROM_REGION( 0x200000, "gfx3", 0 ) /* tiles - encrypted */
+ ROM_LOAD16_BYTE( "gscr2_15.rom", 0x000001, 0x80000, CRC(46666768) SHA1(7281c4b45f6f9f6ad89fa2bb3f67f30433c0c513) )
+ ROM_LOAD16_BYTE( "gscr1_12.rom", 0x000000, 0x80000, CRC(4bd25be6) SHA1(9834f081c0390ccaa1234efd2393b6495e946c64) )
+ ROM_LOAD16_BYTE( "gscr4_14.rom", 0x100001, 0x80000, CRC(4e7e6ed4) SHA1(3e9e942e3de398edc8ac9f82769c3f41708d3741) )
+ ROM_LOAD16_BYTE( "gscr3_11.rom", 0x100000, 0x80000, CRC(6d00a4c5) SHA1(8fc0d78200b82ab87658d364ebe2f2e7239722e7) )
+ROM_END
+
+/*************************************
+ *
+ * Generic driver initialization
+ *
+ *************************************/
+
+static DRIVER_INIT(galsnew)
+{
+ UINT32 *src = (UINT32 *)machine.region("gfx3" )->base();
+ UINT32 *dst = (UINT32 *)machine.region("gfx2" )->base();
+ int x, offset;
+
+
+ for (x = 0; x < 0x80000; x++)
+ {
+ offset = x;
+
+ // swap bits around to simplify further processing
+ offset = BITSWAP24(offset, 23,22,21,20,19, 18,15, 9,10,8,7,12,13,16,17, 6,5,4,3,14,11,2,1,0);
+
+ // invert 8 bits
+ offset ^= 0x0528f;
+
+ // addition affecting 9 bits
+ offset = (offset & ~0x001ff) | ((offset + 0x00043) & 0x001ff);
+
+ // subtraction affecting 8 bits
+ offset = (offset & ~0x1fe00) | ((offset - 0x09600) & 0x1fe00);
+
+ // reverse the initial bitswap
+ offset = BITSWAP24(offset, 23,22,21,20,19, 18,9,10,17,4,11,12,3,15,16,14,13,8,7,6,5,2,1,0);
+
+ // swap nibbles to use the same gfxdecode
+ dst[x] = (src[offset] << 4 & 0xF0F0F0F0) | (src[offset] >> 4 & 0x0F0F0F0F);
+ }
+}
+
+/*************************************
+ *
+ * Game driver(s)
+ *
+ *************************************/
+
+GAME( 1990, galsnew, 0, galsnew, galsnew, galsnew, ROT90, "Kaneko", "Gals Panic (US, EXPRO-02 PCB)", 0 )
+GAME( 1990, galsnewa, galsnew, galsnew, galsnewa, galsnew, ROT90, "Kaneko", "Gals Panic (Export, EXPRO-02 PCB)", 0 )
+GAME( 1990, galsnewj, galsnew, galsnew, galsnewj, galsnew, ROT90, "Kaneko (Taito license)", "Gals Panic (Japan, EXPRO-02 PCB)", 0 )
+GAME( 1990, galsnewk, galsnew, galsnew, galsnewj, galsnew, ROT90, "Kaneko (Inter license)", "Gals Panic (Korea, EXPRO-02 PCB)", 0 )
+
+GAME( 1994, fantasia, 0, fantasia,fantasia, galsnew, ROT90, "Comad & New Japan System", "Fantasia", GAME_NO_COCKTAIL | GAME_IMPERFECT_GRAPHICS )