Welcome, Guest. Please login or register.


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

Offline geco

  • EP addict
  • *
  • Posts: 7113
  • Country: hu
    • Támogató Támogató
Re: Grafikai trükkök
« Reply #315 on: 2013.October.30. 00:58:29 »
Quote from: Z80System
50 FPS stuffokat írok, de valójában elvi ez a téma, az érdekel hogy lehet megkötések nélkül, 100% korrekten megcsinálni.
Illetve, ha belegondolunk ... akkor mégsem elvi. Ugyanis 50 FPS cuccnál nyilván nagyon be lesz cipőkanalzva minden a frame -be. Éppenséggel lehet hogy pont néha átcsúszik majd tizedpixelsort a frame -en ... és pont ez a határon lebegés a veszélyes ugye ...
Erre tényleg a legegyszerűbb megoldás, ha csak az egyik regisztert írod, vagy ott a Zozó által említett megoldás, amúgy az EP128emuban letesztelheted, hogyha a reloadot, a megszakítással egy lpb-be teszed, akkor mi történik hamarabb, és ha hamarabb jön a megszak, akkor van-e elég idő az LPT címének kiadására.
Quote
Én amikor csak lehet ezt használom, csak éppen 100H -val, nem 80H -val. Igy ugye magasabb byte Y koordináta, alacsonyabb byte meg X. Automatikus a címszámítás per pixel.
A közöket pedig jól ki lehet tölteni sprite adattal.
Hát igen, ettől gyorsabb nincs is :lol:

Offline geco

  • EP addict
  • *
  • Posts: 7113
  • Country: hu
    • Támogató Támogató
Re: Grafikai trükkök
« Reply #316 on: 2013.October.30. 01:10:01 »
Quote from: Z80System
akkor a két borderünk "egyben lesz", magyarul a reload elött a megszak jöhet a teljes (alsó/felső) border alatt, nem pedig csak az alsó alatt, ahogy a "hagyományos" LPT layout -nál.
Úgy emlékszem, hogy amikor rátér a megszakítás bitet beállított LPB utáni LPB-re, akkor generálódik a megszakítás, ezért kell minden megszakítást tartalmazó LPB után egy megszakításmentes.

Offline geco

  • EP addict
  • *
  • Posts: 7113
  • Country: hu
    • Támogató Támogató
Re: Grafikai trükkök
« Reply #317 on: 2013.October.30. 01:12:43 »
Leteszteltem, ha egy helyre teszed a reload-ot a megszakítással, akkor már megtörtént az LPT reload, amikor jön a megszakítás.
Mondjuk ez az előzőekből következik is, ezek szerint jól rémlett :lol:

Offline Z80System

  • EP addict
  • *
  • Posts: 3848
  • Country: hu
Re: Grafikai trükkök
« Reply #318 on: 2013.October.30. 02:04:54 »
Quote

Quote
Leteszteltem, ha egy helyre teszed a reload-ot a megszakítással, akkor már megtörtént az LPT reload, amikor jön a megszakítás.

Hát azt nem tom hogy tesztelted le, azt meg pláne nem, hogy hihetünk -e vajon az emunak esetleg ilyen dolgok időzítése kapcsán is,

de ha így van, akkor most összetörted szívem ...

Bár végülis ha belegondolunk ... valami szinkron mindíg lesz ... tehát idő az mindíg lesz átírni az alsó(/felső) borderek alatt ... az meg hogy en a borderre is úgy gondolok, mint a "kép része mindaddig, amíg át nem váltódott az LPT a NICK betöltése által" az nem annyira számít ...

Csak nagyon szélsőséges esetben lenne értelme annak amit mondok, hogy a teljes LPT is az "aktuális képünknek" számítson, és igenis meg kell várni a tényleges teljes kirajzolást mielőtt bonthatjuk a képet, ez a szélsőséges eset pedig az, hogyha magát az LPT -t is "törölni", újragenerálni akarnám.

Tehát most akkor valóban megtehetjük, hogy a hasznos kép tartalmát már töröljük a border(ek) alatt,

de magát a képernyőn még aktuálisan látszódó LPT -t még nem kezdhetjük letörölni, és újragenerálni,
mert azt TÉNYLEGESEN csak akkor tehetjük meg, ahogy először gondoltam, vagyis a NICK LPT újratöltés után,
amiről viszont akkor most NINCS jelzésünk, hiszen a jelző megszak már elsült a border alatt, és felhasználtuk a cím beírására ...

Na az ilyen esetekhez viszont elvi megoldást most nem is látok ...

Ilyenkor 22 -es csapdája van. Ahhoz hogy átírhassam az LPT címet, ahhoz tudnom kell hogy biztonságos időpillanat van -e éppen. Ehhez más eszközöm nincs, csak hogy megszakítást kell kapjak. Ezért várok a megszakra, de a megszak már csak az UTÁN fog megérkezni hogy a NICK újratöltötte a RÉGI LPT címet, hisz nem írtam bele az újat, mert vártam a biztonságos pillanatra.
A megszak meg ugye a reload mellé van téve, mert a teljes LPT ki kell rajzolódjon, mielőtt újra lenne generálva.

Ezt az ellentmondást sikeresen feloldja a borderes módszer a korábbi esetben, ahol ezt alkalmazni lehet.

De ha jól gondoltam végig, akkor ezt a problémát ebben a TELJESEN ÁLTALÁNOS / LPT ÚJRAGENERÁLÓS esetben feloldani nem lehet. Tehát van egy csomó kerülő megoldásunk, amik közül választanunk lehet és/vagy kell, de NINCS teljesen általános módszer. Trükközni, hekkelni, kompromisszumokat kötni kell ahhoz, hogy biztosak lehessünk abban, hogy a NICK egyszer csak nem fog elszállni az egyébként teljesen korrekt programunk mellett ...

( Tényleg ilyen nehéz lehetett volna megoldani, hogy éppúgy mint a forced reload -ot, jelezni tudjam a NICK -nek, hogy én most mindkét portot érintő címmódosítást hajtok végre ? )

Sztm. ez durva ... (Ha jól látom át. Ilyenkor szokott jönni valaki, és egy 117. eddig a gondolkodásba be nem vont körülménnyel értelmét veszi a problémának. :))
« Last Edit: 2013.October.30. 02:23:14 by Z80System »
Z80 System

Offline geco

  • EP addict
  • *
  • Posts: 7113
  • Country: hu
    • Támogató Támogató
Re: Grafikai trükkök
« Reply #319 on: 2013.October.30. 09:46:42 »
Én hiszek az emunak, eddig 1 buggal találkoztunk benne, az out (c),0 utasításnál, vagyis az se volt bug, az egyik gyártó processzora ennél az utasításnál 0-t írt a portra (ez volt az emuban is), a másik gyártóé meg ffh-t
Űgy teszteltem le, hogy betettem az EXOS LPT végére az interrupt bitet, és a programom egy önmagára ugró jr volt, így nem kavart be DI, betettem egy breakpointot 0038h-ra, és megnéztem, hogy amikor breakel a futás, hol jár az LPB olvasásnál a debuggerben. Mindig a következő az EXOS LPT első LPB-jén járt.
Akkor biztosra mehetsz a portok írásával, ha a reload bitet tartalmazó LPB elé teszed 2 LPB-vel a megszakítást, így pont a kettő közötti LPB-ben lesz megszakításod, és a megszakítás elejére teszed az LPT címkiadást, mindezt úgy, hogy a főkódodban nem használsz DI-t.

Offline ergoGnomik

  • EP addict
  • *
  • Posts: 1298
  • Country: hu
  • Stray cat from Commodore alley
Re: Grafikai trükkök
« Reply #320 on: 2013.October.30. 09:53:09 »
Quote from: Z80System
Eredeti véleményedben az állt, hogy a videómegszakot oda rakhatom, ahol csak az stabilan lehet LPT címet váltani, és abból írjak LPT címet.
Ez így nem igaz, mert a képernyő látható részéről is lehet LPT címet váltani biztonságosan, de az előző (kintlevő) képet még nem kezdhetem lebontani, mindaddig míg nem olvasta be a NICK a címet a kép alján.
A priviben a megszaknak azonban már ki volt jelölve a helye a látható kép és az alsó border határára. Így már valóban jó lehet, bár erre csak a privi olvasgatása közben jöttem rá. Hogy azért mégsem kell teljes egészében megvárni a beolvasást a kép végén, elég csak az alsó border tetejéig várni, és ha ide tesszük a megszakot, akkor két legyet üthetünk vele egy csapásra, mert itt egyrészt biztonságosan írhatjuk az LPT címet, másrészt ez jelzési pontnak is jó a kirajzolásnak, hogy ennél tovább már nem kell várnia, mert innentől a border van, vagyis a szinkron LPB -k, amiket ugysem módosítunk a kirajzolással.

