From e1ebc8a118a12e5699cda1b71279d9975a36ed9e Mon Sep 17 00:00:00 2001 From: "fabio.olimpieri" Date: Thu, 27 Dec 2012 15:39:35 +0000 Subject: [PATCH] Auto turbo mode, B button as escape, IR wiimote in virtual keyboard --- src/VirtualKeyboard.c | 21 ++++++++++++++++++++- src/computer.c | 18 ++++++++++-------- src/computer.h | 5 +++-- src/emulator.c | 10 +++++++++- src/gui_sdl.c | 16 +++++++++++----- src/menu_sdl.c | 13 ++++++++----- src/menu_sdl.h | 1 + src/menus.c | 15 +++++++-------- src/tape.c | 21 +++++++++++++++++++-- 9 files changed, 88 insertions(+), 32 deletions(-) diff --git a/src/VirtualKeyboard.c b/src/VirtualKeyboard.c index 6f6eeb7..2ce8ba8 100644 --- a/src/VirtualKeyboard.c +++ b/src/VirtualKeyboard.c @@ -132,11 +132,22 @@ struct virtkey *get_key_internal() while(1) { uint32_t k; + int x,y,i=0; + int screen_w = VirtualKeyboard.screen->w; + int screen_h = VirtualKeyboard.screen->h; + int key_w = 54/RATIO; + int key_h = 36/RATIO; + int border_x = (screen_w - (key_w * KEY_COLS)) / 2; + int border_y = (screen_h - (key_h * KEY_ROWS)) / 2 + 50/RATIO; draw(); SDL_Flip(VirtualKeyboard.screen); + + SDL_ShowCursor(SDL_ENABLE); k = menu_wait_key_press(); + + SDL_ShowCursor(SDL_DISABLE); if (k & KEY_UP) select_next_kb(0, -1); @@ -150,7 +161,15 @@ struct virtkey *get_key_internal() return NULL; else if (k & KEY_SELECT) { - virtkey_t *key = &keys[ VirtualKeyboard.sel_y * KEY_COLS + VirtualKeyboard.sel_x ]; + if (!(k & KEY_SELECT_A)) i= VirtualKeyboard.sel_y * KEY_COLS + VirtualKeyboard.sel_x; + else + { + SDL_GetMouseState(&x, &y); + i= (y-border_y+10/RATIO)/key_h * KEY_COLS + (x-border_x+10/RATIO)/key_w; + if ((i<0)||(i>=KEY_COLS * KEY_ROWS)) i=KEY_COLS * KEY_ROWS - 1; //NULL + } + + virtkey_t *key = &keys[i]; if ((key->sdl_code == 304) && !keys[3 * KEY_COLS + 8 ].is_done) keys[3 * KEY_COLS + 0 ].is_done = !keys[3 * KEY_COLS + 0 ].is_done; //Caps Shit diff --git a/src/computer.c b/src/computer.c index 788491f..26e5ea1 100644 --- a/src/computer.c +++ b/src/computer.c @@ -108,6 +108,8 @@ void computer_init () { //Called only on start-up ordenador.joystick[1] = 0; // Cursor ordenador.rumble[0] = 0; ordenador.rumble[1] = 0; + ordenador.turbo = 0; + ordenador.turbo_state = 0; ordenador.precision = 0; ordenador.tape_readed = 0; @@ -549,7 +551,7 @@ inline void show_screen (int tstados) { if (ordenador.tstados_counter>=ordenador.tstatodos_frame) { ordenador.tstados_counter-=ordenador.tstatodos_frame; ordenador.interr = 1; - if ((ordenador.turbo == 0) || (curr_frames%7 == 0)) ordenador.readkeyboard = 1; + if ((ordenador.turbo_state == 0) || (curr_frames%7 == 0)) ordenador.readkeyboard = 1; curr_frames++; } return; @@ -678,7 +680,7 @@ inline void show_screen (int tstados) { } } -//Write the screen from 14339 state +//Write the screen from 14339 state for 48K and from 14365 for 128k inline void show_screen_precision (int tstados) { @@ -1507,8 +1509,8 @@ void ResetComputer () { ordenador.lower_border_line = 64 + 192; ordenador.cpufreq = 3500000; ordenador.tstatodos_frame= 69888; - ordenador.start_contention = 14335; - ordenador.end_contention = 14335+224*192; + //ordenador.start_contention = 14335; + //ordenador.end_contention = 14335+224*192; ordenador.first_line = 40; ordenador.last_line = 280; } @@ -1519,8 +1521,8 @@ void ResetComputer () { ordenador.lower_border_line = 40 + 192; ordenador.cpufreq = 3527500; ordenador.tstatodos_frame= 59136; - ordenador.start_contention = 8959; - ordenador.end_contention = 8959+224*192; + //ordenador.start_contention = 8959; + //ordenador.end_contention = 8959+224*192; ordenador.first_line = 16; ordenador.last_line = 256; } @@ -1543,8 +1545,8 @@ void ResetComputer () { ordenador.lower_border_line = 63 + 192; ordenador.cpufreq = 3546900; ordenador.tstatodos_frame= 70908; - ordenador.start_contention = 14361; - ordenador.end_contention = 14361+228*192; + //ordenador.start_contention = 14361; + //ordenador.end_contention = 14361+228*192; ordenador.first_line = 40; ordenador.last_line = 280; ordenador.start_screen=45; diff --git a/src/computer.h b/src/computer.h index 55c1875..5c408b4 100644 --- a/src/computer.h +++ b/src/computer.h @@ -78,8 +78,8 @@ struct computer { int tstatodos_frame; //number of tstados per frame int pixels_octect; //2 bits in the octect int pixels_word; //2 bits in the word - int start_contention; //start tstados for contention - int end_contention; //end tstados for contention + //int start_contention; //start tstados for contention + //int end_contention; //end tstados for contention unsigned char screen_snow; // 0-> no emulate snow; 1-> emulate snow unsigned char fetch_state; @@ -219,6 +219,7 @@ struct computer { unsigned char other_ret; // 0=no change; 1=memory returns RET (201) unsigned char turbo; + unsigned char turbo_state; unsigned int keyboard_buffer[2][10]; unsigned int kbd_buffer_pointer; unsigned char *key; diff --git a/src/emulator.c b/src/emulator.c index 7086f26..574f4f1 100644 --- a/src/emulator.c +++ b/src/emulator.c @@ -661,6 +661,7 @@ int save_config(struct computer *object, char *filename) { fprintf(fconfig,"rumble2=%c%c",48+object->rumble[1],10); fprintf(fconfig,"port=%c%c",48+object->port,10); fprintf(fconfig,"autoconf=%c%c",48+object->autoconf,10); + fprintf(fconfig,"turbo=%c%c",48+object->turbo,10); for (joy_n=0; joy_n<2; joy_n++) @@ -829,7 +830,7 @@ int load_config(struct computer *object, char *filename) { FILE *fconfig; unsigned char volume=255,mode128k=255,issue=255,ntsc=255, joystick1=255,joystick2=255,ay_emul=255,mdr_active=255, dblscan=255,framerate =255, screen =255, text=255, precision=255, bw=255, tap_fast=255, audio_mode=255, - joypad1=255, joypad2=255, rumble1=255, rumble2=255, joy_n=255, key_n=255, port=255, autoconf=255; + joypad1=255, joypad2=255, rumble1=255, rumble2=255, joy_n=255, key_n=255, port=255, autoconf=255, turbo=225; if (filename) strcpy(config_path,filename); else return -2; @@ -951,6 +952,10 @@ int load_config(struct computer *object, char *filename) { autoconf=line[9]-'0'; continue; } + if (!strncmp(line,"turbo=",6)) { + turbo=line[6]-'0'; + continue; + } if (!strncmp(line,"joybutton_",10)) { sscanf(line, "joybutton_%c_%c=%3d",&joy_n ,&key_n, &key_sdl); if ((joy_n<50) && (joy_n>47) && (key_n<119) && (key_n>96)) @@ -1026,6 +1031,9 @@ int load_config(struct computer *object, char *filename) { if (autoconf<2) { object->autoconf=autoconf; } + if (turbo<2) { + object->turbo=turbo; + } fclose(fconfig); return 0; diff --git a/src/gui_sdl.c b/src/gui_sdl.c index 2627cd7..d3143ed 100644 --- a/src/gui_sdl.c +++ b/src/gui_sdl.c @@ -79,10 +79,10 @@ static const char *emulation_messages[] = { /*01*/ "^|48k_2|48K_3|128k|+2|+2A/+3|128K_Sp|NTSC", /*02*/ "Frame rate", /*03*/ "^|100%|50%|33%|25%|20%", - /*04*/ "Tap fast speed", + /*04*/ "Tap instant load", /*05*/ "^|on|off", /*06*/ "Turbo mode", - /*07*/ "^|off|speed|ultraspeed", + /*07*/ "^|off|auto|fast|ultrafast", /*08*/ "Precision", /*09*/ "^|on|off", NULL @@ -523,19 +523,24 @@ static void emulation_settings(void) { switch(ordenador.turbo) { + case 1: //auto + ordenador.precision =0; case 0: //off update_frequency(0); //set machine frequency jump_frames=0; - break; - case 1: //speed + ordenador.turbo_state=0; + break; + case 2: //fast update_frequency(10000000); jump_frames=4; ordenador.precision =0; + ordenador.turbo_state=2; break; - case 2: //ultra speed + case 3: //ultra fast update_frequency(15000000); jump_frames=24; ordenador.precision =0; + ordenador.turbo_state=3; break; default: break; @@ -550,6 +555,7 @@ static void emulation_settings(void) update_frequency(0); jump_frames=0; ordenador.turbo =0; + ordenador.turbo_state=0; } } } diff --git a/src/menu_sdl.c b/src/menu_sdl.c index db8e290..e2903ad 100644 --- a/src/menu_sdl.c +++ b/src/menu_sdl.c @@ -774,7 +774,7 @@ uint32_t menu_wait_key_press(void) SDL_Joystick *joy; static int joy_keys_changed; static int joy_keys_last; - static int joy_bottons_last[2][7]; + static int joy_bottons_last[2][8]; SDL_JoystickUpdate(); /* Wii-specific, sorry */ for (nr = 0; nr < ordenador.joystick_number; nr++) { @@ -806,14 +806,16 @@ uint32_t menu_wait_key_press(void) else if( axis1 > 15000 ) keys |= KEY_DOWN; - if ((!SDL_JoystickGetButton(joy, 0) && joy_bottons_last[nr][0]) || /* A */ - (!SDL_JoystickGetButton(joy, 3) && joy_bottons_last[nr][1]) || /* 2 */ + if (!SDL_JoystickGetButton(joy, 0) && joy_bottons_last[nr][0]) /* A */ + {keys |= KEY_SELECT; keys |= KEY_SELECT_A;} + if ((!SDL_JoystickGetButton(joy, 3) && joy_bottons_last[nr][1]) || /* 2 */ (!SDL_JoystickGetButton(joy, 9) && joy_bottons_last[nr][2]) || /* CA */ (!SDL_JoystickGetButton(joy, 10) && joy_bottons_last[nr][3])) /* CB */ keys |= KEY_SELECT; if ((!SDL_JoystickGetButton(joy, 2) && joy_bottons_last[nr][4]) || /* 1 */ (!SDL_JoystickGetButton(joy, 11) && joy_bottons_last[nr][5]) || /* CX */ - (!SDL_JoystickGetButton(joy, 12) && joy_bottons_last[nr][6])) /* CY */ + (!SDL_JoystickGetButton(joy, 12) && joy_bottons_last[nr][6])|| /* CY */ + (!SDL_JoystickGetButton(joy, 1) && joy_bottons_last[nr][7])) /* B */ keys |= KEY_ESCAPE; if (SDL_JoystickGetButton(joy, 5) != 0 || /* + */ SDL_JoystickGetButton(joy, 18) != 0) /* C+ */ @@ -829,6 +831,7 @@ uint32_t menu_wait_key_press(void) joy_bottons_last[nr][4] =SDL_JoystickGetButton(joy, 2) ; /* 1 */ joy_bottons_last[nr][5] =SDL_JoystickGetButton(joy, 11) ; /* CX */ joy_bottons_last[nr][6] =SDL_JoystickGetButton(joy, 12) ; /* CY */ + joy_bottons_last[nr][7] =SDL_JoystickGetButton(joy, 1) ; /* B */ } joy_keys_changed = keys != joy_keys_last; @@ -885,7 +888,7 @@ uint32_t menu_wait_key_press(void) if (keys != 0) break; - SDL_Delay(100); + SDL_Delay(50); } return keys; } diff --git a/src/menu_sdl.h b/src/menu_sdl.h index a13e99c..3101a1c 100644 --- a/src/menu_sdl.h +++ b/src/menu_sdl.h @@ -38,6 +38,7 @@ #define KEY_PAGEDOWN 64 #define KEY_PAGEUP 128 #define KEY_HELP 256 +#define KEY_SELECT_A 512 int FULL_DISPLAY_X; //640 int FULL_DISPLAY_Y; //480 diff --git a/src/menus.c b/src/menus.c index 14ec3dc..69e2289 100644 --- a/src/menus.c +++ b/src/menus.c @@ -153,9 +153,9 @@ void settings_menu() { print_string(fbuffer,texto,-1,125,12,0,ancho); if(ordenador.turbo) - sprintf(texto,"TURBO mode: enabled"); + sprintf(texto,"TURBO auto mode: enabled"); else - sprintf(texto,"TURBO mode: disabled"); + sprintf(texto,"TURBO auto mode: disabled"); print_string(fbuffer,texto,-1,145,14,0,ancho); if (ordenador.bw) { @@ -288,14 +288,13 @@ void settings_menu() { break; case SDLK_t: curr_frames=0; + update_frequency(0); //set deafult machine frequency + jump_frames=0; + ordenador.turbo_state = 0; if(ordenador.turbo){ - update_frequency(0); //set machine frequency - ordenador.turbo = 0; - jump_frames=0; + ordenador.turbo = 0; } else { - update_frequency(10000000); //5,0 MHz max emulation speed for wii at full frames - ordenador.turbo = 1; - jump_frames=4; + ordenador.turbo = 1; //Auto mode } break; } diff --git a/src/tape.c b/src/tape.c index d098d2a..36dc118 100644 --- a/src/tape.c +++ b/src/tape.c @@ -33,8 +33,25 @@ char elbit=0; inline void tape_read(FILE *fichero, int tstados) { if(ordenador.pause) - return; - + { + if ((ordenador.turbo_state != 0)&&(ordenador.turbo==1)) + { + update_frequency(0); //set machine frequency + jump_frames=0; + ordenador.turbo_state = 0; + } + return; + } + + //Auto ultra fast mode + if ((ordenador.turbo_state != 3)&&(ordenador.turbo==1)) + { + update_frequency(15000000); + jump_frames=24; + ordenador.precision =0; + ordenador.turbo_state = 3; + } + if(ordenador.tape_file_type == TAP_TAP) tape_read_tap(fichero,tstados); else