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.trGenel KategoriProjeIRQHack64 - EPROM Kullanan :) Prg Yükleyici Kartuş
Sayfa: 1 2 [3] 4 5 ... 19   Aşağı git
Yazdır
Gönderen Konu: IRQHack64 - EPROM Kullanan :) Prg Yükleyici Kartuş  (Okunma Sayısı 114512 defa)
0 Üye ve 1 Ziyaretçi konuyu incelemekte.
eins
Uzman
*****
Mesaj Sayısı: 1.816


A.K.A. deliMawi


Üyelik Bilgileri
« Yanıtla #30 : Eylül 26, 2015, 09:45:14 ÖÖ »

Super gidiyor sen sona yaklastin. Benim de simdi oturup menu yazmam lazim. Basic le yazarim diyordum ama vazgectim. Madem basladim adam gibi olsun bare.

Cross compile icin ne oneriyorsun. Vice ile test edilecek sanirim. Bare bayramda c64 e erisemiyorken notebook da assembler yazayim.

Gene uzerinden cok zaman gecti kartuslarin mobitor programlari icinde kod yazdigim gunleri hatirlamam gerekecek. Kahkaha
Logged

Doberman ♦ megaOne ♦ HDMI-64 ♦ HDMI-520 ♦ NewSchool
i_r_on
Uzman
*****
Mesaj Sayısı: 2.865



Üyelik Bilgileri WWW
« Yanıtla #31 : Eylül 26, 2015, 12:21:14 ÖS »

Başta basic'te kolay olur gibi gözükse de assembly seni rahat ettirir. Zamanlaması kritik olmayan şeyleri baştan subroutine şeklinde tasarlarsan sonrası kolay oluyor.

Kullanılan tool'lar kullanım sıklığına göre ve zevke göre değişir muhtemelen. Ben compiler olarak 64tass kullanıyorum. Basic stub için petcat kullanıyorum, 2015 SYS 2066 gibi bir şeyi doğrudan basic byte koduna çevirebiliyor. 6502 macroassembler & simulator diye generic bir tool'u da ide ve zor zamanlarda debug amaçlı olarak kullanıyorum. Tam olarak 64tass'ın syntax'ını karşılamasa da ince bug'larda memory'i ve register'ları takip edip hatta uygun zamanlarda interrupt üretip debug yapabilme imkanı çok işe yarıyor.

Vice ile entegre çalışabilen ide'ler de var sanırım ancak benim pek fazla deneyimim yok bunlarla.

Kodu dediğim gibi 6502 macro assembler & simulator'de edit ediyorum. Batch dosyamla compile edip gerekli objeleri oluşturuyorum. Şu an batch'i çalıştırdığımda bana toplu olarak Eprom'a yazacağım dosya ile Arduino içine include edeceğim dosyayı üretiyor. (c header oluşturmak için bin2h diye komut satırı tool'unu kullanıyorum)

Batch dosyam şöyle bir şey
Kod:
64tass -c -b Bootloader1stPartForC64.65s -o Bootloader1stPartForC64.65s.bin
64tass -c -b 64IRQTransferSoftNewForC64.65s -o 64IRQTransferSoftNewForC64.65s.bin
copy Bootloader1stPartForC64.65s.bin + 64IRQTransferSoftNewForC64.65s.bin BootloaderCartFast.bin /b
64tass -c -b IrqLoaderMenu.65s -o IrqLoaderMenu.65s.bin --labels IrqLoaderMenu.txt
petcat -w2 <IrqLoaderMenu.bas >IrqLoaderMenu.obj
copy /b IrqLoaderMenu.obj + IrqLoaderMenu.65s.bin menu.prg
bin2h menu.prg menu.h -cz -id=cartridgeData
PAUSE

Kodu çalıştırmak için prg'leri DirMaster programı ile ilişkilendirdim. Epey kullanışlı bir program. Prg'ye çift tıkladığımda otomatik olarak bir d64 dosyası oluşturup içine yerleştiriyor. DirMaster içinde sağ click Run In kısmından Vice'ı seçip  çalıştırıyorum. Bu da otomatize edilebilir ancak şu an benim işim görüyor.
« Son Düzenleme: Eylül 26, 2015, 12:23:45 ÖS Gönderen: i_r_on » Logged