Magyarul mikor készvagyok a képpel (éppúgy, ahogy eddig, és az most mindegy, hogy milyen állapotgéppel, vagy milyen biteken jelzem ezt melyik program szálnak), akkor az LPT címet nem szabad beírnom egyből, úgy ahogy most, hanem várnom kell időzítésre a video megszak formájában.
Továbbra is tartom azt a véleményemet, hogy oda rakod a VINT-et, ahová akarod. Természetesen az akarásba beleértettem azt is, hogy azért van némi fogalmad arról, hogy minimum/maximum mennyi időt vesz igénybe a képgenerálásod, illetőleg az lineárisan fentről lefelé vagy össze-vissza történik. Ha tudod, hogy a tartalom újraírása soha nem fogja beelőzni a tényleges Nick által végzett képgenerálást, akkor megteheted azt, hogy a látható területre időzíted a szinkronizáló mechanizmusodat.

Amit a PM-ben írtam - bár tettem bele felkiáltójeleket - az nem kötelező jellegű utasítás, hanem egyszerűen a példa része a magyar nyelvtan szabályai szerint ("Legyen" kezdetű mondat az felszólítás, így a végére kell a "!".) leírva. Bár most elbizonytalanítottál a helyességét illetően. (Lehet, hogy egyszer erre jár majd egy nyelvtan náci és jól kijavít. :)) Amit írtam, az csak a klasszikus változat volt. Az egész lényege a helyes szinkronizáció. Az állapotgép pedig csak egy eszköz.

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: Grafikai trükkök
« Reply #321 on: 2013.October.30. 10:27:11 »
Valószínűleg lemaradtam valamiről, de miért kell a programban a képernyő puffereket feltétlenül az LPT címének az átírásával váltani ? :oops: Általában elég csak a video (LD1/LD2) cím(ek)et módosítani az LPT-ben. De ha problémát jelent, hogy esetleg pont az LPT cím átírása (ha elkerülhetetlen) közben történik egy RELOAD, akkor az is megoldás lehet, ha mindkét LPT 4096-al osztható címen kezdődik, így csak a 83h port értéke változik.Vagy rövid LPT esetén mindkettő kezdődhet ugyanabban a 4K-s blokkban, és akkor csak a 82h porton módosul a cím.

A video megszakítás egyébként a VINT lefutó élénél történik, tehát valóban csak a következő LPB elején.
« Last Edit: 2013.October.30. 10:33:11 by IstvanV »

Offline Zozosoft

  • Global Moderator
  • EP addict
  • *
  • Posts: 14731
  • Country: hu
    • http://enterprise.iko.hu/
Re: Grafikai trükkök
« Reply #322 on: 2013.October.30. 10:35:59 »
Quote from: IstvanV
A video megszakítás egyébként a VINT lefutó élénél történik, tehát valóban csak a következő LPB elején.
Akkor ha az utolsó kijelzendő LPB-re tesszük a VINT-et, akkor jön a megszakítás amikor már utána bordert kezdi kirajzolni, és a border/üres sorok/szinkron alatt bőven van idő beírni az új címet, jól gondolom?

Offline Z80System

  • EP addict
  • *
  • Posts: 3848
  • Country: hu
Re: Grafikai trükkök
« Reply #323 on: 2013.October.30. 10:54:36 »
Quote
Valószínűleg lemaradtam valamiről, de miért kell a programban a képernyő puffereket feltétlenül az LPT címének az átírásával váltani ?  Általában elég csak a video (LD1/LD2) cím(ek)et módosítani az LPT-ben.


Igen, általában elég, de ha pld. pixelenkénti LPT -nk van, akkor elég tetemes idő -be telik az összes pixelsor memóriacímének átírása. 50 FPS játéknál nem pocsékolnám azt el, az idő alatt ki lehet tenni 2 sprite -ot, ha egyszer van rá mód, hogy előre legyen generálva a 2 LPT és azokat váltogassam. Azon kívül gondolkodom olyan cuccba is, ami 2 egész különböző módú LPT -ket villogtat, pld. karakteres/pixel mód, soronkénti más palettával ... szóval kell az LPT anim.


