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

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

[第8回]

●ND80ZVCP/Mメモリマップ

今回はCP/Mシステムのメモリマップについて説明をします。

かっての8ビットマイコンなどではメモリはシステムROMとRAMで構成されるのが普通でしたが、CP/Mシステムはメモリの全領域がRAMであるところが特徴的です。

8080やZ80の場合メモリエリアは0000〜FFFFの64KBです。
システムによってはその全域にメモリを実装していないこともありますが、ND80ZVは0000〜7FFFの32KBがシステムROMで8000〜FFFFが32KBのRAMになっています。
しかしCP/Mを走らせるためには、0000〜FFFFの全メモリ領域がRAMである必要があります。

厳密に言えば0000番地から始まる少なくとも32KB程度以上がRAMであることが、CP/Mを走らせるための条件で、必ずしも全領域がRAMである必要はありません。
しかし、少なくとも現在ND80ZVのシステムROMがある、0000〜7FFFのエリアはRAMでなければなりません。

ところで全部をRAMにしてしまうと、システムを起動することができません。
ROMがなければ起動することもできませんから、CP/Mを搭載したシステムでも、通常は起動のためのROMも搭載しています(注記)。

CP/MシステムではROMで起動したあと、イニシャルローダーという小さなプログラムが実行されてフロッピーディスクから最初のプログラムをRAMに読み込みます。
そのあとは読み込んだプログラムに制御が移り、フロッピーディスクから残りのCP/MプログラムをRAMに読み込んだあと、ROMを読み出し禁止にしてメモリマップ全体をRAMだけの構成にします。

[注記]ここでROMがなければ起動できません、と書きましたが、たとえばMYCPU80のようにトグルスイッチをずらっと並べて、アドレスとデータをビット単位で設定できるような装置があれば、ROMがなくても起動させることは可能です。
その昔のコンピュータやミニコンにはそういう仕組みのものもありました。
その場合にはパネルにずらっと並んだトグルスイッチを操作して数十バイトほどのイニシャルローダを1バイトずつRAMに直接入力したあと、そのプログラムをスタートさせます。

CP/Mはそのように、システムプログラムをRAM上にインストールしますから、通常はフロッピーディスクなどの補助記憶装置が必要でした。
当時は8インチまたは5インチのフロッピーディスクに記録された形でCP/Mが売られていましたし、CP/M上でアプリケーションを実行する仕組みも、フロッピーディスクがあることが前提になっていました。

ND80ZVCP/Mシステムでは、そこのところをUSBで接続したWindowsパソコンのハードディスクに仮想フロッピーディスクを設けることでクリアするように考えています。

それは、しかし、[第6回]で説明をしました第2段階でのシステムです。
第1段階では、0000〜7FFFはROMのままでCP/Mを走らせる工夫をします。

図で説明をいたしましょう。

図の左が一般的なCP/Mのメモリマップ例です。
0000〜00FFはCP/Mのワークエリアになっていて、アプリケーションプログラムやユーザーの作ったプログラムなどは0100番地から入れられます。
つまりCP/Mでのプログラムの実行開始アドレスは0100番地になります。
CP/M本体はメモリマップのずっと後の方、大体CXXX番地のあたりからの約7KBに配置されます。

CP/M本体は3つのプログラム部分に分かれています。
その先頭の2KBはCCP(Console Command Processor)と呼ばれる、コンソールからコマンドを入力することで実行される基本的なコマンドプログラムで、そのコマンドにはたとえばDIRとかTYPEなどがあります。
その後にCP/Mの本体とも言うべきBDOS(Basic Disk Operation System)3.5KBがあります。
そしてその後に各機種に固有な入出力部分のプログラムであるBIOS(Basic Input Output System)1.5KBがあります。
ただBIOSだけは機種に固有なので、これよりも長いこともあれば短いこともあります。

図の右側がND80ZVのメモリマップです。
これは0000〜7FFFがROMのままで使う場合のメモリマップです。
CP/MはBC00〜に置いています。
E000〜FFFFはND80ZVのZB3BASICシステムのワークエリアですから、それよりも前のエリアでなければ使うことができません。
計算上は左側のマップと同じC400〜でも収まりそうですが、とりあえずBIOSのために余裕がほしいと考えたので、この配置になりました。

0000〜00FFのCP/Mワークエリアと0100〜のトランジェントエリアは、8000〜80FFおよび8100〜に変更してあります。
こうすることで0000〜7FFFがROMのままでもCP/Mを使うことができると考えました。

もっともこれはあくまでテスト的な動作に限定しての話です。
CP/Mのアプリケーションは0100番地にロードしてから実行されるように設計されていますから、CP/M本体の機能だけを8000〜で動作するように改造しても、アプリケーションを走らせることまではできません。

しかし自分で作成したプログラムならば、8100番地にロードして、そこでスタートするようなプログラムにすることは可能です。
その例として、前回は「応用CP/M」に載っていた、0100番地から走るプログラムを8100番地に変更したうえで、実行しているところをお見せしました。

さて。
CP/Mのもうひとつの条件はフロッピーディスクが必要、というものでした。
そのために第2段階では、仮想フロッピーディスクを用意します。
しかし、それは先の話で、まだその準備はできていません。

そこで、ND80ZV上のRAMエリアを仮想フロッピーディスクに利用することを思いつきました。
トランジェントエリアは、8100〜BBFFまでのエリアですが、これはあくまでテスト用のシステムですから、何十KBもあるような大きなプログラムを走らせるつもりはありません。
そんなプログラムを書くことはとても簡単にできることではありませんし、上でも説明しましたように、そもそもこのメモリマップでは既成のアプリケーションプログラムを走らせることはできません。
それならどうせすっぽり空いていて、おそらく使うことのないエリアなのですから、そこを仮想フロッピーディスクに使ってしまってもよいはず、と考えました。

さてさて。
仮想フロッピーディスクをRAM上に置くなんて、口で言うのは簡単だけれど、そんなことをするには大変なプログラムを書かねばならないのじゃないの?

いえいえ。そんなことはありません。
驚くほど、簡単なプログラムで済んでしまいます。

あ。でも。時間がありません。
そのお話は、次回にいたします。

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

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