Makine Dilinin Püf Noktaları

Burada verilen program dökümü bilgisayarınızdaki ile aynı olmayabilir. Dizgi hataları olabileceğinden, siz monitör programıyla incelediğiniz döküme göre fikir yürütünüz.

Herkese merhaba. Bu sayımızda da, makine dilinin intro veya demo yapmak için nasıl kullanılacağını anlatmaya devam ediyoruz. Geçen sayıda grafik kullanımını engelleyen bellek problemini nasıl halledeceğimizi öğrenmiştik. Grafik ekranlarını karakter setlerine sıkıştıran bir program sayesinde, diskte 40 blok yer kaplayan bir ekran, 13 blokluk bir karakter setine sıkıştırılabiliyordu. Kursumuzda bu ay, karakter setine atılmamış bir grafikle yapamayacağınız bir efekti yaratmayı öğreneceğiz. Orijinal adı LOGO SWING olan bu efekt, ekranda bulunan bir logoyu, bir sinüs tablosu kullanarak sağa-sola sallamaktan ibaret. Ama, bunu grafik ekranının kendisiyle yapmaya kalkarsanız, yarım ekranlık bir logoyu bir piksel yana kaydırmak için en az 4600 adresin bitleriyle oynamanız gerekir. Bu arada bir bayttan taşan biti diğer bayta eklemeyi de unutmamanız şart. Tabii ki bu işleme kalkışırsanız, saniyede bir piksel kaydırmayı başarırsanız şanslısınız demektir. O zaman, biz de elimizde bulunan ikinci olanağı inceleriz. Yani karakter setine aktarılmış bir logoyu sallamaya çalışırız. Bu şekilde saklanan bir grafiğin 64 noktası (bir kartı) tek bayt tarafından temsil edildiğinden, logoyu oluşturan karakterleri sekiz piksel sağa almak yeterli olacaktır. Tek piksellik hareketleri de $D016 adresli registerin ilk üç bitini kullanarak yaparsanız, işin en zor kısmını halletmiş sayılırsınız. Tabii ki bütün iş bu kadar kolay değil, ama bu kadarını anlamanız, logo swing'i kolay yapabilmeniz için şart. Aslında tek anlamanız gereken, karakter ekranındaki bir logoyu bir bayt sağa almak için gereken transferle, grafik ekranında bulunan bir logoyu bir bayt sağa almak için gereken transfer arasındaki farkı anlamak. Bir kartın sekiz grafik baytından oluştuğunu da göz önüne alırsak, karakter ekranındaki logoyu taşıyan bir rutinin sekiz kat hızlı olacağını rahatlıkla söyleyebiliriz. Geçen sayıdaki yazımı tam olarak okumadıysanız, bu yazıda daha ileri gitmeden geri dönerek bir grafiğin karakter setine nasıl sıkıştırıldığını anlamaya çalışın. Bu yazıda, geçen sayıyı okuduğunuzu ve gerekli temele sahip olduğunuzu varsayacağım çünkü. Bildiğiniz gibi, bir grafiği sıkıştırdığınızda diskete iki parça kaydediliyor: Karakter setinin grafik dataları ve kartların dizilimini gösteren datalar. Daha rahat anlaşılabilmek için birincisine (grafik datalarına) FONT, ikincisine (kart dizilimine) de MATRİS adını verelim. Bir MATRİS'i ekrana ($0400) yükleyip, karakter seti pointer'ini ($D018 — 53272) FONT'u gösterecek şekilde ayarlarsak, grafiğiniz ekranda görünmelidir (renkleri doğru olmayacak tabii ki). Karakter setinde uygulanan bir programı kullanmanın asıl güzelliği burada ortaya çıkıyor. Yani logoyu hareket ettirmek için FONT baytlarına dokunmamıza gerek yok. Yalnızca MATRİS'in ekranda görünen kısmının üzerinde oynayarak da logoyu hareket ettirebiliriz. Sadece MATRİS'i hareket ettirmenin de kendine göre incelikleri var tabii ki. Mesela bir bayt sağa aldık logomuzu. Normal olarak ne yaparız? $0400'den logo sonuna kadar olan

