|
|
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:
1.1.1.14! root 80: // ニーモニックに対応する機械語文字列を返す。(cmd_bi 用)
! 81: virtual std::string ParseInst(const std::string&) const = 0;
! 82:
1.1.1.11 root 83: // 機種名を取得する
84: const std::string& GetName() const { return name; }
85:
86: // この CPU のバスを返す
1.1.1.12 root 87: IODevice *GetBus() const { return bus; }
1.1.1.11 root 88: // このバスの論理アドレス幅 (ビット数) を返す
89: int GetLASize() const { return lasize; }
90: // このバスの物理アドレス幅 (ビット数) を返す
91: int GetPASize() const { return pasize; }
1.1.1.9 root 92:
93: // 機種
1.1.1.11 root 94: CPUArch arch {};
1.1.1.9 root 95:
96: // 最短の1命令のバイト数
97: uint inst_bytes {};
98: // 命令が固定長ならそのバイト数、可変長なら 0
99: uint inst_bytes_fixed {};
100:
1.1.1.11 root 101: // 例外ブレーク。
102: // 機種固有ではないが main と xp でそれぞれに必要なので、ここに持っておく。
103: int bv_vector {};
104:
1.1.1.9 root 105: protected:
106: Debugger *parent {}; // 親クラス
107:
1.1.1.11 root 108: std::string name {}; // 機種名
1.1 root 109:
1.1.1.12 root 110: IODevice *bus {}; // 対応する外部バス
111: int lasize {}; // バスの論理アドレス幅
112: int pasize {}; // バスの物理アドレス幅
1.1 root 113: };
114:
115: #define NORM "\x1b[0m"
116: #define BOLD "\x1b[1m"
117: #define BOLDIF(n) ((n) ? BOLD : "")
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.