WR-X CPU module用のシリアル通信プログラムを、以前H8/3069用に作ったプログラムから移植作業をここ数日やっていた。
昨日からどうにも割り込みがうまく動かないので、昨日8時間くらい、今日7時間くらいぶっ続けでやり続けて、ようやくバグの箇所も分かり、何とか動かすことができた。
SH4の割り込みは構造が非常に複雑なだけではなく、さらに特権モードの時にレジスタ構成が2つに分かれ、さらにユーザーモードも別にあるという、なんとも複雑な構成になっているため、割り込みをやるにもそう簡単ではなく、スタートアップルーチンから全部考えて作り直さなければいけないので、非常に複雑&大変なのであった。
今は特権モードのみで動かしているが、通常はユーザーモードで動作中にハードウェア割り込みが入って割り込み用特権モードに移行するわけだ。
つまり、特権モード動作中であっても、ユーザーモード動作中であっても同じように動かないといけないのだが、これまたSH4は割り込みが入ると勝手に内部でレジスタ構成を特権モード1に変更するため、電源投入後のデフォルトである特権モード1のまま普通にスタートアップルーチンとか動作させていると、割り込みが入った場合にレジスタ退避がうまくできなくなる。
レジスタセットが独立に2種類あるのはユーザーモードからの割り込み時に退避なしで高速動作ができる、という利点を考慮しての設計なのだろうが、実際には多重割り込みもかかし、割り込み要因がレジスタ値をシフトしてジャンプさせろ、みたいな何ともやりにくい構造になっているため、結局はレジスタが2種類あるせいで複雑になっているだけだったりもするw
で、何とかプログラムを組んだものの、どうにも動作しない。
PCとは違って、フィードバックがLED2個しかないので、デバッグが大変なのなんの。通信ルーチンさえできてしまえば情報をPCへ送って表示させたりできるのだが、その通信ルーチンを作っているんだからもうどうしようもない。
そして、不意にアセンブラで分岐命令を書こうものなら、SH4は遅延分岐を行っているため、bra命令の次の命令に注意しないと、思いもよらない動作をしてくれたりするし。
しかし、2日間みっちりやったおかげで、何とかバグもほぼ取れて、まともに動くようになった。
まったくこの2日間は苦労した。
●オマケ
研究室のある校舎に住み着いたネコの今日の様子。ここは余り人のいない校舎なので、のんびりその辺で昼寝などをしているのであった。
ネコ なつかしいですー!