Bu sayfadaki yazılar
Sayfanın metni
Sayfa 12
Eğer ASCII'leri kullanmaya üşeniyorsanız ilk satırınızda bulunacak PRINT içine gerekli mesajı yazın ve bu tablodaki gibi altı çizili bölgeyi istediğiniz yere kopyalayın. (İki $22 baytı arası kopyalanacaktır.)
Eğer Makine dilini kullanırken büyük boyutlarda datayı bir yerden bir yere taşımaya niyetlenirseniz, sıfırıncı sayfadan (zero page) yararlanarak dolaylı indeksleme (indirect indexed) metodunu kullanmalısınız. Bunun yanında datayı yukarıdan aşağı mı yoksa aşağıdan yukarı mı taşıyacağınız sorunu her zaman bulunmaktadır. Kaynak bölgesini kendi içinde bir yerlere taşırken bu sorunla karşılaşırsınız. Mesela $C000-$C100 arası $C001'e taşırken, $C000'dan başlarsanız, arasını $C000'da bulunan baytla doldurursunuz. Nedense gördüğüm tüm programcılarda da (ben dahil) bu ayrıntıyı unutmak gibi bir huy vardır. Ama gerekli bütün ayrıntıları bizim için düşünecek bir ROM rutini sayesinde büyük data bloklarını belleğin içinde oradan oraya taşıyabiliriz.
2. $A3BF; data bloğu taşıma: $A3BF'de yer alan rutin, ($5F-$60)'da başlayıp ($5A-$5B)'ye kadar olan bölgedeki baytları, ($58-$59)'da BİTEN bölgeye taşır. Parantez içinde yazılı olan sıfırıncı sayfa adres çiftleri, içinde alçak-yüksek bayt formatında bulunan sayıların saklandığı adresleri gösterir. En iyisi olayı bir örnekle açıklamak:
komuta gelene kadar buraya yazdığımız değer kayboluyor. Bu yüzden değerleri yerleştirmek ve ROM'a sıçramak için makine dili kullanmamız şart. Diyelim ki karakter setini $2000-$3000 arasına yerleştirmemiz gerekiyor. Yani: Başlangıç: $D000 Bitiş: $E000 Hedefin sonu: $3000
PROGRAM ADI - PROGRAM - 2
00000 R, A: NEXT 00010 00020 00030
SYS 49152
272,25 00040 END
01000
FOR R-O TO A: POKE 491524 POKE 56333,1:POKE 1,3
POKE 1,55: POKE 56333, 129: POKE 53
DATA
KAYNAK BASLANGIC 2. VE 6.
SAYIDA
01010 DATA
1:REM KAYNAK BITIS
SAYIDA 01020
SAYIDA 01030
Bir karakter editörü yapıyorsunuz diyelim. Bu iş için, karakter ROM'unu devreye soktuktan sonra $D000-$DFFF arasını çalışacağınız bölgeye taşımalısınız. Eğer bu işi BASIC'le yapmaya kalkarsanız "50 saniye" mesajını ekrana yazmanız şart olur. Oysa kısacık bir makine dili programı belleğe yerleştirmeyi göze alırsanız, bir saniye geçmeden karakter setini taşıma işini bitirmiş olursunuz. Makine dili programın yaptığı tek iş $58-$60 arasını ayarlayıp ROM'daki rutine sıçramak. Bu işi BASIC'ten yapabiliriz, diye düşünmüştüm ama $60 oldukça sık kullanılan bir adres olduğu için, ROM'u çağıran
DATA 76,191,163
169,0,133,90,169,224,133,9
2. VE 6.
DATA 169,0,133,88,169,48,133,89 :REM HEDEF BITIS
2. VE 86.
Bu taşımayı yaptırmak için ($5F-$60)'a $00-$D0, ($5A-$5B)'ye $00-$E0 ve ($58-$59)'a da $00-$30 verip $A3BF'ye sıçramamız gerekir. Sıçradıktan hemen sonra $2000-$3000 arasında karakter seti yer alacaktır. Program 2'de bu işi yaptıracak olan BASIC programı yer alıyor. Eğer 1000, 1010 ve 1020 numaralı data satırlarında 2. ve 6. baytların değerini ayarlarsanız bu programı genel amaçlı bir data taşıma programı olarak kullanabilirsiniz. Buradaki değerleri ayarlarken, ikinciye adresin alçak baytını, altıncıya ise yüksek baytını yazın. Mesela 49172 adresini yazmak istiyorsanız:
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 13
gıç adreslerini ayarlamakla uğraşmak istemiyorsanız, hata mesajlarının her birinin uzunluğunu sabit tutan rutin adresleri, buradaki sırayı takip eder. Yani $A00C'de bulunan $A831-1 değeri END komu-
Alçak = 49172 AND 255 Yüksek = INT (49172/256) formüllerini kullanabilirsiniz.
PROGRAM ADI - PROGRAM - 3
00000 R, A: NEXT 00020 SYS 49152
00030
FOR TO 26:READ A:POKE 491521
A$>”HAZIR.”: FOR TO 5:POKE 41
NEXT
00040 01000
POKE 1,54: END DATA
169,0,133,95,169,160,133,9
6:REM KAYNAK BASLANGIC 2. VE 6.
SAYIDA 01010
SAYIDA
01020
SAYIDA 01030
BASIC ROM'unda değişiklikler yaparken de bu taşıma işinden yararlanabilirsiniz. İlk olarak $A000-$C000 arasını $A000'a taşırsınız (($58-$59)'a $C000 vererek). Daha sonra POKE 1,54 komutunu kullanarak eski ROM'u devreden çıkarırsınız. Artık ROM'da yapacağınız tüm değişikliklerin sonucunu anında görebilirsiniz. Mesela yukarıdaki program “READY.” yerine “HAZIR.” yazmak için neler yapmanız gerektiğini gösteriyor. BASIC ROM'da değişiklikler yapabilmek için genel olarak nerede neyin bulunduğunu bilmeniz gerekir. Kısaca baş kısımdaki komutların ve hata kodlarının yerleştirilme şeklini anlatacağım, ama asıl detaylı bilgiyi bir monitör programı kullanarak elde edebilirsiniz: $A093-$A127: komutların listesi. Komutun son harfi, gerçek değerinden 128 ($80) fazla olarak yazılır. $A00C-$A051 arasında bulunan rutin adresleri, buradaki sırayı takip eder. Yani $A00C'de bulunan $A831-1 değeri END komu-
DATA 76,191,163
DATA 169,0,133,90,169,192,133,9 1:REM KAYNAK BITIS
2. VE 6.
DATA 169,0,133,88,169,192,133,8 9 :REM HEDEF BITIS
2. VE 6
tunu işletecek rutinin adresini gösterir. Bu yüzden sırayı değiştirmeyin. Daha da önemlisi, kesinlikle tablonun toplam uzunluğunu değiştirmeye kalkmayın. Eğer bunu denerseniz, verdiğiniz ilk komutta sistemi ne kadar artistik bir şekilde göçertebileceğinizi öğrenirsiniz. $A129-$A19C: Fonksiyon isimleri tablosu. Fonksiyon isimlerinin son harfi gerçek değerinden 128 fazladır. Bu fonksiyonların rutin adresleri de $A052-$A07F arasında aynı sırayla tutulmaktadır. $A129-$A19C: Hata mesajlarının yazı dataları. Bu dataları değiştirerek Türkçe hata mesajlı, Türkçe komutlu bir BASIC yapabilirsiniz. Unutmayın; her hata cümlesinin son harfi normal değerinden
128 fazladır. Ama hata mesajlarını olduğu gibi değiştirdiğiniz zaman
(toplam uzunluğa dokunmadan) işiniz tam bitmiş sayılmaz, çünkü $A328-$A363 arasındaki tabloda, hata mesajlarının data başlangıç adresi yer alır. Yeni mesaj başlatmaya çalışın. $A364-$A389: Genel yazılar için harf datası. Mesela $A376'da: $0D $0A $A4 $00 bulunur. Baştaki ve sondaki $0D-$0A'lar satır başına gelinmesi için gereklidir. En sonda bulunan $00 ise mesajın sona erdiğini gösterir. ve sonrası, ROM'un genel işlemleri yerine getirebilmesi için gerekli rutinleri içerir (demin kullandığımız $AB1E gibi). Makine dilinin asıl tercih sebebinin çalışma hızı olduğunu söylemiştim. Ama tamsayılarla yapılan toplama-çıkarma işlemlerinden başka bir işlem yapmaya kalktığınızda canınızın çıkacağını da belirtmiştim. Mesela makine dilinde SIN(x) fonksiyonunu gerçekleştirmek imkansızdır. Ancak belli bir dereceye kadar yaklaştırma yapılabilir. Tabii ki bütün bu yaklaştırma işlemleri toplama, çıkarma, çarpma ve bölme işlemleri ROM'da yer almaktadır ama bu rutinler genel olarak floating point (yüzen nokta, yani ondalıklı sayı) aritmetiği kullanmaktadır. Bu yüzden ilk olarak öğrenmemiz gereken şey: Ondalıklı Sayı Aritmetiği Hepimiz onluk düzene alışkın olduğumuz için işe onluk düzenle ondalıklı sayılar anlatarak başlamak istiyorum: Ondalık düzende kullanılan herhangi bir sayı 1-10 arası bir sayı olan K ile 10^x'in çarpımı olarak yazılabilir. Örnek vermek gerekirse: