kurs sonrasi ornekler

29 replies · 14,939 views

kurs sonrasi ornekler
Mesela aklima soyle bir ornek geldi. Ekranda bi$iler gorme acIsIndan.
Ekranda en kolay oynatabilecegimiz obje sprite olduguna gore...
Bir sprite logomuz var. Diyelim ki bu logo sprite0. (ufak bi logo) 🙂
Onu ekranda gorulen bi yere koyduk. Ornegin (x=$24,y=$32) ye..
logo ekranda x koor.da $ff 'e kadar gidiyor ve $ff'e geldiginde tekrar $24'e kadar geri kayIyor.
Normal ko$ullarda bunu yaptIgImIzda yumu$ak bir kayma sagLamamIz cok zor. (Ornek oLarak a$agIya yazdIgIm code...) Bunu en basit $ekiLde irq ya bagLayarak yumu$ak $ekiLde nasIL kaydIrabiliriz? Mademki irq kuLLanIyoruz oraya buraya da daLLanaLIm mesela space'e basInca da basic'e doneLim... Yada ekranIn alt tarafLarInda biyerLerde aynI anda sprite1'de sprite0'dan ters yone hareket etsin?
Bana gore bu oLay en sade $ekiLde anLatILdIgI zaman nightlord'un dedigi gibi nightshift'te fazLadan 2-3 intro gormek mumkun oLabiLir. Verilecek bu ornegin mantIgInI kapan cogu $eyi de yapabiLir diye du$unuyorum.
Zaman ayIrIp ornek verebiLecek arkada$Lara simdiden te$ekkurLer...
Bu arada ornegin daha anLa$ILabilir oLmasI bakImIndan $d010 'u katmadIm. Bu ornegi fazla karma$tIrmayacagInI du$unuyorsanIz onuda aradan cIkarmI$ oluruz 🙂
Mesela...
*=$1000
jsr$e544
basla: lda#$01
sta$d015
ldx#$24
stx$d000
ldy#$32
sty$d001
art: lda$d000
tax
art1: inx
ldy#$00
beklet: iny
(10 adet nop)
cpy#$ff
bne beklet
stx$d000
cpx#$ff
bne art1
lda$d000
tax
azal : dex
stx$d000
ldy#$00
azal1: iny
(10 adet nop)
cpy#$ff
bne azal1
cpx#$24
bne azal
stx$d000
rts

Last edited: 2007-01-06 19:15

kurs sonrasi ornekler
stranger opuyorum 🙂
bitti mi demo, geleyim mi izlemeye? kartus bulmussundur artik di mi?
kurs sonrasi ornekler
valla $u soyLedigim ornegi vereni bende opucem 🙂 Cunku kafamdaki bi cok soru i$aretini kaLdIrmI$ oLucam.
Bu arada... Final3 var bi tane. Nobody'den aLIcam. 1084SD1 buldum, kaptIm hemen. Ceyizi duzuyorum. 🙂 Ne varsa 64'te var yine. Zaten TTT-2'de cIkMadI 🙁 🙂
kurs sonrasi ornekler
Hızlıca şöyle bir örnek yaptım kardeşim. Elimden geldiğince kernal rutinleri kullanmaktan kaçındım ki nightlord'un henüz açıklamadığı konular kafanızda soruişareti yaratmasın. Aşağıdaki örneği ACME'de derleyip SYS 4096 ile çalıştırabilirsiniz. Interrupt ile bir sprite sürekli yana kaydırılıyor ve space ile basic'e geri dönebiliyorsunuz.
!to "example.prg",cbm
 *=$1000
 ; Sprite Bas
 lda #$01
 sta $d015
 lda #$c0 ; $c0*$40 = $3000 adresindeki spriteı göster
 sta $07f8
 lda #$98
 sta $d000 ; spriteın x koordinatı
 lda #$72
 sta $d001 ; spriteın y koordinatı
 ; Interruptı Hazırla
 sei
 lda #$7f
 sta $dc0d
 lda #$01
 sta $d01a
 lda #$1b
 sta $d011
 lda #$00
 sta $d012
 lda #<int
 sta $0314
 lda #>int
 sta $0315
 cli
 ; Space kontrolü
space lda $dc01
 cmp #$ef
 bne space
 ; Spriteları kapa
 lda #$00
 sta $d015
 ; Basic'e dön
 sei
 lda #$81
 sta $dc0d
 lda #$f0
 sta $d01a
 lda #$31
 sta $0314
 lda #$ea
 sta $0315
 cli
 rts
 ; Interrupt Rutini
int inc $d000 ; Sprite'ın X koordinatını 1 arttır
 lda $d000 ; Eğer sprite 255'i geçmediyse
 bne out  ; interruptın çıkışına git
 lda $d010 ; Sprite 255'i geçtiyse
 eor #$01 ; 9.bitini değiştir
 sta $d010 ; 0 ise 1 yap, 1 ise 0 yap
out inc $d019
 jmp $ea81 
 *=$3000
 !fill 63,255 ; Sprite haritasını 255 ile doldur
kurs sonrasi ornekler
Forum kodun formatını azcık bozduğu için source code'u ve compile edilmiş prg dosyasını zip olarak ekliyorum buraya.
kurs sonrasi ornekler
@skate: What a rush! 🙂 cok HIzLIsIn karde$im. eline sagLIk. Hemen inceLiyorum.
kurs sonrasi ornekler
Selamlar. ben de irq rutinine strangerin yaptigi gibi saga sola gitme ornegi vereyim. irq hazirlama bolumleri aynen daha onceki orneklerde oldugu gibi. space icin de skatein ornegine bakabilirsiniz. bu yuzden sadece irq rutini veriyorum
irq_rutini:
    inc $d019
    jsr sprite_pozisyonunu_guncelle
    jmp $ea81
 
sprite_pozisyonunu_guncelle:
    lda hareket_yonu
    cmp #SAGA_HAREKET
    beq saga_kaydir
    jmp sola_kaydir
 
saga_kaydir:
    ldx $d000
    inx 
    beq sola_don
    stx $d000
    jmp irq_rutini_sonu
 
sola_don:
    lda #SOLA_HAREKET
    sta hareket_yonu
    lda #$fe
    sta $d000
    jmp irq_rutini_sonu
 
sola_kaydir:
    ldx $d000
    dex 
    beq saga_don
    stx $d000
    jmp irq_rutini_sonu
 
saga_don:
    lda #SAGA_HAREKET
    sta hareket_yonu
    lda #$00
    sta $d000
    jmp irq_rutini_sonu
 
irq_rutini_sonu:
    rts
 
hareket_yonu:
    !by SAGA_HAREKET
 
SAGA_HAREKET = 1
SOLA_HAREKET = 2

Burada aslinda hayatta sik karsimiza cikan bir tasarim ornegi goruyoruz. "Durum Motorlari"... Bu irq rutinimiz bir durum motoru. Durum motorlarinin "durumlari" ve onlara iletilen "istekler" vardir. Bir durum motoru kendisine gelen istegi alinca "istek" ve bulundugu "durum" a bakarak bir is yapar. Bu yaptigi isin sonucu olarak ayni durumda kalabilir veya "durum degistirme" yasayabilir
bu ornekte iki durum var: SAGA_HAREKET ve SOLA_HAREKET.
bir istek var: sprite_pozisyonunu_guncelle
iki durum degisikligi olabiliyor zaman zaman: sola_don ve saga_don

Last edited: 2007-01-07 04:50

kurs sonrasi ornekler
@nightlord: aha! $imdi oLaY tam OLarak cozuldu 🙂
kurs sonrasi ornekler
saga don alt rutininde, sta hareket_yonunden sonraki satirda mesaji ilk post ettigimde hata olmus. simdi duzelttim, haberiniz olsun.
kurs sonrasi ornekler
Skate ve nightlord'un gonderdiklerinin birLe$imi...
Basic'e du$mesek daha iyi gibi geLdi. Code daha sade oLuyor..
!to "deneme.prg",cbm
*=$1000
; Sprite Bas
lda #$01
sta $d015
lda #$24
sta $d000 ; spriteın x koordinatı
lda #$72
sta $d001 ; spriteın y koordinatı
; Interruptı Hazırla
sei
lda #$7f
sta $dc0d
lda #$01
sta $d01a
lda #$1b
sta $d011
lda #$00
sta $d012
lda #<int
sta $0314
lda #>int
sta $0315
cli
rts
int:
inc $d019
jsr sprite_pozisyonunu_guncelle
jmp $ea81
sprite_pozisyonunu_guncelle:
lda hareket_yonu
cmp #SAGA_HAREKET
beq saga_kaydir
jmp sola_kaydir
saga_kaydir:
ldx $d000
inx
beq sola_don
stx $d000
jmp irq_rutini_sonu
sola_don:
lda #SOLA_HAREKET
sta hareket_yonu
lda #$fe
sta $d000
jmp irq_rutini_sonu
sola_kaydir:
ldx $d000
dex
beq saga_don
stx $d000
jmp irq_rutini_sonu
saga_don:
lda #SAGA_HAREKET
sta hareket_yonu
lda #$00
sta $d000
jmp irq_rutini_sonu
irq_rutini_sonu:
rts
hareket_yonu:
!by SAGA_HAREKET
SAGA_HAREKET = 1
SOLA_HAREKET = 2

Last edited: 2007-01-07 16:41

kurs sonrasi ornekler
Benim gibi acme'yi fazLa kuLLanmayanLar icin. Normal dunya'da ki 🙂 meali nedir $u parcanIn? TASM kullananLar icin?
hareket_yonu:
!by SAGA_HAREKET
yani "!BY" ...
kurs sonrasi ornekler
çok alakasız olacak ama buna ben cevap vereyim 🙂
!by SAGA_HAREKET
ile tam oradaki bytea (rts'ten sonraki) 1 koyuyoruz. o byteı "hareket_yonu" olarak labelladık ve yön durumumuzu o byte'ta store ediyoruz.
!by tasm'ca ne olur bilmiyorum ama bi kaç farklı assemblyde şunlar da aynı anlama gelecekti:
hareket_yonu db SAGA_HAREKET
hareket_yonu: .db SAGA_HAREKET
hareket_yonu: fcb SAGA_HAREKET
kurs sonrasi ornekler
!by ya da !byte'ın TASM'deki karşılığı F5 ile de yazdırlabilen
.byte
ifadesidir. Benzer şekilde !tx ya da !text de .text'e karşılık gelir. Ama !text tek alternatif değildir. Ekran karakterlerini daha iyi ifade eden !scr de kullanılabilir. Ne yazık ki ACME'nin adam akıllı bir dökümasyonu yok benim bildiğim. Paketin içinden çıkanla yetinmek zorunda kalıyorsunuz. O da bence yetersiz. Ama deneme yanılmayla öğreniliyor birçok şey kısa sürede.
ACME için adam akıllı döküman bilen varsa lütfen yollasın. Benim de işime yarar.
kurs sonrasi ornekler
@skate: byte mI? eheh.. cok ho$ yahu... 🙂 acme'nin kIsaLTmaLarIna baYILdIm...
@anesthetic: hocam cozmu$sun oLayI ama yoL biraz uzun oLmu$ anLa$Ilan.. 😉

Last edited: 2007-01-07 18:30

vice monitor problemi.
Acme'nin dokuman probleminden soz acILmI$ken bende Vice hakkInda biraz yaKInmak istiyorum.
vice'In monitoru tam anLamIyLa caLI$mIyor.
Mesela d, a, g vb. komutlar caLIsIrken Load, save gibi komutLar caLI$MIyor. Bu da Pc uzerinde c64 icin yazILIm geLi$tirmeyi zorLa$tIrIyor 🙂
Ornegin S "sid",08,1000 2000 gibi bir komutla bir sid aLIp kendi programImIzda denemek istersek bu mumkun oLmuyor. AynI $ekiLde L"sid",08,1000 gibi hayati $eyLeri yapmak mumkun oLmuyor. Yani hafIzanIn istedigimiz yerine istedigimiz materyali koyamIyoruz. Boylece ekranda da gosteremeyip farazi $eyLer uzerinde caLIsIyorsunuz.
(Kare seklinde sprite'lar, Ekranda duzgun gozukmeyen[sadece o hafIza araLIgIndaki byteLarIn oLu$turdugu] logolar vb.)
Bu konunun bilinen bir cozumu yok zannedersem. Ancak Acme'de bu belki mumkun olabilir diye dusunuyorum. Relunch64 dosyaLarI hex ve bin oLarak import edebiliyor.
Ornegin bir sid dosyasInI a$agIdaki ornek gibi code'un icine import edebiliyoruz. Tabii bu extra bir$ey OLdugu icin kuLLanImIda extra biLgi gerektiriyor. Yeterli dokumanda yoksa ordada sIcabiLiyoruz.
!byte $50,$53,$49,$44,$00,$02,$00,$7c
!byte $00,$00,$10,$00,$10,$03,$00,$01
!byte $00,$01,$00,$00,$00,$00,$45,$6e
!byte $64,$69,$6e,$67,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$4a,$65
!byte $6e,$73,$2d,$43,$68,$72,$69,$73
!byte $74,$69,$61,$6e,$20,$48,$75,$75
!byte $73,$20,$26,$20,$49,$43,$45,$00
!byte $00,$00,$00,$00,$00,$00,$31,$39
!byte $38,$38,$2d,$38,$39,$20,$56,$69
!byte $62,$72,$61,$6e,$74,$73,$00,$00