こんにちは、めのんです!
平日は簡単な命令をコツコツ片付けていくことにします。
今回実装するのはSWAP命令です。
SWAP命令の実装
SWAPというと2つの汎用レジスタの値を交換するんじゃないかと思われる方もいらっしゃるかもしれませんね。
実際には、ひとつの汎用レジスタの上位4ビット(ニブル)と下位4ビットを交換する命令です。
それではいつものように「AVR®命令一式手引書」から命令の説明を引用します。
とくに目新しい内容はないですね。
早速コードを見ていきましょう。
static void swap(atmega328_t *cpu, uint16_t op)
{
int d = (op >> 4) & 0x1f;
int value = cpu->r[d];
cpu->r[d] = (value >> 4 | value << 4) & 0xff;
++cpu->clock;
}
いったん汎用レジスタの値を変数valueに読み出して、加工した結果を同じ汎用レジスタに戻しています。
汎用レジスタに代入する前には念のため0xffとでマスクしていますが、別に無くても問題はありません。
op_tableへの登録
次に、いつものようにop_tableに登録します。
opcode.phpに次のコードを追加して実行してあげればOKです。
for ($d = 0; $d < 32; ++$d)
{
$opcode_table[0b1001_0100_0000_0010 | $d << 4] = 'swap';
}
今回は65,536命令のうち32個が埋まりました。
埋められた数は少ないですが、大切な命令ですからね。
それでは次回またお会いしましょう!