the scene > demoscene

Batman Forever by Batman Group

<< < (3/6) > >>

ssg:
@skatE: z80'de block copy instruction'lari var (x86'daki "rep movsb" muadili) (sozkonusu instruction'lar: ldir, lddr). bunlari kullanarak block set de yapabiliyosun (destination = source + 1, diyerek). ama hatirladigim kadariyla bunlar esdegeri assembly kodundan daha yavas calisiyordu. bunun otesinde cpc'nin video memory layout'u o kadar karisik ki block instruction'lardan ne kadar istifade edebileceginden de emin degilim. (normal ekranda ikinci line ilk line + 2048'den basliyor, overscan'de de ayni mantik sozkonusu, o yuzden bi kere tek renge gecince gerisini yardir gitsin yapamiyosun, illa ki her satirda tekrar sonraki satirin nereden baslayacaginin hesabi gerekiyor)

eger "read + compare + branch" uclusu "read + write"'tan hizliysa tabi delta daha iyidir. ama ben neticede z80'de bir sprite basma kodunu bile bitiremedigimden (hatirlarsaniz gectigimiz bolumde register'lari tuketmistim) bu konuda kendimi otorite gormuyorum :)

skate:
@ssg: block fill olayını çizim değil silme işlemi için sormuştum. bir sonraki satır nerden başlarsa başlasın, herhalde araya başka datalar girmiyordur di mi? yani diyelim ki 16k'lık bir alan grafik hafızası. 16k'yı da 0'la (ya da başka birşeyle) filllediğimde tüm ekranı silmiş olmaz mıyım? derdim sıralı olarak silmek ya eor(xor) fill türü birşey değil.

hades:
@skate

Spectrumda bu şekilde

LD HL,16384
LD DE,16385
LD BC,6143 ;Renk belleği işin içine girerse 6911 olacak.
LD (HL),0 ;Fill byte
LDIR

ekran belleği tertemiz.
Eğer cpc'lerin ekran belleği I/O adreslemeli değilse aynı şekilde olması lazım.

ssg:
aslinda video memory'de her 2048 byte'lik blok arasinda bir de 32 mi 64 byte mi ne overflow byte serisi var ama oralarda bir sey tutmak icin hafizanin geri kalaninin tamamen dolu olmasi lazim. onun icin gerek yok evet. ekran silmek kolay. ama dedigim uzere su @hades'in kodundan daha hizli olabilir mesela aklima gelen bir yontem:


--- Kod: ---
ld    hl,0  ; video memory #ffff'te bitiyor normalde
ld    sp,hl
ld    b,#20 ; #40 / 2
.loop:
defs #100,#e5 ; 256 tane push hl
djnz loop

--- Kod sonu ---

skate:
defs opcode değil 256 tane $e5 opcode'unu hafızaya dolduran bir compiler komutu falan mı?

Navigasyon

[0] Mesajlar

[#] Sonraki Sayfa

[*] Önceki Sayfa

Tam sürüme git