Commodore sayı 69, sayfa 45

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 45

Basamakları Sıfırla

Sayı >>10000 iken

SayızSayı-10000

Onbinler-Onbinler--1

—

Sayı >>1000 iken

Sayı—Sayı-1000 Binler-Binler41

Sayı >—>100 iken Sayı=Say1-100

Yüzler-Yüzler4İ

Sayı >>10 iken Sayı=Sayı-10

Onlar-Onlar4 1

Birler-$304Sayı

Rakamları Yaz

Konuda verebileceğim son püf noktası da şu: Yatay border açmaya kalkarsanız önce sprite'ları hep duracakları Y koordinatlarına koyun ve açın, sonra border'ı açmaya çalışın. Aksini yaparsanız, ilk sprite'ı koyduğunuz anda zamanlamanız çöker.

Şimdi de gelelim mektuplarda sorulanları cevaplamaya: Levent Ünal'ın problemi sayıları hexadecimal'den decimal'e çevirmekle ilgili. Bu işi yapabilecek bir rutin yazmış, fakat rutin oldukça yavaş işliyor ve 50000 gibi bir sayıyı çevirirken oldukça bekliyor. Bu rutinin ana problemi algoritmasında, programda ondalığa çevrilecek sayı bir azaltılırken, basamak sayısı da bir artırılıyor ve bu artan sayının ondalık değerlerle karşılaştırılması sonucunda sonuç bulunuyor. Yani 50000'in ondalık değerini bulmak için en az 50000'den geriye saymak gerekiyor. Öyleyse ilk olarak programa yeni bir algoritma bulmak gerekiyor. Program sadece iki baytlık yani 0-65535 arası sayıları çevirebilsin diyerek işe başlıyoruz. Bu durumda en fazla on binler basamağı olacaktır. O zaman ilk olarak sayının on binden büyük olup olmadığını kontrol etmeliyiz. Eğer on binden büyükse sayıdan on bin çıkartıp on binler basamağını bir artırıyoruz. Bu basamakların doğrudan doğruya sayıların ASCII değerlerini vermesi için hepsini en başta $30 - “0” yapıyoruz. Bu değeri dokuz kere artırdığımızda $39 - “9” değerini elde edebiliriz ki, bunları doğrudan doğruya ekrana basmak mümkündür. Her neyse, konuyu dağıtmayalım. On binler basamağını bir artırdıktan ve sayıdan on bin çıkardıktan sonra aynı işlemi tekrarlatmak üzere karşılaştırmayı yapan yere yolluyoruz. Eğer sayı on binden küçükse bu sefer aynı işlemler bin için tekrarlanır. Daha sonra yüzler ve onlar tamamlandıktan sonra sayımız zaten birler basamağını içeriyor olur. Bu değeri $30'la ORA'ladığımız zaman birler basamağının ASCII değerini elde etmiş oluruz. Şu anda en büyük problem, iki basamaklı bir sayının başka bir iki basamaklı sayıyla karşılaştırılmasında. Ne yalan söyleyeyim, bu kısım beni de oldukça uğraştırdı. Sonunda şöyle bir çözüm buldum: önce yüksek baytlar karşılaştırılır. Eğer yüksek bayt küçükse, sayı zaten karşılaştırılandan küçüktür. Eğer yüksek baytlar eşitse alçak baytlara göre karar verilir. Yüksek bayt büyükse sayı zaten karşılaştırılandan büyüktür. İkinci büyük problem de yüzler basamağını hesaplarken karşıma çıktı. 300 veya daha büyük sayıların yüksek baytının sıfırdan farklı olduğunu, bu arada alçak baytının yüzden küçük olabileceğini göz ardı etmiştim. Bu sayede yüzler basamağı yanlış bulunurken, onlar basamağı “D” gibi değerler alabiliyordu. Daha sonra yüksek baytı da kontrol ederek bu problemi yok edebildim. Programın çalışabilir halini bu sütunlarda MDE formatında bulabilirsiniz. Çevirmek istediğiniz sayıyı $FB-$FC baytlarına alçak-yüksek bayt formatında yazın ve programı çalıştırın. İki baytlık sayının ondalık karşılığı ekrana yazılacaktır.

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