commodore.gen.tr

Commodore => Commodore Yazılım => Konuyu başlatan: joker_ üzerinde Temmuz 05, 2017, 15:13:04 ÖS



Konu Başlığı: c64 intro efektleri (ters yazı)
Gönderen: joker_ üzerinde Temmuz 05, 2017, 15:13:04 ÖS
Selam arkadaşlar;

c64 intro efektlerine devam ediyoruz. Hatırlarsanız daha önce smooth scroll, logo basma,müzik çaldırma, sprite gösterme gibi temel konuları anlatmıştık.

Şimdi biraz daha ileri gidip, scroll'u terse çevirme ve 1X2 yapıp, içiçe birden fazla irq kullanmayı göreceğiz.

Aslında, c64 karakter setini baş aşağı çevirmeyi, assembler üstadımız hades daha önce çıkardığı, c64 Türkiye dergisinin 5.ci sayısında (http://www.retrodergi.com/issue.php?

file=./Dergiler/C64%20Turkiye/.C64%20Turkiye%20-%20Sayi%2005%20(Temmuz

%202004)/index.html&title=C64%20T%C3%BCrkiye%20-%20Say%C4%B1%205%20(Temmuz%202004)) detaylı olarak anlatmıştı. c64 assembler öğrenmeme vesile olan bu dergiler de, hades'in çok detaylı assembler tutorial larını bulabilirsiniz. ;)

Bu vesile ile böyle kaliteli dergileri hazırladığı için, hades'e tekrar teşekkür etmek istiyorum ;)

Daha önce detaylı olarak açıkladığımdan, bu yazı da code'larımızı derlemek için gerekli araçları açıklamayacağım. İlgili konuya buradan  (http://www.commodore.gen.tr/forum/index.php?topic=7510.0) ulaşabilirsiniz ;)

Artık başlayalım.
 
İlk olarak boş bir notepad dosyası açıp programımızın adını, başlangıç adresini yazıp, yazı rengini beyaz yapıp kodumuzu derliyoruz. Ben program ismine ters yazi dedim. Siz istediğinizi yazabilirsiniz.

Kod:
!to"ters_yazi.prg",cbm

* = $0801
!byte $0b, $08, $00, $00, $9e, $32, $30, $36, $31, $00, $00, $00
 
* = $080d

lda #$01
sta $0286

rts

Programımız derledikten sonra, şu şekilde bir ekran gelmesi lazım.

(https://i.hizliresim.com/aGLJmQ.png)

Yani boş bir ekran :D


Konu Başlığı: Ynt: c64 intro efektleri (ters yazı)
Gönderen: joker_ üzerinde Temmuz 05, 2017, 15:16:25 ÖS
Karakter setimizi değiştirerek devam edelim. Buradan  (http://kofler.dot.at/c64/font_01.html)1x1 olacak şekilde karakter seti seçebilirsiniz ;) Çünkü konumuz 1x1 karakter setini 1x2 yapmak. Ben craze_cool.64c karakter setini seçtim ;)

Şimdi kodumuza ekleyelim.

Not: Mesaj, scroll satırı, sinüs  vb.. şeyleri, programınızın başında tanımlamanız hem ileride olası bir satır, adres değişikliğinde işinizi kolaylaştırır hemde hafıza düzenine hakim olmanızı sağlar.

Özellikle dentro, demo gibi çok partlı ürünlerde hafıza daki her bir byte o kadar değerli oluyor ki bir süre sonra, ne neredeydi diye karışmaya başlıyor. Bu yüzden en başta düzgün bir şekilde gitmekte fayda var ;)

Önce karakter setimizin, hafızada nereye yükleneceğiniz tanımlıyoruz.

   karakter_set   = $2800   ;Karakter setimizin yükleneceği adresi tanımlıyoruz.

sonrada ilgili register'a gösterilecek karakter setinin yerini bildiriyoruz.

   lda #$1a   ;karakter seti adresini
   sta $d018   ;ilgili register'a bildiriyoruz.

kodumuzun en sonuna da, karakter setimizin nereden yükleneceğini yazıyoruz.

   * = karakter_set
   !bin "files\craze_cool.64c",,2

Kod:
!to"ters_yazi.prg",cbm

* = $0801
!byte $0b, $08, $00, $00, $9e, $32, $30, $36, $31, $00, $00, $00
 
karakter_set = $2800 ;Karakter setimizin yükleneceği adresi tanımlıyoruz.

* = $080d

lda #$01
sta $0286

lda #$1a ;karakter seti adresini
sta $d018 ;ilgili register'a bildiriyoruz.

rts
   
;Karakter setimizi tanımladığımız adrese yüklüyoruz.
 
* = karakter_set

!bin "files\craze_cool.64c",,2


sonuca bakalım ;)

(https://i.hizliresim.com/YND2mZ.png)

Evet. Ekranda yeni karakter setimizi gördük


Konu Başlığı: Ynt: c64 intro efektleri (ters yazı)
Gönderen: LW3D üzerinde Temmuz 05, 2017, 15:22:05 ÖS
Eline sağlık senin yazıları arşivlemek gerek....


Konu Başlığı: Ynt: c64 intro efektleri (ters yazı)
Gönderen: joker_ üzerinde Temmuz 05, 2017, 15:25:56 ÖS
Artık interrupt oluşturarak, efektlerimizi interrupt içinde yapmaya başlayabiliriz. Önce ekranı siliyoruz ve 1x1 smooth scroll yapıyoruz ;)

