Welcome, Guest. Please login or register.


Author Topic: Grafikai trükkök (Read 207993 times)

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: Grafikai trükkök
« Reply #90 on: 2013.April.14. 15:39:57 »
Quote from: Lacika
Képet hogy tudunk konvertálni a scroll-rutinhoz?
Itt egy módosított epimgconv verzió, ami -outfmt 7 használata esetén a scroll.com formátumában menti a konvertált képet. Ez csak 16 színű nem interlace módú lehet 232x200 méretben, és automatikusan -palres 0-t (fix paletta az egész képen) állít be.

[ Guests cannot view attachments ]

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: Grafikai trükkök
« Reply #91 on: 2013.April.14. 16:28:08 »
Gyorsabb verzió, ~20.5% CPU fogyasztás (a legrosszabb esetben, "eltolt" képkockánál és a video memóriából olvasva) 50 fps sebességnél:
[ Guests cannot view attachments ]
[ Guests cannot view attachments ]

Offline Z80System

  • EP addict
  • *
  • Posts: 3848
  • Country: hu
Re: Grafikai trükkök
« Reply #92 on: 2013.April.14. 16:37:06 »
Hmmm ... most néztem a csillagos demómban olyan 15% -nyi időt visz el az LPT frissítése ...

Ezt futtatom le 136 -szor :

 ldi
 ldi
 ex de,hl
 add hl,sp
 ex de,hl

Elég durva ...



Egyébként hogy mérsz időt ? Emuban breakpoint- tal kiolvasod a raszter pozíciót, vagy szamolgatod a képen a sorokat kézzel, vagy hogy ?
Z80 System

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: Grafikai trükkök
« Reply #93 on: 2013.April.14. 16:45:16 »
Quote from: Z80System
Egyébként hogy mérsz időt ?
Ezzel a Lua scripttel:
[ Guests cannot view attachments ]
Ezt a debuggerben futtatni kell (Run) és aztán Step módban folytatni az emulációt, hogy a script a futásidőt utasításonként mérni tudja.

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: Grafikai trükkök
« Reply #94 on: 2013.April.14. 17:04:03 »
Quote from: Z80System
Hmmm ... most néztem a csillagos demómban olyan 15% -nyi időt visz el az LPT frissítése ...

Elég durva ...

Ez két sor beléptetése "eltolt" módban (az eltolás nélküli eset - minden második képkockánál - egyszerűbb és gyorsabb):
Code: [Select]
       exx ; 4
        pop     bc ; 14 (VV)
        ld      a, (de) ; 21 (V)
        inc     e ; 25
        and     0aah ; 32
        rra ; 36
        ld      l, c ; 40
        or      (hl) ; 47
        exx ; 51
        ld      (hl), a ; 58 (V)
        add     hl, de ; 69
        exx ; 73
        ld      a, (de) ; 80 (V)
        inc     de ; 86
        and     0aah ; 93
        rra ; 97
        ld      l, b ; 101
        or      (hl) ; 108
        exx ; 112
        ld      (hl), a ; 119 (V)
        add     hl, de ; 130
A megjegyzésekben a ciklusszámok láthatók, a "V" potenciális video memória hozzáférést jelöl. V=5-el számolva ez +30 ciklus, ami pesszimista számítás, de nem veszi figyelembe a 4 soronkénti DJNZ utasítást. 160 * 100 = 16000, ami valóban kb. 20%-a a 79942 Z80 ciklusnak két video megszakítás között.

Quote from: Z80System
Ezt futtatom le 136 -szor :

 ldi
 ldi
 ex de,hl
 add hl,sp
 ex de,hl
Valamivel gyorsabb megoldás:
Code: [Select]
        pop     de
        ld      (hl), e
        inc     l
        ld      (hl), d
        add     hl, bc
« Last Edit: 2013.April.14. 17:21:21 by IstvanV »

Offline Z80System

  • EP addict
  • *
  • Posts: 3848
  • Country: hu
Re: Grafikai trükkök
« Reply #95 on: 2013.April.27. 18:19:30 »
Egy pixelsoronkénti ( vagy akár két pixelsoronkénti ) LPT frissítése (memóriacímek átírása bennük, hogy a másik képernyő buffer -re mutassanak) eszetlenül költségesnek tűnik nekem, el szeretném kerülni.

Ennek egyik módja az, ha az LPT -ket legenerálom egymás alá, pixelsoronként, mondjuk kettőt, ha két képet akarok váltogatni, és csak a másodikban állítom be a reload flag -et, ekkor az elsőről automatikusan átcsúszik a nick a másodikra.

Ha ugyanezt mondjuk nem 50 FPS -sel szeretném elvégezni, hanem mondjuk 25 FPS -sel, akkor már 4 LPT -t kell legeneráljak, ha 16,6 FPS -sel, akkor már 6 LPT -t, melyeknek az első felében (első 2, vagy első 3 LPT) az első képernyő pufferre mutató címek vannak beírva a sorokba, a második adag LPT -ben meg a második képernyőre.

Ennek 3 hátránya is van.

Egyrészt az FPS csökkenésével egyre nő az LPT -k száma,

másrészt az FPS az LPT -kbe lesz huzalozva, váltakozó FPS -ű megjelenítés nem lehet ilyen módon,

harmadrészt az LPT -im között szeretnék kihagyni helyet, amit nem tudok megtenni, ha a nick lép automatikusan egyik LPT -ről a másikra, a reload flag hijján.

Az lenne az igazi megoldás számomra, ha csak 2 darab előre legenerált LPT -m lenne, hiszen csak 2 képet akarok váltogatni, függetlenül a mindenkori FPS -től, így két LPT elég, amiben benne vannak a 2 képernyő bufferre vonatkozó címek, de ezek az LPT -k lehessenek akárhol a memóriában, legyen mindkettő LPT végén reload flag, amíg nem váltom át őket, addig ugyanaz az LPT legyen a képen, aztán ha letellett az X frame -em, amit akarok, akkor én váltsam át az egyikről a másikra az LPT -t.

A kérdés az lenne, hogy lehet -e ilyet tokéletesen villanás mentesen ? Tehát (legjobb esetben akár 50 FPS -sel) lehet -e baromi sűrűn LPT címet váltani a nick -ben úgy, hogy a képernyő természetesen rezzenéstelen maradjon. Időzítés, megszak, ilyesmi alkalmazható lenne ...

Van -e erre megoldás, tud -e ilyet a nick ?
Z80 System

Offline Zozosoft

  • Global Moderator
  • EP addict
  • *
  • Posts: 14776
  • Country: hu
    • http://enterprise.iko.hu/
Re: Grafikai trükkök
« Reply #96 on: 2013.April.27. 18:35:04 »
Lehet ilyet, sőt 128-as Spectrum emulációhoz kell is, ha aktívan kapcsolgatnak a két kép között.
Az a kulcs, hogy csak a 83h portot kelljen átírni, azaz 1000H (vagy többszöröse) legyen a különbség a két egyforma (videócímekben eltérő) LPT között. Így bármikor lehet átkapcsolni.

Offline Z80System

  • EP addict
  • *
  • Posts: 3848
  • Country: hu
Re: Grafikai trükkök
« Reply #97 on: 2013.April.27. 18:46:39 »
Quote
Az a kulcs, hogy csak a 83h portot kelljen átírni, azaz 1000H (vagy többszöröse) legyen a különbség a két egyforma (videócímekben eltérő) LPT között. Így bármikor lehet átkapcsolni.
Hogyhogy bármikor ? Fél képernyőkor is ? És a nick azonnal (mindenféle külön felszólítás nélkül) csak a 83h átírásától a következő LPB -t már a masik LPT -ből olvassa ?

Gondolom akkor a szerkezete az LPT -knek ugyanolyan kell legyen, nem ? Különben osszezavarodnak a sorszámok/ szinkron ... ?

Ha ez így van, akkor ez akár jó is lehet, de nekem jobban tetszene, hogyha rakhatnám az LPT -t teljesen szabadon, és akár a felépítésük se kéne pont ugyanolyan legyen, maximum ugyanannyi sorszámból kéne álljanak függőlegesen, vagy esetleg csak helyes szinkronjuk kéne legyen, és lenne valami, hogy mondjuk a mittudoménmelyik szinkron LPB -re beállítok egy videomegszakot, és ha akkor írom át a címet a nick- ben ilyen meg ilyen szabályokkal, akkor zizzenéstelen lesz ...
Z80 System

Offline Z80System

  • EP addict
  • *
  • Posts: 3848
  • Country: hu
Re: Grafikai trükkök
« Reply #98 on: 2013.April.27. 18:53:56 »
És ez egyébként le van írva valahol az EXOS leírásban, vagy valahol, vagy pedig csak úgy ki lett kísérletezve ?
Z80 System

Offline Zozosoft

  • Global Moderator
  • EP addict
  • *
  • Posts: 14776
  • Country: hu
    • http://enterprise.iko.hu/
Re: Grafikai trükkök
« Reply #99 on: 2013.April.27. 18:57:46 »
Quote from: Z80System
Hogyhogy bármikor ? Fél képernyőkor is ? És a nick azonnal (mindenféle külön felszólítás nélkül) csak a 83h átírásától a következő LPB -t már a masik LPT -ből olvassa ?
Igen.

Quote
Gondolom akkor a szerkezete az LPT -knek ugyanolyan kell legyen, nem ? Különben osszezavarodnak a sorszámok/ szinkron ... ?
Igen.
Quote
hogy mondjuk a mittudoménmelyik szinkron LPB -re beállítok egy videomegszakot, és ha akkor írom át a címet a nick- ben ilyen meg ilyen szabályokkal, akkor zizzenéstelen lesz ...
Elvileg ha jól rakod össze az lptket (a szinkron ugyanaz, és összesen ugyanannyi pixel sor van definiálva), akkor ha a force reload nélkül írod be az új címet, akkor jó lehet. Az IRQ generálást a szinkron elejére teszed, az IRQ rutin betölti az új címet, és amikor eléri a reload bites sort, már az újat fogja olvasni.

