Commodore sayı 2, sayfa 45

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 45

Geçen sayıda, makina dilinin, her biri birer sayıyla ifade edilen birtakım komut kodlarıyla, bunları izleyen bir veya iki byte'lık değerlerden (parametrelerden) oluştuğunu anlatıp, içinde 7 farklı komut bulunan bir programcık verdik. Sıra geldi temel birkaç komutu öğrenmeye.

MADDE 1: Makina dilinin mantığı, BASIC'ten daha basittir. Komutların büyük çoğunluğu, şu işlerden sadece birini yapar: a) Bellekte bir sayıyı alıp başka bir adrese koymak (POKE ve PEEK gibi). b) Bir sayı üzerinde basit aritmetik veya mantıksal işlemler yapmak. c) Program içinde bir yerden öbürüne atlamak (GOTO, GOSUB, IF.... GOTO gibi). MADDE 2: BASIC'teki değişkenlerin görevini, makina dilinde bir bakıma gören, sayıları yükleyip, aynen veya değiştirerek başka yere taşıyan üç adet REGISTER mevcuttur. Atalarımız bu kavramı Osmanlıca'ya merkep (yük taşıyıcı) diye çevirmişler; ben de öyle yapacağım. Baş merkebin adı akümülatör olup, A diye kısaltılır. Yardımcıları X ve Y'dir. Üçünün huyu, yapabilecekleri işler biraz farklıdır. - Hal böyle olunca, makina dilinin temel birkaç komutu da ortaya çıkmış oluyor: LDA - Load A: Baş merkebi yükle. LDA'yı izleyen bir veya iki değer, yüklenecek malın ne olduğunu gösterir. LDY ve LDX: Yardımcılarını yükle. Yukarıdaki gibi. STA - Store A: Baş merkebin yükünü boşalt. Bu komutu daima, akümülatördeki değerin nereye konulacağını gösteren bir bellek adresi izler. STY ve STX: Y ve X'in değerini boşalt. STA gibi. Merkeplere yüklenecek malın cinsi, 0 ile 255 arası bir sayıdır. Sayının hangi sayı olduğunu söylemenin ise birkaç yolu vardır: 1) Sayıyı, olduğu gibi belirtmek. Buna dolaysız (immediate) yöntem adı verilir. 2) Merkeplerden birine, belli bir bellek adresinde ne sayı varsa onu yüklenmesini söylemek. Buna adresleme deniyor. Adreslemenin 8 çeşidi var. Altısını bu sayıda göreceğiz. LDA, LDY ve LDX komutlarının, demek ki, ilke olarak toplam 9'ar çeşidi mümkün. STA, STY ve STX'te ise dolaysız yöntem söz konusu değil; çünkü bu komutlar zaten merkebe yüklenmiş olan sayıyı, her ne ise, belli bir adrese koymayı emrediyorlar. Şimdi şunu iyice anlayalım: Makina dilinde bu komutların farklı çeşitlerinin her biri ayrı bir sayısal koduyla belirtiliyor. Yani dolaysız LDA ile, mutlak adresli LDA, X-indeksli adresli LDA, dolaylı adresli LDA, vb. farklı kodlara sahip. Bu kodlara göre, komutu izleyen parametrenin sayı mı, adres mi, neyin nesi olduğunu makina anlayabiliyor. A9 rakamı (desimal olarak ne ediyor?) dolaysız LDA demek. Haliyle, sadece 1 byte parametre alıyor.

A9 00—-LDA $00— Akkümülatöre O yükle A0 Dolaysız LDY demek. 1 byte pa- rametre alıyor. A0 25—LDY # $25-Y'ye 25 yükle. A2 Dolaysız LDX demek. A2 FF-LDX $SFF-X'İ FFle.

Assembly dilinde # işareti, izleyen rakamın dolaysız bir rakam olduğunu, yani adres no'su olmadığını belirtir. $ ise hex demek. Yukarıda örnekteki # $25, bizim bildiğimiz yirmibeş değil, hex 25, yani

