Fixed several protection issues with Double Wings (game promoted to have only the GAME_UNEMULATED_PROTECTION flag)

This commit is contained in:
Angelo Salese 2008-11-22 00:49:10 +00:00
parent 7e59b0b348
commit 08628f4fbb

View File

@ -4,8 +4,13 @@
the most protected of the DE102 games? the most protected of the DE102 games?
-- you can't select your plane Protection TODO:
-- locks up at boss - 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 -- Dip locations verified with Japanese manual
@ -235,38 +240,59 @@ static UINT16 dblwings_580_data;
static UINT16 dblwings_60a_data; static UINT16 dblwings_60a_data;
static UINT16 dblwings_200_data; static UINT16 dblwings_200_data;
static UINT16 dblwings_28c_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 ) static READ16_HANDLER ( dlbewing_prot_r )
{ {
if ((offset*2)==0x068) return 0;//dblwings_78a_data; switch(offset*2)
if ((offset*2)==0x094) return dblwings_104_data; // p1 inputs select screen OK {
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)==0x0f8) return 0;// dblwings_080_data;
if ((offset*2)==0x104) return 0; if ((offset*2)==0x104) return 0;
if ((offset*2)==0x10e) 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)==0x1d4) return 0;
if ((offset*2)==0x1ea) return 0; if ((offset*2)==0x206) return 0; //dblwings_70c_data;
if ((offset*2)==0x206) return 0;//dblwings_70c_data; if ((offset*2)==0x246) return 0; // end of level
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)==0x25c) return 0;
if ((offset*2)==0x284) return 0; //3rd player 2nd boss 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)==0x3ec) return 0; // sound?
if ((offset*2)==0x432) return 0; // boss on water level? if ((offset*2)==0x432) return 0; // boss on water level?
if ((offset*2)==0x476) return dblwings_008_data; // dips? if ((offset*2)==0x52e) return 0; // end of level
if ((offset*2)==0x4b0) return dblwings_608_data; if ((offset*2)==0x532) return 0; // end of level
if ((offset*2)==0x52e) return 0; // end of leve if ((offset*2)==0x54a) return 0; // 3rd player 2nd boss
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; 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); 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 ) 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)==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)==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)==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)==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)==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)==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)==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)==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)==0x40e) { dblwings_40e_data = data; return; } // 3rd player 2nd level?
if ((offset*2)==0x580) { dblwings_580_data = data; return; } 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)==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)==0x70c) { dblwings_70c_data = data; return; }
if ((offset*2)==0x78a) { dblwings_78a_data = data; return; } if ((offset*2)==0x78a) { dblwings_78a_data = data; return; }
if ((offset*2)==0x788) { dblwings_788_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 ) 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 */ /* protection */
// AM_RANGE(0x280104, 0x280105) AM_WRITE(SMH_NOP) // ?? // AM_RANGE(0x280104, 0x280105) AM_WRITE(SMH_NOP) // ??
AM_RANGE(0x2800ac, 0x2800ad) AM_READ_PORT("DSW") // dips // AM_RANGE(0x2800ac, 0x2800ad) AM_READ_PORT("DSW") // dips
AM_RANGE(0x280298, 0x280299) AM_READ_PORT("SYSTEM") // vbl // AM_RANGE(0x280298, 0x280299) AM_READ_PORT("SYSTEM") // vbl
AM_RANGE(0x280506, 0x280507) AM_READ_PORT("UNK") // AM_RANGE(0x280506, 0x280507) AM_READ_PORT("UNK")
AM_RANGE(0x2802B4, 0x2802B5) AM_READ_PORT("P1_P2") // inverted? // AM_RANGE(0x2802B4, 0x2802B5) AM_READ_PORT("P1_P2") // inverted?
// AM_RANGE(0x280330, 0x280331) AM_READ(SMH_NOP) // sound? // AM_RANGE(0x280330, 0x280331) AM_READ(SMH_NOP) // sound?
// AM_RANGE(0x280380, 0x280381) AM_WRITE(SMH_NOP) // sound // AM_RANGE(0x280380, 0x280381) AM_WRITE(SMH_NOP) // sound
@ -330,24 +452,32 @@ ADDRESS_MAP_END
#ifdef UNUSED_FUNCTION #ifdef UNUSED_FUNCTION
static WRITE8_HANDLER( YM2151_w ) static WRITE8_HANDLER( YM2151_w )
{ {
if(offset == 0)
y = data;
else
z = data;
popmessage("%02x %02x %02x",x,y,z);
switch (offset) { switch (offset) {
case 0: case 0:
ym2151_register_port_0_w(0,data); ym2151_register_port_0_w(space,0,data);
break; break;
case 1: case 1:
ym2151_data_port_0_w(0,data); ym2151_data_port_0_w(space,0,data);
break; break;
} }
} }
#endif #endif
static ADDRESS_MAP_START( sound_map, ADDRESS_SPACE_PROGRAM, 8 ) static ADDRESS_MAP_START( sound_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x7fff) AM_ROM AM_RANGE(0x0000, 0x7fff) AM_ROM
AM_RANGE(0x8000, 0x87ff) AM_RAM AM_RANGE(0x8000, 0x87ff) AM_RAM
// AM_RANGE(0xa000, 0xa001) AM_READWRITE(ym2151_status_port_0_r,YM2151_w) AM_RANGE(0xa000, 0xa001) AM_READWRITE(ym2151_status_port_0_r,ym2151_word_0_w)
// AM_RANGE(0xb000, 0xb000) AM_READ(okim6295_status_0_r) // AM_RANGE(0xb000, 0xb000) AM_READ(ym2151_status_port_0_r)//AM_READ(okim6295_status_0_r)
// AM_RANGE(0xd000, 0xd000) AM_READ(soundlatch_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 ADDRESS_MAP_END
@ -418,14 +548,6 @@ static INPUT_PORTS_START( dblewing )
PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_SERVICE1 )
PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_VBLANK ) 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") PORT_START("DSW")
/* 16bit - These values are for Dip Switch #1 */ /* 16bit - These values are for Dip Switch #1 */
PORT_DIPNAME( 0x0007, 0x0007, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SW1:1,2,3") 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_DIPNAME( 0x0040, 0x0040, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW1:7")
PORT_DIPSETTING( 0x0040, DEF_STR( Off ) ) PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPUNKNOWN_DIPLOC( 0x0080, 0x0080, "SW1:8" ) /* Manual says 'Don't change' */ PORT_DIPNAME( 0x0080, 0x0080, "Territory" ) PORT_DIPLOCATION("SW1:8") /*Manual says "don't change this" */
/* 16bit - These values are for Dip Switch #2 */ 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_DIPNAME( 0x0300, 0x0300, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:1,2")
PORT_DIPSETTING( 0x0200, "1" ) PORT_DIPSETTING( 0x0200, "1" )
PORT_DIPSETTING( 0x0100, "2" ) PORT_DIPSETTING( 0x0100, "2" )
@ -483,7 +607,7 @@ static INPUT_PORTS_START( dblewing )
PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) ) PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x0004, DEF_STR( Off ) ) PORT_DIPSETTING( 0x0004, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) 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( 0x0008, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) ) PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) )
@ -526,7 +650,7 @@ INPUT_PORTS_END
static void sound_irq(running_machine *machine, int irq) 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"); // mame_printf_debug("sound irq\n");
} }
@ -535,7 +659,6 @@ static const ym2151_interface ym2151_config =
sound_irq sound_irq
}; };
static MACHINE_DRIVER_START( dblewing ) static MACHINE_DRIVER_START( dblewing )
/* basic machine hardware */ /* basic machine hardware */
MDRV_CPU_ADD("main", M68000, 14000000) /* DE102 */ MDRV_CPU_ADD("main", M68000, 14000000) /* DE102 */
@ -545,7 +668,6 @@ static MACHINE_DRIVER_START( dblewing )
MDRV_CPU_ADD("audio", Z80, 4000000) MDRV_CPU_ADD("audio", Z80, 4000000)
MDRV_CPU_PROGRAM_MAP(sound_map,0) MDRV_CPU_PROGRAM_MAP(sound_map,0)
/* video hardware */ /* video hardware */
MDRV_SCREEN_ADD("main", RASTER) MDRV_SCREEN_ADD("main", RASTER)
MDRV_SCREEN_REFRESH_RATE(58) MDRV_SCREEN_REFRESH_RATE(58)
@ -565,11 +687,11 @@ static MACHINE_DRIVER_START( dblewing )
MDRV_SOUND_ADD("ym", YM2151, 32220000/9) MDRV_SOUND_ADD("ym", YM2151, 32220000/9)
MDRV_SOUND_CONFIG(ym2151_config) 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_ADD("oki", OKIM6295, 32220000/32)
MDRV_SOUND_CONFIG(okim6295_interface_pin7high) 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 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 )