今回は、MSXのRAMについて解説したいと思います。
僕は、数年前にMSXについてあれこれ調べ始めるまでは、
RAM?
うーん、
プログラムが入っているんだよね?
(僕が本格的なプログラムを書いたのはWindowsからでした。
最近のPCはメモリを意識しなくても書けてしまうので
詳しくは知りませんでした^^;)
POKE?という感じでしたし...
RAMというのはメモリです。
その中にプログラムが入っています。
CPUが、そのメモリに入っているプログラムを上から順?に読み込みながら、
実行していきます。
一番わかりやすく説明すると、マシン語が一番シンプルです。
マシン語と聞くだけで拒否反応が出る方もいらっしゃるかもしれないですが、
ちょっと我慢してください^^
MSXの雑誌で、マシン語のリストを見たことがある人は
結構いらっしゃると思うのですが、
マシン語は、数字の集まりです。
21 00 D8 7E B7 28 06 CD A2 00 23 18 F6 C9
なんていうものです。(これがプログラムなんです^^)
(これは16進数です。)
ちなみに数字というのは、16進数、10進数、2進数と表現方法を
かえることができます。
C9 (16進数表現) = 201 (10進数表現) = 11001001 (2進数表現)
上は、全部同じ数値なのです。
その変換が面倒ですよねぇ。
しかし!最近ではこんなサイトもあるので、楽々変換です!
MSXが現役の80年代は、結構16進数->10進数->2進数の変換は、
自分で計算していたんでしょうね〜^^;
いい時代になったものです(๑╹ω╹๑ )
ちなみに16進数とか2進数などの変換方法についても
書いています、こちらもどうぞ。
その他、MSX BASICの基本のページについての
目次はこちら
8bitとは
MSXは8bit機だというのはご承知だと思いますが、
それがどういう意味か詳しく知らない人の方が多いかもしれません。
僕も漠然としか知らなかったのですが、
MSXを弄るようになって具体的に知ることができました^^
(やっぱりMSXはすごいですね〜。
MSXに詳しくなると、現代のWindowsなどのPCについての理解も深くなります。)
8bitって何?という説明です。
1bitというのは、0か1を扱う最小単位なのですが、(電気的にみればONかOFFか)
それが8bitということで、
一度に8桁まで扱うことができるということです。
8bitCPU (MSXではZ80A)は、
8本のピンに電気が流れているかどうかで(電圧が掛かっているかどうか)
計算していたりします。
ONを1、OFFを0と考えると、2進数ができます!
(これをはじめて考えた人ってすごいですよね!
電気が流れるか流れないかを使って、数字を表現するのですから^^)
1bitで1桁の2進数。
8bitということは2進数で8桁の数字が扱える、ということなのです。
(2進数で8桁というと、10進数では0~255までの数、16進数で0~FFまでの数です^^)
そこでメモリ(RAM)に話を戻すと、
メモリは8bitごとに(8bit = 1バイト)アドレス(住所)があります。
例えば、
0番地 : 00100001 ->2進数で00100001は、10進数で33、16進数の21
1番地 : 00000000
2番地 : 11011000
3番地 : 01111110
....
という感じで、メモリにデータが入っています。
16進数だと
0番地: 21
1番地: 00
2番地: D8
3番地: 7E
.....
という感じです。
(番地がないと
どこにどんな数値がはいっているかわからないので、
データを取り出すことができませんよね^^)
1つの番地に8bit(2進数で8桁、10進数で0~255までの数値、16進数で0 ~ FF)のデータが入っています。
2進数 00000000 -> 10進数 00 -> 16進数 00
2進数 11111111 -> 10進数 255 -> 16進数 FF
と変換できるので( ・∇・)
8bitPCというのは、8bitのデータを一度に扱うから
8bit機と言います。
8bit機は、10進数で0 ~ 255までの数字を扱えることになります。
(255までの数字しか使えないのでは困るので、
データを2回、分割で読み込むようなことをして
8bit + 8bit =16bit の数値を扱えるようになっています。16bit = 65535だったかな。)
マシン語は、数字そのものが命令になっています。
21 00 D8だと、LD HL,&HD800などという意味があります。
例えば、メモリの0番地からプログラムが実行されていくとすると、
(メモリ) 0番地 -> 1番地 -> 2番地 -> 3番地と順に
CPUに読み込まれていきます。
そして読み込んだ命令を実行していきます。
(もっと後ろの方の番地へ飛ばして(どこの番地でも自由に飛ばせます)、
そこからCPUに読み込ませていく命令もあります。
4000番地に飛べみたいにできる命令です。)
スポンサーリンク
MSXのメモリ構成
MSXは8Kバイト、16Kバイト、32Kバイト、64Kバイトのメモリの機種がありました。
8Kバイトというのは、8000個のデータがメモリに入るということです。
21 00 D8 7E B7 28 06 CD A2 00 23 18 F6 C9
こんな感じのデータが、8000個です。
(8bitですので、16進数では2桁で1個のデータです。D8で1個のような。)
16Kバイトだと、16000個のデータが、
32Kバイトだと、32000個のデータがメモリに入ります。
このデータ量が多いのか?少ないのか?
うーん、MSXで一人でプログラムを作っていると、まあまあなデータ量です^^
しかし、最近のWindowsとか、スマホでよく聞くデータ量が、
1G(ギガ)とかですよね!
1G(ギガ) = 1000M(メガ) = 1000000K(キロ) = 1000000000バイト
なので、
先ほど書いた形式だと、1Gは、10億個のデータが入ります。
21 00 D8 7E B7 28 06 CD A2 00 23 18 F6 C9
こういうのが10億個です( ´Д`)y━・~~
まぁすごい時代です^^;
ゲームの容量がギガ単位の、PS4やSWITCHなどのゲームの大半は、
画像データや音楽データだとは思いますが^^
MSXに搭載されているCPUのZ80は、一度に8bitのデータを扱うのですが、
メモリ(RAM)の番地は、0番地から、65535番地まで読み込むことができます!
65535っていう数字も馴染みがあると思うのですが、
16bitで扱える数字が65535です。
(2の16乗ですね^^)
CPUの計算は、8bitで、
メモリのアクセスは16bitです。こんな言い方で合っているのかな^^;
MSX1の最上位機種は64Kでした。
もっと容量が多ければいいのに!って思ったものですが、
それはMSXのCPUであるZ80Aが、
0 ~ 65535番地までしか読み込めないからなのです!(● ˃̶͈̀ロ˂̶͈́)੭
(メガROMは1メガビット = 128Kバイトです。
メモリを切り替えて使っているんでしょう。まだよく調べていません^^;)
BASICでプログラムを書くとき、
32KバイトのMSXでも、プログラマーが使える容量は、
32Kバイトを全部は使えません。
それはなぜか?
MSXのCPUは、Z80Aで、最大65535バイトまでしかメモリを読めないのですが、
その少ないメモリの中に、
色々とMSXを動かすためのプログラムも書かれているのです!
WindowsならハードディスクにOSが入っています。
MSXは、64Kバイトであれやこれやしないといけないのです。
(ハードディスクがないので^^;)
MSXの16Kマシンも、32Kマシンも、64Kマシンも、
32KバイトはMSXのシステム?のために確保されています。
BIOSとか、MSX BASICの翻訳のためのインタプリタなどが
32KのROMとして付いているのです。
(ROMもRAMも、プログラムが入ります。
ROMは書き換え不可、RAMは自由に書き換えできますが、電源を切るとクリアされます。)
そしてRAMの32Kの中にワークエリア というものが確保 されます。
ワークエリアについてはのちほど。
簡単に図にすると、
こんな感じです。
(32KMSX, 64KMSXの場合)
MSXの16Kマシンは、32KのROMと16KのRAM。
MSXの32Kのマシンは、32KのROMと32KのRAM。
MSXの64Kのマシンは、32KのROMと32KのRAMで、
他に32KのROMを退かして32KのRAMを動かせますよという構造。
(そのため、BASICを翻訳するROMの代わりに32KRAMをプラスするので、
BASICで64Kバイトのプログラムはかけません。
すべてマシン語ならOKなのかな?
でもBIOSもなくなってしまうのでどうなるのだろう?うーん)
そういう構造なので、メモリの0番地 ~ 7FFF番地まではBASIC ROM(BIOSも?)が入ります。
BASICのテキスト(自分で書いたプログラム)は、32KMSXと64KMSXの場合
8000番地以降に置かれます。
(16KMSXは、8000番地 ~ BFFF番地が空白で、
C000番地 ~ FFFF番地に16Kバイトのメモリが入ることになります。
8KMSXはちょっとわかりません。申し訳ないです^^;)
8000H番地は、10進数でいうと、32768です。(8000HのHというのは16進数のこと)
ページとスロットとは
MSXで特にユニークなのは、
メモリがスロットとページという概念で出来ています。
スロットはとりあえず置いておいて^^
ページというのは、
16kバイトを1ページとして扱っています。
Z80は64Kバイトのメモリを扱えますので、
0ページ ...16K (0番地 ~ 3FFF番地)
1ページ ...16K (4000番地 ~ 7FFFF番地)
2ページ ...16K (8000番地 ~ BFFF番地)
3ページ ...16K (C000番地 ~ EFFF番地? )
メモリを4分割して考えているのです。
0ページと1ページは、BASIC ROM(BIOSも)になります。
あとはRAMでユーザーが自由に使うことができます。
(先ほど説明した16KバイトのMSXは、
2ページ目がなくて、3ページ目に16KのRAMがついているんです。
64KMSXマシンは、0ページ目と1ページ目のROMを、
32KRAMに替えることが出来ます!)
32K、64KMSXのBASICが8000H番地から書かれるというのは、
2ページ目から書かれるということです。
面白い仕組みですよね!!
さらに面白いのが、スロット(ROMを突き刺すスロットではなく)
という概念です。
スロット1つにつき、ページが4つと考えます。
MSXは、そのスロットが4つ設定されています。
どういうことかといいますと、
MSXの規格を設計する時に、
より大きなデータを(64Kバイト以上)扱いたい場合にどうすればいいのか
考えた時に、メモリを切り替えて使えばいいのではないか!と
思ったのでしょう。
その切り替え単位がスロットなのです。
スロットは4つもあります!
ちょっとわかりづらいので図にしますと、
面白いですよね!!
非常によく考えられた仕組みです(°▽°)
スロット0のページ0,1にBASIC ROM、
スロット2のページ2にRAM、
スロット3のページ3にRAM
などとなっているみたいです。
構成はメーカーによって違います。
(小学生だった当時は、全く知らない概念でした...
大人になってから知って、ほぉーと感心したものです^^)
4つのスロットからさらに4つのスロットに分けることができ、
64Kバイト x 16 = 1024で、
MSXでは最大1Mバイト(1024バイト)までコントロールできるそうです!
拡張スロットとか色々なハードがでてきたのは、
こういう仕組みがあったからなんですねぇ〜^^
面白いデス!
スポンサーリンク
ワークエリアとは
ワークエリアというものがあります。
BASICの設定などを記憶しておく場所が決められているのです。
それは、メモリの最後の方に置かれています。
(このワークエリアがあるために、32KMSXマシンでも、
BASICで32Kバイトの長さのプログラムが書けません。)
ワークエリアはF380番地 ~ FFFF番地にあります。
MSXで上級者ともなると、このワークメモリを参照したり、
書き換えたりしたプログラムを書いたりします。
BASICでもそのようなプログラムが書けるのが少し意外ですよねぇ〜^^
(PEEK命令、POKE命令があるので^^。ここがMSXの面白いところですよね!)
メモリの構造を知って、書き換えることができると
プログラマとしてレベルが上がったような気がしてうれしいです^^
Windowsだろうとなんだろうと、
コンピュータは、このようにメモリを直に書き換えることができれば、
色々出来そうですよね〜。
でもセキュリティ的にどうなんでしょうかねぇ( ´Д`)y━・~~
でも色々と対策がされているはずです。
(そういうのはよくわかりません( ・∇・))
BASICのプログラムは、
32KMSXマシンと64KMSXマシンの場合、
8000番地 ~ F37F番地までの長さのプログラムであればOKです。
(変数エリアとかもあるのですが)
最近BASICで書いていると、メモリ不足になってしまうことが多くて...
PRINT FRE(0)
と打ち込んでやると、空き容量がわかるそうです。
なお、MSXにフロッピーディスクドライブを繋ぐと、
ワークエリアが拡大します (°▽°)
そのためにテープにセーブを想定して、
キツキツのプログラムを書くと、FDD搭載MSXでは動かなくなることがあります。
(SHIFTを押しながら電源ONで、ディスクが搭載していない状態にできるんでしたっけ?)
FDD搭載MSXが、どの程度ワークエリアが拡大するかは機種によって違うみたい
ですねぇ〜。
そのMSXのワークエリアのどこかに書かれているそうなので、
プログラムでチェックしないといけないのかな?
まとめ
メモリについて簡単に説明してみました。
僕が、そういったメモリについて知ったのはまだ最近のことです。
MSXの仕組みがわかってくると大変おもしろいです^^
次回はVRAMについて書きたいと思います。
MSX BASIC基礎で、ブロックの形を変えたりしていますが、
それはVRAMをいじっているからです。
本当は、最初にVRAMの説明をした方がよかったのかもしれないですね^^;
スプライトもSPRITE$を使わずに、VRAMに直書きすることで定義したり、
動かしたりできるようになります^^
MSXのハードもソフトもこちらで購入できます。
今回はここまでです^^
では〜。