diff options
Diffstat (limited to 'src/mame/drivers/dblewing.c')
-rw-r--r-- | src/mame/drivers/dblewing.c | 646 |
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) |