OVH Cloud OVH Cloud

Gendarme couché ou moquette de Nancy ?

8 réponses
Avatar
pthfndr
Boujour à tous,



Je réalise un émulateur de Z80.
Mon problème est de ralentir la vitesse d'execution (d'ou le titre) car
sur mon
Duron 800, le Z80 fait du ...20 MHz, et le temps de traitement n'est pas
en relation avec le nombre de cycle de l'instruction réelle.
Entre chaque execution d'une instruction émulée, j'envisage une
synchronisation
avec un timer calé à la fréquence désirée.
Comment coder cela en C (Visual C, pas C++) sous W2000 ?
D'autres suggestions de solutions ?

Merci d'avance.

Pthfndr.

8 réponses

Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', pthfndr wrote:

Je réalise un émulateur de Z80.
Mon problème est de ralentir la vitesse d'execution (d'ou le titre) car
sur mon
Duron 800, le Z80 fait du ...20 MHz, et le temps de traitement n'est pas
en relation avec le nombre de cycle de l'instruction réelle.
Entre chaque execution d'une instruction émulée, j'envisage une
synchronisation
avec un timer calé à la fréquence désirée.
Comment coder cela en C (Visual C, pas C++) sous W2000 ?
D'autres suggestions de solutions ?


Il est quasiment impossible de simuler une horloge à 20 MHz sans artifice
matériel extérieur. A moins que le Timer Multi Média de Windows sache faire
ça: news:fr.comp.os.ms-windows.programmation

--
-ed- [remove YOURBRA before answering me]
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
<blank line>
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/

Avatar
pthfndr

In 'fr.comp.lang.c', pthfndr wrote:

Je réalise un émulateur de Z80.
Mon problème est de ralentir la vitesse d'execution (d'ou le titre) car
sur mon
Duron 800, le Z80 fait du ...20 MHz, et le temps de traitement n'est pas
en relation avec le nombre de cycle de l'instruction réelle.
Entre chaque execution d'une instruction émulée, j'envisage une
synchronisation
avec un timer calé à la fréquence désirée.
Comment coder cela en C (Visual C, pas C++) sous W2000 ?
D'autres suggestions de solutions ?


Il est quasiment impossible de simuler une horloge à 20 MHz sans artifice
matériel extérieur. A moins que le Timer Multi Média de Windows sache faire
ça: news:fr.comp.os.ms-windows.programmation

--
-ed- [remove YOURBRA before answering me]
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
<blank line>
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/




Je me suis mal exprimé :

Je veux émuler un Z80 à 5 MHz.
Chaque cycle d'horloge vaut donc 1/5*10**6 seconde soit 0.2
microseconde.
Si je fais "émuler" mon émulateur sans controle , la vitesse équivaut à
un processeur
tournant à 20 MHZ ( je cherche l'exactitude en temps, à disons 10 %
près).
La question est donc de stopper l'émulateur (par un wait ?) le temps
d'un cycle d'horloge
(0.2 us) mais en y retranchant la durée qu'a déjà consommé l'émulation
de l'instruction.
Peut-on générer sous windows des durées si courtes (2/10 de us) ?
Je vois cela comme ça :


temps_fin_instruction_en_us = temps_actuel_en_us + temps_de_cycle_en_us
for(;;)
{
while (temps_actuel_en_us < temps_fin_instruction_en_us)
{
;
}
temps_fin_instruction_en_us += temps_de_cycle_en_us ;
traitement du l'instruction simulée
...
}

Mais on doit pouvoir, au lieu du while{;} faire un wait() ou suspend()
et redémarrer le process par un timer, non ?

Merci pour vos conseils et expertises en matière d'émulations et de
temps réel.


Pthfndr.


Avatar
Laurent Wacrenier
pthfndr écrit:
Je me suis mal exprimé :


Tu as aussi posté dans le mauvais groupe.

Je veux émuler un Z80 à 5 MHz.


En C standard, tu dois pouvoir émuler des trucs en 1 Hz, et encore...

Avatar
Ivan Vecerina
"pthfndr" wrote in message
news:
| Je réalise un émulateur de Z80.
| Mon problème est de ralentir la vitesse d'execution (d'ou le titre) car
| sur mon
| Duron 800, le Z80 fait du ...20 MHz, et le temps de traitement n'est pas
| en relation avec le nombre de cycle de l'instruction réelle.
| Entre chaque execution d'une instruction émulée, j'envisage une
| synchronisation
| avec un timer calé à la fréquence désirée.
| Comment coder cela en C (Visual C, pas C++) sous W2000 ?
| D'autres suggestions de solutions ?

Le C standard ne fournit pas un support tres valable pour une
synchronisation precise -- Windows lui-même non plus, d'ailleurs.
(il faut pas se faire trop d'illusion, avec le scheduleur de
windows, il est deja bien difficile d'exécuter une tache
ponctuellement toutes les 1 ou 2 ms).

Il n'est pas pratique de synchroniser chaque instruction. Cependant,
tu pourrais faire tourner ton emulateur par lots de pex. 100'000 cycles,
puis faire une pose de synchronisation (pour attendre la fin d'une
période de 20ms).
Ceci pourrait etre suffisant (sauf lors du controle direct d'un
convertisseur DA en sortie -- genre son ou ecran -- mais une emulation
specifique de ce HW pourrait prendre cela en compte).

En C standard, voir le header <ctime.h>
Sous Win32, voir timeGetTime et QueryPerformanceTimer.
Peut-etre meme utiliser qqch comme des evenements WM_TIMER...


Bonne route...
Ivan
--
http://www.post1.com/~ivec <> Ivan Vecerina
Avatar
pthfndr

pthfndr écrit:
Je me suis mal exprimé :


Tu as aussi posté dans le mauvais groupe.

Je veux émuler un Z80 à 5 MHz.


En C standard, tu dois pouvoir émuler des trucs en 1 Hz, et encore...


Bonsoir,

Pourquoi en "C standard" on ne peut émuler qu'à 1 Hz, et encore ?

Quel rapport entre un langage de programmation et une limitation
temporelle ou

intrinsèque ?

Merci de m'éclairer.


Cordialement.


Avatar
pthfndr

"pthfndr" wrote in message
news:
| Je réalise un émulateur de Z80.
| Mon problème est de ralentir la vitesse d'execution (d'ou le titre) car
| sur mon
| Duron 800, le Z80 fait du ...20 MHz, et le temps de traitement n'est pas
| en relation avec le nombre de cycle de l'instruction réelle.
| Entre chaque execution d'une instruction émulée, j'envisage une
| synchronisation
| avec un timer calé à la fréquence désirée.
| Comment coder cela en C (Visual C, pas C++) sous W2000 ?
| D'autres suggestions de solutions ?

Le C standard ne fournit pas un support tres valable pour une
synchronisation precise -- Windows lui-même non plus, d'ailleurs.
(il faut pas se faire trop d'illusion, avec le scheduleur de
windows, il est deja bien difficile d'exécuter une tache
ponctuellement toutes les 1 ou 2 ms).

Il n'est pas pratique de synchroniser chaque instruction. Cependant,
tu pourrais faire tourner ton emulateur par lots de pex. 100'000 cycles,
puis faire une pose de synchronisation (pour attendre la fin d'une
période de 20ms).
Ceci pourrait etre suffisant (sauf lors du controle direct d'un
convertisseur DA en sortie -- genre son ou ecran -- mais une emulation
specifique de ce HW pourrait prendre cela en compte).

En C standard, voir le header <ctime.h>
Sous Win32, voir timeGetTime et QueryPerformanceTimer.
Peut-etre meme utiliser qqch comme des evenements WM_TIMER...

Bonne route...
Ivan
--
http://www.post1.com/~ivec <> Ivan Vecerina



Merci pour la piste du QueryPerformanceTimer. qui semble être confirmée
par ailleurs.

Bon vent...
Pthfndr.

Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', pthfndr wrote:

Pourquoi en "C standard" on ne peut émuler qu'à 1 Hz, et encore ?


Le langage C dispose d'une bibliothèque standard qui permet de gerer le temps
(en lecture seule) à la seconde près.

Quel rapport entre un langage de programmation et une limitation
temporelle ou

intrinsèque ?

Merci de m'éclairer.


Il ne dispose ni de mécanisme d'interruption, ni de programmation de timer,
ni de lecture du temps en-dessous d'une seconde. Pour tout ça, il faut des
extensions non standard à discuter sur les forums adéquates.

Voilà pourquoi "Quel rapport entre un langage de programmation et une
limitation temporelle ou intrinsèque ?"

--
-ed- [remove YOURBRA before answering me]
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
<blank line>
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/

Avatar
Jean-Marc
"pthfndr" a écrit:

Je réalise un émulateur de Z80.
Mon problème est de ralentir la vitesse d'execution
(d'ou le titre) car sur mon Duron 800, le Z80 fait
du ...20 MHz, et le temps de traitement n'est pas
en relation avec le nombre de cycle de l'instruction réelle.
Entre chaque execution d'une instruction émulée, j'envisage une
synchronisation avec un timer calé à la fréquence désirée.
Comment coder cela en C (Visual C, pas C++) sous W2000 ?
D'autres suggestions de solutions ?


Voilà un lien vers les sources (744Ko) d'un émulateur
d'Atari ST du nom de WinSTone. Comme chacun sait, il émule
le MC68000 à 8Mhz ainsi que pas mal de chispets périphériques
(MFP, YM8149 ?, 6502, etc...). L'émulateur fonctionne sous
windows. Tu trouveras peut-être une piste dans les sources.

Bon courage...

Page de description:
http://atari.lautre.net/atari/emul/winston.htm#1

Source (744Ko):
http://atari.lautre.net/download/winstsrc.zip