Mouse cleanups. Serial unmodified, but working on DOS,WfW,Win2000,XP for serial mice.

This commit is contained in:
waltje
2017-08-03 14:07:03 -04:00
parent 853ab999b7
commit 374943f4f5
13 changed files with 199 additions and 390 deletions

View File

@@ -8,7 +8,7 @@
#
# Modified Makefile for Win32 (MinGW32) environment.
#
# Version: @(#)Makefile.mingw 1.0.31 2017/06/19
# Version: @(#)Makefile.mingw 1.0.32 2017/07/27
#
# Authors: Miran Grca, <mgrca8@gmail.com>
# Fred N. van Kempen, <decwiz@yahoo.com>
@@ -455,7 +455,7 @@ mfm_at.o: ibm.h device.h hdd_image.h io.h pic.h timer.h mfm_at.h
mfm_xebec.o: ibm.h device.h dma.h hdd_image.h io.h mem.h pic.h rom.h timer.h mfm_xebec.h
model.o: ibm.h io.h mem.h rom.h device.h model.h cpu/cpu.h \
mouse.h mouse_ps2.h cdrom.h disc.h dma.h fdc.h \
mouse.h cdrom.h disc.h dma.h fdc.h \
fdc37c665.h fdc37c669.h fdc37c932fr.h \
gameport.h i82335.h ide.h intel.h intel_flash.h \
keyboard_amstrad.h keyboard_at.h keyboard_olim24.h \
@@ -466,14 +466,13 @@ model.o: ibm.h io.h mem.h rom.h device.h model.h cpu/cpu.h \
video/vid_pcjr.h video/vid_tandy.h w83877f.h wd76c10.h \
xtide.h bugger.h
mouse.o: ibm.h cpu/cpu.h device.h model.h \
mouse.h mouse_serial.h mouse_ps2.h mouse_bus.h keyboard_olim24.h
mouse.o: ibm.h cpu/cpu.h device.h model.h mouse.h keyboard_olim24.h
mouse_bus.o: ibm.h io.h pic.h mouse.h mouse_bus.h plat_mouse.h
mouse_bus.o: ibm.h io.h pic.h mouse.h
mouse_ps2.o: ibm.h keyboard_at.h mouse.h mouse_ps2.h plat_mouse.h
mouse_ps2.o: ibm.h keyboard_at.h mouse.h plat_mouse.h
mouse_serial.o: ibm.h timer.h serial.h mouse.h mouse_serial.h
mouse_serial.o: ibm.h timer.h serial.h mouse.h
neat.o: ibm.h cpu/cpu.h io.h device.h model.h

View File

