現在地

Universal Monitor MN1610の拡張(その1)


カテゴリー:

なんか若松通商さんにMN1613, MN1613Aが入荷したようで...

最小限のD, G, Sコマンドだけ作ってそのままになっているUniversal Monitor MN1610をこの機会に少し拡張してみようかと思いましてMN1613ボードを引っ張り出してきました。

このボード久々に動かそうとするといつもご機嫌斜めなんですよね。今回も動作しないのでいろいろ調べているうちに、いつの間にか動き出すという状況でした。特にどこかを直したというわけではないのですが...

とりあえず動くようになったので原因究明は後回しにしてプログラム変更に取り掛かります。

まずはHEXファイルをロードするLからです。

対応フォーマットは他プロセッサと同様にインテルHEXとモトローラSレコードですが、これらはどちらもバイト単位なのでバイトアドレスに換算しています。そのため以下のような制限があります。

  1. 現在16ビットアドレスのみなので32kWまでしか対応しません。
  2. Lコマンドのパラメータはワードアドレスです。
  3. アドレスフィールドが奇数の場合はエラーになります。
  4. 1レコード(1行)のバイト数が奇数の場合もエラーになります。

いつも使っているアセンブラAS(正確にはp2hex)が標準で出力するのもこのフォーマットですので大きな問題はないと考えています。

16ビットを超えるアドレスを使用する方法も存在しますが、あと1ビット増やすためだけに対応するのはちょっと大げさなので今回はパスしました。

続けてHEXファイルを出力するPコマンドです。

こちらもパラメータはワードアドレスですが、出力されるHEXファイルのアドレスフィールドはバイトアドレスになります。PI 7F00,80FFみたいなことをして32kW境界を越えると出力されるHEXファイルのアドレスフィールドが0000に戻るので注意が必要です。

仕様さえ決めてしまえばそう難しいことは無いのですが... MN1610系は久しぶりだったのでハマった点をいくつか紹介しておきます。

  1. MVI命令
    MN1610系でほぼ唯一のイミディエイト命令でレジスタに小さな(8ビット)値を設定するのに便利なのですが...
    MC68000系で類似のMOVEQ命令と異なり上位ビットがそのまま残ってしまいます。頭ではわかっていても調子よくコードを書いていてつい忘れてしまい悩んでしまいました。上位をクリアしたい場合は事前にEOR Rn,Rnなどでクリアしておくか、近傍に置いた定数をIC相対でロード(MVI命令は使わない)することになります。
    このモニタではCBと組み合わせて多用しています。この場合は上位ビットは何が入っていてもかまわないので。
  2. MVB命令
    これ下位バイトのレジスタ間転送として使う分には何も問題は無いのですが、MVB Rn,Rn,Zなどと同じレジスタを指定して下位バイトによる条件スキップとして使おうとすると思ったように動きません。どうも下位バイトを転送後に全16ビットを対象に条件判定しているようです。
    確かに『LSI説明書』でもCB命令の項では「上位8ビットにはどのような値が入っていても結果には影響しない」と明記されていますが、MVB命令の項では曖昧な書き方しかされていません。

次回はブレークとRコマンドについて書く予定です。

参考文献・関連図書: 
『PANAFACOM L-16A LSI説明書』

コメントを追加

Plain text

  • HTMLタグは利用できません。
  • ウェブページアドレスとメールアドレスは、自動的にハイパーリンクに変換されます。
  • 行と段落は自動的に折り返されます。
※ コメントは原則公開です。個別のご相談などは「ご意見・ご要望」からお願いします。