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