OldComp.cz

Komunitní diskuzní fórum pro fanoušky historických počítačů


Právě je 28.03.2024, 10:43

Všechny časy jsou v UTC + 1 hodina [ Letní čas ]




Odeslat nové téma Odpovědět na téma  [ Příspěvků: 14 ] 
Autor Zpráva
 Předmět příspěvku: Synchronizácia emulátora
PříspěvekNapsal: 06.03.2022, 17:39 
Offline
Pan Štábní
Uživatelský avatar

Registrován: 09.10.2013, 19:04
Příspěvky: 1403
Has thanked: 130 times
Been thanked: 71 times
Ako ste synchronizovali rýchlosť emulátora?

Aká synchronizácia ešte má cenu a čo už nie?

O čo mi ide? Ja synchronizujem tuším takto:
Zapamätám si čas o 1/50 s väčší než je posledný zapamätaný. Emulátor vykonáva inštrukcie a popri tom sledujem obraz. Ak sa vygeneruje obrazovka, tak čakám do času, aký som si zapamätal. Čas vo Windows sa synchronizuje cca 60x za sekundu, takže to nie je ideálne presné, ale dá sa. Ako náhle uplynie minimálne 1/50 sekundy, tak sa proces opakuje. Zdôrazňujem, že pracujem s časom, ktorý som si pamätal a k nemu pridávam 1/50 sekundy. Zistil som, že to ale nie je presné, lebo Zdeňkov emulátor sa od môjho dosť rýchlo rozsynchronizuje. Áno viem, obraz sa negeneruje presne 50x za sekundu a to bude asi kameň úrazu. Za to mi aj zvuk praská.

Zaujíma ma ale aj ako tie svoje výtvory synchronizovali vy. Keď aj pod DOSom. Nie je problém s tým, že počas 1/50 s beží emulátor na maximum? Nie je lepšie synchronizovať na 1 ms?

O čo ide: Pridával som, napr., vkladanie textu zo schránky v BASICu. Tam som mal dosť veľký problém synchronizovane vložiť aj pár znakov za sekundu. Niečo mi tam robí problém. Možno to nie je ani v synchronizácii, ale v niečom inom. Ale ide mi o to, že podobných problémov so synchronizáciou by mohlo byť viac za určitých okolností.

_________________
Sharp MZ-821
Milsa MZ-841


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Synchronizácia emulátora
PříspěvekNapsal: 06.03.2022, 19:42 
Offline
Pan Štábní

Registrován: 11.11.2013, 10:29
Příspěvky: 1198
Has thanked: 359 times
Been thanked: 304 times
Myslim, ze jsi otevrel velice komplexni tema s nekolika presahy. Predevsim, pokud pises emulator pod DOSem, tak to je uz dneska fakt hodne stara technologie. Tam mas system jeste jakz-takz pod kontrolou. Ale jsi uz docela v praveku ;-)
Pokud pod Win10 a vyse nebo pod Linuxem, tak tam je to otazka, jak se s tim vyrovnat v preeptivnim multitaskingu. Podivej se na to, jak se vyuzivat vysokorychlostni timery, zjisti si jakou pouzivaji granularitu a rozpocitej si, kolik taktu procesoru (myslim Z80) stihnes udelat. Tak je proste nechej udelat a muzes odevzdat cas procesoru (myslim PC) systemu. Az nabehne dasli tik timeru budes pokracovat v emulaci.
V emulatorech je asi obecne 'prubirskym' kamenem, kdyz program neco pise do borderu. Uplne nejvice je, pokud tam dokonce neco vykresluje, treba nejaky text nebo tak. Treba IMHO hudebni sw od Fuxsoft to dela.
Je to sice docela slozite, ale odmenou je velice realisticka emulace daneho pocitace.

_________________
Sharp MZ-800++, MZ-1500++, MZ-2500++, SM-B-80T, MK-14_replica, HP-85, ZX-80+replica, ZX81, ZX-Spectrum+replica++, PMI-80+replica, SAM coupe++, PMD-85-2A+3, Didaktik-M, SORD-M5, TI-57, TI-59+PC-100, TI99/4A, ZetaV2+ppp, ZX-uno, Petr


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Synchronizácia emulátora
PříspěvekNapsal: 06.03.2022, 20:11 
Offline
Pan Štábní
Uživatelský avatar

Registrován: 09.10.2013, 19:04
Příspěvky: 1403
Has thanked: 130 times
Been thanked: 71 times
No, odpovedal si obšírne a v podstate to, čo píšeš nie je problém. Emulácia ako taká sa dá urobiť dobre aj s borderom. To mám vyriešené celkom slušne. Problém je ale v časovaní, aby rýchlosť emulátora odpovedala reálnemu stroju. A o to mi ide, že kde brzdiť a ako. Píšeš o vysokorýchlostných časovačoch. Viem. Je to tuším PerformanceCounter a niečo som už o tom našiel. Nie je ale jednoduché ho naprogramovať tak, aby sedela jednotka času v rámci systému ako takého. Nemám na mysli teraz emuláciu, len čisto systém. Takže ten som zamietol. Ono aj z toho dôvodu, lebo je to silne viazané na platformu. Môj emulátor bude aj v Linuxe fungovať tak ako vo Winodws. V Linuxe sa tiež dajú použiť vysokorýchlostné časovače, ale tam sa to robí úplne inak. Hľadám riešenie, ktoré bude ideálne najjednoduchšie, príp., s jemnými úpravami v rámci systému. Jedno už mám. Ale neviem, či je to postačujúce.

Časovanie vo Windows (uvažujme XP a viac, keďže starší neviem reálne bez virtualizácie vyskúšať) je štandardne 1/60 s. Na základe toho viem očasovať emulátor tak, aby jeho rýchlosť odpovedala. V Linuxe je časovanie 1/1000 s, takže tam viem presne bežať v rámci jednotiek ms. No a mne hlavne ide o to, či je problém, ak počas vykresľovania obrazovky emulovaného počítača (áno, je to previazané práve pre vykresľovanie borderu) beží emulácia na plný kotol. Po vykreslení obrazovky sa čaká na prejdenie 1/50 s a teda emulácia stojí. Čiže samotný počítač je vlastne emulovaný tak, že 50x za sekundu beží na plný kotol. A mňa zaujíma, či je toto z hľadiska emulácie bez problémov alebo či pri tom môžu nejaké problémy vzniknúť a mal by som sa uberať radšej systémom 1000x za sekundu na plný kotol a medzi tým stáť. Áno v Linuxe to nie je problém a pri drobných úpravách sa to dá aj vo Windowse. Multimediálna knižnica vo Windows (neviem, či sa jedná o DirectX alebo čo, ale v Linuxe taká nie je) dokáže časovať aj v jednotkách ms.

A ten DOS? Nie, v DOSe emulovať nechcem, hoci mám tajný sen, vidieť zdrojáky emulátora Zdeňka Adlera v DOSe, keďže je to jeden z najlepších emulátorov v DOSe. Skôr mi išlo o to, že ako to kto časoval tam. Viem, že hodiny DOSu bežia cca 18,2x za sekundu vďaka I8253 (niečo to má s MZ spoločné) a predpokladám, že tam sa to robilo tak, že sa kreslilo určitý počet taktov, koľko by v DOSe trvalo, kým dôjde k prerušeniu a potom sa čakalo na prerušenie.

No a o to ide, že to je môj pohľad na emuláciu. Vymyslel som si ho sám. Zaujíma ma, či existuje aj iný návrh časovania emulácie a jeho uvedenie do praxe, či s tým boli problémy alebo to bolo jednoduché a veci okolo toho.

_________________
Sharp MZ-821
Milsa MZ-841


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Synchronizácia emulátora
PříspěvekNapsal: 06.03.2022, 20:17 
Offline
Pan Štábní
Uživatelský avatar

Registrován: 09.10.2013, 19:04
Příspěvky: 1403
Has thanked: 130 times
Been thanked: 71 times
Ešte doplním, že časovanie spomalenia procesora za určitých okolností, tak ako má Michal vo svojom emulátore, aby emulácia bola sakra presná, to neplánujem, lebo netuším, aké časy tam sú a kedy spomaľovať. MZ ale nie je ZX81, kde by to malo byť nejak markantné, teda aspoň dúfam. Pozerám sa na to tak, že každý vývojár emulátora má svoje priority, čo tam dať a čo nie. Michal hovoril, že uňho nie sú prioritou snapshoty. U mňa emulátor bez nich nemá význam. Plánujem aj "certifikáciu" MZSX formátu, ale to má ešte čas. Ale to už odchádzam od témy.

Reklama ;-) : Mimochodom, Zdeňkov emulátor pri načítaní snapshotu nespustí čítače, takže môj emulátor je jediný na svete, v ktorý po načítaní snapshotu dovolí dohrať Galao. (Teraz všetci budú skúšať, čo spraví Zdeňkov emulátor po načítaní snapshotu Galaa. :-D )

_________________
Sharp MZ-821
Milsa MZ-841


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Synchronizácia emulátora
PříspěvekNapsal: 06.03.2022, 20:22 
Offline
Pan Štábní
Uživatelský avatar

Registrován: 24.05.2018, 22:32
Příspěvky: 1972
Bydliště: Most, Praha
Has thanked: 863 times
Been thanked: 697 times
Ve Windows SDK funkce:
- timeBeginPeriod(1); nastaví granularitu časování po 1 ms
- timeGetTime vrací čas od startu systému v [ms]
- QueryPerformanceFrequency a QueryPerformanceCounter je přesné měření času odvozené od tiků procesoru
- Sleep je čekání v [ms], Sleep(0) je minimální obsluha multitasku, kdy pokud možno nečeká, jen zpracuje zprávy a předá řízení dalším vláknům pokud je to nutné (zabrání se tak nečekanému přerušení v nevhodnou chvíli)

Při synchronizaci emulátoru každá instrukce zvýší čítač taktů virtuálního času procesoru. Virtuální čas se porovnává s reálným časem a čeká se, dokud reálný čas nedosáhne virtuálního času. Synchronizaci není nutné dělat po každé instrukci (protože přepočty časů něco zaberou), stačí instrukce počítat a synchronizovat např. po 256 instrukcích. (tedy ne synchronizovat podle obrazovky, ale podle instrukcí) Během synchronizace vypočítat rozdíl časů v [ms] a podle toho zavolat funkci Sleep s vypočteným rozdílem, s minimem 0 ms. Nepočítat ale s přesným časem Sleep, ten není přesný, pracuje s průměrnou hodnotou. Přesné časování odvozovat od přesného časovače.

_________________
i++ (INC) increment
i-- (DEC) decrement
i@@ (EXC) excrement


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Synchronizácia emulátora
PříspěvekNapsal: 06.03.2022, 22:57 
Offline
Pan Štábní

Registrován: 11.11.2013, 10:29
Příspěvky: 1198
Has thanked: 359 times
Been thanked: 304 times
Tak jsem vytahnul svuj pokus o emulator (nekdy z roku 2002) a tam jsem to delal v podstate presne tak jak pise Panda38. To prepnuti na sleep() jsem delal po 20 taktech Z80. Opravdu uz nevim proc, mozna to bylo zbytecne casto, ale tak jsem to proste tehdy mel.

_________________
Sharp MZ-800++, MZ-1500++, MZ-2500++, SM-B-80T, MK-14_replica, HP-85, ZX-80+replica, ZX81, ZX-Spectrum+replica++, PMI-80+replica, SAM coupe++, PMD-85-2A+3, Didaktik-M, SORD-M5, TI-57, TI-59+PC-100, TI99/4A, ZetaV2+ppp, ZX-uno, Petr


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Synchronizácia emulátora
PříspěvekNapsal: 06.03.2022, 23:10 
Offline
Pan Štábní
Uživatelský avatar

Registrován: 09.10.2013, 19:04
Příspěvky: 1403
Has thanked: 130 times
Been thanked: 71 times
Ja to teda skúsim upraviť na tú 1 ms pomocou knižnice MMSystem a uvidím, čo to bude robiť. Samozrejme pri max. rýchlosti, tam nič neriešim. Dáva to cca 3600 % reálneho počítača. Zdeňkov a Michalov emulátor sú cca 3x rýchlejšie.

_________________
Sharp MZ-821
Milsa MZ-841


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Synchronizácia emulátora
PříspěvekNapsal: 09.05.2023, 18:22 
Offline
Pan Štábní
Uživatelský avatar

Registrován: 09.10.2013, 19:04
Příspěvky: 1403
Has thanked: 130 times
Been thanked: 71 times
Takže časovanie mám hádam relatívne presné, použil som MMSystem a nastavil som časovanie na 1 ms. Emulátor ale znateľne uteká oproti ostatným emulátorom. Napadlo ma ale, že v určitých častiach pamäte dochádza k spomaľovaniu a nie som si istý, či to nemôže byť tým. O aké spomaľovanie ide a o koľko to je?

_________________
Sharp MZ-821
Milsa MZ-841


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Synchronizácia emulátora
PříspěvekNapsal: 10.05.2023, 18:34 
Offline
Pan Štábní
Uživatelský avatar

Registrován: 09.10.2013, 19:04
Příspěvky: 1403
Has thanked: 130 times
Been thanked: 71 times
Porovnal som zhruba rovnaký počet tikov procesora Zdeňkovho emulátora a môjho a vyzerá to tak, že mi chýba spomaľovanie, o ktorom som písal vyššie. Čo je potrebné brzdiť a ako?

_________________
Sharp MZ-821
Milsa MZ-841


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Synchronizácia emulátora
PříspěvekNapsal: 17.12.2023, 21:14 
Offline
Pan Štábní
Uživatelský avatar

Registrován: 09.10.2013, 19:04
Příspěvky: 1403
Has thanked: 130 times
Been thanked: 71 times
Takže podarilo sa mi presne nasynchronizovať môj emulátor. V BASICu, keď sledujem čas, tak ide presne. Emulátor mi tiež píše 100 % rýchlosti Sharpa. Takže toto sa mi konečne podarilo. Vždy mi to totiž písalo 99 %, resp., po úpravách 103 % a už som bol pomaly zúfalý. Nakoniec sa podarilo, časuje to presne. Skúsil som teda porovnať reálneho Sharpa a môj emulátor v hre Flappy. Ale to je neskutočný rozdiel. Môj emulátor beží cca o 15-20 % rýchlejšie. Bez spomaľovania GDG to nepôjde. Michal mi aj povedal, že v kóde jeho emulátora to nájdem. Našiel som. Nemám ale odvahu to implementovať, keď neviem princíp. Ak si niekto nájdete čas a viete to zhruba slovne popísať, za akých okolností k spomaľovaniu dochádza, veľmi pekne prosím, skúste to nejako sformulovať. Pokiaľ nerozumiem dôvodom spomaľovania, príde mi to ako bezduché opisovanie kódu. Ale rád by som tomu aj rozumel ako to približne funguje. Je mi jasné, že pri tak obrovskom čipe ako je GDG je nemysliteľné popisovať všetko. Ale aspoň tie základné veci, nech tomu rozumiem. Prípadne, ak mám šancu si to nájsť v zdrojovom kóde GDG, skúsil by som aj to. Áno viem, že som písal, že to nechám tak, ale tam to spomaľovanie zjavne nejakú rolu hrá, lebo ten rýchlostný rozdiel je vidieť voľným okom.

_________________
Sharp MZ-821
Milsa MZ-841


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Synchronizácia emulátora
PříspěvekNapsal: 18.12.2023, 00:12 
Offline
Pan Generální

Registrován: 19.07.2013, 15:54
Příspěvky: 2723
Has thanked: 144 times
Been thanked: 422 times
Popisuji pristup GDG jako do pameti! To je pro blokaci nejdulezitejsi.

Milsa zakladni obvod na cekani (waitingovani) je ten, ze jak chces zapsat data do GDG tak to realne zapises do buferu a az kdyz tento je plny a opet udelas zapis, tak okamzite dochazi k blokaci. Pri cteni z GDG okamzite dochazi k blokaci cpu. Ale ono to neni nastesti tak hrozne jak pisi. Toto co pisi se deje uvnitr GDG a pouze z nastupnou hranou CPU signalu se to propise ven z GDG. Kdykoliv kdyz uvnitr GDG dojde k dokonceni toho co blokuje GDG, okamzite je to na vystupu zmeneno, takze dokonce GDG muze pozadat CPU o blokaci ale protoze jen v M2 CPU testuje zda se ma zastavit a v tu dobu uz je vse vyresene a GDG dalo signal WAIT do log1 (open drain), tak cpu se nezastavi.

Jak vidis hodne veci kdyz budes to chtit simulovat budes muset delat dosti rychle. Realne to bezi na 17MHz.

Jeste budes muset simulovat kdy se zobrazuji a nezobrazuji data. Pozor cele je to posunute o par pixel clocku. Proto se musis zajimat o signaly CPU/DISP co jsou uvnitr GDG. Pred radou let psat Venca Peroutka ze vidi ze blokace je nejak posunuta oproti zobrazovani. V te dobe se nevidelo dovnitr, on to videl na realnych signalech z realneho pocitace.

Pozor GDG bezi na 17MHz a porad dela dokolecka stejnou cinnost. CPU bezi na /5 frekvenci. Takze obcas je neco posunute jinak nez pred okamzikem. Az GDG dokonci cteni/zapis z/do GDG tak uvolni blokacni obvod.

Koukej na to takto. Vzdy je 8 pixel cloku pro DISPLAY (DISP) a pak nasleduje 8 pixel cloku pro CPU. Pouze kdyz je CPU cykl muze cpu komunikovat s GDG. Treba kdyz je rezim MZ700 a jsou zobrazovane znaky, tak vubec nedochazi k CPU cyklu a proto se to blokuje na tak dlouho, jinak receno az do konce zobrazeni znaku na radku.

Musis pocitat ze cpu udela za 5 pixel cloku jeden takt. 8 pixel cloku udela jeden bod na obrazovce. Kazdy ma svuj citac.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Synchronizácia emulátora
PříspěvekNapsal: 19.12.2023, 22:27 
Offline
Pan Štábní
Uživatelský avatar

Registrován: 09.10.2013, 19:04
Příspěvky: 1403
Has thanked: 130 times
Been thanked: 71 times
Ďakujem za popis, ešte si to párkrát prečítam, aby som tomu akotak porozumel a skúsim to hľadať aj v zdrojáku u Michala. Myslím, že mi to dá lepší pohľad na ten kód. Michal to meral osciloskopom, takže by to mohlo byť blízke realite.

_________________
Sharp MZ-821
Milsa MZ-841


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Synchronizácia emulátora
PříspěvekNapsal: 19.12.2023, 22:31 
Offline
Pan Štábní
Uživatelský avatar

Registrován: 09.10.2013, 19:04
Příspěvky: 1403
Has thanked: 130 times
Been thanked: 71 times
A ešte otázka, nemala tá posledná veta znieť takto?
Musis pocitat ze cpu udela za 5 pixel cloku jeden takt. 8 pixel cloku udela jeden ZNAK na obrazovce. Kazdy ma svuj citac.

Lebo pokiaľ viem, jeden takt 17 MHz kryštálu je jeden bod. Spolu je to cca 50 Hz snímkovanie obrazovky.

_________________
Sharp MZ-821
Milsa MZ-841


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Synchronizácia emulátora
PříspěvekNapsal: 19.12.2023, 22:49 
Offline
Pan Generální

Registrován: 19.07.2013, 15:54
Příspěvky: 2723
Has thanked: 144 times
Been thanked: 422 times
Ano udela to jeden znak v rezimu 640x200.

Pro rezim mz800 je dulezite to pravidlo 8 taktu DISP/ 8 taktu CPU. A paralelne jede cpu /5. A tak je otazka kdy bude prave M2 a cpu se pozastavi. Kdykoliv jindy si toho CPU ani nevsimne.


Nahoru
 Profil  
 
Zobrazit příspěvky za předchozí:  Seřadit podle  
Odeslat nové téma Odpovědět na téma  [ Příspěvků: 14 ] 

Všechny časy jsou v UTC + 1 hodina [ Letní čas ]


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 1 návštěvník


Nemůžete zakládat nová témata v tomto fóru
Nemůžete odpovídat 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 přikládat soubory v tomto fóru

Hledat:
Přejít na:  
Založeno na phpBB® Forum Software © phpBB Group
Český překlad – phpBB.cz