Son retrojen pikniğinde matahari'nin bahsettiği, spectrum'un üst hafıza bloklarının gecikmesiz olduğu durumunu tartışırken kafamız karışmıştı. Hatırlamayanlar için özetleyeyim.
Bora'nın bahsettiği şekilde Spectrumda CPU, RAM ve ULA'yı birbirine bağlayan tek bir adres kanalı bulunuyor. Bellek 16K'lık 4 bank'a ayrılmış durumda. Bu banklardan ikinci 16k'lık olanı, ekranda çizilecek bitmap verisini sakladığı için, ULA tarafından ara ara kullanılıyor. Eğer işlemekte olan program bu iki numaralı bölgeden okuma/yazma yapmak isterse, ve o sırada ULA ekranı çizmek için aynı anda o bellek bölgesini okuması gerekiyorsa, CPU durduruluyor. Çünkü ekranın çizimi bekletilemeyeceği için önceliği ULA alıyor. Bu bekleme ULA'nın erişim düzenine göre belirli bir desene göre uzayıp kısalıyor.
Buraya kadar sorun yok. Fakat, eğer programınız ekran işlemleri yapmıyorsa, ve ekran belleğinin bulunduğu ram bankında çalışmıyorsa, bu durumda aslında ULA ile bir çakışma yaşamadığı için ula ram'den rahatça okumasını yapıyor, CPU da işlerine ULA ile çekişmeden devam edebiliyor.
Piknik sırasında eğer tek bir adress bus'ı varsa, o zaman cpu nasıl üst ram'e kesintisiz erişiyor diye bir soru geldi ve aslında hiçbirimiz cevaplayamadık. Ben de sabah sabah aklıma gelince bunu araştırmaya girmeden önce bir deneme yapmaya karar verdim.
Bu programda hafızanın iki ayrı bölgesinde, yani ula ile paylaşılan alt ram ve paylaşılmayan üst ramde aynı kod çalışıyor. Kod 1500 byte'lık bir alanı LDIR ile kopyalıyor.
1. Lacivert renk paylaşımlı ram'de çalışıp paylaşımlı rami kopyalıyor. (en yavaş)
2. Kırmızı renk üst ramde çalışıp, paylaşımlı rami kopyalıyor.
3. Yeşil renk paylaşımlı ram'de çalışıp, üst ram'i kopyalıyor.
4. Sarı renk üst ram'de çalışıp, üst ram'i kopyalıyor ve alt ram'e hiç dokunmuyor. (en hızlı)
Görüldüğü üzere sarı en kısa zamanda tamamlanıyor, lacivert ise neredeyse %20 daha fazla zaman alıyor. Bu kodun büyük kısmının ULA'nın ram'e erişmediği dolayısı ile hiçbir gecikmenin olmadığı border alanında işlediğini eklemem gerekiyor. Tahminen kopyalamanın %70'i bu border çizimi süresince tamamlanıyordur.
SONUÇ:
Evet, en alt rom ve üst iki bank gecikmeye uğramıyor ve görünüşe göre tam hızda çalışabiliyor. Bu matahari'nin "Aslında 2 numaralı bank yavaş değil, o normal şekilde çalışıyor, spectrumdaki sihirbazlık üst 32kb'ın hızlı çalışması" şeklinde bahsettiği konu biraz aydınlanmış oluyor.
Buradaki detayları araştırmadım. Daha önce bu gecikme mevzuu ile ciddi şekilde boğuştuğum için, ula'nın cpu'yu durdurmasının bir komutun tüm parçalarına da uygulanmadığını da öğrenmiştim.
Örneğin
RET komutu için ram erişimi şu şekilde oluyor:
1. pc okunur:4ts
2. sp güncellenir:3ts
3. sp+1 güncellenir:3ts
Toplam:11ts
Düşünün ki PC gecikmeli bellekte, SP ise üst bellekte bulunsun. Bu durumda RET komutu çalışırken 1 numaralı basamakta ULA ile çakışıyor olabilir, fakat komutun diğer kısımlarında gecikme yaşamadan tamamlanacaktır.
Var sayalım ki 1numaralı basamakta ULA erişim dizisinin birinci evresinde, dolayısı ile 6ts bekleme yaptırıyor. Bu durumda 1 numaralı basamak 4ts+6ts=10ts tutacak, diğer (3+3=6ts) basamaklarla birlikte RET komutu 16ts vakit alacak.
Varsayalım ki Stack Pointer da gecikmeli belleğe denk gelmiş ve ULA tam o anda ekranı çizmek istiyor. Bu durumda şöyle bir tablo ile göstereyim:
RET komutu, PC ve SP gecikmeli bellekte olduğunda uygulaması:
cycle ula program
1 6 ->>PC:4ts bekliyor
2 5 *
3 4 *
4 3 *
5 2 *
6 1 *
7 0 **PC:4ts burada uygulanacak
8 0 +2
9 6 +3
10 5 +4 PC fetch edildi.
11 4 ->>SP:3 bekliyor
12 3 *
13 2 *
14 1 *
15 0 **SP:3 burada uygulanacak
16 0 +2
17 6 +3 SP üst byte okundu
18 5 ->>SP+1:3 bekliyor
19 4 *
20 3 *
21 2 *
22 1 *
23 0 **SP+1:3 burada uygulanacak
24 0 +2
25 6 +3 SP alt byte okundu -RET TAMAMLANDI-
Normalde 11ts tutması gereken RET komutu 25 ts tuttu.
Bu bağlamda ula ram'i okurken bile üst bellekte gecikme yaşanmıyor olmasının bu her 8ts'de 6 ts'lik aralıkta bir erişim yetiyor, aslında zaman zaman ULA da bekliyor, gibi bir mantığı olabilir.
Bu konu bir sır değil elbette, donanım kısmı the ULA Book'da yazıyordur, bir ara onu kütüphaneden indirip biraz okuma yapmak gerekiyor.
Bu arada
https://scratchpad.fandom.com/wiki/Contended_memory adresinde gecikmenin nasıl uygulandığı hakkında bilgi de mevcut.
Dikkat ekteki gif'i görebilmeniz için bilgisayarınızın 50fps gif oynatabilmesi gerekmektedir.
yanıp sönen 4 rengi neredeyse aynı anda görebilirsiniz.