Program Döküm Eki sayı 16, sayfa 6

Bu sayfadaki yazılar

Sayfanın metni

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.

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