commodore.gen.tr

Commodore => Commodore Yazılım => Konuyu başlatan: wizofwor üzerinde Mart 14, 2017, 01:25:05 ÖÖ



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
!src "standard-lib.asm" ;standard macros

; Adress definitions
SCREEN_RAM = $0400
COLOR_RAM = $d800
BITMAP_RAM = $2000

+SET_START $4000


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
;
; border,back: fixed colors
; bitmap: Bitmap mask, will be copied to bitmap ram
; colors: Color data for mask 01 and 10, will be copied to color ram
; screen: Color data for mask 11, will be copied to screen ram

border:
  !by 0
back:
!by 0
screen:
!bin "three_elves.scr"
colors:
!bin "three_elves.col"
bitmap:
!bin "three_elves.map"

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:
lda $D011 ;switch to bitmap
ora #$20
sta $D011

lda $d016 ;switch to multicolor
ora #$10
sta $d016

İlk iş olarak Bitmap ve Multicolor modlarını açıyorum.

Kod:
	lda #$18 	        ;set memory locations
sta $d018

Ş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

lda back
sta $d021
lda border
sta $d020

Kenarlık ve arka plan renklerini tanımlayalım.

Kod:
; Copy Bitmap Data (Bitmap mask)

ldx #$00
copyMap1:
!for n,0,15 {
lda bitmap+255*n,x
sta BITMAP_RAM+255*n,x
}
inx
bne copyMap1

ldx #$00
copyMap2:
!for n,16,31 {
lda bitmap+255*n,x
sta BITMAP_RAM+255*n,x
}
inx
bne copyMap2

; endless loop

jmp *

Ş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)

ldx #$00
copyScr:
!for n,0,3 {
lda screen+255*n,x
sta SCREEN_RAM+255*n,x
}
inx
bne copyScr


; Copy Color Ram (Holds color data for mask 11 in bitmap)

ldx #$00
copyCol:
!for n,0,3 {
lda colors+255*n,x
sta COLOR_RAM+255*n,x
}
inx
bne copyCol

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 :)