Retrojen Forum
Dijital Sanat => Kodlama => Konuyu başlatan: wizofwor - 26 Şubat 2019, 11:46:49
-
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.
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?
-
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...
-
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?
-
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.
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"
-
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.
info_text:
!scr "(i) info"
* = * - 8, overlay
!for i, 1 ,8 {!byte * + 1 }
-
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.