Bu sayfadaki yazılar
Sayfanın metni
Sayfa 58
PROGRAM OLARAK LİSTELER
Yukarıda kullandığımız REPEAT 4 (FORWARD 50 RIGHT 90) komut ve listesini KARE işlemini tanımlarken kullanmıştık. Yine aynı komut ve listeden yararlanarak, başka bir yoldan da kare çizdirebiliriz. Şöyle ki, (FORWARD 50 RIGHT 90) listesini bir nesnenin içeriği olarak tanımlayabiliriz. Nesnenin ismi L1 olsun:
2MAKE “Li (FORWARD 50 RIGHT 90) 2?REPEAT 4: Li; BURADA BİR KARE ÇİZER RESULT: (FORWARD 50 RIGHT 90) ?
LOGO TEKRARLA komutuyla karşı karşıya geldiğinde, L1'in kapsamını, oradaki liste bir dizi komuttan oluşmuş gibi işleme koyar. L1 nesnesinin kapsamı karenin bir kenarını çizmek için verilmiş komut listesidir.
Adım adım ilerlemeye çalışalım: 2DRAW REPEAT 1: L1; bir kenar çizilir
L1; bir kenar çizilir ?
Karenin iki kenarı çizilmiş oldu. Bir kenarı REPEAT 1 işleminin diğeri RUN işleminin sonucunda. Böylece, LOGO komutu olan RUN sonucunun REPEAT 1'le aynı olduğunu görmüş olduk. RUN komutu, izleyen listenin kapsamını, liste program komutlarını kapsıyormuş gibi işleme koyar.
TO KARE :KENAR REPEAT 4 (FD :KENAR RT 90) END
KARE işlemini aşağıdaki şeylerle birlikte kullanırsak,
2MAKE “L2 80 2MAKE “L3 (KARE :L2)
2RUN: L3; ?
kenar uzunluğu 80 olan bir kare çizilmiş olur. Ne olup bittiğini daha yakından izlemek için, bir başka LOGO komutu olan TRACE'yi kullanabiliriz:
?TRACE RUN :L3 TRACE ON EXECUTING KARE 80 REPEAT 4 (FD :KENAR RT 90) ENDING KARE 2
Böylece, LOGO ilk kez RUN :L3 ile karşılaştığında, L3'ü listeyi kapsayacak şekilde genişletir (KARE :L2). KARE işlemin adı olarak bilinir ve LOGO :L2'yi 80 sayısını alacak şekilde genişletir. Sonuçta, RUN edilecek liste (KARE 80) olarak alınır. Bu uzatma TRACE komutunun ilk satırını açıklar.
İşlemin yürürlüğe girmesinde (TRACE'nin ikinci satırı) parametresi 80 olarak alınır ve kare 80 olur. Bu aşamada izleme işi, (bir tuşa basılmasını beklemek üzere) durur. (Turtle IZLE'de kaybolur ve tuşa basınca yeniden görülür.) Yeniden göründüğünde turtle'ı incelerseniz, çalışmasını sağlamanız için beklediğini fark edersiniz.
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 59
AYHAN KALAYLIOĞLU
Hatırlayacaksınız geçen bölümün sonunda direkt modda şu satırı girmiştik:
SYS 50176: POKE 198,0: WAIT 198,1: SYS 50192
Satırı verdiğinizde ekranda renk cümbüşü içinde, randomize şekiller göreceksiniz. Herhangi bir tuşa dokunduğunuzda ise normal yazı ekranına döneceksiniz. Grafik modunda iken gördüğünüz saçma ve düzensiz şekiller, bilgisayarın ilk açıldığında oluşmuş rastgele değerlerdi. Demek ki şimdiki görevimiz, hem grafik ekranını hem buna ait renk ekranını silmek olacak. BASIC'te bu sorunu çözmek için, içinde POKE komutu bulunduran bir döngü yetecektir. Grafik ekranımızdaki her noktayı silmek istiyoruz. Bunun için bu bölgedeki her biti, daha da genellersek her byte'i sıfırlamamız gerekiyor. Döngümüzün başlangıç ve bitiş sınırları $E000'dan, SFFFF'e kadar olacaktır. (Aslında, bitiş adresimiz $FFFF değil $FF3F olacaktır. Çünkü grafik ekranımız 8192 değil 8000 byte büyüklüğünde. Fakat, bu noktada bunun bir önemi yok!) BASIC'- teki satırımız şöyle bir şey olacaktır:
FOR 1-57344 TO 65535:POKE 1,0:NEXT
BASIC'te mümkün olabilecek en yüksek hızı elde edebilecek şekilde formüle edilmiş bu satırın yürümesi aşağı yukarı 30 saniye sürüyor. Bu programın makine dilindeki karşılığının çok daha hızlı yürüyeceği aşikâr,
Hatırlayacağınız gibi, biz zaten bir döngü programlamıştık. O örneğin yaptığı işlem, karakter setini olduğu gibi ekrana çıkarmaktı. Tüm döngü
256 kere dönülüyordu; bu yüzden bu problemin çözümünde X- ve Y- indeks registerleri rahat rahat yetiyordu. Fakat, biz burada 8000 byte'ı silmek istiyoruz. İlk akla gelen çözüm olarak içiçe geçmiş iki döngü kulla: nabileceğimiz akla geliyor. Her zamanki gibi, gene önce BASIC'teki örneğimiz:
AD FOR X-0TO31 FOR Y-0TO255 POKE AD *4 Y,0 NEXT Y NEXT X
Basit bir deyişle, 8192 byte'lik bölgeyi 32 tane 256'şar byte'lik sayfalara (Page) ayırdık. Y-döngüsü içinde her seferinde 256 byte siliniyor. Bunun hemen arkasından AD değişkeninin değeri 256 kadar artırılıyor. Böylece bir sonraki sayfaya geçilip, oranın da silinmesi sağlanıyor. Büyük döngü 32 kere dönülüyor. Sonuç olarak 8192 byte'ı siliyoruz. Burada, fazladan silinen 192 byte'ın hiç bir önemi olmadığı için, program basit ve sade olarak kurulmuştur. Şimdi, bu döngüleri bir de makine dilinde formüle edelim:
100- .EÇ AD — $E000 110- LDA O 120- LDX O 130- LDY * O 140- STA AD,Y 150- INY 160- BNE ETİKETİ 170- AD 4 $0100 180- INX 190- ;X 32 OLDU MU? 200- ;DEĞİLSE 130'UNCU SATIRA SIÇRA
Şimdiye kadar edindiğimiz tecrübelere göre üç aşağı, beş yukarı bö: le bir şey yazmamız gerekir. Hattâ, ETİKETİ 'in 140'ıncı satırın başında yeralacağını bile şimdiden söyleyebiliriz. Fakat, AD değişkeninin değerinin böyle artmayacağı besbelli. Şimdi geçen derslere dönüp indirekt indeksli adresleme tipini hatırlayalım. Burada, asıl adres sıfırıncı sayfadaki iki byte'lik göstergeç ve Y-registerinden elde ediliyordu. Bu kullanımla göstergecin değerinin $100 artırmak da mümkün hale geliyor. X-registerinin 32 değeri ile karşılaştırılması ve eşitsizlik durumunda 130'uncu satıra sıçraması için kullanmamız gereken komutları da hatırladınız herhalde?..