Gönderen Konu: 6502 makine diline meraklı olan?  (Okunma sayısı 29623 defa)

0 Üye ve 1 Ziyaretçi konuyu incelemekte.

Çevrimdışı retromaster

  • Retromanik
  • *****
  • İleti: 7
Ynt: 6502 makine diline meraklı olan?
« Yanıtla #30 : 15 Ocak 2014, 14:53:34 »
Yani burada bilgisayar ne zaman derse TV o zaman v-sync yapar.

Burada "bilgisayar" dan ne kastedildiğine bir açıklama getirmek lazım. TV, V-Sync'i video chip'i (ULA) ne zaman VSync yap derse o zaman yapar. Genellikle video chiplerinin içinde satır ve pixel'leri sayan counter'lar bulunur, VSync, HSync gibi sinyaller bunların üzerinden oluşturulur. Bu counter'lar da CPU'dan bağımsız çalışır genellikle (bilgisayardan kastın CPU olmadığını söyleme gereği hissetmem bu yüzden). Benim bildiğim kadarıyla, Oric'teki sorun, video chip'inin VSync çıkışının CPU'ya bir şekilde (interrupt ya da başka şekilde) bağlı olmamasından kaynaklanıyor. En ideali interrupt olması olurdu tabii, ama bir adresten VSync durumu okunabiliyorsa bununla da busy-wait vs. yapılarak senkronizasyon sağlanabilir.

Ayar dügmesi fikri esasında güzel, ama ancak sistemde birebir refresh rate ile aynı aralıkta çalışabilen bir timer varsa iş görür (Oric'te var mı emin değilim). Tam olarak 50Hz'de çalışabilen bir timer yoksa o zaman o senkronizasyon da zaman içinde bozulacaktır. Timer olmasa da teoride bu çözüm çalışır ama pratikte o frame aralığına (20ms) denk gelen cycle sayısını tam tutturabilen kod yazmak imkansıza yakın olur sanırım, hele 6502'de.

Oric'teki VSync hack'i detaylı incelemedim ama şöyle çalıştığını tahmin ediyorum. Muhtemelen CPU tape girişini direkt olarak okuyabiliyor. Video portundaki Sync çıkışı alınıp tape girişine verilirse CPU her frame'i çizip işini bitirdikten sonra sürekli olarak tape girişinden aldığı Sync sinyalini izleyip (busy-wait) VSync perioduna girildiğini anlayabilir. Tabii tam emin olmak için hack'i incelemek lazım dediğim gibi.

Çevrimdışı nightlord

  • RAAT
  • Tedavideki Retromanik
  • *
  • İleti: 389
    • Night Network
Ynt: 6502 makine diline meraklı olan?
« Yanıtla #31 : 15 Ocak 2014, 19:31:45 »
Yani burada bilgisayar ne zaman derse TV o zaman v-sync yapar.

Burada "bilgisayar" dan ne kastedildiğine bir açıklama getirmek lazım. TV, V-Sync'i video chip'i (ULA) ne zaman VSync yap derse o zaman yapar. Genellikle video chiplerinin içinde satır ve pixel'leri sayan counter'lar bulunur, VSync, HSync gibi sinyaller bunların üzerinden oluşturulur. Bu counter'lar da CPU'dan bağımsız çalışır genellikle (bilgisayardan kastın CPU olmadığını söyleme gereği hissetmem bu yüzden). Benim bildiğim kadarıyla, Oric'teki sorun, video chip'inin VSync çıkışının CPU'ya bir şekilde (interrupt ya da başka şekilde) bağlı olmamasından kaynaklanıyor. En ideali interrupt olması olurdu tabii, ama bir adresten VSync durumu okunabiliyorsa bununla da busy-wait vs. yapılarak senkronizasyon sağlanabilir.

Burada ben de özellikle "bilgisayar" dedim (CPU demedim). Yani v-sync sinyali bilgisayarda bir yerlerden geliyor olduğu için. Oric'te video sinyali üreten çip ile CPU'nun arasında herhangi bir senkronizasyon mekanizması (ne hardware irq bağlantısı ne de CPU tarafından okunabilir bir raster veya v-sync register) olmadığı daha önceki postlarda geçtiği için daha detaya inmemiştim.

Burada aşağıdaki varsayımı yaptım. Bu vesileyle bir hardware gurusunu yakalamışken bu varsayımı bir senin kontrolünden geçireyim :)

