📄 main.c
字号:
#include <stdio.h>#include <stdlib.h>#include <string.h>char *strdup();#include <stdarg.h>#include <signal.h>#include "input.h"#include "rc.h"#include "hw.h"#include "Version"static char *defaultconfig[] ={ "bind esc quit", "bind up +up", "bind down +down", "bind left +left", "bind right +right", "bind d +a", "bind s +b", "bind enter +start", "bind space +select", "bind tab +select", "bind joyup +up", "bind joydown +down", "bind joyleft +left", "bind joyright +right", "bind joy0 +b", "bind joy1 +a", "bind joy2 +select", "bind joy3 +start", "bind 1 \"set saveslot 1\"", "bind 2 \"set saveslot 2\"", "bind 3 \"set saveslot 3\"", "bind 4 \"set saveslot 4\"", "bind 5 \"set saveslot 5\"", "bind 6 \"set saveslot 6\"", "bind 7 \"set saveslot 7\"", "bind 8 \"set saveslot 8\"", "bind 9 \"set saveslot 9\"", "bind 0 \"set saveslot 0\"", "bind ins savestate", "bind del loadstate", "source gnuboy.rc", NULL};static void banner(){ printf("\ngnuboy " VERSION "\n");}static void copyright(){ banner(); printf("Copyright (C) 2000-2001 Laguna and Gilgamesh\n""Portions contributed by other authors; see CREDITS for details.\n""\n""This program is free software; you can redistribute it and/or modify\n""it under the terms of the GNU General Public License as published by\n""the Free Software Foundation; either version 2 of the License, or\n""(at your option) any later version.\n""\n""This program is distributed in the hope that it will be useful,\n""but WITHOUT ANY WARRANTY; without even the implied warranty of\n""MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n""GNU General Public License for more details.\n""\n""You should have received a copy of the GNU General Public License\n""along with this program; if not, write to the Free Software\n""Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\n""\n");}static void usage(char *name){ copyright(); printf("Type %s --help for detailed help.\n\n", name); exit(1);}static void copying(){ copyright(); exit(0);}static void help(char *name){ banner(); printf("Usage: %s [options] romfile\n", name); printf("\n"" --source FILE read rc commands from FILE\n"" --bind KEY COMMAND bind KEY to perform COMMAND\n"" --VAR=VALUE set rc variable VAR to VALUE\n"" --VAR set VAR to 1 (turn on boolean options)\n"" --no-VAR set VAR to 0 (turn off boolean options)\n"" --showvars list all available rc variables\n"" --help display this help and exit\n"" --version output version information and exit\n"" --copying show copying permissions\n"""); exit(0);}static void version(char *name){ printf("%s-" VERSION "\n", name); exit(0);}void doevents(){ event_t ev; int st; ev_poll(); while (ev_getevent(&ev)) { if (ev.type != EV_PRESS && ev.type != EV_RELEASE) continue; st = (ev.type != EV_RELEASE);
switch (ev.code)
{
case K_UP:
pad_set(PAD_UP, st); break;
case K_DOWN:
pad_set(PAD_DOWN, st); break;
case K_LEFT:
pad_set(PAD_LEFT, st); break;
case K_RIGHT:
pad_set(PAD_RIGHT, st); break;
case 's':
pad_set(PAD_A, st); break;
case 'd':
pad_set(PAD_B, st); break;
case K_ENTER:
pad_set(PAD_START, st); break;
case K_SPACE:
pad_set(PAD_SELECT, st); break;
case K_ESC:
exit_emulator();
case K_CTRL:
if (st)
set_paused(1);
break;
};
}}void doevents_paused()
{
ev_poll_paused();
}
static void shutdown(){ vid_close(); pcm_close();}void die(char *fmt, ...){
va_list ap; va_start(ap, fmt); vfprintf(stderr, fmt, ap); va_end(ap); exit(1);
}static int bad_signals[] ={ /* These are all standard, so no need to #ifdef them... */ SIGINT, SIGSEGV, SIGTERM, SIGFPE, SIGABRT, SIGILL,#ifdef SIGQUIT SIGQUIT,#endif#ifdef SIGPIPE SIGPIPE,#endif 0};static void fatalsignal(int s){
gb_leave(-2);
// die("Signal %d\n", s);}static void catch_signals(){ int i; for (i = 0; bad_signals[i]; i++) signal(bad_signals[i], fatalsignal);}static char *base(char *s){ char *p; p = strrchr(s, '/'); if (p) return p+1; return s;}int gb_main(int argc, char *argv[]){ int i; char *opt, *arg, *cmd, *s, *rom = 0; /* Avoid initializing video if we don't have to */
/* If we have special perms, drop them ASAP! */ vid_preinit();
/* FIXME - make interface modules responsible for atexit() */ atexit(shutdown); catch_signals(); vid_init(); pcm_init(); loader_init(rom);
emu_reset(); emu_run(); /* never reached */ return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -