mirror of
https://github.com/86Box/86Box.git
synced 2026-02-22 01:25:33 -07:00
clang-format in src/win and other misc places
This commit is contained in:
@@ -32,10 +32,9 @@
|
||||
|
||||
typedef struct
|
||||
{
|
||||
uint8_t regs[8];
|
||||
uint8_t regs[8];
|
||||
} ibm_5161_t;
|
||||
|
||||
|
||||
static void
|
||||
ibm_5161_out(uint16_t port, uint8_t val, void *priv)
|
||||
{
|
||||
@@ -44,47 +43,45 @@ ibm_5161_out(uint16_t port, uint8_t val, void *priv)
|
||||
dev->regs[port & 0x0007] = val;
|
||||
}
|
||||
|
||||
|
||||
static uint8_t
|
||||
ibm_5161_in(uint16_t port, void *priv)
|
||||
{
|
||||
ibm_5161_t *dev = (ibm_5161_t *) priv;
|
||||
uint8_t ret = 0xff;
|
||||
uint8_t ret = 0xff;
|
||||
|
||||
ret = dev->regs[port & 0x0007];
|
||||
|
||||
switch (port) {
|
||||
case 0x210: /* Write to latch expansion bus data (ED0-ED7) */
|
||||
/* Read to verify expansion bus data (ED0-ED7) */
|
||||
break;
|
||||
case 0x214: /* Write to latch data bus bits (DO - 07) */
|
||||
/* Read data bus bits (DO - D7) */
|
||||
break;
|
||||
case 0x211: /* Read high-order address bits (A8 - A 15) */
|
||||
case 0x215: /* Read high-order address bits (A8 - A 15) */
|
||||
ret = (get_last_addr() >> 8) & 0xff;
|
||||
break;
|
||||
case 0x212: /* Read low-order address bits (A0 - A7) */
|
||||
case 0x216: /* Read low-order address bits (A0 - A7) */
|
||||
ret = get_last_addr() & 0xff;
|
||||
break;
|
||||
case 0x213: /* Write 00 to disable expansion unit */
|
||||
/* Write 01 to enable expansion unit */
|
||||
/* Read status of expansion unit
|
||||
00 = enable/disable
|
||||
01 = wait-state request flag
|
||||
02-03 = not used
|
||||
04-07 = switch position
|
||||
1 = Off
|
||||
0 =On */
|
||||
ret = dev->regs[3] & 0x01;
|
||||
break;
|
||||
case 0x210: /* Write to latch expansion bus data (ED0-ED7) */
|
||||
/* Read to verify expansion bus data (ED0-ED7) */
|
||||
break;
|
||||
case 0x214: /* Write to latch data bus bits (DO - 07) */
|
||||
/* Read data bus bits (DO - D7) */
|
||||
break;
|
||||
case 0x211: /* Read high-order address bits (A8 - A 15) */
|
||||
case 0x215: /* Read high-order address bits (A8 - A 15) */
|
||||
ret = (get_last_addr() >> 8) & 0xff;
|
||||
break;
|
||||
case 0x212: /* Read low-order address bits (A0 - A7) */
|
||||
case 0x216: /* Read low-order address bits (A0 - A7) */
|
||||
ret = get_last_addr() & 0xff;
|
||||
break;
|
||||
case 0x213: /* Write 00 to disable expansion unit */
|
||||
/* Write 01 to enable expansion unit */
|
||||
/* Read status of expansion unit
|
||||
00 = enable/disable
|
||||
01 = wait-state request flag
|
||||
02-03 = not used
|
||||
04-07 = switch position
|
||||
1 = Off
|
||||
0 =On */
|
||||
ret = dev->regs[3] & 0x01;
|
||||
break;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
ibm_5161_close(void *p)
|
||||
{
|
||||
@@ -93,7 +90,6 @@ ibm_5161_close(void *p)
|
||||
free(dev);
|
||||
}
|
||||
|
||||
|
||||
static void *
|
||||
ibm_5161_init(const device_t *info)
|
||||
{
|
||||
@@ -102,25 +98,25 @@ ibm_5161_init(const device_t *info)
|
||||
|
||||
/* Extender Card Registers */
|
||||
io_sethandler(0x0210, 0x0004,
|
||||
ibm_5161_in, NULL, NULL, ibm_5161_out, NULL, NULL, dev);
|
||||
ibm_5161_in, NULL, NULL, ibm_5161_out, NULL, NULL, dev);
|
||||
|
||||
/* Receiver Card Registers */
|
||||
io_sethandler(0x0214, 0x0003,
|
||||
ibm_5161_in, NULL, NULL, ibm_5161_out, NULL, NULL, dev);
|
||||
ibm_5161_in, NULL, NULL, ibm_5161_out, NULL, NULL, dev);
|
||||
|
||||
return dev;
|
||||
}
|
||||
|
||||
const device_t ibm_5161_device = {
|
||||
.name = "IBM Expansion Unit (5161)",
|
||||
.name = "IBM Expansion Unit (5161)",
|
||||
.internal_name = "ibm_5161",
|
||||
.flags = DEVICE_ISA,
|
||||
.local = 0,
|
||||
.init = ibm_5161_init,
|
||||
.close = ibm_5161_close,
|
||||
.reset = NULL,
|
||||
.flags = DEVICE_ISA,
|
||||
.local = 0,
|
||||
.init = ibm_5161_init,
|
||||
.close = ibm_5161_close,
|
||||
.reset = NULL,
|
||||
{ .available = NULL },
|
||||
.speed_changed = NULL,
|
||||
.force_redraw = NULL,
|
||||
.config = NULL
|
||||
.force_redraw = NULL,
|
||||
.config = NULL
|
||||
};
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -18,183 +18,178 @@
|
||||
* Copyright 2021 Laci bá'
|
||||
*/
|
||||
#ifndef EMU_86BOX_H
|
||||
# define EMU_86BOX_H
|
||||
|
||||
#define EMU_86BOX_H
|
||||
|
||||
/* Configuration values. */
|
||||
#define SERIAL_MAX 4
|
||||
#define PARALLEL_MAX 4
|
||||
#define SCREEN_RES_X 640
|
||||
#define SCREEN_RES_Y 480
|
||||
#define SERIAL_MAX 4
|
||||
#define PARALLEL_MAX 4
|
||||
#define SCREEN_RES_X 640
|
||||
#define SCREEN_RES_Y 480
|
||||
|
||||
/* Filename and pathname info. */
|
||||
#define CONFIG_FILE "86box.cfg"
|
||||
#define CONFIG_FILE "86box.cfg"
|
||||
#define NVR_PATH "nvr"
|
||||
#define SCREENSHOT_PATH "screenshots"
|
||||
|
||||
|
||||
/* Default language 0xFFFF = from system, 0x409 = en-US */
|
||||
#define DEFAULT_LANGUAGE 0x0409
|
||||
|
||||
#ifdef MIN
|
||||
#undef MIN
|
||||
# undef MIN
|
||||
#endif
|
||||
#ifdef MAX
|
||||
#undef MAX
|
||||
# undef MAX
|
||||
#endif
|
||||
#ifdef ABS
|
||||
#undef ABS
|
||||
# undef ABS
|
||||
#endif
|
||||
|
||||
#define MIN(a, b) ((a) < (b) ? (a) : (b))
|
||||
#define MAX(a, b) ((a) > (b) ? (a) : (b))
|
||||
#define ABS(x) ((x) > 0 ? (x) : -(x))
|
||||
#define BCD8(x) ((((x) / 10) << 4) | ((x) % 10))
|
||||
#define BCD16(x) ((((x) / 1000) << 12) | (((x) / 100) << 8) | BCD8(x))
|
||||
#define BCD32(x) ((((x) / 10000000) << 28) | (((x) / 1000000) << 24) | (((x) / 100000) << 20) | (((x) / 10000) << 16) | BCD16(x))
|
||||
#define MIN(a, b) ((a) < (b) ? (a) : (b))
|
||||
#define MAX(a, b) ((a) > (b) ? (a) : (b))
|
||||
#define ABS(x) ((x) > 0 ? (x) : -(x))
|
||||
#define BCD8(x) ((((x) / 10) << 4) | ((x) % 10))
|
||||
#define BCD16(x) ((((x) / 1000) << 12) | (((x) / 100) << 8) | BCD8(x))
|
||||
#define BCD32(x) ((((x) / 10000000) << 28) | (((x) / 1000000) << 24) | (((x) / 100000) << 20) | (((x) / 10000) << 16) | BCD16(x))
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* Global variables. */
|
||||
extern uint32_t lang_sys; /* (-) system language code */
|
||||
extern uint32_t lang_sys; /* (-) system language code */
|
||||
|
||||
extern int dump_on_exit; /* (O) dump regs on exit*/
|
||||
extern int do_dump_config; /* (O) dump cfg after load */
|
||||
extern int start_in_fullscreen; /* (O) start in fullscreen */
|
||||
extern int dump_on_exit; /* (O) dump regs on exit*/
|
||||
extern int do_dump_config; /* (O) dump cfg after load */
|
||||
extern int start_in_fullscreen; /* (O) start in fullscreen */
|
||||
#ifdef _WIN32
|
||||
extern int force_debug; /* (O) force debug output */
|
||||
extern int force_debug; /* (O) force debug output */
|
||||
#endif
|
||||
#ifdef USE_WX
|
||||
extern int video_fps; /* (O) render speed in fps */
|
||||
extern int video_fps; /* (O) render speed in fps */
|
||||
#endif
|
||||
extern int settings_only; /* (O) show only the settings dialog */
|
||||
extern int confirm_exit_cmdl; /* (O) do not ask for confirmation on quit if set to 0 */
|
||||
extern int settings_only; /* (O) show only the settings dialog */
|
||||
extern int confirm_exit_cmdl; /* (O) do not ask for confirmation on quit if set to 0 */
|
||||
#ifdef _WIN32
|
||||
extern uint64_t unique_id;
|
||||
extern uint64_t source_hwnd;
|
||||
extern uint64_t unique_id;
|
||||
extern uint64_t source_hwnd;
|
||||
#endif
|
||||
extern char rom_path[1024]; /* (O) full path to ROMs */
|
||||
extern char log_path[1024]; /* (O) full path of logfile */
|
||||
extern char vm_name[1024]; /* (O) display name of the VM */
|
||||
|
||||
extern char rom_path[1024]; /* (O) full path to ROMs */
|
||||
extern char log_path[1024]; /* (O) full path of logfile */
|
||||
extern char vm_name[1024]; /* (O) display name of the VM */
|
||||
|
||||
#define window_x monitor_settings[0].mon_window_x
|
||||
#define window_y monitor_settings[0].mon_window_y
|
||||
#define window_w monitor_settings[0].mon_window_w
|
||||
#define window_h monitor_settings[0].mon_window_h
|
||||
extern int window_remember,
|
||||
vid_resize, /* (C) allow resizing */
|
||||
invert_display, /* (C) invert the display */
|
||||
suppress_overscan; /* (C) suppress overscans */
|
||||
extern uint32_t lang_id; /* (C) language code identifier */
|
||||
extern char icon_set[256]; /* (C) iconset identifier */
|
||||
extern int scale; /* (C) screen scale factor */
|
||||
extern int dpi_scale; /* (C) DPI scaling of the emulated screen */
|
||||
extern int vid_api; /* (C) video renderer */
|
||||
extern int vid_cga_contrast, /* (C) video */
|
||||
video_fullscreen, /* (C) video */
|
||||
video_fullscreen_first, /* (C) video */
|
||||
video_fullscreen_scale, /* (C) video */
|
||||
enable_overscan, /* (C) video */
|
||||
force_43, /* (C) video */
|
||||
video_filter_method, /* (C) video */
|
||||
video_vsync, /* (C) video */
|
||||
video_framerate, /* (C) video */
|
||||
gfxcard; /* (C) graphics/video card */
|
||||
extern char video_shader[512]; /* (C) video */
|
||||
extern int serial_enabled[], /* (C) enable serial ports */
|
||||
bugger_enabled, /* (C) enable ISAbugger */
|
||||
postcard_enabled, /* (C) enable POST card */
|
||||
isamem_type[], /* (C) enable ISA mem cards */
|
||||
isartc_type; /* (C) enable ISA RTC card */
|
||||
extern int sound_is_float, /* (C) sound uses FP values */
|
||||
GAMEBLASTER, /* (C) sound option */
|
||||
GUS, GUSMAX, /* (C) sound option */
|
||||
SSI2001, /* (C) sound option */
|
||||
voodoo_enabled, /* (C) video option */
|
||||
ibm8514_enabled, /* (C) video option */
|
||||
xga_enabled; /* (C) video option */
|
||||
extern uint32_t mem_size; /* (C) memory size (Installed on system board) */
|
||||
extern uint32_t isa_mem_size; /* (C) memory size (ISA Memory Cards) */
|
||||
extern int cpu, /* (C) cpu type */
|
||||
cpu_use_dynarec, /* (C) cpu uses/needs Dyna */
|
||||
fpu_type; /* (C) fpu type */
|
||||
extern int time_sync; /* (C) enable time sync */
|
||||
extern int network_type; /* (C) net provider type */
|
||||
extern int network_card; /* (C) net interface num */
|
||||
extern char network_host[522]; /* (C) host network intf */
|
||||
extern int hdd_format_type; /* (C) hard disk file format */
|
||||
extern int confirm_reset, /* (C) enable reset confirmation */
|
||||
confirm_exit, /* (C) enable exit confirmation */
|
||||
confirm_save; /* (C) enable save confirmation */
|
||||
extern int enable_discord; /* (C) enable Discord integration */
|
||||
extern int window_remember,
|
||||
vid_resize, /* (C) allow resizing */
|
||||
invert_display, /* (C) invert the display */
|
||||
suppress_overscan; /* (C) suppress overscans */
|
||||
extern uint32_t lang_id; /* (C) language code identifier */
|
||||
extern char icon_set[256]; /* (C) iconset identifier */
|
||||
extern int scale; /* (C) screen scale factor */
|
||||
extern int dpi_scale; /* (C) DPI scaling of the emulated screen */
|
||||
extern int vid_api; /* (C) video renderer */
|
||||
extern int vid_cga_contrast, /* (C) video */
|
||||
video_fullscreen, /* (C) video */
|
||||
video_fullscreen_first, /* (C) video */
|
||||
video_fullscreen_scale, /* (C) video */
|
||||
enable_overscan, /* (C) video */
|
||||
force_43, /* (C) video */
|
||||
video_filter_method, /* (C) video */
|
||||
video_vsync, /* (C) video */
|
||||
video_framerate, /* (C) video */
|
||||
gfxcard; /* (C) graphics/video card */
|
||||
extern char video_shader[512]; /* (C) video */
|
||||
extern int serial_enabled[], /* (C) enable serial ports */
|
||||
bugger_enabled, /* (C) enable ISAbugger */
|
||||
postcard_enabled, /* (C) enable POST card */
|
||||
isamem_type[], /* (C) enable ISA mem cards */
|
||||
isartc_type; /* (C) enable ISA RTC card */
|
||||
extern int sound_is_float, /* (C) sound uses FP values */
|
||||
GAMEBLASTER, /* (C) sound option */
|
||||
GUS, GUSMAX, /* (C) sound option */
|
||||
SSI2001, /* (C) sound option */
|
||||
voodoo_enabled, /* (C) video option */
|
||||
ibm8514_enabled, /* (C) video option */
|
||||
xga_enabled; /* (C) video option */
|
||||
extern uint32_t mem_size; /* (C) memory size (Installed on system board) */
|
||||
extern uint32_t isa_mem_size; /* (C) memory size (ISA Memory Cards) */
|
||||
extern int cpu, /* (C) cpu type */
|
||||
cpu_use_dynarec, /* (C) cpu uses/needs Dyna */
|
||||
fpu_type; /* (C) fpu type */
|
||||
extern int time_sync; /* (C) enable time sync */
|
||||
extern int network_type; /* (C) net provider type */
|
||||
extern int network_card; /* (C) net interface num */
|
||||
extern char network_host[522]; /* (C) host network intf */
|
||||
extern int hdd_format_type; /* (C) hard disk file format */
|
||||
extern int confirm_reset, /* (C) enable reset confirmation */
|
||||
confirm_exit, /* (C) enable exit confirmation */
|
||||
confirm_save; /* (C) enable save confirmation */
|
||||
extern int enable_discord; /* (C) enable Discord integration */
|
||||
|
||||
extern int is_pentium; /* TODO: Move back to cpu/cpu.h when it's figured out,
|
||||
how to remove that hack from the ET4000/W32p. */
|
||||
extern int fixed_size_x, fixed_size_y;
|
||||
extern int is_pentium; /* TODO: Move back to cpu/cpu.h when it's figured out,
|
||||
how to remove that hack from the ET4000/W32p. */
|
||||
extern int fixed_size_x, fixed_size_y;
|
||||
extern double mouse_sensitivity; /* (C) Mouse sensitivity scale */
|
||||
extern int pit_mode; /* (C) force setting PIT mode */
|
||||
extern int fm_driver; /* (C) select FM sound driver */
|
||||
extern int pit_mode; /* (C) force setting PIT mode */
|
||||
extern int fm_driver; /* (C) select FM sound driver */
|
||||
|
||||
extern char exe_path[2048]; /* path (dir) of executable */
|
||||
extern char usr_path[1024]; /* path (dir) of user data */
|
||||
extern char cfg_path[1024]; /* full path of config file */
|
||||
extern char exe_path[2048]; /* path (dir) of executable */
|
||||
extern char usr_path[1024]; /* path (dir) of user data */
|
||||
extern char cfg_path[1024]; /* full path of config file */
|
||||
#ifndef USE_NEW_DYNAREC
|
||||
extern FILE *stdlog; /* file to log output to */
|
||||
extern FILE *stdlog; /* file to log output to */
|
||||
#endif
|
||||
extern int config_changed; /* config has changed */
|
||||
|
||||
extern int config_changed; /* config has changed */
|
||||
|
||||
/* Function prototypes. */
|
||||
#ifdef HAVE_STDARG_H
|
||||
extern void pclog_ex(const char *fmt, va_list);
|
||||
extern void fatal_ex(const char *fmt, va_list);
|
||||
extern void pclog_ex(const char *fmt, va_list);
|
||||
extern void fatal_ex(const char *fmt, va_list);
|
||||
#endif
|
||||
extern void pclog_toggle_suppr(void);
|
||||
extern void pclog(const char *fmt, ...);
|
||||
extern void fatal(const char *fmt, ...);
|
||||
extern void set_screen_size(int x, int y);
|
||||
extern void set_screen_size_monitor(int x, int y, int monitor_index);
|
||||
extern void reset_screen_size(void);
|
||||
extern void reset_screen_size_monitor(int monitor_index);
|
||||
extern void set_screen_size_natural(void);
|
||||
extern void pclog_toggle_suppr(void);
|
||||
extern void pclog(const char *fmt, ...);
|
||||
extern void fatal(const char *fmt, ...);
|
||||
extern void set_screen_size(int x, int y);
|
||||
extern void set_screen_size_monitor(int x, int y, int monitor_index);
|
||||
extern void reset_screen_size(void);
|
||||
extern void reset_screen_size_monitor(int monitor_index);
|
||||
extern void set_screen_size_natural(void);
|
||||
extern void update_mouse_msg();
|
||||
#if 0
|
||||
extern void pc_reload(wchar_t *fn);
|
||||
#endif
|
||||
extern int pc_init_modules(void);
|
||||
extern int pc_init(int argc, char *argv[]);
|
||||
extern void pc_close(void *threadid);
|
||||
extern void pc_reset_hard_close(void);
|
||||
extern void pc_reset_hard_init(void);
|
||||
extern void pc_reset_hard(void);
|
||||
extern void pc_full_speed(void);
|
||||
extern void pc_speed_changed(void);
|
||||
extern void pc_send_cad(void);
|
||||
extern void pc_send_cae(void);
|
||||
extern void pc_send_cab(void);
|
||||
extern void pc_run(void);
|
||||
extern void pc_start(void);
|
||||
extern void pc_onesec(void);
|
||||
extern int pc_init_modules(void);
|
||||
extern int pc_init(int argc, char *argv[]);
|
||||
extern void pc_close(void *threadid);
|
||||
extern void pc_reset_hard_close(void);
|
||||
extern void pc_reset_hard_init(void);
|
||||
extern void pc_reset_hard(void);
|
||||
extern void pc_full_speed(void);
|
||||
extern void pc_speed_changed(void);
|
||||
extern void pc_send_cad(void);
|
||||
extern void pc_send_cae(void);
|
||||
extern void pc_send_cab(void);
|
||||
extern void pc_run(void);
|
||||
extern void pc_start(void);
|
||||
extern void pc_onesec(void);
|
||||
|
||||
extern uint16_t get_last_addr(void);
|
||||
extern uint16_t get_last_addr(void);
|
||||
|
||||
/* This is for external subtraction of cycles;
|
||||
should be in cpu.c but I put it here to avoid
|
||||
having to include cpu.c everywhere. */
|
||||
extern void sub_cycles(int c);
|
||||
extern void resub_cycles(int old_cycles);
|
||||
extern void sub_cycles(int c);
|
||||
extern void resub_cycles(int old_cycles);
|
||||
|
||||
extern double isa_timing;
|
||||
extern int io_delay, framecountx;
|
||||
extern double isa_timing;
|
||||
extern int io_delay, framecountx;
|
||||
|
||||
extern volatile int cpu_thread_run;
|
||||
extern volatile int cpu_thread_run;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#endif /*EMU_86BOX_H*/
|
||||
#endif /*EMU_86BOX_H*/
|
||||
|
||||
@@ -20,8 +20,7 @@
|
||||
* Copyright 2017 Fred N. van Kempen.
|
||||
*/
|
||||
#ifndef EMU_CONFIG_H
|
||||
# define EMU_CONFIG_H
|
||||
|
||||
#define EMU_CONFIG_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
@@ -69,16 +68,16 @@ typedef struct {
|
||||
window_x,
|
||||
window_y,
|
||||
sound_gain; /* Sound gain */
|
||||
#ifdef USE_LANGUAGE
|
||||
# ifdef USE_LANGUAGE
|
||||
uint16_t language_id; /* Language ID (0x0409 = English (US)) */
|
||||
#endif
|
||||
# endif
|
||||
|
||||
/* Machine cateogory */
|
||||
int machine, /* Machine */
|
||||
cpu, /* CPU */
|
||||
#ifdef USE_DYNAREC
|
||||
# ifdef USE_DYNAREC
|
||||
cpu_use_dynarec, /* CPU recompiler enabled */
|
||||
#endif
|
||||
# endif
|
||||
wait_states, /* CPU wait states */
|
||||
enable_external_fpu, /* FPU enabled */
|
||||
time_sync; /* Time sync enabled */
|
||||
@@ -109,9 +108,9 @@ typedef struct {
|
||||
|
||||
/* Ports category */
|
||||
char parallel_devices[PARALLEL_MAX][32]; /* LPT device names */
|
||||
#ifdef USE_SERIAL_DEVICES
|
||||
# ifdef USE_SERIAL_DEVICES
|
||||
char serial_devices[SERIAL_MAX][32]; /* Serial device names */
|
||||
#endif
|
||||
# endif
|
||||
int serial_enabled[SERIAL_MAX], /* Serial ports 1, 2, 3, 4 enabled */
|
||||
parallel_enabled[PARALLEL_MAX]; /* LPT1, LPT2, LPT3, LPT4 enabled */
|
||||
|
||||
@@ -137,33 +136,32 @@ typedef struct {
|
||||
} config_t;
|
||||
#endif
|
||||
|
||||
extern void config_load(void);
|
||||
extern void config_save(void);
|
||||
extern void config_write(char *fn);
|
||||
extern void config_dump(void);
|
||||
extern void config_load(void);
|
||||
extern void config_save(void);
|
||||
extern void config_write(char *fn);
|
||||
extern void config_dump(void);
|
||||
|
||||
extern void config_delete_var(char *head, char *name);
|
||||
extern int config_get_int(char *head, char *name, int def);
|
||||
extern double config_get_double(char *head, char *name, double def);
|
||||
extern int config_get_hex16(char *head, char *name, int def);
|
||||
extern int config_get_hex20(char *head, char *name, int def);
|
||||
extern int config_get_mac(char *head, char *name, int def);
|
||||
extern char *config_get_string(char *head, char *name, char *def);
|
||||
extern wchar_t *config_get_wstring(char *head, char *name, wchar_t *def);
|
||||
extern void config_set_int(char *head, char *name, int val);
|
||||
extern void config_set_double(char *head, char *name, double val);
|
||||
extern void config_set_hex16(char *head, char *name, int val);
|
||||
extern void config_set_hex20(char *head, char *name, int val);
|
||||
extern void config_set_mac(char *head, char *name, int val);
|
||||
extern void config_set_string(char *head, char *name, char *val);
|
||||
extern void config_set_wstring(char *head, char *name, wchar_t *val);
|
||||
extern void config_delete_var(char *head, char *name);
|
||||
extern int config_get_int(char *head, char *name, int def);
|
||||
extern double config_get_double(char *head, char *name, double def);
|
||||
extern int config_get_hex16(char *head, char *name, int def);
|
||||
extern int config_get_hex20(char *head, char *name, int def);
|
||||
extern int config_get_mac(char *head, char *name, int def);
|
||||
extern char *config_get_string(char *head, char *name, char *def);
|
||||
extern wchar_t *config_get_wstring(char *head, char *name, wchar_t *def);
|
||||
extern void config_set_int(char *head, char *name, int val);
|
||||
extern void config_set_double(char *head, char *name, double val);
|
||||
extern void config_set_hex16(char *head, char *name, int val);
|
||||
extern void config_set_hex20(char *head, char *name, int val);
|
||||
extern void config_set_mac(char *head, char *name, int val);
|
||||
extern void config_set_string(char *head, char *name, char *val);
|
||||
extern void config_set_wstring(char *head, char *name, wchar_t *val);
|
||||
|
||||
extern void * config_find_section(char *name);
|
||||
extern void config_rename_section(void *priv, char *name);
|
||||
extern void *config_find_section(char *name);
|
||||
extern void config_rename_section(void *priv, char *name);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#endif /*EMU_CONFIG_H*/
|
||||
#endif /*EMU_CONFIG_H*/
|
||||
|
||||
@@ -37,52 +37,49 @@
|
||||
* USA.
|
||||
*/
|
||||
#ifndef EMU_DEVICE_H
|
||||
# define EMU_DEVICE_H
|
||||
|
||||
|
||||
#define CONFIG_END -1
|
||||
#define CONFIG_STRING 0
|
||||
#define CONFIG_INT 1
|
||||
#define CONFIG_BINARY 2
|
||||
#define CONFIG_SELECTION 3
|
||||
#define CONFIG_MIDI_OUT 4
|
||||
#define CONFIG_FNAME 5
|
||||
#define CONFIG_SPINNER 6
|
||||
#define CONFIG_HEX16 7
|
||||
#define CONFIG_HEX20 8
|
||||
#define CONFIG_MAC 9
|
||||
#define CONFIG_MIDI_IN 10
|
||||
#define CONFIG_BIOS 11
|
||||
#define EMU_DEVICE_H
|
||||
|
||||
#define CONFIG_END -1
|
||||
#define CONFIG_STRING 0
|
||||
#define CONFIG_INT 1
|
||||
#define CONFIG_BINARY 2
|
||||
#define CONFIG_SELECTION 3
|
||||
#define CONFIG_MIDI_OUT 4
|
||||
#define CONFIG_FNAME 5
|
||||
#define CONFIG_SPINNER 6
|
||||
#define CONFIG_HEX16 7
|
||||
#define CONFIG_HEX20 8
|
||||
#define CONFIG_MAC 9
|
||||
#define CONFIG_MIDI_IN 10
|
||||
#define CONFIG_BIOS 11
|
||||
|
||||
enum {
|
||||
DEVICE_NOT_WORKING = 1, /* does not currently work correctly and will be disabled in a release build */
|
||||
DEVICE_PCJR = 2, /* requires an IBM PCjr */
|
||||
DEVICE_AT = 4, /* requires an AT-compatible system */
|
||||
DEVICE_PS2 = 8, /* requires a PS/1 or PS/2 system */
|
||||
DEVICE_ISA = 0x10, /* requires the ISA bus */
|
||||
DEVICE_CBUS = 0x20, /* requires the C-BUS bus */
|
||||
DEVICE_MCA = 0x40, /* requires the MCA bus */
|
||||
DEVICE_EISA = 0x80, /* requires the EISA bus */
|
||||
DEVICE_VLB = 0x100, /* requires the PCI bus */
|
||||
DEVICE_PCI = 0x200, /* requires the VLB bus */
|
||||
DEVICE_AGP = 0x400, /* requires the AGP bus */
|
||||
DEVICE_AC97 = 0x800, /* requires the AC'97 bus */
|
||||
DEVICE_COM = 0x1000, /* requires a serial port */
|
||||
DEVICE_LPT = 0x2000 /* requires a parallel port */
|
||||
DEVICE_NOT_WORKING = 1, /* does not currently work correctly and will be disabled in a release build */
|
||||
DEVICE_PCJR = 2, /* requires an IBM PCjr */
|
||||
DEVICE_AT = 4, /* requires an AT-compatible system */
|
||||
DEVICE_PS2 = 8, /* requires a PS/1 or PS/2 system */
|
||||
DEVICE_ISA = 0x10, /* requires the ISA bus */
|
||||
DEVICE_CBUS = 0x20, /* requires the C-BUS bus */
|
||||
DEVICE_MCA = 0x40, /* requires the MCA bus */
|
||||
DEVICE_EISA = 0x80, /* requires the EISA bus */
|
||||
DEVICE_VLB = 0x100, /* requires the PCI bus */
|
||||
DEVICE_PCI = 0x200, /* requires the VLB bus */
|
||||
DEVICE_AGP = 0x400, /* requires the AGP bus */
|
||||
DEVICE_AC97 = 0x800, /* requires the AC'97 bus */
|
||||
DEVICE_COM = 0x1000, /* requires a serial port */
|
||||
DEVICE_LPT = 0x2000 /* requires a parallel port */
|
||||
};
|
||||
|
||||
|
||||
typedef struct {
|
||||
const char *description;
|
||||
int value;
|
||||
int value;
|
||||
} device_config_selection_t;
|
||||
|
||||
typedef struct {
|
||||
const char *name;
|
||||
const char *internal_name;
|
||||
int bios_type;
|
||||
int files_no;
|
||||
const char *name;
|
||||
const char *internal_name;
|
||||
int bios_type;
|
||||
int files_no;
|
||||
const char **files;
|
||||
} device_config_bios_t;
|
||||
|
||||
@@ -93,94 +90,92 @@ typedef struct {
|
||||
} device_config_spinner_t;
|
||||
|
||||
typedef struct {
|
||||
const char *name;
|
||||
const char *description;
|
||||
int type;
|
||||
const char *default_string;
|
||||
int default_int;
|
||||
const char *file_filter;
|
||||
const device_config_spinner_t spinner;
|
||||
const char *name;
|
||||
const char *description;
|
||||
int type;
|
||||
const char *default_string;
|
||||
int default_int;
|
||||
const char *file_filter;
|
||||
const device_config_spinner_t spinner;
|
||||
const device_config_selection_t selection[16];
|
||||
const device_config_bios_t *bios;
|
||||
const device_config_bios_t *bios;
|
||||
} device_config_t;
|
||||
|
||||
typedef struct _device_ {
|
||||
const char *name;
|
||||
const char *name;
|
||||
const char *internal_name;
|
||||
uint32_t flags; /* system flags */
|
||||
uint32_t local; /* flags local to device */
|
||||
uint32_t flags; /* system flags */
|
||||
uint32_t local; /* flags local to device */
|
||||
|
||||
void *(*init)(const struct _device_ *);
|
||||
void (*close)(void *priv);
|
||||
void (*reset)(void *priv);
|
||||
void *(*init)(const struct _device_ *);
|
||||
void (*close)(void *priv);
|
||||
void (*reset)(void *priv);
|
||||
union {
|
||||
int (*available)(void);
|
||||
int (*poll)(int x, int y, int z, int b, void *priv);
|
||||
void (*register_pci_slot)(int device, int type, int inta, int intb, int intc, int intd, void *priv);
|
||||
int (*available)(void);
|
||||
int (*poll)(int x, int y, int z, int b, void *priv);
|
||||
void (*register_pci_slot)(int device, int type, int inta, int intb, int intc, int intd, void *priv);
|
||||
};
|
||||
void (*speed_changed)(void *priv);
|
||||
void (*force_redraw)(void *priv);
|
||||
void (*speed_changed)(void *priv);
|
||||
void (*force_redraw)(void *priv);
|
||||
|
||||
const device_config_t *config;
|
||||
} device_t;
|
||||
|
||||
typedef struct {
|
||||
const device_t *dev;
|
||||
char name[2048];
|
||||
const device_t *dev;
|
||||
char name[2048];
|
||||
} device_context_t;
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
extern void device_init(void);
|
||||
extern void device_set_context(device_context_t *c, const device_t *d, int inst);
|
||||
extern void device_context(const device_t *d);
|
||||
extern void device_context_inst(const device_t *d, int inst);
|
||||
extern void device_context_restore(void);
|
||||
extern void *device_add(const device_t *d);
|
||||
extern void device_add_ex(const device_t *d, void *priv);
|
||||
extern void *device_add_inst(const device_t *d, int inst);
|
||||
extern void device_add_inst_ex(const device_t *d, void *priv, int inst);
|
||||
extern void *device_cadd(const device_t *d, const device_t *cd);
|
||||
extern void device_cadd_ex(const device_t *d, const device_t *cd, void *priv);
|
||||
extern void *device_cadd_inst(const device_t *d, const device_t *cd, int inst);
|
||||
extern void device_cadd_inst_ex(const device_t *d, const device_t *cd, void *priv, int inst);
|
||||
extern void device_close_all(void);
|
||||
extern void device_reset_all(void);
|
||||
extern void device_reset_all_pci(void);
|
||||
extern void *device_get_priv(const device_t *d);
|
||||
extern int device_available(const device_t *d);
|
||||
extern int device_poll(const device_t *d, int x, int y, int z, int b);
|
||||
extern void device_register_pci_slot(const device_t *d, int device, int type, int inta, int intb, int intc, int intd);
|
||||
extern void device_speed_changed(void);
|
||||
extern void device_force_redraw(void);
|
||||
extern void device_get_name(const device_t *d, int bus, char *name);
|
||||
extern int device_has_config(const device_t *d);
|
||||
extern void device_init(void);
|
||||
extern void device_set_context(device_context_t *c, const device_t *d, int inst);
|
||||
extern void device_context(const device_t *d);
|
||||
extern void device_context_inst(const device_t *d, int inst);
|
||||
extern void device_context_restore(void);
|
||||
extern void *device_add(const device_t *d);
|
||||
extern void device_add_ex(const device_t *d, void *priv);
|
||||
extern void *device_add_inst(const device_t *d, int inst);
|
||||
extern void device_add_inst_ex(const device_t *d, void *priv, int inst);
|
||||
extern void *device_cadd(const device_t *d, const device_t *cd);
|
||||
extern void device_cadd_ex(const device_t *d, const device_t *cd, void *priv);
|
||||
extern void *device_cadd_inst(const device_t *d, const device_t *cd, int inst);
|
||||
extern void device_cadd_inst_ex(const device_t *d, const device_t *cd, void *priv, int inst);
|
||||
extern void device_close_all(void);
|
||||
extern void device_reset_all(void);
|
||||
extern void device_reset_all_pci(void);
|
||||
extern void *device_get_priv(const device_t *d);
|
||||
extern int device_available(const device_t *d);
|
||||
extern int device_poll(const device_t *d, int x, int y, int z, int b);
|
||||
extern void device_register_pci_slot(const device_t *d, int device, int type, int inta, int intb, int intc, int intd);
|
||||
extern void device_speed_changed(void);
|
||||
extern void device_force_redraw(void);
|
||||
extern void device_get_name(const device_t *d, int bus, char *name);
|
||||
extern int device_has_config(const device_t *d);
|
||||
|
||||
extern int device_is_valid(const device_t *, int m);
|
||||
extern int device_is_valid(const device_t *, int m);
|
||||
|
||||
extern int device_get_config_int(const char *name);
|
||||
extern int device_get_config_int_ex(const char *s, int dflt_int);
|
||||
extern int device_get_config_hex16(const char *name);
|
||||
extern int device_get_config_hex20(const char *name);
|
||||
extern int device_get_config_mac(const char *name, int dflt_int);
|
||||
extern void device_set_config_int(const char *s, int val);
|
||||
extern void device_set_config_hex16(const char *s, int val);
|
||||
extern void device_set_config_hex20(const char *s, int val);
|
||||
extern void device_set_config_mac(const char *s, int val);
|
||||
extern const char *device_get_config_string(const char *name);
|
||||
#define device_get_config_bios device_get_config_string
|
||||
extern int device_get_config_int(const char *name);
|
||||
extern int device_get_config_int_ex(const char *s, int dflt_int);
|
||||
extern int device_get_config_hex16(const char *name);
|
||||
extern int device_get_config_hex20(const char *name);
|
||||
extern int device_get_config_mac(const char *name, int dflt_int);
|
||||
extern void device_set_config_int(const char *s, int val);
|
||||
extern void device_set_config_hex16(const char *s, int val);
|
||||
extern void device_set_config_hex20(const char *s, int val);
|
||||
extern void device_set_config_mac(const char *s, int val);
|
||||
extern const char *device_get_config_string(const char *name);
|
||||
#define device_get_config_bios device_get_config_string
|
||||
|
||||
extern char * device_get_internal_name(const device_t *d);
|
||||
extern char *device_get_internal_name(const device_t *d);
|
||||
|
||||
extern int machine_get_config_int(char *s);
|
||||
extern char *machine_get_config_string(char *s);
|
||||
extern int machine_get_config_int(char *s);
|
||||
extern char *machine_get_config_string(char *s);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#endif /*EMU_DEVICE_H*/
|
||||
#endif /*EMU_DEVICE_H*/
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
#ifndef EMU_LPT_H
|
||||
# define EMU_LPT_H
|
||||
#define EMU_LPT_H
|
||||
|
||||
#define LPT1_ADDR 0x0378
|
||||
#define LPT1_IRQ 7
|
||||
#define LPT2_ADDR 0x0278
|
||||
#define LPT2_IRQ 5
|
||||
#define LPT1_ADDR 0x0378
|
||||
#define LPT1_IRQ 7
|
||||
#define LPT2_ADDR 0x0278
|
||||
#define LPT2_IRQ 5
|
||||
// LPT 1 on machines when installed
|
||||
#define LPT_MDA_ADDR 0x03bc
|
||||
#define LPT_MDA_IRQ 7
|
||||
#define LPT4_ADDR 0x0268
|
||||
#define LPT4_IRQ 5
|
||||
#define LPT_MDA_ADDR 0x03bc
|
||||
#define LPT_MDA_IRQ 7
|
||||
#define LPT4_ADDR 0x0268
|
||||
#define LPT4_IRQ 5
|
||||
/*
|
||||
#define LPT5_ADDR 0x027c
|
||||
#define LPT5_IRQ 7
|
||||
@@ -22,37 +22,36 @@ typedef struct
|
||||
const char *name;
|
||||
const char *internal_name;
|
||||
|
||||
void * (*init)(void *lpt);
|
||||
void (*close)(void *p);
|
||||
void (*write_data)(uint8_t val, void *p);
|
||||
void (*write_ctrl)(uint8_t val, void *p);
|
||||
uint8_t (*read_data)(void *p);
|
||||
uint8_t (*read_status)(void *p);
|
||||
uint8_t (*read_ctrl)(void *p);
|
||||
void *(*init)(void *lpt);
|
||||
void (*close)(void *p);
|
||||
void (*write_data)(uint8_t val, void *p);
|
||||
void (*write_ctrl)(uint8_t val, void *p);
|
||||
uint8_t (*read_data)(void *p);
|
||||
uint8_t (*read_status)(void *p);
|
||||
uint8_t (*read_ctrl)(void *p);
|
||||
} lpt_device_t;
|
||||
|
||||
|
||||
extern void lpt_init(void);
|
||||
extern void lpt_port_init(int i, uint16_t port);
|
||||
extern void lpt_port_irq(int i, uint8_t irq);
|
||||
extern void lpt_port_remove(int i);
|
||||
extern void lpt1_remove_ams(void);
|
||||
|
||||
#define lpt1_init(a) lpt_port_init(0, a)
|
||||
#define lpt1_irq(a) lpt_port_irq(0, a)
|
||||
#define lpt1_remove() lpt_port_remove(0)
|
||||
#define lpt1_init(a) lpt_port_init(0, a)
|
||||
#define lpt1_irq(a) lpt_port_irq(0, a)
|
||||
#define lpt1_remove() lpt_port_remove(0)
|
||||
|
||||
#define lpt2_init(a) lpt_port_init(1, a)
|
||||
#define lpt2_irq(a) lpt_port_irq(1, a)
|
||||
#define lpt2_remove() lpt_port_remove(1)
|
||||
#define lpt2_init(a) lpt_port_init(1, a)
|
||||
#define lpt2_irq(a) lpt_port_irq(1, a)
|
||||
#define lpt2_remove() lpt_port_remove(1)
|
||||
|
||||
#define lpt3_init(a) lpt_port_init(2, a)
|
||||
#define lpt3_irq(a) lpt_port_irq(2, a)
|
||||
#define lpt3_remove() lpt_port_remove(2)
|
||||
#define lpt3_init(a) lpt_port_init(2, a)
|
||||
#define lpt3_irq(a) lpt_port_irq(2, a)
|
||||
#define lpt3_remove() lpt_port_remove(2)
|
||||
|
||||
#define lpt4_init(a) lpt_port_init(3, a)
|
||||
#define lpt4_irq(a) lpt_port_irq(3, a)
|
||||
#define lpt4_remove() lpt_port_remove(3)
|
||||
#define lpt4_init(a) lpt_port_init(3, a)
|
||||
#define lpt4_irq(a) lpt_port_irq(3, a)
|
||||
#define lpt4_remove() lpt_port_remove(3)
|
||||
|
||||
/*
|
||||
#define lpt5_init(a) lpt_port_init(4, a)
|
||||
@@ -64,31 +63,29 @@ extern void lpt1_remove_ams(void);
|
||||
#define lpt6_remove() lpt_port_remove(5)
|
||||
*/
|
||||
|
||||
|
||||
void lpt_devices_init(void);
|
||||
void lpt_devices_close(void);
|
||||
|
||||
|
||||
typedef struct {
|
||||
uint8_t enabled, irq,
|
||||
dat, ctrl;
|
||||
uint16_t addr, pad0;
|
||||
int device, enable_irq;
|
||||
lpt_device_t * dt;
|
||||
void * priv;
|
||||
uint8_t enabled, irq,
|
||||
dat, ctrl;
|
||||
uint16_t addr, pad0;
|
||||
int device, enable_irq;
|
||||
lpt_device_t *dt;
|
||||
void *priv;
|
||||
} lpt_port_t;
|
||||
|
||||
extern lpt_port_t lpt_ports[PARALLEL_MAX];
|
||||
extern lpt_port_t lpt_ports[PARALLEL_MAX];
|
||||
|
||||
extern void lpt_write(uint16_t port, uint8_t val, void *priv);
|
||||
extern uint8_t lpt_read(uint16_t port, void *priv);
|
||||
extern void lpt_write(uint16_t port, uint8_t val, void *priv);
|
||||
extern uint8_t lpt_read(uint16_t port, void *priv);
|
||||
|
||||
extern void lpt_irq(void *priv, int raise);
|
||||
extern void lpt_irq(void *priv, int raise);
|
||||
|
||||
extern char * lpt_device_get_name(int id);
|
||||
extern char * lpt_device_get_internal_name(int id);
|
||||
extern char *lpt_device_get_name(int id);
|
||||
extern char *lpt_device_get_internal_name(int id);
|
||||
|
||||
extern int lpt_device_get_from_internal_name(char *s);
|
||||
extern int lpt_device_get_from_internal_name(char *s);
|
||||
|
||||
extern const lpt_device_t lpt_dac_device;
|
||||
extern const lpt_device_t lpt_dac_stereo_device;
|
||||
|
||||
@@ -18,12 +18,11 @@
|
||||
*/
|
||||
|
||||
#ifndef MACHINE_AMSTRAD_H
|
||||
# define MACHINE_AMSTRAD_H
|
||||
#define MACHINE_AMSTRAD_H
|
||||
|
||||
extern int amstrad_latch;
|
||||
|
||||
enum
|
||||
{
|
||||
enum {
|
||||
AMSTRAD_NOLATCH,
|
||||
AMSTRAD_SW9,
|
||||
AMSTRAD_SW10
|
||||
|
||||
@@ -38,22 +38,19 @@
|
||||
*/
|
||||
|
||||
#ifndef MACHINE_T3100E_H
|
||||
# define MACHINE_T3100E_H
|
||||
|
||||
#define MACHINE_T3100E_H
|
||||
|
||||
extern const device_t t3100e_device;
|
||||
|
||||
extern void t3100e_notify_set(uint8_t value);
|
||||
extern void t3100e_display_set(uint8_t value);
|
||||
extern uint8_t t3100e_display_get(void);
|
||||
extern uint8_t t3100e_config_get(void);
|
||||
extern void t3100e_turbo_set(uint8_t value);
|
||||
extern uint8_t t3100e_mono_get(void);
|
||||
extern void t3100e_mono_set(uint8_t value);
|
||||
|
||||
extern void t3100e_notify_set(uint8_t value);
|
||||
extern void t3100e_display_set(uint8_t value);
|
||||
extern uint8_t t3100e_display_get(void);
|
||||
extern uint8_t t3100e_config_get(void);
|
||||
extern void t3100e_turbo_set(uint8_t value);
|
||||
extern uint8_t t3100e_mono_get(void);
|
||||
extern void t3100e_mono_set(uint8_t value);
|
||||
extern void t3100e_video_options_set(uint8_t options);
|
||||
extern void t3100e_display_set(uint8_t internal);
|
||||
|
||||
extern void t3100e_video_options_set(uint8_t options);
|
||||
extern void t3100e_display_set(uint8_t internal);
|
||||
|
||||
|
||||
#endif /*MACHINE_T3100E_H*/
|
||||
#endif /*MACHINE_T3100E_H*/
|
||||
|
||||
@@ -38,24 +38,21 @@
|
||||
*/
|
||||
|
||||
#ifndef MACHINE_T1000_H
|
||||
# define MACHINE_T1000_H
|
||||
|
||||
#define MACHINE_T1000_H
|
||||
|
||||
extern const device_t t1000_video_device;
|
||||
extern const device_t t1200_video_device;
|
||||
|
||||
|
||||
extern void t1000_video_options_set(uint8_t options);
|
||||
extern void t1000_video_options_set(uint8_t options);
|
||||
extern void t1000_video_enable(uint8_t enabled);
|
||||
extern void t1000_display_set(uint8_t internal);
|
||||
extern void t1000_display_set(uint8_t internal);
|
||||
|
||||
extern void t1000_syskey(uint8_t amask, uint8_t omask, uint8_t xmask);
|
||||
extern void t1000_syskey(uint8_t amask, uint8_t omask, uint8_t xmask);
|
||||
|
||||
extern void t1000_nvr_load(void);
|
||||
extern void t1000_nvr_save(void);
|
||||
extern void t1000_nvr_load(void);
|
||||
extern void t1000_nvr_save(void);
|
||||
|
||||
extern void t1200_nvr_load(void);
|
||||
extern void t1200_nvr_save(void);
|
||||
extern void t1200_nvr_load(void);
|
||||
extern void t1200_nvr_save(void);
|
||||
|
||||
|
||||
#endif /*MACHINE_T1000_H*/
|
||||
#endif /*MACHINE_T1000_H*/
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
#ifndef MACHINE_XI80888_H
|
||||
# define MACHINE_XI80888_H
|
||||
#define MACHINE_XI80888_H
|
||||
|
||||
#include <86box/device.h>
|
||||
|
||||
extern const device_t xi8088_device;
|
||||
|
||||
uint8_t xi8088_turbo_get();
|
||||
void xi8088_turbo_set(uint8_t value);
|
||||
void xi8088_bios_128kb_set(int val);
|
||||
int xi8088_bios_128kb();
|
||||
void xi8088_turbo_set(uint8_t value);
|
||||
void xi8088_bios_128kb_set(int val);
|
||||
int xi8088_bios_128kb();
|
||||
|
||||
#endif /*MACHINE_XI80888_H*/
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
*/
|
||||
|
||||
#ifndef EMU_MACHINE_H
|
||||
# define EMU_MACHINE_H
|
||||
#define EMU_MACHINE_H
|
||||
|
||||
/* Machine feature flags. */
|
||||
#define MACHINE_BUS_NONE 0x00000000 /* sys has no bus */
|
||||
@@ -250,78 +250,78 @@ enum {
|
||||
};
|
||||
|
||||
typedef struct _machine_filter_ {
|
||||
const char *name;
|
||||
const char *name;
|
||||
const char id;
|
||||
} machine_filter_t;
|
||||
|
||||
typedef struct _machine_cpu_ {
|
||||
uint32_t package;
|
||||
const uint8_t *block;
|
||||
uint32_t min_bus;
|
||||
uint32_t max_bus;
|
||||
uint16_t min_voltage;
|
||||
uint16_t max_voltage;
|
||||
float min_multi;
|
||||
float max_multi;
|
||||
uint32_t package;
|
||||
const uint8_t *block;
|
||||
uint32_t min_bus;
|
||||
uint32_t max_bus;
|
||||
uint16_t min_voltage;
|
||||
uint16_t max_voltage;
|
||||
float min_multi;
|
||||
float max_multi;
|
||||
} machine_cpu_t;
|
||||
|
||||
typedef struct _machine_memory_ {
|
||||
uint32_t min, max;
|
||||
int step;
|
||||
uint32_t min, max;
|
||||
int step;
|
||||
} machine_memory_t;
|
||||
|
||||
typedef struct _machine_ {
|
||||
const char *name;
|
||||
const char *internal_name;
|
||||
uint32_t type;
|
||||
uint32_t chipset;
|
||||
int (*init)(const struct _machine_ *);
|
||||
uintptr_t pad, pad0, pad1, pad2;
|
||||
const machine_cpu_t cpu;
|
||||
uintptr_t bus_flags;
|
||||
uintptr_t flags;
|
||||
const char *name;
|
||||
const char *internal_name;
|
||||
uint32_t type;
|
||||
uint32_t chipset;
|
||||
int (*init)(const struct _machine_ *);
|
||||
uintptr_t pad, pad0, pad1, pad2;
|
||||
const machine_cpu_t cpu;
|
||||
uintptr_t bus_flags;
|
||||
uintptr_t flags;
|
||||
const machine_memory_t ram;
|
||||
int ram_granularity;
|
||||
int nvrmask;
|
||||
uint16_t kbc;
|
||||
int ram_granularity;
|
||||
int nvrmask;
|
||||
uint16_t kbc;
|
||||
/* Bits:
|
||||
7-0 Set bits are forced set on P1 (no forced set = 0x00);
|
||||
15-8 Clear bits are forced clear on P1 (no foced clear = 0xff). */
|
||||
uint16_t kbc_p1;
|
||||
uint32_t gpio;
|
||||
uint32_t gpio_acpi;
|
||||
7-0 Set bits are forced set on P1 (no forced set = 0x00);
|
||||
15-8 Clear bits are forced clear on P1 (no foced clear = 0xff). */
|
||||
uint16_t kbc_p1;
|
||||
uint32_t gpio;
|
||||
uint32_t gpio_acpi;
|
||||
#ifdef EMU_DEVICE_H
|
||||
const device_t *device;
|
||||
const device_t *vid_device;
|
||||
const device_t *snd_device;
|
||||
const device_t *net_device;
|
||||
#else
|
||||
void *device;
|
||||
void *vid_device;
|
||||
void *snd_device;
|
||||
void *net_device;
|
||||
void *device;
|
||||
void *vid_device;
|
||||
void *snd_device;
|
||||
void *net_device;
|
||||
#endif
|
||||
} machine_t;
|
||||
|
||||
/* Global variables. */
|
||||
extern const machine_filter_t machine_types[],
|
||||
machine_chipsets[];
|
||||
extern const machine_t machines[];
|
||||
extern int bios_only;
|
||||
extern int machine;
|
||||
machine_chipsets[];
|
||||
extern const machine_t machines[];
|
||||
extern int bios_only;
|
||||
extern int machine;
|
||||
|
||||
/* Core functions. */
|
||||
extern int machine_count(void);
|
||||
extern int machine_available(int m);
|
||||
extern char *machine_getname(void);
|
||||
extern char *machine_getname_ex(int m);
|
||||
extern char *machine_get_internal_name(void);
|
||||
extern int machine_get_machine_from_internal_name(char *s);
|
||||
extern void machine_init(void);
|
||||
extern int machine_count(void);
|
||||
extern int machine_available(int m);
|
||||
extern char *machine_getname(void);
|
||||
extern char *machine_getname_ex(int m);
|
||||
extern char *machine_get_internal_name(void);
|
||||
extern int machine_get_machine_from_internal_name(char *s);
|
||||
extern void machine_init(void);
|
||||
#ifdef EMU_DEVICE_H
|
||||
extern const device_t *machine_getdevice(int m);
|
||||
extern const device_t *machine_getdevice(int m);
|
||||
#endif
|
||||
extern char *machine_get_internal_name_ex(int m);
|
||||
extern char *machine_get_internal_name_ex(int m);
|
||||
extern int machine_get_nvrmask(int m);
|
||||
extern int machine_has_flags(int m, int flags);
|
||||
extern int machine_has_bus(int m, int bus_flags);
|
||||
@@ -335,476 +335,474 @@ extern void machine_close(void);
|
||||
extern uint8_t machine_get_p1(void);
|
||||
extern void machine_load_p1(int m);
|
||||
extern uint32_t machine_get_gpi(void);
|
||||
extern void machine_load_gpi(int m);
|
||||
extern void machine_load_gpi(int m);
|
||||
extern void machine_set_gpi(uint32_t gpi);
|
||||
|
||||
/* Initialization functions for boards and systems. */
|
||||
extern void machine_common_init(const machine_t *);
|
||||
extern void machine_common_init(const machine_t *);
|
||||
|
||||
/* m_amstrad.c */
|
||||
extern int machine_pc1512_init(const machine_t *);
|
||||
extern int machine_pc1640_init(const machine_t *);
|
||||
extern int machine_pc200_init(const machine_t *);
|
||||
extern int machine_ppc512_init(const machine_t *);
|
||||
extern int machine_pc2086_init(const machine_t *);
|
||||
extern int machine_pc3086_init(const machine_t *);
|
||||
extern int machine_pc1512_init(const machine_t *);
|
||||
extern int machine_pc1640_init(const machine_t *);
|
||||
extern int machine_pc200_init(const machine_t *);
|
||||
extern int machine_ppc512_init(const machine_t *);
|
||||
extern int machine_pc2086_init(const machine_t *);
|
||||
extern int machine_pc3086_init(const machine_t *);
|
||||
|
||||
/* m_at.c */
|
||||
extern void machine_at_common_init_ex(const machine_t *, int type);
|
||||
extern void machine_at_common_init(const machine_t *);
|
||||
extern void machine_at_init(const machine_t *);
|
||||
extern void machine_at_ps2_init(const machine_t *);
|
||||
extern void machine_at_common_ide_init(const machine_t *);
|
||||
extern void machine_at_ibm_common_ide_init(const machine_t *);
|
||||
extern void machine_at_ide_init(const machine_t *);
|
||||
extern void machine_at_ps2_ide_init(const machine_t *);
|
||||
extern void machine_at_common_init_ex(const machine_t *, int type);
|
||||
extern void machine_at_common_init(const machine_t *);
|
||||
extern void machine_at_init(const machine_t *);
|
||||
extern void machine_at_ps2_init(const machine_t *);
|
||||
extern void machine_at_common_ide_init(const machine_t *);
|
||||
extern void machine_at_ibm_common_ide_init(const machine_t *);
|
||||
extern void machine_at_ide_init(const machine_t *);
|
||||
extern void machine_at_ps2_ide_init(const machine_t *);
|
||||
|
||||
extern int machine_at_ibm_init(const machine_t *);
|
||||
extern int machine_at_ibm_init(const machine_t *);
|
||||
|
||||
//IBM AT with custom BIOS
|
||||
extern int machine_at_ibmatami_init(const machine_t *); // IBM AT with AMI BIOS
|
||||
extern int machine_at_ibmatpx_init(const machine_t *); //IBM AT with Phoenix BIOS
|
||||
extern int machine_at_ibmatquadtel_init(const machine_t *); // IBM AT with Quadtel BIOS
|
||||
// IBM AT with custom BIOS
|
||||
extern int machine_at_ibmatami_init(const machine_t *); // IBM AT with AMI BIOS
|
||||
extern int machine_at_ibmatpx_init(const machine_t *); // IBM AT with Phoenix BIOS
|
||||
extern int machine_at_ibmatquadtel_init(const machine_t *); // IBM AT with Quadtel BIOS
|
||||
|
||||
extern int machine_at_ibmxt286_init(const machine_t *);
|
||||
extern int machine_at_ibmxt286_init(const machine_t *);
|
||||
|
||||
extern int machine_at_siemens_init(const machine_t *); //Siemens PCD-2L. N82330 discrete machine. It segfaults in some places
|
||||
extern int machine_at_siemens_init(const machine_t *); // Siemens PCD-2L. N82330 discrete machine. It segfaults in some places
|
||||
|
||||
#if defined(DEV_BRANCH) && defined(USE_OPEN_AT)
|
||||
extern int machine_at_openat_init(const machine_t *);
|
||||
extern int machine_at_openat_init(const machine_t *);
|
||||
#endif
|
||||
|
||||
/* m_at_286_386sx.c */
|
||||
extern int machine_at_tg286m_init(const machine_t *);
|
||||
extern int machine_at_ama932j_init(const machine_t *);
|
||||
extern int machine_at_px286_init(const machine_t *);
|
||||
extern int machine_at_quadt286_init(const machine_t *);
|
||||
extern int machine_at_mr286_init(const machine_t *);
|
||||
extern int machine_at_tg286m_init(const machine_t *);
|
||||
extern int machine_at_ama932j_init(const machine_t *);
|
||||
extern int machine_at_px286_init(const machine_t *);
|
||||
extern int machine_at_quadt286_init(const machine_t *);
|
||||
extern int machine_at_mr286_init(const machine_t *);
|
||||
|
||||
extern int machine_at_neat_init(const machine_t *);
|
||||
extern int machine_at_neat_ami_init(const machine_t *);
|
||||
extern int machine_at_neat_init(const machine_t *);
|
||||
extern int machine_at_neat_ami_init(const machine_t *);
|
||||
|
||||
extern int machine_at_quadt386sx_init(const machine_t *);
|
||||
extern int machine_at_quadt386sx_init(const machine_t *);
|
||||
|
||||
extern int machine_at_award286_init(const machine_t *);
|
||||
extern int machine_at_gdc212m_init(const machine_t *);
|
||||
extern int machine_at_gw286ct_init(const machine_t *);
|
||||
extern int machine_at_super286tr_init(const machine_t *);
|
||||
extern int machine_at_spc4200p_init(const machine_t *);
|
||||
extern int machine_at_spc4216p_init(const machine_t *);
|
||||
extern int machine_at_spc4620p_init(const machine_t *);
|
||||
extern int machine_at_kmxc02_init(const machine_t *);
|
||||
extern int machine_at_deskmaster286_init(const machine_t *);
|
||||
extern int machine_at_award286_init(const machine_t *);
|
||||
extern int machine_at_gdc212m_init(const machine_t *);
|
||||
extern int machine_at_gw286ct_init(const machine_t *);
|
||||
extern int machine_at_super286tr_init(const machine_t *);
|
||||
extern int machine_at_spc4200p_init(const machine_t *);
|
||||
extern int machine_at_spc4216p_init(const machine_t *);
|
||||
extern int machine_at_spc4620p_init(const machine_t *);
|
||||
extern int machine_at_kmxc02_init(const machine_t *);
|
||||
extern int machine_at_deskmaster286_init(const machine_t *);
|
||||
|
||||
extern int machine_at_pc8_init(const machine_t *);
|
||||
extern int machine_at_3302_init(const machine_t *);
|
||||
extern int machine_at_pc8_init(const machine_t *);
|
||||
extern int machine_at_3302_init(const machine_t *);
|
||||
|
||||
#if defined(DEV_BRANCH) && defined(USE_OLIVETTI)
|
||||
extern int machine_at_m290_init(const machine_t *);
|
||||
extern int machine_at_m290_init(const machine_t *);
|
||||
#endif
|
||||
|
||||
extern int machine_at_shuttle386sx_init(const machine_t *);
|
||||
extern int machine_at_adi386sx_init(const machine_t *);
|
||||
extern int machine_at_cmdsl386sx16_init(const machine_t *);
|
||||
extern int machine_at_cmdsl386sx25_init(const machine_t *);
|
||||
extern int machine_at_dataexpert386sx_init(const machine_t *);
|
||||
extern int machine_at_spc6033p_init(const machine_t *);
|
||||
extern int machine_at_wd76c10_init(const machine_t *);
|
||||
extern int machine_at_arb1374_init(const machine_t *);
|
||||
extern int machine_at_sbc350a_init(const machine_t *);
|
||||
extern int machine_at_flytech386_init(const machine_t *);
|
||||
extern int machine_at_mr1217_init(const machine_t *);
|
||||
extern int machine_at_pja511m_init(const machine_t *);
|
||||
extern int machine_at_prox1332_init(const machine_t *);
|
||||
extern int machine_at_shuttle386sx_init(const machine_t *);
|
||||
extern int machine_at_adi386sx_init(const machine_t *);
|
||||
extern int machine_at_cmdsl386sx16_init(const machine_t *);
|
||||
extern int machine_at_cmdsl386sx25_init(const machine_t *);
|
||||
extern int machine_at_dataexpert386sx_init(const machine_t *);
|
||||
extern int machine_at_spc6033p_init(const machine_t *);
|
||||
extern int machine_at_wd76c10_init(const machine_t *);
|
||||
extern int machine_at_arb1374_init(const machine_t *);
|
||||
extern int machine_at_sbc350a_init(const machine_t *);
|
||||
extern int machine_at_flytech386_init(const machine_t *);
|
||||
extern int machine_at_mr1217_init(const machine_t *);
|
||||
extern int machine_at_pja511m_init(const machine_t *);
|
||||
extern int machine_at_prox1332_init(const machine_t *);
|
||||
|
||||
extern int machine_at_awardsx_init(const machine_t *);
|
||||
extern int machine_at_awardsx_init(const machine_t *);
|
||||
|
||||
extern int machine_at_pc916sx_init(const machine_t *);
|
||||
extern int machine_at_pc916sx_init(const machine_t *);
|
||||
|
||||
/* m_at_386dx_486.c */
|
||||
extern int machine_at_acc386_init(const machine_t *);
|
||||
extern int machine_at_asus386_init(const machine_t *);
|
||||
extern int machine_at_ecs386_init(const machine_t *);
|
||||
extern int machine_at_spc6000a_init(const machine_t *);
|
||||
extern int machine_at_micronics386_init(const machine_t *);
|
||||
extern int machine_at_acc386_init(const machine_t *);
|
||||
extern int machine_at_asus386_init(const machine_t *);
|
||||
extern int machine_at_ecs386_init(const machine_t *);
|
||||
extern int machine_at_spc6000a_init(const machine_t *);
|
||||
extern int machine_at_micronics386_init(const machine_t *);
|
||||
|
||||
extern int machine_at_rycleopardlx_init(const machine_t *);
|
||||
extern int machine_at_rycleopardlx_init(const machine_t *);
|
||||
|
||||
extern int machine_at_486vchd_init(const machine_t *);
|
||||
extern int machine_at_486vchd_init(const machine_t *);
|
||||
|
||||
extern int machine_at_cs4031_init(const machine_t *);
|
||||
extern int machine_at_cs4031_init(const machine_t *);
|
||||
|
||||
extern int machine_at_pb410a_init(const machine_t *);
|
||||
extern int machine_at_pb410a_init(const machine_t *);
|
||||
|
||||
extern int machine_at_decpclpv_init(const machine_t *);
|
||||
extern int machine_at_acerv10_init(const machine_t *);
|
||||
extern int machine_at_decpclpv_init(const machine_t *);
|
||||
extern int machine_at_acerv10_init(const machine_t *);
|
||||
|
||||
extern int machine_at_acera1g_init(const machine_t *);
|
||||
extern int machine_at_ali1429_init(const machine_t *);
|
||||
extern int machine_at_winbios1429_init(const machine_t *);
|
||||
extern int machine_at_acera1g_init(const machine_t *);
|
||||
extern int machine_at_ali1429_init(const machine_t *);
|
||||
extern int machine_at_winbios1429_init(const machine_t *);
|
||||
|
||||
extern int machine_at_opti495_init(const machine_t *);
|
||||
extern int machine_at_opti495_ami_init(const machine_t *);
|
||||
extern int machine_at_opti495_mr_init(const machine_t *);
|
||||
extern int machine_at_opti495_init(const machine_t *);
|
||||
extern int machine_at_opti495_ami_init(const machine_t *);
|
||||
extern int machine_at_opti495_mr_init(const machine_t *);
|
||||
|
||||
extern int machine_at_vect486vl_init(const machine_t *);
|
||||
extern int machine_at_d824_init(const machine_t *);
|
||||
extern int machine_at_vect486vl_init(const machine_t *);
|
||||
extern int machine_at_d824_init(const machine_t *);
|
||||
|
||||
extern int machine_at_403tg_init(const machine_t *);
|
||||
extern int machine_at_403tg_d_init(const machine_t *);
|
||||
extern int machine_at_403tg_d_mr_init(const machine_t *);
|
||||
extern int machine_at_pc330_6573_init(const machine_t *);
|
||||
extern int machine_at_mvi486_init(const machine_t *);
|
||||
extern int machine_at_403tg_init(const machine_t *);
|
||||
extern int machine_at_403tg_d_init(const machine_t *);
|
||||
extern int machine_at_403tg_d_mr_init(const machine_t *);
|
||||
extern int machine_at_pc330_6573_init(const machine_t *);
|
||||
extern int machine_at_mvi486_init(const machine_t *);
|
||||
|
||||
extern int machine_at_sis401_init(const machine_t *);
|
||||
extern int machine_at_isa486_init(const machine_t *);
|
||||
extern int machine_at_av4_init(const machine_t *);
|
||||
extern int machine_at_valuepoint433_init(const machine_t *);
|
||||
extern int machine_at_sis401_init(const machine_t *);
|
||||
extern int machine_at_isa486_init(const machine_t *);
|
||||
extern int machine_at_av4_init(const machine_t *);
|
||||
extern int machine_at_valuepoint433_init(const machine_t *);
|
||||
|
||||
extern int machine_at_vli486sv2g_init(const machine_t *);
|
||||
extern int machine_at_ami471_init(const machine_t *);
|
||||
extern int machine_at_dtk486_init(const machine_t *);
|
||||
extern int machine_at_px471_init(const machine_t *);
|
||||
extern int machine_at_win471_init(const machine_t *);
|
||||
extern int machine_at_vi15g_init(const machine_t *);
|
||||
extern int machine_at_greenb_init(const machine_t *);
|
||||
extern int machine_at_vli486sv2g_init(const machine_t *);
|
||||
extern int machine_at_ami471_init(const machine_t *);
|
||||
extern int machine_at_dtk486_init(const machine_t *);
|
||||
extern int machine_at_px471_init(const machine_t *);
|
||||
extern int machine_at_win471_init(const machine_t *);
|
||||
extern int machine_at_vi15g_init(const machine_t *);
|
||||
extern int machine_at_greenb_init(const machine_t *);
|
||||
|
||||
extern int machine_at_r418_init(const machine_t *);
|
||||
extern int machine_at_ls486e_init(const machine_t *);
|
||||
extern int machine_at_4dps_init(const machine_t *);
|
||||
extern int machine_at_4saw2_init(const machine_t *);
|
||||
extern int machine_at_m4li_init(const machine_t *);
|
||||
extern int machine_at_alfredo_init(const machine_t *);
|
||||
extern int machine_at_ninja_init(const machine_t *);
|
||||
extern int machine_at_486sp3_init(const machine_t *);
|
||||
extern int machine_at_486sp3c_init(const machine_t *);
|
||||
extern int machine_at_486sp3g_init(const machine_t *);
|
||||
extern int machine_at_486ap4_init(const machine_t *);
|
||||
extern int machine_at_g486vpa_init(const machine_t *);
|
||||
extern int machine_at_486vipio2_init(const machine_t *);
|
||||
extern int machine_at_abpb4_init(const machine_t *);
|
||||
extern int machine_at_win486pci_init(const machine_t *);
|
||||
extern int machine_at_ms4145_init(const machine_t *);
|
||||
extern int machine_at_sbc490_init(const machine_t *);
|
||||
extern int machine_at_tf486_init(const machine_t *);
|
||||
extern int machine_at_r418_init(const machine_t *);
|
||||
extern int machine_at_ls486e_init(const machine_t *);
|
||||
extern int machine_at_4dps_init(const machine_t *);
|
||||
extern int machine_at_4saw2_init(const machine_t *);
|
||||
extern int machine_at_m4li_init(const machine_t *);
|
||||
extern int machine_at_alfredo_init(const machine_t *);
|
||||
extern int machine_at_ninja_init(const machine_t *);
|
||||
extern int machine_at_486sp3_init(const machine_t *);
|
||||
extern int machine_at_486sp3c_init(const machine_t *);
|
||||
extern int machine_at_486sp3g_init(const machine_t *);
|
||||
extern int machine_at_486ap4_init(const machine_t *);
|
||||
extern int machine_at_g486vpa_init(const machine_t *);
|
||||
extern int machine_at_486vipio2_init(const machine_t *);
|
||||
extern int machine_at_abpb4_init(const machine_t *);
|
||||
extern int machine_at_win486pci_init(const machine_t *);
|
||||
extern int machine_at_ms4145_init(const machine_t *);
|
||||
extern int machine_at_sbc490_init(const machine_t *);
|
||||
extern int machine_at_tf486_init(const machine_t *);
|
||||
|
||||
extern int machine_at_pci400cb_init(const machine_t *);
|
||||
extern int machine_at_g486ip_init(const machine_t *);
|
||||
extern int machine_at_pci400cb_init(const machine_t *);
|
||||
extern int machine_at_g486ip_init(const machine_t *);
|
||||
|
||||
extern int machine_at_itoxstar_init(const machine_t *);
|
||||
extern int machine_at_arb1423c_init(const machine_t *);
|
||||
extern int machine_at_arb1479_init(const machine_t *);
|
||||
extern int machine_at_pcm9340_init(const machine_t *);
|
||||
extern int machine_at_pcm5330_init(const machine_t *);
|
||||
extern int machine_at_itoxstar_init(const machine_t *);
|
||||
extern int machine_at_arb1423c_init(const machine_t *);
|
||||
extern int machine_at_arb1479_init(const machine_t *);
|
||||
extern int machine_at_pcm9340_init(const machine_t *);
|
||||
extern int machine_at_pcm5330_init(const machine_t *);
|
||||
|
||||
extern int machine_at_ecs486_init(const machine_t *);
|
||||
extern int machine_at_hot433_init(const machine_t *);
|
||||
extern int machine_at_atc1415_init(const machine_t *);
|
||||
extern int machine_at_actionpc2600_init(const machine_t *);
|
||||
extern int machine_at_m919_init(const machine_t *);
|
||||
extern int machine_at_spc7700plw_init(const machine_t *);
|
||||
extern int machine_at_ecs486_init(const machine_t *);
|
||||
extern int machine_at_hot433_init(const machine_t *);
|
||||
extern int machine_at_atc1415_init(const machine_t *);
|
||||
extern int machine_at_actionpc2600_init(const machine_t *);
|
||||
extern int machine_at_m919_init(const machine_t *);
|
||||
extern int machine_at_spc7700plw_init(const machine_t *);
|
||||
|
||||
/* m_at_commodore.c */
|
||||
extern int machine_at_cmdpc_init(const machine_t *);
|
||||
extern int machine_at_cmdpc_init(const machine_t *);
|
||||
|
||||
/* m_at_compaq.c */
|
||||
extern int machine_at_portableii_init(const machine_t *);
|
||||
extern int machine_at_portableiii_init(const machine_t *);
|
||||
extern int machine_at_portableiii386_init(const machine_t *);
|
||||
extern int machine_at_portableii_init(const machine_t *);
|
||||
extern int machine_at_portableiii_init(const machine_t *);
|
||||
extern int machine_at_portableiii386_init(const machine_t *);
|
||||
#if defined(DEV_BRANCH) && defined(USE_DESKPRO386)
|
||||
extern int machine_at_deskpro386_init(const machine_t *);
|
||||
extern int machine_at_deskpro386_init(const machine_t *);
|
||||
#endif
|
||||
|
||||
/* m_at_socket4.c */
|
||||
extern void machine_at_premiere_common_init(const machine_t *, int);
|
||||
extern void machine_at_award_common_init(const machine_t *);
|
||||
extern void machine_at_premiere_common_init(const machine_t *, int);
|
||||
extern void machine_at_award_common_init(const machine_t *);
|
||||
|
||||
extern void machine_at_sp4_common_init(const machine_t *model);
|
||||
extern void machine_at_sp4_common_init(const machine_t *model);
|
||||
|
||||
extern int machine_at_excaliburpci_init(const machine_t *);
|
||||
extern int machine_at_p5mp3_init(const machine_t *);
|
||||
extern int machine_at_dellxp60_init(const machine_t *);
|
||||
extern int machine_at_opti560l_init(const machine_t *);
|
||||
extern int machine_at_ambradp60_init(const machine_t *);
|
||||
extern int machine_at_valuepointp60_init(const machine_t *);
|
||||
extern int machine_at_revenge_init(const machine_t *);
|
||||
extern int machine_at_586mc1_init(const machine_t *);
|
||||
extern int machine_at_pb520r_init(const machine_t *);
|
||||
extern int machine_at_excaliburpci_init(const machine_t *);
|
||||
extern int machine_at_p5mp3_init(const machine_t *);
|
||||
extern int machine_at_dellxp60_init(const machine_t *);
|
||||
extern int machine_at_opti560l_init(const machine_t *);
|
||||
extern int machine_at_ambradp60_init(const machine_t *);
|
||||
extern int machine_at_valuepointp60_init(const machine_t *);
|
||||
extern int machine_at_revenge_init(const machine_t *);
|
||||
extern int machine_at_586mc1_init(const machine_t *);
|
||||
extern int machine_at_pb520r_init(const machine_t *);
|
||||
|
||||
extern int machine_at_excalibur_init(const machine_t *);
|
||||
extern int machine_at_excalibur_init(const machine_t *);
|
||||
|
||||
extern int machine_at_p5vl_init(const machine_t *);
|
||||
extern int machine_at_p5vl_init(const machine_t *);
|
||||
|
||||
extern int machine_at_excaliburpci2_init(const machine_t *);
|
||||
extern int machine_at_p5sp4_init(const machine_t *);
|
||||
extern int machine_at_excaliburpci2_init(const machine_t *);
|
||||
extern int machine_at_p5sp4_init(const machine_t *);
|
||||
|
||||
/* m_at_socket5.c */
|
||||
extern int machine_at_plato_init(const machine_t *);
|
||||
extern int machine_at_ambradp90_init(const machine_t *);
|
||||
extern int machine_at_430nx_init(const machine_t *);
|
||||
extern int machine_at_plato_init(const machine_t *);
|
||||
extern int machine_at_ambradp90_init(const machine_t *);
|
||||
extern int machine_at_430nx_init(const machine_t *);
|
||||
|
||||
extern int machine_at_acerv30_init(const machine_t *);
|
||||
extern int machine_at_apollo_init(const machine_t *);
|
||||
extern int machine_at_exp8551_init(const machine_t *);
|
||||
extern int machine_at_zappa_init(const machine_t *);
|
||||
extern int machine_at_powermatev_init(const machine_t *);
|
||||
extern int machine_at_mb500n_init(const machine_t *);
|
||||
extern int machine_at_hawk_init(const machine_t *);
|
||||
extern int machine_at_acerv30_init(const machine_t *);
|
||||
extern int machine_at_apollo_init(const machine_t *);
|
||||
extern int machine_at_exp8551_init(const machine_t *);
|
||||
extern int machine_at_zappa_init(const machine_t *);
|
||||
extern int machine_at_powermatev_init(const machine_t *);
|
||||
extern int machine_at_mb500n_init(const machine_t *);
|
||||
extern int machine_at_hawk_init(const machine_t *);
|
||||
|
||||
extern int machine_at_pat54pv_init(const machine_t *);
|
||||
extern int machine_at_pat54pv_init(const machine_t *);
|
||||
|
||||
extern int machine_at_hot543_init(const machine_t *);
|
||||
|
||||
extern int machine_at_p54sp4_init(const machine_t *);
|
||||
extern int machine_at_sq588_init(const machine_t *);
|
||||
extern int machine_at_hot543_init(const machine_t *);
|
||||
|
||||
extern int machine_at_p54sp4_init(const machine_t *);
|
||||
extern int machine_at_sq588_init(const machine_t *);
|
||||
|
||||
/* m_at_socket7_3v.c */
|
||||
extern int machine_at_p54tp4xe_init(const machine_t *);
|
||||
extern int machine_at_p54tp4xe_mr_init(const machine_t *);
|
||||
extern int machine_at_gw2katx_init(const machine_t *);
|
||||
extern int machine_at_thor_init(const machine_t *);
|
||||
extern int machine_at_mrthor_init(const machine_t *);
|
||||
extern int machine_at_endeavor_init(const machine_t *);
|
||||
extern int machine_at_ms5119_init(const machine_t *);
|
||||
extern int machine_at_pb640_init(const machine_t *);
|
||||
extern int machine_at_fmb_init(const machine_t *);
|
||||
extern int machine_at_p54tp4xe_init(const machine_t *);
|
||||
extern int machine_at_p54tp4xe_mr_init(const machine_t *);
|
||||
extern int machine_at_gw2katx_init(const machine_t *);
|
||||
extern int machine_at_thor_init(const machine_t *);
|
||||
extern int machine_at_mrthor_init(const machine_t *);
|
||||
extern int machine_at_endeavor_init(const machine_t *);
|
||||
extern int machine_at_ms5119_init(const machine_t *);
|
||||
extern int machine_at_pb640_init(const machine_t *);
|
||||
extern int machine_at_fmb_init(const machine_t *);
|
||||
|
||||
extern int machine_at_acerm3a_init(const machine_t *);
|
||||
extern int machine_at_ap53_init(const machine_t *);
|
||||
extern int machine_at_8500tuc_init(const machine_t *);
|
||||
extern int machine_at_p55t2s_init(const machine_t *);
|
||||
extern int machine_at_acerm3a_init(const machine_t *);
|
||||
extern int machine_at_ap53_init(const machine_t *);
|
||||
extern int machine_at_8500tuc_init(const machine_t *);
|
||||
extern int machine_at_p55t2s_init(const machine_t *);
|
||||
|
||||
extern int machine_at_p5vxb_init(const machine_t *);
|
||||
extern int machine_at_gw2kte_init(const machine_t *);
|
||||
extern int machine_at_p5vxb_init(const machine_t *);
|
||||
extern int machine_at_gw2kte_init(const machine_t *);
|
||||
|
||||
extern int machine_at_ap5s_init(const machine_t *);
|
||||
extern int machine_at_vectra54_init(const machine_t *);
|
||||
extern int machine_at_ap5s_init(const machine_t *);
|
||||
extern int machine_at_vectra54_init(const machine_t *);
|
||||
|
||||
/* m_at_socket7.c */
|
||||
extern int machine_at_acerv35n_init(const machine_t *);
|
||||
extern int machine_at_p55t2p4_init(const machine_t *);
|
||||
extern int machine_at_m7shi_init(const machine_t *);
|
||||
extern int machine_at_tc430hx_init(const machine_t *);
|
||||
extern int machine_at_equium5200_init(const machine_t *);
|
||||
extern int machine_at_pcv90_init(const machine_t *);
|
||||
extern int machine_at_p65up5_cp55t2d_init(const machine_t *);
|
||||
extern int machine_at_acerv35n_init(const machine_t *);
|
||||
extern int machine_at_p55t2p4_init(const machine_t *);
|
||||
extern int machine_at_m7shi_init(const machine_t *);
|
||||
extern int machine_at_tc430hx_init(const machine_t *);
|
||||
extern int machine_at_equium5200_init(const machine_t *);
|
||||
extern int machine_at_pcv90_init(const machine_t *);
|
||||
extern int machine_at_p65up5_cp55t2d_init(const machine_t *);
|
||||
|
||||
extern int machine_at_ap5vm_init(const machine_t *);
|
||||
extern int machine_at_p55tvp4_init(const machine_t *);
|
||||
extern int machine_at_5ivg_init(const machine_t *);
|
||||
extern int machine_at_8500tvxa_init(const machine_t *);
|
||||
extern int machine_at_presario2240_init(const machine_t *);
|
||||
extern int machine_at_presario4500_init(const machine_t *);
|
||||
extern int machine_at_p55va_init(const machine_t *);
|
||||
extern int machine_at_brio80xx_init(const machine_t *);
|
||||
extern int machine_at_pb680_init(const machine_t *);
|
||||
extern int machine_at_mb520n_init(const machine_t *);
|
||||
extern int machine_at_i430vx_init(const machine_t *);
|
||||
extern int machine_at_ap5vm_init(const machine_t *);
|
||||
extern int machine_at_p55tvp4_init(const machine_t *);
|
||||
extern int machine_at_5ivg_init(const machine_t *);
|
||||
extern int machine_at_8500tvxa_init(const machine_t *);
|
||||
extern int machine_at_presario2240_init(const machine_t *);
|
||||
extern int machine_at_presario4500_init(const machine_t *);
|
||||
extern int machine_at_p55va_init(const machine_t *);
|
||||
extern int machine_at_brio80xx_init(const machine_t *);
|
||||
extern int machine_at_pb680_init(const machine_t *);
|
||||
extern int machine_at_mb520n_init(const machine_t *);
|
||||
extern int machine_at_i430vx_init(const machine_t *);
|
||||
|
||||
extern int machine_at_nupro592_init(const machine_t *);
|
||||
extern int machine_at_tx97_init(const machine_t *);
|
||||
extern int machine_at_nupro592_init(const machine_t *);
|
||||
extern int machine_at_tx97_init(const machine_t *);
|
||||
#if defined(DEV_BRANCH) && defined(USE_AN430TX)
|
||||
extern int machine_at_an430tx_init(const machine_t *);
|
||||
extern int machine_at_an430tx_init(const machine_t *);
|
||||
#endif
|
||||
extern int machine_at_ym430tx_init(const machine_t *);
|
||||
extern int machine_at_mb540n_init(const machine_t *);
|
||||
extern int machine_at_56a5_init(const machine_t *);
|
||||
extern int machine_at_p5mms98_init(const machine_t *);
|
||||
extern int machine_at_ym430tx_init(const machine_t *);
|
||||
extern int machine_at_mb540n_init(const machine_t *);
|
||||
extern int machine_at_56a5_init(const machine_t *);
|
||||
extern int machine_at_p5mms98_init(const machine_t *);
|
||||
|
||||
extern int machine_at_ficva502_init(const machine_t *);
|
||||
extern int machine_at_ficva502_init(const machine_t *);
|
||||
|
||||
extern int machine_at_ficpa2012_init(const machine_t *);
|
||||
extern int machine_at_ficpa2012_init(const machine_t *);
|
||||
|
||||
extern int machine_at_r534f_init(const machine_t *);
|
||||
extern int machine_at_ms5146_init(const machine_t *);
|
||||
extern int machine_at_r534f_init(const machine_t *);
|
||||
extern int machine_at_ms5146_init(const machine_t *);
|
||||
|
||||
extern int machine_at_m560_init(const machine_t *);
|
||||
extern int machine_at_ms5164_init(const machine_t *);
|
||||
extern int machine_at_m560_init(const machine_t *);
|
||||
extern int machine_at_ms5164_init(const machine_t *);
|
||||
|
||||
/* m_at_sockets7.c */
|
||||
extern int machine_at_p5a_init(const machine_t *);
|
||||
extern int machine_at_m579_init(const machine_t *);
|
||||
extern int machine_at_5aa_init(const machine_t *);
|
||||
extern int machine_at_5ax_init(const machine_t *);
|
||||
extern int machine_at_p5a_init(const machine_t *);
|
||||
extern int machine_at_m579_init(const machine_t *);
|
||||
extern int machine_at_5aa_init(const machine_t *);
|
||||
extern int machine_at_5ax_init(const machine_t *);
|
||||
|
||||
extern int machine_at_ax59pro_init(const machine_t *);
|
||||
extern int machine_at_mvp3_init(const machine_t *);
|
||||
extern int machine_at_ficva503a_init(const machine_t *);
|
||||
extern int machine_at_5emapro_init(const machine_t *);
|
||||
extern int machine_at_ax59pro_init(const machine_t *);
|
||||
extern int machine_at_mvp3_init(const machine_t *);
|
||||
extern int machine_at_ficva503a_init(const machine_t *);
|
||||
extern int machine_at_5emapro_init(const machine_t *);
|
||||
|
||||
/* m_at_socket8.c */
|
||||
extern int machine_at_p6rp4_init(const machine_t *);
|
||||
extern int machine_at_aurora_init(const machine_t *);
|
||||
extern int machine_at_p6rp4_init(const machine_t *);
|
||||
extern int machine_at_aurora_init(const machine_t *);
|
||||
|
||||
extern int machine_at_686nx_init(const machine_t *);
|
||||
extern int machine_at_acerv60n_init(const machine_t *);
|
||||
extern int machine_at_vs440fx_init(const machine_t *);
|
||||
extern int machine_at_ap440fx_init(const machine_t *);
|
||||
extern int machine_at_mb600n_init(const machine_t *);
|
||||
extern int machine_at_8600ttc_init(const machine_t *);
|
||||
extern int machine_at_m6mi_init(const machine_t *);
|
||||
extern int machine_at_686nx_init(const machine_t *);
|
||||
extern int machine_at_acerv60n_init(const machine_t *);
|
||||
extern int machine_at_vs440fx_init(const machine_t *);
|
||||
extern int machine_at_ap440fx_init(const machine_t *);
|
||||
extern int machine_at_mb600n_init(const machine_t *);
|
||||
extern int machine_at_8600ttc_init(const machine_t *);
|
||||
extern int machine_at_m6mi_init(const machine_t *);
|
||||
#ifdef EMU_DEVICE_H
|
||||
extern void machine_at_p65up5_common_init(const machine_t *, const device_t *northbridge);
|
||||
extern void machine_at_p65up5_common_init(const machine_t *, const device_t *northbridge);
|
||||
#endif
|
||||
extern int machine_at_p65up5_cp6nd_init(const machine_t *);
|
||||
extern int machine_at_p65up5_cp6nd_init(const machine_t *);
|
||||
|
||||
/* m_at_slot1.c */
|
||||
extern int machine_at_m729_init(const machine_t *);
|
||||
extern int machine_at_m729_init(const machine_t *);
|
||||
|
||||
extern int machine_at_p65up5_cpknd_init(const machine_t *);
|
||||
extern int machine_at_kn97_init(const machine_t *);
|
||||
extern int machine_at_p65up5_cpknd_init(const machine_t *);
|
||||
extern int machine_at_kn97_init(const machine_t *);
|
||||
|
||||
extern int machine_at_lx6_init(const machine_t *);
|
||||
extern int machine_at_spitfire_init(const machine_t *);
|
||||
extern int machine_at_lx6_init(const machine_t *);
|
||||
extern int machine_at_spitfire_init(const machine_t *);
|
||||
|
||||
extern int machine_at_p6i440e2_init(const machine_t *);
|
||||
extern int machine_at_p6i440e2_init(const machine_t *);
|
||||
|
||||
extern int machine_at_p2bls_init(const machine_t *);
|
||||
extern int machine_at_p3bf_init(const machine_t *);
|
||||
extern int machine_at_bf6_init(const machine_t *);
|
||||
extern int machine_at_ax6bc_init(const machine_t *);
|
||||
extern int machine_at_atc6310bxii_init(const machine_t *);
|
||||
extern int machine_at_686bx_init(const machine_t *);
|
||||
extern int machine_at_s1846_init(const machine_t *);
|
||||
extern int machine_at_p6sba_init(const machine_t *);
|
||||
extern int machine_at_ficka6130_init(const machine_t *);
|
||||
extern int machine_at_p3v133_init(const machine_t *);
|
||||
extern int machine_at_p3v4x_init(const machine_t *);
|
||||
extern int machine_at_p2bls_init(const machine_t *);
|
||||
extern int machine_at_p3bf_init(const machine_t *);
|
||||
extern int machine_at_bf6_init(const machine_t *);
|
||||
extern int machine_at_ax6bc_init(const machine_t *);
|
||||
extern int machine_at_atc6310bxii_init(const machine_t *);
|
||||
extern int machine_at_686bx_init(const machine_t *);
|
||||
extern int machine_at_s1846_init(const machine_t *);
|
||||
extern int machine_at_p6sba_init(const machine_t *);
|
||||
extern int machine_at_ficka6130_init(const machine_t *);
|
||||
extern int machine_at_p3v133_init(const machine_t *);
|
||||
extern int machine_at_p3v4x_init(const machine_t *);
|
||||
|
||||
extern int machine_at_vei8_init(const machine_t *);
|
||||
extern int machine_at_vei8_init(const machine_t *);
|
||||
|
||||
extern int machine_at_borapro_init(const machine_t *);
|
||||
extern int machine_at_ms6168_init(const machine_t *);
|
||||
extern int machine_at_borapro_init(const machine_t *);
|
||||
extern int machine_at_ms6168_init(const machine_t *);
|
||||
|
||||
/* m_at_slot2.c */
|
||||
extern int machine_at_6gxu_init(const machine_t *);
|
||||
extern int machine_at_s2dge_init(const machine_t *);
|
||||
extern int machine_at_fw6400gx_init(const machine_t *);
|
||||
extern int machine_at_6gxu_init(const machine_t *);
|
||||
extern int machine_at_s2dge_init(const machine_t *);
|
||||
extern int machine_at_fw6400gx_init(const machine_t *);
|
||||
|
||||
/* m_at_socket370.c */
|
||||
extern int machine_at_s370slm_init(const machine_t *);
|
||||
extern int machine_at_s370slm_init(const machine_t *);
|
||||
|
||||
extern int machine_at_cubx_init(const machine_t *);
|
||||
extern int machine_at_atc7020bxii_init(const machine_t *);
|
||||
extern int machine_at_ambx133_init(const machine_t *);
|
||||
extern int machine_at_awo671r_init(const machine_t *);
|
||||
extern int machine_at_63a1_init(const machine_t *);
|
||||
extern int machine_at_s370sba_init(const machine_t *);
|
||||
extern int machine_at_apas3_init(const machine_t *);
|
||||
extern int machine_at_gt694va_init(const machine_t *);
|
||||
extern int machine_at_cuv4xls_init(const machine_t *);
|
||||
extern int machine_at_6via90ap_init(const machine_t *);
|
||||
extern int machine_at_s1857_init(const machine_t *);
|
||||
extern int machine_at_p6bap_init(const machine_t *);
|
||||
extern int machine_at_cubx_init(const machine_t *);
|
||||
extern int machine_at_atc7020bxii_init(const machine_t *);
|
||||
extern int machine_at_ambx133_init(const machine_t *);
|
||||
extern int machine_at_awo671r_init(const machine_t *);
|
||||
extern int machine_at_63a1_init(const machine_t *);
|
||||
extern int machine_at_s370sba_init(const machine_t *);
|
||||
extern int machine_at_apas3_init(const machine_t *);
|
||||
extern int machine_at_gt694va_init(const machine_t *);
|
||||
extern int machine_at_cuv4xls_init(const machine_t *);
|
||||
extern int machine_at_6via90ap_init(const machine_t *);
|
||||
extern int machine_at_s1857_init(const machine_t *);
|
||||
extern int machine_at_p6bap_init(const machine_t *);
|
||||
|
||||
/* m_at_misc.c */
|
||||
extern int machine_at_vpc2007_init(const machine_t *);
|
||||
extern int machine_at_vpc2007_init(const machine_t *);
|
||||
|
||||
/* m_at_t3100e.c */
|
||||
extern int machine_at_t3100e_init(const machine_t *);
|
||||
extern int machine_at_t3100e_init(const machine_t *);
|
||||
|
||||
/* m_europc.c */
|
||||
extern int machine_europc_init(const machine_t *);
|
||||
extern int machine_europc_init(const machine_t *);
|
||||
#ifdef EMU_DEVICE_H
|
||||
extern const device_t europc_device;
|
||||
#endif
|
||||
|
||||
/* m_xt_olivetti.c */
|
||||
extern int machine_xt_m24_init(const machine_t *);
|
||||
extern int machine_xt_m240_init(const machine_t *);
|
||||
extern int machine_xt_m19_init(const machine_t *);
|
||||
extern int machine_xt_m24_init(const machine_t *);
|
||||
extern int machine_xt_m240_init(const machine_t *);
|
||||
extern int machine_xt_m19_init(const machine_t *);
|
||||
|
||||
/* m_pcjr.c */
|
||||
extern int machine_pcjr_init(const machine_t *);
|
||||
extern int machine_pcjr_init(const machine_t *);
|
||||
|
||||
/* m_ps1.c */
|
||||
extern int machine_ps1_m2011_init(const machine_t *);
|
||||
extern int machine_ps1_m2121_init(const machine_t *);
|
||||
extern int machine_ps1_m2011_init(const machine_t *);
|
||||
extern int machine_ps1_m2121_init(const machine_t *);
|
||||
|
||||
/* m_ps1_hdc.c */
|
||||
#ifdef EMU_DEVICE_H
|
||||
extern void ps1_hdc_inform(void *, uint8_t *);
|
||||
extern void ps1_hdc_inform(void *, uint8_t *);
|
||||
extern const device_t ps1_hdc_device;
|
||||
#endif
|
||||
|
||||
/* m_ps2_isa.c */
|
||||
extern int machine_ps2_m30_286_init(const machine_t *);
|
||||
extern int machine_ps2_m30_286_init(const machine_t *);
|
||||
|
||||
/* m_ps2_mca.c */
|
||||
extern int machine_ps2_model_50_init(const machine_t *);
|
||||
extern int machine_ps2_model_60_init(const machine_t *);
|
||||
extern int machine_ps2_model_55sx_init(const machine_t *);
|
||||
extern int machine_ps2_model_65sx_init(const machine_t *);
|
||||
extern int machine_ps2_model_70_type3_init(const machine_t *);
|
||||
extern int machine_ps2_model_80_init(const machine_t *);
|
||||
extern int machine_ps2_model_80_axx_init(const machine_t *);
|
||||
extern int machine_ps2_model_50_init(const machine_t *);
|
||||
extern int machine_ps2_model_60_init(const machine_t *);
|
||||
extern int machine_ps2_model_55sx_init(const machine_t *);
|
||||
extern int machine_ps2_model_65sx_init(const machine_t *);
|
||||
extern int machine_ps2_model_70_type3_init(const machine_t *);
|
||||
extern int machine_ps2_model_80_init(const machine_t *);
|
||||
extern int machine_ps2_model_80_axx_init(const machine_t *);
|
||||
|
||||
/* m_tandy.c */
|
||||
extern int tandy1k_eeprom_read(void);
|
||||
extern int machine_tandy_init(const machine_t *);
|
||||
extern int machine_tandy1000hx_init(const machine_t *);
|
||||
extern int machine_tandy1000sl2_init(const machine_t *);
|
||||
extern int tandy1k_eeprom_read(void);
|
||||
extern int machine_tandy_init(const machine_t *);
|
||||
extern int machine_tandy1000hx_init(const machine_t *);
|
||||
extern int machine_tandy1000sl2_init(const machine_t *);
|
||||
|
||||
/* m_v86p.c */
|
||||
extern int machine_v86p_init(const machine_t *);
|
||||
extern int machine_v86p_init(const machine_t *);
|
||||
|
||||
/* m_xt.c */
|
||||
extern int machine_pc_init(const machine_t *);
|
||||
extern int machine_pc82_init(const machine_t *);
|
||||
extern int machine_pc_init(const machine_t *);
|
||||
extern int machine_pc82_init(const machine_t *);
|
||||
|
||||
extern int machine_xt_init(const machine_t *);
|
||||
extern int machine_genxt_init(const machine_t *);
|
||||
extern int machine_xt_init(const machine_t *);
|
||||
extern int machine_genxt_init(const machine_t *);
|
||||
|
||||
extern int machine_xt86_init(const machine_t *);
|
||||
extern int machine_xt86_init(const machine_t *);
|
||||
|
||||
extern int machine_xt_americxt_init(const machine_t *);
|
||||
extern int machine_xt_amixt_init(const machine_t *);
|
||||
extern int machine_xt_dtk_init(const machine_t *);
|
||||
extern int machine_xt_jukopc_init(const machine_t *);
|
||||
extern int machine_xt_openxt_init(const machine_t *);
|
||||
extern int machine_xt_pcxt_init(const machine_t *);
|
||||
extern int machine_xt_pxxt_init(const machine_t *);
|
||||
extern int machine_xt_pc4i_init(const machine_t *);
|
||||
extern int machine_xt_mpc1600_init(const machine_t *);
|
||||
extern int machine_xt_pcspirit_init(const machine_t *);
|
||||
extern int machine_xt_pc700_init(const machine_t *);
|
||||
extern int machine_xt_pc500_init(const machine_t *);
|
||||
extern int machine_xt_vendex_init(const machine_t *);
|
||||
extern int machine_xt_znic_init(const machine_t *);
|
||||
extern int machine_xt_super16t_init(const machine_t *);
|
||||
extern int machine_xt_super16te_init(const machine_t *);
|
||||
extern int machine_xt_top88_init(const machine_t *);
|
||||
extern int machine_xt_kaypropc_init(const machine_t *);
|
||||
extern int machine_xt_sansx16_init(const machine_t *);
|
||||
extern int machine_xt_bw230_init(const machine_t *);
|
||||
extern int machine_xt_americxt_init(const machine_t *);
|
||||
extern int machine_xt_amixt_init(const machine_t *);
|
||||
extern int machine_xt_dtk_init(const machine_t *);
|
||||
extern int machine_xt_jukopc_init(const machine_t *);
|
||||
extern int machine_xt_openxt_init(const machine_t *);
|
||||
extern int machine_xt_pcxt_init(const machine_t *);
|
||||
extern int machine_xt_pxxt_init(const machine_t *);
|
||||
extern int machine_xt_pc4i_init(const machine_t *);
|
||||
extern int machine_xt_mpc1600_init(const machine_t *);
|
||||
extern int machine_xt_pcspirit_init(const machine_t *);
|
||||
extern int machine_xt_pc700_init(const machine_t *);
|
||||
extern int machine_xt_pc500_init(const machine_t *);
|
||||
extern int machine_xt_vendex_init(const machine_t *);
|
||||
extern int machine_xt_znic_init(const machine_t *);
|
||||
extern int machine_xt_super16t_init(const machine_t *);
|
||||
extern int machine_xt_super16te_init(const machine_t *);
|
||||
extern int machine_xt_top88_init(const machine_t *);
|
||||
extern int machine_xt_kaypropc_init(const machine_t *);
|
||||
extern int machine_xt_sansx16_init(const machine_t *);
|
||||
extern int machine_xt_bw230_init(const machine_t *);
|
||||
|
||||
extern int machine_xt_iskra3104_init(const machine_t *);
|
||||
extern int machine_xt_iskra3104_init(const machine_t *);
|
||||
|
||||
/* m_xt_compaq.c */
|
||||
extern int machine_xt_compaq_deskpro_init(const machine_t *);
|
||||
extern int machine_xt_compaq_portable_init(const machine_t *);
|
||||
extern int machine_xt_compaq_deskpro_init(const machine_t *);
|
||||
extern int machine_xt_compaq_portable_init(const machine_t *);
|
||||
|
||||
/* m_xt_laserxt.c */
|
||||
#if defined(DEV_BRANCH) && defined(USE_LASERXT)
|
||||
extern int machine_xt_laserxt_init(const machine_t *);
|
||||
extern int machine_xt_lxt3_init(const machine_t *);
|
||||
extern int machine_xt_laserxt_init(const machine_t *);
|
||||
extern int machine_xt_lxt3_init(const machine_t *);
|
||||
#endif
|
||||
|
||||
/* m_xt_philips.c */
|
||||
extern int machine_xt_p3105_init(const machine_t *);
|
||||
extern int machine_xt_p3120_init(const machine_t *);
|
||||
extern int machine_xt_p3105_init(const machine_t *);
|
||||
extern int machine_xt_p3120_init(const machine_t *);
|
||||
/* m_xt_t1000.c */
|
||||
extern int machine_xt_t1000_init(const machine_t *);
|
||||
extern int machine_xt_t1200_init(const machine_t *);
|
||||
|
||||
extern int machine_xt_t1000_init(const machine_t *);
|
||||
extern int machine_xt_t1200_init(const machine_t *);
|
||||
|
||||
/* m_xt_zenith.c */
|
||||
extern int machine_xt_z184_init(const machine_t *);
|
||||
extern int machine_xt_z151_init(const machine_t *);
|
||||
extern int machine_xt_z159_init(const machine_t *);
|
||||
extern int machine_xt_z184_init(const machine_t *);
|
||||
extern int machine_xt_z151_init(const machine_t *);
|
||||
extern int machine_xt_z159_init(const machine_t *);
|
||||
|
||||
/* m_xt_xi8088.c */
|
||||
extern int machine_xt_xi8088_init(const machine_t *);
|
||||
extern int machine_xt_xi8088_init(const machine_t *);
|
||||
|
||||
#endif /*EMU_MACHINE_H*/
|
||||
#endif /*EMU_MACHINE_H*/
|
||||
|
||||
@@ -18,75 +18,71 @@
|
||||
*/
|
||||
|
||||
#ifndef EMU_MOUSE_H
|
||||
# define EMU_MOUSE_H
|
||||
#define EMU_MOUSE_H
|
||||
|
||||
#define MOUSE_TYPE_NONE 0 /* no mouse configured */
|
||||
#define MOUSE_TYPE_INTERNAL 1 /* machine has internal mouse */
|
||||
#define MOUSE_TYPE_LOGIBUS 2 /* Logitech/ATI Bus Mouse */
|
||||
#define MOUSE_TYPE_INPORT 3 /* Microsoft InPort Mouse */
|
||||
#define MOUSE_TYPE_NONE 0 /* no mouse configured */
|
||||
#define MOUSE_TYPE_INTERNAL 1 /* machine has internal mouse */
|
||||
#define MOUSE_TYPE_LOGIBUS 2 /* Logitech/ATI Bus Mouse */
|
||||
#define MOUSE_TYPE_INPORT 3 /* Microsoft InPort Mouse */
|
||||
#if 0
|
||||
# define MOUSE_TYPE_GENIBUS 4 /* Genius Bus Mouse */
|
||||
# define MOUSE_TYPE_GENIBUS 4 /* Genius Bus Mouse */
|
||||
#endif
|
||||
#define MOUSE_TYPE_MSYSTEMS 5 /* Mouse Systems mouse */
|
||||
#define MOUSE_TYPE_MICROSOFT 6 /* Microsoft 2-button Serial Mouse */
|
||||
#define MOUSE_TYPE_MS3BUTTON 7 /* Microsoft 3-button Serial Mouse */
|
||||
#define MOUSE_TYPE_MSWHEEL 8 /* Microsoft Serial Wheel Mouse */
|
||||
#define MOUSE_TYPE_LOGITECH 9 /* Logitech 2-button Serial Mouse */
|
||||
#define MOUSE_TYPE_LT3BUTTON 10 /* Logitech 3-button Serial Mouse */
|
||||
#define MOUSE_TYPE_PS2 11 /* PS/2 series Bus Mouse */
|
||||
|
||||
#define MOUSE_TYPE_ONBOARD 0x80 /* Mouse is an on-board version of one of the above. */
|
||||
#define MOUSE_TYPE_MSYSTEMS 5 /* Mouse Systems mouse */
|
||||
#define MOUSE_TYPE_MICROSOFT 6 /* Microsoft 2-button Serial Mouse */
|
||||
#define MOUSE_TYPE_MS3BUTTON 7 /* Microsoft 3-button Serial Mouse */
|
||||
#define MOUSE_TYPE_MSWHEEL 8 /* Microsoft Serial Wheel Mouse */
|
||||
#define MOUSE_TYPE_LOGITECH 9 /* Logitech 2-button Serial Mouse */
|
||||
#define MOUSE_TYPE_LT3BUTTON 10 /* Logitech 3-button Serial Mouse */
|
||||
#define MOUSE_TYPE_PS2 11 /* PS/2 series Bus Mouse */
|
||||
|
||||
#define MOUSE_TYPE_ONBOARD 0x80 /* Mouse is an on-board version of one of the above. */
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
extern int mouse_type;
|
||||
extern int mouse_x, mouse_y, mouse_z;
|
||||
extern int mouse_buttons;
|
||||
|
||||
extern int mouse_type;
|
||||
extern int mouse_x, mouse_y, mouse_z;
|
||||
extern int mouse_buttons;
|
||||
|
||||
#ifdef EMU_DEVICE_H
|
||||
extern const device_t *mouse_get_device(int mouse);
|
||||
extern void *mouse_ps2_init(const device_t *);
|
||||
extern const device_t *mouse_get_device(int mouse);
|
||||
extern void *mouse_ps2_init(const device_t *);
|
||||
|
||||
extern const device_t mouse_logibus_device;
|
||||
extern const device_t mouse_logibus_onboard_device;
|
||||
extern const device_t mouse_msinport_device;
|
||||
#if 0
|
||||
extern const device_t mouse_logibus_device;
|
||||
extern const device_t mouse_logibus_onboard_device;
|
||||
extern const device_t mouse_msinport_device;
|
||||
# if 0
|
||||
extern const device_t mouse_genibus_device;
|
||||
#endif
|
||||
extern const device_t mouse_mssystems_device;
|
||||
extern const device_t mouse_msserial_device;
|
||||
extern const device_t mouse_ltserial_device;
|
||||
extern const device_t mouse_ps2_device;
|
||||
# endif
|
||||
extern const device_t mouse_mssystems_device;
|
||||
extern const device_t mouse_msserial_device;
|
||||
extern const device_t mouse_ltserial_device;
|
||||
extern const device_t mouse_ps2_device;
|
||||
#endif
|
||||
|
||||
extern void mouse_init(void);
|
||||
extern void mouse_close(void);
|
||||
extern void mouse_reset(void);
|
||||
extern void mouse_set_buttons(int buttons);
|
||||
extern void mouse_process(void);
|
||||
extern void mouse_set_poll(int (*f)(int,int,int,int,void *), void *);
|
||||
extern void mouse_poll(void);
|
||||
extern void mouse_init(void);
|
||||
extern void mouse_close(void);
|
||||
extern void mouse_reset(void);
|
||||
extern void mouse_set_buttons(int buttons);
|
||||
extern void mouse_process(void);
|
||||
extern void mouse_set_poll(int (*f)(int, int, int, int, void *), void *);
|
||||
extern void mouse_poll(void);
|
||||
|
||||
extern void mouse_bus_set_irq(void *priv, int irq);
|
||||
extern void mouse_bus_set_irq(void *priv, int irq);
|
||||
|
||||
extern char *mouse_get_name(int mouse);
|
||||
extern char *mouse_get_internal_name(int mouse);
|
||||
extern int mouse_get_from_internal_name(char *s);
|
||||
extern int mouse_has_config(int mouse);
|
||||
extern int mouse_get_type(int mouse);
|
||||
extern int mouse_get_ndev(void);
|
||||
extern int mouse_get_buttons(void);
|
||||
|
||||
extern char *mouse_get_name(int mouse);
|
||||
extern char *mouse_get_internal_name(int mouse);
|
||||
extern int mouse_get_from_internal_name(char *s);
|
||||
extern int mouse_has_config(int mouse);
|
||||
extern int mouse_get_type(int mouse);
|
||||
extern int mouse_get_ndev(void);
|
||||
extern int mouse_get_buttons(void);
|
||||
|
||||
extern void mouse_clear_data(void *priv);
|
||||
extern void mouse_clear_data(void *priv);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#endif /*EMU_MOUSE_H*/
|
||||
#endif /*EMU_MOUSE_H*/
|
||||
|
||||
@@ -21,84 +21,80 @@
|
||||
*/
|
||||
|
||||
#ifndef EMU_SERIAL_H
|
||||
# define EMU_SERIAL_H
|
||||
#define EMU_SERIAL_H
|
||||
|
||||
#define SERIAL_8250 0
|
||||
#define SERIAL_8250_PCJR 1
|
||||
#define SERIAL_16450 2
|
||||
#define SERIAL_16550 3
|
||||
#define SERIAL_16650 4
|
||||
#define SERIAL_16750 5
|
||||
#define SERIAL_16850 6
|
||||
#define SERIAL_16950 7
|
||||
#define SERIAL_8250 0
|
||||
#define SERIAL_8250_PCJR 1
|
||||
#define SERIAL_16450 2
|
||||
#define SERIAL_16550 3
|
||||
#define SERIAL_16650 4
|
||||
#define SERIAL_16750 5
|
||||
#define SERIAL_16850 6
|
||||
#define SERIAL_16950 7
|
||||
|
||||
#define SERIAL_FIFO_SIZE 16
|
||||
#define SERIAL_FIFO_SIZE 16
|
||||
|
||||
/* Default settings for the standard ports. */
|
||||
#define COM1_ADDR 0x03f8
|
||||
#define COM1_IRQ 4
|
||||
#define COM2_ADDR 0x02f8
|
||||
#define COM2_IRQ 3
|
||||
#define COM3_ADDR 0x03e8
|
||||
#define COM3_IRQ 4
|
||||
#define COM4_ADDR 0x02e8
|
||||
#define COM4_IRQ 3
|
||||
|
||||
#define COM1_ADDR 0x03f8
|
||||
#define COM1_IRQ 4
|
||||
#define COM2_ADDR 0x02f8
|
||||
#define COM2_IRQ 3
|
||||
#define COM3_ADDR 0x03e8
|
||||
#define COM3_IRQ 4
|
||||
#define COM4_ADDR 0x02e8
|
||||
#define COM4_IRQ 3
|
||||
|
||||
struct serial_device_s;
|
||||
struct serial_s;
|
||||
|
||||
typedef struct serial_s
|
||||
{
|
||||
typedef struct serial_s {
|
||||
uint8_t lsr, thr, mctrl, rcr,
|
||||
iir, ier, lcr, msr,
|
||||
dat, int_status, scratch, fcr,
|
||||
irq, type, inst, transmit_enabled,
|
||||
fifo_enabled, rcvr_fifo_len, bits, data_bits,
|
||||
baud_cycles, rcvr_fifo_full, txsr, pad;
|
||||
iir, ier, lcr, msr,
|
||||
dat, int_status, scratch, fcr,
|
||||
irq, type, inst, transmit_enabled,
|
||||
fifo_enabled, rcvr_fifo_len, bits, data_bits,
|
||||
baud_cycles, rcvr_fifo_full, txsr, pad;
|
||||
|
||||
uint16_t dlab, base_address;
|
||||
|
||||
uint8_t rcvr_fifo_pos, xmit_fifo_pos,
|
||||
pad0, pad1,
|
||||
rcvr_fifo[SERIAL_FIFO_SIZE], xmit_fifo[SERIAL_FIFO_SIZE];
|
||||
pad0, pad1,
|
||||
rcvr_fifo[SERIAL_FIFO_SIZE], xmit_fifo[SERIAL_FIFO_SIZE];
|
||||
|
||||
pc_timer_t transmit_timer, timeout_timer;
|
||||
double clock_src, transmit_period;
|
||||
double clock_src, transmit_period;
|
||||
|
||||
struct serial_device_s *sd;
|
||||
struct serial_device_s *sd;
|
||||
} serial_t;
|
||||
|
||||
typedef struct serial_device_s
|
||||
{
|
||||
typedef struct serial_device_s {
|
||||
void (*rcr_callback)(struct serial_s *serial, void *p);
|
||||
void (*dev_write)(struct serial_s *serial, void *p, uint8_t data);
|
||||
void *priv;
|
||||
void *priv;
|
||||
serial_t *serial;
|
||||
} serial_device_t;
|
||||
|
||||
extern serial_t *serial_attach(int port,
|
||||
void (*rcr_callback)(struct serial_s *serial, void *p),
|
||||
void (*dev_write)(struct serial_s *serial, void *p, uint8_t data),
|
||||
void *priv);
|
||||
extern void serial_remove(serial_t *dev);
|
||||
extern void serial_set_type(serial_t *dev, int type);
|
||||
extern void serial_setup(serial_t *dev, uint16_t addr, uint8_t irq);
|
||||
extern void serial_clear_fifo(serial_t *dev);
|
||||
extern void serial_write_fifo(serial_t *dev, uint8_t dat);
|
||||
extern void serial_set_next_inst(int ni);
|
||||
extern void serial_standalone_init(void);
|
||||
extern void serial_set_clock_src(serial_t *dev, double clock_src);
|
||||
extern void serial_reset_port(serial_t *dev);
|
||||
|
||||
extern serial_t * serial_attach(int port,
|
||||
void (*rcr_callback)(struct serial_s *serial, void *p),
|
||||
void (*dev_write)(struct serial_s *serial, void *p, uint8_t data),
|
||||
void *priv);
|
||||
extern void serial_remove(serial_t *dev);
|
||||
extern void serial_set_type(serial_t *dev, int type);
|
||||
extern void serial_setup(serial_t *dev, uint16_t addr, uint8_t irq);
|
||||
extern void serial_clear_fifo(serial_t *dev);
|
||||
extern void serial_write_fifo(serial_t *dev, uint8_t dat);
|
||||
extern void serial_set_next_inst(int ni);
|
||||
extern void serial_standalone_init(void);
|
||||
extern void serial_set_clock_src(serial_t *dev, double clock_src);
|
||||
extern void serial_reset_port(serial_t *dev);
|
||||
extern const device_t ns8250_device;
|
||||
extern const device_t ns8250_pcjr_device;
|
||||
extern const device_t ns16450_device;
|
||||
extern const device_t ns16550_device;
|
||||
extern const device_t ns16650_device;
|
||||
extern const device_t ns16750_device;
|
||||
extern const device_t ns16850_device;
|
||||
extern const device_t ns16950_device;
|
||||
|
||||
extern const device_t ns8250_device;
|
||||
extern const device_t ns8250_pcjr_device;
|
||||
extern const device_t ns16450_device;
|
||||
extern const device_t ns16550_device;
|
||||
extern const device_t ns16650_device;
|
||||
extern const device_t ns16750_device;
|
||||
extern const device_t ns16850_device;
|
||||
extern const device_t ns16950_device;
|
||||
|
||||
#endif /*EMU_SERIAL_H*/
|
||||
#endif /*EMU_SERIAL_H*/
|
||||
|
||||
@@ -31,12 +31,12 @@ enum fm_driver {
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
uint8_t (*read)(uint16_t port, void *priv);
|
||||
void (*write)(uint16_t port, uint8_t val, void *priv);
|
||||
int32_t * (*update)(void *priv);
|
||||
uint8_t (*read)(uint16_t port, void *priv);
|
||||
void (*write)(uint16_t port, uint8_t val, void *priv);
|
||||
int32_t *(*update)(void *priv);
|
||||
void (*reset_buffer)(void *priv);
|
||||
void (*set_do_cycles)(void *priv, int8_t do_cycles);
|
||||
void *priv;
|
||||
void (*set_do_cycles)(void *priv, int8_t do_cycles);
|
||||
void *priv;
|
||||
} fm_drv_t;
|
||||
|
||||
extern uint8_t fm_driver_get(int chip_id, fm_drv_t *drv);
|
||||
|
||||
@@ -20,5 +20,4 @@
|
||||
#ifndef SOUND_OPL_NUKED_H
|
||||
#define SOUND_OPL_NUKED_H
|
||||
|
||||
|
||||
#endif /*SOUND_OPL_NUKED_H*/
|
||||
|
||||
@@ -121,14 +121,14 @@ typedef struct sb_ct1745_mixer_t {
|
||||
uint8_t index;
|
||||
uint8_t regs[256];
|
||||
|
||||
int output_filter; /* for clones */
|
||||
int output_filter; /* for clones */
|
||||
} sb_ct1745_mixer_t;
|
||||
|
||||
typedef struct sb_t {
|
||||
uint8_t cms_enabled,
|
||||
opl_enabled,
|
||||
mixer_enabled;
|
||||
cms_t cms;
|
||||
cms_t cms;
|
||||
fm_drv_t opl,
|
||||
opl2;
|
||||
sb_dsp_t dsp;
|
||||
@@ -153,9 +153,9 @@ extern void sb_ct1345_mixer_write(uint16_t addr, uint8_t val, void *p);
|
||||
extern uint8_t sb_ct1345_mixer_read(uint16_t addr, void *p);
|
||||
extern void sb_ct1345_mixer_reset(sb_t *sb);
|
||||
|
||||
extern void sb_ct1745_mixer_write(uint16_t addr, uint8_t val, void *p);
|
||||
extern void sb_ct1745_mixer_write(uint16_t addr, uint8_t val, void *p);
|
||||
extern uint8_t sb_ct1745_mixer_read(uint16_t addr, void *p);
|
||||
extern void sb_ct1745_mixer_reset(sb_t* sb);
|
||||
extern void sb_ct1745_mixer_reset(sb_t *sb);
|
||||
|
||||
extern void sb_get_buffer_sbpro(int32_t *buffer, int len, void *p);
|
||||
extern void sbpro_filter_cd_audio(int channel, double *buffer, void *p);
|
||||
|
||||
@@ -42,7 +42,7 @@ typedef struct sb_dsp_t {
|
||||
|
||||
int sb_irqnum;
|
||||
void (*irq_update)(void *priv, int set),
|
||||
*irq_priv;
|
||||
*irq_priv;
|
||||
|
||||
uint8_t sbe2;
|
||||
int sbe2count;
|
||||
|
||||
@@ -17,10 +17,9 @@
|
||||
*/
|
||||
|
||||
#ifndef VIDEO_8514A_H
|
||||
# define VIDEO_8514A_H
|
||||
#define VIDEO_8514A_H
|
||||
|
||||
typedef struct ibm8514_t
|
||||
{
|
||||
typedef struct ibm8514_t {
|
||||
uint8_t pos_regs[8];
|
||||
|
||||
int force_old_addr;
|
||||
@@ -29,21 +28,21 @@ typedef struct ibm8514_t
|
||||
uint32_t vram_size;
|
||||
uint32_t vram_mask;
|
||||
|
||||
PALETTE vgapal;
|
||||
uint8_t dac_mask, dac_status;
|
||||
PALETTE vgapal;
|
||||
uint8_t dac_mask, dac_status;
|
||||
uint32_t *map8;
|
||||
int dac_addr, dac_pos, dac_r, dac_g;
|
||||
int dac_addr, dac_pos, dac_r, dac_g;
|
||||
|
||||
struct {
|
||||
uint16_t subsys_cntl;
|
||||
uint16_t setup_md;
|
||||
uint8_t advfunc_cntl, ext_advfunc_cntl;
|
||||
uint8_t advfunc_cntl, ext_advfunc_cntl;
|
||||
uint16_t cur_y, cur_y_bitres;
|
||||
uint16_t cur_x, cur_x_bitres;
|
||||
int16_t desty_axstp;
|
||||
int16_t destx_distp;
|
||||
int16_t err_term;
|
||||
int16_t maj_axis_pcnt;
|
||||
int16_t desty_axstp;
|
||||
int16_t destx_distp;
|
||||
int16_t err_term;
|
||||
int16_t maj_axis_pcnt;
|
||||
uint16_t cmd, cmd_back;
|
||||
uint16_t short_stroke;
|
||||
uint16_t bkgd_color;
|
||||
@@ -55,58 +54,58 @@ typedef struct ibm8514_t
|
||||
uint16_t frgd_mix;
|
||||
uint16_t multifunc_cntl;
|
||||
uint16_t multifunc[16];
|
||||
int16_t clip_left, clip_top;
|
||||
uint8_t pix_trans[2];
|
||||
int poly_draw;
|
||||
int ssv_state;
|
||||
int x1, x2, y1, y2;
|
||||
int sys_cnt, sys_cnt2;
|
||||
int temp_cnt;
|
||||
int16_t cx, cy, oldcy;
|
||||
int16_t sx, sy;
|
||||
int16_t dx, dy;
|
||||
int16_t err;
|
||||
int16_t clip_left, clip_top;
|
||||
uint8_t pix_trans[2];
|
||||
int poly_draw;
|
||||
int ssv_state;
|
||||
int x1, x2, y1, y2;
|
||||
int sys_cnt, sys_cnt2;
|
||||
int temp_cnt;
|
||||
int16_t cx, cy, oldcy;
|
||||
int16_t sx, sy;
|
||||
int16_t dx, dy;
|
||||
int16_t err;
|
||||
uint32_t src, dest;
|
||||
uint32_t newsrc_blt, newdest_blt;
|
||||
uint32_t newdest_in, newdest_out;
|
||||
uint8_t *writemono, *nibbleset;
|
||||
int x_count, xx_count, y_count;
|
||||
int input, output;
|
||||
int x_count, xx_count, y_count;
|
||||
int input, output;
|
||||
|
||||
uint16_t cur_x_bit12, cur_y_bit12;
|
||||
int ssv_len;
|
||||
uint8_t ssv_dir;
|
||||
uint8_t ssv_draw;
|
||||
int odd_in, odd_out;
|
||||
int ssv_len;
|
||||
uint8_t ssv_dir;
|
||||
uint8_t ssv_draw;
|
||||
int odd_in, odd_out;
|
||||
|
||||
uint16_t scratch;
|
||||
int fill_state, xdir, ydir;
|
||||
int fill_state, xdir, ydir;
|
||||
} accel;
|
||||
|
||||
uint16_t test;
|
||||
|
||||
int v_total, dispend, v_syncstart, split,
|
||||
h_disp, h_disp_old, h_total, h_disp_time, rowoffset,
|
||||
dispon, hdisp_on, linecountff,
|
||||
vc, linepos, oddeven, cursoron, blink, scrollcache,
|
||||
firstline, lastline, firstline_draw, lastline_draw,
|
||||
displine, fullchange, x_add, y_add;
|
||||
uint32_t ma, maback;
|
||||
h_disp, h_disp_old, h_total, h_disp_time, rowoffset,
|
||||
dispon, hdisp_on, linecountff,
|
||||
vc, linepos, oddeven, cursoron, blink, scrollcache,
|
||||
firstline, lastline, firstline_draw, lastline_draw,
|
||||
displine, fullchange, x_add, y_add;
|
||||
uint32_t ma, maback;
|
||||
|
||||
uint8_t *vram, *changedvram, linedbl;
|
||||
|
||||
uint8_t data_available, data_available2;
|
||||
uint8_t scanmodulos, rowcount;
|
||||
int htotal, hdisp, vtadj, vdadj, vsadj, sc,
|
||||
int htotal, hdisp, vtadj, vdadj, vsadj, sc,
|
||||
vtb, vdb, vsb, vsyncstart, vsyncwidth;
|
||||
int vtotal, vdisp;
|
||||
int disp_cntl, interlace;
|
||||
int vtotal, vdisp;
|
||||
int disp_cntl, interlace;
|
||||
uint8_t subsys_cntl, subsys_stat;
|
||||
|
||||
volatile int force_busy, force_busy2;
|
||||
|
||||
int blitter_busy;
|
||||
int blitter_busy;
|
||||
uint64_t blitter_time;
|
||||
uint64_t status_time;
|
||||
} ibm8514_t;
|
||||
#endif /*VIDEO_8514A_H*/
|
||||
#endif /*VIDEO_8514A_H*/
|
||||
|
||||
@@ -1,54 +1,49 @@
|
||||
#ifndef VIDEO_ATI_EEPROM_H
|
||||
# define VIDEO_ATI_EEPROM_H
|
||||
#define VIDEO_ATI_EEPROM_H
|
||||
|
||||
/* Copyright holders: Sarah Walker
|
||||
see COPYING for more details
|
||||
*/
|
||||
|
||||
enum
|
||||
{
|
||||
EEPROM_IDLE,
|
||||
EEPROM_WAIT,
|
||||
EEPROM_OPCODE,
|
||||
EEPROM_INPUT,
|
||||
EEPROM_OUTPUT
|
||||
enum {
|
||||
EEPROM_IDLE,
|
||||
EEPROM_WAIT,
|
||||
EEPROM_OPCODE,
|
||||
EEPROM_INPUT,
|
||||
EEPROM_OUTPUT
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
EEPROM_OP_EW = 4,
|
||||
EEPROM_OP_WRITE = 5,
|
||||
EEPROM_OP_READ = 6,
|
||||
EEPROM_OP_ERASE = 7,
|
||||
enum {
|
||||
EEPROM_OP_EW = 4,
|
||||
EEPROM_OP_WRITE = 5,
|
||||
EEPROM_OP_READ = 6,
|
||||
EEPROM_OP_ERASE = 7,
|
||||
|
||||
EEPROM_OP_WRALMAIN = -1
|
||||
EEPROM_OP_WRALMAIN = -1
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
EEPROM_OP_EWDS = 0,
|
||||
EEPROM_OP_WRAL = 1,
|
||||
EEPROM_OP_ERAL = 2,
|
||||
EEPROM_OP_EWEN = 3
|
||||
enum {
|
||||
EEPROM_OP_EWDS = 0,
|
||||
EEPROM_OP_WRAL = 1,
|
||||
EEPROM_OP_ERAL = 2,
|
||||
EEPROM_OP_EWEN = 3
|
||||
};
|
||||
|
||||
typedef struct ati_eeprom_t {
|
||||
uint16_t data[256];
|
||||
|
||||
typedef struct ati_eeprom_t
|
||||
{
|
||||
uint16_t data[256];
|
||||
int oldclk, oldena;
|
||||
int opcode, state, count, out;
|
||||
int wp;
|
||||
uint32_t dat;
|
||||
int type;
|
||||
int address;
|
||||
|
||||
int oldclk, oldena;
|
||||
int opcode, state, count, out;
|
||||
int wp;
|
||||
uint32_t dat;
|
||||
int type;
|
||||
int address;
|
||||
|
||||
char fn[256];
|
||||
char fn[256];
|
||||
} ati_eeprom_t;
|
||||
|
||||
void ati_eeprom_load(ati_eeprom_t *eeprom, char *fn, int type);
|
||||
void ati_eeprom_write(ati_eeprom_t *eeprom, int ena, int clk, int dat);
|
||||
int ati_eeprom_read(ati_eeprom_t *eeprom);
|
||||
int ati_eeprom_read(ati_eeprom_t *eeprom);
|
||||
|
||||
#endif /*VIDEO_ATI_EEPROM_H*/
|
||||
|
||||
@@ -17,45 +17,44 @@
|
||||
*/
|
||||
|
||||
#ifndef VIDEO_CGA_H
|
||||
# define VIDEO_CGA_H
|
||||
#define VIDEO_CGA_H
|
||||
|
||||
typedef struct cga_t
|
||||
{
|
||||
mem_mapping_t mapping;
|
||||
typedef struct cga_t {
|
||||
mem_mapping_t mapping;
|
||||
|
||||
int crtcreg;
|
||||
uint8_t crtc[32];
|
||||
int crtcreg;
|
||||
uint8_t crtc[32];
|
||||
|
||||
uint8_t cgastat;
|
||||
uint8_t cgastat;
|
||||
|
||||
uint8_t cgamode, cgacol;
|
||||
uint8_t cgamode, cgacol;
|
||||
|
||||
int fontbase;
|
||||
int linepos, displine;
|
||||
int sc, vc;
|
||||
int cgadispon;
|
||||
int con, coff, cursoron, cgablink;
|
||||
int vsynctime, vadj;
|
||||
uint16_t ma, maback;
|
||||
int oddeven;
|
||||
int fontbase;
|
||||
int linepos, displine;
|
||||
int sc, vc;
|
||||
int cgadispon;
|
||||
int con, coff, cursoron, cgablink;
|
||||
int vsynctime, vadj;
|
||||
uint16_t ma, maback;
|
||||
int oddeven;
|
||||
|
||||
uint64_t dispontime, dispofftime;
|
||||
pc_timer_t timer;
|
||||
uint64_t dispontime, dispofftime;
|
||||
pc_timer_t timer;
|
||||
|
||||
int firstline, lastline;
|
||||
int firstline, lastline;
|
||||
|
||||
int drawcursor;
|
||||
int drawcursor;
|
||||
|
||||
int fullchange;
|
||||
int fullchange;
|
||||
|
||||
uint8_t *vram;
|
||||
uint8_t *vram;
|
||||
|
||||
uint8_t charbuffer[256];
|
||||
uint8_t charbuffer[256];
|
||||
|
||||
int revision;
|
||||
int composite;
|
||||
int snow_enabled;
|
||||
int rgb_type;
|
||||
int revision;
|
||||
int composite;
|
||||
int snow_enabled;
|
||||
int rgb_type;
|
||||
} cga_t;
|
||||
|
||||
void cga_init(cga_t *cga);
|
||||
@@ -68,7 +67,7 @@ void cga_poll(void *p);
|
||||
|
||||
#ifdef EMU_DEVICE_H
|
||||
extern const device_config_t cga_config[];
|
||||
extern const device_t cga_device;
|
||||
extern const device_t cga_device;
|
||||
#endif
|
||||
|
||||
#endif /*VIDEO_CGA_H*/
|
||||
#endif /*VIDEO_CGA_H*/
|
||||
|
||||
@@ -18,15 +18,15 @@
|
||||
*/
|
||||
|
||||
#ifndef VIDEO_CGA_COMP_H
|
||||
# define VIDEO_CGA_COMP_H
|
||||
#define VIDEO_CGA_COMP_H
|
||||
|
||||
#define Bit8u uint8_t
|
||||
#define Bit8u uint8_t
|
||||
#define Bit32u uint32_t
|
||||
#define Bitu unsigned int
|
||||
#define Bitu unsigned int
|
||||
#define bool uint8_t
|
||||
|
||||
void update_cga16_color(uint8_t cgamode);
|
||||
void cga_comp_init(int revision);
|
||||
Bit32u * Composite_Process(uint8_t cgamode, Bit8u border, Bit32u blocks/*, bool doublewidth*/, Bit32u *TempLine);
|
||||
void update_cga16_color(uint8_t cgamode);
|
||||
void cga_comp_init(int revision);
|
||||
Bit32u *Composite_Process(uint8_t cgamode, Bit8u border, Bit32u blocks /*, bool doublewidth*/, Bit32u *TempLine);
|
||||
|
||||
#endif /*VIDEO_CGA_COMP_H*/
|
||||
#endif /*VIDEO_CGA_COMP_H*/
|
||||
|
||||
@@ -1,10 +1,9 @@
|
||||
#ifndef VIDEO_COLORPLUS_H
|
||||
# define VIDEO_COLORPLUS_H
|
||||
#define VIDEO_COLORPLUS_H
|
||||
|
||||
typedef struct colorplus_t
|
||||
{
|
||||
cga_t cga;
|
||||
uint8_t control;
|
||||
typedef struct colorplus_t {
|
||||
cga_t cga;
|
||||
uint8_t control;
|
||||
} colorplus_t;
|
||||
|
||||
void colorplus_init(colorplus_t *colorplus);
|
||||
|
||||
@@ -18,9 +18,9 @@
|
||||
*/
|
||||
|
||||
#ifndef EMU_VID_DDC_H
|
||||
# define EMU_VID_DDC_H
|
||||
#define EMU_VID_DDC_H
|
||||
|
||||
extern void *ddc_init(void *i2c);
|
||||
extern void ddc_close(void *eeprom);
|
||||
extern void *ddc_init(void *i2c);
|
||||
extern void ddc_close(void *eeprom);
|
||||
|
||||
#endif /*EMU_VID_DDC_H*/
|
||||
#endif /*EMU_VID_DDC_H*/
|
||||
|
||||
@@ -19,8 +19,7 @@
|
||||
*/
|
||||
|
||||
#ifndef VIDEO_EGA_H
|
||||
# define VIDEO_EGA_H
|
||||
|
||||
#define VIDEO_EGA_H
|
||||
|
||||
#if defined(EMU_MEM_H) && defined(EMU_ROM_H)
|
||||
typedef struct ega_t {
|
||||
@@ -29,10 +28,10 @@ typedef struct ega_t {
|
||||
rom_t bios_rom;
|
||||
|
||||
uint8_t crtcreg, gdcaddr, attraddr, attrff,
|
||||
attr_palette_enable, seqaddr, miscout,
|
||||
writemask, la, lb, lc, ld,
|
||||
stat, colourcompare, colournocare, scrblank,
|
||||
plane_mask, pad, pad0, pad1;
|
||||
attr_palette_enable, seqaddr, miscout,
|
||||
writemask, la, lb, lc, ld,
|
||||
stat, colourcompare, colournocare, scrblank,
|
||||
plane_mask, pad, pad0, pad1;
|
||||
uint8_t crtc[32];
|
||||
uint8_t gdcreg[16];
|
||||
uint8_t attrregs[32];
|
||||
@@ -43,30 +42,30 @@ typedef struct ega_t {
|
||||
uint8_t *vram;
|
||||
|
||||
int vidclock, fast, extvram, vres,
|
||||
readmode, writemode, readplane, vrammask,
|
||||
chain4, chain2_read, chain2_write, con,
|
||||
oddeven_page, oddeven_chain, vc, sc,
|
||||
dispon, hdisp_on, cursoron, blink, fullchange,
|
||||
linepos, vslines, linecountff, oddeven,
|
||||
lowres, interlace, linedbl, lindebl, rowcount,
|
||||
vtotal, dispend, vsyncstart, split,
|
||||
hdisp, hdisp_old, htotal, hdisp_time, rowoffset,
|
||||
vblankstart, scrollcache, firstline, lastline,
|
||||
firstline_draw, lastline_draw, x_add, y_add,
|
||||
displine, res_x, res_y, bpp, index;
|
||||
readmode, writemode, readplane, vrammask,
|
||||
chain4, chain2_read, chain2_write, con,
|
||||
oddeven_page, oddeven_chain, vc, sc,
|
||||
dispon, hdisp_on, cursoron, blink, fullchange,
|
||||
linepos, vslines, linecountff, oddeven,
|
||||
lowres, interlace, linedbl, lindebl, rowcount,
|
||||
vtotal, dispend, vsyncstart, split,
|
||||
hdisp, hdisp_old, htotal, hdisp_time, rowoffset,
|
||||
vblankstart, scrollcache, firstline, lastline,
|
||||
firstline_draw, lastline_draw, x_add, y_add,
|
||||
displine, res_x, res_y, bpp, index;
|
||||
|
||||
uint32_t charseta, charsetb, ma_latch, ma,
|
||||
maback, ca, vram_limit, overscan_color;
|
||||
maback, ca, vram_limit, overscan_color;
|
||||
|
||||
uint32_t *pallook;
|
||||
|
||||
uint64_t dispontime, dispofftime;
|
||||
pc_timer_t timer;
|
||||
uint64_t dispontime, dispofftime;
|
||||
pc_timer_t timer;
|
||||
|
||||
double clock;
|
||||
|
||||
int remap_required;
|
||||
uint32_t (*remap_func)(struct ega_t *ega, uint32_t in_addr);
|
||||
int remap_required;
|
||||
uint32_t (*remap_func)(struct ega_t *ega, uint32_t in_addr);
|
||||
|
||||
void (*render)(struct ega_t *svga);
|
||||
|
||||
@@ -74,7 +73,6 @@ typedef struct ega_t {
|
||||
} ega_t;
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef EMU_DEVICE_H
|
||||
extern const device_t ega_device;
|
||||
extern const device_t cpqega_device;
|
||||
@@ -86,33 +84,31 @@ extern const device_t et2000_device;
|
||||
|
||||
extern int update_overscan;
|
||||
|
||||
#define DISPLAY_RGB 0
|
||||
#define DISPLAY_COMPOSITE 1
|
||||
#define DISPLAY_RGB 0
|
||||
#define DISPLAY_COMPOSITE 1
|
||||
#define DISPLAY_RGB_NO_BROWN 2
|
||||
#define DISPLAY_GREEN 3
|
||||
#define DISPLAY_AMBER 4
|
||||
#define DISPLAY_WHITE 5
|
||||
|
||||
#define DISPLAY_GREEN 3
|
||||
#define DISPLAY_AMBER 4
|
||||
#define DISPLAY_WHITE 5
|
||||
|
||||
#if defined(EMU_MEM_H) && defined(EMU_ROM_H)
|
||||
extern void ega_init(ega_t *ega, int monitor_type, int is_mono);
|
||||
extern void ega_recalctimings(struct ega_t *ega);
|
||||
extern void ega_init(ega_t *ega, int monitor_type, int is_mono);
|
||||
extern void ega_recalctimings(struct ega_t *ega);
|
||||
extern void ega_recalc_remap_func(struct ega_t *ega);
|
||||
#endif
|
||||
|
||||
extern void ega_out(uint16_t addr, uint8_t val, void *p);
|
||||
extern uint8_t ega_in(uint16_t addr, void *p);
|
||||
extern void ega_poll(void *p);
|
||||
extern void ega_write(uint32_t addr, uint8_t val, void *p);
|
||||
extern uint8_t ega_read(uint32_t addr, void *p);
|
||||
|
||||
extern void ega_out(uint16_t addr, uint8_t val, void *p);
|
||||
extern uint8_t ega_in(uint16_t addr, void *p);
|
||||
extern void ega_poll(void *p);
|
||||
extern void ega_write(uint32_t addr, uint8_t val, void *p);
|
||||
extern uint8_t ega_read(uint32_t addr, void *p);
|
||||
|
||||
extern int firstline_draw, lastline_draw;
|
||||
extern int displine;
|
||||
extern int sc;
|
||||
|
||||
extern uint32_t ma, ca;
|
||||
extern int con, cursoron, cgablink;
|
||||
extern int con, cursoron, cgablink;
|
||||
|
||||
extern int scrollcache;
|
||||
|
||||
@@ -134,4 +130,4 @@ void ega_render_4bpp_lowres(ega_t *ega);
|
||||
void ega_render_4bpp_highres(ega_t *ega);
|
||||
#endif
|
||||
|
||||
#endif /*VIDEO_EGA_H*/
|
||||
#endif /*VIDEO_EGA_H*/
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#ifndef VIDEO_EGA_RENDER_REMAP_H
|
||||
# define VIDEO_EGA_RENDER_REMAP_H
|
||||
#define VIDEO_EGA_RENDER_REMAP_H
|
||||
|
||||
#define VAR_BYTE_MODE (0 << 0)
|
||||
#define VAR_WORD_MODE_MA13 (1 << 0)
|
||||
@@ -9,44 +9,35 @@
|
||||
#define VAR_ROW0_MA13 (1 << 2)
|
||||
#define VAR_ROW1_MA14 (1 << 3)
|
||||
|
||||
#define ADDRESS_REMAP_FUNC(nr) \
|
||||
static uint32_t address_remap_func_ ## nr(ega_t *ega, uint32_t in_addr) \
|
||||
{ \
|
||||
uint32_t out_addr; \
|
||||
\
|
||||
switch (nr & VAR_MODE_MASK) \
|
||||
{ \
|
||||
case VAR_BYTE_MODE: \
|
||||
out_addr = in_addr; \
|
||||
break; \
|
||||
\
|
||||
case VAR_WORD_MODE_MA13: \
|
||||
out_addr = ((in_addr << 1) & 0x1fff8) | \
|
||||
((in_addr >> 13) & 0x4) | \
|
||||
(in_addr & ~0x1ffff); \
|
||||
break; \
|
||||
\
|
||||
case VAR_WORD_MODE_MA15: \
|
||||
out_addr = ((in_addr << 1) & 0x1fff8) | \
|
||||
((in_addr >> 15) & 0x4) | \
|
||||
(in_addr & ~0x1ffff); \
|
||||
break; \
|
||||
\
|
||||
case VAR_DWORD_MODE: \
|
||||
out_addr = ((in_addr << 2) & 0x3fff0) | \
|
||||
((in_addr >> 14) & 0xc) | \
|
||||
(in_addr & ~0x3ffff); \
|
||||
break; \
|
||||
} \
|
||||
\
|
||||
if (nr & VAR_ROW0_MA13) \
|
||||
out_addr = (out_addr & ~0x8000) | \
|
||||
((ega->sc & 1) ? 0x8000 : 0); \
|
||||
if (nr & VAR_ROW1_MA14) \
|
||||
out_addr = (out_addr & ~0x10000) | \
|
||||
((ega->sc & 2) ? 0x10000 : 0); \
|
||||
\
|
||||
return out_addr; \
|
||||
#define ADDRESS_REMAP_FUNC(nr) \
|
||||
static uint32_t address_remap_func_##nr(ega_t *ega, uint32_t in_addr) \
|
||||
{ \
|
||||
uint32_t out_addr; \
|
||||
\
|
||||
switch (nr & VAR_MODE_MASK) { \
|
||||
case VAR_BYTE_MODE: \
|
||||
out_addr = in_addr; \
|
||||
break; \
|
||||
\
|
||||
case VAR_WORD_MODE_MA13: \
|
||||
out_addr = ((in_addr << 1) & 0x1fff8) | ((in_addr >> 13) & 0x4) | (in_addr & ~0x1ffff); \
|
||||
break; \
|
||||
\
|
||||
case VAR_WORD_MODE_MA15: \
|
||||
out_addr = ((in_addr << 1) & 0x1fff8) | ((in_addr >> 15) & 0x4) | (in_addr & ~0x1ffff); \
|
||||
break; \
|
||||
\
|
||||
case VAR_DWORD_MODE: \
|
||||
out_addr = ((in_addr << 2) & 0x3fff0) | ((in_addr >> 14) & 0xc) | (in_addr & ~0x3ffff); \
|
||||
break; \
|
||||
} \
|
||||
\
|
||||
if (nr & VAR_ROW0_MA13) \
|
||||
out_addr = (out_addr & ~0x8000) | ((ega->sc & 1) ? 0x8000 : 0); \
|
||||
if (nr & VAR_ROW1_MA14) \
|
||||
out_addr = (out_addr & ~0x10000) | ((ega->sc & 2) ? 0x10000 : 0); \
|
||||
\
|
||||
return out_addr; \
|
||||
}
|
||||
|
||||
ADDRESS_REMAP_FUNC(0)
|
||||
@@ -66,8 +57,7 @@ ADDRESS_REMAP_FUNC(13)
|
||||
ADDRESS_REMAP_FUNC(14)
|
||||
ADDRESS_REMAP_FUNC(15)
|
||||
|
||||
static uint32_t (*address_remap_funcs[16])(ega_t *ega, uint32_t in_addr) =
|
||||
{
|
||||
static uint32_t (*address_remap_funcs[16])(ega_t *ega, uint32_t in_addr) = {
|
||||
address_remap_func_0,
|
||||
address_remap_func_1,
|
||||
address_remap_func_2,
|
||||
@@ -86,7 +76,8 @@ static uint32_t (*address_remap_funcs[16])(ega_t *ega, uint32_t in_addr) =
|
||||
address_remap_func_15
|
||||
};
|
||||
|
||||
void ega_recalc_remap_func(ega_t *ega)
|
||||
void
|
||||
ega_recalc_remap_func(ega_t *ega)
|
||||
{
|
||||
int func_nr;
|
||||
|
||||
@@ -105,7 +96,7 @@ void ega_recalc_remap_func(ega_t *ega)
|
||||
func_nr |= VAR_ROW1_MA14;
|
||||
|
||||
ega->remap_required = (func_nr != 0);
|
||||
ega->remap_func = address_remap_funcs[func_nr];
|
||||
ega->remap_func = address_remap_funcs[func_nr];
|
||||
}
|
||||
|
||||
#endif /*VIDEO_RENDER_REMAP_H*/
|
||||
|
||||
@@ -18,51 +18,58 @@
|
||||
*/
|
||||
|
||||
#ifndef VIDEO_HERCULES_H
|
||||
# define VIDEO_HERCULES_H
|
||||
#define VIDEO_HERCULES_H
|
||||
|
||||
typedef struct {
|
||||
mem_mapping_t mapping;
|
||||
mem_mapping_t mapping;
|
||||
|
||||
uint8_t crtc[32], charbuffer[4096];
|
||||
int crtcreg;
|
||||
uint8_t crtc[32], charbuffer[4096];
|
||||
int crtcreg;
|
||||
|
||||
uint8_t ctrl,
|
||||
ctrl2,
|
||||
stat;
|
||||
uint8_t ctrl,
|
||||
ctrl2,
|
||||
stat;
|
||||
|
||||
uint64_t dispontime,
|
||||
dispofftime;
|
||||
pc_timer_t timer;
|
||||
uint64_t dispontime,
|
||||
dispofftime;
|
||||
pc_timer_t timer;
|
||||
|
||||
int firstline,
|
||||
lastline;
|
||||
int firstline,
|
||||
lastline;
|
||||
|
||||
int linepos,
|
||||
displine;
|
||||
int vc,
|
||||
sc;
|
||||
uint16_t ma,
|
||||
maback;
|
||||
int con, coff,
|
||||
cursoron;
|
||||
int dispon,
|
||||
blink;
|
||||
int vsynctime;
|
||||
int vadj;
|
||||
int linepos,
|
||||
displine;
|
||||
int vc,
|
||||
sc;
|
||||
uint16_t ma,
|
||||
maback;
|
||||
int con, coff,
|
||||
cursoron;
|
||||
int dispon,
|
||||
blink;
|
||||
int vsynctime;
|
||||
int vadj;
|
||||
|
||||
int lp_ff;
|
||||
int fullchange;
|
||||
int lp_ff;
|
||||
int fullchange;
|
||||
|
||||
int cols[256][2][2];
|
||||
int cols[256][2][2];
|
||||
|
||||
uint8_t *vram;
|
||||
int monitor_index;
|
||||
int prev_monitor_index;
|
||||
uint8_t *vram;
|
||||
int monitor_index;
|
||||
int prev_monitor_index;
|
||||
} hercules_t;
|
||||
|
||||
#define VIDEO_MONITOR_PROLOGUE() { dev->prev_monitor_index = monitor_index_global; monitor_index_global = dev->monitor_index; }
|
||||
#define VIDEO_MONITOR_EPILOGUE() { monitor_index_global = dev->prev_monitor_index; }
|
||||
#define VIDEO_MONITOR_PROLOGUE() \
|
||||
{ \
|
||||
dev->prev_monitor_index = monitor_index_global; \
|
||||
monitor_index_global = dev->monitor_index; \
|
||||
}
|
||||
#define VIDEO_MONITOR_EPILOGUE() \
|
||||
{ \
|
||||
monitor_index_global = dev->prev_monitor_index; \
|
||||
}
|
||||
|
||||
static void *hercules_init(const device_t *info);
|
||||
|
||||
#endif /*VIDEO_HERCULES_H*/
|
||||
#endif /*VIDEO_HERCULES_H*/
|
||||
|
||||
@@ -3,40 +3,46 @@
|
||||
*/
|
||||
|
||||
#ifndef VIDEO_MDA_H
|
||||
# define VIDEO_MDA_H
|
||||
#define VIDEO_MDA_H
|
||||
|
||||
typedef struct mda_t
|
||||
{
|
||||
mem_mapping_t mapping;
|
||||
typedef struct mda_t {
|
||||
mem_mapping_t mapping;
|
||||
|
||||
uint8_t crtc[32];
|
||||
int crtcreg;
|
||||
uint8_t crtc[32];
|
||||
int crtcreg;
|
||||
|
||||
uint8_t ctrl, stat;
|
||||
uint8_t ctrl, stat;
|
||||
|
||||
uint64_t dispontime, dispofftime;
|
||||
pc_timer_t timer;
|
||||
uint64_t dispontime, dispofftime;
|
||||
pc_timer_t timer;
|
||||
|
||||
int firstline, lastline;
|
||||
int firstline, lastline;
|
||||
|
||||
int linepos, displine;
|
||||
int vc, sc;
|
||||
uint16_t ma, maback;
|
||||
int con, coff, cursoron;
|
||||
int dispon, blink;
|
||||
int vsynctime;
|
||||
int vadj;
|
||||
int monitor_index;
|
||||
int prev_monitor_index;
|
||||
int linepos, displine;
|
||||
int vc, sc;
|
||||
uint16_t ma, maback;
|
||||
int con, coff, cursoron;
|
||||
int dispon, blink;
|
||||
int vsynctime;
|
||||
int vadj;
|
||||
int monitor_index;
|
||||
int prev_monitor_index;
|
||||
|
||||
uint8_t *vram;
|
||||
uint8_t *vram;
|
||||
} mda_t;
|
||||
|
||||
#define VIDEO_MONITOR_PROLOGUE() { mda->prev_monitor_index = monitor_index_global; monitor_index_global = mda->monitor_index; }
|
||||
#define VIDEO_MONITOR_EPILOGUE() { monitor_index_global = mda->prev_monitor_index; }
|
||||
#define VIDEO_MONITOR_PROLOGUE() \
|
||||
{ \
|
||||
mda->prev_monitor_index = monitor_index_global; \
|
||||
monitor_index_global = mda->monitor_index; \
|
||||
}
|
||||
#define VIDEO_MONITOR_EPILOGUE() \
|
||||
{ \
|
||||
monitor_index_global = mda->prev_monitor_index; \
|
||||
}
|
||||
|
||||
void mda_init(mda_t *mda);
|
||||
void mda_setcol(int chr, int blink, int fg, uint8_t cga_ink);
|
||||
void mda_setcol(int chr, int blink, int fg, uint8_t cga_ink);
|
||||
void mda_out(uint16_t addr, uint8_t val, void *p);
|
||||
uint8_t mda_in(uint16_t addr, void *p);
|
||||
void mda_write(uint32_t addr, uint8_t val, void *p);
|
||||
|
||||
@@ -23,15 +23,15 @@
|
||||
*/
|
||||
|
||||
#ifndef VIDEO_NGA_H
|
||||
# define VIDEO_NGA_H
|
||||
#define VIDEO_NGA_H
|
||||
|
||||
typedef struct nga_t {
|
||||
cga_t cga;
|
||||
/* unused in OGC, required for M19 video card structure idiom */
|
||||
uint32_t base;
|
||||
int lineff;
|
||||
int page;
|
||||
uint8_t *vram_64k;
|
||||
/* unused in OGC, required for M19 video card structure idiom */
|
||||
uint32_t base;
|
||||
int lineff;
|
||||
int page;
|
||||
uint8_t *vram_64k;
|
||||
mem_mapping_t mapping_64k;
|
||||
} nga_t;
|
||||
|
||||
@@ -44,10 +44,9 @@ void nga_poll(void *priv);
|
||||
void nga_close(void *priv);
|
||||
void nga_mdaattr_rebuild();
|
||||
|
||||
|
||||
#ifdef EMU_DEVICE_H
|
||||
extern const device_config_t nga_config[];
|
||||
extern const device_t nga_device;
|
||||
extern const device_t nga_device;
|
||||
#endif
|
||||
|
||||
#endif /*VIDEO_NGA_H*/
|
||||
|
||||
@@ -23,16 +23,16 @@
|
||||
*/
|
||||
|
||||
#ifndef VIDEO_OGC_H
|
||||
# define VIDEO_OGC_H
|
||||
#define VIDEO_OGC_H
|
||||
|
||||
typedef struct ogc_t {
|
||||
cga_t cga;
|
||||
/* unused in OGC, required for M19 video card structure idiom */
|
||||
uint8_t ctrl_3dd;
|
||||
uint8_t ctrl_3de;
|
||||
uint32_t base;
|
||||
int lineff;
|
||||
int mono_display;
|
||||
/* unused in OGC, required for M19 video card structure idiom */
|
||||
uint8_t ctrl_3dd;
|
||||
uint8_t ctrl_3de;
|
||||
uint32_t base;
|
||||
int lineff;
|
||||
int mono_display;
|
||||
} ogc_t;
|
||||
|
||||
void ogc_recalctimings(ogc_t *ogc);
|
||||
@@ -44,10 +44,9 @@ void ogc_poll(void *priv);
|
||||
void ogc_close(void *priv);
|
||||
void ogc_mdaattr_rebuild();
|
||||
|
||||
|
||||
#ifdef EMU_DEVICE_H
|
||||
extern const device_config_t ogc_config[];
|
||||
extern const device_t ogc_device;
|
||||
extern const device_t ogc_device;
|
||||
#endif
|
||||
|
||||
#endif /*VIDEO_OGC_H*/
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
* Copyright 2019 John Elliott.
|
||||
*/
|
||||
#ifndef VID_PGC_H
|
||||
# define VID_PGC_H
|
||||
#define VID_PGC_H
|
||||
|
||||
#define PGC_ERROR_RANGE 0x01
|
||||
#define PGC_ERROR_INTEGER 0x02
|
||||
@@ -31,153 +31,151 @@
|
||||
#define PGC_ERROR_AREA 0x0A
|
||||
#define PGC_ERROR_MISSING 0x0B
|
||||
|
||||
|
||||
struct pgc;
|
||||
|
||||
typedef struct pgc_cl {
|
||||
uint8_t *list;
|
||||
uint32_t listmax;
|
||||
uint32_t wrptr;
|
||||
uint32_t rdptr;
|
||||
uint32_t repeat;
|
||||
uint8_t *list;
|
||||
uint32_t listmax;
|
||||
uint32_t wrptr;
|
||||
uint32_t rdptr;
|
||||
uint32_t repeat;
|
||||
struct pgc_cl *chain;
|
||||
} pgc_cl_t;
|
||||
|
||||
typedef struct pgc_cmd {
|
||||
char ascii[6];
|
||||
uint8_t hex;
|
||||
void (*handler)(struct pgc *);
|
||||
int (*parser) (struct pgc *, pgc_cl_t *, int);
|
||||
char ascii[6];
|
||||
uint8_t hex;
|
||||
void (*handler)(struct pgc *);
|
||||
int (*parser)(struct pgc *, pgc_cl_t *, int);
|
||||
int p;
|
||||
} pgc_cmd_t;
|
||||
|
||||
typedef struct pgc {
|
||||
int8_t type; /* board type */
|
||||
int8_t cga_enabled;
|
||||
int8_t cga_selected;
|
||||
volatile int8_t stopped;
|
||||
int8_t type; /* board type */
|
||||
int8_t cga_enabled;
|
||||
int8_t cga_selected;
|
||||
volatile int8_t stopped;
|
||||
|
||||
mem_mapping_t mapping;
|
||||
mem_mapping_t cga_mapping;
|
||||
mem_mapping_t mapping;
|
||||
mem_mapping_t cga_mapping;
|
||||
|
||||
pgc_cl_t *clist,
|
||||
*clcur;
|
||||
pgc_cl_t *clist,
|
||||
*clcur;
|
||||
const pgc_cmd_t *master,
|
||||
*commands;
|
||||
*commands;
|
||||
|
||||
uint8_t mapram[2048]; /* host <> PGC communication buffer */
|
||||
uint8_t *cga_vram;
|
||||
uint8_t *vram;
|
||||
char asc_command[7];
|
||||
uint8_t hex_command;
|
||||
uint32_t palette[256];
|
||||
uint32_t userpal[256];
|
||||
uint32_t maxw, maxh; /* maximum framebuffer size */
|
||||
uint32_t visw, vish; /* maximum screen size */
|
||||
uint32_t screenw, screenh;
|
||||
int16_t pan_x, pan_y;
|
||||
uint16_t win_x1, win_x2, win_y1, win_y2;
|
||||
uint16_t vp_x1, vp_x2, vp_y1, vp_y2;
|
||||
int16_t fill_pattern[16];
|
||||
int16_t line_pattern;
|
||||
uint8_t draw_mode;
|
||||
uint8_t fill_mode;
|
||||
uint8_t color;
|
||||
uint8_t tjust_h; /* hor alignment 1=left 2=ctr 3=right*/
|
||||
uint8_t tjust_v; /* vert alignment 1=bottom 2=ctr 3=top*/
|
||||
int32_t tsize; /* horizontal spacing */
|
||||
uint8_t mapram[2048]; /* host <> PGC communication buffer */
|
||||
uint8_t *cga_vram;
|
||||
uint8_t *vram;
|
||||
char asc_command[7];
|
||||
uint8_t hex_command;
|
||||
uint32_t palette[256];
|
||||
uint32_t userpal[256];
|
||||
uint32_t maxw, maxh; /* maximum framebuffer size */
|
||||
uint32_t visw, vish; /* maximum screen size */
|
||||
uint32_t screenw, screenh;
|
||||
int16_t pan_x, pan_y;
|
||||
uint16_t win_x1, win_x2, win_y1, win_y2;
|
||||
uint16_t vp_x1, vp_x2, vp_y1, vp_y2;
|
||||
int16_t fill_pattern[16];
|
||||
int16_t line_pattern;
|
||||
uint8_t draw_mode;
|
||||
uint8_t fill_mode;
|
||||
uint8_t color;
|
||||
uint8_t tjust_h; /* hor alignment 1=left 2=ctr 3=right*/
|
||||
uint8_t tjust_v; /* vert alignment 1=bottom 2=ctr 3=top*/
|
||||
int32_t tsize; /* horizontal spacing */
|
||||
|
||||
int32_t x, y, z; /* drawing position */
|
||||
int32_t x, y, z; /* drawing position */
|
||||
|
||||
thread_t *pgc_thread;
|
||||
event_t *pgc_wake_thread;
|
||||
pc_timer_t wake_timer;
|
||||
thread_t *pgc_thread;
|
||||
event_t *pgc_wake_thread;
|
||||
pc_timer_t wake_timer;
|
||||
|
||||
int waiting_input_fifo;
|
||||
int waiting_output_fifo;
|
||||
int waiting_error_fifo;
|
||||
int ascii_mode;
|
||||
int result_count;
|
||||
int waiting_input_fifo;
|
||||
int waiting_output_fifo;
|
||||
int waiting_error_fifo;
|
||||
int ascii_mode;
|
||||
int result_count;
|
||||
|
||||
int fontbase;
|
||||
int linepos,
|
||||
displine;
|
||||
int vc;
|
||||
int cgadispon;
|
||||
int con, coff, cursoron, cgablink;
|
||||
int vsynctime, vadj;
|
||||
uint16_t ma, maback;
|
||||
int oddeven;
|
||||
int fontbase;
|
||||
int linepos,
|
||||
displine;
|
||||
int vc;
|
||||
int cgadispon;
|
||||
int con, coff, cursoron, cgablink;
|
||||
int vsynctime, vadj;
|
||||
uint16_t ma, maback;
|
||||
int oddeven;
|
||||
|
||||
uint64_t dispontime,
|
||||
dispofftime;
|
||||
pc_timer_t timer;
|
||||
double native_pixel_clock;
|
||||
uint64_t dispontime,
|
||||
dispofftime;
|
||||
pc_timer_t timer;
|
||||
double native_pixel_clock;
|
||||
|
||||
int drawcursor;
|
||||
int drawcursor;
|
||||
|
||||
int (*inputbyte)(struct pgc *, uint8_t *result);
|
||||
int (*inputbyte)(struct pgc *, uint8_t *result);
|
||||
} pgc_t;
|
||||
|
||||
|
||||
/* I/O functions and worker thread handlers. */
|
||||
extern void pgc_out(uint16_t addr, uint8_t val, void *priv);
|
||||
extern uint8_t pgc_in(uint16_t addr, void *priv);
|
||||
extern void pgc_write(uint32_t addr, uint8_t val, void *priv);
|
||||
extern uint8_t pgc_read(uint32_t addr, void *priv);
|
||||
extern void pgc_recalctimings(pgc_t *);
|
||||
extern void pgc_poll(void *priv);
|
||||
extern void pgc_reset(pgc_t *);
|
||||
extern void pgc_wake(pgc_t *);
|
||||
extern void pgc_sleep(pgc_t *);
|
||||
extern void pgc_setdisplay(pgc_t *, int cga);
|
||||
extern void pgc_speed_changed(void *priv);
|
||||
extern void pgc_close_common(void *priv);
|
||||
extern void pgc_close(void *priv);
|
||||
extern void pgc_init(pgc_t *,
|
||||
int maxw, int maxh, int visw, int vish,
|
||||
int (*inpbyte)(pgc_t *, uint8_t *), double npc);
|
||||
extern void pgc_out(uint16_t addr, uint8_t val, void *priv);
|
||||
extern uint8_t pgc_in(uint16_t addr, void *priv);
|
||||
extern void pgc_write(uint32_t addr, uint8_t val, void *priv);
|
||||
extern uint8_t pgc_read(uint32_t addr, void *priv);
|
||||
extern void pgc_recalctimings(pgc_t *);
|
||||
extern void pgc_poll(void *priv);
|
||||
extern void pgc_reset(pgc_t *);
|
||||
extern void pgc_wake(pgc_t *);
|
||||
extern void pgc_sleep(pgc_t *);
|
||||
extern void pgc_setdisplay(pgc_t *, int cga);
|
||||
extern void pgc_speed_changed(void *priv);
|
||||
extern void pgc_close_common(void *priv);
|
||||
extern void pgc_close(void *priv);
|
||||
extern void pgc_init(pgc_t *,
|
||||
int maxw, int maxh, int visw, int vish,
|
||||
int (*inpbyte)(pgc_t *, uint8_t *), double npc);
|
||||
|
||||
/* Misc support functions. */
|
||||
extern void pgc_sto_raster(pgc_t *, int16_t *x, int16_t *y);
|
||||
extern void pgc_ito_raster(pgc_t *, int32_t *x, int32_t *y);
|
||||
extern void pgc_dto_raster(pgc_t *, double *x, double *y);
|
||||
//extern int pgc_input_byte(pgc_t *, uint8_t *val);
|
||||
//extern int pgc_output_byte(pgc_t *, uint8_t val);
|
||||
extern int pgc_output_string(pgc_t *, const char *val);
|
||||
//extern int pgc_error_byte(pgc_t *, uint8_t val);
|
||||
extern int pgc_error_string(pgc_t *, const char *val);
|
||||
extern int pgc_error(pgc_t *, int err);
|
||||
extern void pgc_sto_raster(pgc_t *, int16_t *x, int16_t *y);
|
||||
extern void pgc_ito_raster(pgc_t *, int32_t *x, int32_t *y);
|
||||
extern void pgc_dto_raster(pgc_t *, double *x, double *y);
|
||||
// extern int pgc_input_byte(pgc_t *, uint8_t *val);
|
||||
// extern int pgc_output_byte(pgc_t *, uint8_t val);
|
||||
extern int pgc_output_string(pgc_t *, const char *val);
|
||||
// extern int pgc_error_byte(pgc_t *, uint8_t val);
|
||||
extern int pgc_error_string(pgc_t *, const char *val);
|
||||
extern int pgc_error(pgc_t *, int err);
|
||||
|
||||
/* Graphics functions. */
|
||||
extern uint8_t *pgc_vram_addr(pgc_t *, int16_t x, int16_t y);
|
||||
extern void pgc_write_pixel(pgc_t *, uint16_t x, uint16_t y, uint8_t ink);
|
||||
extern uint8_t pgc_read_pixel(pgc_t *, uint16_t x, uint16_t y);
|
||||
extern void pgc_plot(pgc_t *, uint16_t x, uint16_t y);
|
||||
extern uint16_t pgc_draw_line_r(pgc_t *, int32_t x1, int32_t y1,
|
||||
int32_t x2, int32_t y2, uint16_t linemask);
|
||||
extern void pgc_fill_line_r(pgc_t *, int32_t x0, int32_t x1, int32_t y);
|
||||
extern uint16_t pgc_draw_line(pgc_t *, int32_t x1, int32_t y1,
|
||||
int32_t x2, int32_t y2, uint16_t linemask);
|
||||
extern void pgc_draw_ellipse(pgc_t *, int32_t x, int32_t y);
|
||||
extern void pgc_fill_polygon(pgc_t *,
|
||||
unsigned corners, int32_t *x, int32_t *y);
|
||||
extern uint8_t *pgc_vram_addr(pgc_t *, int16_t x, int16_t y);
|
||||
extern void pgc_write_pixel(pgc_t *, uint16_t x, uint16_t y, uint8_t ink);
|
||||
extern uint8_t pgc_read_pixel(pgc_t *, uint16_t x, uint16_t y);
|
||||
extern void pgc_plot(pgc_t *, uint16_t x, uint16_t y);
|
||||
extern uint16_t pgc_draw_line_r(pgc_t *, int32_t x1, int32_t y1,
|
||||
int32_t x2, int32_t y2, uint16_t linemask);
|
||||
extern void pgc_fill_line_r(pgc_t *, int32_t x0, int32_t x1, int32_t y);
|
||||
extern uint16_t pgc_draw_line(pgc_t *, int32_t x1, int32_t y1,
|
||||
int32_t x2, int32_t y2, uint16_t linemask);
|
||||
extern void pgc_draw_ellipse(pgc_t *, int32_t x, int32_t y);
|
||||
extern void pgc_fill_polygon(pgc_t *,
|
||||
unsigned corners, int32_t *x, int32_t *y);
|
||||
|
||||
/* Command and parameter handling functions. */
|
||||
extern int pgc_clist_byte(pgc_t *, uint8_t *val);
|
||||
extern int pgc_cl_append(pgc_cl_t *, uint8_t v);
|
||||
extern int pgc_parse_bytes(pgc_t *, pgc_cl_t *, int p);
|
||||
extern int pgc_parse_words(pgc_t *, pgc_cl_t *, int p);
|
||||
extern int pgc_parse_coords(pgc_t *, pgc_cl_t *, int p);
|
||||
extern int pgc_param_byte(pgc_t *, uint8_t *val);
|
||||
extern int pgc_param_word(pgc_t *, int16_t *val);
|
||||
extern int pgc_param_coord(pgc_t *, int32_t *val);
|
||||
extern int pgc_result_byte(pgc_t *, uint8_t val);
|
||||
extern int pgc_result_word(pgc_t *, int16_t val);
|
||||
extern int pgc_result_coord(pgc_t *, int32_t val);
|
||||
extern int pgc_clist_byte(pgc_t *, uint8_t *val);
|
||||
extern int pgc_cl_append(pgc_cl_t *, uint8_t v);
|
||||
extern int pgc_parse_bytes(pgc_t *, pgc_cl_t *, int p);
|
||||
extern int pgc_parse_words(pgc_t *, pgc_cl_t *, int p);
|
||||
extern int pgc_parse_coords(pgc_t *, pgc_cl_t *, int p);
|
||||
extern int pgc_param_byte(pgc_t *, uint8_t *val);
|
||||
extern int pgc_param_word(pgc_t *, int16_t *val);
|
||||
extern int pgc_param_coord(pgc_t *, int32_t *val);
|
||||
extern int pgc_result_byte(pgc_t *, uint8_t val);
|
||||
extern int pgc_result_word(pgc_t *, int16_t val);
|
||||
extern int pgc_result_coord(pgc_t *, int32_t val);
|
||||
|
||||
/* Special overload functions for non-IBM implementations. */
|
||||
extern void pgc_hndl_lut8(pgc_t *);
|
||||
extern void pgc_hndl_lut8rd(pgc_t *);
|
||||
extern void pgc_hndl_lut8(pgc_t *);
|
||||
extern void pgc_hndl_lut8rd(pgc_t *);
|
||||
|
||||
#endif /*VID_PGC_H*/
|
||||
#endif /*VID_PGC_H*/
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -22,56 +22,55 @@
|
||||
#include <86box/vid_xga.h>
|
||||
|
||||
#ifndef VIDEO_SVGA_H
|
||||
# define VIDEO_SVGA_H
|
||||
# define VIDEO_SVGA_H
|
||||
|
||||
#define FLAG_EXTRA_BANKS 1
|
||||
#define FLAG_ADDR_BY8 2
|
||||
#define FLAG_EXT_WRITE 4
|
||||
#define FLAG_LATCH8 8
|
||||
#define FLAG_NOSKEW 16
|
||||
#define FLAG_ADDR_BY16 32
|
||||
#define FLAG_RAMDAC_SHIFT 64
|
||||
#define FLAG_128K_MASK 128
|
||||
# define FLAG_EXTRA_BANKS 1
|
||||
# define FLAG_ADDR_BY8 2
|
||||
# define FLAG_EXT_WRITE 4
|
||||
# define FLAG_LATCH8 8
|
||||
# define FLAG_NOSKEW 16
|
||||
# define FLAG_ADDR_BY16 32
|
||||
# define FLAG_RAMDAC_SHIFT 64
|
||||
# define FLAG_128K_MASK 128
|
||||
|
||||
typedef struct {
|
||||
int ena,
|
||||
x, y, xoff, yoff, cur_xsize, cur_ysize,
|
||||
v_acc, h_acc;
|
||||
x, y, xoff, yoff, cur_xsize, cur_ysize,
|
||||
v_acc, h_acc;
|
||||
uint32_t addr, pitch;
|
||||
} hwcursor_t;
|
||||
|
||||
typedef union {
|
||||
uint64_t q;
|
||||
uint32_t d[2];
|
||||
uint16_t w[4];
|
||||
uint8_t b[8];
|
||||
uint64_t q;
|
||||
uint32_t d[2];
|
||||
uint16_t w[4];
|
||||
uint8_t b[8];
|
||||
} latch_t;
|
||||
|
||||
typedef struct svga_t
|
||||
{
|
||||
ibm8514_t dev8514;
|
||||
xga_t xga;
|
||||
typedef struct svga_t {
|
||||
ibm8514_t dev8514;
|
||||
xga_t xga;
|
||||
mem_mapping_t mapping;
|
||||
|
||||
uint8_t fast, chain4, chain2_write, chain2_read,
|
||||
ext_overscan, bus_size,
|
||||
lowres, interlace, linedbl, rowcount,
|
||||
set_reset_disabled, bpp, ramdac_type, fb_only,
|
||||
readmode, writemode, readplane,
|
||||
hwcursor_oddeven, dac_hwcursor_oddeven, overlay_oddeven,
|
||||
fcr, hblank_overscan;
|
||||
ext_overscan, bus_size,
|
||||
lowres, interlace, linedbl, rowcount,
|
||||
set_reset_disabled, bpp, ramdac_type, fb_only,
|
||||
readmode, writemode, readplane,
|
||||
hwcursor_oddeven, dac_hwcursor_oddeven, overlay_oddeven,
|
||||
fcr, hblank_overscan;
|
||||
|
||||
int dac_addr, dac_pos, dac_r, dac_g,
|
||||
vtotal, dispend, vsyncstart, split, vblankstart,
|
||||
hdisp, hdisp_old, htotal, hdisp_time, rowoffset,
|
||||
dispon, hdisp_on,
|
||||
vc, sc, linepos, vslines, linecountff, oddeven,
|
||||
con, cursoron, blink, scrollcache, char_width,
|
||||
firstline, lastline, firstline_draw, lastline_draw,
|
||||
displine, fullchange, x_add, y_add, pan,
|
||||
vram_display_mask, vidclock, dots_per_clock, hblank_ext,
|
||||
hwcursor_on, dac_hwcursor_on, overlay_on, set_override,
|
||||
hblankstart, hblankend, hblank_sub, hblank_end_val, hblank_end_len;
|
||||
vtotal, dispend, vsyncstart, split, vblankstart,
|
||||
hdisp, hdisp_old, htotal, hdisp_time, rowoffset,
|
||||
dispon, hdisp_on,
|
||||
vc, sc, linepos, vslines, linecountff, oddeven,
|
||||
con, cursoron, blink, scrollcache, char_width,
|
||||
firstline, lastline, firstline_draw, lastline_draw,
|
||||
displine, fullchange, x_add, y_add, pan,
|
||||
vram_display_mask, vidclock, dots_per_clock, hblank_ext,
|
||||
hwcursor_on, dac_hwcursor_on, overlay_on, set_override,
|
||||
hblankstart, hblankend, hblank_sub, hblank_end_val, hblank_end_len;
|
||||
|
||||
/*The three variables below allow us to implement memory maps like that seen on a 1MB Trio64 :
|
||||
0MB-1MB - VRAM
|
||||
@@ -83,34 +82,34 @@ typedef struct svga_t
|
||||
(present video memory only responds to first 2MB), vram_mask would be 1MB-1 (video memory wraps at 1MB)
|
||||
*/
|
||||
uint32_t decode_mask, vram_max,
|
||||
vram_mask,
|
||||
charseta, charsetb,
|
||||
adv_flags, ma_latch,
|
||||
ca_adj, ma, maback,
|
||||
write_bank, read_bank,
|
||||
extra_banks[2],
|
||||
banked_mask,
|
||||
ca, overscan_color,
|
||||
*map8, pallook[512];
|
||||
vram_mask,
|
||||
charseta, charsetb,
|
||||
adv_flags, ma_latch,
|
||||
ca_adj, ma, maback,
|
||||
write_bank, read_bank,
|
||||
extra_banks[2],
|
||||
banked_mask,
|
||||
ca, overscan_color,
|
||||
*map8, pallook[512];
|
||||
|
||||
PALETTE vgapal;
|
||||
|
||||
uint64_t dispontime, dispofftime;
|
||||
latch_t latch;
|
||||
latch_t latch;
|
||||
|
||||
pc_timer_t timer;
|
||||
|
||||
double clock;
|
||||
|
||||
hwcursor_t hwcursor, hwcursor_latch,
|
||||
dac_hwcursor, dac_hwcursor_latch,
|
||||
overlay, overlay_latch;
|
||||
dac_hwcursor, dac_hwcursor_latch,
|
||||
overlay, overlay_latch;
|
||||
|
||||
void (*render)(struct svga_t *svga);
|
||||
void (*recalctimings_ex)(struct svga_t *svga);
|
||||
|
||||
void (*video_out)(uint16_t addr, uint8_t val, void *p);
|
||||
uint8_t (*video_in) (uint16_t addr, void *p);
|
||||
void (*video_out)(uint16_t addr, uint8_t val, void *p);
|
||||
uint8_t (*video_in)(uint16_t addr, void *p);
|
||||
|
||||
void (*hwcursor_draw)(struct svga_t *svga, int displine);
|
||||
|
||||
@@ -134,23 +133,23 @@ typedef struct svga_t
|
||||
uint32_t (*translate_address)(uint32_t addr, void *p);
|
||||
/*If set then another device is driving the monitor output and the SVGA
|
||||
card should not attempt to display anything */
|
||||
int override;
|
||||
int override;
|
||||
void *p;
|
||||
|
||||
uint8_t crtc[256], gdcreg[256], attrregs[32], seqregs[256],
|
||||
egapal[16],
|
||||
*vram, *changedvram;
|
||||
egapal[16],
|
||||
*vram, *changedvram;
|
||||
|
||||
uint8_t crtcreg, gdcaddr,
|
||||
attrff, attr_palette_enable, attraddr, seqaddr,
|
||||
miscout, cgastat, scrblank,
|
||||
plane_mask, writemask,
|
||||
colourcompare, colournocare,
|
||||
dac_mask, dac_status,
|
||||
dpms, dpms_ui,
|
||||
ksc5601_sbyte_mask, ksc5601_udc_area_msb[2];
|
||||
attrff, attr_palette_enable, attraddr, seqaddr,
|
||||
miscout, cgastat, scrblank,
|
||||
plane_mask, writemask,
|
||||
colourcompare, colournocare,
|
||||
dac_mask, dac_status,
|
||||
dpms, dpms_ui,
|
||||
ksc5601_sbyte_mask, ksc5601_udc_area_msb[2];
|
||||
|
||||
int ksc5601_swap_mode;
|
||||
int ksc5601_swap_mode;
|
||||
uint16_t ksc5601_english_font_type;
|
||||
|
||||
int vertical_linedbl;
|
||||
@@ -158,17 +157,17 @@ typedef struct svga_t
|
||||
/*Used to implement CRTC[0x17] bit 2 hsync divisor*/
|
||||
int hsync_divisor;
|
||||
|
||||
/*Tseng-style chain4 mode - CRTC dword mode is the same as byte mode, chain4
|
||||
addresses are shifted to match*/
|
||||
int packed_chain4;
|
||||
/*Tseng-style chain4 mode - CRTC dword mode is the same as byte mode, chain4
|
||||
addresses are shifted to match*/
|
||||
int packed_chain4;
|
||||
|
||||
/*Force CRTC to dword mode, regardless of CR14/CR17. Required for S3 enhanced mode*/
|
||||
int force_dword_mode;
|
||||
/*Force CRTC to dword mode, regardless of CR14/CR17. Required for S3 enhanced mode*/
|
||||
int force_dword_mode;
|
||||
|
||||
int force_old_addr;
|
||||
int force_old_addr;
|
||||
|
||||
int remap_required;
|
||||
uint32_t (*remap_func)(struct svga_t *svga, uint32_t in_addr);
|
||||
int remap_required;
|
||||
uint32_t (*remap_func)(struct svga_t *svga, uint32_t in_addr);
|
||||
|
||||
void *ramdac, *clock_gen;
|
||||
} svga_t;
|
||||
@@ -181,118 +180,116 @@ extern void ibm8514_recalctimings(svga_t *svga);
|
||||
extern void xga_poll(xga_t *xga, svga_t *svga);
|
||||
extern void xga_recalctimings(svga_t *svga);
|
||||
|
||||
extern int svga_init(const device_t *info, svga_t *svga, void *p, int memsize,
|
||||
void (*recalctimings_ex)(struct svga_t *svga),
|
||||
uint8_t (*video_in) (uint16_t addr, void *p),
|
||||
void (*video_out)(uint16_t addr, uint8_t val, void *p),
|
||||
void (*hwcursor_draw)(struct svga_t *svga, int displine),
|
||||
void (*overlay_draw)(struct svga_t *svga, int displine));
|
||||
extern void svga_recalctimings(svga_t *svga);
|
||||
extern void svga_close(svga_t *svga);
|
||||
extern int svga_init(const device_t *info, svga_t *svga, void *p, int memsize,
|
||||
void (*recalctimings_ex)(struct svga_t *svga),
|
||||
uint8_t (*video_in)(uint16_t addr, void *p),
|
||||
void (*video_out)(uint16_t addr, uint8_t val, void *p),
|
||||
void (*hwcursor_draw)(struct svga_t *svga, int displine),
|
||||
void (*overlay_draw)(struct svga_t *svga, int displine));
|
||||
extern void svga_recalctimings(svga_t *svga);
|
||||
extern void svga_close(svga_t *svga);
|
||||
|
||||
uint8_t svga_read(uint32_t addr, void *p);
|
||||
uint16_t svga_readw(uint32_t addr, void *p);
|
||||
uint32_t svga_readl(uint32_t addr, void *p);
|
||||
void svga_write(uint32_t addr, uint8_t val, void *p);
|
||||
void svga_writew(uint32_t addr, uint16_t val, void *p);
|
||||
void svga_writel(uint32_t addr, uint32_t val, void *p);
|
||||
uint8_t svga_read_linear(uint32_t addr, void *p);
|
||||
uint8_t svga_readb_linear(uint32_t addr, void *p);
|
||||
uint16_t svga_readw_linear(uint32_t addr, void *p);
|
||||
uint32_t svga_readl_linear(uint32_t addr, void *p);
|
||||
void svga_write_linear(uint32_t addr, uint8_t val, void *p);
|
||||
void svga_writeb_linear(uint32_t addr, uint8_t val, void *p);
|
||||
void svga_writew_linear(uint32_t addr, uint16_t val, void *p);
|
||||
void svga_writel_linear(uint32_t addr, uint32_t val, void *p);
|
||||
uint8_t svga_read(uint32_t addr, void *p);
|
||||
uint16_t svga_readw(uint32_t addr, void *p);
|
||||
uint32_t svga_readl(uint32_t addr, void *p);
|
||||
void svga_write(uint32_t addr, uint8_t val, void *p);
|
||||
void svga_writew(uint32_t addr, uint16_t val, void *p);
|
||||
void svga_writel(uint32_t addr, uint32_t val, void *p);
|
||||
uint8_t svga_read_linear(uint32_t addr, void *p);
|
||||
uint8_t svga_readb_linear(uint32_t addr, void *p);
|
||||
uint16_t svga_readw_linear(uint32_t addr, void *p);
|
||||
uint32_t svga_readl_linear(uint32_t addr, void *p);
|
||||
void svga_write_linear(uint32_t addr, uint8_t val, void *p);
|
||||
void svga_writeb_linear(uint32_t addr, uint8_t val, void *p);
|
||||
void svga_writew_linear(uint32_t addr, uint16_t val, void *p);
|
||||
void svga_writel_linear(uint32_t addr, uint32_t val, void *p);
|
||||
|
||||
void svga_add_status_info(char *s, int max_len, void *p);
|
||||
void svga_add_status_info(char *s, int max_len, void *p);
|
||||
|
||||
extern uint8_t svga_rotate[8][256];
|
||||
extern uint8_t svga_rotate[8][256];
|
||||
|
||||
void svga_out(uint16_t addr, uint8_t val, void *p);
|
||||
uint8_t svga_in(uint16_t addr, void *p);
|
||||
void svga_out(uint16_t addr, uint8_t val, void *p);
|
||||
uint8_t svga_in(uint16_t addr, void *p);
|
||||
|
||||
svga_t *svga_get_pri();
|
||||
void svga_set_override(svga_t *svga, int val);
|
||||
svga_t *svga_get_pri();
|
||||
void svga_set_override(svga_t *svga, int val);
|
||||
|
||||
void svga_set_ramdac_type(svga_t *svga, int type);
|
||||
void svga_close(svga_t *svga);
|
||||
void svga_set_ramdac_type(svga_t *svga, int type);
|
||||
void svga_close(svga_t *svga);
|
||||
|
||||
uint32_t svga_mask_addr(uint32_t addr, svga_t *svga);
|
||||
uint32_t svga_mask_changedaddr(uint32_t addr, svga_t *svga);
|
||||
|
||||
void svga_doblit(int wx, int wy, svga_t *svga);
|
||||
uint32_t svga_mask_addr(uint32_t addr, svga_t *svga);
|
||||
uint32_t svga_mask_changedaddr(uint32_t addr, svga_t *svga);
|
||||
|
||||
void svga_doblit(int wx, int wy, svga_t *svga);
|
||||
|
||||
enum {
|
||||
RAMDAC_6BIT = 0,
|
||||
RAMDAC_8BIT
|
||||
};
|
||||
|
||||
|
||||
/* We need a way to add a device with a pointer to a parent device so it can attach itself to it, and
|
||||
possibly also a second ATi 68860 RAM DAC type that auto-sets SVGA render on RAM DAC render change. */
|
||||
extern void ati68860_ramdac_out(uint16_t addr, uint8_t val, void *p, svga_t *svga);
|
||||
extern uint8_t ati68860_ramdac_in(uint16_t addr, void *p, svga_t *svga);
|
||||
extern void ati68860_set_ramdac_type(void *p, int type);
|
||||
extern void ati68860_ramdac_set_render(void *p, svga_t *svga);
|
||||
extern void ati68860_ramdac_set_pallook(void *p, int i, uint32_t col);
|
||||
extern void ati68860_hwcursor_draw(svga_t *svga, int displine);
|
||||
extern void ati68860_ramdac_out(uint16_t addr, uint8_t val, void *p, svga_t *svga);
|
||||
extern uint8_t ati68860_ramdac_in(uint16_t addr, void *p, svga_t *svga);
|
||||
extern void ati68860_set_ramdac_type(void *p, int type);
|
||||
extern void ati68860_ramdac_set_render(void *p, svga_t *svga);
|
||||
extern void ati68860_ramdac_set_pallook(void *p, int i, uint32_t col);
|
||||
extern void ati68860_hwcursor_draw(svga_t *svga, int displine);
|
||||
|
||||
extern void att49x_ramdac_out(uint16_t addr, int rs2, uint8_t val, void *p, svga_t *svga);
|
||||
extern uint8_t att49x_ramdac_in(uint16_t addr, int rs2, void *p, svga_t *svga);
|
||||
extern void att49x_ramdac_out(uint16_t addr, int rs2, uint8_t val, void *p, svga_t *svga);
|
||||
extern uint8_t att49x_ramdac_in(uint16_t addr, int rs2, void *p, svga_t *svga);
|
||||
|
||||
extern void att498_ramdac_out(uint16_t addr, int rs2, uint8_t val, void *p, svga_t *svga);
|
||||
extern uint8_t att498_ramdac_in(uint16_t addr, int rs2, void *p, svga_t *svga);
|
||||
extern float av9194_getclock(int clock, void *p);
|
||||
extern void att498_ramdac_out(uint16_t addr, int rs2, uint8_t val, void *p, svga_t *svga);
|
||||
extern uint8_t att498_ramdac_in(uint16_t addr, int rs2, void *p, svga_t *svga);
|
||||
extern float av9194_getclock(int clock, void *p);
|
||||
|
||||
extern void bt48x_ramdac_out(uint16_t addr, int rs2, int rs3, uint8_t val, void *p, svga_t *svga);
|
||||
extern uint8_t bt48x_ramdac_in(uint16_t addr, int rs2, int rs3, void *p, svga_t *svga);
|
||||
extern void bt48x_recalctimings(void *p, svga_t *svga);
|
||||
extern void bt48x_hwcursor_draw(svga_t *svga, int displine);
|
||||
extern void bt48x_ramdac_out(uint16_t addr, int rs2, int rs3, uint8_t val, void *p, svga_t *svga);
|
||||
extern uint8_t bt48x_ramdac_in(uint16_t addr, int rs2, int rs3, void *p, svga_t *svga);
|
||||
extern void bt48x_recalctimings(void *p, svga_t *svga);
|
||||
extern void bt48x_hwcursor_draw(svga_t *svga, int displine);
|
||||
|
||||
extern void ibm_rgb528_ramdac_out(uint16_t addr, int rs2, uint8_t val, void *p, svga_t *svga);
|
||||
extern uint8_t ibm_rgb528_ramdac_in(uint16_t addr, int rs2, void *p, svga_t *svga);
|
||||
extern void ibm_rgb528_recalctimings(void *p, svga_t *svga);
|
||||
extern void ibm_rgb528_hwcursor_draw(svga_t *svga, int displine);
|
||||
extern void ibm_rgb528_ramdac_out(uint16_t addr, int rs2, uint8_t val, void *p, svga_t *svga);
|
||||
extern uint8_t ibm_rgb528_ramdac_in(uint16_t addr, int rs2, void *p, svga_t *svga);
|
||||
extern void ibm_rgb528_recalctimings(void *p, svga_t *svga);
|
||||
extern void ibm_rgb528_hwcursor_draw(svga_t *svga, int displine);
|
||||
|
||||
extern void icd2061_write(void *p, int val);
|
||||
extern float icd2061_getclock(int clock, void *p);
|
||||
extern void icd2061_write(void *p, int val);
|
||||
extern float icd2061_getclock(int clock, void *p);
|
||||
|
||||
/* The code is the same, the #define's are so that the correct name can be used. */
|
||||
#define ics9161_write icd2061_write
|
||||
#define ics9161_getclock icd2061_getclock
|
||||
# define ics9161_write icd2061_write
|
||||
# define ics9161_getclock icd2061_getclock
|
||||
|
||||
extern float ics2494_getclock(int clock, void *p);
|
||||
extern float ics2494_getclock(int clock, void *p);
|
||||
|
||||
extern void ics2595_write(void *p, int strobe, int dat);
|
||||
extern double ics2595_getclock(void *p);
|
||||
extern void ics2595_setclock(void *p, double clock);
|
||||
extern void ics2595_write(void *p, int strobe, int dat);
|
||||
extern double ics2595_getclock(void *p);
|
||||
extern void ics2595_setclock(void *p, double clock);
|
||||
|
||||
extern void sc1148x_ramdac_out(uint16_t addr, int rs2, uint8_t val, void *p, svga_t *svga);
|
||||
extern uint8_t sc1148x_ramdac_in(uint16_t addr, int rs2, void *p, svga_t *svga);
|
||||
extern void sc1148x_ramdac_out(uint16_t addr, int rs2, uint8_t val, void *p, svga_t *svga);
|
||||
extern uint8_t sc1148x_ramdac_in(uint16_t addr, int rs2, void *p, svga_t *svga);
|
||||
|
||||
extern void sc1502x_ramdac_out(uint16_t addr, uint8_t val, void *p, svga_t *svga);
|
||||
extern uint8_t sc1502x_ramdac_in(uint16_t addr, void *p, svga_t *svga);
|
||||
extern void sc1502x_ramdac_out(uint16_t addr, uint8_t val, void *p, svga_t *svga);
|
||||
extern uint8_t sc1502x_ramdac_in(uint16_t addr, void *p, svga_t *svga);
|
||||
|
||||
extern void sdac_ramdac_out(uint16_t addr, int rs2, uint8_t val, void *p, svga_t *svga);
|
||||
extern uint8_t sdac_ramdac_in(uint16_t addr, int rs2, void *p, svga_t *svga);
|
||||
extern float sdac_getclock(int clock, void *p);
|
||||
extern void sdac_ramdac_out(uint16_t addr, int rs2, uint8_t val, void *p, svga_t *svga);
|
||||
extern uint8_t sdac_ramdac_in(uint16_t addr, int rs2, void *p, svga_t *svga);
|
||||
extern float sdac_getclock(int clock, void *p);
|
||||
|
||||
extern void stg_ramdac_out(uint16_t addr, uint8_t val, void *p, svga_t *svga);
|
||||
extern uint8_t stg_ramdac_in(uint16_t addr, void *p, svga_t *svga);
|
||||
extern float stg_getclock(int clock, void *p);
|
||||
extern void stg_ramdac_out(uint16_t addr, uint8_t val, void *p, svga_t *svga);
|
||||
extern uint8_t stg_ramdac_in(uint16_t addr, void *p, svga_t *svga);
|
||||
extern float stg_getclock(int clock, void *p);
|
||||
|
||||
extern void tkd8001_ramdac_out(uint16_t addr, uint8_t val, void *p, svga_t *svga);
|
||||
extern uint8_t tkd8001_ramdac_in(uint16_t addr, void *p, svga_t *svga);
|
||||
extern void tkd8001_ramdac_out(uint16_t addr, uint8_t val, void *p, svga_t *svga);
|
||||
extern uint8_t tkd8001_ramdac_in(uint16_t addr, void *p, svga_t *svga);
|
||||
|
||||
extern void tvp3026_ramdac_out(uint16_t addr, int rs2, int rs3, uint8_t val, void *p, svga_t *svga);
|
||||
extern void tvp3026_ramdac_out(uint16_t addr, int rs2, int rs3, uint8_t val, void *p, svga_t *svga);
|
||||
extern uint8_t tvp3026_ramdac_in(uint16_t addr, int rs2, int rs3, void *p, svga_t *svga);
|
||||
extern void tvp3026_recalctimings(void *p, svga_t *svga);
|
||||
extern void tvp3026_hwcursor_draw(svga_t *svga, int displine);
|
||||
extern float tvp3026_getclock(int clock, void *p);
|
||||
extern void tvp3026_recalctimings(void *p, svga_t *svga);
|
||||
extern void tvp3026_hwcursor_draw(svga_t *svga, int displine);
|
||||
extern float tvp3026_getclock(int clock, void *p);
|
||||
|
||||
#ifdef EMU_DEVICE_H
|
||||
# ifdef EMU_DEVICE_H
|
||||
extern const device_t ati68860_ramdac_device;
|
||||
extern const device_t att490_ramdac_device;
|
||||
extern const device_t att491_ramdac_device;
|
||||
@@ -321,6 +318,6 @@ extern const device_t tkd8001_ramdac_device;
|
||||
extern const device_t tseng_ics5301_ramdac_device;
|
||||
extern const device_t tseng_ics5341_ramdac_device;
|
||||
extern const device_t tvp3026_ramdac_device;
|
||||
#endif
|
||||
# endif
|
||||
|
||||
#endif /*VIDEO_SVGA_H*/
|
||||
#endif /*VIDEO_SVGA_H*/
|
||||
|
||||
@@ -17,14 +17,14 @@
|
||||
*/
|
||||
|
||||
#ifndef VIDEO_SVGA_RENDER_H
|
||||
# define VIDEO_SVGA_RENDER_H
|
||||
#define VIDEO_SVGA_RENDER_H
|
||||
|
||||
extern int firstline_draw, lastline_draw;
|
||||
extern int displine;
|
||||
extern int sc;
|
||||
|
||||
extern uint32_t ma, ca;
|
||||
extern int con, cursoron, cgablink;
|
||||
extern int con, cursoron, cgablink;
|
||||
|
||||
extern int scrollcache;
|
||||
|
||||
|
||||
@@ -7,14 +7,14 @@
|
||||
*/
|
||||
|
||||
#ifndef VIDEO_SVGA_RENDER_REMAP_H
|
||||
# define VIDEO_SVGA_RENDER_REMAP_H
|
||||
#define VIDEO_SVGA_RENDER_REMAP_H
|
||||
|
||||
//S3 - enhanced mode mappings CR31.3 can force doubleword mode
|
||||
//Cirrus Logic handles SVGA writes seperately
|
||||
//S3, CL, TGUI blitters need checking
|
||||
// S3 - enhanced mode mappings CR31.3 can force doubleword mode
|
||||
// Cirrus Logic handles SVGA writes seperately
|
||||
// S3, CL, TGUI blitters need checking
|
||||
|
||||
//CL, S3, Mach64, ET4000, Banshee, TGUI all okay
|
||||
//Still to check - ViRGE, HT216
|
||||
// CL, S3, Mach64, ET4000, Banshee, TGUI all okay
|
||||
// Still to check - ViRGE, HT216
|
||||
#define VAR_BYTE_MODE (0 << 0)
|
||||
#define VAR_WORD_MODE_MA13 (1 << 0)
|
||||
#define VAR_WORD_MODE_MA15 (2 << 0)
|
||||
@@ -23,45 +23,36 @@
|
||||
#define VAR_ROW0_MA13 (1 << 2)
|
||||
#define VAR_ROW1_MA14 (1 << 3)
|
||||
|
||||
#define ADDRESS_REMAP_FUNC(nr) \
|
||||
static uint32_t address_remap_func_ ## nr(svga_t *svga, uint32_t in_addr) \
|
||||
{ \
|
||||
uint32_t out_addr; \
|
||||
\
|
||||
switch (nr & VAR_MODE_MASK) \
|
||||
{ \
|
||||
case VAR_BYTE_MODE: \
|
||||
out_addr = in_addr; \
|
||||
break; \
|
||||
\
|
||||
case VAR_WORD_MODE_MA13: \
|
||||
out_addr = ((in_addr << 1) & 0x1fff8) | \
|
||||
((in_addr >> 13) & 0x4) | \
|
||||
(in_addr & ~0x1ffff); \
|
||||
break; \
|
||||
\
|
||||
case VAR_WORD_MODE_MA15: \
|
||||
out_addr = ((in_addr << 1) & 0x1fff8) | \
|
||||
((in_addr >> 15) & 0x4) | \
|
||||
(in_addr & ~0x1ffff); \
|
||||
break; \
|
||||
\
|
||||
case VAR_DWORD_MODE: \
|
||||
out_addr = ((in_addr << 2) & 0x3fff0) | \
|
||||
((in_addr >> 14) & 0xc) | \
|
||||
(in_addr & ~0x3ffff); \
|
||||
break; \
|
||||
} \
|
||||
\
|
||||
if (nr & VAR_ROW0_MA13) \
|
||||
out_addr = (out_addr & ~0x8000) | \
|
||||
((svga->sc & 1) ? 0x8000 : 0); \
|
||||
if (nr & VAR_ROW1_MA14) \
|
||||
out_addr = (out_addr & ~0x10000) | \
|
||||
((svga->sc & 2) ? 0x10000 : 0); \
|
||||
\
|
||||
return out_addr; \
|
||||
}
|
||||
#define ADDRESS_REMAP_FUNC(nr) \
|
||||
static uint32_t address_remap_func_##nr(svga_t *svga, uint32_t in_addr) \
|
||||
{ \
|
||||
uint32_t out_addr; \
|
||||
\
|
||||
switch (nr & VAR_MODE_MASK) { \
|
||||
case VAR_BYTE_MODE: \
|
||||
out_addr = in_addr; \
|
||||
break; \
|
||||
\
|
||||
case VAR_WORD_MODE_MA13: \
|
||||
out_addr = ((in_addr << 1) & 0x1fff8) | ((in_addr >> 13) & 0x4) | (in_addr & ~0x1ffff); \
|
||||
break; \
|
||||
\
|
||||
case VAR_WORD_MODE_MA15: \
|
||||
out_addr = ((in_addr << 1) & 0x1fff8) | ((in_addr >> 15) & 0x4) | (in_addr & ~0x1ffff); \
|
||||
break; \
|
||||
\
|
||||
case VAR_DWORD_MODE: \
|
||||
out_addr = ((in_addr << 2) & 0x3fff0) | ((in_addr >> 14) & 0xc) | (in_addr & ~0x3ffff); \
|
||||
break; \
|
||||
} \
|
||||
\
|
||||
if (nr & VAR_ROW0_MA13) \
|
||||
out_addr = (out_addr & ~0x8000) | ((svga->sc & 1) ? 0x8000 : 0); \
|
||||
if (nr & VAR_ROW1_MA14) \
|
||||
out_addr = (out_addr & ~0x10000) | ((svga->sc & 2) ? 0x10000 : 0); \
|
||||
\
|
||||
return out_addr; \
|
||||
}
|
||||
|
||||
ADDRESS_REMAP_FUNC(0)
|
||||
ADDRESS_REMAP_FUNC(1)
|
||||
@@ -80,52 +71,52 @@ ADDRESS_REMAP_FUNC(13)
|
||||
ADDRESS_REMAP_FUNC(14)
|
||||
ADDRESS_REMAP_FUNC(15)
|
||||
|
||||
static uint32_t (*address_remap_funcs[16])(svga_t *svga, uint32_t in_addr) =
|
||||
{
|
||||
address_remap_func_0,
|
||||
address_remap_func_1,
|
||||
address_remap_func_2,
|
||||
address_remap_func_3,
|
||||
address_remap_func_4,
|
||||
address_remap_func_5,
|
||||
address_remap_func_6,
|
||||
address_remap_func_7,
|
||||
address_remap_func_8,
|
||||
address_remap_func_9,
|
||||
address_remap_func_10,
|
||||
address_remap_func_11,
|
||||
address_remap_func_12,
|
||||
address_remap_func_13,
|
||||
address_remap_func_14,
|
||||
address_remap_func_15
|
||||
static uint32_t (*address_remap_funcs[16])(svga_t *svga, uint32_t in_addr) = {
|
||||
address_remap_func_0,
|
||||
address_remap_func_1,
|
||||
address_remap_func_2,
|
||||
address_remap_func_3,
|
||||
address_remap_func_4,
|
||||
address_remap_func_5,
|
||||
address_remap_func_6,
|
||||
address_remap_func_7,
|
||||
address_remap_func_8,
|
||||
address_remap_func_9,
|
||||
address_remap_func_10,
|
||||
address_remap_func_11,
|
||||
address_remap_func_12,
|
||||
address_remap_func_13,
|
||||
address_remap_func_14,
|
||||
address_remap_func_15
|
||||
};
|
||||
|
||||
void svga_recalc_remap_func(svga_t *svga)
|
||||
void
|
||||
svga_recalc_remap_func(svga_t *svga)
|
||||
{
|
||||
int func_nr;
|
||||
int func_nr;
|
||||
|
||||
if (svga->fb_only)
|
||||
func_nr = 0;
|
||||
else {
|
||||
if (svga->force_dword_mode)
|
||||
func_nr = VAR_DWORD_MODE;
|
||||
else if (svga->crtc[0x14] & 0x40)
|
||||
func_nr = svga->packed_chain4 ? VAR_BYTE_MODE : VAR_DWORD_MODE;
|
||||
else if (svga->crtc[0x17] & 0x40)
|
||||
func_nr = VAR_BYTE_MODE;
|
||||
else if (svga->crtc[0x17] & 0x20)
|
||||
func_nr = VAR_WORD_MODE_MA15;
|
||||
else
|
||||
func_nr = VAR_WORD_MODE_MA13;
|
||||
if (svga->fb_only)
|
||||
func_nr = 0;
|
||||
else {
|
||||
if (svga->force_dword_mode)
|
||||
func_nr = VAR_DWORD_MODE;
|
||||
else if (svga->crtc[0x14] & 0x40)
|
||||
func_nr = svga->packed_chain4 ? VAR_BYTE_MODE : VAR_DWORD_MODE;
|
||||
else if (svga->crtc[0x17] & 0x40)
|
||||
func_nr = VAR_BYTE_MODE;
|
||||
else if (svga->crtc[0x17] & 0x20)
|
||||
func_nr = VAR_WORD_MODE_MA15;
|
||||
else
|
||||
func_nr = VAR_WORD_MODE_MA13;
|
||||
|
||||
if (!(svga->crtc[0x17] & 0x01))
|
||||
func_nr |= VAR_ROW0_MA13;
|
||||
if (!(svga->crtc[0x17] & 0x02))
|
||||
func_nr |= VAR_ROW1_MA14;
|
||||
}
|
||||
if (!(svga->crtc[0x17] & 0x01))
|
||||
func_nr |= VAR_ROW0_MA13;
|
||||
if (!(svga->crtc[0x17] & 0x02))
|
||||
func_nr |= VAR_ROW1_MA14;
|
||||
}
|
||||
|
||||
svga->remap_required = (func_nr != 0);
|
||||
svga->remap_func = address_remap_funcs[func_nr];
|
||||
svga->remap_required = (func_nr != 0);
|
||||
svga->remap_func = address_remap_funcs[func_nr];
|
||||
}
|
||||
|
||||
#endif /*VIDEO_RENDER_REMAP_H*/
|
||||
|
||||
@@ -18,18 +18,17 @@
|
||||
*/
|
||||
|
||||
#ifndef VIDEO_VGA_H
|
||||
# define VIDEO_VGA_H
|
||||
#define VIDEO_VGA_H
|
||||
|
||||
typedef struct vga_t
|
||||
{
|
||||
svga_t svga;
|
||||
typedef struct vga_t {
|
||||
svga_t svga;
|
||||
|
||||
rom_t bios_rom;
|
||||
rom_t bios_rom;
|
||||
} vga_t;
|
||||
|
||||
static video_timings_t timing_vga = {VIDEO_ISA, 8, 16, 32, 8, 16, 32};
|
||||
static video_timings_t timing_vga = { VIDEO_ISA, 8, 16, 32, 8, 16, 32 };
|
||||
|
||||
void vga_out(uint16_t addr, uint8_t val, void *p);
|
||||
void vga_out(uint16_t addr, uint8_t val, void *p);
|
||||
uint8_t vga_in(uint16_t addr, void *p);
|
||||
|
||||
#endif /*VIDEO_VGA_H*/
|
||||
#endif /*VIDEO_VGA_H*/
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
*/
|
||||
|
||||
#ifndef VIDEO_VOODOO_BANSHEE_H
|
||||
# define VIDEO_VOODOO_BANSHEE_H
|
||||
#define VIDEO_VOODOO_BANSHEE_H
|
||||
|
||||
void banshee_set_overlay_addr(void *p, uint32_t addr);
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
*/
|
||||
|
||||
#ifndef VIDEO_VOODOO_BANSHEE_BLITTER_H
|
||||
# define VIDEO_VOODOO_BANSHEE_BLITTER_H
|
||||
#define VIDEO_VOODOO_BANSHEE_BLITTER_H
|
||||
|
||||
void voodoo_2d_reg_writel(voodoo_t *voodoo, uint32_t addr, uint32_t val);
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
*/
|
||||
|
||||
#ifndef VIDEO_VOODOO_BLITTER_H
|
||||
# define VIDEO_VOODOO_BLITTER_H
|
||||
#define VIDEO_VOODOO_BLITTER_H
|
||||
|
||||
void voodoo_v2_blit_start(voodoo_t *voodoo);
|
||||
void voodoo_v2_blit_data(voodoo_t *voodoo, uint32_t data);
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -17,79 +17,72 @@
|
||||
*/
|
||||
|
||||
#ifndef VIDEO_VOODOO_COMMON_H
|
||||
# define VIDEO_VOODOO_COMMON_H
|
||||
#define VIDEO_VOODOO_COMMON_H
|
||||
|
||||
#ifdef CLAMP
|
||||
#undef CLAMP
|
||||
# undef CLAMP
|
||||
#endif
|
||||
|
||||
#define CLAMP(x) (((x) < 0) ? 0 : (((x) > 0xff) ? 0xff : (x)))
|
||||
#define CLAMP16(x) (((x) < 0) ? 0 : (((x) > 0xffff) ? 0xffff : (x)))
|
||||
#define CLAMP(x) (((x) < 0) ? 0 : (((x) > 0xff) ? 0xff : (x)))
|
||||
#define CLAMP16(x) (((x) < 0) ? 0 : (((x) > 0xffff) ? 0xffff : (x)))
|
||||
|
||||
|
||||
#define LOD_MAX 8
|
||||
#define LOD_MAX 8
|
||||
|
||||
#define TEX_DIRTY_SHIFT 10
|
||||
|
||||
#define TEX_CACHE_MAX 64
|
||||
#define TEX_CACHE_MAX 64
|
||||
|
||||
enum
|
||||
{
|
||||
VOODOO_1 = 0,
|
||||
VOODOO_SB50,
|
||||
VOODOO_2,
|
||||
VOODOO_BANSHEE,
|
||||
VOODOO_3
|
||||
enum {
|
||||
VOODOO_1 = 0,
|
||||
VOODOO_SB50,
|
||||
VOODOO_2,
|
||||
VOODOO_BANSHEE,
|
||||
VOODOO_3
|
||||
};
|
||||
|
||||
typedef union int_float
|
||||
{
|
||||
uint32_t i;
|
||||
float f;
|
||||
typedef union int_float {
|
||||
uint32_t i;
|
||||
float f;
|
||||
} int_float;
|
||||
|
||||
typedef struct rgbvoodoo_t
|
||||
{
|
||||
uint8_t b, g, r;
|
||||
uint8_t pad;
|
||||
typedef struct rgbvoodoo_t {
|
||||
uint8_t b, g, r;
|
||||
uint8_t pad;
|
||||
} rgbvoodoo_t;
|
||||
typedef struct rgba8_t
|
||||
{
|
||||
uint8_t b, g, r, a;
|
||||
typedef struct rgba8_t {
|
||||
uint8_t b, g, r, a;
|
||||
} rgba8_t;
|
||||
|
||||
typedef union rgba_u
|
||||
{
|
||||
struct
|
||||
{
|
||||
uint8_t b, g, r, a;
|
||||
} rgba;
|
||||
uint32_t u;
|
||||
typedef union rgba_u {
|
||||
struct
|
||||
{
|
||||
uint8_t b, g, r, a;
|
||||
} rgba;
|
||||
uint32_t u;
|
||||
} rgba_u;
|
||||
|
||||
#define FIFO_SIZE 65536
|
||||
#define FIFO_MASK (FIFO_SIZE - 1)
|
||||
#define FIFO_SIZE 65536
|
||||
#define FIFO_MASK (FIFO_SIZE - 1)
|
||||
#define FIFO_ENTRY_SIZE (1 << 31)
|
||||
|
||||
#define FIFO_ENTRIES (voodoo->fifo_write_idx - voodoo->fifo_read_idx)
|
||||
#define FIFO_FULL ((voodoo->fifo_write_idx - voodoo->fifo_read_idx) >= FIFO_SIZE-4)
|
||||
#define FIFO_EMPTY (voodoo->fifo_read_idx == voodoo->fifo_write_idx)
|
||||
#define FIFO_ENTRIES (voodoo->fifo_write_idx - voodoo->fifo_read_idx)
|
||||
#define FIFO_FULL ((voodoo->fifo_write_idx - voodoo->fifo_read_idx) >= FIFO_SIZE - 4)
|
||||
#define FIFO_EMPTY (voodoo->fifo_read_idx == voodoo->fifo_write_idx)
|
||||
|
||||
#define FIFO_TYPE 0xff000000
|
||||
#define FIFO_ADDR 0x00ffffff
|
||||
#define FIFO_TYPE 0xff000000
|
||||
#define FIFO_ADDR 0x00ffffff
|
||||
|
||||
enum
|
||||
{
|
||||
FIFO_INVALID = (0x00 << 24),
|
||||
FIFO_WRITEL_REG = (0x01 << 24),
|
||||
FIFO_WRITEW_FB = (0x02 << 24),
|
||||
FIFO_WRITEL_FB = (0x03 << 24),
|
||||
FIFO_WRITEL_TEX = (0x04 << 24),
|
||||
FIFO_WRITEL_2DREG = (0x05 << 24)
|
||||
enum {
|
||||
FIFO_INVALID = (0x00 << 24),
|
||||
FIFO_WRITEL_REG = (0x01 << 24),
|
||||
FIFO_WRITEW_FB = (0x02 << 24),
|
||||
FIFO_WRITEL_FB = (0x03 << 24),
|
||||
FIFO_WRITEL_TEX = (0x04 << 24),
|
||||
FIFO_WRITEL_2DREG = (0x05 << 24)
|
||||
};
|
||||
|
||||
#define PARAM_SIZE 1024
|
||||
#define PARAM_MASK (PARAM_SIZE - 1)
|
||||
#define PARAM_SIZE 1024
|
||||
#define PARAM_MASK (PARAM_SIZE - 1)
|
||||
#define PARAM_ENTRY_SIZE (1 << 31)
|
||||
|
||||
#define PARAM_ENTRIES(x) (voodoo->params_write_idx - voodoo->params_read_idx[x])
|
||||
@@ -98,438 +91,430 @@ enum
|
||||
|
||||
typedef struct
|
||||
{
|
||||
uint32_t addr_type;
|
||||
uint32_t val;
|
||||
uint32_t addr_type;
|
||||
uint32_t val;
|
||||
} fifo_entry_t;
|
||||
|
||||
typedef struct voodoo_params_t
|
||||
{
|
||||
int command;
|
||||
typedef struct voodoo_params_t {
|
||||
int command;
|
||||
|
||||
int32_t vertexAx, vertexAy, vertexBx, vertexBy, vertexCx, vertexCy;
|
||||
int32_t vertexAx, vertexAy, vertexBx, vertexBy, vertexCx, vertexCy;
|
||||
|
||||
uint32_t startR, startG, startB, startZ, startA;
|
||||
uint32_t startR, startG, startB, startZ, startA;
|
||||
|
||||
int32_t dBdX, dGdX, dRdX, dAdX, dZdX;
|
||||
int32_t dBdX, dGdX, dRdX, dAdX, dZdX;
|
||||
|
||||
int32_t dBdY, dGdY, dRdY, dAdY, dZdY;
|
||||
int32_t dBdY, dGdY, dRdY, dAdY, dZdY;
|
||||
|
||||
int64_t startW, dWdX, dWdY;
|
||||
int64_t startW, dWdX, dWdY;
|
||||
|
||||
struct
|
||||
{
|
||||
int64_t startS, startT, startW, p1;
|
||||
int64_t dSdX, dTdX, dWdX, p2;
|
||||
int64_t dSdY, dTdY, dWdY, p3;
|
||||
} tmu[2];
|
||||
struct
|
||||
{
|
||||
int64_t startS, startT, startW, p1;
|
||||
int64_t dSdX, dTdX, dWdX, p2;
|
||||
int64_t dSdY, dTdY, dWdY, p3;
|
||||
} tmu[2];
|
||||
|
||||
uint32_t color0, color1;
|
||||
uint32_t color0, color1;
|
||||
|
||||
uint32_t fbzMode;
|
||||
uint32_t fbzColorPath;
|
||||
uint32_t fbzMode;
|
||||
uint32_t fbzColorPath;
|
||||
|
||||
uint32_t fogMode;
|
||||
rgbvoodoo_t fogColor;
|
||||
struct
|
||||
{
|
||||
uint8_t fog, dfog;
|
||||
} fogTable[64];
|
||||
uint32_t fogMode;
|
||||
rgbvoodoo_t fogColor;
|
||||
struct
|
||||
{
|
||||
uint8_t fog, dfog;
|
||||
} fogTable[64];
|
||||
|
||||
uint32_t alphaMode;
|
||||
uint32_t alphaMode;
|
||||
|
||||
uint32_t zaColor;
|
||||
uint32_t zaColor;
|
||||
|
||||
int chromaKey_r, chromaKey_g, chromaKey_b;
|
||||
uint32_t chromaKey;
|
||||
int chromaKey_r, chromaKey_g, chromaKey_b;
|
||||
uint32_t chromaKey;
|
||||
|
||||
uint32_t textureMode[2];
|
||||
uint32_t tLOD[2];
|
||||
uint32_t textureMode[2];
|
||||
uint32_t tLOD[2];
|
||||
|
||||
uint32_t texBaseAddr[2], texBaseAddr1[2], texBaseAddr2[2], texBaseAddr38[2];
|
||||
uint32_t texBaseAddr[2], texBaseAddr1[2], texBaseAddr2[2], texBaseAddr38[2];
|
||||
|
||||
uint32_t tex_base[2][LOD_MAX+2];
|
||||
uint32_t tex_end[2][LOD_MAX+2];
|
||||
int tex_width[2];
|
||||
int tex_w_mask[2][LOD_MAX+2];
|
||||
int tex_w_nmask[2][LOD_MAX+2];
|
||||
int tex_h_mask[2][LOD_MAX+2];
|
||||
int tex_shift[2][LOD_MAX+2];
|
||||
int tex_lod[2][LOD_MAX+2];
|
||||
int tex_entry[2];
|
||||
int detail_max[2], detail_bias[2], detail_scale[2];
|
||||
uint32_t tex_base[2][LOD_MAX + 2];
|
||||
uint32_t tex_end[2][LOD_MAX + 2];
|
||||
int tex_width[2];
|
||||
int tex_w_mask[2][LOD_MAX + 2];
|
||||
int tex_w_nmask[2][LOD_MAX + 2];
|
||||
int tex_h_mask[2][LOD_MAX + 2];
|
||||
int tex_shift[2][LOD_MAX + 2];
|
||||
int tex_lod[2][LOD_MAX + 2];
|
||||
int tex_entry[2];
|
||||
int detail_max[2], detail_bias[2], detail_scale[2];
|
||||
|
||||
uint32_t draw_offset, aux_offset;
|
||||
uint32_t draw_offset, aux_offset;
|
||||
|
||||
int tformat[2];
|
||||
int tformat[2];
|
||||
|
||||
int clipLeft, clipRight, clipLowY, clipHighY;
|
||||
int clipLeft1, clipRight1, clipLowY1, clipHighY1;
|
||||
int clipLeft, clipRight, clipLowY, clipHighY;
|
||||
int clipLeft1, clipRight1, clipLowY1, clipHighY1;
|
||||
|
||||
int sign;
|
||||
int sign;
|
||||
|
||||
uint32_t front_offset;
|
||||
uint32_t front_offset;
|
||||
|
||||
uint32_t swapbufferCMD;
|
||||
uint32_t swapbufferCMD;
|
||||
|
||||
uint32_t stipple;
|
||||
uint32_t stipple;
|
||||
|
||||
int col_tiled, aux_tiled;
|
||||
int row_width, aux_row_width;
|
||||
int col_tiled, aux_tiled;
|
||||
int row_width, aux_row_width;
|
||||
} voodoo_params_t;
|
||||
|
||||
typedef struct texture_t
|
||||
{
|
||||
uint32_t base;
|
||||
uint32_t tLOD;
|
||||
volatile int refcount, refcount_r[4];
|
||||
int is16;
|
||||
uint32_t palette_checksum;
|
||||
uint32_t addr_start[4], addr_end[4];
|
||||
uint32_t *data;
|
||||
typedef struct texture_t {
|
||||
uint32_t base;
|
||||
uint32_t tLOD;
|
||||
volatile int refcount, refcount_r[4];
|
||||
int is16;
|
||||
uint32_t palette_checksum;
|
||||
uint32_t addr_start[4], addr_end[4];
|
||||
uint32_t *data;
|
||||
} texture_t;
|
||||
|
||||
typedef struct vert_t
|
||||
{
|
||||
float sVx, sVy;
|
||||
float sRed, sGreen, sBlue, sAlpha;
|
||||
float sVz, sWb;
|
||||
float sW0, sS0, sT0;
|
||||
float sW1, sS1, sT1;
|
||||
typedef struct vert_t {
|
||||
float sVx, sVy;
|
||||
float sRed, sGreen, sBlue, sAlpha;
|
||||
float sVz, sWb;
|
||||
float sW0, sS0, sT0;
|
||||
float sW1, sS1, sT1;
|
||||
} vert_t;
|
||||
|
||||
typedef struct clip_t
|
||||
{
|
||||
int x_min, x_max;
|
||||
int y_min, y_max;
|
||||
typedef struct clip_t {
|
||||
int x_min, x_max;
|
||||
int y_min, y_max;
|
||||
} clip_t;
|
||||
|
||||
typedef struct voodoo_t
|
||||
{
|
||||
mem_mapping_t mapping;
|
||||
typedef struct voodoo_t {
|
||||
mem_mapping_t mapping;
|
||||
|
||||
int pci_enable;
|
||||
int pci_enable;
|
||||
|
||||
uint8_t dac_data[8];
|
||||
int dac_reg, dac_reg_ff;
|
||||
uint8_t dac_readdata;
|
||||
uint16_t dac_pll_regs[16];
|
||||
uint8_t dac_data[8];
|
||||
int dac_reg, dac_reg_ff;
|
||||
uint8_t dac_readdata;
|
||||
uint16_t dac_pll_regs[16];
|
||||
|
||||
float pixel_clock;
|
||||
uint64_t line_time;
|
||||
float pixel_clock;
|
||||
uint64_t line_time;
|
||||
|
||||
voodoo_params_t params;
|
||||
voodoo_params_t params;
|
||||
|
||||
uint32_t fbiInit0, fbiInit1, fbiInit2, fbiInit3, fbiInit4;
|
||||
uint32_t fbiInit5, fbiInit6, fbiInit7; /*Voodoo 2*/
|
||||
uint32_t fbiInit0, fbiInit1, fbiInit2, fbiInit3, fbiInit4;
|
||||
uint32_t fbiInit5, fbiInit6, fbiInit7; /*Voodoo 2*/
|
||||
|
||||
uint32_t initEnable;
|
||||
uint32_t initEnable;
|
||||
|
||||
uint32_t lfbMode;
|
||||
uint32_t lfbMode;
|
||||
|
||||
uint32_t memBaseAddr;
|
||||
uint32_t memBaseAddr;
|
||||
|
||||
int_float fvertexAx, fvertexAy, fvertexBx, fvertexBy, fvertexCx, fvertexCy;
|
||||
int_float fvertexAx, fvertexAy, fvertexBx, fvertexBy, fvertexCx, fvertexCy;
|
||||
|
||||
uint32_t front_offset, back_offset;
|
||||
uint32_t front_offset, back_offset;
|
||||
|
||||
uint32_t fb_read_offset, fb_write_offset;
|
||||
uint32_t fb_read_offset, fb_write_offset;
|
||||
|
||||
int row_width, aux_row_width;
|
||||
int block_width;
|
||||
int row_width, aux_row_width;
|
||||
int block_width;
|
||||
|
||||
int col_tiled, aux_tiled;
|
||||
int col_tiled, aux_tiled;
|
||||
|
||||
uint8_t *fb_mem, *tex_mem[2];
|
||||
uint16_t *tex_mem_w[2];
|
||||
uint8_t *fb_mem, *tex_mem[2];
|
||||
uint16_t *tex_mem_w[2];
|
||||
|
||||
int rgb_sel;
|
||||
int rgb_sel;
|
||||
|
||||
uint32_t trexInit1[2];
|
||||
uint32_t trexInit1[2];
|
||||
|
||||
uint32_t tmuConfig;
|
||||
uint32_t tmuConfig;
|
||||
|
||||
mutex_t *swap_mutex;
|
||||
int swap_count;
|
||||
mutex_t *swap_mutex;
|
||||
int swap_count;
|
||||
|
||||
int disp_buffer, draw_buffer;
|
||||
pc_timer_t timer;
|
||||
int disp_buffer, draw_buffer;
|
||||
pc_timer_t timer;
|
||||
|
||||
int line;
|
||||
svga_t *svga;
|
||||
int line;
|
||||
svga_t *svga;
|
||||
|
||||
uint32_t backPorch;
|
||||
uint32_t videoDimensions;
|
||||
uint32_t hSync, vSync;
|
||||
uint32_t backPorch;
|
||||
uint32_t videoDimensions;
|
||||
uint32_t hSync, vSync;
|
||||
|
||||
int h_total, v_total, v_disp;
|
||||
int h_disp;
|
||||
int v_retrace;
|
||||
int h_total, v_total, v_disp;
|
||||
int h_disp;
|
||||
int v_retrace;
|
||||
|
||||
struct
|
||||
{
|
||||
uint32_t y[4], i[4], q[4];
|
||||
} nccTable[2][2];
|
||||
struct
|
||||
{
|
||||
uint32_t y[4], i[4], q[4];
|
||||
} nccTable[2][2];
|
||||
|
||||
rgba_u palette[2][256];
|
||||
rgba_u palette[2][256];
|
||||
|
||||
rgba_u ncc_lookup[2][2][256];
|
||||
int ncc_dirty[2];
|
||||
rgba_u ncc_lookup[2][2][256];
|
||||
int ncc_dirty[2];
|
||||
|
||||
thread_t *fifo_thread;
|
||||
thread_t *render_thread[4];
|
||||
event_t *wake_fifo_thread;
|
||||
event_t *wake_main_thread;
|
||||
event_t *fifo_not_full_event;
|
||||
event_t *render_not_full_event[4];
|
||||
event_t *wake_render_thread[4];
|
||||
thread_t *fifo_thread;
|
||||
thread_t *render_thread[4];
|
||||
event_t *wake_fifo_thread;
|
||||
event_t *wake_main_thread;
|
||||
event_t *fifo_not_full_event;
|
||||
event_t *render_not_full_event[4];
|
||||
event_t *wake_render_thread[4];
|
||||
|
||||
int voodoo_busy;
|
||||
int render_voodoo_busy[4];
|
||||
int voodoo_busy;
|
||||
int render_voodoo_busy[4];
|
||||
|
||||
int render_threads;
|
||||
int odd_even_mask;
|
||||
int render_threads;
|
||||
int odd_even_mask;
|
||||
|
||||
int pixel_count[4], texel_count[4], tri_count, frame_count;
|
||||
int pixel_count_old[4], texel_count_old[4];
|
||||
int wr_count, rd_count, tex_count;
|
||||
int pixel_count[4], texel_count[4], tri_count, frame_count;
|
||||
int pixel_count_old[4], texel_count_old[4];
|
||||
int wr_count, rd_count, tex_count;
|
||||
|
||||
int retrace_count;
|
||||
int swap_interval;
|
||||
uint32_t swap_offset;
|
||||
int swap_pending;
|
||||
int retrace_count;
|
||||
int swap_interval;
|
||||
uint32_t swap_offset;
|
||||
int swap_pending;
|
||||
|
||||
int bilinear_enabled;
|
||||
int dithersub_enabled;
|
||||
int bilinear_enabled;
|
||||
int dithersub_enabled;
|
||||
|
||||
int fb_size;
|
||||
uint32_t fb_mask;
|
||||
int fb_size;
|
||||
uint32_t fb_mask;
|
||||
|
||||
int texture_size;
|
||||
uint32_t texture_mask;
|
||||
int texture_size;
|
||||
uint32_t texture_mask;
|
||||
|
||||
int dual_tmus;
|
||||
int type;
|
||||
|
||||
fifo_entry_t fifo[FIFO_SIZE];
|
||||
volatile int fifo_read_idx, fifo_write_idx;
|
||||
volatile int cmd_read, cmd_written, cmd_written_fifo;
|
||||
|
||||
voodoo_params_t params_buffer[PARAM_SIZE];
|
||||
volatile int params_read_idx[4], params_write_idx;
|
||||
|
||||
uint32_t cmdfifo_base, cmdfifo_end, cmdfifo_size;
|
||||
int cmdfifo_rp, cmdfifo_ret_addr;
|
||||
int cmdfifo_in_sub;
|
||||
volatile int cmdfifo_depth_rd, cmdfifo_depth_wr;
|
||||
volatile int cmdfifo_enabled;
|
||||
uint32_t cmdfifo_amin, cmdfifo_amax;
|
||||
int cmdfifo_holecount;
|
||||
|
||||
uint32_t sSetupMode;
|
||||
vert_t verts[4];
|
||||
unsigned int vertex_ages[3];
|
||||
unsigned int vertex_next_age;
|
||||
int num_verticies;
|
||||
int cull_pingpong;
|
||||
|
||||
int flush;
|
||||
|
||||
int scrfilter;
|
||||
int scrfilterEnabled;
|
||||
int scrfilterThreshold;
|
||||
int scrfilterThresholdOld;
|
||||
|
||||
uint32_t last_write_addr;
|
||||
|
||||
uint32_t fbiPixelsIn;
|
||||
uint32_t fbiChromaFail;
|
||||
uint32_t fbiZFuncFail;
|
||||
uint32_t fbiAFuncFail;
|
||||
uint32_t fbiPixelsOut;
|
||||
|
||||
uint32_t bltSrcBaseAddr;
|
||||
uint32_t bltDstBaseAddr;
|
||||
int bltSrcXYStride, bltDstXYStride;
|
||||
uint32_t bltSrcChromaRange, bltDstChromaRange;
|
||||
int bltSrcChromaMinR, bltSrcChromaMinG, bltSrcChromaMinB;
|
||||
int bltSrcChromaMaxR, bltSrcChromaMaxG, bltSrcChromaMaxB;
|
||||
int bltDstChromaMinR, bltDstChromaMinG, bltDstChromaMinB;
|
||||
int bltDstChromaMaxR, bltDstChromaMaxG, bltDstChromaMaxB;
|
||||
|
||||
int bltClipRight, bltClipLeft;
|
||||
int bltClipHighY, bltClipLowY;
|
||||
|
||||
int bltSrcX, bltSrcY;
|
||||
int bltDstX, bltDstY;
|
||||
int bltSizeX, bltSizeY;
|
||||
int bltRop[4];
|
||||
uint16_t bltColorFg, bltColorBg;
|
||||
|
||||
uint32_t bltCommand;
|
||||
|
||||
uint32_t leftOverlayBuf;
|
||||
|
||||
struct
|
||||
{
|
||||
int dst_x, dst_y;
|
||||
int cur_x;
|
||||
int size_x, size_y;
|
||||
int x_dir, y_dir;
|
||||
int dst_stride;
|
||||
} blt;
|
||||
|
||||
struct
|
||||
{
|
||||
uint32_t bresError0, bresError1;
|
||||
uint32_t clip0Min, clip0Max;
|
||||
uint32_t clip1Min, clip1Max;
|
||||
uint32_t colorBack, colorFore;
|
||||
uint32_t command, commandExtra;
|
||||
uint32_t dstBaseAddr;
|
||||
uint32_t dstFormat;
|
||||
uint32_t dstSize;
|
||||
uint32_t dstXY;
|
||||
uint32_t lineStipple;
|
||||
uint32_t lineStyle;
|
||||
uint32_t rop;
|
||||
uint32_t srcBaseAddr;
|
||||
uint32_t srcFormat;
|
||||
uint32_t srcSize;
|
||||
uint32_t srcXY;
|
||||
|
||||
uint32_t colorPattern[64];
|
||||
|
||||
int bres_error_0, bres_error_1;
|
||||
uint32_t colorPattern8[64], colorPattern16[64], colorPattern24[64];
|
||||
int cur_x, cur_y;
|
||||
uint32_t dstBaseAddr_tiled;
|
||||
uint32_t dstColorkeyMin, dstColorkeyMax;
|
||||
int dstSizeX, dstSizeY;
|
||||
int dstX, dstY;
|
||||
int dst_stride;
|
||||
int patoff_x, patoff_y;
|
||||
uint8_t rops[4];
|
||||
uint32_t srcBaseAddr_tiled;
|
||||
uint32_t srcColorkeyMin, srcColorkeyMax;
|
||||
int srcSizeX, srcSizeY;
|
||||
int srcX, srcY;
|
||||
int src_stride;
|
||||
int old_srcX;
|
||||
|
||||
/*Used for handling packed 24bpp host data*/
|
||||
int host_data_remainder;
|
||||
uint32_t old_host_data;
|
||||
|
||||
/*Polyfill coordinates*/
|
||||
int lx[2], rx[2];
|
||||
int ly[2], ry[2];
|
||||
|
||||
/*Polyfill state*/
|
||||
int error[2];
|
||||
int dx[2], dy[2];
|
||||
int x_inc[2]; /*y_inc is always 1 for polyfill*/
|
||||
int lx_cur, rx_cur;
|
||||
|
||||
clip_t clip[2];
|
||||
|
||||
uint8_t host_data[16384];
|
||||
int host_data_count;
|
||||
int host_data_size_src, host_data_size_dest;
|
||||
int src_stride_src, src_stride_dest;
|
||||
|
||||
int src_bpp;
|
||||
|
||||
int line_pix_pos, line_bit_pos;
|
||||
int line_rep_cnt, line_bit_mask_size;
|
||||
} banshee_blt;
|
||||
|
||||
struct
|
||||
{
|
||||
uint32_t vidOverlayStartCoords;
|
||||
uint32_t vidOverlayEndScreenCoords;
|
||||
uint32_t vidOverlayDudx, vidOverlayDudxOffsetSrcWidth;
|
||||
uint32_t vidOverlayDvdy, vidOverlayDvdyOffset;
|
||||
//uint32_t vidDesktopOverlayStride;
|
||||
|
||||
int start_x, start_y;
|
||||
int end_x, end_y;
|
||||
int size_x, size_y;
|
||||
int overlay_bytes;
|
||||
|
||||
unsigned int src_y;
|
||||
} overlay;
|
||||
|
||||
rgbvoodoo_t clutData[33];
|
||||
int clutData_dirty;
|
||||
rgbvoodoo_t clutData256[256];
|
||||
uint32_t video_16to32[0x10000];
|
||||
|
||||
uint8_t dirty_line[2048];
|
||||
int dirty_line_low, dirty_line_high;
|
||||
|
||||
int fb_write_buffer, fb_draw_buffer;
|
||||
int buffer_cutoff;
|
||||
|
||||
uint32_t tile_base, tile_stride;
|
||||
int tile_stride_shift, tile_x, tile_x_real;
|
||||
|
||||
int y_origin_swap;
|
||||
|
||||
int read_time, write_time, burst_time;
|
||||
|
||||
pc_timer_t wake_timer;
|
||||
|
||||
/* screen filter tables */
|
||||
uint8_t thefilter[256][256];
|
||||
uint8_t thefilterg[256][256];
|
||||
uint8_t thefilterb[256][256];
|
||||
uint16_t purpleline[256][3];
|
||||
|
||||
texture_t texture_cache[2][TEX_CACHE_MAX];
|
||||
uint8_t texture_present[2][16384];
|
||||
int texture_last_removed;
|
||||
|
||||
uint32_t palette_checksum[2];
|
||||
int palette_dirty[2];
|
||||
int dual_tmus;
|
||||
int type;
|
||||
|
||||
fifo_entry_t fifo[FIFO_SIZE];
|
||||
volatile int fifo_read_idx, fifo_write_idx;
|
||||
volatile int cmd_read, cmd_written, cmd_written_fifo;
|
||||
|
||||
voodoo_params_t params_buffer[PARAM_SIZE];
|
||||
volatile int params_read_idx[4], params_write_idx;
|
||||
|
||||
uint32_t cmdfifo_base, cmdfifo_end, cmdfifo_size;
|
||||
int cmdfifo_rp, cmdfifo_ret_addr;
|
||||
int cmdfifo_in_sub;
|
||||
volatile int cmdfifo_depth_rd, cmdfifo_depth_wr;
|
||||
volatile int cmdfifo_enabled;
|
||||
uint32_t cmdfifo_amin, cmdfifo_amax;
|
||||
int cmdfifo_holecount;
|
||||
|
||||
uint32_t sSetupMode;
|
||||
vert_t verts[4];
|
||||
unsigned int vertex_ages[3];
|
||||
unsigned int vertex_next_age;
|
||||
int num_verticies;
|
||||
int cull_pingpong;
|
||||
|
||||
int flush;
|
||||
|
||||
int scrfilter;
|
||||
int scrfilterEnabled;
|
||||
int scrfilterThreshold;
|
||||
int scrfilterThresholdOld;
|
||||
|
||||
uint32_t last_write_addr;
|
||||
|
||||
uint32_t fbiPixelsIn;
|
||||
uint32_t fbiChromaFail;
|
||||
uint32_t fbiZFuncFail;
|
||||
uint32_t fbiAFuncFail;
|
||||
uint32_t fbiPixelsOut;
|
||||
|
||||
uint32_t bltSrcBaseAddr;
|
||||
uint32_t bltDstBaseAddr;
|
||||
int bltSrcXYStride, bltDstXYStride;
|
||||
uint32_t bltSrcChromaRange, bltDstChromaRange;
|
||||
int bltSrcChromaMinR, bltSrcChromaMinG, bltSrcChromaMinB;
|
||||
int bltSrcChromaMaxR, bltSrcChromaMaxG, bltSrcChromaMaxB;
|
||||
int bltDstChromaMinR, bltDstChromaMinG, bltDstChromaMinB;
|
||||
int bltDstChromaMaxR, bltDstChromaMaxG, bltDstChromaMaxB;
|
||||
|
||||
int bltClipRight, bltClipLeft;
|
||||
int bltClipHighY, bltClipLowY;
|
||||
|
||||
int bltSrcX, bltSrcY;
|
||||
int bltDstX, bltDstY;
|
||||
int bltSizeX, bltSizeY;
|
||||
int bltRop[4];
|
||||
uint16_t bltColorFg, bltColorBg;
|
||||
|
||||
uint32_t bltCommand;
|
||||
|
||||
uint32_t leftOverlayBuf;
|
||||
|
||||
struct
|
||||
{
|
||||
int dst_x, dst_y;
|
||||
int cur_x;
|
||||
int size_x, size_y;
|
||||
int x_dir, y_dir;
|
||||
int dst_stride;
|
||||
} blt;
|
||||
|
||||
struct
|
||||
{
|
||||
uint32_t bresError0, bresError1;
|
||||
uint32_t clip0Min, clip0Max;
|
||||
uint32_t clip1Min, clip1Max;
|
||||
uint32_t colorBack, colorFore;
|
||||
uint32_t command, commandExtra;
|
||||
uint32_t dstBaseAddr;
|
||||
uint32_t dstFormat;
|
||||
uint32_t dstSize;
|
||||
uint32_t dstXY;
|
||||
uint32_t lineStipple;
|
||||
uint32_t lineStyle;
|
||||
uint32_t rop;
|
||||
uint32_t srcBaseAddr;
|
||||
uint32_t srcFormat;
|
||||
uint32_t srcSize;
|
||||
uint32_t srcXY;
|
||||
|
||||
uint32_t colorPattern[64];
|
||||
|
||||
int bres_error_0, bres_error_1;
|
||||
uint32_t colorPattern8[64], colorPattern16[64], colorPattern24[64];
|
||||
int cur_x, cur_y;
|
||||
uint32_t dstBaseAddr_tiled;
|
||||
uint32_t dstColorkeyMin, dstColorkeyMax;
|
||||
int dstSizeX, dstSizeY;
|
||||
int dstX, dstY;
|
||||
int dst_stride;
|
||||
int patoff_x, patoff_y;
|
||||
uint8_t rops[4];
|
||||
uint32_t srcBaseAddr_tiled;
|
||||
uint32_t srcColorkeyMin, srcColorkeyMax;
|
||||
int srcSizeX, srcSizeY;
|
||||
int srcX, srcY;
|
||||
int src_stride;
|
||||
int old_srcX;
|
||||
|
||||
/*Used for handling packed 24bpp host data*/
|
||||
int host_data_remainder;
|
||||
uint32_t old_host_data;
|
||||
|
||||
/*Polyfill coordinates*/
|
||||
int lx[2], rx[2];
|
||||
int ly[2], ry[2];
|
||||
|
||||
/*Polyfill state*/
|
||||
int error[2];
|
||||
int dx[2], dy[2];
|
||||
int x_inc[2]; /*y_inc is always 1 for polyfill*/
|
||||
int lx_cur, rx_cur;
|
||||
|
||||
clip_t clip[2];
|
||||
|
||||
uint8_t host_data[16384];
|
||||
int host_data_count;
|
||||
int host_data_size_src, host_data_size_dest;
|
||||
int src_stride_src, src_stride_dest;
|
||||
|
||||
int src_bpp;
|
||||
|
||||
int line_pix_pos, line_bit_pos;
|
||||
int line_rep_cnt, line_bit_mask_size;
|
||||
} banshee_blt;
|
||||
|
||||
struct
|
||||
{
|
||||
uint32_t vidOverlayStartCoords;
|
||||
uint32_t vidOverlayEndScreenCoords;
|
||||
uint32_t vidOverlayDudx, vidOverlayDudxOffsetSrcWidth;
|
||||
uint32_t vidOverlayDvdy, vidOverlayDvdyOffset;
|
||||
// uint32_t vidDesktopOverlayStride;
|
||||
|
||||
int start_x, start_y;
|
||||
int end_x, end_y;
|
||||
int size_x, size_y;
|
||||
int overlay_bytes;
|
||||
|
||||
unsigned int src_y;
|
||||
} overlay;
|
||||
|
||||
rgbvoodoo_t clutData[33];
|
||||
int clutData_dirty;
|
||||
rgbvoodoo_t clutData256[256];
|
||||
uint32_t video_16to32[0x10000];
|
||||
|
||||
uint8_t dirty_line[2048];
|
||||
int dirty_line_low, dirty_line_high;
|
||||
|
||||
int fb_write_buffer, fb_draw_buffer;
|
||||
int buffer_cutoff;
|
||||
|
||||
uint32_t tile_base, tile_stride;
|
||||
int tile_stride_shift, tile_x, tile_x_real;
|
||||
|
||||
int y_origin_swap;
|
||||
|
||||
int read_time, write_time, burst_time;
|
||||
|
||||
pc_timer_t wake_timer;
|
||||
|
||||
/* screen filter tables */
|
||||
uint8_t thefilter[256][256];
|
||||
uint8_t thefilterg[256][256];
|
||||
uint8_t thefilterb[256][256];
|
||||
uint16_t purpleline[256][3];
|
||||
|
||||
texture_t texture_cache[2][TEX_CACHE_MAX];
|
||||
uint8_t texture_present[2][16384];
|
||||
int texture_last_removed;
|
||||
|
||||
uint32_t palette_checksum[2];
|
||||
int palette_dirty[2];
|
||||
|
||||
uint64_t time;
|
||||
int render_time[4];
|
||||
uint64_t time;
|
||||
int render_time[4];
|
||||
|
||||
int force_blit_count;
|
||||
int can_blit;
|
||||
mutex_t* force_blit_mutex;
|
||||
int force_blit_count;
|
||||
int can_blit;
|
||||
mutex_t *force_blit_mutex;
|
||||
|
||||
int use_recompiler;
|
||||
void *codegen_data;
|
||||
int use_recompiler;
|
||||
void *codegen_data;
|
||||
|
||||
struct voodoo_set_t *set;
|
||||
struct voodoo_set_t *set;
|
||||
|
||||
uint8_t fifo_thread_run, render_thread_run[4];
|
||||
uint8_t fifo_thread_run, render_thread_run[4];
|
||||
|
||||
uint8_t *vram, *changedvram;
|
||||
uint8_t *vram, *changedvram;
|
||||
|
||||
void *p;
|
||||
void *p;
|
||||
} voodoo_t;
|
||||
|
||||
typedef struct voodoo_set_t
|
||||
{
|
||||
voodoo_t *voodoos[2];
|
||||
typedef struct voodoo_set_t {
|
||||
voodoo_t *voodoos[2];
|
||||
|
||||
mem_mapping_t snoop_mapping;
|
||||
mem_mapping_t snoop_mapping;
|
||||
|
||||
int nr_cards;
|
||||
int nr_cards;
|
||||
} voodoo_set_t;
|
||||
|
||||
|
||||
extern rgba8_t rgb332[0x100], ai44[0x100], rgb565[0x10000], argb1555[0x10000], argb4444[0x10000], ai88[0x10000];
|
||||
|
||||
|
||||
void voodoo_generate_vb_filters(voodoo_t *voodoo, int fcr, int fcg);
|
||||
|
||||
void voodoo_recalc(voodoo_t *voodoo);
|
||||
void voodoo_update_ncc(voodoo_t *voodoo, int tmu);
|
||||
|
||||
void *voodoo_2d3d_card_init(int type);
|
||||
void voodoo_card_close(voodoo_t *voodoo);
|
||||
void voodoo_card_close(voodoo_t *voodoo);
|
||||
|
||||
#endif /*VIDEO_VOODOO_COMMON_H*/
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
*/
|
||||
|
||||
#ifndef VIDEO_VOODOO_DISPLAY_H
|
||||
# define VIDEO_VOODOO_DISPLAY_H
|
||||
#define VIDEO_VOODOO_DISPLAY_H
|
||||
|
||||
void voodoo_update_ncc(voodoo_t *voodoo, int tmu);
|
||||
void voodoo_pixelclock_update(voodoo_t *voodoo);
|
||||
|
||||
@@ -17,11 +17,11 @@
|
||||
*/
|
||||
|
||||
#ifndef VIDEO_VOODOO_FB_H
|
||||
# define VIDEO_VOODOO_FB_H
|
||||
#define VIDEO_VOODOO_FB_H
|
||||
|
||||
uint16_t voodoo_fb_readw(uint32_t addr, void *p);
|
||||
uint32_t voodoo_fb_readl(uint32_t addr, void *p);
|
||||
void voodoo_fb_writew(uint32_t addr, uint16_t val, void *p);
|
||||
void voodoo_fb_writel(uint32_t addr, uint32_t val, void *p);
|
||||
void voodoo_fb_writew(uint32_t addr, uint16_t val, void *p);
|
||||
void voodoo_fb_writel(uint32_t addr, uint32_t val, void *p);
|
||||
|
||||
#endif /*VIDEO_VOODOO_FB_H*/
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
*/
|
||||
|
||||
#ifndef VIDEO_VOODOO_FIFO_H
|
||||
# define VIDEO_VOODOO_FIFO_H
|
||||
#define VIDEO_VOODOO_FIFO_H
|
||||
|
||||
void voodoo_wake_fifo_thread(voodoo_t *voodoo);
|
||||
void voodoo_wake_fifo_thread_now(voodoo_t *voodoo);
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
*/
|
||||
|
||||
#ifndef VIDEO_VOODOO_REG_H
|
||||
# define VIDEO_VOODOO_REG_H
|
||||
#define VIDEO_VOODOO_REG_H
|
||||
|
||||
void voodoo_reg_writel(uint32_t addr, uint32_t val, void *p);
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,8 +1,8 @@
|
||||
#ifndef VIDEO_VOODOO_RENDER_H
|
||||
# define VIDEO_VOODOO_RENDER_H
|
||||
#define VIDEO_VOODOO_RENDER_H
|
||||
|
||||
#if !(defined i386 || defined __i386 || defined __i386__ || defined _X86_ || defined _M_IX86 || defined __amd64__ || defined _M_X64)
|
||||
#define NO_CODEGEN
|
||||
# define NO_CODEGEN
|
||||
#endif
|
||||
|
||||
#ifndef NO_CODEGEN
|
||||
@@ -10,295 +10,263 @@ void voodoo_codegen_init(voodoo_t *voodoo);
|
||||
void voodoo_codegen_close(voodoo_t *voodoo);
|
||||
#endif
|
||||
|
||||
#define DEPTH_TEST(comp_depth) \
|
||||
do \
|
||||
{ \
|
||||
switch (depth_op) \
|
||||
{ \
|
||||
case DEPTHOP_NEVER: \
|
||||
voodoo->fbiZFuncFail++; \
|
||||
goto skip_pixel; \
|
||||
case DEPTHOP_LESSTHAN: \
|
||||
if (!(comp_depth < old_depth)) \
|
||||
{ \
|
||||
voodoo->fbiZFuncFail++; \
|
||||
goto skip_pixel; \
|
||||
} \
|
||||
break; \
|
||||
case DEPTHOP_EQUAL: \
|
||||
if (!(comp_depth == old_depth)) \
|
||||
{ \
|
||||
voodoo->fbiZFuncFail++; \
|
||||
goto skip_pixel; \
|
||||
} \
|
||||
break; \
|
||||
case DEPTHOP_LESSTHANEQUAL: \
|
||||
if (!(comp_depth <= old_depth)) \
|
||||
{ \
|
||||
voodoo->fbiZFuncFail++; \
|
||||
goto skip_pixel; \
|
||||
} \
|
||||
break; \
|
||||
case DEPTHOP_GREATERTHAN: \
|
||||
if (!(comp_depth > old_depth)) \
|
||||
{ \
|
||||
voodoo->fbiZFuncFail++; \
|
||||
goto skip_pixel; \
|
||||
} \
|
||||
break; \
|
||||
case DEPTHOP_NOTEQUAL: \
|
||||
if (!(comp_depth != old_depth)) \
|
||||
{ \
|
||||
voodoo->fbiZFuncFail++; \
|
||||
goto skip_pixel; \
|
||||
} \
|
||||
break; \
|
||||
case DEPTHOP_GREATERTHANEQUAL: \
|
||||
if (!(comp_depth >= old_depth)) \
|
||||
{ \
|
||||
voodoo->fbiZFuncFail++; \
|
||||
goto skip_pixel; \
|
||||
} \
|
||||
break; \
|
||||
case DEPTHOP_ALWAYS: \
|
||||
break; \
|
||||
} \
|
||||
} while (0)
|
||||
#define DEPTH_TEST(comp_depth) \
|
||||
do { \
|
||||
switch (depth_op) { \
|
||||
case DEPTHOP_NEVER: \
|
||||
voodoo->fbiZFuncFail++; \
|
||||
goto skip_pixel; \
|
||||
case DEPTHOP_LESSTHAN: \
|
||||
if (!(comp_depth < old_depth)) { \
|
||||
voodoo->fbiZFuncFail++; \
|
||||
goto skip_pixel; \
|
||||
} \
|
||||
break; \
|
||||
case DEPTHOP_EQUAL: \
|
||||
if (!(comp_depth == old_depth)) { \
|
||||
voodoo->fbiZFuncFail++; \
|
||||
goto skip_pixel; \
|
||||
} \
|
||||
break; \
|
||||
case DEPTHOP_LESSTHANEQUAL: \
|
||||
if (!(comp_depth <= old_depth)) { \
|
||||
voodoo->fbiZFuncFail++; \
|
||||
goto skip_pixel; \
|
||||
} \
|
||||
break; \
|
||||
case DEPTHOP_GREATERTHAN: \
|
||||
if (!(comp_depth > old_depth)) { \
|
||||
voodoo->fbiZFuncFail++; \
|
||||
goto skip_pixel; \
|
||||
} \
|
||||
break; \
|
||||
case DEPTHOP_NOTEQUAL: \
|
||||
if (!(comp_depth != old_depth)) { \
|
||||
voodoo->fbiZFuncFail++; \
|
||||
goto skip_pixel; \
|
||||
} \
|
||||
break; \
|
||||
case DEPTHOP_GREATERTHANEQUAL: \
|
||||
if (!(comp_depth >= old_depth)) { \
|
||||
voodoo->fbiZFuncFail++; \
|
||||
goto skip_pixel; \
|
||||
} \
|
||||
break; \
|
||||
case DEPTHOP_ALWAYS: \
|
||||
break; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define APPLY_FOG(src_r, src_g, src_b, z, ia, w) \
|
||||
do \
|
||||
{ \
|
||||
if (params->fogMode & FOG_CONSTANT) \
|
||||
{ \
|
||||
src_r += params->fogColor.r; \
|
||||
src_g += params->fogColor.g; \
|
||||
src_b += params->fogColor.b; \
|
||||
} \
|
||||
else \
|
||||
{ \
|
||||
int fog_r, fog_g, fog_b, fog_a = 0; \
|
||||
int fog_idx; \
|
||||
\
|
||||
if (!(params->fogMode & FOG_ADD)) \
|
||||
{ \
|
||||
fog_r = params->fogColor.r; \
|
||||
fog_g = params->fogColor.g; \
|
||||
fog_b = params->fogColor.b; \
|
||||
} \
|
||||
else \
|
||||
fog_r = fog_g = fog_b = 0; \
|
||||
\
|
||||
if (!(params->fogMode & FOG_MULT)) \
|
||||
{ \
|
||||
fog_r -= src_r; \
|
||||
fog_g -= src_g; \
|
||||
fog_b -= src_b; \
|
||||
} \
|
||||
\
|
||||
switch (params->fogMode & (FOG_Z|FOG_ALPHA)) \
|
||||
{ \
|
||||
case 0: \
|
||||
fog_idx = (w_depth >> 10) & 0x3f; \
|
||||
\
|
||||
fog_a = params->fogTable[fog_idx].fog; \
|
||||
fog_a += (params->fogTable[fog_idx].dfog * ((w_depth >> 2) & 0xff)) >> 10; \
|
||||
break; \
|
||||
case FOG_Z: \
|
||||
fog_a = (z >> 20) & 0xff; \
|
||||
break; \
|
||||
case FOG_ALPHA: \
|
||||
fog_a = CLAMP(ia >> 12); \
|
||||
break; \
|
||||
case FOG_W: \
|
||||
fog_a = CLAMP((w >> 32) & 0xff); \
|
||||
break; \
|
||||
} \
|
||||
fog_a++; \
|
||||
\
|
||||
fog_r = (fog_r * fog_a) >> 8; \
|
||||
fog_g = (fog_g * fog_a) >> 8; \
|
||||
fog_b = (fog_b * fog_a) >> 8; \
|
||||
\
|
||||
if (params->fogMode & FOG_MULT) \
|
||||
{ \
|
||||
src_r = fog_r; \
|
||||
src_g = fog_g; \
|
||||
src_b = fog_b; \
|
||||
} \
|
||||
else \
|
||||
{ \
|
||||
src_r += fog_r; \
|
||||
src_g += fog_g; \
|
||||
src_b += fog_b; \
|
||||
} \
|
||||
} \
|
||||
\
|
||||
src_r = CLAMP(src_r); \
|
||||
src_g = CLAMP(src_g); \
|
||||
src_b = CLAMP(src_b); \
|
||||
} while (0)
|
||||
|
||||
#define ALPHA_TEST(src_a) \
|
||||
do \
|
||||
{ \
|
||||
switch (alpha_func) \
|
||||
{ \
|
||||
case AFUNC_NEVER: \
|
||||
voodoo->fbiAFuncFail++; \
|
||||
goto skip_pixel; \
|
||||
case AFUNC_LESSTHAN: \
|
||||
if (!(src_a < a_ref)) \
|
||||
{ \
|
||||
voodoo->fbiAFuncFail++; \
|
||||
goto skip_pixel; \
|
||||
} \
|
||||
break; \
|
||||
case AFUNC_EQUAL: \
|
||||
if (!(src_a == a_ref)) \
|
||||
{ \
|
||||
voodoo->fbiAFuncFail++; \
|
||||
goto skip_pixel; \
|
||||
} \
|
||||
break; \
|
||||
case AFUNC_LESSTHANEQUAL: \
|
||||
if (!(src_a <= a_ref)) \
|
||||
{ \
|
||||
voodoo->fbiAFuncFail++; \
|
||||
goto skip_pixel; \
|
||||
} \
|
||||
break; \
|
||||
case AFUNC_GREATERTHAN: \
|
||||
if (!(src_a > a_ref)) \
|
||||
{ \
|
||||
voodoo->fbiAFuncFail++; \
|
||||
goto skip_pixel; \
|
||||
} \
|
||||
break; \
|
||||
case AFUNC_NOTEQUAL: \
|
||||
if (!(src_a != a_ref)) \
|
||||
{ \
|
||||
voodoo->fbiAFuncFail++; \
|
||||
goto skip_pixel; \
|
||||
} \
|
||||
break; \
|
||||
case AFUNC_GREATERTHANEQUAL: \
|
||||
if (!(src_a >= a_ref)) \
|
||||
{ \
|
||||
voodoo->fbiAFuncFail++; \
|
||||
goto skip_pixel; \
|
||||
} \
|
||||
break; \
|
||||
case AFUNC_ALWAYS: \
|
||||
break; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define ALPHA_BLEND(src_r, src_g, src_b, src_a) \
|
||||
do \
|
||||
{ \
|
||||
int _a; \
|
||||
int newdest_r = 0, newdest_g = 0, newdest_b = 0; \
|
||||
\
|
||||
switch (dest_afunc) \
|
||||
{ \
|
||||
case AFUNC_AZERO: \
|
||||
newdest_r = newdest_g = newdest_b = 0; \
|
||||
break; \
|
||||
case AFUNC_ASRC_ALPHA: \
|
||||
newdest_r = (dest_r * src_a) / 255; \
|
||||
newdest_g = (dest_g * src_a) / 255; \
|
||||
newdest_b = (dest_b * src_a) / 255; \
|
||||
break; \
|
||||
case AFUNC_A_COLOR: \
|
||||
newdest_r = (dest_r * src_r) / 255; \
|
||||
newdest_g = (dest_g * src_g) / 255; \
|
||||
newdest_b = (dest_b * src_b) / 255; \
|
||||
break; \
|
||||
case AFUNC_ADST_ALPHA: \
|
||||
newdest_r = (dest_r * dest_a) / 255; \
|
||||
newdest_g = (dest_g * dest_a) / 255; \
|
||||
newdest_b = (dest_b * dest_a) / 255; \
|
||||
break; \
|
||||
case AFUNC_AONE: \
|
||||
newdest_r = dest_r; \
|
||||
newdest_g = dest_g; \
|
||||
newdest_b = dest_b; \
|
||||
break; \
|
||||
case AFUNC_AOMSRC_ALPHA: \
|
||||
newdest_r = (dest_r * (255-src_a)) / 255; \
|
||||
newdest_g = (dest_g * (255-src_a)) / 255; \
|
||||
newdest_b = (dest_b * (255-src_a)) / 255; \
|
||||
break; \
|
||||
case AFUNC_AOM_COLOR: \
|
||||
newdest_r = (dest_r * (255-src_r)) / 255; \
|
||||
newdest_g = (dest_g * (255-src_g)) / 255; \
|
||||
newdest_b = (dest_b * (255-src_b)) / 255; \
|
||||
break; \
|
||||
case AFUNC_AOMDST_ALPHA: \
|
||||
newdest_r = (dest_r * (255-dest_a)) / 255; \
|
||||
newdest_g = (dest_g * (255-dest_a)) / 255; \
|
||||
newdest_b = (dest_b * (255-dest_a)) / 255; \
|
||||
break; \
|
||||
case AFUNC_ASATURATE: \
|
||||
_a = MIN(src_a, 1-dest_a); \
|
||||
newdest_r = (dest_r * _a) / 255; \
|
||||
newdest_g = (dest_g * _a) / 255; \
|
||||
newdest_b = (dest_b * _a) / 255; \
|
||||
break; \
|
||||
} \
|
||||
\
|
||||
switch (src_afunc) \
|
||||
{ \
|
||||
case AFUNC_AZERO: \
|
||||
src_r = src_g = src_b = 0; \
|
||||
break; \
|
||||
case AFUNC_ASRC_ALPHA: \
|
||||
src_r = (src_r * src_a) / 255; \
|
||||
src_g = (src_g * src_a) / 255; \
|
||||
src_b = (src_b * src_a) / 255; \
|
||||
break; \
|
||||
case AFUNC_A_COLOR: \
|
||||
src_r = (src_r * dest_r) / 255; \
|
||||
src_g = (src_g * dest_g) / 255; \
|
||||
src_b = (src_b * dest_b) / 255; \
|
||||
break; \
|
||||
case AFUNC_ADST_ALPHA: \
|
||||
src_r = (src_r * dest_a) / 255; \
|
||||
src_g = (src_g * dest_a) / 255; \
|
||||
src_b = (src_b * dest_a) / 255; \
|
||||
break; \
|
||||
case AFUNC_AONE: \
|
||||
break; \
|
||||
case AFUNC_AOMSRC_ALPHA: \
|
||||
src_r = (src_r * (255-src_a)) / 255; \
|
||||
src_g = (src_g * (255-src_a)) / 255; \
|
||||
src_b = (src_b * (255-src_a)) / 255; \
|
||||
break; \
|
||||
case AFUNC_AOM_COLOR: \
|
||||
src_r = (src_r * (255-dest_r)) / 255; \
|
||||
src_g = (src_g * (255-dest_g)) / 255; \
|
||||
src_b = (src_b * (255-dest_b)) / 255; \
|
||||
break; \
|
||||
case AFUNC_AOMDST_ALPHA: \
|
||||
src_r = (src_r * (255-dest_a)) / 255; \
|
||||
src_g = (src_g * (255-dest_a)) / 255; \
|
||||
src_b = (src_b * (255-dest_a)) / 255; \
|
||||
break; \
|
||||
case AFUNC_ACOLORBEFOREFOG: \
|
||||
fatal("AFUNC_ACOLORBEFOREFOG\n"); \
|
||||
break; \
|
||||
} \
|
||||
\
|
||||
src_r += newdest_r; \
|
||||
src_g += newdest_g; \
|
||||
src_b += newdest_b; \
|
||||
\
|
||||
src_r = CLAMP(src_r); \
|
||||
src_g = CLAMP(src_g); \
|
||||
src_b = CLAMP(src_b); \
|
||||
} while(0)
|
||||
#define APPLY_FOG(src_r, src_g, src_b, z, ia, w) \
|
||||
do { \
|
||||
if (params->fogMode & FOG_CONSTANT) { \
|
||||
src_r += params->fogColor.r; \
|
||||
src_g += params->fogColor.g; \
|
||||
src_b += params->fogColor.b; \
|
||||
} else { \
|
||||
int fog_r, fog_g, fog_b, fog_a = 0; \
|
||||
int fog_idx; \
|
||||
\
|
||||
if (!(params->fogMode & FOG_ADD)) { \
|
||||
fog_r = params->fogColor.r; \
|
||||
fog_g = params->fogColor.g; \
|
||||
fog_b = params->fogColor.b; \
|
||||
} else \
|
||||
fog_r = fog_g = fog_b = 0; \
|
||||
\
|
||||
if (!(params->fogMode & FOG_MULT)) { \
|
||||
fog_r -= src_r; \
|
||||
fog_g -= src_g; \
|
||||
fog_b -= src_b; \
|
||||
} \
|
||||
\
|
||||
switch (params->fogMode & (FOG_Z | FOG_ALPHA)) { \
|
||||
case 0: \
|
||||
fog_idx = (w_depth >> 10) & 0x3f; \
|
||||
\
|
||||
fog_a = params->fogTable[fog_idx].fog; \
|
||||
fog_a += (params->fogTable[fog_idx].dfog * ((w_depth >> 2) & 0xff)) >> 10; \
|
||||
break; \
|
||||
case FOG_Z: \
|
||||
fog_a = (z >> 20) & 0xff; \
|
||||
break; \
|
||||
case FOG_ALPHA: \
|
||||
fog_a = CLAMP(ia >> 12); \
|
||||
break; \
|
||||
case FOG_W: \
|
||||
fog_a = CLAMP((w >> 32) & 0xff); \
|
||||
break; \
|
||||
} \
|
||||
fog_a++; \
|
||||
\
|
||||
fog_r = (fog_r * fog_a) >> 8; \
|
||||
fog_g = (fog_g * fog_a) >> 8; \
|
||||
fog_b = (fog_b * fog_a) >> 8; \
|
||||
\
|
||||
if (params->fogMode & FOG_MULT) { \
|
||||
src_r = fog_r; \
|
||||
src_g = fog_g; \
|
||||
src_b = fog_b; \
|
||||
} else { \
|
||||
src_r += fog_r; \
|
||||
src_g += fog_g; \
|
||||
src_b += fog_b; \
|
||||
} \
|
||||
} \
|
||||
\
|
||||
src_r = CLAMP(src_r); \
|
||||
src_g = CLAMP(src_g); \
|
||||
src_b = CLAMP(src_b); \
|
||||
} while (0)
|
||||
|
||||
#define ALPHA_TEST(src_a) \
|
||||
do { \
|
||||
switch (alpha_func) { \
|
||||
case AFUNC_NEVER: \
|
||||
voodoo->fbiAFuncFail++; \
|
||||
goto skip_pixel; \
|
||||
case AFUNC_LESSTHAN: \
|
||||
if (!(src_a < a_ref)) { \
|
||||
voodoo->fbiAFuncFail++; \
|
||||
goto skip_pixel; \
|
||||
} \
|
||||
break; \
|
||||
case AFUNC_EQUAL: \
|
||||
if (!(src_a == a_ref)) { \
|
||||
voodoo->fbiAFuncFail++; \
|
||||
goto skip_pixel; \
|
||||
} \
|
||||
break; \
|
||||
case AFUNC_LESSTHANEQUAL: \
|
||||
if (!(src_a <= a_ref)) { \
|
||||
voodoo->fbiAFuncFail++; \
|
||||
goto skip_pixel; \
|
||||
} \
|
||||
break; \
|
||||
case AFUNC_GREATERTHAN: \
|
||||
if (!(src_a > a_ref)) { \
|
||||
voodoo->fbiAFuncFail++; \
|
||||
goto skip_pixel; \
|
||||
} \
|
||||
break; \
|
||||
case AFUNC_NOTEQUAL: \
|
||||
if (!(src_a != a_ref)) { \
|
||||
voodoo->fbiAFuncFail++; \
|
||||
goto skip_pixel; \
|
||||
} \
|
||||
break; \
|
||||
case AFUNC_GREATERTHANEQUAL: \
|
||||
if (!(src_a >= a_ref)) { \
|
||||
voodoo->fbiAFuncFail++; \
|
||||
goto skip_pixel; \
|
||||
} \
|
||||
break; \
|
||||
case AFUNC_ALWAYS: \
|
||||
break; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define ALPHA_BLEND(src_r, src_g, src_b, src_a) \
|
||||
do { \
|
||||
int _a; \
|
||||
int newdest_r = 0, newdest_g = 0, newdest_b = 0; \
|
||||
\
|
||||
switch (dest_afunc) { \
|
||||
case AFUNC_AZERO: \
|
||||
newdest_r = newdest_g = newdest_b = 0; \
|
||||
break; \
|
||||
case AFUNC_ASRC_ALPHA: \
|
||||
newdest_r = (dest_r * src_a) / 255; \
|
||||
newdest_g = (dest_g * src_a) / 255; \
|
||||
newdest_b = (dest_b * src_a) / 255; \
|
||||
break; \
|
||||
case AFUNC_A_COLOR: \
|
||||
newdest_r = (dest_r * src_r) / 255; \
|
||||
newdest_g = (dest_g * src_g) / 255; \
|
||||
newdest_b = (dest_b * src_b) / 255; \
|
||||
break; \
|
||||
case AFUNC_ADST_ALPHA: \
|
||||
newdest_r = (dest_r * dest_a) / 255; \
|
||||
newdest_g = (dest_g * dest_a) / 255; \
|
||||
newdest_b = (dest_b * dest_a) / 255; \
|
||||
break; \
|
||||
case AFUNC_AONE: \
|
||||
newdest_r = dest_r; \
|
||||
newdest_g = dest_g; \
|
||||
newdest_b = dest_b; \
|
||||
break; \
|
||||
case AFUNC_AOMSRC_ALPHA: \
|
||||
newdest_r = (dest_r * (255 - src_a)) / 255; \
|
||||
newdest_g = (dest_g * (255 - src_a)) / 255; \
|
||||
newdest_b = (dest_b * (255 - src_a)) / 255; \
|
||||
break; \
|
||||
case AFUNC_AOM_COLOR: \
|
||||
newdest_r = (dest_r * (255 - src_r)) / 255; \
|
||||
newdest_g = (dest_g * (255 - src_g)) / 255; \
|
||||
newdest_b = (dest_b * (255 - src_b)) / 255; \
|
||||
break; \
|
||||
case AFUNC_AOMDST_ALPHA: \
|
||||
newdest_r = (dest_r * (255 - dest_a)) / 255; \
|
||||
newdest_g = (dest_g * (255 - dest_a)) / 255; \
|
||||
newdest_b = (dest_b * (255 - dest_a)) / 255; \
|
||||
break; \
|
||||
case AFUNC_ASATURATE: \
|
||||
_a = MIN(src_a, 1 - dest_a); \
|
||||
newdest_r = (dest_r * _a) / 255; \
|
||||
newdest_g = (dest_g * _a) / 255; \
|
||||
newdest_b = (dest_b * _a) / 255; \
|
||||
break; \
|
||||
} \
|
||||
\
|
||||
switch (src_afunc) { \
|
||||
case AFUNC_AZERO: \
|
||||
src_r = src_g = src_b = 0; \
|
||||
break; \
|
||||
case AFUNC_ASRC_ALPHA: \
|
||||
src_r = (src_r * src_a) / 255; \
|
||||
src_g = (src_g * src_a) / 255; \
|
||||
src_b = (src_b * src_a) / 255; \
|
||||
break; \
|
||||
case AFUNC_A_COLOR: \
|
||||
src_r = (src_r * dest_r) / 255; \
|
||||
src_g = (src_g * dest_g) / 255; \
|
||||
src_b = (src_b * dest_b) / 255; \
|
||||
break; \
|
||||
case AFUNC_ADST_ALPHA: \
|
||||
src_r = (src_r * dest_a) / 255; \
|
||||
src_g = (src_g * dest_a) / 255; \
|
||||
src_b = (src_b * dest_a) / 255; \
|
||||
break; \
|
||||
case AFUNC_AONE: \
|
||||
break; \
|
||||
case AFUNC_AOMSRC_ALPHA: \
|
||||
src_r = (src_r * (255 - src_a)) / 255; \
|
||||
src_g = (src_g * (255 - src_a)) / 255; \
|
||||
src_b = (src_b * (255 - src_a)) / 255; \
|
||||
break; \
|
||||
case AFUNC_AOM_COLOR: \
|
||||
src_r = (src_r * (255 - dest_r)) / 255; \
|
||||
src_g = (src_g * (255 - dest_g)) / 255; \
|
||||
src_b = (src_b * (255 - dest_b)) / 255; \
|
||||
break; \
|
||||
case AFUNC_AOMDST_ALPHA: \
|
||||
src_r = (src_r * (255 - dest_a)) / 255; \
|
||||
src_g = (src_g * (255 - dest_a)) / 255; \
|
||||
src_b = (src_b * (255 - dest_a)) / 255; \
|
||||
break; \
|
||||
case AFUNC_ACOLORBEFOREFOG: \
|
||||
fatal("AFUNC_ACOLORBEFOREFOG\n"); \
|
||||
break; \
|
||||
} \
|
||||
\
|
||||
src_r += newdest_r; \
|
||||
src_g += newdest_g; \
|
||||
src_b += newdest_b; \
|
||||
\
|
||||
src_r = CLAMP(src_r); \
|
||||
src_g = CLAMP(src_g); \
|
||||
src_b = CLAMP(src_b); \
|
||||
} while (0)
|
||||
|
||||
void voodoo_render_thread_1(void *param);
|
||||
void voodoo_render_thread_2(void *param);
|
||||
@@ -309,35 +277,32 @@ void voodoo_queue_triangle(voodoo_t *voodoo, voodoo_params_t *params);
|
||||
extern int voodoo_recomp;
|
||||
extern int tris;
|
||||
|
||||
static __inline void voodoo_wake_render_thread(voodoo_t *voodoo)
|
||||
static __inline void
|
||||
voodoo_wake_render_thread(voodoo_t *voodoo)
|
||||
{
|
||||
thread_set_event(voodoo->wake_render_thread[0]); /*Wake up render thread if moving from idle*/
|
||||
if (voodoo->render_threads >= 2)
|
||||
thread_set_event(voodoo->wake_render_thread[1]); /*Wake up render thread if moving from idle*/
|
||||
if (voodoo->render_threads == 4)
|
||||
{
|
||||
thread_set_event(voodoo->wake_render_thread[2]); /*Wake up render thread if moving from idle*/
|
||||
thread_set_event(voodoo->wake_render_thread[3]); /*Wake up render thread if moving from idle*/
|
||||
}
|
||||
thread_set_event(voodoo->wake_render_thread[0]); /*Wake up render thread if moving from idle*/
|
||||
if (voodoo->render_threads >= 2)
|
||||
thread_set_event(voodoo->wake_render_thread[1]); /*Wake up render thread if moving from idle*/
|
||||
if (voodoo->render_threads == 4) {
|
||||
thread_set_event(voodoo->wake_render_thread[2]); /*Wake up render thread if moving from idle*/
|
||||
thread_set_event(voodoo->wake_render_thread[3]); /*Wake up render thread if moving from idle*/
|
||||
}
|
||||
}
|
||||
|
||||
static __inline void voodoo_wait_for_render_thread_idle(voodoo_t *voodoo)
|
||||
static __inline void
|
||||
voodoo_wait_for_render_thread_idle(voodoo_t *voodoo)
|
||||
{
|
||||
while (!PARAM_EMPTY(0) || (voodoo->render_threads >= 2 && !PARAM_EMPTY(1)) ||
|
||||
(voodoo->render_threads == 4 && (!PARAM_EMPTY(2) || !PARAM_EMPTY(3))) ||
|
||||
voodoo->render_voodoo_busy[0] || (voodoo->render_threads >= 2 && voodoo->render_voodoo_busy[1]) ||
|
||||
(voodoo->render_threads == 4 && (voodoo->render_voodoo_busy[2] || voodoo->render_voodoo_busy[3])))
|
||||
{
|
||||
voodoo_wake_render_thread(voodoo);
|
||||
if (!PARAM_EMPTY(0) || voodoo->render_voodoo_busy[0])
|
||||
thread_wait_event(voodoo->render_not_full_event[0], 1);
|
||||
if (voodoo->render_threads >= 2 && (!PARAM_EMPTY(1) || voodoo->render_voodoo_busy[1]))
|
||||
thread_wait_event(voodoo->render_not_full_event[1], 1);
|
||||
if (voodoo->render_threads == 4 && (!PARAM_EMPTY(2) || voodoo->render_voodoo_busy[2]))
|
||||
thread_wait_event(voodoo->render_not_full_event[2], 1);
|
||||
if (voodoo->render_threads == 4 && (!PARAM_EMPTY(3) || voodoo->render_voodoo_busy[3]))
|
||||
thread_wait_event(voodoo->render_not_full_event[3], 1);
|
||||
}
|
||||
while (!PARAM_EMPTY(0) || (voodoo->render_threads >= 2 && !PARAM_EMPTY(1)) || (voodoo->render_threads == 4 && (!PARAM_EMPTY(2) || !PARAM_EMPTY(3))) || voodoo->render_voodoo_busy[0] || (voodoo->render_threads >= 2 && voodoo->render_voodoo_busy[1]) || (voodoo->render_threads == 4 && (voodoo->render_voodoo_busy[2] || voodoo->render_voodoo_busy[3]))) {
|
||||
voodoo_wake_render_thread(voodoo);
|
||||
if (!PARAM_EMPTY(0) || voodoo->render_voodoo_busy[0])
|
||||
thread_wait_event(voodoo->render_not_full_event[0], 1);
|
||||
if (voodoo->render_threads >= 2 && (!PARAM_EMPTY(1) || voodoo->render_voodoo_busy[1]))
|
||||
thread_wait_event(voodoo->render_not_full_event[1], 1);
|
||||
if (voodoo->render_threads == 4 && (!PARAM_EMPTY(2) || voodoo->render_voodoo_busy[2]))
|
||||
thread_wait_event(voodoo->render_not_full_event[2], 1);
|
||||
if (voodoo->render_threads == 4 && (!PARAM_EMPTY(3) || voodoo->render_voodoo_busy[3]))
|
||||
thread_wait_event(voodoo->render_not_full_event[3], 1);
|
||||
}
|
||||
}
|
||||
|
||||
#endif /*VIDEO_VOODOO_RENDER_H*/
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
*/
|
||||
|
||||
#ifndef VIDEO_VOODOO_SETUP_H
|
||||
# define VIDEO_VOODOO_SETUP_H
|
||||
#define VIDEO_VOODOO_SETUP_H
|
||||
|
||||
void voodoo_triangle_setup(voodoo_t *voodoo);
|
||||
|
||||
|
||||
@@ -17,21 +17,20 @@
|
||||
*/
|
||||
|
||||
#ifndef VIDEO_VOODOO_TEXTURE_H
|
||||
# define VIDEO_VOODOO_TEXTURE_H
|
||||
#define VIDEO_VOODOO_TEXTURE_H
|
||||
|
||||
static const uint32_t texture_offset[LOD_MAX+3] =
|
||||
{
|
||||
0,
|
||||
256*256,
|
||||
256*256 + 128*128,
|
||||
256*256 + 128*128 + 64*64,
|
||||
256*256 + 128*128 + 64*64 + 32*32,
|
||||
256*256 + 128*128 + 64*64 + 32*32 + 16*16,
|
||||
256*256 + 128*128 + 64*64 + 32*32 + 16*16 + 8*8,
|
||||
256*256 + 128*128 + 64*64 + 32*32 + 16*16 + 8*8 + 4*4,
|
||||
256*256 + 128*128 + 64*64 + 32*32 + 16*16 + 8*8 + 4*4 + 2*2,
|
||||
256*256 + 128*128 + 64*64 + 32*32 + 16*16 + 8*8 + 4*4 + 2*2 + 1*1,
|
||||
256*256 + 128*128 + 64*64 + 32*32 + 16*16 + 8*8 + 4*4 + 2*2 + 1*1 + 1
|
||||
static const uint32_t texture_offset[LOD_MAX + 3] = {
|
||||
0,
|
||||
256 * 256,
|
||||
256 * 256 + 128 * 128,
|
||||
256 * 256 + 128 * 128 + 64 * 64,
|
||||
256 * 256 + 128 * 128 + 64 * 64 + 32 * 32,
|
||||
256 * 256 + 128 * 128 + 64 * 64 + 32 * 32 + 16 * 16,
|
||||
256 * 256 + 128 * 128 + 64 * 64 + 32 * 32 + 16 * 16 + 8 * 8,
|
||||
256 * 256 + 128 * 128 + 64 * 64 + 32 * 32 + 16 * 16 + 8 * 8 + 4 * 4,
|
||||
256 * 256 + 128 * 128 + 64 * 64 + 32 * 32 + 16 * 16 + 8 * 8 + 4 * 4 + 2 * 2,
|
||||
256 * 256 + 128 * 128 + 64 * 64 + 32 * 32 + 16 * 16 + 8 * 8 + 4 * 4 + 2 * 2 + 1 * 1,
|
||||
256 * 256 + 128 * 128 + 64 * 64 + 32 * 32 + 16 * 16 + 8 * 8 + 4 * 4 + 2 * 2 + 1 * 1 + 1
|
||||
};
|
||||
|
||||
void voodoo_recalc_tex(voodoo_t *voodoo, int tmu);
|
||||
|
||||
@@ -16,55 +16,55 @@
|
||||
*/
|
||||
|
||||
#ifndef VIDEO_XGA_H
|
||||
# define VIDEO_XGA_H
|
||||
#define VIDEO_XGA_H
|
||||
|
||||
#include <86box/rom.h>
|
||||
|
||||
typedef struct {
|
||||
int ena;
|
||||
int x, y, xoff, yoff, cur_xsize, cur_ysize;
|
||||
int ena;
|
||||
int x, y, xoff, yoff, cur_xsize, cur_ysize;
|
||||
uint32_t addr;
|
||||
} xga_hwcursor_t;
|
||||
|
||||
typedef struct xga_t
|
||||
{
|
||||
mem_mapping_t memio_mapping;
|
||||
mem_mapping_t linear_mapping;
|
||||
mem_mapping_t video_mapping;
|
||||
rom_t bios_rom;
|
||||
xga_hwcursor_t hwcursor, hwcursor_latch;
|
||||
PALETTE extpal;
|
||||
typedef struct xga_t {
|
||||
mem_mapping_t memio_mapping;
|
||||
mem_mapping_t linear_mapping;
|
||||
mem_mapping_t video_mapping;
|
||||
rom_t bios_rom;
|
||||
xga_hwcursor_t hwcursor, hwcursor_latch;
|
||||
PALETTE extpal;
|
||||
|
||||
uint8_t test, atest[2], testpixel;;
|
||||
uint8_t pos_regs[8];
|
||||
uint8_t disp_addr;
|
||||
uint8_t cfg_reg;
|
||||
uint8_t instance;
|
||||
uint8_t op_mode;
|
||||
uint8_t aperture_cntl;
|
||||
uint8_t ap_idx;
|
||||
uint8_t access_mode;
|
||||
uint8_t regs[0x100];
|
||||
uint8_t regs_idx;
|
||||
uint8_t hwc_hotspot_x;
|
||||
uint8_t hwc_hotspot_y;
|
||||
uint8_t disp_cntl_1, disp_cntl_2;
|
||||
uint8_t clk_sel_1, clk_sel_2;
|
||||
uint8_t hwc_control;
|
||||
uint8_t bus_arb;
|
||||
uint8_t select_pos_isa;
|
||||
uint8_t hwcursor_oddeven;
|
||||
uint8_t cfg_reg_instance;
|
||||
uint8_t rowcount;
|
||||
uint8_t pal_idx, pal_idx_prefetch;
|
||||
uint8_t pal_seq;
|
||||
uint8_t pal_mask;
|
||||
uint8_t pal_r, pal_r_prefetch;
|
||||
uint8_t pal_g, pal_g_prefetch;
|
||||
uint8_t pal_b, pal_b_prefetch;
|
||||
uint8_t sprite_data[1024];
|
||||
uint8_t scrollcache;
|
||||
uint8_t direct_color;
|
||||
uint8_t test, atest[2], testpixel;
|
||||
;
|
||||
uint8_t pos_regs[8];
|
||||
uint8_t disp_addr;
|
||||
uint8_t cfg_reg;
|
||||
uint8_t instance;
|
||||
uint8_t op_mode;
|
||||
uint8_t aperture_cntl;
|
||||
uint8_t ap_idx;
|
||||
uint8_t access_mode;
|
||||
uint8_t regs[0x100];
|
||||
uint8_t regs_idx;
|
||||
uint8_t hwc_hotspot_x;
|
||||
uint8_t hwc_hotspot_y;
|
||||
uint8_t disp_cntl_1, disp_cntl_2;
|
||||
uint8_t clk_sel_1, clk_sel_2;
|
||||
uint8_t hwc_control;
|
||||
uint8_t bus_arb;
|
||||
uint8_t select_pos_isa;
|
||||
uint8_t hwcursor_oddeven;
|
||||
uint8_t cfg_reg_instance;
|
||||
uint8_t rowcount;
|
||||
uint8_t pal_idx, pal_idx_prefetch;
|
||||
uint8_t pal_seq;
|
||||
uint8_t pal_mask;
|
||||
uint8_t pal_r, pal_r_prefetch;
|
||||
uint8_t pal_g, pal_g_prefetch;
|
||||
uint8_t pal_b, pal_b_prefetch;
|
||||
uint8_t sprite_data[1024];
|
||||
uint8_t scrollcache;
|
||||
uint8_t direct_color;
|
||||
uint8_t *vram, *changedvram;
|
||||
|
||||
int16_t hwc_pos_x;
|
||||
@@ -84,7 +84,7 @@ typedef struct xga_t
|
||||
uint16_t sprite_pal_addr_idx_prefetch;
|
||||
|
||||
int v_total, dispend, v_syncstart, split, v_blankstart,
|
||||
h_disp, h_disp_old, h_total, h_disp_time, rowoffset,
|
||||
h_disp, h_disp_old, h_total, h_disp_time, rowoffset,
|
||||
dispon, h_disp_on, vc, sc, linepos, oddeven, firstline, lastline,
|
||||
firstline_draw, lastline_draw, displine, fullchange, interlace,
|
||||
char_width, hwcursor_on;
|
||||
@@ -103,10 +103,10 @@ typedef struct xga_t
|
||||
uint32_t vram_size;
|
||||
uint32_t vram_mask;
|
||||
uint32_t rom_addr;
|
||||
uint32_t ma, maback;
|
||||
uint32_t extpallook[256];
|
||||
uint32_t read_bank, write_bank;
|
||||
uint32_t px_map_base;
|
||||
uint32_t ma, maback;
|
||||
uint32_t extpallook[256];
|
||||
uint32_t read_bank, write_bank;
|
||||
uint32_t px_map_base;
|
||||
|
||||
uint64_t dispontime, dispofftime;
|
||||
|
||||
@@ -153,7 +153,7 @@ typedef struct xga_t
|
||||
uint32_t command;
|
||||
uint32_t dir_cmd;
|
||||
|
||||
uint8_t px_map_format[4];
|
||||
uint8_t px_map_format[4];
|
||||
uint16_t px_map_width[4];
|
||||
uint16_t px_map_height[4];
|
||||
uint32_t px_map_base[4];
|
||||
@@ -161,4 +161,4 @@ typedef struct xga_t
|
||||
|
||||
volatile int force_busy;
|
||||
} xga_t;
|
||||
#endif /*VIDEO_XGA_H*/
|
||||
#endif /*VIDEO_XGA_H*/
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
*/
|
||||
|
||||
#ifndef VIDEO_XGA_DEVICE_H
|
||||
# define VIDEO_XGA_DEVICE_H
|
||||
#define VIDEO_XGA_DEVICE_H
|
||||
extern const device_t xga_device;
|
||||
extern const device_t xga_isa_device;
|
||||
#endif /*VIDEO_XGA_DEVICE_H*/
|
||||
#endif /*VIDEO_XGA_DEVICE_H*/
|
||||
|
||||
@@ -20,19 +20,18 @@
|
||||
*/
|
||||
|
||||
#ifndef EMU_VIDEO_H
|
||||
# define EMU_VIDEO_H
|
||||
#define EMU_VIDEO_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
#include <atomic>
|
||||
# include <atomic>
|
||||
using atomic_bool = std::atomic_bool;
|
||||
using atomic_int = std::atomic_int;
|
||||
using atomic_int = std::atomic_int;
|
||||
#else
|
||||
#include <stdatomic.h>
|
||||
# include <stdatomic.h>
|
||||
#endif
|
||||
|
||||
#define makecol(r, g, b) ((b) | ((g) << 8) | ((r) << 16))
|
||||
#define makecol32(r, g, b) ((b) | ((g) << 8) | ((r) << 16))
|
||||
|
||||
#define makecol(r, g, b) ((b) | ((g) << 8) | ((r) << 16))
|
||||
#define makecol32(r, g, b) ((b) | ((g) << 8) | ((r) << 16))
|
||||
|
||||
enum {
|
||||
VID_NONE = 0,
|
||||
@@ -46,12 +45,10 @@ enum {
|
||||
FULLSCR_SCALE_INT
|
||||
};
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
enum {
|
||||
VIDEO_ISA = 0,
|
||||
VIDEO_MCA,
|
||||
@@ -63,64 +60,63 @@ enum {
|
||||
#define VIDEO_FLAG_TYPE_CGA 0
|
||||
#define VIDEO_FLAG_TYPE_MDA 1
|
||||
#define VIDEO_FLAG_TYPE_SPECIAL 2
|
||||
#define VIDEO_FLAG_TYPE_NONE 3
|
||||
#define VIDEO_FLAG_TYPE_NONE 3
|
||||
#define VIDEO_FLAG_TYPE_MASK 3
|
||||
|
||||
typedef struct {
|
||||
int type;
|
||||
int write_b, write_w, write_l;
|
||||
int read_b, read_w, read_l;
|
||||
int type;
|
||||
int write_b, write_w, write_l;
|
||||
int read_b, read_w, read_l;
|
||||
} video_timings_t;
|
||||
|
||||
typedef struct {
|
||||
int w, h;
|
||||
uint32_t *dat;
|
||||
uint32_t *line[2112];
|
||||
int w, h;
|
||||
uint32_t *dat;
|
||||
uint32_t *line[2112];
|
||||
} bitmap_t;
|
||||
|
||||
typedef struct {
|
||||
uint8_t r, g, b;
|
||||
uint8_t r, g, b;
|
||||
} rgb_t;
|
||||
|
||||
typedef struct {
|
||||
uint8_t chr[32];
|
||||
uint8_t chr[32];
|
||||
} dbcs_font_t;
|
||||
|
||||
struct blit_data_struct;
|
||||
|
||||
typedef struct monitor_t
|
||||
{
|
||||
char name[512];
|
||||
int mon_xsize;
|
||||
int mon_ysize;
|
||||
int mon_scrnsz_x;
|
||||
int mon_scrnsz_y;
|
||||
int mon_efscrnsz_y;
|
||||
int mon_unscaled_size_x;
|
||||
int mon_unscaled_size_y;
|
||||
int mon_res_x;
|
||||
int mon_res_y;
|
||||
int mon_bpp;
|
||||
bitmap_t* target_buffer;
|
||||
int mon_video_timing_read_b,
|
||||
mon_video_timing_read_w,
|
||||
mon_video_timing_read_l;
|
||||
int mon_video_timing_write_b,
|
||||
mon_video_timing_write_w,
|
||||
mon_video_timing_write_l;
|
||||
int mon_overscan_x;
|
||||
int mon_overscan_y;
|
||||
int mon_force_resize;
|
||||
int mon_fullchange;
|
||||
int mon_changeframecount;
|
||||
atomic_int mon_screenshots;
|
||||
uint32_t* mon_pal_lookup;
|
||||
int* mon_cga_palette;
|
||||
int mon_pal_lookup_static; /* Whether it should not be freed by the API. */
|
||||
int mon_cga_palette_static; /* Whether it should not be freed by the API. */
|
||||
const video_timings_t* mon_vid_timings;
|
||||
int mon_vid_type;
|
||||
struct blit_data_struct* mon_blit_data_ptr;
|
||||
typedef struct monitor_t {
|
||||
char name[512];
|
||||
int mon_xsize;
|
||||
int mon_ysize;
|
||||
int mon_scrnsz_x;
|
||||
int mon_scrnsz_y;
|
||||
int mon_efscrnsz_y;
|
||||
int mon_unscaled_size_x;
|
||||
int mon_unscaled_size_y;
|
||||
int mon_res_x;
|
||||
int mon_res_y;
|
||||
int mon_bpp;
|
||||
bitmap_t *target_buffer;
|
||||
int mon_video_timing_read_b,
|
||||
mon_video_timing_read_w,
|
||||
mon_video_timing_read_l;
|
||||
int mon_video_timing_write_b,
|
||||
mon_video_timing_write_w,
|
||||
mon_video_timing_write_l;
|
||||
int mon_overscan_x;
|
||||
int mon_overscan_y;
|
||||
int mon_force_resize;
|
||||
int mon_fullchange;
|
||||
int mon_changeframecount;
|
||||
atomic_int mon_screenshots;
|
||||
uint32_t *mon_pal_lookup;
|
||||
int *mon_cga_palette;
|
||||
int mon_pal_lookup_static; /* Whether it should not be freed by the API. */
|
||||
int mon_cga_palette_static; /* Whether it should not be freed by the API. */
|
||||
const video_timings_t *mon_vid_timings;
|
||||
int mon_vid_type;
|
||||
struct blit_data_struct *mon_blit_data_ptr;
|
||||
} monitor_t;
|
||||
|
||||
typedef struct monitor_settings_t {
|
||||
@@ -131,159 +127,154 @@ typedef struct monitor_settings_t {
|
||||
} monitor_settings_t;
|
||||
|
||||
#define MONITORS_NUM 2
|
||||
extern monitor_t monitors[MONITORS_NUM];
|
||||
extern monitor_t monitors[MONITORS_NUM];
|
||||
extern monitor_settings_t monitor_settings[MONITORS_NUM];
|
||||
extern atomic_bool doresize_monitors[MONITORS_NUM];
|
||||
extern int monitor_index_global;
|
||||
extern int gfxcard_2;
|
||||
extern int show_second_monitors;
|
||||
extern atomic_bool doresize_monitors[MONITORS_NUM];
|
||||
extern int monitor_index_global;
|
||||
extern int gfxcard_2;
|
||||
extern int show_second_monitors;
|
||||
|
||||
typedef rgb_t PALETTE[256];
|
||||
|
||||
|
||||
//extern int changeframecount;
|
||||
// extern int changeframecount;
|
||||
|
||||
extern volatile int screenshots;
|
||||
//extern bitmap_t *buffer32;
|
||||
#define buffer32 (monitors[monitor_index_global].target_buffer)
|
||||
#define pal_lookup (monitors[monitor_index_global].mon_pal_lookup)
|
||||
#define overscan_x (monitors[monitor_index_global].mon_overscan_x)
|
||||
#define overscan_y (monitors[monitor_index_global].mon_overscan_y)
|
||||
#define video_timing_read_b (monitors[monitor_index_global].mon_video_timing_read_b)
|
||||
#define video_timing_read_l (monitors[monitor_index_global].mon_video_timing_read_l)
|
||||
#define video_timing_read_w (monitors[monitor_index_global].mon_video_timing_read_w)
|
||||
// extern bitmap_t *buffer32;
|
||||
#define buffer32 (monitors[monitor_index_global].target_buffer)
|
||||
#define pal_lookup (monitors[monitor_index_global].mon_pal_lookup)
|
||||
#define overscan_x (monitors[monitor_index_global].mon_overscan_x)
|
||||
#define overscan_y (monitors[monitor_index_global].mon_overscan_y)
|
||||
#define video_timing_read_b (monitors[monitor_index_global].mon_video_timing_read_b)
|
||||
#define video_timing_read_l (monitors[monitor_index_global].mon_video_timing_read_l)
|
||||
#define video_timing_read_w (monitors[monitor_index_global].mon_video_timing_read_w)
|
||||
#define video_timing_write_b (monitors[monitor_index_global].mon_video_timing_write_b)
|
||||
#define video_timing_write_l (monitors[monitor_index_global].mon_video_timing_write_l)
|
||||
#define video_timing_write_w (monitors[monitor_index_global].mon_video_timing_write_w)
|
||||
#define video_res_x (monitors[monitor_index_global].mon_res_x)
|
||||
#define video_res_y (monitors[monitor_index_global].mon_res_y)
|
||||
#define video_bpp (monitors[monitor_index_global].mon_bpp)
|
||||
#define xsize (monitors[monitor_index_global].mon_xsize)
|
||||
#define ysize (monitors[monitor_index_global].mon_ysize)
|
||||
#define cga_palette (*monitors[monitor_index_global].mon_cga_palette)
|
||||
#define changeframecount (monitors[monitor_index_global].mon_changeframecount)
|
||||
#define scrnsz_x (monitors[monitor_index_global].mon_scrnsz_x)
|
||||
#define scrnsz_y (monitors[monitor_index_global].mon_scrnsz_y)
|
||||
#define efscrnsz_y (monitors[monitor_index_global].mon_efscrnsz_y)
|
||||
#define unscaled_size_x (monitors[monitor_index_global].mon_unscaled_size_x)
|
||||
#define unscaled_size_y (monitors[monitor_index_global].mon_unscaled_size_y)
|
||||
extern PALETTE cgapal,
|
||||
cgapal_mono[6];
|
||||
//extern uint32_t pal_lookup[256];
|
||||
extern int video_fullscreen,
|
||||
video_fullscreen_scale,
|
||||
video_fullscreen_first;
|
||||
extern uint8_t fontdat[2048][8];
|
||||
extern uint8_t fontdatm[2048][16];
|
||||
extern uint8_t fontdatw[512][32];
|
||||
extern uint8_t fontdat8x12[256][16];
|
||||
extern uint8_t fontdat12x18[256][36];
|
||||
extern dbcs_font_t *fontdatksc5601;
|
||||
extern dbcs_font_t *fontdatksc5601_user;
|
||||
extern uint32_t *video_6to8,
|
||||
*video_8togs,
|
||||
*video_8to32,
|
||||
*video_15to32,
|
||||
*video_16to32;
|
||||
extern int enable_overscan;
|
||||
extern int force_43;
|
||||
extern int vid_resize;
|
||||
extern int herc_blend;
|
||||
extern int vid_cga_contrast;
|
||||
extern int video_grayscale;
|
||||
extern int video_graytype;
|
||||
|
||||
extern double cpuclock;
|
||||
extern int emu_fps,
|
||||
frames;
|
||||
extern int readflash;
|
||||
#define video_res_x (monitors[monitor_index_global].mon_res_x)
|
||||
#define video_res_y (monitors[monitor_index_global].mon_res_y)
|
||||
#define video_bpp (monitors[monitor_index_global].mon_bpp)
|
||||
#define xsize (monitors[monitor_index_global].mon_xsize)
|
||||
#define ysize (monitors[monitor_index_global].mon_ysize)
|
||||
#define cga_palette (*monitors[monitor_index_global].mon_cga_palette)
|
||||
#define changeframecount (monitors[monitor_index_global].mon_changeframecount)
|
||||
#define scrnsz_x (monitors[monitor_index_global].mon_scrnsz_x)
|
||||
#define scrnsz_y (monitors[monitor_index_global].mon_scrnsz_y)
|
||||
#define efscrnsz_y (monitors[monitor_index_global].mon_efscrnsz_y)
|
||||
#define unscaled_size_x (monitors[monitor_index_global].mon_unscaled_size_x)
|
||||
#define unscaled_size_y (monitors[monitor_index_global].mon_unscaled_size_y)
|
||||
extern PALETTE cgapal,
|
||||
cgapal_mono[6];
|
||||
// extern uint32_t pal_lookup[256];
|
||||
extern int video_fullscreen,
|
||||
video_fullscreen_scale,
|
||||
video_fullscreen_first;
|
||||
extern uint8_t fontdat[2048][8];
|
||||
extern uint8_t fontdatm[2048][16];
|
||||
extern uint8_t fontdatw[512][32];
|
||||
extern uint8_t fontdat8x12[256][16];
|
||||
extern uint8_t fontdat12x18[256][36];
|
||||
extern dbcs_font_t *fontdatksc5601;
|
||||
extern dbcs_font_t *fontdatksc5601_user;
|
||||
extern uint32_t *video_6to8,
|
||||
*video_8togs,
|
||||
*video_8to32,
|
||||
*video_15to32,
|
||||
*video_16to32;
|
||||
extern int enable_overscan;
|
||||
extern int force_43;
|
||||
extern int vid_resize;
|
||||
extern int herc_blend;
|
||||
extern int vid_cga_contrast;
|
||||
extern int video_grayscale;
|
||||
extern int video_graytype;
|
||||
|
||||
extern double cpuclock;
|
||||
extern int emu_fps,
|
||||
frames;
|
||||
extern int readflash;
|
||||
|
||||
/* Function handler pointers. */
|
||||
extern void (*video_recalctimings)(void);
|
||||
extern void video_screenshot_monitor(uint32_t *buf, int start_x, int start_y, int row_len, int monitor_index);
|
||||
extern void video_screenshot(uint32_t *buf, int start_x, int start_y, int row_len);
|
||||
extern void (*video_recalctimings)(void);
|
||||
extern void video_screenshot_monitor(uint32_t *buf, int start_x, int start_y, int row_len, int monitor_index);
|
||||
extern void video_screenshot(uint32_t *buf, int start_x, int start_y, int row_len);
|
||||
|
||||
#ifdef _WIN32
|
||||
extern void * __cdecl (*video_copy)(void *_Dst, const void *_Src, size_t _Size);
|
||||
extern void * __cdecl video_transform_copy(void *_Dst, const void *_Src, size_t _Size);
|
||||
extern void *__cdecl (*video_copy)(void *_Dst, const void *_Src, size_t _Size);
|
||||
extern void *__cdecl video_transform_copy(void *_Dst, const void *_Src, size_t _Size);
|
||||
#else
|
||||
extern void * (*video_copy)(void *__restrict _Dst, const void *__restrict _Src, size_t _Size);
|
||||
extern void * video_transform_copy(void *__restrict _Dst, const void *__restrict _Src, size_t _Size);
|
||||
extern void *(*video_copy)(void *__restrict _Dst, const void *__restrict _Src, size_t _Size);
|
||||
extern void *video_transform_copy(void *__restrict _Dst, const void *__restrict _Src, size_t _Size);
|
||||
#endif
|
||||
|
||||
|
||||
/* Table functions. */
|
||||
extern int video_card_available(int card);
|
||||
extern int video_card_available(int card);
|
||||
#ifdef EMU_DEVICE_H
|
||||
extern const device_t *video_card_getdevice(int card);
|
||||
extern const device_t *video_card_getdevice(int card);
|
||||
#endif
|
||||
extern int video_card_has_config(int card);
|
||||
extern char *video_get_internal_name(int card);
|
||||
extern int video_get_video_from_internal_name(char *s);
|
||||
extern int video_card_get_flags(int card);
|
||||
extern int video_is_mda(void);
|
||||
extern int video_is_cga(void);
|
||||
extern int video_is_ega_vga(void);
|
||||
extern void video_inform_monitor(int type, const video_timings_t *ptr, int monitor_index);
|
||||
extern int video_get_type_monitor(int monitor_index);
|
||||
extern int video_card_has_config(int card);
|
||||
extern char *video_get_internal_name(int card);
|
||||
extern int video_get_video_from_internal_name(char *s);
|
||||
extern int video_card_get_flags(int card);
|
||||
extern int video_is_mda(void);
|
||||
extern int video_is_cga(void);
|
||||
extern int video_is_ega_vga(void);
|
||||
extern void video_inform_monitor(int type, const video_timings_t *ptr, int monitor_index);
|
||||
extern int video_get_type_monitor(int monitor_index);
|
||||
|
||||
extern void video_setblit(void (*blit)(int, int, int, int, int));
|
||||
extern void video_blend(int x, int y);
|
||||
extern void video_blit_memtoscreen_8(int x, int y, int w, int h);
|
||||
extern void video_blend_monitor(int x, int y, int monitor_index);
|
||||
extern void video_blit_memtoscreen_8_monitor(int x, int y, int w, int h, int monitor_index);
|
||||
extern void video_blit_memtoscreen_monitor(int x, int y, int w, int h, int monitor_index);
|
||||
extern void video_blit_complete_monitor(int monitor_index);
|
||||
extern void video_wait_for_blit_monitor(int monitor_index);
|
||||
extern void video_wait_for_buffer_monitor(int monitor_index);
|
||||
|
||||
extern void video_setblit(void(*blit)(int,int,int,int,int));
|
||||
extern void video_blend(int x, int y);
|
||||
extern void video_blit_memtoscreen_8(int x, int y, int w, int h);
|
||||
extern void video_blend_monitor(int x, int y, int monitor_index);
|
||||
extern void video_blit_memtoscreen_8_monitor(int x, int y, int w, int h, int monitor_index);
|
||||
extern void video_blit_memtoscreen_monitor(int x, int y, int w, int h, int monitor_index);
|
||||
extern void video_blit_complete_monitor(int monitor_index);
|
||||
extern void video_wait_for_blit_monitor(int monitor_index);
|
||||
extern void video_wait_for_buffer_monitor(int monitor_index);
|
||||
extern bitmap_t *create_bitmap(int w, int h);
|
||||
extern void destroy_bitmap(bitmap_t *b);
|
||||
extern void cgapal_rebuild_monitor(int monitor_index);
|
||||
extern void hline(bitmap_t *b, int x1, int y, int x2, uint32_t col);
|
||||
extern void updatewindowsize(int x, int y);
|
||||
|
||||
extern bitmap_t *create_bitmap(int w, int h);
|
||||
extern void destroy_bitmap(bitmap_t *b);
|
||||
extern void cgapal_rebuild_monitor(int monitor_index);
|
||||
extern void hline(bitmap_t *b, int x1, int y, int x2, uint32_t col);
|
||||
extern void updatewindowsize(int x, int y);
|
||||
extern void video_monitor_init(int);
|
||||
extern void video_monitor_close(int);
|
||||
extern void video_init(void);
|
||||
extern void video_close(void);
|
||||
extern void video_reset_close(void);
|
||||
extern void video_pre_reset(int card);
|
||||
extern void video_reset(int card);
|
||||
extern uint8_t video_force_resize_get_monitor(int monitor_index);
|
||||
extern void video_force_resize_set_monitor(uint8_t res, int monitor_index);
|
||||
extern void video_update_timing(void);
|
||||
|
||||
extern void video_monitor_init(int);
|
||||
extern void video_monitor_close(int);
|
||||
extern void video_init(void);
|
||||
extern void video_close(void);
|
||||
extern void video_reset_close(void);
|
||||
extern void video_pre_reset(int card);
|
||||
extern void video_reset(int card);
|
||||
extern uint8_t video_force_resize_get_monitor(int monitor_index);
|
||||
extern void video_force_resize_set_monitor(uint8_t res, int monitor_index);
|
||||
extern void video_update_timing(void);
|
||||
extern void loadfont_ex(char *s, int format, int offset);
|
||||
extern void loadfont(char *s, int format);
|
||||
|
||||
extern void loadfont_ex(char *s, int format, int offset);
|
||||
extern void loadfont(char *s, int format);
|
||||
extern int get_actual_size_x(void);
|
||||
extern int get_actual_size_y(void);
|
||||
|
||||
extern int get_actual_size_x(void);
|
||||
extern int get_actual_size_y(void);
|
||||
extern uint32_t video_color_transform(uint32_t color);
|
||||
|
||||
extern uint32_t video_color_transform(uint32_t color);
|
||||
|
||||
extern void agpgart_set_aperture(void *handle, uint32_t base, uint32_t size, int enable);
|
||||
extern void agpgart_set_gart(void *handle, uint32_t base);
|
||||
extern void agpgart_set_aperture(void *handle, uint32_t base, uint32_t size, int enable);
|
||||
extern void agpgart_set_gart(void *handle, uint32_t base);
|
||||
|
||||
#define video_inform(type, video_timings_ptr) video_inform_monitor(type, video_timings_ptr, monitor_index_global)
|
||||
#define video_get_type() video_get_type_monitor(0)
|
||||
#define video_blend(x, y) video_blend_monitor(x, y, monitor_index_global)
|
||||
#define video_blit_memtoscreen(x, y, w, h) video_blit_memtoscreen_monitor(x, y, w, h, monitor_index_global)
|
||||
#define video_blit_memtoscreen_8(x, y, w, h) video_blit_memtoscreen_8_monitor(x, y, w, h, monitor_index_global)
|
||||
#define video_blit_complete() video_blit_complete_monitor(monitor_index_global)
|
||||
#define video_wait_for_blit() video_wait_for_blit_monitor(monitor_index_global)
|
||||
#define video_wait_for_buffer() video_wait_for_buffer_monitor(monitor_index_global)
|
||||
#define cgapal_rebuild() cgapal_rebuild_monitor(monitor_index_global)
|
||||
#define video_force_resize_get() video_force_resize_get_monitor(monitor_index_global)
|
||||
#define video_force_resize_set(val) video_force_resize_set_monitor(val, monitor_index_global)
|
||||
#define video_get_type() video_get_type_monitor(0)
|
||||
#define video_blend(x, y) video_blend_monitor(x, y, monitor_index_global)
|
||||
#define video_blit_memtoscreen(x, y, w, h) video_blit_memtoscreen_monitor(x, y, w, h, monitor_index_global)
|
||||
#define video_blit_memtoscreen_8(x, y, w, h) video_blit_memtoscreen_8_monitor(x, y, w, h, monitor_index_global)
|
||||
#define video_blit_complete() video_blit_complete_monitor(monitor_index_global)
|
||||
#define video_wait_for_blit() video_wait_for_blit_monitor(monitor_index_global)
|
||||
#define video_wait_for_buffer() video_wait_for_buffer_monitor(monitor_index_global)
|
||||
#define cgapal_rebuild() cgapal_rebuild_monitor(monitor_index_global)
|
||||
#define video_force_resize_get() video_force_resize_get_monitor(monitor_index_global)
|
||||
#define video_force_resize_set(val) video_force_resize_set_monitor(val, monitor_index_global)
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef EMU_DEVICE_H
|
||||
/* IBM XGA */
|
||||
extern void xga_device_add(void);
|
||||
@@ -298,9 +289,9 @@ extern const device_t mach64gx_pci_device;
|
||||
extern const device_t mach64vt2_device;
|
||||
|
||||
/* ATi 18800 */
|
||||
#if defined(DEV_BRANCH) && defined(USE_VGAWONDER)
|
||||
# if defined(DEV_BRANCH) && defined(USE_VGAWONDER)
|
||||
extern const device_t ati18800_wonder_device;
|
||||
#endif
|
||||
# endif
|
||||
extern const device_t ati18800_vga88_device;
|
||||
extern const device_t ati18800_device;
|
||||
|
||||
@@ -310,9 +301,9 @@ extern const device_t ati28800k_device;
|
||||
extern const device_t ati28800k_spc4620p_device;
|
||||
extern const device_t ati28800k_spc6033p_device;
|
||||
extern const device_t compaq_ati28800_device;
|
||||
#if defined(DEV_BRANCH) && defined(USE_XL24)
|
||||
# if defined(DEV_BRANCH) && defined(USE_XL24)
|
||||
extern const device_t ati28800_wonderxl24_device;
|
||||
#endif
|
||||
# endif
|
||||
|
||||
/* Cirrus Logic GD54xx */
|
||||
extern const device_t gd5401_isa_device;
|
||||
@@ -408,12 +399,12 @@ extern const device_t ht216_32_standalone_device;
|
||||
extern const device_t im1024_device;
|
||||
extern const device_t pgc_device;
|
||||
|
||||
#if defined(DEV_BRANCH) && defined(USE_MGA)
|
||||
# if defined(DEV_BRANCH) && defined(USE_MGA)
|
||||
/* Matrox MGA */
|
||||
extern const device_t millennium_device;
|
||||
extern const device_t mystique_device;
|
||||
extern const device_t mystique_220_device;
|
||||
#endif
|
||||
# endif
|
||||
|
||||
/* Oak OTI-0x7 */
|
||||
extern const device_t oti037c_device;
|
||||
@@ -541,4 +532,4 @@ extern const device_t wy700_device;
|
||||
extern const device_t agpgart_device;
|
||||
#endif
|
||||
|
||||
#endif /*EMU_VIDEO_H*/
|
||||
#endif /*EMU_VIDEO_H*/
|
||||
|
||||
@@ -21,53 +21,53 @@
|
||||
*/
|
||||
|
||||
#ifndef PLAT_WIN_H
|
||||
# define PLAT_WIN_H
|
||||
#define PLAT_WIN_H
|
||||
|
||||
# define UNICODE
|
||||
# define BITMAP WINDOWS_BITMAP
|
||||
# if 0
|
||||
# ifdef _WIN32_WINNT
|
||||
# undef _WIN32_WINNT
|
||||
# define _WIN32_WINNT 0x0501
|
||||
# endif
|
||||
# endif
|
||||
# include <windows.h>
|
||||
# include "resource.h"
|
||||
# undef BITMAP
|
||||
#define UNICODE
|
||||
#define BITMAP WINDOWS_BITMAP
|
||||
#if 0
|
||||
# ifdef _WIN32_WINNT
|
||||
# undef _WIN32_WINNT
|
||||
# define _WIN32_WINNT 0x0501
|
||||
# endif
|
||||
#endif
|
||||
#include "resource.h"
|
||||
#include <windows.h>
|
||||
#undef BITMAP
|
||||
|
||||
/* DPI Awareness Context, copied from MinGW-w64 windef.h */
|
||||
#ifndef _DPI_AWARENESS_CONTEXTS_
|
||||
DECLARE_HANDLE(DPI_AWARENESS_CONTEXT);
|
||||
#define DPI_AWARENESS_CONTEXT_UNAWARE ((DPI_AWARENESS_CONTEXT)-1)
|
||||
#define DPI_AWARENESS_CONTEXT_SYSTEM_AWARE ((DPI_AWARENESS_CONTEXT)-2)
|
||||
#define DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE ((DPI_AWARENESS_CONTEXT)-3)
|
||||
#define DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 ((DPI_AWARENESS_CONTEXT)-4)
|
||||
#define DPI_AWARENESS_CONTEXT_UNAWARE_GDISCALED ((DPI_AWARENESS_CONTEXT)-5)
|
||||
# define DPI_AWARENESS_CONTEXT_UNAWARE ((DPI_AWARENESS_CONTEXT) -1)
|
||||
# define DPI_AWARENESS_CONTEXT_SYSTEM_AWARE ((DPI_AWARENESS_CONTEXT) -2)
|
||||
# define DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE ((DPI_AWARENESS_CONTEXT) -3)
|
||||
# define DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 ((DPI_AWARENESS_CONTEXT) -4)
|
||||
# define DPI_AWARENESS_CONTEXT_UNAWARE_GDISCALED ((DPI_AWARENESS_CONTEXT) -5)
|
||||
#endif
|
||||
|
||||
#ifndef WM_DPICHANGED_AFTERPARENT
|
||||
#define WM_DPICHANGED_AFTERPARENT 0x02E3
|
||||
# define WM_DPICHANGED_AFTERPARENT 0x02E3
|
||||
#endif
|
||||
|
||||
/* Class names and such. */
|
||||
#define CLASS_NAME L"86BoxMainWnd"
|
||||
#define MENU_NAME L"MainMenu"
|
||||
#define ACCEL_NAME L"MainAccel"
|
||||
#define SUB_CLASS_NAME L"86BoxSubWnd"
|
||||
#define SB_CLASS_NAME L"86BoxStatusBar"
|
||||
#define SB_MENU_NAME L"StatusBarMenu"
|
||||
#define FS_CLASS_NAME L"86BoxFullScreen"
|
||||
#define SDL_CLASS_NAME L"86BoxSDLWnd"
|
||||
#define SDL_SUB_CLASS_NAME L"86BoxSDLSubWnd"
|
||||
#define CLASS_NAME L"86BoxMainWnd"
|
||||
#define MENU_NAME L"MainMenu"
|
||||
#define ACCEL_NAME L"MainAccel"
|
||||
#define SUB_CLASS_NAME L"86BoxSubWnd"
|
||||
#define SB_CLASS_NAME L"86BoxStatusBar"
|
||||
#define SB_MENU_NAME L"StatusBarMenu"
|
||||
#define FS_CLASS_NAME L"86BoxFullScreen"
|
||||
#define SDL_CLASS_NAME L"86BoxSDLWnd"
|
||||
#define SDL_SUB_CLASS_NAME L"86BoxSDLSubWnd"
|
||||
|
||||
#define CASSETTE_SUBMENU_NAME L"CassetteSubmenu"
|
||||
#define CARTRIDGE_SUBMENU_NAME L"CartridgeSubmenu"
|
||||
#define FLOPPY_SUBMENU_NAME L"FloppySubmenu"
|
||||
#define CDROM_SUBMENU_NAME L"CdromSubmenu"
|
||||
#define ZIP_SUBMENU_NAME L"ZIPSubmenu"
|
||||
#define MO_SUBMENU_NAME L"MOSubmenu"
|
||||
#define CASSETTE_SUBMENU_NAME L"CassetteSubmenu"
|
||||
#define CARTRIDGE_SUBMENU_NAME L"CartridgeSubmenu"
|
||||
#define FLOPPY_SUBMENU_NAME L"FloppySubmenu"
|
||||
#define CDROM_SUBMENU_NAME L"CdromSubmenu"
|
||||
#define ZIP_SUBMENU_NAME L"ZIPSubmenu"
|
||||
#define MO_SUBMENU_NAME L"MOSubmenu"
|
||||
|
||||
#define VID_GL_SUBMENU L"VidGLSubMenu"
|
||||
#define VID_GL_SUBMENU L"VidGLSubMenu"
|
||||
|
||||
/* Application-specific window messages.
|
||||
|
||||
@@ -75,185 +75,173 @@ DECLARE_HANDLE(DPI_AWARENESS_CONTEXT);
|
||||
and 0x8895 with WPARAM = <previous pause status> followed by 0x8896 with WPARAM = 0.
|
||||
|
||||
All shutdowns will send an 0x8897. */
|
||||
#define WM_LEAVEFULLSCREEN WM_USER
|
||||
#define WM_SAVESETTINGS 0x8888
|
||||
#define WM_SHOWSETTINGS 0x8889
|
||||
#define WM_PAUSE 0x8890
|
||||
#define WM_SENDHWND 0x8891
|
||||
#define WM_HARDRESET 0x8892
|
||||
#define WM_SHUTDOWN 0x8893
|
||||
#define WM_CTRLALTDEL 0x8894
|
||||
#define WM_LEAVEFULLSCREEN WM_USER
|
||||
#define WM_SAVESETTINGS 0x8888
|
||||
#define WM_SHOWSETTINGS 0x8889
|
||||
#define WM_PAUSE 0x8890
|
||||
#define WM_SENDHWND 0x8891
|
||||
#define WM_HARDRESET 0x8892
|
||||
#define WM_SHUTDOWN 0x8893
|
||||
#define WM_CTRLALTDEL 0x8894
|
||||
/* Pause/resume status: WPARAM = 1 for paused, 0 for resumed. */
|
||||
#define WM_SENDSTATUS 0x8895
|
||||
#define WM_SENDSTATUS 0x8895
|
||||
/* Dialog (Settings or message box) status: WPARAM = 1 for open, 0 for closed. */
|
||||
#define WM_SENDDLGSTATUS 0x8896
|
||||
#define WM_SENDDLGSTATUS 0x8896
|
||||
/* The emulator has shut down. */
|
||||
#define WM_HAS_SHUTDOWN 0x8897
|
||||
#define WM_HAS_SHUTDOWN 0x8897
|
||||
|
||||
#ifdef USE_VNC
|
||||
#define RENDERERS_NUM 5
|
||||
# define RENDERERS_NUM 5
|
||||
#else
|
||||
#define RENDERERS_NUM 4
|
||||
# define RENDERERS_NUM 4
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
extern HINSTANCE hinstance;
|
||||
extern HWND hwndMain,
|
||||
hwndRender;
|
||||
extern HANDLE ghMutex;
|
||||
extern HICON hIcon[256];
|
||||
extern int dpi;
|
||||
extern RECT oldclip;
|
||||
extern int sbar_height, tbar_height, user_resize;
|
||||
extern int acp_utf8;
|
||||
extern HINSTANCE hinstance;
|
||||
extern HWND hwndMain,
|
||||
hwndRender;
|
||||
extern HANDLE ghMutex;
|
||||
extern HICON hIcon[256];
|
||||
extern int dpi;
|
||||
extern RECT oldclip;
|
||||
extern int sbar_height, tbar_height, user_resize;
|
||||
extern int acp_utf8;
|
||||
|
||||
// extern int status_is_open;
|
||||
|
||||
extern char openfilestring[512];
|
||||
extern WCHAR wopenfilestring[512];
|
||||
extern char openfilestring[512];
|
||||
extern WCHAR wopenfilestring[512];
|
||||
|
||||
extern uint8_t filterindex;
|
||||
extern uint8_t filterindex;
|
||||
|
||||
|
||||
extern void ResizeWindowByClientArea(HWND hwnd, int width, int height);
|
||||
extern void ResizeWindowByClientArea(HWND hwnd, int width, int height);
|
||||
|
||||
/* Emulator start/stop support functions. */
|
||||
extern void do_start(void);
|
||||
extern void do_stop(void);
|
||||
extern void do_start(void);
|
||||
extern void do_stop(void);
|
||||
|
||||
/* Internal platform support functions. */
|
||||
extern int has_language_changed(uint32_t id);
|
||||
extern void set_language(uint32_t id);
|
||||
extern int get_vidpause(void);
|
||||
extern void show_cursor(int);
|
||||
extern int has_language_changed(uint32_t id);
|
||||
extern void set_language(uint32_t id);
|
||||
extern int get_vidpause(void);
|
||||
extern void show_cursor(int);
|
||||
|
||||
extern void keyboard_getkeymap(void);
|
||||
extern void keyboard_handle(PRAWINPUT raw);
|
||||
extern void keyboard_getkeymap(void);
|
||||
extern void keyboard_handle(PRAWINPUT raw);
|
||||
|
||||
extern void win_mouse_init(void);
|
||||
extern void win_mouse_close(void);
|
||||
extern void win_mouse_handle(PRAWINPUT raw);
|
||||
extern void win_mouse_init(void);
|
||||
extern void win_mouse_close(void);
|
||||
extern void win_mouse_handle(PRAWINPUT raw);
|
||||
|
||||
extern void win_joystick_handle(PRAWINPUT raw);
|
||||
extern void win_joystick_handle(PRAWINPUT raw);
|
||||
|
||||
extern void win_notify_dlg_open(void);
|
||||
extern void win_notify_dlg_closed(void);
|
||||
extern int win_get_dpi(HWND hwnd);
|
||||
extern int win_get_system_metrics(int i, int dpi);
|
||||
extern void win_notify_dlg_open(void);
|
||||
extern void win_notify_dlg_closed(void);
|
||||
extern int win_get_dpi(HWND hwnd);
|
||||
extern int win_get_system_metrics(int i, int dpi);
|
||||
|
||||
extern LPARAM win_get_string(int id);
|
||||
extern LPARAM win_get_string(int id);
|
||||
|
||||
extern void win_clear_icon_set();
|
||||
extern void win_system_icon_set();
|
||||
extern void win_load_icon_set();
|
||||
extern void win_get_icons_path(char* path_root);
|
||||
extern void win_clear_icon_set();
|
||||
extern void win_system_icon_set();
|
||||
extern void win_load_icon_set();
|
||||
extern void win_get_icons_path(char *path_root);
|
||||
|
||||
extern intptr_t fdd_type_to_icon(int type);
|
||||
extern intptr_t fdd_type_to_icon(int type);
|
||||
|
||||
#ifdef EMU_DEVICE_H
|
||||
extern uint8_t deviceconfig_open(HWND hwnd, const device_t *device);
|
||||
extern uint8_t deviceconfig_inst_open(HWND hwnd, const device_t *device, int inst);
|
||||
extern uint8_t deviceconfig_open(HWND hwnd, const device_t *device);
|
||||
extern uint8_t deviceconfig_inst_open(HWND hwnd, const device_t *device, int inst);
|
||||
#endif
|
||||
extern uint8_t joystickconfig_open(HWND hwnd, int joy_nr, int type);
|
||||
extern uint8_t joystickconfig_open(HWND hwnd, int joy_nr, int type);
|
||||
|
||||
extern int getfile(HWND hwnd, char *f, char *fn);
|
||||
extern int getsfile(HWND hwnd, char *f, char *fn);
|
||||
|
||||
extern void hard_disk_add_open(HWND hwnd, int is_existing);
|
||||
extern int hard_disk_was_added(void);
|
||||
extern int getfile(HWND hwnd, char *f, char *fn);
|
||||
extern int getsfile(HWND hwnd, char *f, char *fn);
|
||||
|
||||
extern void hard_disk_add_open(HWND hwnd, int is_existing);
|
||||
extern int hard_disk_was_added(void);
|
||||
|
||||
/* Platform UI support functions. */
|
||||
extern int ui_init(int nCmdShow);
|
||||
|
||||
extern int ui_init(int nCmdShow);
|
||||
|
||||
/* Functions in win_about.c: */
|
||||
extern void AboutDialogCreate(HWND hwnd);
|
||||
|
||||
extern void AboutDialogCreate(HWND hwnd);
|
||||
|
||||
/* Functions in win_snd_gain.c: */
|
||||
extern void SoundGainDialogCreate(HWND hwnd);
|
||||
|
||||
extern void SoundGainDialogCreate(HWND hwnd);
|
||||
|
||||
/* Functions in win_new_floppy.c: */
|
||||
extern void NewFloppyDialogCreate(HWND hwnd, int id, int part);
|
||||
|
||||
extern void NewFloppyDialogCreate(HWND hwnd, int id, int part);
|
||||
|
||||
/* Functions in win_specify_dim.c: */
|
||||
extern void SpecifyDimensionsDialogCreate(HWND hwnd);
|
||||
extern void SpecifyDimensionsDialogCreate(HWND hwnd);
|
||||
|
||||
/* Functions in win_preferences.c: */
|
||||
extern void PreferencesDlgCreate(HWND hwnd);
|
||||
|
||||
extern void PreferencesDlgCreate(HWND hwnd);
|
||||
|
||||
/* Functions in win_settings.c: */
|
||||
#define SETTINGS_PAGE_MACHINE 0
|
||||
#define SETTINGS_PAGE_VIDEO 1
|
||||
#define SETTINGS_PAGE_INPUT 2
|
||||
#define SETTINGS_PAGE_SOUND 3
|
||||
#define SETTINGS_PAGE_NETWORK 4
|
||||
#define SETTINGS_PAGE_PORTS 5
|
||||
#define SETTINGS_PAGE_STORAGE 6
|
||||
#define SETTINGS_PAGE_HARD_DISKS 7
|
||||
#define SETTINGS_PAGE_FLOPPY_AND_CDROM_DRIVES 8
|
||||
#define SETTINGS_PAGE_OTHER_REMOVABLE_DEVICES 9
|
||||
#define SETTINGS_PAGE_PERIPHERALS 10
|
||||
|
||||
extern void win_settings_open(HWND hwnd);
|
||||
extern void win_settings_open_ex(HWND hwnd, int category);
|
||||
#define SETTINGS_PAGE_MACHINE 0
|
||||
#define SETTINGS_PAGE_VIDEO 1
|
||||
#define SETTINGS_PAGE_INPUT 2
|
||||
#define SETTINGS_PAGE_SOUND 3
|
||||
#define SETTINGS_PAGE_NETWORK 4
|
||||
#define SETTINGS_PAGE_PORTS 5
|
||||
#define SETTINGS_PAGE_STORAGE 6
|
||||
#define SETTINGS_PAGE_HARD_DISKS 7
|
||||
#define SETTINGS_PAGE_FLOPPY_AND_CDROM_DRIVES 8
|
||||
#define SETTINGS_PAGE_OTHER_REMOVABLE_DEVICES 9
|
||||
#define SETTINGS_PAGE_PERIPHERALS 10
|
||||
|
||||
extern void win_settings_open(HWND hwnd);
|
||||
extern void win_settings_open_ex(HWND hwnd, int category);
|
||||
|
||||
/* Functions in win_stbar.c: */
|
||||
extern HWND hwndSBAR;
|
||||
extern void StatusBarCreate(HWND hwndParent, uintptr_t idStatus, HINSTANCE hInst);
|
||||
extern int MediaMenuHandler(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
|
||||
|
||||
extern HWND hwndSBAR;
|
||||
extern void StatusBarCreate(HWND hwndParent, uintptr_t idStatus, HINSTANCE hInst);
|
||||
extern int MediaMenuHandler(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
|
||||
|
||||
/* Functions in win_toolbar.c */
|
||||
extern HWND hwndRebar;
|
||||
extern void ToolBarCreate(HWND hwndParent, HINSTANCE hInst);
|
||||
extern void ToolBarLoadIcons();
|
||||
extern void ToolBarUpdatePause(int paused);
|
||||
|
||||
extern HWND hwndRebar;
|
||||
extern void ToolBarCreate(HWND hwndParent, HINSTANCE hInst);
|
||||
extern void ToolBarLoadIcons();
|
||||
extern void ToolBarUpdatePause(int paused);
|
||||
|
||||
/* Functions in win_dialog.c: */
|
||||
/* Pass NULL in the title param to use the default title. */
|
||||
extern int file_dlg_w(HWND hwnd, WCHAR *f, WCHAR *fn, WCHAR *title, int save);
|
||||
extern int file_dlg(HWND hwnd, WCHAR *f, char *fn, char *title, int save);
|
||||
extern int file_dlg_mb(HWND hwnd, char *f, char *fn, char *title, int save);
|
||||
extern int file_dlg_w_st(HWND hwnd, int i, WCHAR *fn, char *title, int save);
|
||||
extern int file_dlg_st(HWND hwnd, int i, char *fn, char *title, int save);
|
||||
|
||||
extern wchar_t *BrowseFolder(wchar_t *saved_path, wchar_t *title);
|
||||
extern int file_dlg_w(HWND hwnd, WCHAR *f, WCHAR *fn, WCHAR *title, int save);
|
||||
extern int file_dlg(HWND hwnd, WCHAR *f, char *fn, char *title, int save);
|
||||
extern int file_dlg_mb(HWND hwnd, char *f, char *fn, char *title, int save);
|
||||
extern int file_dlg_w_st(HWND hwnd, int i, WCHAR *fn, char *title, int save);
|
||||
extern int file_dlg_st(HWND hwnd, int i, char *fn, char *title, int save);
|
||||
|
||||
extern wchar_t *BrowseFolder(wchar_t *saved_path, wchar_t *title);
|
||||
|
||||
/* Functions in win_media_menu.c */
|
||||
extern void media_menu_init();
|
||||
extern void media_menu_reset();
|
||||
extern int media_menu_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
|
||||
extern HMENU media_menu_get_cassette(void);
|
||||
extern HMENU media_menu_get_cartridge(int id);
|
||||
extern HMENU media_menu_get_floppy(int id);
|
||||
extern HMENU media_menu_get_cdrom(int id);
|
||||
extern HMENU media_menu_get_zip(int id);
|
||||
extern HMENU media_menu_get_mo(int id);
|
||||
extern void media_menu_update_cassette(void);
|
||||
extern void media_menu_update_cartridge(int id);
|
||||
extern void media_menu_update_floppy(int id);
|
||||
extern void media_menu_update_cdrom(int id);
|
||||
extern void media_menu_update_zip(int id);
|
||||
extern void media_menu_update_mo(int id);
|
||||
extern void media_menu_init();
|
||||
extern void media_menu_reset();
|
||||
extern int media_menu_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
|
||||
extern HMENU media_menu_get_cassette(void);
|
||||
extern HMENU media_menu_get_cartridge(int id);
|
||||
extern HMENU media_menu_get_floppy(int id);
|
||||
extern HMENU media_menu_get_cdrom(int id);
|
||||
extern HMENU media_menu_get_zip(int id);
|
||||
extern HMENU media_menu_get_mo(int id);
|
||||
extern void media_menu_update_cassette(void);
|
||||
extern void media_menu_update_cartridge(int id);
|
||||
extern void media_menu_update_floppy(int id);
|
||||
extern void media_menu_update_cdrom(int id);
|
||||
extern void media_menu_update_zip(int id);
|
||||
extern void media_menu_update_mo(int id);
|
||||
|
||||
/* Functions in win_ui.c */
|
||||
extern HMENU menuMain;
|
||||
extern void ResetAllMenus();
|
||||
extern HMENU menuMain;
|
||||
extern void ResetAllMenus();
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /*PLAT_WIN_H*/
|
||||
#endif /*PLAT_WIN_H*/
|
||||
|
||||
@@ -19,8 +19,8 @@
|
||||
#define UNICODE
|
||||
#include <Windows.h>
|
||||
|
||||
extern int opengl_init(HWND hwnd);
|
||||
extern int opengl_pause(void);
|
||||
extern int opengl_init(HWND hwnd);
|
||||
extern int opengl_pause(void);
|
||||
extern void opengl_close(void);
|
||||
extern void opengl_set_fs(int fs);
|
||||
extern void opengl_resize(int w, int h);
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
|
||||
#include <glad/glad.h>
|
||||
|
||||
GLuint load_custom_shaders(const char* path);
|
||||
GLuint load_custom_shaders(const char *path);
|
||||
GLuint load_default_shaders();
|
||||
|
||||
#endif /*!WIN_OPENGL_GLSLP_H*/
|
||||
|
||||
@@ -48,17 +48,16 @@
|
||||
*/
|
||||
|
||||
#ifndef WIN_SDL_H
|
||||
# define WIN_SDL_H
|
||||
#define WIN_SDL_H
|
||||
|
||||
extern void sdl_close(void);
|
||||
extern int sdl_inits(HWND h);
|
||||
extern int sdl_inith(HWND h);
|
||||
extern int sdl_initho(HWND h);
|
||||
extern int sdl_pause(void);
|
||||
extern void sdl_resize(int x, int y);
|
||||
extern void sdl_enable(int enable);
|
||||
extern void sdl_set_fs(int fs);
|
||||
extern void sdl_reload(void);
|
||||
|
||||
extern void sdl_close(void);
|
||||
extern int sdl_inits(HWND h);
|
||||
extern int sdl_inith(HWND h);
|
||||
extern int sdl_initho(HWND h);
|
||||
extern int sdl_pause(void);
|
||||
extern void sdl_resize(int x, int y);
|
||||
extern void sdl_enable(int enable);
|
||||
extern void sdl_set_fs(int fs);
|
||||
extern void sdl_reload(void);
|
||||
|
||||
#endif /*WIN_SDL_H*/
|
||||
#endif /*WIN_SDL_H*/
|
||||
|
||||
159
src/lpt.c
159
src/lpt.c
@@ -13,26 +13,25 @@
|
||||
#include <86box/prt_devs.h>
|
||||
#include <86box/net_plip.h>
|
||||
|
||||
|
||||
lpt_port_t lpt_ports[PARALLEL_MAX];
|
||||
lpt_port_t lpt_ports[PARALLEL_MAX];
|
||||
|
||||
const lpt_device_t lpt_none_device = {
|
||||
.name = "None",
|
||||
.name = "None",
|
||||
.internal_name = "none",
|
||||
.init = NULL,
|
||||
.close = NULL,
|
||||
.write_data = NULL,
|
||||
.write_ctrl = NULL,
|
||||
.read_data = NULL,
|
||||
.read_status = NULL,
|
||||
.read_ctrl = NULL
|
||||
.init = NULL,
|
||||
.close = NULL,
|
||||
.write_data = NULL,
|
||||
.write_ctrl = NULL,
|
||||
.read_data = NULL,
|
||||
.read_status = NULL,
|
||||
.read_ctrl = NULL
|
||||
};
|
||||
|
||||
static const struct {
|
||||
const char *internal_name;
|
||||
const char *internal_name;
|
||||
const lpt_device_t *device;
|
||||
} lpt_devices[] = {
|
||||
// clang-format off
|
||||
// clang-format off
|
||||
{"none", &lpt_none_device },
|
||||
{"dss", &dss_device },
|
||||
{"lpt_dac", &lpt_dac_device },
|
||||
@@ -78,167 +77,157 @@ lpt_device_get_from_internal_name(char *s)
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
lpt_devices_init(void)
|
||||
{
|
||||
int i = 0;
|
||||
|
||||
for (i = 0; i < PARALLEL_MAX; i++) {
|
||||
lpt_ports[i].dt = (lpt_device_t *) lpt_devices[lpt_ports[i].device].device;
|
||||
lpt_ports[i].dt = (lpt_device_t *) lpt_devices[lpt_ports[i].device].device;
|
||||
|
||||
if (lpt_ports[i].dt && lpt_ports[i].dt->init)
|
||||
lpt_ports[i].priv = lpt_ports[i].dt->init(&lpt_ports[i]);
|
||||
if (lpt_ports[i].dt && lpt_ports[i].dt->init)
|
||||
lpt_ports[i].priv = lpt_ports[i].dt->init(&lpt_ports[i]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
lpt_devices_close(void)
|
||||
{
|
||||
int i = 0;
|
||||
int i = 0;
|
||||
lpt_port_t *dev;
|
||||
|
||||
for (i = 0; i < PARALLEL_MAX; i++) {
|
||||
dev = &lpt_ports[i];
|
||||
dev = &lpt_ports[i];
|
||||
|
||||
if (lpt_ports[i].dt && lpt_ports[i].dt->close)
|
||||
dev->dt->close(dev->priv);
|
||||
if (lpt_ports[i].dt && lpt_ports[i].dt->close)
|
||||
dev->dt->close(dev->priv);
|
||||
|
||||
dev->dt = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
lpt_write(uint16_t port, uint8_t val, void *priv)
|
||||
{
|
||||
lpt_port_t *dev = (lpt_port_t *) priv;
|
||||
|
||||
switch (port & 3) {
|
||||
case 0:
|
||||
if (dev->dt && dev->dt->write_data && dev->priv)
|
||||
dev->dt->write_data(val, dev->priv);
|
||||
dev->dat = val;
|
||||
break;
|
||||
case 0:
|
||||
if (dev->dt && dev->dt->write_data && dev->priv)
|
||||
dev->dt->write_data(val, dev->priv);
|
||||
dev->dat = val;
|
||||
break;
|
||||
|
||||
case 1:
|
||||
break;
|
||||
case 1:
|
||||
break;
|
||||
|
||||
case 2:
|
||||
if (dev->dt && dev->dt->write_ctrl && dev->priv)
|
||||
dev->dt->write_ctrl(val, dev->priv);
|
||||
dev->ctrl = val;
|
||||
dev->enable_irq = val & 0x10;
|
||||
break;
|
||||
case 2:
|
||||
if (dev->dt && dev->dt->write_ctrl && dev->priv)
|
||||
dev->dt->write_ctrl(val, dev->priv);
|
||||
dev->ctrl = val;
|
||||
dev->enable_irq = val & 0x10;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
uint8_t
|
||||
lpt_read(uint16_t port, void *priv)
|
||||
{
|
||||
uint8_t ret = 0xff;
|
||||
uint8_t ret = 0xff;
|
||||
lpt_port_t *dev = (lpt_port_t *) priv;
|
||||
|
||||
switch (port & 3) {
|
||||
case 0:
|
||||
if (dev->dt && dev->dt->read_data && dev->priv)
|
||||
ret = dev->dt->read_data(dev->priv);
|
||||
else
|
||||
ret = dev->dat;
|
||||
break;
|
||||
case 0:
|
||||
if (dev->dt && dev->dt->read_data && dev->priv)
|
||||
ret = dev->dt->read_data(dev->priv);
|
||||
else
|
||||
ret = dev->dat;
|
||||
break;
|
||||
|
||||
case 1:
|
||||
if (dev->dt && dev->dt->read_status && dev->priv)
|
||||
ret = dev->dt->read_status(dev->priv) | 0x07;
|
||||
else
|
||||
ret = 0xdf;
|
||||
break;
|
||||
case 1:
|
||||
if (dev->dt && dev->dt->read_status && dev->priv)
|
||||
ret = dev->dt->read_status(dev->priv) | 0x07;
|
||||
else
|
||||
ret = 0xdf;
|
||||
break;
|
||||
|
||||
case 2:
|
||||
if (dev->dt && dev->dt->read_ctrl && dev->priv)
|
||||
ret = (dev->dt->read_ctrl(dev->priv) & 0xef) | dev->enable_irq;
|
||||
else
|
||||
ret = 0xe0 | dev->ctrl | dev->enable_irq;
|
||||
break;
|
||||
case 2:
|
||||
if (dev->dt && dev->dt->read_ctrl && dev->priv)
|
||||
ret = (dev->dt->read_ctrl(dev->priv) & 0xef) | dev->enable_irq;
|
||||
else
|
||||
ret = 0xe0 | dev->ctrl | dev->enable_irq;
|
||||
break;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
lpt_irq(void *priv, int raise)
|
||||
{
|
||||
lpt_port_t *dev = (lpt_port_t *) priv;
|
||||
|
||||
if (dev->enable_irq && (dev->irq != 0xff)) {
|
||||
if (raise)
|
||||
picint(1 << dev->irq);
|
||||
else
|
||||
picintc(1 << dev->irq);
|
||||
if (raise)
|
||||
picint(1 << dev->irq);
|
||||
else
|
||||
picintc(1 << dev->irq);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
lpt_init(void)
|
||||
{
|
||||
int i;
|
||||
int i;
|
||||
uint16_t default_ports[PARALLEL_MAX] = { LPT1_ADDR, LPT2_ADDR, LPT_MDA_ADDR, LPT4_ADDR };
|
||||
uint8_t default_irqs[PARALLEL_MAX] = { LPT1_IRQ, LPT2_IRQ, LPT_MDA_IRQ, LPT4_IRQ };
|
||||
uint8_t default_irqs[PARALLEL_MAX] = { LPT1_IRQ, LPT2_IRQ, LPT_MDA_IRQ, LPT4_IRQ };
|
||||
|
||||
for (i = 0; i < PARALLEL_MAX; i++) {
|
||||
lpt_ports[i].addr = 0xffff;
|
||||
lpt_ports[i].irq = 0xff;
|
||||
lpt_ports[i].enable_irq = 0x10;
|
||||
lpt_ports[i].addr = 0xffff;
|
||||
lpt_ports[i].irq = 0xff;
|
||||
lpt_ports[i].enable_irq = 0x10;
|
||||
|
||||
if (lpt_ports[i].enabled) {
|
||||
lpt_port_init(i, default_ports[i]);
|
||||
lpt_port_irq(i, default_irqs[i]);
|
||||
}
|
||||
if (lpt_ports[i].enabled) {
|
||||
lpt_port_init(i, default_ports[i]);
|
||||
lpt_port_irq(i, default_irqs[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
lpt_port_init(int i, uint16_t port)
|
||||
{
|
||||
if (lpt_ports[i].enabled) {
|
||||
if (lpt_ports[i].addr != 0xffff)
|
||||
io_removehandler(lpt_ports[i].addr, 0x0003, lpt_read, NULL, NULL, lpt_write, NULL, NULL, &lpt_ports[i]);
|
||||
if (port != 0xffff)
|
||||
io_sethandler(port, 0x0003, lpt_read, NULL, NULL, lpt_write, NULL, NULL, &lpt_ports[i]);
|
||||
lpt_ports[i].addr = port;
|
||||
if (lpt_ports[i].addr != 0xffff)
|
||||
io_removehandler(lpt_ports[i].addr, 0x0003, lpt_read, NULL, NULL, lpt_write, NULL, NULL, &lpt_ports[i]);
|
||||
if (port != 0xffff)
|
||||
io_sethandler(port, 0x0003, lpt_read, NULL, NULL, lpt_write, NULL, NULL, &lpt_ports[i]);
|
||||
lpt_ports[i].addr = port;
|
||||
} else
|
||||
lpt_ports[i].addr = 0xffff;
|
||||
lpt_ports[i].addr = 0xffff;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
lpt_port_irq(int i, uint8_t irq)
|
||||
{
|
||||
if (lpt_ports[i].enabled)
|
||||
lpt_ports[i].irq = irq;
|
||||
lpt_ports[i].irq = irq;
|
||||
else
|
||||
lpt_ports[i].irq = 0xff;
|
||||
lpt_ports[i].irq = 0xff;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
lpt_port_remove(int i)
|
||||
{
|
||||
if (lpt_ports[i].enabled && (lpt_ports[i].addr != 0xffff)) {
|
||||
io_removehandler(lpt_ports[i].addr, 0x0003, lpt_read, NULL, NULL, lpt_write, NULL, NULL, &lpt_ports[i]);
|
||||
lpt_ports[i].addr = 0xffff;
|
||||
io_removehandler(lpt_ports[i].addr, 0x0003, lpt_read, NULL, NULL, lpt_write, NULL, NULL, &lpt_ports[i]);
|
||||
lpt_ports[i].addr = 0xffff;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
lpt1_remove_ams(void)
|
||||
{
|
||||
if (lpt_ports[0].enabled)
|
||||
io_removehandler(lpt_ports[0].addr + 1, 0x0002, lpt_read, NULL, NULL, lpt_write, NULL, NULL, &lpt_ports[0]);
|
||||
io_removehandler(lpt_ports[0].addr + 1, 0x0002, lpt_read, NULL, NULL, lpt_write, NULL, NULL, &lpt_ports[0]);
|
||||
}
|
||||
|
||||
1598
src/win/glad.c
1598
src/win/glad.c
File diff suppressed because it is too large
Load Diff
907
src/win/win.c
907
src/win/win.c
File diff suppressed because it is too large
Load Diff
@@ -32,15 +32,14 @@
|
||||
#include <86box/win.h>
|
||||
#include <86box/version.h>
|
||||
|
||||
|
||||
void
|
||||
AboutDialogCreate(HWND hwnd)
|
||||
{
|
||||
int i;
|
||||
TASKDIALOGCONFIG tdconfig = {0};
|
||||
int i;
|
||||
TASKDIALOGCONFIG tdconfig = { 0 };
|
||||
TASKDIALOG_BUTTON tdbuttons[] = {
|
||||
{IDOK, EMU_SITE_W},
|
||||
{IDCANCEL, MAKEINTRESOURCE(IDS_2127)}
|
||||
{IDOK, EMU_SITE_W },
|
||||
{ IDCANCEL, MAKEINTRESOURCE(IDS_2127)}
|
||||
};
|
||||
|
||||
wchar_t emu_version[256];
|
||||
@@ -49,19 +48,19 @@ AboutDialogCreate(HWND hwnd)
|
||||
swprintf(&emu_version[i], sizeof(emu_version) - i, L" [%ls]", EMU_GIT_HASH_W);
|
||||
#endif
|
||||
|
||||
tdconfig.cbSize = sizeof(tdconfig);
|
||||
tdconfig.hwndParent = hwnd;
|
||||
tdconfig.hInstance = hinstance;
|
||||
tdconfig.dwCommonButtons = 0;
|
||||
tdconfig.pszWindowTitle = MAKEINTRESOURCE(IDS_2124);
|
||||
tdconfig.pszMainIcon = (PCWSTR) 10;
|
||||
tdconfig.cbSize = sizeof(tdconfig);
|
||||
tdconfig.hwndParent = hwnd;
|
||||
tdconfig.hInstance = hinstance;
|
||||
tdconfig.dwCommonButtons = 0;
|
||||
tdconfig.pszWindowTitle = MAKEINTRESOURCE(IDS_2124);
|
||||
tdconfig.pszMainIcon = (PCWSTR) 10;
|
||||
tdconfig.pszMainInstruction = emu_version;
|
||||
tdconfig.pszContent = MAKEINTRESOURCE(IDS_2126);
|
||||
tdconfig.cButtons = ARRAYSIZE(tdbuttons);
|
||||
tdconfig.pButtons = tdbuttons;
|
||||
tdconfig.nDefaultButton = IDCANCEL;
|
||||
tdconfig.pszContent = MAKEINTRESOURCE(IDS_2126);
|
||||
tdconfig.cButtons = ARRAYSIZE(tdbuttons);
|
||||
tdconfig.pButtons = tdbuttons;
|
||||
tdconfig.nDefaultButton = IDCANCEL;
|
||||
TaskDialogIndirect(&tdconfig, &i, NULL, NULL);
|
||||
|
||||
if (i == IDOK)
|
||||
ShellExecute(hwnd, L"open", L"https://" EMU_SITE_W, NULL, NULL, SW_SHOW);
|
||||
ShellExecute(hwnd, L"open", L"https://" EMU_SITE_W, NULL, NULL, SW_SHOW);
|
||||
}
|
||||
|
||||
@@ -44,7 +44,6 @@
|
||||
#include <86box/ui.h>
|
||||
#include <86box/win.h>
|
||||
|
||||
|
||||
void
|
||||
cassette_mount(char *fn, uint8_t wp)
|
||||
{
|
||||
@@ -53,14 +52,13 @@ cassette_mount(char *fn, uint8_t wp)
|
||||
cassette_ui_writeprot = wp;
|
||||
pc_cas_set_fname(cassette, fn);
|
||||
if (fn != NULL)
|
||||
memcpy(cassette_fname, fn, MIN(511, strlen(fn)));
|
||||
memcpy(cassette_fname, fn, MIN(511, strlen(fn)));
|
||||
ui_sb_update_icon_state(SB_CASSETTE, (fn == NULL) ? 1 : 0);
|
||||
media_menu_update_cassette();
|
||||
ui_sb_update_tip(SB_CASSETTE);
|
||||
config_save();
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
cassette_eject(void)
|
||||
{
|
||||
@@ -72,7 +70,6 @@ cassette_eject(void)
|
||||
config_save();
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
cartridge_mount(uint8_t id, char *fn, uint8_t wp)
|
||||
{
|
||||
@@ -84,7 +81,6 @@ cartridge_mount(uint8_t id, char *fn, uint8_t wp)
|
||||
config_save();
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
cartridge_eject(uint8_t id)
|
||||
{
|
||||
@@ -95,7 +91,6 @@ cartridge_eject(uint8_t id)
|
||||
config_save();
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
floppy_mount(uint8_t id, char *fn, uint8_t wp)
|
||||
{
|
||||
@@ -108,7 +103,6 @@ floppy_mount(uint8_t id, char *fn, uint8_t wp)
|
||||
config_save();
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
floppy_eject(uint8_t id)
|
||||
{
|
||||
@@ -119,20 +113,19 @@ floppy_eject(uint8_t id)
|
||||
config_save();
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
plat_cdrom_ui_update(uint8_t id, uint8_t reload)
|
||||
{
|
||||
cdrom_t *drv = &cdrom[id];
|
||||
|
||||
if (drv->host_drive == 0) {
|
||||
ui_sb_update_icon_state(SB_CDROM|id, 1);
|
||||
ui_sb_update_icon_state(SB_CDROM | id, 1);
|
||||
} else {
|
||||
ui_sb_update_icon_state(SB_CDROM|id, 0);
|
||||
ui_sb_update_icon_state(SB_CDROM | id, 0);
|
||||
}
|
||||
|
||||
media_menu_update_cdrom(id);
|
||||
ui_sb_update_tip(SB_CDROM|id);
|
||||
ui_sb_update_tip(SB_CDROM | id);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -141,18 +134,18 @@ cdrom_mount(uint8_t id, char *fn)
|
||||
cdrom[id].prev_host_drive = cdrom[id].host_drive;
|
||||
strcpy(cdrom[id].prev_image_path, cdrom[id].image_path);
|
||||
if (cdrom[id].ops && cdrom[id].ops->exit)
|
||||
cdrom[id].ops->exit(&(cdrom[id]));
|
||||
cdrom[id].ops->exit(&(cdrom[id]));
|
||||
cdrom[id].ops = NULL;
|
||||
memset(cdrom[id].image_path, 0, sizeof(cdrom[id].image_path));
|
||||
cdrom_image_open(&(cdrom[id]), fn);
|
||||
/* Signal media change to the emulated machine. */
|
||||
if (cdrom[id].insert)
|
||||
cdrom[id].insert(cdrom[id].priv);
|
||||
cdrom[id].insert(cdrom[id].priv);
|
||||
cdrom[id].host_drive = (strlen(cdrom[id].image_path) == 0) ? 0 : 200;
|
||||
if (cdrom[id].host_drive == 200) {
|
||||
ui_sb_update_icon_state(SB_CDROM | id, 0);
|
||||
ui_sb_update_icon_state(SB_CDROM | id, 0);
|
||||
} else {
|
||||
ui_sb_update_icon_state(SB_CDROM | id, 1);
|
||||
ui_sb_update_icon_state(SB_CDROM | id, 1);
|
||||
}
|
||||
media_menu_update_cdrom(id);
|
||||
ui_sb_update_tip(SB_CDROM | id);
|
||||
@@ -166,8 +159,8 @@ mo_eject(uint8_t id)
|
||||
|
||||
mo_disk_close(dev);
|
||||
if (mo_drives[id].bus_type) {
|
||||
/* Signal disk change to the emulated machine. */
|
||||
mo_insert(dev);
|
||||
/* Signal disk change to the emulated machine. */
|
||||
mo_insert(dev);
|
||||
}
|
||||
|
||||
ui_sb_update_icon_state(SB_MO | id, 1);
|
||||
@@ -176,7 +169,6 @@ mo_eject(uint8_t id)
|
||||
config_save();
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
mo_mount(uint8_t id, char *fn, uint8_t wp)
|
||||
{
|
||||
@@ -194,7 +186,6 @@ mo_mount(uint8_t id, char *fn, uint8_t wp)
|
||||
config_save();
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
mo_reload(uint8_t id)
|
||||
{
|
||||
@@ -202,13 +193,13 @@ mo_reload(uint8_t id)
|
||||
|
||||
mo_disk_reload(dev);
|
||||
if (strlen(mo_drives[id].image_path) == 0) {
|
||||
ui_sb_update_icon_state(SB_MO|id, 1);
|
||||
ui_sb_update_icon_state(SB_MO | id, 1);
|
||||
} else {
|
||||
ui_sb_update_icon_state(SB_MO|id, 0);
|
||||
ui_sb_update_icon_state(SB_MO | id, 0);
|
||||
}
|
||||
|
||||
media_menu_update_mo(id);
|
||||
ui_sb_update_tip(SB_MO|id);
|
||||
ui_sb_update_tip(SB_MO | id);
|
||||
|
||||
config_save();
|
||||
}
|
||||
@@ -220,8 +211,8 @@ zip_eject(uint8_t id)
|
||||
|
||||
zip_disk_close(dev);
|
||||
if (zip_drives[id].bus_type) {
|
||||
/* Signal disk change to the emulated machine. */
|
||||
zip_insert(dev);
|
||||
/* Signal disk change to the emulated machine. */
|
||||
zip_insert(dev);
|
||||
}
|
||||
|
||||
ui_sb_update_icon_state(SB_ZIP | id, 1);
|
||||
@@ -230,7 +221,6 @@ zip_eject(uint8_t id)
|
||||
config_save();
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
zip_mount(uint8_t id, char *fn, uint8_t wp)
|
||||
{
|
||||
@@ -248,7 +238,6 @@ zip_mount(uint8_t id, char *fn, uint8_t wp)
|
||||
config_save();
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
zip_reload(uint8_t id)
|
||||
{
|
||||
@@ -256,13 +245,13 @@ zip_reload(uint8_t id)
|
||||
|
||||
zip_disk_reload(dev);
|
||||
if (strlen(zip_drives[id].image_path) == 0) {
|
||||
ui_sb_update_icon_state(SB_ZIP|id, 1);
|
||||
ui_sb_update_icon_state(SB_ZIP | id, 1);
|
||||
} else {
|
||||
ui_sb_update_icon_state(SB_ZIP|id, 0);
|
||||
ui_sb_update_icon_state(SB_ZIP | id, 0);
|
||||
}
|
||||
|
||||
media_menu_update_zip(id);
|
||||
ui_sb_update_tip(SB_ZIP|id);
|
||||
ui_sb_update_tip(SB_ZIP | id);
|
||||
|
||||
config_save();
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -33,15 +33,11 @@
|
||||
#include <86box/ui.h>
|
||||
#include <86box/win.h>
|
||||
|
||||
#define STRING_OR_RESOURCE(s) ((!(s)) ? (NULL) : ((((uintptr_t) s) < ((uintptr_t) 65636)) ? (MAKEINTRESOURCE((uintptr_t) s)) : (s)))
|
||||
|
||||
|
||||
#define STRING_OR_RESOURCE(s) ((!(s)) ? (NULL) : ((((uintptr_t)s) < ((uintptr_t)65636)) ? (MAKEINTRESOURCE((uintptr_t)s)) : (s)))
|
||||
|
||||
|
||||
WCHAR wopenfilestring[512];
|
||||
char openfilestring[512];
|
||||
uint8_t filterindex = 0;
|
||||
|
||||
WCHAR wopenfilestring[512];
|
||||
char openfilestring[512];
|
||||
uint8_t filterindex = 0;
|
||||
|
||||
int
|
||||
ui_msgbox(int flags, void *message)
|
||||
@@ -49,125 +45,127 @@ ui_msgbox(int flags, void *message)
|
||||
return ui_msgbox_ex(flags, NULL, message, NULL, NULL, NULL);
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
ui_msgbox_header(int flags, void *header, void *message)
|
||||
{
|
||||
return ui_msgbox_ex(flags, header, message, NULL, NULL, NULL);
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
ui_msgbox_ex(int flags, void *header, void *message, void *btn1, void *btn2, void *btn3) {
|
||||
WCHAR temp[512];
|
||||
TASKDIALOGCONFIG tdconfig = {0};
|
||||
ui_msgbox_ex(int flags, void *header, void *message, void *btn1, void *btn2, void *btn3)
|
||||
{
|
||||
WCHAR temp[512];
|
||||
TASKDIALOGCONFIG tdconfig = { 0 };
|
||||
TASKDIALOG_BUTTON tdbuttons[3],
|
||||
tdb_yes = {IDYES, STRING_OR_RESOURCE(btn1)},
|
||||
tdb_no = {IDNO, STRING_OR_RESOURCE(btn2)},
|
||||
tdb_cancel = {IDCANCEL, STRING_OR_RESOURCE(btn3)},
|
||||
tdb_exit = {IDCLOSE, MAKEINTRESOURCE(IDS_2119)};
|
||||
tdb_yes = { IDYES, STRING_OR_RESOURCE(btn1) },
|
||||
tdb_no = { IDNO, STRING_OR_RESOURCE(btn2) },
|
||||
tdb_cancel = { IDCANCEL, STRING_OR_RESOURCE(btn3) },
|
||||
tdb_exit = { IDCLOSE, MAKEINTRESOURCE(IDS_2119) };
|
||||
int ret = 0, checked = 0;
|
||||
|
||||
/* Configure the default OK button. */
|
||||
tdconfig.cButtons = 0;
|
||||
if (btn1)
|
||||
tdbuttons[tdconfig.cButtons++] = tdb_yes;
|
||||
tdbuttons[tdconfig.cButtons++] = tdb_yes;
|
||||
else
|
||||
tdconfig.dwCommonButtons = TDCBF_OK_BUTTON;
|
||||
tdconfig.dwCommonButtons = TDCBF_OK_BUTTON;
|
||||
|
||||
/* Configure the message type. */
|
||||
switch(flags & 0x1f) {
|
||||
case MBX_INFO: /* just an informational message */
|
||||
tdconfig.pszMainIcon = TD_INFORMATION_ICON;
|
||||
break;
|
||||
switch (flags & 0x1f) {
|
||||
case MBX_INFO: /* just an informational message */
|
||||
tdconfig.pszMainIcon = TD_INFORMATION_ICON;
|
||||
break;
|
||||
|
||||
case MBX_ERROR: /* error message */
|
||||
if (flags & MBX_FATAL) {
|
||||
tdconfig.pszMainIcon = TD_ERROR_ICON;
|
||||
tdconfig.pszMainInstruction = MAKEINTRESOURCE(IDS_2050); /* "Fatal error" */
|
||||
case MBX_ERROR: /* error message */
|
||||
if (flags & MBX_FATAL) {
|
||||
tdconfig.pszMainIcon = TD_ERROR_ICON;
|
||||
tdconfig.pszMainInstruction = MAKEINTRESOURCE(IDS_2050); /* "Fatal error" */
|
||||
|
||||
/* replace default "OK" button with "Exit" button */
|
||||
if (btn1)
|
||||
tdconfig.cButtons = 0;
|
||||
else
|
||||
tdconfig.dwCommonButtons = 0;
|
||||
tdbuttons[tdconfig.cButtons++] = tdb_exit;
|
||||
} else {
|
||||
tdconfig.pszMainIcon = TD_WARNING_ICON;
|
||||
tdconfig.pszMainInstruction = MAKEINTRESOURCE(IDS_2049); /* "Error" */
|
||||
}
|
||||
break;
|
||||
/* replace default "OK" button with "Exit" button */
|
||||
if (btn1)
|
||||
tdconfig.cButtons = 0;
|
||||
else
|
||||
tdconfig.dwCommonButtons = 0;
|
||||
tdbuttons[tdconfig.cButtons++] = tdb_exit;
|
||||
} else {
|
||||
tdconfig.pszMainIcon = TD_WARNING_ICON;
|
||||
tdconfig.pszMainInstruction = MAKEINTRESOURCE(IDS_2049); /* "Error" */
|
||||
}
|
||||
break;
|
||||
|
||||
case MBX_QUESTION: /* question */
|
||||
case MBX_QUESTION_YN:
|
||||
case MBX_QUESTION_OK:
|
||||
if (!btn1) /* replace default "OK" button with "Yes" button */
|
||||
tdconfig.dwCommonButtons = (flags & MBX_QUESTION_OK) ? TDCBF_OK_BUTTON : TDCBF_YES_BUTTON;
|
||||
case MBX_QUESTION: /* question */
|
||||
case MBX_QUESTION_YN:
|
||||
case MBX_QUESTION_OK:
|
||||
if (!btn1) /* replace default "OK" button with "Yes" button */
|
||||
tdconfig.dwCommonButtons = (flags & MBX_QUESTION_OK) ? TDCBF_OK_BUTTON : TDCBF_YES_BUTTON;
|
||||
|
||||
if (btn2) /* "No" button */
|
||||
tdbuttons[tdconfig.cButtons++] = tdb_no;
|
||||
else
|
||||
tdconfig.dwCommonButtons |= (flags & MBX_QUESTION_OK) ? TDCBF_CANCEL_BUTTON : TDCBF_NO_BUTTON;
|
||||
if (btn2) /* "No" button */
|
||||
tdbuttons[tdconfig.cButtons++] = tdb_no;
|
||||
else
|
||||
tdconfig.dwCommonButtons |= (flags & MBX_QUESTION_OK) ? TDCBF_CANCEL_BUTTON : TDCBF_NO_BUTTON;
|
||||
|
||||
if (flags & MBX_QUESTION) {
|
||||
if (btn3) /* "Cancel" button */
|
||||
tdbuttons[tdconfig.cButtons++] = tdb_cancel;
|
||||
else
|
||||
tdconfig.dwCommonButtons |= TDCBF_CANCEL_BUTTON;
|
||||
}
|
||||
if (flags & MBX_QUESTION) {
|
||||
if (btn3) /* "Cancel" button */
|
||||
tdbuttons[tdconfig.cButtons++] = tdb_cancel;
|
||||
else
|
||||
tdconfig.dwCommonButtons |= TDCBF_CANCEL_BUTTON;
|
||||
}
|
||||
|
||||
if (flags & MBX_WARNING)
|
||||
tdconfig.pszMainIcon = TD_WARNING_ICON;
|
||||
break;
|
||||
if (flags & MBX_WARNING)
|
||||
tdconfig.pszMainIcon = TD_WARNING_ICON;
|
||||
break;
|
||||
}
|
||||
|
||||
/* If the message is an ANSI string, convert it. */
|
||||
tdconfig.pszContent = (WCHAR *) STRING_OR_RESOURCE(message);
|
||||
if (flags & MBX_ANSI) {
|
||||
mbstoc16s(temp, (char *)message, strlen((char *)message)+1);
|
||||
tdconfig.pszContent = temp;
|
||||
mbstoc16s(temp, (char *) message, strlen((char *) message) + 1);
|
||||
tdconfig.pszContent = temp;
|
||||
}
|
||||
|
||||
/* Configure the rest of the TaskDialog. */
|
||||
tdconfig.cbSize = sizeof(tdconfig);
|
||||
tdconfig.cbSize = sizeof(tdconfig);
|
||||
tdconfig.hwndParent = hwndMain;
|
||||
if (flags & MBX_LINKS)
|
||||
tdconfig.dwFlags = TDF_USE_COMMAND_LINKS;
|
||||
tdconfig.dwFlags = TDF_USE_COMMAND_LINKS;
|
||||
tdconfig.pszWindowTitle = MAKEINTRESOURCE(IDS_STRINGS);
|
||||
if (header)
|
||||
tdconfig.pszMainInstruction = STRING_OR_RESOURCE(header);
|
||||
tdconfig.pszMainInstruction = STRING_OR_RESOURCE(header);
|
||||
tdconfig.pButtons = tdbuttons;
|
||||
if (flags & MBX_DONTASK)
|
||||
tdconfig.pszVerificationText = MAKEINTRESOURCE(IDS_2135);
|
||||
tdconfig.pszVerificationText = MAKEINTRESOURCE(IDS_2135);
|
||||
|
||||
/* Run the TaskDialog. */
|
||||
TaskDialogIndirect(&tdconfig, &ret, NULL, &checked);
|
||||
|
||||
/* Convert return values to generic ones. */
|
||||
if (ret == IDNO) ret = 1;
|
||||
else if (ret == IDCANCEL) ret = -1;
|
||||
else ret = 0;
|
||||
if (ret == IDNO)
|
||||
ret = 1;
|
||||
else if (ret == IDCANCEL)
|
||||
ret = -1;
|
||||
else
|
||||
ret = 0;
|
||||
|
||||
/* 10 is added to the return value if "don't show again" is checked. */
|
||||
if (checked) ret += 10;
|
||||
if (checked)
|
||||
ret += 10;
|
||||
|
||||
return(ret);
|
||||
return (ret);
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
file_dlg_w(HWND hwnd, WCHAR *f, WCHAR *fn, WCHAR *title, int save)
|
||||
{
|
||||
OPENFILENAME ofn;
|
||||
BOOL r;
|
||||
BOOL r;
|
||||
/* DWORD err; */
|
||||
int old_dopause;
|
||||
|
||||
/* Initialize OPENFILENAME */
|
||||
ZeroMemory(&ofn, sizeof(ofn));
|
||||
ofn.lStructSize = sizeof(ofn);
|
||||
ofn.hwndOwner = hwnd;
|
||||
ofn.lpstrFile = wopenfilestring;
|
||||
ofn.hwndOwner = hwnd;
|
||||
ofn.lpstrFile = wopenfilestring;
|
||||
|
||||
/*
|
||||
* Set lpstrFile[0] to '\0' so that GetOpenFileName does
|
||||
@@ -175,40 +173,39 @@ file_dlg_w(HWND hwnd, WCHAR *f, WCHAR *fn, WCHAR *title, int save)
|
||||
*/
|
||||
memset(ofn.lpstrFile, 0x00, 512 * sizeof(WCHAR));
|
||||
memcpy(ofn.lpstrFile, fn, (wcslen(fn) << 1) + 2);
|
||||
ofn.nMaxFile = sizeof_w(wopenfilestring);
|
||||
ofn.lpstrFilter = f;
|
||||
ofn.nFilterIndex = 1;
|
||||
ofn.lpstrFileTitle = NULL;
|
||||
ofn.nMaxFileTitle = 0;
|
||||
ofn.nMaxFile = sizeof_w(wopenfilestring);
|
||||
ofn.lpstrFilter = f;
|
||||
ofn.nFilterIndex = 1;
|
||||
ofn.lpstrFileTitle = NULL;
|
||||
ofn.nMaxFileTitle = 0;
|
||||
ofn.lpstrInitialDir = NULL;
|
||||
ofn.Flags = OFN_PATHMUSTEXIST;
|
||||
if (! save)
|
||||
ofn.Flags |= OFN_FILEMUSTEXIST;
|
||||
ofn.Flags = OFN_PATHMUSTEXIST;
|
||||
if (!save)
|
||||
ofn.Flags |= OFN_FILEMUSTEXIST;
|
||||
if (title)
|
||||
ofn.lpstrTitle = title;
|
||||
ofn.lpstrTitle = title;
|
||||
|
||||
/* Display the Open dialog box. */
|
||||
old_dopause = dopause;
|
||||
plat_pause(1);
|
||||
if (save)
|
||||
r = GetSaveFileName(&ofn);
|
||||
r = GetSaveFileName(&ofn);
|
||||
else
|
||||
r = GetOpenFileName(&ofn);
|
||||
r = GetOpenFileName(&ofn);
|
||||
plat_pause(old_dopause);
|
||||
|
||||
plat_chdir(usr_path);
|
||||
|
||||
if (r) {
|
||||
c16stombs(openfilestring, wopenfilestring, sizeof(openfilestring));
|
||||
filterindex = ofn.nFilterIndex;
|
||||
c16stombs(openfilestring, wopenfilestring, sizeof(openfilestring));
|
||||
filterindex = ofn.nFilterIndex;
|
||||
|
||||
return(0);
|
||||
return (0);
|
||||
}
|
||||
|
||||
return(1);
|
||||
return (1);
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
file_dlg(HWND hwnd, WCHAR *f, char *fn, char *title, int save)
|
||||
{
|
||||
@@ -218,10 +215,9 @@ file_dlg(HWND hwnd, WCHAR *f, char *fn, char *title, int save)
|
||||
if (title)
|
||||
mbstoc16s(title_buf, title, sizeof title_buf);
|
||||
|
||||
return(file_dlg_w(hwnd, f, ufn, title ? title_buf : NULL, save));
|
||||
return (file_dlg_w(hwnd, f, ufn, title ? title_buf : NULL, save));
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
file_dlg_mb(HWND hwnd, char *f, char *fn, char *title, int save)
|
||||
{
|
||||
@@ -232,22 +228,20 @@ file_dlg_mb(HWND hwnd, char *f, char *fn, char *title, int save)
|
||||
if (title)
|
||||
mbstoc16s(title_buf, title, sizeof title_buf);
|
||||
|
||||
return(file_dlg_w(hwnd, uf, ufn, title ? title_buf : NULL, save));
|
||||
return (file_dlg_w(hwnd, uf, ufn, title ? title_buf : NULL, save));
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
file_dlg_w_st(HWND hwnd, int id, WCHAR *fn, char *title, int save)
|
||||
{
|
||||
WCHAR title_buf[512];
|
||||
if (title)
|
||||
mbstoc16s(title_buf, title, sizeof title_buf);
|
||||
return(file_dlg_w(hwnd, plat_get_string(id), fn, title ? title_buf : NULL, save));
|
||||
return (file_dlg_w(hwnd, plat_get_string(id), fn, title ? title_buf : NULL, save));
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
file_dlg_st(HWND hwnd, int id, char *fn, char *title, int save)
|
||||
{
|
||||
return(file_dlg(hwnd, plat_get_string(id), fn, title, save));
|
||||
return (file_dlg(hwnd, plat_get_string(id), fn, title, save));
|
||||
}
|
||||
|
||||
@@ -25,63 +25,59 @@
|
||||
#include <86box/86box.h>
|
||||
#include <86box/plat_dynld.h>
|
||||
|
||||
|
||||
#ifdef ENABLE_DYNLD_LOG
|
||||
int dynld_do_log = ENABLE_DYNLD_LOG;
|
||||
|
||||
|
||||
static void
|
||||
dynld_log(const char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
|
||||
if (dynld_do_log) {
|
||||
va_start(ap, fmt);
|
||||
pclog_ex(fmt, ap);
|
||||
va_end(ap);
|
||||
va_start(ap, fmt);
|
||||
pclog_ex(fmt, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
}
|
||||
#else
|
||||
#define dynld_log(fmt, ...)
|
||||
# define dynld_log(fmt, ...)
|
||||
#endif
|
||||
|
||||
|
||||
void *
|
||||
dynld_module(const char *name, dllimp_t *table)
|
||||
{
|
||||
HMODULE h;
|
||||
HMODULE h;
|
||||
dllimp_t *imp;
|
||||
void *func;
|
||||
void *func;
|
||||
|
||||
/* See if we can load the desired module. */
|
||||
if ((h = LoadLibrary(name)) == NULL) {
|
||||
dynld_log("DynLd(\"%s\"): library not found! (%08X)\n", name, GetLastError());
|
||||
return(NULL);
|
||||
dynld_log("DynLd(\"%s\"): library not found! (%08X)\n", name, GetLastError());
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
/* Now load the desired function pointers. */
|
||||
for (imp=table; imp->name!=NULL; imp++) {
|
||||
func = GetProcAddress(h, imp->name);
|
||||
if (func == NULL) {
|
||||
dynld_log("DynLd(\"%s\"): function '%s' not found! (%08X)\n",
|
||||
name, imp->name, GetLastError());
|
||||
FreeLibrary(h);
|
||||
return(NULL);
|
||||
}
|
||||
for (imp = table; imp->name != NULL; imp++) {
|
||||
func = GetProcAddress(h, imp->name);
|
||||
if (func == NULL) {
|
||||
dynld_log("DynLd(\"%s\"): function '%s' not found! (%08X)\n",
|
||||
name, imp->name, GetLastError());
|
||||
FreeLibrary(h);
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
/* To overcome typing issues.. */
|
||||
*(char **)imp->func = (char *)func;
|
||||
/* To overcome typing issues.. */
|
||||
*(char **) imp->func = (char *) func;
|
||||
}
|
||||
|
||||
/* All good. */
|
||||
dynld_log("loaded %s\n", name);
|
||||
return((void *)h);
|
||||
return ((void *) h);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
dynld_close(void *handle)
|
||||
{
|
||||
if (handle != NULL)
|
||||
FreeLibrary((HMODULE)handle);
|
||||
FreeLibrary((HMODULE) handle);
|
||||
}
|
||||
|
||||
@@ -28,138 +28,138 @@
|
||||
#include <86box/ui.h>
|
||||
#include <86box/win.h>
|
||||
|
||||
HICON hIcon[256]; /* icon data loaded from resources */
|
||||
char icon_set[256] = ""; /* name of the iconset to be used */
|
||||
HICON hIcon[256]; /* icon data loaded from resources */
|
||||
char icon_set[256] = ""; /* name of the iconset to be used */
|
||||
|
||||
void win_clear_icon_set()
|
||||
void
|
||||
win_clear_icon_set()
|
||||
{
|
||||
int i;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 256; i++)
|
||||
if (hIcon[i] != 0)
|
||||
{
|
||||
DestroyIcon(hIcon[i]);
|
||||
hIcon[i] = 0;
|
||||
}
|
||||
for (i = 0; i < 256; i++)
|
||||
if (hIcon[i] != 0) {
|
||||
DestroyIcon(hIcon[i]);
|
||||
hIcon[i] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void win_system_icon_set()
|
||||
void
|
||||
win_system_icon_set()
|
||||
{
|
||||
int i, x = win_get_system_metrics(SM_CXSMICON, dpi), y = win_get_system_metrics(SM_CYSMICON, dpi);
|
||||
int i, x = win_get_system_metrics(SM_CXSMICON, dpi), y = win_get_system_metrics(SM_CYSMICON, dpi);
|
||||
|
||||
for (i = 0; i < 256; i++)
|
||||
hIcon[i] = LoadImage(hinstance, MAKEINTRESOURCE(i), IMAGE_ICON, x, y, LR_DEFAULTCOLOR);
|
||||
for (i = 0; i < 256; i++)
|
||||
hIcon[i] = LoadImage(hinstance, MAKEINTRESOURCE(i), IMAGE_ICON, x, y, LR_DEFAULTCOLOR);
|
||||
}
|
||||
|
||||
typedef struct
|
||||
{
|
||||
int id;
|
||||
char* filename;
|
||||
int id;
|
||||
char *filename;
|
||||
} _ICON_DATA;
|
||||
|
||||
const _ICON_DATA icon_files[] =
|
||||
{
|
||||
{16, "floppy_525.ico"},
|
||||
{17, "floppy_525_active.ico"},
|
||||
{24, "floppy_35.ico"},
|
||||
{25, "floppy_35_active.ico"},
|
||||
{32, "cdrom.ico"},
|
||||
{33, "cdrom_active.ico"},
|
||||
{48, "zip.ico"},
|
||||
{49, "zip_active.ico"},
|
||||
{56, "mo.ico"},
|
||||
{57, "mo_active.ico"},
|
||||
{64, "cassette.ico"},
|
||||
{65, "cassette_active.ico"},
|
||||
{80, "hard_disk.ico"},
|
||||
{81, "hard_disk_active.ico"},
|
||||
{96, "network.ico"},
|
||||
{97, "network_active.ico"},
|
||||
{104, "cartridge.ico"},
|
||||
{144, "floppy_525_empty.ico"},
|
||||
{145, "floppy_525_empty_active.ico"},
|
||||
{152, "floppy_35_empty.ico"},
|
||||
{153, "floppy_35_empty_active.ico"},
|
||||
{160, "cdrom_empty.ico"},
|
||||
{161, "cdrom_empty_active.ico"},
|
||||
{176, "zip_empty.ico"},
|
||||
{177, "zip_empty_active.ico"},
|
||||
{184, "mo_empty.ico"},
|
||||
{185, "mo_empty_active.ico"},
|
||||
{192, "cassette_empty.ico"},
|
||||
{193, "cassette_empty_active.ico"},
|
||||
{200, "run.ico"},
|
||||
{201, "pause.ico"},
|
||||
{202, "send_cad.ico"},
|
||||
{203, "send_cae.ico"},
|
||||
{204, "hard_reset.ico"},
|
||||
{205, "acpi_shutdown.ico"},
|
||||
{206, "settings.ico"},
|
||||
{232, "cartridge_empty.ico"},
|
||||
{240, "machine.ico"},
|
||||
{241, "display.ico"},
|
||||
{242, "input_devices.ico"},
|
||||
{243, "sound.ico"},
|
||||
{244, "ports.ico"},
|
||||
{245, "other_peripherals.ico"},
|
||||
{246, "floppy_and_cdrom_drives.ico"},
|
||||
{247, "other_removable_devices.ico"},
|
||||
{248, "floppy_disabled.ico"},
|
||||
{249, "cdrom_disabled.ico"},
|
||||
{250, "zip_disabled.ico"},
|
||||
{251, "mo_disabled.ico"},
|
||||
{252, "storage_controllers.ico"}
|
||||
};
|
||||
const _ICON_DATA icon_files[] = {
|
||||
{16, "floppy_525.ico" },
|
||||
{ 17, "floppy_525_active.ico" },
|
||||
{ 24, "floppy_35.ico" },
|
||||
{ 25, "floppy_35_active.ico" },
|
||||
{ 32, "cdrom.ico" },
|
||||
{ 33, "cdrom_active.ico" },
|
||||
{ 48, "zip.ico" },
|
||||
{ 49, "zip_active.ico" },
|
||||
{ 56, "mo.ico" },
|
||||
{ 57, "mo_active.ico" },
|
||||
{ 64, "cassette.ico" },
|
||||
{ 65, "cassette_active.ico" },
|
||||
{ 80, "hard_disk.ico" },
|
||||
{ 81, "hard_disk_active.ico" },
|
||||
{ 96, "network.ico" },
|
||||
{ 97, "network_active.ico" },
|
||||
{ 104, "cartridge.ico" },
|
||||
{ 144, "floppy_525_empty.ico" },
|
||||
{ 145, "floppy_525_empty_active.ico"},
|
||||
{ 152, "floppy_35_empty.ico" },
|
||||
{ 153, "floppy_35_empty_active.ico" },
|
||||
{ 160, "cdrom_empty.ico" },
|
||||
{ 161, "cdrom_empty_active.ico" },
|
||||
{ 176, "zip_empty.ico" },
|
||||
{ 177, "zip_empty_active.ico" },
|
||||
{ 184, "mo_empty.ico" },
|
||||
{ 185, "mo_empty_active.ico" },
|
||||
{ 192, "cassette_empty.ico" },
|
||||
{ 193, "cassette_empty_active.ico" },
|
||||
{ 200, "run.ico" },
|
||||
{ 201, "pause.ico" },
|
||||
{ 202, "send_cad.ico" },
|
||||
{ 203, "send_cae.ico" },
|
||||
{ 204, "hard_reset.ico" },
|
||||
{ 205, "acpi_shutdown.ico" },
|
||||
{ 206, "settings.ico" },
|
||||
{ 232, "cartridge_empty.ico" },
|
||||
{ 240, "machine.ico" },
|
||||
{ 241, "display.ico" },
|
||||
{ 242, "input_devices.ico" },
|
||||
{ 243, "sound.ico" },
|
||||
{ 244, "ports.ico" },
|
||||
{ 245, "other_peripherals.ico" },
|
||||
{ 246, "floppy_and_cdrom_drives.ico"},
|
||||
{ 247, "other_removable_devices.ico"},
|
||||
{ 248, "floppy_disabled.ico" },
|
||||
{ 249, "cdrom_disabled.ico" },
|
||||
{ 250, "zip_disabled.ico" },
|
||||
{ 251, "mo_disabled.ico" },
|
||||
{ 252, "storage_controllers.ico" }
|
||||
};
|
||||
|
||||
void win_get_icons_path(char* path_root)
|
||||
void
|
||||
win_get_icons_path(char *path_root)
|
||||
{
|
||||
char roms_root[1024] = {0};
|
||||
if (rom_path[0])
|
||||
strcpy(roms_root, rom_path);
|
||||
else
|
||||
path_append_filename(roms_root, exe_path, "roms");
|
||||
char roms_root[1024] = { 0 };
|
||||
if (rom_path[0])
|
||||
strcpy(roms_root, rom_path);
|
||||
else
|
||||
path_append_filename(roms_root, exe_path, "roms");
|
||||
|
||||
path_append_filename(path_root, roms_root, "icons");
|
||||
path_slash(path_root);
|
||||
path_append_filename(path_root, roms_root, "icons");
|
||||
path_slash(path_root);
|
||||
}
|
||||
|
||||
void win_load_icon_set()
|
||||
void
|
||||
win_load_icon_set()
|
||||
{
|
||||
win_clear_icon_set();
|
||||
win_system_icon_set();
|
||||
win_clear_icon_set();
|
||||
win_system_icon_set();
|
||||
|
||||
if (strlen(icon_set) == 0) {
|
||||
ToolBarLoadIcons();
|
||||
return;
|
||||
}
|
||||
if (strlen(icon_set) == 0) {
|
||||
ToolBarLoadIcons();
|
||||
return;
|
||||
}
|
||||
|
||||
char path_root[2048] = {0}, temp[2048] = {0};
|
||||
wchar_t wtemp[2048] = {0};
|
||||
char path_root[2048] = { 0 }, temp[2048] = { 0 };
|
||||
wchar_t wtemp[2048] = { 0 };
|
||||
|
||||
win_get_icons_path(path_root);
|
||||
strcat(path_root, icon_set);
|
||||
path_slash(path_root);
|
||||
win_get_icons_path(path_root);
|
||||
strcat(path_root, icon_set);
|
||||
path_slash(path_root);
|
||||
|
||||
int i, count = sizeof(icon_files) / sizeof(_ICON_DATA),
|
||||
x = win_get_system_metrics(SM_CXSMICON, dpi), y = win_get_system_metrics(SM_CYSMICON, dpi);
|
||||
for (i = 0; i < count; i++)
|
||||
{
|
||||
path_append_filename(temp, path_root, icon_files[i].filename);
|
||||
mbstoc16s(wtemp, temp, strlen(temp) + 1);
|
||||
int i, count = sizeof(icon_files) / sizeof(_ICON_DATA),
|
||||
x = win_get_system_metrics(SM_CXSMICON, dpi), y = win_get_system_metrics(SM_CYSMICON, dpi);
|
||||
for (i = 0; i < count; i++) {
|
||||
path_append_filename(temp, path_root, icon_files[i].filename);
|
||||
mbstoc16s(wtemp, temp, strlen(temp) + 1);
|
||||
|
||||
HICON ictemp;
|
||||
ictemp = LoadImageW(NULL, (LPWSTR)wtemp, IMAGE_ICON, x, y, LR_LOADFROMFILE | LR_DEFAULTCOLOR);
|
||||
if (ictemp)
|
||||
{
|
||||
if (hIcon[icon_files[i].id])
|
||||
DestroyIcon(hIcon[icon_files[i].id]);
|
||||
hIcon[icon_files[i].id] = ictemp;
|
||||
}
|
||||
}
|
||||
HICON ictemp;
|
||||
ictemp = LoadImageW(NULL, (LPWSTR) wtemp, IMAGE_ICON, x, y, LR_LOADFROMFILE | LR_DEFAULTCOLOR);
|
||||
if (ictemp) {
|
||||
if (hIcon[icon_files[i].id])
|
||||
DestroyIcon(hIcon[icon_files[i].id]);
|
||||
hIcon[icon_files[i].id] = ictemp;
|
||||
}
|
||||
}
|
||||
|
||||
uint32_t curr_lang = lang_id;
|
||||
lang_id = 0;
|
||||
set_language(curr_lang);
|
||||
uint32_t curr_lang = lang_id;
|
||||
lang_id = 0;
|
||||
set_language(curr_lang);
|
||||
|
||||
ToolBarLoadIcons();
|
||||
ToolBarLoadIcons();
|
||||
}
|
||||
|
||||
@@ -36,435 +36,447 @@
|
||||
#ifdef ENABLE_JOYSTICK_LOG
|
||||
int joystick_do_log = ENABLE_JOYSTICK_LOG;
|
||||
|
||||
|
||||
static void
|
||||
joystick_log(const char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
va_list ap;
|
||||
|
||||
if (joystick_do_log) {
|
||||
va_start(ap, fmt);
|
||||
pclog_ex(fmt, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
if (joystick_do_log) {
|
||||
va_start(ap, fmt);
|
||||
pclog_ex(fmt, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
}
|
||||
#else
|
||||
#define joystick_log(fmt, ...)
|
||||
# define joystick_log(fmt, ...)
|
||||
#endif
|
||||
|
||||
typedef struct {
|
||||
HANDLE hdevice;
|
||||
PHIDP_PREPARSED_DATA data;
|
||||
HANDLE hdevice;
|
||||
PHIDP_PREPARSED_DATA data;
|
||||
|
||||
USAGE usage_button[256];
|
||||
USAGE usage_button[256];
|
||||
|
||||
struct raw_axis_t {
|
||||
USAGE usage;
|
||||
USHORT link;
|
||||
USHORT bitsize;
|
||||
LONG max;
|
||||
LONG min;
|
||||
} axis[8];
|
||||
struct raw_axis_t {
|
||||
USAGE usage;
|
||||
USHORT link;
|
||||
USHORT bitsize;
|
||||
LONG max;
|
||||
LONG min;
|
||||
} axis[8];
|
||||
|
||||
struct raw_pov_t {
|
||||
USAGE usage;
|
||||
USHORT link;
|
||||
LONG max;
|
||||
LONG min;
|
||||
} pov[4];
|
||||
struct raw_pov_t {
|
||||
USAGE usage;
|
||||
USHORT link;
|
||||
LONG max;
|
||||
LONG min;
|
||||
} pov[4];
|
||||
} raw_joystick_t;
|
||||
|
||||
plat_joystick_t plat_joystick_state[MAX_PLAT_JOYSTICKS];
|
||||
joystick_t joystick_state[MAX_JOYSTICKS];
|
||||
int joysticks_present = 0;
|
||||
joystick_t joystick_state[MAX_JOYSTICKS];
|
||||
int joysticks_present = 0;
|
||||
|
||||
raw_joystick_t raw_joystick_state[MAX_PLAT_JOYSTICKS];
|
||||
|
||||
/* We only use the first 32 buttons reported, from Usage ID 1-128 */
|
||||
void joystick_add_button(raw_joystick_t* rawjoy, plat_joystick_t* joy, USAGE usage) {
|
||||
if (joy->nr_buttons >= 32) return;
|
||||
if (usage < 1 || usage > 128) return;
|
||||
|
||||
rawjoy->usage_button[usage] = joy->nr_buttons;
|
||||
sprintf(joy->button[joy->nr_buttons].name, "Button %d", usage);
|
||||
joy->nr_buttons++;
|
||||
}
|
||||
|
||||
void joystick_add_axis(raw_joystick_t* rawjoy, plat_joystick_t* joy, PHIDP_VALUE_CAPS prop) {
|
||||
if (joy->nr_axes >= 8) return;
|
||||
|
||||
switch (prop->Range.UsageMin) {
|
||||
case HID_USAGE_GENERIC_X:
|
||||
sprintf(joy->axis[joy->nr_axes].name, "X");
|
||||
break;
|
||||
case HID_USAGE_GENERIC_Y:
|
||||
sprintf(joy->axis[joy->nr_axes].name, "Y");
|
||||
break;
|
||||
case HID_USAGE_GENERIC_Z:
|
||||
sprintf(joy->axis[joy->nr_axes].name, "Z");
|
||||
break;
|
||||
case HID_USAGE_GENERIC_RX:
|
||||
sprintf(joy->axis[joy->nr_axes].name, "RX");
|
||||
break;
|
||||
case HID_USAGE_GENERIC_RY:
|
||||
sprintf(joy->axis[joy->nr_axes].name, "RY");
|
||||
break;
|
||||
case HID_USAGE_GENERIC_RZ:
|
||||
sprintf(joy->axis[joy->nr_axes].name, "RZ");
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
joy->axis[joy->nr_axes].id = joy->nr_axes;
|
||||
rawjoy->axis[joy->nr_axes].usage = prop->Range.UsageMin;
|
||||
rawjoy->axis[joy->nr_axes].link = prop->LinkCollection;
|
||||
rawjoy->axis[joy->nr_axes].bitsize = prop->BitSize;
|
||||
|
||||
/* Assume unsigned when min >= 0 */
|
||||
if (prop->LogicalMin < 0) {
|
||||
rawjoy->axis[joy->nr_axes].max = prop->LogicalMax;
|
||||
} else {
|
||||
/*
|
||||
* Some joysticks will send -1 in LogicalMax, like Xbox Controllers
|
||||
* so we need to mask that to appropriate value (instead of 0xFFFFFFFF)
|
||||
*/
|
||||
rawjoy->axis[joy->nr_axes].max = prop->LogicalMax & ((1 << prop->BitSize) - 1);
|
||||
}
|
||||
rawjoy->axis[joy->nr_axes].min = prop->LogicalMin;
|
||||
|
||||
joy->nr_axes++;
|
||||
}
|
||||
|
||||
void joystick_add_pov(raw_joystick_t* rawjoy, plat_joystick_t* joy, PHIDP_VALUE_CAPS prop) {
|
||||
if (joy->nr_povs >= 4) return;
|
||||
|
||||
sprintf(joy->pov[joy->nr_povs].name, "POV %d", joy->nr_povs+1);
|
||||
rawjoy->pov[joy->nr_povs].usage = prop->Range.UsageMin;
|
||||
rawjoy->pov[joy->nr_povs].link = prop->LinkCollection;
|
||||
rawjoy->pov[joy->nr_povs].min = prop->LogicalMin;
|
||||
rawjoy->pov[joy->nr_povs].max = prop->LogicalMax;
|
||||
|
||||
joy->nr_povs++;
|
||||
}
|
||||
|
||||
void joystick_get_capabilities(raw_joystick_t* rawjoy, plat_joystick_t* joy) {
|
||||
UINT size = 0;
|
||||
PHIDP_BUTTON_CAPS btn_caps = NULL;
|
||||
PHIDP_VALUE_CAPS val_caps = NULL;
|
||||
|
||||
/* Get preparsed data (HID data format) */
|
||||
GetRawInputDeviceInfoW(rawjoy->hdevice, RIDI_PREPARSEDDATA, NULL, &size);
|
||||
rawjoy->data = malloc(size);
|
||||
if (GetRawInputDeviceInfoW(rawjoy->hdevice, RIDI_PREPARSEDDATA, rawjoy->data, &size) <= 0)
|
||||
fatal("joystick_get_capabilities: Failed to get preparsed data.\n");
|
||||
|
||||
HIDP_CAPS caps;
|
||||
HidP_GetCaps(rawjoy->data, &caps);
|
||||
|
||||
/* Buttons */
|
||||
if (caps.NumberInputButtonCaps > 0) {
|
||||
btn_caps = calloc(caps.NumberInputButtonCaps, sizeof(HIDP_BUTTON_CAPS));
|
||||
if (HidP_GetButtonCaps(HidP_Input, btn_caps, &caps.NumberInputButtonCaps, rawjoy->data) != HIDP_STATUS_SUCCESS) {
|
||||
joystick_log("joystick_get_capabilities: Failed to query input buttons.\n");
|
||||
goto end;
|
||||
}
|
||||
/* We only detect generic stuff */
|
||||
for (int c=0; c<caps.NumberInputButtonCaps; c++) {
|
||||
if (btn_caps[c].UsagePage != HID_USAGE_PAGE_BUTTON) continue;
|
||||
|
||||
int button_count = btn_caps[c].Range.UsageMax - btn_caps[c].Range.UsageMin + 1;
|
||||
for (int b=0; b<button_count; b++) {
|
||||
joystick_add_button(rawjoy, joy, b + btn_caps[c].Range.UsageMin);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Values (axes and povs) */
|
||||
if (caps.NumberInputValueCaps > 0) {
|
||||
val_caps = calloc(caps.NumberInputValueCaps, sizeof(HIDP_VALUE_CAPS));
|
||||
if (HidP_GetValueCaps(HidP_Input, val_caps, &caps.NumberInputValueCaps, rawjoy->data) != HIDP_STATUS_SUCCESS) {
|
||||
joystick_log("joystick_get_capabilities: Failed to query axes and povs.\n");
|
||||
goto end;
|
||||
}
|
||||
/* We only detect generic stuff */
|
||||
for (int c=0; c<caps.NumberInputValueCaps; c++) {
|
||||
if (val_caps[c].UsagePage != HID_USAGE_PAGE_GENERIC) continue;
|
||||
|
||||
if (val_caps[c].Range.UsageMin == HID_USAGE_GENERIC_HATSWITCH)
|
||||
joystick_add_pov(rawjoy, joy, &val_caps[c]);
|
||||
else
|
||||
joystick_add_axis(rawjoy, joy, &val_caps[c]);
|
||||
}
|
||||
}
|
||||
|
||||
end:
|
||||
free(btn_caps);
|
||||
free(val_caps);
|
||||
}
|
||||
|
||||
void joystick_get_device_name(raw_joystick_t* rawjoy, plat_joystick_t* joy, PRID_DEVICE_INFO info) {
|
||||
UINT size = 0;
|
||||
char *device_name = NULL;
|
||||
WCHAR device_desc_wide[200] = {0};
|
||||
|
||||
GetRawInputDeviceInfoA(rawjoy->hdevice, RIDI_DEVICENAME, device_name, &size);
|
||||
device_name = calloc(size, sizeof(char));
|
||||
if (GetRawInputDeviceInfoA(rawjoy->hdevice, RIDI_DEVICENAME, device_name, &size) <= 0)
|
||||
fatal("joystick_get_capabilities: Failed to get device name.\n");
|
||||
|
||||
HANDLE hDevObj = CreateFile(device_name, GENERIC_READ | GENERIC_WRITE,
|
||||
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
|
||||
if (hDevObj) {
|
||||
HidD_GetProductString(hDevObj, device_desc_wide, sizeof(WCHAR) * 200);
|
||||
CloseHandle(hDevObj);
|
||||
}
|
||||
free(device_name);
|
||||
|
||||
int result = WideCharToMultiByte(CP_ACP, 0, device_desc_wide, 200, joy->name, 260, NULL, NULL);
|
||||
if (result == 0 || strlen(joy->name) == 0)
|
||||
sprintf(joy->name,
|
||||
"RawInput %s, VID:%04lX PID:%04lX",
|
||||
info->hid.usUsage == HID_USAGE_GENERIC_JOYSTICK ? "Joystick" : "Gamepad",
|
||||
info->hid.dwVendorId,
|
||||
info->hid.dwProductId);
|
||||
}
|
||||
|
||||
void joystick_init()
|
||||
void
|
||||
joystick_add_button(raw_joystick_t *rawjoy, plat_joystick_t *joy, USAGE usage)
|
||||
{
|
||||
UINT size = 0;
|
||||
atexit(joystick_close);
|
||||
if (joy->nr_buttons >= 32)
|
||||
return;
|
||||
if (usage < 1 || usage > 128)
|
||||
return;
|
||||
|
||||
joysticks_present = 0;
|
||||
memset(raw_joystick_state, 0, sizeof(raw_joystick_t) * MAX_PLAT_JOYSTICKS);
|
||||
|
||||
/* Get a list of raw input devices from Windows */
|
||||
UINT raw_devices = 0;
|
||||
GetRawInputDeviceList(NULL, &raw_devices, sizeof(RAWINPUTDEVICELIST));
|
||||
PRAWINPUTDEVICELIST deviceList = calloc(raw_devices, sizeof(RAWINPUTDEVICELIST));
|
||||
GetRawInputDeviceList(deviceList, &raw_devices, sizeof(RAWINPUTDEVICELIST));
|
||||
|
||||
for (int i=0; i<raw_devices; i++) {
|
||||
PRID_DEVICE_INFO info = NULL;
|
||||
|
||||
if (joysticks_present >= MAX_PLAT_JOYSTICKS) break;
|
||||
if (deviceList[i].dwType != RIM_TYPEHID) continue;
|
||||
|
||||
/* Get device info: hardware IDs and usage IDs */
|
||||
GetRawInputDeviceInfoA(deviceList[i].hDevice, RIDI_DEVICEINFO, NULL, &size);
|
||||
info = malloc(size);
|
||||
info->cbSize = sizeof(RID_DEVICE_INFO);
|
||||
if (GetRawInputDeviceInfoA(deviceList[i].hDevice, RIDI_DEVICEINFO, info, &size) <= 0)
|
||||
goto end_loop;
|
||||
|
||||
/* If this is not a joystick/gamepad, skip */
|
||||
if (info->hid.usUsagePage != HID_USAGE_PAGE_GENERIC) goto end_loop;
|
||||
if (info->hid.usUsage != HID_USAGE_GENERIC_JOYSTICK &&
|
||||
info->hid.usUsage != HID_USAGE_GENERIC_GAMEPAD) goto end_loop;
|
||||
|
||||
plat_joystick_t *joy = &plat_joystick_state[joysticks_present];
|
||||
raw_joystick_t *rawjoy = &raw_joystick_state[joysticks_present];
|
||||
rawjoy->hdevice = deviceList[i].hDevice;
|
||||
|
||||
joystick_get_capabilities(rawjoy, joy);
|
||||
joystick_get_device_name(rawjoy, joy, info);
|
||||
|
||||
joystick_log("joystick_init: %s - %d buttons, %d axes, %d POVs\n",
|
||||
joy->name, joy->nr_buttons, joy->nr_axes, joy->nr_povs);
|
||||
|
||||
joysticks_present++;
|
||||
|
||||
end_loop:
|
||||
free(info);
|
||||
}
|
||||
|
||||
joystick_log("joystick_init: joysticks_present=%i\n", joysticks_present);
|
||||
|
||||
/* Initialize the RawInput (joystick and gamepad) module. */
|
||||
RAWINPUTDEVICE ridev[2];
|
||||
ridev[0].dwFlags = 0;
|
||||
ridev[0].hwndTarget = NULL;
|
||||
ridev[0].usUsagePage = HID_USAGE_PAGE_GENERIC;
|
||||
ridev[0].usUsage = HID_USAGE_GENERIC_JOYSTICK;
|
||||
|
||||
ridev[1].dwFlags = 0;
|
||||
ridev[1].hwndTarget = NULL;
|
||||
ridev[1].usUsagePage = HID_USAGE_PAGE_GENERIC;
|
||||
ridev[1].usUsage = HID_USAGE_GENERIC_GAMEPAD;
|
||||
|
||||
if (!RegisterRawInputDevices(ridev, 2, sizeof(RAWINPUTDEVICE)))
|
||||
fatal("plat_joystick_init: RegisterRawInputDevices failed\n");
|
||||
rawjoy->usage_button[usage] = joy->nr_buttons;
|
||||
sprintf(joy->button[joy->nr_buttons].name, "Button %d", usage);
|
||||
joy->nr_buttons++;
|
||||
}
|
||||
|
||||
void joystick_close()
|
||||
void
|
||||
joystick_add_axis(raw_joystick_t *rawjoy, plat_joystick_t *joy, PHIDP_VALUE_CAPS prop)
|
||||
{
|
||||
RAWINPUTDEVICE ridev[2];
|
||||
ridev[0].dwFlags = RIDEV_REMOVE;
|
||||
ridev[0].hwndTarget = NULL;
|
||||
ridev[0].usUsagePage = HID_USAGE_PAGE_GENERIC;
|
||||
ridev[0].usUsage = HID_USAGE_GENERIC_JOYSTICK;
|
||||
if (joy->nr_axes >= 8)
|
||||
return;
|
||||
|
||||
ridev[1].dwFlags = RIDEV_REMOVE;
|
||||
ridev[1].hwndTarget = NULL;
|
||||
ridev[1].usUsagePage = HID_USAGE_PAGE_GENERIC;
|
||||
ridev[1].usUsage = HID_USAGE_GENERIC_GAMEPAD;
|
||||
switch (prop->Range.UsageMin) {
|
||||
case HID_USAGE_GENERIC_X:
|
||||
sprintf(joy->axis[joy->nr_axes].name, "X");
|
||||
break;
|
||||
case HID_USAGE_GENERIC_Y:
|
||||
sprintf(joy->axis[joy->nr_axes].name, "Y");
|
||||
break;
|
||||
case HID_USAGE_GENERIC_Z:
|
||||
sprintf(joy->axis[joy->nr_axes].name, "Z");
|
||||
break;
|
||||
case HID_USAGE_GENERIC_RX:
|
||||
sprintf(joy->axis[joy->nr_axes].name, "RX");
|
||||
break;
|
||||
case HID_USAGE_GENERIC_RY:
|
||||
sprintf(joy->axis[joy->nr_axes].name, "RY");
|
||||
break;
|
||||
case HID_USAGE_GENERIC_RZ:
|
||||
sprintf(joy->axis[joy->nr_axes].name, "RZ");
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
RegisterRawInputDevices(ridev, 2, sizeof(RAWINPUTDEVICE));
|
||||
joy->axis[joy->nr_axes].id = joy->nr_axes;
|
||||
rawjoy->axis[joy->nr_axes].usage = prop->Range.UsageMin;
|
||||
rawjoy->axis[joy->nr_axes].link = prop->LinkCollection;
|
||||
rawjoy->axis[joy->nr_axes].bitsize = prop->BitSize;
|
||||
|
||||
/* Assume unsigned when min >= 0 */
|
||||
if (prop->LogicalMin < 0) {
|
||||
rawjoy->axis[joy->nr_axes].max = prop->LogicalMax;
|
||||
} else {
|
||||
/*
|
||||
* Some joysticks will send -1 in LogicalMax, like Xbox Controllers
|
||||
* so we need to mask that to appropriate value (instead of 0xFFFFFFFF)
|
||||
*/
|
||||
rawjoy->axis[joy->nr_axes].max = prop->LogicalMax & ((1 << prop->BitSize) - 1);
|
||||
}
|
||||
rawjoy->axis[joy->nr_axes].min = prop->LogicalMin;
|
||||
|
||||
joy->nr_axes++;
|
||||
}
|
||||
|
||||
|
||||
void win_joystick_handle(PRAWINPUT raw)
|
||||
void
|
||||
joystick_add_pov(raw_joystick_t *rawjoy, plat_joystick_t *joy, PHIDP_VALUE_CAPS prop)
|
||||
{
|
||||
HRESULT r;
|
||||
int j = -1; /* current joystick index, -1 when not found */
|
||||
if (joy->nr_povs >= 4)
|
||||
return;
|
||||
|
||||
/* If the input is not from a known device, we ignore it */
|
||||
for (int i=0; i<joysticks_present; i++) {
|
||||
if (raw_joystick_state[i].hdevice == raw->header.hDevice) {
|
||||
j = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (j == -1) return;
|
||||
sprintf(joy->pov[joy->nr_povs].name, "POV %d", joy->nr_povs + 1);
|
||||
rawjoy->pov[joy->nr_povs].usage = prop->Range.UsageMin;
|
||||
rawjoy->pov[joy->nr_povs].link = prop->LinkCollection;
|
||||
rawjoy->pov[joy->nr_povs].min = prop->LogicalMin;
|
||||
rawjoy->pov[joy->nr_povs].max = prop->LogicalMax;
|
||||
|
||||
/* Read buttons */
|
||||
USAGE usage_list[128] = {0};
|
||||
ULONG usage_length = plat_joystick_state[j].nr_buttons;
|
||||
memset(plat_joystick_state[j].b, 0, 32 * sizeof(int));
|
||||
|
||||
r = HidP_GetUsages(HidP_Input, HID_USAGE_PAGE_BUTTON, 0, usage_list, &usage_length,
|
||||
raw_joystick_state[j].data, (PCHAR)raw->data.hid.bRawData, raw->data.hid.dwSizeHid);
|
||||
|
||||
if (r == HIDP_STATUS_SUCCESS) {
|
||||
for (int i=0; i<usage_length; i++) {
|
||||
int button = raw_joystick_state[j].usage_button[usage_list[i]];
|
||||
plat_joystick_state[j].b[button] = 128;
|
||||
}
|
||||
}
|
||||
|
||||
/* Read axes */
|
||||
for (int a=0; a<plat_joystick_state[j].nr_axes; a++) {
|
||||
struct raw_axis_t* axis = &raw_joystick_state[j].axis[a];
|
||||
ULONG uvalue = 0;
|
||||
LONG value = 0;
|
||||
LONG center = (axis->max - axis->min + 1) / 2;
|
||||
|
||||
r = HidP_GetUsageValue(HidP_Input, HID_USAGE_PAGE_GENERIC, axis->link, axis->usage, &uvalue,
|
||||
raw_joystick_state[j].data, (PCHAR)raw->data.hid.bRawData, raw->data.hid.dwSizeHid);
|
||||
|
||||
if (r == HIDP_STATUS_SUCCESS) {
|
||||
if (axis->min < 0) {
|
||||
/* extend signed uvalue to LONG */
|
||||
if (uvalue & (1 << (axis->bitsize-1))) {
|
||||
ULONG mask = (1 << axis->bitsize) - 1;
|
||||
value = -1U ^ mask;
|
||||
value |= uvalue;
|
||||
} else {
|
||||
value = uvalue;
|
||||
}
|
||||
} else {
|
||||
/* Assume unsigned when min >= 0, convert to a signed value */
|
||||
value = (LONG)uvalue - center;
|
||||
}
|
||||
if (abs(value) == 1) value = 0;
|
||||
value = value * 32768 / center;
|
||||
}
|
||||
|
||||
plat_joystick_state[j].a[a] = value;
|
||||
//joystick_log("%s %-06d ", plat_joystick_state[j].axis[a].name, plat_joystick_state[j].a[a]);
|
||||
}
|
||||
|
||||
/* read povs */
|
||||
for (int p=0; p<plat_joystick_state[j].nr_povs; p++) {
|
||||
struct raw_pov_t* pov = &raw_joystick_state[j].pov[p];
|
||||
ULONG uvalue = 0;
|
||||
LONG value = -1;
|
||||
|
||||
r = HidP_GetUsageValue(HidP_Input, HID_USAGE_PAGE_GENERIC, pov->link, pov->usage, &uvalue,
|
||||
raw_joystick_state[j].data, (PCHAR)raw->data.hid.bRawData, raw->data.hid.dwSizeHid);
|
||||
|
||||
if (r == HIDP_STATUS_SUCCESS && (uvalue >= pov->min && uvalue <= pov->max)) {
|
||||
value = (uvalue - pov->min) * 36000;
|
||||
value /= (pov->max - pov->min + 1);
|
||||
value %= 36000;
|
||||
}
|
||||
|
||||
plat_joystick_state[j].p[p] = value;
|
||||
|
||||
//joystick_log("%s %-3d ", plat_joystick_state[j].pov[p].name, plat_joystick_state[j].p[p]);
|
||||
|
||||
}
|
||||
//joystick_log("\n");
|
||||
joy->nr_povs++;
|
||||
}
|
||||
|
||||
|
||||
static int joystick_get_axis(int joystick_nr, int mapping)
|
||||
void
|
||||
joystick_get_capabilities(raw_joystick_t *rawjoy, plat_joystick_t *joy)
|
||||
{
|
||||
if (mapping & POV_X)
|
||||
{
|
||||
int pov = plat_joystick_state[joystick_nr].p[mapping & 3];
|
||||
if (LOWORD(pov) == 0xFFFF)
|
||||
return 0;
|
||||
else
|
||||
return sin((2*M_PI * (double)pov) / 36000.0) * 32767;
|
||||
}
|
||||
else if (mapping & POV_Y)
|
||||
{
|
||||
int pov = plat_joystick_state[joystick_nr].p[mapping & 3];
|
||||
UINT size = 0;
|
||||
PHIDP_BUTTON_CAPS btn_caps = NULL;
|
||||
PHIDP_VALUE_CAPS val_caps = NULL;
|
||||
|
||||
if (LOWORD(pov) == 0xFFFF)
|
||||
return 0;
|
||||
else
|
||||
return -cos((2*M_PI * (double)pov) / 36000.0) * 32767;
|
||||
}
|
||||
else
|
||||
return plat_joystick_state[joystick_nr].a[plat_joystick_state[joystick_nr].axis[mapping].id];
|
||||
/* Get preparsed data (HID data format) */
|
||||
GetRawInputDeviceInfoW(rawjoy->hdevice, RIDI_PREPARSEDDATA, NULL, &size);
|
||||
rawjoy->data = malloc(size);
|
||||
if (GetRawInputDeviceInfoW(rawjoy->hdevice, RIDI_PREPARSEDDATA, rawjoy->data, &size) <= 0)
|
||||
fatal("joystick_get_capabilities: Failed to get preparsed data.\n");
|
||||
|
||||
HIDP_CAPS caps;
|
||||
HidP_GetCaps(rawjoy->data, &caps);
|
||||
|
||||
/* Buttons */
|
||||
if (caps.NumberInputButtonCaps > 0) {
|
||||
btn_caps = calloc(caps.NumberInputButtonCaps, sizeof(HIDP_BUTTON_CAPS));
|
||||
if (HidP_GetButtonCaps(HidP_Input, btn_caps, &caps.NumberInputButtonCaps, rawjoy->data) != HIDP_STATUS_SUCCESS) {
|
||||
joystick_log("joystick_get_capabilities: Failed to query input buttons.\n");
|
||||
goto end;
|
||||
}
|
||||
/* We only detect generic stuff */
|
||||
for (int c = 0; c < caps.NumberInputButtonCaps; c++) {
|
||||
if (btn_caps[c].UsagePage != HID_USAGE_PAGE_BUTTON)
|
||||
continue;
|
||||
|
||||
int button_count = btn_caps[c].Range.UsageMax - btn_caps[c].Range.UsageMin + 1;
|
||||
for (int b = 0; b < button_count; b++) {
|
||||
joystick_add_button(rawjoy, joy, b + btn_caps[c].Range.UsageMin);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Values (axes and povs) */
|
||||
if (caps.NumberInputValueCaps > 0) {
|
||||
val_caps = calloc(caps.NumberInputValueCaps, sizeof(HIDP_VALUE_CAPS));
|
||||
if (HidP_GetValueCaps(HidP_Input, val_caps, &caps.NumberInputValueCaps, rawjoy->data) != HIDP_STATUS_SUCCESS) {
|
||||
joystick_log("joystick_get_capabilities: Failed to query axes and povs.\n");
|
||||
goto end;
|
||||
}
|
||||
/* We only detect generic stuff */
|
||||
for (int c = 0; c < caps.NumberInputValueCaps; c++) {
|
||||
if (val_caps[c].UsagePage != HID_USAGE_PAGE_GENERIC)
|
||||
continue;
|
||||
|
||||
if (val_caps[c].Range.UsageMin == HID_USAGE_GENERIC_HATSWITCH)
|
||||
joystick_add_pov(rawjoy, joy, &val_caps[c]);
|
||||
else
|
||||
joystick_add_axis(rawjoy, joy, &val_caps[c]);
|
||||
}
|
||||
}
|
||||
|
||||
end:
|
||||
free(btn_caps);
|
||||
free(val_caps);
|
||||
}
|
||||
|
||||
|
||||
void joystick_process(void)
|
||||
void
|
||||
joystick_get_device_name(raw_joystick_t *rawjoy, plat_joystick_t *joy, PRID_DEVICE_INFO info)
|
||||
{
|
||||
int c, d;
|
||||
UINT size = 0;
|
||||
char *device_name = NULL;
|
||||
WCHAR device_desc_wide[200] = { 0 };
|
||||
|
||||
if (joystick_type == 7) return;
|
||||
GetRawInputDeviceInfoA(rawjoy->hdevice, RIDI_DEVICENAME, device_name, &size);
|
||||
device_name = calloc(size, sizeof(char));
|
||||
if (GetRawInputDeviceInfoA(rawjoy->hdevice, RIDI_DEVICENAME, device_name, &size) <= 0)
|
||||
fatal("joystick_get_capabilities: Failed to get device name.\n");
|
||||
|
||||
for (c = 0; c < joystick_get_max_joysticks(joystick_type); c++)
|
||||
{
|
||||
if (joystick_state[c].plat_joystick_nr)
|
||||
{
|
||||
int joystick_nr = joystick_state[c].plat_joystick_nr - 1;
|
||||
HANDLE hDevObj = CreateFile(device_name, GENERIC_READ | GENERIC_WRITE,
|
||||
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
|
||||
if (hDevObj) {
|
||||
HidD_GetProductString(hDevObj, device_desc_wide, sizeof(WCHAR) * 200);
|
||||
CloseHandle(hDevObj);
|
||||
}
|
||||
free(device_name);
|
||||
|
||||
for (d = 0; d < joystick_get_axis_count(joystick_type); d++)
|
||||
joystick_state[c].axis[d] = joystick_get_axis(joystick_nr, joystick_state[c].axis_mapping[d]);
|
||||
for (d = 0; d < joystick_get_button_count(joystick_type); d++)
|
||||
joystick_state[c].button[d] = plat_joystick_state[joystick_nr].b[joystick_state[c].button_mapping[d]];
|
||||
|
||||
for (d = 0; d < joystick_get_pov_count(joystick_type); d++)
|
||||
{
|
||||
int x, y;
|
||||
double angle, magnitude;
|
||||
|
||||
x = joystick_get_axis(joystick_nr, joystick_state[c].pov_mapping[d][0]);
|
||||
y = joystick_get_axis(joystick_nr, joystick_state[c].pov_mapping[d][1]);
|
||||
|
||||
angle = (atan2((double)y, (double)x) * 360.0) / (2*M_PI);
|
||||
magnitude = sqrt((double)x*(double)x + (double)y*(double)y);
|
||||
|
||||
if (magnitude < 16384)
|
||||
joystick_state[c].pov[d] = -1;
|
||||
else
|
||||
joystick_state[c].pov[d] = ((int)angle + 90 + 360) % 360;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (d = 0; d < joystick_get_axis_count(joystick_type); d++)
|
||||
joystick_state[c].axis[d] = 0;
|
||||
for (d = 0; d < joystick_get_button_count(joystick_type); d++)
|
||||
joystick_state[c].button[d] = 0;
|
||||
for (d = 0; d < joystick_get_pov_count(joystick_type); d++)
|
||||
joystick_state[c].pov[d] = -1;
|
||||
}
|
||||
}
|
||||
int result = WideCharToMultiByte(CP_ACP, 0, device_desc_wide, 200, joy->name, 260, NULL, NULL);
|
||||
if (result == 0 || strlen(joy->name) == 0)
|
||||
sprintf(joy->name,
|
||||
"RawInput %s, VID:%04lX PID:%04lX",
|
||||
info->hid.usUsage == HID_USAGE_GENERIC_JOYSTICK ? "Joystick" : "Gamepad",
|
||||
info->hid.dwVendorId,
|
||||
info->hid.dwProductId);
|
||||
}
|
||||
|
||||
void
|
||||
joystick_init()
|
||||
{
|
||||
UINT size = 0;
|
||||
atexit(joystick_close);
|
||||
|
||||
joysticks_present = 0;
|
||||
memset(raw_joystick_state, 0, sizeof(raw_joystick_t) * MAX_PLAT_JOYSTICKS);
|
||||
|
||||
/* Get a list of raw input devices from Windows */
|
||||
UINT raw_devices = 0;
|
||||
GetRawInputDeviceList(NULL, &raw_devices, sizeof(RAWINPUTDEVICELIST));
|
||||
PRAWINPUTDEVICELIST deviceList = calloc(raw_devices, sizeof(RAWINPUTDEVICELIST));
|
||||
GetRawInputDeviceList(deviceList, &raw_devices, sizeof(RAWINPUTDEVICELIST));
|
||||
|
||||
for (int i = 0; i < raw_devices; i++) {
|
||||
PRID_DEVICE_INFO info = NULL;
|
||||
|
||||
if (joysticks_present >= MAX_PLAT_JOYSTICKS)
|
||||
break;
|
||||
if (deviceList[i].dwType != RIM_TYPEHID)
|
||||
continue;
|
||||
|
||||
/* Get device info: hardware IDs and usage IDs */
|
||||
GetRawInputDeviceInfoA(deviceList[i].hDevice, RIDI_DEVICEINFO, NULL, &size);
|
||||
info = malloc(size);
|
||||
info->cbSize = sizeof(RID_DEVICE_INFO);
|
||||
if (GetRawInputDeviceInfoA(deviceList[i].hDevice, RIDI_DEVICEINFO, info, &size) <= 0)
|
||||
goto end_loop;
|
||||
|
||||
/* If this is not a joystick/gamepad, skip */
|
||||
if (info->hid.usUsagePage != HID_USAGE_PAGE_GENERIC)
|
||||
goto end_loop;
|
||||
if (info->hid.usUsage != HID_USAGE_GENERIC_JOYSTICK && info->hid.usUsage != HID_USAGE_GENERIC_GAMEPAD)
|
||||
goto end_loop;
|
||||
|
||||
plat_joystick_t *joy = &plat_joystick_state[joysticks_present];
|
||||
raw_joystick_t *rawjoy = &raw_joystick_state[joysticks_present];
|
||||
rawjoy->hdevice = deviceList[i].hDevice;
|
||||
|
||||
joystick_get_capabilities(rawjoy, joy);
|
||||
joystick_get_device_name(rawjoy, joy, info);
|
||||
|
||||
joystick_log("joystick_init: %s - %d buttons, %d axes, %d POVs\n",
|
||||
joy->name, joy->nr_buttons, joy->nr_axes, joy->nr_povs);
|
||||
|
||||
joysticks_present++;
|
||||
|
||||
end_loop:
|
||||
free(info);
|
||||
}
|
||||
|
||||
joystick_log("joystick_init: joysticks_present=%i\n", joysticks_present);
|
||||
|
||||
/* Initialize the RawInput (joystick and gamepad) module. */
|
||||
RAWINPUTDEVICE ridev[2];
|
||||
ridev[0].dwFlags = 0;
|
||||
ridev[0].hwndTarget = NULL;
|
||||
ridev[0].usUsagePage = HID_USAGE_PAGE_GENERIC;
|
||||
ridev[0].usUsage = HID_USAGE_GENERIC_JOYSTICK;
|
||||
|
||||
ridev[1].dwFlags = 0;
|
||||
ridev[1].hwndTarget = NULL;
|
||||
ridev[1].usUsagePage = HID_USAGE_PAGE_GENERIC;
|
||||
ridev[1].usUsage = HID_USAGE_GENERIC_GAMEPAD;
|
||||
|
||||
if (!RegisterRawInputDevices(ridev, 2, sizeof(RAWINPUTDEVICE)))
|
||||
fatal("plat_joystick_init: RegisterRawInputDevices failed\n");
|
||||
}
|
||||
|
||||
void
|
||||
joystick_close()
|
||||
{
|
||||
RAWINPUTDEVICE ridev[2];
|
||||
ridev[0].dwFlags = RIDEV_REMOVE;
|
||||
ridev[0].hwndTarget = NULL;
|
||||
ridev[0].usUsagePage = HID_USAGE_PAGE_GENERIC;
|
||||
ridev[0].usUsage = HID_USAGE_GENERIC_JOYSTICK;
|
||||
|
||||
ridev[1].dwFlags = RIDEV_REMOVE;
|
||||
ridev[1].hwndTarget = NULL;
|
||||
ridev[1].usUsagePage = HID_USAGE_PAGE_GENERIC;
|
||||
ridev[1].usUsage = HID_USAGE_GENERIC_GAMEPAD;
|
||||
|
||||
RegisterRawInputDevices(ridev, 2, sizeof(RAWINPUTDEVICE));
|
||||
}
|
||||
|
||||
void
|
||||
win_joystick_handle(PRAWINPUT raw)
|
||||
{
|
||||
HRESULT r;
|
||||
int j = -1; /* current joystick index, -1 when not found */
|
||||
|
||||
/* If the input is not from a known device, we ignore it */
|
||||
for (int i = 0; i < joysticks_present; i++) {
|
||||
if (raw_joystick_state[i].hdevice == raw->header.hDevice) {
|
||||
j = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (j == -1)
|
||||
return;
|
||||
|
||||
/* Read buttons */
|
||||
USAGE usage_list[128] = { 0 };
|
||||
ULONG usage_length = plat_joystick_state[j].nr_buttons;
|
||||
memset(plat_joystick_state[j].b, 0, 32 * sizeof(int));
|
||||
|
||||
r = HidP_GetUsages(HidP_Input, HID_USAGE_PAGE_BUTTON, 0, usage_list, &usage_length,
|
||||
raw_joystick_state[j].data, (PCHAR) raw->data.hid.bRawData, raw->data.hid.dwSizeHid);
|
||||
|
||||
if (r == HIDP_STATUS_SUCCESS) {
|
||||
for (int i = 0; i < usage_length; i++) {
|
||||
int button = raw_joystick_state[j].usage_button[usage_list[i]];
|
||||
plat_joystick_state[j].b[button] = 128;
|
||||
}
|
||||
}
|
||||
|
||||
/* Read axes */
|
||||
for (int a = 0; a < plat_joystick_state[j].nr_axes; a++) {
|
||||
struct raw_axis_t *axis = &raw_joystick_state[j].axis[a];
|
||||
ULONG uvalue = 0;
|
||||
LONG value = 0;
|
||||
LONG center = (axis->max - axis->min + 1) / 2;
|
||||
|
||||
r = HidP_GetUsageValue(HidP_Input, HID_USAGE_PAGE_GENERIC, axis->link, axis->usage, &uvalue,
|
||||
raw_joystick_state[j].data, (PCHAR) raw->data.hid.bRawData, raw->data.hid.dwSizeHid);
|
||||
|
||||
if (r == HIDP_STATUS_SUCCESS) {
|
||||
if (axis->min < 0) {
|
||||
/* extend signed uvalue to LONG */
|
||||
if (uvalue & (1 << (axis->bitsize - 1))) {
|
||||
ULONG mask = (1 << axis->bitsize) - 1;
|
||||
value = -1U ^ mask;
|
||||
value |= uvalue;
|
||||
} else {
|
||||
value = uvalue;
|
||||
}
|
||||
} else {
|
||||
/* Assume unsigned when min >= 0, convert to a signed value */
|
||||
value = (LONG) uvalue - center;
|
||||
}
|
||||
if (abs(value) == 1)
|
||||
value = 0;
|
||||
value = value * 32768 / center;
|
||||
}
|
||||
|
||||
plat_joystick_state[j].a[a] = value;
|
||||
// joystick_log("%s %-06d ", plat_joystick_state[j].axis[a].name, plat_joystick_state[j].a[a]);
|
||||
}
|
||||
|
||||
/* read povs */
|
||||
for (int p = 0; p < plat_joystick_state[j].nr_povs; p++) {
|
||||
struct raw_pov_t *pov = &raw_joystick_state[j].pov[p];
|
||||
ULONG uvalue = 0;
|
||||
LONG value = -1;
|
||||
|
||||
r = HidP_GetUsageValue(HidP_Input, HID_USAGE_PAGE_GENERIC, pov->link, pov->usage, &uvalue,
|
||||
raw_joystick_state[j].data, (PCHAR) raw->data.hid.bRawData, raw->data.hid.dwSizeHid);
|
||||
|
||||
if (r == HIDP_STATUS_SUCCESS && (uvalue >= pov->min && uvalue <= pov->max)) {
|
||||
value = (uvalue - pov->min) * 36000;
|
||||
value /= (pov->max - pov->min + 1);
|
||||
value %= 36000;
|
||||
}
|
||||
|
||||
plat_joystick_state[j].p[p] = value;
|
||||
|
||||
// joystick_log("%s %-3d ", plat_joystick_state[j].pov[p].name, plat_joystick_state[j].p[p]);
|
||||
}
|
||||
// joystick_log("\n");
|
||||
}
|
||||
|
||||
static int
|
||||
joystick_get_axis(int joystick_nr, int mapping)
|
||||
{
|
||||
if (mapping & POV_X) {
|
||||
int pov = plat_joystick_state[joystick_nr].p[mapping & 3];
|
||||
if (LOWORD(pov) == 0xFFFF)
|
||||
return 0;
|
||||
else
|
||||
return sin((2 * M_PI * (double) pov) / 36000.0) * 32767;
|
||||
} else if (mapping & POV_Y) {
|
||||
int pov = plat_joystick_state[joystick_nr].p[mapping & 3];
|
||||
|
||||
if (LOWORD(pov) == 0xFFFF)
|
||||
return 0;
|
||||
else
|
||||
return -cos((2 * M_PI * (double) pov) / 36000.0) * 32767;
|
||||
} else
|
||||
return plat_joystick_state[joystick_nr].a[plat_joystick_state[joystick_nr].axis[mapping].id];
|
||||
}
|
||||
|
||||
void
|
||||
joystick_process(void)
|
||||
{
|
||||
int c, d;
|
||||
|
||||
if (joystick_type == 7)
|
||||
return;
|
||||
|
||||
for (c = 0; c < joystick_get_max_joysticks(joystick_type); c++) {
|
||||
if (joystick_state[c].plat_joystick_nr) {
|
||||
int joystick_nr = joystick_state[c].plat_joystick_nr - 1;
|
||||
|
||||
for (d = 0; d < joystick_get_axis_count(joystick_type); d++)
|
||||
joystick_state[c].axis[d] = joystick_get_axis(joystick_nr, joystick_state[c].axis_mapping[d]);
|
||||
for (d = 0; d < joystick_get_button_count(joystick_type); d++)
|
||||
joystick_state[c].button[d] = plat_joystick_state[joystick_nr].b[joystick_state[c].button_mapping[d]];
|
||||
|
||||
for (d = 0; d < joystick_get_pov_count(joystick_type); d++) {
|
||||
int x, y;
|
||||
double angle, magnitude;
|
||||
|
||||
x = joystick_get_axis(joystick_nr, joystick_state[c].pov_mapping[d][0]);
|
||||
y = joystick_get_axis(joystick_nr, joystick_state[c].pov_mapping[d][1]);
|
||||
|
||||
angle = (atan2((double) y, (double) x) * 360.0) / (2 * M_PI);
|
||||
magnitude = sqrt((double) x * (double) x + (double) y * (double) y);
|
||||
|
||||
if (magnitude < 16384)
|
||||
joystick_state[c].pov[d] = -1;
|
||||
else
|
||||
joystick_state[c].pov[d] = ((int) angle + 90 + 360) % 360;
|
||||
}
|
||||
} else {
|
||||
for (d = 0; d < joystick_get_axis_count(joystick_type); d++)
|
||||
joystick_state[c].axis[d] = 0;
|
||||
for (d = 0; d < joystick_get_button_count(joystick_type); d++)
|
||||
joystick_state[c].button[d] = 0;
|
||||
for (d = 0; d < joystick_get_pov_count(joystick_type); d++)
|
||||
joystick_state[c].pov[d] = -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,233 +32,234 @@
|
||||
#include <86box/win.h>
|
||||
|
||||
#define XINPUT_MAX_JOYSTICKS 4
|
||||
#define XINPUT_NAME "Xinput compatiable controller"
|
||||
#define XINPUT_NAME_LX "Left Stick X"
|
||||
#define XINPUT_NAME_LY "Left Stick Y"
|
||||
#define XINPUT_NAME_RX "Right Stick X"
|
||||
#define XINPUT_NAME_RY "Right Stick Y"
|
||||
#define XINPUT_NAME_DPAD_X "D-pad X"
|
||||
#define XINPUT_NAME_DPAD_Y "D-pad Y"
|
||||
#define XINPUT_NAME_LB "LB"
|
||||
#define XINPUT_NAME_RB "RB"
|
||||
#define XINPUT_NAME_LT "LT"
|
||||
#define XINPUT_NAME_RT "RT"
|
||||
#define XINPUT_NAME_A "A"
|
||||
#define XINPUT_NAME_B "B"
|
||||
#define XINPUT_NAME_X "X"
|
||||
#define XINPUT_NAME_Y "Y"
|
||||
#define XINPUT_NAME_BACK "Back/View"
|
||||
#define XINPUT_NAME_START "Start/Menu"
|
||||
#define XINPUT_NAME_LS "Left Stick"
|
||||
#define XINPUT_NAME_RS "Right Stick"
|
||||
#define XINPUT_NAME "Xinput compatiable controller"
|
||||
#define XINPUT_NAME_LX "Left Stick X"
|
||||
#define XINPUT_NAME_LY "Left Stick Y"
|
||||
#define XINPUT_NAME_RX "Right Stick X"
|
||||
#define XINPUT_NAME_RY "Right Stick Y"
|
||||
#define XINPUT_NAME_DPAD_X "D-pad X"
|
||||
#define XINPUT_NAME_DPAD_Y "D-pad Y"
|
||||
#define XINPUT_NAME_LB "LB"
|
||||
#define XINPUT_NAME_RB "RB"
|
||||
#define XINPUT_NAME_LT "LT"
|
||||
#define XINPUT_NAME_RT "RT"
|
||||
#define XINPUT_NAME_A "A"
|
||||
#define XINPUT_NAME_B "B"
|
||||
#define XINPUT_NAME_X "X"
|
||||
#define XINPUT_NAME_Y "Y"
|
||||
#define XINPUT_NAME_BACK "Back/View"
|
||||
#define XINPUT_NAME_START "Start/Menu"
|
||||
#define XINPUT_NAME_LS "Left Stick"
|
||||
#define XINPUT_NAME_RS "Right Stick"
|
||||
|
||||
#ifdef ENABLE_JOYSTICK_LOG
|
||||
int joystick_do_log = ENABLE_JOYSTICK_LOG;
|
||||
|
||||
|
||||
static void
|
||||
joystick_log(const char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
|
||||
if (joystick_do_log) {
|
||||
va_start(ap, fmt);
|
||||
pclog_ex(fmt, ap);
|
||||
va_end(ap);
|
||||
va_start(ap, fmt);
|
||||
pclog_ex(fmt, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
}
|
||||
#else
|
||||
#define joystick_log(fmt, ...)
|
||||
# define joystick_log(fmt, ...)
|
||||
#endif
|
||||
|
||||
plat_joystick_t plat_joystick_state[MAX_PLAT_JOYSTICKS];
|
||||
joystick_t joystick_state[MAX_JOYSTICKS];
|
||||
int joysticks_present = 0;
|
||||
joystick_t joystick_state[MAX_JOYSTICKS];
|
||||
int joysticks_present = 0;
|
||||
|
||||
XINPUT_STATE controllers[XINPUT_MAX_JOYSTICKS];
|
||||
|
||||
void joystick_init()
|
||||
void
|
||||
joystick_init()
|
||||
{
|
||||
int c;
|
||||
int c;
|
||||
|
||||
atexit(joystick_close);
|
||||
atexit(joystick_close);
|
||||
|
||||
joysticks_present = 0;
|
||||
joysticks_present = 0;
|
||||
|
||||
memset(controllers, 0, sizeof(XINPUT_STATE) * XINPUT_MAX_JOYSTICKS);
|
||||
memset(controllers, 0, sizeof(XINPUT_STATE) * XINPUT_MAX_JOYSTICKS);
|
||||
|
||||
for (c=0; c<XINPUT_MAX_JOYSTICKS; c++) {
|
||||
int value = XInputGetState(c, &controllers[c]);
|
||||
if (value != ERROR_SUCCESS) continue;
|
||||
memcpy(plat_joystick_state[c].name, XINPUT_NAME, sizeof(XINPUT_NAME));
|
||||
for (c = 0; c < XINPUT_MAX_JOYSTICKS; c++) {
|
||||
int value = XInputGetState(c, &controllers[c]);
|
||||
if (value != ERROR_SUCCESS)
|
||||
continue;
|
||||
memcpy(plat_joystick_state[c].name, XINPUT_NAME, sizeof(XINPUT_NAME));
|
||||
|
||||
plat_joystick_state[c].nr_axes = 8;
|
||||
plat_joystick_state[c].nr_axes = 8;
|
||||
|
||||
/* analog stick */
|
||||
memcpy(plat_joystick_state[c].axis[0].name, XINPUT_NAME_LX, sizeof(XINPUT_NAME_LX));
|
||||
plat_joystick_state[c].axis[0].id = 0; /* X axis */
|
||||
memcpy(plat_joystick_state[c].axis[1].name, XINPUT_NAME_LY, sizeof(XINPUT_NAME_LY));
|
||||
plat_joystick_state[c].axis[1].id = 1; /* Y axis */
|
||||
memcpy(plat_joystick_state[c].axis[2].name, XINPUT_NAME_RX, sizeof(XINPUT_NAME_RX));
|
||||
plat_joystick_state[c].axis[2].id = 3; /* RX axis */
|
||||
memcpy(plat_joystick_state[c].axis[3].name, XINPUT_NAME_RY, sizeof(XINPUT_NAME_RY));
|
||||
plat_joystick_state[c].axis[3].id = 4; /* RY axis */
|
||||
/* analog stick */
|
||||
memcpy(plat_joystick_state[c].axis[0].name, XINPUT_NAME_LX, sizeof(XINPUT_NAME_LX));
|
||||
plat_joystick_state[c].axis[0].id = 0; /* X axis */
|
||||
memcpy(plat_joystick_state[c].axis[1].name, XINPUT_NAME_LY, sizeof(XINPUT_NAME_LY));
|
||||
plat_joystick_state[c].axis[1].id = 1; /* Y axis */
|
||||
memcpy(plat_joystick_state[c].axis[2].name, XINPUT_NAME_RX, sizeof(XINPUT_NAME_RX));
|
||||
plat_joystick_state[c].axis[2].id = 3; /* RX axis */
|
||||
memcpy(plat_joystick_state[c].axis[3].name, XINPUT_NAME_RY, sizeof(XINPUT_NAME_RY));
|
||||
plat_joystick_state[c].axis[3].id = 4; /* RY axis */
|
||||
|
||||
/* d-pad, assigned to Z and RZ */
|
||||
memcpy(plat_joystick_state[c].axis[4].name, XINPUT_NAME_DPAD_X, sizeof(XINPUT_NAME_DPAD_X));
|
||||
plat_joystick_state[c].axis[4].id = 2;
|
||||
memcpy(plat_joystick_state[c].axis[5].name, XINPUT_NAME_DPAD_Y, sizeof(XINPUT_NAME_DPAD_Y));
|
||||
plat_joystick_state[c].axis[5].id = 5;
|
||||
/* d-pad, assigned to Z and RZ */
|
||||
memcpy(plat_joystick_state[c].axis[4].name, XINPUT_NAME_DPAD_X, sizeof(XINPUT_NAME_DPAD_X));
|
||||
plat_joystick_state[c].axis[4].id = 2;
|
||||
memcpy(plat_joystick_state[c].axis[5].name, XINPUT_NAME_DPAD_Y, sizeof(XINPUT_NAME_DPAD_Y));
|
||||
plat_joystick_state[c].axis[5].id = 5;
|
||||
|
||||
/* Analog trigger */
|
||||
memcpy(plat_joystick_state[c].axis[6].name, XINPUT_NAME_LT, sizeof(XINPUT_NAME_LT));
|
||||
plat_joystick_state[c].axis[6].id = 6;
|
||||
memcpy(plat_joystick_state[c].axis[7].name, XINPUT_NAME_RT, sizeof(XINPUT_NAME_RT));
|
||||
plat_joystick_state[c].axis[7].id = 7;
|
||||
/* Analog trigger */
|
||||
memcpy(plat_joystick_state[c].axis[6].name, XINPUT_NAME_LT, sizeof(XINPUT_NAME_LT));
|
||||
plat_joystick_state[c].axis[6].id = 6;
|
||||
memcpy(plat_joystick_state[c].axis[7].name, XINPUT_NAME_RT, sizeof(XINPUT_NAME_RT));
|
||||
plat_joystick_state[c].axis[7].id = 7;
|
||||
|
||||
plat_joystick_state[c].nr_buttons = 12;
|
||||
memcpy(plat_joystick_state[c].button[0].name, XINPUT_NAME_A, sizeof(XINPUT_NAME_A));
|
||||
memcpy(plat_joystick_state[c].button[1].name, XINPUT_NAME_B, sizeof(XINPUT_NAME_B));
|
||||
memcpy(plat_joystick_state[c].button[2].name, XINPUT_NAME_X, sizeof(XINPUT_NAME_X));
|
||||
memcpy(plat_joystick_state[c].button[3].name, XINPUT_NAME_Y, sizeof(XINPUT_NAME_Y));
|
||||
memcpy(plat_joystick_state[c].button[4].name, XINPUT_NAME_LB, sizeof(XINPUT_NAME_LB));
|
||||
memcpy(plat_joystick_state[c].button[5].name, XINPUT_NAME_RB, sizeof(XINPUT_NAME_RB));
|
||||
memcpy(plat_joystick_state[c].button[6].name, XINPUT_NAME_LT, sizeof(XINPUT_NAME_LT));
|
||||
memcpy(plat_joystick_state[c].button[7].name, XINPUT_NAME_RT, sizeof(XINPUT_NAME_RT));
|
||||
memcpy(plat_joystick_state[c].button[8].name, XINPUT_NAME_BACK, sizeof(XINPUT_NAME_BACK));
|
||||
memcpy(plat_joystick_state[c].button[9].name, XINPUT_NAME_START, sizeof(XINPUT_NAME_START));
|
||||
memcpy(plat_joystick_state[c].button[10].name, XINPUT_NAME_LS, sizeof(XINPUT_NAME_LS));
|
||||
memcpy(plat_joystick_state[c].button[11].name, XINPUT_NAME_RS, sizeof(XINPUT_NAME_RS));
|
||||
plat_joystick_state[c].nr_buttons = 12;
|
||||
memcpy(plat_joystick_state[c].button[0].name, XINPUT_NAME_A, sizeof(XINPUT_NAME_A));
|
||||
memcpy(plat_joystick_state[c].button[1].name, XINPUT_NAME_B, sizeof(XINPUT_NAME_B));
|
||||
memcpy(plat_joystick_state[c].button[2].name, XINPUT_NAME_X, sizeof(XINPUT_NAME_X));
|
||||
memcpy(plat_joystick_state[c].button[3].name, XINPUT_NAME_Y, sizeof(XINPUT_NAME_Y));
|
||||
memcpy(plat_joystick_state[c].button[4].name, XINPUT_NAME_LB, sizeof(XINPUT_NAME_LB));
|
||||
memcpy(plat_joystick_state[c].button[5].name, XINPUT_NAME_RB, sizeof(XINPUT_NAME_RB));
|
||||
memcpy(plat_joystick_state[c].button[6].name, XINPUT_NAME_LT, sizeof(XINPUT_NAME_LT));
|
||||
memcpy(plat_joystick_state[c].button[7].name, XINPUT_NAME_RT, sizeof(XINPUT_NAME_RT));
|
||||
memcpy(plat_joystick_state[c].button[8].name, XINPUT_NAME_BACK, sizeof(XINPUT_NAME_BACK));
|
||||
memcpy(plat_joystick_state[c].button[9].name, XINPUT_NAME_START, sizeof(XINPUT_NAME_START));
|
||||
memcpy(plat_joystick_state[c].button[10].name, XINPUT_NAME_LS, sizeof(XINPUT_NAME_LS));
|
||||
memcpy(plat_joystick_state[c].button[11].name, XINPUT_NAME_RS, sizeof(XINPUT_NAME_RS));
|
||||
|
||||
plat_joystick_state[c].nr_povs = 0;
|
||||
plat_joystick_state[c].nr_povs = 0;
|
||||
|
||||
joysticks_present++;
|
||||
}
|
||||
joystick_log("joystick_init: joysticks_present=%i\n", joysticks_present);
|
||||
joysticks_present++;
|
||||
}
|
||||
joystick_log("joystick_init: joysticks_present=%i\n", joysticks_present);
|
||||
}
|
||||
|
||||
void joystick_close()
|
||||
void
|
||||
joystick_close()
|
||||
{
|
||||
}
|
||||
|
||||
void joystick_poll(void)
|
||||
void
|
||||
joystick_poll(void)
|
||||
{
|
||||
for (int c=0; c<joysticks_present; c++) {
|
||||
int value = XInputGetState(c, &controllers[c]);
|
||||
if (value != ERROR_SUCCESS) continue;
|
||||
for (int c = 0; c < joysticks_present; c++) {
|
||||
int value = XInputGetState(c, &controllers[c]);
|
||||
if (value != ERROR_SUCCESS)
|
||||
continue;
|
||||
|
||||
plat_joystick_state[c].a[0] = controllers[c].Gamepad.sThumbLX;
|
||||
plat_joystick_state[c].a[1] = - controllers[c].Gamepad.sThumbLY;
|
||||
plat_joystick_state[c].a[3] = controllers[c].Gamepad.sThumbRX;
|
||||
plat_joystick_state[c].a[4] = - controllers[c].Gamepad.sThumbRY;
|
||||
plat_joystick_state[c].a[6] = (double)controllers[c].Gamepad.bLeftTrigger / 255 * 32767;
|
||||
plat_joystick_state[c].a[7] = (double)controllers[c].Gamepad.bRightTrigger / 255 * 32767;
|
||||
plat_joystick_state[c].a[0] = controllers[c].Gamepad.sThumbLX;
|
||||
plat_joystick_state[c].a[1] = -controllers[c].Gamepad.sThumbLY;
|
||||
plat_joystick_state[c].a[3] = controllers[c].Gamepad.sThumbRX;
|
||||
plat_joystick_state[c].a[4] = -controllers[c].Gamepad.sThumbRY;
|
||||
plat_joystick_state[c].a[6] = (double) controllers[c].Gamepad.bLeftTrigger / 255 * 32767;
|
||||
plat_joystick_state[c].a[7] = (double) controllers[c].Gamepad.bRightTrigger / 255 * 32767;
|
||||
|
||||
plat_joystick_state[c].b[0] = (controllers[c].Gamepad.wButtons & XINPUT_GAMEPAD_A) ? 128 : 0;
|
||||
plat_joystick_state[c].b[1] = (controllers[c].Gamepad.wButtons & XINPUT_GAMEPAD_B) ? 128 : 0;
|
||||
plat_joystick_state[c].b[2] = (controllers[c].Gamepad.wButtons & XINPUT_GAMEPAD_X) ? 128 : 0;
|
||||
plat_joystick_state[c].b[3] = (controllers[c].Gamepad.wButtons & XINPUT_GAMEPAD_Y) ? 128 : 0;
|
||||
plat_joystick_state[c].b[4] = (controllers[c].Gamepad.wButtons & XINPUT_GAMEPAD_LEFT_SHOULDER) ? 128 : 0;
|
||||
plat_joystick_state[c].b[5] = (controllers[c].Gamepad.wButtons & XINPUT_GAMEPAD_RIGHT_SHOULDER) ? 128 : 0;
|
||||
plat_joystick_state[c].b[6] = (controllers[c].Gamepad.bLeftTrigger > 127) ? 128 : 0;
|
||||
plat_joystick_state[c].b[7] = (controllers[c].Gamepad.bRightTrigger > 127) ? 128 : 0;
|
||||
plat_joystick_state[c].b[8] = (controllers[c].Gamepad.wButtons & XINPUT_GAMEPAD_BACK) ? 128 : 0;
|
||||
plat_joystick_state[c].b[9] = (controllers[c].Gamepad.wButtons & XINPUT_GAMEPAD_START) ? 128 : 0;
|
||||
plat_joystick_state[c].b[10] = (controllers[c].Gamepad.wButtons & XINPUT_GAMEPAD_LEFT_THUMB) ? 128 : 0;
|
||||
plat_joystick_state[c].b[11] = (controllers[c].Gamepad.wButtons & XINPUT_GAMEPAD_RIGHT_THUMB) ? 128 : 0;
|
||||
plat_joystick_state[c].b[0] = (controllers[c].Gamepad.wButtons & XINPUT_GAMEPAD_A) ? 128 : 0;
|
||||
plat_joystick_state[c].b[1] = (controllers[c].Gamepad.wButtons & XINPUT_GAMEPAD_B) ? 128 : 0;
|
||||
plat_joystick_state[c].b[2] = (controllers[c].Gamepad.wButtons & XINPUT_GAMEPAD_X) ? 128 : 0;
|
||||
plat_joystick_state[c].b[3] = (controllers[c].Gamepad.wButtons & XINPUT_GAMEPAD_Y) ? 128 : 0;
|
||||
plat_joystick_state[c].b[4] = (controllers[c].Gamepad.wButtons & XINPUT_GAMEPAD_LEFT_SHOULDER) ? 128 : 0;
|
||||
plat_joystick_state[c].b[5] = (controllers[c].Gamepad.wButtons & XINPUT_GAMEPAD_RIGHT_SHOULDER) ? 128 : 0;
|
||||
plat_joystick_state[c].b[6] = (controllers[c].Gamepad.bLeftTrigger > 127) ? 128 : 0;
|
||||
plat_joystick_state[c].b[7] = (controllers[c].Gamepad.bRightTrigger > 127) ? 128 : 0;
|
||||
plat_joystick_state[c].b[8] = (controllers[c].Gamepad.wButtons & XINPUT_GAMEPAD_BACK) ? 128 : 0;
|
||||
plat_joystick_state[c].b[9] = (controllers[c].Gamepad.wButtons & XINPUT_GAMEPAD_START) ? 128 : 0;
|
||||
plat_joystick_state[c].b[10] = (controllers[c].Gamepad.wButtons & XINPUT_GAMEPAD_LEFT_THUMB) ? 128 : 0;
|
||||
plat_joystick_state[c].b[11] = (controllers[c].Gamepad.wButtons & XINPUT_GAMEPAD_RIGHT_THUMB) ? 128 : 0;
|
||||
|
||||
int dpad_x = 0, dpad_y = 0;
|
||||
if (controllers[c].Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_UP)
|
||||
dpad_y-=32767;
|
||||
if (controllers[c].Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_DOWN)
|
||||
dpad_y+=32767;
|
||||
if (controllers[c].Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_LEFT)
|
||||
dpad_x-=32767;
|
||||
if (controllers[c].Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_RIGHT)
|
||||
dpad_x+=32767;
|
||||
int dpad_x = 0, dpad_y = 0;
|
||||
if (controllers[c].Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_UP)
|
||||
dpad_y -= 32767;
|
||||
if (controllers[c].Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_DOWN)
|
||||
dpad_y += 32767;
|
||||
if (controllers[c].Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_LEFT)
|
||||
dpad_x -= 32767;
|
||||
if (controllers[c].Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_RIGHT)
|
||||
dpad_x += 32767;
|
||||
|
||||
plat_joystick_state[c].a[2] = dpad_x;
|
||||
plat_joystick_state[c].a[5] = dpad_y;
|
||||
plat_joystick_state[c].a[2] = dpad_x;
|
||||
plat_joystick_state[c].a[5] = dpad_y;
|
||||
|
||||
for (int a=0; a<8; a++) {
|
||||
if (plat_joystick_state[c].a[a] == -32768)
|
||||
plat_joystick_state[c].a[a] = -32767;
|
||||
if (plat_joystick_state[c].a[a] == 32768)
|
||||
plat_joystick_state[c].a[a] = 32767;
|
||||
}
|
||||
for (int a = 0; a < 8; a++) {
|
||||
if (plat_joystick_state[c].a[a] == -32768)
|
||||
plat_joystick_state[c].a[a] = -32767;
|
||||
if (plat_joystick_state[c].a[a] == 32768)
|
||||
plat_joystick_state[c].a[a] = 32767;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static int joystick_get_axis(int joystick_nr, int mapping)
|
||||
static int
|
||||
joystick_get_axis(int joystick_nr, int mapping)
|
||||
{
|
||||
if (mapping & POV_X)
|
||||
{
|
||||
int pov = plat_joystick_state[joystick_nr].p[mapping & 3];
|
||||
if (mapping & POV_X) {
|
||||
int pov = plat_joystick_state[joystick_nr].p[mapping & 3];
|
||||
|
||||
if (LOWORD(pov) == 0xFFFF)
|
||||
return 0;
|
||||
else
|
||||
return sin((2*M_PI * (double)pov) / 36000.0) * 32767;
|
||||
}
|
||||
else if (mapping & POV_Y)
|
||||
{
|
||||
int pov = plat_joystick_state[joystick_nr].p[mapping & 3];
|
||||
|
||||
if (LOWORD(pov) == 0xFFFF)
|
||||
return 0;
|
||||
else
|
||||
return -cos((2*M_PI * (double)pov) / 36000.0) * 32767;
|
||||
}
|
||||
if (LOWORD(pov) == 0xFFFF)
|
||||
return 0;
|
||||
else
|
||||
return plat_joystick_state[joystick_nr].a[plat_joystick_state[joystick_nr].axis[mapping].id];
|
||||
return sin((2 * M_PI * (double) pov) / 36000.0) * 32767;
|
||||
} else if (mapping & POV_Y) {
|
||||
int pov = plat_joystick_state[joystick_nr].p[mapping & 3];
|
||||
|
||||
if (LOWORD(pov) == 0xFFFF)
|
||||
return 0;
|
||||
else
|
||||
return -cos((2 * M_PI * (double) pov) / 36000.0) * 32767;
|
||||
} else
|
||||
return plat_joystick_state[joystick_nr].a[plat_joystick_state[joystick_nr].axis[mapping].id];
|
||||
}
|
||||
|
||||
void joystick_process(void)
|
||||
void
|
||||
joystick_process(void)
|
||||
{
|
||||
int c, d;
|
||||
int c, d;
|
||||
|
||||
if (!joystick_type) return;
|
||||
if (!joystick_type)
|
||||
return;
|
||||
|
||||
joystick_poll();
|
||||
joystick_poll();
|
||||
|
||||
for (c = 0; c < joystick_get_max_joysticks(joystick_type); c++)
|
||||
{
|
||||
if (joystick_state[c].plat_joystick_nr)
|
||||
{
|
||||
int joystick_nr = joystick_state[c].plat_joystick_nr - 1;
|
||||
for (c = 0; c < joystick_get_max_joysticks(joystick_type); c++) {
|
||||
if (joystick_state[c].plat_joystick_nr) {
|
||||
int joystick_nr = joystick_state[c].plat_joystick_nr - 1;
|
||||
|
||||
for (d = 0; d < joystick_get_axis_count(joystick_type); d++)
|
||||
joystick_state[c].axis[d] = joystick_get_axis(joystick_nr, joystick_state[c].axis_mapping[d]);
|
||||
for (d = 0; d < joystick_get_button_count(joystick_type); d++)
|
||||
joystick_state[c].button[d] = plat_joystick_state[joystick_nr].b[joystick_state[c].button_mapping[d]];
|
||||
for (d = 0; d < joystick_get_axis_count(joystick_type); d++)
|
||||
joystick_state[c].axis[d] = joystick_get_axis(joystick_nr, joystick_state[c].axis_mapping[d]);
|
||||
for (d = 0; d < joystick_get_button_count(joystick_type); d++)
|
||||
joystick_state[c].button[d] = plat_joystick_state[joystick_nr].b[joystick_state[c].button_mapping[d]];
|
||||
|
||||
for (d = 0; d < joystick_get_pov_count(joystick_type); d++)
|
||||
{
|
||||
int x, y;
|
||||
double angle, magnitude;
|
||||
for (d = 0; d < joystick_get_pov_count(joystick_type); d++) {
|
||||
int x, y;
|
||||
double angle, magnitude;
|
||||
|
||||
x = joystick_get_axis(joystick_nr, joystick_state[c].pov_mapping[d][0]);
|
||||
y = joystick_get_axis(joystick_nr, joystick_state[c].pov_mapping[d][1]);
|
||||
x = joystick_get_axis(joystick_nr, joystick_state[c].pov_mapping[d][0]);
|
||||
y = joystick_get_axis(joystick_nr, joystick_state[c].pov_mapping[d][1]);
|
||||
|
||||
angle = (atan2((double)y, (double)x) * 360.0) / (2*M_PI);
|
||||
magnitude = sqrt((double)x*(double)x + (double)y*(double)y);
|
||||
angle = (atan2((double) y, (double) x) * 360.0) / (2 * M_PI);
|
||||
magnitude = sqrt((double) x * (double) x + (double) y * (double) y);
|
||||
|
||||
if (magnitude < 16384)
|
||||
joystick_state[c].pov[d] = -1;
|
||||
else
|
||||
joystick_state[c].pov[d] = ((int)angle + 90 + 360) % 360;
|
||||
}
|
||||
}
|
||||
if (magnitude < 16384)
|
||||
joystick_state[c].pov[d] = -1;
|
||||
else
|
||||
{
|
||||
for (d = 0; d < joystick_get_axis_count(joystick_type); d++)
|
||||
joystick_state[c].axis[d] = 0;
|
||||
for (d = 0; d < joystick_get_button_count(joystick_type); d++)
|
||||
joystick_state[c].button[d] = 0;
|
||||
for (d = 0; d < joystick_get_pov_count(joystick_type); d++)
|
||||
joystick_state[c].pov[d] = -1;
|
||||
}
|
||||
joystick_state[c].pov[d] = ((int) angle + 90 + 360) % 360;
|
||||
}
|
||||
} else {
|
||||
for (d = 0; d < joystick_get_axis_count(joystick_type); d++)
|
||||
joystick_state[c].axis[d] = 0;
|
||||
for (d = 0; d < joystick_get_button_count(joystick_type); d++)
|
||||
joystick_state[c].button[d] = 0;
|
||||
for (d = 0; d < joystick_get_pov_count(joystick_type); d++)
|
||||
joystick_state[c].pov[d] = -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void win_joystick_handle(PRAWINPUT raw) {}
|
||||
void
|
||||
win_joystick_handle(PRAWINPUT raw)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -14,151 +14,134 @@
|
||||
#include <86box/plat.h>
|
||||
#include <86box/win.h>
|
||||
|
||||
|
||||
static int joystick_nr;
|
||||
static int joystick_config_type;
|
||||
#define AXIS_STRINGS_MAX 3
|
||||
static char *axis_strings[AXIS_STRINGS_MAX] = {"X Axis", "Y Axis", "Z Axis"};
|
||||
static char *axis_strings[AXIS_STRINGS_MAX] = { "X Axis", "Y Axis", "Z Axis" };
|
||||
|
||||
static uint8_t joystickconfig_changed = 0;
|
||||
|
||||
|
||||
static void rebuild_axis_button_selections(HWND hdlg)
|
||||
static void
|
||||
rebuild_axis_button_selections(HWND hdlg)
|
||||
{
|
||||
int id = IDC_CONFIG_BASE + 2;
|
||||
HWND h;
|
||||
int joystick;
|
||||
int c, d;
|
||||
char s[269];
|
||||
int id = IDC_CONFIG_BASE + 2;
|
||||
HWND h;
|
||||
int joystick;
|
||||
int c, d;
|
||||
char s[269];
|
||||
|
||||
h = GetDlgItem(hdlg, IDC_CONFIG_BASE);
|
||||
joystick = SendMessage(h, CB_GETCURSEL, 0, 0);
|
||||
h = GetDlgItem(hdlg, IDC_CONFIG_BASE);
|
||||
joystick = SendMessage(h, CB_GETCURSEL, 0, 0);
|
||||
|
||||
for (c = 0; c < joystick_get_axis_count(joystick_config_type); c++)
|
||||
{
|
||||
int sel = c;
|
||||
for (c = 0; c < joystick_get_axis_count(joystick_config_type); c++) {
|
||||
int sel = c;
|
||||
|
||||
h = GetDlgItem(hdlg, id);
|
||||
SendMessage(h, CB_RESETCONTENT, 0, 0);
|
||||
h = GetDlgItem(hdlg, id);
|
||||
SendMessage(h, CB_RESETCONTENT, 0, 0);
|
||||
|
||||
if (joystick)
|
||||
{
|
||||
for (d = 0; d < plat_joystick_state[joystick-1].nr_axes; d++)
|
||||
{
|
||||
SendMessage(h, CB_ADDSTRING, 0, (LPARAM)(LPCSTR)plat_joystick_state[joystick-1].axis[d].name);
|
||||
if (c < AXIS_STRINGS_MAX)
|
||||
{
|
||||
if (!stricmp(axis_strings[c], plat_joystick_state[joystick-1].axis[d].name))
|
||||
sel = d;
|
||||
}
|
||||
}
|
||||
for (d = 0; d < plat_joystick_state[joystick-1].nr_povs; d++)
|
||||
{
|
||||
sprintf(s, "%s (X axis)", plat_joystick_state[joystick-1].pov[d].name);
|
||||
SendMessage(h, CB_ADDSTRING, 0, (LPARAM)(LPCSTR)s);
|
||||
sprintf(s, "%s (Y axis)", plat_joystick_state[joystick-1].pov[d].name);
|
||||
SendMessage(h, CB_ADDSTRING, 0, (LPARAM)(LPCSTR)s);
|
||||
}
|
||||
for (d = 0; d < plat_joystick_state[joystick - 1].nr_sliders; d++)
|
||||
{
|
||||
SendMessage(h, CB_ADDSTRING, 0, (LPARAM)(LPCSTR)plat_joystick_state[joystick - 1].slider[d].name);
|
||||
}
|
||||
SendMessage(h, CB_SETCURSEL, sel, 0);
|
||||
EnableWindow(h, TRUE);
|
||||
if (joystick) {
|
||||
for (d = 0; d < plat_joystick_state[joystick - 1].nr_axes; d++) {
|
||||
SendMessage(h, CB_ADDSTRING, 0, (LPARAM) (LPCSTR) plat_joystick_state[joystick - 1].axis[d].name);
|
||||
if (c < AXIS_STRINGS_MAX) {
|
||||
if (!stricmp(axis_strings[c], plat_joystick_state[joystick - 1].axis[d].name))
|
||||
sel = d;
|
||||
}
|
||||
else
|
||||
EnableWindow(h, FALSE);
|
||||
}
|
||||
for (d = 0; d < plat_joystick_state[joystick - 1].nr_povs; d++) {
|
||||
sprintf(s, "%s (X axis)", plat_joystick_state[joystick - 1].pov[d].name);
|
||||
SendMessage(h, CB_ADDSTRING, 0, (LPARAM) (LPCSTR) s);
|
||||
sprintf(s, "%s (Y axis)", plat_joystick_state[joystick - 1].pov[d].name);
|
||||
SendMessage(h, CB_ADDSTRING, 0, (LPARAM) (LPCSTR) s);
|
||||
}
|
||||
for (d = 0; d < plat_joystick_state[joystick - 1].nr_sliders; d++) {
|
||||
SendMessage(h, CB_ADDSTRING, 0, (LPARAM) (LPCSTR) plat_joystick_state[joystick - 1].slider[d].name);
|
||||
}
|
||||
SendMessage(h, CB_SETCURSEL, sel, 0);
|
||||
EnableWindow(h, TRUE);
|
||||
} else
|
||||
EnableWindow(h, FALSE);
|
||||
|
||||
id += 2;
|
||||
}
|
||||
id += 2;
|
||||
}
|
||||
|
||||
for (c = 0; c < joystick_get_button_count(joystick_config_type); c++)
|
||||
{
|
||||
h = GetDlgItem(hdlg, id);
|
||||
SendMessage(h, CB_RESETCONTENT, 0, 0);
|
||||
for (c = 0; c < joystick_get_button_count(joystick_config_type); c++) {
|
||||
h = GetDlgItem(hdlg, id);
|
||||
SendMessage(h, CB_RESETCONTENT, 0, 0);
|
||||
|
||||
if (joystick)
|
||||
{
|
||||
for (d = 0; d < plat_joystick_state[joystick-1].nr_buttons; d++)
|
||||
SendMessage(h, CB_ADDSTRING, 0, (LPARAM)(LPCSTR)plat_joystick_state[joystick-1].button[d].name);
|
||||
SendMessage(h, CB_SETCURSEL, c, 0);
|
||||
EnableWindow(h, TRUE);
|
||||
}
|
||||
else
|
||||
EnableWindow(h, FALSE);
|
||||
if (joystick) {
|
||||
for (d = 0; d < plat_joystick_state[joystick - 1].nr_buttons; d++)
|
||||
SendMessage(h, CB_ADDSTRING, 0, (LPARAM) (LPCSTR) plat_joystick_state[joystick - 1].button[d].name);
|
||||
SendMessage(h, CB_SETCURSEL, c, 0);
|
||||
EnableWindow(h, TRUE);
|
||||
} else
|
||||
EnableWindow(h, FALSE);
|
||||
|
||||
id += 2;
|
||||
}
|
||||
id += 2;
|
||||
}
|
||||
|
||||
for (c = 0; c < joystick_get_pov_count(joystick_config_type)*2; c++)
|
||||
{
|
||||
int sel = c;
|
||||
for (c = 0; c < joystick_get_pov_count(joystick_config_type) * 2; c++) {
|
||||
int sel = c;
|
||||
|
||||
h = GetDlgItem(hdlg, id);
|
||||
SendMessage(h, CB_RESETCONTENT, 0, 0);
|
||||
h = GetDlgItem(hdlg, id);
|
||||
SendMessage(h, CB_RESETCONTENT, 0, 0);
|
||||
|
||||
if (joystick)
|
||||
{
|
||||
for (d = 0; d < plat_joystick_state[joystick-1].nr_povs; d++)
|
||||
{
|
||||
sprintf(s, "%s (X axis)", plat_joystick_state[joystick-1].pov[d].name);
|
||||
SendMessage(h, CB_ADDSTRING, 0, (LPARAM)(LPCSTR)s);
|
||||
sprintf(s, "%s (Y axis)", plat_joystick_state[joystick-1].pov[d].name);
|
||||
SendMessage(h, CB_ADDSTRING, 0, (LPARAM)(LPCSTR)s);
|
||||
}
|
||||
for (d = 0; d < plat_joystick_state[joystick-1].nr_axes; d++)
|
||||
{
|
||||
SendMessage(h, CB_ADDSTRING, 0, (LPARAM)(LPCSTR)plat_joystick_state[joystick-1].axis[d].name);
|
||||
}
|
||||
SendMessage(h, CB_SETCURSEL, sel, 0);
|
||||
EnableWindow(h, TRUE);
|
||||
}
|
||||
else
|
||||
EnableWindow(h, FALSE);
|
||||
|
||||
id += 2;
|
||||
}
|
||||
if (joystick) {
|
||||
for (d = 0; d < plat_joystick_state[joystick - 1].nr_povs; d++) {
|
||||
sprintf(s, "%s (X axis)", plat_joystick_state[joystick - 1].pov[d].name);
|
||||
SendMessage(h, CB_ADDSTRING, 0, (LPARAM) (LPCSTR) s);
|
||||
sprintf(s, "%s (Y axis)", plat_joystick_state[joystick - 1].pov[d].name);
|
||||
SendMessage(h, CB_ADDSTRING, 0, (LPARAM) (LPCSTR) s);
|
||||
}
|
||||
for (d = 0; d < plat_joystick_state[joystick - 1].nr_axes; d++) {
|
||||
SendMessage(h, CB_ADDSTRING, 0, (LPARAM) (LPCSTR) plat_joystick_state[joystick - 1].axis[d].name);
|
||||
}
|
||||
SendMessage(h, CB_SETCURSEL, sel, 0);
|
||||
EnableWindow(h, TRUE);
|
||||
} else
|
||||
EnableWindow(h, FALSE);
|
||||
|
||||
id += 2;
|
||||
}
|
||||
}
|
||||
|
||||
static int get_axis(HWND hdlg, int id)
|
||||
static int
|
||||
get_axis(HWND hdlg, int id)
|
||||
{
|
||||
HWND h = GetDlgItem(hdlg, id);
|
||||
int axis_sel = SendMessage(h, CB_GETCURSEL, 0, 0);
|
||||
int nr_axes = plat_joystick_state[joystick_state[joystick_nr].plat_joystick_nr-1].nr_axes;
|
||||
int nr_povs = plat_joystick_state[joystick_state[joystick_nr].plat_joystick_nr - 1].nr_povs;
|
||||
HWND h = GetDlgItem(hdlg, id);
|
||||
int axis_sel = SendMessage(h, CB_GETCURSEL, 0, 0);
|
||||
int nr_axes = plat_joystick_state[joystick_state[joystick_nr].plat_joystick_nr - 1].nr_axes;
|
||||
int nr_povs = plat_joystick_state[joystick_state[joystick_nr].plat_joystick_nr - 1].nr_povs;
|
||||
|
||||
if (axis_sel < nr_axes)
|
||||
return axis_sel;
|
||||
if (axis_sel < nr_axes)
|
||||
return axis_sel;
|
||||
|
||||
axis_sel -= nr_axes;
|
||||
if (axis_sel < nr_povs * 2)
|
||||
{
|
||||
if (axis_sel & 1)
|
||||
return POV_Y | (axis_sel >> 1);
|
||||
else
|
||||
return POV_X | (axis_sel >> 1);
|
||||
}
|
||||
axis_sel -= nr_povs;
|
||||
axis_sel -= nr_axes;
|
||||
if (axis_sel < nr_povs * 2) {
|
||||
if (axis_sel & 1)
|
||||
return POV_Y | (axis_sel >> 1);
|
||||
else
|
||||
return POV_X | (axis_sel >> 1);
|
||||
}
|
||||
axis_sel -= nr_povs;
|
||||
|
||||
return SLIDER | (axis_sel >> 1);
|
||||
return SLIDER | (axis_sel >> 1);
|
||||
}
|
||||
|
||||
static int get_pov(HWND hdlg, int id)
|
||||
static int
|
||||
get_pov(HWND hdlg, int id)
|
||||
{
|
||||
HWND h = GetDlgItem(hdlg, id);
|
||||
int axis_sel = SendMessage(h, CB_GETCURSEL, 0, 0);
|
||||
int nr_povs = plat_joystick_state[joystick_state[joystick_nr].plat_joystick_nr-1].nr_povs*2;
|
||||
HWND h = GetDlgItem(hdlg, id);
|
||||
int axis_sel = SendMessage(h, CB_GETCURSEL, 0, 0);
|
||||
int nr_povs = plat_joystick_state[joystick_state[joystick_nr].plat_joystick_nr - 1].nr_povs * 2;
|
||||
|
||||
if (axis_sel < nr_povs)
|
||||
{
|
||||
if (axis_sel & 1)
|
||||
return POV_Y | (axis_sel >> 1);
|
||||
else
|
||||
return POV_X | (axis_sel >> 1);
|
||||
}
|
||||
if (axis_sel < nr_povs) {
|
||||
if (axis_sel & 1)
|
||||
return POV_Y | (axis_sel >> 1);
|
||||
else
|
||||
return POV_X | (axis_sel >> 1);
|
||||
}
|
||||
|
||||
return axis_sel - nr_povs;
|
||||
return axis_sel - nr_povs;
|
||||
}
|
||||
|
||||
#if defined(__amd64__) || defined(__aarch64__)
|
||||
@@ -168,175 +151,210 @@ static BOOL CALLBACK
|
||||
#endif
|
||||
joystickconfig_dlgproc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
HWND h;
|
||||
int c;
|
||||
int id;
|
||||
int joystick;
|
||||
int nr_axes;
|
||||
int nr_povs;
|
||||
int mapping;
|
||||
HWND h;
|
||||
int c;
|
||||
int id;
|
||||
int joystick;
|
||||
int nr_axes;
|
||||
int nr_povs;
|
||||
int mapping;
|
||||
|
||||
switch (message)
|
||||
{
|
||||
case WM_INITDIALOG:
|
||||
{
|
||||
h = GetDlgItem(hdlg, IDC_CONFIG_BASE);
|
||||
id = IDC_CONFIG_BASE + 2;
|
||||
joystick = joystick_state[joystick_nr].plat_joystick_nr;
|
||||
switch (message) {
|
||||
case WM_INITDIALOG:
|
||||
{
|
||||
h = GetDlgItem(hdlg, IDC_CONFIG_BASE);
|
||||
id = IDC_CONFIG_BASE + 2;
|
||||
joystick = joystick_state[joystick_nr].plat_joystick_nr;
|
||||
|
||||
SendMessage(h, CB_ADDSTRING, 0, (LPARAM)(LPCSTR)"None");
|
||||
SendMessage(h, CB_ADDSTRING, 0, (LPARAM) (LPCSTR) "None");
|
||||
|
||||
for (c = 0; c < joysticks_present; c++)
|
||||
SendMessage(h, CB_ADDSTRING, 0, (LPARAM)(LPCSTR)plat_joystick_state[c].name);
|
||||
for (c = 0; c < joysticks_present; c++)
|
||||
SendMessage(h, CB_ADDSTRING, 0, (LPARAM) (LPCSTR) plat_joystick_state[c].name);
|
||||
|
||||
SendMessage(h, CB_SETCURSEL, joystick, 0);
|
||||
SendMessage(h, CB_SETCURSEL, joystick, 0);
|
||||
|
||||
rebuild_axis_button_selections(hdlg);
|
||||
|
||||
if (joystick_state[joystick_nr].plat_joystick_nr) {
|
||||
nr_axes = plat_joystick_state[joystick - 1].nr_axes;
|
||||
nr_povs = plat_joystick_state[joystick - 1].nr_povs;
|
||||
|
||||
for (c = 0; c < joystick_get_axis_count(joystick_config_type); c++) {
|
||||
int mapping = joystick_state[joystick_nr].axis_mapping[c];
|
||||
|
||||
h = GetDlgItem(hdlg, id);
|
||||
if (mapping & POV_X)
|
||||
SendMessage(h, CB_SETCURSEL, nr_axes + (mapping & 3) * 2, 0);
|
||||
else if (mapping & POV_Y)
|
||||
SendMessage(h, CB_SETCURSEL, nr_axes + (mapping & 3) * 2 + 1, 0);
|
||||
else if (mapping & SLIDER)
|
||||
SendMessage(h, CB_SETCURSEL, nr_axes + nr_povs * 2 + (mapping & 3), 0);
|
||||
else
|
||||
SendMessage(h, CB_SETCURSEL, mapping, 0);
|
||||
id += 2;
|
||||
}
|
||||
for (c = 0; c < joystick_get_button_count(joystick_config_type); c++) {
|
||||
h = GetDlgItem(hdlg, id);
|
||||
SendMessage(h, CB_SETCURSEL, joystick_state[joystick_nr].button_mapping[c], 0);
|
||||
id += 2;
|
||||
}
|
||||
for (c = 0; c < joystick_get_pov_count(joystick_config_type); c++) {
|
||||
h = GetDlgItem(hdlg, id);
|
||||
mapping = joystick_state[joystick_nr].pov_mapping[c][0];
|
||||
if (mapping & POV_X)
|
||||
SendMessage(h, CB_SETCURSEL, (mapping & 3) * 2, 0);
|
||||
else if (mapping & POV_Y)
|
||||
SendMessage(h, CB_SETCURSEL, (mapping & 3) * 2 + 1, 0);
|
||||
else
|
||||
SendMessage(h, CB_SETCURSEL, mapping + nr_povs * 2, 0);
|
||||
id += 2;
|
||||
h = GetDlgItem(hdlg, id);
|
||||
mapping = joystick_state[joystick_nr].pov_mapping[c][1];
|
||||
if (mapping & POV_X)
|
||||
SendMessage(h, CB_SETCURSEL, (mapping & 3) * 2, 0);
|
||||
else if (mapping & POV_Y)
|
||||
SendMessage(h, CB_SETCURSEL, (mapping & 3) * 2 + 1, 0);
|
||||
else
|
||||
SendMessage(h, CB_SETCURSEL, mapping + nr_povs * 2, 0);
|
||||
id += 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
return TRUE;
|
||||
|
||||
case WM_COMMAND:
|
||||
switch (LOWORD(wParam)) {
|
||||
case IDC_CONFIG_BASE:
|
||||
if (HIWORD(wParam) == CBN_SELCHANGE)
|
||||
rebuild_axis_button_selections(hdlg);
|
||||
break;
|
||||
|
||||
if (joystick_state[joystick_nr].plat_joystick_nr)
|
||||
{
|
||||
nr_axes = plat_joystick_state[joystick-1].nr_axes;
|
||||
nr_povs = plat_joystick_state[joystick-1].nr_povs;
|
||||
case IDOK:
|
||||
{
|
||||
id = IDC_CONFIG_BASE + 2;
|
||||
|
||||
for (c = 0; c < joystick_get_axis_count(joystick_config_type); c++)
|
||||
{
|
||||
int mapping = joystick_state[joystick_nr].axis_mapping[c];
|
||||
h = GetDlgItem(hdlg, IDC_CONFIG_BASE);
|
||||
joystick_state[joystick_nr].plat_joystick_nr = SendMessage(h, CB_GETCURSEL, 0, 0);
|
||||
|
||||
h = GetDlgItem(hdlg, id);
|
||||
if (mapping & POV_X)
|
||||
SendMessage(h, CB_SETCURSEL, nr_axes + (mapping & 3)*2, 0);
|
||||
else if (mapping & POV_Y)
|
||||
SendMessage(h, CB_SETCURSEL, nr_axes + (mapping & 3)*2 + 1, 0);
|
||||
else if (mapping & SLIDER)
|
||||
SendMessage(h, CB_SETCURSEL, nr_axes + nr_povs * 2 + (mapping & 3), 0);
|
||||
else
|
||||
SendMessage(h, CB_SETCURSEL, mapping, 0);
|
||||
id += 2;
|
||||
}
|
||||
for (c = 0; c < joystick_get_button_count(joystick_config_type); c++)
|
||||
{
|
||||
h = GetDlgItem(hdlg, id);
|
||||
SendMessage(h, CB_SETCURSEL, joystick_state[joystick_nr].button_mapping[c], 0);
|
||||
id += 2;
|
||||
}
|
||||
for (c = 0; c < joystick_get_pov_count(joystick_config_type); c++)
|
||||
{
|
||||
h = GetDlgItem(hdlg, id);
|
||||
mapping = joystick_state[joystick_nr].pov_mapping[c][0];
|
||||
if (mapping & POV_X)
|
||||
SendMessage(h, CB_SETCURSEL, (mapping & 3)*2, 0);
|
||||
else if (mapping & POV_Y)
|
||||
SendMessage(h, CB_SETCURSEL, (mapping & 3)*2 + 1, 0);
|
||||
else
|
||||
SendMessage(h, CB_SETCURSEL, mapping + nr_povs*2, 0);
|
||||
id += 2;
|
||||
h = GetDlgItem(hdlg, id);
|
||||
mapping = joystick_state[joystick_nr].pov_mapping[c][1];
|
||||
if (mapping & POV_X)
|
||||
SendMessage(h, CB_SETCURSEL, (mapping & 3)*2, 0);
|
||||
else if (mapping & POV_Y)
|
||||
SendMessage(h, CB_SETCURSEL, (mapping & 3)*2 + 1, 0);
|
||||
else
|
||||
SendMessage(h, CB_SETCURSEL, mapping + nr_povs*2, 0);
|
||||
id += 2;
|
||||
}
|
||||
if (joystick_state[joystick_nr].plat_joystick_nr) {
|
||||
for (c = 0; c < joystick_get_axis_count(joystick_config_type); c++) {
|
||||
joystick_state[joystick_nr].axis_mapping[c] = get_axis(hdlg, id);
|
||||
id += 2;
|
||||
}
|
||||
for (c = 0; c < joystick_get_button_count(joystick_config_type); c++) {
|
||||
h = GetDlgItem(hdlg, id);
|
||||
joystick_state[joystick_nr].button_mapping[c] = SendMessage(h, CB_GETCURSEL, 0, 0);
|
||||
id += 2;
|
||||
}
|
||||
for (c = 0; c < joystick_get_button_count(joystick_config_type); c++) {
|
||||
h = GetDlgItem(hdlg, id);
|
||||
joystick_state[joystick_nr].pov_mapping[c][0] = get_pov(hdlg, id);
|
||||
id += 2;
|
||||
h = GetDlgItem(hdlg, id);
|
||||
joystick_state[joystick_nr].pov_mapping[c][1] = get_pov(hdlg, id);
|
||||
id += 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
return TRUE;
|
||||
|
||||
case WM_COMMAND:
|
||||
switch (LOWORD(wParam))
|
||||
{
|
||||
case IDC_CONFIG_BASE:
|
||||
if (HIWORD(wParam) == CBN_SELCHANGE)
|
||||
rebuild_axis_button_selections(hdlg);
|
||||
break;
|
||||
|
||||
case IDOK:
|
||||
{
|
||||
id = IDC_CONFIG_BASE + 2;
|
||||
|
||||
h = GetDlgItem(hdlg, IDC_CONFIG_BASE);
|
||||
joystick_state[joystick_nr].plat_joystick_nr = SendMessage(h, CB_GETCURSEL, 0, 0);
|
||||
|
||||
if (joystick_state[joystick_nr].plat_joystick_nr)
|
||||
{
|
||||
for (c = 0; c < joystick_get_axis_count(joystick_config_type); c++)
|
||||
{
|
||||
joystick_state[joystick_nr].axis_mapping[c] = get_axis(hdlg, id);
|
||||
id += 2;
|
||||
}
|
||||
for (c = 0; c < joystick_get_button_count(joystick_config_type); c++)
|
||||
{
|
||||
h = GetDlgItem(hdlg, id);
|
||||
joystick_state[joystick_nr].button_mapping[c] = SendMessage(h, CB_GETCURSEL, 0, 0);
|
||||
id += 2;
|
||||
}
|
||||
for (c = 0; c < joystick_get_button_count(joystick_config_type); c++)
|
||||
{
|
||||
h = GetDlgItem(hdlg, id);
|
||||
joystick_state[joystick_nr].pov_mapping[c][0] = get_pov(hdlg, id);
|
||||
id += 2;
|
||||
h = GetDlgItem(hdlg, id);
|
||||
joystick_state[joystick_nr].pov_mapping[c][1] = get_pov(hdlg, id);
|
||||
id += 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
joystickconfig_changed = 1;
|
||||
EndDialog(hdlg, 0);
|
||||
return TRUE;
|
||||
case IDCANCEL:
|
||||
joystickconfig_changed = 0;
|
||||
EndDialog(hdlg, 0);
|
||||
return TRUE;
|
||||
}
|
||||
break;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
joystickconfig_changed = 1;
|
||||
EndDialog(hdlg, 0);
|
||||
return TRUE;
|
||||
case IDCANCEL:
|
||||
joystickconfig_changed = 0;
|
||||
EndDialog(hdlg, 0);
|
||||
return TRUE;
|
||||
}
|
||||
break;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
uint8_t joystickconfig_open(HWND hwnd, int joy_nr, int type)
|
||||
uint8_t
|
||||
joystickconfig_open(HWND hwnd, int joy_nr, int type)
|
||||
{
|
||||
uint16_t *data_block = malloc(16384);
|
||||
uint16_t *data;
|
||||
DLGTEMPLATE *dlg = (DLGTEMPLATE *)data_block;
|
||||
DLGITEMTEMPLATE *item;
|
||||
int y = 10;
|
||||
int id = IDC_CONFIG_BASE;
|
||||
int c;
|
||||
char s[269];
|
||||
uint16_t *data_block = malloc(16384);
|
||||
uint16_t *data;
|
||||
DLGTEMPLATE *dlg = (DLGTEMPLATE *) data_block;
|
||||
DLGITEMTEMPLATE *item;
|
||||
int y = 10;
|
||||
int id = IDC_CONFIG_BASE;
|
||||
int c;
|
||||
char s[269];
|
||||
|
||||
joystickconfig_changed = 0;
|
||||
joystickconfig_changed = 0;
|
||||
|
||||
joystick_nr = joy_nr;
|
||||
joystick_config_type = type;
|
||||
joystick_nr = joy_nr;
|
||||
joystick_config_type = type;
|
||||
|
||||
memset(data_block, 0, 4096);
|
||||
memset(data_block, 0, 4096);
|
||||
|
||||
dlg->style = DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU;
|
||||
dlg->x = 10;
|
||||
dlg->y = 10;
|
||||
dlg->cx = 220;
|
||||
dlg->cy = 70;
|
||||
dlg->style = DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU;
|
||||
dlg->x = 10;
|
||||
dlg->y = 10;
|
||||
dlg->cx = 220;
|
||||
dlg->cy = 70;
|
||||
|
||||
data = (uint16_t *)(dlg + 1);
|
||||
data = (uint16_t *) (dlg + 1);
|
||||
|
||||
*data++ = 0; /*no menu*/
|
||||
*data++ = 0; /*predefined dialog box class*/
|
||||
data += MultiByteToWideChar(CP_ACP, 0, "Joystick Configuration", -1, data, 50);
|
||||
*data++ = 0; /*no menu*/
|
||||
*data++ = 0; /*predefined dialog box class*/
|
||||
data += MultiByteToWideChar(CP_ACP, 0, "Joystick Configuration", -1, data, 50);
|
||||
|
||||
*data++ = 9; /*Point*/
|
||||
data += MultiByteToWideChar(CP_ACP, 0, "Segoe UI", -1, data, 50);
|
||||
*data++ = 9; /*Point*/
|
||||
data += MultiByteToWideChar(CP_ACP, 0, "Segoe UI", -1, data, 50);
|
||||
|
||||
if (((uintptr_t)data) & 2)
|
||||
data++;
|
||||
if (((uintptr_t) data) & 2)
|
||||
data++;
|
||||
|
||||
/*Combo box*/
|
||||
item = (DLGITEMTEMPLATE *) data;
|
||||
item->x = 70;
|
||||
item->y = y;
|
||||
item->id = id++;
|
||||
|
||||
item->cx = 140;
|
||||
item->cy = 150;
|
||||
|
||||
item->style = WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST | WS_VSCROLL;
|
||||
|
||||
data = (uint16_t *) (item + 1);
|
||||
*data++ = 0xFFFF;
|
||||
*data++ = 0x0085; /* combo box class */
|
||||
|
||||
data += MultiByteToWideChar(CP_ACP, 0, "Device", -1, data, 256);
|
||||
*data++ = 0; /* no creation data */
|
||||
|
||||
if (((uintptr_t) data) & 2)
|
||||
data++;
|
||||
|
||||
/*Static text*/
|
||||
item = (DLGITEMTEMPLATE *) data;
|
||||
item->x = 10;
|
||||
item->y = y + 2;
|
||||
item->id = id++;
|
||||
|
||||
item->cx = 60;
|
||||
item->cy = 15;
|
||||
|
||||
item->style = WS_CHILD | WS_VISIBLE;
|
||||
|
||||
data = (uint16_t *) (item + 1);
|
||||
*data++ = 0xFFFF;
|
||||
*data++ = 0x0082; /* static class */
|
||||
|
||||
data += MultiByteToWideChar(CP_ACP, 0, "Device", -1, data, 256);
|
||||
*data++ = 0; /* no creation data */
|
||||
|
||||
if (((uintptr_t) data) & 2)
|
||||
data++;
|
||||
|
||||
y += 20;
|
||||
|
||||
for (c = 0; c < joystick_get_axis_count(type); c++) {
|
||||
/*Combo box*/
|
||||
item = (DLGITEMTEMPLATE *)data;
|
||||
item->x = 70;
|
||||
item->y = y;
|
||||
item = (DLGITEMTEMPLATE *) data;
|
||||
item->x = 70;
|
||||
item->y = y;
|
||||
item->id = id++;
|
||||
|
||||
item->cx = 140;
|
||||
@@ -344,20 +362,20 @@ uint8_t joystickconfig_open(HWND hwnd, int joy_nr, int type)
|
||||
|
||||
item->style = WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST | WS_VSCROLL;
|
||||
|
||||
data = (uint16_t *)(item + 1);
|
||||
data = (uint16_t *) (item + 1);
|
||||
*data++ = 0xFFFF;
|
||||
*data++ = 0x0085; /* combo box class */
|
||||
*data++ = 0x0085; /* combo box class */
|
||||
|
||||
data += MultiByteToWideChar(CP_ACP, 0, "Device", -1, data, 256);
|
||||
*data++ = 0; /* no creation data */
|
||||
data += MultiByteToWideChar(CP_ACP, 0, joystick_get_axis_name(type, c), -1, data, 256);
|
||||
*data++ = 0; /* no creation data */
|
||||
|
||||
if (((uintptr_t)data) & 2)
|
||||
data++;
|
||||
if (((uintptr_t) data) & 2)
|
||||
data++;
|
||||
|
||||
/*Static text*/
|
||||
item = (DLGITEMTEMPLATE *)data;
|
||||
item->x = 10;
|
||||
item->y = y + 2;
|
||||
item = (DLGITEMTEMPLATE *) data;
|
||||
item->x = 10;
|
||||
item->y = y + 2;
|
||||
item->id = id++;
|
||||
|
||||
item->cx = 60;
|
||||
@@ -365,204 +383,155 @@ uint8_t joystickconfig_open(HWND hwnd, int joy_nr, int type)
|
||||
|
||||
item->style = WS_CHILD | WS_VISIBLE;
|
||||
|
||||
data = (uint16_t *)(item + 1);
|
||||
data = (uint16_t *) (item + 1);
|
||||
*data++ = 0xFFFF;
|
||||
*data++ = 0x0082; /* static class */
|
||||
*data++ = 0x0082; /* static class */
|
||||
|
||||
data += MultiByteToWideChar(CP_ACP, 0, "Device", -1, data, 256);
|
||||
*data++ = 0; /* no creation data */
|
||||
data += MultiByteToWideChar(CP_ACP, 0, joystick_get_axis_name(type, c), -1, data, 256);
|
||||
*data++ = 0; /* no creation data */
|
||||
|
||||
if (((uintptr_t)data) & 2)
|
||||
data++;
|
||||
if (((uintptr_t) data) & 2)
|
||||
data++;
|
||||
|
||||
y += 20;
|
||||
}
|
||||
|
||||
for (c = 0; c < joystick_get_button_count(type); c++) {
|
||||
/*Combo box*/
|
||||
item = (DLGITEMTEMPLATE *) data;
|
||||
item->x = 70;
|
||||
item->y = y;
|
||||
item->id = id++;
|
||||
|
||||
for (c = 0; c < joystick_get_axis_count(type); c++)
|
||||
{
|
||||
/*Combo box*/
|
||||
item = (DLGITEMTEMPLATE *)data;
|
||||
item->x = 70;
|
||||
item->y = y;
|
||||
item->id = id++;
|
||||
item->cx = 140;
|
||||
item->cy = 150;
|
||||
|
||||
item->cx = 140;
|
||||
item->cy = 150;
|
||||
item->style = WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST | WS_VSCROLL;
|
||||
|
||||
item->style = WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST | WS_VSCROLL;
|
||||
|
||||
data = (uint16_t *)(item + 1);
|
||||
*data++ = 0xFFFF;
|
||||
*data++ = 0x0085; /* combo box class */
|
||||
|
||||
data += MultiByteToWideChar(CP_ACP, 0, joystick_get_axis_name(type, c), -1, data, 256);
|
||||
*data++ = 0; /* no creation data */
|
||||
|
||||
if (((uintptr_t)data) & 2)
|
||||
data++;
|
||||
|
||||
/*Static text*/
|
||||
item = (DLGITEMTEMPLATE *)data;
|
||||
item->x = 10;
|
||||
item->y = y + 2;
|
||||
item->id = id++;
|
||||
|
||||
item->cx = 60;
|
||||
item->cy = 15;
|
||||
|
||||
item->style = WS_CHILD | WS_VISIBLE;
|
||||
|
||||
data = (uint16_t *)(item + 1);
|
||||
*data++ = 0xFFFF;
|
||||
*data++ = 0x0082; /* static class */
|
||||
|
||||
data += MultiByteToWideChar(CP_ACP, 0, joystick_get_axis_name(type, c), -1, data, 256);
|
||||
*data++ = 0; /* no creation data */
|
||||
|
||||
if (((uintptr_t)data) & 2)
|
||||
data++;
|
||||
|
||||
y += 20;
|
||||
}
|
||||
|
||||
for (c = 0; c < joystick_get_button_count(type); c++)
|
||||
{
|
||||
/*Combo box*/
|
||||
item = (DLGITEMTEMPLATE *)data;
|
||||
item->x = 70;
|
||||
item->y = y;
|
||||
item->id = id++;
|
||||
|
||||
item->cx = 140;
|
||||
item->cy = 150;
|
||||
|
||||
item->style = WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST | WS_VSCROLL;
|
||||
|
||||
data = (uint16_t *)(item + 1);
|
||||
*data++ = 0xFFFF;
|
||||
*data++ = 0x0085; /* combo box class */
|
||||
|
||||
data += MultiByteToWideChar(CP_ACP, 0, joystick_get_button_name(type, c), -1, data, 256);
|
||||
*data++ = 0; /* no creation data */
|
||||
|
||||
if (((uintptr_t)data) & 2)
|
||||
data++;
|
||||
|
||||
/*Static text*/
|
||||
item = (DLGITEMTEMPLATE *)data;
|
||||
item->x = 10;
|
||||
item->y = y + 2;
|
||||
item->id = id++;
|
||||
|
||||
item->cx = 60;
|
||||
item->cy = 15;
|
||||
|
||||
item->style = WS_CHILD | WS_VISIBLE;
|
||||
|
||||
data = (uint16_t *)(item + 1);
|
||||
*data++ = 0xFFFF;
|
||||
*data++ = 0x0082; /* static class */
|
||||
|
||||
data += MultiByteToWideChar(CP_ACP, 0, joystick_get_button_name(type, c), -1, data, 256);
|
||||
*data++ = 0; /* no creation data */
|
||||
|
||||
if (((uintptr_t)data) & 2)
|
||||
data++;
|
||||
|
||||
y += 20;
|
||||
}
|
||||
|
||||
for (c = 0; c < joystick_get_pov_count(type)*2; c++)
|
||||
{
|
||||
/*Combo box*/
|
||||
item = (DLGITEMTEMPLATE *)data;
|
||||
item->x = 70;
|
||||
item->y = y;
|
||||
item->id = id++;
|
||||
|
||||
item->cx = 140;
|
||||
item->cy = 150;
|
||||
|
||||
item->style = WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST | WS_VSCROLL;
|
||||
|
||||
data = (uint16_t *)(item + 1);
|
||||
*data++ = 0xFFFF;
|
||||
*data++ = 0x0085; /* combo box class */
|
||||
|
||||
if (c & 1)
|
||||
sprintf(s, "%s (Y axis)", joystick_get_pov_name(type, c/2));
|
||||
else
|
||||
sprintf(s, "%s (X axis)", joystick_get_pov_name(type, c/2));
|
||||
data += MultiByteToWideChar(CP_ACP, 0, s, -1, data, 256);
|
||||
*data++ = 0; /* no creation data */
|
||||
|
||||
if (((uintptr_t)data) & 2)
|
||||
data++;
|
||||
|
||||
/*Static text*/
|
||||
item = (DLGITEMTEMPLATE *)data;
|
||||
item->x = 10;
|
||||
item->y = y + 2;
|
||||
item->id = id++;
|
||||
|
||||
item->cx = 60;
|
||||
item->cy = 15;
|
||||
|
||||
item->style = WS_CHILD | WS_VISIBLE;
|
||||
|
||||
data = (uint16_t *)(item + 1);
|
||||
*data++ = 0xFFFF;
|
||||
*data++ = 0x0082; /* static class */
|
||||
|
||||
data += MultiByteToWideChar(CP_ACP, 0, s, -1, data, 256);
|
||||
*data++ = 0; /* no creation data */
|
||||
|
||||
if (((uintptr_t)data) & 2)
|
||||
data++;
|
||||
|
||||
y += 20;
|
||||
}
|
||||
|
||||
dlg->cdit = (id - IDC_CONFIG_BASE) + 2;
|
||||
|
||||
item = (DLGITEMTEMPLATE *)data;
|
||||
item->x = 100;
|
||||
item->y = y + 5;
|
||||
item->cx = 50;
|
||||
item->cy = 14;
|
||||
item->id = IDOK; /* OK button identifier */
|
||||
item->style = WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON;
|
||||
|
||||
data = (uint16_t *)(item + 1);
|
||||
data = (uint16_t *) (item + 1);
|
||||
*data++ = 0xFFFF;
|
||||
*data++ = 0x0080; /* button class */
|
||||
*data++ = 0x0085; /* combo box class */
|
||||
|
||||
data += MultiByteToWideChar(CP_ACP, 0, "OK", -1, data, 50);
|
||||
*data++ = 0; /* no creation data */
|
||||
data += MultiByteToWideChar(CP_ACP, 0, joystick_get_button_name(type, c), -1, data, 256);
|
||||
*data++ = 0; /* no creation data */
|
||||
|
||||
if (((uintptr_t)data) & 2)
|
||||
data++;
|
||||
if (((uintptr_t) data) & 2)
|
||||
data++;
|
||||
|
||||
/*Static text*/
|
||||
item = (DLGITEMTEMPLATE *) data;
|
||||
item->x = 10;
|
||||
item->y = y + 2;
|
||||
item->id = id++;
|
||||
|
||||
item->cx = 60;
|
||||
item->cy = 15;
|
||||
|
||||
item = (DLGITEMTEMPLATE *)data;
|
||||
item->x = 160;
|
||||
item->y = y + 5;
|
||||
item->cx = 50;
|
||||
item->cy = 14;
|
||||
item->id = IDCANCEL; /* Cancel button identifier */
|
||||
item->style = WS_CHILD | WS_VISIBLE;
|
||||
|
||||
data = (uint16_t *)(item + 1);
|
||||
data = (uint16_t *) (item + 1);
|
||||
*data++ = 0xFFFF;
|
||||
*data++ = 0x0080; /* button class */
|
||||
*data++ = 0x0082; /* static class */
|
||||
|
||||
data += MultiByteToWideChar(CP_ACP, 0, "Cancel", -1, data, 50);
|
||||
*data++ = 0; /* no creation data */
|
||||
data += MultiByteToWideChar(CP_ACP, 0, joystick_get_button_name(type, c), -1, data, 256);
|
||||
*data++ = 0; /* no creation data */
|
||||
|
||||
dlg->cy = y + 25;
|
||||
if (((uintptr_t) data) & 2)
|
||||
data++;
|
||||
|
||||
DialogBoxIndirect(hinstance, dlg, hwnd, joystickconfig_dlgproc);
|
||||
y += 20;
|
||||
}
|
||||
|
||||
free(data_block);
|
||||
for (c = 0; c < joystick_get_pov_count(type) * 2; c++) {
|
||||
/*Combo box*/
|
||||
item = (DLGITEMTEMPLATE *) data;
|
||||
item->x = 70;
|
||||
item->y = y;
|
||||
item->id = id++;
|
||||
|
||||
return joystickconfig_changed;
|
||||
item->cx = 140;
|
||||
item->cy = 150;
|
||||
|
||||
item->style = WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST | WS_VSCROLL;
|
||||
|
||||
data = (uint16_t *) (item + 1);
|
||||
*data++ = 0xFFFF;
|
||||
*data++ = 0x0085; /* combo box class */
|
||||
|
||||
if (c & 1)
|
||||
sprintf(s, "%s (Y axis)", joystick_get_pov_name(type, c / 2));
|
||||
else
|
||||
sprintf(s, "%s (X axis)", joystick_get_pov_name(type, c / 2));
|
||||
data += MultiByteToWideChar(CP_ACP, 0, s, -1, data, 256);
|
||||
*data++ = 0; /* no creation data */
|
||||
|
||||
if (((uintptr_t) data) & 2)
|
||||
data++;
|
||||
|
||||
/*Static text*/
|
||||
item = (DLGITEMTEMPLATE *) data;
|
||||
item->x = 10;
|
||||
item->y = y + 2;
|
||||
item->id = id++;
|
||||
|
||||
item->cx = 60;
|
||||
item->cy = 15;
|
||||
|
||||
item->style = WS_CHILD | WS_VISIBLE;
|
||||
|
||||
data = (uint16_t *) (item + 1);
|
||||
*data++ = 0xFFFF;
|
||||
*data++ = 0x0082; /* static class */
|
||||
|
||||
data += MultiByteToWideChar(CP_ACP, 0, s, -1, data, 256);
|
||||
*data++ = 0; /* no creation data */
|
||||
|
||||
if (((uintptr_t) data) & 2)
|
||||
data++;
|
||||
|
||||
y += 20;
|
||||
}
|
||||
|
||||
dlg->cdit = (id - IDC_CONFIG_BASE) + 2;
|
||||
|
||||
item = (DLGITEMTEMPLATE *) data;
|
||||
item->x = 100;
|
||||
item->y = y + 5;
|
||||
item->cx = 50;
|
||||
item->cy = 14;
|
||||
item->id = IDOK; /* OK button identifier */
|
||||
item->style = WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON;
|
||||
|
||||
data = (uint16_t *) (item + 1);
|
||||
*data++ = 0xFFFF;
|
||||
*data++ = 0x0080; /* button class */
|
||||
|
||||
data += MultiByteToWideChar(CP_ACP, 0, "OK", -1, data, 50);
|
||||
*data++ = 0; /* no creation data */
|
||||
|
||||
if (((uintptr_t) data) & 2)
|
||||
data++;
|
||||
|
||||
item = (DLGITEMTEMPLATE *) data;
|
||||
item->x = 160;
|
||||
item->y = y + 5;
|
||||
item->cx = 50;
|
||||
item->cy = 14;
|
||||
item->id = IDCANCEL; /* Cancel button identifier */
|
||||
item->style = WS_CHILD | WS_VISIBLE;
|
||||
|
||||
data = (uint16_t *) (item + 1);
|
||||
*data++ = 0xFFFF;
|
||||
*data++ = 0x0080; /* button class */
|
||||
|
||||
data += MultiByteToWideChar(CP_ACP, 0, "Cancel", -1, data, 50);
|
||||
*data++ = 0; /* no creation data */
|
||||
|
||||
dlg->cy = y + 25;
|
||||
|
||||
DialogBoxIndirect(hinstance, dlg, hwnd, joystickconfig_dlgproc);
|
||||
|
||||
free(data_block);
|
||||
|
||||
return joystickconfig_changed;
|
||||
}
|
||||
|
||||
@@ -15,8 +15,8 @@
|
||||
* Copyright 2016-2018 Miran Grca.
|
||||
*/
|
||||
#define UNICODE
|
||||
#define _WIN32_WINNT 0x0501
|
||||
#define BITMAP WINDOWS_BITMAP
|
||||
#define _WIN32_WINNT 0x0501
|
||||
#define BITMAP WINDOWS_BITMAP
|
||||
#include <windows.h>
|
||||
#include <windowsx.h>
|
||||
#undef BITMAP
|
||||
@@ -30,9 +30,7 @@
|
||||
#include <86box/plat.h>
|
||||
#include <86box/win.h>
|
||||
|
||||
|
||||
static uint16_t scancode_map[768];
|
||||
|
||||
static uint16_t scancode_map[768];
|
||||
|
||||
/* This is so we can disambiguate scan codes that would otherwise conflict and get
|
||||
passed on incorrectly. */
|
||||
@@ -40,34 +38,33 @@ static UINT16
|
||||
convert_scan_code(UINT16 scan_code)
|
||||
{
|
||||
if ((scan_code & 0xff00) == 0xe000)
|
||||
scan_code = (scan_code & 0xff) | 0x0100;
|
||||
scan_code = (scan_code & 0xff) | 0x0100;
|
||||
|
||||
if (scan_code == 0xE11D)
|
||||
scan_code = 0x0100;
|
||||
scan_code = 0x0100;
|
||||
/* E0 00 is sent by some USB keyboards for their special keys, as it is an
|
||||
invalid scan code (it has no untranslated set 2 equivalent), we mark it
|
||||
appropriately so it does not get passed through. */
|
||||
else if ((scan_code > 0x01FF) || (scan_code == 0x0100))
|
||||
scan_code = 0xFFFF;
|
||||
scan_code = 0xFFFF;
|
||||
|
||||
return scan_code;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
keyboard_getkeymap(void)
|
||||
{
|
||||
WCHAR *keyName = L"SYSTEM\\CurrentControlSet\\Control\\Keyboard Layout";
|
||||
WCHAR *valueName = L"Scancode Map";
|
||||
WCHAR *keyName = L"SYSTEM\\CurrentControlSet\\Control\\Keyboard Layout";
|
||||
WCHAR *valueName = L"Scancode Map";
|
||||
unsigned char buf[32768];
|
||||
DWORD bufSize;
|
||||
HKEY hKey;
|
||||
int j;
|
||||
UINT32 *bufEx2;
|
||||
int scMapCount;
|
||||
UINT16 *bufEx;
|
||||
int scancode_unmapped;
|
||||
int scancode_mapped;
|
||||
DWORD bufSize;
|
||||
HKEY hKey;
|
||||
int j;
|
||||
UINT32 *bufEx2;
|
||||
int scMapCount;
|
||||
UINT16 *bufEx;
|
||||
int scancode_unmapped;
|
||||
int scancode_mapped;
|
||||
|
||||
/* First, prepare the default scan code map list which is 1:1.
|
||||
* Remappings will be inserted directly into it.
|
||||
@@ -75,131 +72,124 @@ keyboard_getkeymap(void)
|
||||
* prefix.
|
||||
*/
|
||||
for (j = 0; j < 512; j++)
|
||||
scancode_map[j] = j;
|
||||
scancode_map[j] = j;
|
||||
|
||||
/* Get the scan code remappings from:
|
||||
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout */
|
||||
bufSize = 32768;
|
||||
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, keyName, 0, 1, &hKey) == ERROR_SUCCESS) {
|
||||
if (RegQueryValueEx(hKey, valueName, NULL, NULL, buf, &bufSize) == ERROR_SUCCESS) {
|
||||
bufEx2 = (UINT32 *) buf;
|
||||
scMapCount = bufEx2[2];
|
||||
if ((bufSize != 0) && (scMapCount != 0)) {
|
||||
bufEx = (UINT16 *) (buf + 12);
|
||||
for (j = 0; j < scMapCount*2; j += 2) {
|
||||
/* Each scan code is 32-bit: 16 bits of remapped scan code,
|
||||
and 16 bits of original scan code. */
|
||||
scancode_unmapped = bufEx[j + 1];
|
||||
scancode_mapped = bufEx[j];
|
||||
if (RegQueryValueEx(hKey, valueName, NULL, NULL, buf, &bufSize) == ERROR_SUCCESS) {
|
||||
bufEx2 = (UINT32 *) buf;
|
||||
scMapCount = bufEx2[2];
|
||||
if ((bufSize != 0) && (scMapCount != 0)) {
|
||||
bufEx = (UINT16 *) (buf + 12);
|
||||
for (j = 0; j < scMapCount * 2; j += 2) {
|
||||
/* Each scan code is 32-bit: 16 bits of remapped scan code,
|
||||
and 16 bits of original scan code. */
|
||||
scancode_unmapped = bufEx[j + 1];
|
||||
scancode_mapped = bufEx[j];
|
||||
|
||||
scancode_unmapped = convert_scan_code(scancode_unmapped);
|
||||
scancode_mapped = convert_scan_code(scancode_mapped);
|
||||
scancode_unmapped = convert_scan_code(scancode_unmapped);
|
||||
scancode_mapped = convert_scan_code(scancode_mapped);
|
||||
|
||||
/* Ignore source scan codes with prefixes other than E1
|
||||
that are not E1 1D. */
|
||||
if (scancode_unmapped != 0xFFFF)
|
||||
scancode_map[scancode_unmapped] = scancode_mapped;
|
||||
}
|
||||
}
|
||||
}
|
||||
RegCloseKey(hKey);
|
||||
/* Ignore source scan codes with prefixes other than E1
|
||||
that are not E1 1D. */
|
||||
if (scancode_unmapped != 0xFFFF)
|
||||
scancode_map[scancode_unmapped] = scancode_mapped;
|
||||
}
|
||||
}
|
||||
}
|
||||
RegCloseKey(hKey);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
keyboard_handle(PRAWINPUT raw)
|
||||
{
|
||||
USHORT scancode;
|
||||
USHORT scancode;
|
||||
static int recv_lalt = 0, recv_ralt = 0, recv_tab = 0;
|
||||
|
||||
RAWKEYBOARD rawKB = raw->data.keyboard;
|
||||
scancode = rawKB.MakeCode;
|
||||
scancode = rawKB.MakeCode;
|
||||
|
||||
if (kbd_req_capture && !mouse_capture && !video_fullscreen)
|
||||
return;
|
||||
return;
|
||||
|
||||
/* If it's not a scan code that starts with 0xE1 */
|
||||
if (!(rawKB.Flags & RI_KEY_E1)) {
|
||||
if (rawKB.Flags & RI_KEY_E0)
|
||||
scancode |= 0x100;
|
||||
if (rawKB.Flags & RI_KEY_E0)
|
||||
scancode |= 0x100;
|
||||
|
||||
/* Translate the scan code to 9-bit */
|
||||
scancode = convert_scan_code(scancode);
|
||||
/* Translate the scan code to 9-bit */
|
||||
scancode = convert_scan_code(scancode);
|
||||
|
||||
/* Remap it according to the list from the Registry */
|
||||
if (scancode != scancode_map[scancode])
|
||||
pclog("Scan code remap: %03X -> %03X\n", scancode, scancode);
|
||||
scancode = scancode_map[scancode];
|
||||
/* Remap it according to the list from the Registry */
|
||||
if (scancode != scancode_map[scancode])
|
||||
pclog("Scan code remap: %03X -> %03X\n", scancode, scancode);
|
||||
scancode = scancode_map[scancode];
|
||||
|
||||
/* If it's not 0xFFFF, send it to the emulated
|
||||
keyboard.
|
||||
We use scan code 0xFFFF to mean a mapping that
|
||||
has a prefix other than E0 and that is not E1 1D,
|
||||
which is, for our purposes, invalid. */
|
||||
if ((scancode == 0x00F) &&
|
||||
!(rawKB.Flags & RI_KEY_BREAK) &&
|
||||
(recv_lalt || recv_ralt) &&
|
||||
!mouse_capture) {
|
||||
/* We received a TAB while ALT was pressed, while the mouse
|
||||
is not captured, suppress the TAB and send an ALT key up. */
|
||||
if (recv_lalt) {
|
||||
keyboard_input(0, 0x038);
|
||||
/* Extra key press and release so the guest is not stuck in the
|
||||
menu bar. */
|
||||
keyboard_input(1, 0x038);
|
||||
keyboard_input(0, 0x038);
|
||||
recv_lalt = 0;
|
||||
}
|
||||
if (recv_ralt) {
|
||||
keyboard_input(0, 0x138);
|
||||
/* Extra key press and release so the guest is not stuck in the
|
||||
menu bar. */
|
||||
keyboard_input(1, 0x138);
|
||||
keyboard_input(0, 0x138);
|
||||
recv_ralt = 0;
|
||||
}
|
||||
} else if (((scancode == 0x038) || (scancode == 0x138)) &&
|
||||
!(rawKB.Flags & RI_KEY_BREAK) &&
|
||||
recv_tab &&
|
||||
!mouse_capture) {
|
||||
/* We received an ALT while TAB was pressed, while the mouse
|
||||
is not captured, suppress the ALT and send a TAB key up. */
|
||||
keyboard_input(0, 0x00F);
|
||||
recv_tab = 0;
|
||||
} else {
|
||||
switch(scancode) {
|
||||
case 0x00F:
|
||||
recv_tab = !(rawKB.Flags & RI_KEY_BREAK);
|
||||
break;
|
||||
case 0x038:
|
||||
recv_lalt = !(rawKB.Flags & RI_KEY_BREAK);
|
||||
break;
|
||||
case 0x138:
|
||||
recv_ralt = !(rawKB.Flags & RI_KEY_BREAK);
|
||||
break;
|
||||
}
|
||||
/* If it's not 0xFFFF, send it to the emulated
|
||||
keyboard.
|
||||
We use scan code 0xFFFF to mean a mapping that
|
||||
has a prefix other than E0 and that is not E1 1D,
|
||||
which is, for our purposes, invalid. */
|
||||
if ((scancode == 0x00F) && !(rawKB.Flags & RI_KEY_BREAK) && (recv_lalt || recv_ralt) && !mouse_capture) {
|
||||
/* We received a TAB while ALT was pressed, while the mouse
|
||||
is not captured, suppress the TAB and send an ALT key up. */
|
||||
if (recv_lalt) {
|
||||
keyboard_input(0, 0x038);
|
||||
/* Extra key press and release so the guest is not stuck in the
|
||||
menu bar. */
|
||||
keyboard_input(1, 0x038);
|
||||
keyboard_input(0, 0x038);
|
||||
recv_lalt = 0;
|
||||
}
|
||||
if (recv_ralt) {
|
||||
keyboard_input(0, 0x138);
|
||||
/* Extra key press and release so the guest is not stuck in the
|
||||
menu bar. */
|
||||
keyboard_input(1, 0x138);
|
||||
keyboard_input(0, 0x138);
|
||||
recv_ralt = 0;
|
||||
}
|
||||
} else if (((scancode == 0x038) || (scancode == 0x138)) && !(rawKB.Flags & RI_KEY_BREAK) && recv_tab && !mouse_capture) {
|
||||
/* We received an ALT while TAB was pressed, while the mouse
|
||||
is not captured, suppress the ALT and send a TAB key up. */
|
||||
keyboard_input(0, 0x00F);
|
||||
recv_tab = 0;
|
||||
} else {
|
||||
switch (scancode) {
|
||||
case 0x00F:
|
||||
recv_tab = !(rawKB.Flags & RI_KEY_BREAK);
|
||||
break;
|
||||
case 0x038:
|
||||
recv_lalt = !(rawKB.Flags & RI_KEY_BREAK);
|
||||
break;
|
||||
case 0x138:
|
||||
recv_ralt = !(rawKB.Flags & RI_KEY_BREAK);
|
||||
break;
|
||||
}
|
||||
|
||||
/* Translate right CTRL to left ALT if the user has so
|
||||
chosen. */
|
||||
if ((scancode == 0x11D) && rctrl_is_lalt)
|
||||
scancode = 0x038;
|
||||
/* Translate right CTRL to left ALT if the user has so
|
||||
chosen. */
|
||||
if ((scancode == 0x11D) && rctrl_is_lalt)
|
||||
scancode = 0x038;
|
||||
|
||||
/* Normal scan code pass through, pass it through as is if
|
||||
it's not an invalid scan code. */
|
||||
if (scancode != 0xFFFF)
|
||||
keyboard_input(!(rawKB.Flags & RI_KEY_BREAK), scancode);
|
||||
}
|
||||
/* Normal scan code pass through, pass it through as is if
|
||||
it's not an invalid scan code. */
|
||||
if (scancode != 0xFFFF)
|
||||
keyboard_input(!(rawKB.Flags & RI_KEY_BREAK), scancode);
|
||||
}
|
||||
} else {
|
||||
if (rawKB.MakeCode == 0x1D) {
|
||||
scancode = scancode_map[0x100]; /* Translate E1 1D to 0x100 (which would
|
||||
otherwise be E0 00 but that is invalid
|
||||
anyway).
|
||||
Also, take a potential mapping into
|
||||
account. */
|
||||
} else
|
||||
scancode = 0xFFFF;
|
||||
if (scancode != 0xFFFF)
|
||||
keyboard_input(!(rawKB.Flags & RI_KEY_BREAK), scancode);
|
||||
if (rawKB.MakeCode == 0x1D) {
|
||||
scancode = scancode_map[0x100]; /* Translate E1 1D to 0x100 (which would
|
||||
otherwise be E0 00 but that is invalid
|
||||
anyway).
|
||||
Also, take a potential mapping into
|
||||
account. */
|
||||
} else
|
||||
scancode = 0xFFFF;
|
||||
if (scancode != 0xFFFF)
|
||||
keyboard_input(!(rawKB.Flags & RI_KEY_BREAK), scancode);
|
||||
}
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -27,14 +27,14 @@
|
||||
#include <86box/plat.h>
|
||||
#include <86box/win.h>
|
||||
|
||||
int mouse_capture;
|
||||
int mouse_capture;
|
||||
double mouse_sensitivity = 1.0; /* Unused. */
|
||||
|
||||
typedef struct {
|
||||
int buttons;
|
||||
int dx;
|
||||
int dy;
|
||||
int dwheel;
|
||||
int buttons;
|
||||
int dx;
|
||||
int dy;
|
||||
int dwheel;
|
||||
} MOUSESTATE;
|
||||
|
||||
MOUSESTATE mousestate;
|
||||
@@ -46,70 +46,69 @@ win_mouse_init(void)
|
||||
|
||||
mouse_capture = 0;
|
||||
|
||||
/* Initialize the RawInput (mouse) module. */
|
||||
RAWINPUTDEVICE ridev;
|
||||
ridev.dwFlags = 0;
|
||||
ridev.hwndTarget = NULL;
|
||||
ridev.usUsagePage = 0x01;
|
||||
ridev.usUsage = 0x02;
|
||||
if (! RegisterRawInputDevices(&ridev, 1, sizeof(ridev)))
|
||||
fatal("plat_mouse_init: RegisterRawInputDevices failed\n");
|
||||
/* Initialize the RawInput (mouse) module. */
|
||||
RAWINPUTDEVICE ridev;
|
||||
ridev.dwFlags = 0;
|
||||
ridev.hwndTarget = NULL;
|
||||
ridev.usUsagePage = 0x01;
|
||||
ridev.usUsage = 0x02;
|
||||
if (!RegisterRawInputDevices(&ridev, 1, sizeof(ridev)))
|
||||
fatal("plat_mouse_init: RegisterRawInputDevices failed\n");
|
||||
|
||||
memset(&mousestate, 0, sizeof(MOUSESTATE));
|
||||
memset(&mousestate, 0, sizeof(MOUSESTATE));
|
||||
}
|
||||
|
||||
void
|
||||
win_mouse_handle(PRAWINPUT raw)
|
||||
{
|
||||
RAWMOUSE state = raw->data.mouse;
|
||||
RAWMOUSE state = raw->data.mouse;
|
||||
static int x, y;
|
||||
|
||||
/* read mouse buttons and wheel */
|
||||
if (state.usButtonFlags & RI_MOUSE_LEFT_BUTTON_DOWN)
|
||||
mousestate.buttons |= 1;
|
||||
else if (state.usButtonFlags & RI_MOUSE_LEFT_BUTTON_UP)
|
||||
mousestate.buttons &= ~1;
|
||||
/* read mouse buttons and wheel */
|
||||
if (state.usButtonFlags & RI_MOUSE_LEFT_BUTTON_DOWN)
|
||||
mousestate.buttons |= 1;
|
||||
else if (state.usButtonFlags & RI_MOUSE_LEFT_BUTTON_UP)
|
||||
mousestate.buttons &= ~1;
|
||||
|
||||
if (state.usButtonFlags & RI_MOUSE_MIDDLE_BUTTON_DOWN)
|
||||
mousestate.buttons |= 4;
|
||||
else if (state.usButtonFlags & RI_MOUSE_MIDDLE_BUTTON_UP)
|
||||
mousestate.buttons &= ~4;
|
||||
if (state.usButtonFlags & RI_MOUSE_MIDDLE_BUTTON_DOWN)
|
||||
mousestate.buttons |= 4;
|
||||
else if (state.usButtonFlags & RI_MOUSE_MIDDLE_BUTTON_UP)
|
||||
mousestate.buttons &= ~4;
|
||||
|
||||
if (state.usButtonFlags & RI_MOUSE_RIGHT_BUTTON_DOWN)
|
||||
mousestate.buttons |= 2;
|
||||
else if (state.usButtonFlags & RI_MOUSE_RIGHT_BUTTON_UP)
|
||||
mousestate.buttons &= ~2;
|
||||
|
||||
if (state.usButtonFlags & RI_MOUSE_WHEEL) {
|
||||
mousestate.dwheel += (SHORT)state.usButtonData / 120;
|
||||
}
|
||||
if (state.usButtonFlags & RI_MOUSE_RIGHT_BUTTON_DOWN)
|
||||
mousestate.buttons |= 2;
|
||||
else if (state.usButtonFlags & RI_MOUSE_RIGHT_BUTTON_UP)
|
||||
mousestate.buttons &= ~2;
|
||||
|
||||
if (state.usButtonFlags & RI_MOUSE_WHEEL) {
|
||||
mousestate.dwheel += (SHORT) state.usButtonData / 120;
|
||||
}
|
||||
|
||||
if (state.usFlags & MOUSE_MOVE_ABSOLUTE) {
|
||||
/* absolute mouse, i.e. RDP or VNC
|
||||
* seems to work fine for RDP on Windows 10
|
||||
* Not sure about other environments.
|
||||
*/
|
||||
mousestate.dx += (state.lLastX - x)/25;
|
||||
mousestate.dy += (state.lLastY - y)/25;
|
||||
x=state.lLastX;
|
||||
y=state.lLastY;
|
||||
} else {
|
||||
/* relative mouse, i.e. regular mouse */
|
||||
mousestate.dx += state.lLastX;
|
||||
mousestate.dy += state.lLastY;
|
||||
}
|
||||
/* absolute mouse, i.e. RDP or VNC
|
||||
* seems to work fine for RDP on Windows 10
|
||||
* Not sure about other environments.
|
||||
*/
|
||||
mousestate.dx += (state.lLastX - x) / 25;
|
||||
mousestate.dy += (state.lLastY - y) / 25;
|
||||
x = state.lLastX;
|
||||
y = state.lLastY;
|
||||
} else {
|
||||
/* relative mouse, i.e. regular mouse */
|
||||
mousestate.dx += state.lLastX;
|
||||
mousestate.dy += state.lLastY;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
win_mouse_close(void)
|
||||
{
|
||||
RAWINPUTDEVICE ridev;
|
||||
ridev.dwFlags = RIDEV_REMOVE;
|
||||
ridev.hwndTarget = NULL;
|
||||
ridev.usUsagePage = 0x01;
|
||||
ridev.usUsage = 0x02;
|
||||
RegisterRawInputDevices(&ridev, 1, sizeof(ridev));
|
||||
RAWINPUTDEVICE ridev;
|
||||
ridev.dwFlags = RIDEV_REMOVE;
|
||||
ridev.hwndTarget = NULL;
|
||||
ridev.usUsagePage = 0x01;
|
||||
ridev.usUsage = 0x02;
|
||||
RegisterRawInputDevices(&ridev, 1, sizeof(ridev));
|
||||
}
|
||||
|
||||
void
|
||||
@@ -117,21 +116,21 @@ mouse_poll(void)
|
||||
{
|
||||
static int b = 0;
|
||||
if (mouse_capture || video_fullscreen) {
|
||||
if (mousestate.dx != 0 || mousestate.dy != 0 || mousestate.dwheel != 0) {
|
||||
mouse_x += mousestate.dx;
|
||||
mouse_y += mousestate.dy;
|
||||
mouse_z = mousestate.dwheel;
|
||||
if (mousestate.dx != 0 || mousestate.dy != 0 || mousestate.dwheel != 0) {
|
||||
mouse_x += mousestate.dx;
|
||||
mouse_y += mousestate.dy;
|
||||
mouse_z = mousestate.dwheel;
|
||||
|
||||
mousestate.dx=0;
|
||||
mousestate.dy=0;
|
||||
mousestate.dwheel=0;
|
||||
mousestate.dx = 0;
|
||||
mousestate.dy = 0;
|
||||
mousestate.dwheel = 0;
|
||||
|
||||
//pclog("dx=%d, dy=%d, dwheel=%d\n", mouse_x, mouse_y, mouse_z);
|
||||
}
|
||||
// pclog("dx=%d, dy=%d, dwheel=%d\n", mouse_x, mouse_y, mouse_z);
|
||||
}
|
||||
|
||||
if (b != mousestate.buttons) {
|
||||
mouse_buttons = mousestate.buttons;
|
||||
b = mousestate.buttons;
|
||||
}
|
||||
}
|
||||
if (b != mousestate.buttons) {
|
||||
mouse_buttons = mousestate.buttons;
|
||||
b = mousestate.buttons;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -27,12 +27,10 @@
|
||||
#include <86box/plat.h>
|
||||
#include <86box/plat_dir.h>
|
||||
|
||||
|
||||
#define SUFFIX "\\*"
|
||||
#define FINDATA struct _finddata_t
|
||||
#define FINDFIRST _findfirst
|
||||
#define FINDNEXT _findnext
|
||||
|
||||
#define SUFFIX "\\*"
|
||||
#define FINDATA struct _finddata_t
|
||||
#define FINDFIRST _findfirst
|
||||
#define FINDNEXT _findnext
|
||||
|
||||
/* Open a directory. */
|
||||
DIR *
|
||||
@@ -43,17 +41,17 @@ opendir(const char *name)
|
||||
/* Create a new control structure. */
|
||||
p = (DIR *) malloc(sizeof(DIR));
|
||||
if (p == NULL)
|
||||
return(NULL);
|
||||
return (NULL);
|
||||
memset(p, 0x00, sizeof(DIR));
|
||||
p->flags = (DIR_F_LOWER | DIR_F_SANE);
|
||||
p->flags = (DIR_F_LOWER | DIR_F_SANE);
|
||||
p->offset = 0;
|
||||
p->sts = 0;
|
||||
p->sts = 0;
|
||||
|
||||
/* Create a work area. */
|
||||
p->dta = (char *)malloc(sizeof(FINDATA));
|
||||
p->dta = (char *) malloc(sizeof(FINDATA));
|
||||
if (p->dta == NULL) {
|
||||
free(p);
|
||||
return(NULL);
|
||||
free(p);
|
||||
return (NULL);
|
||||
}
|
||||
memset(p->dta, 0x00, sizeof(struct _finddata_t));
|
||||
|
||||
@@ -63,38 +61,36 @@ opendir(const char *name)
|
||||
|
||||
/* Special case: flag if we are in the root directory. */
|
||||
if (strlen(p->dir) == 3)
|
||||
p->flags |= DIR_F_ISROOT;
|
||||
p->flags |= DIR_F_ISROOT;
|
||||
|
||||
/* Start the searching by doing a FindFirst. */
|
||||
p->handle = FINDFIRST(p->dir, (FINDATA *)p->dta);
|
||||
p->handle = FINDFIRST(p->dir, (FINDATA *) p->dta);
|
||||
if (p->handle < 0L) {
|
||||
free(p->dta);
|
||||
free(p);
|
||||
return(NULL);
|
||||
free(p->dta);
|
||||
free(p);
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
/* All OK. */
|
||||
return(p);
|
||||
return (p);
|
||||
}
|
||||
|
||||
|
||||
/* Close an open directory. */
|
||||
int
|
||||
closedir(DIR *p)
|
||||
{
|
||||
if (p == NULL)
|
||||
return(0);
|
||||
return (0);
|
||||
|
||||
_findclose(p->handle);
|
||||
|
||||
if (p->dta != NULL)
|
||||
free(p->dta);
|
||||
free(p->dta);
|
||||
free(p);
|
||||
|
||||
return(0);
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Read the next entry from a directory.
|
||||
* Note that the DOS (FAT), Windows (FAT, FAT32) and Windows NTFS
|
||||
@@ -108,26 +104,26 @@ readdir(DIR *p)
|
||||
FINDATA *ffp;
|
||||
|
||||
if (p == NULL || p->sts == 1)
|
||||
return(NULL);
|
||||
return (NULL);
|
||||
|
||||
/* Format structure with current data. */
|
||||
ffp = (FINDATA *)p->dta;
|
||||
ffp = (FINDATA *) p->dta;
|
||||
p->dent.d_ino = 1L;
|
||||
p->dent.d_off = p->offset++;
|
||||
switch(p->offset) {
|
||||
case 1: /* . */
|
||||
strncpy(p->dent.d_name, ".", MAXNAMLEN+1);
|
||||
p->dent.d_reclen = 1;
|
||||
break;
|
||||
switch (p->offset) {
|
||||
case 1: /* . */
|
||||
strncpy(p->dent.d_name, ".", MAXNAMLEN + 1);
|
||||
p->dent.d_reclen = 1;
|
||||
break;
|
||||
|
||||
case 2: /* .. */
|
||||
strncpy(p->dent.d_name, "..", MAXNAMLEN+1);
|
||||
p->dent.d_reclen = 2;
|
||||
break;
|
||||
case 2: /* .. */
|
||||
strncpy(p->dent.d_name, "..", MAXNAMLEN + 1);
|
||||
p->dent.d_reclen = 2;
|
||||
break;
|
||||
|
||||
default: /* regular entry. */
|
||||
strncpy(p->dent.d_name, ffp->name, MAXNAMLEN+1);
|
||||
p->dent.d_reclen = (char)strlen(p->dent.d_name);
|
||||
default: /* regular entry. */
|
||||
strncpy(p->dent.d_name, ffp->name, MAXNAMLEN + 1);
|
||||
p->dent.d_reclen = (char) strlen(p->dent.d_name);
|
||||
}
|
||||
|
||||
/* Read next entry. */
|
||||
@@ -135,48 +131,47 @@ readdir(DIR *p)
|
||||
|
||||
/* Fake the "." and ".." entries here.. */
|
||||
if ((p->flags & DIR_F_ISROOT) && (p->offset <= 2))
|
||||
return(&(p->dent));
|
||||
return (&(p->dent));
|
||||
|
||||
/* Get the next entry if we did not fake the above. */
|
||||
if (FINDNEXT(p->handle, ffp) < 0)
|
||||
p->sts = 1;
|
||||
p->sts = 1;
|
||||
|
||||
return(&(p->dent));
|
||||
return (&(p->dent));
|
||||
}
|
||||
|
||||
|
||||
/* Report current position within the directory. */
|
||||
long
|
||||
telldir(DIR *p)
|
||||
{
|
||||
return(p->offset);
|
||||
return (p->offset);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
seekdir(DIR *p, long newpos)
|
||||
{
|
||||
short pos;
|
||||
|
||||
/* First off, rewind to start of directory. */
|
||||
p->handle = FINDFIRST(p->dir, (FINDATA *)p->dta);
|
||||
p->handle = FINDFIRST(p->dir, (FINDATA *) p->dta);
|
||||
if (p->handle < 0L) {
|
||||
p->sts = 1;
|
||||
return;
|
||||
p->sts = 1;
|
||||
return;
|
||||
}
|
||||
p->offset = 0;
|
||||
p->sts = 0;
|
||||
p->sts = 0;
|
||||
|
||||
/* If we are rewinding, that's all... */
|
||||
if (newpos == 0L) return;
|
||||
if (newpos == 0L)
|
||||
return;
|
||||
|
||||
/* Nope.. read entries until we hit the right spot. */
|
||||
pos = (short) newpos;
|
||||
while (p->offset != pos) {
|
||||
p->offset++;
|
||||
if (FINDNEXT(p->handle, (FINDATA *)p->dta) < 0) {
|
||||
p->sts = 1;
|
||||
return;
|
||||
}
|
||||
p->offset++;
|
||||
if (FINDNEXT(p->handle, (FINDATA *) p->dta) < 0) {
|
||||
p->sts = 1;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
1476
src/win/win_opengl.c
1476
src/win/win_opengl.c
File diff suppressed because it is too large
Load Diff
@@ -40,10 +40,10 @@
|
||||
#include <86box/plat.h>
|
||||
#include <86box/win_opengl_glslp.h>
|
||||
|
||||
/**
|
||||
* @brief Default vertex shader.
|
||||
/**
|
||||
* @brief Default vertex shader.
|
||||
*/
|
||||
static const GLchar* vertex_shader = "#version 130\n\
|
||||
static const GLchar *vertex_shader = "#version 130\n\
|
||||
in vec2 VertexCoord;\n\
|
||||
in vec2 TexCoord;\n\
|
||||
out vec2 tex;\n\
|
||||
@@ -55,7 +55,7 @@ void main(){\n\
|
||||
/**
|
||||
* @brief Default fragment shader.
|
||||
*/
|
||||
static const GLchar* fragment_shader = "#version 130\n\
|
||||
static const GLchar *fragment_shader = "#version 130\n\
|
||||
in vec2 tex;\n\
|
||||
uniform sampler2D texsampler;\n\
|
||||
out vec4 color;\n\
|
||||
@@ -65,208 +65,204 @@ void main() {\n\
|
||||
|
||||
/**
|
||||
* @brief OpenGL shader program build targets
|
||||
*/
|
||||
typedef enum
|
||||
{
|
||||
OPENGL_BUILD_TARGET_VERTEX,
|
||||
OPENGL_BUILD_TARGET_FRAGMENT,
|
||||
OPENGL_BUILD_TARGET_LINK
|
||||
*/
|
||||
typedef enum {
|
||||
OPENGL_BUILD_TARGET_VERTEX,
|
||||
OPENGL_BUILD_TARGET_FRAGMENT,
|
||||
OPENGL_BUILD_TARGET_LINK
|
||||
} opengl_build_target_t;
|
||||
|
||||
/**
|
||||
* @brief Reads a whole file into a null terminated string.
|
||||
* @param Path Path to the file relative to executable path.
|
||||
* @return Pointer to the string or NULL on error. Remember to free() after use.
|
||||
*/
|
||||
static char* read_file_to_string(const char* path)
|
||||
*/
|
||||
static char *
|
||||
read_file_to_string(const char *path)
|
||||
{
|
||||
FILE* file_handle = plat_fopen(path, "rb");
|
||||
FILE *file_handle = plat_fopen(path, "rb");
|
||||
|
||||
if (file_handle != NULL)
|
||||
{
|
||||
/* get file size */
|
||||
fseek(file_handle, 0, SEEK_END);
|
||||
if (file_handle != NULL) {
|
||||
/* get file size */
|
||||
fseek(file_handle, 0, SEEK_END);
|
||||
|
||||
size_t file_size = (size_t)ftell(file_handle);
|
||||
size_t file_size = (size_t) ftell(file_handle);
|
||||
|
||||
fseek(file_handle, 0, SEEK_SET);
|
||||
fseek(file_handle, 0, SEEK_SET);
|
||||
|
||||
/* read to buffer and close */
|
||||
char* content = (char*)malloc(sizeof(char) * (file_size + 1));
|
||||
/* read to buffer and close */
|
||||
char *content = (char *) malloc(sizeof(char) * (file_size + 1));
|
||||
|
||||
if (!content)
|
||||
return NULL;
|
||||
if (!content)
|
||||
return NULL;
|
||||
|
||||
size_t length = fread(content, sizeof(char), file_size, file_handle);
|
||||
size_t length = fread(content, sizeof(char), file_size, file_handle);
|
||||
|
||||
fclose(file_handle);
|
||||
fclose(file_handle);
|
||||
|
||||
content[length] = 0;
|
||||
content[length] = 0;
|
||||
|
||||
return content;
|
||||
}
|
||||
return NULL;
|
||||
return content;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static int check_status(GLuint id, opengl_build_target_t build_target, const char* shader_path)
|
||||
static int
|
||||
check_status(GLuint id, opengl_build_target_t build_target, const char *shader_path)
|
||||
{
|
||||
GLint status = GL_FALSE;
|
||||
GLint status = GL_FALSE;
|
||||
|
||||
if (build_target != OPENGL_BUILD_TARGET_LINK)
|
||||
glGetShaderiv(id, GL_COMPILE_STATUS, &status);
|
||||
else
|
||||
glGetProgramiv(id, GL_LINK_STATUS, &status);
|
||||
if (build_target != OPENGL_BUILD_TARGET_LINK)
|
||||
glGetShaderiv(id, GL_COMPILE_STATUS, &status);
|
||||
else
|
||||
glGetProgramiv(id, GL_LINK_STATUS, &status);
|
||||
|
||||
if (status == GL_FALSE)
|
||||
{
|
||||
int info_log_length;
|
||||
if (status == GL_FALSE) {
|
||||
int info_log_length;
|
||||
|
||||
if (build_target != OPENGL_BUILD_TARGET_LINK)
|
||||
glGetShaderiv(id, GL_INFO_LOG_LENGTH, &info_log_length);
|
||||
else
|
||||
glGetProgramiv(id, GL_INFO_LOG_LENGTH, &info_log_length);
|
||||
if (build_target != OPENGL_BUILD_TARGET_LINK)
|
||||
glGetShaderiv(id, GL_INFO_LOG_LENGTH, &info_log_length);
|
||||
else
|
||||
glGetProgramiv(id, GL_INFO_LOG_LENGTH, &info_log_length);
|
||||
|
||||
GLchar* info_log_text = (GLchar*)malloc(sizeof(GLchar) * info_log_length);
|
||||
GLchar *info_log_text = (GLchar *) malloc(sizeof(GLchar) * info_log_length);
|
||||
|
||||
if (build_target != OPENGL_BUILD_TARGET_LINK)
|
||||
glGetShaderInfoLog(id, info_log_length, NULL, info_log_text);
|
||||
else
|
||||
glGetProgramInfoLog(id, info_log_length, NULL, info_log_text);
|
||||
if (build_target != OPENGL_BUILD_TARGET_LINK)
|
||||
glGetShaderInfoLog(id, info_log_length, NULL, info_log_text);
|
||||
else
|
||||
glGetProgramInfoLog(id, info_log_length, NULL, info_log_text);
|
||||
|
||||
const char* reason = NULL;
|
||||
const char *reason = NULL;
|
||||
|
||||
switch (build_target)
|
||||
{
|
||||
case OPENGL_BUILD_TARGET_VERTEX:
|
||||
reason = "compiling vertex shader";
|
||||
break;
|
||||
case OPENGL_BUILD_TARGET_FRAGMENT:
|
||||
reason = "compiling fragment shader";
|
||||
break;
|
||||
case OPENGL_BUILD_TARGET_LINK:
|
||||
reason = "linking shader program";
|
||||
break;
|
||||
}
|
||||
switch (build_target) {
|
||||
case OPENGL_BUILD_TARGET_VERTEX:
|
||||
reason = "compiling vertex shader";
|
||||
break;
|
||||
case OPENGL_BUILD_TARGET_FRAGMENT:
|
||||
reason = "compiling fragment shader";
|
||||
break;
|
||||
case OPENGL_BUILD_TARGET_LINK:
|
||||
reason = "linking shader program";
|
||||
break;
|
||||
}
|
||||
|
||||
/* Shader compilation log can be lengthy, mark begin and end */
|
||||
const char* line = "--------------------";
|
||||
/* Shader compilation log can be lengthy, mark begin and end */
|
||||
const char *line = "--------------------";
|
||||
|
||||
pclog("OpenGL: Error when %s in %s:\n%sBEGIN%s\n%s\n%s END %s\n", reason, shader_path, line, line, info_log_text, line, line);
|
||||
pclog("OpenGL: Error when %s in %s:\n%sBEGIN%s\n%s\n%s END %s\n", reason, shader_path, line, line, info_log_text, line, line);
|
||||
|
||||
free(info_log_text);
|
||||
free(info_log_text);
|
||||
|
||||
return 0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
return 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Compile custom shaders into a program.
|
||||
* @return Shader program identifier.
|
||||
*/
|
||||
GLuint load_custom_shaders(const char* path)
|
||||
*/
|
||||
GLuint
|
||||
load_custom_shaders(const char *path)
|
||||
{
|
||||
char* shader = read_file_to_string(path);
|
||||
char *shader = read_file_to_string(path);
|
||||
|
||||
if (shader != NULL)
|
||||
{
|
||||
int success = 1;
|
||||
if (shader != NULL) {
|
||||
int success = 1;
|
||||
|
||||
const char* vertex_sources[3] = { "#version 130\n", "#define VERTEX\n", shader };
|
||||
const char* fragment_sources[3] = { "#version 130\n", "#define FRAGMENT\n", shader };
|
||||
const char *vertex_sources[3] = { "#version 130\n", "#define VERTEX\n", shader };
|
||||
const char *fragment_sources[3] = { "#version 130\n", "#define FRAGMENT\n", shader };
|
||||
|
||||
/* Check if the shader program defines version directive */
|
||||
char* version_start = strstr(shader, "#version");
|
||||
/* Check if the shader program defines version directive */
|
||||
char *version_start = strstr(shader, "#version");
|
||||
|
||||
/* If the shader program contains a version directive,
|
||||
it must be captured and placed as the first statement. */
|
||||
if (version_start != NULL)
|
||||
{
|
||||
/* Version directive found, search the line end */
|
||||
char* version_end = strchr(version_start, '\n');
|
||||
/* If the shader program contains a version directive,
|
||||
it must be captured and placed as the first statement. */
|
||||
if (version_start != NULL) {
|
||||
/* Version directive found, search the line end */
|
||||
char *version_end = strchr(version_start, '\n');
|
||||
|
||||
if (version_end != NULL)
|
||||
{
|
||||
char version[30] = "";
|
||||
if (version_end != NULL) {
|
||||
char version[30] = "";
|
||||
|
||||
size_t version_len = MIN(version_end - version_start + 1, 29);
|
||||
size_t version_len = MIN(version_end - version_start + 1, 29);
|
||||
|
||||
strncat(version, version_start, version_len);
|
||||
strncat(version, version_start, version_len);
|
||||
|
||||
/* replace the default version directive */
|
||||
vertex_sources[0] = version;
|
||||
fragment_sources[0] = version;
|
||||
}
|
||||
/* replace the default version directive */
|
||||
vertex_sources[0] = version;
|
||||
fragment_sources[0] = version;
|
||||
}
|
||||
|
||||
/* Comment out the original version directive
|
||||
as only one is allowed. */
|
||||
memset(version_start, '/', 2);
|
||||
}
|
||||
/* Comment out the original version directive
|
||||
as only one is allowed. */
|
||||
memset(version_start, '/', 2);
|
||||
}
|
||||
|
||||
GLuint vertex_id = glCreateShader(GL_VERTEX_SHADER);
|
||||
GLuint fragment_id = glCreateShader(GL_FRAGMENT_SHADER);
|
||||
GLuint vertex_id = glCreateShader(GL_VERTEX_SHADER);
|
||||
GLuint fragment_id = glCreateShader(GL_FRAGMENT_SHADER);
|
||||
|
||||
glShaderSource(vertex_id, 3, vertex_sources, NULL);
|
||||
glCompileShader(vertex_id);
|
||||
success *= check_status(vertex_id, OPENGL_BUILD_TARGET_VERTEX, path);
|
||||
glShaderSource(vertex_id, 3, vertex_sources, NULL);
|
||||
glCompileShader(vertex_id);
|
||||
success *= check_status(vertex_id, OPENGL_BUILD_TARGET_VERTEX, path);
|
||||
|
||||
glShaderSource(fragment_id, 3, fragment_sources, NULL);
|
||||
glCompileShader(fragment_id);
|
||||
success *= check_status(fragment_id, OPENGL_BUILD_TARGET_FRAGMENT, path);
|
||||
glShaderSource(fragment_id, 3, fragment_sources, NULL);
|
||||
glCompileShader(fragment_id);
|
||||
success *= check_status(fragment_id, OPENGL_BUILD_TARGET_FRAGMENT, path);
|
||||
|
||||
free(shader);
|
||||
free(shader);
|
||||
|
||||
GLuint prog_id = 0;
|
||||
GLuint prog_id = 0;
|
||||
|
||||
if (success)
|
||||
{
|
||||
prog_id = glCreateProgram();
|
||||
if (success) {
|
||||
prog_id = glCreateProgram();
|
||||
|
||||
glAttachShader(prog_id, vertex_id);
|
||||
glAttachShader(prog_id, fragment_id);
|
||||
glLinkProgram(prog_id);
|
||||
check_status(prog_id, OPENGL_BUILD_TARGET_LINK, path);
|
||||
glAttachShader(prog_id, vertex_id);
|
||||
glAttachShader(prog_id, fragment_id);
|
||||
glLinkProgram(prog_id);
|
||||
check_status(prog_id, OPENGL_BUILD_TARGET_LINK, path);
|
||||
|
||||
glDetachShader(prog_id, vertex_id);
|
||||
glDetachShader(prog_id, fragment_id);
|
||||
}
|
||||
glDetachShader(prog_id, vertex_id);
|
||||
glDetachShader(prog_id, fragment_id);
|
||||
}
|
||||
|
||||
glDeleteShader(vertex_id);
|
||||
glDeleteShader(fragment_id);
|
||||
glDeleteShader(vertex_id);
|
||||
glDeleteShader(fragment_id);
|
||||
|
||||
return prog_id;
|
||||
}
|
||||
return 0;
|
||||
return prog_id;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Compile default shaders into a program.
|
||||
* @return Shader program identifier.
|
||||
*/
|
||||
GLuint load_default_shaders()
|
||||
*/
|
||||
GLuint
|
||||
load_default_shaders()
|
||||
{
|
||||
GLuint vertex_id = glCreateShader(GL_VERTEX_SHADER);
|
||||
GLuint fragment_id = glCreateShader(GL_FRAGMENT_SHADER);
|
||||
GLuint vertex_id = glCreateShader(GL_VERTEX_SHADER);
|
||||
GLuint fragment_id = glCreateShader(GL_FRAGMENT_SHADER);
|
||||
|
||||
glShaderSource(vertex_id, 1, &vertex_shader, NULL);
|
||||
glCompileShader(vertex_id);
|
||||
glShaderSource(vertex_id, 1, &vertex_shader, NULL);
|
||||
glCompileShader(vertex_id);
|
||||
|
||||
glShaderSource(fragment_id, 1, &fragment_shader, NULL);
|
||||
glCompileShader(fragment_id);
|
||||
glShaderSource(fragment_id, 1, &fragment_shader, NULL);
|
||||
glCompileShader(fragment_id);
|
||||
|
||||
GLuint prog_id = glCreateProgram();
|
||||
GLuint prog_id = glCreateProgram();
|
||||
|
||||
glAttachShader(prog_id, vertex_id);
|
||||
glAttachShader(prog_id, fragment_id);
|
||||
glAttachShader(prog_id, vertex_id);
|
||||
glAttachShader(prog_id, fragment_id);
|
||||
|
||||
glLinkProgram(prog_id);
|
||||
glLinkProgram(prog_id);
|
||||
|
||||
glDetachShader(prog_id, vertex_id);
|
||||
glDetachShader(prog_id, fragment_id);
|
||||
glDetachShader(prog_id, vertex_id);
|
||||
glDetachShader(prog_id, fragment_id);
|
||||
|
||||
glDeleteShader(vertex_id);
|
||||
glDeleteShader(fragment_id);
|
||||
glDeleteShader(vertex_id);
|
||||
glDeleteShader(fragment_id);
|
||||
|
||||
return prog_id;
|
||||
return prog_id;
|
||||
}
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
/* Language */
|
||||
static LCID temp_language;
|
||||
|
||||
static char temp_icon_set[256] = {0};
|
||||
static char temp_icon_set[256] = { 0 };
|
||||
|
||||
int enum_helper, c;
|
||||
|
||||
@@ -44,112 +44,108 @@ HWND hwndPreferences;
|
||||
BOOL CALLBACK
|
||||
EnumResLangProc(HMODULE hModule, LPCTSTR lpszType, LPCTSTR lpszName, WORD wIDLanguage, LONG_PTR lParam)
|
||||
{
|
||||
wchar_t temp[LOCALE_NAME_MAX_LENGTH + 1];
|
||||
LCIDToLocaleName(wIDLanguage, temp, LOCALE_NAME_MAX_LENGTH, 0);
|
||||
wchar_t dispname[MAX_PATH + 1];
|
||||
GetLocaleInfoEx(temp, LOCALE_SENGLISHDISPLAYNAME, dispname, MAX_PATH);
|
||||
SendMessage((HWND)lParam, CB_ADDSTRING, 0, (LPARAM)dispname);
|
||||
SendMessage((HWND)lParam, CB_SETITEMDATA, c, (LPARAM)wIDLanguage);
|
||||
wchar_t temp[LOCALE_NAME_MAX_LENGTH + 1];
|
||||
LCIDToLocaleName(wIDLanguage, temp, LOCALE_NAME_MAX_LENGTH, 0);
|
||||
wchar_t dispname[MAX_PATH + 1];
|
||||
GetLocaleInfoEx(temp, LOCALE_SENGLISHDISPLAYNAME, dispname, MAX_PATH);
|
||||
SendMessage((HWND) lParam, CB_ADDSTRING, 0, (LPARAM) dispname);
|
||||
SendMessage((HWND) lParam, CB_SETITEMDATA, c, (LPARAM) wIDLanguage);
|
||||
|
||||
if (wIDLanguage == lang_id)
|
||||
enum_helper = c;
|
||||
c++;
|
||||
if (wIDLanguage == lang_id)
|
||||
enum_helper = c;
|
||||
c++;
|
||||
|
||||
return 1;
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Load available languages */
|
||||
static void
|
||||
preferences_fill_languages(HWND hdlg)
|
||||
{
|
||||
temp_language = GetThreadUILanguage();
|
||||
HWND lang_combo = GetDlgItem(hdlg, IDC_COMBO_LANG);
|
||||
temp_language = GetThreadUILanguage();
|
||||
HWND lang_combo = GetDlgItem(hdlg, IDC_COMBO_LANG);
|
||||
|
||||
SendMessage(lang_combo, CB_RESETCONTENT, 0, 0);
|
||||
SendMessage(lang_combo, CB_ADDSTRING, 0, win_get_string(IDS_7168));
|
||||
SendMessage(lang_combo, CB_SETITEMDATA, 0, 0xFFFF);
|
||||
SendMessage(lang_combo, CB_RESETCONTENT, 0, 0);
|
||||
SendMessage(lang_combo, CB_ADDSTRING, 0, win_get_string(IDS_7168));
|
||||
SendMessage(lang_combo, CB_SETITEMDATA, 0, 0xFFFF);
|
||||
|
||||
enum_helper = 0; c = 1;
|
||||
//if no one is selected, then it was 0xFFFF or unsupported language, in either case go with index enum_helper=0
|
||||
//also start enum index from c=1
|
||||
EnumResourceLanguages(hinstance, RT_MENU, L"MainMenu", &EnumResLangProc, (LPARAM)lang_combo);
|
||||
enum_helper = 0;
|
||||
c = 1;
|
||||
// if no one is selected, then it was 0xFFFF or unsupported language, in either case go with index enum_helper=0
|
||||
// also start enum index from c=1
|
||||
EnumResourceLanguages(hinstance, RT_MENU, L"MainMenu", &EnumResLangProc, (LPARAM) lang_combo);
|
||||
|
||||
SendMessage(lang_combo, CB_SETCURSEL, enum_helper, 0);
|
||||
SendMessage(lang_combo, CB_SETCURSEL, enum_helper, 0);
|
||||
}
|
||||
|
||||
/* Load available iconsets */
|
||||
static void
|
||||
preferences_fill_iconsets(HWND hdlg)
|
||||
{
|
||||
HWND icon_combo = GetDlgItem(hdlg, IDC_COMBO_ICON);
|
||||
HWND icon_combo = GetDlgItem(hdlg, IDC_COMBO_ICON);
|
||||
|
||||
/* Add the default one */
|
||||
wchar_t buffer[512] = L"(";
|
||||
wcscat(buffer, plat_get_string(IDS_2090));
|
||||
wcscat(buffer, L")");
|
||||
/* Add the default one */
|
||||
wchar_t buffer[512] = L"(";
|
||||
wcscat(buffer, plat_get_string(IDS_2090));
|
||||
wcscat(buffer, L")");
|
||||
|
||||
SendMessage(icon_combo, CB_RESETCONTENT, 0, 0);
|
||||
SendMessage(icon_combo, CB_ADDSTRING, 0, (LPARAM)buffer);
|
||||
SendMessage(icon_combo, CB_SETITEMDATA, 0, (LPARAM)strdup(""));
|
||||
SendMessage(icon_combo, CB_RESETCONTENT, 0, 0);
|
||||
SendMessage(icon_combo, CB_ADDSTRING, 0, (LPARAM) buffer);
|
||||
SendMessage(icon_combo, CB_SETITEMDATA, 0, (LPARAM) strdup(""));
|
||||
|
||||
int combo_index = -1;
|
||||
int combo_index = -1;
|
||||
|
||||
/* Find for extra ones */
|
||||
HANDLE hFind;
|
||||
WIN32_FIND_DATA data;
|
||||
/* Find for extra ones */
|
||||
HANDLE hFind;
|
||||
WIN32_FIND_DATA data;
|
||||
|
||||
char icon_path_root[512];
|
||||
win_get_icons_path(icon_path_root);
|
||||
char icon_path_root[512];
|
||||
win_get_icons_path(icon_path_root);
|
||||
|
||||
wchar_t search[512];
|
||||
mbstoc16s(search, icon_path_root, strlen(icon_path_root) + 1);
|
||||
wcscat(search, L"*.*");
|
||||
wchar_t search[512];
|
||||
mbstoc16s(search, icon_path_root, strlen(icon_path_root) + 1);
|
||||
wcscat(search, L"*.*");
|
||||
|
||||
hFind = FindFirstFile((LPCWSTR)search, &data);
|
||||
hFind = FindFirstFile((LPCWSTR) search, &data);
|
||||
|
||||
if (hFind != INVALID_HANDLE_VALUE) {
|
||||
do {
|
||||
if (wcscmp(data.cFileName, L".") && wcscmp(data.cFileName, L"..") &&
|
||||
(data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
|
||||
{
|
||||
wchar_t temp[512] = {0}, dispname[512] = {0};
|
||||
mbstoc16s(temp, icon_path_root, strlen(icon_path_root) + 1);
|
||||
wcscat(temp, data.cFileName);
|
||||
wcscat(temp, L"\\iconinfo.txt");
|
||||
if (hFind != INVALID_HANDLE_VALUE) {
|
||||
do {
|
||||
if (wcscmp(data.cFileName, L".") && wcscmp(data.cFileName, L"..") && (data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) {
|
||||
wchar_t temp[512] = { 0 }, dispname[512] = { 0 };
|
||||
mbstoc16s(temp, icon_path_root, strlen(icon_path_root) + 1);
|
||||
wcscat(temp, data.cFileName);
|
||||
wcscat(temp, L"\\iconinfo.txt");
|
||||
|
||||
wcscpy(dispname, data.cFileName);
|
||||
FILE *fp = _wfopen(temp, L"r");
|
||||
if (fp)
|
||||
{
|
||||
char line[512] = {0};
|
||||
if (fgets(line, 511, fp))
|
||||
{
|
||||
mbstoc16s(dispname, line, strlen(line) + 1);
|
||||
}
|
||||
wcscpy(dispname, data.cFileName);
|
||||
FILE *fp = _wfopen(temp, L"r");
|
||||
if (fp) {
|
||||
char line[512] = { 0 };
|
||||
if (fgets(line, 511, fp)) {
|
||||
mbstoc16s(dispname, line, strlen(line) + 1);
|
||||
}
|
||||
|
||||
fclose(fp);
|
||||
}
|
||||
fclose(fp);
|
||||
}
|
||||
|
||||
char filename[512];
|
||||
c16stombs(filename, data.cFileName, 511);
|
||||
char filename[512];
|
||||
c16stombs(filename, data.cFileName, 511);
|
||||
|
||||
int index = SendMessage(icon_combo, CB_ADDSTRING, 0, (LPARAM)dispname);
|
||||
SendMessage(icon_combo, CB_SETITEMDATA, index, (LPARAM)(strdup(filename)));
|
||||
int index = SendMessage(icon_combo, CB_ADDSTRING, 0, (LPARAM) dispname);
|
||||
SendMessage(icon_combo, CB_SETITEMDATA, index, (LPARAM) (strdup(filename)));
|
||||
|
||||
if (!strcmp(filename, icon_set))
|
||||
combo_index = index;
|
||||
}
|
||||
} while (FindNextFile(hFind, &data));
|
||||
FindClose(hFind);
|
||||
}
|
||||
if (!strcmp(filename, icon_set))
|
||||
combo_index = index;
|
||||
}
|
||||
} while (FindNextFile(hFind, &data));
|
||||
FindClose(hFind);
|
||||
}
|
||||
|
||||
if (combo_index == -1)
|
||||
{
|
||||
combo_index = 0;
|
||||
strcpy(temp_icon_set, "");
|
||||
}
|
||||
if (combo_index == -1) {
|
||||
combo_index = 0;
|
||||
strcpy(temp_icon_set, "");
|
||||
}
|
||||
|
||||
SendMessage(icon_combo, CB_SETCURSEL, combo_index, 0);
|
||||
SendMessage(icon_combo, CB_SETCURSEL, combo_index, 0);
|
||||
}
|
||||
|
||||
/* This returns 1 if any variable has changed, 0 if not. */
|
||||
@@ -209,85 +205,84 @@ static BOOL CALLBACK
|
||||
PreferencesDlgProcedure(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
switch (message) {
|
||||
case WM_INITDIALOG:
|
||||
hwndPreferences = hdlg;
|
||||
/* Language */
|
||||
temp_language = lang_id;
|
||||
strcpy(temp_icon_set, icon_set);
|
||||
preferences_fill_languages(hdlg);
|
||||
preferences_fill_iconsets(hdlg);
|
||||
break;
|
||||
case WM_INITDIALOG:
|
||||
hwndPreferences = hdlg;
|
||||
/* Language */
|
||||
temp_language = lang_id;
|
||||
strcpy(temp_icon_set, icon_set);
|
||||
preferences_fill_languages(hdlg);
|
||||
preferences_fill_iconsets(hdlg);
|
||||
break;
|
||||
|
||||
case WM_COMMAND:
|
||||
switch (LOWORD(wParam)) {
|
||||
case IDOK:
|
||||
if (preferences_settings_changed())
|
||||
preferences_settings_save();
|
||||
EndDialog(hdlg, 0);
|
||||
return TRUE;
|
||||
case WM_COMMAND:
|
||||
switch (LOWORD(wParam)) {
|
||||
case IDOK:
|
||||
if (preferences_settings_changed())
|
||||
preferences_settings_save();
|
||||
EndDialog(hdlg, 0);
|
||||
return TRUE;
|
||||
|
||||
case IDCANCEL:
|
||||
EndDialog(hdlg, 0);
|
||||
return TRUE;
|
||||
case IDCANCEL:
|
||||
EndDialog(hdlg, 0);
|
||||
return TRUE;
|
||||
|
||||
case IDC_COMBO_LANG:
|
||||
if (HIWORD(wParam) == CBN_SELCHANGE) {
|
||||
HWND combo = GetDlgItem(hdlg, IDC_COMBO_LANG);
|
||||
int index = SendMessage(combo, CB_GETCURSEL, 0, 0);
|
||||
temp_language = SendMessage(combo, CB_GETITEMDATA, index, 0);
|
||||
}
|
||||
break;
|
||||
case IDC_COMBO_LANG:
|
||||
if (HIWORD(wParam) == CBN_SELCHANGE) {
|
||||
HWND combo = GetDlgItem(hdlg, IDC_COMBO_LANG);
|
||||
int index = SendMessage(combo, CB_GETCURSEL, 0, 0);
|
||||
temp_language = SendMessage(combo, CB_GETITEMDATA, index, 0);
|
||||
}
|
||||
break;
|
||||
|
||||
case IDC_COMBO_ICON:
|
||||
if (HIWORD(wParam) == CBN_SELCHANGE) {
|
||||
HWND combo = GetDlgItem(hdlg, IDC_COMBO_ICON);
|
||||
int index = SendMessage(combo, CB_GETCURSEL, 0, 0);
|
||||
strcpy(temp_icon_set, (char*)SendMessage(combo, CB_GETITEMDATA, index, 0));
|
||||
}
|
||||
break;
|
||||
case IDC_COMBO_ICON:
|
||||
if (HIWORD(wParam) == CBN_SELCHANGE) {
|
||||
HWND combo = GetDlgItem(hdlg, IDC_COMBO_ICON);
|
||||
int index = SendMessage(combo, CB_GETCURSEL, 0, 0);
|
||||
strcpy(temp_icon_set, (char *) SendMessage(combo, CB_GETITEMDATA, index, 0));
|
||||
}
|
||||
break;
|
||||
|
||||
case IDC_BUTTON_DEFAULT: {
|
||||
HWND combo = GetDlgItem(hdlg, IDC_COMBO_LANG);
|
||||
int index = preferences_indexof(combo, DEFAULT_LANGUAGE);
|
||||
SendMessage(combo, CB_SETCURSEL, index, 0);
|
||||
temp_language = DEFAULT_LANGUAGE;
|
||||
break;
|
||||
}
|
||||
case IDC_BUTTON_DEFAULT:
|
||||
{
|
||||
HWND combo = GetDlgItem(hdlg, IDC_COMBO_LANG);
|
||||
int index = preferences_indexof(combo, DEFAULT_LANGUAGE);
|
||||
SendMessage(combo, CB_SETCURSEL, index, 0);
|
||||
temp_language = DEFAULT_LANGUAGE;
|
||||
break;
|
||||
}
|
||||
|
||||
case IDC_BUTTON_DEFICON: {
|
||||
SendMessage(GetDlgItem(hdlg, IDC_COMBO_ICON), CB_SETCURSEL, 0, 0);
|
||||
strcpy(temp_icon_set, "");
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case WM_DESTROY: {
|
||||
int i;
|
||||
LRESULT temp;
|
||||
HWND combo = GetDlgItem(hdlg, IDC_COMBO_ICON);
|
||||
for (i = 0; i < SendMessage(combo, CB_GETCOUNT, 0, 0); i++)
|
||||
{
|
||||
temp = SendMessage(combo, CB_GETITEMDATA, i, 0);
|
||||
if (temp)
|
||||
{
|
||||
free((void*)temp);
|
||||
SendMessage(combo, CB_SETITEMDATA, i, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case IDC_BUTTON_DEFICON:
|
||||
{
|
||||
SendMessage(GetDlgItem(hdlg, IDC_COMBO_ICON), CB_SETCURSEL, 0, 0);
|
||||
strcpy(temp_icon_set, "");
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case WM_DESTROY:
|
||||
{
|
||||
int i;
|
||||
LRESULT temp;
|
||||
HWND combo = GetDlgItem(hdlg, IDC_COMBO_ICON);
|
||||
for (i = 0; i < SendMessage(combo, CB_GETCOUNT, 0, 0); i++) {
|
||||
temp = SendMessage(combo, CB_GETITEMDATA, i, 0);
|
||||
if (temp) {
|
||||
free((void *) temp);
|
||||
SendMessage(combo, CB_SETITEMDATA, i, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return(FALSE);
|
||||
return (FALSE);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
PreferencesDlgCreate(HWND hwnd)
|
||||
{
|
||||
DialogBox(hinstance, (LPCTSTR)DLG_PREFERENCES, hwnd, PreferencesDlgProcedure);
|
||||
DialogBox(hinstance, (LPCTSTR) DLG_PREFERENCES, hwnd, PreferencesDlgProcedure);
|
||||
}
|
||||
|
||||
@@ -72,48 +72,45 @@
|
||||
#include <86box/win_sdl.h>
|
||||
#include <86box/version.h>
|
||||
|
||||
#define RENDERER_FULL_SCREEN 1
|
||||
#define RENDERER_HARDWARE 2
|
||||
#define RENDERER_OPENGL 4
|
||||
|
||||
#define RENDERER_FULL_SCREEN 1
|
||||
#define RENDERER_HARDWARE 2
|
||||
#define RENDERER_OPENGL 4
|
||||
|
||||
|
||||
static SDL_Window *sdl_win = NULL;
|
||||
static SDL_Renderer *sdl_render = NULL;
|
||||
static SDL_Texture *sdl_tex = NULL;
|
||||
static HWND sdl_parent_hwnd = NULL;
|
||||
static int sdl_w, sdl_h;
|
||||
static int sdl_fs, sdl_flags = -1;
|
||||
static int cur_w, cur_h;
|
||||
static int cur_wx = 0, cur_wy = 0, cur_ww =0, cur_wh = 0;
|
||||
static volatile int sdl_enabled = 0;
|
||||
static SDL_mutex* sdl_mutex = NULL;
|
||||
|
||||
static SDL_Window *sdl_win = NULL;
|
||||
static SDL_Renderer *sdl_render = NULL;
|
||||
static SDL_Texture *sdl_tex = NULL;
|
||||
static HWND sdl_parent_hwnd = NULL;
|
||||
static int sdl_w, sdl_h;
|
||||
static int sdl_fs, sdl_flags = -1;
|
||||
static int cur_w, cur_h;
|
||||
static int cur_wx = 0, cur_wy = 0, cur_ww = 0, cur_wh = 0;
|
||||
static volatile int sdl_enabled = 0;
|
||||
static SDL_mutex *sdl_mutex = NULL;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
const void *magic;
|
||||
Uint32 id;
|
||||
char *title;
|
||||
const void *magic;
|
||||
Uint32 id;
|
||||
char *title;
|
||||
SDL_Surface *icon;
|
||||
int x, y;
|
||||
int w, h;
|
||||
int min_w, min_h;
|
||||
int max_w, max_h;
|
||||
Uint32 flags;
|
||||
Uint32 last_fullscreen_flags;
|
||||
int x, y;
|
||||
int w, h;
|
||||
int min_w, min_h;
|
||||
int max_w, max_h;
|
||||
Uint32 flags;
|
||||
Uint32 last_fullscreen_flags;
|
||||
|
||||
/* Stored position and size for windowed mode */
|
||||
SDL_Rect windowed;
|
||||
|
||||
SDL_DisplayMode fullscreen_mode;
|
||||
|
||||
float brightness;
|
||||
float brightness;
|
||||
Uint16 *gamma;
|
||||
Uint16 *saved_gamma; /* (just offset into gamma) */
|
||||
Uint16 *saved_gamma; /* (just offset into gamma) */
|
||||
|
||||
SDL_Surface *surface;
|
||||
SDL_bool surface_valid;
|
||||
SDL_bool surface_valid;
|
||||
|
||||
SDL_bool is_hiding;
|
||||
SDL_bool is_destroying;
|
||||
@@ -121,7 +118,7 @@ typedef struct
|
||||
void *shaper;
|
||||
|
||||
SDL_HitTest hit_test;
|
||||
void *hit_test_data;
|
||||
void *hit_test_data;
|
||||
|
||||
void *data;
|
||||
|
||||
@@ -131,112 +128,107 @@ typedef struct
|
||||
SDL_Window *next;
|
||||
} SDL_Window_Ex;
|
||||
|
||||
|
||||
#ifdef ENABLE_SDL_LOG
|
||||
int sdl_do_log = ENABLE_SDL_LOG;
|
||||
|
||||
|
||||
static void
|
||||
sdl_log(const char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
|
||||
if (sdl_do_log) {
|
||||
va_start(ap, fmt);
|
||||
pclog_ex(fmt, ap);
|
||||
va_end(ap);
|
||||
va_start(ap, fmt);
|
||||
pclog_ex(fmt, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
}
|
||||
#else
|
||||
#define sdl_log(fmt, ...)
|
||||
# define sdl_log(fmt, ...)
|
||||
#endif
|
||||
|
||||
|
||||
static void
|
||||
sdl_integer_scale(double *d, double *g)
|
||||
{
|
||||
double ratio;
|
||||
|
||||
if (*d > *g) {
|
||||
ratio = floor(*d / *g);
|
||||
*d = *g * ratio;
|
||||
ratio = floor(*d / *g);
|
||||
*d = *g * ratio;
|
||||
} else {
|
||||
ratio = ceil(*d / *g);
|
||||
*d = *g / ratio;
|
||||
ratio = ceil(*d / *g);
|
||||
*d = *g / ratio;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
sdl_stretch(int *w, int *h, int *x, int *y)
|
||||
{
|
||||
double hw, gw, hh, gh, dx, dy, dw, dh, gsr, hsr;
|
||||
|
||||
hw = (double) sdl_w;
|
||||
hh = (double) sdl_h;
|
||||
gw = (double) *w;
|
||||
gh = (double) *h;
|
||||
hw = (double) sdl_w;
|
||||
hh = (double) sdl_h;
|
||||
gw = (double) *w;
|
||||
gh = (double) *h;
|
||||
hsr = hw / hh;
|
||||
|
||||
switch (video_fullscreen_scale) {
|
||||
case FULLSCR_SCALE_FULL:
|
||||
default:
|
||||
*w = sdl_w;
|
||||
*h = sdl_h;
|
||||
*x = 0;
|
||||
*y = 0;
|
||||
break;
|
||||
case FULLSCR_SCALE_43:
|
||||
case FULLSCR_SCALE_KEEPRATIO:
|
||||
if (video_fullscreen_scale == FULLSCR_SCALE_43)
|
||||
gsr = 4.0 / 3.0;
|
||||
else
|
||||
gsr = gw / gh;
|
||||
if (gsr <= hsr) {
|
||||
dw = hh * gsr;
|
||||
dh = hh;
|
||||
} else {
|
||||
dw = hw;
|
||||
dh = hw / gsr;
|
||||
}
|
||||
dx = (hw - dw) / 2.0;
|
||||
dy = (hh - dh) / 2.0;
|
||||
*w = (int) dw;
|
||||
*h = (int) dh;
|
||||
*x = (int) dx;
|
||||
*y = (int) dy;
|
||||
break;
|
||||
case FULLSCR_SCALE_INT:
|
||||
gsr = gw / gh;
|
||||
if (gsr <= hsr) {
|
||||
dw = hh * gsr;
|
||||
dh = hh;
|
||||
} else {
|
||||
dw = hw;
|
||||
dh = hw / gsr;
|
||||
}
|
||||
sdl_integer_scale(&dw, &gw);
|
||||
sdl_integer_scale(&dh, &gh);
|
||||
dx = (hw - dw) / 2.0;
|
||||
dy = (hh - dh) / 2.0;
|
||||
*w = (int) dw;
|
||||
*h = (int) dh;
|
||||
*x = (int) dx;
|
||||
*y = (int) dy;
|
||||
break;
|
||||
case FULLSCR_SCALE_FULL:
|
||||
default:
|
||||
*w = sdl_w;
|
||||
*h = sdl_h;
|
||||
*x = 0;
|
||||
*y = 0;
|
||||
break;
|
||||
case FULLSCR_SCALE_43:
|
||||
case FULLSCR_SCALE_KEEPRATIO:
|
||||
if (video_fullscreen_scale == FULLSCR_SCALE_43)
|
||||
gsr = 4.0 / 3.0;
|
||||
else
|
||||
gsr = gw / gh;
|
||||
if (gsr <= hsr) {
|
||||
dw = hh * gsr;
|
||||
dh = hh;
|
||||
} else {
|
||||
dw = hw;
|
||||
dh = hw / gsr;
|
||||
}
|
||||
dx = (hw - dw) / 2.0;
|
||||
dy = (hh - dh) / 2.0;
|
||||
*w = (int) dw;
|
||||
*h = (int) dh;
|
||||
*x = (int) dx;
|
||||
*y = (int) dy;
|
||||
break;
|
||||
case FULLSCR_SCALE_INT:
|
||||
gsr = gw / gh;
|
||||
if (gsr <= hsr) {
|
||||
dw = hh * gsr;
|
||||
dh = hh;
|
||||
} else {
|
||||
dw = hw;
|
||||
dh = hw / gsr;
|
||||
}
|
||||
sdl_integer_scale(&dw, &gw);
|
||||
sdl_integer_scale(&dh, &gh);
|
||||
dx = (hw - dw) / 2.0;
|
||||
dy = (hh - dh) / 2.0;
|
||||
*w = (int) dw;
|
||||
*h = (int) dh;
|
||||
*x = (int) dx;
|
||||
*y = (int) dy;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
sdl_blit(int x, int y, int w, int h, int monitor_index)
|
||||
{
|
||||
SDL_Rect r_src;
|
||||
int ret;
|
||||
int ret;
|
||||
|
||||
if (!sdl_enabled || (x < 0) || (y < 0) || (w <= 0) || (h <= 0) || (w > 2048) || (h > 2048) || (buffer32 == NULL) || (sdl_render == NULL) || (sdl_tex == NULL) || monitor_index >= 1) {
|
||||
video_blit_complete_monitor(monitor_index);
|
||||
return;
|
||||
video_blit_complete_monitor(monitor_index);
|
||||
return;
|
||||
}
|
||||
|
||||
SDL_LockMutex(sdl_mutex);
|
||||
@@ -248,7 +240,7 @@ sdl_blit(int x, int y, int w, int h, int monitor_index)
|
||||
SDL_UpdateTexture(sdl_tex, &r_src, &(buffer32->line[y][x]), 2048 * sizeof(uint32_t));
|
||||
|
||||
if (monitors[0].mon_screenshots)
|
||||
video_screenshot((uint32_t *) buffer32->dat, x, y, 2048);
|
||||
video_screenshot((uint32_t *) buffer32->dat, x, y, 2048);
|
||||
|
||||
video_blit_complete();
|
||||
|
||||
@@ -261,24 +253,23 @@ sdl_blit(int x, int y, int w, int h, int monitor_index)
|
||||
|
||||
ret = SDL_RenderCopy(sdl_render, sdl_tex, &r_src, 0);
|
||||
if (ret)
|
||||
sdl_log("SDL: unable to copy texture to renderer (%s)\n", sdl_GetError());
|
||||
sdl_log("SDL: unable to copy texture to renderer (%s)\n", sdl_GetError());
|
||||
|
||||
SDL_RenderPresent(sdl_render);
|
||||
SDL_UnlockMutex(sdl_mutex);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
sdl_blit_ex(int x, int y, int w, int h, int monitor_index)
|
||||
{
|
||||
SDL_Rect r_src;
|
||||
void *pixeldata;
|
||||
int pitch, ret;
|
||||
int row;
|
||||
void *pixeldata;
|
||||
int pitch, ret;
|
||||
int row;
|
||||
|
||||
if (!sdl_enabled || (x < 0) || (y < 0) || (w <= 0) || (h <= 0) || (w > 2048) || (h > 2048) || (buffer32 == NULL) || (sdl_render == NULL) || (sdl_tex == NULL)) {
|
||||
video_blit_complete();
|
||||
return;
|
||||
video_blit_complete();
|
||||
return;
|
||||
}
|
||||
|
||||
SDL_LockMutex(sdl_mutex);
|
||||
@@ -286,10 +277,10 @@ sdl_blit_ex(int x, int y, int w, int h, int monitor_index)
|
||||
SDL_LockTexture(sdl_tex, 0, &pixeldata, &pitch);
|
||||
|
||||
for (row = 0; row < h; ++row)
|
||||
video_copy(&(((uint8_t *) pixeldata)[row * 2048 * sizeof(uint32_t)]), &(buffer32->line[y + row][x]), w * sizeof(uint32_t));
|
||||
video_copy(&(((uint8_t *) pixeldata)[row * 2048 * sizeof(uint32_t)]), &(buffer32->line[y + row][x]), w * sizeof(uint32_t));
|
||||
|
||||
if (monitors[0].mon_screenshots)
|
||||
video_screenshot((uint32_t *) pixeldata, 0, 0, 2048);
|
||||
video_screenshot((uint32_t *) pixeldata, 0, 0, 2048);
|
||||
|
||||
SDL_UnlockTexture(sdl_tex);
|
||||
|
||||
@@ -304,54 +295,51 @@ sdl_blit_ex(int x, int y, int w, int h, int monitor_index)
|
||||
|
||||
ret = SDL_RenderCopy(sdl_render, sdl_tex, &r_src, 0);
|
||||
if (ret)
|
||||
sdl_log("SDL: unable to copy texture to renderer (%s)\n", sdl_GetError());
|
||||
sdl_log("SDL: unable to copy texture to renderer (%s)\n", sdl_GetError());
|
||||
|
||||
SDL_RenderPresent(sdl_render);
|
||||
SDL_UnlockMutex(sdl_mutex);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
sdl_destroy_window(void)
|
||||
{
|
||||
if (sdl_win != NULL) {
|
||||
SDL_DestroyWindow(sdl_win);
|
||||
sdl_win = NULL;
|
||||
SDL_DestroyWindow(sdl_win);
|
||||
sdl_win = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
sdl_destroy_texture(void)
|
||||
{
|
||||
if (sdl_tex != NULL) {
|
||||
SDL_DestroyTexture(sdl_tex);
|
||||
sdl_tex = NULL;
|
||||
SDL_DestroyTexture(sdl_tex);
|
||||
sdl_tex = NULL;
|
||||
}
|
||||
|
||||
/* SDL_DestroyRenderer also automatically destroys all associated textures. */
|
||||
if (sdl_render != NULL) {
|
||||
SDL_DestroyRenderer(sdl_render);
|
||||
sdl_render = NULL;
|
||||
SDL_DestroyRenderer(sdl_render);
|
||||
sdl_render = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
sdl_close(void)
|
||||
{
|
||||
if (sdl_mutex != NULL)
|
||||
SDL_LockMutex(sdl_mutex);
|
||||
SDL_LockMutex(sdl_mutex);
|
||||
|
||||
/* Unregister our renderer! */
|
||||
video_setblit(NULL);
|
||||
|
||||
if (sdl_enabled)
|
||||
sdl_enabled = 0;
|
||||
sdl_enabled = 0;
|
||||
|
||||
if (sdl_mutex != NULL) {
|
||||
SDL_DestroyMutex(sdl_mutex);
|
||||
sdl_mutex = NULL;
|
||||
SDL_DestroyMutex(sdl_mutex);
|
||||
sdl_mutex = NULL;
|
||||
}
|
||||
|
||||
sdl_destroy_texture();
|
||||
@@ -360,8 +348,8 @@ sdl_close(void)
|
||||
SetFocus(hwndMain);
|
||||
|
||||
if (sdl_parent_hwnd != NULL) {
|
||||
DestroyWindow(sdl_parent_hwnd);
|
||||
sdl_parent_hwnd = NULL;
|
||||
DestroyWindow(sdl_parent_hwnd);
|
||||
sdl_parent_hwnd = NULL;
|
||||
}
|
||||
|
||||
/* Quit. */
|
||||
@@ -369,41 +357,36 @@ sdl_close(void)
|
||||
sdl_flags = -1;
|
||||
}
|
||||
|
||||
|
||||
static int old_capture = 0;
|
||||
|
||||
|
||||
static void
|
||||
sdl_select_best_hw_driver(void)
|
||||
{
|
||||
int i;
|
||||
int i;
|
||||
SDL_RendererInfo renderInfo;
|
||||
|
||||
for (i = 0; i < SDL_GetNumRenderDrivers(); ++i)
|
||||
{
|
||||
SDL_GetRenderDriverInfo(i, &renderInfo);
|
||||
if (renderInfo.flags & SDL_RENDERER_ACCELERATED) {
|
||||
SDL_SetHint(SDL_HINT_RENDER_DRIVER, renderInfo.name);
|
||||
return;
|
||||
}
|
||||
for (i = 0; i < SDL_GetNumRenderDrivers(); ++i) {
|
||||
SDL_GetRenderDriverInfo(i, &renderInfo);
|
||||
if (renderInfo.flags & SDL_RENDERER_ACCELERATED) {
|
||||
SDL_SetHint(SDL_HINT_RENDER_DRIVER, renderInfo.name);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
sdl_init_texture(void)
|
||||
{
|
||||
if (sdl_flags & RENDERER_HARDWARE) {
|
||||
sdl_render = SDL_CreateRenderer(sdl_win, -1, SDL_RENDERER_ACCELERATED);
|
||||
SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, video_filter_method ? "1" : "0");
|
||||
sdl_render = SDL_CreateRenderer(sdl_win, -1, SDL_RENDERER_ACCELERATED);
|
||||
SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, video_filter_method ? "1" : "0");
|
||||
} else
|
||||
sdl_render = SDL_CreateRenderer(sdl_win, -1, SDL_RENDERER_SOFTWARE);
|
||||
sdl_render = SDL_CreateRenderer(sdl_win, -1, SDL_RENDERER_SOFTWARE);
|
||||
|
||||
sdl_tex = SDL_CreateTexture(sdl_render, SDL_PIXELFORMAT_ARGB8888,
|
||||
SDL_TEXTUREACCESS_STREAMING, 2048, 2048);
|
||||
SDL_TEXTUREACCESS_STREAMING, 2048, 2048);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
sdl_reinit_texture(void)
|
||||
{
|
||||
@@ -414,67 +397,65 @@ sdl_reinit_texture(void)
|
||||
sdl_init_texture();
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
sdl_set_fs(int fs)
|
||||
{
|
||||
int w = 0, h = 0, x = 0, y = 0;
|
||||
int w = 0, h = 0, x = 0, y = 0;
|
||||
RECT rect;
|
||||
|
||||
SDL_LockMutex(sdl_mutex);
|
||||
sdl_enabled = 0;
|
||||
|
||||
if (fs) {
|
||||
ShowWindow(sdl_parent_hwnd, TRUE);
|
||||
SetParent(hwndRender, sdl_parent_hwnd);
|
||||
ShowWindow(hwndRender, TRUE);
|
||||
MoveWindow(sdl_parent_hwnd, 0, 0, sdl_w, sdl_h, TRUE);
|
||||
ShowWindow(sdl_parent_hwnd, TRUE);
|
||||
SetParent(hwndRender, sdl_parent_hwnd);
|
||||
ShowWindow(hwndRender, TRUE);
|
||||
MoveWindow(sdl_parent_hwnd, 0, 0, sdl_w, sdl_h, TRUE);
|
||||
|
||||
/* Show the window, make it topmost, and give it focus. */
|
||||
w = unscaled_size_x;
|
||||
h = efscrnsz_y;
|
||||
sdl_stretch(&w, &h, &x, &y);
|
||||
MoveWindow(hwndRender, x, y, w, h, TRUE);
|
||||
ImmAssociateContext(sdl_parent_hwnd, NULL);
|
||||
SetFocus(sdl_parent_hwnd);
|
||||
/* Show the window, make it topmost, and give it focus. */
|
||||
w = unscaled_size_x;
|
||||
h = efscrnsz_y;
|
||||
sdl_stretch(&w, &h, &x, &y);
|
||||
MoveWindow(hwndRender, x, y, w, h, TRUE);
|
||||
ImmAssociateContext(sdl_parent_hwnd, NULL);
|
||||
SetFocus(sdl_parent_hwnd);
|
||||
|
||||
/* Redirect RawInput to this new window. */
|
||||
old_capture = mouse_capture;
|
||||
GetWindowRect(hwndRender, &rect);
|
||||
ClipCursor(&rect);
|
||||
mouse_capture = 1;
|
||||
/* Redirect RawInput to this new window. */
|
||||
old_capture = mouse_capture;
|
||||
GetWindowRect(hwndRender, &rect);
|
||||
ClipCursor(&rect);
|
||||
mouse_capture = 1;
|
||||
} else {
|
||||
SetParent(hwndRender, hwndMain);
|
||||
ShowWindow(sdl_parent_hwnd, FALSE);
|
||||
ShowWindow(hwndRender, TRUE);
|
||||
ImmAssociateContext(hwndMain, NULL);
|
||||
SetFocus(hwndMain);
|
||||
mouse_capture = old_capture;
|
||||
SetParent(hwndRender, hwndMain);
|
||||
ShowWindow(sdl_parent_hwnd, FALSE);
|
||||
ShowWindow(hwndRender, TRUE);
|
||||
ImmAssociateContext(hwndMain, NULL);
|
||||
SetFocus(hwndMain);
|
||||
mouse_capture = old_capture;
|
||||
|
||||
if (mouse_capture) {
|
||||
GetWindowRect(hwndRender, &rect);
|
||||
ClipCursor(&rect);
|
||||
} else
|
||||
ClipCursor(&oldclip);
|
||||
if (mouse_capture) {
|
||||
GetWindowRect(hwndRender, &rect);
|
||||
ClipCursor(&rect);
|
||||
} else
|
||||
ClipCursor(&oldclip);
|
||||
}
|
||||
|
||||
sdl_fs = fs;
|
||||
|
||||
if (fs)
|
||||
sdl_flags |= RENDERER_FULL_SCREEN;
|
||||
sdl_flags |= RENDERER_FULL_SCREEN;
|
||||
else
|
||||
sdl_flags &= ~RENDERER_FULL_SCREEN;
|
||||
sdl_flags &= ~RENDERER_FULL_SCREEN;
|
||||
|
||||
// sdl_reinit_texture();
|
||||
sdl_enabled = 1;
|
||||
SDL_UnlockMutex(sdl_mutex);
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
sdl_init_common(int flags)
|
||||
{
|
||||
wchar_t temp[128];
|
||||
wchar_t temp[128];
|
||||
SDL_version ver;
|
||||
|
||||
sdl_log("SDL: init (fs=%d)\n", fs);
|
||||
@@ -485,15 +466,15 @@ sdl_init_common(int flags)
|
||||
|
||||
/* Initialize the SDL system. */
|
||||
if (SDL_Init(SDL_INIT_VIDEO) < 0) {
|
||||
sdl_log("SDL: initialization failed (%s)\n", sdl_GetError());
|
||||
return(0);
|
||||
sdl_log("SDL: initialization failed (%s)\n", sdl_GetError());
|
||||
return (0);
|
||||
}
|
||||
|
||||
if (flags & RENDERER_HARDWARE) {
|
||||
if (flags & RENDERER_OPENGL)
|
||||
SDL_SetHint(SDL_HINT_RENDER_DRIVER, "OpenGL");
|
||||
else
|
||||
sdl_select_best_hw_driver();
|
||||
if (flags & RENDERER_OPENGL)
|
||||
SDL_SetHint(SDL_HINT_RENDER_DRIVER, "OpenGL");
|
||||
else
|
||||
sdl_select_best_hw_driver();
|
||||
}
|
||||
|
||||
/* Get the size of the (current) desktop. */
|
||||
@@ -503,16 +484,16 @@ sdl_init_common(int flags)
|
||||
/* Create the desktop-covering window. */
|
||||
_swprintf(temp, L"%s v%s", EMU_NAME_W, EMU_VERSION_FULL_W);
|
||||
sdl_parent_hwnd = CreateWindow(SDL_CLASS_NAME, temp, WS_POPUP, 0, 0, sdl_w, sdl_h,
|
||||
HWND_DESKTOP, NULL, hinstance, NULL);
|
||||
HWND_DESKTOP, NULL, hinstance, NULL);
|
||||
ShowWindow(sdl_parent_hwnd, FALSE);
|
||||
|
||||
sdl_flags = flags;
|
||||
|
||||
if (sdl_win == NULL) {
|
||||
sdl_log("SDL: unable to CreateWindowFrom (%s)\n", SDL_GetError());
|
||||
sdl_log("SDL: unable to CreateWindowFrom (%s)\n", SDL_GetError());
|
||||
}
|
||||
|
||||
sdl_win = SDL_CreateWindowFrom((void *)hwndRender);
|
||||
sdl_win = SDL_CreateWindowFrom((void *) hwndRender);
|
||||
sdl_init_texture();
|
||||
sdl_set_fs(video_fullscreen & 1);
|
||||
|
||||
@@ -523,50 +504,45 @@ sdl_init_common(int flags)
|
||||
video_setblit((video_grayscale || invert_display) ? sdl_blit_ex : sdl_blit);
|
||||
|
||||
sdl_enabled = 1;
|
||||
sdl_mutex = SDL_CreateMutex();
|
||||
sdl_mutex = SDL_CreateMutex();
|
||||
|
||||
return(1);
|
||||
return (1);
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
sdl_inits(HWND h)
|
||||
{
|
||||
return sdl_init_common(0);
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
sdl_inith(HWND h)
|
||||
{
|
||||
return sdl_init_common(RENDERER_HARDWARE);
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
sdl_initho(HWND h)
|
||||
{
|
||||
return sdl_init_common(RENDERER_HARDWARE | RENDERER_OPENGL);
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
sdl_pause(void)
|
||||
{
|
||||
return(0);
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
sdl_resize(int x, int y)
|
||||
{
|
||||
int ww = 0, wh = 0, wx = 0, wy = 0;
|
||||
|
||||
if (video_fullscreen & 2)
|
||||
return;
|
||||
return;
|
||||
|
||||
if ((x == cur_w) && (y == cur_h))
|
||||
return;
|
||||
return;
|
||||
|
||||
SDL_LockMutex(sdl_mutex);
|
||||
|
||||
@@ -574,8 +550,8 @@ sdl_resize(int x, int y)
|
||||
wh = y;
|
||||
|
||||
if (sdl_fs) {
|
||||
sdl_stretch(&ww, &wh, &wx, &wy);
|
||||
MoveWindow(hwndRender, wx, wy, ww, wh, TRUE);
|
||||
sdl_stretch(&ww, &wh, &wx, &wy);
|
||||
MoveWindow(hwndRender, wx, wy, ww, wh, TRUE);
|
||||
}
|
||||
|
||||
cur_w = x;
|
||||
@@ -594,35 +570,33 @@ sdl_resize(int x, int y)
|
||||
SDL_UnlockMutex(sdl_mutex);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
sdl_enable(int enable)
|
||||
{
|
||||
if (sdl_flags == -1)
|
||||
return;
|
||||
return;
|
||||
|
||||
SDL_LockMutex(sdl_mutex);
|
||||
sdl_enabled = !!enable;
|
||||
|
||||
if (enable == 1) {
|
||||
SDL_SetWindowSize(sdl_win, cur_ww, cur_wh);
|
||||
sdl_reinit_texture();
|
||||
SDL_SetWindowSize(sdl_win, cur_ww, cur_wh);
|
||||
sdl_reinit_texture();
|
||||
}
|
||||
|
||||
SDL_UnlockMutex(sdl_mutex);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
sdl_reload(void)
|
||||
{
|
||||
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_reinit_texture();
|
||||
SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, video_filter_method ? "1" : "0");
|
||||
sdl_reinit_texture();
|
||||
|
||||
SDL_UnlockMutex(sdl_mutex);
|
||||
SDL_UnlockMutex(sdl_mutex);
|
||||
}
|
||||
|
||||
video_setblit((video_grayscale || invert_display) ? sdl_blit_ex : sdl_blit);
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -31,9 +31,7 @@
|
||||
#include <86box/sound.h>
|
||||
#include <86box/win.h>
|
||||
|
||||
|
||||
static uint8_t old_gain;
|
||||
|
||||
static uint8_t old_gain;
|
||||
|
||||
#if defined(__amd64__) || defined(__aarch64__)
|
||||
static LRESULT CALLBACK
|
||||
@@ -45,48 +43,47 @@ SoundGainDialogProcedure(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
HWND h;
|
||||
|
||||
switch (message) {
|
||||
case WM_INITDIALOG:
|
||||
old_gain = sound_gain;
|
||||
h = GetDlgItem(hdlg, IDC_SLIDER_GAIN);
|
||||
SendMessage(h, TBM_SETRANGE, (WPARAM)1, (LPARAM)MAKELONG(0, 9));
|
||||
SendMessage(h, TBM_SETPOS, (WPARAM)1, 9 - (sound_gain >> 1));
|
||||
SendMessage(h, TBM_SETTICFREQ, (WPARAM)1, 0);
|
||||
SendMessage(h, TBM_SETLINESIZE, (WPARAM)0, 1);
|
||||
SendMessage(h, TBM_SETPAGESIZE, (WPARAM)0, 2);
|
||||
break;
|
||||
case WM_INITDIALOG:
|
||||
old_gain = sound_gain;
|
||||
h = GetDlgItem(hdlg, IDC_SLIDER_GAIN);
|
||||
SendMessage(h, TBM_SETRANGE, (WPARAM) 1, (LPARAM) MAKELONG(0, 9));
|
||||
SendMessage(h, TBM_SETPOS, (WPARAM) 1, 9 - (sound_gain >> 1));
|
||||
SendMessage(h, TBM_SETTICFREQ, (WPARAM) 1, 0);
|
||||
SendMessage(h, TBM_SETLINESIZE, (WPARAM) 0, 1);
|
||||
SendMessage(h, TBM_SETPAGESIZE, (WPARAM) 0, 2);
|
||||
break;
|
||||
|
||||
case WM_VSCROLL:
|
||||
h = GetDlgItem(hdlg, IDC_SLIDER_GAIN);
|
||||
sound_gain = (9 - SendMessage(h, TBM_GETPOS, (WPARAM)0, 0)) << 1;
|
||||
break;
|
||||
case WM_VSCROLL:
|
||||
h = GetDlgItem(hdlg, IDC_SLIDER_GAIN);
|
||||
sound_gain = (9 - SendMessage(h, TBM_GETPOS, (WPARAM) 0, 0)) << 1;
|
||||
break;
|
||||
|
||||
case WM_COMMAND:
|
||||
switch (LOWORD(wParam)) {
|
||||
case IDOK:
|
||||
h = GetDlgItem(hdlg, IDC_SLIDER_GAIN);
|
||||
sound_gain = (9 - SendMessage(h, TBM_GETPOS, (WPARAM)0, 0)) << 1;
|
||||
config_save();
|
||||
EndDialog(hdlg, 0);
|
||||
return TRUE;
|
||||
case WM_COMMAND:
|
||||
switch (LOWORD(wParam)) {
|
||||
case IDOK:
|
||||
h = GetDlgItem(hdlg, IDC_SLIDER_GAIN);
|
||||
sound_gain = (9 - SendMessage(h, TBM_GETPOS, (WPARAM) 0, 0)) << 1;
|
||||
config_save();
|
||||
EndDialog(hdlg, 0);
|
||||
return TRUE;
|
||||
|
||||
case IDCANCEL:
|
||||
sound_gain = old_gain;
|
||||
config_save();
|
||||
EndDialog(hdlg, 0);
|
||||
return TRUE;
|
||||
case IDCANCEL:
|
||||
sound_gain = old_gain;
|
||||
config_save();
|
||||
EndDialog(hdlg, 0);
|
||||
return TRUE;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return(FALSE);
|
||||
return (FALSE);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
SoundGainDialogCreate(HWND hwnd)
|
||||
{
|
||||
DialogBox(hinstance, (LPCTSTR)DLG_SND_GAIN, hwnd, SoundGainDialogProcedure);
|
||||
DialogBox(hinstance, (LPCTSTR) DLG_SND_GAIN, hwnd, SoundGainDialogProcedure);
|
||||
}
|
||||
|
||||
@@ -32,7 +32,6 @@
|
||||
#include <86box/sound.h>
|
||||
#include <86box/win.h>
|
||||
|
||||
|
||||
#if defined(__amd64__) || defined(__aarch64__)
|
||||
static LRESULT CALLBACK
|
||||
#else
|
||||
@@ -40,140 +39,139 @@ static BOOL CALLBACK
|
||||
#endif
|
||||
SpecifyDimensionsDialogProcedure(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
HWND h, h2;
|
||||
HMENU hmenu;
|
||||
UDACCEL accel, accel2;
|
||||
RECT r;
|
||||
HWND h, h2;
|
||||
HMENU hmenu;
|
||||
UDACCEL accel, accel2;
|
||||
RECT r;
|
||||
uint32_t temp_x = 0, temp_y = 0;
|
||||
int dpi = 96, lock;
|
||||
LPTSTR lptsTemp;
|
||||
char *stransi;
|
||||
int dpi = 96, lock;
|
||||
LPTSTR lptsTemp;
|
||||
char *stransi;
|
||||
|
||||
switch (message) {
|
||||
case WM_INITDIALOG:
|
||||
GetWindowRect(hwndRender, &r);
|
||||
case WM_INITDIALOG:
|
||||
GetWindowRect(hwndRender, &r);
|
||||
|
||||
h = GetDlgItem(hdlg, IDC_WIDTHSPIN);
|
||||
h2 = GetDlgItem(hdlg, IDC_EDIT_WIDTH);
|
||||
SendMessage(h, UDM_SETBUDDY, (WPARAM)h2, 0);
|
||||
SendMessage(h, UDM_SETRANGE, 0, (120 << 16) | 2048);
|
||||
accel.nSec = 0;
|
||||
accel.nInc = 8;
|
||||
SendMessage(h, UDM_SETACCEL, 1, (LPARAM)&accel);
|
||||
SendMessage(h, UDM_SETPOS, 0, r.right - r.left);
|
||||
h = GetDlgItem(hdlg, IDC_WIDTHSPIN);
|
||||
h2 = GetDlgItem(hdlg, IDC_EDIT_WIDTH);
|
||||
SendMessage(h, UDM_SETBUDDY, (WPARAM) h2, 0);
|
||||
SendMessage(h, UDM_SETRANGE, 0, (120 << 16) | 2048);
|
||||
accel.nSec = 0;
|
||||
accel.nInc = 8;
|
||||
SendMessage(h, UDM_SETACCEL, 1, (LPARAM) &accel);
|
||||
SendMessage(h, UDM_SETPOS, 0, r.right - r.left);
|
||||
|
||||
h = GetDlgItem(hdlg, IDC_HEIGHTSPIN);
|
||||
h2 = GetDlgItem(hdlg, IDC_EDIT_HEIGHT);
|
||||
SendMessage(h, UDM_SETBUDDY, (WPARAM)h2, 0);
|
||||
SendMessage(h, UDM_SETRANGE, 0, (120 << 16) | 2048);
|
||||
accel2.nSec = 0;
|
||||
accel2.nInc = 8;
|
||||
SendMessage(h, UDM_SETACCEL, 1, (LPARAM)&accel2);
|
||||
SendMessage(h, UDM_SETPOS, 0, r.bottom - r.top);
|
||||
h = GetDlgItem(hdlg, IDC_HEIGHTSPIN);
|
||||
h2 = GetDlgItem(hdlg, IDC_EDIT_HEIGHT);
|
||||
SendMessage(h, UDM_SETBUDDY, (WPARAM) h2, 0);
|
||||
SendMessage(h, UDM_SETRANGE, 0, (120 << 16) | 2048);
|
||||
accel2.nSec = 0;
|
||||
accel2.nInc = 8;
|
||||
SendMessage(h, UDM_SETACCEL, 1, (LPARAM) &accel2);
|
||||
SendMessage(h, UDM_SETPOS, 0, r.bottom - r.top);
|
||||
|
||||
h = GetDlgItem(hdlg, IDC_CHECK_LOCK_SIZE);
|
||||
SendMessage(h, BM_SETCHECK, !!(vid_resize & 2), 0);
|
||||
break;
|
||||
h = GetDlgItem(hdlg, IDC_CHECK_LOCK_SIZE);
|
||||
SendMessage(h, BM_SETCHECK, !!(vid_resize & 2), 0);
|
||||
break;
|
||||
|
||||
case WM_COMMAND:
|
||||
switch (LOWORD(wParam)) {
|
||||
case IDOK:
|
||||
lptsTemp = (LPTSTR) malloc(512 * sizeof(WCHAR));
|
||||
stransi = (char *)malloc(512);
|
||||
case WM_COMMAND:
|
||||
switch (LOWORD(wParam)) {
|
||||
case IDOK:
|
||||
lptsTemp = (LPTSTR) malloc(512 * sizeof(WCHAR));
|
||||
stransi = (char *) malloc(512);
|
||||
|
||||
h = GetDlgItem(hdlg, IDC_EDIT_WIDTH);
|
||||
SendMessage(h, WM_GETTEXT, 255, (LPARAM) lptsTemp);
|
||||
wcstombs(stransi, lptsTemp, 512);
|
||||
sscanf(stransi, "%u", &temp_x);
|
||||
fixed_size_x = temp_x;
|
||||
h = GetDlgItem(hdlg, IDC_EDIT_WIDTH);
|
||||
SendMessage(h, WM_GETTEXT, 255, (LPARAM) lptsTemp);
|
||||
wcstombs(stransi, lptsTemp, 512);
|
||||
sscanf(stransi, "%u", &temp_x);
|
||||
fixed_size_x = temp_x;
|
||||
|
||||
h = GetDlgItem(hdlg, IDC_EDIT_HEIGHT);
|
||||
SendMessage(h, WM_GETTEXT, 255, (LPARAM) lptsTemp);
|
||||
wcstombs(stransi, lptsTemp, 512);
|
||||
sscanf(stransi, "%u", &temp_y);
|
||||
fixed_size_y = temp_y;
|
||||
h = GetDlgItem(hdlg, IDC_EDIT_HEIGHT);
|
||||
SendMessage(h, WM_GETTEXT, 255, (LPARAM) lptsTemp);
|
||||
wcstombs(stransi, lptsTemp, 512);
|
||||
sscanf(stransi, "%u", &temp_y);
|
||||
fixed_size_y = temp_y;
|
||||
|
||||
h = GetDlgItem(hdlg, IDC_CHECK_LOCK_SIZE);
|
||||
lock = SendMessage(h, BM_GETCHECK, 0, 0);
|
||||
h = GetDlgItem(hdlg, IDC_CHECK_LOCK_SIZE);
|
||||
lock = SendMessage(h, BM_GETCHECK, 0, 0);
|
||||
|
||||
if (lock) {
|
||||
vid_resize = 2;
|
||||
window_remember = 0;
|
||||
} else {
|
||||
vid_resize = 1;
|
||||
window_remember = 1;
|
||||
}
|
||||
hmenu = GetMenu(hwndMain);
|
||||
CheckMenuItem(hmenu, IDM_VID_REMEMBER, (window_remember == 1) ? MF_CHECKED : MF_UNCHECKED);
|
||||
CheckMenuItem(hmenu, IDM_VID_RESIZE, (vid_resize == 1) ? MF_CHECKED : MF_UNCHECKED);
|
||||
EnableMenuItem(hmenu, IDM_VID_RESIZE, (vid_resize & 2) ? MF_GRAYED : MF_ENABLED);
|
||||
if (lock) {
|
||||
vid_resize = 2;
|
||||
window_remember = 0;
|
||||
} else {
|
||||
vid_resize = 1;
|
||||
window_remember = 1;
|
||||
}
|
||||
hmenu = GetMenu(hwndMain);
|
||||
CheckMenuItem(hmenu, IDM_VID_REMEMBER, (window_remember == 1) ? MF_CHECKED : MF_UNCHECKED);
|
||||
CheckMenuItem(hmenu, IDM_VID_RESIZE, (vid_resize == 1) ? MF_CHECKED : MF_UNCHECKED);
|
||||
EnableMenuItem(hmenu, IDM_VID_RESIZE, (vid_resize & 2) ? MF_GRAYED : MF_ENABLED);
|
||||
|
||||
if (vid_resize == 1)
|
||||
SetWindowLongPtr(hwndMain, GWL_STYLE, (WS_OVERLAPPEDWINDOW) | WS_VISIBLE);
|
||||
else
|
||||
SetWindowLongPtr(hwndMain, GWL_STYLE, (WS_OVERLAPPEDWINDOW & ~WS_SIZEBOX & ~WS_MAXIMIZEBOX) | WS_VISIBLE);
|
||||
if (vid_resize == 1)
|
||||
SetWindowLongPtr(hwndMain, GWL_STYLE, (WS_OVERLAPPEDWINDOW) | WS_VISIBLE);
|
||||
else
|
||||
SetWindowLongPtr(hwndMain, GWL_STYLE, (WS_OVERLAPPEDWINDOW & ~WS_SIZEBOX & ~WS_MAXIMIZEBOX) | WS_VISIBLE);
|
||||
|
||||
/* scale the screen base on DPI */
|
||||
if (dpi_scale) {
|
||||
dpi = win_get_dpi(hwndMain);
|
||||
temp_x = MulDiv(temp_x, dpi, 96);
|
||||
temp_y = MulDiv(temp_y, dpi, 96);
|
||||
}
|
||||
/* scale the screen base on DPI */
|
||||
if (dpi_scale) {
|
||||
dpi = win_get_dpi(hwndMain);
|
||||
temp_x = MulDiv(temp_x, dpi, 96);
|
||||
temp_y = MulDiv(temp_y, dpi, 96);
|
||||
}
|
||||
|
||||
ResizeWindowByClientArea(hwndMain, temp_x, temp_y + sbar_height + tbar_height);
|
||||
ResizeWindowByClientArea(hwndMain, temp_x, temp_y + sbar_height + tbar_height);
|
||||
|
||||
if (vid_resize) {
|
||||
CheckMenuItem(hmenu, IDM_VID_SCALE_1X + scale, MF_UNCHECKED);
|
||||
CheckMenuItem(hmenu, IDM_VID_SCALE_2X, MF_CHECKED);
|
||||
scale = 1;
|
||||
}
|
||||
EnableMenuItem(hmenu, IDM_VID_SCALE_1X, vid_resize ? MF_GRAYED : MF_ENABLED);
|
||||
EnableMenuItem(hmenu, IDM_VID_SCALE_2X, vid_resize ? MF_GRAYED : MF_ENABLED);
|
||||
EnableMenuItem(hmenu, IDM_VID_SCALE_3X, vid_resize ? MF_GRAYED : MF_ENABLED);
|
||||
EnableMenuItem(hmenu, IDM_VID_SCALE_4X, vid_resize ? MF_GRAYED : MF_ENABLED);
|
||||
if (vid_resize) {
|
||||
CheckMenuItem(hmenu, IDM_VID_SCALE_1X + scale, MF_UNCHECKED);
|
||||
CheckMenuItem(hmenu, IDM_VID_SCALE_2X, MF_CHECKED);
|
||||
scale = 1;
|
||||
}
|
||||
EnableMenuItem(hmenu, IDM_VID_SCALE_1X, vid_resize ? MF_GRAYED : MF_ENABLED);
|
||||
EnableMenuItem(hmenu, IDM_VID_SCALE_2X, vid_resize ? MF_GRAYED : MF_ENABLED);
|
||||
EnableMenuItem(hmenu, IDM_VID_SCALE_3X, vid_resize ? MF_GRAYED : MF_ENABLED);
|
||||
EnableMenuItem(hmenu, IDM_VID_SCALE_4X, vid_resize ? MF_GRAYED : MF_ENABLED);
|
||||
|
||||
scrnsz_x = fixed_size_x;
|
||||
scrnsz_y = fixed_size_y;
|
||||
atomic_store(&doresize_monitors[0], 1);
|
||||
scrnsz_x = fixed_size_x;
|
||||
scrnsz_y = fixed_size_y;
|
||||
atomic_store(&doresize_monitors[0], 1);
|
||||
|
||||
GetWindowRect(hwndMain, &r);
|
||||
GetWindowRect(hwndMain, &r);
|
||||
|
||||
if (mouse_capture)
|
||||
ClipCursor(&r);
|
||||
if (mouse_capture)
|
||||
ClipCursor(&r);
|
||||
|
||||
if (window_remember || (vid_resize & 2)) {
|
||||
window_x = r.left;
|
||||
window_y = r.top;
|
||||
if (!(vid_resize & 2)) {
|
||||
window_w = r.right - r.left;
|
||||
window_h = r.bottom - r.top;
|
||||
}
|
||||
}
|
||||
if (window_remember || (vid_resize & 2)) {
|
||||
window_x = r.left;
|
||||
window_y = r.top;
|
||||
if (!(vid_resize & 2)) {
|
||||
window_w = r.right - r.left;
|
||||
window_h = r.bottom - r.top;
|
||||
}
|
||||
}
|
||||
|
||||
config_save();
|
||||
config_save();
|
||||
|
||||
free(stransi);
|
||||
free(lptsTemp);
|
||||
free(stransi);
|
||||
free(lptsTemp);
|
||||
|
||||
EndDialog(hdlg, 0);
|
||||
return TRUE;
|
||||
EndDialog(hdlg, 0);
|
||||
return TRUE;
|
||||
|
||||
case IDCANCEL:
|
||||
EndDialog(hdlg, 0);
|
||||
return TRUE;
|
||||
case IDCANCEL:
|
||||
EndDialog(hdlg, 0);
|
||||
return TRUE;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return(FALSE);
|
||||
return (FALSE);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
SpecifyDimensionsDialogCreate(HWND hwnd)
|
||||
{
|
||||
DialogBox(hinstance, (LPCTSTR)DLG_SPECIFY_DIM, hwnd, SpecifyDimensionsDialogProcedure);
|
||||
DialogBox(hinstance, (LPCTSTR) DLG_SPECIFY_DIM, hwnd, SpecifyDimensionsDialogProcedure);
|
||||
}
|
||||
|
||||
1098
src/win/win_stbar.c
1098
src/win/win_stbar.c
File diff suppressed because it is too large
Load Diff
@@ -36,36 +36,34 @@ 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);
|
||||
return ((thread_t *) bt);
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
thread_test_mutex(thread_t *arg)
|
||||
{
|
||||
if (arg == NULL) return(0);
|
||||
if (arg == NULL)
|
||||
return (0);
|
||||
|
||||
return (WaitForSingleObject(arg, 0) == WAIT_OBJECT_0) ? 1 : 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
int
|
||||
thread_wait(thread_t *arg)
|
||||
{
|
||||
if (arg == NULL) return(0);
|
||||
if (arg == NULL)
|
||||
return (0);
|
||||
|
||||
if (WaitForSingleObject(arg, INFINITE)) return(1);
|
||||
if (WaitForSingleObject(arg, INFINITE))
|
||||
return (1);
|
||||
|
||||
return(0);
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
event_t *
|
||||
thread_create_event(void)
|
||||
{
|
||||
@@ -73,63 +71,64 @@ thread_create_event(void)
|
||||
|
||||
ev->handle = CreateEvent(NULL, FALSE, FALSE, NULL);
|
||||
|
||||
return((event_t *)ev);
|
||||
return ((event_t *) ev);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
thread_set_event(event_t *arg)
|
||||
{
|
||||
win_event_t *ev = (win_event_t *)arg;
|
||||
win_event_t *ev = (win_event_t *) arg;
|
||||
|
||||
if (arg == NULL) return;
|
||||
if (arg == NULL)
|
||||
return;
|
||||
|
||||
SetEvent(ev->handle);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
thread_reset_event(event_t *arg)
|
||||
{
|
||||
win_event_t *ev = (win_event_t *)arg;
|
||||
win_event_t *ev = (win_event_t *) arg;
|
||||
|
||||
if (arg == NULL) return;
|
||||
if (arg == NULL)
|
||||
return;
|
||||
|
||||
ResetEvent(ev->handle);
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
thread_wait_event(event_t *arg, int timeout)
|
||||
{
|
||||
win_event_t *ev = (win_event_t *)arg;
|
||||
win_event_t *ev = (win_event_t *) arg;
|
||||
|
||||
if (arg == NULL) return(0);
|
||||
if (arg == NULL)
|
||||
return (0);
|
||||
|
||||
if (ev->handle == NULL) return(0);
|
||||
if (ev->handle == NULL)
|
||||
return (0);
|
||||
|
||||
if (timeout == -1)
|
||||
timeout = INFINITE;
|
||||
timeout = INFINITE;
|
||||
|
||||
if (WaitForSingleObject(ev->handle, timeout)) return(1);
|
||||
if (WaitForSingleObject(ev->handle, timeout))
|
||||
return (1);
|
||||
|
||||
return(0);
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
thread_destroy_event(event_t *arg)
|
||||
{
|
||||
win_event_t *ev = (win_event_t *)arg;
|
||||
win_event_t *ev = (win_event_t *) arg;
|
||||
|
||||
if (arg == NULL) return;
|
||||
if (arg == NULL)
|
||||
return;
|
||||
|
||||
CloseHandle(ev->handle);
|
||||
|
||||
free(ev);
|
||||
}
|
||||
|
||||
|
||||
mutex_t *
|
||||
thread_create_mutex(void)
|
||||
{
|
||||
@@ -140,39 +139,39 @@ thread_create_mutex(void)
|
||||
return mutex;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
thread_wait_mutex(mutex_t *mutex)
|
||||
{
|
||||
if (mutex == NULL) return(0);
|
||||
if (mutex == NULL)
|
||||
return (0);
|
||||
|
||||
LPCRITICAL_SECTION critsec = (LPCRITICAL_SECTION)mutex;
|
||||
LPCRITICAL_SECTION critsec = (LPCRITICAL_SECTION) mutex;
|
||||
|
||||
EnterCriticalSection(critsec);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
thread_release_mutex(mutex_t *mutex)
|
||||
{
|
||||
if (mutex == NULL) return(0);
|
||||
if (mutex == NULL)
|
||||
return (0);
|
||||
|
||||
LPCRITICAL_SECTION critsec = (LPCRITICAL_SECTION)mutex;
|
||||
LPCRITICAL_SECTION critsec = (LPCRITICAL_SECTION) mutex;
|
||||
|
||||
LeaveCriticalSection(critsec);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
thread_close_mutex(mutex_t *mutex)
|
||||
{
|
||||
if (mutex == NULL) return;
|
||||
if (mutex == NULL)
|
||||
return;
|
||||
|
||||
LPCRITICAL_SECTION critsec = (LPCRITICAL_SECTION)mutex;
|
||||
LPCRITICAL_SECTION critsec = (LPCRITICAL_SECTION) mutex;
|
||||
|
||||
DeleteCriticalSection(critsec);
|
||||
|
||||
|
||||
@@ -11,36 +11,34 @@
|
||||
#include <86box/video.h>
|
||||
#include <86box/win.h>
|
||||
|
||||
HWND hwndRebar = NULL;
|
||||
static HWND hwndToolbar = NULL;
|
||||
static HIMAGELIST hImageList = NULL;
|
||||
static wchar_t wTitle[512] = { 0 };
|
||||
static WNDPROC pOriginalProcedure = NULL;
|
||||
|
||||
HWND hwndRebar = NULL;
|
||||
static HWND hwndToolbar = NULL;
|
||||
static HIMAGELIST hImageList = NULL;
|
||||
static wchar_t wTitle[512] = { 0 };
|
||||
static WNDPROC pOriginalProcedure = NULL;
|
||||
|
||||
enum image_index {
|
||||
RUN,
|
||||
PAUSE,
|
||||
CTRL_ALT_DEL,
|
||||
CTRL_ALT_ESC,
|
||||
HARD_RESET,
|
||||
ACPI_SHUTDOWN,
|
||||
SETTINGS
|
||||
RUN,
|
||||
PAUSE,
|
||||
CTRL_ALT_DEL,
|
||||
CTRL_ALT_ESC,
|
||||
HARD_RESET,
|
||||
ACPI_SHUTDOWN,
|
||||
SETTINGS
|
||||
};
|
||||
|
||||
|
||||
void
|
||||
ToolBarLoadIcons()
|
||||
{
|
||||
if (!hwndToolbar)
|
||||
return;
|
||||
return;
|
||||
|
||||
if (hImageList)
|
||||
ImageList_Destroy(hImageList);
|
||||
ImageList_Destroy(hImageList);
|
||||
|
||||
hImageList = ImageList_Create(win_get_system_metrics(SM_CXSMICON, dpi),
|
||||
win_get_system_metrics(SM_CYSMICON, dpi),
|
||||
ILC_MASK | ILC_COLOR32, 1, 1);
|
||||
win_get_system_metrics(SM_CYSMICON, dpi),
|
||||
ILC_MASK | ILC_COLOR32, 1, 1);
|
||||
|
||||
// The icons must be loaded in the same order as the `image_index`
|
||||
// enumeration above.
|
||||
@@ -56,55 +54,54 @@ ToolBarLoadIcons()
|
||||
SendMessage(hwndToolbar, TB_SETIMAGELIST, 0, (LPARAM) hImageList);
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
ToolBarProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
switch (message) {
|
||||
case WM_NOTIFY:
|
||||
switch (((LPNMHDR) lParam)->code) {
|
||||
case TTN_GETDISPINFO: {
|
||||
LPTOOLTIPTEXT lpttt = (LPTOOLTIPTEXT)lParam;
|
||||
case WM_NOTIFY:
|
||||
switch (((LPNMHDR) lParam)->code) {
|
||||
case TTN_GETDISPINFO:
|
||||
{
|
||||
LPTOOLTIPTEXT lpttt = (LPTOOLTIPTEXT) lParam;
|
||||
|
||||
// Set the instance of the module that contains the resource.
|
||||
lpttt->hinst = hinstance;
|
||||
// Set the instance of the module that contains the resource.
|
||||
lpttt->hinst = hinstance;
|
||||
|
||||
uintptr_t idButton = lpttt->hdr.idFrom;
|
||||
uintptr_t idButton = lpttt->hdr.idFrom;
|
||||
|
||||
switch (idButton) {
|
||||
case IDM_ACTION_PAUSE:
|
||||
if (dopause)
|
||||
lpttt->lpszText = MAKEINTRESOURCE(IDS_2154);
|
||||
else
|
||||
lpttt->lpszText = MAKEINTRESOURCE(IDS_2155);
|
||||
break;
|
||||
switch (idButton) {
|
||||
case IDM_ACTION_PAUSE:
|
||||
if (dopause)
|
||||
lpttt->lpszText = MAKEINTRESOURCE(IDS_2154);
|
||||
else
|
||||
lpttt->lpszText = MAKEINTRESOURCE(IDS_2155);
|
||||
break;
|
||||
|
||||
case IDM_ACTION_RESET_CAD:
|
||||
lpttt->lpszText = MAKEINTRESOURCE(IDS_2156);
|
||||
break;
|
||||
case IDM_ACTION_RESET_CAD:
|
||||
lpttt->lpszText = MAKEINTRESOURCE(IDS_2156);
|
||||
break;
|
||||
|
||||
case IDM_ACTION_CTRL_ALT_ESC:
|
||||
lpttt->lpszText = MAKEINTRESOURCE(IDS_2157);
|
||||
break;
|
||||
case IDM_ACTION_CTRL_ALT_ESC:
|
||||
lpttt->lpszText = MAKEINTRESOURCE(IDS_2157);
|
||||
break;
|
||||
|
||||
case IDM_ACTION_HRESET:
|
||||
lpttt->lpszText = MAKEINTRESOURCE(IDS_2158);
|
||||
break;
|
||||
case IDM_ACTION_HRESET:
|
||||
lpttt->lpszText = MAKEINTRESOURCE(IDS_2158);
|
||||
break;
|
||||
|
||||
case IDM_CONFIG:
|
||||
lpttt->lpszText = MAKEINTRESOURCE(IDS_2160);
|
||||
break;
|
||||
}
|
||||
case IDM_CONFIG:
|
||||
lpttt->lpszText = MAKEINTRESOURCE(IDS_2160);
|
||||
break;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return(CallWindowProc(pOriginalProcedure, hwnd, message, wParam, lParam));
|
||||
return (CallWindowProc(pOriginalProcedure, hwnd, message, wParam, lParam));
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
ToolBarUpdatePause(int pause)
|
||||
{
|
||||
@@ -117,35 +114,29 @@ ToolBarUpdatePause(int pause)
|
||||
SendMessage(hwndToolbar, TB_SETBUTTONINFO, IDM_ACTION_PAUSE, (LPARAM) &tbbi);
|
||||
}
|
||||
|
||||
|
||||
static TBBUTTON buttons[] = {
|
||||
{ PAUSE, IDM_ACTION_PAUSE, TBSTATE_ENABLED, BTNS_BUTTON, { 0 }, 0, 0 },
|
||||
{ HARD_RESET, IDM_ACTION_HRESET, TBSTATE_ENABLED, BTNS_BUTTON, { 0 }, 0, 0 },
|
||||
{ ACPI_SHUTDOWN, 0, TBSTATE_HIDDEN, BTNS_BUTTON, { 0 }, 0, 0 },
|
||||
{ 0, 0, TBSTATE_INDETERMINATE, BTNS_SEP, { 0 }, 0, 0 },
|
||||
{ CTRL_ALT_DEL, IDM_ACTION_RESET_CAD, TBSTATE_ENABLED, BTNS_BUTTON, { 0 }, 0, 0 },
|
||||
{ CTRL_ALT_ESC, IDM_ACTION_CTRL_ALT_ESC, TBSTATE_ENABLED, BTNS_BUTTON, { 0 }, 0, 0 },
|
||||
{ 0, 0, TBSTATE_INDETERMINATE, BTNS_SEP, { 0 }, 0, 0 },
|
||||
{ SETTINGS, IDM_CONFIG, TBSTATE_ENABLED, BTNS_BUTTON, { 0 }, 0, 0 }
|
||||
{PAUSE, IDM_ACTION_PAUSE, TBSTATE_ENABLED, BTNS_BUTTON, { 0 }, 0, 0},
|
||||
{ HARD_RESET, IDM_ACTION_HRESET, TBSTATE_ENABLED, BTNS_BUTTON, { 0 }, 0, 0},
|
||||
{ ACPI_SHUTDOWN, 0, TBSTATE_HIDDEN, BTNS_BUTTON, { 0 }, 0, 0},
|
||||
{ 0, 0, TBSTATE_INDETERMINATE, BTNS_SEP, { 0 }, 0, 0},
|
||||
{ CTRL_ALT_DEL, IDM_ACTION_RESET_CAD, TBSTATE_ENABLED, BTNS_BUTTON, { 0 }, 0, 0},
|
||||
{ CTRL_ALT_ESC, IDM_ACTION_CTRL_ALT_ESC, TBSTATE_ENABLED, BTNS_BUTTON, { 0 }, 0, 0},
|
||||
{ 0, 0, TBSTATE_INDETERMINATE, BTNS_SEP, { 0 }, 0, 0},
|
||||
{ SETTINGS, IDM_CONFIG, TBSTATE_ENABLED, BTNS_BUTTON, { 0 }, 0, 0}
|
||||
};
|
||||
|
||||
|
||||
void
|
||||
ToolBarCreate(HWND hwndParent, HINSTANCE hInst)
|
||||
{
|
||||
REBARINFO rbi = { 0 };
|
||||
REBARINFO rbi = { 0 };
|
||||
REBARBANDINFO rbbi = { 0 };
|
||||
int btnSize;
|
||||
int btnSize;
|
||||
|
||||
// Create the toolbar.
|
||||
hwndToolbar = CreateWindowEx(WS_EX_PALETTEWINDOW, TOOLBARCLASSNAME, NULL,
|
||||
WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN |
|
||||
WS_CLIPSIBLINGS | TBSTYLE_TOOLTIPS |
|
||||
TBSTYLE_FLAT | CCS_TOP | BTNS_AUTOSIZE |
|
||||
CCS_NOPARENTALIGN | CCS_NORESIZE |
|
||||
CCS_NODIVIDER,
|
||||
0, 0, 0, 0,
|
||||
hwndParent, NULL, hInst, NULL);
|
||||
WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | TBSTYLE_TOOLTIPS | TBSTYLE_FLAT | CCS_TOP | BTNS_AUTOSIZE | CCS_NOPARENTALIGN | CCS_NORESIZE | CCS_NODIVIDER,
|
||||
0, 0, 0, 0,
|
||||
hwndParent, NULL, hInst, NULL);
|
||||
|
||||
ToolBarLoadIcons();
|
||||
|
||||
@@ -154,41 +145,39 @@ ToolBarCreate(HWND hwndParent, HINSTANCE hInst)
|
||||
SendMessage(hwndToolbar, TB_ADDBUTTONS, sizeof(buttons) / sizeof(TBBUTTON), (LPARAM) &buttons);
|
||||
|
||||
// Autosize the toolbar and determine its size.
|
||||
btnSize = LOWORD(SendMessage(hwndToolbar, TB_GETBUTTONSIZE, 0,0));
|
||||
btnSize = LOWORD(SendMessage(hwndToolbar, TB_GETBUTTONSIZE, 0, 0));
|
||||
|
||||
// Replace the original procedure with ours.
|
||||
pOriginalProcedure = (WNDPROC) GetWindowLongPtr(hwndToolbar, GWLP_WNDPROC);
|
||||
SetWindowLongPtr(hwndToolbar, GWLP_WNDPROC, (LONG_PTR)&ToolBarProcedure);
|
||||
SetWindowLongPtr(hwndToolbar, GWLP_WNDPROC, (LONG_PTR) &ToolBarProcedure);
|
||||
|
||||
// Make sure the Pause button is in the correct state.
|
||||
ToolBarUpdatePause(dopause);
|
||||
|
||||
// Create the containing Rebar.
|
||||
hwndRebar = CreateWindowEx(0, REBARCLASSNAME, NULL,
|
||||
WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS |
|
||||
WS_CLIPCHILDREN | RBS_VARHEIGHT |
|
||||
CCS_NODIVIDER | CCS_NOPARENTALIGN,
|
||||
0, 0, scrnsz_x, 0,
|
||||
hwndParent, NULL, hInst, NULL);
|
||||
WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | RBS_VARHEIGHT | CCS_NODIVIDER | CCS_NOPARENTALIGN,
|
||||
0, 0, scrnsz_x, 0,
|
||||
hwndParent, NULL, hInst, NULL);
|
||||
|
||||
// Create and send the REBARINFO structure.
|
||||
rbi.cbSize = sizeof(rbi);
|
||||
SendMessage(hwndRebar, RB_SETBARINFO, 0, (LPARAM)&rbi);
|
||||
SendMessage(hwndRebar, RB_SETBARINFO, 0, (LPARAM) &rbi);
|
||||
|
||||
// Add the toolbar to the rebar.
|
||||
rbbi.cbSize = sizeof(rbbi);
|
||||
rbbi.fMask = RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_STYLE;
|
||||
rbbi.hwndChild = hwndToolbar;
|
||||
rbbi.cbSize = sizeof(rbbi);
|
||||
rbbi.fMask = RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_STYLE;
|
||||
rbbi.hwndChild = hwndToolbar;
|
||||
rbbi.cxMinChild = 0;
|
||||
rbbi.cyMinChild = btnSize;
|
||||
rbbi.fStyle = RBBS_NOGRIPPER;
|
||||
SendMessage(hwndRebar, RB_INSERTBAND, -1, (LPARAM)&rbbi);
|
||||
rbbi.fStyle = RBBS_NOGRIPPER;
|
||||
SendMessage(hwndRebar, RB_INSERTBAND, -1, (LPARAM) &rbbi);
|
||||
|
||||
// Add a label for machine information.
|
||||
rbbi.fMask = RBBIM_TEXT | RBBIM_STYLE;
|
||||
rbbi.fMask = RBBIM_TEXT | RBBIM_STYLE;
|
||||
rbbi.lpText = TEXT("Test");
|
||||
rbbi.fStyle = RBBS_NOGRIPPER;
|
||||
SendMessage(hwndRebar, RB_INSERTBAND, -1, (LPARAM)&rbbi);
|
||||
SendMessage(hwndRebar, RB_INSERTBAND, -1, (LPARAM) &rbbi);
|
||||
|
||||
SendMessage(hwndRebar, RB_MAXIMIZEBAND, 0, 0);
|
||||
ShowWindow(hwndRebar, TRUE);
|
||||
@@ -196,25 +185,24 @@ ToolBarCreate(HWND hwndParent, HINSTANCE hInst)
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
wchar_t *
|
||||
ui_window_title(wchar_t *s)
|
||||
{
|
||||
REBARBANDINFO rbbi = { 0 };
|
||||
if (! video_fullscreen) {
|
||||
if (s != NULL) {
|
||||
wcsncpy(wTitle, s, sizeof_w(wTitle) - 1);
|
||||
} else
|
||||
s = wTitle;
|
||||
if (!video_fullscreen) {
|
||||
if (s != NULL) {
|
||||
wcsncpy(wTitle, s, sizeof_w(wTitle) - 1);
|
||||
} else
|
||||
s = wTitle;
|
||||
|
||||
rbbi.cbSize = sizeof(rbbi);
|
||||
rbbi.fMask = RBBIM_TEXT;
|
||||
rbbi.lpText = s;
|
||||
SendMessage(hwndRebar, RB_SETBANDINFO, 1, (LPARAM) &rbbi);
|
||||
rbbi.cbSize = sizeof(rbbi);
|
||||
rbbi.fMask = RBBIM_TEXT;
|
||||
rbbi.lpText = s;
|
||||
SendMessage(hwndRebar, RB_SETBANDINFO, 1, (LPARAM) &rbbi);
|
||||
} else {
|
||||
if (s == NULL)
|
||||
s = wTitle;
|
||||
if (s == NULL)
|
||||
s = wTitle;
|
||||
}
|
||||
|
||||
return(s);
|
||||
return (s);
|
||||
}
|
||||
|
||||
1911
src/win/win_ui.c
1911
src/win/win_ui.c
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user