www.pudn.com > sn068s.zip > EMUGUI.CPP


/* 
 
 EmuGUI.cc 
  Contains emulator specific GUI code 
  Some stuff from helper.c will be moved here! 
 
*/ 
 
#define VAR_CYCLE_RATIO 
 
#include  
#include  
 
#include  
#include "guicore.h" 
 
/* ------------------------- GUI STUFF ------------------------- */ 
 
#include "types.h" 
#include "font.h" 
#include "CPU.h" 
#include "SPC.h" 
#include "sound.h" 
#include "romload.h" 
#include "debug.h" 
#include "snes.h" 
 
BITMAP *joypad=0; 
extern PALETTE sneesepal; 
 
extern SCREEN screenmodes[9]; 
 
// Used to configure the screen and set internal variables for rendering! 
BITMAP *SetGUIScreen(int ScreenMode) 
{ 
 if (Allegro_Bitmap)    // If bitmap exists destroy it 
  destroy_bitmap(Allegro_Bitmap); 
 
 if (screenmodes[SCREEN_MODE = ScreenMode].set()) 
 { 
  switch(ScreenMode) 
  { 
   case 0: 
   case 1: 
   case 3: 
    return (BITMAP *) 0; 
    break; 
   default: 
    if (screenmodes[SCREEN_MODE = 0].set()) return (BITMAP *) 0; 
  } 
 } 
 
 ScreenX = screenmodes[SCREEN_MODE].w; 
 ScreenY = screenmodes[SCREEN_MODE].h; 
 
 Allegro_Bitmap = create_bitmap(ScreenX, ScreenY); 
 if (!Allegro_Bitmap) return (BITMAP *) 0; 
 clear(Allegro_Bitmap); 
 SNES_Screen = (unsigned char *) Allegro_Bitmap->line[0]; 
 Reload_Bitmaps();  // We reload to convert to correct bit depth 
 
 return Allegro_Bitmap; 
} 
 
const char *GUI_init() 
{ 
 char *errormsg; 
 
 if (!SetGUIScreen(SCREEN_MODE))    // SCREEN_MODE set by config file 
 { 
  return "Failure creating GUI bitmap!\n"; 
 } 
 
 errormsg = GUI_core_init(); 
 
 if (errormsg) return errormsg; 
 
 if (joypad) destroy_bitmap(joypad); 
 #ifdef DEBUG 
  joypad = load_pcx("sneese.dat#joypad",sneesepal); 
 #else 
  joypad = p("#joypad",sneesepal); 
 #endif 
 
 return 0; 
} 
 
WINDOW *GUI_window=0; 
 
extern BITMAP *sneese; 
 
WINDOW *Main_window=0; 
#define NUM_OPTIONS 9 
char *Options[NUM_OPTIONS]={ 
 "Resume emulation", 
 "Reset emulation", 
 "Load ROM", 
 "Configure", 
 "ROM information", 
 "HW status", 
 "(H)DMA status", 
 "Voice status", 
 "Exit SNEeSe :("}; 
 
WINDOW *Credits_window=0; 
 
void UpdateGUI(int Selected) 
{ 
 clear(GUI_Bitmap); 
 Main_window->refresh(); 
 for(int a=0;aget_heightspace()*a,16); 
  else PlotSelectedMenuItem(Main_window,default_font,Options[a],0,default_font->get_heightspace()*a,16); 
 Credits_window->refresh(); 
 PlotString(Credits_window,default_font," Code by: Charles Bilyue'      ",0,0); 
 PlotString(Credits_window,default_font,"          Brad Martin          ",0,default_font->get_heightspace()); 
 PlotString(Credits_window,default_font," Logo by: neptron              ",0,default_font->get_heightspace()*2); 
 
#ifndef NO_LOGO 
 if(sneese) 
  stretch_blit(sneese,Allegro_Bitmap,0,0,GUI_ScreenWidth,GUI_ScreenHeight,0,0,SCREEN_W,SCREEN_H); 
#endif 
 draw_sprite(Allegro_Bitmap,GUI_Bitmap,0,0); 
 vsync(); 
} 
 
WINDOW *Screen_window=0; 
#define NUM_SCREEN_OPTIONS 9 
char *Screen_Options[NUM_SCREEN_OPTIONS]={ 
 "320x200x256 VGA", 
 "320x200x256 VGA  FIT", 
 "320x240x256 MODE-X", 
 "256x239x256 VGA", 
 "320x200x16b VESA2", 
 "320x240x16b VESA2", 
 "640x480x16b VESA2", 
 "640x480x16b VESA2 FIT", 
 "320x240x256 VESA2"}; 
 
void UpdateScreenWindow(int Selected) 
{ 
 Screen_window->refresh(); 
 for(int a=0;aget_heightspace()*a,20); 
  else PlotSelectedMenuItem(Screen_window,default_font,Screen_Options[a],0,default_font->get_heightspace()*a,20); 
#ifndef NO_LOGO 
 if(sneese) 
  stretch_blit(sneese,Allegro_Bitmap,0,0,GUI_ScreenWidth,GUI_ScreenHeight,0,0,SCREEN_W,SCREEN_H); 
#endif 
 draw_sprite(Allegro_Bitmap,GUI_Bitmap,0,0); 
 vsync(); 
 CopyGUIScreen(); 
} 
 
int ScreenWindow() 
{ 
 int CursorAt = SCREEN_MODE; 
 int keypress, key_asc, key_scan; 
 clear_keybuf(); 
 
 for(;;) 
 { 
  UpdateScreenWindow(CursorAt); 
  while (!keypressed()); 
  keypress = readkey(); 
  key_asc = keypress & 0xFF; 
  key_scan = keypress >> 8; 
 
  switch (key_scan) 
  { 
   case KEY_UP: 
    if(CursorAt) CursorAt--; else CursorAt=NUM_SCREEN_OPTIONS-1; 
    break; 
   case KEY_DOWN: 
    if(CursorAt < NUM_SCREEN_OPTIONS-1) CursorAt++; else CursorAt=0; 
    break; 
   case KEY_ESC: 
    return -1; 
   case KEY_ENTER: 
    return CursorAt; 
  } 
 } 
 return -1; // Signify normal exit 
} 
 
char min_frameskip_str[] = "Min Frameskip: ???????"; 
char max_frameskip_str[] = "Max Frameskip: ???????"; 
 
char sample_size_str[] = "Sample size: xx-bit"; 
 
WINDOW *Config_window=0; 
#ifdef VAR_CYCLE_RATIO 
#define NUM_CONFIG_OPTIONS 14 
 
extern unsigned long SPC_CPU_cycle_divisor, SPC_CPU_cycle_multiplicand; 
char spc_div_str[] = "SPC div: ???????"; 
char spc_mul_str[] = "SPC mul: ???????"; 
char fps_counter_str[] = "FPS counter: off"; 
 
