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

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 "options.h"
                     20: #include "keybuf.h"
                     21: #include "keyboard.h"
1.1.1.8   root       22: #include "inputdevice.h"
1.1.1.5   root       23: #include "custom.h"
1.1.1.8   root       24: #include "savestate.h"
1.1       root       25: 
1.1.1.8   root       26: static int fakestate[2][7] = { {0},{0} };
1.1       root       27: 
1.1.1.8   root       28: static int *fs_np, *fs_ck, *fs_se, *fs_xa1, *fs_xa2;
1.1       root       29: 
                     30: /* Not static so the DOS code can mess with them */
                     31: int kpb_first, kpb_last;
                     32: 
1.1.1.8   root       33: static int keybuf[256];
1.1       root       34: 
                     35: int keys_available (void)
                     36: {
1.1.1.3   root       37:     int val;
                     38:     val = kpb_first != kpb_last;
                     39:     return val;
1.1       root       40: }
                     41: 
                     42: int get_next_key (void)
                     43: {
                     44:     int key;
                     45:     assert (kpb_first != kpb_last);
1.1.1.3   root       46: 
1.1       root       47:     key = keybuf[kpb_last];
1.1.1.3   root       48:     if (++kpb_last == 256)
1.1       root       49:        kpb_last = 0;
1.1.1.3   root       50:     return key;
1.1       root       51: }
                     52: 
1.1.1.8   root       53: static void do_fake (int nr)
                     54: {
                     55:     int *fake = fakestate[nr];
                     56: 
                     57:     nr = compatibility_device[nr];
                     58:     setjoystickstate (nr, 0, fake[1] ? -100 : (fake[2] ? 100 : 0), 100);
                     59:     setjoystickstate (nr, 1, fake[0] ? -100 : (fake[3] ? 100 : 0), 100);
                     60:     setjoybuttonstate (nr, 0, fake[4]);
                     61:     setjoybuttonstate (nr, 1, fake[5]);
                     62:     setjoybuttonstate (nr, 2, fake[6]);
                     63: }
                     64: 
1.1       root       65: void record_key (int kc)
                     66: {
1.1.1.8   root       67:     int fs = 0;
1.1       root       68:     int kpb_next = kpb_first + 1;
1.1.1.8   root       69:     int k = kc >> 1;
                     70:     int b = !(kc & 1);
1.1       root       71: 
1.1.1.8   root       72:     //write_log ("got kc %02.2X\n", ((kc << 7) | (kc >> 1)) & 0xff);
1.1       root       73:     if (kpb_next == 256)
                     74:        kpb_next = 0;
                     75:     if (kpb_next == kpb_last) {
1.1.1.3   root       76:        write_log ("Keyboard buffer overrun. Congratulations.\n");
1.1       root       77:        return;
                     78:     }
1.1.1.8   root       79: 
1.1.1.3   root       80:     if (fs_np != 0) {
1.1.1.8   root       81:        switch (k) {
                     82:        case AK_NP8: fs = 1; fs_np[0] = b; break;
                     83:        case AK_NP4: fs = 1; fs_np[1] = b; break;
                     84:        case AK_NP6: fs = 1; fs_np[2] = b; break;
                     85:        case AK_NP2: fs = 1; fs_np[3] = b; break;
                     86:        case AK_NP0: case AK_NP5: fs = 1; fs_np[4] = b; break;
                     87:        case AK_NPDEL: case AK_NPDIV: case AK_ENT: fs = 1; fs_np[5] = b; break;
1.1.1.3   root       88:        }
                     89:     }
                     90:     if (fs_ck != 0) {
1.1.1.8   root       91:        switch (k) {
                     92:        case AK_UP: fs = 1; fs_ck[0] = b; break;
                     93:        case AK_LF: fs = 1; fs_ck[1] = b; break;
                     94:        case AK_RT: fs = 1; fs_ck[2] = b; break;
                     95:        case AK_DN: fs = 1; fs_ck[3] = b; break;
                     96:        case AK_RCTRL: case AK_RALT: fs = 1; fs_ck[4] = b; break;
                     97:        case AK_RSH: fs = 1; fs_ck[5] = b; break;
1.1       root       98:        }
                     99:     }
1.1.1.3   root      100:     if (fs_se != 0) {
1.1.1.8   root      101:        switch (k) {
                    102:        case AK_T: fs = 1; fs_se[0] = b; break;
                    103:        case AK_F: fs = 1; fs_se[1] = b; break;
                    104:        case AK_H: fs = 1; fs_se[2] = b; break;
                    105:        case AK_B: fs = 1; fs_se[3] = b; break;
                    106:        case AK_LALT: fs = 1; fs_se[4] = b; break;
                    107:        case AK_LSH: fs = 1; fs_se[5] = b; break;
                    108:        }
                    109:     }
                    110:     if (fs_xa1 != 0) {
                    111:        switch (k) {
                    112:        case AK_NP8: fs = 1; fs_xa1[0] = b; break;
                    113:        case AK_NP4: fs = 1; fs_xa1[1] = b; break;
                    114:        case AK_NP6: fs = 1; fs_xa1[2] = b; break;
                    115:        case AK_NP2: case AK_NP5: fs = 1; fs_xa1[3] = b; break;
                    116:        case AK_CTRL: fs = 1; fs_xa1[4] = b; break;
                    117:        case AK_LALT: fs = 1; fs_xa1[5] = b; break;
                    118:        case AK_SPC: fs = 1; fs_xa1[6] = b; break;
1.1.1.3   root      119:        }
                    120:     }
1.1.1.8   root      121:     if (fs_xa2 != 0) {
                    122:        switch (k) {
                    123:        case AK_R: fs = 1; fs_xa2[0] = b; break;
                    124:        case AK_D: fs = 1; fs_xa2[1] = b; break;
                    125:        case AK_G: fs = 1; fs_xa2[2] = b; break;
                    126:        case AK_F: fs = 1; fs_xa2[3] = b; break;
                    127:        case AK_A: fs = 1; fs_xa2[4] = b; break;
                    128:        case AK_S: fs = 1; fs_xa2[5] = b; break;
                    129:        case AK_Q: fs = 1; fs_xa2[6] = b; break;
                    130:        }
                    131:     }
                    132: 
                    133:     if (fs && currprefs.input_selected_setting == 0) {
                    134:        if (JSEM_ISANYKBD (0, &currprefs))
                    135:            do_fake (0);
                    136:        if (JSEM_ISANYKBD (1, &currprefs))
                    137:            do_fake (1);
                    138:        return;
                    139:     } else {
                    140:        if ((kc >> 1) == AK_RCTRL) {
                    141:            kc ^= AK_RCTRL << 1;
                    142:            kc ^= AK_CTRL << 1;
                    143:        }
                    144:        if (fs_xa1 || fs_xa2) {
                    145:            int k2 = k;
                    146:            if (k == AK_1)
                    147:                k2 = AK_F1;
                    148:            if (k == AK_2)
                    149:                k2 = AK_F2;
                    150:            if (k == AK_3)
                    151:                k2 = AK_LALT;
                    152:            if (k == AK_4)
                    153:                k2 = AK_RALT;
                    154:            if (k == AK_6)
                    155:                k2 = AK_DN;
                    156:            if (k == AK_LBRACKET || k == AK_LSH)
                    157:                k2 = AK_SPC;
                    158:            if (k == AK_RBRACKET)
                    159:                k2 = AK_RET;
                    160:            if (k == AK_C)
                    161:                k2 = AK_1;
                    162:            if (k == AK_5)
                    163:                k2 = AK_2;
                    164:            if (k == AK_Z)
                    165:                k2 = AK_3;
                    166:            if (k == AK_X)
                    167:                k2 = AK_4;
                    168:            if (k != k2)
                    169:                kc = (k2 << 1) | (b ? 0 : 1);
                    170:        }
1.1.1.4   root      171:     }
1.1.1.8   root      172: 
1.1       root      173:     keybuf[kpb_first] = kc;
                    174:     kpb_first = kpb_next;
                    175: }
                    176: 
