From b388cb552f448aad599103775457fbbfa653dded Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Fri, 28 Oct 2022 23:51:38 +0600 Subject: [PATCH 1/2] Add option for 5-button PS/2 mouse --- src/device/mouse_ps2.c | 68 +++++++++++++++++++++++++++++++----------- src/unix/unix.c | 8 ++++- src/win/win_mouse.c | 10 +++++++ 3 files changed, 67 insertions(+), 19 deletions(-) diff --git a/src/device/mouse_ps2.c b/src/device/mouse_ps2.c index 0fc731c33..29ef8a5bb 100644 --- a/src/device/mouse_ps2.c +++ b/src/device/mouse_ps2.c @@ -36,7 +36,7 @@ typedef struct { int mode; - uint8_t flags; + uint16_t flags; uint8_t resolution; uint8_t sample_rate; @@ -46,11 +46,12 @@ typedef struct { uint8_t last_data[6]; } mouse_t; -#define FLAG_INTELLI 0x80 /* device is IntelliMouse */ -#define FLAG_INTMODE 0x40 /* using Intellimouse mode */ -#define FLAG_SCALED 0x20 /* enable delta scaling */ -#define FLAG_ENABLED 0x10 /* dev is enabled for use */ -#define FLAG_CTRLDAT 0x08 /* ctrl or data mode */ +#define FLAG_5BTN 0x100 /* using Intellimouse Optical mode */ +#define FLAG_INTELLI 0x80 /* device is IntelliMouse */ +#define FLAG_INTMODE 0x40 /* using Intellimouse mode */ +#define FLAG_SCALED 0x20 /* enable delta scaling */ +#define FLAG_ENABLED 0x10 /* dev is enabled for use */ +#define FLAG_CTRLDAT 0x08 /* ctrl or data mode */ int mouse_scan = 0; @@ -156,14 +157,24 @@ ps2_write(uint8_t val, void *priv) keyboard_at_adddata_mouse(temp); keyboard_at_adddata_mouse(dev->x & 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; case 0xf2: /* read ID */ keyboard_at_adddata_mouse(0xfa); if (dev->flags & FLAG_INTMODE) - keyboard_at_adddata_mouse(0x03); + keyboard_at_adddata_mouse((dev->flags & FLAG_5BTN) ? 0x04 : 0x03); else keyboard_at_adddata_mouse(0x00); break; @@ -210,8 +221,17 @@ mouse_reset: 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; + } } } @@ -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[1]); keyboard_at_adddata_mouse(buff[2]); - 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); + } dev->x = dev->y = dev->z = 0; } @@ -299,13 +328,15 @@ mouse_ps2_init(const device_t *info) if (i > 2) dev->flags |= FLAG_INTELLI; + if (i == 4) i = 3; + /* Hook into the general AT Keyboard driver. */ 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. */ - mouse_set_buttons((dev->flags & FLAG_INTELLI) ? 3 : 2); + mouse_set_buttons(i); /* Return our private data to the I/O layer. */ return (dev); @@ -333,10 +364,11 @@ static const device_config_t ps2_config[] = { .file_filter = "", .spinner = { 0 }, .selection = { - { .description = "Two", .value = 2 }, - { .description = "Three", .value = 3 }, - { .description = "Wheel", .value = 4 }, - { .description = "" } + { .description = "Two", .value = 2 }, + { .description = "Three", .value = 3 }, + { .description = "Wheel", .value = 4 }, + { .description = "Five + Wheel", .value = 5 }, + { .description = "" } } }, { diff --git a/src/unix/unix.c b/src/unix/unix.c index 8d6aaf3d1..f2c6ed125 100644 --- a/src/unix/unix.c +++ b/src/unix/unix.c @@ -706,7 +706,7 @@ mouse_poll() mouse_y = mousedata.deltay; mouse_z = mousedata.deltaz; mousedata.deltax = mousedata.deltay = mousedata.deltaz = 0; - mouse_buttons = mousedata.mousebuttons; + mouse_buttons = mousedata.mousebuttons; SDL_UnlockMutex(mousemutex); } @@ -1171,6 +1171,12 @@ main(int argc, char **argv) case SDL_BUTTON_MIDDLE: buttonmask = 4; break; + case SDL_BUTTON_X1: + buttonmask = 8; + break; + case SDL_BUTTON_X2: + buttonmask = 16; + break; } SDL_LockMutex(mousemutex); if (event.button.state == SDL_PRESSED) { diff --git a/src/win/win_mouse.c b/src/win/win_mouse.c index 58f0c2635..25d3c593b 100644 --- a/src/win/win_mouse.c +++ b/src/win/win_mouse.c @@ -81,6 +81,16 @@ win_mouse_handle(PRAWINPUT raw) else if (state.usButtonFlags & RI_MOUSE_RIGHT_BUTTON_UP) 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) { mousestate.dwheel += (SHORT) state.usButtonData / 120; } From a045a9302ffa9a7b96a530b16c568b0d74d0071a Mon Sep 17 00:00:00 2001 From: telanus Date: Fri, 28 Oct 2022 20:00:14 +0200 Subject: [PATCH 2/2] Sorted 8088 & 8086 entries alphabetically --- src/machine/machine_table.c | 160 ++++++++++++++++++------------------ 1 file changed, 80 insertions(+), 80 deletions(-) diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index 4e8a5f7ce..e4c437016 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -1103,6 +1103,42 @@ const machine_t machines[] = { .snd_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", .internal_name = "sansx16", @@ -1610,42 +1646,6 @@ const machine_t machines[] = { .snd_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", .internal_name = "v20xt", @@ -1936,6 +1936,42 @@ const machine_t machines[] = { .snd_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", .internal_name = "m24", @@ -2081,42 +2117,6 @@ const machine_t machines[] = { .snd_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", .internal_name = "t1200", @@ -2154,11 +2154,11 @@ const machine_t machines[] = { .net_device = NULL }, { - .name = "[8086] Epson Equity LT", - .internal_name = "elt", + .name = "[8086] Victor V86P", + .internal_name = "v86p", .type = MACHINE_TYPE_8086, .chipset = MACHINE_CHIPSET_PROPRIETARY, - .init = machine_elt_init, + .init = machine_v86p_init, .pad = 0, .pad0 = 0, .pad1 = MACHINE_AVAILABLE, @@ -2174,13 +2174,13 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PC, - .flags = MACHINE_VIDEO, + .flags = MACHINE_VIDEO | MACHINE_MFM, .ram = { - .min = 640, - .max = 640, - .step = 640 + .min = 512, + .max = 1024, + .step = 128 }, - .nvrmask = 0x3f, + .nvrmask = 127, .kbc = KBC_IBM_PC_XT, .kbc_p1 = 0xff00, .gpio = 0xffffffff,