Program Döküm Eki sayı 1, sayfa 17
Sayfanın metni

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

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