現在地

プログラミング

NSC800ボード(ソフトウェア編)

予告通りNSC800ボードのソフトウェア編をお送りします。

NSC800はソフトウェア的にはZ80互換なので基本的にはZ80用のUniversal Monitorがそのまま動作します。とはいえ例外もありまして今回は以下の3点を追加・変更しています。

一つ目はコンソールドライバです。

これまではZ80 SIOかHD64180系・Z280の内蔵シリアル用しか無かったのでEMILY Boardのものを追加しました。適当なCPUから移植するだけなのですが...

実はCONOUTルーチンでAレジスタ保存するのを忘れてハマってしまいました。

ROMエミュレータ(ソフトウェア編)

プリント基板化したROMエミュレータのハードウェアが無事動作したので次はソフトウェアです。

マイコンをAT90S2313からATtiny2313に移行するためにはソフトウェアの変更が必要になります。

まず確認のためにHDD内に残っていたソースを再アセンブルして新しいAT90S2313に書き込んで試したところ動作しませんでした。動いたAT90S2313から読み出してバイナリを比較してみたところ一致せず、長らく真のソースだと思っていたものは開発途上の未完成品かもしれません。タイムスタンプによると20年ほど経っているので最終版を探すのは難しそうです。

救いは動いているバイナリが存在することで、これを逆アセンブルすればソースが復元できそうです。

以前INS8073のROMを読むででっち上げた簡易逆アセンブラをAVR用に改造して読んでみました。すると大半は共通で以下の機能が追加されているようです。

2650ボード(2651編)

Universal Monitorの基本機能が動くようになったので、保留してあった2651を動かしてみることにします。


空きソケットに残りのICを搭載します。

コンソールドライバのソフトウェアも書かなくてはなりませんが、既に2650のプログラムには慣れているのでどうということはありません。

2650ボード(ソフトウェア編)

2650ボードが動き始めたのでソフトウェアを書いていきます。

前回ループが動作したのでメモリからの読み出しは動いており、次は書き込みができることを確認しなくてはなりません。

テストコードを書いても良いのですが、EMILY BoardのUART機能を使うための初期化ルーチンを動かしてみることにします。これはメモリに数バイトの定数を書き込むだけなのでこのテストにはうってつけです。

正しく書けたかどうかはEMILY Boardの機能でメモリをダンプしてみれば一目瞭然です。

特に問題なかったのでいつものように1文字出力・メッセージ出力・行編集と進めていきます。

ここまで動くようになる頃にはだいぶ慣れてきていますので、あとは黙々と実装していくだけです。

例によって書いていて気になったことをあげてみます。

MN1613でマンデルブロ集合

カテゴリー:

前回DC擬似命令で浮動小数点数を扱えるようになったのでテストを兼ねてASCIIART(マンデルブロ集合)を描かせてみました。


元はBASICのプログラムですがアセンブリ言語で書き直しました。16ビット整数や浮動小数点数がそのまま扱えるからか8ビット時代にアセンブリ言語で書いていて感じた面倒さはあまりなくスラスラ書けますね。

計算範囲と条件は はせりん@haserin09 さんの「番外編:ASCIIART(マンデルブロ集合)ベンチマーク」に合わせています。

実行してみたところ9600bpsのシリアルが足を引っ張っているように感じたので、計算はするけど画面出力を止めたバージョンも作って比べてみました。

ASに新CPU対応を(続編)

カテゴリー:

ちょうど2年前にASのMN1613対応を行ないましたが、セグメント関係と浮動小数点関係が積み残しになっていました。

今MN1613が話題になっていることでもあり対応方法を考えていたのですが...

先日のUniversal Monitorの拡張を行なう中で他にも機能不足を感じる点が出てきました。

      29/     80F : 5374 7269 6E67      	DC	"String",CR,LF,0
              812 : 000D 000A 0000    

これは意図した結果ではありません。STROUTルーチンはバイト単位で取り出して処理するのでこのように途中に"00"が入るとそこで終了してしまいます。

Universal Monitor MN1610の拡張(その2)

カテゴリー:

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'番地から順に命令フェッチを繰り返しているようです。

Universal Monitor MN1610の拡張(その1)

カテゴリー:

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

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

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

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

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

MCS8085でUniversal Monitor

MCS8085でUniversal Monitorを動かそうとするとネックになるのは以下の二点です。

一つ目はUART機能が無いこと。シリアルI/O用としてSID, SODが引き出されているのでソフトウェアUARTを実装する必要があります。

二点目はROM容量が2kBと小さいこと。現状のUniversal Monitor 8080は約2.5kBのROMを必要としますから二割ほど減らさなくてはなりません。

これらの点を何とか解決できれば動かせそうです。

まずはソフトウェアUARTですが、基本的にはCOSMACのソフトウェアUARTをそのまま8085に移植しました。

ロジックができたら1ビットの時間を合わせます。SIDから読んだビットをそのままローテートしたりできて条件分岐の必要が無いのでクロックを数えるのはCOSMACより楽ですね。分岐があるとルートごとのクロック数を揃えなくてはなりません。

μPD78C10ボード(ソフトウェア編)

ボードが出来たら当然次はソフトウェアを何とかしなくてはなりません。

いつものようにUniversal Monitorを移植することにします。

こういうのってCなどの高級言語か擬似コードを元にアセンブリ言語に変換していくのが一般的なのかもしれませんが、私の場合は似たプロセッサ向けのアセンブリ言語のソースを見ながら直接アセンブリ言語で書き下ろしています。

元にしたソースのバグを発見したり、最適化を思いついたりすることもありますね。ある意味コードレビューしているようなものですから。

今回は8080用を元にしていて、現時点でD(ump), S(et), G(o), L(oad), P(unch)の各コマンドが動いています。ここまでで感じたことをあげてみます。

  1. ニーモニックは8080にそっくりなものが多い。SHLD, LXIなど

ページ