Bu sayfadaki yazılar
Sayfanın metni
Sayfa 48
Por
Murat Şenyüz & Uğur Özyılmazel
MAKİNE DİLİNİN PÜF NOKTALARI
Bu ay da köşemizden hepinize selamlar. Umarım geçen ay anlattıklarımızı anlamış ve basit uygulamalara geçmişsinizdir. Çünkü şimdi interrupt'ı daha detaylı ve daha profesyonel kullanmayı anlatacağız. Biraz sonra aşağıda vereceğimiz program örneği ile otomatik hız kontrolü bir interrupt'ın nasıl kurulduğunu ve nasıl çalıştığını göreceğiz. Daha önceki interrupt'lar gibi $0314'e low (alçak), $0315'e high (yüksek) byte'ları verdikten sonra CLI komutunu da verip interrupt'ı çalıştırmayacağız. Kullanacağımız diğer adresler $D01A, $D019, $D011, $D01E, $D01D ve gerektiği zaman $D012'dir. Burada $D011 ve $D012 raster registerini oluşturan byte'lardır. $D011'in 7. bit'i raster registerinin yüksek byte'ıdır. $D01A önleme registeridir. Değeri #$01 ise interrupt çalışabilir. $D019 ise kesinti bayrağı registeridir. Herhangi bir açık interrupt varsa 7. bit'i 1 olur. Bu teknik açıklamalarla sizi daha fazla sıkmak istemiyoruz. Çünkü biliyorsunuz yazımızın başında her şeyi pratikten anlatacağız demiştik. Şimdi de bu kuralı bozmayacağız. Zaten bu verdiğimiz adreslere koyacağınız değerler her zaman aynıdır. İşte bu ayki program örneğimiz. $4000 SEI $4004 LDA #$00 STA $0314 $4006 LDA #$11 $4008 STA $0315 $400B LDA $D011 AND #$7F $4010 STA $D011 $4013 LDA #$7F STA $D01D $4019 LDA #$00 $401B STA $D01E $401E LDA #$01 $4020 STA $D01A $4023 LDA #$00 $4026 STA $D019 $4029 LDA #$32 $402B STA $D012 $402E CLI $402F JMP $A474 Şimdi bu programın satır satır kısa bir açıklamasını yapalım. Bunun için daha önceki bilgilerinizden yararlanmanız gerekecek. Daha önceden görmüş olduğumuz klasik interrupt kuruluşu düzeni ile aynı işlemler. Interrupt high ve low byte'larının yazılması 400B - 4013 - değeri alınır 7. biti temizlenir ve değer tekrar geri yazılır. Bu işlemler sayesinde raster satırı belirlenir. Bu işlemlerin aynısını $D011 adresine $1B değeri vererek de gerçekleştirebilirsiniz. Yani; LDA #$1B STA $D011
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 49
Bu satırların ilk programdaki “AND #$7F” işleminden hiçbir farkı yoktur. Hatta ilk açılışta Commodore 64'ünüzde bu değer #$1B olduğu için vermeseniz de olur. Ancak daha önce grafik ekranı açılmış veya $D011 ile oynanmış ise programda sorun yaratabilir. 4013-401E CIA kesinti kontrol registerini ve CIA kontrol registerini ayarlar. Bahsettiğimiz bu teknik terimler sizi sıkmasın. Çünkü bu kısım her interrupt ayarlamasında aynıdır. Her programda bu değerleri vererek çalışabilirsiniz. Sadece ne işe yaradığını bilmeniz açısından anlattık. Gerekli olan değer VIC kesinti bayrağı registeri ve IRQ önleme registerine yazılır. $D019 değeri interrupt programında her zaman #$01 değerini almalıdır. Daha basit bir yolu “INC $D019” komutunu kullanmaktır. Böylece bilgisayarınız interrupt'ı çalışabilir hale sokar. Aksi takdirde raster interrupt'ında program hatasına yol açar. Bu da hiç hoşlanmadığınız bir olaya yani kilitlenmeye sebep olur. 4029-402E Raster registerinin alçak byte'ına raster satırının başlangıç noktası verilir. Yüksek byte ise $D011'in 7. bitidir. $D012'ye vereceğiniz herhangi bir değer interrupt'ın verdiğiniz çizgiden çalışmasını sağlar. Örneğin #$32 değeri verdiyseniz bu değer iç ekran ile dış ekranın birleştiği üst satırdır. Değer arttıkça raster başlangıcı aşağıya doğru kayar. $D012 ekranı çizgi çizgi tarar. 402E- Interrupt'ı başlatıp geriye dönüş. Şimdi interrupt olarak çalıştırmak istediğimiz programı yazabiliriz. Daha önce verdiğimiz programların hepsini yazabilirsiniz. Ancak $D019'a $01 değerini vermek şartıyla kullanabilirsiniz. Bu sayede interrupt'ınız gerçek hızında çalışacaktır. Örneğin bir müziği çaldırdığınızda ses ne çok hızlı ne de çok yavaş gelecektir (Tabii hız olarak). Bu konuyu da anlattıktan sonra interrupt bitmiş oldu. Artık basit programlar yazabilir. Hatta programlara müzik ve diğer efektleri katabilirsiniz. Yavaş yavaş assembler programcılığına doğru yola çıkmış olduk. Konular ilerledikçe daha iyi bir programcı olacaksınız. Şimdi de demoların ve introların vazgeçilmez efekti müzikten bahsedelim. Müzikten bahsedelim derken nasıl müzik yapıldığını anlatacak değiliz tabii ki. Sadece müziğin nasıl çaldırılacağını anlatacağız. Zaten en kolay ama en çok öğrenilmek istenen konu da budur. Müziği interrupt ile veya interrupt kullanmadan çalıştırabilirsiniz. Ancak size tavsiyem şu seviyede müziği interrupt ile kullanmanızdır. Aksi takdirde programınıza bir de zamanlama rutini eklemek zorunda kalabilirsiniz ki bu da usta programcıların bile nefret ettiği bir konudur. Müziklerin içinde player rutinleri zaten bulunduğu için size düşen sadece o rutini çalıştırmaktır. Bu işlem için bir yukarıda gösterdiğimiz gibi bir interrupt kurun. Müziği baştan başlatmak için gerekli bir adres vardır. Bu her müzik player rutini için farklıdır. Ancak genel olan bu adres "JSR” etmeden önce A'ya #$00 değeri vermektir. Yani LDA #$00 ve JSR adres. Bu rutini interrupt'ı çalıştırmadan yani CLI komutunu vermeden önce yazın. Böylece müzik hep en başta ve gerekli ayarlamaları yaparak başlayacaktır. Şimdi interrupt'da çalışacak programa gelelim. Aşağıdaki işlemleri yaparak herhangi bir müziği dinleyebilirsiniz. LDA #$04 $1102 STA $D019 JSR $MÜZİK $1108 JMP $EA31