46
c64 / javascript ile 6502 emülgatör
« : 08.01.2007 18:07:04 »
electronic workbench gibi bir ortamda 6510 simulasyonu var mı?
Bu özellik size üyenin attığı tüm iletileri gösterme olanağı sağlayacaktır . Not sadece size izin verilen bölümlerdeki iletilerini görebilirsiniz
[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]
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.
RasterIRQHazirla:
sei
6510 içinde “Dışarıdan Gelecek Kesinti ısteklerini Bloklama” imkanı mevcut. Bunun için Durum Registerinde Interrupt Flag adlı bir bit var. Bu bit 1 yapıldığı zaman 6510 IRQ pinine sinyal gelse bile kesinti uygulamaz ve hiçbirşey olmamış gibi devam eder. Sei komutu işte bu bit'i 1 yapar. Tersi olan cli komutu ise bu biti 0 yaparak bundan sonraki interruptlara izin verir. Yani sei ve cli komutlarının arasındaki komutlar çalışırken başka bir interrupt sinyali gelip de 6510'un herhangi bir yere atlama şansı yoktur. Bunun neden önemli olduğunu birazdan göreceksiniz.
lda #$7f
sta $dc0d
C64 içinde 6510'a kesinti isteği gönderebilen tek çip VIC değil. Disket sürücü, klavye gibi pekçok çevre birimini kontrol eden CIA çipleri de 6510'a kesinti isteği gönderebiliyor. Normalde C64 ilk açıldığında Kernal'deki başlangıç rutini içinde CIA çiplerinde bulunan timerlardan biri programlanır ve bu timer her 20 ms'de bir 6510'a kesinti isteği gönderir. Bu kesinti isteği ile beraber 6510 yine ROMdaki başka bir bölgeye atlar ve bazı rutin işlerle ilgilenir (klavyeyi kontrol etmek, cursoru yakıp söndürmek gibi). Bizim programımızda bu rutin hizmetlerin hiçbiri ile ilgilenmediğimiz için bu kesinti isteğinin gelmesini engellemek istiyoruz. Bunun için isteği gönderen CIA çipine “bana IRQ gönderme” dememiz gerekiyor. CIA çıpının ayrıntıları konumuz dışında. Fakat bu iki komutun bu işe yaradığını bilin yeter.
Adam orda yalnızca ekranı kapatıyor ve azcık tasarruf ediyor DMA satırlarından hepsi bu. Yaklaşık oran da dediğim gibi %5. Aynı olay yükleme sırasında ekranın kapatılmasında da kullanılır. Yükleme zamanı azcık kısalsın diye ekranı kapatırsın, daha hızlı yükler.
6510 için zaten yarım cycle kavramı yoktur. o yine 1 cycle içinde 1 cylce lık iş yapar. Ama o cycle içinde eğer belleğe erişmesi gerekiyorsa bunu cycle'ın ilk yarısında yapacak şekilde dizayn edilmiştir.