2012.6.30
前へ
次へ
ホームページトップへ戻る

復活!CP/M ワンボードマイコンでCP/Mを!
CP/MがTK−80互換のワンボードマイコンの上で復活します
ND80ZVとMYCPU80の上でCP/Mが走ります

[第162回]


●DMコマンド

CP/Mは、起動時のみROMに書かれたIPL(Initial Program Loader)を実行して、RAMにシステムプログラムをLoadし、それが完了すると、ROMを切り離してフルRAMの構成に移行します。

ND80ZVではUSBの送受信を使ってWindowsパソコンのキーボードからの入力やコマンドプロンプト画面への文字表示を、ROMに書かれたプログラムを実行することによって実現しています。

CP/M互換DOSも、CP/Mと同じようにシステムをRAMにロードしたあとはROMを切り離してフルRAM構成に移行するという形態を取ることにした場合には、ROMに書かれているUSB通信プログラム部分を別アドレスで実行できるように再アセンブルした上でRAMにコピーして使うことになります。

しかし、せっかくROMに書かれたものが存在しているのに、そのようにするのはあまりにもムダで勿体無いことでありますから、CP/M互換DOSでは、同じアドレス(0000〜7FFF)に配置したROMとRAMとを切り換えてアクセスする仕組みを使って、フルRAM構成のCP/M互換DOSからROMに書かれたUSB送受信プログラムをコールするように考えました。

前回はそれを実際におこなっているBIOSのコンソール入力とコンソール出力部分のプログラムリストを紹介して説明をいたしました。

BIOSをそのように書いたことによって、わざわざUSB送受信プログラムをRAM上にコピーしなくても、ROMのプログラムをコールして使うことができるようになりました。
[第157回]でお見せした、CP/M互換DOSの上で動作したMBASICも、前回説明しました、ROMのUSBアクセスルーチンをコールするように書かれたBIOSの機能を実際に利用することで動作しています。

ところで。
CP/M互換DOSと、その上で動作するアプリケーションソフトについてはそれでよいわけなのですが、CP/M互換DOSを検証する上では、デバッグのために、そのほかにもROMに書かれている機能を利用したいものが出てきます。

その機能のひとつにDMコマンドがあります。
DMコマンドはメモリの内容を16進数とアスキー文字で表示します。
マシン語のデバッグツールには欠かせない機能です。
DMコマンドはROMに書かれていますから、アドレス8000〜FFFFの範囲に対してはRAMの内容を表示できますが、0000〜7FFFの範囲に対してはROMの内容しか表示することができません。

それでは前回と同じようにしてROMとRAMを切り換えれば、0000〜7FFFの範囲のRAMの内容を表示することができるようになるかといいますと、ことはそんなに簡単ではありません。

ROMの0000〜7FFFの範囲にあるプログラムを実行中にいきなりROMからRAMに切り換えたりしたら、ROMからRAMに切り換わった直後にプログラムが突然消滅することになりますから、当然CPUは暴走してしまいます。

前回紹介しましたCP/M互換DOSのBIOSプログラムではROMとRAMを切り換えても問題がないのは、BIOSプログラムがROMとRAMを切り換えても影響を受けない8000〜FFFFの範囲のRAMに置かれているからです。

それじゃあROMに書かれているDMプログラムでは0000〜7FFFの範囲のRAMの内容を表示させることなんてできないじゃないの?
それこそ、同じプログラムを8000〜FFFFの範囲のどこかに移植するしか仕方がないじゃないの?

まあ、普通ならばそのように考えてしまうのでしょうけれど、そこがプログラムの面白いところで、ちょいと工夫をしますと。
ほら、ちゃんとできるじゃありませんか。

あ。
もちろん今ROMに書かれているDMプログラムは一部を書き直さなくてはいけませんけれど、全部をRAMに移植しなくても、ちゃんと0000〜7FFFの範囲のRAMの内容を表示させることは可能なのです。

というところで今回は時間がなくなってしまいました。

次回は、どのように工夫するとROMに書かれたDMコマンドで、そのROMと同じアドレスに割り当てられたRAMの内容を表示させることができるのか、ということについて実際のプログラムリストで説明をすることにいたします。

ワンボードマイコンでCP/Mを![第162回]
2012.6.30upload

前へ
次へ
ホームページトップへ戻る