diff options
Diffstat (limited to 'arm9/source/keyboard.c')
-rw-r--r-- | arm9/source/keyboard.c | 353 |
1 files changed, 0 insertions, 353 deletions
diff --git a/arm9/source/keyboard.c b/arm9/source/keyboard.c deleted file mode 100644 index 76f16e6..0000000 --- a/arm9/source/keyboard.c +++ /dev/null @@ -1,353 +0,0 @@ -/* - ds81 - Nintendo DS ZX81 emulator. - - Copyright (C) 2006 Ian Cowburn <ianc@noddybox.co.uk> - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - - $Id$ -*/ - -#include <nds.h> - -#include "ds81_global.h" - -#include "keyboard.h" -#include "framebuffer.h" -#include "keyb_bin.h" - -/* ---------------------------------------- STATIC DATA -*/ -static uint16 white = FB_RGB(31, 31, 31); -static uint16 black = FB_RGB(0, 0, 0); - -static struct -{ - int state; - int new_state; - int handled; - int is_sticky; -} key_state[NUM_SOFT_KEYS]; - -static SoftKey pad_left_key = SK_5; -static SoftKey pad_right_key = SK_8; -static SoftKey pad_up_key = SK_7; -static SoftKey pad_down_key = SK_6; -static SoftKey pad_A_key = SK_0; -static SoftKey pad_B_key = SK_NEWLINE; -static SoftKey pad_X_key = NUM_SOFT_KEYS; -static SoftKey pad_Y_key = NUM_SOFT_KEYS; -static SoftKey pad_R_key = NUM_SOFT_KEYS; -static SoftKey pad_L_key = NUM_SOFT_KEYS; -static SoftKey pad_start_key = NUM_SOFT_KEYS; -static SoftKey pad_select_key = NUM_SOFT_KEYS; - -#define CLEAR_STATE(SHORTCUT) \ - do \ - { \ - if (SHORTCUT != NUM_SOFT_KEYS && \ - !key_state[SHORTCUT].handled) \ - { \ - key_state[SHORTCUT].new_state = FALSE; \ - } \ - } while(0) - -#define CHECK_STATE(KEYS,BIT,CODE,SHORTCUT,USE_SHORTCUT) \ - do \ - { \ - key_state[CODE].new_state = (KEYS & BIT); \ - if (USE_SHORTCUT && SHORTCUT != NUM_SOFT_KEYS && \ - !key_state[SHORTCUT].handled && (KEYS & BIT)) \ - { \ - key_state[SHORTCUT].new_state = TRUE; \ - } \ - } while(0) - - -static const char *keynames[]= -{ - "1", "2", "3", "4", "5", - "6", "7", "8", "9", "0", - "Q", "W", "E", "R", "T", - "Y", "U", "I", "O", "P", - "A", "S", "D", "F", "G", - "H", "J", "K", "L", "NEWLINE", - "SHIFT", "Z", "X", "C", "V", - "B", "N", "M", "PERIOD", "SPACE", - - "ABOUT", - "CONFIG", - "JOYPAD UP", - "JOYPAD DOWN", - "JOYPAD LEFT", - "JOYPAD RIGHT", - "A BUTTON", - "B BUTTON", - "X BUTTON", - "Y BUTTON", - "RIGHT SHOULDER BUTTON", - "LEFT SHOULDER BUTTON", - "START BUTTON", - "SELECT BUTTON" -}; - -/* ---------------------------------------- PRIVATE INTERFACES -*/ -static SoftKey LocatePress(const touchPosition *p) -{ - int kx=0,ky=0; - int py=0; - SoftKey key = NUM_SOFT_KEYS; - - if (p->py > 36 && p->px > 2) - { - kx = (p->px - 3) / 25; - ky = p->py - 37; - - py = ky % 30; - ky /= 30; - - if (py<17 && kx >= 0 && kx<10 && ky>=0 && ky<=4) - { - key = kx + ky * 10; - } - } - - if (key>SK_SPACE) - { - key = NUM_SOFT_KEYS; - } - - return key; -} - - -static int GetEvent(SoftKeyEvent *ev, int map) -{ - static SoftKey last = NUM_SOFT_KEYS; - static int poll_index = -1; - - /* Read the keys if this is a new loop - */ - if (poll_index == -1) - { - int f; - uint32 keys; - - keys = keysHeld(); - - /* Clear the non-sticky keys - */ - for(f=SK_1; f<=SK_CONFIG; f++) - { - key_state[f].handled = FALSE; - - if (key_state[f].is_sticky) - { - key_state[f].new_state = key_state[f].state; - } - else - { - key_state[f].new_state = FALSE; - } - } - - /* Check the soft keyboard - */ - if (keys & KEY_TOUCH) - { - touchPosition tp=touchReadXY(); - - if (tp.py<21 || tp.py>165) - { - key_state[SK_CONFIG].new_state = TRUE; - } - else - { - SoftKey press; - - press = LocatePress(&tp); - - if (press != NUM_SOFT_KEYS) - { - key_state[press].handled = TRUE; - - if (key_state[press].is_sticky) - { - if (last != press) - { - key_state[press].new_state = - !key_state[press].state; - } - } - else - { - key_state[press].new_state = TRUE; - } - - last = press; - } - } - } - else - { - last = NUM_SOFT_KEYS; - } - - /* Check non soft-keyboard controls - */ - CHECK_STATE(keys, KEY_A, SK_PAD_A, pad_A_key, map); - CHECK_STATE(keys, KEY_B, SK_PAD_B, pad_B_key, map); - CHECK_STATE(keys, KEY_X, SK_PAD_X, pad_X_key, map); - CHECK_STATE(keys, KEY_Y, SK_PAD_Y, pad_Y_key, map); - CHECK_STATE(keys, KEY_R, SK_PAD_R, pad_R_key, map); - CHECK_STATE(keys, KEY_L, SK_PAD_L, pad_L_key, map); - CHECK_STATE(keys, KEY_START, SK_PAD_START, pad_start_key, map); - CHECK_STATE(keys, KEY_SELECT, SK_PAD_SELECT, pad_select_key, map); - CHECK_STATE(keys, KEY_UP, SK_PAD_UP, pad_up_key, map); - CHECK_STATE(keys, KEY_DOWN, SK_PAD_DOWN, pad_down_key, map); - CHECK_STATE(keys, KEY_LEFT, SK_PAD_LEFT, pad_left_key, map); - CHECK_STATE(keys, KEY_RIGHT, SK_PAD_RIGHT, pad_right_key, map); - - /* Reset key event poll index - */ - poll_index = 0; - - /* Update any on-screen indicators - */ - for(f=SK_1; f<SK_CONFIG; f++) - { - if (key_state[f].state != key_state[f].new_state) - { - int x,y; - - x = 3 + (f % 10) * 25; - y = 37 + (f / 10) * 30; - - FB_Box(x, y, 25, 18, key_state[f].new_state ? white:black); - } - } - } - - while(poll_index < NUM_SOFT_KEYS && - key_state[poll_index].state == key_state[poll_index].new_state) - { - poll_index++; - } - - if (poll_index < NUM_SOFT_KEYS) - { - key_state[poll_index].state = key_state[poll_index].new_state; - - ev->key = poll_index; - ev->pressed = key_state[poll_index].state; - - return TRUE; - } - else - { - poll_index = -1; - return FALSE; - } -} - - -/* ---------------------------------------- PUBLIC INTERFACES -*/ -void SK_DisplayKeyboard(uint16 *vram) -{ - sImage img; - - loadPCX(keyb_bin,&img); - image8to16(&img); - dmaCopy(img.data8,vram,SCREEN_WIDTH*SCREEN_HEIGHT*2); -} - - -int SK_GetEvent(SoftKeyEvent *ev) -{ - return GetEvent(ev,TRUE); -} - - -int SK_GetBareEvent(SoftKeyEvent *ev) -{ - return GetEvent(ev,FALSE); -} - - -void SK_SetSticky(SoftKey key, int is_sticky) -{ - key_state[key].is_sticky = is_sticky; - - if (!is_sticky) - { - key_state[key].new_state = FALSE; - } -} - - -void SK_DefinePad(SoftKey pad, SoftKey key) -{ - switch(pad) - { - case SK_PAD_LEFT: - pad_left_key = key; - break; - case SK_PAD_RIGHT: - pad_right_key = key; - break; - case SK_PAD_UP: - pad_up_key = key; - break; - case SK_PAD_DOWN: - pad_down_key = key; - break; - case SK_PAD_A: - pad_A_key = key; - break; - case SK_PAD_B: - pad_B_key = key; - break; - case SK_PAD_X: - pad_X_key = key; - break; - case SK_PAD_Y: - pad_Y_key = key; - break; - case SK_PAD_R: - pad_R_key = key; - break; - case SK_PAD_L: - pad_L_key = key; - break; - case SK_PAD_START: - pad_start_key = key; - break; - case SK_PAD_SELECT: - pad_select_key = key; - break; - default: - break; - } -} - - -const char *SK_KeyName(SoftKey k) -{ - return keynames[k]; -} - - |