Added Load for Spanish 128k, added mdr and tape file creation menu, added poke menu, improved snow emulation.

This commit is contained in:
fabio.olimpieri 2012-08-05 21:56:13 +00:00
parent 9a6a0bb4d6
commit f47105c496
6 changed files with 766 additions and 51 deletions

View File

@ -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;
}

View File

@ -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)));

View File

@ -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

View File

@ -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;

View File

@ -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);
}

View File

@ -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__ */