Gönderen Konu: VIC kursu preview  (Okunma sayısı 34808 defa)

VIC kursu preview

« Yanıtla #45 : 06.01.2007 21:27:10 »
Hızlı düğmeleri aç

GnoStiC


  • Ziyaretçi
bu arada unutmadan, yukarida bahsi gecen altered states %50'nin kalan diger %50'si de surada:
Late Ejaculation by Elysium
http://www.pouet.net/prod.php?which=7737

VIC kursu preview

« Yanıtla #46 : 06.01.2007 21:46:19 »
Hızlı düğmeleri aç

stranger

İleti: 241

Çevrimdışı
  • ***
  • Full Member
    • Profili Görüntüle

VIC kursu preview

« Yanıtla #47 : 06.01.2007 21:47:35 »
Hızlı düğmeleri aç

esmaeild

İleti: 96

Çevrimdışı
  • **
  • Jr. Member
    • Profili Görüntüle
    • http://www.kodhane.com
Alıntı yapılan: skate
Bu arada madem c64 donanımıyla 1mhz'nin üstüne çıkmayla ilgili zihni sinir yöntemlerine bu kadar meraklısınız, o zaman size bu konudaki ilginç fikirlerden birini söyliim. şahsen hiç uygulamasını görmedim henüz. 1541'in içinde de ufak bir işlemci ve yanılmıyorsam 8k'lık bir hafıza var. Bunları kullanarak 1541'e asynchronous hesaplamalar yaptırmakla ilgili fikirler vardı. Örnek olarak ekranda çevirmen gereken 500 tane vertexin var ama cycle sayın yetmiyor. bir kısmını 1541'e veriyorsun, o hesaplıyor, sen o arada sonuçları beklemeksizin kendi hesaplamalarını yapıyorsun. daha sonra kendi işin bitince 1541'in hesapladığı değerleri de okuyorsun v.s. Böyle birşeylerden bahsedildiğini hatırlıyorum ama ekstra donanım modifikasyonu gerektiriyor mu ya da 1541'e ne yaptırıp ne yaptıramıyoruz hiçbir fikrim yok. Bu kadar kafayı taktığınız için sizinle paylaşiim dedim bu konuyu. Yine de bana kalırsa bu konuya hiç kafa yormayın. ınanın değmez :) Öncelikle cyclelar size yetmeyecek hale gelsin. Ondan sonra kafa kafaya verip bu tür konularda birlikte mantık yürütürüz.

peki hocam 4 tane soruya cevap vermekten sıkılacağını hiç düşünmedim ondan soruyorum. özür dilerim. söylemesen sorularım böyle uzayıp gidecekti. şimdi durup dururken 1541 araya sokup niye kafamı karıştırıyorsun. ben bir taraftan nightlordun dökümanını uyguluyorum şu anda bir taraftanda kafama takılanı soruyorum. sorduklarım sizin seviyenizde olmayabilir ama cevap vermek istiyorsanız sabretmeniz lazım.
 
kısacası aklıma ne takılırsa sorucam şimdenden söyliyim (biraz geç oldu).
Coding Is Art.

VIC kursu preview

« Yanıtla #48 : 06.01.2007 22:14:32 »
Hızlı düğmeleri aç

hades

İleti: 214

Çevrimdışı
  • ***
  • Full Member
    • Profili Görüntüle
sadece bir fikir olarak söylüyorum. eğer programda illegal opcodelar kullanılırsa birkaç cycle kazanmak mümkün olabilir. bu illegal opcodeların kullanıldığı bir demo varmı yokmu hiç bilmiyorum.
neyse ben sustum. yoksa esmaeild'in kafası iyice karışacak. ben en iyisi (eprom+)rtc+mmc+expander(+cf+ide) projeme geri döneyim. arada bir postları okuyayım.

VIC kursu preview

« Yanıtla #49 : 06.01.2007 22:21:00 »
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/
@esmaeild: 1 Mhz'nin üstüne çıkma konusuna takıldığın için bunun bildiğim tek yöntemini yazdım sana. Bunun haricinde
 
