Test Platformu - Bölüm 2

Merhaba sevgili Plazma okuyucuları. Plazma'nın birinci sayısında başlayan "Test Platformu" köşesinde önceki sayıda HTML, JavaScript, VBScript, VML, ActiveX, TinyPTC gibi çeşitli dil, nesne ve kütüphanelerin, yapmak istediğiniz programları hızlıca test etmek için nasıl kullanıldığını görmüş ve örneklendirmiştik. Bu sayıda ise geçen sayının sonlarında giriş yaptığımız "bu yöntemlerin başka platformlar için kullanılması" konusundan devam ediyoruz.

Hangi Geliştirme Platformlarından Bahsediyoruz?

Burada bizi ilgilendiren en önemli nokta, çalıştığımız "bilgisayar, işletim sistemi, bu sistem için geliştirilmiş uygulamalar" üçlüsünün, programı geliştirmek istediğimiz platformdaki aynı üçlüden daha üstün olmasıdır. Kısacası PC'yi, Mac'i ya da Amiga'yı Commodore 64 üzerinde program geliştirmek için kullanmak mantıklıyken Commodore 64'ü ters ihtimallerde kullanmak çok anlamlı olmayacaktır. Peki, şimdi bu bahsettiğimiz "bilgisayar, işletim sistemi, bu sistem için geliştirilmiş uygulamalar" üçlüsünü tek tek ele alalım.

1) Bilgisayar: Buradaki en önemli kriterlerden biri kullandığımız bilgisayarın, programı geliştirmeyi amaçladığımız bilgisayardan hızlı ve/veya yapıca üstünlükler sağlamasıdır. Böylelikle hedef bilgisayarda saatler sürebilecek bazı hesaplamaları seçtiğimiz bilgisayar platformunda dakikalar hatta saniyeler mertebesinde yapmamız mümkün olacaktır.

2) İşletim sistemi: Aslında işletim sistemi tercihinin önemi bundan sonraki maddeyle çok daha ilgilidir. Ancak seçeceğimiz işletim sisteminde aynı anda birçok uygulamayı çalıştırabilmek için multitasking olması (tüm modern işletim sistemleri bu yapıdadır) ve kullanıcının bu işletim sistemine hakim olması çok önemlidir.

3) Bu sistem için geliştirilmiş uygulamalar: İşte işletim sistemi asıl bu noktada önem kazanıyor. Bize hedef bilgisayarımızla ilgili kullanabileceğimiz en gelişmiş uygulamaları sunan, en iyi emülasyon programlarına sahip platformlar, bizim için en ideal platformlardır.

Kısacası o platform üzerindeki "en gelişmiş işletim sistemi" bu durumda en ideal işletim sistemi olmayabilir. Bizim için en ideali hakim olduğumuz ve bugüne kadar üzerinde uğraştığımız konuyla ilgili yeterli uygulama barındıran işletim sistemleridir. Yeterli sayıda uygulama olmayan bir işletim sistemini kullanmakta ısrar eden kullanıcı, eksik uygulamaları kendisi yazmak zorunda kalacaktır.

Gerek kendi çalışma ortamım, gerekse önceki sayının devamı olması nedeniyle geliştirme platformunu PC ve işletim sistemini Windows olarak ele alacağım. Ancak anlatacağım yöntemler kolay bir şekilde başka işletim sistemleri, hatta hatta başka bilgisayarlara uyarlanabilir.

Hangi Hedef Platformlardan Bahsediyoruz?

Evet bir de hedef platformlarımız var, yani hazırladığımız programın çalışmasını amaçladığımız ve geliştirme platformunu araç olarak kullandığımız platformlar.

Bu platformlar neler olabilir? Atari 800XL, Atari ST, Commodore 64/128, Sinclair, Amstrad, Amiga, GameBoy, PlayStation v.b. Peki öncelikle son örnekleri ele alalım. Diyelim ki PlayStation 3'e uygulama geliştirmek için PC kullanıyoruz. Bu mantıklı mı? PlayStation 3 kullandığımız PC'den daha güçlü bir donanıma sahipse neden doğrudan PS 3 üzerinde uygulama geliştirmiyoruz? Elbette ki PC kullanmak mantıklı, hatta hatta bazı platformlarda uygulama geliştirmek için alternatifimiz olmayabilir. PlayStation örneğini kasti olarak verdim. Ancak hiç üzerinde durmayacağım. Bizi burada ilgilendiren örnekler daha çok Atari, Commodore, Amiga gibi örnekler. Oyun konsolları ve gelişmiş donanımlar arasında çapraz geliştirme bu dokümanın konusuna girmiyor.

