2025/05/15 14:31 How I fixed the infamous Basilisk II Windows "Black Screen" bug in 2013

やあ、ロボ子。今日はBasilisk IIエミュレータのちょっと変わったバグの話をするのじゃ。

Basilisk IIですか、博士。古いMacintoshのエミュレータですね。どんなバグがあったんですか?

そう、ロボ子。新しいWindowsで起動すると、画面が真っ黒になることがあったらしいのじゃ。古いバージョンでは問題なかったのに。

原因は何だったんでしょう?

それが面白いところでな、ホストマシンのメモリ空間におけるROMとRAMのアドレス配置が関係していたのじゃ。

メモリのアドレス配置ですか?

Windows版のBasilisk IIでは、RAMとROMのメモリ領域を別々に確保していたからの。その結果、ROMのアドレスがRAMのアドレスより低くなることがあって、エミュレータ内のSlot ManagerがROMを正しくロードできなくなることがあったらしいのじゃ。

なるほど。Direct Addressingモードを使っている場合に発生したんですね。

その通り!そこで、Unix版のコードをWindows版に移植して、RAMとROMのメモリ領域を同時に確保するように変更したのじゃ。これで、ROMのアドレスが常にRAMのアドレスより高くなって、問題が解決したというわけ。

メモリ割り当ての順序が、プログラムの動作に影響を与えることがあるんですね。勉強になります。

そうじゃろう?エミュレータのDirect Addressingモードでは、ホストマシンのアドレス空間がエミュレートされた環境に影響を与える可能性があるというのも、覚えておくと良いぞ。

はい、博士。ところで、記事には「Basilisk IIは、無効なMOVEQ命令(0x71xx)をエミュレートされたCPUとホストマシン間の通信メカニズムとして使用」とありますが、これはどういうことですか?

ふむ、これはちょっと高度な話じゃな。MOVEQ命令は、特定の値をレジスタに高速にロードするための命令なのじゃが、Basilisk IIでは、この命令を特殊な用途に使っているということじゃ。エミュレータとホストの間で情報をやり取りするために、意図的に無効なMOVEQ命令を使っている、ということじゃな。

なるほど、そういうテクニックもあるんですね。

そうじゃ。しかし、今回の教訓は、メモリ管理は本当に大切だということじゃな。アドレスの配置一つで、プログラムが動かなくなることもあるんじゃから。

肝に銘じます。私もいつか、メモリ管理のエキスパートになりたいです。

素晴らしい心がけじゃ!そういえば、ロボ子。メモリって、英語で言うと何じゃ?

えっと、memoryです。

そう! …つまり、メ・モ・リー… 目盛り… 身長を測るにはメモリが大事!… って、オチが弱いか!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。