現在地

プログラミング

INS8073のROMを読む

カテゴリー:

INS8070ボードでROMのBASICの1文字入出力ルーチンを独自のものにしようとしてうまくいかなかったと書きましたが、モニタを移植したことでROM内を読めるようになったので関連箇所を調べてみることにしました。

まずはPコマンドでROMのアドレス範囲(0x0000~0x09FF)をPCに持ってきます。

そう、P(unch)コマンドを実装したのはこのためです。

手頃な逆アセンブラがないかネットを探してみたのですが見当たらなかったので簡単なものを書いてしまいました。

さて、どこから手を付けるかですが、先頭から読んでいくのはしんどいです。

今回調べたいのは文字入出力だけなのでメッセージから追っていくことにします。

メモリダンプを見ていくとASCII文字列がいくつもありますが、多くはBASICの予約語なので今回の目的には使えません。その中で良さそうなものが見つかりました。

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ページの制約も解消されています。

ソフトウェアUART

カテゴリー:

前々回前回書いたような厄介な点はありましたが、CDP1802ボードUniversal Monitorを動かすのは思っていたより簡単でD(ump), G(o), S(et), L(oad)の各コマンドは動作するようになりました。

そうなると今度はSBC1802でも動かしてみたくなります。

ところがこれにはUART相当のハードウェアは無く、CPU内蔵のQ, EF3をシリアルポートとして使うようになっています。UARTの機能をソフトウェアで実現しなくてはなりません。

COSMACでサブルーチン

カテゴリー:

前回書いたようにCOSMACにはサブルーチン呼び出しの仕組みがありません。

それではどうするかというとSEP命令を使います。

COSMACはメモリをポイントできるレジスタを16個 R(0)R(F)と、4ビットのレジスタPを持っています。R(0)R(F)の内Pで選ばれたR(P)がプログラムカウンタとして使用されます。

SEP命令でPに新たな値を設定することでサブルーチンを呼び出し、Pに元の値を設定することで戻ることができます。

COSMACのソフトウェア

カテゴリー:

CDP1802のハードウェアができたのでいつものようにUniversal Monitorを移植していきます。

以前SC/MP使いの憂鬱で書いたようにSC/MPはかなり癖の強いアーキテクチャでしたが、このCOSMACも負けず劣らずですね。

  1. PCがない
    プログラムカウンタに相当するものが無いわけではありません。複数あるレジスタのどれをプログラムカウンタとして使うか選択できるようになっています。専用のものがないという点でだいぶ変わっています。

SL1960の判別

カテゴリー:

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

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

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

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

L(oad)コマンドとH8/SHのSCI

カテゴリー:

忘れていましたがSuperH版とH8/300版からUniversal MonitorのL(oad)コマンドの仕様を変更しています。

  1. これまでサポートしているレコード(Intel HEXの00,01・S recordのS1,S9)以外の動作は不定でしたが、未サポートのレコードは読み飛ばすように変更しました。チェックサムの確認も行なわれません。
  2. S recordの24ビットアドレス(S2,S8)と32ビットアドレス(S3,S7)を新たにサポートします。

1.はすべてのプロセッサに、2.は64kBを超えるメモリ空間を持つプロセッサに展開したいところですね。

あとIntel HEXの02,04レコードも対応したいところです。セグメントの02は8086系以外ではあまり意味がないでしょうから8086版のみ、32ビットリニアアドレスの04は上記2.と同じように64kBを超えるメモリ空間を持つプロセッサで対応すれば良さそうです。

さて、この新仕様のL(oad)を先に実装したSuperHでテストをしていた時です。

SH7045ボードを動かす(ソフトウェア編)

なんとかSCIが動くようになったのでUniversal Monitorの移植に取り掛かれます。

SuperHファミリはここで取り上げるプロセッサとしてはモダンな部類ですが、アセンブリで書くとなるとかなり癖が強いですね。慣れるまでは結構てこずりました。

移植の過程で気になった点をいくつか上げてみます。

定数の制限

SuperHの大きな特徴の一つはすべての命令が16ビット長ということです。これはオペコード部の長さではなくオペランドを含めても16ビットということですから、大きな値やアドレスを持つことができません。

即値は一部の命令で8ビットのものがありますが、さすがに8ビット程度では意味がないので絶対アドレッシングは存在しません。

Z280固有の初期化(その1)

Z280は特別な初期化をしなくても高速なZ80として動作するので何もしていませんでしたが、Z180の初期化を加えたのでZ280でもやってみました。ゆくゆくはトラップの対応などもやってみたいと考えています。

以下はCPU判別でZ280であると判定されたところです。

MC68000でブレーク

カテゴリー:

長らくお待たせしました、MC68000でのブレーク処理です。

MC68000でブレークに使いやすい命令は何かを考えてみます。命令を置き換えて埋め込むので1ワード長のもの、ユーザモードで実行中でもスーパバイザモードに戻ってくるためには例外を発生させるものが良さそうです。もちろん無条件で実行される必要があります。

これらの条件を満たすものとして以下が考えられます。

  1. TRAP命令
  2. 特権命令
  3. 未実装命令(Line-1010, Line-1111)
  4. 不当命令

TRAP命令はAPI的に使われることが多いのでできれば残しておきたいところです。

スーパバイザモードでブレークしたくなることも考えると特権命令も避けたいですね。

未実装命令もMC68020+MC68881などでは使われます。X68000がIOCSコールに未実装命令を使用していたのですが、X68030開発時にコプロセッサ命令との衝突がありIOCSコールの番号を変更せざるを得なかったという事例があります。

ページ