File: keybuf.c

package info (click to toggle)
uae 0.7.6-4
  • links: PTS
  • area: contrib
  • in suites: potato
  • size: 3,352 kB
  • ctags: 6,537
  • sloc: ansic: 54,019; asm: 1,981; cpp: 713; objc: 549; makefile: 234; perl: 202; sh: 21
file content (148 lines) | stat: -rw-r--r-- 3,476 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
 /*
  * UAE - The Un*x Amiga Emulator
  *
  * Keyboard buffer. Not really needed for X, but for SVGAlib and possibly
  * Mac and DOS ports.
  *
  * Note: it's possible to have two threads in UAE, one reading keystrokes
  * and the other one writing them. Despite this, no synchronization effort
  * is needed. This code should be perfectly thread safe. At least if you
  * assume that integer store instructions are atomic.
  *
  * Copyright 1995, 1997 Bernd Schmidt
  */

#include "sysconfig.h"
#include "sysdeps.h"
#include <assert.h>

#include "config.h"
#include "options.h"
#include "keybuf.h"
#include "keyboard.h"
#include "joystick.h"

static int fakestate[3][5] = { { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } };

static int *fs_np;
static int *fs_ck;
static int *fs_se;

void getjoystate(int nr, unsigned int *st, int *button)
{
    int *fake = 0;

    if (JSEM_ISJOY0 (nr, currprefs.fake_joystick))
	nr = 0;
    else if (JSEM_ISJOY1 (nr, currprefs.fake_joystick))
	nr = 1;
    else if (JSEM_ISMOUSE (nr, currprefs.fake_joystick)) {
	*st = 0;
	*button = 0;
	return;
    } else
	fake = fakestate[nr];

    if (fake) {
	int top = fake[0];
	int bot = fake[3];
	if (fake[1]) top = !top;
	if (fake[2]) bot = !bot;
	*st = bot | (fake[2] << 1) | (top << 8) | (fake[1] << 9);
	*button = fake[4];
    } else
	read_joystick (nr, st, button);
}

/* Not static so the DOS code can mess with them */
int kpb_first, kpb_last;

int keybuf[256];

int keys_available (void)
{
    int val;
    val = kpb_first != kpb_last;
    return val;
}

int get_next_key (void)
{
    int key;
    assert (kpb_first != kpb_last);

    key = keybuf[kpb_last];
    if (++kpb_last == 256)
	kpb_last = 0;
    return key;
}

void record_key (int kc)
{
    int kpb_next = kpb_first + 1;

    if (kpb_next == 256)
	kpb_next = 0;
    if (kpb_next == kpb_last) {
	write_log ("Keyboard buffer overrun. Congratulations.\n");
	return;
    }
    if (fs_np != 0) {
	switch (kc >> 1) {
	 case AK_NP8: fs_np[0] = !(kc & 1); return;
	 case AK_NP4: fs_np[1] = !(kc & 1); return;
	 case AK_NP6: fs_np[2] = !(kc & 1); return;
	 case AK_NP2: fs_np[3] = !(kc & 1); return;
	 case AK_NP0: case AK_NP5: fs_np[4] = !(kc & 1); return;
	}
    }
    if (fs_ck != 0) {
	switch (kc >> 1) {
	 case AK_UP: fs_ck[0] = !(kc & 1); return;
	 case AK_LF: fs_ck[1] = !(kc & 1); return;
	 case AK_RT: fs_ck[2] = !(kc & 1); return;
	 case AK_DN: fs_ck[3] = !(kc & 1); return;
	 case AK_RCTRL: fs_ck[4] = !(kc & 1); return;
	}
    }
    if (fs_se != 0) {
	switch (kc >> 1) {
	 case AK_T: fs_se[0] = !(kc & 1); return;
	 case AK_F: fs_se[1] = !(kc & 1); return;
	 case AK_H: fs_se[2] = !(kc & 1); return;
	 case AK_B: fs_se[3] = !(kc & 1); return;
	 case AK_LALT: fs_se[4] = !(kc & 1); return;
	}
    }
    if (kc == AK_RCTRL)
	kc = AK_CTRL;
    keybuf[kpb_first] = kc;
    kpb_first = kpb_next;
}

void joystick_setting_changed (void)
{
    fs_np = fs_ck = fs_se = 0;

    if (JSEM_ISNUMPAD (0, currprefs.fake_joystick))
	fs_np = fakestate[0];
    else if (JSEM_ISNUMPAD (1, currprefs.fake_joystick))
	fs_np = fakestate[1];

    if (JSEM_ISCURSOR (0, currprefs.fake_joystick))
	fs_ck = fakestate[0];
    else if (JSEM_ISCURSOR (1, currprefs.fake_joystick))
	fs_ck = fakestate[1];

    if (JSEM_ISSOMEWHEREELSE (0, currprefs.fake_joystick))
	fs_se = fakestate[0];
    else if (JSEM_ISSOMEWHEREELSE (1, currprefs.fake_joystick))
	fs_se = fakestate[1];

}

void keybuf_init (void)
{
    kpb_first = kpb_last = 0;
    joystick_setting_changed ();
}