C64 Türkiye sayı 7, sayfa 20

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 20

C64 TÜRKİYE #7 20 İşte bunun için IRQ vektörünü değiştirmeden önce SEI komutunu kullanıp işlemciye sen şimdilik interruptları unut, biraz bekle diyoruz. IRQ vektörünü değiştirip CLI komutuyla işlemciye kaldığın yerden devam et diyoruz. Bu arada kendi IRQ rutinimiz de yazmalıyız ki CLI komutundan sonra işlemci IRQ vektörü üzerinden bizim rutinimize uğradığında çalıştırabilecek bir şeyler bulsun. Kendi IRQ rutinimizi yazdık ama bir sorun var gibi. Normalde bir assembler programı yazıldığında, program bir kez çalışacaksa program sonunda “RTS” komutu, sürekli çalışacaksa “JMP prg. başlangıcı” komutu olmalıdır. IRQ rutinlerinde ise işiniz bittikten hemen sonra mutlaka JMP $EA31 veya JMP $EA81 komutu kullanılmalıdır. Aslında JMP $EA81 komutu $EA31 adresindeki rutinin sonunda yer alır ve ikisinin arasında kursör yakıp söndürme, klavye tarama gibi işlemler yapılır. Eğer JMP $EA31 kullanırsanız kendi IRQ rutininiz çalışırken hiçbir şey olmamış gibi klavyeyi kullanabilir veya bir başka assembler rutini çalıştırabilirsiniz. Eğer $EA81 kullanırsanız sadece IRQ rutinleri çalışmış olacaktır. Dikkat ettiyseniz -JMP $EA31 kullanırsanız hiçbir şey olmamış gibi klavyeyi kullanabilir veya başka bir assembler rutin çalıştırabilirsiniz- ifadesini kullandım. Yani aynı anda iki program çalışabilir gibi bir durum var. Şimdi biraz başa dönelim ve interrupt kelimesinin anlamlarına bir daha bakalım. “Akışını durdurmak, yarıda kesmek” demişiz. İnterrupt mikroişlemcinin içinde saniyede 60 kez oluşur, yani asıl çalışan program saniyede 60 kez durdurulur, interrupt rutini çalışır ve işlem bittikten sonra asıl program kaldığı yerden çalışmaya devam eder. Bu nedenle interrupt rutiniyle asıl program aynı anda çalışıyormuş gibi görünür. (SEI komutu işlemci içinde interrupt işlemlerini durdurur) Özetleyecek olursak; 1- İnterrupt vektörü $0314 ve $0315 adreslerinde bulunur. 2- Bu vektörü değiştirmeden önce SEI komutu kullanılmalıdır. 3- Vektör değiştirildikten sonra CLI komutu kullanılmalıdır. 4- Eğer vektörü değiştirdiyseniz kendi rutininiz mutlaka olmalıdır. 5- Kendi rutininizin son komutu mutlaka JMP $EA31 veya JMP $EA81 olmalıdır. 6- İnterrupt saniyede 60 kez meydana geldiği için kendi interrupt rutininiz içinde sonsuz döngü veya çok sayıda iç içe döngü olmamalıdır. Yani rutininizin çalışma süresi 1/60 saniyeden uzun olmamalıdır. İşte örnekler.... *=$0900 start sei ;İnterruptları durdur lda #<user ;kullanıcı rutini adresinin LOW byte’ını sta $0314 ;IRQ vektörü LOW byte adresine yaz ldx #>user ;kullanıcı rutini adresinin HIGH byte’ını sta $0315 ;IRQ vektörü HIGH byte adresine yaz cli ;İnterruptları serbest bırak rts ;BASIC’e dönüş user jmp $ea31 ;İşletim sistemi IRQ rutinine geri dön .end İlk örnekte sadece irq vektörünü nasıl değiştireceğimizi öğreniyoruz. Kendi rutinimizde hiçbir işlem yapmayıp doğrudan işletim sisteminin interrupt rutinine geri dönüyoruz. 2. örnek *=$0900 start sei ;İnterruptları durdur lda #<user ;kullanıcı rutini adresinin LOW byte’ını sta $0314 ;IRQ vektörü LOW byte adresine yaz ldx #>user ;kullanıcı rutini adresinin HIGH byte’ını sta $0315 ;IRQ vektörü HIGH byte adresine yaz cli ;İnterruptları serbest bırak rts ;BASIC’e dönüş user inc $d020 ;Ekranın dış rengini değiştir. jmp $ea31 ;İşletim sistemi IRQ rutinine geri dön. .end

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