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 :)
Selam PE&OAS. Programcinin el kitabi makine dili anlatmaktan ziyade C64 makine dili icin bir referans kitabidir. Sonucta C64'un rom rutinleri, ekran modlari, memory map vs. icin eksiksiz bir kaynaktir. Dolayisiyla olmazsa olmaz kanimca. Bir referans kitabi olmasina karsin icerisinde cok guzel aciklamalar da vardir.
Sonucta c64'un butun ozelliklerini ezbere bilmiyorsan(Ki pek kimse de bilmiyordur:) her daim isine yarayacak bir kitap.
Originally posted by PE&OAS@Jun 2 2005, 07:37 PM
ha bide "programcinin el kitabi" gecti bi kac gunlugune elime, ama baktim bir ton basic vardi icinde, bes-alti sayfada assembler anlatiliyordu, onda da mnemonicten ziyade mde stilinde idi... yada belki de benim okudugum iel senin tavsiye ettigin kitap degisikti...
alakasiz olucak ama, sana bir "programming your zx spectrum" diye kitap gondericektim, elime ancak ulasti, istedigin zaman gondereyim...
[post=1285]Quoted post[/post]
[/b]