Alıntı
hocam DMA satırları olmazsa 6510 un kazancı 1 sayfada belleğe erişim yönünden 25 * 40 = 1000 cycle olmaz mı.

demişsin. Ben de aynı şeyi söylüyorum işte. 1000 cycle. ama toplan cycle sayısı yaklaşık 20000 olunca bu yalnızca %5 ediyor. Yani 1000 cycle o kadar da büyük bir kazanç değil. Ekranı kapatmaktaki asıl kazanç bu cyclelardan çok stable bir raster timing elde etmektir. Mesela ekran kapalıyken raster barlar çizdirmek çok kolaydır çünkü 8 satırda bir DMA'ya rastlamayacağınızı bilirsiniz. Minicik bir loop ile hiçbir tablodan değer okumadan (opsiyonel olarak renk tablosu hariç) kolayca tüm ekranı rasterlarla kaplayabilirsiniz. Yani ekranı kapatmak bize hızdan çok kodlama açısından kolaylık sağlar. Elbette ki ekran kapalıyken yapılabilecek efekler de bir o kadar sınırlıdır. Unutulmaması gereken nokta ise ekranın tamamını kapatmamızın gerekmediğidir. Yani ekranın üst bölümünde logo, spritelar v.s. yer alırken alt kısmında ekran kapatılarak raster efektleri v.s. yapılabilir. Tahmin ediyorum Nightlord dökümanın ilerleyen kısımlarında bu konulara detaylı olarak yer verecektir.

VIC kursu preview

« Yanıtla #50 : 06.01.2007 22:35:43 »
Hızlı düğmeleri aç

esmaeild

İleti: 96

Çevrimdışı
  • **
  • Jr. Member
    • Profili Görüntüle
    • http://www.kodhane.com
ben sorunu anladım. sende VIC e takmış durumdasın sürekli benim sorumu yanlış anlıyorsun. ben 6510 dedikçe sen VIC diyorsun. VIC cipini gecici bir süreliğini sök hocam makineden şimdi DMA satırları yok, spritelar yok, rasterlar yok. soruma bu şekilde bakarmısın.
« Son Düzenleme: 06.01.2007 22:37:52 Gönderen: esmaeild »
Coding Is Art.

VIC kursu preview

« Yanıtla #51 : 06.01.2007 22:43:57 »
Hızlı düğmeleri aç

nightlord

İleti: 1.085

Çevrimdışı
  • Administrator
  • *****
  • Hero Member
    • Profili Görüntüle
    • http://www.nightnetwork.org
selamlar... esmaeild hic cekinmeden full sorulari sor abi. skate de saolsun cevaplari yetistirmeye calisiyor ve bundan cok memnun olduguna da eminim :) text ortami azizligine gelmeyin diye soyluyorum. sorulari cevaplamaya calisayim:
 
1- gasp mekanizmasi nasil calisiyor:
 
VIC 6510 dan DMA satirlarinda busi almak icin BA isimli pinini kullaniyor (AEC degil). Bu pin 6510 uzerinde RDY pinine bagli. VIC BA sinyalini low yaptiktan 3 cycle sonra AEC'i bir sure hep low tutarak (normalde aec her cycle'in yarisinda low yarisinda hi olarak 6510un bellek erisimini her cycle da yarim cycle izin verir) 6510u durdurur. Neden 3 cycle sonra ? detayli cevap kursun ilerilerinde gelecek.
 
2- 6510 bellege erisemedigi yarimlarda ne yapiyor:
 
6510 icin yarim diye bir kavram yok. onun icindeki islemleri hangi hizda yaptigini bilmiyoruz. bildigimiz tek zaman birimi cycle. bir komutun 1. cycleinda sunu yapiyor ikinci cycleinda bunu yapiyor diyebiliriz. Fakat bu cycledaki zamanin ne kadarini kullaniyor bilemeyiz. commodoreun spesify ettigi tek sey belli islemlerin bir cycledan az zamanda olacagi.
 
