KASET TURBOLARI

Yeni bir sayı ve yeni fikirlerle karşınızdayız gene. İki aydır sürdürdüğümüz bu kaset turboları yazısının kaset kullanmak zorunda kalan arkadaşlara yardımcı olduğunu umuyorum. Aslında bir kaset turbosunda ilk olarak bakılacak özellik hızı ve güvenilirliğidir, ama hem de güvenilirlik bakımından PINKY Turbo'dan daha iyisi yapılmamış olduğundan, ve bu turbo her tarafta kolaylıkla bulunabildiğinden dolayı bu dizide ağırlık verdiğimiz turbolar, yükleme sırasında değişik efektler kullanabilenler. İki ay önce tam olarak nasıl çalıştığını anlattığım turbo kaydedici - yükleyici programın en büyük özelliği- yüzlerce kere tekrarlamama rağmen gene söylüyorum- interrupt'ları kullanarak yükleme yapması ve interrupt düzeyi dışındaki programların çalışmasına müsaade etmesi... Tercümesi: Bu turbo yükleyicisini kullandığınızda, yükleme sırasında blok veya bayt saydırabilir, ekranda yazı kaydırabilir, müzik çalabilirsiniz. Ekran açık olarak yükleme yapıldığı için ekran grafikleri veya yazı koyup yüklemek ise çocuk oyuncağı. Bu tür özellikleri kullanmak için interrupt kullanmadan program yazabilmek (interrupt'ları kapatmadan tabii ki) dışında başka bir şeye ihtiyacınız yok. Eğer yazı kaydırmak gibi bazı temel programlara ihtiyacınız varsa, Makina Dilinin Püf Noktaları yazısının önceki bölümlerini okumanızı Öneririm. Bu ay turbonun bu yeni özelliğini kullanmayı öğreneceğiz. Her tarafta kolaylıkla bulunduğu için basit bir ekran açık yükleyici yapmak istemedim. Programın biraz daha süslü ola-: bilmesi için 512 karakterden (maksimum) oluşmuş mesajları kaydırabilen ve yüklemekte olduğu baytı da ekrana yazabilen bir turbo yapmak iyi bir fikir gibi göründü bana. Eğer bir yazi kaydırma rutininin nasıl yapılacağını bilmiyorsanız, bu yazıyı okuyarak bir taşla iki kuş vurabilirsiniz. Biraz üstten anlatmakla birlikte, yazı kaydırma rutininin temel çalışma prensibini de anlatacağım burada çünkü. İşin en zor kısmını geçtik artık. Ne yapacağımıza karar verdiğimiz andan itibaren yapacak çok fazla bir şey kalmıyor geriye çünkü. Programa ilk olarak turboyu hiç hesaba katmadan başlayabilirsiniz. Mesela yüklenmekte olan baytı yazacak olan rutini hazırlayalım birlikte: Turbonun yükleyicisini incelediyseniz, yüklenmekte olan baytın $FB- $FC adreslerinde yüksek-alçak bayt (high-low bayt) formatında ($0213 için $13, $FC'de $02) bulunduğunu farketmişsinizdir. Yani yüklenmekte olan baytın hangi adrese yazılacağını ekrana yazmak için bu iki baytın değerini gerekli şekilde |hex (hexadecimal — onaltılık) ya da onluk düzende) ekrana yazmanız yeterlidir. Daha kısa sürmesi, daha basit olması ve en önemlisi işimize yaraması sebebiyle bu yazıda, baytı onaltılık düzende ekrana yazacak bir rutin kullanmaya karar verdim. Artık iki baytın değerini ekrana dört onaltılık hanede yazacak bir rutin yazmamız gerektiğini biliyoruz. Onaltılık düzenin her hanesi dört bitten oluşur. Bu nedenle baytların değerlerini dörder bit halinde işlememiz gerekir. İlk olarak yüksek baytı ($FC) A register'ına alırız ve atarız (PHA). Daha sonra AND $0F komutuyla son dört biti izole ederiz. Bu değeri Y”'ye alıp, 0-15 arası sayıların harf ve rakam karşılıkları bulunan bir tablodan ekrana basılacak karakteri okuyabiliriz. Yani Y'ye 0- 15 arası bir değer alıp (geri kalan bitleri atmıştık hatırlarsanız), tablo başından Y indeksiyle (Lda $XXXX,Y) aldığımız karakteri ekranda gerekli yere (son hanenin adresi) yazarsak ilk haneyi halletmiş oluruz. Bu işi yapan programı aşağıda görebilirsiniz.

Se OL o oll day”

Şimdi ikinci haneyi halletmemiz gerekli. Yapmamız gereken şey bayt değerini Stack'ten alıp (PLA) bitlerini dört kere sağa kaydırmak (ROL). Bunun sonucunda yüksek baytın ikinci hanesini de ilki gibi indeksleyebileceğimiz bir yere aldık. Bu haneyi de benzer şekilde ekrana yazıp, aynı işlemi alçak bayt ($FB) için de yapsak yüklenmekte olan adresi ekrana yazmış oluruz. Programın geri kalan kısmı da şöyle:

Program 2:
«3 Pla

Onaltı baytlık bir tablo ve kısa bir program kullanarak iki baytlık bir adresi ekrana kolayca yazabildik. Eğer bu adresi onluk düzende yazmaya kalksaydık, bilgisayarınız için oldukça zor olan ondalık sayılarla işlem yapmanız gerekecekti, ve bunun sonucu olarak ya program yavaş çalışacaktı ya da çok uzun sürecekti. Bu da hex sayılarla çalışmak için yeterli bir sebep sanırım... Programımız artık adresi yazabildiğine göre programımızı genişleterek yazı kaydırma işini de halletmemiz gerekli. Bu iş için interrupt'ı kullanamadığımıza göre, $DO12'deki değer istediğimiz yere gelene kadar (son satıra güvenli bir uzaklık bırakarak kadar beklemeye karar verdim. Bu uzaklık kolaylıkla azaltılabilir.) beklememiz gerekiyor. Bu değer geçildiği anda ise $DO16'nın ilk üç bitini gerekli miktarda ayarlayarak ekranın kayma miktarını ayarlıyoruz. Daha sonra ekran bitene kadar bekliyoruz ($DO11'in son bitine bakarak bunu kolaylıkla anlayabiliriz). Şimdi kayan yazıların bir sonraki taramadaki durumlarını ayarlamamız gerekiyor. Bu iş için $CA10'da bulunan ekran kayma miktarını azaltmamız gerekli ilk önce. Hız ayarının da rahatlıkla yapılabilmesi için $CA21'de bulunan $CA10 değerini azaltan rutine sıçrıyoruz. Bu rutinden geri dönünce bu değerin sıfırdan küçük olup olmadığını kontrol ediyoruz. Eğer sıfırı geçmediysek, ekrandaki karakterlerin yana kaydırabilecek ($DO16 ile) yeri kalmış demektir, doğrudan diğer işlemlere geçiyoruz. Eğer sıfırdan küçük bir sayı varsa, en alt satırdaki karakterleri bir sola alıyoruz.

Bundan sonra, karakter tablosundan sıradaki harfi alıp satırın en sonuna yazıyoruz. Tabi ki bu tablodan okuma işlemini yaparken yazının bitmiş olma olasılığını da gözardı etmeyerek okunan baytın sıfır olup olmadığına bakıyoruz. Eğer sıfır değilse daha karakterler bitmemiş demektir. Sıfır olduysa tabloyu başa alıp ($C959 adresinde bulunan LDA komutunun $COSA, $C9SB adreslerinde bulunan hedef adresini $CDOO'ı gösterecek şekilde ayarlayarak) yeni bir karakter okuyoruz ve bunu ekrana yazıyoruz. Karakter okuduğumuza göre tablo adresini bir ileri almamız gerekli. Bu işi de INC $COSA, ge-

Program 3:
Lda #$EL
And
Sta $DO16
,C942 Lda
Jsr $CA21
$C97A; 'dan büyükse $COTA
, C932.Cmp $DO12
Bes $€932; El'den küçükse bekle
Lda $DO16
Ora $CA10
Bpl $C942; Ekranın sonunu 1 bekle

rekliyse INC $C95B komutlarıyla yaptıktan sonra, ekran X pozisyonunu tekrar $07 yapıyoruz. Artık kayma işlemini tamamladık.

Bu aşamada kendi kendinize bulmanızı istediğim iki şey var. Birincisi bu ekran karakterleri kaydırma işini yapmak için neden ekranın bitmesini beklediğimiz (kolay olanı da bu). İkincisi de yukarıdaki programda hemen göze çarpmayacak, bazı durumlarda programın çalışmasını etkilemeyecek ufak hatayı bulmanız. Bunların cevaplarını'gelecek sayıda açıklayacağım. Ekranın her taramasında en az bir kere $02'nin 0'dan farklı bir sayı olmasını kontrol etmeniz gerekir. Eğer $02'nin değeri hâlâ 0 ise yüklemenize devam ediyorsunuz demektir, işinizi yapmaya devam edebilirsiniz. Eğer $02'de O'dan farklı bir değer varsa yüklemenin sonuna geldiniz demektir. Hemen KERNAL/ı yerine koyun, 02'yi sıfırlayın (gelecekte belki bir daha kullanmak zorunda kalırsınız) ve aşağıda göreceğiniz dört Jsr komutuyla giriş-çıkış alanlarını, Basic alanlarını, interrupt'ları vb. düzenleyin ve $FB,$FC adreslerinden program bitiş adresini alarak $2D, $2E'ye yazın. Bu sayede BASIC programlarının hatasız çalışmasını sağladıktan sonra, SAZAF' ye sıçrayarak programı çalıştırın.

Program 5:
Lda $02
Bne $C986
Jmp $C900
., C986 Lda #$07 ;ROM''lar yerine...
Sta $01
Lda #500
Sta $02
$FF84; Ortalığı
Jsr $EDİS; toparlayan
Jsr SEDA3; KERNAL
Rutinleri
Lda
Sta $2D
Lda $FC
Sta $2E
Jsr $A659
JMP ŞAZAE,RUNİ!

Buraya kadar olan kısımda pek bir problem çıktığını sanmıyorum. Asıl problemlerle bu programı turbonun içine yerleştirirken karşılaşacaksınız. İlk problem bu programı teybe ne şekilde kaydedeceğinizle ilgili...Eğer turbosuz şekilde kaydederseniz, yaklaşık yedi blokluk programın yüklenasıl programın yüklenmesinden fazla zaman alır. Turbolu kayıt yapmak ise asıl yerine ve sıfırıncı sayfa değerlerine dokunmadan bu programın kaydedilmesi işi zorlaştırır. Tabi ki pek fazla bir seçme şansımız olduğunu söyleyemem. Bir programı yüklemek için saatlerce bekleyeceksiniz turbo kullanmanızın anlamı kalmayacağından bu programcığı datalarıyla beraber turbolu şekilde kaydedecek bir yöntem bulmalıyız. Tabi bu işi yapınca programın turbo yükleme yapabilir bir hale sokulması gerekir. Çünkü yükleyiciniz ilk olarak bu programı yükleyecek ve çalıştıracaktır. Bu durumda program çalışmadan önce yükleyiciyi tekrar aktive edecek bir yöntem bulmamız gerekiyor. Bu işi $02A7'de bulunan programın aynısını kullanarak yapabiliriz. Hatta yeni bir yükleme rutini kullanmaya gerek yok, çünkü $0351'de duran rutin kullanıma açık bir şekilde sizi bekliyor. Yani $FEFFE, $FFFF gibi adresleri, zamanlayıcıları vb. ayarlayıp interrupt'ı serbest bırakırsak ve bu işi yaptıktan sonra yazı kaydırma vb. işleri yapacak olan programa sıçrarsak ilk zorluğu aşmış oluyoruz. Bu işi yapan programı aşabulabilirsiniz:

Gördüğünüz gibi program yalnızca zamanlayıcıları ayarlamakla kalmıyor, hazırlanıp $C300'a yerleştirilmiş ekranı da $0400'a taşıyor. Bu sayede bomboş bir ekranla yükleme yapmak derdinden kurtuluyorsunuz. Geriye halletmemiz gereken bir tek problem kalıyor. Yükleyiciyi normal olarak kaydettikten sonra, asıl kaydedilecek programdan önce şov programını turbolu olarak kaydetmemiz gerekiyor. Bu işi yapabilmek için normal olarak tüm turbo programı bu kayıt işini yapabilecek şekilde yeniden yazılır, fakat hiç birimiz bu kadar ugraşmak istemediğimize göre daha basit bir yöntemle, hazırda duran bir programa ek yapmayı göstereceğim. İlk olarak programı baştan listeleyin. Yapılacak işin tam olarak nerede yapılması gerektiğini bulun. Bu işten sonra dönülecek program parçasına ait üç baytlık bi komut arayın, eğer bulamazsanız, toplam üç bayt açabilecek şekilde komutların bayt sayılarını toplayın (dikkat, LDA SPP; STA $YYYY gibi komut dizilerini bölmemeye çalışın. Eğer bölmek zorundaysanız, sıçrâyacağınız programın en başına STA $YYYY komutunu girin). Üç baytı size sağlayacak ardışık komutları bir kağıda yazın ve bu komutların üzerine

JSR $XXXX yazın. Üçüncü bayttan sonra artan baytları NOP ile doldurun. Şimdi de yakın bir adreste boş bellek arayın. Bulacağınız yeterli miktarda boş belleğe programı yazın ve RIS'den hemen önce kağıda yazdığınız komutları girin. RTS ile geri döndüğünüzde program normal çalışmasına devam edecektir. Şimdi de bu teorinin uygulamasını yapalım. Yani turbomuza ilk parçayı kaydedecek yeri bu yöntemle ekleyelim: İlk olarak $C000'dan itibaren programı listeleyin ve nerede ne işlem yapıldığını bulmaya çalışın. Turbo kayıda geçilen noktayı saptayın. Rutininize sıçrayabileceğiniz yer, $CO60 adresinde bulunan JSR (Save) komutundan sonra gelen birkaç komuttan herhangi biri olabilir. Ben $CO71 adresinde bulunan

LDY $00
LDX

komutlarını seçtim. İlk parçayı turbolu şekilde kaydedecek programı $C260'a yerleştirmeyi uygun buldum, çünkü turbo programı $C2XXX gibi bir yerde sona eriyordu. Daha sonra

$COT1'e
Jsr $C260
Nop

komutlarını ekledim. Böylece programda hiçbir bayt kaydırma işlemi yapmadan turbo kaydın öncesine istediğim program parçasını ekledim. Buradan sonra program doğru olarak çalıştığı için, daha ilerisini incelememize pek gerek kalmaz. Fakat aynı işi yaptırmaya çalışacağımızdan dolayı, hangi adreslerde ne tür işler yapan rutinlerin bulunduğunu incelemenin yararlı olacağına karar verdim ve şu adresleri, yaptıkları işlerle beraber kağıdıma not ettim: $C0C6: zamanlayıcıları, ROM durumlarını vb. ayarlama ve Turbo'lu baytların öncesine yazılan HEADER'ı kaydetme (ayrıntılı bilgi için iki sayı önceki yazıma bakın.). $C0F5: Bir baytı turbo hızında kasede yazma. $C109: Bir biti turbolu biçimde yazma/son biti kapatma. Tabii ki bu rutini daha önceden açıklamış olduğum için incelemek oldukça kolay oldu. Aksi bir durumda JSR'den sonraki alt-programların ne tür işlere yaradığını bulmak pek de kolay değildir. Gelelim $C260'a yazacağımız programa: İlk olarak $FC, $FD baytlarına (gereksiz baytlar seçmeye dikkat edin, $FB kontrol toplamı hesabı için kullanılıyor) kaydedilecek programın başlangıç adresini koyuyoruz (alçak-yüksek bayt formatında). Daha sonra $C0C6'ya sıçrayarak Header'ı teybe kaydediyoruz. İlk dört baytın başlangıç-bitiş adreslerini sakladığını bildiğimizden, değeri belli olan bu baytları $XX; JSR $C0F5 komutuyla kasete de yazıyoruz. Örneğimizde kaydedilen ve yüklenen programların yeri aynı olmasına rağmen, $C300'daki bir programı $0801'e vb. yükletebilirdik. Bunun için teybe yazılan ilk dört baytın ilk iki baytını $01, $08 yapmamız yeterliydi. Daha ilerde turbolarınızı KERNAL altına yerleştirdiğinizde bu özellikten yararlanabilirsiniz.

Şimdi de şov 4 yükleyici programı kasede kaydedebiliriz. -Fakat bu işe girişmeden önce kontrol toplamını sıfırlamayı unutmayın (bu kontrolü kaldırmama rağmen uyumluluk açısından kasede yazılmasında yarar var). Şimdi Y'yi sıfırlayıp, $FC/$FD'nin gösterdiği yeri kasede kaydetmeye başlama vakti geldi. her bayttan sonra Y”'yi bir arttırıp bitiş adresi olan $C295'e gidip, kayıt adresinin yüksek baytı olan $FD'nin değerini kontrol etmemiz gerekli. Eğer $FD henüz $CA olmadıysa, yazma rutinine geri dönmeliyiz. Eğer $CA28'e ulaştıysak kontrol toplamı baytını da kasede yazıp X ve Y”'yi sıfırlayıp (o komutları çıkarmıştık hatırlarsınız) geri dönebiliriz. Ama ben bu işi yapmadan önce 65536'dan geri sayarak bir miktar beklemeyi, böylece iki turbo parçasını birbirinden uzaklaştırmayı tercih ettim. Bu sayma işlemi sonunda X ve Y değerlerinin sıfır olduğuna dikkatinizi çekerim! Eğer Y sayacı (kaydedilen adresin altak baytı) 0 olduysa, bir sonraki yüksek bayta geçmemiz gerekir. Yani $FD'nin değerini bir arttırmalıyız. 8. Programda görüldüğü gibi Eh pek de zorlanmadık sanırım. Yani yaptığımız işler genelde hamallığı çok, fakat tasarlaması kolay şeylerdi. Tabi ki bütün işler bitmedi. Şimdi de yükleyici programın çalışma adreslerini bizimkinin başlangıç adresi olan $C9BO0'ı gösterecek şekilde ayarlamalıyız. Ben bu arada kontrol toplamı kontrolünü de ortadan kaldırdım. Nasılsa orada durmasının pek de gereği yoktu. İsteyenler program isminin uzunluğuna dikkat ederek bu kontrolü geri koyabilirler. Eğer ekran düzenini değiştirmek isterseniz normal karakterlerle ekrana bir şeyler çizin ve geçen ay Döküm Eki'nde yayınladığımız RE (STORE) yardımıyla tasarımınızı $C300'a transfer edin. $C7000'dan itibaren iki blokluk bölgeyi de istediğiniz gibi yazılarınızla doldurabilirsiniz. Yazılarınızın bitişini $00'la belirtmeyi unutmayın! Size önerim, döküm ekinde programı yazdıktan sonra, bu yazıyı o programı da inceleyerek tekrar okumanızdır. Bu sayede çoğu yerde ne demek istediğimi çok daha rahat anlayabilirsiniz. Eğer yeni fikirleriniz veya sorunlarınız olursa Vedat Hallaç adına dergimize yazmaktan çekinmeyin. Hepinize iyi tatiller.