|
|
1.1.1.3 root 1: /*
1.1 root 2: * UAE - The Un*x Amiga Emulator
1.1.1.3 root 3: *
1.1 root 4: * Keyboard buffer. Not really needed for X, but for SVGAlib and possibly
5: * Mac and DOS ports.
1.1.1.3 root 6: *
7: * Note: it's possible to have two threads in UAE, one reading keystrokes
8: * and the other one writing them. Despite this, no synchronization effort
9: * is needed. This code should be perfectly thread safe. At least if you
10: * assume that integer store instructions are atomic.
11: *
12: * Copyright 1995, 1997 Bernd Schmidt
1.1 root 13: */
14:
15: #include "sysconfig.h"
16: #include "sysdeps.h"
17: #include <assert.h>
18:
19: #include "config.h"
20: #include "options.h"
21: #include "keybuf.h"
22: #include "keyboard.h"
1.1.1.3 root 23: #include "joystick.h"
1.1.1.5 root 24: #include "custom.h"
1.1 root 25:
1.1.1.5 root 26: static int fakestate[3][6] = { { 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0 } };
1.1 root 27:
1.1.1.3 root 28: static int *fs_np;
29: static int *fs_ck;
30: static int *fs_se;
31:
32: void getjoystate(int nr, unsigned int *st, int *button)
1.1 root 33: {
1.1.1.3 root 34: int *fake = 0;
35:
1.1.1.4 root 36: if (JSEM_ISJOY0 (nr, &currprefs))
1.1.1.3 root 37: nr = 0;
1.1.1.4 root 38: else if (JSEM_ISJOY1 (nr, &currprefs))
1.1.1.3 root 39: nr = 1;
1.1.1.4 root 40: else if (JSEM_ISMOUSE (nr, &currprefs)) {
1.1.1.3 root 41: *st = 0;
42: *button = 0;
43: return;
44: } else
45: fake = fakestate[nr];
46:
47: if (fake) {
48: int top = fake[0];
1.1.1.6 root 49: int bot = top ? 0 : fake[3];
50: int left = fake[1];
51: int right = left ? 0 : fake[2];
52: if (left) top = !top;
53: if (right) bot = !bot;
54: *st = bot | (right << 1) | (top << 8) | (left << 9);
1.1.1.7 ! root 55: *button = fake[4] | (!!fake[5] << 2);
1.1 root 56: } else
1.1.1.3 root 57: read_joystick (nr, st, button);
1.1.1.7 ! root 58: if ((*button & 5) == 4 && (n_frames & 1))
! 59: *button |= 1;
1.1 root 60: }
61:
62: /* Not static so the DOS code can mess with them */
63: int kpb_first, kpb_last;
64:
1.1.1.2 root 65: int keybuf[256];
1.1 root 66:
67: int keys_available (void)
68: {
1.1.1.3 root 69: int val;
70: val = kpb_first != kpb_last;
71: return val;
1.1 root 72: }
73:
74: int get_next_key (void)
75: {
76: int key;
77: assert (kpb_first != kpb_last);
1.1.1.3 root 78:
1.1 root 79: key = keybuf[kpb_last];
1.1.1.3 root 80: if (++kpb_last == 256)
1.1 root 81: kpb_last = 0;
1.1.1.3 root 82: return key;
1.1 root 83: }
84:
85: void record_key (int kc)
86: {
87: int kpb_next = kpb_first + 1;
88:
89: if (kpb_next == 256)
90: kpb_next = 0;
91: if (kpb_next == kpb_last) {
1.1.1.3 root 92: write_log ("Keyboard buffer overrun. Congratulations.\n");
1.1 root 93: return;
94: }
1.1.1.3 root 95: if (fs_np != 0) {
96: switch (kc >> 1) {
1.1.1.5 root 97: case AK_NP8: fs_np[0] = !(kc & 1); return;
98: case AK_NP4: fs_np[1] = !(kc & 1); return;
99: case AK_NP6: fs_np[2] = !(kc & 1); return;
100: case AK_NP2: fs_np[3] = !(kc & 1); return;
101: case AK_NP0: case AK_NP5: fs_np[4] = !(kc & 1); return;
102: case AK_NPDEL: case AK_NPDIV: case AK_ENT: if (! (kc & 1)) fs_np[5] = ! fs_np[5]; return;
1.1.1.3 root 103: }
104: }
105: if (fs_ck != 0) {
1.1 root 106: switch (kc >> 1) {
1.1.1.5 root 107: case AK_UP: fs_ck[0] = !(kc & 1); return;
108: case AK_LF: fs_ck[1] = !(kc & 1); return;
109: case AK_RT: fs_ck[2] = !(kc & 1); return;
110: case AK_DN: fs_ck[3] = !(kc & 1); return;
111: case AK_RCTRL: fs_ck[4] = !(kc & 1); return;
112: case AK_RSH: if (! (kc & 1)) fs_ck[5] = ! fs_ck[5]; return;
1.1 root 113: }
114: }
1.1.1.3 root 115: if (fs_se != 0) {
116: switch (kc >> 1) {
1.1.1.5 root 117: case AK_T: fs_se[0] = !(kc & 1); return;
118: case AK_F: fs_se[1] = !(kc & 1); return;
119: case AK_H: fs_se[2] = !(kc & 1); return;
120: case AK_B: fs_se[3] = !(kc & 1); return;
121: case AK_LALT: fs_se[4] = !(kc & 1); return;
122: case AK_LSH: if (! (kc & 1)) fs_se[5] = ! fs_se[5]; return;
1.1.1.3 root 123: }
124: }
1.1.1.4 root 125: if ((kc >> 1) == AK_RCTRL) {
126: kc ^= AK_RCTRL << 1;
127: kc ^= AK_CTRL << 1;
128: }
1.1 root 129: keybuf[kpb_first] = kc;
130: kpb_first = kpb_next;
131: }
132:
1.1.1.3 root 133: void joystick_setting_changed (void)
134: {
135: fs_np = fs_ck = fs_se = 0;
136:
1.1.1.4 root 137: if (JSEM_ISNUMPAD (0, &currprefs))
1.1.1.3 root 138: fs_np = fakestate[0];
1.1.1.4 root 139: else if (JSEM_ISNUMPAD (1, &currprefs))
1.1.1.3 root 140: fs_np = fakestate[1];
141:
1.1.1.4 root 142: if (JSEM_ISCURSOR (0, &currprefs))
1.1.1.3 root 143: fs_ck = fakestate[0];
1.1.1.4 root 144: else if (JSEM_ISCURSOR (1, &currprefs))
1.1.1.3 root 145: fs_ck = fakestate[1];
146:
1.1.1.4 root 147: if (JSEM_ISSOMEWHEREELSE (0, &currprefs))
1.1.1.3 root 148: fs_se = fakestate[0];
1.1.1.4 root 149: else if (JSEM_ISSOMEWHEREELSE (1, &currprefs))
1.1.1.3 root 150: fs_se = fakestate[1];
151:
152: }
153:
1.1 root 154: void keybuf_init (void)
155: {
156: kpb_first = kpb_last = 0;
1.1.1.3 root 157: joystick_setting_changed ();
1.1 root 158: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.