Z80Emulator : TZ80

◎概要

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レジスタ値の設定

メモリ・I/O操作

SetReadMemoryProc メモリ読み出し関数を設定
SetWriteMemoryProc メモリ書き込み関数を設定
SetReadMemoryM1Proc メモリ読み出し関数を設定(M1サイクル)
SetReadIOProc I/Oポート入力関数を設定
SetWriteIOProc I/Oポート出力関数を設定

実行

ExecuteOneOpCode 1命令実行
ExecuteMultiOpCode 複数命令実行
AddExecClock 実行クロックを加算
GetProgressClock 実行中クロックを取得(複数命令実行時)

割り込み

IsEnableInterrupt 割り込みが許可されているか判定
DoInterrupt 割り込み処理
DoNMInterrupt 割り込み処理

HALT

IsHalting HALT中か判定
ProcessHALT HALT処理

逆アセンブル

DisAssemble 逆アセンブル
GetMnemonic ニーモニックを取得

その他

GetAdapter 共通アクセス用アダプタの取得

◎クラスメンバ詳細

TZ80

public:
TZ80();

クラスのコンストラクタです。

~TZ80

public:
virtual ~TZ80();

クラスのデストラクタです。

Initialize

public:
virtual void Initialize();

CPU内部情報を初期化します。
(実行前に必ず1回呼ぶ必要あり)

Reset

public:
virtual void Reset();

CPUをリセットします。

RegAF

public:
static URegisterPair& RegAF();

AFレジスタを参照します。

RegA

public:
static CRegister& RegA();

Aレジスタを参照します。

RegF

public:
static CRegister& RegF();

Fレジスタを参照します。

RegAF2

public:
static URegisterPair& RegAF2();

AF'レジスタ(裏AFレジスタ)を参照します。

RegBC

public:
static URegisterPair& RegBC();

BCレジスタを参照します。

RegB

public:
static CRegister& RegB();

Bレジスタを参照します。

RegC

public:
static CRegister& RegC();

Cレジスタを参照します。

RegBC2

public:
static URegisterPair& RegBC2();

BC'レジスタ(裏BCレジスタ)を参照します。

RegDE

public:
static URegisterPair& RegDE();

DEレジスタを参照します。

RegD

public:
static CRegister& RegD();

Dレジスタを参照します。

RegE

public:
static CRegister& RegE();

Eレジスタを参照します。

RegDE2

public:
static URegisterPair& RegDE2();

DE'レジスタ(裏DEレジスタ)を参照します。

RegHL

public:
static URegisterPair& RegHL();

HLレジスタを参照します。

RegH

public:
static CRegister& RegH();

Hレジスタを参照します。

RegL

public:
static CRegister& RegL();

Lレジスタを参照します。

RegHL2

public:
static URegisterPair& RegHL2();

HL'レジスタ(裏HLレジスタ)を参照します。

RegIX

public:
static URegisterPair& RegIX();

IXレジスタを参照します。

RegIXH

public:
static CRegister& RegIXH();

IXHレジスタ(IXレジスタ上位バイト)を参照します。

RegIXL

public:
static CRegister& RegIXL();

IXLレジスタ(IXレジスタ下位バイト)を参照します。

RegIY

public:
static URegisterPair& RegIY();

IYレジスタを参照します。

RegIYH

public:
static CRegister& RegIYH();

IYHレジスタ(IYレジスタ上位バイト)を参照します。

RegIYL

public:
static CRegister& RegIYL();

IYLレジスタ(IYレジスタ下位バイト)を参照します。

RegSP

public:
static URegisterPair& RegSP();

SPレジスタ(スタックポインタ)を参照します。

RegPC

public:
static URegisterPair& RegPC();

PCレジスタ(プログラムカウンタ)を参照します。

GetRegI

public:
static uint8_t GetRegI();

Iレジスタ(割り込みレジスタ)値を取得します。

SetRegI

public:
static void SetRegI(uint8_t btData);

Iレジスタ(割り込みレジスタ)値を設定します。

