2650ボード(2651編)
Universal Monitorの基本機能が動くようになったので、保留してあった2651を動かしてみることにします。
空きソケットに残りのICを搭載します。
コンソールドライバのソフトウェアも書かなくてはなりませんが、既に2650のプログラムには慣れているのでどうということはありません。
Universal Monitorの基本機能が動くようになったので、保留してあった2651を動かしてみることにします。
空きソケットに残りのICを搭載します。
コンソールドライバのソフトウェアも書かなくてはなりませんが、既に2650のプログラムには慣れているのでどうということはありません。
2650ボードが動き始めたのでソフトウェアを書いていきます。
前回ループが動作したのでメモリからの読み出しは動いており、次は書き込みができることを確認しなくてはなりません。
テストコードを書いても良いのですが、EMILY BoardのUART機能を使うための初期化ルーチンを動かしてみることにします。これはメモリに数バイトの定数を書き込むだけなのでこのテストにはうってつけです。
正しく書けたかどうかはEMILY Boardの機能でメモリをダンプしてみれば一目瞭然です。
特に問題なかったのでいつものように1文字出力・メッセージ出力・行編集と進めていきます。
ここまで動くようになる頃にはだいぶ慣れてきていますので、あとは黙々と実装していくだけです。
例によって書いていて気になったことをあげてみます。
前回DC
擬似命令で浮動小数点数を扱えるようになったのでテストを兼ねてASCIIART(マンデルブロ集合)を描かせてみました。
元はBASICのプログラムですがアセンブリ言語で書き直しました。16ビット整数や浮動小数点数がそのまま扱えるからか8ビット時代にアセンブリ言語で書いていて感じた面倒さはあまりなくスラスラ書けますね。
計算範囲と条件は はせりん@haserin09 さんの「番外編:ASCIIART(マンデルブロ集合)ベンチマーク」に合わせています。
実行してみたところ9600bpsのシリアルが足を引っ張っているように感じたので、計算はするけど画面出力を止めたバージョンも作って比べてみました。
結果は、表示ありで約7秒、表示無しで約6秒といったところでした。思ったほどシリアルの影響は出ていません。
ちょうど2年前にASのMN1613対応を行ないましたが、セグメント関係と浮動小数点関係が積み残しになっていました。
今MN1613が話題になっていることでもあり対応方法を考えていたのですが...
先日のUniversal Monitorの拡張を行なう中で他にも機能不足を感じる点が出てきました。
29/ 80F : 5374 7269 6E67 DC "String",CR,LF,0
812 : 000D 000A 0000
これは意図した結果ではありません。STROUT
ルーチンはバイト単位で取り出して処理するのでこのように途中に"00"が入るとそこで終了してしまいます。
HEXファイルの入出力ができるようになったら、次はブレークとレジスタの操作が欲しいところです。
MN1613は未定義のコードを実行しようとするとレベル0の内部割込みが発生するらしいのでこれを利用することにします。これが発生するとSTRとICをOSPW0(アドレスX'0000', X'0001')に保存し、NSPW0(アドレスX'0100', X'0101')から新しいSTRとICを読み込みます。OSPW, NPSWは外部割込みと共用ですが,内部割込みの場合はIISRというレジスタのビット15が立つので区別が可能です。
NSPW0にハンドラのアドレスを設定し、ハンドラではR0~R4, SPを保存しSTR, ICはOPSW0から取り出して表示させます。
これで試しにX'0800'番地にX'0000'を書き込んで実行させてみます。これは未定義命令なのでレジスタが表示されるかと思いきや何も起こりません。
この状態でステップ動作に切り替えてみたところ、X'0800', X'0801', X'0802'番地から順に命令フェッチを繰り返しているようです。
なんか若松通商さんにMN1613, MN1613Aが入荷したようで...
最小限のD
, G
, S
コマンドだけ作ってそのままになっているUniversal Monitor MN1610をこの機会に少し拡張してみようかと思いましてMN1613ボードを引っ張り出してきました。
このボード久々に動かそうとするといつもご機嫌斜めなんですよね。今回も動作しないのでいろいろ調べているうちに、いつの間にか動き出すという状況でした。特にどこかを直したというわけではないのですが...
とりあえず動くようになったので原因究明は後回しにしてプログラム変更に取り掛かります。
まずはHEXファイルをロードするL
からです。
MCS8085でUniversal Monitorを動かそうとするとネックになるのは以下の二点です。
一つ目はUART機能が無いこと。シリアルI/O用としてSID, SODが引き出されているのでソフトウェアUARTを実装する必要があります。
二点目はROM容量が2kBと小さいこと。現状のUniversal Monitor 8080は約2.5kBのROMを必要としますから二割ほど減らさなくてはなりません。
これらの点を何とか解決できれば動かせそうです。
まずはソフトウェアUARTですが、基本的にはCOSMACのソフトウェアUARTをそのまま8085に移植しました。
ロジックができたら1ビットの時間を合わせます。SIDから読んだビットをそのままローテートしたりできて条件分岐の必要が無いのでクロックを数えるのはCOSMACより楽ですね。分岐があるとルートごとのクロック数を揃えなくてはなりません。
ボードが出来たら当然次はソフトウェアを何とかしなくてはなりません。
いつものようにUniversal Monitorを移植することにします。
こういうのってCなどの高級言語か擬似コードを元にアセンブリ言語に変換していくのが一般的なのかもしれませんが、私の場合は似たプロセッサ向けのアセンブリ言語のソースを見ながら直接アセンブリ言語で書き下ろしています。
今回は8080用を元にしていて、現時点でD(ump), S(et), G(o), L(oad), P(unch)の各コマンドが動いています。ここまでで感じたことをあげてみます。
SHLD
, LXI
などCP-1600を実際に動かしてみるとなると問題になるものの一つとして開発環境をどうするかというのがあります。
ざっと探してみましたが使えそうなアセンブラが見当たりません。
Cコンパイラなどが無いのはともかく、アセンブラも無いのはさすがに困ります。いくら昔を懐かしむといっても今さらハンドアセンブルはしたくありません。
というわけで以前ASをMN1610対応させたようにCP-1600対応のコードジェネレータを書いてみました。
16ビットワードマシンであることなどMN1610に似ている点もあり、基本的な枠組みはMN1610とほぼ一緒です。
続いて各命令のデコーダを書いていきますが、結論から言うととても楽でした。
前回μCOM-87/ADファミリの命令についてグループを書きましたが、詳しく見てみると結構複雑な状況でした。
まずはプロセッサのグループ分け、このグループ自体は前回のものであっています。