Commodore Kulüp üyeleri, Baytan Bitirmez'i Commodore Haberler Bülteni'ndeki Makine Dili yazılarından tanıyacaklar. Başladığı makaleleri pehlivan tefrikası gibi uzatıp hiçbir zaman bitirememekle meşhur olan Baytan Bitirmez, aylardır sürdürdüğü ve bir sonuca varacakmış gibi gözüken yazılarını baştan almakla alanında yeni bir rekor kırmış oluyor.
Dergi için yazı istemeye gittiğimizde, Baytan Bitirmez'in bilgisayar alanında inceleme ve denetlemelerde bulunmak üzere birkaç aylığına Isparta'ya gittiğini söylediler. Bizim tahminimiz, eski bülten okurlarından gelebilecek tepkileri düşünüp her ihtimale karşı bir süre ortadan kaybolmak istediği...
Hexadecimal (on altılı) sayı sistemlerini birkaç sefer anlattım. Aslında çok basit. Decimal (onlu) sistemi biliyoruz. Bir sayı görünce otomatikman, sağdan sola ilk haneyi 1'le, ikinciyi 10'la, üçüncüyü 100'le, dördüncüyü 1000'le çarpıyoruz. On altılıda ilk hane *1, ikinci hane *16, üçüncü hane *16*16 filan. Tabii 0'dan 9'a on rakam yerine 0'dan 15'e 16 rakama ihtiyacımız var. 0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,10,11 diye gidiyor
hex 01 = dec 1 0A = 10 0F = 15 10 = 16 (1*16+0) 15 = 21 (1*16+5) 1A = 26 : 31 = 49 : 80 =128 : A5 =165 : FF =255 (15*16+15) 100=256 (16*16+0*16+0)
Peki ya FFFF ne ediyor?
Bir de ikili (binary) sistem var. Bunun da numarası, yine sağdan sola, ilk hane *1, ikinci *2, üçüncü *4, dördüncü *8, beşinci *16, vb. Yalnız iki rakam var: 1 ve 0
Mesela:
00000100 = 4 01000100 = 68 10101010 = 170 11111111 = 255
Bunların hex karşılığı ise, sırasıyla;
04, 44, AA, FF dikkat edilsin; ikiliyi hex'e çevirmek, onluyu çevirmekten daha kolay. Örneğin 8 haneli bir binary sayısının sol yarısı, iki haneli hex sayısının ilk (sol) hanesine, sağ yarısı ise ikinci (sağ) haneye karşılık düşüyor.
0100 = hex4, 01000100 = hex44
8 haneli binary ile ifade edebilecek en büyük rakam 11111111 2 haneli hex ile ifade edilebilecek en büyük rakam FF
Commodore'un kafası, bir defasında anlamaya yetenekli olduğundan, hex sisteminin neden kullanıldığını anlamak kolay. BASIC'in PEEK, POKE komutlarında niye hep 0 ile 255 arası sayıların kullanıldığı da böylece anlaşılıyor.
Makine dili denilen gayriinsani dil, PRINT, GET filan gibi yarı-İngilizce terimlerden değil, sıra sıra hex rakamlardan oluşuyor. Buyurun bir örnek:
C000: A0 00 B9 0E C0 20 D2 FF C008: C8 C0 07 D0 F5 60 4D 45 C010: 52 48 41 42 41 -- -- --
Bunun BASIC'teki karşılığı: PRINT "MERHABA"!! Denemesi bedava. Programcılığımızı C000, yani 49152 adresinden başlatıp C014 (49172) adresinde bitecek şekilde düşündük. Şimdi yukarıdaki 21 tane rakamın desimal karşılığını hesaplayıp, 49152'den başlayarak sırayla POKE edin. (POKE 49152,160:POKE 49153,0:POKE 49154...)
Sonra SYS 49152 deyin. Ve seyredin.
Birinci ilkemizi tahmin ettiniz herhalde: Makine dili programlar, birer byte'lık rakamlardan oluşuyor ve bellekte, bizim seçeceğimiz belli bir adresten başlayarak, her adrese bir byte olarak duruyor. BASIC'ten makine dili bir programı işletmek için, programın başladığı adrese SYS komutu veriliyor.
Bu rakamlar ne demek oluyor? Rakamların bazısı makine dilindeki komutların rakamsal kodları, bazısı ise komutu izleyen değerler. Her komutun, arkasında kaç sayı değer alacağı, komuta göre değişiyor ve sabit. Programcığımızın ilk rakamı olan A0, bir komut kodu. Makine buradan işlemeye başlıyor. A0 kodu, ardından bir rakam değer (parametre) alan bir kod. O halde 00 bir değer. Dolayısıyla, onu izleyen B9'un da kod olması şart (yoksa makine sapıtır). B9, 2 byte parametre alan bir komut. Programımızda bu değerler 0E, C0. Sonra gelen 20 gene bir komut. 2 byte parametre (D2, FF) alıyor. C8 gene komut. Parametre yok. C0 komut, 07 parametre. D0 komut, F5 parametre. 60 komut: "İş bitti, geri dön" demek. 4D 45 52 48 41 42 41 ise merhaba demek. İnanmazsanız, üşenmeden bunları desimale çevirip, ASCII-CHR$ tablosundaki karşılıklarına bakın.
Bu rakamlarla program yazmaya sadece deliler kalkışacağından, makine dilinin yarı insani bir dille tercümesi olan Assembly diye bir dil daha icat edilmiştir. Assembly dili, makine dilinin komut kodlarına biraz daha anlaşılır birer isim vermekten ibaret.
Örneğin;
A0, LDY demek, yani LOAD Y B9, LDA yani LOAD A demenin bir çeşidi. 20, JSR yani Jump to Subroutine demek C8, INY (Increment Y) C0, CPY (Compare Y) D0, BNE (Branch if Not Equal) 60, RTS (Return Subroutine)
Yani program, Assembly'de şöyle yazılabilir :
LDY #$00 LDA $C00E,y JSR $FFD2 INY CPY #$02 BNE $C002 RTS
$'lar $'ler ve başka hususların ne olduğunu sırasıyla anlatacağız. Yalnız $ işaretinin hex demek olduğunu söylemek şimdilik yetsin. Yani bir yerde $10 gibi bir ifade görürsek, bunun, bizim bildiğimiz on değil, hex 10 (yani..?) olduğunu anlıyoruz. Bu dolar işaretinin BASIC'teki dizi anlamına gelen $ ile ilgisi yok.
Makine diliyle iştigal etmenin bir numaralı koşulu, bir adet makine dili monitörüne sahip olmak. Televizyona benzeyen monitörlerle bir ilgisi olmayan bu monitör, kaset veya diskette bulunan bir program. Makine dili programları ve basit assembly çevirileri yazmayı, okumayı, değiştirmeyi, işletmeyi vb. sağlıyor. Yazının devamını beklerken, yoksa, eşten dosttan bir tane monitör sağlamaya bakın; veya 1500 liraya kıyıp Teleteknik'ten istetin. Gelecek sayıda bir monitör programı dökümü vereceğim ama, iki bin beş yüz küsur DATA'yı hatasız girmeye çalıştıktan sonra hâlâ bu diziyi izlemeye devam edeceğinize pek ihtimal vermiyorum.
Bir de küçük yarışma : Elinize kâğıt kalem alın ve,
1) $49A61F7C0'nun desimal karşılığını,
2) "Merhaba" diyen makine dili programcığımızı bilgisayar belleğine POKE edecek BASIC programı yazıverin.
(ipucu: 10 FOR X=0 TO 20 20 READ A 30 .......)
Elimize ilk geçecek doğru çözümün sahibine bir adet monitör kaseti acele postayla gönderilecektir.
Baytan Bitirmez
kaynak: Teleteknik Commodore Dergisi, Sayı 01, Mart 1986, Sayfa 52-53
Sevan Nişanyan
01.03.1986
Keywords: Commodore, Commodore Dergisi, C64, Commodore 64, Makine Dili