the scene > çeşitli

soru:

(1/3) > >>

PE&OAS:
elimizde soyle bir basit kod var:


--- Kod: ---*=$c000
lda #1
sta $c000
ora $c000
sta $d020

--- Kod sonu ---

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...

skate:

--- Alıntı ---Originally posted by PE&OAS@Jun 1 2005, 02:11 PM
elimizde soyle bir basit kod var:


--- Kod: ---*=$c000
lda #1
sta $c000
ora $c000
sta $d020

--- Kod sonu ---

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]
--- Alıntı sonu ---

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:


--- Kod: ---    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

--- Kod sonu ---

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;

--- Kod: ---     lda $d015
     and #$04
     bne TRUE
FALSE
     
     jmp OUT
TRUE
     
OUT
     rts

--- Kod sonu ---
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 :)

PE&OAS:
haklisin abi oradaki ora islemi geciktirmekten pek baska bi ise yaramiyorda, orada asil seyetmek istedigim or'layarakta bitleri kontrol edip edemeyecegimdi, yani ayni sayi ile yada farkli sayi ile or'lamak degildi onemli olan, ki ogrenmis oldum bit'leri kontrol etmek icin and'lemem gerekmekteymis:)

ki ayrica;

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

bit deyince aklima yukardakiler gibi degilde daha sacma sapan biseyler gelmisti, onuda duzelttik :) nedense bit deyince 2'li taban olarak dusunmeyi akil edememisim...

bide surada data map yaziyor;


--- Kod: ---  
...................
   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)
....................

--- Kod sonu ---

bu data map, bizim tarafimizdan mi koyuluyor $3000'e y, yoksa zaten hafizada mi? yani data map ne onu anlamadim?

ayrica tesekkurler :)

skate:
data map'den kastım (yanlış da ifade etmiş olabilirim) sprite'ın grafik dataları. spriteların hires çözünürlüğü 24x21 pixeldir. 24 pixellik alan 3 byte ile ifade edilir. Yani toplamda 3*21 = 63 bytelık bir alan bir spriteın datasını belirler. Sana örnek bir sprite datası pasteliim bir kodumdan.


--- Kod: --- * = $3000
!byte %00000000,%00111100,%00000000
!byte %00000000,%00111100,%00000000
!byte %00000000,%01111110,%00000000
!byte %00000000,%01111110,%00000000
!byte %00000000,%11100111,%00000000
!byte %00000000,%11100111,%00000000
!byte %00000001,%11100111,%10000000
!byte %00000001,%11011011,%10000000
!byte %00000011,%11011011,%11000000
!byte %00000011,%10011001,%11000000
!byte %00000111,%10011001,%11100000
!byte %00000111,%00011000,%11100000
!byte %00001111,%00011000,%11110000
!byte %00001110,%00011000,%01110000
!byte %00011110,%00011000,%01111000
!byte %00011100,%00000000,%00111000
!byte %00111100,%00011000,%00111100
!byte %00111000,%00000000,%00011100
!byte %01111111,%11111111,%11111110
!byte %01111111,%11111111,%11111110
!byte %11111111,%11111111,%11111111

--- Kod sonu ---

Umarım anlaşılır gözüküyordur :) Bu;


--- Alıntı ---..........++++..........
..........++++..........
.........++++++.........
.........++++++.........
........+++..+++........
........+++..+++........
.......++++..++++.......
.......+++.++.+++.......
......++++.++.++++......
......+++..++..+++......
.....++++..++..++++.....
.....+++...++...+++.....
....++++...++...++++....
....+++....++....+++....
...++++....++....++++...
...+++............+++...
..++++.....++.....++++..
..+++..............+++..
.++++++++++++++++++++++.
.++++++++++++++++++++++.
++++++++++++++++++++++++

--- Alıntı sonu ---

Görünümünde bir sprite oluşturur.

OR'lamaya gelince. OR'u bir veya birkaç biti set etmek için kullanırsın. Örnek olarak 1. 4. ve 6. spriteları göstermek istiyorsun ancak o anda gösterilen başka spritelar varsa onları kapatmak istemiyorsun.

Sprite 1 -> %00000010 -> 2
Sprite 4 -> %00010000 -> 16
Sprite 6 -> %01000000 -> 64

lda #82
sta $d015

dersen bu spritelar gösterilir ancak geriye kalan tüm spritelar kapanır. Bunun yerine

lda $d015
ora #82
sta $d015

diyecek olursan diğer spritelar zarar görmeden istediğimiz spriteları açmış oluruz. Bu spritelardan daha önceden açık olan varsa hiçbirşey değişmez, gösterilmeye devam eder.

Başka sorun var mı bu konuda?

PE&OAS:
hah anladim, spritein seklini verdigimiz bolummus...
simdilik bi soru gelmiyor aklima, en iyisi gidip su yazdiklarini bir uygulayayim, calisayim, ozumlemeye ugras veriyim... :)  sorum oldukca buraya yazarim artik... sagolasin...

Navigasyon

[0] Mesajlar

[#] Sonraki Sayfa

Tam sürüme git