Merhaba, Ziyaretçi. Lütfen giriş yapın veya üye olun.

Kullanıcı adınızı, parolanızı ve aktif kalma süresini giriniz

  Gelişmiş Arama
insanın içinde varsa, commodore.gen.tr açığa çıkarır bunu.. bir nevi retro olaylarının dolunayıyız.(Arda)
Sayfa: [1]   Aşağı git
Yazdır
Gönderen Konu: Raster color bar efekti  (Okunma Sayısı 9591 defa)
0 Üye ve 1 Ziyaretçi konuyu incelemekte.
wizofwor
Genel Yönetici
*****
Mesaj Sayısı: 4.792


Gosub ile gidilen yerden goto ile dönen adam


Üyelik Bilgileri WWW
« : Kasım 18, 2014, 11:54:57 ÖÖ »

Basit bir efekt kodlamaya çalıştım. Tam başarılı olamasam da çalışan bir şeyler ortaya çıktı. Ekteki program 11 raster satırından oluşan bir barı ekran boyunca hareket ettiriyor. PRG dosyasını aşağıdan alabilirsiniz.



Kullandığım sinus tablosunu Excel'de hazırladım. Bunun daha coder usulü yöntemine ihtiyacım var.

Raster barların sonundaki titreme için gecikme tablosunu beceremedim. 11 bar ve 256 ayrı başlangıç değerim var 256x11 = 2816 ayrı gecikme değeri mi hesaplamam lazım? Bu iş daha pratik nasıl halledilir?

Kodları github sayfamdan inceleyebilirsiniz.

https://github.com/wizofwor/C64-assembly-examples/blob/master/color-bar/color-bar.asm


 

* color_bar.prg (46.31 KB - Yükleme: 569 kez.)

* color bar.png (2.48 KB, 384x272 - Görüntüleme: 4231 kez.)
« Son Düzenleme: Kasım 18, 2014, 13:09:32 ÖS Gönderen: wizofwor » Logged

Simon (Özay Turay)
Yönetici
*****
Mesaj Sayısı: 7.757


Commodore Forever


Üyelik Bilgileri WWW
« Yanıtla #1 : Kasım 18, 2014, 11:59:27 ÖÖ »

Güzel olmuş.

Zamanlama sorunu bad line denilen satırlardan kaynaklanıyor sanırım.

Sinüs tablosu için The Gang'in Sinus Creator utility'sini kullanabilirsin.

http://www.thegang.nu/releases.php?type=4&year=all&headline=Utils&nomenu=1
« Son Düzenleme: Kasım 18, 2014, 12:02:01 ÖS Gönderen: Simon (Özay Turay) » Logged

https://retrodergi.com - https://e-turay.com - https://karizmawow.e-turay.com

Retro: Commodore 64, Amiga 500, Amiga 1200
Retromsu: Wii, XBox360, XBox, PS3 Slim, PS2 FAT, PS1, PS Vita, Nintendo 3DS, Nintendo 2DS
wizofwor
Genel Yönetici
*****
Mesaj Sayısı: 4.792


Gosub ile gidilen yerden goto ile dönen adam


Üyelik Bilgileri WWW
« Yanıtla #2 : Kasım 18, 2014, 13:21:59 ÖS »

Şöyle bir durum var. Zamanlamayı çok hassas yapmadığım için 3 cycle'lık bir hata var. Bu ekranda titremeye sebep oluyor.

28. satırdan başlayan kısımda 8'den geri saydırarak zaman harcıyorum ki bu titreme ekranın görünmeyen kısmına denk gelsin. Ama bad line olduğunda bu gecikme fazla geliyor. Titreme görünür oluyor. Bunun çözümü gecikme tablosu kullanmak.

delayTable !by 8,8,8,6,8,8,8

gibi gecikme değerlerini bir tablo halinde yazıp, döngünün sonunda bu değer kadar geri sayarak "stable" bir raster bar efekti yaratabiliyorum.

Efekti hep aynı satırdan başlattığımda olay bu şekilde gerçekleşiyor. Ama efektin başlangıç satırını sinüs tablosuna göre değiştirdiğimde, bad line her seferinde başka satıra denk geliyor. İşte orada patlıyorum.  
Logged

joker_
Deneyimli
*****
Mesaj Sayısı: 2.120



Üyelik Bilgileri
« Yanıtla #3 : Kasım 18, 2014, 13:30:08 ÖS »

Her satırda $d012 ile tarama yakalatarak, cpu'nun bütün cycle'ını harcarsın kardeşim. Geriye başka bir şey yapmana zamanın kalmaz

raster   lda rasterStart,x   ;Grab new rasterline value
   cmp $D012      ;from the table and wait
        bne raster+3   ;for raster the line

Rasterların titremesi, simon'un da bahsettiği gibi, badline satırlarına denk gelmesinden kaynaklanıyor. Bunu aşmanın yöntemi,

   ldy #10      ;Loose time to hide the
idle1   dey      ;flickering at the beginning
   bne idle1

Buradaki ldy değerini sabit bir sayı vermek yerine, tablodan okutmaktır.

   ldy delay_table,x
idle1   dey
   bne idle1      

gibi. Fakat yine bu yöntem de işe yaramayabilir, çünkü $d012 değerini, her seferinde tablodan okutup, efektin başlama satırını belirliyorsun. Bunun yerine

