summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/dblewing.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/dblewing.c')
-rw-r--r--src/mame/drivers/dblewing.c646
1 files changed, 646 insertions, 0 deletions
diff --git a/src/mame/drivers/dblewing.c b/src/mame/drivers/dblewing.c
new file mode 100644
index 00000000000..83147937c03
--- /dev/null
+++ b/src/mame/drivers/dblewing.c
@@ -0,0 +1,646 @@
+/* Double Wing */
+
+/*
+
+the most protected of the DE102 games?
+
+-- you can't select your plane
+-- locks up at boss
+
+*/
+
+#include "driver.h"
+#include "cpu/m68000/m68000.h"
+#include "decocrpt.h"
+#include "deco16ic.h"
+#include "sound/2151intf.h"
+#include "sound/okim6295.h"
+
+extern void deco102_decrypt(int region, int address_xor, int data_select_xor, int opcode_select_xor);
+
+/*
+
+offs +0
+-------- --------
+ fFbSssy yyyyyyyy
+
+s = size (multipart)
+S = size (x?) (does any other game use this?)
+f = flipy
+b = flash
+F = flipx
+y = ypos
+
+offs +1
+-------- --------
+tttttttt tttttttt
+
+t = sprite tile
+
+offs +2
+-------- --------
+ppcccccx xxxxxxxx
+
+c = colour palette
+p = priority
+x = xpos
+
+*/
+
+
+
+static void draw_sprites(running_machine *machine, mame_bitmap *bitmap,const rectangle *cliprect)
+{
+ int offs;
+
+ for (offs = 0x400-4;offs >= 0;offs -= 4)
+ {
+ int x,y,sprite,colour,multi,mult2,fx,fy,inc,flash,mult,xsize,pri;
+
+ sprite = spriteram16[offs+1];
+
+ y = spriteram16[offs];
+ flash=y&0x1000;
+ xsize = y&0x0800;
+ if (flash && (cpu_getcurrentframe() & 1)) continue;
+
+ x = spriteram16[offs+2];
+ colour = (x >>9) & 0x1f;
+
+ pri = (x&0xc000); // 2 bits or 1?
+
+ switch (pri&0xc000) {
+ case 0x0000: pri=0; break;
+ case 0x4000: pri=0xf0; break;
+ case 0x8000: pri=0xf0|0xcc; break;
+ case 0xc000: pri=0xf0|0xcc; break; /* or 0xf0|0xcc|0xaa ? */
+ }
+
+ fx = y & 0x2000;
+ fy = y & 0x4000;
+ multi = (1 << ((y & 0x0600) >> 9)) - 1; /* 1x, 2x, 4x, 8x height */
+
+ x = x & 0x01ff;
+ y = y & 0x01ff;
+ if (x >= 320) x -= 512;
+ if (y >= 256) y -= 512;
+ y = 240 - y;
+ x = 304 - x;
+
+ if (x>320) continue;
+
+ sprite &= ~multi;
+ if (fy)
+ inc = -1;
+ else
+ {
+ sprite += multi;
+ inc = 1;
+ }
+
+ if (flip_screen)
+ {
+ y=240-y;
+ x=304-x;
+ if (fx) fx=0; else fx=1;
+ if (fy) fy=0; else fy=1;
+ mult=16;
+ }
+ else mult=-16;
+
+ mult2 = multi+1;
+
+ while (multi >= 0)
+ {
+ pdrawgfx(bitmap,machine->gfx[2],
+ sprite - multi * inc,
+ colour,
+ fx,fy,
+ x,y + mult * multi,
+ cliprect,TRANSPARENCY_PEN,0,pri);
+
+ if (xsize)
+ pdrawgfx(bitmap,machine->gfx[2],
+ (sprite - multi * inc)-mult2,
+ colour,
+ fx,fy,
+ x-16,y + mult * multi,
+ cliprect,TRANSPARENCY_PEN,0,pri);
+
+
+ multi--;
+ }
+ }
+}
+
+static int dblewing_bank_callback(const int bank)
+{
+ return ((bank>>4) & 0x7) * 0x1000;
+}
+
+static VIDEO_START(dblewing)
+{
+ deco16_1_video_init();
+
+ deco16_set_tilemap_bank_callback(0,dblewing_bank_callback);
+ deco16_set_tilemap_bank_callback(1,dblewing_bank_callback);
+}
+
+static VIDEO_UPDATE(dblewing)
+{
+
+ flip_screen_set( deco16_pf12_control[0]&0x80 );
+ deco16_pf12_update(deco16_pf1_rowscroll,deco16_pf2_rowscroll);
+
+ fillbitmap(bitmap,machine->pens[0x0],cliprect); /* not Confirmed */
+ fillbitmap(priority_bitmap,0,NULL);
+
+ deco16_tilemap_2_draw(bitmap,cliprect,0,2);
+ deco16_tilemap_1_draw(bitmap,cliprect,0,4);
+ draw_sprites(machine,bitmap,cliprect);
+ return 0;
+}
+
+
+/*
+
+cheats.. to make testing a bit easier
+
+; [ Double Wings ]
+:dblewing:00000000:FF3C1F:00000009:FFFFFFFF:Infinite Credits
+:dblewing:00000000:FF381C:000000F8:FFFFFFFF:1P Rapid Fire
+:dblewing:00000000:FF3821:00000002:FFFFFFFF:1P Invincibility
+:dblewing:00000000:FF389D:00000008:FFFFFFFF:1P Infinite Lives
+:dblewing:00000000:FF389F:00000006:FFFFFFFF:1P Infinite Bombs
+:dblewing:00000000:FF38A5:0000001C:0000001C:1P Always Maximum Shot Power
+:dblewing:62000000:FF38A5:00000000:00000000:1P Select Weapon
+:dblewing:00010000:FF38A5:00000000:00000060:Vulcan
+:dblewing:00010000:FF38A5:00000020:00000060:Laser
+:dblewing:00010000:FF38A5:00000040:00000060:Break Vulcan
+:dblewing:00000000:FF38A7:0000000C:0000000C:1P Always Max Sub Wepon Power
+:dblewing:62000000:FF38A7:00000000:00000000:1P Select Sub Weapon
+:dblewing:00010000:FF38A7:00000000:000000F0:None
+:dblewing:00010000:FF38A7:00000060:000000F0:Missile
+:dblewing:00010000:FF38A7:00000070:000000F0:Homing
+:dblewing:00000000:FF38B5:00000001:FFFFFFFF:1P Always Have Restart Item
+:dblewing:62000000:FF38A1:00000000:FFFFFFFF:1P Select Character
+:dblewing:00010000:FF38A1:00000000:FFFFFFFF:Nick (Red)
+:dblewing:00010000:FF38A1:00000001:FFFFFFFF:Sophie (Blue)
+:dblewing:00010000:FF38A1:00000002:FFFFFFFF:Elan (Yellow)
+:dblewing:00000000:FF38DC:000000F8:FFFFFFFF:2P Rapid Fire
+:dblewing:00000000:FF38E1:00000002:FFFFFFFF:2P Invincibility
+:dblewing:00000000:FF395D:00000008:FFFFFFFF:2P Infinite Lives
+:dblewing:00000000:FF395F:00000006:FFFFFFFF:2P Infinite Bombs
+:dblewing:00000000:FF3965:0000001C:0000001C:2P Always Maximum Shot Power
+:dblewing:62000000:FF3965:00000000:00000000:2P Select Weapon
+:dblewing:00010000:FF3965:00000000:00000060:Vulcan
+:dblewing:00010000:FF3965:00000020:00000060:Laser
+:dblewing:00010000:FF3965:00000040:00000060:Break Vulcan
+:dblewing:00000000:FF3967:0000000C:0000000C:2P Always Max Sub Wepon Power
+:dblewing:62000000:FF3967:00000000:00000000:2P Select Sub Weapon
+:dblewing:00010000:FF3967:00000000:000000F0:None
+:dblewing:00010000:FF3967:00000060:000000F0:Missile
+:dblewing:00010000:FF3967:00000070:000000F0:Homing
+:dblewing:00000000:FF3975:00000001:FFFFFFFF:2P Always Have Restart Item
+:dblewing:62000000:FF3961:00000000:FFFFFFFF:2P Select Character
+:dblewing:00010000:FF3961:00000000:FFFFFFFF:Nick (Red)
+:dblewing:00010000:FF3961:00000001:FFFFFFFF:Sophie (Blue)
+:dblewing:00010000:FF3961:00000002:FFFFFFFF:Elan (Yellow)
+
+*/
+
+/* protection.. involves more addresses than this .. */
+/* this is going to be typical deco '104' protection...
+ writes one place, reads back data shifted in another
+ the addresses below are the ones seen accessed by the
+ game so far...
+
+ we need to log the PC of each read/write and check to
+ see if the code makes any of them move obvious
+*/
+static UINT16 dblwings_008_data;
+static UINT16 dblwings_104_data;
+static UINT16 dblwings_406_data;
+static UINT16 dblwings_608_data;
+static UINT16 dblwings_70c_data;
+static UINT16 dblwings_78a_data;
+static UINT16 dblwings_088_data;
+static UINT16 dblwings_58c_data;
+static UINT16 dblwings_408_data;
+static UINT16 dblwings_40e_data;
+static UINT16 dblwings_080_data;
+static UINT16 dblwings_788_data;
+static UINT16 dblwings_38e_data;
+static UINT16 dblwings_580_data;
+static UINT16 dblwings_60a_data;
+static UINT16 dblwings_200_data;
+static UINT16 dblwings_28c_data;
+
+
+static READ16_HANDLER ( dlbewing_prot_r )
+{
+ if ((offset*2)==0x068) return 0;//dblwings_78a_data;
+ if ((offset*2)==0x094) return dblwings_104_data; // p1 inputs select screen OK
+ if ((offset*2)==0x0f8) return 0;// dblwings_080_data;
+ if ((offset*2)==0x104) return 0;
+ if ((offset*2)==0x10e) return 0;
+ if ((offset*2)==0x16a) return 0;
+ if ((offset*2)==0x1a8) return 0;
+ if ((offset*2)==0x1d4) return 0;
+ if ((offset*2)==0x1ea) return 0;
+ if ((offset*2)==0x206) return 0;//dblwings_70c_data;
+ if ((offset*2)==0x24c) return 0;//dblwings_78a_data;
+ if ((offset*2)==0x246) return 0; // end of leve
+ if ((offset*2)==0x25c) return 0;
+ if ((offset*2)==0x284) return 0; //3rd player 2nd boss
+ if ((offset*2)==0x330) return 0; // sound?
+ if ((offset*2)==0x3ec) return 0; // sound?
+ if ((offset*2)==0x432) return 0; // boss on water level?
+ if ((offset*2)==0x476) return dblwings_008_data; // dips?
+ if ((offset*2)==0x4b0) return dblwings_608_data;
+ if ((offset*2)==0x52e) return 0; // end of leve
+ if ((offset*2)==0x532) return 0; // end of leve
+ if ((offset*2)==0x54a) return 0; //3rd player 2nd boss
+ if ((offset*2)==0x566) return 0; // bosses?
+ if ((offset*2)==0x596) return 0;
+ if ((offset*2)==0x5d8) return dblwings_406_data; // p2 inputs select screen OK
+ if ((offset*2)==0x692) return 0; // boss on water level?
+ if ((offset*2)==0x6d6) return 0;
+ if ((offset*2)==0x748) return 0;//dblwings_408_data; // dblwings_408_data // 3rd player 1st level?
+ if ((offset*2)==0x786) return 0;
+
+ mame_printf_debug("dblewing prot r %08x, %04x, %04x\n",activecpu_get_pc(), offset*2, mem_mask);
+
+ return 0;//mame_rand(Machine);
+}
+
+static WRITE16_HANDLER( dblewing_prot_w )
+{
+ if ((offset*2)==0x008) { dblwings_008_data = data; return; }
+ if ((offset*2)==0x088) { dblwings_088_data = data; return; }
+ if ((offset*2)==0x080) { dblwings_080_data = data; return; } // p3 3rd boss?
+ if ((offset*2)==0x104) { dblwings_104_data = data; return; } // p1 inputs select screen OK
+ if ((offset*2)==0x200) { dblwings_200_data = data; return; }
+ if ((offset*2)==0x28c) { dblwings_28c_data = data; return; }
+ if ((offset*2)==0x380) { soundlatch_w(0,data&0xff); /*cpunum_set_input_line(1,0,HOLD_LINE);*/ return; } // sound write
+ if ((offset*2)==0x38e) { dblwings_38e_data = data; return; }
+ if ((offset*2)==0x406) { dblwings_406_data = data; return; } // p2 inputs select screen OK
+ if ((offset*2)==0x408) { dblwings_408_data = data; return; } // 3rd player 1st level?
+ if ((offset*2)==0x40e) { dblwings_40e_data = data; return; } // 3rd player 2nd level?
+ if ((offset*2)==0x580) { dblwings_580_data = data; return; }
+ if ((offset*2)==0x58c) { dblwings_58c_data = data; return; } // 3rd player 1st level?
+ if ((offset*2)==0x608) { dblwings_608_data = data; return; }
+ if ((offset*2)==0x60a) { dblwings_60a_data = data; return; }
+ if ((offset*2)==0x70c) { dblwings_70c_data = data; return; }
+ if ((offset*2)==0x78a) { dblwings_78a_data = data; return; }
+ if ((offset*2)==0x788) { dblwings_788_data = data; return; }
+
+ mame_printf_debug("dblewing prot w %08x, %04x, %04x %04x\n",activecpu_get_pc(), offset*2, mem_mask,data);
+}
+
+static ADDRESS_MAP_START( dblewing_map, ADDRESS_SPACE_PROGRAM, 16 )
+ AM_RANGE(0x000000, 0x07ffff) AM_ROM
+
+ AM_RANGE(0x100000, 0x100fff) AM_READ(MRA16_RAM) AM_WRITE(deco16_pf1_data_w) AM_BASE(&deco16_pf1_data)
+ AM_RANGE(0x102000, 0x102fff) AM_READ(MRA16_RAM) AM_WRITE(deco16_pf2_data_w) AM_BASE(&deco16_pf2_data)
+ AM_RANGE(0x104000, 0x104fff) AM_READ(MRA16_RAM) AM_WRITE(MWA16_RAM) AM_BASE(&deco16_pf1_rowscroll)
+ AM_RANGE(0x106000, 0x106fff) AM_READ(MRA16_RAM) AM_WRITE(MWA16_RAM) AM_BASE(&deco16_pf2_rowscroll)
+
+ /* protection */
+// AM_RANGE(0x280104, 0x280105) AM_WRITE(MWA16_NOP) // ??
+ AM_RANGE(0x2800ac, 0x2800ad) AM_READ(input_port_2_word_r) // dips
+ AM_RANGE(0x280298, 0x280299) AM_READ(input_port_1_word_r) // vbl
+ AM_RANGE(0x280506, 0x280507) AM_READ(input_port_3_word_r)
+ AM_RANGE(0x2802B4, 0x2802B5) AM_READ(input_port_0_word_r) // inverted?
+// AM_RANGE(0x280330, 0x280331) AM_READ(MRA16_NOP) // sound?
+// AM_RANGE(0x280380, 0x280381) AM_WRITE(MWA16_NOP) // sound
+
+ AM_RANGE(0x280000, 0x2807ff) AM_READWRITE(dlbewing_prot_r,dblewing_prot_w)
+
+
+ AM_RANGE(0x284000, 0x284001) AM_RAM
+ AM_RANGE(0x288000, 0x288001) AM_RAM
+ AM_RANGE(0x28C000, 0x28C00f) AM_WRITE(MWA16_RAM) AM_BASE(&deco16_pf12_control)
+ AM_RANGE(0x300000, 0x3007ff) AM_RAM AM_BASE(&spriteram16) AM_SIZE(&spriteram_size)
+ AM_RANGE(0x320000, 0x3207ff) AM_READWRITE(MRA16_RAM,paletteram16_xxxxBBBBGGGGRRRR_word_w) AM_BASE(&paletteram16)
+ AM_RANGE(0xff0000, 0xff3fff) AM_MIRROR(0xc000) AM_RAM
+ADDRESS_MAP_END
+
+
+#ifdef UNUSED_FUNCTION
+static WRITE8_HANDLER( YM2151_w )
+{
+ switch (offset) {
+ case 0:
+ YM2151_register_port_0_w(0,data);
+ break;
+ case 1:
+ YM2151_data_port_0_w(0,data);
+ break;
+ }
+}
+#endif
+
+
+static ADDRESS_MAP_START( sound_map, ADDRESS_SPACE_PROGRAM, 8 )
+ AM_RANGE(0x0000, 0x7fff) AM_ROM
+ AM_RANGE(0x8000, 0x87ff) AM_RAM
+// AM_RANGE(0xa000, 0xa001) AM_READWRITE(YM2151_status_port_0_r,YM2151_w)
+// AM_RANGE(0xb000, 0xb000) AM_READ(OKIM6295_status_0_r)
+// AM_RANGE(0xd000, 0xd000) AM_READ(soundlatch_r)
+ADDRESS_MAP_END
+
+
+
+static const gfx_layout tile_8x8_layout =
+{
+ 8,8,
+ RGN_FRAC(1,2),
+ 4,
+ { RGN_FRAC(1,2)+8,RGN_FRAC(1,2)+0,RGN_FRAC(0,2)+8,RGN_FRAC(0,2)+0 },
+ { 0, 1, 2, 3, 4, 5, 6, 7 },
+ { 0*16, 1*16, 2*16, 3*16, 4*16, 5*16, 6*16, 7*16 },
+ 8*16
+};
+
+static const gfx_layout tile_16x16_layout =
+{
+ 16,16,
+ RGN_FRAC(1,2),
+ 4,
+ { RGN_FRAC(1,2)+8,RGN_FRAC(1,2)+0,RGN_FRAC(0,2)+8,RGN_FRAC(0,2)+0 },
+ { 256,257,258,259,260,261,262,263,0, 1, 2, 3, 4, 5, 6, 7 },
+ { 0*16, 1*16, 2*16, 3*16, 4*16, 5*16, 6*16, 7*16,8*16,9*16,10*16,11*16,12*16,13*16,14*16,15*16 },
+ 32*16
+};
+
+static const gfx_layout spritelayout =
+{
+ 16,16,
+ RGN_FRAC(1,1),
+ 4,
+ { 24,8,16,0 },
+ { 512,513,514,515,516,517,518,519, 0, 1, 2, 3, 4, 5, 6, 7 },
+ { 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32,
+ 8*32, 9*32,10*32,11*32,12*32,13*32,14*32,15*32},
+ 32*32
+};
+
+
+static GFXDECODE_START( dblewing )
+ GFXDECODE_ENTRY( REGION_GFX1, 0, tile_8x8_layout, 0x000, 32 ) /* Tiles (8x8) */
+ GFXDECODE_ENTRY( REGION_GFX1, 0, tile_16x16_layout, 0x000, 32 ) /* Tiles (16x16) */
+ GFXDECODE_ENTRY( REGION_GFX2, 0, spritelayout, 0x200, 32 ) /* Sprites (16x16) */
+GFXDECODE_END
+
+static INPUT_PORTS_START( dblewing )
+ PORT_START /* 16bit */
+ PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1)
+ PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1)
+ PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1)
+ PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_START1 )
+ PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY 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)
+ PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2)
+ PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_START2 )
+
+ PORT_START /* 16bit */
+ PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_COIN1 )
+ PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_COIN2 )
+ PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_SERVICE1 )
+ PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_VBLANK )
+
+/*
+
+ These dips are read using the protection, thus they don't currently have the stated effect on the
+ game as the protection is not implemented right now.
+
+ Also the Original PCB showed the title screen in English, and the current implementation shows it
+ in Korean(?), so it is likely there is a Language dip/jumper setting */
+
+ PORT_START
+ PORT_DIPNAME( 0x0007, 0x0007, DEF_STR( Coin_A ) ) /* 16bit - These values are for Dip Switch #1 */
+ PORT_DIPSETTING( 0x0000, DEF_STR( 3C_1C ) )
+ PORT_DIPSETTING( 0x0001, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING( 0x0007, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x0006, DEF_STR( 1C_2C ) )
+ PORT_DIPSETTING( 0x0005, DEF_STR( 1C_3C ) )
+ PORT_DIPSETTING( 0x0004, DEF_STR( 1C_4C ) )
+ PORT_DIPSETTING( 0x0003, DEF_STR( 1C_5C ) )
+ PORT_DIPSETTING( 0x0002, DEF_STR( 1C_6C ) )
+ PORT_DIPNAME( 0x0038, 0x0038, DEF_STR( Coin_B ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( 3C_1C ) )
+ PORT_DIPSETTING( 0x0008, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING( 0x0038, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x0030, DEF_STR( 1C_2C ) )
+ PORT_DIPSETTING( 0x0028, DEF_STR( 1C_3C ) )
+ PORT_DIPSETTING( 0x0020, DEF_STR( 1C_4C ) )
+ PORT_DIPSETTING( 0x0018, DEF_STR( 1C_5C ) )
+ PORT_DIPSETTING( 0x0010, DEF_STR( 1C_6C ) )
+ PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Flip_Screen ) )
+ PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0300, 0x0300, DEF_STR( Lives ) ) /* 16bit - These values are for Dip Switch #2 */
+ PORT_DIPSETTING( 0x0200, "1" )
+ PORT_DIPSETTING( 0x0100, "2" )
+ PORT_DIPSETTING( 0x0300, "3" )
+ PORT_DIPSETTING( 0x0000, "5" )
+ PORT_DIPNAME( 0x0c00, 0x0c00, DEF_STR( Difficulty ) )
+ PORT_DIPSETTING( 0x0800, DEF_STR( Easy ) )
+ PORT_DIPSETTING( 0x0c00, DEF_STR( Normal ) )
+ PORT_DIPSETTING( 0x0400, DEF_STR( Hard ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Hardest ) )
+ PORT_DIPNAME( 0x3000, 0x3000, DEF_STR( Bonus_Life ) )
+ PORT_DIPSETTING( 0x2000, "Every 100,000" )
+ PORT_DIPSETTING( 0x3000, "Every 150,000" )
+ PORT_DIPSETTING( 0x1000, "Every 300,000" )
+ PORT_DIPSETTING( 0x0000, "250,000 Only" )
+ PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Allow_Continue ) )
+ PORT_DIPSETTING( 0x4000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x8000, 0x0000, DEF_STR( Demo_Sounds ) )
+ PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+
+ PORT_START /* 16bit */
+ PORT_DIPNAME( 0x0001, 0x0001, "2" )
+ PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0002, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0004, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0008, 0x0000, DEF_STR( Unknown ) ) /* Setting this to "ON" shows an alt title page & freezes the game */
+ PORT_DIPSETTING( 0x0008, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0010, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0020, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0100, 0x0100, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0100, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0200, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0400, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0800, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x1000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x2000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x4000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+
+
+INPUT_PORTS_END
+
+static void sound_irq(int irq)
+{
+// cpunum_set_input_line(1,0,irq ? ASSERT_LINE : CLEAR_LINE);
+// mame_printf_debug("sound irq\n");
+}
+
+static struct YM2151interface ym2151_interface =
+{
+ sound_irq
+};
+
+
+static MACHINE_DRIVER_START( dblewing )
+ /* basic machine hardware */
+ MDRV_CPU_ADD(M68000, 14000000) /* DE102 */
+ MDRV_CPU_PROGRAM_MAP(dblewing_map,0)
+ MDRV_CPU_VBLANK_INT(irq6_line_hold,1)
+
+ MDRV_CPU_ADD(Z80, 4000000)
+ MDRV_CPU_PROGRAM_MAP(sound_map,0)
+
+
+ MDRV_SCREEN_REFRESH_RATE(58)
+ MDRV_SCREEN_VBLANK_TIME(DEFAULT_REAL_60HZ_VBLANK_DURATION)
+
+ /* video hardware */
+ MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER)
+ MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
+ MDRV_SCREEN_SIZE(64*8, 32*8)
+ MDRV_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1)
+ MDRV_PALETTE_LENGTH(4096)
+ MDRV_GFXDECODE(dblewing)
+
+ MDRV_VIDEO_START(dblewing)
+ MDRV_VIDEO_UPDATE(dblewing)
+
+ /* sound hardware */
+ MDRV_SPEAKER_STANDARD_MONO("mono")
+
+ MDRV_SOUND_ADD(YM2151, 32220000/9)
+ MDRV_SOUND_CONFIG(ym2151_interface)
+ MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.45)
+
+ MDRV_SOUND_ADD(OKIM6295, 32220000/32)
+ MDRV_SOUND_CONFIG(okim6295_interface_region_1_pin7high)
+ MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.60)
+MACHINE_DRIVER_END
+
+
+/*
+
+Double Wings (JPN Ver.)
+(c)1993 Mitchell
+DEC-22V0 (S-NK-3220)
+
+Software is by Mitchell, but the PCB is pure Data East.
+
+Data East ROM code = KP
+
+
+CPU :DE102 - Encrypted 68000
+Sound :TMPZ84C00AP-6,YM2151,OKI M6295, YM3014B
+OSC :28.0000MHz,32.2200MHz
+RAM :LH6168 x 1, CXK5814 x 6, CXK5864 x 4
+DIP :2 x 8 position
+Other :DATA EAST Chips (numbers scratched)
+ --------------------------------------
+ DATA EAST #? 9235EV 205941 VC5259-0001 JAPAN (confirmed #52) - 128 pin PQFP
+ DATA EAST #? DATA EAST 250 JAPAN (#102, the CPU) - 128 Pin PQFP
+ DATA EAST #? 24220F008 (confirmed #141) - 160 pin PQFP
+ DATA EAST #? L7A0717 9143 (confirmed #104, IO/Protection) - 100 pin PQFP
+
+ PALs: PAL16L8 (x 2, VG-00, VG-01) between program ROMs and CPU
+ PAL16L8 (x 1, VG-02) next to #52
+
+ Small surface-mounted chip with number scratched off (28 pin SOP), but has number 9303K9200.
+ A similar chip exists on Capt. America PCB and has the number 77 on it. Possibly the same chip?
+
+KP_00-.3D [547dc83e]
+KP_01-.5D [7a210c33]
+
+KP_02-.10H [def035fa]
+
+KP_03-.16H [5d7f930d]
+
+MBE-00.14A [e33f5c93]
+MBE-01.16A [ef452ad7]
+MBE-02.8H [5a6d3ac5]
+
+*/
+
+ROM_START( dblewing )
+ ROM_REGION( 0x80000, REGION_CPU1, 0 ) /* DE102 code (encrypted) */
+ ROM_LOAD16_BYTE( "kp_00-.3d", 0x000001, 0x040000, CRC(547dc83e) SHA1(f6f96bd4338d366f06df718093f035afabc073d1) )
+ ROM_LOAD16_BYTE( "kp_01-.5d", 0x000000, 0x040000, CRC(7a210c33) SHA1(ced89140af6d6a1bc0ffb7728afca428ed007165) )
+
+ ROM_REGION( 0x10000, REGION_CPU2, 0 ) // sound cpu?
+ ROM_LOAD( "kp_02-.10h", 0x00000, 0x10000, CRC(def035fa) SHA1(fd50314e5c94c25df109ee52c0ce701b0ff2140c) )
+
+ ROM_REGION( 0x100000, REGION_GFX1, ROMREGION_DISPOSE )
+ ROM_LOAD( "mbe-02.8h", 0x00000, 0x100000, CRC(5a6d3ac5) SHA1(738bb833e2c5d929ac75fe4e69ee0af88197d8a6) )
+
+ ROM_REGION( 0x200000, REGION_GFX2, ROMREGION_DISPOSE )
+ ROM_LOAD16_BYTE( "mbe-00.14a", 0x000000, 0x100000, CRC(e33f5c93) SHA1(720904b54d02dace2310ac6bd07d5ed4bc4fd69c) )
+ ROM_LOAD16_BYTE( "mbe-01.16a", 0x000001, 0x100000, CRC(ef452ad7) SHA1(7fe49123b5c2778e46104eaa3a2104ce09e05705) )
+
+ ROM_REGION( 0x80000, REGION_SOUND1, 0 ) /* Oki samples */
+ ROM_LOAD( "kp_03-.16h", 0x00000, 0x20000, CRC(5d7f930d) SHA1(ad23aa804ea3ccbd7630ade9b53fc3ea2718a6ec) )
+ROM_END
+
+static DRIVER_INIT( dblewing )
+{
+ deco56_decrypt(REGION_GFX1);
+ deco102_decrypt(REGION_CPU1, 0x399d, 0x25, 0x3d);
+}
+
+
+GAME( 1993, dblewing, 0, dblewing, dblewing, dblewing, ROT90,"Mitchell", "Double Wings", GAME_UNEMULATED_PROTECTION | GAME_NO_SOUND|GAME_NOT_WORKING)