DOSとWin9xのバージョンごとのMBR、PBRブートコードの変更点

Windows 2000のインストールで上書きされたDOSのブートセクターをどう復旧しようか考えていたら気になってしまい、調べていた。こういう解析が趣味になってきているな。

マスター ハードディスク ブート レコード (MBR、Master hard disk Boot Record)

IBM DOS K3.3以降

IBM DOS K3.3以降、PC DOS 2000までMBRのブートコードは全く変わっていない。MS-DOSも同一のコードを使用している。

区画(パーティション)テーブルには各区画のアドレスがCHSパラメーターで記録されている。MBRはアクティブフラグがある区画からCHSパラメーターを拾い、BIOS INT13hで区画ブートレコードをロードする。

AT ROM BIOSとIDEハードディスクの仕様により、IDEハードディスクは504MB(C:H:S = 1024:16:63)までしか使えないという制限がある。SCSIハードディスクはこの制限を受けない。公称ではこの通りだが、実際には1994年頃のBIOSよりCHSパラメーターを変換する機能が追加されたことで、約8GB(C:H:S = 1024:256:63)まで使える場合がある。ただし、FAT16ファイルシステムの制限により、1つの区画は最大約2GBまでとなっている。

Windows 95 OEM Service Release (OSR) 2 以降

AT ROM BIOSの拡張INT13hによる28ビットLogical Block Addressing (LBA、論理ブロックアドレッシング) アクセスに対応したことで、504MB(C:H:S = 1024:16:63)を超える大容量IDEハードディスクを使えるようになった。(512 bytes x 2^28 = 128 GB) また、FAT32ファイルシステムがサポートされたことにより、1区画2GBの制限も取り払われた。

区画ブートレコード (PBR、Partition Boot Record)

IBM DOS J4.0

  • 区画のBIOS Parameter Block (BPB) に記録される総セクター数を16ビットから32ビットに拡張したことで、32MBを超える基本区画を使えるようになった。(512 bytes x 2^32 = 2 TB)
  • IBMBIO.COM (MS-DOSではIO.SYS) の先頭から3セクター(1536バイト)だけロードするように変更された。
  • エラーメッセージ “Disk boot failure” が “Non-System disk or disk error” に統合された。(この時点で既にコードを512バイトのスペースに収めることに苦慮していたことが分かる)

IBM DOS J5.0/V

IBMBIO.COM (MS-DOSではIO.SYS) をデータ領域の先頭以外からロード可能になった(BPBではなくディレクトリエントリーからIBMBIO.COMの開始位置を参照するようになった)。J7.0/Vまで変更なし。

PC DOS 2000, Windows 95(内部バージョンは7.1)

2016MB(シリンダー数4096)以降の領域から起動できるようになった。

この詳細の説明はやや難しい。拡張INT13hをサポートする前のBIOSではCHS(シリンダー、ヘッド、セクター)の3つのパラメーターでハードディスクにアクセスする必要がある。一方、FATなどのファイルシステムを扱うには、ディスク先頭を0とする論理セクターアドレス (LBA) を先に算出する必要がある。ブートコードでは論理セクターアドレスをCHSに変換する際、x86 CPUのDIV命令でLBAをヘッド数で割る。この時、オーバーフロー対策のため、LBAの上位16ビットがヘッド数と同じか大きい場合は “Non-System disk or disk error” と表示して停止する。

mov dx, [LBA_H]; DX = LBA上位16ビット
mov ax, [LBA_L]; AX = LBA下位16ビット
div [SECTP]    ; DIV命令:DX:AXを[SECTP](1トラックあたりセクター数)で割る
               ; 結果:AX = 商16ビット、DX = 余り16ビット(商が65536以上になると除算エラーになる)
inc dl         ;S(セクター番号)は1から始まるためインクリメントする
mov [CURSEC], dl;Sを格納

CHSパラメーターで指定できるS(1トラックあたりセクター数)は6ビット幅で、その最大値は63。従って…

LBA    : C    H  S
4128765: 4095 15 61
4128766: 4095 15 62
4128767: 4095 15 63
4128768: 4096  0  1
(4128768 = 3F0000h, 3Fh = 63, 4128768 x 512 bytes = 2016 MB)

