plazma - amatör bilgisayar kültürü

C64TPC - Proje Günlüğü

Ahmet Zeki Eymür

Bir süredir aklımda, TPC'nin geliştirilmesi sırasında yaşadıklarımı aradan fazla zaman geçmeden taze taze yazıya dökmek vardı. Plazma için TPC hakkında bir yazı yazmam istendiğinde kendime güzel bir ortam bulmuş oldum. TPC hem yazılım, hem donanım, hem de firmware ayakları olan bir proje. Bu yazıda okuyucuların proje hakkında teknik ayrıntılar bulabilmelerini sağlamak istiyorum. İlk önce kısaca C64TPC'nin ne olduğunu açıklayım.

Şekil 1.

1. C64TPC

C64TPC, C64'ü ve PC'yi seri portlarından birbirine bağlayarak C64'ün PC'nin veri depolama aygıtlarına erişimini mümkün kılan bir yazılım ve donanım birimidir. PC'nin sabit diskinde, CD/DVD sürücüsünde vb. olan bir dosyayı doğrudan C64'e yükleminizi ya da tam tersi C64'ün belleğinde bulunan bir dosyayı PC'de istediğiniz bir konuma kaydetmenizi sağlar. Bunu yaparken C64 tarafında ilave bir yazılıma ihtiyaç duymazsınız. Daha önce alıştığınız şekilde LOAD, SAVE, SCRATCH vb. komutları kullanırsınız. Yazılım C64'ten gelen komutlara göre PC tarafında gereken işlemleri yapar. Donanım ise farklı mimarideki bu iki bilgisayarın haberleşebilmesi için gereken tüm alt seviyeli işlemleri halleder.

Şekil 2.

2. GELİŞTİRME SÜRECİ

C64TPC, bu güne kadar üzerinde çalıştığım en karmaşık projeydi ve benim için çok öğretici oldu. Gerçi insana en son neyle ilgilendiyse en zoru oymuş gibi geliyor olabilir. Çünkü karşılaştığı zorlukların ve sıkıntıların anıları daha taze oluyor. Geliştirme süreci boyunca en az iki kere TPC'yi pencereden aşağı atmak istedim. :) İki kere de vazgeçmeyi ciddi olarak düşündüm. Bu tür uzun soluklu işlerde vazgeçmek de can yakıcı. Çünkü önceki emekleriniz ve zamanınızın çöp olmasına razı olmak kolay değil. Şimdi hatırladım, bir kere de üzerine hızlıca basıp ezmek istemiştim:).

Bu kadar sıkıntı yaşamamın büyük nedeni osiloskop ve lojik analizer gibi profesyonel ölçüm cihazlarına sahip olmamamdı. Bu cihazları birer cümleyle açıklamam yerinde olur sanırım. Osiloskop elektrik sinyallerindeki zamana göre değişimin grafiğini çizer. Lojik analizer ise dijital hatlardaki zamana göre lojik (0/1) değişimi gösterir.

Benim iki en büyük yardımcım "Inside Commodore DOS" ve "C64 Programcının El Kitabı" oldu. Zaten projeye başlamak için gerekli cesareti toplayabilmemi Programcının El Kitabında IEC portundaki hatların haberleşme sırasındaki lojik diagramlarının verilmiş olması sağladı. Programcının el kitabında bu tür bir bilginin bulunması bana garip gelmişti ama o diagramlar olmasaydı bu proje lojik analizersiz yapılamazdı. Elimde değişik durumları kapsayan üç diagram olduğu halde doldurmam gereken boşluklar hala vardı ve onları bulmak için benim elimde deneme yanılma yönteminden başka bir şey yoktu.

İşte en sıkıcı ve zor anlar onlar oldu. IEC portundaki hatların diagramlarda göremediğim lojik durumları için tahminler geliştirip defalarca deneme yapmak durumunda kaldım. Bir ara pes edip devreyi 8KB RAM takviyesiyle sadece hatların durumlarını kaydedip PC'ye gönderen basit bir analizere çevirmeyi bile düşündüm. Ancak zaman kaybetmek istemiyordum ve buna gerek kalmadan istediğim bilgileri deneme yanılma yoluyla derlemeyi başardım. Ancak bunu bir daha denemem :)

