Changeset b909777 in buchla-emu for emu/main.c


Ignore:
Timestamp:
07/20/2017 04:19:40 PM (7 years ago)
Author:
Thomas Lopatic <thomas@…>
Branches:
master
Children:
51b6cfd
Parents:
a06aa8b
Message:

Parse command line options. Load BIOS file.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • emu/main.c

    ra06aa8b rb909777  
    1818#include <all.h>
    1919
     20typedef struct {
     21        const char *name;
     22        bool *flag;
     23} verb_flag_t;
     24
     25static verb_flag_t verb_flags[] = {
     26        { "sdl", &sdl_verbose },
     27        { "cpu", &cpu_verbose },
     28        { "fpu", &fpu_verbose },
     29        { "vid", &vid_verbose },
     30        { "tim", &tim_verbose },
     31        { "lcd", &lcd_verbose },
     32        { "ser", &ser_verbose },
     33        { "mid", &mid_verbose },
     34        { "fdd", &fdd_verbose },
     35        { "snd", &snd_verbose },
     36        { "led", &led_verbose },
     37        { "kbd", &kbd_verbose }
     38};
     39
     40static const char *bios = "bios.abs";
     41
     42static void usage(FILE *fh)
     43{
     44        fprintf(fh, "usage: buchla [-h] [-v comp [-v comp [...]]] [-b bios]\n");
     45        fprintf(fh, "where comp is one of: ");
     46
     47        for (int32_t i = 0; i < ARRAY_COUNT(verb_flags); ++i) {
     48                fprintf(fh, "%s, ", verb_flags[i].name);
     49        }
     50
     51        fprintf(fh, "all\n");
     52}
     53
     54static void parse_args(int32_t argc, char *argv[])
     55{
     56        for (int32_t i = 0; i < argc; ++i) {
     57                if (strcmp(argv[i], "-h") == 0) {
     58                        usage(stdout);
     59                        exit(0);
     60                }
     61
     62                if (strcmp(argv[i], "-b") == 0) {
     63                        if (++i == argc) {
     64                                usage(stderr);
     65                                fprintf(stderr, "missing argument to -b\n");
     66                                exit(1);
     67                        }
     68
     69                        bios = argv[i];
     70                        continue;
     71                }
     72
     73                if (strcmp(argv[i], "-v") == 0) {
     74                        if (++i == argc) {
     75                                usage(stderr);
     76                                fprintf(stderr, "missing argument to -v\n");
     77                                exit(1);
     78                        }
     79
     80                        int32_t k;
     81
     82                        if (strcmp(argv[i], "all") == 0) {
     83                                for (k = 0; k < ARRAY_COUNT(verb_flags); ++k) {
     84                                        *verb_flags[k].flag = true;
     85                                }
     86
     87                                continue;
     88                        }
     89
     90                        for (k = 0; k < ARRAY_COUNT(verb_flags); ++k) {
     91                                if (strcmp(argv[i], verb_flags[k].name) == 0) {
     92                                        *verb_flags[k].flag = true;
     93                                        break;
     94                                }
     95                        }
     96
     97                        if (k == ARRAY_COUNT(verb_flags)) {
     98                                usage(stderr);
     99                                fprintf(stderr, "invalid argument to -v: %s\n", argv[i]);
     100                                exit(1);
     101                        }
     102
     103                        continue;
     104                }
     105        }
     106}
     107
    20108int32_t main(int32_t argc, char *argv[])
    21109{
    22         (void)argc;
    23         (void)argv;
    24 
     110        parse_args(argc, argv);
    25111        sdl_init();
    26112
    27         cpu_verbose = true;
    28         cpu_loop();
     113        cpu_loop(bios);
    29114
    30115        sdl_quit();
Note: See TracChangeset for help on using the changeset viewer.