|
Konu Başlığı: C64'de hires formatında resim göstermek (assembly) Gönderen: wizofwor üzerinde Mart 14, 2017, 01:25:05 ÖÖ C64 üzerinde hires resimlerin gösterilmesi her zaman aklımı karıştırmıştır. Bu yüzden bu konuda bir tutorial hazırlamaya karar verdim.
Kısa bir giriş yapalım: VIC-II bitmap formatları karakter modlarının üzerine inşa edildiği için biraz dağınık bir yapısı var. Grafik vermizi üç ayrı bölgeye yerleştirmemiz gerekiyor. Öncelikle Bitmask (veya Bitmap) verisini yani resmimizi tanımlayan renk maskesini BITMAP_RAM olarak adlandıracağımız 8KB'lık alana yerleştirmeliyiz. Multicolor modunda her pixel çifti için 0,1,2,3 olmak üzere 4 farklı renk kullanabiliyorduk. Bunlardan 0 yani arka plan rengi her zamanki gibi $d021 adresinden okunuyor. 1 ve 2 SCREEN_RAM'den, 3 ise COLOR_RAM'den okunuyor. (Evet karakter modunda harfleri tanımladığımız SCREEN_RAM MC Bitmap modunda COLOR_RAM'in devamı gibi çalışıyor.) Farklı grafik programları dosyalarını farklı şekillerde kaydediyorlar. Alttaki linkten favori programınızın formatını inceleyebilirsiniz. http://unusedino.de/ec64/technical/formats/bitmap.html (http://unusedino.de/ec64/technical/formats/bitmap.html) Ben Pixcen'le çalışıyorum. Pixcen'in güzel bir özelliği yukarıda bahsettiğim verileri ayrı ayrı veriyor olması. Konu Başlığı: Ynt: C64'de hires formatında resim göstermek (assembly) Gönderen: wizofwor üzerinde Mart 14, 2017, 01:32:29 ÖÖ Kod: !to "build/multicolor.asm",cbm Her zamanki gibi kullanacağım adresleri tanımlayarak başlıyorum. Buradaki +SET_START makrosu programın otomatik başlaması için gerekli BASIC kodunu hazırlıyor. En sonda vereceğim linkten indirebilirsiniz. Kod: ; Hires_data Biraz ters bir iş yapıp programın sonundaki veri kısmını baştan yazdım ki yükleyeceğim verileri baştan göreyim. Bundan sonra yazacağım kodları bu iki bloğun arasına ekleyeceğim. Konu Başlığı: Ynt: C64'de hires formatında resim göstermek (assembly) Gönderen: wizofwor üzerinde Mart 14, 2017, 01:53:47 ÖÖ Kod: main: İlk iş olarak Bitmap ve Multicolor modlarını açıyorum. Kod: lda #$18 ;set memory locations Şimdi geldik için basit gibi görünen karışık kısmına. COLOR_RAM'in adresi değiştirilemiyor. SCREEN_RAM için varsayılan değeri yani $0400'ü kullanacağım. Peki BITMAP_RAM'i $2000 adresinden başladığını VIC nereden bilecek?. Bunun için $d018 adresindeki yazmacı ayarlamam gerekli. Bu yazmacın 1-3 bitleri BITMAP RAM, 4-7 bitleri SCREEN_RAM'in yerini belirtir. BITMAP_RAM'i 2K'lık bloklar halinde tanımlayabiliyoruz. Bunlar $0000,$0800,$1000,$1800,$2000,$2800,$3000,$3800 olabilir. (Daha ilerideki bir adres kullanmak için VIC bankını değiştirmek gerekiyor. Buna şimdilik girmiyorum.) Ben 4. adres bloğu kullanacağım. $d018'in ilk dörtlüsü 4x2 = 8 = $08 olacak. SCREEN_RAM'in blokları ise 1K'lık. Bunlar $0000,$0400,$0800,$c000,$1000,$1400,... şeklinde gidiyor. Ben 1. adresi kullanıyorum. Bu durumda $d018'in ikinci dörtlüsü 1x128 = 128 = $10 olacak. $d018 = $10 + $08 = $18 Bu hesap karışık geldiyse aşağıdaki linkte(İngilizce) verdiğim tablolardan da faydalanabilirsiniz. https://github.com/wizofwor/C64-Notes/blob/master/notes/Memory-locations-used-by-VIC.md Konu Başlığı: Ynt: C64'de hires formatında resim göstermek (assembly) Gönderen: wizofwor üzerinde Mart 14, 2017, 02:04:45 ÖÖ Kod: ; Set Background and Border Colors Kenarlık ve arka plan renklerini tanımlayalım. Kod: ; Copy Bitmap Data (Bitmap mask) Şimdi de bitmap verisini yerine kopyalayalım. Makro kullanıma dikkat. Kopyalanan veri 8KB olunca aynı 32 ayrı LDA,STA ikilisi yazmak gerekiyor. Bu tekrar eden satırları Macro kullanarak assembler'a yazdırdım. Ancak yine de bne komutu 256 byte'tan daha uzağa dallanmadığı için iki ayrı döngü kurmam gerekti. Sona sonsuz döngü komutumu da ekleyip çalıştırıyorum. Konu Başlığı: Ynt: C64'de hires formatında resim göstermek (assembly) Gönderen: wizofwor üzerinde Mart 14, 2017, 02:07:53 ÖÖ Acayip bir şekil çıktı ama bu benim çizdim resim değil. Renk bilgisini kopyalamadığım için böyle acayip bir görüntüyle karşı karşıya kaldım.
Kod: ; Copy Screen Ram (Holds color data for mask 01 and 10 in bitmap) Renkleri de kopyalayınca mutlu sona ulaştım. Programın tam hali ve diğer kaynak dosyaları için github linki: https://github.com/wizofwor/C64-assembly-examples/tree/master/beginner-routines/multicolor-picture Konu Başlığı: Ynt: C64'de hires formatında resim göstermek (assembly) Gönderen: joker_ üzerinde Mart 14, 2017, 07:35:46 ÖÖ Kardeşim eline sağlık, gayet açıklayıcı olmuş. For kullanımın iyiymiş. Ben daha çok;
!for i,5 { lda color_data + (i-1) * $28,x sta $d800 + (i-1) * $28,x } şeklinde kullanıyordum. Fakat senin yöntemde çok kullanışlı ve pratik ;) Konu Başlığı: Ynt: C64'de hires formatında resim göstermek (assembly) Gönderen: wizofwor üzerinde Mart 14, 2017, 08:26:58 ÖÖ Sağol joker_. 7DX'lerden birinde bir grafiker arkadaşın hazırladığı mc resmi PRG haline getireceğiz diye uğraştığımızı hatırlıyor musun? Timantes'te hazırlamıştı galiba. Senin arşivden çıkan kodlarla çözmüştük.
Senin for kullanımı yani !for i,5 { } şeklindeki kullanım eski kullanım. Benim Acme bu şekilde kullanırsam Warning veriyor. İlla !for i,0,5 { } şeklinde istiyor. 40 baytlık ($28) bloklar halinde kopyalamanın bir espirisi var mı? Satır satır kopyalarken aralara efekt mi atıyorsun? Konu Başlığı: Ynt: C64'de hires formatında resim göstermek (assembly) Gönderen: ilkerficicilar üzerinde Mart 14, 2017, 08:29:54 ÖÖ Teşekkürler... Commodore dergisinin ilk zamanlarından beri bu tür anlatımlı örnekli kılavuzları okumayı seviyorum.
Konu Başlığı: Ynt: C64'de hires formatında resim göstermek (assembly) Gönderen: joker_ üzerinde Mart 14, 2017, 08:40:15 ÖÖ Sağol joker_. 7DX'lerden birinde bir grafiker arkadaşın hazırladığı mc resmi PRG haline getireceğiz diye uğraştığımızı hatırlıyor musun? Timantes'te hazırlamıştı galiba. Senin arşivden çıkan kodlarla çözmüştük. Senin for kullanımı yani !for i,5 { } şeklindeki kullanım eski kullanım. Benim Acme bu şekilde kullanırsam Warning veriyor. İlla !for i,0,5 { } şeklinde istiyor. 40 baytlık ($28) bloklar halinde kopyalamanın bir espirisi var mı? Satır satır kopyalarken aralara efekt mi atıyorsun? Yanlış hatırlamıyorsam, Arcane'in bir çalışmasıydı. c64'e convert etmiştik :) 40 baytlık bloklar halinde kopyalamanın özel bir nedeni yok. sadece satır başlarını yakalamak için :) |