8ビット時代のメモリ拡張の歴史
CPUが設計された当時はそれだけあれば充分だと考えられていたアドレス空間も、そのCPUが長い間使われ続けていると、その間に半導体の集積度が上がり、大容量のメモリが安価に使えるようになり、アドレス空間が足りなくなってきます。
8ビットの時代はまずグラフィック機能のカラー化、高解像度化が進んでビデオメモリが占めるアドレス空間が問題となり、これをサブCPUに分離したり(FM-8など)、VDPを使い別のメモリ空間に追い出したり(MSXなど)、メモリ空間ではなくI/O空間として接続したり(SMC-777など)、ビデオメモリを同じアドレスに重ねてバンク切り替えでアクセス(PC-8801など)してプログラムを置くメモリ空間を確保していました。そしてBASICインタプリタのサイズも肥大化してくると、一部の機能を同じアドレスに置き、ROMも切り替えながら使うことで凌ぐようになりました。いずれにせよアドレス空間は64Kバイト(16ビット)しか無いので、同じアドレスにいくつもメモリを接続して、それを切り替えて使うしか方法はありませんでした。
8ビットの最後の方の時代になると、PC-8801でもMRからは標準でバンク切り替えで使う拡張メモリが搭載されるようになりましたし、MSXでもMSX2からはメモリマッパーが標準化されROMに関してもMegaROMという仕組みが使われるようになりました。
PC-8801 用拡張メモリボードの話
2.2.2 メモリマッパー - 2章 主要ユニット
http://ngs.no.coocan.jp/doc/wiki.cgi/datapack?page=2%BE%CF+%BC%E7%CD%D7%A5%E6%A5%CB%A5%C3%A5%C8
MegaROM Mappers
8ビットの時代にはとても多くのコードが書かれ、時代が進んでも同じコードを使い続けたいため、バンク切り替えやMMUを搭載することでアドレス空間を拡げた上位互換のCPUも作られるようになりました。そしてこれらを使って長きにわたり8ビットのコードは生き残り続けました。
Z280
R800
65816 (コンピュータ)
いずれの場合も機能を使うたびにパチパチとメモリ空間を切り替えるもので、連続した領域を使うことは出来ず、コードを書くうえでなかなか制約のキツイものでした。8ビット時代のOSはOS-9などMMUを使うことが出来るものが無くはなかったのですが、CP/Mは連続したメモリがあることを前提とするだけで、メモリの切り替えをサポートしておらず、CP/Mを使うのであればBASICインタプリタのROMを隠してRAMに切り替え、拡張機能としてROMを呼ぶ時だけバンクを切り替えて呼ぶという使い方が精一杯でした。
バンク切り換え
結局、16ビットの時代になっても、似たような事態は起こったのですが、少しだけスマートな解決方法になりました。そちらについてはまたの機会に。
ヘッダ画像は以下のものを使わせて頂きました(これは16ビット向けなんですけどね)。
https://commons.wikimedia.org/wiki/File:IO_DATA_PIO-9X34P_4_MB_RAM_board.jpg
Darklanlan - 投稿者自身による著作物, CC 表示 4.0, https://commons.wikimedia.org/w/index.php?curid=69050945による
#8ビットCPU #アドレス空間 #バンク切り替え #メモリマッパー #MEGAROM #Z280 #R800 #65816