Quote
De ha problémát jelent, hogy esetleg pont az LPT cím átírása (ha elkerülhetetlen) közben történik egy RELOAD, akkor az is megoldás lehet, ha mindkét LPT 4096-al osztható címen kezdődik, így csak a 83h port értéke változik.Vagy rövid LPT esetén mindkettő kezdődhet ugyanabban a 4K-s blokkban, és akkor csak a 82h porton módosul a cím.
Igen már többször elhangzott az elmúlt hsz -ek alatt, ami egy ígéretes jó trükk, de TRÜKK. Mi van ha az amber egy sok darab, csak sok idő alatt előállítható, ezért legenerált LPT -ből akar kódból változó sorrendű LPT -ket animálni, és ezek az LPT -k nem férnek el 1000H -n ?

Jó trükk, de csak trükk. Én arról beszélek itt, hogy ELVI gebasz van. 22 -es csapdája.

Ha tudod, olvasd vissza a szálat innentől:



Re: Grafikai trükkök« Reply #306 on: Yesterday at 22:34 »

 mert nagyon kiváncsi lennék, hogy tényleg elvi -e a gebasz, vagy van valami kibújás alóla.
Z80 System

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: Grafikai trükkök
« Reply #324 on: 2013.October.30. 10:56:56 »
Quote from: Zozosoft
Akkor ha az utolsó kijelzendő LPB-re tesszük a VINT-et, akkor jön a megszakítás amikor már utána bordert kezdi kirajzolni, és a border/üres sorok/szinkron alatt bőven van idő beírni az új címet, jól gondolom?
Igen.

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: Grafikai trükkök
« Reply #325 on: 2013.October.30. 11:01:18 »
Quote from: Z80System
Igen már többször elhangzott az elmúlt hsz -ek alatt, ami egy ígéretes jó trükk, de TRÜKK. Mi van ha az amber egy sok darab, csak sok idő alatt előállítható, ezért legenerált LPT -ből akar kódból változó sorrendű LPT -ket animálni, és ezek az LPT -k nem férnek el 1000H -n ?

Jó trükk, de csak trükk. Én arról beszélek itt, hogy ELVI gebasz van. 22 -es csapdája.
A trükkök használata nem szokatlan 8 bites gépeken, így például C64-en sem. :) Tehát ha más megoldás nem működik megbízhatóan, akkor esetleg marad az 1000h határra igazítás.

Offline Z80System

  • EP addict
  • *
  • Posts: 3848
  • Country: hu
Re: Grafikai trükkök
« Reply #326 on: 2013.October.30. 11:07:44 »
Quote
Továbbra is tartom azt a véleményemet, hogy oda rakod a VINT-et, ahová akarod. Természetesen az akarásba beleértettem azt is, hogy azért van némi fogalmad arról, hogy minimum/maximum mennyi időt vesz igénybe a képgenerálásod, illetőleg az lineárisan fentről lefelé vagy össze-vissza történik. Ha tudod, hogy a tartalom újraírása soha nem fogja beelőzni a tényleges Nick által végzett képgenerálást, akkor megteheted azt, hogy a látható területre időzíted a szinkronizáló mechanizmusodat.
Igen, ez egy újabb módosítás, ahhoz képest mindenképp, ahogy én gondolkodok a dologról,

viszont míg a borderes dologra még boldogan rábólintok, mert nem tudok jobbat,

addig ezt már határozottan vissza kell utasítsam, biztos vannak olyan feladatok, amiknek a kirajzolásánál ilyeneket figyelembe lehetne venni,

de egy sprite -os grafikánál, vagy egy csillagmozgásnál felülről lefele rendezni a grafikát, és mindíg a videó sugár mögött tartani magam minden sugár pozíció kiolvasási lehetőség nélkül sztm túl sokat lassítana, ez maximum valami komondoros raszter trükknél, vagy ilyesminél lehetne sztm. gazdaságosan alkalmazható.

Azon kívül vegyük észre hogy mind a borderes módszer is (csak az még kevésbé), de ez a "sugárral szinkronizálom magam" módszer pláne, PONT AZ ELLENTÉTE a backbuffer lényegének.