新しいブートコードではHとSを乗算した数でLBAを割るため、CHSパラメーターで指定できる最大値である約8GBまで問題なく扱える。なお、この不具合はDOS J4.0以降が該当する。DOS K3.3ではエラー処理がなく、除算エラーでシステムが停止する。

Windows 95 OEM Service Release (OSR) 2 以降

MBRと同様、AT ROM BIOSの拡張INT 13hによる28ビットLBAアクセスに対応したことで大容量IDEハードディスクを使えるようになった。ファイルシステムがFAT16の場合とFAT32の場合でブートコードが異なる。

ブートローダーはあくまでDOSのシステムをロードするために一時的に使われるプログラムであり、これだけを拡張INT 13h対応のコードに差し替えてもDOSそのものが拡張INT 13hに対応するわけではない。

関連記事

外部リンク

260422 3DSポケモン(ウルトラムーン)をオンラインアップデートする

Image: 260422 3DSポケモン(ウルトラムーン)をオンラインアップデートする

DS世代のポケモンはXY以外プレイしたことがなくて中古で買ってみたんだけども、PS5ゲームの新品(定価48%引き)と中古の3DSゲームが同じくらいの値段で笑えない。しかも、ロットが少なくて希少価値があるならまだしも、日本だけで200万本以上売れてもう10年経ちそうなソフトがこういう状況とは。3DSの中古ソフトが年数の割りに全体的に高い。

ニンテンドーイーショップのサービスは3年前に終了しているので、もう更新プログラムはダウンロードできないかと思っていたけど、販売が終了しただけで、ソフトウェアの更新はまだダウンロードできるようです。なお、トップの写真にあるポケモンXYのテーマは販売終了したため新規入手不可。

Image: ポケモン ウルトラムーン 更新データ

しかし、これもいずれは設備の老朽化とかを理由にしてサービスが終了することは間違いない。ソフトを持っていなくても更新データは先行してダウンロードできるので、SDカードの容量が余っている限り、今後プレイしそうなソフトの更新は先にダウンロードした方がいい。

260421 お気に入りの腕時計が壊れて悲しい

Image: 260421 お気に入りの腕時計が壊れて悲しい

5年くらい前に買ったお気に入りの腕時計が壊れて悲しい。電池切れかと思ってボタン電池を交換しても動かなかった。スイスブランドの輸入品でそこそこ値段が張ったけど、デザインが少し古風で暖かみのあるアナログ時計で、かなり気に入っていた。

その前に買った腕時計はケースがチタン製でもっと高かったが、4年くらいで太陽電池の持ちが悪くなってきて、3日持たないとなると使い勝手が悪かった。二次電池は年数が経つとへたるということで、充電式じゃないこの時計を選んだけども、結局、電池は1回替えただけで壊れてしまった。私はクロノグラフでも機械式でもなくシンプルなアナログ時計が好きなんだけども、機械式じゃなくても指針のメカニックは摩耗するから、高かろうが安かろうが短命なのかもしれない。腕時計をファッションと考えるなら3年持ったら長い方だけども、家電と考えるなら3年は短い。

本当に延命させたいなら修理に出すなり駆動部を入れ替えるなりの手段がまだある。しかし、次のお気に入りを探してみるのも良いと思ってしまうわけ。

Age of Empires II (AoE2) Gold Edition用非公式パッチ

現在Steamで販売されているほう (Definitive Edition) ではなく、2000年から2001年に発売されたオリジナル版 (The Conquerors Expansion または Gold Edition) の話です。

Webで調べても日本語の情報は乏しい上、英語でさえ怪しいダウンロードサイトがたくさん出てくる始末。分かる範囲でまとめてみる。

公式パッチ

2026年4月時点でまだダウンロード可能。Gold EditonではAoK 2.0a適用済み。

Age of Empires II: The Age of Kings 2.0a
http://download.microsoft.com/download/aoeaok/Patch/2.0a/W9XNT4/JA/Age2upA.exe
Age of Empires II : The Conquerors Expansion Version 1.0C
http://download.microsoft.com/download/ageIIConquerers/Patch/1.00c/WIN98Me/JA/Age2XPatch.exe

非公式パッチ

オリジナル版はSafeDiscというコピー保護機構があり、ゲームCDのディスクイメージ化は困難です(なお、この機構はWindows Vista以降ではブロックされるため動作不可)。しかし、起動時に毎回CDを入れ替えないといけないのは億劫。そこで、ゲーム起動時のディスク要求を無効にするNoCD化がよく行われています。

下記の情報を見るに、おそらくオリジナル版に忠実なNoCDパッチが存在したようですが、現在はリンク切れ。

「Age Of Empires II」シリーズのインストール方法について (2001.11.06)
http://www.mars.dti.ne.jp/madcap/age/patch/patch.htm

以下のパッチは日本語版に適用してもプレイできますが、一部のテキストが英語になる場合があります。

1.0eパッチ 2003年

AoK Patch (1.0e) Mod for Age of Empires II: The Conquerors | AoE2:TC Mods
https://gamebanana.com/mods/37904

変更点はNoCD化とマルチプレイでの対チート機能を搭載。1.0cと1.0eを切り替えるスイッチャー機能あり。age2_x1.exeのファイルサイズがオリジナル版と大きく違うのは、オリジナル版のゲームプログラム本体はage2_x1.icdで、age2_x1.exeのCD認証をパスするとage2_x1.icdを復号化するという仕様だったためです。実際、age2_x1.icdとほぼ同じサイズになっているはずです。(ファイルサイズがほぼ同じだから中身は安全という判断方法は本来よくない。)

ゲーム起動にCDは不要になりますが、マップ画面のBGMはCD-ROMのオーディオ セッションから再生する仕様のため、CD(cue+binイメージでも可)をセットしていないとマップ画面でBGMが再生されません。CDをセットしても音が聞こえない場合はマルチメディアのプロパティの設定を変えてみてください。

xOmicron v1.1 [ENGLISH] No-CD/Fixed EXE 2012年 (893 KB)

NoCD化、ワイド画面対応した実行ファイル (age2_x1.exe) 置換パッチ。リンクは貼りませんが、怪しげな海外サイト()からダウンロードできます。exeファイルのみのパッチのためか、ぱっと見たところは日本語が英語になる現象はなさそうです。次のUser Patch(の過去バージョン)からexeファイルだけ抽出したデータだと思いますが、No CD化されていて、出自はよく分かりません。

UserPatch v1.5 (RC, Build 6268, 2019/02/28)

UserPatch: Conquerors Feature Update
https://userpatch.aiscripters.net/

xOmicronパッチの後継。CPU (AI) の変更、ワイド画面対応、Windows 7での不具合対応、BGMのMP3プレイリスト再生対応等、かなり改造されたパッチです。これ単体ではNoCD化されず、NoCD化したいなら別途、1.0eパッチが必要です。

260419 バレットガールズ2 [4]孤島トレジャーハント

Image: 260419 バレットガールズ2 [4]孤島トレジャーハント

アクションゲーム『バレットガールズ2』(D3パブリッシャー、2016年)をプレイ。

ゼンシンマシンガールをポチった記念に、PS Vitaを引っ張り出して9年前の続きをプレイしています。D3のゲームが好きなのよね。こういうバカみたいなコンセプトのゲームを真面目に作るからいい。

Image: バレットガールズ2

一番好きだったゲームは夏色ハイスクル。自分ではプレイしたことないんだけど、PS4全盛期の時、ライブ配信一覧でグラセフやブラッドボーンなどの大型タイトルが並ぶ中、1人か2人はこのゲームをプレイしていて、自転車で爆走する主人公の姿に引き込まれたなぁ。なんだこのバカゲーは!?って。

バレットガールズ2は私が詰んでいる100のゲームの一つ。確か、このミッションは時間的にキツくて苦戦していたはず。各所に配置された4個の爆弾を回収するのだが、その爆弾を見つけるには、それぞれのありかが記された地図を持っているモブ敵を倒さねばならない。実質8箇所を10分以内に巡る必要がある。

Image: バレットガールズ2

