1 Haziran 1986 Tarihli Commodore Gazetesi Sayfa 29

1 Haziran 1986 tarihli Commodore Gazetesi Sayfa 29
Metin içeriği (otomatik olarak oluşturulmuştur)

Düşünürseniz, tıpkı ilkokuldan bildi- ğimiz çıkarma işlemi gibi, yalnız elde- leri onar onar değil, 256'şar alıyoruz. Bu arada, sırası gelmişken bir konu- ya daha değinelim. Geçen sayıda kı- saca gördüğümüz CMP (CoMPare, kı- yasla) komutu (hatırlayan var mı?), as- lı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 ay- nı işlemi yapıyor, ama akümülatörün içeriğini değiştirmiyor. Her iki durum- da 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 x x CMP yy BCC 22 —— F xx ÜyyTHEN zz LDA xx CMP yy BCS zz——— IF xx ) —yy THEN zz LDA xx SBC vyy BCC zz ——— A— xx-yy:lF A <0 THEN zz Bit Kaydırmaca Gelgelelim çarpma ve bölme işlem- lerine. Burada bizi acı bir sürpriz bek- liyor; zira makina dilinde çarpma ve bölme işlemleri yok. A*B'yi elde etmek için yöntem, A'yı B defa kendi kendi- siyle topblamak. Daha bilimsel, üstelik daha keyifli bir yöntem ise bitlerle oy- namak. Buraya kadar bitlere bulaş- madan sürdürdüğümüz makina dili dizimiz, artık bit hesabına girmek zo- runda, Hepimizin malümu ki, 0-255 arası herhangi bir sayı, iki haneli bir hex ra- kamla belirtilebileceği gibi, sekiz ha- neli bir binary rakamla da belirtilebi- lir. Örneğin, SA9—10101001, $87- 40000111 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 ek- lemek yeterli. 1—1; 10—2; 100—4; 1000 — 8. Eğer rakamlarımız sekiz ha- neyle sınırlıysa, demek ki, ikiyle çarp- mak için tüm bitleri bir sola kaydırıp arkada boşalan yere sıfır eklemek ge- rekiyor. ASL (Arithmetic Shift Left) komutu, akümülatörde bulunan veya para- metrede belirtilen byte'ı bir sola kay- dı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'nın ter- si: 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ık- larında, akümülatörün yükünü sağa sola kaydıriyorlar. Parametreli çeşitle- rinden ise, mutlak, zero page, indek- sli vb. bilumum adresleme imkânları mevcut. ROL ve ROR, ASL ve LSR'nın ikiz kar- deşleri. Şu farkla ki, sola veya sağa kaydırmakla boşalan haneye 0 koya- cakları 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 sa- yı sonuçta İlk baştaki haline dönüyor. Çünkü, ilk ROL'de soldan taşan bit, bir sonraki ROL'de sağdan gene kuyru- ga giriyor. Peki $47 ile SAS'ı nasıl çarpacağız? S47'yi ikiliye çevirdiğimizde, arif olan cevabı hemen (/1) bilebilir. $47 ->01000111. Sıfırları atlayıp di- rekleri sayarsak, $47 (onlu 73), - $404 04402401 veya onlu 6444424 1. Yani bir sayıyı sırasıyla 4, 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: SAS*4A7— A5 * DO0OODOO1 * AS5 * 00000010 * A5* 00000100 * AS* 01000000 47'yi $60 adresine, AS'i iki byte'lık bir rakam olarak $61-62'ye koyup, İki byte'lik sonucu $63-64'te elde eden bir program şöyle olabilir: HAZIRLIK KISMI c A9 47 LDA HSA7 cogo2 85 6ö STA $68 cgg4 A9 AZ LDA #SFAS Cd6 85 62 STA $62 cogg A9 Bü LDA HS00 A211091601*#*2-0 11810016 1iğdiğdifxszc-i 18d1İ€didA 1010010€ü*E-İ Bl1U001d0AA --$569x2- DZ --$DE*Es1 94 --$944x2-1 48 caoA 85 61 STA $61 caec 85 63 STA $63 COBE 85 &4 STA $64 İŞLEM Cai0 A5 &2 LDA #62 cei2 46 68 LSR #6a co14 sa gA Bcc scaza Cca16 65 64 — ADC &64 Cce18 85 B4 STA $64 ColA AS 61 LDA $61 Ccoic 65 &6& — ADC $638 CO1E 85 563 STA $63 Ccöz6 86 6& ASL $62 Cö2z2 26 6i ROL $61 caz4 A5 G6f LDAR $68 Co26 D E8 BNE $CBi1f Ccöz8 Ga BRK C012'deki işlem, $60 adresindeki 47 sayısını tüp gibi sıkıp, sağdan bir bifti- “ ni taşıyor. Eğer taşan hit sıfırsa (carry clear), yapacak tek iş, $61-62'deki sa- yıyı ikiyle çarpıp devam etmek. Yok birse, (carry set) $61-62'de habire ikiy- le çarpılan sayının mevcut hali, $63- 64'teki sonuç hanesine ekleniyor. İlk geçişte taşan 1 ve O0AS5 sonuca ek- leniyor. İkinci geçişte de taşan 1, ek- lenen O0A5*2. Üçüncüde yine 1, ek- lenen O0A5*2*2. Dördüncü, beşinci ve altıncıda sıfır. Yedincide yine 1, ek- lenen O0A5*2*2*2*2*2'2. CO24-26, tüp sıkılıp bitti mi diye so- ruyor, Bitmediyse (BNE) baştan. Bittiyse, bu seferlik BRK. .. * Ananevi yarışmamız bu sefer epey- ce yüklü: MADDE1: SAF8SAC ile 3120CO0'yu toplayan programımızın X indeksli olarak kısa yazılışı. MADDE 2: $47 ile $AS'In çarpım so- NuCcU. BÜYÜK İKRAMİYE: Tek byte'lık herhan- gi bir bölme işlemini, virgülden sonra sekiz bite kadar hesaplayan prog- ram

Bu sayıdan diğer sayfalar: