見出し画像

バンク切り替えのあれこれ、MSXのメモリマッパー

パソコンで使われているメモリという部品は、あればあるほど嬉しいもので、いつだって不足気味です。パソコンがこの世に登場した時には1Kあれば充分で4Kあれば幸せになれていました。

APPLE][だって最初は4Kから始まりました。これはすぐに16Kが普及して置き換わっていったのですが、当時はメモリの増設といえばメモリチップを買ってきて、空いているソケットに差し込んでいくというものでした。16Kビットのメモリを8個挿せば16K単位で増やすことが出来ました(ちなみに8個で1979年当時2万くらいした)。

メモリはどんどん高密度化して安くなります。そうなると搭載されているメモリも増えてきて8ビットCPUのアドレス空間である64Kをすべて使うまでになってしまいました。

当時のパソコンはひとつのBASICやマシン語のプログラムを走らせるもので、プログラムを置くメモリを分割するのは難しくメモリ空間を確保するために、まずビデオRAMをいろいろな方法で主となるメモリ空間から追い出し、次にBASICインタプリタの拡張機能などを必要に応じて同じアドレスに接続されているROMを切り替えることで専有するアドレス空間を増やさない工夫をしていきました。

さてMSXも最初は16KのROMと16KのRAMというところから始まったのですが、まずVDPを使うことでビデオRAMをCPUから切り離してアドレス空間を確保しました。このためゲームなどの複雑な画面をCPUが直接描画することが出来なくなったのですが、豊富なVDPの機能を上手に使うことで、そもそも限りのあったCPUの能力に余裕ができたという見方も出来ます。またメモリをスロットという16Kを単位としたアドレス空間で管理し、4つのスロットを切り替えることで、大きなワークエリアやプログラムを扱えるようにしました。

2章 MSX2システム概要

http://ngs.no.coocan.jp/doc/wiki.cgi/TechHan?page=2%BE%CF+MSX2%A5%B7%A5%B9%A5%C6%A5%E0%B3%B5%CD%D7

7章 スロットとカートリッジ

http://ngs.no.coocan.jp/doc/wiki.cgi/TechHan?page=7%BE%CF+%A5%B9%A5%ED%A5%C3%A5%C8%A4%C8%A5%AB%A1%BC%A5%C8%A5%EA%A5%C3%A5%B8

Z-80のコードはリロケータブルにするのが難しく、バイナリとして実行可能はアドレスは決め打ちにしないとならないので、それぞれのスロットの割り当てられたアドレスの中で切り替えて使うことになります。そうなると呼び出すコードと同じアドレスにある別のスロットを呼び出す必要も出てくるので、BIOSにインタースロットコールという仕組みを用意してあります。切り替えの間は割り込みも止めなければならないので、こういう手順はBIOSに任せるのが吉です。

スロット

MSXの時代は積んでいるメモリもせいぜい64Kまでですし、ゲームなどのスロットにあるROMを呼ぶ時はBASICシステムの裏に置けば間に合います。BASICから使えるメモリは32Kまでで、それ以上のメモリがあってもマシン語ルーチンを書いて使うしかありません(そして自力で管理する)。これがMSX2になるとより多くのメモリが搭載されることが多くなり(そして拡張されたシステムも裏ROMに搭載されるようになる)、これはもったいないので有効に使うための仕組みとしてメモリマッパーが用意されるようになりました。

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

15章 マッパーサポートルーチン

http://ngs.no.coocan.jp/doc/wiki.cgi/datapack?page=15%BE%CF+%A5%DE%A5%C3%A5%D1%A1%BC%A5%B5%A5%DD%A1%BC%A5%C8%A5%EB%A1%BC%A5%C1%A5%F3

これで使えるメモリが増えたのですが、やはりBASICから使うのは難しく、もっぱらマシン語で書かれたゲームやアプリケーションのワークエリアとして使われたようです。MSX-DOSの時代になるとRAMディスクとしても活用されるようになり、ようやく使い道が出てきます。

MSX-DOSでのプログラミング第3回

第2部  プログラム開発上の注意

MSX (総称)

自分のシステムがどのような構成のメモリを持っているのかは、電源投入時にシステムが調べてくれるのですが、なし崩し的に仕様を追加していった感が強く、互換性に配慮されているとはいえ、なかなか自分で使うには苦労します。MSX-DOS2の時代になるとかなり整理されたように思いますが、とにかくドキュメントに書かれた手順で使えば広いメモリが手に入るようにはなりました。

1章 ブートシーケンス

http://ngs.no.coocan.jp/doc/wiki.cgi/datapack?page=1%BE%CF+%A5%D6%A1%BC%A5%C8%A5%B7%A1%BC%A5%B1%A5%F3%A5%B9

マッパーRAMアクセス機能

いろいろ工夫を凝らしたものの64Kしかないメモリ空間でやりくりするには変わりはなく、16K単位に分割された領域をパタパタ切り替えて使うのは苦労も多かったように思います。ただ16Kという単位は意外とリーズナブルな選択で、ひとつのサブシステムを収めるにはちょうどよいサイズですし、ワークエリアとしても、あまり連続した領域を必要とすることは無かったようで、16ビット時代のEMMでも16Kという単位が使われました。

歴史的には利用できるメモリに対してアドレス空間が不足すると、繰り返し登場するバンク切り替えですが、仮想アドレスのようにOSが裏方で使うのであればよいのですが、アプリケーションが自力でバンク操作する使い方は制約が多く、無駄なメモリ転送も必要になったりするので、やはりフラットなアドレス空間が欲しくなります。最近のCPUは64ビットなのでアドレス空間自身はもう有り得ないほどの大きさ(16エクサ)になり、ハードウェアやOSとしての制限があるだけになっているので、もうバンク切り替えが出てくることも無いとは思うのですが、組み込みなどで32ビットで頑張ろうとすると、また復活してくる可能性は消えていないのかもしれません。

バンク切り換え

ヘッダ画像は、以下のものを使わせていただきました。
https://www.irasutoya.com/2017/07/blog-post_91.html

#バンク切り替えメモリ #MSX #メモリマッパー #16KB #アドレス空間

この記事が気に入ったらサポートをしてみませんか?