BREAK命令の実装

こんにちは、めのんです!

そろそろまだ実装していない命令を探すのが大変になってきました。
今回、LAC、LAS、LATの3命令を実装しようと思ったんですけど、これらの命令はATmega328では利用不可でした。
そこであわてて探し直して見つけたのがBREAK命令です。

BREAK命令の実装

BREAK命令というのはデバッガが使うためのもので、通常のアプリケーションで実行した場合はNOP命令と同じように振る舞います。
そんなBREAK命令ですが、未定義命令ではないので一応実装しておく必要があります。

それではいつものように「AVR®命令一式手引書」から命令の説明を引用します。

それではコードを見ていきます。

static void break_(atmega328_t *cpu, uint16_t op)
{
  ++cpu->clock;
}

何もしない命令なのでclockをインクリメントしているだけですね。
ひとつ注意しないといけないのは、breakはCの予約語なので関数名にできません。
しかたがないので下線をうしろにつけてbreak_にしました。

op_tableへの登録

次に、いつものようにop_tableに登録します。

opcode.phpに次のコードを追加して実行してあげればOKです。

$opcode_table[0b1001_0101_1001_1000] = 'break_';

今回は65,536命令のうち 1 個が埋まりました。

それでは次回またお会いしましょう!