Commodore sayı 4, sayfa 29
Sayfanın metni

Sayfa 29

Düşünürseniz, tıpkı ilkokuldan bildiğimiz çıkarma işlemi gibi, yalnız eldeleri onar onar değil, 256'şar alıyoruz. Bu arada, sırası gelmişken bir konuya daha değinelim. Geçen sayıda kısaca gördüğümüz CMP (CoMPare, kıyasla) komutu (hatırlayan var mı?), aslında SBC'nin bir benzeri. Aradaki fark şu: SBC, parametrede belirtilen sayıyı akümülatörden eksiltiyor ve sonucu akümülatörde gösteriyor. CMP da aynı işlemi yapıyor, ama akümülatörün içeriğini değiştirmiyor. Her iki durumda da, parametrede belirtilen rakam akümülatördeki rakamdan büyükse Carry sıfırlanıyor; eşit veya küçükse Carry 1 oluyor. Dolayısıyla:

LDA xx CMP yy BCC zz —— IF xx THEN zz LDA xx CMP yy BCS xx 7 —yy THEN zz LDA xx SBC yy BCC zz ——— Ax xx—yy:1F

A < 0 THEN zz

Bit Kaydırmaca

Gelgelelim çarpma ve bölme işlemlerine. Burada bizi acı bir sürpriz bekliyor; zira makina dilinde çarpma ve bölme işlemleri yok. A*B'yi elde etmek için yöntem, A'yı B defa kendi kendisiyle toplamak. Daha bilimsel, üstelik daha keyifli bir yöntem ise bitlerle oynamak. Buraya kadar bitlere bulaşmadan sürdürdüğümüz makina dili dizimiz, artık bit hesabına girmek zorunda. Hepimizin malumu ki, 0-255 arası herhangi bir sayı, iki haneli bir hex rakamla belirtilebileceği gibi, sekiz haneli bir binary rakamla da belirtilebilir. Örneğin, $A9 = 10101001, $87 = 10000111 filan. Onlu sistemde nasıl bir sayıyı onla çarpmak için arkasına bir sıfır eklemek yeterliyse, ikili sistemde de ikiyle çarpmak için arkaya sıfır eklemek yeterli. 1=1; 10=2; 100=4; 1000 = 8. Eğer rakamlarımız sekiz haneyle sınırlıysa, demek ki, ikiyle çarpmak için tüm bitleri bir sola kaydırıp arkada boşalan yere sıfır eklemek gerekiyor.

1010€109ü#E-i

ASL (Arithmetic Shift Left) komutu, akümülatörde bulunan veya parametrede belirtilen byte'ı bir sola kaydırıyor; soldan taşan biti de Carry'e atıyor. Böylece rakam ikiyle çarpılmış oluyor, fakat sonuç 256'dan büyükse, fazlalık 256 Carry'de gözüküyor. LSR (Logical Shift Right), ASL'nin tersi: Rakamı sağa kaydırıp ikiye bölmüş oluyor. Sağdan taşan kesir, Carry'e geçiyor. ASL ve LSR, parametresiz kullanıldıklarında, akümülatörün yükünü sağa sola kaydırıyorlar. Parametreli çeşitlerinden ise, mutlak, zero page, indeksli vb. bilumum adresleme imkânları mevcut. ROL ve ROR, ASL ve LSR'nin ikiz kardeşleri. Şu farkla ki, sola veya sağa kaydırmakla boşalan haneye 0 koyacakları yerde, Carry'de o an bulunan değer'i koyuyorlar. Yani, bir şeyi üst üste 8 kez ASL'lenince sonuç daima sıfır; oysa 9 kez üst üste ROL edilen sayı sonuçta ilk baştaki haline dönüyor. Çünkü, ilk ROL'de soldan taşan bit, bir sonraki ROL'de sağdan gene kuyruğa giriyor. Peki $47 ile $A5'i nasıl çarpacağız? $47'yi ikiliye çevirdiğimizde, arif olan cevabı hemen bilebilir. $47 -> 01000111. Sıfırları atlayıp birleri sayarsak, $47 (onlu 73), = $40 + $04 + $02 + $01 veya onlu 64+4+2+1. Yani bir sayıyı sırasıyla 1, 2, 4 ve 64'le çarpıp sonuçları toplamak, o sayıyı $47 ile çarpmakla eşdeğer. O halde işlem şundan ibaret:

00000001 * A5 * 00000010 * 00000100 * A5* 01000000

$47'yi $60 adresine, $A5'i iki byte'lık bir rakam olarak $61-62'ye koyup, iki byte'lık sonucu $63-64'te elde eden bir program şöyle olabilir:

1184190816 101001600

HAZIRLIK KISMI A9 A7 LDA code 85 STA $68 cag4 AS AZ LDA 85 62 STA $62 A9 BE LDA Dü SA 48

casa 85 61 STA $61 85 63 STA $63 COBE 85 STA $64 İŞLEM A5 62 LDA $62 Ccoi2? 46 LSR #68 gö ga — BCC Ccai6 65 64 ADC $64 85 64 STA $64 AS S1 LDA $61 & ADC $63 CO1E 85 63 STA $63 ceza “6 ASL co22 86 si ROL $61 ca24 A5 66 LDA co26 DO E8 — BNE scaiğ ceza sa BRK

C012'deki işlem, $60 adresindeki $47 sayısını tüp gibi sıkıp, sağdan bir biti-

ni taşıyor. Eğer taşan bit sıfırsa (carry clear), yapacak tek iş, $61-62'deki sayıyı ikiyle çarpıp devam etmek. Yok birse, (carry set) $61-62'de habire ikiye çarpılan sayının mevcut hali, $63-64'teki sonuç hanesine ekleniyor. İlk geçişte taşan 1 ve $A5 sonuca ekleniyor. İkinci geçişte de taşan 1, eklenen $A5*2. Üçüncüde yine 1, eklenen $A5*2*2. Dördüncü, beşinci ve altıncıda sıfır. Yedincide yine 1, eklenen $A5*2*2*2*2*2*2. C024-26, tüp sıkılıp bitti mi diye soruyor. Bitmediyse (BNE) baştan. Bittiyse, bu seferlik BRK.

* * «*

Ananevi yarışmamız bu sefer epeyce yüklü: MADDE 1: $AF85A6 ile $3120C0'yu toplayan programımızın X indeksli olarak kısa yazılışı. MADDE 2: $47 ile $A5'in çarpım sonucu. BÜYÜK İKRAMİYE: Tek byte'lık herhangi bir bölme işlemini, virgülden sonra sekiz bite kadar hesaplayan program.

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