PDA

View Full Version : soru:


PE&OAS
1st June 2005, 15:11
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...

skate
2nd June 2005, 00:49
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...
Quoted post


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
<görüntülenmiyor>
jmp OUT
TRUE
<görüntüleniyor>
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 :)

PE&OAS
2nd June 2005, 17:48
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;


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


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

ayrica tesekkurler :)

skate
2nd June 2005, 18:24
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.


* = $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


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

..........++++..........
..........++++..........
.........++++++.........
.........++++++.........
........+++..+++........
........+++..+++........
.......++++..++++.......
.......+++.++.+++.......
......++++.++.++++......
......+++..++..+++......
.....++++..++..++++.....
.....+++...++...+++.....
....++++...++...++++....
....+++....++....+++....
...++++....++....++++...
...+++............+++...
..++++.....++.....++++..
..+++..............+++..
.++++++++++++++++++++++.
.++++++++++++++++++++++.
++++++++++++++++++++++++


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
2nd June 2005, 20:21
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...

PE&OAS
2nd June 2005, 20:37
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...

Hydrogen
3rd June 2005, 10:35
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...
Quoted post

skate
3rd June 2005, 11:40
Hydrogen'in dediği gibi "Programcının El Kitabı"nı sen dil referansı değil genel memory map, rom, kernel referansı olarak kullanacaksın. Ayrıca içersinde tüm assembler komutlarının açıklamaları var. Daha fazlasına da gerek yok bence :) Benim yukarda anlattıklarımdan çok daha fazlası bu kitapta yer alıyor.

Bunun yanı sıra Spectrum kitabını bekliyorum walla. Hatta hatta spectrum sceneinden bir arkadaş bile edindim. Bir spectrum disk magazine'ine 64 scene'ini anlatan ufak bir chapter bile yazdım geçen sene. Niye bilmiyorum Z80 beni hep çekmiştir :D

PE&OAS
3rd June 2005, 18:12
himm, artik bi "c64 programcinin el kitabi" bulmam zor olacak sanirim ama zaten kitaptaki memory map, komutlar ve aciklamalari ve rom rutinleri hades hoca tarafindan c64 turkiye dergisine aktarildi (sagolsun :) ). geri kalan bilgileride oradan buradan toplayacagim artik, millet kullanmasa da satmiyor artik c64'un kitabini-parcasini olsun, nasil olsa muzayede siteleri var, yaziyor oraya 100 ytl'den :D olan gene bana oluyor...

neyse aklima gelmisken yazayim; spectrum kitabina iyice bakmadim ama sanirim z80 asm'den daha fazla basic programlama ve ornek kodlari, iceriyor genel olarak. ve sanirim rom veya benzeri konularda pek bilgi vermiyor, ama en azindan icinde pacman benzeri bir oyunun spectrum kullanilarak yazilisi falan aciklaniyor. yararlanirsin artik... ha senin arkadas icin kod kasicaktin sanirim kitaptan, oyle demistin, bayagi oldu tabii tee independentonline.org zamaninda idi... 2 sene oluyor, hey gidi hey hey :D

spritus
3rd June 2005, 22:39
peandoas artık seni resident commodore section sorumlusu ilan ediyorum :).
artık arabici deilsin :P

derhal bi intro yaz :D

PE&OAS
4th June 2005, 22:16
:D
sagol baba, zaten bende ufaktan ufaktan c64 sectioni ele gecirmeyi planliyordum grupta... boylesi daha bir legal oldu... hemmen bi'ntro yazamam belki ama ona da sira gelecektir :lol: sevgiler...