Makine Dilinin Püf Noktaları
Retro bilgisayarTüm Commodore kullanıcılarına merhaba, Okulların ara tatile girmeye hafiften başladığı şu günler bilgisayar kullanıcıları İçin eşi az bulunur bir çalışma ortamı sunuyor. Ve sizler dersleriniz yüzünden aylardır başına geçemediğiniz bilgisayarınıza kavuşmaya hazırlıyorsunuz kendinizi. Tabii ki bu tatil en çok, uzun süre bilgisayar başında çalışma yapmak İsteyenlere, yanİ siz pProgramcılara yarayacak, Bu kursta örnek olarak verdiğimiz programları bir araya getirdiğimiz programı (evet bu ayki konumuz bu olacak) inceledikten sonra kendi intronuzu yapmak için bol bol zamana İhtiyacınız olacak çünkü.
Bu aya kadar olan sürede bir İntroda kullanılabilecek düzeyde üç adet rutini açıklamıştım. Bu ay yeni bir rutin tanıtmaktansa bu üç rutini bir araya getirmenin yollarını anlatmayı tercih ettim. Çünkü şu ana kadar yazımızı dikkatle takip edenlerin (başlangıçta basit de olsa) bu tür rutinler yazabilecek düzeye gelmiş olmaları lazım. Ama birden fazla rutini bir araya getiremezseniz yazdığınız rutinler hiçbir işe yaramaz. Aslında bir intronun en zor kısmı küçük bir alana (uzun oyunların başına da intro koyabilmek İçin ufak bir beliek alanı kullanılmalıdır. Mesela $0800-$4000 arası...) birden fazla rutini birbirlerini engellemeden rahatça çalışabilecek şekilde yerleştirmektir. Eğer bu konuda rahat olmak istiyorsanız, her şeyden önce rutinlerinizin hangi raster satır aralığında çalışmasını İstediğinizi belirlemelisiniz. Amiga gibi aynı anda birkaç programı çalıştıramadığı için belli bir raster satır aralığında sadece bir program çalışabilir. Programınızın İnterrupf veya normal program olması bu konuda hiçbir fark yaratmaz. Yani en tepede yazı kaydırmak ve renk geçişleri yaratmak istiyorsanız, bu alanda aynı anda zıplayan topların hesaplarını yapamazsınız. İlk inttromuzda bu ekran bölünmesini Şu şekilde yaptık: > 1) $0000-$0831: Müzik çalma rufini. 2) $0031-$0044: Yazıların kaydırılması ve ekrana renk koyulması. 3) SOO4AA-$0101: Zıplayan topların hesapları. 4) $0101-ekran sonu: Zıplayan topların hesapları, daha sonra ekranda parlayan harflerin renginin ayarlanması ve kayan yazıların düzenlenmesi. Bu raster satırlarının ekranda yaklaşık olarak nereye geldiklerini anlamak için aşağıdaki tabloyu inceleyebilirsiniz.
Tahmin ettiğiniz gibi bu rutinler belirli bir sırada İşletime geçmelidir. Yani önce 4, sonra sırasıyla 41, 2 ve 3 nolu ruütinler gereken aralıkta çalıştırılabilir (bizim yaptığımız sıra da budur). Aslında en doğru sıra 1, 2, 3 ve 4. rutini sırayla işleme sokmaktır ama 4, 1,2,3 veya 3,4,1,2 gibi işletim sıraları bir fark yaratmaz. Yani burada asıl önemli olan 4 numaralı bölgede çalışan rutinin işi bitince 2 numaralı bölgenin rutininin, bu rutinin işi bitince 3 numaralının devreye girmesidir. Ne yazık ki, Şu raster satır aralığında şu rutin çalışsın, bundan sonra da bu devreye girsin.” gibi bir ayarlama yapma ve sonra da bir köşede boşluk tuşuna basılmasını bekleme gibi bir şans verilmemiş bize, Bunun yerine ilk önce çalışmasını İstediğimiz rutini tanımlıyoruz (bildiğiniz interrupt adresi ayarlama teknikleriyle) ve tuşa basılmasını kontrol etmeye başlıyoruz. (Bu örnekte boşluk tuşu kontrolü yok, O, bir ay sonraya...) Bundan sonrasını interruptla çalışan rutin içinde hallediyoruz. Rutin çalışmasını bitirdikten sonra, Jmp SEA81 komutunun olacağı yere lda —#SRaster
Sta $DO12
Lda #$9B(gerekince 1B)
Sta $DO11
> YL?) | Nİ? Hi 3 VA, )
lda # $ Yeni Rutin
Sta 503814
lda #$ Yeni Rutin
Sta $0315
Jmp
Farkettiğiniz gibi sıradaki rutinin başlangıç adresini $0314-$0315 adreslerine verdik ve Başlangıç raster satırını adresine koyduk. Hatırlayacağınız gibi $DO11 adresine 1B/9B verirsek raster interrupt'ınin $OO-FF veta $0100-$0430 arasında oluşmasını ayarlayabiliriz. Bu sistemi kullanarak 1. rutini ikinciye, ikinciyi üçüncüye, üçüncüyü sonuncuya ve sonuncuyu da birinciye bağladıktan sonra bu halkaya herhangi bir yerden girersek rutinler büyük bir koordinasyon içinde çalışacaklardır. İki rutini birbirine eklemenin bir başka (fakat pek de İyi olmayan) bir yolu daha bulunuyor. Bu sistemde de,
Jmp SEA81
yerine
Döngü Lda
Cmp #SRaster
Bne Döngü (Bce Döngü)
Jmp YenikRutin
Evet bu sistem daha basit gibi duruyor. Aslında önceki sistemle yeni rutine giriş hazırlığı yapmak bundan
4 yi
U. Uh.
E=mez çok daha etkili. Her şeyden önce bizim burada yaptığımız kontrolden çok daha hassas bir kontrol yapılmasını sağlar. Ama bundan daha önemlisi, işinizin bittiği rutinden yeni rutinin başlangıcına kadar olan sürede, önemli olan raster zamanınızı basit bir raster kontrolü için harcamanızı engeller ve kontrolü gene boşluk tuşu kontrolüne verir. Ama bir-iki rutini birbirine bağlarken (özellikle de birinin sonu ötekinin başlangıcına yakınsa) bu sistemi kullanmanız sizi fazla rahatsız etmez. Size bir örnek oluştursun diye intromuzda renk koyduktan sonra, yıldız rutinine geçişte bu sistemi kullandım. (Fakat raster kontrolü renk rutininin sonunda değil, yıldız rutininin başında.) Peki bu sırayı karıştırırsanız ne olur? Çok basit; ekranınızdaki tüm bölgeler yanıp sönmeye başlar. Özellikle tepedeki renkler ve kayan yıldızlarda bu yanıp sönme çok belli eder kendini. Bunun sebebi her rutinin iki ekran taramasında bir kere çağırılmasıdır. Yani önce başlayan, sonra da $0000'da başlayan rutini çağırmaya çalışırsak, $004A'da başlayan rutinimiz atlanacaktır. Daha sonra $0000'da başlayan rutinden çıkıp $004A'ya geçerken de $0031'deki rutin atlanır ve bu şekilde devam eder. Elektronu geri alamadığımız için de her rutine iki ekran taranmasında bir kez uğranır. Bu hatanın en kötü yanı hangi rutinin buna sebep olduğunu bulamamanızdır. Herhangi bir rutinde bulunan bir hata tüm sisteminizi çökerteceği için tek tek tüm rutinleri kontrol etmeniz gerekir. Aynı hatanın oluşmasının bir sebebi daha vardır ve bu yüzden intronuzda yanıp sönmelerle karşılaşırsanız gerçekten de başınız belada demektir. Her neyse, ikinci hatanın oluşma sebebi de bir rutini gerekenden geç terk etmenizdir. Yani, müzik rutininiz $0032'de biterse renk koyma rutininiz çalışma fırsatı bulamaz, bunun sonucu olarak da iki ekranda bir kez çalışan bir renk rutininiz olur. Rutinlerin hangi raster satırından başlayıp hangisinde bittiğini görmek için çok basit bir yöntem göstereceğim size. Rutine girer girmez Inc $D020 komutunu işletip, rutinin ana yapısını bozmadan, son işlem olarak da Dec $D020 yazarsanız, rutinin nerede başlayıp nerede bittiğini kolayca görebilirsiniz.
Rutinin başında ve sonunda yeriniz mi yok? Çözüm kolay. Boş bir adrese (mesela $8000) Inc $DO20 Jmp Rutin yazın, daha sonra interrupt başlangıcını burayı gösterecek şekilde ayarlayın. Rutinin sonunu nasıl değiştirirsiniz peki?
Jmp SEA81
yerine
Jmp
yazın ve $8006'ya
Dec $DO20
Jmp SEA81
ekleyin. Bu işlemleri yaparsanız, rutininizi hiç etkilemeden başlangıç ve bitiş yerlerini görebilirsiniz. Biraz da ilk intromuzu $0900-5898B arasında tüm rutinlerin ihtiyaç duyduğu başlangıç ayarlamaları yapılır, ekranlar tanımlanır ve interrupt başlangıcı tanımlanır. Seçtiğimiz ilk rutin top sıçramaılarının hesaplandığı bölüm, Bu kısımda top koordinatları hesaplanır, daha sonra raster kontrolü yapılmadan kayan yazının x koordinatı hesaplanmaya girişilir, bundan hemen sonra ekrandaki metnin harfleri parlatılır ve en son olarak da (tabii ki raster kontrolü gene yok) bir nota çalınır. Burada raster konirollerini koymamanın herhangi bir mecburiyeti yoktur, çünkü bütün bu işlemler, ekran çizilmeye başlamadan (raster satırı $0034'e gelmeden) bitirilir. (Fakat bazı uzun zaman yiyen notalarda bu zamanlamayı biraz kaçırdığımız için kayan yazılarda bazan bir titremeye sebep oluyoruz.) Bu arada eklemem gereken bir nokta daha var. Bir rutin çalıştığı ekran bölgesini değiştirmeye kalkarsa kesinlikle o bölgede bir titreme olur. Yani yazının geçtiği bölgede bir harf değiştirdiğinizde yazınızda bir titreme görünür, Bu sebepten dolayı ya yazı bölgesinden hemen önce ayarlamaları yapın, ya da yazı satırları bittikten sonra.
Müziği de çaldırdıktan sonra $003 1 raster satırında renk koymaya başlıyoruz. $0044 gibi bir satırda bu rutin biter ve $0O4A satırında da yıldız koymaya başlarız. Tüm yıldızlar için tek sprite kullandığımız için bu rutin gibi bir bölgeyi yer. Ve bunun sonunda da ilk rutine dönüş yaparız. İntronun tüm rutinlerinin yerleri değiştirildiği için yeni adreslerini bir tablo olarak vermenin size yardımcı olacağını düşünüyorum. $0900-$098B: İntronun başlangıcı. Bütün başlangıç ayarlamaları burada yapılıyor. Daha sonra $0C80 adresine sıçranıyor. (Bu da plansız çalışmanın bir sonucudur. Sonradan eklemeye karar verdiğim bazı komufları koyacak yer bulamadım.) $O98E-$OAOS: Top sıçratma ve bahsettiğim diğer işlemlerin yapıldığı rutinler burada yer alıyor. Buradan da $1B00 adresine bir kısa sıçrama var. SOA10-$0A&F: Yazının x koordinatı ayarlandıktan sonra renkler koyuluyor ve doğrudan doğruya yıldız rutininin başlangıç adresi olan $OA90 adresine sIçranıyor, SOA90-$OBFF: Datalarıyla birlikte yıldız kaydırma rutini burada yer alıyor. Top sıçramasının sinüs tabloları, Müzik çaldırma rutini. Programın başlangıç değerleri ayarlanırken Lda #$00 Jsr $1000 ile başa alınır ve her ekran taranmasında bir kez $1003 adresine sıçrama yapılırsa hoş bir müziğiniz olur. Bu müzik LİNK adlı bir müzisyen tarafından mış, adı da Soul, Ekranda parlayarak görünecek olan yazının saklandığı bellek alanı. Bu yazıları değiştirmek için bu bölgeye yazdıklarınızın ekran kodlarını $80 ile
EOR'layın. Yani harflerin REVERSE olarak yazılmasını sağlayın. (Yani A yazmak için $81 baytını girin) $2000-$28FF: Karakter seti ve top grafik dataları. $2800-$2CFF: Kayan yazıların saklandığı bölge. İstediğiniz gibi değiştirin. Ama yazının sonunu bildirmek için $FF baytını girmeyi unutmayın. Bu programı nasıl başka programların başına ekleyeceğinizi ve boşluk tuşu kontrolünü nasıl yapacağınızı da gelecek aya bırakıyorum. Hepinize bol Commodore'lu, iyi bir tatil diliyorum. 2800-2840
2406
BUZZZ