C64 Türkiye sayı 6, sayfa 6
Sayfanın metni

Sayfa 6

YAZDIRMA RUTİNİ (1. YÖNTEM)

*=$0801

.word nextline .word 2004 ; 2004 .byte $9e ; SYS .text "2061" ; 2061 .byte 0 ; komutu nextline .word 0

mem_read lda adres ; adresteki değeri al pha ; akünün değerini yığına at lsr ; sağa kaydır lsr ; sağa kaydır lsr ; sağa kaydır lsr ; sağa kaydır jsr convert ; byte çevirme var pla ; yığındaki değeri geri al and #$0f ; alt 4 biti al convert cmp #$0a ; okunan değer 10’dan bcc number ; küçükse rakam demekmiş. clc ; büyükse harf demekmiş. adc #$07 ; önce 7 ile topla number clc ; carry’i sıfırla adc #$30 ; $30 (48) ile topla print jsr $ffd2 ; ekrana yazdır. rts ; Bu iş burada biter. adres .byte 179 ; Örnek sayı

Şimdi açıklama yapalım. Hex sistemde kullanılan karakterler 0-9 ve A-F arasındadır. Dolayısıyla bunların ASCII değerleri rakamlar için $30-$39 (48-57), harfler için $41-$46 (65-70) arasındadır. Hafızadan okunan bir değeri hex olarak ekrana yazdırmak demek ekrana iki karakter basmak demektir. Önce aküyü kullanarak hafızayı okuyoruz ve aynı değeri tekrar kullanabilmek için yığına atıyoruz. Sonra 4 defa LSR komutuyla 7-6-5-4 nolu bitleri 3-2-1-0 nolu bitlerin yerine taşıyoruz. Bunu yapmak zorundayız. Eğer yapmazsak ekrana istemediğimiz karakterler çıkabilir veya başka işler olabilir. Mesela ekran silinebilir. Devam ediyoruz. 4 LSR komutundan sonra JSR komutu ile çevirme işlemi alt rutinine gidiyoruz. Burada aslında alt rutin yok. Program tek parça ve bir kısmını alt rutinmiş gibi kullanıyoruz. Yani program kendi kendini çağırıyor.

Şimdi çevirme yapmaya başlayabiliriz. Önce aküdeki değeri 10 ile karşılaştırıyoruz. Eğer 10’dan küçükse ekrana rakam basmamız gerekiyor. Bunun için aküye $30 (48) sayısını ekliyoruz. Böylece ekrana basacağımız rakamın ASCII kodunu elde etmiş oluyoruz. JSR $FFD2 komutuyla ise ekrana bir adet rakam basıyoruz. Eğer karşılaştırma sonucu elimizdeki değer 10 ve daha büyükse (en fazla 15 olabilir) bu değeri 65-71 arasına tamamlamak için $37 (55) eklememiz gerekiyor. Önce 7 ile ve sonrasında hemen $30 ile toplayıp A ile F arasındaki bir harfin ASCII kodunu elde ederek ekrana bir adet harf basmış oluyoruz.

Daha sonra RTS komutuyla geri dönerek JSR CONVERT komutundan sonraki komuta geliyoruz. Yığındaki değeri geri alarak ve AND #$0F komutuyla sadece 7-6-5-4 nolu bitleri sıfırlayıp 3-2-1-0 nolu bitleri dikkate alıyoruz. Bundan sonraki işlemler ikinci paragraftaki anlattıklarımızın aynısı. Tek fark RTS komutuyla işimizi bitiriyoruz.

Örnek vererek anlattıklarımızı doğrulayalım. Adresteki sayımız 179 ($B3) olsun. Ekrana “B3” yazdırmamız gerekiyor. İlk olarak $B3 sayısını binary (ikili) sistemde yazalım. Bunun için önce $B (11) sayısının binary sistemdeki karşılığı olan 1011 sayısını ve hemen yanına ise 3 sayısının binary sistemdeki karşılığı olan 0011 yazalım. Demek ki $B3=%10110011 oluyormuş. Devam edelim. İlk olarak aküye 4 LSR komutunu uygulayacağız.

SAYI LSR LSR LSR LSR 10110011 Æ 01011001 Æ 00101100 Æ 00010110 Æ 00001011

Gördüğünüz gibi 4 LSR komutu ile sayının 7654 nolu bitleri birer sağa kayarak 3210 numaralı bitler haline geldi. Yani aküde artık %00001011 sayısı var.

Klavyeyle gezinmek için ← ve → tuşları.