Another cleanup. VNC now has fixed blitters, so 8bit cards (vga,mda,herc et al) work. More cleanups with the %ls stuff, cleanup of threads modules, and MOVED THE MAKEFILE to win/.
This commit is contained in:
@@ -10,7 +10,7 @@
|
||||
# settings, so we can avoid changing the main one for all of
|
||||
# our local setups.
|
||||
#
|
||||
# Version: @(#)Makefile.local 1.0.3 2017/09/25
|
||||
# Version: @(#)Makefile.local 1.0.4 2017/10/14
|
||||
#
|
||||
# Author: Fred N. van Kempen, <decwiz@yahoo.com>
|
||||
#
|
||||
@@ -36,7 +36,7 @@ EXTRAS := #-DYOURNAME
|
||||
#########################################################################
|
||||
# Include the master Makefile.MinGW for the rest. #
|
||||
#########################################################################
|
||||
include Makefile.mingw
|
||||
include win/Makefile.mingw
|
||||
|
||||
|
||||
# End of Makefile.local.
|
||||
|
@@ -12,7 +12,7 @@
|
||||
* based design. Most cards were WD1003-WA2 or -WAH, where the
|
||||
* -WA2 cards had a floppy controller as well (to save space.)
|
||||
*
|
||||
* Version: @(#)hdd_mfm_at.c 1.0.7 2017/10/11
|
||||
* Version: @(#)hdd_mfm_at.c 1.0.8 2017/10/14
|
||||
*
|
||||
* Authors: Sarah Walker, <http://pcem-emulator.co.uk/>
|
||||
* Fred N. van Kempen, <decwiz@yahoo.com>
|
||||
@@ -719,7 +719,7 @@ mfm_init(device_t *info)
|
||||
if ((hdd[d].bus == HDD_BUS_MFM) && (hdd[d].mfm_channel < MFM_NUM)) {
|
||||
loadhd(mfm, hdd[d].mfm_channel, d, hdd[d].fn);
|
||||
|
||||
pclog("WD1003(%d): (%S) geometry %d/%d/%d\n", c, hdd[d].fn,
|
||||
pclog("WD1003(%d): (%ls) geometry %d/%d/%d\n", c, hdd[d].fn,
|
||||
(int)hdd[d].tracks, (int)hdd[d].hpc, (int)hdd[d].spt);
|
||||
|
||||
if (++c >= MFM_NUM) break;
|
||||
|
@@ -8,7 +8,7 @@
|
||||
*
|
||||
* Implementation of the PCjs JSON floppy image format.
|
||||
*
|
||||
* Version: @(#)floppy_json.c 1.0.6 2017/10/12
|
||||
* Version: @(#)floppy_json.c 1.0.7 2017/10/14
|
||||
*
|
||||
* Author: Fred N. van Kempen, <decwiz@yahoo.com>
|
||||
*
|
||||
@@ -496,7 +496,7 @@ json_load(int drive, wchar_t *fn)
|
||||
return;
|
||||
}
|
||||
|
||||
pclog("JSON(%d): %S (%i tracks, %i sides, %i sectors)\n",
|
||||
pclog("JSON(%d): %ls (%i tracks, %i sides, %i sectors)\n",
|
||||
drive, fn, img->tracks, img->sides, img->spt[0][0]);
|
||||
|
||||
/*
|
||||
|
@@ -8,7 +8,7 @@
|
||||
*
|
||||
* Implementation of the Intel 2 Mbit 8-bit flash devices.
|
||||
*
|
||||
* Version: @(#)intel_flash.c 1.0.7 2017/10/12
|
||||
* Version: @(#)intel_flash.c 1.0.8 2017/10/14
|
||||
*
|
||||
* Authors: Sarah Walker, <http://pcem-emulator.co.uk/>
|
||||
* Miran Grca, <mgrca8@gmail.com>
|
||||
@@ -198,7 +198,7 @@ void *intel_flash_init(uint8_t type)
|
||||
|
||||
wcscpy(flash_path, flash_name);
|
||||
|
||||
pclog("Flash path: %S\n", flash_name);
|
||||
pclog("Flash path: %ls\n", flash_name);
|
||||
|
||||
flash->flash_id = (type & FLASH_IS_BXB) ? 0x95 : 0x94;
|
||||
flash->invert_high_pin = (type & FLASH_INVERT);
|
||||
|
@@ -8,7 +8,7 @@
|
||||
*
|
||||
* Handle SLiRP library processing.
|
||||
*
|
||||
* Version: @(#)net_slirp.c 1.0.8 2017/10/11
|
||||
* Version: @(#)net_slirp.c 1.0.9 2017/10/14
|
||||
*
|
||||
* Author: Fred N. van Kempen, <decwiz@yahoo.com>
|
||||
*
|
||||
@@ -32,7 +32,7 @@ static queueADT slirpq; /* SLiRP library handle */
|
||||
static thread_t *poll_tid;
|
||||
static NETRXCB poll_rx; /* network RX function to call */
|
||||
static void *poll_arg; /* network RX function arg */
|
||||
static void *slirpMutex;
|
||||
static mutex_t *slirpMutex;
|
||||
|
||||
|
||||
|
||||
|
@@ -186,7 +186,7 @@
|
||||
* (DS12887A) which implemented a "century" register to be
|
||||
* compatible with Y2K.
|
||||
*
|
||||
* Version: @(#)nvr.c 1.0.8 2017/10/12
|
||||
* Version: @(#)nvr.c 1.0.9 2017/10/14
|
||||
*
|
||||
* Authors: Sarah Walker, <http://pcem-emulator.co.uk/>
|
||||
* Miran Grca, <mgrca8@gmail.com>
|
||||
@@ -680,7 +680,7 @@ nvr_load(void)
|
||||
/* We are responsible for loading. */
|
||||
f = NULL;
|
||||
if (saved_nvr->mask != 0) {
|
||||
pclog("Opening NVR file: %S...\n", saved_nvr->fname);
|
||||
pclog("Opening NVR file: %ls...\n", saved_nvr->fname);
|
||||
f = plat_fopen(nvr_path(saved_nvr->fname), L"rb");
|
||||
}
|
||||
|
||||
@@ -723,7 +723,7 @@ nvr_save(void)
|
||||
/* We are responsible for saving. */
|
||||
f = NULL;
|
||||
if (saved_nvr->mask != 0) {
|
||||
pclog("Saving NVR file: %S...\n", saved_nvr->fname);
|
||||
pclog("Saving NVR file: %ls...\n", saved_nvr->fname);
|
||||
f = plat_fopen(nvr_path(saved_nvr->fname), L"wb");
|
||||
}
|
||||
|
||||
|
6
src/pc.c
6
src/pc.c
@@ -8,7 +8,7 @@
|
||||
*
|
||||
* Emulation core dispatcher.
|
||||
*
|
||||
* Version: @(#)pc.c 1.0.25 2017/10/14
|
||||
* Version: @(#)pc.c 1.0.26 2017/10/14
|
||||
*
|
||||
* Authors: Sarah Walker, <http://pcem-emulator.co.uk/>
|
||||
* Miran Grca, <mgrca8@gmail.com>
|
||||
@@ -250,7 +250,7 @@ usage:
|
||||
*/
|
||||
|
||||
/* Make sure cfg_path has a trailing backslash. */
|
||||
pclog("exe_path=%S\n", exe_path);
|
||||
pclog("exe_path=%ls\n", exe_path);
|
||||
if ((cfg_path[wcslen(cfg_path)-1] != L'\\') &&
|
||||
(cfg_path[wcslen(cfg_path)-1] != L'/')) {
|
||||
#ifdef WIN32
|
||||
@@ -259,7 +259,7 @@ usage:
|
||||
wcscat(cfg_path, L"/");
|
||||
#endif
|
||||
}
|
||||
pclog("cfg_path=%S\n", cfg_path);
|
||||
pclog("cfg_path=%ls\n", cfg_path);
|
||||
|
||||
if (cfg != NULL) {
|
||||
/*
|
||||
|
17
src/plat.h
17
src/plat.h
@@ -8,7 +8,7 @@
|
||||
*
|
||||
* Define the various platform support functions.
|
||||
*
|
||||
* Version: @(#)plat.h 1.0.6 2017/10/13
|
||||
* Version: @(#)plat.h 1.0.7 2017/10/14
|
||||
*
|
||||
* Authors: Miran Grca, <mgrca8@gmail.com>
|
||||
* Fred N. van Kempen, <decwiz@yahoo.com>
|
||||
@@ -33,7 +33,7 @@ extern void plat_remove(wchar_t *path);
|
||||
extern int plat_getcwd(wchar_t *bufp, int max);
|
||||
extern int plat_chdir(wchar_t *path);
|
||||
extern void get_executable_name(wchar_t *s, int size);
|
||||
extern void set_window_title(wchar_t *s);
|
||||
extern wchar_t *set_window_title(wchar_t *s);
|
||||
extern int dir_check_exist(wchar_t *path);
|
||||
extern int dir_create(wchar_t *path);
|
||||
|
||||
@@ -74,22 +74,23 @@ extern void ioctl_close(uint8_t id);
|
||||
/* Thread support. */
|
||||
typedef void thread_t;
|
||||
typedef void event_t;
|
||||
typedef void mutex_t;
|
||||
|
||||
extern thread_t *thread_create(void (*thread_rout)(void *param), void *param);
|
||||
extern void thread_kill(thread_t *handle);
|
||||
|
||||
extern void thread_sleep(int t);
|
||||
|
||||
extern event_t *thread_create_event(void);
|
||||
extern void thread_set_event(event_t *event);
|
||||
extern void thread_reset_event(event_t *_event);
|
||||
extern int thread_wait_event(event_t *event, int timeout);
|
||||
extern void thread_destroy_event(event_t *_event);
|
||||
|
||||
extern void thread_sleep(int t);
|
||||
|
||||
extern void *thread_create_mutex(wchar_t *name);
|
||||
extern void thread_close_mutex(void *mutex);
|
||||
extern uint8_t thread_wait_mutex(void *mutex);
|
||||
extern uint8_t thread_release_mutex(void *mutex);
|
||||
extern mutex_t *thread_create_mutex(wchar_t *name);
|
||||
extern void thread_close_mutex(mutex_t *mutex);
|
||||
extern int thread_wait_mutex(mutex_t *mutex);
|
||||
extern int thread_release_mutex(mutex_t *mutex);
|
||||
|
||||
|
||||
/* Other stuff. */
|
||||
|
@@ -13,7 +13,7 @@
|
||||
* - c386sx16 BIOS fails checksum
|
||||
* - the loadfont() calls should be done elsewhere
|
||||
*
|
||||
* Version: @(#)rom.c 1.0.10 2017/10/12
|
||||
* Version: @(#)rom.c 1.0.11 2017/10/14
|
||||
*
|
||||
* Authors: Sarah Walker, <http://pcem-emulator.co.uk/>
|
||||
* Miran Grca, <mgrca8@gmail.com>
|
||||
@@ -135,7 +135,7 @@ rom_load_linear(wchar_t *fn, uint32_t addr, int sz, int off, uint8_t *ptr)
|
||||
FILE *f = rom_fopen(fn, L"rb");
|
||||
|
||||
if (f == NULL) {
|
||||
pclog("ROM: image '%S' not found\n", fn);
|
||||
pclog("ROM: image '%ls' not found\n", fn);
|
||||
return(0);
|
||||
}
|
||||
|
||||
@@ -166,9 +166,9 @@ rom_load_interleaved(wchar_t *fnl, wchar_t *fnh, uint32_t addr, int sz, int off,
|
||||
int c;
|
||||
|
||||
if (fl == NULL || fh == NULL) {
|
||||
if (fl == NULL) pclog("ROM: image '%S' not found\n", fnl);
|
||||
if (fl == NULL) pclog("ROM: image '%ls' not found\n", fnl);
|
||||
else (void)fclose(fl);
|
||||
if (fh == NULL) pclog("ROM: image '%S' not found\n", fnh);
|
||||
if (fh == NULL) pclog("ROM: image '%ls' not found\n", fnh);
|
||||
else (void)fclose(fh);
|
||||
|
||||
return(0);
|
||||
|
@@ -8,11 +8,12 @@
|
||||
*
|
||||
* Handling of the SCSI controllers.
|
||||
*
|
||||
* Version: @(#)scsi.c 1.0.9 2017/10/10
|
||||
* Version: @(#)scsi.c 1.0.10 2017/10/14
|
||||
*
|
||||
* Authors: TheCollector1995, <mariogplayer@gmail.com>
|
||||
* Miran Grca, <mgrca8@gmail.com>
|
||||
* Fred N. van Kempen, <decwiz@yahoo.com>
|
||||
*
|
||||
* Copyright 2016,2017 Miran Grca.
|
||||
* Copyright 2017 Fred N. van Kempen.
|
||||
*/
|
||||
@@ -48,7 +49,7 @@ int scsi_card_current = 0;
|
||||
int scsi_card_last = 0;
|
||||
|
||||
uint32_t SCSI_BufferLength;
|
||||
void *scsiMutex;
|
||||
mutex_t *scsiMutex;
|
||||
|
||||
|
||||
typedef struct {
|
||||
|
4
src/ui.h
4
src/ui.h
@@ -8,7 +8,7 @@
|
||||
*
|
||||
* Define the various UI functions.
|
||||
*
|
||||
* Version: @(#)ui.h 1.0.2 2017/10/12
|
||||
* Version: @(#)ui.h 1.0.3 2017/10/14
|
||||
*
|
||||
* Authors: Miran Grca, <mgrca8@gmail.com>
|
||||
* Fred N. van Kempen, <decwiz@yahoo.com>
|
||||
@@ -28,7 +28,7 @@ extern "C" {
|
||||
#ifdef WIN32
|
||||
# include "win/resource.h"
|
||||
#else
|
||||
# include "linux/strings.h"
|
||||
# include "lnx/strings.h"
|
||||
#endif
|
||||
|
||||
|
||||
|
@@ -8,7 +8,7 @@
|
||||
*
|
||||
* Define all known video cards.
|
||||
*
|
||||
* Version: @(#)vid_table.c 1.0.1 2017/10/10
|
||||
* Version: @(#)vid_table.c 1.0.2 2017/10/14
|
||||
*
|
||||
* Authors: Miran Grca, <mgrca8@gmail.com>
|
||||
* Fred N. van Kempen, <decwiz@yahoo.com>
|
||||
@@ -135,7 +135,7 @@ video_cards[] = {
|
||||
{"[PCI] S3 ViRGE/DX", "virge375_pci", &s3_virge_375_pci_device, GFX_VIRGEDX_PCI },
|
||||
{"[PCI] S3 ViRGE/DX (VBE 2.0)", "virge375_vbe20_pci", &s3_virge_375_4_pci_device, GFX_VIRGEDX4_PCI },
|
||||
{"[PCI] Trident TGUI9440", "tgui9440_pci", &tgui9440_pci_device, GFX_TGUI9440_PCI },
|
||||
{"", "", NULL, 0 }
|
||||
{"", "", NULL, -1 }
|
||||
};
|
||||
|
||||
|
||||
|
@@ -8,7 +8,7 @@
|
||||
*
|
||||
* Windows resource script.
|
||||
*
|
||||
* Version: @(#)86Box.rc 1.0.16 2017/10/12
|
||||
* Version: @(#)86Box.rc 1.0.17 2017/10/14
|
||||
*
|
||||
* Authors: Miran Grca, <mgrca8@gmail.com>
|
||||
* Fred N. van Kempen, <decwiz@yahoo.com>
|
||||
@@ -823,7 +823,7 @@ BEGIN
|
||||
IDS_2155 "IRQ %i"
|
||||
IDS_2156 "%" PRIu64
|
||||
IDS_2157 "%" PRIu64 " MB (CHS: %" PRIu64 ", %" PRIu64 ", %" PRIu64 ")"
|
||||
IDS_2158 "Floppy %i (%s): %S"
|
||||
IDS_2158 "Floppy %i (%s): %ls"
|
||||
IDS_2159"All floppy images (*.0??;*.12;*.144;*.360;*.720;*.86F;*.BIN;*.CQ;*.CQM;*.DSK;*.FDI;*.FDF;*.FLP;*.HDM;*.IMA;*.IMD;*.IMG;*.JSON;*.TD0;*.VFD;*.XDF)\0*.0??;*.12;*.144;*.360;*.720;*.86F;*.BIN;*.CQ;*.CQM;*.DSK;*.FDI;*.FDF;*.FLP;*.HDM;*.IMA;*.IMD;*.IMG;*.JSON;*.TD0;*.VFD;*.XDF\0Advanced sector-based images (*.IMD;*.TD0)\0*.IMD;*.JSON;*.TD0\0Basic sector-based images (*.0??;*.12;*.144;*.360;*.720;*.BIN;*.CQ;*.CQM;*.DSK;*.FDI;*.FDF;*.FLP;*.HDM;*.IMA;*.IMG;*.JSON;*.VFD;*.XDF)\0*.0??;*.12;*.144;*.360;*.720;*.BIN;*.CQ;*.CQM;*.DSK;*.FDI;*.FDF;*.FLP;*.HDM;*.IMA;*.IMG;*.JSON;*.VFD;*.XDF\0Flux images (*.FDI)\0*.FDI\0Surface-based images (*.86F)\0*.86F\0All files (*.*)\0*.*\0"
|
||||
IDS_2160 "Configuration files (*.CFG)\0*.CFG\0All files (*.*)\0*.*\0"
|
||||
IDS_2161 "&New image..."
|
||||
@@ -869,7 +869,7 @@ BEGIN
|
||||
IDS_4112 "Please enter a valid file name"
|
||||
IDS_4113 "Remember to partition and format the new drive"
|
||||
IDS_4114 "MFM/RLL or ESDI CD-ROM drives never existed"
|
||||
IDS_4115 "Removable disk %i (SCSI): %S"
|
||||
IDS_4115 "Removable disk %i (SCSI): %ls"
|
||||
|
||||
IDS_4352 "MFM/RLL"
|
||||
IDS_4353 "XT IDE"
|
||||
|
@@ -8,7 +8,7 @@
|
||||
#
|
||||
# Makefile for Win32 (MinGW32) environment.
|
||||
#
|
||||
# Version: @(#)Makefile.mingw 1.0.61 2017/10/14
|
||||
# Version: @(#)Makefile.mingw 1.0.62 2017/10/14
|
||||
#
|
||||
# Authors: Miran Grca, <mgrca8@gmail.com>
|
||||
# Fred N. van Kempen, <decwiz@yahoo.com>
|
||||
@@ -122,6 +122,7 @@ CC := gcc -m32
|
||||
endif
|
||||
WINDRES := windres
|
||||
DEPS = -MMD -MF $*.d -c $<
|
||||
DEPFILE := win/.depends
|
||||
|
||||
# Set up the correct toolchain flags.
|
||||
OPTS := -DWIN32 $(EXTRAS) $(STUFF)
|
||||
@@ -204,17 +205,22 @@ endif
|
||||
ifeq ($(VNC), y)
|
||||
CFLAGS += -DUSE_VNC
|
||||
RFLAGS += -DUSE_VNC
|
||||
CFLAGS += -I$(VNC_PATH)\INCLUDE
|
||||
# VNCLIB := $(VNC_PATH)\LIB\libvncserver.a
|
||||
VNCLIB := -lvncserver
|
||||
ifneq ($(VNC_PATH), )
|
||||
CFLAGS += -I$(VNC_PATH)\INCLUDE
|
||||
VNCLIB := -L$(VNC_PATH)\LIB
|
||||
endif
|
||||
VNCLIB += -lvncserver
|
||||
VNCOBJ := win_vnc.o
|
||||
endif
|
||||
|
||||
ifeq ($(RDP), y)
|
||||
CFLAGS += -DUSE_RDP
|
||||
RFLAGS += -DUSE_RDP
|
||||
CFLAGS += -I$(RDP_PATH)\INCLUDE
|
||||
RDPLIB := $(RDP_PATH)\LIB\librdp.a
|
||||
ifneq ($(RDP_PATH), )
|
||||
CFLAGS += -I$(RDP_PATH)\INCLUDE
|
||||
RDPLIB := -L$(RDP_PATH)\LIB
|
||||
endif
|
||||
RDPLIB += -lrdp
|
||||
RDPOBJ := win_rdp.o
|
||||
endif
|
||||
|
||||
@@ -241,6 +247,7 @@ ifeq ($(PAS16), y)
|
||||
CFLAGS += -DUSE_PAS16
|
||||
DEVBROBJ += snd_pas16.o
|
||||
endif
|
||||
|
||||
endif
|
||||
|
||||
|
||||
@@ -483,27 +490,27 @@ endif
|
||||
|
||||
clean:
|
||||
@echo Cleaning objects..
|
||||
@-rm *.o 2>NUL
|
||||
@-rm *.res 2>NUL
|
||||
@-rm -f *.o 2>NUL
|
||||
@-rm -f *.res 2>NUL
|
||||
|
||||
clobber: clean
|
||||
@echo Cleaning executables..
|
||||
@-rm *.d 2>NUL
|
||||
@-rm *.exe 2>NUL
|
||||
# @-rm *.depends 2>NUL
|
||||
@-rm -f *.d 2>NUL
|
||||
@-rm -f *.exe 2>NUL
|
||||
# @-rm -f $(DEPFILE) 2>NUL
|
||||
|
||||
ifneq ($(AUTODEP), y)
|
||||
depclean:
|
||||
@-rm -f .depends 2>NUL
|
||||
@-rm -f $(DEPFILE) 2>NUL
|
||||
@echo Creating dependencies..
|
||||
@echo # Run "make depends" to re-create this file. >.depends
|
||||
@echo # Run "make depends" to re-create this file. $(DEPFILE)
|
||||
|
||||
depends: DEPOBJ=$(OBJ:%.o=%.d)
|
||||
depends: depclean $(OBJ:%.o=%.d)
|
||||
@-cat $(DEPOBJ) >>.depends
|
||||
@-cat $(DEPOBJ) >>$(DEPFILE)
|
||||
@-rm -f $(DEPOBJ)
|
||||
|
||||
.depends:
|
||||
$(DEPFILE):
|
||||
endif
|
||||
|
||||
|
||||
@@ -512,7 +519,7 @@ ifeq ($(AUTODEP), y)
|
||||
#-include $(OBJ:%.o=%.d) (better, but sloooowwwww)
|
||||
-include *.d
|
||||
else
|
||||
include $(wildcard .depends)
|
||||
include $(wildcard $(DEPFILE))
|
||||
endif
|
||||
|
||||
|
@@ -8,7 +8,7 @@
|
||||
*
|
||||
* The Emulator's Windows core.
|
||||
*
|
||||
* Version: @(#)win.c 1.0.23 2017/10/13
|
||||
* Version: @(#)win.c 1.0.24 2017/10/14
|
||||
*
|
||||
* Authors: Sarah Walker, <http://pcem-emulator.co.uk/>
|
||||
* Miran Grca, <mgrca8@gmail.com>
|
||||
@@ -1403,7 +1403,7 @@ get_executable_name(wchar_t *s, int size)
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
wchar_t *
|
||||
set_window_title(wchar_t *s)
|
||||
{
|
||||
if (! video_fullscreen) {
|
||||
@@ -1414,6 +1414,8 @@ set_window_title(wchar_t *s)
|
||||
|
||||
SetWindowText(hwndMain, s);
|
||||
}
|
||||
|
||||
return(s);
|
||||
}
|
||||
|
||||
|
||||
@@ -1590,7 +1592,7 @@ take_screenshot(void)
|
||||
ddraw_fs_take_screenshot(path);
|
||||
else
|
||||
ddraw_take_screenshot(path);
|
||||
pclog("Screenshot: fn='%S'\n", path);
|
||||
pclog("Screenshot: fn='%ls'\n", path);
|
||||
break;
|
||||
|
||||
case 1: /* d3d9 */
|
||||
@@ -1600,7 +1602,7 @@ take_screenshot(void)
|
||||
d3d_fs_take_screenshot(path);
|
||||
else
|
||||
d3d_take_screenshot(path);
|
||||
pclog("Screenshot: fn='%S'\n", path);
|
||||
pclog("Screenshot: fn='%ls'\n", path);
|
||||
break;
|
||||
|
||||
#ifdef USE_VNC
|
||||
@@ -1608,7 +1610,7 @@ take_screenshot(void)
|
||||
wcsftime(fn, 128, L"%Y%m%d_%H%M%S.png", info);
|
||||
append_filename_w(path, cfg_path, fn, 1024);
|
||||
vnc_take_screenshot(path);
|
||||
pclog("Screenshot: fn='%S'\n", path);
|
||||
pclog("Screenshot: fn='%ls'\n", path);
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
|
@@ -8,7 +8,7 @@
|
||||
*
|
||||
* Implement threads and mutexes for the Win32 platform.
|
||||
*
|
||||
* Version: @(#)win_thread.c 1.0.2 2017/10/10
|
||||
* Version: @(#)win_thread.c 1.0.3 2017/10/14
|
||||
*
|
||||
* Authors: Sarah Walker, <http://pcem-emulator.co.uk/>
|
||||
* Fred N. van Kempen, <decwiz@yahoo.com>
|
||||
@@ -46,9 +46,7 @@ thread_create(void (*thread_rout)(void *param), void *param)
|
||||
void
|
||||
thread_kill(void *handle)
|
||||
{
|
||||
if (handle == NULL) {
|
||||
return;
|
||||
}
|
||||
if (handle == NULL) return;
|
||||
|
||||
TerminateThread(handle, 0);
|
||||
}
|
||||
@@ -64,117 +62,98 @@ thread_sleep(int t)
|
||||
event_t *
|
||||
thread_create_event(void)
|
||||
{
|
||||
win_event_t *event = malloc(sizeof(win_event_t));
|
||||
win_event_t *ev = malloc(sizeof(win_event_t));
|
||||
|
||||
event->handle = CreateEvent(NULL, FALSE, FALSE, NULL);
|
||||
ev->handle = CreateEvent(NULL, FALSE, FALSE, NULL);
|
||||
|
||||
return((event_t *)event);
|
||||
return((event_t *)ev);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
thread_set_event(event_t *_event)
|
||||
thread_set_event(event_t *arg)
|
||||
{
|
||||
if (_event == NULL) {
|
||||
return;
|
||||
}
|
||||
win_event_t *ev = (win_event_t *)arg;
|
||||
|
||||
win_event_t *event = (win_event_t *)_event;
|
||||
if (arg == NULL) return;
|
||||
|
||||
SetEvent(event->handle);
|
||||
SetEvent(ev->handle);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
thread_reset_event(event_t *_event)
|
||||
thread_reset_event(event_t *arg)
|
||||
{
|
||||
if (_event == NULL) {
|
||||
return;
|
||||
}
|
||||
win_event_t *ev = (win_event_t *)arg;
|
||||
|
||||
win_event_t *event = (win_event_t *)_event;
|
||||
if (arg == NULL) return;
|
||||
|
||||
ResetEvent(event->handle);
|
||||
ResetEvent(ev->handle);
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
thread_wait_event(event_t *_event, int timeout)
|
||||
thread_wait_event(event_t *arg, int timeout)
|
||||
{
|
||||
if (_event == NULL) {
|
||||
return 0;
|
||||
}
|
||||
win_event_t *ev = (win_event_t *)arg;
|
||||
|
||||
win_event_t *event = (win_event_t *)_event;
|
||||
if (arg == NULL) return(0);
|
||||
|
||||
if (timeout == -1)
|
||||
timeout = INFINITE;
|
||||
|
||||
if (WaitForSingleObject(event->handle, timeout)) return(1);
|
||||
if (WaitForSingleObject(ev->handle, timeout)) return(1);
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
thread_destroy_event(event_t *_event)
|
||||
thread_destroy_event(event_t *arg)
|
||||
{
|
||||
win_event_t *event = (win_event_t *)_event;
|
||||
win_event_t *ev = (win_event_t *)arg;
|
||||
|
||||
if (_event == NULL) {
|
||||
return;
|
||||
}
|
||||
if (arg == NULL) return;
|
||||
|
||||
CloseHandle(event->handle);
|
||||
CloseHandle(ev->handle);
|
||||
|
||||
free(event);
|
||||
free(ev);
|
||||
}
|
||||
|
||||
|
||||
void *
|
||||
mutex_t *
|
||||
thread_create_mutex(wchar_t *name)
|
||||
{
|
||||
return((void*)CreateMutex(NULL, FALSE, name));
|
||||
return((mutex_t*)CreateMutex(NULL, FALSE, name));
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
thread_close_mutex(void *mutex)
|
||||
thread_close_mutex(mutex_t *mutex)
|
||||
{
|
||||
if (mutex == NULL) {
|
||||
return;
|
||||
}
|
||||
if (mutex == NULL) return;
|
||||
|
||||
CloseHandle((HANDLE)mutex);
|
||||
}
|
||||
|
||||
|
||||
uint8_t
|
||||
thread_wait_mutex(void *mutex)
|
||||
int
|
||||
thread_wait_mutex(mutex_t *mutex)
|
||||
{
|
||||
if (mutex == NULL) {
|
||||
return 0;
|
||||
}
|
||||
if (mutex == NULL) return(0);
|
||||
|
||||
DWORD dwres = WaitForSingleObject((HANDLE)mutex, INFINITE);
|
||||
|
||||
switch (dwres) {
|
||||
case WAIT_OBJECT_0:
|
||||
return(1);
|
||||
if (dwres == WAIT_OBJECT_0) return(1);
|
||||
|
||||
case WAIT_ABANDONED:
|
||||
default:
|
||||
return(0);
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
uint8_t
|
||||
thread_release_mutex(void *mutex)
|
||||
int
|
||||
thread_release_mutex(mutex_t *mutex)
|
||||
{
|
||||
if (mutex == NULL) {
|
||||
return 0;
|
||||
}
|
||||
if (mutex == NULL) return(0);
|
||||
|
||||
return(!!ReleaseMutex((HANDLE)mutex));
|
||||
}
|
||||
|
@@ -6,12 +6,12 @@
|
||||
*
|
||||
* This file is part of the 86Box distribution.
|
||||
*
|
||||
* Implement the VNC renderer.
|
||||
* Implement the VNC renderer with LibVNCServer.
|
||||
*
|
||||
* Version: @(#)win_vnc.c 1.0.2 2017/10/13
|
||||
* Version: @(#)win_vnc.c 1.0.2 2017/10/14
|
||||
*
|
||||
* Authors: RichardG, <richardg867@gmail.com>
|
||||
* Fred N. van Kempen, <decwiz@yahoo.com>
|
||||
* Authors: Fred N. van Kempen, <decwiz@yahoo.com>
|
||||
* Based on raw code by RichardG, <richardg867@gmail.com>
|
||||
*
|
||||
* Copyright 2017 Fred N. van Kempen.
|
||||
*/
|
||||
@@ -30,11 +30,8 @@
|
||||
#include "win_vnc.h"
|
||||
|
||||
|
||||
extern void video_blit_complete(void);
|
||||
|
||||
|
||||
static rfbScreenInfoPtr rfbScreen;
|
||||
static int vnc_clients;
|
||||
static rfbScreenInfoPtr rfb = NULL;
|
||||
static int clients;
|
||||
static int updatingSize;
|
||||
static int allowedX,
|
||||
allowedY;
|
||||
@@ -115,13 +112,12 @@ vnc_clientgone(rfbClientPtr cl)
|
||||
{
|
||||
pclog("VNC: client disconnected: %s\n", cl->host);
|
||||
|
||||
if (vnc_clients > 0)
|
||||
vnc_clients--;
|
||||
if (vnc_clients == 0) {
|
||||
if (clients > 0)
|
||||
clients--;
|
||||
if (clients == 0) {
|
||||
/* No more clients, pause the emulator. */
|
||||
plat_pause(1);
|
||||
|
||||
pclog("VNC: no clients, pausing..\n");
|
||||
plat_pause(1);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -133,7 +129,7 @@ vnc_newclient(rfbClientPtr cl)
|
||||
cl->clientGoneHook = vnc_clientgone;
|
||||
|
||||
pclog("VNC: new client: %s\n", cl->host);
|
||||
if (++vnc_clients == 1) {
|
||||
if (++clients == 1) {
|
||||
/* We now have clients, un-pause the emulator. */
|
||||
pclog("VNC: unpausing..\n");
|
||||
plat_pause(0);
|
||||
@@ -149,13 +145,11 @@ vnc_display(rfbClientPtr cl)
|
||||
/* Avoid race condition between resize and update. */
|
||||
if (!updatingSize && cl->newFBSizePending) {
|
||||
updatingSize = 1;
|
||||
pclog("VNC: updatingSize=1\n");
|
||||
} else if (updatingSize && !cl->newFBSizePending) {
|
||||
updatingSize = 0;
|
||||
pclog("VNC: updatingSize=0\n");
|
||||
|
||||
allowedX = rfbScreen->width;
|
||||
allowedY = rfbScreen->height;
|
||||
allowedX = rfb->width;
|
||||
allowedY = rfb->height;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -196,35 +190,51 @@ vnc_kbdevent(rfbBool down, rfbKeySym k, rfbClientPtr cl)
|
||||
|
||||
|
||||
static void
|
||||
vnc_memtoscreen(int x, int y, int y1, int y2, int w, int h)
|
||||
vnc_blit(int x, int y, int y1, int y2, int w, int h)
|
||||
{
|
||||
int yy, i;
|
||||
uint32_t *p;
|
||||
int yy;
|
||||
|
||||
for (yy=y1; yy<y2; yy++) {
|
||||
p = (uint32_t *)&(((uint32_t *)rfb->frameBuffer)[yy*2048]);
|
||||
|
||||
/* y1 to <y2. */
|
||||
for (yy=y1,i=0; yy<y2; yy++,i++) {
|
||||
if ((y+yy) >= 0 && (y+yy) < 2048)
|
||||
memcpy((uint32_t *) &(((uint8_t *) rfbScreen->frameBuffer)[yy*2048*4]), &(((uint32_t *)buffer32->line[y+yy])[x]), w*4);
|
||||
memcpy(p, &(((uint32_t *)buffer32->line[y+yy])[x]), w*4);
|
||||
}
|
||||
|
||||
video_blit_complete();
|
||||
|
||||
if (! updatingSize)
|
||||
rfbMarkRectAsModified(rfbScreen, 0,0, allowedX,allowedY);
|
||||
rfbMarkRectAsModified(rfb, 0,0, allowedX,allowedY);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
vnc_memtoscreen_8(int x, int y, int w, int h)
|
||||
vnc_blit8(int x, int y, int w, int h)
|
||||
{
|
||||
#if 1
|
||||
pclog("VNC: memtoscreen_8 %i,%i %i,%i\n", x, y, w, h);
|
||||
#endif
|
||||
uint32_t *p;
|
||||
int xx, yy;
|
||||
|
||||
for (yy = 0; yy < h; yy++) {
|
||||
p = (uint32_t *)&(((uint32_t *)rfb->frameBuffer)[yy*2048]);
|
||||
|
||||
if ((y+yy) >= 0 && (y+yy) < buffer->h) {
|
||||
for (xx=0; xx<w; xx++)
|
||||
p[xx] = pal_lookup[buffer->line[y+yy][x+xx]];
|
||||
}
|
||||
}
|
||||
|
||||
video_blit_complete();
|
||||
|
||||
if (! updatingSize)
|
||||
rfbMarkRectAsModified(rfb, 0,0, x+w,y+h);
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
vnc_init(HWND h)
|
||||
{
|
||||
static char title[128];
|
||||
rfbPixelFormat rpf = {
|
||||
/*
|
||||
* Screen format:
|
||||
@@ -238,34 +248,32 @@ vnc_init(HWND h)
|
||||
32, 32, 0, 1, 255,255,255, 16, 8, 0, 0, 0
|
||||
};
|
||||
|
||||
if (rfbScreen == NULL) {
|
||||
if (rfb == NULL) {
|
||||
wcstombs(title, set_window_title(NULL), sizeof(title));
|
||||
updatingSize = 0;
|
||||
allowedX = allowedY = 2048;
|
||||
|
||||
rfbScreen = rfbGetScreen(0, NULL, 2048, 2048, 8, 3, 4);
|
||||
rfbScreen->desktopName = "86Box";
|
||||
rfbScreen->frameBuffer = (char *)malloc(2048 * 2048 * 4);
|
||||
rfb = rfbGetScreen(0, NULL, 2048, 2048, 8, 3, 4);
|
||||
rfb->desktopName = title;
|
||||
rfb->frameBuffer = (char *)malloc(2048 * 2048 * 4);
|
||||
|
||||
#if 1
|
||||
rfbScreen->serverFormat = rpf;
|
||||
#else
|
||||
rfbScreen->serverFormat = {32, 32, 0, 1, 255,255,255, 16, 8, 0, 0, 0};
|
||||
#endif
|
||||
rfbScreen->alwaysShared = TRUE;
|
||||
rfbScreen->displayHook = vnc_display;
|
||||
rfbScreen->kbdAddEvent = vnc_kbdevent;
|
||||
rfbScreen->newClientHook = vnc_newclient;
|
||||
rfb->serverFormat = rpf;
|
||||
rfb->alwaysShared = TRUE;
|
||||
rfb->displayHook = vnc_display;
|
||||
rfb->kbdAddEvent = vnc_kbdevent;
|
||||
rfb->newClientHook = vnc_newclient;
|
||||
|
||||
rfbInitServer(rfbScreen);
|
||||
rfbInitServer(rfb);
|
||||
|
||||
rfbRunEventLoop(rfbScreen, -1, TRUE);
|
||||
rfbRunEventLoop(rfb, -1, TRUE);
|
||||
}
|
||||
|
||||
video_setblit(vnc_memtoscreen_8, vnc_memtoscreen);
|
||||
/* Set up our BLIT handlers. */
|
||||
video_setblit(vnc_blit8, vnc_blit);
|
||||
|
||||
pclog("VNC: init complete.\n");
|
||||
|
||||
vnc_clients = 0;
|
||||
clients = 0;
|
||||
|
||||
return(1);
|
||||
}
|
||||
@@ -281,17 +289,21 @@ vnc_close(void)
|
||||
void
|
||||
vnc_resize(int x, int y)
|
||||
{
|
||||
if ((x != rfbScreen->width || y != rfbScreen->height) && x > 160 && y > 0) {
|
||||
rfbClientIteratorPtr iterator;
|
||||
rfbClientPtr cl;
|
||||
|
||||
if (rfb == NULL) return;
|
||||
|
||||
if ((x != rfb->width || y != rfb->height) && x > 160 && y > 0) {
|
||||
pclog("VNC: updating resolution: %dx%d\n", x, y);
|
||||
|
||||
allowedX = (rfbScreen->width < x) ? rfbScreen->width : x;
|
||||
allowedY = (rfbScreen->width < y) ? rfbScreen->width : y;
|
||||
allowedX = (rfb->width < x) ? rfb->width : x;
|
||||
allowedY = (rfb->width < y) ? rfb->width : y;
|
||||
|
||||
rfbScreen->width = x;
|
||||
rfbScreen->height = y;
|
||||
rfb->width = x;
|
||||
rfb->height = y;
|
||||
|
||||
rfbClientPtr cl;
|
||||
rfbClientIteratorPtr iterator = rfbGetClientIterator(rfbScreen);
|
||||
iterator = rfbGetClientIterator(rfb);
|
||||
while ((cl = rfbClientIteratorNext(iterator)) != NULL) {
|
||||
LOCK(cl->updateMutex);
|
||||
cl->newFBSizePending = 1;
|
||||
@@ -304,7 +316,7 @@ vnc_resize(int x, int y)
|
||||
int
|
||||
vnc_pause(void)
|
||||
{
|
||||
return((vnc_clients > 0) ? 0 : 1);
|
||||
return((clients > 0) ? 0 : 1);
|
||||
}
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user