Gönderen Konu: CPC'de Assembler ile imtihanım...  (Okunma sayısı 34335 defa)

0 Üye ve 1 Ziyaretçi konuyu incelemekte.

Çevrimdışı Fero

  • RAAT
  • Retroman
  • *
  • İleti: 34
  • guy.brush
    • Ferhat Tanman
CPC'de Assembler ile imtihanım...
« : 24 Kasım 2018, 04:15:10 »
Birkaç gün önce sevgili Alcofribas 'ın beni "Yan dal olarak CPC 'ci" diye tanımlamasıyla gaza gelip, "CPC 'de çalışacak birşeyler yapmalıyım!" diyerek Winape 'i açıp bir hışımla F3 'e bastım! Unity ile anlaşabilecek kadar C# ile C64 'de ekrana renkli yazı ve petscii koyabilmekten ibaret olan muhteşem(!) programcılık altyapım ile yaptığım pixel artları CPC 'de görüntülemek o kadar da zor olmasa gerekiyordu...

Ancak, işte kazın ayağı öyle değilmiş :)

Başta register'lar flag'lar falan derken herşey anlaşılır gibi görünse de, iş ekranda bir görsel oluşturmaya gelince beynim ufaktan arıza sinyalleri vermeye başladı. İlk önce anlam veremediğim bir şekilde ekranda görsel oluşturmak ile ilgili hangi taşın altına bakarsam bakayım, ya C ile Asm rutinlerini birlikte kullanmaktan, ya da görselleri SCR formatına dönüştürerek, LOAD"FILENAME.SCR",&C000 şeklinde belleğe almaktan bahsediliyordu. Ancak bunlar tam olarak aradığım şey değildi.

Yapmak istediğim şey bitmap'i bir şekilde kodun içine gömerek istediğim anda bir loopu çağırarak ekrana verebilmek. Örneğin aşağıdaki gibi bir görseli ele alalım. Sonradan üzerine müzik, yazı vs ekleyip bazı demo efektlerinde kullanabilmek için görseli SCR olarak dışarıdan yüklemek bana pek doğru ya da optimize bir yöntem değilmiş gibi geliyor. (öyle değil mi?) Bunun için nasıl bir yöntem izlemek daha doğru ya da daha optimize olur?

Konuyla ilgili üstatlardan yönlendirme talep ediyorum :)

Şimdilik cpcrulez.fr 'deki makaleleri google translate ile çevire çevire bakınıyorum. Henüz donanımın mimarisi ile ilgili ve makine dili konusunda temel seviyede bile bilgi sahibi değilim ancak coderlığa soyunmak gibi bir niyetim olmadığından şimdilik işimi görecek kadarıyla yetinmek en mantıklısı :)

Şimdiden teşekkürler.






"Never pay more than 20 bucks for a computer game."

Çevrimdışı Ref

  • Yönetici
  • Özgür Retrocu
  • *
  • İleti: 2881
  • Advanced User Simulator
    • ae unutmadan
Ynt: CPC'de Assembler ile imtihanım...
« Yanıtla #1 : 25 Kasım 2018, 12:39:30 »
ben spectrumcuyum fakat aynı familyanın aletleri olduğu için yardımcı olabilirim. Yine de yanlış bir yönlendirme yapmamak için önce matahari ve alco'ya lafı bırakmak istiyorum.

Temel olarak, bir assembler ile (ben pasmo kullanıyorum) scr dosyasını include edip, zamanı gelince de veriyi ram'de uygun bir yere (ekran tamponuna) kopyalamaktan ibaret o iş.

Çevrimdışı matahari

  • RAAT
  • Retro Meraklısı
  • *
  • İleti: 209
    • The Blog of Mert Börü
Ynt: CPC'de Assembler ile imtihanım...
« Yanıtla #2 : 25 Kasım 2018, 14:44:26 »
Merhabalar,

Öncelikle Retrojen Forum'a hoşgeldiniz!

Temel olarak, bir assembler ile (ben pasmo kullanıyorum) scr dosyasını include edip, zamanı gelince de veriyi ram'de uygun bir yere (ekran tamponuna) kopyalamaktan ibaret o iş.

