Atari 800 XL/XE Bölüm 1

Bölüm 1 Emir (Skate) Akaydın

Giriş

80'li yılların ortalarında, ufacık bilinçsiz bir çocukken tanıştığım Atari 800 XL ile yaşadığım çocukluk aşkının 20 seneden uzun bir mazisi vardır. Ancak ne yazık ki aramızdaki elektrik kalıcı olamadı. Atari, bu 20 seneyi aşkın sürenin en fazla 2-3 senesinde benim hayatımda aktif olarak yer aldı. Çocukluk yıllarımda daha ilkokula gitmezken tanıştığım bu cici bilgisayar beklenenden erken öksürüp tıksırmaya başlayınca, o yılların en popüler bilgisayarı Commodore 64 hayatıma girdi. Artık Atari'nin Commodore ile mücadele etmesi söz konusu değildi. Duygusal Atarim, Commodore ile olan aşkımıza olan kıskançlığından dolayı kısa süre sonra kör oldu (GTIA çipi yandı). Ben de Commodore ile olan aşkımdan kör olmuş olsam gerek, o güzelim bilgisayarı ameliyat ettirmeye tenezzül etmedim ve diri diri gömdüm. Ancak yıllar sonra ruhu intikam için geri döndü (Atari800WinPlus Emulatörü).

Şekil 1.

Atari'yi terk etmemde geçerli sebeplerim olduğunu düşünmüştüm hep. Ne de olsa Atari çok daha eski ve ilkel bir bilgisayardı. Commodore 64 ise geleceğin teknolojisi idi. Commodore her konuda Atari'den üstündü. Atari'nin o kötü grafikli oyunlarının Commodore versiyonlarıyla mücadele etmesine olanak yoktu. Ne de olsa Commodore hız, görüntü, ses konularında Atari'den kat kat üstündü. Kim takar Atari'yi!!!

Bir çocuğun bakış açısından böyle bir imaj oluşturduğu için Commodore firmasını binlerce kez tebrik etmek lazım. Çünkü yukarıdaki paragrafta geçen düşüncelerden çok azı gerçeği yansıtıyor. Evet, Atari 800 serisi Commodore 64'ten yaklaşık 3 sene önce piyasaya sürülmüştü. Yani takvimsel olarak daha eski bir teknolojiydi. Evet, Commodore 64'ün SID çipi eşsizdi.

Atari'nin POKEY çipinin sağladığı ses özellikleri ne olursa olsun, sonuçta kulağa ulaşan ses hep Commodore 64'te daha kaliteliydi. Evet, Commodore 64'te 25 satır yani 200 pixel yükseklik varken Atari'de 24 satır, 192 pixel yükseklik mevcuttu. Ancak bunların haricinde Atari, Commodore'dan birçok açıdan çok daha üstün bir bilgisayardı.

Şimdi sırayla Atari'nin sahip olduğu üretim tarihine göre çok üstün olan özelliklerini inceleyelim.

"Bırakın beni, ben kendi kendimi test ederim" diye haykıran, test programları içinde gelen eşsiz aletin ana test ekranı

Şekil 2.

Atari 800 Serisinin Donanım Özellikleri

Atari, ana işlemci olarak 6502, görüntü için ANTIC ve GTIA, ses ve giriş/çıkış birimleri için ise POKEY çiplerini kullanır. Atari'nin işlemcisi 1.79 MHz hıza sahiptir. Hafızası RAM ve 24K ROM'dan oluşur. Cihazın üzerinde 2 joystick portu, çeşitli ek donanım ve kartuş portları bulunmaktadır.

Şekil 3.

Atari, 6502 mimarisini olduğu gibi almış ve kullanmıştır. Commodore 64'te olduğu gibi 6502'ye giriş/çıkış birimleri ekleyerek 6510 gibi özel bir işlemci geliştirme yoluna gidilmemiştir. Bunun yerine POKEY çipi hem ses, hem de seri giriş/çıkış işlemleri için kullanmak tercih edilmiştir.

Grafik Özellikleri

Atari grafik ve donanım destekli yaratıklar (spritelar) için iki ayrı çipten destek alır. Aslında yapı itibariyle grafiklerin iki katmandan oluştuğunu söyleyebiliriz.

ANTIC çipi Atari'nin bütün text ve grafik modlarını, yatay ve dikey ekran kayması gibi donanım destekleri sağlayan çiptir. Bu çipi en güçlü kılan özellik görüntü listesi (display list) adı verilen, Amiga'nın Copper'ına benzer bir özelliğe sahip olmasıdır. Bu söz konusu görüntü listesi ile her bir satırda (raster/tarama satırı) gösterilecek grafik/text modu değiştirilebilir. Commodore 64'te $D012 tarama adresiyle zahmetlice yapılan birçok iş, bu özellik yardımıyla zahmetsizce yapılabilir. Ayrıca bu özellik, Atari'nin BASIC dilinden de kolayca kullanılabilme avantajına sahiptir. İlerleyen bölümlerde bu konuyu tekrar ele alacağız.

ANTIC çipi elde ettiği görüntüyü GTIA (ilk üretilen Atarilerde çipine aktarır.

GTIA (George's Television Interface Adapter) çipinin asli görevi görüntü sinyallerini televizyona iletmektir. Ancak bu sinyalleri televizyona ulaştırmadan önce görüntünün üzerine yaratıkları basan da yine bu çiptir. GTIA'in yetenekleri bununla da sınırlı kalmaz. Yaratık çarpışmaları, öncelik sıraları ve tüm grafik verilerinin (ANTIC çipinin sağladıkları da dahil olmak üzere) parlaklık kontrolleri bu çip tarafından kontrol edilir. Çipin yeni modellerinde sağladığı bir diğer özellik ise ANTIC çipine ek olarak 3 yeni grafik modunu kullanıma açmasıdır. Bu grafik modları daha fazla renk kullanımına izin verir ancak çözünürlükleri oldukça düşüktür (80x192).

Şekil 4.

Atari 800 XL toplam 16 farklı grafik modu destekler. Atari 800 XE modelleri ise * ile işaretlenmiş 4 adet grafik modunu desteklemezler. Desteklenen grafik modları aşağıdaki tabloda verilmiştir. Grafik |Açık- |Çözü- |Renk |Par- Tarama | Byte/ Modu İlama nürlük laklık — |Satırı 0 (Antic|1x1 text|40x24 (1 2 8 40 2) 1 (Antic|2x1 text|20x24 |5 - 8 20 6) 2 (Antic|2x2 text|20x12 |5 - 16 20 7) 3 (Antic|4 Trenk|40x24 (14 - 8 10 8) grafik 4 (Antici2 renk|80x48 |2 - 4 10 9) grafik 5 (Antic|4 Trenk|80x48 (4 - 4 20 A) grafik 6 (Antici2 renk|160x96 |2 - 2 20 B) grafik 7 (Antic|4 Trenk|160x96 (4 - 2 40 D) grafik 8 (Antic|Tek 320x19 |1 2 1 40 F) renk 2 yüksek ÇÖZÜnürlük 9(GTIA|16 (1 16 1 40 1) laklık seviyesi 10 9 renk|80x192 (9 - 1 40 (GTİA |grafik 2) 11 16 renk|80x192 |16 - 1 40 (GTİA |grafik 3) 12* Çok 40x24 (4 - 8 40 (Antic |renkli 4) 1x1 text 13* Çok 40x12 (4 - 16 40 (Antic |renkli 5) 1x2 text 14* 2 Trenk|160x19 |2 - 2 20

Atari 800 XL/XE - Bölüm 1

(Antic |grafik |2 Cc) 15* 4 renk|160x19 (4 - 2 40 (Antic |grafik |2 E) Tablo 1

* Yalnızca Atari 800 XL'in desteklediği grafik modları

Ses Özellikleri

Şekil 5.

POKEY çipi 4 adet 8 bit ses kanalı desteği sağlar. Ses kanallarının her biri kendi bağımsız frekans, dalga biçimi ve ses düzeyi parametrelerine sahiptir. Daha kaliteli ses elde etmek için 8 bitlik 4 ses kanalı yerine, kanalları 2'şer 2'şer gruplayarak 16 bitlik 2 ses kanalı elde etmek de mümkündür. Hatta istenildiği takdirde 1 adet 16 bitlik ve 2 adet 8 bitlik toplamda 3 ses kanalı kullanma olanağı da vardır.

Giriş/Çıkış Desteği

POKEY çipi ses desteğinin yanı sıra tüm giriş/çıkış işlemlerinden de sorumlu olan çiptir. Özellikle klavye ile ilgili 6 bitlik bir tarama desteği sağlar. Yani 64 tuşa kadar tuş kontrolü yapabilir. Bunların yanı sıra CTRL, SHIFT, BREAK gibi özel tuşları da farklı biçimlerde algılayabilir.

SKRES, SEROUT, SERIN, SKCTL, SKSTAT isminde 5 farklı register; BREAK, K, SIR, ODN, XD, T1, T2, T4 şeklinde 8 farklı IRQ kesmesi içerir.

Bunların yanı sıra POKEY'de ses kanallarını kullanan 3 adet sayaç mevcuttur. Bu sayaçlar kullanılmaya başlandığında ses kanalları resetlenir. Bu sayaçlar genellikle rastgele sayı üretmek için kullanılmaktadır.

Şekil 6.

Ek Donanımlar

Atari bu konuda oldukça esnek tasarlanmıştır. 1088 KB'a (>1MB) kadar ek hafıza destekler. Standart kaset donanımın yanında 5.25 disk drive desteği de mevcuttur. Ayrıca aynı senelerde çıkan diğer birçok platformun aksine Atari'nin ek donanımları standartlaşmış ve bu donanımları destekleyen birçok uygulama ve oyun yayınlanmıştır.

BASIC Dili

Atari 800 serisinde gelen BASIC dili oldukça gelişmiş bir BASIC dilidir. Bu dili en güçlü kılan özellik donanım özelliklerinin birçoğuna rahatça erişebilmesidir. Özellikle grafik modları ve grafik komutları açısından zengin bir dildir. Ayrıca bir grafik modu açıkken satır satır program çalıştırmak için de özel tasarlanmıştır. Atari BASIC'i, birçok grafik modu için ekranın alt bölümünde bir text alanı ayırır ve imleç bu alanın sınırlarından dışarı çıkamaz. Bu sayede ekranın üst tarafında bir grafik varken alt tarafta hala BASIC komutlarını görmek mümkündür. Bununla ilgili hemen bir örnek görelim.

Aşağıdaki satırları Atari 800 XL/XE modellerinin açılış ekranlarında sırayla yazıp Return (Enter) tuşuna basın.

graphics 7
color 1
plot 10,10
color 3
plot 15,10
2
plot 20,20
drawto 123,38
graphics O

Bu komutları girdikçe yukarıda anlatılmak istenen kullanışlılığı göreceksiniz. Elbette ki bu grafik modları tam ekran olarak da BASIC'ten kullanılabilirler.

Komutların çıktısı bu şekilde olacaktır.

Şekil 7.

Atari'de Makine Dilinden Program Yazmak

Atari BASIC'i ne kadar gelişmiş olursa olsun, 2 MHz'in altındaki bir bilgisayar söz konusu olduğunda makine dili kullanımı kaçınılmaz bir hal alıyor. Atari'de makine dilinden program yazabilmek için sahip olunması gereken temel bilgi, 6502 assembler programlama bilgisidir. Bu temele sahip olunması durumunda aşılması gereken iki engel daha vardır.

1. Assembler programı yazabilecek rahat bir ortam oluşturmak.

2. Atari'nin hafıza yapısı ve donanımsal özelliklerini öğrenmek.

İlk madde için ihtiyacımız olan şey assembler'dan programlarımızı yazabileceğimiz bir editör/derleyici. Atari üzerinde bu güne kadar bu amaçla en sık kullanılmış derleyici "Atari Assembler Editor" ya da kısaltılmış ismiyle "Atari ASM Edit" kartuşudur. 8 KB'lık bir ROM'a sahip olan kartuş, zamanına göre çok üstün özelliklere sahiptir. Özellikle program içerisinde hata yakalamak için (debugging) çok kullanışlı fonksiyonları vardır. Tek eksiği 8 KB'lık hafızaya sığdıramadıkları için hata mesajlarının yalnızca sayısal kodlardan ibaret olmasıdır. Kısacası bir hata aldığınızda ekranda hatanın tanımını değil yalnızca kodunu görürsünüz ve kartuşun dokümanından bu hata kodunun ne anlama geldiğini araştırmanız gerekir. Bu kartuşu kullanmak isterseniz temel kullanım bilgileri aşağıda örneklerle verilmiştir.

Atari Assembler Editor Kartuşu Kullanım Örneği

Kartuşu taktığınızda "EDIT" yazan bir ekran karşınıza gelecek. Bu ekranda BASIC'ten program yazar gibi satır numaralarıyla program yazabilirsiniz. Dikkat etmeniz gereken husus, satır numarasından sonra 1 değil en az 2 boşluk bırakmanız gerektiğidir. Örnek program:

10 *— $0600
20 LDA #$C4
30 STA $02C6
40 RTS

Programımızı yazdıktan sonra "LIST" komutuyla programın listesini alabilir ve istediğiniz takdirde "NEW" komutuyla listeyi temizleyebilirsiniz. Programı yazdık ancak program henüz derlenmedi. Programı derlemek için "ASM" komutunu kullanmamız gerekiyor. ASM komutunu yazıp "Return" tuşuna bastığımızda aşağıdaki gibi bir çıktı almamız lazım.

ASM
0000 10 $0600
0600 A9CA 20 LDA #$CA4A
0602 8DC602 30 STA $02C6
0605 60 40 RTS

Eğer aşağıdaki çıktıyı aldıysak programı düzgün bir biçimde derlemeyi becermişiz demektir. Daha sonra programı çalıştırmak ve olası hataları takip etmek için "Edit" bölümünden "Debug" bölümüne geçiş yapmamız gerekiyor. Bunun için kullanacağımız komut "BUG" komutu. Programı çalıştırmak için ise go (git) anlamına gelen "G" harfini kullanacağız. Bu harfin yanına programın başlangıç adresini hexadecimal olarak yazmamız gerekiyor. Kısacası bundan sonra yazmamız gereken komutlar ve ekranda göreceğimiz çıktılar şu şekilde olmalı;

BUG
DEBUG
G 0600
0003 X-00 Y-00 P-BO S-12

Bu çıktının yanısıra ekran renginin yeşile döndüğünü herhalde fark etmiş olmanız lazım. İşte minik programımızın yaptığı iş de aynen bu. $02C6 hafıza adresi arkaplan renginin tutulduğu adres. $C4 yerine farklı değerler yazarak Atari'nin güzel renk paletini incelemeniz mümkündür.

Son olarak "Debug" moddan çıkıp "Edit" moduna geri dönmek için "X" komutunu kullanıyoruz. Örnek:

EDIT

Bundan sonra programı değiştirmeye devam edebilir ya da yeni bir program yazmaya girişebilirsiniz. BASIC dilinde olduğu gibi aynı satır numarasını tekrar yazıp "Return" tuşuna basarsanız, önceki satır yenisiyle değiştirilecek, yeni satır eskisinin üzerine yazılacaktır.

Programın sonucu Atari'de bu şekilde görünecektir.

Şekil 8.

Atari Assembler Editor Kartuşu Hata Kodu Listesi

Programlarınızı derlerken alabileceğiniz hata kodlarının anlamları aşağıdaki listede orijinal dokümanından alındığı şekliyle verilmiştir.

1 : Insufficient memory for

2 : The number xx cannot be found for the "DEL xx,yy" command

3 : Error in specifying an address in mini-assembler 4 : File cannot be loaded 5 : Undefined reference label 6 : Syntax error in a statement 7 : Label defined more than once 8 : Buffer overflow

9 : No label given before

10 : Byte expression is greater than 255

11 : Null string used where invalid 12 : Address or address type specified is incorrect 13 : Phase error: inconsistent result found from pass 1 to pass 2 14 : Undefined forward reference 15 : Line too large

16 : Source statement not recognized by assembler

17 : Line number too large

18 : LOMEM command attempted after other instructions

19 : No starting address given

Atari Assembler Editor İle İlgili Detaylı Bilgiler

Program yazmayı, çalıştırmayı öğrendik. Ancak Atari Assembler Editor'ün yetenekleri çok fazla. Eğer gerçekten bu kartuş hoşunuza gider ve kullanmak isterseniz daha fazla detay için "www.atariarchives.org" sitesini gezmenizi öneririm. Özellikle aşağıdaki adreste ihtiyacınız olan diğer komutların bir kısmını bulabilirsiniz.

http://www.atariarchives.org/roots/chapter 5.php

Biz şimdi bu kartuşu kullanmak yerine farklı bir yol çizeceğiz.

Atari İçin Çapraz Geliştirme

Atari Assembler Editor'ün nasıl kullanıldığını gördük. Ancak günümüzde Atari üzerinde çalışmak o kadar da pratik bir yol değil. Birçoğumuzun elinde çalışır halde bir Atari bile yok (ben de dahil olmak üzere). Olanların da çalışmalarını kaset ya da 5.25 disketlere emanet etmek isteyeceklerinden şüpheliyim. Dolayısıyla nostaljik sebepleri bir kenara bırakacak olursak PC ve emülatör kullanarak Atari için program yazmak en güvenilir ve rahat çözüm olacaktır.

Atari için uzun süre çapraz geliştirme ortamımı hazırlamak için araştırmalar yaptım. Bazı açık kaynak kodlu amatörce geliştirilen projelerde kullanılan çapraz geliştirme araçlarını gördüm, inceledim. Ancak dönüp dolaşıp eski bir dost olan ACME Crossassembler'da karar kıldım. Aslında ACME genellikle Commodore 64'e yönelik olarak hazırlanmış bir derleyici. Ancak sonuç olarak 6502 her halükarda 6502'dir. Yani ACME'nin üreteceği binary kodlar Atari'de çalışabilecek durumda olacaklar. Peki bu durumda her şey çözülmüş oluyor mu? Ne yazık ki hayır, biraz daha çaba sarf edeceğiz.

Problemlerimiz neler? ACME'nin üreteceği binary dosyaları Atari'nin hafızasına istediğimiz adresten yükletmek ve çalıştırmak zahmetli bir iş olacaktır. Commodore 64'ün *.prg dosya formatında dosyanın ilk iki byte'ı 16 bitlik bir hafıza adresi içerir ve bu sayede Commodore 64 dosyayı hafızaya nereden yükleyeceğini bilir. Ancak Atari'de durumlar biraz farklı.

Araştırmalarım sonunda Atari'nin otomatik olarak program yüklendiği gibi çalışabilen bir EXE formatını buldum. PC EXE'leriyle karıştırılmaması için genellikle XEX şeklinde uzantı kullanıyorlar. Bu dosyalar kolaylıkla yüklenebiliyor ve çalıştırılabiliyorlar.

XEX Dosya Formatı

Bu dosya formatı programın başlangıç ve bitiş adreslerine ihtiyaç duyar. En temel haliyle format şu şekilde verilebilir.

Kullanacağımız kısaltmalar:

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.

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

$10 : 2 boş satır

$20 : 3 boş satır $30 : 4 boş satır $40 : 5 boş satır $50 : 6 boş satır $60 : 7 boş satır $70 : 8 boş satır Görüntü Kodları: $02 : Text Mod 0 $03 : Text Mod 1 $04 : Text Mod 2 $05 : Text Mod 3 $06 : Text Mod 4 $07 : Text Mod 5 $08 : Grafik Mod 0 $09 : Grafik Mod 1 $0A : Grafik Mod 2 $0B : Grafik Mod 3 : Grafik Mod 4 $0D : Grafik Mod 5 $0E : Grafik Mod 6 $0F : Grafik Mod 7 (*) ile işaretli modlar BASIC'ten kullanılamayan modlardır. Sıçrama Kodları: $01 : Adrese sıçra $41 : Adrese sıçra ve taramayı yakalamayı bekle Örneğin; * listeye $06 değeri yazılarak ANTIC 6 (bkz: Tablo 1) moduna geçilebilir.

* 8 satır, yani 1 normal karakter yüksekliği boşluk vermek için $70 değeri kullanılabilir.

* $01 komutu ile liste içerisinden bir hafıza adresine sıçramak ve listeye oradan devam etmek mümkündür. $41 komutu ise sıçrama ve tarama yakalanana kadar bekleme anlamlarına gelmektedir. $01 ya da $41'den sonra gelen 16 bitlik adres, sıçranacak hafıza adresidir. Listenin başlangıç adresinin verilmesi durumunda sabit olarak o listeye uygun olan grafik ekranı açık kalacaktır.

Görüntü listesinin özellikleri bunlarla da bitmez. Görüntü kodları yalnızca 0, 1, 2 ve 3 numaralı bitler kullanılarak verilebilmektedir. 4, 5, 6 ve 7 numaralı bitler ise farklı özellikleri devreye sokarlar. Yani;

YXXXXYYYY YYYY : Görüntü kodu XXXX : Ek parametreler şeklinde düşünülebilir. Bu parametreler şunlardır: Bit 4: Dikey Kayma (Vertical Scroll). (Görüntü kodu+$10) Bit 5: Yatay Kayma (Horizontal Scroll). (Görüntü kodu+$20)

Bit 6: Hafıza Taraması Yükleme (Load Memory Scan). (Görüntü kodu+$40)

Bit 7: Görüntü Listesi Kesmesi (Display List Interrupt). (Görüntü kodu+$80)

Eğer 6. biti yani "Hafıza Taraması Yükleme"yi kullanacak olursak görüntü listesinde bu görüntü kodunun ardından gelen iki byte ekran adresinin başlangıcına işaret eder. Yani görüntü kodunu $06 yerine $06+$40 = $46 şeklinde kullanacak olursak yine ANTIC 6 grafik modu açmış oluruz ancak bu defa sonrasında gelen 2 byte'ın değeri ile ekran adresinin farklı bir adrese kaydırılması sağlanmış olur. Bu işlem farklı satırlar için defalarca tekrarlanabilir.

Grafik Örneği

Şimdi bu öğrendiklerimizi bir araya getiren bir örnek görelim.

grafik.ata
BASLANGIC $0600
SDMCTL—$022F
SDLSTH-$0231
RENK0-$02C4
RENK1-$02C5
RENK2-$02C6
RENK3-$02C7
RENK4-$02C8
"grafik.xex",plain
*
BASLANGIC ADRESI-6
lword $£f£ff, BASLANGIC ADRESI, BITIS ADRESI
*
BASLANGIC ADRESI
; Renkleri Ayarla
lda RENK3
sta RENKİ
lda RENK4
sta RENK2
; Grafik Ekranini Ac
lda #0
sta SDMCTL
lda #<GORUNTU LISTESIİ
sta SDLSTL
lda #>GORUNTU LISTESIİ
sta SDLSTHE
lda #$22
sta SDMCTL

Atari 800 XL/XE - Bölüm 1

jmp $a000
Yazilar
SATIRI !TEXT 0,0,0,0,0,0,"satir",0,"bir",0,0,0,0,
SATIR2 !TEXT 0,0,0,0,0,0,"satir",0,"iki",0,0,0,0,
SATIR3 !TEXT 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
1TEXT "satir",0,0,"uc",0,0,0,0,0,0,0,0,0,0
SATIR4 !TEXT 0,0,0,0,0,0,"satir",0,"dort",0,0,0,0
; Goruntu Listesi
GORUNTU LISTESI
; Bos Satirlar
!byte $70,$70,$70,$70,$70,$70,$70,$70
; Antic 6 Grafik Modu t Hafiza Taramasi Yukleme
!byte $46
; Ekran Hafizasini SATIRI1'e Ayarla
SATIRI
# Bos Satirlar
!byte $70,$70,$70,$70
; Antic 7 Grafik Modu Hafiza Taramasi Yukleme
!byte $47
; Ekran Hafizasini SATIR2'ye Ayarla
SATIR2
; Boş Satir
!byte $70
; Antic 2 Grafik Modu Hafiza Taramasi Yukleme
!byte $42
; Ekran Hafizasini SATIR3'e Ayarla
SATIR3
# Bos Satirlar
!byte $70,$70,$70,$70
; Antic 6 Grafik Modu t Hafiza Taramasi Yukleme
!byte $46
; Ekran Hafizasini SATIR4'e Ayarla
SATIRA
Boş Satirlar
!byte $70,$70,$70,$70,$70
; Adrese Sicra ve
; Tarama Yakalanana Kadar Bekle
!byte $41
; Sicranacak Adres
GORUNTU LİSTESİ
BITIS ADRESI — *
lword $02e0, $02e1l, BASLANGIC ADRESI

Bu örnek ANTIC 6, ANTIC 7, ANTIC 2 ve tekrar ANTIC 6 grafik modu açarak her bir modda birer satır yazı yazar. Ancak bu yazı yazma işlemi ekrana bir çıktı vererek değil hafızada yazıların bulunduğu adresler ekran adresi olarak değiştirilerek yapılır. Kısacası ANTIC çipinin ve bu çipin bize sağladığı görüntü listesi özelliğinin gücünden yararlanır.

Şekil 10.

Değerlendirme

Atari ile ilgili anlatılacak daha çok fazla konu var. Araştırmalarım sonunda Atari'nin yapabilecekleri, donanımını kullanma gücü ve sınırları ile ilgili çok ilginç bilgiler edindim. Elbette ki ister istemez benim 20 yıllık aşkım olan ve yine 6502 mimarisinden gelen Commodore 64 ile de sık sık mukayese ettim. İlginç olan şudur ki bir iki konu haricinde Atari 800 XL/XE modelleri Commodore 64'ü ezip geçiyor. Atari'nin piyasadan silinmesinin ardından Commodore 64'ün uzun yıllar varlığını sürdürebilmesi ve Atari'ye göre satış rakamlarındaki büyük fark, Commodore firmasının başarısını kanıtlayan öğelerden biri. Bunca yıl boyunca kandırılmışız. Atari Commodore'dan daha üstün bir bilgisayarmış (her konuda olmasa da). :)

Aslında bu yazıyı bir yazı serisi olarak tasarlamamıştım. Yazının çıkış noktası ACME kullanarak Atari üzerinde nasıl çapraz geliştirme yapılabileceğini anlatmaktı. Ama yazıyı yazmaya gelince işler bazen değişiyor. Beklediğimden çok daha fazla detaya girmek durumunda kaldım. Bu da bir bakıma bu yazının devamı olacağını gösteriyor.

Daha anlatılacak neler mi var? Öncelikle donanımda gelen "Oyuncular ve Füzeler" konusundan bahsetmek çok eğlenceli olacaktır. Böyle bir başlık atmak bile başlı başına bir zevk :) Ayrıca biraz daha intro/demoya yönelik olarak kayan yazılar, grafik ekranına şekiller çizdirme, renkler ve parlaklık değerleri ile yapılabilecek efektler gibi konular işin olmazsa olmazları gibi duruyor. Tabii ki kesme rutinleri, ses özellikleri ve diğer birçok konu bu yazının birden bile fazla devam yazısı olabileceğini gösteriyor.

Kaynaklar

Bu yazıyı hazırlarken birçok kaynaktan yararlandım. Ne de olsa bu platformla en son uğraştığımda 8-9 yaşlarındaydım. O zamanlar öğrendiğim 3-5 BASIC komutunun üzerine epey bir bilgi eklemem gerekti haliyle. Bu yazıyı hazırlamadan önceki birkaç aylık öğrenme sürecimi de hesaba katacak olursak, tek tek faydalandığım bütün kaynakların listesini veremesem de temel olarak kullandığım iki kaynağı belirtmek isterim:

Atari Archives: http://www.atariarchives.org/ Wikipedia'da Atari 800: http://en.wikipedia.org/wiki/Atari_800

Atari Archives çok geniş bir arşiv. Giriş sayfasındaki görüntü ilk bakışta içeriksiz bir reklam sitesi gibi dursa da aşağıdaki banner benzeri linklere tıkladıkça o linklerin hepsinin altında büyük birer bilgi hazinesi yattığını görüyorsunuz. İngilizce okuma düzeyi yeterli olan herkese tavsiye ederim.

Bir sonraki sayıda 2. bölümde görüşmek dileğiyle, hoşçakalın. (televizyonvari bir bitiriş oldu... ;))

emir (at) akaydin (nokta) com