Every imagination is one's self reflection but not every self reflection is imagination. <I.R.on - 2001>

twitter | blog
Simon (Özay Turay)
Yönetici
*****
Mesaj Sayısı: 6.919


Commodore Forever


Üyelik Bilgileri WWW
« Yanıtla #32 : Eylül 26, 2015, 12:30:30 ÖS »

Cross Compile için NotePad++ ile yazıp ACME ile derleyebilir WinVICE ile de test edebilirsin.

http://www.emu64.de/acme/files/acme0.95.6win.zip

IDE tarzı birşeyler arıyorsan ReLaunch64 güzel bir seçim olabilir.

http://www.popelganda.de/relaunch64.html

Logged

http://www.retrodergi.com - http://www.e-turay.com

Retro: Commodore 64, Amiga 500, Amiga 1200
Retromsu: Wii, XBox360, XBox, PS3 Slim, PS2 FAT, PS1, PSP Slim, Nintendo DS Lite
Simon (Özay Turay)
Yönetici
*****
Mesaj Sayısı: 6.919


Commodore Forever


Üyelik Bilgileri WWW
« Yanıtla #33 : Eylül 26, 2015, 12:36:55 ÖS »

Bir de benim DevKit Retro var tabi. Kahkaha

http://www.commodore.gen.tr/forum/index.php?topic=9500.0

@i_r_on: DevKit Retro'da kullandığım batch dosyasından bir örnek. PRG dosyasını WinVICE'a aktarma konusunda fikir verebilir. ERRORLEVEL ile hata kontrolü de yapıyor, derleme başarılı değilse hiç açmıyor WinVICE'ı.

Kod:
@ECHO OFF

ECHO.
ECHO Crimson Editor - Compile and Run Script For Commodore 64
ECHO.

:COMPILE
%~dp0ACME\acme.exe %1

IF %ERRORLEVEL%==0 GOTO RUN
GOTO END

:RUN
START %~dp0WinVICE\x64.exe %~dpn1.prg

:END

Not: ACME ve WinVICE klasörleri batch dosyası ile aynı klasörde bulunmalı.
Logged

http://www.retrodergi.com - http://www.e-turay.com

Retro: Commodore 64, Amiga 500, Amiga 1200
Retromsu: Wii, XBox360, XBox, PS3 Slim, PS2 FAT, PS1, PSP Slim, Nintendo DS Lite
i_r_on
Uzman
*****
Mesaj Sayısı: 2.865



Üyelik Bilgileri WWW
« Yanıtla #34 : Eylül 26, 2015, 12:56:23 ÖS »

Özay sağolasın ben almayayım, yaşlandıkça insan daha muhafazakarlaşıyor herhalde

Ama prg'yi direk vice'e komut satırından verebildiğimi öğrendiğim iyi oldu. Şimdi DirMaster çık aradan diyebilirim

Bu arada başlığı değiştirdim, projenin gidişatı ile ilgili hissiyatı tam olarak yansıtmıyordu
Logged

Every imagination is one's self reflection but not every self reflection is imagination. <I.R.on - 2001>

twitter | blog
Simon (Özay Turay)
Yönetici
*****
Mesaj Sayısı: 6.919


Commodore Forever


Üyelik Bilgileri WWW
« Yanıtla #35 : Eylül 26, 2015, 13:05:39 ÖS »

ACME kullan diye demedim zaten, dediğin gibi en güzel yöntem alıştığın yöntem.
Logged

http://www.retrodergi.com - http://www.e-turay.com

Retro: Commodore 64, Amiga 500, Amiga 1200
Retromsu: Wii, XBox360, XBox, PS3 Slim, PS2 FAT, PS1, PSP Slim, Nintendo DS Lite
msvstpl
Üye
***
Mesaj Sayısı: 64


Üyelik Bilgileri
« Yanıtla #36 : Eylül 26, 2015, 19:16:44 ÖS »

Konuya biraz geç kalmış yerinden giriyorum kusura bakma.., ama şimdi sonra belki işe yarar;

Clone Arduino (uno) Atmega 328–pu sadece 17 mA çekiyor diye not düşmüşüm .Basit,iki 22pf, 16Mhz kristal..vs o kadar. İkisi 20 tl ye çıkar. Ne olabilir, kötümser haliyle 30-40 ma diyelim ..? İki adet klon arduino kullansan biri adres bus için diğeri data bus için … Adres için olan diğerini de kontrol edebilen master olsa..? Hızlı baktım pin çıkışlarında HI-Z var diyor. Sayıcıdan kurtulursun, 244 den de kurtulursun..? Yani bu yoldan bakılırsa daha kolay çözülür gibi geldi..?

Gerçi farklı bir yoldasın..
Timing’i bilmiyorum.. ona bakmak gerekir..
Logged
eins
Uzman
*****
Mesaj Sayısı: 1.816


A.K.A. deliMawi


Üyelik Bilgileri
« Yanıtla #37 : Eylül 26, 2015, 19:24:19 ÖS »

Şu an mobilden yaziyorum daha sonra uzun yazarim. Emulasyon icin 16mips bile yeterli olmadi. Aurdino yu bilmiyorum bu hizlara cikanlari var mi ama o konu biraz sikintili.
Logged

Doberman ♦ megaOne ♦ HDMI-64 ♦ HDMI-520 ♦ NewSchool
i_r_on
Uzman
*****
Mesaj Sayısı: 2.865



Üyelik Bilgileri WWW
« Yanıtla #38 : Eylül 26, 2015, 21:33:18 ÖS »

@msvstpl : Aslında adres bus'ı ve data bus'ı bir arada sürmeye kalksam evet dediğiniz yöntem uygulanabilir. Master slave ile spi yahut i2c ile konuşur. Ancak baktığımda elde edilen çözüm de 8k /16k kartuş çalıştırılabilecek sonuçta. Bu çözümün tek avantajı sram'ın pil ile desteklenmesi durumunda son yüklenen şeyin hızlıca açılması olurdu. Halbuki şu anki çözümümde de benzer bir kullanım durumunu desteklemek çok da zor değil. Kartuş desteklemiyor ancak kartuşta olan oyun / program vesairenin tek parça versiyonlarını da bulmak mümkün. Doğrudan bellek çipinden besleme ile yükleme arasındaki fark sadece 1-2 saniye olacak.

Son uygulayacağım yöntemde 44k datayı 1.15 sn. gibi bir sürede transfer etmem teorik olarak mümkün. Pratiğini bu gece işçilik bittikten sonra anlayabileceğim.

Delimawi'nin anladığı gibi doğrudan micro ile kartuş emülasyonundan bahsetmediğinizi düşünüyorum, onu kastettiyseniz micro üstünde gerçek zamanlı programlama yapmak gerekiyor, bu da assembly ile yazılmalı. En basitinden arduino'nun interrupt handler'ı 55 cycle sürüyor. Kartuş emülasyonu için kabul edilebilir bir süre değil. (Interrupt kullanılıyorsa) Assembly yazmayı sevdiğim tek işlemci de 6502 o yüzden ben bu topa hiç girmiyorum (Okul zamanı biraz da x86 yazıp sevmişliğim var ancak çok uzun sürmedi o)
Logged

Every imagination is one's self reflection but not every self reflection is imagination. <I.R.on - 2001>

twitter | blog
eins
Uzman
*****
Mesaj Sayısı: 1.816


A.K.A. deliMawi


Üyelik Bilgileri
« Yanıtla #39 : Eylül 27, 2015, 00:35:45 ÖÖ »



Teşekkürler,
RetroKit iyiymiş.

Ben ACME ve 64tass indirdim, hatırlamaya çalışıyorum.
Relaunch64 de güzel, gerçi Java alerjim var ama hoş bir arayüze benziyor.
NotePad++ da zaten kullanıyordum, sanırım dönüp dolaşıp sonuçta NotePad++ ile yazacağım.
Şu programcının el kitabı vardı o zamanlar el altında. O kitap hala basılı olark bulunuyor mudur acaba? Aklıma geldi şimdi...
Logged

Doberman ♦ megaOne ♦ HDMI-64 ♦ HDMI-520 ♦ NewSchool
Simon (Özay Turay)
Yönetici
*****
Mesaj Sayısı: 6.919


Commodore Forever


Üyelik Bilgileri WWW
« Yanıtla #40 : Eylül 27, 2015, 00:37:44 ÖÖ »

