TZ80はZ80CPUをエミュレーションするクラステンプレートです。
(テンプレートモードのみ)
テンプレート引数は次のように指定されます。
template <int TID, int TMB, int TIOB> TZ80;
TID : ID番号(複数のクラスを実装する際の通し番号)
TMB : メモリアドレスバンク幅(必ず2^nの値を指定)
TIOB : I/Oアドレスバンク幅(必ず2^nの値を指定。通常は1)
内容はCZ80とよく似ていますが、メモリ及びI/Oアクセス関数をバンク単位で差し替えることができます。
また、高速化のためにメンバ変数/関数のほとんどがstaticになっています。
TZ80 | コンストラクタ |
~TZ80 | デストラクタ |
Initialize | 初期化処理 |
Reset | リセット処理 |
RegAF | AFレジスタの参照 |
RegA | Aレジスタの参照 |
RegF | Fレジスタの参照 |
RegAF2 | AF'レジスタの参照 |
RegBC | BCレジスタの参照 |
RegB | Bレジスタの参照 |
RegC | Cレジスタの参照 |
RegBC2 | BC'レジスタの参照 |
RegDE | DEレジスタの参照 |
RegD | Dレジスタの参照 |
RegE | Eレジスタの参照 |
RegDE2 | DE'レジスタの参照 |
RegHL | HLレジスタの参照 |
RegH | Hレジスタの参照 |
RegL | Lレジスタの参照 |
RegHL2 | HL'レジスタの参照 |
RegIX | IXレジスタの参照 |
RegIXH | IXHレジスタの参照 |
RegIXL | IXLレジスタの参照 |
RegIY | IYレジスタの参照 |
RegIYH | IYHレジスタの参照 |
RegIYL | IYLレジスタの参照 |
RegSP | SPレジスタの参照 |
RegPC | PCレジスタの参照 |
GetRegI | Iレジスタ値の取得 |
SetRegI | Iレジスタ値の設定 |
GetRegR | Rレジスタ値の取得 |
SetRegR | Rレジスタ値の設定 |
SetReadMemoryProc | メモリ読み出し関数を設定 |
SetWriteMemoryProc | メモリ書き込み関数を設定 |
SetReadMemoryM1Proc | メモリ読み出し関数を設定(M1サイクル) |
SetReadIOProc | I/Oポート入力関数を設定 |
SetWriteIOProc | I/Oポート出力関数を設定 |
ExecuteOneOpCode | 1命令実行 |
ExecuteMultiOpCode | 複数命令実行 |
AddExecClock | 実行クロックを加算 |
GetProgressClock | 実行中クロックを取得(複数命令実行時) |
IsEnableInterrupt | 割り込みが許可されているか判定 |
DoInterrupt | 割り込み処理 |
DoNMInterrupt | 割り込み処理 |
IsHalting | HALT中か判定 |
ProcessHALT | HALT処理 |
DisAssemble | 逆アセンブル |
GetMnemonic | ニーモニックを取得 |
GetAdapter | 共通アクセス用アダプタの取得 |
public:
TZ80();
クラスのコンストラクタです。
public:
virtual ~TZ80();
クラスのデストラクタです。
public:
virtual void Initialize();
CPU内部情報を初期化します。
(実行前に必ず1回呼ぶ必要あり)
public:
virtual void Reset();
CPUをリセットします。
public:
static URegisterPair& RegAF();
AFレジスタを参照します。
public:
static CRegister& RegA();
Aレジスタを参照します。
public:
static CRegister& RegF();
Fレジスタを参照します。
public:
static URegisterPair& RegAF2();
AF'レジスタ(裏AFレジスタ)を参照します。
public:
static URegisterPair& RegBC();
BCレジスタを参照します。
public:
static CRegister& RegB();
Bレジスタを参照します。
public:
static CRegister& RegC();
Cレジスタを参照します。
public:
static URegisterPair& RegBC2();
BC'レジスタ(裏BCレジスタ)を参照します。
public:
static URegisterPair& RegDE();
DEレジスタを参照します。
public:
static CRegister& RegD();
Dレジスタを参照します。
public:
static CRegister& RegE();
Eレジスタを参照します。
public:
static URegisterPair& RegDE2();
DE'レジスタ(裏DEレジスタ)を参照します。
public:
static URegisterPair& RegHL();
HLレジスタを参照します。
public:
static CRegister& RegH();
Hレジスタを参照します。
public:
static CRegister& RegL();
Lレジスタを参照します。
public:
static URegisterPair& RegHL2();
HL'レジスタ(裏HLレジスタ)を参照します。
public:
static URegisterPair& RegIX();
IXレジスタを参照します。
public:
static CRegister& RegIXH();
IXHレジスタ(IXレジスタ上位バイト)を参照します。
public:
static CRegister& RegIXL();
IXLレジスタ(IXレジスタ下位バイト)を参照します。
public:
static URegisterPair& RegIY();
IYレジスタを参照します。
public:
static CRegister& RegIYH();
IYHレジスタ(IYレジスタ上位バイト)を参照します。
public:
static CRegister& RegIYL();
IYLレジスタ(IYレジスタ下位バイト)を参照します。
public:
static URegisterPair& RegSP();
SPレジスタ(スタックポインタ)を参照します。
public:
static URegisterPair& RegPC();
PCレジスタ(プログラムカウンタ)を参照します。
public:
static uint8_t GetRegI();
Iレジスタ(割り込みレジスタ)値を取得します。
public:
static void SetRegI(uint8_t btData);
Iレジスタ(割り込みレジスタ)値を設定します。
public:
static uint8_t GetRegR();
Rレジスタ(リフレッシュレジスタ)値を取得します。
public:
static void SetRegR(uint8_t btData);
Rレジスタ(リフレッシュレジスタ)値を設定します。
public:
static void SetReadMemoryProc(int nBank, RPROC rpMem);
指定されたバンクのメモリから読み出す関数を設定します。
(バンクはテンプレート引数TMBで決定)
関数は以下の形を取ります。
typedef uint8_t (*RPROC)(int nAddress);
public:
static void SetWriteMemoryProc(int nBank, WPROC wpMem);
指定されたバンクのメモリへ書き込む関数を設定します。
(バンクはテンプレート引数TMBで決定)
関数は以下の形を取ります。
typedef void (*WPROC)(int nAddress, uint8_t btData);
public:
static void SetReadMemoryM1Proc(int nBank, RPROC rpMemM1);
指定されたバンクのメモリから読み出す関数を設定します。
(M1サイクル用。バンクはテンプレート引数TMBで決定)
読み込み関数の型はSetReadMemoryProcと同じです。
public:
static void SetReadIOProc(int nBank, RPROC rpIO);
指定されたバンクのI/Oポートから入力する関数を設定します。
(バンクはテンプレート引数TIOBで決定)
入力関数の型はSetReadMemoryProcと同じです。
public:
void SetWriteIOProc(int nBank, WPROC wpIO);
指定されたバンクのI/Oポートへ出力する関数を設定します。
(バンクはテンプレート引数TIOBで決定)
出力関数の型はSetWriteMemoryProcと同じです。
public:
static int ExecuteOneOpCode();
Z80CPUを1命令実行します。
実行に要したクロックが返ります。
public:
static int ExecuteMultiOpCode(int nOpCodeCount);
Z80CPUをnOpCodeCountで指定した命令数実行します。
実行に要したクロックが返ります。
public:
static void AddExecClock(int nExecClock);
ReadMemory/WriteMemory等の処理中、ウェイトを入れる必要がある場合に呼び出します。
public:
static int GetProgressClock();
複数命令実行中、ExecuteMultiOpCodeが呼び出されたときから何クロックが経過したかを取得します。
public:
static bool IsEnableInterrupt();
割り込みが許可されているか判定します。
(EI/DI命令)
public:
virtual int DoInterrupt(uint8_t btIntVect);
割り込みが発生したときに呼び出されます。
実行に要したクロックを返します。
※オーバーライド時は必ずTZ80::DoInterruptを呼び出してください。
public:
virtual int DoNMInterrupt();
NMI割り込みが発生したときに呼び出されます。
実行に要したクロックを返します。
※オーバーライド時は必ずTZ80::DoNMInterruptを呼び出してください。
public:
static bool IsHalting();
CPUがHALT命令により停止中か判定します。
※HALTは割り込みにより解除されます。
public:
virtual void ProcessHALT();
HALT命令が実行されたときに呼び出されます。
public:
static int DisAssemble();
逆アセンブルを実行します。
(結果はニーモニックバッファに格納)
実行に要するクロック数が返されます。
逆アセンブル後、プログラムカウンタは命令バイト数分インクリメントされます。(分岐命令は無視)
public:
static const char* GetMnemonic();
逆アセンブル結果を格納するバッファを返します。
(DisAssembleが呼ばれたとき、バッファ内容を更新)
public:
static CZ80Adapter* GetAdapter();
複数のTZ80実装クラスを横断的にアクセスするためのCZ80Adapterオブジェクトを取得します。