Commodore sayı 65, sayfa 49

Bu sayfadaki yazılar

Sayfanın metni

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.

Klavyeyle gezinmek için ← ve → tuşları.