Welcome, Guest. Please login or register.


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

Offline Povi

  • EP addict
  • *
  • Posts: 1965
  • Country: hu
  • OS:
  • Windows XP Windows XP
  • Browser:
  • Firefox 52.0 Firefox 52.0
    • View Profile
    • http://povi.fw.hu
Re: Grafikai trükkök
« Reply #600 on: 2017.September.15. 12:51:57 »
van-e valami trükk villogás mentes sprite rajzolásra?

4 színű, 16x16 pixeles (4x16 byte) méretről van szó, de egy helyben állva is izgő-mozgó, szóval minden fázisnál törlés, majd újra rajzolás

képernyő tetején villog (gondolom, pont akkor ér oda a sugár) az alsóbb sorokban már szép

egy halt-ot tettem a törlés elé

ha a rajzolás elé is teszek halt-ot, akkor folyamatosan villog
*** Speicherplatz zu klein

Offline Zozosoft

  • EP addict
  • *
  • Posts: 13731
  • Country: hu
  • OS:
  • Windows XP Windows XP
  • Browser:
  • Firefox 52.0 Firefox 52.0
    • View Profile
    • http://enterprise.iko.hu/
Re: Grafikai trükkök
« Reply #601 on: 2017.September.15. 13:04:30 »
Spritéhez nem értek :oops: De egy trükk ami segíthet némi időt nyerni:

A klasszikus LPT felépítése ez: felső keret, kép, alsó keret, szinkronizáció (esetleg: kép, alsó keret, szinkronizáció, felső keret).
Ehelyett így célszerű: alsó keret, szinkronizáció, felső keret, kép
A lényeg, hogy a kép végén történjen a videó megszakítás, a lehető legtöbb idő álljon rendelkezésre mielőtt újra a kép megjelenítéséhez érne.

Offline IstvanV

  • EP addict
  • *
  • Posts: 4825
  • OS:
  • Linux Linux
  • Browser:
  • Firefox 52.0 Firefox 52.0
    • View Profile
Re: Grafikai trükkök
« Reply #602 on: 2017.September.15. 13:13:35 »
Ha nem lehet elég gyorsra írni a rajzolást ahhoz, hogy a képernyő felső része előtt befejeződjön (a felhasználható idő maximalizálása céljából érdemes a megszakítást a lehető legkorábbra helyezni, például az alsó keret elé, vagy ha a képernyő alsó részén pontszámkijelzés található, akkor akár már oda), akkor két video lap használata lehet a megoldás, így működik például a Skramble is. Azaz mindig arra a lapra kell rajzolni, amelyik éppen nem látható, és a megszakításnál váltani kell a megjelenítésüket. Így közel 100% CPU idő használható villogás nélkül, de kétszeres lesz a video memória fogyasztás, és késést ad a megjelenítéshez (azaz hosszabb idő telik el a billentyűzet bemenet és a sprite látható elmozdulása között).

Offline Povi

  • EP addict
  • *
  • Posts: 1965
  • Country: hu
  • OS:
  • Windows XP Windows XP
  • Browser:
  • Firefox 52.0 Firefox 52.0
    • View Profile
    • http://povi.fw.hu
Re: Grafikai trükkök
« Reply #603 on: 2017.September.15. 13:21:19 »
Ha nem lehet elég gyorsra írni a rajzolást ahhoz, hogy a képernyő felső része előtt befejeződjön (a felhasználható idő maximalizálása céljából érdemes a megszakítást a lehető legkorábbra helyezni, például az alsó keret elé, vagy ha a képernyő alsó részén pontszámkijelzés található, akkor akár már oda)

Szerintem a rajzolás elég gyors, max. 6 darab 4x16 byte-os sprite-ról lenne szó.
Ez a hova tegyem a megszakítást, és az egész LPT kérdés nekem nagyon nagy homály :oops:
Jelenleg egy 4 színű, 320x200-as képernyőt használok, azt is István valamelyik fraktál rajzoló programjából vettem ki :-)
*** Speicherplatz zu klein

Offline IstvanV

  • EP addict
  • *
  • Posts: 4825
  • OS:
  • Linux Linux
  • Browser:
  • Firefox 52.0 Firefox 52.0
    • View Profile
Re: Grafikai trükkök
« Reply #604 on: 2017.September.15. 13:41:31 »
Jelenleg egy 4 színű, 320x200-as képernyőt használok, azt is István valamelyik fraktál rajzoló programjából vettem ki :-)

Ha ez az ep128.hu-n található Fractals.rar-ból a GRAPH.S, akkor így módosítható:

Ez az eredeti LPT, itt a VSYNC-nél van a video megszakítás:

        defb    256 - VIDEO_HEIGHT, 12h
        defb    (63 - VIDEO_WIDTH) / 2, (63 + VIDEO_WIDTH) / 2
        defw    0000h, 0000h
        defb    BG_COLOR, FG_COLOR, 0, 0, 0, 0, 0, 0
        defb    256 - ((294 - VIDEO_HEIGHT) / 2), 02h,  63, 0,  0, 0, 0, 0
        defb    0, 0, 0, 0, 0, 0, 0, 0
        defb    256 - 3, 80h,  63, 0,  0, 0, 0, 0
        defb    0, 0, 0, 0, 0, 0, 0, 0
        defb    256 - 2, 00h,  6, 63,  0, 0, 0, 0
        defb    0, 0, 0, 0, 0, 0, 0, 0
        defb    256 - 1, 00h,  63, 32,  0, 0, 0, 0
        defb    0, 0, 0, 0, 0, 0, 0, 0
        defb    256 - 3, 00h,  63, 0,  0, 0, 0, 0
        defb    0, 0, 0, 0, 0, 0, 0, 0
        defb    256 - 9, 02h,  6, 63,  0, 0, 0, 0
        defb    0, 0, 0, 0, 0, 0, 0, 0
        defb    256 - ((295 - VIDEO_HEIGHT) / 2), 03h,  63, 0,  0, 0, 0, 0
        defb    0, 0, 0, 0, 0, 0, 0, 0


Itt az alsó keret elejére kerül:

        defb    256 - VIDEO_HEIGHT, 12h
        defb    (63 - VIDEO_WIDTH) / 2, (63 + VIDEO_WIDTH) / 2
        defw    0000h, 0000h
        defb    BG_COLOR, FG_COLOR, 0, 0, 0, 0, 0, 0
        defb    256 - 1, 82h,  63, 0,  0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0
        defb    256 - ((292 - VIDEO_HEIGHT) / 2), 02h,  63, 0,  0, 0, 0, 0
        defb    0, 0, 0, 0, 0, 0, 0, 0
        defb    256 - 3, 00h,  63, 0,  0, 0, 0, 0
        defb    0, 0, 0, 0, 0, 0, 0, 0
        defb    256 - 2, 00h,  6, 63,  0, 0, 0, 0
        defb    0, 0, 0, 0, 0, 0, 0, 0
        defb    256 - 1, 00h,  63, 32,  0, 0, 0, 0
        defb    0, 0, 0, 0, 0, 0, 0, 0
        defb    256 - 3, 00h,  63, 0,  0, 0, 0, 0
        defb    0, 0, 0, 0, 0, 0, 0, 0
        defb    256 - 9, 02h,  6, 63,  0, 0, 0, 0
        defb    0, 0, 0, 0, 0, 0, 0, 0
        defb    256 - ((295 - VIDEO_HEIGHT) / 2), 03h,  63, 0,  0, 0, 0, 0
        defb    0, 0, 0, 0, 0, 0, 0, 0


Egy másik lehetséges megoldás, amely nem növeli az LPT méretét (a VINT bitnek csak a lefutó éle lényeges, tehát itt is az alsó keret elején történik megszakítás):

        defb    256 - VIDEO_HEIGHT, 92h
        defb    (63 - VIDEO_WIDTH) / 2, (63 + VIDEO_WIDTH) / 2
        defw    0000h, 0000h
        defb    BG_COLOR, FG_COLOR, 0, 0, 0, 0, 0, 0
        defb    256 - ((294 - VIDEO_HEIGHT) / 2), 02h,  63, 0,  0, 0, 0, 0
        defb    0, 0, 0, 0, 0, 0, 0, 0
        defb    256 - 3, 00h,  63, 0,  0, 0, 0, 0
        defb    0, 0, 0, 0, 0, 0, 0, 0
        defb    256 - 2, 00h,  6, 63,  0, 0, 0, 0
        defb    0, 0, 0, 0, 0, 0, 0, 0
        defb    256 - 1, 00h,  63, 32,  0, 0, 0, 0
        defb    0, 0, 0, 0, 0, 0, 0, 0
        defb    256 - 3, 00h,  63, 0,  0, 0, 0, 0
        defb    0, 0, 0, 0, 0, 0, 0, 0
        defb    256 - 9, 02h,  6, 63,  0, 0, 0, 0
        defb    0, 0, 0, 0, 0, 0, 0, 0
        defb    256 - ((295 - VIDEO_HEIGHT) / 2), 03h,  63, 0,  0, 0, 0, 0
        defb    0, 0, 0, 0, 0, 0, 0, 0
