Bu sayfadaki yazılar
Sayfanın metni
Sayfa 45
SEI yetkisini set eder. Bu; IRQ flag = 1 iken interruptlar kaale alınmaz (kompüterin kendi interruptları). CLI, IRQ flag'ı clear eder. Interruptları kabul eder.
İşte IRQ rutini kullanılarak çalışacak bir program: C010 INC $D020 C013 JMP $EA31 Yukarıdaki rutini yazdıktan sonra assembly dilini C000 bölgesinde run et. Ekran kırpışmaya başlayacaktır. Bu olur çünkü ekranın rengi çok çabuk değişir, gözle takip zor olur. NOT: IRQ vektörünü değiştirirken IRQ flag'ı daima set et. Vektörü değiştirdikten sonra CLI komutu kullanarak IRQ flag'ı clear edebilirsin. BRK (Force Break) BRK, IRQ gibi bir interrupt'tur. Bununla beraber BRK bir komuttur. BRK komutu kullanıldığı zaman zum 0316 ve 0317 bölgesine yapılır. Vektörü rutin olan herhangi bir yere değiştirmek için kullanılabiliriz. Önce BRK hakkında daha fazla öğrenmeliyiz. BRK edildiği zaman vektör kanalı ile diğer bir rutine atlar. RTI komutu ile geri dönülür. RTI, RTS gibidir. Yalnız subroutine yerine interrupt'tan döner. RTI komutu execute edildiği zaman PC değeri alınır ve 2 arttırılır. Bunun nedeni bir sonraki adrese geri dönmeyecektir, bundan sonrakine gidecektir. Bu demek oluyor ki BRK'den sonraki bölgeyi doldurmalıyız. Bu bölgeyi NOP komutu ile doldurabiliriz. Bu komut hiçbir şey yapmaz sadece yer doldurur. Bu nasıl çalıştığını gösterir: C000 BRK (bu kompüterin vektöre gitmesini sağlar) C001 NOP (Bu komut atlanır) C002 (Kompüteri RTI komutundan sonra bu komuta getirir) Aşağıdaki program BRK vektörünü değiştirir, sonrada BRK komutu kullanır. C000 LDA #$10 C002 STA $0316 C005 LDA #$C0 C007 STA $0317
COOA — BRK NOP cooc RTS
Bundan sonraki rutini girmeden programı run'lama: C010 INC $0286 RTI Bu programı C000 bölgesinde her run edişinde cursor rengi değişecektir. Bu olur çünkü BRK komutu 0286 bölgesini arttırır ki bu bölge hali hazır cursor rengini belirtir. Bu konuda herhangi bir test yok. Konuyu iki kere okuyun. İnterrupt'larla uğraşırken çok dikkatli olun.
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 44
C002 mbler C006 BIT $FB C008 komutu kullandığın zaman memory'nin 7. bit'i Negative flag'a ve 6. bit'i Overflow flag'a gider. A registeri memory ile AND edilir ve sonuç 00 ise Zero flag set'tir. AND komutunun neticesi hiçbir yere depolanmaz. Örnek: A registeri FB bölgesi ile BIT edilmiştir: C000 LDX #$8A STX $SFB LDA #$89
RTS
İ A HK BİT komutu sadeci 2 mod hip- Dr. ALİ ÖZÇELİK tir; Zero page ve Sadece memory byt'nn
ORA üzerine notlar: * Eğer sonuç 80 ile FF arasında ise Negative flag set olacaktır. * Eğer sonuç 00 ise Zero flag set olacaktır. * A registeri ORA için aşağıdaki adresleme modlarını destekler: IMMEDIATE (ORA #$ZZ) ZERO PAGE (ORA $ZZ) ZERO PAGE INDEXED (ORA $ZZ,X) ABSOLUTE (ORA $ZZZZ) ABSOLUTE INDEXED (ORA $ZZZZ,X) veya (ORA $ZZZZ,Y) INDEXED INDIRECT (ORA ($ZZ,X)) INDIRECT INDEXED (ORA ($ZZ),Y) EOR (A registeri ile Exclusive-Or) Bu ORA ile bir tek şey hariç aynıdır, eğer iki bit üst üste sonuç 0'dır. 1-1=0, 1-0=1, 0-1=1, 0-0=0. İşte örnek: 11001011 01010010 10011001 Aşağıdaki program RUN edildiğinde ekran rengini değiştirir. C000 LDA $D021 C003 EOR #$07 STA $D021 C008 RTS Bu program çalışır çünkü her run edilişinde 0, 1 ve 2 arasında değiştirir. EOR üzerine notlar: * Eğer sonuç 80 ile FF arasında ise Negative flag set olacaktır. * Eğer sonuç 00 ise Zero flag set olacaktır. A registeri EOR'un aşağıdaki adresleme modlarını destekler: IMMEDIATE (EOR #$ZZ) ZERO PAGE (ORA $ZZ) ZERO PAGE INDEXED (ORA $ZZ,X) ABSOLUTE INDEXED (ORA $ZZZZ,X) veya (ORA $ZZZZ,Y) INDEXED INDIRECT (ORA ($ZZ,X)) INDIRECT INDEXED (ORA ($ZZ),Y) BIT (register'le memory'deki bitleri test) Şimdiye kadar öğrendiğimiz komutların aksine bu komut register veya memory'i etkilemez. Bu kod durumunu kontrol etme maksadına hizmet eder. BIT bahsedilecek son lojik komuttu. Şimdi başka bir problem: A registerini A9 (10101001) yapan bir program yazdım, sonra lojik komut icra ettim ve A register 08 (00001000) oldu. Bu programda hangi lojik komut kullanıldı? LDA #$A9 C002 EOR #$A1 C004 RTS Yukarıda EOR #$A1 kullanıldı. A register = 10101001 data =
A register
00001000
— Bölüm Onbeş — INTERRUPTS (KESME) Henüz öğrenmediğimiz bir register var, PC (Program Counter). PC bağımsız olarak çalışır, her şeyi kendi başına yapar. PC kompüterin hangi adreste olduğunu takip eder. Örnek olarak kompüter C000 adresindeki komutu icra ediyorsa PC = C000'dır. Interrupt, isminden de anlaşıldığı gibi programın akışını durdurur. Her 1/60 saniyede Commodore interrupt olur. Bu saat zamanlaması ve klavyeyi kontrol için yapılır. Biz bunu vektörü değiştirerek yaparız ki interrupt atlatılır. Vektör iki byte'tır ve adresi gösterir, ve LOW-HI byte formundadır. Interrupt (IRQ-Interrupt Request) vektörü 0314 ve 0315 bölgesindedir. Bu vektör normal olarak EA31 bölgesini gösterir. Vektörü bizim rutinimizi göstermek üzere değiştirdiğimizde, rutinimizi $EA31 şeklinde bitirmeliyiz. Bu saatin ayarını ve klavyenin kontrol edilmesini sağlayacaktır.
İşte IRO vektörünü CO10 bölgesini gösterecek şekilde değiştiren program: Co00 Coo1 LDA #S10 Co03 STA $ 0314 Co06 LDA #$ CO Co08 STA $ 0315 CLI cooc RTS Bu programı C010 bölgesine bir rutin yazmadan — sakın çalıştırma. Program içindeki ve CLI komut- larını farketmişsindir. SEl komutu, İRO komutunun