Mesajımızın duracağı adresi ve scroll yapacağımız satırı tanımlıyoruz.

   mesaj      = $5000   ; Ekran da görülecek olan mesajımızın hafıza da duracağı adresi tanımlıyoruz.

   mesaj_satiri   = $0400 + (5 * 40)   ;yazının ekranda kayacağı satır.

sonra da;

   jsr $e544

ile ekranımızı siliyoruz.

Ekranın kenar ve iç rengini siyah yapalım.

   lda #$00   ;siyah renk kodu
   sta $d021   ;iç ekran registeri
   sta $d020   ;dış ekran registeri

İnterrupt oluşturarak, karakter setimizin nerede durduğunu belirttiğimiz registeri buraya alıyor ve efektleri çağırıyoruz.   
   
   sei

   lda #$7f
   sta $dc0d

   lda #$01
   sta $d01a

   lda #$1b
   sta $d011

   lda #<irq
   sta $0314
   lda #>irq
   sta $0315

   cli
   jmp *

irq
   inc $d019

   lda #$1a   ;karakter seti adresini
   sta $d018   ;ilgili register'a bildiriyoruz.

   jsr kayan_yazi    ;scroll rutinine git.

   lda #$5a       ;yeni tarama ekranını bu satırda
   sta $d012      ;yakala   
   
   jmp $ea81

Scroll rutinimizi, yazıyoruz. Bunu daha önceki tutoriallerde detaylı açıkladığım için açıklamıyorum.

kayan_yazi
   lda d016_degeri
   sec
   sbc #1
   and #$07
   sta $d016
   sta d016_degeri

   beq +
   rts
+
   ldx #$00
-   lda mesaj_satiri + 1,x
   sta mesaj_satiri,x
   
   inx
   cpx #$28
   bne -

_lp   lda mesaj
   bne next

   lda #<mesaj
   sta _lp + 1
   lda #>mesaj
   sta _lp + 2
    rts
next
   sta mesaj_satiri + 39

   inc _lp + 1
   bne +
   inc _lp + 2      
+
   rts 

d016_degeri
   !by 0

Mesajımızı yazıyoruz.

   * = mesaj
   !scr "merhaba commodore.gen.tr yeni bir intro "
   !scr "efekti ile karsinizdayiz....            "

Kod:
!to"ters_yazi.prg",cbm

* = $0801
!byte $0b, $08, $00, $00, $9e, $32, $30, $36, $31, $00, $00, $00
 

mesaj_satiri = $0400 + (5 * 40) ;yazının ekranda kayacağı satır. 

karakter_set = $2800 ;Karakter setimizin yükleneceği adresi tanımlıyoruz.
 
mesaj = $5000 ;Ekran da görülecek olan mesajımızın hafıza da duracağı adresi tanımlıyoruz.


* = $080d

lda #$01
sta $0286

 
jsr $e544

lda #$00 ;siyah renk kodu
sta $d021 ;iç ekran registeri
sta $d020 ;dış ekran registeri

sei

lda #$7f
sta $dc0d

lda #$01
sta $d01a

lda #$1b
sta $d011

lda #<irq
sta $0314
lda #>irq
sta $0315

cli
jmp *

irq
inc $d019

lda #$1a ;karakter seti adresini
sta $d018 ;ilgili register'a bildiriyoruz.

jsr kayan_yazi ;scroll rutinine git.

lda #$5a    ;yeni tarama ekranını bu satırda
sta $d012    ;yakala

jmp $ea81

kayan_yazi
lda d016_degeri
sec
sbc #1
and #$07
sta $d016
sta d016_degeri

beq +
rts
+
ldx #$00
- lda mesaj_satiri + 1,x
sta mesaj_satiri,x

inx
cpx #$28
bne -

_lp lda mesaj
bne next

lda #<mesaj
sta _lp + 1
lda #>mesaj
sta _lp + 2
  rts
next
sta mesaj_satiri + 39

inc _lp + 1
bne +
inc _lp + 2
+
rts

d016_degeri
!by 0

;Mesajımızı daha önceden tanımladığımız, hafıza adresine yüklüyoruz.
* = mesaj
!scr "merhaba commodore.gen.tr yeni bir intro "
!scr "efekti ile karsinizdayiz....            "
     
;Karakter setimizi tanımladığımız adrese yüklüyoruz.
 
* = karakter_set

!bin "files\craze_cool.64c",,2
 
 

Veeee ekranda kayan yazımız beliriyor.. :D

(https://i.hizliresim.com/8dM0A7.png)


Konu Başlığı: Ynt: c64 intro efektleri (ters yazı)
Gönderen: joker_ üzerinde Temmuz 05, 2017, 15:30:12 ÖS
Sıra geldi, işin en can alıcı noktasına.

Şimdi yapacağımız işlem, c64 hafızasına daha önce yüklediğimiz karakter setimizdeki her bir karakterin son 4 byte'ını geçici olarak alıp, yeni karakter setimizi oluşturacağımız alana her pixeli iki kez basmak. Böylece 8 pixellik karakter alanımıza, bir karakterin sadece yarısını kopyalamış olacağız. ;)

Yani;

Bu bizim ilk karakter setimiz.

-*****--
**---**-
**---**-
******-
**---**-
**---**-
**---**-
---------

son 4 byte'ı alıp, en alttan başlayarak, ikişer pixel halinde kopyalıyoruz.

-------- --> karkaterin 8 nci byte'ı
-------- --> karkaterin 8 nci byte'ı
**---**- --> karkaterin 7 nci byte'ı
**---**- --> karkaterin 7 nci byte'ı
**---**- --> karkaterin 6 ncı byte'ı
**---**- --> karkaterin 6 ncı byte'ı
**---**- --> karkaterin 5 nci byte'ı
**---**- --> karkaterin 5 nci byte'ı


İşe yeni karakter setimizi koyacağımız alanı tanımlayarak başlıyoruz. Bu işlem için ben diğer karakter setimizin durduğu bankta ki başka bir adresi kullanıyorum. Farklı bank kullanıp arada sadece bank değiştirebilirdik. Kafa karışıklığı olmaması için şimdilik bu konuya girmiyorum ;)

