Commodore sayı 3, sayfa 22

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 22

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

Klavyeyle gezinmek için ← ve → tuşları.