このミッションでカメラ視点のリセットとダッシュをマスターしました。

Image: バレットガールズ2

Win9xでの3.5インチ1.2MBフォーマット対応について

以前の記事でWindows 2000以降がサポートするフロッピーディスクフォーマットについて書いたが、Win 9xではどうかというと、これがまた複雑な状況になっている。

ハードウェアの制約により、PC/AT互換機で3.5インチ1.2MBフォーマットのディスクを読み書きするには3モード対応FDDを搭載したPCとドライバーが必要なことはこちらに書いた通り。

PC/AT互換機のWin98にてPC98 1.2MBフォーマットのフロッピーディスクを読む

これに加え、Windows 95, 98, Meの日本語版に限り、Windows上で1.2MBフォーマットのディスクを読み書きできる。既にフォーマットされたディスクを読み書きすることはできるが、フォーマットすることはできない。また、MS-DOSモードではアクセスできない。

技術詳細

まず、1.2MBフォーマットと1.44MBフォーマットの仕様の違いは次の通り。1.2MBフォーマットの仕様は8インチ2Dディスクに由来し、5.25インチや3.5インチHDディスクではサイズやこれに関係する記録密度以外は同じ。

フォーマットの種類 物理仕様 論理仕様
媒体の種類 回転速度 トラック密度 記録方式 転送レート 面数 容量(U) セクタサイズ セクタ数 シリンダ数 容量(F)
2D(1.2MB) 8" 2D 360rpm 48tpi MFM 500Kbps 2 1.6MB 1024B 8 77 1232KiB
2HD(1.44MB) 3.5" 2HD 300rpm 135tpi MFM 500Kbps 2 2.0MB 512B 18 80 1440KiB

Win 9xにおいてディスクアクセスの最下層(ハードウェアとの通信)を担うドライバーをPort Driverと呼び、フロッピーディスクの場合はHSFLOP.PDRというファイルがこれを担っている。Win 9x日本語版に含まれるHSFLOP.PDRのみ、3モードFDDのモード切り替え(別途、サードパーティの3モード対応ドライバーが必要)や1.2MBフォーマットに対応している。このPort DriverはBIOS (Int 13h) を使わないため、BIOSで3モードFDDのサポートが有効かどうかは関係なく、マザーボードのSuper I/O (FDC)に対応するドライバーがあれば、3.5インチ1.2MBフォーマットのディスクにアクセスできる。5.25インチドライブではこの制約はなく、Win 9x日本語版であれば読み書きできる。

Win 9xにおけるディスクフォーマットの判別メカニズムはDOSのそれと同じ。ディスクの最初のセクターにあるBPB (BIOS Parameter Block)のジオメトリー情報が正当であれば、それを利用する。BPBが有効でない場合は、メディアディスクリプターの値から判別して、ドライバー自身が持っているBPBをコピーする。Win 9x日本語版のHSFLOP.PDRだけ、1.2MBフォーマットのメディアディスクリプター (0FEh) に対応したBPBを復元できる。正当なBPBを持つ5.25インチ1.2MBフォーマットのディスクならWin 9x英語版でも読み書きできる可能性はあるが、どうなんだろう。

260419 ネプ新キャラ

Image: 260419 ネプ新キャラ

超新時空ゲイム ネプテューヌ∞

ネプ新作のサイトを一巡してみたけど、つなこが描くキャラクターはやっぱいいっすね。由来は見た目で連想しやすいですが、名前がフランス語っぽい繋がりがあるのは何なんでしょう。システムについては、高低差も含めた空間バトルになりそうですが、詳細はまだ出てきていません。過去作より自由度が高いことは確かですが、それをゲームシステムにどう落とし込むかですね。

16/32ビット混在バイナリ(Win16アプリやVXD形式)を逆アセンブルする

Image: 16/32ビット混在バイナリ(Win16アプリやVXD形式)を逆アセンブルする

