Bu sayfadaki yazılar
Sayfanın metni
Sayfa 22
En iyisi, lafı daha fazla uzatmamak. Programın assembler listesini Tablo 3'de görebileceğiniz için detaylı olarak buraya yazmayacağım. Program MDE listesini döküm
- - $57 « $59 - $5B « $BBA2 $BCSB
ARRTAB
4802 uzunluğunu ekle ş;N pointeri dizi göstersin. (ARRTAB) ,Y
»
NPNT*1 KPNT 45805 NPRT
sonunun beş eksiği son elemanın adresini verir. Lı ARRTAB
Li
BE
41 pointer'ı dizinin ilk elemanını göstersin )
KA >» ğ
temizle
BAR
bel >
35
STA
TAY iyüksek değerlikli Y'ye 'TXA şdüşük değerlikli A'ya FAC'a
maya kalkarsanız, ilk baştaki doksan değe- rin sıfır olduğunuz ve sonraki sayıların (eğer sayılarınızın hepsi pozitifse) sizin dizinizin sıralanmış hali olduğunu görürsünüz. Bu yüzden, DIM kullanmadan açılan dizilerde (eğer eleman sayısı 10'dan azsa DIM komu- LDA JPNT JSR COMPARE ile FAC'ı karşılaştır BM büyük ise dallar LOY büyük STY FLAG #Flagsd SWAP LDA (JPNT),Y TAX LDA (JPRTİ),Y ile TXA STA (JPNT1),Y BPL SWAP NOSWAP LDA SEC sac 4505 STA JPNT BC$ TESTİ DEC TESTİ CMP I1PNT BNE — JDÖNGÜSÜ LOA CHP BNE LDA FLAĞ BEO BİTİR şEvet. LDA IPNT ADC STA IPNT BOC TESTİ ENC TESTİ CMP BNE — İDÖNGÜSÜ LDA CMP #İ-N? BNE ;Hayır. BİTİR RTS şEvet. FLAG *BYTEO NPNT
Tablo-3: Sıralama işlemini makine dilinde yapacak olan programın assembly listesi.
Bu program A(N) dizisini deminki BASIC program kadar iyi sıralar. Peki BASIC'den kolayca yazmak dururken neden bu karmaşık makine dili rutinleriyle boğuştuk? Bu sorunun cevabını yer alan ufak hız karşılaştırması gösterecektir. Makine dili rutinini yükledikten sonra kalacak yerlere SYS 828'leri koymanız gereklidir. Ama demin olması gerektiğini söyleyerek sıralanmayacaktır. Eğer 100'lük bir dizinin on elemanını doldurup bunu sıralatmanıza ihtiyacınız yoktur. Programın en başında kullanacağınız bir A(5) 53 komutu A için 10'luk bir dizi açacaktır.) 10'dan az eleman kullandığınızda doğru sonucu elde edemezsiniz. Tablo 4'de de gördüğünüz gibi makine dili programımız dizi boyutu büyüdükçe daha fazla zaman kazanmanızı sağlıyor. Eğer bu program bile size yavaş geliyorsa (çok büyük dizileri sıralamak için), daha etkin sıralama algoritmaları kullanmalısınız. Geçen sayılarımızda Sinan sıralamalar konusuna değinmişti. O yazıdan Quick sort algoritmasının mantığını öğrenebilirsiniz. Eğer makine dilinde kendinize gerçekten güveniyorsanız quick sort'u yapmayı bir deneyin. Gerçekten de kendi yığıt'ınızı (stack'inizi) oluşturmanız ve belli sayıları bu yığıta mantıklı bir şekilde atmanız gerekecek. Bu yüzden bu algoritmanın makine diliyle gerçekleştirilmesi oldukça (oldukçadan daha fazla) zordur. Biraz alıştırma yapmak isterseniz, burada yayınlanan sort programını adam etmeyi deneyin. Mesela gerekli kontrolleri yaparak herhangi bir kayan noktalı diziyi sıralamasını sağlayın (sadece ilk diziyi değil). Ya da tam sayı ve string'leri de sıralayabilen genel bir sıralama programı yazın. Tabii her zaman söyledim, söyleye söyleye dilimi kafamdan daha tüylü hale getirdim lafımı tekrarlayacağım: Yaptığınız programları bana da yollayın. Gerçekten de yazılarımın ne derecede işe yaradığını merak ediyorum. Kendi çalışmalarınızda kullanabilmeniz için sık kullanılan ROM rutinlerinin adreslerini Tablo 5'de bir araya getirdik. FAC kolonunda bulunan bir * işareti, FAC'ın içeriğinin değişeceğini, işareti ise aynı kalacağını belirtir. Eğer fonksiyon hem FAC'ı hem de ARG'ı kullanıyorsa rutin çağrılmadan önce A register'ı, yani akümülatör, FAC'ın üssüyle ($61) yüklenmelidir. AND, OR ve NOT gibi mantık işlemlerinde ilk olarak değerler 16 bit tamsayılara çevrilir, daha sonra bitler üzerinden gerekli işlem yapılır ve sonuç tekrar kesirli sisteme döndürülür. BASIC yorumlayıcısının işlemleri yaparken kullandığı bazı sabitler de ROM'da yer alır. Bu sabitlerin değerlerini, anlamlarını ve adreslerini de Tablo 6'da görebilirsiniz. Bu değerler matematiksel işlemleri yaparken sık sık karşınıza çıkacaktır.
Evet, son yazımız da buraya kadar. Aslında işe ilk başladığımda çok daha derinlere inmeyi düşünüyordum, ama daha önce de belirttiğim sebeplerden dolayı bir süre aşırı teknik yazılardan kaçınacak, daha çok yeni başlayanlara yönelik makine diline başlangıç yazılarına yer vereceğiz dergimizde. Bu sayede burada ele alacağımız konulardan daha fazla yararlanabileceksiniz. Eğer Commodore 64'ünüzün tüm ROM'unun makine dili listesini elde etmek istiyorsanız dergimize yazın. Bu konuda size verebileceğimiz çok güzel bir kitap var. İngilizce açıklamalarıyla birlikte tüm BASIC ROM ve KERNAL programları bu kitapta yer alıyor. Yeni bölümlerde buluşmak üzere hepiniz hoşçakalın.
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 23
N BASIC Program Makine Dili Rutin 10 0.0" 50 24" 0.4" 100 37" 1.5" 200 6' 6.3" 500 41/ 38.7" 1000 2s 44' 2' 33.4" Tablo-4: Makine dili rutin ile BASIC programın N boyutlu bir diziyi sıralama süreleri.
Adres Sabitin Adresi Hazırlık FAC İşlev $BABC A/Y ARG - sabit $BBEC - FAC « ARG $BB12 FAC « ARG/FAC A/Y FAC « sabit/FAC $BAE2 - FAC - FAC*10 $BAFE - FAC — FAC/10 , $B849 FAC FAC*0.5 $BBA2 FAC sabit ARG « FAC $BBD4 sabit - FAC $B853 FAC « ARG-FAC $B850 FAC « sabit-FAC FAC - ARG*FAC $BA2B FAC « FAC — FAC - sabit*FAC $BF7B FAC —« ARG“FAC $BF78 FAC — ARG“sabit FAC polinom $B043 FAC « polinom2 $AFE6 FAC « ARG OR FAC $AFE9 FAC — ARG AND FAC $AED4 FAC NOT FAC $BC5B FAC ile sabiti karşılaştır $BC1B - FAC'ı yuvarla $BEFB4A - - FAC -FAC Tablo-5: ROM'da bulunan önemli rutinlerin adresleri. Geçen sayıda birlikte tüm fonksiyonları göstermiş oluyoruz. Tabloda gösterilen A, X ve Y harfleri register adlarıdır. FAC ve ARG de daha önce bahsettiğimiz adreslerde ($61.. , $69..) yer alırlar, * ğ Db 4 4 b 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 1
- - -
DEĞERİ 3.14159265 -32768 1 *434255942 2.88539007 *707106781 1/SOR(2) 1.41421356 SOR(2) -.5 :693147181 LOG(2) 10 99999999.9 999999999 1E9 1.44269504 1/106(2) 2.14987637E-5
$BFE8 00 00 00 1 35 44 TA 11879546 $E092 28 BI 46 3.92767774E-Â $E2EO 49 OF DA 1.57079633 $E2E5S 49 OF DA 6.28318531 $EZ2EA 00 00 00 00 :25 $E2FO EĞ 1A 2D $E2FS 28 07 FB F8 42.0077971 $E2FA 99 68 89 Ol — -76.7041703 $E2FF 23 35 DF El 81.6052237 $E304 AS 5D E? 28 — -41.3147021 $E309 49 OP DA A2 6.28318531 $E33F B3 83 BD D3 — -6.84793912E-4 $E344 1E F4 AĞ F5 4.85094216E-3 $E349 83 FC BO 10 -.0161117015 $E34E OC 1F 67 CA $E353 DE 53 CB -.054279133 $E358 14 64 70 4C .0724571965 $E35D B7 EA 51 TA -.0898019185 1.4352314E-4 $E362 63 30 88 TE *110932413 1.34226348E£-3 $E367 92 44 99 TA 1D 84 1C $E36C 4Cc cc 91 c7 «19999912 7C 63 59 58 «0555051269 $E371 AA AA AR 13 — -.33333316 TE 75 FD EE? .240226385 $E376 00 00 00 00 1 80 31 72 18 10 .693147186
Tablo-6: Bellekte yer alan sabitler, değerleri ve çok önemlilerinin anlamları. Eğer yapacağınız işlemlerde bu sabitler gerekiyorsa, değeri programınıza eklemenize gerek yok. ROM'unuzu kullanıverin.