Bu dokümanı yazmamda yola çıktığım nokta olması nedeniyle Commodore 64'ü hedef platform olarak seçiyorum. Yazıda buradan sonra kullanılacak geliştirme platformu PC, hedef platform ise Commodore 64 olarak ele alınacaktır.

PC Kullanarak Commodore 64 Üzerinde Çapraz Geliştirme

Geçen sayıda verdiğimiz ön bilgiler ve bu sayıdaki girişin ardından, sonunda asıl konumuza geçebiliriz.

PC'de geliştireceğimiz uygulamalar elbette ki normal koşullarda Commodore 64'te çalışmayacaktır. Bunun en temel nedeni iki platformun makine dili yapılarının birbirinden çok farklı olmasıdır. Kısacası 2 ile 3'ü toplayan bir programı bile PC'den Commodore 64'e aktarmamız mümkün değildir. Öyleyse yapmamız gereken şey yazacağımız programların

Commodore 64 yani 6502 mikroişlemcinin yorumlayabileceği şekilde derlenebileceği bir uygulama bulmaktır. PC'de bu işi yapan "The ACME Crossassembler", "CC65", "ADC-65", "The COMFY 6502 Compiler" gibi birçok uygulama mevcuttur. Ancak kullanıcı dilediği taktirde kendi derleyicisini yazabilir ya da kaynak kodu açık derleyicilerden birini kendine göre modifiye edebilir.

İlk sorunumuzu çözdükten sonra karşımıza başka bir sorun çıkıyor. "Derleyici editörü" ihtiyacı. Programlarımızı Notepad'de yazıp daha sonra DOS ekranından parametrik komutlarla derlememiz mümkün. Mümkün olmasına mümkün ancak pratik değil. Projeler büyüdükçe renklendirilmiş editör ekranları, regular expression destekleyen bul&değiştir özelliği, çeşitli kısayol tuşları gibi ihtiyaçlar artacaktır. Bunun için Windows üzerinde "EditPlus"ı tavsiye ederim. EditPlus shareware bir uygulama olduğu için free bir editör tercih edenler ise aralarında Windows, Linux ve MacOS'un da yer aldığı 10'dan fazla platform desteği sunan "Emacs"i tercih edebilirler. Bu ve benzeri editörler çapraz geliştirme sürecinde işimizi oldukça kolaylaştıracaklardır.

Geriye tek bir sorun kaldı. Commodore 64'ün yorumlayabileceği byte kodları ürettiğimizi varsayalım. Peki bunun sonucunu nasıl göreceğiz? Elbette ki bunun iki yolu var.

1) PC'den Commodore 64'e veri transferi i) Dosya transferi ii) Doğrudan Commodore'un belleğine veri aktarımı

2) PC üzerinde emülatör kullanımı

Şimdi bu iki yöntemi biraz detaylandırarak anlatalım.

PC'den Commodore 64'e veri transfer etmenin birkaç farklı yolu var. Bunların en çok kullanılanı X1541 kablosu ve türevleridir. Bu kablo PC ile Commodore 64 arasında doğrudan bir bağlantı sağlamaz. Bunun yerine PC'nin paralel portu ile disket sürücü (1541, 1541-II gibi) arası bağlantı sağlar. Bu sayede PC'de geliştirilen uygulamalar Commodore 64'ün kendi formatındaki disketlere kopyalanabilir ve daha sonra Commodore 64 ile çalıştırılıp test edilebilir. Son yıllarda MMC64 gibi çok daha gelişmiş transfer (MMC64'ün veri transferinden çok daha fazla ve önemli özelliği var, internette bu konu üzerine biraz sörf yapmanızı tavsiye ederim) yöntemleri gündemde. Nightshift partisinde GO64'ün standını ziyaret edenlerdenseniz bir MMC64 sahibi olma şansını elde etmişsiniz demektir. Umarım bu şansı kaçırmış olmazsınız. Bu yöntemlerin haricinde IDE64, 1581, PC üzerinde 5.25" disket sürücüler v.b. teknolojileri veri transferinde kullanmanın çeşitli yolları mevcut. Ancak şimdilik bize transfer konusunda bu kadar detay gerekmiyor.

PC'den Commodore'a veri transfer etmeden Commodore için geliştirdiğimiz programların sonucunu PC'de görmenin tek yolu emülasyondur, yani Commodore 64'ün tüm donanımını, makine dilini, üzerinde gelen ROM'u, çalışma prensiplerini yazılımla simüle etmektir. Bu elbette ki hiç kolay bir iş değildir ve kullanıcının kendi başına böyle bir işe kalkışması çok uzun soluklu bir projeye girişmesi demektir ki başarı şansı da çok yüksek olmayacaktır. Ancak ne mutlu ki günümüzde Vice ve CCS64 gibi birçok Commodore 64 emülatörü mevcut ve birçoğu oldukça başarılı sonuçlar veriyor. Vice aralarında en gelişmişi denilebilir ve %99'a varan bir uyumlulukla Commodore 64'ü PC üzerinde çalıştırabiliyor.

Şimdi gelelim karar aşamasına. Yöntem olarak transferi mi yoksa emülasyonu mu seçmeliyiz? Birbirlerine göre avantajları neler? Cevap ise her ikisini birden kullanmamız gerektiğidir. Çünkü hiçbir Commodore 64 emülatörü, programları çalıştırmada %100'e varan başarıya ulaşsa da görüntü ve özellikle de ses emülasyonunda yeterli başarıyı gösteremez. Bunun başlıca sebepleri PC monitörleriyle Commodore'un kendine özel monitörleri ve televizyon çıkışının etkisinin yaratılamaması ve Commodore'un ses çipi olan SID'in analog yapısının PC'deki ses kartlarıyla emüle edilememesidir. Bu durumda geliştirilen programların tam olarak sonuçlarını görmek için Commodore 64'e transfer etmemiz bir zorunluluktur. Ancak elbette ki bu da geliştirme sürecini yavaşlatacak bir unsurdur. Çünkü programcı programları geliştirirken sık sık sonuçlarını görmek isteyecektir. Transfer işlemi ise dakikalar alabilen bir işlemdir. Bu durumda programcının her defasında programını kaydedip, transfer edip, sonucuna bakması bir süre sonra işkenceye dönüşecektir. Dolayısıyla PC'de geliştirdiğimiz programları doğrudan Commodore 64'ün belleğine derleyen bir düzeneğimiz olmadığı sürece en pratik metot, geliştirme sürecinde ara testler için emülatörleri kullanıp, tam sonuçları görmek için ise Commodore 64'e transfer etmektir.

Günümüzde ne kadar güvenilir hale gelmiş olurlarsa olsunlar, yine de emülatörlerin sonuçları tam güvenilir değildir. Özellikle ince zamanlamalar gerektiren tek bir cycle'ın bile önemli olabildiği konularda (raster barlar, border açma, multiplexer'lar v.s.) tek bir emülatörün sonucuna güvenmek yerine birden fazla emülatör ile test etmek daha güvenilirdir. Hem Vice'da hem CCS64'de aynı şekilde çalışan bir program büyük olasılıkla gerçek Commodore 64'de de aynen çalışacaktır.

Uyarı! Zaman zaman Vice'da ve CCS64'de hiçbir sorun gözükmediği halde gerçek Commodore 64'de çalışmayan programlar olabilir. Gerçek Commodore'da test edilmeden hiçbir uygulamanın dağıtılmamasını önemle tavsiye ederim. Özellikle IRQ loader kullanan çok parçalı programlar ve çok ince VIC hileleri içeren efektler Commodore 64'e transfer edilerek test edilmelidirler.

Yukarıda alternatifleriyle bahsettiğim derleyiciler, editörler ve emülatörlerden bu yazının geri kalanında kullanacaklarımız ACME, EditPlus ve Vice üçlemesidir. Bunların arasında şu şekilde bir hiyerarşi kullanacağız.

Bu yapıyı oluşturmak için yalnızca EditPlus'ın "Tools->Configure User Tools" menüsünü kullanmak yeterli. Bu bölümde yer alan "Capture Output" seçeneğini kullanarak ACME'den dönecek hata mesajlarını editörün içerisinden görmeniz mümkündür. Gerektiği taktirde "Capture Output" seçeneğini kullanmamak kaydıyla kendinize özel batch script'leri de (BAT uzantılı dosyalar) yazabilir ve derleme, çalıştırma işlemleri arasına bir tuşa basılana kadar bekleme gibi özellikler ekleyebilirsiniz (DOS'daki "pause" komutu). Gerekli ayarlamaları yaptıktan sonra EditPlus'da CTRL+(1-9) tuşlarına basarak programınızı derleyebilir, sonucunu emülatörden görebilirsiniz.

