Özet
SAÇMALIK NO 1: Makina dilinde S00-7F arası rakamlar negatif sayılır. S80-FF arası rakamlar negatif sayılır. Tabii he- men dikkat etiniz (m7), S80 ve üstü ra- kamları ortak özellikleri, ikili sistemde ifade edileklerinde.
Diğer Dergiler
Tam metin içeriği
SAÇMALIK NO 4: Makina dilinde
800-7F arası rakamlar pozitif, $80-FF
arasi 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 SFF (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 stfırlanırsa, CARRY O iken 4 oluyor.
Ama CARRY bir tek bit; yani 1 iken 2
filan olmuyor. Yaptığı, sadece, “elde
var 256” diye bir şeyi akılda tutmak
Carıy ile ilgili iki faydalı komut:
SEC (kodu: 38) SEt Carry —Carry'i 4
yap.
CLC (kodu: 18) CLear Carry —Car-
r'i 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 af-
la.
BCC (90) Branch on Cary Clear
—öncekinin tersi.
Hazır yeri gelmişken devam edelim
BPL (40) Branch 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
BEO 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-
ram akışı o rakam artı 4 byte ileriye,
negatifse FF eksi o rakam byte geri-
ye atlayacaktır. Şöyle göstersek daha
kolay anlaşılabilir: (FOxBEO; nnspara-
metre)
program
KKK OXX XX FO nn XX XX XX XX
FA FB FC FD FE FF 89 01 02 03
Relatif Pozisyon
1. ceo
coe2
as o9
#0 19
Sonuç: program akışı $C044'ten
devam eder; çünkü C000'daki komut
BEER EŞE EEE
28
LDA o$00 demektir, sonucu sıfırdır,
.C002'deki komut ise sonuç sifirsa hex
14 byte ileriden devam et demekie-
dir.
2.C000 a9 a9
C002 1010
Sonuç: program $C004'ten aynen
devam eder; çünkü C000'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 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 s0-
kar; çünkü programı bir byte geriye,
yani koşul komutuna atlatır.
1444-—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 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ı ek-
leyebilir.
1-4 işlemini nasıl yaparız?
Elcevap: LDA # $04
ADC # $01
Bu işlemin sonucu ne olur?
Elcevap: Belli olmaz! Zira, ADC ko-
mutu, adı üstünde ADd with Cary de-
mektir ve önceki işlemden kalan var-
sa, toplamanın sonucuna bir ekler.
Cary 0 ise işlem sonucu 2, Carry 4 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.
Carıy'nın hikmetinin ne olduğunu
anlatmanın ve kestirme yolu, $1F8SAC
rakamıyla $3120C90 rakamını topla:
maya çalışmak (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
Adres: 60 61 62 63 64 65
Rakam:4F 85 AC 31
(Bak. Şekil 4.)
20 CO
2014 85 66 STA $66 -50 (80)
Sonuç $50A66C. İ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-
fan Bitirmez Bilgisayar Bilgisi Birinciliği-
nin Birinci Bilmecesi Bu,
Toplama böyle. Çıkarmaya gelin
ce, bunun da komutu SBC (SuBiraci
with Carry) ve işleyişi ADC'nın tam tersi,
Nasıl FF'ten artırıp 00'a ulaşınca Carry
4 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 Carıy'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, Cary sıfırlanıyor; dolayısıyla bir
soldaki hanede SBC sonucu bir eksik
veriyor,
90 AB 25
SBC 40A765
5000Cc0
Toplama sonucunu da $66-68'e yazacağız.
Program şöyle:
2005 18 CLC
2001 AS 65 LDA $S5
2003 65 62 ADC #62
2005 85 68 STA $68
2007 A5 64 LDA $64
2009 65 61 ADC #61
2008 85 67 STA $67
2000 AS 63 LDA #63
2oor 65 60 ADC #68
Şekil 4
Elde var 8
ca <192>
#AC (172) *0
-6C (108) elde 1
28 (32)
“85 (133) #1
SAS (166) elde 9
31 cas»
#IF (31) 48
<256>