.[ ČeskéHry.cz ].
DOS obdoba queryPerformanceTimer

 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> C / C++
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
frca



Založen: 28. 07. 2007
Příspěvky: 1558

PříspěvekZaslal: 11. prosinec 2019, 11:16:06    Předmět: DOS obdoba queryPerformanceTimer Odpovědět s citátem

Ahoj,
nevzpomínáte si, jak se v DOSu řešilo časování přesnější než oněch 18.2 Hz? Jak to řešil např. DOOM?

Hodnota clock() má praktické rozlišení právě těch 18.2 Hz.

Našel jsem tohle, zhruba jsem to reimplementoval v C:
https://freebasic.net/forum/viewtopic.php?f=4&t=20941

Bohužel se mi během změny o 1 hodnoty z adresy 0x46C (od které se odvozuje i clock()) hodnota PIT protočí 2x (zatím jsem to zkoušel jen na DOSBoxu).


Dále jsem zjistil, že existuje INT 70h Real-Time Clock. Tak mě napadlo si v tomto interruptu inkrementovat můj vlastní čítač. Naivní implementace mi ale nefunguje a nějaký funkční exampl jsem zatím nenašel.


Další možnost by byla VSYNC interrupt (70 Hz v módu 13h), ale ten pravděpodobně neexistuje.


Díky za jakékoli nápady.
_________________
www.FRANTICWARE.com
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
mar



Založen: 16. 06. 2012
Příspěvky: 608

PříspěvekZaslal: 11. prosinec 2019, 12:08:23    Předmět: Re: DOS obdoba queryPerformanceTimer Odpovědět s citátem

18.2Hz je default.

Pokud si vzpomínám, určitě se dá použít PIT, myslím, že má nějaký režim counter, kde si můžeš hodnoty vyčítat.

Alternativně se tím dá nastavit frekvence IRQ0, takže si to dát třeba na 100Hz, ale nevím jak si budeš psát IRQ handler v C, možná přes inline assembly (a hlavně pak nezapomenout na out 0x20, 0x20).
EDIT: tzn nahookovat se na int 8, pokud si vzpomínám, tak interrupt table začínal na adrese nula?

Bohužel staré zdrojáky z DOSových dob už jsem dávno ztratil, takže víc si nevzpomenu.

Nejsem si jistý, že VGA generoval vblank interrupt. Skoro bych řekl, že ne (ale dalo se vynutit na něj počkat, myslím zápisem něčeho do 0x3da)
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
mar



Založen: 16. 06. 2012
Příspěvky: 608

PříspěvekZaslal: 11. prosinec 2019, 12:20:16    Předmět: Re: DOS obdoba queryPerformanceTimer Odpovědět s citátem

Ještě s tou adresou nula, tak to platilo jen v reálném módu, ale ty myslím jedeš přes OpenWatcom.
Tzn ten jejich extender pojede přes nějaký vlastní interrupt descriptor table, ale musí na tyhle věci mít nějakou podporu v knihovnách v překladači, jinak by staré Watcomácké hry moc dobře nefungovaly,
ale tady to už jde úplně mimo mě.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
frca



Založen: 28. 07. 2007
Příspěvky: 1558

PříspěvekZaslal: 11. prosinec 2019, 22:08:41    Předmět: Odpovědět s citátem

DOOM právě taky používal Watcom (DOS4GW) a nějak musel zjistit, kolik framů mu "uteklo", pokud hardware nestíhal. A to je přesně můj use case.
_________________
www.FRANTICWARE.com
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
mar



Založen: 16. 06. 2012
Příspěvky: 608

PříspěvekZaslal: 11. prosinec 2019, 22:48:21    Předmět: Odpovědět s citátem

tady je link na zdrojaky Heretica (doom source na githubu je uz upravene pro moderni systemy)
https://github.com/OpenSourcedGames/Heretic/tree/master/Heretic%20Source
podivej se na I_IBM.C, tam to resi.
nastavi frekvenci IRQ0 na (70? Hz), napichne se na to a jenom tam inkrementuje tick counter
pouziva tam _dos_setvect na nastaveni handleru, handler sam o sobe ma prefix __interrupt, snad to v OpenWatcomu bude fungovat
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
frca



Založen: 28. 07. 2007
Příspěvky: 1558

PříspěvekZaslal: 12. prosinec 2019, 08:35:11    Předmět: Odpovědět s citátem

To je ono! Myslím, že to fungovat bude, propočítával jsem frekvenci a je to ~35 Hz.
_________________
www.FRANTICWARE.com
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> C / C++ Časy uváděny v GMT + 1 hodina
Strana 1 z 1

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna