C64 için Püf Noktaları

MAKİNA DİLİNİN PÜF NOKTALARI

Hepinize merhaba. Bu ay da sizlerle birlikteyiz ve yazımıza makina dilinin interruptlarını anlatarak devam ediyoruz. daha önce de bir "kayan yazılar” (smooth scroll) programı yayınlamıştık. Ama bu program RASTER INTERRUPT tekniklerini kullanmadığı için aynı rutinin interruptlarla çalışan versiyonunu anlatacağız. Konuya girmeden önce interruptların çalışma prensibini detaylı olarak inceleyelim. İnterruptlar yapı olarak ikiye ayrılırlar: 41) IRE (maskelenebilir interruptlar): Programcının, kullanacağı bir SEl komutuyla bu interrupt'ın oluşmasını engelleyebilmesi, bu tür interruptlara maskelenebilir interruptlar denmesine yol açmıştır. İstendiği anda oluşması engellenebildiği için programcıların kullanımda tercih ettikleri bir yöntemdir. VIC tarafından üretilen (ve bizim işimize yarayan) dört çeşit IRO bulunur: a) RASTER interrupt: Ekranı tarayan elektron ışınının hangi satırda bulunduğu C-64'ünüz tarafından bilinir ve $DO12 adresinde tutulur. Eğer isterseniz elektron belirli bir satıra geldiği zaman 64'ünüzün bir İnterrupt oluşturmasını sağlayabilirsiniz. Fakat bilmeniz gereken şey RASTER satırlarının normal ekran satırlarıyla aynı olmadığıdır. 1. tabloda da açıkça gördüğünüz gibi yazılabilir ekranın 1. pikseli 50. raster satırına denk gelmektedir. 0. raster satırı ise genelde televizyonlarda görülmeyecek kadar yukarıda bulunur. Tablomuzda dikkat etmeniz gereken başka bir şey de en alt raster satırının 255'ten büyük olduğudur. Bir bayttâ en fazla 255 sayısını tutabildiğimize göre ekranın altında bulunan elektronun yerini nasıl saptayacağız peki? Bu:

sorunu çözmek için C-64'ün tasarımcıları adresinin RASTER satırının 9. biti olarak ayırmışlar. Bu sayede $DO14 ve $DO12 adreslerini kullanarak (512) satırı adresleyebiliriz. Bu sayı da ekranınızda görünen raster satırların hepsini tanımlamaya yeterlidir. Bir RASTER INTERRUPT oluşmasını sağlamak için $DO12 adresine ve adresinin 8. bitine İnterrupt oluşması istenen satırın numarasını yazmak ve adresinin 1. bitinin değerini 1 yapmak yeterlidir. ($DO1A— $01) Bu işlemlerden sonra elektronün belirlenen satıra her gelişinde bir interrupt oluşturulacaktır.

Tablo 1: İşte bir ekranın raster numaraları. Görünen ekran 50. satırdan başlıyor ve 250. satırda sona eriyor. En alt satırın numarası belirli değildir ve TV ekranının dışında sona erer.

b) Light Pen (ışıklı kalem) interrupt'ı: C-64'ümüz aslında elektronun yalnızca hangi satırda olduğunu degil hangi x koordinatında olduğunu da bilmektedir ama elektronun ekranı tarama hızı çok yüksek olduğundan x koordinatını herhangi bir bellek alanına yazmaya vakti yoktur. Ama lightpen kullanmanın temeli elektronu belirli bir x,y koordinatında yakalamak olduğundan C-64'ün herhangi bir yolla bize x koordinatını da bildirebilmesi gerekir. Lightpen elektronu yakaladığı anda bilgisayara bunu bildirir ve bilgisayar da © andaki x koordinatını $DO13, y koordinatını da $DO14 adreslerine yerleştirir. Lightpen yalnızca her taramada bir kez elektronu yakalayacağı için x koordinatını yazmak fazla bir zaman kaybına yol açmayacaktır. Bu arada eğer $DO1A adresinde 4. bitin değerini 1 yaparsanız ($DO1A — $08) x ve y koordinatları yazılır yazılmaz bir interrupt oluşturulacaktır. Bu sayede lightpen üzerinde etkin bir kontrole sahip olabilirsiniz. c) Sprite-Sprite çarpışması: Eğer C-64'ün sekiz sprite'ından Ji ikisi birbirine değerse ve adresinin 3. biti 1 $04) değerindeyse bir inter- Tupt oluşturulur.

d) Sprite-karakter çarpışması: Eğer bir sprite herhan-

gi bir ekran karakterine değerse ve 2. biti 1 ise bir interrupt oluşur. Tabi ki. bu interruptların birkaçını veya hepsini birden kullanabilirsiniz. Bunu yapmak için adresine, yapmak istediğiniz interrupt'ların değerlerini OR'- layarak vermelisiniz. Mesela $DO1A— $05 verirseniz RASTER ve LISHTPEN interruptlarını aktive etmiş olursunuz. Bu durumda interrupt'un hangi sebepten dolayı oluştuğunu anlamak için interrupt rutininizin başında $DO19 registerinin değerini incelemeniz gereklidir. Bu adresin bit anlamları $DO1A'dakiyle aynıdır fakat interrupt hangi sebepten oluştuysa yalnızca o bitin degeri 1'dir. 2) (maskelenemez interruptlar): Aslında bu tür interruptlar konumuzun oldukça dışındadır çünkü NMI'lar genelde hardware (donanım) olaylarını kontrol etmek için yapılır. (Diskle iletişim vb.) Eğer bilgisayarınız bu tür bir interrupt yaratmak istiyorsa sizin programcı olarak yapabileceğiniz hiçbir şey yoktur. NMI kesinlikle gerçekleşir ve programa geri dönülür. Interrupt olayının mantığını kavradıktan sonra bir İnterrupt'un sizin rutininize atlamasını nasıl sağlayacağımızı tartışalım. C-64 ROM'unun en sonunda (yani $FFFE-SFFFF adreslerinde) IR© rutini vektörleri bulunur. Bir interrupt oluştuğu anda işlenmekte olan komut bitirilir ve programın kesildiği adres yığına (stack) yazılır. Bundan sonra Flag'lerin tutulduğu durum registeri de buraya yazılır ve İRA vektörlerinin gösterdiği adrese yapılir. Buradaki en büyük problem, bu vektörleri değiştirmek için ROM'u değiştirmek gerekmesidir. Bu işlemi program yardımıyla yapmak çok zor olduğundan bu vektörlerin gösterdiği adresi kontrol ederek bilgisayar yapımcıların bize bu olay üstünde kontrol hakkı tanımış olmalarını umMAMIZ gerekiyor. Eğer Kernal interrupt rutinini incelersek rutinin en sonunda bir

JMP (80314)

komutuyla karşılaşırız. Bu komut $0314 vektörü üzerinden bir dolaylı sçırama yapmaktadır. Yani RAM içinde bulunan $0314 ve $0315 adreslerinin değerini bizim rutinimizi gösterecek şekilde değiştirirsek ların oluşumu sırasında bizim rutinimize de uğranmasını sağlamış oluruz. Tabi ki rutinimizin sonunda, $0314 vektöründe önceden bulunan $EA31 adresine bir sıç- Tama yapmamız ve kontrolü tekrar KERNAL'a bırakmamız gereklidir. Eğer kontrolü KERNAL'a vermeden geri dönmek istiyorsanız (imlecin yanıp sönmesi, basılan tuşların kabul edilmesi gibi işlemlerin yapılması gereksizse sizin için) JMP SEA84 komutuyla interrupt'u terkedebilirsiniz. Bu adreste bulunan rutin yalnızca yeni bir İnterrupt'ın oluşmasına İzin verecek ve yığına Kernal tarafından yazılan değerleri geri okuyacaktır. NMI rutini için ayrılan vektör de adreslerinde bulunur. Bu kernal rutini de $0318-$0319 adresleriyle oynayarak NMI'ları da kontrol edebilirsiniz. Sanırım hepiniz yazımızın başında bahsettiğimiz Smooth Seroll programının nerede olduğunu merak ediyorsunuzdur. Program ve ayrıntılı açıklamalarını Program döküm eki'nde bulabilirsiniz. Hoşçakalın.

Kayan Yazılar - $0009

İşte sizlere BASIC diliyle yazılmış kısa bir yazı kaydırma altprogramı. Programı çalıştırmak için önce A$ değgişkenine yaklaşık 45 tane boşluk yerleştirmeniz, sonra da ekrandan geçmesini istediğiniz yazıları aynı değişkene eklemeniz gerikmektedir. Eğer yazıların ekranda çıkarak kaybolmasını istiyorsanız A$'e 40 tane daha boşluk eklemeniz gerekiyor. Bu arada A$ değişkeninin uzunluğunun 255 karakteri geçmemesine dikkat etmeniz gerekiyor. Eğer daha uzun bir mesaj yazmak isterseniz, mesajı parçalara ayırarak her parçayı ayrı ayrı kaydırma yoluna gidebilirsiniz. A$'i kullanarak mesajınızı tanımladıktan sonra sıra yazıların hangi satırda kayacağını be- 'lirtmeye geldi. SA değişkenine mesajınızı kaydırmak istediğiniz satırın numarasını koyarsınız (ilk satırın numarası 1'dir.) hazırlık safhanızı tamamlamış olursunuz. Artık istediğiniz zaman GOSUB 9000 komutuyla yazınızı kaydırabilirsiniz.

OKUR MEKTUPLAR

PROGRAM ADI : KAYAN YAZILAR

00010 DERGİSİ"
00020
00030
09000
<867>
<153)
<103)
©9010 PRİNT SAYI THEN FOR R
zi TO
©9020 PRİNT Kel T
O SO:NEXT
69030 IF T*LENCA$)-40 THEN RETURN
©9040 GOTO 9016