irq içerisinde,
      ldx #0
-      lda color_table,x
      sta $d020
      sta $d021

      ldy delay_table,x
      dey
      bne *-1

      inx
      cpx #11
      bne -

gibi bir rutin kullanarak, irq dışında ise color_table'ın içini renklerle doldurarak, hiç $d012'ye bulaşmadan bu işi yapabilirsin.

Bu konuda, nightlord sensei nin, vic kursunda anlattığı

http://nightnetwork.org/writings_tr/c64_grafik_programlama/chunk/ch03s01.html

eseri işini görecektir.
« Son Düzenleme: Kasım 18, 2014, 13:35:47 ÖS Gönderen: joker_ » Logged
joker_
Deneyimli
*****
Mesaj Sayısı: 2.120



Üyelik Bilgileri
« Yanıtla #4 : Kasım 18, 2014, 13:30:44 ÖS »

Ben mesajı yazarken, sen zaten cevabı yazmışsın
Logged
Simon (Özay Turay)
Yönetici
*****
Mesaj Sayısı: 7.757


Commodore Forever


Üyelik Bilgileri WWW
« Yanıtla #5 : Kasım 18, 2014, 13:58:17 ÖS »

@_joker:  Cevabı (daha doğrusu çözümü) sen yazmışsın yahu, ben birşey mi kaçırdım.
Logged

https://retrodergi.com - https://e-turay.com - https://karizmawow.e-turay.com

Retro: Commodore 64, Amiga 500, Amiga 1200
Retromsu: Wii, XBox360, XBox, PS3 Slim, PS2 FAT, PS1, PS Vita, Nintendo 3DS, Nintendo 2DS
wizofwor
Genel Yönetici
*****
Mesaj Sayısı: 4.792


Gosub ile gidilen yerden goto ile dönen adam


Üyelik Bilgileri WWW
« Yanıtla #6 : Kasım 18, 2014, 13:59:41 ÖS »

Gecikme değerini tablodan okutmam gerektiğini biliyorum ama başlangıç satırına göre farklı değer çekmesi lazım onu yapamadım. Ekte aynı rutinin iki farklı versiyonu var.

color_bar01.prg'de efekt yerinde duruyor. Her şey kontrol altında

https://github.com/wizofwor/C64-assembly-examples/blob/master/color-bar/color-bar-01.asm

color_bar02.prg'de efekti sinüse bağlıyorum ve titreme başlıyor.

https://github.com/wizofwor/C64-assembly-examples/blob/master/color-bar/color-bar-02.asm

Şimdi fazla uğraşamıyorum. Akşama tekrar başına oturacağız artık.

* color_bar01.prg (46.07 KB - Yükleme: 637 kez.)
* color_bar02.prg (46.32 KB - Yükleme: 623 kez.)
Logged

wizofwor
Genel Yönetici
*****
Mesaj Sayısı: 4.792


Gosub ile gidilen yerden goto ile dönen adam


Üyelik Bilgileri WWW
« Yanıtla #7 : Kasım 18, 2014, 14:05:01 ÖS »

Her satırda $d012 ile tarama yakalatarak, cpu'nun bütün cycle'ını harcarsın kardeşim. Geriye başka bir şey yapmana zamanın kalmaz

Farkındayım. Önerdiğin konudaki çalışmayı IRQ tabanlı hazırlıyorum ama burda IRQ kullanmak istemedim. IRQ tabanlı olunca satır kaçırdığımda bütün ekran bir birine giriyor. Bu şekilde çalışmak deneme yanılma açısından daha pratik geldi.
Logged

joker_
Deneyimli
*****
Mesaj Sayısı: 2.120



Üyelik Bilgileri
« Yanıtla #8 : Kasım 18, 2014, 14:06:00 ÖS »

@_joker:  Cevabı (daha doğrusu çözümü) sen yazmışsın yahu, ben birşey mi kaçırdım.

Ben yazarken, wizofwor titremenin nedenini yazmış, onu kasdetmiştim


 
Logged
joker_
Deneyimli
*****
Mesaj Sayısı: 2.120



Üyelik Bilgileri
« Yanıtla #9 : Kasım 18, 2014, 14:06:56 ÖS »

Her satırda $d012 ile tarama yakalatarak, cpu'nun bütün cycle'ını harcarsın kardeşim. Geriye başka bir şey yapmana zamanın kalmaz

Farkındayım. Önerdiğin konudaki çalışmayı IRQ tabanlı hazırlıyorum ama burda IRQ kullanmak istemedim. IRQ tabanlı olunca satır kaçırdığımda bütün ekran bir birine giriyor. Bu şekilde çalışmak deneme yanılma açısından daha pratik geldi.

Haklısın, bu şekilde daha iyi kavrayabiliyorsun.
Logged
witchdoktor
Uzman
*****
Mesaj Sayısı: 6.238



Üyelik Bilgileri
« Yanıtla #10 : Kasım 18, 2014, 14:23:19 ÖS »

@wizofwor

En mantıklısı joker'in bahsettiği metod, yani tüm rasterline'lara bir tablo ile renk tahsis etmek. Daha sonra tablonun istediğin satırlarındaki renkleri değiştirerek kaydırma vb efektler elde edebilirsin, badline zamanlaması ile de uğraşmamış olursun.
Logged
Sayfa: [1]   Yukarı git
Yazdır
Gitmek istediğiniz yer: