うさちゃんRabbit4000(モジュール型番としてはRCM4010)でプログラムを書いていくにあたって、知らん事が多いなと痛感いたしました。その一番はメモリの構成です。Z80的16ビット論理アドレスから24ビットの物理アドレスに拡張しているRabbit4000の仕組みをまず知ろうと。ううむ、調べてみるといろいろ複雑。
※「うさちゃんと一緒」投稿順indexはこちら
※今回はRabbit4000のマニュアル類を参照しただけで書いております。実機上で使われている設定値を実機に「聞いた」わけでないので設定値は実機と違っている可能性があります。次回以降、実機上で調べてみる予定です。
組み込みマイコンでも32ビットの論理アドレス空間を持っている最近では考えられないことですが、1970年代から80年代くらいにかけて、16ビットのアドレス空間をどうやって拡張するのよ、というのが大きな問題になった時期がありました。もっとも有名で、かつクセが強い解法がインテル8086の採用したセグメンテーションでしょう。16ビット幅のセグメントレジスタ値を4ビット左シフトして、16ビットのセグメント内の論理アドレスに加えて合計20ビットの物理アドレスを得るというもの。いまだに盲腸のようにパソコンの奥底に潜んでいるアレであります。
Rabbit4000の論理アドレス空間
8ビットのZ80を「独自拡張した」数々のマシンでもアドレス空間の拡張は問題だったとおもいます。各社各様ですが皆似たり寄ったりだったかと。うさちゃんRabbit4000での解決方法もセグメンテーションですが、8086よりは大分シンプルです。
-
- 16ビット(64Kバイト)の論理アドレス空間を4つのセグメントに分割
- Base Segmentは常に論理アドレス0x0000におかれる
- Data Segmentは論理アドレス0xX000におかれる
- Stack Segmentは論理アドレス0xY000におかれる
- Xmem Segmentは論理アドレス0xE000におかれる
つまり、Base SegmentとData Segmentの切れ目の数字X (下12ビットはオール0なので4Kバイト・バウンダリ)と、Data SegmentとStack Segmentの切れ目の数字Yを指定し、Base、Data、Stackの3つのセグメントの大きさを制御(4Kバイト単位)するという方法です。最上位にいるXmemセグメントは常に8Kバイト割り当てられるようです。
各セグメントの使用方法としては以下のようだと思います。知らんけど。
-
- Base Segmentには、ブートを含むBIOSコードおよびそれに引き続く固定アドレスのプログラムコード(やROMデータ)が置かれる
- Data Segmentには大域変数やstaticなローカル変数など
- Stack Segmentにはスタックとスタック上におかれるローカル変数
- Xmem Segmentは、Flash ROM内に配置される関数コード、データなどを「覗き見」するウインドウとして使われる
Xmemをうまく使うと64Kバイトの論理空間に収まりきらないプログラムやデータを活用できるっと。昔、8086系で1Mバイトの空間を使い切ってしまったころ活用した、LIM(ロータス、インテル、マイクロソフト) EMS規格の拡張メモリ xmem を彷彿とさせる仕組みです。
Rabbit4000の物理アドレス空間
Rabbit4000は24本のアドレス線を持つので物理アドレス空間は16Mバイト分あることになります。ここに上記の16ビットの論理アドレスの4つのセグメントをマップすることになります。
その様子を図にしてみたのが冒頭のアイキャッチ画像です。
-
- Base Segmentは、物理アドレス空間でも常に0x000000番地にマップされる
- Data Segmentは、物理空間上のRAMアドレスのどこか(4Kバイトバウンダリ)にマップされる
- Stack Segmentは、物理空間上のRAMアドレスのどこか(4Kバイトバウンダリ)にマップされる
- Xmem Segmentは、必要に応じてFlash ROM等のどこか(4Kバイトバウンダリ)にマップされる
手元で使用しているRabbit4000搭載のモジュールはRCM4010という型番のもので、Flash ROM 512Kバイト、RAM 512Kバイト搭載です。上記の物理アドレス空間のどこにROM、RAMを置くかというのは、物理アドレスの制御とはまた別な問題で、チップセレクトロジックが決めています。
後で実際に設定されている値を読み取ってみるつもりですが、モジュール最大仕様がROM1Mバイト、RAM1Mバイトであったので、それに合わせてアイキャッチ画像は描いています。ROMが一番下にあるのは確かですが、RAMをどこに置くかはチップセレクトロジック次第なので図の通りでないかもしれません。(2022年6月30日追記:ROMへコンパイルするモードであるとROMが0番地ですが、RAMへコンパイルするモードだとRAMが0番地になってます。なお、ROMコンパイルモードでは、RAMは0x80000番地におかれていました。)
分かったような、霧のかかったような。