Şekil 3.

3. IEC PROTOKOLU

Bu gün aklımıza seri port deyince RS232 geliyor. PC'ler seri iletişim için bu standardı kullanıyor. Ancak C64'ün seri portu başka bir standardı takip eder: IEC. TPC'nin donanımı, IEC ve RS232 arasında çift yönlü protokol uygunlaştırıcı olarak çalışır. Muhtemelen siz de benim gibi IEC'nin Commodore tarafından geliştirilmiş bir protokol olduğunu düşünmüşsünüzdür. Çünkü başka bir IEC aygıt duymadık. Ancak araştırmaya başlayınca gördüm ki öyle değilmiş.

Bu protokolün ardından yine bilindik başka bir şirket çıktı: Hewlett-Packard.Bu protokolü HP 1960'ların sonlarında geliştirmiş ve adını HP-IB (Hewlett-Packard Instrument Bus) koymuş. HP bu protokolü geliştirdiği multimetre ve lojik analizer gibi test ve ölçüm cihazlarının kendi aralarında ya da bilgisayarlar ile iletişimi için kullanıyormuş. Diğer üreticiler de bu protokolü kullanmışlar ama başka bir isimle: GPIB (General Purpose Interface Bus). Protokol, 1975 yılında benim doğumumla beraber IEEE (Institute of Electrical and Electronics Engineers) tarafından standartlaştırılmış :) IEEE bu standarta "IEEE-488" ismini koymuş. Peki biz buna neden IEC diyoruz. Çünkü Commodore'un dokümanlarında hep IEC adı geçiyor. HP-IB, aralarında ANSI (American National Standards Institute) ve IEC'nin de (International Electrotechnical Commission)olduğu bir kaç değişik komisyon tarafından da değişik isimler altında standartlaştırılmış. Sanırım Commodore firması bilgisayarlarının tasarımında IEC tarafından yayınlanan belgeleri baz almış.

İşte C64'ün seri portu bu protokolün daha az sinyalle ve daha düşük hızda çalışan bir gerçeklemesidir. Aklınıza, "İhtiyaç duyulmayan sinyallerin kullanılmaması tamam da, neden daha yavaş?" sorusu gelmiş olabilir. Önce şaşırtıcı cevabı vereyim sonra açıklayım. Nedeni, VIC çipi. 1541 disket sürücünüzü kullanırken LOAD ve SAVE işlemleri arasında anlamlı bir süre farkı yoktur. Ancak TPC'yi kullanırken aynı dosyayı yüklediğinizden (LOAD) çok daha hızlı kaydedebildiğinizi görürsünüz. Bunun nedeni TPC'nin mekanik parça içermemesi ve işlemin gerçekleşme hızının sadece veri transferin hızıyla ilişkili olmasıdır.

Yani bir program ya da dosya belleğe yüklenirken veri transferi daha yavaş, diske kaydedilirken daha hızlı olmaktadır. Bilgi akışı C64'ten dış dünyaya doğru iken (SAVE) veri bitleri arasında IEC standardı gereği 20us beklenir. Bilgi akışı dış dünyadan C64'e doğruyken ise (LOAD) veri bitleri arasında, IEC standartı 20us beklemeyi gerektirdiği halde 60us beklenir. Çünkü VIC çipi C64'ün mikro işlemcisinde 40us'ye varan kesmeler oluşturabilmektedir. Eğer böyle yapılmasaydı iletişim sırasında oluşabilecek bir VIC kesmesi 1 hatta 2 bitin C64 tarafından algılanamamasına yol açabilirdi. Bu yüzden her bitin transferi sırasında en kötü durumun oluştuğu yani bitin gönderilmeye başladığı anda bir VIC kesmesi oluştuğu farz edilerek (40us(VIC kesmesi max.) + 20us(IEC standartı gereği min.)) = 60us beklenir.

4. EMULASYON