A doublebuffer pont azért lenne, hogy 100% -ban független lehessek a sugártól, egyedül a képváltás van szinkronizálva (elvileg a függöleges visszafutásra, EP- n egy jelentéktelennek tűnő dolog miatt úgy tűnik csak a borderre), és a rajzolás pedig innentől kezdve teljesen szabad a backbufferen, ahogy a legszebbet a leggyorsabban ki tudjuk rajzolni.

Ha én tudom magam a sugárhoz szinkronizálni, akkor rajzolhatok mindent úgy, hogy szinkronizálva vagyok a sugárhoz, és kész, nem kell semilyen doublebuffer.

De mi nem akarunk ilyennel bíbelődni, ezért doublebuffert használunk, csak nem tudjuk a doublebuffert biztonságosan váltani, ezért elkezdünk szinkronizálni a sugárhoz ? Sztm ez értelmetlen. Újabb manifesztálódása csak a 22 -es csapdája problémának.
« Last Edit: 2013.October.30. 11:25:50 by Z80System »
Z80 System

Offline Z80System

  • EP addict
  • *
  • Posts: 3848
  • Country: hu
Re: Grafikai trükkök
« Reply #327 on: 2013.October.30. 11:42:46 »
A probléma általános feloldása sztm. a 2 darab video megszakítás használata. Ez igényli a legkevesebb hekket szerintem, legáltalánosabban kezelhető vele akárhány LPT.

A hátránya, hogy egy icipicit (egy rasztersort) ellop az időből.

Úgy működne, hogy az egyik megszakítás az a reload előtti pixelsorban van (tehát kell hozzá a szinkron bontás, ami Zozo szerint megy), a második megszak pedig a reload mellett az utolsó pixelsorban.

Az első megszakítás nem csinálna semmit, csak beírná (a rendelkezésre állo egy pixelsprnyi idő alatt) az LPT címet. Ettől még nem kezdődne el a következő kirajzolási kör, továbbra is várna a game loop.

Majd a következő megszakítás már ugye akkor kezdődne, mikor az előbb beírt című LPT már be lett olvasva a NICK által, mivel az a reload mellett volt. Na ekkor már kezdődhetne az új kirajzolás, és akár az előbbi LPT -t is lehet írni, újragenerálni, hisz már betöltődött az új.

Tehát egy rasztersor lecsípésével meg lehet oldani a dolgot általánosan, ha nem is elvben.

A két megszakítás megkülönböztetésére meg sztm. simán jó lehetne egy olyan módszer, hogy letiltott megszakkal reszetelünk egy flag -et, mivel tiltottak a megszakok, nem érdekel bennünket ha az éppen aktuális LPT -ben van video megszak, beváltjuk az új LPT -nket forszoltan, onnantól az fog futni, és mivel az LPT -nknek csak a végén lesznek a megszakok, ezért van időnk engedélyezni a megszakokat, és azután csak minden megszakban invertáljuk a flag -et. És ekkor sztm. a flag mutatni fogja melyik megszakunk jött meg éppen.
« Last Edit: 2013.October.30. 11:45:52 by Z80System »
Z80 System

Offline endi

  • EP addict
  • *
  • Posts: 7298
  • Country: hu
  • grafikus, játékfejlesztõ, programozás, scifi, tudományok, vallás
    • Honlapom
Re: Grafikai trükkök
« Reply #328 on: 2013.October.30. 11:49:24 »
Egy kérdés, lehet, hogy a témához semmi köze: vannak olyan lpt animok amik z80-tól függetlenül is működnek, tehát pl. a Scroll demó töltője, NasaGuy demók stb. Ezek hogy is működtek? Képernyő magasságánál*frame magasságú lpt volt csinálva? Asszem így.
Vigyázat! Szektás vagyok! :)

Offline Z80System

  • EP addict
  • *
  • Posts: 3848
  • Country: hu
Re: Grafikai trükkök
« Reply #329 on: 2013.October.30. 11:52:00 »
Quote
Egy kérdés, lehet, hogy a témához semmi köze: vannak olyan lpt animok amik z80-tól függetlenül is működnek, tehát pl. a Scroll demó töltője, NasaGuy demók stb. Ezek hogy is működtek? Képernyő magasságánál*frame magasságú lpt volt csinálva? Asszem így.

Ja. Símán csak egymás után teszed a memóriában az LPT -ket, mintha normál LPT -k lennének, és a reload flag -et csak a legutolsó végére teszed be.
Z80 System