Annotation of uae/src/keybuf.c, revision 1.1.1.7

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.