Commodore sayı 14, sayfa 52

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 52

Program $2000'deki altprograma aitti. Diyelim ki o adreste doğrudan RETURN komutu bulunsun.

SP - $F8 SP-SP41 PCL-($01F9) — $82 PCH-(SOLFA)- $C4 SP - $FA

Program sayacı şu anda $C482'de durmakta. Bu değer otomatik olarak bir daha artırılır. Böylece $C483 adresini, yani $C480'de bulunan altprogram çağırma komutunun hemen arkasındaki komutun adresini elde ederiz. Yığın “Last in-First out” prensibiyle çalışır. Yani yığına son atılan bilgi ilk olarak geri çıkar. Bu özelliğe güvenip içiçe geçmiş birçok derinlikte altprogramlar yazabiliriz. Herbir altprograma rastlandığında yığına yeni bir geri dönüş adresi atılır. Her RETURN komutuna rastlandığında yığından sıradaki geri dönüş adresi alınır ve bir üst sıradaki altprograma geri dönülür. En sonuncu RETURN komutu ile de ana programa dönülür. Yığının çalışma prensibini anladıysanız o'nu aynı zamanda kendi programınızın ana değerlerini saklamak için de kullanabilirsiniz. Bu konuyu bir sonraki komut grubunda inceleyeceğiz. Aşağıdaki tabloda altprogram çağırma ve altprogramdan geri dönme komutlarını ve komut kodlarını bulacaksınız:

Komut Komut kodu JSR $20 RTS $60

13. Yığın Komutları

6510 ana işlem ünitemiz gerek aküyü, gerek durum register'ini yığında saklayıp, daha sonra geri almamıza olanak tanıyor. Bu işlemler sırasında, yığın göstergecinin, okuma işlemi sırasında bir artırılması ve yazma işlemi sırasında bir eksiltilmesi gibi işlemler otomatik olarak kendiliğinden gerçekleşir. Şimdi bu komutları görelim.

PHA

PHA (push accu) komutu akümülatör'ün içeriğini yığına atmamıza yarar. Yığın göstergecinin bir eksiltilmesi işlemi otomatik olarak gerçekleşir. Akümülatör'ün içeriği korunur. İşlemi BASIC'te formüle edersek:

POKE 256-4 SP, A:SP -SP-I

1

$0100

Ana işlem ünitesinin yığınının $0100 adresinden, $01FF adresine kadar uzandığını bir kere daha hatırlatalım.

PHP

PHP (“push processor status') komutu durum register'ini olduğu gibi yığında saklamamıza yarar. Yığın göstergecinin bir eksiltilmesi otomatik olarak gerçekleşir. Durum register'inin içeriği değişmez. BASIC'te, yapılan işlemi görelim: POKE 256+SP, A:SP=SP-1

$0100 PLA

PLA (pull accu') komutu PHA komutunun tersi işlemi yapar. Yığın göstergeci bir artırılır ve yığından bir byte, akümülatör'e okunur. Okunan değere göre N- ve Z-flag'ları etkilenir. Bu işlem BASIC'te şöyle görünür.

SP — SP 1:A —- PEEK SP)

$0100

PLP

PLP (“pull processor status') komutu PHP komutunun tam tersi işlemi yapar. Okunan byte olduğu gibi durum registerine yerleşir, dolayısıyla bütün flag'lar etkilenir. Yapılan işlemi şöyle yazabiliriz:

SP — SP 4 1:P — PEEK (256-4 SP)

1

$0100 Aşağıdaki tabloda komutları ve karşılık gelen komut kodlarını bulacaksınız.

Komut Komut kodu PHA $48 PHP $08 PLA $68

| PLP $28

14. Interrupt Komutları

Bu gruptaki komutları başta pek kullanmayacağız, çünkü biraz dikkat ve bilgi istiyor. 6510 ana işlem ünitemiz yürüyen bir programı dışarıdan gelen bir etkiyle kesebilme becerisine sahiptir. Bu işlemin gerçekleşmesi için ana işlem ünitesinin Interrupt (IRQ, Interrupt Request) bacağının elektriksel sinyallerle uyarılması gerekiyor. Interrupt gerçekleşince gelişen olaylar, altprogram işlemine benziyor. Önce yürümekte olan programın kesildiği adres yığına atılıyor, arkasından da durum register'i. Şimdi hafızada bulunan ana interrupt programını yürütmek için $EFFE ve $FFFF adresleri üzerinden indirekt olarak sıçrama işlemi yapılıyor. Bundan başka, program içinde de interrupt yaratma imkânımız var. BRK ('break') komutu bu iş için öngörülmüş. Ama işlem ünitesi bu emre rastladığında interrupt işleminin aynısını yapıyor. Tek farkla, B-flag'ı yakalıyor. COMMODORE 64'ümüzün işletim sistemindeki interrupt değerlendirme altprogramı ('service routine') bu flag'ı da kontrol ediyor. Bu yüzden BRK işleminin normal interrupt'la karışması engelleniyor. Bu komut genelde bazı özel programları çağırmak için kullanılıyor (Mesela monitör programı). Interrupt değerlendirme altprogramı işini bitirdiğinde asıl programa geri dönebilmesi için normal RTS komutunu kullanamaz, çünkü bu komut durum register'ini yığından almıyor. Bu durumda RTI ('return from interrupt') komutu kullanılır. Bu komut hem adresi, hem de durum register'ini yığından alır ve yürütülmesi kesilen programa flag'lar bozulmadan devam edilir.

Klavyeyle gezinmek için ← ve → tuşları.