« Last Edit: 2017.September.15. 14:22:18 by IstvanV »

Offline Povi

  • EP addict
  • *
  • Posts: 1965
  • Country: hu
  • OS:
  • Windows XP Windows XP
  • Browser:
  • Firefox 52.0 Firefox 52.0
    • View Profile
    • http://povi.fw.hu
Re: Grafikai trükkök
« Reply #605 on: 2017.September.16. 20:58:55 »
Itt az alsó keret elejére kerül:
Köszi, ez működik! Így nem villog! (egyelőre egy sprite-om van, kíváncsi vagyok, milyen lesz, ha a többit is kirakom)
*** Speicherplatz zu klein

Offline Tomato77

  • EP user
  • *
  • Posts: 251
  • Country: hu
  • OS:
  • Windows 7/Server 2008 R2 Windows 7/Server 2008 R2
  • Browser:
  • Chrome 61.0.3163.100 Chrome 61.0.3163.100
    • View Profile
Re: Grafikai trükkök
« Reply #606 on: 2017.October.03. 22:11:09 »
Sziasztok!

Talán itt a legjobb feltenni ezt a kérdést: ha Basic-ben (vagy inkább Pascal-ban) közvetlenül szeretnék turkálni a videomemóriában poke-kal, le lehet kérdezni valahogyan a videomemória kezdő címét? Ha több grafikus lap van nyitva, honnan tudom megállapítani, hogy mondjuk pl. az 1-es video: csatornához megnyitott lap a memória melyik részén kezdődik? Gépi kódban és az EXOS memóriakezelésében egyáltalán nem vagyok járatos, ezeket a lapozásokat sem értem, hogyan működnek, vagy hogy mikor melyik 16K-s szegmenst lehet vagy kell belapozni. Egyáltalán Basic-ben vagy Pascal-ban lehet ilyeneket csinálni? A konkrét problémám az, hogy szeretnék képet betölteni gyorsan, nem pixelenként PLOT-olgatva, hanem valahogy soronként kirakva (Pascalban talán elég gyors lenne).
Kotasoft

Offline geco

  • EP addict
  • *
  • Posts: 5753
  • Country: hu
  • OS:
  • Linux Linux
  • Browser:
  • Firefox 52.0 Firefox 52.0
    • View Profile
Re: Grafikai trükkök
« Reply #607 on: 2017.October.04. 08:54:35 »
Ha jól emlékszem, akkor a következő parancs így néz ki:
10 LPTADDR=SPEEK  ( (255,16373) * 256 + SPEEK (255,16372) ) - 32768
20 LINE1ST=LPTADDR+16+4
30 ADDR1ST=SPEEK ( 255,LINE1ST+1) * 256 + SPEEK ( 255,LINE1ST)
40 ADDR2ND=SPEEK ( 255,LINE1ST+16+1) * 256 + SPEEK ( 255,LINE1ST+16)

10. sorban LPTADDR változóba bekerül az LPT címe az FF-szegmensen belül
20. LINE1ST az EXOS képernyő első sorának videócímére mutat az LPT-ben
30. ADDR1ST-ben az EXOS képernyő első sorának címe található, viszont ez még Nick cím, ki kell vonni belőle még 49152-t, ha ez negatív szám, akkor az aktuális EXOS képernyő sor nem az FF szegmensen van, ha 0-16383, akkor az FC szegmenst, ha 16384-32767, akkor az FD szegmenst, ha 32768-49151, akkor az FE szegmenst kell belapozni az adott sorba való adat íráshoz.

Offline Povi

  • EP addict
  • *
  • Posts: 1965
  • Country: hu
  • OS:
  • Windows NT 10.0 Windows NT 10.0
  • Browser:
  • Chrome 61.0.3163.100 Chrome 61.0.3163.100
    • View Profile
    • http://povi.fw.hu