@@ -8,7 +8,7 @@
*
* Handling of the emulated machines.
*
* Version: @(#)model.c 1.0.4 2017/06/21
* Version: @(#)model.c 1.0.5 2017/07/27
*
* Authors: Sarah Walker, <http://pcem-emulator.co.uk/>
* Miran Grca, <mgrca8@gmail.com>
@@ -26,7 +26,6 @@
#include "device.h"
#include "model.h"
#include "mouse.h"
#include "mouse_ps2.h"
#include "cdrom.h"
#include "disc.h"

View File

@@ -8,7 +8,7 @@
*
* Common driver module for MOUSE devices.
*
* Version: @(#)mouse.c 1.0.4 2017/07/24
* Version: @(#)mouse.c 1.0.5 2017/07/27
*
* Authors: Sarah Walker, <http://pcem-emulator.co.uk/>
* Miran Grca, <mgrca8@gmail.com>
@@ -21,9 +21,6 @@
#include "cpu/cpu.h"
#include "device.h"
#include "mouse.h"
#include "mouse_serial.h"
#include "mouse_ps2.h"
#include "mouse_bus.h"
#include "model.h"
@@ -36,18 +33,18 @@ static mouse_t mouse_none = {
static mouse_t *mouse_list[] = {
&mouse_none,
&mouse_bus, /* 1 Microsoft/Logitech Bus Mouse 2-button */
&mouse_inport, /* 2 Microsoft InPort Mouse */
&mouse_msystems, /* 3 Mouse Systems */
&mouse_bus_logitech, /* 1 Logitech Bus Mouse 2-button */
&mouse_bus_msinport, /* 2 Microsoft InPort Mouse */
&mouse_serial_msystems, /* 3 Mouse Systems Serial Mouse */
&mouse_serial_microsoft, /* 4 Microsoft Serial Mouse */
&mouse_serial_logitech, /* 5 Logitech 3-button Serial Mouse */
&mouse_serial_mswheel, /* 6 Microsoft Serial Wheel Mouse */
&mouse_ps2_2_button, /* 7 PS/2 Mouse 2-button */
&mouse_intellimouse, /* 8 PS/2 Intellimouse 3-button */
&mouse_ps2_2button, /* 7 PS/2 Mouse 2-button */
&mouse_ps2_intellimouse, /* 8 PS/2 Intellimouse 3-button */
&mouse_amstrad, /* 9 Amstrad PC System Mouse */
&mouse_olim24, /* 10 Olivetti M24 System Mouse */
#if 0
&mouse_genius, /* 11 Genius Bus Mouse */
&mouse_bus_genius, /* 11 Genius Bus Mouse */
#endif
NULL
};

View File

@@ -8,7 +8,7 @@
*
* Definitions for the MOUSE driver.
*
* Version: @(#)mouse.h 1.0.3 2017/06/21
* Version: @(#)mouse.h 1.0.4 2017/07/27
*
* Authors: Sarah Walker, <http://pcem-emulator.co.uk/>
* Miran Grca, <mgrca8@gmail.com>
@@ -20,20 +20,22 @@
# define EMU_MOUSE_H
#define MOUSE_TYPE_NONE 0
#if 0
#define MOUSE_TYPE_GENIUS 11 /* Genius Bus Mouse */
#endif
#define MOUSE_TYPE_BUS 1 /* Logitech/ATI Bus Mouse */
#define MOUSE_TYPE_INPORT 2 /* Microsoft InPort Mouse */
#define MOUSE_TYPE_MSYSTEMS 3 /* Mouse Systems mouse */
#define MOUSE_TYPE_SERIAL 4 /* Serial Mouse */
#define MOUSE_TYPE_LOGITECH 5 /* Logitech Serial Mouse */
#define MOUSE_TYPE_MSWHEEL 6 /* Serial Wheel Mouse */
#define MOUSE_TYPE_PS2 7 /* IBM PS/2 series Bus Mouse */
#define MOUSE_TYPE_PS2_MS 8 /* Microsoft Intellimouse PS/2 */
#define MOUSE_TYPE_AMSTRAD 9 /* Amstrad PC system mouse */
#define SERMOUSE_PORT 1 /* attach to Serial1 */
#define MOUSE_TYPE_NONE 0
#define MOUSE_TYPE_LOGIBUS 1 /* Logitech/ATI Bus Mouse */
#define MOUSE_TYPE_INPORT 2 /* Microsoft InPort Mouse */
#define MOUSE_TYPE_MSYSTEMS 3 /* Mouse Systems mouse */
#define MOUSE_TYPE_MICROSOFT 4 /* Microsoft Serial Mouse */
#define MOUSE_TYPE_LOGITECH 5 /* Logitech Serial Mouse */
#define MOUSE_TYPE_MSWHEEL 6 /* Serial Wheel Mouse */
#define MOUSE_TYPE_PS2 7 /* IBM PS/2 series Bus Mouse */
#define MOUSE_TYPE_PS2_MS 8 /* Microsoft Intellimouse PS/2 */
#define MOUSE_TYPE_AMSTRAD 9 /* Amstrad PC system mouse */
#define MOUSE_TYPE_OLIM24 10 /* Olivetti M24 system mouse */
#if 0
# define MOUSE_TYPE_GENIUS 11 /* Genius Bus Mouse */
#endif
#define MOUSE_TYPE_MASK 0x0f
#define MOUSE_TYPE_3BUTTON (1<<7) /* device has 3+ buttons */
@@ -51,9 +53,21 @@ typedef struct {
extern int mouse_type;
extern mouse_t mouse_bus_logitech;
extern mouse_t mouse_bus_msinport;
extern mouse_t mouse_serial_msystems;
extern mouse_t mouse_serial_microsoft;
extern mouse_t mouse_serial_logitech;
extern mouse_t mouse_serial_mswheel;
extern mouse_t mouse_ps2_2button;
extern mouse_t mouse_ps2_intellimouse;
extern void *mouse_ps2_init(void);
extern void mouse_emu_init(void);
extern void mouse_emu_close(void);
extern void mouse_poll(int x, int y, int z, int b);
extern char *mouse_get_name(int mouse);
extern char *mouse_get_internal_name(int mouse);

View File

@@ -32,7 +32,7 @@
* Based on an early driver for MINIX 1.5.
* Based on the 86Box PS/2 mouse driver as a framework.
*
* Version: @(#)mouse_bus.c 1.0.6 2017/07/24
* Version: @(#)mouse_bus.c 1.0.7 2017/07/27
*
* Author: Fred N. van Kempen, <decwiz@yahoo.com>
* TheCollector1995,
@@ -45,13 +45,12 @@
#include "pic.h"
#include "timer.h"
#include "mouse.h"
#include "mouse_bus.h"
#include "plat_mouse.h"
#define BUS_MOUSE_IRQ 5
#define IRQ_MASK ((1<<5) >> BUS_MOUSE_IRQ)
// MS Inport Bus Mouse Adapter
/* MS Inport Bus Mouse Adapter. */
#define INP_PORT_CONTROL 0x023C
#define INP_PORT_DATA 0x023D
#define INP_PORT_SIGNATURE 0x023E
@@ -67,7 +66,7 @@
#define INP_HOLD_COUNTER (1 << 5)
#define INP_ENABLE_IRQ (1 << 0)
// MS/Logictech Standard Bus Mouse Adapter
/* MS/Logictech Standard Bus Mouse Adapter. */
#define BUSM_PORT_DATA 0x023C
#define BUSM_PORT_SIGNATURE 0x023D
#define BUSM_PORT_CONTROL 0x023E
@@ -462,17 +461,17 @@ static void *inport_init(void)
return(inport);
}
mouse_t mouse_bus =
mouse_t mouse_bus_logitech =
{
"Bus Mouse",
"Logitech Bus Mouse",
"msbus",
MOUSE_TYPE_BUS,
MOUSE_TYPE_LOGIBUS,
busmouse_init,
busmouse_close,
busmouse_poll
};
mouse_t mouse_inport =
mouse_t mouse_bus_msinport =
{
"InPort Mouse",
"inport",

View File

@@ -1,30 +0,0 @@
/*
* 86Box A hypervisor and IBM PC system emulator that specializes in
* running old operating systems and software designed for IBM
* PC systems and compatibles from 1981 through fairly recent
* system designs based on the PCI bus.
*
* This file is part of the 86Box distribution.
*
* Implementation of Bus Mouse devices.
*
* These mice devices were made by both Microsoft (InPort) and
* Logitech. Sadly, they did not use the same I/O protocol, but
* they were close enough to fit into a single implementation.
*
* Definitions for the Bus Mouse driver.
*
* Version: @(#)mouse_bus.h 1.0.3 2017/04/22
*
* Author: Fred N. van Kempen, <decwiz@yahoo.com>
* Copyright 1989-2017 Fred N. van Kempen.
*/
#ifndef MOUSE_BUS_H
# define MOUSE_BUS_H
extern mouse_t mouse_bus;
extern mouse_t mouse_inport;
#endif /*MOUSE_BUS_H*/

View File

@@ -2,7 +2,6 @@
#include "ibm.h"
#include "keyboard_at.h"
#include "mouse.h"
#include "mouse_ps2.h"
#include "plat_mouse.h"
@@ -238,16 +237,18 @@ void mouse_ps2_close(void *p)
free(mouse);
}
mouse_t mouse_ps2_2_button =
mouse_t mouse_ps2_2button =
{
"2-button mouse (PS/2)",
"Standard 2-button mouse (PS/2)",
"ps2",
MOUSE_TYPE_PS2,
mouse_ps2_init,
mouse_ps2_close,
mouse_ps2_poll
};
mouse_t mouse_intellimouse =
mouse_t mouse_ps2_intellimouse =
{
"Microsoft Intellimouse (PS/2)",
"intellimouse",

View File

@@ -1,4 +0,0 @@
extern mouse_t mouse_ps2_2_button;
extern mouse_t mouse_intellimouse;
extern void *mouse_ps2_init();

View File

@@ -10,7 +10,7 @@
*
* Based on the 86Box Serial Mouse driver as a framework.
*
* Version: @(#)mouse_serial.c 1.0.6 2017/06/19
* Version: @(#)mouse_serial.c 1.0.7 2017/07/27
*
* Author: Fred N. van Kempen, <decwiz@yahoo.com>
*/
@@ -19,13 +19,6 @@
#include "timer.h"
#include "serial.h"
#include "mouse.h"
#include "mouse_serial.h"
#ifdef WALTJE
#define SERMOUSE_TYPE_MSYSTEMS 1 /* Mouse Systems */
#define SERMOUSE_TYPE_MICROSOFT 2 /* Microsoft */
#define SERMOUSE_TYPE_LOGITECH 3 /* Logitech */
typedef struct mouse_serial_t {
@@ -40,7 +33,11 @@ typedef struct mouse_serial_t {
/* Callback from serial driver: RTS was toggled. */
static void
#ifdef WALTJE
sermouse_callback(void *priv)
#else
sermouse_callback(struct SERIAL *serial, void *priv)
#endif
{
mouse_serial_t *ms = (mouse_serial_t *)priv;
@@ -58,20 +55,49 @@ sermouse_timer(void *priv)
ms->delay = 0;
switch(ms->type) {
case SERMOUSE_TYPE_MICROSOFT:
/* This identifies a two-button Microsoft Serial mouse. */
serial_write_fifo(ms->serial, 'M', 1);
if (ms->pos != -1) return;
ms->pos = 0;
switch(ms->type & MOUSE_TYPE_MASK) {
case MOUSE_TYPE_MSYSTEMS:
/* Identifies Mouse Systems serial mouse. */
#ifdef WALTJE
serial_write_fifo(ms->serial, 'H', 1);
#else
serial_write_fifo(ms->serial, 'H');
#endif
break;
case SERMOUSE_TYPE_LOGITECH:
/* This identifies a two-button Logitech Serial mouse. */
case MOUSE_TYPE_MICROSOFT:
default:
/* Identifies a two-button Microsoft Serial mouse. */
#ifdef WALTJE
serial_write_fifo(ms->serial, 'M', 1);
#else
serial_write_fifo(ms->serial, 'M');
#endif
break;
case MOUSE_TYPE_LOGITECH:
/* Identifies a two-button Logitech Serial mouse. */
#ifdef WALTJE
serial_write_fifo(ms->serial, 'M', 1);
serial_write_fifo(ms->serial, '3', 1);
#else
serial_write_fifo(ms->serial, 'M');
serial_write_fifo(ms->serial, '3');
#endif
break;
default:
/* No action needed. */
case MOUSE_TYPE_MSWHEEL:
/* Identifies multi-button Microsoft Wheel Mouse. */
#ifdef WALTJE
serial_write_fifo(ms->serial, 'M', 1);
serial_write_fifo(ms->serial, 'Z', 1);
#else
serial_write_fifo(ms->serial, 'M');
serial_write_fifo(ms->serial, 'Z');
#endif
break;
}
}
@@ -88,7 +114,7 @@ sermouse_poll(int x, int y, int z, int b, void *priv)
ms->oldb = b;
if (ms->type == SERMOUSE_TYPE_MSYSTEMS) y = -y;
if (ms->type == MOUSE_TYPE_MSYSTEMS) y = -y;
if (x>127) x = 127;
if (y>127) y = 127;
@@ -96,8 +122,8 @@ sermouse_poll(int x, int y, int z, int b, void *priv)
if (y<-128) y = -128;
len = 0;
switch(ms->type) {
case SERMOUSE_TYPE_MSYSTEMS:
switch(ms->type & MOUSE_TYPE_MASK) {
case MOUSE_TYPE_MSYSTEMS:
buff[0] = 0x80;
buff[0] |= (b&0x01) ? 0x00 : 0x04; /* left button */
buff[0] |= (b&0x02) ? 0x00 : 0x01; /* middle button */
@@ -109,10 +135,10 @@ sermouse_poll(int x, int y, int z, int b, void *priv)
len = 5;
break;
case SERMOUSE_TYPE_MICROSOFT:
case MOUSE_TYPE_MICROSOFT:
buff[0] = 0x40;
buff[0] |= (((y>>6)&03)<<2);
buff[0] |= ((x>>6)&03);
buff[0] |= (((y>>6)&0x03)<<2);
buff[0] |= ((x>>6)&0x03);
if (b&0x01) buff[0] |= 0x20;
if (b&0x02) buff[0] |= 0x10;
buff[1] = x & 0x3F;
@@ -120,21 +146,34 @@ sermouse_poll(int x, int y, int z, int b, void *priv)
len = 3;
break;
case SERMOUSE_TYPE_LOGITECH:
case MOUSE_TYPE_LOGITECH:
buff[0] = 0x40;
buff[0] |= (((y>>6)&03)<<2);
buff[0] |= ((x>>6)&03);
buff[0] |= (((y>>6)&0x03)<<2);
buff[0] |= ((x>>6)&0x03);
if (b&0x01) buff[0] |= 0x20;
if (b&0x02) buff[0] |= 0x10;
buff[1] = x & 0x3F;
buff[2] = y & 0x3F;
len = 3;
if (b&0x04) {
buff[3] = 0x20;
len = 4;
} else {
len = 3;
len++;
}
break;
case MOUSE_TYPE_MSWHEEL:
buff[0] = 0x40;
buff[0] |= (((y>>6)&0x03)<<2);
buff[0] |= ((x>>6)&0x03);
if (b&0x01) buff[0] |= 0x20;
if (b&0x02) buff[0] |= 0x10;
buff[1] = x & 0x3F;
buff[2] = y & 0x3F;
buff[3] = z & 0x0F;
if (b&0x04)
buff[3] |= 0x10;
len = 4;
}
#if 0
@@ -145,7 +184,11 @@ sermouse_poll(int x, int y, int z, int b, void *priv)
/* Send the packet to the bottom-half of the attached port. */
for (b=0; b<len; b++)
#ifdef WALTJE
serial_write_fifo(ms->serial, buff[b], 1);
#else
serial_write_fifo(ms->serial, buff[b]);
#endif
return(0);
}
@@ -157,7 +200,11 @@ sermouse_close(void *priv)
mouse_serial_t *ms = (mouse_serial_t *)priv;
/* Detach serial port from the mouse. */
#ifdef WALTJE
serial_attach(ms->port, NULL, NULL);
#else
serial1.rcr_callback = NULL;
#endif
free(ms);
}
@@ -172,7 +219,12 @@ sermouse_init(int type)
ms->type = type;
/* Attach a serial port to the mouse. */
#ifdef WALTJE
ms->serial = serial_attach(ms->port, sermouse_callback, ms);
#else
ms->serial = &serial1;
ms->serial->rcr_callback = sermouse_callback;
#endif
timer_add(sermouse_timer, &ms->delay, &ms->delay, ms);
@@ -180,31 +232,38 @@ sermouse_init(int type)
}
static void *
sermouse_init_msystems(void)
{
return(sermouse_init(MOUSE_TYPE_MSYSTEMS));
}
static void *
sermouse_init_microsoft(void)
{
return(sermouse_init(SERMOUSE_TYPE_MICROSOFT));
return(sermouse_init(MOUSE_TYPE_MICROSOFT));
}
static void *
sermouse_init_logitech(void)
{
return(sermouse_init(SERMOUSE_TYPE_LOGITECH));
return(sermouse_init(MOUSE_TYPE_LOGITECH));
}
static void *
sermouse_init_msystems(void)
sermouse_init_mswheel(void)
{
return(sermouse_init(SERMOUSE_TYPE_MSYSTEMS));
return(sermouse_init(MOUSE_TYPE_MSWHEEL));
}
mouse_t mouse_msystems = {
mouse_t mouse_serial_msystems = {
"Mouse Systems Mouse (serial)",
"mssystems",
MOUSE_TYPE_MSYSTEMS,
MOUSE_TYPE_MSYSTEMS | MOUSE_TYPE_3BUTTON,
sermouse_init_msystems,
sermouse_close,
sermouse_poll
@@ -214,7 +273,7 @@ mouse_t mouse_msystems = {
mouse_t mouse_serial_microsoft = {
"Microsoft 2-button mouse (serial)",
"msserial",
MOUSE_TYPE_SERIAL,
MOUSE_TYPE_MICROSOFT,
sermouse_init_microsoft,
sermouse_close,
sermouse_poll
@@ -224,232 +283,18 @@ mouse_t mouse_serial_microsoft = {
mouse_t mouse_serial_logitech = {
"Logitech 3-button mouse (serial)",
"lserial",
MOUSE_TYPE_SERIAL | MOUSE_TYPE_3BUTTON,
MOUSE_TYPE_LOGITECH | MOUSE_TYPE_3BUTTON,
sermouse_init_logitech,
sermouse_close,
sermouse_poll
};
#else
typedef struct mouse_serial_t
{
int mousepos, mousedelay;
int oldb;
int type;
SERIAL *serial;
} mouse_serial_t;
uint8_t mouse_serial_poll(int x, int y, int z, int b, void *p)
{
mouse_serial_t *mouse = (mouse_serial_t *)p;
SERIAL *serial = mouse->serial;
uint8_t mousedat[4];
if (!(serial->ier & 1))
return 0xff;
if (!x && !y && b == mouse->oldb)
return 0xff;
mouse->oldb = b;
if (x>127) x=127;
if (y>127) y=127;
if (x<-128) x=-128;
if (y<-128) y=-128;
/*Use Microsoft format*/
mousedat[0]=0x40;
mousedat[0]|=(((y>>6)&3)<<2);
mousedat[0]|=((x>>6)&3);
if (b&1) mousedat[0]|=0x20;
if (b&2) mousedat[0]|=0x10;
mousedat[1]=x&0x3F;
mousedat[2]=y&0x3F;
if (!(serial->mctrl & 0x10))
{
serial_write_fifo(mouse->serial, mousedat[0]);
serial_write_fifo(mouse->serial, mousedat[1]);
serial_write_fifo(mouse->serial, mousedat[2]);
if (mouse->type == 2)
{
if (b&0x04)
{
serial_write_fifo(mouse->serial, 0x20);
}
}
else if (mouse->type == 3)
{
mousedat[3] = z & 0xf;
if (b&4) mousedat[3] |= 0x10;
serial_write_fifo(mouse->serial, mousedat[3]);
}
}
return 0;
}
uint8_t mouse_serial_msystems_poll(int x, int y, int z, int b, void *p)
{
mouse_serial_t *mouse = (mouse_serial_t *)p;
SERIAL *serial = mouse->serial;
uint8_t mousedat[5];
if (!x && !y && b == mouse->oldb)
return 0xff;
y = -y;
mouse->oldb = b;
if (x>127) x=127;
if (y>127) y=127;
if (x<-128) x=-128;
if (y<-128) y=-128;
/*Use Mouse Systems format*/
mousedat[0] = 0x80;
mousedat[0] |= (b&0x01) ? 0x00 : 0x04; /* left button */
mousedat[0] |= (b&0x02) ? 0x00 : 0x01; /* middle button */
mousedat[0] |= (b&0x04) ? 0x00 : 0x02; /* right button */
mousedat[1] = x;
mousedat[2] = y;
mousedat[3] = x; /* same as byte 1 */
mousedat[4] = y; /* same as byte 2 */
if (!(serial->mctrl & 0x10))
{
serial_write_fifo(mouse->serial, mousedat[0]);
serial_write_fifo(mouse->serial, mousedat[1]);
serial_write_fifo(mouse->serial, mousedat[2]);
serial_write_fifo(mouse->serial, mousedat[3]);
serial_write_fifo(mouse->serial, mousedat[4]);
}
return 0;
}
void mouse_serial_rcr(struct SERIAL *serial, void *p)
{
mouse_serial_t *mouse = (mouse_serial_t *)p;
mouse->mousepos = -1;
mouse->mousedelay = 5000 * (1 << TIMER_SHIFT);
}
void mousecallback(void *p)
{
mouse_serial_t *mouse = (mouse_serial_t *)p;
mouse->mousedelay = 0;
if (mouse->mousepos == -1)
{
mouse->mousepos = 0;
switch(mouse->type)
{
case 0:
serial_write_fifo(mouse->serial, 'H');
break;
case 1:
default:
serial_write_fifo(mouse->serial, 'M');
break;
case 2:
serial_write_fifo(mouse->serial, 'M');
serial_write_fifo(mouse->serial, '3');
break;
case 3:
serial_write_fifo(mouse->serial, 'M');
serial_write_fifo(mouse->serial, 'Z');
break;
}
}
}
void *mouse_serial_common_init(int type)
{
mouse_serial_t *mouse = (mouse_serial_t *)malloc(sizeof(mouse_serial_t));
memset(mouse, 0, sizeof(mouse_serial_t));
mouse->serial = &serial1;
serial1.rcr_callback = mouse_serial_rcr;
serial1.rcr_callback_p = mouse;
timer_add(mousecallback, &mouse->mousedelay, &mouse->mousedelay, mouse);
mouse->type = type;
return mouse;
}
void *mouse_serial_msystems_init()
{
return mouse_serial_common_init(0);
}
void *mouse_serial_init()
{
return mouse_serial_common_init(1);
}
void *mouse_serial_logitech_init()
{
return mouse_serial_common_init(2);
}
void *mouse_serial_mswheel_init()
{
return mouse_serial_common_init(3);
}
void mouse_serial_close(void *p)
{
mouse_serial_t *mouse = (mouse_serial_t *)p;
free(mouse);
serial1.rcr_callback = NULL;
}
mouse_t mouse_msystems =
{
"Mouse Systems Mouse (serial)",
"mssystems",
MOUSE_TYPE_MSYSTEMS | MOUSE_TYPE_3BUTTON,
mouse_serial_msystems_init,
mouse_serial_close,
mouse_serial_msystems_poll
mouse_t mouse_serial_mswheel = {
"Microsoft wheel mouse (serial)",
"mswheel",
MOUSE_TYPE_MSWHEEL | MOUSE_TYPE_3BUTTON,
sermouse_init_mswheel,
sermouse_close,
sermouse_poll
};
mouse_t mouse_serial_microsoft =
{
"Microsoft 2-button mouse (serial)",
"msserial",
MOUSE_TYPE_SERIAL,
mouse_serial_init,
mouse_serial_close,
mouse_serial_poll
};
mouse_t mouse_serial_logitech =
{
"Logitech 3-button mouse (serial)",
"lserial",
MOUSE_TYPE_LOGITECH | MOUSE_TYPE_3BUTTON,
mouse_serial_logitech_init,
mouse_serial_close,
mouse_serial_poll
};
mouse_t mouse_serial_mswheel =
{
"Microsoft wheel mouse (serial)",
"mssystems",
MOUSE_TYPE_MSWHEEL | MOUSE_TYPE_3BUTTON,
mouse_serial_mswheel_init,
mouse_serial_close,
mouse_serial_poll
};
#endif

View File

@@ -1,30 +0,0 @@
/*
* 86Box A hypervisor and IBM PC system emulator that specializes in
* running old operating systems and software designed for IBM
* PC systems and compatibles from 1981 through fairly recent
* system designs based on the PCI bus.
*
* This file is part of the 86Box distribution.
*
* Implementation of Serial Mouse devices.
*
* Definitions for the Serial Mouse driver.
*
* Version: @(#)mouse_serial.h 1.0.3 2017/06/19
*
* Author: Fred N. van Kempen, <decwiz@yahoo.com>
*/
#ifndef MOUSE_SERIAL_H
# define MOUSE_SERIAL_H
#define SERMOUSE_PORT 1 /* attach to Serial1 */
extern mouse_t mouse_msystems;
extern mouse_t mouse_serial_microsoft;
extern mouse_t mouse_serial_logitech;
extern mouse_t mouse_serial_mswheel;
#endif /*MOUSE_SERIAL_H*/

View File

@@ -5,7 +5,11 @@
#define SCSI_H
#ifdef WALTJE
#define SCSI_TIME (50 * (1 << TIMER_SHIFT))
#else
#define SCSI_TIME (5 * 100 * (1 << TIMER_SHIFT))
#endif
/* SCSI commands. */

View File

@@ -39,6 +39,9 @@
#include "scsi_aha154x.h"
#define SCSI_DELAY_TM 1 /* was 50 */
#define AHA AHA154xCF /* set desired card type */
#define AHA154xB 1 /* AHA-154x Rev.B */
#define AHA154xC 2 /* AHA-154x Rev.C */
@@ -419,8 +422,9 @@ again:
aha_eep[0] |= (0x10 | 0x20 | 0x40);
aha_eep[1] = irq-9; /* IRQ15 */
aha_eep[1] |= (dma<<4); /* DMA6 */
aha_eep[2] = (EE2_DYNSCAN | /* BIOS Space Reserved */
EE2_EXT1G | EE2_RMVOK); /* Immediate return on seek */
aha_eep[2] = (EE2_HABIOS | /* BIOS enabled */
EE2_DYNSCAN | /* scan bus */
EE2_EXT1G | EE2_RMVOK);/* Immediate return on seek */
aha_eep[3] = SPEED_50; /* speed 5.0 MB/s */
aha_eep[6] = (EE6_TERM | /* host term enable */
EE6_RSTBUS); /* reset SCSI bus on boot */
@@ -1371,7 +1375,7 @@ aha_write(uint16_t port, uint8_t val, void *priv)
/* If there are no mailboxes configured, don't even try to do anything. */
if (dev->MailboxCount) {
if (!AHA_Callback) {
AHA_Callback = 50 * SCSI_TIME;
AHA_Callback = SCSI_DELAY_TM * SCSI_TIME;
}
}
return;
@@ -2106,7 +2110,7 @@ aha_cmd_cb(void *priv)
if (dev->MailboxCount) {
aha_do_mail(dev);
} else {
AHA_Callback += 50 * SCSI_TIME;
AHA_Callback += SCSI_DELAY_TM * SCSI_TIME;
return;
}
} else if (AHA_InOperation == 1) {
@@ -2128,7 +2132,7 @@ aha_cmd_cb(void *priv)
fatal("Invalid BusLogic callback phase: %i\n", AHA_InOperation);
}
AHA_Callback += 50 * SCSI_TIME;
AHA_Callback += SCSI_DELAY_TM * SCSI_TIME;
}
uint8_t aha_mca_read(int port, void *p)

View File

@@ -186,8 +186,11 @@ update_ints(SERIAL *sp)
sp->iir = IID_IDMDM;
}
/* If IRQ line not enabled, done. */
if (!(sp->mctrl & MCR_OUT2) && !PCJR) return;
/* Raise or clear the level-based IRQ. */
if (stat && ((sp->mctrl & MCR_OUT2) || PCJR))
if (stat)
picintlevel(1 << sp->irq);
else
picintc(1 << sp->irq);
@@ -291,26 +294,30 @@ serial_write(uint16_t addr, uint8_t val, void *priv)
break;
case 3: /* LCR */
if ((sp->lcr & LCR_DLAB) && !(val & LCR_DLAB)) {
/* We dropped DLAB, so handle baudrate. */
baud = ((sp->dlab2<<8) | sp->dlab1);
if (baud > 0) {
speed = 115200UL/baud;
serial_log(2, "Serial%d: divisor %u, baudrate %ld\n",
sp->port, baud, speed);
if ((sp->bh != NULL) && (speed > 0))
bhtty_speed((BHTTY *)sp->bh, speed);
if (! (val & LCR_DLAB)) {
/* DLAB clear. Was it set? */
if (sp->lcr & LCR_DLAB) {
/* We dropped DLAB, so handle baudrate. */
baud = ((sp->dlab2<<8) | sp->dlab1);
if (baud > 0) {
speed = 115200UL/baud;
serial_log(2, "Serial%d: divisor %u, baudrate %ld\n",
sp->port, baud, speed);
if ((sp->bh != NULL) && (speed > 0))
bhtty_speed((BHTTY *)sp->bh, speed);
} else {
serial_log(1, "Serial%d: divisor %u invalid!\n",
sp->port, baud);
}
} else {
serial_log(1, "Serial%d: divisor %u invalid!\n",
sp->port, baud);
wl = (val & LCR_WLS) + 5; /* databits */
sb = (val & LCR_SBS) ? 2 : 1; /* stopbits */
pa = (val & (LCR_PE|LCR_EP|LCR_PS)) >> 3;
serial_log(2, "Serial%d: WL=%d SB=%d PA=%d\n", sp->port, wl, sb, pa);
if (sp->bh != NULL)
bhtty_params((BHTTY *)sp->bh, wl, pa, sb);
}
}
wl = (val & LCR_WLS) + 5; /* databits */
sb = (val & LCR_SBS) ? 2 : 1; /* stopbits */
pa = (val & (LCR_PE|LCR_EP|LCR_PS)) >> 3;
serial_log(2, "Serial%d: WL=%d SB=%d PA=%d\n", sp->port, wl, sb, pa);
if (sp->bh != NULL)
bhtty_params((BHTTY *)sp->bh, wl, pa, sb);
sp->lcr = val;
break;
@@ -338,12 +345,14 @@ serial_write(uint16_t addr, uint8_t val, void *priv)
&sp->receive_delay,
&sp->receive_delay, sp);
#if 0
/* Fake CTS, DSR and DCD (for now.) */
sp->msr = (MSR_CTS | MSR_DCTS |
MSR_DSR | MSR_DDSR |
MSR_DCD | MSR_DDCD);
sp->int_status |= SERINT_MSR;
update_ints(sp);
#endif
}
}
sp->mctrl = val;
@@ -424,7 +433,9 @@ serial_read(uint16_t addr, void *priv)
} else {
sp->lsr &= ~LSR_DR;
sp->int_status &= ~SERINT_RECEIVE;
#if 0
update_ints(sp);
#endif
ret = read_fifo(sp);
if ((sp->bh == NULL) &&
(sp->fifo_read != sp->fifo_write))