tr-demoscene

the scene => çeşitli => Konuyu başlatan: Bakkada - 02.10.2005 16:41:58

Başlık: Bu kod neden calismaz????
Gönderen: Bakkada - 02.10.2005 16:41:58
!to "merhabadunya.prg"

*=$c000

start:

jsr clrscr
ldx #ldy #>text1
jsr print
ldy #$40
jsr delay
ldx #ldy #>text2
jsr print
ldy #$40
jsr delay
ldx #ldy #>text3
jsr print
end:
jmp end

screen=$0400

print:
stx print+1
sty print+2
ldx #0
printloop:
lda $0000,x
sta screen,x
ldy #$40
jsr delay
inx
cpx #40
bne printloop
rts


delay:
ldx #0
delayloop:
dex
bne delayloop
dey
bne delayloop
rts

clrscr:
ldx #0
lda #$20
clrscrloop:
sta $0400,x
sta $0500,x
sta $0600,x
sta $0700,x
inx
bne clrscrloop
rts


text1:
!scr "MERHABA DUNYA"
text2:
!scr "ISTE GELIYORUM"
text3:
!scr "BANGIR BANGIR"





bu kod ekrani temizliyor ekrana bir "/" karakteri biede ici dolu kutu basiyor ve duruyor nedendir bulamadim acikcasi???*
Başlık: Bu kod neden calismaz????
Gönderen: hades - 02.10.2005 17:10:35
işte bu yüzden çalışmaz :)

print altrutininde x registerinin değerini delay rutinine girmeden önce saklamalısın. Çünkü delay rutinindede ldx #0 var ve delay rutini bitince yine x=0 oluyor. geri dönüşte print alt rutinindeki inx komutuyla, aslında delay rutininden geri dönüşteki x registeri değerini 1 arttırıyorsun. yani x registeri hep 0 ve 1 değerlerini alıyor. dolayısı ile printloop'a bne yaptığında x registerinde herzaman 1 oluyor. Bu yüzden text teki diğer karakterleri hiç bir zaman okuyamıyorsun ve yazdıramıyorsun.

diğer bir hata ise

print:   stx print+1
         sty print+2
komutları ile aslında yukardaki stx komutuna ait parametreleri değiştiriyorsun. doğrusu
stx printloop+1
sty printloop+2
şeklinde olmalıydı

bu yüzden sen ilk okuma sırasında $0000 sonra $0001  nolu adreslerin içindeki değeri ekrana basmış oluyorsun
 
print:
stx print+1
sty print+2
ldx #0
printloop:
lda $0000,x
sta screen,x
ldy #$40
jsr delay
inx
cpx #40
bne printloop
rts


delay:
ldx #0
delayloop:
dex
bne delayloop
dey
bne delayloop
rts
Başlık: Bu kod neden calismaz????
Gönderen: Bakkada - 02.10.2005 17:31:07
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 :(
Başlık: Bu kod neden calismaz????
Gönderen: hades - 02.10.2005 17:34:26
bu arada yeni başlayanlar için bir-iki bilgi vereyim.

ekranı silmek için

jsr $e544 komutu kullanılabilir.

eğer ekranı sildikten sonra farklı bir renk ile yazı yazdırmak için

lda  #renk
jsr   $e536    komutları kullanılabilir.


program içinde 1 mili saniye gecikme yapmak için

jsr  $eeb3    komutu işinizi görür.

gecikme süresini uzatmak için

ldx #---
delay    jsr  $eeb3
dex
bne   delay

komutlarını kullanbilirsiniz.
Başlık: Bu kod neden calismaz????
Gönderen: hades - 02.10.2005 17:48:12
Alıntı
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.
Başlık: Bu kod neden calismaz????
Gönderen: skate - 02.10.2005 17:56:58
ben şu kullanımı tavsiye ederim

screen = $0400

ldx #$00
loop lda text,x
beq out
sta screen,x
inx
bne loop
out rts

text !scr "deneme 123"
       !byte 0

Gerçi bu maksimum 255 karakterlik bir text için çalışır ama olsun, şimdilik anlaman için yeterli. Text'in bittiği yerden bir sonraki byte'ı 0 yapıyoruz ve 0'a geldiyse trasferi sona erdir şeklinde kontrol ediyoruz.
Başlık: Bu kod neden calismaz????
Gönderen: Bakkada - 02.10.2005 18:10:23
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
Başlık: Bu kod neden calismaz????
Gönderen: skate - 02.10.2005 18:15:29
Alıntı
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.
Başlık: Bu kod neden calismaz????
Gönderen: hades - 02.10.2005 18:31:13
hah şöyle...

nihayet soru cevap başladı. inşallah devamı gelir.

ekrana yazı basma ile ilgili olarak bir rutinde ben yazayım. hem kısa hem hesaplı ....

lda #ldy #>text
jsr $ab1e
rts

text    .text   "deneme 1-2-3"
          .byte  0

ek bilgi : text uzunluğu max. 255 byte olabilir. ve text'in sonunda MUTLAKA 0 byte ı olmalıdır.

(çocukları gönderdim küçük odaya. 1-2 saat code kasabilirim :):))
Başlık: Bu kod neden calismaz????
Gönderen: madhead - 02.10.2005 18:37:54
bakkada, ekrana text basma konusunda yeterince bilgi edindiysen küçük bir ipucu da ben vereyim. diyelim ki uzun bir yazının 40 karakterlik, yani 1 satırlık kısmını ekrana basıyorsun. satırı ekrana bastıktan sonra text'i aldığın adresi her seferinde 1 arttırıp tekrar basarak basit bir scrolltext yapabilirsin.
Başlık: Bu kod neden calismaz????
Gönderen: Bakkada - 03.10.2005 09:00:29
!to "yazdir.prg"
*=$C000

start:
jsr clrscr
ldy #$c0
jsr delay
ldx #ldy #>text1
screen=$0400
jsr print
ldy #$c0
jsr delay
ldx #ldy #>text2
jsr print
ldy #$c0
jsr delay
ldx #ldy #>text3
jsr print
end:
jmp end

clrscr:
ldx #0
lda #$20
clrscrloop:
sta $0400,x
sta $0500,x
sta $0600,x
sta $0700,x
inx
bne clrscrloop
rts

delay:
ldx #0
delayloop:
dex
bne delayloop
dey
bne delayloop
rts


print:
stx printloop + 1
sty printloop + 2
ldx #0
printloop:
lda $0000,x
sta screen,x
stx $0097
ldy #$c0
jsr delay
ldx $0097
inx
cpx #14
bne printloop
rts
   
text1:
!scr "merhaba dunya "
text2:
!scr "iste geliyorum"
text3:
!scr "gumbur gumbur "


Calisanini yazdim sonunda;MAP64'den temp data area buldum. $0097 adresiymis,oraya al-ver mantigi uyguladim calisti.Yalniz aklima takildi simdi ben her cumleyi farkli satira basmak istiyorum :)
Yani screeni herseferinde farkli bir degere atamak istiyorum;
TEXT1 : screen'e
text2 : screen+40
text 3 : screen+80 'e gitsin...

jsr print komutundan once screen=$0400;screen=screen+40 denedim ama olmadi :)

Belki de ogrendiklerimiz ile simdilik bu kadarini yapabiliyoruzdur :)

Kasmaya devam yardim icin tesekkurler...
Gene sorucam kacamassiniz :P
Başlık: Bu kod neden calismaz????
Gönderen: skate - 03.10.2005 10:02:50
screen = $0400

dedikten sonra bunu screen = screen + 40 şeklinde değiştiremezsin ne yazık ki. Bunun için şunu yapman lazım.

screen = $0400

..
..
..
putscr sta screen,x
..
..
..
lda putscr+1
clc
adc #40
sta putscr+1
lda putscr+2
adc #0
sta putscr+2
..
..
..

Burda putscr adresi hafızada şu şekilde duruyor

sta $0400,x

Bu da hex codelar ile

9d 00 04

şeklinde yazılır.

9d -> sta $####,x
00 -> $0400'ün low byte'ı
04 -> $0400'ün high byte'ı

Bu durumda bizim arttırmamız gereken yer $0400'ün low byte'ı yani putscr+1

Peki ya $f0'dan sonra ne olacak? $f0 + $28 = $18 yani $0418 olur. Ancak toplamada carry flag denen bir "elde" bayrağı vardır ki adc'den önceki "clc" komutunun amacı bu bayrağı temizlemek. Çünkü o temizlenmezse toplamanın sonucu bir fazla çıkar. Örnek olarak

lda #0
adc #40

dediğimizde sonuç 40 ya da 41'dir. Tamamen carry flag'e bağlı. Ancak

lda #0
clc
adc #40

kesinlikle 40'dır. Çünkü carry flag'i temizliyoruz. Takip eden

lda putscr+2
adc #0
sta putscr+2

kısmında ise eğer bir önceki toplamada sonuç 255'i geçmediyse putscr+2 yani başlangıçta $04 olan değer değişmez. Ancak eğer sınır aşıldıysa yani $f0+$28 işleminden sonra sonuç $05 olacaktır. Bu sayede satır numaraları

$0400
$0428
$0450
$0478
$04a0
$04c8
$04f0
$0518
$0540
..
..
..
$07c0

şeklinde devam eder.

Son bir dipnot. Varsayılan ekran adresi $0400-$07e8 arasındadır. Dolayısıyla ekranı

ldx #0
lda #$20
clrscrloop:
sta $0400,x
sta $0500,x
sta $0600,x
sta $0700,x
inx
bne clrscrloop
rts

yerine

ldx #0
lda #$20
clrscrloop:
sta $0400,x
sta $0500,x
sta $0600,x
sta $06e8,x
inx
bne clrscrloop
rts

şeklinde silersen $07e8-$07ff arasını doldurmamış olursun. Bu aralıkta spriteların hafıza konumları gibi bazı önemli bilgiler mevcuttur. Bunun için yukarda düzelttiğim gibi kullanmanı tavsiye ederim.
Başlık: Bu kod neden calismaz????
Gönderen: Bakkada - 03.10.2005 11:37:31
putscr opcode'mudur??
Başlık: Bu kod neden calismaz????
Gönderen: skate - 03.10.2005 13:06:47
Alıntı
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ı.
Başlık: Bu kod neden calismaz????
Gönderen: Bakkada - 04.10.2005 17:15:06
Arkadaslar,Nightlordun dokumani no:4'u okudugumda bazi seyleri anliyamadim.Anlayamadiklarim 16 ve 24 bitlik toplama islemleri.


Su kodu yazdigimda
 
lda #1
clc
adc #2
sta $0400
 
bu kod ekranin sol ust kosesine "B" karakterini basiyor;yanilmiyorsam "2" b harfine denk geldigi icin boyle oluyor peki matematik toplama yapip  ekranin herhangi bir yerine  atamiyor muyuz?Yada ASM 'de toplama islemini ekrana bastirip ne mi yapicas :)

ama su kodu yazdigimda

lda #<1
clc
adc #<1
sta #<$00
lda #>1
adc #>1
sta #<$97

bu kod calismio.Biliorum biraz salak bi kod aslinda ama neden calismadigini bulamadim.Sanirim adresleme mantigi ile ilgili bi problem war...

16bitlik toplama ve akabinde 24 bitlik toplmama konusunda sorunlarim war mantik olarak anladim ama kod yazmaya gelince calisan kod yazamiyorum....

Hmmmm salak hissettim kendimi bir an  :angry:
Başlık: Bu kod neden calismaz????
Gönderen: Wisdom - 05.10.2005 01:02:35
Selam,

Eger tum istedigin print gibi bir islevse, kisa yoldan asagidakini kullanabilirsin:

lda #ldy #>text
jsr $ab1e      ; basic-rom print

Yok, eger istedigin bu tip seylerin arka tarafini ogrenmekse, o zaman arkadaslar sana yardimci oluyorlardir. :-)

(Tum post'u okumadim, tekrar olduysa kusura bakmayin.)

(Guney Hindistan'da gecenin 3:30'unda proje mailleri yazmaktan bikmis olup da foruma giren Wisdom'dan sevgiler.)
Başlık: Bu kod neden calismaz????
Gönderen: Bakkada - 05.10.2005 16:08:35
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.
Başlık: Bu kod neden calismaz????
Gönderen: skate - 05.10.2005 16:56:45
Alıntı
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


Kod: [Seç]
* = $0801
!byte $0b, $08, $00, $00, $9e, $32, $30, $36, $31, $00, $00, $00
!to &quot;test.prg&quot;

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 &quot;bu satir ekranin en ustunde yer alacak&quot;
!byte 0
satir2 !scr &quot;bu ise ikinci satir olacak&quot;
!byte 0
satir4 !scr &quot;bu satir dorduncu satir olarak basilacak&quot;
!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 :)
Başlık: Bu kod neden calismaz????
Gönderen: Bakkada - 05.10.2005 17:28:13
Ciktisini adim aksam ewde sakin kafayla calisicam uzerinde cok tesekkur ederim....
Başlık: Bu kod neden calismaz????
Gönderen: Bakkada - 07.10.2005 23:18:01
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.
Başlık: Bu kod neden calismaz????
Gönderen: skate - 08.10.2005 01:37:49
Normaldir bence. Bu sorun hep olur ve çözümü her zaman baştan ve/veya sondan 40 karakter boşluk bırakmaktır. Bir de scroll uzunluğu 256 karakteri geçtiği için sorun çıkabilir gerekli kontroller yapılmamışsa.

Edit: Kodu denedim, sorunsuz çalışıyor. Aklıma önceden yanlış compile etmiş olduğun, sonra kodu düzeltsen de ilk baştaki

!to

satırını yalnışlıkla

to

şekline çevirmiş olabileceğin (ünlemi silmiş olabilirsin) ve ondan sonra compile ettiğini sandığın halde compile edememiş olabilir misin? Bu da klasik bir hatadır çünkü.

Tabii diğer ihtimalde foruma copy&paste yaparken ilk ! karakterini seçmemiş olabilirsin :)
Başlık: Bu kod neden calismaz????
Gönderen: nightlord - 08.10.2005 12:15:13
Alıntı
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... :)
Başlık: Bu kod neden calismaz????
Gönderen: Bakkada - 08.10.2005 14:05:24
Gec gelen edit:

@nightlord:Abi kusura bakma sanki senin kodun yanlis gibi bi izlenim yarattim alakasi yok kesin bende bir eksiklik war ama ne onu bulamadim deliricem :(

Misal ben Pre_Intro kodunu senin yazgidin gibi yazmadim aldim onume screen shot'u ekranda ne warsa onu koda yazmaya calistim cok kusel calisio ama butun scroll text bittikten sonra ornegin logocolor icin atadigim degerleri karaktere cevirip ekrana basi ornegin logo color icin $01,$02,$01,$02,$01,$02,$01,$02 yazdiysam text bittikten sonra bababababa basio ekrana ardindan gene bidolu "C" ve garip bir karakter basio sonra hop normal texte donuo...

Ne yaptiysam yemedi...
Oturdum kodu satir satir algoritma semasina doktum normalde olmamasi lazim...

He ama sunu farkettim ben acme64 calistirdigimda sole bi hata werio:
can not use !to without a vb vb vb vb default to CBM

VB:kisimlarini hatirliyamadim....
Acaba bundan mi oluo onu kavriyamadim senin sitende bintoolsuda bulamadim NightLord hocam onnarin linkini de bi ara yapistirir misin???


Yardimlar icin tesekkurler....
Başlık: Bu kod neden calismaz????
Gönderen: nightlord - 08.10.2005 16:11:13
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)
Başlık: Bu kod neden calismaz????
Gönderen: Bakkada - 08.10.2005 19:52:03
Alıntı
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 :)
Başlık: Bu kod neden calismaz????
Gönderen: Bakkada - 08.10.2005 21:45:32
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....
Başlık: Bu kod neden calismaz????
Gönderen: skate - 08.10.2005 21:51:41
@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 :)
Başlık: Bu kod neden calismaz????
Gönderen: skate - 08.10.2005 21:58:02
Alıntı
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
Başlık: Bu kod neden calismaz????
Gönderen: Bakkada - 08.10.2005 21:58:43
Alıntı
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
Başlık: Bu kod neden calismaz????
Gönderen: nightlord - 09.10.2005 00:28:16
bakkada scroll kodu dikkat edersen c100 ile c1ff arasindaki 256 karakteri scroll ediyor. dolayisiyla hic abuk karaker gormemen icin bahsi gecen 256 adreste hic abuk karakter kodu olmamasi lazim.

yani bu adreslerde basta scroll etmesini istedigin mesajin harflerinin kodlari bulunmali. onlarin bittigi yerden itibaren c1ff'e kadar arta kalan baytlari da bosluk tusunun karakter kodu ile doldurmalisin.

benim versiyonumda yazdigim mesajdaki toplam karakter sayisi 212 oldugu icin mesajdan sonraya 44 ($2c) adte de bosluk karakteri fill ediyorum. sen farkli bir mesaj yazdigin icin senin bosluk doldurman gereken bellek miktari degisik olabilir.

ayni sebepten benim koddan son satirlari kaldirirsan fill komutunu kaldirmis olacagin icin c1d4'ten itibaren bosluk kodlari ile doldurmadigimiz bolge bilgisayar acildiginda o bellek bolgesinde default olarak hangi degerler varsa onlarla dolu kalacak. bunlar da abuk kodlar olarak gorunecek. mesela o bolge 0 ile dolu olursa 0 at isaretinin karakter kodu oldugu icin at isareti (yani senin hakli olarak garip C dedigin karakter) cikacak mesajin sonunda artan bolgede.