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)
commodore.gen.trCommodoreCommodore Yazılımc64 intro efektleri (ters yazı)
Sayfa: [1] 2   Aşağı git
Yazdır
Gönderen Konu: c64 intro efektleri (ters yazı)  (Okunma Sayısı 14002 defa)
0 Üye ve 1 Ziyaretçi konuyu incelemekte.
joker_
Deneyimli
*****
Mesaj Sayısı: 2.120



Üyelik Bilgileri
« : 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 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 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.



Yani boş bir ekran Kahkaha
Logged
joker_
Deneyimli
*****
Mesaj Sayısı: 2.120



Üyelik Bilgileri
« Yanıtla #1 : Temmuz 05, 2017, 15:16:25 ÖS »

Karakter setimizi değiştirerek devam edelim. Buradan 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



Evet. Ekranda yeni karakter setimizi gördük
Logged
LW3D
Yönetici
*****
Mesaj Sayısı: 11.418


Günü Kurtaran Avam Hiooargggh :)


Üyelik Bilgileri WWW
« Yanıtla #2 : Temmuz 05, 2017, 15:22:05 ÖS »

Eline sağlık senin yazıları arşivlemek gerek....
Logged

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



Üyelik Bilgileri
« Yanıtla #3 : 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.. Kahkaha


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



Üyelik Bilgileri
« Yanıtla #4 : 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'ini okuyabilir
Logged
joker_
Deneyimli
*****
Mesaj Sayısı: 2.120



Üyelik Bilgileri
« Yanıtla #5 : 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.

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



Üyelik Bilgileri
« Yanıtla #6 : 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.
Logged
joker_
Deneyimli
*****
Mesaj Sayısı: 2.120



Üyelik Bilgileri
« Yanıtla #7 : 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;



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.



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.



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.



Bu yüzden herhangi bir Hex Editör ile ilk 2 byte'ı, yani 00 38'i uçuruyoruz.

Sonra da yeni dosyamızı kaydedip,



Karakter Seti 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
 


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ş
Logged
joker_
Deneyimli
*****
Mesaj Sayısı: 2.120



Üyelik Bilgileri
« Yanıtla #8 : 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 Kahkaha

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.

* files.zip (28.52 KB - Yükleme: 236 kez.)
Logged
joker_
Deneyimli
*****
Mesaj Sayısı: 2.120



Üyelik Bilgileri
« Yanıtla #9 : 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,



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.



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


* ters_yazi.prg (18.16 KB - Yükleme: 528 kez.)
Logged
joker_
Deneyimli
*****
Mesaj Sayısı: 2.120



Üyelik Bilgileri
« Yanıtla #10 : 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.
Logged
emarti
Uzman
*****
Mesaj Sayısı: 2.590


Only Amiga Makes It Possible █


Üyelik Bilgileri WWW
« Yanıtla #11 : 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.
Logged

https://github.com/emartisoft My GitHUB | http://csdb.dk/scener/?id=26786 My CSDB | https://c64kernal.com Genesis

READY.
SYS(64767): EMARTI
joker_
Deneyimli
*****
Mesaj Sayısı: 2.120



Üyelik Bilgileri
« Yanıtla #12 : 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
Logged
eins
Uzman
*****
Mesaj Sayısı: 1.816


A.K.A. deliMawi


Üyelik Bilgileri
« Yanıtla #13 : 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...
Logged

Doberman ♦ megaOne ♦ HDMI-64 ♦ HDMI-520 ♦ NewSchool
joker_
Deneyimli
*****
Mesaj Sayısı: 2.120



Üyelik Bilgileri
« Yanıtla #14 : 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
Logged
Sayfa: [1] 2   Yukarı git
Yazdır
Gitmek istediğiniz yer: