tr-demoscene

the scene => coding => c64 => Konuyu başlatan: stranger - 06.01.2007 21:10:51

Başlık: kurs sonrasi ornekler
Gönderen: stranger - 06.01.2007 21:10:51
Mesela aklima soyle bir ornek geldi. Ekranda bi$iler gorme acIsIndan.
Ekranda en kolay oynatabilecegimiz obje sprite olduguna gore...
Bir sprite logomuz var. Diyelim ki bu logo sprite0. (ufak bi logo) :)
Onu ekranda gorulen bi yere koyduk. Ornegin (x=$24,y=$32) ye..
logo ekranda x koor.da $ff 'e kadar gidiyor ve $ff'e geldiginde tekrar $24'e kadar geri kayIyor.
 
Normal ko$ullarda bunu yaptIgImIzda yumu$ak bir kayma sagLamamIz cok zor. (Ornek oLarak a$agIya yazdIgIm code...) Bunu en basit $ekiLde irq ya bagLayarak yumu$ak $ekiLde nasIL kaydIrabiliriz? Mademki irq kuLLanIyoruz oraya buraya da daLLanaLIm mesela space'e basInca da basic'e doneLim... Yada ekranIn alt tarafLarInda biyerLerde aynI anda sprite1'de sprite0'dan ters yone hareket etsin?
 
Bana gore bu oLay en sade $ekiLde anLatILdIgI zaman nightlord'un dedigi gibi nightshift'te fazLadan 2-3 intro gormek mumkun oLabiLir. Verilecek bu ornegin mantIgInI kapan cogu $eyi de yapabiLir diye du$unuyorum.
 
Zaman ayIrIp ornek verebiLecek arkada$Lara simdiden te$ekkurLer...
Bu arada ornegin daha anLa$ILabilir oLmasI bakImIndan $d010 'u katmadIm. Bu ornegi fazla karma$tIrmayacagInI du$unuyorsanIz onuda aradan cIkarmI$ oluruz :)
 
Mesela...
 
*=$1000
 
jsr$e544
 
basla: lda#$01
sta$d015
ldx#$24
stx$d000
ldy#$32
sty$d001
 
art: lda$d000
tax
art1: inx
ldy#$00
beklet: iny
(10 adet nop)
cpy#$ff
bne beklet
stx$d000
cpx#$ff
bne art1
lda$d000
tax
azal : dex
stx$d000
ldy#$00
azal1: iny
(10 adet nop)
cpy#$ff
bne azal1
cpx#$24
bne azal
stx$d000
rts
Başlık: kurs sonrasi ornekler
Gönderen: GnoStiC - 06.01.2007 21:29:49
stranger opuyorum :)
bitti mi demo, geleyim mi izlemeye? kartus bulmussundur artik di mi?
Başlık: kurs sonrasi ornekler
Gönderen: stranger - 06.01.2007 21:38:19
valla $u soyLedigim ornegi vereni bende opucem :) Cunku kafamdaki bi cok soru i$aretini kaLdIrmI$ oLucam.
Bu arada... Final3 var bi tane. Nobody'den aLIcam. 1084SD1 buldum, kaptIm hemen. Ceyizi duzuyorum. :) Ne varsa 64'te var yine. Zaten TTT-2'de cIkMadI :(     :)
Başlık: kurs sonrasi ornekler
Gönderen: skate - 06.01.2007 22:05:44
Hızlıca şöyle bir örnek yaptım kardeşim. Elimden geldiğince kernal rutinleri kullanmaktan kaçındım ki nightlord'un henüz açıklamadığı konular kafanızda soruişareti yaratmasın. Aşağıdaki örneği ACME'de derleyip SYS 4096 ile çalıştırabilirsiniz. Interrupt ile bir sprite sürekli yana kaydırılıyor ve space ile basic'e geri dönebiliyorsunuz.
 
Kod: [Seç]
!to "example.prg",cbm
 *=$1000
 ; Sprite Bas
 lda #$01
 sta $d015
 lda #$c0 ; $c0*$40 = $3000 adresindeki spriteı göster
 sta $07f8
 lda #$98
 sta $d000 ; spriteın x koordinatı
 lda #$72
 sta $d001 ; spriteın y koordinatı
 ; Interruptı Hazırla
 sei
 lda #$7f
 sta $dc0d
 lda #$01
 sta $d01a
 lda #$1b
 sta $d011
 lda #$00
 sta $d012
 lda #<int
 sta $0314
 lda #>int
 sta $0315
 cli
 ; Space kontrolü
space lda $dc01
 cmp #$ef
 bne space
 ; Spriteları kapa
 lda #$00
 sta $d015
 ; Basic'e dön
 sei
 lda #$81
 sta $dc0d
 lda #$f0
 sta $d01a
 lda #$31
 sta $0314
 lda #$ea
 sta $0315
 cli
 rts
 ; Interrupt Rutini
int inc $d000 ; Sprite'ın X koordinatını 1 arttır
 lda $d000 ; Eğer sprite 255'i geçmediyse
 bne out  ; interruptın çıkışına git
 lda $d010 ; Sprite 255'i geçtiyse
 eor #$01 ; 9.bitini değiştir
 sta $d010 ; 0 ise 1 yap, 1 ise 0 yap
out inc $d019
 jmp $ea81
 *=$3000
 !fill 63,255 ; Sprite haritasını 255 ile doldur
Başlık: kurs sonrasi ornekler
Gönderen: skate - 06.01.2007 22:08:02
Forum kodun formatını azcık bozduğu için source code'u ve compile edilmiş prg dosyasını zip olarak ekliyorum buraya.
Başlık: kurs sonrasi ornekler
Gönderen: stranger - 06.01.2007 22:19:43
@skate: What a rush! :) cok HIzLIsIn karde$im. eline sagLIk. Hemen inceLiyorum.
Başlık: kurs sonrasi ornekler
Gönderen: nightlord - 07.01.2007 00:20:59
Selamlar. ben de irq rutinine strangerin yaptigi gibi saga sola gitme ornegi vereyim. irq hazirlama bolumleri aynen daha onceki orneklerde oldugu gibi. space icin de skatein ornegine bakabilirsiniz. bu yuzden sadece irq rutini veriyorum
 
