EXPORT void snes_term() { S9xDeinitAPU(); Deinit(); S9xGraphicsDeinit(); S9xUnmapAllControls(); }
/* Final exit point, issues exit (0) */ void S9xExit (void) { gui_config->save_config_file (); top_level->leave_fullscreen_mode (); S9xPortSoundDeinit (); Settings.StopEmulation = TRUE; if (gui_config->rom_loaded) { S9xAutoSaveSRAM (); } S9xDeinitAPU (); S9xDeinitInputDevices (); S9xDeinitDisplay (); gtk_main_quit (); delete top_level; delete gui_config; exit (0); return; }
void snes_term() { S9xDeinitAPU(); Memory.Deinit(); S9xGraphicsDeinit(); S9xUnmapAllControls(); }
void snes_init() { memset(&Settings, 0, sizeof(Settings)); Settings.MouseMaster = TRUE; Settings.SuperScopeMaster = TRUE; Settings.JustifierMaster = TRUE; Settings.MultiPlayer5Master = TRUE; Settings.FrameTimePAL = 20000; Settings.FrameTimeNTSC = 16667; Settings.SixteenBitSound = TRUE; Settings.Stereo = TRUE; Settings.SoundPlaybackRate = 32000; Settings.SoundInputRate = 32000; Settings.SupportHiRes = TRUE; Settings.Transparency = TRUE; Settings.AutoDisplayMessages = TRUE; Settings.InitialInfoStringTimeout = 120; Settings.HDMATimingHack = 100; Settings.BlockInvalidVRAMAccessMaster = TRUE; Settings.StopEmulation = TRUE; Settings.WrongMovieStateProtection = TRUE; Settings.DumpStreamsMaxFrames = -1; Settings.StretchScreenshots = 1; Settings.SnapshotScreenshots = TRUE; Settings.SkipFrames = AUTO_FRAMERATE; Settings.TurboSkipFrames = 15; Settings.CartAName[0] = 0; Settings.CartBName[0] = 0; Settings.AutoSaveDelay = 1; CPU.Flags = 0; if (!Memory.Init() || !S9xInitAPU()) { Memory.Deinit(); S9xDeinitAPU(); fprintf(stderr, "[libsnes]: Failed to init Memory or APU.\n"); exit(1); } S9xInitSound(64, 0); S9xSetSoundMute(FALSE); S9xSetSamplesAvailableCallback(S9xAudioCallback, NULL); S9xSetRenderPixelFormat(RGB555); GFX.Pitch = 2048; GFX.Screen = (uint16*) calloc(1, GFX.Pitch * 512 * sizeof(uint16)); S9xGraphicsInit(); S9xInitInputDevices(); for (int i = 0; i < 2; i++) { S9xSetController(i, CTL_JOYPAD, i, 0, 0, 0); snes_devices[i] = SNES_DEVICE_JOYPAD; } S9xUnmapAllControls(); map_buttons(); }
void retro_deinit(void) { S9xDeinitAPU(); Deinit(); S9xGraphicsDeinit(); S9xUnmapAllControls(); free(GFX.Screen); }
static void snes_init (void) { memset(&Settings, 0, sizeof(Settings)); Settings.SpeedhackGameID = SPEEDHACK_NONE; Settings.Transparency = TRUE; Settings.FrameTimePAL = 20000; Settings.FrameTimeNTSC = 16667; Settings.SoundPlaybackRate = 32000; Settings.SoundInputRate = 32000; Settings.HDMATimingHack = 100; Settings.BlockInvalidVRAMAccessMaster = TRUE; Settings.CartAName[0] = 0; Settings.CartBName[0] = 0; Settings.Crosshair = 1; CPU.Flags = 0; if (!Init() || !S9xInitAPU()) { Deinit(); S9xDeinitAPU(); if (log_cb) log_cb(RETRO_LOG_ERROR, "Failed to init Memory or APU.\n"); exit(1); } //very slow devices will still pop //this needs to be applied to all snes9x cores //increasing the buffer size does not cause extra lag(tested with 1000ms buffer) //bool8 S9xInitSound (int buffer_ms, int lag_ms) S9xInitSound(1000, 0);//just give it a 1 second buffer S9xSetSamplesAvailableCallback(S9xAudioCallback); GFX.Pitch = use_overscan ? 1024 : 2048; // FIXME: What is this supposed to do? Overscan has nothing to do with anything like this. If this is the Wii performance hack, it should be done differently. #if defined(_POSIX_C_SOURCE) && (_POSIX_C_SOURCE >= 200112L) /* request 128-bit alignment here if possible */ posix_memalign((void**)&GFX.Screen, 16, GFX.Pitch * 512 * sizeof(uint16)); #else GFX.Screen = (uint16*) calloc(1, GFX.Pitch * 512 * sizeof(uint16)); #endif S9xGraphicsInit(); retro_set_controller_port_device(0, RETRO_DEVICE_JOYPAD); retro_set_controller_port_device(1, RETRO_DEVICE_JOYPAD); S9xUnmapAllControls(); map_buttons(); /* Initialize SuperFX CPU to normal speed by default */ Settings.SuperFXSpeedPerLine = 0.417 * 10.5e6; }
void snes_term() { S9xDeinitAPU(); Memory.Deinit(); S9xGraphicsDeinit(); S9xUnmapAllControls(); unlink(s9x_tmp_file(S9X_TMP_STATE_FILE)); }
EXPORT void snes_init() { int i; if(environ_cb) { unsigned pitch; if (!environ_cb(SNES_ENVIRONMENT_GET_OVERSCAN, &use_overscan)) use_overscan = FALSE; if (use_overscan) { struct snes_geometry geom = {256, 239, 512, 512}; environ_cb(SNES_ENVIRONMENT_SET_GEOMETRY, &geom); pitch = 1024; environ_cb(SNES_ENVIRONMENT_SET_PITCH, &pitch); } } memset(&Settings, 0, sizeof(Settings)); Settings.FrameTimePAL = 20000; Settings.FrameTimeNTSC = 16667; Settings.SoundPlaybackRate = 32000; Settings.SoundInputRate = 32000; Settings.HDMATimingHack = 100; Settings.BlockInvalidVRAMAccessMaster = TRUE; Settings.CartAName[0] = 0; Settings.CartBName[0] = 0; Settings.Crosshair = 1; CPU.Flags = 0; if (!Init() || !S9xInitAPU()) { Deinit(); S9xDeinitAPU(); fprintf(stderr, "[libsnes]: Failed to init Memory or APU.\n"); exit(1); } S9xInitSound(16, 0); S9xSetSamplesAvailableCallback(S9xAudioCallback); GFX.Pitch = use_overscan ? 1024 : 2048; GFX.Screen = (uint16*) calloc(1, GFX.Pitch * 512 * sizeof(uint16)); S9xGraphicsInit(); for ( i = 0; i < 2; i++) { S9xSetController(i, CTL_JOYPAD, i, 0, 0, 0); snes_devices[i] = SNES_DEVICE_JOYPAD; } S9xUnmapAllControls(); map_buttons(); }
void S9xExit() { if(GFX.ZBuffer) { delete [] GFX.ZBuffer; GFX.ZBuffer = 0; } if(GFX.SubZBuffer) { delete [] GFX.SubZBuffer; GFX.SubZBuffer = 0; } Memory.SaveSRAM (S9xGetFilename (".srm")); Memory.Deinit (); S9xDeinitAPU (); }
void snes_init() { memset(&Settings, 0, sizeof(Settings)); Settings.MouseMaster = TRUE; Settings.SuperScopeMaster = TRUE; Settings.JustifierMaster = TRUE; Settings.MultiPlayer5Master = TRUE; Settings.FrameTimePAL = 20000; Settings.FrameTimeNTSC = 16667; Settings.SoundPlaybackRate = 32000; Settings.SoundInputRate = 32000; Settings.AutoDisplayMessages = TRUE; Settings.InitialInfoStringTimeout = 120; Settings.HDMATimingHack = 100; Settings.BlockInvalidVRAMAccessMaster = TRUE; Settings.CartAName[0] = 0; Settings.CartBName[0] = 0; Settings.AutoSaveDelay = 1; CPU.Flags = 0; if (!Memory.Init() || !S9xInitAPU()) { Memory.Deinit(); S9xDeinitAPU(); fprintf(stderr, "[libsnes]: Failed to init Memory or APU.\n"); exit(1); } S9xInitSound(16, 0); S9xSetSamplesAvailableCallback(S9xAudioCallback); S9xSetRenderPixelFormat(RGB555); GFX.Pitch = 2048; GFX.Screen = (uint16*) calloc(1, GFX.Pitch * 512 * sizeof(uint16)); S9xGraphicsInit(); S9xInitInputDevices(); for (int i = 0; i < 2; i++) { S9xSetController(i, CTL_JOYPAD, i, 0, 0, 0); snes_devices[i] = SNES_DEVICE_JOYPAD; } S9xUnmapAllControls(); map_buttons(); }
void OutOfMemory () { Memory.Deinit (); S9xDeinitAPU (); }
void SNESSystem::Term() { Memory.Deinit(); S9xDeinitAPU(); }
extern "C" int SIStartWithROM(char* rom_filename) { // notify that we're running SI_EmulationIsRunning = 1; // frameskip settings reset SI_NextFrameTime = (timeval){0, 0}; SI_FrameTimeDebt = 0; SI_SleptLastFrame = 0; // ensure dirs exist mode_t dir_mode = S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH; mkdir(SI_SRAMPath, dir_mode); // unix init ZeroMemory(&Settings, sizeof(Settings)); Settings.MouseMaster = TRUE; Settings.SuperScopeMaster = TRUE; Settings.JustifierMaster = TRUE; Settings.MultiPlayer5Master = TRUE; Settings.FrameTimePAL = 20000; Settings.FrameTimeNTSC = 16667; Settings.SixteenBitSound = TRUE; Settings.Stereo = TRUE; //Settings.Stereo = FALSE; Settings.SoundPlaybackRate = 32000; //Settings.SoundPlaybackRate = 22050; //Settings.SoundInputRate = 32000; Settings.SoundInputRate = 32000; Settings.SoundSync = FALSE; Settings.SupportHiRes = TRUE; Settings.Transparency = TRUE; Settings.AutoDisplayMessages = TRUE; Settings.InitialInfoStringTimeout = 120; Settings.HDMATimingHack = 100; Settings.BlockInvalidVRAMAccessMaster = TRUE; Settings.StopEmulation = TRUE; Settings.WrongMovieStateProtection = TRUE; Settings.DumpStreamsMaxFrames = -1; Settings.StretchScreenshots = 1; Settings.SnapshotScreenshots = TRUE; if(SI_AutoFrameskip) Settings.SkipFrames = AUTO_FRAMERATE; else Settings.SkipFrames = SI_Frameskip; //Settings.SkipFrames = 1; Settings.TurboSkipFrames = 15; Settings.CartAName[0] = 0; Settings.CartBName[0] = 0; #ifdef NETPLAY_SUPPORT Settings.ServerName[0] = 0; #endif CPU.Flags = 0; /*S9xLoadConfigFiles(argv, argc); rom_filename = S9xParseArgs(argv, argc); make_snes9x_dirs();*/ if (!Memory.Init() || !S9xInitAPU()) { fprintf(stderr, "Snes9x: Memory allocation failure - not enough RAM/virtual memory available.\nExiting...\n"); Memory.Deinit(); S9xDeinitAPU(); exit(1); } int samplecount = Settings.SoundPlaybackRate/(Settings.PAL ? 50 : 60); int soundBufferSize = samplecount<<(1+(Settings.Stereo?1:0)); S9xInitSound(soundBufferSize, 0); S9xSetSoundMute(TRUE); S9xReset(); S9xUnmapAllControls(); S9xSetController(0, CTL_JOYPAD, 0, 0, 0, 0); //S9xSetController(1, CTL_JOYPAD, 1, 0, 0, 0); s9xcommand_t cmd; ASSIGN_BUTTONf(SIOS_X, "Joypad1 X"); ASSIGN_BUTTONf(SIOS_A, "Joypad1 A"); ASSIGN_BUTTONf(SIOS_B, "Joypad1 B"); ASSIGN_BUTTONf(SIOS_Y, "Joypad1 Y"); ASSIGN_BUTTONf(SIOS_L, "Joypad1 L"); ASSIGN_BUTTONf(SIOS_R, "Joypad1 R"); ASSIGN_BUTTONf(SIOS_SELECT, "Joypad1 Select"); ASSIGN_BUTTONf(SIOS_START, "Joypad1 Start"); ASSIGN_BUTTONf(SIOS_UP, "Joypad1 Up"); ASSIGN_BUTTONf(SIOS_DOWN, "Joypad1 Down"); ASSIGN_BUTTONf(SIOS_LEFT, "Joypad1 Left"); ASSIGN_BUTTONf(SIOS_RIGHT, "Joypad1 Right"); S9xReportControllers(); #ifdef GFX_MULTI_FORMAT S9xSetRenderPixelFormat(RGB565); #endif uint32 saved_flags = CPU.Flags; bool8 loaded = FALSE; if (Settings.Multi) { loaded = Memory.LoadMultiCart(Settings.CartAName, Settings.CartBName); if (!loaded) { char s1[PATH_MAX + 1], s2[PATH_MAX + 1]; char drive[_MAX_DRIVE + 1], dir[_MAX_DIR + 1], fname[_MAX_FNAME + 1], ext[_MAX_EXT + 1]; s1[0] = s2[0] = 0; if (Settings.CartAName[0]) { _splitpath(Settings.CartAName, drive, dir, fname, ext); snprintf(s1, PATH_MAX + 1, "%s%s%s", S9xGetDirectory(ROM_DIR), SLASH_STR, fname); if (ext[0] && (strlen(s1) <= PATH_MAX - 1 - strlen(ext))) { strcat(s1, "."); strcat(s1, ext); } } if (Settings.CartBName[0]) { _splitpath(Settings.CartBName, drive, dir, fname, ext); snprintf(s2, PATH_MAX + 1, "%s%s%s", S9xGetDirectory(ROM_DIR), SLASH_STR, fname); if (ext[0] && (strlen(s2) <= PATH_MAX - 1 - strlen(ext))) { strcat(s2, "."); strcat(s2, ext); } } loaded = Memory.LoadMultiCart(s1, s2); } } else if (rom_filename) { char rom_path[1024] = {0}; sprintf(rom_path,"%s%s%s",SI_DocumentsPath,DIR_SEPERATOR,rom_filename); loaded = Memory.LoadROM(rom_path); /*if (!loaded && rom_filename[0]) { char s[PATH_MAX + 1]; char drive[_MAX_DRIVE + 1], dir[_MAX_DIR + 1], fname[_MAX_FNAME + 1], ext[_MAX_EXT + 1]; _splitpath(rom_filename, drive, dir, fname, ext); snprintf(s, PATH_MAX + 1, "%s%s%s", S9xGetDirectory(ROM_DIR), SLASH_STR, fname); if (ext[0] && (strlen(s) <= PATH_MAX - 1 - strlen(ext))) { strcat(s, "."); strcat(s, ext); } loaded = Memory.LoadROM(s); }*/ } if (!loaded) { fprintf(stderr, "Error opening the ROM file.\n"); exit(1); } //NSRTControllerSetup(); //Memory.LoadSRAM(S9xGetFilename(".srm", SRAM_DIR)); SILoadSRAM(); //S9xLoadCheatFile(S9xGetFilename(".cht", CHEAT_DIR)); CPU.Flags = saved_flags; Settings.StopEmulation = FALSE; #ifdef DEBUGGER struct sigaction sa; sa.sa_handler = sigbrkhandler; #ifdef SA_RESTART sa.sa_flags = SA_RESTART; #else sa.sa_flags = 0; #endif sigemptyset(&sa.sa_mask); sigaction(SIGINT, &sa, NULL); #endif GFX.Pitch = SNES_WIDTH*2; /*vrambuffer = (uint8*) malloc (GFX.Pitch * SNES_HEIGHT_EXTENDED*2); memset (vrambuffer, 0, GFX.Pitch * SNES_HEIGHT_EXTENDED*2); GFX.Screen = (uint16*)vrambuffer;*/ S9xGraphicsInit(); #ifdef NETPLAY_SUPPORT if (strlen(Settings.ServerName) == 0) { char *server = getenv("S9XSERVER"); if (server) { strncpy(Settings.ServerName, server, 127); Settings.ServerName[127] = 0; } } char *port = getenv("S9XPORT"); if (Settings.Port >= 0 && port) Settings.Port = atoi(port); else if (Settings.Port < 0) Settings.Port = -Settings.Port; if (Settings.NetPlay) { NetPlay.MaxFrameSkip = 10; if (!S9xNPConnectToServer(Settings.ServerName, Settings.Port, Memory.ROMName)) { fprintf(stderr, "Failed to connect to server %s on port %d.\n", Settings.ServerName, Settings.Port); S9xExit(); } fprintf(stderr, "Connected to server %s on port %d as player #%d playing %s.\n", Settings.ServerName, Settings.Port, NetPlay.Player, Memory.ROMName); } #endif // HACK: disabling SMV /*if (play_smv_filename) { uint32 flags = CPU.Flags & (DEBUG_MODE_FLAG | TRACE_FLAG); if (S9xMovieOpen(play_smv_filename, TRUE) != SUCCESS) exit(1); CPU.Flags |= flags; } else if (record_smv_filename) { uint32 flags = CPU.Flags & (DEBUG_MODE_FLAG | TRACE_FLAG); if (S9xMovieCreate(record_smv_filename, 0xFF, MOVIE_OPT_FROM_RESET, NULL, 0) != SUCCESS) exit(1); CPU.Flags |= flags; } else if (snapshot_filename) { uint32 flags = CPU.Flags & (DEBUG_MODE_FLAG | TRACE_FLAG); if (!S9xUnfreezeGame(snapshot_filename)) exit(1); CPU.Flags |= flags; }*/ //S9xGraphicsMode(); sprintf(String, "\"%s\" %s: %s", Memory.ROMName, TITLE, VERSION); //S9xSetTitle(String); #ifdef JOYSTICK_SUPPORT uint32 JoypadSkip = 0; #endif SILoadRunningStateForGameNamed(rom_filename); SI_EmulationPaused = 0; //if(SI_SoundOn) SIDemuteSound(soundBufferSize); S9xSetSoundMute(FALSE); #ifdef NETPLAY_SUPPORT bool8 NP_Activated = Settings.NetPlay; #endif while (1) { #ifdef NETPLAY_SUPPORT if (NP_Activated) { if (NetPlay.PendingWait4Sync && !S9xNPWaitForHeartBeatDelay(100)) { S9xProcessEvents(FALSE); continue; } for (int J = 0; J < 8; J++) old_joypads[J] = MovieGetJoypad(J); for (int J = 0; J < 8; J++) MovieSetJoypad(J, joypads[J]); if (NetPlay.Connected) { if (NetPlay.PendingWait4Sync) { NetPlay.PendingWait4Sync = FALSE; NetPlay.FrameCount++; S9xNPStepJoypadHistory(); } } else { fprintf(stderr, "Lost connection to server.\n"); S9xExit(); } } #endif #ifdef DEBUGGER if (!Settings.Paused || (CPU.Flags & (DEBUG_MODE_FLAG | SINGLE_STEP_FLAG))) #else if (!Settings.Paused && !SI_EmulationPaused) #endif { S9xMainLoop(); } #ifdef NETPLAY_SUPPORT if (NP_Activated) { for (int J = 0; J < 8; J++) MovieSetJoypad(J, old_joypads[J]); } #endif #ifdef DEBUGGER if(Settings.Paused || (CPU.Flags & DEBUG_MODE_FLAG)) #else if(Settings.Paused || SI_EmulationPaused) #endif S9xSetSoundMute(TRUE); #ifdef DEBUGGER if (CPU.Flags & DEBUG_MODE_FLAG) S9xDoDebug(); else #endif if(Settings.Paused || SI_EmulationPaused || !SI_EmulationRun) { SISaveSRAM(); SISaveRunningStateForGameNamed(rom_filename); SI_EmulationDidPause = 1; do { //S9xProcessEvents(FALSE); if(!SI_EmulationRun) break; usleep(100000); } while (SI_EmulationPaused); if(!SI_EmulationRun) { SISaveSRAM(); SISaveRunningStateForGameNamed(rom_filename); SIMuteSound(); S9xGraphicsDeinit(); Memory.Deinit(); S9xDeinitAPU(); break; } } #ifdef JOYSTICK_SUPPORT if (unixSettings.JoystickEnabled && (JoypadSkip++ & 1) == 0) ReadJoysticks(); #endif //S9xProcessEvents(FALSE); #ifdef DEBUGGER if(!Settings.Paused && !(CPU.Flags & DEBUG_MODE_FLAG)) #else if(!Settings.Paused && !SI_EmulationPaused) #endif S9xSetSoundMute(FALSE); } SI_EmulationIsRunning = 0; return (0); }
void SPC_close(void) { S9xDeinitAPU(); }
int main(int argc, char ** argv) { // Initialise SDL if (SDL_Init(SDL_INIT_VIDEO|SDL_INIT_AUDIO) < 0) DIE("SDL_Init: %s", SDL_GetError()); GL_Init(); //Init SDL_TTF to print text to the screen... if ( TTF_Init() ) { fprintf( stderr, "Error initializing SDL_ttf!\n" ); exit ( 1 ); } S9xInitDisplay(argc, argv); // Configure snes9x #if CONF_GUI OssoInit(); // Hildon-games-wrapper initialization. #endif S9xLoadConfig(argc, argv); // Load config files and parse cmd line. readOptions(); #if CONF_GUI OssoConfig(); // Apply specific hildon-games config. #endif // S9x initialization S9xInitDisplay(argc, argv); S9xInitAudioOutput(); S9xInitInputDevices(); while(1) { S9xInit(); S9xReset(); char * rom = romSelector(); S9xSetRomFile(rom); free(rom); // Load rom and related files: state, unfreeze if needed loadRom(); resumeGame(); // Late initialization sprintf(String, "DrNokSnes - %s", Memory.ROMName); S9xSetTitle(String); S9xHacksLoadFile(Config.hacksFile); if (!S9xGraphicsInit()) DIE("S9xGraphicsInit failed"); S9xAudioOutputEnable(true); SDL_PauseAudio(0); S9xVideoReset(); Config.running = true; do { frameSync(); // May block, or set frameskip to true. S9xMainLoop(); // Does CPU things, renders if needed. pollEvents(); //Ouch that this is going here... updateBindingMessage(); } while (Config.running); S9xVideoReset(); S9xGraphicsDeinit(); // Save state Memory.SaveSRAM(S9xGetFilename(FILE_SRAM)); pauseGame(); Memory.Deinit(); S9xDeinitAPU(); } // Deinitialization S9xAudioOutputEnable(false); S9xDeinitInputDevices(); S9xDeinitAudioOutput(); S9xDeinitDisplay(); // Late deinitialization S9xUnloadConfig(); #if CONF_GUI OssoDeinit(); #endif SDL_Quit(); return 0; }
int mainEntry(int argc, char* argv[]) { int ref = 0; s32 event=EVENT_NONE; sal_Init(); sal_VideoInit(16,SAL_RGB(0,0,0),Memory.ROMFramesPerSecond); mRomName[0]=0; if (argc >= 2) strcpy(mRomName, argv[1]); // Record ROM name MenuInit(sal_DirectoryGetHome(), &mMenuOptions); if(SnesInit() == SAL_ERROR) { sal_Reset(); return 0; } while(1) { mInMenu=1; event=MenuRun(mRomName); mInMenu=0; if(event==EVENT_LOAD_ROM) { if(mTempState) free(mTempState); mTempState=NULL; if(SnesRomLoad() == SAL_ERROR) { MenuMessageBox("Failed to load rom",mRomName,"Press any button to continue", MENU_MESSAGE_BOX_MODE_PAUSE); sal_Reset(); return 0; } else { event=EVENT_RUN_ROM; } } if(event==EVENT_RESET_ROM) { S9xReset(); event=EVENT_RUN_ROM; } if(event==EVENT_RUN_ROM) { if(mMenuOptions.fullScreen) { sal_VideoSetScaling(SNES_WIDTH,SNES_HEIGHT); } if(mMenuOptions.transparency) Settings.Transparency = TRUE; else Settings.Transparency = FALSE; sal_AudioSetVolume(mMenuOptions.volume,mMenuOptions.volume); sal_CpuSpeedSet(mMenuOptions.cpuSpeed); sal_VideoClear(0); sal_VideoFlip(1); sal_VideoClear(0); sal_VideoFlip(1); if(mMenuOptions.soundEnabled) RunSound(); else RunNoSound(); event=EVENT_NONE; } if(event==EVENT_EXIT_APP) break; } if(mTempState) free(mTempState); mTempState=NULL; S9xGraphicsDeinit(); S9xDeinitAPU(); Memory.Deinit(); free(GFX.SubZBuffer); free(GFX.ZBuffer); free(GFX.SubScreen); GFX.SubZBuffer=NULL; GFX.ZBuffer=NULL; GFX.SubScreen=NULL; sal_Reset(); return 0; }