Bu sayfadaki yazılar
Sayfanın metni
Sayfa 48
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.
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 49
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 kayıdın öncesine is-
49 tediğ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: $COC6: zamanlayıcıları, ROM durumlarını vb. ayarlama ve Turbo'lu baytların öncesine yazılan HEA-DER'ı kaydetme (ayrıntılı bilgi için iki sayı önceki yazıma bakın.). $COF5: Bir baytı turbo hızında kasede yazma. $C109: Bir biti turbolu biçimde yazma/son biti kapatma. Tabi 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 $COC6'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 $COF5 komutuyla kasete de yazıyoruz. Örneğimizde kaydedilen ve yüklenen programların yeri aynı olmasına rağmen, $C3000'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.