aboutsummaryrefslogtreecommitdiff
path: root/mousmain.c
diff options
context:
space:
mode:
authorJavier <dev.git@javispedro.com>2026-08-30 19:01:23 +0200
committerJavier <dev.git@javispedro.com>2026-08-30 19:01:23 +0200
commit8459567950d6d7dcc8f92753b0c1918f417ab149 (patch)
tree8ab3fe3e5c970a4c00b5e222a6c5a13525149287 /mousmain.c
parent6c79dffa4fd38a36845f518443668a3aa654728c (diff)
downloadvbados-8459567950d6d7dcc8f92753b0c1918f417ab149.tar.gz
vbados-8459567950d6d7dcc8f92753b0c1918f417ab149.zip
handle wheel serial protocol (untested)
Diffstat (limited to 'mousmain.c')
-rw-r--r--mousmain.c46
1 files changed, 29 insertions, 17 deletions
diff --git a/mousmain.c b/mousmain.c
index 79abfae..02540de 100644
--- a/mousmain.c
+++ b/mousmain.c
@@ -29,6 +29,7 @@
#include "int21dos.h"
#include "int15ps2.h"
#include "serial.h"
+#include "sermouse.h"
#include "vbox.h"
#include "vmware.h"
#include "dostsr.h"
@@ -324,7 +325,7 @@ static int configure_driver_serial(LPTSRDATA data, int port, unsigned iobase)
{
struct serial_config serconfig;
unsigned delay;
- char sig1 = 0, sig2 = 0;
+ char sig = 0;
if (!iobase) {
dprintf("Skip search on COM%u because no IO base found\n", port);
@@ -334,6 +335,7 @@ static int configure_driver_serial(LPTSRDATA data, int port, unsigned iobase)
#if ENABLE_DLOG && DLOG_TARGET == DLOG_TARGET_SERIAL
if (iobase == DLOG_TARGET_PORT) {
dprintf("Skip search on COM%u because it would overlap with dlog %x\n", port, iobase);
+ return -2;
}
#endif
@@ -360,53 +362,63 @@ static int configure_driver_serial(LPTSRDATA data, int port, unsigned iobase)
uint8_t car = serial_read_data(iobase);
// Is this something we recognize ?
- dprintf("received serial data after reset: 0x%hx '%c'\n", car, car);
+ dprintf("serial data after reset: 0x%hx '%c'\n", car, car);
if (car == 'M') {
// Ok, got the MS signature, break out of this wait
- sig1 = car;
+ sig = car;
break;
}
}
- if (sig1) break;
+ if (sig) break;
bda_wait_tick();
dprintf("remaining ticks %u\n", delay);
}
- if (sig1 == 'M') {
+ switch (sig) {
+ case 'M':
// We have a valid MS-style serial mouse
data->port = port;
- data->device_id = 'M';
+ data->device_id = SERMOUSE_DEVICE_ID_MS;
data->port_io = iobase;
data->port_irq = serial_get_irq(port);
data->num_buttons = 2;
-#if USE_WHEEL
data->num_wheels = 0;
-#endif
data->packet_size = 3;
- // Should we wait for an extended signature? Let's do it
+ // Wait for an extended signature for about 2 ticks (50-100ms)
+ sig = 0;
for (delay = 2; delay > 0; delay--) {
while (serial_data_ready(iobase)) {
uint8_t car = serial_read_data(iobase);
- dprintf("received serial data after '%c': 0x%hx '%c'\n", sig1, car, car);
- if (car == '3') {
- // Ok, got the MS signature, break out of this wait
- sig2 = car;
+ dprintf("serial data after 'M': 0x%hx '%c'\n", car, car);
+ if (car == '3' || car == 'Z') {
+ sig = car;
break;
}
}
- if (sig2) break;
+ if (sig) break;
bda_wait_tick();
dprintf("2nd loop remaining ticks %u\n", delay);
}
- if (sig2 == '3') {
- data->device_id = '3';
+ // Update the mouse details based on the extended signature
+ // We don't change the device ID since we treat all the same.
+ switch (sig) {
+ case '3':
+ data->packet_size = 4;
+ data->num_buttons = 3;
+ break;
+ case 'Z':
+ data->packet_size = 4;
data->num_buttons = 3;
+#if USE_WHEEL
+ data->num_wheels = 1;
+#endif
+ break;
}
// In any case, we got ourselves a mouse.
@@ -415,7 +427,7 @@ static int configure_driver_serial(LPTSRDATA data, int port, unsigned iobase)
// No mouse found on this port.
serial_restore_config(iobase, &serconfig);
- return -2;
+ return -3;
}
#endif