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;a get_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;a get_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;a get_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 }