INTERRUPT'LAR

Geçen sayıda Interrupt'lara bir giriş yapmış ve makine dilindeki ilgili komutları incelemiştik. Şimdi bu sayıda bir programla Interrupt'ların kullanımını göreceğiz. C-64'ün video chip'inin Interrupt'lar ile kumanda edilmesiyle oldukça güzel efektler elde edilebilir. Bu nedenle IRQ'lar demo ve introlar için vazgeçilmez bir unsurdur. Şimdi yazacağımız program ekranın dış çerçevesinde C-64'ün tüm renklerini şeritler halinde gösterecektir. Yalnız programa geçmeden önce ekranda resmin nasıl oluştuğunu bilmemiz gerekmektedir. Ekranı sürekli tarayarak gördüğümüz resmi oluşturan katot ışınının konumu iki bayttan takip edilebilir. Bu iki bayt Raster Register'i olarak adlandırılır. Burada fazla detaya inmeden ekrandaki satırların 0'dan 280'e kadar numaralanmış olduğunu belirtmemiz yeterlidir. Ekranın 280 satır olmasının nedeni çerçevelerin ve görünmeyen kenarların da bu sayıya dahil edilmiş olmasıdır. Yazı alanının başladığı satır monitör-

7 ,Baza FB
vr
GEBE
A9 28 ağ,
.6003 80 14 STA | “sesi da vE
AS #66 | bisi
BD 13 63 STA B315 |
AS Fa LDA #F8 | Fo
BD 12 Da STA Dai?
20 be
NO 11 DE LDA Dali
28 7F AND HZE
(8015 BD di DE STA
AS Bİ LDA | En 2m De STA Dere
SD ADE STA DOİA | (sase Aa 32
AS BALDA | En iz na STA
©n DR STA | dc Gi EA
as v4 LDA |
— STA Be | za ser
se LT AS Be — Lna Heba
Ba S0 JA DE STA DOLA
Ra Ri LDA
Bn 14 B3 STA
Aa LA LDA
,8869 80 15 ex STA Balm
KA LDA
28 ve STA
• 6034
Se

83266 (Bit 0-0)

83285 (Bit?)

Resim 1: Raster registerinin 9 Bit'i

ANIL GÜL'den monitöre değişmektedir, fakat genelde 50 civarındadır. Yukarıda sözünü ettiğimiz Raster registerini oluşturan baytlar şunlardır:

$D012 (53266) $D011 (53265)

baytındaki sadece 7. Bit'i Raster satırının yüksek baytı olarak bizi ilgilendirmektedir. Raster registerinin 9 Bit'i Resim 1'de gösterilmiştir. Bu registerin en ilginç özelliği değerinin değiştirilebilmesidir. Bu şekilde istenen Raster satırında $D01A'daki Interrupt-enable-registeri (geçen sayıda görmüştük) ile serbest bırakılmış bir IRQ devreye sokulabilir. VIC-II-Chip'inin programlanmasına geçmeden önce atılması gereken adımları belirtelim: 1.) $D012 ve $D011 adresinin 7. Bit'inden IRQ'nun devreye sokulacağı raster satırı belirlenir. 2.) $D01A'daki Interrupt-enable-registerine 1000 0001 verilerek Raster satırı Interrupt'ı serbest bırakılır. Bundan sonraki adım IRQ'nun mikro işlemci tarafından yorumlanmasıdır. Geçen sayıda belirttiğimiz gibi IRQ $0314/5 ($314/5) vektörünün gösterdiği adrese dolaylı olarak atlamaktadır. Bu vektör değiştirildikten sonra kendi rutinimizi göstermelidir. 3.) $314/5 rutini yardımcı IRQ rutinine yönlendirilir. Bu şekilde gerekli tüm hazırlıklar oluyor. Gerisi tamamen yapacağımız programa bağlıdır. Resim 2'de programımızın akış diyagramı yer almaktadır. Şimdi satırları teker teker inceleyebiliriz. Önce $6000 adresinde başlayan (SYS 24576 ile çalıştırabilirsiniz) hazırlık aşaması:

$6000 Adım 3:

IRQ'nun kesilmesi

6001 LDA # $28
6003 STA $0314
6006 LDA # $60
6008 STA # 0315

IRQ rutininin alçak baytı IRQ vektörü (alçak bayt) IRQ rutininin yüksek baytı IRQ vektörü (yüksek bayt)

Adım 1:
600B LDA # $F8 Yazı ekranının bittiği raster
satırı. Bu satırdan itibaren
satır siyah olmalıdır.
600D STA $DO12 Raster registerinin alçak
baytına yazılır.
6010 LDA £DOl1
6013 AND # $7F

Raster satırının yüksek baytı 0111 1111 sayısı 7. Bit'i temizler Değer geri yazılır. Böylelikle IRQ'yu başlatacak Raster satırı belirlenmiş olur.

6015 STA $DOL1

GO WITH THE 2

Adım 2:
6018 LDA # $81 Bu sefer 1000 0001 sayısı
ya-
zılır (Raster Interrupt'ı için)
STA $DOLA
Bazı başlangıç değerlerinin belirlenmesi:
601D LDA #$00 Siyah rengi (kodu 0)
601F STA $DO20 Çerçeveye yazılır.
6022 LDA # $04 Bant kalınlığı belirlenir
6024 STA $02
6026 CLI IRO kapatılır.
6027 RTS Hazırlık aşamasının sonu.

Bundan sonra Interrupt'larda bizim $6028'den itibaren yazacağımız program çalışacaktır. İlk önce Interrupt'ın VIC-II-Chip'inden mi, yoksa mikroişlemciden mi kaynaklandığı araştırılır:

6028 LDA $DO19 Eğer bu adresdeki 7. Bit “*1””
değerini almışsa İnterrupt
geliyor
demektir.
Değer geri yazılır.
602B STA $DO19
60Z2E BMI $6037 Eğer VI-IRO ise program

$6037'ye atlar. CIA-IRQ durumu:

6030 LDA $DCOD Interrupt kontrol regis-
teri temizlenir.
6033 CLI IRÇ'dan çıkılır.

Bu şekilde mikroişlemcinin Interrupt'ları arasına bizim yazacağımız VIC Interrupt'ları yerleştirilebilir.

6034 JMP CIA-IRO normal rutinlerine
atlar.
için programımız:
6037 LDA $DO12 Hangi satırda IRO'nun baş-
latıldığını belirlemek için

Raster Register'ine bakılır.

$603A CMP # $F8 Text ekranının sonu olup olmadığına bakılır. Eğer text ekranının sonu ise

$604F'ye atlanır.

Bundan sonraki program bölümü bir sonraki şerit için kullanılır.

603E CLC
603F ADC $02
603C BCS $604F

Toplama işlemi için hazırlık. Şeridin genişliği $02 adresinden alınır. Yeni değer Raster registerine yazılır.

6041 STA $DO12

Böylelikle bir öncekinden bir bant kalınlığı kadar aşağıda yer alan Raster satırı Interrupt başlangıcı olarak belirtilmiş olur. Bundan sonra ise deneme yoluyla ayarlanmış bir geciktirme döngüsü yer almaktadır.

6044 LDY # $03
6046 DEY Geri sayım
6047 BNE $DO20 Next Y (Y-0 olana dek)

Bir sonraki Raster Interrupt'ına kadar çerçeve rengi-

Döngü başlangıç değeri

VIC Interrupt'ına bakılır.

kesilir belirlenmesi

Yazı ekranının alt tarafındaki Raster satırı belirlenir

Karşılaştırma: Raster satırı — Yazı ekranının altı

Raster IRQ açılır.

Yazı ekranının altı Hayır

-Çerçeve rengi siyah, “Şerit kalınlığı 4 olarak

Şerit genişliği Raster Registeri'ne eklenir

Normal IRQ'ya dönüş, rutin değiştirilmesi, rutininin kapatılması

Raster-Interrupt'ı kesilir.

Normal vektörleri

Registeri silinir, başlatılır

Normal IRQ'ya dönüş

Çerçeve rengi siyah

Yazı ekranının üstündeki Raster satırı verilir.

Çerçeve rengi: Açık mavi

IRQ başlatılır.

Normal IRQ'ya dönüş

Resim 2; VIC-IRQ programının akış diyagramı

6049 INC $DO20 Renk kodu bir arttırılır.

Eğer çerçeve renginin kodu 15'den büyük olursa tekrar 0'dan başlanır, zira 5.-7. bit'ler kullanılmaktadır. Bundan sonra tekrar normal IRQ rutinlerine dönülür. 604C JMP $EA31 Bu şekilde yazı ekranının kenarlarındaki çerçeveler ele alınmış oluyor. Bundan sonra üst ve alt tarafta kalan bölümler ile uğraşacağız:

604F LDA # $00
6051 STA $DO20

Siyah rengin kodu çerçeve rengi registerine yazılır. Yazı ekranının yukarıdan başladığı Raster satırı Raster registerine yazılır. Tekrar normal IRQ rutinlerine dönülür

6054 LDA # $32
6056 STA $DO12
6059 JMP

Bu son bölümde üst ve alt kısmındaki bölümleri siyah olması gerektiğini belirttik. Kendi yazdığımız Interrupt rutini bu satırlarla sona ermiş oluyor. Yalnız istenildiği zaman bilgisayarın normal ekranına dönülmesi için birkaç satır daha eklememiz gerekmektedir. SYS 24668 ile C-64 ilk konumuna gelecektir.

605C
605D LDA # $00
605F STA $DOJA
6062 LDA # $31
6064 STA $0314

Interrupt kesilir. Raster-IRQ durdurulur.

IRQ vektörünün eski haline dönüştürülmesi Raster registerine yazılır. Tekrar normal IRQ rutinlerine dönülür.

6056 STA $DO12
6059 JMP $EASI
6067 LD # $EA
6069 STA $0315
606C LDA # $0E
606E ST $DO20
6071 CLI
6072 RTS

Açık mavinin renk kodu çerçeve registerine yazılır. IRQ'dan çıkılır.

Programımız artık tamamlanmış durumdadır. Çalıştırmadan önce diskete ve kaset'e kaydetmenizi tavsiye ederim. SYS 24576 ile programı başlattığınızda ekranın dış çerçevesinde renkli şeritler gözükecek ve aynı zamanda Cursor yanıp sönerek sizden emir bekleyecektir. Programımız bazı değişikliklere de olanak sağlamaktadır. POKE komutu ile 2 No.'lu adresteki değer değiştirerek çerçevedeki bantların kalınlığını istediğiniz gibi belirleyebilirsiniz. Yine POKE komudunu kullanarak 24645 adresindeki döngünün başlangıç değeri değiştirilebilir. Deneyerek göreceğiniz gibi bu tüm Interrupt programlarında süre oldukça önemli bir rol oynamaktadır. Eğer bu süreyi doğru olarak belirleyemezseniz ekranda istemediğiniz şeyler olacaktır. Örneğin yukarıdaki örneğimizde şeritler hareket etmeye başlar.

Program üzerinde değişiklik yapmaya olanak sağlayan diğer bir nokta da şeritlerin başlangıç ve bitiş değerleridir. Bu değerler program içinde yazı alanının yüksekliği ile aynı olacak şekilde ayarlanmıştır. POKE 24661, sayı ile şeritlerin başlangıç ve POKE

24635, X: POKE 24588, X ile de şeritlerin bitiş değerlerini değiştirebilirsiniz. Daha önce de belirttiğimiz gibi yazdığımız programda şeritlerin başlangıcı 50. Raster ve bitişi 248. Raster olarak belirtilmiştir.

Bu yazıdan edindiğiniz bilgilerle değişik Interrupt programları yazabilirsiniz. Yalnız hemen şunu belirtelim: Ekranı tarayan ve belli bir Raster'de VIC-Interrupt'ı başlatan elektron ışınının hızı çok yüksektir. Bu nedenle yazacağınız alt program fazla uzun olmamalıdır, zira daha işlem tamamlanmadan bir sonraki Interrupt başlayabilir.

RAM KARTI (INTERNAL)

İRHENOKTAS!