mirror of
https://github.com/Oibaf66/fbzx-wii.git
synced 2024-12-24 23:51:52 +01:00
Added Load for Spanish 128k, added mdr and tape file creation menu, added poke menu, improved snow emulation.
This commit is contained in:
parent
9a6a0bb4d6
commit
f47105c496
@ -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;
|
||||
}
|
||||
|
@ -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)));
|
||||
|
@ -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
|
||||
|
||||
|
276
src/gui_sdl.c
276
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;
|
||||
|
434
src/menu_sdl.c
434
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);
|
||||
}
|
||||
|
@ -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__ */
|
||||
|
Loading…
Reference in New Issue
Block a user