Annotation of nono/cli/cli_app.cpp, revision 1.1

1.1     ! root        1: //
        !             2: // nono
        !             3: // Copyright (C) 2018 [email protected]
        !             4: //
        !             5: 
        !             6: #include "header.h"
        !             7: #include "mainapp.h"
        !             8: #include "mpu.h"
        !             9: #include "pluto.h"
        !            10: #include "rtc.h"
        !            11: #include "vm.h"
        !            12: 
        !            13: // wxApp と相似にするためのクラス
        !            14: class CLIApp
        !            15: {
        !            16:  public:
        !            17:        bool OnInit();
        !            18:        bool Parse();
        !            19:        void OnCreate();
        !            20: 
        !            21:        int ac;
        !            22:        char **av;
        !            23: };
        !            24: 
        !            25: // コマンドラインオプションとか
        !            26: const char *human68k_file = NULL;
        !            27: char human68k_arg[256];
        !            28: 
        !            29: void
        !            30: usage()
        !            31: {
        !            32:        printf("%s [<options>]\n", getprogname());
        !            33:        printf(" -b <addr>  break point\n");
        !            34:        printf(" -B <rom#>  benchmark mode\n");
        !            35:        printf(" -c <dir>   vm directory\n");
        !            36:        printf(" -d         debugger prompt on startup\n");
        !            37:        printf(" -f         fast mode\n");
        !            38:        printf(" -L <name>=<loglevel> loglevel (-L help displays names)\n");
        !            39:        printf(" -X <human68k executable> human68k console emulation\n");
        !            40:        printf(" -v         version\n");
        !            41: }
        !            42: 
        !            43: int
        !            44: main(int ac, char *av[])
        !            45: {
        !            46:        CLIApp *app = new CLIApp();
        !            47: 
        !            48:        // wxApp とよく似せるため
        !            49:        app->ac = ac;
        !            50:        app->av = av;
        !            51:        if (app->OnInit()) {
        !            52:                return 1;
        !            53:        }
        !            54:        return 0;
        !            55: }
        !            56: 
        !            57: // ここがエントリポイント(のつもり)
        !            58: bool
        !            59: CLIApp::OnInit()
        !            60: {
        !            61:        debug_breakaddr = 0xffffffff;
        !            62:        vmdir = ".";
        !            63: 
        !            64:        if (!Parse()) {
        !            65:                return false;
        !            66:        }
        !            67: 
        !            68:        // CLI 版では常にコンソールに(も)ログを出力
        !            69:        if (!main_init<true>(true)) {
        !            70:                return false;
        !            71:        }
        !            72: 
        !            73:        // メインウィンドウに相当するところ
        !            74:        OnCreate();
        !            75: 
        !            76:        return true;
        !            77: }
        !            78: 
        !            79: // 引数をパースする。
        !            80: // 知らない引数とかがあればこちらで usage を表示して false を返す。
        !            81: bool
        !            82: CLIApp::Parse()
        !            83: {
        !            84:        int b;
        !            85:        int c;
        !            86: 
        !            87:        while ((c = getopt(ac, av, "b:B:c:dfL:X:v")) != -1) {
        !            88:                switch (c) {
        !            89:                 case 'b':
        !            90:                        debug_breakaddr = (uint32)strtoul(optarg, NULL, 16);
        !            91:                        break;
        !            92: 
        !            93:                 case 'B':
        !            94:                        b = atoi(optarg);
        !            95:                        if (b < 2 || b > 6) {
        !            96:                                fprintf(stderr, "-B <benchmark_mode>: 2..6\n");
        !            97:                                return false;
        !            98:                        }
        !            99:                        PlutoDevice::benchmark_mode = b;
        !           100:                        break;
        !           101: 
        !           102:                 case 'c':
        !           103:                        vmdir = std::string(optarg);
        !           104:                        break;
        !           105: 
        !           106:                 case 'd':
        !           107:                        debug_on_start = true;
        !           108:                        break;
        !           109: 
        !           110:                 case 'f':
        !           111:                        fast_mode = true;
        !           112:                        break;
        !           113: 
        !           114:                 case 'L':
        !           115:                        if (logopt[0] != '\0') {
        !           116:                                strlcat(logopt, ",", sizeof(logopt));
        !           117:                        }
        !           118:                        strlcat(logopt, optarg, sizeof(logopt));
        !           119:                        break;
        !           120: 
        !           121:                 case 'X':
        !           122:                        human68k_file = optarg;
        !           123:                        for (int i = optind; i < ac; i++) {
        !           124:                                if (i != optind) {
        !           125:                                        strlcat(human68k_arg, " ", sizeof(human68k_arg));
        !           126:                                }
        !           127:                                strlcat(human68k_arg, av[i], sizeof(human68k_arg));
        !           128:                        }
        !           129:                        optind = ac;
        !           130:                        break;
        !           131: 
        !           132:                 case 'v':
        !           133:                        fprintf(stderr, "nono-cli version %d.%d.%d\n",
        !           134:                                NONO_MAJOR_VER, NONO_MINOR_VER, NONO_PATCH_VER);
        !           135:                        exit(0);
        !           136: 
        !           137:                 default:
        !           138:                        usage();
        !           139:                        return false;
        !           140:                }
        !           141:        }
        !           142: 
        !           143:        return true;
        !           144: }
        !           145: 
        !           146: // メインウィンドウ作成後のイベントに相当するところ
        !           147: void
        !           148: CLIApp::OnCreate()
        !           149: {
        !           150:        // 時刻開始?
        !           151:        // なるべく VM が開始する直前にしたい。
        !           152:        gRTC->InitRTC();
        !           153: 
        !           154:        // VM 実行開始
        !           155:        gVM->PowerButton();
        !           156: 
        !           157:        // ?
        !           158:        for (;;) {
        !           159:                sleep(1);
        !           160:        }
        !           161: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.