Kod: [Seç]
irq_rutini:
    inc $d019
    jsr sprite_pozisyonunu_guncelle
    jmp $ea81
 
sprite_pozisyonunu_guncelle:
    lda hareket_yonu
    cmp #SAGA_HAREKET
    beq saga_kaydir
    jmp sola_kaydir
 
saga_kaydir:
    ldx $d000
    inx
    beq sola_don
    stx $d000
    jmp irq_rutini_sonu
 
sola_don:
    lda #SOLA_HAREKET
    sta hareket_yonu
    lda #$fe
    sta $d000
    jmp irq_rutini_sonu
 
sola_kaydir:
    ldx $d000
    dex
    beq saga_don
    stx $d000
    jmp irq_rutini_sonu
 
saga_don:
    lda #SAGA_HAREKET
    sta hareket_yonu
    lda #$00
    sta $d000
    jmp irq_rutini_sonu
 
irq_rutini_sonu:
    rts
 
hareket_yonu:
    !by SAGA_HAREKET
 
SAGA_HAREKET = 1
SOLA_HAREKET = 2

Burada aslinda hayatta sik karsimiza cikan bir tasarim ornegi goruyoruz. "Durum Motorlari"... Bu irq rutinimiz bir durum motoru. Durum motorlarinin "durumlari" ve onlara iletilen "istekler" vardir. Bir durum motoru kendisine gelen istegi alinca "istek" ve bulundugu "durum" a bakarak bir is yapar. Bu yaptigi isin sonucu olarak ayni durumda kalabilir veya "durum degistirme" yasayabilir
 
bu ornekte iki durum var: SAGA_HAREKET ve SOLA_HAREKET.
bir istek var: sprite_pozisyonunu_guncelle
iki durum degisikligi olabiliyor zaman zaman: sola_don ve saga_don
Başlık: kurs sonrasi ornekler
Gönderen: stranger - 07.01.2007 00:52:03
@nightlord: aha! $imdi oLaY tam OLarak cozuldu :)
Başlık: kurs sonrasi ornekler
Gönderen: nightlord - 07.01.2007 06:51:32
saga don alt rutininde, sta hareket_yonunden sonraki satirda mesaji ilk post ettigimde hata olmus. simdi duzelttim, haberiniz olsun.
Başlık: kurs sonrasi ornekler
Gönderen: stranger - 07.01.2007 18:34:44
Skate ve nightlord'un gonderdiklerinin birLe$imi...
Basic'e du$mesek daha iyi gibi geLdi. Code daha sade oLuyor..
 
!to "deneme.prg",cbm
*=$1000
; Sprite Bas
lda #$01
sta $d015
lda #$24
sta $d000 ; spriteın x koordinatı
lda #$72
sta $d001 ; spriteın y koordinatı
 
; Interruptı Hazırla
 
sei
lda #$7f
sta $dc0d
lda #$01
sta $d01a
lda #$1b
sta $d011
lda #$00
sta $d012
lda #sta $0314
lda #>int
sta $0315
cli
rts
int:
inc $d019
jsr sprite_pozisyonunu_guncelle
jmp $ea81
 
sprite_pozisyonunu_guncelle:
lda hareket_yonu
cmp #SAGA_HAREKET
beq saga_kaydir
jmp sola_kaydir
 
saga_kaydir:
ldx $d000
inx
beq sola_don
stx $d000
jmp irq_rutini_sonu
 
sola_don:
lda #SOLA_HAREKET
sta hareket_yonu
lda #$fe
sta $d000
jmp irq_rutini_sonu
 
sola_kaydir:
ldx $d000
dex
beq saga_don
stx $d000
jmp irq_rutini_sonu
 
saga_don:
lda #SAGA_HAREKET
sta hareket_yonu
lda #$00
sta $d000
jmp irq_rutini_sonu
 
irq_rutini_sonu:
rts
 
hareket_yonu:
!by SAGA_HAREKET
 
SAGA_HAREKET = 1
SOLA_HAREKET = 2
Başlık: kurs sonrasi ornekler
Gönderen: stranger - 07.01.2007 18:38:36
Benim gibi acme'yi fazLa kuLLanmayanLar icin. Normal dunya'da ki  :) meali nedir $u parcanIn? TASM kullananLar icin?
 
hareket_yonu:
!by SAGA_HAREKET

yani "!BY" ...
Başlık: kurs sonrasi ornekler
Gönderen: anesthetic - 07.01.2007 19:45:58
çok alakasız olacak ama buna ben cevap vereyim :)

!by SAGA_HAREKET

ile tam oradaki bytea (rts'ten sonraki) 1 koyuyoruz. o byteı "hareket_yonu" olarak labelladık ve yön durumumuzu o byte'ta store ediyoruz.

!by tasm'ca ne olur bilmiyorum ama bi kaç farklı assemblyde şunlar da aynı anlama gelecekti:

hareket_yonu   db   SAGA_HAREKET
hareket_yonu:   .db   SAGA_HAREKET
hareket_yonu:   fcb   SAGA_HAREKET
Başlık: kurs sonrasi ornekler
Gönderen: skate - 07.01.2007 20:05:18
!by ya da !byte'ın TASM'deki karşılığı F5 ile de yazdırlabilen
 
.byte
 
ifadesidir. Benzer şekilde !tx ya da !text de .text'e karşılık gelir. Ama !text tek alternatif değildir. Ekran karakterlerini daha iyi ifade eden !scr de kullanılabilir. Ne yazık ki ACME'nin adam akıllı bir dökümasyonu yok benim bildiğim. Paketin içinden çıkanla yetinmek zorunda kalıyorsunuz. O da bence yetersiz. Ama deneme yanılmayla öğreniliyor birçok şey kısa sürede.
 
ACME için adam akıllı döküman bilen varsa lütfen yollasın. Benim de işime yarar.
Başlık: kurs sonrasi ornekler
Gönderen: stranger - 07.01.2007 20:25:38
@skate: byte mI? eheh.. cok ho$ yahu... :) acme'nin kIsaLTmaLarIna baYILdIm...
 