Fakat bu konuda detaylı bilgi isteyenler, skate'in çok değerli bilgiler içeren tutorial (http://www.tr-demoscene.info/index.php/topic,736.0.html)'ini okuyabilir ;)


Konu Başlığı: Ynt: c64 intro efektleri (ters yazı)
Gönderen: joker_ üzerinde Temmuz 05, 2017, 15:33:06 ÖS
Ne diyorduk, yeni karakter setimizi koyacağımız alanı tanımlıyoruz. Ben $3800 adresini kullanıyorum.

   ters_karakter_set   = $3800 ;ters karakter setinin kopyalanacağı adres

Daha sonra, ilk karakter seti ve ters karakter setimizin, hi ve low byte'larını zero page de geçici bir yere koyuyoruz.

   lda #<karakter_set   
   sta $f0
   lda #>karakter_set
   sta $f1

   lda #<ters_karakter_set
   sta $f2
   lda #>ters_karakter_set
   sta $f3

ve ilk karakter setimizden, sırayla ilk 4 byte'lık datayı okuyup yeni adresimize ikişer byte halinde yazıyoruz.

   ;===ilk 4 byte data===
   
   ldx #$00
   ldy #$04   ; ilk 4 byt'ı geçip 5nci byte'dan başlıyoruz. Saymaya sıfır'dan başlıyoruz ;)
ilk_4   lda ($f0),y   ;ilk karakter setimizin ilk karakterinin son 4 byt'ını yığına atıyoruz.
   pha

   iny      ;sayacı 1 arttırıp
   cpy #$08   ;8 ile karşılaştırıyoruz.
   bne ilk_4

Burada ilk karakter setimizin, ilk karakterinin, son 4 byte'ını pha yığına attık. Şimdi bunları geri alıp yeni karakter setimizin ilk karakter bloğuna yazacağız.

Dikkat edeceğimiz nokta, yığına attığımız data'yı geri alırken her zaman fifo değil de lifo mantığı, son giren ilk çıkar mantığını unutmamamızdır ;)

 
    ldy #$00    
--    pla      ;yığına attığımız datadaki son byte alıp
-   sta ($f2),y   ;yeni karakter setimizin, ilk karakter bloğuna 

   iny      ;y register'ını 1 arttırıp
   cpy #$02   ;2 ile karşılaştırıyoruz.
   bne -
 
   lda $f2      ;yeni karakter setimizin low byte'ını tuttuğumuz
   clc      ;index'i
   adc #$02   ;2 arttırıyoruz.
   sta $f2      ;ve yerine yazıyoruz.

   bcc +      ;eğer yeni low byte 255 geçtiyse

   inc $f3      ;hi byte'ı arttırıyoruz.
+
   ldy #$00   ;yeniden kopyalamak için y register'ını sıfırlıyoruz.

   inc sayac   ;bir sayac oluşturup, her iki kopyalamada 1 kez arttırarak
   lda sayac   ;sayacamızın 4 olup olmadığını
   cmp #4       ;kontrol ediyoruz.
   bne --

   lda #$00   ;eğer sayacımız 4 olduysa
   sta sayac   ;yeni karakter bloğunu kopyalamak için sıfırlıyoruz.

   lda $f0      ;ilk karakter setimizin low byte'ına
   clc
   adc #$08   ;8 ekleyerek
   sta $f0      ;diğer karakter bloğunun başına gidiyoruz.

   bcc +

   inc $f1      ;eğer 255'i geçtiyse, ilk karakter setinin hi-byte'ını 1 arttırıyoruz.
+   
   inx      ;x register'ını 1 arttırarak
   cpx #64      ;toplamda 64 kez
   bne ilk_4   ;bu işlemleri tekrarlıyoruz.

Buraya kadar, ilk karakter setimizdeki karakterlerin, ikinci yarısını, yeni yerlerine her bir byte'ı iki kez yazarak kopyaladık.



Konu Başlığı: Ynt: c64 intro efektleri (ters yazı)
Gönderen: joker_ üzerinde Temmuz 05, 2017, 15:36:32 ÖS
Şimdi aynı işlemi ilk 4 byte için yapacağız. Artık elimizde hazır bir rutin olduğuna göre, işimiz biraz daha kolay sayılır. Sadece bir kaç yeri değiştirmemiz yetecektir.

;===ikinci 4 byte data===

   lda #<karakter_set   
   sta $f0
   lda #>karakter_set
   sta $f1

ilk karakter setimizin ilk 4 byte'ını kopyalamadan önce, karakter setinin hi ve low byte'larını başa alıyoruz.
   
   ldx #64
   ldy #$00   ;y register'ı sıfırdan başlayıp
