We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
There was an error while loading. Please reload this page.
典型的なアセンブラとは異なり、C 言語の関数呼び出し形式のニーモニックを採用することで、アセンブリ言語コードでありながらも C コンパイラによるビルドを可能とし、エミュレーションをしやすくする。
例えば、メモリの 0xCAFE と 0xCB00 から値を読み出し、掛けた結果を 0xCAFE に書き戻すプログラムを考える。
// 典型的なアセンブラ LOAD A, 0xCAFE LOAD B, 0xCB00 MUL A, B STORE 0xCAFE, A
// PocketGame アセンブラ LOAD(A, 0xCAFE); LOAD(B, 0xCB00); MUL(A, B); STORE(0xCAFE, A);
LOAD や MUL などに対応する関数を定義し、上記のコードと一緒にリンクすることにより、そのままパソコン上で実行可能なプログラムを生成できる。例えば次のような関数定義を行うイメージ。
LOAD
MUL
int mem[DATA_MEM_SIZE]; Reg regs[16]; Reg *A = regs + 0, *B = regs + 1; void LOAD(Reg *reg, int addr) { reg->value = mem[addr]; } void STORE(int addr, Reg *reg) { mem[addr] = reg->value; } void MUL(Reg *dst, Reg *src) { dst->value *= src->value; }
LOAD や STORE の中で addr の値によって分岐させ、メモリの読み書きではなく周辺機器のレジスタアクセスのようなコードを書くことにより、純粋な CPU だけでなく周辺回路まで含めたエミュレーションが可能。
STORE
addr
典型的なエミュレーション実行では、一度アセンブラで機械語プログラムに直したものをエミュレータが 1 命令ずつ読み取りながら実行する。
PocketGame アセンブラを用いたエミューレーション実行の場合、アセンブラや機械語プログラムを経由せずエミュレーション実行が可能なため、典型的なエミュレーション実行に比べプロセスが簡易になり、また(アセンブリ言語コードに対する)コンパイラによる最適化も効くため、エミュレーションの高速化が期待できる。