Ref'e katılıyorum. SCR dosyası illaki ekran adresine yüklenecek diye bir kural yok. Bu dosyayı hafızanın istediğiniz yerine yükleyebilirsiniz.

Örneğin, bu işi BASIC'te şu şekilde yapabilirsiniz:

Kod: [Seç]
MEMORY &3FFF
LOAD "FILENAME.SCR", &4000

Aynı işlemi WinAPE Assembler içerisinde yapmak için incbin (include binary) direktifini kullanabilirsiniz.
(bkz: http://www.winape.net/help/assembler_directives.html)

Yapmak istediğim şey bitmap'i bir şekilde kodun içine gömerek istediğim anda bir loopu çağırarak ekrana verebilmek.

Madem başlangıç seviyesinde Z80 Assembly language kullanıyorsunuz, o zaman LDIR komutu ile yola çıkabilirsiniz.

Kod: [Seç]
LD HL, $4000       ; Yukarıdaki örnekte kullandığımız tampon adres
LD DE, $C000       ; Amstrad CPC 464/664/6128 için ekran adresi
LD BC, 16384       ; Kopyalanacak byte sayısı
LDIR

Elbette bu çözüm demo/oyun geliştirimi için çoğu kez yeterince hızlı değil. Ancak, işin mantığını kavrayabilmeniz açısından bir yerden başlamak gerekiyor. Kişisel görüşümce Z80 Assembly kodlamaya LDI, LDD, LDIR, LDDR, vb. komutlarla başlamanız faydalı olacaktır.

Çevrimdışı Fero

  • RAAT
  • Retroman
  • *
  • İleti: 34
  • guy.brush
    • Ferhat Tanman
Ynt: CPC'de Assembler ile imtihanım...
« Yanıtla #3 : 25 Kasım 2018, 15:34:46 »
ben spectrumcuyum fakat aynı familyanın aletleri olduğu için yardımcı olabilirim. Yine de yanlış bir yönlendirme yapmamak için önce matahari ve alco'ya lafı bırakmak istiyorum.

Temel olarak, bir assembler ile (ben pasmo kullanıyorum) scr dosyasını include edip, zamanı gelince de veriyi ram'de uygun bir yere (ekran tamponuna) kopyalamaktan ibaret o iş.

Aslında bende öyle tahmin ediyorum ancak garip bir şekilde buna benzer bir örnek bulamayınca "acaba yanlış yolda mıyım?" diye bir şüpheye düştüm. Tabi şu anda yapmaya çalıştığım şey işi temelden öğrenmeye çalışmaktansa örnekler bulup oralardan mantığı anlamaya çalışarak kolaya kaçmak. O nedenle muhtemelen bir şeyleri kaçırıyorumdur. Sen söyleyince aklıma spectrum ile ilgili kaynaklara bakıp oradan fikir edinmek geldi. Biraz daha kurcalayayım :)
"Never pay more than 20 bucks for a computer game."

Çevrimdışı Fero

  • RAAT
  • Retroman
  • *
  • İleti: 34
  • guy.brush
    • Ferhat Tanman
Ynt: CPC'de Assembler ile imtihanım...
« Yanıtla #4 : 25 Kasım 2018, 15:57:25 »
Merhabalar,

Öncelikle Retrojen Forum'a hoşgeldiniz!

Ref'e katılıyorum. SCR dosyası illaki ekran adresine yüklenecek diye bir kural yok. Bu dosyayı hafızanın istediğiniz yerine yükleyebilirsiniz.

Örneğin, bu işi BASIC'te şu şekilde yapabilirsiniz:

Kod: [Seç]
MEMORY &3FFF
LOAD "FILENAME.SCR", &4000

Aynı işlemi WinAPE Assembler içerisinde yapmak için incbin (include binary) direktifini kullanabilirsiniz.
(bkz: http://www.winape.net/help/assembler_directives.html)

Yapmak istediğim şey bitmap'i bir şekilde kodun içine gömerek istediğim anda bir loopu çağırarak ekrana verebilmek.

Madem başlangıç seviyesinde Z80 Assembly language kullanıyorsunuz, o zaman LDIR komutu ile yola çıkabilirsiniz.

Kod: [Seç]
LD HL, $4000       ; Yukarıdaki örnekte kullandığımız tampon adres
LD DE, $C000       ; Amstrad CPC 464/664/6128 için ekran adresi
LD BC, 16384       ; Kopyalanacak byte sayısı
LDIR

Elbette bu çözüm demo/oyun geliştirimi için çoğu kez yeterince hızlı değil. Ancak, işin mantığını kavrayabilmeniz açısından bir yerden başlamak gerekiyor. Kişisel görüşümce Z80 Assembly kodlamaya LDI, LDD, LDIR, LDDR, vb. komutlarla başlamanız faydalı olacaktır.

Hoşbulduk,

Ref 'e cevap yazarken misafir gelince ben postu atana kadar epey süre geçmiş. Arada bu cevabı kaçırmışım, kusura bakmayın. Aslında Ref 'e de dediğim gibi biraz kolaya kaçmaya çalışıyordum. Layığı ile assembler öğrenmek için ciddi bir vakit ayırmam gerekiyor ancak bu lükse sahip değilim. O nedenle sadece örneklerden gördüklerimle birşeyler yapmaya çalışırken, bir yandan da demoya da uygun olsun diye garip bir optimizasyon derdine düşerek kendimle çeliştim :)

Bu yanıtlarınızdan sonra da kafamda birşeyler netleşmeye başladı. Dediğiniz şekilde ilerlemek aslında daha az yorucu ve daha faydalı olacaktır. @ref, @matahari Yanıtlarınız için teşekkürler :)
"Never pay more than 20 bucks for a computer game."

Çevrimdışı Fero

  • RAAT
  • Retroman
  • *
  • İleti: 34
  • guy.brush
    • Ferhat Tanman
Ynt: CPC'de Assembler ile imtihanım...
« Yanıtla #5 : 28 Kasım 2018, 15:01:16 »
Tekrar teşekkürler yanıtlarınız için! ConvImgCpc ile çevirdiğim bir resmi görüntüleyip seçtiğim paleti giydirmeyi başardım. Bundan sonrası artık oturup çizmeye kaldı.



Açıkcası palet kısmını hala tam olarak anlayamadım. Bununla ilgili pek kaynak mevcut değil. O kısmı bulduğum bir Loader 'dan araklayıp kendime göre modifiye ettim. Çok saçma birşey de yapıyor olabilirim ama çalışıyor :)

Kodu da aşağı ekledim. Vakit ayırıp biraz yorumlayabilen olursa çok makbule geçer.

"Never pay more than 20 bucks for a computer game."

Çevrimdışı matahari

  • RAAT
  • Retro Meraklısı
  • *
  • İleti: 209
    • The Blog of Mert Börü
Ynt: CPC'de Assembler ile imtihanım...
« Yanıtla #6 : 28 Kasım 2018, 16:05:02 »
ConvImgCpc ile çevirdiğim bir resmi görüntüleyip seçtiğim paleti giydirmeyi başardım.

Harika!

Açıkcası palet kısmını hala tam olarak anlayamadım. Bununla ilgili pek kaynak mevcut değil.

Ekran mode'ları, renk paleti ve ekran hafızası hakkında uygulamalı tutorial için:
http://retrojen.org/fanzin/

Firmware kullanmadan, doğrudan port adresleyerek palet kullanımı için:
http://retrojen.org/fanzin1/

 8)

Çevrimdışı Fero

  • RAAT
  • Retroman
  • *
  • İleti: 34
  • guy.brush
    • Ferhat Tanman
Ynt: CPC'de Assembler ile imtihanım...
« Yanıtla #7 : 28 Kasım 2018, 18:06:44 »
Ekran mode'ları, renk paleti ve ekran hafızası hakkında uygulamalı tutorial için:
http://retrojen.org/fanzin/

Firmware kullanmadan, doğrudan port adresleyerek palet kullanımı için:
http://retrojen.org/fanzin1/

 8)

