Bu sayfadaki yazılar
Sayfanın metni
Sayfa 15
next0 inx cpx commax bne loop1 lda $fb ldx $fc sta $7a stx $7b jmp $a7e4 ;--------------------------------------------;
Bu bölümde ise komut tablosundaki bir sonraki yeni komutun adının adresi hesaplanarak bütün kontrol işlemine geri dönülüyor. Bunun için bir önceki komutun adının uzunluğu komut tablosunun başlangıç adresinin tutulduğu $fd adresindeki değerle toplanıyor ve geri yazılıyor. Sonra ise komut sayıcısı olan X registeri 1 arttırılıyor ve yeni komutların toplam sayısı olup olmadığı kontrol ediliyor. Eğer eşit değilse "LOOP1" etiketli yere geri dönüp karşılaştırma işlemlerini tekrar yapıyoruz.
Komut sayıcısı maximum komut sayısına eşit olduğu halde yeni komut bulunamadıysa artık kontrolü eski komut yorumlayıcısına bırakmak üzere daha önceden kopyalamış olduğumuz ve $fb ve $fc adreslerindeki değerleri $7a ve $7b adreslerine geri yazıyoruz. En son olarak JMP $A7E4 ile komut yorumlayıcısına benim işim bitti sıra sende diyoruz. Eğer standart komut değilse "SYNTAX ERROR" mesajı ekrana çıkar ve programın çalışması durur.
;--------------------------------------------; ; YENİ KOMUTLAR BURADAN BAŞLIYOR ; ;--------------------------------------------;
CLS komutunu normalde ekran silme için düşünmüştük. Fakat birkaç komut eklemeyle CLS komutunu hem ekran silme hem de ekrandan istediğimiz satırı silmek için kullanacağız. Sadece CLS yazarsak ekran tamamen silinir. Eğer CLS ekran satır numarası şeklinde verirsek sadece o satır silinir.
;--------------------------------------------; cls jsr $73 ; Komuttan sonra sayı var mı ?
beq all ; Yoksa ekran tamamen silinsin
jsr $b79e ; Evet var ve sayıyı al
cpx #$01 ; Sayı "1" den
bcc ilerr ; küçükse hata mesajı yazdır.
cpx #$1b ; "26" dan büyük veya eşitse
bcs ilerr ; hata mesajı yazdır.
dex ; x registerini 1 azalt.
jsr $e9ff ; ROM'daki satır silme rutinini çağır.
jmp $a7ae ; Bir başka komut için devam et all jsr $e544 ; ROM'daki ekran silme rutinini çağır.
jmp $a7ae ; Bir başka komut için devam et
ilerr jmp $b248 ; "ILLEGAL QUANTITY ERROR" mesajı yazdır. ;--------------------------------------------; border jsr $b79b ; Komuttan sonraki ifadeyi değerlendir.
stx $d020 ; Sonucu VIC'in kenar rengi adresine yaz.
jmp $a7ae ; Bir başka komut için devam et. ;--------------------------------------------; ink jsr $b79b ; Komuttan sonraki ifadeyi değerlendir.
stx $0286 ; Sonucu karakter rengi adresine yaz.
jmp $a7ae ; Bir başka komut için devam et. ;--------------------------------------------; paper jsr $b79b ; Komuttan sonraki ifadeyi değerlendir.
stx $d021 ; Sonucu VIC'in sayfa rengi adresine yaz.
jmp $a7ae ; Başka bir komut için devam et. comexe .word cls-1 .word border-1 .word ink-1 .word paper-1 ;--------------------------------------------; cls .text "cls" ; "CLS" ;--------------------------------------------; border .text "b" ; "B" .byte $b0 ; "OR" komutunun kodu
.text "der" ; "DER" ;--------------------------------------------; ink .text "ink" ; "INK" ;--------------------------------------------; paper .text "paper" ; "PAPER" ;--------------------------------------------; commax .byte 4 ; max komut sayısı comlen .byte 3,5,3,5 ; komut uzunlukları ;=============================================
ÖNEMLİ NOT 2: Programa yeni bir komut eklediğinizde komutlar "comexe" bölümündeki sıra nasılsa "comset" bölümündeki sıra da aynı olmalıdır. Aynı şekilde "comlen" değerleri de doğru sırada olmalıdır.
ÖNEMLİ NOT 3: Yeni komutları SYS 49152 komutuyla aktif hale getirdikten sonra NEW komutu vermeniz gerekmektedir.
İşte yeni komutlar kulla- narak yazılan ilk pro- gramımız ve ekran görün- tüsü. 10 CLS : REM "PRINT CHR$(147)" YERİNE 20 FOR F=0 TO 15 30 BORDER F : REM "POKE 53280,F" YERİNE 40 NEXT : GOTO 20
Klavyeyle gezinmek için ← ve → tuşları.
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