Merhaba, Ziyaretçi. Lütfen giriş yapın veya üye olun.

Kullanıcı adınızı, parolanızı ve aktif kalma süresini giriniz

  Gelişmiş Arama
insanın içinde varsa, commodore.gen.tr açığa çıkarır bunu.. bir nevi retro olaylarının dolunayıyız.(Arda)
commodore.gen.trCommodoreCommodore Yazılımc64 ıle yapılabılecek seyler
Sayfa: 1 [2]   Aşağı git
Yazdır
Gönderen Konu: c64 ıle yapılabılecek seyler  (Okunma Sayısı 22900 defa)
0 Üye ve 1 Ziyaretçi konuyu incelemekte.
Skate
Uzman
*****
Mesaj Sayısı: 1.479


A Sinner Scener


Üyelik Bilgileri WWW
« Yanıtla #15 : Mayıs 13, 2011, 13:25:48 ÖS »

yakında bu küpün tamamen farklı bir algoritmayla yazılmışını yayınlayacağım. world first bir özelliği olacak elbette ki. o zaman bu küp ve o küp arasındaki farkı açıklayacağım. bu küpün kullandığı tek eksen üzerindeki rotasyon formülü şu aslında.

// Z ekseninde çevirme
xCevrilmis = x * cos(zDonusAcisi) - y * sin(zDonusAcisi)
yCevrilmis = x * sin(zDonusAcisi) + y * cos(zDonusAcisi)
zCevrilmis = z

Bu diğer eksenlere de kolayca uygulanabilir. Yukarıdaki basic örneği 2 eksende dönüyor. Ancak gördüğünüz gibi kod javascript versiyonunda 256 byte'a sığdırılmak için onlarca optimizasyondan geçmiş durumda. değişkenlerin hep tek harfli, kodun anlaşılmaz olma nedeni de javascript'in derlenmeyen bir dil olması. yani binary dosya boyutu diye birşey yok. javascript'de boyut doğrudan source code'un boyutu ile ölçülüyor. mecburen böyle şeyler kullanıyorsunuz. bu kodu da dün ben hızlıca javascript versiyonundan copy & paste'ler ile yazdım. Ufak bir iki parametre değiştirdim sadece c64 ekranına sığsın diye.

x,y,z noktalarının ekrana basılabilmesi, yani 3 boyuttan 2 boyuta çevrilme işlemi ise (projection) şu şekilde yapılıyor.

xEkran = (x / (z + uzaklık)) * buyutme
yEkran = (y / (z + uzaklık)) * buyutme

Uzaklık, objenin ekrana mesafesini belirliyor. Büyütme ise zoom faktörü. Kamera zoom mantığı. Uzakta da olsa zoomlayabiliriz mantığı. Bu iki değişken de başta sabit olarak tanımlanabilirler. İstenildiği taktirde değişken olarak kullanılarak objeyi ekrana yaklaştırıp uzaklaştırabilir ya da perspektifi abartılmış balıkgözü kamera gibi efektler elde edebiliriz.

Yakında yayınlayacağım diğer küp ise mantıksız derecede basit bir rotasyon formülü içeriyor. Sonuca bakınca o kod ile hala o küp nasıl düzgün dönüyor anlamış değilim.
Logged
8bitplayer
Üye
**
Mesaj Sayısı: 34



Üyelik Bilgileri
« Yanıtla #16 : Mayıs 13, 2011, 14:53:45 ÖS »

ow cıdden anlamak uzun surcek :d
Logged
Skate
Uzman
*****
Mesaj Sayısı: 1.479


A Sinner Scener


Üyelik Bilgileri WWW
« Yanıtla #17 : Mayıs 13, 2011, 15:02:42 ÖS »

ben 12 yaşımdan 17 yaşıma kadar 5 sene boyunca deneyip küp çevirememiştim. yani benim 5 senemi aldı. moralinizi bozmayın.

not: tabii o zamanlar internet imkanım pek yoktu. en fazla yabancı bbs'lere bağlanıp döküman arıyordum 2400 baud c64 modemi ile. Kahkaha
Logged
joker_
Deneyimli
*****
Mesaj Sayısı: 2.120



