前回、Rabbit4000のメモリマップと称するものを掲げつつ、本人も釈然としておりませんでした。今回、実機に「問いかけつつ」分かってきたのが、Rabbit4000のチップセレクトロジックが果たす役割です。物理アドレスのその先にもう一段階の対応関係がアリーの。うさちゃん、思ったよりももっと複雑。
※「うさちゃんと一緒」投稿順indexはこちら
うさちゃん、Rabbit4000は、Z80との機械語レベルでの互換性をほぼほぼ維持しつつ大拡張した「最強の」(個人の感想です)8ビット機であります。Dynamic Cという、ほぼほぼ標準C(といってもANSI C90)だけれども、昔懐かしい(コンパイラ毎の個別拡張が蔓延っていた1980~1990年代テイスト)独自拡張しまくりのコンパイラを中心とする開発システムがついてきます。
前回はRabbit4000のマニュアル類をひっくり返して、16ビットの論理アドレスから24ビットの物理アドレス空間への変換について調べてみました。しかし、どうも腑に落ちないところがあります。物理アドレスのそのまた先に何か蠢いている気配がします。そこで今回は再びDynamic C付属のサンプルプログラムを動かして、メモリの設定の闇にダイブと。大袈裟だな。
メモリ設定の確認(RAM実行)
最初、Rabbit4000の制御レジスタを端から自力で読み取って解読するしかないかと思ったです。しかし、サンプルプログラムが充実しているDynamic Cのこと、車輪の再発明しなくて済むように何かありそうです。調べたところ、以下のサンプルプログラムが私の目的にあっているようでした。
MEMORY_USAGE.C
上記のプログラムをコンパイル(RAM上)して実行し、標準出力をキャプチャしたものの先頭部分が以下です(実際にはかなり長い出力で、一回では解釈しきれない分量でした。)
Dynamic C detects a flash of 00080000 bytes. This program is compiled to RAM and run in RAM. Parallel flash memory is mapped into the MB3CR quadrant. Dynamic C detects a RAM of 00080000 bytes. However, the BIOS set RAM_SIZE to 00040000 bytes. RAM starts at physical address 00000000. Separate instruction and data space is not enabled. Standard MEM.LIB tables... MMU Registers: SEGSIZE = d6 DATASEG = 000 STACKSEG = 04e XPC = fff MIU Registers: MB0CR = 05 MB1CR = 05 MB2CR = 05 MB3CR = 00 MECR = 00 ~以下略~
フラッシュのサイズは 0x80000 bytes、つまり512Kバイト。RCM4010のスペック通りです。また、プログラムはRAM向けにコンパイルされて、RAMから走っているみたい。
Parallel flash memory is mapped into the MB3CR quadrant.
という部分がクセものでFalshメモリは4個ある物理メモリのバンクのうち4番目(0から数えて)におかれているみたいです。
RAMのサイズも0x80000 bytes、512Kバイトでスペック通りですが、BIOSの都合?により半分しか使ってないみたいです。
However, the BIOS set RAM_SIZE to 00040000 bytes.
そしてRAMが物理番地0x000000に置かれておる、と。
RAM starts at physical address 00000000.
RAM上に「プログラムを書き込んで走れ」と命令したためのようです。
メモリ設定の確認(Falsh実行)
そこで、同じサンプルプログラムをFlashにプログラムを書き込んで走れ、と命令してみました。そのときの結果の先頭部分が以下に。
Dynamic C detects a flash of 00080000 bytes. This program is compiled to parallel flash and run in flash. Parallel flash memory starts at physical address 0x000000. Dynamic C detects a RAM of 00080000 bytes. However, the BIOS set RAM_SIZE to 00040000 bytes. RAM starts at physical address 00080000. Separate instruction and data space is not enabled. Standard MEM.LIB tables... MMU Registers: SEGSIZE = d6 DATASEG = 07a STACKSEG = 0f0 XPC = ff8 MIU Registers: MB0CR = 00 MB1CR = 00 MB2CR = 05 MB3CR = 05 MECR = 00
Flashが0x00000番地におかれ、RAMのサイズは半分に制約されてますが、0x80000におかれています。この方が思っていたメモリレイアウトに近いです。
Rabbit4000のチップセレクトロジック(仮)
わかったところまでのチップセレクトロジックの動作と手元のRCM4010での設定を冒頭のアイキャッチ画像に整理してみました。
-
- チップセレクト信号は、物理アドレスのA23からA17までの上位7ビットのうち連続する2ビットをデコードした4バンクに対して生成できる。つまりバンクサイズは均等で最小の128Kバイトから、最大の4Mバイトまで
- 出力イネーブル、書き込みイネーブル、ウエイト数なども上記バンク毎に設定できる
- 今回の実機動作確認では、A19、A18の2ビットでバンク指定を行っている。1バンクのサイズは256Kバイト。
なお、Rabbit4000は、CPUからみた同じ論理アドレスに、ROM/RAMを共存させることができる機能があり、そのモードではA16、A19は、データアクセスの際に「反転」するようになっているみたいです。これを使えば、64Kバイトの論理空間が実質倍の128Kバイトになると。ただし、この機能は、現在のコンパイル設定では使われていないようです(以下)
Separate instruction and data space is not enabled.
前回から一歩進歩したですけれども、なんだかな~。うさちゃん、いろいろ技を隠しているな。。。