MAINROM又はSUBROMのあるスロットアドレスを得る

※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

MAINROM(通常はAPIやROMBASICインタプリタが記録されている)や
SUBROM(2/2+以降の追加BIOS)は、Z80の物理アドレスを拡張したスロット
と呼ばれる論理アドレスにマッピングされている。
このROMの場所を示すアドレスは、リニアなアドレス拡張ではないので
スロットと呼ばれる形式でアドレス指定する必要がある。
(8086のセグメントベースレジスタのようなものと考えれば良い)

つまり、0x8000など特定のアドレスを指定する場合は、MSXでは物理アドレスは拡張されているので正しくは、

[SLOT_POINTER(1,0)]:[ADDRESS(0x8000)]

という指定になる。
スロットアドレス指定は特殊なポインタであると考えると良い。

MAINROMとSUBROMのスロットアドレスは、起動時にROMBIOSファームウエアが自身をチェックし、
その場所をワークエリア内に保存している。
実際のBIOSのスロットの場所(ポインタ)を知るにはこれらアドレスを参照すればよい。

MAINROMのスロットアドレスは0xFCC1、SUBROMのスロットアドレスは0xFAF8にある。
これらを参照し表示するCソースコードを以下に示す。

#include <stdio.h>

void main(void){
	unsigned char * p_slotmain;
	unsigned char * p_slotsub;

	p_slotmain=(unsigned char *)0xFCC1;
	p_slotsub=(unsigned char *)0xFAF8;

	printf("MAINROM - %u \r\n",(*p_slotmain));
	printf("SUBROM - %u \r\n",(*p_slotsub));
}

通常は特殊なハードウエア構成でない限り、MAINROMはスロット0に置かれている。
得られた値はスロット形式と呼ぶフォーマットとなっている。


bit7,拡張スロットフラグ
bit6
bit5
bit4
bit3,拡張スロットアドレス
bit2,拡張スロットアドレス
bit1,基本スロットアドレス
bit0,基本スロットアドレス
(bit4-6は未使用)


スロットアドレスのうち、bit7は拡張スロットのセレクトフラグ。
通常は[3,0]などのようにして[基本,拡張]という2変数でスロットアドレスをポイントする。

ちなみにMAINROMとSUBROMの関係は、MAINROMがMSX1から存在するBIOS(API)やBASICインタプリタ
を持っており、
SUBROMが2/2+以降に拡張されたBIOS(API)が記録されている。
FM音源などに関係するBIOSは、これらとは別。

通常、スロットページ0,1がROM、2,3がRAMで動作しているROMBASICが動作中、MAINROMにある
BIOS(API)を使う時には特別にスロット物理アドレスを変更する必要はない。
しかしSUBROMにあるBIOS(API)を使う場合は特別なコール手順を使う。
それら手順は通常はAPIを通じて物理アドレスのページングをするもので、MAINROMにそのための
APIが存在する。

このほかに拡張BIOSと呼ばれるものがあるが、これはSUBROMとは別であり、主にマッパーや
漢字機能、MODEM(RS232C)シリアルなどシステム寄りの追加的な機能を扱う。
拡張BIOSは、MAINROM,SUBROMとはアクセス方法は異なる。
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。