Bu sayfadaki yazılar
Sayfanın metni
Sayfa 26
MAKİNE DİLİ GET
Her bilgisayarda hangi tuşun basıldığını hafızada tutan bir adres vardır. Bu adreste klavyede basılan tuşun değeri saklanır. Adresteki değeri elde etmek için bu adresi kontrol eden ufak bir döngü yeterli olur. C64'te bu adresi kontrol edelim:
LDA CMP # 10 BE© bulundu
Bakmamız gereken adres, sıfırıncı sayfadaki $C6 adresidir. Bu adreste klavyeden girilen tuşların değerlerini alabilirsiniz. Ancak bu değerler ASCII kodları değil, klavye matris kodlarıdır. Örneğimizdeki 10 değeri tuşunun klavye matris kodudur. Hiçbir tuşa basılmamışsa bu adresin değeri 64'tür.
GOSUB
BASIC'te sık sık tekrarlamak zorunda olduğunuz program parçalarını altprogram olarak yazıp, ihtiyaç olduğunda program akışını GOSUB komutuyla altprograma gönderebilirsiniz. Bunun için GOSUB komutundan sonra altprogramın başlangıç satır numarasını vermeniz yeterli olur. Makine dilinde de JSR komutu aynı işi görür. Bu komuttan sonra altprogramın bulunduğu adresi vermeniz yeterli olur. Mesela altprogram $C000'da başlasın.
JSR SCOOO
JSR $C000 komutunu veriniz. Altprogramları daha etkili kullanabilmek için parametrelerden yararlanırız. Bu bir sayı veya birkaç sayı olabilir. Parametre sayesinde altprogram, bir değişikliğe gerek kalmadan, programın farklı yerlerinde çağrılabilir. Mesela programın yavaşlamasını sağlayacak bir gecikme yapan bir altprogram yapalım. Bu altprogram, programımızın her yerinden çağrılabilmeli. Ancak her çağırışımızda farklı bekleme süreleri isteyebileceğimizden, bunu sağlayacak bir parametre kullanacağız. Altprogramlara parametre geçirmede $40 adresini kullanalım. Mesela, beş saniyelik bir gecikme isteyen bir program:
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 27
2000 LDA # $5 ;5 saniye bekle 2002 STA $40 ;parametreyi yerleştir 2004 JSR $5000 ;$5000 adresindeki alt programa git e . 5000 DEC $40 ;$40 adresini bir azalt 5002 BE© $500C ;Eğer $40 adresinin değeri sıfıra ulaşırsa ana programa geri dön 5004 SO 5006 DEY ;Y yazmacını bir azalt 5007 BNE $5006 ;Eğer değer sıfıra eşit değilse $5006'ya git 5009 JMP $5000 ;$5000 adresine git 500C RTS ;Ana programa dön
Eğer programın başka bir yerinde on saniyelik bir beklemeye ihtiyaç duysaydık bütün yapmamız gereken
LDA # SOA
komutunu vermek olurdu. Bu programı BASIC ile yazsaydık:
2000 A — 5 2010 POKE 40, A 2020 GOSUB 5000
.
© 5000 POKE 40, PEEK(40)-41 5010 IF THEN 5060 5020 5030 Yz 5040 İF Y<>O THEN 5030 5050 GOTO 5000 5060 RETURN
GoTO
Makine dilinde GOTO komutunun karşılığı JMP komutudur. Kontrol bu komuttan sonra verdiğiniz adrese geçer. Bu komut JSR komutuna benzer, ama program akışı RTS ile eski yerine dönemez. Program akışını değiştirmek için genel olarak iki yol vardır. İlk yola şartlı dallanma adını verebiliriz. Bu yol için örnek olarak
CMP #0 BE© 5000
BEQ örnek verebiliriz. BEQ: Branch if Equal (eğer eşitse dallan) anlamına gelir. Eşitlik veya eşitsizlik bir evvelki CMP (CoMPare, karşılaştır) komutu ile araştırılır. BNE: Branch if Not Equal (eğer eşit değilse dallan) anlamına gelir. BCC: Branch if Carry is Clear (eğer carry (elde var) biti sönükse dallan) anlamına gelir. Bu komutların hepsi bir şart sağlanırsa dallanma yapar. Bir şarta bağlı olmadan dallanma, program akışını değiştirmenin ikinci yoludur. JMP veya JMP komutları hiç bir şarta bağlı olmadan program akışını değiştirirler, JMP veya GOTO komutunu kullanırken dikkatli olmanızı öneririm. Çünkü çok fazla JMP komutunu kullanmak, programı anlaşılmaz hale getirecektir. Buna karşın, çoğu zaman programdaki bir sorunu çözmenin en iyi yolu bu komutu kullanmak olacaktır. JMP komutu programınızı taşınamaz hale getirir. Programın taşınması ne demek diyebilirsiniz. Mesela ufak bir program yazdınız ve bununla başka programları inceliyorsunuz. Ancak inceleyeceğiniz programlardan birisi sizin programınızın bulunduğu adreslerde yer alıyor. Bu durumda yapmanız gereken tek şey programınızı hafızanın başka bir yerine kaydırmak olacaktır. Ancak programınızda JMP komutları varsa, program yeni yerine taşındıktan sonra da JMP komutları eski adresleri taşımaya devam edeceklerdir. Mesela;
2000 JMP $2005 2003 LDY 2005 LDA # $5
Eğer bu programı 5000 adresine taşırsanız her şey doğru çalışacak, fakat JMP komutu hâlâ aynı yere akışı yönlendirecektir. Sizin JMP komutunu JMP $5005 şeklinde değiştirmeniz gerekir. Bunun gibi, programınızdaki tüm JMP adreslerini tekrar hesaplayıp değiştirmek gerekir. Programı taşımak için monitörünüze şu komutu vermeniz yeterli olur:
T 2000 2006 5000
T $C000 $C0FF $5000 T'den sonraki ilk rakam taşınacak adresin başlangıcını, ikincisi bitimini, üçüncüsü de yeni yerin adresini belirtir. Eğer programınızı ilerde başka bir yere taşımanız gerekirse, yapacağınız en iyi şey LABEL (etiket) kullanmanıza izin verecek bir assembler ile çalışmak olacaktır. Böyle bir assembler ile çalışırken kontrolün geçeceği adresleri bilmek zorunda değilsiniz. Adres yerine label kullanırsınız. Assembler, sizin yerinize gerekli hesaplamaları yapar. Programın yerini değiştirmek istediğinizde bütün yapmanız gereken * = ile başlangıç adresini değiştirmek olur. Buna bir örnek verelim:
JMP ikinci bölüm LDY#3 ikinci bölüm LDA 5
AMIGA
Genellikle AMIGABASIC ile 640 * 200'den büyük pencere açamazsınız. Bu durumda ekranın alt kısmında 56 piksellik boş yer kalır. Başka bir deyişle ekranın sadece %78'ini kullanabilirsiniz. Eğer ekranın tamamını kullanarak 640 * 256'lık bir çözünürlük elde etmek isterseniz aşağıdaki ufak programı deneyin:
SCREEN 1,640, 256,2,2 27