son_4   lda ($f0),y
   pha      ;ilk 4 datayı yığına atıyor.

   iny
   cpy #$04
   bne son_4

sonra ilk bölümde 64 karakter için kopyaladığımızdan, yeni karakter setinde bu işleme 64 ncü karakterden başlayacağız.

Yani ilk karakter setinin, ilk karakterinin, ilk 4 byte'ını diğer karakter setinin 64ncü karakter bloğundan itibaren kopyalayacağız. Cümle biraz kafa karıştırıcı oldu, fakat en basit bu şekilde anlatabildim. :(

Bu sefer y register'ımız sıfırdan başlıyor. Ve ilk 4 datayı yığına kopyalıyoruz.
 
    ldy #$00
--    pla
-   sta ($f2),y

   iny
   cpy #$02
   bne -

Yine aynı mantık, son giren ilk çıkar.
 
   lda $f2   
   clc
   adc #$02
   sta $f2

   bcc +

   inc $f3

Yeni karakter setinin low byte'ını 2 arttırıp, 255'i geçtiyse hi-byte'ını arttırıyoruz.

   ldy #$00

Y register'ını sıfırlayıp,

   inc sayac
   lda sayac
   cmp #4
   bne --

sayacımızı kontrol ediyoruz,

   lda #$00
   sta sayac

eğer, kopyalama işlemi bittiyse sayacımızı sıfırlıyoruz.

   lda $f0
   clc
   adc #$08
   sta $f0

   bcc +

ilk karekter seti zero page low byte'ına 8 ekleyip,

   inc $f1

255'i geçtiyse hi-byte'ı arttırıyoruz.
   
   inx   
   cpx #128
   bne son_4

64ncü karakterden itibaren kopyalamıştık. 128'e kadar bu işlemi tekrarlıyoruz.

Kod:
!to"ters_yazi.prg",cbm

* = $0801
!byte $0b, $08, $00, $00, $9e, $32, $30, $36,$31, $00, $00, $00

mesaj_satiri = $0400 + (5 * 40) ;yazının ekranda kayacağı satır.

karakter_set = $2800 ;Karakter setimizin yükleneceği adresi tanımlıyoruz.

ters_karakter_set = $3800 ;ters karakter setinin kopyalanacağı adres

mesaj = $5000 ;Ekran da görülecek olan mesajımızın hafıza da duracağı adresi

tanımlıyoruz.


* = $080d

lda #$01
sta $0286

jsr $e544

lda #$00 ;siyah renk kodu
sta $d021 ;iç ekran registeri
sta $d020 ;dış ekran registeri

;====karakter setini kopyala

lda #<karakter_set
sta $f0
lda #>karakter_set
sta $f1

lda #<ters_karakter_set
sta $f2
lda #>ters_karakter_set
sta $f3

;===ilk 4 byte data===

ldx #$00
ldy #$04
ilk_4 lda ($f0),y
pha

iny
cpy #$08
bne ilk_4
 
  ldy #$00
-- pla
- sta ($f2),y

iny
cpy #$02
bne -
 
lda $f2
clc
adc #$02
sta $f2

bcc +

inc $f3
+
ldy #$00

inc sayac
lda sayac
cmp #4
bne --

lda #$00
sta sayac

lda $f0
clc
adc #$08
sta $f0

bcc +

inc $f1
+
inx
cpx #64
bne ilk_4

;===ikinci 4 byte data===

lda #<karakter_set
sta $f0
lda #>karakter_set
sta $f1

ldx #64
ldy #$00
son_4 lda ($f0),y
pha

iny
cpy #$04
bne son_4
 
  ldy #$00
-- pla
- sta ($f2),y

iny
cpy #$02
bne -
 
lda $f2
clc
adc #$02
sta $f2

bcc +

inc $f3
+
ldy #$00

inc sayac
lda sayac
cmp #4
bne --

lda #$00
sta sayac

lda $f0
clc
adc #$08
sta $f0

bcc +

inc $f1
+
inx
cpx #128
bne son_4

;=====kopyalama rutini sonu

sei

lda #$7f
sta $dc0d

lda #$01
sta $d01a

lda #$1b
sta $d011

lda #<irq
sta $0314
lda #>irq
sta $0315

cli
jmp *

irq
inc $d019

lda #$1a ;karakter seti adresiniz
sta $d018 ;ilgili register'a bildiriyoruz.
 
jsr kayan_yazi

lda #$5a
sta $d012

jmp $ea81

kayan_yazi
lda d016_degeri
sec
sbc #1
and #$07
sta $d016
sta d016_degeri

beq +
rts
+
ldx #$00
- lda mesaj_satiri + 1,x
sta mesaj_satiri,x

inx
cpx #$28
bne -

_lp lda mesaj
bne next

lda #<mesaj
sta _lp + 1
lda #>mesaj
sta _lp + 2
  rts
next
sta mesaj_satiri + 39

inc _lp + 1
bne +
inc _lp + 2
+
rts

d016_degeri
!by 0

sayac
!by 0

;Mesajımızı daha önceden tanımladığımız, hafıza adresine yüklüyoruz.
* = mesaj
!scr "merhaba commodore.gen.tr yeni bir intro "
!scr "efekti ile karsinizdayiz....            "

     
;Karakter setimizi tanımladığımız adrese yüklüyoruz.
 
