int main() { int clk = 0; void *state = initAndResetChip(); /* set up memory for user program */ init_monitor(); /* emulate the 6502! */ for (;;) { step(state); clk = !clk; if (clk) handle_monitor(state); // chipStatus(state); //if (!(cycle % 1000)) printf("%d\n", cycle); }; }
int main(int argc, char **argv) { struct timespec timeout = {SELECT_TIMEOUT_SECONDS, 0}; struct sigaction sigact; sigset_t select_sigset; int exitval = EXIT_FAILURE; int syslog_options = LOG_ODELAY | LOG_PERROR; int settings_retval; parse_args(argc, argv); openlog(program_invocation_short_name, syslog_options, LOG_DAEMON); syslog(LOG_INFO, "starting"); memset(&sigact, 0, sizeof(struct sigaction)); sigact.sa_handler = &sigterm_handler; if (sigfillset(&sigact.sa_mask) == -1) { syslog(LOG_ERR, "sigfillset: %s", strerror(errno)); goto out; } if (sigaction(SIGTERM, &sigact, NULL) == -1) { syslog(LOG_ERR, "sigaction SIGTERM: %s", strerror(errno)); goto out; } if (!is_daemon && sigaction(SIGINT, &sigact, NULL) == -1) { syslog(LOG_ERR, "sigaction SIGINT: %s", strerror(errno)); goto out; } if (sigemptyset(&select_sigset) == -1) { syslog(LOG_ERR, "sigemptyset: %s", strerror(errno)); goto out; } if (sigaddset(&select_sigset, SIGTERM) == -1) { syslog(LOG_ERR, "sigaddset SIGTERM: %s", strerror(errno)); goto out; } if (!is_daemon && sigaddset(&select_sigset, SIGINT) == -1) { syslog(LOG_ERR, "sigaddset SIGINT: %s", strerror(errno)); goto out; } settings_retval = settings_read(&settings); switch (settings_retval) { case 0: break; case -1: syslog(LOG_ERR, "settings_read: %s", strerror(errno)); goto out; default: syslog(LOG_ERR, "settings_read: %s", settings_strerror(settings_retval)); goto out; } if ((monitor_fd = open_evdev_by_name(settings.monitor_name)) == -1) { syslog(LOG_ERR, "open monitor %s: %s", settings.monitor_name, strerror(errno)); goto out; } if ((filter_fd = open_evdev_by_name(settings.filter_name)) == -1) { syslog(LOG_ERR, "open filter %s: %s", settings.filter_name, strerror(errno)); goto out; } if (ioctl(filter_fd, EVIOCGRAB, 1) == -1) { syslog(LOG_ERR, "grab filter: %s", strerror(errno)); goto out; } if ((clone_fd = clone_evdev(filter_fd, &settings.clone_id, settings.clone_name)) == -1) { syslog(LOG_ERR, "clone_evdev: %s", strerror(errno)); goto out; } if (is_daemon && daemonize() == -1) { syslog(LOG_ERR, "daemonize: %s", strerror(errno)); goto out; } syslog(LOG_INFO, "started"); while (is_running) { fd_set rfds; FD_ZERO(&rfds); FD_SET(monitor_fd, &rfds); FD_SET(filter_fd, &rfds); switch (pselect(filter_fd + 1, &rfds, NULL, NULL, &timeout, &select_sigset)) { case 0: break; case -1: syslog(LOG_ERR, "select: %s", strerror(errno)); goto out; default: if (FD_ISSET(filter_fd, &rfds)) { if (handle_filter() == -1) { goto out; } } else if (FD_ISSET(monitor_fd, &rfds)) { if (handle_monitor() == -1) { goto out; } } break; } } syslog(LOG_INFO, "stopped"); syslog(LOG_INFO, "terminating"); exitval = EXIT_SUCCESS; out: settings_free(&settings); if (clone_fd != -1) { if (ioctl(clone_fd, UI_DEV_DESTROY) == -1) { syslog(LOG_ERR, "destroy clone: %s", strerror(errno)); exitval = EXIT_FAILURE; } if (close(clone_fd) == -1) { syslog(LOG_ERR, "close clone: %s", strerror(errno)); exitval = EXIT_FAILURE; } } if (filter_fd != -1) { if (ioctl(filter_fd, EVIOCGRAB, 0) == -1) { syslog(LOG_ERR, "release filter: %s", strerror(errno)); exitval = EXIT_FAILURE; } if (close(filter_fd) == -1) { syslog(LOG_ERR, "close filter: %s", strerror(errno)); exitval = EXIT_FAILURE; } } if (monitor_fd != -1) { if (close(monitor_fd) == -1) { syslog(LOG_ERR, "close monitor: %s", strerror(errno)); exitval = EXIT_FAILURE; } } syslog(LOG_INFO, "terminated"); return exitval; }