Gönderen Konu: sprite trick  (Okunma sayısı 14197 defa)

sprite trick

« : 30.09.2009 17:51:34 »
Hızlı düğmeleri aç

stranger

İleti: 241

Çevrimdışı
  • ***
  • Full Member
    • Profili Görüntüle
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.
« Son Düzenleme: 30.09.2009 17:53:53 Gönderen: stranger »

sprite trick

« Yanıtla #1 : 30.09.2009 18:23:36 »
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/
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.

sprite trick

« Yanıtla #2 : 30.09.2009 22:24:53 »
Hızlı düğmeleri aç

stranger

İleti: 241

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

sprite trick

« Yanıtla #3 : 01.10.2009 02:19:13 »
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/
çok muhteşem olmasa da benim 256b twister'dan bir örnek sana.
 
Kod: [Seç]
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.

sprite trick

« Yanıtla #4 : 01.10.2009 11:25:57 »
Hızlı düğmeleri aç

stranger

İleti: 241

Çevrimdışı
  • ***
  • Full Member
    • Profili Görüntüle
Cruzer ile rekabete girdiğiniz intro serileri :)

sprite trick

« Yanıtla #5 : 24.11.2010 23:42:02 »
Hızlı düğmeleri aç

madhead

İleti: 39

Çevrimdışı
  • *
  • Newbie
    • Profili Görüntüle
konu bir seneyi geçmiş, stranger'ın da artık ihtiyacı kalmamıştır ama can sıkıntısına konuları kurcalarken görünce yazıyım dedim.

benim de şu yöntem aklıma geldi. sprite'ın 15 satırı görüntülendikten sonra 16.satıra denk gelen raster satırında x pozisyonunu ekran dışında biryere alarak buradan aşağısının görünmemesini de sağlayabiliriz. hatırladığım kadarıyla sprite gösterilmeye başladıktan sonra normal koşullarda y pozisyonunu değiştiremiyorduk ama x pozisyonunu her raster satırında değiştirebiliyorduk. tabi nereye gitti bu sprite diye şaşırmamak için sprite'ın gösterimi bittikten sonra x pozisyonunu eski yerine restore da etmemiz lazım.

sprite trick

« Yanıtla #6 : 25.11.2010 01:07:09 »
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/
@madhead: formunu kaybetmemişsin kardeşim ;) tabii stranger burada sprite datalarını $40'lık blokların ortasından bir yerden başlatmak istiyordu. yani dediğinin tersi, ilk birkaç satırda sprite koordinatını 0 tutup, bir yerden sonra ekranın içine alarak dediğin yöntem aynen kullanılabilir. ben de aynı mantığı sprite rengini zemin rengine eşitleyerek tavsiye etmiştim. senin dediğin yöntem spritelar X'de expanded olmadıkça gayet işe yarar. hatta ekranın ortalarında ise 9. bit ($d010) ile de expanded olsa da ekran dışına çıkarılabilir. ben expanded spritelarla bir kere bu işi $d010 kullanarak çözmüştüm mesela. yalnızca X koordinatını sıfırladın mı sprite'ın yarısı kabak gibi ekranın içinde kalıyor :)

sprite trick

« Yanıtla #7 : 25.11.2010 18:59:25 »
Hızlı düğmeleri aç

endo

İleti: 687

Çevrimdışı
  • Administrator
  • *****
  • Hero Member
    • Profili Görüntüle
    • http://www.moldibi.com
Madem konu tekrar açılmış ben de ufak bir hatırlatma yapayım:
Normalde basic kodun bittiği yerden itibaren 3 byte 0 olur. Bu nedenle genelde sys 2061 ile başlar kodlar.
Ama aslında aşağıdaki gibi 00 A0 00 da aynı işi görür.

Yani hem LDY #$00 yapmış oluruz hem de LIST dediğimizde bozuk bir liste çıkmaz. Bu şekilde başlangıçtan 2 byte kazanmış ve Y'i (X de olur tabii, A0 yerine A2 ile) 0 yapmış oluruz.

Kod: [Seç]
.> 0801   0B 08      ANC #$08
.> 0803   00         BRK
.> 0804   00         BRK
.> 0805   9E 32 30   SHX $3032,Y
.> 0808   35 39      AND $39,X
.> 080a   00         BRK
.> 080b   A0 00      LDY #$00
.> 080d   8C 20 D0   STY $D020
.> 0810   60         RTS

LIST
0 SYS2059


Not: Action Replay'in monitöründe SHX, ANC gibi illegal op kodlar görünmeyeceğinden liste aşağıdaki gibi görünecektir:

Kod: [Seç]
.> 0801   0B         ???
.> 0802   08         PHP
.> 0803   00         BRK
.> 0804   00         BRK
.> 0805   9E         ???
.> 0806   32         ???
.> 0807   30 35      BMI $083E
.> 0809   39 00 A0   AND $A000,Y
.> 080C   00         BRK
.> 080C   8C 20 D0   STY $D020
.> 080C   60         RTS
- endo of glance -

sprite trick

« Yanıtla #8 : 26.11.2010 10:59:46 »
Hızlı düğmeleri aç

stranger

İleti: 241

Çevrimdışı
  • ***
  • Full Member
    • Profili Görüntüle
Madhead 1 sene de geçse böyle bir trick'e her zaman ihtiyaç olabilir :) Gerçi 256 byte intro'yu bitirip release ettim.
 
http://noname.c64.org/csdb/release/?id=85585
 
Fakat sprite kullanmak 256 byte introda yer bakımından çok kastırıcı... 1 sprite datası zaten 63-64 byte'ı götürüyor bunun setup'ı göstermesi derken hafıza doluyor :) biliyorsun. Ben çift sprite ve sprite animasyon kullanmak istemiştim.
 
Yer konusunda sıkıntı olunca ve bu yazdığım problemi çözemeyince şöyle bir yöntem aklıma geldi.
 
Sadece 1 sprite datası hafızada tutuyorum. Animasyonun 2. frame'ini data olarak hafızada tutmaktansa kod ile ilk frame'in datası üzerinde değişiklik yaparak oluşturuyorum. Sonra aynı değişiklik 2. frame'i 1. frame'e çeviriyor. Tabii grafiğinde buna uygun çizilmesi gerekiyordu falan...
 
Yani:
$2000 'de sprite datası olduğu düşünülürse..
 
spranim:
lda ($fe,x)
eor #%11111000
sta ($fe,x)
lda $2001
eor #%00110000
sta $2001
lda $2002
eor #%01111100
sta $2002
 
gibi...