* = karakter_set

!bin "files\craze_cool.64c",,2

Buraya kadar yaptıklarımız doğruysa, programımızı derleyip, çalıştırdığımızda ekranda yine 1x1 smooth scroll göreceğiz. Yani herhangi bir değişiklik olmayacak. Programımız arka planda, hafızanın $3800 adresine, yeni karakter setimizi üretecek. Biz henüz o adresdeki karakter setini kullanmadığımızdan görmüyoruz.


Konu Başlığı: Ynt: c64 intro efektleri (ters yazı)
Gönderen: joker_ üzerinde Temmuz 05, 2017, 15:42:27 ÖS
Peki, acaba programımız doğru çalıştı mı? Yani $3800 adresine yeni karakter setimizi düzgün bir şekilde oluşturdu mu?

Bunu öğrenebilmek için farklı metodlar var tabii. En basiti karakter setimizi göreten ilgili register'a yeni karakter setinin yerini yazabiliriz ;)

Yani;

   lda #$1a
   sta $d018

olan adresi,

   lda #$1e
   sta $d018

olarak değiştirerek;

(https://i.hizliresim.com/qWb2Mq.png)

sonuca bakabiliriz. Gördüğünüz gibi ekranda yarım karakterler görünüyor.

Veya;

Vice'da önce Action Replay6 kartuş image'ı yüklüyorum.

(https://i.hizliresim.com/Mv0lp9.png)

Sonra programımı atıp, F3 ile çalıştırıyorum. Alt+R ile resetleyip, sırayla F7 ve F8'e basıp monitör programını çalıştırıyorum.

(https://i.hizliresim.com/r23mr3.png)

s"dosya adı",8,3800,4000 komutu ile, hafızanın $3800 ve $4000 arasındaki datayı kaydediyorum.

Bu dosyanın ilk 2 byte'ı hafıza adresini tuttuğundan, karakter seti programı ile açtığımızda muhtmelen karakterlerimiz 2 pixel yukarı kaymış görülecektir.

(https://i.hizliresim.com/Q7agBg.png)

Bu yüzden herhangi bir Hex Editör (http://www.chmaas.handshake.de/delphi/freeware/xvi32/xvi32.htm#download) ile ilk 2 byte'ı, yani 00 38'i uçuruyoruz.

Sonra da yeni dosyamızı kaydedip,

(https://i.hizliresim.com/XX0YkD.png)

Karakter Seti (http://scrapdog.freeservers.com/cunei.html) programı ile File/import diyerek

bu dosyayı yüklüyoruz.

Tam olarak anlaşılabilmesi için, 1x1 ve yeni ürettiğimiz karakter setimizin görüntüsünü üst üste koydum. Bu şekilde daha iyi anlaşılacaktır ;)
 
(https://i.hizliresim.com/AkLY7q.png)

Dikkat ederseniz, alt 4 byte data yukarıda, üst 4 byte data'da onun 64 karakter ilerisinde.

Programımız doğru çıktıyı vermiş ;)


Konu Başlığı: Ynt: c64 intro efektleri (ters yazı)
Gönderen: joker_ üzerinde Temmuz 05, 2017, 15:48:23 ÖS
Artık geriye işin kolay kısmı yani bunu kayan yazıda kullanmak kaldı. Tabii önce yapmamız gereken başka şeyler var.

Tabii ki, c64'ün o muhteşem sid müziklerinden mahrum kalmamak ve efektimizi biraz canlandırmak için arka planda müzik çaldırmak :D

Tonlarca sid müzik var elimizde. Fakat benim kullanmak istediğim yerli bir parça. Compushop grubundan dr.Ali&Joker'a ait bir müzik. (Buradaki joker ben değilim :) )

Commodore64 müzisyenleri, müzikleri yaparken hafızanın $1000 adresinden itibaren yüklenecek şekilde yaparlar. Programcılar da genel de, $1000 ile $2000 arasını müzik için ayırırlar. Bu kesin bir kural olmasa da, genel olarak uyulan bir standarttır.

Gerçi demo müzikleri için geçerli değildir. Çünkü bir çok demo müziği $1000'lik alandan çok daha fazlasını kullanır.

Bizim kullanacağımız müzik ise $17fe adresine yükleniyor ve $1806 ile de çalınıyor. Önce müziğimizin yükleneceği ve çalınacağı adresleri tanımlayalım. (Gerekli dosyaları yazının sonuna ekleyeceğim ;) )

    muzik         = $17fe
   muzik_cal      = muzik + 8

müziğimizi, başta tanımladığımız adrese yüklüyoruz.

   * = muzik
   !bin "files\Compu_Demo_2_tune_5.prg",,2

ve müziğimizi başa alıyoruz.

   ldx #$00
   jsr muzik

mesajımızı değiştirerek, müzisyenlere credit veriyoruz. Karakter setini hazırlayanı bilmediğimizden yazamıyoruz.

   * = mesaj   
   !scr "selam commodore.gen.tr "
   !scr "karsinizda bir baska intro efekti "
   !scr "muzik by dr.ali & joker/compushop  karakter seti bilinmiyor...."   
   !scr "                                     "
   !by $ff

Yazının başında iç içe irq rutinleri kullanacağımızı söylemiştik. Şimdi de irq içerisinde değişiklik yapıyoruz.

irq
   inc $d019

   jsr muzik_cal   ;müzik çaldırma işlemini yapıyoruz

   lda #$5a   ;diğer irq'nun hangi satırda olacağını
   sta $d012   ;raster register'ına bildiriyoruz.
   
   lda #<irq1   ikinci irq tetiklemesini yapıyoruz.
   sta $0314
   lda #>irq1
   sta $0315

   jmp $ea81

ilk irq içerisinde, müzik çaldırma işlemini yapıyoruz ve diğer irq'nun hangi satırda olacağını raster register'ına bildirerek, ikinci irq tetiklemesini yapıyoruz.


irq1
   inc $d019
   
   lda #$1a   ;karakter seti adresini
   sta $d018   ;ilgili register'a bildiriyoruz.
 
   jsr kayan_yazi   ;kayan yazi rutinine gidiyoruz.

   lda #$6a   ;diğer irq'nun hangi satırda
   sta $d012   ;tetikleneceğini ilgili registar'a yazıyoruz.

   lda #<irq    ;ilk irq tetiklemesini yapıyoruz.
   sta $0314
   lda #>irq
   sta $0315

   jmp $ea81


İkinci irq içerisinde ise ilk kayan yazımızda kullanacağımız karekter setinin yerini ilgili register'a bildiriyoruz. Ardından kayan yazı rutinine gidiyoruz. Diğer irq'nun hangi satırda olacağını belirtip, ilk irq'ya geri dönüyoruz.


Konu Başlığı: Ynt: c64 intro efektleri (ters yazı)
Gönderen: joker_ üzerinde Temmuz 05, 2017, 15:54:56 ÖS
Artık 1x2 scroll'a geçebiliriz.

İşe hangi satırda kayan yazı olacağını tanımlayarak başlayalım ;)

   ters_mesaj_satiri   = $0400 + (7 * 40)   ;1x2 yazının ekranda kayacağı satır

Yeni mesaj satırımızın yerini tanımlıyoruz. Sonra yeni bir irq daha oluşturup,

irq2
   inc $d019

   lda #$1e
   sta $d018
   
   jsr ters_kayan_yazi   
 
   lda #$82
   sta $d012
 
   lda #<irq
   sta $0314
   lda #>irq
   sta $0315

   jmp $ea81


ters yazı rutinimizi bu irq içerisinden çağırıyoruz.

irq1
   inc $d019
   
   lda #$1a   ;karakter seti adresini
   sta $d018   ;ilgili register'a bildiriyoruz.
 
   jsr kayan_yazi

   lda #$6a
   sta $d012

   lda #<irq2
   sta $0314
   lda #>irq2
   sta $0315

   jmp $ea81


tabii, bir önceki irq rutinini düzeltmeyi de unutmuyoruz ;)

Sonra da, 1x2 kayan yazı rutinimizi yazıyoruz. Aslında 1x1 scroll rutininden çok fazla farkı yok. Sadece


   ldx #$00
-   lda ters_mesaj_satiri + 1,x
   sta ters_mesaj_satiri,x
   
   inx
   cpx #$50   
   bne -

Burada kopyalama işlemini 2 satır için yapıyoruz.
 
ms_next   
   sta ters_mesaj_satiri + 39   ;1X2 karakter setinde karakterlerin üst yarısıyla
   clc         
   adc #64            ;alt yarısı arasında 64 karakter olduğundan, mesaj da okuduğumuz karaktere, 64 ekleyip bir alt satıra yazıyoruz.

   sta ters_mesaj_satiri + 79
   
   inc ms_lp + 1
   bne +
   inc ms_lp + 2      
+
   rts 


Yeni oluşturduğumuz karakter setimizde,

(https://i.hizliresim.com/bGr4Dj.png)

Karakterlerimizin yarısını yukarıya, diğer yarısını ise 64 karakter ileriye koymuştuk. Burada yaptığımız işlem, mesaj metninden okuduğumuz her bir karakterin, yarısını ekrana bastıktan sonra, karakter setinden, 64 ilerisindeki karakteri bularak tam alt satırına basıyoruz.

(https://i.hizliresim.com/dGPq3n.png)

Kod:
!to"ters_yazi.prg",cbm

* = $0801
!byte $0b, $08, $00, $00, $9e, $32, $30, $36,$31, $00, $00, $00

mesaj_satiri = $0400 + (5 * 40) ;yazının ekranda kayacağı satır.
ters_mesaj_satiri = $0400 + (7 * 40) ;1x2 yazının ekranda kayacağı satır

muzik = $17fe
muzik_cal = muzik + 8

karakter_set = $2800 ;Karakter setimizin yükleneceği adresi tanımlıyoruz.

ters_karakter_set = $3800 ;ters karakter setinin kopyalanacağı adres


 
mesaj = $5000 ;Ekran da görülecek olan mesajımızın hafıza da duracağı adresi

tanımlıyoruz.


* = $080d

lda #$01
sta $0286

jsr $e544

lda #$00 ;siyah renk kodu
sta $d021 ;iç ekran registeri
sta $d020 ;dış ekran registeri

ldx #$00
jsr muzik

;====karakter setini kopyala

lda #<karakter_set
sta $f0
lda #>karakter_set
sta $f1

lda #<ters_karakter_set
sta $f2
lda #>ters_karakter_set
sta $f3

;===ilk 4 byte data===

ldx #$00
ldy #$04
ilk_4 lda ($f0),y
pha

iny
cpy #$08
bne ilk_4
 
  ldy #$00
-- pla
- sta ($f2),y

iny
cpy #$02
bne -
 
lda $f2
clc
adc #$02
sta $f2

bcc +

inc $f3
+
ldy #$00

inc sayac
lda sayac
cmp #4
bne --

lda #$00
sta sayac

lda $f0
clc
adc #$08
sta $f0

bcc +

inc $f1
+
inx
cpx #64
bne ilk_4

;===ikinci 4 byte data===

lda #<karakter_set
sta $f0
lda #>karakter_set
sta $f1

ldx #64
ldy #$00
son_4 lda ($f0),y
pha

iny
cpy #$04
bne son_4
 
  ldy #$00
-- pla
- sta ($f2),y

iny
cpy #$02
bne -
 
lda $f2
clc
adc #$02
sta $f2

bcc +

inc $f3
+
ldy #$00

inc sayac
lda sayac
cmp #4
bne --

lda #$00
sta sayac

lda $f0
clc
adc #$08
sta $f0

bcc +

inc $f1
+
inx
cpx #128
bne son_4

;=====kopyalama rutini sonu

sei

lda #$7f
sta $dc0d

lda #$01
sta $d01a

lda #$1b
sta $d011

lda #<irq
sta $0314
lda #>irq
sta $0315

cli
jmp *

irq
inc $d019

jsr muzik_cal

lda #$5a
sta $d012

lda #<irq1
sta $0314
lda #>irq1
sta $0315

jmp $ea81

irq1
inc $d019

lda #$1a ;karakter seti adresini
sta $d018 ;ilgili register'a bildiriyoruz.
 
jsr kayan_yazi

lda #$6a
sta $d012

lda #<irq2
sta $0314
lda #>irq2
sta $0315

jmp $ea81

irq2
inc $d019

lda #$1e
sta $d018

jsr ters_kayan_yazi
 
lda #$82
sta $d012
 
lda #<irq
sta $0314
lda #>irq
sta $0315

jmp $ea81


kayan_yazi
lda d016_degeri
sec
sbc #1
and #$07
sta $d016
sta d016_degeri

beq +
rts
+
ldx #$00
- lda mesaj_satiri + 1,x
sta mesaj_satiri,x

inx
cpx #$28
bne -

_lp lda mesaj
cmp #$ff
bne next

lda #<mesaj
sta _lp + 1
lda #>mesaj
sta _lp + 2
  rts
next
sta mesaj_satiri + 39

inc _lp + 1
bne +
inc _lp + 2
+
rts

ters_kayan_yazi
 
lda ters_d016
sec
sbc #1
and #$07
sta $d016
sta ters_d016

beq +
rts
+
ldx #$00
- lda ters_mesaj_satiri + 1,x
sta ters_mesaj_satiri,x

inx
cpx #$50
bne -

ms_lp lda mesaj
cmp #0
bne ms_next

lda #<mesaj
sta ms_lp + 1
lda #>mesaj
sta ms_lp + 2
rts
ms_next
sta ters_mesaj_satiri + 39
clc
adc #64
sta ters_mesaj_satiri + 79

inc ms_lp + 1
bne +
inc ms_lp + 2
+
rts 


d016_degeri
!by 0


ters_d016
!by 0

sayac
!by 0

;Mesajımızı daha önceden tanımladığımız, hafıza adresine yüklüyoruz.
* = mesaj
!scr "selam commodore.gen.tr "
!scr "karsinizda bir baska intro efekti "
!scr "muzik by dr.ali & joker/compushop  karakter seti bilinmiyor...."
!scr "                                     "
!by $ff
     
;Karakter setimizi tanımladığımız adrese yüklüyoruz.
 
* = karakter_set

!bin "files\craze_cool.64c",,2

* = muzik

!bin "files\Compu_Demo_2_tune_5.prg",,2


Ben uğraşamam, bunun bitmiş hali nasılmış diyenler için, bitmiş halini de ekliyorum :)



Konu Başlığı: Ynt: c64 intro efektleri (ters yazı)
Gönderen: joker_ üzerinde Temmuz 05, 2017, 15:56:38 ÖS
Son olarak, daha önce de söylemiştim yine hatırlatayım. Bana ait olan kodları istediğiniz gibi kullanabilirsiniz. Hiçbir şekilde, credits felan vermenize gerek yok ;)

iyi eğlenceler.


Konu Başlığı: Ynt: c64 intro efektleri (ters yazı)
Gönderen: emarti üzerinde Temmuz 05, 2017, 16:04:59 ÖS
Eline sağlık senin yazıları arşivlemek gerek....

En büyük problem bu ama icraat yok

@joker_ abi ellerine sağlık 6502 assembler gördükçe kahve içmiş gibi oluyorum.


Konu Başlığı: Ynt: c64 intro efektleri (ters yazı)
Gönderen: joker_ üzerinde Temmuz 05, 2017, 16:09:39 ÖS
Eline sağlık senin yazıları arşivlemek gerek....

En büyük problem bu ama icraat yok

@joker_ abi ellerine sağlık 6502 assembler gördükçe kahve içmiş gibi oluyorum.

eyvallah abi. çok saol :)


Konu Başlığı: Ynt: c64 intro efektleri (ters yazı)
Gönderen: eins üzerinde Temmuz 05, 2017, 16:20:42 ÖS
Süper olmus eline saglik. Bu yaptigini gorunce ters 1x2 kismi biraz dalgalandirip sanki su uzerinde yabsimaymis gibi bir efekt yapilabilir gibi geldi bana...


Konu Başlığı: Ynt: c64 intro efektleri (ters yazı)
Gönderen: joker_ üzerinde Temmuz 05, 2017, 16:22:25 ÖS
Süper olmus eline saglik. Bu yaptigini gorunce ters 1x2 kismi biraz dalgalandirip sanki su uzerinde yabsimaymis gibi bir efekt yapilabilir gibi geldi bana...

güzel fikir kardeşim ;)


Konu Başlığı: Ynt: c64 intro efektleri (ters yazı)
Gönderen: yavuzg üzerinde Temmuz 05, 2017, 17:05:43 ÖS
Eline sağlık senin yazıları arşivlemek gerek....

kesinlikle. Benim photobucket da patladı mesela. herifler 400 USD istiyor!!!

joker_, kardeşim konunun içine etmiş olmıyayım, ki gerçekten çok güzel bu tutorialların, uzaktan da olsa hayranlıkla takip ediyorum ;)

