ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/cebix/BasiliskII/src/adb.cpp
(Generate patch)

Comparing BasiliskII/src/adb.cpp (file contents):
Revision 1.6 by cebix, 2001-07-03T15:59:45Z vs.
Revision 1.15 by gbeauche, 2005-01-30T21:42:13Z

# Line 1 | Line 1
1   /*
2   *  adb.cpp - ADB emulation (mouse/keyboard)
3   *
4 < *  Basilisk II (C) 1997-2001 Christian Bauer
4 > *  Basilisk II (C) 1997-2005 Christian Bauer
5   *
6   *  This program is free software; you can redistribute it and/or modify
7   *  it under the terms of the GNU General Public License as published by
# Line 28 | Line 28
28  
29   #include "sysdeps.h"
30   #include "cpu_emulation.h"
31 #include "main.h"
31   #include "emul_op.h"
32 + #include "main.h"
33 + #include "prefs.h"
34   #include "video.h"
35   #include "adb.h"
36  
37 + #ifdef POWERPC_ROM
38 + #include "thunks.h"
39 + #endif
40 +
41   #define DEBUG 0
42   #include "debug.h"
43  
# Line 57 | Line 62 | static uint8 mouse_reg_3[2] = {0x63, 0x0
62   static uint8 key_reg_2[2] = {0xff, 0xff};       // Keyboard ADB register 2
63   static uint8 key_reg_3[2] = {0x62, 0x05};       // Keyboard ADB register 3
64  
65 < // ADB mouse input state lock (for platforms that use separate input thread)
65 > static uint8 m_keyboard_type = 0x05;
66 >
67 > // ADB mouse motion lock (for platforms that use separate input thread)
68   static B2_mutex *mouse_lock;
69  
70  
# Line 68 | Line 75 | static B2_mutex *mouse_lock;
75   void ADBInit(void)
76   {
77          mouse_lock = B2_create_mutex();
78 +        m_keyboard_type = (uint8)PrefsFindInt32("keyboardtype");
79 +        key_reg_3[1] = m_keyboard_type;
80   }
81  
82  
# Line 99 | Line 108 | void ADBOp(uint8 op, uint8 *data)
108                  key_reg_2[0] = 0xff;
109                  key_reg_2[1] = 0xff;
110                  key_reg_3[0] = 0x62;
111 <                key_reg_3[1] = 0x05;
111 >                key_reg_3[1] = m_keyboard_type;
112                  return;
113          }
114  
# Line 231 | Line 240 | void ADBMouseMoved(int x, int y)
240                  mouse_x = x; mouse_y = y;
241          }
242          B2_unlock_mutex(mouse_lock);
243 +        SetInterruptFlag(INTFLAG_ADB);
244 +        TriggerInterrupt();
245   }
246  
247  
# Line 240 | Line 251 | void ADBMouseMoved(int x, int y)
251  
252   void ADBMouseDown(int button)
253   {
243        B2_lock_mutex(mouse_lock);
254          mouse_button[button] = true;
255 <        B2_unlock_mutex(mouse_lock);
255 >        SetInterruptFlag(INTFLAG_ADB);
256 >        TriggerInterrupt();
257   }
258  
259  
260   /*
261 < *  First mouse button released
261 > *  Mouse button released
262   */
263  
264   void ADBMouseUp(int button)
265   {
255        B2_lock_mutex(mouse_lock);
266          mouse_button[button] = false;
267 <        B2_unlock_mutex(mouse_lock);
267 >        SetInterruptFlag(INTFLAG_ADB);
268 >        TriggerInterrupt();
269   }
270  
271  
# Line 264 | Line 275 | void ADBMouseUp(int button)
275  
276   void ADBSetRelMouseMode(bool relative)
277   {
278 <        relative_mouse = relative;
278 >        if (relative_mouse != relative) {
279 >                relative_mouse = relative;
280 >                mouse_x = mouse_y = 0;
281 >        }
282   }
283  
284  
# Line 280 | Line 294 | void ADBKeyDown(int code)
294  
295          // Set key in matrix
296          key_states[code >> 3] |= (1 << (~code & 7));
297 +
298 +        // Trigger interrupt
299 +        SetInterruptFlag(INTFLAG_ADB);
300 +        TriggerInterrupt();
301   }
302  
303  
# Line 295 | Line 313 | void ADBKeyUp(int code)
313  
314          // Clear key in matrix
315          key_states[code >> 3] &= ~(1 << (~code & 7));
316 +
317 +        // Trigger interrupt
318 +        SetInterruptFlag(INTFLAG_ADB);
319 +        TriggerInterrupt();
320   }
321  
322  
# Line 359 | Line 381 | void ADBInterrupt(void)
381                  // Update mouse position (absolute)
382                  if (mx != old_mouse_x || my != old_mouse_y) {
383   #ifdef POWERPC_ROM
384 <                        static const uint16 proc[] = {
385 <                                0x2f08,         // move.l a0,-(sp)
386 <                                0x2f00,         // move.l d0,-(sp)
387 <                                0x2f01,         // move.l d1,-(sp)
388 <                                0x7001,         // moveq #1,d0 (MoveTo)
389 <                                0xaadb,         // CursorDeviceDispatch
390 <                                M68K_RTS
384 >                        static const uint8 proc_template[] = {
385 >                                0x2f, 0x08,             // move.l a0,-(sp)
386 >                                0x2f, 0x00,             // move.l d0,-(sp)
387 >                                0x2f, 0x01,             // move.l d1,-(sp)
388 >                                0x70, 0x01,             // moveq #1,d0 (MoveTo)
389 >                                0xaa, 0xdb,             // CursorDeviceDispatch
390 >                                M68K_RTS >> 8, M68K_RTS
391                          };
392 +                        BUILD_SHEEPSHAVER_PROCEDURE(proc);
393                          r.a[0] = ReadMacInt32(mouse_base + 4);
394                          r.d[0] = mx;
395                          r.d[1] = my;
396 <                        Execute68k((uint32)proc, &r);
396 >                        Execute68k(proc, &r);
397   #else
398                          WriteMacInt16(0x82a, mx);
399                          WriteMacInt16(0x828, my);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines