インクレディブル・マシーン3のBGM MIDIデータにあるバグを直す

Image: インクレディブル・マシーン3のBGM MIDIデータにあるバグを直す

PCゲーム『インクレディブル・マシーン3』日本語版のBGM “Picture”(クラシック音楽『展覧会の絵』のアレンジ)、“New Age”、“Detective Theme"のMIDIデータにあるバグを直す。

症状

  1. BGM “Pictures” で、ある2音がループ後に鳴り続ける場合がある。
  2. BGM “Pictures” と “New Age”、“Detective Theme” の一部のチャンネルのピッチが1オクターブ以上高くなる場合がある。

ただし、MIDIデバイスによっては再現しないことがある。

原因

いずれもゲームのMIDIデータの誤りによるもの。

  1. ノート・オフ メッセージが送られる前にループに入ってしまうため。
  2. ピッチベンドを初期化するメッセージが足りないため。

修正方法

次から差分ファイルをダウンロードしてゲームインストール先に配置し、MS-DOSプロンプト上でそこをカレントディレクトリにしてbupdate resourceを実行して下さい。パッチ対象は Resource.002(タイムスタンプ 1996/11/01 17:03:36、1,824,417 バイト)です。

tim3jpat.zip (17.8 KB)

BGM “Pictures” のバイナリー差分のみ、以下に示す。

163CB0  C1 38 00 B0 07 7F 00 B1 07 68 00 0A 33 01 FE 14
        C1 38 00 E1 00 40 00 B1 07 68 00 0A 33 01 FE 14
                 ^^ ^^ ^^

164A00  35 5B 57 5E 52 64 59 00 2E 60 60 5B B0 69 00 00
        35 5B 57 5E 52 64 59 00 2E 60 60 62 B0 69 00 00
                                         ^^

164FC0  58 00 52 61 63 5F B0 69 00 00 FF 2F 00 48 4D 49
        58 00 52 61 63 65 B0 69 00 00 FF 2F 00 48 4D 49
                       ^^

詳細

リソースファイルには標準MIDIフォーマット (.mid) のデータと、Human Machine Interface (.hmi) というMIDIフォーマットから派生した特殊なフォーマットのデータが収録されている。ゲームでは専ら後者のデータが使われている。

ファイルのヘッダーはHMI-MIDISONG061595、トラックデータのヘッダーはHMI-MIDITRACKで、トラック内のデータは標準MIDIフォーマットと似ている。大きな違いはノートオンとノートオフの2つのメッセージを長さ値にした1つのメッセージとしていることと、ループ用のメタデータを含んでいること。

例えば、BGM “Pictures” のトラック1の冒頭は次の通り。数値データは7ビットで表されることに注意する必要がある。

ΔTime -  Message (2-3 bytes)
00       B0 69 01 ?
00       C1 38    Program Change 56 (Trumpet)
00       B0 07 7F Control Change 07 (Volume) - Ch.1- 127
-> 00    E1 00 40 Pitch Wheel Change - Ch.2 - 2000H
00       B1 07 68 Control Change. 07 (Volume) - Ch.2 - 104
00          0A 33 Pan
01       FE 14 FF FF Loop start

パッチでは Ch.1 に対する音量変更メッセージ(この目的は不明)をピッチホイール変更メッセージに置き換えている。また、ループ終わりメッセージのデルタ時間を長くして、ノート・オフメッセージより後に来るように調整している。BGM “New Age” と “Detective Theme” では不要メッセージを置き換えても1バイト足りないため、ヘッダーの長さを削っている。このため、ヘッダーサイズ(オフセット0x57, 0x5B)とループ開始位置(オフセット 0xB4)などを変えた。

参考

DOSゲーム用にCPU速度を落とす方法を模索する

マザーボードの設定でCPUの倍率やベースクロックを変える

この方法はBIOS設定画面で変えられるのであればそこまで大変じゃないが、ボード上のスイッチ操作が必要となると面倒くさい。コアなゲーマーならTurboスイッチを外付けするといった改造で解決してしまうが、私には真似できそうにない。

CPUキャッシュを無効にする

これもBIOS設定画面で変えられる。例えば ASUS P2B (Award ROM PCI/ISA BIOS) の場合、BIOS FEATURES SETUP -> CPU Level 1 Cacheや CPU Level 2 CacheをDisableにすることでCPUキャッシュを無効にできる。

Image: BIOS FEATURES SETUP

キャッシュを無効にしてからNorton Utilitiesでベンチマークを測ってみると驚きの結果が。

Image: Norton Utilities SysInfo

Pentium II 400 MHzが 286 12 MHzとそれほど変わらないという結果に。あまりにも遅すぎて、80年代のDOSゲームをプレイするにはいいかもしれないが、90年代のをプレイするには性能が不足しているかもしれない。

ACPIのCPUスロットリング機能を利用する

この機能を利用するとCPU速度を1/1から1/8まで変更できる。この機能を利用したソフトウェアにCPUSPDがある。

CpuSpd - A Hardware Based CPU Speed Control Utility for DOS/Win9X Retro Gaming \ VOGONS

