2020-08-11 23:55 — asano
カテゴリー:
8031/8032ボードはいくつかアドレスを変えながらループさせてアドレスバス確認が出来たところで一応完成ということにして、Universal Monitorの移植にかかります。
ターミナルはEMILY Board経由と内蔵UARTの両方に対応することにしますが、まずは簡単そうなEMILY Board経由で一通り動かしてみることにして一通りのコマンド(D(ump), G(o), S(et), H(bank), L(oad))を実装してみました。
これもまた癖のあるアーキテクチャですね。
- メモリ空間
プログラムを実行できるコード空間(64kBまで、読み出しのみ)・レジスタのように使えるデータ空間(256Bまで)・外部データ空間(64kBまで)に分かれています。コード空間・外部データ空間は専用命令でしかアクセスできない(さらにアドレス指定の方法も少ない)のであまり使いやすくはありません。 - スタック
スタックはデータ空間にしか取れないので容量の制限が厳しいです。またアドレスの大きい方向に伸びてゆくという珍しいものです。 - 比較命令
一般的な Compare 命令がありません。代わりに Compare, Jump if Not Equal というややこしい命令が存在します。これは例えばCJNE A,#5,LABEL
という命令はアキュムレータAと即値5を比較し、不一致ならLABELにジャンプするという命令です。Zフラグに相当するものが無いので命令を分けられなかったみたいです。ジャンプ条件が逆のCJE
が無いのも要注意ですね。
キャリーフラグは変化するので、単純にキャリーで比較したい場合などはジャンプ先を次の命令にしてジャンプ機能を無効化します。 - 減算命令
ボロー無しの減算命令がありません。事前にCLR C
などでボロー(キャリー)フラグをクリアしておくなどの対策が必要です。
上のCJNE
もそうですが非対称なところが多いですね。
まぁ最初は戸惑いますが、書いているうちに慣れてきて後半は結構サクサク進むようになりました。
それでもちょっと厄介だったのはデバッグでした。EMILY Boardで動かす場合たいていワークエリアはEMILY Board上のRAMに取り、そこはいつでも(EMILY Board経由で)自由に参照・変更できるのでデバッグが楽なのですが、今回は内蔵RAM上なのでD(ump), S(et) コマンドが正しく動作するようになるまでは無理です。
それではということで外部データ空間に配置しようと思ってもスタックは無理ですし、ワークエリアもアクセスが容易ではない(DPTR
レジスタでしかアドレス指定できない)ので簡単ではありません。
結局あちこちにCALL HEXOUT2
みたいなのを埋め込みましたね。
一通り動作するようになったら内蔵UARTでも動かしてみます。
ボーレートジェネレータはTimer 1を使うことにします。今載せているのはP80C32なのでTimer 2も使えるはずですが、どの石を載せても使えるようにしたいのと、せっかくそのためにクロック周波数を選定しましたので。
TimerもUARTも使い方は難しくありませんが、要注意な点がありました。
一つは1キャラクタの受信・送信が完了するとそれぞれRI
・TI
というビットが立つのですが、受信データを読み出したり次の送信データを書き込んでもこのビットがクリアされないこと。データアクセス後に明示的にクリアしてやらないといけません。
もう一つは初期化終了でTI
が立たないこと。通常はTI
が立っていることを確認して次のデータを書き(TI
をクリアする)のですが、最初だけはTI
を無視してデータを書いてやらないといけないようです。
コメント
MCS51のモニタ
こんにちは。8051用の良さげなモニターを探していました。良い物が出来ると今から楽しみです。
コメントを追加