2021-11-19 20:33 — asano
カテゴリー:
なんか若松通商さんにMN1613, MN1613Aが入荷したようで...
最小限のD
, G
, S
コマンドだけ作ってそのままになっているUniversal Monitor MN1610をこの機会に少し拡張してみようかと思いましてMN1613ボードを引っ張り出してきました。
このボード久々に動かそうとするといつもご機嫌斜めなんですよね。今回も動作しないのでいろいろ調べているうちに、いつの間にか動き出すという状況でした。特にどこかを直したというわけではないのですが...
とりあえず動くようになったので原因究明は後回しにしてプログラム変更に取り掛かります。
まずはHEXファイルをロードするL
からです。
対応フォーマットは他プロセッサと同様にインテルHEXとモトローラSレコードですが、これらはどちらもバイト単位なのでバイトアドレスに換算しています。そのため以下のような制限があります。
- 現在16ビットアドレスのみなので32kWまでしか対応しません。
L
コマンドのパラメータはワードアドレスです。- アドレスフィールドが奇数の場合はエラーになります。
- 1レコード(1行)のバイト数が奇数の場合もエラーになります。
いつも使っているアセンブラAS(正確にはp2hex
)が標準で出力するのもこのフォーマットですので大きな問題はないと考えています。
16ビットを超えるアドレスを使用する方法も存在しますが、あと1ビット増やすためだけに対応するのはちょっと大げさなので今回はパスしました。
続けてHEXファイルを出力するP
コマンドです。
こちらもパラメータはワードアドレスですが、出力されるHEXファイルのアドレスフィールドはバイトアドレスになります。PI 7F00,80FF
みたいなことをして32kW境界を越えると出力されるHEXファイルのアドレスフィールドが0000に戻るので注意が必要です。
仕様さえ決めてしまえばそう難しいことは無いのですが... MN1610系は久しぶりだったのでハマった点をいくつか紹介しておきます。
MVI
命令
MN1610系でほぼ唯一のイミディエイト命令でレジスタに小さな(8ビット)値を設定するのに便利なのですが...
MC68000系で類似のMOVEQ
命令と異なり上位ビットがそのまま残ってしまいます。頭ではわかっていても調子よくコードを書いていてつい忘れてしまい悩んでしまいました。上位をクリアしたい場合は事前にEOR Rn,Rn
などでクリアしておくか、近傍に置いた定数をIC相対でロード(MVI
命令は使わない)することになります。
このモニタではCB
と組み合わせて多用しています。この場合は上位ビットは何が入っていてもかまわないので。MVB
命令
これ下位バイトのレジスタ間転送として使う分には何も問題は無いのですが、MVB Rn,Rn,Z
などと同じレジスタを指定して下位バイトによる条件スキップとして使おうとすると思ったように動きません。どうも下位バイトを転送後に全16ビットを対象に条件判定しているようです。
確かに『LSI説明書』でもCB
命令の項では「上位8ビットにはどのような値が入っていても結果には影響しない」と明記されていますが、MVB
命令の項では曖昧な書き方しかされていません。
次回はブレークとR
コマンドについて書く予定です。
コメントを追加