Bu sayfadaki yazılar
Sayfanın metni
Sayfa 6
Bu garip başlık da neyin nesi demeyin! Hele makina dili programcıları gözlerini dört açsınlar!
Diyelim ki, makina dilinde bir sürü program yazdınız. Hepsini ,8,1 veya ,1,1 ile yükleyip, NEW verip, sonra da SYS komutu ile çalıştırmak zorundasınız. Ya SYS komutlarından birini unutursanız? Ya da yanlış yazarsanız? Zahmetli iş...
Peki, bu programları normal LOAD ile doldurup RUN ile başlatmayı hiç düşündünüz mü? İşte bu minik programımız bu işe yarıyor. Nasıl çalıştığını anlatalım önce. Tabii, öncelikle programımızı MDE ile yazıp bir yerlere kaydedin. Kullanmaya gelince...
Önce üzerinde değişiklik yapacağınız makina dili programını yükleyin. Yalnız dikkat etmeniz gereken bir nokta var. Eğer bu programınız $0800-$09AF, $A000-$BFFF, $D000-$FFFF adreslerinden birinin üzerine düşüyorsa maalesef RUN ile başlayacak hale getiremiyoruz. Çünkü bu bölgeleri minik programımızın kendisi kullanıyor.
Yükleme işlemi bitince, NEW verin. Sonra da minik programımızı yükleyin. RUN ile çalıştırın. Ekranda bazı yazılar çıkacaktır. Burada da yazacağı gibi, şu komut ile esas programınızı RUN ile çalıştırılacak hale getirebilirsiniz:
SYS 2089, başlangıç, bitiş+1,giriş
Bilgisayar READY verdiğinde, normal SAVE komutu ile programınızı bir yerlere kaydedin. Gerektiğinde yükleyip RUN ile çalıştırabilirsiniz.
Bir örnek verelim. Diyelim ki, $C000-$C234 (49152-49716) adresleri arasında bir programınız var ve çalıştırmak için SYS 49200 vermeniz gerekiyor. Yapacağınız işlemler sırasıyla şunlar olacaktır:
1) Esas programlarınızı yükleyin.
2) NEW verin.
3) Minik programımızı yükleyin.
4) RUN ile çalıştırın.
5) SYS 2089,49152, 49717, 49200 verin.
6) Oluşacak programı SAVE ile kaydedin.
Basit, değil mi? Dikkat ederseniz, programımız 49716'da bittiği halde biz 49717 verdik. Bu, her zaman yapılması gerekli birşey.
Vereceğiniz adreslerin 0-65535 arası olması ve bitiş adresinin başlangıç adresinden büyük olması kontrol ediliyor ve tersi durumlarda ILLEGAL QUANTITY hatası veriliyor.
Giriş adresiyle ilgili birşey daha söylenebilir. Eğer, yeni programa RUN dediğinizde çalışmasını değil de, sadece esas makina dili programınızın yerine yerleştirilip tekrar READY yazısına geri dönülmesini istiyorsanız, giriş adresi yerine 64922 verin. Bu adreste makina dili komutlarından biri olan RTS vardır ve bu nedenle minik programımız, sizin programınızı yerine yerleştirdikten sonra onu çalıştıracağına geri döner.
Şimdi gelelim işin teknik ayrıntılarına...
C64'ün sistem rutinleri arasında, belli bir hafıza bölgesini, başka bir bölgeye taşıyan bir rutin vardır. Bizim minik programımız da bundan yararlanıyor. Onun yardımıyla yarattığınız program, RUN komutu verilir verilmez, makina dili programınızı sistemdeki rutini kullanarak gerçek yerine kaydırıyor ve başlatıyor. Tüm bu işlemi yapan kısım genel biçimini aşağıdaki şekilde görebiliriz:
LDA # $?? ; (blok başlangıcı) LDY # $?? ; (blok başlangıcı) STA $5F ; depola STY $60 LDA # $?? ; (blok sonu) LDY # $?? ; (blok sonu) STA $5A ; depola STY $5B LDA # $?? ; (yeni blok sonu) LDY # $?? ; (yeni blok sonu) STA $58 ; depola STY $59 JSR $A3BF ; sistem rutini JMP $???? ; giriş adresi
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 7
İlk önce $5F/$60 adreslerine kaydırılacak hafıza bölgesinin ilk byte'ının adresi küçük/büyük byte biçiminde yerleştiriliyor. Sonra $5A/$5B adreslerine de, kaydırılacak blokun son byte'ından bir sonra gelen adres aynı şekilde yerleştiriliyor. Artık sıra, bu hafıza blokunun gideceği adrese geldi. Ancak, yeni başlangıç adresini değil de, yeni yerine kaydırıldıktan sonra son byte'ın yeralacağı adresten bir sonra gelen adresi kullanıyoruz. Bu adresi de $58/$59'a yerleştirdikten sonra $A3BF adresinden başlayan sistem rutini çağırıyoruz. Artık, istediğimiz kaydırma işlemi tamamlanmış ve makina dili programımız yerine yerleştirmiştir. JMP komutu ile onu çalıştırmaya başlayabiliriz.
Diyelim ki, $8000-$8FFF arasındaki bir programı $C000-$CFFF arasına kaydırmak ve sonra da SYS 49153 ($C001) ile başlatmak gerekiyor. Bu durumda, yukarıdaki rutinde soru işaretleri ile belirtilmiş değerler şu şekilde olacaktır:
LDA # $00 LDY # $80 STA $5F STY $60 LDA # $00 LDY # $90 STA $5A STY $5B LDA # $00 LDY # $D0 STA $58 STY $59 JSR $A3BF JMP $C001
Bu bilgilerin ışığında, gerek kullanımında gerekse programı incelemek isteyenlerin çalışmalarında bir sorun çıkmamasını diliyoruz.