bölgeyi $0401'e taşırız değil mi? Hayır! Eğer bu dediğimi yaparsanız logoyu bir sağa alırsınız, fakat aynı zamanda kırkıncı kolonda bulunan grafik datalarını da bir satır aşağıda birinci kolona taşırsınız. Yani doğrudan doğruya matris üzerinde işlem yapamazsınız. O zaman ne yapmamız gerekir? Bu sorunun cevabı oldukça basit. Logoyu belleğin başka bir yerine transfer ederiz ve gerektiği anda, gereken miktarını ekrana taşırız. Fakat uçlardan alt satıra taşanları kırpmak için de bir sürü hesap yapmak gerekeceği için, biz de her logo satırını 80 kolonluk bir alan içinde ortalar, sonra da ekranı bu matris üzerinde sağa-sola hareket ettiririz. Bu işi yapmak için şöyle bir programcılık kullanabiliriz:

Ldy 0
Ldx — *# Offset
Döngü Lda M,Xatris,k
Sta $0400,y
Lda Matris 4 80
Sta — $0400,y
Sta $0420,y;
$0400 4 40
(alt satırın
başı)
kaç satır
transfer ya-
pılacaksa
Inx
İny.
Cpy #$28
Rne Döngü

Burada X register'ına “Offset” değeri, logonun saklandığı matrisinin başından itibaren kaç karakter atlanacağını belirtir. Logo matrisini 80 karakterlik satırların ortasına yerleştirirsek (40 kolon için düzenlenen matrisinin başına ve sonuna 20 adet boşluk karakteri yerleştirirsek), bu programın kullanacağı matrisi hazırlamış oluruz. Böyle bir matriste yukarıdaki programda bulunan Offset

değerini 0 yaparsak, ekrana logonun sol yarısı, sağa bitişik olarak çıkar. Eğer bu değeri 40 yaparsak da logonun öbür yarısı sola bitişik olarak görünür. Yani yapacağımız böyle bir rutin, logonun iki taraftan da yarısının ekrandan çıkabilecek şekilde sallanmasını sağlayabilir. Neyse, fazla konuyu dağıtmadan rutinin açıklamasına dönelim. İlk Lda-Sta çifti ilk satırın; ikincisi, ikinci satırın ekrana transfer edilmesini sağlar. Y registeri de kırk kere karakter taşınmasını, diğer bir deyişle tek bir satırın transfer edilmesini sağlar. Yani ilk olarak Matris + Offset adresinden itibaren 40 karakter ilk satıra taşınır, sonra Matris + Offset + 80 adresinden itibaren 40 karakter ikinci satıra taşınır, vb. Eğer 5 satırlık bir logo için bu işlemi yapacaksanız, son taşımanız gereken adres, Matris + Offset + 4*80'den başlar. Burada bir satır atlamak için 80 karakter ileri bakmamızın sebebi, matris satırlarının her birinin 80 karakter olmasıdır. Şimdi de size, karakter setine sıkıştırılan (yarım ekrandan bir-iki satır küçük) bir logonun MATRİS'inin nasıl kolayca 80 kolonluk matrise çevrilebileceğini anlatayım: İlk olarak herhangi bir adresten gerekli sayıda satırı ekrana taşıyacak bir program yazın. Bu program şöyle görünmelidir:

Ldy # 40
Döngü Lda Matris,y
Sta $0400,y
Lda Matris 4 40
,y
Sta $0428,y
istediğiniz
sayıda satır

için

Dey
Bpl Döngü
Rts

Bir de bu işin tersini yapacak bir program yazmanız gerekir. Yani, $400'den başlayarak, ilk logonun iki katı satırı istediğiniz adrese taşıyacak bir rutin olmalı bu. Şimdi matrisinizi belleğe yükleyin. Ekranı “Shift + CLR/HOME” tuşlarıyla temizleyin ve logo matrisini ekrana taşıyacak olan programı çalıştırın. Şimdi ekranda bir sürü garip karakter olması gerekir. İlk satıra çıkan ve yirmi kere “SHIFT + INS/DEL” tuşuna basarak boşluk ekleyin. Bunu yapınca, ikinci satırın bir aşağı kayıp yeni satıra yer açması gerekir. Bu işlemi, ikinci logo satırına (üçüncü ekran satırı oldu şimdi) da yapın. Daha sonra her satıra bu işlemi yapın ve ekranda boş bir yer bularak ekranı geri belleğe taşıyacak olan programı çalıştırın. Böylece 80 kolonluk matrisiniz hazır olacaktır. Eh, yolun yarısını geçtik artık. Şimdi de logonun sallanabilmesi için gereken SİNÜS tablosunu nasıl hazırlayacağımızı öğrenelim. Daha önce size sinüs tabloları hazırlamanın yöntemini öğretmiştim, fakat burada gereken sinüs tablosu, makine dilinde yapılacak olan hesapları minimuma indirmek için özel olarak hazırlanmış olmalıdır. Yani iki ayrı tablodan biri 80'lik karakter matrisinin neresinden başlanacağını, öteki de $D016 adresinin ne kadar sağa kayması gerektiğini göstermelidir. Bu işi yapmak için BASIC program yazmamız şart tabii ki. Bu program: 10 PI=3.14159:FOR R=0 TO 255 20 A=16+8*SIN(R/128*PI)+16 30 X=7-(A AND 7):Y=INT(A/8) 49

40 POKE 32768+R,Y:POKE 32768+256+R,X 50 NEXT R Şeklindedir. $D016'ya yazılan 0-7 arası değerler ekranı sağa kaydırdığı, fakat A AND 7 işlemi bize sola kayma miktarını verdiği için bu değeri 7'den çıkararak sağa kayma miktarına çevirmemiz gerekir. Şimdi de sıra bu programdan yararlanmanızı sağlayacak kısa bir rutini anlatmaya geldi:

Sel GeneYap LDX Sayaç Interruptları kapatıyoruz ve sayacımızı X'e alıyoruz.

Lda $DO16
And # $F8
Ora $B100,X
Sta $DO16

X'de sağa kayma miktarını (8-7 piksel) ayarlıyoruz.

Ldy $0000,X
Ldx — #$000
Döngü Lda Mesaj,Y
Sta $0400,X
Iny
In x
Cpx — #$28
Bne Döngü

Bu kısımda da gereken miktarda karakter atlanır ve mesajın görünmesi gereken 40 karakteri ekrana yazılır.

Geldikmi Lda $DO12
Cmp $F8
Bne Geldikmi

Interrupt yapmaya üşendiğim için ekranın gereken yere gelip gelmediğini bu satırlarla kontrol ediyoruz.

Inc Sayaç

Sayacı bir artıralım...

Jmp GeneYap Sonsuz döngüye girerek programı devam ettiriyoruz. Burada sadece bir satırlık bir mesajı sağa sola salladık, ama, satır sayısını artırıp mesaj yerine gerekli karakterleri dizersek, bu rutini LOGO SWING yapmak için de kullanabiliriz. Eh bu ay bir rutin daha öğrendik. Yavaş yavaş usta bir intro programcısı oluyoruz. Ama usta bir programcı olmanın yolu bol pratikten geçer. Yani klavyelerinizi hiç boş bırakmayın. Gelecek ay görüşmek üzere.

Ersen Alptekin Stratejik simülasyonlar, her zaman, oynamasını bilenler için çok zevkli, bilmeyenler için Muamma olmuşlardır. Ülkemizdeki oyunların çoğunun açıklama kitapçığı olmadan satıldığını düşünürsek, kitapçıksız bir simülasyonu çözmek, en az eylemsizlik kuramını çözmek kadar zor olduğu bilinen bir gerçektir. Bu yüzden düşündüm ki eğer stratejik simülasyon oyunlarının genel bir çözümünü yazarsam, bu tip oyunları oynamak isteyenler için belki bir başlangıç teşkil eder. Çünkü stratejik simülasyonlar esas itibariyle çok az bir çeşitlilik gösterirler. Zaten bir kez bu tip oyunların birini kendi çabalarınızla çözdü iseniz bundan sonra herhangi birini de rahatlıkla çözebilirsiniz. Bundan sonra savaşlara bir ferdden ziyade bir komutan olarak katılmak isterseniz bu yazının devamını okuyunuz. Önce işe “Stratejik simülasyon nedir?”, onu öğrenerek başlayalım. Stratejik simülasyon, tarihte yaşanmış veya gelecekte yaşanabilecek bir savaşın tüm askeri, ekonomik, coğrafi ögelerinin bir harita üzerinde, gerçeğinin benzeri olarak canlandırılmasına denir. Bir stratejik simülasyon gerçeğinin %90 benzeridir. Geri kalan %10, insanın o anki ka-