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 } }