Bu sayfadaki yazılar
Sayfanın metni
Sayfa 70
kullanıcılarından çoğu interruptlar hakkında şöyle ya da böyle bilgi sahibidir, ancak hemen hemen hepsi rin nasıl kullanılacağını bilmez. Bu yazımızda interruptların nasıl kullanılacağı üzerine kısa bir bilgi vermek İstiyoruz. Her şeyden önce interruptları neden ve nerede kullanırız. (Burada okuyuculara bir şey iletmek istiyoruz. İnterrupt kelimesinin TDK Bilişim Terimleri Sözlüğündeki karşılığı Biz bu terimin ınterrupt işleminin ancak bir bölümünü kapsadığına inanıyoruz. Bu nedenle de yazımız boyunca İnterrupt kelimesini olduğu gibi kullanacağız.) Çoğu zaman bir programı kullanırken aynı anda bir başkasını da kullanma ihtiyacını duyarız. Örneğin ekranımızın içinde bir pencere açarak birinci programımızı bu pencerede RUN ederken, ikincisini ekranın kalan bölümünde işletebilmek bazı hallerde çok ihtiyaç duyulan bir şeydir. Ya da daha basit olarak bir programı bilgisayara girmeye çalışırken bir yandan da müzik çalışması çoğumuzun hoşuna gider. İşte multi-tasking (çoklu görev) ihtiyacı duyduğumuz bu anlarda interruptlar bize yardımcı olurlar. Şöyle söyleyelim. Ekranda ya da daha genel anlamda bilgisayarda bir program çalışırken, ikinci bir programın çaıştırılması için İNTERRUPT'larına ihtiyaç duyuyoruz. Çalışan birinci programın “saydam” kılınması ancak İRA İN-TERRUPTlarından yararlanarak mümkündür.
Nasıl Çalışır?
Bir interrupt saniyede 50 kere gerçekleşir. Çünkü kullanılan program ister BASİC, ister Makine Dili olsun Commodore'unuzu durdurur ve kendi küçük Makine Dİli programına geçer. Bu öylesine büyük bir sürat kazandırır ki, sistemin çalışması saydamlaşır. Bir İR& İnterrupt Reguest (Araya gitme talebi) sırasında bilgisayarınız, SCAN THE KEYBOARD, UPATE THE SYSTEM CLOCK gibi komutlar verir sadece, IRA gerçekleştiğinde Commodore 64'ünüzün kontrol kodunu bulabilmesi gereklidir. Bellek tası 788 ve 789 (HEX SO314 ve $0315) adreslerinde istenilen yanıt bulunabilir. Bu adreslerde saklanan iki rakam kontrol kodunun endirek başlama adresini oluşturur.
Bellek veri RAM'deki 788 ve 780 adreslerine yerleştirilmiştir ve bilgi istenildiği gibi değiştirilebilir. İşlemcinin bilgisayara kontrol yordamını gerçekleştirmesini söylemesinden önce İlk yapmasını İstediğimiz şeyi yaptırabiliriz. Hatırlayalım İRA her saniyede 50 kere gerçekleşmekteydi. Bu her ne yaparsa yapsın, bilgisayarınıza saniyede S0 kere RUN eden bir program yüklediğiniz anlamına gelir. Bu aynı zamanda iki programı çalıştırmanın yoludur. Daha önce de söylediğimiz gibi 788 ve 789 adresleri normal İN-TERRUPT KOD'unun dolaylı başlama adresini içerirler. 788 adresi dolaylı başlangıç adresinin low byte'ini, 789 adresi de high byte"- ını verir. Gerçek adresi bulmak için; AD — PEEK(X) 4*- PEEK(X 4 formülüne başvurmanız gerekiyor. Bu formülle standart interrupt kodunun gerçek adresini nesaplayabiliriz.
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 71
AD — PEEK(788) 4 PEEK(789) *256:PRİINT AD
Bu formül sonucunda elde edeceğimiz adres 59953 (SEA31) olacaktır. Bu adresi bir kenara not edin, çünkü normal rutinimizin sonunda ana bir JUMP yapmamız gerekecektir. Eğer bu sıçramayı yapmazsak sistem, keybodcrd'u tarayamaz ve sonuçta kilitlenir. Onun için kodumuzdaki son direktif şöyle olmalıdır:
JMP SEA31
Anlamıyorum diye sinirlenmeyin, bunları yapmaya başladıkça konu açılık kazanacaktır. Örnek olarak vereceğimiz programlar yeni başlayanlar için olacaktır.
Oluşturulur?
Eğer assembler'la interrupt oluşturacaksak şöyle kısa bir örnek verebiliriz. (Aslında interrupt'ları oluşturmanın hemen tek yolu makine dilidir. Ancak okuyucuların çoğunda monitör programı olmadığı, olsa bile kullanmanın zorluğunu düşünerek BASIC'e dönüştürülmüş örnek programlar vermeyi tercih ettik.):
MAKİNE DİLİ PROGRAM
(İNT 4 (M)) (Monitör programıyla yazılabilir) . SEl LDA $20 $C003 STA $0314 $C006 LDA #& $CO $c008 STA $0315 CLI $00 $C022 STX DO20STX $C025 DEX $C026 BNE $C022 $C028- JMP SEA3A
Programımızda $C020 kodumuzun başlangıç noktası, JMP $EA31'de son yönergemizdir. Bu, interrupt'larla çalışan yazılımlar oluşturmak için standarttır, ancak bazı programcılar bu işlemler sırasında başlangıç için bazı şeyler yapmak isteyebilirler. Bunun teknikleri üzerinde yerimizin sınırı ölçüsünde durmaya çalışacağız. Rutin bellekte 49152 ($C000) adresinde başlamaktadır. Burası BASIC INTERPRETER üzerine yerleştirilmiş bir RAM'dır. Her RAM bölgesi -BASIC ya da SİSTEM DEĞİŞKENLERİ ile çatışma olmaması koşuluyla- kullanılabilir. Bazı bölgeleri belirtelim: $C000(49152)'den $D063(53347)'a: Burası yedek AK RAM'dır. BASIC INTERPRETER üstündeki normal BASIC RAM'ından ayrılmış olduğu için BASIC'ten etkilenmez. BASIC RAM $800(2048)'den $9FFF(40959)'a: Kodumuz bu adreslerde BASIC RAM'ın üstüne yerleştirilecektir. Ancak korumazsak