Merge remote-tracking branch 'origin/master' into feature/machine_and_kb

This commit is contained in:
OBattler
2021-09-18 15:25:37 +02:00
8 changed files with 150 additions and 70 deletions

View File

@@ -48,7 +48,11 @@ if(NOT WIN32 OR PTHREAD)
target_sources(86Box PRIVATE thread.c) target_sources(86Box PRIVATE thread.c)
if(WIN32 AND VCPKG_TOOLCHAIN) if(WIN32 AND VCPKG_TOOLCHAIN)
find_package(pthreads REQUIRED) find_package(pthreads REQUIRED)
target_link_libraries(86Box pthreads) if (PThreads4W_FOUND)
target_link_libraries(86Box PThreads4W::PThreads4W)
else()
target_link_libraries(86Box pthreads)
endif()
else() else()
set(THREADS_PREFER_PTHREAD_FLAG TRUE) set(THREADS_PREFER_PTHREAD_FLAG TRUE)
find_package(Threads REQUIRED) find_package(Threads REQUIRED)

View File

@@ -505,7 +505,7 @@ load_general(void)
video_fullscreen_scale = config_get_int(cat, "video_fullscreen_scale", 0); video_fullscreen_scale = config_get_int(cat, "video_fullscreen_scale", 0);
video_fullscreen_first = config_get_int(cat, "video_fullscreen_first", 1); video_fullscreen_first = config_get_int(cat, "video_fullscreen_first", 0);
video_filter_method = config_get_int(cat, "video_filter_method", 1); video_filter_method = config_get_int(cat, "video_filter_method", 1);
@@ -524,7 +524,10 @@ load_general(void)
update_icons = config_get_int(cat, "update_icons", 1); update_icons = config_get_int(cat, "update_icons", 1);
window_remember = config_get_int(cat, "window_remember", 0); window_remember = config_get_int(cat, "window_remember", 0);
if (window_remember) { if (window_remember || (vid_resize & 2)) {
if (!window_remember)
config_delete_var(cat, "window_remember");
p = config_get_string(cat, "window_coordinates", NULL); p = config_get_string(cat, "window_coordinates", NULL);
if (p == NULL) if (p == NULL)
p = "0, 0, 0, 0"; p = "0, 0, 0, 0";
@@ -2162,8 +2165,11 @@ save_general(void)
else else
config_set_int(cat, "update_icons", update_icons); config_set_int(cat, "update_icons", update_icons);
if (window_remember) { if (window_remember || (vid_resize & 2)) {
config_set_int(cat, "window_remember", window_remember); if (window_remember)
config_set_int(cat, "window_remember", window_remember);
else
config_delete_var(cat, "window_remember");
sprintf(temp, "%i, %i, %i, %i", window_w, window_h, window_x, window_y); sprintf(temp, "%i, %i, %i, %i", window_w, window_h, window_x, window_y);
config_set_string(cat, "window_coordinates", temp); config_set_string(cat, "window_coordinates", temp);

View File

@@ -1362,7 +1362,7 @@ t128_read(uint32_t addr, void *priv)
if (ncr_dev->t128.host_pos == MIN(512, dev->buffer_length)) { if (ncr_dev->t128.host_pos == MIN(512, dev->buffer_length)) {
ncr_dev->t128.status &= ~0x04; ncr_dev->t128.status &= ~0x04;
ncr_log("Transfer busy read, status = %02x, period = %lf\n", ncr_dev->t128.status, ncr_dev->period); ncr_log("Transfer busy read, status = %02x, period = %lf\n", ncr_dev->t128.status, ncr_dev->period);
if (ncr_dev->period == 0.2) if (ncr_dev->period == 0.2 || ncr_dev->period == 0.02)
timer_on_auto(&ncr_dev->timer, 40.2); timer_on_auto(&ncr_dev->timer, 40.2);
} }
} }

View File

@@ -2,8 +2,13 @@
#include <stdio.h> #include <stdio.h>
#include <time.h> #include <time.h>
#include <pthread.h> #include <pthread.h>
#ifndef _MSC_VER
#include <sys/param.h> #include <sys/param.h>
#include <unistd.h> #include <unistd.h>
#endif
#ifdef _WIN32
#include <windows.h>
#endif
#include <inttypes.h> #include <inttypes.h>
#include <86box/86box.h> #include <86box/86box.h>
#include <86box/plat.h> #include <86box/plat.h>
@@ -103,6 +108,17 @@ thread_wait_event(event_t *handle, int timeout)
event_pthread_t *event = (event_pthread_t *)handle; event_pthread_t *event = (event_pthread_t *)handle;
struct timespec abstime; struct timespec abstime;
#ifdef _MSC_VER
/* Taken from https://stackoverflow.com/a/31335254 with some modifications. */
FILETIME systime;
uint64_t systimeint = 0;
GetSystemTimeAsFileTime(&systime);
systimeint |= systime.dwLowDateTime;
systimeint |= (uint64_t)systime.dwHighDateTime << 32i64;
systimeint -= 116444736000000000i64;
abstime.tv_sec = systimeint / 10000000i64;
abstime.tv_nsec = systimeint % 10000000i64 * 100;
#else
clock_gettime(CLOCK_REALTIME, &abstime); clock_gettime(CLOCK_REALTIME, &abstime);
abstime.tv_nsec += (timeout % 1000) * 1000000; abstime.tv_nsec += (timeout % 1000) * 1000000;
abstime.tv_sec += (timeout / 1000); abstime.tv_sec += (timeout / 1000);
@@ -110,6 +126,7 @@ thread_wait_event(event_t *handle, int timeout)
abstime.tv_nsec -= 1000000000; abstime.tv_nsec -= 1000000000;
abstime.tv_sec++; abstime.tv_sec++;
} }
#endif
pthread_mutex_lock(&event->mutex); pthread_mutex_lock(&event->mutex);
if (timeout == -1) { if (timeout == -1) {
@@ -138,7 +155,11 @@ thread_destroy_event(event_t *handle)
void void
thread_sleep(int t) thread_sleep(int t)
{ {
#ifdef _WIN32
Sleep(t);
#else
usleep(t * 1000); usleep(t * 1000);
#endif
} }

View File

@@ -386,6 +386,38 @@ static uint32_t s3_accel_in_l(uint16_t port, void *p);
static uint8_t s3_pci_read(int func, int addr, void *p); static uint8_t s3_pci_read(int func, int addr, void *p);
static void s3_pci_write(int func, int addr, uint8_t val, void *p); static void s3_pci_write(int func, int addr, uint8_t val, void *p);
/*Remap address for chain-4/doubleword style layout*/
static __inline uint32_t
dword_remap(svga_t *svga, uint32_t in_addr)
{
if (svga->packed_chain4)
return in_addr;
return ((in_addr << 2) & 0x3fff0) |
((in_addr >> 14) & 0xc) |
(in_addr & ~0x3fffc);
}
static __inline uint32_t
dword_remap_w(svga_t *svga, uint32_t in_addr)
{
if (svga->packed_chain4)
return in_addr;
return ((in_addr << 2) & 0x1fff8) |
((in_addr >> 14) & 0x6) |
(in_addr & ~0x1fffe);
}
static __inline uint32_t
dword_remap_l(svga_t *svga, uint32_t in_addr)
{
if (svga->packed_chain4)
return in_addr;
return ((in_addr << 2) & 0xfffc) |
((in_addr >> 14) & 0x3) |
(in_addr & ~0xffff);
}
static void static void
s3_update_irqs(s3_t *s3) s3_update_irqs(s3_t *s3)
{ {
@@ -1742,6 +1774,7 @@ s3_hwcursor_draw(svga_t *svga, int displine)
int offset = svga->hwcursor_latch.x - svga->hwcursor_latch.xoff; int offset = svga->hwcursor_latch.x - svga->hwcursor_latch.xoff;
uint32_t fg, bg; uint32_t fg, bg;
uint32_t real_addr; uint32_t real_addr;
uint32_t remapped_addr;
switch (svga->bpp) switch (svga->bpp)
{ {
@@ -1806,8 +1839,10 @@ s3_hwcursor_draw(svga_t *svga, int displine)
for (x = 0; x < 64; x += 16) for (x = 0; x < 64; x += 16)
{ {
dat[0] = (svga->vram[real_addr & s3->vram_mask] << 8) | svga->vram[(real_addr + 1) & s3->vram_mask]; remapped_addr = dword_remap(svga, real_addr);
dat[1] = (svga->vram[(real_addr + 2) & s3->vram_mask] << 8) | svga->vram[(real_addr + 3) & s3->vram_mask];
dat[0] = (svga->vram[remapped_addr & s3->vram_mask] << 8) | svga->vram[(remapped_addr + 1) & s3->vram_mask];
dat[1] = (svga->vram[(remapped_addr + 2) & s3->vram_mask] << 8) | svga->vram[(remapped_addr + 3) & s3->vram_mask];
if (svga->crtc[0x55] & 0x10) { if (svga->crtc[0x55] & 0x10) {
/*X11*/ /*X11*/
@@ -2420,6 +2455,8 @@ s3_out(uint16_t addr, uint8_t val, void *p)
{ {
case 0x31: case 0x31:
s3->ma_ext = (s3->ma_ext & 0x1c) | ((val & 0x30) >> 4); s3->ma_ext = (s3->ma_ext & 0x1c) | ((val & 0x30) >> 4);
if (!svga->packed_chain4)
svga->force_dword_mode = val & 0x08;
break; break;
case 0x32: case 0x32:
if ((svga->crtc[0x31] & 0x30) && (svga->crtc[0x51] & 0x01) && (val & 0x40)) if ((svga->crtc[0x31] & 0x30) && (svga->crtc[0x51] & 0x01) && (val & 0x40))
@@ -2804,16 +2841,6 @@ static void s3_recalctimings(svga_t *svga)
s3->width = 1024; s3->width = 1024;
} }
} }
if (s3->chip != S3_TRIO64 && s3->chip != S3_TRIO32) {
if (svga->crtc[0x31] & 0x08) {/*This would typically force dword mode, but we are encountering accel bugs with it, so force byte mode instead*/
if (!(svga->gdcreg[6] & 1) && !(svga->attrregs[0x10] & 1))
svga->force_byte_mode = 0;
else
svga->force_byte_mode = 1;
} else
svga->force_byte_mode = 0;
}
if ((svga->gdcreg[5] & 0x40) && (svga->crtc[0x3a] & 0x10)) { if ((svga->gdcreg[5] & 0x40) && (svga->crtc[0x3a] & 0x10)) {
switch (svga->bpp) { switch (svga->bpp) {
@@ -3205,14 +3232,17 @@ s3_updatemapping(s3_t *s3)
svga->banked_mask = 0xffff; svga->banked_mask = 0xffff;
} }
} else { } else {
if (s3->chip >= S3_TRIO64V) if (s3->chip >= S3_TRIO64V) {
s3->linear_base &= 0xfc000000; s3->linear_base &= 0xfc000000;
else if (s3->chip == S3_VISION968 || s3->chip == S3_VISION868) svga->fb_only = 1;
} else if (s3->chip == S3_VISION968 || s3->chip == S3_VISION868)
s3->linear_base &= 0xfe000000; s3->linear_base &= 0xfe000000;
mem_mapping_set_addr(&s3->linear_mapping, s3->linear_base, s3->linear_size); mem_mapping_set_addr(&s3->linear_mapping, s3->linear_base, s3->linear_size);
} }
} else { } else {
mem_mapping_disable(&s3->linear_mapping); mem_mapping_disable(&s3->linear_mapping);
if (s3->chip >= S3_TRIO64V)
svga->fb_only = 0;
} }
/* Memory mapped I/O. */ /* Memory mapped I/O. */
@@ -4215,10 +4245,10 @@ polygon_setup(s3_t *s3)
} }
} }
#define READ(addr, dat) if (s3->bpp == 0) dat = svga->vram[(addr) & s3->vram_mask]; \ #define READ(addr, dat) if (s3->bpp == 0) dat = svga->vram[dword_remap(svga, addr) & s3->vram_mask]; \
else if (s3->bpp == 1) dat = vram_w[(addr) & (s3->vram_mask >> 1)]; \ else if (s3->bpp == 1) dat = vram_w[dword_remap_w(svga, addr) & (s3->vram_mask >> 1)]; \
else if (s3->bpp == 2) dat = svga->vram[(addr) & s3->vram_mask]; \ else if (s3->bpp == 2) dat = svga->vram[dword_remap(svga, addr) & s3->vram_mask]; \
else dat = vram_l[(addr) & (s3->vram_mask >> 2)]; else dat = vram_l[dword_remap_l(svga, addr) & (s3->vram_mask >> 2)];
#define MIX_READ { \ #define MIX_READ { \
switch ((mix_dat & mix_mask) ? (s3->accel.frgd_mix & 0xf) : (s3->accel.bkgd_mix & 0xf)) \ switch ((mix_dat & mix_mask) ? (s3->accel.frgd_mix & 0xf) : (s3->accel.bkgd_mix & 0xf)) \
@@ -4523,23 +4553,23 @@ polygon_setup(s3_t *s3)
#define WRITE(addr, dat) if (s3->bpp == 0) \ #define WRITE(addr, dat) if (s3->bpp == 0) \
{ \ { \
svga->vram[(addr) & s3->vram_mask] = dat; \ svga->vram[dword_remap(svga, addr) & s3->vram_mask] = dat; \
svga->changedvram[((addr) & s3->vram_mask) >> 12] = changeframecount; \ svga->changedvram[(dword_remap(svga, addr) & s3->vram_mask) >> 12] = changeframecount; \
} \ } \
else if (s3->bpp == 1) \ else if (s3->bpp == 1) \
{ \ { \
vram_w[(addr) & (s3->vram_mask >> 1)] = dat; \ vram_w[dword_remap_w(svga, addr) & (s3->vram_mask >> 1)] = dat; \
svga->changedvram[((addr) & (s3->vram_mask >> 1)) >> 11] = changeframecount; \ svga->changedvram[(dword_remap_w(svga, addr) & (s3->vram_mask >> 1)) >> 11] = changeframecount; \
} \ } \
else if (s3->bpp == 2) \ else if (s3->bpp == 2) \
{ \ { \
svga->vram[(addr) & s3->vram_mask] = dat; \ svga->vram[dword_remap(svga, addr) & s3->vram_mask] = dat; \
svga->changedvram[((addr) & s3->vram_mask) >> 12] = changeframecount; \ svga->changedvram[(dword_remap(svga, addr) & s3->vram_mask) >> 12] = changeframecount; \
} \ } \
else \ else \
{ \ { \
vram_l[(addr) & (s3->vram_mask >> 2)] = dat; \ vram_l[dword_remap_l(svga, addr) & (s3->vram_mask >> 2)] = dat; \
svga->changedvram[((addr) & (s3->vram_mask >> 2)) >> 10] = changeframecount; \ svga->changedvram[(dword_remap_l(svga, addr) & (s3->vram_mask >> 2)) >> 10] = changeframecount; \
} }
@@ -6983,13 +7013,14 @@ static void *s3_init(const device_t *info)
return NULL; return NULL;
} }
if (s3->chip >= S3_TRIO64V)
svga->packed_chain4 = 1;
if (s3->pci) if (s3->pci)
s3->card = pci_add_card(PCI_ADD_VIDEO, s3_pci_read, s3_pci_write, s3); s3->card = pci_add_card(PCI_ADD_VIDEO, s3_pci_read, s3_pci_write, s3);
s3->i2c = i2c_gpio_init("ddc_s3"); s3->i2c = i2c_gpio_init("ddc_s3");
s3->ddc = ddc_init(i2c_gpio_get_bus(s3->i2c)); s3->ddc = ddc_init(i2c_gpio_get_bus(s3->i2c));
svga->packed_chain4 = 1;
return s3; return s3;
} }

