11 #include <sys/select.h>
15 static void sighandler(int s);
16 static int parse_args(int argc, char **argv);
18 static const char *rom_fname = "rom";
19 static const char *termdev = "/dev/tty";
22 static struct termios saved_term;
23 static volatile int quit;
25 int main(int argc, char **argv)
32 struct timeval tv = {0, 0};
34 if(parse_args(argc, argv) == -1) {
38 if((fd = open(rom_fname, O_RDONLY)) == -1) {
39 fprintf(stderr, "failed to open ROM image: %s: %s\n", rom_fname, strerror(errno));
44 if((rom = mmap(0, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0)) == (void*)-1) {
45 fprintf(stderr, "failed to map ROM image\n");
49 if((ttyfd = open(termdev, O_RDWR)) == -1) {
50 fprintf(stderr, "failed to open terminal device: %s: %s\n", termdev, strerror(errno));
53 if(tcgetattr(ttyfd, &term) == -1) {
54 perror("failed to get terminal attributes");
58 term.c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL | IXON);
59 term.c_oflag &= ~OPOST;
60 term.c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN);
61 term.c_cflag = (term.c_cflag & ~(CSIZE | PARENB)) | CS8;
64 tcsetattr(ttyfd, TCSAFLUSH, &term);
66 if(emu_init(rom, st.st_size) == -1) {
70 signal(SIGINT, sighandler);
71 signal(SIGQUIT, sighandler);
72 signal(SIGTERM, sighandler);
73 signal(SIGSEGV, sighandler);
74 signal(SIGILL, sighandler);
78 FD_SET(ttyfd, &rdset);
82 res = select(maxfd + 1, &rdset, 0, 0, &tv);
86 if(FD_ISSET(ttyfd, &rdset)) {
90 while((rd = read(ttyfd, buf, sizeof buf)) > 0) {
95 if(!rd) break; /* EOF */
105 tcsetattr(ttyfd, TCSAFLUSH, &saved_term);
109 void emu_serout(int port, int c)
114 static void sighandler(int s)
119 static int parse_args(int argc, char **argv)
123 for(i=1; i<argc; i++) {
124 if(argv[i][0] == '-') {
125 if(argv[i][2] == 0) {
129 fprintf(stderr, "-r must be followed by a rom image file\n");
136 fprintf(stderr, "invalid option: %s\n", argv[i]);
140 fprintf(stderr, "invalid option: %s\n", argv[i]);
144 fprintf(stderr, "unexpected argument: %s\n", argv[i]);