Video çipindeki counter'lar CPU'dan bağımsız çalışsa da aynı clock sinyali ile sürülüyorlar, (tam olarak değil tabi, bu sinyal mesela C-64'te 8'e bölünür vs. ama yine de senkronizedirler). Keza timer'lar da çoğu zaman sistem clock ile sayan bir mod destekler (yine C-64'te CIA timer'ları mesela). Dolayısıyla bu makinelerde bahsettiğin bir frame aralığının tam olarak kaç cycle olduğu net şekilde bilinir. Hatta bir satırın da kaç cycle olduğu tam olarak bilinir.

Bu yüzden bilgisayar ilk açıldığında video çipindeki counterlar eğer deterministik bir değerden saymaya başlıyorsa, CPU dan bağımsız bile olsalar, eğer cycle'ları reset anından beri sayan bir timer olsaydı (ve bu timer frame time kadar cycle'da bir resetlenseydi) o zaman v sync hep o timer'ın belli bir değerine tekabül ederdi. (ki mesela C-64 de aynen böyle bir timer vardır, açılıştan itibaren bir frame'de bir kere irq trigger eder. (bu timer tam reset anında saymaya başlamaz tabi. yani bu bir hw feature değil ama sayım boot rom tarafından deterministik bir zamanda yani reset anından n cycle sonra başlatılır ama buradaki tartışma açısından bu aynı kapıya çıkıyor) )

Yani eğer Oric de boot prosedürünün bir parçası olarak timer'ını başlatıyor olsaydı, Oric yazılımları timer'dan deterministik bir değeri okunduğunda v-sync zamanı olduğunu bilebilirdi. Bu boot zamanında olmadığı için Oric yazılımlarının timer ile yapabilecekleri herşey video çipindeki sayaçlara göre öngörülemez bir noktada kalıyor.

Bu varsayımlar dizisinde atladığım veya yanlış çıkarımladığım birşey varsa düzelt abi :)

Çevrimdışı retromaster

  • Retromanik
  • *****
  • İleti: 7
Ynt: 6502 makine diline meraklı olan?
« Yanıtla #32 : 15 Ocak 2014, 20:03:07 »
Burada ben de özellikle "bilgisayar" dedim (CPU demedim).

Ben de tahmin ettim zaten o şekilde düşündüğünü ama thread içinde yanlış anlama olmasın öyle bir detaya inme gereksinimi hissettim.


Burada aşağıdaki varsayımı yaptım.

Vardığın sonuçta benim görebildiğim kadarıyla temelde herhangi bir yanlış yok. Ben de zaten "refresh rate ile aynı aralıkta çalışabilen bir timer" derken bahsettiğin durumu kastetmiştim.

Ama varsayımlarının arasında doğru olmama ihtimali olan bir tanesi var, o da video çipindeki counter'ların deterministik olarak saymaya başlamaları olayı. Bu da şöyle olabilir, Oric'in Reset hattı ULA'daki Vertical Line sayacına bağlanmamıştır, reset'te counter undefined bir değerde geliyordur. Sorun değil, çünkü ilk değeri ne olursa olsun kısa sürede sayaç overflow olup sıfıra dönecek ve ondan sonra normal işlevini devam ettirecek, bir daha da resetlenmesine zaten gerek yok. Fakat bu da CPU ile senkronizasyonun kurulamaması anlamına gelir yine.

