Bu sayfadaki yazılar
Sayfanın metni
Sayfa 7
Gerçi MAKİNA DİLİNE MERHABA ve COMMODORE 64 İLE GRAFİK yazılarımızda sıkça değindik, ama gene de bu bit değerlerini nasıl 0-225 arası sayılara çevireceğimizi görelim.
Diyelim ki, sıfırıncı sayfa adreslemelerinin üçer karakter olmasını (BIT 0=1), kimi komutların arkasına bir boş satır eklenmesini (BIT 1 = 1), direkt mod komutlarının ASCII karşılıklarını görmeyi (BIT 2 = 1), tablo satırlarının arka arkaya gelmesini (BIT 3 = 0), tablolarda da ASCII karşılıklarını görmeyi (BIT 4 = 0), T ve E harflerini kullanmayı (BIT 5 = 1) ve ROM'un altındaki RAM'ı düşünmemeyi (BIT 7 = 0) istiyorsunuz. BIT 6'yı da 0 olarak varsayalım (Bu satırların yazarı, devamlı bu kombinasyonu kullanmaktadır). Sonuç:
2↑0+2↑1+2↑2+2↑5=39
Yani ← E39 verdiğimizde daha önce belirttiğimiz sınırlar arasındaki programımız ← P ve ← T komutlarına göre ve demin belirttiğimiz görünüşe sahip olarak assembler koduna çevrilecektir. REASS'ın çalışmasını, ekrandaki gittikçe uzayan bir çizgiden anlayabilirsiniz. REASS işini bitirince LIST yapın. Eğer SUPER-ASS'ı daha önceden yüklemişseniz /E komutunu kullanmanız daha iyi olacaktır. Karşınıza üretilen assembler kodu çıkacaktır. EĞER LIST KULLANIYORSANIZ, SAKIN SATIRLARDA BİR DEĞİŞİKLİK YAPMAYA KALKIŞMAYIN. Önce üretilen kodu bir yerlere SAVE edin, sonra SUPER-ASS'ı yükleyip çalıştırın, ürettiğiniz programı yeniden yükleyip /E yardımı ile değiştirmeye başlayın. Artık gerisi size ait.
Baştan beri anlattığımız şeyler çok karmaşık görünse de, bir-iki kullanımdan sonra saniyelik otomatik işlemlere dönüşüyorlar.
DİKKAT: Yazımızın başından beri verdiğimiz komutları ayrı ayrı satırlarda değil de, aynı satırda yazmalısınız. Aksi takdirde, bir sürü SYNTAX ERROR yaratırsınız. Örneğin:
SYS 49152,$9000,$9100: ← P $9000: ← T $90F0,$90FF: ← E 39
Bu şekilde ancak 80 karakter (iki ekran satırı) uzunlukta komutlar yazabilirsiniz. Ancak, programınızın içinde 5-6 tane tablo varsa, 3-4 yeri label ile işaretlemek istiyorsanız, 80 karakter size yetmeyecektir. Ne yapacağız? Yapılacak şey minik bir program yazmak. Tıpkı BASIC program gibi. Örneğimize bir bakın:
Bu programı yazıp,
SYS 49152,$9000,$9100:RUN
verdiğinizde, REASS önce makina kodunun yerini öğrenecek, sonra kısa programdaki bilgileri okuyacak, sonra bu kısa programı silerek yerine assembler kodunu üretmeye başlayacaktır. Nasıl, basit değil mi?..
Bu tür kısa program yazmadan direkt modu kullanmayı ancak tablo veya ekstra label gibi bir derdiniz yoksa yapmanızı tavsiye ederiz. Örneğin:
SYS $8000,$8357: ← E39
Bir başka direkt mod kullanımı da, makina dili programınızın içindeki tabloların yerlerini bilmiyorsanız ve REASS'ın size yardımcı olmasını istiyorsanız olacaktır. İşte burada, demin es geçtiğimiz 6 numaralı bit'i kullanacağız. Eğer bu bit 1 ise, REASS assembler kodu üretmeyecek, makina kodunun üstünden geçerek, nerelerde tablolar olduğunu bulup bunları demin bizim yazdığımız türde bir program şeklinde ← T komutları ile belirleyecektir. Örneğin:
SYS $8000,$9000: ← E 46 komutu işledikten sonra LIST yapınca, şuna benzer bir program görebilirsiniz (tabii $8000-$9000 arasında bir program varsa):
İşte burada sizin biraz hayal gücünüzü çalıştırmanız gerekiyor. REASS, sadece makina kodu karşılığını tablolamadığı kısımları tablo olarak niteleyecektir. Diyelim ki, $8106 adresindeki byte'ın değeri $60. Bu durumda, makina dilindeki RTS komutunun kendisi ile de aynı olduğu için, REASS o adresi tabloya dahil etmeyecektir. Yukarıdaki örneği gözönüne alırsak, aslında tablonun $8100-$8200 adreslerini tamamen kapladığını varsayabiliriz.
REASS'ın ürettiği tablo listesinin yardımıyla gerçek tablo adreslerini ayarlayıp, en son satıra da E 39 gibi bir komut koyup (gerekiyorsa programın başlangıç ve bitiş adreslerini de ekleyerek) SYS $8000,$9000: RUN ile gayet güzel bir assembler kodu sahibi olabilirsiniz.
İsterseniz REASS'ın kendisini assembler koduna çevirelim. Önce REASS'ı yerine yükleyin. Sonra aşağıdaki program ile onu $8000'den sonraya kaydıralım:
Şimdi NEW verip şu programı yazın:
Şimdi de şu komutu verin:
SYS 49152,$C000,$CB00,$8000: RUN
Sekiz saniye içinde assembler kodu çevrilecektir. Oluşturduğunuz assembler kodunu yükleyin ve üzerinde istediğinizi yapın.
Bazı programlarda, örneğin kendini devamlı değiştiren programlarda, kimi adresler devamlı değişebilir. Bu durumda REASS bu adresleri label ile değil de, gerçek adreslerini onaltılık sistemde yazarak çevirecektir. Bu tür satırların arkasına üç soru işareti eklenecektir. Böylece tanınmaları kolaylaşacaktır.
Makina dili programcıları bilirler, BIT ve LDA komutunun kullanıldığı bir hile vardır. BIT $00A9 komutu aynı zamanda .BY $2C LDA#$00 anlamına da gelmektedir. Bunun derinliklerine inmeyeceğiz. Ancak REASS, bu üç byte'ı .BY şeklinde yazıp, assembler kodu şeklini de noktalı virgülün arkasına açıklama olarak yerleştirecektir.
ÖNEMLİ: Eğer oluşacak assembler kodunun hafızada değil de disket üstünde oluşmasını istiyorsanız, (bu yöntemi sadece disket sürücüsü olanlar kullanabilir), önce OPEN ve CMD komutları ile bir dosya açın sonra REASS'ı işletin. Örnek verelim:
Demin REASS'ın kendisini çevirirken yaptıklarımıza geri dönelim.
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 6
BASIC programı genel olarak şu görünüşe sahip olacaktır:
Örneğin $C000-$CFFF arasındaki bir programı $8000'den sonraya kopyalamak için A1=49152, A2=53247 A3=32768 olması gerekir. Bu tür çevirimlerin nasıl yapıldığını daha önceki sayılarımızda birçok kereler anlatmıştık. Örneğin Ayhan Kalaylıoğlu'nun veya Tuna Ertemalp'in yazılarına bakabilirsiniz.
Tüm bu işlemlerden sonra NEW yapın. Şimdi de REASS'ı yükleyin, tabii ki ,8,1 veya ,1,1 ile. Yüklemeden bitince yeniden NEW verin.
Şimdi sıra geldi REASS'a makina dili programımızın nerede olduğunu söylemeye. Diyelim ki programımız $9000-$9100 arasında. Kullanacağımız komut:
SYS 49152, $9000, $9100
olacaktır. Dikkat ettiyseniz, başlarına dolar işareti koymak şartıyla, onaltılık sistemdeki sayıları da kullanabiliyoruz. Ama isterseniz normal sayıları da kullanabilirsiniz. Bu durumda yukarıdaki komutu şu şekilde verebilirdik:
SYS 49152, 36864, 37120
Ama herhalde ilk biçim daha anlaşılır oluyor, ne dersiniz?
Bu komutun bir başka özelliği bir çok önce gördüğünüz kaydırma işlemleri ile ilgili. Demin $C000-$CFFF arasındaki programı $8000'e kaydırmıştık. Bu programı reassembler'a kullandırmak için şu komutu veriyoruz:
SYS 49152, $C000, $D000, $8000
Bunun anlamı, "Benim programım aslında $C000-$D000 arasında olacaktı ama şu anda $8000'de duruyor." demektir. DİKKAT: Programımız $CFFF'de bittiği halde bitiş adresi olarak $D000 yazdık. Bu hep böyle yapılmalıdır. Yani bitiş adresi yerine programın son byte'ından sonra adres yazılmalıdır. Bir önce verdiğimiz örnekte de, esas program $9000-$90FF adresleri arasında bulunuyor olmalıydı. Buna benzer bir olay, makina dili monitörü programında da karşımıza çıkıyordu.
Bu komutla REASS'a, çevireceğimiz programın hafızadaki yerini bildirmiş ve üç yeni komutu aktif hale getirmiş olduk. REASS'ın çevirme işlemini yapmasına birazdan geleceğiz. Bildiğiniz gibi, assembler kodu kullanılırken gereken yerlere label konabilir. Biz de üretilecek assembler kodunun istediğimiz adreslerde bir label kullanılmasını isteyebiliriz. Bunun için kullanılacak komut şudur:
← P adres
Örneğin: P $C000 verdiğimizde, daha sonra üreteceğimiz assembler kodunun, $C000'a karşılık gelen satırının başında bir label olacaktır. Bunun gibi birkaç P komutu daha verilebilir.
Bir de tablo meselesi var. Makina dili programının bir kısmı program değil de, program tarafından kullanılan byte'lerden oluşabilir. Bunların 6510 makina dili komutlarına çevrilmesi anlamsız olur. REASS çalışmasını sürdürürken, bu tip bölgelere rastlarsa makina kodu yaratmak yerine ".BY" komutu ile başlayan satırlar yaratacaktır. Ancak tabloların içindeki byte'lar tesadüfen bir makina dili koduna karşılık gelebilir. Örneğin programın içinde bir yerde üç tane arka arkaya gelen $20 değeri varsa, bu aslında üç tane SPACE anlamına gelebilmektedir. Ancak bu değerler aynı zamanda JSR $2020 komutuna da karşılık gelmektedir. Üretilecek assembler kodunda da böyle görünecektir. Bunu önlemek için en iyi yol, eğer biliyorsanız, programın içindeki tabloların yerlerini üretime başlamadan önce REASS'a bildirmektir. Diyelim ki programımızın $C100-$C235 ve $CF00-$CFFF adresleri arasında tablolar var. Şu komutları kullanacaksınız:
← T $C100,$C235
← T $CF00,$CFFF
Artık REASS buralarda makina kodu aramaya çalışmayacaktır.
Artık sıra geldi esas çevirme işlemini yapmaya... Bunun için kullanılacak komut:
← E sayı
Burada vereceğiniz sayı, 0-255 arasında olacak, tıpkı yazının başlarında belirtildiği gibi. Bildiğimiz gibi, 0-255 arası sayılar 8 bit ile gösterilmekte ve bu bit'ler de 0-7 arası numaralandırılmaktadır. Buna göre aşağıdaki açıklamaları okuyunuz. Her bir bit'in 1 veya 0 olması, üretilecek assembler kodunun görüntüsünü etkileyecektir.
BIT 0: Eğer değeri 1 ise, programdaki sıfırıncı sayfaya ($00-$FF adresleri) hitap eden tüm komutların label'ları üç harften oluşacaktır. Eğer 0 ise, bu label'ler beş karakterden oluşacaktır.
Örnek: L23 veya L0023
BIT 1: Eğer değeri 1 ise, programdaki her RTS, RTI, BRK ve JMP komutundan sonra assembler koduna boş bir satır eklenecektir. Eğer 0 ise, bu işlem yapılmayacaktır. Bunu yapmak, üretilecek programın okunurluğunu arttıracaktır. Eğer hafıza azlığı sorununuz varsa, yapmamanız gerekir.
BIT 2: Eğer değeri 1 ise, programdaki direkt adresleme moduna sahip her komutun yanına, komutlardan byte değerinin ASCII karşılığı da konacaktır. Eğer 0 ise, bu yapılmayacaktır.
Örnek: LDA $41; "A"
Eğer byte değerinin ASCII karşılığı okunabilir bir karakter değilse, nokta konulacaktır.
Örnek: LDX $00; " "
BIT 3: Eğer değeri 1 ise, programdaki tablo kısımlarının oluşturacağı assembler kodu satırlarının arasına bir boş satır eklenecektir. Eğer 0 ise, bu yapılmayacaktır.
BIT 4: Eğer değeri 1 ise, programdaki direkt adresleme moduna sahip komutların arkasına ASCII karşılıklarını eklemek geçerli olsa bile, bu işlem tablo kısımlarında yapılmayacaktır. Eğer 0 ise, tabloların arkasına da ASCII karşılıklar eklenecektir.
BIT 5: Eğer değeri 1 ise, programda label kullanılan yerlerde, tablo adresi belirten label'ların başına T harfi, programın dışında kalan bölgelere hitap eden adresleri belirten label'ların başına da E harfi getirilir. Eğer 0 ise, sadece L harfi konur.
BIT 6: Bu bit'i birazdan anlatacağız.
BIT 7: Eğer değeri 1 ise, REASS programın $A000-$BFFF veya $D000-$FFFF gibi ROM altında kalan adreslerde olduğunu anlar ve bu adreslerdeki ROM'da bulunan programı değil de, aynı adreslerdeki RAM'da bulunan sizin programınızı çevirir. Eğer 0 ise, ROM'daki programlar çevrilir. Böylece sistem rutinlerini de assembler koduna çevirebilirsiniz.