Her yeri didik didik edip de forumda yardım istediğim adamın Turbo Loader koduna bakmayı akıl edememek... :S
Mis gibi de tutorial hazırlamışsın hemde :) Sıfırıncı sayı için de artık İstanbul'a gelince Alcofribas'ı sıkıştırayım.

Tekrar teşekkürler :)
"Never pay more than 20 bucks for a computer game."

Çevrimdışı matahari

  • RAAT
  • Retro Meraklısı
  • *
  • İleti: 209
    • The Blog of Mert Börü
Ynt: CPC'de Assembler ile imtihanım...
« Yanıtla #8 : 28 Kasım 2018, 19:31:31 »
Rica ederim. :)

İzninizle, bir üst mesajımdaki Firmware/Port kullanımına biraz açıklık getireyim.

Amstrad CPC ailesi için başlangıç seviyesinde Assembly kodu yazarken firmware adreslerini CALL komutu ile çağırmanız gayet doğal. Ancak, biraz daha ileri seviyede kodlar yazmaya başladığınızda göreceksiniz ki, kullanabileceğiniz her byte çok kıymetli! Bu durumda, hafızanın çeşitli yerlerine dağılmış (toplamda yaklaşık 4K yer tutan) firmware'i kapatmanız, BASIC'i devre dışı bırakmanız ve interrupt'ları disable etmeniz gerekecek. Bu yüzden, yapacağınız her işi "sanki firmware yokmuş, onun yerine OUT komutu ile portlara erişecekmişsiniz" gibi şimdiden zihninizde tasarlamanızda fayda var.

Umarım sizi "Turbo Loader" kodumun içindeki renk paleti kullanımına yönlendirmemin sebebi netleşmiştir.

Çevrimdışı Fero

  • RAAT
  • Retroman
  • *
  • İleti: 34
  • guy.brush
    • Ferhat Tanman
Ynt: CPC'de Assembler ile imtihanım...
« Yanıtla #9 : 28 Kasım 2018, 23:02:28 »
Rica ederim. :)

İzninizle, bir üst mesajımdaki Firmware/Port kullanımına biraz açıklık getireyim.

Amstrad CPC ailesi için başlangıç seviyesinde Assembly kodu yazarken firmware adreslerini CALL komutu ile çağırmanız gayet doğal. Ancak, biraz daha ileri seviyede kodlar yazmaya başladığınızda göreceksiniz ki, kullanabileceğiniz her byte çok kıymetli! Bu durumda, hafızanın çeşitli yerlerine dağılmış (toplamda yaklaşık 4K yer tutan) firmware'i kapatmanız, BASIC'i devre dışı bırakmanız ve interrupt'ları disable etmeniz gerekecek. Bu yüzden, yapacağınız her işi "sanki firmware yokmuş, onun yerine OUT komutu ile portlara erişecekmişsiniz" gibi şimdiden zihninizde tasarlamanızda fayda var.

Umarım sizi "Turbo Loader" kodumun içindeki renk paleti kullanımına yönlendirmemin sebebi netleşmiştir.

Kesinlikle netleşti. En kısa zamanda vakit ayırıp kodu geliştirmeye çalışacağım. Aşamalarımla forumu epeyce rahatsız ederim. :)
"Never pay more than 20 bucks for a computer game."

Çevrimdışı Ref

  • Yönetici
  • Özgür Retrocu
  • *
  • İleti: 2881
  • Advanced User Simulator
    • ae unutmadan
Ynt: CPC'de Assembler ile imtihanım...
« Yanıtla #10 : 30 Kasım 2018, 01:34:30 »
Matahari lafa girmiş ve bir çaresiz CPC'ci daha mutlu olmuş.

Sen söyleyince aklıma spectrum ile ilgili kaynaklara bakıp oradan fikir edinmek geldi. Biraz daha kurcalayayım :)

CPC için ZX Spectrum kaynaklarının işe yarayacağını sanmıyorum. CPC'nin grafik donanımı spectrumundan çok farklı, interrupt davranışı da çok daha komplike. Genel z80 konusunda da zaten heryer bilgi dolu. Ben de çok nadir asm kodladığım için zamanla unutuyorum bu sebepten her seferinde bolca internet taraması gerekiyor, en faydalı bulduğum iki temel döküman var bu ve şu

