ハクソク

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

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.cで**SDL_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を拒否することが多いのに。