64'ün COMMODORE BELLEK HARİTASI

Dünyanın en popüler sekiz-bitlik bilgisayarlarının başında gelen Commodore 64'ün bellek haritasını detaylı olarak incelemeye bu ay başlıyoruz. BASIC ve özellikle makine dili ile ilgilenenlerin yararlı bulacaklarını umduğumuz bu dizide C64'ün bellek adreslerine tek tek bakacak ve aynı zamanda bu adreslerin kullanımıyla ilgili ilginç bazı programlar vereceğiz. Bundan önce, geçen ay yayınlanan bölümü okuyarak bazı terimlerin ne anlama geldiklerini öğrenmeniz, size diziyi takip etmede kolaylık sağlayacaktır. Şimdi sözü daha fazla uzatmadan bu 64K'lık harika makinenin derinliklerine doğru yola çıkalım... C64'ün beyni olan 6510 çipi aynı anda toplam 64K adresleyebilir. Bunun bayt olarak karşılığı olan 65536 değeri bellekte desimal olarak 0-65535 veya daha sıkça kullanıldığı biçimde heksadesimal $0000-$FFFF şeklinde adreslenmiştir. Bu adreslerden bilgisayarın kendi çalışma işlevinin yerine getirilmesi için ROM kullanılırken, bazılarıysa RAM olarak ayrılmıştır. ROM belleğin kapsamı bilgisayar üretilirken fabrikada veya daha sonradan EPROM programlayıcılar yoluyla belirlenir. RAM ise kullanıcı amaçları için kullanıma hazır boş bellek durumundadır. Çoğunuzun zaten bildiğini sandığım bu kısa bilgilerden sonra bu adresleri tek tek incelemeye başlayabiliriz. Burada, adresleri İngilizce isimleri ve hem desimal hem de heksadesimal sayı karşılıklarıyla belirteceğim. Üstteki kısaltma adresin ismi ve altta yeralan sayılardan soldaki adresin heksadesimal sağdaki ise desimal karşılığıdır.

0000 — 0

Acaba C64'ün ilk adresinin ne işe yaradığını merak ettiğiniz oldu mu? Eğer sadece BASIC programlamayla ilgileniyorsanız ilk adres pek işinize yaramayacaktır. Makine dili bilen deneyimli kullanıcılar içinse ilk adres oldukça önemlidir. Bu adres, bilgisayarın ana mikroişlemcisi olan 6510'un kendisine gelen ve kendisinden çıkan bilgilere göre bir değer alır. Geçen ayki giriş yazımızdan hatırlayacak olursanız, mikroişlemciyi bir otobüs durağına benzetmiştik. Bu durağa Byte Express otobüsünün sürekli yolcuları olan bit'ler ile bilgiler geliyor ve gidiyordu. O adresi de buna benzer şekilde belli bilgilerin giriş mi veya çıkış mı olduklarını belirtiyor. Normalde bu adresin değeri 47'dir. (Bunu bilgisayarınızda ?PEEK(0) ile kendiniz de tecrübe edin.) Bu sayının ne anlama geldiğini aşağıdaki tabloda görebilirsiniz. Eğer bit kapalıysa yani 0'a eşitse

İSİM BİT YÖNÜ GÖREVİ LORAM 0 ÇIKIŞ $A000-$BFFF'de yeralan BASIC ROM/RAM'ın kontrolü HIRAM 1 ÇIKIŞ $E000-$EFFF'deki KERNAL ROM/RAM CHAREN 2 ÇIKIŞ Karakter ROM'u kontrolü 3 ÇIKIŞ Teyp bilgi hattı 4 GİRİŞ Teyp bağlantısı kontrolü bilgi, ilgili bellek alanından mikroişlemciye geliyor demektir (GİRİŞ). Eğer 1'e eşitse işlemci kendisi rutine bilgi göndermektedir (ÇIKIŞ). Bilgisayarınızı ilk açtığınızda PEEK komutuyla alacağınız 47 değeri 5, 3, 2, 1 ve 0'ıncı bitlerin açık olduğunu ve bu bitlerin temsil ettiği alanlara mikroişlemciden bilgi gönderildiğini belirtmektedir.

R6510 0001 — 1

Bu adres BASIC programcıları için daha yararlıdır. Önemli bir görevi vardır; belleği değişik konumlara sokar. C64, 64K'lık RAM belleğine ek olarak Kernal, ekran editörü, BASIC çeviricisi ile 4K'lık bir karakter üretecini kapsayan 24K'lık ROM'a sahiptir. Ayrıca bellek genişletici kartuşlarla 4K-8K arasında ek bir bellek mevcut hale gelebilir. Böylece mikroişlemci 92K'ya kadar olan belleğe bakabilir, ancak aynı anda sadece 64K'yı kontrol edebilir veya giriş yapabilir. Bu adresteki bitler açılıp kapatıldığında değişik bellek konfigürasyonları elde edilebiliyor. Bu bitlerin fonksiyonları ve elde edilebilen değişik konfigürasyonları şunlardır:

Bit 0 LORAM sinyali (0- BASIC ROM'u kapat) 1 HIRAM sinyali (0- KERNAL ROM'u kapat) 2 CHAREN sinyali (0- karakter ROM'u boşalt) 3 Teybe bilgi gönderme 4 Teyp bağlantısı kontrolü (1 - Bağlantı kapalı)

vw

Harita Bit 2-1-0 Fonksiyon Harita-1 000 38K BASIC Harita-2 x01 64K RAM ve I/O Harita-3 010 52K CP/M Harita-4 100 64K RAM Harita-5 101 32K RAM ve expansion Harita-6 110 Assembler, word processor Harita-7 111 64K BASIC Harita-8 1xx Max kartuşları

X: Kullanıcı tarafından değiştirilemez

5 Teyp motoru kontrolü (1 Açık, 0- Kapalı) 6 Kullanılmıyor 7 Kullanılmıyor

Tabloda görülen MAX, 64'ün ilk çıktığı günlerde yaygın olan türden ve Commodore'un da 64'le uyumlu üretmeyi düşündüğü fakat sonradan vazgeçtiği bir oyun makinesi. Buna karşın bazı kartuş oyunları 64'te çalışabiliyor. Şimdi yukarıdaki tablodaki bellek konfigürasyonlarına yakından bakalım.

Bu adresin değeri teyp kullanılırken sık sık değişir. POKE 1,255 komutu, adresi resetleyerek ROM'ları eski haline döndürür. Bunu yapmanın başka bir yolu da RUN/STOP ve RESTORE tuşlarına basmaktır, ancak bu her zaman mümkün olmayabilir (bu tuşlardan biri veya her ikisinin kapatıldığı durumlarda).

0002-2

Bu adres bilgisayar tarafından bazı bilgileri geçici olarak saklamak için

Harita # 1 Harita # 2 I/O expansion (disk) I/O araçları ve I/O sistem 8K KERNAL ROM I/O expansion (CP/M) 8K RAM rutinleri için RAM E000 CIA #2 memory 4K I/O CIA #1 memory 4K I/O Color RAM RAM | RAM (BUFFER) BASIC ROM VE 4000 16K RAM Normal bellek haritası. Programlama için 38K ayrılmış, yine 4000 4000 64K RAM LORAM - | LORAM— 1 HIRAM - | 16K RAM HIRAM 0 LOWER ADDRESS GAME - 1 GAME — | $0000 0000 SİSTEM EXROM - X 0000 EXROM — X

8000

8000

8000

Harita # 3

8K KERNAL ROM

4K VO

AKRAM

16K RAM

16K RAM

RAM

Harita # 5

8K KERNAL ROM

AK VO

4K RAM (BUFFER)

BASIC ROM

8K ROM CARTRIDGE (BASIC EXP)

16K RAM

16K RAM

Harita # 7

8K KERNAL ROM

4K VO

4K RAM (BUFFER)

16K ROM (CARTRIDGE)

RAM

16K RAM

I/O araçları ve CP/M gibi diller için 8K

LORAM - 0 HIRAM - 1 GAME - 1 EXROM - 1

BASIC için 32K RAM 8K genişletici kartuşa ayrılmış

HIRAM - 1 GAME - 0 EXROM - 0

Harita 6 gibi ancak 32K kullanıcı için ve ROM genişletmesine ayrılmış

LORAM - 1 HIRAM - 1 GAME - 0 EXROM - 1

8000

8000

1000

Harita # 4

16K RAM

16K RAM

16K RAM

16K RAM

Harita # 6

8K KERNAL ROM

8K I/O 8K RAM (BUFFER)

8K ROM CARTRIDGE

16K RAM

RAM

Harita #8

8K CARTRIDGE ROM

8K VO 8K OPEN

8K OPEN

8K CARTRIDGE ROM

16K OPEN

12K OPEN

AKRAM

64K boş RAM bellek. Bu durumda hiçbir I/O işlemi yapılamaz.

LORAM — O HIRAM - 0 GAME — | or X EXROM — Xor0

BASIC için 40K RAM ve 8K kartuş belleği

LORAM = 0 HIRAM = 1 GAME = 0 EXROM = 0 kullanılır. Bu adresin size bir yararı yoktur, üstelik POKE ile bu adresin değerini değiştirirseniz bilgisayar kilitlenebilir.

Bu konfigürasyon ULTIMAX Video oyun kartuşlarını 64'te çalıştırır.

ADRES 0003-0004 = 3-4

Atlama vektörü: Floating Point sayıları bilgisayarın anlayacağı integer (ikili) sayılara dönüştürür.

ADRES 0004-0006 = 4-6

Atlama vektörü: Integer sayıları floating-point sayılara dönüştürür.

CHARAC 0007 — 7

İngilizce CHARAC olarak da bilinen bu adres karakter bulma işini yüklenmiştir. Adres tırnak işaretinin ASCII değerini taşır (34).

ENDCHR 0008 — 8

Bu adres bir flag'dır. Yazı karakterlerinin sonundaki tırnak işaretini gösterir.

TRMPOS 0009 — 9

Son TAB'dan itibaren ekran sütunu.

VERCK 000A — 10

Flag: 0 - Load, 1 - Verify. Bu adres son yapılan disk veya teyp işlemine göre bir değer alır.

COUNT 000B — 11

Semboller için Input Buffer'ın pointer'ı.

DIMFLG — 12 Flag: DIM matrisi. Bu adres DIM komutuyla en son açılan matris dizisinin ilk harf veri değerini saklar.

VALTYP 000D — 13

Bu okunan data'nın durumunu gösterir ve eğer data yazı karakterinden oluşuyorsa 255, sayı ise 0 değerini alır.

INTFLG 000E — 14

Sayıların data olarak durumunu gösterir. Integer ise 128 ve floating point ise 0 olur.

GARBFL 000F — 15

Flag: LIST komutu ve garbage collection için data tarama. Normal değeri 4'tür.

SUBFLG 0010 — 16

Flag: Sembol referansı ve kullanıcı çağrısı. Bu iki fonksiyon için adresin değeri, flag sicili olarak katlanarak artar.

INPFLG 0011 — 17

Flag: BASIC veri giriş tipleri. 0-INPUT, 64- GET, 152- READ. Bilgisayarı açtığınızda bu değer 0'dır. Giriş tipi değiştikçe değer de değişir.

TANSGN 0012 — 18

Flag: TAN sonuçları. Bu flag TAN işaretini gerçeklemek için SIN/COS bölümünün sonuçlarını kontrol eder. Normal değer 0'dır. TAN argümanı 259.1'den büyük olduğunda 255 haline gelir.

0013 — 19

Flag: INPUT komutunun soru işareti.

LINNUM 0014-0015 — 20-21

Integer değerin geçici olarak saklanması. BASIC burada hesaplamalarda kullanılan integer verilerini saklar. 3-4 ve 5-6 adreslerindeki rutinler burada saklanan sayıyı kullanırlar.

TEMPPT 0016 — 22

Pointer: geçici yazı karakteri yığını. Normal olarak TEMPST (25) adresini gösterir.

LASTPT 0017-0018 — 23-24

En son geçici yazı karakteri yığını.

TEMPST 0019-0021 — 25-33

Geçici yazı karakterleri için yığın.

INDEX 0022-0025 — 34-37

Buradaki adresler BASIC ROM'da saklanan makine dili altrutinlerinin pointer'larıdır.

RESHO 0026-002A — 38-42

Floating-point çarpımlarının sonuçlarını saklayan bu adresler çok büyük pozitif veya negatif sayıların çarpımı için Sistem ROM çarpım rutinleri tarafından kullanılırlar.

TXITAB 002B-002C — 43-44

Pointer: BASIC text'in başlangıcı. Normal değeri: $0801 (2049)

Bu iki adres BASIC programlarınızı belleğin neresinde sakladığınızı belirtir. Bu adreslerin içeriklerini değiştirerek değişik işler yapabilirsiniz. Örneğin arka arkaya değişik programlar yükleyebilir, bunları bellekte arka arkaya saklayabilirsiniz. Hazır söylemişken bunu yapalım bari. Üstelik çok işinize yarayacağına da eminim. Nasıl mı? Örneğin yazdığınız her programda belli bir rutini örneğin joystick rutini kullanıyor ve her seferinde tekrar yazmak zorunda kalıyorsanız, aşağıdaki kısa programla bu dertten kurtulabilirsiniz. Bunun için örnekte olduğu gibi joystick rutini bir kere için yazın, fakat rutinin satır numaralarını 20000 veya 30000 gibi büyük sayılar olarak alın. Böylelikle rutin ana programın üzerinde bir yere yerleşecek ve geriye kalan iş sadece ana programdaki joystick rutini için GOTO ve GOSUB komutlarının arkasına gelecek sayıları yazmak olacak. Eğer teyp kullanıyorsanız; 1. Aşağıdaki programı BDE ile yazın. (PROGRAM 1) 2. Teybe içinde birinci program olan kaseti yerleştirin. 3. Ekleme programını çalıştırın ve ekranda gösterilen yolları izleyin. “READY” yazısı ekrana geldiğinde LIST yazarsanız ikinci programın 6. satırdan itibaren bellekte yer aldığını göreceksiniz. Buna başka bir program eklemek için yeni programın kasetini teybe koyun ve ekleme programını RUN edin. İstediğiniz bütün

PROGRAM ADI : PRG-İ
00001 <a2a>
PRİNT "<CTRL-7 10D
OLİN ><4LEF ,"
00003 FOR 15631 TO 636:POKE 1,13:NEXT <187>
POKE 198,6
09005 IF PEEK(45)<2 THEN POKE 43,PEEK(45)
44,PEEK(46)-1:END <a55>
00006 POKE 43,PEEK(45)-2:POKE 44 ,PEEK(46)
<ası>

programları veya rutinleri eklediğinizde 1'den 6'ya kadar olan satırları silin. Eğer 1541 disket sürücünüz varsa aşağıdaki programı yazın.

v

Programı RUN ile çalıştırıp ekranda belirtilenleri yapın. Yukarıdaki programda olduğu gibi işlemleri bitirdiğinizde 1'den 7'ye kadar olan satırları silin.

PROGRAM ADI : PRG-2

80001 INPUT "HANGI PROGRAMI EKLİYEYİM"
* <isa>
)
80003 PRİNT "<CTRL-7><CLR)<3DOWN LORD" 7
<a55>
200904 FOR 15631 TO 640:POKE 1,13:NEXT <154>
©0005 POKE 198,10
00006 IF PEEK(45)<2 THEN POKE 43,PEEK(45)
-2*255:POKE 44 <ana>
90007 POKE 43,PEEK(45)-2:POKE
PROGRAM ADI : PRG-3
63000 REM — ** */2- LİST kk
63001 SAZPEEK (44) *256*PEEK(43)-1
63002 LN-PEEK (SA*3) KESE
63003 PRİNT
T
63004 POKE 631,19:POKE 632,17:POKE 633,5:
POKE 634,13:POKE 635,19:POKE 636,13
63005 POKE <e36>
63010 IF PEEKC197)543 THEN "-"
TUSUNU KONTROL <253>
63020 IF PEEKC197)-40 THEN "4"
TUSUNU KONTROL
63030 GOTO
63108 IF THEN
63180 <a34>
63110 SA-SA*5IGOTO 53002 <a26>
63200 AND
)<>8 AND PEEK<SA-3)<>0 THEN <124>
63216 GOT0 Esada

Eğer bu programlarınızdan satır numaraları aynı olanlar varsa bunları değiştirmelisiniz. Şimdi programın nasıl çalıştığına bakalım. İlk önce 43 ve 46 adreslerinde bazı değişiklikler yaparak programın kendisini yüklenecek programın uzağına taşıyoruz. Sonra 3. satırda önce LOAD komutu sonra da uzaklaştırdığınız programınızı tekrar bulmanızı sağlayacak POKE komutları ekrana yazılıyor. 4. satırda klavye buffer'ını (643-640 adresleri) taşıyıcı return ile doldurup 198 adresine oraya kaç tane return koyduğumuzu söylüyoruz. 6. ve 7. satırlar bellekteki programı bilgisayardan gizleyerek yeni bir tane yüklediğinizde kaybolmasını önlüyorlar. Program biterken bilgisayar daha önce taşıyıcı return'lerle (CHR$(13)) uygun biçimde hazırladığımız input buffer'da ne varsa bunları aktif hale getirir. Yani program gerekli komutları kendisi yazar ve bunları taşıyıcı return'lerle sizin yerinize kendisi girer. Aşağıdaki kayma rutini aynı kavramlara göre çalışmaktadır. Bu rutin bir defada tek bir program satırı görmenize imkân tanımaktadır.

Bu programı kullanmak için şunları yapın: 1) Kaydırmak istediğiniz programı yükleyin. 2) BASIC'ten satır numarası kullanmadan direkt modda şu satırı girin: CLR: POKE 43,PEEK(45)-2: POKE 44, PEEK(46) Böylece bilgisayar sonraki adım için gerekli belleğin uçtuğunu sanacak. 3) Kaydırma programını yükleyin. 4) Aşağıdaki satırı direkt modda girin. POKE 43,1:POKE 44,8 5) RUN yazıp return'e basın. 6) Eksi (-) tuşuna basarak programı bir sonraki satıra kaydırın. Artı (+) tuşuyla önceki satıra dönebilirsiniz, ancak en başta en az bir kere aşağıya kaydırma yapmalısınız, yoksa program duracaktır. Gelecek ay alt adresleri incelemeye devam edeceğiz. Şimdilik hoşça kalın.