2017-07-29 11:15 — asano
8ビットCPUで無理をするよりメモリ空間の広い16ビットCPU 8086/8088を採用したものも現れました。
初期の代表機種には以下のようなものがありました。
名称 | CPU | ROM | メインRAM | GVRAM | 備考 |
---|---|---|---|---|---|
IBM PC | 8088 | ? | 64kB (256kB) | 16kB(CGA) | 純正にこだわらなければ256kB以上増設可 |
PC-9801 | 8086 | 96kB | 128kB (640kB) | 96kB | 他にテキストVRAM8kB(12kB) |
FM-11EX | 8088 / 68B09 | ? | 128kB (1MB) | 192kB | 8088と68B09は排他利用 他に68B09をサブCPUとして持つ |
8086/8088のメモリ空間は1MBありますのでとりあえずアドレス空間の問題は無くなりました。
どの機種も各メモリの配置は00000H付近にRAMを、0FFFFFH付近にROMを配置し、間にVRAMなどを置いています。これは00000H~003FFHに割り込みベクタがあるためRAMが必要(組み込み用途ならROMでも構いませんが)、リセット時の実行開始アドレスが0FFFF0HであることからここにROMが必要という事情があります。VRAMや拡張ROM等はこの間のどこかに置かれるわけですが、多くの機種では0A0000H以降に配置されました。このことが後に問題となります。
具体的な例を(手元に資料のある)PC-9801で見てみましょう。
00000H~1FFFFHまでの128kBにメインRAMが配置されています。64k×1bitのDRAMを16個(8086は16ビットバスです)でこの容量です。後の機種ではPC-9801Mで256kB、PC-9801VMで384kBと増加しています。オンボードでの増設はできませんでしたので増設時には拡張バスにメモリボードを挿します。このボードには128kB分のDRAMがハンダ付けされており、128kB分はソケットが実装されていました。そのまま挿せば128kB、ソケットにDRAMを追加すれば256kBのボードとして使用できました。256kBにしたボードを2枚挿せば合計640kBのフル状態となります。
0A0000HからはテキストVRAMが配置されています。これが邪魔なのでメインメモリは640kBまでしか積めないのです。
0A8000H~0BFFFFHまでの96kBにはGVRAMがあります。これで640×400ドット8色のグラフィックス1面分です。後にGVRAMが2面に増やされた際にはこの同じ空間に2面が配置されバンク切り替えの手法が使われました。
0C0000H~0E7FFFHまでは拡張ROMのために予約されていました。これは拡張ボード上にROMを搭載してボード制御用のソフトウェアを搭載するためです。起動時にスキャンされ初期化などが行なわれました。また後にGVRAMを3プレーン(R,G,B)から4プレーンに増やした際には4プレーン目が0E0000H~0E7FFFHに配置されました。
0E8000H以降はBASICを含むROMが配置されました。
よく言われるMS-DOSの640kBの壁というのは、この0A0000H以降にVRAM等があって連続したメモリが640kBまでしか確保できなかったことによります。IBM PCでも事情は同じだったようです。
しかし本来「MS-DOSには640kBの壁などは無い」のです。640kBの壁はPC-9801の壁であり、IBM PCの壁でしかないのです。
実際、PC-9801でもハイレゾモードでは640kBではなく768kBまで使えますし、FM-11EXでは960kB使えたはず(0F0000H~0FFFFFHはROMと予約領域)。
コメントを追加