--- BasiliskII/src/adb.cpp 2000/07/25 11:13:24 1.4 +++ BasiliskII/src/adb.cpp 2004/01/12 15:29:21 1.12 @@ -1,7 +1,7 @@ /* * adb.cpp - ADB emulation (mouse/keyboard) * - * Basilisk II (C) 1997-2000 Christian Bauer + * Basilisk II (C) 1997-2004 Christian Bauer * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -28,8 +28,9 @@ #include "sysdeps.h" #include "cpu_emulation.h" -#include "main.h" #include "emul_op.h" +#include "main.h" +#include "prefs.h" #include "video.h" #include "adb.h" @@ -57,6 +58,36 @@ static uint8 mouse_reg_3[2] = {0x63, 0x0 static uint8 key_reg_2[2] = {0xff, 0xff}; // Keyboard ADB register 2 static uint8 key_reg_3[2] = {0x62, 0x05}; // Keyboard ADB register 3 +static uint8 m_keyboard_type = 0x05; + +// ADB mouse motion lock (for platforms that use separate input thread) +static B2_mutex *mouse_lock; + + +/* + * Initialize ADB emulation + */ + +void ADBInit(void) +{ + mouse_lock = B2_create_mutex(); + m_keyboard_type = (uint8)PrefsFindInt32("keyboardtype"); + key_reg_3[1] = m_keyboard_type; +} + + +/* + * Exit ADB emulation + */ + +void ADBExit(void) +{ + if (mouse_lock) { + B2_delete_mutex(mouse_lock); + mouse_lock = NULL; + } +} + /* * ADBOp() replacement @@ -73,7 +104,7 @@ void ADBOp(uint8 op, uint8 *data) key_reg_2[0] = 0xff; key_reg_2[1] = 0xff; key_reg_3[0] = 0x62; - key_reg_3[1] = 0x05; + key_reg_3[1] = m_keyboard_type; return; } @@ -198,11 +229,15 @@ void ADBOp(uint8 op, uint8 *data) void ADBMouseMoved(int x, int y) { + B2_lock_mutex(mouse_lock); if (relative_mouse) { mouse_x += x; mouse_y += y; } else { mouse_x = x; mouse_y = y; } + B2_unlock_mutex(mouse_lock); + SetInterruptFlag(INTFLAG_ADB); + TriggerInterrupt(); } @@ -213,16 +248,20 @@ void ADBMouseMoved(int x, int y) void ADBMouseDown(int button) { mouse_button[button] = true; + SetInterruptFlag(INTFLAG_ADB); + TriggerInterrupt(); } /* - * First mouse button released + * Mouse button released */ void ADBMouseUp(int button) { mouse_button[button] = false; + SetInterruptFlag(INTFLAG_ADB); + TriggerInterrupt(); } @@ -232,7 +271,10 @@ void ADBMouseUp(int button) void ADBSetRelMouseMode(bool relative) { - relative_mouse = relative; + if (relative_mouse != relative) { + relative_mouse = relative; + mouse_x = mouse_y = 0; + } } @@ -248,6 +290,10 @@ void ADBKeyDown(int code) // Set key in matrix key_states[code >> 3] |= (1 << (~code & 7)); + + // Trigger interrupt + SetInterruptFlag(INTFLAG_ADB); + TriggerInterrupt(); } @@ -263,6 +309,10 @@ void ADBKeyUp(int code) // Clear key in matrix key_states[code >> 3] &= ~(1 << (~code & 7)); + + // Trigger interrupt + SetInterruptFlag(INTFLAG_ADB); + TriggerInterrupt(); } @@ -280,9 +330,14 @@ void ADBInterrupt(void) return; uint32 tmp_data = adb_base + 0x163; // Temporary storage for faked ADB data - // Get position so that it won't change during processing + // Get mouse state + B2_lock_mutex(mouse_lock); int mx = mouse_x; int my = mouse_y; + if (relative_mouse) + mouse_x = mouse_y = 0; + int mb[3] = {mouse_button[0], mouse_button[1], mouse_button[2]}; + B2_unlock_mutex(mouse_lock); uint32 key_base = adb_base + 4; uint32 mouse_base = adb_base + 16; @@ -290,20 +345,20 @@ void ADBInterrupt(void) if (relative_mouse) { // Mouse movement (relative) and buttons - if (mx != 0 || my != 0 || mouse_button[0] != old_mouse_button[0] || mouse_button[1] != old_mouse_button[1] || mouse_button[2] != old_mouse_button[2]) { + 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) | (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)); + 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) | (mouse_button[0] ? 0 : 0x80)); - WriteMacInt8(tmp_data + 2, (mx & 0x7f) | (mouse_button[1] ? 0 : 0x80)); + 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); @@ -312,10 +367,9 @@ void ADBInterrupt(void) r.d[0] = (mouse_reg_3[0] << 4) | 0x0c; // Talk 0 Execute68k(r.a[1], &r); - mouse_x = mouse_y = 0; - 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]; } } else { @@ -324,12 +378,12 @@ void ADBInterrupt(void) if (mx != old_mouse_x || my != old_mouse_y) { #ifdef POWERPC_ROM static const uint16 proc[] = { - 0x2f08, // move.l a0,-(sp) - 0x2f00, // move.l d0,-(sp) - 0x2f01, // move.l d1,-(sp) - 0x7001, // moveq #1,d0 (MoveTo) - 0xaadb, // CursorDeviceDispatch - M68K_RTS + PW(0x2f08), // move.l a0,-(sp) + PW(0x2f00), // move.l d0,-(sp) + PW(0x2f01), // move.l d1,-(sp) + PW(0x7001), // moveq #1,d0 (MoveTo) + PW(0xaadb), // CursorDeviceDispatch + PW(M68K_RTS) }; r.a[0] = ReadMacInt32(mouse_base + 4); r.d[0] = mx; @@ -347,21 +401,21 @@ void ADBInterrupt(void) } // Send mouse button events - if (mouse_button[0] != old_mouse_button[0]) { + 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; // 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); + 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, mouse_button[0] ? 0 : 0x80); - WriteMacInt8(tmp_data + 2, mouse_button[1] ? 0 : 0x80); + 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); @@ -370,9 +424,9 @@ void ADBInterrupt(void) 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]; } }