演習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コードの話に入ります。
本章の冒頭に、割り込みがあったら通常割り込みルーチンの先頭で割り込み禁止にし、うんぬんと書いてあったのにその命令がまだ定義されていないのと、割り込みルーチンでキー入力データをメモリ上に次々と+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コードの話に入ります。