--- BasiliskII/src/adb.cpp 2002/01/15 14:58:32 1.8 +++ BasiliskII/src/adb.cpp 2005/01/30 21:42:13 1.15 @@ -1,7 +1,7 @@ /* * adb.cpp - ADB emulation (mouse/keyboard) * - * Basilisk II (C) 1997-2002 Christian Bauer + * Basilisk II (C) 1997-2005 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,11 +28,16 @@ #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" +#ifdef POWERPC_ROM +#include "thunks.h" +#endif + #define DEBUG 0 #include "debug.h" @@ -57,6 +62,8 @@ 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; @@ -68,6 +75,8 @@ static B2_mutex *mouse_lock; void ADBInit(void) { mouse_lock = B2_create_mutex(); + m_keyboard_type = (uint8)PrefsFindInt32("keyboardtype"); + key_reg_3[1] = m_keyboard_type; } @@ -99,7 +108,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; } @@ -372,18 +381,19 @@ void ADBInterrupt(void) // Update mouse position (absolute) 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 + static const uint8 proc_template[] = { + 0x2f, 0x08, // move.l a0,-(sp) + 0x2f, 0x00, // move.l d0,-(sp) + 0x2f, 0x01, // move.l d1,-(sp) + 0x70, 0x01, // moveq #1,d0 (MoveTo) + 0xaa, 0xdb, // CursorDeviceDispatch + M68K_RTS >> 8, M68K_RTS }; + BUILD_SHEEPSHAVER_PROCEDURE(proc); r.a[0] = ReadMacInt32(mouse_base + 4); r.d[0] = mx; r.d[1] = my; - Execute68k((uint32)proc, &r); + Execute68k(proc, &r); #else WriteMacInt16(0x82a, mx); WriteMacInt16(0x828, my);