diff --git a/src/config.c b/src/config.c index 50b69b4..0671776 100644 --- a/src/config.c +++ b/src/config.c @@ -12,7 +12,7 @@ * it on Windows XP, and possibly also Vista. Use the * -DANSI_CFG for use on these systems. * - * Version: @(#)config.c 1.0.16 2018/04/23 + * Version: @(#)config.c 1.0.18 2018/04/26 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -53,11 +53,12 @@ #include "machine/machine.h" #include "nvr.h" #include "device.h" -#include "serial.h" -#include "parallel.h" -#include "parallel_dev.h" +#include "ports/game_dev.h" +#include "ports/serial.h" +#include "ports/parallel.h" +#include "ports/parallel_dev.h" #include "mouse.h" -#include "game/gameport.h" +#include "game/joystick.h" #include "floppy/fdd.h" #include "floppy/fdc.h" #include "disk/hdd.h" @@ -532,22 +533,23 @@ load_input(const char *cat) p = config_get_string(cat, "mouse_type", "none"); mouse_type = mouse_get_from_internal_name(p); + //FIXME: should be an internal_name string!! joystick_type = config_get_int(cat, "joystick_type", 0); - for (c=0; c * @@ -110,7 +110,8 @@ extern int video_card, /* (C) graphics/video card */ voodoo_enabled; /* (C) video option */ extern int mouse_type; /* (C) selected mouse type */ extern int enable_sync; /* (C) enable time sync */ -extern int serial_enabled[], /* (C) enable serial ports */ +extern int game_enabled, /* (C) enable game port */ + serial_enabled[], /* (C) enable serial ports */ parallel_enabled[], /* (C) enable LPT ports */ parallel_device[], /* (C) set up LPT devices */ bugger_enabled; /* (C) enable ISAbugger */ diff --git a/src/game/gameport.c b/src/game/gameport.c deleted file mode 100644 index 7b7ded0..0000000 --- a/src/game/gameport.c +++ /dev/null @@ -1,330 +0,0 @@ -/* - * VARCem Virtual ARchaeological Computer EMulator. - * An emulator of (mostly) x86-based PC systems and devices, - * using the ISA,EISA,VLB,MCA and PCI system buses, roughly - * spanning the era between 1981 and 1995. - * - * This file is part of the VARCem Project. - * - * Implementation of a generic Game Port. - * - * Version: @(#)gameport.c 1.0.7 2018/04/05 - * - * Authors: Miran Grca, - * Sarah Walker, - * - * Copyright 2016-2018 Miran Grca. - * Copyright 2008-2018 Sarah Walker. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the: - * - * Free Software Foundation, Inc. - * 59 Temple Place - Suite 330 - * Boston, MA 02111-1307 - * USA. - */ -#include -#include -#include -#include -#include -#include "../emu.h" -#include "../machine/machine.h" -#include "../cpu/cpu.h" -#include "../device.h" -#include "../io.h" -#include "../timer.h" -#include "gameport.h" -#include "joystick_ch_flightstick_pro.h" -#include "joystick_standard.h" -#include "joystick_sw_pad.h" -#include "joystick_tm_fcs.h" - - -typedef struct { - int64_t count; - int axis_nr; - struct _gameport_ *gameport; -} g_axis_t; - -typedef struct _gameport_ { - uint8_t state; - - g_axis_t axis[4]; - - const joystick_if_t *joystick; - void *joystick_dat; -} gameport_t; - - -static const joystick_if_t joystick_none = { - "Disabled", - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - 0, - 0, - 0 -}; - -static const joystick_if_t *joystick_list[] = { - &joystick_none, - &joystick_standard, - &joystick_standard_4button, - &joystick_standard_6button, - &joystick_standard_8button, - &joystick_ch_flightstick_pro, - &joystick_sw_pad, - &joystick_tm_fcs, - NULL -}; -static gameport_t *gameport_global = NULL; - - -char * -joystick_get_name(int js) -{ - if (! joystick_list[js]) - return(NULL); - return((char *)joystick_list[js]->name); -} - - -int -joystick_get_max_joysticks(int js) -{ - return(joystick_list[js]->max_joysticks); -} - - -int -joystick_get_axis_count(int js) -{ - return(joystick_list[js]->axis_count); -} - - -int -joystick_get_button_count(int js) -{ - return(joystick_list[js]->button_count); -} - - -int -joystick_get_pov_count(int js) -{ - return(joystick_list[js]->pov_count); -} - - -char * -joystick_get_axis_name(int js, int id) -{ - return((char *)joystick_list[js]->axis_names[id]); -} - - -char * -joystick_get_button_name(int js, int id) -{ - return((char *)joystick_list[js]->button_names[id]); -} - - -char * -joystick_get_pov_name(int js, int id) -{ - return (char *)joystick_list[js]->pov_names[id]; -} - - -static int -gameport_time(int axis) -{ - if (axis == AXIS_NOT_PRESENT) return(0); - - axis += 32768; - axis = (axis * 100) / 65; /*Axis now in ohms*/ - axis = (axis * 11) / 1000; - - return((int)(TIMER_USEC * (axis + 24))); /*max = 11.115 ms*/ -} - - -static void -gameport_write(uint16_t addr, uint8_t val, void *priv) -{ - gameport_t *p = (gameport_t *)priv; - - timer_clock(); - p->state |= 0x0f; - - p->axis[0].count = gameport_time(p->joystick->read_axis(p->joystick_dat, 0)); - p->axis[1].count = gameport_time(p->joystick->read_axis(p->joystick_dat, 1)); - p->axis[2].count = gameport_time(p->joystick->read_axis(p->joystick_dat, 2)); - p->axis[3].count = gameport_time(p->joystick->read_axis(p->joystick_dat, 3)); - - p->joystick->write(p->joystick_dat); - - cycles -= ISA_CYCLES(8); -} - - -static uint8_t -gameport_read(uint16_t addr, void *priv) -{ - gameport_t *p = (gameport_t *)priv; - uint8_t ret; - - timer_clock(); - ret = p->state | p->joystick->read(p->joystick_dat); - - cycles -= ISA_CYCLES(8); - - return(ret); -} - - -static void -timer_over(void *priv) -{ - g_axis_t *axis = (g_axis_t *)priv; - gameport_t *p = axis->gameport; - - p->state &= ~(1 << axis->axis_nr); - axis->count = 0; - - if (axis == &p->axis[0]) - p->joystick->a0_over(p->joystick_dat); -} - - -static void * -init_common(void) -{ - gameport_t *p = malloc(sizeof(gameport_t)); - - memset(p, 0x00, sizeof(gameport_t)); - - p->axis[0].gameport = p; - p->axis[1].gameport = p; - p->axis[2].gameport = p; - p->axis[3].gameport = p; - - p->axis[0].axis_nr = 0; - p->axis[1].axis_nr = 1; - p->axis[2].axis_nr = 2; - p->axis[3].axis_nr = 3; - - timer_add(timer_over, &p->axis[0].count, &p->axis[0].count, &p->axis[0]); - timer_add(timer_over, &p->axis[1].count, &p->axis[1].count, &p->axis[1]); - timer_add(timer_over, &p->axis[2].count, &p->axis[2].count, &p->axis[2]); - timer_add(timer_over, &p->axis[3].count, &p->axis[3].count, &p->axis[3]); - - p->joystick = joystick_list[joystick_type]; - p->joystick_dat = p->joystick->init(); - - gameport_global = p; - - return(p); -} - - -void -gameport_update_joystick_type(void) -{ - gameport_t *p = gameport_global; - - if (p != NULL) { - p->joystick->close(p->joystick_dat); - p->joystick = joystick_list[joystick_type]; - p->joystick_dat = p->joystick->init(); - } -} - - -static void * -gameport_init(const device_t *info) -{ - gameport_t *p = NULL; - - if (joystick_type == JOYSTICK_TYPE_NONE) { - p = NULL; - return(p); - } - - p = init_common(); - - io_sethandler(0x0200, 8, - gameport_read,NULL,NULL, gameport_write,NULL,NULL, p); - - return(p); -} - - -static void * -gameport_201_init(const device_t *info) -{ - gameport_t *p; - - if (joystick_type == JOYSTICK_TYPE_NONE) { - p = NULL; - return(p); - } - - p = init_common(); - - io_sethandler(0x0201, 1, - gameport_read,NULL,NULL, gameport_write,NULL,NULL, p); - - return(p); -} - - -static void -gameport_close(void *priv) -{ - gameport_t *p = (gameport_t *)priv; - - if (p == NULL) return; - - p->joystick->close(p->joystick_dat); - - gameport_global = NULL; - - free(p); -} - - -const device_t gameport_device = { - "Game port", - 0, 0, - gameport_init, - gameport_close, - NULL, NULL, NULL, NULL, - NULL -}; - -const device_t gameport_201_device = { - "Game port (port 201h only)", - 0, 0, - gameport_201_init, - gameport_close, - NULL, NULL, NULL, NULL, - NULL -}; diff --git a/src/game/gameport.h b/src/game/gameport.h deleted file mode 100644 index 207d6ce..0000000 --- a/src/game/gameport.h +++ /dev/null @@ -1,148 +0,0 @@ -/* - * VARCem Virtual ARchaeological Computer EMulator. - * An emulator of (mostly) x86-based PC systems and devices, - * using the ISA,EISA,VLB,MCA and PCI system buses, roughly - * spanning the era between 1981 and 1995. - * - * This file is part of the VARCem Project. - * - * Definitions for the generic game port handlers. - * - * NOTE: This module needs a good cleanup someday. - * - * Version: @(#)gameport.h 1.0.5 2018/03/28 - * - * Authors: Miran Grca, - * Sarah Walker, - * - * Copyright 2016-2018 Miran Grca. - * Copyright 2008-2017 Sarah Walker. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the: - * - * Free Software Foundation, Inc. - * 59 Temple Place - Suite 330 - * Boston, MA 02111-1307 - * USA. - */ -#ifndef EMU_GAMEPORT_H -# define EMU_GAMEPORT_H - - -#define JOYSTICK_TYPE_NONE 0 /* no joystick defined */ - -#define MAX_PLAT_JOYSTICKS 8 -#define MAX_JOYSTICKS 4 - -#define POV_X 0x80000000 -#define POV_Y 0x40000000 - -#define AXIS_NOT_PRESENT -99999 - -#define JOYSTICK_PRESENT(n) (joystick_state[n].plat_joystick_nr != 0) - - -typedef struct { - char name[64]; - - int a[8]; - int b[32]; - int p[4]; - - struct { - char name[32]; - int id; - } axis[8]; - - struct { - char name[32]; - int id; - } button[32]; - - struct { - char name[32]; - int id; - } pov[4]; - - int nr_axes; - int nr_buttons; - int nr_povs; -} plat_joystick_t; - -typedef struct { - int axis[8]; - int button[32]; - int pov[4]; - - int plat_joystick_nr; - int axis_mapping[8]; - int button_mapping[32]; - int pov_mapping[4][2]; -} joystick_t; - -typedef struct { - const char *name; - - void *(*init)(void); - void (*close)(void *p); - uint8_t (*read)(void *p); - void (*write)(void *p); - int (*read_axis)(void *p, int axis); - void (*a0_over)(void *p); - - int axis_count, - button_count, - pov_count; - int max_joysticks; - const char *axis_names[8]; - const char *button_names[32]; - const char *pov_names[4]; -} joystick_if_t; - - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef EMU_DEVICE_H -extern const device_t gameport_device; -extern const device_t gameport_201_device; -#endif - -extern plat_joystick_t plat_joystick_state[MAX_PLAT_JOYSTICKS]; -extern joystick_t joystick_state[MAX_JOYSTICKS]; -extern int joysticks_present; - - -extern void joystick_init(void); -extern void joystick_close(void); -extern void joystick_process(void); - -extern char *joystick_get_name(int js); -extern int joystick_get_max_joysticks(int js); -extern int joystick_get_axis_count(int js); -extern int joystick_get_button_count(int js); -extern int joystick_get_pov_count(int js); -extern char *joystick_get_axis_name(int js, int id); -extern char *joystick_get_button_name(int js, int id); -extern char *joystick_get_pov_name(int js, int id); - -extern void gameport_update_joystick_type(void); - -#ifdef __cplusplus -} -#endif - - -#endif /*EMU_GAMEPORT_H*/ diff --git a/src/game/joystick_standard.h b/src/game/joystick.c similarity index 73% rename from src/game/joystick_standard.h rename to src/game/joystick.c index 26b1699..b6c989a 100644 --- a/src/game/joystick_standard.h +++ b/src/game/joystick.c @@ -6,14 +6,14 @@ * * This file is part of the VARCem Project. * - * Definitions for the joystick driver. + * Implementation of generic joystick device. * - * Version: @(#)joystick_standard.h 1.0.2 2018/03/15 + * Version: @(#)joystick.c 1.0.1 2018/04/25 * - * Authors: Miran Grca, + * Authors: Fred N. van Kempen, * Sarah Walker, * - * Copyright 2016-2018 Miran Grca. + * Copyright 2018 Fred N. van Kempen. * Copyright 2008-2018 Sarah Walker. * * This program is free software; you can redistribute it and/or modify @@ -34,8 +34,17 @@ * Boston, MA 02111-1307 * USA. */ +#include +#include +#include +#include +#include +#include "../emu.h" +#include "../timer.h" +#include "joystick.h" + + +joystick_t joystick_state[MAX_JOYSTICKS]; +int joysticks_present; + -extern const joystick_if_t joystick_standard; -extern const joystick_if_t joystick_standard_4button; -extern const joystick_if_t joystick_standard_6button; -extern const joystick_if_t joystick_standard_8button; diff --git a/src/game/joystick_tm_fcs.h b/src/game/joystick.h similarity index 51% rename from src/game/joystick_tm_fcs.h rename to src/game/joystick.h index 7ada355..c2c4e46 100644 --- a/src/game/joystick_tm_fcs.h +++ b/src/game/joystick.h @@ -6,15 +6,15 @@ * * This file is part of the VARCem Project. * - * Definitions for the Flight Control System driver. + * Definitions for the joystick devices. * - * Version: @(#)joystick_tm_fcs.h 1.0.2 2018/03/15 + * Version: @(#)joystick.h 1.0.1 2018/04/25 * - * Authors: Miran Grca, + * Authors: Fred N. van Kempen, * Sarah Walker, * - * Copyright 2016-2018 Miran Grca. - * Copyright 2008-2018 Sarah Walker. + * Copyright 2018 Fred N. van Kempen. + * Copyright 2008-2017 Sarah Walker. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -34,5 +34,50 @@ * Boston, MA 02111-1307 * USA. */ +#ifndef EMU_JOYSTICK_H +# define EMU_JOYSTICK_H -extern const joystick_if_t joystick_tm_fcs; + +#define JOYSTICK_NONE 0 /* no joystick defined */ + +#define MAX_JOYSTICKS 4 + +#define POV_X 0x80000000 +#define POV_Y 0x40000000 + +#define AXIS_NOT_PRESENT -99999 + +#define JOYSTICK_PRESENT(n) (joystick_state[n].plat_joystick_nr != 0) + + +typedef struct { + int axis[8]; + int button[32]; + int pov[4]; + + int plat_joystick_nr; + int axis_mapping[8]; + int button_mapping[32]; + int pov_mapping[4][2]; +} joystick_t; + + +#ifdef __cplusplus +extern "C" { +#endif + +extern joystick_t joystick_state[MAX_JOYSTICKS]; +extern int joysticks_present; + + +/* Defined in the platform module. */ +extern void joystick_init(void); +extern void joystick_close(void); +extern void joystick_process(void); + +#ifdef __cplusplus +} +#endif + + +#endif /*EMU_JOYSTICK_H*/ diff --git a/src/game/joystick_ch_flightstick_pro.c b/src/game/joystick_ch_flightstick_pro.c deleted file mode 100644 index 460872c..0000000 --- a/src/game/joystick_ch_flightstick_pro.c +++ /dev/null @@ -1,132 +0,0 @@ -/* - * VARCem Virtual ARchaeological Computer EMulator. - * An emulator of (mostly) x86-based PC systems and devices, - * using the ISA,EISA,VLB,MCA and PCI system buses, roughly - * spanning the era between 1981 and 1995. - * - * This file is part of the VARCem Project. - * - * Implementation of the Flight Stick Pro. - * - * Version: @(#)flightstick_pro.c 1.0.4 2018/03/15 - * - * Authors: Miran Grca, - * Sarah Walker, - * - * Copyright 2016-2018 Miran Grca. - * Copyright 2008-2018 Sarah Walker. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the: - * - * Free Software Foundation, Inc. - * 59 Temple Place - Suite 330 - * Boston, MA 02111-1307 - * USA. - */ -#include -#include -#include -#include -#include -#include "../emu.h" -#include "../device.h" -#include "../timer.h" -#include "gameport.h" -#include "joystick_standard.h" - - -static void *ch_flightstick_pro_init(void) -{ - return NULL; -} - -static void ch_flightstick_pro_close(void *p) -{ -} - -static uint8_t ch_flightstick_pro_read(void *p) -{ - uint8_t ret = 0xf0; - - if (JOYSTICK_PRESENT(0)) - { - if (joystick_state[0].button[0]) - ret &= ~0x10; - if (joystick_state[0].button[1]) - ret &= ~0x20; - if (joystick_state[0].button[2]) - ret &= ~0x40; - if (joystick_state[0].button[3]) - ret &= ~0x80; - if (joystick_state[0].pov[0] != -1) - { - if (joystick_state[0].pov[0] > 315 || joystick_state[0].pov[0] < 45) - ret &= ~0xf0; - else if (joystick_state[0].pov[0] >= 45 && joystick_state[0].pov[0] < 135) - ret &= ~0xb0; - else if (joystick_state[0].pov[0] >= 135 && joystick_state[0].pov[0] < 225) - ret &= ~0x70; - else if (joystick_state[0].pov[0] >= 225 && joystick_state[0].pov[0] < 315) - ret &= ~0x30; - } - } - - return ret; -} - -static void ch_flightstick_pro_write(void *p) -{ -} - -static int ch_flightstick_pro_read_axis(void *p, int axis) -{ - if (!JOYSTICK_PRESENT(0)) - return AXIS_NOT_PRESENT; - - switch (axis) - { - case 0: - return joystick_state[0].axis[0]; - case 1: - return joystick_state[0].axis[1]; - case 2: - return 0; - case 3: - return joystick_state[0].axis[2]; - default: - return 0; - } -} - -static void ch_flightstick_pro_a0_over(void *p) -{ -} - -const joystick_if_t joystick_ch_flightstick_pro = -{ - "CH Flightstick Pro", - ch_flightstick_pro_init, - ch_flightstick_pro_close, - ch_flightstick_pro_read, - ch_flightstick_pro_write, - ch_flightstick_pro_read_axis, - ch_flightstick_pro_a0_over, - 3, - 4, - 1, - 1, - {"X axis", "Y axis", "Throttle"}, - {"Button 1", "Button 2", "Button 3", "Button 4"}, - {"POV"} -}; diff --git a/src/game/joystick_ch_flightstick_pro.h b/src/game/joystick_ch_flightstick_pro.h deleted file mode 100644 index 7cbb717..0000000 --- a/src/game/joystick_ch_flightstick_pro.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * VARCem Virtual ARchaeological Computer EMulator. - * An emulator of (mostly) x86-based PC systems and devices, - * using the ISA,EISA,VLB,MCA and PCI system buses, roughly - * spanning the era between 1981 and 1995. - * - * This file is part of the VARCem Project. - * - * Definitions for the Flight Stick Pro driver. - * - * Version: @(#)joystick_ch_flightstickpro.h 1.0.2 2018/03/15 - * - * Authors: Miran Grca, - * Sarah Walker, - * - * Copyright 2016-2018 Miran Grca. - * Copyright 2008-2018 Sarah Walker. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the: - * - * Free Software Foundation, Inc. - * 59 Temple Place - Suite 330 - * Boston, MA 02111-1307 - * USA. - */ - -extern const joystick_if_t joystick_ch_flightstick_pro; diff --git a/src/game/joystick_standard.c b/src/game/joystick_standard.c deleted file mode 100644 index 616225a..0000000 --- a/src/game/joystick_standard.c +++ /dev/null @@ -1,261 +0,0 @@ -/* - * VARCem Virtual ARchaeological Computer EMulator. - * An emulator of (mostly) x86-based PC systems and devices, - * using the ISA,EISA,VLB,MCA and PCI system buses, roughly - * spanning the era between 1981 and 1995. - * - * This file is part of the VARCem Project. - * - * Implementation of a standard joystick. - * - * Version: @(#)joystick_standard.c 1.0.4 2018/03/15 - * - * Authors: Miran Grca, - * Sarah Walker, - * - * Copyright 2016-2018 Miran Grca. - * Copyright 2008-2018 Sarah Walker. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the: - * - * Free Software Foundation, Inc. - * 59 Temple Place - Suite 330 - * Boston, MA 02111-1307 - * USA. - */ -#include -#include -#include -#include -#include -#include "../emu.h" -#include "../device.h" -#include "../timer.h" -#include "gameport.h" -#include "joystick_standard.h" - - -static void *joystick_standard_init(void) -{ - return NULL; -} - -static void joystick_standard_close(void *p) -{ -} - -static uint8_t joystick_standard_read(void *p) -{ - uint8_t ret = 0xf0; - - if (JOYSTICK_PRESENT(0)) - { - if (joystick_state[0].button[0]) - ret &= ~0x10; - if (joystick_state[0].button[1]) - ret &= ~0x20; - } - if (JOYSTICK_PRESENT(1)) - { - if (joystick_state[1].button[0]) - ret &= ~0x40; - if (joystick_state[1].button[1]) - ret &= ~0x80; - } - - return ret; -} - -static uint8_t joystick_standard_read_4button(void *p) -{ - uint8_t ret = 0xf0; - - if (JOYSTICK_PRESENT(0)) - { - if (joystick_state[0].button[0]) - ret &= ~0x10; - if (joystick_state[0].button[1]) - ret &= ~0x20; - if (joystick_state[0].button[2]) - ret &= ~0x40; - if (joystick_state[0].button[3]) - ret &= ~0x80; - } - - return ret; -} - -static void joystick_standard_write(void *p) -{ -} - -static int joystick_standard_read_axis(void *p, int axis) -{ - switch (axis) - { - case 0: - if (!JOYSTICK_PRESENT(0)) - return AXIS_NOT_PRESENT; - return joystick_state[0].axis[0]; - case 1: - if (!JOYSTICK_PRESENT(0)) - return AXIS_NOT_PRESENT; - return joystick_state[0].axis[1]; - case 2: - if (!JOYSTICK_PRESENT(1)) - return AXIS_NOT_PRESENT; - return joystick_state[1].axis[0]; - case 3: - if (!JOYSTICK_PRESENT(1)) - return AXIS_NOT_PRESENT; - return joystick_state[1].axis[1]; - default: - return 0; - } -} - -static int joystick_standard_read_axis_4button(void *p, int axis) -{ - if (!JOYSTICK_PRESENT(0)) - return AXIS_NOT_PRESENT; - - switch (axis) - { - case 0: - return joystick_state[0].axis[0]; - case 1: - return joystick_state[0].axis[1]; - case 2: - return 0; - case 3: - return 0; - default: - return 0; - } -} -static int joystick_standard_read_axis_6button(void *p, int axis) -{ - if (!JOYSTICK_PRESENT(0)) - return AXIS_NOT_PRESENT; - - switch (axis) - { - case 0: - return joystick_state[0].axis[0]; - case 1: - return joystick_state[0].axis[1]; - case 2: - return joystick_state[0].button[4] ? -32767 : 32768; - case 3: - return joystick_state[0].button[5] ? -32767 : 32768; - default: - return 0; - } -} -static int joystick_standard_read_axis_8button(void *p, int axis) -{ - if (!JOYSTICK_PRESENT(0)) - return AXIS_NOT_PRESENT; - - switch (axis) - { - case 0: - return joystick_state[0].axis[0]; - case 1: - return joystick_state[0].axis[1]; - case 2: - if (joystick_state[0].button[4]) - return -32767; - if (joystick_state[0].button[6]) - return 32768; - return 0; - case 3: - if (joystick_state[0].button[5]) - return -32767; - if (joystick_state[0].button[7]) - return 32768; - return 0; - default: - return 0; - } -} - -static void joystick_standard_a0_over(void *p) -{ -} - -const joystick_if_t joystick_standard = -{ - "Standard 2-button joystick(s)", - joystick_standard_init, - joystick_standard_close, - joystick_standard_read, - joystick_standard_write, - joystick_standard_read_axis, - joystick_standard_a0_over, - 2, - 2, - 0, - 2, - {"X axis", "Y axis"}, - {"Button 1", "Button 2"} -}; -const joystick_if_t joystick_standard_4button = -{ - "Standard 4-button joystick", - joystick_standard_init, - joystick_standard_close, - joystick_standard_read_4button, - joystick_standard_write, - joystick_standard_read_axis_4button, - joystick_standard_a0_over, - 2, - 4, - 0, - 1, - {"X axis", "Y axis"}, - {"Button 1", "Button 2", "Button 3", "Button 4"} -}; -const joystick_if_t joystick_standard_6button = -{ - "Standard 6-button joystick", - joystick_standard_init, - joystick_standard_close, - joystick_standard_read_4button, - joystick_standard_write, - joystick_standard_read_axis_6button, - joystick_standard_a0_over, - 2, - 6, - 0, - 1, - {"X axis", "Y axis"}, - {"Button 1", "Button 2", "Button 3", "Button 4", "Button 5", "Button 6"} -}; -const joystick_if_t joystick_standard_8button = -{ - "Standard 8-button joystick", - joystick_standard_init, - joystick_standard_close, - joystick_standard_read_4button, - joystick_standard_write, - joystick_standard_read_axis_8button, - joystick_standard_a0_over, - 2, - 8, - 0, - 1, - {"X axis", "Y axis"}, - {"Button 1", "Button 2", "Button 3", "Button 4", "Button 5", "Button 6", "Button 7", "Button 8"} -}; diff --git a/src/game/joystick_sw_pad.c b/src/game/joystick_sw_pad.c deleted file mode 100644 index 257a4ab..0000000 --- a/src/game/joystick_sw_pad.c +++ /dev/null @@ -1,288 +0,0 @@ -/* - * VARCem Virtual ARchaeological Computer EMulator. - * An emulator of (mostly) x86-based PC systems and devices, - * using the ISA,EISA,VLB,MCA and PCI system buses, roughly - * spanning the era between 1981 and 1995. - * - * This file is part of the VARCem Project. - * - * Implementation of a Side Winder GamePad. - * - * Notes: - Write to 0x201 starts packet transfer (5*N or 15*N bits) - * - Currently alternates between Mode A and Mode B (is there - * any way of actually controlling which is used?) - * - Windows 9x drivers require Mode B when more than 1 pad - * connected - * - Packet preceeded by high data (currently 50us), and - * followed by low data (currently 160us) - timings are - * probably wrong, but good enoughfor everything I've tried - * - Analog inputs are only used to time ID packet request. - * If A0 timing out is followed after ~64us by another 0x201 - * write then an ID packet is triggered - * - Sidewinder game pad ID is 'H0003' - * - ID is sent in Mode A (1 bit per clock), but data bit 2 - * must change during ID packet transfer, or Windows 9x - * drivers won't use Mode B. I don't know if it oscillates, - * mirrors the data transfer, or something else - the drivers - * only check that it changes at least 10 times during the - * transfer - * - Some DOS stuff will write to 0x201 while a packet is - * being transferred. This seems to be ignored. - * - * Version: @(#)sw_pad.c 1.0.5 2018/03/15 - * - * Authors: Miran Grca, - * Sarah Walker, - * - * Copyright 2016-2018 Miran Grca. - * Copyright 2008-2018 Sarah Walker. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the: - * - * Free Software Foundation, Inc. - * 59 Temple Place - Suite 330 - * Boston, MA 02111-1307 - * USA. - */ -#include -#include -#include -#include -#include -#include "../emu.h" -#include "../device.h" -#include "../timer.h" -#include "gameport.h" -#include "joystick_sw_pad.h" - - -typedef struct -{ - int64_t poll_time; - int64_t poll_left; - int64_t poll_clock; - uint64_t poll_data; - int64_t poll_mode; - - int64_t trigger_time; - int64_t data_mode; -} sw_data; - -static void sw_timer_over(void *p) -{ - sw_data *sw = (sw_data *)p; - - while (sw->poll_time <= 0 && sw->poll_left) - { - sw->poll_clock = !sw->poll_clock; - - if (sw->poll_clock) - { - sw->poll_data >>= (sw->poll_mode ? 3 : 1); - sw->poll_left--; - } - - if (sw->poll_left == 1 && !sw->poll_clock) - sw->poll_time += TIMER_USEC * 160LL; - else if (sw->poll_left) - sw->poll_time += TIMER_USEC * 5; - else - sw->poll_time = 0; - } - - if (!sw->poll_left) - sw->poll_time = 0; -} - -static void sw_trigger_timer_over(void *p) -{ - sw_data *sw = (sw_data *)p; - - sw->trigger_time = 0; -} - -static int sw_parity(uint16_t data) -{ - int bits_set = 0; - - while (data) - { - bits_set++; - data &= (data - 1); - } - - return bits_set & 1; -} - -static void *sw_init(void) -{ - sw_data *sw = (sw_data *)malloc(sizeof(sw_data)); - memset(sw, 0, sizeof(sw_data)); - - timer_add(sw_timer_over, &sw->poll_time, &sw->poll_time, sw); - timer_add(sw_trigger_timer_over, &sw->trigger_time, &sw->trigger_time, sw); - - return sw; -} - -static void sw_close(void *p) -{ - sw_data *sw = (sw_data *)p; - - free(sw); -} - -static uint8_t sw_read(void *p) -{ - sw_data *sw = (sw_data *)p; - uint8_t temp = 0; - - if (!JOYSTICK_PRESENT(0)) - return 0xff; - - if (sw->poll_time) - { - if (sw->poll_clock) - temp |= 0x10; - - if (sw->poll_mode) - temp |= (sw->poll_data & 7) << 5; - else - { - temp |= ((sw->poll_data & 1) << 5) | 0xc0; - if (sw->poll_left > 31 && !(sw->poll_left & 1)) - temp &= ~0x80; - } - } - else - temp |= 0xf0; - - return temp; -} - -static void sw_write(void *p) -{ - sw_data *sw = (sw_data *)p; - int64_t time_since_last = sw->trigger_time / TIMER_USEC; - - if (!JOYSTICK_PRESENT(0)) - return; - - timer_process(); - - if (!sw->poll_left) - { - sw->poll_clock = 1; - sw->poll_time = TIMER_USEC * 50; - - if (time_since_last > 9900 && time_since_last < 9940) - { - sw->poll_mode = 0; - sw->poll_left = 49; - sw->poll_data = 0x2400ull | (0x1830ull << 15) | (0x19b0ull << 30); - } - else - { - int c; - - sw->poll_mode = sw->data_mode; - sw->data_mode = !sw->data_mode; - - if (sw->poll_mode) - { - sw->poll_left = 1; - sw->poll_data = 7; - } - else - { - sw->poll_left = 1; - sw->poll_data = 1; - } - - for (c = 0; c < 4; c++) - { - uint16_t data = 0x3fff; - int b; - - if (!JOYSTICK_PRESENT(c)) - break; - - if (joystick_state[c].axis[1] < -16383) - data &= ~1; - if (joystick_state[c].axis[1] > 16383) - data &= ~2; - if (joystick_state[c].axis[0] > 16383) - data &= ~4; - if (joystick_state[c].axis[0] < -16383) - data &= ~8; - - for (b = 0; b < 10; b++) - { - if (joystick_state[c].button[b]) - data &= ~(1 << (b + 4)); - } - - if (sw_parity(data)) - data |= 0x4000; - - if (sw->poll_mode) - { - sw->poll_left += 5; - sw->poll_data |= (data << (c*15 + 3)); - } - else - { - sw->poll_left += 15; - sw->poll_data |= (data << (c*15 + 1)); - } - } - } - } - - sw->trigger_time = 0; - - timer_update_outstanding(); -} - -static int sw_read_axis(void *p, int axis) -{ - if (!JOYSTICK_PRESENT(0)) - return AXIS_NOT_PRESENT; - - return 0LL; /*No analogue support on Sidewinder game pad*/ -} - -static void sw_a0_over(void *p) -{ - sw_data *sw = (sw_data *)p; - - sw->trigger_time = TIMER_USEC * 10000; -} - -const joystick_if_t joystick_sw_pad = -{ - "Microsoft SideWinder Pad", - sw_init, - sw_close, - sw_read, - sw_write, - sw_read_axis, - sw_a0_over, - 2, - 10, - 0, - 4, - {"X axis", "Y axis"}, - {"A", "B", "C", "X", "Y", "Z", "L", "R", "Start", "M"} -}; diff --git a/src/game/joystick_tm_fcs.c b/src/game/joystick_tm_fcs.c deleted file mode 100644 index 01bf9dd..0000000 --- a/src/game/joystick_tm_fcs.c +++ /dev/null @@ -1,131 +0,0 @@ -/* - * VARCem Virtual ARchaeological Computer EMulator. - * An emulator of (mostly) x86-based PC systems and devices, - * using the ISA,EISA,VLB,MCA and PCI system buses, roughly - * spanning the era between 1981 and 1995. - * - * This file is part of the VARCem Project. - * - * Implementation of Thrust Master Flight Control System. - * - * Version: @(#)tm_fcs.c 1.0.3 2018/03/15 - * - * Authors: Miran Grca, - * Sarah Walker, - * - * Copyright 2016-2018 Miran Grca. - * Copyright 2008-2018 Sarah Walker. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the: - * - * Free Software Foundation, Inc. - * 59 Temple Place - Suite 330 - * Boston, MA 02111-1307 - * USA. - */ -#include -#include -#include -#include -#include -#include "../emu.h" -#include "../device.h" -#include "../timer.h" -#include "gameport.h" -#include "joystick_standard.h" - - -static void *tm_fcs_init(void) -{ - return NULL; -} - -static void tm_fcs_close(void *p) -{ -} - -static uint8_t tm_fcs_read(void *p) -{ - uint8_t ret = 0xf0; - - if (JOYSTICK_PRESENT(0)) - { - if (joystick_state[0].button[0]) - ret &= ~0x10; - if (joystick_state[0].button[1]) - ret &= ~0x20; - if (joystick_state[0].button[2]) - ret &= ~0x40; - if (joystick_state[0].button[3]) - ret &= ~0x80; - } - - return ret; -} - -static void tm_fcs_write(void *p) -{ -} - -static int tm_fcs_read_axis(void *p, int axis) -{ - if (!JOYSTICK_PRESENT(0)) - return AXIS_NOT_PRESENT; - - switch (axis) - { - case 0: - return joystick_state[0].axis[0]; - case 1: - return joystick_state[0].axis[1]; - case 2: - return 0; - case 3: - if (joystick_state[0].pov[0] == -1) - return 32767; - if (joystick_state[0].pov[0] > 315 || joystick_state[0].pov[0] < 45) - return -32768; - if (joystick_state[0].pov[0] >= 45 && joystick_state[0].pov[0] < 135) - return -16384; - if (joystick_state[0].pov[0] >= 135 && joystick_state[0].pov[0] < 225) - return 0; - if (joystick_state[0].pov[0] >= 225 && joystick_state[0].pov[0] < 315) - return 16384; - return 0; - default: - return 0; - } -} - -static void tm_fcs_a0_over(void *p) -{ -} - -const joystick_if_t joystick_tm_fcs = -{ - "Thrustmaster Flight Control System", - tm_fcs_init, - tm_fcs_close, - tm_fcs_read, - tm_fcs_write, - tm_fcs_read_axis, - tm_fcs_a0_over, - 2, - 4, - 1, - 1, - {"X axis", "Y axis"}, - {"Button 1", "Button 2", "Button 3", "Button 4"}, - {"POV"} -}; diff --git a/src/game/js_ch_fs_pro.c b/src/game/js_ch_fs_pro.c new file mode 100644 index 0000000..e8b3644 --- /dev/null +++ b/src/game/js_ch_fs_pro.c @@ -0,0 +1,140 @@ +/* + * VARCem Virtual ARchaeological Computer EMulator. + * An emulator of (mostly) x86-based PC systems and devices, + * using the ISA,EISA,VLB,MCA and PCI system buses, roughly + * spanning the era between 1981 and 1995. + * + * This file is part of the VARCem Project. + * + * Implementation of the Flight Stick Pro. + * + * Version: @(#)js_fs_pro.c 1.0.5 2018/04/26 + * + * Authors: Miran Grca, + * Sarah Walker, + * + * Copyright 2016-2018 Miran Grca. + * Copyright 2008-2018 Sarah Walker. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the: + * + * Free Software Foundation, Inc. + * 59 Temple Place - Suite 330 + * Boston, MA 02111-1307 + * USA. + */ +#include +#include +#include +#include +#include +#include "../emu.h" +#include "../timer.h" +#include "../ports/game_dev.h" +#include "joystick.h" + + +static uint8_t +js_read(void *priv) +{ + uint8_t ret = 0xf0; + + if (JOYSTICK_PRESENT(0)) { + if (joystick_state[0].button[0]) + ret &= ~0x10; + if (joystick_state[0].button[1]) + ret &= ~0x20; + if (joystick_state[0].button[2]) + ret &= ~0x40; + if (joystick_state[0].button[3]) + ret &= ~0x80; + if (joystick_state[0].pov[0] != -1) { + if (joystick_state[0].pov[0] > 315 || joystick_state[0].pov[0] < 45) + ret &= ~0xf0; + else if (joystick_state[0].pov[0] >= 45 && joystick_state[0].pov[0] < 135) + ret &= ~0xb0; + else if (joystick_state[0].pov[0] >= 135 && joystick_state[0].pov[0] < 225) + ret &= ~0x70; + else if (joystick_state[0].pov[0] >= 225 && joystick_state[0].pov[0] < 315) + ret &= ~0x30; + } + } + + return(ret); +} + + +static void +js_write(void *priv) +{ +} + + +static int +js_read_axis(void *priv, int axis) +{ + if (! JOYSTICK_PRESENT(0)) return(AXIS_NOT_PRESENT); + + switch (axis) { + case 0: + return(joystick_state[0].axis[0]); + + case 1: + return(joystick_state[0].axis[1]); + + case 2: + return(0); + + case 3: + return(joystick_state[0].axis[2]); + + default: + return(0); + } +} + + +static void +js_over(void *priv) +{ +} + + +static void * +js_init(void) +{ + return(NULL); +} + + +static void +js_close(void *priv) +{ +} + + +const gamedev_t js_ch_fs_pro = { + "CH Flightstick Pro", + js_init, js_close, + js_read, js_write, + js_read_axis, + js_over, + 3, + 4, + 1, + 1, + { "X axis", "Y axis", "Throttle" }, + { "Button 1", "Button 2", "Button 3", "Button 4" }, + { "POV" } +}; diff --git a/src/game/js_standard.c b/src/game/js_standard.c new file mode 100644 index 0000000..9dbdde5 --- /dev/null +++ b/src/game/js_standard.c @@ -0,0 +1,301 @@ +/* + * VARCem Virtual ARchaeological Computer EMulator. + * An emulator of (mostly) x86-based PC systems and devices, + * using the ISA,EISA,VLB,MCA and PCI system buses, roughly + * spanning the era between 1981 and 1995. + * + * This file is part of the VARCem Project. + * + * Implementation of a standard joystick. + * + * Version: @(#)js_standard.c 1.0.6 2018/04/26 + * + * Authors: Fred N. van Kempen, + * Sarah Walker, + * + * Copyright 2018 Fred N. van Kempen. + * Copyright 2008-2018 Sarah Walker. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the: + * + * Free Software Foundation, Inc. + * 59 Temple Place - Suite 330 + * Boston, MA 02111-1307 + * USA. + */ +#include +#include +#include +#include +#include +#include "../emu.h" +#include "../timer.h" +#include "../ports/game_dev.h" +#include "joystick.h" + + +static uint8_t +js_read(void *priv) +{ + uint8_t ret = 0xf0; + + if (JOYSTICK_PRESENT(0)) { + if (joystick_state[0].button[0]) + ret &= ~0x10; + if (joystick_state[0].button[1]) + ret &= ~0x20; + } + + if (JOYSTICK_PRESENT(1)) { + if (joystick_state[1].button[0]) + ret &= ~0x40; + if (joystick_state[1].button[1]) + ret &= ~0x80; + } + + return(ret); +} + + +static uint8_t +js_read_4button(void *priv) +{ + uint8_t ret = 0xf0; + + if (JOYSTICK_PRESENT(0)) { + if (joystick_state[0].button[0]) + ret &= ~0x10; + if (joystick_state[0].button[1]) + ret &= ~0x20; + if (joystick_state[0].button[2]) + ret &= ~0x40; + if (joystick_state[0].button[3]) + ret &= ~0x80; + } + + return(ret); +} + + +static void +js_write(void *priv) +{ +} + + +static int +js_axis(void *priv, int axis) +{ + int ret = AXIS_NOT_PRESENT; + + switch (axis) { + case 0: + if (JOYSTICK_PRESENT(0)) + ret = joystick_state[0].axis[0]; + break; + + case 1: + if (JOYSTICK_PRESENT(0)) + ret = joystick_state[0].axis[1]; + break; + + case 2: + if (JOYSTICK_PRESENT(1)) + ret = joystick_state[1].axis[0]; + break; + + case 3: + if (JOYSTICK_PRESENT(1)) + ret = joystick_state[1].axis[1]; + break; + + default: + break; + } + + return(ret); +} + + +static int +js_axis_4button(void *priv, int axis) +{ + int ret = AXIS_NOT_PRESENT; + + if (! JOYSTICK_PRESENT(0)) return(ret); + + switch (axis) { + case 0: + ret = joystick_state[0].axis[0]; + break; + + case 1: + ret = joystick_state[0].axis[1]; + break; + + case 2: + case 3: + default: + ret = 0; + break; + } + + return(ret); +} + + +static int +js_axis_6button(void *priv, int axis) +{ + int ret = AXIS_NOT_PRESENT; + + if (! JOYSTICK_PRESENT(0)) return(ret); + + switch (axis) { + case 0: + ret = joystick_state[0].axis[0]; + break; + + case 1: + ret = joystick_state[0].axis[1]; + break; + + case 2: + ret = joystick_state[0].button[4] ? -32767 : 32768; + break; + + case 3: + ret = joystick_state[0].button[5] ? -32767 : 32768; + break; + + default: + ret = 0; + break; + } + + return(0); +} + + +static int +js_axis_8button(void *priv, int axis) +{ + int ret = AXIS_NOT_PRESENT; + + if (! JOYSTICK_PRESENT(0)) return(ret); + + switch (axis) { + case 0: + ret = joystick_state[0].axis[0]; + + case 1: + ret = joystick_state[0].axis[1]; + + case 2: + ret = 0; + if (joystick_state[0].button[4]) + ret = -32767; + if (joystick_state[0].button[6]) + ret = 32768; + break; + + case 3: + ret = 0; + if (joystick_state[0].button[5]) + ret = -32767; + if (joystick_state[0].button[7]) + ret = 32768; + break; + + default: + ret = 0; + break; + } + + return(ret); +} + + +static void +js_over(void *priv) +{ +} + + +static void * +js_init(void) +{ + return(NULL); +} + + +static void +js_close(void *priv) +{ +} + + +const gamedev_t js_standard = { + "Standard 2-button joystick(s)", + js_init, js_close, + js_read, js_write, + js_axis, + js_over, + 2, + 2, + 0, + 2, + { "X axis", "Y axis" }, + { "Button 1", "Button 2" } +}; + +const gamedev_t js_standard_4btn = { + "Standard 4-button joystick", + js_init, js_close, + js_read_4button, js_write, + js_axis_4button, js_over, + 2, + 4, + 0, + 1, + { "X axis", "Y axis" }, + { "Button 1", "Button 2", "Button 3", "Button 4" } +}; + +const gamedev_t js_standard_6btn = { + "Standard 6-button joystick", + js_init, js_close, + js_read_4button, js_write, + js_axis_6button, js_over, + 2, + 6, + 0, + 1, + { "X axis", "Y axis" }, + { "Button 1", "Button 2", "Button 3", "Button 4", "Button 5", "Button 6" } +}; + +const gamedev_t js_standard_8btn = { + "Standard 8-button joystick", + js_init, js_close, + js_read_4button, js_write, + js_axis_8button, js_over, + 2, + 8, + 0, + 1, + { "X axis", "Y axis" }, + { "Button 1", "Button 2", "Button 3", "Button 4", + "Button 5", "Button 6", "Button 7", "Button 8" } +}; diff --git a/src/game/js_sw_pad.c b/src/game/js_sw_pad.c new file mode 100644 index 0000000..8108302 --- /dev/null +++ b/src/game/js_sw_pad.c @@ -0,0 +1,285 @@ +/* + * VARCem Virtual ARchaeological Computer EMulator. + * An emulator of (mostly) x86-based PC systems and devices, + * using the ISA,EISA,VLB,MCA and PCI system buses, roughly + * spanning the era between 1981 and 1995. + * + * This file is part of the VARCem Project. + * + * Implementation of a Side Winder GamePad. + * + * Notes: - Write to 0x201 starts packet transfer (5*N or 15*N bits) + * - Currently alternates between Mode A and Mode B (is there + * any way of actually controlling which is used?) + * - Windows 9x drivers require Mode B when more than 1 pad + * connected + * - Packet preceeded by high data (currently 50us), and + * followed by low data (currently 160us) - timings are + * probably wrong, but good enough for everything I've tried + * - Analog inputs are only used to time ID packet request. + * If A0 timing out is followed after ~64us by another 0x201 + * write then an ID packet is triggered + * - Sidewinder game pad ID is 'H0003' + * - ID is sent in Mode A (1 bit per clock), but data bit 2 + * must change during ID packet transfer, or Windows 9x + * drivers won't use Mode B. I don't know if it oscillates, + * mirrors the data transfer, or something else - the drivers + * only check that it changes at least 10 times during the + * transfer + * - Some DOS stuff will write to 0x201 while a packet is + * being transferred. This seems to be ignored. + * + * Version: @(#)js_sw_pad.c 1.0.6 2018/04/26 + * + * Authors: Fred N. van Kempen, + * Sarah Walker, + * + * Copyright 2018 Fred N. van Kempen. + * Copyright 2008-2018 Sarah Walker. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the: + * + * Free Software Foundation, Inc. + * 59 Temple Place - Suite 330 + * Boston, MA 02111-1307 + * USA. + */ +#include +#include +#include +#include +#include +#include "../emu.h" +#include "../timer.h" +#include "../ports/game_dev.h" +#include "joystick.h" + + +typedef struct { + int64_t poll_time; + int64_t poll_left; + int64_t poll_clock; + uint64_t poll_data; + int64_t poll_mode; + + int64_t trigger_time; + int64_t data_mode; +} sw_data; + + +static void +timer_over(void *priv) +{ + sw_data *sw = (sw_data *)priv; + + while (sw->poll_time <= 0 && sw->poll_left) { + sw->poll_clock = !sw->poll_clock; + + if (sw->poll_clock) { + sw->poll_data >>= (sw->poll_mode ? 3 : 1); + sw->poll_left--; + } + + if (sw->poll_left == 1 && !sw->poll_clock) + sw->poll_time += TIMER_USEC * 160LL; + else if (sw->poll_left) + sw->poll_time += TIMER_USEC * 5; + else + sw->poll_time = 0; + } + + if (! sw->poll_left) + sw->poll_time = 0; +} + + +static void +trigger_timer_over(void *priv) +{ + sw_data *sw = (sw_data *)priv; + + sw->trigger_time = 0; +} + + +static int +sw_parity(uint16_t data) +{ + int bits_set = 0; + + while (data) { + bits_set++; + data &= (data - 1); + } + + return(bits_set & 1); +} + + +static void * +sw_init(void) +{ + sw_data *sw = (sw_data *)malloc(sizeof(sw_data)); + +pclog("SideWinder: initializing..\n"); + memset(sw, 0x00, sizeof(sw_data)); + + timer_add(timer_over, &sw->poll_time, &sw->poll_time, sw); + timer_add(trigger_timer_over, &sw->trigger_time, &sw->trigger_time, sw); + + return sw; +} + + +static void +sw_close(void *priv) +{ + sw_data *sw = (sw_data *)priv; + +pclog("SideWinder: closing.\n"); + free(sw); +} + + +static uint8_t +sw_read(void *priv) +{ + sw_data *sw = (sw_data *)priv; + uint8_t temp = 0; + +pclog("SideWinder: read(): %d\n", !!JOYSTICK_PRESENT(0)); + if (! JOYSTICK_PRESENT(0)) return(0xff); + + if (sw->poll_time) { + if (sw->poll_clock) + temp |= 0x10; + + if (sw->poll_mode) + temp |= (sw->poll_data & 7) << 5; + else { + temp |= ((sw->poll_data & 1) << 5) | 0xc0; + if (sw->poll_left > 31 && !(sw->poll_left & 1)) + temp &= ~0x80; + } + } else + temp |= 0xf0; + + return(temp); +} + + +static void +sw_write(void *priv) +{ + sw_data *sw = (sw_data *)priv; + int64_t time_since_last = sw->trigger_time / TIMER_USEC; + +pclog("SideWinder: write(): %d\n", !!JOYSTICK_PRESENT(0)); + if (! JOYSTICK_PRESENT(0)) return; + + timer_process(); + + if (! sw->poll_left) { + sw->poll_clock = 1; + sw->poll_time = TIMER_USEC * 50; + + if (time_since_last > 9900 && time_since_last < 9940) { + sw->poll_mode = 0; + sw->poll_left = 49; + sw->poll_data = 0x2400ull | (0x1830ull << 15) | (0x19b0ull << 30); + } else { + int c; + + sw->poll_mode = sw->data_mode; + sw->data_mode = !sw->data_mode; + + if (sw->poll_mode) { + sw->poll_left = 1; + sw->poll_data = 7; + } else { + sw->poll_left = 1; + sw->poll_data = 1; + } + + for (c = 0; c < 4; c++) { + uint16_t data = 0x3fff; + int b; + + if (! JOYSTICK_PRESENT(c)) break; + + if (joystick_state[c].axis[1] < -16383) + data &= ~1; + if (joystick_state[c].axis[1] > 16383) + data &= ~2; + if (joystick_state[c].axis[0] > 16383) + data &= ~4; + if (joystick_state[c].axis[0] < -16383) + data &= ~8; + + for (b = 0; b < 10; b++) { + if (joystick_state[c].button[b]) + data &= ~(1 << (b + 4)); + } + + if (sw_parity(data)) + data |= 0x4000; + + if (sw->poll_mode) { + sw->poll_left += 5; + sw->poll_data |= (data << (c*15 + 3)); + } else { + sw->poll_left += 15; + sw->poll_data |= (data << (c*15 + 1)); + } + } + } + } + + sw->trigger_time = 0; + + timer_update_outstanding(); +} + + +static int +sw_axis(void *priv, int axis) +{ + if (! JOYSTICK_PRESENT(0)) + return AXIS_NOT_PRESENT; + + return 0LL; /*No analogue support on Sidewinder game pad*/ +} + + +static void +sw_over(void *priv) +{ + sw_data *sw = (sw_data *)priv; + + sw->trigger_time = TIMER_USEC * 10000; +} + + +const gamedev_t js_sw_pad = { + "Microsoft SideWinder Pad", + sw_init, sw_close, + sw_read, sw_write, + sw_axis, sw_over, + 2, + 10, + 0, + 4, + {"X axis", "Y axis"}, + {"A", "B", "C", "X", "Y", "Z", "L", "R", "Start", "M"} +}; diff --git a/src/game/js_tm_fcs.c b/src/game/js_tm_fcs.c new file mode 100644 index 0000000..a035044 --- /dev/null +++ b/src/game/js_tm_fcs.c @@ -0,0 +1,148 @@ +/* + * VARCem Virtual ARchaeological Computer EMulator. + * An emulator of (mostly) x86-based PC systems and devices, + * using the ISA,EISA,VLB,MCA and PCI system buses, roughly + * spanning the era between 1981 and 1995. + * + * This file is part of the VARCem Project. + * + * Implementation of Thrust Master Flight Control System. + * + * Version: @(#)js_tm_fcs.c 1.0.4 2018/04/26 + * + * Authors: Fred N. van Kempen, + * Sarah Walker, + * + * Copyright 2018 Fred N. van Kempen. + * Copyright 2008-2018 Sarah Walker. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the: + * + * Free Software Foundation, Inc. + * 59 Temple Place - Suite 330 + * Boston, MA 02111-1307 + * USA. + */ +#include +#include +#include +#include +#include +#include "../emu.h" +#include "../timer.h" +#include "../ports/game_dev.h" +#include "joystick.h" + + +static uint8_t +tm_fcs_read(void *priv) +{ + uint8_t ret = 0xf0; + + if (JOYSTICK_PRESENT(0)) { + if (joystick_state[0].button[0]) + ret &= ~0x10; + if (joystick_state[0].button[1]) + ret &= ~0x20; + if (joystick_state[0].button[2]) + ret &= ~0x40; + if (joystick_state[0].button[3]) + ret &= ~0x80; + } + + return(ret); +} + + +static void +tm_fcs_write(void *priv) +{ +} + + +static int +tm_fcs_axis(void *priv, int axis) +{ + int ret = 0; + + if (! JOYSTICK_PRESENT(0)) return(AXIS_NOT_PRESENT); + + switch (axis) { + case 0: + ret = joystick_state[0].axis[0]; + break; + + case 1: + ret = joystick_state[0].axis[1]; + break; + + case 2: + break; + + case 3: + if (joystick_state[0].pov[0] == -1) + ret = 32767; + if (joystick_state[0].pov[0] > 315 || joystick_state[0].pov[0] < 45) + ret = -32768; + + if (joystick_state[0].pov[0] >= 45 && joystick_state[0].pov[0] < 135) + ret = -16384; + + if (joystick_state[0].pov[0] >= 135 && joystick_state[0].pov[0] < 225) + ret = 0; + + if (joystick_state[0].pov[0] >= 225 && joystick_state[0].pov[0] < 315) + ret = 16384; + break; + + default: + break; + } + + return(ret); +} + + +static void +tm_fcs_over(void *priv) +{ +} + + +static void * +tm_fcs_init(void) +{ + return(NULL); +} + + +static void +tm_fcs_close(void *priv) +{ +} + + +const gamedev_t js_tm_fcs = { + "Thrustmaster Flight Control System", + tm_fcs_init, tm_fcs_close, + tm_fcs_read, tm_fcs_write, + tm_fcs_axis, tm_fcs_over, + 2, + 4, + 1, + 1, + { "X axis", "Y axis" }, + { "Button 1", "Button 2", "Button 3", "Button 4" }, + { "POV" } +}; diff --git a/src/machine/m_amstrad.c b/src/machine/m_amstrad.c index 3c28636..343056e 100644 --- a/src/machine/m_amstrad.c +++ b/src/machine/m_amstrad.c @@ -32,7 +32,7 @@ * BIOSES: I need to re-do the bios.txt format so we can load non-BIOS * ROM files for a given machine, such as font roms here.. * - * Version: @(#)m_amstrad.c 1.0.12 2018/04/14 + * Version: @(#)m_amstrad.c 1.0.14 2018/04/26 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -79,8 +79,7 @@ #include "../nvr.h" #include "../keyboard.h" #include "../mouse.h" -#include "../game/gameport.h" -#include "../parallel.h" +#include "../ports/parallel.h" #include "../floppy/fdd.h" #include "../floppy/fdc.h" #include "../sound/sound.h" @@ -1318,7 +1317,4 @@ machine_amstrad_init(const machine_t *model, void *arg) mouse_reset(); mouse_set_poll(ms_poll, ams); } - - if (joystick_type != JOYSTICK_TYPE_NONE) - device_add(&gameport_device); } diff --git a/src/machine/m_at.c b/src/machine/m_at.c index 7e751d3..8fb88b0 100644 --- a/src/machine/m_at.c +++ b/src/machine/m_at.c @@ -8,7 +8,7 @@ * * Standard PC/AT implementation. * - * Version: @(#)m_at.c 1.0.5 2018/04/05 + * Version: @(#)m_at.c 1.0.7 2018/04/26 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -48,7 +48,6 @@ #include "../device.h" #include "../nvr.h" #include "../keyboard.h" -#include "../game/gameport.h" #include "../floppy/fdd.h" #include "../floppy/fdc.h" #include "../disk/hdc.h" @@ -65,9 +64,6 @@ machine_at_common_init(const machine_t *model, void *arg) dma16_init(); device_add(&at_nvr_device); - - if (joystick_type != JOYSTICK_TYPE_NONE) - device_add(&gameport_device); } diff --git a/src/machine/m_at_commodore.c b/src/machine/m_at_commodore.c index 77a4458..cd8b83c 100644 --- a/src/machine/m_at_commodore.c +++ b/src/machine/m_at_commodore.c @@ -8,7 +8,7 @@ * * Implementation of the Commodore PC3 system. * - * Version: @(#)m_at_commodore.c 1.0.5 2018/04/07 + * Version: @(#)m_at_commodore.c 1.0.6 2018/04/26 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -43,8 +43,8 @@ #include "../emu.h" #include "../device.h" #include "../io.h" -#include "../serial.h" -#include "../parallel.h" +#include "../ports/parallel.h" +#include "../ports/serial.h" #include "../floppy/fdd.h" #include "../floppy/fdc.h" #include "machine.h" diff --git a/src/machine/m_at_sis_85c471.c b/src/machine/m_at_sis_85c471.c index d421664..9953878 100644 --- a/src/machine/m_at_sis_85c471.c +++ b/src/machine/m_at_sis_85c471.c @@ -12,7 +12,7 @@ * * Used by DTK PKM-0038S E-2 * - * Version: @(#)m_at_sis85c471.c 1.0.7 2018/04/19 + * Version: @(#)m_at_sis85c471.c 1.0.8 2018/04/26 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -46,12 +46,12 @@ #include "../io.h" #include "../memregs.h" #include "../device.h" -#include "../serial.h" -#include "../parallel.h" -#include "../disk/hdc.h" -#include "../disk/hdc_ide.h" +#include "../ports/serial.h" +#include "../ports/parallel.h" #include "../floppy/fdd.h" #include "../floppy/fdc.h" +#include "../disk/hdc.h" +#include "../disk/hdc_ide.h" #include "machine.h" diff --git a/src/machine/m_at_wd76c10.c b/src/machine/m_at_wd76c10.c index 1bdf60d..57b602a 100644 --- a/src/machine/m_at_wd76c10.c +++ b/src/machine/m_at_wd76c10.c @@ -8,7 +8,7 @@ * * Implementation of the WD76C10 system controller. * - * Version: @(#)m_at_wd76c10.c 1.0.5 2018/04/19 + * Version: @(#)m_at_wd76c10.c 1.0.6 2018/04/26 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -41,11 +41,11 @@ #include #include #include "../emu.h" -#include "../device.h" #include "../io.h" -#include "../keyboard.h" #include "../mem.h" -#include "../serial.h" +#include "../device.h" +#include "../keyboard.h" +#include "../ports/serial.h" #include "../floppy/fdd.h" #include "../floppy/fdc.h" #include "machine.h" diff --git a/src/machine/m_europc.c b/src/machine/m_europc.c index daa56fb..9c7c04c 100644 --- a/src/machine/m_europc.c +++ b/src/machine/m_europc.c @@ -66,7 +66,7 @@ * bit 1: b8000 memory available * 0000:046a: 00 jim 250 01 jim 350 * - * Version: @(#)m_europc.c 1.0.8 2018/04/24 + * Version: @(#)m_europc.c 1.0.10 2018/04/26 * * Author: Fred N. van Kempen, * @@ -120,10 +120,9 @@ #include "../rom.h" #include "../nvr.h" #include "../device.h" -#include "../parallel.h" #include "../keyboard.h" #include "../mouse.h" -#include "../game/gameport.h" +#include "../ports/parallel.h" #include "../floppy/fdd.h" #include "../floppy/fdc.h" #include "../disk/hdc.h" @@ -622,9 +621,8 @@ europc_boot(const device_t *info) b = (sys->nvr.regs[MRTC_CONF_C] & 0xfc); if (mouse_type == MOUSE_INTERNAL) { b |= 0x01; /* enable port as MOUSE */ - } else if (joystick_type != JOYSTICK_TYPE_NONE) { + } else if (game_enabled) { b |= 0x02; /* enable port as joysticks */ - device_add(&gameport_device); } sys->nvr.regs[MRTC_CONF_C] = b; @@ -718,6 +716,7 @@ void machine_europc_init(const machine_t *model, void *arg) { machine_common_init(model, arg); + nmi_init(); /* Clear the machine state. */ diff --git a/src/machine/m_olivetti_m24.c b/src/machine/m_olivetti_m24.c index aa831f8..91ae9bd 100644 --- a/src/machine/m_olivetti_m24.c +++ b/src/machine/m_olivetti_m24.c @@ -8,7 +8,7 @@ * * Emulation of the Olivetti M24. * - * Version: @(#)m_olivetti_m24.c 1.0.7 2018/04/02 + * Version: @(#)m_olivetti_m24.c 1.0.9 2018/04/26 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -56,7 +56,6 @@ #include "../mouse.h" #include "../floppy/fdd.h" #include "../floppy/fdc.h" -#include "../game/gameport.h" #include "../sound/sound.h" #include "../sound/snd_speaker.h" #include "../video/video.h" @@ -853,9 +852,6 @@ machine_olim24_init(const machine_t *model, void *arg) mouse_reset(); mouse_set_poll(ms_poll, m24); - if (joystick_type != JOYSTICK_TYPE_NONE) - device_add(&gameport_device); - /* FIXME: make sure this is correct?? */ device_add(&at_nvr_device); diff --git a/src/machine/m_pcjr.c b/src/machine/m_pcjr.c index 7d13605..8cb076d 100644 --- a/src/machine/m_pcjr.c +++ b/src/machine/m_pcjr.c @@ -8,7 +8,7 @@ * * Emulation of the IBM PCjr. * - * Version: @(#)m_pcjr.c 1.0.5 2018/04/03 + * Version: @(#)m_pcjr.c 1.0.6 2018/04/26 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -50,7 +50,7 @@ #include "../mem.h" #include "../timer.h" #include "../device.h" -#include "../serial.h" +#include "../ports/serial.h" #include "../keyboard.h" #include "../floppy/fdd.h" #include "../floppy/fdc.h" diff --git a/src/machine/m_ps1.c b/src/machine/m_ps1.c index 43b8972..f24cfe9 100644 --- a/src/machine/m_ps1.c +++ b/src/machine/m_ps1.c @@ -22,7 +22,7 @@ * The reserved 384K is remapped to the top of extended memory. * If this is not done then you get an error on startup. * - * Version: @(#)m_ps1.c 1.0.14 2018/04/20 + * Version: @(#)m_ps1.c 1.0.16 2018/04/26 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -68,10 +68,10 @@ #include "../device.h" #include "../nvr.h" #include "../keyboard.h" -#include "../parallel.h" -#include "../serial.h" -#include "../game/gameport.h" #include "../mouse.h" +#include "../ports/game.h" +#include "../ports/parallel.h" +#include "../ports/serial.h" #include "../floppy/fdd.h" #include "../floppy/fdc.h" #include "../disk/hdc.h" @@ -548,7 +548,13 @@ ps1_setup(int model, romdef_t *bios) static void ps1_common_init(const machine_t *model, void *arg) { + int i; + + /* Hack to prevent Game from being initialized there. */ + i = game_enabled; + game_enabled = 0; machine_common_init(model, arg); + game_enabled = i; mem_remap_top_384k(); @@ -564,8 +570,8 @@ ps1_common_init(const machine_t *model, void *arg) device_add(&mouse_ps2_device); /* Audio uses ports 200h,202-207h, so only initialize gameport on 201h. */ - if (joystick_type != JOYSTICK_TYPE_NONE) - device_add(&gameport_201_device); + if (game_enabled) + device_add(&game_201_device); } diff --git a/src/machine/m_ps1_hdc.c b/src/machine/m_ps1_hdc.c index ba7722c..89bb26c 100644 --- a/src/machine/m_ps1_hdc.c +++ b/src/machine/m_ps1_hdc.c @@ -103,7 +103,7 @@ #include "machine.h" -#define HDC_TIME (200*TIMER_USEC) +#define HDC_TIME (50*TIMER_USEC) #define HDC_TYPE_USER 47 /* user drive type */ #define PS1_HDD_NUM 1 /* we support 1 drive */ diff --git a/src/machine/m_ps2_isa.c b/src/machine/m_ps2_isa.c index 2830b41..58a09f4 100644 --- a/src/machine/m_ps2_isa.c +++ b/src/machine/m_ps2_isa.c @@ -8,7 +8,7 @@ * * Implementation of ISA-based PS/2 machines. * - * Version: @(#)m_ps2_isa.c 1.0.9 2018/04/19 + * Version: @(#)m_ps2_isa.c 1.0.10 2018/04/26 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -51,8 +51,8 @@ #include "../device.h" #include "../nvr.h" #include "../keyboard.h" -#include "../parallel.h" -#include "../serial.h" +#include "../ports/parallel.h" +#include "../ports/serial.h" #include "../floppy/fdd.h" #include "../floppy/fdc.h" #include "machine.h" diff --git a/src/machine/m_ps2_mca.c b/src/machine/m_ps2_mca.c index 91b535a..09207e4 100644 --- a/src/machine/m_ps2_mca.c +++ b/src/machine/m_ps2_mca.c @@ -8,7 +8,7 @@ * * Implementation of MCA-based PS/2 machines. * - * Version: @(#)m_ps2_mca.c 1.0.11 2018/04/19 + * Version: @(#)m_ps2_mca.c 1.0.12 2018/04/26 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -52,14 +52,14 @@ #include "../nmi.h" #include "../rom.h" #include "../device.h" -#include "../floppy/fdd.h" -#include "../floppy/fdc.h" #include "../nvr.h" #include "../nvr_ps2.h" #include "../keyboard.h" -#include "../parallel.h" #include "../mouse.h" -#include "../serial.h" +#include "../ports/parallel.h" +#include "../ports/serial.h" +#include "../floppy/fdd.h" +#include "../floppy/fdc.h" #include "machine.h" diff --git a/src/machine/m_tandy.c b/src/machine/m_tandy.c index 616660f..b83c36e 100644 --- a/src/machine/m_tandy.c +++ b/src/machine/m_tandy.c @@ -8,7 +8,7 @@ * * Emulation of Tandy models 1000, 1000HX and 1000SL2. * - * Version: @(#)m_tandy.c 1.0.7 2018/04/09 + * Version: @(#)m_tandy.c 1.0.9 2018/04/26 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -53,10 +53,9 @@ #include "../timer.h" #include "../device.h" #include "../nvr.h" +#include "../keyboard.h" #include "../floppy/fdd.h" #include "../floppy/fdc.h" -#include "../game/gameport.h" -#include "../keyboard.h" #include "../sound/sound.h" #include "../sound/snd_sn76489.h" #include "../video/video.h" @@ -1977,9 +1976,6 @@ machine_tandy1k_init(const machine_t *model, void *arg) device_add(&eep_device); } - if (joystick_type != JOYSTICK_TYPE_NONE) - device_add(&gameport_device); - eep_data_out = 0x0000; } diff --git a/src/machine/m_xt.c b/src/machine/m_xt.c index d6ce5a3..dcae598 100644 --- a/src/machine/m_xt.c +++ b/src/machine/m_xt.c @@ -8,7 +8,7 @@ * * Implementation of standard IBM PC/XT class machine. * - * Version: @(#)m_xt.c 1.0.6 2018/04/03 + * Version: @(#)m_xt.c 1.0.8 2018/04/26 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -45,10 +45,9 @@ #include "../pit.h" #include "../mem.h" #include "../device.h" +#include "../keyboard.h" #include "../floppy/fdd.h" #include "../floppy/fdc.h" -#include "../game/gameport.h" -#include "../keyboard.h" #include "machine.h" @@ -96,9 +95,6 @@ machine_xt_init(const machine_t *model, void *arg) device_add(&fdc_xt_device); nmi_init(); - - if (joystick_type != JOYSTICK_TYPE_NONE) - device_add(&gameport_device); } diff --git a/src/machine/m_xt_compaq.c b/src/machine/m_xt_compaq.c index 6d96e2b..2e492f1 100644 --- a/src/machine/m_xt_compaq.c +++ b/src/machine/m_xt_compaq.c @@ -8,7 +8,7 @@ * * Emulation of various Compaq XT-class PC's. * - * Version: @(#)m_xt_compaq.c 1.0.7 2018/04/07 + * Version: @(#)m_xt_compaq.c 1.0.9 2018/04/26 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -48,11 +48,10 @@ #include "../mem.h" #include "../rom.h" #include "../device.h" +#include "../ports/parallel.h" +#include "../keyboard.h" #include "../floppy/fdd.h" #include "../floppy/fdc.h" -#include "../game/gameport.h" -#include "../keyboard.h" -#include "../parallel.h" #include "machine.h" @@ -69,12 +68,8 @@ machine_xt_compaq_init(const machine_t *model, void *arg) nmi_init(); - if (joystick_type != JOYSTICK_TYPE_NONE) - device_add(&gameport_device); - switch(model->id) { case ROM_PORTABLE: -//FIXME: parallel_remove(1); parallel_setup(1, 0x03bc); break; } diff --git a/src/machine/m_xt_t1000.c b/src/machine/m_xt_t1000.c index 50b8feb..811bc9d 100644 --- a/src/machine/m_xt_t1000.c +++ b/src/machine/m_xt_t1000.c @@ -50,7 +50,7 @@ * * FIXME: The ROM drive should be re-done using the "option file". * - * Version: @(#)m_xt_t1000.c 1.0.9 2018/04/05 + * Version: @(#)m_xt_t1000.c 1.0.10 2018/04/26 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -93,11 +93,10 @@ #include "../rom.h" #include "../nvr.h" #include "../device.h" +#include "../ports/parallel.h" #include "../keyboard.h" -#include "../parallel.h" #include "../floppy/fdd.h" #include "../floppy/fdc.h" -#include "../game/gameport.h" #include "../video/video.h" #include "../plat.h" #include "machine.h" diff --git a/src/machine/m_xt_xi8088.c b/src/machine/m_xt_xi8088.c index f11f0d5..bb2202d 100644 --- a/src/machine/m_xt_xi8088.c +++ b/src/machine/m_xt_xi8088.c @@ -8,7 +8,7 @@ * * Implementation of the Xi8088 open-source machine. * - * Version: @(#)m_xt_xi8088.c 1.0.6 2018/04/05 + * Version: @(#)m_xt_xi8088.c 1.0.8 2018/04/26 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -50,8 +50,7 @@ #include "../device.h" #include "../nvr.h" #include "../keyboard.h" -#include "../parallel.h" -#include "../game/gameport.h" +#include "../ports/parallel.h" #include "../floppy/fdd.h" #include "../floppy/fdc.h" #include "../disk/hdc.h" @@ -180,8 +179,5 @@ machine_xt_xi8088_init(const machine_t *model, void *arg) device_add(&keyboard_ps2_device); - if (joystick_type != JOYSTICK_TYPE_NONE) - device_add(&gameport_device); - device_add(&fdc_xt_device); } diff --git a/src/machine/machine.c b/src/machine/machine.c index 9c21a0a..ce61040 100644 --- a/src/machine/machine.c +++ b/src/machine/machine.c @@ -8,7 +8,7 @@ * * Handling of the emulated machines. * - * Version: @(#)machine.c 1.0.13 2018/04/21 + * Version: @(#)machine.c 1.0.14 2018/04/26 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -47,8 +47,9 @@ #include "../pit.h" #include "../mem.h" #include "../rom.h" -#include "../serial.h" -#include "../parallel.h" +#include "../ports/game.h" +#include "../ports/serial.h" +#include "../ports/parallel.h" #include "../disk/hdc.h" #include "../disk/hdc_ide.h" #include "../plat.h" @@ -153,6 +154,9 @@ machine_common_init(const machine_t *model, UNUSED(void *arg)) dma_init(); pit_init(); + if (game_enabled) + device_add(&game_device); + if (parallel_enabled[0]) device_add(¶llel_1_device); if (parallel_enabled[1]) diff --git a/src/mouse_serial.c b/src/mouse_serial.c index 8fbabba..9e8b403 100644 --- a/src/mouse_serial.c +++ b/src/mouse_serial.c @@ -10,7 +10,7 @@ * * TODO: Add the Genius Serial Mouse. * - * Version: @(#)mouse_serial.c 1.0.6 2018/04/20 + * Version: @(#)mouse_serial.c 1.0.7 2018/04/26 * * Author: Fred N. van Kempen, * @@ -55,7 +55,7 @@ #include "config.h" #include "device.h" #include "timer.h" -#include "serial.h" +#include "ports/serial.h" #include "mouse.h" diff --git a/src/pc.c b/src/pc.c index 1b3c98a..01f45b5 100644 --- a/src/pc.c +++ b/src/pc.c @@ -8,7 +8,7 @@ * * Main emulator module where most things are controlled. * - * Version: @(#)pc.c 1.0.26 2018/04/19 + * Version: @(#)pc.c 1.0.28 2018/04/26 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -65,11 +65,12 @@ #include "device.h" #include "nvr.h" #include "bugger.h" -#include "serial.h" -#include "parallel.h" +#include "ports/game.h" +#include "ports/serial.h" +#include "ports/parallel.h" #include "keyboard.h" #include "mouse.h" -#include "game/gameport.h" +#include "game/joystick.h" #include "floppy/fdd.h" #include "floppy/fdd_common.h" #include "disk/hdd.h" @@ -124,7 +125,8 @@ int vid_api = 0, /* (C) video renderer */ voodoo_enabled = 0; /* (C) video option */ int mouse_type = 0; /* (C) selected mouse type */ int enable_sync = 0; /* (C) enable time sync */ -int serial_enabled[] = {0,0}, /* (C) enable serial ports */ +int game_enabled = 0, /* (C) enable game port */ + serial_enabled[] = {0,0}, /* (C) enable serial ports */ parallel_enabled[] = {0,0,0}, /* (C) enable LPT ports */ parallel_device[] = {0,0,0}, /* (C) set up LPT devices */ bugger_enabled = 0; /* (C) enable ISAbugger */ @@ -851,8 +853,9 @@ pc_reset_hard_init(void) /* Reset and reconfigure the Network Card layer. */ network_reset(); - if (joystick_type != JOYSTICK_TYPE_NONE) - gameport_update_joystick_type(); + //FIXME: this needs to be re-done. */ + if (joystick_type != JOYSTICK_NONE) + game_update_joystick_type(); if (config_changed) { ui_sb_update_panes(); diff --git a/src/ports/game.c b/src/ports/game.c new file mode 100644 index 0000000..06c0e0e --- /dev/null +++ b/src/ports/game.c @@ -0,0 +1,229 @@ +/* + * VARCem Virtual ARchaeological Computer EMulator. + * An emulator of (mostly) x86-based PC systems and devices, + * using the ISA,EISA,VLB,MCA and PCI system buses, roughly + * spanning the era between 1981 and 1995. + * + * This file is part of the VARCem Project. + * + * Implementation of a generic Game Port. + * + * Version: @(#)game.c 1.0.8 2018/04/26 + * + * Authors: Fred N. van Kempen, + * Sarah Walker, + * + * Copyright 2018 Fred N. van Kempen. + * Copyright 2008-2018 Sarah Walker. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the: + * + * Free Software Foundation, Inc. + * 59 Temple Place - Suite 330 + * Boston, MA 02111-1307 + * USA. + */ +#include +#include +#include +#include +#include +#include "../emu.h" +#include "../machine/machine.h" +#include "../cpu/cpu.h" +#include "../device.h" +#include "../io.h" +#include "../timer.h" +#include "game.h" +#include "game_dev.h" +#include "../game/joystick.h" + + +typedef struct { + int64_t count; + int axis_nr; + struct _game_ *game; +} g_axis_t; + +typedef struct _game_ { + uint8_t state; + + g_axis_t axis[4]; + + const gamedev_t *joystick; + void *joystick_priv; +} game_t; + + +static game_t *game_global = NULL; + + +static int +game_time(int axis) +{ + if (axis == AXIS_NOT_PRESENT) return(0); + + axis += 32768; + axis = (axis * 100) / 65; /*Axis now in ohms*/ + axis = (axis * 11) / 1000; + + return((int)(TIMER_USEC * (axis + 24))); /*max = 11.115 ms*/ +} + + +static void +game_write(uint16_t addr, uint8_t val, void *priv) +{ + game_t *dev = (game_t *)priv; + int i; + + timer_clock(); + + dev->state |= 0x0f; + + for (i = 0; i < 4; i++) { + dev->axis[i].count = + game_time(dev->joystick->read_axis(dev->joystick_priv, i)); + } +//FIXME: removed too much stuff here! --FvK + dev->joystick->write(dev->joystick_priv); + + cycles -= ISA_CYCLES(8); +} + + +static uint8_t +game_read(uint16_t addr, void *priv) +{ + game_t *dev = (game_t *)priv; + uint8_t ret; + + timer_clock(); + + ret = dev->state | dev->joystick->read(dev->joystick_priv); + + cycles -= ISA_CYCLES(8); + + return(ret); +} + + +/* Timer expired... game over. Just couldn't resist... --FvK */ +static void +game_over(void *priv) +{ + g_axis_t *axis = (g_axis_t *)priv; + game_t *dev = axis->game; + + dev->state &= ~(1 << axis->axis_nr); + axis->count = 0; + + if (axis == &dev->axis[0]) + dev->joystick->a0_over(dev->joystick_priv); +} + + +static void * +game_init(const device_t *info) +{ + game_t *dev; + int i; + + pclog("GAME: initializing, type=%d\n", joystick_type); + + if (joystick_type == JOYSTICK_NONE) return(NULL); + + dev = (game_t *)malloc(sizeof(game_t)); + memset(dev, 0x00, sizeof(game_t)); + game_global = dev; + + for (i = 0; i < 4; i++) { + dev->axis[i].game = dev; + dev->axis[i].axis_nr = i; + } + + dev->joystick = gamedev_get_device(joystick_type); + dev->joystick_priv = dev->joystick->init(); + + switch(info->local) { + case 0: /* regular game port */ + io_sethandler(0x0200, 8, + game_read,NULL,NULL, game_write,NULL,NULL, dev); + break; + + case 1: /* special case, 1 I/O port only */ + io_sethandler(0x0201, 1, + game_read,NULL,NULL, game_write,NULL,NULL, dev); + break; + + } + + timer_add(game_over, + &dev->axis[0].count, &dev->axis[0].count, &dev->axis[0]); + timer_add(game_over, + &dev->axis[1].count, &dev->axis[1].count, &dev->axis[1]); + timer_add(game_over, + &dev->axis[2].count, &dev->axis[2].count, &dev->axis[2]); + timer_add(game_over, + &dev->axis[3].count, &dev->axis[3].count, &dev->axis[3]); + + return(dev); +} + + +static void +game_close(void *priv) +{ + game_t *dev = (game_t *)priv; + + if (dev == NULL) return; + + dev->joystick->close(dev->joystick_priv); + + game_global = NULL; + + free(dev); +} + + +const device_t game_device = { + "Standard Game Port", + 0, + 0, + game_init, game_close, NULL, + NULL, NULL, NULL, NULL, + NULL +}; + +const device_t game_201_device = { + "Custom Game Port (201H)", + 0, + 1, + game_init, game_close, NULL, + NULL, NULL, NULL, NULL, + NULL +}; + + +void +game_update_joystick_type(void) +{ + game_t *dev = game_global; + + if (dev != NULL) { + dev->joystick->close(dev->joystick_priv); + dev->joystick = gamedev_get_device(joystick_type); + dev->joystick_priv = dev->joystick->init(); + } +} diff --git a/src/game/joystick_sw_pad.h b/src/ports/game.h similarity index 68% rename from src/game/joystick_sw_pad.h rename to src/ports/game.h index 0cd4132..ec11748 100644 --- a/src/game/joystick_sw_pad.h +++ b/src/ports/game.h @@ -6,15 +6,15 @@ * * This file is part of the VARCem Project. * - * Definitions for the Sidewinder Pro driver. + * Definitions for the generic game port handlers. * - * Version: @(#)joystick_sw_pad.h 1.0.2 2018/03/15 + * Version: @(#)game.h 1.0.6 2018/04/26 * - * Authors: Miran Grca, + * Authors: Fred N. van Kempen, * Sarah Walker, * - * Copyright 2016-2018 Miran Grca. - * Copyright 2008-2018 Sarah Walker. + * Copyright 2018 Fred N. van Kempen. + * Copyright 2008-2017 Sarah Walker. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -34,5 +34,24 @@ * Boston, MA 02111-1307 * USA. */ +#ifndef EMU_GAME_H +# define EMU_GAME_H -extern const joystick_if_t joystick_sw_pad; + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef EMU_DEVICE_H +extern const device_t game_device; +extern const device_t game_201_device; +#endif + +extern void game_update_joystick_type(void); + +#ifdef __cplusplus +} +#endif + + +#endif /*EMU_GAME_H*/ diff --git a/src/ports/game_dev.c b/src/ports/game_dev.c new file mode 100644 index 0000000..5ee1bc6 --- /dev/null +++ b/src/ports/game_dev.c @@ -0,0 +1,146 @@ +/* + * VARCem Virtual ARchaeological Computer EMulator. + * An emulator of (mostly) x86-based PC systems and devices, + * using the ISA,EISA,VLB,MCA and PCI system buses, roughly + * spanning the era between 1981 and 1995. + * + * This file is part of the VARCem Project. + * + * Handle all the various gameport devices. + * + * Version: @(#)game_dev.c 1.0.1 2018/04/26 + * + * Authors: Fred N. van Kempen, + * Sarah Walker, + * + * Copyright 2018 Fred N. van Kempen. + * Copyright 2008-2018 Sarah Walker. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the: + * + * Free Software Foundation, Inc. + * 59 Temple Place - Suite 330 + * Boston, MA 02111-1307 + * USA. + */ +#include +#include +#include +#include +#include +#include "../emu.h" +#include "game.h" +#include "game_dev.h" + + +extern const gamedev_t js_standard; +extern const gamedev_t js_standard_4btn; +extern const gamedev_t js_standard_6btn; +extern const gamedev_t js_standard_8btn; + +extern const gamedev_t js_ch_fs_pro; + +extern const gamedev_t js_sw_pad; + +extern const gamedev_t js_tm_fcs; + + +static const gamedev_t gamedev_none = { + "Disabled", + NULL, NULL, + NULL, NULL, + NULL, NULL, + 0, 0, 0 +}; + + +static const gamedev_t *devices[] = { + &gamedev_none, + + &js_standard, + &js_standard_4btn, + &js_standard_6btn, + &js_standard_8btn, + &js_ch_fs_pro, + &js_sw_pad, + &js_tm_fcs, + + NULL +}; + + +const gamedev_t * +gamedev_get_device(int js) +{ + return(devices[js]); +} + + +const char * +gamedev_get_name(int js) +{ + if (devices[js] == NULL) + return(NULL); + + return(devices[js]->name); +} + + +int +gamedev_get_max_joysticks(int js) +{ + return(devices[js]->max_joysticks); +} + + +int +gamedev_get_axis_count(int js) +{ + return(devices[js]->axis_count); +} + + +int +gamedev_get_button_count(int js) +{ + return(devices[js]->button_count); +} + + +int +gamedev_get_pov_count(int js) +{ + return(devices[js]->pov_count); +} + + +const char * +gamedev_get_axis_name(int js, int id) +{ + return(devices[js]->axis_names[id]); +} + + +const char * +gamedev_get_button_name(int js, int id) +{ + return(devices[js]->button_names[id]); +} + + +const char * +gamedev_get_pov_name(int js, int id) +{ + return(devices[js]->pov_names[id]); +} diff --git a/src/ports/game_dev.h b/src/ports/game_dev.h new file mode 100644 index 0000000..296851c --- /dev/null +++ b/src/ports/game_dev.h @@ -0,0 +1,84 @@ +/* + * VARCem Virtual ARchaeological Computer EMulator. + * An emulator of (mostly) x86-based PC systems and devices, + * using the ISA,EISA,VLB,MCA and PCI system buses, roughly + * spanning the era between 1981 and 1995. + * + * This file is part of the VARCem Project. + * + * Definitions for the devices that attach to the Game Port. + * + * Version: @(#)game_dev.h 1.0.1 2018/04/26 + * + * Authors: Fred N. van Kempen, + * Sarah Walker, + * + * Copyright 2018 Fred N. van Kempen. + * Copyright 2008-2017 Sarah Walker. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the: + * + * Free Software Foundation, Inc. + * 59 Temple Place - Suite 330 + * Boston, MA 02111-1307 + * USA. + */ +#ifndef EMU_GAME_DEV_H +# define EMU_GAME_DEV_H + + +#define AXIS_NOT_PRESENT -99999 + + +typedef struct { + const char *name; + + void *(*init)(void); + void (*close)(void *priv); + uint8_t (*read)(void *priv); + void (*write)(void *priv); + int (*read_axis)(void *priv, int axis); + void (*a0_over)(void *priv); + + int axis_count, + button_count, + pov_count; + int max_joysticks; + + const char *axis_names[8]; + const char *button_names[32]; + const char *pov_names[4]; +} gamedev_t; + + +#ifdef __cplusplus +extern "C" { +#endif + +extern const gamedev_t *gamedev_get_device(int js); +extern const char *gamedev_get_name(int js); +extern int gamedev_get_max_joysticks(int js); +extern int gamedev_get_axis_count(int js); +extern int gamedev_get_button_count(int js); +extern int gamedev_get_pov_count(int js); +extern const char *gamedev_get_axis_name(int js, int id); +extern const char *gamedev_get_button_name(int js, int id); +extern const char *gamedev_get_pov_name(int js, int id); + +#ifdef __cplusplus +} +#endif + + +#endif /*EMU_GAME_DEV_H*/ diff --git a/src/parallel.c b/src/ports/parallel.c similarity index 98% rename from src/parallel.c rename to src/ports/parallel.c index e0122a1..963a43d 100644 --- a/src/parallel.c +++ b/src/ports/parallel.c @@ -8,7 +8,7 @@ * * Implementation of the "LPT" style parallel ports. * - * Version: @(#)parallel.c 1.0.7 2018/04/21 + * Version: @(#)parallel.c 1.0.8 2018/04/26 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -40,9 +40,9 @@ #include #include #include -#include "emu.h" -#include "io.h" -#include "device.h" +#include "../emu.h" +#include "../io.h" +#include "../device.h" #include "parallel.h" #include "parallel_dev.h" diff --git a/src/parallel.h b/src/ports/parallel.h similarity index 100% rename from src/parallel.h rename to src/ports/parallel.h diff --git a/src/parallel_dev.c b/src/ports/parallel_dev.c similarity index 93% rename from src/parallel_dev.c rename to src/ports/parallel_dev.c index ed42d68..0c608a4 100644 --- a/src/parallel_dev.c +++ b/src/ports/parallel_dev.c @@ -8,7 +8,7 @@ * * Implementation of the parallel-port-attached devices. * - * Version: @(#)parallel_dev.c 1.0.2 2018/04/10 + * Version: @(#)parallel_dev.c 1.0.3 2018/04/28 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -40,13 +40,13 @@ #include #include #include -#include "emu.h" -#include "io.h" +#include "../emu.h" +#include "../io.h" #include "parallel.h" #include "parallel_dev.h" -#include "sound/snd_lpt_dac.h" -#include "sound/snd_lpt_dss.h" +#include "../sound/snd_lpt_dac.h" +#include "../sound/snd_lpt_dss.h" static const struct { diff --git a/src/parallel_dev.h b/src/ports/parallel_dev.h similarity index 100% rename from src/parallel_dev.h rename to src/ports/parallel_dev.h diff --git a/src/serial.c b/src/ports/serial.c similarity index 97% rename from src/serial.c rename to src/ports/serial.c index 272cd77..15ba26c 100644 --- a/src/serial.c +++ b/src/ports/serial.c @@ -8,7 +8,7 @@ * * Implementation of 8250-style serial port. * - * Version: @(#)serial.c 1.0.4 2018/04/21 + * Version: @(#)serial.c 1.0.5 2018/04/26 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -41,14 +41,14 @@ #include #include #include -#include "emu.h" -#include "machine/machine.h" -#include "io.h" -#include "pic.h" -#include "mem.h" -#include "rom.h" -#include "timer.h" -#include "device.h" +#include "../emu.h" +#include "../machine/machine.h" +#include "../io.h" +#include "../pic.h" +#include "../mem.h" +#include "../rom.h" +#include "../timer.h" +#include "../device.h" #include "serial.h" diff --git a/src/serial.h b/src/ports/serial.h similarity index 100% rename from src/serial.h rename to src/ports/serial.h diff --git a/src/sio/sio_fdc37c669.c b/src/sio/sio_fdc37c669.c index 4ca51f7..4e002e3 100644 --- a/src/sio/sio_fdc37c669.c +++ b/src/sio/sio_fdc37c669.c @@ -8,7 +8,7 @@ * * Implementation of the SMC FDC37C669 Super I/O Chip. * - * Version: @(#)sio_fdc37c669.c 1.0.5 2018/04/19 + * Version: @(#)sio_fdc37c669.c 1.0.6 2018/04/26 * * Author: Miran Grca, * @@ -38,10 +38,10 @@ #include #include "../emu.h" #include "../io.h" -#include "../device.h" #include "../pci.h" -#include "../parallel.h" -#include "../serial.h" +#include "../device.h" +#include "../ports/parallel.h" +#include "../ports/serial.h" #include "../floppy/fdd.h" #include "../floppy/fdc.h" #include "../disk/hdc.h" diff --git a/src/sio/sio_fdc37c66x.c b/src/sio/sio_fdc37c66x.c index e90f82c..dd73911 100644 --- a/src/sio/sio_fdc37c66x.c +++ b/src/sio/sio_fdc37c66x.c @@ -9,7 +9,7 @@ * Implementation of the SMC FDC37C663 and FDC37C665 Super * I/O Chips. * - * Version: @(#)sio_fdc37c66x.c 1.0.5 2018/04/19 + * Version: @(#)sio_fdc37c66x.c 1.0.6 2018/04/26 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -43,10 +43,10 @@ #include #include "../emu.h" #include "../io.h" -#include "../device.h" #include "../pci.h" -#include "../parallel.h" -#include "../serial.h" +#include "../device.h" +#include "../ports/parallel.h" +#include "../ports/serial.h" #include "../floppy/fdd.h" #include "../floppy/fdc.h" #include "../disk/hdc.h" diff --git a/src/sio/sio_fdc37c93x.c b/src/sio/sio_fdc37c93x.c index 7457b6f..712eddd 100644 --- a/src/sio/sio_fdc37c93x.c +++ b/src/sio/sio_fdc37c93x.c @@ -9,7 +9,7 @@ * Implementation of the SMC FDC37C932FR and FDC37C935 Super * I/O Chips. * - * Version: @(#)sio_fdc37c93x.c 1.0.7 2018/04/19 + * Version: @(#)sio_fdc37c93x.c 1.0.8 2018/04/26 * * Author: Miran Grca, * @@ -39,10 +39,10 @@ #include #include "../emu.h" #include "../io.h" -#include "../device.h" #include "../pci.h" -#include "../parallel.h" -#include "../serial.h" +#include "../device.h" +#include "../ports/parallel.h" +#include "../ports/serial.h" #include "../floppy/fdd.h" #include "../floppy/fdc.h" #include "../disk/hdc.h" diff --git a/src/sio/sio_pc87306.c b/src/sio/sio_pc87306.c index 4231ceb..d9c76f2 100644 --- a/src/sio/sio_pc87306.c +++ b/src/sio/sio_pc87306.c @@ -8,7 +8,7 @@ * * Emulation of the NatSemi PC87306 Super I/O chip. * - * Version: @(#)sio_pc87306.c 1.0.5 2018/04/19 + * Version: @(#)sio_pc87306.c 1.0.6 2018/04/26 * * Author: Miran Grca, * @@ -38,10 +38,10 @@ #include #include "../emu.h" #include "../io.h" -#include "../device.h" #include "../pci.h" -#include "../parallel.h" -#include "../serial.h" +#include "../device.h" +#include "../ports/parallel.h" +#include "../ports/serial.h" #include "../floppy/fdd.h" #include "../floppy/fdc.h" #include "../disk/hdc.h" diff --git a/src/sio/sio_um8669f.c b/src/sio/sio_um8669f.c index 0f24d1d..bad4b39 100644 --- a/src/sio/sio_um8669f.c +++ b/src/sio/sio_um8669f.c @@ -29,7 +29,7 @@ * 70 - IRQ * 74 - DMA * - * Version: @(#)sio_um8669f.c 1.0.5 2018/04/19 + * Version: @(#)sio_um8669f.c 1.0.6 2018/04/26 * * Author: Miran Grca, * Sarah Walker, @@ -60,11 +60,11 @@ #include #include #include "../emu.h" -#include "../device.h" #include "../io.h" #include "../pci.h" -#include "../parallel.h" -#include "../serial.h" +#include "../device.h" +#include "../ports/parallel.h" +#include "../ports/serial.h" #include "../floppy/fdd.h" #include "../floppy/fdc.h" #include "sio.h" diff --git a/src/sio/sio_w83877f.c b/src/sio/sio_w83877f.c index 2eeba7c..248ab16 100644 --- a/src/sio/sio_w83877f.c +++ b/src/sio/sio_w83877f.c @@ -11,7 +11,7 @@ * Winbond W83877F Super I/O Chip * Used by the Award 430HX * - * Version: @(#)sio_w83877f.c 1.0.5 2018/04/19 + * Version: @(#)sio_w83877f.c 1.0.6 2018/04/26 * * Author: Miran Grca, * @@ -41,13 +41,13 @@ #include #include "../emu.h" #include "../machine/machine.h" -#include "../device.h" #include "../io.h" #include "../pci.h" #include "../mem.h" #include "../rom.h" -#include "../parallel.h" -#include "../serial.h" +#include "../device.h" +#include "../ports/parallel.h" +#include "../ports/serial.h" #include "../floppy/fdd.h" #include "../floppy/fdc.h" #include "sio.h" diff --git a/src/sound/snd_lpt_dac.c b/src/sound/snd_lpt_dac.c index 3eb0f8f..821cb79 100644 --- a/src/sound/snd_lpt_dac.c +++ b/src/sound/snd_lpt_dac.c @@ -8,7 +8,7 @@ * * Implemantation of LPT-based sound devices. * - * Version: @(#)snd_lpt_dac.c 1.0.5 2018/04/07 + * Version: @(#)snd_lpt_dac.c 1.0.6 2018/04/26 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -44,7 +44,7 @@ #include "../emu.h" #include "../cpu/cpu.h" #include "../machine/machine.h" -#include "../parallel_dev.h" +#include "../ports/parallel_dev.h" #include "../timer.h" #include "sound.h" #include "filters.h" diff --git a/src/sound/snd_lpt_dss.c b/src/sound/snd_lpt_dss.c index 319d91b..57eee54 100644 --- a/src/sound/snd_lpt_dss.c +++ b/src/sound/snd_lpt_dss.c @@ -8,7 +8,7 @@ * * Implementation of the LPT-based DSS sound device. * - * Version: @(#)snd_lpt_dss.c 1.0.5 2018/04/07 + * Version: @(#)snd_lpt_dss.c 1.0.6 2018/04/26 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -45,7 +45,7 @@ #include "../cpu/cpu.h" #include "../machine/machine.h" #include "../timer.h" -#include "../parallel_dev.h" +#include "../ports/parallel_dev.h" #include "sound.h" #include "filters.h" #include "snd_lpt_dss.h" diff --git a/src/video/vid_colorplus.c b/src/video/vid_colorplus.c index 44d4f57..1ae2c59 100644 --- a/src/video/vid_colorplus.c +++ b/src/video/vid_colorplus.c @@ -8,7 +8,7 @@ * * Plantronics ColorPlus emulation. * - * Version: @(#)vid_colorplus.c 1.0.5 2018/04/09 + * Version: @(#)vid_colorplus.c 1.0.6 2018/04/26 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -49,7 +49,7 @@ #include "../mem.h" #include "../timer.h" #include "../device.h" -#include "../parallel.h" +#include "../ports/parallel.h" #include "video.h" #include "vid_cga.h" #include "vid_cga_comp.h" diff --git a/src/video/vid_hercules.c b/src/video/vid_hercules.c index 329bdcd..c2eb6cd 100644 --- a/src/video/vid_hercules.c +++ b/src/video/vid_hercules.c @@ -8,7 +8,7 @@ * * Hercules emulation. * - * Version: @(#)vid_hercules.c 1.0.4 2018/04/09 + * Version: @(#)vid_hercules.c 1.0.5 2018/04/26 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -48,7 +48,7 @@ #include "../rom.h" #include "../timer.h" #include "../device.h" -#include "../parallel.h" +#include "../ports/parallel.h" #include "video.h" diff --git a/src/video/vid_herculesplus.c b/src/video/vid_herculesplus.c index 8e34dd5..49c0f32 100644 --- a/src/video/vid_herculesplus.c +++ b/src/video/vid_herculesplus.c @@ -8,7 +8,7 @@ * * Hercules InColor emulation. * - * Version: @(#)vid_hercules_plus.c 1.0.6 2018/04/09 + * Version: @(#)vid_hercules_plus.c 1.0.7 2018/04/26 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -48,7 +48,7 @@ #include "../rom.h" #include "../timer.h" #include "../device.h" -#include "../parallel.h" +#include "../ports/parallel.h" #include "video.h" diff --git a/src/video/vid_incolor.c b/src/video/vid_incolor.c index 466df57..9005804 100644 --- a/src/video/vid_incolor.c +++ b/src/video/vid_incolor.c @@ -8,7 +8,7 @@ * * Hercules InColor emulation. * - * Version: @(#)vid_incolor.c 1.0.6 2018/04/09 + * Version: @(#)vid_incolor.c 1.0.7 2018/04/26 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -48,7 +48,7 @@ #include "../rom.h" #include "../timer.h" #include "../device.h" -#include "../parallel.h" +#include "../ports/parallel.h" #include "video.h" diff --git a/src/video/vid_mda.c b/src/video/vid_mda.c index 6caf714..b4bf970 100644 --- a/src/video/vid_mda.c +++ b/src/video/vid_mda.c @@ -8,7 +8,7 @@ * * MDA emulation. * - * Version: @(#)vid_mda.c 1.0.5 2018/04/09 + * Version: @(#)vid_mda.c 1.0.6 2018/04/26 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -48,7 +48,7 @@ #include "../rom.h" #include "../timer.h" #include "../device.h" -#include "../parallel.h" +#include "../ports/parallel.h" #include "video.h" diff --git a/src/win/VARCem.rc b/src/win/VARCem.rc index bc3bb04..a5d0ddb 100644 --- a/src/win/VARCem.rc +++ b/src/win/VARCem.rc @@ -8,7 +8,7 @@ * * Application resource script for Windows. * - * Version: @(#)VARCem.rc 1.0.21 2018/04/25 + * Version: @(#)VARCem.rc 1.0.21 2018/04/26 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -510,26 +510,29 @@ DLG_CFG_PORTS DIALOG DISCARDABLE 97, 0, 267, 99 STYLE DS_CONTROL | WS_CHILD FONT 9, "Segoe UI" BEGIN - CONTROL "Parallel port 1",IDC_CHECK_PARALLEL1,"Button", + CONTROL "Game port",IDC_CHECK_GAME,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,7,8,70,10 - COMBOBOX IDC_COMBO_PARALLEL1,80,7,159,120,CBS_DROPDOWNLIST | + + CONTROL "Parallel port 1",IDC_CHECK_PARALLEL1,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,27,70,10 + COMBOBOX IDC_COMBO_PARALLEL1,80,26,159,120,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP CONTROL "Parallel port 2",IDC_CHECK_PARALLEL2,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,27,70,10 - COMBOBOX IDC_COMBO_PARALLEL2,80,26,159,120,CBS_DROPDOWNLIST | + BS_AUTOCHECKBOX | WS_TABSTOP,7,46,70,10 + COMBOBOX IDC_COMBO_PARALLEL2,80,45,159,120,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP CONTROL "Parallel port 3",IDC_CHECK_PARALLEL3,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,46,70,10 - COMBOBOX IDC_COMBO_PARALLEL3,80,45,159,120,CBS_DROPDOWNLIST | + BS_AUTOCHECKBOX | WS_TABSTOP,7,65,70,10 + COMBOBOX IDC_COMBO_PARALLEL3,80,64,159,120,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP CONTROL "Serial port 1",IDC_CHECK_SERIAL1,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,69,94,10 + BS_AUTOCHECKBOX | WS_TABSTOP,7,88,94,10 CONTROL "Serial port 2",IDC_CHECK_SERIAL2,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,7,88,94,10 + BS_AUTOCHECKBOX | WS_TABSTOP,7,107,94,10 END DLG_CFG_PERIPHERALS DIALOG DISCARDABLE 97, 0, 267, 97 diff --git a/src/win/mingw/Makefile.MinGW b/src/win/mingw/Makefile.MinGW index fb146b0..2fdb89d 100644 --- a/src/win/mingw/Makefile.MinGW +++ b/src/win/mingw/Makefile.MinGW @@ -8,7 +8,7 @@ # # Makefile for Windows systems using the MinGW32 environment. # -# Version: @(#)Makefile.mingw 1.0.31 2018/04/25 +# Version: @(#)Makefile.mingw 1.0.33 2018/04/26 # # Author: Fred N. van Kempen, # @@ -202,7 +202,7 @@ endif # Nothing should need changing from here on.. # ######################################################################### VPATH := $(EXPATH) . cpu \ - cdrom disk floppy floppy/lzf game sio machine \ + cdrom disk floppy floppy/lzf ports game sio machine \ sound \ sound/munt sound/munt/c_interface sound/munt/sha1 \ sound/munt/srchelper \ @@ -365,7 +365,7 @@ else win_ddraw.o win_d3d.o \ win_dialog.o win_about.o win_status.o win_stbar.o \ win_settings.o win_devconf.o win_snd_gain.o \ - win_new_floppy.o win_jsconf.o + win_new_floppy.o endif ifeq ($(OPENAL), y) @@ -517,16 +517,19 @@ MCHOBJ := machine.o machine_table.o \ m_at_430lx_nx.o m_at_430fx.o \ m_at_430hx.o m_at_430vx.o -DEVOBJ := bugger.o parallel.o parallel_dev.o $(SERIAL) \ - sio_fdc37c66x.o sio_fdc37c669.o sio_fdc37c93x.o \ - sio_pc87306.o sio_w83877f.o sio_um8669f.o \ +DEVOBJ := bugger.o \ + game.o game_dev.o \ + parallel.o parallel_dev.o \ + $(SERIAL) \ + sio_fdc37c66x.o sio_fdc37c669.o sio_fdc37c93x.o \ + sio_pc87306.o sio_w83877f.o sio_um8669f.o \ keyboard.o \ keyboard_xt.o keyboard_at.o \ - gameport.o \ - joystick_standard.o joystick_ch_flightstick_pro.o \ - joystick_sw_pad.o joystick_tm_fcs.o \ mouse.o \ - mouse_serial.o mouse_ps2.o mouse_bus.o + mouse_serial.o mouse_ps2.o mouse_bus.o \ + joystick.o \ + js_standard.o js_ch_fs_pro.o \ + js_sw_pad.o js_tm_fcs.o \ FDDOBJ := fdc.o \ fdd.o \ diff --git a/src/win/msvc/Makefile.VC b/src/win/msvc/Makefile.VC index c7b7987..39e1b76 100644 --- a/src/win/msvc/Makefile.VC +++ b/src/win/msvc/Makefile.VC @@ -8,7 +8,7 @@ # # Makefile for Windows using Visual Studio 2015. # -# Version: @(#)Makefile.VC 1.0.18 2018/04/25 +# Version: @(#)Makefile.VC 1.0.20 2018/04/26 # # Author: Fred N. van Kempen, # @@ -207,7 +207,7 @@ endif # Nothing should need changing from here on.. # ######################################################################### VPATH := $(EXPATH) . cpu \ - cdrom disk floppy floppy/lzf game sio machine \ + cdrom disk floppy floppy/lzf ports game sio machine \ sound \ sound/munt sound/munt/c_interface sound/munt/sha1 \ sound/munt/srchelper \ @@ -333,7 +333,7 @@ else win_ddraw.obj win_d3d.obj \ win_dialog.obj win_about.obj win_status.obj win_stbar.obj \ win_settings.obj win_devconf.obj win_snd_gain.obj \ - win_new_floppy.obj win_jsconf.obj + win_new_floppy.obj endif ifeq ($(OPENAL), y) @@ -482,16 +482,19 @@ MCHOBJ := machine.obj machine_table.obj \ m_at_430lx_nx.obj m_at_430fx.obj \ m_at_430hx.obj m_at_430vx.obj -DEVOBJ := bugger.obj parallel.obj parallel_dev.obj $(SERIAL) \ - sio_fdc37c66x.obj sio_fdc37c669.obj sio_fdc37c93x.obj \ - sio_pc87306.obj sio_w83877f.obj sio_um8669f.obj \ +DEVOBJ := bugger.obj \ + game.obj game_dev.obj \ + parallel.obj parallel_dev.obj \ + $(SERIAL) \ + sio_fdc37c66x.obj sio_fdc37c669.obj sio_fdc37c93x.obj \ + sio_pc87306.obj sio_w83877f.obj sio_um8669f.obj \ keyboard.obj \ keyboard_xt.obj keyboard_at.obj \ - gameport.obj \ - joystick_standard.obj joystick_ch_flightstick_pro.obj \ - joystick_sw_pad.obj joystick_tm_fcs.obj \ mouse.obj \ mouse_serial.obj mouse_ps2.obj mouse_bus.obj + joystick.obj \ + js_standard.obj js_ch_fs_pro.obj \ + js_sw_pad.obj js_tm_fcs.obj FDDOBJ := fdc.obj \ fdd.obj \ diff --git a/src/win/resource.h b/src/win/resource.h index e4f0e14..e290852 100644 --- a/src/win/resource.h +++ b/src/win/resource.h @@ -8,7 +8,7 @@ * * Windows resource defines. * - * Version: @(#)resource.h 1.0.11 2018/04/25 + * Version: @(#)resource.h 1.0.12 2018/04/26 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -165,14 +165,15 @@ #define IDC_COMBO_PCAP 1091 #define IDC_COMBO_NET 1092 -#define IDC_CHECK_PARALLEL1 1110 /* ports config */ -#define IDC_CHECK_PARALLEL2 1111 -#define IDC_CHECK_PARALLEL3 1112 -#define IDC_COMBO_PARALLEL1 1113 -#define IDC_COMBO_PARALLEL2 1114 -#define IDC_COMBO_PARALLEL3 1115 -#define IDC_CHECK_SERIAL1 1116 -#define IDC_CHECK_SERIAL2 1117 +#define IDC_CHECK_GAME 1110 /* ports config */ +#define IDC_CHECK_PARALLEL1 1111 +#define IDC_CHECK_PARALLEL2 1112 +#define IDC_CHECK_PARALLEL3 1113 +#define IDC_COMBO_PARALLEL1 1114 +#define IDC_COMBO_PARALLEL2 1115 +#define IDC_COMBO_PARALLEL3 1116 +#define IDC_CHECK_SERIAL1 1117 +#define IDC_CHECK_SERIAL2 1118 #define IDC_OTHER_PERIPH 1120 /* other periph config */ #define IDC_COMBO_SCSI 1121 diff --git a/src/win/win_joystick.cpp b/src/win/win_joystick.cpp index b3b67f2..701f609 100644 --- a/src/win/win_joystick.cpp +++ b/src/win/win_joystick.cpp @@ -6,12 +6,14 @@ * * This file is part of the VARCem Project. * - * Joystick interface to host device. + * Joystick interface to host device. Since this is a lot more + * convienient, we also have the Configuration Dialog in this + * file. * * NOTE: Hacks currently needed to compile with MSVC; DX needs to * be updated to 11 or 12 or so. --FvK * - * Version: @(#)win_joystick.cpp 1.0.8 2018/03/28 + * Version: @(#)win_joystick.cpp 1.0.9 2018/04/26 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -50,271 +52,788 @@ #endif #include #include +#include +#include #include +#include #include "../emu.h" +#include "../config.h" #include "../device.h" -#include "../game/gameport.h" +#include "../ports/game_dev.h" +#include "../game/joystick.h" #include "../plat.h" #include "win.h" -plat_joystick_t plat_joystick_state[MAX_PLAT_JOYSTICKS]; -joystick_t joystick_state[MAX_JOYSTICKS]; -int joysticks_present = 0; +#define MAX_PLAT_JOYSTICKS 8 -static LPDIRECTINPUT8 lpdi; +typedef struct { + char name[64]; + + int a[8]; + int b[32]; + int p[4]; + struct { + char name[32]; + int id; + } axis[8]; + struct { + char name[32]; + int id; + } button[32]; + struct { + char name[32]; + int id; + } pov[4]; + int nr_axes; + int nr_buttons; + int nr_povs; +} plat_joystick_t; + + +static plat_joystick_t plat_joystick_state[MAX_PLAT_JOYSTICKS]; static LPDIRECTINPUTDEVICE8 lpdi_joystick[2] = {NULL, NULL}; static GUID joystick_guids[MAX_JOYSTICKS]; +static LPDIRECTINPUT8 lpdi; -static BOOL CALLBACK joystick_enum_callback(LPCDIDEVICEINSTANCE lpddi, UNUSED(LPVOID data)) +/* Callback for DirectInput. */ +static BOOL CALLBACK +enum_callback(LPCDIDEVICEINSTANCE lpddi, UNUSED(LPVOID data)) { - if (joysticks_present >= MAX_JOYSTICKS) - return DIENUM_STOP; - - pclog("joystick_enum_callback : found joystick %i : %s\n", joysticks_present, lpddi->tszProductName); - - joystick_guids[joysticks_present++] = lpddi->guidInstance; + pclog("JOYSTICK: found game device%i: %s\n", + joysticks_present, lpddi->tszProductName); - if (joysticks_present >= MAX_JOYSTICKS) - return DIENUM_STOP; - - return DIENUM_CONTINUE; + /* If we got too many, ignore it. */ + if (joysticks_present >= MAX_JOYSTICKS) return(DIENUM_STOP); + + /* Add to the list of devices found. */ + joystick_guids[joysticks_present++] = lpddi->guidInstance; + + /* Continue scanning. */ + return(DIENUM_CONTINUE); } -BOOL CALLBACK DIEnumDeviceObjectsCallback( - LPCDIDEVICEOBJECTINSTANCE lpddoi, - LPVOID pvRef) + +/* Callback for DirectInput. */ +static BOOL CALLBACK +obj_callback(LPCDIDEVICEOBJECTINSTANCE lpddoi, LPVOID pvRef) { - plat_joystick_t *state = (plat_joystick_t *)pvRef; - - if (lpddoi->guidType == GUID_XAxis || lpddoi->guidType == GUID_YAxis || lpddoi->guidType == GUID_ZAxis || - lpddoi->guidType == GUID_RxAxis || lpddoi->guidType == GUID_RyAxis || lpddoi->guidType == GUID_RzAxis || - lpddoi->guidType == GUID_Slider) - { - strncpy(state->axis[state->nr_axes].name, lpddoi->tszName, sizeof(state->axis[state->nr_axes].name)); - pclog("Axis %i : %s %x %x\n", state->nr_axes, state->axis[state->nr_axes].name, lpddoi->dwOfs, lpddoi->dwType); - if (lpddoi->guidType == GUID_XAxis) - state->axis[state->nr_axes].id = 0; - else if (lpddoi->guidType == GUID_YAxis) - state->axis[state->nr_axes].id = 1; - else if (lpddoi->guidType == GUID_ZAxis) - state->axis[state->nr_axes].id = 2; - else if (lpddoi->guidType == GUID_RxAxis) - state->axis[state->nr_axes].id = 3; - else if (lpddoi->guidType == GUID_RyAxis) - state->axis[state->nr_axes].id = 4; - else if (lpddoi->guidType == GUID_RzAxis) - state->axis[state->nr_axes].id = 5; - state->nr_axes++; - } - else if (lpddoi->guidType == GUID_Button) - { - strncpy(state->button[state->nr_buttons].name, lpddoi->tszName, sizeof(state->button[state->nr_buttons].name)); - pclog("Button %i : %s %x %x\n", state->nr_buttons, state->button[state->nr_buttons].name, lpddoi->dwOfs, lpddoi->dwType); - state->nr_buttons++; - } - else if (lpddoi->guidType == GUID_POV) - { - strncpy(state->pov[state->nr_povs].name, lpddoi->tszName, sizeof(state->pov[state->nr_povs].name)); - pclog("POV %i : %s %x %x\n", state->nr_povs, state->pov[state->nr_povs].name, lpddoi->dwOfs, lpddoi->dwType); - state->nr_povs++; - } - - return DIENUM_CONTINUE; + plat_joystick_t *state = (plat_joystick_t *)pvRef; + + if (lpddoi->guidType == GUID_XAxis || lpddoi->guidType == GUID_YAxis || + lpddoi->guidType == GUID_ZAxis || lpddoi->guidType == GUID_RxAxis || + lpddoi->guidType == GUID_RyAxis || lpddoi->guidType == GUID_RzAxis || + lpddoi->guidType == GUID_Slider) { + strncpy(state->axis[state->nr_axes].name, + lpddoi->tszName, sizeof(state->axis[state->nr_axes].name)); + + pclog("Axis%i: %s %x %x\n", + state->nr_axes, state->axis[state->nr_axes].name, + lpddoi->dwOfs, lpddoi->dwType); + + if (lpddoi->guidType == GUID_XAxis) + state->axis[state->nr_axes].id = 0; + else if (lpddoi->guidType == GUID_YAxis) + state->axis[state->nr_axes].id = 1; + else if (lpddoi->guidType == GUID_ZAxis) + state->axis[state->nr_axes].id = 2; + else if (lpddoi->guidType == GUID_RxAxis) + state->axis[state->nr_axes].id = 3; + else if (lpddoi->guidType == GUID_RyAxis) + state->axis[state->nr_axes].id = 4; + else if (lpddoi->guidType == GUID_RzAxis) + state->axis[state->nr_axes].id = 5; + + state->nr_axes++; + } else if (lpddoi->guidType == GUID_Button) { + strncpy(state->button[state->nr_buttons].name, + lpddoi->tszName, sizeof(state->button[state->nr_buttons].name)); + pclog("Button%i: %s %x %x\n", + state->nr_buttons, state->button[state->nr_buttons].name, + lpddoi->dwOfs, lpddoi->dwType); + + state->nr_buttons++; + } else if (lpddoi->guidType == GUID_POV) { + strncpy(state->pov[state->nr_povs].name, lpddoi->tszName, + sizeof(state->pov[state->nr_povs].name)); + pclog("POV%i: %s %x %x\n", + state->nr_povs, state->pov[state->nr_povs].name, + lpddoi->dwOfs, lpddoi->dwType); + + state->nr_povs++; + } + + return(DIENUM_CONTINUE); } -void joystick_init(void) + +void +joystick_init(void) { - int c; + int c; - if (joystick_type == JOYSTICK_TYPE_NONE) return; + pclog("JOYSTICK: initializing (type=%d)\n", joystick_type); - atexit(joystick_close); - - joysticks_present = 0; - - if (FAILED(DirectInput8Create(hinstance, DIRECTINPUT_VERSION, IID_IDirectInput8A, (void **) &lpdi, NULL))) - fatal("joystick_init : DirectInputCreate failed\n"); + atexit(joystick_close); + + joysticks_present = 0; + + if (FAILED(DirectInput8Create(hinstance, + DIRECTINPUT_VERSION, IID_IDirectInput8A, + (void **) &lpdi, NULL))) + fatal("joystick_init : DirectInputCreate failed\n"); - if (FAILED(lpdi->EnumDevices(DIDEVTYPE_JOYSTICK, joystick_enum_callback, NULL, DIEDFL_ATTACHEDONLY))) - fatal("joystick_init : EnumDevices failed\n"); + if (FAILED(lpdi->EnumDevices(DIDEVTYPE_JOYSTICK, + enum_callback, NULL, DIEDFL_ATTACHEDONLY))) + fatal("joystick_init : EnumDevices failed\n"); - pclog("joystick_init: joysticks_present=%i\n", joysticks_present); - - for (c = 0; c < joysticks_present; c++) - { - LPDIRECTINPUTDEVICE8 lpdi_joystick_temp = NULL; - DIPROPRANGE joy_axis_range; - DIDEVICEINSTANCE device_instance; - DIDEVCAPS devcaps; - - if (FAILED(lpdi->CreateDevice(joystick_guids[c], &lpdi_joystick_temp, NULL))) - fatal("joystick_init : CreateDevice failed\n"); - if (FAILED(lpdi_joystick_temp->QueryInterface(IID_IDirectInputDevice8, (void **)&lpdi_joystick[c]))) - fatal("joystick_init : CreateDevice failed\n"); - lpdi_joystick_temp->Release(); - - memset(&device_instance, 0, sizeof(device_instance)); - device_instance.dwSize = sizeof(device_instance); - if (FAILED(lpdi_joystick[c]->GetDeviceInfo(&device_instance))) - fatal("joystick_init : GetDeviceInfo failed\n"); - pclog("Joystick %i :\n", c); - pclog(" tszInstanceName = %s\n", device_instance.tszInstanceName); - pclog(" tszProductName = %s\n", device_instance.tszProductName); - strncpy(plat_joystick_state[c].name, device_instance.tszInstanceName, 64); + pclog("JOYSTICK: %i game device(s) found.\n", joysticks_present); - memset(&devcaps, 0, sizeof(devcaps)); - devcaps.dwSize = sizeof(devcaps); - if (FAILED(lpdi_joystick[c]->GetCapabilities(&devcaps))) - fatal("joystick_init : GetCapabilities failed\n"); - pclog(" Axes = %i\n", devcaps.dwAxes); - pclog(" Buttons = %i\n", devcaps.dwButtons); - pclog(" POVs = %i\n", devcaps.dwPOVs); + for (c = 0; c < joysticks_present; c++) { + LPDIRECTINPUTDEVICE8 lpdi_joystick_temp = NULL; + DIPROPRANGE joy_axis_range; + DIDEVICEINSTANCE device_instance; + DIDEVCAPS devcaps; - lpdi_joystick[c]->EnumObjects(DIEnumDeviceObjectsCallback, &plat_joystick_state[c], DIDFT_ALL); - - if (FAILED(lpdi_joystick[c]->SetCooperativeLevel(hwndMain, DISCL_BACKGROUND | DISCL_NONEXCLUSIVE))) - fatal("joystick_init : SetCooperativeLevel failed\n"); - if (FAILED(lpdi_joystick[c]->SetDataFormat(&c_dfDIJoystick))) - fatal("joystick_init : SetDataFormat failed\n"); + if (FAILED(lpdi->CreateDevice(joystick_guids[c], + &lpdi_joystick_temp, NULL))) + fatal("joystick_init : CreateDevice failed\n"); + if (FAILED(lpdi_joystick_temp->QueryInterface(IID_IDirectInputDevice8, + (void **)&lpdi_joystick[c]))) + fatal("joystick_init : CreateDevice failed\n"); + lpdi_joystick_temp->Release(); - joy_axis_range.lMin = -32768; - joy_axis_range.lMax = 32767; - joy_axis_range.diph.dwSize = sizeof(DIPROPRANGE); - joy_axis_range.diph.dwHeaderSize = sizeof(DIPROPHEADER); - joy_axis_range.diph.dwHow = DIPH_BYOFFSET; - joy_axis_range.diph.dwObj = DIJOFS_X; - lpdi_joystick[c]->SetProperty(DIPROP_RANGE, &joy_axis_range.diph); - joy_axis_range.diph.dwObj = DIJOFS_Y; - lpdi_joystick[c]->SetProperty(DIPROP_RANGE, &joy_axis_range.diph); - joy_axis_range.diph.dwObj = DIJOFS_Z; - lpdi_joystick[c]->SetProperty(DIPROP_RANGE, &joy_axis_range.diph); - joy_axis_range.diph.dwObj = DIJOFS_RX; - lpdi_joystick[c]->SetProperty(DIPROP_RANGE, &joy_axis_range.diph); - joy_axis_range.diph.dwObj = DIJOFS_RY; - lpdi_joystick[c]->SetProperty(DIPROP_RANGE, &joy_axis_range.diph); - joy_axis_range.diph.dwObj = DIJOFS_RZ; - lpdi_joystick[c]->SetProperty(DIPROP_RANGE, &joy_axis_range.diph); + memset(&device_instance, 0, sizeof(device_instance)); + device_instance.dwSize = sizeof(device_instance); + if (FAILED(lpdi_joystick[c]->GetDeviceInfo(&device_instance))) + fatal("joystick_init : GetDeviceInfo failed\n"); - if (FAILED(lpdi_joystick[c]->Acquire())) - fatal("joystick_init : Acquire failed\n"); - } + pclog("Joystick%i:\n", c); + pclog(" Name = %s\n", device_instance.tszInstanceName); + pclog(" ProductName = %s\n", device_instance.tszProductName); + strncpy(plat_joystick_state[c].name, + device_instance.tszInstanceName, 64); + + memset(&devcaps, 0, sizeof(devcaps)); + devcaps.dwSize = sizeof(devcaps); + if (FAILED(lpdi_joystick[c]->GetCapabilities(&devcaps))) + fatal("joystick_init : GetCapabilities failed\n"); + pclog(" Axes = %i\n", devcaps.dwAxes); + pclog(" Buttons = %i\n", devcaps.dwButtons); + pclog(" POVs = %i\n", devcaps.dwPOVs); + + lpdi_joystick[c]->EnumObjects(obj_callback, + &plat_joystick_state[c], DIDFT_ALL); + if (FAILED(lpdi_joystick[c]->SetCooperativeLevel(hwndMain, + DISCL_BACKGROUND | DISCL_NONEXCLUSIVE))) + fatal("joystick_init : SetCooperativeLevel failed\n"); + if (FAILED(lpdi_joystick[c]->SetDataFormat(&c_dfDIJoystick))) + fatal("joystick_init : SetDataFormat failed\n"); + + joy_axis_range.lMin = -32768; + joy_axis_range.lMax = 32767; + joy_axis_range.diph.dwSize = sizeof(DIPROPRANGE); + joy_axis_range.diph.dwHeaderSize = sizeof(DIPROPHEADER); + joy_axis_range.diph.dwHow = DIPH_BYOFFSET; + joy_axis_range.diph.dwObj = DIJOFS_X; + lpdi_joystick[c]->SetProperty(DIPROP_RANGE, &joy_axis_range.diph); + joy_axis_range.diph.dwObj = DIJOFS_Y; + lpdi_joystick[c]->SetProperty(DIPROP_RANGE, &joy_axis_range.diph); + joy_axis_range.diph.dwObj = DIJOFS_Z; + lpdi_joystick[c]->SetProperty(DIPROP_RANGE, &joy_axis_range.diph); + joy_axis_range.diph.dwObj = DIJOFS_RX; + lpdi_joystick[c]->SetProperty(DIPROP_RANGE, &joy_axis_range.diph); + joy_axis_range.diph.dwObj = DIJOFS_RY; + lpdi_joystick[c]->SetProperty(DIPROP_RANGE, &joy_axis_range.diph); + joy_axis_range.diph.dwObj = DIJOFS_RZ; + lpdi_joystick[c]->SetProperty(DIPROP_RANGE, &joy_axis_range.diph); + + if (FAILED(lpdi_joystick[c]->Acquire())) + fatal("joystick_init : Acquire failed\n"); + } } -void joystick_close(void) + +void +joystick_close(void) { - if (lpdi_joystick[1]) - { - lpdi_joystick[1]->Release(); - lpdi_joystick[1] = NULL; - } - if (lpdi_joystick[0]) - { - lpdi_joystick[0]->Release(); - lpdi_joystick[0] = NULL; - } + if (lpdi_joystick[1]) { + lpdi_joystick[1]->Release(); + lpdi_joystick[1] = NULL; + } + + if (lpdi_joystick[0]) { + lpdi_joystick[0]->Release(); + lpdi_joystick[0] = NULL; + } } -static int joystick_get_axis(int joystick_nr, int mapping) + +static int +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 (int)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 (int)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 (int)-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]; + if (LOWORD(pov) == 0xFFFF) + return 0; + else + return (int)-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 == JOYSTICK_TYPE_NONE) return; + if (joystick_type == JOYSTICK_NONE) return; - for (c = 0; c < joysticks_present; c++) - { - DIJOYSTATE joystate; - int b; - - if (FAILED(lpdi_joystick[c]->Poll())) - { - lpdi_joystick[c]->Acquire(); - lpdi_joystick[c]->Poll(); - } - if (FAILED(lpdi_joystick[c]->GetDeviceState(sizeof(DIJOYSTATE), (LPVOID)&joystate))) - { - lpdi_joystick[c]->Acquire(); - lpdi_joystick[c]->Poll(); - lpdi_joystick[c]->GetDeviceState(sizeof(DIJOYSTATE), (LPVOID)&joystate); - } - - plat_joystick_state[c].a[0] = joystate.lX; - plat_joystick_state[c].a[1] = joystate.lY; - plat_joystick_state[c].a[2] = joystate.lZ; - plat_joystick_state[c].a[3] = joystate.lRx; - plat_joystick_state[c].a[4] = joystate.lRy; - plat_joystick_state[c].a[5] = joystate.lRz; - - for (b = 0; b < 16; b++) - plat_joystick_state[c].b[b] = joystate.rgbButtons[b] & 0x80; + for (c = 0; c < joysticks_present; c++) { + DIJOYSTATE joystate; + int b; - for (b = 0; b < 4; b++) - plat_joystick_state[c].p[b] = joystate.rgdwPOV[b]; -// pclog("joystick %i - x=%i y=%i b[0]=%i b[1]=%i %i\n", c, joystick_state[c].x, joystick_state[c].y, joystick_state[c].b[0], joystick_state[c].b[1], joysticks_present); - } - - 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]]; + if (FAILED(lpdi_joystick[c]->Poll())) { + lpdi_joystick[c]->Acquire(); + lpdi_joystick[c]->Poll(); + } if (FAILED(lpdi_joystick[c]->GetDeviceState(sizeof(DIJOYSTATE), (LPVOID)&joystate))) { + lpdi_joystick[c]->Acquire(); + lpdi_joystick[c]->Poll(); + lpdi_joystick[c]->GetDeviceState(sizeof(DIJOYSTATE), (LPVOID)&joystate); + } - for (d = 0; d < joystick_get_pov_count(joystick_type); d++) - { - int x, y; - double angle, magnitude; + plat_joystick_state[c].a[0] = joystate.lX; + plat_joystick_state[c].a[1] = joystate.lY; + plat_joystick_state[c].a[2] = joystate.lZ; + plat_joystick_state[c].a[3] = joystate.lRx; + plat_joystick_state[c].a[4] = joystate.lRy; + plat_joystick_state[c].a[5] = joystate.lRz; - 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; - } - } + for (b = 0; b < 16; b++) + plat_joystick_state[c].b[b] = joystate.rgbButtons[b] & 0x80; + + for (b = 0; b < 4; b++) + plat_joystick_state[c].p[b] = joystate.rgdwPOV[b]; +// pclog("joystick %i - x=%i y=%i b[0]=%i b[1]=%i %i\n", c, joystick_state[c].x, joystick_state[c].y, joystick_state[c].b[0], joystick_state[c].b[1], joysticks_present); + } + + for (c = 0; c < gamedev_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 < gamedev_get_axis_count(joystick_type); d++) + joystick_state[c].axis[d] = get_axis(joystick_nr, joystick_state[c].axis_mapping[d]); + for (d = 0; d < gamedev_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 < gamedev_get_pov_count(joystick_type); d++) { + int x, y; + double angle, magnitude; + + x = get_axis(joystick_nr, joystick_state[c].pov_mapping[d][0]); + y = 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 < gamedev_get_axis_count(joystick_type); d++) + joystick_state[c].axis[d] = 0; + for (d = 0; d < gamedev_get_button_count(joystick_type); d++) + joystick_state[c].button[d] = 0; + for (d = 0; d < gamedev_get_pov_count(joystick_type); d++) + joystick_state[c].pov[d] = -1; + } + } +} + + +#define AXIS_STRINGS_MAX 3 +static int joystick_nr; +static int joystick_config_type; +static const 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) +{ + int id = IDC_CONFIG_BASE + 2; + int c, d, joystick; + HWND h; + + h = GetDlgItem(hdlg, IDC_CONFIG_BASE); + joystick = SendMessage(h, CB_GETCURSEL, 0, 0); + + for (c = 0; c < gamedev_get_axis_count(joystick_config_type); c++) { + int sel = c; + + 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++) { + char s[80]; + + 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); + } + SendMessage(h, CB_SETCURSEL, sel, 0); + EnableWindow(h, TRUE); + } else + EnableWindow(h, FALSE); + + id += 2; + } + + for (c = 0; c < gamedev_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); + + id += 2; + } + + for (c = 0; c < gamedev_get_pov_count(joystick_config_type)*2; c++) { + int sel = c; + + h = GetDlgItem(hdlg, id); + SendMessage(h, CB_RESETCONTENT, 0, 0); + + if (joystick) { + for (d = 0; d < plat_joystick_state[joystick-1].nr_povs; d++) { + char s[80]; + + 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) +{ + 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; + + if (axis_sel < nr_axes) + return axis_sel; + + axis_sel -= nr_axes; + if (axis_sel & 1) + return POV_Y | (axis_sel >> 1); + else + return POV_X | (axis_sel >> 1); +} + + +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; + + 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; +} + + +#ifdef __amd64__ +static LRESULT CALLBACK +#else +static BOOL CALLBACK +#endif +dlg_proc(HWND hdlg, UINT message, WPARAM wParam, UNUSED(LPARAM lParam)) +{ + 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; + + 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); + + 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 < gamedev_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 + SendMessage(h, CB_SETCURSEL, mapping, 0); + id += 2; + } + for (c = 0; c < gamedev_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 < gamedev_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; + + 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 < gamedev_get_axis_count(joystick_config_type); c++) { + joystick_state[joystick_nr].axis_mapping[c] = get_axis(hdlg, id); + id += 2; + } + for (c = 0; c < gamedev_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 < gamedev_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; +} + + +uint8_t +joystickconfig_open(HWND hwnd, int joy_nr, int type) +{ + uint16_t *data_block = (uint16_t *)malloc(16384); + uint16_t *data; + DLGTEMPLATE *dlg = (DLGTEMPLATE *)data_block; + DLGITEMTEMPLATE *item; + int c, y = 10; + int id = IDC_CONFIG_BASE; + + joystickconfig_changed = 0; + joystick_nr = joy_nr; + joystick_config_type = type; + + memset(data_block, 0x00, 16384); + + 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++ = 0; /*no menu*/ + *data++ = 0; /*predefined dialog box class*/ + data += MultiByteToWideChar(CP_ACP, 0, + "Device Configuration", -1, (wchar_t *)data, 128); + *data++ = 8; /*Point*/ + data += MultiByteToWideChar(CP_ACP, 0, "MS Sans Serif", -1, (wchar_t *)data, 128); + if (((uintptr_t)data) & 2) + data++; + + /*Combo box*/ + item = (DLGITEMTEMPLATE *)data; + item->style = WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST | WS_VSCROLL; + item->x = 70; + item->y = y; + item->id = id++; + item->cx = 140; + item->cy = 150; + data = (uint16_t *)(item + 1); + *data++ = 0xFFFF; + *data++ = 0x0085; /* combo box class */ + data += MultiByteToWideChar(CP_ACP, 0, "Device", -1, (wchar_t *)data, 256); + *data++ = 0; /* no creation data */ + if (((uintptr_t)data) & 2) + data++; + + /*Static text*/ + item = (DLGITEMTEMPLATE *)data; + item->style = WS_CHILD | WS_VISIBLE; + item->id = id++; + item->x = 10; + item->y = y; + item->cx = 60; + item->cy = 15; + data = (uint16_t *)(item + 1); + *data++ = 0xFFFF; + *data++ = 0x0082; /* static class */ + data += MultiByteToWideChar(CP_ACP, 0, "Device:", -1, (wchar_t *)data, 256); + *data++ = 0; /* no creation data */ + if (((uintptr_t)data) & 2) + data++; + + y += 20; + + for (c = 0; c < gamedev_get_axis_count(type); c++) { + /*Combo box*/ + item = (DLGITEMTEMPLATE *)data; + item->style = WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST | WS_VSCROLL; + item->id = id++; + item->x = 70; + item->y = y; + item->cx = 140; + item->cy = 150; + data = (uint16_t *)(item + 1); + *data++ = 0xFFFF; + *data++ = 0x0085; /* combo box class */ + data += MultiByteToWideChar(CP_ACP, 0, + gamedev_get_axis_name(type, c), -1, (wchar_t *)data, 256); + *data++ = 0; /* no creation data */ + if (((uintptr_t)data) & 2) + data++; + + /*Static text*/ + item = (DLGITEMTEMPLATE *)data; + item->style = WS_CHILD | WS_VISIBLE; + item->id = id++; + item->x = 10; + item->y = y; + item->cx = 60; + item->cy = 15; + data = (uint16_t *)(item + 1); + *data++ = 0xFFFF; + *data++ = 0x0082; /* static class */ + data += MultiByteToWideChar(CP_ACP, 0, + gamedev_get_axis_name(type, c), -1, (wchar_t *)data, 256); + *data++ = 0; /* no creation data */ + if (((uintptr_t)data) & 2) + data++; + + y += 20; + } + + for (c = 0; c < gamedev_get_button_count(type); c++) { + /*Combo box*/ + item = (DLGITEMTEMPLATE *)data; + item->style = WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST | WS_VSCROLL; + item->id = id++; + item->x = 70; + item->y = y; + item->cx = 140; + item->cy = 150; + data = (uint16_t *)(item + 1); + *data++ = 0xFFFF; + *data++ = 0x0085; /* combo box class */ + data += MultiByteToWideChar(CP_ACP, 0, + gamedev_get_button_name(type, c), -1, (wchar_t *)data, 256); + *data++ = 0; /* no creation data */ + if (((uintptr_t)data) & 2) + data++; + + /*Static text*/ + item = (DLGITEMTEMPLATE *)data; + item->style = WS_CHILD | WS_VISIBLE; + item->id = id++; + item->x = 10; + item->y = y; + item->cx = 60; + item->cy = 15; + data = (uint16_t *)(item + 1); + *data++ = 0xFFFF; + *data++ = 0x0082; /* static class */ + data += MultiByteToWideChar(CP_ACP, 0, + gamedev_get_button_name(type, c), -1, (wchar_t *)data, 256); + *data++ = 0; /* no creation data */ + if (((uintptr_t)data) & 2) + data++; + + y += 20; + } + + for (c = 0; c < gamedev_get_pov_count(type)*2; c++) { + char s[80]; + + /*Combo box*/ + item = (DLGITEMTEMPLATE *)data; + item->style = WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST | WS_VSCROLL; + item->id = id++; + item->x = 70; + item->y = y; + item->cx = 140; + item->cy = 150; + data = (uint16_t *)(item + 1); + *data++ = 0xFFFF; + *data++ = 0x0085; /* combo box class */ + if (c & 1) + sprintf(s, "%s (Y axis)", gamedev_get_pov_name(type, c/2)); + else + sprintf(s, "%s (X axis)", gamedev_get_pov_name(type, c/2)); + data += MultiByteToWideChar(CP_ACP, 0, s, -1, (wchar_t *)data, 256); + *data++ = 0; /* no creation data */ + if (((uintptr_t)data) & 2) + data++; + + /*Static text*/ + item = (DLGITEMTEMPLATE *)data; + item->style = WS_CHILD | WS_VISIBLE; + item->id = id++; + item->x = 10; + item->y = y; + item->cx = 60; + item->cy = 15; + data = (uint16_t *)(item + 1); + *data++ = 0xFFFF; + *data++ = 0x0082; /* static class */ + data += MultiByteToWideChar(CP_ACP, 0, s, -1, (wchar_t *)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->style = WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON; + item->id = IDOK; /* OK button identifier */ + item->x = 20; + item->y = y; + item->cx = 50; + item->cy = 14; + data = (uint16_t *)(item + 1); + *data++ = 0xFFFF; + *data++ = 0x0080; /* button class */ + data += MultiByteToWideChar(CP_ACP, 0, "OK", -1, (wchar_t *)data, 50); + *data++ = 0; /* no creation data */ + if (((uintptr_t)data) & 2) + data++; + + item = (DLGITEMTEMPLATE *)data; + item->style = WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON; + item->id = IDCANCEL; /* OK button identifier */ + item->x = 80; + item->y = y; + item->cx = 50; + item->cy = 14; + data = (uint16_t *)(item + 1); + *data++ = 0xFFFF; + *data++ = 0x0080; /* button class */ + data += MultiByteToWideChar(CP_ACP, 0, "Cancel", -1, (wchar_t *)data, 50); + *data++ = 0; /* no creation data */ + + dlg->cy = y + 20; + + DialogBoxIndirect(hinstance, dlg, hwnd, dlg_proc); + + free(data_block); + + return joystickconfig_changed; } diff --git a/src/win/win_jsconf.c b/src/win/win_jsconf.c deleted file mode 100644 index b14ea7a..0000000 --- a/src/win/win_jsconf.c +++ /dev/null @@ -1,594 +0,0 @@ -/* - * VARCem Virtual ARchaeological Computer EMulator. - * An emulator of (mostly) x86-based PC systems and devices, - * using the ISA,EISA,VLB,MCA and PCI system buses, roughly - * spanning the era between 1981 and 1995. - * - * This file is part of the VARCem Project. - * - * Implementation of the Joystick Configuration dialog. - * - * Version: @(#)win_jsconf.c 1.0.3 2018/03/10 - * - * Authors: Fred N. van Kempen, - * Miran Grca, - * Sarah Walker, - * - * Copyright 2017,2018 Fred N. van Kempen. - * Copyright 2016-2018 Miran Grca. - * Copyright 2008-2018 Sarah Walker. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the: - * - * Free Software Foundation, Inc. - * 59 Temple Place - Suite 330 - * Boston, MA 02111-1307 - * USA. - */ -#define WIN32_LEAN_AND_MEAN -#include -#include -#include -#include -#include -#include -#include "../emu.h" -#include "../config.h" -#include "../device.h" -#include "../game/gameport.h" -#include "../plat.h" -#include "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 uint8_t joystickconfig_changed = 0; - - -static void rebuild_axis_button_selections(HWND hdlg) -{ - int id = IDC_CONFIG_BASE + 2; - HWND h; - int joystick; - int c, d; - - 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; - - 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++) - { - char s[80]; - - 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); - } - SendMessage(h, CB_SETCURSEL, sel, 0); - EnableWindow(h, TRUE); - } - else - EnableWindow(h, FALSE); - - id += 2; - } - - 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); - - id += 2; - } - - 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); - - if (joystick) - { - for (d = 0; d < plat_joystick_state[joystick-1].nr_povs; d++) - { - char s[80]; - - 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) -{ - 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; - - if (axis_sel < nr_axes) - return axis_sel; - - axis_sel -= nr_axes; - if (axis_sel & 1) - return POV_Y | (axis_sel >> 1); - else - return POV_X | (axis_sel >> 1); -} - -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; - - 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; -} - -#ifdef __amd64__ -static LRESULT CALLBACK -#else -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; - - 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"); - - 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); - - 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 - 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; - - 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; -} - -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; - - joystickconfig_changed = 0; - - joystick_nr = joy_nr; - joystick_config_type = type; - - 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; - - data = (uint16_t *)(dlg + 1); - - *data++ = 0; /*no menu*/ - *data++ = 0; /*predefined dialog box class*/ - data += MultiByteToWideChar(CP_ACP, 0, "Device Configuration", -1, data, 50); - - *data++ = 8; /*Point*/ - data += MultiByteToWideChar(CP_ACP, 0, "MS Sans Serif", -1, data, 50); - - 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_DROPDOWN | 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; - 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->id = id++; - - item->cx = 140; - item->cy = 150; - - item->style = WS_CHILD | WS_VISIBLE | CBS_DROPDOWN | 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; - 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_DROPDOWN | 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; - 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++) - { - char s[80]; - - /*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_DROPDOWN | 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; - 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 = 20; - item->y = y; - 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 = 80; - item->y = y; - item->cx = 50; - item->cy = 14; - item->id = IDCANCEL; /* 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, "Cancel", -1, data, 50); - *data++ = 0; /* no creation data */ - - dlg->cy = y + 20; - - DialogBoxIndirect(hinstance, dlg, hwnd, joystickconfig_dlgproc); - - free(data_block); - - return joystickconfig_changed; -} diff --git a/src/win/win_settings.c b/src/win/win_settings.c index 3e0a658..6d615bd 100644 --- a/src/win/win_settings.c +++ b/src/win/win_settings.c @@ -8,7 +8,7 @@ * * Implementation of the Settings dialog. * - * Version: @(#)win_settings.c 1.0.22 2018/04/14 + * Version: @(#)win_settings.c 1.0.23 2018/04/26 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -52,11 +52,12 @@ #include "../device.h" #include "../nvr.h" #include "../machine/machine.h" -#include "../game/gameport.h" #include "../mouse.h" -#include "../parallel.h" -#include "../parallel_dev.h" -#include "../serial.h" +#include "../ports/game_dev.h" +#include "../ports/parallel.h" +#include "../ports/parallel_dev.h" +#include "../ports/serial.h" +#include "../game/joystick.h" #include "../disk/hdd.h" #include "../disk/hdc.h" #include "../disk/hdc_ide.h" @@ -101,7 +102,8 @@ static int temp_net_type, temp_net_card; static char temp_host_dev[128]; /* Ports category. */ -static int temp_serial[SERIAL_MAX], +static int temp_game, + temp_serial[SERIAL_MAX], temp_parallel[PARALLEL_MAX], temp_parallel_device[PARALLEL_MAX]; @@ -204,6 +206,7 @@ settings_init(void) temp_net_card = network_card; /* Ports category */ + temp_game = game_enabled; for (i = 0; i < SERIAL_MAX; i++) temp_serial[i] = serial_enabled[i]; for (i = 0; i < PARALLEL_MAX; i++) { @@ -278,6 +281,7 @@ settings_changed(void) i = i || (network_card != temp_net_card); /* Ports category */ + i = i || (temp_game != game_enabled); for (j = 0; j < SERIAL_MAX; j++) i = i || (temp_serial[j] != serial_enabled[j]); for (j = 0; j < PARALLEL_MAX; j++) { @@ -380,6 +384,7 @@ settings_save(void) network_card = temp_net_card; /* Ports category */ + game_enabled = temp_game; for (i = 0; i < SERIAL_MAX; i++) serial_enabled[i] = temp_serial[i]; for (i = 0; i < PARALLEL_MAX; i++) { diff --git a/src/win/win_settings_input.h b/src/win/win_settings_input.h index d54db5f..1381280 100644 --- a/src/win/win_settings_input.h +++ b/src/win/win_settings_input.h @@ -8,7 +8,7 @@ * * Implementation of the Settings dialog. * - * Version: @(#)win_settings_input.h 1.0.4 2018/04/14 + * Version: @(#)win_settings_input.h 1.0.5 2018/04/26 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -100,22 +100,22 @@ input_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) h = GetDlgItem(hdlg, IDC_COMBO_JOYSTICK); c = 0; - while ((stransi = joystick_get_name(c)) != NULL) { + while ((stransi = gamedev_get_name(c)) != NULL) { mbstowcs(temp, stransi, sizeof_w(temp)); SendMessage(h, CB_ADDSTRING, 0, (LPARAM)temp); c++; } - EnableWindow(h, TRUE); SendMessage(h, CB_SETCURSEL, temp_joystick, 0); + EnableWindow(h, (temp_game)?TRUE:FALSE); h = GetDlgItem(hdlg, IDC_JOY1); - EnableWindow(h, (joystick_get_max_joysticks(temp_joystick) >= 1) ? TRUE : FALSE); + EnableWindow(h, (temp_game && (gamedev_get_max_joysticks(temp_joystick) >= 1)) ? TRUE : FALSE); h = GetDlgItem(hdlg, IDC_JOY2); - EnableWindow(h, (joystick_get_max_joysticks(temp_joystick) >= 2) ? TRUE : FALSE); + EnableWindow(h, (temp_game && (gamedev_get_max_joysticks(temp_joystick) >= 2)) ? TRUE : FALSE); h = GetDlgItem(hdlg, IDC_JOY3); - EnableWindow(h, (joystick_get_max_joysticks(temp_joystick) >= 3) ? TRUE : FALSE); + EnableWindow(h, (temp_game && (gamedev_get_max_joysticks(temp_joystick) >= 3)) ? TRUE : FALSE); h = GetDlgItem(hdlg, IDC_JOY4); - EnableWindow(h, (joystick_get_max_joysticks(temp_joystick) >= 4) ? TRUE : FALSE); + EnableWindow(h, (temp_game && (gamedev_get_max_joysticks(temp_joystick) >= 4)) ? TRUE : FALSE); return TRUE; @@ -143,13 +143,13 @@ input_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) temp_joystick = SendMessage(h, CB_GETCURSEL, 0, 0); h = GetDlgItem(hdlg, IDC_JOY1); - EnableWindow(h, (joystick_get_max_joysticks(temp_joystick) >= 1) ? TRUE : FALSE); + EnableWindow(h, (gamedev_get_max_joysticks(temp_joystick) >= 1) ? TRUE : FALSE); h = GetDlgItem(hdlg, IDC_JOY2); - EnableWindow(h, (joystick_get_max_joysticks(temp_joystick) >= 2) ? TRUE : FALSE); + EnableWindow(h, (gamedev_get_max_joysticks(temp_joystick) >= 2) ? TRUE : FALSE); h = GetDlgItem(hdlg, IDC_JOY3); - EnableWindow(h, (joystick_get_max_joysticks(temp_joystick) >= 3) ? TRUE : FALSE); + EnableWindow(h, (gamedev_get_max_joysticks(temp_joystick) >= 3) ? TRUE : FALSE); h = GetDlgItem(hdlg, IDC_JOY4); - EnableWindow(h, (joystick_get_max_joysticks(temp_joystick) >= 4) ? TRUE : FALSE); + EnableWindow(h, (gamedev_get_max_joysticks(temp_joystick) >= 4) ? TRUE : FALSE); break; case IDC_JOY1: diff --git a/src/win/win_settings_ports.h b/src/win/win_settings_ports.h index 88d2775..a28268b 100644 --- a/src/win/win_settings_ports.h +++ b/src/win/win_settings_ports.h @@ -8,7 +8,7 @@ * * Implementation of the Settings dialog. * - * Version: @(#)win_settings_ports.h 1.0.2 2018/04/07 + * Version: @(#)win_settings_ports.h 1.0.3 2018/04/26 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -56,6 +56,11 @@ ports_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) switch (message) { case WM_INITDIALOG: + /* Set up the game port controls. */ + h = GetDlgItem(hdlg, IDC_CHECK_GAME); + SendMessage(h, BM_SETCHECK, temp_game, 0); + + /* Set up the parallel port controls. */ for (i = 0; i < PARALLEL_MAX; i++) { /* Populate the "devices" list and select one. */ h = GetDlgItem(hdlg, IDC_COMBO_PARALLEL1+i); @@ -87,7 +92,6 @@ ports_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) h = GetDlgItem(hdlg, IDC_CHECK_SERIAL1+i); SendMessage(h, BM_SETCHECK, temp_serial[i], 0); } - return TRUE; case WM_COMMAND: @@ -102,10 +106,12 @@ ports_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) EnableWindow(h, d ? TRUE : FALSE); break; } - return FALSE; case WM_SAVESETTINGS: + h = GetDlgItem(hdlg, IDC_CHECK_GAME); + temp_game = SendMessage(h, BM_GETCHECK, 0, 0); + for (i = 0; i < PARALLEL_MAX; i++) { h = GetDlgItem(hdlg, IDC_CHECK_PARALLEL1+i); temp_parallel[i] = SendMessage(h, BM_GETCHECK, 0, 0); @@ -119,7 +125,6 @@ ports_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) h = GetDlgItem(hdlg, IDC_CHECK_SERIAL1+i); temp_serial[i] = SendMessage(h, BM_GETCHECK, 0, 0); } - return FALSE; default: