extern "C" char* osd_GetPackDir() { static char filename[_MAX_PATH]; memset(filename, 0, _MAX_PATH); if(strlen(S9xGetSnapshotDirectory())!=0) strcpy (filename, S9xGetSnapshotDirectory()); else { char dir [_MAX_DIR + 1]; char drive [_MAX_DRIVE + 1]; char name [_MAX_FNAME + 1]; char ext [_MAX_EXT + 1]; _splitpath(Memory.ROMFilename, drive, dir, name, ext); _makepath(filename, drive, dir, NULL, NULL); } if(!strncmp((char*)&Memory.ROM [0xffc0], "SUPER POWER LEAG 4 ", 21)) { if (getenv("SPL4PACK")) return getenv("SPL4PACK"); else strcat(filename, "/SPL4-SP7"); } else if(!strncmp((char*)&Memory.ROM [0xffc0], "MOMOTETSU HAPPY ",21)) { if (getenv("MDHPACK")) return getenv("MDHPACK"); else strcat(filename, "/SMHT-SP7"); } else if(!strncmp((char*)&Memory.ROM [0xffc0], "HU TENGAI MAKYO ZERO ", 21)) { if (getenv("FEOEZPACK")) return getenv("FEOEZPACK"); else strcat(filename, "/FEOEZSP7"); } else if(!strncmp((char*)&Memory.ROM [0xffc0], "JUMP TENGAIMAKYO ZERO",21)) { if (getenv("SJNSPACK")) return getenv("SJNSPACK"); else strcat(filename, "/SJUMPSP7"); } else strcat(filename, "/MISC-SP7"); return filename; }
const char* S9xGetFilenameInc (const char *e) { static char filename [_MAX_PATH + 1]; char drive [_MAX_DRIVE + 1]; char dir [_MAX_DIR + 1]; char fname [_MAX_FNAME + 1]; char ext [_MAX_EXT + 1]; char *ptr; struct stat buf; if (strlen (S9xGetSnapshotDirectory())) { _splitpath (Memory.ROMFilename, drive, dir, fname, ext); strcpy (filename, S9xGetSnapshotDirectory()); strcat (filename, "/"); strcat (filename, fname); ptr = filename + strlen (filename); strcat (filename, "00/"); strcat (filename, e); } else { _splitpath (Memory.ROMFilename, drive, dir, fname, ext); strcat (fname, "00/"); _makepath (filename, drive, dir, fname, e); ptr = strstr (filename, "00/"); } do { if (++*(ptr + 2) > '9') { *(ptr + 2) = '0'; if (++*(ptr + 1) > '9') { *(ptr + 1) = '0'; if (++*ptr > '9') break; } } } while( stat(filename, &buf) == 0 ); return (filename); }
const char *S9xGetFilename (const char *ex) { static char filename [PATH_MAX + 1]; char drive [_MAX_DRIVE + 1]; char dir [_MAX_DIR + 1]; char fname [_MAX_FNAME + 1]; char ext [_MAX_EXT + 1]; _splitpath (Memory.ROMFilename, drive, dir, fname, ext); strcpy (filename, S9xGetSnapshotDirectory ()); strcat (filename, SLASH_STR); strcat (filename, fname); strcat (filename, ex); return (filename); }
bool8 S9xOpenSnapshotFile (const char *fname, bool8 read_only, STREAM *file) { char filename [PATH_MAX + 1]; char drive [_MAX_DRIVE + 1]; char dir [_MAX_DIR + 1]; char ext [_MAX_EXT + 1]; _splitpath (fname, drive, dir, filename, ext); if (*drive || *dir == '/' || (*dir == '.' && (*(dir + 1) == '/'))) { strcpy (filename, fname); if (!*ext) strcat (filename, ".s96"); } else { strcpy (filename, S9xGetSnapshotDirectory ()); strcat (filename, SLASH_STR); strcat (filename, fname); if (!*ext) strcat (filename, ".s96"); } #ifdef ZLIB if (read_only) { if ((*file = OPEN_STREAM (filename, "rb"))) return (TRUE); } else { if ((*file = OPEN_STREAM (filename, "wb"))) { chown (filename, getuid (), getgid ()); return (TRUE); } } #else char command [PATH_MAX]; if (read_only) { sprintf (command, "gzip -d <\"%s\"", filename); if (*file = popen (command, "r")) return (TRUE); } else { sprintf (command, "gzip --best >\"%s\"", filename); if (*file = popen (command, "wb")) return (TRUE); } #endif return (FALSE); }
void S9xProcessEvents (bool8 block) { static fd_set fds; static struct timeval tv = { 0, 0 }; /* if (joypads[0] & SNES_TL_MASK && joypads[0] & SNES_TR_MASK) S9xExit(); */ if (!is_graphics) { while (True) { char c; if (read (0, &c, 1) >= 0) if (c == '\n') { S9xGraphicsMode (); Settings.Paused ^= 1; return; } } } while (block || XPending (ourdisp)) { XEvent event; XNextEvent (ourdisp, &event); block = FALSE; uint8 byte1 = 0; uint8 byte2 = 0; uint8 byte3 = 0; uint8 byte4 = 0; switch (event.type) { case KeyPress: case KeyRelease: { int key; switch (key = XKeycodeToKeysym (ourdisp, event.xkey.keycode, 0)) { case XK_k: case XK_Right: byte2 = 1; break; case XK_h: case XK_Left: byte2 = 2; break; case XK_j: case XK_n: case XK_Down: byte2 = 4; break; case XK_u: case XK_Up: byte2 = 8; break; case XK_Return: byte2 = 16; break; // Start case XK_space: byte2 = 32; break; // Select case XK_period: case XK_t: case XK_d: byte1 = 128; break; // A case XK_slash: case XK_y: case XK_c: byte2 = 128; break; // B case XK_m: case XK_e: case XK_s: byte1 = 64; break; // X case XK_comma: case XK_r: case XK_x: byte2 = 64; break; // Y case XK_v: case XK_q: case XK_a: byte1 = 32; break; // TL case XK_b: case XK_w: case XK_z: byte1 = 16; break; // TR case XK_KP_4: byte4 = 1; break; case XK_KP_6: byte4 = 2; break; case XK_KP_2: byte4 = 4; break; case XK_KP_8: byte4 = 8; break; case XK_KP_Enter: byte4 = 16; break; // Start case XK_KP_Add: byte4 = 32; break; // Select case XK_Prior: byte3 = 128; break; // A case XK_Next: byte4 = 128; break; // B case XK_Home: byte3 = 64; break; // X case XK_End: byte4 = 64; break; // Y case XK_Insert: byte3 = 32; break; // TL case XK_Delete: byte3 = 16; break; // TR case XK_Escape: S9xExit (); break; case XK_0: if (event.type == KeyPress) Settings.DisableHDMA = !Settings.DisableHDMA; break; case XK_1: if (event.type == KeyPress) Settings.BG_Forced ^= 1; break; case XK_2: if (event.type == KeyPress) Settings.BG_Forced ^= 2; break; case XK_3: if (event.type == KeyPress) Settings.BG_Forced ^= 4; break; case XK_4: if (event.type == KeyPress) Settings.BG_Forced ^= 8; break; case XK_5: if (event.type == KeyPress) Settings.BG_Forced ^= 16; break; case XK_6: if (event.type == KeyPress) Settings.SwapJoypads = !Settings.SwapJoypads; break; case XK_9: if (event.type == KeyPress) if (Settings.SixteenBit) Settings.Transparency = !Settings.Transparency; break; case XK_8: if (event.type == KeyPress) Settings.BGLayering = !Settings.BGLayering; break; case XK_7: if (event.type == KeyPress) S9xNextController (); break; case XK_minus: if (event.type == KeyPress) { if (Settings.SkipFrames <= 1) Settings.SkipFrames = AUTO_FRAMERATE; else if (Settings.SkipFrames != AUTO_FRAMERATE) Settings.SkipFrames--; } break; case XK_equal: case XK_plus: if (event.type == KeyPress) { if (Settings.SkipFrames == AUTO_FRAMERATE) Settings.SkipFrames = 1; else if (Settings.SkipFrames < 10) Settings.SkipFrames++; } break; case XK_BackSpace: if (event.type == KeyPress) { Settings.DisableGraphicWindows = !Settings.DisableGraphicWindows; } break; case XK_Scroll_Lock: case XK_Pause: case XK_Break: if (event.type == KeyPress) { if (Settings.Paused) S9xGraphicsMode (); else S9xTextMode (); Settings.Paused ^= 1; } break; /* case XK_Tab: if (event.type == KeyPress) superscope_turbo = !superscope_turbo; break; case XK_grave: superscope_pause = event.type == KeyPress; break; */ case XK_F1: #ifdef DEBUGGER if (event.type == KeyPress && (event.xkey.state & Mod1Mask)) { CPU.Flags |= DEBUG_MODE_FLAG; break; } #endif // Fall... case XK_F2: if (event.type == KeyPress && (event.xkey.state & Mod1Mask)) { S9xLoadSnapshot (S9xChooseFilename (TRUE)); break; } // Fall... case XK_F3: if (event.type == KeyPress && (event.xkey.state & Mod1Mask)) { Snapshot (S9xChooseFilename (FALSE)); break; } // Fall... case XK_F4: case XK_F5: case XK_F6: case XK_F7: case XK_F8: case XK_F9: case XK_F10: case XK_F11: case XK_F12: if (event.type == KeyPress) { if (!(event.xkey.state & (ShiftMask | Mod1Mask))) { if (key == XK_F11) { S9xLoadSnapshot (S9xChooseFilename (TRUE)); break; } else if (key == XK_F12) { Snapshot (S9xChooseFilename (FALSE)); break; } char def [PATH_MAX]; char filename [PATH_MAX]; char drive [_MAX_DRIVE]; char dir [_MAX_DIR]; char ext [_MAX_EXT]; _splitpath (Memory.ROMFilename, drive, dir, def, ext); sprintf (filename, "%s%s%s.%03d", S9xGetSnapshotDirectory (), SLASH_STR, def, key - XK_F1); S9xLoadSnapshot (filename); } else if (event.xkey.state & Mod1Mask) { if (key >= XK_F4) S9xToggleSoundChannel (key - XK_F4); } else { char def [PATH_MAX]; char filename [PATH_MAX]; char drive [_MAX_DRIVE]; char dir [_MAX_DIR]; char ext [_MAX_EXT]; _splitpath (Memory.ROMFilename, drive, dir, def, ext); sprintf (filename, "%s%s%s.%03d", S9xGetSnapshotDirectory (), SLASH_STR, def, key - XK_F1); Snapshot (filename); } } break; } if (event.type == KeyPress) { joypads [0] |= byte1; joypads [0] |= (byte2 << 8); joypads [1] |= byte3; joypads [1] |= (byte4 << 8); } else { joypads [0] &= ~byte1; joypads [0] &= ~(byte2 << 8); joypads [1] &= ~byte3; joypads [1] &= ~(byte4 << 8); } break; } #if 0 case ButtonPress: mouse_buttons = (event.xbutton.state | (1 << event.xbutton.button)) & 0x1f; break; case ButtonRelease: mouse_buttons = (event.xbutton.state & ~(1 << event.xbutton.button)) & 0x1f; break; #endif } } }
void S9xLoadSDD1Data () { char filename [_MAX_PATH + 1]; char index [_MAX_PATH + 1]; char data [_MAX_PATH + 1]; char patch [_MAX_PATH + 1]; Memory.FreeSDD1Data (); strcpy (filename, S9xGetSnapshotDirectory ()); if (strncmp (Memory.ROMName, "Star Ocean", 10) == 0) strcat (filename, "/socnsdd1"); else strcat (filename, "/sfa2sdd1"); DIR *dir = opendir (filename); index [0] = 0; data [0] = 0; patch [0] = 0; if(dir){ struct dirent *d; while ((d = readdir (dir))){ if (strcasecmp (d->d_name, "SDD1GFX.IDX") == 0){ strcpy (index, filename); strcat (index, "/"); strcat (index, d->d_name); }else if(strcasecmp (d->d_name, "SDD1GFX.DAT") == 0){ strcpy (data, filename); strcat (data, "/"); strcat (data, d->d_name); }else if (strcasecmp (d->d_name, "SDD1GFX.PAT") == 0){ strcpy (patch, filename); strcat (patch, "/"); strcat (patch, d->d_name); } } closedir (dir); if(strlen (index) && strlen (data)){ FILE *fs = fopen (index, "rb"); int len = 0; if(fs){ // Index is stored as a sequence of entries, each entry being // 12 bytes consisting of: // 4 byte key: (24bit address & 0xfffff * 16) | translated block // 4 byte ROM offset // 4 byte length fseek (fs, 0, SEEK_END); len = ftell (fs); rewind (fs); Memory.SDD1Index = (uint8 *) malloc (len); fread (Memory.SDD1Index, 1, len, fs); fclose (fs); Memory.SDD1Entries = len / 12; if(!(fs = fopen (data, "rb"))){ free ((char *) Memory.SDD1Index); Memory.SDD1Index = NULL; Memory.SDD1Entries = 0; }else{ fseek (fs, 0, SEEK_END); len = ftell (fs); rewind (fs); Memory.SDD1Data = (uint8 *) malloc (len); fread (Memory.SDD1Data, 1, len, fs); fclose (fs); if(strlen (patch) > 0 && (fs = fopen (patch, "rb"))){ fclose (fs); } #ifdef MSB_FIRST // Swap the byte order of the 32-bit value triplets on // MSBFirst machines. uint8 *ptr = Memory.SDD1Index; for(int i = 0; i < Memory.SDD1Entries; i++, ptr += 12){ SWAP_DWORD ((*(uint32 *) (ptr + 0))); SWAP_DWORD ((*(uint32 *) (ptr + 4))); SWAP_DWORD ((*(uint32 *) (ptr + 8))); } #endif qsort(Memory.SDD1Index, Memory.SDD1Entries, 12, S9xCompareSDD1IndexEntries); } } }else{ printf ("Decompressed data pack not found in '%s'.\n", filename); } } }
void S9xProcessEvents (bool8 block) { static char prev_keystate[128]; extern volatile char key[128]; #ifdef GRIP_SUPPORT ReadGrip (); #endif #ifdef SIDEWINDER_SUPPORT if (num_sidewinders) ReadSidewinders (); #endif char key1[128]; char *keystate = (char *) key1; int fn = 0; memcpy (key1, (char *) key, sizeof (key1)); #undef KEY_DOWN #define KEY_DOWN(a) (keystate[a]) #undef KEY_PRESS #define KEY_PRESS(a) (keystate[a] && !prev_keystate[a]) #undef KEY_WASPRESSED #define KEY_WASPRESSED(a) (prev_keystate[a] && !keystate[a]) #undef PROCESS_KEY #define PROCESS_KEY(k, b, v)\ if (KEY_PRESS(k)) b |= v;\ if (KEY_WASPRESSED(k)) b &= ~v; if (KEY_PRESS (SCANCODE_ESCAPE)) S9xExit (); // Joypad 1: PROCESS_KEY(SCANCODE_K, joypads [0], SNES_RIGHT_MASK) PROCESS_KEY(SCANCODE_CURSORRIGHT, joypads [0], SNES_RIGHT_MASK) PROCESS_KEY(SCANCODE_H, joypads [0], SNES_LEFT_MASK) PROCESS_KEY(SCANCODE_CURSORLEFT, joypads [0], SNES_LEFT_MASK) PROCESS_KEY(SCANCODE_N, joypads [0], SNES_DOWN_MASK) PROCESS_KEY(SCANCODE_J, joypads [0], SNES_DOWN_MASK) PROCESS_KEY(SCANCODE_CURSORDOWN, joypads [0], SNES_DOWN_MASK) PROCESS_KEY(SCANCODE_U, joypads [0], SNES_UP_MASK) PROCESS_KEY(SCANCODE_CURSORUP, joypads [0], SNES_UP_MASK) PROCESS_KEY(SCANCODE_ENTER, joypads [0], SNES_START_MASK) PROCESS_KEY(SCANCODE_SPACE, joypads [0], SNES_SELECT_MASK) PROCESS_KEY(SCANCODE_A, joypads [0], SNES_TL_MASK) PROCESS_KEY(SCANCODE_V, joypads [0], SNES_TL_MASK) PROCESS_KEY(SCANCODE_Q, joypads [0], SNES_TL_MASK) PROCESS_KEY(SCANCODE_Z, joypads [0], SNES_TR_MASK) PROCESS_KEY(SCANCODE_B, joypads [0], SNES_TR_MASK) PROCESS_KEY(SCANCODE_W, joypads [0], SNES_TR_MASK) PROCESS_KEY(SCANCODE_S, joypads [0], SNES_X_MASK) PROCESS_KEY(SCANCODE_M, joypads [0], SNES_X_MASK) PROCESS_KEY(SCANCODE_E, joypads [0], SNES_X_MASK) PROCESS_KEY(SCANCODE_X, joypads [0], SNES_Y_MASK) PROCESS_KEY(SCANCODE_COMMA, joypads [0], SNES_Y_MASK) PROCESS_KEY(SCANCODE_R, joypads [0], SNES_Y_MASK) PROCESS_KEY(SCANCODE_D, joypads [0], SNES_A_MASK) PROCESS_KEY(SCANCODE_PERIOD, joypads [0], SNES_A_MASK) PROCESS_KEY(SCANCODE_T, joypads [0], SNES_A_MASK) PROCESS_KEY(SCANCODE_C, joypads [0], SNES_B_MASK) PROCESS_KEY(SCANCODE_SLASH, joypads [0], SNES_B_MASK) PROCESS_KEY(SCANCODE_Y, joypads [0], SNES_B_MASK) // Joypad 2: // PROCESS_KEY(SCANCODE_CURSORRIGHT, joypads [1], SNES_RIGHT_MASK) // PROCESS_KEY(SCANCODE_CURSORLEFT, joypads [1], SNES_LEFT_MASK) // PROCESS_KEY(SCANCODE_CURSORDOWN, joypads [1], SNES_DOWN_MASK) // PROCESS_KEY(SCANCODE_CURSORUP, joypads [1], SNES_UP_MASK) PROCESS_KEY(SCANCODE_KEYPADENTER, joypads [0], SNES_START_MASK) PROCESS_KEY(SCANCODE_KEYPADPLUS, joypads [0], SNES_SELECT_MASK) PROCESS_KEY(SCANCODE_INSERT, joypads [0], SNES_X_MASK) PROCESS_KEY(SCANCODE_REMOVE, joypads [0], SNES_Y_MASK) PROCESS_KEY(SCANCODE_HOME, joypads [0], SNES_A_MASK) PROCESS_KEY(SCANCODE_END, joypads [0], SNES_B_MASK) PROCESS_KEY(SCANCODE_PAGEUP, joypads [0], SNES_TL_MASK) PROCESS_KEY(SCANCODE_PAGEDOWN, joypads [0], SNES_TR_MASK) if (KEY_PRESS (SCANCODE_0)) Settings.DisableHDMA = !Settings.DisableHDMA; if (KEY_PRESS (SCANCODE_1)) PPU.BG_Forced ^= 1; if (KEY_PRESS (SCANCODE_2)) PPU.BG_Forced ^= 2; if (KEY_PRESS (SCANCODE_3)) PPU.BG_Forced ^= 4; if (KEY_PRESS (SCANCODE_4)) PPU.BG_Forced ^= 8; if (KEY_PRESS (SCANCODE_5)) PPU.BG_Forced ^= 16; if (KEY_PRESS (SCANCODE_6)) Settings.SwapJoypads = !Settings.SwapJoypads; if (KEY_PRESS (SCANCODE_7)) { if (IPPU.Controller == SNES_SUPERSCOPE) show_mouse (NULL); S9xNextController (); if (IPPU.Controller == SNES_SUPERSCOPE) show_mouse (screen); } if (KEY_PRESS (SCANCODE_8)) Settings.BGLayering = !Settings.BGLayering; if (KEY_PRESS (SCANCODE_9)) if (Settings.SixteenBit) Settings.Transparency = !Settings.Transparency; if (KEY_PRESS(SCANCODE_TAB)) superscope_turbo = !superscope_turbo; PROCESS_KEY(SCANCODE_GRAVE, superscope_pause, 1); if (KEY_PRESS(SCANCODE_F1)) fn = 1; if (KEY_PRESS(SCANCODE_F2)) fn = 2; if (KEY_PRESS(SCANCODE_F3)) fn = 3; if (KEY_PRESS(SCANCODE_F4)) fn = 4; if (KEY_PRESS(SCANCODE_F5)) fn = 5; if (KEY_PRESS(SCANCODE_F6)) fn = 6; if (KEY_PRESS(SCANCODE_F7)) fn = 7; if (KEY_PRESS(SCANCODE_F8)) fn = 8; if (KEY_PRESS(SCANCODE_F9)) fn = 9; if (KEY_PRESS(SCANCODE_F10)) fn = 10; if (KEY_PRESS(SCANCODE_F11)) fn = 11; if (KEY_PRESS(SCANCODE_F12)) fn = 12; if (fn > 0) { if (!KEY_DOWN(SCANCODE_LEFTALT) && !KEY_DOWN(SCANCODE_LEFTSHIFT)) { if (fn == 11) { S9xLoadSnapshot (S9xChooseFilename (TRUE)); } else if (fn == 12) { Snapshot (S9xChooseFilename (FALSE)); } else { char def [PATH_MAX]; char filename [PATH_MAX]; char drive [_MAX_DRIVE]; char dir [_MAX_DIR]; char ext [_MAX_EXT]; _splitpath (Memory.ROMFilename, drive, dir, def, ext); sprintf (filename, "%s%s%s.%03d", S9xGetSnapshotDirectory (), SLASH_STR, def, fn - 1); S9xLoadSnapshot (filename); } } else if (KEY_DOWN(SCANCODE_LEFTALT)) { if (fn >= 4) S9xToggleSoundChannel (fn - 4); #ifdef DEBUGGER else if (fn == 1) CPU.Flags |= DEBUG_MODE_FLAG; #endif else if (fn == 2) S9xLoadSnapshot (S9xChooseFilename (TRUE)); else if (fn == 3) Snapshot (S9xChooseFilename (FALSE)); } else { char def [PATH_MAX]; char filename [PATH_MAX]; char drive [_MAX_DRIVE]; char dir [_MAX_DIR]; char ext [_MAX_EXT]; _splitpath (Memory.ROMFilename, drive, dir, def, ext); sprintf (filename, "%s%s%s.%03d", S9xGetSnapshotDirectory (), SLASH_STR, def, fn - 1); Snapshot (filename); } } if (KEY_PRESS (SCANCODE_BREAK) || KEY_PRESS (SCANCODE_BREAK_ALTERNATIVE) || KEY_PRESS (SCANCODE_SCROLLLOCK)) Settings.Paused ^= 1; if (KEY_PRESS (SCANCODE_PRINTSCREEN)) SaveScreenshot (); if (KEY_PRESS (SCANCODE_MINUS)) { if (Settings.SkipFrames <= 1) Settings.SkipFrames = AUTO_FRAMERATE; else if (Settings.SkipFrames != AUTO_FRAMERATE) Settings.SkipFrames--; } if (KEY_PRESS (SCANCODE_EQUAL)) { if (Settings.SkipFrames == AUTO_FRAMERATE) Settings.SkipFrames = 1; else if (Settings.SkipFrames < 10) Settings.SkipFrames++; } memcpy (prev_keystate, keystate, sizeof (prev_keystate)); if (block) __dpmi_yield (); }