Commodore sayı 20, sayfa 55

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 55

AYHAN KALAYLIOĞLU

Geçen sayıda yazımız makine dilindeki grafik programın BASIC formülasyonunu 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. 0'dan 7'ye, 8'den 15'e, 16'dan 23'e vs. olan X-koordinatları aynı byte'ın değişik bitlerine karşılık geliyor. X-belirten sayının alttaki üç bitini dikkate almazsak geri kalanları buradaki gruplar için olduğu gibi aynı. Yani, bellek adresini hesaplarken X-koordinatının en alttaki üç bitini kullanmıyoruz. Bunun için biz bu bitleri silelim. AND komutu, burada imdadımıza yetişecektir.

X AND %11111000

Bu fonksiyonun sonunda, X'in en alttaki üç biti silinmiş halini elde ederiz. BASIC'deki satır şöyle bir şey olacaktır:

PRINT X AND 248

Bir de Y-koordinatı ile, gerekli olan byte'ın adresi arasındaki ilişkiyi 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ükse, Y-koordinatının en alttaki üç biti silinmiş halinin 40 katı toplanıyor. Makine dilinde yazmadan önce bir de X-koordinatının büyük değerler alabileceğini hatırlayalım ve ona göre gerekli değişiklikleri yapalım. X değerini XH ve XL adlı iki sayıya bölüştürelim. XH'ın sıfır ile bir değerinden başka bir değer alamayacağı aşikâr. X-koordinatının en yüksek değeri 319 hekzadesimal olarak $13F veriyor. Yani XL $3F, XH $01 değerlerini alıyorlar. Tüm analizimizi bir formülde toplarsak:

PRİNT XH*256-4 (XL AND 248) * (Y AND 7) * 40*(Y AND 248)

Bu formülü makine diline çevirmemiz gerekiyor. Bu arada, makine dilinde yazacağımız programa koordinatları hangi registerleri kullanarak geçireceğimizi belirleyelim:

Y -> Y-Koordinatı A -> XL-Koordinatı X -> XH-Koordinatı

Program içinde, X-koordinatını saklamak için iki byte'lık bir hafıza bölgesini kullanacağız. Y-koordinatı ile ilgili bilgiyi ise Y-registerinde bırakacağız. İşleme, toplamaları yapabilmek için bir 16 bitlik belleğe daha ihtiyacımız var.

100 — EO XL .EÇX 120— — .EÇ SUML-$FC 130 — .EO SUMH - $FO 140 — — .BA $C460 150 — STA XL 160— — STXXH 170 — TYA 180 — — AND : $F8

Gördüğünüz gibi, en sondaki terimden 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üş komutları mevcut değil. Bu yüzden biz de başka bir yol izleyeceğiz. Biraz gerilere 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 A)*2*2*2

İş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 toplayarak beş katını elde ederiz. Bu sayıyı da üç kere peş peşe iki katını alırsak en sonunda akümülatörün 40 katı değeri elde ederiz.

190 — STA $FE 200 — STA SUML 210 — LDA 220 — STA SUMH ASL SUML 240 — ROL SUMH 250 — ASL SUML 260 — ROL SUMH

Bit kaydırma işlemini 16 bit üzerinden yaptık. Bunu, yüksek değerli byte'ı kaydırma için 'ROL' komutunu kullanarak becerdik. Böylece, düşük değerli byte'ın 'ASL' komutu ile kaydırılması sonucu carry'ye çıkan 7'nci bitini, yüksek değerli byte'ı 'ROL' komutuyla kaydırarak 0'ıncı bitin yerine aldık. Gördüğünüz gibi, herhangi bir bilgi kaybına meydan vermeden iki byte'ı bir arada tutup 16 bit üzerinden bit kaydırma işlemi yaptık. Şimdiye kadar yapılan işlemlerle, akünün dört katını elde ettik. Bu değere bir de akünün kendisini toplayarak, akünün beş katı değeri elde edelim.

2710 — 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.

Klavyeyle gezinmek için ← ve → tuşları.