cli added for debug
[fceu.git] / drivers / cli / dos-keyboard.c
diff --git a/drivers/cli/dos-keyboard.c b/drivers/cli/dos-keyboard.c
new file mode 100644 (file)
index 0000000..22ca9e8
--- /dev/null
@@ -0,0 +1,131 @@
+/* FCE Ultra - NES/Famicom Emulator\r
+ *\r
+ * Copyright notice for this file:\r
+ *  Copyright (C) 2002 Ben Parnell\r
+ *\r
+ * This program is free software; you can redistribute it and/or modify\r
+ * it under the terms of the GNU General Public License as published by\r
+ * the Free Software Foundation; either version 2 of the License, or\r
+ * (at your option) any later version.\r
+ *\r
+ * This program is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+ * GNU General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this program; if not, write to the Free Software\r
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r
+ */\r
+\r
+#include <stdio.h>\r
+#include <signal.h>\r
+#include <string.h>\r
+#include <pc.h>\r
+#include <dpmi.h>\r
+#include <go32.h>\r
+#include "keyscan.h"\r
+\r
+static unsigned char lastsc;\r
+static char keybuf[256];\r
+int newk;\r
+\r
+/* Read scan code from port $60 */\r
+/* Acknowledge interrupt( output $20 to port $20) */\r
+\r
+static void ihandler(_go32_dpmi_registers *r)\r
+{\r
+ unsigned char scode=inp(0x60);        /* Get scan code. */\r
+\r
+\r
+ if(scode!=0xE0)\r
+ {\r
+  int offs=0;\r
+\r
+  /* I'm only interested in preserving the independent status of the\r
+     right ALT and CONTROL keys.\r
+  */\r
+  if(lastsc==0xE0)\r
+   if((scode&0x7F)==SCAN_LEFTALT || (scode&0x7F)==SCAN_LEFTCONTROL)\r
+    offs=0x80;\r
+  \r
+\r
+  keybuf[(scode&0x7f)|offs]=((scode&0x80)^0x80);\r
+  newk++;\r
+ }\r
+ lastsc=scode;\r
+\r
+ outp(0x20,0x20);      /* Acknowledge interrupt. */\r
+}\r
+\r
+static _go32_dpmi_seginfo KBIBack,KBIBackRM;\r
+static _go32_dpmi_seginfo KBI,KBIRM;\r
+static _go32_dpmi_registers KBIRMRegs;\r
+static int initdone=0;\r
+\r
+int InitKeyboard(void)\r
+{\r
+ /* I'll assume that the keyboard is in the correct scancode mode(translated\r
+    mode 2, I think).\r
+ */\r
+  newk=0;\r
+  memset(keybuf,0,sizeof(keybuf));\r
+  KBIRM.pm_offset=KBI.pm_offset=(int)ihandler;\r
+  KBIRM.pm_selector=KBI.pm_selector=_my_cs();\r
+\r
+  _go32_dpmi_get_real_mode_interrupt_vector(9,&KBIBackRM);\r
+  _go32_dpmi_allocate_real_mode_callback_iret(&KBIRM, &KBIRMRegs);\r
+  _go32_dpmi_set_real_mode_interrupt_vector(9,&KBIRM);\r
+\r
+  _go32_dpmi_get_protected_mode_interrupt_vector(9,&KBIBack);\r
+  _go32_dpmi_allocate_iret_wrapper(&KBI);\r
+  _go32_dpmi_set_protected_mode_interrupt_vector(9,&KBI);\r
+  lastsc=0;\r
+  initdone=1;\r
+  return(1);\r
+}\r
+\r
+void KillKeyboard(void)\r
+{\r
+ if(initdone)\r
+ {\r
+  _go32_dpmi_set_protected_mode_interrupt_vector(9,&KBIBack);\r
+  _go32_dpmi_free_iret_wrapper(&KBI);\r
+\r
+  _go32_dpmi_set_real_mode_interrupt_vector(9,&KBIBackRM);\r
+  _go32_dpmi_free_real_mode_callback(&KBIRM);\r
+  initdone=0;\r
+ }\r
+}\r
+\r
+/* In FCE Ultra, it doesn't matter if the key states change\r
+   in the middle of the keyboard handling code.  If you want\r
+   to use this code elsewhere, you may want to memcpy() keybuf\r
+   to another buffer and return that when GetKeyboard() is\r
+   called.\r
+*/\r
+\r
+char *GetKeyboard(void)\r
+{\r
+ return keybuf;\r
+}\r
+\r
+/* Returns 1 on new scan codes generated, 0 on no new scan codes. */\r
+int UpdateKeyboard(void)\r
+{\r
+ int t=newk;\r
+\r
+ if(t)\r
+ {\r
+  asm volatile(\r
+        "subl %%eax,_newk\n\t"\r
+       :\r
+       : "a" (t)\r
+  );\r
+\r
+  if(keybuf[SCAN_LEFTCONTROL] && keybuf[SCAN_C])\r
+   raise(SIGINT);\r
+  return(1);\r
+ }\r
+ return(0);\r
+}\r