From f47105c49630076673b835e35d9369a2f1e03623 Mon Sep 17 00:00:00 2001 From: "fabio.olimpieri" Date: Sun, 5 Aug 2012 21:56:13 +0000 Subject: [PATCH] Added Load for Spanish 128k, added mdr and tape file creation menu, added poke menu, improved snow emulation. --- src/VirtualKeyboard.c | 6 +- src/computer.c | 91 ++++++--- src/computer.h | 1 + src/gui_sdl.c | 276 +++++++++++++++++++++++++-- src/menu_sdl.c | 434 ++++++++++++++++++++++++++++++++++++++++++ src/menu_sdl.h | 9 +- 6 files changed, 766 insertions(+), 51 deletions(-) diff --git a/src/VirtualKeyboard.c b/src/VirtualKeyboard.c index e71f8e3..603d4df 100644 --- a/src/VirtualKeyboard.c +++ b/src/VirtualKeyboard.c @@ -70,7 +70,7 @@ void draw() 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; + int border_y = (screen_h - (key_h * KEY_ROWS)) / 2 + 50/RATIO; SDL_Rect bg_rect = {border_x, border_y, key_w * KEY_COLS, key_h * KEY_ROWS}; @@ -170,7 +170,7 @@ struct virtkey *get_key_internal() struct virtkey* get_key() { virtkey_t *key; - SDL_Rect rect = {32/RATIO, 120/RATIO, FULL_DISPLAY_X-64/RATIO, FULL_DISPLAY_Y-250/RATIO}; + SDL_Rect rect = {32/RATIO, (120+50)/RATIO, FULL_DISPLAY_X-64/RATIO, FULL_DISPLAY_Y-250/RATIO}; keys[3 * KEY_COLS + 0 ].is_done = 0; //Caps Shit keys[3 * KEY_COLS + 8 ].is_done = 0; //Sym Shift @@ -179,7 +179,7 @@ struct virtkey* get_key() key = get_key_internal(); - clean_screen(); + //clean_screen(); return key; } diff --git a/src/computer.c b/src/computer.c index 6bef7e9..66f4794 100644 --- a/src/computer.c +++ b/src/computer.c @@ -63,8 +63,8 @@ inline byte bus_empty () { tstates */ inline void emulate_screen (int tstados) { - - if((procesador.I & 0xC0) == 0x40) { // (procesador.I>=0x40)&&(procesador.I<=0x7F) + + if(((procesador.I & 0xC0) == 0x40)&&(ordenador.mode128k!=3)) { // (procesador.I>=0x40)&&(procesador.I<=0x7F) ordenador.screen_snow=1; } else ordenador.screen_snow=0; @@ -160,6 +160,7 @@ void computer_init () { ordenador.autoconf=0; ordenador.cpufreq = 3500000; // values for 48K mode + ordenador.fetch_state =0; } void computer_set_palete() { @@ -592,7 +593,7 @@ inline void show_screen (int tstados) { // Snow Effect if(ordenador.screen_snow) { - temporal3 = ordenador.memoria[(((*ordenador.p_translt) + (ordenador.video_offset))&0xFFFFFF00)+(procesador.R)]; // data with snow + temporal3 = ordenador.memoria[(((*ordenador.p_translt) + (ordenador.video_offset))&0xFFFFFF80)+(procesador.R&0x7F)]; // data with snow ordenador.screen_snow=0; // no more snow for now } else temporal3 = ordenador.memoria[(*ordenador.p_translt) + ordenador.video_offset]; // bitmap // bitmap @@ -716,13 +717,19 @@ inline void show_screen_precision (int tstados) { if ((ordenador.currline == ordenador.upper_border_line) && (ordenador.currpix == 46)) { - temporal = ordenador.memoria[(*ordenador.p_translt2) + ordenador.video_offset]; // attributes - temporal2 = ordenador.memoria[(*ordenador.p_translt) + ordenador.video_offset]; // bitmap - temporal_1 = ordenador.memoria[(*(ordenador.p_translt2+1)) + ordenador.video_offset]; // attributes - temporal2_1 = ordenador.memoria[((*ordenador.p_translt+1)) + ordenador.video_offset]; // bitmap + temporal = ordenador.memoria[(*ordenador.p_translt2) + ordenador.video_offset]; // attributes first byte + temporal2 = ordenador.memoria[(*ordenador.p_translt) + ordenador.video_offset]; // bitmap first byte + temporal_1 = ordenador.memoria[(*(ordenador.p_translt2+1)) + ordenador.video_offset]; // attributes second byte + temporal2_1 = ordenador.memoria[(*(ordenador.p_translt+1)) + ordenador.video_offset]; // bitmap second byte + + if((ordenador.fetch_state==2)&&((procesador.I & 0xC0) == 0x40)) { + temporal2 = ordenador.memoria[(((*(ordenador.p_translt)) + (ordenador.video_offset))&0xFFFFFF80)+(procesador.R&0x7F)]; // bitmap with snow first byte + temporal = ordenador.memoria[(((*(ordenador.p_translt2)) + (ordenador.video_offset))&0xFFFFFF80)+(procesador.R&0x7F)]; // attributes with snow first byte + } ordenador.p_translt+=2; ordenador.p_translt2+=2; + ordenador.bus_value = temporal2; } @@ -748,12 +755,6 @@ inline void show_screen_precision (int tstados) { fflash = temporal & 0x80; // flash flag } - // Snow Effect - - if(ordenador.screen_snow) { - temporal3 = ordenador.memoria[(((*ordenador.p_translt) + (ordenador.video_offset))&0xFFFFFF00)+(procesador.R)]; // data with snow - ordenador.screen_snow=0; // no more snow for now - } else temporal3 = temporal2; // bitmap break; @@ -780,10 +781,10 @@ inline void show_screen_precision (int tstados) { case 14: //sample the memory - temporal = ordenador.memoria[(*ordenador.p_translt2) + ordenador.video_offset]; // attributes - temporal2 = ordenador.memoria[(*ordenador.p_translt) + ordenador.video_offset]; // bitmap - temporal_1 = ordenador.memoria[(*(ordenador.p_translt2+1)) + ordenador.video_offset]; // attributes - temporal2_1 = ordenador.memoria[((*ordenador.p_translt+1)) + ordenador.video_offset]; // bitmap + temporal = ordenador.memoria[(*ordenador.p_translt2) + ordenador.video_offset]; // attributes first byte + temporal2 = ordenador.memoria[(*ordenador.p_translt) + ordenador.video_offset]; // bitmap first byte + temporal_1 = ordenador.memoria[(*(ordenador.p_translt2+1)) + ordenador.video_offset]; // attributes second byte + temporal2_1 = ordenador.memoria[(*(ordenador.p_translt+1)) + ordenador.video_offset]; // bitmap second byte ordenador.p_translt+=2; ordenador.p_translt2+=2; @@ -792,23 +793,32 @@ inline void show_screen_precision (int tstados) { } //Floating bus - if (ordenador.currpix < 295) + if ((ordenador.currpix < 295) && (ordenador.mode128k != 3)) //no floating bus and snow effect in +3 switch (ordenador.pixels_word) { case 14: - // bitmap + if((ordenador.fetch_state==2)&&((procesador.I & 0xC0) == 0x40)) { + temporal2 = ordenador.memoria[(((*(ordenador.p_translt-2)) + (ordenador.video_offset))&0xFFFFFF80)+(procesador.R&0x7F)]; // bitmap with snow second byte + temporal = ordenador.memoria[(((*(ordenador.p_translt2-2)) + (ordenador.video_offset))&0xFFFFFF80)+(procesador.R&0x7F)]; // attributes with snow second byte + } + // bitmap first byte ordenador.bus_value = temporal2; break; case 0: - // attributes + // attributes first byte ordenador.bus_value = temporal; break; case 2: - // bitmap + // Snow Effect + if((ordenador.fetch_state==2)&&((procesador.I & 0xC0) == 0x40)) { + temporal2_1 = ordenador.memoria[(((*(ordenador.p_translt-1)) + (ordenador.video_offset))&0xFFFFFF80)+(((*(ordenador.p_translt-2)) + (ordenador.video_offset))&0x7F)]; // bitmap with snow second byte + temporal_1 = ordenador.memoria[(((*(ordenador.p_translt2-1)) + (ordenador.video_offset))&0xFFFFFF80)+(((*(ordenador.p_translt2-2)) + (ordenador.video_offset))&0x7F)]; // attributes with snow second byte + } + // bitmap second byte ordenador.bus_value = temporal2_1; break; case 4: - // attributes + // attributes second byte ordenador.bus_value = temporal_1; break; default: @@ -827,6 +837,7 @@ inline void show_screen_precision (int tstados) { //Update pixel position ordenador.cicles_counter++; ordenador.currpix += 2; + if (ordenador.fetch_state) ordenador.fetch_state--; if (ordenador.currpix > ordenador.pixancho) { ordenador.currpix = 0; ordenador.currline++; @@ -1085,8 +1096,28 @@ inline void read_keyboard () { case SDLK_F9: //Emulate load "" - ordenador.keyboard_buffer[0][6]= SDLK_1; //Edit - ordenador.keyboard_buffer[1][6]= SDLK_LSHIFT; + if (ordenador.mode128k==4) //Spanish 128k + { + 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=8; + } + else + { ordenador.keyboard_buffer[0][5]= SDLK_j; //Load ordenador.keyboard_buffer[1][5]= 0; ordenador.keyboard_buffer[0][4]= SDLK_p; //" @@ -1097,7 +1128,10 @@ inline void read_keyboard () { ordenador.keyboard_buffer[1][2]= 0; ordenador.keyboard_buffer[0][1]= SDLK_F6; //F6 ordenador.keyboard_buffer[1][1]= 0; - ordenador.kbd_buffer_pointer=6; + ordenador.kbd_buffer_pointer=5; + } + + countdown=8; break; @@ -1541,24 +1575,25 @@ byte Z80free_Rd_fetch (register word Addr) { ordenador.r_fetch+=4; switch (Addr & 0xC000) { case 0x0000: - if (ordenador.precision) emulate_screen (4); + if (ordenador.precision) {ordenador.fetch_state=4;emulate_screen (4);} return ((byte) (*(ordenador.block0 + Addr))); break; case 0x4000: do_contention(); - if (ordenador.precision) emulate_screen (4); + if (ordenador.precision) {ordenador.fetch_state=4;emulate_screen (4);} return ((byte) (*(ordenador.block1 + Addr))); break; case 0x8000: - if (ordenador.precision) emulate_screen (4); + if (ordenador.precision) {ordenador.fetch_state=4;emulate_screen (4);} return ((byte) (*(ordenador.block2 + Addr))); break; case 0xC000: if (ordenador.precision) { if (((ordenador.mode128k==1)||(ordenador.mode128k==2)||(ordenador.mode128k==4))&&(ordenador.mport1 & 0x01)) do_contention(); + ordenador.fetch_state=4; emulate_screen (4); } return ((byte) (*(ordenador.block3 + Addr))); diff --git a/src/computer.h b/src/computer.h index 34fcb55..ac03bfb 100644 --- a/src/computer.h +++ b/src/computer.h @@ -79,6 +79,7 @@ struct computer { int end_contention; //end tstados for contention unsigned char screen_snow; // 0-> no emulate snow; 1-> emulate snow + unsigned char fetch_state; //unsigned char contended_zone; // 0-> no contention; 1-> contention possible int cicles_counter; // counts how many pixel clock cicles passed since las interrupt diff --git a/src/gui_sdl.c b/src/gui_sdl.c index 137854e..799500d 100644 --- a/src/gui_sdl.c +++ b/src/gui_sdl.c @@ -34,6 +34,7 @@ #include "menus.h" #include "emulator.h" #include "cargador.h" +#include "characters.h" #define ID_BUTTON_OFFSET 0 #define ID_AXIS_OFFSET 32 @@ -235,7 +236,7 @@ static void insert_tape() if (!strncmp(filename,"smb:",4)) ordenador.tap_file=fopen(filename,"r"); //tinysmb does not work with r+ else ordenador.tap_file=fopen(filename,"r+"); // read and write - ordenador.tape_write = 0; // by default, can't record + ordenador.tape_write = 1; // by default, can record if(ordenador.tap_file==NULL) retorno=-1; @@ -281,7 +282,69 @@ static void delete_tape() free((void *)filename); } + +void create_tapfile_sdl() { + + unsigned char *videomem; + int ancho,retorno; + unsigned char nombre2[1024]; + + videomem=screen->pixels; + ancho=screen->w; + + clean_screen(); + + print_string(videomem,"Choose a name for the TAP file",-1,32,14,0,ancho); + print_string(videomem,"(up to 30 characters)",-1,52,14,0,ancho); + + print_string(videomem,"TAP file will be saved in:",-1,112,12,0,ancho); + print_string(videomem,path_taps,0,132,12,0,ancho); + + + retorno=ask_filename_sdl(nombre2,82,"tap",path_taps,NULL); + + clean_screen(); + + if(retorno==2) // abort + return; + + if(ordenador.tap_file!=NULL) + fclose(ordenador.tap_file); + ordenador.tap_file=fopen(nombre2,"r"); // test if it exists + if(ordenador.tap_file==NULL) + retorno=0; + else + retorno=-1; + + if(!retorno) { + ordenador.tap_file=fopen(nombre2,"a+"); // create for read and write + if(ordenador.tap_file==NULL) + retorno=-2; + else + retorno=0; + } + ordenador.tape_write=1; // allow to write + strcpy(ordenador.current_tap,nombre2); + ordenador.tape_file_type = TAP_TAP; + switch(retorno) { + case 0: + break; + case -1: + print_string(videomem,"File already exists",-1,80,10,0,ancho); + SDL_Flip(screen); + ordenador.current_tap[0]=0; + SDL_Delay(3000); + break; + case -2: + print_string(videomem,"Can't create file",-1,80,10,0,ancho); + ordenador.current_tap[0]=0; + SDL_Flip(screen); + SDL_Delay(3000); + break; + } + clean_screen(); +} static void manage_tape(int which) { @@ -291,20 +354,42 @@ static void manage_tape(int which) insert_tape(); break; case 1: //Emulate load "" - ordenador.kbd_buffer_pointer=6; countdown=8; - ordenador.keyboard_buffer[0][6]= SDLK_1; //Edit - ordenador.keyboard_buffer[1][6]= SDLK_LSHIFT; - 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; + if (ordenador.mode128k==4) //Spanish 128k + { + 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=8; + } + else + { + 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=5; + } + break; case 2: //Play if ((ordenador.tape_fast_load == 0) || (ordenador.tape_file_type==TAP_TZX)) @@ -324,7 +409,8 @@ static void manage_tape(int which) break; case 5: //Create // Create tape - msgInfo("Not yet implemented",3000,NULL); + create_tapfile_sdl(); + //msgInfo("Not yet implemented",3000,NULL); break; case 6: //Delete delete_tape(); @@ -612,6 +698,71 @@ static void delete_mdr() free((void *)filename); } +void create_mdrfile_sdl() { + + unsigned char *videomem; + int ancho,retorno,bucle,retval; + unsigned char nombre2[1024]; + + videomem=screen->pixels; + ancho=screen->w; + + clean_screen(); + + print_string(videomem,"Choose a name for the MDR file",-1,32,14,0,ancho); + print_string(videomem,"(up to 30 characters)",-1,52,14,0,ancho); + + print_string(videomem,"MDR file will be saved in:",-1,112,12,0,ancho); + print_string(videomem,path_mdrs,0,132,12,0,ancho); + + retorno=ask_filename_sdl(nombre2,82,"mdr",path_mdrs, NULL); + + clean_screen(); + + if(retorno==2) // abort + return; + + ordenador.mdr_file=fopen(nombre2,"r"); // test if it exists + if(ordenador.mdr_file==NULL) + retorno=0; + else + retorno=-1; + + if(!retorno) { + ordenador.mdr_file=fopen(nombre2,"wb"); // create for write + if(ordenador.mdr_file==NULL) + retorno=-2; + else { + for(bucle=0;bucle<137921;bucle++) + ordenador.mdr_cartridge[bucle]=0xFF; // erase cartridge + ordenador.mdr_cartridge[137922]=0; + retval=fwrite(ordenador.mdr_cartridge,137923,1,ordenador.mdr_file); // save cartridge + fclose(ordenador.mdr_file); + ordenador.mdr_file=NULL; + ordenador.mdr_modified=0; + retorno=0; + } + } + strcpy(ordenador.mdr_current_mdr,nombre2); + switch(retorno) { + case 0: + break; + case -1: + print_string(videomem,"File already exists",-1,80,10,0,ancho); + ordenador.mdr_current_mdr[0]=0; + SDL_Flip(screen); + SDL_Delay(3000); + break; + case -2: + print_string(videomem,"Can't create file",-1,80,10,0,ancho); + ordenador.mdr_current_mdr[0]=0; + SDL_Flip(screen); + SDL_Delay(3000); + break; + } + clean_screen(); +} + static void microdrive() { @@ -657,7 +808,8 @@ static void microdrive() break; case 1: // Create microdrive file // Create microdrive file ; - msgInfo("Not yet implemented",3000,NULL); + create_mdrfile_sdl(); + //msgInfo("Not yet implemented",3000,NULL); break; case 2: // Delete microdrive file delete_mdr(); @@ -836,6 +988,95 @@ static void set_port(int which) } } +// shows the POKE menu + +void do_poke_sdl() { + + unsigned char *videomem,string[80]; + int ancho,retorno,address,old_value,new_value; + + videomem=screen->pixels; + ancho=screen->w; + + clean_screen(); + + while(1) { + print_string(videomem,"Type address to POKE",-1,32,15,0,ancho); + //print_string(videomem,"(ESC to exit)",-1,52,12,0,ancho); + + retorno=ask_value_sdl(&address,84,65535); + + clean_screen(); + + if (retorno==2) { + return; + } + + if ((address<16384) && ((ordenador.mode128k != 3) || (1 != (ordenador.mport2 & 0x01)))) { + print_string(videomem,"That address is ROM memory.",-1,13,15,0,ancho); + continue; + } + + switch (address & 0x0C000) { + case 0x0000: + old_value= (*(ordenador.block0 + address)); + break; + + case 0x4000: + old_value= (*(ordenador.block1 + address)); + break; + + case 0x8000: + old_value= (*(ordenador.block2 + address)); + break; + + case 0xC000: + old_value= (*(ordenador.block3 + address)); + break; + default: + old_value=0; + break; + } + + print_string(videomem,"Type new value to POKE",-1,32,15,0,ancho); + //print_string(videomem,"(ESC to cancel)",-1,52,12,0,ancho); + sprintf(string,"Address: %d; old value: %d\n",address,old_value); + print_string(videomem,string,-1,130,14,0,ancho); + + retorno=ask_value_sdl(&new_value,84,255); + + clean_screen(); + + if (retorno==2) { + continue; + } + + switch (address & 0x0C000) { + case 0x0000: + (*(ordenador.block0 + address))=new_value; + break; + + case 0x4000: + (*(ordenador.block1 + address))=new_value; + break; + + case 0x8000: + (*(ordenador.block2 + address))=new_value; + break; + + case 0xC000: + (*(ordenador.block3 + address))=new_value; + break; + default: + break; + } + + sprintf(string,"Set address %d from %d to %d\n",address,old_value,new_value); + print_string(videomem,string,-1,130,14,0,ancho); + + } +} + static void tools() { int opt ; @@ -865,7 +1106,8 @@ static void tools() break; case 6: // Insert poke // Insert poke ; - msgInfo("Not yet implemented",3000,NULL); + do_poke_sdl(); + //msgInfo("Not yet implemented",3000,NULL); break; default: break; diff --git a/src/menu_sdl.c b/src/menu_sdl.c index 9b9a7a5..d8cd3b3 100644 --- a/src/menu_sdl.c +++ b/src/menu_sdl.c @@ -38,6 +38,7 @@ #include "emulator.h" #include "VirtualKeyboard.h" +#include "characters.h" typedef struct @@ -1023,3 +1024,436 @@ int menu_is_inited(void) { return is_inited; } + +int ask_value_sdl(int *final_value,int y_coord,int max_value) { + + unsigned char nombre2[50]; + unsigned char *videomem; + int ancho,value,tmp,retorno; + struct virtkey *virtualkey; + unsigned int sdl_key; + + videomem=screen->pixels; + ancho=screen->w; + + retorno=0; + value=0; + do { + sprintf (nombre2, " %d\177 ", value); + print_string (videomem, nombre2, -1, y_coord, 15, 0, ancho); + + virtualkey = get_key(); + if (virtualkey == NULL) return(2); + sdl_key = virtualkey->sdl_code; + + switch (sdl_key) { + case SDLK_BACKSPACE: + value/=10; + break; + case SDLK_ESCAPE: + retorno=2; + break; + case SDLK_RETURN: + retorno=1; + break; + case SDLK_0: + tmp=value * 10; + if (tmp <= max_value) { + value=tmp; + } + break; + case SDLK_1: + tmp=1+value * 10; + if (tmp <= max_value) { + value=tmp; + } + break; + case SDLK_2: + tmp=2+value * 10; + if (tmp <= max_value) { + value=tmp; + } + break; + case SDLK_3: + tmp=3+value * 10; + if (tmp <= max_value) { + value=tmp; + } + break; + case SDLK_4: + tmp=4+value * 10; + if (tmp <= max_value) { + value=tmp; + } + break; + case SDLK_5: + tmp=5+value * 10; + if (tmp <= max_value) { + value=tmp; + } + break; + case SDLK_6: + tmp=6+value * 10; + if (tmp <= max_value) { + value=tmp; + } + break; + case SDLK_7: + tmp=7+value * 10; + if (tmp <= max_value) { + value=tmp; + } + break; + case SDLK_8: + tmp=8+value * 10; + if (tmp <= max_value) { + value=tmp; + } + break; + case SDLK_9: + tmp=9+value * 10; + if (tmp <= max_value) { + value=tmp; + } + break; + } + } while (!retorno); + + *final_value=value; + + return (retorno); +} + +int ask_filename_sdl(char *nombre_final,int y_coord,char *extension, char *path, char *name) { + + int longitud,retorno; + unsigned char nombre[37],nombre2[38]; + char *ptr; + + unsigned char *videomem; + int ancho; + + struct virtkey *virtualkey; + unsigned int sdl_key; + + videomem=screen->pixels; + ancho=screen->w; + + retorno=0; + + if (!name||(strlen(name)>36)) + { + nombre[0]=127; + nombre[1]=0; + } + else + { + strcpy(nombre,name); + ptr = strrchr (nombre, '.'); + if (ptr) //remove the extension + { + *ptr = 127; + *(ptr+1) = 0; + } + else + nombre[strlen(nombre)-1]=127; + nombre[strlen(nombre)]=0; + } + + longitud=strlen(nombre)-1; + + + do { + sprintf (nombre2, " %s.%s ", nombre,extension); + print_string (videomem, nombre2, -1, y_coord, 15, 0, ancho); + + virtualkey = get_key(); + if (virtualkey == NULL) return(2); + sdl_key = virtualkey->sdl_code; + + switch (sdl_key) { + case SDLK_BACKSPACE: + if (longitud > 0) { + nombre[longitud]=0; + longitud--; + nombre[longitud]=127; + } + break; + case SDLK_ESCAPE: + retorno=2; + break; + case SDLK_RETURN: + retorno=1; + break; + case SDLK_a: + if (longitud < 30) { + nombre[longitud++]='a'; + nombre[longitud]=127; + nombre[longitud + 1]=0; + } + break; + case SDLK_b: + if (longitud < 30) { + nombre[longitud++]='b'; + nombre[longitud]=127; + nombre[longitud + 1]=0; + } + break; + case SDLK_c: + if (longitud < 30) { + nombre[longitud++]='c'; + nombre[longitud]=127; + nombre[longitud + 1]=0; + } + break; + case SDLK_d: + if (longitud < 30) { + nombre[longitud++]='d'; + nombre[longitud]=127; + nombre[longitud + 1]=0; + } + break; + case SDLK_e: + if (longitud < 30) { + nombre[longitud++]='e'; + nombre[longitud]=127; + nombre[longitud + 1]=0; + } + break; + case SDLK_f: + if (longitud < 30) { + nombre[longitud++]='f'; + nombre[longitud]=127; + nombre[longitud + 1]=0; + } + break; + case SDLK_g: + if (longitud < 30) { + nombre[longitud++]='g'; + nombre[longitud]=127; + nombre[longitud + 1]=0; + } + break; + case SDLK_h: + if (longitud < 30) { + nombre[longitud++]='h'; + nombre[longitud]=127; + nombre[longitud + 1]=0; + } + break; + case SDLK_i: + if (longitud < 30) { + nombre[longitud++]='i'; + nombre[longitud]=127; + nombre[longitud + 1]=0; + } + break; + case SDLK_j: + if (longitud < 30) { + nombre[longitud++]='j'; + nombre[longitud]=127; + nombre[longitud + 1]=0; + } + break; + case SDLK_k: + if (longitud < 30) { + nombre[longitud++]='k'; + nombre[longitud]=127; + nombre[longitud + 1]=0; + } + break; + case SDLK_l: + if (longitud < 30) { + nombre[longitud++]='l'; + nombre[longitud]=127; + nombre[longitud + 1]=0; + } + break; + case SDLK_m: + if (longitud < 30) { + nombre[longitud++]='m'; + nombre[longitud]=127; + nombre[longitud + 1]=0; + } + break; + case SDLK_n: + if (longitud < 30) { + nombre[longitud++]='n'; + nombre[longitud]=127; + nombre[longitud + 1]=0; + } + break; + case SDLK_o: + if (longitud < 30) { + nombre[longitud++]='o'; + nombre[longitud]=127; + nombre[longitud + 1]=0; + } + break; + case SDLK_p: + if (longitud < 30) { + nombre[longitud++]='p'; + nombre[longitud]=127; + nombre[longitud + 1]=0; + } + break; + case SDLK_q: + if (longitud < 30) { + nombre[longitud++]='q'; + nombre[longitud]=127; + nombre[longitud + 1]=0; + } + break; + case SDLK_r: + if (longitud < 30) { + nombre[longitud++]='r'; + nombre[longitud]=127; + nombre[longitud + 1]=0; + } + break; + case SDLK_s: + if (longitud < 30) { + nombre[longitud++]='s'; + nombre[longitud]=127; + nombre[longitud + 1]=0; + } + break; + case SDLK_t: + if (longitud < 30) { + nombre[longitud++]='t'; + nombre[longitud]=127; + nombre[longitud + 1]=0; + } + break; + case SDLK_u: + if (longitud < 30) { + nombre[longitud++]='u'; + nombre[longitud]=127; + nombre[longitud + 1]=0; + } + break; + case SDLK_v: + if (longitud < 30) { + nombre[longitud++]='v'; + nombre[longitud]=127; + nombre[longitud + 1]=0; + } + break; + case SDLK_w: + if (longitud < 30) { + nombre[longitud++]='w'; + nombre[longitud]=127; + nombre[longitud + 1]=0; + } + break; + case SDLK_x: + if (longitud < 30) { + nombre[longitud++]='x'; + nombre[longitud]=127; + nombre[longitud + 1]=0; + } + break; + case SDLK_y: + if (longitud < 30) { + nombre[longitud++]='y'; + nombre[longitud]=127; + nombre[longitud + 1]=0; + } + break; + case SDLK_z: + if (longitud < 30) { + nombre[longitud++]='z'; + nombre[longitud]=127; + nombre[longitud + 1]=0; + } + break; + case SDLK_0: + if (longitud < 30) { + nombre[longitud++]='0'; + nombre[longitud]=127; + nombre[longitud + 1]=0; + } + break; + case SDLK_1: + if (longitud < 30) { + nombre[longitud++]='1'; + nombre[longitud]=127; + nombre[longitud + 1]=0; + } + break; + case SDLK_2: + if (longitud < 30) { + nombre[longitud++]='2'; + nombre[longitud]=127; + nombre[longitud + 1]=0; + } + break; + case SDLK_3: + if (longitud < 30) { + nombre[longitud++]='3'; + nombre[longitud]=127; + nombre[longitud + 1]=0; + } + break; + case SDLK_4: + if (longitud < 30) { + nombre[longitud++]='4'; + nombre[longitud]=127; + nombre[longitud + 1]=0; + } + break; + case SDLK_5: + if (longitud < 30) { + nombre[longitud++]='5'; + nombre[longitud]=127; + nombre[longitud + 1]=0; + } + break; + case SDLK_6: + if (longitud < 30) { + nombre[longitud++]='6'; + nombre[longitud]=127; + nombre[longitud + 1]=0; + } + break; + case SDLK_7: + if (longitud < 30) { + nombre[longitud++]='7'; + nombre[longitud]=127; + nombre[longitud + 1]=0; + } + break; + case SDLK_8: + if (longitud < 30) { + nombre[longitud++]='8'; + nombre[longitud]=127; + nombre[longitud + 1]=0; + } + break; + case SDLK_9: + if (longitud < 30) { + nombre[longitud++]='9'; + nombre[longitud]=127; + nombre[longitud + 1]=0; + } + break; + case SDLK_MINUS: + if (longitud < 30) { + nombre[longitud++]='-'; + nombre[longitud]=127; + nombre[longitud + 1]=0; + } + break; + } + } while (!retorno); + + nombre[longitud]=0; // erase cursor + + longitud=strlen(path); + if((path[longitud-1]!='/')&&(longitud>1)) + sprintf(nombre_final,"%s/%s.%s",path,nombre,extension); // name + else + sprintf(nombre_final,"%s%s.%s",path,nombre,extension); + + return (retorno); +} diff --git a/src/menu_sdl.h b/src/menu_sdl.h index da12ad2..04cd0ca 100644 --- a/src/menu_sdl.h +++ b/src/menu_sdl.h @@ -55,10 +55,10 @@ const char *menu_select_file_start(const char *dir_path, const char **d64_name); uint32_t menu_wait_key_press(void); -extern void msgKill(SDL_Rect *rc); -extern int msgInfo(char *text, int duration, SDL_Rect *rc); +void msgKill(SDL_Rect *rc); +int msgInfo(char *text, int duration, SDL_Rect *rc); -extern int msgYesNo(char *text, int def,int x, int y); +int msgYesNo(char *text, int def,int x, int y); void font_init(); @@ -68,5 +68,8 @@ int menu_is_inited(void); int ext_matches(const char *name, const char *ext); +int ask_value_sdl(int *final_value,int y_coord,int max_value); + +int ask_filename_sdl(char *nombre_final,int y_coord,char *extension, char *path, char *name); #endif /* !__MENU_H__ */