mirror of
https://github.com/holub/mame
synced 2025-05-20 20:58:51 +03:00
Fixed several protection issues with Double Wings (game promoted to have only the GAME_UNEMULATED_PROTECTION flag)
This commit is contained in:
parent
7e59b0b348
commit
08628f4fbb
@ -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 )
|
||||
|
Loading…
Reference in New Issue
Block a user