AMIGA ASSEMBLER

Selam!!! Ağustos'un bunaltıcı sıcak günlerine girerken yine bir Assembler köşesinde beraberiz. Bu ay artık sıkıcı bir hal alan komutlar listesinin son bölümünü vereceğim. İnanın, bu kadar uzun sürebileceğini ben bile tahmin edemedim. Bu yüzden Gelişmiş Assembler köşesine yaptığımız taşmayı telafi edeceğiz tabii ki. Komutlardan hemen sonra branch komutlarını detaylı olarak göreceğiz; zira bunlar bazen benim bile kafamı karıştırmaktalar. Hele oyun gibi detaylı bir proje yaparken bu tip karışıklıklar giderek büyür ve sonuçta kendi yazdığımız source'un içinden çıkamayabiliriz. Herneyse, dilerseniz hemen komutlara geçelim; ne dersiniz? Komut : NEG (NEGate data) Kullanım şekilleri : NEG Dy / NEG (Ay) / NEG (Ay)+ / NEG -(Ay) NEG d(Ay) / NEG d(Ay,Dy) / NEG $yy.W / NEG $yyyy.L Açıklama : Destination'ın içeriğini 0'dan çıkarır ve elde edilen değeri yine destination'a yazar. Etkilenen flaglar : ***** Adresleme şekillerine göre harcadığı süre : NEG Dy > 4 CLCK, 4 CLCK, 6 CLCK/NEG (Ay) — 12 CLCK, 12 CLCK, 20 CLCK NEG (Ay)+ — 12 CLCK, 12 CLCK, 20 CLCK/NEG -(Ay)— 14 CLCK, 14 CLCK, 22 CLCK NEG d(Ay)— 16 CLCK, 16 CLCK, 24 CLCK/NEG d(Ay,Dy)— 18 CLCK, 18 CLCK, 26 CLCK NEG $yy.W— 16 CLCK, 16 CLCK, 24 CLCK/NEG $yyyy.L 20 CLCK, 20 CLCK, 28 CLCK Komut : NEGX (NEGate eXtended data) Kullanım şekilleri : NEGX Dy / NEGX (Ay) / NEGX (Ay)+ / NEGX -(Ay) NEGX d(Ay) / NEGX d(Ay,Dy) / NEGX $yy.W / NEGX $yyyy.L Açıklama : Destination'ın içeriğini 0'dan çıkarır ve elde edilen değeri yine destination'a yazar. X flag'ı da bu işlemde kullanıldığından, bit genişliği 32'nin üzerindeki sayıları da kullanmanızı sağlar. Etkilenen flaglar ; ***** Adresleme şekillerine göre harcadığı süre : NEG Dy — 4 CLCK, 4 CLCK, 6 CLCK/NEG (Ay) 12 CLCK, 12 CLCK, 20 CLCK NEG (Ay)+ — 12 CLCK, 12 CLCK, 20 CLCK/NEG -(Ay) — 14 CLCK, 14 CLCK, 22 CLCK NEG d(Ay) — 16 CLCK, 16 CLCK, 24 CLCK/NEG d(Ay,Dy)— 18 CLCK, 18 CLCK, 26 CLCK NEG $yy.W — 16 CLCK, 16 CLCK, 24 CLCK/NEG $yyyy.L 20 CLCK, 20 CLCK, 28 CLCK Komut : NOP (No OPeration) Kullanım şekilleri : NOP

Açıklama : NOP komutunun hiçbir işlevi yoktur. Zamanlamanın önemli olduğu rutinlerde bir nevi zaman komutu olarak kullanılabilir. NOP komutu 4 CLCK harcar. Etkilenen flaglar : Adresleme şekillerine göre harcadığı süre: Herhangi bir source ve destination kullanılmadığından adresleme şekli de yoktur. Fakat komutun süreci 4 CLCK'dir. Komut : NOT (do logical NOT) Kullanım şekilleri :

NOT Dy / NOT (Ay) / NOT (Ay)+ / NOT -(Ay) NOT d(Ay) / NOT d(Ay,Dy) / NOT $yy.W / NOT $yyyy.L Açıklama : Destination'ın içeriğini mantıksal NOT işlemine tâbi tutar. İşlem sonucunda destination'ın içeriğindeki tüm 1 taşıyan bitler 0, 0 taşıyan bitler de 1 olur. Etkilenen flaglar : -**00 Adresleme şekillerine göre harcadığı süre : NOT Dy — 4 CLCK, 4 CLCK, 6 CLCK/NOT (Ay) 12 CLCK, 12 CLCK, 20 CLCK NOT (Ay)+ — 12 CLCK, 12 CLCK, 20 CLCK/NOT -(Ay) — 14 CLCK, 14 CLCK, 22 CLCK NOT d(Ay) — 16 CLCK, 16 CLCK, 24 CLCK/NOT d(Ay,Dy)— 18 CLCK, 18 CLCK, 26 CLCK NOT $yy.W — 16 CLCK, 16 CLCK, 24 CLCK/NOT $yyyy.L — 20 CLCK, 20 CLCK, 28 CLCK Komut : OR (do logical OR) Kullanım şekilleri : OR Dx,Dy / OR (Ax),Dy / OR (Ax)+,Dy / OR -(Ax),Dy OR d(Ax),Dy / OR d(Ax,Dx),Dy / OR $xx.W,Dy / OR $xxxx.L,Dy / OR d(PC),Dy OR d(PC,Dx),Dy / OR #xx,Dy Açıklama : Source ile destination'ı mantıksal OR işlemine tâbi tutar ve sonucu destination'a yazar. Etkilenen -**00 Adresleme şekillerine göre harcadığı süre : OR Dx,Dy — 4 CLCK, 4 CLCK, 6 CLCK/OR (Ax),Dy — 8 CLCK, 8 CLCK, 14 CLCK OR (Ax)+,Dy — 8 CLCK, 8 CLCK, 14 CLCK/OR d(Ax),Dy 10 CLCK, 10 CLCK, 16 CLCK

OR d(Ax),Dyzi2 CLCK,1I2 CLCK,I8 — CLCK/OR CLCK,14 CLCK,20 CLCK OR $xx.WDyzi2 CLCK,İ2 CLCK,I8 CLCK/OR $xxxx.L,Dyz16 CLCK,16 CLCK, 22 CLCK OR d(PC),Dyzi2 CLCK,I8 — CLCK/OR

OR #xx,Dy — 8 CLCK, 8 CLCK, 14 CLCK Komut : OR (do logical OR) Kullanım şekilleri : OR Dx,Dy / OR Dx,(Ay) / OR Dx,(Ay)+ / OR Dx,-(Ay) OR Dx,d(Ay) / OR Dx,d(Ay,Dy) / OR Dx,$yy.W / OR Dx,$yyyy.L Açıklama : Source ile destination'ı mantıksal OR işlemine tabi tutar ve sonucu destination'a yazar. Etkilenen flaglar : -**00 Adresleme şekillerine göre harcadığı süre: OR Dx,Dy — 4 CLCK, 4 CLCK, 6 CLCK/OR Dx,(Ay) — 12 CLCK, 12 CLCK, 16 CLCK OR Dx,(Ay)+ — 12 CLCK, 12 CLCK, 16 CLCK/OR Dx,-(Ay)— 14 CLCK, 14 CLCK, 18 CLCK

OR Dx,d(Ay)-16 CLCK,16 CLCK,20 CLCK/OR CLCK,18 CLCK,22 CLCK OR CLCK,I6 CLCK,20 CLCK/OR

Dx,$yyyy.L—20 CLCK,20 CLCK,24 CLCK Komut : OR (do logical OR) Kullanım şekilleri : OR Dx,Dy / OR (Ax),Dy / OR (Ax)4,Dy / OR -(Ax),Dy OR d(Ax),Dy / OR d(Ax,Dx),Dy / OR $xx.W,Dy / OR $xxxx.L,Dy / OR d(PC),Dy

OR d(PC,Dx),Dy / OR #xx,Dy Açıklama : Source ile destination'ı mantıksal OR işlemine tabi tutar ve sonucu destination'a yazar. Etkilenen -**00 Adresleme şekillerine göre harcadığı süre : OR Dx,Dy — 4 CLCK, 4 CLCK, 6 CLCK / OR (Ax),Dy - 8 CLCK, 8 CLCK, 14 CLCK / OR 8 CLCK, 8 CLCK, 14 CLCK / OR -(Ax),Dy - 10 CLCK, 10 CLCK, 16 CLCK copy

OR d(Ax),Dy — 12 CLCK, 12 CLCK, 18 CLCK/OR d(Ax,Dx),Dy — 14 CLCK, 14 CLCK, 20 CLCK OR $xx.W,Dy — 12 CLCK, 12 CLCK, 18 CLCK/OR $xxxx.L,Dy — 16 CLCK, 16 CLCK, 22 CLCK OR d(PC),Dy — 12 CLCK, 12 CLCK, 18 CLCK/OR d(PC,Dx),Dy — 14 CLCK, 14 CLCK, 20 CLCK OR #xx,Dy — 8 CLCK, 8 CLCK, 14 CLCK Komut : ORI (OR Immediatly) Kullanım şekilleri : ORI #xxxx,Dy / ORI #xxxx,(Ay) / ORI #xxxx,(Ay)+ / ORI #xxxx,-(Ay) / ORI #xxxx,d(Ay) / ORI #xxxx,d(Ay,Dy) / ORI #xxxx,$yy.W / ORI #xxxx,$yyyy.L / ORI #xxxx,CCR / ORI #xxxx,SR Açıklama : Source olarak belirtilen değeri destination'ın içeriği ile mantıksal OR işlemine tâbi tutar ve sonucu yine destination'a yazar. Etkilenen flaglar : -**00 Adresleme şekillerine göre harcadığı süre: ORI #xxxx,Dy — 8 CLCK, 8 CLCK, 16 CLCK ORI #xxxx,(Ay) — 16 CLCK, 16 CLCK, 28 CLCK ORI #xxxx,(Ay)+ — 16 CLCK, 16 CLCK, 28 CLCK ORI #xxxx,-(Ay) — 18 CLCK, 18 CLCK, 30 CLCK ORI #xxxx,d(Ay) — 20 CLCK, 20 CLCK, 32 CLCK ORI #xxxx,d(Ay,Dy)— 22 CLCK, 22 CLCK, 34 CLCK ORI #xxxx,$yy.W — 20 CLCK, 20 CLCK, 32 CLCK ORI #xxxx,$yyyy.L — 24 CLCK, 24 CLCK, 36 CLCK ORI #xxxx,CCR — 20 CLCK, 20 CLCK, 20 CLCK ORI #xxxx,SR — 20 CLCK, 20 CLCK, 20 CLCK Komut: PEA (Push Effective Address) Kullanım şekilleri : PEA (Ax) / PEA d(Ax) / PEA d(Ax,Dx) / PEA $xx.W / PEA $xxxx.L / PEA d(PC) / PEA d(PC,Dx) Açıklama: Source'daki adresi alarak bunu stack'e atar. Etkilenen flaglar: ----- Adresleme şekillerine göre harcadığı süre: Bu komutla sadece longword bazında işlem yapılabilir.

PEA(Ax) —12CLCK/PEAd(Ax) — İ6CLCK PEA d(Ax,Dx) > 20 CLCK /PEA $xx.W —16CLCK PEA $xxxx.L —20CLCK /PEAd(PC) —16CLCK

PEA d(PC,Dx) — 20 CLCK Komut: RESET Kullanım şekilleri: RESET Açıklama: External donanım birimlerini RESET hattını 0 konumuna getirerek açılış konumlarına getirir. Etkilenen flaglar: ----- Adresleme şekillerine göre harcadığı süre: Komut işlendikten sonra RESET hattı 124 CLCK boyunca 0 konumda bekler. Bu süre, tüm bağlı donanımların -donanım ne olursa olsun- başlangıç konumlarına gelmelerini sağlar. Komut: ROL (ROtate data Left) Kullanım şekilleri: ROL Dx,Dy / ROL #$xxxx,Dy Açıklama: Destination'ı source'ta belirtildiği kadar bit sola kaydırır. En soldan taşan bit (en yüksek değerlikli 31. bit) boşalan 0. bit yerini alır. Bu bit aynı zamanda Carry flag'ine kopyalanır. Etkilenen flaglar: -**0* Adresleme şekillerine göre harcadığı süre: ROL Dx,Dy — 6+2(Dx) CLCK / ROL #$xxxx,Dy — 8+2(Dx) CLCK Komut : ROL (ROtate data Left-one bit)

642x

Kullanım şekilleri : ROL (Ay) / ROL (Ay)+ / ROL -(Ay) / ROL d(Ay) / ROL d(Ay,Dy) / ROL $yy.W / ROL $yyyy.L Açıklama: Destination'ın içeriğini bir bit sola kaydırır, taşan biti carry flag'ına kopyalar ve boşalan 0. bit yerine yazar. Etkilenen flaglar: -**0* Adresleme şekillerine göre harcadığı süre: Bu komut sadece word bazında çalışabilir. ROL (Ay) — 12 CLCK / ROL (Ay)+ — 14 CLCK / ROL -(Ay) — 14 CLCK / ROL d(Ay) — 16 CLCK / ROL d(Ay,Dy) — 18 CLCK / ROL $yy.W — 16 CLCK / ROL $yyyy.L — 20 CLCK Komut: ROR (ROtate data Right) Kullanım şekilleri: ROR Dx,Dy / ROR #$xxxx,Dy Açıklama: Destination'ın içeriğini source'ta belirtilen bit kadar sağa kaydırır ve taşan bitler 31. bit yerine yazılır. Aynı zamanda bu taşan bitler carry flag'ine de kopyalanır. Etkilenen flaglar: -**0* Adresleme şekillerine göre harcadığı süre: ROR Dx,Dy — 6+2(Dx) CLCK / ROR #$xxxx,Dy — 8+2(Dx) CLCK Komut: ROR (ROtate data bit) Kullanım şekilleri: ROR (Ay) / ROR (Ay)+ / ROR -(Ay) / ROR d(Ay) / ROR d(Ay,Dy) / ROR $yy.W / ROR $yyyy.L Açıklama: Destination'ın içeriğini bir bit sağa kaydırır. Taşan bit hem carry flag'ine hem de 31. bite kopyalanır. Etkilenen flaglar: -**0* Adresleme şekillerine göre harcadığı süre: Bu komut sadece 16 bit genişliğinde çalışır.

— 12 CLCK / ROL -

6+2x sağa kaydırır. Taşan

ROR (Ay) — 12 CLCK / ROR (Ay)+ — 12 CLCK / ROR -(Ay) — 14 CLCK / ROR d(Ay) — 16 CLCK / ROR d(Ay,Dy) — 18 CLCK / ROR $yy.W — 16 CLCK

ROR $yyyy.L — 20 CLCK Komut: ROXL (ROtate data Left) Kullanım şekilleri: ROXL Dx,Dy / ROXL #x,Dy Açıklama: Bu komut aynı ROL gibi çalışır, fakat taşan bit hem c, hem de x flag'lerini etkiler. Bu komutla en fazla 8 bitlik bir kaydırma yapılabilir. Etkilenen flaglar: ***0* Adresleme şekillerine göre harcadığı süre: ROXL Dx,Dy — 6+2(Dx) CLCK, 6+2(Dx) CLCK, 6+2(Dx) CLCK 6+2x CLCK, 6+2x CLCK, 6+2x CLCK Komut: ROXL (ROtate data Left-one bit)

Kullanım şekilleri: ROXL (Ay) / ROXL (Ay)+ / ROXL -(Ay) / ROXL d(Ay) / ROXL d(Ay,Dy) / ROXL $yy.W / ROXL $yyyy.L Açıklama: Bu komut tek bitlik ROL gibi destination içeriğini sola taşır ve taşan biti de 0. bite yazar. Bu taşan bit hem c, hem de x flag'lerini etkiler. Bu komutla sadece 8 biti aşmayan kaydırmalar yapılabilir. Etkilenen flaglar: ***0* Adresleme şekillerine göre harcadığı süre: Sadece word bazında çalışabilen bu komutun işlem süreleri aşağıdadır.

ROXL (Ay) — 12 CLCK / ROXL (Ay)+ — 12 CLCK / ROXL -(Ay) — 14 CLCK / ROXL d(Ay) — 14 CLCK / ROXL d(Ay,Dy) — 16 CLCK /

ROXL $yy.W — 16 CLCK / ROXL $yyyy.L — 20 CLCK Komut: ROXR (ROtate data Right) Kullanım şekilleri: ROXR Dx,Dy / ROXR #x,Dy Açıklama: Destination'ın içeriğini source'ta belirtilen sayı kadar sağa kaydırır. Taşan bit 31. bit yerine yazılır ve c ile x flag'ları da bu bitin durumuna göre değiştirilir. Bu komutla en fazla 8 bitlik kaydırma yapılabilir. Etkilenen flaglar: ***0* Adresleme şekillerine göre harcadığı süre: ROXR Dx,Dy — 6/2(Dx) CLCK, 6/2(Dx) CLCK, 6/2(Dx) CLCK ROXR #x,Dy — 6/2xCLCK, 6/2xCLCK, 6/2x CLCK Komut: ROXR (ROtate data Right-one bit) Kullanım şekilleri: ROXR (Ay) / ROXR (Ay)+ / ROXR -(Ay) / ROXR d(Ay) / ROXR d(Ay,Dy) / ROXR $yy.W / ROXR $yyyy.L Açıklama: Aynı 1 bitlik ROXL gibi çalışır; kaydırma yönü ise sağa doğrudur. Etkilenen flaglar: ***0* Adresleme şekillerine göre harcadığı süre: Bu komut sadece word bazında çalışır.

ROXR (Ay) — 12 CLCK / ROXR (Ay)+ — 12 CLCK / ROXR -(Ay) — 14 CLCK / ROXR d(Ay) — 14 CLCK / ROXR d(Ay,Dy) — 16 CLCK /

ROXR $yy.W — 16 CLCK / ROXR $yyyy.L — 20 CLCK Komut: RTE (ReTurn from Exception) Kullanım şekilleri: RTE Açıklama: Özel bir işletim durumu olan exception'dan (trap ve özel bazı interrupt'lar) ana rutine geri dönmeyi sağlar. Komuta gelindiğinde stack pointer'a en son atılan değer statü register'ına geri kopyalanır, stack adresi 4 byte ileri çekilir. Bu durumda stack'in gösterdiği yeni değer, exception'a dallanmadan önce stack'e atılan en son değer olacaktır. Ardından stack pointer'ın yeni gösterdiği değer yeni çalışma adresi olarak alınarak programın çalışmasına buradan devam edilecektir. Exception rutinine girmemizi sağlayan TRAP komutu zaten buraya exception rutininin dönüş adresini yazmıştı. Etkilenen flaglar: ***** Komut: RTR (ReTuRn) Kullanım şekilleri: RTR Açıklama: Bu komut da aynı RTE gibi çalışır; fakat stack pointer'ın komut işlenmeden önce gösterdiği adresteki değer statü register'ına değil CCR'ye (Condition Code Register) kopyalanır. Bu komut yardımıyla exception'a dallanmadan hemen önceki flag durumlarını da geri alabilir ve exception'a dallanmadan önceki flag durumlarına göre çeşitli özel dallanmaları exception rutinini çağırdıktan sonra da gerçekleştirebilirsiniz. Etkilenen flaglar: ***** Adresleme şekillerine göre harcadığı süre: 20 CLCK Komut: RTS (ReTurn from Sub-routine) Kullanım şekilleri: RTS Açıklama: Bir program içinde BSR ile dallanma yaptığınızda, altrutinden dallanmanın yapıldığı satırın sonrasına dönüp ana rutine kaldığınız yerden devam etmek istiyorsanız, bu komutu ana rutine dönmek istediğiniz yere koyun. Her program aynı zamanda bir altrutin olarak da görülebileceğinden programınızın sonuna RTS eklemekle programdan çıkmayı sağlayabilirsiniz. BSR komutu, son kalınan adresi stack'e atar. RTS ise stack'e atılan bu değeri alır ve programa o adresten devam eder. Etkilenen flaglar: ----- Komut: SBCD (Sub Binary Coded Decimal) Kullanım şekilleri: SBCD Dx,Dy Açıklama: 10'lu sisteme göre binary olarak kodlanmış sayıları birbirinden çıkarır. Destination register'ı içeriği, source register içeriğinden çıkarılarak destination'a yazılır. Etkilenen flaglar: *U*U* Adresleme şekillerine göre harcadığı süre: Bu komut sadece byte genişliğinde çalışır: SBCD Dx,Dy — 6 CLCK Komut: SBCD (Sub Binary Coded Decimal) Kullanım şekilleri: SBCD -(Ax),-(Ay) Açıklama: Destination adres register'ının gösterdiği adresin içeriği source adres register'ının gösterdiği adresin içeriğinden çıkarılarak destination adres register'ının gösterdiği adrese yazılır. İşlemden sonra source ve destination adres register'ları 2'şer byte (1 word) geri çekilir. Etkilenen flaglar: *U*U* Adresleme şekillerine göre harcadığı süre: Bu komut sadece word bazında çalışır: SBCD -(Ax),-(Ay) — 18 CLCK Komut: Szz Kullanım şekilleri: Szz Dy / Szz (Ay) / Szz (Ay)+ / Szz -(Ay) / Szz d(Ay) / Szz d(Ay,Dy) / Szz $yy.W / Szz $yyyy.L Açıklama: Belirtilen şart gerçekleşirse, destination'a $ff değeri yazılır. Diğer durumlarda destination'un içeriği 0 olur. Etkilenen flaglar: Adresleme şekillerine göre harcadığı süre: Bu komut sadece byte genişliğinde çalışabilir.

Szz Dy — 6 CLCK / Szz (Ay) — 12 CLCK / Szz (Ay)+ — 12 CLCK / Szz -(Ay) — 14 CLCK / Szz d(Ay) — 16 CLCK / Szz d(Ay,Dy) — 18 CLCK / Szz $yy.W — 16 CLCK / Szz $yyyy.L — 20 CLCK Komut: STOP Kullanım şekilleri: STOP #$xx

Açıklama: Verilen değeri statü register'ına yazar ve programı durdurur. Program ancak TRACE modu işler duruma getirildiğinde ya da RESET hattı 0'a çekildiğinde (RESET komutu ya da hardware ile) çalışmaya devam eder. Etkilenen flaglar: ***** Komut: SUB (SUBtract two datas) Kullanım şekilleri: SUB Dx,Dy / SUB Ax,Dy / SUB (Ax),Dy / SUB (Ax)+,Dy / SUB -(Ax),Dy / SUB d(Ax),Dy / SUB d(Ax,Dx),Dy / SUB $xx.W,Dy / SUB $xxxx.L,Dy / SUB d(PC),Dy / SUB d(PC,Dx),Dy / SUB #$xxxx,Dy Açıklama: Destination data register'ının içeriğinden source'u çıkararak sonucu destination data register'ına yazar. Taşma (V) flag'ı gözönüne alınmaz. Etkilenen flaglar: ***** Adresleme şekillerine göre harcadığı süre: SUB Dx,Dy — 4 CLCK, 4 CLCK, 6 CLCK / SUB Ax,Dy — 4 CLCK, 8 CLCK / SUB (Ax),Dy — 8 CLCK, 8 CLCK, 14 CLCK / SUB (Ax)+,Dy — 8 CLCK, 8 CLCK, 14 CLCK / SUB -(Ax),Dy — 10 CLCK, 10 CLCK, 16 CLCK / SUB d(Ax),Dy — 12 CLCK, 12 CLCK, 18 CLCK / SUB d(Ax,Dx),Dy — 14 CLCK, 14 CLCK, 20 CLCK / SUB d(PC),Dy — 12 CLCK, 12 CLCK, 18 CLCK

SUB $xxxx.L,Dy — 16 CLCK, 16 CLCK, 22 CLCK / SUB d(PC,Dx),Dy — 14 CLCK, 14 CLCK, 20 CLCK / SUB #$xxxx,Dy — 8 CLCK, 8 CLCK, 14 CLCK Komut: SUB (SUBtract two datas) Kullanım şekilleri: SUB Dx,Dy / SUB Dx,(Ay) / SUB Dx,(Ay)+ / SUB Dx,-(Ay) / SUB Dx,d(Ay) / SUB Dx,d(Ay,Dy) / SUB Dx,$yy.W / SUB Dx,$yyyy.L Açıklama: Destination'dan source data register'ı içeriğini çıkararak sonucu destination'a yazar. Etkilenen flaglar: ***** Adresleme şekillerine göre harcadığı süre: SUB Dx,Dy — 4 CLCK, 4 CLCK, 6 CLCK / SUB Dx,(Ay) — 12 CLCK, 12 CLCK, 20 CLCK / SUB Dx,(Ay)+ — 12 CLCK, 12 CLCK, 20 CLCK / SUB Dx,-(Ay) — 14 CLCK, 14 CLCK, 22 CLCK / SUB Dx,d(Ay) — 16 CLCK, 16 CLCK, 24 CLCK / SUB Dx,d(Ay,Dy) — 18 CLCK, 18 CLCK, 26 CLCK / SUB Dx,$yy.W — 16 CLCK, 16 CLCK, 24 CLCK / SUB Dx,$yyyy.L — 20 CLCK, 20 CLCK, 28 CLCK Komut: SUBA (SUBtract from Address-register) Kullanım şekilleri: SUBA Dx,Ay / SUBA Ax,Ay / SUBA (Ax),Ay / SUBA (Ax)+,Ay / SUBA -(Ax),Ay / SUBA d(Ax),Ay / SUBA d(Ax,Dx),Ay / SUBA $xx.W,Ay / SUBA $yyyy.L,Ay / SUBA d(PC),Ay / SUBA d(PC,Dx),Ay / SUBA #$xxxx,Ay Açıklama: Destination adres register'ından source'un içeriğinin çıkarılarak sonucun destination adres register'ına yazılmasını sağlar. Destination adres register'ı olduğundan bu komutla sadece word ve longword bazında işlem yapabilirsiniz. Etkilenen flaglar: Adresleme şekillerine göre harcadığı süre: Destination adres register'ı olduğundan bu komutla byte genişliğinde işlem yapılamaz. Aşağıdaki işlem süreçleri de bu yüzden sırf word ve longword genişlikleri içindir.

SUBA Dx,Ay — 8 CLCK, 8 CLCK / SUBA Ax,Ay — 8 CLCK, 8 CLCK / SUBA (Ax),Ay — 12 CLCK, 14 CLCK / SUBA (Ax)+,Ay —

12 CLCK, 14 CLCK / SUBA -(Ax),Ay — 14 CLCK, 16 CLCK / SUBA d(Ax),Ay — 16 CLCK, 18 CLCK / SUBA d(Ax,Dx),Ay — 18 CLCK, 20 CLCK / SUBA $xx.W,Ay — 16 CLCK, 18 CLCK / SUBA $yyyy.L,Ay — 20 CLCK, 22 CLCK / SUBA d(PC),Ay — 16 CLCK, 18 CLCK / SUBA d(PC,Dx),Ay — 18 CLCK, 20 CLCK / SUBA #$xxxx,Ay — 12 CLCK, 14 CLCK Komut: SUBI (SUBtract from) Kullanım şekilleri: SUBI #$xxxx,Dy / SUBI #$xxxx,(Ay) / SUBI #$xxxx,(Ay)+ / SUBI #$xxxx,-(Ay) / SUBI #$xxxx,d(Ay) / SUBI #$xxxx,d(Ay,Dy) / SUBI #$xxxx,$yy.W / SUBI #$xxxx,$yyyy.L Açıklama: Source olarak belirtilen değeri destination'ın içeriğinden çıkararak sonucu destination'a yazar. Etkilenen flaglar: ***** Adresleme şekillerine göre harcadığı süre: SUBI #$xxxx,Dy — 8 CLCK, 8 CLCK, 16 CLCK / SUBI #$xxxx,(Ay) — 16 CLCK, 16 CLCK, 28 CLCK / SUBI #$xxxx,(Ay)+ — 16 CLCK, 16 CLCK, 28 CLCK / SUBI #$xxxx,-(Ay) — 18 CLCK, 18 CLCK, 30 CLCK / SUBI #$xxxx,d(Ay) — 20 CLCK, 20 CLCK, 32 CLCK / SUBI #$xxxx,d(Ay,Dy) — 22 CLCK, 22 CLCK, 34 CLCK / SUBI #$xxxx,$yy.W — 20 CLCK, 20 CLCK, 32 CLCK / SUBI #$xxxx,$yyyy.L — 24 CLCK, 24 CLCK, 36 CLCK Komut: SUBQ (SUBtract Quickly) Kullanım şekilleri: SUBQ #x,Dy / SUBQ #x,Ay / SUBQ #x,(Ay) / SUBQ

SUBQ #x,-(Ay) / SUBQ #x,d(Ay) / SUBQ #x,d(Ay,Dy) / SUBQ #x,$yy.W / SUBQ #x,$yyyy.L Açıklama: Destination'ın içeriğinden source'ta belirtilen değer çıkarılır. Sonucu destination'da bulabilirsiniz. Bu komut sadece ilk üç biti kapsayan çıkarma işlemleri (1-8) için uygundur. Etkilenen flaglar: ***** Adresleme şekillerine göre harcadığı süre: SUBQ #x,Dy — 4 CLCK, 4 CLCK, 8 CLCK / SUBQ #x,Ay — 8 CLCK, 8 CLCK / SUBQ #x,(Ay) — 12 CLCK, 12 CLCK, 20 CLCK / SUBQ #x,(Ay)+ — 12 CLCK, 12 CLCK, 20 CLCK / SUBQ #x,-(Ay) — 14 CLCK, 14 CLCK, 22 CLCK / SUBQ #x,d(Ay) — 16 CLCK, 16 CLCK, 24 CLCK / SUBQ #x,d(Ay,Dy) — 18 CLCK, 18 CLCK, 26 CLCK / SUBQ #x,$yy.W — 16 CLCK, 16 CLCK, 24 CLCK / SUBQ #x,$yyyy.L — 20 CLCK, 20 CLCK, 28 CLCK Komut: SUBX (SUBtract with X-flag) Kullanım şekilleri: SUBX Dx,Dy Açıklama: Destination data register'ının içeriğinden source data register'ının içeriği çıkarılır. Bu sonuçtan da X flag'ı 1 ise 1 çıkarılır ve sonuç destination data register'ına yazılır. Etkilenen flaglar: ***** Adresleme şekillerine göre harcadığı süre: SUBX Dx,Dy — 4 CLCK, 4 CLCK, 8 CLCK Komut: SUBX (SUBtract with X-flag) Kullanım şekilleri: SUBX -(Ax),-(Ay) Açıklama: Destination adres register'ının gösterdiği adres içeriğinden source adres register'ının gösterdiği adresin içeriği çıkarılarak destination adres register'ının gösterdiği adrese yazılır. İşlemden sonra da her iki adres register'ının içerikleri adresleme genişliğine göre 1, 2 ya da 4 byte azaltılır. Etkilenen flaglar: ***** Adresleme şekillerine göre harcadığı süre: SUBX -(Ax),-(Ay) — 18 CLCK, 18 CLCK, 30 CLCK Komut: SWAP Kullanım şekilleri: SWAP Dy Açıklama: Belirtilen data register'ının içeriğinde üst word ile alt word'un yerlerini değiştirir. Etkilenen flaglar: -**00 Adresleme şekillerine göre harcadığı süre: SWAP Dy — 4 CLCK Komut: TAS (Test And Set) Kullanım şekilleri: TAS Dy / TAS (Ay) / TAS (Ay)+ / TAS -(Ay) / TAS d(Ay) / TAS d(Ay,Dy) / TAS $yy.W / TAS $yyyy.L Açıklama: Destination'un içeriğini test eder (0 ile karşılaştırır) ve C flag'ı 0 ise destination'un 7. bitini 1 yapar. Etkilenen flaglar: -**00 Adresleme şekillerine göre harcadığı süre: Bu komut sadece byte genişliğinde çalışabilmektedir.

CLCK, 26

TAS Dy — 4 CLCK / TAS (Ay) — 14 CLCK / TAS (Ay)+ — 14 CLCK / TAS -(Ay) — 16 CLCK / TAS d(Ay) — 18 CLCK / TAS d(Ay,Dy) — 20 CLCK / TAS $yy.W — 18 CLCK / TAS $yyyy.L — 22 CLCK Komut: TRAP Kullanım şekilleri: TRAP #x Açıklama: 68000'in exception modlarından birine girmesini sağlar. Toplam 16 exception modu (0...15) vardır. Bu komuta rastlanıldığında PC (Program Counter) Supervisor Stack Pointer'ın (SSP) gösterdiği adrese atılır ve bu pointer 4 byte geri çekilir. Bu yeni adrese de Statü Register'ı kopyalanır ve SSP yine 4 byte geri çekilir. Bundan sonra da trap rutinin adresi alınarak o adrese gidilir. Etkilenen flaglar:

Adresleme şekillerine göre harcadığı süre: Komutun işlemesi 34 CLCK sürmektedir. Komut: TRAPV (TRAP if oVerflow) Kullanım şekilleri: TRAPV Açıklama: Overflow flag'ı 1 ise 7 numaralı trap gerçekleştirilir. Aksi halde programa devam edilir. Normal TRAP komutunda olduğu gibi PC ve SR (Program Counter ve Statü Register'ı) SSP'nin gösterdiği adrese atılır. Etkilenen flaglar: Adresleme şekillerine göre harcadığı süre: Trap olduğunda 34 CLCK, olmadığında 4 CLCK. Komut: TST (TeST) Kullanım şekilleri: TST Dy / TST (Ay) / TST (Ay)+ / TST -(Ay) / TST d(Ay) / TST d(Ay,Dy) / TST $yy.W / TST $yyyy.L Açıklama: Destination'ın içeriğini test eder ve bu içeriğe göre gerekli flag'leri yakar ya da söndürür. Test etme işlemi 0 ile karşılaştırmayla aynıdır. Etkilenen flaglar: -**00 Adresleme şekillerine göre harcadığı süre: TST Dy — 4 CLCK, 4 CLCK / TST (Ay) — 8 CLCK, 8 CLCK, 12 CLCK / TST (Ay)+ — 8 CLCK, 8 CLCK, 12 CLCK / TST -(Ay) — 10 CLCK, 10 CLCK, 14 CLCK / TST d(Ay) — 12 CLCK, 12 CLCK, 16 CLCK / TST d(Ay,Dy) — 14 CLCK, 14 CLCK, 18 CLCK / TST $yy.W — 12 CLCK, 12 CLCK, 16 CLCK / TST $yyyy.L — 16 CLCK, 16 CLCK, 20 CLCK Komut: UNLK (UNLinK) Kullanım şekilleri: UNLK Ay Açıklama: LINK komutu ile rezerve edilen bir stack bölgesinin serbest bırakılmasını sağlar. Destination adres register'ının içeriği Stack Pointer'a atılır ve Stack Pointer'ın son adresi destination adres register'ına atılarak stack pointer bir sonraki longword'ü gösterecek şekilde 4 artırılır. LINK ve UNLK komutlarıyla lokal değişkenlerinizi kendiniz için ayırdığınız bir stack'e atarak programınızın fazla karışmasını engelleyebilirsiniz. C ve BASIC'te programlar compile edilirken bu iki komut bir hayli kullanılır. Etkilenen flaglar: Adresleme şekillerine göre harcadığı süre: Sadece long-word genişliğinde çalışan bu komut 12 CLCK sürmektedir.

