ZX Spectrum rom modifiye

Başlatan hades, 11 Ağustos 2025, 00:29:36

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

hades

Specemu'da Load Interface 2 ROM seçeneği var. Bu seçenekle 16K'lık oyun romları yüklenebilir. Bunun üzerine aklıma romu modifiye etmek fikri geldi. Ufak bir kod ile romu rama kopyalayıp copyright mesajını ve açılışta border rengini değiştirdim.
Kodu çalıştırdıktan sonra "File --> Save Binary File" ile .rom uzantılı file name yazıp adresleri 32768 ve 16384 olarak girip Save yapıyoruz. Son olarak File --> Load Interface 2 ROM ile .rom uzantılı dosyamızı yüklüyoruz. Hepsi bu kadar.

Hazır başlamışken interrupt kullanımını kolaylaştırmak için $0038'deki irq rutinini bir vektör üzerinden kullanayım dedim. Normalde kullanılmayan NMI vektörünü ($5CB0) kullanmaya karar verdim. Açılışta $11CB adresinden itibaren çalışan rutinini inceledim. Rom'da $386E-$3D00 arası boş duruyor. Ram testi ve sistem değişkenlerinin ayarlanmasından sonra $1292 adresinde CLS rutinini çağıran adresi boş alana yönlendirdim. $386E'de CLS ve vektör ayarını yaptım. $0038'deki irq rutinini boş alana kopyaladım ve $0038'e JP yeni_irq yazdım. Yeni irq rutini
ld hl,($5cb0)
jp (hl)
ile başlamış oldu.
Buraya kadar herşey güzel ama istediğim gibi çalışmadı. Rom dosyasında gerekli değişiklikler olduğu halde $5CB0'da olması gereken değerler gözükmüyordu ve sürekli reset döngüsünde kalıyordu. Bunun üzerine irq vektörü olarak $FFFE denedim yine olmadı. $5CB0 kullandığımda adreste 2 değerinin olduğunu gördüm. Bu değer ise ram test sırasında kullanılan değer. Belki ram test rutinini iptal edersem olacak gibi. Şimdilik ara verdim. Geçen hafta ise kendi rom rutinlerimi yazmaya başlamıştım. Ekran adresinin hesaplanması, font adresinin bulunması, ascii karakter print rutini, enter, kursör yön kodların kontrolü ve işlenmesi gibi.

Emülatörün kendi reset butonu ile orjinal roma geri dönülüyor. Oysa eject rom gibi bir seçenek olması lazım. Hatta rom takılıyken emülatörü kapatıp açtığımızda otomatik olarak rom ile açılması gerekiyor.

org $6000

ld hl,0
ld de,$8000
ld bc,$4000
ldir

ld b,32
ld hl,$1539+$8000
ld de,message
loop_00 ld a,(de)
ld (hl),a
inc hl
inc de
djnz loop_00
ld a,6
ld ($11cd+$8000),a
ret

message defb $7f
defm "2025(HoS)Hades Operating Syste"
defm "m"+$80

end $6000

Skate

Eline sağlık @hades. Specemu'ya baktım, içinde 48.ROM, 128.ROM vs romlar geliyor. Bu dosyaları modifiye ettikten sonra emülatör içindeki reset butonu bunları hiçe sayarak emülatörün EXE'si ile birlikte derlenmiş standart bir ROM'a mı dönüyor? Ben öyle olmasını beklemezdim. Yoksa sen ROM dosyasını değiştirmeden başka bir yöntemle mi ROM modifikasyonunu inject ediyorsun?

hades

İnterface 2 rom'u c64'e takılan kernal replace kartuş gibi düşünebilirsin. interface 2 rom tamamen custom rutinlerin olduğu yeni bir işletim sistemi de olabilir, bir oyun romuda olabilir. Ama açılışta her zaman 48 veya 128 rom aktif oluyor.

Benim kullandığım yöntem orijinal romu yedekleyip değiştirmek ve yeni_isim.rom uzantılı olarak kaydetmek. Bu dosyayı interface 2 rom olarak emulatöre yüklendiğinde default romun yerine geçiyor. Emülatör resetlenince default rom devreye giriyor.

48.rom veya 128.rom sadece textler için bir hex editör kullanılarak da modifiye edilebilir. Sıfırdan yazılmış bir romu 48.rom ismi ile romların olduğu klasöre kaydedersek açılışta kendi romumuz aktif hale geliyor.


Skate

Ben external kartuş gibi bir şey olduğunu düşünmemiştim, şimdi netleşti. Ancak 48.rom gibi şeyler sadece textler için hex editörle modifiye edilebilir kısmını tam anlamadım. Sen orijinal rom'u koruyarak bir şey yapmak istiyorsun bu durumda, doğru anlamış mıyım? Benim tercihim tüm rom'u sıfırdan yazmak oluyor. ZX Spectrum'da ne sıklıkta rom rutinleri kullanılıyor tam bilemiyorum ama örneğin C64'de ben seneler önce 256b gibi kategoriler hariç orijinal romu kullanmayı bıraktım. Kodun en başı doğrudan basic ve kernal'ı disable ediyor, sonrasında zaten rom hiç yokmuş gibi yazıyorum her şeyi. O yüzden, sen de "rom modifiye" diye başlık açınca bir an böyle bir yola girdin diye düşündüm. Eğer 48/128'in orijinal romlarından çok fazla bir şey kullanmıyorsan bence sıfırdan bir rom geliştir. Bizler eprommer falan üşenebiliriz, sen üşenmezsin de, gerçek cihaza da takar kullanırsın kendi romunu işte, ötesi var mı? :)

hades

Hex editörle modifiye işi mesela hata mesajlarını Türkçeleştirmek için kullanılabilir. Bu da zaten bizim bir işimize yaramaz.

İlk mesajımda, geçen hafta kendi rom rutinlerimi yazmaya başlamıştım demiştim. İlk olarak ekrana bir ascii karakter basmak rutiniyle başladım. Önce karakter setini kopyaladım. 48K'da $3D00-$3FFF arasında yer aldığı için ben de aynı adresleri kullandım. Daha önceden ekrana karakter basma rutinim olduğu için geliştirmeye başladım. Satır-kolon değerlerine göre ekran adresini hesaplayan bir rutin yazdım. Yine önceden yazmış olduğum, karakterin ascii koduna göre font adresini hesaplayan rutinim vardı. Hepsini toparladım. Bu arada hiç interrupt işine girmedim. Spectrumdaki interrupt rutini frames isimli bir sistem değişkenini arttırıyor ve tuşları okuyor sadece.

Ekrana text basma işine girmişken yukarı, aşağı, sağ, sol, enter, cursor home, cls gibi kontrol karakterlerini de hallettim. İşin içine daldıkça bu sefer bir karakter yukarı kaydırma işi çıktı. Bu arada renk belleğiyle hiç uğraşmadım.  Derken aklıma başka bir fikir geldi. Spectrumun text alanı 32x24 karakter olduğu için hafızanın son 768 baytını ($FD00-$FFFF) sanal bir text ekranı gibi kullanmayı düşündüm. Bütün işlemler önce sanal ekranda yapılacak sonra 768 baytın hepsi sıralı olarak okunup asıl ekrana kopyalanacak. Bir şeyler yapmaya başlamıştım ama öylece kaldı :)

Orijinal romdan ilk etapta tuş okuma ve load/save rutinlerini kullansam benim için yeterli olacak gibi.

Kısaca ilk olarak,
1 - Ekran pozisyonunun hesaplanması,
2 - Ascii karaktere göre font adresinin hesaplanması,
3 - Ekrana yazma rutini.
ile uğraştım.

Tuş okuma rutinini kopyaladıktan sonra basit bir monitör/disassembler rutini yazmak işin ikinci aşaması olacak.
Bu arada karakter seti olarak C64'ün veya bulabilirsem 800XL'nin karakter setini kullanmayı düşünüyorum.

Ref

Alıntı yapılan: hades - 13 Ağustos 2025, 17:54:22
Hex editörle modifiye işi mesela hata mesajlarını Türkçeleştirmek için kullanılabilir. Bu da zaten bizim bir işimize yaramaz.

bun bunu buraya yazmamışım herhalde bulamadım, ben zx spectrum rom'unu komple türkçeleştirmiştim geçen sene. Başlığı hijack etmemek için sadece link bırakıyorum buraya.
https://arda.kisafilm.org/blog/?p=1448&lang=tr

o zaman duyuruyu nereye yazdım bunu acaba facebook'a falan mı yazdım hatırlayamadım şimdi.

Alıntı Yapİlk mesajımda, geçen hafta kendi rom rutinlerimi yazmaya başlamıştım demiştim
Ya bu bence çok kutsal bir girişim. Keyifli de olsa gerek. Andrew bu iş için çok uğraşmıştı, rom'u açık kaynak haline getiricem, sıfırdan rom yazıcam, izin almadan donanım üreticez falan filan diye ama sonra şirket kurdu, copyright'ı bastı ticari bir durum olursa para istiyor :) Yani orjinal rom'a çok uyumlu bir açık kaynak rom yazdı, belki ihtiyacın olur kodlarına göz atarsın.
https://zxdesign.itch.io/opense

eğer pasmo ile compile edilebilir orjinal 48k için rom(16kb)  kaynak koduna ihtiyacın varsa ekliyorum.
Bu kodu okumak kolay değil, ben şuradaki formatı daha anlaşılır buluyorum: https://skoolkid.github.io/rom/