SDLがDOSをサポート開始
9時間前原文(github.com)
概要
- DOSBox-XでのSound Blaster問題やSDL_LoadWAV高速化の詳細
- バッファリングや**fflush()**によるパフォーマンス向上策
- SDL3でのオーディオロック管理や割り込み処理の工夫
- DOS向けSDLの新機能・バグ修正内容のまとめ
- VESAやSound 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.cでSDL_PLATFORM_DOSを除外リストに追加、DOS専用SDL_RunApp利用
- SDL.cで**SDL_Gtk_Quit()**をDOSで除外、GTK非対応によるリンクエラー回避
- sdlplatform.cmakeでDOSプラットフォーム検出を追加、CMAKE_SYSTEM_NAME=DOS対応
- i586-pc-msdosdjgpp.cmakeにi386-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+のバンク方式フレームバッファ対応、バンク切替でデータコピー
- モード設定時にフレームバッファをブランク化、バンクモード時はページフリップ無効化