www.pudn.com > virtual_gameboy-0.8.8.zip > KEYS.C
/* Keys.c This file is part of the VGB-DOS project Copyright (C) Marcel de Kogel (m.dekogel@student.utwente.nl), 1996 You may not use this file for commercial purposes Please notify me if you make any changes to this file */ #include#include #include #include #include #include int _crt0_startup_flags = _CRT0_FLAG_NONMOVE_SBRK | _CRT0_FLAG_LOCK_MEMORY | _CRT0_FLAG_DROP_EXE_SUFFIX; static __volatile__ int key=0; static _go32_dpmi_seginfo newirqkeyb,oldirqkeyb; void keyb_interrupt (void) { unsigned code; static int extkey; code=inportb (0x60); /* get scancode */ if (code<0xE0) /* ignore codes >0xE0 */ { if (code & 0x80) /* key is released */ key=0; else /* key is pressed */ { if (extkey) key=code+128; else key=code; } extkey=0; } else if (code==0xE0) extkey=1; } static int _getkey (char *s) { printf ("Press key for %s\n",s); key=0; while (!key); _farpokew (_dos_ds,0x41A,_farpeekw(_dos_ds,0x41C)); /* clear buffer */ return key; } int main (int argc,char *argv[]) { int left,right,up,down,firea,fireb,start,select; _go32_dpmi_get_protected_mode_interrupt_vector (9,&oldirqkeyb); newirqkeyb.pm_offset=(int)keyb_interrupt; newirqkeyb.pm_selector=_go32_my_cs(); _go32_dpmi_chain_protected_mode_interrupt_vector (9,&newirqkeyb); left=_getkey ("LEFT"); right=_getkey ("RIGHT"); up=_getkey ("UP"); down=_getkey ("DOWN"); firea=_getkey ("BUTTON A"); fireb=_getkey ("BUTTON B"); start=_getkey ("START"); select=_getkey ("SELECT"); printf ("\n-keys %02X%02X%02X%02X%02X%02X%02X%02X\n", left,right,up,down,firea,fireb,start,select); _go32_dpmi_set_protected_mode_interrupt_vector (9,&oldirqkeyb); return 0; }