Kaset Turboları
Vedat Hallaç herkese merhaba. Geçen ay bitirdiğim yazıya, yaptığım testin cevaplarını vererek abonelik kazanan arkadaşların adlarını açıklayarak devam ediyorum. Ama büyük bir ihtimalle bu aydan sonra bu köşeyi göremeyeceksiniz. Bugün Eylül'ün ikisi ve bu günden sonra elime geçen cevapları değerlendirmeye alamayacağım. Cevapları geç yollayan arkadaşlara, gelecekte olabilecek yarışmalarda başarılar dilemekten başka yapabileceğim bir şey yok. Neyse, sözü fazla uzatmadan (oldukça zor olan) soruların cevaplarına geçelim: 1. İlk iş olarak 0 ile 1 bitlerine karşılık gelebilecek sinyaller bulmalısınız. Bu sinyaller, birbirinden ayırt edilebilecek kadar farklı uzunluklara sahip olmalılar. Daha sonra, bir dizi sıfır arasına sadece bir adet bir biti yerleştirilmiş bir bayt kullanarak teypten gelen sinyallerin bayt senkronizasyonunu yaparsınız. Bu senkronizasyon baytlarının hemen arasına bir kontrol baytı koyarak tam senkronizasyonun tutup tutmadığını kontrol edersiniz. Bundan sonra teypten okuduğunuz her sekiz biti bir bayta yerleştirip belleğe yazabilirsiniz. Ne yalan söyleyeyim bu soruda tam olarak ne istemiş olduğumu ben de anlayamadım. Bu sebepten, bayt okunabilecek herhangi bir cevabı doğru saydım. 2. Esra Turbo, demin anlattığım senkronizasyondan hemen sonra dokuzdan geri sayarak her baytı kasettekiyle kontrol ediyordu. Eğer burada herhangi bir hata çıkarsa, programın geri kalanı yüklenmiyordu. 3. D şıkkı. Bu soruyu sorarken bir hata yapmışım: “Aşağıdakilerden hangileri” yerine “Aşağıdakilerden hangisi” demem gerekirdi. Burada affınıza sığınıyorum ve konuya yeterince hakim olanların bu hatayı hemen yakalamış olduğuna inanıyorum. Doğru cevap tabii ki D şıkkı olan $08'dir. Çünkü yalnızca bu baytın içinde bir tek 1 biti bulunur. 4. Programın başlangıç ve bitiş adresleri yazıldıktan sonra yazılan her bayt, başlangıçta $00 değerini taşıyan $FB adresinin değeriyle EOR'lanıyor. Yani $02, $02, $05 yazmaya kalkarsanız $FB'nin değeri, $01, $03, $06 olarak değişir ve kontrol toplamımız $06 olarak yazılır teybe. 5. $BA: device (ünite) numarası. $B7: dosya adının uzunluğu. $BB,$BC: dosya adının bulunduğu adresler (alçak-yüksek bayt formatında). 6. Eğer kasede kaydedilecek dosyanın adının uzunluğunu 16 değil de 116 olarak verirsek, 16 harflik isimden sonra yüz baytlık program da dosya adıyla birlikte kasede kaydedilir. Böylece $0351'de başlayan bir programı dosya adıyla birlikte kaydedip, $02A7'deki programı da dosya olarak $0300'den $0351'e kadar olan bölgeyi kaydetmemize gerek kalmaz. Fakat bu soruda bir baskı hatası yüzünden “Loader'ın yükleneceği” kısmı “Loader'in yükleyeceği” şeklinde çıkmış. Bu yüzden bu soruyu iptal ediyorum. 7. D ve B. Voltajın yönünü değiştirmek için $01 adresli baytın 3. bitini (ilk bite 0. bit dersek) ters çevirmek gerekir diye düşünmüştüm soruyu sorarken, ama ifade hatası yüzünden sorunun cevabının B şıkkı da olabilir. Bu yüzden her iki cevap da doğru sayılıyor. 8. $EFFA,$FFFB: NMI interrupt vektörü. $FFFE,$FFFF: IRQ interrupt vektörü. 9. $DC04,$DC05: CIA 1 Timer A, alçak-yüksek bayt formatında. 10. RUN komutunu makine dilinden yapabilmek için ilk olarak $A659 adresine sıçrayıp (Jsr) ortalığı temizleyip BASIC'i sevindirmek, sonra da $A7AF'ye gidip (Jmp) RUN komutunu gerçekleştirmek gerekir. Ya da ANKARA'lı Onur Malkoç'un önerdiği gibi Keyboard Buffer'a R, U, N, RETURN kodlarını yerleştirip Buffer'da bulunan karakter sayısını 4 yaparsak, BASIC'e döner dönmez ekrana RUN yazılır ve komut işletilir. 11. C şıkkı. Doğal olarak, yüklenen BASIC programı $0801 — 2049 adresinden başlayacak ve sizin verdiğiniz değeri silecektir. 12. Kernal klavyeden girilen veya programda bulunan sıradaki baytı alabilmek için $0073 adresine sıçrar. Bu konuda değişik cevaplar geldi ama bu adreslerden hiçbiri BASIC programında bulunan karakteri okumaz. $FFE4, klavyede basılı olan tuşun kodunu (tuşa basılmıyorsa 0 değerini) A'ya koyarak geri döner. $FFCF ise INPUT komutu gibi davranır (Bu iş biraz program gerektirir tabii ki).
13. $F76A adresindeki rutin, program adı, başlangıç-bitiş adresi ve program tipinin bulunduğu kayıt başlığını (header) kasede kaydeder. 14. $F838 adresinde bulunan rutin, ekrana “Press Record&Play on tape” mesajını yazar ve teyp tuşlarından birine basılmasını bekler. 15. Bu adresler gerçekten de bütün değişiklikleri normale çevirir. Fakat 43-44'ün değerleri $0281, $0282 adreslerinden okunur. Yani bir kırıcı $0282'nin değerini $FF yaparsa gitti korumanız... Bunun yanında birçok arkadaşınızın da belirttiği gibi $FD02'ye sıçrayarak RESET kontrolü yapmadığımız için, RESET veya RESTORE'a dayanıklı bir program kullanarak programımızı kırabilirler. 16. $8004 adresine CBM80 (ASCII kodlarıyla değil... Sırasıyla şu baytları girmelisiniz: $C3 $C2 $CD $38 $30) yazarsanız ve $8000-$8001 ve $8002-$8003 adreslerini istediğiniz rutini gösterecek şekilde (alçak-yüksek bayt formatında) ayarlarsanız RESET ve RESTORE durumunda sizin ayarladığınız adreste bulunan rutine sıçranır. Yazılarımda CBM80'in kodlarını vermediğim için ASCII ve CBM80 yazılır diyen arkadaşlarınızın da cevaplarını doğru saydım. 17. C şıkkı. Sırasıyla $DC0F'ye $11, $DD0F'ye $83 verirseniz kendi NMI'ınızı yaratabilirsiniz. 18. A registerinin değeri $EA olur. $F4 kodlu DOP (Double NOP) komutu, $F4-$A9 çiftinin tek bir NOP komutu gibi görülmesini sağlar ve geriye LDA #$EA komutu kalır. 19. Tüm belleği ($0801-$FFF7 arasını) birbirini tutmayan baytlarla doldurup, yüklenen kısacık bir programın bile yüzlerce blok tutmasını sağlardık tabii ki. Bu baytlar $00,$01,$02 gibi sırayla gidebilir ya da tamamen tesadüfi olabilir. Bu tamamen sizin seçiminize kalmış bir olay. Yarışmamızın şampiyonu Selçuk Aygüney'in üşenmeyip de denediği bu yöntemle, MULTI ICE II, bomboş bir hafızayı 4 dakika 12 saniye içinde 198 blok olarak kırıyormuş. Kendisine ilgisinden ve sabrından dolayı çok teşekkür ediyorum. 20. $0318-$0319 adresleri, KERNAL ROM'u yerindeyse NMI rutinini gösterir. Bu adreslere alçak-yüksek bayt formatında yazacağınız adreste bulunan rutin her RESTORE tuşuna basıldığında çalıştırılacaktır. 21. Blok sayısı yazılacağına göre ilk olarak 65. sayıdaki yazıda anlatılana benzer şekilde iki basamaklı sayıları ekrana yazacak rutini yazmak gerekiyor. Daha sonra yüklenmekte olan adresin yüksek baytını A registerine alıp, bu değerden 8 çıkartmamız gerekir. Artık blok sayısını gösteren bu değeri ekrana basabiliriz. Tabii ki bu biraz saçma bir program oldu. Her bayt okunduğunda (ya da her taramada) bir kez çalıştırıldığı için çok RASTER satırı yer. Oysa şöyle bir program yazsaydık daha kısa ve etkili bir yöntem kullanmış olurduk (hem de onluk sistemi kullanabilirdik): Program yüklemeye başlamadan önce ekrana 000 yazılır. Yükleme yapılırken, yüklenmekte olan adresin yüksek baytı değişirse, ekrandaki bu sayının en sağdaki basamağı bir artırılır (INC $0402 gibi). Fakat artırmadan önce karakterin dokuz olup olmadığına bakmamız gereklidir. Eğer karakter dokuzsa, bu basamağı sıfırlayıp bir soldaki basamağı artırmamız gerekir (9 kontrolünü yaparak). Bu şekilde bir blokta bir kez birkaç baytın değeriyle oynanır o kadar. 22. $D012 adresi, (Makine Dilinin Püf Noktaları'nı okuyan herkesin bildiği gibi) ekranı tarayan elektronun hangi satırda bulunduğunu gösterir (Yalnızca iki sekiz biti $D012'de bulunur. 9. bit için $D011'in son bitine bakmanız gereklidir). Aynı zamanda bu adrese yazdığınız bir değer, elektronun her bu değere gelişinde bir IRQ oluşmasını sağlar. 23. Y'yi başlatmışız. Bu sayede tüm satırın son karakterle aynı değeri almasını sağlamış oluruz. Yani ilk olarak $07E7'deki baytı $07E6'ya alırız, sonra da $07E6'daki baytı $07E5'e alırız.
Sonunda tüm satırı aynı karakterle doldurmayı başarırız. Bu komik hatadan kurtulabilmek için de Y'yi 0'dan başlatıp #$27'ye kadar artırmamız gerekir. Bu soruda da bulunan baskı hatası sayesinde yeterince dikkatli olmayan arkadaşlarımız da yarımşar puan topladılar bu sorudan (LDY #$27 yazdığımız için Y'nin değerinin her zaman #$27 olmayacağını söyleyenlerden bahsediyorum). 24. IRQ yükleyicimiz, sizi daha önce de uyardığım gibi $2D-$2E (BASIC programının sonunu gösteren adresler) adreslerinin değerlerini düzeltmiyor. Bu yüzden sizin de düzeltmediğiniz bu adresler, büyük ihtimalle $0803'ü gösterir durumda kalıyor program yüklendikten sonra. İlk değişkene değer verdiğiniz anda da, programınızın ortasına komik komik şeyler yazılıyor (değişkenle ilgili bilgiler). Program da uçmuş olduğu için çalışamıyor. Olay bundan ibarettir. 25. İlk olarak da LDA ve STA'yı nereye ekleyeceğinizi bulursunuz. Sonra da burada hemen önce en az üç baytlık bir-iki komut bulursunuz ve bu komutları bir yere not edersiniz. Bu komutların kapladıkları baytların başına JMP $0000 yazarsınız ve geriye bir ya da iki bayt artarsa bunları NOP'larla kapatırsınız. Sonra birkaç komut alabilecek bir boş alan bulursunuz. Bu alana ilk olarak not aldığınız komutları, sonra da eklemeniz gereken komutları yazıp RTS ile işinizi bitirirsiniz. Bu rutinin başlangıç adresini kafanızda sürekli tekrarlayarak programın başında JMP $0000 yazdığınız yere dönersiniz ve bu komutu JSR Adres (Adres — kafanızın içinde dolaşan adres) ile değiştirirsiniz. Eğer tek hata buradaysa programınızın çalıştığını görür zevkten dört köşe olursunuz. Evet, şimdi de heyecanla beklenen an geldi. Yarışmaya cevap gönderen arkadaşların aldığı puanları açıklıyorum:
1. Selçuk Aygüney: 24/24 2. Serkan Zoroğlu: 23.5/24 3. Ertuğrul Cem Özdamar: 22,5/24 4. İsmail Şahin: 22/24
5. Onur Malkoç: 22/24 6. Olcay Ergün: 22/24 7. Caner Şimşir: 21/24 8. Şemseddin Moldibi: 18.5/24 9. Fatih Dikbaş: 17.5/24 10. Mustafa Özenç: 17.5/24 11. Erkan Doğan: 13/24 12. Tolga Özdemir: 12/24 13. Sinan Acıöz: 7.5/24
Yukarıdaki arkadaşlarımızın tümüne yarışmaya olan katılımlarından dolayı teşekkür ediyorum. Bu arada 22 puan alan üç kişi arasında yapılan kurada kaybeden Olcay Ergün'e derin üzüntülerimi iletiyorum. Umarım şevkini yitirmez ve diğer yazılarda da yapmayı düşündüğümüz yarışmalara katılır. Abonelik kazanan bütün arkadaşların abonelikleri 69. sayıdan itibaren başlayacak. Hepsini başarılarından dolayı kutluyorum. Şimdi de yazılan mektuplara ve sorulara cevap kısmı:
1. Olcay Ergün: Ne yazık ki şu anda 64 donanımıyla ilgili yazılar yazabilecek elemanlarımız yok. Bu yüzden 64'ün kapılarıyla ilgili yazılar için biraz beklemeniz gerekecek. Bu arada 6800 yazılarıyla ilgili düşünceniz de ne yazık ki gerçekleşemeyecek. Şimdi bile AMIGA yazılarının çok fazla olduğunu söyleyen 64'çüler, bir de 68000'e başlarsak bizi linç ederler sanırım. Bu arada cevaplarınız arasında bulunan soruları da cevaplayayım: Turbo yükleyicide NMI'ı neden bir RTI gösterecek şekilde ayarladığımızı sormuşsunuz. Biliyorsunuz Turbomuz KERNAL'ı kaldırarak yükleme yapıyor ve $FFFA ve $FFFB'ye bir değer vermemiz gerekli (KERNAL yerinde olmadığı için burada herhangi bir değere rastlayabilirsiniz). Eğer bir RTI'yı göstermezsek, herhangi bir anda RESTORE'a basıldığında burada gösterilen garip rutinlere dallanılır. Biz RESTORE'u etkisiz hale getirmek istediğimiz için interruptlar için RTS yerine kullanılan RTI'yı
(RTI: ReTurn from Interrupt — İnterrupttan dön) program olarak gösteriyoruz. 2. Mustafa Özenç: Yalnızca yazıya bakarak 17.5 puan aldığınız için kutlarım sizi. Ama yazıların içinde cevapları ararken birkaç yeni şey öğrendiğinize eminim. Zaten bu testin bir amacı da buydu. Yazılarımı daha anlaşılır yazmam gerektiği konusunda haklısınız. Bir süredir bu konuya ben de dikkat ediyorum. Ama bildiğiniz gibi burada yazdıklarım makine dilini belirli bir derecenin üzerinde bilenlere hitap ediyor daha çok. Bu yüzden de ne kadar basitleştirmeye çalışırsam çalışayım, konunun karışıklığı devam ediyor. Buna okuyucuların ilgisizliği de eklenince daha anlaşılır yazmak için nereyi düzeltmem gerektiğini anlamam imkansızlaşıyor. Eğer şimdiye kadar beş kişi bile sizin gibi mektup yazıp, eleştiri yapmış olsaydı, şu anda çok daha yararlı yazılar yazıyor olabilirdim. Umarım önümüzdeki aylarda okuyucularımızın da dergiye katılımını sağlayabiliriz. Yeni bir makine dili kursu konusundaki önerileriniz de ne yazık ki pek şanslı görünmüyor, çünkü şimdiye kadar en az üç ayrı makine dili kursu yayınladık ve insanlar bıktı bu kurslardan. Eğer bu kurslarla ilgileniyorsanız, eski sayılarda yayınlanan kursların bulunduğu sayıları dergimizden temin etmeniz mümkün. Döküm Eki için ise çalışmalarımız sürüyor. Fakat bu konuda da size bağlıyız. Eğer elinizde iyi programlar varsa bunları arkadaşlarınızla paylaşmak için bize yollayabilirsiniz. 3. Caner Şimşir: Ne yazık ki te-
"pemize çöreklenen bu bela sizin Dİ-
NO'nun değil. Bizim dinazorun adı COMOZOR. Ve ne yazık ki bütün işlere burnunu sokmadan önce dergimizden ayrılmaya niyeti yok. Ama söylediğine göre bir ay kadar önce sizin DINO'nuza Taksim dolaylarında rastlamış. Umarım kısa zamanda dinazorunuzu bulursunuz. Derginin erken çıkması konusundaki istekleriniz ise COMOZOR tarafından hallediliyor bu arada. Bu işi yapabilmek için de hepimizi köle gibi çalıştırıyor. Umarım bundan sonra her ay otuzgen olursunuz. 4. Emin Tolga Özdemir: Makine diliyle ilgili kaynak bulamama derdinizin ne yazık ki çok iyi bir çözümü yok. Ya İstanbul'a gelip bir de burada dolaşacaksınız, ya da bize yazıp, eski sayılarımızda yayınladığımız makine dili kurslarından birinin bulunduğu sayıları isteyeceksiniz (postayla halledilebileceği için ikinci seçenek daha kolay gibi geldi bana). Abonelik kazanan arkadaşları tekrar kutlar, mektup gönderen tüm arkadaşlara da teşekkür ederim. Diğer yazılarda görüşmek üzere hoşçakalın.
Ki
Oyun Değerlendirmesi: AMIGA HİT 512K/OCEAN
Grafik © Konu Zorluk 6 Efektler/Müzik : 8
Genel ir (dl Al, İK
| (ll erir | | Ül | | Tl |! AD (DI
Görünen dağlık alanlara ve boş yerlere gidemiyorsunuz. Haritanın en sol-üst köşesinde bir kutucuğu göreceksiniz. Burada tıkladığınızda karşınıza başka bir menü daha gelecektir. Bu menüden Save ile oyunu saklayabilir, Restore ile eski bir oyun yükleyebilir, Restart ile oyuna en baştan başlayabilir, More Graphics ile oyuna daha çok grafik katabilir veya Do Nothing ile System'den çıkıp oyuna geri dönebilirsiniz. Şimdi oyunda, daha önce anlattığım yerlere gelince ne yapacağımıza değinelim.
KALE:
Kalelere hemen oyunların başlarında yani kanunsuz işlere henüz bulaşmamışken gitmenizi tavsiye ederim. Çünkü işlere karıştıktan sonra herhangi bir kaleye giderseniz, kaledeki süvarilerin başı sizin gibi kanunsuz adamları kalede görmek istemediklerini söylüyorlar. Kaleye gittiğinizde adam size bir şeyler söyleyecek ve daha sonra karşınıza Talk, Greet, Threaten, Move On, Offer Bribe ($15) seçeneklerinin olduğu bir menü çıkacaktır. Buradaki seçenekle-