@anesthetic: hocam cozmu$sun oLayI ama yoL biraz uzun oLmu$ anLa$Ilan.. ;)
Başlık: vice monitor problemi.
Gönderen: stranger - 07.01.2007 21:10:43
Acme'nin dokuman probleminden soz acILmI$ken bende Vice hakkInda biraz yaKInmak istiyorum.
 
vice'In monitoru tam anLamIyLa caLI$mIyor.
Mesela d, a, g vb. komutlar caLIsIrken Load, save gibi komutLar caLI$MIyor. Bu da Pc uzerinde c64 icin yazILIm geLi$tirmeyi zorLa$tIrIyor :)
Ornegin S "sid",08,1000 2000 gibi bir komutla bir sid aLIp kendi programImIzda denemek istersek bu mumkun oLmuyor. AynI $ekiLde L"sid",08,1000 gibi hayati $eyLeri yapmak mumkun oLmuyor. Yani hafIzanIn istedigimiz yerine istedigimiz materyali koyamIyoruz. Boylece ekranda da gosteremeyip farazi $eyLer uzerinde caLIsIyorsunuz.
(Kare seklinde sprite'lar, Ekranda duzgun gozukmeyen[sadece o hafIza araLIgIndaki byteLarIn oLu$turdugu] logolar vb.)
 
Bu konunun bilinen bir cozumu yok zannedersem. Ancak Acme'de bu belki mumkun olabilir diye dusunuyorum. Relunch64 dosyaLarI hex ve bin oLarak import edebiliyor.
 
Ornegin bir sid dosyasInI a$agIdaki ornek gibi code'un icine import edebiliyoruz. Tabii bu extra bir$ey OLdugu icin kuLLanImIda extra biLgi gerektiriyor. Yeterli dokumanda yoksa ordada sIcabiLiyoruz.
 
 
!byte $50,$53,$49,$44,$00,$02,$00,$7c
!byte $00,$00,$10,$00,$10,$03,$00,$01
!byte $00,$01,$00,$00,$00,$00,$45,$6e
!byte $64,$69,$6e,$67,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$4a,$65
!byte $6e,$73,$2d,$43,$68,$72,$69,$73
!byte $74,$69,$61,$6e,$20,$48,$75,$75
!byte $73,$20,$26,$20,$49,$43,$45,$00
!byte $00,$00,$00,$00,$00,$00,$31,$39
!byte $38,$38,$2d,$38,$39,$20,$56,$69
!byte $62,$72,$61,$6e,$74,$73,$00,$00
Başlık: kurs sonrasi ornekler
Gönderen: vigo - 07.01.2007 21:31:48
kanka, direk retro-replay kullan vice'da...
vice için .BIN'i var....
direk "kartuşla" çalış
Başlık: kurs sonrasi ornekler
Gönderen: skate - 07.01.2007 21:35:46
vice'ın monitörü aslında çok iyi çalışıyor hatta hatta commodore'daki monitörlere göre ekstra özelliklere sahip. şimdi o monitörler ilgili en büyük sorun harddiske ya da diskete kayıt yapılması durumlarıdır. Eğer "true drive emulation" açık değilse ,8 ile kaydetmek ya da yükletmek yerine ,0 kullanmak gerekir. Bir de yanılmıyorsam "," karakteri kullanılmıyor. doğrudan
 
s "koalagrafik" 0 6000 8710
 
gibi kullanılıyor. Eğer true drive emulation açıksa 0 yerine 8 kullanılabiliyor. Bunlar aklımda kalanlar, çok sık kullanmıyorum Vice'ın monitörünü load save amaçlı. Bunun haricinde "d" "i" "m" gibi komutlar sorunsuz çalışıyor.
 
Eğer monitörden kod yazmak isterseniz "a" kullanmanız lazım
a c000
.c000 sei
.c001 lda #$00
.c003 sta $d020
...
 
şeklinde kod girebilirsiniz. en son boş olarak enterladığınız satırda kod girme işlemi sona erer. Eğer doğrudan komut değil de byte değerleriyle birşeyler girmek isterseniz ">" karakterini kullanmanız lazım. Ama sonrasında bir boşluk vermeyi unutmayın
 
> c000 78
 
diyerek sei komutunu girebilirsiniz. VIC, SID, CIA1 ve CIA2 değerlerini listelemek için kısaca "io" komutu kullanabilirsiniz. O anki değişkenlerin ve flaglerin durumlarını görmek için "r" kullanabilirsiniz.
 
Aklıma geldikçe daha da yazarım...
Başlık: kurs sonrasi ornekler
Gönderen: stranger - 07.01.2007 21:37:17
@vigo: bi ton CRT dosyasI var elimde Action Replay serisi Final serisi ama onlarda da yemedi.
Ben elimdekileri buraya gondereyim belki i$ine yarayan oLur.
Bu arada bahsettigin kartu$un crt'si varsa makbuLe gecer..
 
@skate: Thx. AnLadIm karde$im. Iyi bok atmI$Im vice'a bende :)
Başlık: kurs sonrasi ornekler
Gönderen: skate - 07.01.2007 21:41:37
Birkaç Action Replay versiyonunu (6 dahil) ekliyorum buraya
Başlık: kurs sonrasi ornekler
Gönderen: skate - 07.01.2007 21:44:35
Alıntı yapılan: stranger
@vigo: bi ton CRT dosyasI var elimde Action Replay serisi Final serisi ama onlarda da yemedi.
Ben elimdekileri buraya gondereyim belki i$ine yarayan oLur.
Bu arada bahsettigin kartu$un crt'si varsa makbuLe gecer..
 
@skate: Thx. AnLadIm karde$im. Iyi bok atmI$Im vice'a bende :)
ıyi bok atmışım demişsin ama yok harbiden Commodore 64 kullanmaya alışık insanlar için çok boktan bir monitör o. En azından alışana kadar. Alışınca görüyorsun ki özellikleri gayet yerinde, hatta çok daha hızlı ve kullanışlı çalışıyor haliyle 64'dekilere göre. Gel gelelim bunca yılda anca alıştım ben Vice'ın monitörüne. Ben de aynı senin gibi bok atıp duruyordum, Endo sağolsun öğretti benim bulamadığım birkaç özelliğini. O zaman barıştım Vice'ın monitörüyle azcık :)
Başlık: kurs sonrasi ornekler
Gönderen: nightlord - 07.01.2007 22:13:46
Acme'yi indirip actiginiz zaman icinde docs diye bir klasor bulacaksiniz. Burada AllPOs.txt adli dosya var. orada butun ACME pseudo opcode'lari orneklerle beraber bayagi detayli listelenmis ve aciklanmis durumda. Alisana kadar onu el altinda printout seklinde bulundurmayi oneriyorum.
 
VICE monitorunun de aslinda cok guclu bir monitor olsugunu soylemeliyim. load ve save komutlari da calisiyor aslinda. Fakat dikkat edilecek bir kac nokta var. Bunlari benim tavsiyelerim olarak nitelendirin :)
 
