selamlar... esmaeild hic cekinmeden full sorulari sor abi. skate de saolsun cevaplari yetistirmeye calisiyor ve bundan cok memnun olduguna da eminim
text ortami azizligine gelmeyin diye soyluyorum. sorulari cevaplamaya calisayim:
1- gasp mekanizmasi nasil calisiyor:
VIC 6510 dan DMA satirlarinda busi almak icin BA isimli pinini kullaniyor (AEC degil). Bu pin 6510 uzerinde RDY pinine bagli. VIC BA sinyalini low yaptiktan 3 cycle sonra AEC'i bir sure hep low tutarak (normalde aec her cycle'in yarisinda low yarisinda hi olarak 6510un bellek erisimini her cycle da yarim cycle izin verir) 6510u durdurur. Neden 3 cycle sonra ? detayli cevap kursun ilerilerinde gelecek.
2- 6510 bellege erisemedigi yarimlarda ne yapiyor:
6510 icin yarim diye bir kavram yok. onun icindeki islemleri hangi hizda yaptigini bilmiyoruz. bildigimiz tek zaman birimi cycle. bir komutun 1. cycleinda sunu yapiyor ikinci cycleinda bunu yapiyor diyebiliriz. Fakat bu cycledaki zamanin ne kadarini kullaniyor bilemeyiz. commodoreun spesify ettigi tek sey belli islemlerin bir cycledan az zamanda olacagi.
cyclelarin her yarisinda ayri ayri islem yapabilmek icin cipte ozel olarak ayri elemanlar gerekirdi. (low to hi ve hi to low transitionlari detect etmek icin) bu ozellik VICe konulmus. bu sayede sistemde 1 mhz lik tek clock sinyali ile bir adet 1 mhz de calisan cip ile bir adet 2 mhz de calisan cip calistirilmis oluyor
3- sei ile interrupt flagını 1 olarak set ettiğimizde artık 6510 un kesinti isteklerine cevap vermiyeceğini belirttiğiniz halde extradan cia neden kesinti isteği gönderme demek zorunda kalıyoruz?
sei aslinda ciaden gelen IRQlari da bloklar. biz sei ile sadece irq pointerlarini ayarlarken kendimizi koruyoruz. 10-15 komut sonra cli ile irqlari tekrar salacagiz. Bu noktadan sonra CIAdan bir timer yuzunden irq gelirse, bizim irq rutinimize atlayacak. biz ise rutinimizin sadece VIC belli bir satira geldiginde atlanacagini dusunerek tasarladik. Bu yuzden isler karisacak.
Eger CIA interrpuptlarini disable etmezsek (ki bazi durumlarda gerekebilir) o zaman IRQ rutinimizde ilk basta "hmm bu irq istegi CIA dan mi yoksa VIC ten mi geldi" diye kontrol etmemiz gerekiyor. biz kendimizi bu dertten kurtarmak icin cogu zaman CIA interruptlarini kapatiyoruz.
4- hocam DMA satırları olmazsa 6510 un kazancı 1 sayfada belleğe erişim yönünden 25 * 40 = 1000 cycle olmaz mı.
evet skate in hesapladigi gibi bir sayfada 19656 cycledan DMA satirlari yuzunden 1000 tanesini kullanamiyoruz. bu satirlar olmazsa o 1000 cycle'i da kullanabiliriz
5- drive coding nasil oluyor?
c64 ile 1541 default olarak iec protokolu adli bir protokol ile haberlesiyor. bu protokolde talk listen gibi komutlar mevcut. normalde load yaparken c64 1541e talk diyor (bi takim baska argumanlarla beraber) 1541 de dosyanin baytlarinin gonderiyor. save ise listen islemi ile yapiliyor.
bu protokolde bu cok kulanilan komutlarin disinda bir de memread memwrite ve mem execute komutlari da var.
Bu komutlarla c64 1541in bellegine yazma okuma yapabiliyor. ayrica 1541e onun bellegindeki bir adresten baslayan programi calistirmasini da boylece soyleyebiliyoruz.
Zaten fastloaderlar da bu sekilde calisiyor. c64 memwrite ile once 1541 bellegine bir kod gonderiyor. ardindan memexecute ile o kodu calistirtiyor. 1541 artik tamamen o kodun yonetimine giriyor. bu sayede iecten daha hizli custom bir protokol ile 1541 ve c64 haberlestirilerek fastloaderlar irq loaderlar vs yapiliyor.
drive coding (yani efektin bi bolumunun 1541e yaptirilmasi) da boyle oluyor. c64 1541e yaptirmak istedigi seyi yapan kodu 1541e gonderiyor. ve ardindan mem execute yaptiriyor. sonra da aralarinda belirledikleri bir protokolle, c64 o rutine input datalarini 1541e gonderiyor. bir sure sonra da sonuclari geri alip kullaniyor