Yarışma

Geçen ay duyurduğumuz Commodore 64 Demo Yarışması'na katılma süresi devam ediyor. Yarışmanın jürisi belirlendi, ödüller ise

Şubat 1992 sayısında açıklanacak. Jüri üyeleri: Ali Murat Erkorkmaz, Han Kılıççöte, Sinan Vural, Vedat Hallaç, Celal Hallaç.

)

Ç

O

BASIC, çoğu kullanıcı tarafından makine diline tercih edilir. Çünkü bir makine dili programcısı iki sayıyı birbiriyle çarpabilmek için bile bir sayfa dolusu program yazmalıdır. HELE bir sayıyı diğerine bölmek dünyadaki en zor işlerden biridir. Ama, makine dili BASIC'le karşılaştırılmayacak kadar hızlı olduğu için, birçok programcı tarafından tercih edilmektedir. Bu yazı dizimizde, makine dilini kullanarak BASIC ROM'unda hazır duran ve birileri tarafından kullanılmayı bekleyen rutinleri ortaya çıkarmayı ve bu sayede makine dilini kullanmayı neredeyse BASIC kadar kolaylaştırmayı amaçlıyoruz. Tabii ki BASIC ROM'unu kullandığınız zaman programlarınız normalde olacağından daha yavaş çalışacaktır, ama hız hiçbir zaman BASIC'in sinir hoplatıcı yavaşlığına erişemeyecektir. Bütün bunların yanında, BASIC ROM'unda yazılı programları kullandığınız için hem programlarınız kısacık olacaktır, hem de yazması BASIC programı yazmak kadar kolaylaşacaktır.

İşin en güzel yanı, bir adreste bulunan rutinin nasıl çalıştığını bilmek zorunda olmamanız. Bu rutinleri belli adreslere yerleştirilmiş kara kutular olarak düşünebilirsiniz. Bu kara kutuların sağ üst ve sol alt kenarlarında birer boşluk bulunur. Sağdaki boşluğa çilek koyduğunuzda soldaki boşluktan çilek suyu çıkaran bir makinenin asıl işi yapan kısmı da bir kara kutudur. Nasıl çalıştığını hiç merak etmezsiniz, ama her canınız istediğinde çilek suyu içebilirsiniz. En iyisi ilk kara kutucuğumuzla işe başlayalım. Makine dili de olsa, BASIC de olsa her türlü programı kullanılır kılan en önemli şeylerden biri ekran düzenini iyi yapmaktır. İyi bir ekran düzeni yapabilmek için ise bol bol PRINT kullanmanız gerekir. Tabii ki bu yalnızca BASIC kullanıcıları için geçerlidir. Makine dili kullanıcıları yüzlerce döngü kurup, aralarda harfleri teker teker basacak olan JSR $FFD2'leri kullanmak zorundadır. Daha doğrusu kullanmak zorundaydı. Çünkü ROM'da $AB1E'de bulunan rutinden haberleri yoktu:

1. $AB1E; Karakter grubu yazdırma:

Eğer ekrana bir cümle yazdıracaksanız, cümlenin uzunluğunu Y'de tutup, cümleyi harf harf ekrana yazdırabilirsiniz. Ama bunun yerine cümleyi ASCII kodu olarak belleğin bir yerine (mesela $C100) yazıp sonuna bir adet $00 ekleyebilirsiniz. Daha sonra bu adresin alçak değerlikli baytını A'ya, yüksek değerlikli baytını da Y'ye yerleştirip sıçrarsanız, $00 baytının olduğu adrese kadar olan tüm harfler otomatik olarak ekranda kursor'un bulunduğu yere yazılacaktır.

PROGRAM 1:
.C000 LDA 15$00
Ldy
İsr $ABİE
Rts
$C100'da bulunan mesajı ekrana
yazan program. Mesaj $00 işle bit-
melidir ve 255 bayttan kısa olmalı-
dır.
Bu sayede bütün yazılarınızı tek
seferde, zahmetsizce yazabilirsiniz
ekrana.

Eğer ekran temizleme, renk değiştirme ya da kursor yukarı, aşağı gibi kodları da kullanacaksanız, yazının ASCII kodlarını hesaplamak oldukça zahmetli olabilir. Ama bu işi de BASIC'e yaptırmanın kolay yolu var. İlk olarak "7DOWN COMMODORE DERGİSİ" gibi bir satır yazın ve RETURN'e basın (.. içinde yazılı olanlar gerekli tuşa basılarak yazılacaktır. Aynen yazmayın). Daha sonra bir monitör programı çalıştırın ve Tablo 1'de altı çizili adreslerin değerini gerekli adrese transfer edin. 256 baytı geçmediği sürece bu işlemi istediğiniz kadar tekrar edin. Tüm yazının sonuna da $00'ı ekleyin. Eğer bir bloktan uzun yazıları bu yöntemle yazdırmaya kalkarsanız bilgisayar kilitlenir. Ama her zaman yazılarınızı ikiye bölüp ayrı ayrı yazdırma şansınız bulunur. Bu arada belirtmeden geçemeyeceğim bir nokta var: Yazıda $0D karakterini kullanmadığınız sürece aynı satırda kalırsınız.

TABLO-İ:
0801: 22 08 OA 00 22 93 11
0809: 1111111111 1143 4F
0811: 4D 4D 4F 44 4F 52 45 20
0819: 44 45 52 47 49 53 49 22
0821: 00 00 00

Eğer ASCII'leri kullanmaya üşeniyorsanız ilk satırınızda bulunacak PRINT içine gerekli mesajı yazın ve bu tablodaki gibi altı çizili bölgeyi istediğiniz yere kopyalayın. (İki $22 baytı arası kopyalanacaktır.)

Eğer Makine dilini kullanırken büyük boyutlarda datayı bir yerden bir yere taşımaya niyetlenirseniz, sıfırıncı sayfadan (zero page) yararlanarak dolaylı indeksleme (indirect indexed) metodunu kullanmalısınız. Bunun yanında datayı yukarıdan aşağı mı yoksa aşağıdan yukarı mı taşıyacağınız sorunu her zaman bulunmaktadır. Kaynak bölgesini kendi içinde bir yerlere taşırken bu sorunla karşılaşırsınız. Mesela $C000-$C100 arası $C001'e taşırken, $C000'dan başlarsanız, arasını $C000'da bulunan baytla doldurursunuz. Nedense gördüğüm tüm programcılarda da (ben dahil) bu ayrıntıyı unutmak gibi bir huy vardır. Ama gerekli bütün ayrıntıları bizim için düşünecek bir ROM rutini sayesinde büyük data bloklarını belleğin içinde oradan oraya taşıyabiliriz.

2. $A3BF; data bloğu taşıma: $A3BF'de yer alan rutin, ($5F-$60)'da başlayıp ($5A-$5B)'ye kadar olan bölgedeki baytları, ($58-$59)'da BİTEN bölgeye taşır. Parantez içinde yazılı olan sıfırıncı sayfa adres çiftleri, içinde alçak-yüksek bayt formatında bulunan sayıların saklandığı adresleri gösterir. En iyisi olayı bir örnekle açıklamak:

komuta gelene kadar buraya yazdığımız değer kayboluyor. Bu yüzden değerleri yerleştirmek ve ROM'a sıçramak için makine dili kullanmamız şart. Diyelim ki karakter setini $2000-$3000 arasına yerleştirmemiz gerekiyor. Yani: Başlangıç: $D000 Bitiş: $E000 Hedefin sonu: $3000

PROGRAM ADI - PROGRAM - 2

00000
R, A: NEXT
00010
00020
00030
SYS 49152
272,25
00040 END
01000
FOR R-O TO A: POKE 491524
POKE 56333,1:POKE 1,3
POKE 1,55: POKE 56333, 129: POKE 53
DATA
KAYNAK BASLANGIC 2. VE 6.
SAYIDA
01010 DATA
1:REM KAYNAK BITIS
SAYIDA
01020
SAYIDA
01030

