Synchronizace časovače T1 s generátorem TV signálu

[přiložený program obsahuje chybu a bude upraven]

Článek řeší problematiku kreslení objektu na obrazovku PMD-85 tak, aby během kreslení tohoto objektu nepřešel pomyslný paprsek TV obrazovky prostorem kreslení, protože potom dojde na 20ms k „zakonzervování“ přechodného stavu, kdy první část obrázku už je nově vykreslená, ale od místa, kde vykreslovací paprsek TV obrazovky „předběhl programátora“, zůstala předchozí animační fáze, nebo obecně nějaký zbytek obrazu, který nesouvisí s tím nově kresleným. Tento jev, ač trvá pouze zmíněných 20ms do dalšího kompletního vykreslení obrazu rozkladovými obvody TV přijímače či monitoru, je velmi viditelný.

A o jeho eliminaci by nám mělo jít především :)

Díky zmínce Martina z RM-Teamu ohledně pokusů, které s Romanem dělali ve věci synchronizace časovače T1 s rozkladovými obvody generátoru TV signálu, jsem se i já natěšil na zdolání výzvy. Něco se povedlo, a tak to předkládám k prostudování.

Protože centrem pozornosti se stane přiložený testovací program, tak jen vysvětlení jeho smyslu a funkce. Program nastaví časovač T1 na stejný časový interval, který zabírá vygenerování jednoho kompletního půlsnímku TV obrazu. Pokud chce programátor něco nakreslit například mezi mikrořádky 20 až 50, pak je bezpečné počkat, až TV monitor vykreslí onen 50 mikrořádek a můžeme začít kreslit náš objekt. Pokud to (pro zjednodušení) stihneme do necelých 20 milisekund, TV paprsek nás nedoběhne, a obrázek při pohybu nebude nepříjemně trhaný. V demonstračním programu se pro názornost kreslí svislý pruh. Prostudováním programu zjistíte, že jiný než souvislý (a svislý) pruh kreslit neumí, přesto se na obrazovce objeví svislý pruh, který bude v určité výšce uskočený do strany. Výšku, kde k tomuto uskočení má dojít, si volím já jako programátor. Jedná se o dynamický děj a je to něco na způsob programového RASTER INTERRUPTu. Protože však časovač T1 neumíme správně sfázovat s rozkladovými obvody (mají pouze stejnou „rychlost“), tak toto sfázování musíme udělat ručně. Například v nějakém dialogu na začátku programu. Něco podobného umožňovala například hra DynaBlaster pro DOS v dialogu nastavení grafické karty.

A nyní k ovládání programu. Tlačítky U a D posouváme nahoru a dolů místo, kde je pruh na obrazovce stranově uskočený. To je to místo, na které si počkám (díky čtení stavu T1) a v tomto okamžiku (= v požadované výšce na obrazovce) začnu kreslit pruh posunutý do strany. Pruh se kreslí shora dolů celý souvislý, ovšem díky přechodu TV paprsku uvidíte novou část pruhu na jedné straně a tu starou, nepřekreslenou, zakonzervovanou část uvidíte uskočenou do druhé strany. Pro sfázování hodnoty časovače T1 s rozkladovými obvody lze stisknout EOL. Vyjeďte si z uskočením pruhu na horní okraj obrazovky, stiskněte EOL a od té chvíle vám číselný ukazatel ukazuje správné číslo mikrořádku, na které je RASTR INTERRUPT nastavený. Pokud stranový úskok pruhu není vidět, stiskněte tlačítko U nebo D a chvíli počkejte, Ten úskok může být totiž schovaný cca 1/4 výšky obrazovky buď nahoře nebo dole pod viditelnou částí obrazovky. Tato viditelná část obrazovky na PMD-85 zabírá pouze 256 z celkových 320 mikrořádků.

Takže pěknou zábavu s touto akademickou hříčkou. I když díky tomu, že T1 běží na pozadí a my se o něj nemusíme starat, tak po prvotním sfázování pomocí nějakého úvodního dialogu ve hře nebo demu můžeme už potom kdykoliv testováním hodnoty T1 dosahovat kreslení synchronního a nerušeného obrazu, tak jak to například na ZX Spectru řeší čtením portu 28h FFh nebo u ostatních počítačů pomocí již zmíněného RASTR INTERRUPTu.

Howg!

zdrojový kód demonstračního programu

zkompilovaný demonstrační program pro emulátor PMD-85 od RM-Teamu