Re: Grafikai trükkök
« Reply #608 on: 2017.October.04. 11:33:49 »
Sziasztok!

Talán itt a legjobb feltenni ezt a kérdést: ha Basic-ben (vagy inkább Pascal-ban) közvetlenül szeretnék turkálni a videomemóriában poke-kal, le lehet kérdezni valahogyan a videomemória kezdő címét?

Az EXOS 11 pont erre való.
Code: [Select]
        ld   a, video_channel
        ld   b, 3       ; @@ADDR
        exos 11
A BC regiszterben kapod meg a videó memória címét (NICK cím, tehát abból még ki kell számolni, melyik szegmensre esik, és be kell lapozni!)

Pascal-ban: (ha el nem rontottam)
Code: [Select]
function GetVideoAddress(channel: integer) : integer;
begin
  inline(#dd,#7e,#02)       {ld a,(ix+02)};
  inline(#06,#03)           {ld b,3};
  inline(#f7,#0b)           {exos 11};
  inline(#dd,#70,#05)       {ld (ix+5),b};
  inline(#dd,#71,#04)       {ld (ix+4),c};
end;
*** Speicherplatz zu klein

Offline Tomato77

  • EP user
  • *
  • Posts: 251
  • Country: hu
  • OS:
  • Linux Linux
  • Browser:
  • Chrome 50.0.2661.94 Chrome 50.0.2661.94
    • View Profile
Re: Grafikai trükkök
« Reply #609 on: 2017.October.04. 13:22:04 »
@Geco: Köszönöm! Sikerült képpontokat megjeleníteni. :) A szegmens számát a Nick címből így számoltam ki: 252+INT(ADDR/16384), az ofszet-et pedig ADDR BAND 16383-mal.
Úgy látom, a sorok karaktersorokat jelentenek, ami jó, mert Basicből is karaktersoronként lehet videolapot nyitni. Feltételezem, hogy ha egymás után nyitok több videolapot, azok a memóriában is egymás után következnek. Olyankor mi történik, ha egy sor már nem fér el egy szegmensen, akkor átlóg a következőre? Tehát előfordulhat, hogy a sor első fele az egyik szegmens végén van, a másik pedig a következő szegmens elején?

@Povi: A gépi kódot egyáltalán nem értem, sajnos az ilyen hexa inline-os sorok még kommentekkel se mondanak semmit. :( Azért köszi! :)
« Last Edit: 2017.October.04. 15:38:15 by Tomato77 »
Kotasoft

Offline geco

  • EP addict
  • *
  • Posts: 5753
  • Country: hu
  • OS:
  • Linux Linux
  • Browser:
  • Firefox 52.0 Firefox 52.0
    • View Profile
Re: Grafikai trükkök
« Reply #610 on: 2017.October.04. 13:33:00 »
Az a baj, hogy az LPT-ben nem, feltétlenül követi a következő sor a videómemóriában az előzőt, tehát akkor jársz a legjobban, ha minden LPB-ben (LPT sorban) lekérdezed annak kezdőcímét.

Offline Tomato77

  • EP user
  • *
  • Posts: 251
  • Country: hu
  • OS:
  • Linux Linux
  • Browser:
  • Chrome 50.0.2661.94 Chrome 50.0.2661.94
    • View Profile
Re: Grafikai trükkök
« Reply #611 on: 2017.October.04. 15:28:58 »
Rendben, köszönöm! Soronként fogom lekérdezni a kezdő címet.

Azt szeretném még megkérdezni, hogy ha egy videolap nem fér el a szegmensen, le lehet kérdezni, hogy a maradék része hová kerül? Pl. egy 42 karakter széles, 1 karakter magas lap 84*9, azaz 756 bájt helyet igényel. Mondjuk ha a szegmens végén már csak 500 szabad bájt van, akkor a maradék 256-ot másikon kezdi, vagy az egészet a következőn helyezi el? Nekem az előbbi lenne logikus, mert pl. egy 42*27 karakter méretű lap (20413bájt) is csak két szegmensen fér el. Jól gondolom, hogy ilyenkor a Nick címből lehet kiszámolni, hogy melyik lesz a következő szegmens és annak az elején folytatódik?

Még egyet szeretnék kérdezni: az Enterprise a szegmensek lapozásakor mit csinál? Történik olyankor 16 kilobájtnyi adatmozgás, vagy lapozáskor csak beállítja, hogy épp melyik szegmensekkel fog dolgozni, azaz gyorsan végrehajtja?
Kotasoft

Offline endi

  • EP addict
  • *
  • Posts: 7305
  • Country: hu
  • grafikus, játékfejlesztõ, programozás, scifi, tudományok, vallás
  • OS:
  • Windows 7/Server 2008 R2 Windows 7/Server 2008 R2
  • Browser:
  • Chrome 61.0.3163.91 Chrome 61.0.3163.91
    • View Profile
    • Honlapom
Re: Grafikai trükkök
« Reply #612 on: 2017.October.04. 15:33:58 »
Még egyet szeretnék kérdezni: az Enterprise a szegmensek lapozásakor mit csinál? Történik olyankor 16 kilobájtnyi adatmozgás, vagy lapozáskor csak beállítja, hogy épp melyik szegmensekkel fog dolgozni, azaz gyorsan végrehajtja?

nincs adatmozgatás, nagyon gyors a váltás
Vigyázat! Szektás vagyok! :)

Offline geco

  • EP addict
  • *
  • Posts: 5753
  • Country: hu
  • OS:
  • Linux Linux
  • Browser:
  • Firefox 52.0 Firefox 52.0
    • View Profile
Re: Grafikai trükkök
« Reply #613 on: 2017.October.04. 15:44:29 »
Azt szeretném még megkérdezni, hogy ha egy videolap nem fér el a szegmensen, le lehet kérdezni, hogy a maradék része hová kerül? Pl. egy 42 karakter széles, 1 karakter magas lap 84*9, azaz 756 bájt helyet igényel. Mondjuk ha a szegmens végén már csak 500 szabad bájt van, akkor a maradék 256-ot másikon kezdi, vagy az egészet a következőn helyezi el? Nekem az előbbi lenne logikus, mert pl. egy 42*27 karakter méretű lap (20413bájt) is csak két szegmensen fér el. Jól gondolom, hogy ilyenkor a Nick címből lehet kiszámolni, hogy melyik lesz a következő szegmens és annak az elején folytatódik?
Nem tudom, ilyet csinál-e az EXOS, ha igen, akkor a következő lapon folytatódik, pl ha az FC szegmens végén lenne a kezdőcím, akkor az FD elején folyatatódna.

Offline ergoGnomik

  • EP lover
  • *
  • Posts: 955
  • Country: hu
  • Stray cat from Commodore alley
  • OS:
  • Windows 7/Server 2008 R2 Windows 7/Server 2008 R2
  • Browser:
  • Opera 12.17 Opera 12.17
    • View Profile
Re: Grafikai trükkök
« Reply #614 on: 2017.October.04. 15:46:58 »
Rendben, köszönöm! Soronként fogom lekérdezni a kezdő címet.

Azt szeretném még megkérdezni, hogy ha egy videolap nem fér el a szegmensen, le lehet kérdezni, hogy a maradék része hová kerül? Pl. egy 42 karakter széles, 1 karakter magas lap 84*9, azaz 756 bájt helyet igényel. Mondjuk ha a szegmens végén már csak 500 szabad bájt van, akkor a maradék 256-ot másikon kezdi, vagy az egészet a következőn helyezi el? Nekem az előbbi lenne logikus, mert pl. egy 42*27 karakter méretű lap (20413bájt) is csak két szegmensen fér el. Jól gondolom, hogy ilyenkor a Nick címből lehet kiszámolni, hogy melyik lesz a következő szegmens és annak az elején folytatódik?

Még egyet szeretnék kérdezni: az Enterprise a szegmensek lapozásakor mit csinál? Történik olyankor 16 kilobájtnyi adatmozgás, vagy lapozáskor csak beállítja, hogy épp melyik szegmensekkel fog dolgozni, azaz gyorsan végrehajtja?
A NICK nem ismeri a szegmensek fogalmát. Neki van 64kB memóriája, amit lineárisan címez. Tehát ha "átlóg" egy memóriaterület az aktuális "szegmensről", akkor az a a következő "szegmensen" folytatódik. A Z80 szempontjából, vagyis a saját programod szemszögéből ilyenkor eggyel nagyobb szegmensszámot kell választani. Kivéve persze a 255-ös szegmens esetét, mert akkor értelemszerűen a 252-esen kell folytatni. Ha jól tudom.