Başlanıç Adresi - $OOOA

Eminim hepiniz birçok kez makine dili programlarınızın hangi adresten başladığını unutmuşsunuzdur. Buna karşı alınabilecek en iyi önlem programlarınızın adının yanına başlangıç adresinin ne olduğunu yazmaktır. Ama bu yolla program kaydettiğiniz zaman program ismi için ayrılan ve zaten Çok kısa olan yerin bir kısmını feda etmeniz gerekmektedir. Yapabileceğiniz başka bir şey de bir program başlangıç adresi bulucu kullanmaktır. Burada yayınladığımız program bu işi kısa yoldan halletmektedir. Bildiğiniz gibi 1541 disket sürücünüz dosyaları (PRG tipinde olan) saklarken en başına başlangıç adresini yazar. Yani programı okuması gereken bir dosya gibi açar ve ilk iki baytını incelerseniz programın başlangıç adresini kolayca bulabilirsiniz. Programımız bulduğu başlangıç adresini hem 10 hem de 16 tabanına göre yazmaktadır. Daha sonra da disketin hata kanalını okuyarak oluşabilecek hataya karşı sizi uyarır. Bundan sonra herhangi bir tuşa basarak başka bir programın başlangıç adresini inceleyebilirsiniz. Programdan çıkmak istediğiniz zaman programın adı yerine SON yazmanız yeterlidir.

PROGRAM ADI 1: BASLANGIC ADRESİ

00005
00010 PRİNT 1
9,1: INPUT SEROGRAMİN
ISMİ:
60020 POKE 19,0:PRINT
00030 IF THEN END
©0840 IF THEN
<
©0050 OPEN HA
8 <
00055
00080 IE M
00070
©0080 PRİNT YBASLANGIC ADR
,
00090 PRİNT 1
AKSI,
00100 OPEN: 15,8,151 INPUTHİS,E,E$,T,S
15 €
00130 PRİNT BİR TU
SA BASINIZ..."
00140 GET AS2*"GOTO 140
00150 RUN
<a207)>

Ekran Aşağı - Yukarı - $000B

İşte ekran düzenine ve görüntüsüne önem veren arkadaşlar için şahane bir program. artık ekrandaki yazıları değiştirirken daha usta işi görüntüler elde edebileceksiniz. Programımız ekranda yazılı bulunan her türlü şeyi (ne yazık ki yalnızca standart karakter ekranlarını) aşağı ve sonra da yukarı doğru kaydırır. Bu işlemin nasıl oldüğunu göstermek için dataların yanında bir de uygulaması verilmiştir. SYS49152 komutu ile ekran aşağı doğru kaydırılır. Şimdi ekrandaki yazıyı istediğiniz gibi de- Biştirebilirsiniz. Daha sonra da SYS49182 komutuyla ekran geri, yukarı doğru kaydırılır.

PROGRAM ADI 1: EKRAN ASAĞISYUKARI

00010 FOR R-49152 TO 492351READ A:POKE R,
00020 IF THEN PRİNT "DATA HATAS
00030 POKE
00040 POKE 53280,0:POKE
00050 SYS 49152
068060 PRİNT
)(10SPACE DERGİSİ"
©0070 PRİNT "<OOWN> 5YS49152 EKRAN ASAGI"
©0080 PRİNT “<DOKN> SYS49182 EKRAN YUKARI
00090 SYS 49182
00100 END
©1000 DATA I80, 169, S7, 133, 254, 169,
45, 205, 18, 208, 208, 251
©1010 DATA 32, 60, 192, 230, 254, 165, &
54, 2801, 255, 208, 238, 169
©1020 DATA ©, 141, 17, 2808, 88, 96, 1820,
169, 255, 133, 254, 169
01030 DATA 45, 205, 18, 208, 208, 251, 3
2, 60, 192, 198, 254, 165
©1040 DATA 854, 201, 55, 208, 238, 169,
27, 141, 17, 808, 88, 96
01050 DATA 166, 254, 240, 18, 173, 18, 8
068, 168, 41, 7, 9, 16
©1060 DATA 8204, 18, 208, 240, 251, 141,
17, 208, 202, 208, 237, 96

- $000€

Bir program hafızadayken NEW komutu verdiniz, ama birden hatırladınız ki programı kaydetmemiştiniz. İşin yoksa bir sürü POKE ve SYS yazıp eski programı geri almaya uğraş. OLD, programı sizi bütün bu uğraşlardan kurtarıyor. Programı sildikten sonra geri çağırmak için SYS 300 komutunu yazmanız yeterli olur.

PROGRAM ADI 1 OLD
00010 FOR R-300 TO 326:READ A:POKE
60020 IF BC32563 THEN PRİNT "DATA HATASI.
“
©0030 PRINT "SYS 300“
00048 END
01000 DATA 169,255,160,1,145,43,32,51
©1010 DATA 165,165,34,24,105,2,133,45
Bl020 DATA 165,35,105,0,133,46,76,94
01030 DATA 166,73,141