現在地

Universal Monitor

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

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

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

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

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

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

2650ボード(2651編)

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


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

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

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

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

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

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

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

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

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

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

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など

INS8073のROMを読む(続き)

前回、ROM内のコンソールからの1文字入力ルーチンは0x092Bではないかという予測が立ちました。これをもう少し確認してみます。

まず0x0020~0x003FまでのCALL命令のベクタには0x092Bは登場しません。

それではJSR 0x092Bはどこかにないか、と探してみると1箇所だけありました。1箇所からしか呼ばれないなら貴重なCALL命令のベクタを割り当てないのも納得がいきます。

例によって付近を逆アセンブルしてみます。

INS807xにモニタを移植

前回書き始めていたモニタですが、いつものようにD(ump)コマンドが動くころには慣れてしまって残りはサクサク進み基本的なD,G,S,Lコマンドはすぐにできました。今回はちょっとわけあってP(unch)コマンドも追加しています。

SC/MP(I と II)とは以下のような相違点があります。

  1. 16ビット演算命令
    これ自体は便利でありがたいのですが、キャリ/ボロー込みの加減算命令がなくなってしまいました。モニタには必要ありませんでしたが、16ビットを超える演算は相当面倒になると思われます。条件分岐がAレジスタ(下位8ビット)でしかできないのも意外に不便です。
    SC/MPでは16ビットの値をメモリとやり取りすることがなかったのでエンディアンの概念がありませんでしたが、SC/MP IIIはリトルエンディアンです。
  2. スタックとサブルーチン
    サブルーチン呼び出しの機能が追加されたのは助かります。同時に長距離ジャンプも追加され、4kBページの制約も解消されています。

SL1960の判別

カテゴリー:

Z8S180 SL1960の最後で判別する方法を探すと書きましたが、とても簡単でした。

1992年の"Volume I Databook"にはZ80180とZ8S180の違いの記載があり、まだ新版が出るはるか前なので、Z80180(HD64180Z)とZ8S180 SL1960の相違点がわかります。

一方テクニカルノートTN005301-0506にはSL1960と新Z8S180の相違点が載っています。

この2つを参考にSL1960の判定を追加してみました。以下のコードはOMCRによってZ80180以降と判定されたところからです。

ページ