Originally posted by PE&OAS@Jun 1 2005, 02:11 PM
elimizde soyle bir basit kod var:
*=$c000
lda #1
sta $c000
ora $c000
sta $d020
c64 memory map'de yazdigina gore;
$d020 adresinde border renk register bitleri bulunur diyor... bende buna gore ekranda sprite gostermek icin ora'dan sonra akude kalan 1 degerini $d015 adresine yolladim, burasi sprite gosterme biti olarak gosteriliyor memory map'de... ben bu bit ile register bitinin ne farki oldugunu pek anlayamadim... ayrica sprite koordinatlandirmasinin nasil kodlandigini bilemedigimden $d015 adresindeki bit'leride ayni $d020 ve benzeride oldugu gibi kullanabilir miyim bilemedim... bir anlativerirseniz sevinirim...
[post=1280]Quoted post[/post]
[/b]
PE&OAS, öncelikle 64 assemblerıyla uğraştığın için seni taktir ettim.
Gelelim sorunun yanıtına. Bunun için öncelikle yazdığın örnek codedan başlayalım.
lda #1 ; yalnızca 0.bit 1 yani byte değeri 2'li sistemde %00000001
sta $c000 ; %00000001 değerini $c000 adresine koy
ora $c000 ; zaten aküdeki değer $c000'dakiydi. Bir sayıyı kendisiyle ORlarsan sonuç yine kendisidir. Yani akü hala %00000001
sta $d020 ; dış ekran rengini 1 yap yani beyaz olsun.
Kısacası buradaki ORA komutu birkaç cycle bekletmek harici herhangi bir işlem yapmıyor.
Gelelim bitlerin kullanımına. Eminim hep duymuşsundur Commodore'da 8 sprite vardır diye. $d015 adresi bu 8 sprite'ın görüntülenip görüntülenmeyeceğini kontrol eden bir adrestir. Her bir biti bir sprite'a karşılık gelir. Spritelar da bitler gibi 0'dan 7'ye kadar sıralanır.
Sprite 0 -> %00000001 -> 1
Sprite 1 -> %00000010 -> 2
Sprite 2 -> %00000100 -> 4
Sprite 3 -> %00001000 -> 8
Sprite 4 -> %00010000 -> 16
Sprite 5 -> %00100000 -> 32
Sprite 6 -> %01000000 -> 64
Sprite 7 -> %10000000 -> 128
değerlerini alırlar. Örnek olarak sen 0, 3 ve 6 numaralı spriteları ekranda göstermek istiyorsan $d015'e
1 + 8 + 64 = 73
değerini vermelisin
lda #73
sta $d015
şeklinde. Ancak ekranda yine hiçbirşey göremeyeceksin. Çünkü spriteların default x, y pozisyonları (0, 0) ve ekranın dışında kalıyor. Bu spriteları ekranda görüntülemek için;
0.sprite için;
$d000 (x koordinatı)
$d001 (y koordinatı)
1.sprite için;
$d002 (x koordinatı)
$d003 (y koordinatı)
2.sprite için;
$d004 (x koordinatı)
$d005 (y koordinatı)
3.sprite için;
$d006 (x koordinatı)
$d007 (y koordinatı)
4.sprite için;
$d008 (x koordinatı)
$d009 (y koordinatı)
5.sprite için;
$d00a (x koordinatı)
$d00b (y koordinatı)
6.sprite için;
$d00c (x koordinatı)
$d00d (y koordinatı)
7.sprite için;
$d00e (x koordinatı)
$d00f (y koordinatı)
koordinatlarını belirtmelisin. Bunun haricinde ekran adresinin bulunduğu alanın son 8 byte'ı da spriteların hafızadaki data adreslerini belirler. Ekran default olarak $0400'dedir ve $07f8-$07ff arası 0'dan 7. spritea kadar bu adreslemeyi belirler. Örnek olarak $07f8'e $c0 (192) değerini girersen bu 192 * 64 = 12288 yani $3000 adresine denk gelir.
Bunun haricinde $d027-$d02e adresleri spriteların renklerini belirler. $d017 dikey, $d01d yatay genişletme adresleridir. Aynı $d015 gibi kullanılır. $d01b ise multicolor için kullanılır ve bu durumda (yanlış hatırlamıyorsam) $d025 ve $d026 spriteların 2. ve 3. rengini oluşturur.
Örnek code:
lda #$07; 0. 1. ve 2. spriteları aç
sta $d015
lda #$60
sta $d000; Sprite 0 (x)
lda #$90
sta $d002; Sprite 1 (x)
lda #$c0
sta $d004; Sprite 2 (x)
lda #$80
sta $d001; Sprite 0 (y)
sta $d003; Sprite 1 (y)
sta $d005; Sprite 2 (y)
lda #$03
sta $d027; Sprite 0 (renk)
lda #$05
sta $d028; Sprite 1 (renk)
lda #$07
sta $d029; Sprite 2 (renk)
lda #$c0; $c0 * $40 = $3000'deki datalar
sta $07f8; Sprite 0 (data map)
sta $07f9; Sprite 1 (data map)
sta $07fa; Sprite 2 (data map)
lda #$02; Sprite 1'i
sta $d017; Dikey olarak 2 kat genişlet
rts
bu rutin 3 sprite'ı yan yana basıp ortadakini dikey olarak genişletir (umarım eheh)
Gelelim sorunun başlığına. Bitlerin nasıl kontrol edileceğini sormuışsun. AND'leyerek. Örneğin ekranda 2 numaralı sprite'ın olup olmadığını merak ettin. 2 numaralı sprite yukardan da hatırlayacağın üzere;
Sprite 2 -> %00000100 -> 4
4 değerine sahipti. Bu durumda yapman gereken;
lda $d015
and #$04
bne TRUE
FALSE
jmp OUT
TRUE
OUT
rts
Bu şekilde kontrol edip farklı durumlar için farklı kodlar yazabilirsin.
Başka sorun olursa çekinme. Ayrıca "Programcının El Kitabı"nı tavsiye ediyorum