1.1.1.3   root      177: void joystick_setting_changed (void)
                    178: {
1.1.1.8   root      179:     fs_np = fs_ck = fs_se = fs_xa1 = fs_xa2 = 0;
1.1.1.3   root      180: 
1.1.1.4   root      181:     if (JSEM_ISNUMPAD (0, &currprefs))
1.1.1.3   root      182:        fs_np = fakestate[0];
1.1.1.4   root      183:     else if (JSEM_ISNUMPAD (1, &currprefs))
1.1.1.3   root      184:        fs_np = fakestate[1];
                    185: 
1.1.1.4   root      186:     if (JSEM_ISCURSOR (0, &currprefs))
1.1.1.3   root      187:        fs_ck = fakestate[0];
1.1.1.4   root      188:     else if (JSEM_ISCURSOR (1, &currprefs))
1.1.1.3   root      189:        fs_ck = fakestate[1];
                    190: 
1.1.1.4   root      191:     if (JSEM_ISSOMEWHEREELSE (0, &currprefs))
1.1.1.3   root      192:        fs_se = fakestate[0];
1.1.1.4   root      193:     else if (JSEM_ISSOMEWHEREELSE (1, &currprefs))
1.1.1.3   root      194:        fs_se = fakestate[1];
                    195: 
1.1.1.8   root      196:     if (JSEM_ISXARCADE1 (0, &currprefs))
                    197:        fs_xa1 = fakestate[0];
                    198:     else if (JSEM_ISXARCADE1 (1, &currprefs))
                    199:        fs_xa1 = fakestate[1];
                    200: 
                    201:     if (JSEM_ISXARCADE2 (0, &currprefs))
                    202:        fs_xa2 = fakestate[0];
                    203:     else if (JSEM_ISXARCADE2 (1, &currprefs))
                    204:        fs_xa2 = fakestate[1];
                    205: 
                    206:  }
1.1.1.3   root      207: 
1.1       root      208: void keybuf_init (void)
                    209: {
                    210:     kpb_first = kpb_last = 0;
1.1.1.8   root      211:     inputdevice_updateconfig (&currprefs);
                    212: }
                    213: 
                    214: 
                    215: uae_u8 *save_keyboard (int *len)
                    216: {
                    217:     uae_u8 *dst, *t;
                    218:     dst = t = malloc (8);
                    219:     save_u32 (getcapslockstate() ? 1 : 0);
                    220:     save_u32 (0);
                    221:     *len = 8;
                    222:     return t;
                    223: }
                    224: 
1.1.1.9 ! root      225: const uae_u8 *restore_keyboard (const uae_u8 *src)
1.1.1.8   root      226: {
                    227:     setcapslockstate (restore_u32 ());
                    228:     restore_u32 ();
                    229:     return src;
1.1       root      230: }

unix.superglobalmegacorp.com

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