ASSEMBLER-9

Kursumuzun şu ana kadar olan 8 bölümünde C-64'ün kullandığı 6510 makine dilinin hemen hemen tüm komutlarını ele aldık. Bu sayıda ise öğrendiğimiz bu komutların ışığında bilgisayarımızın işletim sistemindeki (kernal) rutinlerin kullanımını incelemeye başlayacağız. Eğer makine dili ile biraz ilgilenmişseniz $FFD2 kernal rutinini büyük bir ihtimalle duymuşsunuzdur. “CHROUT” diye adlandırılan bu rutin kısaca ekrana yazı yazdırmaya yarar, fakat tüm işlevi sadece bu kadar değildir. Kernal rutinlerinin birçoğu çok yönlü kullanılmak üzere tasarlanmışlardır. Genelde bir kernal rutininin kullanımı şu üç adımda gerçekleşir. 1. Gerekli değerler akümülatöre veya uygun registere yüklenir. 2. Rutin çağrılır. 3. Hata sorulur ve önlem alınır. Şimdi sırayla bunları ele alalım. Bazı rutinler için gerekli informasyonlar ancak bazı diğer gerekli rutinlerin çağrılmasıyla elde edilebilir.

Bit'i “1” değerini almış olur. Bu nedenle Carry Bit'ini inceleyerek ortaya çıkan bir hata hakkında bilgi sahibi olabilir ve gerekli önlemleri alabilirsiniz. Bu gibi durumlarda akümülatörde hatanın türünü belirten bir sayı yer alır. Görüldüğü gibi makine dilinde hata mesajları Basic'de olduğu gibi doğrudan doğruya ekrana gelmez. Resim 1'de hata numaraları ve bunlara karşılık gelen mesajlar yer almaktadır. Hangi rutinde hangi hata mesajı ile karşılaşabilineceği her seferinde belirtilecektir. Şimdi tekrar $FFD2'deki rutinimize dönelim. Bu rutini kısaca şu şekilde özetleyebiliriz:

İsim: CHROUT Amaç: Bir harfin dışarı verilmesi Adresi: $FFD2 veya desimal 65490 Hazırlık: (CHKOUT, OPEN) Akümülatördeki harf Hata: 0 Register: Akümülatör

Eğer bu rutini daha önce kullan-

mışsanız büyük bir ihtimalle CHKO-

Eğer bu diğer alt programlar çağrılğ UT ve OPEN hazırlıklarını yapmamazsa istenen rutin çalışmaz.

rutin Y-Registerinde bir değer istiyorsa bu değer kesinlikle orada olmalıdır. Aksi takdirde rutin yine istenen işi yapmaz. Kursumuzda yeralacak tüm rutinler için gerekli açıklamalar yapılacaktır. İstenen rutinin çağrımı kesin suretle JSR komutu ile gerçekleşir. Bilgisayarımızın ROM'unda yeralan rutinlerdeki son komut RTS'dir. Bu şekilde rutindeki komutlar sırayla yorumlandıktan sonra ana programa geri dönüş sağlanmış olur. Eğer rutinler işlerken bir hata ortaya çıkarsa rutinden geri dönüldüğünde Carry mışsınızdır. Bu hazırlıklar yapılmadan rutinin çalışmayacağını daha önce belirtmiştik. Burada ise bilgisayarımız ekranı, çıkış kanalı olarak daha önce belirttiği için OPEN rutinine gereksinim duymuyoruz. Şimdi inceleyeceğimiz bir örnekte yukarıda anlatılanları uygulayacağız. Öncelikle Ex-mon'u veya sahip olduğunuz başka bir monitör programını yükleyin. Şimdi hafızanın uygun bir köşesine istediğimiz metni yazmalıyız. Ex-mon'da bu işlem şu şekilde gerçekleşir. K 6000 komutunu girin. Ekrana