通常のIDAフリーバージョンでは純粋な16ビットMS-DOSアプリケーション (COM, EXE) とWin32 PEバイナリ (EXE, DLL) しか逆アセンブルできないが、古いバージョンではOS/2やWin 3.x, 9x用NE (New Executable) ヘッダーやLE (Linear Executable) ヘッダーのバイナリ (EXE, DLL, VXDなど) を逆アセンブルできるということを最近知った。(もっと早く知っていればエミュレーターのデバッグが捗ったかもしれないのに!)

Image: IDA Freeware version 4.1

次のリンクからidafree.zip (Interactive Disassembler Pro Freeware version 4.1) をダウンロードして適当な場所に展開する。

IDA Pro Freeware (web archive)

このバージョンの実行ファイルはWin32コンソールアプリケーションで、Windows XPで動かすのは比較的簡単だが、現行のWindowsで動かすには大変。

Windows 2000, XP 英語版で動かすには

展開したアーカイブ内のidaw.exeを実行するとIDAが起動する。マウスカーソルが動かない場合は以下の処置が必要。

  1. idaw.exeを右クリックしてショートカットを作成する。
  2. 作成したショートカットを右クリックしてプロパティーを開く。
  3. オプション タブ - 簡易編集モード のチェックを外す。
  4. OKボタンで閉じる。
  5. このショートカットからIDAを起動する。

英語版以外のWindows 2000, XPで動かすには

手順3までは上と同じ。

  1. 「現在のコードページ」を「437 (OEM - United States)」に変える。
  2. OKボタンで閉じる。
  3. このショートカットからIDAを起動する。

Windows 10, 11で動かすには

  1. テキストエディターで以下の内容のバッチファイルを作成し、idaw.exeと同じフォルダーに置く。
chcp 437
idaw
  1. このバッチファイルを右クリックしてショートカットを作成する。
  2. 作成したショートカットを右クリックしてプロパティーを開く。
  3. オプション タブ - 簡易編集モードのチェックを外す。
  4. レガシ コンソールを使用する にチェックを入れる。しかし、Windows 11ではレガシーコンソールモードはオプション機能となっていて、追加インストールする必要がある。設定アプリを開き、システム→オプション機能→機能を表示→使用可能な機能を表示する→Legacy Console Hostを追加する。もしくは、Powershellを管理者権限で開いてAdd-WindowsCapability -Online -Name Microsoft.Windows.Console.Legacyを実行する。
  5. フォント タブでサイズとフォントを再セットする。
  6. レイアウト タブ - 画面バッファーのサイズ - 幅 80、高さ 25 にセットする。
  7. OKボタンで閉じる。
  8. このショートカットからIDAを起動する。

Image: ショートカットのプロパティ

Win2kで単密・倍密 (FM/MFM) 混在フォーマットのディスクをイメージ化する

私はてっきり自分のPC/AT互換機ではFM(単密度)フォーマットのフロッピーディスクを読むことはできないと思っていたのだが、5.25インチFDDを接続する機会があったので試してみたら、イメージ化することができた。使用しているマザーボードはASUS P2Bで、このマザーボードのSuper I/OはWinbond W83977TF-AW。

PC-98のDisk BASICでフォーマットされたディスクをイメージ化してみる。このディスクは最初のトラックだけ単密度(FM)、128バイト/セクターで、残りは倍密度(MFM)256バイト/セクターでフォーマットされている(一般的にMS-DOSが使用するフォーマットは全て倍密度512バイト/セクター)。このため通常はPC/AT互換機のDOSやWindowsで読み書きすることはできないが、IMDやSAMdiskはBIOSやWindows標準ドライバーを介さないため、使用環境次第では読み取ることができる。

次はDOS 5.0上でImageDisk (http://dunfield.classiccmp.org/img/)を使ってディスクイメージを作成するところ。

Image: IMD

次はWindows 2000上でSAMdiskとfdrawcmd.sys (https://simonowen.com/)を使ってイメージ化したファイルの情報を出力。特別なオプションは使用せず、samdisk a: rxtrain.dskを実行してイメージ化した後、samdisk rxtrain.dsk rxtrain.d88でD88形式へ変換した。

Image: SAMdisk

なお、抽出したディスクデータの正体。

Image: VM Training Disk

3.5インチディスクについては360 RPMに対応する内蔵ドライブを持っていないため試していない。