From c5487fa51d7e0f00a1d02c476af54806a343f141 Mon Sep 17 00:00:00 2001 From: "fabio.olimpieri" Date: Wed, 16 Jan 2013 20:07:44 +0000 Subject: [PATCH] Autoload tap file sent with arguments, vk does not stop emulation, installation in usb device, ordering case insensitive, image fast loadind --- src/VirtualKeyboard.c | 150 ++++++++++++++++++++++++++++++++++------ src/VirtualKeyboard.h | 11 +-- src/computer.c | 157 +++++++++++++++++++++++++++++++----------- src/computer.h | 13 ++-- src/emulator.c | 88 +++++++++++++++++++---- src/emulator.h | 2 +- src/gui_sdl.c | 35 ++++++---- src/menu_sdl.c | 27 ++------ src/menu_sdl.h | 2 +- 9 files changed, 365 insertions(+), 120 deletions(-) diff --git a/src/VirtualKeyboard.c b/src/VirtualKeyboard.c index d71e135..3d0a8cc 100644 --- a/src/VirtualKeyboard.c +++ b/src/VirtualKeyboard.c @@ -51,7 +51,7 @@ extern FILE *fdebug; #endif #endif -static SDL_Surface *image_kbd, *image_sym, *image_caps,*image_kbd_small, *image_sym_small, *image_caps_small ; +static SDL_Surface *image_kbd, *image_sym, *image_caps,*image_kbd_small, *image_sym_small, *image_caps_small, *tmp_surface ; static int vkb_is_init; extern struct computer ordenador; @@ -71,29 +71,44 @@ void VirtualKeyboard_init(SDL_Surface *screen) VirtualKeyboard.sel_y = 100; vkb_is_init = -1; - image_kbd=IMG_Load("/fbzx-wii/fbzx/Spectrum_keyboard.png"); - image_sym=IMG_Load("/fbzx-wii/fbzx/symbol_shift.png"); - image_caps=IMG_Load("/fbzx-wii/fbzx/caps_shift.png"); + tmp_surface=IMG_Load("/fbzx-wii/fbzx/Spectrum_keyboard.png"); + if (tmp_surface == NULL) {printf("Impossible to load keyboard image\n"); return;} + image_kbd=SDL_DisplayFormat(tmp_surface); + SDL_FreeSurface (tmp_surface); - image_kbd_small=IMG_Load("/fbzx-wii/fbzx/Spectrum_keyboard_small.png"); - image_sym_small=IMG_Load("/fbzx-wii/fbzx/symbol_shift_small.png"); - image_caps_small=IMG_Load("/fbzx-wii/fbzx/caps_shift_small.png"); - - if (image_kbd == NULL) {printf("Impossible to load keyboard image\n"); return;} - if (image_sym == NULL) {printf("Impossible to load symbol shift image\n"); return;} - if (image_caps == NULL) {printf("Impossible to load caps shift image\n"); return;} + tmp_surface=IMG_Load("/fbzx-wii/fbzx/symbol_shift.png"); + if (tmp_surface == NULL) {printf("Impossible to load symbol shift image\n"); return;} + image_sym=SDL_DisplayFormat(tmp_surface); + SDL_FreeSurface (tmp_surface); - if (image_kbd_small == NULL) {printf("Impossible to load keyboard small image\n"); return;} - if (image_sym_small == NULL) {printf("Impossible to load symbol small shift image\n"); return;} - if (image_caps_small == NULL) {printf("Impossible to load caps shift small image\n"); return;} + + tmp_surface=IMG_Load("/fbzx-wii/fbzx/caps_shift.png"); + if (tmp_surface == NULL) {printf("Impossible to load caps shift image\n"); return;} + image_caps=SDL_DisplayFormat(tmp_surface); + SDL_FreeSurface (tmp_surface); + + tmp_surface=IMG_Load("/fbzx-wii/fbzx/Spectrum_keyboard_small.png"); + if (tmp_surface == NULL) {printf("Impossible to load keyboard small image\n"); return;} + image_kbd_small=SDL_DisplayFormat(tmp_surface); + SDL_FreeSurface (tmp_surface); + + tmp_surface=IMG_Load("/fbzx-wii/fbzx/symbol_shift_small.png"); + if (tmp_surface == NULL) {printf("Impossible to load symbol shift small image\n"); return;} + image_sym_small=SDL_DisplayFormat(tmp_surface); + SDL_FreeSurface (tmp_surface); + + tmp_surface=IMG_Load("/fbzx-wii/fbzx/caps_shift_small.png"); + if (tmp_surface == NULL) {printf("Impossible to load caps shift small image\n"); return;} + image_caps_small=SDL_DisplayFormat(tmp_surface); + SDL_FreeSurface (tmp_surface); memset(VirtualKeyboard.buf, 0, sizeof(VirtualKeyboard.buf)); vkb_is_init = 1; } -void draw() +void draw_vk() { SDL_Rect dst_rect = {VirtualKeyboard.sel_x/RATIO, VirtualKeyboard.sel_y/RATIO, 0, 0}; @@ -116,7 +131,7 @@ void draw() } -struct virtkey *get_key_internal(int vk) +struct virtkey *get_key_internal() { while(1) { @@ -127,12 +142,12 @@ struct virtkey *get_key_internal(int vk) int border_x = VirtualKeyboard.sel_x/RATIO; int border_y = VirtualKeyboard.sel_y/RATIO; - draw(); + draw_vk(); SDL_Flip(VirtualKeyboard.screen); SDL_ShowCursor(SDL_ENABLE); - k = menu_wait_key_press(vk); + k = menu_wait_key_press(); SDL_ShowCursor(SDL_DISABLE); @@ -148,10 +163,11 @@ struct virtkey *get_key_internal(int vk) i = y/key_h*KEY_COLS + x/key_w; - + #ifdef GEKKO WPAD_Rumble(0, 1); - SDL_Delay(50); + SDL_Delay(90); WPAD_Rumble(0, 0); + #endif virtkey_t *key = &keys[i]; @@ -170,7 +186,7 @@ struct virtkey *get_key_internal(int vk) return NULL; } -struct virtkey* get_key(int vk) +struct virtkey* get_key() { virtkey_t *key; @@ -179,8 +195,98 @@ struct virtkey* get_key(int vk) keys[3 * KEY_COLS + 0 ].is_on = 0; //Caps Shit keys[3 * KEY_COLS + 8 ].is_on = 0; //Sym Shift - key = get_key_internal(vk); + key = get_key_internal(); return key; } +void virtkey_ir_run(void) +{ + int key_code; + int x,y,xm, ym, i=0; + int key_w = 50/RATIO; + int key_h = 64/RATIO; + int border_x = VirtualKeyboard.sel_x/RATIO; + int border_y = VirtualKeyboard.sel_y/RATIO; + int key = 0; + SDL_Joystick *joy; + static int joy_bottons_last[4]; + static char countdown_rumble=0; + + #ifdef GEKKO + if (countdown_rumble > 0) {countdown_rumble--; if (countdown_rumble==0) WPAD_Rumble(0, 0);} + #endif + + joy = ordenador.joystick_sdl[0]; + + if ((SDL_JoystickGetButton(joy, 0) && !joy_bottons_last[0]) || /* A */ + (SDL_JoystickGetButton(joy, 3) && !joy_bottons_last[1]) || /* 2 */ + (SDL_JoystickGetButton(joy, 9) && !joy_bottons_last[2]) || /* CA */ + (SDL_JoystickGetButton(joy, 10) && !joy_bottons_last[3])) /* CB */ + key = KEY_SELECT; + + joy_bottons_last[0]=SDL_JoystickGetButton(joy, 0) ; /* A */ + joy_bottons_last[1] =SDL_JoystickGetButton(joy, 3) ; /* 2 */ + joy_bottons_last[2] =SDL_JoystickGetButton(joy, 9) ; /* CA */ + joy_bottons_last[3] =SDL_JoystickGetButton(joy, 10) ; /* CB */ + + + if (key==KEY_SELECT) + { + SDL_GetMouseState(&xm, &ym); + x = (xm-border_x); + y = (ym-border_y); + if ((x>0)&&(x< KEY_COLS*key_w)&&(y>0)&&(y< KEY_ROWS*key_h)) + { + #ifdef GEKKO + WPAD_Rumble(0, 1); + #endif + countdown_rumble=5; + + i = y/key_h*KEY_COLS + x/key_w; + + virtkey_t *key = &keys[i]; + + if ((key->sdl_code == SDLK_LSHIFT) && !keys[3 * KEY_COLS + 8 ].is_on) + keys[3 * KEY_COLS + 0 ].is_on = !keys[3 * KEY_COLS + 0 ].is_on; //Caps Shit + else if ((key->sdl_code == SDLK_LCTRL) && !keys[3 * KEY_COLS + 0 ].is_on) + keys[3 * KEY_COLS + 8 ].is_on = !keys[3 * KEY_COLS + 8 ].is_on; //Sym Shift + else { + key->caps_on = keys[3 * KEY_COLS + 0 ].is_on; + key->sym_on = keys[3 * KEY_COLS + 8 ].is_on; + keys[3 * KEY_COLS + 0 ].is_on = 0; //Caps Shit + keys[3 * KEY_COLS + 8 ].is_on = 0; //Sym Shift + } + + key_code = key->sdl_code; + + ordenador.kbd_buffer_pointer=1; + countdown_buffer=8; + ordenador.keyboard_buffer[0][1]= key_code; + if (key->caps_on) ordenador.keyboard_buffer[1][1]= SDLK_LSHIFT; + else if (key->sym_on) ordenador.keyboard_buffer[1][1]= SDLK_LCTRL; + else ordenador.keyboard_buffer[1][1]= 0; + + printf ("Push Event: keycode %d\n", key_code); + + SDL_ShowCursor(SDL_DISABLE); + draw_vk(); + SDL_ShowCursor(SDL_ENABLE); + } + } +} + +void virtkey_ir_activate(void) +{ + ordenador.vk_is_active=1; + VirtualKeyboard.sel_x = 64; + VirtualKeyboard.sel_y = 90; + draw_vk(); + SDL_ShowCursor(SDL_ENABLE); +} + +void virtkey_ir_deactivate(void) +{ + ordenador.vk_is_active=0; + SDL_ShowCursor(SDL_DISABLE); +} diff --git a/src/VirtualKeyboard.h b/src/VirtualKeyboard.h index 381100b..4834336 100644 --- a/src/VirtualKeyboard.h +++ b/src/VirtualKeyboard.h @@ -45,10 +45,11 @@ struct Virtual_Keyboard } VirtualKeyboard; void VirtualKeyboard_init(SDL_Surface *screen); -struct virtkey* get_key(int vk); -struct virtkey* get_key_internal(int vk); -void draw(); +struct virtkey* get_key(); +struct virtkey* get_key_internal(); +void draw_vk(); void select_next_kb(int dx, int dy); void toggle_shift(); - - +void virtkey_ir_run(); +void virtkey_ir_activate(void); +void virtkey_ir_deactivate(void); diff --git a/src/computer.c b/src/computer.c index c50919d..f3f41c7 100644 --- a/src/computer.c +++ b/src/computer.c @@ -159,6 +159,7 @@ void computer_init () { //Called only on start-up ordenador.tape_loop_counter = 0; ordenador.kbd_buffer_pointer = 0; + ordenador.vk_is_active=0; ordenador.key = SDL_GetKeyState(NULL); ordenador.joybuttonkey[0][0]=SDLK_LALT; //Fire button to wiimote1 button A ordenador.joybuttonkey[1][0]=SDLK_LALT; //Fire button to wiimote1 button A @@ -579,9 +580,9 @@ inline void show_screen (int tstados) { // is border if (ordenador.ulaplus) { - paint_pixels (255, ordenador.border+24, 0); // paint 8 pixels with BORDER color + paint_pixels (255, ordenador.border+24, 0,1); // paint 8 pixels with BORDER color } else { - paint_pixels (255, ordenador.border, 0); // paint 8 pixels with BORDER color + paint_pixels (255, ordenador.border, 0,1); // paint 8 pixels with BORDER color } ordenador.bus_value = 255; @@ -619,9 +620,9 @@ inline void show_screen (int tstados) { ordenador.p_translt2++; if ((fflash) && (ordenador.flash)) - paint_pixels (temporal3, paper, ink); // if FLASH, invert PAPER and INK + paint_pixels (temporal3, paper, ink,(!ordenador.vk_is_active)||(ordenador.currline>ordenador.last_line_kb)||(ordenador.currlineordenador.last_line_kb)||(ordenador.currlineordenador.last_line_kb) ||(ordenador.currlineordenador.last_line_kb) ||(ordenador.currline> 1) & 0x7F); @@ -961,7 +981,7 @@ inline void paint_pixels (unsigned char octet,unsigned char ink, unsigned char p } -inline void paint_pixels_precision (unsigned char octet,unsigned char ink, unsigned char paper) { +inline void paint_pixels_precision (unsigned char octet,unsigned char ink, unsigned char paper, unsigned char draw) { static int bucle,valor,*p; static unsigned char mask; @@ -969,6 +989,8 @@ inline void paint_pixels_precision (unsigned char octet,unsigned char ink, unsig if (ordenador.pixels_octect==0) mask = 0x80; for (bucle = 0; bucle < 2; bucle++) { + if (draw) + { valor = (octet & mask) ? (int) ink : (int) paper; p=(colors+valor); @@ -989,6 +1011,21 @@ inline void paint_pixels_precision (unsigned char octet,unsigned char ink, unsig default: break; } + } + else + { + switch (ordenador.npixels) + { + case 2: + ordenador.pixel+=ordenador.next_pixel; + break; + case 4: + ordenador.pixel+=ordenador.next_pixel; + break; + default: + break; + } + } ordenador.pixel+=ordenador.next_pixel; @@ -1001,11 +1038,11 @@ inline void paint_pixels_precision (unsigned char octet,unsigned char ink, unsig inline void paint_one_pixel(unsigned char *colour,unsigned char *address) { *(address++)=*(colour+2); - *(address++)=*(colour+3); + *(address++)=*(colour+3); } #else -inline void paint_one_pixel(unsigned char *colour,unsigned char *address) { +inline void paint_one_pixel(unsigned char *colour,unsigned char *address ) { #if BYTE_ORDER == LITTLE_ENDIAN switch(ordenador.bpp) { @@ -1058,7 +1095,6 @@ inline void read_keyboard () { fire_on[0]=0; fire_on[1]=0; - static int countdown_kb; ordenador.k8 = ordenador.k9 = ordenador.k10 = ordenador.k11 = ordenador.k12 = ordenador.k13 = ordenador.k14 = @@ -1076,32 +1112,19 @@ inline void read_keyboard () { SDL_JoystickUpdate(); - if (ordenador.vk_auto) - { - if (countdown_kb>0) countdown_kb--; + if (SDL_JoystickGetButton(ordenador.joystick_sdl[0], 6) ||//Wii button "Home" + SDL_JoystickGetButton(ordenador.joystick_sdl[0], 19)) + {if (ordenador.vk_is_active) virtkey_ir_deactivate();main_menu(); } - #ifdef GEKKO - WPADData *wd; - wd = WPAD_Data(0); - if ((wd->ir.valid)&&(!countdown_kb)) {virtual_keyboard();countdown_kb=20;} - #else - int x=0,y=0 ; - SDL_GetRelativeMouseState(&x,&y); - if ((x||y)&&(!countdown_kb)) {virtual_keyboard();countdown_kb=30;} - #endif - } + if (!ordenador.vk_is_active) { for(joy_n=0;joy_n 16384) ordenador.joy_axis_x_state[joy_n] = JOY_RIGHT; else if (joy_axis_x[joy_n] < -16384) ordenador.joy_axis_x_state[joy_n] = JOY_LEFT; @@ -1140,12 +1163,13 @@ inline void read_keyboard () { joybutton_matrix[joy_n][(ordenador.joybuttonkey[joy_n][21])] = (status_hat[joy_n] & SDL_HAT_RIGHT); } } + } //Keyboard buffer - if (countdown) + if (countdown_buffer) { - if (countdown <5) + if (countdown_buffer <5) { joybutton_matrix[0][(ordenador.keyboard_buffer[0][ordenador.kbd_buffer_pointer+1])]=0; joybutton_matrix[0][(ordenador.keyboard_buffer[1][ordenador.kbd_buffer_pointer+1])]=0; @@ -1157,17 +1181,24 @@ inline void read_keyboard () { joybutton_matrix[0][(ordenador.keyboard_buffer[0][ordenador.kbd_buffer_pointer+1])]=1; joybutton_matrix[0][(ordenador.keyboard_buffer[1][ordenador.kbd_buffer_pointer+1])]=1; } - countdown--; + countdown_buffer--; } else if (ordenador.kbd_buffer_pointer) { - joybutton_matrix[0][(ordenador.keyboard_buffer[0][ordenador.kbd_buffer_pointer])]=1; - joybutton_matrix[0][(ordenador.keyboard_buffer[1][ordenador.kbd_buffer_pointer])]=1; + if (ordenador.kbd_buffer_pointerkey.keysym.sym; @@ -1242,7 +1273,7 @@ inline void read_keyboard () { } - countdown=8; + countdown_buffer=8; break; case SDLK_F10: // Reset emulator @@ -1474,7 +1505,47 @@ inline void read_keyboard () { if (joybutton_matrix[0][SDLK_F6] && ((ordenador.tape_fast_load == 0) || (ordenador.tape_file_type==TAP_TZX))) ordenador.pause = 0; //Play the tape - return; + + //Virtual Keyboard + + //VK activation/deactivation + + static char old_plus_button; + char plus_button; + + plus_button= SDL_JoystickGetButton(ordenador.joystick_sdl[0], 5) || //Wii button "+" + SDL_JoystickGetButton(ordenador.joystick_sdl[0], 18); + + + if (!ordenador.vk_auto && plus_button && !old_plus_button) + {if (!ordenador.vk_is_active) virtkey_ir_activate(); else virtkey_ir_deactivate();} + + if (ordenador.vk_auto) + { + #ifdef GEKKO + WPADData *wd; + wd = WPAD_Data(0); //only wiimote 0 + if ((wd->ir.valid)&&(!ordenador.vk_is_active)) virtkey_ir_activate(); + if ((!wd->ir.valid)&&(ordenador.vk_is_active)) virtkey_ir_deactivate(); + #else + int x=0,y=0 ; + SDL_GetRelativeMouseState(&x,&y); + if (x||y) + { + ordenador.vk_is_active=1; + SDL_ShowCursor(SDL_ENABLE); + } + else + { + ordenador.vk_is_active=0; + SDL_ShowCursor(SDL_DISABLE); + } + #endif + } + old_plus_button = plus_button; + + if (ordenador.vk_is_active) virtkey_ir_run(); + } // resets the computer and loads the right ROMs @@ -1577,6 +1648,8 @@ void ResetComputer () { ordenador.start_screen=45; break; } + ordenador.first_line_kb=ordenador.first_line + 90/2; + ordenador.last_line_kb=ordenador.first_line + 90/2 + 306/2; ordenador.last_selected_poke_file[0]='\0'; diff --git a/src/computer.h b/src/computer.h index c987380..11551ba 100644 --- a/src/computer.h +++ b/src/computer.h @@ -26,13 +26,15 @@ // #define MUT +#define KB_BUFFER_LENGHT 10 + extern char salir; enum tapmodes {TAP_GUIDE, TAP_DATA, TAP_PAUSE, TAP_TRASH, TAP_STOP, TAP_PAUSE2, TZX_PURE_TONE, TZX_SEQ_PULSES, TAP_FINAL_BIT, TAP_PAUSE3}; enum taptypes {TAP_TAP, TAP_TZX}; -int countdown; +int countdown_buffer; struct computer { @@ -67,6 +69,8 @@ struct computer { int next_scanline; // cuantity to add to pass to the next scanline int first_line; // first line to start to paint int last_line; // last line to paint + int first_line_kb; // first line to start to paint the keyboard + int last_line_kb; // last line to paint the keyboard int first_pixel; // first pixel of a line to paint int last_pixel; // last pixel of a line to paint int next_pixel; // next pixel @@ -221,7 +225,7 @@ struct computer { unsigned char turbo; unsigned char turbo_state; - unsigned int keyboard_buffer[2][10]; + unsigned int keyboard_buffer[2][KB_BUFFER_LENGHT]; unsigned int kbd_buffer_pointer; unsigned char *key; unsigned char joystick_number; @@ -232,6 +236,7 @@ struct computer { unsigned char joypad_as_joystick[2]; unsigned char rumble[2]; unsigned char vk_auto; + unsigned char vk_is_active; unsigned char port; //SD, USB, SMB or FTP unsigned char smb_enable; unsigned char SmbUser[32]; @@ -252,8 +257,8 @@ void computer_init(); void register_screen(SDL_Surface *); inline void show_screen(int); inline void show_screen_precision(int); -inline void paint_pixels(unsigned char, unsigned char, unsigned char); -inline void paint_pixels_precision(unsigned char, unsigned char, unsigned char); +inline void paint_pixels(unsigned char, unsigned char, unsigned char, unsigned char draw); +inline void paint_pixels_precision(unsigned char, unsigned char, unsigned char,unsigned char draw); inline void read_keyboard(); void fill_audio(void *udata,Uint8 *,int); void set_volume(unsigned char); diff --git a/src/emulator.c b/src/emulator.c index 003a17c..5429e17 100644 --- a/src/emulator.c +++ b/src/emulator.c @@ -81,6 +81,7 @@ unsigned int jump_frames,curr_frames; static SDL_Surface *image; +unsigned char sdismount = 0; unsigned char usbismount = 0; unsigned char networkisinit = 0; unsigned char smbismount = 0; @@ -626,6 +627,55 @@ void load_main_game(char *nombre) { ordenador.tape_file_type = TAP_TAP; rewind_tape(ordenador.tap_file,1); } + + //Emulate load "" + if (ordenador.mode128k==4) //Spanish 128k + { + ordenador.keyboard_buffer[0][9]= 0; + ordenador.keyboard_buffer[1][9]= 0; + ordenador.keyboard_buffer[0][8]= SDLK_l; + ordenador.keyboard_buffer[1][8]= 0; + ordenador.keyboard_buffer[0][7]= SDLK_o; + ordenador.keyboard_buffer[1][7]= 0; + ordenador.keyboard_buffer[0][6]= SDLK_a; + ordenador.keyboard_buffer[1][6]= 0; + ordenador.keyboard_buffer[0][5]= SDLK_d; + ordenador.keyboard_buffer[1][5]= 0; + ordenador.keyboard_buffer[0][4]= SDLK_p; //" + ordenador.keyboard_buffer[1][4]= SDLK_LCTRL; + ordenador.keyboard_buffer[0][3]= SDLK_p; //" + ordenador.keyboard_buffer[1][3]= SDLK_LCTRL; + ordenador.keyboard_buffer[0][2]= SDLK_RETURN; // Return + ordenador.keyboard_buffer[1][2]= 0; + ordenador.keyboard_buffer[0][1]= SDLK_F6; //F6 - play + ordenador.keyboard_buffer[1][1]= 0; + ordenador.kbd_buffer_pointer=100; + } + else + { + ordenador.keyboard_buffer[0][9]= 0; + ordenador.keyboard_buffer[1][9]= 0; + ordenador.keyboard_buffer[0][8]= 0; + ordenador.keyboard_buffer[1][8]= 0; + ordenador.keyboard_buffer[0][7]= 0; + ordenador.keyboard_buffer[1][7]= 0; + ordenador.keyboard_buffer[0][6]= 0; + ordenador.keyboard_buffer[1][6]= 0; + + ordenador.keyboard_buffer[0][5]= SDLK_j; //Load + ordenador.keyboard_buffer[1][5]= 0; + ordenador.keyboard_buffer[0][4]= SDLK_p; //" + ordenador.keyboard_buffer[1][4]= SDLK_LCTRL; + ordenador.keyboard_buffer[0][3]= SDLK_p; //" + ordenador.keyboard_buffer[1][3]= SDLK_LCTRL; + ordenador.keyboard_buffer[0][2]= SDLK_RETURN; // Return + ordenador.keyboard_buffer[1][2]= 0; + ordenador.keyboard_buffer[0][1]= SDLK_F6; //F6 + ordenador.keyboard_buffer[1][1]= 0; + ordenador.kbd_buffer_pointer=100; //Delay the insertion in the buffer + } + countdown_buffer=0; + return; } } @@ -1031,7 +1081,7 @@ int load_config(struct computer *object, char *filename) { if (rumble2<2) { object->rumble[1]=rumble2; } - if (port<4) { + if (port<5) { object->port=port; } if (autoconf<2) { @@ -1082,17 +1132,26 @@ int main(int argc,char *argv[]) { dblbuffer=1; hwsurface=1; setenv("HOME", "/fbzx-wii", 1); - + //initialize libfat library - if (!fatInitDefault()) - { - printf("Couldn't initialize SD fat subsytem\n"); - - exit(0); - } + if (fatInitDefault()) + printf("FAT subsytem initialized\n"); else - printf("SD FAT subsytem initialized\n"); + printf("Couldn't initialize fat subsytem\n"); + DIR *dp; + + dp = opendir ("sd:/"); + if (dp) sdismount = 1; else sdismount = 0; + + if (sdismount) + printf("SD FAT subsytem initialized\n"); + else + printf("Couldn't initialize SD fat subsytem\n"); + + if (sdismount) closedir (dp); + + usbismount = InitUSB(); #endif @@ -1256,7 +1315,6 @@ int main(int argc,char *argv[]) { if (ordenador.zaurus_mini==0) if (load_zxspectrum_picture()) SDL_FreeSurface (image); #ifdef GEKKO - usbismount = InitUSB(); load_config_network(&ordenador); @@ -1315,15 +1373,19 @@ int main(int argc,char *argv[]) { else {printf("Can't make tmp directory\n"); tmpismade=0;} #ifdef GEKKO - if ((ordenador.port==1)&&usbismount) { + if ((ordenador.port==1)&&sdismount) { + strcpy(path_snaps,"sd:/"); + strcpy(path_taps,"sd:/"); + } + if ((ordenador.port==2)&&usbismount) { strcpy(path_snaps,"usb:/"); strcpy(path_taps,"usb:/"); } - if ((ordenador.port==2)&&smbismount) { + if ((ordenador.port==3)&&smbismount) { strcpy(path_snaps,"smb:/"); strcpy(path_taps,"smb:/"); } - if ((ordenador.port==3)&&ftpismount) { + if ((ordenador.port==4)&&ftpismount) { strcpy(path_snaps,"ftp:"); strcpy(path_taps,"ftp:"); } diff --git a/src/emulator.h b/src/emulator.h index b54c3cd..6163d3d 100644 --- a/src/emulator.h +++ b/src/emulator.h @@ -42,7 +42,7 @@ extern char path_poke[2049]; extern char path_tmp[2049]; extern unsigned int colors[80]; extern unsigned int jump_frames,curr_frames; -extern unsigned char usbismount, smbismount, tmpismade, ftpismount,networkisinit; +extern unsigned char sdismount, usbismount, smbismount, tmpismade, ftpismount,networkisinit; void SDL_Fullscreen_Switch(void); void load_rom(char); diff --git a/src/gui_sdl.c b/src/gui_sdl.c index 65bf6e7..7f0dc34 100644 --- a/src/gui_sdl.c +++ b/src/gui_sdl.c @@ -50,7 +50,7 @@ extern FILE *fdebug; #define MAX_POKE 20 #define MAX_TRAINER 50 -extern int countdown; +extern int countdown_buffer; void clean_screen(); @@ -154,7 +154,7 @@ static const char *tools_messages[] = { /*05*/ "Load poke file", /*06*/ " ", /*07*/ "Port", - /*08*/ "^|sd|usb|smb|ftp", + /*08*/ "^|default|sd|usb|smb|ftp", /*09*/ " ", /*10*/ "Auto virtual keyboard", /*11*/ "^|on|off", @@ -377,7 +377,7 @@ static int manage_tape(int which) insert_tape(); break; case 1: //Emulate load "" - countdown=8; + countdown_buffer=8; if (ordenador.mode128k==4) //Spanish 128k { ordenador.keyboard_buffer[0][8]= SDLK_l; @@ -712,7 +712,7 @@ static void input_options(int joy) VirtualKeyboard.sel_x = 64; VirtualKeyboard.sel_y = 90; - virtualkey = get_key(0); + virtualkey = get_key(); if (virtualkey == NULL) return; sdl_key = virtualkey->sdl_code; @@ -1074,7 +1074,7 @@ static void set_port(int which) switch (which) { - case 0: //PORT_SD + case 0: //PORT_DEFAULT strcpy(path_snaps,getenv("HOME")); length=strlen(path_snaps); if ((length>0)&&(path_snaps[length-1]!='/')) strcat(path_snaps,"/"); @@ -1089,7 +1089,18 @@ static void set_port(int which) strcat(path_scr2,"scr2"); ordenador.port = which; break; - case 1: //PORT_USB + case 1: //PORT_SD + if (sdismount) { + strcpy(path_snaps,"sd:/"); + strcpy(path_taps,"sd:/"); + strcpy(path_poke,"sd:/"); + strcpy(path_scr1,"sd:/"); + strcpy(path_scr2,"sd:/"); + ordenador.port = which;} + else + msgInfo("SD is not mounted",3000,NULL); + break; + case 2: //PORT_USB if (usbismount) { strcpy(path_snaps,"usb:/"); strcpy(path_taps,"usb:/"); @@ -1100,7 +1111,7 @@ static void set_port(int which) else msgInfo("USB is not mounted",3000,NULL); break; - case 2: //PORT_SMB + case 3: //PORT_SMB if (!smbismount) { msgInfo("Try to mount SMB",0,NULL); @@ -1118,7 +1129,7 @@ static void set_port(int which) else msgInfo("SMB is not mounted",3000,NULL); break; - case 3: //PORT_FTP + case 4: //PORT_FTP if (!ftpismount) { msgInfo("Try to mount FTP",0,NULL); @@ -1295,7 +1306,7 @@ int parse_poke (const char *filename) k=0; while (!((k & KEY_ESCAPE)||(k & KEY_SELECT))) - {k = menu_wait_key_press(0);} + {k = menu_wait_key_press();} banner.y=y; @@ -1366,7 +1377,7 @@ int parse_poke (const char *filename) k=0; while (!(k & KEY_ESCAPE)&&(ritorno==0)) - {k = menu_wait_key_press(0);} + {k = menu_wait_key_press();} fclose(fpoke); if (ritorno==0) strcpy(ordenador.last_selected_poke_file,filename); @@ -1492,11 +1503,11 @@ void virtual_keyboard(void) VirtualKeyboard.sel_x = 64; VirtualKeyboard.sel_y = 90; - virtkey_t *key =get_key(1); + virtkey_t *key =get_key(); if (key) {key_code = key->sdl_code;} else return; ordenador.kbd_buffer_pointer=1; - countdown=8; + countdown_buffer=8; ordenador.keyboard_buffer[0][1]= key_code; if (key->caps_on) ordenador.keyboard_buffer[1][1]= SDLK_LSHIFT; else if (key->sym_on) ordenador.keyboard_buffer[1][1]= SDLK_LCTRL; diff --git a/src/menu_sdl.c b/src/menu_sdl.c index 9250b05..a3137ac 100644 --- a/src/menu_sdl.c +++ b/src/menu_sdl.c @@ -142,7 +142,7 @@ int msgInfo(char *text, int duration, SDL_Rect *irc) SDL_FillRect(real_screen, &brc, SDL_MapRGB(real_screen->format, 0x00, 0x80, 0x00)); menu_print_font(real_screen, 0,0,0, FULL_DISPLAY_X/2-12/RATIO, Y+42/RATIO, "OK",20); SDL_UpdateRect(real_screen, brc.x, brc.y, brc.w, brc.h); - while (!(KEY_SELECT & menu_wait_key_press(0))) {} + while (!(KEY_SELECT & menu_wait_key_press())) {} } @@ -216,7 +216,7 @@ int msgYesNo(char *text, int default_opt, int x, int y) SDL_UpdateRect(real_screen, brc.x, brc.y, brc.w,brc.h); //SDL_Flip(real_screen); - key = menu_wait_key_press(0); + key = menu_wait_key_press(); if (key & KEY_SELECT) { return default_opt; @@ -248,7 +248,7 @@ static int cmpstringp(const void *p1, const void *p2) return -1; if (*p1_s != '[' && *p2_s == '[') return 1; - return strcmp(* (char * const *) p1, * (char * const *) p2); + return strcasecmp(* (char * const *) p1, * (char * const *) p2); } /* Return true if name ends with ext (for filenames) */ @@ -920,7 +920,7 @@ static void menu_fini(menu_t *p_menu) free(p_menu->p_submenus); } -uint32_t menu_wait_key_press(int vk) +uint32_t menu_wait_key_press() { SDL_Event ev; uint32_t keys = 0; @@ -934,19 +934,6 @@ uint32_t menu_wait_key_press(int vk) static int joy_bottons_last[2][8]; SDL_JoystickUpdate(); - if (ordenador.vk_auto) - { - #ifdef GEKKO - WPADData *wd; - wd = WPAD_Data(0); - if (vk&&!(wd->ir.valid)) return KEY_ESCAPE; - #else - int x=0,y=0 ; - SDL_GetRelativeMouseState(&x,&y); - if ((x<20||y<20||(x>FULL_DISPLAY_X-20)||y>FULL_DISPLAY_Y-20)) return KEY_ESCAPE; - #endif - } - /* Wii-specific, sorry */ for (nr = 0; nr < ordenador.joystick_number; nr++) { joy = ordenador.joystick_sdl[nr]; @@ -1088,7 +1075,7 @@ static int menu_select_internal(SDL_Surface *screen, menu_draw(screen, p_menu, 0, font_size, draw_scr); SDL_Flip(screen); - keys = menu_wait_key_press(0); + keys = menu_wait_key_press(); if (keys & KEY_UP) select_next(p_menu, 0, -1, 1); @@ -1443,7 +1430,7 @@ int ask_value_sdl(int *final_value,int y_coord,int max_value) { VirtualKeyboard.sel_x = 64; VirtualKeyboard.sel_y = 155; - virtualkey = get_key(0); + virtualkey = get_key(); if (virtualkey == NULL) return(0); if (virtualkey->sdl_code==1) break; //done, retorno -1 sdl_key = virtualkey->sdl_code; @@ -1572,7 +1559,7 @@ int ask_filename_sdl(char *nombre_final,int y_coord,char *extension, char *path, VirtualKeyboard.sel_x = 64; VirtualKeyboard.sel_y = 155; - virtualkey = get_key(0); + virtualkey = get_key(); if (virtualkey == NULL) return(2); sdl_key = virtualkey->sdl_code; diff --git a/src/menu_sdl.h b/src/menu_sdl.h index f8960bc..f914b98 100644 --- a/src/menu_sdl.h +++ b/src/menu_sdl.h @@ -54,7 +54,7 @@ int menu_select(const char **pp_msgs, int *p_submenus); const char *menu_select_file(const char *dir_path,const char *selected_file, int draw_scr); -uint32_t menu_wait_key_press(int vk); +uint32_t menu_wait_key_press(); void msgKill(SDL_Rect *rc); int msgInfo(char *text, int duration, SDL_Rect *rc);