summaryrefslogblamecommitdiffstatshomepage
path: root/src/mame/drivers/eolithsp.c
blob: 52f3b919c2dce0f9c826dae76b9d7494caae4795 (plain) (tree)
1
2
3
4
5
6
7
8
9
10









                                                                              
                
                     






                                          
                                              

                       
                                                                                      
                                                                                                        
 
                                                                                                                                         
         
                                                                  



         
                   







                                    
                                        



                                        
                                        





                                        
                                        







                                         
                                                  






                                                              
                                                                                                 











                                                                                                                
                                                       







                                                            
                                                            







                                  
                                        


                               
/* Eolith Speedup Handling */

/*
  This uses triggers and a scanline counter to speed up the eolith games a bit
  in some cases this results in a 100% speedup
  e.g hidden catch 25% -> 50% speed ingame

  this could probably be done a bit better using timers
*/

#include "emu.h"
#include "deprecat.h"
#include "includes/eolithsp.h"

static int eolith_speedup_address;
static int eolith_speedup_resume_scanline;
static int eolith_vblank = 0;
static int eolith_scanline = 0;

void eolith_speedup_read(address_space *space)
{
	/* for debug */
  //if ((cpu_get_pc(&space->device())!=eolith_speedup_address) && (eolith_vblank!=1) )
  //    printf("%s:eolith speedup_read data %02x\n",space->machine().describe_context(), eolith_vblank);

	if (cpu_get_pc(&space->device())==eolith_speedup_address && eolith_vblank==0 && eolith_scanline < eolith_speedup_resume_scanline)
	{
		device_spin_until_trigger(&space->device(), 1000);
	}

}

static const struct
{
	const char *s_name;
	UINT32 speedup_address;
	int speedup_resume_scanline;

} eolith_speedup_table[] =
{
	/* eolith.c */
	{ "ironfort", 0x40020854, 239 },
	{ "hidnctch", 0x4000bba0, 239 },
	{ "raccoon",  0x40008204, 239 },
	{ "puzzlekg", 0x40029458, 239 },
	{ "hidctch2", 0x40009524, 239 },
	{ "hidctch2a",0x40029B58, 239 },
	{ "landbrk",  0x40023574, 239 },
	{ "landbrka", 0x4002446c, 239 },
	{ "nhidctch", 0x40012778, 239 },
	{ "hidctch3", 0x4001f6a0, 239 },
	{ "fort2b",   0x000081e0, 239 },
	{ "fort2ba",  0x000081e0, 239 },
	{ "penfan",   0x4001FA66, 239 },
	/* eolith16.c */
	{ "klondkp",  0x0001a046, 239 },
	/* vegaeo.c */
	{ "crazywar",  0x00008cf8, 239 },
	{ NULL, 0, 0 }
};


void init_eolith_speedup(running_machine &machine)
{
	int n_game = 0;
	eolith_speedup_address = 0;
	eolith_speedup_resume_scanline = 0;

	while( eolith_speedup_table[ n_game ].s_name != NULL )
	{
		if( strcmp( machine.system().name, eolith_speedup_table[ n_game ].s_name ) == 0 )
		{
			eolith_speedup_address = eolith_speedup_table[ n_game ].speedup_address;
			eolith_speedup_resume_scanline = eolith_speedup_table[ n_game ].speedup_resume_scanline;

		}
		n_game++;
	}
}

/* todo, use timers instead! */
INTERRUPT_GEN( eolith_speedup )
{
	eolith_scanline = 261 -  cpu_getiloops(device);

	if (eolith_scanline==0)
	{
		eolith_vblank = 0;
	}

	if (eolith_scanline==eolith_speedup_resume_scanline)
	{
		device->machine().scheduler().trigger(1000);
	}

	if (eolith_scanline==240)
	{
		eolith_vblank = 1;
	}
}

CUSTOM_INPUT( eolith_speedup_getvblank )
{
	return eolith_vblank&1;
}