diff --git a/src/mame/drivers/dblewing.c b/src/mame/drivers/dblewing.c index bd57ea992a6..172c83cba17 100644 --- a/src/mame/drivers/dblewing.c +++ b/src/mame/drivers/dblewing.c @@ -4,8 +4,13 @@ the most protected of the DE102 games? --- you can't select your plane --- locks up at boss +Protection TODO: +- Fix dip-switches reading (lives etc.); +- Apparently power-ups sometimes gives wrong power effect,investigate on it; +- Fix the sound; +- Check the remaining unmapped read/writes effect; +- Clean-up the whole routine; + -- Dip locations verified with Japanese manual @@ -235,38 +240,59 @@ static UINT16 dblwings_580_data; static UINT16 dblwings_60a_data; static UINT16 dblwings_200_data; static UINT16 dblwings_28c_data; +static UINT16 dblwings_18a_data; +static UINT16 dblwings_280_data; +static UINT16 dblwings_384_data; +static UINT16 boss_move,boss_bgm,boss_shoot_type,boss_3_data,boss_4_data,boss_5_data,boss_5sx_data,boss_6_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 + switch(offset*2) + { + case 0x16a: return boss_move; // boss 1 movement + case 0x6d6: return boss_move; // boss 1 2nd pilot + case 0x748: return boss_move; // boss 1 3rd pilot + + case 0x566: return boss_bgm; // boss 1 bgm (read->write to the sound latch) + case 0x1ea: return boss_shoot_type; // boss 1 shoot type + case 0x596: return boss_3_data; // boss 3 appearing + case 0x692: return boss_4_data; + case 0x6b0: return boss_5_data; + case 0x51e: return boss_5sx_data; + case 0x784: return boss_6_data; + + case 0x330: return 0; // controls bonuses such as shoot type,bombs etc. + + case 0x0ac: return input_port_read(space->machine, "DSW");//x + case 0x4b0: return dblwings_608_data;//coinage + case 0x068: return 0;//starting lives,rol $5,res! + case 0x094: return dblwings_104_data;// p1 inputs select screen OK + case 0x24c: return dblwings_008_data;//read DSW (mirror for coinage/territory) +// case 0x330: return dblwings_78a_data; + case 0x298: return input_port_read(space->machine, "SYSTEM");//vblank + case 0x476: return input_port_read(space->machine, "SYSTEM");//mirror for coins + case 0x506: return input_port_read(space->machine, "DSW"); + case 0x5d8: return dblwings_406_data; + case 0x2b4: return input_port_read(space->machine, "P1_P2"); + } + +// printf("dblewing prot r %08x, %04x, %04x\n",cpu_get_pc(space->cpu), offset*2, mem_mask); + + if ((offset*2)==0x068) return 0; //??? //dblwings_78a_data; 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)==0x206) return 0; //dblwings_70c_data; + if ((offset*2)==0x246) return 0; // end of level 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)==0x284) return 0; // 3rd player 2nd boss 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)==0x52e) return 0; // end of level + if ((offset*2)==0x532) return 0; // end of level + if ((offset*2)==0x54a) return 0; // 3rd player 2nd boss if ((offset*2)==0x786) return 0; mame_printf_debug("dblewing prot r %08x, %04x, %04x\n",cpu_get_pc(space->cpu), offset*2, mem_mask); @@ -276,26 +302,122 @@ static READ16_HANDLER ( dlbewing_prot_r ) static WRITE16_HANDLER( dblewing_prot_w ) { +// if(offset*2 != 0x380) +// printf("dblewing prot w %08x, %04x, %04x %04x\n",cpu_get_pc(space->cpu), offset*2, mem_mask,data); + if ((offset*2)==0x008) { dblwings_008_data = data; return; } - if ((offset*2)==0x088) { dblwings_088_data = data; return; } + if ((offset*2)==0x088) + { + dblwings_088_data = data; + if(dblwings_088_data == 0) { boss_4_data = 0; } + else if(dblwings_088_data & 0x8000) { boss_4_data = 0x50; } + else { boss_4_data = 0x40; } + + 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)==0x18a) + { + dblwings_18a_data = data; + switch(dblwings_18a_data) + { + case 0x6b94: boss_5_data = 0x10; break; //initialize + case 0x7c68: boss_5_data = 0x60; break; //go up + case 0xfb1d: boss_5_data = 0x50; break; + case 0x977c: boss_5_data = 0x50; break; + case 0x8a49: boss_5_data = 0x60; break; + } + return; + } + if ((offset*2)==0x200) + { + dblwings_200_data = data; + switch(dblwings_200_data) + { + case 0x5a19: boss_move = 1; break; + case 0x3b28: boss_move = 2; break; + case 0x1d4d: boss_move = 1; break; + } + //popmessage("%04x",dblwings_200_data); + return; + } + if ((offset*2)==0x280) + { + dblwings_280_data = data; + switch(dblwings_280_data) + { + case 0x6b94: boss_5sx_data = 0x10; break; + case 0x7519: boss_5sx_data = 0x60; break; + case 0xfc68: boss_5sx_data = 0x50; break; + case 0x02dd: boss_5sx_data = 0x50; break; + case 0x613c: boss_5sx_data = 0x50; break; + } + //printf("%04x\n",dblwings_280_data); + return; + } if ((offset*2)==0x28c) { dblwings_28c_data = data; return; } - if ((offset*2)==0x380) { soundlatch_w(space,0,data&0xff); /*cpu_set_input_line(space->machine->cpu[1],0,HOLD_LINE);*/ return; } // sound write - if ((offset*2)==0x38e) { dblwings_38e_data = data; return; } + if ((offset*2)==0x380) { soundlatch_w(space,0,data&0xff); cpu_set_input_line(space->machine->cpu[1],0,HOLD_LINE); return; } // sound write + if ((offset*2)==0x384) + { + dblwings_384_data = data; + switch(dblwings_384_data) + { + case 0xaa41: boss_6_data = 1; break; + case 0x5a97: boss_6_data = 2; break; + case 0xbac5: boss_6_data = 3; break; + case 0x0afb: boss_6_data = 4; break; + case 0x6a99: boss_6_data = 5; break; + case 0xda8f: boss_6_data = 6; break; + } + return; + } + /*1st boss sub-routine*/ + if ((offset*2)==0x38e) + { + dblwings_38e_data = data; + /*TODO: boss_bgm shouldn't be there...*/ + boss_bgm = 1; + switch(dblwings_38e_data) + { + case 0x6c13: boss_shoot_type = 3; break; + case 0xc311: boss_shoot_type = 1; break; + case 0x1593: boss_shoot_type = 2; break; + case 0xf9db: boss_shoot_type = 1; break; + case 0xf742: boss_shoot_type = 2; break; + + case 0xeff5: boss_move = 1; break; + case 0xd2f1: boss_move = 2; break; + default: printf("%04x\n",dblwings_38e_data); break; + //case 0xe65a: boss_shoot_type = 0; break; + } + 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)==0x58c) + { + dblwings_58c_data = data; + if(dblwings_58c_data == 0) { boss_move = 5; } + else { boss_move = 2; } + + return; + } // 3rd player 1st level if ((offset*2)==0x608) { dblwings_608_data = data; return; } - if ((offset*2)==0x60a) { dblwings_60a_data = data; return; } + /*3rd boss sub-routine*/ + if ((offset*2)==0x60a) + { + dblwings_60a_data = data; + if(dblwings_60a_data & 0x8000) { boss_3_data = 2; } + else { boss_3_data = 9; } + + 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",cpu_get_pc(space->cpu), offset*2, mem_mask,data); } static ADDRESS_MAP_START( dblewing_map, ADDRESS_SPACE_PROGRAM, 16 ) @@ -308,10 +430,10 @@ static ADDRESS_MAP_START( dblewing_map, ADDRESS_SPACE_PROGRAM, 16 ) /* protection */ // AM_RANGE(0x280104, 0x280105) AM_WRITE(SMH_NOP) // ?? - AM_RANGE(0x2800ac, 0x2800ad) AM_READ_PORT("DSW") // dips - AM_RANGE(0x280298, 0x280299) AM_READ_PORT("SYSTEM") // vbl - AM_RANGE(0x280506, 0x280507) AM_READ_PORT("UNK") - AM_RANGE(0x2802B4, 0x2802B5) AM_READ_PORT("P1_P2") // inverted? +// AM_RANGE(0x2800ac, 0x2800ad) AM_READ_PORT("DSW") // dips +// AM_RANGE(0x280298, 0x280299) AM_READ_PORT("SYSTEM") // vbl +// AM_RANGE(0x280506, 0x280507) AM_READ_PORT("UNK") +// AM_RANGE(0x2802B4, 0x2802B5) AM_READ_PORT("P1_P2") // inverted? // AM_RANGE(0x280330, 0x280331) AM_READ(SMH_NOP) // sound? // AM_RANGE(0x280380, 0x280381) AM_WRITE(SMH_NOP) // sound @@ -330,24 +452,32 @@ ADDRESS_MAP_END #ifdef UNUSED_FUNCTION static WRITE8_HANDLER( YM2151_w ) { + if(offset == 0) + y = data; + else + z = data; + + popmessage("%02x %02x %02x",x,y,z); + switch (offset) { case 0: - ym2151_register_port_0_w(0,data); + ym2151_register_port_0_w(space,0,data); break; case 1: - ym2151_data_port_0_w(0,data); + ym2151_data_port_0_w(space,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) + AM_RANGE(0xa000, 0xa001) AM_READWRITE(ym2151_status_port_0_r,ym2151_word_0_w) +// AM_RANGE(0xb000, 0xb000) AM_READ(ym2151_status_port_0_r)//AM_READ(okim6295_status_0_r) + AM_RANGE(0xb000, 0xb000) AM_READWRITE(okim6295_status_0_r,okim6295_data_0_w) + AM_RANGE(0xc000, 0xc000) AM_READWRITE(okim6295_status_0_r,okim6295_data_0_w) + AM_RANGE(0xd000, 0xd000) AM_READ(soundlatch_r) ADDRESS_MAP_END @@ -418,14 +548,6 @@ static INPUT_PORTS_START( dblewing ) 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("DSW") /* 16bit - These values are for Dip Switch #1 */ PORT_DIPNAME( 0x0007, 0x0007, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SW1:1,2,3") @@ -449,8 +571,10 @@ static INPUT_PORTS_START( dblewing ) PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW1:7") PORT_DIPSETTING( 0x0040, DEF_STR( Off ) ) PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPUNKNOWN_DIPLOC( 0x0080, 0x0080, "SW1:8" ) /* Manual says 'Don't change' */ - /* 16bit - These values are for Dip Switch #2 */ + PORT_DIPNAME( 0x0080, 0x0080, "Territory" ) PORT_DIPLOCATION("SW1:8") /*Manual says "don't change this" */ + PORT_DIPSETTING( 0x0080, DEF_STR( Japan ) ) + PORT_DIPSETTING( 0x0000, "Korea" ) + /* 16bit - These values are for Dip Switch #2 */ PORT_DIPNAME( 0x0300, 0x0300, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:1,2") PORT_DIPSETTING( 0x0200, "1" ) PORT_DIPSETTING( 0x0100, "2" ) @@ -483,7 +607,7 @@ static INPUT_PORTS_START( dblewing ) 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_DIPNAME( 0x0008, 0x0000, DEF_STR( Unknown ) ) PORT_DIPSETTING( 0x0008, DEF_STR( Off ) ) PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) ) @@ -526,7 +650,7 @@ INPUT_PORTS_END static void sound_irq(running_machine *machine, int irq) { -// cpu_set_input_line(machine->cpu[1],0,irq ? ASSERT_LINE : CLEAR_LINE); + cpu_set_input_line(machine->cpu[1],0,irq ? ASSERT_LINE : CLEAR_LINE); // mame_printf_debug("sound irq\n"); } @@ -535,7 +659,6 @@ static const ym2151_interface ym2151_config = sound_irq }; - static MACHINE_DRIVER_START( dblewing ) /* basic machine hardware */ MDRV_CPU_ADD("main", M68000, 14000000) /* DE102 */ @@ -545,7 +668,6 @@ static MACHINE_DRIVER_START( dblewing ) MDRV_CPU_ADD("audio", Z80, 4000000) MDRV_CPU_PROGRAM_MAP(sound_map,0) - /* video hardware */ MDRV_SCREEN_ADD("main", RASTER) MDRV_SCREEN_REFRESH_RATE(58) @@ -565,11 +687,11 @@ static MACHINE_DRIVER_START( dblewing ) MDRV_SOUND_ADD("ym", YM2151, 32220000/9) MDRV_SOUND_CONFIG(ym2151_config) - MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.45) + MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00) MDRV_SOUND_ADD("oki", OKIM6295, 32220000/32) MDRV_SOUND_CONFIG(okim6295_interface_pin7high) - MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.60) + MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00) MACHINE_DRIVER_END @@ -641,4 +763,4 @@ static DRIVER_INIT( dblewing ) } -GAME( 1993, dblewing, 0, dblewing, dblewing, dblewing, ROT90,"Mitchell", "Double Wings", GAME_UNEMULATED_PROTECTION | GAME_NO_SOUND|GAME_NOT_WORKING) +GAME( 1993, dblewing, 0, dblewing, dblewing, dblewing, ROT90,"Mitchell", "Double Wings", GAME_UNEMULATED_PROTECTION | GAME_NO_SOUND )