10 komentářů u „Synchronizace časovače T1 s generátorem TV signálu

  1. Libor L.A.

    Tak článek o synchronizaci časovače T1 s rozkladovými obvody generátoru TV signálu je hotov.

  2. mborik

    Wow, tak toto escalovalo velmi rychlo :O
    Klobuk dolu, skvela praca! Prevratna!
    Lebo toto otvara demoscene na PMD 85 okna dokoran, no hlavne sa tesim krasne synchronnym sprajtom v PoP, parada!

    1. Libor L.A.

      Ale mám tam chyby. Lépe je přepnout časovač T1 do módu 3. Pak vychází předpokládaných 128T(8253) na jeden mikrořádek. V módu 2 nevím proč vychází jen 64T(8253) na mikrořádek. Asi je tam dvojnásobný přírůstek při čítání. V některém módu to tak myslím je. Svislé rozlišení viditelné části je 176 a ne 256. A hlavně to nejede jako celek na reálném železe. Samotné synchronní odchycení mikrořádku jede ale havaruje inkrementace a dekrementace požadovaného řádku. No, ještě si s tím budu muset pohrát..

      1. Libor L.A.

        Dnes už mám klid a tak tedy pár poznámek ke zmíněným chybám a domnělým chybám zmíněného demonstračního programu.

        První problém je, že nemohu vysvětlit, proč nastavený časový interval T1 je poloviční oproti výpočtu. Ale tady se dříve nebo později najde vysvětlení. Prostě to funguje, dokonce i na skutečném železe. Fakta mají přednost před teoretickými předpověďmi.

        Číselně nesedí hodnota ukazatele s fyzickou výškou mikrořádku a rozsah viditelných mikrořádků je menší než 256. Zde je na vině zpoždění mezi detekcí nastaveného mikrořádku a začátkem kreslení posunutého svislého pásu. On ten TV rozklad taky mezitím nelení a stále kreslí. To by ale mělo vytvářet chybu aditivní, nikoliv multiplikativní. Takže někde tady jest zakopán pes. A to ještě větší pes, než kterého jsem již vykopal.

        No a na závěr: 8253. Co vám budu povídat. Je to jako pochopit ženu. Ona ta potvora 8253 taky neví co chce, a nedá pokoj, dokud to nedostane. Typickou chybou bývá fakt, že když nastavím čítání od A000h (dolů samozřejmě), tak jako programátor bych očekával hodnoty 9FFFh až 0000h. Ale podle katalogového listu musím očekávat hodnoty A000h až 0001h (nebo 0002h, pokud čítám kroky po dvou, viz mód 3). Až tedy pochopím ženy 8253, bude na světě krásněji, a tento mikroprojekt budu moci uložit do skříně mezi ostatní kostlivce.

    2. Libor L.A.

      Teď jsem to zhruba propočítal, a Prince of Persia zřejmě tuto technologii mít nebude. Na nastavení časovače T1 by totiž byly kladeny dva protichůdné požadavky. Synchronní zápis do videoram dle výše uvedeného článku by potřeboval nastavení T1 přesně na 20ms cyklus, ovšem požadavek na přesné řízení časového rámce hry (zhruba 11FPS) by vyžadoval nastavení časovače T1 maximálně na 12msec cyklus. Časový rámec hry je totiž kontrolován sekvencí časovače T1 obvodu i8253 a UARTu 8251, přičemž minimální délka sekvence UARTu je 7,5 ekvivalentních bitů. Při nastavení T1 na 20msec by pak hry mohla jet maximální rychlostí necelých 7FPS a to je nepoužitelné. Je to škoda, tohle by opravdu hře pomohlo. Ale člověk nemůže mít všechno.

  3. RomBor

    Iba krátko k tej poznámke v texte „tak jak to například na ZX Spectru řeší čtením portu 28h“.
    Na ZX Spectre sa žiadny port 28h nenachádza. Tam ULA vyvoláva prerušenie vždy po „spätnom behu“ , teda keď je lúč vľavo hore, čo je práve približne každých 20 ms.
    A tým, že po vyvolaní programátor presne vie, kde sa lúč nachádza, tak to môže využiť.

    1. Libor L.A.

      Myslel jsem spíše techniku, kdy se čtením (fiktivního) portu na adrese 28h dá zjistit, kdy ULA kreslí BORDER. Pak je bezpečné kreslit do videoram. Myslím, že takto to dělal Arkanoid pro ZXS a já tehdy řešil, jak to nahradit. Ovšem nic jiného než to, co už říkal Martin, jsem nakonec ve verzi pro PMD-85 nepoužil. Pouze maximálně přisadit odmazání staré pozice před vykreslení nové. Ovšem u dalších her jsem přešel na kreslení přes bufer, který část (ale jen část) problémů neutralizuje.

      Ovšem díky za poznámku, každá informace bude později použita u nových her.

      1. RomBor

        To, o čom píšeš, je zrejme port #FF. Pri čítaní tohto portu sa vráti hodnota #FF, ak ULA vykresľuje Border, v opačnom prípade sa vráti hodnota atribútu práve vykresľovaných bodov v danom „štvorci“.
        Všetky párne porty (keďže sa dekóduje iba A0) je ULA port pre klávesnicu, border a MGF.

        1. Libor L.A.

          Ano, zřejmě máš pravdu. Už mi paměť neslouží. Tak jsem se podíval do zdrojového kódu Arkanoidu pro ZXS a tam na adrese 8498h (generování zvuku a synchronizace hry) je uvedeno toto:

          L8498:	di
          	ld bc,X28ff
          	in a,(c)
          	inc a
          	jr z,L8498
          

          A mne zmátla ve vzpomínkách ta hodnota v reg. B. Ale port je FFh, tak jak jsi říkal.

          1. Zdeněk

            …tady někdo mluvit “ Španělská vilage „, ja nerozumět ani H
            Google translator na tohle nefunguje …
            … kde ja mít KLADIVO A KOVADLINU a RUSKÝ POČÍTAČ

Napsat komentář: Libor L.A. Zrušit odpověď na komentář

Vaše e-mailová adresa nebude zveřejněna.