Peki neden bağlanmamış olabilir Reset hattı? Tabii ki hardware'i basitleştirmek için. Özellikle eski çiplerde acaip trickler kullanılmış basitleştirme amaçlı. Mesela Atari TIA'da bu VSYNC HSYNC sayacı normal counter bile değildir, LFSR (Linear Feedback Shift Register) denen bir yapıdır, aynı görevi görür ama 1, 2, 3 diye saymaz, onun yerine karışık ama deterministik bir sequence'da gider, fakat hardware olarak çok daha basittir normal counter'a göre.

Bu arada, Oric'te gerçekten durum nedir, Reset bağlı mıdır, değil midir, onu bilmiyorum, tahminen ancak uygun şekilde kod yazarak ya da osiloskopla sinyallere bakılarak anlaşılır, ben sadece varsayımların fail olabileceği bir duruma teorik bir örnek verdim.

Çevrimdışı nightlord

  • RAAT
  • Tedavideki Retromanik
  • *
  • İleti: 389
    • Night Network
Ynt: 6502 makine diline meraklı olan?
« Yanıtla #33 : 15 Ocak 2014, 20:46:04 »
vay anasini sayin seyirciler. super bir data oldu bu retromaster. Benim gibi donanım tasarımına en son 348, 445, 446'da (14 yıl olmuş:( ) bakmış biri için tabi böyle tricky optimizasyonlar kırk yıl akla gelmeyecek şeyler. Ben hep bu grafik çiplerini sayaç kullanıyor varsıyordum. LFSR'ye baktim. hakkaten counter'dan çok daha basit (XOR'lusu mesela). Ama bu sefer bu sayaçları kullanarak memory adresi elde edip memory tarama olayı zorlaşıyor olmalı. Mesela bahsettiğin Atari'de ben belleğe bitmap dizmek istersem satırlar sütünlar saçma sapan yerlere mi diziyorum? yoksa böyle lookup table falan mı yapıyorlar? (donanımda demek istiyorum)

Çevrimdışı retromaster

  • Retromanik
  • *****
  • İleti: 7
Ynt: 6502 makine diline meraklı olan?
« Yanıtla #34 : 15 Ocak 2014, 21:20:37 »
Ama bu sefer bu sayaçları kullanarak memory adresi elde edip memory tarama olayı zorlaşıyor olmalı. Mesela bahsettiğin Atari'de ben belleğe bitmap dizmek istersem satırlar sütünlar saçma sapan yerlere mi diziyorum?

Atari TIA'nın durumu çok özel esasında, çünkü o 2600'de video RAM yok :). CPU ile TIA tamamen senkronize çalışıyor. Playfield TIA içinde 20-bit'lik bir register'dan oluşuyor, onu da her satırda horizontal retrace sırasında CPU update ediyor, bu sayede farklı satırlarda farklı görüntü elde ediliyor. Aynı şey sprite'lar için de geçerli, onlar da 8-bit'lik register'lardan ibaret.

Edit: Bu arada yukarıda VSYNC sayacı demişim, ATARI TIA ile uğraşalı çok zaman geçtiği için aklım karıştı sanırım, HSYNC sayacı olması lazımdı. TIA'da zaten VSYNC sayacı yok, satır sayma işini de CPU hallediyor, VSYNC sinyali doğru zamanda bir register'a yazılarak oluşturuluyor.

Çevrimdışı Alco

  • Yönetici
  • Özgür Retrocu
  • *
  • İleti: 2133
  • "Kahraman olmak, dürüst olmaktan kolaydır" Luigi P
    • Sizin Amstrad
Ynt: 6502 makine diline meraklı olan?
« Yanıtla #35 : 17 Ocak 2014, 17:47:41 »
Kaybolacaksa da bu başlık altında kaybolsun ki bulması kolay olsun :)

6502 emulatorü nasıl yazdığını anlatmış.

A Nicely Written 6502 Emulator in Common Lisp [PDF]