Annotation of nono/debugger/debugger_private.h, revision 1.1.1.14

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 : "")

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.