INS8073のROMを読む(続き)
前回、ROM内のコンソールからの1文字入力ルーチンは0x092Bではないかという予測が立ちました。これをもう少し確認してみます。
まず0x0020~0x003FまでのCALL
命令のベクタには0x092Bは登場しません。
それではJSR 0x092B
はどこかにないか、と探してみると1箇所だけありました。1箇所からしか呼ばれないなら貴重なCALL
命令のベクタを割り当てないのも納得がいきます。
例によって付近を逆アセンブルしてみます。
前回、ROM内のコンソールからの1文字入力ルーチンは0x092Bではないかという予測が立ちました。これをもう少し確認してみます。
まず0x0020~0x003FまでのCALL
命令のベクタには0x092Bは登場しません。
それではJSR 0x092B
はどこかにないか、と探してみると1箇所だけありました。1箇所からしか呼ばれないなら貴重なCALL
命令のベクタを割り当てないのも納得がいきます。
例によって付近を逆アセンブルしてみます。
INS8070ボードでROMのBASICの1文字入出力ルーチンを独自のものにしようとしてうまくいかなかったと書きましたが、モニタを移植したことでROM内を読めるようになったので関連箇所を調べてみることにしました。
まずはPコマンドでROMのアドレス範囲(0x0000~0x09FF)をPCに持ってきます。
手頃な逆アセンブラがないかネットを探してみたのですが見当たらなかったので簡単なものを書いてしまいました。
さて、どこから手を付けるかですが、先頭から読んでいくのはしんどいです。
今回調べたいのは文字入出力だけなのでメッセージから追っていくことにします。
メモリダンプを見ていくとASCII文字列がいくつもありますが、多くはBASICの予約語なので今回の目的には使えません。その中で良さそうなものが見つかりました。
前回書き始めていたモニタですが、いつものようにD(ump)コマンドが動くころには慣れてしまって残りはサクサク進み基本的なD,G,S,Lコマンドはすぐにできました。今回はちょっとわけあってP(unch)コマンドも追加しています。
SC/MP(I と II)とは以下のような相違点があります。
前々回や前回書いたような厄介な点はありましたが、CDP1802ボードでUniversal Monitorを動かすのは思っていたより簡単でD(ump), G(o), S(et), L(oad)の各コマンドは動作するようになりました。
そうなると今度はSBC1802でも動かしてみたくなります。
ところがこれにはUART相当のハードウェアは無く、CPU内蔵のQ, EF3をシリアルポートとして使うようになっています。UARTの機能をソフトウェアで実現しなくてはなりません。
前回書いたようにCOSMACにはサブルーチン呼び出しの仕組みがありません。
それではどうするかというとSEP
命令を使います。
COSMACはメモリをポイントできるレジスタを16個 R(0)
~R(F)
と、4ビットのレジスタP
を持っています。R(0)
~R(F)
の内P
で選ばれたR(P)
がプログラムカウンタとして使用されます。
SEP
命令でP
に新たな値を設定することでサブルーチンを呼び出し、P
に元の値を設定することで戻ることができます。
CDP1802のハードウェアができたのでいつものようにUniversal Monitorを移植していきます。
以前SC/MP使いの憂鬱で書いたようにSC/MPはかなり癖の強いアーキテクチャでしたが、このCOSMACも負けず劣らずですね。
Z8S180 SL1960の最後で判別する方法を探すと書きましたが、とても簡単でした。
1992年の"Volume I Databook"にはZ80180とZ8S180の違いの記載があり、まだ新版が出るはるか前なので、Z80180(HD64180Z)とZ8S180 SL1960の相違点がわかります。
一方テクニカルノートTN005301-0506にはSL1960と新Z8S180の相違点が載っています。
この2つを参考にSL1960の判定を追加してみました。以下のコードはOMCRによってZ80180以降と判定されたところからです。
忘れていましたがSuperH版とH8/300版からUniversal MonitorのL(oad)コマンドの仕様を変更しています。
1.はすべてのプロセッサに、2.は64kBを超えるメモリ空間を持つプロセッサに展開したいところですね。
あとIntel HEXの02,04レコードも対応したいところです。セグメントの02は8086系以外ではあまり意味がないでしょうから8086版のみ、32ビットリニアアドレスの04は上記2.と同じように64kBを超えるメモリ空間を持つプロセッサで対応すれば良さそうです。
さて、この新仕様のL(oad)を先に実装したSuperHでテストをしていた時です。
なんとかSCIが動くようになったのでUniversal Monitorの移植に取り掛かれます。
SuperHファミリはここで取り上げるプロセッサとしてはモダンな部類ですが、アセンブリで書くとなるとかなり癖が強いですね。慣れるまでは結構てこずりました。
移植の過程で気になった点をいくつか上げてみます。
SuperHの大きな特徴の一つはすべての命令が16ビット長ということです。これはオペコード部の長さではなくオペランドを含めても16ビットということですから、大きな値やアドレスを持つことができません。
即値は一部の命令で8ビットのものがありますが、さすがに8ビット程度では意味がないので絶対アドレッシングは存在しません。
Z280は特別な初期化をしなくても高速なZ80として動作するので何もしていませんでしたが、Z180の初期化を加えたのでZ280でもやってみました。ゆくゆくはトラップの対応などもやってみたいと考えています。
以下はCPU判別でZ280であると判定されたところです。