GetRegR

public:
static uint8_t GetRegR();

Rレジスタ(リフレッシュレジスタ)値を取得します。

SetRegR

public:
static void SetRegR(uint8_t btData);

Rレジスタ(リフレッシュレジスタ)値を設定します。

SetReadMemoryProc

public:
static void SetReadMemoryProc(int nBank, RPROC rpMem);

指定されたバンクのメモリから読み出す関数を設定します。
(バンクはテンプレート引数TMBで決定)
関数は以下の形を取ります。

typedef uint8_t (*RPROC)(int nAddress);

SetWriteMemoryProc

public:
static void SetWriteMemoryProc(int nBank, WPROC wpMem);

指定されたバンクのメモリへ書き込む関数を設定します。
(バンクはテンプレート引数TMBで決定)
関数は以下の形を取ります。

typedef void (*WPROC)(int nAddress, uint8_t btData);

SetReadMemoryM1Proc

public:
static void SetReadMemoryM1Proc(int nBank, RPROC rpMemM1);

指定されたバンクのメモリから読み出す関数を設定します。
(M1サイクル用。バンクはテンプレート引数TMBで決定)
読み込み関数の型はSetReadMemoryProcと同じです。

SetReadIOProc

public:
static void SetReadIOProc(int nBank, RPROC rpIO);

指定されたバンクのI/Oポートから入力する関数を設定します。
(バンクはテンプレート引数TIOBで決定)
入力関数の型はSetReadMemoryProcと同じです。

SetWriteIOProc

public:
void SetWriteIOProc(int nBank, WPROC wpIO);

指定されたバンクのI/Oポートへ出力する関数を設定します。
(バンクはテンプレート引数TIOBで決定)
出力関数の型はSetWriteMemoryProcと同じです。

ExecuteOneOpCode

public:
static int ExecuteOneOpCode();

Z80CPUを1命令実行します。
実行に要したクロックが返ります。

ExecuteMultiOpCode

public:
static int ExecuteMultiOpCode(int nOpCodeCount);

Z80CPUをnOpCodeCountで指定した命令数実行します。
実行に要したクロックが返ります。

AddExecClock

public:
static void AddExecClock(int nExecClock);

ReadMemory/WriteMemory等の処理中、ウェイトを入れる必要がある場合に呼び出します。

GetProgressClock

public:
static int GetProgressClock();

複数命令実行中、ExecuteMultiOpCodeが呼び出されたときから何クロックが経過したかを取得します。

IsEnableInterrupt

public:
static bool IsEnableInterrupt();

割り込みが許可されているか判定します。
(EI/DI命令)

DoInterrupt

public:
virtual int DoInterrupt(uint8_t btIntVect);

割り込みが発生したときに呼び出されます。
実行に要したクロックを返します。
※オーバーライド時は必ずTZ80::DoInterruptを呼び出してください。

DoNMInterrupt

public:
virtual int DoNMInterrupt();

NMI割り込みが発生したときに呼び出されます。
実行に要したクロックを返します。
※オーバーライド時は必ずTZ80::DoNMInterruptを呼び出してください。

IsHalting

public:
static bool IsHalting();

CPUがHALT命令により停止中か判定します。
※HALTは割り込みにより解除されます。

ProcessHALT

public:
virtual void ProcessHALT();

HALT命令が実行されたときに呼び出されます。

DisAssemble

public:
static int DisAssemble();

逆アセンブルを実行します。
(結果はニーモニックバッファに格納)
実行に要するクロック数が返されます。
逆アセンブル後、プログラムカウンタは命令バイト数分インクリメントされます。(分岐命令は無視)

GetMnemonic

public:
static const char* GetMnemonic();

逆アセンブル結果を格納するバッファを返します。
(DisAssembleが呼ばれたとき、バッファ内容を更新)

GetAdapter

public:
static CZ80Adapter* GetAdapter();

複数のTZ80実装クラスを横断的にアクセスするためのCZ80Adapterオブジェクトを取得します。

1