Commodore sayı 4, sayfa 28
Sayfanın metni

Sayfa 28

SAÇMALIK NO 1: Makina dilinde $00-7F arası rakamlar pozitif, $80-FF arası rakamlar negatif sayılır. Tabii hemen dikkat ettiniz (mi?), $80 ve üstü rakamların ortak özelliği, ikili sistemde ifade edildiklerinde

$80= 10000000= 128

Bunun neden negatif olduğunu bugüne kadar anlayabilmiş değilim. SAÇMALIK NO 2: Bunu geçen ayın 4'üncü Anayasa maddesinde de görmüştük. Makina dilinde bir rakamın alabileceği en yüksek değer $FF (255) olduğundan, bu rakamı izleyen değer 256 değil, 0'dır! Yalnız nasıl olmuşsa bir kolaylık düşünmüşler, CARRY (kalan, elde var) diye bir şey icat etmişler. Şöyle ki, herhangi bir hesap sırasında sonuç $FF'ı aşıp sıfırlanırsa, CARRY 0 iken 1 oluyor. Ama CARRY bir tek bit; yani 1 iken 2 filan olmuyor. Yaptığı, sadece, “elde var 256” diye bir şeyi akılda tutmak. Carry ile ilgili iki faydalı komut:

SEC (kodu: 38) SEt Carry —Carry'i 1 yap. CLC (kodu: 18) CLear Carry —Carry'i sıfırla

İki komut daha: BCS (B0) Branch on Carry Set —Bir önceki işlemin sonucunda kalan varsa, parametrenin gösterdiği yere atla. BCC (90) Branch on Carry Clear —öncekinin tersi. Hazır yeri gelmişken devam edelim: BPL (10) Branch if Plus —önceki işlemin sonucu, yukarıdaki saçma mantığa göre pozitifse, dallan. BMI (30) Branch if Minus — negatifse dallan. Tüm “branch” komutlarının relatif adresleme kullandığını, geçen sayıda BEQ ve BNE'yi anlatırken görmüştük. Unutanlar için hatırlatalım; eğer komutun içerdiği koşul gerçekleşmişse, komutu izleyen rakam pozitifse program akışı o rakam artı 1 byte ileriye, negatifse FF eksi o rakam byte geriye atlayacaktır. Şöyle göstersek daha kolay anlaşılabilir: (F0= BEQ; nn= parametre)

program

xXx xx xx xx FO nn xx xx XxX XX «es

FA FB FC FD FE FF 00 81 92 93 ... Relatif Pozisyon

1. Aas Ba 18

Sonuç: program akışı $C014'ten devam eder; çünkü C000'daki komut

LDA $00 demektir, sonucu C002'deki komut ise sonuç sıfırsa hex 11 byte ileriden devam et demekte- dir. 2. COOO a9 a9 COO2 10 70

Sonuç: program $C004'ten aynen devam eder; çünkü C000'da aküye hex A9, yani negatif bir sayı yüklenmekte, C002 ise sonuç pozitifse hex 0F byte geri git demektir. “branch” komutlarında 00 parametresi anlamsızdır, çünkü koşul gerçekleşse de, gerçekleşmese de program bir sonraki byte'tan devam edecektir. FE parametresi, eğer koşul gerçekleşirse, programı kısır döngüye sokar; çünkü programı bir byte geriye, yani koşul komutuna atlatır.

olmaz

Sıra geldi aritmetiğin elifbasına: İki tane basit rakamı nasıl toplayacağız? Elcevap: ADC komutuyla, ADC komutu, akümülatörde o an bulunan sayıya, parametresinde belirtilen sayıyı ekler. Hemen hemen tüm adresleme türlerine sahiptir; yani akümülatöre dolaysız bir rakamı veya mutlak bir adreste, indeksli bir adreste, dolaylı bir adreste vb. bulunan bir rakamı ekleyebilir.

4+1 işlemini nasıl yaparız? Elcevap: LDA #$01 ADC #$01

Bu işlemin sonucu ne olur? Elcevap: Belli olmaz! Zira, ADC komutu, adı üstünde ADd with Carry demektir ve önceki işlemden kalan varsa, toplamanın sonucuna bir ekler. Carry 0 ise işlem sonucu 2, Carry 1 ise sonuç 3'tür. Binaenaleyh, özel birtakım emellerimiz yoksa, ADC işleminden önce CLC komutunu vermeyi asla ve kat'a

Carry'nin hikmetinin ne olduğunu anlatmanın en kestirme yolu, $4F85AC rakamıyla $3120C0 rakamını toplamaya çalışmak (isteyen desimale çevirip uğraşsın) İlk iş, LDA ve STA yöntemiyle bellekte herhangi 6 adrese, yukarıdaki rakamları yazmak. Örneğin, zero page'de $60-65 arasını seçelim:

Adres: 60 61 62 63 64 65

Rakam:1F 85 AC 31 (Bak. Şekil 1.)

20. CO

2011 85 66 STA $66 —50 (80)

Sonuç $50A6'dır. İnanmayan kontrol etsin. Tabii bu programı, X indeksli adresleme kullanıp çok daha kısa yazmak mümkün. Ve hayrettir ki, bu ayın Baytan Bitirmez Bilgisayar Bilgisi Birinciliğinin Birinci Bilmecesi Bu. Toplama böyle. Çıkarmaya gelince, bunun da komutu SBC (SuBtract with Carry) ve işleyişi ADC'nin tam tersi. Nasıl FF'ten artırıp 00'a ulaşınca Carry 1 oluyorsa, 00'dan eksiltip $FF'e ulaşırsak Carry 1 iken sıfırlanıyor (sıfırsa sıfır kalıyor). Nasıl tek haneli ADC işleminde doğru sonuç almak için Carry'i sıfırlamak gerekiyorsa, tek haneli SBC operasyonunda da Carry'i 1 yapmak şart. Yani işlem,

SEC LDA xx SBC yy

Çok haneli çıkarma işleminde, herhangi bir hanedeki SBC sonucu eksi ise, Carry sıfırlanıyor; dolayısıyla bir soldaki hanede SBC sonucu bir eksik veriyor.

90 A8 25

sBC A0 AZ 69

50 00 CO

Toplama sonucunu da $66-68'e

Program şöyle:

2090 18 CLC 2001 A5 65 LDA 20803 65 62 ADC $62 2005 85 68 STA $68 2007 A5 GBâ LDA 20609 65 61 ADC $6İ 20B 85 67 STA $67 A5 63 LDA $653 200F 65 6G6ü ADC Şekil 1

Elde var © co <192) tAC (172) (108) elde 1 (256) , *85 (133) zAB (166) elde B 31 <49) *1F (31) 148

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