Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
frca
Založen: 28. 07. 2007 Příspěvky: 1558
|
Zaslal: 11. prosinec 2019, 11:16:06 Předmět: DOS obdoba queryPerformanceTimer |
|
|
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 |
|
|
mar
Založen: 16. 06. 2012 Příspěvky: 608
|
Zaslal: 11. prosinec 2019, 12:08:23 Předmět: Re: DOS obdoba queryPerformanceTimer |
|
|
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 |
|
|
mar
Založen: 16. 06. 2012 Příspěvky: 608
|
Zaslal: 11. prosinec 2019, 12:20:16 Předmět: Re: DOS obdoba queryPerformanceTimer |
|
|
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 |
|
|
frca
Založen: 28. 07. 2007 Příspěvky: 1558
|
Zaslal: 11. prosinec 2019, 22:08:41 Předmět: |
|
|
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 |
|
|
mar
Založen: 16. 06. 2012 Příspěvky: 608
|
Zaslal: 11. prosinec 2019, 22:48:21 Předmět: |
|
|
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 |
|
|
frca
Založen: 28. 07. 2007 Příspěvky: 1558
|
Zaslal: 12. prosinec 2019, 08:35:11 Předmět: |
|
|
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 |
|
|
|