Üyelik Bilgileri
« Yanıtla #18 : Mayıs 13, 2011, 15:42:25 ÖS »

ow cıdden anlamak uzun surcek :d

eğer assembler ile ilgileniyorsan,anlaman çok da zor olmayacak,nightlord'un dökümanları ile başlayabilirsin,emin ol hızlı yol alacağını göreceksin,üstüne birde skate varken hiç düşünme,7dx paty'e elinde bitmiş bir ürünle gelip katılırsın.
Logged
8bitplayer
Üye
**
Mesaj Sayısı: 34



Üyelik Bilgileri
« Yanıtla #19 : Mayıs 13, 2011, 16:05:18 ÖS »

Assembler registrylemi ilgili ? su c64um gelsede hemen başlasam Kahkaha
Logged
Skate
Uzman
*****
Mesaj Sayısı: 1.479


A Sinner Scener


Üyelik Bilgileri WWW
« Yanıtla #20 : Mayıs 13, 2011, 16:21:34 ÖS »

ufak bir kavram karmaşası olmuş sanırım. c64'de bir işletim sistemi ve dolayısıyla "registry" tarzı birşey yok (aslında geos var işletim sistemi olarak ama onda da registry yok). sen herhalde "register" lafını görünce böyle bir çağırışım oldu. register demek bir nevi en düşük seviyede "değişken" anlamına geliyor. ama bu değişkenin diğer programlama dillerindeki değişkenlere göre farkı donanım seviyesinde bulunması.

c64'de 3 adet register var. a,x ve y. bunlardan a özel bir registerdır ve accumulator diye adlandırılır. x ve y ise diğer iki registerdır. ancak assembly dili demek "register ile ilgili" şeklinde tanımlanabilecek birşey değildir. assembly en düşük seviyeli programlama dilidir ki bu sadece c64 için değil tüm platformlar için geçerlidir.

basic'de iç ve dış ekran rengi değiştirme (kırmızı yapma)
Kod:
poke 53280,2
poke 53281,2

aynısının assembly dili karşılığı
Kod:
lda #$02
sta $d020
sta $d021

$d020 16'lı (haxadecimal) sayı sisteminde 53280'e karşılık gelir. Yani her iki program parçası da aynı adreslere 2 değerini (kırmızının renk kodu) yazıyor. Ama göründüğü gibi diller oldukça farklı birbirinden. bu örnekte assembly'den yazılan program basic karşılığından yaklaşık 600-700 kat daha hızlı çalışır. ilginç değil mi?
Logged
8bitplayer
Üye
**
Mesaj Sayısı: 34



Üyelik Bilgileri
« Yanıtla #21 : Mayıs 13, 2011, 21:48:52 ÖS »

iyi bi açıklama Kahkaha 600 700 kat :O Kahkaha c64 de geldi Kahkaha
Logged
Skate
Uzman
*****
Mesaj Sayısı: 1.479


A Sinner Scener


Üyelik Bilgileri WWW
« Yanıtla #22 : Mayıs 13, 2011, 22:58:58 ÖS »

bu devasa fark şundan kaynaklanıyor. basic precompile edilmeyen ve interpreted bir dil. bu ne demek? yani her basic kodunu yazıp "run" dediğinizde ya da satır numarasız olarak bir basic satırı yazıp enterladığınızda öncelikle feci bir işlem devreye girer. parsing! yani text olarak yazdığınız kodların bilgisayarın anlayabileceği komut ve parametrelere dönüştürülme işlemi. bu 1 Mhz'in altındaki bir bilgisayar için korkunç bir süre almaktadır. örneğin;

print sin(1.2345)
ile
print sin(1.2345000000000000000)

bu ikisini karşılaştıralım. küsüratta sağdaki sıfırın değeri olmadığından sonuç aynı çıkar doğru mu? doğru. peki süre olarak hangisi hızlıdır? ilki, yani 1.2345. sebebi ise siz bu satırı yazıp enterladığınızda basic parserının bir kısmı devreye girer ve print, sin gibi komutları tek bytelık komutlara çevirir. ancak parametre o anda float gibi küsüratlı bir sayı değişkenine çevrilmez. çünkü çevrilirse yazdığınız değerin değişme ihtimali var değişken sınırlarından dolayı. liste aldığınızda enterladığınız satırdaki bazı değerleri değişmiş görebilirsiniz bu durumda. aslında ben kodlayacak olsam böyle kodlardım, sonuçta süper bir hız optimizasyonu olurdu. her neyse, bu bölüm string olarak hafızada saklanır ve run dedikten sonra çalıştırılırken bu string sayısal bir değere dönüştürülür. "1.2345" = 6 karakterlik bir çevirme işlemi demekken "1.2345000000000000000" = 21 karakterlik bir string'in çevirme işlemi demektir. yani komik bir biçimde değeri olmayan sıfırlar kodu yavaşlatmıştır.

gelelim parsing ve convertion sonrasına. artık elimizde şunlar var. print ve sin komutları, sin komutunun sayısal değere çevrilmiş parametresi. ne yapılacak bu noktada? sin değeri hesaplanıp ekrana basılacak. ama nasıl? tüm komutlar birer alt rutin olarak duruyorlar. her komut için bir jsr ve bir rts komutu çalışmak zorunda arka planda.

tam olarak doğru olmayan örnek asm karşılığı:

Kod:
lda sinusDegeri
jsr sinusFonksiyonu
jsr printFonksiyonu

sinusFonksiyonu
;sinus kodu
rts

printFonksiyonu
;print kodu
rts

her bir jsr ve rts 12 cycle zaman yer. bu da tek taramadaki toplam CPU gücünün 1638'de 1'idir. çok fazla gibi gözükmese de siz yüzlerce komut çalıştırmayı denediğinizde sırf interpreting size CPU'nun önemli bir bölümünü kaybettirecektir. asm'de ise alt rutin kullanmaksızın:

Kod:
lda sinusDegeri
;sinus kodu
;print kodu

şeklinde peş peşe yazma imkanınız vardır. elbette ki burada bahsettiğim sinus ve print komutları da çok yavaştır basic'de. neden? çünkü çok genel amaçlı yazılmışlardır. print dediğinizde öncelikle gider ekran nerede diye bakar (ekran adresleri değiştirilebilen adreslerdir). halbuki siz kendi kodunuzda ekranı başta istediğiniz bir pozisyona koyduktan sonra her defasında ekran nerede diye bakmak zorunda değilsinizdir. ama basic her print komutunda arada değişip değişmediğini bilmediği için buna bakmak zorundadır. sinus komutu ise süper hassas bir sonuç üretir, hesap makinelerinde olduğu gibi. ancak sizin ihtiyacınız o kadar yüksek hassasiyet değilse çok daha hızlı çalışan ama virgülden sonra daha az basamakta doğru sonuç veren bir sinus yazabilirsiniz.

sanırım 600-700 kat nereden geliyor açıklayıcı olmuştur.
Logged
8bitplayer
Üye
**
Mesaj Sayısı: 34



Üyelik Bilgileri
« Yanıtla #23 : Mayıs 14, 2011, 00:31:05 ÖÖ »

Süpersin skate Kahkaha
Logged
8bitplayer
Üye
**
Mesaj Sayısı: 34



Üyelik Bilgileri
« Yanıtla #24 : Mayıs 14, 2011, 01:02:04 ÖÖ »

yavaş yavaş başladım okumaya acme programı istiyor ama bulamadım biyerden link verebilcek varmı?
Logged
Skate
Uzman
*****
Mesaj Sayısı: 1.479


A Sinner Scener


Üyelik Bilgileri WWW
« Yanıtla #25 : Mayıs 14, 2011, 04:00:44 ÖÖ »

http://www.esw-heim.tu-clausthal.de/~marco/smorbrod/acme/
Logged
Sayfa: 1 [2]   Yukarı git
Yazdır
Gitmek istediğiniz yer: