Commodore sayı 19, sayfa 18
Sayfanın metni

Sayfa 18

SİC programında makine dili pro: şu cümlelerle işleme koyabilirsiniz:

10 CH-65 : 20 INT (N/256) 30 LSB — N-256/MSB 40 SYS 4892, CH, LSB, MSB

20 ve 30 numaralı satırlar, maksimumu 65535 olan N değerini her biri 0 ile 255 (dahil) arasında değişen tek byte'lık bir niceliğe dönüştürür. CH değişkeni de N kere yazılacak karakterin ASCII kodunu depolar. SYS komutu bilgisayarın 4892'ye atlayıp, oradaki makine dili programını işleme koymasını sağlar. SYS komutunun ardından gelen ilk parametre, makine dili rutininin başlama adresini (4892'yi) temsil etmektedir. Onu izleyen üç parametre ise, makine dili rutini işleme konmadan önce işlemcinin A sicil, X sicil ve Y sicilinde depolanması gerekli değerlerdir. Bütün bu konulara yabancı olduğunuzu varsayarak, önce başlama adreslerinden ve sicillerden biraz söz edelim. BASIC'te, bir programın dizisel akışını değiştirmek için GOTO veya GOSUB komutlarını kullanırız. Hangi komutu kastettiğimizi ise satır numarasıyla belirtiriz. Yani, bilgisayar GOTO 100 cümlesini işleme koyduğunda, bir sonraki komutu almak için 100. satıra atlar. 100. satırın bilgisayar hafızasında nerede olduğunu bilmeyiz; zaten buna gerek de yoktur. Hafızada 100. satırın yerini bulmak BASIC'in görevleri arasındadır. Nitekim, BASIC'e “yüksek düzeyli dil” denmesinin nedeni de, programcıyı hafızada neyin nerede depolandığını takip etmek gibi basit şeylerden kurtarmasıdır. SYS komutu, düşük düzeyde bir dile inmemize olanak verir. BASIC SYS 4892'yi görünce bir sonraki komut için mikroişlemciyi hafızada 4892 adresine atlatır. İşlemci orada PRINT veya GOTO gibi BASIC cümleleri değil, BASIC çeviricisi programına başvurmadan, kendi başına işleme koyabileceği komutlar bulunacaktır. Birazdan, bu konuda örnekler göreceğiz. SYS komutunun bilgisayar 4892'ye sapmadan önce A, X ve Y sicillerine bazı değerler koyduğunu görmüştük. Siciller, tıpkı el kalkülatörlerindeki hafıza işlevi gibi, mikroişlemci içinde okuma-yazma depolarıdır. C-64'te, BASIC programının SYS komutunu işleme koymadan önce A, X ve Y sicillerinin değerlerini hafızada 780, 781 ve 782 konumlarına POKE etmesi gerekir (Bk. C-64 Programcısının Rehberi, s. 318). C-128'de, kayıt değerleri SYS komutuna dahildir.

MAKİNE DİLİ

Makine diline girmeden önce, size bir akıl verelim: C-64 veya C-128 Programcısının Rehberi'nde (kısaca, PRG'de) 5. bölümü bir okuyun. Bu bölüm assembly dilini ve bilgisayarın iç işleyişlerini gayet güzel özetlemektedir. PRG'ler kitap olarak pek net ve tertipli sayılmasalar da, bir sürü temel ve yararlı bilgi içerirler, bir PRG'nız yoksa, gerçek bir kurcalayıcı sayılmazsınız. Kısacası...

Makine dilinin herhalde en zor tarafları (gerek ikili, gerekse onaltılı sayı sistemi ile) adresleme tarzlarıdır. Assembler programı makine dili programlarını yazmanın içerdiği matematiksel yükü biraz hafifletir, ama tamamen ortadan kaldırmaz. Adresleme tarzlarına gelince, yalnız ve yalnız bol zaman ve pratikle tam olarak öğrenebilirsiniz onları. İsimlerini boş verin. Önemli olan işlevleridir. LDA ($3A,X)'e “endeksli dolaylı adresleme” dendiğini bilmek işinize yaramaz, ama bu komut sonucunda A sicilinin tam olarak nereden yüklendiğini bilmek her şeyi değiştirir. Eğer C-64 kullanıyorsanız, C-128'deki HEX komutunun bir benzerini oluşturmak için 1030. satırı GOSUB 2050 yapmanız gerekli. Ayrıca 64'te 2000'de başlayan satırların eklenmesi gerektiğini de unutmayın. 64'te işe başlamak için: 1. Sicim Yükleyici'yi yukarıda anlatıldığı gibi yükleyip uyarlayın. 2. RUN yazarak Sicim Yükleyici'yi işleme koyun. 3. Makine dili monitör programınızı yükleyip geçin. SİCİM utility'si C-64'te, şimdi bulunduğu adres olan 4892'de genellikle aksayabilir. Çünkü, BASIC programları bazen araya karışmaktadır. Bu tartışmada yalnızca programın hafıza içindeki durumuna bakacak, işleme koymaya çalışmayacağız. Programı C-64'te de kullanılabilecek biçimde harekete geçirme çarelerine ise daha ileride bir göz atarız. C-128'de, Sicim Yükle! yazıp sonra da girerek (eğer değişiklik yapmadıysanız, F8'e basmanız gerekli), SİCİM utility'sini incelemeye başlayabilirsiniz. Nereden başlayacağız? Rutinin hafızaya 4892'den ($131C) itibaren yüklendiğini biliyoruz. Bu konumdan disassemble işlemine başlayalım. Önce D 131C (ya da monitörünüzde geçerli olan disassemble komutunu) yazın. SİCİM rutinin ilk komutları

JMP $1324 EOR ($48,X) 91 EOR $E021, Y

O meçhul 299 komutu ilk bakışta aklınızı karıştırabilir. Bu program gerçekten işleme konabilir midir? Bu rutinin ne işe yarayacağı konusunda ilk ipucunu JMP komutundan alıyoruz. Bu komutla, işlemci koşulsuz olarak adres $1324'e atlamaktadır. Böylece EOR (dışlayıcı-OR) komutlarıyla meçhul komut açıklığa kavuşuyor. O bitler muhtemelen gerçekten komut değil de, yalnızca veri değerleridir. Bilgisayar onları işleme koymaz. Doğruca üzerlerinden atlar. Bu varsayımı doğrulamadan önce disassembly işlemine devam edelim. JMP komutu $1324'e gitmiş olduğu için, bu sefer parçalamaya oradan başlıyoruz. Şimdi karşımızdaki gerçek bir programa benziyor. Bunu nasıl anlayabiliriz? Tecrübeli olmak işe yarar tabii, ama her şeyden önce, burada meçhul bit yok. Ayrıca, adres $FFD2'ye yönelik bir takım JSR talimatları görülüyor. Bu adreste, programın içkin bir parçası olan Kernal rutinlerinden biri bulunuyor. Kernal rutinleri her an kullanıma hazır makine dili rutinlerinden oluşur ve makine dili programlarında sıkça geçer. Şimdi, önce 97. sayfadaki Ekran (Dump?) 1'e bir göz atın. Bu tabloda, adres $133B'de bir RTS komutu görüyoruz. RTS komutu, bir altrutinin sonundaki BASIC RETURN cümlesine eşdeğerdir. Bunun SİCİM programının en son komutu olması da mümkündür.

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