Bir karakter editörü yapıyorsunuz diyelim. Bu iş için, karakter ROM'unu devreye soktuktan sonra $D000-$DFFF arasını çalışacağınız bölgeye taşımalısınız. Eğer bu işi BASIC'le yapmaya kalkarsanız "50 saniye" mesajını ekrana yazmanız şart olur. Oysa kısacık bir makine dili programı belleğe yerleştirmeyi göze alırsanız, bir saniye geçmeden karakter setini taşıma işini bitirmiş olursunuz. Makine dili programın yaptığı tek iş $58-$60 arasını ayarlayıp ROM'daki rutine sıçramak. Bu işi BASIC'ten yapabiliriz, diye düşünmüştüm ama $60 oldukça sık kullanılan bir adres olduğu için, ROM'u çağıran

DATA 76,191,163
169,0,133,90,169,224,133,9
2. VE 6.
DATA 169,0,133,88,169,48,133,89
:REM HEDEF BITIS
2. VE 86.

Bu taşımayı yaptırmak için ($5F-$60)'a $00-$D0, ($5A-$5B)'ye $00-$E0 ve ($58-$59)'a da $00-$30 verip $A3BF'ye sıçramamız gerekir. Sıçradıktan hemen sonra $2000-$3000 arasında karakter seti yer alacaktır. Program 2'de bu işi yaptıracak olan BASIC programı yer alıyor. Eğer 1000, 1010 ve 1020 numaralı data satırlarında 2. ve 6. baytların değerini ayarlarsanız bu programı genel amaçlı bir data taşıma programı olarak kullanabilirsiniz. Buradaki değerleri ayarlarken, ikinciye adresin alçak baytını, altıncıya ise yüksek baytını yazın. Mesela 49172 adresini yazmak istiyorsanız:

gıç adreslerini ayarlamakla uğraşmak istemiyorsanız, hata mesajlarının her birinin uzunluğunu sabit tutan rutin adresleri, buradaki sırayı takip eder. Yani $A00C'de bulunan $A831-1 değeri END komu-

Alçak = 49172 AND 255 Yüksek = INT (49172/256) formüllerini kullanabilirsiniz.

PROGRAM ADI - PROGRAM - 3

00000
R, A: NEXT
00020 SYS 49152
00030
FOR TO 26:READ A:POKE 491521
A$>”HAZIR.”: FOR TO 5:POKE 41
NEXT
00040
01000
POKE 1,54: END
DATA
169,0,133,95,169,160,133,9
6:REM KAYNAK BASLANGIC 2. VE 6.
SAYIDA
01010
SAYIDA
01020
SAYIDA
01030