ancak bu resim konusunda uyarayım dedim, bu resim host eden siteler belli bir kullanım/potansiyel müşteri oranına ulaşınca şantaj çekmeye başlıyorlar. sen hızlıresim sitesini kullanıyorsun sanırım, ilerde o da patlatmasın dikkat...

beni önce imageshack patlattı, sonra photobucketa aktarmıştım, şimdi o da patlattı...


Konu Başlığı: Ynt: c64 intro efektleri (ters yazı)
Gönderen: joker_ üzerinde Temmuz 05, 2017, 17:23:33 ÖS
Eline sağlık senin yazıları arşivlemek gerek....

kesinlikle. Benim photobucket da patladı mesela. herifler 400 USD istiyor!!!

joker_, kardeşim konunun içine etmiş olmıyayım, ki gerçekten çok güzel bu tutorialların, uzaktan da olsa hayranlıkla takip ediyorum ;)

ancak bu resim konusunda uyarayım dedim, bu resim host eden siteler belli bir kullanım/potansiyel müşteri oranına ulaşınca şantaj çekmeye başlıyorlar. sen hızlıresim sitesini kullanıyorsun sanırım, ilerde o da patlatmasın dikkat...

beni önce imageshack patlattı, sonra photobucketa aktarmıştım, şimdi o da patlattı...