#else 
#define NUM_CONFIG_OPTIONS 12 
#endif 
const char *Config_Options[NUM_CONFIG_OPTIONS]={ 
 0,                             // screen mode 
 min_frameskip_str, 
 max_frameskip_str, 
 "-------- on player 1",        // controls: first player 
 "-------- on player 2",        // controls: second player 
 "Define keys for player 1", 
 "Define keys for player 2", 
 0,                             // SPC enable setting 
 0,                             // Sound enable setting 
 sample_size_str,               // Sound sample size 
 "ENVX reading: off", 
#ifdef VAR_CYCLE_RATIO 
 fps_counter_str, 
 spc_div_str, 
 spc_mul_str 
#else 
 "FPS counter: off" 
#endif 
}; 
 
 
char *on_off[2]={ "off", "on" }; 
char *en_dis[2]={ "enabled", "disabled" }; 
 
void UpdateConfigWindow(int Selected) 
{ 
 Config_window->refresh(); 
 for(int a=0;aget_heightspace()*a,24); 
  else PlotSelectedMenuItem(Config_window,default_font,Config_Options[a],0,default_font->get_heightspace()*a,24); 
#ifndef NO_LOGO 
 if(sneese) 
  stretch_blit(sneese,Allegro_Bitmap,0,0,GUI_ScreenWidth,GUI_ScreenHeight,0,0,SCREEN_W,SCREEN_H); 
#endif 
 draw_sprite(Allegro_Bitmap,GUI_Bitmap,0,0); 
 vsync(); 
 CopyGUIScreen(); 
} 
 
WINDOW *ControlSetup_window=0; 
 
void UpdateController1Screen() 
{ 
 char tempch[5]; 
 
 ControlSetup_window->refresh(); 
 
 scantotext(KEY_UP_1,tempch); 
 PlotStringShadow(ControlSetup_window,default_font,tempch,38,31,15,8); 
 scantotext(KEY_DOWN_1,tempch); 
 PlotStringShadow(ControlSetup_window,default_font,tempch,38,65,15,8); 
 scantotext(KEY_LEFT_1,tempch); 
 PlotStringShadow(ControlSetup_window,default_font,tempch,20,48,15,8); 
 scantotext(KEY_RIGHT_1,tempch); 
 PlotStringShadow(ControlSetup_window,default_font,tempch,55,48,15,8); 
 scantotext(KEY_A_1,tempch); 
 PlotStringShadow(ControlSetup_window,default_font,tempch,151,46,15,8); 
 scantotext(KEY_B_1,tempch); 
 PlotStringShadow(ControlSetup_window,default_font,tempch,130,69,15,8); 
 scantotext(KEY_X_1,tempch); 
 PlotStringShadow(ControlSetup_window,default_font,tempch,127,25,15,8); 
 scantotext(KEY_Y_1,tempch); 
 PlotStringShadow(ControlSetup_window,default_font,tempch,104,49,15,8); 
 scantotext(KEY_L_1,tempch); 
 PlotStringShadow(ControlSetup_window,default_font,tempch,40,1,15,8); 
 scantotext(KEY_R_1,tempch); 
 PlotStringShadow(ControlSetup_window,default_font,tempch,127,1,15,8); 
 scantotext(KEY_SELECT_1,tempch); 
 PlotStringShadow(ControlSetup_window,default_font,tempch,68,40,15,8); 
 scantotext(KEY_START_1,tempch); 
 PlotStringShadow(ControlSetup_window,default_font,tempch,91,40,15,8); 
} 
 
void UpdateController2Screen() 
{ 
 char tempch[5]; 
 
 ControlSetup_window->refresh(); 
 
 scantotext(KEY_UP_2,tempch); 
 PlotStringShadow(ControlSetup_window,default_font,tempch,38,31,15,8); 
 scantotext(KEY_DOWN_2,tempch); 
 PlotStringShadow(ControlSetup_window,default_font,tempch,38,65,15,8); 
 scantotext(KEY_LEFT_2,tempch); 
 PlotStringShadow(ControlSetup_window,default_font,tempch,20,48,15,8); 
 scantotext(KEY_RIGHT_2,tempch); 
 PlotStringShadow(ControlSetup_window,default_font,tempch,55,48,15,8); 
 scantotext(KEY_A_2,tempch); 
 PlotStringShadow(ControlSetup_window,default_font,tempch,151,46,15,8); 
 scantotext(KEY_B_2,tempch); 
 PlotStringShadow(ControlSetup_window,default_font,tempch,130,69,15,8); 
 scantotext(KEY_X_2,tempch); 
 PlotStringShadow(ControlSetup_window,default_font,tempch,127,25,15,8); 
 scantotext(KEY_Y_2,tempch); 
 PlotStringShadow(ControlSetup_window,default_font,tempch,104,49,15,8); 
 scantotext(KEY_L_2,tempch); 
 PlotStringShadow(ControlSetup_window,default_font,tempch,40,1,15,8); 
 scantotext(KEY_R_2,tempch); 
 PlotStringShadow(ControlSetup_window,default_font,tempch,127,1,15,8); 
 scantotext(KEY_SELECT_2,tempch); 
 PlotStringShadow(ControlSetup_window,default_font,tempch,68,40,15,8); 
 scantotext(KEY_START_2,tempch); 
 PlotStringShadow(ControlSetup_window,default_font,tempch,91,40,15,8); 
} 
 
signed char lastkeypress_locked = 0; 
void (*lastkeypress_chain)(int scancode); 
volatile int last_scancode; 
volatile signed char last_scancode_valid; 
 
static void lastkeypress_callback(int scancode) 
{ 
 if (!(scancode & 0x80)) 
 { 
  last_scancode = scancode; 
  last_scancode_valid = -1; 
 } 
 if (lastkeypress_chain) lastkeypress_chain(scancode); 
} 
END_OF_STATIC_FUNCTION(lastkeypress_callback); 
 
int lastkeypressed() 
{ 
 if (!last_scancode_valid) return 0; 
 last_scancode_valid = 0; 
 return last_scancode; 
} 
 
int AskKey(char *msg, unsigned *whatkey, int jp) 
{ 
 unsigned tmp; 
 
 if (!lastkeypress_locked) 
 { 
  LOCK_VARIABLE(lastkeypress_chain); 
  LOCK_VARIABLE(last_scancode); 
  LOCK_VARIABLE(last_scancode_valid); 
  LOCK_FUNCTION((void *)lastkeypress_callback); 
  lastkeypress_locked = -1; 
 } 
 
 lastkeypress_chain = keyboard_lowlevel_callback; 
 keyboard_lowlevel_callback = lastkeypress_callback; 
 
 PlotStringShadow(ControlSetup_window,default_font,msg,84,96,15,8); 
 
#ifndef NO_LOGO 
 if(sneese) 
  stretch_blit(sneese,Allegro_Bitmap,0,0,GUI_ScreenWidth,GUI_ScreenHeight,0,0,SCREEN_W,SCREEN_H); 
#endif 
 draw_sprite(Allegro_Bitmap,GUI_Bitmap,0,0); 
 CopyGUIScreen(); 
 
 do tmp = lastkeypressed(); while (!tmp); 
 if (keypressed()) readkey(); /* throw away the key */ 
 
 keyboard_lowlevel_callback = lastkeypress_chain; 
 
 if(tmp==KEY_ESC) return FALSE; 
 
 *whatkey=tmp; 
 
 if(jp==1) UpdateController1Screen(); 
 else UpdateController2Screen(); 
 
 return TRUE; 
} 
 
extern "C" unsigned char FPS_ENABLED; 
 
int ConfigWindow() 
{ 
 int temp; 
 
 Config_Options[0] = Screen_Options[SCREEN_MODE]; 
 
 switch(JOYSTICK_ENABLED) 
 { 
  case 1: 
// Config_Options[3] = "Joystick on player 1"; 
// JOYSTICK_ENABLED=1; 
// break; 
  case 2: 
   if (mouse_available) 
   { 
    Config_Options[3] = "Mouse on player 1"; 
    JOYSTICK_ENABLED=2; 
    break; 
   } 
  default: 
   Config_Options[3] = "Keyboard on player 1"; 
   JOYSTICK_ENABLED=0; 
 } 
 
 switch(JOYSTICK_ENABLED2) 
 { 
  case 1: 
// Config_Options[4] = "Joystick on player 2"; 
// JOYSTICK_ENABLED2=1; 
// break; 
  case 2: 
   if (mouse_available) 
   { 
    Config_Options[4] = "Mouse on player 2"; 
    JOYSTICK_ENABLED2=2; 
    break; 
   } 
  default: 
   Config_Options[4] = "Keyboard on player 2"; 
   JOYSTICK_ENABLED2=0; 
 } 
 
 if(SPC_ENABLED) Config_Options[7] = "Emulate SPC"; 
 else Config_Options[7] = "Skip SPC"; 
 
 switch (sound_enabled) 
 { 
  case 0: 
   Config_Options[8] = "Sound Disabled"; 
   break; 
  case 1: 
   Config_Options[8] = "Sound Enabled (mono)"; 
   break; 
  default: 
   Config_Options[8] = "Sound Enabled (stereo)"; 
 } 
 
 if (ENVX_ENABLED) Config_Options[10] = "ENVX reading: on"; 
 else Config_Options[11] = "ENVX reading: off"; 
 
 if (FPS_ENABLED) sprintf(fps_counter_str, "FPS counter: on"); 
 else sprintf(fps_counter_str, "FPS counter: off"); 
 
 sprintf(min_frameskip_str, "Min Frameskip: %-2d", FRAME_SKIP_MIN); 
 sprintf(max_frameskip_str, "Max Frameskip: %-2d", FRAME_SKIP_MAX); 
 
 sprintf(sample_size_str, "Sample size: %2d-bit", sound_bits); 
 
#ifdef VAR_CYCLE_RATIO 
 sprintf(spc_div_str, "SPC div: %-7ld", SPC_CPU_cycle_divisor); 
 sprintf(spc_mul_str, "SPC mul: %-7ld", SPC_CPU_cycle_multiplicand); 
#endif 
 
 int CursorAt=0; 
 int keypress, key_asc, key_scan; 
 clear_keybuf(); 
 
 for(;;) 
 { 
  UpdateConfigWindow(CursorAt); 
  while (!keypressed()); 
  keypress = readkey(); 
  key_asc = keypress & 0xFF; 
  key_scan = keypress >> 8; 
 
  switch (key_scan) 
  { 
   case KEY_UP: 
    CursorAt--; 
    if(CursorAt == -1) // so it wraps 
     CursorAt = NUM_CONFIG_OPTIONS-1; 
    break; 
   case KEY_DOWN: 
    CursorAt++; 
    if(CursorAt == NUM_CONFIG_OPTIONS) // so it wraps 
    CursorAt=0; 
    break; 
 
  // For frameskip! 
   case KEY_LEFT: 
    if (CursorAt == 1 && FRAME_SKIP_MIN > 0) 
    { 
     // 60,30,20,15,10-0 
     if(FRAME_SKIP_MIN>30) FRAME_SKIP_MIN-=30; 
     else if(FRAME_SKIP_MIN>20) FRAME_SKIP_MIN-=10; 
     else if(FRAME_SKIP_MIN>10) FRAME_SKIP_MIN-=5; 
     else FRAME_SKIP_MIN--; 
 
     if(FRAME_SKIP_MIN>FRAME_SKIP_MAX) 
     { 
      FRAME_SKIP_MAX=FRAME_SKIP_MIN; 
      sprintf(max_frameskip_str, "Max Frameskip: %-2d", FRAME_SKIP_MAX); 
     } 
     sprintf(min_frameskip_str, "Min Frameskip: %-2d", FRAME_SKIP_MIN); 
     break; 
    } 
 
    if (CursorAt == 2 && FRAME_SKIP_MAX > 1) 
    { 
     // 60,30,20,15,10-0 
     if(FRAME_SKIP_MAX>30) FRAME_SKIP_MAX-=30; 
     else if(FRAME_SKIP_MAX>20) FRAME_SKIP_MAX-=10; 
     else if(FRAME_SKIP_MAX>10) FRAME_SKIP_MAX-=5; 
     else FRAME_SKIP_MAX--; 
 
     if(FRAME_SKIP_MAX 1) 
    { 
     SPC_CPU_cycle_divisor--; 
     sprintf(spc_div_str, "SPC div: %-7ld", SPC_CPU_cycle_divisor); 
     break; 
    } 
 
    if (CursorAt == 13 && SPC_CPU_cycle_multiplicand > 1) 
    { 
     SPC_CPU_cycle_multiplicand--; 
     sprintf(spc_mul_str, "SPC mul: %-7ld", SPC_CPU_cycle_multiplicand); 
     break; 
    } 
#endif 
 
    break; 
 
   case KEY_RIGHT: 
    if (CursorAt == 1 && FRAME_SKIP_MIN < 60) 
    { 
     // 0-10,15,20,30,60 
     if(FRAME_SKIP_MIN<10) FRAME_SKIP_MIN++; 
     else if(FRAME_SKIP_MIN<20) FRAME_SKIP_MIN+=5; 
     else if(FRAME_SKIP_MIN<30) FRAME_SKIP_MIN+=10; 
     else FRAME_SKIP_MIN+=30; 
 
     if(FRAME_SKIP_MIN>FRAME_SKIP_MAX) 
     { 
      FRAME_SKIP_MAX=FRAME_SKIP_MIN; 
      sprintf(max_frameskip_str, "Max Frameskip: %-2d", FRAME_SKIP_MAX); 
     } 
     sprintf(min_frameskip_str, "Min Frameskip: %-2d", FRAME_SKIP_MIN); 
     break; 
    } 
 
    if (CursorAt == 2 && FRAME_SKIP_MAX < 60) 
    { 
     // 0-10,15,20,30,60 
     if(FRAME_SKIP_MAX<10) FRAME_SKIP_MAX++; 
     else if(FRAME_SKIP_MAX<20) FRAME_SKIP_MAX+=5; 
     else if(FRAME_SKIP_MAX<30) FRAME_SKIP_MAX+=10; 
     else FRAME_SKIP_MAX+=30; 
 
     if(FRAME_SKIP_MAX> 8) == KEY_ESC) break; 
      } 
     } 
 
     UpdateGUI(3); 
     break; 
    } 
 
    if (CursorAt == 6) 
    { 
     clear_keybuf(); 
     UpdateController2Screen(); 
 
     if (AskKey("Press key for UP",&KEY_UP_2,2)==TRUE) 
     if (AskKey("Press key for DOWN",&KEY_DOWN_2,2)==TRUE) 
     if (AskKey("Press key for LEFT",&KEY_LEFT_2,2)==TRUE) 
     if (AskKey("Press key for RIGHT",&KEY_RIGHT_2,2)==TRUE) 
     if (AskKey("Press key for A",&KEY_A_2,2)==TRUE) 
     if (AskKey("Press key for B",&KEY_B_2,2)==TRUE) 
     if (AskKey("Press key for X",&KEY_X_2,2)==TRUE) 
     if (AskKey("Press key for Y",&KEY_Y_2,2)==TRUE) 
     if (AskKey("Press key for L",&KEY_L_2,2)==TRUE) 
     if (AskKey("Press key for R",&KEY_R_2,2)==TRUE) 
     if (AskKey("Press key for SELECT",&KEY_SELECT_2,2)==TRUE) 
     if (AskKey("Press key for START",&KEY_START_2,2)==TRUE) 
     { 
      PlotStringShadow(ControlSetup_window,default_font,"Press ESC to exit",84,96,15,8); 
#ifndef NO_LOGO 
      if(sneese) 
       stretch_blit(sneese,Allegro_Bitmap,0,0,GUI_ScreenWidth,GUI_ScreenHeight,0,0,SCREEN_W,SCREEN_H); 
#endif 
      draw_sprite(Allegro_Bitmap,GUI_Bitmap,0,0); 
      CopyGUIScreen(); 
 
      for (;;) 
      { 
       while (!keypressed()); 
       if ((readkey() >> 8) == KEY_ESC) break; 
      } 
     } 
 
     UpdateGUI(3); 
     break; 
    } 
 
    if (CursorAt == 7) 
    { 
     if (SPC_ENABLED) 
     { 
      Config_Options[7] = "Skip SPC"; 
      SPC_ENABLED = 0; 
     } else { 
      Config_Options[7] = "Emulate SPC"; 
      SPC_ENABLED = 1; 
     } 
    } 
 
    if (CursorAt == 8) 
    { 
     switch(sound_enabled) 
     { 
      case 0: 
       if (Install_Sound(0)) 
       { 
        Config_Options[8] = "Sound Enabled (mono)"; 
       } 
       break; 
      case 1: 
       Remove_Sound(); 
       if (Install_Sound(1)) 
       { 
        Config_Options[8] = "Sound Enabled (stereo)"; 
       } 
       else 
       { 
        Config_Options[8] = "Sound Disabled"; 
       } 
       break; 
      case 2: 
       Remove_Sound(); 
       Config_Options[8] = "Sound Disabled"; 
     } 
    } 
 
    if (CursorAt == 9) 
    { 
     sound_bits = sound_bits == 16 ? 8 : 16; 
     sprintf(sample_size_str, "Sample size: %2d-bit", sound_bits); 
 
     switch(sound_enabled) 
     { 
      case 0: 
       Config_Options[8] = "Sound Disabled"; 
       break; 
 
      case 1: 
       Remove_Sound(); 
       if (Install_Sound(0)) 
       { 
        Config_Options[8] = "Sound Enabled (mono)"; 
       } 
       else 
       { 
        Config_Options[8] = "Sound Disabled"; 
       } 
       break; 
 
      case 2: 
       Remove_Sound(); 
       if (Install_Sound(1)) 
       { 
        Config_Options[8] = "Sound Enabled (stereo)"; 
       } 
       else 
       { 
        Config_Options[8] = "Sound Disabled"; 
       } 
     } 
 
    } 
 
    if (CursorAt == 10) 
    { 
     Config_Options[10] = (ENVX_ENABLED ^= -1) ? 
      "ENVX reading: on" : "ENVX reading: off"; 
    } 
 
    if (CursorAt == 11) 
    { 
     sprintf(fps_counter_str, (FPS_ENABLED ^= -1) ? 
      "FPS counter: on" : "FPS counter: off"); 
    } 
 
  } 
 } 
 return 1;          // Signify normal exit 
} 
 
WINDOW *ROMInfo_window=0; 
 
void RomInfo(void) 
{ 
 ROMInfo_window->refresh(); 
 
 PlotString(ROMInfo_window,default_font,"File name: ",0,0); 
 PlotString(ROMInfo_window,default_font,rom_romfile,default_font->get_widthspace()*11,0); 
 
 PlotString(ROMInfo_window,default_font,"ROM title: ",0,default_font->get_heightspace()); 
 PlotString(ROMInfo_window,default_font,rom_romname,default_font->get_widthspace()*11,default_font->get_heightspace()); 
 
 PlotString(ROMInfo_window,default_font,"ROM type: ",0,default_font->get_heightspace()*2); 
 PlotString(ROMInfo_window,default_font,rom_romtype,default_font->get_widthspace()*10,default_font->get_heightspace()*2); 
 
 PlotString(ROMInfo_window,default_font,rom_romhilo,0,default_font->get_heightspace()*3); 
 
 PlotString(ROMInfo_window,default_font,"ROM size: ",0,default_font->get_heightspace()*4); 
 PlotString(ROMInfo_window,default_font,rom_romsize,default_font->get_widthspace()*10,default_font->get_heightspace()*4); 
 
 PlotString(ROMInfo_window,default_font,"SRAM size: ",0,default_font->get_heightspace()*5); 
 PlotString(ROMInfo_window,default_font,rom_sram,default_font->get_widthspace()*11,default_font->get_heightspace()*5); 
 
 PlotString(ROMInfo_window,default_font,"Country: ",0,default_font->get_heightspace()*6); 
 PlotString(ROMInfo_window,default_font,rom_country,default_font->get_widthspace()*9,default_font->get_heightspace()*6); 
 
#ifndef NO_LOGO 
 if(sneese) 
  stretch_blit(sneese,Allegro_Bitmap,0,0,GUI_ScreenWidth,GUI_ScreenHeight,0,0,SCREEN_W,SCREEN_H); 
#endif 
 draw_sprite(Allegro_Bitmap,GUI_Bitmap,0,0); 
 vsync(); 
 CopyGUIScreen(); 
 
 for (;;) 
 { 
  while (!keypressed()); 
  if ((readkey() >> 8) == KEY_ESC) break; 
 } 
} 
 
extern "C" unsigned char BGMODE,VMAIN,OBSEL,HiSprite; 
extern "C" unsigned char W12SEL,W34SEL,WOBJSEL,WH0,WH1,WH2,WH3; 
extern "C" unsigned char TM,TS,TMW,TSW,WBGLOG,WOBJLOG,CGWSEL,CGADSUB; 
 
WINDOW *HWStatus_window=0; 
 
EXTERN unsigned char Win1_Count_In, Win1_Count_Out; 
EXTERN unsigned char Win2_Count_In, Win2_Count_Out; 
EXTERN unsigned char Win1_Bands_In[2], Win1_Bands_Out[4]; 
EXTERN unsigned char Win2_Bands_In[2], Win2_Bands_Out[4]; 
 
void HWStatus(void) 
{ 
 char Number[5]; 
 
 HWStatus_window->refresh(); 
 PlotString(HWStatus_window,default_font,"65c816 A:#### X:#### Y:#### DB:##",0,0); 
 sprintf(Number, "%04X", cpu_65c816_A); 
 PlotString(HWStatus_window,default_font,Number,default_font->get_widthspace()*9,0); 
 sprintf(Number, "%04X", cpu_65c816_X); 
 PlotString(HWStatus_window,default_font,Number,default_font->get_widthspace()*16,0); 
 sprintf(Number, "%04X", cpu_65c816_Y); 
 PlotString(HWStatus_window,default_font,Number,default_font->get_widthspace()*23,0); 
 sprintf(Number, "%02X", (unsigned) cpu_65c816_DB); 
 PlotString(HWStatus_window,default_font,Number,default_font->get_widthspace()*31,0); 
 PlotString(HWStatus_window,default_font,"PB:## PC:#### S:#### D:#### P:###",0,default_font->get_heightspace()); 
 sprintf(Number, "%02X", (unsigned) cpu_65c816_PB); 
 PlotString(HWStatus_window,default_font,Number,default_font->get_widthspace()*3,default_font->get_heightspace()); 
 sprintf(Number, "%04X", cpu_65c816_PC); 
 PlotString(HWStatus_window,default_font,Number,default_font->get_widthspace()*9,default_font->get_heightspace()); 
 sprintf(Number, "%04X", cpu_65c816_S); 
 PlotString(HWStatus_window,default_font,Number,default_font->get_widthspace()*16,default_font->get_heightspace()); 
 sprintf(Number, "%04X", cpu_65c816_D); 
 PlotString(HWStatus_window,default_font,Number,default_font->get_widthspace()*23,default_font->get_heightspace()); 
// sprintf(Number, "%03X", cpu_65c816_P&0x1FF); 
// PlotString(HWStatus_window,default_font,Number,default_font->get_widthspace()*30,default_font->get_heightspace()); 
 PlotString(HWStatus_window,default_font,"OLD_PB:## OLD_PC:#### OBSEL:## ##",0,default_font->get_heightspace()*2); 
 sprintf(Number, "%02X", (unsigned) OLD_PB); 
 PlotString(HWStatus_window,default_font,Number,default_font->get_widthspace()*7,default_font->get_heightspace()*2); 
 sprintf(Number, "%04X", OLD_PC); 
 PlotString(HWStatus_window,default_font,Number,default_font->get_widthspace()*17,default_font->get_heightspace()*2); 
 sprintf(Number, "%02X",(unsigned) OBSEL); 
 PlotString(HWStatus_window,default_font,Number,default_font->get_widthspace()*28,default_font->get_heightspace()*2); 
 sprintf(Number, "%02X",(unsigned) HiSprite); 
 PlotString(HWStatus_window,default_font,Number,default_font->get_widthspace()*31,default_font->get_heightspace()*2); 
 
 PlotString(HWStatus_window,default_font,"BGMODE:## VMAIN:## TM:## TS:##",0,default_font->get_heightspace()*3); 
 sprintf(Number, "%02X", (unsigned) BGMODE); 
 PlotString(HWStatus_window,default_font,Number,default_font->get_widthspace()*7,default_font->get_heightspace()*3); 
 sprintf(Number, "%02X", (unsigned) VMAIN); 
 PlotString(HWStatus_window,default_font,Number,default_font->get_widthspace()*16,default_font->get_heightspace()*3); 
 sprintf(Number, "%02X", (unsigned) TM); 
 PlotString(HWStatus_window,default_font,Number,default_font->get_widthspace()*22,default_font->get_heightspace()*3); 
 sprintf(Number, "%02X", (unsigned) TS); 
 PlotString(HWStatus_window,default_font,Number,default_font->get_widthspace()*28,default_font->get_heightspace()*3); 
 PlotString(HWStatus_window,default_font,"WH0: ## WH1: ## WH2: ## WH3: ##",0,default_font->get_heightspace()*4); 
 sprintf(Number, "%02X", (unsigned) WH0); 
 PlotString(HWStatus_window,default_font,Number,default_font->get_widthspace()*5,default_font->get_heightspace()*4); 
 sprintf(Number, "%02X", (unsigned) WH1); 
 PlotString(HWStatus_window,default_font,Number,default_font->get_widthspace()*13,default_font->get_heightspace()*4); 
 sprintf(Number, "%02X", (unsigned) WH2); 
 PlotString(HWStatus_window,default_font,Number,default_font->get_widthspace()*21,default_font->get_heightspace()*4); 
 sprintf(Number, "%02X", (unsigned) WH3); 
 PlotString(HWStatus_window,default_font,Number,default_font->get_widthspace()*29,default_font->get_heightspace()*4); 
 PlotString(HWStatus_window,default_font,"TMW: ## TSW: ## WSEL: ## ## ##",0,default_font->get_heightspace()*5); 
 sprintf(Number, "%02X", (unsigned) TMW); 
 PlotString(HWStatus_window,default_font,Number,default_font->get_widthspace()*5,default_font->get_heightspace()*5); 
 sprintf(Number, "%02X", (unsigned) TSW); 
 PlotString(HWStatus_window,default_font,Number,default_font->get_widthspace()*13,default_font->get_heightspace()*5); 
 sprintf(Number, "%02X", (unsigned) W12SEL); 
 PlotString(HWStatus_window,default_font,Number,default_font->get_widthspace()*22,default_font->get_heightspace()*5); 
 sprintf(Number, "%02X", (unsigned) W34SEL); 
 PlotString(HWStatus_window,default_font,Number,default_font->get_widthspace()*25,default_font->get_heightspace()*5); 
 sprintf(Number, "%02X", (unsigned) WOBJSEL); 
 PlotString(HWStatus_window,default_font,Number,default_font->get_widthspace()*28,default_font->get_heightspace()*5); 
 
 PlotString(HWStatus_window,default_font,"WLOG:## ## CGWSEL:## CGADSUB:##",0,default_font->get_heightspace()*6); 
 sprintf(Number, "%02X", (unsigned) WBGLOG); 
 PlotString(HWStatus_window,default_font,Number,default_font->get_widthspace()*5,default_font->get_heightspace()*6); 
 sprintf(Number, "%02X", (unsigned) WOBJLOG); 
 PlotString(HWStatus_window,default_font,Number,default_font->get_widthspace()*8,default_font->get_heightspace()*6); 
 sprintf(Number, "%02X", (unsigned) CGWSEL); 
 PlotString(HWStatus_window,default_font,Number,default_font->get_widthspace()*18,default_font->get_heightspace()*6); 
 sprintf(Number, "%02X", (unsigned) CGADSUB); 
 PlotString(HWStatus_window,default_font,Number,default_font->get_widthspace()*29,default_font->get_heightspace()*6); 
 
 PlotString(HWStatus_window,default_font,"Win1:# ## ## # ## ## ## ##",0,default_font->get_heightspace()*7); 
 sprintf(Number, "%1X", (unsigned) Win1_Count_In); 
 PlotString(HWStatus_window,default_font,Number,default_font->get_widthspace()*5,default_font->get_heightspace()*7); 
 sprintf(Number, "%02X", (unsigned) Win1_Bands_In[0]); 
 PlotString(HWStatus_window,default_font,Number,default_font->get_widthspace()*7,default_font->get_heightspace()*7); 
 sprintf(Number, "%02X", (unsigned) Win1_Bands_In[1]); 
 PlotString(HWStatus_window,default_font,Number,default_font->get_widthspace()*10,default_font->get_heightspace()*7); 
 sprintf(Number, "%1X", (unsigned) Win1_Count_Out); 
 PlotString(HWStatus_window,default_font,Number,default_font->get_widthspace()*13,default_font->get_heightspace()*7); 
 sprintf(Number, "%02X", (unsigned) Win1_Bands_Out[0]); 
 PlotString(HWStatus_window,default_font,Number,default_font->get_widthspace()*15,default_font->get_heightspace()*7); 
 sprintf(Number, "%02X", (unsigned) Win1_Bands_Out[1]); 
 PlotString(HWStatus_window,default_font,Number,default_font->get_widthspace()*18,default_font->get_heightspace()*7); 
 sprintf(Number, "%02X", (unsigned) Win1_Bands_Out[2]); 
 PlotString(HWStatus_window,default_font,Number,default_font->get_widthspace()*21,default_font->get_heightspace()*7); 
 sprintf(Number, "%02X", (unsigned) Win1_Bands_Out[3]); 
 PlotString(HWStatus_window,default_font,Number,default_font->get_widthspace()*24,default_font->get_heightspace()*7); 
 
 PlotString(HWStatus_window,default_font,"Win2:# ## ## # ## ## ## ##",0,default_font->get_heightspace()*8); 
 sprintf(Number, "%1X", (unsigned) Win2_Count_In); 
 PlotString(HWStatus_window,default_font,Number,default_font->get_widthspace()*5,default_font->get_heightspace()*8); 
 sprintf(Number, "%02X", (unsigned) Win2_Bands_In[0]); 
 PlotString(HWStatus_window,default_font,Number,default_font->get_widthspace()*7,default_font->get_heightspace()*8); 
 sprintf(Number, "%02X", (unsigned) Win2_Bands_In[1]); 
 PlotString(HWStatus_window,default_font,Number,default_font->get_widthspace()*10,default_font->get_heightspace()*8); 
 sprintf(Number, "%1X", (unsigned) Win2_Count_Out); 
 PlotString(HWStatus_window,default_font,Number,default_font->get_widthspace()*13,default_font->get_heightspace()*8); 
 sprintf(Number, "%02X", (unsigned) Win2_Bands_Out[0]); 
 PlotString(HWStatus_window,default_font,Number,default_font->get_widthspace()*15,default_font->get_heightspace()*8); 
 sprintf(Number, "%02X", (unsigned) Win2_Bands_Out[1]); 
 PlotString(HWStatus_window,default_font,Number,default_font->get_widthspace()*18,default_font->get_heightspace()*8); 
 sprintf(Number, "%02X", (unsigned) Win2_Bands_Out[2]); 
 PlotString(HWStatus_window,default_font,Number,default_font->get_widthspace()*21,default_font->get_heightspace()*8); 
 sprintf(Number, "%02X", (unsigned) Win2_Bands_Out[3]); 
 PlotString(HWStatus_window,default_font,Number,default_font->get_widthspace()*24,default_font->get_heightspace()*8); 
 
#ifndef NO_LOGO 
 if(sneese) 
  stretch_blit(sneese,Allegro_Bitmap,0,0,GUI_ScreenWidth,GUI_ScreenHeight,0,0,SCREEN_W,SCREEN_H); 
#endif 
 draw_sprite(Allegro_Bitmap,GUI_Bitmap,0,0); 
 vsync(); 
 CopyGUIScreen(); 
 
 for (;;) 
 { 
  while (!keypressed()); 
  if ((readkey() >> 8) == KEY_ESC) break; 
 } 
} 
 
extern "C" unsigned char MDMAEN; 
extern "C" unsigned char HDMAEN; 
extern "C" unsigned char DMAP_0, DMAP_1, DMAP_2, DMAP_3; 
extern "C" unsigned char DMAP_4, DMAP_5, DMAP_6, DMAP_7; 
extern "C" unsigned char BBAD_0, BBAD_1, BBAD_2, BBAD_3; 
extern "C" unsigned char BBAD_4, BBAD_5, BBAD_6, BBAD_7; 
extern "C" unsigned char A1TL_0, A1TL_1, A1TL_2, A1TL_3; 
extern "C" unsigned char A1TL_4, A1TL_5, A1TL_6, A1TL_7; 
extern "C" unsigned char A1TH_0, A1TH_1, A1TH_2, A1TH_3; 
extern "C" unsigned char A1TH_4, A1TH_5, A1TH_6, A1TH_7; 
extern "C" unsigned char A1B_0, A1B_1, A1B_2, A1B_3; 
extern "C" unsigned char A1B_4, A1B_5, A1B_6, A1B_7; 
extern "C" unsigned char DASL_0, DASL_1, DASL_2, DASL_3; 
extern "C" unsigned char DASL_4, DASL_5, DASL_6, DASL_7; 
extern "C" unsigned char DASH_0, DASH_1, DASH_2, DASH_3; 
extern "C" unsigned char DASH_4, DASH_5, DASH_6, DASH_7; 
extern "C" unsigned char DASB_0, DASB_1, DASB_2, DASB_3; 
extern "C" unsigned char DASB_4, DASB_5, DASB_6, DASB_7; 
extern "C" unsigned char A2L_0, A2L_1, A2L_2, A2L_3; 
extern "C" unsigned char A2L_4, A2L_5, A2L_6, A2L_7; 
extern "C" unsigned char A2H_0, A2H_1, A2H_2, A2H_3; 
extern "C" unsigned char A2H_4, A2H_5, A2H_6, A2H_7; 
extern "C" unsigned char A2B_0, A2B_1, A2B_2, A2B_3; 
extern "C" unsigned char A2B_4, A2B_5, A2B_6, A2B_7; 
 
WINDOW *DMAStatus_window=0; 
 
void DMAStatus(void) 
{ 
 char Line[34]; 
 
 DMAStatus_window->refresh(); 
 sprintf(Line,"MDMAEN:%02X HDMAEN:%02X", 
  (unsigned) MDMAEN, (unsigned) HDMAEN); 
 PlotString(DMAStatus_window,default_font,Line,0,0); 
 
 sprintf(Line,"%02X %02X %02X%02X%02X %02X%02X%02X %02X%02X%02X", 
 (unsigned) DMAP_0,(unsigned) BBAD_0, 
 (unsigned) A1B_0,(unsigned) A1TH_0,(unsigned) A1TL_0, 
 (unsigned) A2B_0,(unsigned) A2H_0,(unsigned) A2L_0, 
 (unsigned) DASB_0,(unsigned) DASH_0,(unsigned) DASL_0); 
 PlotString(DMAStatus_window,default_font,Line,0,default_font->get_heightspace()); 
 
 sprintf(Line,"%02X %02X %02X%02X%02X %02X%02X%02X %02X%02X%02X", 
 (unsigned) DMAP_1,(unsigned) BBAD_1, 
 (unsigned) A1B_1,(unsigned) A1TH_1,(unsigned) A1TL_1, 
 (unsigned) A2B_1,(unsigned) A2H_1,(unsigned) A2L_1, 
 (unsigned) DASB_1,(unsigned) DASH_1,(unsigned) DASL_1); 
 PlotString(DMAStatus_window,default_font,Line,0,default_font->get_heightspace()*2); 
 
 sprintf(Line,"%02X %02X %02X%02X%02X %02X%02X%02X %02X%02X%02X", 
 (unsigned) DMAP_2,(unsigned) BBAD_2, 
 (unsigned) A1B_2,(unsigned) A1TH_2,(unsigned) A1TL_2, 
 (unsigned) A2B_2,(unsigned) A2H_2,(unsigned) A2L_2, 
 (unsigned) DASB_2,(unsigned) DASH_2,(unsigned) DASL_2); 
 PlotString(DMAStatus_window,default_font,Line,0,default_font->get_heightspace()*3); 
 
 sprintf(Line,"%02X %02X %02X%02X%02X %02X%02X%02X %02X%02X%02X", 
 (unsigned) DMAP_3,(unsigned) BBAD_3, 
 (unsigned) A1B_3,(unsigned) A1TH_3,(unsigned) A1TL_3, 
 (unsigned) A2B_3,(unsigned) A2H_3,(unsigned) A2L_3, 
 (unsigned) DASB_3,(unsigned) DASH_3,(unsigned) DASL_3); 
 PlotString(DMAStatus_window,default_font,Line,0,default_font->get_heightspace()*4); 
 
 sprintf(Line,"%02X %02X %02X%02X%02X %02X%02X%02X %02X%02X%02X", 
 (unsigned) DMAP_4,(unsigned) BBAD_4, 
 (unsigned) A1B_4,(unsigned) A1TH_4,(unsigned) A1TL_4, 
 (unsigned) A2B_4,(unsigned) A2H_4,(unsigned) A2L_4, 
 (unsigned) DASB_4,(unsigned) DASH_4,(unsigned) DASL_4); 
 PlotString(DMAStatus_window,default_font,Line,0,default_font->get_heightspace()*5); 
 
 sprintf(Line,"%02X %02X %02X%02X%02X %02X%02X%02X %02X%02X%02X", 
 (unsigned) DMAP_5,(unsigned) BBAD_5, 
 (unsigned) A1B_5,(unsigned) A1TH_5,(unsigned) A1TL_5, 
 (unsigned) A2B_5,(unsigned) A2H_5,(unsigned) A2L_5, 
 (unsigned) DASB_5,(unsigned) DASH_5,(unsigned) DASL_5); 
 PlotString(DMAStatus_window,default_font,Line,0,default_font->get_heightspace()*6); 
 
 sprintf(Line,"%02X %02X %02X%02X%02X %02X%02X%02X %02X%02X%02X", 
 (unsigned) DMAP_6,(unsigned) BBAD_6, 
 (unsigned) A1B_6,(unsigned) A1TH_6,(unsigned) A1TL_6, 
 (unsigned) A2B_6,(unsigned) A2H_6,(unsigned) A2L_6, 
 (unsigned) DASB_6,(unsigned) DASH_6,(unsigned) DASL_6); 
 PlotString(DMAStatus_window,default_font,Line,0,default_font->get_heightspace()*7); 
 
 sprintf(Line,"%02X %02X %02X%02X%02X %02X%02X%02X %02X%02X%02X", 
 (unsigned) DMAP_7,(unsigned) BBAD_7, 
 (unsigned) A1B_7,(unsigned) A1TH_7,(unsigned) A1TL_7, 
 (unsigned) A2B_7,(unsigned) A2H_7,(unsigned) A2L_7, 
 (unsigned) DASB_7,(unsigned) DASH_7,(unsigned) DASL_7); 
 PlotString(DMAStatus_window,default_font,Line,0,default_font->get_heightspace()*8); 
 
#ifndef NO_LOGO 
 if(sneese) 
  stretch_blit(sneese,Allegro_Bitmap,0,0,GUI_ScreenWidth,GUI_ScreenHeight,0,0,SCREEN_W,SCREEN_H); 
#endif 
 draw_sprite(Allegro_Bitmap,GUI_Bitmap,0,0); 
 vsync(); 
 CopyGUIScreen(); 
 
 for (;;) 
 { 
  while (!keypressed()); 
  if ((readkey() >> 8) == KEY_ESC) break; 
 } 
} 
 
WINDOW *APUStatus_window=0; 
 
void APUStatus(void) 
{ 
 char Line[34]; 
 int v,i; 
 
 APUStatus_window->refresh(); 
 sprintf(Line,"SNDkeys:%02X", (unsigned) SNDkeys); 
 PlotString(APUStatus_window,default_font,Line,0,0); 
 
 for (v = 0; v < 8; v++) 
 { 
  for (i = 0; i < 16; i++) 
  { 
   sprintf(Line,"%02X", (unsigned) SPC_DSP[i + (v << 4)]); 
   PlotString(APUStatus_window,default_font,Line, 
   i * 3 * default_font->get_widthspace(), 
   (v + 1) * default_font->get_heightspace()); 
  } 
 } 
 
#ifndef NO_LOGO 
 if(sneese) 
  stretch_blit(sneese,Allegro_Bitmap,0,0,GUI_ScreenWidth,GUI_ScreenHeight,0,0,SCREEN_W,SCREEN_H); 
#endif 
 draw_sprite(Allegro_Bitmap,GUI_Bitmap,0,0); 
 vsync(); 
 CopyGUIScreen(); 
 
 for (;;) 
 { 
  while (!keypressed()); 
  if ((readkey() >> 8) == KEY_ESC) break; 
 } 
} 
 
