Bu sayfadaki yazılar
Sayfanın metni
Sayfa 37
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.
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 36
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: