Bu sayfadaki yazılar
Sayfanın metni
Sayfa 19
Yukarıdaki komutlarla bir karakteri baş aşağı çeviriyoruz. Burada asıl can alıcı nokta "YIĞIN" dediğimiz bölgenin kullanılmasıdır Yığın "LIFO" -Last In First Out- mantığıyla çalışır. Yani yığına atılan en son sayı ilk önce geri alınır. Bizim komutlar ilk çalışmaya başladığında önce $3000'den itibaren ilk 8 byte'ı okuyup yığına atmaktadır. Böylece yığına en son $3007 adresindeki değer atılmış olmaktadır. Yığından geri alma işlemi sırasında ise ilk önce $3007 adresinin değeri alınmaktadır. Bu işlemi 8 defa tekrarladığımızda ise bir karakterin datalarını kendi içinde tersten yerleştirmiş oluyoruz. Aşağıdaki tablo daha açıklayıcı olacaktır.
$3000 --> yığın --> $3007 $3001 --> yığın --> $3006 $3002 --> yığın --> $3005 $3003 --> yığın --> $3004 $3004 --> yığın --> $3003 $3005 --> yığın --> $3002 $3006 --> yığın --> $3001 $3007 --> yığın --> $3000 lda $fb ;Karakter setinin LO adresini al clc ;Elde bitini sfırla adc #$08 ;8 ile topla sta $fb ;LO adrese geri yaz. bcc next_char ;Toplama sonucu "elde" biti "0" ise git inc $fc ;Karakter setinin HI adresini 1 arttır next_char lda $fc ;HI adresi al cmp #$40 ;#$40 oldumu? Olmadıysa bir sonraki bne loop2 ;karakter için işlemleri tekrarla rts ;Olduysa programı bitir. .end Gördüğünüz gibi kısacık bir programla $3000-$4000 arasındaki karakter setimizi baş aşağı çevirmiş olduk. Programın listesini “program dökümleri” sayfasında bulabilirsiniz. Ekran görüntülerimiz ise aşağıdadır.
Normal karakter setli ekran görüntüsü Ters karakter setli ekran görüntüsü. Bir başka karakter setinde görüşmek dileğiyle.
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 18
C64 İÇİN BAŞ AŞAĞI KARAKTER SETİ PROGRAMI HAZIRLAYAN : İSMAİL ŞAHİN İLETİŞİM : HADES@HI3S.ORG HADES6510@YAHOO.COM NEREDEN : İSTANBUL NİCK / GRUP(LAR) : HADES / HI3S WEB SİTE : WWW.HI3S.ORG HTTP://HADES6510.SITEMYNET.COM *=$0801 .word nextline .word 2004 ; 2004 .byte $9e ; SYS .text "2061" ; 2061 .byte 0 ; komutu nextline .word 0 sei ;İnterruptları engelle lda $01 ;Karakter ROM'u and #$fb ;artık CPU tarafından sta $01 ;okunabilir lda #$d0 ;ROM adresi = $D000 ldx #$30 ;RAM adresi = $3000 ldy #$00 ;olacak şekilde ayarla. sty $fb ;$FB ve $FC adreslerinde sta $fc ;ROM adresi tutuluyor. sty $fd ;$FD ve $FE adreslerinde stx $fe ;RAM adresi tutuluyor. ldx #$10 ;Blok sayacı = $10 (16) transfer lda ($fb),y ;ROM'dan o anki adresi sta ($fd),y ;oku ve RAM'e kopyala iny ;byte sayacını 1 arttır bne transfer ;"0" değilse geri dön inc $fc ;ROM HIGH adresi 1 arttır inc $fe ;RAM HIGH adresi 1 arttır dex ;Blok sayacını 1 azalt bne transfer ;"0" olmadıysa geri dön. lda $01 ;I/O bölgesi eski haline ora #$04 ;getiriliyor. CPU artık sta $01 ;karakter roma erişemez cli ;interruptlara izin ver lda #$1c ;VIC'e yeni karakter sta $d018 ;setinin yerini bildir. new_fonts lda #$30 ;Karakter seti başlangıç ldy #$00 ;adresi $3000 olarak sty $fb ;$FB ve $FC adreslerine sta $fc ;kaydediliyor loop2 ldy #$00 ;Y registeri byte sayacı=0 loop0 lda ($fb),y ;O anki adresten bir byte oku pha ;okunan değeri yığına at iny ;sayacı 1 arttır cpy #$08 ;8 oldumu ? bne loop0 ;olmadıysa bir byte daha oku ldy #$00 ;Y registeri byte sayacı=0 loop1 pla ;yığındaki değeri al sta ($fb),y ;O anki adrese yaz iny ;sayacı 1 arttır cpy #$08 ;8 oldumu ? bne loop1 ;olmadıysa yeni değeri al.