www.pudn.com > sn068s.zip > SNES.C


//#define CPUTRACKER 1048576 
//#define SPCTRACKER 1048576 
#include  
#include  
 
//#define DEINTERLEAVED_VRAM 
 
#include "timers.h" 
#include "helper.h" 
#include "platform.h" 
#include "sound.h" 
#include "cpu.h" 
#include "spc.h" 
#include "apuskip.h" 
 
#ifdef DEBUG 
#ifdef CPUTRACKER 
unsigned char *InsAddress=0; 
unsigned long LastIns; 
#endif 
#ifdef SPCTRACKER 
unsigned char *SPC_InsAddress=0; 
unsigned long SPC_LastIns; 
#endif 
#endif 
 
signed char snes_rom_loaded = 0; 
 
static int Setup_Memory(void) 
{ 
#ifdef DEBUG 
#ifdef CPUTRACKER 
#if CPUTRACKER >= 16 
 InsAddress=(unsigned char *)malloc(CPUTRACKER); 
#else 
 InsAddress=(unsigned char *)malloc(5120); 
#endif 
#endif 
#ifdef SPCTRACKER 
 SPC_InsAddress=(unsigned char *)malloc(SPCTRACKER); 
#endif 
#endif 
 
 return 0; 
} 
 
int snes_init(void) 
{ 
 int memoryneeded; 
 
 timers_init(); 
 
 memoryneeded = Setup_Memory(); 
 if (memoryneeded) 
 { 
  printf("Out of memory. Need up to %d more bytes free!\n", memoryneeded); 
  return 1; 
 } 
 
 SNES_Screen8 = platform_get_gfx_buffer(8, 256, 239, 8, 0); 
 if (SNES_Screen8 == 0) return 1; 
 
 SetupTables(); 
 
 switch (sound_enabled) 
 { 
  case 2: 
   if (Install_Sound(1)) break; 
  case 1: 
   Install_Sound(0); 
 } 
 
 return 0; 
} 
 
void snes_reset(void) 
{ 
 Reset_CPU(); 
 
 // Copy the SPC ROM into the top of the SPC RAM 
 memcpy(SPCRAM + 0xFFC0, SPC_ROM_CODE, 64); 
 Reset_SPC(); 
 Reset_APU_Skipper(); 
 Reset_Sound_DSP(); 
} 
 
extern unsigned FPSMaxTicks; 
 
void set_snes_pal(void) 
{ 
 SNES_COUNTRY = 0x10; 
 set_timer_throttle_ticks(23930); 
 FPSMaxTicks = 50; 
 LastVBLLine = 311; 
} 
 
void set_snes_ntsc(void) 
{ 
 SNES_COUNTRY = 0x00; 
 set_timer_throttle_ticks(19912); 
 FPSMaxTicks = 60; 
 LastVBLLine = 261; 
} 
 
void snes_exec(void) 
{ 
 if (SPC_ENABLED) Make_SPC(); else Make_APU_Skipper(); 
 
 if (sound_enabled) sound_resume(); 
 
 timers_enable(Frametime); 
 
 Do_CPU();    // This is the emulation core. 
 
 timers_disable(); 
 
 if (sound_enabled) sound_pause();    // Ensures silent GUI 
} 
 
// Resets memory heaps 
void Reset_Memory(void) 
{ 
#ifdef DEBUG 
#ifdef CPUTRACKER 
 // Reset CPU instruction tracking buffer 
#if CPUTRACKER >= 16 
 memset(InsAddress,0xFF,CPUTRACKER); LastIns=0; 
#else 
 memset(InsAddress,0,5120); LastIns=0; 
#endif 
#endif 
#ifdef SPCTRACKER 
 // Reset SPC instruction tracking buffer 
 memset(SPC_InsAddress,0xFF,SPCTRACKER); SPC_LastIns=0; 
#endif 
#endif 
 
 // Reset SPC address space to 0xFF 
 memset(SPCRAM,0xFF,65536); 
 
 // Reset WRAM to 0x55 
 memset(WRAM,0x55,131072); 
 
 // Reset VRAM to 0 
 memset(VRAM,0,65536); 
#ifdef DEINTERLEAVED_VRAM 
 memset(VRAM_DI,0,65536); 
#endif 
 
 // Reset blank ROM space to 0xFF 
 memset(Blank,0xFF,65536); 
 
 // Background allocated such that there is space for 8 tiles on either side of 
 // the screen, this allows the rendering to function without breaking up any 
 // of the plotters! 
 // Clear virtual SNES output screen 
 memset(SNES_Screen8,0,(256+8)*239); 
 
 // Clear CGRAM 
 Reset_CGRAM(); 
 // Clear OAM 
 memset(OAM,0,512+32); 
} 
 
// Resets Save RAM 
void Reset_SRAM(void) 
{ 
 // Reset SRAM to 0xAA 
 memset(SRAM,0xAA,131072); 
} 
 
extern unsigned char OAM_Count[239][2]; 
extern unsigned long OAM_Lines[239][34]; 
extern unsigned char TileCache2[4 * 64 << 10], TileTag2[4 * 1 << 10]; 
extern unsigned char TileCache4[2 * 64 << 10], TileTag4[2 * 1 << 10]; 
extern unsigned char TileCache8[1 * 64 << 10], TileTag8[1 * 1 << 10]; 
void save_debug_dumps(void) 
{ 
 if (snes_rom_loaded) 
 { 
  FILE *fp; 
 
#ifdef DEBUG 
#ifdef SPCTRACKER 
  // This saves the SPC-tracker dump! 
  fp = fopen("SPC.DMP", "wb"); 
  if (fp) 
  { 
   fwrite(SPC_InsAddress + SPC_LastIns, 1, (SPCTRACKER) - SPC_LastIns, fp); 
   fwrite(SPC_InsAddress, 1, SPC_LastIns, fp); 
   fclose(fp); 
  } 
#endif 
 
#ifdef CPUTRACKER 
  // This saves the CPU-tracker dump! 
  fp = fopen("C:\\INS.DMP", "wb"); 
  if (fp) 
  { 
#if CPUTRACKER >= 16 
   fwrite(InsAddress + LastIns, 1, (CPUTRACKER) - LastIns, fp); 
   fwrite(InsAddress, 1, LastIns, fp); 
#else 
   fwrite(InsAddress, 1, 5120, fp); 
#endif 
   fclose(fp); 
  } 
#endif 
 
  fp = fopen("SPCRAM.DMP", "wb"); 
  if (fp) 
  { 
   fwrite(SPCRAM, 1, 65536, fp); 
   fwrite(&_SPC_PC, 1, sizeof(unsigned), fp); 
   fclose(fp); 
  } 
 
  fp = fopen("WRAM.DMP", "wb"); 
  if (fp) 
  { 
   fwrite(WRAM, 1, 131072, fp); 
   fclose(fp); 
  } 
 
  fp = fopen("VRAM.DMP", "wb"); 
  if (fp) 
  { 
   fwrite(VRAM, 1, 65536, fp); 
   fclose(fp); 
  } 
 
  fp = fopen("OAM.DMP", "wb"); 
  if (fp) 
  { 
   fwrite(OAM, 1, 512+32, fp); 
   fclose(fp); 
  } 
 
  fp = fopen("OBJ.DMP", "wb"); 
  if (fp) 
  { 
   fwrite(OAM_Lines, sizeof(OAM_Lines), 1, fp); 
   fwrite(OAM_Count, sizeof(OAM_Count), 1, fp); 
   fclose(fp); 
  } 
 
  fp = fopen("PAL.DMP", "wb"); 
  if (fp) 
  { 
   fwrite(Real_SNES_Palette, sizeof(Real_SNES_Palette), 1, fp); 
   fwrite(SNES_Palette, sizeof(SNES_Palette), 1, fp); 
   fclose(fp); 
  } 
 
  fp = fopen("CACHE.DMP", "wb"); 
  if (fp) 
  { 
   fwrite(TileCache2, sizeof(TileCache2), 1, fp); 
   fwrite(TileCache4, sizeof(TileCache4), 1, fp); 
   fwrite(TileCache8, sizeof(TileCache8), 1, fp); 
   fclose(fp); 
  } 
 
  fp = fopen("TAG.DMP", "wb"); 
  if (fp) 
  { 
   fwrite(TileTag2, sizeof(TileTag2), 1, fp); 
   fwrite(TileTag4, sizeof(TileTag4), 1, fp); 
   fwrite(TileTag8, sizeof(TileTag8), 1, fp); 
   fclose(fp); 
  } 
#endif 
 
 } 
}