PDA

View Full Version : sprite trick


stranger
30th September 2009, 17:51
Aklıma birşey takıldı bunu çözmek için bir trick var mı diye merak ediyorum.
256 byte yerimiz var autorun yapıyoruz.1 adet te sprite datamız var.
$0801 autorun
$080d code basla
$08c0 23.bank sprite datasını mecburen buraya koyuyoruz.
$08ff code sonu

Elimizde 64 byte'lık sprite datamız olsa herhangi bir sorun yaşamayacağız. Ama elimizdeki data 45 byte. Yani 19 byte'lık bir kayıp olacak.
$08ec civarlarında datamız bitiyor ve 0,0,0... diye gidiyor....

Soru şu ki... sprite datasını bir şekilde $08d3 civarlarında bir yerden başlatarak okutabilir miyiz.

Aslında ben bir trick buldum fakat orada da autorun ile ilgili sorun çıkıyor.

Aslında autorun'ı $0801 'de değilde daha ilerde yapabilsek böyle bir sorun oluşmayacaktı. Çünkü code u önce çekerek 256.byte'ı 45byte'lık sprite'ın son byte'ı yapıp programı kapatırdık.

Yani benim aklıma gelen trick şöyleki autorun edemediğim için trick'cik oluyor kendisi :)

$08ed code başlangıcı ($0900'den 19 byte önce başlatıp)
$09c0 de bank'ın başlangıcını yakalayıp 45 byte'ımızı dizerek
$09ed 'de code u bitirmek. Geri kalan 19 byte 0 olacağı için de herhangi bir sorun teşkil etmeyecek.

skate
30th September 2009, 18:23
spriteları $40'lık blokların dışına taşıyamazsın. sanırım birtek sprite crunching olayında bu tür şeyler olabiliyor ama 256 byte kod kasıyorsan hiç tavsiye etmem. Bence en mantıklı yol $40'lık bloğun 3'erli bir katı şeklinde bir adresten başlatman sprite datasını. Yani d3 değil de;

c0 c3 c6 c9 cc cf d2 d5 ...

d5 gibi bir adrese yerleştirirsen sprite'ı yalnızca Y'de ileri bir pozisyona basmış olursun.

21 - 7 = 13 satırlık bir sprite'ı bu şekilde kullanabilirsin (seninki 15 satır, biraz kırpman gerekebilir). ancak bu da kolay değil, üstteki junk datayı yok etmek için (yani senin kodun ya da dataların denk geldiği alan) sprite'ı arkaplan tek renk ise o renge getirip tam 7.satırda tarama yakalatarak orjinal rengine çevirmek gerekir.

başka türlü bu şekilde kullanman mümkün görünmüyor. Ancak biraz byte harcayarak transfer rutini de yazabilirsin elbette ki. Yani $08d3'den itibaren bir blok datayı atıyorum $0c00'a taşı ve oradan kullan. elbette ki biraz yer kaybedeceksin ancak her iki durumda da bu geçerli.

ldx #0
loop1:
lda $08d3,x
sta $0c00,x
dex
bne loop1

eğer X'in (ya da Y de kullanabilirsin) değerinin sıfır olduğu bir yere denk getirirsen yalnızca 9 byte kaybedersin.

stranger
30th September 2009, 22:24
Yazdığım yarım sayfa cevap gitti :eek:
Özet olarak çok teşekkür ederim kardeşim. Sen olmaz diyorsan kasmaya gerek yok demektir :)

Aklıma Vice'da bankların birinin $00 birinin $ff ile dolu olması geliyor. Birden fazla sprite için belkide birer bank atlatarak $00 lara denk getirip kodu kısaltabilirim. Yani 64 byte'tan geriye kalan bölümü sprite'ın arka planı olan $00 la doldurmak için yer harcamamak için.

O da /ldx#$c0 /stx$07f8 /inx /stx$07f9 diyerek kazanabileceğimiz 1 byte'ı götürüyor.

Nightshift'te Bugged Cycle'ın sprite dataları üstte yazdığım nedenden ötürü party makinası olan Vigo'nun gerçek c64'ünde sıçmıştı. Bende Vicezede olmuştum ...

skate
1st October 2009, 02:19
çok muhteşem olmasa da benim 256b twister'dan bir örnek sana.


lda #%11111111 ; Prepare Sprite Datas
sta SPRITES-2,x
lda #%10111011
sta SPRITES-1,x
lda #%10101110
sta SPRITES,x
lda #%10101001
sta SPRITES+$40-2,x
lda #%10100110
sta SPRITES+$40-1,x
lda #%01010101
sta SPRITES+$40,x
inx
inx
inx
cpx #65
bne SpritesLoop2


burada x'in değerine göre modifiye etmiş durumdayım kodu. bu parçayı yerleştirdiğim yerde x'in değeri 2 idi, ona göre adres ve compare değerlerini değiştirmişim.

bu hiç de kısa bir kod sayılmaz 37 byte kaplıyor. ancak bu kod 2 sprite datası oluşturuyor, yani 128 byte. eğer kullanacağın sprite'da simetri v.b. özellikler varsa bu tür bir yol da deneyebilirsin. örneğin bir C harfi ya da Commodore'un amblemi tam olarak mirrorlanmıştır ortadan. bir lda iki sta şeklinde oluşturabilirsin. bilmiyorum senin efektte kullanacağın sprite'a uygulanabilir mi ancak yine de aklında bulunsun.

stranger
1st October 2009, 11:25
Cruzer ile rekabete girdiğiniz intro serileri :)