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


//#define NO_GUI 
/* DOS platform-specific code */ 
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include  
void   __crt0_load_environment_file(char *_app_name){} 
char **__crt0_glob_function(char *_arg){ return 0; } 
 
#ifdef DEBUG 
int _crt0_startup_flags = _CRT0_FLAG_FILL_DEADBEEF; 
#endif 
 
#include  
 
#define GUI_DEFAULT 1 
 
BEGIN_COLOR_DEPTH_LIST 
 COLOR_DEPTH_8 
 COLOR_DEPTH_15 
 COLOR_DEPTH_16 
END_COLOR_DEPTH_LIST 
 
#include "platform.h" 
#include "helper.h" 
#include "romload.h" 
#include "sound.h" 
#include "cpu.h" 
#include "guicore.h" 
 
char cfg_name[MAXPATH]; 
char home_dir[MAXPATH]; 
char dat_name[MAXPATH]; 
 
void LoadConfig_Old(void) 
{ 
 const char default_keymap[] = "2D 27 29 2B  5  4 17 13 11  1 41 42"; 
 char keymapbuf[41]; 
 
 SCREEN_MODE = get_config_int(NULL, "screenmode", 2); 
 if (SCREEN_MODE > 8) SCREEN_MODE = 0; 
 
 /* 1-10,15,20,30,60 */ 
 FRAME_SKIP_MAX = get_config_int(NULL, "maxframeskip", 60); 
 if (FRAME_SKIP_MAX > 60) FRAME_SKIP_MAX = 60; 
 else if (FRAME_SKIP_MAX > 30 && FRAME_SKIP_MAX < 60) FRAME_SKIP_MAX = 30; 
 else if (FRAME_SKIP_MAX > 20 && FRAME_SKIP_MAX < 30) FRAME_SKIP_MAX = 20; 
 else if (FRAME_SKIP_MAX > 15 && FRAME_SKIP_MAX < 20) FRAME_SKIP_MAX = 15; 
 else if (FRAME_SKIP_MAX > 10 && FRAME_SKIP_MAX < 15) FRAME_SKIP_MAX = 10; 
 else if (FRAME_SKIP_MAX < 1) FRAME_SKIP_MAX = 1; 
 
 /* 0-10,15,20,30,60 */ 
 FRAME_SKIP_MIN = get_config_int(NULL, "minframeskip", 0); 
 if (FRAME_SKIP_MIN > 60) FRAME_SKIP_MIN = 60; 
 else if (FRAME_SKIP_MIN > 30 && FRAME_SKIP_MIN < 60) FRAME_SKIP_MIN = 30; 
 else if (FRAME_SKIP_MIN > 20 && FRAME_SKIP_MIN < 30) FRAME_SKIP_MIN = 20; 
 else if (FRAME_SKIP_MIN > 15 && FRAME_SKIP_MIN < 20) FRAME_SKIP_MIN = 15; 
 else if (FRAME_SKIP_MIN > 10 && FRAME_SKIP_MIN < 15) FRAME_SKIP_MIN = 10; 
 if (FRAME_SKIP_MIN > FRAME_SKIP_MAX) FRAME_SKIP_MIN = FRAME_SKIP_MAX; 
 
 JOYSTICK_ENABLED = get_config_int(NULL, "joystick", 0); 
 if (JOYSTICK_ENABLED > 2 || (JOYSTICK_ENABLED == 2 && !mouse_available)) 
  JOYSTICK_ENABLED = 0; 
 
 JOYSTICK_ENABLED2 = get_config_int(NULL, "joystick2", 0); 
 if (JOYSTICK_ENABLED2 > 2 || (JOYSTICK_ENABLED2 == 2 && !mouse_available)) 
  JOYSTICK_ENABLED2 = 0; 
 
 SPC_ENABLED = get_config_int(NULL, "emulatespc", 1); 
 
 memset(save_extension, 0, MAXEXT); 
 strncpy(save_extension, get_config_string(NULL, "saveextension", "SRM"), MAXEXT - 1); 
 
 memset(save_dir, 0, MAXPATH); 
 strncpy(save_dir, get_config_string(NULL, "savedirectory", ""), MAXPATH - 1); 
 
 sound_enabled = get_config_int(NULL, "outputsound", 2); 
 if (sound_enabled > 2) sound_enabled = 0; 
 
 memset(keymapbuf, 0, 41); 
 strncpy(keymapbuf, get_config_string(NULL, "snes_pad_1_keys", default_keymap), 40); 
 if ( 
  sscanf(keymapbuf, "%X%X%X%X%X%X%X%X%X%X%X%X", 
   &KEY_UP_1, &KEY_DOWN_1, &KEY_LEFT_1, &KEY_RIGHT_1, 
   &KEY_A_1, &KEY_B_1, &KEY_X_1, &KEY_Y_1, &KEY_L_1, &KEY_R_1, 
   &KEY_SELECT_1, &KEY_START_1) < 12) 
 { 
  sscanf(default_keymap, "%X%X%X%X%X%X%X%X%X%X%X%X", 
   &KEY_UP_1, &KEY_DOWN_1, &KEY_LEFT_1, &KEY_RIGHT_1, 
   &KEY_A_1, &KEY_B_1, &KEY_X_1, &KEY_Y_1, &KEY_L_1, &KEY_R_1, 
   &KEY_SELECT_1, &KEY_START_1); 
 } 
 
 strncpy(keymapbuf, get_config_string(NULL, "snes_pad_2_keys", default_keymap), 40); 
 if ( 
  sscanf(keymapbuf, "%X%X%X%X%X%X%X%X%X%X%X%X", 
   &KEY_UP_2, &KEY_DOWN_2, &KEY_LEFT_2, &KEY_RIGHT_2, 
   &KEY_A_2, &KEY_B_2, &KEY_X_2, &KEY_Y_2, &KEY_L_2, &KEY_R_2, 
   &KEY_SELECT_2, &KEY_START_2) < 12) 
 { 
  sscanf(default_keymap, "%X%X%X%X%X%X%X%X%X%X%X%X", 
   &KEY_UP_2, &KEY_DOWN_2, &KEY_LEFT_2, &KEY_RIGHT_2, 
   &KEY_A_2, &KEY_B_2, &KEY_X_2, &KEY_Y_2, &KEY_L_2, &KEY_R_2, 
   &KEY_SELECT_2, &KEY_START_2); 
 } 
 
} 
 
static float cfg_version; 
static int cfg_changed; 
 
/* Allegro internal var */ 
extern int _sound_hq; 
 
void LoadConfigCurrent(void) 
{ 
 char default_keymap[] = "2D 27 29 2B  5  4 17 13 11  1 41 42"; 
 char keymapbuf[41]; 
 
 SCREEN_MODE = get_config_int("display", "screenmode", 2); 
 if (SCREEN_MODE > 8) SCREEN_MODE = 0; 
 
 display_process = (DISPLAY_PROCESS) get_config_int("display", "process", SDP_NONE); 
 if ((unsigned) display_process >= NUM_DISPLAY_PROCESSES) 
  display_process = SDP_NONE; 
 
 stretch_x = get_config_int("display", "stretch_x", 0); 
 stretch_y = get_config_int("display", "stretch_y", 0); 
 
 /* 1-10,15,20,30,60 */ 
 FRAME_SKIP_MAX = get_config_int("display", "maxframeskip", 60); 
 if (FRAME_SKIP_MAX > 60) FRAME_SKIP_MAX = 60; 
 else if (FRAME_SKIP_MAX > 30 && FRAME_SKIP_MAX < 60) FRAME_SKIP_MAX = 30; 
 else if (FRAME_SKIP_MAX > 20 && FRAME_SKIP_MAX < 30) FRAME_SKIP_MAX = 20; 
 else if (FRAME_SKIP_MAX > 15 && FRAME_SKIP_MAX < 20) FRAME_SKIP_MAX = 15; 
 else if (FRAME_SKIP_MAX > 10 && FRAME_SKIP_MAX < 15) FRAME_SKIP_MAX = 10; 
 else if (FRAME_SKIP_MAX < 1) FRAME_SKIP_MAX = 1; 
 
 /* 0-10,15,20,30,60 */ 
 FRAME_SKIP_MIN = get_config_int("display", "minframeskip", 0); 
 if (FRAME_SKIP_MIN > 60) FRAME_SKIP_MIN = 60; 
 else if (FRAME_SKIP_MIN > 30 && FRAME_SKIP_MIN < 60) FRAME_SKIP_MIN = 30; 
 else if (FRAME_SKIP_MIN > 20 && FRAME_SKIP_MIN < 30) FRAME_SKIP_MIN = 20; 
 else if (FRAME_SKIP_MIN > 15 && FRAME_SKIP_MIN < 20) FRAME_SKIP_MIN = 15; 
 else if (FRAME_SKIP_MIN > 10 && FRAME_SKIP_MIN < 15) FRAME_SKIP_MIN = 10; 
 if (FRAME_SKIP_MIN > FRAME_SKIP_MAX) FRAME_SKIP_MIN = FRAME_SKIP_MAX; 
 
 memset(save_extension, 0, MAXEXT); 
 strncpy(save_extension, get_config_string("paths", "saveextension", "SRM"), MAXEXT - 1); 
 
 memset(save_dir, 0, MAXPATH); 
 strncpy(save_dir, get_config_string("paths", "savedirectory", ""), MAXPATH - 1); 
 
 SPC_ENABLED = get_config_int("hardware", "emulatespc", 1); 
 
 sound_enabled = get_config_int("hardware", "outputsound", 2); 
 if (sound_enabled > 2) sound_enabled = 0; 
 
 sound_bits = get_config_int("audio", "sound_bits", 16); 
 if (sound_bits != 8) sound_bits = 16; 
 
 _sound_hq = get_config_int("audio", "sound_hq", 1); 
 if (_sound_hq < 0 || _sound_hq > 2) _sound_hq = 1; 
 
 JOYSTICK_ENABLED = get_config_int("input", "joystick", 0); 
 if (JOYSTICK_ENABLED > 2 || (JOYSTICK_ENABLED == 2 && !mouse_available)) 
  JOYSTICK_ENABLED = 0; 
 
 JOYSTICK_ENABLED2 = get_config_int("input", "joystick2", 0); 
 if (JOYSTICK_ENABLED2 > 2 || (JOYSTICK_ENABLED2 == 2 && !mouse_available)) 
  JOYSTICK_ENABLED2 = 0; 
 
 memset(keymapbuf, 0, 41); 
 strncpy(keymapbuf, get_config_string("input", "snes_pad_1_keys", default_keymap), 40); 
 if ( 
  sscanf(keymapbuf, "%X%X%X%X%X%X%X%X%X%X%X%X", 
   &KEY_UP_1, &KEY_DOWN_1, &KEY_LEFT_1, &KEY_RIGHT_1, 
   &KEY_A_1, &KEY_B_1, &KEY_X_1, &KEY_Y_1, &KEY_L_1, &KEY_R_1, 
   &KEY_SELECT_1, &KEY_START_1) < 12) 
 { 
  sscanf(default_keymap, "%X%X%X%X%X%X%X%X%X%X%X%X", 
   &KEY_UP_1, &KEY_DOWN_1, &KEY_LEFT_1, &KEY_RIGHT_1, 
   &KEY_A_1, &KEY_B_1, &KEY_X_1, &KEY_Y_1, &KEY_L_1, &KEY_R_1, 
   &KEY_SELECT_1, &KEY_START_1); 
 } 
 
 strncpy(keymapbuf, get_config_string("input", "snes_pad_2_keys", default_keymap), 40); 
 if ( 
  sscanf(keymapbuf, "%X%X%X%X%X%X%X%X%X%X%X%X", 
   &KEY_UP_2, &KEY_DOWN_2, &KEY_LEFT_2, &KEY_RIGHT_2, 
   &KEY_A_2, &KEY_B_2, &KEY_X_2, &KEY_Y_2, &KEY_L_2, &KEY_R_2, 
   &KEY_SELECT_2, &KEY_START_2) < 12) 
 { 
  sscanf(default_keymap, "%X%X%X%X%X%X%X%X%X%X%X%X", 
   &KEY_UP_2, &KEY_DOWN_2, &KEY_LEFT_2, &KEY_RIGHT_2, 
   &KEY_A_2, &KEY_B_2, &KEY_X_2, &KEY_Y_2, &KEY_L_2, &KEY_R_2, 
   &KEY_SELECT_2, &KEY_START_2); 
 } 
} 
 
