C64 için Püf Noktaları
Retro bilgisayarPüf Noktaları
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
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
TST
BUTU STANEL Tel: (1) 550 12 54
İşte bu kısa ve basit program sizin işinizi görecektir interrupt'ın içinde müziğin player rutinine dallanmanız yani “JSR” etmeniz yeterlidir. Piyasada en çok kullanılan player rutini $1800 ile ayarlamaları yapılan $1806 ile çaldırılan müziklerdir. Bunun yanısıra $1000 ve $1003 ikilisi de yaygındır. Biraz önce bir zamanlama rutini yazmanız gerektiğinden bahsettik. Hazır sırası gelmişken bu konuyu da anlatalım da daha sonra dergiye zamanlama nedir? diye binlerce mektup gelmesin. Bazen yazdığınız program çok hızlı bir şekilde çalışır. Yapmanız gereken rutinin yavaş çalışmasını sağlamaktır. İşte zamanlama dediğimiz olay bu noktada karşımıza çıkıyor. Esasen bilgisayarı hızlandırıp yavaşlattığımız falan yok. Sadece biraz fazla işlem yaptırarak hızını azaltıyoruz. Bunu da programa en az zarar vermesi bakımından hallediyoruz. Böylece bilgisayar belli bir yere geldiğinde (döngünün bulunduğu yere) kendi kendine saymaya başlıyor. Bu sayma işlemi sizin belirttiğiniz zamana kadar yaklaşık 1.5 MHz'lik bir hızla sürüyor. Yine pratikte olayı kavramak açısından küçük bir program örneği ile bu konuyu anlatacağız. İlk önce basit ve kısa süreli döngülere değinelim
$3000 LDX # değeri ver
$3002 1NX X'i bir arttır.
$3003 CPX # X'in SFD değerine ulaşıp ulaşmadığ-
nı kontrol et,
$3005 BNE Ulaşana kadar $3002
$3007 LDA # $00 A'yı sıfırla
$3009 STA $DO20 border rengini
$300C STA $DO21 Paper rengini
s300F RTS Geri dön
Bu rutin X'i birer birer arattırıp # SFD aeğerine ka-
dar ulaşmasını sağladı. Buradaki # $FD değerini is-
tediğiniz gibi değiştirerek farklı zamanlar elde ede-
bilirsiniz. Bu işlemleri yapması bilgisayarın oldukça az
$00 yap $00 yap zamanını aldı. X = $FD olunca ekran renklerini siyah yaptık. Bu da bu zaman hakkında az da olsa bir bilgi sahibi olmanızı sağlar. Gelelim aletimizi daha uzun süreli meşgul edecek rutinlere yani döngülere, $3000 LDX #$00 $3003 LDY #$00 INY $3006 CPY #$FE BNE $3003 $300A INX $300B CPX #$F0 $300D BNE $3003 $300F LDA #$00 $3011 STA $D020 $3014 STA $D021 $3017 RTS Bu rutinin mantığı da şu şekilde işlemektedir. Bilgisayar önce X ve Y'yi #$00 değerleri ile tanımlıyor. Sonra Y'yi $FE olana kadar arttırıyor. Y = $FE olduğunda X bir arttırılıyor ve X = $F0 olana kadar Y'nin #$FE'ye kadar olan artması tekrar tekrar işleniyor. Yani X her arttığında Y tekrar 0'dan $FE'ye kadar artıyor. Bu tekrarlama X'in $F0 değerini alması ile sonuçlanıyor. Tabii renkler siyah olarak uyarılıyorsunuz. Yine X ve Y'nin kontrol değerleri CPX ve CPY'nin sayısı değerleri ile oynayarak farklı zamanlar elde etmeniz mümkün. Şu ana kadar registerleri kullanarak zamanlamayı gördük. Gelecek sayıda registerlara bağlı kalmadan vakit geçirmeyi anlatacağız. Umarım kendi kendinize basit programlar yapmaya başlamışsınızdır. Ya da bazı programlara eskiden olduğu gibi hiçbir şey anlamadan bakmıyorsunuzdur. Az da olsa birtakım şeyleri anlamaya başladığınızı sanıyorum. Zaten tek bir kaynağa bağlı kalmaksızın program incelemenizi tavsiye ederim. Geleceğin assembler programcılarına bol klavyeli bir ay diliyorum Gelecek sayıda buluşmak üzere hoşçakalın