現在地

ソフトウェア

[UniMon] アセンブリ言語で書いている理由

テーマ:

現時点でも6800, 6809, 8080, AVR, Z8, Z80と多くのプロセッサで動いているUniversal Monitorですが、まだまだ対応プロセッサは増やすつもりでいます。

すでに完成したボードがあって動かせるMC68000、SBC8088ボード購入済みであとは組み立てるだけの8086/8088、6502/65C816あたりが次の候補ですね。

これだけの多プロセッサ展開を前提としているのになぜC言語を使わないのか不思議に思われるかもしれません。

そこで今回は何故オールアセンブリ言語なのか書いてみようと思います。

CPU判別法(80編)

68編に引き続き80編をお送りします。

8080系

8080系とZ80系の区別は『I/O』誌の記事を参考にしました。i8080/μPD8080AF, μPD8080A, i8085の判別法は一般的なものがあれば利用するつもりでしたが、見当たらなかったのでデータシートを元に独自に書いたものです。

CPU判別法(68編)

現在のCPUではその種類や対応する命令の範囲などを取得する命令(例えばx86系のCPUID命令)がありますが、以前は微妙な挙動の違いなどから判別していました。

自作のUniversal Monitorのソースコードを例に解説してみます。

MC6800系

まずは昨日目処が立ったと書いたMC6800系からです。

この系統はあまり情報が無く(旬な時期にあまりかかわらなかったのも理由です)手持ちのデバイスで試しながら書いたものです。

該当部分のソースは次のようになっています。

Universal Monitor コマンド一覧

テーマ:

Universal Monitor Z8の基本機能が現在対応している全プロセッサで使用可能になりました。

前回はコマンドの概要のみを書きましたが、今回はコマンドラインの形式も書いておきます。

コマンドは原則1文字ですが、PIなどのように2文字のものも一部あります。
<addr>,<offset>といった数値パラメータは16進表記で必要以上の桁数を入力した場合は末尾が使用されます。
英字の大文字小文字は区別されません。
コマンドとパラメータの間・パラメータとカンマの間には空白を入れても構いません。ただし行入力バッファは短いので注意してください。

モニタ プログラム

カテゴリー:

Z8用モニタについて書きましたが、それ以前にもモニタは何度となく書いています。

  1. Z80ボード3号機
    これはオリジナルではなく『トランジスタ技術』1984年6月号掲載のものをベースに移植・拡張したものです。Z80のアセンブリ言語で記述されています。
    他の多くがシリアルポート経由で操作するのに対し、16進テンキーと8桁7セグメントLEDを使用します。
  2. MC68kボード
    これもオリジナルではありません。やはり『トランジスタ技術』1985年4月号掲載のものを移植拡張しました。MC68000のアセンブリ言語で記述されています。後にMC68010用に変更しています。

Universal Monitor Z8

テーマ:

カテゴリー:

先日のROMエミュレータを2732には去年作ったZ8613ボードにモニタを移植するのが目的でした。

Universal Monitor Z8
とりあえず基本的な機能が動くようになりましたので、試しているスクリーンショットを載せておきます。

まずは0FFF8H~0FFFFH,0000H~0077Hまでのメモリダンプ、次のHコマンドでCが表示されているのでこれはプログラム(コード)メモリ空間です。

FDCボード (テスト編 その3)

テーマ:

カテゴリー:

ちょっと間があいてしまいました。

前回CRCエラーが出ているとはいえ一応セクタが読めるようになりました。データ転送のオーバランも発生していません。

FDCの回路を作るのは今回が初めてですが、8ビット時代に製作記事はよく読んでいました。そこではデータ転送が間に合うかどうかが大きな課題として扱われることが多く、ソフトウェアでステータスを見ながらでは取りこぼすということでいろいろな工夫がありました。

  • 他の割り込みを禁止する
  • DMA(Direct Memory Access)を利用する。これは速度の余裕ができてからもほかの理由で使われ続けました。
  • ステータスをチェックしないでデータ転送する。そのままでは正常に転送できないので、ハードウェアでFDCへのアクセスを引き伸ばす。

それで当初は心配していたのですが、さすがに当時とはCPUの速度が一桁以上上がっているので余裕がありますね。

FDCボード (テスト編 その2)

テーマ:

カテゴリー:

前回手動でコマンド発行するところまで書きました。

このままでは面倒ですし、何よりデータ転送を伴うコマンドが使えません。

メモリ上にコマンドとパラメータ列を書いておいて自動で送信、リザルトステータスの受信までを行えるようにします。

当初はステータスレジスタを参照しながら送信・受信を自動切換えさせようとしたのですが、なぜか不安定だったのでパラメータやリザルトのバイト数を指定するように変更しています。

FDCのマニュアルを読みながらだったので何かを見落としていた可能性が高いです。

これでFDCとのやりとりはできるようになったので、実際にディスクを読んでみることにします。

FDCボード (テスト編 その1)

テーマ:

カテゴリー:

先日から製作中のFDCボード、ハードウェアができたらソフトウェアを書かなくてはなりません。FDC絡みのソフトウェア経験はほとんどないのでいろいろ試しながらになります。

ベースとしてROMエミュレータのソフトウェアを使いました。I/O経由でRAMにアクセスしていたところを内蔵RAMに書き換えればメモリのダンプとセット、それからHEXファイルでの入出力が可能になります。

ATmegaのヒューズ設定で若干てこずりましたが...

それにFDCレジスタへのアクセス機能(コマンド)を追加します。

ページ