Evet, sonunda bu uzun komut listesi bitti. Şimdi de koşullandırma komutlarına şöyle bir göz atalım. Amiga'da koşullandırma komutları Bzz, DBzz ve Szz olmak üzere üç tanedir. Bzz ve DBzz komutları koşullu dallanma komutlarıdır. Szz ise belirtilen koşul gerçekleştiğinde reaksiyon göstererek, istediğimiz bir register içeriğini $ff ya da 0 yapar. Bu komutlarda zz yerine çeşitli koşul tanımlamaları gelebilir. Koşul tanımlamaları da 16 tanedir. Bu durumda 16*3=48 tane koşullandırma komutumuz oluyor. İsterseniz bu koşullandırma komutlarına koşul tanımlamalarıyla beraber bir göz atalım: BT, BF, BHI, BLS, BCC, BCS, BNE, BEQ, BVC, BVS, BPL, BMI, BGE, BLT, BGT, BLE, DBT, DBF, DBHI, DBLS, DBCC, DBCS, DBNE, DBEQ, DBVC, DBVS, DBPL, DBMI, DBGE, DBLT, DBGT, DBLE, ST, SF, SHI, SLS, SCC, SCS, SNE, SEQ, SVC, SVS, SPL, SMI, SGE, SLT, SGT, SLE

Şimdi de dilerseniz bu komutlarla ilgili örneklerimize bir göz gezdirelim. Bütün bu örnekler sadece komutları öğrenebilmeniz içindir. Uygulamada ufak tefek ekler gerekebilir.

1. BT komutu sonuç mantıksal olarak True (doğru) olduğunda dallanmamızı sağlar. Mantıksal doğru, 1 değeridir. Aşağıdaki örnekte test edilir. True olduğunda TRUE label'ına dallanılır. Orada da d0'ın içeriği silinmektedir. move.l #1,d0 tst.l

bt True
rts
True: cir.l d0

2. BF komutu ise bir önceki işlemin sonucu False (yanlış) ise, istenilen yere dallanmamızı sağlar. Mantıksal False, 0 değerine eşittir. Aşağıdaki örnekte d0 test edilir. Sonuç False ise FALSE label'ına gidilir. Orada da d0'a 1 değeri yazılmaktadır.

move.l — #0,d0
tst.l d0
bf False
Tits
False: move.l — #1,d0
rts

3. BHI komutu son karşılaştırma işlemine göre sonuç yüksekse dallanmayı gerçekleştirir. Aşağıdaki örnekte d0'a 50, d1'e de 75 değeri yazıldıktan sonra d0 ile d1 karşılaştırılır. d1 register'ının içeriği d0'ın içeriğinden büyükse (ki büyük) programa HIGHER label'ından itibaren devam edilir. Burada d0 ile d1 register'larının içerikleri değiştirilerek programdan OUT label'ına dallanarak çıkılır. Zira OUT label'ında bir rts komutumuz bulunmakta!

move.l — #50,d0
move.l — #75,d1
cmp.l d0,di
bhi Higher
Out: — Tts
Higher: exg d0,di
bra Out

4. BLS komutu, karşılaştırmanın sonucu eşit ya da daha küçükse dallanmamızı sağlar. Aşağıdaki örnekte d1 register'ının içeriği, d0 register'ının içeriğini geçinceye kadar test işlemi tekrarlanır. d1 register'ının içeriği 51 değerine ulaştığında (d0'ın içeriği+1) programdan çıkılır.

move.l #50,dü
move.l #40,dl
Test: cmp.l —
bis LowSam
rts
LowSam:add.l #1,dl
bra Test

rts 5. BCC komutu Carry flag'i sönükse dallanmamızı sağlar. Aşağıdaki örnekte ilk önce d1 register'ının 15. biti clear edilmekte ve ardından da LSL ile d0'ın içeriği bir bit sola kaydırılmakta. LSL komutunda taşan bit hem C, hem de X flag'ini etkilemekte. Fakat bizi sadece C flag'ini etkilemesi ilgilendirir. Clear edilmiş 15. bit bu durumda carry flag'ine kopyalanır. BCC komutu da carry flag'inin sönük olmasına baktığından programa direkt olarak CSET label'ından devam edilir. Burada da d1 register'ının 0. biti silinerek programdan çıkış sağlanmakta.

belr #15,d0
#1,d0
bec CSet
ris
CSet: #0,d1
rts

6. BCS komutu ise Carry flag'inin yanık durumda olduğu zamanlarda dallanmayı gerçekleştirir. Aşağıda d0'ın 15. biti yakılır ve LSL ile bu bitin carry bitine kopyalanması sağlanılır. Carry yanık durumda olacağından da BCS komutu programın CCLEAR label'ından devam etmemizi sağlar. Burada da d1'in 0. biti silinerek programdan çıkış sağlanmakta,

bset #15,d0
İsl.w #1,d0
bes CClear
rts
CClear: bset #0,d1

