Bu sayfadaki yazılar
Sayfanın metni
Sayfa 20
NEREDEN : İSTANBUL NİCK / GRUP(LAR) : HADES / HI3S WEB SİTE : WWW.HI3S.ORG HTTP://HADES6510.SITEMYNET.COM
(Programlar C64ASM V1.1 ile compile edilecek şekilde yazılmıştır) ROM rutinlerini tanıtmaya devam ediyoruz. İlk adresimiz $A3BF (41919). ADRES : $A3BF (41919) GÖREVİ : Data blok taşıma. Bu adresi bellekteki bir bölgeyi başka bir yere taşıma amaçlı olarak kullanabilirsiniz. Zero Page’de bulunan 6 adet adresi kullanıp istediğiniz uzunluktaki bir bölgeyi taşıyabilirsiniz. Şimdi bir örnek ile bu adresin nasıl kullanıldığını öğrenelim. Örneğimizde $c000-$c750 arasındaki bölgeyi $2600-$2d50 arasına taşıyalım. *=$0801 .word nextline .word 2004 ; 2004 .byte $9e ; SYS .text "2061" ; 2061 .byte 0 ; komutu nextline .word 0 transfer1 lda #$00 ;Başlangıç adresi LOW byte ldx #$c0 ;Başlangıç adresi HIGH byte sta $5f ;Başlangıç LOW byte pointer stx $60 ;Başlangıç HIGH byte pointer lda #$50 ;Bitiş adresi LOW byte ldx #$c7 ;Bitiş adresi HIGH byte sta $5a ;Bitiş LOW byte pointer stx $5b ;Bitiş HIGH byte pointer lda #$50 ;Hedef bitiş adresi LOW byte ldx #$2d ;Hedef bitiş adresi HIGH byte sta $58 ;Hedef bitiş LOW byte pointer stx $59 ;Hedef bitiş HIGH byte pointer jsr $a3bf rts Transfer işlemini yapan rutin 28 byte yer kaplamaktadır. Bu adresin kullanılışı şöyledir. Kopyalayacağınız bölgenin başlangıç adresi $5f-$60 adreslerine, bitiş adresi $5a-$5b adreslerine, yeni bölgenin bitiş adresi ise $58-$59 adreslerine yazılır ve rutin çağrılır. Bu rutini kullanacağınız zaman BASIC ROM'un devrede olması gereklidir. Aynı taşıma işlemini bir de başka rutin yazarak yapalım. Taşınacak bölgenin uzunluğu $c750-$c000=$0750 byte olup 8 döngüde rahatça transfer edebiliriz.
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 21
transfer2 ldx #$08 ;Döngü sayacı ldy #$00 ;Byte sayacı kaynak lda $c000,y ;Kaynak adresi hedef sta $2600,y ;Hedef adresi iny bne kaynak inc kaynak+2 inc hedef+2 dex bne kaynak rts Transfer2 rutinimiz 23 byte uzunluğundadır. Yani üstteki rutinden 5 byte daha kısadır. Ama bana göre 2 dezavantajı vardır. Birincisi : Transfer1 rutininde istediğiniz uzunlukta byte transfer edebilirken, transfer2 rutininde transfer edilen byte uzunluğu 256'nın katları şeklinde olacaktır. Transfer1 rutininde $0750 (1872) byte transfer edilirken, transfer2 rutininde 256'nın katları şeklinde olduğu için 2048 byte transfer edilecektir. Eğer hafıza düzenlemeniz biraz karışıksa fazladan transfer edilen 1 byte bile programınızın bozulmasına neden olabilir. Bununda çaresi var aslında. Önce $0750 byte'ın $0700 byte'ını transfer edersiniz, sonrada uygun $50 byte için işlem yaparsınız. Bu ise fazladan 9 byte'lık bir code demektir. İkinci dezavantaj ise, transfer2 rutinini bu şekliyle sadece bir kez kullanılabilir. Çünkü kaynak ve hedef adreslerinin high byte'ları her döngüde 1 arttırılmaktadır. Eğer rutini ikinci kez kullanmak istiyorsanız, rutinin başında kaynak ve hedef adreslerinin high bytle'rını program içindeki yerlerine yazmanız geerekir. Bu işlem ise 10 byte daha kullanmak demektir. Böylece TRANSFER1=28 byte, TRANSFER2=33 byte yer kaplamış olacak, ayrıca 1. dezavantaj yine devam edecektir. ADRES : $E8EA (59626) GÖREVİ : Ekranı bir satır yukarı kaydırma. The anatomy of a COMMODORE 64 isimli kitapta SCROLL SCREEN olarak isimlendirilen bu rutin ekranı bir satır yukarı kaydırır. Normalde ekranın yukarı kayması için kursörün en alt satırda olması ve RETURN veya CURSOR DOWN tuşuna basılmış olması gerekir. Bu adres ise kursörün pozisyonunu dikkate almayıp ekranı olduğu gibi bir satır yukarı kaydırır. Peki bu adresle ne yapılabilir? Mesela Basic'e ROLL komutu ekleyip, Basic ile hazırladığınız bir açılış ekranını 1 satır yukarı kaydırıp, üstten kaybolan satırı en alt satırda tekrar çıkartabilirsiniz. Tabii bunun için gerekli olan programı yazmanız lazım. İsterseniz bu efekti ufak bir assembler rutiniyle yapmayı deneyelim. *=$0801 .word nextline .word 2004 ; 2004 .byte $9e ; SYS .text "2061" ; 2061 .byte 0 ; komutu nextline .word 0 ldx #$00 ;Sayacı sıfırlayalım loop0 lda $0400,x ;Ekranın ilk satırındaki sta temp0,x ;bilgileri kopyalayalım lda $d800,x ;Aynı işi renk belleği sta temp1,x ;için de yapalım. inx ;sayacı 1 arttır cpx #$28 ;40 oldu mu? bne loop0 ;olmadıysa tekrarla jsr $e8ea ;Olduysa ekranı 1 satır yukarı kaydır