Abi iyi oldu uyardığın. En kısa zamanda sağlam bir yere taşırım.


Konu Başlığı: Ynt: c64 intro efektleri (ters yazı)
Gönderen: WildLord üzerinde Temmuz 05, 2017, 20:22:03 ÖS
Ellerine sağlık, bilgilendirici güzel bir yazı olmuş.


Konu Başlığı: Ynt: c64 intro efektleri (ters yazı)
Gönderen: aegis üzerinde Temmuz 05, 2017, 21:02:24 ÖS
Bro ellerine sağlık. Faydalı bir yazı oldu bu. Yaş kemale geldi tam gaz devam ediyoruz. Benimde 1541 Ultimate 2+ geldi nihayetinde code yazmaya başladım. Yakında yeni ve eski introlarımı RETURN grubumuz aldında bi aksilik çıkmazsa yayınlayacağım. Diğer arkadaşlarımızdanda bu tarz ufakda olsa intro lar bekliyoruz. Var ya bro demo dan çok introları daha bir sevmişimdir C64de. Tekrar emeğine sağlık.


Konu Başlığı: Ynt: c64 intro efektleri (ters yazı)
Gönderen: joker_ üzerinde Temmuz 05, 2017, 21:39:59 ÖS
Ellerine sağlık, bilgilendirici güzel bir yazı olmuş.

