Makine Dili
Retro bilgisayarGeçen ay başladığımız makine dili kursu tüm hızıyla (bilenler için tüm yavaşlığıyla) devam ediyor. Eğer geçen bölümü kaçırdıysanız, sayı düzenleri (özellikle ikilik, onaltılık ve onluk), bitler, baytlar (sekiz bit) ve Nibble'lar (dört bit) hakkında başka bir yerden bilgi edinin. Bu sayıda, makine dili için temel oluşturacak bilgisayar kavramlarını açıklayıp, bu konuda BASIC örnekler vereceğim. Öğrenmeniz gereken kavramlardan ilki:
Adresler
BASIC programcıları, bilgisayarın belleği konusunda pek fikir sahibi değillerdir genelde, Çünkü BASIC programlar satırlar halinde yazılır ve birbirinden ayrı elemanlar olarak görünen satırlar sanki belleğin tek bir elemanı gibi görünürler. Bunun sonucu olarak BASIC programcıları belleği uzun satırlardan oluşmuş gibi düşünürler genelde.
Oysa bilgisayarın belleği dediğimiz şey, sadece 0-255 arası sayıları tutabilen 65536 küçük kutucuktur. Bilgisayarınızın beyni olan 6510 CPU (Central Processing Unit - Merkezi İşlem Birimi), onaltı ayrı telden (Adres Hattı) 1 ve O sinyalleri yollayarak bu kutucukların herhangi birine erişir. Daha sonra başka bir yerde bulunan sekiz tel (Data Hattı) yardımıyla bu kutucukta yer alan bilgiyi alır ve gerekli şekilde işler. Adres hattının 16 telden oluşması sebebiyle birbirine karışmayan 2x 65536 adet kutucğu rahatça adresleyebilir CPU'nuz. Her kutucuğun tutabileceği maksimum değer de data hattının genişliğiyle belirlenir. Yani 2 Xx 8-256 değişik değeri bir adres kutucuğunda tutabilirsiniz. CPU'nuz adres hatlarına belli bir değer koyarak buradaki değeri alır ilk olarak. Bu aldığı değeri gerekli şekilde işler ve adres hattındaki değeri bir artırarak bir sonraki kutucukta yer alan değeri elde eder. Bu yüzden, CPU için bir anlamı olan bayt serileri bellekte her zaman ardışık olarak yer alır.
Bilgisayarın belleğini oluşturan kutucuklar, adres hattı sayesinde birbirinden ayrılabilirler. Bilgisayarla bizim aramızda çelişki olmaması için bu adreslere biz de bilgisayarın verdiği isimleri veririz. Genel olarak onaltılık düzen kullandığımız için de bellek kutucukları $0000-$FFFF arası isimler alırlar. Adreslere erişmek için BASIC'i kullanıyorsanız bu kutulara 0-65536 arası değerler sayesinde erişebilirsiniz. Tablo 1'e bakarak bu kutucukların sembolik olarak ne şekilde dizilmiş olduğunu ve belleğe nasıl yerleştiğini görebilirsiniz. Tabii ki bu kutular tek başlarına bu değerleri aklında tutarak hiçbir yere varamaz. Bu yüzden belli adres grupları belli işleri üstlenmiştir. Mesela $D020 — 53280 adresinde yer alan değerin düşük değerlikli nibble'ında (ilk dört bitinde) yer alan sayı, çerçevenin rengini belirler. Bu yüzden iyi görüntüler oluşturmak için mutlaka belli adreslerde ne bulduğunu bilmelisiniz. Tabii ki oturup adres ezberleyeceğim diye kafayı üşütebilirsiniz.
$0000
$0001
$0002 Bit | Bit
$0003 LAN BA
Bit | Bit | Bit | Bit | Bit
$0004
$0005
$ŞEFFA
$EFEB
$EFEC
ŞEFED
ŞEFFE
SFFFE
Tablo-1: Adreslerin belleği oluşturacak şekilde dizilişleri. Bi fikir oluştursun diye çizilmiştir. Gerçek adreslerin fiziksel dizilişleriyle alakası yoktur. Şekilde de gördüğünüz gibi her adreste sekiz bitlik data
il sadece kafanızda bir
Adres kavramı için daha fazla şey söylemek istemiyorum. Ama bu yazının sonlarına doğru genel bir bellek hatasından bahsederek önemli adres gruplarını size göstereceğim, Şimdi gelelim ikinci konumuza:
Ne Yapar Bu CPU?
CPU dediğimiz şey, onlarca bacağa sahip bir entegreden başka bir şey değildir. Kendi içinde, işlerini görmek için kullandığı “register” adı verilen birkaç değişkeni vardır. Bu entegrenin tek yaptığı iş (basitleştirilirse) kısımlarında hiç durmadan belleğe erişip datalar almak, bu aldığı datalara göre işlem yapmaktır. Adreslere erişmek için PC (Program Counter - Program Sayacı) adı verilen bir değişkeni kullanır. Bu register (değişken' tam anlamını vermediği için artık değil 'register' kullanacağım) onaltı bitten oluşur ve $0000-$FFFF arası bir adresi gösterir. Bu adresteki değeri alır almaz bir artar ve CPU'nun zamanı gelince bir sonraki adreste yer alan bilgiyi almasını sağlar. Bu değişken sayesinde “makine dili adını verdiğimiz bayt dizileri çalışabilir. Örneğin, PC $8000'i gösterirken bir bayt alır. Bu bayt CPU'ya, bir sonraki adresten alacağı sekiz bitlik datayı kendi değişkenlerinden biri olan A'nın değerine eklemesini söyler. CPU bir artmış olan PC ($8001) yardımıyla bir sonraki bayta erişir ve bu baytı A'ya ekler. artık komutun işletimi bitmiştir. Ama CPU”nun işi bitmez! PC çoktan bir artırılmış olduğu için $8002'de yer alan bayta erişir ve bu baytın kendisine söylediği işi yapmaya hazırlanır. Kısacası her şeyin efendisi gibi görünen CPU, bellekte yer alan bilgiler tarafından yönetilen basit bir köleden başka bir şey değildir. Bellekte yer alan bu datalar da aslında makine dili programından başka bir şey değildir. Ama tutup da $EA baytının CPU'ya “Hiç bir şey yapma ve bir sonraki komutu al!” emrini verdiğini öğrenmeye çalışmayahm diye bu baytlara sembolik komut isimleri verilmiştir. Mesela deminki $EA baytının sembolik ismi NOP'tur (NOP — No OPeration - İşlem Yok). “İyi de şimdi de baytlar yerine üç harflik sembolik isimleri ezberlememiz gerekecek!” diyenleriniz olacaktır. Bu konuda haklısınız, ama sembolik isimler sayesinde 256 baytın tek tek anlamlarını ezberlemek yerine on-onbeş komut grubunun sembolik isimlerini öğrenmeniz yeterlidir. Bu konuda hemen paniğe kapılmayın, zamanı geldikçe, kullana kullana bu komutları kolayca öğreneceksiniz. Hatta makine diline bu kadar değinmek bile şimdilik yeterli.
RAM Kim, ROM Ne Yapar?
Bilgisayar terminolojisinde sık sık kullanılan iki terim RAM ve ROM'dur. Bu ikisi, belli bir adreste yer alan bellek gözesinin en temel özelliğini belirler. ROM, yani Read Only Memory (Sadece Okunabilir Bellek), adının da belirttiği gibi sadece okunabilir. Buraya yazmaya kalkarsanız hiç bir sonuç elde edemezsiniz çünkü bilgiler bu bölgelerde yer alan entegrelere elektronik olarak kazınmıştır. Bu sayede, bilgisayarı kapatsanız da bu bilgileri kaybetmezsiniz. ROM, genel olarak bilgisayarın diğer cihazlarla (teybiniz ya da disk driver'ınız gibi) alış verişi kontrol eden makine dili rutinleri içerir. Bunun yanında BASIC yorumlayıcısı adı verilen program da ROM'un bir tarafında yazılıdır. ROM'larda bulunan programlar, tamamıyla makine diliyle yazılmışlardır. Sadece belli bölgelerde hata mesajları, komutlar, vb. için datalar yer alır. RAM (Random Acces Memory - Rastlantısal erişilebilir bellek) ise hem okunabilen, hem de yazılabilen bölgeleri temsil eder. Bu alanlar bilgisayara verilen elektrik kesildiği anda içeriklerini kaybeder ve bilgisayarın her açılışında tekrar bilgi yazılmalıdır. bilgisayarlara asıl gücünü veren bellek bunlardır, çünkü RAM'e istediğiniz gibi program yazabilir, bilgisayarınızın istediğiniz (ve programlayabildiğiniz tabii ki) her işlemi yapabilmesini sağlarsınız. Yukarıda söyledikle- RAM'de yer alan bilgilerin yok olmasının tek sorumlusunun elektriğin kesilmesi olduğu sonucuna varabilirsiniz. Hatta daha da ileri giderek, bilgisayar kapatıldığında bile RAM'lere 5 Volt vererek içeriklerini koruyabileceğinizi düşünebilirsiniz, ama ne yazık ki bu mümkün değildir. Çünkü RAM'lerin içeriklerinin aklınızın alamayacağı bir hızla, sürekli tazelenmesi gereklidir. Bilgisayarınızın içinde yer alan donanımı bu işi size hissetirmeden yapar.
Sadece RAM ve ROM mu?
Aslında bilgisayarınızın belleğinde sadece RAM ve ROM varmış gibi görünüyor. Ama, daha önce de bahsettiğim gibi CPU'- nuzun bir sürü yardımcısı varır. Mesela VIC adı verilen çip, grafik işlerini düzenler ve bellek tazelenmesi görevini üstlenir. Bellek de kendisine $DO00-$D400 arasını ayırmıştır. bu bölgede RAM değil. VIC'in şahsi registerleri bulunur. Bu sayede değer verdiğiniz zaman VIC çerçeve rengini istediğiniz gibi değiştirebilir. Aynı şekilde, bilgisayarınız ses düzenini kontrol eden SİD $D400- $D800 arasında yuvalanır. SID registerlarının ilginç bir özelliği daha vardır. $D400- $D800 arasına (bir iki adres dışında) sadece yazabilirsiniz. Bu bölgeyi okumaya kalktığınız zaman saçma sapan değerlerle karşılaşırsınız. Belleğin bir kısmını işgal eden çipler arasında CIA adı verilen giriş-çıkış hizmetleri de vardır. Bu çiplerden iki tane vardır. Bunlardan biri klavye ve joystick'i okumaya çalışırken, diğeri de kaset ve disk iletişim hatlarına kumanda eder. Bunlar dasırasıyla $DC00-$DCFF ve $DO0-$DDEF arasındaki bellek adreslerinde yer alırlar. Bunlardan başka, VIC'in dolaylı olarak kontrol ettiği bellek alanları vardır. Bu bölgelere size çaktırmadan erişen VİC, elde ettiği değerleri kullanarak görüntüyü oluşturur. Bilgisayarınız açıldığı anda yazıların yazıldığı karakter ekranı böyle bir bölgedir ve $0400-$07FE arasında yer alır. VIC'i, başka bölgelerden veri almak üzere programlamanız da mümkündür, ama VIC'i programlamayı öğrenmek için çok acele etmeyin, çünkü önce makine dili program yapmayı öğrenmeliyiz. Burada bahsedilmeye değer bir bellek bölgesi daha kaldı: Renk RAM'i. $D800-$DCOO arasında yer alan bu bölgeyi diğerlerinden ayıran özellik, her adreste dört bit saklayabiliyor olması! Bu dört biti kullanarak Commodore'un 16 renginin hangisini iztediğinizi kolaylıkla belirtebilirsiniz. Bu adresleri okuduğunuz zaman hiçbir değişiklik farketmezsiniz, sadece okunan tüm değerler $EF0- $EF arasındadır. Buraya yazdığınız baytla- Tın da üst dört biti hiç ciddiye alınmaz. Normal bilgisayarda, bir bellek adresinde sadece ve sadece bir değer saklanabilir. Yani bir adreste hem RAM hem de ROM saklanamaz. Ama Commodore 64'ün harika tasarımı sayesinde, tüm ROM'ların altında RAM bulunur. Yani istediğiniz anda bilgisayarınızı 64K RAM olarak kullanabilirsiniz. Tabii bunu yapmak hiç de kolay değil. Bu yüzden, bu konuyu çok sonra tekrar açacağım. İlk aşamada, normal bir kullanıcının göreceği bellek haritasını bilmeniz size yetecektir. Eğer bu yazının sonunda verdiğimden daha detaylı bir bellek haritası vetirsem, bu sadece kafanızı karıştırır. En iyisi biraz sabırlı olun ve 64K RAM'le başa çıkabilecek hale gelene kadar bekleyin. Ama bu işi hemen öğrenmek istiyorsanız, Teleteknik yayınlarından Programcının El Kitabı'- nda bu konu tüm detayıyla ele alınıyor. Bilgisayarınızın RAM haritasını çıkartmadan önce, son bir konuya daha değinmek istiyo- Tum:
Bilgisayarın Hızını Ne Belirler? Sık sık “Commodore 64 1MHz'dir. AMIGA 7.14 MHz'de çalışır” gibi cümlelere her zaman karşılaşırsınız. MHz (MegaHertz)'in
$0000-$03FF: Sistem değişkenleri. Sakın buraları ellemeyin. Sistem gidıklanıyor.
$0400-$07E7: Karakter ekranı bilgileri. Ekranda görünecek harfler burada saklanır (siz değiştirmezseniz).
$07E8-$07F7: Kullanılmaz. Sekiz baytlık data alnı olarak kullanabilirsiniz.
$07F8-$07FF: Spriteların grafik datalarının bellekteki yerini belirleyen baytlar. Sonra sık sık kullanacaksınız.
uçabilir.
$0800-$9FFF: BASIC program, değişken ve dizi belleği. Eğer üst sınırı aşağı çekmezseniz programlarınızı buralara yazmayın,
$A000-$BFFF: BASIC yorumlayıcısı rutinlerini içeren ROM. Altındaki RAM'i daha sonra kullanacağız.
$C000-$CFFF: Bellekte tehlikesizce kullanılabilen (neredeyse) tek bölge. Programların çoğu burada çalışacak şekilde yazılır.
$D0O00-$D3FF: VIC registerlerinin yuvası.
$D400-$D7FF: SID registerlerinin adesleri.
leri.
$D800-$DBFF: Renk RAM'ini oluşturan dört bitlik bellek adresokumakta kullanılır.
$DC00-$DCFF: CIA#I registerleri. Klavye ve joystick portlarını
CLAH2 registerleri. Kaset ve disketten sorumludur.
alan.
$DE00-$DFFF: Gelecekte eklenebilecek çipler için giriş/çıkış alanı. Yani çipin registerları için ayrılmış kullanılamayacak durumda bir rutinlerinin yer aldığı — yer.
$E000-$FFFF: KERNAL ROM. Tüm klavye, kaset, okuma
Bilgisayarın hayati — organı.
Tablo-2: Commodorc'unuzun bellek haritası. Tabii ki bulabileceğiniz en basit haliyle. Makine dilinde ustalaştıkça, dahâ karmaşık bellek haritalarına bu satırlarda rastlayabileceksiniz.
bilgisayarın hızını belirten bir birim olduğunu artık öğrenmişsinizdir. Ama MHZ'in gerçekte ne olduğunu hiç merak ettiniz mi? Merak etmiyorsanız da kurtuluşunuz yok, çünkü bu garip yazıda bu konuya da değinmeden edemeyeceğim. Umarım kafanızı fazla karıştırmam(!). Yazının başlarında CPU'nun PC yardımıyla bellekten veri alıp durduğunu söylemiştim. Ama orada bahsetmediğim bir nokta vardı. Sanırım bu sizin de kafanızı kurcalamıştır. CPU'nun PC'yi neye göre artırdığını ya da belleği ne zamanlar okuduğundan hiç bahsetmedim. Aslında CPU bu zamanlama konusunda bile pek serbest değildir. Sistem saati adı verilen sinyali bacaklarından biriyle inceleyen CPU, bu saatin belli anlarında belli işleri yapmak üzere hazırlanmıştır. CPU hızını belirleyen MHz'de aslında bu saatin frekansından başka bir şey değildir. Tabii ki CPU'nun uyduğu bu saat ne kadar hızlı çalışırsa, bilgisayarınız işlemleri o kadar hızlı yapar. Hemen ““O zaman saat frekansını artıralım!” diye atlamayın. Bilgisayarınız daha hızlı bir şekilde güvenlik içinde çalışabilseydi, Commodore firması bu işi sizden önce yapardı. Saat frekansını sınırlayan en önemli faktör, belleğin hızıdır. Eğer bellek verilen saat frekansına ayak uyduramayacak kadar yavaşsa, CPU”nuza durmadan hatalı veri iletir. Sonuç olarak bilgisayarınız en kısa zamanda kilitlenir.
Sonunda Bellek Haritası:
Son olarak kısa bir bölümde belleği $0000'dan başlayarak sonuna kada bölge belge inceleyelim isterseniz. İlk olarak göz önüne almamız gereken bölge olan $0000-$03FF sistem tarafından değişken bölgesi olarak kullanılır. Burada ufak tefek boş alanlar bulabilirsiniz, ama ben sizin yerinizde olsam bu bölgeyi rahat bırakırdım. Çünkü en ufak hatalı kullanımınızda ya programınız çalışmaz ya da sistemi kız- Sırada ekrandaki düşük çözünürlükü görüntüyü saklayan $0400-$07E8 var. Bu bölgedeki her bayt, ekrandaki harflerden (daha doğrusu karakterlerden) birini aklında tutar. Mesela POKE 1024,1 yazıp RETURN'e bastığınız zaman ekranın sol üst köşesinde “A” harfi belirir. 1'i 1024 ($0400) yerine 1025 ($0401) adresine yazmış olsaydınız bir yandan “A” harfi belirecekti. 1064 adresi ise bir satır altta en sola harfi basacaktır. X ve Y koordinatına basılacak harfin hangi adrese geleceğini şu formülle hesaplayabilirsiniz:
Tabii ki ekranın sol-üst köşesinin koordinatının 0,0 olduğunu kabul etmelisiniz bu formülü kullanmak için. $07E8-$07F7 arasında geçerli bir veri yoktur. İsterseniz üç-dört baytlık bir data alanı olarak burayı kullanabilirsiniz. $07F8-$07FF arasında, 0. Sprite'tan başlamak üzere 8 SPrite'ın grafik datalarının adresini belirleyen bayt yer alır. Bu baytı 64'le çarparsanız Sprite'ın grafik datalarının bellekteki adresini hesaplayabilirsiniz. Şu anda sprite konusunun detaylarına girmeyeceğim. Kursumuzun ilerleyen bölümlerinde bu konular da yer alacak. $0800-$9FFF arasında BASIC programı ve değişkenler yer alır. bu bölgenin ayrıntılı bir açıklamasını “ROM'unuzu kullanın” yazı dizisinde yapmıştım. İhtiyacı olanlar o yazıya bakabilirler. $A000-$BFFF arasında BASIC yorumlayıcısının ihtiyacı olan makine dili rutinler yer alır. Bu bölgeye kısaca BASIC ROM adı verilir. Burada yer alan rutinlerden kullanılabilecek olanlarını da kursumuzun ilerleyen bölümlerinde vereceğim. $C000-$CFFF arası tamamen kullanıcıya ayrılmış boş alandır. Ama VIC'in özel (ve garip) tasarımından dolayı bu bölgeyi grafik için kullanmak oldukça zordur. Bu yüzden genelde program kodu ve datası için ideal bölge olarak görülür. Biz de hemen hemen tüm programlarımızı bu bölgeye yazacağız. BASIC, POKE komutu dışında hiçbir yolla bu bölgeye erişmez. Yani buradaki datalarınızın yanlışlıkla silinmesi diye bir şey söz konusu bile değildir. Şu anda bu alan size küçük görünebilir. Ama hiç tasalanmayın, bu bölgeyi dolduracak kadar büyük bir program tasarlamak için kursumuz bittikten sonra bile oldukça çok çalışmanız gerekecek.
adresleri VIC yardımcı çipine ayrılmıştır. Ama VIC'in sadece 46 re: gister'ı olduğu için $DO40 adresine eriştiğinizde (bu adrese yazdığınızda ya da bu adresi okuduğunuzda) doğrudan doğruya $2D000'a erişmişsiniz gibi işlem yapılır. Aynı şekilde $DO80, $DOCO, $D100, ... adresleri de aynıdır. Kısca VİC kullanılırken IK gibi görünen bellek alanı aslında 64 baytlık 16 bölge olarak çalışır (Uuups. Kafanızı karıştırdım galiba). En iyisi $DI160 gibi adreslere değerler yazın ve çerçeve renginin değiştiğini gözleyin. Bu sayede $DO00-$DO3F bölgesinin kopyalarının $DO40-$D3FF arasını nasıl doldurduğunu gözünüzle görebilirsiniz.
$D400-$D7FF adresleri de SID çipine aittir. SID'in de sadece 28 registeri olması (ve 28 adrese ihtiyacı olması) sebebiyle renk RAM'i bulunur. Bu adreslerin en başında yer alan $D800, yani 55296, sol üst köşede yer alan harfin (karakterin) rengini belirler. Bu bölge de aynı karakter ekranı gibi düzenlenmiştir. İstediğiniz X, Y koordinatlarında yer alan karakterin rengini belirlemek için kullanacağınız adresi de deminki formüle benzer bir formülle hesaplayabilirsiniz:
ADRES=
$DC00-$DCFF arasındaki bölge de CIA çiplerinin ilkine ayrılmıştır. Bu alanda yer alan adresler yardımıyla klavyeyi ve joystick portlarını okuyabilirsiniz. Bu çip register yönünden en fakir olanıdır. Sadece 16 registere sahip olduğu için bol bol adres tekrarı yapar.
$DD00-$DDFF adresleri de CIA çipinin ikincisine aittir. Bu çip de 16 registerlidir ve kaset ile disk iletişimi konusunda uzmandır.
$DE00-$DFFF arası ne size ayrılmıştır, ne de bilgisayar tarafından kullanılır. Eğer bir tasarımcının kendi çipleri için adres alanına ihtiyacı olursa burayı kullansın diye ayrılmış bellek alanıdır burası. Bazı kartuşlar programlarını burada saklar. Şu anda hiçbir işinize yaramaz.
$E000-$FFFF adresleri de BASIC ROM'a sığmayan yorumlayıcı rutinlerinin birazının ve giriş çıkış rutinlerinin tamamının saklandığı bellek alanıdır. KERNAL ROM olarak bilinir. Kullanıcıdan bilgi girmek istediğiniz zaman, ya da program yüklemeniz gerektiğinde bu adreslerde yer alan rutinlerin kapısını aşındırmanız gerekecek. Yeri geldikçe KERNAL ROM'dan bilgiler de vermek niyetindeyim. Tablo 2'yi kullanarak adreslerin tam olarak belleği nasıl parçalara ayırdığını görebilirsiniz. Bu yazıda verdiğim bu bellek haritasının tek amacı sizin programlarınız için kullanılabilecek seviyeye geldikçe detaylı bellek haritaları da yazımızda yer alacak. Gelecek ay makine dili komutlarının en basitleriyle kursumuzun en eğlenceli kısmına girişeceğiz. Umarım sizin de hoşunuza gider. Bu aylık hoşçakalın.
Hatasız Kul Olmaz:
Bu dergide yazı yazdığım iki sene boyunca hatasız yayınlanan bir yazım neredeyse hiç olmadığı için, bu yazının sonuna bir hata köşesi açmaya karar verdim. Bulduğunuz her türlü hatayı bana bildirmeniz sizin ve arkadaşlarınızın yararına olacaktır. Gelelim geçen sayının (77) hatalarına: 1) 17. sayfada yer alan tabloda yazılmış. Bu “53901” olacaktı. 2) 18. sayfadaki tabloda yer alan “250 — $FA”'nın ne olduğunu anlamak için çok uğraşmayın. Doğrusu “$FA” olacaktı. 3) 19. sayfanın başındaki formüle fazladan bir “2” girmiş. Siz onun üstünü karalarsınız. 4) Aynı kolonun en altındaki formülde de “B” ile “2” arasına “4” girmiş. Doğrusu olacaktı. 5) Geçen sayının yıldızı burada işte: Makine dili yazısında tablo unutulmuş. BASIC ile Makine dilinin hızlarını karşılaştıran tablo bu sayfalarda yer alacak (inşallah). 6) 26. sayfada yer alan resimlerin ilkinin ELECTRIC'e ait olduğu söylenmiş. Aslında bu grafiği ben çizmiştim... Şaka, şaka! 7) Program Döküm Eki'nin 23. sayfasında bulunan INVERT/H/K programının benle ve yazılarımla hiçbir alakası yoktur. Sanırım bir arkadaşın programı benimkiler arasına karışmış. Kendisinden dergimiz adına özür diliyorum. Geçen sayıda bulabildiğim hatalar sadece bu kadar. Umarım hata sayısı gelecek dergilerde daha az olur.