http://www.retrodergi.com/originals/%23Kitaplar/C64%20Programcinin%20El%20Kitabi.pdf

Bir de hala keşfetmediyseniz: http://www.retrodergi.com
Logged

http://www.retrodergi.com - http://www.e-turay.com

Retro: Commodore 64, Amiga 500, Amiga 1200
Retromsu: Wii, XBox360, XBox, PS3 Slim, PS2 FAT, PS1, PSP Slim, Nintendo DS Lite
eins
Uzman
*****
Mesaj Sayısı: 1.816


A.K.A. deliMawi


Üyelik Bilgileri
« Yanıtla #41 : Eylül 27, 2015, 00:45:41 ÖÖ »

retrodergiyi keşfettim, çok güzel bir çalışma oldu o iş.
Bende bir kısım Commodore dergileri hala kütüphanemde duruyor. Bir kısmını (ilk sayılarını) daha sonradan sahaflardan tedarik etmiştim. Onların durumu çok iyi olmasa da diğerleri iyi durumda.
Ama açıkçası sayfaları açıp, o kokuyu almadan, o zamanlarda aldığım notları tekrar okumadan dijital ortamda okumak aynı hissi vermiyor. Bende eksik olan sayılarını keşke bulabilsem, ne güzel olurdu...
Logged

Doberman ♦ megaOne ♦ HDMI-64 ♦ HDMI-520 ♦ NewSchool
i_r_on
Uzman
*****
Mesaj Sayısı: 2.865



Üyelik Bilgileri WWW
« Yanıtla #42 : Eylül 27, 2015, 02:18:39 ÖÖ »

Bu arada son gelişmeler şu şekilde,

Donanım kısmını tamamladım. Yazılım kısmının c64 tarafını dün halletmiştim zaten. Eprom'larımı sildim, denemelere başladım. Malesef sonuç başarısız oldu.

Debug imkanları kısıtlı olduğu için öncelikle transfer rutinini 6502 simulator'de kontrol ettim. Onu kontrol ederken ilk hatayı farkettim. Daha önce kendini değiştiren kodla transferin bitişini interrupt içinde işaretleyip ana döngüden çıkılmasını sağlıyordum.

Eski yöntem

Ana rutin
Kod:
CLV
WAIT BVC WAIT

Interrupt rutini
Kod:
FINISH
LDA #$70 ; Opcode for BVS
STA WAIT ; Change BVC to BVS to skip idle waiting and jump to the loaded stuff.
RTI

Yenisinde ana rutin aynı kalmak üzere interrupt rutinini şu hale getirmiştim.

Kod:
FINISH
BIT BITTARGET
BITTARGET
RTI

6502'de Overflow flag'i doğrudan set eden bir komut yok, bu yüzden BIT komutunu kullanmak gerekiyor. BIT ile kontrol edilen adresteki değerin 6. biti 1 ise overflow flag set oluyor, değilse clear oluyor. RTI komutunun opcode'u $40 (01000000)

Peki hatam nerde?

Hata interrupt rutini içinde bu işi yapmakta. Bizim interrupt rutini başlamadan önce işlemci statü register'ını stack'e basıyor. RTI verildiğinde de tekrar stack'ten geri çekiyor. Yani statü register'ı üzerinden ana rutinle haberleşmek mümkün değil.

Şu şekilde düzeltiyorum,

Ana rutin
Kod:
BITTARGET = $64
LDY #$00
CLV
STY BITTARGET
WAIT
BIT BITTARGET
BVC WAIT

Interrupt rutini
Kod:
FINISH
LDA #$64 ; $64 tamamen keyfi $64 = ($40) + $20 + $04.. 6. biti 1
STA BITTARGET
RTI

Bir hevesle tekrar deneme yapıyorum düzeltimiş kodla. Malesef yine başarısız.