CTL *joypad_bitmap=0; 
 
CTL_CLEAR GUI_clear; 
CTL_CLEAR Main_clear; 
CTL_CLEAR Credits_clear; 
CTL_CLEAR Screen_clear; 
CTL_CLEAR Config_clear; 
CTL_CLEAR ControlSetup_clear; 
CTL_CLEAR ROMInfo_clear; 
CTL_CLEAR HWStatus_clear; 
CTL_CLEAR DMAStatus_clear; 
CTL_CLEAR APUStatus_clear; 
CTL_CLEAR File_clear; 
 
int allocate_windows() 
{ 
 static int file_cleared=0; 
 if(!file_cleared) File_window+=File_clear; 
 
 GUI_window=new BORDER_WINDOW(-1,-1,320,240); 
 Main_window=new BORDER_WINDOW(0,0,16*default_font->get_widthspace(),NUM_OPTIONS*default_font->get_heightspace()); 
 Credits_window=new BORDER_WINDOW(10,160,32*default_font->get_widthspace(),3*default_font->get_heightspace()); 
 Screen_window=new BORDER_WINDOW(100,30,21*default_font->get_widthspace(),NUM_SCREEN_OPTIONS*default_font->get_heightspace()); 
 Config_window=new BORDER_WINDOW(70,15,24*default_font->get_widthspace(),NUM_CONFIG_OPTIONS*default_font->get_heightspace()); 
 ControlSetup_window=new BORDER_WINDOW(29,34,168,104); 
 ROMInfo_window=new BORDER_WINDOW(10,70,33*default_font->get_widthspace(),7*default_font->get_heightspace()); 
 HWStatus_window=new BORDER_WINDOW(10,70,33*default_font->get_widthspace(),9*default_font->get_heightspace()); 
 DMAStatus_window=new BORDER_WINDOW(10,70,33*default_font->get_widthspace(),9*default_font->get_heightspace()); 
 APUStatus_window=new BORDER_WINDOW(8,70,48*default_font->get_widthspace(),9*default_font->get_heightspace()); 
 if(!(GUI_window && Main_window && Credits_window && 
    Screen_window && Config_window && ControlSetup_window && 
    ROMInfo_window && HWStatus_window && DMAStatus_window && 
    APUStatus_window)) return 1; 
 *GUI_window+=GUI_clear; 
 *Main_window+=Main_clear; 
 *Credits_window+=Credits_clear; 
 *Screen_window+=Screen_clear; 
 *Config_window+=Config_clear; 
 *ControlSetup_window+=ControlSetup_clear; 
 if(joypad) 
  joypad_bitmap=new CTL_BITMAP(ControlSetup_window,joypad,7,12); 
 *ROMInfo_window+=ROMInfo_clear; 
 *HWStatus_window+=HWStatus_clear; 
 *DMAStatus_window+=DMAStatus_clear; 
 *APUStatus_window+=APUStatus_clear; 
 return 0; 
} 
 
void free_windows() 
{ 
 delete GUI_window; 
 delete Main_window; delete Credits_window; 
 delete joypad_bitmap; 
 delete Screen_window; delete Config_window; delete ControlSetup_window; 
 delete ROMInfo_window; delete HWStatus_window; delete DMAStatus_window; 
 delete APUStatus_window; 
 
 GUI_window=0; 
 Main_window=0; Credits_window=0; 
 joypad_bitmap=0; 
 Screen_window=0; Config_window=0; ControlSetup_window=0; 
 ROMInfo_window=0; HWStatus_window=0; DMAStatus_window=0; 
 APUStatus_window=0; 
} 
 
extern volatile unsigned Timer_Counter_Throttle; 
extern volatile unsigned Timer_Counter_Profile; 
 
GUI_ERROR GUI() 
{ 
 unsigned char OLD_SPC_ENABLED=SPC_ENABLED; 
 
 if (allocate_windows()) return GUI_EXIT; 
 
#ifndef NO_LOGO 
 if (sneese) 
 { // Prevent a crash if file not found! 
  set_palette(sneesepal); 
  stretch_blit(sneese,Allegro_Bitmap,0,0,GUI_ScreenWidth,GUI_ScreenHeight,0,0,SCREEN_W,SCREEN_H); 
 } 
#endif 
 
 set_palette_range(&GUIPal[-240],240,255,1);    // Set the GUI palette up. 
 
 clear_keybuf(); 
 
 int CursorAt = 0; 
 
 for(;;) 
 { 
  int keypress, key_asc, key_scan; 
 
  UpdateGUI(CursorAt); 
  CopyGUIScreen(); 
  while (!keypressed()); 
  keypress = readkey(); 
  key_asc = keypress & 0xFF; 
  key_scan = keypress >> 8; 
 
  switch (key_scan) 
  { 
   case KEY_UP: 
    CursorAt--; 
    if(CursorAt == -1) // so it wraps 
     CursorAt = NUM_OPTIONS-1; 
    break; 
 
   case KEY_DOWN: 
    CursorAt++; 
    if(CursorAt == NUM_OPTIONS) // so it wraps 
     CursorAt=0; 
    break; 
 
   case KEY_ESC: 
    if (snes_rom_loaded) 
    { 
     while (key[KEY_ESC]); 
     goto resume_emulation; 
    } 
    break; 
 
  case KEY_ENTER: 
   if(snes_rom_loaded) 
   { 
    if (CursorAt == 0) goto resume_emulation; 
    if (CursorAt == 1) 
    { 
     snes_reset(); 
     goto resume_emulation; 
    } 
 
    if (CursorAt == 4) 
     RomInfo(); 
 
    if (CursorAt == 5) 
     HWStatus(); 
 
    if (CursorAt == 6) 
     DMAStatus(); 
 
    if (CursorAt == 7) 
     APUStatus(); 
   } 
 
   if (CursorAt == 2) 
   { 
    char TempBufferP[MAXPATH]; // For saving the current directory to use! 
 
    getcwd(TempBufferP,MAXPATH); 
    if (FileWindow() == 0) 
    { 
     chdir(TempBufferP); 
     goto resume_emulation; 
    } 
    chdir(TempBufferP); 
    break; 
   } 
 
   if (CursorAt == 3) 
    ConfigWindow(); 
   if (CursorAt == 8) 
   { 
    free_windows(); 
    return GUI_EXIT; 
   } 
  } 
 } 
 
 resume_emulation: 
 
 // Reset the SNES if the SPC has been enabled, and it wasn't before 
 if(snes_rom_loaded && SPC_ENABLED && (SPC_ENABLED!=OLD_SPC_ENABLED)) 
 { 
  snes_reset(); 
 } 
 
 clear(screen); 
 clear(Allegro_Bitmap); 
 
 free_windows(); 
 return GUI_CONTINUE;   // Signify normal exit 
}