Gönderen Konu: canlandirmak?  (Okunma sayısı 6592 defa)

canlandirmak?

« : 29.12.2006 16:02:44 »
Hızlı düğmeleri aç

stranger

İleti: 241

Çevrimdışı
  • ***
  • Full Member
    • Profili Görüntüle
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.
« Son Düzenleme: 29.12.2006 16:05:15 Gönderen: stranger »

canlandirmak?

« Yanıtla #1 : 29.12.2006 16:13:19 »
Hızlı düğmeleri aç

GnoStiC


  • Ziyaretçi
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..

canlandirmak?

« Yanıtla #2 : 29.12.2006 19:09:10 »
Hızlı düğmeleri aç

nightlord

İleti: 1.085

Çevrimdışı
  • Administrator
  • *****
  • Hero Member
    • Profili Görüntüle
    • http://www.nightnetwork.org
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 :)

canlandirmak?

« Yanıtla #3 : 29.12.2006 19:14:24 »
Hızlı düğmeleri aç

GnoStiC


  • Ziyaretçi
1. bir vbl'de kac cycle islem yapilabiliyor?
2. shift komutu yok mu?

canlandirmak?

« Yanıtla #4 : 29.12.2006 19:18:32 »
Hızlı düğmeleri aç

nightlord

İleti: 1.085

Çevrimdışı
  • Administrator
  • *****
  • Hero Member
    • Profili Görüntüle
    • http://www.nightnetwork.org
- 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})

canlandirmak?

« Yanıtla #5 : 29.12.2006 19:37:36 »
Hızlı düğmeleri aç

vigo


  • Ziyaretçi
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

hatta ispatı

« Yanıtla #6 : 29.12.2006 19:41:16 »
Hızlı düğmeleri aç

vigo


  • Ziyaretçi
işte yarım kalan prod'um

canlandirmak?

« Yanıtla #7 : 29.12.2006 19:50:20 »
Hızlı düğmeleri aç

nightlord

İleti: 1.085

Çevrimdışı
  • Administrator
  • *****
  • Hero Member
    • Profili Görüntüle
    • http://www.nightnetwork.org
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 :)

canlandirmak?

« Yanıtla #8 : 29.12.2006 20:18:01 »
Hızlı düğmeleri aç

vigo


  • Ziyaretçi
canım kardesim ... opuyorum seni taaa derinden... (ne demekse?)

canlandirmak?

« Yanıtla #9 : 30.12.2006 17:12:26 »
Hızlı düğmeleri aç

skate

İleti: 5.245

A Sinner Scener
Çevrimdışı
  • Administrator
  • *****
  • Hero Member
    • Profili Görüntüle
    • http://www.akaydin.com/
Vigo kardeş, tam sana FLD örneği yazacaktım, tutorials arşivimde bunun buldum. Umarım işini görür.
 
Kod: [Seç]
!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

canlandirmak?

« Yanıtla #10 : 30.12.2006 17:22:50 »
Hızlı düğmeleri aç

GnoStiC


  • Ziyaretçi
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

canlandirmak?

« Yanıtla #11 : 30.12.2006 18:11:36 »
Hızlı düğmeleri aç

vigo


  • Ziyaretçi
o yeah! veery nice.

canlandirmak?

« Yanıtla #12 : 30.12.2006 19:48:57 »
Hızlı düğmeleri aç

stranger

İleti: 241

Çevrimdışı
  • ***
  • Full Member
    • Profili Görüntüle
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.

canlandirmak?

« Yanıtla #13 : 30.12.2006 19:51:56 »
Hızlı düğmeleri aç

spaztica

İleti: 1.493

Çevrimdışı
  • Administrator
  • *****
  • Hero Member
    • Profili Görüntüle
sanırım ocak içinde açılacak olan tutorial ve yazı sitesi bu konuda güzel bir ortam oluşturacak.

canlandirmak?

« Yanıtla #14 : 30.12.2006 20:30:29 »
Hızlı düğmeleri aç

skate

İleti: 5.245

A Sinner Scener
Çevrimdışı
  • Administrator
  • *****
  • Hero Member
    • Profili Görüntüle
    • http://www.akaydin.com/
Alıntı yapılan: spaztica
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 :)