Gözle debug'a devam ediyorum. Bir hata daha farkediyorum. Önceki versiyonda transfer öncesi $01 adresine $30 yazıyordum I/O alanı dahil tüm RAM'i açmak için. Ancak farkettim ki bunun kalması demek benim programın koştuğu $8000-$9FFF aralığının okuma anlamında RAM'e yönlenmesi demek. I/O alanı hariç yükleme yapabilmek için aslında $01 portu ile iştigal etmemin bir anlamı yok. Bunu default halinde bırakıyorum. I/O alanına yüklenmesi gereken bir şey olursa bunun için özel çözüm üretmek gerekecek. Bu tip programlarda i/o alanına yapılacak transferler için attan inip eşşeğe binebiliriz.

Neyse çıkan çözümü uygulamaya geçiyorum.. geçemiyorum Silinmiş eprom kalmamış.  Bir tanesi silinme aşamasında, onunla son denemeyi de yapıp bugünlük bu kadar diyeceğim.

edit : Yanlış bilgi vermişim burada, $01'e $35 vermek sadece kernal ve basic rom'ları etkiliyor. Kartuş rom'unu kaldırmanın tek yöntemi kartuş portundan roml ve/veya romh'yi yüksek seviyede tutmak.
« Son Düzenleme: Mayıs 30, 2016, 01:14:30 ÖÖ Gönderen: i_r_on » Logged

Every imagination is one's self reflection but not every self reflection is imagination. <I.R.on - 2001>

twitter | blog
i_r_on
Uzman
*****
Mesaj Sayısı: 2.865



Üyelik Bilgileri WWW
« Yanıtla #43 : Eylül 27, 2015, 22:09:14 ÖS »

Bugün biraz daha kurcaladım da. Hızlı mod maalesef c64'ün memory management kısıtlamaları yüzünden o kadar a kolay değilmiş. Çok basit bir detayı gözden kaçırmışım.

https://www.c64-wiki.com/index.php/Bank_Switching

Şuradaki memory konfigürasyonları incelendiğinde low rom'un açık olduğu ancak kernal'in bulunduğu son 8k'nın kapalı olduğu bir konfigürasyon yok.

Tek alternatif Ultimax modunu kullanmak bu durumda da kullanılabilir ram sadece 0-15. sayfalar arası oluyor. Yani rutin ultimax moduna geçip bir miktar transfer yapacak, sonra da normal moda geçip transfer ettiğini gitmesi gereken esas ram bölgesine kopyalayacak. Tabii bütün bunların 256 byte içinde yapılması lazım

Tabii bütün bunlar yapılırken eprom'daki 256 byte'lık kodun kendinin bir bölümünü ram'e transfer etmesi lazım ve orada çalışması lazım. Modlar switch olurken kartuştan yahut kernal'den çalışan bir şey olmaması lazım.

Bir de bu çözümde IRQ ve NMI vektörlerini 1 defa set etme şansı var. (Dışarıdan arduino tarafından bankswitching yapılması hariç)
« Son Düzenleme: Eylül 27, 2015, 22:11:05 ÖS Gönderen: i_r_on » Logged

Every imagination is one's self reflection but not every self reflection is imagination. <I.R.on - 2001>

twitter | blog
i_r_on
Uzman
*****
Mesaj Sayısı: 2.865



Üyelik Bilgileri WWW
« Yanıtla #44 : Eylül 27, 2015, 22:40:00 ÖS »

Ultimax'ı araştırayım derken aklıma Kernal'in overhead'ini alıp ram'deki ($0318/$0319) vektörü kullanma fikri geldi. Rom dump'ına bakıldığında öyle büyük bir overhead'i de yokmuş.

Kod:
.,FE43 78       SEI             disable the interrupts
.,FE44 6C 18 03 JMP ($0318)     do NMI vector

Maskable interrupt'ları disable ediyor ve ram'deki vektöre dolaylı dallanıyor. Toplam 7 cycle. Benim gireceğim interrupt için giden 7 cycle da burada harcanıyor zaten.

IRQ handler NMI handler kadar sade değil. O yüzden tüm transfer işini NMI içinde halletmek daha akıllıca olur. Kodun çalışma şekli zaten deterministik. Yani hangi byte'ı gönderdiğinde bunun işlenmesi kaç cycle sürer bunun hesabını arduino hali hazırda yapabilir.
Logged

Every imagination is one's self reflection but not every self reflection is imagination. <I.R.on - 2001>

twitter | blog
Sayfa: 1 2 [3] 4 5 ... 19   Yukarı git
Yazdır
Gitmek istediğiniz yer: