Bu sayfadaki yazılar
Sayfanın metni
Sayfa 92
BA : Başlangıç Adresi BT : Bitiş Adresi XEX Dosya Yapısı: 2 byte : $ffff (dosya başlığı)
2 byte : BA (16 bit)
2 byte : BT (16 bit)
N byte : Programı bu bölüme yazıyoruz
2 byte : $02e0
2 byte : $02e1
2 byte : BA (16 bit) Eğer byte'ları tek tek sıralayacak olursak.
$ff, $ff, BA(alt 8 bit), BA(üst 8 bit), BT(alt 8 bit), BT(üst 8 bit), ... , $e0, $02, $e1, $02, BA(alt 8 bit), BA(üst 8 bit)
Böyle bir byte dizilimiyle karşılaşıyoruz.
ACME Kullanarak XEX Dosyası Yaratmak
Şimdi yukarıda verdiğimiz dosyanın ACME'den nasıl oluşturulduğunu görelim. Atari Assembler Editor için yaptığımız örneğin aynısını ACME'den kullanarak hazırlayalım.
renk.ata
BASLANGIC ADRESI $0600
!to "renk.xex",plain
*
BASLANGIC ADRESI-6
lword BASLANGIC ADRESI, BITIS ADRESI
*
BASLANGIC ADRESI lda #$c4 Sta $Ş02c6 jmp $a000
$02e1,
BITIS ADRESI *
lword $02e0, BASLANGIC
Bu örneğin tek farkı sonunda "RTS" yerine "JMP $a000" kullanmamız. Bunun nedeni ise otomatik olarak çalıştırılan programlar Basic'ten çağırılmıyorlar. Bu durumda da geri döneceğimiz nokta Basic olmadığı için programdan çıktığımız takdirde bilgisayar reset atıyor ve bunun gibi bir örnekte sonucu göremeyebiliyoruz. Basic'e dönmeden sonucu görmek istersek "RTS" yerine "JMP *" kullanabiliriz. Bu durumda programımız çalışacak ve sonunda sonsuz döngüye girerek kilitlenecektir. Ancak ekran renginin değiştiğini gözlemleyebiliriz. Atari'de Basic'in başlangıç adresi $a000'dır. "jmp *" yerine "jmp $a000" kullandığımız durumda programımız çalışıyor ve Basic ekranına güvenli bir şekilde ulaşmış oluyoruz.
Şimdi yukarıdaki örneği inceleyelim. İlk olarak BASLANGIC ADRESİ isimli bir sabit tanımlıyoruz. $0600 rastlantısal bir adres değil. Otomatik olarak çalıştıracağımız programlarımızı bu adrese yerleştirmemiz önemli. Tabii ki istediğimiz takdirde programımız farklı bir hafıza adresine de yerleşebiliyor. Fakat yine de ilk olarak başlangıç adresinin $0600 verilmesi gerekiyor. Daha sonra program istenilen adrese dallanabiliyor.
Ito "renk.xex",plain
Bu satırda dikkat etmemiz gereken noktalar şunlar. "renk.xex" derlenmiş programın kaydedileceği dosya ismi. Ancak asıl önemli olan ondan sonraki "plain" parametresi. Eğer ACME'yi Commodore 64'e yönelik kullanıyor olsaydık buraya "cbm" yazardık. Bu sayede otomatik olarak başlangıç adresi programın başına eklenirdi. Kısacası ACME'nin Atari'ye özel bir dosya formatı desteği olsaydı buraya "ATR" gibi bir şey yazıp doğrudan programımızı yazmaya geçebilirdik. Ancak ne yazık ki ACME'nin henüz Atari'ye özel bir desteği bulunmuyor. Ama ACME'nin yapımcıları, ACME'nin farklı 6502 tabanlı platformlarda kullanılabileceğini öngördükleri için "plain" parametresini eklemeyi ihmal etmemişler. Bu parametrenin yaptığı şey ise dosyanın başına, sonuna hiçbir şey eklememek ve düz bir binary dosya oluşturmak. Biz bu özelliği kullanarak kendi istediğimiz bir dosya formatını oluşturabiliyoruz.
* z BASLANGIC ADRESİ-6
XEX dosyalarının 6 bytelık bir başlığı (header) bulunuyor. Biz de burada başlangıç adresinin 6 byte öncesine denk gelecek şekilde başlık için pozisyon ayarlaması yapıyoruz.
lword $ffff, BASLANGIC ADRESİ, BIİTİS ADRESİ
Bu satır dosyanın başlığını oluşturuyor. !word 16 bitlik değerleri doğrudan yazmamızı sağlıyor. Eğer byte byte yazacak olsaydık bu satırı şu şekilde kullanabilirdik: $ff, $ff, <BASLANGIC ADRESİ, >BASLANGIC ADRESİ, <BITIS ADRESİ, >BITIS ADRESİ
* z BASLANGIC ADRESİ
Programın başlangıcına geldik. Aslında bu satırı yazmasak da tam 6 bytelık bir başlık tanımladığımız durumda aynı noktada olmamız gerekiyor. Ancak hem programın daha rahat okunması için hem de bir tedbir olarak bu satırı ekledik.
BITIS ADRESİ - *
Programın bitiş adresini baştan tanımlamak mantıklı bir yol değildir. Çünkü program uzayıp kısaldıkça bitiş adresi değişecektir. Her defasında bu adresi bulmaya uğraşmak da çok mantıklı bir seçenek değildir. Bu yüzden programın sonuna geldiğimizde "*" sembolünü kullanarak program adres sayacının değerini BITIS ADRESİ'ne eşitliyoruz. Bu da doğrudan olarak başlıktaki yerini alıyor.
$02e0, $02e1, BASLANGIC ADRESİ
$02e0 ve $02e1 adresleri Atari'nin disk işletim sistemi tarafından kullanılan adresler. Programın sonuna eklediğimiz BASLANGIC ADRESİ de yine programın çalıştırılacağı başlangıç adresinin yer aldığı yer.
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 93
Merhaba Dünya Örneği
Elbette ki bu örneği unutmuş değiliz. Atari'de ekrana yazı yazdırmanın birkaç farklı yolu var. Şimdilik diğer hafıza adreslerine çok bulaşmadan yalnızca ekran adreslerine kopyalama yaparak nasıl ekrana yazı yazdırıldığını görelim.
merhaba dunya.ata
BASLANGIC ADRESI - $0600 EKRAN - $9c40
!to "merhabadunya.xex",plain
* — BASLANGIC ADRESI-6
lword BASLANGIC ADRESI, BITIS ADRESI
* — BASLANGIC ADRESI ldx #$00 dongu lda YAZI,x sta EKRAN14182,x inx cpx #YAZI SONU-YAZI bne dongu jmp Ş$a000
YAZI !text "merhaba",0,"dunya" YAZI SONU - *
BITIS ADRESI — *
lword $02e0, $02e1l, BASLANGIC ADRESI
Atari'nin text ekranının başlangıç adresi $9c40'dır. Programın başında EKRAN sabitine bu değeri veriyoruz. Daha sonra bir döngü ile YAZI'da tanımladığımız karakterleri ekrana basıyoruz. Toplamda kaç karakterin kopyalanacağını YAZI'nın bitimine koyduğumuz YAZI SONU adresiyle YAZI'nın farkını alarak bulabiliyoruz.
EKRAN'ın başlangıcı BASIC'de imlecin dolaşabildiği alanın biraz dışında kalıyor. EKRAN'a 82 ekleyerek BASIC'de "READY" yazan satırın tam altına yazıyı yazdırmış oluyoruz.
Şekil 9.
Son olarak dikkat edilmesi gereken nokta Atari'nin karakter kodlarına uygun sonuç üretmediğidir. Küçük harfler söz konusu olduğunda bir problem yaşamazsak da diğer birçok karakter (boşluk karakteri de dahil olmak üzere) farklı sonuçlar verecektir. Bu yüzden, gerektiği yerde, karakter kodlarının kullanılması gerekiyor. Örneğin boşluk karakteri !text ile yazdırıldığında $20 (32) karakter kodunu oluşturur. Bu Commodore 64'de boşluğa denk gelirken Atari'de 9 karakterine denk gelir. Atari'de boşluk karakteri 0 kodundadır. Bunun için "merhaba dunya" yerine "merhaba",0,"dunya" yazmamız gerekiyor.
Assembler'dan Grafik Tabanlı Programlar Yazmak
Atari'de Assembler'dan grafik ekranı açmak oldukça kısa bir program parçasıyla yapılabiliyor. Örnek vermek gerekirse;
LDA #$00 STA $022f LDA #<GORUNTU STA $0230 LDA #>GORUNTU LISTESIİ STA $0231 LDA #$22 STA $022f
bu program parçası istenilen grafik modunu açabilir. $022f adresiyle Antic çipini yönetebiliyoruz. Bu adrese 0 değeri verdiğimizde Antic çipi kapanıyor. Böylece Antic çipinin okuduğu görüntü listesini (display list) değiştirme imkanı elde ediyoruz. $0230 ve $0231 adresleri bu listenin işaretçisi. $0230'a listenin yer aldığı hafıza adresinin alt byte'ını, $0231'e ise üst byte'ını koyuyoruz. Örneğin görüntü listemiz $2560 adresinde yer alıyor ise $0230'a $60, $0231'e $25 değeri vermemiz gerekiyor. Son olarak $022f adresine $22 değerini yazarak yeniden Antic çipini aktif ediyoruz ve yeni ekran görüntümüzle karşılaşıyoruz.
Buradaki soru işaretleri şunlar: $00, $22 gibi değerler nereden geliyor? Görüntü listesi tam olarak nasıl bir şey?
$022f adresi tanımlamalarda genellikle SDMCTL şeklinde kısaltılmıştır. Anlamı DMA kontrol register'ını kaydet demektir. Bu adrese yazılan değerler birer komut olarak algılanır. Yani $00 - Antic çipini kapat anlamına gelirken $22 - Antic çipini aktive et anlamına gelir.
Görüntü Listesi (Display List)
Görüntü listesi komutlar ve bu komutların parametrelerinden oluşan bir listedir. Bu yönüyle Amiga'nın Copper'ına benzetilebilir. Yukarıdaki program parçasında hangi grafik modunun açılacağı belirtilmemiştir. Bu tamamen görüntü listesinde yer alan değerlerle belirlenir.
Görüntü listelerinde kullanılabilecek komutlar aşağıdaki gibidir. Boş Tarama Satırı Kodları:
$00 : 1 boş satır