int LoadConfig(void) 
{ 
 cfg_version = get_config_float("base", "version", 0); 
 if (((int) (cfg_version * 8192)) != ((int) (SNEESE_VERSION * 8192))) 
 { 
  char c_expected, c_pressed; 
  srand(rawclock()); 
  printf("Have you read and agreed to the license in the readme.txt file?\n"); 
  while (c_expected = rand(), !isalnum(c_expected) || !isascii(c_expected) || isspace(c_expected)); 
  c_expected = toupper(c_expected); 
  printf("Press \'%c\' to agree, any other key to exit.\n", c_expected); 
  printf("Usage of this program constitutes agreement with the license.\n"); 
 
  remove_keyboard(); 
  c_pressed = getch(); 
  install_keyboard(); 
  if (toupper(c_pressed) != c_expected) 
  { 
   cfg_version = 0; 
   return 1; 
  } 
 
//handle old version cfg files 
  if (cfg_version == 0) 
  { 
   LoadConfig_Old(); 
   display_process = SDP_NONE; 
   stretch_x = 0; 
   stretch_y = 0; 
  } 
  else 
  { 
   LoadConfigCurrent(); 
  } 
 
  cfg_version = SNEESE_VERSION; 
  cfg_changed = (0 - 1); 
 } 
 else 
 { 
  LoadConfigCurrent(); 
 } 
 
 return 0; 
} 
 
void SaveConfig(void) 
{ 
 FILE *cfg = fopen(cfg_name, "wb"); 
 
 if (cfg == NULL) return; 
 fprintf(cfg,"# SNEeSe Configuration file\r\n"); 
 fprintf(cfg,"\r\n"); 
 fprintf(cfg,"# Do not edit [base] section, or all settings may be lost!\r\n"); 
 fprintf(cfg,"\r\n"); 
 fprintf(cfg, "[base]\r\n"); 
 fprintf(cfg, "version=%s\r\n", SNEESE_VERSION_STR); 
 fprintf(cfg, "\r\n"); 
 fprintf(cfg, "# Important paths and file-related settings\r\n"); 
 fprintf(cfg, "[paths]\r\n"); 
 fprintf(cfg, "saveextension=%s\r\n", save_extension); 
 fprintf(cfg, "savedirectory=%s\r\n", save_dir); 
 fprintf(cfg, "\r\n"); 
 fprintf(cfg, "# Display settings\r\n"); 
 fprintf(cfg, "[display]\r\n"); 
 fprintf(cfg, "# Available screen modes:\r\n"); 
 fprintf(cfg, "#  0:320x200x256 VGA       1:320x200x256 VGA FIT   2:320x240x256 MODE-X\r\n"); 
 fprintf(cfg, "#  3:256x239x256 VGA       4:320x200x16b VESA2     5:320x240x16b VESA2\r\n"); 
 fprintf(cfg, "#  6:640x480x16b VESA2     7:640x480x16b VESA2 FIT 8:320x240x256 VESA2\r\n"); 
 fprintf(cfg, "screenmode=%d\r\n", SCREEN_MODE); 
 fprintf(cfg, "\r\n"); 
 
 fprintf(cfg, "# Available screen processing methods:\r\n"); 
 fprintf(cfg, "#  0:none\r\n"); 
 fprintf(cfg, "process=%d\r\n", (int) display_process); 
 fprintf(cfg, "\r\n"); 
 
 fprintf(cfg, "# Stretch in horizontal (x) or vertical (y) directions:\r\n"); 
 fprintf(cfg, "#  0:no stretch   1:stretch\r\n"); 
 fprintf(cfg, "stretch_x=%d\r\n", stretch_x); 
 fprintf(cfg, "stretch_y=%d\r\n", stretch_y); 
 fprintf(cfg, "\r\n"); 
 
 fprintf(cfg, "# These specify how many frames to skip.\r\n"); 
 fprintf(cfg, "# maxframeskip sets the maximum number of frames that will be skipped before\r\n"); 
 fprintf(cfg, "#  a frame is drawn.\r\n"); 
 fprintf(cfg, "# minframeskip sets the number of frames that will always be skipped before\r\n"); 
 fprintf(cfg, "#  a frame is drawn. a min skip of 0 tells SNEeSe to wait for at least one\r\n"); 
 fprintf(cfg, "#  timer tick (50/60Hz) to have passed before emulating a frame (to slow\r\n"); 
 fprintf(cfg, "#  down machines that are running too fast)\r\n"); 
 fprintf(cfg, "# 'minframeskip' will never be above 'maxframeskip' - when loaded,\r\n"); 
 fprintf(cfg, "#  'maxframeskip' has precedence over 'minframeskip'.\r\n"); 
 fprintf(cfg, "# Setting 'minframeskip' and 'maxframeskip' to the same number effectively\r\n"); 
 fprintf(cfg, "#  disables all speed-throttling.\r\n"); 
 fprintf(cfg, "minframeskip=%d\r\n", FRAME_SKIP_MIN); 
 fprintf(cfg, "maxframeskip=%d\r\n", FRAME_SKIP_MAX); 
 fprintf(cfg, "\r\n"); 
 
 fprintf(cfg, "# Emulated hardware options\r\n"); 
 fprintf(cfg, "[hardware]\r\n"); 
 fprintf(cfg, "# The following option selects emulation of SPC (1) or APU skip (0).\r\n"); 
 fprintf(cfg, "emulatespc=%d\r\n", SPC_ENABLED); 
 fprintf(cfg, "# The following option selects whether to: (0) disable sound;\r\n"); 
 fprintf(cfg, "# (1) generate mono sound; (2) generate stereo sound.\r\n"); 
 fprintf(cfg, "# This option is ignored if SPC is disabled (emulatespc=0).\r\n"); 
 fprintf(cfg, "outputsound=%d\r\n", sound_enabled); 
 fprintf(cfg, "\r\n"); 
 
 fprintf(cfg, "# Audio output options\r\n"); 
 fprintf(cfg, "[audio]\r\n"); 
 fprintf(cfg, "# The following option selects size of audio samples output.\r\n"); 
 fprintf(cfg, "# Valid values: 8 or 16 (default).\r\n"); 
 fprintf(cfg, "sound_bits=%d\r\n", sound_bits); 
 fprintf(cfg, "# The following option selects Allegro mixing quality.\r\n"); 
 fprintf(cfg, "# 0 = fast 8-bit, 1 (default) = 16-bit, 2 = 16-bit interpolated.\r\n"); 
 fprintf(cfg, "sound_hq=%d\r\n", _sound_hq); 
 fprintf(cfg, "\r\n"); 
 
 fprintf(cfg, "# Input and controller options\r\n"); 
 fprintf(cfg, "[input]\r\n"); 
 fprintf(cfg, "# You can select joystick or keyboard (0-keyboard,1-joystick)\r\n"); 
 fprintf(cfg, "# joystick2 is used to enable joystick for controller 2\r\n"); 
 fprintf(cfg, "# enabling for both currently uses the same joystick for\r\n"); 
 fprintf(cfg, "# both, not the desired effect!\r\n"); 
 fprintf(cfg, "# Mouse can be selected (for those roms that use one!!) by using\r\n"); 
 fprintf(cfg, "# value 2 e.g. joystick = 2.\r\n"); 
 fprintf(cfg, "joystick=%d\r\n", JOYSTICK_ENABLED); 
 fprintf(cfg, "joystick2=%d\r\n", JOYSTICK_ENABLED2); 
 fprintf(cfg, "\r\n"); 
 
 fprintf(cfg, "# Here you will find the keyboard definitions for controller 1\r\n"); 
 fprintf(cfg, "# the numbers you see are scan codes, use the \"Define Keys\"\r\n"); 
 fprintf(cfg, "# option in the GUI to alter the keys, it's far easier!\r\n"); 
 fprintf(cfg, "\r\n"); 
 fprintf(cfg, "# Up Down Left Right A B X Y L R Select Start\r\n"); 
 fprintf(cfg,"snes_pad_1_keys=%X %X %X %X %X %X %X %X %X %X %X %X\r\n", 
  KEY_UP_1, KEY_DOWN_1, KEY_LEFT_1, KEY_RIGHT_1, 
  KEY_A_1, KEY_B_1, KEY_X_1, KEY_Y_1, KEY_L_1, KEY_R_1, 
  KEY_SELECT_1, KEY_START_1); 
 
 fprintf(cfg, "\r\n"); 
 fprintf(cfg, "# Player 2's keys are found here, see above.\r\n"); 
 fprintf(cfg, "snes_pad_2_keys=%X %X %X %X %X %X %X %X %X %X %X %X\r\n", 
  KEY_UP_2, KEY_DOWN_2, KEY_LEFT_2, KEY_RIGHT_2, 
  KEY_A_2, KEY_B_2, KEY_X_2, KEY_Y_2, KEY_L_2, KEY_R_2, 
  KEY_SELECT_2, KEY_START_2); 
 
 fclose(cfg); 
} 
 
