演習8-3は、メインルーチンはキー入力されたが未表示なデータがあるかループで監視し、あれば表示可能になるまでループで待ち、表示可能になったら表示するようになっています。メインルーチンは与えるので、その条件下でキー入力割り込みがあったらデータをメモリに保存する割り込みルーチンを書けという課題です。

本章の冒頭に、割り込みがあったら通常割り込みルーチンの先頭で割り込み禁止にし、うんぬんと書いてあったのにその命令がまだ定義されていないのと、割り込みルーチンでキー入力データをメモリ上に次々と+1されたアドレスに書いているので溢れたらどうするのか疑問で悩んでいましたが、少し先まで本を読んだところ、POCOは割り込みが発生するとハードで割り込み禁止にすると書いてあり、またキー入力データを保存するメモリは単に溢れを考慮してないだけと分かりました。

次に割り込みルーチンでキー入力データをメモリに書くと言っても一旦レジスタを経由しなければならないがメインルーチンでr0,r1,r2,r3,r4,r5を使っており、r6はスタックポインタ、r7はプログラムカウンタの保存に割り当てられているので空きがないと思っていましたが、本を先まで読んだ感じではr6は現時点ではまだ役割を未定として使ってよいと解釈しました。

よって割り込みルーチンは、r6を経由してキー入力データレジスタの値をr3の指すメモリに格納してからr3をインクリメントするだけとしました。

8.3.3は割り込みときのレジスタ保存について書いてありますが、r6はスタックポインタに使い、割り込みルーチンの頭でr2とr5をスタックに退避し、ルーチンの最後で復帰するようになっているので、これを使ってr2とr5が使ってもよいことになれば、r6を経由するところをr2またはr5にしても良い事になります。

次は割り込みのVerilogコードの話に入ります。

エレキジャック・フォーラム in Akihabara 2012に行ってきました。

都合であまり時間がとれず、ルネサスマイコンを使った自律型ヘリコプターの話を聞いたのと展示会場をざっと回った程度になってしまいましたが、天気が悪かったにも関わらずかなり活気がありました。

5時からはなんと電子工作女子!だけの発表があるということでどんな内容なのか大いに気にはなったのですがそこまでは見れませんでした。

電子工作が色々な人のつながりの中で取り組まれていることが分かり刺激を受けました。行って良かったです。

割り込みのセクションに入りました。

CPU一般の話として、下記の通り例外処理が色々ある内の1つとして割り込みがある
・I/O割り込み
・トラップ:プログラムがOSを呼び出す
・Page Fault:MMUを用いて仮想記憶を実現している時に実メモリ上に存在しないアドレスをアクセス
・Segmentation Fault:使っていけないメモリ領域にアクセスした
・Break Point:特定アドレスにアクセスすると割り込みを発生させる
・Trace:命令を1つ実行する度に割り込みを発生させる

POCOの割り込みは以下のようにシンプルな仕様になっています。

・起動時には割り込み禁止
・割り込み許可命令EINTと割り込みルーチンからの復帰命令RTIを持つ
・割り込みが発生したら固定番地にジャンプする
・戻りアドレスは専用レジスタIARに保存する
・分岐にフラグを用いない仕様なので割り込み発生時にフラグを保存する必要はない

次はキー入力を表示するプログラムの動作をシミュレーションして確認します。