Flag Nedir? Bayrak mı, Çentik mi?
Retro bilgisayarBAYTAN BİTİRMEZ
Bu yazımızın konusu FLAG'ler. Ama aslında İngilizce'de yanlış olarak adlandırılmış bir şey bu FLAG denen şey. FLAG, İngilizce'de “bayrak” demek. Aslında FLAG yalnızca iki değer alabilen bir değişken ya da iki durum alabilen bir cihaz olarak düşünülebilir. Herhalde, Amerikalılar bunu bayrağın kalkık ya da inik olmasına benzetmiş olacaklar. Ama aslında işlevi de göz önünde bulundurulursa, FLAG'in, bir şeyi unutmamak üzere bir yere attığınız “ÇENTİK” olarak karşılanması, çok daha yerinde olur.
Çentiğin atılmış olma durumuna SET durumu diyoruz; bu durumda ÇENTİK '1' değerini alır. Ya da kaldırılmış olma durumuna ise CLEAR, yani “temiz”... Bu durumda ise ÇENTİK '0' değerini alır. ÇENTİK için “bir değişken” dedik ama aslında, bunu bir bellek yerleşiminden ziyade, bir elektrik AÇMA/KAPAMA düğmesine benzetmek daha doğru olur. Çenti-
Basic Bilenler İçin Makine Dili-5
Biliyorum, tam bitirdi diye seviniyordunuz ki, işte yine karşınızdayım. Ama ne yapalım? Okurların makine diline olan taleplerinin ardı arkası kesilmiyor. Buralarda da, makine dilini bilen çok da, benim gibi lisan-ı münasiple, anlaşılır bir dille anlatabilecek başka kimse yok galiba. (Aman n'olur, bunun üzerine; yazdığın hiçbir şeyi anlamıyoruz, diye mektup yazıp beni rezil etmeyin.)
Bayrak
mı, Çentik mi?
ğin açık olduğu, yani etkilendiği durum 1 ile, kapalı olduğu, yani etkilenmediği durum ise SIFIR ile belirtilir. C-64'te yedi tane ÇENTİK var. Bunlardan altı tanesine makine dilinden çeşitli komutlarla biz ulaşabiliriz, yedincisi sadece, mikroişlemcinin işine yarıyor. Çentiklerin tamamı Status Register (Durum Sicili) denilen yerdedir. Dolayısıyla, Status Register okunarak hepsi birden görülebilir. Şimdi sırayla durum sicilindeki bu çentiklerin neler olduğunu ve onları nasıl etkileyebileceğimizi gözden geçirelim.
Carry (elde) Flag:
Durum sicilinin 0 no.lu bitidir. Toplama veya diğer aritmetik işlemlerden sonra elde olup olmadığını gösterir. Bu çentiği sıfırlamak için CLC (Clear Carry kelimelerinin baş harflerinden), birlemek için ise SEC (Set Carry kelimelerinin baş harflerinden) komutları kullanılır.
Zero (sıfır) Flag:
Durum sicilinin 1 no.lu bitidir. Karşılaştırma ve çıkarma işlemle sonucun sıfır olup olmadığını gösterir. Doğrudan doğruya bu çentiğin durumunu değiştirecek bir komut yoktur. Dolayısıyla bu çentiğin değeri ancak dolaylı yolla, yani örneğin sonucu sıfır olan bir çıkarma işlemi yaptırarak değiştirilebilir.
Interrupt Disable
Flag (Müdahaleleri durdurma çentiği):
Durum sicilinin iki no.lu bitidir. Bu çentiğin 1 değerini alması, mikroişlemciye programın çalışması sırasında gelebilecek herhangi bir Interrupt talebini dikkate almaması gerektiğini gösterir. Bu SEI (SET Interrupt kelimelerinin baş harfleri) komutu ile sağlanır. Çentiği yeniden temizlemek, yani programı yeniden müdahale edilebilir bir hale getirmek için ise CLI (Clear Interrupt kelimelerinin baş harfleri) kullanılır.
Flag:
Durum sicilinin 3 no.lu biti. Aritmetik işlemlerde kullanılmakta olan sayıların on tabanlı olduğunu göstermek için kullanılır. Bu çentiğin değerini birlemek için SED, sıfırlamak için CLD komutları kullanılır.
Break (kesme)
Durum sicilinin dört no.lu biti. Bizim ulaşamayıp da, yalnızca mikroişlemci tarafından kullanılan çentik budur. Program herhangi bir kesintiye uğradığında, bu
8000 ORG
çentik 1 değerini alır ve programın o anda ne yapmakta olduğuna bağlı olarak bazı değerler STACK'e (ne olduğuna birazdan değineceğim), yani deste belleğe atılır ve bu değerlere göre kontrol gerekli yere aktarılmış olur. Durum sicilindeki beşinci bitte hiçbir çentik yoktur; hiçbir işe yaramadan öyle boş durur.
Flag:
Durum sicilinin 6 no.lu bitidir ve genel olarak belli bir hata durumunu, bir aritmetik işlemden sonra meydana gelen “taşma"yı (overflow) gösterir. Bir komuttan sonraki işaret eğer yanlışsa, taşma çentiği 1 değerini alır. Bunu tekrar 0'a döndürmek için CLV komutu kullanılır.
Negative Flag:
Durum sicilinin 7 no.lu, yani sonuncu bitidir. Üzerinde işlem yapılan son değeri içeren baytın 7. hanesinin (bitinin) durumunu gösterir. Yani bir işlem yapan her komuttan sonra etkilenir. Hatırlayacağınız gibi, bir değer içeren bir baytın 7. biti, içerilen değerin işaretini gösterir. Dolayısıyla komutun sonucu olarak, 7. hane 1 değerini almışsa, negatif çentiği de 1 olur; tam tersi 7. hanenin değeri 0 ise, negatif bit de 0 olur. Ayrıca, karşılaştırma işlemlerinde, aritmetik işlemlerinde ve ötelemelerde, sonuçlar ilgili çentiğin değerini değiştireceğinden, bu çentik bir koşul olarak kullanılıp, dallanma yapılabilir. Ancak bunun için, programın başında, ilgili çentikler sıfırlanmalıdır. 0
TOPLAM 128 DEN KUCUK
kkk FLAGLARA ILİSKİN ÖRNEKLER Ba.
8006 134,SAYIL
8000 E0U TOPLAM 128 DEN BUYUK
CARRY FLAG SIFIRLA Ba is
8200 18
8061 AS 86 LDA #SAYLI
8003 68 78 ADC #SAYIB
8005 FO 08 BEG TOPLAM SIFIR
INTERRUPT FLAGI İCİN ÖRNEK kkk
8007 S8 03 BCC TOPLAM 256 DAN KU 8000 EGl 10008 AORES
TOPLAM SIFIRDAN BUYUK
he Gi 8000 EGU
800B 68 RTS 8000 EGU $EA3İ,ESKİ MUDAH
TOPLAM 256 DAN KUCUK BU PROGRAMLA ONCE TUM MUDAHELELERİ ÖNLEY
kas m YANI SET YAPALIM BÖYLECE İNT.ALTPROGRAMI
8000 78 SET
TOPLAM SIFIR 8601 AS LDA #LADRES
8003 80 14 03 STA $0314
Bali FE LDX 8006 AS 82 LDA #HADRES
11 60 RTS 8008 8D 15 03 — STA $0315
8800 ORG $8000 SIMDI MUDAKELELERE BİRDE CERCEVE RENGİ
800B 58 CLI
ket FAGLARA ÖRNEKLER kit 8000 62 RTS
8808 EGU 89,SAYIL
8000 11,SAYIZ YENİ RUTİNİ
8000 18 CLC
8001 AS 58 LDA#SAYII ONCE CERCEVE RENKLERİNİ DEGİSTİR
8003 68 OB ADCHKSAYIZ 800D EE 26 DE INC $D020
8005 30 03 BMI TOPLAM 128 DEN BU 8010 40 31 EA JMP ESKİ
—.