tr-demoscene

the scene => coding => c64 => Konuyu başlatan: stranger - 14.02.2007 14:42:30

Başlık: ipucLarI
Gönderen: stranger - 14.02.2007 14:42:30
Kucuk ama yararLI ipuclarini bir konu altinda toplasak nasIL olur? ArtIK yava$ yava$ bir haltlar karI$tIrmaya ba$LayInca detayLarada onem kazanIyor :)
 
Ornegin:
Autorun 'in mantigi nedir? $0801 vs. den ba$layan prg lar icin standart yaziyor geciyoruz fakat ornegin $1000 yada baska bir adresten ba$latmak istersek bunu nasIL hesapLayIp koyuyoruz?
 
AyrIca Hades ve NightLord'un daha once verdigi 2 ipucunuda bu konunun altina ekliyorum...
-----------------------------------------------------------
(NightLord)
EOR icin kucuk bir ipucu
A EOR B = C
ise
A EOR C = B
yani B yi (ortadakini) bulmak icin usttekini ve alttakini direk eor islemine de sokabiliriz
------------------------------------------------------------
(Hades)
Bu arada küçük bir bilgi vereyim. JSR $E544 rutininden geri dönüşte X registerinde 1 değeri bulunur. senin örneğine uyarlarsak
JSR $E544
STX $D021
haline gelir ve 2 byte tasarruf etmiş oluruz.
Başlık: ipucLarI
Gönderen: skate - 14.02.2007 16:38:25
Autorun her zaman $0801'den olur. Bu basic'in varsayılan başlangıç adresidir. Elbette ki $0801 değiştirilebilir, istenirse basic başlangıç adresi $1000 gibi adreslere alınabilir ancak bilgisayar açıldığı gibi bir program yükletilip çalıştırılıyorsa, bu her zaman $0801'den olur. $0801 öncesi bazı yükleme adresleri kullanılarak istisnai trickler yapılabiliyor ancak bunun şu an için bir önemi yok.
 
Olay şu ki yüklenen bir program çalıştırılırken "run" yazmak yerine "sys X" şeklinde çalıştırıldığında yükleme adresinin hiçbir önemi kalmıyor. Ancak X sabit olmadığı için kolaylık olarak biz basic'den
 
0 sys X
 
gibi bir basic satırı yazıyor ve programı böyle kaydediyoruz. Sonuç olarak da program "run" denildiğinde o sys satırı sayesinde doğrudan çalışıyor.
 
şimdi vice açalım ve
 
0 sys2061
 
yazıp enter'a basalım ve monitöre girip
 
m 0801
 
yazalım. sonuç şu şekilde olacaktır.
 
Kod: [Seç]
>C:0801  0b 08 00 00  9e 32 30 36  31 00 00 00   .....2061...
Burdaki "0b 08" basic satırının bitiş adresi, devamındaki "00 00" 16 bitlik satır numarasıdır (burada 0 kullandık). Ardından gelen "9e" sys komutu devamındaki "32 30 36 31" ise 2061'in rakamlarının ekran kodlarıdır. Basic'in bitiminde 3 adet sıfır olması gerekmektedir. Bu durumda
 
0b 08 00 00 9e 32 30 36 31 00 00 00 = 0 sys 2061 oluyor.
 
Autostart olayı bundan ibaret. ASM kodlarının içine basic gömmek kolay olmadığı için biz de byteları ekliyoruz kodun başına. Hades'in yaptığı gibi "32 30 36 31" olduğu alana !text "2061" de yazabilirsiniz. Bu da pratik bir kullanım.
 
şimdi gelelim asıl ipucuna. Sonda 3 adet 0 byteı olmak zorunda dedik ya. Aslında 3 bytedan yalnızca ilk ve son byte 0 olmak zorunda, ortadaki byte değişebiliyor. Bu durumda ordataki byte'a örneğin $a9 değeri verir ve sys'yi de iki byte geriye yönlendirirsek kodun ilk satırını lda #$00 şeklinde kullanmış oluruz. Benzer şekilde $a0 ve $a2 ile ldx#$00 ve ldy#$00 şeklinde kullanmamız mümkün.
 
0b 08 00 00 9e 32 30 35 39 00 a9 00 = 0 sys 2059
 
Bu kod bold olan byte'a jmplar ki o da 2061'e geldiğimizde accumulator'ü sıfırlamış olur.
Başlık: ipucLarI
Gönderen: skate - 14.02.2007 16:49:31
şu basic'deki ilk iki byte'ı düzgün anlatabilmek için birkaç kere editlemem gerekti. En son ayrı bir açıklayıcı post atiim dedim :)
 
$0801 ve $0802'de yer alan ilk iki byte her satırın başında mevcut ve bir sonraki satırın başlangıç adresini gösteriyor. Eğer bu adreslerde sıfırları görürse basic satırlarının sona erdiğini algılıyor.
Başlık: ipucLarI
Gönderen: stranger - 14.02.2007 18:16:24
Ben autostart derken yanLI$ telafuz etmi$im oLayI. $1000 den ba$Layan asm code'u run ile caLI$tIrma diyecektim ornek oLarak. Ama yine o kadar acIKca anLatmI$sIn ki bu konu hakkIndaki tum merak ettiklerimi ogrendim.
:) Hemen uygulamayI da a$agIda gorelim... Te$ekkurler .....
 
!to"startdeneme.prg",cbm
*=$0801
!byte $0b,$08,$00,$00,$9e,$34,$30,$39,$36,$00,$00,$00
*=$1000
jsr$e544
ldx#$01
stx$0400
rts
Başlık: ipucLarI
Gönderen: GnoStiC - 14.02.2007 18:41:23
ama burda 0801'de;

00 01 00 olmuyo.. (eger 01 in bir instruction karsiligi yok ise tabi)
oraya bir instruction koyup yanindaki 00 degerini yukletmis oluyorsun. ornegin skate'in verdigi ornekteki gibi
00 a9 00  = lda 00

(en azindan ben oyle anladim)

Alıntı yapılan: stranger
Hatta: :)
 
!to"startdeneme.prg",cbm
*=$0801
!byte $0b,$08,$00,$00,$9e,$34,$30,$39,$36,$00,$01,$00
*=$1000
jsr$e544
;-----ldx#$01
stx$0400
rts
Başlık: ipucLarI
Gönderen: stranger - 14.02.2007 18:46:53
Evet hakLIsIn. AtLamI$Im 2. bolumu sildim. Bu arada caktIrmadan bir c64 coding e yonelme durumun var mI karde$im? :)
Başlık: ipucLarI
Gönderen: spaztica - 14.02.2007 19:28:44
ben de skate'in kaldığı yerden ufak bi teknik vereyim...

EOR demişti... EOR'un kullanım alanlarından biri de delta-bitplane -yani 2 bitplane arasında fark dosyası- yaratmakta kullanabilirsiniz. şöyle ki, 2 bitplane birbirine çok yakınsa bunları EOR'ladığınızda bu iki bitplane arasındaki fark eden bitlerin 1 olduğu bol 0'lı ek bir bitplane elde edersiniz. bol 0'lı bir bitplane, hafızada çok daha az yer tutar. ilk frame'i olduğu gibi kaydettikten sonra, her eklenen frame'i bir öncekine göre delta'sını hafızada çıkartıp bunları geri oluşturabilirsiniz.

bu teknik, amiga'da bol frame'li pre-rendered grafikleri göstermek için kullanılmıştı bazı demolarda...

tabii pc'lerde imaj olayı bitplane değil, renk datası şeklinde olduğu için bunun kullanımı pratik olmayabilir. amiga'da (normalde max 5) her bitplane'in kombinasyonu, renk kodlarını oluştururdu...
Başlık: ipucLarI
Gönderen: GnoStiC - 15.02.2007 00:12:22
olur oyle bazen :)
c64 coding olayim yok, sadece yazilanlari okumayi seviyom ;)

bu arada bu gidisle izmirde degilde istanbulda buluscaz seninle :D

Alıntı yapılan: stranger
Evet hakLIsIn. AtLamI$Im 2. bolumu sildim. Bu arada caktIrmadan bir c64 coding e yonelme durumun var mI karde$im? :)
Başlık: ipucLarI
Gönderen: skate - 15.02.2007 09:35:41
Alıntı yapılan: spaztica
ben de skate'in kaldığı yerden ufak bi teknik vereyim...

EOR demişti... EOR'un kullanım alanlarından biri de delta-bitplane -yani 2 bitplane arasında fark dosyası- yaratmakta kullanabilirsiniz. şöyle ki, 2 bitplane birbirine çok yakınsa bunları EOR'ladığınızda bu iki bitplane arasındaki fark eden bitlerin 1 olduğu bol 0'lı ek bir bitplane elde edersiniz. bol 0'lı bir bitplane, hafızada çok daha az yer tutar. ilk frame'i olduğu gibi kaydettikten sonra, her eklenen frame'i bir öncekine göre delta'sını hafızada çıkartıp bunları geri oluşturabilirsiniz.

bu teknik, amiga'da bol frame'li pre-rendered grafikleri göstermek için kullanılmıştı bazı demolarda...

tabii pc'lerde imaj olayı bitplane değil, renk datası şeklinde olduğu için bunun kullanımı pratik olmayabilir. amiga'da (normalde max 5) her bitplane'in kombinasyonu, renk kodlarını oluştururdu...
Vaays, güzel teknikmiş. Commodore 64'de pek bu tür şeyler kullanılmadığı için (belki de kullanılıyordu da ben bilmiyordum) ve PC'de de genellikle bu kadar low level takılınmadığı için (?fersah fersah memory error) bu tekniği duymamıştım bile. Amiga kesinlikle atlanmaması gereken bir aletmiş. Neyse ki sonunda giriyorum ucundan bucağından Amiga codinge. Spaztica, Gnostic, Vigo, Endo ve diğer Amiga coderlarının hepsini arkamda hissediyorum bu konuda. Çok gay bir his gerçi :p
 
P.S: Herhangi bir commodore demosunda precalc frame sıkıştırma için spaztica'nın bahsettiği tekniği kullanmış demo biliyor musunuz?
Başlık: ipucLarI
Gönderen: vigo - 15.02.2007 14:00:36
evet... delta-compression.... trsi - animatron (#3 @ bp06)
Başlık: ipucLarI
Gönderen: skate - 15.02.2007 14:10:08
hmmm. emin misin aynı şey olduğundan vigo kardeş? çünkü animatron gayet multicolor ve 64'de bitplaneler de yok. tek tek tüm renk kanallarını orlamaya falan da zaman yetmez gibi geliyor bana. sanki animatronda biraz daha mpegvari bir sıkıştırma kullanılmış gibi geldi bana.
Başlık: ipucLarI
Gönderen: vigo - 15.02.2007 16:52:36
:) eminim... benson/trsi yazdı delta-com algortimasını... hatta streettuff a da sorabilirsin... neticede bende onlardan duyduumu sölüyorum... code'u inceleyerek sölemiş diilim...
Başlık: ipucLarI
Gönderen: skate - 15.02.2007 17:37:38
tamam delta compression olabilir de acaba eor mu kullanıyor deltayı bulmak için? bir ara rastlaşırsam nette sorarım amcamlara :)
Başlık: ipucLarI
Gönderen: stranger - 20.02.2007 20:55:17
irq olu$tururken
 
jmp$ea81 'den baska, basic'le de oyna$mak icin $ea31 kuLLanIyoruz.
 
Bunlarin yaninda skate'de $ea7e kuLLanmakta. Hangisini kuLLanmamIz caizdir?  :)
Başlık: ipucLarI
Gönderen: skate - 20.02.2007 22:57:25
hepsi de caizdir. $ea7e'nin $ea81'den tek farkı fazladan bir "lda $dc0d" komutu çalıştırmasıdır. CIA timerına acknowledge atmak gibi fazladan bir işlem yapıyorsun. Zamanlamaların daha iyi olduğunu gözlemlediğim için $ea7e kullanıyorum, yoksa teknik detayına çok girmedim.
 
$ea7e ve $ea81 bundan ibaret
 
$ea7e
lda $dc0d
$ea81
PLA
TAY
PLA
TAX
PLA
RTI
 
aslında hiç JMP kullanmadan doğrudan
 
PLA
TAY
PLA
TAX
PLA
RTI
 
yazarsanız jmp $ea81 demiş olursunuz. bunun başına bir de LDA $dc0d eklerseniz jmp $ea7e demiş olursunuz. ıkisi de hemen hemen aynı kapıya çıkıyor.
Başlık: ipucLarI
Gönderen: ghost - 21.02.2007 00:24:04
haraket tespit eden guvenlik kameralari da ayni yontemi kullanir.

