diff --git a/src/config.c b/src/config.c index 68f7b16c7..5ed03b546 100644 --- a/src/config.c +++ b/src/config.c @@ -505,7 +505,7 @@ load_general(void) video_fullscreen_scale = config_get_int(cat, "video_fullscreen_scale", 0); - video_fullscreen_first = config_get_int(cat, "video_fullscreen_first", 0); + video_fullscreen_first = config_get_int(cat, "video_fullscreen_first", 1); video_filter_method = config_get_int(cat, "video_filter_method", 1); @@ -2024,6 +2024,7 @@ config_load(void) gfxcard = video_get_video_from_internal_name("cga"); vid_api = plat_vidapi("default"); vid_resize = 0; + video_fullscreen_first = 1; time_sync = TIME_SYNC_ENABLED; hdc_current = hdc_get_from_internal_name("none"); serial_enabled[0] = 1; diff --git a/src/sound/snd_audiopci.c b/src/sound/snd_audiopci.c index a24978750..f9ecb7d1f 100644 --- a/src/sound/snd_audiopci.c +++ b/src/sound/snd_audiopci.c @@ -802,7 +802,6 @@ es1371_outb(uint16_t port, uint8_t val, void *p) Addressable as byte, word, longword */ case 0x18: dev->legacy_ctrl |= LEGACY_INT; - // nmi = 0; break; case 0x1a: old_legacy_ctrl = dev->legacy_ctrl; @@ -879,7 +878,6 @@ es1371_outw(uint16_t port, uint16_t val, void *p) Addressable as byte, word, longword */ case 0x18: dev->legacy_ctrl |= LEGACY_INT; - // nmi = 0; break; case 0x1a: old_legacy_ctrl = dev->legacy_ctrl; @@ -1032,7 +1030,6 @@ es1371_outl(uint16_t port, uint32_t val, void *p) old_legacy_ctrl = dev->legacy_ctrl; dev->legacy_ctrl = (dev->legacy_ctrl & 0x0000ffff) | (val & 0xffff0000); dev->legacy_ctrl |= LEGACY_INT; - // nmi = 0; es1371_update_irqs(dev); update_legacy(dev, old_legacy_ctrl); break; @@ -1239,17 +1236,17 @@ update_legacy(es1371_t *dev, uint32_t old_legacy_ctrl) if (old_legacy_ctrl & LEGACY_CAPTURE_CODEC) { switch ((old_legacy_ctrl >> LEGACY_CODEC_ADDR_SHIFT) & 3) { case 0: - io_removehandler(0x5300, 0x0080, + io_removehandler(0x0530, 0x0008, capture_read_codec, NULL, NULL, capture_write_codec, NULL, NULL, dev); break; case 2: - io_removehandler(0xe800, 0x0080, + io_removehandler(0x0e80, 0x0008, capture_read_codec, NULL, NULL, capture_write_codec,NULL,NULL, dev); break; case 3: - io_removehandler(0xf400, 0x0080, + io_removehandler(0x0f40, 0x0008, capture_read_codec, NULL, NULL, capture_write_codec, NULL, NULL, dev); break; @@ -1326,17 +1323,17 @@ update_legacy(es1371_t *dev, uint32_t old_legacy_ctrl) if (dev->legacy_ctrl & LEGACY_CAPTURE_CODEC) { switch ((dev->legacy_ctrl >> LEGACY_CODEC_ADDR_SHIFT) & 3) { case 0: - io_sethandler(0x5300, 0x0080, + io_sethandler(0x0530, 0x0008, capture_read_codec, NULL, NULL, capture_write_codec, NULL, NULL, dev); break; case 2: - io_sethandler(0xe800, 0x0080, + io_sethandler(0x0e80, 0x0008, capture_read_codec, NULL, NULL, capture_write_codec, NULL, NULL, dev); break; case 3: - io_sethandler(0xf400, 0x0080, + io_sethandler(0x0f40, 0x0008, capture_read_codec, NULL, NULL, capture_write_codec, NULL, NULL, dev); break; diff --git a/src/thread.c b/src/thread.c index d95c337d1..3dd41ed08 100644 --- a/src/thread.c +++ b/src/thread.c @@ -1,52 +1,191 @@ -#include +#include #include +#include #include -#include -#include +#ifdef __APPLE__ +#include +#endif #include <86box/86box.h> #include <86box/plat.h> +#if (defined WIN32) || (defined _WIN32) || (defined _WIN32) +#include +#include + +typedef struct { + HANDLE handle; +} win_event_t; + + +thread_t * +thread_create(void (*func)(void *param), void *param) +{ + uintptr_t bt = _beginthread(func, 0, param); + return((thread_t *)bt); +} + + +int +thread_wait(thread_t *arg, int timeout) +{ + if (arg == NULL) return(0); + + if (timeout == -1) + timeout = INFINITE; + + if (WaitForSingleObject(arg, timeout)) return(1); + + return(0); +} + + +event_t * +thread_create_event(void) +{ + win_event_t *ev = malloc(sizeof(win_event_t)); + + ev->handle = CreateEvent(NULL, FALSE, FALSE, NULL); + + return((event_t *)ev); +} + + +void +thread_set_event(event_t *arg) +{ + win_event_t *ev = (win_event_t *)arg; + + if (arg == NULL) return; + + SetEvent(ev->handle); +} + + +void +thread_reset_event(event_t *arg) +{ + win_event_t *ev = (win_event_t *)arg; + + if (arg == NULL) return; + + ResetEvent(ev->handle); +} + + +int +thread_wait_event(event_t *arg, int timeout) +{ + win_event_t *ev = (win_event_t *)arg; + + if (arg == NULL) return(0); + + if (ev->handle == NULL) return(0); + + if (timeout == -1) + timeout = INFINITE; + + if (WaitForSingleObject(ev->handle, timeout)) return(1); + + return(0); +} + + +void +thread_destroy_event(event_t *arg) +{ + win_event_t *ev = (win_event_t *)arg; + + if (arg == NULL) return; + + CloseHandle(ev->handle); + + free(ev); +} + + +mutex_t * +thread_create_mutex(void) +{ + mutex_t *mutex = malloc(sizeof(CRITICAL_SECTION)); + + InitializeCriticalSection(mutex); + + return mutex; +} + + +mutex_t * +thread_create_mutex_with_spin_count(unsigned int spin_count) +{ + mutex_t *mutex = malloc(sizeof(CRITICAL_SECTION)); + + InitializeCriticalSectionAndSpinCount(mutex, spin_count); + + return mutex; +} + + +int +thread_wait_mutex(mutex_t *mutex) +{ + if (mutex == NULL) return(0); + + LPCRITICAL_SECTION critsec = (LPCRITICAL_SECTION)mutex; + + EnterCriticalSection(critsec); + + return 1; +} + + +int +thread_release_mutex(mutex_t *mutex) +{ + if (mutex == NULL) return(0); + + LPCRITICAL_SECTION critsec = (LPCRITICAL_SECTION)mutex; + + LeaveCriticalSection(critsec); + + return 1; +} + + +void +thread_close_mutex(mutex_t *mutex) +{ + if (mutex == NULL) return; + + LPCRITICAL_SECTION critsec = (LPCRITICAL_SECTION)mutex; + + DeleteCriticalSection(critsec); + + free(critsec); +} +#else +#include +#include typedef struct event_pthread_t { pthread_cond_t cond; pthread_mutex_t mutex; - int state; + int state; } event_pthread_t; -typedef struct thread_param -{ - void (*thread_rout)(void*); - void * param; -} thread_param; - - typedef struct pt_mutex_t { pthread_mutex_t mutex; } pt_mutex_t; -void * -thread_run_wrapper(thread_param* arg) -{ - thread_param localparam = *arg; - free(arg); - localparam.thread_rout(localparam.param); - return NULL; -} - - thread_t * thread_create(void (*thread_rout)(void *param), void *param) { pthread_t *thread = malloc(sizeof(pthread_t)); - thread_param *thrparam = malloc(sizeof(thread_param)); - thrparam->thread_rout = thread_rout; - thrparam->param = param; - pthread_create(thread, NULL, (void* (*)(void*))thread_run_wrapper, thrparam); + pthread_create(thread, NULL, (void*)thread_rout, param); return thread; } @@ -101,10 +240,13 @@ thread_wait_event(event_t *handle, int timeout) event_pthread_t *event = (event_pthread_t *)handle; struct timespec abstime; -#ifdef HAS_TIMESPEC_GET - timespec_get(&abstime, TIME_UTC); -#else +#ifdef __linux__ clock_gettime(CLOCK_REALTIME, &abstime); +#else + struct timeval now; + gettimeofday(&now, 0); + abstime.tv_sec = now.tv_sec; + abstime.tv_nsec = now.tv_usec*1000UL; #endif abstime.tv_nsec += (timeout % 1000) * 1000000; abstime.tv_sec += (timeout / 1000); @@ -156,26 +298,21 @@ thread_create_mutex_with_spin_count(unsigned int spin_count) } -int +void thread_wait_mutex(mutex_t *_mutex) { - if (_mutex == NULL) - return(0); pt_mutex_t *mutex = (pt_mutex_t *)_mutex; - return - pthread_mutex_lock(&mutex->mutex) != 0; + pthread_mutex_lock(&mutex->mutex); } -int -thread_release_mutex(mutex_t *_mutex) +void +thread_unlock_mutex(mutex_t *_mutex) { - if (_mutex == NULL) - return(0); pt_mutex_t *mutex = (pt_mutex_t *)_mutex; - return pthread_mutex_unlock(&mutex->mutex) != 0; + pthread_mutex_unlock(&mutex->mutex); } @@ -188,3 +325,4 @@ thread_close_mutex(mutex_t *_mutex) free(mutex); } +#endif diff --git a/src/win/win.c b/src/win/win.c index 6f0a43ca3..b6690bece 100644 --- a/src/win/win.c +++ b/src/win/win.c @@ -1051,7 +1051,7 @@ plat_setfullscreen(int on) if ((!!(on & 1)) == (!!video_fullscreen)) return; - if (on && (start_in_fullscreen || video_fullscreen_first)) { + if (on && video_fullscreen_first) { video_fullscreen |= 2; if (ui_msgbox_header(MBX_INFO | MBX_DONTASK, (wchar_t *) IDS_2134, (wchar_t *) IDS_2052) == 10) { video_fullscreen_first = 0; diff --git a/src/win/win_ui.c b/src/win/win_ui.c index a778d60e7..6a38045c9 100644 --- a/src/win/win_ui.c +++ b/src/win/win_ui.c @@ -1427,7 +1427,7 @@ ui_init(int nCmdShow) } /* Initialize the mouse module. */ - if (!start_in_fullscreen && !video_fullscreen_first) + if (!start_in_fullscreen) win_mouse_init(); /* @@ -1459,7 +1459,7 @@ ui_init(int nCmdShow) plat_resize(scrnsz_x, scrnsz_y); /* Initialize the rendering window, or fullscreen. */ - if (start_in_fullscreen || video_fullscreen_first) + if (start_in_fullscreen) plat_setfullscreen(3); /* Fire up the machine. */