Makine Diline Merhaba (10) AYHAN KALAYLIOĞLU Geçen sayıda yazımız makine dilin- deki grafik programın BASIC for- mulasyonunu yapamadan bitmişti. Bu sayıda kaldığımız yerden devam ediyoruz. İşe girişmeden önce biraz düşünüp olayın genel kurallarını meydana çı- karalım. O'dan 7'ye, 8'den 15'e, 16'dan 23'e vs. olan X- koordinatla- rı aynı byte'in değişik bitlerine kar- şılık geliyor. X- koordinatını belirten sayının alttaki üç bitini dikkate al- mazsak geri kalanları buradaki grup- lar için olduğu gibi aynı. Yani, bel- lek adresini hesaplarken X- koordi- natının en alttaki üç bitini kullanmı- yoruz. Bunun için biz bu bitleri sile- lim. AND komutu, burada imdadı- mıza yetişecektir. X AND Ü 11111000 Bu fonksiyonun sonunda, X'in en alttaki üç biti silinmiş halini elde ede- riz. BASIC'deki satır şöyle birşey ola- caktır: PRIİNT X AND 248 Bir de Y-koordinatı ile, gerekli olan byte'ın adresi arasındaki ilişki- yi bulmaya çalışalım. Y-koordinatı 0 ile 7 arasında ise bu değer doğrudan toplanıyor. Eğer, 8 veya daha büyük- se, Y-koordinatının en alttaki üç biti silinmiş halinin 40 katı toplanıyor. Makine dilinde yazmadan önce bir de X-koordinatının 255'ten büyük de- ğerler alabileceğini hatırlayalım ve ona göre gerekli değişiklikleri yapa- lım. X değeri XH ve XL adlı iki sa- yıya bölüştürelim. XH'ın sıfır ile bir değerinden başka bir değer alamaya- cağı aşikar. X-koordinatının en yük- sek değeri 319 hekzadesimal olarak $13F veriyor. Yani XL $3F, XH SO0l1 değerlerini alıyorlar. Tüm analizimizi bir formülde toplarsak: 56 PRIİNT XH*2564-(XLAND 248) * (YAND 7) * dÜ*(Y AND 248) Bu formülü makine diline çevirme- miz gerekiyor. Bu arada, makine di- linde yazacağımız programa koordi- natları hangi registerleri kullanarak geçireceğimizi belirleyelim: Yz > Y-Koordinati A — > XL-Koordinatı X - > XH-Koordinatı Program içinde, X-koordinatını saklamak için iki byte'lik bir hafıza bölgesini kullanacağız. Y-koordinatı ile ilgili bilgiyi ise Y-registerinde bı- rakacağız. Yapacağımız adres belir- leme işleminde, toplamaları yapabil- mek için bir 16 bitlik belleğe daha ih- tiyacımız var. 100 — — .EO XL-$FA l0— —. EÇXH-SFB 120 — — .EO SUML-$FC 130 — — .EO SUMH-$FO 140 — — .BA $C460 150— — STAXL 160 — — STXXH ü— YA 180 — — AND ; $F8 Gördüğünüz gibi, en sondaki te- rimden hesaplamaya başladık bile. Fakat, hemen ufak bir sorun çıktı karşımıza. Ana işlem ünitemizin çarpma işlemleri için öngörülmüş ko- mutları mevcut değil. Bu yüzden biz de başka bir yol izleyeceğiz. Biraz ge- rilere giderek, belli bir değerin içeri- ğini sola kaydırarak bu sayıyı iki ile çarptığımızı hatırlayalım. Bu kurala uygun olarak, 40'la çarpma olayını parçalara ayıralım: A*40 E>(A*2*2-4 A)*2*2*2 Commodore İşlemleri bu sırada yürütürsek, akümülatörün önce iki katını, sonra dört katını ve kendisini de toplaya- rak beş katını elde ederiz. Bu sayıyı da üç kere peşpeşe iki katını alırsak en sonunda akümülarörün 40 katı de- ğeri elde ederiz. 190 — STA $FE 200 — STA SUML Al0 — LDA :0 220 — STA SUMH 230 — ASL SUML 240 — ROL SUMH 250 — ASL SUML 260 — ROL SUMH Bit kaydırma işlemini 16 bit üzerin- den yaptık. Bunu, yüksek değerli byte'i kaydırma için 'ROL' komutu- nu kullanarak becerdik. Böylece, dü- şük değerli byte'in “ASL' komutu ile kaydırılması sonucu carry'ye çıkan T'nci bitini, yüksek değerli byte'ı “ROL' komutuyla kaydırarak O'ıncı bitin yerine aldık. Gördüğünüz gibi, herhangi bir bilgi kaybına meydana vermeden iki byte'ı birarada tutup 16 bit üzerinden bit kaydırma işlemi yaptık. Şimdiye kadar yapıları işlem- lerle, akünün döri katını elde ettik. Bu değere bir de akünün kendisini toplayarak, akünün beş katı değeri elde edelim. 210 — CLC 280 — LDA SUML 290 — ADC $FE 300 — STA SUML 310 — LDA SUMH 320 — ADC : 0 330 — STA SUMH Büyük ihtimalle, çoğunuz SUMH'- ye yaptığımız sıfır toplama işleminin ne işe yarayacağını soracaklardır.