Çok saol kardeşim. Teşekkürler.

Bro ellerine sağlık. Faydalı bir yazı oldu bu. Yaş kemale geldi tam gaz devam ediyoruz. Benimde 1541 Ultimate 2+ geldi nihayetinde code yazmaya başladım. Yakında yeni ve eski introlarımı RETURN grubumuz aldında bi aksilik çıkmazsa yayınlayacağım. Diğer arkadaşlarımızdanda bu tarz ufakda olsa intro lar bekliyoruz.

Kanka Ultimate 2+ hayırlı olsun. Güle güle kullan. Inceleme yazısı bekliyoruz.

Introları bekliyoruz ;)

Var ya bro demo dan çok introları daha bir sevmişimdir C64de. Tekrar emeğine sağlık.

Kanka al bendende o kadar. Aynen bende introları daha çok severim ;)


Konu Başlığı: Ynt: c64 intro efektleri (ters yazı)
Gönderen: hades üzerinde Temmuz 06, 2017, 08:46:48 ÖÖ
Eline sağlık.
(joker Z80'e gel. işlemcinin kralı z80 :) )


Konu Başlığı: Ynt: c64 intro efektleri (ters yazı)
Gönderen: joker_ üzerinde Temmuz 06, 2017, 08:54:22 ÖÖ
Eline sağlık.
(joker Z80'e gel. işlemcinin kralı z80 :) )


abi dur :D Zaten 6510'a sen bulaştırdın, birde Z80'e bulaşmayayım diyorum. Fakat bir yandan da içim gidiyor :D


Konu Başlığı: Ynt: c64 intro efektleri (ters yazı)
Gönderen: hades üzerinde Temmuz 06, 2017, 08:59:56 ÖÖ
Öyleyse içindekini dışına çıkar :)