Bu sayfadaki yazılar
Sayfanın metni
Sayfa 33
a SO
Bu programı çalıştırdığınız zaman time delay az görülebilir, fakat 130.000 civarında komut çalıştırır (execute). Bu nasıl çalışır:
C000: X registeri 00 ile yükler. C002: Y registeri 00 ile yükler. C004: X registeri FF değerine azaltılır, Negative flag'ı 'set', Zero flag'ı 'reset' eder. C005: Zero flag 'reset' olduğu için C004 adresine dallanma yapılır. C007: X registeri 00 değerine azaltıldığı zaman, bu komut icra edilir ve Y registeri azaltılır. C008: Eğer Y registeri 00 değerine azalmazsa C007 bölgesine dallanma yapar. C00A: Kompüter BASIC'e döner.
BEO (Branch on Result Zero) Bu BNE komutunun tersidir. Zero flag “set' değilse branch yapılır. LDA $ BEO $ CO06 CO0O5 RTS CO06 LDA # $ 80 CO08 STA $ 028A CooB RTS
Bu program 028A bölgesinin 00'a eşit olup olmadığını kontrol eder. Eğer 00'a eşitse C006 adresine dallanılır. Eğer dallanma olursa 0280 adresi 80'e eşitle.
nir, ki bu da tuş tekrarını (repeat key) set eder.
BMI (Branch on Result Minus) Bu komutta Negative flag 'set' ise dallanma olur, aşağıdaki programda olduğu gibi: C000 LDA #$20 C002 CMP #$30 C004 BMI $C007 C006 RTS C007 LDA #$00 C009 STA $D020 C00C RTS
Bu program A registerini 30 ile mukayese eder, 30'dan küçük olduğundan Negative flag 'set' olur. Böylece C007 bölgesine dallanma yapılır ve bordür rengi değiştirilir.
BPL (Branch on Result Plus) Bu BMI'nın tam tersidir. Negative flag clear (reset) olduğu zaman dallanma yapar, aşağıdaki örnekte olduğu gibi:
CO00O LDX $ 30 CO02 STA $ FB CO04 LDY # $ 30 CPY $ FB
C008 BPL $ COOB COOA RTS
COOB STY $ Dö21 COOE RTS
Bu program ekranın rengini değiştirir, çünkü C008 adresinden C00B adresine dallanma olmuştur.
BVC ve BVS Bu komutlar Overflow flag'ın durumuna göre dallanma yapar. BVC'de Overflow flag clear (reset) ise dallanma olur. BVS'de Overflow flag set ise dallanma olur. Overflow flag'lar hakkında 12. bölümde daha detaylı bilgi verilecektir.
Şimdi test için başka bir problem: 255 kere A karakteri basan bir program düşün: Cevap: # $ 00 C002 LDA #$ 41 CO04 JSR $ FFD2 COO7 INX C008 BNE $ CO04 COOA RTS
veya
LDY # $ 00 CO02 LDA #$ 41 CO04 JSR $ FFD2 COO7 INY BNE $ CO04 COOA RTS
Üstteki iki program da çalışacaktır. Nasıl çalıştığını anladıysan bir sonraki bölüme devam et. Aksi taktirde son iki bölümü gözden geçirmekte yarar var.
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 32
CONDITIONAL BRANCHING Şartlı dallanma BASIC'teki IF..... THEN... komutuna benzer. Şu şekilde çalışırlar örnek: Negatif flag set (1) ise dallan (branch to). Bu bölümde değişik şartlı dallanma anlatılmıştır.
ide 8
BCC (Branch on Carry Clear) BCC komutu Carry flag Clear “reset (0)” olduğu zaman dallanma yapacaktır. BCC komutu için örnek: 'BCC $C009' dur. Carry flag clear (reset) ise C009 adresine dallanacak, aksi takdirde bir sonraki komuta geçecektir. Bu tip dallanmaya adresleme ismi verilir. Bu, o andaki adresine belirli bir uzaklıkta olduğunu gösterir.
Bu uzaklık ne kadar dallanma yaptığını gösterir. Dallanma komutları 80 bölge (decimal 128) geri ve 7F bölge (decimal 127) ileri ve geri dallanabilir. Yani 80 geri, 7F ileri dallanabilir. Bu demek oluyor ki BCC $C000 komutunda, C000 bölge dışı kalıyor. Eğer komut $C07F olsaydı, C000 bölge içi olacaktı. Eğer BCC $C000 olsaydı C090 adresi bölge dışı, eğer BCC $C010 olsaydı C090 bölge içi olacaktır.
Bu konuya kafanızı fazla takmayın, çünkü Assembler bölge dışında olduğunuzu haber verecektir. Bölge dışındaysanız, assembler 'BAD BRANCH” mesajını verecektir.
Aşağıdaki program A resigterini bir sayı se eder, eğer A registeri sayıdan azsa yapar. Co00 LDA # $ 20 CMP # $.30 C004 BCC $ COO7 Co06 RTS COO7 STA $ DO20 COOA RTS
Dr. Ali Özçelik
C000: A registerini 20 ile yükler. A registeri 30 ile mukayese edilir, bu Negatif flag'ı set eder.
C004: C007 bölgesine dallanma yapılır, çünkü Carry flag clear (reset). Eğer dallanma yapılmasaydı kompüter BASIC'e dönecekti. C007: Bu A registerini D020 bölgesine saklar, bu da bordür rengini değiştirir. C00A: Bu kompüteri BASIC'e döndürür.
BCS (Branch on Carry Set) Bu komut BCC komutunun tam tersidir. Carry flag set (1) iken dallanma yapar:
CO00O LDK $ 0286 CPX # $ 01 Co05 BCS $ COO7 RTS LDA # $ 00 COOA STA $ 0286 COOD RTS
Yukarıdaki örnekte A registeri cursor rengi ile yüklenmiştir. Eğer eşit veya 01'den büyük ise C007 adresine dallanma yapılır ve 00'a eşitlenir.
BNE (Branch on Result not Zero) Bu komut, eğer Zero flag 'set' değilse dallanma yapar. Bir sonraki örnek zaman geciktirme (time delay)dir, ki çoğu makina kodlu oyun programlarının çoğunda kullanılır : C000 LDX #$00 C002 LDY #$00 C004 DEX C005 BNE $C004 C007 DEY C008 BNE $C004 C00A RTS