View File

@@ -1048,10 +1048,10 @@ plat_setfullscreen(int on)
int dpi = win_get_dpi(hwndMain); int dpi = win_get_dpi(hwndMain);
/* Are we changing from the same state to the same state? */ /* Are we changing from the same state to the same state? */
if ((!!on) == (!!video_fullscreen)) if ((!!(on & 1)) == (!!video_fullscreen))
return; return;
if (on && video_fullscreen_first) { if (on && (start_in_fullscreen || video_fullscreen_first)) {
video_fullscreen |= 2; video_fullscreen |= 2;
if (ui_msgbox_header(MBX_INFO | MBX_DONTASK, (wchar_t *) IDS_2134, (wchar_t *) IDS_2052) == 10) { if (ui_msgbox_header(MBX_INFO | MBX_DONTASK, (wchar_t *) IDS_2134, (wchar_t *) IDS_2052) == 10) {
video_fullscreen_first = 0; video_fullscreen_first = 0;
@@ -1061,13 +1061,14 @@ plat_setfullscreen(int on)
} }
/* OK, claim the video. */ /* OK, claim the video. */
win_mouse_close(); if (!(on & 2))
win_mouse_close();
/* Close the current mode, and open the new one. */ /* Close the current mode, and open the new one. */
video_fullscreen = on | 2; video_fullscreen = (on & 1) | 2;
if (vid_apis[vid_api].set_fs) if (vid_apis[vid_api].set_fs)
vid_apis[vid_api].set_fs(on); vid_apis[vid_api].set_fs(on & 1);
if (!on) { if (!(on & 1)) {
plat_resize(scrnsz_x, scrnsz_y); plat_resize(scrnsz_x, scrnsz_y);
if (vid_resize) { if (vid_resize) {
/* scale the screen base on DPI */ /* scale the screen base on DPI */
@@ -1115,26 +1116,31 @@ plat_setfullscreen(int on)
} }
video_fullscreen &= 1; video_fullscreen &= 1;
video_force_resize_set(1); video_force_resize_set(1);
if (!on) if (!(on & 1))
doresize = 1; doresize = 1;
win_mouse_init(); win_mouse_init();
/* Release video and make it redraw the screen. */ if (!(on & 2)) {
device_force_redraw(); /* Release video and make it redraw the screen. */
device_force_redraw();
/* Send a CTRL break code so CTRL does not get stuck. */ /* Send a CTRL break code so CTRL does not get stuck. */
keyboard_input(0, 0x01D); keyboard_input(0, 0x01D);
}
/* Finally, handle the host's mouse cursor. */ /* Finally, handle the host's mouse cursor. */
/* win_log("%s full screen, %s cursor\n", on ? "enter" : "leave", on ? "hide" : "show"); */ /* win_log("%s full screen, %s cursor\n", on ? "enter" : "leave", on ? "hide" : "show"); */
show_cursor(video_fullscreen ? 0 : -1); show_cursor(video_fullscreen ? 0 : -1);
/* This is needed for OpenGL. */ if (!(on & 2)) {
plat_vidapi_enable(0); /* This is needed for OpenGL. */
plat_vidapi_enable(1); plat_vidapi_enable(0);
plat_vidapi_enable(1);
}
} }
void void
plat_vid_reload_options(void) plat_vid_reload_options(void)
{ {

View File

@@ -234,7 +234,7 @@ sdl_blit(int x, int y, int w, int h)
SDL_Rect r_src; SDL_Rect r_src;
int ret; int ret;
if (!sdl_enabled || (h <= 0) || (buffer32 == NULL) || (sdl_render == NULL) || (sdl_tex == NULL)) { if (!sdl_enabled || (w <= 0) || (h <= 0) || (w > 2048) || (h > 2048) || (buffer32 == NULL) || (sdl_render == NULL) || (sdl_tex == NULL)) {
video_blit_complete(); video_blit_complete();
return; return;
} }
@@ -277,6 +277,11 @@ sdl_destroy_window(void)
static void static void
sdl_destroy_texture(void) sdl_destroy_texture(void)
{ {
if (sdl_tex != NULL) {
SDL_DestroyTexture(sdl_tex);
sdl_tex = NULL;
}
/* SDL_DestroyRenderer also automatically destroys all associated textures. */ /* SDL_DestroyRenderer also automatically destroys all associated textures. */
if (sdl_render != NULL) { if (sdl_render != NULL) {
SDL_DestroyRenderer(sdl_render); SDL_DestroyRenderer(sdl_render);
@@ -339,13 +344,8 @@ sdl_select_best_hw_driver(void)
static void static void
sdl_reinit_texture(void) sdl_init_texture(void)
{ {
if (sdl_flags == -1)
return;
sdl_destroy_texture();
if (sdl_flags & RENDERER_HARDWARE) { if (sdl_flags & RENDERER_HARDWARE) {
sdl_render = SDL_CreateRenderer(sdl_win, -1, SDL_RENDERER_ACCELERATED); sdl_render = SDL_CreateRenderer(sdl_win, -1, SDL_RENDERER_ACCELERATED);
SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, video_filter_method ? "1" : "0"); SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, video_filter_method ? "1" : "0");
@@ -357,6 +357,17 @@ sdl_reinit_texture(void)
} }
static void
sdl_reinit_texture(void)
{
if (sdl_flags == -1)
return;
sdl_destroy_texture();
sdl_init_texture();
}
void void
sdl_set_fs(int fs) sdl_set_fs(int fs)
{ {
@@ -365,7 +376,6 @@ sdl_set_fs(int fs)
SDL_LockMutex(sdl_mutex); SDL_LockMutex(sdl_mutex);
sdl_enabled = 0; sdl_enabled = 0;
sdl_destroy_texture();
if (fs) { if (fs) {
ShowWindow(sdl_parent_hwnd, TRUE); ShowWindow(sdl_parent_hwnd, TRUE);
@@ -408,7 +418,7 @@ sdl_set_fs(int fs)
else else
sdl_flags &= ~RENDERER_FULL_SCREEN; sdl_flags &= ~RENDERER_FULL_SCREEN;
sdl_reinit_texture(); // sdl_reinit_texture();
sdl_enabled = 1; sdl_enabled = 1;
SDL_UnlockMutex(sdl_mutex); SDL_UnlockMutex(sdl_mutex);
} }
@@ -456,6 +466,7 @@ sdl_init_common(int flags)
} }
sdl_win = SDL_CreateWindowFrom((void *)hwndRender); sdl_win = SDL_CreateWindowFrom((void *)hwndRender);
sdl_init_texture();
sdl_set_fs(video_fullscreen & 1); sdl_set_fs(video_fullscreen & 1);
/* Make sure we get a clean exit. */ /* Make sure we get a clean exit. */
@@ -554,16 +565,16 @@ sdl_enable(int enable)
SDL_UnlockMutex(sdl_mutex); SDL_UnlockMutex(sdl_mutex);
} }
void void
sdl_reload(void) sdl_reload(void)
{ {
if (sdl_flags & RENDERER_HARDWARE) if (sdl_flags & RENDERER_HARDWARE) {
{ SDL_LockMutex(sdl_mutex);
SDL_LockMutex(sdl_mutex);
SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, video_filter_method ? "1" : "0"); SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, video_filter_method ? "1" : "0");
sdl_reinit_texture(); sdl_reinit_texture();
SDL_UnlockMutex(sdl_mutex); SDL_UnlockMutex(sdl_mutex);
} }
} }

View File

@@ -1427,7 +1427,8 @@ ui_init(int nCmdShow)
} }
/* Initialize the mouse module. */ /* Initialize the mouse module. */
win_mouse_init(); if (!start_in_fullscreen && !video_fullscreen_first)
win_mouse_init();
/* /*
* Before we can create the Render window, we first have * Before we can create the Render window, we first have
@@ -1457,16 +1458,16 @@ ui_init(int nCmdShow)
else else
plat_resize(scrnsz_x, scrnsz_y); plat_resize(scrnsz_x, scrnsz_y);
/* Initialize the rendering window, or fullscreen. */
if (start_in_fullscreen || video_fullscreen_first)
plat_setfullscreen(3);
/* Fire up the machine. */ /* Fire up the machine. */
pc_reset_hard_init(); pc_reset_hard_init();
/* Set the PAUSE mode depending on the renderer. */ /* Set the PAUSE mode depending on the renderer. */
plat_pause(0); plat_pause(0);
/* Initialize the rendering window, or fullscreen. */
if (start_in_fullscreen)
plat_setfullscreen(1);
/* If so requested via the command line, inform the /* If so requested via the command line, inform the
* application that started us of our HWND, using the * application that started us of our HWND, using the
* the hWnd and unique ID the application has given * the hWnd and unique ID the application has given