Bu sayfadaki yazılar
Sayfanın metni
Sayfa 24
REGISTERLERİ YIĞINLARA DEPOLAMA (Storing registers on the stack) Bildiğiniz gibi Commodore 64 makine kodu ile çalışırken 3 adet register olduğundan kısıtlıyız. Mutlaka 'bunları hafızaya depolarız transfer' diye düşünüyorsunuzdur. Bazı durumlarda bunlar da yeterli olmayabilir.
Bunun altından registerleri yığınlara depolayarak kalkarız. Bu bölümde registerlerin yığınlara nasıl depolandığını ve nasıl geri alındığını göreceğiz..
PHA, A registerini yığın üzerine bastır. A registerini yığın üzerine bastırdığın zaman değeri Stack Pointer (SP) tarafından gösterilen bölgeye (adrese) depolanır ve SP azaltılır, ki bundan sonraki boş byte'ı gösterirsin. Örnek: Eğer SP= $89 ise ve A registerini yığına bastırdığında A registerinin değeri $0189 bölgesine transfer edilecek SP $88'e inecektir.
PLA, A registerini yığından çek (Pull the A register from the stack). A registerini yığına bastırdıktan sonra bu komutu yığın üzerindeki A'ya geçirmek için kullanıyorsun. Misal olarak, eğer SP= $92 ise ve PLA komutunu kullanıyorsan, A registeri $0193 bölgesindeki değerle yüklenecektir. SP= $93 olacaktır.
İşte A registerini yığına yükleyen ve tekrar yığından geri alan bir örnek: LDA # $ 30 Co02 PHA CO03 LDA # $ 00 5 STA $ DO20 Co08 PLA Co09 RTS
PHP ve PLP PHP, P registerini stack'a (yığına) bastır (Push the P register onto the stack) demektir. PHP, PHA komutunda olduğu gibi işlev görür. PLP, PLA komutunda olduğu gibi işlev görür (Pull
Dr. Ali Özçelik
the P register from the stack) demektir. İşte P registerini yığına yükleyen ve geri alan örnek bir program: Co00 LDA # $ 00 Co02 PHP CO03 LDA # $ 80 CO0O5 STA $ 028A Co08 PLP Co09 RTS
TXS ve TSX TSX, yığın göstergecini X registerine transfer et (Transfer the Stack pointer to X register) demektir. TXS, X registerini yığın göstergecine transfer et (Transfer the X register to the Stack pointer) anlamına gelmektedir. Her ikisi de yığın göstergecinin ne olup olmadığını anlamak için kullanılır.
NOT — Yığınlara numaraları basarken bunları geri almayı unutma. Eğer yığından değerleri almazsan RTS komutuna geldiği zaman sistem donabilir (crash). — Yığından çekilen numaralar konuluş sırasının tersine çekilir (son giren ilk çıkar). Örnek olarak, yığına konan numaralar 1,2,3,4,5 ve 6 ise, bunlar alınırken aşağıdaki sıra ile alınacaktır: 6,5,4,3,2,1 (son giren ilk çıkar, last in-first out). İşte size diğer bölüme geçmeden önce düşündürücü bir problem: Bütün registerleri yığına transfer et ve geri al. $C000 PHP PHA $C002 TXA $C003 PHA $C004 TYA $C005 PHA
CO00 PLA TAY C002 PLA TAX
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 25
CO04 PLA Co05 PLP
Birinci program tüm registerleri yığına yükler ve ikinci program ise onları geri alır. Yukarıdaki programı yazmak değil, anlamak önemlidir.
TOPLAMA VE ÇIKARTMA Bu bölümde 6510 (C64'ün microprocessor)nun matematik fonksiyonları ile ilgilidir. 6510 sadece çıkartma ve toplama yapabilir, ve bunlar A registeri kullanarak yapılır. Bu nedenle A registeri akümülatör (accumulator) diye adlandırılır.
ADC (Add to Accumulator with Carry) A registerine Carry ile ilave et. Şu ana kadar bütün adresleme modlarını öğrenmiş olmanız gerekiyor. Bundan sonra adresleme modlarını izah etmeyeceğim.
ADC komutu, değerin Carry flag ile A registerine ilave edilmesini sağlar. Örnek olarak eğer Carry flag 'set' ve A registerinde $40 değeri varsa ve ADC #$03 komutu kullanılırsa, A registerinin değeri $44 olacaktır. Çünkü kompüter $03 ile $40'ı toplayarak $43'ü elde edecek sonra Carry Flag ilave edilerek neticede $44 bulunacaktır. Eğer Carry Flag “Set” değilse (reset) A registerinin değeri $43 olacaktır. Toplamadan önce CLC (Clear the Carry) komutu kullanırsak $01 değeri eklenecektir.
İşte 02 ile 02 yi toplayan örnek program: Co00 LDA # $ 02 C002 CLC C0O03 ADC # $ 02 Co0O5 RTS
Yukarıdaki programda netice şüphesiz $04 olacaktır. İşte yine $02 ile $02'yi toplayan bir başka program, fakat aynı zamanda Carry flag 'set'tir: $C000 LDA #$02 $C002 SEC $C003 ADC #$02 $C005 RTS
Sonuç $05'tir, çünkü Carry flag set ($01). Eğer Carry flag clear olsaydı ve siz $06 ile $04'ü toplamış olsaydınız alacağınız cevap $0A olacaktır.
Bazen bu tür toplama yapmak işimize gelmeyebilir. Desimal sonuçları tercih edebiliriz. Desimal toplama, desimal flag'ı set etme yoluyla yapılabilir. SED (Set Decimal flag) komutu kullanılır. Desimal flag set ve toplama $07 + $05 = $12 şeklinde ($0C değilse) olacak. BASIC moduna dönmeden önce Decimal flag, clear'lanmalıdır.
Desimal toplamaya örnek:
Co00 SED Co01 LDA # $ O7 CLC C0O04 ADC # $ 06 Co06 CLD COO7 RTS
Bu A registerinin değerini 13 olarak verecektir. Eğer Decimal flag önceden set edilmeseydi A, $0D değerine sahip olacaktı.
ADC ÜZERİNE NOTLAR — Normal durumlarda toplama 255'i geçerse Carry flag set olacaktır. — Toplamanın sonucu 0 ise Zero flag set olacak. — Toplama 80 ile FF arasında ise Negative flag set olacak. — Toplamanın sonucu 7F'yi aşarsa Overflow flag set olacak.