rts 7. BNE komutuyla son karşılaştırma işleminde sonucun belirtilen değere eşit olup olmadığı kontrol edilir. TST komutu ile beraber kullanıldığında belirtilen register'ın içeriğinin 0 olup olmadığı kontrol edilebilir ve 0'dan farklı durumlarda istediğimiz label'a dallanma gerçekleştirilir. Aşağıdaki örnekte d0'a herhangi bir değer (0'dan farklı!) yazılmakta ve TST ile bunun 0 olup olmadığı kontrol edilmekte. Yazdığımız değer (#$1234) 0'dan farklı olduğundan, programa NEQUAL label'ından devam edilir. Burada da d0 register'ının içeriği silinmektedir. Sonuçta programın başında d0 register'ına ne yazarsak yazalım, program çıkışında d0 register'ında 0 değeri bulunacaktır.

move.l — #$1234,d0
tst.l dO
bne NEgual
Tts
NEgual: d0
rts

leştirir. Aşağıdaki örnekte register'ı kontrol edilir ve bu register'ın içeriği pozitif bir sayıysa register içeriği silinir. Negatif olduğu durumlarda da içerik aynen kalır.

move.l — #50,d0
tst.l dO
bpl Pos
Pos: cir.l dO
Tts

12. BMI komutu da BPL gibi çalışmaktadır. Aralarındaki tek fark, BMI'nin negatif değerlerde dallanma gerçekleştirmesidir. Aşağıdaki örnekte d0'ın içeriği negatif olduğu zaman NEG label'ına dallanılır ve burada da d0'ın içeriği silinir.

8. BEQ komutu son karşılaştırma işleminin sonucunun belirtilen değere eşit olduğunda istediğimiz label'a dallanmamızı sağlar. Aşağıdaki örnekte d0'a #$1234 değeri yazıldıktan sonra, bu register'ın içeriği #$1234 değeri ile karşılaştırıldığından sonuç eşittir çıkacaktır ve programa EQUAL rutininden devam edilecektir. Burada da d0 register'ı -1'e ulaşana kadar bilgisayarımızın Power Led'ini kapatıp açıyoruz. DBF komutu her seferinde d0'ın içeriğini otomatik olarak 1 azaltmakta ve -1'e varıldığında da döngüden çıkmayı sağlamakta. Eğer d0'ı kendisinden farklı bir değer ile karşılaştırırsak, programın NEQUAL satırına gitmemiz ve d0'ın içeriğini silmemiz sağlanacaktır.

move.l — #$1234,d0
cmp.l #$1234,d0
bne NEgual
beg Egual
Egual: behg #1,$bfe001
dbf d0,Egual

TİS NEQUAL: dü Tts E 9. BVC komutu Overflow flag'i (V-flag) 0 ise belirtilen label'a dallanmamızı sağlar. Bildiğiniz gibi Overflow flag'i taşma olup olmadığını haber verir. Bu durumda BVC yardımıyla taşma olmadığında dallanma gerçekleştirebilirsiniz. Aşağıdaki örnekte ilk önce d0'a -43 yazılmakta, ardından da bu değere 40 eklenmektedir. Taşma olabilmesi için değere en az 43 eklenmesi gerektiğinden Overflow flag'imiz sönük kalacaktır ve program da NOPE label'ından devam edecektir. Burada da d0 register'ımızı temizliyoruz. Taşma olsaydı Power Led'inin konumu değişecekti.

move.l — #-43,d0
add.l #40,d0
bvc Nope
behg #1,bfe001
Tİs
Nope: d0
Tits

10. BVS ise bir önceki komut olan BVC'nin tersi işlem yaparak Overflow flag'inin yanık olduğu durumlarda dallanma gerçekleştirecektir. Deminki örneği biraz değiştirmemiz sayesinde aşağıdaki örneği elde ettik. Burada d0'ın içeriği olan -43'e 100 değerini ekleyerek taşma flag'imizin yanmasını sağladım. BVS komutu ile de taşma flag'i 1 olduğunda (ki 1), YEPP label'ına dallanma gerçekleşmekte. YEPP label'ında da d0 register'ının içeriğini silmekteyiz. Taşma olmasaydı programın işlemesi BCHG komutundan devam edecekti ve Power Led'imizin konumu değişecekti.

move.l — #-43,d0
add.l #100,d0
bvs Yepp
behg — #1,bfe00l
Yepp: cir.l d0

11. BPL komutu, TST ile beraber kullanıldığında register içeriğinin pozitif bir değer olup olmamasını kontrol ederek pozitif olduğu durumlarda bizim istediğimiz bir label'a dallanma gerçek-

move.l — #-76,d0
tst.l d0
bmi Neg
Tts
Neg:  cirl d0

13. BGE komutu, karşılaştırma sonucu hangisinin diğerinden büyük ya da eşit olduğunu öğrenmemizi sağlar. Aşağıdaki örnekte d0 ve d1 register'larının içerikleri karşılaştırılıyor. d1'in içeriği d0'ın içeriğinden (-100) daha büyük olduğuna göre şartımız gerçekleşmekte ve programa VAGIN label'ından devam edilmekte. Burada da iki register'ın içerikleri değiştirilerek programdan çıkılmakta.

move.l — #100,d0
move.l —
cmp.l
bge Vagin
Tts
Vagin: exg dO,d1
Tts

14. BLT komutu CMP işleminden sonra destination register'ı içeriğinin source register'ı içeriğinden daha küçük olduğu durumlarda dallanmamızı sağlamakta. BLT komutu BGE'nin tamamlayıcı komutudur. Aşağıdaki örnekte d1'in içeriği d0'dan küçük olduğundan, programa VAGIN label'ından devam edilir. Burada her iki register içeriği de silinecektir.

move.l — #512,d0
move.l —
— d0,di
bit Vagin
Tts
Vagin: d0
cir.l di

rts 15. BGT yardımıyla CMP komutundaki 2. register içeriğinin 1. register içeriğinden büyük olup olmadığı kontrol edilebilir ve sadece büyük olduğu durumlarda belirtilen label'a dallanma gerçekleştirilir. BGE komutu için vermiş olduğum örnek, aynen bu komut ile de kullanılabilir. Sadece 4. satırı değiştirmeniz yeterlidir. iü

16. BLE komutu da BGT'nin tamamlayıcısıdır ve örnek olarak da BLT komutu için vermiş olduğum örneği kullanabilirsiniz. DBzz komutları, Bzz komutlarının tam tersi işlemi yaparlar; belirtilen şart gerçekleşmişse programa kalınan yerden devam ederler. Şartın gerçekleşmediği her durumda da verilen label'a dallanmanız sağlanır. Szz komutları, Bzz ve DBzz'den farklı olarak dallanma yaratmazlar. Sadece şart gerçekleşmişse belirtilen register ya da adres içeriğini -1 yaparlar. Diğer durumlarda belirtilen register ya da adres içeriği 0 olacaktır. Artık komutlarla ilgili tüm sorularınızı cevapladım. Umarım bu kısa komut listesi işinize yarar. Artık bu seferlik de hoşçakalın demekten başka şey kalmıyor geriye. Bir dahaki ay artık Gelişmiş Assembler köşesine biraz ağırlık vermek istiyorum. Şimdiden ağzınızı sulandırayım; gelecek ayki yazımda ufak bir intro rutini vermeyi planlıyorum. Biraz değişiklik herkesin hakkı. Haydi hoşçakalın ...