Zamanında Commodore firmasının disket sürücülere yaklaşımı çok farklı olmuş. 1541 disket sürücüsünün içinde bir C64 daha var desem sanırım abartmış olmam. 1541 disket sürücüsünün içinde C64'te kullanılan 6510 mikro işlemcisiyle arasında neredeyse hiç bir fark bulunmayan 6502 işlemcisi bulunur. Bu işlemciler o kadar aynıdır ki Frodo emülatörünün kaynak kodunu incelediğimde iki işlemci için aynı kaynak kod dosyasının kullanıldığını gördüm. Bu işlemci her 10ms de bir disket sürücü kontrolorü (FDC) gibi çalışır. Kalan zamanda ise Commodore DOS'u işletir. Evet MS-DOS gibi. MS-DOS zamanında koca işletim sitemine neden sadece Disk İşletim Sistemi adı verilmiş diye merak ederdim. Commodore bilgisayarları açısından isimde yadırganacak bir şey yok. Çünkü bu sistem 1541 ROM'unda gömülü olarak bulunuyor ve Disk sürücünün işlemcisi tarafından işletiliyor. Yani kelimelerin hakkını vere vere adını hakediyor: "Commodore Disk İşletim Sistemi".

Disk sürücü kendi işlemcisine ve o zamanlar için önemli bir rakam olan 2KB RAM'e sahip olunca sıra dışı kullanım şekilleri de başlamış. Oyun ve demo yazarları hesaplama amacıyla disk sürücünün işlemcisini, daha fazla hafıza için RAM'ini kullanmaya başlamışlar. Bir önemli sıra dışı kullanım şeklide daha hızlı veri transferi için kendi protokollerini geliştirmeleri olmuş. Yani 1541 disket sürücüsü dediğimizde aslında SID ve VIC çipleri olmayan bir C64'ten bahsediyoruz sayılır.

Peki TPC ilerde 1541 emulasyonu yapabilir mi? Bu konu üzerinde düşünmeye başladım. VICE'ın ve Frodo'nun kodlarını inceledim. 1541 ROM'unu da inceledim. İlk önce IEC transferini hangi entegrenin yönettiğini anlamaya çalıştım. Çok bacaklı VIA çipinin transferin ayrıntılarını kotardığını ve merkezi mikro işlemcinin verileri ondan bayt-bayt aldığını umuyordum. Çünkü PC'nin gerçek bir IEC portu yoktu ve PC, TPC'nin RS232 tarafındaydı. Ancak maalesef umduğum gibi olmadığını gördüm. IEC transferinin her anı bit-bit 6502 işlemcisi tarafından kontrol ediliyordu. Bu durumda ya yazılım ile bir IEC portu simülasyonu yapacaktım ya da 1541 ROM'unda bulunan IEC rutinlerini yamalayacaktım. Daha önce bahsettiğim "Inside Commodore DOS" kitabında 1541 ROM'unun ayrıntılı bir analizi bulunduğu için ilgili rutinlerin başlangıç adreslerini kolayca bulabiliyordum. Bu adreslerdeki komutu 6502 işlemcisinin kullanılmayan bir opcode'u ile değiştirebilir sonra Frodo'dan aldığım 6502 emulasyonu yapan kaynak kodları değiştirerek o opcode'a istediğim görevleri yükleyebilirdim.

Ancak daha sonra IEC portunun benim hiç hayal etmediğim kadar sıra dışı şekillerde kullanıldığını öğrendim. Foruma yazdığım soruya cevap veren Nightlord ATN hattını DATA hattı gibi kullanan loaderların olduğundan bahsediyordu. Başarılı bir emulasyon için IEC hatlarının durumlarının saniyede bir-kaç yüz binkere PC'ye transfer edilmesi şart görünüyordu. Bunun için gereken transfer hızına ise seri port ile çıkmak mümkün değil. Yani emulasyon konusundan önce TPC'nin USB versiyonunun yapılması gerekiyor. Ondan sonra VICE ya da Frodo gibi açık kaynak kodlu bir projeden alınacak kodlarla TPC yazılımına 1541 emulasyonu rahatlıkla yaptırılabilir.

Ahmet Zeki EYMÜR

plazma - 2008