Updates to mouse.c (fixing a bug) and mouse_bus.c (fixing several) - done together with 86Box.

Updated pc.c to remove the no-longer-needed mouse_init() function.
Added 100MHz and 200MHz 386 processors for debugging (and faster compiles in the Linux guest.)
This commit is contained in:
waltje
2019-05-10 04:06:57 -05:00
parent 3baba710bf
commit 8b4843a95b
5 changed files with 201 additions and 204 deletions

View File

@@ -8,7 +8,7 @@
* *
* Define all known processor types. * Define all known processor types.
* *
* Version: @(#)cpu_table.c 1.0.8 2019/04/12 * Version: @(#)cpu_table.c 1.0.9 2019/05/09
* *
* Authors: Fred N. van Kempen, <decwiz@yahoo.com> * Authors: Fred N. van Kempen, <decwiz@yahoo.com>
* Miran Grca, <mgrca8@gmail.com> * Miran Grca, <mgrca8@gmail.com>
@@ -53,7 +53,7 @@ const CPU cpus_8088[] = {
{ "8088/10", CPU_8088, 10000000, 1, 0, 0, 0, 0, 0, 0,0,0,0, 1 }, { "8088/10", CPU_8088, 10000000, 1, 0, 0, 0, 0, 0, 0,0,0,0, 1 },
{ "8088/12", CPU_8088, 12000000, 1, 0, 0, 0, 0, 0, 0,0,0,0, 1 }, { "8088/12", CPU_8088, 12000000, 1, 0, 0, 0, 0, 0, 0,0,0,0, 1 },
{ "8088/16", CPU_8088, 16000000, 1, 0, 0, 0, 0, 0, 0,0,0,0, 1 }, { "8088/16", CPU_8088, 16000000, 1, 0, 0, 0, 0, 0, 0,0,0,0, 1 },
#ifdef _DEBUG #if defined(WALTJE) && defined(_DEBUG)
{ "286/6", CPU_286, 6000000, 1, 0, 0, 0, 0, 0, 2,2,2,2, 1 }, { "286/6", CPU_286, 6000000, 1, 0, 0, 0, 0, 0, 2,2,2,2, 1 },
#endif #endif
{ NULL } { NULL }
@@ -101,6 +101,9 @@ const CPU cpus_286[] = {
{ "286/16", CPU_286, 16000000, 1, 0, 0, 0, 0, 0, 3,3,3,3, 2 }, { "286/16", CPU_286, 16000000, 1, 0, 0, 0, 0, 0, 3,3,3,3, 2 },
{ "286/20", CPU_286, 20000000, 1, 0, 0, 0, 0, 0, 4,4,4,4, 3 }, { "286/20", CPU_286, 20000000, 1, 0, 0, 0, 0, 0, 4,4,4,4, 3 },
{ "286/25", CPU_286, 25000000, 1, 0, 0, 0, 0, 0, 4,4,4,4, 3 }, { "286/25", CPU_286, 25000000, 1, 0, 0, 0, 0, 0, 4,4,4,4, 3 },
#if defined(WALTJE) && defined(_DEBUG)
{ "286/100", CPU_286, 100000000, 1, 0, 0, 0, 0, 0, 4,4,4,4, 3 },
#endif
{ NULL } { NULL }
}; };
@@ -121,6 +124,10 @@ const CPU cpus_i386DX[] = {
{ "i386DX/25", CPU_386DX, 25000000, 1, 0, 0x0308, 0, 0, 0, 4,4,3,3, 3 }, { "i386DX/25", CPU_386DX, 25000000, 1, 0, 0x0308, 0, 0, 0, 4,4,3,3, 3 },
{ "i386DX/33", CPU_386DX, 33333333, 1, 0, 0x0308, 0, 0, 0, 6,6,3,3, 4 }, { "i386DX/33", CPU_386DX, 33333333, 1, 0, 0x0308, 0, 0, 0, 6,6,3,3, 4 },
{ "i386DX/40", CPU_386DX, 40000000, 1, 0, 0x0308, 0, 0, 0, 7,7,3,3, 5 }, { "i386DX/40", CPU_386DX, 40000000, 1, 0, 0x0308, 0, 0, 0, 7,7,3,3, 5 },
#if defined(WALTJE) && defined(_DEBUG)
{ "i386DX/100", CPU_386DX, 100000000, 1, 0, 0x0308, 0, 0, 0, 7,7,3,3, 5 },
{ "i386DX/200", CPU_386DX, 200000000, 1, 0, 0x0308, 0, 0, 0, 7,7,3,3, 5 },
#endif
{ "RapidCAD/25", CPU_RAPIDCAD, 25000000, 1, 0, 0x0430, 0, 0, 0, 4,4,3,3, 3 }, { "RapidCAD/25", CPU_RAPIDCAD, 25000000, 1, 0, 0x0430, 0, 0, 0, 4,4,3,3, 3 },
{ "RapidCAD/33", CPU_RAPIDCAD, 33333333, 1, 0, 0x0430, 0, 0, 0, 6,6,3,3, 4 }, { "RapidCAD/33", CPU_RAPIDCAD, 33333333, 1, 0, 0x0430, 0, 0, 0, 6,6,3,3, 4 },
{ "RapidCAD/40", CPU_RAPIDCAD, 40000000, 1, 0, 0x0430, 0, 0, 0, 7,7,3,3, 5 }, { "RapidCAD/40", CPU_RAPIDCAD, 40000000, 1, 0, 0x0430, 0, 0, 0, 7,7,3,3, 5 },
@@ -142,6 +149,10 @@ const CPU cpus_Am386DX[] = {
{ "Am386DX/25", CPU_386DX, 25000000, 1, 0, 0x0308, 0, 0, 0, 4,4,3,3, 3 }, { "Am386DX/25", CPU_386DX, 25000000, 1, 0, 0x0308, 0, 0, 0, 4,4,3,3, 3 },
{ "Am386DX/33", CPU_386DX, 33333333, 1, 0, 0x0308, 0, 0, 0, 6,6,3,3, 4 }, { "Am386DX/33", CPU_386DX, 33333333, 1, 0, 0x0308, 0, 0, 0, 6,6,3,3, 4 },
{ "Am386DX/40", CPU_386DX, 40000000, 1, 0, 0x0308, 0, 0, 0, 7,7,3,3, 5 }, { "Am386DX/40", CPU_386DX, 40000000, 1, 0, 0x0308, 0, 0, 0, 7,7,3,3, 5 },
#if defined(WALTJE) && defined(_DEBUG)
{ "Am386DX/100", CPU_386DX, 100000000, 1, 0, 0x0308, 0, 0, 0, 7,7,3,3, 5 },
{ "Am386DX/200", CPU_386DX, 200000000, 1, 0, 0x0308, 0, 0, 0, 7,7,3,3, 5 },
#endif
{ NULL } { NULL }
}; };

View File

@@ -8,9 +8,7 @@
* *
* Common driver module for MOUSE devices. * Common driver module for MOUSE devices.
* *
* TODO: Add the Genius bus- and serial mouse. * Version: @(#)mouse.c 1.0.20 2019/05/09
*
* Version: @(#)mouse.c 1.0.19 2019/05/03
* *
* Authors: Fred N. van Kempen, <decwiz@yahoo.com> * Authors: Fred N. van Kempen, <decwiz@yahoo.com>
* Miran Grca, <mgrca8@gmail.com> * Miran Grca, <mgrca8@gmail.com>
@@ -80,9 +78,6 @@ static const struct {
{ "logibus", &mouse_logibus_device }, { "logibus", &mouse_logibus_device },
{ "msbus", &mouse_msinport_device }, { "msbus", &mouse_msinport_device },
#if 0
{ "genibus", &mouse_genibus_device },
#endif
{ "mssystems", &mouse_mssystems_device }, { "mssystems", &mouse_mssystems_device },
{ "msserial", &mouse_msserial_device }, { "msserial", &mouse_msserial_device },
{ "ltserial", &mouse_ltserial_device }, { "ltserial", &mouse_ltserial_device },
@@ -115,22 +110,14 @@ mouse_log(int level, const char *fmt, ...)
#endif #endif
/* Initialize the mouse module. */
void
mouse_init(void)
{
/* Initialize local data. */
mouse_x = mouse_y = mouse_z = 0;
mouse_buttons = 0x00;
mouse_close();
}
void void
mouse_close(void) mouse_close(void)
{ {
mouse_nbut = 0; mouse_nbut = 0;
mouse_x = mouse_y = mouse_z = 0;
mouse_buttons = 0x00;
mouse_priv = NULL; mouse_priv = NULL;
mouse_func = NULL; mouse_func = NULL;
} }
@@ -148,10 +135,15 @@ mouse_reset(void)
/* Clear local data. */ /* Clear local data. */
mouse_x = mouse_y = mouse_z = 0; mouse_x = mouse_y = mouse_z = 0;
mouse_buttons = 0x00; mouse_buttons = 0x00;
mouse_priv = NULL;
mouse_func = NULL;
/* Initialize the mouse device. */ /* Initialize the mouse device. */
if (devices[config.mouse_type].device != NULL) if (devices[config.mouse_type].device != NULL) {
mouse_priv = device_add(devices[config.mouse_type].device); mouse_priv = device_add(devices[config.mouse_type].device);
mouse_func = (int (*)(int,int,int,int,void *))
devices[config.mouse_type].device->ms_poll;
}
} }

View File

@@ -8,7 +8,7 @@
* *
* Definitions for the mouse driver. * Definitions for the mouse driver.
* *
* Version: @(#)mouse.h 1.0.11 2019/04/23 * Version: @(#)mouse.h 1.0.12 2019/05/09
* *
* Authors: Fred N. van Kempen, <decwiz@yahoo.com> * Authors: Fred N. van Kempen, <decwiz@yahoo.com>
* Miran Grca, <mgrca8@gmail.com> * Miran Grca, <mgrca8@gmail.com>
@@ -54,17 +54,11 @@
#define MOUSE_INTERNAL 1 /* machine has internal mouse */ #define MOUSE_INTERNAL 1 /* machine has internal mouse */
#define MOUSE_LOGIBUS 2 /* Logitech/ATI Bus Mouse */ #define MOUSE_LOGIBUS 2 /* Logitech/ATI Bus Mouse */
#define MOUSE_INPORT 3 /* Microsoft InPort Mouse */ #define MOUSE_INPORT 3 /* Microsoft InPort Mouse */
#if 0 #define MOUSE_MSYSTEMS 4 /* Mouse Systems mouse */
# define MOUSE_GENIBUS 4 /* Genius Bus Mouse */ #define MOUSE_MICROSOFT 5 /* Microsoft Serial Mouse */
# define MOUSE_NEXT 5 #define MOUSE_LOGITECH 6 /* Logitech Serial Mouse */
#else #define MOUSE_MSWHEEL 7 /* Serial Wheel Mouse */
# define MOUSE_NEXT 4 #define MOUSE_PS2 8 /* PS/2 series Bus Mouse */
#endif
#define MOUSE_MSYSTEMS MOUSE_NEXT+0 /* Mouse Systems mouse */
#define MOUSE_MICROSOFT MOUSE_NEXT+1 /* Microsoft Serial Mouse */
#define MOUSE_LOGITECH MOUSE_NEXT+2 /* Logitech Serial Mouse */
#define MOUSE_MSWHEEL MOUSE_NEXT+3 /* Serial Wheel Mouse */
#define MOUSE_PS2 MOUSE_NEXT+4 /* PS/2 series Bus Mouse */
#ifdef __cplusplus #ifdef __cplusplus
@@ -83,9 +77,6 @@ extern const device_t mouse_logibus_device;
extern const device_t mouse_logibus_onboard_device; extern const device_t mouse_logibus_onboard_device;
extern const device_t mouse_msinport_device; extern const device_t mouse_msinport_device;
extern const device_t mouse_msinport_onboard_device; extern const device_t mouse_msinport_onboard_device;
#if 0
extern const device_t mouse_genibus_device;
#endif
extern const device_t mouse_mssystems_device; extern const device_t mouse_mssystems_device;
extern const device_t mouse_msserial_device; extern const device_t mouse_msserial_device;
extern const device_t mouse_ltserial_device; extern const device_t mouse_ltserial_device;
@@ -93,23 +84,23 @@ extern const device_t mouse_mswhserial_device;
extern const device_t mouse_ps2_device; extern const device_t mouse_ps2_device;
#endif #endif
extern void mouse_log(int level, const char *fmt, ...); extern void mouse_log(int level, const char *fmt, ...);
extern void mouse_init(void); extern void mouse_init(void);
extern void mouse_close(void); extern void mouse_close(void);
extern void mouse_reset(void); extern void mouse_reset(void);
extern void mouse_set_buttons(int buttons); extern void mouse_set_buttons(int buttons);
extern void mouse_process(void); extern void mouse_process(void);
extern void mouse_set_poll(int (*f)(int,int,int,int,void *), void *); extern void mouse_set_poll(int (*f)(int,int,int,int,void*), void*);
extern void mouse_poll(void); extern void mouse_poll(void);
extern void mouse_bus_set_irq(void *priv, int irq); extern void mouse_bus_set_irq(void *priv, int irq);
extern const char *mouse_get_name(int mouse); extern const char *mouse_get_name(int mouse);
extern const char *mouse_get_internal_name(int mouse); extern const char *mouse_get_internal_name(int mouse);
extern int mouse_get_from_internal_name(const char *s); extern int mouse_get_from_internal_name(const char *s);
extern int mouse_has_config(int mouse); extern int mouse_has_config(int mouse);
extern int mouse_get_type(int mouse); extern int mouse_get_type(int mouse);
extern int mouse_get_buttons(void); extern int mouse_get_buttons(void);
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

@@ -46,20 +46,22 @@
* Microsoft Windows 3.10.026 * Microsoft Windows 3.10.026
* Microsoft Windows NT 3.1 * Microsoft Windows NT 3.1
* Microsoft Windows 95 * Microsoft Windows 95
* Linux kernel 1.2.13-ELF
* *
* InPort verified with: * InPort verified with:
* Logitech LMouse.com 6.12 * Logitech LMouse.com 6.12
* Logitech LMouse.com 6.41 * Logitech LMouse.com 6.41
* Microsoft Windows NT 3.1 * Microsoft Windows NT 3.1
* Microsoft Windows 98 SE * Microsoft Windows 98 SE
* Linux kernel 1.2.13-ELF
* *
* Version: @(#)mouse_bus.c 1.1.9 2019/04/27 * Version: @(#)mouse_bus.c 1.1.10 2019/05/09
* *
* Authors: Fred N. van Kempen, <decwiz@yahoo.com> * Authors: Fred N. van Kempen, <decwiz@yahoo.com>
* Miran Grca, <mgrca8@gmail.com> * Miran Grca, <mgrca8@gmail.com>
* *
* Copyright 2017-2019 Fred N. van Kempen. * Copyright 2017-2019 Fred N. van Kempen.
* Copyright 2017,2018 Miran Grca. * Copyright 2017,2019 Miran Grca.
* Copyright 200?-2018 Bochs. * Copyright 200?-2018 Bochs.
* *
* Redistribution and use in source and binary forms, with * Redistribution and use in source and binary forms, with
@@ -108,53 +110,47 @@
#include "mouse.h" #include "mouse.h"
#define IRQ_MASK ((1 << 5) >> dev->irq) #define IRQ_MASK ((1 << 5) >> dev->irq)
/* MS Inport Bus Mouse Adapter */ /* Microsoft Inport Bus Mouse Adapter. */
#define INP_PORT_CONTROL 0 #define INP_PORT_CONTROL 0
#define INP_PORT_DATA 1 # define INP_CTRL_READ_BUTTONS 0x00
#define INP_PORT_SIGNATURE 2 # define INP_CTRL_READ_X 0x01
#define INP_PORT_CONFIG 3 # define INP_CTRL_READ_Y 0x02
# define INP_CTRL_COMMAND 0x07
# define INP_CTRL_RAISE_IRQ 0x16
# define INP_ENABLE_DATA_IRQ 0x08
# define INP_ENABLE_TIMER_IRQ 0x10
# define INP_HOLD_COUNTER 0x20
# define INP_CTRL_RESET 0x80
#define INP_CTRL_READ_BUTTONS 0x00 #define INP_PORT_DATA 1
#define INP_CTRL_READ_X 0x01
#define INP_CTRL_READ_Y 0x02
#define INP_CTRL_COMMAND 0x07
#define INP_CTRL_RAISE_IRQ 0x16
#define INP_CTRL_RESET 0x80
#define INP_HOLD_COUNTER (1 << 5) #define INP_PORT_SIGNATURE 2
#define INP_ENABLE_TIMER_IRQ (1 << 4)
#define INP_ENABLE_DATA_IRQ (1 << 3)
#define INP_PERIOD_MASK 0x07
/* MS/Logictech Standard Bus Mouse Adapter */ #define INP_PERIOD_MASK 0x07
#define BUSM_PORT_DATA 0
#define BUSM_PORT_SIGNATURE 1
#define BUSM_PORT_CONTROL 2
#define BUSM_PORT_CONFIG 3
#define HOLD_COUNTER (1 << 7)
#define READ_X (0 << 6)
#define READ_Y (1 << 6)
#define READ_LOW (0 << 5)
#define READ_HIGH (1 << 5)
#define DISABLE_IRQ (1 << 4)
#define DEVICE_ACTIVE (1 << 7) /* Logitech/Microsoft Standard Bus Mouse Adapter. */
#define BUSM_PORT_DATA 0
#define READ_X_LOW (READ_X | READ_LOW) #define BUSM_PORT_SIGNATURE 1
#define READ_X_HIGH (READ_X | READ_HIGH)
#define READ_Y_LOW (READ_Y | READ_LOW)
#define READ_Y_HIGH (READ_Y | READ_HIGH)
#define FLAG_INPORT (1 << 0) #define BUSM_PORT_CONTROL 2
#define FLAG_ENABLED (1 << 1) # define CTRL_DISABLE_IRQ (1 << 4)
#define FLAG_HOLD (1 << 2) # define CTRL_READ_LOW (0 << 5)
#define FLAG_TIMER_INT (1 << 3) # define CTRL_READ_HIGH (1 << 5)
#define FLAG_DATA_INT (1 << 4) # define CTRL_READ_X (0 << 6)
# define CTRL_READ_Y (1 << 6)
# define CTRL_HOLD_COUNTER (1 << 7)
static const double periods[4] = { 30.0, 50.0, 100.0, 200.0 }; # define CTRL_READ_X_LOW (CTRL_READ_X | CTRL_READ_LOW)
# define CTRL_READ_X_HIGH (CTRL_READ_X | CTRL_READ_HIGH)
# define CTRL_READ_Y_LOW (CTRL_READ_Y | CTRL_READ_LOW)
# define CTRL_READ_Y_HIGH (CTRL_READ_Y | CTRL_READ_HIGH)
#define BUSM_PORT_CONFIG 3
# define CONF_DEVICE_ACTIVE 0x80
/* Our mouse device. */ /* Our mouse device. */
@@ -165,24 +161,32 @@ typedef struct mouse {
int8_t irq, int8_t irq,
bn; bn;
uint8_t flags; uint8_t flags;
# define FLAG_INPORT 0x01
# define FLAG_ENABLED 0x02
# define FLAG_HOLD 0x04
# define FLAG_TIMER_INT 0x08
# define FLAG_DATA_INT 0x10
int delayed_dx, delayed_dy, int8_t curr_x, curr_y;
uint8_t curr_b,
buttons, buttons,
buttons_last, buttons_last;
curr_x, curr_y,
curr_b;
uint8_t ctrl, conf, sig, uint8_t ctrl, conf, sig,
cmd, toggle; cmd, toggle;
double period; int delayed_dx,
delayed_dy;
int64_t timer_enabled; double period;
int64_t timer; int64_t timer,
timer_enabled;
} mouse_t; } mouse_t;
static const double periods[4] = { 30.0, 50.0, 100.0, 200.0 };
/* Handle a READ operation from one of the Logitech registers. */ /* Handle a READ operation from one of the Logitech registers. */
static uint8_t static uint8_t
lt_read(uint16_t port, void *priv) lt_read(uint16_t port, void *priv)
@@ -198,20 +202,24 @@ lt_read(uint16_t port, void *priv)
* to change this a bit. * to change this a bit.
*/ */
switch (dev->ctrl & 0x60) { switch (dev->ctrl & 0x60) {
case READ_X_LOW: case CTRL_READ_X_LOW:
ret = dev->curr_x & 0x0f; ret = dev->curr_x & 0x0f;
dev->curr_x &= 0xf0;
break; break;
case READ_X_HIGH: case CTRL_READ_X_HIGH:
ret = (dev->curr_x >> 4) & 0x0f; ret = (dev->curr_x >> 4) & 0x0f;
dev->curr_x &= 0x0f;
break; break;
case READ_Y_LOW: case CTRL_READ_Y_LOW:
ret = dev->curr_y & 0x0f; ret = dev->curr_y & 0x0f;
dev->curr_y &= 0xf0;
break; break;
case READ_Y_HIGH: case CTRL_READ_Y_HIGH:
ret = (dev->curr_y >> 4) & 0x0f; ret = (dev->curr_y >> 4) & 0x0f;
dev->curr_y &= 0x0f;
break; break;
default: default:
@@ -274,19 +282,18 @@ lt_write(uint16_t port, uint8_t val, void *priv)
case BUSM_PORT_CONTROL: case BUSM_PORT_CONTROL:
dev->ctrl = val | 0x0f; dev->ctrl = val | 0x0f;
if (! (val & DISABLE_IRQ)) if (! (val & CTRL_DISABLE_IRQ))
dev->flags |= FLAG_TIMER_INT; dev->flags |= FLAG_TIMER_INT;
else else
dev->flags &= ~FLAG_TIMER_INT; dev->flags &= ~FLAG_TIMER_INT;
if (val & HOLD_COUNTER) if (val & CTRL_HOLD_COUNTER)
dev->flags |= FLAG_HOLD; dev->flags |= FLAG_HOLD;
else else
dev->flags &= ~FLAG_HOLD; dev->flags &= ~FLAG_HOLD;
if (dev->irq != -1) if (dev->irq != -1)
picintc(1 << dev->irq); picintc(1 << dev->irq);
break; break;
case BUSM_PORT_CONFIG: case BUSM_PORT_CONFIG:
@@ -324,12 +331,11 @@ lt_write(uint16_t port, uint8_t val, void *priv)
* The only difference is - port C upper and port B go from * The only difference is - port C upper and port B go from
* input to output. * input to output.
*/ */
dev->conf = val; if (val & CONF_DEVICE_ACTIVE) {
if (val & DEVICE_ACTIVE) {
/* Mode set/reset - enable this */ /* Mode set/reset - enable this */
dev->conf = val; dev->conf = val;
dev->flags |= (FLAG_ENABLED | FLAG_TIMER_INT); dev->flags |= (FLAG_ENABLED | FLAG_TIMER_INT);
dev->ctrl = 0x0F & ~IRQ_MASK; dev->ctrl = 0x0f & ~IRQ_MASK;
} else { } else {
/* Single-bit set/reset */ /* Single-bit set/reset */
bit = 1 << ((val >> 1) & 0x07); /* Bits 3-1 specify the target bit */ bit = 1 << ((val >> 1) & 0x07); /* Bits 3-1 specify the target bit */
@@ -358,15 +364,17 @@ ms_read(uint16_t port, void *priv)
case INP_PORT_DATA: case INP_PORT_DATA:
switch (dev->cmd) { switch (dev->cmd) {
case INP_CTRL_READ_BUTTONS: case INP_CTRL_READ_BUTTONS:
ret = dev->curr_b | 0x80; ret = dev->curr_b;
break; break;
case INP_CTRL_READ_X: case INP_CTRL_READ_X:
ret = dev->curr_x; ret = dev->curr_x;
dev->curr_x = 0;
break; break;
case INP_CTRL_READ_Y: case INP_CTRL_READ_Y:
ret = dev->curr_y; ret = dev->curr_y;
dev->curr_y = 0;
break; break;
case INP_CTRL_COMMAND: case INP_CTRL_COMMAND:
@@ -382,13 +390,9 @@ ms_read(uint16_t port, void *priv)
if (dev->toggle) if (dev->toggle)
ret = 0x12; ret = 0x12;
else else
ret = 0xDE; ret = 0xde;
dev->toggle ^= 1; dev->toggle ^= 1;
break; break;
case INP_PORT_CONFIG:
ERRLOG("MOUSE: READ from port %04x\n", port);
break;
} }
DBGLOG(2, "MOUSE: read(%04x) = %02x\n", port, ret); DBGLOG(2, "MOUSE: read(%04x) = %02x\n", port, ret);
@@ -428,21 +432,22 @@ ms_write(uint16_t port, uint8_t val, void *priv)
case INP_PORT_DATA: case INP_PORT_DATA:
if (dev->irq != -1) if (dev->irq != -1)
picintc(1 << dev->irq); picintc(1 << dev->irq);
switch (dev->cmd) { switch (dev->cmd) {
case INP_CTRL_COMMAND: case INP_CTRL_COMMAND:
if (val & INP_HOLD_COUNTER) if (val & INP_HOLD_COUNTER)
dev->flags |= FLAG_HOLD; dev->flags |= FLAG_HOLD;
else else
dev->flags &= ~FLAG_HOLD; dev->flags &= ~FLAG_HOLD;
if (val & INP_ENABLE_TIMER_IRQ) if (val & INP_ENABLE_TIMER_IRQ)
dev->flags |= FLAG_TIMER_INT; dev->flags |= FLAG_TIMER_INT;
else else
dev->flags &= ~FLAG_TIMER_INT; dev->flags &= ~FLAG_TIMER_INT;
if (val & INP_ENABLE_DATA_IRQ) if (val & INP_ENABLE_DATA_IRQ)
dev->flags |= FLAG_DATA_INT; dev->flags |= FLAG_DATA_INT;
else else
dev->flags &= ~FLAG_DATA_INT; dev->flags &= ~FLAG_DATA_INT;
switch (val & INP_PERIOD_MASK) { switch (val & INP_PERIOD_MASK) {
@@ -457,9 +462,9 @@ ms_write(uint16_t port, uint8_t val, void *priv)
case 3: case 3:
case 4: case 4:
dev->period = 1000000.0 / periods[(val & INP_PERIOD_MASK) - 1]; dev->period = 1000000.0 / periods[(val & INP_PERIOD_MASK) - 1];
dev->timer = ((int64_t) dev->period) * TIMER_USEC; dev->timer = (int64_t)(dev->period * TIMER_USEC);
dev->timer_enabled = (val & INP_ENABLE_TIMER_IRQ) ? 1LL : 0LL; dev->timer_enabled = (val & INP_ENABLE_TIMER_IRQ) ? 1LL : 0LL;
DBGLOG(1, "MOUSE timer is now %sabled at period %i\n", (val & INP_ENABLE_TIMER_IRQ) ? "en" : "dis", (int32_t) dev->period); DBGLOG(1, "MOUSE timer is now %sabled at period %i\n", (val & INP_ENABLE_TIMER_IRQ) ? "en" : "dis", (int32_t)dev->period);
break; break;
case 6: case 6:
@@ -483,7 +488,6 @@ ms_write(uint16_t port, uint8_t val, void *priv)
break; break;
case INP_PORT_SIGNATURE: case INP_PORT_SIGNATURE:
case INP_PORT_CONFIG:
ERRLOG("MOUSE: WRITE %02x to port %04x\n", val, port); ERRLOG("MOUSE: WRITE %02x to port %04x\n", val, port);
break; break;
} }
@@ -502,6 +506,7 @@ bm_poll(int x, int y, int z, int b, void *priv)
/* Has its state changed? */ /* Has its state changed? */
if (!x && !y && !((b ^ dev->buttons_last) & 0x07)) { if (!x && !y && !((b ^ dev->buttons_last) & 0x07)) {
/* No, so clear the 'status changed' bits that are also in there. */
dev->buttons_last = b; dev->buttons_last = b;
return(1); return(1);
} }
@@ -529,10 +534,10 @@ bm_poll(int x, int y, int z, int b, void *priv)
dev->buttons_last = b; dev->buttons_last = b;
/* Clamp x and y to between -128 and 127 (int8_t range). */ /* Clamp x and y to between -128 and 127 (int8_t range). */
if (x > 127) x = 127; if (x > 127) x = 127;
if (x < -128) x = -128; if (x < -128) x = -128;
if (y > 127) y = 127; if (y > 127) y = 127;
if (y < -128) y = -128; if (y < -128) y = -128;
if (dev->timer_enabled) { if (dev->timer_enabled) {
/* Update delayed coordinates. */ /* Update delayed coordinates. */
@@ -541,9 +546,8 @@ bm_poll(int x, int y, int z, int b, void *priv)
} else { } else {
/* If the counters are not frozen, update them. */ /* If the counters are not frozen, update them. */
if (! (dev->flags & FLAG_HOLD)) { if (! (dev->flags & FLAG_HOLD)) {
dev->curr_x = (int8_t) x; dev->curr_x = (int8_t)x;
dev->curr_y = (int8_t) y; dev->curr_y = (int8_t)y;
dev->curr_b = dev->buttons; dev->curr_b = dev->buttons;
} }
@@ -560,43 +564,65 @@ bm_poll(int x, int y, int z, int b, void *priv)
/* /*
* The timer calls us on every tick if the mouse is in * Called at the configured period (InPort mouse) or at
* timer mode (InPort mouse is so configured, MS/Logitech * 45 times per second (MS/Logitech Bus mouse).
* Bus mouse always).
*/ */
static void static void
bm_update_data(mouse_t *dev) bm_timer(void *priv)
{ {
mouse_t *dev = (mouse_t *)priv;
int delta_x, delta_y; int delta_x, delta_y;
int xor; int xor;
/* Update the deltas and the delays. */ DBGLOG(1, "MOUSE: Timer Tick (flags=%08x)\n", dev->flags);
if (dev->delayed_dx > 127) {
delta_x = 127; /*
dev->delayed_dx -= 127; * The period is configured either via emulator settings
} else if (dev->delayed_dx < -128) { * (for MS/Logitech Bus mouse) or via software (for
delta_x = -128; * InPort mouse).
dev->delayed_dx += 128; */
} else { dev->timer += ((int64_t) dev->period) * TIMER_USEC;
delta_x = dev->delayed_dx;
dev->delayed_dx = 0; if (dev->flags & FLAG_TIMER_INT) {
picint(1 << dev->irq);
DBGLOG(1, "MOUSE: Timer Interrupt fired\n");
} }
if (dev->delayed_dy > 127) { /*
delta_y = 127; * Update the counters and deltas if the mouse is in timed mode.
dev->delayed_dy -= 127; *
} else if (dev->delayed_dy < -128) { * If the counters are not frozen, update them.
delta_y = -128; */
dev->delayed_dy += 128;
} else {
delta_y = dev->delayed_dy;
dev->delayed_dy = 0;
}
/* If the counters are not frozen, update them. */
if (! (dev->flags & FLAG_HOLD)) { if (! (dev->flags & FLAG_HOLD)) {
dev->curr_x = (uint8_t) delta_x; /* Grab as much 'delta data' as the guest will take (int8_t max.) */
dev->curr_y = (uint8_t) delta_y; if (dev->delayed_dx > 127) {
delta_x = 127;
dev->delayed_dx -= 127;
} else if (dev->delayed_dx < -128) {
delta_x = -128;
dev->delayed_dx += 128;
} else {
delta_x = dev->delayed_dx;
dev->delayed_dx = 0;
}
if (dev->delayed_dy > 127) {
delta_y = 127;
dev->delayed_dy -= 127;
} else if (dev->delayed_dy < -128) {
delta_y = -128;
dev->delayed_dy += 128;
} else {
delta_y = dev->delayed_dy;
dev->delayed_dy = 0;
}
/* Make this chunk of data available to the guest. */
dev->curr_x = (int8_t)delta_x;
dev->curr_y = (int8_t)delta_y;
} else {
/* Frozen, so, no deltas to give. */
delta_x = delta_y = 0;
} }
if (dev->flags & FLAG_INPORT) { if (dev->flags & FLAG_INPORT) {
@@ -619,33 +645,6 @@ bm_update_data(mouse_t *dev)
} }
/*
* Called at the configured period (InPort mouse) or at
* 45 times per second (MS/Logitech Bus mouse).
*/
static void
bm_timer(void *priv)
{
mouse_t *dev = (mouse_t *)priv;
DBGLOG(1, "MOUSE: Timer Tick (flags=%08x)\n", dev->flags);
/*
* The period is configured either via emulator settings
* (for MS/Logitech Bus mouse) or via software (for
* InPort mouse).
*/
dev->timer += ((int64_t) dev->period) * TIMER_USEC;
if (dev->flags & FLAG_TIMER_INT) {
picint(1 << dev->irq);
DBGLOG(1, "MOUSE: Timer Interrupt fired\n");
}
bm_update_data(dev);
}
/* Release all resources held by the device. */ /* Release all resources held by the device. */
static void static void
bm_close(void *priv) bm_close(void *priv)
@@ -670,7 +669,6 @@ bm_init(const device_t *info, UNUSED(void *parent))
switch(info->local) { switch(info->local) {
case 0: /* original Logitech controller */ case 0: /* original Logitech controller */
dev->flags = 0;
dev->base = device_get_config_hex16("base"); dev->base = device_get_config_hex16("base");
dev->irq = device_get_config_int("irq"); dev->irq = device_get_config_int("irq");
break; break;
@@ -721,7 +719,7 @@ bm_init(const device_t *info, UNUSED(void *parent))
dev->timer = 0LL; dev->timer = 0LL;
dev->timer_enabled = 0LL; dev->timer_enabled = 0LL;
io_sethandler(dev->base, 4, io_sethandler(dev->base, 3,
ms_read,NULL,NULL, ms_write,NULL,NULL, dev); ms_read,NULL,NULL, ms_write,NULL,NULL, dev);
} else { } else {
dev->ctrl = 0x0f; /* the control port value */ dev->ctrl = 0x0f; /* the control port value */
@@ -735,7 +733,8 @@ bm_init(const device_t *info, UNUSED(void *parent))
dev->timer = ((int64_t) dev->period) * TIMER_USEC; dev->timer = ((int64_t) dev->period) * TIMER_USEC;
dev->timer_enabled = 1LL; dev->timer_enabled = 1LL;
} } else
dev->flags |= FLAG_DATA_INT;
io_sethandler(dev->base, 4, io_sethandler(dev->base, 4,
lt_read,NULL,NULL, lt_write,NULL,NULL, dev); lt_read,NULL,NULL, lt_write,NULL,NULL, dev);
@@ -752,19 +751,19 @@ bm_init(const device_t *info, UNUSED(void *parent))
static const device_config_t lt_config[] = { static const device_config_t lt_config[] = {
{ {
"base", "Address", CONFIG_HEX16, "", 0x23c, "base", "Address", CONFIG_HEX16, "", 0x023c,
{ {
{ {
"230H", 0x230 "230H", 0x0230
}, },
{ {
"234H", 0x234 "234H", 0x0234
}, },
{ {
"238H", 0x238 "238H", 0x0238
}, },
{ {
"23CH", 0x23c "23CH", 0x023c
}, },
{ {
NULL NULL
@@ -772,7 +771,8 @@ static const device_config_t lt_config[] = {
} }
}, },
{ {
"irq", "IRQ", CONFIG_SELECTION, "", 5, { "irq", "IRQ", CONFIG_SELECTION, "", 5,
{
{ {
"IRQ 2", 2 "IRQ 2", 2
}, },
@@ -791,7 +791,8 @@ static const device_config_t lt_config[] = {
} }
}, },
{ {
"hz", "Hz", CONFIG_SELECTION, "", 45, { "hz", "Hz", CONFIG_SELECTION, "", 45,
{
{ {
"Original Mode", 0 "Original Mode", 0
}, },
@@ -810,7 +811,8 @@ static const device_config_t lt_config[] = {
} }
}, },
{ {
"buttons", "Buttons", CONFIG_SELECTION, "", 2, { "buttons", "Buttons", CONFIG_SELECTION, "", 2,
{
{ {
"Two", 2 "Two", 2
}, },
@@ -830,19 +832,19 @@ static const device_config_t lt_config[] = {
static const device_config_t ms_config[] = { static const device_config_t ms_config[] = {
{ {
"base", "Address", CONFIG_HEX16, "", 0x23c, "base", "Address", CONFIG_HEX16, "", 0x023c,
{ {
{ {
"230H", 0x230 "230H", 0x0230
}, },
{ {
"234H", 0x234 "234H", 0x0234
}, },
{ {
"238H", 0x238 "238H", 0x0238
}, },
{ {
"23CH", 0x23c "23CH", 0x023c
}, },
{ {
NULL NULL
@@ -850,7 +852,8 @@ static const device_config_t ms_config[] = {
} }
}, },
{ {
"irq", "IRQ", CONFIG_SELECTION, "", 5, { "irq", "IRQ", CONFIG_SELECTION, "", 5,
{
{ {
"IRQ 2", 2 "IRQ 2", 2
}, },
@@ -869,7 +872,8 @@ static const device_config_t ms_config[] = {
} }
}, },
{ {
"buttons", "Buttons", CONFIG_SELECTION, "", 2, { "buttons", "Buttons", CONFIG_SELECTION, "", 2,
{
{ {
"Two", 2 "Two", 2
}, },
@@ -922,7 +926,7 @@ const device_t mouse_msinport_device = {
const device_t mouse_msinport_onboard_device = { const device_t mouse_msinport_onboard_device = {
"Microsoft InPort Mouse (Internal)", "Microsoft InPort Mouse (Internal)",
DEVICE_ISA, 0,
11, 11,
NULL, NULL,
bm_init, bm_close, NULL, bm_init, bm_close, NULL,

View File

@@ -8,7 +8,7 @@
* *
* Main emulator module where most things are controlled. * Main emulator module where most things are controlled.
* *
* Version: @(#)pc.c 1.0.75 2019/05/05 * Version: @(#)pc.c 1.0.76 2019/05/09
* *
* Authors: Fred N. van Kempen, <decwiz@yahoo.com> * Authors: Fred N. van Kempen, <decwiz@yahoo.com>
* Miran Grca, <mgrca8@gmail.com> * Miran Grca, <mgrca8@gmail.com>
@@ -676,7 +676,6 @@ usage:
* clear all the global configuration data now. * clear all the global configuration data now.
*/ */
config_init(&config); config_init(&config);
mouse_init();
hdd_init(); hdd_init();
cdrom_global_init(); cdrom_global_init();
zip_global_init(); zip_global_init();