SEKA ASSEMBLER
Retro bilgisayarMerhaba. Bundan sonra Seka assemble kursumuzda bir süre birlikte olacağız. İlk sayılarda basit örnekler verip ileride ekran, sprite, bob gibi AMIGA'yı AMIGA yapan özellikleri de öğreneceğiz. Assembler Dilini tam olarak öğrenebilmeni, için yeterli düzeyde BASİC dili bilmeniz gereklidir. Ayrıca makinanızda bir assembler editörü bulunmadığından bir editör bimaniız şarttır. Kursumuzda kullanacağımız Editör Seka Assembler 2.0 programıdır.Bunu temin etmek için zorlanacağınızı zannetmiyoruz Ancak herhangibir sorunla karşılaşırsanız 64'ler dergisinden bu programı ve bazı örnekleri elde edebilirsiniz. Bu sayida Seka Assembler 2.0 editör komutlarını ve 68000 mikro işlemci temel komutlarını size veteceğiz. Seka'yı yükleyip çalıştırın. Karşınıza şöyle bir soru gelecek : CHIP OR FAST MEM > Eğer 512K RAM Expansion kartına sahip değilseniz Fastmem seçeneği çalışmaz. Soruyu cevapladıktan sonra ne kadar bellek kullanmak istediğiniz sorulacak. WORKSPACE IN KBYTES > Başlangıçta fazla belleğe ihtiyacımız olmadığı için 100 Kbyte verin. Soruları doğru olarak yanıtlamışsanız SEKA sizden komut almayahazır olduğunu gösterir. SEKA > SEKA ASSEMBLER EDİTÖR KOMUTLARI Bu komutları 68000 komutlarıyla karıştırmayın.- Bunlar program yüklemek, kaydetmek, değiştirmek için kullanılır. R (read - oku ) : Adından da anlaşıldığı gibi program yüklemek için kullanılır.Program adının ".s" le bitmesi gerekir. 64'ler dergisinden birçok örnek program elde edebilirsiniz. W (write - yaz ) : Program kaydetmek için kullanılır."s." program adı-nın sonuna otomatik olarak ek- mu lenir. Sık sık bu seçeneği kullanmanızı tavsiye ederiz. V (view - bak ) : Direttory almak için kullanılır. Ayrıca CLI'deki cd. komutunun işlevini görür. Örnekler : vdfO : İnternal drive'daki sürücü- / nün directory'si. vdevs : Devs directory'sinin iceri-
Bahadır AKCAN & Burak ÖZIŞIK ğini verir. (Varsa tabii!) VDFI: Varsa external drive'ın directory'sini verir. Unutmamanız gereken bir nokta da bir subdirectory'e gittiğiniz zaman root directory'deki programlara ulaşamamanızdır. Bunu yapmak için V DFO: komutunu verin. A (assemble - ?)
Yüklediğiniz ya da değiştirdiğiniz bir programı code haline getirir. Bir proğramı çalıştirmak için o programı assemble etmeniz şartım A'ya basıp Return'lediğiniz zaman OPTİONS > sorusu çıkar. Bunu Return'e basarak geçin. Programın uzunluğuna göre değişen bir süre bekledikten sonra NO ERRORS ifadesi çıkarsa program çalışmaya hazırdır. Eğer herhangi bir hata mesajı alırsanız programınızı yeniden kontrol edin. Error'lü bir programı çalıştırmaya kalkarsanız il: ginç sonuclar elde edersiniz. Şansınız varsa program çalışmaz ve Seka'ya dönersiniz. Ancak büyük bir olasılıkla AMIGA'nız crash eder ve resetleyip baştan başlamak zorunda kalırsınız. Bunun icin proğramlarınızı sık sık save edin.
Programın en üst satırına çıkmanızı sağlar. Bottom: Programın en alt satırına inmenizi sağlar. L: Programda istediğiniz bir komutu, harfi ya da sayıyı bulmanızı sağlar. Bunun için önce T komutunu verip sonra da L komutuyla arama işlemini yapın. Örnek: T (Return) ahmet Aradığımız kelimenin ahmet olduğunu varsaydık. Ancak L komutu ile aradığınız kelimenin başına boşluk koymayın. Seka aradığınız ifadeyi bulursa o kelimenin bulunduğu satırın numarasını verir. L komutunu yinelerse- niz arama o satırdan tekrar başlar. J: Programları çalıştırmak için kullanılır. Kullanımı jlabel şeklindedir. j komutuyla label adı arasında boşluk bırakmayın. Başlangıç label'ı genellikle ilk label'dir ancak istisnalarla da karşılaşabilirsiniz. Bu durumda ESC tuşuna basarak programın listingini alın ve start label olabileceğini düşündüğünüz bir label seçin. Örnek: start: .. Programı çalıştırmak için jstart yazıp RETURN'e basmanız yeterli olacaktır. Esc: Escape tuşuna basıldığında editing moduna geçer ve programınızı yazar veya değiştirirsiniz. ESCAPE MODU KONTROL TUŞLARI Bu modda Ctrl (Control) tuşunu kullanarak yararlı pek çok komut verilebilir. Unutmayın, bu komutları sadece Edit modunda verebilirsiniz. CTRL-U: Bu komutla 10 satır yukarı gidebilirsiniz. CTRL-D: 10 satır aşağı inebilirsiniz. CTRL-G: 100 satır yukarı: 100 satır aşağı: Bu komutla programın belli bir bölgesini işaretler ve oraya Cut, Copy, Paste edebilirsiniz. CTRL-B'ye basıp aşağı doğru inin. İstediğiniz yeri işaretledikten sonra CTRL-B basın. CTRL-C: CTRL-B ile işaretlediğiniz bölgeyi Cut (kesme) işleminden geçirip hafızaya alırsınız. CTRL-P: CTRL-C ile kestiğiniz yeri programın istediğiniz bir yerine yerleştirmeye yarar. ESCAPE: Seka ekranına geri dönüş için kullanılır. Böylece Seka Assembler V2.0 editör komutlarını öğrenmiş oldunuz. Başta biraz zorluk çekseniz de pratik yaparak zamanla alışacaksınız. Öğrenmek için bu işe bol zaman ayırmanız ve başkalarının yaptığı programları incelemeniz kısa zamanda sizi iyi bir Coder yapacaktır. Eğer sizin kullandığınız Seka daha eski veya daha yeni (2.3, 3.2) ise editör komutları ufak değişiklikler gösterecektir. 68000 KOMUT SETİ Şu ana kadar makine dilinden çok SEKA ile boğuştuk. Şimdi Hexadecimal sistem ve 68000 Assembler temel komut setini size vermeye çalışacağız. HEXADECIMAL (ONALTILI) SİSTEM Günlük yaşamda kullandığımız sistem onlu sistemdir. Bu sistemde 0-9 arasında sayılar kullanırız. Ancak bilgisayarlar onaltılı sistem kullanırlar ve assembler öğrenebilmemiz için bu sistemi bilmemiz şarttır. Hexadecimal sistemde 0-15 arası sayılar kullanılır. Ancak 10, 11, 12, 13, 14, 15 çift basamaklı sayılar oldukları için kullanılmaz ve harflerle temsil edilirler. Decimal Hexadecimal 0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 A 11 B 12 C 13 D
14 E 15 F Bu tabloda onlu ve onaltılı sistemler arasındaki farkı görüyorsunuz. Soru : $fc'nin ondalık karşılığı nedir ? $ işareti sizi şaşırtmasın. Bu bir sayının hex sistemde olduğunu gösterir. Mesela 17 ile $17 arasında büyük bir fark vardır. HEX SİSTEMDE SAYI HESAPLAMA Hex sistem göründüğü kadar zor değildir. Prensipleri de decimal sistemle aynıdır. 999 sayısını okumak için yüzler basamağındaki 9 ' u 100 ile,onlar basamağındaki 9'u 10 ile ve diğerini de 1 ile çarpıp toplarız. 9*100 4 9*10 4 9 — 999 Şimdi aynı olayı hex sistemde yapacağız. Onaltılı sistemde ise sayılar 10'ar 10'ar değil, 16'şar olarak büyür. 1716 #c*1 - ?f 15 ve c 12 olduğuna göre : 15*16 4 12 — 252, $fc sayısının decimal halidir. Örnek 2 : $ilcz? Bu kez işimiz daha zor.Hex sistemde yüzler basamağı 256 ile çarpılır. f*256 4 f*16 4 © — 3840 4 240 4 12 — 4092'dir. Bu tip örneklere çalışarak zamanla alışkanlık kazanacaksınız. 68000 KOMUTLARI 68000 dilindeki önemli komutları bu bölümde güre- | ceğiz. İ MOVE : En önemli asşembler komutu budur.Bir ad- | rese ya da değişkene değer yüklemek İçin kullanı- | lır. Örnek : | Move #1, sayaç Sayaç değişkenine 1 değerini yükler. Move #$ff, sayaç Değişkene FF değerini verir. | Move sayac2 Sayaç 1 değişkenindeki değeri Sayaç 2'ye koyar. Peki # işareti ne anlama geliyor ? # işareti önüne geçtiği sayının verilen adrese ya da değişkene yükleneceğini belirtir. Bu işareti koymazsanız o adresteki sayıyı bir adrese ya da değişkene yüklersiniz. Örnek
Move #i,di ;d1'e 1 değerini verir.
Move #$fc,d2 ; d2'ye $fc'i koyar.
Move $fc,di ; $fe adresindeki değeri
d1'e yükler.
Arada büyük fark var,öyle değil mi ? İlk programlarınızda bu hatayı bol bol yapacaksınız. (ve bol bol | crash edeceksiniz) Move komutundan sonra ikinci önemli komutumuz DC'dir. DC ( Define Constant - Sabit Tanımla ! değişken tanımlamakta kullanılan birinci yoldur. İkincisini ileriki sayılarımızda göreceksiniz.
- DC İle 3 tipte değişken tanımlayabilirsiniz :
DC.B byte anlamına gelir. 1 byte uzunluğunda değişken tanımlamak için kullanılır. DC.W ;(W - Word ) 2 byte uzunluğunda değiş- | kenler. |
DC.L ;(L-Longword) 4 byte uzunluğunda değişkenler. Örnek : Sayac: dc.b 0 ;sayac adında 1 byte uzunluğunda değişken tanımlar. Ad: dc.b — '6âler dergisi'; ad adında 1 byte uzunlukta değişken. Örnekten de anladığınız gibi değişkenin sonuna (:) işareti koymanız gereklidir. Değişken tanımlarını programın en altına yerleştirmeniz assemble işlemini hızlandırır. Ana döngüyü ise programın başına koymaya çalışın. Byte,Word ve Longword ifadeleriyle nız bir değişkeni kullanırken bu ifadeleri de uyumlu yapmaya dikkat edin.
Örnek: Doğru Yanlış Sayaç: dc.b 0 Sayaç: dc.b 0 Move.b #1, Sayaç Move.w #1, sayaç İkinci örnekte sayaç değişkenini byte olarak tanımlayıp word olarak işlem yapmamız hataya yol açar. DİKKAT! Bu hata assemble işlemi sırasında belirtilmez. Gördüğünüz gibi Move komutu Move.b, Move.w, Move.l olarak kullanılabilir. ADD VE SUB KOMUTLARI Add ve Sub komutları özet olarak toplama ve çıkarma işlemleri yapmaya yarar. Bu komutlar da byte, word ve longword olarak kullanılır.
Add.b #1,d0 ; değeri 1 arttırır.
Add.b $ff,d0 ; d0'daki değeri $ff adresindeki
değer kadar arttırır.
Sub.b #i,di değeri 1 azaltır.
Sub.b $fe,di ; d1'deki değeri $fe adresindeki
değer kadar azaltır. Bu komutlar tıpkı Move komutuna benziyor,öyle değil mi ? Bu arada şu do, d1 gibi şeylerin ne olduğunu açıklayalım. Seka'da bilgi depolayabileceğiniz 3 yer mevcuttur : 1- Bilgisayarın hafızası 2 - Değişkenler 3 - Registerler Registerler 17 tanedir ve üçe ayrılırlar : 1 - Address registers ( Adres registerleri) 2 - Data registers ( Data registerleri ) 3 - System registerleri Adres registerleri a0, a1, a2, a3, a4, a5, a6, a7'den oluşurlar. A7 registerinin bir başka adı da Stack Pointer (Yığın göstergeci)dir. Bu registeri ileriki bölümlerimizde daha detaylı olarak anlatacağız. JMP komutu: ( Jurmp - atla ) Bu komut BASIC'deki GO TO komutuyla eşdeğerdir.Makine dilinde satır numarası kullanılmadığı için JMP label şeklinde kullanılır. Örnek : imp geridön geridön: rts Program geridön label'ından devam edecektir.
Label tanımlarken tıpkı değişken tanımlarken olduğu gibi iki nokta kullanmanız zorunludur. JSR komutu: (Jump to Sub-Routine - alt rutine atla) JSR komutu BASIC'deki GO SUB komutuyla aynı işi yapar. RTS emrine rastladığında JSR'den bir sonraki komuta geçilerek program sürdürülür. RTS komutu: (Return to Sub-Routine - geri dön) Yukarıda anlatıldığı gibi BASIC'deki RETURN komutuyla aynı işi yapar. Örnek: jsr subi subi: rts CMP komutu: (Compare - karşılaştır) Sık kullanılan komutlardan birisidir. IF-THEN komutunun görevini yapar. Örnek: label: Add.b #1, d0 Cmp.b #20, d0 bne.l label Eğer d0 20 değerini almamışsa Compare biti 1 değerini alır. 20 ise 0 değerini programcıkta d0 registeri bir arttırılır. Compare ile 20 olup olmadığı kontrol edilir. Eğer 20 değilse label'e atlanır. BRANCH KOMUTLARI Branch (dallanma) komutları 16 tanedir. Ancak bunlardan sadece ikisi şimdilik işimize yarayacaktır. BEQ (branch if equal zero - eşitse dallan) BNE (branch if not equal zero - sıfıra eşit değilse dallan) Yukarıdaki örneğimizde 20 kadar artmasını istemiştik. THEN komutunun yerine geçen ve şimdi öğrendiğimiz iki komutla bu işi gerçekleştirebiliriz. arttır: add.b #1, d0 cmp.b #20, d0 bne arttır ; d0 20 değil ise arttır'a git. devam:
arttır: add.b cmp.b #20,dü beg arttırma ; 20 olmuşsa arttırma'ya git jmp arttır arttırma: programın devamı Bu aynı programın iki türlü yazılmış şeklidir. Bunu BASIC olarak yazsaydık : arttır: IF a<20 then goto arttır Şeklinde bir program elde ederdik. Bu sayıda öğrendiğimiz komutları toparlarsak, 1- Seka editör komutları 2 - Move komutu, değişken ve label tanimlama, Add ve Sub komutları, Cmp komutu ve iki
; olmamışsa devam
Branch komutu öğrenmiş olduk. Biraz da assemble işlemi sırasında karşınıza çıkabilecek hatalardan bahsedelim. 1 - Undefined symbol Bir değişken ya da label bulunamıyor. Ya bunları programa koymayı unuttunuz ya da isimlerini yanlış yazdınız. 2 - Branch forced too long Bir branch komutu en fazla 256 byte ileri ya da geri dallanabilir. 3 - Illegal addressing mode Data transferi yaparken bir hata yaptınız. 4 - Word at odd address Uzun programlarda ortaya çıkar. Basit bir hatadır. Hatanın çıktığı satırdan bir öncekine EVEN komutunu yazın. Örnek : even label:
Şimdilik başka bir hatayla karşılaşabileceğinizi düşünmüyoruz. Ancak bir sorunla karşılaşırsanız ya da sormak istediğiniz bir şey olursa 64'ler Dergisi'ne yazabilirsiniz. Unutmayın, makine dili bir anda öğrenilmez. Bu işe bol zaman ayırın. Mümkünse programı yazmaya başlamadan önce bir plan yapın. Gelecek sayıda size ekran kullanımını göstereceğiz. Ancak bu programlar uzun oldukları için dergide yayınlama olanağımız yok. Bunları dergiye başvurarak elde edebilirsiniz. Gelecek sayıda buluşmak üzere hoşça kalın...... BAHADIR AKCAN & BURAK ÖZIŞIK
Benim adım ERDEM... Simülasyonlar oynamadığım zamanlarda KICK OFF 2 oynuyorum. Çok da seviyorum, ara sıra kapı komşum Haşmet ile oynuyoruz. Ancak Haşmet şimdi hastanede... Kana ihtiyacı var. Benim kanım onun grubuna uymuyor. Çok üzülüyorum. Dört gözle kanı uyan birinin kanını vermesi için yol gözledik. O zaman inandım ki sağlıklı iken kan bağışlamak çok büyük bir şeymiş... Sizi de sağlıklı iken kan bağışlamaya çağırıyorum.
BEN KAN VERİYORUM YA SİZ...