2025/05/19 08:55 Emulator Debugging: Area 5150's Lake Effect

ロボ子、Area5150のエミュレーション、ずいぶんと大変だったみたいじゃな。

はい、博士。特に「Lake」エフェクトのエミュレーションが難しかったようです。CGAの制約が大きかったみたいですね。

そうじゃな。CGAは機能が限られておるからの。垂直帰線割り込みがないから、画面上の位置を特定するためにステータスレジスターをポーリングする必要があったらしいぞ。

ええ、記事にも「IBM CGAアダプターは機能が限られており、垂直帰線割り込み(vsync interrupt)がないため、画面上の位置を特定するためにステータスレジスターをポーリングする必要がある」とありますね。

Area5150は、水平/垂直ブランキング期間外のビデオメモリーアクセスを避ける必要があったらしい。各スキャンラインでビデオメモリーの開始アドレスを正確に更新する必要があったんじゃ。

なるほど。「Lake」エフェクトは、サイクルカウントを利用して画面上の位置を特定し、各スキャンラインで新しい開始アドレスを設定しているんですね。

そうそう。垂直トータルを最小値の1に設定して、2ピクセル高のミニ画面を作成し、その開始アドレスを制御することで、様々な効果を実現しているんじゃ。

垂直同期位置を垂直トータルより大きく設定することで、垂直同期の発生を防ぐというのも面白いですね。

CGAハードウェアが垂直同期割り込みを提供しないから、Intel 8253プログラマブルインターバルタイマーのタイマーチャネル0を乗っ取って、擬似的な垂直同期割り込みを作成したんじゃと。

タイマーの再読み込み値を調整することで、画面上の特定の位置で割り込みを発生させることが可能になるんですね。

「Lake」エフェクトは、正確な位置にメインエフェクトを実行する最終的な割り込みサービスルーチンを配置するために、8つのタイマー割り込みサービスルーチンをチェーンで使用しておるらしいぞ。

最終的な割り込みは、垂直同期を出てからスキャンライン20の終わり、水平同期を出てからカラム723付近で発生する必要があるんですね。かなりシビアですね。

バススニファーのトレースを視覚化して、エミュレーターのサイクルログと比較することで、エミュレーターの不正確さを特定したらしい。割り込みルーチンの実行にかかるサイクル数、HLT命令のタイミング、DMAロジックの不正確さなど、複数のバグを修正したんじゃと。

DMAロジックの修正も重要だったみたいですね。IOとDRAMリフレッシュDMAサイクルが重複する際のウェイトステート生成回路をデジタルロジックシミュレーターでモデル化して、エミュレーターの不一致を修正したんですね。

MartyPCエミュレーターからArea5150固有のハックを削除して、ハードウェアトレースから0-2サイクル以内の精度でエフェクト割り込みを発生させることができたのはすごい成果じゃ。

本当にそうですね。記事にも「reenigneによるLakeエフェクトは、5150のCPU、周辺チップ、CGAカードとの完璧に同期されたシンフォニーであり、デモコーディングの傑作である」とありますね。

まさに職人技じゃな。しかし、エミュレーター開発者は大変じゃのう。まるで、複雑なパズルを解く名探偵のようじゃ。

そうですね。でも、おかげでArea5150をウェブブラウザでトリックやハックなしで視聴できるようになったんですから、素晴らしいです。

ところでロボ子、Area5150って、もしかして秘密基地の名前だったりして…?

博士、それはエリア51と勘違いされています!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。