1982 yapımı ZX Spectrum'a masaüstü: 48 kilobayta sığan pencereli arayüz
Z80 assembly ile yazılan ZXdesk, üst üste binen pencereleri ve uygulamaları 48 kilobayta sığdırıyor. Projenin asıl değeri ise otuz yıllık bir hız kabulünü ölçerek çürütmesi.
Bir pencereyi fareyle tutup ekranda gezdirmek bugün kimsenin düşünmediği bir şey. 1982 yapımı bir ZX Spectrum'da ise bu iş, saniyede elli kez tekrarlanan ve tam 69.888 saat darbesi süren tek bir ekran karesinin içine sığdırılmak zorunda. ZXdesk adlı proje, tamamı Z80 assembly ile yazılmış bir masaüstü arayüzünü o kareye sığdırmayı başarmış: üst üste binen pencereler, açılır menüler, not defteri, saat, takvim ve iki bölmeli dosya yöneticisi — hepsi 48 kilobaytın içinde.
Projeyi mindbox77 takma adıyla yazan geliştirici, kodu MIT lisansıyla GitHub'da yayımladı; haber ilk kez donanım sitesi Hackaday'de duyuruldu. Ama projeyi ilginç kılan, çalışan bir masaüstünün varlığından çok geliştiricinin deponun içine bıraktığı şey: ölçüm defteri. Depodaki uzun teknik notlar, otuz yıldır Spectrum camiasında doğru bilinen birkaç rakamın aslında yanlış olduğunu, gerçek makinede ölçerek gösteriyor.
-
Yemek tarifleri
Malzeme listesi, adım adım yapılış, süre ve porsiyon bilgisiyle. Çorbadan tatlıya kategoriye göre gez ya da aradığını doğrudan ara.
Tariflere bak → -
Nasıl yapılır rehberleri
Telefon ayarlarından resmî işlemlere, hesap güvenliğinden günlük hayattaki küçük sorunlara: numaralı adımlar ve tahmini süreyle anlatılmış rehberler.
Rehberleri gör → -
Program arşivi
Tarayıcılar, güvenlik araçları, ofis ve medya yazılımları. Her kayıtta ne işe yaradığı, sürümü ve indirme bağlantısı.
Programlara göz at → -
Sesli ve görüntülü sohbet
Odalarda grup görüntülü sohbet, birebir sesli arama ve canlı yayın. Tarayıcıdan çalışır — eklenti, uygulama ya da kurulum gerekmez.
Odalara gir →
Sığdırılacak yer: 48 kilobayt ve hile yapan bir video yongası
Sinclair'in 1982'de piyasaya sürdüğü ZX Spectrum, 3,5 MHz hızında bir Z80 işlemci, 48 kilobayt bellek ve 256'ya 192 piksellik tek bitlik bir ekran taşıyordu. "Tek bit" şu demek: her piksel ya açık ya kapalı. Renk bilgisi piksele değil, 8'e 8'lik hücrelere veriliyordu ve bir hücre aynı anda yalnız iki renk taşıyabiliyordu. Spectrum'un efsanevi attribute clash (renk çakışması) sorunu buradan gelir: iki farklı renkteki nesne aynı hücreye düştüğünde biri ötekinin rengini bozar.
İkinci sorun daha sinsi. Ekran belleği, makinenin alt 16 kilobaytında duruyor ve görüntüyü çizen ULA yongası ekranı boyarken işlemciden çevrim çalıyor. Yani kodun nerede durduğu, ne kadar hızlı çalıştığını değiştiriyor.
ZXdesk bu iki sınırı aşmıyor — etrafından dolaşıyor. Geliştirici belleği ikiye bölmüş: 0x6000 ile 0x727C arası "yavaş bölge", yani ULA'nın çevrim çaldığı alan. Oradaki kuralı tek cümleyle yazmış: bu bölgedeki hiçbir kod bir kare içinde çalışmayacak. Sürükleme yolu, imleç yolu ve kesme işleyicisinin tamamı 0x8000 üzerindeki "hızlı bölge"de duruyor.
Folklor %50 diyordu, makine %14,7 dedi
Projenin bütün hız bütçesi, ekrana yazmanın yüzde 50 pahalıya geldiği varsayımıyla kurulmuş. Bu rakam Spectrum camiasında yıllardır dolaşan bir kabul. Geliştirici 1.024 baytlık bir dolguyu karenin farklı noktalarına kaydırarak ölçtüğünde başka bir sonuç çıkmış: en kötü durumda 13.473 saat darbesi, kenarlıktaki temiz ölçüm ise 11.744. Aradaki fark yüzde 14,7.
Bu, "bütçelerim üçte bir fazla temkinliymiş" demek. Depoda buna benzer birkaç ders daha var; hepsi aynı yöntemle, makinenin kendi saatine karşı ölçülerek bulunmuş.
| Bir kare | 69.888 saat darbesi (48K), 70.908 (128K) |
|---|---|
| Ekran yazma cezası | %14,7 (folklordaki değer %50) |
| Pencere çizimi | 71.274 darbe; yarısı yalnız 27 karakterlik metin |
| Sürükleme, önce | 96.010 darbe — bir karenin %137'si, 25 Hz |
| Sürükleme, sonra | 59.858 darbe, kare içinde, 50 Hz |
| Yığın (heap) | 8.112 bayt |
Sürüklemeyi kareye sığdıran dört değişiklikten en büyüğü, pencereyi ekran dışı bir arabellekte bir kez kurup her karede blok halinde kopyalamak olmuş: 71.274 darbelik yeniden çizim 26.048'e inmiş. Pahalı olan taşımak değil, kurmakmış. Geliştiricinin "asıl sorun budur" diye baktığı dolgular ise toplam maliyetin yalnız beşte biri çıkmış — bir hafta boyunca yanlış yeri optimize etmekten ölçüm sayesinde kurtulduğunu yazıyor.

Kesme ertelenmez, kaybolur
Deponun en öğretici bulgusu bu. Spectrum'un hızlı ekran doldurma yöntemi, yığın göstericisi SP'yi ekran belleğinin içinde yürüterek çalışır; bu sırada SP artık bir yığın olmadığı için kod kesmeleri kapatır. Yaygın kanı, kapalı kesmenin yalnız geciktiği yönünde. Geliştiricinin ölçtüğü şey bunun doğru olmadığı: Spectrum kesme sinyalini yalnız 32 saat darbesi boyunca tutup geri çekiyor. O 32 darbeyi kapalı geçiren bir kod, kesmeyi ertelemiyor — yok ediyor.
Bulgu önce bir tuhaflık olarak görülmüş: kare sınırını açıkça geçen bir dolgu, geçmediğini bildirmiş. Sonra doğrudan ölçülmüş — bir dolgu rutininde 500 komut sınırının 458'inde, ötekinde 752'nin 710'unda kesme reddediliyormuş.
Akla gelen çözüm, satır aralarında kesmeleri kısa süre açmak. Geliştirici bunun işe yaramadığını yazıyor, çünkü kesme bekleyen bir yerde durmuyor, gitmiş oluyor; dar bir açıklık onu ancak otuz satırda bir yakalıyor. Çalışan çözüm daha tuhaf: dolgu zinciri satırdan bir itme kısa tutuluyor, en soldaki iki bayt "borçlanıyor" ve bir tur sonra, SP artık oraya erişemeyecek konuma geçtiğinde ödeniyor. Böylece kesmeler baştan sona açık kalabiliyor. Bedeli satır başına yaklaşık 48 darbe; karşılığında kesme kaybı sıfıra iniyor.
Bölme işlemi olmayan bir makinede takvim
Aynı zorlama takvimde de görülüyor. Z80'de bölme komutu yok, oysa haftanın gününü bulmanın bilinen yöntemleri 4, 100 ve 400'e bölmek ister. ZXdesk bunun yerine 1 Ocak 1980'den — bir salı gününden — ileri sayıyor. Görüntüleyebildiği 1.200 ayın tamamı Python'un takvim kitaplığına karşı denetlenmiş.
Saat de benzer bir inceliğe sahip. Spectrum'un kesme hızı tam 50 Hz değil, 50,0801 Hz. Her elli kesmede bir saniye saymak günde iki dakika on sekiz saniye kaydırıyor. ZXdesk bunun yerine saniyeyi kimi zaman elli bir kesmeden sayıyor; bir saatlik ölçümde sapma günde yarım saniyeye iniyor.
Neyin bittiği, neyin bitmediği
ZXdesk bir işletim sistemi değil. Temel 48K Spectrum'da disk sürücüsü olmadığı için uygulamalar ayrı ayrı yüklenmiyor, arayüzün içine gömülü geliyor; yani çok görevli bir çekirdek yok, bir masaüstü kabuğu var. 128K makinede fazladan bellek bankaları RAM disk olarak kullanılıyor, kaset yüklemesi makinenin kendi ROM yordamıyla yapılıyor ve esxDOS desteği eylül 2026'da gerçek bir kart görüntüsüyle sınanıp çalışır duruma gelmiş.
Geliştirici eksikleri de yazmış: arkada kalan bir saat penceresi öne getirilene kadar son saatinde donuyor, çünkü pencere arabellekleri ekrandan kopyalanıyor. Not defterinde metin seçme, pano, geri alma ve satır kaydırma yok. Fare varlığını anlama yöntemi hâlâ bir tahmin ve faresiz makinesi olmadığı için sınayamıyor. Renk çakışmasının kendisi de çözülmüş değil: masaüstü, hücre sınırlarını bilerek çizen dolgularla o sınırla uyum içinde yaşıyor.
Sıradaki soru ZX Spectrum Next. Geliştirici 48K sistemi baştan taşınabilir olacak şekilde kurmuş ve depolama, uygulama modeli, ayarlar katmanı taşınmış. Taşınmayan tek şey pencere modeli olmuş: 28 MHz'lik, donanım katmanları ve sprite'ları olan Next'te pencereleri üst üste bindirmek yerine döşemek daha doğru geldiği için üst üste binmeyi çözen bütün makine orada işsiz kalıyor. Next sürümü ayrı bir depo olarak duruyor ve yayımlanmadı — geliştirici elinde Next olmadığı için, çalıştırmadığı kodu yayımlamama kuralına uyarak makinenin gelmesini bekliyor.
Fotoğraf: Bill Bertram, CC BY-SA 2.5, Wikimedia Commons