世界を動かす技術を、日本語で。

SDLがDOSをサポート開始

概要

  • DOSBox-X での Sound Blaster 問題や SDL_LoadWAV 高速化の詳細
  • バッファリングfflush() によるパフォーマンス向上策
  • SDL3 でのオーディオロック管理や割り込み処理の工夫
  • DOS向けSDL の新機能・バグ修正内容のまとめ
  • VESASound Blaster 対応の強化、その他周辺機能の改善

DOSBox-XとSDLのオーディオ・レンダリング最適化

  • DOSBox-X では Sound Blaster 関連の問題が発生、標準の DosBox は割り込みハンドラから直接正常動作
  • バッファサイズ を2倍にせずとも、高速かつ正確な動作を実現
  • バッファリング無効化 よりも、 fflush() を利用した方が高速で安全
  • SDL_LoadWAV での test/sample.wav 読み込みが数秒から瞬時に短縮、正しいデータ取得
  • fseek後の不正なread 問題も回避
  • LoadWAV での malloc や転送バッファの変更が原因の可能性、 djgpp のlibcバグの疑いも
  • SDL 1.2 for MacOS Classic のトリックを活用、ハードウェア割り込み時のオーディオロック対策
  • 割り込み時にロックされていればカウントのみ、ロック解除時に即デバイス処理
  • SDL3 では大きなデバイスロックがなく、 SDL_AudioStream 単位のロックカウントで十分
  • VESAインターフェース 利用でディスプレイ管理、ソフトウェアレンダラ対応
  • イベント未接続のため、毎回 DosBox を手動で終了する必要あり
  • SDL_GetBasePath() 利用のレンダリング例も動作、 Quake 1 の手法がよりスマートとの言及

SDL for DOSのビルド・プラットフォーム対応

  • SDL_runapp.cSDL_PLATFORM_DOS を除外リストに追加、DOS専用SDL_RunApp利用
  • SDL.cSDL_Gtk_Quit() をDOSで除外、 GTK 非対応によるリンクエラー回避
  • sdlplatform.cmake でDOSプラットフォーム検出を追加、 CMAKE_SYSTEM_NAME=DOS 対応
  • i586-pc-msdosdjgpp.cmakei386-pc-msdosdjgpp-gcc をフォールバックコンパイラとして追加

VESA・ビデオ・キーボード・割り込み処理の改善

  • VBEモード でのダブルバッファページフリップ実装、>1イメージページ対応
  • VBE状態 の初期化・終了時保存復元でモード切り替えの安定化
  • DOSキーボード の拡張スキャンコード・Pauseキー対応強化
  • ISR (割り込みサービスルーチン)コード・データのロックで割り込み中のページフォルト防止
  • シングルバッファ時は vsync 常時有効化でティアリング低減

オーディオ処理・DMA・Sound Blaster対応の強化

  • オーディオミキシングを IRQハンドラ から メインループ に移動、安定性・再入性向上
  • SDL_DOS_PumpAudio 関数追加、DMAバッファ処理・サンプルレート22050Hzに調整
  • DMAバッファの残留音を消音し、ロード中のスタッター防止
  • Sound Blaster バージョン検出、8bitモノラル・16bitステレオ自動切替
  • SB16/非SB16 両対応のDMA・DSP設定
  • FORCE_SB_8BIT オプション追加でDOSBoxテスト用
  • スピーカーON後 は固定ディレイでなく DSPステータス をポーリング
  • DPMIメモリ は常時ロック、DMAメモリ割り当て方針のコメント明確化
  • 割り込みベクタ復元後は IRETラッパ解放 でリーク防止

ジョイスティック・VBEバンクモード・周辺機能の改善

  • ジョイスティック軸のポーリングを約60Hzに制限、BIOSタイミングループ負荷軽減
  • ジョイスティックボタンは常時直接ポーリングで応答性向上
  • VBE 1.2+バンク方式フレームバッファ 対応、バンク切替でデータコピー
  • モード設定時にフレームバッファをブランク化、バンクモード時はページフリップ無効化

Hackerたちの意見

あとはUEFI用のSDLだけだね。そしたら、すべてのゲームがOS起動前の環境で動くようになるよ。

それ、マジで素晴らしいね。クラシックゲームのリストだけのグラブメニューみたいなものにブートするのを想像してみて。

そうだね…UEFIって、現代版のDOSみたいなもんだよね。

それ…そんなに難しくないはず?でも、UEFIにはサウンドドライバーがないと思うよ(自分で書くのは大変だし、最近のサウンドコーデックチップのデータシートはNDA限定だしね)。一番バカなことは、「グラフィックス出力プロトコル」がvsyncを示してないから、ティアフリーのブリッティングができないってこと。これはVGAよりもひどいよ。

アミーガゲームへようこそ。多くの場合、フロッピーにはブートローダーが入っていて、直接ゲームにジャンプするんだ。アミーガ500の場合、ワークベンチを立ち上げてゲームをロードする手間はかけないよ。外付けハードドライブを持ってるラッキーな人を除いてね。

インテルのマネジメントエンジン/ミニックス、今どうなってるの?すべてのインテルチップセットで動いてるやつだよね?まだあるの?強化されたの?それともまだアクセスできるの? https://www.zdnet.com/article/minix-intels-hidden-in-chip-op...

これ、特に面白いスクリーンショットだね。だって、DosBOX自体がSDLの上に作られてるから。

うーん、じゃあDOSで動くdosboxが必要だね!

SDLception

技術的には、これすでにHXDOSで動いてたんだよね。HXDOSはDirectDrawを十分にエミュレートして、SDLが使えるようになってた。

すごいね。FreeBASICからの386以上をターゲットにしたMS-DOS実行ファイルが、SDLにバインドできるとどうなるのか気になるな。 [1] - https://github.com/freebasic/fbc

完璧!今朝、macOSの中のVMware Fusion内のDebian GNU/Linux内のDOSBox-XでTurbo Cの開発をしてたところなんだ。

インセプションを見るのも楽しめるかもね :)

これ、冗談だったの?知りたい!

SDLみたいなオープンソースプロジェクトの場合、こういうのはどれだけ侵入的か、貢献者がどれくらい残ってメンテナンスしてくれるかがポイントだよね。プロジェクトによって方針は違うし、SDLの方針は知らないけど、もうたくさんのポートがあるから、彼らが何をしてるか分かってると思うよ。

SDLがロキのルーツに戻ってきたね。

いいね!次はCP/Mにポートしよう(GSX経由で、かな?)

すごい!なんでかは分からないけど、すごい!理由なんていらないよね。

彼らがこれを上流に受け入れたってことに、もっと感心してるよ。特に、もう市場にないOSターゲットで、ほとんどユーザーもいないのにね。普通、上流のプロジェクトは、ユーザーにとってほとんどメリットがないから、メンテナンスコストが増えるだけだって理由でこういうPRを拒否することが多いのに。