Bu sayfadaki yazılar
Sayfanın metni
Sayfa 56
Olayı biraz daha yakından inceleyince bu işlemin nedeni açıklık kazanıyor. SUML işlemi sonucunda elde oluşursa, bu durum carry bitinin yardımıyla SUMH'ye iletiliyor. Yani ADC SUMH'nin değerini değiştirmeyecek diye bir şey söz konusu değil. Akünün beş katı değeri bulduktan sonra, üç kere de iki katını alarak hedefimiz olan kırk katı değeri elde edelim:
340 — ASL SUML 350 — ROL SUMH 360 — ASL SUML 370 — ROL SUMH 380 — ASL SUML 390 — ROL SUMH
Böylece, yukarıdaki formülün içinde yer alan en zor ve korkunç terimi hesaplamayı becerdik. Şimdi buna hemen yanındaki terimi hesaplayıp toplayalım.
400— — TYA 410 — AND : 7 420 — CLC 430 — ADC SUML 440 — STA SUML 450 — LDA SUMH 460 — ADC O 470 — STA SUMH
Burada gene yukarıdaki 16 bit üzerinden toplama yaptık. Sekiz bitlik gruplar arasındaki eldeyi de unutmadık tabii. Şimdi, bir de X-koordinatının en alt üç biti silinmiş halini elde ettiğimiz değere toplayalım:
480 — CLC 490 — LDA XL 500 — AND : SF8 510 — ADC SUML 520 — STA SUML 530 — LDA XH 540 — ADC SUMH 550 — STA SUMH
Grafik belleğimizin başlangıç adresi $0000 olmadığı için, biz daha hâlâ bize gerekli olan adresi hesaplayabilmiş değiliz. Başlangıç adresimiz $E000 olduğu için, bu ofset değerini de toplayalım.
— CLC S70— — LDA : > (SE000) 580 — — ADC SUML 590 — — STA SUML 600 — — LDA ($E000) 610— — ADCSUMH 620— — STA SUMH
Nihayet, SUML/SUMH bizim için gerekli olan adres. Bir de, bu adresteki byte'ın içindeki bit pozisyonunu hesaplamamız gerekiyor. Bu bilgiyi bize, demin hesaplarken kullanmadığımız, X-koordinatının en alttaki üç biti sağlıyor. Bu üç bitin değeri ve bize lazım olan bit numarasını bir tabloda eşleyelim. Böylece arada bir ilişki kurup, bize gerekli olan algoritmayı yaratabiliriz. Bu noktada, gerekli olan bellek elemanının adresini ve bize gerekli olan bitin numarasını biliyoruz. Şimdi bu bite karşılık gelen değeri elde etmemiz gerekiyor. Bunun için değeri '1' olan byte'ın içeriğini (yalnızca sıfır numaralı bit yanık) bit numarası kadar sola kaydırırız.
660 — TAX 670 — LDA 21 680 -SHIFT DEX 690 — BMI OK 700 — — ASL 710 — BNE SHIFT 720 —OK
Akümülatörün içeriğini X-registerinin miktarı kadar sola kaydırdık.
X-koor. Bit no. 0 - 7 6 2 $ 3 4 4 - 3 5 2 6 1 7 0
Yukarıdaki tabloda yeralan değerleri ikili sistemde ele alırsak birbirlerine karşılık gelen rakamlar arasındaki en belirgin ilişkinin bitlerinin ters çevrilmesi olduğunu görürüz. Bilindiği gibi 'EOR' komutu böyle bir işlemi gerçekleştiriyordu.
630 — LDA XL 640 — AND : 7 650 — EOR :7
690'ıncı satırda X-registerinin içeriği bir eksiltiliyor ve hemen arkasından negatif değer elde edilip edilmediği kontrol ediliyor. 710'uncu satırda her ne kadar şartlı dallanma komutu bulunsa da, program burada iken akünün içeriği hiçbir zaman sıfır olmadığı için dallanma olayı daimi olarak gerçekleşiyor. Tüm döngüden çıkış “OK” adlı etiket üzerinden gerçekleşiyor ve döngüden çıkıldığında, bit pozisyonuna karşılık gelen byte değerini elde ediyoruz. Artık ese yazacağımız burada biraz dikkat etmemiz gerekiyor. Şu anda ulaştığımız byte'a daha evvel de bir şeyler yazılmış olabilir. Yani, biz bu adrese doğrudan bir şeyler yazacağımıza buranın içeriğini de dikkate alıp onun üzerinde değişiklikler yapıp öylece yerine yazmamız gerekiyor. Bizim altprogramımızın yapması gereken iş, belli bir koordinatı yakmak olduğuna göre, elde ettiğimiz adresteki elde ettiğimiz numaraya sahip biti yakmamız gerekiyor. Bu olay da, o adresin içeriğini bulduğumuz değerle 'OR' (veya) işleminden geçirmekle olur. Adresimiz iki byte'lık bir göstergeçte bulunduğuna göre indirekt indeksli adresleme tipini kullanmamız için geriye sadece Y-registerini sıfırlamamız kalıyor.
720 —OK LDY :0 130 — ORA (SUML),Y 740 — STA (SUML),Y 750 — RTS
Programımız, mantıksal olarak tümüyle bitti ve bu haliyle işini yapması lazım. Fakat, biz gene de ufak bir noktayı atladığımız için olaylar böyle gelişmeyecek ve programımız doğru olarak çalışmayacaktır. 730'uncu satırda komutu akünün içeriğini $E000'dan $FFFF'e kadar olan bir elemanın içeriği ile 'veya' işlemine sokacaktır. Fakat, normal durumlarda bu bölgede 'KERNAL' romu bulunduğu için, okuma işlemlerinde grafik ram'ine ulaşamayacağız. Yani, 'ORA' komutundan önce 'KERNAL' romunun yerine, grafik ram'inin görünmesini sağlamalıyız. Böyle bir konfigürasyonu seçtiğimizde, işletim sistem romu, bellek haritasında yeralmayacağı için herhangi bir 'interrupt' durumunda bilgisayarınız derhal 'crash' edecektir. Çünkü, interrupt altprogramı işletim sistem romunda yeralmakta. Bu yüzden, sözkonusu konfigürasyonu seçmeden önce interrupt'ları engelleyen flag'ı yakmalıyız. İşimiz bittiğinde, eski konfigürasyonu yerine koyar ve interrupt'lara tekrar izin veririz. Bu arada ek bilgi olarak, belirttiğimiz konfigürasyon değiştirme işleminin $0001 adresli hafıza elemanı vasıtasıyla yapıldığını söyleyelim. Programımızın son kısmını ve BASIC dilinde yazacağımız deneme programını gelecek sayımızda vereceğiz.
Klavyeyle gezinmek için ← ve → tuşları.