commodore.gen.tr

Commodore => Commodore Yazılım => Konuyu başlatan: wizofwor üzerinde Kasım 25, 2014, 18:08:01 ÖS



Konu Başlığı: Color Wash / Renk Geçişi Efekti
Gönderen: wizofwor üzerinde Kasım 25, 2014, 18:08:01 ÖS
Öğrendiğim efektleri açıklamaya devam ediyorum. Bu seferki efekt çok sık kullanılan, introların olmazsa olmazlarından biri, renk geçişi efekti. Kodum çalıştığında aşağıdaki bir ekranım olacak.

(http://www.commodore.gen.tr/forum/index.php?action=dlattach;topic=9359.0;attach=8375;image)


Konu Başlığı: Ynt: Color Wash / Renk Geçişi Efekti
Gönderen: wizofwor üzerinde Kasım 25, 2014, 18:17:31 ÖS
İlk olarak ortalığı toparlamak için sık kullandığım rutinleri ayrı bir dosyaya kopyalıyorum. Böylece hem kodum daha sade görünecek. Hem de sürekli eski dosyalardan kopyala/yapıştır uğraşmaktan kurtulacağım.

Boş bir dosya açıp sık kullandığım Basic başlangıcı ve ekran temizleme rutinlerini buraya kopyalıyorum ve macro olarak tanımlıyorum. Daha sonra ana dosyamda bu makroları çağıracağım ve derleyici gerekli kodları benim yerime yazacak.

Kod:
; standart.asm
; macros for standart codes
;============================================================================

!macro BASIC_START {
* = $0801                               ; BASIC start address (#2049)
!byte $0d,$08,$dc,$07,$9e,$20,$34,$39   ; BASIC loader to start at $c000...
!byte $31,$35,$32,$00,$00,$00           ; puts BASIC line 2012 SYS 49152
}

!macro CLEAR_SCREEN {
ldx #00
lda #$20
.loop sta SCREEN_RAM,x
sta SCREEN_RAM+255,x
sta SCREEN_RAM+510,x
sta SCREEN_RAM+765,x
sta SCREEN_RAM+1020,x
dex
bne .loop
}


Konu Başlığı: Ynt: Color Wash / Renk Geçişi Efekti
Gönderen: wizofwor üzerinde Kasım 25, 2014, 18:25:46 ÖS
İkinci bir dosya ana programı yazmaya başlıyorum.

Kod:
!to "build/colorwash.prg",cbm
!src "standart.asm"

;----------------------------------------
;CONSTANTS
;----------------------------------------

SCREEN_RAM = $0400
COLOR_RAM = $d800
EFFECT_COUNTER = $02

+BASIC_START

İlk önce standart.asm dosyasını çağırmam lazım ki kaydettiğim makrolarımı kullanabileyim. Bunu '!src' komutuyla yapıyoruz.

Peşinden sık kullandığım bellek adreslerini tanımlıyorum. Bu kodda ekran ve renk belleğini kullanacağım. Bir de sayaç olarak kullandığım zero page adresi var.

Basic hafızasına SYS 49152 yazacak kodu makro olarak kaydetmiştim. Bu makroyu'da +BASIC_START komutuyla çağırdıktan sonra ana programa başlamaya hazırım.


Konu Başlığı: Ynt: Color Wash / Renk Geçişi Efekti
Gönderen: wizofwor üzerinde Kasım 25, 2014, 18:32:50 ÖS
Kod:
	* = $c000

+CLEAR_SCREEN

;Metnimizi ekrana yerleştirelim

ldx #00
- lda metin,x
sta SCREEN_RAM+40*5,x
inx
cpx #120
bne -
Kod:
	;-----------------------------------------
; DATA
;-----------------------------------------

metin
!scr "          + ++ hi there! ++ +           "
!scr "   ---------------------------------    "
!scr "   this is a smiple colorwash effect    "

Derleyiciye başlangıç adresini verdikten sonra ikinci makromu kullanarak ekranı temizliyorum. Ve metnimi yazıyorum. Burdaki döngü rutini 3x40=120 karakterlik metni tablodan okuyup ekran belleğine yazıyor. Ekran belleği adresini SCREEN_RAM+40*5 şeklinde yazıyorum ki daha sonra okuduğumda kodun 5. satıra yazdığını bir bakışta anlayayım. Hesap makinesiyle uğraşmayayım.


Konu Başlığı: Ynt: Color Wash / Renk Geçişi Efekti
Gönderen: wizofwor üzerinde Kasım 25, 2014, 18:48:04 ÖS
Şimdi geldik programın can alıcı kısmına.

Kod:
	;Efect sayacını maksimum değere getirelim
lda #40
sta EFFECT_COUNTER

;Ekran tazelenene kadar bekleyelim
;1/50 saniye

cwash lda #00
- cmp $d012
bne -

;Renk geçişi efekti iki index yazmacını
;birlikte kullanıyor. Y okunacak rengi
;X yazılacak adresi indexliyor

ldy EFFECT_COUNTER
ldx #00
- lda renkler,y
sta COLOR_RAM+40*5,x
inx
sta COLOR_RAM+40*6,x
inx
sta COLOR_RAM+40*7,x
iny
dex
cpx #40
bne -

dec EFFECT_COUNTER

lda #00
cmp EFFECT_COUNTER
bne cwash

lda #40
sta EFFECT_COUNTER

jmp cwash
Kod:
renkler
!by  14,14,14,14,14,14,14,14,14,14
!by  14,14,14,14,14,14,14,15,01,07
!by  01,07,15,14,14,14,14,14,14,14
!by  14,14,14,14,14,14,14,14,14,14

!by  14,14,14,14,14,14,14,14,14,14
!by  14,14,14,14,14,14,14,15,01,07
!by  01,07,15,14,14,14,14,14,14,14
!by  14,14,14,14,14,14,14,14,14,14

Renk geçişi efekti için 40 değerlik bir veri tablosu hazırladım ve Joker_'den öğrendiğim taktikle bu tabloyu iki kez kopyaladım. Toplam 80 değerlik bir tablom oldu.

Bir kereye mahsus olmak üzere efekt sayacımı 40 değerini yükleyip raster satırının ekranın başına gelmesini bekliyorum. (Eğer beklemeseydim efekt çok hızlı akacaktı.)
PAL tarama hızı 50Hz olduğuna göre 0,02sn beklemiş olacağım.

Renk geçişi efekti için kullandığım rutin X ve Y indexlerini aynı anda kullanıyor. Y'de efekt sayacım var. X ise 0'dan 39'a kadar sayacak. STA komutlarının indexi X yani her seferinde 0-39'a kadar bütün karakterlerin rengini değiştiriyorum. Rengi okuduğum LDA komutunun indexi ise Y. Y sıfırdan değil, INDEX_COUNTER'dan saymaya başlıyor. Bu seyade INDEX_COUNTER değerini bir azalttıkça tablodan okuduğum değeri de birer byte kaydırmış oluyorum.

X indexinin 40'lık döngüsü bittiğinde üç satırda boyanmış oluyor. Sürekli olarak INDEX_COUNTER'ı arttırıp cwash etiketine atladığımda, her seferinde farklı renkler yüklenerek renk geçişi etkisi yaratılmış oluyor.


Konu Başlığı: Ynt: Color Wash / Renk Geçişi Efekti
Gönderen: wizofwor üzerinde Kasım 25, 2014, 18:51:21 ÖS
Programın tam dökümü aşağıda.

Kod:
!to "build/colorwash.prg",cbm
!src "standart.asm"

;----------------------------------------
;CONSTANTS
;----------------------------------------

SCREEN_RAM = $0400
COLOR_RAM = $d800
EFFECT_COUNTER = $02

+BASIC_START

;-----------------------------------------
; MAIN
;-----------------------------------------

* = $c000

+CLEAR_SCREEN

;Metnimizi ekrana yerleştirelim

ldx #00
- lda metin,x
sta SCREEN_RAM+40*5,x
inx
cpx #120
bne -

;Efect sayacını maksimum değere getirelim
lda #40
sta EFFECT_COUNTER

;Ekran tazelenene kadar bekleyelim
;1/50 saniye

cwash lda #00
- cmp $d012
bne -

;Renk geçişi efekti iki index yazmacını
;birlikte kullanıyor. Y okunacak rengi
;X yazılacak adresi indexliyor

ldy EFFECT_COUNTER
ldx #00
- lda renkler,y
sta COLOR_RAM+40*5,x
inx
sta COLOR_RAM+40*6,x
inx
sta COLOR_RAM+40*7,x
iny
dex
cpx #40
bne -

dec EFFECT_COUNTER

lda #00
cmp EFFECT_COUNTER
bne cwash

lda #40
sta EFFECT_COUNTER

jmp cwash

;-----------------------------------------
; DATA
;-----------------------------------------

metin
!scr "          + ++ hi there! ++ +           "
!scr "   ---------------------------------    "
!scr "   this is a smiple colorwash effect    "

renkler
!by  14,14,14,14,14,14,14,14,14,14
!by  14,14,14,14,14,14,14,15,01,07
!by  01,07,15,14,14,14,14,14,14,14
!by  14,14,14,14,14,14,14,14,14,14

!by  14,14,14,14,14,14,14,14,14,14
!by  14,14,14,14,14,14,14,15,01,07
!by  01,07,15,14,14,14,14,14,14,14
!by  14,14,14,14,14,14,14,14,14,14


Konu Başlığı: Ynt: Color Wash / Renk Geçişi Efekti
Gönderen: Simon (Özay Turay) üzerinde Kasım 25, 2014, 19:24:15 ÖS
Çok güzel ve sade bir dille anlatmışsın. Beni gaza getiriyorsun haberin ola. :)


Konu Başlığı: Ynt: Color Wash / Renk Geçişi Efekti
Gönderen: witchdoktor üzerinde Kasım 25, 2014, 20:22:50 ÖS
Eline sağlık wizofwor. İşin temelinden başlayıp ufak adımlarla ilerleyen bir 'tutorial' haline dönüştürüyorsun.


Konu Başlığı: Ynt: Color Wash / Renk Geçişi Efekti
Gönderen: joker_ üzerinde Kasım 25, 2014, 20:37:26 ÖS
Kardeşim çok güzel olmuş. Eline sağlık, partide intro bekliyorum senden. :)