Added the IBM 5161 ISA expansion for PC and XT;
Cleaned up the parallel port emulation, added IRQ support, and made enabling/disabling per port; Added the Award 430NX and the Intel Classic/PCI (Alfredo, 420TX); Finished the 586MC1; Added 8087 emulation; Moved Cyrix 6x86'es to the Dev branch; Sanitized/cleaned up memregs.c/h and intel.c/h; Split the chipsets from machines and sanitized Port 92 emulation; Added support for the 15bpp mode to the Compaq ATI 28800; Moved the MR 386DX and 486 machines to the Dev branch; Ported the new dynamic recompiler from PCem, but it remains in Dev branch until after v2.00; Ported the new timer code from PCem; Cleaned up the CPU table of unused stuff and better optimized its structure; Ported the Open-XT and Open-AT from VARCem, the Open-AT is in the Dev branch; Ported the XT MFM controller rewrite and adding of more controllers (incl. two RLL ones), from VARCem; Added the AHA-1540A and the BusTek BT-542B; Moved the Sumo SCSI-AT to the Dev branch; Minor IDE, FDC, and floppy drive code clean-ups; Made NCR 5380/53C400-based cards' BIOS address configurable; Got rid of the legacy romset variable; Unified (video) buffer and buffer32 into one and make the unified buffer 32-bit; Added the Amstead PPC512 per PCem patch by John Elliott; Switched memory mapping granularity from 16k to 4k (less than 1k not possible due to internal pages); Rewrote the CL-GD 54xx blitter, fixes Win-OS/2 on the 54x6 among other thing; Added the Image Manager 1024 and Professional Graphics Controller per PCem patch by John Elliott and work done on VARCem; Added Headland HT-216, GC-205 and Video 7 VGA 1024i emulation based on PCem commit; Implemented the fuction keys for the Toshiba T1000/T1200/T3100 enhancement; Amstrad MegaPC does now works correctly with non-internal graphics card; The SLiRP code no longer casts a packed struct type to a non-packed struct type; The Xi8088 and PB410a no longer hang on 86Box when PS/2 mouse is not present; The S3 Virge on BeOS is no longer broken (was broken by build #1591); OS/2 2.0 build 6.167 now sees key presses again; Xi8088 now work on CGA again; 86F images converted from either the old or new variants of the HxC MFM format now work correctly; Hardware interrupts with a vector of 0xFF are now handled correctly; OPTi 495SX boards no longer incorrectly have 64 MB maximum RAM when 32 MB is correct; Fixed VNC keyboard input bugs; Fixed AT RTC periodic interrupt - Chicago 58s / 73f / 73g / 81 MIDI play no longer hangs with the build's own VTD driver; Fixed mouse polling with internal mice - Amstrad and Olivetti mice now work correctly; Triones ATAPI DMA driver now correctly reads a file at the end of a CD image with a sectors number not divisible by 4; Compaq Portable now works with all graphics cards; Fixed various MDSI Genius bugs; Added segment limit checks and improved page fault checks for several CPU instructions - Memphis 15xx WINSETUP and Chicago 58s WINDISK.CPL no longer issue a GPF, and some S3 drivers that used to have glitches, now work correctly; Further improved the 808x emulation, also fixes the noticably choppy sound when using 808x CPU's, also fixes #355; OS/2 installer no logner locks up on splash screen on PS/2 Model 70 and 80, fixes #400. Fixed several Amstead bugs, GEM no longer crashes on the Amstrad 1640, fixes #391. Ported John Elliott's Amstrad fixes and improvement from PCem, and fixed the default language so it's correctly Engliish, fixes #278, fixes #389. Fixed a minor IDE timing bug, fixes #388. Fixed Toshiba T1000 RAM issues, fixes #379. Fixed EGA/(S)VGA overscan border handling, fixes #378; Got rid of the now long useless IDE channel 2 auto-removal, fixes #370; Fixed the BIOS files used by the AMSTRAD PC1512, fixes #366; Ported the Unicode CD image file name fix from VARCem, fixes #365; Fixed high density floppy disks on the Xi8088, fixes #359; Fixed some bugs in the Hercules emulation, fixes #346, fixes #358; Fixed the SCSI hard disk mode sense pages, fixes #356; Removed the AMI Unknown 386SX because of impossibility to identify the chipset, closes #349; Fixed bugs in the serial mouse emulation, fixes #344; Compiled 86Box binaries now include all the required .DLL's, fixes #341; Made some combo boxes in the Settings dialog slightly wider, fixes #276.
This commit is contained in:
154
src/win/win.c
154
src/win/win.c
@@ -8,15 +8,15 @@
|
||||
*
|
||||
* Platform main support module for Windows.
|
||||
*
|
||||
* Version: @(#)win.c 1.0.55 2018/11/19
|
||||
* Version: @(#)win.c 1.0.57 2019/03/06
|
||||
*
|
||||
* Authors: Sarah Walker, <http://pcem-emulator.co.uk/>
|
||||
* Miran Grca, <mgrca8@gmail.com>
|
||||
* Fred N. van Kempen, <decwiz@yahoo.com>
|
||||
*
|
||||
* Copyright 2008-2018 Sarah Walker.
|
||||
* Copyright 2016-2018 Miran Grca.
|
||||
* Copyright 2017,2018 Fred N. van Kempen.
|
||||
* Copyright 2008-2019 Sarah Walker.
|
||||
* Copyright 2016-2019 Miran Grca.
|
||||
* Copyright 2017-2019 Fred N. van Kempen.
|
||||
*/
|
||||
#define UNICODE
|
||||
#include <windows.h>
|
||||
@@ -76,34 +76,36 @@ static rc_str_t *lpRCstr2048,
|
||||
static int vid_api_inited = 0;
|
||||
|
||||
|
||||
static struct {
|
||||
char *name;
|
||||
static const struct {
|
||||
const char *name;
|
||||
int local;
|
||||
int (*init)(void *);
|
||||
void (*close)(void);
|
||||
void (*resize)(int x, int y);
|
||||
int (*pause)(void);
|
||||
void (*enable)(int enable);
|
||||
void (*screenshot)(const wchar_t *fn);
|
||||
} vid_apis[2][RENDERERS_NUM] = {
|
||||
{
|
||||
{ "DDraw", 1, (int(*)(void*))ddraw_init, ddraw_close, NULL, ddraw_pause },
|
||||
{ "DDraw", 1, (int(*)(void*))ddraw_init, ddraw_close, NULL, ddraw_pause, ddraw_enable, ddraw_take_screenshot },
|
||||
#ifdef USE_D2D
|
||||
{ "D2D", 1, (int(*)(void*))d2d_init, d2d_close, NULL, d2d_pause },
|
||||
{ "D2D", 1, (int(*)(void*))d2d_init, d2d_close, NULL, d2d_pause, d2d_enable, d2d_take_screenshot },
|
||||
#endif
|
||||
{ "D3D", 1, (int(*)(void*))d3d_init, d3d_close, d3d_resize, d3d_pause },
|
||||
{ "SDL", 1, (int(*)(void*))sdl_init, sdl_close, NULL, sdl_pause }
|
||||
{ "D3D", 1, (int(*)(void*))d3d_init, d3d_close, d3d_resize, d3d_pause, d3d_enable, d3d_take_screenshot },
|
||||
{ "SDL", 1, (int(*)(void*))sdl_init, sdl_close, NULL, sdl_pause, sdl_enable, sdl_take_screenshot }
|
||||
#ifdef USE_VNC
|
||||
,{ "VNC", 0, vnc_init, vnc_close, vnc_resize, vnc_pause }
|
||||
,{ "VNC", 0, vnc_init, vnc_close, vnc_resize, vnc_pause, NULL, vnc_take_screenshot }
|
||||
#endif
|
||||
},
|
||||
{
|
||||
{ "DDraw", 1, (int(*)(void*))ddraw_init_fs, ddraw_close, NULL, ddraw_pause },
|
||||
{ "DDraw", 1, (int(*)(void*))ddraw_init_fs, ddraw_close, NULL, ddraw_pause, ddraw_enable, ddraw_take_screenshot },
|
||||
#ifdef USE_D2D
|
||||
{ "D2D", 1, (int(*)(void*))d2d_init_fs, d2d_close, NULL, d2d_pause },
|
||||
{ "D2D", 1, (int(*)(void*))d2d_init_fs, d2d_close, NULL, d2d_pause, d2d_enable, d2d_take_screenshot },
|
||||
#endif
|
||||
{ "D3D", 1, (int(*)(void*))d3d_init_fs, d3d_close, NULL, d3d_pause },
|
||||
{ "SDL", 1, (int(*)(void*))sdl_init_fs, sdl_close, sdl_resize, sdl_pause }
|
||||
{ "D3D", 1, (int(*)(void*))d3d_init_fs, d3d_close, NULL, d3d_pause, d3d_enable, d3d_take_screenshot },
|
||||
{ "SDL", 1, (int(*)(void*))sdl_init_fs, sdl_close, sdl_resize, sdl_pause, sdl_enable, sdl_take_screenshot }
|
||||
#ifdef USE_VNC
|
||||
,{ "VNC", 0, vnc_init, vnc_close, vnc_resize, vnc_pause }
|
||||
,{ "VNC", 0, vnc_init, vnc_close, vnc_resize, vnc_pause, NULL, vnc_take_screenshot }
|
||||
#endif
|
||||
},
|
||||
};
|
||||
@@ -348,6 +350,9 @@ WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpszArg, int nCmdShow)
|
||||
{
|
||||
wchar_t **argw = NULL;
|
||||
int argc, i;
|
||||
wchar_t * AppID = L"86Box.86Box\0";
|
||||
|
||||
SetCurrentProcessExplicitAppUserModelID(AppID);
|
||||
|
||||
/* Set this to the default value (windowed mode). */
|
||||
video_fullscreen = 0;
|
||||
@@ -435,6 +440,7 @@ plat_get_exe_name(wchar_t *s, int size)
|
||||
GetModuleFileName(hinstance, s, size);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
plat_tempfile(wchar_t *bufp, wchar_t *prefix, wchar_t *suffix)
|
||||
{
|
||||
@@ -455,6 +461,7 @@ plat_tempfile(wchar_t *bufp, wchar_t *prefix, wchar_t *suffix)
|
||||
mbstowcs(bufp, temp, strlen(temp)+1);
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
plat_getcwd(wchar_t *bufp, int max)
|
||||
{
|
||||
@@ -478,6 +485,14 @@ plat_fopen(wchar_t *path, wchar_t *mode)
|
||||
}
|
||||
|
||||
|
||||
/* Open a file, using Unicode pathname, with 64bit pointers. */
|
||||
FILE *
|
||||
plat_fopen64(const wchar_t *path, const wchar_t *mode)
|
||||
{
|
||||
return(_wfopen(path, mode));
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
plat_remove(wchar_t *path)
|
||||
{
|
||||
@@ -507,6 +522,46 @@ plat_path_abs(wchar_t *path)
|
||||
}
|
||||
|
||||
|
||||
/* Return the last element of a pathname. */
|
||||
wchar_t *
|
||||
plat_get_basename(const wchar_t *path)
|
||||
{
|
||||
int c = (int)wcslen(path);
|
||||
|
||||
while (c > 0) {
|
||||
if (path[c] == L'/' || path[c] == L'\\')
|
||||
return((wchar_t *)&path[c]);
|
||||
c--;
|
||||
}
|
||||
|
||||
return((wchar_t *)path);
|
||||
}
|
||||
|
||||
|
||||
/* Return the 'directory' element of a pathname. */
|
||||
void
|
||||
plat_get_dirname(wchar_t *dest, const wchar_t *path)
|
||||
{
|
||||
int c = (int)wcslen(path);
|
||||
wchar_t *ptr;
|
||||
|
||||
ptr = (wchar_t *)path;
|
||||
|
||||
while (c > 0) {
|
||||
if (path[c] == L'/' || path[c] == L'\\') {
|
||||
ptr = (wchar_t *)&path[c];
|
||||
break;
|
||||
}
|
||||
c--;
|
||||
}
|
||||
|
||||
/* Copy to destination. */
|
||||
while (path < ptr)
|
||||
*dest++ = *path++;
|
||||
*dest = L'\0';
|
||||
}
|
||||
|
||||
|
||||
wchar_t *
|
||||
plat_get_filename(wchar_t *s)
|
||||
{
|
||||
@@ -544,6 +599,7 @@ void
|
||||
plat_append_filename(wchar_t *dest, wchar_t *s1, wchar_t *s2)
|
||||
{
|
||||
wcscat(dest, s1);
|
||||
plat_path_slash(dest);
|
||||
wcscat(dest, s2);
|
||||
}
|
||||
|
||||
@@ -607,7 +663,11 @@ plat_vidapi(char *name)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (!strcasecmp(name, "default") || !strcasecmp(name, "system")) return(0);
|
||||
#ifdef USE_D2D
|
||||
if (!strcasecmp(name, "default") || !strcasecmp(name, "system")) return(2);
|
||||
#else
|
||||
if (!strcasecmp(name, "default") || !strcasecmp(name, "system")) return(1);
|
||||
#endif
|
||||
|
||||
for (i = 0; i < RENDERERS_NUM; i++) {
|
||||
if (vid_apis[0][i].name &&
|
||||
@@ -627,10 +687,7 @@ plat_vidapi_name(int api)
|
||||
|
||||
switch(api) {
|
||||
case 0:
|
||||
#if 0
|
||||
/* DirectDraw is default. */
|
||||
name = "ddraw";
|
||||
#endif
|
||||
break;
|
||||
|
||||
#ifdef USE_D2D
|
||||
@@ -639,7 +696,10 @@ plat_vidapi_name(int api)
|
||||
break;
|
||||
|
||||
case 2:
|
||||
#if 0
|
||||
/* Direct3D is default. */
|
||||
name = "d3d";
|
||||
#endif
|
||||
break;
|
||||
|
||||
case 3:
|
||||
@@ -647,7 +707,10 @@ plat_vidapi_name(int api)
|
||||
break;
|
||||
#else
|
||||
case 1:
|
||||
#if 0
|
||||
/* Direct3D is default. */
|
||||
name = "d3d";
|
||||
#endif
|
||||
break;
|
||||
|
||||
case 2:
|
||||
@@ -714,6 +777,17 @@ plat_vidsize(int x, int y)
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
plat_vidapi_enable(int enable)
|
||||
{
|
||||
if (!vid_api_inited || !vid_apis[video_fullscreen][vid_api].enable) return;
|
||||
|
||||
startblit();
|
||||
video_wait_for_blit();
|
||||
vid_apis[video_fullscreen][vid_api].enable(enable);
|
||||
endblit();
|
||||
}
|
||||
|
||||
int
|
||||
get_vidpause(void)
|
||||
{
|
||||
@@ -768,6 +842,7 @@ take_screenshot(void)
|
||||
struct tm *info;
|
||||
time_t now;
|
||||
|
||||
if (!vid_api_inited || !vid_apis[video_fullscreen][vid_api].screenshot) return;
|
||||
win_log("Screenshot: video API is: %i\n", vid_api);
|
||||
if ((vid_api < 0) || (vid_api >= RENDERERS_NUM)) return;
|
||||
|
||||
@@ -786,44 +861,7 @@ take_screenshot(void)
|
||||
|
||||
wcsftime(fn, 128, L"%Y%m%d_%H%M%S.png", info);
|
||||
wcscat(path, fn);
|
||||
|
||||
switch(vid_api) {
|
||||
case 0: /* ddraw */
|
||||
ddraw_take_screenshot(path);
|
||||
break;
|
||||
|
||||
#ifdef USE_D2D
|
||||
case 1: /* d2d */
|
||||
d2d_take_screenshot(path);
|
||||
break;
|
||||
|
||||
case 2: /* d3d9 */
|
||||
d3d_take_screenshot(path);
|
||||
break;
|
||||
|
||||
case 3: /* sdl */
|
||||
sdl_take_screenshot(path);
|
||||
break;
|
||||
#else
|
||||
case 1: /* d3d9 */
|
||||
d3d_take_screenshot(path);
|
||||
break;
|
||||
|
||||
case 2: /* sdl */
|
||||
sdl_take_screenshot(path);
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef USE_VNC
|
||||
#ifdef USE_D2D
|
||||
case 4: /* vnc */
|
||||
#else
|
||||
case 3: /* vnc */
|
||||
#endif
|
||||
vnc_take_screenshot(path);
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
vid_apis[video_fullscreen][vid_api].screenshot((const wchar_t *) path);
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user