#include <stdio.h> #include <X11/Xlib.h> #include <X11/Xutil.h> #include "system.h" #include "cpu.h" #include "atom.h" #include "keyboard.h" static int control = 0; static int shift = 0; static int alt = 0; static int keys_pressed = 0; static int shifted_keys = 0; static UBYTE keys[16]; void init_keyboard (void) { int i; for (i = 0; i < 16; i++) keys[i] = 0x3f; control = 0; shift = 0; alt = 0; keys_pressed = 0; shifted_keys = 0; } void handle_key (XKeyEvent *key_event, bool pressed) { KeySym keysym; char buffer[128]; UWORD keycode; int keyboard_status; XLookupString (key_event, buffer, 128, &keysym, &keyboard_status); #define KEY(S,R,P) keycode = (S << 10) | (R << 6) | (1 << P) #define SHIFT(X) ((X >> 10) & 1) #define ROW(X) ((X >> 6) & 15) #define POS(X) (X & 63) #ifdef DEBUG printf("keysym : %ld, %d\n", keysym, pressed); #endif keycode = 0xFFFF; switch (keysym) { case XK_Shift_L : case XK_Shift_R : if (pressed) shift++; else shift--; break; case XK_Control_L : case XK_Control_R : if (pressed) control = 1; else control = 0; break; case XK_Caps_Lock : /* ignore */ break; case XK_Shift_Lock : /* ignore */ break; case XK_Alt_L : case XK_Alt_R : if (pressed) alt = 1; else alt = 0; break; case XK_F1 : CPU_Reset(); break; case XK_F5 : case XK_F2 : case XK_F3 : case XK_F4 : case XK_F6 : case XK_F7 : break; case XK_KP_0 : case XK_KP_1 : case XK_KP_2 : case XK_KP_3 : case XK_KP_4 : case XK_KP_5 : case XK_KP_6 : case XK_KP_7 : case XK_KP_8 : case XK_KP_9 : break; case XK_Home : break; case XK_Insert : break; case XK_Delete : KEY(0,4,1); break; case XK_Left : KEY(1,3,0); break; case XK_Up : KEY(0,2,0); break; case XK_Right : KEY(0,3,0); break; case XK_Down : KEY(1,2,0); break; case XK_Escape : KEY(0,0,5); break; case XK_Tab : break; case XK_exclam : KEY(1,2,1); break; case XK_quotedbl : KEY(1,1,1); break; case XK_numbersign : KEY(1,0,1); break; case XK_dollar : KEY(1,9,2); break; case XK_percent : KEY(1,8,2); break; case XK_ampersand : KEY(1,7,2); break; case XK_quoteright : KEY(1,6,2); break; case XK_at : KEY(0,7,3); break; case XK_parenleft : KEY(1,5,2); break; case XK_parenright : KEY(1,4,2); break; case XK_less : KEY(1,1,2); break; case XK_greater : KEY(1,9,3); break; case XK_equal : KEY(1,0,2); break; case XK_question : KEY(1,8,3); break; case XK_minus : KEY(0,0,2); break; case XK_plus : KEY(1,2,2); break; case XK_asterisk : KEY(1,3,2); break; case XK_slash : KEY(0,8,3); break; case XK_colon : KEY(0,3,2); break; case XK_semicolon : KEY(0,2,2); break; case XK_comma : KEY(0,1,2); break; case XK_period : KEY(0,9,3); break; case XK_underscore : break; case XK_bracketleft : KEY(0,8,0); break; case XK_bracketright :KEY(0,6,0); break; case XK_asciicircum : KEY(0,5,0); break; case XK_backslash : KEY(0,7,0); break; case XK_bar : break; case XK_0 : KEY(0,3,1); break; case XK_1 : KEY(0,2,1); break; case XK_2 : KEY(0,1,1); break; case XK_3 : KEY(0,0,1); break; case XK_4 : KEY(0,9,2); break; case XK_5 : KEY(0,8,2); break; case XK_6 : KEY(0,7,2); break; case XK_7 : KEY(0,6,2); break; case XK_8 : KEY(0,5,2); break; case XK_9 : KEY(0,4,2); break; case XK_space : KEY(0,9,0); break; case XK_Return : KEY(0,6,1); break; case XK_a : KEY(0,6,3); break; case XK_A : KEY(1,6,3); break; case XK_b : KEY(0,5,3); break; case XK_B : KEY(1,5,3); break; case XK_c : KEY(0,4,3); break; case XK_C : KEY(1,4,3); break; case XK_d : KEY(0,3,3); break; case XK_D : KEY(1,3,3); break; case XK_e : KEY(0,2,3); break; case XK_E : KEY(1,2,3); break; case XK_f : KEY(0,1,3); break; case XK_F : KEY(1,1,3); break; case XK_g : KEY(0,0,3); break; case XK_G : KEY(1,0,3); break; case XK_h : KEY(0,9,4); break; case XK_H : KEY(1,9,4); break; case XK_i : KEY(0,8,4); break; case XK_I : KEY(1,8,4); break; case XK_j : KEY(0,7,4); break; case XK_J : KEY(1,7,4); break; case XK_k : KEY(0,6,4); break; case XK_K : KEY(1,6,4); break; case XK_l : KEY(0,5,4); break; case XK_L : KEY(1,5,4); break; case XK_m : KEY(0,4,4); break; case XK_M : KEY(1,4,4); break; case XK_n : KEY(0,3,4); break; case XK_N : KEY(1,3,4); break; case XK_o : KEY(0,2,4); break; case XK_O : KEY(1,2,4); break; case XK_p : KEY(0,1,4); break; case XK_P : KEY(1,1,4); break; case XK_q : KEY(0,0,4); break; case XK_Q : KEY(1,0,4); break; case XK_r : KEY(0,9,5); break; case XK_R : KEY(1,9,5); break; case XK_s : KEY(0,8,5); break; case XK_S : KEY(1,8,5); break; case XK_t : KEY(0,7,5); break; case XK_T : KEY(1,7,5); break; case XK_u : KEY(0,6,5); break; case XK_U : KEY(1,6,5); break; case XK_v : KEY(0,5,5); break; case XK_V : KEY(1,5,5); break; case XK_w : KEY(0,4,5); break; case XK_W : KEY(1,4,5); break; case XK_x : KEY(0,3,5); break; case XK_X : KEY(1,3,5); break; case XK_y : KEY(0,2,5); break; case XK_Y : KEY(1,2,5); break; case XK_z : KEY(0,1,5); break; case XK_Z : KEY(1,1,5); break; default : keycode = 0xFFFF; printf ("Received unhandled key %x\n", (int)keysym); break; } if (keycode != 0xFFFF) if (pressed) { keys_pressed++; if (SHIFT(keycode)) shifted_keys++; keys[ROW(keycode)] &= ~POS(keycode); } else { keys_pressed--; if (SHIFT(keycode)) shifted_keys--; keys[ROW(keycode)] |= POS(keycode); } memory[ 0xb001 ] = keys[ memory[0xb000] & 0x0f ] | ( (keys_pressed ? shifted_keys : shift) ? 0 : 0x80) | (control ? 0 : 0x40); memory[ 0xb002 ] = (memory[ 0xb002 ] & 0xbf) | (alt ? 0 : 0x40 ); #ifdef DEBUG { int i; printf("%04x r:%d p:%d s:%d %02x->%02x ", keysym, ROW(keycode), POS(keycode), SHIFT(keycode), memory[ 0xb000 ], memory[ 0xb001 ]); for (i = 0; i < 10; i++) printf("%02x ", keys[i]); printf("\n"); } #endif } void set_keyboard (UBYTE row) { memory[ 0xb001 ] = keys[row] | ( (keys_pressed ? shifted_keys : shift) ? 0 : 0x80) | (control ? 0 : 0x40); memory[ 0xb002 ] = (memory[ 0xb002 ] & 0xbf) | (alt ? 0 : 0x40 ); /* fprintf(stderr, "%d=%02x ", row, memory[ 0xb001 ] ); */ }