|
|
1.1 root 1: //
2: // nono
1.1.1.2 root 3: // Copyright (C) 2020 nono project
4: // Licensed under nono-license.txt
1.1 root 5: //
6:
1.1.1.11! root 7: //
! 8: // MPU (M88xx0)
! 9: //
1.1 root 10:
11: #pragma once
12:
1.1.1.11! root 13: #include "event.h"
1.1 root 14: #include "mpu.h"
15: #include "m88100.h"
16:
17: class MPU88xx0Device : public MPUDevice
18: {
1.1.1.2 root 19: using inherited = MPUDevice;
1.1 root 20: public:
1.1.1.8 root 21: MPU88xx0Device();
1.1.1.5 root 22: virtual ~MPU88xx0Device() override;
23:
24: bool Init() override;
1.1.1.11! root 25: void ResetHard(bool poweron) override;
1.1 root 26:
27: // 現在実行中の命令の PC を取得
1.1.1.4 root 28: uint32 GetPPC() const override { return cpu->GetXIP(); }
1.1 root 29:
1.1.1.11! root 30: // 現在の VBR を取得
! 31: uint32 GetVBR() const override { return cpu->GetVBR(); }
! 32:
1.1 root 33: // 現在アクセス中の論理アドレス、物理アドレスを取得。
1.1.1.7 root 34: uint32 GetLaddr() const override;
35: uint32 GetPaddr() const override;
1.1 root 36:
1.1.1.4 root 37: // アクセスウェイトを加算
1.1.1.5 root 38: void AddCycle(int32 cycle) override;
1.1.1.4 root 39:
1.1 root 40: // 割り込み発生を MPU に通知
1.1.1.5 root 41: void Interrupt(int level) override;
1.1 root 42:
1.1.1.10 root 43: // DOS call エミュレーションのコールバックを指定する
44: void SetFLineCallback(bool (*callback)(m88kcpu *, void *), void *arg);
45:
1.1 root 46: // CPU コアを取得 (主にデバッグ用途)
47: m88kcpu *GetCPU() const { return cpu.get(); }
48:
1.1.1.10 root 49: // MPU からのアクセスをエミュレートする。
50: // アドレスは論理アドレス。
51: // 空間は現在のデータ空間。
52: // ミスアラインドアクセスも可能。
53: // アクセスエラーは -1 を返す。
54: uint64 Read8(uint32 addr) override;
55: uint64 Read16(uint32 addr) override;
56: uint64 Read32(uint32 addr) override;
57: uint64 Write8(uint32 addr, uint32 data) override;
58: uint64 Write16(uint32 addr, uint32 data) override;
59: uint64 Write32(uint32 addr, uint32 data) override;
60:
1.1.1.11! root 61: // コアからスケジューラへの動作モード変更通知
! 62: void NotifyCPUMode(uint32 new_mode);
! 63:
1.1 root 64: private:
1.1.1.11! root 65: // リセット例外コールバック
! 66: void ResetCallback(Event& ev);
! 67:
! 68: // 命令実行系コールバック
! 69: void ExecNormal(Event& ev);
! 70: void ExecStop(Event& ev);
! 71: void ExecTrace(Event& ev);
! 72:
! 73: // トレース設定。デバッガから呼び出される。
! 74: void SetTrace(bool trace_on) override;
! 75:
1.1.1.9 root 76: // レジスタモニター
77: DECLARE_MONITOR_CALLBACK(MonitorUpdate);
78: Monitor monitor { this };
1.1.1.2 root 79:
1.1.1.11! root 80: // イベントコールバック
! 81: EventCallback_t exec_normal {};
! 82: EventCallback_t exec_stop {};
! 83:
1.1.1.9 root 84: std::unique_ptr<m88kcpu> cpu {};
1.1.1.2 root 85: };
86:
1.1.1.11! root 87: #define gMPU88xx0 (dynamic_cast<MPU88xx0Device *>(gMPU))
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.