BASIC ROM'unda değişiklikler yaparken de bu taşıma işinden yararlanabilirsiniz. İlk olarak $A000-$C000 arasını $A000'a taşırsınız (($58-$59)'a $C000 vererek). Daha sonra POKE 1,54 komutunu kullanarak eski ROM'u devreden çıkarırsınız. Artık ROM'da yapacağınız tüm değişikliklerin sonucunu anında görebilirsiniz. Mesela yukarıdaki program “READY.” yerine “HAZIR.” yazmak için neler yapmanız gerektiğini gösteriyor. BASIC ROM'da değişiklikler yapabilmek için genel olarak nerede neyin bulunduğunu bilmeniz gerekir. Kısaca baş kısımdaki komutların ve hata kodlarının yerleştirilme şeklini anlatacağım, ama asıl detaylı bilgiyi bir monitör programı kullanarak elde edebilirsiniz: $A093-$A127: komutların listesi. Komutun son harfi, gerçek değerinden 128 ($80) fazla olarak yazılır. $A00C-$A051 arasında bulunan rutin adresleri, buradaki sırayı takip eder. Yani $A00C'de bulunan $A831-1 değeri END komu-

DATA 76,191,163
DATA 169,0,133,90,169,192,133,9
1:REM KAYNAK BITIS
2. VE 6.
DATA 169,0,133,88,169,192,133,8
9 :REM HEDEF BITIS
2. VE 6

tunu işletecek rutinin adresini gösterir. Bu yüzden sırayı değiştirmeyin. Daha da önemlisi, kesinlikle tablonun toplam uzunluğunu değiştirmeye kalkmayın. Eğer bunu denerseniz, verdiğiniz ilk komutta sistemi ne kadar artistik bir şekilde göçertebileceğinizi öğrenirsiniz. $A129-$A19C: Fonksiyon isimleri tablosu. Fonksiyon isimlerinin son harfi gerçek değerinden 128 fazladır. Bu fonksiyonların rutin adresleri de $A052-$A07F arasında aynı sırayla tutulmaktadır. $A129-$A19C: Hata mesajlarının yazı dataları. Bu dataları değiştirerek Türkçe hata mesajlı, Türkçe komutlu bir BASIC yapabilirsiniz. Unutmayın; her hata cümlesinin son harfi normal değerinden

128 fazladır. Ama hata mesajlarını olduğu gibi değiştirdiğiniz zaman

(toplam uzunluğa dokunmadan) işiniz tam bitmiş sayılmaz, çünkü $A328-$A363 arasındaki tabloda, hata mesajlarının data başlangıç adresi yer alır. Yeni mesaj başlatmaya çalışın. $A364-$A389: Genel yazılar için harf datası. Mesela $A376'da: $0D $0A $A4 $00 bulunur. Baştaki ve sondaki $0D-$0A'lar satır başına gelinmesi için gereklidir. En sonda bulunan $00 ise mesajın sona erdiğini gösterir. ve sonrası, ROM'un genel işlemleri yerine getirebilmesi için gerekli rutinleri içerir (demin kullandığımız $AB1E gibi). Makine dilinin asıl tercih sebebinin çalışma hızı olduğunu söylemiştim. Ama tamsayılarla yapılan toplama-çıkarma işlemlerinden başka bir işlem yapmaya kalktığınızda canınızın çıkacağını da belirtmiştim. Mesela makine dilinde SIN(x) fonksiyonunu gerçekleştirmek imkansızdır. Ancak belli bir dereceye kadar yaklaştırma yapılabilir. Tabii ki bütün bu yaklaştırma işlemleri toplama, çıkarma, çarpma ve bölme işlemleri ROM'da yer almaktadır ama bu rutinler genel olarak floating point (yüzen nokta, yani ondalıklı sayı) aritmetiği kullanmaktadır. Bu yüzden ilk olarak öğrenmemiz gereken şey: Ondalıklı Sayı Aritmetiği Hepimiz onluk düzene alışkın olduğumuz için işe onluk düzenle ondalıklı sayılar anlatarak başlamak istiyorum: Ondalık düzende kullanılan herhangi bir sayı 1-10 arası bir sayı olan K ile 10^x'in çarpımı olarak yazılabilir. Örnek vermek gerekirse:

270 - (K-2.7,x -2) 90 — ,x1)

Aynı işlemi 10'un sıfır ve negatif üsleri için de tekrar edebiliriz: 15 = 7.5*10^1 3 = 3.0*10^0. Ondalıklı aritmetikte K'ya Mantis, X'e de Üs adı verilir. Son örnekte mantis 3, üs ise 0'dır. Sayıların bu şekilde gösterilmesine “normalize edilmiş gösterim” adı verilir. Bu gösterimde mantis her zaman bir ile kullanılan düzen arasında bir değer alır. Üs de, kullanılan düzenin üssü olarak mantisayla çarpılır. Normal sayılar için geçerli olan tüm kurallar normalize edilmiş sayılar için de geçerlidir. Mesela iki sayıyı çarpmak için mantisaları çarpar, üsleri toplarız. Eğer iki mantisanın çarpımı 10'dan büyükse (onluk düzende), bu değer ona bölünür ve üs bir artırılır. Yani sayı yeniden normalize edilir. Örneğin:

