C64 için Püf Noktaları
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
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
İş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
KICK OFF II
SOF
Merhaba arkadaşlar. Bu ay sizlere adından çok söz edilmiş bir oyunu anlatacağım. KICK OFF II. Evet bu oyun ilk çıktığında büyük bir sansasyon yaratmıştı. Herkes bu futbol oyununu görünce şaşırıp kalmıştı. Ve sorulan soru şu idi: “Bir oyun nasıl bu kadar gerçeğe yakın yapılmış?” KICK OFF çıktığı andan itibaren büyük rağbet gördü ve bir anda Amiga'nın klasik oyunları arasına girdi. ANCO firması bu durumu iyi değerlendirdi ve oyundan bir kaç ay sonra KICK OFF EXTRA TIME adında bir oyun daha piyasaya sürüldü. Bu yeni Kick Off'da eskiden farklı olarak bir çok yeni özellik vardı. Bunların en güzeli ise topa falso verilebiliyordu. Daha sonra yabancı bilgisayar dergilerinde KICK OFF PLAYER MANAGER adlı bir oyun çıkacağı haberi yayılmaya başladı. Aradan bayağı uzun bir zaman geçti ve bu oyun da ülkemize geldi. Bu oyun MANAGER'lı oyun hastalarının bayılacağı bir oyun türüydü. Bundan sonra da KICK OFF II'nin çıkacağı piyasaya duyuruldu. Bu oyun dergilerde ilan çıkmasından bir ay kadar sonra piyasada bulunur hale geldi ve KICK OFF hastaları bir defa daha şok geçirdiler. Evet Kick Off 2. Kick Off 1'den daha büyük bir olay yaratmıştı. Daha önceki futbol oyunlarında bulunmayan birçok futbol kuralı bu oyuna eklenmişti. Faul, korner, penaltı gibi klasik kuralların konması oyunu daha da ilginç bir hale
Uğur Özyılmazel soktu. Evet Dino Dini bir kez daha kendini göstermiş ve futbol oyunları dalında en iyi CODER (programcı) olduğunu bir kez daha ispatlamıştı Şimdi de KICK OFF II'nin diğer KICK OFF'lardan farkını ve oyunun nasıl oynadığına bir göz atalım. Oyun yüklendiğinde karşımıza oyunun ana menüsü geliyor. İlk seçenek: PRACTICE: Egzersiz anlamında. Oyunu ilk kez oynayanların ya da oyunda yeni hareketler, taktikler geliştirmek isteyenleri seçmesi gereken bir kısım. Bu bölümde bir veya iki kişilik antrenman yapabilirsiniz. Tek kişi antrenman yaparsanız boş kaleye şut çekiyorsunuz. Seçimlerden sonra ekrana ful kadronuz çıkıyor. Bu kısımda oyuncularınızı saha üzerinde istediğiniz yere yerleştirebilirsiniz. Yani adamlarınızın konumunu bu menüden seçiyorsunuz. SINGLE GAME: İşte burada KICK OFF II'nin yeni bir özelliği göze çarpıyor. Ekranda gördüğünüz gibi oyun 4 kişi tarafından oynanabiliyor. Ama oyunu dört kişi oynamak için joystick adaptörü gerekiyor. Bu menüde oyuncu sayısını seçtikten sonra yine takım kadronuz ekrana çıkıyor. Oyuncuların konumunu ayarladıktan sonra oynayacağınız sahanın durumunu, havanın durumunu, ve hakemi para atışını kimin kazandığını görebiliyorsunuz. (Yazı/tura atışı) Kurayı kazanan takım kaleyi kaybeden de topu seçiyor. İlk devre yukarıdaki kaleye ya da aşağıdaki kaleye hücum etmek için seçimi buradaki menüden (UP PITCH/DOWN PITCH) yapıyorsunuz. Buradaki bir seçenek yardımıyla maça başlayabilir ya da ana menüye dönebilirsiniz.(QUIT) LEAGUE: Burada kendinize lig kuruyorsunuz. Burada bulunan takımlardan hangisini bilgisayarın yöneteceğini F1 tuşu yardımıyla yapıyorsunuz. Takım adı yazan yere gelip ateş tuşuna basarsanız, buraya istediğiniz takım adını yazabilirsiniz. Bütün seçimleri yaptıktan sonra en alt kısımda bulunan kutucuklardan CONTINUE ile lige devam edebilirsiniz. SAVE ile hazırladığınız fikstürü kayıt edebilirsiniz. LOAD ile daha önce yapmış olduğunuz fikstürü yükleyebilirsiniz. Ayrıca yukarıda : W- Kazandığınız maç sayısı. D- Berabere kaldığınız maç sayısı L- Kaybettiğiniz maç sayısı. GF- Attığınız gol sayısı. GA- Yediğiniz gol sayısı. PTS- Puanınız. anlamında. CUP- Kupalara katılmak için. Burada da bir çok seçenek var: LOAD, SAVE, QF- (QUARTER FINAL) - Çeyrek final. SF- (SEMI FINAL) - Yarı final. FINALS- Final anlamında. WINNER - Kupayı kazanan takımı gösteriyor. INT. FRIENDLY: Dostluk maçı anlamında. 2 kişi ile aranızda yapabileceğiniz maçları bu seçeneği kullanarak yapabilirsiniz. STORE: Bu bölümde bazı durumları saklayabilirsiniz. VIEW GOLD SHOTS: Bu kısım da, kaydettiğiniz güzel şutları yeniden izlemek için. Bu ve bunun gibi tekrarlamalar yaparak, rakibinizin zayıf yönlerini bulabilirsiniz. Ve rakiplerinizi yenmenizi kolaylaştırabilirsiniz. EDIT REPLAYS: Yapılan tekrarlamaları gösterir. VIEW- O anki tekrarı. LOAD MATCH REPLAYS- Maç tekrarlamalarını yüklemek. SAVE REPLAY- Tekrarlamaları diskte saklamak için. LOAD GOLDEN REPLAY- En iyi tekrarı yüklemek için. Çıkmak için bu seçenekleri seçmeniz gerekir. KIT DESIGN: İşte yeni KICK OFF'a eklenen yeni bir özellik daha. Forma renklerini ayarlama seçeneği. OPTION: Bu menüden oyun ile ilgili ayarlamaları yapabiliyorsunuz: PITCH: Saha seçimi Normal- Normal saha Wet- Islak zemin Foggy- Sisli zemin Plastic- Plastik zemin Eğer random (rastlantısal) seçeneğini seçerseniz daha seçimleri bilgisayar tarafından yapılacaktır. (rastlantısal olarak) DURATION- Maç uzunluğunu belirlemek için. 2 x 3 - Bir devre 3 dakika. 2 x 5 - Bir devre 5 dakika. 2 x 10 - Bir devre 10 dakika. 2 x 20 - Bir devre 20 dakika. anlamında. EXTRA TIME - Uzatma dakikaları için Eğer bu seçeneğe YES derseniz maç berabere bitince uzatma dakikalarına gidileceği anlamındadır. AFTER TOUCH - Bu topa vurduktan sonra falso vermek içindir. LEAGUE SKILL- Oynayacağınız maçın zorluk derecesini seçmek için. En zor ve en hızlı INTERNATIONAL seçeneği. GAME SPEED- Oyunun hızını ayarlıyorsunuz. SKILL LEVEL- Burada da oyunun zorluk derecesini ayarlıyorsunuz. SELECT TACTICS: Hangi taktikte hücum ve savunma yapacağınızı seçiyorsunuz. Player Manager seçeneği ile Player Manager'da hazırladığınız data disketini kullanabili-
PLASTI
PX
* Div. 3
PEK yorsunuz. REFREE: Buradan istediğiniz hakemi seçebiliyorsunuz. Toplam 25 hakem var: J. MARTYN, M. TAYLOR, R. HARPER, F. WILLIS, G. PEN, A. DENT, I. BALL, V. JONES, D. WOOLEY, D. DUFUS, G. ELLIS, J. CUPITT, M. SPURAY, R.J. FERNANDEZ, F. ZAPPA, J. DANIELS, S. SCHREECH, J. BRAWN, A.N. INDI, D. MORGAN, N. RAJAH ve B. BROWN. SPECIAL EVENTS- Özel olaylar anlamında. Buradan bir çok önemli kupaya katılabilirsiniz. (Dünya kupası gibi) Dünya kupasına katıldığınızda yine LOAD, SAVE, CONTINUE, QUIT seçenekleri bulunmakta. Bu seçeneklerden sonra içerisinde de kullanacağımız tuşlar olacak. Bunlar: F4 - Maç sırasında bir adamınız sakatlanıp dışarıya çıkınca, yedek oyuncuyu almak için (12 nolu oyuncu) bu tuşa basın. F5 - Maç sırasında bir adamınız sakatlanıp dışarıya çıkınca, yedek oyuncu almak için (14 nolu oyuncu) bu tuşa basın. (ikinci yedek oyuncu) Oyun içinde taktik değiştirebilirsiniz. Bunun için: PLAYER 1- Yani ilk oyuncu klavyeden 1, 2, 3, 4, tuşlarını kullanarak bir taktik seçebilir. PLAYER 2- Yani ikinci oyuncu klavyeden taktik seçmek için nümerik klavyeyi kullanması gerekir. Yaptığınız güzel hareketleri ve attığınız golleri R tuşunu kullanarak tekrar izleyebilirsiniz. (REPLAY) Bu hareketleri diskete çekmek için F1 tuşuna basın ve DF0'a formatlanmış bir disk koyun. F tuşu ile kamerayı ayarlayabilirsiniz. Yani istediğiniz bir zamanda sahanın herhangi bir yerini görmeniz mümkün F tuşuna bastıktan sonra kursor tuşlarıyla bir oyuncu ayarlayın ve tekrar F tuşuna basın. Böylece sadece o oyuncunun yaptığı hareketleri ve o oyuncunun gittiği yerleri görürsünüz. Oyunda kazandığınız FREE-KICK (serbest vuruş)'ler de çok önemli. Baraj kurma, direkt şutlarla bu pozisyonlar gayet gerçekçi. Oyunun diğer bir özelliği de kalecinin mükemmel oluşu. Artık kornerden ve aşırtmadan gol atmak o kadar kolay değil. Kaleciyi alt etmek için kombine goller atmanız gerekiyor. Kalecinin bu denli iyi olması da oyunun hem zevkini arttırıyor hem de mükemmel gollerin atılmasını sağlıyor. 1991'e kadar attığınız güzel golleri ANCO firmasına yollarsanız yapılacak olan GOLDEN SHOOT yarışmasına katılabilirsiniz. Eğer yarışmayı kazanırsanız çok yüklü bir miktarda para kazanıyorsunuz. Bu yüzden de attığınız golleri diskete çekmeyi unutmayın. Sonuç olarak DINO DINI büyüklüğünü bir kez daha kanıtladı. Ama herkesin aklında halen şu soru var KICK OFF III yapılacak mı ya da yapılırsa ne zaman çıkacak. Evet ben de bunu çok merak ediyorum ve heyecanla KICK OFF çıkacağı günü bekliyorum. Benim tavsiyem bol bol KICK OFF oynayın. (Ama boş zamanlarınızda) Hepinize bol gollü günler diliyorum.