Şu ana kadar ağırlıklı olarak teorik bilgi verdik, bundan sonra daha çok pratik bilgilerle ilerleyeceğiz.

"Merhaba Dünya" Örneği

Artık ilk programımızı yazabiliriz. Ancak bu dökümanla ilgili unutulmaması gereken önemli bir nokta, dökümanın makine diliyle ilgili temel kavramları içermediği ve okuyucunun başlangıç düzeyinde de olsa makine dili bildiğini varsaydığıdır. Bu konuda yeterli alt yapısı olmayan okuyucular için yazıya devam etmeden önce Türkçe kaynak olarak İsmail Şahin'in (Hades/ Ascraeus) "C64 Türkiye Dergisi (http://www.c64turkiye.com/)" ve Bilgem Çakır'ın (Nightlord/ Glance) "Nightblog (http://nightlord.dr2.net/)" isimli Blog'unda yer alan dökümanları okumalarını tavsiye ederim.

Evet şimdi EditPlus'ımızı (ya da alternatif editörümüzü) açıyoruz ve aşağıdaki programı yazıyoruz.

hello.a

!to "hello.prg"

* = $080d lda #<yazi ldy #>yazi jsr $ab1e rts yazi !text "MERHABA DUNYA" !byte 0

Bu programı derledikten sonra emülatör ekranında "SYS 2061" yazarak programı çalıştırabilirsiniz. Elbette ki programları otomatik çalışabilir hale getirmek işimizi çok daha kolaylaştıracaktır. Bunun için programın başına iki satır eklememiz yeterlidir.

!to "hello.prg"

* = $0801 !byte $0c, $08, $00, $00, $9e, $32, $30, $36, $31, $00, $00, $00

* = $080d lda #<yazi ldy #>yazi jsr $ab1e rts yazi !text "MERHABA DUNYA" !byte 0

Bu eklenen satırlar Commodore 64'ün Basic'inde "0 SYS 2061" komut satırına tekabül eden byte'ları içerir. $0801 adresi ise Commodore'un varsayılan Basic başlangıç adresidir. Dolayısıyla bu program otomatik olarak "MERHABA DUNYA" çıktısı verecektir.

EditPlus kullanmayanlar DOS ekranından ACME'ye "hello.a" dosyasını parametre olarak vererek de "hello.prg" dosyasını elde edebilirler. Örnek:

C:\Acme>acme c:\myapps\hello.a

Bu komut satırını çalıştırdığınızda, bulunduğunuz klasörde "hello.prg" dosyası oluşacaktır.

Daha sonra Vice ya da CCS64 gibi bir emülatör ile bu dosyayı çalıştırabilirsiniz. Vice'da prg dosyalarını kolayca çalıştırmak için sürükle&bırak yöntemini tavsiye ederim.

Şimdi gelelim programın açıklamasına. $ab1e adresi Commodore 64 Basic ROM'unda yer alan STROUT yani "Output String" ROM adresine denk gelir (bkz: Link (http://www.tkk.fi/Misc/cbm/docs/c64-rom.html)). Bu adres, ekrana basacağı yazının adresinin alt ve üst byte'larını sırasıyla A ve Y register'larından okur. Commodore 64'de bellek adresleri 16 bit, ancak register'lar 8 bittir. Bu yüzden bir bellek adresine işaret etmek için her zaman (zero page yani $0000-$00FF adres aralığı hariç) iki byte ya da iki register kullanılır. $ab1e adresi "yazi" etiketinden itibaren 0 (sıfır) byte'ını gördüğü yere kadar olan tüm karakterleri ekrana basar.

Elbette ki ekrana yazı yazdırmanın tek yolu bu değildir. Commodore'un varsayılan ekran adresleri $0400-$07e7 aralığındadır. Dolayısıyla ekranın başından itibaren sabit bir karakter sayısındaki text'i transfer rutiniyle de ekrana bastırabiliriz. Ancak bu durumda "!text" yerine "!scr" kullanmamız gerekecektir.

hello2.a

!to "hello2.prg"

* = $0801 !byte $0c, $08, $00, $00, $9e, $32, $30, $36, $31, $00, $00, $00

* = $080d ldx #$00 loop lda yazi,x sta $0400,x inx cpx #$0d bne loop rts yazi !scr "merhaba dunya"

Bu örnek ekranın en sol üst köşesinden itibaren "merhaba dunya" yazacaktır. Buradaki "cpx #$0d" satırında yer alan $0d, desimal sayı sisteminde 13'e karşılık gelir ki bu da "merhaba dunya" yazısının toplam karakter sayısına eşittir. Farklı uzunluklardaki yazıları ekrana bastırırken $0d değerini yazının uzunluğuna göre değiştirmek gerekecektir.

