SAÇMALIK NO 1: Makina dilinde $00-7F arası rakamlar pozitif, S80-FF arası rakamlar negatif sayılır. Tabii he- men dikkat ettiniz (mi?), $80 ve üstü ra- kamların ortak özelliği, ikili sistemde ifade edildiklerinde $80— 10000000— 128 Bunun neden negatif olduğunu bu- güne kadar anlayabilmiş değilim. SAÇMALIK NO 2: Bunu geçen ayın 4'üncü Anayasa maddesinde de gör- müş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, O'dır! Yalnız nasıl olmuşsa bir kölaylık dü- şünmüşler, CARRY (kalan, elde var) di- ye bir şey icat etmişler. Şöyle ki, her- hangi bir hesap sırasında sonuç $FF'ı aşıp sıfırlanırsa, CARRY O iken 1 oluyor. Ama CARRY bir tek bit; yani 1 iken 2 tilan olmuyor. Yaptığı, sadece, “elde var 256” diye bir şeyi akılda tutmak. Carry ile ilgili iki faydalı komut: SEC (kodu: 38) SEt Carry Corryı'î yap. CLC (kodu: 18) CLear Corry —Car- ry' sıfırla İki komut daha: BCS (BO) Branch on Carry Set —Bir önceki işlemin sonucunda kalan var- sa, parametrenin gösterdiği yere at- BCC (90) Branch on Carıy Clear —öncekinin tersi. Hazır yeri gelmişken devam edelim: BPL (10) Branceh if Plus —önceki işle- min sonucu, yukarıdaki saçma man- tığa göre pozitifse, dallan. BMI (30) Branch if Minus — negatif- se dallan. Tüm “branch” komutlarının relatif adresleme kullandığını, geçen sayıda BE©O ve BNE'yı anlatırken görmüştük. Unutanlar için hatırlatalım; eğer ko- mutun içerdiği koşul gerçekleşmişse, komutu izleyen rakam pozitifse prog- Tam akışı o rakam artı 1 byte ileriye, negatifse FF eksi o rakam byte geri- ye atlayacaktır. Şöyle göstersek daha kolay anlaşılabilir: (FO— BE©; nn— para- program Xx xx xx xx FO mn xx XX XX XX e. FA FB FC FD FE FF 080 1 G2 B3 ..» Relatif Pozisyon 1. Cg88 as ga coo2 *O 18 Sonuç: program caıkışı SC014'ten devam eder; çünkü CO00'daki komut LDA — $00 demektir, sonucu sifırdır. CO002'deki komut ise sonuç sıfırsa hex 11 byte ileriden devam et demekte- dir. 2. CO0D0O a9? a9 COO2 10 f0 Sonuç: program $C004'ten aynen devam eder; çünkü CO00'da aküye hex A9, yani negatif bir sayı yüklen- mekte, C002 ise sonuç pozitifse hex OF byte geri git demektir. 3.Tüm “branch” komutlarında O00 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 so- kar; çünkü programı bir byte geriye, yani koşul komutuna atlatır. 441 -Belli olmaz Sıra geldi aritmetiğin elifbasına: İki tane basit rakamı nasıl toplayacağız? Elcevap: ADC komutuyla, ADC ko- mutu, akümülatörde o an bulunan sa- yıya, parametresinde belirfilen 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ı ek- leyebilir. 441 işlemini nasıl yaparız? Elcevap: LDA# $01 C# Ss04 Bu işlemin sonucu ne olur? Elcevap: Belli olmaz! Zira, ADC ko- mutu, adı üstünde ADd with Carry de- mektir ve önceki işlemden kalan var- sa, toplamanın sonucuna bir ekler. Carry O ise işlem sonucu 2, Carry 1 ise sonuç 3'tür. Binaenaleyh, özel birta- kım emellerimiz yoksa, ADC işlemin- den öne CLC komutunu vermeyi asla ve kat'a unutmamalıyız. Carry'nın hikmetinin ne olduğunu anlatmanın ve kestirme yolu, $1F85AC rakamıyla 83120C0 rakamını topla- maya çolışmck (isteyen desimale çe- virip Uğraşsın) İlk iş, LDA ve STA yöntemiyle bellek- te herhangi 6 adrese, yukarıdaki ra- kamları yazmak. Örneğin, zero page'- de $60-65 arasını seçelim: 60 61 Adres: 62 63 64 65 Rakam:1F 85 AC 31 (Bak. Şekil 1.) 20 CO 2011 85 66 STA $66 —S0 (80) Sonuç S50AĞâC. İnanmayan kont- rOl etsin. Tabii bu programı, X indeksli adres- leme kullanıp çok daha kısa yazmak mümkün. Ve hayrettir ki, bu ayın Bay- tan Bitirmez Bilgisayar Bilgisi Birinciliği- nin Birinci Bilmecesi Bu. Toplama böyle. Çıkarmaya gelin- ce, bunun da komutu SBC (SuBtract with Carry) ve işleyişi ADC'nın tam tersi. Nasıl FF'ften 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şlemin- de doğru sonuç almak için Carry'i sı- fırlamak gerekiyorsa, tek haneli SBC operasyonunda da Carry'i 4 yapmak şart. Yani işlem, SEC LDA xx SBC yy Çok haneli çıkarma işleminde, her- hangi 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 - ADAZ 65 50 00 CO Toplama sonucunu da $66-6568'&ae yazacagğız. Program şöyleri 20900 18 CLC 200i AS5 65 LDA $65 e003 65 62 ADC $62 005 85 68 STA $68 2007 AZ 64 LDA $64 2609 65 61 ADC $6İ 2960B 85 &67 STA $67 206D0 AS5 63 LDA $53 ed00F 65 6B6ü ADC $5A Şekil 1 Elde var © ca <192) *AC (1F72) *A z&0 (108) elde 1 (256) , 2A <32) *85 (133) *i zAB (166) elde B 31 <49) *1İF <31) 48