cyclelarin her yarisinda ayri ayri islem yapabilmek icin cipte ozel olarak ayri elemanlar gerekirdi. (low to hi ve hi to low transitionlari detect etmek icin) bu ozellik VICe konulmus. bu sayede sistemde 1 mhz lik tek clock sinyali ile bir adet 1 mhz de calisan cip ile bir adet 2 mhz de calisan cip calistirilmis oluyor
 
3- sei ile interrupt flagını 1 olarak set ettiğimizde artık 6510 un kesinti isteklerine cevap vermiyeceğini belirttiğiniz halde extradan cia neden kesinti isteği gönderme demek zorunda kalıyoruz?
 
sei aslinda ciaden gelen IRQlari da bloklar. biz sei ile sadece irq pointerlarini ayarlarken kendimizi koruyoruz. 10-15 komut sonra cli ile irqlari tekrar salacagiz. Bu noktadan sonra CIAdan bir timer yuzunden irq gelirse, bizim irq rutinimize atlayacak. biz ise rutinimizin sadece VIC belli bir satira geldiginde atlanacagini dusunerek tasarladik. Bu yuzden isler karisacak.
Eger CIA interrpuptlarini disable etmezsek (ki bazi durumlarda gerekebilir) o zaman IRQ rutinimizde ilk basta "hmm bu irq istegi CIA dan mi yoksa VIC ten mi geldi" diye kontrol etmemiz gerekiyor. biz kendimizi bu dertten kurtarmak icin cogu zaman CIA interruptlarini kapatiyoruz.
 
4- hocam DMA satırları olmazsa 6510 un kazancı 1 sayfada belleğe erişim yönünden 25 * 40 = 1000 cycle olmaz mı.
 
evet skate in hesapladigi gibi bir sayfada 19656 cycledan DMA satirlari yuzunden 1000 tanesini kullanamiyoruz. bu satirlar olmazsa o 1000 cycle'i da kullanabiliriz
 
5- drive coding nasil oluyor?
 
c64 ile 1541 default olarak iec protokolu adli bir protokol ile haberlesiyor. bu protokolde talk listen gibi komutlar mevcut. normalde load yaparken c64 1541e talk diyor (bi takim baska argumanlarla beraber) 1541 de dosyanin baytlarinin gonderiyor. save ise listen islemi ile yapiliyor.
 
bu protokolde bu cok kulanilan komutlarin disinda bir de memread memwrite ve mem execute komutlari da var.
 
Bu komutlarla c64 1541in bellegine yazma okuma yapabiliyor. ayrica 1541e onun bellegindeki bir adresten baslayan programi calistirmasini da boylece soyleyebiliyoruz.
 
Zaten fastloaderlar da bu sekilde calisiyor. c64 memwrite ile once 1541 bellegine bir kod gonderiyor. ardindan memexecute ile o kodu calistirtiyor. 1541 artik tamamen o kodun yonetimine giriyor. bu sayede iecten daha hizli custom bir protokol ile 1541 ve c64 haberlestirilerek fastloaderlar irq loaderlar vs yapiliyor.
 
drive coding (yani efektin bi bolumunun 1541e yaptirilmasi) da boyle oluyor. c64 1541e yaptirmak istedigi seyi yapan kodu 1541e gonderiyor. ve ardindan mem execute yaptiriyor. sonra da aralarinda belirledikleri bir protokolle, c64 o rutine input datalarini 1541e gonderiyor. bir sure sonra da sonuclari geri alip kullaniyor

VIC kursu preview

« Yanıtla #52 : 06.01.2007 23:02:49 »
Hızlı düğmeleri aç

esmaeild

İleti: 96

Çevrimdışı
  • **
  • Jr. Member
    • Profili Görüntüle
    • http://www.kodhane.com
hocam 6510 belleğe erişirken cycle ın ilk yarısını kullanıcak şekilde dizan edilmiştir dediniz. bu donanımsal olarak mı böyle her iki yarısınıdada erişmesini sağlayacak bir anahtar yokmu. bu cpu nun cycle paylaşımı yapmayacağı bir devre dizanı düşünülmemiş mi.
Coding Is Art.

VIC kursu preview

« Yanıtla #53 : 06.01.2007 23:50:43 »
Hızlı düğmeleri aç

