Bu sayfadaki yazılar
Sayfanın metni
Sayfa 62
Amiga Kursumuzun 2. bölümüne hoş geldiniz. Önceki sayımızda sizin de fark etmiş olacağınız gibi, bu yazı programcı olmayanlara değil, daha çok, programcılığı (Assembly, C veya en az bir programlama dilini) biliyor olup Amiga'da 68000 Assembly ile program yazmak isteyenlere yönelik. Ancak bu, programlamaya yeni başlayanları korkutmasın, bu şekilde öğrenmek zor olduğu kadar zevklidir de.
Önceki sayımızda 68000 komutlarını, veri transfer komutlarını ve Amiga'nın hafıza yapısı konularını incelemiş, basit bir kodu nasıl derleyeceğimizi öğrenmiştik. Bu sayımızda 68000 komutlarını öğrenmeye devam edecek, donanım register'larını kısaca tanıyacağız, ardından çeşitli örnek kodları inceleyeceğiz, son olarak biraz daha görsel sonuçlar görebileceğimiz, ilginizi çekeceğini umduğum bir örnek kod ile devam edeceğiz. Bunu yaparken henüz öğrenmediğimiz bazı konulara girmek zorunda kalacağız, ancak ileriki sayılarda bu konuların tümüne sırasıyla değineceğiz.
Öncelikle örnekleri kolaylıkla test edebilmeniz için hazırladığım asmpro.adf isimli dosyayı; eğer gerçek bir Amiga kullanıyorsanız boş bir diskete yazın (bunu yapan programları İnternet'ten bulabilirsiniz), eğer WinUAE Amiga emülatörü kullanıyorsanız ayarlarınızı aşağıdaki gibi yapın, df0'a asmpro.adf dosyasını gösterin, ayarlarınızı kaydedin ve emülatörü başlatın. Sistem bu disketten boot ederek açılacak ve karşınıza AsmPro çıkacaktır.
WinUAE ayarlarınızda 68020 işlemci, AGA chipset (en azından ECS), 3.1 veya 2.0 kickstart rom dosyası ve 4 MB fastram seçin.
Kodlarınızı rahatça yükleyip kaydetmek için bir harddisk oluşturmanızı tavsiye ederim. Hatta asmpro.adf disketindeki dosyaları harddiskinize kopyalayıp oradan da çalışabilirsiniz.
AsmPro ilk açıldığında gelen ekranda kullanacağınız ram tipi ve miktarını seçebilirsiniz. Şimdilik 100 KB CHIP RAM seçebilirsiniz.
68000 BCC Komutları (Dallanma Komutları)
68000 işlemcilerde genel olarak CC (Conditional Code) komutları adı verilen bir grup komut vardır. Bunlar çoğunlukla program içinde dallanmaya yarayan BCC komutlarıdır:
BCC Komutları (Koşullu Dallanma Komutları):
BCC komutlarının genel kullanım şekli aşağıdaki gibidir:
<label> Becc.W <label>
Burada komutu takip eden .S ve .W sonekleri (suffix) dallanmanın mesafesine göre belirlenir; .S kısa mesafe (short range: -128, +127 byte), .W ise uzun mesafe (word range: -32768, +32767 byte) dallanma anlamındadır.
Normalde belirtmediğiniz takdirde derleyiciniz en uygun olanı seçecektir.
BCC Komutları listesi aşağıdadır:
BCS BLS BEQ BNE BHI BCC
Carry Bit Set Lower or Same Equal (Z-bit Set) Not Equal (Z-bit Clear) Higher than Carry Bit Clear
BPL BMI BVC BVS BRA
PLus (N-bit Clear) Minus (N-bit Set) V-bit Clear (No Overflow) V-bit Set (Overflow) BRanch Always
BLT BLE BGT BGE
Less Than Less than or Equal Greater Than Greater than or Equal
İngilizce açıklamalarından komutların işlevlerini kolayca çıkarabilirsiniz. Burada dallanma komutlarına genel bir isim olarak kullanılan Bcc ile dallanma komutlarından biri olan BCC arasındaki benzerlik aklınızı karıştırmasın.
Bu listedeki tüm komutlar, .S ve .W eki ile kullanılabilir, .S hafızada daha az yer kapladığından ve daha hızlı olduğundan mümkün olan her durumda tercih edilir.
NOT: 68000 işlemcilerin üst modellerinde (68020/40) .L eki ile 32 bitlik mesafelerde dallanma yapılabilir. Ancak 68000 işlemcide .L ekli BCC komutları desteklenmemektedir.
waitelieck: btst #6,$bfe00l1l bne.s waitclick vts
Ayrıca DBcc (Decrement and branch conditionally) komutlarını da bu listeye eklemeliyiz. DBcc komutları (DBeq, DBne, DBpl vb.) verilen data register'ını bir azaltır ve koşul SAĞLANMADIĞI sürece veya verilen data register'ı sıfırın altına düşmediği sürece dallanma işlemini gerçekleştirir.
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 63
start: moveg #4,DO loop: nop ;buraya kodlar girilir dbeg DO,loop rus
Burada BEQ komutu ile DBEQ komutu arasındaki önemli farka değinmemiz gerek: BEQ komutu işlemin sonucu sıfır İSE dallanır, DBEQ komutu ise işlemin sonucu sıfır olana dek dallanır, sıfır olduğunda ise döngüden çıkılır.
NOT: Önce data register'ının değerinin sıfır olup olmadığına bakılır, sonra değer bir azaltılır, ilk karşılaştırmanın sonucu sıfır değilse dallanma gerçekleşir. Yani DBEQ komutundan çıkıldığında D0 register'ında $FFFF değeri olacaktır.
NOT 2: Verilen register'ın sıfır ile karşılaştırma işlemi 16 bit (word) olarak yapılır ve register'ın değeri yine word olarak azaltılır. Sayaç register'ındaki değer başlangıçta $12340000 ise DBcc komutundan sonra $1234FFFF değeri olacaktır.
Ayrıca yukarıdakilere ek olarak DBF ve DBRA komutlarını söyleyebiliriz, bu iki komut koşula (condition) bakmaksızın sadece register'ın değeri sıfır olana dek dallanma işlemi yapar. Genel olarak koşulsuz döngüler için kullanılırlar.
Hardware Register'ları
Hardware register'ları işlemcinin doğrudan custom chiplere ulaşabilmesini sağlayan adreslerdir. RAM ve ROM'da bulunmazlar. Normal şartlarda, eğer bir utility veya sistem uyumlu, multitasking bir uygulama geliştiriyorsanız bu adreslere doğrudan erişmeniz gerekmez, hatta erişmemeniz daha doğru olur. Bu adreslere dolaylı olarak ulaşmanızı sağlayacak kütüphaneler vardır. Kütüphaneler konusuna ileride detaylı olarak değineceğiz.
Ancak demo (ve hatta çoğu oyun) programları bu adreslere doğrudan erişim yapılarak yazılır. Bu bölümde ileride çok defa karşılaşacağımız bu adresler hakkında kısa bilgiler vereceğim:
Hardware register'larının 68000 üzerindeki base (taban) adresi $DFF000'dır. Yani verilen chip adreslerini bu taban adrese ekleyerek ulaşacağınız adresi bulabilirsiniz.
68000 adresi (chip adresi) + $DFF000
Örneğin Joystick/Mouse bilgisini okumak için kullanılan adres $DFF0DA için genelde sadece $0DA register'ı denir.
Aşağıdaki listede donanım register'larının adreslerini ve kısa açıklamalarını bulabilirsiniz. Listede R/W olarak verilen kısım register'ın sadece okunabilir ya da sadece yazılabilir olduğunu ifade eder.
W write-only, yalnız yazılabilir; R read-only, yalnız okunabilir; ER early-read DMA için kullanılır; S strobe yazma işlemi yapıldığında bir olay tetiklenir.
Bu register'ları kullanılırken okunabilir/yazılabilir olmalarına dikkat etmelisin, asla okunabilir bir register'a veri yazmaya kalkmayın ya da yazılabilir bir register'ı okumayın. Bu makinenin kilitlenmesine sebep olur.
Hardware Register'ları Listesi
BLTDDAT (000,ER) : Blitter RAM'e veri kopyalarken kullanır. Kullanmayınız.
DMACONR (002,R) : DMA kontrol, tüm DMA durumlarını bu adresten okuyabilirsiniz.
VPOSR (004,R) : Dikey tarama MSB (most significant bit) VHPOSR (006,R) : Yatay/Dikey tarama pozisyonu DSKDATR (008,ER) : Disk DMA tamponu. Kullanmayınız JOY0DAT : Joystick-mouse 0 verisi (dikey, yatay) JOY1DAT (00C,R) : Joystick-mouse 1 verisi (dikey, yatay)
CLXDAT : Sprite/görüntü çarpışma verisi (oku ve temizle)
ADKCONR (010,R) : Ses, disk kontrol register'ı POT0DAT (012,R) : Pot sayacı (dikey, yatay) POT1DAT (014,R) : Pot sayacı (dikey, yatay) POTGOR (016,R) : Pot port data SERDATR (018,R) : Seri port data ve durumu DSKBYTR (01A,R) : Disk data byte'ı ve durumu INTENAR (01C,R) : Interrupt enable bitleri INTREQR (01E,R) : Interrupt request bitleri DSKPTH (020,W) : Disk adres pointer'ı (üst 3 bit) DSKPTL (022,W) : Disk adres pointer'ı (alt 15 bit) DSKLEN (024,W) : Disk DMA data uzunluğu (word) DSKDAT (026,W) : Disk DMA data yazma REFPTR (028,W) : Kullanmayınız. (Refresh pointer)
VPOSW (02A,W) : Dikey tarama MSB (yaz)