void cmdhelp(void) 
{ 
 const char syntax[] = 
  "Usage: SNEeSe [switches] [romname.ext] [switches]\n" 
  "switches:\n" 
  " -fl  Force LoROM memory map\n" 
  " -fh  Force HiROM memory map\n" 
  " -fi  Force interleaved ROM (only supported for HiROM)\n" 
  " -fn  Force non-interleaved ROM\n" 
  " -fvn Force NTSC video standard\n" 
  " -fvp Force PAL video standard\n" 
  " -h   Copier header exists\n" 
  " -n   No copier header\n" 
  " -m#  Set screen mode\n" 
  " -ds  Disable sound\n" 
  " -s   Enable sound (stereo)\n" 
  " -sm  Enable sound (mono)\n" 
  " -saveext RAM     Set extension for save RAM files\n" 
  " -savedir .\\saves Set save directory\n" 
  " -fps Start with frames-per-second (FPS) counter enabled\n" 
  " -gui Enable GUI\n" 
  " -cli Disable GUI\n"; 
 
 printf("%s", syntax); 
} 
 
/* Perform platform-specific initialization */ 
int platform_init(int argc, char **argv) 
{ 
 char f_drive[MAXDRIVE], f_dir[MAXDIR], f_file[MAXFILE], f_ext[MAXEXT]; 
 
 /* Ensure stdout is not buffered */ 
 setvbuf(stdout, NULL, _IONBF, 0); 
 
 allegro_init(); 
 
 if (cpu_family < 4) 
 { 
  printf("SNEeSe requires a 486 or better!\n"); 
  return 1; 
 } 
 
 /* This helps SNEeSe find it's home directory, for .cfg/.dat file, 
  * when started from a different directory 
  * (ie, drag-and-drop via Windows Explorer) 
  */ 
 
 fnsplit(argv[0], f_drive, f_dir, f_file, f_ext); 
 
 if (!strlen(f_drive) && !strlen(f_dir)) 
 { 
  if (getcwd(home_dir, MAXPATH - 1) == NULL) 
  { 
   printf("Failure getting current directory!\n"); 
   printf("Report this immediately!\n"); 
   return 1; 
  } 
  fnsplit(home_dir, f_drive, f_dir, f_file, f_ext); 
 } 
 else 
 { 
  fnmerge(home_dir, f_drive, f_dir, "", ""); 
  chdir(home_dir); 
 } 
 
 fnmerge(cfg_name, f_drive, f_dir, "sneese", "cfg"); 
 fnmerge(dat_name, f_drive, f_dir, "sneese", "dat"); 
 
 set_config_file(cfg_name); /* Yup, config files exist */ 
 
 mouse_available = install_mouse(); 
 if (mouse_available == -1) mouse_available = 0; 
 
 install_keyboard(); 
 install_key_release_callback(); 
 
// joy_type = JOY_TYPE_6BUTTON; 
// initialise_joystick(); 
 
#ifndef NO_GUI 
#if GUI_DEFAULT 
 GUI_ENABLED = 1; 
#else 
 GUI_ENABLED = 0; 
#endif 
#endif 
 
 return 0; 
} 
 
