|
|
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.11 root 7: //
1.1.1.2 root 8: // MPU 共通部
1.1.1.11 root 9: //
1.1.1.2 root 10:
1.1 root 11: #pragma once
12:
13: #include "device.h"
1.1.1.11 root 14: #include "event.h"
15: #include "message.h"
1.1 root 16:
17: class MPUDevice : public Device
18: {
1.1.1.3 root 19: using inherited = Device;
1.1 root 20: public:
1.1.1.8 root 21: MPUDevice(const std::string& objname_);
1.1.1.5 root 22: virtual ~MPUDevice() override;
1.1 root 23:
1.1.1.5 root 24: bool Init() override;
1.1.1.11 root 25: void PowerOff() override;
1.1 root 26:
1.1.1.2 root 27: // 現在実行中の命令の PC を取得
28: virtual uint32 GetPPC() const = 0;
1.1 root 29:
1.1.1.11 root 30: // 現在の VBR を取得
31: virtual uint32 GetVBR() const = 0;
32:
1.1.1.2 root 33: // 現在アクセス中の論理アドレス、物理アドレスを取得。
34: // Laddr == Paddr が MMU オフなのか PA=VA で運用中なのかの区別は
35: // ここでは付かない。
36: virtual uint32 GetLaddr() const = 0;
37: virtual uint32 GetPaddr() const = 0;
1.1 root 38:
1.1.1.5 root 39: // MPU クロック [kHz] を取得する。
40: int GetClockSpeed() const { return clock_khz; }
41:
1.1.1.12! root 42: // MPU クロック [nsec] を取得する。
! 43: uint64 GetClock_nsec() const { return clock_nsec; }
! 44:
1.1.1.4 root 45: // アクセスウェイトを加算
1.1.1.5 root 46: virtual void AddCycle(int32 cycle) = 0;
1.1.1.4 root 47:
1.1.1.5 root 48: // 割り込み発生を MPU に通知
49: virtual void Interrupt(int level) = 0;
1.1.1.4 root 50:
1.1.1.9 root 51: // MPU からのアクセスをエミュレートする。
52: // アドレスは論理アドレス。
53: // 空間は現在のデータ空間。
54: // アクセスエラーは (int64)-1 を返す。
55: virtual uint64 Read8(uint32 addr) = 0;
56: virtual uint64 Read16(uint32 addr) = 0;
57: virtual uint64 Read32(uint32 addr) = 0;
58: virtual uint64 Write8(uint32 addr, uint32 data) = 0;
59: virtual uint64 Write16(uint32 addr, uint32 data) = 0;
60: virtual uint64 Write32(uint32 addr, uint32 data) = 0;
61:
1.1.1.4 root 62: protected:
1.1.1.11 root 63: void TraceMessage(MessageID, uint32);
64: virtual void SetTrace(bool trace_on) = 0;
65:
1.1.1.5 root 66: int clock_khz {}; // MPU クロック [kHz]
1.1.1.12! root 67: uint64 clock_nsec {}; // MPU クロック [nsec]
! 68:
! 69: bool resetting {}; // リセット処理中フラグ
1.1.1.11 root 70:
71: // 1命令実行イベント
72: Event exec_event { this };
1.1.1.10 root 73:
74: // Round Mode (モニタ表示用)
75: static const char * const rmstr[4];
1.1 root 76: };
77:
1.1.1.11 root 78: extern MPUDevice *gMPU;
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.