Offline Zozosoft

  • Global Moderator
  • EP addict
  • *
  • Posts: 14776
  • Country: hu
    • http://enterprise.iko.hu/
Re: Grafikai trükkök
« Reply #100 on: 2013.April.27. 19:04:20 »
Quote from: Z80System
És ez egyébként le van írva valahol az EXOS leírásban, vagy valahol, vagy pedig csak úgy ki lett kísérletezve ?
Ki lett kísérletezve. Egy készülő Spectrum 128-as átírat (legyen majd meglepetés :-) ) használ ilyet, hogy a kép közepén kapcsolgat oda-vissza a két videó memória között, hogy a menüpontokat egy mozgó háttérrel mixelje.
Ehhez meg kellett találni, hogyan lehet nemcsak az LPT elején átkapcsolni.

Offline Z80System

  • EP addict
  • *
  • Posts: 3848
  • Country: hu
Re: Grafikai trükkök
« Reply #101 on: 2013.April.27. 19:11:51 »
Quote
Az IRQ generálást a szinkron elejére teszed, az IRQ rutin betölti az új címet, és amikor eléri a reload bites sort, már az újat fogja olvasni.
Csak akkor nem értem most az 1000H -ra igazított, csak 83h -s verzió mit tesz hozzá a dologhoz ?

Mindkét regisztert átkapcsolni nincs idő egy pixelsor alatt, vagy mi ?

Tehát ha a fenti működik a szinkronnál, akkor működni fog az egyéb LPB -knél is, nem ?



Egyébkén ez a force reload flag (ez gondolom nem az LPB reload flag -je, hanem a 83h egyik bit -je) ez hogy működik ? A 83h az azonnal figyelembe van véve (hisz először azt írtad), a 82h viszont csak akkor, ha van force reload a 83h -n ? Vagy mi ? Nem mondom, hogy vágom ennek az értelmét, hogy mit akarhattak volna ilyen működéssel.
Z80 System

Offline Zozosoft

  • Global Moderator
  • EP addict
  • *
  • Posts: 14776
  • Country: hu
    • http://enterprise.iko.hu/
Re: Grafikai trükkök
« Reply #102 on: 2013.April.27. 19:25:31 »
Quote from: Z80System
Csak akkor nem értem most az 1000H -ra igazított, csak 83h -s verzió mit tesz hozzá a dologhoz ?
Bármikor lehet átkapcsolni.
Quote
Mindkét regisztert átkapcsolni nincs idő egy pixelsor alatt, vagy mi ?
Idő az van, csak ha a 82h-t is átírod, akkor az új LPT-t az elejétől kezdi olvasni.

Tehát ha a fenti működik a szinkronnál, akkor működni fog az egyéb LPB -knél is, nem ?


Quote
Egyébkén ez a force reload flag (ez gondolom nem az LPB reload flag -je, hanem a 83h egyik bit -je) ez hogy működik ? A 83h az azonnal figyelembe van véve (hisz először azt írtad), a 82h viszont csak akkor, ha van force reload a 83h -n ? Vagy mi ? Nem mondom, hogy vágom ennek az értelmét, hogy mit akarhattak volna ilyen működéssel.
Ez be van kapcsolva a 83h írásos módszernél, ettől megy át a másik LPT-re.
De mivel a 82h nem volt írva, ezért az alsó bitek megmaradnak.

Offline Z80System

  • EP addict
  • *
  • Posts: 3848
  • Country: hu
Re: Grafikai trükkök
« Reply #103 on: 2013.April.27. 19:26:43 »
Van valami mód arra, hogy egy video megszakítást kezelve megtudjuk melyik LPB váltotta ki azt a video megszakítást ? Valahogy visszaolvasni a függőleges raszterpozíciót, vagy aktuális LPB címet, vagy akármit ? Tehát hogy ha egy LPT -be több helyre is pakolok video megszakítást, akkor kitalálhassam melyiket kezelem éppen.

Persze kezelve az egyiket be lehet állítani valami flag -eket, de az bármikor elcsúszhat egy nem ismert működés, vagy akármi miatt. Valami direktebb infó kéne arról. melyik LPB megszakítását kezelem éppen.
Z80 System

Offline Zozosoft

  • Global Moderator
  • EP addict
  • *
  • Posts: 14776
  • Country: hu
    • http://enterprise.iko.hu/
Re: Grafikai trükkök
« Reply #104 on: 2013.April.27. 19:28:44 »
Quote from: Z80System
Valahogy visszaolvasni a függőleges raszterpozíciót, vagy aktuális LPB címet, vagy akármit ?
Nincs ilyen :-(