Annotation of nono/vm/vm.h, revision 1.1.1.9

1.1       root        1: //
                      2: // nono
1.1.1.3   root        3: // Copyright (C) 2020 nono project
                      4: // Licensed under nono-license.txt
1.1       root        5: //
                      6: 
1.1.1.9 ! root        7: //
        !             8: // VM (基本クラス)
        !             9: //
        !            10: 
1.1       root       11: #pragma once
                     12: 
                     13: #include "device.h"
1.1.1.2   root       14: 
                     15: // VM 種別
                     16: enum vmtype_t {
                     17:        VMTYPE_NONE = 0,
                     18:        VMTYPE_X68030,
1.1.1.3   root       19:        VMTYPE_LUNA1,
1.1.1.2   root       20:        VMTYPE_LUNA88K,
                     21: };
1.1.1.3   root       22: // VM 種別 (ビットマスク表現)
                     23: enum vmf_t {
                     24:        VMF_NONE        = 0,
                     25:        VMF_X68030      = (1 << VMTYPE_X68030),
                     26:        VMF_LUNA1       = (1 << VMTYPE_LUNA1),
                     27:        VMF_LUNA88K     = (1 << VMTYPE_LUNA88K),
                     28: 
                     29:        VMF_LUNA        = VMF_LUNA1 | VMF_LUNA88K,
1.1.1.8   root       30:        VMF_M68K        = VMF_X68030 | VMF_LUNA1,
1.1.1.3   root       31:        VMF_M88K        = VMF_LUNA88K,
                     32:        VMF_ALL         = 0xffffffff,
                     33: };
1.1       root       34: 
1.1.1.9 ! root       35: // ヘッダの依存関係を減らすための細工。
        !            36: // o pNAME はメンバ変数としてヘッダで宣言してあるが、vm*.h で各デバイスヘッダ
        !            37: //   を include したくないので、派生型ではなく Device* の unique_ptr にしたい。
        !            38: // o gNAME は各デバイスヘッダが持つ派生型のグローバルポインタ。
        !            39: //   ベース型ではなく派生型で参照したい。また使いたい人が使いたいヘッダだけを
        !            40: //   include すれば済むよう、vm*.h とは切り離したい。
        !            41: #define NEWDV(NAME, NEW_CTOR)  do {    \
        !            42:        __CONCAT(p,NAME).reset(NEW_CTOR);       \
        !            43:        __CONCAT(g,NAME) = \
        !            44:                (decltype(__CONCAT(g,NAME)))(__CONCAT(p,NAME).get());   \
        !            45: } while (0)
        !            46: 
1.1       root       47: class VM
                     48: {
                     49:  public:
1.1.1.2   root       50:        VM();
1.1       root       51:        virtual ~VM();
                     52: 
1.1.1.3   root       53:        // 明示的な後始末
                     54:        void Dispose();
                     55: 
1.1       root       56:        // 動的なコンストラクション
                     57:        bool Create();
                     58: 
                     59:        // 初期化
1.1.1.6   root       60:        virtual bool Init();
1.1       root       61: 
1.1.1.9 ! root       62:        // スレッド開始
        !            63:        bool StartThread();
        !            64: 
1.1       root       65:        // 設定の適用
                     66:        bool Apply();
                     67: 
1.1.1.7   root       68:        // 電源ボタンを押す。(UI スレッドから呼ばれる)
1.1       root       69:        virtual void PowerButton() = 0;
                     70: 
                     71:        // 電源ボタンの状態を取得する。
                     72:        // モーメンタリスイッチの場合は常に false。
                     73:        virtual bool IsPowerButton() const { return false; }
                     74: 
1.1.1.8   root       75:        // ブートページを ROM に切り替える
                     76:        void SwitchBootPageToROM(Device *parent) { SwitchBootPage(parent, true); }
                     77:        // ブートページを RAM に切り替える
                     78:        void SwitchBootPageToRAM(Device *parent) { SwitchBootPage(parent, false); }
1.1       root       79: 
1.1.1.7   root       80:        // MPU の RESET 命令によるリセット (機種ごとに異なるため)
1.1.1.9 ! root       81:        virtual void ResetByMPU();
1.1.1.8   root       82: 
                     83:  protected:
                     84:        // ブートページを切り替える (内部用)
                     85:        virtual void SwitchBootPage(Device *parent, bool isrom);
1.1.1.9 ! root       86: 
        !            87:        std::unique_ptr<Device> pBusErr {};
        !            88:        std::unique_ptr<Device> pDebugger {};
        !            89:        std::unique_ptr<Device> pInterrupt {};
        !            90:        std::unique_ptr<Device> pKeyboard {};
        !            91:        std::unique_ptr<Device> pMPU {};
        !            92:        std::unique_ptr<Device> pNMI {};
        !            93:        std::unique_ptr<Device> pPower {};
        !            94:        std::unique_ptr<Device> pRenderer {};
        !            95:        std::unique_ptr<Device> pRAM {};
        !            96:        std::unique_ptr<Device> pScheduler {};
        !            97:        std::unique_ptr<Device> pSignalThread {};
        !            98:        std::unique_ptr<Device> pSync {};
1.1       root       99: };
                    100: 
1.1.1.9 ! root      101: extern VM *gVM;

unix.superglobalmegacorp.com

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