nuclear@0: /* nuclear@2: Copyright 2004-2012 John Tsiombikas nuclear@0: nuclear@2: This file is part of gbasys, a library for GameBoy Advance development. nuclear@0: nuclear@0: This program is free software; you can redistribute it and/or modify nuclear@0: it under the terms of the GNU General Public License as published by nuclear@0: the Free Software Foundation; either version 2 of the License, or nuclear@0: (at your option) any later version. nuclear@0: nuclear@0: This program is distributed in the hope that it will be useful, nuclear@0: but WITHOUT ANY WARRANTY; without even the implied warranty of nuclear@0: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the nuclear@0: GNU General Public License for more details. nuclear@0: nuclear@0: You should have received a copy of the GNU General Public License nuclear@0: along with this program; if not, write to the Free Software nuclear@0: Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA nuclear@0: */ nuclear@0: nuclear@0: #include nuclear@0: #include "term.h" nuclear@0: #include "input.h" nuclear@0: #include "signal.h" nuclear@0: #include "intr.h" nuclear@0: nuclear@0: static struct key_node *key_queue, *key_queue_tail; nuclear@0: nuclear@0: static void key_handler(void); nuclear@0: nuclear@0: void term_init(void) { nuclear@0: mask(INTR_KEY); nuclear@0: interrupt(INTR_KEY, key_handler); nuclear@0: unmask(INTR_KEY); nuclear@0: nuclear@0: key_queue = malloc(sizeof *key_queue); nuclear@0: key_queue->next = 0; nuclear@0: key_queue_tail = key_queue; nuclear@0: } nuclear@0: nuclear@0: static void noop(int sig) {} nuclear@0: nuclear@0: int gba_getc(FILE *fp) { nuclear@0: struct key_node *tmp; nuclear@0: int c; nuclear@0: nuclear@0: if(fp != stdin) panic("getc: only stdin valid"); nuclear@2: nuclear@0: save_signal(SIGIO); nuclear@0: signal(SIGIO, noop); nuclear@0: while(!key_queue->next) pause(); nuclear@0: restore_signal(SIGIO); nuclear@0: nuclear@0: tmp = key_queue; nuclear@0: key_queue = key_queue->next; nuclear@0: free(tmp); nuclear@0: return key_queue->key; nuclear@0: } nuclear@0: nuclear@0: static void key_handler(void) { nuclear@0: int i, state; nuclear@0: static unsigned long prev; nuclear@0: unsigned long time; nuclear@0: nuclear@0: time = get_millisec(); nuclear@0: if(time - prev < 100) return; nuclear@0: prev = time; nuclear@0: nuclear@0: state = get_key_state(KEY_ALL); nuclear@0: for(i=0; ikey = bit; nuclear@0: key->next = 0; nuclear@0: key_queue_tail->next = key; nuclear@0: key_queue_tail = key; nuclear@0: } nuclear@0: } nuclear@0: raise(SIGIO); nuclear@0: }