- vice'i konsoldan x64 test.prg falan diye calistirin. boylece vice'in "working directory"si o komutu verdiginiz yer olur. bundan sonra vice monitorunde
 
s "song.prg" 0 1000 2000
(s dosya ismi    cihaz(0 | 8 | 9 )       baslangic_adresi     bitis_adresi)
 
gibi bi komutla bellekten 1000 2000 arasini working directory'ye atabilirsiniz. bu dosya c64 dosya formatinda olacaktir. yani ilk iki bayti baslangic adresidir vs.
 
- vice monitorunde komutlarda kullandiginiz sayilar hextir. basina $ koymaniza gerek yoktur.
 
- vice monitorunde super debug komutlari vardir.
break
watch
step
gibi.
 
break ile kodun bir yerine gelinceye kadar vice'in normal calisip sonra orada durmasini ve siz step dedikce birer komut birer komut ilerlemesini saglayabilirsiniz. her komuttan sonra registerlerin veya bellegin durumuna bakabilirsiniz.
 
watch ile bellekte bir araliga yazma veya okuma yapildiginda programi durdurabilir ve yine step ile komut komut ilerletebilirsiniz. bazen yazdiginiz program bellekte istemediginiz seklide kendi ustune yazip kendini bozabilir. bu durumlar icin watch ile hatanin oldugu ani bulmak cok kolaylasir
 
benim sitedeki ACME ve etiketler yazisina da bir goz atmak isteyebilirsiniz. orada output dosyalarinin nasil olusturuldugu detayli sekilde anlatiliyordu.
Başlık: kurs sonrasi ornekler
Gönderen: nightlord - 08.01.2007 02:15:02
bu arada acme de muzigi nasil import edecegimiz ile ilgili kucuk bir not
 
acme'de bellege bir takim baytlari yerlestirmek icin;
 
!by $xx, $xx,......
 
kullanabilecegimiz gibi
 
!bin "song.prg" , 2, $1000
 
de kullanabiliriz. bu hali hazirda olan bir dosyanin baytlarini assemblerin output dosyasina aynen koymasini saglar dosya adindan sonraki argumanlar:
 
1- Atlanan baytlar: yani bu arguman kadar bayt dosyanin basindan itibaren sayilip dikkate alinmaz.dosya bellege yerlesmeye, dikkate alinmayan baytlardan sonrakiilk bayt ile baslar. bu ornekte song.prg'nin bir c64 dosyasi olduguunu varsaydim. c64 dosyalarinin ilk 2 bayti baslangic adresi oldugu ve biz onunla ilgilenmedigimiz icin onlari dikkate almiyoruz
 
2- Uzunluk: burada verilen sayi kadar bayt bellege yerlestirilir:
a- eger verilen sayi kadar bayt dosyadan okunmadan dosya biter ise, kalan baytlar 0 ile doldurulur
b- eger verilen sayi kadar bayt okundugunda dosya henuz bitmemis ise dosyada kalan baytlar okunmaz.
 
Ornek: elimizde song.prg diye $c00 baytlik bir dosya olsun
 
*= $1000
!bin "song.bin" , 2 , $1000
 
Dosyanin ilk iki baytini cope atip kalan $bfe bayti, [$1000 , $1bfd] arasina kopyalar. [$1bfe , $1fff] arasini 0 'le doldurur.
 
*= $1000
!bin "song.bin" , $100 , $400
 
Dosyanin ilk $100 baytini cope atip kalan $b00 baytin ilk $400 tanesini, [$1000 , $13ff] arasina kopyalar.
 
Muzik caldirma olayini da ayrica VIC kursu 3. bolumun sonunda anlatacagim
 
Bu arada VIC kursunu takip eden arkadaslara benim web sitesindeki "6510 Assembly" ve "Acme ve Etiketler" yazilarini mutlaka okumalarini oneriyorum. Cunku cogu zaman orada anlattigim seyleri tekrar anlatmiyorum VIC kursunda. Bu yuzden orayi okuyarak, benim bildiginizi varsaydigim ama bilmediginiz birsey kalmamasini saglamaniz kursu takip etmenizi cok kolaylastiracaktir.
 
Kolay gelsin...
Başlık: kurs sonrasi ornekler
Gönderen: skate - 08.01.2007 02:31:02
Ufak bir düzeltme. ılk parametre boyut, ikincisi atlanacak bytelar. Yani;
 
!bin "song.prg" , 2, $1000
 
yerine
 
!bin "song.prg" , $1000, 2
 
olması lazım. Hatta hatta hiç boyut vermeden dosyanın kendi boyutuyla yükletebilirsiniz. Örnek:
 
