C64 Türkiye sayı 6, sayfa 7
Sayfanın metni

Sayfa 7

Sıradaki JSR komutu ile bir gezintiye çıkalım. Önce CMP #$0A ile karşılaştırma yapalım ve BCC NUMBER komutuna gelelim. BCC komutu ile daha önceki CMP komutunun sonucuna göre işlem yapıyoruz ve aküdeki değer, karşılaştırma yaptığımız değerden küçükse NUMBER kısmına gidiyoruz. Fakat burada aküdeki değer $B (11) olduğu için bir sonraki komuta geçiyoruz. Önce CLC ile “carry” bitini sıfırlayalım. Sonra ADC #$07 ile aküdeki değeri $7 ile toplayalım. Sonuç $12 (18) olur ve yine aküde tutulur. Devam ediyoruz. Bir CLC ve ADC #$30 ile aküdeki değer $12 + $30 = $42 olur. Daha sonra JSR $FFD2 komutu ile aküdeki değeri ekrana basıyoruz. Acaba gerçekten doğru mu? Eğer ASCII kodlara bakarsanız $42=”B” demektir. Bu arada CLC kullanmazsak ne olur? Sonuç yanlış çıkabilir. ADC komutu şöyle çalışır.

AKÜDEKİ DEĞER + CARRY BİTİ + EKLENECEK SAYI = SONUÇ tekrar aküde tutulur. Buna göre CLC komutuyla Carry biti 0 yapıldıktan sonra toplama yapılırsa $0B + 0 + $07 = $12 ve devam edersek $12 + 0 + $30 = $42 olur. Eğer CLC kullanmazsak sonuç aşağıdaki gibi olur.

$0B + x + $7 = SONUÇ Æ Burada “x” 0 veya 1 olabilir ve sonuç $12 veya $13 olur. Bunun sonucunda programımız istediğimiz gibi çalışmaz.

Bu kısa bilgiden sonra RTS komutuyla kaldığımız yerden devam ediyoruz ve geri dönüş yaparak JSR’den sonraki komutu işletiyoruz. Aküye tekrar adresteki değeri yani $B3’ü yüklüyoruz. AND #$0F ile 7654 nolu bitleri sıfırlayarak sadece 3210 nolu bitleri dikkate alıyoruz. Bu arada AND komutuyla ilgili olarak bilgilerimizi tazeleyelim. AND komutu ile işleme sokulan bitlerin değerleri “1” ise sonuç “1”, herhangi bir bit “0” ise sonuç “0” olur. Yani 0 AND 0 = 0, 0 AND 1 = 0, 1 AND 0 = 0 ve 1 AND 1 = 1 olur. Bu bilgilerin ışığında bizim AND #$0F ile nasıl bir sonuç elde ediyoruz inceleyelim.

AKÜ Æ $B3 Æ %10110011 SAYI Æ $0F Æ %00001111 SONUÇ Æ $03 Æ %00000011 Æ Sonuç aküde tutulur.

Devam ediyoruz ve tekrar CMP #$0A ve BCC NUMBER komutlarına geldik. BCC komutu programda karşılaştırma sonrası “...den küçükse” şartı için kullanılmaktadır ve burada $0A’dan küçükse NUMBER kısmına gidilecektir. Aküdeki sayımız $03 ve dolayısıyla $0A’dan küçüktür. NUMBER kısmında CLC ve ADC #$30 komutları ile aküyü $30 ile toplayıp $33 sayısını elde ediyoruz ve JSR $FFD2 ile ASCII kodu $33 sayısı olan “3” rakamını ekrana yazdırıyoruz. Son olarak RTS komutuyla işimizi bitiriyoruz.

Ön bilgi:

BCC Æ Küçükse; BCS Æ Büyük veya eşitse; BEQ Æ Eşitse; BNE Æ Eşit değilse;

şartlarının kontrolü için kullanılır.

YAZDIRMA RUTİNİ (2. YÖNTEM)

Bazen bir problemin birden fazla çözümü olabilir. Bu nedenle aynı işi yapan bir rutin daha veriyoruz. Fakat bu rutinde, önceki gibi karşılaştırma, toplama vs. gibi işlerle uğraşmayacağız.

*=$0801

.word nextline .word 2004 ; 2004 .byte $9e ; SYS .text "2061" ; 2061 .byte 0 ; komutu nextline .word 0

mem_read lda adres ; hafızadan bir byte oku pha ; yığına at

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