Bu sayfadaki yazılar
Sayfanın metni
Sayfa 25
Bu şekilde komutumuz 3 bayt işgal etmektedir ve bir sonraki serbest bellek adresi $1505'dir. Basic ile ilgilenmiş olanlar 01'in A harfinin ekran kodu olduğunu bilirler. Ekranın sol üst köşesinde beliren A harfini istesek başka bir renge de boyayabiliriz. Ekran renk kodları ise C-64'ün belleğinde $D800 adresinden itibaren yer almaktadır. Bunun için programımıza aşağıdaki satırları ekleyelim:
A 1505 LDA # $00 A 1507 STA $ D800
Bundan sonra yazacağımız satır $150A adresinde olmalıdır. Bu sefer programımızı bitirmek için BRK komutunu kullanmayacağız, zira her makine dili programın bitiminde register göstergesiyle karşılaşmak istenilmez. Bunun için yeni bir komut kullanacağız:
RTS “Return from Subroutine” veya alt programdan dönüş anlamına gelmektedir. Bu komut kullanılırken ardında herhangi bir parametre yer almaz. Bilgisayar RTS komutu kullanıldığında gideceği adresi Stack-Pointer'dan öğrenir. Şu satırla programımızı bitirelim:
A ISOA RTS
Monitörden çıkmamışsak G 1500 ile, Basic'e dönmüşsek programı SYS 5376 ile çalıştıralım. Ekranın sağ üst köşesinde siyah bir A harfi gözükecektir.
Bu programı doğrudan Basic kullanarak da yazabiliriz, fakat teker teker her komutun desimal karşılığını hesaplamalıyız. Sonuçta aşağıdaki Basic program ortaya çıkacaktır.
10 FOR TO 5386: READ A: POKE I,A: NEXT I: END
20 DATA 169,1,141,0,4,169,0,141,0,216,96 Dört yeni komut:
LDA ve STA'nın kombinasyonu Basic'teki POKE komutuna karşılık gelmektedir. Assembler'da bir sayı doğrudan doğruya bir bayta yazılamaz, bu iş için her seferinde akümülatör kullanılmalıdır. Makine dilinde akümülatörle aynı görevi gören iki register vardır: X ve Y registerleri. Bunlar için ayrıca LDX (X registerini yükle), STX (X registerini boşalt), LDY (Y registerini doldur), STY (Y registerini boşalt) komutları mevcuttur. Aşağıdaki programda şu ana kadar tanıştığımız tüm komutlar kullanılmıştır.
A 1500 LDA # $01 A 1502 LDX # $00 A 1504 LDY #$02 A 1506 STA $0400 A 1509 STX $D800 A 1S0C STY $0401 A 150F STX $D801 A 1512 STA $0402 A 1515 STX $D802 A 1515 RTS
Beklendiği gibi bu program ekranın sağ üst köşesine “ABA” harflerini basacaktır. Burada X register STX komutu ile üç defa okunmuştur. Şu ana dek LDA komutunu sadece dolaysız adresleme yöntemi ile kullandık. Şimdi isterseniz akümülatörü STA komutundan tanıdığımız mutlak adresleme yöntemi ile yükleyelim.
A 1518 LDA $D800
Bu şekilde $D800 adresinde kayıtlı olan değer akümülatöre yüklenecektir. Bu değer $1509'da sıfır değeri almıştır. Yine devam edelim:
A 151B STA $0403 A STX $D803 A 1521 RTS
SYS 5376 ile programı çalıştırdığınızda ekranın sol üst köşesinde daha önce beliren üç harfin yanına bir “Ğ” işareti eklenecektir. LDA komutunu dolaysız adresleme yöntemi ile kullandığımızda (örneğin LDA #$01) hafızada 2 bayt işgal ettiğini daha önce belirtmiştik. Mutlak adresleme yöntemi kullanıldığında ise (örneğin LDA $D800) bu iş için 3 bayt harcanacaktır. Zaten hemen hemen tüm monitör programları bir Assembler satırı yazılıp RETURN'e basıldığında o satırın onaltılık sayı sistemindeki kodları hemen yanında gösterilir. Örneğin LDA #$01 ve LDA $D800 komutları şu şekilde gösterilecektir:
1500 A9 01 LDA $ $01 İSI8$ADOOD8 — LDA $D800 Her satırın başındaki ilk sayı LDA
komutuna aittir, fakat görüldüğü gibi
“ bunlar farklıdır. Buradan şu sonucu çıkarabiliriz: Onaltılık sistemdeki bir kod hem makine dilinde bir komutu, hem de kullanılan adresleme yöntemini belirtmektedir. Aynı şekilde LDX ve LDY için de dolaysız ve mutlak adresleme yöntemleri mevcuttur. STX ve STY için dolaysız adresleme kullanılmaz. Şu ana dek öğrendiğimiz komutların adresleme yöntemleri ve onaltılık sistemdeki kodları Resim 1'deki tabloda gösterilmiştir. Tablonun son sütununda her komutun statüs registerinde etkilediği göstergeler (flag) belirtilmiştir. Sondan bir önceki sütunda ise her komutun yorumlanabilmesi için harcanan süre yer almaktadır. Burada birim olarak çevrim (cycle) sayısı kullanılmıştır. Her bir çevrimin 1 mikrosaniye olduğu düşünülürse yukarıdaki programımız için 48 mikrosaniye sürecektir. Aynı programın Basic karşılığı ise aşağı yukarı 100 kat fazla zaman (0,05 saniye) harcayacaktır.
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 24
A 1502 BRK ile programımızı bitirebiliriz. Şimdi hafızada $1500 adresinden başlayan bu ilk programımızı çalıştırmalıyız. Bu iş için birçok monitör programında aşağıdaki satır kullanılır:
1500
Eğer Basic'ten çalıştırmak istersek SYS 5376 yazmalıyız ($1500'ün desimal karşılığı 5376'dır). Yukarıdaki yöntemlerden biriyle programı işlettiğinizde ekrana register tablosu gelecektir. Bu tabloyla daha önce monitör programını ilk kez çalıştırdığımızda karşılaşmıştık. Şimdi registerlerin aldığı değerlere bir bakalım. Akümülatörün değeri 01, program sayacının değeri 1502'dir.
Statüs registerinde ise Break Bit'i dı- şındaki tüm Bit'ler O'dır. Programımızda ufak bir değişiklik yapalım: A 1500 LDA # $00 A 1502 BRK
Programı tekrar işlettiğimizde program sayacı 1503, akümülatör 00 olacaktır. Statüs registerinde ise “Zero-Flag” yani “sıfır göstergesi” de 1 değerini alacaktır. Şimdi son olarak akümülatöre $FF değerini yükleyelim:
A 1500 LDA # $FF A 1502 BRK
Programı tekrar çalıştırdığınızda akümülatörün ve program sayacının beklenen değerleri almasına karşılık statüs registerindeki 7. Bit'in 1 değerini alacağını göreceğiz. Bu bit “Negatif Flag” diye adlandırılır ve bir işlemin sonucunun artı veya eksi olup olmadığını gösterir. Peki, akümülatörde $FF veya desimal 255 değeri varsa, neden statüs registeri akümülatörün değerini eksi olarak gösteriyor? Bu bilmecenin çözümü için daha bir süre beklememiz gerekecek. Yalnız burada hemen şunu belirtelim: Eğer bir sayının 7. Bit'i 0 değilse statüs registerindeki Negatif Flag 1 değerini alır. Bu konuya daha sonra negatif ikilik sayıları incelerken değineceğiz. Şimdi statüs registerinin Bit'lerini teker teker ele alalım: NV-BDIZC 76543210
7) N (negatif): Bir önceki işlemler negatif mi? 6) V (overflow): Bir önceki işlemin sonucu 127'den büyük mü? 5) -boş- daima 1 değerini taşır. 4) B (break): Program kesintiye uğramış mı? 3) D (decimal): İşlemci desimal işlem modunda mı? 2) I (interrupt — kesinti): Interrupt durdurulmuş mu? 1) Z (Zero): Bir önceki işlemin sonucu sıfır mı? 0) C (Carry): Bir önceki toplama, çıkarma veya kıyaslama işleminde kalan var mı?
Mutlak adresleme:
STA “Store Accumulator”, yani akümülatördeki değeri belleğe yükle anlamına gelmektedir. Bu komutu kullanarak akümülatördeki değeri ekran belleğinin ilk baytına ($0400) kaydedelim:
A 1500 LDA # $01 A 1502 STA $0400
STA komutu ile yeni bir adresleme yöntemi ile tanışıyoruz: Mutlak Adresleme. Bu adresleme yönteminin başlıca özelliği hafızada iki bayt kullanmasıdır. Yukarıdaki program hafızada şu şekilde yer alır:
1500 LDA 1501 $ 01 1502 STA 1503 $00 1504 $04
ASSEMBLER
KOMUT LDA
LDX LDY STA STX
STY RTS
Adresleme Yöntemi Kodu Etkilediği Gösterge
Dolaysız 2 Mutlak 4 Dolaysız A2 2 Mutlak AE 4 Dolaysız A0 2 Mutlak AC 4 Mutlak 8D 4 Mutlak 8E 4 Mutlak 8C 4 - 60 6