UltimaやLemmingsはこれを使うと速いPCでも正常に動かせるらしい。試しにCPU速度を1/4に下げてみた結果、スコアは1000からぴったり1/4の250になった。

Image: Norton Utilities SysInfo

FALCON 3.0はビデオカードの速度に依存しているようで、これを使ってCPUスロットリングを変更しても効果があるどころか、BGMやSEが正常にならなくなる不具合が発生した。やはりISAバスのビデオカードじゃないとうまく動かないか。

DOS/V日本語環境で英語DOSテキストモードのDOSアプリを動かす

Image: DOS/V日本語環境で英語DOSテキストモードのDOSアプリを動かす

DOS/Vの日本語環境はビデオメモリーの使い方が米国英語版DOSと異なるため、ビデオメモリーを直接書き換える系の海外DOSアプリケーションは日本語環境では画面が更新されず、IBM DOSならCHEV US、MS-DOSならUSコマンドで事前に英語環境へ切り替える必要がある。しかし、コンパック版MS-DOSに付属するVE386.EXE(コンパック ビデオ エンハンサ ドライバ)を使えば、この操作をせずにそのままテキストモードで動く海外DOSアプリケーションを使うことができる。コンパック版MS-DOS (MS-DOS 5.0J/V) はメモリーマネージャーにCEMMが使われているが、このVE386は普通のEMM386との組み合わせでも問題なく使えるようだ。

このツールを含むディスク『Compaq サプリメンタル プログラム』は、かつて Hewlett Packard のFTPサイトからダウンロードできたが、2026年現在は閉鎖されているようだ。10年くらい前にサルページして作成したディスクイメージ(もともとのファイルはディスクイメージ自己展開形式だった)をここに置いておく。

DOS Supplemental Programs Diskette 1.08J REV.A (358 KB)

ほとんどのDOSゲームはグラフィックモードで動くため効果がない。DOS/V発売当初は日本語に対応したユーティリティーソフトや通信ソフトが少なかったため、海外のDOSアプリを動かすためにこのツールが重宝したのかもしれない。今ではそういう用途で使う機会は少ないが、Sound Blasterなどの拡張カードに付属するドライバーユーティリティは英語環境でしか動かないものが多く、それらを使うときにこのツールが役に立つ。

CONFIG.SYSにVE386.EXEを組み込むとビデオメモリーが英語環境のテキストモードと同じアドレス B8000h でエミュレートされる。また、コマンドライン上でVE386 USを実行すると、半角フォントがコードページ437に置き換えられる。

Sound Blaster AWE64用英語版ドライバーのDIAGNOSEユーティリティーを起動したところ。画面解像度はDOS/Vのテキストモードである640×480のままで、英文フォントで違和感がない表示になっている。

Image: DIAGNOSE

日本語フォントのままでも罫線文字が文字化けするだけで、使う分には問題ない。

Image: DIAGNOSE

260428 消滅するメカニカルキーボードブランド FILCO Majestouch

Image: 260428 消滅するメカニカルキーボードブランド FILCO Majestouch

メカニカルキーボード FILCO Majestouch で知られるダイヤテックが4月22日に閉業したと発表した。

ダイヤテック突然閉業 「FILCO」ブランドの“壊れないキーボード”に定評 - ITmedia NEWS

私が15年前に初めて購入したメカニカルキーボードがMajestouchだったので名前に思い出深く感じるが、ブランドが消滅したこと自体は特に惜しく思わないな。(→後日発表された情報によれば、ブランドは台湾支社によって存続するらしい。)

FILCO Majestouch NINJAキーボードを分解する

その当時、PCゲーミングにメカニカルキーボードという発想がなくて、ロジクールやマイクロソフトはメンブレンやパンタグラフのキーボードしか売っていなかった。量販店で入手できた非メンブレンキーボードは、PFUのHHKB、東プレのRealForce、UniCompのIBM式バックスプリングキーボードと、このシリーズくらいだった。これらは四六時中キーボードを相棒とするプログラマーが使うものという認識だった。Cherry MX黒軸と茶軸に加えて赤軸のキーボードが出始めた頃だ。確か、メーカー (Cherry) が出しているスイッチのラインナップには青軸や白軸は既に存在したはずだが、それを使ったキーボードが出回っていなかった。

このシリーズのキーボードは良く言えば手頃な価格(当時の水準)でシンプル、堅実な作り、悪く言えば華やかさや面白みに欠ける。Bluetoothに対応したのはかなり後のことでで、技術革新に乏しく、マーケティングも渋かった。

そうは言っても私はMajestouch NINJAを10年くらい使っていたが、メカニカルキーボードのラインナップが豊富な今ではこれにこだわる理由もなく、2022年にEpoMakerの96%キーボードに乗り換えた。Majestouch NINJAは今でも持っているのだが、Majestouch 2シリーズ共通の欠点としてPS/2変換アダプターで使うとキーボードがスリープから復帰したときに反応しなくなるという不具合があり、使い道がなく押し入れの肥やしになっている。

今は数多のメーカーからゲーミングマウスとキーボードが出ていて、カラーやデザインを選びやすい。消費者にとっては助かる。ダイヤテックはその流れについて行けなかった。

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