Joystick Cursor
Retro bilgisayarAmiga gibi aletlerde, ekrandaki bir ok işareti, maus adı verilen bir araç yardımıyla hareket ettirilir. Bu oku bir tür cursor sayabiliriz. Peki Commodore 64 için de böyle bir şey yapılamaz mı? Bizim bir cursor'umuz zaten var. Maus yerine de joystick'i kullansak?
Şimdi programı MDE ile yazıp bir yerlere kaydedin. Sonra da normal LOAD ile yükleyip RUN ile çalıştırın. Görünürde bir şey olmayacak. Şimdi joystick'inizi PORT 2'ye takın ve kolu hareket ettirin. Cursor'un, kolun gösterdiği yönde hareket ettiğini göreceksiniz. RUN-STOP/RESTORE yapmadığınız sürece bu devam edecektir. Eğer kazayla bu tuşlara basarsanız, SYS 49152 ile yeniden joystick-cursor işbirliğini aktif hale getirebilirsiniz.
Şimdi gelelim teknik ayrıntılara... Programı RUN ile çalıştırdığınızda, esas program kısmı $C000-$C066 (49152-4 9254) arasına yerleşmektedir. Dolayısıyla buralara hiç dokunmamanız lazım.
Programın assembler kodu dökümünü, SUPER-ASS formatında veriyoruz. Birazdan onun üzerinde incelemelerimize başlayacağız.
Joystick'in hareketinin algılanması ve cursor'un hareket ettirilmesi, interrupt programlaması tekniği ile gerçekleştiriliyor. Şimdi bunu biraz açalım...
C64'ün içinde bazı işlemlerin devamlı olarak yapılması gerekmektedir. Örneğin sistem saatinin ilerletilmesi, klavyenin taranması, cursor'un yanıp sönmesi gibi. Ve tüm bu işlemler, bilgisayarın o anda çalıştırdığı programdan bağımsız olmak zorundadır. Bu nedenle, C64'ün sisteminde, interrupt rutini adı verilen bir program parçası vardır. Saniyede 60 kere C64, yaptığı işi bir süre dondurup bu interrupt rutinini işletir. Demin belirttiğimiz birtakım işler bitince, daha önce işleyen ana program kaldığı yerden çalışmaya devam eder. İnterrupt rutininin toplam çalışma süresi 1/60 saniyeden çok çok daha kısa olduğu için, saniyede 60 kere çağrılması zaman açısından bir sorun yaratmamaktadır. Bu rutin, sistemin içinde $EA31 (59953) adresinden başlamaktadır. Bu adres, $EA ve $31 olarak büyük ve küçük byte'larına ayrılabilir. İşte bu iki sayı da, $0314/$0315 (788/799) adreslerinde saklanır.
Biz tam burada işe karışıyoruz. $0314/$0315'e kendi yazdığımız bir rutinin başlangıç adresini yazıyoruz. Artık bilgisayar saniyede 60 kere bizim rutinimizi çalıştıracaktır. Ancak dikkat edilmesi gerekli bir iki küçük nokta var. Öncelikle rutinimiz uzun olmamalıdır. Eğer çok uzun olursa, zaman harcaması artacak ve interrupt rutininin çalışması yüzünden esas işlemlere zaman kalmayacaktır. Bir de, eğer kendi interrupt işlemlerinizi kendiniz yazacak kadar profesyonel programcı değilseniz, yazdığınız minik interrupt programımızın en sonuna JMP $EA31 koyarak esas interrupt rutinini çağırın.
Şimdi gelelim bizim programa... SYS 49152 yaptığınızda, 200-230 arasında gördüğünüz gibi interrupt vektörü $C00F adresine değiştiriliyor. Bu adres, assembler kodunun 280 numaralı satırına denk geliyor. Saniyede 60 kere cursor'u oynatmak çok hızlı olacağı için, saniyede 10 kere işlem yapılacak. Bunun için, $02 numaralı adres sayaç olarak kullanılacak. Burası 6'dan 0'a geri sayılacak ve 0 olduğunda joystick sorulacak. Sonra bu işlem tekrarlanacak.
280-300 arasında interrupt rutinin ilk yaptığı işlemleri görüyorsunuz. $02'deki sayaç bir azaltılıyor ve sıfır olup olmadığı kontrol ediliyor. Eğer sıfır değilse $EA31'deki normal interrupt rutinine atlanıyor. Aksi durumda ise, öncelikle bizim programın joystick ile ilgili kısmı çağırılıyor.
320'de ilk yapılan iş, sayacı yeniden 6 ile yüklemek. Sonra da C64'ün sisteminin, basılan ve klavye deposuna gönderilen tuşların sayısını okuyor. Eğer klavye deposu (keyboard buffer) dolmuşsa, doğrudan $EA31'e atlanıyor.
Dolmamışsa, işlem 390'dan devam ediyor. Önce akümülatör PORT 2'nin gönderdiği değer ile yükleniyor. 0 numaralı bit kontrol ediliyor.
Buradan çıkan sonuç, joystick'in yukarı doğru hareketi ise, akümülatör CRSR UP kodu olan $91 (145) ile yükleniyor ve rutinin çıkış noktasına atlanıyor.
Eğer hareket yukarı değilse, işlem 450'den devam ediyor. Önce akümülatör PORT 2'nin gönderdiği değer ile yükleniyor. 1 numaralı bit kontrol ediliyor. Buradan çıkan sonuç, joystick'in aşağı doğru hareketi ise, akümülatör CRSR DOWN kodu olan $11 (17) ile yükleniyor ve rutinin çıkış noktasına atlanıyor.
Eğer hareket aşağı değilse, işlem 510'dan devam ediyor. Önce akümülatör, PORT 2'nin gönderdiği değer ile yükleniyor. 2 numaralı bit kontrol ediliyor. Buradan çıkan sonuç, joystick'in sola doğru hareketi ise, akümülatör CRSR LEFT kodu olan $9D (157) ile yükleniyor ve rutinin çıkış noktasına atlanıyor.
Eğer hareket sola değilse, işlem 570'den devam ediyor. Önce akümülatör PORT 2'nin gönderdiği değer ile yükleniyor. 3 numaralı bit kontrol ediliyor. Buradan çıkan sonuç, joystick'in sağa doğru hareketi ise, akümülatör CRSR RIGHT kodu olan $1D (29) ile yükleniyor ve rutinin çıkış noktasına atlanıyor.
Eğer joystick bu hareketlerin hiçbirini yapmamışsa veya rutinin çıkış noktasındaki işlemler tamamlanmamışsa, program 630'da $EA31'e atlanıyor. Ancak bir kol hareketi varsa, demin de gördüğümüz gibi akümülatörün içine yüklenen cursor karakteri 650'den sonraki kısımda klavye deposuna gönderiliyor ve geri dönülerek joystick'in okunmasına devam ediliyor.
Aynı mantıkla birçok değişik program yazabileceğinizi, bazı kısa programlarınızı arka planda yürütebileceğinizi belirterek yazımızı bitirelim...
64'ER'den Uyarlanmıştır