Bu sayfadaki yazılar
Sayfanın metni
Sayfa 16
masını söylemekle yetineceğiz. Şu kadarını belirtmek yeter:
1. Karakter tanımlarını içeren ROM bellek, normal olarak bilgisayara gözükmez; sadece VIC tarafından görülür. Bu ROM'daki bilgileri RAM'a taşımak için, önce 01 adresindeki 2 numaralı bit'i sıfırlayıp, karakter ROM'unu bilgisayarca görülebilir hale getirmemiz gerekir.
2. Kendi karakter tanımlarımızı koymak için RAM'daki en uygun bölge olarak, serbest belleğin sonuna yakın bir yer, yani 32768-34815 (onaltılı 8000-87FF) bölgesini seçeceğiz. Önce ROM'daki bilgileri buraya taşıyıp, sonra bunları keyfimizce değiştirebileceğiz.
3. VIC'in ulaşabileceği toplam bellek alanı sadece 16 Kbyte olduğundan, sistem ekran belleğini de 1024-2023'teki normal yerinden, yukarıdakine yakın bir yere, örneğin 34816-35815'e (onaltılı 8800-8BE7) taşımamız gerekecek. Bu taşıma işlemi, VIC'i kontrol eden 53272 no.lu bellek adresine bir-iki POKE'la hallolacak.
PROGRAMIN İŞLEYİŞİ
Program RUN edildiğinde, ilk önce sırasıyla iki karakter vermenizi isteyerek, bunların büyütülmüş şekillerini ekrandaki kutulara getirecek. Bu noktada, sol kutudaki birinci karakteri yeniden çizip değiştirmeniz mümkün.
Değiştirme sırasında, + tuşunu bir nokta eklemek, aralık çubuğu veya [DEL] tuşunu bir nokta silmek, [CRSR] tuşlarını da yer değiştirmek için kullanabilirsiniz.
f tuşu, ikinci kutudaki şekli birinci kutuya taşıyacaktır. Bu işlem, örneğin c yerine ç şeklini oluştururken kolaylık sağlamak için düşünülmüştür.
Çizim sırasında beğenmediğiniz bir şekli ilk durumuna geri döndürmek için [CLR/HOME], yeni bir karakteri seçmek için ise [SHIFT] [CLR/HOME] tuşlarını kullanabilirsiniz.
[RETURN] tuşu, sol kutuda o anda bulunan şekli, sol kutunun yanında görülen karakterin yerine belleğe geçirecektir.
Yaratttığınız yeni karakter setlerini saklamak veya kasetten tekrar yüklemek için s ve l tuşlarını kullanın. Tabii disketten çalışıyorsanız, 270 ve 300'üncü satırlardaki OPEN 2,1,2'yi OPEN 2,8,2 olarak değiştirmeniz gerekiyor.
q tuşu ile programdan çıkmak istediğinizde, normal karakter setine dönmek isteyip istemediğiniz sorulacaktır. Cevabınız hayır ise, programı silseniz bile, yeni karakter setiniz geçerliliğini koruyacak, başka programlarda da kullanılabilecektir.
PROGRAMIN AÇIKLAMASI
Basıc Bölümü
Satır 10; 800-814 satırlarda DATA olarak verilen üç makine dili alt-programı, 49152 ($C000) adresinden başlayarak belleğe POKE ET.
20: SYS komutu, makine dilindeki alt-programlar için GOSUB komutunun eşidir. 49152'deki ilk alt-programın açıklaması için aşağıya bakın. Ondan sonraki iki POKE, ekran rengini bej, yazı rengini siyah yapıyor.
30-50: ekranı sil, 8*8 iki kutu çiz.
60-70: IN değişkeni bir 'flag' olarak kullanılmıştır. IN=0 ise, yeniden tanımlama için iki yeni karakter istenmekte, IN=1 ise doğrudan doğruya menüye geçilmektedir.
80-99: Bir döngü içinde, c$(1) ve c$(2) adında iki karakter alınıyor. ASCII kodları 0-31 ve 128-160 arasında olan karakterler, RETURN, DELETE gibi kontrol karakterleri olduğundan kaale alınmıyor.
95-96: Basılan karakterin POKE kodunu buluyor. CHR$(147), 'CURSOR geri' karakteri. Sonra ç önemli bellek adresi: 648, ekranın bellekteki 256 byte'lık sayfaların kaçıncısından başladığını (normali 4, şimdi ise 136), 214, cursor'un bulunduğu satırı, 211 ise cursor'un bulunduğu sütunu içeriyor. Her sayfa 256, her satır da 40 byte olduğundan, cursor'un yeri = sayfa*256+satır*40+sütun. Bu adrese PEEK ettiğimizde, son bastığımız karakterin POKE değerini buluyoruz.
100-105: Bulunan POKE değerlerini 253 ($FD) adresinde saklayıp, 49269 ($C075)'teki, karakterlerin büyütülmüş şekillerini çizen ikinci makine dili alt-programı çalıştırıyor; karakterlerin normal boyu şekillerini kutuların sol yanına POKE et.
49279'a ($C07F) POKE'lar, doğruca makine dili programın içine müdahale ederek, büyütülmüş şekillerin ekranda nereye çıkacağını belirliyor (ikincisi ilkinden 13 hane sonra).
Burada POKE'un üç ayrı kullanımını görüyoruz. 253 adresi, bellekte boş bir hane. Buraya, makine dili programın kullanması için bir veri yerleştiriyoruz. 49152'den başlayan 257 byte'ı makine dili programımız için kullandık. Buraya bir POKE, doğrudan doğruya m.d. programı değiştirmek demek. 34816'dan başlayan 1000 byte ise ekran belleği; buraya POKE edilenler doğruca ekrana çıkıyor.
110-180: Menü. İlk başta [HOME] ve 10 tane CURSOR aşağı var.
182-188 biraz karışık. GET komutuyla bir tuşa basılmasını beklerken normal cursor kaybolduğundan, burada sahte bir cursor yaratıyoruz.
Önce pozisyon: [HOME], bir aşağı, üç sola.
185'te, 96'dakine benzer bir yöntemle bu pozisyonun adresini hesaplayıp CC değişkenine veriyoruz: 209-210'da, bulunulan satırın başının adresi, 211'de ise cursor sütunu var. Sonra CC'de o anda bulunan karakteri PP'de saklayıp, yerine 42 numaralı karakter olan yıldızı koyuyoruz. Herhangi bir tuşa basıldığında, yıldızın yerine tekrar eskiden o hanede bulunan PP karakteri geliyor.
190-220: Basılan tuş CURSOR aşağı, yukarı, geri, ileri veya space ise aynen bas. [DEL] (karakter no. 20) ise, bir geri, space, bir geri bas. + ise, [RVS ON], space, [RVS OFF], yani siyah bir kutu bas.
230: Basılan tuş CHR$(13), yani [RETURN] ise, ilk verdiğimiz karakterin POKE kodunu 253'te sakla, sol kutudaki büyütülmüş şekli yeni karakter tanımı olarak belleğe geçiren 49330'daki ($C0B2) üçüncü makine dili programa git, yeni baştan iki karakter almak üzere başa dön.
240-250: T'ye basılmışsa, [HOME], önüç kez CURSOR ileri, [DELETE] ve bir CURSOR aşağı bas. Bu işlemi 10 kez tekrarla. Böylece ilk on satırı önüçer hane sola kaydırıp, ikinci kutuyu birincisinin yerine taşı.
260-265: [HOME]'a basılmışsa (karakter 19) verilen karakterleri saklı tutarak, [CLR]'a basılmışsa (karakter 147) yeni iki karakter almak üzere başa dön.
270-320: SAVE ve LOAD. OPEN komutundaki ikinci rakam, teyp için 1, disk için 8 olacaktır. Yapılan 32768-34815 ($8000-87FF) bölgesindeki karakter tanımlarını sırasıyla bir dosyaya saklamak veya sırasıyla dosyadan okumaktır.
330: Basılan tuş, buraya kadar sayılan seçeneklerden hiçbiri değil ve Q da değilse, 185'e dönüp tekrar başka bir tuşa basılmasını bekle. Eğer Q ise, evet/hayır sorusunu sor, cevap evetse 49152'deki ilk m.d. programa gidip, normal karakter setini tekrar ROM'dan okut.
MAKİNE DİLİ BÖLÜMLER
Birinci alt-program: C000-C052
Bu rutin, ROM bellekteki karakter tanımlarını RAM'a taşıyor ve VIC'e, görüntü için gerekli bilgileri ROM'dan değil! RAM'dan almasını bildiriyor.
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 17
Birkaç önemli sistem adresi:
$34 ve $38: BASIC program metni ile değişkenlerinin üst sınırı. Buraya 80 (yani 8000) koyarak BASIC serbest belleğinden 8 Kilobyte eksiltiyoruz.
$01, ikinci bit: Character ROM Enable/Disable. Bu bit 1 iken bilgisayar D800-DFFF bölgesinde renk belleği ile Input/Output sicillerini, sıfırken karakter ROM'unu görür. İnput/Output sicillerini devreden çıkarmadan önce, bilgisayara SEI komutuyla "input/output'a boş ver" demek şart. Yoksa makine saçmalar. CLI komutu ise, "tekrar input/output'larla ilgilen" demek.
$DD02: Data Port A yön sicili. Son iki bit'e 1 yazılırsa $DD00'daki Data Port'una yazmak, 0 yazılırsa Data Port'u okumak mümkün olur.
$DD00, 0 ve 1'inci bit: Buraya verilen değer, VIC'in 16'şar Kilobyte'lık 4 bellek 'bankasından' hangisini göreceğini belirler. 01, $8000-BFFF arasındaki üçüncü bankayı seçer.
$D018: VIC kontrol sicili. Sol 4 bit ekran belleğinin, sağ 4 bit karakter tanımlarının VIC'in gördüğü bellek bankası içindeki konumunu belirler. Buraya yazılan 20 değeri, ekranı $8000+0800'e, karakter tanımlarını da $8000+0000'a yerleştirir.
$0288: Bilgisayara ekran belleğinin ilk sayfasını bildirir. $88, yani $8800, yani 34816.
$D800-DFFF arasındaki ROM'da, POKE kodlarındaki sırayla, 128 normal ve 128 reverse karakter için, 8'er byte'dan 8*256 byte tanım bulunur.
Karakter tanımlarını $D800'den $8000'e taşıma işlemi $C00F-$C024 arasında gerçekleşiyor. Dikkat edilirse, ilk sayfa ($0100 yani 256 parça) taşındıktan sonra, program kendi kendini değiştirerek $C010 ve $C013'teki adresleri sırasıyla D900 ve 8100, DA00 ve 8200 vb. yapıyor; en sonda da ($C048-C051) programa tekrar başlangıç değerlerini veriyor.
İkinci alt-program ($C075-C0B1):
Hem bu, hem üçüncü program tarafından ana program tarafından $FD (253) adresine konulan karakter kodunu alıp, karakterleri tanımlayan 8 byte'lık dizinin başladığı yeri hesaplıyor.
Başlangıç adresi = $8000 + n*8
Adresi oluşturan iki byte'ı hesaplamak için, n*8 256'ya bölünür; çıkan tamsayı + $80 büyük haneyi, kalan + 00 da küçük haneyi oluşturur.
Örneğin karakter kodumuz 5 (küçük e harfi) olsun.
4*8=40$28 80 00 + 00 28 ADRES = 80 28 ($8028 = 32808)
Onaltılı aritmetikte bu işlemi şöyle yapıyoruz:
LSR işlemi, bir byte'ın tüm bitlerini birer sağa kaydırır; böylece o sayıyı ikiye böler. *8/256 için beş LSR gerekir.
5 = 00000101 = $05 LSR 00000010 = $02 LSR 00000001 = $01 LSR 00000000 = $00 LSR 00000000 = $00 LSR 00000000 = $00 Sonuç $00, $80+00 = 80.
ASL işlemi, bir byte'ın tüm bitlerini birer sola kaydırır; böylece o sayıyı ikiyle çarpar. Üç ASL = *8.
00000101 = $05 = 5 ASL 00001010 = $0A = 10 ASL 00010100 = $14 = 20 ASL 00101000 = $28 = 40
Doğrudan doğruya onaltılı sistemde düşünmenin kolaylıklarını görmek için şimdi de büyük E (kodu 69) harfini alalım.
69 = 01000101 = $45 = 69 LSR 00100010 = $22 = 34 LSR 00010001 = $11 = 17 LSR 00001000 = $08 = 8 LSR 00000100 = $04 = 4 LSR 00000010 = $02 = 2 Sonuç $02, $80+02 = $82
Üç ASL işleminin sonucu: $28 (40) Büyük E'nin adresi: $8228 (33320)
C061 alt-rutini, $FD'deki karakterin tanımının bulunduğu küçük hanesini $FB, büyük hanesini de $FC'ye koyup dönüyor.
$C078-$C0A5'da olanlar şunlar:
$C07A: $FE adresine $80, yani ikili 1000 0000 rakamını koy. Bu rakamı 8 kez LSR'ledikçe, sırasıyla ikinci, üçüncü... biti 1 olan birer rakam elde edeceğiz.
$C07E: X=13 veya X=0. BASIC programının 100-105 satırlarına bakın.
$C080: $FB-FC'de gösterilen adresten Y ötedeki byte'ı al. Y'nın değeri 0'dan 7'ye kadar sırayla artacaktır.
$C082: Esas işlem: Aldığın byte'ı, $FE'de o an bulunan rakamla AND'le. AND işlemi, birbirine karşılık düşen iki bit de 1 ise 1, yoksa 0 verir.
01000101 AND 10000000 -------- 00000000
01000101 AND 01000000 -------- 01000000
$FE'deki tek biti 1 olan rakamı teker teker sağa kaydırıp, karakteri tanımlayan byte ile AND'layarak, sırayla tüm bitlerin 1 mi, 0 mı olduğunu anlıyoruz.
$C084: Sonuç sıfırsa, space (kodu $20=32) al.
$C086: Sonuç 0 değilse, bir grafik şekil (kodu $66=102) al.
$C08C: $882B'den X öteye (ekranın ikinci satırının 4'üncü hanesinden 0 veya 13 öteye) koy.
$C08F: X'i bir artır; $FE'deki rakamı sağa kaydır. Rakam henüz 8 kez sağa kayıp da sıfırlanmamışsa