C64 için Püf Noktaları

Murat Şenyüz & Uğur Özyılmazel

MAKİNE DİLİNİN PÜF NOKTALARI

Selam arkadaşlar, bu ay yine köşemizde sizlerle beraberiz. Geçen sayıda belirttiğimiz gibi Interrupt ve Interrupt ile kullanılabilen basit programlardan bahsedeceğiz. Ama bu konuya girmeden önce, geçen aydan eksik kalan bir kısmı yazalım. Hatırlayacaksınız makine dilinde ekrana yazı yazmayı sağlayan bir rutinden bahsetmiştik. Ve bu rutinde yazmak istediğiniz mesajı $1000 ile arasına yerleştirmenizi söylemiştik. Sanıyoruz birçok arkadaşımız (özellikle makine diline yeni başlayanlar) bu kısımda oldukça zorlanmışlardır. Hafızanın belli kısımlarına yazı yerleştirmenin iki yolu vardır: 1- Bu yol biraz sonra anlatacağınız yola göre daha zordur. Yani biraz daha profesyonel bir yoldur. Yazıyı yerleştirmek istediğiniz adresler arasına, mesajınızı kodlayarak yazmanız gerekir. Yani $1000 ile $4100 arasına mesaj yazmak istiyorsanız: .M 4100 43 4F 4D 4D 4F 44 4F 52: COMMODOR .M 4109 45 20 34 39 39 30 00 00: E 1990.. Bu işlemi yapmak için kullanacağınız monitör programı ya da kartuşunun “M” fonksiyonundan yararlanmanız gerekir. Yukarıdaki sayılar (Hexadecimal - 16'lık sistem) Commodore'un hafızasında bulunan karakterlerin sayısal karşılığıdır. 1000 no'lu satırdaki 43 4F 4D 4D 4F 44 4F 52 -COMMODOR harflerine karşılık gelir. 1009 nolu satırdaki 45 sayısı da COMMODORE sözcüğünün sonundaki “E” harfine karşılık gelir. Makine dilinde “A” harfine karşılık gelen sayı 41 sayısıdır. A-Z arasındaki harfler, 41'den yukarı doğru birer birer artarak (hexadecimal olarak) 5A sayısına kadar sürer. Ayrıca karakterlerin cinsine göre bu sayılar SHIFT, REVERSE ve SHIFT + REVERSE olmak üzere değiştirilebilir. Yani (küçük harf modu), (normal modda reverse A) şeklindedir. Ekrana normal sayı basmak için (yani 1, 2, 3 gibi) 3 sayısının yanına istediğiniz değeri yazmanız kafidir. 31=1 anlamına gelir. Ekrana 5 yazmak için, makine dilinde 35 yazmanız gerekir. 2- Bu yol ise daha basit ve daha pratiktir. Kullandığınız monitör programı ya da kartuş sayesinde ekranın bir yerine yazdığınız yazıları hafızanın istediğiniz bir bölgesine transfer edebilirsiniz. Bunu içinde yapmanız gereken işlemleri aşağıdaki sıraya göre takip edin: A- Monitöre girin. B- Ekranı SHIFT + CLR/HOME tuşuyla temizleyin. C- Ekranın sol üst köşesinden başlayarak yazmak istediğiniz mesajı girin. Ama bu mesaj 5 satırı geçmesin. D- Daha sonra SHIFT + RETURN tuşuna 5-6 kez basın. E- T 0400 0500 1000 yazıp RETURN tuşuna basın. F- yazıp RETURN tuşuna basın ve monitörden çıkın. Yukarıda anlattığımız şey, ekranın başlangıç adresi olan $0400 (1024)'den $0500 (1280)'e kadar olan bölgeyi hafızada (4096) transfer eder. Yani yazdığınız yazıyı $4000-$4100 arasına transfer eder. Aslında monitör programının yaptığı olayı basit bir programla biz de yapabiliriz. Bu verdiğimiz program ekranın en üst köşesinden itibaren 255 karakteri $1000 ile $1100 arasına koyar. Eğer yazıları koymak istediğiniz adres farklı ise siz programdaki $1000 değerini koymak istediğiniz adrese göre ayarlayabilirsiniz. Unutmayın ki yalnızca 255 karakterlik bir transfer yapmaktayız.

LDX > X'i sıfırla
$4002 LDA $0400,X > $0400'den X uzaklıktaki de-
ğeri A'ya yükle
$1005 STA $1000,X > A'yı $4000'den X uzaklıktaki
adrese koy
INX > X'i bir
$4009 BNE $4002 > X—0 olana kadar 1002'ye git
$1400B RTS > Programı bitir ve geri dön

Bu açıklamayı da yaptıktan sonra şimdide asıl konumuza geçelim. Önce interrupt'ın ne olduğuna ve nerelerde işimize yarayabileceğine değinelim. Interrupt kesinti vektörüdür. Her 1/60 saniyede, işletim sistemi kontrolü, bu vektör tarafından belirlenen rutine devredilir. Inter-

” bulunduğu adres $EA31'de başlamaktadır.

Vektörün adresleri $0314-$0315'dir. Bu adresler yazdığınız programın başlangıç adresinin alt ve üst byte'larıdır. Interrupt vektörünün gösterdiği adresteki program “JMP $EA31” ile bitirilir. Program interrupt tarafından kesildiği anda tüm X, Y ve A registerları saklanır. Böylece interrupt normal çalışan programa hiçbir şekilde karışmamış olur. Interrupt'ı kullandığımız yerler oldukça fazladır. Örneğin; basic programımızda müzik çaldırmak için bu vektörü kullanırız. Demo ve introlarda kullanılan programlama tekniği de her zaman interrupt'tır. Kısacası interrupt C-64'ün en önemli özelliğidir. Şimdi gelelim bu özelliğin nasıl kullanıldığı meselesine. Interrupt'ı kurarken önce tüm kesintileri önlemek gerekir. Bunu komutu halletmektedir. Yani programdaki ilk komut “SEI” olmalıdır. Sonra interrupt ile çalıştıracağınız programın başlangıcının alt ve üst byte'larını $0314-$0315 adreslerine yerleştirmeniz gerekir. Alt ve üst byte hesabı şu şekilde yapılır. Programınız örneğin $C050 adresinden başlıyor olsun. Bu durumda siz $0314 adresine #$50, $0315 adresine de #$C0 koymalısınız (Vektörlerde daima ilk adrese alt byte, ikinci adrese de üst byte yerleştirilir.). Burada #$50, $C050'nin alt byte'ı, #$C0 ise $C050'nin üst byte'ı olmaktadır. Bu işlemlerde bittikten sonra “CLI” komutu ile kesinti önleme sıfırlanır. Yani interrupt'ta bulunan program çalışmaya başlar. Artık normal işletim sistemine dönmek için “RTS” veya “JMP” gibi komutlar kullanılmalıdır. Böylece interrupt çalışırken siz bir basic program çalıştırabilir veya ekrana yazılar yazabilirsiniz. Gelelim interrupt vektörünün gösterdiği programın nasıl olması gerektiğine; Öncelikle programınızda kesinlikle SEI ve CLI komutu kullanmayın. Programınızın işlemi bittiğinde “JMP $EA31” ile kontrolü sistem rutinine devretmelisiniz. Ayrıca interrupt saniyede 60 kez devreye girdiğinden yaptığınız programın fazla uzun olmaması ve fazla zaman harcamaması gerekir. Eğer çok zaman harcayan bir program yazdıysanız alet yavaş çalışmaya başlar ve ekranda istenmeyen saçmalamalar oluşur. Bunu önlemek için yani “ANAHTAR” sistemini kullanmak gerekir. Bu sistemi daha sonra göstereceğiz. Şimdi bu konuda kısa bir program yazalım

$CO0O SEl — > Tüm kesintileri önler.
$CO0O4 LDA # — > A'ya alt byte'ı yükle.
$CO0O3 STA $0314 — > A'yı $0314'e koy.
sC0O06 LDA # $CO —- > A'ya üst byte'i yükle,
SCO0O STA 80315 — > A'yı $0315'e koy,
$COOC RTS (veya) JMP $474 -— > İşletim sistemine ge-
ri dön veya ekrana READY yazarak geri dön.
Yukarıdaki program interrupt'i ayarlayan program-
dı. Şimdi interrupt'ta çalışmasını istediğimiz programı
yazalım.
SCOAB LDX # $00
$COA2 STX $DO20
SCOAS INX
$COA6 BEO SCOAB
$COA8 JMP SCOA2
JMP SEA31

Bu program kenar yani border renklerini devamlı değiştirmektedir. Bu sırada siz takipçiyi kullanabilirsiniz. Yani sizinde anladığınız gibi interrupt aletin işletim sisteminden bağımsız çalışmaktadır. Ancak üstteki programın en sonundaki “JMP $EA31” yerine “JMP

$EA81” veya “JMP $FEBC” koyarsanız ekranda takipçi görünmeyecektir. Sizin tüm müdahaleleriniz etkisiz kalacaktır. Çünkü siz interrupt'ı bu şekilde ayarlarsanız bilgisayar takipçiyi vermemektedir. Bu sayede inter-

Lİ

rupt programınız daha hızlı çalışır. Yukarıda anlattığımız interrupt şekli en basit halidir. Interrupt'ın değişik şekilleri ve özellikleri vardır. Ancak biz bu sayıda bu kadarlık bir kısmı gösterdik. Şimdi sizi interrupt ile daha fazla sıkmadan ilginç bir konuya geçelim. Interrupt konusunu basitçe gördükten sonra artık introlardaki alt programları (Sub-routine) anlatmaya başlayalım. İlk önce her intro veya demonun ana bölümünü oluşturan hatta oyunlarda da sıkça kullanılan bir teknikten bahsedelim. Bu tekniğin adı “SCROLL” yani “KAYDIRMA”. Ancak scroll'un titreyerek kayması hiçbirimizin hoşuna gitmez. Bu yüzden biz size “SMOOTH SCROLL” yani “DÜZ KAYDIRMA”yı anlatacağız. Bu tekniğin mantığı şu şekilde açıklanabilir. C-64'ün içindeki $D016 (53270) adresi ekran kaydırması ile ilgili olan adrestir. Daima bu adresle scroll'u yapacağız. $D016 adresi 0'dan 7'ye kadar değerler almaktadır. Bu değerleri verdiğinizde ekran soldan sağa doğru kayar. Ancak harfler bir karakter yana kaymamaktadır. İşte scroll ile bu harflerin bir yan karaktere kayması sağlanır. Eğer scroll'u bir satırda yapmak istiyorsanız bu olayı şöyle anlatabiliriz. $D016 adresine 7'den 0'a kadar değerler verdikten sonra o satırdaki tüm karakterler bir sola atılır. Bunu daha önce anlattığımız transfer ile yapabilirsiniz. Küçük bir program örneği vermek gerekirse şöyle bir alt-rutin yazabiliriz.

1000 > Kesinti önleme bif'ini 1 yap
1004 LDY $1400 > Y'ye $1100'deki değeri yükle
1004 STY $0427 > V'deki değeri S0427'ye koy
1007 LDX # $00 > X'e 00 yükle
1009 LDA > $0401'den X kadar uzaklıkta-
ki değeri accumulator'e yükle
STA $0400,X > Accumulator'deki değeri
$0400'den X kadar uzaklığa koy
400F INX > X'i bir arttır
1040 CPX # $27 > X'i 27 ile karşılaştır
1012 BNE $4009 > olana kadar $1009'a git
1014 LDX# $97 > X'e O7 yükle
1046 STX SDO16 > X'i SDO16'ya koy
1049 LDA $D012 > $DO12'deki değeri A'ya yükle
404C CMP > A'yı 8B ile karşılaştır
404E BNE $1046 > A—3B olana kadar 1016'ya git
1020 LDA # $00 > A'ya 08 yükle
1022 STA $DO16 > A'yı $DO16 adresine koy
1025 LDA $D012 > $DO12'deki değeri A'ya yükle
1028 SFF > A'yı FF ile karşılaştır
102A BNE > Az-FF olana kadar 1020'ye git
102C DEX > X'i bir azalt
102D SFF > X'i FF ile karşılaştır
102F BNE > olana Kadar 1016'ya git

4031 INC $4002 > değeri bir arttır 4034 JMP > $1001'e sıçra. Şimdi bu programın anlattığımız mantıkla ilgili açıklamasını yapalım. 4001-4007: Scroll'umuzun karakter değerini alır ve ekranın sağ ucuna basar. 4007-4014: Ekranın en üst satırındaki karakterleri bir sola atar. 4014-4020: Ekranın #$38'ye kadar olan kısmında $D016 değerini #$07 yapar 4020-402C: $3B'den $FF'e kadar kısmında $08 yapar. 402C-4031: $3B'ye kadar olan $D016 değerini $FF'e kadar tek azaltır. Her bir azalmada $D016'ya gider. Değer $FF olduğunda bir sonraki satıra devam eder. 4031-4034: Scroll karakterlerini alan adresi bir arttırır. 4034: İşlemleri tekrarlar. İşte bu kısa program ile ekranın en üst kısmındaki yazıları kaydırabilirsiniz. Bu program kaydırdığı karakteri $1100 adresinden almaktadır. Dikkat ederseniz yukarıdaki programda interrupt kullanmadık. Ancak bilgisayar yalnızca en üst satırda scroll yapmaktadır. Bu olayı C-64'ün $D012 adresi ile yapmaktayız. Bu konuyu da gelecek sayımızda detaylı bir şekilde açıklayacağız. Gelecek sayıda yalnız $D012 ile değil interrupt ile de ilgileneceğiz. Şimdilik bol klavyeli ve mutlu günler dileriz.

06 Aş sı