Commodore sayı 15, sayfa 27

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 27

LDA #7 STA 55296

Eğer, bu komutları doğrudan bu şekilde verirsek, sadece “?SYNTAX ERROR” elde ederiz. Bunun nedeni ise Commodore 64'ün direkt olarak sadece BASIC komutlarının anlamasıdır. Yani şu anda izlediğimiz yol yanlış olsa gerek. Hangi yolu izleyelim peki?.. Hatırlayacak olursak, makine dili programlar hafızada peşpeşe dizilmiş emir kodlarından ibaretti. Önce, her bir komutun emir kodunu belirleyelim. Bu işlem için, küçük kitapçığımızı kullanacağız. Buradan, LDA komutunun direkt adresleme tipi için SA9 kodunun kullanılacağını görürüz. Bunun hemen arkasından operand byte'ı gelir. Yani $01. STA komutunda ise absolut adresleme tipini kullanmışız. Küçük kitapçığımız kullanacağımız kodun $8D olacağını söylüyor. Bunun da arkasından, kendisine ait operand gelmek zorunda. Şimdi ise operand, bir hafıza elemanının adresi. Yani 16 bitlik bir değer. Bu değeri temsil etmek için, iki adet 8 bitlik değere ayırmamız gerekiyor. İlk önce düşük değerli byte, arkasından yüksek değerli byte takip etmek zorunda. Onaltı bitlik bir değeri iki adet sekiz bitlik değere ayırma işlemi hekzadesimal sayı sistemi kullanıldığında çok daha rahat yapılabiliyor. O yüzden ilk önce onaltı bitlik değerleri hekzadesimale çevirelim. 1024 sayısı hekzadesimal olarak $0400'a karşılık geliyor. 55296 sayısının karşılığı ise $D800. Programımızı bir kere daha, bu sefer hekzadesimal sayı sistemini kullanarak yazahm.

STA $0400 LDA At $07 STA $D800

Onaltı bitlik değerlerimizden ilki olan $0400'ın düşük değerli byte'ının $00, yüksek değerli byte'ının $04 olduğunu görüyoruz. Yani STA $0400 satırı, byte karşılıkları kullanılarak yazıldığında $8D, $00, $04 byte'ları dizisi olduğunu çıkardık. Benzeri bir analizle, programın geri kalan kısmının, yani LDA 4 $07, STA $D800 kısmını S$A9, $07, $8D, $00, $D8 byte'larıyla temsil edebiliyormuşuz. Tüm programımız şu şekil almıştır:

$A9, $01, $8D, $00, $04, SA9, $07, $8D, $00,. $D8

Elde ettiğimiz bu byte dizisini hafızaya yerleştirmemiz gerekiyor. Şimdi bir problemle karşılaşıyoruz. Makine dili programımızı hafızanın neresine koyacağız? Bunun için en uygun yer olarak, $C0O00'dan $CFFF'e kadar uzanan bölge göze çarpıyor. Bu bölgenin en önemli özelliği, işletim sistemi ve BASIC yorumlayıcısı tarafından hiçbir zaman kullanılmaması. Bu bölgenin genişliğinin 4 KByte olduğunu görüyoruz. Oldukça avantajlı bir bölge burası. Fakat, büyük ihtimalle, bu bölgede bir monitor programı çalıştırmak isteyeceksiniz ve monitor programı için ise en ideal bölge burası. O yüzden, ilk başlangıç programımız için daha değişik bir yer önereceğim. Burası, işletim sisteminin ve BASIC yorumlayıcısının erişebileceği bir bölge olmasına karşın, diğer programlarınızla çakışma ihtimali daha az. Ayrıca, bu bölgenin BASIC yorumlayıcısı tarafından bozulması ihtimali de çok uzak. Bunun için oldukça uzun bir BASIC programının oldukça çok işlem yapması gerekiyor ki bu bölgeye erişsin ve programınızı bozsun. Şu anda yazmakta olduğumuz ilk deneme prog- Tamımızda herhalde böyle bir durum sözkonusu olmayacağı için gönlümüz rahat etsin! Şimdi, hekzadesimal modda, baştan aşağı yazdığımız programımızı desimale (ondalığa) çevirelim ki BASIC'ten bu kodları rahatça girebilelim. Çünkü BASIC yorumlayıcımız, sadece ondalık sayıları anlıyor ve bunlarla işlem yapıyor.

169,1,141,0,4,169,7,141,0,216

Şimdi ufak bir BASIC programının bu programı bizi için hafızaya yerleştirmesini isteyelim:

100 FOR 1-0TO9 110 READ A:POKE 6*4096 4 1,A 120 NEXT 130 DATA 169,1,141,0,4,169,7, 141,0,216

Bu programı yazıp RUN komutuyla başlattığımızda, makine dilindeki programımız 6*4096 (—$6000-

21

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