Retrojen fanzin haricinde, internet üzerindeki CPC kaynaklarını bilmiyorum ama az da olsa dökümante edilmiş olduğunu düşünüyorum. Bir de pouet'deki CPC demolarının bazılarında kaynak kodları bulunuyor, son dönemdeki trend sebebiyle. Bir bakmaya değer.

Çevrimdışı Fero

  • RAAT
  • Retroman
  • *
  • İleti: 34
  • guy.brush
    • Ferhat Tanman
Ynt: CPC'de Assembler ile imtihanım...
« Yanıtla #11 : 30 Kasım 2018, 05:34:19 »

..en faydalı bulduğum iki temel döküman var bu ve şu
Bunları kaydettim. En kısa zamanda hatim edicem. Çok teşekkürler!

Retrojen fanzin haricinde, internet üzerindeki CPC kaynaklarını bilmiyorum ama az da olsa dökümante edilmiş olduğunu düşünüyorum. Bir de pouet'deki CPC demolarının bazılarında kaynak kodları bulunuyor, son dönemdeki trend sebebiyle. Bir bakmaya değer.

Asıl sıkıntı benim bulabildiğim kaynakları anlamakta biraz zorlanmam. Daha çok temel şeyleri anlamadan "ben ekrana resim basıcam" diye girmem hata oldu :)

@Matahari, Turbo Loader 'ından çalıp çırptıklarımla kodu şöyle bir duruma getirdim. Firmware zımbırtıları kullanmadan mis gibi çalışıyor.
Kod: [Seç]
org &8000
di
ld    hl,&4000
        ld    de,&c000
        ld    bc,16384
ldir

setmode:
ld bc,&7f00
ld a,%10001100
out (c),a

ld hl,PaletteArray
pcolor: out (c),c
ld a,(hl)
inc hl
out (c),a
inc c
bit 6,c
jr z,pcolor

halt

PaletteArray:

db &54,&4B,&40,&47,&43,&44,&5C,&46,&5E,&56,&58,&59,&4F,&5B,&5F,&54 ;Hardware Color Codes
;;   0, 26, 13, 16, 25,  1,  3, 10, 12,  9,  4, 22, 17, 23, 14,  0 ;Firmware Color Codes

org &4000
incbin "fero.scr"

"Never pay more than 20 bucks for a computer game."

Çevrimdışı wizofwor

  • RAAT
  • Tedavideki Retromanik
  • *
  • İleti: 398
Ynt: CPC'de Assembler ile imtihanım...
« Yanıtla #12 : 30 Kasım 2018, 11:30:04 »
Asıl sıkıntı benim bulabildiğim kaynakları anlamakta biraz zorlanmam. Daha çok temel şeyleri anlamadan "ben ekrana resim basıcam" diye girmem hata oldu :)

Benzer yollardan geçmekte olan biri olarak bu hissiyatının assembler'ın öğrenme eğrisinin dik olmasından kaynaklandığını söylemek istedim. Başlangıçta koda baktığında hiç bir şey anlamıyorsun. Tek tek komutları çözsen bile kodun bütünü bir şey ifade etmiyor. Sonra yavaş yavaş desenler oluşmaya başlıyor. Ancak belli bir etkinliğe ulaştıktan sonra olaylar değişiyor. Sabır lazım yani.
Gosub ile gidilen yerden goto ile dönen adam

Çevrimdışı matahari

  • RAAT
  • Retro Meraklısı
  • *
  • İleti: 209
    • The Blog of Mert Börü
Ynt: CPC'de Assembler ile imtihanım...
« Yanıtla #13 : 30 Kasım 2018, 13:41:46 »
Benzer yollardan geçmekte olan biri olarak bu hissiyatının assembler'ın öğrenme eğrisinin dik olmasından kaynaklandığını söylemek istedim. Başlangıçta koda baktığında hiç bir şey anlamıyorsun. Tek tek komutları çözsen bile kodun bütünü bir şey ifade etmiyor. Sonra yavaş yavaş desenler oluşmaya başlıyor. Ancak belli bir etkinliğe ulaştıktan sonra olaylar değişiyor. Sabır lazım yani.

