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?
-- 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,7 +571,9 @@ 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' */
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" )
@ -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 )