Amiga Dunyasi - Sayi 19 (Aralik 1991).pdf - Retro Dergi
Amiga Dunyasi - Sayi 19 (Aralik 1991).pdf - Retro Dergi
Amiga Dunyasi - Sayi 19 (Aralik 1991).pdf - Retro Dergi
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
DERLEYİCİLER<br />
gerekmekte.<br />
Direkt adreslemede bu değişmekte. Şayet bir adresteki değeri<br />
'.B' takısını kullanarak etkilersek, o adresteki byte değişir. \W'<br />
takısı o adresteki ve adresten sonraki byte'ı değiştirir. \L' takısı<br />
da o adreste yer alan longword'u etkileyeceğinden, adresten sonraki<br />
4 byte birden komutumuza göre değişir. Aşağıda bu konuyla<br />
ilgili basit örnekler yer almakta :<br />
CLR.L D0<br />
==> D0 içeriğini komple temizler.<br />
MOVE.W D5.D3 ==> D5'in alt word'unu (bit 0-bit 15)<br />
D3'e kopyalar.<br />
MOVE.W S50000.D2 ==> $50000'de yer alan vvord'u (ilk<br />
iki byte) D2'ye kopyalar.<br />
MOVE.L $42000,A0 ==> $42000'de yer alan longword'u<br />
A0'a kopyalar.<br />
8. Örnek 10.1'de 'MOVE.L DO.INTBASE' komutu var, sonra<br />
BEQ EXIT3' komutu var ama CMP komutu yok, o zaman karşılaştırma<br />
nasıl olacak<br />
C. Birçok komut işlem yaparken aynı zamanda flag'leri de etkiler.<br />
Bu yüzden bu tür bir komut kullandığınızda ekstradan bir<br />
CMP komutu daha kullanmanız gerekmez. Flag'leri etkileyen<br />
komutlardan bazıları: MOVE, AND, ADD, ASL, BSET, BCLR,<br />
BTST, CMP, DIVU, EOR, LSR, MULU, NEG,JVOT, OR, ROL,<br />
RTE, RTR, SUB, SWAP, TAS, TST.<br />
9. Son örneklerde 'BEQ.L' görülüyor, longword olması ne işe<br />
yarar Bir de mesela BEQ.S' deniyor. '.S' neyi ifade ediyor<br />
C. Bu takılar arasında ufak bir fark var. 512 byte'lık sınırlar<br />
içinde yakın bir label'a dallanmak istediğinizde, bunu ister<br />
BEQ.S, isterseniz de BEQ.L komutuyla yapabilirsiniz. BEQ.S<br />
komutunu kullandığınızda assemble edilmiş programda bir word<br />
tassaruf edersiniz. BEQ.S komutu ve ardından gelen label hafızada<br />
bir word yer kaplar. Oysa BEQ.L kullandığınızda, bu 2 word<br />
olmakta. Gördüğünüz gibi pek fazla birşey farketmiyor. Dilerseniz<br />
Seka'da assemble ederken 'O' opsiyonunu kullanarak Sekanın<br />
tüm bu takıları yerleştirmesini sağlayabilirsiniz. Bu takılar<br />
tüm dallanma komutları için geçerli.<br />
10. 'MOVE.L 4A6' gibi durumlarda adresin atanacağı register<br />
far keder mi<br />
C. Hayır. A6 register'ının kullanılış nedeni, herkesin bu register'ı<br />
kullanmasıdır. Dilerseniz A0'ı da kullanabilirsiniz. Ama bu<br />
durumda JSR -$nnn(A6) komutlarını da değiştirmeniz gerekmekte.<br />
Şimdiye kadar hiçbir programda farklı bir adres register'ının<br />
kullanıldığını görmedim. Ama bu kullanılmaz anlamına gelmez.<br />
//. 'JMP -$228(A6) neden (A6) ile toplama gereği duyuluyor,<br />
direkt adres yazılsa olmaz mı Yoksa forman mı öyle<br />
C. Bunun sebebi library adreslerinin hafızada düzenlenişi ile ilgilidir.<br />
Bütün <strong>Amiga</strong>'larda yazılan programların hatasız çalışabilmesi<br />
için sistemi hazırlayan programcılar biraz dolaylı bir yöntem<br />
kullanmışlar. Fakat bu dolaylı yöntemin en büyük avantajı,<br />
yeni bir KickStart versiyonu çıktığında sorun olmadan her programın<br />
çalışabilmesidir. Bu nasıl gerçekleşmekte Bunu anlamak<br />
için library'lerin hafızadaki durumlarına kısaca bir göz atalım.<br />
Bütün çok kullanılan library'ler hafızada sabit olarak bulunmaktadırlar.<br />
Library fonksiyonlarının yerleştiği adresler, $fc0000<br />
ve yukarısıdır. Tabii bu, yeni <strong>Amiga</strong>'lar olan A-3000 ve A-<br />
3500'lerde değişmekte. Fakat şu an herkesin normal <strong>Amiga</strong>'lardan<br />
(KickStart v 1.2 ya da vl.3) kullandığını farzedelim. Bir library'i<br />
açtığımızda aslında yapılan işlem bir tablonun RAM'e<br />
kopyalanmasıdır. Bu tablo aslında bir dallanma tablosudur. Burada<br />
o library'nin bütün fonksiyonlarının gerçek adreslerine dallanan<br />
JMP komutları görülmekte. KickStart versiyonun değiştiğini<br />
kabul edelim. ROM'daki bazı rutinler değişmiş olacak. Bazıları<br />
uzamış, bazıları da kısalmış olacak. Bu durumda bütün library<br />
fonksiyonlarının adresleri değişecek. Eski bir <strong>Amiga</strong>'da direkt<br />
adresler kullanılarak yazılan bir program, tümüyle hatalı çalışacaktır.<br />
Fakat sistemi yaratanlar, dallanma tablosu kullanarak sadece<br />
tablodaki adresleri değiştirmekle tüm uyumsuzluğu ortadan<br />
kaldırmışlar. Library'lerden herhangi birini açtığımızda, bu library'nin<br />
başlangıç adresi bize D0 register'ı sayesinde aktarılıyor.<br />
Base adresten sonraki değerler o library'e ait bazı önemli datalardır.<br />
Biz bu dataların tümüne BASE STRUCTURE adını veriyo-<br />
ruz (ExecBase Structured gibi). Base adresinden ÖNCE ise, tüm<br />
dallanma tablomuz yer almakta. Bu dallanma tablosuna da erişmek<br />
istiyorsak, -nnn(a6) adresleme şeklini kullanmalıyız. Tabii<br />
aynı şekilde şöyle de yazabilirdik:<br />
move.I 4,a6<br />
sub.l #$-228,(a6)<br />
jmp (a6)<br />
Fakat bu, hem programımızı boşu boşuna uzatacak, hem de her<br />
seferine a6 register'ının içeriğini bozacaktır.<br />
12. BSR komutunun görevi nedir<br />
C. BSR ve JSR komutları dönüşlü dallanmayı sağlarlar. Bunun<br />
anlamı şudur: İlkönce komutun yer aldığı satırın altındaki satırın<br />
adresini stack'e atar. Sonra komuttan sonra verilen label'a ya da<br />
adres'e dallanır. Oradaki tüm işlemleri gerçekleştirdikten sonra,<br />
RTS (ReTurri form Subroutine) komutuna rastladığında stack'teki<br />
adresi alır ve o adrese zıplar. Altrutinlerden RTS yerine yine<br />
bir dallanma komutu kullanırsak, dönüş adreslerinin her seferinde<br />
stack'e atıldığını unutmayın. Altrutinden RTS yerine JMP ya<br />
da BRA gibi bir komutla ana rutine dönerseniz, stack'teki adres<br />
silinmeyecektir. Ana programınızın sonunda da RTS komutuna<br />
Tasladığında stack'teki adrese dallanmak isteyecektir. Bu da hata<br />
yaratacak, belki de bilgisayarınızı crash ettirecektir.<br />
13. 'MOVE.L D0,WINBASE'deki window durum bilgileri<br />
nedir<br />
C. Library açtığımızda D0 register'ında bu library'nin base adresi<br />
yer alır. Bu base adresinden sonra gelen tüm datalar o library<br />
hakıkında önemli bilgiler taşıyan LIBBASE STRUCTURE'una<br />
aittir. Daha ilerde bu structure'lan detaylı olarak inceleyeceğiz.<br />
Biz şimdilik library base adresini, o library'e ait fonksiyonlara<br />
erişmek için kullanıyoruz. Library base adresinden önce gelen<br />
dallanma tablosu sayesinde library fonksiyonlarına erişebiliriz.<br />
14. 'DC yani data satırı ile kullanılan .L', '.W ve '.B' takıları<br />
neyi değiştirir Önemli olan onu oradan nasıl aldığımız değil<br />
mi<br />
C. Data satırlarında 'DC komutundan sonra kullanılan takı ile<br />
sayıların takıya göre aynı bit uzunluklarında olmaları sağlanmakta.<br />
Eğer bir 'DC.W' satırı kullanırsak ve MOVE.L ile buradan bir<br />
sayı almaya kalkarsak, alınan sayı iki word olacaktır. Oysa data<br />
satırlarında DC.L kullandığımızda sayımızı doğru olarak okuyabiliriz.<br />
Aynı şekilde data satırlarında DC.L kullanıp MOVE.B ile<br />
ilk sayıyı okuduğumuzda, genelde 0 elde ederiz. DC.L ile her sayıya<br />
4 byte rezerve edilmekte ve sayımız 256'dan küçükse (byte<br />
sınırını aşmıyorsa) longword'umuzdaki ilk üç byte değişmemektedir.<br />
Eğer sayı word sınırını aşmıyorsa, bu sefer longword'daki<br />
ilk iki byte 0 değerini alacaktır.<br />
Umarım Tolga arkadaşımızın tüm sorularını anlayabileceği bir<br />
şekilde cevapladım. Bu sorular sayesinde bazı bilinmeyenlere de<br />
ışık tutmaya çalıştım. Fakat hala kafanızı kurcalayan sorunlarınız<br />
olduğunda bana yazmaktan çekinmeyin. Ehh, artık bu ayki bölüme<br />
ne yazık yer kalmadı. Bu yüzden bu ay sadece programımızı<br />
yayınlayacağım. Programın açıklamasını da artık gelecek ay göreceğiz.<br />
Ayrıca programı açıkladıktan sonra gelecek ay tüm assembler<br />
komutlarının listesini ve kullanılışlarını vereceğim.<br />
**************************************************************<br />
** AMIGA DÜNYASI AMIGA ASSEMBLER KURSU **<br />
** INTUITION LIBRARY - WINDOW EXAMPLE **<br />
** ORNEK <strong>19</strong>.1 **<br />
*************************************************<br />
START: movem.l d0-d7/a0-a6,-(sp)<br />
bsr.s IMTLIBS<br />
bsr.L IMTSCREEN<br />
AMIGA DÜNYASI 35