nightlord

İleti: 1.085

Çevrimdışı
  • Administrator
  • *****
  • Hero Member
    • Profili Görüntüle
    • http://www.nightnetwork.org
bildigim kadariyla boyle bir imkan yok. aslinda olaya su sekilde bakmak daha mantikli. 6510 1 cycle da bir kere bellek erisimi yapabiliyor. bu zaten her dijital cipten beklenen bir yeti. bu yetiye ilave olarak 6510 tasarimcilari cip icindeki devrelerde biraz optimizasyon yaparak, 6510un bir cycle icinde yaptigi bellek erisimini hizlandirarak toplam suresini cyclein yarisi kadar zamana dusurebilmisler. bu sayede bellek erisiminin olmadigi kalan yarim cyclelik zamanlarda baska ciplerle bellegi paylasabiliyor. yani 6510 icinde yapilan baska 1-cycle'lik islemler cycle zamaninin tamamini kullanabilir.
 
dolayisiyla 6510 donanimsal olarak bellek erisimlerini sadece clock cycle'inin bir yarisinda yapabiliyor. bunu degistirmenin benim bildigim bir yolu bir trigi yok.

VIC kursu preview

« Yanıtla #54 : 07.01.2007 00:07:21 »
Hızlı düğmeleri aç

esmaeild

İleti: 96

Çevrimdışı
  • **
  • Jr. Member
    • Profili Görüntüle
    • http://www.kodhane.com
anladım. yaklaşık 6 saattir adım adım aşağıdaki örneği yapıyordum az önce bitti :) biraz uzun gibi gelebilir ama ben biraz geç anlıyorum. benim gibi acemiler için aşağıya koydum (notlarıda alınmış vaziyette)
 
 
Kod: [Seç]
[SIZE=1][COLOR=#008000]
[B][SIZE=4]!to[/SIZE][/B][/COLOR][/SIZE][COLOR=#800080][B][SIZE=4]"raster0.prg"[/SIZE][/B]
[/COLOR][SIZE=4][COLOR=#008000][B]*=[/B][/COLOR][/SIZE][COLOR=#804000][B][SIZE=4]$c000[/SIZE][/B]
[/COLOR][COLOR=#000040][B][SIZE=4]baslangic:[/SIZE][/B]
[B][SIZE=4]jsr rasterIrqHazirla[/SIZE][/B]
[/COLOR][COLOR=#000040][B][SIZE=4]son:[/SIZE][/B]
[B][SIZE=4]jmp son[/SIZE][/B]
[/COLOR][FONT=FixedSys][COLOR=#804000]
[/COLOR][/FONT][COLOR=#000040][B][SIZE=4]rasterIrqHazirla:[/SIZE][/B]
[/COLOR][COLOR=#808080][B][SIZE=4];kimse bana irq gondermesin elimi sürmem[/SIZE][/B]
[B][SIZE=4];transaction burda basliyor[/SIZE][/B]
[/COLOR][COLOR=#000040][B][SIZE=4]sei[/SIZE][/B]
[/COLOR][COLOR=#808080][B][SIZE=4];cia bana irq gonderme[/SIZE][/B]
[/COLOR][B][SIZE=4][COLOR=#000040]lda [/COLOR][COLOR=#008080]#[/COLOR][/SIZE][/B][COLOR=#804000][B][SIZE=4]$7f[/SIZE][/B]
[/COLOR][SIZE=4][COLOR=#000040][B]sta [/B][/COLOR][/SIZE][COLOR=#804000][B][SIZE=4]$dc0d[/SIZE][/B]
[/COLOR][COLOR=#808080][B][SIZE=4];raster irq fonksiyonunu set et (1 ile orlanıp sadece son bit değiştiriliyor)[/SIZE][/B]
[/COLOR][B][SIZE=4][COLOR=#000040]lda [/COLOR][COLOR=#804000]$d01a[/COLOR][/SIZE][/B][COLOR=#808080][B][SIZE=4];bu vic registerlerinden birinin adresi[/SIZE][/B]
[/COLOR][SIZE=4][COLOR=#000040][B]ora [/B][/COLOR][/SIZE][COLOR=#804000][B][SIZE=4]$01[/SIZE][/B]
[/COLOR][SIZE=4][COLOR=#000040][B]sta [/B][/COLOR][/SIZE][COLOR=#804000][B][SIZE=4]$d01a[/SIZE][/B]
[/COLOR][COLOR=#808080][B][SIZE=4];irq nun 6510 a gonderilecegi satir icin 9 bitlik satir no gondericez[/SIZE][/B]
[B][SIZE=4];312 satırdan dolayı ancak 9 bite sığıyor.[/SIZE][/B]
[/COLOR][B][SIZE=4][COLOR=#000040]lda [/COLOR][COLOR=#804000]$d011[/COLOR][/SIZE][/B][COLOR=#808080][B][SIZE=4]; dokuzuncu bit[/SIZE][/B]
[/COLOR][B][SIZE=4][COLOR=#000040]and [/COLOR][COLOR=#008080]#[/COLOR][COLOR=#804000]$7f[/COLOR][/SIZE][/B][COLOR=#808080][B][SIZE=4]; sıfırlanıyor 01111111 [/SIZE][/B]
[/COLOR][SIZE=4][COLOR=#000040][B]sta [/B][/COLOR][/SIZE][COLOR=#804000][B][SIZE=4]$d011[/SIZE][/B]
[/COLOR][B][SIZE=4][COLOR=#000040]lda [/COLOR][COLOR=#008080]#[/COLOR][COLOR=#804000]$20[/COLOR][/SIZE][/B][COLOR=#808080][B][SIZE=4]; 32. satir[/SIZE][/B]
[/COLOR][B][SIZE=4][COLOR=#000040]sta [/COLOR][COLOR=#804000]$d012[/COLOR][/SIZE][/B][COLOR=#808080][B][SIZE=4]; ilk 8 bit[/SIZE][/B]
[/COLOR][B][SIZE=4][COLOR=#000040]lda [/COLOR][COLOR=#008080]#[/COLOR][COLOR=#000040]<irqRutini[/COLOR][/SIZE][/B][COLOR=#808080][B][SIZE=4]; irq rutini adresinin düşük ve yüksek bytelarını alınıp [/SIZE][/B]
[/COLOR][SIZE=4][COLOR=#000040][B]sta [/B][/COLOR][/SIZE][COLOR=#804000][B][SIZE=4]$0314[/SIZE][/B]
[/COLOR][B][SIZE=4][COLOR=#000040]lda [/COLOR][COLOR=#008080]#[/COLOR][/SIZE][/B][COLOR=#000040][B][SIZE=4]>irqRutini[/SIZE][/B]
[B][SIZE=4]sta [/SIZE][/B][/COLOR][SIZE=4][COLOR=#804000][B]$0315[/B][/COLOR][/SIZE][COLOR=#808080][B][SIZE=4]; adreslerine yazarak altrutinimizin hangi adreste olduğunu 6510 un default olarak bakacagi yere koymus oluyoruz.[/SIZE][/B]
[/COLOR][COLOR=#000040]
[/COLOR][COLOR=#808080][B][SIZE=4];transaction burda bitiyor[/SIZE][/B]
[B][SIZE=4];artik gonderebilirsiniz[/SIZE][/B]
[/COLOR][COLOR=#000040][B][SIZE=4]cli[/SIZE][/B]
[/COLOR][COLOR=#000040][B][SIZE=4]rts[/SIZE][/B]
[/COLOR][FONT=FixedSys][COLOR=#804000]
 
[/COLOR][/FONT][COLOR=#000040][B][SIZE=4]irqRutini:[/SIZE][/B]
[B][SIZE=4]inc [/SIZE][/B][/COLOR][SIZE=4][COLOR=#804000][B]$d019[/B][/COLOR][/SIZE][COLOR=#808080][B][SIZE=4]; irq sinyalini aldim isliyorum az kadi. haberin olsun. (bu adres VIC in registerlerinden birinin adresi)[/SIZE][/B]
[/COLOR][COLOR=#808080][B][SIZE=4];syc. tam burda oluyor. bu register 1 olarak set edilmis oluyor  [/SIZE][/B]
[/COLOR][COLOR=#808080][B][SIZE=4];tam VIC isaretledigimiz satira geldiginde 6510   cerceve rengini beyaz gosterttiriyor. boylece sadece isaretledigimiz bolge beyazmis gibi gorunuyor.  dolayisiyla elektron demetine hukmetmis oluyoruz. sonrada VIC 0 olarak set ediyor.[/SIZE][/B]
[/COLOR][B][SIZE=4][COLOR=#000040]lda [/COLOR][COLOR=#008080]#[/COLOR][COLOR=#804000]$01[/COLOR][/SIZE][/B][COLOR=#808080][B][SIZE=4]; cerceve beyaz - siyah bir flashing yapıyor buda efektimizi olusturmak icin tarama satirimizi elde etmemizi sagliyor[/SIZE][/B]
[/COLOR][SIZE=4][COLOR=#000040][B]sta [/B][/COLOR][/SIZE][COLOR=#804000][B][SIZE=4]$d020[/SIZE][/B]
[/COLOR][B][SIZE=4][COLOR=#000040]lda [/COLOR][COLOR=#008080]#[/COLOR][/SIZE][/B][COLOR=#804000][B][SIZE=4]$00[/SIZE][/B]
[/COLOR][SIZE=4][COLOR=#000040][B]sta [/B][/COLOR][/SIZE][COLOR=#804000][B][SIZE=4]$d020[/SIZE][/B]
[/COLOR][COLOR=#000040]
[B][SIZE=4]jmp [/SIZE][/B][/COLOR][SIZE=4][COLOR=#804000][B]$ea81[/B][/COLOR][/SIZE][COLOR=#808080][B][SIZE=4]; irq rutininden geri dönüp kaldigin yerden devam edebilmek icin bu islemi bizim icin romun otomatik yapabildigi bir adres.[/SIZE][/B]
[/COLOR]
« Son Düzenleme: 07.01.2007 00:53:46 Gönderen: esmaeild »
Coding Is Art.

VIC kursu preview

« Yanıtla #55 : 07.01.2007 00:35:08 »
Hızlı düğmeleri aç

nightlord

İleti: 1.085

Çevrimdışı
  • Administrator
  • *****
  • Hero Member
    • Profili Görüntüle
    • http://www.nightnetwork.org
selam esmaeild eline saglik ve hayirli olsun. sadece commentlerdeki bir cumle beni dusundurdu. inc $d019 un altinda...
 
VIC planladigimiz rastera atliyor demissin ya... yanlis anlamadigindan emin olmak icin aciklayayim. VIC hep rasterlari ayni sirayla 1den 312ye dogru ayni hizda geciyor (monitor onlari ayni sira ve hizla bekledigi icin) VIC istedigi zaman veya 6510dan gelen bir komut uzerine bir rasterdan baskasina atlayamiyor. burada olan olay biz irq ile VICe diyoruz ki "abi sen normal sekilde tek tek rasterlari monitore gonderiyorken 50.satira gelince bize haber ver" sonra da 6510un bellegine $0314 0315 adrelerine de irq rutinimizin adresini koyarak diyoruz ki "ey 6510... VIC sana haber verince bu rutini calistir" boylece irq rutini icinde biliyoruz ki tam olarak VIC o sirada istedigimiz satirda. yani bir nevi biz VICi bir rastera ziplatmiyoruz da VIC 6510u bizim istedigiimiz rastera geldigi zaman bizim istedigimiz rutine ziplattiriyor.
 
Belki de bunu zaten anlamis durumdaydin ama ben yine de commenti okuyan baskalari yanlis anlayabilir diye aciklayayim dedim :)

VIC kursu preview

« Yanıtla #56 : 07.01.2007 00:43:56 »
Hızlı düğmeleri aç

esmaeild

İleti: 96

Çevrimdışı
  • **
  • Jr. Member
    • Profili Görüntüle
    • http://www.kodhane.com
ok. 6510 VIC ten haber bekliyor. 6510 VIC e uymak zorunda çünkü VIC monitörü bekletmemek zorunda. hani monitörde beklerde başında monitöre bakan adam beklemez dimi. eli mahkum. :) orayı hemen düzelteyim.
Coding Is Art.

VIC kursu preview

« Yanıtla #57 : 08.01.2007 00:13:35 »
Hızlı düğmeleri aç

esmaeild

İleti: 96

Çevrimdışı
  • **
  • Jr. Member
    • Profili Görüntüle
    • http://www.kodhane.com
hocam şurdaki +$00 ın ne işe yaradığını anlayamadım. ldy sin_table+$00,x
 
düzeltme : devamını okuyunca anladım:D .
« Son Düzenleme: 08.01.2007 00:36:14 Gönderen: esmaeild »
Coding Is Art.

VIC kursu preview

« Yanıtla #58 : 08.01.2007 01:10:49 »
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/
Bu arada Nightlord herhalde bahsetmiştir ama çok detaylı okumadığım için yazıları hemen belirtiim, sin_table,x kullandığın sürece sinüs tablosunun bir kopyası yeterli olacaktır, yani.
 
sin_table !by 128,129,130,132...........,124 (256 adet değer)
 
Ancak eğer sin_table+$30,x gibi tabloyu biraz ilerden okumaya başlayacak olursan bu taşmaya neden olacaktır. Mesela x'e $e8 gibi bir değer verecek olursak
 
$e8 + $30 = $118
 
Tablonun toplam uzunluğu $100 (=256) olduğuna göre hafızadan saçma değerler dönecektir. Bunu engellemek için tabloyu tekrar ettirmek gerekir. Yani;
 
sin_table !by 128,129,130,132...........,124 (256 adet değer)
             !by 128,129,130,132...........,124 (256 adet değer) <- üst satırın kopyası
 
256 bytelık bir sinüs tablosu için 512 byte kullanmamız gerekir kısacası. Bir diğer önemli husus sinüs tablosu gibi tabloları tam $100'lük bir bloktan başlatmaktır. Yani tablo $0e37 gibi bir adresten değil de $0e00 ya da $0f00 gibi yuvarlak bir adresten başlamasını tercih etmenizi tavsiye ederim.
 
Bunu ACME'de yapmanın basit bir yolu var. !align komutu.
 
!align 255,0,0
 
Diyecek olursanız kod tam $100'lük bir bloğun başına atlar. Diyelim ki şöyle bir kod yazdık.
 
Kod: [Seç]
* = $080d
 
sei
lda #$00
sta $d020
rts
 
!align 255,0,0
sin_table !by ....................
             !by ....................

kod hafızaya şu şekilde yerleşir
 
Kod: [Seç]
.080d sei
.080e lda #$00
.0810 sta $d020
.0813 rts
.........
.........
.0900 -> sin_table

Satır numaraları aklına takılanlar olursa açıklaması "sei" ve "rts" 1 byte, "lda" parametresiyle birlikte 2 byte, "sta" ise yine parametresiyle 3 byte kaplar. Bu yüzden hafıza yerleşimi o şekilde oluyor.
 
Burda rts'den sonraki hafızaya dokunmaz ACME. align komutu olduğu için sonraki ilk $100'lük bloğa yani $0900'e atlar ve sinüs tablosunu ordan itibaren yerleştirir.
 
Sanırım Nightlord bu anlattıklarımı anlatmıştı bir dökümanında ama hangisi hatırlayamadım. En fazla pekiştirme olur sizin için. Sinüs tablosu yaratmanın alternatif yöntemleri için Plazma disk magazinindeki "Test Platformu" köşesini okuyabilirsiniz.

VIC kursu preview

« Yanıtla #59 : 08.01.2007 14:09:14 »
Hızlı düğmeleri aç

esmaeild

İleti: 96

Çevrimdışı
  • **
  • Jr. Member
    • Profili Görüntüle
    • http://www.kodhane.com
bu akşam kendi başıma ilk effectimi yapmaya çalışıcam. nasıl birşey ortaya çıkıcak merak ediyorum. bana şans dileyin:)
Coding Is Art.