6Xx10:-2*7x10.1 — (6*7)x10.(-24-1)

yeniden normalize edersek:

4.2x10^-1 sonucunu elde ederiz. Normalize etme işlemi noktanın sağa veya sola kayması olarak düşünülebilir aslında. Eğer nokta sağa kayarsa üs azaltılır, sola kayarsa üs artırılır. Normalize edilmiş sayılarda toplama yapmak da mümkündür. Ama aritmetikten bildiğimiz kadarıyla, yalnızca üsleri aynı olan sayılar birbiriyle toplanabilir. Bu nedenle sayılardan üssü daha küçük olanı büyük olana eşitlememiz gerekir. Mesela:

— — 5.09 x 1000

Burada üsleri eşitlerken kullanmamız gereken iş, normalize ederken kullanacağımızın tam tersi. Yani üssü bir artıracaksak noktayı bir sola kaydırırız, bir azaltacaksak (ki buna toplamada ihtiyacımız olmaz) noktayı bir sağa kaydırırız. Tabii ki burada uğraştığımız sayılar hep onluk düzendeydi. Oysa bilgisayarlar genel olarak onluk düzende düşünemezler. Bu yüzden bütün bu işleri ikilik düzene taşımamız gerekecek. Başlangıçta tüm işlemleri ikilik düzende düşünmenin çok zor geldiğini biliyorum, ama makine dilinde ondalıklı sayı kullanmak için buna alışmamız gerekli. İkilik düzendeki bir sayı normalize edildiğinde 1 ile 2 arasında bir mantisaya sahip olur. Normalize edilmiş bir sayı şu şekilde görünür:

1.01110 x 2^10010 veya 1.011101 x 2^10

Bu sayının onluk düzendeki değeri ise şu şekilde hesaplanır:

— 262144 401217 > 0 14

*1*X16 — 65536 *1*215 — 32768

— 16384 0 - 4096 — 380928

Tabii ki sonucun tam sayı olma zorunluluğu yok. Mesela şuna bir bakın:

1.0117270 1X0 - 1 - 0 — 0.25 — 0.125 - 1.375

Nasıl ondalık düzende 1/3'ü tam olarak ifade edemiyorsak bu düzende de bazı sayıları ifade edemeyiz. Şu anda kafanızın çok karışmış olduğunun farkındayım ama olayı takip etmeye çalışın. Aklınızda her zaman bulunması gereken, yukarıdaki işlemlerin ancak ve ancak ikilik düzenden ondalık düzene geçişler yapılacağında tekrarlanacak olması. Yani tüm toplama, çarpma, bölme işlemleri ikilik düzende yapılır ve .25, .125 gibi garip sayılarla sık sık uğraşılmaz. İkilik çarpma, bölme, vb. sayılarla da bilgisayar uğraşacağı için (ROM'un kara kutularında) bize pek fazla iş düşmez. Bu sistemle 1'den küçük sayıları ifade etmeye çalıştığımızda, üssün negatif olarak da ifade edilmesi gerektiğini fark ediyoruz. Yani üssü göstermek için özel bir sistem bulmamız gerekli. Normalde negatif sayılar 2'nin tamlayanı olarak ifade edilir. Yani (sekiz bit için konuşursak), bayttaki tüm bitler