"Sinüs Hareketi" Örneği

Merhaba dünya örneğinden sonra biraz büyük bir atlayış gibi gözükse de aslında yazacağımız program çok kısa ve basit bir program. Programın en büyük özelliği sinüs fonksiyonuna ihtiyaç duyması. Commodore 64'ün makine dilinde sinüs için özel bir operatör mevcut değil. Bunun için ya Basic ROM'undan sinüs fonksiyonunu kullanmamız gerekmekte ya da kendi sinüs rutinimizi yazmamız. Bu iki metodun da sonucu çok hızlı olmayacaktır. En pratik yol sinüs değerlerini tablolamak ve tablodan okutmaktır. Pekala, öncelikli işimiz sinüs hesaplatmak. Bunun için geçen sayıda da yaptığımız gibi çeşitli metotlar kullanabiliriz.

Amacımız Commodore 64'ün karakter ekranının en üst satırında bir karakteri sinüs hareketiyle sağa sola sallamak. Bir satır 40 karakter olduğuna göre bizim 0-39 arasında değişen değerlerde bir sinüs tablosuna ihtiyacımız var. Şimdi JavaScript kullanarak bu aralıkta değerler hesaplatan bir formül bulalım.

sinus.htm

<script> for(i = 0; i < 256; i++) { a = 20 + Math.floor(19.9 * Math.sin(i / 64 * Math.PI)); if(i != 0) document.write(","); document.write(a); } </script>

Bu örnek tarayıcımızın ekranına;

20,20,21,22,23,24,25,26,27,28,29,.......................,7,8,8,9,10,11,12,13,14,15,16,17,18,19 şeklinde tam 256 adet sayı basar. Şimdi sinüs hareketini oluşturacak minik programımızı yazalım ve internet tarayıcısının ekranındaki bölümü programımızın sonuna kopyala&yapıştır yapalım.

sinus.a

!to "sinus.prg"

* = $0801 !byte $0c, $08, $00, $00, $9e, $32, $30, $36, $31, $00, $00, $00

* = $080d loop jsr $e544 sinpos ldx sinus lda #$51 sta $0400,x inc sinpos+1 jmp loop

* = $0900 sinus !byte @Sinus değerlerini buraya kopyala & yapıştır

"sinus.htm" dosyasının çıktısını "sinus.a" kaynak kodunda kullanarak sinus hareketi yapan bir ASCII karaktere sahip olmuş olduk. Böylelikle geçen sayının başından beri anlatmak istediğimiz noktada ilk amacımıza ulaştık.

Bu örnekte kullanılan "jsr $e544" ekranı temizlemeye yarar. Bunun haricinde sinüs tablosu bilinçli olarak $0900 gibi $100'lük dilime denk gelen bir adrese yerleştirildi. Bu sayede "ldx sinus" komutunun işaret ettiği "sinus" etiketinin yer aldığı adresin alt byte'ı arttırılarak (inc sinpos+1) tablo üzerinde ilerlemek mümkün oluyor. $09FF adresinden sonra ise alt byte $00'a döndüğü için işaret de $0900 adresine dönüyor. Sinüs periyodu doğru ayarlandığında tekrar eden bir fonksiyon olduğu için harekette bir atlama olmuyor ve düzgün bir şekilde başa dönüyor. "lda #$51" satırındaki $51 değeri değiştirilerek de farklı ASCII karakterlerini ekranda sallamak mümkündür.

Bu bölümde ilk asli hedefimize ulaştık ve PC'nin imkanlarını kullanarak Commodore 64 üzerinde en basitinden bir efekt hazırlamayı başardık. Önümüzdeki bölümden itibaren bu tür örnekleri gittikçe geliştirirken, bir taraftan da "programları öncelikle PC'de test etmek" konusuna değineceğiz.

Bu bölümün de sonuna geldik. Eğer gerçekten bu dökümanın işinize yaradığına inanıyorsanız, gelecek Plazma sayısına kadar bol bol pratik yapın, genel olarak makine dili çalışın. Gelecek sayıda kaldığımız yerden devam edeceğiz. Hoşça kalın.

Benimle irtibata geçmek isteyenler için e-mail adresim;

skate <at> glance <dot> ws (mailto:skate@glance.ws)

Emir Akaydın

Skate / Glance