|
|
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.9 root 7: //
8: // デバッガ (内部用)
9: //
10:
1.1 root 11: #pragma once
12:
1.1.1.11 root 13: #include "debugger_defs.h"
1.1.1.12 root 14: #include "bus.h"
1.1.1.2 root 15:
1.1.1.12 root 16: class IODevice;
1.1 root 17:
1.1.1.11 root 18: enum class CPUState
1.1.1.5 root 19: {
1.1.1.11 root 20: Normal = 0,
21: Stop, // STOP 命令など割り込み待ち状態
22: Halt, // ホールト、リセットなど非動作状態
1.1 root 23: };
24:
1.1.1.9 root 25: // デバッガの CPU 依存部分
26: class DebuggerMD
1.1 root 27: {
1.1.1.5 root 28: public:
1.1.1.11 root 29: DebuggerMD(Debugger *parent_, CPUArch arch_);
1.1.1.9 root 30: virtual ~DebuggerMD();
31:
1.1.1.11 root 32: // CPU の実行状態を返す。
33: virtual CPUState GetCPUState() const = 0;
1.1.1.9 root 34: // 特権モードなら true を返す
35: virtual bool IsSuper() const = 0;
36: // MMU が有効なら true を返す
37: virtual bool MMUEnabled() const = 0;
38:
39: // アドレス変換をする。
40: // MMUEnabled() が true であることは呼び出し側が確認すること。
1.1.1.13! root 41: // 変換出来なければ BusAddr::BusErr を返す。
! 42: // テーブルサーチを行ったら BusAddr::TableSearched を立てる。
1.1.1.12 root 43: virtual busaddr TranslateAddr(busaddr laddr) const = 0;
1.1.1.9 root 44:
45: // 現在の命令先頭アドレスを返す
46: virtual uint32 GetPC() const = 0;
47:
48: // ステップアウトを設定する
49: virtual void SetStepOut() = 0;
50: // ステップアウトなら true を返す
51: virtual bool IsStepOut() const = 0;
52:
53: // この命令がステップイン出来るなら true を返す (cmd_n 用)
54: virtual bool IsOpStepIn(DebuggerMemoryStream& mem) = 0;
55:
56: // name で示されるのレジスタの値を返す。
57: // メモリダンプで指定するケースを想定しているので、明らかにアドレスでは
58: // ないレジスタは含まなくてよい (m680x0 の SR など)。ただし Dn は含めて
59: // よい。また m680x0 の SRP/CRP は下位32ビットでよい。
60: // name が正しくない場合は (uint64)-1 を返す。
61: virtual uint64 GetRegAddr(const char *name) const = 0;
62:
63: // 現在のレジスタセットを内部にバックアップする
64: virtual void BackupRegs() = 0;
65:
66: // レジスタ表示系のコマンドを実行。処理すれば true を返す。
67: virtual bool ShowRegister(FILE *, const std::vector<std::string>& args) = 0;
68: // レジスタ表示系コマンドのヘルプ一覧を取得
69: virtual const HelpMessages& GetHelpListReg() const = 0;
70: // レジスタ表示系コマンドのヘルプメッセージを取得
71: virtual const HelpMessages& GetHelpReg() const = 0;
72:
73: // 直近の命令でアクセスした laddr が一致したら true を返す
74: // 1 命令で複数にアクセスする場合を考慮して、md 側で判断する
75: virtual bool CheckLEA(uint32 laddr) = 0;
76:
77: // mem.laddr の位置の命令を一つ逆アセンブルする。
1.1.1.11 root 78: virtual std::string Disassemble(DebuggerMemoryStream& mem) = 0;
79:
80: // 機種名を取得する
81: const std::string& GetName() const { return name; }
82:
83: // この CPU のバスを返す
1.1.1.12 root 84: IODevice *GetBus() const { return bus; }
1.1.1.11 root 85: // このバスの論理アドレス幅 (ビット数) を返す
86: int GetLASize() const { return lasize; }
87: // このバスの物理アドレス幅 (ビット数) を返す
88: int GetPASize() const { return pasize; }
1.1.1.9 root 89:
90: // 機種
1.1.1.11 root 91: CPUArch arch {};
1.1.1.9 root 92:
93: // 最短の1命令のバイト数
94: uint inst_bytes {};
95: // 命令が固定長ならそのバイト数、可変長なら 0
96: uint inst_bytes_fixed {};
97:
1.1.1.11 root 98: // 例外ブレーク。
99: // 機種固有ではないが main と xp でそれぞれに必要なので、ここに持っておく。
100: int bv_vector {};
101:
1.1.1.9 root 102: protected:
103: Debugger *parent {}; // 親クラス
104:
1.1.1.11 root 105: std::string name {}; // 機種名
1.1 root 106:
1.1.1.12 root 107: IODevice *bus {}; // 対応する外部バス
108: int lasize {}; // バスの論理アドレス幅
109: int pasize {}; // バスの物理アドレス幅
1.1 root 110: };
111:
112: #define NORM "\x1b[0m"
113: #define BOLD "\x1b[1m"
114: #define BOLDIF(n) ((n) ? BOLD : "")
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.