aşağıdaki satır gelecektir:
*6000
RUN/STOP'a bastıktan sonra
noktaların yeraldığı satırın başına gi-
din istediğiniz metni yazın.
*6000 MERHABA ....
Metnin sonuna RETURN tuşunun
ASCİ kodu olan desimal 13 ve
$0D'nin yazılması ekran görünümü
açısından her zaman için yararlıdır.
Ayrıca yazdırmak istediğimiz metnin
sonunda bir de BRK komutu yeral-
malıdır. Bunun için monitör progra-
mında iken “M 6006” satırın girip is-
tediğiniz değerleri yazabilirsiniz. Şim-
di asıl Assembler programa geçelim.
Programımız $601C'den başlayacağı
için “A 601C”' satırını yazın ve aşa-
ğıdaki satırları girin.
601CLDY  $00
601E LDA $6000, Y
6021 BEO $602C
Burada yapılan iş asılnda oldukça
basittir: Metnimizin yazılı olduğu ha-
fıza bölgesindeki baytlar teker teker
okunup akümülatöre yüklenir. Bu iş-
lem BEO komutuyla kontrol edilir ve
metnin sonu gelinceye kadar
(BRK - $00) tekrarlanır.
Burada Y-Registeri indeks olarak
seçilmiştir ve programın bundan son-
raki bölümünde döngü içerisinde de-
ğeri bir arttırılacaktır.
6023 JSR $FFD2
6026 BCS $602D
Daha önce belirttiğimiz gibi kernal
rutini kullanılırken ortaya herhangi
bir hata çıkarsa Carry Bit'i “1”” de-
ğerini alır. BCS komutunun yukarı-
da kullanılmasının nedenide budur.
602D adresinde BRK komutu bulu-
nacaktır.
6028 INY
6029 JMP $601E
602C RTS
602D BRK
Aslında burada G 601C ile prog-
ramı çalıştırabiliriz, fakat bu sefer
farklı bir yöntem kullanacağız. Bu-

nun için öncelikle X ile monitör programını terk edin. Ardından aşağıdaki üç satırlık Basic programı yazın. “Out Of Memory Error” mesajı ile karşılaştığınızda NEW yazarak hafızayı temizlemelisiniz. 10 PRINT CHR$ (147) 20 SYS 24604 : REM 24604 — $601C 30 END RUN yazdığınızda $601C adresinden başlayan makine dili programımızın işleyişini gözleyebilirsiniz. Bu yaptığımız $FFD2'deki CHROUT rutini ile yapılabileceklerden sadece biridir. CHROUT'un çıkışı yaptığı kanal ekrandır ve numarası 3'dür. Eğer çıkış yapılacak kanal numarasını değiştirirsek CHKOUT rutini ile yazıcıdan da çıktı alabiliriz. Yalnız bu iş için CHKOUT ve OPEN rutinlerini öğrenmeliyiz.

İsim: CHKOUT Amaç: Çıkış kanalının belirtilmesi Adres: $FFC9, desimal 65481 Hazırlık: X-Registerine dosya numarası verilir. Hata: Akümülatör, X-Register

Değer | Mesaj Anlam 0 BREAK RUN/STOP basılmış 1 TOO MANY FILES En fazla 10 dosya açılabilir 2 FILE OPEN Açılmış bir dosya tekrar açılamaz 3 FILE NOT OPEN Dosya açılmamış 4 FILE NOT FOUND Dosya bulunamadı 5 DEVICE NOT PRESENT Cihaz hazır değil 6 NOT INPUT FILE Bu dosyadan veri okunamaz 7 NOT OUTPUT FILE Dosya yazılamaz 8 MISSING FILENAME Dosya ismi eksik 9 ILLEGAL DEVICE NUMBER Yanlış cihaz numarası Resim 1

Register: Akümülatör, X-Register

Daha önce OPEN ile belirtilmiş her kanal bu rutin kullanılarak çıkış için kullanılabilir. Yalnız burada kullanılacak kanal çıkış yapmaya uygun olmalıdır, aksi takdirde bilgisayar hata mesajı verir. Ayrıca CHKOUT kullanılmadan önce muhakkak OPEN kullanılmalıdır.

İsim: OPEN Amaç: Bir dosyanın açılması Adres: $FFC0, desimal 65472 Hazırlık: SETLFS, SETNAM Hata: 1, 2, 4, 5, 6 Register: Akümülatör, X-Register

Bu rutin kullanımı için sadece JSR $FFC0 satırı yeterlidir. Yalnız bundan önce SETNAM ile dosya adı ve SETLFS ile açılacak dosya kanalı belirtilmiş olmalıdır. Şimdi bu iki rutini

İsim: SETLF Amaç: OPE belirtilmesi Adres: $FFBA, desimal 65466 Hazırlık: Dosya numarası akümülatöre, kanal numarası X-registerine, ikincil adres Y-registerine yüklenir. Hata: Yok Register: Yok için çıkış kanalının

SETLFS ile OPEN rutininde kullanılacak cihazın numarası ve ikincil adresi bilgisayara bildirilir. Cihaz numarası 0 ile 31 arası herhangi bir sayı olabilir, ancak C-64'de sadece aşağıdakiler mevcuttur.