edit: eor icin dediydim.
Başlık: ipucLarI
Gönderen: hades - 21.02.2007 00:39:12
ben daha seksi olduğu için  JMP $FEBC  kullanıyorum. $EA81'in aynısı :)
Başlık: noter 'de space sorunu
Gönderen: stranger - 14.03.2007 19:02:59
Ufak bir noter yazIyorum.
Muzik vs de ekleyecegim icin interrupt kuLLanIyorum.
Sorun $u ki sayfaLar space tu$uyLa gecilecek...
Fakat space 'e basar basmaz hIzdan doLaYI 2-3 sayfa birden atLIyor.
HIzdan doLayI oLdugunu nerden biliyorum? Vice'da hIzI %20 ye falan dusurunce normaL caLIsIyor ve tum sayfaLarI gosteriyor.
 
$028b 'i de ke$fettim :) akumulatore #$ff (veya herhangi yuksek bir deger) yukleyince 2.kez tu$ tekrarInI bir sure askIya aLIyor fakat irq den sanIrIm $028b de devre dI$I kaLIyor.
 
Mesela source'a benzer kIsa bir ornek vermek gerekirse soyle bi$ey:
 
($u an ekrana text'leride surekli basIyor fakat sayfa atLama sorununu cozunce tekrar basmayI hallederim herhalde)
 
!to"note.prg",cbm
*=$0801
!byte $0b,$08,$00,$00,$9e,$32,$30,$36,$31,$00,$00,$00
*=$080d
renk=$d800
ekran=$400
lda#$01
sta$0286
lda#$00
sta$d020
sta$d021
lda#$ff
sta$028b
lda#$01
sta sayfa
jsr$e544
sei
lda#$7f
sta$dc0d
lda#$00
sta$dc0e
lda#$01
sta$d01a
lda#$1b
sta$d011
lda#$80
sta$d012
lda#sta$0314
lda#>int
sta$0315
cli
rts
int:
inc$d019
jsr anarutin
 
jmp$ea81
 
 
anarutin:
 
lda sayfa
cmp#$01
beq sayfa1
cmp#$02
beq sayfa2
cmp#$03
beq sayfa3
rts
 
sayfa1:
 
ldx#$00
lda#$00
textloop:
 
lda text+$0,x
sta ekran+$0,x
 
inx
cpx#$ff
bne textloop
 
lda$dc01
cmp#$ef
beq sayfa2
jmp irqson
 
sayfa2:
lda#$02
sta sayfa
ldx#$00
lda#$00
textloop2:
 
lda texta+$0,x
sta ekran+$0,x
 
inx
cpx#$ff
bne textloop2
lda$dc01
cmp#$ef
beq sayfa3
jmp irqson
 
sayfa3:
lda#$03
sta sayfa
ldx#$00
lda#$00
textloop3:
 
lda textb+$0,x
sta ekran+$0,x
 
 
inx
cpx#$ff
bne textloop3
lda$dc01
cmp#$ef
beq sayfa3
jmp irqson
 
 
irqson:
rts
sayfa:
!byte $00
text:
!scr "1111111111111111111111111111111111111111"
!scr "1111111111111111111111111111111111111111"
!scr "1111111111111111111111111111111111111111"
!scr "1111111111111111111111111111111111111111"
!scr "1111111111111111111111111111111111111111"
!scr "1111111111111111111111111111111111111111"
!scr "1111111111111111"
 
texta:
!scr "2222222222222222222222222222222222222222"
!scr "2222222222222222222222222222222222222222"
!scr "2222222222222222222222222222222222222222"
!scr "2222222222222222222222222222222222222222"
!scr "2222222222222222222222222222222222222222"
!scr "2222222222222222222222222222222222222222"
!scr "2222222222222222"
 
textb:
!scr "3333333333333333333333333333333333333333"
!scr "3333333333333333333333333333333333333333"
!scr "3333333333333333333333333333333333333333"
!scr "3333333333333333333333333333333333333333"
!scr "3333333333333333333333333333333333333333"
!scr "3333333333333333333333333333333333333333"
!scr "3333333333333333"
Başlık: ipucLarI
Gönderen: nightlord - 14.03.2007 19:56:01
@stranger: Aklıma gelen iki olasi çözüm var. Ama konuyu biraz geniş bir açıdan ele alacağım.
 
şimdi karşılaştığın probleme dikkatlice bakacak olursan aslında kodda hata olmadığını göreceksin. Bu karşılaştığın bir "Spesifikasyon problemi".
 
Yazılım geliştirirken yazdığımız programın ne yapacağını açıklayan bilgi bütününe spesifikasyon (kısaca spek) diyoruz. Çoğu zaman problemler (istatistiksel olarak projelerde çıkan bugların %40 - %60'ı ) spesifikasyon hatalarından kaynaklanıyor.
 
Spesifikasyon her zaman yazılı bir doküman olmak zorunda değil. Fakat birden fazla kişi çalışıyor ise veya yapıma zaman zaman ara veriliyorsa spek'i kağıda dökmek iyi bir fikir olabilir. Spek yazan kişilerin tecrübesi arttıkça bazı spek hatalarını daha kod yazmadan bulabilmeye başlarlar.
 
Spek yazılımın türüne göre farklı haller alabilir. Bir demo için storyboard veya script, bir oyun için game design doc veya bir iş yazılımı için gui tasarımlarını gösteren bir ppt sunumu olabilir.
 
şimdi senin spek'inde bir eksiklik var: Sayfalar arası geçişin nasıl olacağı tam açıklanmamış. "Space tuşuna basınca sonraki sayfaya geçilecek" yeterli bir spek değil. Space tuşuna basılı tutunca ne olacak bunun da cevaplanması lazım. Örneğin;
 
- Space'e basınca yeni sayfaya geçilecek ve Space' basılı tuttukça birşey olmayacak. Ancak kullanıcı Space'ten elini çekip yeniden basarsa bir sonraki sayfaya geçecek.
 
veya;
 
- Space'e basılı tutulduğu müddetçe her saniyede bir kere sonraki sayfaya geçecek.
 
gibi...
 
Dolayısıyla programin nasil davranacagina dair kararini detaylandirman lazim once. Eğer birinci spek'i seçersen o zaman space tuşunun basılmışlık durumunu takip eden küçük bir durum motoru eklemen gerekecek:
 
space_durumunu_takip_et:
 
lda space_durumu
cmp #SPACE_BASILI_DURUMDA
beq space_basili_durumdayken
jmp space_basilmamis_durumdayken
 
space_basili_durumdayken:
 
lda $dc01
cmp #DC01_SPACE_BASILI
bne el_spaceten_kalkti
rts
 
el_spaceten_kalkti:
 
lda #SPACE_BASILI_DURUMDA_DEGIL
sta space_durumu
rts
 
space_basilmamis_durumdayken:
 
lda $dc01
cmp #DC01_SPACE_BASILI
beq el_space_e_basti
rts
 
el_space_e_basti:
lda #SPACE_BASILI_DURUMDA
sta space_durumu
lda #YENI_SAYFA_ISTEGI ;--------------burasi yeni sayfa istegi
sta sayfa_istegi
rts
 
sonra senin kodunda:
inx
cpx#$ff
bne textloop
 
lda$dc01
cmp#$ef
beq sayfa2
jmp irqson
 
bölgesinde şu şekilde yeni sayfa kontrolünü değiştirebiliriz:
 
inx
cpx#$ff
bne textloop
 
;degisen bolum
lda sayfa_istegi
cmp #YENI_SAYFA_ISTEGI
bne irqson
lda #$02
sta sayfa
lda #0
sta sayfa_istegi ;sayfa istegini tekrar sifirliyoruz ki surekli sayfa degismesin
jmp irqson
 
 
Ayrıca interrupt rutininin başında da
 
jsr space_durumunu_takip_et
 
ekliyoruz.
-----------------
 
Eğer ikinci yolu seçersen o zaman sayfa değişikliği yaptığın anda bşr sayaç başlatıp o sayaç istediğin değere gelene kadar space kontrolünü kaldırabilirsin. Bu iki tane sayfa değişikliği arasına minimum bir süre katmaya yarar. Örnek kod vermiyorum... Sana bırakıyorum:)
 
sevgiler
Başlık: ipucLarI
Gönderen: skate - 14.03.2007 20:14:21
Ben de hızlı bir örnek hazırlamıştım, gerçi nightlord güzel bir cevap atmış bu arada. Counter kullanan örnek olarak al kardeşim. Bu arada sayfaların başlangıçları için de pointer kullandım. Biraz incelersen anlayacağından eminim. Anlayamadığın yer olursa sorman yeterli.
 
Kod: [Seç]
!to"note.prg",cbm
*=$0801
!byte $0b,$08,$00,$00,$9e,$32,$30,$36,$31,$00,$00,$00
*=$080d
renk=$d800
ekran=$400
lda#$01
sta$0286
lda#$00
sta$d020
sta$d021
lda#$ff
sta$028b
lda #$00
sta sayfa
jsr $e544
ldx sayfa
jsr sayfabas
sei
lda#$7f
sta$dc0d
lda#$00
sta$dc0e
lda#$01
sta$d01a
lda#$1b
sta$d011
lda#$80
sta$d012
lda#<int
sta$0314
lda#>int
sta$0315
cli
jmp *
int:
inc$d019
jsr anarutin
jmp$ea81

anarutin:
lda counter
beq passinccnt
dec counter
jmp irqson
passinccnt:
lda $dc01
cmp #$ef
bne irqson
lda counter
bne irqson
lda #15
sta counter
ldx sayfa
jsr sayfabas
irqson:
rts
sayfabas:
lda textpl,x
sta textloop+1
lda textph,x
sta textloop+2
ldx #$00
textloop:
lda $0000,x
sta ekran+$0,x
inx
cpx#$ff
bne textloop
inc sayfa
lda sayfa
cmp #3
bne sbout
lda #0
sta sayfa
sbout:
rts
textpl !byte <text,<texta,<textb
textph !byte >text,>texta,>textb
sayfa:
!byte $00
counter:
!byte $00
text:
!scr &quot;1111111111111111111111111111111111111111&quot;
!scr &quot;1111111111111111111111111111111111111111&quot;
!scr &quot;1111111111111111111111111111111111111111&quot;
!scr &quot;1111111111111111111111111111111111111111&quot;
!scr &quot;1111111111111111111111111111111111111111&quot;
!scr &quot;1111111111111111111111111111111111111111&quot;
!scr &quot;1111111111111111&quot;
texta:
!scr &quot;2222222222222222222222222222222222222222&quot;
!scr &quot;2222222222222222222222222222222222222222&quot;
!scr &quot;2222222222222222222222222222222222222222&quot;
!scr &quot;2222222222222222222222222222222222222222&quot;
!scr &quot;2222222222222222222222222222222222222222&quot;
!scr &quot;2222222222222222222222222222222222222222&quot;
!scr &quot;2222222222222222&quot;
textb:
!scr &quot;3333333333333333333333333333333333333333&quot;
!scr &quot;3333333333333333333333333333333333333333&quot;
!scr &quot;3333333333333333333333333333333333333333&quot;
!scr &quot;3333333333333333333333333333333333333333&quot;
!scr &quot;3333333333333333333333333333333333333333&quot;
!scr &quot;3333333333333333333333333333333333333333&quot;
!scr &quot;3333333333333333&quot;
Başlık: ipucLarI
Gönderen: endo - 15.03.2007 11:44:40
Programin basinda tum ayarlari yapip bitirdikten sonra

CLI
RTS

yerine

CLI
JMP *

kullanman daha iyi olur. Yoksa ekranin bi yerlerinde READY. yazisi belirebilir.
Ayrica soyle bir yol da izleyebilirsin.

Initalizasyonlari yap (Interruptlari ayarla, ekran rengi vs.)
CLI ile interruptlari ac
Space tusu ve ekrana yeni sayfa gelmesi olayini donguye sok.
Interrupt icinde de sadece muzik cal ve varsa raster-bar felan cizdir.

Boylece interrupti sadece muzik vs icin kullanirken interrupt disinda da tus kontrolu ve ekran cizimini yaparsin. Tus kontrolunu de asagidaki gibi yapabilirsin bu durumda:

;space kontrolu
lda #$ef
cmp $dc01
bne *-3        ;space'i bekle
cmp $dc01
beq *-3        ;basili oldugu surece bekle
;sonraki sayfa

Eger bu isi interruprt icinde yaparsan space'e basili tutuldugu surece muzik vs. hersey durur. Biraz ekstra ugras gerektirir interrupti kitlemeden bekletmek icin (space tus durumunu bi yerlere yazip son durumu kontrol etmek gibi.)
Başlık: ipucLarI
Gönderen: endo - 15.03.2007 11:48:45
ya bi de 64 ile ilgili boyle guzel soru felan gelince uzun guzel cevaplar yazilmasi cok hos :) elinize saglik nightlord & skate. ve tabii stranger ;)
Başlık: ipucLarI
Gönderen: stranger - 15.03.2007 17:57:24
nightlord,skate ve endo 1 cozum ararken 3 ayrI cozum yoLu gormu$ oldum. cok te$ekkurler. AsLInda bayagI ugra$tIm bu oLayI cozmek icin fakat yemedi maalesef :) simdi hepsini ayrI ayrI uygulayacagIm.
 
AsLInda nerdeyse elle tutulacak birkac $ey  yapmaya ba$LadIm fakat boyle ufak gozuken bir sorunu cozemeyince cinnet gecirip foruma post attIm :) cevaplarIn hepsi icin sagolun.(bu soru kac cycle yedi bilmiyorum ) UmarIm cok fazla zamanInIzı yememi$tir. ,)
 
endo jmp* 'I soyledigin cok iyi oldu. Bende $d80x ile ready'i arkaplan rengine cevirip ulan nasIL kurtulcaz bu meretten diye cILdIrIyordum :)
Başlık: ipucLarI
Gönderen: endo - 15.03.2007 18:03:27
Alıntı yapılan: stranger;13118
nightlord,skate ve endo 1 cozum ararken 3 ayrI cozum yoLu gormu$ oldum. cok te$ekkurler. AsLInda bayagI ugra$tIm bu oLayI cozmek icin fakat yemedi maalesef :) simdi hepsini ayrI ayrI uygulayacagIm.
 
AsLInda nerdeyse elle tutulacak birkac $ey  yapmaya ba$LadIm fakat boyle ufak gozuken bir sorunu cozemeyince cinnet gecirip foruma post attIm :) cevaplarIn hepsi icin sagolun.(bu soru kac cycle yedi bilmiyorum ) UmarIm cok fazla zamanInIzı yememi$tir. ,)
 
endo jmp* 'I soyledigin cok iyi oldu. Bende $d80x ile ready'i arkaplan rengine cevirip ulan nasIL kurtulcaz bu meretten diye cILdIrIyordum :)


genelde en uzun sure cozulemeyen, cok vakit alan ya da sac-bas yoldurtan konular boyle ufak seylerdir (en azindan benim icin oyle olmustur genelde :) )

diledigin kadar soru sorabilirsin sevgili dostum, eminim buradaki herkes zevkle yaziyor bu cevaplari. sonucta ayni dili konusuyoruz (6502 assembly :D ... ayyy igrencti :o)
Başlık: ipucLarI
Gönderen: stranger - 13.11.2009 12:37:03
Coding bolumunun eskilerini okurken cevap olarak eksik bıraktıgım bir konu yakaladım. Endo'nun bahsettiği Interrupt'u kilitlemeden kontrol olayını denemek için yazdığım rutin. Ipuçlarında bulunsun, zamanında bende sormuşum...
 
!to"intkey.prg",cbm
 
ekran=$0400
ekran1=$0402
 
*=$2000 ;sys8192
 
jsr$e544
ldx#$00
 
.yazidongu
lda yazi,x
sta ekran1,x
inx
cpx#5
bne .yazidongu
ldx#$00
ldy#$00
 
;interrupt rutini
sei
lda #$7f
sta $dc0d
lda $d01a
ora #$01
sta $d01a
lda $d011
and #$7f
sta $d011
lda #$05
sta $d012
lda #sta $0314
lda #>irq1
sta $0315
cli
jmp*
 
irq1:
jsr .anarutin
jsr .renk
lda#$01
sta$d019
jmp$ea7e
 
.anarutin:
lda spacedurumu
cmp#$01
beq spacebasili
lda$dc01
cmp#$ef
beq spacebasildi
cmp#$ff
beq spacebasilidegil
rts
 
spacebasildi:
lda#$01
sta spacedurumu
rts
 
spacebasili:
lda$dc01
cmp#$ff
beq spacedenelkalkti
rts
 
spacedenelkalkti:
lda#$00
sta spacedurumu
jmp sayfadegis
 
spacebasilidegil:
rts
 
sayfadegis:
lda sayacx
tax
lda sayaclo,x
clc
adc#$30
sta ekran+1
lda sayacy
tay
lda sayachi,y
clc
adc#$30
sta ekran
inc sayacx
ldx sayacx
cpx#10
beq hiart
rts
 
hiart:
lda#$00
sta sayacx
inc sayacy
rts
 
.renk:
inc$d020
rts
 
sayaclo:
!byte 0,1,2,3,4,5,6,7,8,9
sayachi:
!byte 0,1,2,3,4,5,6,7,8,9
 
yazi:
!scr"space"
 
spacedurumu:
!byte $00
 
sayacx:
!byte $00
 
sayacy:
!byte $00
Başlık: ipucLarI
Gönderen: skate - 13.11.2009 14:07:57
Stranger benim başaramadığımı başardı. Ben de birkaç sene önce Amiga codinge sarmıştım ancak Stranger'ın Commodore'da ilerlediğinin onda biri kadar ilerleyemedim, helal olsun kardeşime. :)
 
p.s: Joker'i de atlamamak lazım. Son zamanların 2 canavar adayı Commodore 64 coderları oldular.
Başlık: ipucLarI
Gönderen: stranger - 13.11.2009 14:49:48
Skatecim grafiker ve organizer olarak yılların verdiği hırs. Intro yaptırmak için grubun coder'larının  peşinde koşmakla geçen bir ömürden sonra :)
Başlık: ipucLarI
Gönderen: joker_ - 13.11.2009 14:59:12
Alıntı yapılan: skate;21797
Stranger benim başaramadığımı başardı. Ben de birkaç sene önce Amiga codinge sarmıştım ancak Stranger'ın Commodore'da ilerlediğinin onda biri kadar ilerleyemedim, helal olsun kardeşime. :)
 
p.s: Joker'i de atlamamak lazım. Son zamanların 2 canavar adayı Commodore 64 coderları oldular.

skate aslında bu tek başına olabilecek şey değil,sizlerin büyük yardımlarıyla olan bir şey.:) (şey kısmına uyacak kelime bir türlü bulamadım:D)
Başlık: ipucLarI
Gönderen: vigo - 19.11.2009 14:34:04
analog grubu parti release'i için hummalı bi şekilde çalışıyormuş... böyle bi duyum aldım
Başlık: ipucLarI
Gönderen: stranger - 19.11.2009 16:20:08
(Cem Yılmaz ve Yılan diyalogu)
Bize öyle bir bilgi gelmedi... :D
Başlık: ipucLarI
Gönderen: ozayturay - 06.02.2012 18:51:37
Alıntı yapılan: skate;12401
$0801 öncesi bazı yükleme adresleri kullanılarak istisnai trickler yapılabiliyor ancak bunun şu an için bir önemi yok.

Öğrenmek amaçlı bir kaynak kodu (http://noname.c64.org/csdb/release/?id=95870) okurken 6 baytlık bir autostart koduna denk geldim, bu da burada bulunsun 256b için işe yarayabilir. :)

Kod: [Seç]
!to &quot;256b-minboot.prg&quot;,cbm

* = $0326    

!word start
!byte $ed,$f6

start:
    ;programı buraya yazın

256 bayt bile size fazla geliyorsa 6 bayt harcamanın en güzel yolu. :P
Başlık: ipucLarI
Gönderen: skate - 07.02.2012 09:44:03
http://noname.c64.org/csdb/release/?id=103840

Burada bu 6 byte'ı 4 byte olarak kullanıyorum. $f6 ya da $ff olmak durumunda sondaki byte ancak $ed olan byte değişebiliyor. Dolayısıyla şu çalışıyor örneğin;

Kod: [Seç]
!to &quot;tricky.prg&quot;,cbm

* = $0326    

!word start
start:
lda #$f6 ; ya da $ff
...

Aklınızda bulunsun.

En fazla 18-19 byte civarı kod yazacaksanız $007e trickini de kullanabilirsiniz.

18 byte örneği (load address hariç):

Kod: [Seç]
!to "very_short_1.prg",cbm

* = $7e
loop
 inc $d020
 inc $d021
 inc $d020
 inc $d021
 inc $d020
 jmp loop

19 byte örneği (load address hariç):

 
Kod: [Seç]
!to "very_short_2.prg",cbm

* = $7e
loop
 inc $d020
 inc $d021
 inc $d020
 inc $d021
 inc $d020
 nop
 nop
 bcs loop

ılk örnek 19 byte olarak kullanıldığında sondaki jmp'ın high byte adresi bozuluyor ancak ikinci örnekte aynı adresteki byte bozulmuyor. Yani biraz kullandığınız opcodelara göre de maksimum sınırınız değişebiliyor. Çok sakat ve aşırı sınırlı bir autorun yöntemidir ancak $0326'ya göre 4 byte daha kısa, benim kullandığım $0326 trickine göre de 2 byte daha kısa sonuç verir, load address harici hiç byte harcamaz.