Toplu Taşımacılık

Hedefimiz basit: Belleğin belli bir bölümünde duran bir dizi rakamı alıp başka bir bölüme taşımak! Fuzuli bir iş mi yapıyoruz? Peki, bu yöntemle neleri yapabileceğimize birkaç örnek verelim: - Bir sayfa yazıyı bir tuşa basarak pat diye ekrana getirmek,

- Ekranı hem aşağı hem yukarı kaydırma imkânı yaratarak, üst satırdan kaybolan satırları geri getirmek, - Yazım sırasında 40'ıncı haneden sonra satırbaşı yapacak yerde, ekranın 80'inci, 100'üncü haneye kadar veya sonsuza kadar sağa kaymasını sağlamak. Basitinden başlayalım: Diyelim ki görevimiz, $C000 adresinden $C0FF adresine kadarki bölgede duran 256 adet sayıyı, $0400-04FF bölgesine taşımak. Bunu yapmanın en saçma yolu, akümülatöre teker teker 256 adres verip, her birini 256 farklı adrese taşımasını söylemek: LDA $C000 STA $0400 LDA $C001 STA $0401 LDA $C002... delilik! Basit çözüm için gerekli olan yöntemin, X veya Y indeksli adresleme olduğunu, geçen sayıyı okuyanlar bilir (okudunuz mu?). Yapılacak iş şundan ibaret: 1. Y'yi (veya X'i) sıfırla. 2. $C000'dan Y ötedeki rakamı al. 3. Y öteye koy. 4. Y'yi bir artır. 5. Y 256'ya ulaşmamışsa 2. işleme dönüp devam et. 6. Y 256'ya ulaşmışsa dur. 1. komutu biliyoruz: LDY #$00 - yani A0 00 2. komutu da biliyoruz: LDA $C000, Y - yani B9 00 C0 3.sü de tamam: STA $0400, Y - yani 99 00 04 4.sü için yeni bir komutla tanışmamız gerekiyor: INY - INcrement Y - Y'yi bir artır. Kodu: C8 Ve bunun kardeşi ile amcaoğulları: INX - INcrement X - X'i bir artır. Kodu: E8 DEY - DEcrement Y - Y'yi bir azalt. Kodu: 88 DEX (kodu CA) acaba ne demek? Bu arada, geçen sayı başladığımız anayasa maddelerinin bir yenisi, MADDE 4: 6510 makina dilinde, her bellek ve her adres, 0 ile 255 arası toplam 256 çeşit değer taşıyabilir. 255'ten sonra gelen sayı 256 değil, 0'dır.

Programımızın 5. komutu için de yeni bilgilere ihtiyacımız var. BEQ (- Branch if EQual to zero. Kodu F0) komutu, bir önceki işlemin sonucu -işlem ne olursa olsun- sıfırsa, programa sıradan devam etmeyip, parametrede belirtilen yere atla anlamına gelir. BEQ'in karşıtı FORVET değildir; bir başka futbol terimini akla getiren "BNE"dir. BNE - Branch if Not Equal to zero (Kodu: D0) - Önceki işlemin sonucu sıfır değilse, parametrede belirtilen yere atla. Her iki komut da bir byte parametre alır. Parametrenin ne olduğunu anlamak için, RELATİF ADRESLEME kavramına ihtiyacımız var. Madde 5: BEQ ve BNE gibi “branch” komutları, programın akışını en çok hex 80 byte geriye veya ileriye atlatır. Parametre 00 ile 80 arası bir rakam ise, program akışı o rakam * 1 byte ileriye atlar. 81 ile FF arası bir rakam ise, FF eksi o rakam kadar byte geriye atlar. Örnek: D0 08 - İşlem sonucu sıfır değilse 9 byte ilerden devam et. F0 F0 - İşlem sonucu sıfırsa 0F byte geriye atla. (FF-F0 = 255-240 = 15)

Programımız şimdi tamam sayılır. $2000 adresine yazalım:

Adres Makine dili dili
2000 A0 00 LDY #S$00
2002 B9 00 CO LDA
2005 99 00 04 STA $0400,Y
2008 C8 İNY
2009 C8 İNY
2009 DO F7 BNE $2002
200B 00 BRK

Soru: 2009'daki D0 ne demek? Cevap: BNE demek. Bir önceki komutumuz, Y sayacını her seferinde bir artırıyor. 1'den 255'e kadar işlem sonucu sıfır değil; dolayısıyla program geriye atlayıp döngüye giriyor. 255'ten sonra Y'nin değeri 5. madde gereğince tekrar sıfır oluyor. Böylece program döngüden çıkıp BRK'e geliyor. Soru: 200B'deki 00 ne demek? Cevap: BRK demek. Yani bokstaki gibi, “Brek!”, bitir, kes.

TIR Filosu Kuruyoruz!

Toplam 256 parça malı bir bellek kullanarak taşımak kolay. Ama iş 256'dan fazlasını taşımaya gelince, bellek haklarının ihlali konusu ortaya çıkıyor. Belleklerimizin en çok hex FF'e, yani 255'e kadar zorlanabileceği anayasada yazılı. Sabit bir başlangıç noktasından, örneğin $C000'dan Y ötesini taşıma yöntemiyle ulaşacağımız en son adres de C0FF. Peki C000'dan CFFF'e kadar 1000 (yani 4096) byte taşımak istersek ne yapacağız? Bir yöntem, kaçak yollara başvurmak. Bu tehlikeli ve eğlenceli yolları istikbalde dahi görebileceğiz. Şimdilik temiz yolları deneyelim. DOLAYLI İNDEKSLİ ve İNDEKSLİ DOLAYLI adresleme: Dikkatle okunması gerekir. Belleğin sıfırıncı sayfasında birbirini takip eden iki adrese alt byte-üst byte sırasıyla konulacak iki rakam, Y veya X indeksli adreslemede taban olarak kullanılabilir. Dolaylı İndeksli diye bilinen yöntemde, sadece Y indeks olarak kullanılabilir. Dolaylı indeksli bir komut, örneğin LDA (kodu: B1), sıfırıncı sayfada bir adresi belirten tek byte'lık parametre alır, ve o adres ile onu izleyen adreste verilen bir başka adresten Y ötesini işler. Faraza, $00FB adresinde 00, onu izleyen $00FC adresinde de C0 rakamlarının bulunduğunu düşünelim. Y'ye 05 değerini verelim. B1 FB - LDA ($FB), Y - $C005'teki malı akümülatöre yükle. 91 FB - STA ($FB), Y - Akümülatördeki rakamı $C005'e koy. $00FC'deki değeri bir artırıp C4 yapalım. Şimdi B1 FB - $C105'teki değeri yükle. İndeksli Dolaylı'ya gelince, bu ha Ali Veli, ha Veli Ali meselesi olmayıp, X indeksini kullanan bambaşka bir yöntem. Ne olduğunu merak edenler Reference Guide'ı okuyup öğrenebilirler; yoksa Teleteknik'çiler her şeyi benden bekleyip şımarıyorlar. Nihayet, 256*16 parça mal taşıyan TIR programımıza sıra geldi:

Assembiy
Adres Makine dili dili
2000 A0 00 LDY #SOO
2002 84 FB STY $SFB
2004 84 FD STY $FD
2006 A9 04 LDA #S$O4
2008 865 FC STA $FC
200A A9 CO LDA #$CO
200C 85 FE STA $FE
200E BA FD LDA ($FD).Y
2010 91 FB STA ($FB).Y
2012 C8 İNY
2013 DO F9 BNE $200E
2015 E6 FC İNC $FC
2017 E6 FE İNC $FE
2019 A5 FE LDA $FE
201B C9 DO CMP #SDO
2010 DO EF BNE $200E
201F 00 BRK

Soru: 2000-200C'de ne oluyor? Cevap: $00FB ve onu izleyen adreste $0400'e, $00FD ve onu izleyende de birer pointer oluşturuluyor. Arada kestirme yoldan Y sıfırlanıyor. Soru: 200E-2013'te olay ne? Cevap: Bir önceki programımızda olanın aynısı. Sadece daha esnek. Soru: 2015 ve 2017'deki E6 neyin nesi? Cevap: Zero page adresli INC (INCrement) komutunun kodu, Herhangi bir bellek adresinde o anda bulunan değeri bir artırıyor. Tıpkı STA, STY vb. komutları gibi, tüm adresleme türlerine uygun INC çeşitlerimiz mevcut. Burada yapılan, ilk başta $0400 ve $C000 olarak tanımlanan iki pointer'ın üst byte'larını birer artırıp, $0500 ve $C100 yapmak. Soru: 201B'deki C9 neci? Cevap: Dolaysız CMP (CoMPare, kıyasla) komutunun temsilcisi. $00FD-00FE'deki pointer $D000'ya ulaştı mı acaba diye soruyor. Ulaştıysa sonuç sıfır; taşıma işimiz başarıyla sonuçlanmış bulunmakta.

Henüz ulaşmadıysa, pointer C200, C300... CF00 diye arta arta devam edecek.

Eski ve yeni çeşitlerimizin envanterini çıkarıp bu ayki işimizi bitirelim:

BEQ BNE INY INX DEY DEX BRK Parametresiz - Relatif F0 D0

- C8 88 CA 00

Hay Allah.

DEC komutunun ne olduğunu anlatmayı unuttuk

Son olarak, geleneksel Baytan Bitirmez Bilgisayar Bilgisi Birinciliklerinin üçüncüsü, Bu seferki biraz uğraştıracak. 1. $C000-CFFF bölgesindeki değerleri 4FFF'e taşıyacak, yukarıda verdiğimize benzer bir makine dili programı belleğe POKE eden BASIC program.

2. sayıdaki yarışma sorusunun cevabı

Sayın Baytan Bitirmez Nisan 1986'da yayınladığımız 2. sayıdaki sorunun cevabı şöyledi: A0 dolaysız LDY'nin kodu olduğu için direkt olarak bu emir Y'ye yanındaki 1 byte'lık parametreyi yani A0'ı yüklüyor. Y'ye A0 yüklenir. Fakat A4 A0 ise Y'ye $00A0'ı yükler. Çünkü A4 zeropage (sıfırıncı sayfa) adresidir. Y'ye $00A0 yüklenir. Aradaki fark işte budur.

Adresim: Hoşdere Cad. Hava Sok. 122/9 Yukarı Ayrancı/ANKARA

Kaan Mumcuoğlu

2. Aynı taşıma işlemini yapan, bu kez BASIC bir program. 3. Aynı taşıma işlemini, 1. sorudaki makine dili programın ne kadar, 2. sorudaki BASIC programın ne kadar zamanda yaptığı. Tam saniye hesabını istiyorum. Eğer süre, saatle ölçülemeyecek kadar kısaysa, mesela işlemi 100 kez tekrarlayıp ortalamayı alma yöntemini deneyebilirsiniz. İlk doğru cevabın sahibinin meşhur bir dergide artist fotoğrafı yayınlanacaktır.

COMPU-TOBİ COMPU-TOBİ

V

Bo RE RM Y ŞİFRELİ BULMACA

AÇIKLAMALAR

Soldan Sağa

1. MAKARNA (anagramları: “ANKARA'M” ve 2. OKU (“Dokuz okul”da iki kez oku vardır). 3. DA (“Dağ” sözcüğünün başındaki iki harf). —ER (“Asker'in ilk üç harfi olan “ask” çıkarsa, er— asker kalır).

4. AKLIMDA (“Lades” oyununda “aklımda” demek gerekir; “kalmadı”, “aklımda”nın anagramıdır). 5. LM (“Elma”daki sessiz harfler LM— 950 - Romen rakamlarıyla). —İS (“Sis”in son iki harfi is, o da pistir). —TIR (Uzun araçtır denmiş zaten). ANAKARA (“kıta” demektir).

NO

Yukarıdan Aşağıya

1. MADALYA (anagramıdır).

2.

3.

oh

AKM (Atatürk Kültür Merkezi'nin baş harfleri “takma”nın göbeğinde, yani ortasında yer almaktadır). KO (Ko koymamız isteniyor; KO-KOY). —TA (Uzakta; “ta”, uzaklık bildirir). —AKSIRIK (ak sırık). RU (UR'un tersi). —RA (Burada). —EDİ (Edi, Büdü'nün arkadaşıdır; “nedir”in içindedir). —AVRASYA (Avrupa ile Asya sözcükleri birleşince, Avrupa'nın UPA'sı kullanılmaz).

ENTER-GİRİNİZ EXIT-ÇIKINIZ

ÇÖZÜM

tartışmasız, en çok kullanılan bilgisayar programlama dili olma özelliğini daha uzun süre koruyacaktır. Bunun birinci nedeni ev bilgisayarları ise, ikinci nedeni de PC'lerdir. Her ne kadar PC'lerde artık neredeyse her bilgisayar programlama dili için derleyici (compiler) ve yorumlayıcılar (interpreter) bulunabilmekte ise de BASIC, işletim sisteminin yanında PC'nin standart bir eki olarak çoğu bilgisayarlarla birlikte verilmektedir. BASIC dilinin PC'lerde yaygınlaşmasının başlıca nedenleri şöyle özetlenebilir:

Ömer Erkmen