Bu sayfadaki yazılar
Sayfanın metni
Sayfa 7
310-320: Aynı işlemleri bu yazı için de yap.
330 : Obje dosyasını kapa.
340 : Obje üretimini durdur.
Bu programın ürettiği obje koduna monitör ile bir göz attığımızda ve SYS 49152 ile elde ettiğimiz sonuca bakınca, işlemlerin doğru yapıldığını görüyoruz (ve hiç şaşırmıyoruz, değil mi?..).
SUPER ASSEMBLER'ın çalışmasıyla ilgili bir iki küçük not daha. Programın içinde bir byte değerinin yer alması gereken bir yere tek bir harfi "X" şeklinde koyabilirsiniz. Örneğin, LDA #"A" ile, "A" harfinin ASCII kodu akümülatöre yüklenmiş olur. Obje kodu üretimi bitince, geçen süre dakika:saniye:1/10saniye formatında belirtilecektir. Ayrıca, programın ilk ve son byte'larının yerleştiği adresler de gösterilecektir.
Bu kadar iyi bir assemblerin yazımının da rahat olması gerekir, değil mi? İşte bu nedenle, bir sürü de editör komutu hazır edilmiştir, siz kullanın diye. Sıra geldi onlara.
Tüm editör komutları, / (bölü) işareti ile başlar. Her biri tek bir harf ve gerekli sayıda parametre içerir. Her satırda sadece bir tek editör komutu kullanılabilir. İki nokta üstüste ile birbirlerinden ayrılmazlar. Basic editörünün özellikleri aynen korunmuş, yeni komutlar eklenmiştir. Hepsi de, tabii ki, direkt modda kullanılır, programların içinde hataya yol açarlar.
/A sayı1,sayı2
Otomatik satır numarası üretir. Örneğin /A 100,10 komutundan sonra bilgisayar, 100 numaralı satırdan başlayıp, 10'ar artırarak satır numaralarını yaratacaktır. Hatta, yazılmasını unutulabilen eksi işareti de kendiliğinden yazılacaktır. Eğer satır üretiminin durmasını isterseniz, o satıra herhangi bir şey yazmadan RETURN tuşuna basınız. Bir uyarımız olacak... Diyelim ki 150'nci satırı yazarken 130'uncu satırda bir hata gördünüz. Sakın cursor'u o satıra çıkarıp düzeltme yapmayın. Önce yazdığınız satırı bitirin, sonra ortaya çıkan 170'den sonra hemen RETURN'a basıp satır üretimini durdurun, ondan sonra düzeltme yapın.
/O
NEW ile sildiğiniz programı yeniden geri getirir. Tabii ki, NEW komutundan sonra hiçbir satır yazmamış olmanız şartıyla.
/D satır1-satır2
Satır1 ile satır2 arasında kalan satırlar (kendileri dahil) silinir. Satır numaraları, LIST komutunda olduğu gibi değişik şekiller de verilebilir. Örnekler:
/D 1000
/D 1000-2000
/D -2000
/D 1000-
/E satır1-satır2
Belirtilen bölge, formatlanmış bir şekilde ekrana getirilir. Artık istediğiniz değişikliği yapabilirsiniz. Sakın LIST yapıp programınızı düzeltmeye kalkışmayın, programınız size güme gider. Örnekler:
/E
/E 1000
/E 1000-2000
/E -2000
/E 1000-
/Tn,kolon
.DP komutu gibi, formatlı dökümde kullanılan kolonları belirler. 'n' yerine 0-3 arası bir sayı gelecektir.
/X
Bilgisayar, açılış durumuna döner.
/P no,satır1,satır2
Programınızı, 30 değişik sayfaya bölebilirsiniz. Bu, daha sonraki işlemlerinizde işinize yarayacaktır. 'no' yerine 1-30 arası bir sayı koyabilirsiniz. Örneğin /P1,100,200 komutu ile, 100-200 arası satırları birinci sayfa olarak nitelediğinizi belirtiyorsunuz.
/no
Belirtilen numaralı sayfayı oluşturan satırlar formatlı olarak listelenir.
/N no, satır no,artış
Belirtilen sayfanın satır numaraları, verilen satırdan başlamak ve artış aralıklarına göre artmak üzere yeniden ayarlanır.
/F no,"text"
Belirtilen sayfada, verilen "text"i içeren her satır formatlı olarak basılır. "text" içinde bilinmeyen karakterler varsa bunların yerine soru işareti konulabilir. Örneğin, /F1,"T??T" komutu ile, birinci sayfadaki TEXT, TILT, TARTI gibi arasında iki herhangi harf olan iki T'ye sahip her satır listelenir.
/R no,"text1",text2"
Belirtilen sayfadaki tüm "text2"ler "text1" ile değiştirilir. "text2"nin içinde soru işaretleri olabilir. "text1" boş ise, "text2"ler silinir.
/U adres
Normalde programı kodunuz, 8152 ($1FD8) adresinden başlar. Ancak bu adresi daha yukarı çıkarabilirsiniz. Böylece arada kalan boş alanı makine dili programları için kullanabilirsiniz.
/B
Hafızanın o anki durumunu gösterir. Sırasıyla program başlangıcının alabileceği en küçük adres değeri (8152), o anki gerçek program başlangıç adresi, o anki program bitiş adresi ve geri kalan boş byte sayısı bildirilir.
/L"isim"
LOAD ile aynı işi yapar.
/S"isim"
SAVE ile aynı işi yapar.
/V"isim"
VERIFY ile aynı işi yapar.
/M"isim"
MERGE ile aynı işi yapar. Adı verilen dosyayı, hafızadaki programa ekler.
/G no
Kayıt aracının numarasını değiştirir. Normalde 8'dir.
/I
Disketinizin içeriğini (directory) görmenizi sağlar.
/K
Disk drive'ın hata mesajını okuyup ekrana yazar.
/@ komut
Disk drive'a komut gönderir. Örneğin bir dosyayı silmek için:
/@s: dosya adı
Komutlar için 1541'in el kitabına bakın.
/CH renk
Ekran rengini ayarlar.
/CR renk
Çerçeve rengini ayarlar.
/I
Obje kodu üretildikten sonra, kullanılan label'lerin listesini verir.
/II
/I gibidir, ancak listeyi alfabetik sırada verir.
Bir kez daha uyaralım... Her satırın eksi işareti ile başlaması gerekiyor. Eğer bir satır /D ile değil de, Basic'te-
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 6
ile döngü içinde, aşağıdaki komutları kullanarak aynı komutun 50 kere objeye çevrilmesini sağlayabilirsiniz.
ON şart,satır no
Eğer belirtilen şart doğru ise obje kodu üretimi devam edecektir. Eğer yanlışsa, üretim verilen satır numarasından devam edecektir. Örneğin:
Hem s'in değeri 0 hem de g'nin değeri 5 olduğu için, obje kodu üretimi 40'tan devam edecek ve 50 satırda duracaktır. s'in içinde de 3 olacaktır. Eğer 20'nci satırda s=10 yaparsak, obje kodu 30'uncu satırda 60 numaralı satıra atlayacak ve s=2 olacaktır.
.GO satır-no
Herhangi bir şarta bağlı olmaksızın, obje kodu üretimi, verilen satırdan devam eder.
.IF .EL .EI
IF...THEN...ELSE...ENDIF yapısını oluştururlar. Bir örnekle görelim:
s ve f değerine göre, verilen şart yanlış olduğu için .EL ile .EI arasındaki bölüm objeye çevrilir ve PEEK(2) ile elde edeceğimiz sonuç 2 olur.
Tabii ki, .EL komutunu kullanma zorunluluğu yok. Sadece .IF ve .EI kullanılabilir. Bu durumda arada kalan satırlar, sadece şart doğru ise objeye çevrilir.
Makro Tanımlama
Sıra geldi makrolara... Bunları bir alt program gibi görebiliriz. Makine dili programcılığında çok kullanılan kalıplar vardır. Veya bir programın içinde aynı tür bir algoritmaya bir iki sayı farkıyla tekrarlanıp duruyordur. İşte bu tür bir program parçası sadece bir kez makro halinde tanımlanır ve bir isim verilir. İçinde geçen bazı değişkenlerin parametrik olması da sağlanır. Artık ana programda sadece makronun adı ve o sırada kullanılması gereken değişkenler yazılır ve SUPER ASSEMBLER bunları kullanarak gereken program parçasını kendiliğinden yaratır.
Bir makronun genel görünümü şu şekildedir:
Ana program içinde çağırırken de şu şekil kullanılır:
Şimdi bunları ayrıntısıyla görelim:
.MA isim (parametre1,parametre2....)
Tanımlanacak makronun adı ve kullanacağı parametrelerin isimleri verilmektedir. Bu isimler global tanımlanmış değişkenlerle aynı olamaz. Bu satırdan sonra gelen (.RT'den önceki satırlarda) kullanılan değişkenler, aksi şekilde tanımlanmadığı sürece yereldir.
Bir makronun içinde şartlı assemble yapabilir, bir başka makroyu çağırabilir, hatta işinize yarayacaksa kendisini de çağırabilirsiniz.
.RT
Makro tanımlamasının bittiğini belirtir. Bu satırda bir label olamaz!
... isim (parametre1,parametre2....)
Verilen isimdeki makro tanımında yeralan tüm parametreler, verilen parametrelerle değiştirilir ve ortaya çıkan assembler kodu ... (üç tane yanyana konmuş nokta) komutunun olduğu satırdaymışçasına objeye çevrilir. ... komutunu yeni bir makine dili komutu gibi düşünebilirsiniz. Gerçekten de, aslında bir assembler komutu değildir ve üç harfli makine dili komutları gibi işlem görür. .MA komutundan sonra sadece parametre isimlerini kullanabiliyorduk. Ancak ... komutunda, parametre yerlerine sayı, değişken, label adı veya matematiksel terim konabilir.
Örnek Program
Gördüğümüz assembler komutlarının çoğunu kullanan örnek programımıza biraz göz atalım:
5 : Tüm programın listesi, 1 numaralı kanaldan ekrana gönderilecek.
6 : Obje kodu, "OBJ.DENEME" adı altında diskette yaratılacak.
7 : En sonda label tablosu, 2 numaralı kanaldan ekrana gönderilecek.
10 : Programın başlangıç adresi $C000(49152). Yani SYS 49152 ile çalışacak.
20 : Boşluk tuşunun ASCII kodu global bir değişkene yükleniyor.
70 : ROM'da yer alan ve akümülatör ile Y-yazmacının gösterdiği adresten başlayan yazıyı o an açık olan yazım aracına gönderen rutinin başlangıç adresi bir değişkene yükleniyor.
80 : ROM'da yer alan ve akümülatörde bulunan ASCII kodunu o an açık olan yazım aracına gönderen rutinin başlangıç adresi bir değişkene yükleniyor.
90 : BAS isimli bir makro tanımlamaya başlıyoruz. İlk parametre basılacak yazının başlangıç adresi, ikincisi ise kaç kere basılacağı. Makromuz, belirtilen yazıyı istendiği kadar basacak ve bu arada da her satırda bir kolon daha içeriden başlayacak.
100 : Basılan satırları sayaç sıfırlanıyor.
110 : Basılan boşlukları sayaç sıfırlanıyor.
120 : Boşluk kodu akümülatöre yükleniyor.
130 : Eğer yeteri kadar boşluk basılmışsa...
140 : 200'üncü satırdan devam et.
150 : Basılmamışsa...
160 : Boşluk bas ve...
170 : Boşluk sayacını bir arttır...
180 : Ve IF komutunu burada bitir.
190 : Kod üretimine 130'uncu satırdan tekrar başla.
200 : Akümülatöre yazının başlangıç adresinin küçük byte'ını yükle.
210 : Y-yazmacına yazının başlangıç adresinin büyük byte'ını yükle.
220 : Ve baskıya gönder.
230 : Satır sayacını bir arttır.
240 : Eğer yeteri kadar basılmamışsa, 110'a geri dön.
250 : Makro tanımı bitti.
260 : YAZI1 label'inin gösterdiği yazıyı üç kere bas.
270 : YAZI2 label'inin gösterdiği yazıyı dört kere bas.
280 : Geri dön.
290 : Verilen yazının ASCII kodlarını RTS'nin kodundan sonraya yerleştir.
300 : Kaldığın yere 13 ve 0 byte'larını koy (RETURN'ün kodu ve yazının bittiğini belirten kod).