Gönderen Konu: soru:  (Okunma sayısı 9260 defa)

soru:

« : 01.06.2005 15:11:24 »
Hızlı düğmeleri aç

PE&OAS

İleti: 377

Çevrimdışı
  • ****
  • Sr. Member
    • Profili Görüntüle
elimizde soyle bir basit kod var:

Kod: [Seç]
*=$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...

soru:

« Yanıtla #1 : 02.06.2005 00:49:16 »
Hızlı düğmeleri aç

skate

İleti: 5.245

A Sinner Scener
Çevrimdışı
  • Administrator
  • *****
  • Hero Member
    • Profili Görüntüle
    • http://www.akaydin.com/
Alıntı
Originally posted by PE&OAS@Jun 1 2005, 02:11 PM
elimizde soyle bir basit kod var:

Kod: [Seç]
*=$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:

Kod: [Seç]
   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;
Kod: [Seç]
    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 :)

soru:

« Yanıtla #2 : 02.06.2005 17:48:29 »
Hızlı düğmeleri aç

PE&OAS

İleti: 377

Çevrimdışı
  • ****
  • Sr. Member
    • Profili Görüntüle
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: [Seç]
 
...................
   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 :)

soru:

« Yanıtla #3 : 02.06.2005 18:24:01 »
Hızlı düğmeleri aç

skate

İleti: 5.245

A Sinner Scener
Çevrimdışı
  • Administrator
  • *****
  • Hero Member
    • Profili Görüntüle
    • http://www.akaydin.com/
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: [Seç]
* = $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;

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

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?

soru:

« Yanıtla #4 : 02.06.2005 20:21:29 »
Hızlı düğmeleri aç

PE&OAS

İleti: 377

Çevrimdışı
  • ****
  • Sr. Member
    • Profili Görüntüle
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...

soru:

« Yanıtla #5 : 02.06.2005 20:37:20 »
Hızlı düğmeleri aç

PE&OAS

İleti: 377

Çevrimdışı
  • ****
  • Sr. Member
    • Profili Görüntüle
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...

soru:

« Yanıtla #6 : 03.06.2005 10:35:18 »
Hızlı düğmeleri aç

Hydrogen

İleti: 932

Çevrimdışı
  • 7DX Organizer
  • *****
  • Hero Member
    • Profili Görüntüle
    • http://www.glance.ws
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.

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

soru:

« Yanıtla #7 : 03.06.2005 11:40:22 »
Hızlı düğmeleri aç

skate

İleti: 5.245

A Sinner Scener
Çevrimdışı
  • Administrator
  • *****
  • Hero Member
    • Profili Görüntüle
    • http://www.akaydin.com/
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

soru:

« Yanıtla #8 : 03.06.2005 18:12:10 »
Hızlı düğmeleri aç

PE&OAS

İleti: 377

Çevrimdışı
  • ****
  • Sr. Member
    • Profili Görüntüle
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

soru:

« Yanıtla #9 : 03.06.2005 22:39:49 »
Hızlı düğmeleri aç

spritus

İleti: 933

Çevrimdışı
  • *****
  • Hero Member
    • Profili Görüntüle
    • http://resident.tr-demoscene.info
peandoas artık seni resident commodore section sorumlusu ilan ediyorum :).
artık arabici deilsin :P

derhal bi intro yaz :D

soru:

« Yanıtla #10 : 04.06.2005 22:16:25 »
Hızlı düğmeleri aç

PE&OAS

İleti: 377

Çevrimdışı
  • ****
  • Sr. Member
    • Profili Görüntüle
: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...