0.... Klavye 1.... Datasette 2.... RS232C-Kanalı

45

3.... Ekran 4'den sonra gelen cihazlar Serial Bus'a aittirler: 4.... Yazıcı 8.... Disket sürücü

Yukarıdaki listede yer alan ikincil adres kullanılan cihaza özel bir sayıdır. Bu sayıyı cihazınızın el kitabından öğrenebilirsiniz (Özellikle farklı marka yazıcılarda çok önemlidir). Eğer ikincil adres kullanmak istemiyorsanız Y-registerine $FF değerini verin. Bu rutinin kullanımı akümülatöre ve registerlere uygun değerleri verdikten sonra JSR $FFBA ile gerçekleşir.

İsim: SETNAM Amaç: Dosya adının belirtilmesi Adres: $FFBD, desimal 65469 Hazırlık: İsmin uzunluğu akümülatöre, ismin adresinin alçak baytı X-registerine, yüksek baytı Y-registerine Hata: Yok Register: Akümülatör, X- ve Y-registerleri

OPEN ile açılacak olan dosyanın isminin yer aldığı adres alçak ve yüksek baytlar şeklinde iki registere yüklenir. Eğer dosyaya herhangi bir isim verilmeyecekse isim uzunluğu olarak akümülatöre 0 değeri verilir. Bu şekilde $FFD2 rutinini kullanarak printer çıktısı almak için gerekli tüm şartları sağlamış olduk, fakat $FFD2 işlem sonunda dosyayı ve çıkış kanalını kapatmamaktadır. Açık kalan kanallar printerin daha sonraki kullanımında sorun yaratacağı için iki kernal rutinine daha ihtiyaç duyacağız. CLRCHN giriş-çıkış kanallarını çıkış konumuna getirirken CLOSE ise açık bir dosyayı kapatmaktadır.

İsim: CLRCHN Amaç: Giriş-Çıkış kanallarının çıkış konumuna getirilmesi Adres: $FFCC, desimal 65484 Hazırlık: Yok Hata: Yok Register: Akümülatör, X-Register Bu rutinin kullanımı için JSR $FFCC satırı yeterlidir. İsim: CLOSE Amaç: Bir dosyanın kapatılması Adres: $FFC3, desimal 65475 Hazırlık: Dosya numarası akümülatöre yüklenir. Hata: 0 Register: Akümülatör, X- ve Y-registerleri

Şimdi yazıcıdan çıktı almamızı sağlayacak programa geçebiliriz. Gerekli tüm aşamalar en basit şekliyle Resim 2'de yer almaktadır. Önce SETNAM rutinini kullanacağız:

| CLOSE |

601CLDA  $00
601E JSR $FFBD
6021 BCS $6053
Bu son satırda BCS ile Carry Bit'i
kontrol edilmekte ve hata olduğu tak-
dirde $6053 adresine atlanmaktadır.
Akümülatörde sıfır değeri olduğu için
dosyamız isimsiz olacaktır. Bundan
sonra SETLFS gelmektedir.
6023 LDA  $04
6025
6027 LDY $FF
6029 JSR $FFBA
602C BCS $6053
Bu aşamada 4 cihaz (yazı-
cı) üzerinden 4 No.'lu bir dosya açıl-
mıştır ve herhangi bir ikincil adres
kullanılmamıştır. En sondaki BCS ise
yine hata kontrolü yapmaktadır.
Şimdi OPEN rutini:
602E JSR $FFECO
6031 BCS $6053
CHKOUT ile çıkış kanalı belirtilir.
6033
6035 JSR $FFC9
6038 BCS $6053
Bu şekilde tüm hazırlıklar tamam-
lanmış oluyor. Metnin yazıcıya gön-
derilmesi ilk programda olduğu gibi
CHROUT ile gerçekleşir:
GO3ALDY  $00
603C LDA $6000, Y
603F BEO $604A
6041 JSR $FFD2
6044 BCS $6053
6046 INY
6047 JMP $603C
Bütün harfler basıldıktan sonra
CLRCHN rutinini çağrıyoruz.
GO4A JSR $EFCC
Son olarak da CLOSE:
604DLDA  $04
604F JSR $FFC3
6052 RTS
Böylelikle 4 No.'lu dosya kapatıl-
mış oluyor. Programımızın son satı-
rı şu şekilde olmalıdır.
6053 BRK
Herhangi bir hata ile karşılaşıldı-
ğında program bu satıra atlamakta ve
BRK ile karşılaştığında durmaktadır.
Bu aylık hoşçakalın....