C64 Türkiye sayı 4, sayfa 14

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 14

Komut sıkıştırma özelliğini kullanmak için programda "ICRNCH", "IQPLOP" ve "IEVAL" isimleriyle bilinen "BASIC TEXT KODLAMA", "BASIC TEXT LIST" ve "BASIC TOKEN DEĞERLENDİRME" vektörlerini de değiştirip uygun programları yazmak gerekmektedir. Bu işle bir ara uğraştım ama devam ettirmedim. Aslında 3-5 komut için uğraşmaya değmez. Ama isteyen uğraşabilir. (İnternetten bulabileceğiniz SIMONS' BASIC programını inceleyebilirsiniz)

ÖNEMLİ NOT 1: Bu programı PC üzerinde VICE emülatörü ile kullanacaksanız VICE'da kartuş eklentisi olmamalıdır. Gerçek C64'te hatasız çalışan programı emülatör üzerinde çalıştırana kadar canım çıktı desem yeridir.

;--------------------------------------------; ; C64 İÇİN YENİ BASIC KOMUTLARI ; ; C64 TÜRKİYE SAYI 4 İÇİN HAZIRLANMIŞTIR ; ; 12-TEMMUZ-2003 HADES ; ; C64ASM V1.1 ILE YAZILMIŞTIR ; ;--------------------------------------------;

* = $C000 comset =cls

lda #<yeni ldx #>yeni sta $0308 stx $0309 rts ;--------------------------------------------;

Buraya kadar olan kısımda programımızın başlangıcını $C000 yani 49152 olarak ayarladık ve yeni komutumuzu değerlendirecek kısmı "yeni" etiketi kullanarak vektörümüze yükledik. Böylece klavyeden bir komut girdiğimizde veya yazmış olduğumuz bir programı çalıştırınca önce bizim komut yorumlayıcımız devreye girecek, daha sonra biz kontrolü C64'ün kendi komut yorumlayıcısına bırakacağız.

;--------------------------------------------; yeni lda $7a ldx $7b sta $fb stx $fc ;--------------------------------------------;

Yukarıda $0073 nolu adresteki CHRGET isimli rutinde bulunan ve program içindeki baytların adresinin tutulduğu iki adresin $7a ve $7b değerlerini okuyup daha sonra kullanmak için saklıyoruz

;--------------------------------------------;

lda #<comset ldx #>comset sta $fd stx $fe ;--------------------------------------------;

Üstteki satırlarda ise yeni komutlarımızın isimlerinin bulunduğu bölgenin başlangıç adresini öğrenip $fd ve $fe adreslerine kopyalıyoruz.

;--------------------------------------------;

ldx #$00 ldy #$00 loop0 jsr $0073 sta $02 loop1 lda ($fd),y cmp #$02 bne nextcom iny tya cmp comlen,x bne loop0 ;--------------------------------------------;

Geldik en önemli kısma. Bu bölümde klavyeden girdiğimiz veya yazdığımız program içindeki komutların yeni komut mu yoksa eski komut mu olduğunu öğreniyoruz. Nasıl oluyor anlayalım.

X registerini yeni komutların sayıcısı olarak, Y registerini de yeni komutun harf sayıcısı olarak kullanmak üzere sıfırlıyoruz. JSR komutu ile program içindeki veya klavyeden girilen o anki karakteri okuyoruz ve saklıyoruz. Sonra bizim yeni komutların başlangıç adresinin tutulduğu $fd ve $fe adreslerini kullanarak komut tablomuzdan o anki karakteri alıyoruz ve daha önce sakladığımız değerle karşılaştırıyoruz. Karşılaştırma sonucu aynı ise karakter sayacını 1 arttırıp AKÜ'ye kopyalıyoruz. Aküdeki değeri X registerini kullanarak komut uzunlukları tablosundaki o anki değerle karşılaştırıyoruz. Eğer eşit değilse klavyeden girilen veya program içindeki bir sonraki baytı almak için "LOOP0" etiketli yere geri dönüyoruz. Eğer karşılaştırma sonucu eşitse bu kez "EXEC" rutini devreye giriyor. Fakat daha önce komut tablosu ile yapılan karşılaştırma sonucunda bir farklılık varsa bu kez "NEXTCOM" etiketli yere sıçrıyoruz ve bir sonraki komut için hesaplamalar yapıyoruz.

;--------------------------------------------; exec txa asl tax lda comexe+1,x pha lda comexe,x pha rts ;--------------------------------------------;

Bu bölümde eğer yeni bir komut olduğu anlaşılmışsa bu komutun çalışması sağlanıyor. Bu ise komut sayacı olarak kullandığımız X registerini önce Akü'ye yükleyip 2 ile çarpıyoruz tekrar X'e kopyalıyoruz. Sonra komut çalıştırma adreslerinin tablosundan bulunan komutun çalışma adresi HIGH BYTE, LOW BYTE olarak yığına atılıyor. Böylece bilgisayar en sondaki "RTS" komutunu işlediği anda "PROGRAM COUNTER" de yeni komutun adresi bulunduğu için yeni komutu çalıştırıyor.

;--------------------------------------------; nextcom lda comlen,x clc adc $fd sta $fd bcc next0 inc $fe

Klavyeyle gezinmek için ← ve → tuşları.