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 ne- leri yapabileceğimize birkaç örnek verelim: - Bir sayfa yazıyı bir tuşa basarak pat diye ekrana geîırmek - Ekranı hem aşağı hem yukarı kay- dırma imkânı yaratarak, üst satırdan kaybolan satırları geri getirmek, - Yazım sırasında 40'iıncı haneden sonra satırbaşı yapacak yerde, ekra- nın 80'inci, 100'üncü haneye kadar veya sonsuza kadar sağa kayma- sını sağlamak. Basitinden başlayalım: Diyelim ki görevimiz, $CO00 adresinden $COFF adresine kadarki bölgede duran 256 adet sayıyı, $80400-04FF bölgesine ta- şımak, Bunu yapmanın en saçma yolu, akümülatöre teker teker 256 adres ve- rip, her birini 256 farklı adrese taşıma- sını söylemek: LDA $CO00 STA $0400 LDA $CO01 STA $0401 LDA $CO0O2... delilik! Basit çözüm için gerekli olan yönte- min, X veya Y indeksli adresleme ol- duğunu, geçen sayıyı okuyanlar bilir (okudunuz mu?). Yapılacak iş şundan ibaret: 1. Y'yi (veya X) sıfırla. 2. $CO00'dan Y ötedeki rakamı al. 3. $0400'den Y öteye koy. 4. Y'yı 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 — S00 - ya- ni AO 00 2. komutu da biliyoruz: LDA SCO00, Y - yani B9 00 CO 3.sü de tamam: STA $0400, Y - yani 99 00 04 4.sü için yeni bir komutla tanışma- mız gerekiyor: İNY — İNcrement Y- Y'yi bir artır. Ko- du: C8 Ve bunun kardeşi ile amcaoğulla- Ti İNX — increment X-X' 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ı boşlcıdıgımız anayasa maddelerinin bir yenisi, MADDE 4: 6510 makina dilinde, her merkep ve her adres, O iİle 255 arası toplam 256 çeşit değer taşıyabilir. 255'ten sonra gelen sayı 256 değil, O'dır. 2554 1-0! Programımızın 5. komutu için de ye- ni bilgilere ihtiyacımız var. BEO (—Braneh if E©val to zero. Ko- du FO) komutu, bir önceki işlemin so- nucu -işlem ne olursa olsun- sıfırsa, programa sıradan devam etmeyip, parametrede belirtilen yere atla an- lamına gelir. BES'in karşıtı FORVET değildir; bir başka futbol terimini akla getiren “BNE'dir. BNE — Branch if Not Egual to zero (Ko- du: DO)— Önceki işlemin sonucu sıfır değilse, parametrede belirtilen yere atla. Her iki komut da bir byte paramet- re alır. Parametrenin ne olduğunu an- lamak için, RELATİF ADRESLEME kavra- mına ihtiyacımız var. Madde 5: BE& ve BNE gibi “branch” komutları, programın akışını en çok hex 80 byte geriye veya ileriye atla- tır. Parametre 00 ile 80 arası bir rakam ise, program akışı o rakam * 1 byle ileriye atlar. 81 ile FF arası bir rakam ise, FF eksi o rakam kadar byte geri- ye atlar. Örnek: DO 08 - İşlem sonucu sıfır de- ğilse 9 byte ilerden devam et. FO FO - Işlem sonucu sıfırsa OF byte geriye a (FF—FO- 255 Z240- 15) Programımız şimdi tamam sayılır. $2000 adresine yazalım: Assembiy Adres Makine dili dili 2000 A0 00 LDY #SOO 2002 B9 00CO — LDA $CO00,Y 2005 99 00 04 STA S0400,Y 2008 C8 İNY 2009 C8 İNY 2009 DO F7 BNE $2002 200B 00 K Soru: 2009'daki D0 ne demek? Cevap: BNE demek. Bir önceki kommu- tumuz, 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 prog- ram geriye atlayıp döngüye giri- yor. 255'ten sonra y'nin değeri 5. madde gereğince tekrar sıfır olu- yor. Böylece program döngüden çıkıp BRK'e geliyor. Soru: 200B'deki 00 ne demek? Cevap: BRK demek. Yani bokstaki gi- bi, “Brek!”, bitir, kes. TIR Filosu Kuruyoruz! Toplam 256 parça malı bir merkep kullanarak taşımak kolay. Ama iş 256'dan fazlasını taşımaya gelince, merkep haklarının ihlali konusu orta- ya çıkıyor. Merkeplerimizin en çok hex FF'e, yani 255'e kadar zorlanabilece- ği anayasada yazılı.Sabit bir başlan- gıç noktasından, örneğin $C000'dan Y ötesini taşıma yöntemiyle ulaşaca- ğımız en son adres de CO004FF- COFF. Peki CO000'dan CFFF'e kadar 1000 (yani 4096) byte taşımak istersek ne yapacağız? Bir yöntem, kaçak yollara başvur- mak. Bu tehlikeli ve eğlenceli yolları istikbalde dahi görebileceğiz. Şimdi- lik temiz yolları deneyelim DOLAYLI İNDEKSLİ ve INDEKSLI DO- LAYLI 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öntem- de, sadece Y indeks olarak kullanıla- bilir. Dolaylı indeksli bir komut, örne- ğin LDA (kodu: B1), sıfırıncı sayfada bir adresi belirten tek byte'lik parametre alır, ve o adres ile onu izleyen adres- te verilen bir başka adresten Y ötesi- ni işler. Faraza, $0O0OFB adresinde 00, onu iz- leyen S$00FC adresinde de C0 rakam- larının bulunduğunu düşünelim. Y'ye 05 değerini verelim. B1 FB-LDA ($FB), Y- $C005'teki malı akkümülatörü yükle, 941 FB-STA ($FB). Yz Akümülatördeki rakamı $C00S'e koy. $O0OFC'deki değeri bir artırıp C4 ya- palım, Şimdi B1 FB— $C105'teki değeri yük- e. İndeksli Dolaylı'ya gelince, bu ha Ali Veli, ha Veli Ali meselesi olmayıp, X indeksini kullanan bambaşka bir yön- tem. Ne olduğunu merak edenler Re- $ ni l e bilirl SYA İ Te VAA K 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 AO 00 LDY #S00 2002 84 FB STY SFB 2004 84 FD STY $FD 2006 A9 04 LDA #$04 2008 85 FC STA SFC 200A A9 CO LDA #$CO 200C 85 FE STA SFE 200E Bi FD LDA ($FD).Y 2010 91 FB STA ($FB).Y 2012 C8 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 K