tr-demoscene
the scene => coding => c64 => Konuyu başlatan: stranger - 29.12.2006 16:02:44
-
Bu bolum uzun zamandir ragbet gormemis. Bi sekilde c64 coding bolumunu canlandirmak mumkun mudur? Nette turkce kaynakta yok denecek kadar az zaten. Burdaki babalar ufak tefek rutinlerini aciklamalariyla buraya atsa bunlar burada toplansa guzel bir eser olur kanaatindeyim.
Nightlord zamaninda bu ise kalkismis gordugum kadariyla ....
Emulatorler sayesinde su anda dunyada olmadigi kadar c64 kullanicisi oldugunu dusunuyorum. Belki 3-5 kisi daha kazanir scene imiz.
-
benim gordugum tum c64 code'lari birbirinin ayni;
lda
sta
ldx
stx
nasil olupta farkli seyler ekrana cikiyor cok ilginc.. :}
saka bi yana, c64'e olan tek merakim demo izlemek olmasina ragmen (ki hep derim hak ettikleri degeri veremiyorum c64 demolarina), coding'i hakkinda birseyler bende ogrenmek isterim burada yazacaginiz seyler sayesinde..
-
soyle cok uzun cevap gerektirmeyen bi tip ne atilabilir diye dusundum ve su geldi aklima: adim adim optimizasyon ornegi
mesela elinizde yapmaniz gereken matematiksel bi islem var. yani bi fonksiyon. iki arguman alip bi sonuc veriyo olsun mesela.
f(a,b) = 2sin a + ab + bcosa
gibi bisey.
bunu hesaplamak icin nasil bi kod yazmali. hemen dikkatimizi ceken sin, cos ve carpma islemleri var ki bunlarin c64 ile kolay olmayacagini biliyoruz. mesela sinus'u ele alalim
g(a)= sin a
aslinda bu da bi fonksiyon ve tek arguman aliyor.
1.KURAL: c64'te karsiniza tek arguman alan bi fonksiyon siktiginda hemen TABLO yapin.
tabi bu argumanin araligina da bagli mesela x bir bayt ise (mesela fixed point olarak -1/128, +1/127 araligindaysa) hemen butun x degerleri icin sinx hesaplanip bi tabloya konacak ve oradan okunacak yani g(x) codu
ldx a
lda gSinTable,x
boylece 7-8 cycle icinde sin hesapladik
Ayni seyi cos a icinde tablo hazirlayarak tekrarlayacagimizi soylememe gerek yok herhalde :)
CARPMA:
bunu anlatmasi uzun surer. birkac degisik method var ama bunlar su an benim amacim acisindan onemsiz. diyelim ki bi sekilde bu iki sayiyi carpan bi rutin yazdiniz. aslinda carpma islemi de bi fonksiyon. iki arguman aliyor
h(a,b) = a * b
2.KURAL: c64'te karsiniza iki arguman alan fonksiyon cikarsa input argumanlarinin araligina (alabilecekleri farkli deger sayisina) bakin. Eger bu araliklarin butun kombinasyonlari kadar bayti harcamayi goze alabilecekseniz tablo yapin. mesela a ve b $40 farkli deger alabiliyorsa. ikisi toplam $1000 farkli deger alabilir. boyle bi bellegi harcamayi goze alabiliyorsaniz (demo kodluyorsaniz almalisiniz) tablo hazirlayin. bellekte
gTablo:
h(0,1)
h(0,2)
...
h(0, 63)
h(1,0)
h(1,1)
...
h(1,63)
...
...
...
h(63, 62)
h(63, 63)
seklinde bi tabloyu hazirladiktan sonra ikinci bi tablo daha hazirlayin
gTabloReadLo:
$00, $40, $80, $c0
$00, $40, $80, $c0
...
$00, $40, $80, $c0
(16 satir)
gTabloReadHi:
gTablo_hi + $00, gTablo_hi + $00, gTablo_hi + $00, gTablo_hi + $00
gTablo_hi + $01, gTablo_hi + $01, gTablo_hi + $01, gTablo_hi + $01
gTablo_hi + $02, gTablo_hi + $02, gTablo_hi + $02, gTablo_hi + $02
...
gTablo_hi + $0f, gTablo_hi + $0f, gTablo_hi + $0f, gTablo_hi + $0f
ve son olarak code:
ldx a
lda gTabloReadLo,a
sta aReader + 1
lda gTabloReadHi,a
sta aReader + 2
ldx b
aReader:
lda $0000,x
boylece 22-24 cycle da carpma yapilabilir. Aslinda 16 cycle da baska methodlarla carpma yapmak mumkun ama geciniz su an o onemli degil.
boylece son kod soyle bisey olur en bastaki fonksiyon icin
;; f(a,b) = 2sin a + ab + bcosa
ldx a
lda gSinTable, x
asl
sta lTemp1
lda gCosTable,x
sta lTemp2
lda gMulTabLo,x
sta aMulReader + 1
lda gMulTabHi,x
sta aMulReader + 2
ldy b
aMulReader:
lda $0000,y
sta lTemp3
;; b * cos x, cosx is in temp2 b in Y register
lda gMulTabLo,y
sta aMulReader2 + 1
lda gMulTabHi,y
sta aMulReader2 + 2
ldx lTemp2
aMulReader2:
lda $0000,x
clc
adc lTemp1
clc
adc lTemp3
simdi tam hesaplayamayacagim ama bu kadar optimizasyondan sonra 100 cycle civarina boyle complex bi hesaplamayi kotarmak mumkun.
Daha iyisi olabilir mi
3. KURAL: Fonksiyonlari birlestirebildiginiz yerlerde birlestirip tek tablo yapin.
yani sin icin 1 cos icin 1 ve carpma icin bir tablo yapacaginiza f(a,b) icin bir tablo yapin. yani bellege her a,b cifti icin f(a,b)nin tamamini hesaplayip onu koyun ve bir seferde tablodan okuyun
ldx a
lda gMyFxTableReadLo,x
sta aReader + 1
lda gMyFxTableReadHi,x
sta aReader + 2
ldx b
aReader:
lda $0000,x
boylece 100 cycle'lik islemi 4 kat hizlandirmis oluyoruz.
Bunun anlami su.
1- yapilan islemlere "top down" bir bakis acisi ile bakip islemlerin mumkun oldugunca tek fonksiyona indirgenmesi
2- fonksiyonlara giren argumanlarin alabilecegi deger sayisinin en basta dizayn yapilirken kisitlanmasi
3- sonra da buna uygun tablolarin yaratilmasi
bu uc islem ile cok olumcul optimizasyonlar yapilabilir.
son bi not:
bu ornekteki 2 argumanli fonksiyon icin table- lookup rutini kendini degistiren bir rutin. (sta aReader + 1 falan ile)
Bu rutin kisa bi rutin oldugu icin kendisini 0. sayfaya koyabiliriz. bunu yaparak sta komutlarindan birer cycle daha kurtarabiliriz. ama bu rutine cok fazla jsr rts yapacaksak cok anlamli olmayacaktir. onun yerine jsr yaptigimiz yere rutini acik yazsak daha iyi. (cunku jsr rts toplam 12 cycle yer)
ama basit bir dongu ile bu islem yapiliyorsa dongusu ile beraber 0. sayfaya konulabilir.
---------------
Guya kisa biseyler yazacaktim :)
-
1. bir vbl'de kac cycle islem yapilabiliyor?
2. shift komutu yok mu?
-
- vbl?? vertical blank mi? eger oyleyse ~20000 cycle civari (1MHz / 50 Hz for PAL)
- shift komutlari var (saga/sola x carry/0 shift in = {asl,lsr,rol,ror})
-
ya kardeş, tamam optim. ok... de, şurda anlatsanız ya
c64'de nası raster irq kullanılır, ekrana logo nası basılır, sprite nası basılır,
ekranda 3 farklı charset için raster nası kesilir switch olur, müzik play,
bi logo nası convert edilir charsete, yada fli nası print edilir,
logo swing, FLD, filan...
en azından belki diğer insanlarda gaza gelir ve mini-mini introlar çıkar...
hatta özellikle FLD'den bende istifade ederim, introm yarım kaldı bu yüzden...
:D :D :D :D
-
işte yarım kalan prod'um
-
abi kesinlikle haklisin. problem su ki, bu bahsettigin seyler kisa kisa forum postlari olarak atilamiyor. ciddi sekilde tutorial olarak yazmak gerekiyor.
boyle optimizasyonlarsa kendi icinde kisa tips and tricks seklinde anlatilabiliyor ben o yuzden seyettimdi.
ama tabi seni kiracagima kafami kirarim o ayri konu. geliyor vic tutorial o zaman bu hafta sonu. pazar gunu post etmis olacam. hem madem bitmeyi bekleyen prod var. prod karsisinda boynumuz kildan ince :)
-
canım kardesim ... opuyorum seni taaa derinden... (ne demekse?)
-
Vigo kardeş, tam sana FLD örneği yazacaktım, tutorials arşivimde bunun buldum. Umarım işini görür.
!to "fld.prg"
;---------------------------------------
; commodore cracker 1993
;---------------------------------------
from = $32
to = $fa
;---------------------------------------
*= $c000
;---------------------------------------
init lda #0
sta dir ; direction
lda #$ff ; set garbage
sta $3fff
lda #from
sta ofset ; set ofset
sei ; disable interrupt
lda #$7f ; disable timer interrupt
sta $dc0d
lda #1 ; enable raster interrupt
sta $d01a
lda #<irq ; set irq vector
sta $0314
lda #>irq
sta $0315
lda #0 ; to evoke our irq routine on 0th line
sta $d012
cli ; enable interrupt
rts
;---------------------------------------
irq ldx ofset
l2 ldy $d012 ; moving 1st bad line
l1 cpy $d012
beq l1 ; wait for begin of next line
dey ; iy - bad line
tya
and #$07 ; clear higher 5 bits
ora #$10 ; set text mode
sta $d011
dex
bne l2
inc $d019 ; acknowledge the raster interrupt
jsr chofs
jmp $ea31 ; do standard irq routine
;---------------------------------------
ofset !byte from
dir !byte 0
;---------------------------------------
chofs lda dir ; change ofset of screen
bne up
inc ofset ; down
lda ofset
cmp #to
bne skip
sta dir
skip rts
;---------------------------------------
up dec ofset ; up
lda ofset
cmp #from
bne skip
lda #0
sta dir
rts
-
fld ne ki acaba diye bakarken, skate'in verdigi ornegin kaynagini da buldum (linki asagida).. hatta gecenlerde konusu gecen techtech'in de nasil yapilacagi hemen ilgili source'un altinda anlatiliyor..
http://www.ffd2.com/fridge/chacking/c=hacking7.txt
-
o yeah! veery nice.
-
Vigo'ya (ekrana sprite basma, logo gosterme konularInda postlar hk.) katılmakla beraber nightlord (uzun uzun tutoriallar yazmak konusunda) a da katILmamak mumkun degiL. Fakat bence bunun arasInda bi$ey yapILabilir diye dusunuyorum.
C64 te basic bilen biri 1-2 haftaLIk bir caLI$mayla asm de ekrana sprite basar logo gosterir vs. vs. fakat bunLarI bir intro $ekLinde birle$tirmeye gelince sorun burada ortaya cIKar.
Ekranda logo varken sprite basayIm dedigi zaman adam sIcabiLir. Benim tam olarak anLatmak istedigim buradaki baba coderLarIn en azIndan interruptLar hakkInda turkce bir tutoriaL'I turkce oLarak scene ahaLisine kazandIrmasI...
Yani adam bu i$e ba$LadI. MerakLı logo gosteriyor, bi $ekiLde scroll yapabiLiyor, sprite basIyor oynatIyor fakat bunLarIn hepsini aynI anda yapmasI gerekecegi zaman hadi bakaLım kaynak bul...
AyrIca ufak trickler ... mesela $d010 in kuLLanImI vb. gibi...
UmarIm anLatmak istedigimi acIkLayabiLmi$imdir.
Ozellikle skate, nightlord, endo gibi babaLar 0'dan $u interrupt konusuna ufak postLarLa bir girerLerse bizde hasbelkader biLdigimiz oLcude ufak ornekLer payLa$arak iLeride bu i$e atIlacakLara bir basamak hazIrLamI$ oLuruz.
-
sanırım ocak içinde açılacak olan tutorial ve yazı sitesi bu konuda güzel bir ortam oluşturacak.
-
sanırım ocak içinde açılacak olan tutorial ve yazı sitesi bu konuda güzel bir ortam oluşturacak.
Kesinlikle katılıyorum. Özellikle "Türkçe Döküman" yazma isteği oluşturacak o sayfa. Böylece yurdum insanı da ana dilinde scene ile bağlantılı teknik dökümanlara ulaşabilecek.
Ulan şu iki satır cümleyi yazana kadar bile terimlerin Türkçe karşılıklarını kullanıcam diye canım çıktı. Amma gevurlaşmışız bea. ıyi olacak o site iyi olacak :)
-
Hemen bir dip not düşerek Plazma #3'ü de unutmamanızı hatırlatıyorum.
-
Ulan Stranger, ne güzel gaza getirdin beni. "Canlandırmak" topici sayesinde henüz yayınlamak için erken olduğunu düşündüğüm sk8lib'i yayınlattın bana. :) Bu lib c64 asm'de kod yazmak isteyen ama "lda sta'yı anladıkda nereye ne yazınca ne oluyo" diyen birçok kişiyi rahatlatacaktır diye ümit ediyorum. Ayrı bir topic açıcam şimdi...
-
ben de of. için gaza geldim açıkçası böyle renkli yazılarım oluşmaya başladığını görünce...