This commit is contained in:
OBattler
2022-10-29 03:36:57 +02:00
4 changed files with 147 additions and 99 deletions

View File

@@ -36,7 +36,7 @@ typedef struct {
int mode; int mode;
uint8_t flags; uint16_t flags;
uint8_t resolution; uint8_t resolution;
uint8_t sample_rate; uint8_t sample_rate;
@@ -46,11 +46,12 @@ typedef struct {
uint8_t last_data[6]; uint8_t last_data[6];
} mouse_t; } mouse_t;
#define FLAG_INTELLI 0x80 /* device is IntelliMouse */ #define FLAG_5BTN 0x100 /* using Intellimouse Optical mode */
#define FLAG_INTMODE 0x40 /* using Intellimouse mode */ #define FLAG_INTELLI 0x80 /* device is IntelliMouse */
#define FLAG_SCALED 0x20 /* enable delta scaling */ #define FLAG_INTMODE 0x40 /* using Intellimouse mode */
#define FLAG_ENABLED 0x10 /* dev is enabled for use */ #define FLAG_SCALED 0x20 /* enable delta scaling */
#define FLAG_CTRLDAT 0x08 /* ctrl or data mode */ #define FLAG_ENABLED 0x10 /* dev is enabled for use */
#define FLAG_CTRLDAT 0x08 /* ctrl or data mode */
int mouse_scan = 0; int mouse_scan = 0;
@@ -156,14 +157,24 @@ ps2_write(uint8_t val, void *priv)
keyboard_at_adddata_mouse(temp); keyboard_at_adddata_mouse(temp);
keyboard_at_adddata_mouse(dev->x & 0xff); keyboard_at_adddata_mouse(dev->x & 0xff);
keyboard_at_adddata_mouse(dev->y & 0xff); keyboard_at_adddata_mouse(dev->y & 0xff);
if (dev->flags & FLAG_INTMODE)
keyboard_at_adddata_mouse(dev->z); if (dev->flags & FLAG_INTMODE) {
int temp_z = dev->z;
if ((dev->flags & FLAG_5BTN)) {
temp_z &= 0xF;
if (mouse_buttons & 8)
temp_z |= 0x10;
if (mouse_buttons & 16)
temp_z |= 0x20;
}
keyboard_at_adddata_mouse(temp_z);
}
break; break;
case 0xf2: /* read ID */ case 0xf2: /* read ID */
keyboard_at_adddata_mouse(0xfa); keyboard_at_adddata_mouse(0xfa);
if (dev->flags & FLAG_INTMODE) if (dev->flags & FLAG_INTMODE)
keyboard_at_adddata_mouse(0x03); keyboard_at_adddata_mouse((dev->flags & FLAG_5BTN) ? 0x04 : 0x03);
else else
keyboard_at_adddata_mouse(0x00); keyboard_at_adddata_mouse(0x00);
break; break;
@@ -210,8 +221,17 @@ mouse_reset:
dev->last_data[5] = val; dev->last_data[5] = val;
if (dev->last_data[0] == 0xf3 && dev->last_data[1] == 0xc8 && dev->last_data[2] == 0xf3 && dev->last_data[3] == 0x64 && dev->last_data[4] == 0xf3 && dev->last_data[5] == 0x50) if (dev->last_data[0] == 0xf3 && dev->last_data[1] == 0xc8
&& dev->last_data[2] == 0xf3 && dev->last_data[3] == 0xc8
&& dev->last_data[4] == 0xf3 && dev->last_data[5] == 0x50
&& mouse_get_buttons() == 5) {
dev->flags |= FLAG_INTMODE | FLAG_5BTN;
}
else if (dev->last_data[0] == 0xf3 && dev->last_data[1] == 0xc8
&& dev->last_data[2] == 0xf3 && dev->last_data[3] == 0x64
&& dev->last_data[4] == 0xf3 && dev->last_data[5] == 0x50) {
dev->flags |= FLAG_INTMODE; dev->flags |= FLAG_INTMODE;
}
} }
} }
@@ -269,8 +289,17 @@ ps2_poll(int x, int y, int z, int b, void *priv)
keyboard_at_adddata_mouse(buff[0]); keyboard_at_adddata_mouse(buff[0]);
keyboard_at_adddata_mouse(buff[1]); keyboard_at_adddata_mouse(buff[1]);
keyboard_at_adddata_mouse(buff[2]); keyboard_at_adddata_mouse(buff[2]);
if (dev->flags & FLAG_INTMODE) if (dev->flags & FLAG_INTMODE) {
keyboard_at_adddata_mouse(dev->z); int temp_z = dev->z;
if ((dev->flags & FLAG_5BTN)) {
temp_z &= 0xF;
if (mouse_buttons & 8)
temp_z |= 0x10;
if (mouse_buttons & 16)
temp_z |= 0x20;
}
keyboard_at_adddata_mouse(temp_z);
}
dev->x = dev->y = dev->z = 0; dev->x = dev->y = dev->z = 0;
} }
@@ -299,13 +328,15 @@ mouse_ps2_init(const device_t *info)
if (i > 2) if (i > 2)
dev->flags |= FLAG_INTELLI; dev->flags |= FLAG_INTELLI;
if (i == 4) i = 3;
/* Hook into the general AT Keyboard driver. */ /* Hook into the general AT Keyboard driver. */
keyboard_at_set_mouse(ps2_write, dev); keyboard_at_set_mouse(ps2_write, dev);
mouse_ps2_log("%s: buttons=%d\n", dev->name, (dev->flags & FLAG_INTELLI) ? 3 : 2); mouse_ps2_log("%s: buttons=%d\n", dev->name, i);
/* Tell them how many buttons we have. */ /* Tell them how many buttons we have. */
mouse_set_buttons((dev->flags & FLAG_INTELLI) ? 3 : 2); mouse_set_buttons(i);
/* Return our private data to the I/O layer. */ /* Return our private data to the I/O layer. */
return (dev); return (dev);
@@ -333,10 +364,11 @@ static const device_config_t ps2_config[] = {
.file_filter = "", .file_filter = "",
.spinner = { 0 }, .spinner = { 0 },
.selection = { .selection = {
{ .description = "Two", .value = 2 }, { .description = "Two", .value = 2 },
{ .description = "Three", .value = 3 }, { .description = "Three", .value = 3 },
{ .description = "Wheel", .value = 4 }, { .description = "Wheel", .value = 4 },
{ .description = "" } { .description = "Five + Wheel", .value = 5 },
{ .description = "" }
} }
}, },
{ {

View File

@@ -1103,6 +1103,42 @@ const machine_t machines[] = {
.snd_device = NULL, .snd_device = NULL,
.net_device = NULL .net_device = NULL
}, },
{
.name = "[8088] Pravetz 16 / IMKO-4",
.internal_name = "pravetz16",
.type = MACHINE_TYPE_8088,
.chipset = MACHINE_CHIPSET_DISCRETE,
.init = machine_xt_pravetz16_imko4_init,
.pad = 0,
.pad0 = 0,
.pad1 = MACHINE_AVAILABLE,
.pad2 = 0,
.cpu = {
.package = CPU_PKG_8088,
.block = CPU_BLOCK_NONE,
.min_bus = 0,
.max_bus = 0,
.min_voltage = 0,
.max_voltage = 0,
.min_multi = 0,
.max_multi = 0
},
.bus_flags = MACHINE_PC,
.flags = MACHINE_FLAGS_NONE,
.ram = {
.min = 64,
.max = 640,
.step = 64
},
.nvrmask = 0,
.kbc = KBC_IBM_PC_XT,
.kbc_p1 = 0xff00,
.gpio = 0xffffffff,
.device = NULL,
.vid_device = NULL,
.snd_device = NULL,
.net_device = NULL
},
{ {
.name = "[8088] Sanyo SX-16", .name = "[8088] Sanyo SX-16",
.internal_name = "sansx16", .internal_name = "sansx16",
@@ -1610,42 +1646,6 @@ const machine_t machines[] = {
.snd_device = NULL, .snd_device = NULL,
.net_device = NULL .net_device = NULL
}, },
{
.name = "[8088] Pravetz 16 / IMKO-4",
.internal_name = "pravetz16",
.type = MACHINE_TYPE_8088,
.chipset = MACHINE_CHIPSET_DISCRETE,
.init = machine_xt_pravetz16_imko4_init,
.pad = 0,
.pad0 = 0,
.pad1 = MACHINE_AVAILABLE,
.pad2 = 0,
.cpu = {
.package = CPU_PKG_8088,
.block = CPU_BLOCK_NONE,
.min_bus = 0,
.max_bus = 0,
.min_voltage = 0,
.max_voltage = 0,
.min_multi = 0,
.max_multi = 0
},
.bus_flags = MACHINE_PC,
.flags = MACHINE_FLAGS_NONE,
.ram = {
.min = 64,
.max = 640,
.step = 64
},
.nvrmask = 0,
.kbc = KBC_IBM_PC_XT,
.kbc_p1 = 0xff00,
.gpio = 0xffffffff,
.device = NULL,
.vid_device = NULL,
.snd_device = NULL,
.net_device = NULL
},
{ {
.name = "[V20] PC-XT", .name = "[V20] PC-XT",
.internal_name = "v20xt", .internal_name = "v20xt",
@@ -1936,6 +1936,42 @@ const machine_t machines[] = {
.snd_device = NULL, .snd_device = NULL,
.net_device = NULL .net_device = NULL
}, },
{
.name = "[8086] Epson Equity LT",
.internal_name = "elt",
.type = MACHINE_TYPE_8086,
.chipset = MACHINE_CHIPSET_PROPRIETARY,
.init = machine_elt_init,
.pad = 0,
.pad0 = 0,
.pad1 = MACHINE_AVAILABLE,
.pad2 = 0,
.cpu = {
.package = CPU_PKG_8086,
.block = CPU_BLOCK_NONE,
.min_bus = 0,
.max_bus = 0,
.min_voltage = 0,
.max_voltage = 0,
.min_multi = 0,
.max_multi = 0
},
.bus_flags = MACHINE_PC,
.flags = MACHINE_VIDEO,
.ram = {
.min = 640,
.max = 640,
.step = 640
},
.nvrmask = 0x3f,
.kbc = KBC_IBM_PC_XT,
.kbc_p1 = 0xff00,
.gpio = 0xffffffff,
.device = NULL,
.vid_device = NULL,
.snd_device = NULL,
.net_device = NULL
},
{ {
.name = "[8086] Olivetti M21/24/24SP", .name = "[8086] Olivetti M21/24/24SP",
.internal_name = "m24", .internal_name = "m24",
@@ -2081,42 +2117,6 @@ const machine_t machines[] = {
.snd_device = NULL, .snd_device = NULL,
.net_device = NULL .net_device = NULL
}, },
{
.name = "[8086] Victor V86P",
.internal_name = "v86p",
.type = MACHINE_TYPE_8086,
.chipset = MACHINE_CHIPSET_PROPRIETARY,
.init = machine_v86p_init,
.pad = 0,
.pad0 = 0,
.pad1 = MACHINE_AVAILABLE,
.pad2 = 0,
.cpu = {
.package = CPU_PKG_8086,
.block = CPU_BLOCK_NONE,
.min_bus = 0,
.max_bus = 0,
.min_voltage = 0,
.max_voltage = 0,
.min_multi = 0,
.max_multi = 0
},
.bus_flags = MACHINE_PC,
.flags = MACHINE_VIDEO | MACHINE_MFM,
.ram = {
.min = 512,
.max = 1024,
.step = 128
},
.nvrmask = 127,
.kbc = KBC_IBM_PC_XT,
.kbc_p1 = 0xff00,
.gpio = 0xffffffff,
.device = NULL,
.vid_device = NULL,
.snd_device = NULL,
.net_device = NULL
},
{ {
.name = "[8086] Toshiba T1200", .name = "[8086] Toshiba T1200",
.internal_name = "t1200", .internal_name = "t1200",
@@ -2154,11 +2154,11 @@ const machine_t machines[] = {
.net_device = NULL .net_device = NULL
}, },
{ {
.name = "[8086] Epson Equity LT", .name = "[8086] Victor V86P",
.internal_name = "elt", .internal_name = "v86p",
.type = MACHINE_TYPE_8086, .type = MACHINE_TYPE_8086,
.chipset = MACHINE_CHIPSET_PROPRIETARY, .chipset = MACHINE_CHIPSET_PROPRIETARY,
.init = machine_elt_init, .init = machine_v86p_init,
.pad = 0, .pad = 0,
.pad0 = 0, .pad0 = 0,
.pad1 = MACHINE_AVAILABLE, .pad1 = MACHINE_AVAILABLE,
@@ -2174,13 +2174,13 @@ const machine_t machines[] = {
.max_multi = 0 .max_multi = 0
}, },
.bus_flags = MACHINE_PC, .bus_flags = MACHINE_PC,
.flags = MACHINE_VIDEO, .flags = MACHINE_VIDEO | MACHINE_MFM,
.ram = { .ram = {
.min = 640, .min = 512,
.max = 640, .max = 1024,
.step = 640 .step = 128
}, },
.nvrmask = 0x3f, .nvrmask = 127,
.kbc = KBC_IBM_PC_XT, .kbc = KBC_IBM_PC_XT,
.kbc_p1 = 0xff00, .kbc_p1 = 0xff00,
.gpio = 0xffffffff, .gpio = 0xffffffff,

View File

@@ -706,7 +706,7 @@ mouse_poll()
mouse_y = mousedata.deltay; mouse_y = mousedata.deltay;
mouse_z = mousedata.deltaz; mouse_z = mousedata.deltaz;
mousedata.deltax = mousedata.deltay = mousedata.deltaz = 0; mousedata.deltax = mousedata.deltay = mousedata.deltaz = 0;
mouse_buttons = mousedata.mousebuttons; mouse_buttons = mousedata.mousebuttons;
SDL_UnlockMutex(mousemutex); SDL_UnlockMutex(mousemutex);
} }
@@ -1171,6 +1171,12 @@ main(int argc, char **argv)
case SDL_BUTTON_MIDDLE: case SDL_BUTTON_MIDDLE:
buttonmask = 4; buttonmask = 4;
break; break;
case SDL_BUTTON_X1:
buttonmask = 8;
break;
case SDL_BUTTON_X2:
buttonmask = 16;
break;
} }
SDL_LockMutex(mousemutex); SDL_LockMutex(mousemutex);
if (event.button.state == SDL_PRESSED) { if (event.button.state == SDL_PRESSED) {

View File

@@ -81,6 +81,16 @@ win_mouse_handle(PRAWINPUT raw)
else if (state.usButtonFlags & RI_MOUSE_RIGHT_BUTTON_UP) else if (state.usButtonFlags & RI_MOUSE_RIGHT_BUTTON_UP)
mousestate.buttons &= ~2; mousestate.buttons &= ~2;
if (state.usButtonFlags & RI_MOUSE_BUTTON_4_DOWN)
mousestate.buttons |= 8;
else if (state.usButtonFlags & RI_MOUSE_BUTTON_4_UP)
mousestate.buttons &= ~8;
if (state.usButtonFlags & RI_MOUSE_BUTTON_5_DOWN)
mousestate.buttons |= 16;
else if (state.usButtonFlags & RI_MOUSE_BUTTON_5_UP)
mousestate.buttons &= ~16;
if (state.usButtonFlags & RI_MOUSE_WHEEL) { if (state.usButtonFlags & RI_MOUSE_WHEEL) {
mousestate.dwheel += (SHORT) state.usButtonData / 120; mousestate.dwheel += (SHORT) state.usButtonData / 120;
} }