!bin "song.prg" , , 2
Başlık: kurs sonrasi ornekler
Gönderen: esmaeild - 10.01.2007 11:15:46
Alıntı yapılan: skate
Kod: [Seç]
lda #$c0 ; [B]$c0*$40[/B] = $3000 adresindeki spriteı göster

hocam şurayı anlamadım. hadi biz comment e bakıp $3000 i buluyoruzda aküye #$c0 yükleniyor.
Başlık: kurs sonrasi ornekler
Gönderen: skate - 10.01.2007 11:50:38
spritelar 24x21 pixellik alanlar. 24 pixel de bitlerle ifade edildiği için 3 byte'a karşılık geliyor. 3 byte x 21 satır = 63 byte.
 
şimdi bu noktada 2li sistemde işi kolaylaştırıcı bir yöntem devreye giriyor. 2^6 = 64 olduğu için 63 byte kaplayan spritelar aralarında 1 byte boş bırakılarak hafızaya yerleştiriliyorlar. Yani hafıza düzeninde hafızanın en başından itibaren bakacak olursak
 
0 - 62       : 1. sprite alanı
63            : boş byte
64 - 126    : 2. sprite alanı
127          : boş byte
128 - 190  : 3. sprite alanı
191          : boş byte
.....
 
şeklinde yerleşiyorlar. Biz ise spriteları tanımlarken sprite alanlarıyla tanımlıyoruz. Yani 3. sprite'ı göster. 17. sprite'ı göster gibi. şimdi bu hesaptan yola çıkarsak $3000 = 192 * 64 = $c0 * $40'a denk geliyor. Yani aslında biz orada $c0 (=192) değerini verirken "Git hafızadaki 192. sprite'ı göster" demiş oluyoruz. Bilgisayar da 192 * 64 = 12288 = $3000 adresindeki sprite'ı gösteriyor.
 
Burda ufak bir not. Sprite numaraları maksimum 255'e kadar gider. Bu da $3fc0 adresindeki sprite'a denk gelir. Peki $4000'den sonrasında sprite gösteremiyor muyuz? Elbette ki gösterebiliyoruz. Çok detaya girmeden kısaca anlatayım.
 
64k'lık hafıza 16k'lık 4 parçaya bölünmüş durumda. Bunlara "bank" deniyor. Biz $dd00 adresini kullanarak bunlar arasında geçiş yapabiliyoruz. Diyelim ki 2 numaralı banktayız. Bu bank $4000-$8000 arasına denk geliyor. Bu durumda 192 nolu sprite $3000'de değil, bank adresinin başlangıcıyla toplanarak $4000+$3000 = $7000'e denk gelir.
 
3 numaralı bank $0000-$3fff
2 numaralı bank $4000-$7fff
1 numaralı bank $8000-$bfff
0 numaralı bank $c000-$ffff
 
x numaralı bankdan kastım $dd00'ın alt iki bitinin alacağı değerlere karşılık geliyor. Örneğin $8000-$bfff arasını kullanmak istiyorsanız 1 numaralı bank olduğu için en basit tanımıyla
 
lda #1
sta $dd00
 
diyebilirsiniz. şimdilik fikir sahibi olmanız için kısaca açıkladım. Bu konuya fazla kafanızı yormayın. Çünkü bank değiştirdiğiniz gibi ekran adresleri gibi birçok şey değişecektir. Ayrıca diğer bankların bir bölümünde "garip" adres aralıklarına denk gelebilirsiniz. Onun için bunu şimdilik bilin ama kullanmayın. Nightlord sizi güvenle bank değiştirecek hale getirecektir :)
Başlık: kurs sonrasi ornekler
Gönderen: esmaeild - 10.01.2007 15:29:10
yani $07f8 adresine koyulacak herhangi bir değer istisnasız deger*$40 olarak değerlendiriliyor. bir de 3. sprite ı göstermek isteseydim ozaman 128 yani $80 göndericektim doğrumu O da gidip $80 * $40 = $2000 den itibaren 63 byte okuyacaktı.
Başlık: kurs sonrasi ornekler
Gönderen: skate - 10.01.2007 23:29:26
3. sprite'ı göstermek için senin (0'dan başlayan dizi mantığı) 128 değil 2 demen gerekiyor. 128 yani $80 onun hafıza adresi. $0080 şeklinde düşünebilirsin. Deminki örnekte 1'den başlamakla hata ettim. 0'dan başlayarak yazarsam daha kolay olacak sanırım. Deminkinin bir eksiği olarak biraz daha geniş bir tablo oluşturacak olursak
 
0. sprite -> $0000
1. sprite -> $0040
2. sprite -> $0080
3. sprite -> $00c0
4. sprite -> $0100
5. sprite -> $0140
6. sprite -> $0180
7. sprite -> $01c0
8. sprite -> $0200
9. sprite -> $0240
10. sprite -> $0280
11. sprite -> $02c0
12. sprite -> $0300
.
.
64. sprite -> $1000
65. sprite -> $1040
.
.
.
.
128. sprite -> $2000
129. sprite -> $2040
.
.
.
192. sprite -> $3000
193. sprite -> $3040
.
.
255. sprite -> $3fc0
 
şeklinde. sen $07f8'e kaçıncı sprite olduğunu yazıyorsun. Bu tabloya göre 3. sprite'ı göstermek için
 
lda #3
sta $07f8
 
dediğinde $00c0 adresindeki sprite gösteriliyor kısacası. Benim örnekteki
 
lda #$c0
sta $07f8
 
ise $c0 = 192 olduğundan yine bu tabloya göre $3000'deki sprite'ı gösteriyor.
 
Bu arada $0800'ün gerisindeki spritelar genellikle $0340-$0400 aralığı hariç pek kullanılmaz. Spriteları ekranda göstermek sorun olmayacaktır ancak özellikle $0000-$0340 aralığında çok fazla bilgisayarın kullandığı alan olduğu için oraya bir sprite datası yerleştirmekte zorlanabilirsin. $0400-$07e8 ise ekranın bulunduğu yerdir.
 
