Merhaba, Ziyaretçi. Lütfen giriş yapın veya üye olun.

Kullanıcı adınızı, parolanızı ve aktif kalma süresini giriniz

  Gelişmiş Arama
insanın içinde varsa, commodore.gen.tr açığa çıkarır bunu.. bir nevi retro olaylarının dolunayıyız.(Arda)
commodore.gen.trCommodoreCommodore YazılımC64'de hires formatında resim göstermek (assembly)
Sayfa: [1]   Aşağı git
Yazdır
Gönderen Konu: C64'de hires formatında resim göstermek (assembly)  (Okunma Sayısı 6579 defa)
0 Üye ve 1 Ziyaretçi konuyu incelemekte.
wizofwor
Genel Yönetici
*****
Mesaj Sayısı: 4.785


Gosub ile gidilen yerden goto ile dönen adam


Üyelik Bilgileri WWW
« : 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
Ben Pixcen'le çalışıyorum. Pixcen'in güzel bir özelliği yukarıda bahsettiğim verileri ayrı ayrı veriyor olması.

 
Logged

wizofwor
Genel Yönetici
*****
Mesaj Sayısı: 4.785


Gosub ile gidilen yerden goto ile dönen adam


Üyelik Bilgileri WWW
« Yanıtla #1 : 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.
Logged

wizofwor
Genel Yönetici
*****
Mesaj Sayısı: 4.785


Gosub ile gidilen yerden goto ile dönen adam


Üyelik Bilgileri WWW
« Yanıtla #2 : 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
Logged

wizofwor
Genel Yönetici
*****
Mesaj Sayısı: 4.785


Gosub ile gidilen yerden goto ile dönen adam


Üyelik Bilgileri WWW
« Yanıtla #3 : 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.



* snapshot1.png (6.33 KB, 384x272 - Görüntüleme: 1392 kez.)
Logged

wizofwor
Genel Yönetici
*****
Mesaj Sayısı: 4.785


Gosub ile gidilen yerden goto ile dönen adam


Üyelik Bilgileri WWW
« Yanıtla #4 : 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


* three_elves.png (7.61 KB, 320x200 - Görüntüleme: 1488 kez.)
Logged

joker_
Deneyimli
*****
Mesaj Sayısı: 2.120



Üyelik Bilgileri
« Yanıtla #5 : 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
Logged
wizofwor
Genel Yönetici
*****
Mesaj Sayısı: 4.785


Gosub ile gidilen yerden goto ile dönen adam


Üyelik Bilgileri WWW
« Yanıtla #6 : 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?
« Son Düzenleme: Mart 14, 2017, 08:31:47 ÖÖ Gönderen: wizofwor » Logged

ilkerficicilar
Uzman
*****
Mesaj Sayısı: 1.122


Üyelik Bilgileri WWW
« Yanıtla #7 : 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.
Logged

http://cbm.ficicilar.name.tr/ - Commodore Hacking
joker_
Deneyimli
*****
Mesaj Sayısı: 2.120



Üyelik Bilgileri
« Yanıtla #8 : 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
Logged
Sayfa: [1]   Yukarı git
Yazdır
Gitmek istediğiniz yer: