ASSEMBLER-10
Retro bilgisayar6510 makine dilini tanıtan kursumuzun geride kalan dokuz bölümünde, dört tanesi dışında tüm komutları ele almıştık. Bilgisayarımızın Interrupt'ları ile ilgili olan son dört komut ise bu ayki yazımızın ana konusunu oluşturmaktadır. Assembler'ı Basic'ten ayıran en önemli özellik Interrupt'lardır. Dört adet 1-Bayt'lık komut Assembler kullanıcıları için sınırsız olanaklar sunmaktadır. İsterseniz işe yeni başlayanlar için Interrupt'ın ne anlama geldiğini açıklayalım. Bilgisayarımız açık kaldığı süre zarfında her an bir işle uğraşmaktadır. Örneğin program yazarken çoğunlukla kernalda yer alan bir geciktirme döngüsü ve Input alt programı bizden veri girişi yapmamızı beklemektedir. Cursorun yanıp sönmesini sağlayan, TIS$ saatini işleten ve daha birçok hayati önem taşıyan işlevi yerine getiren Interrupt'lardır. Yazı dizimizin ilk bölümünde bir insanla bilgisayar arasındaki farkı belirtirken insanın aynı anda birkaç iş yapabildiğini, buna karşın bilgisayarın ise yalnızca tek bir işi çok hızlı olarak (aşağı yukarı saniyenin milyonda biri sürede) gerçekleştirdiğini söylemiştik. Bu durumda bilgisayar birkaç işlem birden yapmak isteyince, bunların hepsine ayrı ayrı kısa bir zaman ayırmakta ve sırayla hepsini halletmektedir. “Interrupt” sözcüğünün dilimizdeki karşılığı “kesinti”dir. Bilgisayarımız belli zaman aralıkları ile programı kesmekte, JSR ile bir alt programa atlamakta, buradaki işlemleri yapmakta ve tekrar kaldığı yere dönmektedir. Tabii bu zaman aralıkları çok çok kısa olduğu için (saniyenin altmışta biri) biz bunu fark edemeyiz. İşte Interrupt olayının kısa özeti budur. Hemen hemen bütün mikroişlemciler bu tür bir kesinti sistemine sahiptir. Aşağıdaki sorular ve cevapları Interrupt'lar hakkında daha detaylı bilgi verecektir: 1.) Mikroişlemci (CPU) Interrupt'lar için kaç tane giriş kanalına sahiptir? 6510 mikro işlemcisinde (RESET sayılmazsa) iki tane kullanılabilir Interrupt girişi mevcuttur. Bunlara biraz sonra detaylı olarak değineceğiz. 2.) CPU, önemli ve daha az önemli kesintiler arasında bir ayırım yapabilir mi? Mikro işlemci önemli ve daha az önemli kesintiler arasındaki ayrımı sadece iki Interrupt girişinin önceliklerine göre belirleyebilir. IRQ adındaki birinci Interrupt 6510
Anıl Gül makine dili komutlarıyla doğrudan doğruya kullanılırken, NMI (Non Maskable Interrupt) adındaki diğer Interrupt'ın kullanımı bu kadar kolay değildir. Bu nedenle IRQ'ya göre NMI daha önceliklidir ve önemli işlerde kullanılır. 3.) Interrupt sistemi nasıl değiştirilebilir veya devre dışı bırakılabilir? Prosesörün Flaggen-Register'inin ikinci Bit'inden serbest bırakılabilir. Bu Bit aynı zamanda Flag olarak da adlandırılır ve özel iki komutla kumanda edilir. NMI için ise prosesör işlemleri ayrıca durdurulamaz. 4.) CPU herhangi bir kesintiye nasıl tepki gösterir? Bu soruyu dört şık halinde yanıtlayacağız: a) Her komutun sonunda mikroişlemci otomatik olarak Interrupt sisteminin durumunu kontrol eder. Eğer iki Interrupt'tan biri serbest bırakılmış ise, çalışan ana program durur ve kesinti başlar. b) Önce programın kesildiği andaki Program Counter (Program sayacı) değeri yüksek ve alçak bayt olarak stack'a yazılır. Daha sonra statü-registeri de aynen kaydedilir (Resim 1). c) I-Flag'a “1” değeri verilerek de diğer gereksiz kullanılabilir Interrupt'lar (IRQ) ortadan kaldırılır. d) CPU son olarak belli iki adresdeki değerleri alır ve bunları program sayacına kaydeder. Böylelikle ana program içinde çalışması istenen ikinci bir programın da adresleri bilgisayara bildirilmiş olur. Resim 2'de 6510 makine dilinde mümkün olan kesinti türlerinin orijinal adresleri yer almaktadır. Yalnız bu listeye RESET de bir Interrupt çeşidi olarak dahil edilmiştir. Gerekli düzenlemeleri yaparak aynı IRQ'da olduğu gibi, RESET tuşuna basıldığında hafızanın herhangi bir bölgesinde bulunan programı çalıştırabilir veya programlarınızın RESET'e basılarak kırılmasını engelleyebilirsiniz. Bu işin nasıl yapılacağını daha sonra açıklayacağız. Şimdi isterseniz son dört komutu da öğrenelim:
Interrupt'ın Anahtarları: CLI, SEI, RTI, BRK
IRQ olarak adlandırılan Interrupt, statü registerindeki I-Bayrağı kullanılarak devre dışı bırakılabilir. “Clear Interrupt Mask” sözcüklerinden türetilmiş olan CLI komutu I-Bayrağını temizlemektedir. Interrupt'ın her kullanılışından sonra işlemler tekrar prosesöre bırakılacaksa statü registerindeki bu Bit CLI ile sıfırlanmalıdır. SEI (Set Interrupt Mask) ise CLI'nın tam tersini yapmakta, yani I-Bayrağına “1” değerini vermektedir. Bu şekilde Interrupt'ı kendi isteğiniz doğrultusunda kullanabilirsiniz.
TST
GO WITH THE JON STACK
Resim 2: Interrupt çeşitleri
Yukarıdaki her iki komut da 1-bayt uzunluğundadır ve işlem süreleri 2 cycle'dır (çevrim). RTI (Return from Interrupt) ise “Interrupt'tan geri dön” anlamına gelmektedir. Bu komut bir bakıma yakından tanıdığımız RTS ile aynı işleve sahiptir. Yalnız RTS eski program sayacı değerini stack'tan alırken, RTI ayrıca statü registerini de stack'tan almaktadır. Bu işlem şu sırayla gerçekleşir: 1) Mikroişlemcinin eski statüsü stack'tan alınır ve statü registerine yazılır. 2) Stack göstergesi 1 arttırılır. 3) Eski program sayacının alçak baytı stack'tan alınır ve yerine yazılır. 4) Stack göstergesi tekrar 1 arttırılır. 5) Eski program sayacının bu sefer yüksek baytı stack'tan alınır ve yerine yazılır. 6) Stack göstergesi 1 arttırılır. Bu şekilde kesintinin gerçekleştiği andaki konuma tekrar dönülmüş olur. Aynı zamanda I-Bayrağı da silinmiştir, zira kesinti olmadan önce bu bayrağın değeri sıfırdır ve eski statü registeri olduğu gibi yerine yazılmıştır. RTI da diğerleri gibi 1 bayt'lıktır, yalnız işlem süresi 6 cycle'dır (çevrim). Son komutumuz olan BRK'yi (break) daha önce birçok kez kullanmıştık. BRK komutu Basic'ten tanıdığımız STOP ile hemen hemen aynı görevdedir ve daha çok programların test edilmesinde kullanılır. Aslında bilgisayarımız mikroişlemcisi BRK ile karşılaştığında aynı IRQ'da olduğu gibi hareket etmektedir. Bu işlem şu şekilde gerçekleşir: a) Program sayacı 2 arttırılır. b) Statü-register'indeki 4. Bit olan B-Bayrağı “1” yapılır. c) Program sayacının yüksek baytı stack'a yazılır ve stack göstergesinin değeri 1 azaltılır. d) Aynı işlem program sayacının alçak baytı için de gerçekleşir. e) Statü registeri de stack'a kaydedilir. f) Statü registerindeki I-Bayrağının değeri 1 yapılır. g) Program sayacına $FFFE/ $FFFF vektörünün gösterdiği değer yüklenir. Bu değer aynı zamanda IRQ'larda da kullanılır. Görüldüğü gibi BRK'nin arkasında oldukça karmaşık işlemler yatmaktadır. BRK de 1 bayt'lık komuttur, fakat işlem süresi 7 cycle'dır (çevrim). Bu şekilde Interrupt'ları kullanırken gereksinim duyacağımız tüm komutları öğrendik. Şimdi kısaca Interrupt'ların bilgisayarımızın hangi birimleri ile ilişkisi olduğunu göreceğiz. Bunları şöyle sıralayabiliriz: 1) VIC-II-Chip'i (MOS 6566/6567 Video Interface Controller) 2) Her iki CIA (MOS 6526 Complex Interface Adapter) 3) RESTORE tuşu 4) Expansion-Port 5) RESET (Bu listeye tamamen ait değilse de sözü edilmeden geçilemez.)
Resim 4: Interrupt-Latch-Register (53273 - $D019) 46
Interrupt ve VIC-II-Chip'i:
C-64'ün görüntü işlevlerini yerine getiren VIC-Chip'inin Interrupt'lar için kullanımı iki registerle gerçekleşir. Bu yöntemle yapılabilecekler dört başlık altında toplanır: 1) Raster satırları (Ekranı sürekli tarayan yatay çizgiler) 2) Sprite'ların arka plan ile çarpışmaları 3) Sprite'ların birbirleriyle 4) Işıklı kalem (Light-Pen) Bu son şıkka pek fazla kullanım alanına sahip olmadığı için değinmeyeceğiz.
VIC-II-Chip'indeki “Interrupt Enable Registeri”, yani
Interrupt'ı devre dışı bırakan register $D01A (53274) adresinde yer almaktadır (Resim 3). Bu registerden yukarıdaki dört olaydan hangi biri veya birkaçı için mikroişlemciye veri gönderilmesi gerektiğini belirleyebiliriz. Bu dördü için burada ayrı bir Bit yer almaktadır. Eğer bu Bit “1” ise Interrupt serbest bırakılır, yani kullanılabilir, 0 ise devre dışı kalır. Bitler registerde şu şekilde yerleşmiştir: Bit 0 Raster satırları Bit 1 Sprite/Background çarpışması Bit 2 Sprite/Sprite çarpışması Bit 3 Işıklı kalem Bit 4-7 Kullanılmamıştır ve 0'dır. VIC-II-Chip'inin 25. Register'i ($D019— 53273) “Interrupt-Latch-Register” olarak adlandırılmaktadır. Eğer dört seçenekten biri $D01A'dan seçilirse 25. Register'de de buna karşı gelen Bit “1” değerini almaktadır. Bit yerleşme düzeni aynı bir öncekindeki gibidir (Resim 4). Yalnız buradaki tek fark Bit 7'dir. Eğer 0-3 Bit'lerinden biri 1 değerini alırsa 7. Bit de kendiliğinden 1 olmaktadır. Bu şekilde bu Bit okunarak kolayca VIC-II-Chip'inde herhangi bir Interrupt'ın serbest bırakılıp bırakılmadığını anlayabiliriz. Son olarak bu registerin ilginç bir özelliğine değineceğiz. Burada eğer herhangi bir Bit'i silmek isterseniz yerine yine “1” yazmalısınız. Bu aylık da bu kadar. Gelecek sayıda Interrupt'lar hakkında gerekli temel bilgiyi edindikten sonra oldukça kapsamlı bir program yazacağız. Hoşçakalın.
TST
E.. .0 MEG
ETST