|
|
1.1 ! root 1: /* ! 2: * UAE - The Un*x Amiga Emulator ! 3: * ! 4: * Additional Win32 helper functions not calling any system routines ! 5: * ! 6: * (c) 1997 Mathias Ortmann ! 7: */ ! 8: ! 9: #include "config.h" ! 10: #include "sysconfig.h" ! 11: ! 12: #include <assert.h> ! 13: #include <ctype.h> ! 14: #include <signal.h> ! 15: #include <windows.h> ! 16: ! 17: #include "sysdeps.h" ! 18: #include "uae.h" ! 19: #include "options.h" ! 20: #include "threaddep/penguin.h" ! 21: #include "include/memory.h" ! 22: #include "custom.h" ! 23: #include "readcpu.h" ! 24: #include "newcpu.h" ! 25: #include "keyboard.h" ! 26: #include "xwin.h" ! 27: #include "disk.h" ! 28: #include "keybuf.h" ! 29: #include "gui.h" ! 30: ! 31: static int keystate[256]; ! 32: ! 33: static int helppressed (void) ! 34: { ! 35: return GetAsyncKeyState (VK_END) & 0x8000; ! 36: } ! 37: ! 38: static int shiftpressed (void) ! 39: { ! 40: return GetAsyncKeyState (VK_SHIFT) & 0x8000 ? 1 : 0; ! 41: } ! 42: ! 43: static int getcapslock (void) ! 44: { ! 45: BYTE keyState[256]; ! 46: ! 47: GetKeyboardState (keyState); ! 48: return keyState[VK_CAPITAL] & 1; ! 49: } ! 50: ! 51: ! 52: /* there's a problem remaining with the semantics of the '#' key on U.S. keyboards */ ! 53: static int scancode2amiga (int keycode, int scancode) ! 54: { ! 55: switch (keycode & 0xff) { ! 56: case VK_INSERT: ! 57: case VK_LWIN: ! 58: return AK_LAMI; ! 59: case VK_HOME: ! 60: case VK_RWIN: ! 61: return AK_RAMI; ! 62: case VK_DECIMAL: ! 63: return 0x3c; ! 64: case VK_SCROLL: ! 65: return AK_inhibit; ! 66: case VK_F12: ! 67: case VK_APPS: ! 68: return -2; ! 69: case VK_PAUSE: ! 70: return -3; ! 71: case VK_DIVIDE: ! 72: return AK_NPDIV; ! 73: case VK_MULTIPLY: ! 74: return AK_NPMUL; ! 75: case VK_SUBTRACT: ! 76: return AK_NPSUB; ! 77: case VK_ADD: ! 78: return AK_NPADD; ! 79: case VK_NUMPAD0: ! 80: return AK_NP0; ! 81: case VK_NUMPAD1: ! 82: return AK_NP1; ! 83: case VK_NUMPAD2: ! 84: return AK_NP2; ! 85: case VK_NUMPAD3: ! 86: return AK_NP3; ! 87: case VK_NUMPAD4: ! 88: return AK_NP4; ! 89: case VK_NUMPAD5: ! 90: return AK_NP5; ! 91: case VK_NUMPAD6: ! 92: return AK_NP6; ! 93: case VK_NUMPAD7: ! 94: return AK_NP7; ! 95: case VK_NUMPAD8: ! 96: return AK_NP8; ! 97: case VK_NUMPAD9: ! 98: return AK_NP9; ! 99: case VK_UP: ! 100: return AK_UP; ! 101: case VK_DOWN: ! 102: return AK_DN; ! 103: case VK_LEFT: ! 104: return AK_LF; ! 105: case VK_RIGHT: ! 106: return AK_RT; ! 107: case VK_CONTROL: ! 108: return scancode == 0x11d ? AK_RCTRL : AK_CTRL; ! 109: case VK_RETURN: ! 110: return keycode > 0xff ? 0x43 : 0x44; ! 111: case VK_CAPITAL: ! 112: return -4; ! 113: case VK_F1: ! 114: if (helppressed ()) ! 115: return -10 - shiftpressed (); ! 116: return 0x50; ! 117: case VK_F2: ! 118: if (helppressed ()) ! 119: return -12 - shiftpressed (); ! 120: return 0x51; ! 121: case VK_F3: ! 122: if (helppressed ()) ! 123: return -14 - shiftpressed (); ! 124: return 0x52; ! 125: case VK_F4: ! 126: if (helppressed ()) ! 127: return -16 - shiftpressed (); ! 128: return 0x53; ! 129: case VK_F5: ! 130: return 0x54; ! 131: case VK_F6: ! 132: return 0x55; ! 133: case VK_F7: ! 134: return 0x56; ! 135: case VK_F8: ! 136: return 0x57; ! 137: case VK_F9: ! 138: return 0x58; ! 139: case VK_F10: ! 140: return 0x59; ! 141: case VK_NEXT: ! 142: return 0x5f; ! 143: } ! 144: ! 145: switch (scancode) { ! 146: case 0x01: ! 147: return 0x45; ! 148: case 0x29: ! 149: return 0x00; ! 150: case 0x02: ! 151: return 0x01; ! 152: case 0x03: ! 153: return 0x02; ! 154: case 0x04: ! 155: return 0x03; ! 156: case 0x05: ! 157: return 0x04; ! 158: case 0x06: ! 159: return 0x05; ! 160: case 0x07: ! 161: return 0x06; ! 162: case 0x08: ! 163: return 0x07; ! 164: case 0x09: ! 165: return 0x08; ! 166: case 0x0a: ! 167: return 0x09; ! 168: case 0x0b: ! 169: return 0x0a; ! 170: case 0x0c: ! 171: return 0x0b; ! 172: case 0x0d: ! 173: return 0x0c; ! 174: case 0x57: ! 175: return 0x0d; ! 176: case 0x0e: ! 177: return 0x41; ! 178: case 0x0f: ! 179: return 0x42; ! 180: case 0x10: ! 181: return 0x10; ! 182: case 0x11: ! 183: return 0x11; ! 184: case 0x12: ! 185: return 0x12; ! 186: case 0x13: ! 187: return 0x13; ! 188: case 0x14: ! 189: return 0x14; ! 190: case 0x15: ! 191: return 0x15; ! 192: case 0x16: ! 193: return 0x16; ! 194: case 0x17: ! 195: return 0x17; ! 196: case 0x18: ! 197: return 0x18; ! 198: case 0x19: ! 199: return 0x19; ! 200: case 0x1a: ! 201: return 0x1a; ! 202: case 0x1b: ! 203: return 0x1b; ! 204: /* special handling for caps lock: return 0x63*/ ! 205: case 0x3a: ! 206: return 0x62; ! 207: case 0x1e: ! 208: return 0x20; ! 209: case 0x1f: ! 210: return 0x21; ! 211: case 0x20: ! 212: return 0x22; ! 213: case 0x21: ! 214: return 0x23; ! 215: case 0x22: ! 216: return 0x24; ! 217: case 0x23: ! 218: return 0x25; ! 219: case 0x24: ! 220: return 0x26; ! 221: case 0x25: ! 222: return 0x27; ! 223: case 0x26: ! 224: return 0x28; ! 225: case 0x27: ! 226: return 0x29; ! 227: case 0x28: ! 228: return 0x2a; ! 229: case 0x2b: ! 230: return 0x2b; ! 231: case 0x2a: ! 232: return 0x60; ! 233: case 0x56: ! 234: return 0x30; ! 235: case 0x2c: ! 236: return 0x31; ! 237: case 0x2d: ! 238: return 0x32; ! 239: case 0x2e: ! 240: return 0x33; ! 241: case 0x2f: ! 242: return 0x34; ! 243: case 0x30: ! 244: return 0x35; ! 245: case 0x31: ! 246: return 0x36; ! 247: case 0x32: ! 248: return 0x37; ! 249: case 0x33: ! 250: return 0x38; ! 251: case 0x34: ! 252: return 0x39; ! 253: case 0x35: ! 254: return 0x3a; ! 255: case 0x36: ! 256: return 0x61; ! 257: case 0x38: ! 258: return 0x64; ! 259: case 0x39: ! 260: return 0x40; ! 261: case 0x153: ! 262: return 0x46; ! 263: case 0x51: ! 264: return 0x5f; ! 265: case 0x52: ! 266: return 0x66; ! 267: case 0x47: ! 268: return 0x67; ! 269: case 0x4b: ! 270: return 0x4f; ! 271: case 0x50: ! 272: return 0x4d; ! 273: case 0x4d: ! 274: return 0x4e; ! 275: case 0x48: ! 276: return 0x4c; ! 277: case 0x4e: ! 278: return 0x5e; ! 279: case 0x4a: ! 280: return 0x4a; ! 281: case 0x37: ! 282: return 0x5d; ! 283: } ! 284: ! 285: return -1; ! 286: } ! 287: ! 288: int my_kbd_handler (int keycode, int scancode, int newstate) ! 289: { ! 290: int akey = scancode2amiga (keycode, scancode); ! 291: ! 292: if (akey < 0) { ! 293: switch (akey) { ! 294: case -2: ! 295: if (newstate) ! 296: DisplayGUI (); ! 297: ! 298: return 0; ! 299: ! 300: case -3: ! 301: #if 0 ! 302: if (newstate) ! 303: toggle_sound = 1; ! 304: #endif ! 305: return 0; ! 306: case -4: ! 307: if (newstate) { ! 308: akey = 0x62; ! 309: newstate = getcapslock (); ! 310: } ! 311: break; ! 312: default: ! 313: if (newstate && akey >= -17 && akey <= -10) { ! 314: char tmpbuf[80]; ! 315: akey = -10 - akey; ! 316: ! 317: if (akey & 1) { ! 318: akey >>= 1; ! 319: disk_eject (akey); ! 320: return 0; ! 321: } ! 322: akey >>= 1; ! 323: ! 324: sprintf (tmpbuf, "Insert disk into drive df%d:...", akey); ! 325: ! 326: requestfname (tmpbuf, changed_prefs.df[akey]); ! 327: ! 328: } ! 329: return 0; ! 330: } ! 331: } ! 332: if (akey == AK_inhibit) { ! 333: if (newstate) ! 334: inhibit_frame ^= 1; ! 335: return 0; ! 336: } ! 337: if (keystate[akey] == newstate) ! 338: return 0; ! 339: keystate[akey] = newstate; ! 340: ! 341: if (newstate) ! 342: record_key (akey << 1); ! 343: else ! 344: record_key ((akey << 1) + 1); ! 345: ! 346: /* "Affengriff" */ ! 347: if (keystate[AK_CTRL] && keystate[AK_LAMI] && keystate[AK_RAMI]) ! 348: uae_reset (); ! 349: ! 350: return 0; ! 351: } ! 352:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.