mirror of
https://github.com/kanjitalk755/macemu.git
synced 2024-12-23 19:29:18 +00:00
Merge pull request #31 from rakslice/adb_button_buffer_rebase
ADB mouse event buffering proposed by OulanB
This commit is contained in:
commit
d83c53437e
@ -57,6 +57,11 @@ const int KEY_BUFFER_SIZE = 16;
|
||||
static uint8 key_buffer[KEY_BUFFER_SIZE];
|
||||
static unsigned int key_read_ptr = 0, key_write_ptr = 0;
|
||||
|
||||
// O2S: Button event buffer (Mac button with up/down flag) -> avoid to loose tap on a trackpad
|
||||
const int BUTTON_BUFFER_SIZE = 32;
|
||||
static uint8 button_buffer[BUTTON_BUFFER_SIZE];
|
||||
static unsigned int button_read_ptr = 0, button_write_ptr = 0;
|
||||
|
||||
static uint8 mouse_reg_3[2] = {0x63, 0x01}; // Mouse ADB register 3
|
||||
|
||||
static uint8 key_reg_2[2] = {0xff, 0xff}; // Keyboard ADB register 2
|
||||
@ -245,13 +250,17 @@ void ADBMouseMoved(int x, int y)
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
/*
|
||||
* Mouse button pressed
|
||||
*/
|
||||
|
||||
void ADBMouseDown(int button)
|
||||
{
|
||||
mouse_button[button] = true;
|
||||
// O2S: Add button to buffer
|
||||
button_buffer[button_write_ptr] = button;
|
||||
button_write_ptr = (button_write_ptr + 1) % BUTTON_BUFFER_SIZE;
|
||||
|
||||
// O2S: mouse_button[button] = true;
|
||||
SetInterruptFlag(INTFLAG_ADB);
|
||||
TriggerInterrupt();
|
||||
}
|
||||
@ -263,7 +272,11 @@ void ADBMouseDown(int button)
|
||||
|
||||
void ADBMouseUp(int button)
|
||||
{
|
||||
mouse_button[button] = false;
|
||||
// O2S: Add button to buffer
|
||||
button_buffer[button_write_ptr] = button | 0x80;
|
||||
button_write_ptr = (button_write_ptr + 1) % BUTTON_BUFFER_SIZE;
|
||||
|
||||
// O2S: mouse_button[button] = false;
|
||||
SetInterruptFlag(INTFLAG_ADB);
|
||||
TriggerInterrupt();
|
||||
}
|
||||
@ -278,7 +291,7 @@ void ADBSetRelMouseMode(bool relative)
|
||||
if (relative_mouse != relative) {
|
||||
relative_mouse = relative;
|
||||
mouse_x = mouse_y = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -347,34 +360,39 @@ void ADBInterrupt(void)
|
||||
uint32 mouse_base = adb_base + 16;
|
||||
|
||||
if (relative_mouse) {
|
||||
while (mx != 0 || my != 0 || button_read_ptr != button_write_ptr) {
|
||||
if (button_read_ptr != button_write_ptr) {
|
||||
// Read button event
|
||||
uint8 button = button_buffer[button_read_ptr];
|
||||
button_read_ptr = (button_read_ptr + 1) % BUTTON_BUFFER_SIZE;
|
||||
mouse_button[button & 0x3] = (button & 0x80) ? false : true;
|
||||
}
|
||||
// Call mouse ADB handler
|
||||
if (mouse_reg_3[1] == 4) {
|
||||
// Extended mouse protocol
|
||||
WriteMacInt8(tmp_data, 3);
|
||||
WriteMacInt8(tmp_data + 1, (my & 0x7f) | (mouse_button[0] ? 0 : 0x80));
|
||||
WriteMacInt8(tmp_data + 2, (mx & 0x7f) | (mouse_button[1] ? 0 : 0x80));
|
||||
WriteMacInt8(tmp_data + 3, ((my >> 3) & 0x70) | ((mx >> 7) & 0x07) | (mouse_button[2] ? 0x08 : 0x88));
|
||||
} else {
|
||||
// 100/200 dpi mode
|
||||
WriteMacInt8(tmp_data, 2);
|
||||
WriteMacInt8(tmp_data + 1, (my & 0x7f) | (mouse_button[0] ? 0 : 0x80));
|
||||
WriteMacInt8(tmp_data + 2, (mx & 0x7f) | (mouse_button[1] ? 0 : 0x80));
|
||||
}
|
||||
r.a[0] = tmp_data;
|
||||
r.a[1] = ReadMacInt32(mouse_base);
|
||||
r.a[2] = ReadMacInt32(mouse_base + 4);
|
||||
r.a[3] = adb_base;
|
||||
r.d[0] = (mouse_reg_3[0] << 4) | 0x0c; // Talk 0
|
||||
Execute68k(r.a[1], &r);
|
||||
|
||||
// Mouse movement (relative) and buttons
|
||||
if (mx != 0 || my != 0 || mb[0] != old_mouse_button[0] || mb[1] != old_mouse_button[1] || mb[2] != old_mouse_button[2]) {
|
||||
|
||||
// Call mouse ADB handler
|
||||
if (mouse_reg_3[1] == 4) {
|
||||
// Extended mouse protocol
|
||||
WriteMacInt8(tmp_data, 3);
|
||||
WriteMacInt8(tmp_data + 1, (my & 0x7f) | (mb[0] ? 0 : 0x80));
|
||||
WriteMacInt8(tmp_data + 2, (mx & 0x7f) | (mb[1] ? 0 : 0x80));
|
||||
WriteMacInt8(tmp_data + 3, ((my >> 3) & 0x70) | ((mx >> 7) & 0x07) | (mb[2] ? 0x08 : 0x88));
|
||||
} else {
|
||||
// 100/200 dpi mode
|
||||
WriteMacInt8(tmp_data, 2);
|
||||
WriteMacInt8(tmp_data + 1, (my & 0x7f) | (mb[0] ? 0 : 0x80));
|
||||
WriteMacInt8(tmp_data + 2, (mx & 0x7f) | (mb[1] ? 0 : 0x80));
|
||||
}
|
||||
r.a[0] = tmp_data;
|
||||
r.a[1] = ReadMacInt32(mouse_base);
|
||||
r.a[2] = ReadMacInt32(mouse_base + 4);
|
||||
r.a[3] = adb_base;
|
||||
r.d[0] = (mouse_reg_3[0] << 4) | 0x0c; // Talk 0
|
||||
Execute68k(r.a[1], &r);
|
||||
|
||||
old_mouse_button[0] = mb[0];
|
||||
old_mouse_button[1] = mb[1];
|
||||
old_mouse_button[2] = mb[2];
|
||||
}
|
||||
old_mouse_button[0] = mouse_button[0];
|
||||
old_mouse_button[1] = mouse_button[1];
|
||||
old_mouse_button[2] = mouse_button[2];
|
||||
mx = 0;
|
||||
my = 0;
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
@ -405,34 +423,42 @@ void ADBInterrupt(void)
|
||||
old_mouse_y = my;
|
||||
}
|
||||
|
||||
// Send mouse button events
|
||||
if (mb[0] != old_mouse_button[0] || mb[1] != old_mouse_button[1] || mb[2] != old_mouse_button[2]) {
|
||||
uint32 mouse_base = adb_base + 16;
|
||||
// O2S: Process accumulated button events
|
||||
while (button_read_ptr != button_write_ptr) {
|
||||
// Read button event
|
||||
uint8 button = button_buffer[button_read_ptr];
|
||||
button_read_ptr = (button_read_ptr + 1) % BUTTON_BUFFER_SIZE;
|
||||
mouse_button[button & 0x3] = (button & 0x80) ? false : true;
|
||||
|
||||
// Call mouse ADB handler
|
||||
if (mouse_reg_3[1] == 4) {
|
||||
// Extended mouse protocol
|
||||
WriteMacInt8(tmp_data, 3);
|
||||
WriteMacInt8(tmp_data + 1, mb[0] ? 0 : 0x80);
|
||||
WriteMacInt8(tmp_data + 2, mb[1] ? 0 : 0x80);
|
||||
WriteMacInt8(tmp_data + 3, mb[2] ? 0x08 : 0x88);
|
||||
} else {
|
||||
// 100/200 dpi mode
|
||||
WriteMacInt8(tmp_data, 2);
|
||||
WriteMacInt8(tmp_data + 1, mb[0] ? 0 : 0x80);
|
||||
WriteMacInt8(tmp_data + 2, mb[1] ? 0 : 0x80);
|
||||
}
|
||||
r.a[0] = tmp_data;
|
||||
r.a[1] = ReadMacInt32(mouse_base);
|
||||
r.a[2] = ReadMacInt32(mouse_base + 4);
|
||||
r.a[3] = adb_base;
|
||||
r.d[0] = (mouse_reg_3[0] << 4) | 0x0c; // Talk 0
|
||||
Execute68k(r.a[1], &r);
|
||||
if (mouse_button[0] != old_mouse_button[0] || mouse_button[1] != old_mouse_button[1] || mouse_button[2] != old_mouse_button[2]) {
|
||||
uint32 mouse_base = adb_base + 16;
|
||||
|
||||
// Call mouse ADB handler
|
||||
if (mouse_reg_3[1] == 4) {
|
||||
// Extended mouse protocol
|
||||
WriteMacInt8(tmp_data, 3);
|
||||
WriteMacInt8(tmp_data + 1, mouse_button[0] ? 0 : 0x80);
|
||||
WriteMacInt8(tmp_data + 2, mouse_button[1] ? 0 : 0x80);
|
||||
WriteMacInt8(tmp_data + 3, mouse_button[2] ? 0x08 : 0x88);
|
||||
} else {
|
||||
// 100/200 dpi mode
|
||||
WriteMacInt8(tmp_data, 2);
|
||||
WriteMacInt8(tmp_data + 1, mouse_button[0] ? 0 : 0x80);
|
||||
WriteMacInt8(tmp_data + 2, mouse_button[1] ? 0 : 0x80);
|
||||
}
|
||||
r.a[0] = tmp_data;
|
||||
r.a[1] = ReadMacInt32(mouse_base);
|
||||
r.a[2] = ReadMacInt32(mouse_base + 4);
|
||||
r.a[3] = adb_base;
|
||||
r.d[0] = (mouse_reg_3[0] << 4) | 0x0c; // Talk 0
|
||||
Execute68k(r.a[1], &r);
|
||||
|
||||
old_mouse_button[0] = mouse_button[0];
|
||||
old_mouse_button[1] = mouse_button[1];
|
||||
old_mouse_button[2] = mouse_button[2];
|
||||
}
|
||||
}
|
||||
|
||||
old_mouse_button[0] = mb[0];
|
||||
old_mouse_button[1] = mb[1];
|
||||
old_mouse_button[2] = mb[2];
|
||||
}
|
||||
}
|
||||
|
||||
// Process accumulated keyboard events
|
||||
|
Loading…
Reference in New Issue
Block a user