Merhaba Amiga’da assembly dilini kullanarak kod yazmak için kullanabileceğiniz pek çok assembler vardır. Bunların en tanınmış olanları Master Seka, Trash’m One, PhxAss, AsmOne ve AsmPro’dur. Bunlar dışında Aminet’te pek çok güzel derleyici bulabilirsiniz.
Bu yazımızda AsmPro ve AsmOne’yu nasıl kullanacağımızı öğreneceğiz. Bu iki program birbirinden bağımsız olsalar da özellikleri çok benzerdir.
Size tavsiyem artık Master Seka ve Trash’m One kullanmamanızdır. Çok uzun yıllardır geliştirilmiyorlar ve özellikle yeni sistemlerde problemlidirler. AsmPro’nun AsmOne’a göre en önemli avantajı ise grafik kartlı amigalarda, grafik kartının ekran modlarını kullanabilmesidir. Ancak AsmOne’ın son versiyonlarında bu özellik de eklendi.
PhxAss ise çok kaliteli ve güncel olmasına karşın bir IDE’ye sahip değildir. Elbette CED ya da GoldEd gibi bir text editörü ile kullanabilirsiniz. Ancak yine de bir debugger kullanmanız gerekir. Bu konuda da Barfly’ı tavsiye ederim.
Yazının geri kalanını AsmOne üzerinden anlatmaya devam edeceğim, çok büyük ölçüde AsmPro için de aynı olacaktır.
AsmOne bir; Editör, Assembler, Debugger ve Monitör programıdır. Yani kodlarınızı yazabilir, derleyebilir, satır satır çalıştırarak ya da breakpoint koyarak debug edebilirsiniz. Ayrıca hafızanın herhangi bir bölümünü görüntüleyebilir ve disassemble edebilirsiniz. AsmOne ile aynı anda 10 farklı kaynak dosyası üzerinde çalışabilir ve bunları bir proje olarak kaydedebilirsiniz.
AsmOne ile çalışırken kullanabileceğiniz 2 yöntem vardır. Bunlardan biri programın menülerini kullanmak diğeri ise (kendi dokümanında DLC = Direct Line Command olarak isimlendirdiği) çoğunlukla tek karakterlik komutları komut satırına yazarak kullanabilirsiniz.
Dilerseniz önce komut satırından verilen komutların genel bir listesine bakalım:
Komutların bazıları parametre almazken bazıları birden fazla parametre alır, o durumda karşınıza prompt çıkacaktır. O komutlar için parametre bölümünde “?” göreceksiniz.
|
Komut |
Parametre |
Açıklama |
|
! |
- |
Çık/İlk ekrana dön |
|
!! |
- |
Hemen çık |
|
# |
- |
Hakkında penceresi |
|
= |
- |
Hafıza kullanım bilgisi |
|
=C |
- |
Program renklerini değiştir |
|
=F |
- |
Font'u değiştir |
|
=M |
- |
Projeye hafıza ekle |
|
=P |
- |
Proje bilgisi |
|
=R |
- |
Register bilgisi |
|
=S |
- |
Sembol listesi (label vs.) |
|
> |
dosya ismi |
Çıktıyı dosyaya yönlendir |
|
? |
value |
Hex/Ascii/Bin çevirici |
|
[ |
value |
Ondalıklı işlem |
|
@A |
adres/label |
Hafıza editleme |
|
@B |
adres/label |
Hafızayı binary göster |
|
@D |
adres/label |
Hafızayı disassemble et |
|
@H |
adres/label |
Hafızayı hexadecimal listele |
|
@N |
adres/label |
Hafızayı ascii listele |
|
A |
- |
Kodu derle |
|
AC |
- |
Kodu test et |
|
AD |
- |
Derle ve debugger aç |
|
AO |
- |
Assemble ve optimize et |
|
B |
- |
Son satıra git (Editörü açar) |
|
C |
? |
Hafızanın bir bölümünü kopyala |
|
CC |
sürücü |
Disketin Checksum'ını hesapla |
|
CS |
? |
Sinüs tablosu oluştur |
|
D |
- |
Disassembler'ı aç |
|
E |
dosya ismi |
Harici dosya yükle |
|
EL |
? |
Tüm labelların başına/sonuna verilen ifadeyi ekle |
|
F |
? |
Hafızayı doldur |
|
G |
Adrese git (Go) |
|
|
H |
adres/label |
Monitere geç (hexadecimal) |
|
I |
dosya ismi |
Dosyayı araya sok (Insert) |
|
IB |
? |
Hafızayı binary olarak araya sok |
|
ID |
? |
Hafızayı disassembly ederek araya sok |
|
IH |
? |
Hafızayı hex olarak araya sok |
|
IN |
? |
Hafızayı ascii olarak araya sok |
|
IS |
? |
Sinüs tablosu sok |
|
J |
adres |
Adrese git (Jump) |
|
K |
adım sayısı |
Adım adım çalıştır |
|
L |
ifade |
Verilen yazıyı bul |
|
M |
- |
Monitör'e geç |
|
N |
- |
Monitör'e geç (Ascii) |
|
O |
- |
Silinmiş kodu geri getir (Old) |
|
P |
satır sayısı |
Yazdır (bulunduğu pozisyondan) |
|
PS |
? |
Debug işlemi için parametre |
|
Q |
? |
İki hafıza bölümünü karşılaştır |
|
R |
dosya ismi |
Dosya aç |
|
RB |
dosya ismi |
Binary dosya aç |
|
RE |
dosya ismi |
Proje aç |
|
RO |
dosya ismi |
Obje (exe) dosyası aç |
|
RS |
sürücü, ? |
Disketten sektör oku |
|
RT |
sürücü, ? |
Disketten track oku |
|
S |
? |
Hafızada bul |
|
T |
- |
İlk satıra git (Editörü aç) |
|
U |
- |
Dosyayı güncelle |
|
UA |
- |
Tüm dosyaları güncelle |
|
V |
klasör |
Klasörü listeler (Dir) |
|
W |
dosya ismi |
Dosyaya yaz |
|
WB |
dosya ismi |
Binary dosya yaz |
|
WE |
dosya ismi |
Projeyi kaydet (Tüm açık dosyaları) |
|
WL |
dosya ismi |
Link dosyası kaydet |
|
WN |
dosya ismi |
Kodu ascii olarak |
|
WO |
dosya ismi |
Obje (exe) oluştur |
|
WP |
- |
Ayarları kaydet |
|
WS |
? |
Sektör yaz |
|
WT |
? |
Track yaz |
|
X |
-/register |
Registerları listele |
|
Y |
komut |
DOS komutu çalıştır |
|
ZA |
- |
Derlemede kullanılan hafızayı serbest bırak |
|
ZB |
- |
Breakpoint’leri temizle |
|
ZF |
Dosyayı sil (disketten) |
|
|
ZI |
- |
Include’ları temizle, derleme işleminde tekrar yüklenirler |
|
ZS |
- |
Üzerinde çalışılan dosyayı sil |
|
CD |
klasör adı |
Klasör yarat |
Bu listedeki pek çok komut yazılıp enter’a basıldıktan sonra parametrelerini almaktadır, bu komutların parametrelerini “?” ile gösterdim. Örneğin;
> C
> BEG> $00234500
> END> $00302500
AsmOne’ın menülerinden ulaşabileceğiniz tüm komutlar aslında prompt’tan ulaştıklarınızın aynısıdır. Bu nedenle tekrar açıklamalarını yapmaya gerek görmüyorum. Tüm menü seçeneklerinin yanında o işlemi gerçekleştirmek için kullanabileceğiniz komutu görebilirsiniz. Editör ve Debugger içindeki menü seçenekleri de isimlerinden kolayca anlaşılabilecek seçeneklerdir. Editörde blok komutları, kod içinde belirli satırlara atlama; Debugger’da ise breakpoint ve watch ekleme, satır satır çalıştırma gibi özellikler vardır.
AsmOne/Pro ayarları iki bölümdedir: Assembler Preferences ve Environment Preferences.
Assembler Preferences, derleme işlemi ile ilgili ayarlardır;
|
Rescue |
Kaynak kodunuzun ZS ile silindikten sonra O (Old) komutu ile geri alınabilmesini sağlar. |
|
Level 7 |
AsmOne Level 7 interrupt kullanır. |
|
NumLock |
Açık olması durumunda nümerik klavyeyi yön tuşları olarak kullanabilirsiniz. |
|
Auto Alloc |
Section’lar için hafıza ayırma işlemini otomatik yapar. |
|
Debug |
Debugger geçmeden önce kodun otomatik derlenip derlenmeyeceğini belirler. |
|
List File |
Derleme işlemi sırasında kod listesini gösterir; satır numaraları, label’lar vb. |
|
Paging |
Listelemeyi sayfa sayfa yapar. |
|
All Errors |
Hata ile karşılaşıldığında derleme işlemi devam eder. Birçok hatayı aynı anda görmek için kullanabilirsiniz. |
|
Progress Indicator |
Derleme işleminde progress gösterir. |
|
Progress By Line |
Derlenmekte olan satırı gösterir. |
|
DS Clear |
DS ile ayrılan bloğun temizlenmesini sağlar. Normalde bu alan herhangi bir değer ile doldurulmaz. Derlenmiş programda temizlenmeyeceğini unutmayın. |
|
Label : |
Label’lar : ile bitmesi gerektiğini gösterir. |
|
UCase = LCase |
Büyük/Küçük harfin eşit kabul edilip edilmeyeceği. |
|
; Comment |
Açıklama satırlarının ; ile başlayıp başlamayacağı. |
|
Processor Warn |
Kullandığınız komutların seçili CPU tarafından desteklenmemesi durumunda uyarı gösterilir. |
|
FPU Present |
Sisteminizde FPU olup olmadığını seçebilirsiniz. |
|
68020++ Odd Data |
68020 ve üstü işlemcilerde data’larınız tek adreslere denk gelebilir. 68000’de bu durumda hata oluşur. Tek adrese denk gelen data olması durumunda uyarı verilip verilmeyeceğini bu seçenek ile belirleyebilirsiniz. |
|
68851 Present |
Sisteminizde MMU olup olmadığını seçebilirsiniz. |
Environment Preferences, uygulama ayarlarınızın bazılarının açıklamaları aşağıdaki gibidir:
|
ReqTools Library |
Dosya açma / kaydetme işlemleri için ReqTools library kullanılır. |
|
Save Marks |
Dosyanızın içine belirlediğiniz mark’lar da kaydedilir. |
|
WB to front |
Kodunuzu çalıştırdığınızda Workbench öne getirilir. |
|
Resident Registers |
REGSDATA dosyası hafızada bekletilir. =R ile tüm donanım register’larının listesini görebilirsiniz. |
|
Safety |
Popup pencerelerde varsayılan seçenek olmaz. |
|
Close Workbench |
AsmOne açıldığında WB kapatılır. WB’den çalışan başka programlar varsa kapatılamayabilir. |
|
Clipboard Support |
Clipboard açık/kapalı. |
|
Parameters |
Debug işlemi başlatılırken koda parametre verilip verilemeyeceği. PS ile verilecek parametreleri belirleyebilirsiniz. |
|
RTG Mode |
Grafik kartı desteği açık/kapalı. DİKKAT! Eğer AGA ekranda çalışıyorsanız ve bu seçenek seçiliyse Debugger’a girerken hata alabilirsiniz. Grafik kartı ekranında çalışmıyorsanız seçmeyiniz. |
|
Extended ReqTools |
Bul/değiştir gibi işlemler için ReqTools library’i kullan/kullanma. |
|
Keep x |
Editörde aşağı/yukarı ilerlerken imleç aynı kolon hizasında kalır. |
|
ASCII Only |
Monitörde ASCII olmayan karakterler gösterilmez. |
|
Disassembly |
Debugger’da bir sonraki satırı gösterir. |
|
Show Source |
Debugger ekranında derlenmiş kod ya da kaynak kod gösterilmesini sağlar. |
|
Enable/Permit |
Kod çalıştırılmadan önce multitasking’in kapatılıp kapatılmayacağı. |
|
Libcalls dec |
Library fonksiyonları için ofset değerleri decimal moda gösterilir. |
Aşağıdaki kodlarınızın içinde kullanabileceğiniz direktifleri ve açıklamalarını bulabilirsiniz.
|
EXTERN |
[label] EXTERN [number,]<file>,<address>[,length] |
Harici bir dosyayı verilen adresten itibaren yükle |
|
= |
<label> = <value> |
label'a <değer> atar. |
|
* |
<label> *<operator> |
Derleme işleminde o anki hafıza adresini gösterir. |
|
ADDWATCH |
ADDWATCH <label> |
Debugger için bir izleme yeri ekler. |
|
ALIGN |
ALIGN <value1>,<value2> |
Sonraki satırın denk geleceği adresi belirler. Değer2'ye bölünebilen, sonraki ilk adres bulunur ve değer1 eklenir, derleme işlemine bu adresten itibaren devam edilir. Ör: ALIGN 0,4 bir sonraki 4'e bölünebilen (longword) adrese geç. Burada arada atlanan byte'lara herhangi bir değer yazılmaz. |
|
AUTO |
AUTO <command>[\command..] |
Derleme sırasında diğer DLC'lerin çalıştırılmasını sağlar, komutlar \ ile ayrılır. |
|
BASEREG |
BASEREG <label>,<register> |
Verilen adres reg. için bir ofset değeri atar, sonraki tüm relatif işlemlerde bu ofset değeri otomatik olarak eklenir. |
|
BLK |
[label] BLK.[B|W|L|D|S] <value1>,<value2> |
Sabit değerlerden oluşan bir blok tanımlar. Ör: BLK.W 100,$AA55 ;100 adet $AA55 (word) |
|
CMEXIT |
CMEXIT <value> |
İç içe çağırılan makrolardan <değer>'e ulaşıldığında çıkılmasını sağlar. |
|
CNOP |
CNOP <value1>,<value2> |
Bkz. ALIGN |
|
DC |
DC.[size] <expresion>[,expresion...] |
Sabit veri tanımlamanızı sağlar, Ör: DC.B $01,$02,'plazma',$80 / 2 |
|
DCB |
DCB.[size] <value1>,<value2> |
Bkz. BLK |
|
DR |
DR.[B|W|L] <value> |
Relatif değerlerden oluşan bir blok tanımlamanızı sağlar. Bu değerler bulunduğu adres ile verilen değer arasındaki fark ile hesaplanır (<value>-*). Ör: DR.L myRoutine |
|
DS |
DS.[size] <value> |
İleride kullanılmak üzere <değer> kadar alan ayırır. Ör: DS.W 50 ;50 word (100 byte) alan ayır. Dikkat! Bu ayrılan alan herhangi bir değer ile doldurulmaz. |
|
ELSE |
IF ile kullanılır |
|
|
END |
Kodun bittiği yeri gösterir, o noktadan sonrası derlenmez. |
|
|
ENDB |
ENDB <address register> |
BASEREG tanımlamasını kaldırır. |
|
ENDC |
ENDIF ile aynıdır. |
|
|
ENDIF |
IF bloğunu bitirir. |
|
|
ENDM |
Makro bloğunu bitirir. |
|
|
ENDOFF |
OFFSET tanımlamasını kaldırır. |
|
|
ENDR |
REPT bloğunu bitirir. |
|
|
ENTRY |
Harici bir tanımlama yapar. Bkz. XDEF, EXTRN, GLOBAL. |
|
|
EQU |
<label> EQU <value> |
<label>a <değer> atar. |
|
EQUC |
<label> EQUC <PPC register> |
PPC reg.'na <isim> verir |
|
EQUD |
<label> EQUD <FPU value> |
<label>a <değer> atar. (Double, Ondalık) |
|
EQUP |
<label> EQUP <FPU value> |
<label>a <değer> atar. (Paxked) |
|
EQUR |
<label> EQUR <register> |
<register>a <isim> verir. |
|
EQUS |
<label> EQUS <FPU value> |
<label>a <değer> atar. (Single, Ondalık) |
|
EQUX |
<label> EQUX <FPU value> |
<label>a <değer> atar. (Extended) |
|
EREM |
REM bloğunu bitirir |
|
|
ETEXT |
TEXT bloğunu bitirir |
|
|
EVEN |
Sonraki adresin bir çift (even) adres olmasını sağlar (CNOP 0,2) |
|
|
EXTRN |
EXTRN <label>[,label...] |
Harici tanımala yapar. C'deki extern ile aynıdır. |
|
FAIL |
'User made FAIL' hatası verilmesini sağlar. |
|
|
FILESIZE |
FILESIZE(<file>) |
Harici bir dosyanın boyutunu okur. Özellikle derleme sırasında Memory Allocation için kullanışlıdır. |
|
GLOBAL |
Bkz. EXTRN |
|
|
IDNT |
IDNT <string> |
??? |
|
IF |
IF(EQ|NE|GT|GE|LT|LE) <bool-value> |
IF bloğu açar |
|
IF1 |
Bu blok içindekiler sadece derlemenin ilk aşamasında derlenir. (AsmOne/Pro 2 aşamalı (2 Pass) bir derleyicidir) |
|
|
IF2 |
Bu blok içindekiler sadece derlemenin ikinci aşamasında derlenir. |
|
|
IFB |
??? |
|
|
IFC |
IFC <string1>,<string2> |
<string1> = <string2> olduğunda IF bloğu derlenir. |
|
IFD |
IFD <symbol> |
<sembol> tanımlı ise blok derlenir. |
|
IFNB |
??? |
|
|
IFNC |
IFNC <symbol1>,<symbol2> |
<string1> ile <string2> eşit olmadığında blok derlenir. |
|
IFND |
IFND <symbol> |
<sembol> tanımlı değil ise blok derlenir. |
|
IMAGE |
IMAGE <file>[,<address>] |
Bkz. INCBIN |
|
INCBIN |
INCBIN <file>[,<address>] |
Binary dosyayı hafızaya okur. Adres verilirse verilen adrese yükler. |
|
INCDIR |
INCDIR <path> |
INCBIN vb. komutlar için path belirtir. Ör: INCIDR "HD0:sources/" ;sondaki / karakterini unutmayın. |
|
INCIFF |
IFF dosya include eder |
|
|
INCIFFP |
IFF palet include eder |
|
|
INCLUDE |
INCLUDE <file> |
Verilen kaynak kod dosyasını include eder. Bu işlem sadece ilk derlemede bir defa yapılır, böylece derleme işleminde hız sağlanır. ZI ile hafızaya yüklenmiş olan bu dosyaları temizleyip yeniden yüklenmelerini sağlayabilirsiniz. |
|
INCSRC |
INCSRC <sourcenumber> |
<sourcenumber> numaralı kaynak kodu include edilir. |
|
JUMPERR |
JUMPERR <label> |
Kendi hata rutininize atlamanızı sağlar |
|
LOAD |
LOAD <address> |
Derleme işleminin belirli bir adresten itibaren yapılmasını sağlar. Bkz. ORG |
|
MACRO |
Makro bloğu açar. |
|
|
MEXIT |
Makro tanımlamasından çıkar. Tanımlamayı bitirmek için ENDM kullanın. |
|
|
ODD |
Sonraki adresi tek (odd) adres yapar. |
|
|
OFFSET |
||
|
ORG |
ORG <address> |
Program için bir mutlak (absolute) başlangıç adresi belirler. LOAD ile birlikte programınızın belirli bir hafıza adresine yerleştirilmesini sağlayabilirsiniz. |
|
PRINTT |
PRINTT <string> |
Verilen ifadeyi ekrana yazar. |
|
PRINTV |
PRINTV <label/value>[,label/value...] |
Verilen <label> ya da <value>'ları ekrana yazar. |
|
REM |
Açıklama bloğu açar. REM / EREM arasında kalan yazılar derlenmez. ; ile tek satırlık açıklamalar girebilirsiniz. |
|
|
REPT |
REPT <number> |
REPT / ENDR arasındaki blok <number> kadar tekrarlanır. |
|
RS |
RS.[size] <value> |
Dâhili RS sayacına <value> ekler. Örneklere bakınız. |
|
RSRESET |
RS sayacını sıfırlar. |
|
|
RSSET |
RSSET <value> |
RS sayacını verilen değere eşitler. |
|
SECTION |
[label] SECTION <name>[,type][_memory] |
Yeni bir program bölümü (section) başlatır. Tip CODE, DATA ve BSS olabilir, hafıza için _C (chip), _F (fast) and _P (public) kullanılabilir. Copper list, ses ve görüntü verilerini CHIP RAM'e koymak için kullanabilirsiniz. |
|
SET |
[label] SET <value> |
[label]'ı <value>'ya eşitler. EQU ve = ile aynıdır, ancak daha sonra aynı label için farklı değer SET edilebilir. |
|
SETCPU |
SETCPU <option> |
CPU tipini belirler: 000, 010, 020, 030, 040, 060 olabilir. |
|
SETFPU |
SETFPU <option> |
FPU olup olmadığını belirler: ON, OFF verilebilir. |
|
SETMMU |
SETMMU <option> |
MMU olup olmadığını belirler: ON, OFF verilebilir. |
|
TEXT |
TEXT bloğu başlatır. Bkz. ETEXT |
|
|
XDEF |
XDEF <label>[,label....] |
Diğer kodlarda kullanılmak üzere verilen label'ları harici olarak tanımlar. |
|
XREF |
XREF <label>[,label....] |
Verilen label'ların harici tanımlar olduğunu belirtir. Derleme işleminde aktif kaynak kodda bu ifadeler tanımlı olmasa da derleme işlemi devam eder. |
|
Hata Mesajı |
Açıklama |
|
Workspace Memory Full |
Proje için ayrılan hafıza bitti, =M kullanın |
|
Address Register Byte/Logic |
Adres reg.’larına .B ile ulaşamazsınız. Ayrıca lojik işlem uygulanamaz. Ör. OR.W A0,D0 |
|
Address Register Expected |
Adres reg. gereken yerde data reg. kullanıldı |
|
Comma Expected |
, ile ayrılmış argüman gerekli |
|
Data Register Expected |
Data reg. gereken yerde adres reg. kullanıldı |
|
Double Symbol |
Aynı ifade iki kez tanımlanmış |
|
Unexpected End of File |
Bir MACRO/IF ifadesi açık kalmış |
|
End of File |
Dosya sonuna ulaşıldı (Search) |
|
User made FAIL |
FAIL komutuna rastlandı (compile-time) |
|
Illegal Command |
Geçersiz komut |
|
Illegal Address Size |
Geçersiz adres boyutu. Ör. CLR.B A0 |
|
Illegal Operand |
Geçersiz argüman |
|
Illegal Operator |
Geçersiz operatör |
|
Illegal Operator in BSS Area |
BSS içinde yalnızca DS kullanılabilir |
|
Illegal Order |
Argüman sırası hatalı. Ör: MOVEM.L A0,D4-D0.-(A7) ;Önce data sonra adres reg. verilmelidir. |
|
Illegal Register Size |
Geçersiz reg. boyutu. Ör: MOVE.L (A0,D0.B),D1 ;Index reg. .W ya da .L olabilir |
|
Illegal Section Type |
Geçersiz SECTION tipi. Geçerli tipler: code, data, bss |
|
Illegal Size |
Hatalı boyut. Ör: ADDA.B D0,A0 ;adres reg. ile .B işlem yapılamaz |
|
Illegal MACRO Definition |
Geçersiz MACRO tanımı |
|
Immediate Operand Expected |
Bazı komutlar sadece |
|
Include Jam |
Include hatası |
|
MACRO Overflow |
İç içe en fazla 25 macro tanımlanabilir |
|
Invalid Address Mode |
Geçersiz adres modu |
|
LOAD without ORG |
LOAD komutu yalnıza ORG ile kullanılabilir |
AsmOne/Pro bir makro assembler’dır. Yani kaynak kodlarınız içinde sık kullandığınız işlemleri kolayca yapmak ve tekrar tekrar yazmamak için çeşitli makrolar tanımlayabilirsiniz. Bu bölümde nasıl makro tanımlayacağımızı göreceğiz.
Bir makro tanımı yapmak için en uygun yer kodunuzun ilk satırlarıdır. Ayrıca tüm makrolarınızı ayrı bir include dosyasına da koyabilirsiniz. Bir makro tanımlaması aşağıdaki şekilde yapılır:
MYMACRO: MACRO
...
ENDM
Burada MYMACRO tanımladığımız makronun ismidir. İsmin büyük harfle yazılması şart değildir ancak kod içinde makro çağırılan yerleri kolayca görmek açısından bu şekilde kullanmak iyidir. Makro ismi aynı zamanda bir label gibidir bu nedenle ayarlarınızda label sonlarında : olması gerektiğini seçtiyseniz burada da olması gerekir. Ayrıca isim ile MACRO ifadesi aynı satırda olmalıdır.
CLEAN: MACRO
moveq #0,d0
moveq #0,d1
moveq #0,d2
ENDM
Tanımladığınız makrolara 10 taneye kadar argüman ekleyebilirsiniz. Bunun için \0 - \9 ifadelerini kullanabilirsiniz. Aşağıdaki örneği inceleyin:
CLEAN: MACRO
moveq #0,\1
ENDM
TEST: MACRO
move.l (\1)+,(\2)+
ENDM
CLEAN D3
TEST A0,A1
Ayrıca NARG isimli değişken makro içinde, makronun kaç argümanla çağırıldığını görmek ve buna göre farklı adımlar uygulamak için kullanılabilir:
CLEAN: MACRO
IF NARG = 2
clr.l \1
clr.l \2
ELSE
FAIL
ENDIF
ENDM
Daha karmaşık bir makro örneği aşağıdadır (AsmOne 1.4 Manual’den alıntıdır):
do_it: MACRO
btst #\1,d0
bne.b \@1
move.l \2,d0
lsl.w #\3,d0
bra.b *+4
\@1: moveq #0,d0
ENDM
start:
do_it 10,d2,3
Include dosyalarından (özellikle exec/types.i) pek çok makronun nasıl tanımlandığını görebilirsiniz.
AsmOne/Pro’da makro yazarken bazı kurallara dikkat etmemeniz durumunda bulunması çok güç hatalarla karşılaşabilirsiniz. Çünkü AsmOne, hataları makronun içinde değil makronun çağırıldığı yerde verecektir. Bu yüzden aşağıdaki konulara dikkat edin;
Açıklama (comment) satırlarını makroların dışına yazın.
Makro içinde \ karakterini argümanlar dışında bir amaç için kullanmayın.
Makro tanımları içinde gereksiz hiçbir karakter kullanmayın.
Include dosyaları C’den bildiğimiz include dosyaları ile aynı işi görürler. “.i” uzantılıdırlar ve içerikleri AsmOne ile derlenebilecek şekildedir. İçlerinde çok çeşitli tanımlar tipler (types), yapılar (structure), makro tanımları ve sabitler (constants) vardır. Commodore firmasının yayınladığı “Includes & Autodocs” dosyalarını bulup hard diskinize ve bir diskete kopyalayabilir ve AsmOne’ın içinden yüklenerek kullanılabilirsiniz. Autodoc’lar tüm kütüphanelerin tüm fonksiyonlarını açıklayan yardım dosyalarıdır.
Ayrıca bu dosyalara ek olarak kütüphane ofset değerlerini barındıran LVO (Library Offsets) dosyaları vardır. Bu dosyalar çoğunlukla include klasörünün içinde LVO isimli ayrı bir klasörde dururlar. Bu dosyaları include ettiğinizde fonksiyonlar için ofset değerlerini ezbere bilmenize gerek kalmaz. Aşağıdaki örneği inceleyin:
incdir "include:"
include "exec/types.i"
include "lvo/exec_lib.i"
CALL: MACRO
jsr _LVO\1(a6)
ENDM
;
; Open Gfx Library
;
move.l $4.w,a6
lea gfxname(pc),a1
CALL OpenLibrary
move.l d0,gfxbase
beq.s NoGfx
Burada önce gerekli dosyalar include edilmiş, fonksiyon çağırma işlemini kolaylaştırmak için bir makro tanımlanmış ve OpenLibrary fonksiyonu çağırılmıştır. exec_lib.i dosyası include edilmemiş olsaydı CALL OpenLibrary yerine jsr -552(a6) yazmamız gerekecekti.
“types.i” dosyası ise tüm ön tanımlı ifadeleri barındırır. Herhangi başka bir dosyayı include etmeden önce bu dosyanın include edilmesi gerekir.
Ayrıca bu dosyaların içine bakarak da çok şey öğrenebilirsiniz. İçlerinde pek çok yararlı açıklama vardır.
Incdir "include:" ifadesinde tam yolu vermek yerine daha önceden yapılmış bir assign kullanılmıştır. CLI penceresinde assign komutu vererek assign’ların listesini alabilir ve yenilerini ekleyebilirsiniz. Ya da dilerseniz include dosyalarının tam yolunu yazabilirsiniz. INCDIR ifadesini kod içinde herhangi bir yerde tekrar vererek farklı klasörlerle çalışabilirsiniz.
Ayrıca belirtmekte fayda var; pek çok include dosyasının derlenebilmesi için ayarlarınızda UCase = LCase’in kaldırılması gerekir. Bazı durumlarda label’lar için : zorunluluğunu da kaldırmanız gerekebilir.
AsmOne/Pro kullanımı hakkında uzunca bir yazı oldu. Son olarak şunları ekleyebiliriz; AsmOne/Pro çok kullanışlı editörler olsa da bug’ları vardır, o nedenle çalışırken kodlarınızı hard disk ya da floppy diske kaydetmenizi öneririm. Benim yaptığım gibi RAM diske kaydetmeyin, aksi halde makineniz kilitlendiğinde kodlarınızı kurtaramayabilirsiniz.
Kodlarınızı yazarken her zaman label’ları en sol sütuna, komutları ise en az 1 tab karakteri ileriye yazın. Bu sadece okunabilirlik için değil sebebini anlamadığınız birçok hata mesajını da almanızı engelleyecektir.
Sonraki sayıya kadar hoşça kalın.