ADRESLEME YÖNTEMLERİ

Adresleme çeşitlerine geçmeden önce, evvela; MADDE 3: 6510 mikroişlemcisinin tüm adresleri iki byte'lık rakamlarla numaralanmıştır. En küçük adres 0000, en büyük adres FFFF (yani 65535)'tir. Makina dilinde, bu adresler daima ters sırayla, yani önce küçük byte, sonra büyük byte olarak yazılır.

Hex 1234 (yani 4660) numaralı adres, makina dilinde 34 12 diye yazılır. Hex CO00 (49152) adresi, 00 CO olarak belirtilir. ADRESLEME ÇEŞİDİ 1: En basiti, mutlak adresleme. Komutu, alçak-yüksek iki byte halinde yazılmış bir adres izler. AD, mutlak adresli LDA komutunun kodudur; iki byte parametre alır.

AD 00 CO—LDA $C000- CO00 adresinde hangi sayı varsa o sayıyı akkümülatöre yükle, 80, mutlak adresli STA komutu kodudur. 80 01 CO-STA $CO0O1 — Akkümülatörde ne varsa C00 adresine koy.

ADRESLEME ÇEŞİTLERİ 2 VE 3: X ve Y indeksli Komutu izleyen iki byte'lik adresten X veya Y kadar ötesinde adrese baktırır.

80, X indeksli LDA komutunun sayısal kodudur. Anlamı şudur: X'te o anda hangi sayı varsa, LDA komutunu izleyen adresten o kadar sonraki adresteki sayıyı akkümülatöre yükle! Örnek:

A2 10 :LDX #510 BD 00CO LDA $C000,X-— Aküye

C040 adresindeki sayıyı yükle.

Ne işe yarar bu? Bakalım. Örneğin bellekte belli bir noktadan başlayarak bir dizi sayıdan oluşan bir tablomuz var. Programın, bu sayıları teker teker okuyup belli bir işleme sokmasını istiyoruz. Her bir sayı için LDA adres 1, LDA adres 2.... yazmaktansa, şunu yaparız: Önce sıfırlarız. Programa LDA adres 1,X deriz. Adres 0'da bulunan sayı işlendikten sonra, 1 arftırip programı bir döngüye sokarız. LDA adres 1,X komutu bu sefer Adres 414 41'- deki sayıyı okur. İşlem yapılır, X tekrar bir artıp 2 olur. Döngü başa döner, bu kez 2'deki sayı okunur; ve bÖylece devam eder. Olayın, BASIC'teki FOR... NEXT döngüleriyle benzerliğini hemen gördünüz inşallah.

—> FOR X-OTOLİMİT LDA $ADRES.X —-) 4 X) İŞLEM —> İŞLEM ARTIR —» BAŞADÖN — NEXT

ADRESLEME ÇEŞİDİ 4: Zero page adresleme. Belleğin 0000 ile OOFF arasındaki ilk 256 adresi “Sıfırıncı Sayfa” diye bilinir.

Sıfır sayfadaki adresleri normal ikibyte formatla belirtmek yerine, sadece bir byte olarak göstermek, programlamada önemli kolaylıklar sağlar. Kolaylıkların ne olduğunu peyderpey göreceğiz, aceleye gerek yok. Zero page adresleme, tıpkı mutlak adresleme gibi olup, tek farklı sadece arasındaki bellek mahallesiyle ilgili olması ve iki yerine bir byte parametre olmasıdır.

AS — LDA mutlak zero page AS 45 — LDA $45 adresindeki malı merkebe yükle. Aynı komutu, tabii, AD 45 00 diye vermek de mümkün.

ADRESLEME ÇEŞİTLERİ 5 VE 6: Zero page X ve Y indeksli. Tıpkı normal X ve Y indeksli gibi, sadece zero page adresler için ve tek byte parametreli. B6 60 —LDX $60,y -60 numaralı haneden y ötedeki hanenin yükünü X'e devret.

45

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