Gönderen Konu: Kick Assembler'da binary dosyayı değiştirerek import edebilir miyim?  (Okunma sayısı 3058 defa)

0 Üye ve 1 Ziyaretçi konuyu incelemekte.

Çevrimdışı wizofwor

  • RAAT
  • Tedavideki Retromanik
  • *
  • İleti: 398
TL:DR

Kick Assembler'da import ettiğim binary dosyanın byte değerlerini nasıl arttırırım?



Sıkça karşılaştığım bir problemin pratik çözümünü merak ediyorum. Bir örnekle anlayatım. Elimde CharPad programıyla hazırlanmış bir karakter seti var. 108 karakterden oluşuyor. Karakter datasını charset.bin olarak alıp kenara koydum. Daha sonra yeni bir proje açıp bir tile/map çizdim. Map için 102 karakter kullanmışım. Bunu da karakter datası (bg_char.bin) ve tile bilgisi (bg_map.bin) olarak alıp kenara koydum.

İki charset datasını aşağıdaki gibi birleştirerek kullanıyorum.

Kod: [Seç]
char_map: 
.include binary "bg_map.bin"

* = charset_addr
.include binary "charset.bin"
.include binary "bg_char.bin"
 

Bu şekilde birleştirdiğimde charset.bin'de data screen kodlarla örtüşüyor anca bg_char.bin'de data 108 byte kaymış oluyor. 

bg_map.bin'i include ederken bütün bytle'larını 108 karakter arttırmam gerekiyor. Bunu nasıl yapabilirim?
Gosub ile gidilen yerden goto ile dönen adam

Çevrimdışı eins

  • RAAT
  • Retroman
  • *
  • İleti: 29
Kullandığın yerde kaydırsan olmuyor mu?

LDA char_map,x
yerine
LDA char_map+108,x
gibi

EDIT: Pardon yanlış anladım. Olmaz... Okuduğun değeri arttırmak istiyorsun...

Çevrimiçi Ref

  • Yönetici
  • Özgür Retrocu
  • *
  • İleti: 2972
  • Advanced User Simulator
    • ae unutmadan
EDIT: Pardon yanlış anladım. Olmaz... Okuduğun değeri arttırmak istiyorsun...

yok yahu neden okuduğu değeri arttırmak istesin ki? tek sorun ikinci binary dosyasının ofsetinin 108 byte kaymış olması değil mi?

edit: ha değilmiş, tileset için ayrı data varmış...

Yani diyorsun ki, tilemap'de 89 yazıyor, ama gidip okuyunca, charset.bin'deki data geliyor.
Sen de tilemap'den okuduğun 89'a 108 eklemeye çalışıyorsun. Bunun yerine Pointer'i değiştiremiyor musun?


Çevrimdışı wizofwor

  • RAAT
  • Tedavideki Retromanik
  • *
  • İleti: 398
Pointer'ı değiştirmekle neyi kast ettiğini anlayamadım. Değerleri ufak bir python betiğiyle modifiye edebilirim veya okuduğum değerleri runtime'da değiştirebilirim ancak en pratiği kick assembler içinde yapmak olacak.

Skate'in tavsiyesiyle aşağıdaki gibi bir çözüme ulaştım.

Kod: [Seç]
tile_map:
.import binary "resources/forest_map.bin"

tile_set:
.var data = LoadBinary("resources/forest_tileset.bin")
.fill data.getSize(), data.get(i)+108

// Charset
* = $A000
.import binary "resources/charset.bin"
.import binary "resources/forest_charset.bin"
Gosub ile gidilen yerden goto ile dönen adam

Çevrimdışı wizofwor

  • RAAT
  • Tedavideki Retromanik
  • *
  • İleti: 398
Bonus soru:

ACME'de yazdığım eski bir kodu düzenlerken benzer bir sorunla karşılaştım. Yazı karakterlerini ekrana ters olarak basmak istiyorum. C64'de ters karakterlerin screen kodları normal karakter değerleri 128 arttırarak bulunuyor. Metin girişini aşağıdaki şekilde yaparak değerleri 128 arttırmak istedim ancak number out of range hatası alıyorum.

Kod: [Seç]
info_text:
!scr "(i) info"

* = * - 8, overlay
!for i, 1 ,8 {!byte * + 1 }
Gosub ile gidilen yerden goto ile dönen adam

Çevrimiçi Ref

  • Yönetici
  • Özgür Retrocu
  • *
  • İleti: 2972
  • Advanced User Simulator
    • ae unutmadan
Pointer'ı değiştirmekle neyi kast ettiğini anlayamadım.
Yani ilk akla gelen şeyi söylemiştim ama tahminen sen aynı anda iki charset'ten veri kullandığın için bu senin için zaman harcayan bir operasyon olacaktı.

kastettiğim şey, charset'i bastıktan sonra forest_map'için font datayı okurken 0 numaralı indexteki adresi gerekli register'a yüklemekti. Ama c64 zero page optimizasyonları vs gibi bir durum oluyor olabilir, bu konuda biraz fakirim biliyorsun :D

Neyse, kendi sorduğun soruları yanıtladığın için teşekkürler. Güzel dökümantasyon çıkıyor.