Gönderen Konu: ZX Spectrum gecikmeli okuma/yazma testi  (Okunma sayısı 12343 defa)

0 Üye ve 1 Ziyaretçi konuyu incelemekte.

Çevrimdışı Ref

  • Yönetici
  • Özgür Retrocu
  • *
  • İleti: 2880
  • Advanced User Simulator
    • ae unutmadan
ZX Spectrum gecikmeli okuma/yazma testi
« : 30 Mayıs 2022, 11:16:55 »
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:
Kod: [Seç]
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.


 

Çevrimdışı Skate

  • RAAT
  • Retro Meraklısı
  • *
  • İleti: 172
Ynt: ZX Spectrum gecikmeli okuma/yazma testi
« Yanıtla #1 : 30 Mayıs 2022, 16:22:24 »
Güzel bir inceleme olmuş @Ref, araştırmacı ruhuna sağlık. Şu anda Dikili’den denize girerken arada cep telefonundan okudum. Eve geçince daha detaylı inceleyeceğim sonuçları.

Çevrimdışı Ref

  • Yönetici
  • Özgür Retrocu
  • *
  • İleti: 2880
  • Advanced User Simulator
    • ae unutmadan
Ynt: ZX Spectrum gecikmeli okuma/yazma testi
« Yanıtla #2 : 31 Mayıs 2022, 09:40:03 »
Güzel bir inceleme olmuş @Ref, araştırmacı ruhuna sağlık. Şu anda Dikili’den denize girerken arada cep telefonundan okudum. Eve geçince daha detaylı inceleyeceğim sonuçları.

evet manisalıların izmir sahillerine göç mevsimi başladı demekki.  45 plaka araba da lazım ama. Sonra o arabayı park bahçe kumsal demeden sokabildiğin en absürd ama kıyak yere sokmalısın.

Bak şimdi salihleraltı diye biryer var, oraya gidiyorsun, sonra gökyakut sitesini buluyorsun, orası manisalıların mekanıdır, bir manisalıyla sohbet koyuyorsun ve civardaki yazlık fiyatlarını yokluyorsun, size güzel ege ya da milenyum da gider bu arada. 2 milyon olmuş diyorlardı en son ama olmadı güzel egeden aylık kiralayın.

Çevrimdışı Skate

  • RAAT
  • Retro Meraklısı
  • *
  • İleti: 172
Ynt: ZX Spectrum gecikmeli okuma/yazma testi
« Yanıtla #3 : 31 Mayıs 2022, 14:17:53 »
Bak şimdi salihleraltı diye biryer var, oraya gidiyorsun...

Zaten Salihleraltı'ndan giriyorduk denize. Biz ilk oraya gidip, oradan bir saat mesafede ev arayarak şu anki evimizi bulduk. Bir cafe ile kanka olduk, orada takılıyoruz gün boyu.

Yazlığı ise oradan almam, zaten çok kolay ulaşabiliyorum evimden. Yazlık büyük ihtimalle Fethiye ile Kırkağaç'ın ortalarında, tahminen biraz daha Fethiye'ye yakın taraflarda ya da doğrudan Fethiye'de olacak. Plan bu.

---

Konuya geri dönecek olursak, senin test sonuçların şunu gösteriyor. Kodun nerede çalıştığı o kadar da fark etmiyor, nereye eriştiği fark ediyor. Kod contended memory'de de çalışsa contended memory'e access etmediği sürece execution minör derecede etkileniyor. Ancak sürekli contended memory'e erişim söz konusu olduğunda daha majör bir fark oluşuyor.

Bu da şunu gösteriyor. 48k modellerde 32k dolduğunda kalan kodu 16k'lık bölgede bir yerlere koymaktan o kadar da kaçınmamak lazım. Ancak o kodu video/color memory'e access etmeyen kod parçalarından seçmemiz yeterli.

Gel gör ki video/color memory access'ten kaçış yok. Yani kod nerede çalışırsa çalışsın, mutlaka contended memory bizi tırmalayacak. Tek istisnası sadece müzik çalan uygulamalar olsa gerek.

Çevrimdışı hades

  • RAAT
  • Retro Meraklısı
  • *
  • İleti: 179
Ynt: ZX Spectrum gecikmeli okuma/yazma testi
« Yanıtla #4 : 31 Mayıs 2022, 19:04:38 »
En güzeli üst 32K ya dışarıdan takılan çoklu bank sram mod yapmak. Bank seçme ve stack 16K lık kısımda olacak.

Çevrimdışı Ref

  • Yönetici
  • Özgür Retrocu
  • *
  • İleti: 2880
  • Advanced User Simulator
    • ae unutmadan
Ynt: ZX Spectrum gecikmeli okuma/yazma testi
« Yanıtla #5 : 13 Haziran 2022, 23:49:42 »
En güzeli üst 32K ya dışarıdan takılan çoklu bank sram mod yapmak. Bank seçme ve stack 16K lık kısımda olacak.

O mümkün olmayabilir. En azından zx spectrum rom kartuşlarının 16K ram ile sınırlı olduğunu biliyorum, ama neden öyleydi unuttum şimdi. orda bir donanımsal engel olabilir.