GO 64 - Commodore
128 Ne Kadar uyumlu?
Uyum sözcüğü her zaman Commodore için bir albeni unsuru olmuştur. Bu nedenle, C-128'in C-64 ile gerçekten tam uyumlu olup olmadığı, küçük de olsa bir şüphe uyandırmaktadır. Test sırasında, bir kilit üzerinden doğrudan ya da endirekt olarak işletim sistemine bulaşan ya da C-64 olmayan bir makineyi çalışmaz hale getirecek çeşitli genel özellikler gösteren birçok program denendi. İlk deneme Hypra-Load ile yapıldı. Programın birkaç kere çalıştırılması, 1541 ile bağlantıda hiçbir sorun çıkmadığını gösterdi. Bu da, değiştirilmiş taşıt rutinlerine sahip programların tümünün herhangi bir sorun çıkarmadan işlev görebileceğini gösterdi.
Ortak RAM alanının büyüklüğü BK 11x16K
Ortak alanın konumu 00 ortak olmayan alan 01 bellek başlangıcı 40 bellek sonu 14 başlangıç ve son 00 Block 1 01 Block 2
10 Block 3 14 Block 4
Şekil 3. MMU'nun RAM konfigürasyon sicili
Commodore 128'in içine bir göz attığımızda, aynı taşıt yapı elemanlarının kullanıldığı görülüyor. Aynı zamanda, C-128'in C-64 modundaki hızı C-64'ün aynı, dolayısıyla burada da bir sorun çıkması beklenemez. İkinci deneme, illegal opkodları yoğun olarak kullanan bir kopya programıyla yapıldı. İşlemcinin komut seti, opkod olarak adlandırılıyor. İllegal opkodlar ise, üreticinin öngörmemiş olduğu komutlar. Fakat gerçekte bunlardan bazıları C-64'te de bir şeyleri etkileyebiliyorlar. Ay-
rıca bazı programlar bunları kullanıyor. Dolayısıyla 8502 işlemcisinin, 6502'de tanımlanmamış bu opkodları kullanması mümkün olabilmekte. Burada da herhangi bir sorun çıkmıyor. Diğer tüm kilitlenmiş (veya kilitlenmemiş) disket programları da herhangi bir sorun çıkarmaksızın yüklenebiliyor ve kullanılabiliyor. Test sırasında yakından tanıdığımız 1541 disket sürücü kullanıldı. Daha sonraki modelimiz 1571'in neler yaptığı ileride yayınlayacağımız yazılarda anlatılacak.
57
Testin diğer aşamalarında Ghostbusters ve Pit Stop II gibi oyunlar denendi. Burada da sonuç açık ve net: Gerek grafik, gerekse müzik, C-64'tekiyle tam bir uyum içinde. Commodore 128'e teyp (datasette) de bağlanabildiği için, programın bir sonraki aşamasını kasette bulunan programlar oluşturuyordu: Bazıları turbo yükleyici ve autostart'la donatılmış oyunlar, aynen disketteki programlar gibi hiçbir sorun çıkarmaksızın çalıştı.
Son ve en hassas deneme, expansion porta takılan kartuşlarla gerçekleştirildi. Burada da, örneğin ne Soccer'de, ne de GBasic'te, hiçbir sorun çıkmadı. Özellikle, kendi içinde de bir Bank-switching-Elektronik daha barındıran, yani C-128'in kendisi gibi, iki bellek elemanını sırayla açıp kapatan GBasic modülü, Commodore 128'in, C-64 modunda Commodore 64 ile software açısından tümüyle uyumlu olduğunun son kanıtı oldu. Turbo Access veya Speeddos gibi Hardware ekleri bakımından bu uyumluluğun ne kadar gerçekleştiği henüz pek açık değil. Fakat en azından kesin olarak bileceğimiz bir şey, bu eklerin platinlerinin değiştirilmesinin gerekliliği. Çünkü C-128'de Kernal ve Basic, C-64'teki gibi her biri 8'er KByte'lık iki ROM'da değil, 16 KByte'lık tek bir ROM'da bulunuyor. Bu uyum testinin sonucu şu: 1541 disket sürücüsüyle birlikte bir C-64'e sahip olan bir kimse rahatça bunu satabilir ve bir C-128 alabilir. Bu test sırasında denenmemiş hiçbir program türü kalmadı. Hatta bu denemelerde özellikle işletim sisteminde oradan oraya atlayan programlar kullanıldı. Hiçbirinde bir aksaklık olmadı. Commodore 128, Commodore 64 ile joystick girişleri açısından bile tam uyumlu.
Süper-BASIC 7.0
C-128'in ve C-128D'nin en güçlü yönlerinden biri şüphesiz kendini Basic çeviricisinde gösteriyor. BASIC 7.0, çeşitli Basic versiyonlarının (C 64-teki 2.0; C-16 ve Plus 4'teki 3.5; CBM 80xx'teki 4.0 gibi) tüm komut ve fonksiyonlarını içeriyor. Böylece DRAW, BOX veya CIRCLE gibi çok kullanışlı grafik komutlarının yanısıra bir sürü disket komutu da kullanıma amade oluyor. Hepsi bu kadar da değil. BASIC 7.0, ayrıca sprite'ların yönetimine ve synthesizer elemanı SID'ın kolayca programlanmasına yarayan bir dizi özel komut içeriyor. Basic 2.0'ınkiler dışında kalan komutlar ve fonksiyonlar Tablo 1.'de veriliyor. Bu tabloya kısaca bir göz atmak bile, Basic programlamada yeni bir boyutun varlığını görmeye yetiyor. Sayısız DATA'lar ve karmaşıklığa neden olan GOTO'lar, bu Basic ile artık geçmişin malı oldular. PRINT USING yardımıyla formatlanmış sayı çıkışı, joystick, ışık kalemi (light-pen) ve paddle kullanımına yönelik komutlar kolayca anlaşılabiliyor. WINDOW komutu yardımıyla, içine tüm PRINT ve INPUT komutları girilebilen bir ekran penceresi tanımlanabiliyor. SLEEP adlı komutla, 128 verilen süre kadar “uyutulabiliyor”. Örneğin, “SLEEP 5“ komutu, programı beş saniye durduruyor. Böylece program akışında önemli duraklamalara neden olan boş FOR...NEXT... döngüleriyle uğraşmaktan kurtulunuyor. Bu yolla bir saniye ila 18 saat arasındaki süreler programlanabiliyor. Tabii burada sorulacak olan şey, program sırasında kimin bilgisayarını bir dakikadan uzun süre durdurmak isteyeceği. Dikkati çeken iki komut daha var: SLOW ve FAST. Bu iki komut aracılığıyla, C-128, 1 MHz (SLOW) veya 2 MHz ile çalıştırılabiliyor. SLOW'a geçildiğinde bilgisayar aynen C-64'te olduğu gibi 1 MHz ile çalışıyor. Aslında programlar, değişkenler ve Basic işletim sistemi için farklı bellek bankalarının varlığı nedeniyle karmaşıklaşan bellek yönetimi, C-128 Basic'inin C-64 Basic'ine göre biraz daha yavaş olmasını sağlıyor. Fakat bu, daha önce de belirtildiği gibi, çok daha geniş olan komut seti nedeniyle göze alınabilecek bir dezavantaj, ayrıca istenirse işletim hızı FAST komutuyla tam iki katına artırılabiliyor. FAST modunun sağladığı avantajlar, daha önce anlatılmış olan bazı dezavantajlarla birlikte ele alınmalı. Yeniden Basic'e dönelim ve sevindirici bazı özellikleri inceleyelim. BASIC 7.0'daki bir dizi komut, programlamada oldukça büyük kolaylıklar sağlıyor. AUTO program girilirken, satır numaralarını otomatik olarak veriyor. TRON ile bir programın denenme aşamasında bir Trace Fonksiyonu harekete geçirilebiliyor. Böylece ekranda o sırada işlenmiş Basic satırlarının numaraları görüntülenebiliyor. Bu da özellikle program mantığındaki hataların tespitinde işe yarıyor. Yanlış konmuş bir IF sorusu bu özellik sayesinde kolayca belirlenebiliyor; çünkü programın içinde de kullanılabiliyor. Programın “şüpheli” bölümünün başına TRON komutu konuyor, bu bölümün sonunda Trace fonksiyonu TROFF komutuyla işletim dışı bırakılıyor.
RENUMBER komutu, programın türünün veya çeşitli bölümlerinin numarasızlaştırılmasına yarıyor. RENUMBER, yakından tanıdığımız Simons' Basic'te hem GOTO, hem de GOSUB adreslerini değiştirirken (yeni bir sorunu bir yardımcı gibi gösterirken), BASIC 7.0, GOTO, GOSUB, THEN, ELSE, RESTORE ve RESUME'nin ardındaki tüm satır numaralarını otomatik olarak düzeltiyor ve hatta bunu bir hata bulma rutininde özel EL değişkeni yardımıyla hata satırlarının aranması sırasında yapıyor. Böylece BASIC 7.0'ın yeni ve enteresan bir özelliğine geldik.
Program Kesilmeden
Hata Bulma ve Düzeltme
C-64 her ortaya çıkan hatada karşılık gelen bir mesajla programı keserken, C-128 bu konuda belli bir esnekliğe sahip. TRAP komutu sayesinde hatalar programın işlemesi sırasında yakalanabiliyor. Örneğin, “TRAP 500“ komutunun verilmesinden sonra, bir hatanın ortaya çıkması durumunda programın çalışması kesilmiyor, aksine bir hata düzeltme rutini (örneğimizde 500 satırından sonra) dallanıyor. Hataya ilişkin tüm önemli veriler, sistem değişkenlerinde saklanıyor ve (programcı tarafından yazılacak olan) Basic rutini tarafından 500. satırından itibaren değerlendiriliyor: EL, hatanın ortaya çıktığı satır numarasını, ER hata numarasını içeriyor; ERR$ ise yazıdaki hata mesajını veriyor. Hata düzeltme rutini, gerekli önlemi almak için, bu değişkenleri değerlendirebilmekte. Tabii bundan sonra programın devam edebilmesi gerekiyor. Bunu sağlayan ise RESUME komutu. Bu komut bir hata düzeltme işlemini sona erdiriyor (alt programlardaki RETURN ile karşılaştırılabilir). RESUME üç farklı biçimde kullanılabiliyor. Herhangi başka bir parametresi olmayan RESUME, hatayı doğuran komuta geri dönüyor ve programı oradan devam ettiriyor. Bu durumda tabii ki hata düzeltme rutini tarafından hata nedeninin ortadan kaldırılmış olması gerekiyor. Aksi takdirde hata aynen yinelenecektir. Bunu açıklamak için en iyi örnek, bilgisayarın açık olup olmadığını denemek:
40 TRAP 90: OPEN 1,4
20 PRİNT# 4, “BILGİYAZAR OK”
30 END
90 IF ER—5 AND EL— PRİNT
“LUTFEN BİLGİYAZARI ACINIZ VE
TUSA BASINIZ”: GETKEY A$
95 RESUME
Bu küçük demo programı, bağlı bir bilgisayar hakkında “BİLGİ-YAZAR OK” ifadesini verecektir. Bilgisayarın açık olmaması durumunda, 10 satırındaki OPEN komutu normal olarak “Device not present” hata mesajına yol açacaktı. Bu mesaj her halükârda TRAP komutu tarafından yakalanır ve bunun yerine hata numarasının ve satırının denetlenmesinden sonra kullanıcının kibarca bilgisayarı açması için uyarıldığı 90. satırına dallanır. GETKEY komutu, programın RESUME komutuyla yeniden OPEN komutuna dönmesini sağlayacak bir tuş girişini bekler. Hataya neden olan komutun bir daha yerine getirilmemesi gerekiyorsa, hata düzeltme rutini RESUME NEXT ile kapatılır; böylece hata nedeninden bir sonraki komutla devam edilmesi sağlanır. Özel bazı durumlarda, bir hatadan sonra programın tamamen farklı bir yerinden devam etmek gerekebilir. Böyle bir durumda RESUME'nin ardından, programın devam etmesi gerektiği yerin satır numarası verilir. Programın kendi içinde gerçekleşen bu hata düzeltme olanağı, kullanıcıya büyük avantajlar sağlamaktadır. Programın geliştirilme aşamasında bir hata ortaya çıktığında, hatalı satırın dökümünü almak için HELP tuşuna basmak yeterlidir. Satırda hataya neden olan kısım bu sırada ters (reverse) olarak görüntülenir. Tabii ki, disket ünitesinden bildirilen hata da aynı biçimde araştırılacaktır.
1 OPEN
PRİNT 1:END
gibi kapsamlı bir satırı girmek (ve bu arada muhtemelen kendi programının üzerine yazmak) yerine, BASIC 7.0'da yalnızca “?DS$” girilir ve aynı mesaj alınır. DS$ sistem değişkeni, disket ünitesinin hata durumunu, DS sistem değişkeni ile karşılık gelen hata kodunu açık metin olarak içerir. Esas olarak C-128'de tüm disket komutları, Basic komutları olarak kullanılabilir durumdadır. Örneğin SCRATCH, disketten bir kütüğü siler; DIRECTORY veya CATALOG programın kaybolmasına neden olmadan disketin içerik listesini verir; DLOAD, DSAVE ve DVERIFY sayesinde sıkıcı kurtulmak mümkün olur. BLOAD ve BSAVE ise herhangi bir bellek içeriğini programları, (veriler vb.) yüklemeye ve bellekte saklamaya yararlar. Sıralı ve rastgele kütüklerin daha kolay kullanılmasına yarayan bir dizi komut daha vardır. Örneğin RECORD ile bir rastgele kütüğün herhangi bir veri kaydına doğrudan erişilebilir; APPEND ise sıralı kütüklere ek veri kayıtlarının sorulmasına yarar.
GOTO'suz
Programlama
BASIC 7.0, GOTO'lara gerek duymaksızın yapılandırılmış programlama sağlayan bir dizi döngü ve yapı komutlarına sahiptir. Bunlardan biri, ELSE koşulu için IF...THEN sorusunun geliştirilmişi. Şimdiye kadar alternatifli tercihler şu örnekteki gibi programlanabiliyordu:
40 A$—”N” THEN PRİNT
“HAYIR”:GOTO 30
20 PRİNT “EVET”
30 REM BOYLECE DEVAM
BASIC 7.0'da aynı işi yapmak için çok daha kolay anlaşılabilen tek bir satır yeterli:
40 1F AS—“N” THEN PRİNT
PRİNT “EVET”
AS, “N”e eşitse “HAYIR”,
değilse “EVET” basılacaktır.
Yazık ki, ELSE komutu bu şekliyle tek bir satırla sınırlanmıştır. Burada gerekli çareyi BEGIN...BEND ile parantezleme sağlar. BEGIN ve BEND arasında yer alan tüm BASIC satırları, BASIC çeviricisi tarafından tek bir BASIC satırı gibi algılanan bir öbek oluşturur. Bu nedenle BEGIN...BEND, özellikle IF sorularında çok yarar sağlar:
40 INPUT “SENİN BİLGİSAYARIN
COMMODORE MU
BASKA MI?:C$
20 IF C$-“COMMODORE”
THEN BEGİN
SATIN ALINIZ!”
40:BEND:ELSE BEGİN
SO:PRİNT“HAİN!”
60 BEND
60
Burada dikkat edilmesi gereken, IF komutunun 20. satırından 60. satırına kadar yayılmakta olmasıdır. Bu örnekte, eğer bilgisayar Commodore ise, bir C-128 satın alınması öneriliyor. Eğer bilgisayar Schneider veya başka bir markaysa hemen “hain” damgası vuruluyor. Tabii ki, bu tür IF...THEN...ELSE soruları, BEGIN...BEND ile birbirine geçirilebilir, yani hem THEN bölümüne hem de ELSE bölümüne ek IF soruları eklenebilir. Böylece daha büyük program öbekleri de GOTO kullanılmaksızın programlanabilir. GOTO'nun dışlanması, programa bir toplu bakışı kolaylaştırdığı gibi, hızını da oldukça artırır. BASIC çevirici her GOTO komutunda öncelikle programın içinde ondalık olarak bulunan satır numarasını ikili yazı düzenine dönüştürmek ve verilen satırı aramak zorundadır. Bir diğer avantaj: Program komutlarının kendilerine artık daha başka satır numaralarına gerek kalmıyor. Örnek program hiçbir değişiklik gerektirmeksizin olası tüm satır alanlarında kullanılabilir. Böylesine kolay programlanan yalnızca dallanmalar değildir. Özellikle döngülerde, yani belirli program parçalarının tekrarlanmasında, BASIC 7.0'ın üstünlüğü kendini açıkça göstermektedir. C-64'ten de bildiğimiz gibi, bir FOR...NEXT döngüsü, aynı döngünün IF ve GOTO ile programlanmış halinden bir miktar daha hızlıdır. FOR...NEXT döngüsünün dezavantajı ise, döngünün kaç kere tekrarlanması gerektiğinin girişte verilmesi zorunluluğudur. Bu dezavantaj, yeni ve hızlı bir DO...LOOP döngü yapısı ile ortadan kaldırılabilmektedir. FOR...NEXT gibi DO...LOOP da istenen uzunlukta bir program bölümünü çevreleyebilir. DO komutu, yalnızca BASIC çeviricisinin döngünün başlangıcını fark etmesini sağlar. Buna ilişkin LOOP'a erişildiğinde, herhangi bir arama süresi gerektirmeksizin son derece hızlı bir biçimde DO'ya geri atlanacaktır. Yani sonuçta ortaya çıkan, DO ile LOOP arasında bir “sonsuz döngü”dür. Bu döngüyü terk edebilmek için, EXIT komutu öngörülmüştür. EXIT'in görevi, LOOP'un arkasından programın akışının normal bir biçimde sürdürülmesidir. Bu nedenle EXIT komutu, çoğunlukla bir koşula bağlanır. Örnek:
10
20 DO
30:X — x*2:PRİNT X
A0:İF X THEN EXİT
50 LOOP
x değeri, 1500 değerini aşılana kadar ikiye katlanır ve görüntülenir. Bu koşulsuz DO...LOOP döngüsünün yanısıra, koşullara bağımlı iki tür de öngörülmüş durumda:
DO WHILE...LOOP, WHILE'den sonra yer alan koşul geçerli olana kadar sürer:
40DO WHİLE A$ A$:LOOP
Hiçbir tuşa basılmamış olduğu durumda, WHILE koşulunu yerine getiren A$ daima boştur. Döngünün terk edilmesi ancak bir tuşa basılmasıyla gerçekleşir. DO UNTIL döngüsü ise bunun aksine, koşul doğru olduğu sürece yerine getirilmez, ancak UNTIL'in arkasında verilen koşulun doğrulanmasına kadar yürütülür. Tabii ki, DO WHILE veya DO UNTIL'de, bu komutların verimini yükseltecek şekilde istendiği kadar EXIT döngüye eklenebilir.
Şimdi de Grafik
C-64'te yüksek çözümlemeli bir grafik elde etmek için birtakım BASIC ilaveleri satın almanın (veya çeşitli program dökümlerini girmenin) dışında varolan tek alternatif, insanın makine dilinde uzmanlaşmasıdır. Bu da yaklaşık olarak, kendi renkli televizyonunda renkleri ayarlayabilmek için insanın radyo/televizyon teknisyeni olması gibi bir şeydir. Commodore bu dezavantajı, C-16'nın BASIC 3.5'iyle ortadan kaldırmaya çalıştı. Commodore 128'in yüksek çözümlemeli grafiği, aynen C-64 ve C-16'nınki gibi oluşturuldu. 320x200 noktalık bir çözümlemeye karşılık gelen toplam 64 000 nokta ayrı ayrı sayılabilir. Bunun yanısıra her bir noktanın dört renkten birine sahip olabildiği, 160x200 noktalık çözümlemeli bir renkli mod öngörülmüştür. C-128'in C-64 ile arasındaki en büyük fark, C-128'in grafiğinin tümüyle BASIC'e dayalı olmasıdır. DRAW, BOX ve CIRCLE gibi komutlar, doğrular, üçgenler, dörtgenler ve çokgenlerden çembere, hatta elipse kadar birçok geometrik şeklin kolayca ve hızlı bir biçimde çizimini sağlar. Tüm bu şekiller istendiği kadar küçültülebilir, büyütülebilir, döndürülebilir veya herhangi bir kesiti görüntülenebilir. PAINT, kapalı yüzeyleri renkle doldurur; SCALE, şekil yüzeyini bölümlere ayırır; SCNCLR ekranı temizler.
Tam grafik komutları hem yüksek çözümlemeli, hem renkli modda çalışır. GRAPHIC komutuyla istenen grafik modu seçilebilir. Seçenekler, 40 karakterlik metin, yüksek çözümleme, metin pencereli yüksek çözümleme, renkli grafik, metin pencereli renkli grafik ve satır başına 80 karakterlik metin olmak üzere altı tanedir. Commodore firması, 80 karakter modunda mümkün olan, 640x200 noktalık bir çözümlemeden bahsetmekte. Fakat gerçekten iki katı çözünürlüklü bir grafik burada pek düşünülemiyor: 640 nokta, 80x8'in, yani 80 karakter kere karakter başına 8 noktanın (karakter matrisi 8 x 8) bir sonucu olarak ortaya çıkmakta. Test yaparken yararlanılan el kitabı, iki kat çözümlemeli grafik konusunda hiçbir şey söylemiyor. Denemeler sonucunda ortaya çıkan ise, GRAPHIC komutunun, biraz evvel sayılan altı parametreyle (seçenekle) çalıştığı. Diğer tüm denemeler “Illegal Error”
mesajı veriyor. Açıkça ifade etmek gerekirse, 640x200 nokta çözümlemeli gerçek bir grafik, C-128'de belli bazı trükler kullanılmadan gerçekleştirilemiyor. Özellikle BASIC 7.0'ın tüm grafik komutları C-64'ten tanıdığımız 320 x 200 nokta çözümlemesine (tabii ki tercihe göre 160x200 noktalık renkli moda) dayanıyor.
Bir başka dezavantaj: Tüm bu güzel grafikler, yaratıklar (sprites) ve 40 karakter metin, yalnızca bir kompozit (composite) monitörle kullanılabiliyor, bir RGBI monitörde sonuç alınamıyor. Öte yandan 80 karakter metin gösterimi yalnızca bir RGB monitörde (tabii monokromda da) mümkün. Afallamış olan kullanıcı, bir monitörünün eksik olduğunu şimdi fark ediyor. Böylece Commodore dünyada ilk kez iki monitörlü ev bilgisayarının patentini almayı garantilemiş oluyor. Fark ettiğiniz gibi, kompozit ve RGB monitörler arasında bir tercih yapmak değil, 40 karakter, grafik, yaratıklar için bir kompozit monitör ve 80 karakter için bir RGB veya siyah/beyaz monitör sahibi olmak gibi bir zorunluluk var. Burada Commodore, özel olarak C-128 için geliştirdiği 1902 monitörüyle imdada yetişiyor. Bu monitörde bir kompozit, bir de RGB giriş var. Monitörün önündeki ufak bir şalterle iki işletim türünden biri seçilebiliyor. Software ile gerçekleştirilebilecek bir seçim öngörülmemiş. Bu nedenle istenebilecek olan tek şey, şalterin yeterince sağlam olması; çünkü çok sık kullanılması gerekebiliyor. C-128'in grafiği için son olarak söylenebilecek şey, çözümleme açısından C-64'le konmuş olan standarda (320x200 nokta) karşılık geldiği ve C-16'da olduğu gibi BASIC'le desteklendiğidir. Figürler (Shapes), Yaratıklar (Sprites) ve Sprite-Editörü Grafikten bahsedildiği zaman, figürler ve Yaratıklar ihmal edilemez. Bu hareketli grafik nesneleri açısından C-128, C-64 hardware'inin ve C-16 software'inin iyi bir sentezi olarak tanımlanabilir. C-64'ten kaynaklananlar, hardware (VIC çipi) tarafından üretilen ve ekranda görüntülenen, programlanabilen, hareketli grafik nesneleri olan sekiz Yaratığı. Yaratıklar, 40 karakter modunda veya farklı grafik modlarında üretilebilir, fakat 80 karakter modunda bu mümkün değildir; çünkü bunları üreten VIC, RGBI yeteneğine sahip değildir.
Figürler, tamamen grafik elemanları oldukları için, ne 40 karakter modunda ne de 80 karakter modunda görüntülenebiliyor. Bunların görüntülenebildiği tek mod, grafik modu. Örneğin “SSHAPE A$, 100, 100, 150, 120” ile, üst sol köşesi (100, 100) ve alt sağ köşesi (150, 120) olan yüksek çözümlemeli bir dikdörtgenin içeriği, A$ zincir değişkenine yerleştirilir. “GSHAPE A$,X,Y” ile, A$'de bulunan grafik bilgisi yeniden X,Y grafik pozisyonunda ekrana getirilir. Grafik nesnelerin gösterimi açısından bu figürler, Yaratıkların yanısıra, ikinci, verimli bir olanak oluşturuyorlar. Ayrıca C-128'in yüksek bellek kapasitesiyle bağlantılı olarak, yüksek çözümlemeli oyunlar için de yeni olanaklar sunuyorlar.
Entegre Edilmiş
Sprite Editörü
BASIC 7.0, istenen Yaratığın nokta tasarımını doğrudan ekran-
Software düzeyinde üretilebilen figürlerin (shapes) taslağı C-16'nın BASIC 3.5'inden alındı. Bunlar, zincir değişkenlerine saklanabilen ve buradan alınarak yine ekrana getirilebilen yüksek çözümlemeli veya renkli dört köşeli kesitler. Figür yaratma olanağı veren entegre bir sprite editörü içeriyor. SPRITE komutuyla, her Yaratık için şu karakteristikler verilebilmekte: Hareket, renk, öncelik, X ve Y yönünde genişleme ve mod (yüksek çözümleme veya renkli).
Örneğin, “SPRITE 4,41,6,1,1,0,0“ ile 4 no.lu Yaratık harekete geçirilir (4). Yaratık yeşil renkte görüntülenir (1), daha önce verilmiş olan ekran verilerine göre önceliği vardır (4), X yönünde genişlemiştir (1). Y yönünde genişlememiştir (0) ve yüksek çözümleme modunda görüntülenmektedir (0). Bunun tersine, daha önceden tanımlanmış bir Yaratığın karakteristiklerini belirlemek için, RSPRITE fonksiyonu kullanılabilir. SPRSAV komutuyla, bir Yaratığın dataları bir zincir değişkenine yerleştirilebilir veya tersine, bir zincirden okunabilir. Yaratığın yönetilmesi, bir Yaratığı ekranın belirli bir noktasına yerleştirmeye yarayan MOVESPR komutlarıyla gerçekleşir. Ekrandaki konum mutlak koordinatlar olarak verilebildiği gibi, daha önceki bir konuma göreceli olarak da verilebilir. Bundan başka, 1 ila 15 arasında bir sayı değeri olarak bir hız verildiğinde, Yaratık otomatik olarak verilen yeni konuma kayar. Koordinat verilerinin önüne artı veya eksi işareti konularak, mutlak koordinatlar göreli koordinatlara dönüştürülür. Belirli bir hız verilmediği takdirde, Yaratık hemen yeni yerinde belirir. “MOVESPR 7, -30, -40” 7. Yaratığı anında 30 nokta sola ve 40 nokta yukarı aktarır. C-64'te PEEK yapılarak, VIC'in çarpışma registerinde bir Yaratığın diğer bir Yaratıkla veya fon verileriyle çarpışıp çarpışmadığı saptanır. Bir Yaratık/Yaratık veya Yaratık/Fon çarpışması durumunda, bu komutla programın otomatik olarak kesilmesi programlanabilir. Örneğin “COLLISION 1,500“ün anlamı şudur: Programın akışı sırasında bir Yaratık/Yaratık çarpışması gerçekleşirse (1), BASIC programı kesilir ve 500. satırdan itibaren sürdürülür. RETURN'dan sonra program kesildiği noktadan devam eder. COLLISION ve bir BASIC programının yükünü Yaratık yönetimi açısından oldukça hafifleten son derece yararlı komutlardır. Bir Yaratığı ekranda çapraz hareket ettirmek için, C-64'te bir FOR...NEXT döngüsüyle çalışılması gerekir; bunun yanısıra çarpışmaları belirlemek için VIC'in çarpışma registerinde sürekli olarak PEEK yapmak gereklidir. C-128'de ise interrupt yönetimli çalışan iki komut yeterlidir. Bunlar sayesinde BASIC programı, Yaratıkların hareketi sırasında çalışmaya devam eder, fakat herhangi bir Yaratık çarpışması durumunda hızlı biçimde reaksiyon göstermek için otomatik olarak kesilir.
Müzikal BASIC
Benzer bir konfor da, C-64'ten alınmış olan synihesizer elemanı SID'ın programlanmasında görülüyor. Artık tüm müzik parametrelerinin DATA yığınları halinde SID'e POKE edilmesi gerekmiyor; bu iş için kolay anlaşılabilir bazı BASIC komutlarının kullanılması yeterli. Örneğin VOL komutu, sesin yüksekliğini ayarlıyor; SOUND komutu ile ses üreteçlerinden biri harekete geçiriliyor. Bu arada karşılık gelen parametreler aracılığıyla yalnızca frekansı değil, sesin süresini ve hatta yükselme ve sönmesini de belirlemek mümkün. Her ENVELOPE komutu ile, müzik enstrümanlarına ilişkin olası on ses eğrisinden biri tanımlanır. Darbe genişliği ve dalga türünün yanısıra attack, decay, sustain ve release (Yükselme, düşme, durma ve kaybolma) de aynı şekilde belirlenir. Olası on eğrinin her bi- Ti, başka bir ENVELOPE komutuyla aynı numaraya yeni bir eğri tanımlanıncaya kadar bellekte saklanır. C-128 açıldığı anda on eğrinin tümü, farklı enstrümanların ses yapısıyla birlikte önceden tanımlanmiş olarak hazır durumdadır: Piyano, akordeon, sirk orgu, davul, flüt, gitar, klavsen, org, ttompet ve ksilofon. Bunların yanısıra, müziğe yeni başlayanlar için bir sürü kullanılabilir ses efekti de bulunmaktadır. FİLTER komutuyla, SID'in ses yabancılaştırmaya yönelik tüm filtre olanakları kullanılabilir. PLAY komutu, zincirlerde saklanmış durumda olan noktaların otomatik olarak çalınmasını sağlar. Parametre olarak verilmiş olan zincirlerde, çalınacak notalar başta olmak üzere, eğri, oktav, volüm, ton kanallı ve filtre hakkında bilgiler içerilebilir. Notalar, adları verilerek (A,B,C,D,E.F,G) kolayca seçilebilir. Tabii, tek tek notalar, yarım nota indirilebilir veya yükseltilebilir. Ayrıca tam, yarım, dörtlük, sekizlik ve onaltılık notalar (istenirse her biri noktalı olarak da) yaratılabilir.
Kuyruk Kullanarak
Müzik PLAY komutu da interruptla kullanılabilir. Bunun anlamı, çalınacak notaların bir ses kuyruğuna, yani reserve edilmiş bir bellek alanına yerleştirilmesidir. İnterrupt (kesme) sırasında, işletim sistemi, ses verilerinin kuyrukta bekleyip beklemediğini tespit eder. Eğer böyleyse, ilk değer kuyruktan alınır ve çalınmak üzere synthesizer çipine (SID) aktarılır. Kuyrukta bekleyen diğer ses verileri birer sıra öne kayarlar. Sonraki kesmelerin her birinde, öngörülmüş ses süresinin dolup dolmadığı denetlenir. Eğer dolduysa, yeniden beklemekte olan ses verilerine dönülür ve bu oyun böylece sürer.
Daha önce de belirtildiği gibi, bu olayın tümü sistem interrupt'ı sırasında gerçekleşir. BASIC'in kendisi buna ilişkin hiçbir şeyin “farkına varmaz”. Onun tek yaptığı, kuyrukta daha boş yer olup olmadığını belirlemektir. Boş yer olması durumunda daha başka ses verileri de eklenebilir ve müzik otomatik olarak çalınırken program normal akışına devam eder. Ancak çalınacak ses sayısı çok fazlaysa, program durmak ve kuyrukta boş yer açılmasını beklemek zorundadır.
Çok kullanışlı ve verimli BASIC'inin varlığına rağmen, C-128'de de makine düzeyine erişmeyi gerektiren durumlar olabilir. Bunun için 128'de POKE, PEEK ve SYS kullanmak gerekmez. Bank-Switching ile açılıp kapatılabilen farkli bellek alanlarının varlığı, çoğu zaman, POKE, PEEK ve SYS komutlarının hangi bellek bankına git- Mesi gerektiği sorununu ortaya çıkarmakta. C-128 bu sorunu şayet basit bir yoldan çözüyor: BANK
63 komutuyla, istenen bellek bankı seçilebilir. Bu yolla tabii ki gerçek bir Bank-Switching gerçekleşmiyor (bir BASIC programı çalışmak: teyken, Basic çeviricinin daima açık olması gerekiyor), yalnızco BASIC, örneğin hangi bellek ban: kına bir POKE değerinin yerleştirilmesi ya da PEEK için verilerin han: gi bankdan kaynaklanması gerektiğini farkediyor.
Makine Diliyle Bağlantı
Bu yolla isteğe bağlı olarak programa veya değişken belleğine POKE veya PEEK yapılabilir. İşletim sistemi ve BASIC 7.0 rutin: leri, “BANK 15“ten sonra SYS ile çağrılabilir. Bunun yanısıra, BASIC'ten yana, Bank 1 (Basic-çalışma belleği) ile diğer bellek bankları arasında oradan oraya yükleme yapabilme olanağı da vardır. Bunu layan komutlar, FETCH, STASH ve SWAP'tır. “Örneğin FETCH “2000, 50000, 4,35000“ şeklinde bir komut, 35000 adresinden itibaren 2000 Byte'ı bank 4'ten alır ve bu: nu 50000 adresinden itibaren BA-SIC çalışma belleğine (daima bank 1) yerleştirir. STASH, FETCH'- in tersi fonksiyona sahiptir: Belli bir sayıda Byte çalışma belleğinden alınarak diğer bir bellek bankına aktarılır. SWAP komutu, verilen bellek alanlarının iki bank arasında değiş tokuşunu sağlar. Bu üç komut, esas olarak bellek genişletmelerinin (RAM-Floopy) eklenmesi için düşünülmüştür. Bu yöntemle, bellekte 64 KByte'- ın iki katı kaplayan veri miktarları, bir Floopy ile hiçbir zaman erişilemeyecek bir hızla yönetilebil-
Monte Edilmiş
Makine Dili-Monitör
BASIC 7.0'ın sağladığı olanaklarla yetinmeyenler, MONİTOR komutuyla Basic'i terkederek ROM'- da bulunan dili monitör programına geçebilirler. C-16-Tedmon'dan yararlanılarak geliştirilmiş olan bu monitör programı, belleğin dökümü ve açıklanmasına yarayan alışılmış fonksiyonların ve bir disassemb-
Basic 7.0 ile Eklenen Komutlar
APPEND Veri eklemek için sıralı bir kütüğü açar. AUTO Otomatik olarak satır numarası verir. BACKUP Bir disketin tümünü kopyalar. BANK PEEK, POKE ve SYS için bellek bankını (bellek bölümünü) seçer. BEGİN...BEND Birden fazla Basic satırını tek bir öbek halinde kapsar.
BOOT CPİM'i disketten yükler ve başlatır. BOX Dikdörtgenler çizer. BSAVE İstenen bellek alanlarını diskete saklar. BUMP Yaratık çarpışmalarında Yaratık numarasını verir. CATALOG Disketin içerik listesini verir. CHAR Yüksek çözümlemeli grafiğin içine metin girilmesini sağlar. CİRCLE Daireler, elipsler ve çokgenler çizer. COLLECT Açık kütükleri siler ve disketi yeniden organize eder. COLLİSİON çarpışmasını belirler. COLOR Metin ve grafik için renk verir. CONCAT İki sıralı kütüğü birbiriyle birleştirir. COPY Bir disket kütüğünü kopya eder. DLEAR Disket ünitesine giden bütün kanalları kapatır. DCLOSE Disket ünitesine giden bütün kanalı kapatır. DEC On altı tabanlı bir sayının on tabanlı değeri. DELETE Programdan bir satır alanını siler. DİRECTORY Disket içeriğinin listesini verir (aynen CATALOG gibi). DLOAD Disketten bir program yükler. DOPEN Disket ünitesine kanal açar. DO...LCOP — Program döngüsü. LOOP daima DO'ya geri atlar. DRAW Noktalar koyar ve çizgiler çizer. DSAVE Bir programı diskette saklar. DS Disket sürücüsünün hatta durumunu belirtir. DS$ Floopy'nin hata durumunu açık metin olarak içerir. DVERİFY Diskte prorgm saklanmasını denetler. EL Bir hatanın ortaya çıkması durumunda satır numarasını içerir. ELSE Koşul yerine gelmediği takdirde, IF....THEN'de alternatif. ENVELOPE Synthesizer için eğriyi tanımlar. ER Ortaya çıkmış son hatanın kodunun verir. ERR$ Hata mesajını açık metin olarak verir. EXİT Bir DO...LOOP döngüsünün terkedilmesine yarar. FAST İki katı hız başlatır (2 MHz) FETCH İstenen bellek bankasından (RAM-Floopy) veri alır. FİLTER SİD için ses filtresi parametresini koyar. GETKEY Bir karakterin girilmesini bekler. GO64 C-64 moduna geçilmesini sağlar. GRAPHIC Grafik modunu seçer. GSHAPE Bir zincirden bir figürü (shape) alır ve ekrana yazar. HAEDER Disketlerin formatlanmasında kullanılır. HELP Hata mesajından sonra hatanın bulunduğu satırı ekranda verir. HEX$ Ondalık sayıları on altı tabanlı zincirlere dönüştürür. İNSIR Bir zincir içindeki bir zincir parçasının pozisyonunu bildirir. JOY Joystick'in pozisyonunu denetler. KEY Fonksiyon fuşlarının doldurulmasını sağlar. LOCATE Grafik imlecini komunlandırır. MID$ Zincir parçalarına değer verilmesini de mümkün kılar. MONİTOR ROM'da bulunan makine dili monitör programını çağırır. MOVESPR Bir yaratığı ekranda hareket ettirir. PAİNT Yüksek çözümlemeli grafiğin bir alanını doldurur. PEN işık kalemini denetler. PLAY Bir zincire yerleştirilmiş bir nota dizisini çalar. POİNTER Bellekteki bir bir değişkenin adresini verir. POT Paddle'i denetler. PRİNT USİNG Formatlanmış sayı çıkışını sağlar. PUDEF PRİNT USİNG için yönetim karakterlerini tanımlar. RCLR Metin ve grafik için seçilen renk kodunu verir.
aaa
RECORD Rastgele kütüklerde okuma ve yazma göstergesini > konumlandırır. ler'in yanısıra, makine program- RENAME Disket kütüklerinin adlarının değiştirilmesini sağlar. larının kolayca girilmesine yara- RENUMBER Basic programını yeniden numaralandırır. yarı küçük bir assembler'e de sa- RESTORE İstenen satır numarasına DATA göstergesi koyar. hip. RESUME Bir hata düzeltme rutininden geri dönüş. Bu monitör programı, alışılmış RGR Kullanılan grafik modunun numarasını verir. dört haneli onaltılık adres girişi ye- RREG İşlemci registerinin değerlerini değişkenlere verir. rine, beş haneli giriş istiyor: RSPRCOLOR için renkli modun güncel kodunu verir. İk hane, bellek RSPPOS Bir yaratığın konumunu ve hızını verir. | idi. RSPRİTE Parametreye göre tüm Yaratık karakteristiklerini verir. dan hangisinin seçilmesi gerekti RWİNDOW Oluşturulan ekran penceresinin parametresini verir. ğini gösteriyor. C-128'in temel ver SCALE Yüksek çözümlemeli grafikte ölçü seçimini siyonunda, tabii ki 16 bankın ti gerçekleştirir. mü işgal edilmiş değil; bazıları SCNCLR Metin- veya grafik ekranını siler. ROM modülleri, bazıları da RAM SCRATCH Bir disket kütüğünü siler. floopy için ayrılmış durumda, SSHAPE Bir figürü bir zincir değişkeninde saklar. Basic'e geri dönüş X komutuy- BOY Baştan çan bir süre kadar durdurur. h iz'den iz hızına geri döndürür. Konforlu SOUND İstenen frekans ve uzuklukta ses efektleri üretir. bir Basic programlamasından sı- SPRCOLOR Ya iratıklar için renkli mod renkleri verir. kılan ve POKE'lar ve DATA'larla SPRDEF Entegre edilmiş sprite-edifor'u çağırır. uğraşmak isteyenler için her du- SPRİTE Yaratık karakteristiklerini verir. TuMda C-64 Modu emre amade: SPRSAV Bir Yaratığı zincirde saklar veya tam tersi. 60.64. O STASH Verileri bir bellek bankına (RAM-Floopy) aktarır. SWAP İki bellek bankı arasında verileri değiş toğuş eder. 64'er dergisinden çeviren TEMPO Play komutu için çalınma temposunu verir. Balaban TOZAN TRAP Bir hata durumunda bir hata düzeltme rutinine dallama yapar. TROFF Program akış takibini (Trace) kapatır. TRON Trace'yi açar. Ne DO...LOOP için koşul belirler (DO UNTLL ...) Tablo 1. BASIC 2.0'ın VOL SOUND komutu için ses yüksekliğini (volüm) belirler. (C-64 ve VC:20) komutları WHİLE DO...LOOP için koşul belirler (DO WHİLE ...) verilmemiştir. fakat hepsi WIDTH Tüm grafik komutları için çizgi kalınlığını verir. BASIC 7.0'a entegre durumdadır. WINDOW Bir ekran penceresi tanımlar. XOR İki değerin dışlama veya eklemlenmesini sağlar.