EOR #$FF komutuyla evrilir ve bu sayıya bir eklenir. Yani -1'i göstermek için: EOR #$FE + 1 = #$FF baytı kullanılır. Bu sayının son biti 1 olduğu için, sayının (-128, 127) aralığında bulunduğunu anlarız. Daha sonra da EOR ve ADC işlemlerini tekrar yaparak negatif sayının büyüklüğünü buluruz. Bu sayıların en büyük avantajı, toplama işleminde bize gerçek sonucu vermesidir. Örneğin: -3 + 6 işlemini yapmaya kalkarsak: $FD + $06 = $103 (eldeyi atarsak) = $03. Gördüğünüz gibi toplama işlemi kullanmamıza rağmen otomatik olarak çıkartma işlemini gerçekleştirmiş olduk. Ama bilinmeyen bazı sebeplerden dolayı, COMMODORE BASIC'de üs için kullanılan sistem bu değil. Onun yerine sayıya 129 eklemeyi tercih etmişler. Yani 128'le 0'ı, 127'yle -1'i, 131'le 3'ü, 132'yle 4'ü göstermişler. Demin söylediğim doğrudan toplama işlemi burada da aynen geçerli, ama makine dilinde kullanılan negatif sayılarla bir uyumsuzluk söz konusu. Tek baytla -128, 127 arası tüm sayılar gösterilebildiğine göre, üs için tek bayt ayırmakla 10^-39 ile 10^37 arasında bulunan sayılarla işlem yapılabilir. Bu da noktadan önce 37, noktadan sonra 39 basamaklı sayıları içerir. Tabii ki sayının tüm rakamları (digitleri) kullanılmaz. Kullanılacak rakam sayısı, mantisa için ayrılan bayt sayısıyla belirlenir. Biraz sonra bu konuya döneceğim. “Neden -128 ile 127 arası sayılar üs olarak kullanılmıyor? Normal olarak bir bayt bu aralıktaki sayıları gösteremez mi?” sorularının aklımıza geldiğinin farkındayım. Ama bu özel gösterimde bir değer de özel amaçlar için kullanılmıştır. Eğer üst baytı sıfıra eşitse, bu 2^-129 anlamına gelmez. Aksine, sayının (mantisa*2^üs) sıfır olduğunu gösterir. Bu sayede çarpma, bölme gibi işlemlerde özel durum olup olmadığını anlamak için doğrudan doğruya işaret baytının sıfır olup olmadığı kontrol edilebilir. Bu sayede hız biraz daha artar. Sayının Kesinliği: Demin de değindiğim gibi bir sayının kesinliğini mantisayı göstermek için ayırdığımız bayt sayısı belirler. Kesinlikten kastımız, ardışık iki sayıda, bir öncekinin bir fazlası olarak belirtilebilecek basamağın numarasıdır. Yani 0.0000025'den bir sonraki sayıyı 0.0000034 olarak gösterebiliyorsak, sistemimiz noktadan sonra yaklaşık 6 basamaklı bir kesinliğe sahiptir. Her ne kadar noktadan sonra yedinci basamak da gösteriliyorsa da, 0.0000026'yı gösteremediğimiz için “kesinlik yedidir” diyemeyiz. Eğer kendi sistemimizi kuracaksak ilk olarak ne kadar basamağa ihtiyacımız olduğunu belirlemeliyiz. Unutmayın, fazla kesinlik bilgisayarınızı yavaşlatır. 15

Commodore'unuzda mantisayı belirtmek için dört bayt kullanılır. Bu 32 ikilik basamak gösterilebildiği anlamına gelir. Peki ondalık sayılarda ne gibi bir kesinliğe sahiptir 32 bit? Bunu anlayabilmek için sadece son biti farklı olan iki sayıyı birbirinden çıkarmalıyız. İsterseniz bu işi en büyük mantisayla onun bir küçüğü için yapalım (aradaki boşluklar sadece bit sayısını daha kolay görebilmeniz için kullanılmıştır).

1111 1111 1111 1111 DIL 1111 1110

“74 0.000 0000 0000 0000 0000 0000 0000 0001

Son sayıyı ondalık düzene çevirirsek:

“71 0.000 0000 0000 0000 0000 0000 0000 0001 - 0.000000000465661287 yaklaşık olarak noktadan sonra 10. basamakta bulunan 5 basamak kesinliğini belirler. Buradan yola çıkarak sayımızın kesinliğinin noktadan sonra yaklaşık dokuz basamak olduğunu söyleyebiliriz. Bu sayısal kesinlik hiçbir şekilde üs için ayrılan bayt sayısına bağlı değildir. Üs için fazla bayt ayırırsanız işlem 10.-4000'lere kadar uzanabilir ama sayının kesinliği gene de noktadan sonra dokuz basamakta sınırlı kalacaktır. Eğer bir sayı noktadan sonra onuncu basamağa ve daha fazlasına iniyorsa, fazla basamaklar dokuz basamağa yuvarlanacaktır. Bu yuvarlamayı israf olarak görebilirsiniz, ama bilgisayarın gösterebildiği her sayıyı rahatça kullanabilmeniz için bu yuvarlanmanın yapılması şarttır.

