Commodore sayı 13, sayfa 22

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 22

Şimdi hafıza ve register'leri bir eksilten komutları görelim.

DEX

Bu komut X-register'inin içeriğini bir eksiltir. Sonuca göre N- ve Z-flag'ları etkilenir. Diyelim ki X-register'inin içeriği $00'dı ve biz eksilttik. Bu durumda $FF elde ederiz ve hiçbir şekilde Carry flag'ı etkilenmez. BASIC'te aynı işi yapan satır şöyle olacaktır.

X-X-I

Tabii negatif sayı diye bir şey söz konusu olmayacaktır.

DEY

Bu komut Y-register'inin içeriğini bir eksiltir. DEX komutu için söylenenler aynen geçerlidir. BASIC'te aynı işi yapan satır:

Y=Y-1 Burada da $00'dan $FF'e geçeriz. DEC

Bu komut belli bir adresteki hafıza biriminin içeriğini bir eksiltmeye yarar. Bu işlem sırasında akümülatör'ün içeriği kesinlikle etkilenmez. INC komutu için söylenenler aynen geçerlidir. Aşağıda komutları, adresleme tiplerini ve komut kodlarını bulacaksınız.

Komut Komut kodu

INX $E8 INY $C8 DEX $CA DEY $88 Adresleme tipi INC DEC absolut $EE $CE absolut X-indeksli $FE $DE 0. sayfa X-indeks $F6 $D6 10. Flag'ları Değiştirme Komutları

Flag'ların durumuna göre programın akışını değiştiren komutlardan başka, kullanıcının flag'ları istediği biçimde değiştirmesini sağlayan komutlar da mevcuttur. Daha evvel de örneklerini gördüğümüz gibi; toplama ve çıkarma işlemlerinden önce bu tip komutları kullanıp C-flag'ının durumu belirlenmelidir. Bu gruptaki komutlar operand'a ihtiyaç göstermezler ve bir Byte'a sığarlar.

Carry flag'ı

SEC (“set carry”) komutu ile C-flag'ı yakılır. CLC (“clear carry”) komutu ile de C-flag'ı söndürülür. SEC komutu her çıkartma işleminden önce, CLC komutu ise her toplama işleminden önce kullanılmalıdır, yoksa yanlış sonuçlar elde ederiz. Tabii birkaç byte genişliğindeki bilgileri toplayıp, çıkarıyorsak ara işlemlerde C-flag'ı ile oynamayın, çünkü C-flag'ı, byte'ların birbirine birleşmesi sırasında gerekli bilgileri içerir. Carry flag'ı yalnızca ilk toplama veya çıkarma işleminden önce belirlenmelidir.

Decimal flag'ı

Bu flag toplama ve çıkarma işlemlerinin bildiğimiz ikili sistemde mi, yoksa ikili kodlanmış ondalık sistemde mi (Binary Coded Decimals, BCD) yapılacağını belirler. BCD modunda işlem yapabilmek için C-flag'ının yanık olması gerekir. Konuya yeterince hakim olmadıkça bu modu kullanmanızı pek tavsiye etmeyiz. Daha ileride yayınlayacağımız “PROGRAMLAMA TEKNİKLERİ” bölümünde, bu modun detaylarını açıklayıp örnek bir program geliştireceğiz. O zamana kadar sabır!.. D-flag'ını yakmak için SED (“set decimal”) komutunu, bu flag'ı söndürmek için ise CLD (“clear decimal”) komutunu kullanacağız.

Interrupt flag'ı

Interrupt denilen olay, programın yürürken, herhangi bir (hardware) donanımın gönderdiği sinyal yüzünden kesilmesi, özel bir program parçasının yürütülmesi, daha sonra da kesilmiş olan programa hiçbir şey yokmuş gibi olduğu gibi geri dönmesidir. Aslında yukarıdaki uzun cümle olayın çok basit bir özetidir. Daha ileride bu olaya çok daha detaylı olarak eğileceğiz. Interrupt flag'ı interrupt'a izin verilip verilmediğini belirler. I-flag'ını yakmak için SEI (“set interrupt disable”) komutunu kullanırız ve durum da interrupt'a izin verilmez. Interrupt'a tekrar izin vermek için I-flag'ı söndürülmelidir. Bunun için CLI (“clear interrupt disable”) komutu kullanılır.

Overflow flag'ı

Overflow flag'ı sadece söndürülebiliyor (Çünkü yakmanın pek bir anlamı yok). Bu işi yapan komut ise CLV (clear overflow). COMMODORE 64'ümüzün ana işlem ünitesi 6510'da bulunmayan, fakat 6502 ana işlem ünitesinde bulunan bir özellikten bahsedelim. Bu flag aynı zamanda ana işlem ünitesinin bir bacağına uygulanan bir sinyal tarafından da yakılabiliyor. Yani programdan bağımsız da etkilenebiliyor bu flag. Tekrar yakılabilmesi için söndürülmesi gerektiğinde CLV komutu kullanılıyor. Bilhassa 1541 Disk-Drive'de çok kullanılan bu özelliğe yazımızın ilerleyen bölümleriyle değineceğiz. Aşağıdaki tabloda komutları ve komut kodlarını bulacaksınız.

Komut Komut kodu CLC $18 SEC $38 CLD $D8 SED $F8 CLI $58 SEI $78 CLV $B8

11. Bit Kaydırma Komutları

6510 ana işlem ünitemizin yürüttüğü başka bir komut grubu daha var ki, bu gruptaki komutlara karşılık gelen BASIC komutları yok, bu grup bit kaydırma komutlarını içeriyor. Sözkonusu işlem sırasında akümülatör'ün, ya da adreslenen hafıza biriminin bit yapısı bir bit sağa veya sola kaydırılır. Şayet kaydırılan şey akümülatör ise, akü adreslemesinden söz ediyoruz. Bu gruptaki komutlar adresleme tipine göre bir, iki, ya da üç byte uzunluğunda olabiliyor. Şayet adresleme tipi bir hafıza elemanını gösteriyorsa, aynen INC ve DEC komutlarındaki oku-değiştir-yaz (Read-Modify-Write) işlemleriyle komut yürütülür. Bu işlem sırasında akümülatör'ün içeriği korunacaktır.

ASL

ASL, anlam olarak “arithmetic shift left'in baş harflerinden oluşmuş bir kısaltmadır. Yapılan işlem şudur: Adreslenen byte'ın içeriği bir bit'lik pozisyon olarak sola kaydırılır. Sıfırıncı bit'in yeri boş kalacağı için oraya “0” yazılır. Yedinci bit'teki bilgi ise dışarda kalır. O da Carry'ye alınır. Diyelim ki akü ile bu işi yaptık. Bir örnekle görelim:

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