Originally posted by Bakkada@Oct 2 2005, 04:31 PM
OK simdi daha bi duzenli ama birkac sorun daha var...
bangir bangir dan sonra C karakteri basiyor ekranin sonunda kadar,kodun bu parcasini alip baska bi yerde test ettim eger karakter sayisi kadar dongu verirsem basmiyor ama karakter sayisindan fazla dongu verirse
ornegin 13 karakterlik yazim var
cpx #40 dersem kalan kismina C karakteri basiyor.
ama cpx 13 dersem probşem yok????
Burdaki C karakteri bir garip bi C onuda soliim bildigimiz C degil :)
Delay dongusune girmeden x degerini saklamayi ise kafamda cozemedim :(
[post=2119]Quoted post[/post]
[/b]
1- ekrana basacağın yazıların uzunluğu aynı ise cpx #uzunluk olmalı, eğer uzunlukları farklı ise eşitlemek için kısa olan yazılara boşluk eklemen gerekir.
2- Eğer programında o an için kullandığın bir register başka bir alt rutinde farklı bir değer ile yükleniyorsa, registerin önceki değerini kullanılmayan bir adrese kopyalarsın. alt rutinden çıkmadan yani rts komutundan hemen önce registere daha önce kopyaladığın değeri geri yüklersin ve rts ile alt rutinden çıkarsın. veya alt rutinden geri döndükten sonra -jsr komutundan sonra kopyaladığın değeri geri okursun. böylece alt rutine gitmeden önceki asıl değeri kaybetmemiş olursun.
Buna göre senin rutininde
ldx #0
printloop:
lda $0000,x
sta screen,x
stx sakla
ldy #$40
jsr delay
ldx sakla
inx
cpx #40
bne printloop
rts
yukarıdaki sakla yerine programa zarar vermeyecek herhangi bir adresi kullanabilirsin.
Originally posted by Bakkada@Oct 2 2005, 05:10 PM
ben ayni yerlerde tax ve txa komutu kullanmayi denedim tabi olmadi :)
Main CPU Jam error :P
Hmmm yavas yavas oturuo anniorum simdi....
SU programi bi bastan yazip calistiriim bakiiim
[post=2125]Quoted post[/post]
[/b]
Daha gelmemiş olabilirsiniz o konuya, tutorialları takip etmiyorum ancak bu tür durumlarda stack kullanımı çok pratiktir. Örnek olarak X'deki değeri geçici olarak saklamak istiyorsan.
txa
pha
..
..
..
..
pla
tax
şeklinde stack'i kullanabilirsin. Stack yalnızca (illegal opcode kullanmadan) accumulator ile çalışır. Bunun dışında zeropage de güzel bir çözüm olabilir.
stx $fb
..
..
..
ldx $fb
mesela...
Stack konusuna gelmediyseniz ben daha fazla kafanı karıştırmiim. zeropage'e gelince bunlar $0000-$00ff arası hafıza adresleridir. Bu adreslerin kullanımı hafızada daha az yer kapladığı ve daha az cycle yediği için tercih edilir. Ancak $00-$ff arası tüm adresleri dilediğin gibi kullanamazsın, bazıları özel adreslerdir. Bunun için programcının el kitabı ya da Hades'in dökümanlarındaki hafıza tablolarını kurcalamanı tavsiye ederim. Bu arada elbette ki özel adres olsa da kullanmanda sakınca olmayan adresler mevcuttur. Örnek olarak RS232 üzerinden hiçbir işlem yapmayacağını varsayarak $f7, $f8, $f9, $fa adreslerini dilediğin gibi kullanabilirsin, her ne kadar normalde boş adresler olmasalar da. $fb-$fe aralığındaki adresler de zaten freedir. Ben genellikle bu adresleri kullanmayı tercih ediyorum.
Originally posted by Bakkada@Oct 3 2005, 10:37 AM
putscr opcode'mudur??
[post=2139]Quoted post[/post]
[/b]
yok yanlış anlaşılmış. Burda boşluklar ve tablar ile ilgili sorun yaşıyoruz tabii ki. putscr yalnızca bir label yani etiket. onun yerine "hede" de diyebilirsin, tabii ki ilerdeki tüm "putscr"ler yerine hede demek kaydıyla :)
turbo assembler, acme gibi şeylerden uzaklaşacak olursak şöyle anlatabilirim olayı. Programımız $c000'dan başlıyor diyelim ve sta $0400,x de $c036 adresinde yer alıyor
.c000 78 sei
.c001 a9 00 lda #$00
.c003 8d 20 d0 sta $d020
.c006 8d 21 d0 sta $d021
...
...
...
...
.c036 9d 00 04 sta $0400,x
...
...
şeklinde gidiyorsa hafıza adreslerinde $0400'ü 40'ar 40'ar (hex sistemde $28) arttırmak için
lda $c037
clc
adc #$28
sta $c037
lda $c038
adc #$00
sta $c038
demek gerekiyor. Yani sta $0400,x'in bulunduğu adresin bir sonrasındaki adres $0400'ün "00" bölümü onu da takip eden adres "04" kısmını birer byteda tutuyor ve biz doğrudan onları arttırıyoruz. Tabii bir de bunun için pointer kullanmak mantıklı ancak şimdi bir de ona girersem hiç çıkamayız işin içinden. Yine de Nightlord'un tutoriallarında yer alıyor olabilir. sta ($##),y olayı.
Originally posted by Bakkada@Oct 5 2005, 03:08 PM
yok mu bana bu islemleri annaticak biri???
bu arada sunu da yazdim
lda #clc
adc #sta <$0400
lda #>text1
adc #>text2
sta >$0400
text1:
!scr "o"
text2:
!scr "t"
end:
jmp end
bu kodda bir syntax hatasi yok ama kodun yaptigi bi iste yok :) kodu calistirdigimda ekran temislenip ready yasio.
Yardimlariniz icin tesekkurler.
[post=2190]Quoted post[/post]
[/b]
ı ıh bakkada, olayı henüz tam kavrayamamışsın. bu kodun birşey yapmaması gerekiyor zaten :)
diyelim ki "text1" etiketi hafızada $0830'a denk geliyor, "text2" ise bu durumda $0831 olur. Şimdi bakalım senin kodun ne yapıyor...
lda #clc
adc #sta <$0400 = sta $00
lda #>text1 = lda #$08
adc #>text2 = adc #$08
sta >$0400 = sta $04
yani senin kodun
lda #$30
clc
adc #$31
sta $00
lda #$08
adc #$08
sta $04
budur. Yaptığı iş ise
$0000 adresine $61 değerini girmek ve $0004 adresine ise $10 değerini girmektir.
Ne yapmak istediğini az çok anlar gibi oldum ancak sen şimdilik Nightlord'un çizdiği yolda ilerlemeye devam et. Ekrara "ot" bastırmak istiyorsan o zaman doğrudan
lda text1
sta $0400
lda text2
sta $0401
falan gibi birşeyler demen lazım. O toplama işlemi ancak şu durumda geçerli olur.
Şimdi sana güzel bir örnek yazayım satır satır yazı yazdırmak için
* = $0801
!byte $0b, $08, $00, $00, $9e, $32, $30, $36, $31, $00, $00, $00
!to "test.prg"
stradr1 = $0400
stradr2 = $0428
stradr4 = $0478
* = $080d
lda #$01
jsr $e536
lda #<satir1
sta $fa
lda #>satir1
sta $fb
lda #<stradr1
sta $fc
lda #>stradr1
sta $fd
jsr satirbas
lda #<satir2
sta $fa
lda #>satir2
sta $fb
lda #<stradr2
sta $fc
lda #>stradr2
sta $fd
jsr satirbas
lda #<satir4
sta $fa
lda #>satir4
sta $fb
lda #<stradr4
sta $fc
lda #>stradr4
sta $fd
jsr satirbas
jmp *
satirbas
ldy #$00
loop
lda ($fa),y
beq out
sta ($fc),y
iny
cpy #$28
bne loop
out
rts
satir1 !scr "bu satir ekranin en ustunde yer alacak"
!byte 0
satir2 !scr "bu ise ikinci satir olacak"
!byte 0
satir4 !scr "bu satir dorduncu satir olarak basilacak"
!byte 0
Daha pratik yöntemler var ama bu sanırım senin için "pointer kullanımı" açısından en anlaşılanı olacaktır.
lda ($fa),y
gibi bir kulanım şunu yapar. $fa adresindeki byteı low byte ve $fb adresindeki byteı high byte olarak alır ve o adrese y değerini ekleyerek o değeri accumulator'e aktarır.
sta ($fc),y
ise aynı şekilde $fc ve $fd'den aldığı hafıza adresine y ekler ve o adrese accumulator'ün değerini yazar.
diyelimki $fa, $fb, $fc ve $fd'nin değerleri şu şekilde olsun;
$fa = $30
$fb = $08
$fc = $00
$fd = $04
ve y registerında da 5 değeri olduğunu varsayalım. Bu durumda
lda ($fa),y
sta ($fc),y
demek olur ki
lda $0835
sta $0405
bunu anlayabildiğin zaman olayı çözeceksin Bakkada :)
Originally posted by Bakkada@Oct 7 2005, 10:18 PM
to "out.prg"
* = $c000
VM_SATIR_0 = $0400 + (0 * 40)
lda #0
sta $d020
sta $d021
loop1:
ldx #0
loop2:
lda VM_SATIR_0+1,x
sta VM_SATIR_0,x
inx
cpx #39
bne loop2
read:
lda text_source
sta VM_SATIR_0+39
inc read+1
ldy #$40
ldx #0
delay:
dex
bne delay
dey
bne delay
end: jmp loop1
!align 255,0
text_source:
!scr "merhaba dunya... iste karsinizda yazdigim "
!scr "ilk scroll rutini... henuz smooth degil ama "
!scr "onemli degil. onu da bi kac gune kadar yapmis "
!scr "olacagim zaten. greetings to ali, veli, 49, 50..."
!scr "the new codemaster signs off..."
!fill $2c,$20
bu kodu aynen yazdigimizda butun text gectikten sonra belli bir miktar garip "C" karakteri ardindanda gene garip bir karaakteri belli bir miktarda basiyor ve gene textin en basina donuyor...
Ne yaptiysam olmadi ve nerden kaynaklandigini da bulamadim.... :(
Umitsizlige kapilmaya basliorum....
Not:Kod NightLord'un sitesinden alintidir.
[post=2224]Quoted post[/post]
[/b]
selam bakkada gunlerdir sorularina cevap vermek icin bir turlu firsat bulamiyorum. gercekten ozur dilerim. neyseki burdaki diger arkadaslar sorulari yanitliyor.
simdi oncelikle scroll kodundaki problemini cozelim. yukaridaki kod parcasi aslinda 256 karakterlik bi yaziyi tekrar tekrar scroll ediyor. sen textin sonunda garip karakterer aliyorsan bu demektir ki, textin sonundan 256.karaktere kadar kalan bolum space karakterinin kodu ile dolmamis. bunu son satirdaki !fill adli ACME komutu yapiyor. senin bu problemi yasaman. o komutun islenmemesinden oluyor gibi. bu bazen acmede karsilatigim bir problem. acme'nin isledigi dosyada son komuttan sonra return ile "newline" karakteri olmasi gerekiyor. yoksa son komutu atlayabiliyor. dolayisyla son satirdan sonra bir kac kere return ile dosya sonunda birkac satirlik bosluk olusturup kaydet ve tekrar dene.
geri gelecegim... :)
Originally posted by nightlord@Oct 8 2005, 03:11 PM
selam
estafurullah benim kodda da her zaman hata olabilir. yazdiklarimi deneyip koysamda web sitesinde formating esnasinda hatalar olusabilyor.
text_source satirlari ile renk tanimi olan satirlarin arasinda !fill komutunu koyduguna emin misin? post ettigin mesajda scroll_colors bolumu yok
istersen full dosyayi koy. bi daha bakalim
bu arada bintools linki
http://nightlord.dr2.net/bintools.rar (http://nightlord.dr2.net/bintools.rar)
[post=2233]Quoted post[/post]
[/b]
iste full code:
!to "intromsu.prg"
*=$c000
VM_Satir_L=$0400+(7*40)+11
VM_Satir_S=$0400+(12*40)
CC_Satir_L=$d800+(7*40)+11
CC_Satir_S=$d800+(12*40)
lda #0
sta $d020
sta $d021
jsr clrscr
jsr logo
scrtext:
ldx #0
scrtextloop:
lda VM_Satir_S+1,x
sta VM_Satir_S,x
lda scroll_color,x
sta CC_Satir_S,x
inx
cpx #40
bne scrtextloop:
read:
lda scrolltext
sta VM_Satir_S+39
inc read+1
ldy #$c0
ldx #0
delay:
dex
bne delay
dey
bne delay
end:
jmp scrtext
logo:
ldx #0
logoloop:
lda logotext,x
sta VM_Satir_L,x
lda logocolorcode,x
sta CC_Satir_L,x
inx
cpx #18
bne logoloop
rts
clrscr:
ldx #0
lda #$20
clr_loop:
sta $0400,x
sta $0500,x
sta $0600,x
sta $0700,x
inx
bne clr_loop
rts
logotext:
!scr "6510 asm wants you"
logocolorcode:
!by $02,$01,$07,$08,$09,$02,$01,$07,$02,$01,$07,$08,$09,$02,$01,$07,$02,$01
scroll_color:
!by $02,$01,$07,$08,$09,$02,$01,$07,$02,$01,$07,$08,$09,$02,$01,$07,$02,$01
!by $02,$01,$07,$08,$09,$02,$01,$07,$02,$01,$07,$08,$09,$02,$01,$07,$02,$01
!by $02,$01,$07,$08,$09
!align 255,0
scrolltext:
!scr "here is the very first intro-like asm code from bakkada/******** best rookie of the year"
!fill $2c,$20
burda 6 satir enter tusu basarak bosluk biraktim,calistirdim gene yemedi.scrool'u yaziyor scroolun son harfi ekrandan cikana kadar ekran temiz.ne zaman "year" kelimesinin son harfi "r" ekrandan cikiyor o zaman "C" karakteri basmaya basliyor.Ardindan da 4 karelik bir satranc tahtasi dusunun o karakteri basiyor sonra scroola geri donuyor....
Eger "scrolltext:" i herhangi baska "scrollcolor"dan once koyarsam scrollcolor daki kodlari alip karaktere ceviriyor we "baghibagibaghi...." basiyor ekrana...
Bi yerde bi hata war ama nerde...
Skate kodun calistigini solio acaba benim emulatorumun ayarinda felan mi bise war dicem bole bise yapmamasi lasim :(
DipNot:Gene clrscr yaparken $0700 kullanmisis :)
Originally posted by Bakkada@Oct 8 2005, 08:45 PM
Ya bu arada sunu farkettim:
Nightlord'un kodunu aynen yazarsam ok calisio catir catir... ama o koddan son iki satiri silersek kalan yerlerde hemen "C" karakteri basio...
Hmmmm ilginc baktigim zaman 255 karakter de degil toplam yazilanlar
annamadim ben bu isi ama o kadar caım sıkıldı ki iki gundur demin bi benden yasca buyuk bi arkadasimla konusurken daha scrolltext yapamiyan adamdan scene ne fayda gelir sozlerinin agizamdan dokulmesine sebep oldu allah sonumu hayir etsin....
[post=2237]Quoted post[/post]
[/b]
sen sanıyormusun ki nightlord her kodu ilk yaptığı gibi çalışıyor? hemen sana "Living - Behind The Scenes" olayına giriim de anla olayı. Mesela 320 dot torus partı önceden 284 dotdan mı ne oluşuyordu. Ayrıca çok daha küçük bir alanda ve daha abzürt 3d bir şekil vardı. Bir de müzik çalmıyordu ilk versiyonunda. Nightlord müziği eklediğinde ise zaman zaman efektte zaman yetmemelerinden dolayı atlamalar falan olmaya başladı. Aradan bir iki hafta geçti, bir baktım manyak herif efekti fullscreen yapmış, dot sayısını 320'ye çıkarmış, müzik çatır çatır çalıyor + loader eklenince bile problem çıkmıyor. Yani herşey aşama aşama olur. Sen sonuca bakacaksın :) Scroll rutinini adam etmen günler sürdü diyelim. Eee? Ne farkeder. Sonunda oldu mu olmadı mı? Olmadıysa da gayet normal, ilk kod denemen. Ben bazı efektleri efekt ilk yapıldığından 10-15 sene sonra çözdüm. Noolcak? Sonuçta çözdüm :)
Nightlord: Umarım "behind the scenes" olayı için kusuruma bakmazsın, döktük kirli çamaşırları ortaya :P
Originally posted by skate@Oct 8 2005, 08:51 PM
@Bakkada: $0700 kullanımı çok da yanlış sayılmaz aslında. Ben Nightlord'un neden öyle kullanıdırdığını da biliyorum. Çünkü "$06e8 alaka yaw" diyecektiniz aksi taktirde. Nightlord başlangıç seviyesi tutorial yazma işinde çok iyi. Örnek olarak 3d tutoriallarında "1 KB yaklaşık 1000 bytedır" lafına hasta olmuştum. Ben ne kadar başlangıç seviyesi yazmaya çalışsam da tutamıyorum kendimi ve en baştan tüm bilgileri kesin olarak ortaya koyuyorum. Bu da insanların kafasını karıştırıyor. Ben en iyisi kendi işime bakiim de siz de adam akıllı öğrenin şu işi adım adım :)
[post=2238]Quoted post[/post]
[/b]
Adim adim ogrenices de istedigimis uzunlukta bi texti ekrana basan rutini yazamadik orasi nolucak???
Bi sure ara wersem ii olucak galiba ASM'ye...Yada icimden 10'a kadar sayip derin nefes aliiim ben....
Gec gelen edit:Ben 15 sene sonra 40 yasinda olucam :P