SDL artık DOS'u destekliyor
(github.com/libsdl-org)- DJGPP tabanlı DOS portu SDL'ye eklendi ve video, ses, girdi, iş parçacığı, zamanlayıcı, dosya sistemi ve derleme zinciri dahil geniş bir kapsamla
maindalına birleştirildi - VGA ve VESA 1.2+ video, Sound Blaster ailesi ses oynatma, PS/2 klavye ve fare, BIOS tabanlı joystick, işbirlikçi iş parçacıkları ve PIT zamanlayıcısı dahil DOS ortamına uygun uyarlamalar eklendi
- DJGPP'nin seek/read sorunu, seek sırasında arabelleği döküp geri yükleme yöntemiyle aşıldı; böylece
SDL_LoadWAViçindeki hatalı okumalar ve birkaç saniyelik gecikmeler ortadan kaldırıldı, ses yolu da IRQ yeniden girişi ve takılmaları azaltacak şekilde iyileştirildi - fullscreen siyah ekran sorunu INDEX8 modunun seçilmesiyle bağlantılıydı; DOS'a özel bir hint eklemek yerine mod sırası mantıksal olarak düzenlendi ve imleç saydamlığı sorunu da ek bir commit ile düzeltildi
- Gerçek donanım testi sınırlıydı; ses kaydı,
SDL_LoadObjectveSDL_TIMEiçin DOS'a özgü uygulama gibi bazı özellikler eksik olsa da 46 kontrol geçildi, birleştirme yapıldı ve bu değişiklik 3.6.0 özelliği olarak işaretlendi
DOS platformu destek kapsamı
- SDL'ye DOS portu eklendi ve DJGPP tabanlı olarak nispeten olgun bir düzeye ulaştı
- Çalışma birkaç kişi arasında paylaşıldı ve son aşamada kararlılık düzeltmeleri ile eksik özelliklerin tamamlanması eklendi
- DevilutionX, DOSBox üzerinde kapsamlı biçimde test edildi ancak gerçek donanım testi yoktu
- Uygun test yöntemi bulunmayan bazı özellikler bilinçli olarak dışarıda bırakıldı
- Desteklenen özellikler ayrıntılı şekilde listeleniyor
- Video, VGA ve VESA 1.2+ framebuffer, RGB ve 8 bit indeksli renk, VGA DAC palet programlama, vsync ve donanım sayfa çevirme ile çıkışta VBE durumunu kaydetme ve geri yüklemeyi içeriyor
- Ses, Sound Blaster 16, Sound Blaster Pro ve Sound Blaster 2.0/1.x desteği sunuyor; IRQ tabanlı DMA ve çift arabellekli auto-init yolunu kullanıyor
- Girdi, genişletilmiş tarama kodları dahil PS/2 klavye, INT 33h fare ve BIOS INT 15h tabanlı gameport joystick desteğini içeriyor
- İş parçacıkları,
setjmp/longjmpve yığın yamalama kullanan işbirlikçi bir zamanlayıcı kullanıyor; ayrıca mutex, semaphore, TLS ve condition variable için genel fallback'ler içeriyor - Olay pompası ve delay fonksiyonlarına yield noktaları eklenerek ses ve diğer iş parçacıklarının tepkiselliği korunuyor
- Zamanlayıcı, DJGPP'nin
uclock()işlevini kullanan PIT tabanlı bir uygulama ve yaklaşık 1.19 MHz çözünürlüğe sahip - Dosya sistemi,
GetBasePathveGetPrefPathiçin DJGPP'ninsearchpath()işlevini kullanıyor; ayrıca POSIX dosya sistemi işlemleri için fallback de içeriyor - Derleme, CMake çapraz derleme toolchain dosyası, DJGPP CI işi ve hızlı configure için preseed cache içeriyor
- Dahil edilmeyen özellikler de açıkça belirtiliyor
- Ses kaydı yok, yalnızca oynatma destekleniyor
SDL_TIMEiçin yerel uygulama ayrı olarak yok; DJGPP'nin POSIX katmanı üzerinden Unixgettimeofdayyeniden kullanılıyor- Paylaşımlı kütüphane yükleme desteklenmediği için
SDL_LoadObjectbulunmuyor
Uygulama süreci ve temel değişiklikler
- DOS portuna giden süreçte birçok commit ile video, ses, girdi, zamanlayıcı, iş parçacığı ve derleme zinciri kademeli olarak eklendi
- İlk çalışmadan sonra stdio buffering, ses uygulaması, video alt sistemi, dosya sistemi, fare, klavye, CI ve platform algılama sırayla tamamlandı
- stdio ve dosya erişiminde DJGPP'ye özgü seek/read sorunu aşıldı
- Başta stdio SDL_IOStreams arabelleğini kapatma denemesi yapıldı ancak daha sonra seek sırasında arabelleği döküp geri yükleme yöntemine geçildi
- Bu değişiklik, arabelleği tamamen kapatmaktan çok daha hızlıydı ve
fseeksonrası yanlış okuma sorununu da önledi SDL_LoadWAV,test/sample.wavdosyasını okurken birkaç saniye süren sorun ortadan kalktı ve doğru veri gelmeye başladı
- Ses işleme yöntemi de kararlılık odaklı olarak sürekli ayarlandı
- Başlangıçta Sound Blaster 16 uygulaması vardı; ardından SB16 öncesi 8 bit mono ve SB Pro stereo desteği eklendi
- Ses miksleme, IRQ işleyicisinde doğrudan çalışan yapıdan ana döngüye, oradan da yeniden SDL ses iş parçacığına taşındı
- IRQ içinde yeniden giriş sorunlarını önlemek için yön değiştirildi ve yük sırasında eski DMA arabelleğinin yarısı silence ile doldurularak takılmalar azaltıldı
- Örnekleme oranı ayarı, DSP durum polling'i, DMA bellek tahsisinin gerekçesi ve kesme vektörü geri yüklendikten sonra IRET wrapper'ın kaldırılması da düzenlendi
- Video tarafı da DOS ortamının kısıtlarına uyacak şekilde genişletildi
- VESA arayüzü üzerinden yazılım renderer ile çalışan ilk uygulama eklendi
- Sonrasında 8 bit palet desteği, VBE sayfa çevirme, durum geri yükleme, tek arabellek modunda vsync ve VESA banked framebuffer modu eklendi
- VBE 1.2+ üzerinde LFB olmadığında framebuffer kopyası bank switching ile yapılıyor ve bu modda sayfa çevirme devre dışı bırakılıyor
- Video başlatma ve kapatma sırasında tüm VBE durumu kaydedilip geri yüklenerek mod geçişleri temiz hale getiriliyor
- Girdi ve kesme işleme de gerçek kullanım düzeyine kadar iyileştirildi
- Klavye, genişletilmiş tarama kodlarını ve Pause tuşunu da ele alıyor; olay saklama için basit bir ring buffer kullanılıyor
- Fare, duyarlılığı okumak için INT 33h function
0x1Bkullanıyor - Joystick tarafında BIOS timing loop maliyetini azaltmak için eksen polling yaklaşık 60 Hz ile sınırlandırılıyor, düğmeler ise tepkisellik için her zaman doğrudan polling ile okunuyor
- ISR kodu ve verisi kilitlenerek kesme sırasında page fault oluşması önleniyor
- Derleme ve platform algılama sorunları da düzeltildi
- DJGPP için bir CI işi eklendi ve DOS için CMake platform algılama desteği geldi
SDL_PLATFORM_DOS, DOS'a özgü launcher ile çakışmaması içinSDL_RunApp()hariç tutma listesine eklendi- DJGPP
__unix__tanımlasa bile DOS'ta GTK ya da display server bulunmadığındanSDL_Gtk_Quit()DOS için devre dışı bırakılarak link hataları önlendi - Bazı DJGPP toolchain'lerinin
i386-pc-msdosdjgpp-gccönekini kullanması da dikkate alındı
Test durumu ve kalan kısıtlar
- Otomatik testler tamamen sorunsuz bitmese de yamalarla tamamlanabilecek düzeye ulaştı
- Bazı standart formatting işlevi sorunları nedeniyle otomatik testler sona kadar gidemedi; bunu aşan bir yama ile testler yine de tamamlandı
- Hâlâ başarısız olan örnekler vardı ancak ilgili formatting işlevinin doğru çözümünden emin olunamadığı için bunlar dahil edilmedi
- Demoların çoğu genel olarak beklenebilecek düzeyde çalışıyor olarak değerlendirildi
- Gerçek kullanım sonuçları da paylaşıldı
- DOSBox ve bir Vortex86 kart üzerinde DOS 6.22 ortamında pencere dışı olmayan mod hem test programlarında hem kullanıcı kodunda iyi çalıştı
- Ancak o sırada fullscreen,
draw.exe --fullscreengibi örneklerde siyah boş ekran veriyordu - Hız yavaş olsa da kullanılabilir seviyede olduğu belirtildi
- Bazı test programı sorunları da doğrulandı
sprite.exe, DOSBox'ta hemen kapanıyorwm.exevedraw.exegörüntü üretmiyor ancak ESC basıldığında kapanıyortestpalettebir segfault oluşturuyor
Tam ekran renk derinliği seçimi sorunu ve düzeltme
- fullscreen siyah ekranın doğrudan nedeni,
SDL_GetClosestFullscreenDisplayMode()işlevinin INDEX8 moduna düşmesiydi- Uygulama INDEX8 render etmeyi desteklemiyorsa ekran siyah görünüyordu
- İç uygulamada, yalnızca kullanıcı zaten INDEX8 fullscreen modu seçmişse INDEX8 dikkate alınıyordu
- İlk aşamada yalnızca DOS'ta
SDL_HINT_DOS_ALLOW_INDEX8_MODESarkasında INDEX8 modlarını gizleyen bir çözüm eklendi- Amaç, uygulama bunu doğru işleyebildiğinde açıkça opt-in yapılmasını sağlamaktı
- Ancak
maindalında en düşük bit derinliği yerine en yüksek bit derinliğini seçen bir değişiklik zaten eklenmişti ve bunun sorunu çözüp çözmediği değerlendirildi- Bu değişiklik bpp sorununu çözdü ancak 640x480 best fit isteğinde 1024x768 seçilmesi gibi yeni bir sorun doğurdu
- Sonunda bu değişiklik geri alındı ve daha iyi düzeltmenin ayrı bir PR'da ele alınmasına karar verildi
- Son aşamada DOS'a özgü hint kaldırıldı ve mod sırası mantıksal olarak düzenlendi
Remove SDL_HINT_DOS_ALLOW_INDEX8_MODES and order modes logicallycommit'i eklendi- #15442 birleştirildiğinde, palet ayarlamayan veya fullscreen modunu doğrudan seçmeyen uygulamalarda bile otomatik mod seçiminin doğru çalışabileceği belirtildi
- Bununla birlikte, SDL'deki diğer eski sorunların tamamını bu PR içinde sonuna kadar kovalamama sınırı da çizildi
Demo render etme ve imleç düzeltmesi
- Demoların siyah görünmesi sorunu, yalnızca bu PR'a değil #15442 birleştirilmiş olup olmamasına da bağlıydı
SDL_GetClosestFullscreenDisplayMode()en düşük renk derinliğini tercih ettiği sürece bu portta INDEX8 seçiliyor, uygulama palet ayarlamıyorsa siyah ekran oluşuyordu- İlgili PR yerelde birleştirildiğinde tüm test hedeflerinin çalıştığı doğrulandı
- Kalan görsel sorun imleç saydamlığıydı
- Yerel doğrulama sonrasında yalnızca imlecin saydam olmadığı ortaya çıktı
- Bunu düzeltmek için
Don't convert cursor if dest is not INDEX8commit'i eklendi - Düzeltmeden sonra RGB modunda optimize edilmemiş sürüm kullanılıyor ancak hem RGB hem INDEX8'de doğru çalışıyor
- XRGB1555 ve RGB565 için biraz daha iyi performans olasılığı bulunsa da düşük öncelikli görüldü
İnceleme ve birleştirme kararı
- PR için squash merge uygun görüldü
- GitHub'ın sonuç commit'inde PR referansını koruması sayesinde çalışma sürecinin yine de izlenebilir olduğu düşünüldü
- Sonuç commit'ine ek katkı sahiplerinin de yazılması önerildi
Co-authored-byiki kişi veTested-bybir kişi eklenmesine dair somut ifade de yer aldı
- İncelemeyi yapan kişi, birleştirme sonrasında bazı derleme betiği ifadelerini daha temiz şekilde yeniden yazacağını belirtti
- Son birleştirme öncesinde diğer ilgili PR'ların da birlikte birleştirilmesi ve DOS PR'ının ilerletilmesi yönünde karar verildi
- “Last call on DOS pull request!” sonrasında ilgili PR'ların birleştirilme durumu doğrulandı
- Ardından 46 checks passed durumu ile
maindalına birleştirildi
- Birleştirme sonrasında sürüm kapsamı da netleştirildi
- Bu değişiklik 3.6.0 özelliği olarak değerlendirildi
-
3.4.x'e cherry-pick yapılmayacak
- Birleştirmeden sonraki gün DOS çalışma dalı silindi
Sonraki işler ve kalan donanım sorunları
- Bazı Nvidia GPU'larda
4f07(SetDisplayStart)uygulamasının düzgün çalışmaması sorunu da gündeme getirildi- VOGONS başlığı bağlantısıyla birlikte, raporlarda destek var görünse de gerçekte çalışmayan GPU'lar bulunduğu belirtildi
- Test kapsamının GeForce 9300'dan 3060'a kadar daha geniş olabileceği yazıldı ancak bunun eldeki donanıma dayalı olduğu ve tam kapsamı temsil etmediği de not edildi
- Proje tarafındaki testlerde de aynı görüntüleme sorunu gözlendi
- GPU üreticisine göre SDL'in özelliği kapatması uygun görülmedi; bunun yerine kullanıcı kontrollü bir hint olasılığı gündeme geldi
page_flip_availableiçin kullanıcı tarafından kontrol edilebilen yeni bir hint'in daha iyi olabileceği değerlendirildi- Bunun hemen yapılmayıp daha sonra eklenebileceği şeklinde bırakıldı
- Birleştirme sonrasında doğrudan framebuffer kullanımı için bir hint de belirtildi
SDL_HINT_DOS_ALLOW_DIRECT_FRAMEBUFFERaçılırsa yukarıdakiSetDisplayStartsorununun çok önemli olmayabileceği ifade edildi
1 yorum
Hacker News yorumları
Artık tek gereken UEFI için SDL; böylece oyunlar işletim sistemi önyükleme öncesi ortamda da çalıştırılabilir
güvenliğin daha da sıkılaşıp sıkılaşmadığını ya da hâlâ erişilebilir olup olmadığını da merak ediyorum https://www.zdnet.com/article/minix-intels-hidden-in-chip-operating-system/
Ama bildiğim kadarıyla UEFI’de ses sürücüleri yok ve artık ses codec çipleri için bile yalnızca NDA kapsamındaki veri sayfaları bulunuyor, bu yüzden elle yazmak da zor
Daha da saçması, graphics output protocol’de vsync bilgisi yok; bu yüzden tearing olmadan blitting yapılamıyor, bu da kelimenin tam anlamıyla VGA’dan bile kötü
grub benzeri bir menüyle açılış yapıp önüne klasik oyun listesi çıktığını düşününce insan heyecanlanıyor
Bu ekran görüntüsünü özellikle komik yapan şey, DosBOX’ın zaten SDL üzerinde inşa edilmiş olması
Bu, DJGPP kullandığı için DPMI aracılığıyla CPU’yu 32 bit moda geçiriyor
Bu yüzden segmented memory, near pointer ve her yerde karşına çıkan türlü türlü 64KB sınırları ile o gerçek eski okul hissi pek gelmiyor
Harika
SDL binding desteği olan FreeBASIC’in 386+ hedefli MS-DOS çalıştırılabilir dosyalarıyla birlikte nasıl olacağını merak ettim
[1] - https://github.com/freebasic/fbc
Aslen DOS kökenli olan OHRRPGCE’yi tekrar DOS’a port etmeliyim diye yıllardır aklımın bir köşesinde tutuyordum
Ayrıca SDL’in SDL 1.2 döneminde mevcut portların ve OS desteğinin neredeyse tamamını agresif biçimde budadığını düşününce, SDL3’ün DOS desteğini geri kazanması oldukça şaşırtıcı
Mükemmel
Bu sabah macOS içindeki VMware Fusion içindeki Debian GNU/Linux içindeki DOSBox-X içindeki Turbo C ile geliştirme yapıyordum; tam üstüne geldi
on yıllar önce turboc ile çalıştığıma dair silik bir anım var
Teknik olarak bakarsak bu zaten HXDOS ile mümkündü
Çünkü DirectDraw’ı, SDL’in kullanabileceği kadar iyi emüle ediyordu
O zaman hangi SDL hedefi için derlendiğini merak ettim
Win32’ye özel tam ekran mı, yoksa 640x480 gibi bir VESA çözünürlüğü mü?
SDL gibi açık kaynak projelerde bu tür desteklerin eklenmesi genelde değişikliğin ne kadar istilacı olduğuna ve katkı yapan kişinin gerçekten bakımını sürdürüp sürdürmeyeceğine bağlıdır
Her projenin politikası farklıdır ve SDL’in politikasını bilmiyorum ama zaten çok sayıda portları olduğuna göre neyin altına girdiğini biliyordur diye düşünüyorum
Benim en sevdiğim örnek openbsd luna88k https://www.openbsd.org/luna88k.html
Gerçekten kaç kullanıcısı var hiç bilmiyorum. Muhtemelen yalnızca Japonya’da satılmış oldukça nadir bir makineydi ve eğer kullanıcıları varsa çoğu da muhtemelen Japonya’dadır; benim görüş alanımın dışında olduğu için bana sanki tek kullanıcı portu yapan kişiymiş gibi geliyor
Ama buna rağmen her sürümde, resmî duyurudan birkaç hafta sonra ormandan çıkıp gelmiş gibi luna88k dosyalarını ve paketlerini yüklüyor
Belki de gerçek bir luna88k üzerinde derlediği için uzun sürüyordur; her durumda bu kadarı OpenBSD’nin resmî donanım platformu olarak kalması için yeterli
Ben şahsen bir luna88k sahibi olmak istemem ama bunu sürekli çalışır halde tutan kişiye gerçekten saygı duyuyorum
SDL sanki yeniden Loki dönemindeki köklerine dönüyor gibi
Harika
Neden mi? Sebebini bilmesem de havalıysa yeter diyorum
Internet Archive’da görüldüğü gibi klavye ve fare varsa, 90’ların ortasındaki AAA düzeyinde karmaşıklığa kadar olan şeyler pratikte neredeyse her yerde çalıştırılabiliyor
Tomb Raider, Command & Conquer, Quake gibi oyunlar buna örnek ve sadece çalışan bir platform istiyorsanız oldukça cazip
Buna bir de SDL eklenince iş çok daha kolaylaşıyor
Gerçekten sevindim
Bu beni çok mutlu ediyor