Bu sayfadaki yazılar
Sayfanın metni
Sayfa 64
AYHAN KALAYLIOĞLU
Geçen yazımızda yarım bıraktığımız konfigürasyon değiştirme işleminin son kısmıyla bu yazımıza başlıyoruz.
730 — LDX $34 740 — SEL 750 — STX1 760 — ORA (SUML),Y 710 — STA (SUML),Y 780 — LDX $37 790 — STX1 800 — CLI 810 — RTS
Programımız bitmiştir! Artık rahat bir nefes alıp, doğru çalışıp çalışmadığını kontrol edebiliriz. Şimdiye kadar yazdığımız tüm programların hafızada yer aldığını varsayarak ufak bir BASIC program yardımıyla deneme yapalım. Tüm programların aynı anda hafızada olup da, bir de BASIC programı nasıl çalıştırmayı becereceklerini merak edenler için bunun yöntemini açıklayalım da daha sonra anlaşmazlık çıkmasın! Şimdiye kadar yazdığımız tüm altprogramların “source” kodlarını (assembler'dan geçmemiş hali) bir yerde saklıyorsunuz herhalde. Şimdi, SUPER ASSEMBLER'i yükleyip çalıştırdıktan sonra, bunları peş peşe yükleyip çalıştırın. Hepsi, hafızada kendileri için gösterilmiş yere yerleşecektir. Hepsinin “assembly” işlemi bittikten sonra, demin söylediğimiz “tüm altprogramların aynı anda hafızada” durumuna geldiniz demektir. BASIC'teki deneme programınızı yazıp çalıştırabilmek için, SUPER ASSEMBLER'i terk etmeniz gerekiyor. Bunun için, bilgisayarı kapatıp açmayacağınız aşikâr. Yoksa, deminden beri peş peşe yükleyip assembler'dan geçirdiğiniz programlar bellekten silinir. Fakat, SUPER ASSEMBLER'in “/X” komutunu kullanırsanız, bilgisayar ilk açılış durumuna dönecek, fakat sizin programlar
100 SYS 50176: REM GRAFİK MODUNA GEÇMEK 110 SYS 50208: REM EKRANI SİLMEK 120 POKE 780,16: REM SİYAH/BEYAZ 130 SYS 50240: RENK EKRANINI SİLMEK
140 FOR X'40 TO 319
150 POKE 780, X AND 255: REM X-LOW 160 POKE 781, X / 256: REM X-HIGH 170 POKE 782, X * 0.625: REM Y 180 SYS 50272: REM NOKTAYI KOYMAK
190 NEXT
200 GET A$: IF A-*“” THEN 200
210 SYS 50192: REM NORMALE DÖNÜŞ
TABLO I
hâlâ bellekte bulunacaktır. Artık, bu durumda BASIC'teki deneme programımızı yazıp çalıştırabiliriz. İşte program: (Bkz. Tablo 1)
Makine dilinde indeksli adresleme yöntemiyle, çalışmak istediğimiz bitleri tek tek kontrol edip düzenleyebiliriz.
Programı çalıştırdığınızda, sol üst köşeden sağ alt köşeye bir doğru çizilecektir. Herhangi bir tuşa bastığınızda ise normal yazı ekranına geçer. Bu örneği çalıştırdığınızda belli bir rahatlama duyacaksınız. Fakat, hemen arkasından bir işi tam yapamamanın rahatsızlığını duyacaksınız. Çünkü, bu kadar uğraştığımız programımız sadece nokta basıyor. Nokta silmek istersek ne olacak?.. Bu kadar çok şey yazdık. Herhalde bunların ucundan, köşesinden biraz bozup, değiştirip hem nokta koyup hem nokta silen bir altprogram yapabiliriz. Programın yaptığı, adres belirleme işlemi gibi karışık kısımları her iki işlem için de aynı olduğu için asıl değişikliği programın sonlarında, 760'ıncı satırdan sonra yapacağız. Şimdi, “ORA” komutunu kullanarak nokta koyma işlemini örnek değerlerle görelim.
Ve 01001000 Ve 00010000 ORA işlemi 01011000
Burada, “veya” işlemi sonucu, istediğimiz bitin yanmasını sağladık. Bunun tersi işlemi yapmak için “AND” komutunu kullanmamız gerekecek gibi. Ve 01011000 00010000 AND işlemi Ve 00010000 Pek olmadı gibi!.. Silmek istediğimiz bit dışında tüm bitler silindi. Bir de, “AND” işlemine silmek istediğimiz bit dışındaki tüm bitleri sokarsak, bu iş olacak gibi. Tabii, bunun için önce diğer bitleri işleme sokmamızı sağlayacak değeri hesaplamamız gerekiyor. Bu değerin bitlerinin işlem yapılacak değerin bitlerinin tam tersi olacağı açıkça belli oluyor. Bitleri tersine çevirmek için “EOR” komutunu kullandığımızı hatırlarsak:
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 65
e 00010000 Yo o
EOR işlemi
Bu değeri, istediğimiz biti silmek için kullanabiliriz.
01011000 Oo
70 01001000
AND işlemi
Şimdi sıra, bu işi programa yaptırmaya geldi. En son yaptığımız altprogramı, hem nokta koyabilecek hem nokta silebilecek şekilde değiştireceğiz. Yani, altprogramımız koordinatlardan başka, bir de yanık nokta mı, sönük nokta mı konacak, diye bir parametre daha olacak. Bu parametreyi, kullanım açısından rahat olması bakımından “carry” flag'ına koyacağız. Altprogram, yanık “carry” bitiyle çağırılmışsa yanık nokta basacak, eğer sönük “carry” bitiyle çağırılmışsa tersi işlemi yapacak. Programın başlarında gelen “carry” bilgisini bozmadan sonlarda kullanmak mümkün olmadığı için durum register'ini yığında saklayıp, gerektiğinde geri alacağız. Hatırlayacaksınız, saklama işlemi “PHP”, geri alma işlemi “PLP” komutlarıyla yapılıyordu. Bu komutları, programımızda uygun yerlere yerleştirmek gerekiyor. Aşağıdaki satırları programa ekleyin:
PHP PLP
145 — 135 —
Programın 760'ıncı satırdan geri kalan kısmını şöyle değiştirin:
760 — BCC SİL 710 — ORA (SUML),Y 780 — BCS OK2 790 —SİL EOR # $FF 800 — AND (SUML), Y 810 —OK2 STA (SUML),Y 820 — LDX # $37 830 — STX1 840 — CLI 850 — RTS
CARRY flag'ı sönükse 790'ıncı satıra sıçrıyoruz ve demin yukarıda elde yaptığımız “ters çevirme” işlemini, program içinde yapıyoruz. Ardından, bildiğimiz “AND” işlemi ve yerine geri yazma olayları gerçekleşiyor. Eğer, CARRY flag'ı yanık-
100 SYS 50176: REM GRAFİK MODUNA GEÇMEK 110 SYS 50208: REM EKRANI SİLMEK 120 POKE 780,16: REM SİYAH/BEYAZ 130 SYS 50240: RENK EKRANINI SİLMEK
1401-1 150 FOR X -0 TO 319
160 POKE 780, X AND 255: REM X-LOW 170 POKE 781, X / 256: REM X-HIGH 180 POKE 782, X * 0.625: REM Y 190 POKE 783,1: REM YAZMA/SİLME
200 SYS 50272: NEXT
210 GET A$: 1F A$-“” THEN 1-1-1: GOTO 150
220 SYS 50192: REM NORMALE DÖNÜŞ
TABLO ll
sa, “ORA” işlemi ile istediğimiz biti yakıp, yerine geri yazma işleminin olduğu yere sıçrıyoruz. Bu sıçrama işleminde “BCS” komutunu kullanarak gene “carry” bitinin içeriğine göre karar veriyoruz. Çünkü, “ORA” komutu “carry” bitinin içeriğini bozmuyor (eğer CMP, ADC gibi komutlar olsaydı, durum daha değişik olurdu).
Programımızın yeni halini denemek için, BASIC'teki altprogramımızda da bazı değişiklikler yapalım: (Bkz. Tablo III) Bu program çalıştırıldığında, deminki düz çizgiyi gene çizer, fakat hemen ardından aynı çizgiyi siler. Noktaların basılması veya silinmesi gerektiği, altprograma durum
100 SYS 50176: REM GRAFİK MODUNA GEÇMEK 110 SYS 50208: REM EKRANI SİLMEK 120 POKE 780,16: REM SİYAH/BEYAZ 130 SYS 50240: RENK EKRANINI SİLMEK
140 REM
150 FOR X—70 TO 150: FOR Y-X TO 199
160 POKE 780,X 170 POKE 781,0 180 POKE 782,Y 190 POKE 783,1 200 SYS 50272: NEXT: NEXT 210 FOR C-0 TO 255 220 FOR 1-1 TO 500 230 POKE 780,C 240 SYS 50240 250 NEXT 260 SYS 50192
TABLO Ili
(dolayısıyla CARRY flag'ini) geçiren 783 adresli bellek elemanı vasıtasıyla bildirilir. Program, çizme ve silme işlemlerini peşpeşe ve devamlı olarak yapmaktadır. Bunu durdurmak için herhangi bir tuşa basmanız kafidir. Böylece, normal yazı ekranına dönersiniz. Bu arada grafik ekranının, o anki durumu korunur. Yani, daha sonra grafik moduna geçtiğinizde ekranın son bıraktığınız halini görmeniz mümkündür. Şimdi biraz da renklerle oynayalım. (Bkz. Tablo II) Burada önce bir şekil çizilmekte ve bu şekil 256 değişik renk kombinasyonunda gösterilmektedir.
Makine dilinde programlama açısından, yazımızın bu bölümünde, indeksli adresleme üzerinde tecrübe sahibi olduk. Mantıksal işlemleri de oldukça detaylı kurcaladık. Böylece, artık istediğimiz bitleri yakıp, söndürüp, ters çevirebiliyoruz. Yığını, kendi verilerimizi saklamak için kullandık. Bunlardan başka, toplama ve bit kaydırma gibi işlemleri 16 bit üzerinden yapmayı becerdik. Şu anda, kavram olarak tek eksiğimiz, altprogram kullanma tekniği. Bu eksikliğimizi de zaten bir sonraki bölümde fazlasıyla gidereceğiz. Gelecek sayıda buluşmak üzere, şimdilik hoşçakalın...D