|
|
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;
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.