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

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

unix.superglobalmegacorp.com

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