wizofwor harika bir tespit yapmış, konu ancak bu kadar güzel özetlenebilirdi.

Asıl sıkıntı benim bulabildiğim kaynakları anlamakta biraz zorlanmam. Daha çok temel şeyleri anlamadan "ben ekrana resim basıcam" diye girmem hata oldu :)

Ekrana resim basma hedefinize ulaştığınıza göre;

Bu aşamada kod yazmaya ara verip, yavaş yavaş Z80 işlemcisinin mimarisini (Amstrad'ın değil, sadece işlemcinin mimarisini!) ve içerdiği komutları tanımanızda fayda var. Zilog Z80 CPU User Manual'ı tavsiye ederim. İlk okuduğunuzda her şeyi anlayamamanız gayet doğal. Sakın moralinizi bozmayın, tekrar tekrar okudukça zaman içerisinde parçalar yerine oturmaya başlayacaktır. Kendinizi hazır hissettiğinizde kodlamaya geri dönebilirsiniz.

Son olarak,
  • kod yazım disiplinini korumak,
  • takibi güç "data overwrites code" türü hatalara izin vermemek için org direktiflerinin küçükten büyüğe doğru sıralanmasını sağlamak,
  • gelecekte bu sayfayı sizden başka Z80 programcılarının da referans olarak kullanabileceğini göz önüne almak,
amacıyla, Assembly kodumuza 'küçük mutlu ağaçlar' ekleyelim. ;)

Kod: [Seç]
org &4000
incbin "fero.scr"

;----------------------------------------------------------------
; CODE Segment
;----------------------------------------------------------------

org &8000

;------ Mission starts here! ----------------------------

di ; disable interrupts
; and, free iy register + shadow registers

;------ Copy from memory to screen ----------------------

ld hl,&4000
        ld de,&c000
        ld bc,16384
ldir

;------ Set mode, and disable upper/lower ROM -----------

ld bc,&7f00
ld a,%10001100
out (c),a

;------ Set ink colours ---------------------------------

ld hl,PaletteArray
pcolor: out (c),c
ld a,(hl)
inc hl
out (c),a
inc c
bit 6,c
jr z,pcolor

;------ Mission accomplished. Now, stop forever! --------

halt ; do nothing, plz.

;----------------------------------------------------------------
; DATA Segment
;----------------------------------------------------------------

PaletteArray:

;Hardware Color Codes
db &54,&4B,&40,&47,&43,&44,&5C,&46,&5E,&56,&58,&59,&4F,&5B,&5F,&54

;Firmware Color Codes
;;   0, 26, 13, 16, 25,  1,  3, 10, 12,  9,  4, 22, 17, 23, 14,  0


Çevrimdışı hades

  • RAAT
  • Retro Meraklısı
  • *
  • İleti: 179
my first cpc code..
« Yanıtla #14 : 30 Kasım 2018, 21:49:36 »
Screen effect.

Ekrandaki her satırı baş aşağı çeviriyor. Oyun yükleme ekranında veya full screen text varken denemek lazım.

Kod: [Seç]
;-------------------------------------------------------;
; CPC RUTINI #01 - EKRAN EFEKTI ;
; EKRANDAKI HER SATIRI BAS ASAGI CEVIRME ;
; 30-11-2018 / HADES ;
; PROGRAM UZUNLUGU 58 BYTE ;
;-------------------------------------------------------;
org &8000

ld ix,&c000
ld hl,&f800

ld b,25
loopxx push bc
push hl
push ix

ld c,4
loop01 ld b,80
loop00 ld a,(ix+0)
ld d,a
ld a,(hl)
ld (ix+0),a
ld a,d
ld (hl),a
inc ix
inc hl
djnz loop00
ld de,&07b0
add ix,de
ld de,&0850
sbc hl,de
dec c
jr nz,loop01

pop ix
pop hl
pop bc
ld de,80
add hl,de
add ix,de
djnz loopxx
ret