Bak sana eğlenceli bir deneme yaptıriim. $0400'deki spriteı gösterecek bir rutin yaz. $0400'deki sprite için $07f8'e 16 (ya da hex olarak $10) vermen gerekiyor. Sprite ekranın ortalarında bir yere yerleştir. Daha sonra çık ekranın en sol üst köşesine, ekrana birşeyler yaz, hatta hatta imleci olduğu yerde beklet. Bak bakalım spriteda nasıl bir değişim gözlemliyorsun :) Eğlenceli bir deneme olacaktır senin için. Eğer bir sorun yaşarsan söyle bana kodu post ederim buraya.
 
Not: Interrupt v.s. kullanmana gerek yok. Yalnızca sprite basıp RTS ile çıkacaksın.
Başlık: kurs sonrasi ornekler
Gönderen: esmaeild - 10.01.2007 23:45:57
$400 ü biliyorum ekranın adresinin başlangıcı. ekrana yazacağım yazılar spriteın datalarını değiştirecek. hemen yapayım.
 
 
ok. oldu :) spriteları pixel atlamadan daha hızlı götürme imkanı var mı
 
Kod: [Seç]
[SIZE=1][COLOR=#000040]
[/COLOR][/SIZE][SIZE=4][COLOR=#008000]!to[/COLOR][COLOR=#800080]&quot;sprite2.prg&quot;[/COLOR][/SIZE][COLOR=#000040][SIZE=4],cbm[/SIZE]
 
[/COLOR][SIZE=4][COLOR=#008000]*=[/COLOR][COLOR=#804000]$1000
[/COLOR][/SIZE][COLOR=#000040]
[/COLOR][COLOR=#808080][SIZE=4]; Sprite Bas[/SIZE]
[/COLOR][COLOR=#000040][SIZE=4]lda [/SIZE][/COLOR][SIZE=4][COLOR=#008080]#[/COLOR][COLOR=#804000]$01
[/COLOR][/SIZE][COLOR=#000040][SIZE=4]sta [/SIZE][/COLOR][COLOR=#804000][SIZE=4]$d015[/SIZE]
[/COLOR][COLOR=#000040]
[SIZE=4]lda [/SIZE][/COLOR][SIZE=4][COLOR=#008080]#[/COLOR][COLOR=#804000]$10[/COLOR][COLOR=#808080];c0 ; $c0*$40 = $3000 adresindeki spriteı göster
[/COLOR][/SIZE][COLOR=#000040][SIZE=4]sta [/SIZE][/COLOR][COLOR=#804000][SIZE=4]$07f8[/SIZE]
[/COLOR][COLOR=#000040]
[SIZE=4]lda [/SIZE][/COLOR][SIZE=4][COLOR=#008080]#[/COLOR][COLOR=#804000]$98
[/COLOR][/SIZE][COLOR=#000040][SIZE=4]sta [/SIZE][/COLOR][SIZE=4][COLOR=#804000]$d000[/COLOR][COLOR=#808080]; spriteın x koordinatı
[/COLOR][/SIZE][COLOR=#000040]
[SIZE=4]lda [/SIZE][/COLOR][SIZE=4][COLOR=#008080]#[/COLOR][COLOR=#804000]$72
[/COLOR][/SIZE][COLOR=#000040][SIZE=4]sta [/SIZE][/COLOR][SIZE=4][COLOR=#804000]$d001[/COLOR][COLOR=#808080]; spriteın y koordinatı
[/COLOR][/SIZE][COLOR=#000040]
[/COLOR][COLOR=#808080][SIZE=4]; Interruptı Hazırla[/SIZE]
[/COLOR][COLOR=#000040][SIZE=4]sei[/SIZE]
 
[SIZE=4]lda [/SIZE][/COLOR][SIZE=4][COLOR=#008080]#[/COLOR][COLOR=#804000]$7f
[/COLOR][/SIZE][COLOR=#000040][SIZE=4]sta [/SIZE][/COLOR][COLOR=#804000][SIZE=4]$dc0d[/SIZE]
[/COLOR][COLOR=#000040]
[SIZE=4]lda [/SIZE][/COLOR][SIZE=4][COLOR=#008080]#[/COLOR][COLOR=#804000]$01
[/COLOR][/SIZE][COLOR=#000040][SIZE=4]sta [/SIZE][/COLOR][COLOR=#804000][SIZE=4]$d01a[/SIZE]
[/COLOR][COLOR=#000040]
[SIZE=4]lda [/SIZE][/COLOR][SIZE=4][COLOR=#008080]#[/COLOR][COLOR=#804000]$1b
[/COLOR][/SIZE][COLOR=#000040][SIZE=4]sta [/SIZE][/COLOR][COLOR=#804000][SIZE=4]$d011[/SIZE]
[/COLOR][COLOR=#000040]
[SIZE=4]lda [/SIZE][/COLOR][SIZE=4][COLOR=#008080]#[/COLOR][COLOR=#804000]$00
[/COLOR][/SIZE][COLOR=#000040][SIZE=4]sta [/SIZE][/COLOR][COLOR=#804000][SIZE=4]$d012[/SIZE]
[/COLOR][COLOR=#000040]
[SIZE=4]lda [/SIZE][/COLOR][SIZE=4][COLOR=#008080]#[/COLOR][/SIZE][COLOR=#000040][SIZE=4]<irq_rutini[/SIZE]
[SIZE=4]sta [/SIZE][/COLOR][COLOR=#804000][SIZE=4]$0314[/SIZE]
[/COLOR][COLOR=#000040]
[SIZE=4]lda [/SIZE][/COLOR][SIZE=4][COLOR=#008080]#[/COLOR][/SIZE][COLOR=#000040][SIZE=4]>irq_rutini[/SIZE]
[SIZE=4]sta [/SIZE][/COLOR][COLOR=#804000][SIZE=4]$0315[/SIZE]
[/COLOR][COLOR=#000040]
[SIZE=4]cli[/SIZE]
 
[/COLOR][COLOR=#808080][SIZE=4]; Space kontrolü[/SIZE]
[/COLOR][COLOR=#000040][SIZE=4]space [/SIZE]
[SIZE=4]lda [/SIZE][/COLOR][COLOR=#804000][SIZE=4]$dc01[/SIZE]
[/COLOR][COLOR=#000040][SIZE=4]cmp [/SIZE][/COLOR][SIZE=4][COLOR=#008080]#[/COLOR][COLOR=#804000]$ef
[/COLOR][/SIZE][COLOR=#000040]
[SIZE=4]bne space[/SIZE]
 
[/COLOR][COLOR=#808080][SIZE=4]; Spriteları kapa[/SIZE]
[/COLOR][COLOR=#808080][SIZE=4];lda #$00[/SIZE]
[/COLOR][COLOR=#808080][SIZE=4];sta $d015[/SIZE]
[/COLOR][COLOR=#000040]
[/COLOR][COLOR=#808080][SIZE=4]; Basic'e dön[/SIZE]
[/COLOR][COLOR=#000040][SIZE=4]sei[/SIZE]
 
[SIZE=4]lda [/SIZE][/COLOR][SIZE=4][COLOR=#008080]#[/COLOR][COLOR=#804000]$81
[/COLOR][/SIZE][COLOR=#000040][SIZE=4]sta [/SIZE][/COLOR][COLOR=#804000][SIZE=4]$dc0d[/SIZE]
[/COLOR][COLOR=#000040]
[SIZE=4]lda [/SIZE][/COLOR][SIZE=4][COLOR=#008080]#[/COLOR][COLOR=#804000]$f0
[/COLOR][/SIZE][COLOR=#000040][SIZE=4]sta [/SIZE][/COLOR][COLOR=#804000][SIZE=4]$d01a[/SIZE]
[/COLOR][COLOR=#000040]
[SIZE=4]lda [/SIZE][/COLOR][SIZE=4][COLOR=#008080]#[/COLOR][COLOR=#804000]$31
[/COLOR][/SIZE][COLOR=#000040][SIZE=4]sta [/SIZE][/COLOR][COLOR=#804000][SIZE=4]$0314[/SIZE]
[/COLOR][COLOR=#000040]
[SIZE=4]lda [/SIZE][/COLOR][SIZE=4][COLOR=#008080]#[/COLOR][COLOR=#804000]$ea
[/COLOR][/SIZE][COLOR=#000040][SIZE=4]sta [/SIZE][/COLOR][COLOR=#804000][SIZE=4]$0315[/SIZE]
[/COLOR][COLOR=#000040]
[SIZE=4]cli[/SIZE]
 
[SIZE=4]rts[/SIZE]
 
[/COLOR][COLOR=#808080][SIZE=4]; Interrupt Rutini[/SIZE]
[/COLOR][COLOR=#000040][SIZE=4]int [/SIZE]
[SIZE=4]inc [/SIZE][/COLOR][SIZE=4][COLOR=#804000]$d000[/COLOR][COLOR=#808080]; Sprite'ın X koordinatını 1 arttır
[/COLOR][/SIZE][COLOR=#000040][SIZE=4]lda [/SIZE][/COLOR][SIZE=4][COLOR=#804000]$d000[/COLOR][COLOR=#808080]; Eğer sprite 255'i geçmediyse
[/COLOR][/SIZE][COLOR=#000040][SIZE=4]bne out [/SIZE][/COLOR][COLOR=#808080][SIZE=4]; interruptın çıkışına git[/SIZE]
[/COLOR][COLOR=#000040]
[SIZE=4]lda [/SIZE][/COLOR][SIZE=4][COLOR=#804000]$d010[/COLOR][COLOR=#808080]; Sprite 255'i geçtiyse
[/COLOR][/SIZE][COLOR=#000040][SIZE=4]eor [/SIZE][/COLOR][SIZE=4][COLOR=#008080]#[/COLOR][COLOR=#804000]$01[/COLOR][COLOR=#808080]; 9.bitini değiştir
[/COLOR][/SIZE][COLOR=#000040][SIZE=4]sta [/SIZE][/COLOR][SIZE=4][COLOR=#804000]$d010[/COLOR][COLOR=#808080]; 0 ise 1 yap, 1 ise 0 yap
[/COLOR][/SIZE][COLOR=#000040][SIZE=4]out [/SIZE]
[SIZE=4]inc [/SIZE][/COLOR][COLOR=#804000][SIZE=4]$d019[/SIZE]
[/COLOR][COLOR=#000040]
[SIZE=4]jmp [/SIZE][/COLOR][SIZE=4][COLOR=#804000]$ea81[/COLOR][/SIZE][COLOR=#000040]
 
 
 
 
[SIZE=4]irq_rutini:[/SIZE]
[SIZE=4]inc [/SIZE][/COLOR][COLOR=#804000][SIZE=4]$d019[/SIZE]
[/COLOR][COLOR=#000040][SIZE=4]jsr sprite_pozisyonunu_guncelle[/SIZE]
[SIZE=4]jmp [/SIZE][/COLOR][COLOR=#804000][SIZE=4]$ea81[/SIZE]
[/COLOR][COLOR=#000040]
[SIZE=4]sprite_pozisyonunu_guncelle:[/SIZE]
[SIZE=4]lda hareket_yonu[/SIZE]
[SIZE=4]cmp [/SIZE][/COLOR][SIZE=4][COLOR=#008080]#[/COLOR][/SIZE][COLOR=#000040][SIZE=4]SAGA_HAREKET[/SIZE]
[SIZE=4]beq saga_kaydir[/SIZE]
[SIZE=4]jmp sola_kaydir[/SIZE]
 
[SIZE=4]saga_kaydir:[/SIZE]
[SIZE=4]ldx [/SIZE][/COLOR][COLOR=#804000][SIZE=4]$d000[/SIZE]
[/COLOR][COLOR=#000040][SIZE=4]inx [/SIZE]
[SIZE=4]beq sola_don[/SIZE]
[SIZE=4]stx [/SIZE][/COLOR][COLOR=#804000][SIZE=4]$d000[/SIZE]
[/COLOR][COLOR=#000040][SIZE=4]jmp irq_rutini_sonu[/SIZE]
 
[SIZE=4]sola_don:[/SIZE]
[SIZE=4]lda [/SIZE][/COLOR][SIZE=4][COLOR=#008080]#[/COLOR][/SIZE][COLOR=#000040][SIZE=4]SOLA_HAREKET[/SIZE]
[SIZE=4]sta hareket_yonu[/SIZE]
[SIZE=4]lda [/SIZE][/COLOR][SIZE=4][COLOR=#008080]#[/COLOR][COLOR=#804000]$fe
[/COLOR][/SIZE][COLOR=#000040][SIZE=4]sta [/SIZE][/COLOR][COLOR=#804000][SIZE=4]$d000[/SIZE]
[/COLOR][COLOR=#000040][SIZE=4]jmp irq_rutini_sonu[/SIZE]
 
[SIZE=4]sola_kaydir:[/SIZE]
[SIZE=4]ldx [/SIZE][/COLOR][COLOR=#804000][SIZE=4]$d000[/SIZE]
[/COLOR][COLOR=#000040][SIZE=4]dex [/SIZE]
[SIZE=4]beq saga_don[/SIZE]
[SIZE=4]stx [/SIZE][/COLOR][COLOR=#804000][SIZE=4]$d000[/SIZE]
[/COLOR][COLOR=#000040][SIZE=4]jmp irq_rutini_sonu[/SIZE]
 
[SIZE=4]saga_don:[/SIZE]
[SIZE=4]lda [/SIZE][/COLOR][SIZE=4][COLOR=#008080]#[/COLOR][/SIZE][COLOR=#000040][SIZE=4]SAGA_HAREKET[/SIZE]
[SIZE=4]sta hareket_yonu[/SIZE]
[SIZE=4]lda [/SIZE][/COLOR][SIZE=4][COLOR=#008080]#[/COLOR][COLOR=#804000]$00
[/COLOR][/SIZE][COLOR=#000040][SIZE=4]sta [/SIZE][/COLOR][COLOR=#804000][SIZE=4]$d000[/SIZE]
[/COLOR][COLOR=#000040][SIZE=4]jmp irq_rutini_sonu[/SIZE]
 
[SIZE=4]irq_rutini_sonu:[/SIZE]
[SIZE=4]rts[/SIZE]
 
[SIZE=4]hareket_yonu:[/SIZE]
[/COLOR][SIZE=4][COLOR=#008000]!by[/COLOR][/SIZE][COLOR=#000040][SIZE=4] SAGA_HAREKET[/SIZE]
 
[SIZE=4]SAGA_HAREKET = 1[/SIZE]
[SIZE=4]SOLA_HAREKET = 2[/SIZE]
 
 
 
 
 
 
[/COLOR][SIZE=4][COLOR=#008000]*=[/COLOR][COLOR=#804000]$3000
[/COLOR][/SIZE][SIZE=4][COLOR=#008000]!fill[/COLOR][COLOR=#000040] 63,255 [/COLOR][COLOR=#808080]; Sprite haritasını 255 ile doldur
[/COLOR][/SIZE][COLOR=#808080][SIZE=4];!fill 31,0 ; Sprite haritasını 255 ile doldur[/SIZE]
[/COLOR][COLOR=#808080][SIZE=4];!fill 1,1 ; Sprite haritasını 255 ile doldur[/SIZE]
[/COLOR][SIZE=1][COLOR=#808080][SIZE=4];!fill 31,0 ; Sprite haritasını 255 ile doldur[/SIZE]
[/COLOR][/SIZE]
Başlık: kurs sonrasi ornekler
Gönderen: skate - 11.01.2007 00:37:31
Rutinin kesinlikle doğru. Ama dediğim gibi interrupta falan gerek yok. şu kadarı yeterli.
 
Kod: [Seç]
lda #$01
sta $d015
lda #$10
sta $07f8
lda #$98
sta $d000
lda #$72
sta $d001
rts

Sonuç olarak herhalde demek istediğimi anlamışsındır. Aynı zamanda ekranın sol üstünden itibaren karakter yazarak ilerledikçe spriteların hafıza dizilimlerinin nasıl olduğunu da adım adım görebilirsin.
Başlık: kurs sonrasi ornekler
Gönderen: skate - 11.01.2007 00:44:19
Bu arada diğer sorunu unuttum cevaplamayı. Spriteları pixel atlatmadan daha hızlı götüremezsin. Peki neden?
 
Olayı interrupt içinde yapacak olursan saniyede 50 kere tekrar ettiğinden 1 sn'de pixel atlamadan maksimum 50 pixel ilerletebilirsin. Bir interrupt içinde 2 kere sprite'ı ilerletirsen ikisinin de çizilmesini bekleyemezsin çünkü 2 kere ekran taraması yapılmayacaktır. Kısaca limitin bu.
 
Diğer yöntem ne? Interrupt dışı. Bu durumda kontrolsüz bir şekilde taramaya hiç bakmaksızın istediğin kadar ilerletebilirsin spriteları. Ama yine ekran saniyede 50 defa çizilecektir ve sen yine 50 farklı koordinatta göreceksin spriteları. Sen birer birer de arttırsan koordinatları ekranın çizimiyle senkron tutmayacağı için yine pixel atlayacaktır. Ayrıca bir de tarama arada spriteın çizildiği yerlere denk geldiğinde spriteın üst yarısını bir önceki taramadaki koordinatta alt yarısını yeni koordinatında (ordan itibaren değiştirdiğin için) göreceğinden iyiden iyiye bozuk bir görüntü elde edersin.
 
Aynı şey aslında PClerde de geçerli. Diyelim ki 100 FPS çalışan bir kodunuz var. Pixel atlamadan 101 pixeli 1 sn'de götüremezsiniz.