POCOの最後の命令の拡張の部分を読んでいますが、その中に今回始めて2つのレジスタの値を書き換える命令があります。

JAL X: r7<-pc+1, pc<-pc+X+1

JALはサブルーチンコールをする命令です。pcはPOCOでは決め打ちでr7に退避します。サブルーチンから返ってきたらJAL命令の次の命令に戻るのでr7にはpc+1を保存します。その後でpcにX+1を加えます。

が、本に書いてあるVerilog記述を見ていると、この2つの書き込みそれぞれは確かに動きそうなのですが、1つ目の書き込みが終わった後r7へのライトイネーブルを落とす箇所が見当たりません。よってせっかく加算をする前のpcをr7に保存してもすぐ上書きされそうに見えます。

本当かなあ?自分の勘違いかもしれないのでもう少し検討してみます。どうしても分からなければシミュレーションしてみますが。

POCOのアセンブラを検討しました。

ROMデータにならない記述としてIFDEF、EQU(名前定義)、コメント、ラベルを考えましたが、一旦コメントとラベルだけをサポートしようと思います。

これらが記述されていると行数は進むがアドレスは進まない場合があります。バイナリの他にリストファイルも生成するので行数とアドレスを別管理します。

ラベルは未定義の内に使用される可能性があります(アドレスが増加する方向へのジャンプ)ので、ラベル処理のみ第1パスで行い、ラベルの表を作成しておき、第2パスでバイナリ生成を含む他の処理をさせようと考えています。

エラー処理については方針が固まっていません。何行目がエラーと出力してそこでアセンブルを止めるのが楽ですがそれで良いか。無理して先に進めようとすると複雑になる可能性があるのでここは割り切ってしまうかも。

ラベル表作成機能から始めることにしました。

サブルーチンコールに関する解説を読みました。

pcの退避にr7レジスタを、spにr6レジスタを使うのでリターンサブルーチンやプッシュ、ポップは専用命令ではなく既存の命令やそれの組み合わせによってソフトで実現されます。

サブルーチンコールするのは専用命令が定義されていますが、これもソフトで実現できそう。RISCはCISCに比べてよりプリミティブな命令になっているからなのでしょう。

メモリに書き込む話をしているのかレジスタに書き込む話をしているのかすぐ混乱してしまいます。RISCなので基本はレジスタが対象と自分に言い聞かせながら読むようにしました。

命令の拡張は一旦ここまでで、次は拡張した命令をVerilogコードで実装します。