int parse_args(int argc, char **argv, char **names, int maxnames) 
{ 
 /* Start: command line parser */ 
 
 char *tv; 
 int tc; 
 int numnames; 
 
 numnames = 0; 
 for (tc = 1; tc < argc; tc++) 
 { 
  int i; 
  tv = argv[tc]; 
  if ((*tv == '-') || (*tv == '/')) 
  { 
   switch (*(tv + 1)) 
   { 
#ifndef NO_GUI 
    case 'c': 
    case 'C': 
     if (!stricmp(tv + 1, "cli"))   /* Disable enabled GUI */ 
     { 
      GUI_ENABLED = 0; 
     } 
     else 
     { 
      printf("Invalid switch: %s\n", tv); cmdhelp(); return 1; 
     } 
     break; 
#endif 
 
    case 'd': 
    case 'D': 
     if (!stricmp(tv + 1, "ds")) 
     { 
      sound_enabled = 0; 
     } 
 
     else 
     { 
      printf("Invalid switch: %s\n", tv); cmdhelp(); return 1; 
     } 
     break; 
 
    case 'm': 
    case 'M': 
     if (sscanf(tv + 2, "%u", &i) != 1) cmdhelp(); 
     if (i > 8) cmdhelp(); 
     SCREEN_MODE = i; 
     cfg_changed = -1; 
     break; 
    case 'f': 
    case 'F': 
     switch (strlen(tv + 1)) 
     { 
      case 2: 
       switch(*(tv + 2)) 
       { 
        case 'l': case 'L':  /* Force LoROM */ 
         ROM_memory_map = HiROM; break; 
        case 'h': case 'H':  /* Force HiROM */ 
         ROM_memory_map = LoROM; break; 
        case 'n': case 'N':  /* Force non-interleaved */ 
         ROM_interleaved = Off; break; 
        case 'i': case 'I':  /* Force interleaved */ 
         ROM_interleaved = On; break; 
        default: printf("Invalid switch: %s\n", tv); cmdhelp(); return 1; 
       } 
       break; 
      case 3: 
       switch(*(tv + 2)) 
       { 
        case 'v': case 'V':  /* Force video standard */ 
         switch(*(tv + 3)) 
         { 
          case 'n': case 'N':    /* Force NTSC video standard */ 
           ROM_video_standard = NTSC_video; break; 
          case 'p': case 'P':    /* Force PAL video standard */ 
           ROM_video_standard = PAL_video; break; 
          default: printf("Invalid switch: %s\n", tv); cmdhelp(); return 1; 
         } 
         break; 
        case 'p': case 'P':  /* FPS counter */ 
         switch(*(tv + 3)) 
         { 
          case 's': case 'S':    /* FPS counter */ 
           FPS_ENABLED = (0 - 1); break; 
          default: printf("Invalid switch: %s\n", tv); cmdhelp(); return 1; 
         } 
         break; 
        default: printf("Invalid switch: %s\n", tv); cmdhelp(); return 1; 
       } 
       break; 
      default: printf("Invalid switch: %s\n", tv); cmdhelp(); return 1; 
     } 
     break; 
    case 'n': case 'N': /* Force no header */ 
     if (strlen(tv + 1) != 1) 
     { 
      printf("Invalid switch: %s\n", tv); cmdhelp(); return 1; 
     } 
     ROM_has_header = Off; break; 
    case 'h': case 'H': /* Force header */ 
     if (strlen(tv + 1) != 1) 
     { 
      printf("Invalid switch: %s\n", tv); cmdhelp(); return 1; 
     } 
     ROM_has_header = On; break; 
    case '?': 
     if (strlen(tv + 1) != 1) 
     { 
      printf("Invalid switch: %s\n", tv); 
     } 
     cmdhelp(); return 1; 
 
#ifndef NO_GUI 
    case 'g': 
    case 'G': 
     if (!stricmp(tv + 1, "gui"))   /* Enable disabled GUI */ 
     { 
      GUI_ENABLED = (0 - 1); 
     } 
     else 
     { 
      printf("Invalid switch: %s\n", tv); cmdhelp(); return 1; 
     } 
     break; 
#endif 
 
    case 's': 
    case 'S': 
     if (!stricmp(tv + 1, "savedir")) 
     { 
      if (tc + 1 >= argc) 
      { 
       printf("Invalid switch: %s\n", tv); cmdhelp(); return 1; 
      } 
 
      if (strlen(argv[tc + 1]) > MAXPATH - 1) 
      { 
       printf("Path too long: %s\n", argv[tc + 1]); cmdhelp(); return 1; 
      } 
 
      memset(save_dir, 0, MAXPATH); 
      strcpy(save_dir, argv[++tc]); 
      cfg_changed = -1; 
     } 
 
     else if (!stricmp(tv + 1, "saveext")) 
     { 
      if (tc + 1 >= argc) 
      { 
       printf("Invalid switch: %s\n", tv); cmdhelp(); return 1; 
      } 
 
      if (strlen(argv[tc + 1]) > MAXEXT - 1) 
      { 
       printf("Extension too long: %s\n", argv[tc + 1]); cmdhelp(); return 1; 
      } 
 
      memset(save_extension, 0, MAXEXT); 
      strcpy(save_extension, argv[++tc]); 
      cfg_changed = -1; 
     } 
 
     else if (!stricmp(tv + 1, "sm")) 
     { 
      sound_enabled = 1; 
     } 
 
     else if (!stricmp(tv + 1, "s")) 
     { 
      sound_enabled = 2; 
     } 
 
     else 
     { 
      printf("Invalid switch: %s\n", tv); cmdhelp(); return 1; 
     } 
     break; 
 
    default: 
     printf("Invalid switch: %s\n", tv); cmdhelp(); return 1; 
   } 
  } else { 
   if (numnames < maxnames) names[numnames++] = tv; 
   else { cmdhelp(); return 1; } 
  } 
 } 
#ifndef NO_GUI 
 if (!GUI_ENABLED) 
 { 
  if (numnames == 0) 
  { 
   if (cfg_changed == 0) cmdhelp(); 
   if (cfg_changed != 0) 
   { 
    printf("Configuration updated\n"); 
    SaveConfig(); 
   } 
   return 1; 
  } 
 } 
#endif 
 
 if (numnames < maxnames) names[numnames] = NULL; 
 
 return 0; 
 /* End: command line parser */ 
} 
 
unsigned char *platform_get_gfx_buffer( 
 int depth, int width, int height, int hslack, int vslack) 
{ 
 int needed_w, needed_h; 
 
 needed_w = width + hslack; 
 needed_h = height + vslack * 2 + (hslack ? 1 : 0); 
 
 Internal_Bitmap = create_bitmap_ex(depth, needed_w, needed_h); 
 if (!Internal_Bitmap) 
 { 
  printf("Failure creating internal render bitmap!\n"); 
  return 0; 
 } 
 
 Internal_Bitmap_blitsrc = 
  create_sub_bitmap(Internal_Bitmap, hslack, vslack, width, height); 
 if (!Internal_Bitmap_blitsrc) 
 { 
  printf("Failure creating internal render bitmap!\n"); 
  return 0; 
 } 
 
 return (unsigned char *) Internal_Bitmap_blitsrc->line[0]; 
}