Merge pull request #51 from digarok/v0.14

V0.14
This commit is contained in:
Dagen Brock 2018-09-11 17:25:46 -05:00 committed by GitHub
commit df0833994a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 106 additions and 36 deletions

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 180 KiB

After

Width:  |  Height:  |  Size: 118 KiB

View File

@ -11,6 +11,7 @@
#include "glog.h" #include "glog.h"
int g_fullscreen = 0; int g_fullscreen = 0;
int g_grabmouse = 0;
extern int Verbose; extern int Verbose;
extern word32 g_vbl_count; extern word32 g_vbl_count;
@ -99,9 +100,13 @@ STRUCT(Mouse_fifo) {
int x; int x;
int y; int y;
int buttons; int buttons;
int delta_x;
int delta_y;
int dxrd;
int dyrd;
}; };
Mouse_fifo g_mouse_fifo[ADB_MOUSE_FIFO] = { { 0, 0, 0, 0 } }; Mouse_fifo g_mouse_fifo[ADB_MOUSE_FIFO] = { { 0, 0, 0, 0, 0, 0 ,0 ,0} };
int g_mouse_warp_x = 0; int g_mouse_warp_x = 0;
int g_mouse_warp_y = 0; int g_mouse_warp_y = 0;
@ -1066,6 +1071,20 @@ int adb_get_keypad_xy(int get_y) {
} }
} }
// stub in a wrapper to experiment with full delta movement
int g_delta_x = 0;
int g_delta_y = 0;
int update_mouse_w_delta(int x, int y, int button_states, int buttons_valid, int delta_x, int delta_y) {
g_delta_x = delta_x;
g_delta_y = delta_y;
//glogf("dx: %d dy: %d but: %02x", delta_x, delta_y, button_states);
int ret = 0;
ret = update_mouse(x,y,button_states,buttons_valid);
g_delta_x = 0;
g_delta_y = 0;
return ret;
}
int update_mouse(int x, int y, int button_states, int buttons_valid) { int update_mouse(int x, int y, int button_states, int buttons_valid) {
double dcycs; double dcycs;
int button1_changed; int button1_changed;
@ -1139,29 +1158,31 @@ int update_mouse(int x, int y, int button_states, int buttons_valid) {
g_mouse_warp_x, g_mouse_warp_y, g_mouse_fifo[0].x, g_mouse_warp_x, g_mouse_warp_y, g_mouse_fifo[0].x,
g_mouse_fifo[0].y, g_mouse_a2_x, g_mouse_a2_y); g_mouse_fifo[0].y, g_mouse_a2_x, g_mouse_a2_y);
#endif #endif
if (!g_grabmouse) {
mouse_moved = (g_mouse_fifo[0].x != x) || (g_mouse_fifo[0].y != y); mouse_moved = ((g_mouse_fifo[0].x != x) || (g_mouse_fifo[0].y != y));
}
g_mouse_a2_x += g_mouse_warp_x; g_mouse_a2_x += g_mouse_warp_x;
g_mouse_a2_y += g_mouse_warp_y; g_mouse_a2_y += g_mouse_warp_y;
g_mouse_fifo[0].x = x; g_mouse_fifo[0].x = x;
g_mouse_fifo[0].y = y; g_mouse_fifo[0].y = y;
g_mouse_fifo[0].dcycs = dcycs; g_mouse_fifo[0].dcycs = dcycs;
g_mouse_fifo[0].delta_x = g_delta_x;
g_mouse_fifo[0].delta_y = g_delta_y;
g_mouse_warp_x = 0; g_mouse_warp_x = 0;
g_mouse_warp_y = 0; g_mouse_warp_y = 0;
button1_changed = (buttons_valid & 1) && button1_changed = (buttons_valid & 1) &&
((button_states & 1) != (g_mouse_fifo[0].buttons & 1)); ((button_states & 1) != (g_mouse_fifo[0].buttons & 1)); //<- make sure fifo doesn't already have pending change to this state
if((button_states & 4) && !(g_mouse_fifo[0].buttons & 4) &&
(buttons_valid & 4)) { if((button_states & 4) && !(g_mouse_fifo[0].buttons & 4) && // fifo check why?
/* right button pressed */ (buttons_valid & 4)) { // right button pressed
adb_increment_speed(); adb_increment_speed();
} }
if((button_states & 2) && !(g_mouse_fifo[0].buttons & 2) && if((button_states & 2) && !(g_mouse_fifo[0].buttons & 2) && // fifo check why?
(buttons_valid & 2)) { (buttons_valid & 2)) {
/* middle button pressed */ adb_increment_speed(); // middle button pressed
adb_increment_speed();
//halt2_printf("Middle button pressed\n"); //halt2_printf("Middle button pressed\n");
} }
@ -1175,10 +1196,15 @@ int update_mouse(int x, int y, int button_states, int buttons_valid) {
g_mouse_fifo[i + 1] = g_mouse_fifo[i]; /* copy struct*/ g_mouse_fifo[i + 1] = g_mouse_fifo[i]; /* copy struct*/
} }
g_mouse_fifo_pos = pos + 1; g_mouse_fifo_pos = pos + 1;
}
}
g_mouse_fifo[0].buttons = (button_states & buttons_valid) | g_mouse_fifo[0].buttons = (button_states & buttons_valid) |
(g_mouse_fifo[0].buttons & ~buttons_valid); (g_mouse_fifo[0].buttons & ~buttons_valid);
if (g_grabmouse) {
if (pos > 0) {
mouse_moved = (g_mouse_fifo[0].delta_x || g_mouse_fifo[0].delta_y );
}
}
if(mouse_moved || button1_changed) { if(mouse_moved || button1_changed) {
if( (g_mouse_ctl_addr == g_mouse_dev_addr) && if( (g_mouse_ctl_addr == g_mouse_dev_addr) &&
@ -1192,6 +1218,7 @@ int update_mouse(int x, int y, int button_states, int buttons_valid) {
} }
int mouse_read_c024(double dcycs) { int mouse_read_c024(double dcycs) {
word32 ret; word32 ret;
word32 tool_start; word32 tool_start;
int em_active; int em_active;
@ -1217,6 +1244,10 @@ int mouse_read_c024(double dcycs) {
mouse_button = (g_mouse_fifo[pos].buttons & 1); mouse_button = (g_mouse_fifo[pos].buttons & 1);
delta_x = target_x - g_mouse_a2_x; delta_x = target_x - g_mouse_a2_x;
delta_y = target_y - g_mouse_a2_y; delta_y = target_y - g_mouse_a2_y;
if (g_grabmouse) {
delta_x = g_mouse_fifo[pos].delta_x;
delta_y = g_mouse_fifo[pos].delta_y;
}
clamped = 0; clamped = 0;
if(delta_x > 0x3f) { if(delta_x > 0x3f) {
@ -1244,9 +1275,13 @@ int mouse_read_c024(double dcycs) {
if(g_adb_mouse_coord) { if(g_adb_mouse_coord) {
/* y coord */ /* y coord */
delta_x = 0; /* clear unneeded x delta */ delta_x = 0; // clear unneeded x delta
g_mouse_fifo[pos].dyrd = 1; // flag y delta as read
g_mouse_fifo[pos].delta_y = 0; // clear y delta
} else { } else {
delta_y = 0; /* clear unneeded y delta */ delta_y = 0; // clear unneeded y delta
g_mouse_fifo[pos].dxrd = 1; // flag x delta as read
g_mouse_fifo[pos].delta_x = 0; // clear x delta
} }
@ -1320,10 +1355,17 @@ int mouse_read_c024(double dcycs) {
g_mouse_a2_x = a2_x; g_mouse_a2_x = a2_x;
g_mouse_a2_y = a2_y; g_mouse_a2_y = a2_y;
if(g_mouse_fifo_pos) { if(g_mouse_fifo_pos) {
if (!g_grabmouse) {
if((target_x == a2_x) && (target_y == a2_y) && if((target_x == a2_x) && (target_y == a2_y) &&
(g_mouse_a2_button == mouse_button)) { (g_mouse_a2_button == mouse_button)) {
g_mouse_fifo_pos--; g_mouse_fifo_pos--;
} }
} else {
if(g_mouse_fifo[pos].dxrd && g_mouse_fifo[pos].dyrd
&& (g_mouse_a2_button == mouse_button)) {
g_mouse_fifo_pos--;
}
}
} }
@ -1336,12 +1378,21 @@ int mouse_read_c024(double dcycs) {
g_slow_memory_ptr[0x10190], g_slow_memory_ptr[0x10192], g_slow_memory_ptr[0x10190], g_slow_memory_ptr[0x10192],
g_slow_memory_ptr[0x10191], g_slow_memory_ptr[0x10193]); g_slow_memory_ptr[0x10191], g_slow_memory_ptr[0x10193]);
if (g_grabmouse) {
if((g_mouse_fifo_pos == 0) && g_mouse_fifo[0].dxrd && g_mouse_fifo[0].dyrd
&& ((g_mouse_fifo[0].buttons & 1) == g_mouse_a2_button)) {
g_adb_mouse_valid_data = 0;
adb_clear_mouse_int();
}
} else {
if((g_mouse_fifo_pos == 0) && (g_mouse_fifo[0].x == a2_x) && if((g_mouse_fifo_pos == 0) && (g_mouse_fifo[0].x == a2_x) &&
(g_mouse_fifo[0].y == a2_y) && (g_mouse_fifo[0].y == a2_y) &&
((g_mouse_fifo[0].buttons & 1) == g_mouse_a2_button)) { ((g_mouse_fifo[0].buttons & 1) == g_mouse_a2_button)) {
g_adb_mouse_valid_data = 0; g_adb_mouse_valid_data = 0;
adb_clear_mouse_int(); adb_clear_mouse_int();
} }
}
g_adb_mouse_coord = !g_adb_mouse_coord; g_adb_mouse_coord = !g_adb_mouse_coord;
return ret; return ret;
@ -1656,7 +1707,12 @@ void adb_physical_key_update(int a2code, int is_up) {
break; break;
case 0x05: /* F5 - emulator clipboard paste */ case 0x05: /* F5 - emulator clipboard paste */
if (SHIFT_DOWN) { if (SHIFT_DOWN) {
// reserved g_grabmouse = !g_grabmouse;
#ifdef HAVE_SDL
extern void x_grabmouse();
glogf("g_grabmouse = %d", g_grabmouse);
x_grabmouse();
#endif
} else { } else {
clipboard_paste(); clipboard_paste();
} }
@ -1707,7 +1763,6 @@ void adb_physical_key_update(int a2code, int is_up) {
x_full_screen(g_fullscreen); x_full_screen(g_fullscreen);
break; break;
} }
return; return;
} }
/* Handle Keypad Joystick here partly...if keypad key pressed */ /* Handle Keypad Joystick here partly...if keypad key pressed */

View File

@ -501,7 +501,7 @@ Cfg_listhdr g_cfg_partitionlist = { 0 };
int g_cfg_file_pathfield = 0; int g_cfg_file_pathfield = 0;
const char *g_gsplus_rom_names[] = { "ROM", "ROM", "ROM01", "ROM03", "ROM.01", "ROM.03", 0 }; const char *g_gsplus_rom_names[] = { "ROM", "ROM", "ROM1", "ROM3", "ROM01", "ROM03", "ROM.01", "ROM.03", 0 };
/* First entry is special--it will be overwritten by g_cfg_rom_path */ /* First entry is special--it will be overwritten by g_cfg_rom_path */
const char *g_gsplus_c1rom_names[] = { "parallel.rom", 0 }; const char *g_gsplus_c1rom_names[] = { "parallel.rom", 0 };

View File

@ -217,7 +217,7 @@ int parse_cli_options(int argc, char **argv) {
} else if(!strcmp("-noshm", argv[i])) { } else if(!strcmp("-noshm", argv[i])) {
glogf("%s Not using X shared memory", parse_log_prefix); glogf("%s Not using X shared memory", parse_log_prefix);
g_use_shmem = 0; g_use_shmem = 0;
} else if(!strcmp("-joystick", argv[i])) { } else if(!strcmp("-joy", argv[i])) {
if((i+1) >= argc) { if((i+1) >= argc) {
glogf("%s Error, option '-joy' missing argument", parse_log_prefix); glogf("%s Error, option '-joy' missing argument", parse_log_prefix);
exit(1); exit(1);
@ -411,7 +411,7 @@ void help_exit() {
printf(" -noignbadacc Dont ignore bad memory accesses\n"); printf(" -noignbadacc Dont ignore bad memory accesses\n");
printf(" -noignhalt Dont ignore code red halts\n"); printf(" -noignhalt Dont ignore code red halts\n");
printf(" -test Allow testing\n"); printf(" -test Allow testing\n");
printf(" -joystick Ignore joystick option\n"); printf(" -joy Set joystick number\n");
printf(" -bw Force B/W modes\n"); printf(" -bw Force B/W modes\n");
printf(" -dhr140 Use simple double-hires color map\n"); printf(" -dhr140 Use simple double-hires color map\n");
printf(" -fullscreen Attempt to start emulator in fullscreen\n"); printf(" -fullscreen Attempt to start emulator in fullscreen\n");
@ -433,7 +433,6 @@ void help_exit() {
printf(" -sh value Scale window to sh pixels high\n"); printf(" -sh value Scale window to sh pixels high\n");
printf(" -novsync Don't force emulator to sync each frame\n"); printf(" -novsync Don't force emulator to sync each frame\n");
printf(" -fulldesk Use desktop 'fake' fullscreen mode\n"); printf(" -fulldesk Use desktop 'fake' fullscreen mode\n");
//printf(" -v value Set verbose flags to value\n\n"); //printf(" -v value Set verbose flags to value\n\n");
printf(" Note: The final argument, if not a flag, will be tried as a mountable device.\n\n"); printf(" Note: The final argument, if not a flag, will be tried as a mountable device.\n\n");
exit(1); exit(1);

View File

@ -106,6 +106,7 @@ int read_adb_ram(word32 addr);
void write_adb_ram(word32 addr, int val); void write_adb_ram(word32 addr, int val);
int adb_get_keypad_xy(int get_y); int adb_get_keypad_xy(int get_y);
int update_mouse(int x, int y, int button_states, int buttons_valid); int update_mouse(int x, int y, int button_states, int buttons_valid);
int update_mouse_w_delta(int x, int y, int button_states, int buttons_valid, int delta_x, int delta_y);
int mouse_read_c024(double dcycs); int mouse_read_c024(double dcycs);
void mouse_compress_fifo(double dcycs); void mouse_compress_fifo(double dcycs);
void adb_key_event(int a2code, int is_up); void adb_key_event(int a2code, int is_up);

View File

@ -42,6 +42,7 @@ int kb_shift_control_state = 0;
void debuginfo_renderer(SDL_Renderer *r); void debuginfo_renderer(SDL_Renderer *r);
void x_take_screenshot(); // screenshot stuff void x_take_screenshot(); // screenshot stuff
void x_grabmouse();
int g_screenshot_requested = 0; // DB to know if we want to save a screenshot int g_screenshot_requested = 0; // DB to know if we want to save a screenshot
extern char g_config_gsplus_name[]; extern char g_config_gsplus_name[];
extern char g_config_gsplus_screenshot_dir[]; extern char g_config_gsplus_screenshot_dir[];
@ -49,6 +50,7 @@ int screenshot_index = 0; // allows us to save time by not scanning from 0 each
char screenshot_filename[256]; char screenshot_filename[256];
extern int g_fullscreen; // only checked at start if set via CLI, otherwise it's set via function call x_full_screen() extern int g_fullscreen; // only checked at start if set via CLI, otherwise it's set via function call x_full_screen()
extern int g_grabmouse;
extern int g_highdpi; extern int g_highdpi;
extern int g_borderless; extern int g_borderless;
extern int g_resizeable; extern int g_resizeable;
@ -399,8 +401,6 @@ void dev_video_init_sdl() {
// Turn off host mouse cursor // Turn off host mouse cursor
SDL_ShowCursor(SDL_DISABLE); SDL_ShowCursor(SDL_DISABLE);
//SDL_SetRelativeMouseMode(true);
} }
@ -600,6 +600,8 @@ void handle_sdl_key_event(SDL_Event event) {
if (!IsFullScreen(window)) { if (!IsFullScreen(window)) {
glog("Enable fullscreen"); glog("Enable fullscreen");
SDL_SetWindowGrab(window, true); SDL_SetWindowGrab(window, true);
SDL_SetRelativeMouseMode(true);
Uint32 fullmode = g_fullscreen_desktop ? SDL_WINDOW_FULLSCREEN_DESKTOP : SDL_WINDOW_FULLSCREEN; Uint32 fullmode = g_fullscreen_desktop ? SDL_WINDOW_FULLSCREEN_DESKTOP : SDL_WINDOW_FULLSCREEN;
SDL_SetWindowFullscreen(window, fullmode); SDL_SetWindowFullscreen(window, fullmode);
} else { } else {
@ -607,6 +609,8 @@ void handle_sdl_key_event(SDL_Event event) {
SDL_SetWindowFullscreen(window, 0); SDL_SetWindowFullscreen(window, 0);
SDL_SetWindowGrab(window, false); SDL_SetWindowGrab(window, false);
SDL_SetWindowSize(window, g_startw, g_starth); SDL_SetWindowSize(window, g_startw, g_starth);
SDL_SetRelativeMouseMode(false);
} }
} }
} }
@ -624,17 +628,24 @@ void handle_sdl_key_event(SDL_Event event) {
void handle_sdl_mouse_event(SDL_Event event) { void handle_sdl_mouse_event(SDL_Event event) {
int x, y; int x, y;
int scaledmotion = 0;
if (scaledmotion) {
x = event.motion.x * A2_WINDOW_WIDTH / g_startw; x = event.motion.x * A2_WINDOW_WIDTH / g_startw;
y = event.motion.y * A2_WINDOW_HEIGHT / g_starth; y = event.motion.y * A2_WINDOW_HEIGHT / g_starth;
} else {
x = event.motion.x - BASE_MARGIN_LEFT;
y = event.motion.y - BASE_MARGIN_TOP;
}
switch (event.type) { switch (event.type) {
case SDL_MOUSEMOTION: case SDL_MOUSEMOTION:
update_mouse(x, y, 0, 0); update_mouse_w_delta(x, y, 0, 0, event.motion.xrel, event.motion.yrel);
break; break;
case SDL_MOUSEBUTTONUP: case SDL_MOUSEBUTTONUP:
update_mouse(x, y, 0, event.motion.state &7 ); update_mouse_w_delta(x, y, 0, event.motion.state &7, 0, 0);
break; break;
case SDL_MOUSEBUTTONDOWN: case SDL_MOUSEBUTTONDOWN:
update_mouse(x, y, event.motion.state &7, event.motion.state &7 ); update_mouse_w_delta(x, y, event.motion.state &7, event.motion.state &7 , 0, 0);
break; break;
} }
} }
@ -838,6 +849,10 @@ void sdl_present_buffer() {
} }
} }
void x_grabmouse() {
SDL_SetWindowGrab(window, g_grabmouse);
SDL_SetRelativeMouseMode(g_grabmouse);
}
// BELOW ARE FUNCTIONS THAT ARE EITHER UNIMPLEMENTED, OR AR NOT RELEVANT TO // BELOW ARE FUNCTIONS THAT ARE EITHER UNIMPLEMENTED, OR AR NOT RELEVANT TO
// THIS DRIVER. // THIS DRIVER.

View File

@ -168,7 +168,7 @@ int g_imagewriter_paper = 0;
int g_imagewriter_banner = 0; int g_imagewriter_banner = 0;
int g_config_iwm_vbl_count = 0; int g_config_iwm_vbl_count = 0;
const char g_gsplus_version_str[] = "0.14rc"; const char g_gsplus_version_str[] = "0.14";
int g_pause=0; // OG Added pause int g_pause=0; // OG Added pause
#define START_DCYCS (0.0) #define START_DCYCS (0.0)