KAPAK

Bu ayki bölüme son vermeden önce son bir konuya daha değinmek istiyorum: Negatif Sayıların Gösterilmesi: Kesinliği düşürmeden negatif sayıları göstermek için fazladan bir bite ihtiyacımız var. Her ne kadar negatif üsleri tanımlamak için bir bit ayırdıysak da, bu biti aynı zamanda sayının da negatif olup olmadığını anlamak için kullanamayız. Burada hem bellekten kâr etmek, hem de kesinliği düşürmemek için bir numara yapacağız: Konunun başlarında, normalize edilmiş sayıların mantisalarının 1 ile kullanılan sayı düzeni değeri arasında bir değer alabileceğini belirtmiştim. Yani ondalık düzendeysek, 1 <= Mantisa < 10 formülü mutlaka geçerli olacaktı. Oysa biz hep ikilik düzende çalıştığımız için mantisa 1'e eşit veya büyük ve ikiden daha küçük olacaktır. Kısaca mantisa mutlaka

1.XXX olarak ifade edilecektir. İlk bit her zaman bir olacağına göre o biti bellekte tutmayız ve bu bit yerine sayının negatif olup olmadığını belirten bir bit kullanırız. İşlemleri ya-

parken bir olan bu biti unutmazsak hiçbir problemle karşılaşmayız. İsterseniz bir iki de örnekle bu olayı iyice açalım:

1) Mantisa ve üs olarak ifade edelim:

mantisa = 0000 0000 0000 0000 0000 0000 üs = 04129 = 1000 0001

Üs, genel olarak mantisanın önüne yazılır. Bilgisayarda da bu şekilde durduğu için ben de bu şekilde kullanacağım. Ayrıca demin de söylediğim gibi noktanın solunda bulunan 1 yazılmaz ve bunun yerine işaret biti yazılır. Sayı pozitif olduğu için işaret biti sıfırdır. O zaman sayıyı:

1000 00010000 0000 0000 00000000 0000 0000 0000

olarak yazabiliriz. Daha kolay okunabilmesi için ondalık düzene çevirirsek:

81 00 00 00 00

2) Örneklerimizi elden geldiğince kolay tutmaya çalışıyorum. Bu sayede daha kolay anlayabilirsiniz. İsterseniz bir de 10 sayısını bu şekilde ifade edelim:

z 81412 - 21423 — 40x224 1x21 4 0x220 normalize edersek: — 1.01 (ikilik düzende)

Bu sayıyı da: 16 mantisa = 1.010 0000 0000 ... üs = olarak ayırabiliriz. Öyleyse sayıyı

1000 0100 0010 0000 0000 0000 0000 0000 0000 0000 olarak yazabiliriz. Daha da iyisi: 84 20 00 00 00 olarak yazmak. 3) -5.5'i de çevirelim mi?

552 2 - (224204201)

-(1x2240x2141x20 normalize edersek: z -1.011x22 (ikilik düzende). Burada mantisa - 1.001 0000 ... üsz

Öyleyse sayıyı: 100 0011 1011 0000 0000 0000 0000 0000 0000 0000 ya da kısaca: 83 B0 00 00 00 olarak yazabiliriz. Gördüğünüz gibi pek de zor değil noktalı sayılarla uğraşmak. Daha önce de belirttiğim gibi işin en zor kısmını bilgisayara yükleyeceğimiz için burada görüldüğü kadar karmaşık işlerle uğraşmayacağız. İsterseniz burada keselim ve gelecek ay kaldığımız yerden devam edelim.