1ChipMSXのBIOSロード機能覚書 ― 2016年12月25日 08:06
1ChipMSXの隠し機能のBIOSロード機能の覚書。
SDカードの先頭に、MSXのBIOSを連結してファイル化したものを配置し、1ChipMSXにセットしたまま起動すると、そのSDカード上のBIOSファイルを読み込んでスロットに配置し起動する。
この際、SDカードの先頭というのはまさにFATファイルシステムのデータ領域の先頭となり、その位置はBPB(BIOS Parameter Block)の各パラメータから計算される。
具体的には、セクタ0の
&h10 (BPB_NumFATs)
&h0B (BPB_BytsPerSec)
&h0E &h0F (BPB_RsvdSecCnt)
&h11 &h12 (BPB_RootEntCnt)
&h16 &h17 (BPB_FATSz16)
から値を取得し、以下のように計算する。
BPB_ResvdSecCnt + (BPB_FATSz16 * BPB_NumFATs) + ((32 * BPB_RootEntCnt) /BPB_BytsPerSec)
この計算結果がデータ領域の先頭セクタとなる。
※BPB_BytsPerSec取得してないようにも見えるけど、512決め打ちかな?
※最後の部分は(32 * BPB_RootEntCnt + BPB_BytsPerSec -1) /BPB_BytsPerSecと説明してるページもあるんだけど、計算合わない…
で、先頭セクタの最初2バイトを読み取り、そこが"AB"だったら結合されたBIOSファイルとみなしデータ読込を実行する。
この一連の動きはDOSを経由せず、直接SDから値を読んで行われる。
FATのファイルエントリも参照していないようなのでファイル名や論理削除されているか否かもチェックしていないらしい。
と、ここまでが前提。
WindowsでSDカードを初期化すると、初期化直後に「system volume information」という隠しフォルダが自動的に生成される。
初期化直後に自動生成されるので作成位置は当然データ領域の先頭。
ということで、Windowsで初期化したSDカードは(その初期化がエクスぽローラーであろうとSDアソシエーションのSDFormatterであろうと)1ChipMSXのBIOSロード機能には使えない、みたい。
(とりあえず、自宅のWindows10で作業しているときは100%この症状になった)
じゃあ、どうすればよいかといえば、Windows以外で初期化、領域確保しWindowsを利用することなくBIOSファイルを書き込めばよい。(もしくは適当なサイズのファイルを書き込んでデータ領域の先頭を使用してしまう)
で、せっかく1ChipMSXでNextorOSが利用できるようになったのでそれを利用することに。
・SDカードを刺したまま1ChipMSXでNextorOSを起動
・BASICでCALL FDISKを実行し、SDカードを任意のパーティションサイズで初期化
・1ChipMSXの電源を一度落とし再起動
・領域確保したドライブにアクセスできることを確認したらそこに連結BIOSファイルをコピー
(とりあえず、RAMディスク経由で別のSDカードからコピーしてみた)
この手順でデータ領域の先頭に連結BIOSファイルを配置できた。
※考えてみれば今BIOSロード機能の確認に使っているSDカード、昔の携帯に付属していた16MBのものを中のファイルを消しただけで初期化せずに使っていたものだった。
※初期化していないのでsystem volume informationは生成されているけど使用されるのはデータ領域の先頭ではなく、その時の未使用セクタの先頭になるのでかなりうしろの方。
…何か勘違いしてたらごめんなさい。
SDカードの先頭に、MSXのBIOSを連結してファイル化したものを配置し、1ChipMSXにセットしたまま起動すると、そのSDカード上のBIOSファイルを読み込んでスロットに配置し起動する。
この際、SDカードの先頭というのはまさにFATファイルシステムのデータ領域の先頭となり、その位置はBPB(BIOS Parameter Block)の各パラメータから計算される。
具体的には、セクタ0の
&h10 (BPB_NumFATs)
&h0B (BPB_BytsPerSec)
&h0E &h0F (BPB_RsvdSecCnt)
&h11 &h12 (BPB_RootEntCnt)
&h16 &h17 (BPB_FATSz16)
から値を取得し、以下のように計算する。
BPB_ResvdSecCnt + (BPB_FATSz16 * BPB_NumFATs) + ((32 * BPB_RootEntCnt) /BPB_BytsPerSec)
この計算結果がデータ領域の先頭セクタとなる。
※BPB_BytsPerSec取得してないようにも見えるけど、512決め打ちかな?
※最後の部分は(32 * BPB_RootEntCnt + BPB_BytsPerSec -1) /BPB_BytsPerSecと説明してるページもあるんだけど、計算合わない…
で、先頭セクタの最初2バイトを読み取り、そこが"AB"だったら結合されたBIOSファイルとみなしデータ読込を実行する。
この一連の動きはDOSを経由せず、直接SDから値を読んで行われる。
FATのファイルエントリも参照していないようなのでファイル名や論理削除されているか否かもチェックしていないらしい。
と、ここまでが前提。
WindowsでSDカードを初期化すると、初期化直後に「system volume information」という隠しフォルダが自動的に生成される。
初期化直後に自動生成されるので作成位置は当然データ領域の先頭。
ということで、Windowsで初期化したSDカードは(その初期化がエクスぽローラーであろうとSDアソシエーションのSDFormatterであろうと)1ChipMSXのBIOSロード機能には使えない、みたい。
(とりあえず、自宅のWindows10で作業しているときは100%この症状になった)
じゃあ、どうすればよいかといえば、Windows以外で初期化、領域確保しWindowsを利用することなくBIOSファイルを書き込めばよい。(もしくは適当なサイズのファイルを書き込んでデータ領域の先頭を使用してしまう)
で、せっかく1ChipMSXでNextorOSが利用できるようになったのでそれを利用することに。
・SDカードを刺したまま1ChipMSXでNextorOSを起動
・BASICでCALL FDISKを実行し、SDカードを任意のパーティションサイズで初期化
・1ChipMSXの電源を一度落とし再起動
・領域確保したドライブにアクセスできることを確認したらそこに連結BIOSファイルをコピー
(とりあえず、RAMディスク経由で別のSDカードからコピーしてみた)
この手順でデータ領域の先頭に連結BIOSファイルを配置できた。
※考えてみれば今BIOSロード機能の確認に使っているSDカード、昔の携帯に付属していた16MBのものを中のファイルを消しただけで初期化せずに使っていたものだった。
※初期化していないのでsystem volume informationは生成されているけど使用されるのはデータ領域の先頭ではなく、その時の未使用セクタの先頭になるのでかなりうしろの方。
…何か勘違いしてたらごめんなさい。
コメント
トラックバック
このエントリのトラックバックURL: http://miyako.asablo.jp/blog/2016/12/25/8291523/tb
※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。
コメントをどうぞ
※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。
※投稿には管理者が設定した質問に答える必要があります。