PROCESSEUR d'Émulation et de verrouillage à une vitesse d'horloge
Si vous aviez lu mes autres question, vous savez que j'ai passé ce week-end, en mettant ensemble un PROCESSEUR 6502 émulateur comme un exercice de programmation.
Le CPU émulateur est presque terminé, et semble être assez précis de mes essais limités, mais il est en cours d'exécution incroyablement rapide, et j'ai envie d'étrangler jusqu'à la réelle vitesse d'horloge de la machine.
Mon test du courant de boucle est: est-ce
//Just loop infinitely.
while (1 == 1)
{
CPU.ClockCyclesBeforeNext--;
if (CPU.ClockCyclesBeforeNext <= 0)
{
//Find out how many clock cycles this instruction will take
CPU.ClockCyclesBeforeNext = CPU.OpcodeMapper.Map[CPU.Memory[CPU.PC]].CpuCycles;
//Run the instruction
CPU.ExecuteInstruction(CPU.Memory[CPU.PC]);
//Debugging Info
CPU.DumpDebug();
Console.WriteLine(CPU.OpcodeMapper.Map[CPU.Memory[CPU.PC]].ArgumentLength);
//Move to next instruction
CPU.PC += 1 + CPU.OpcodeMapper.Map[CPU.Memory[CPU.PC]].ArgumentLength;
}
}
Comme vous pouvez le dire, chaque opcode prend une quantité spécifique de temps, donc je n'ai pas exécuter l'instruction suivante jusqu'à ce que je compte en bas de Cycle du PROCESSEUR de l'horloge. Cela fournit un bon timing entre les opcodes, c'est juste que le tout fonctionne de manière rapide.
Ciblée, à la vitesse du PROCESSEUR est à 1,79 mhz, cependant j'aimerais quelle que soit la solution de l'horloge, question de garder la vitesse à 1.79 mhz, même comme je l'ai ajouter à la complexité, donc je n'ai pas à le régler jusqu'.
Des idées?
Vous devez vous connecter pour publier un commentaire.
J'ai écrit un Z80 émulateur il y a plusieurs années, et pour faire le cycle d'exécution exacte, j'ai divisé la fréquence d'horloge dans un certain nombre de blocs de petite taille et avait le cœur exécuter que de nombreux cycles d'horloge. Dans mon cas, je l'ai attachée à la cadence du système de jeu, j'ai été à l'émulation. Chaque opcode savait combien de cycles qu'il a fallu pour exécuter et le noyau serait de continuer à courir opcodes jusqu'à ce que le nombre spécifié de cycles ont été exécutés. J'ai eu un extérieur exécuter en boucle pour exécuter le cœur de processeur, et exécuter d'autres parties du système émulé et puis dormir jusqu'à l'heure de début de l'itération suivante.
EDIT: Ajout de l'exemple de l'exécution de la boucle.
Espère que cette aide.
Prendre un coup d'oeil à l'original de la documentation de quicktime pour l'inspiration.
Il a été écrit il y a longtemps, lors de l'affichage de la vidéo signifiait la permutation des images fixes à une assez haute vitesse, mais la Pomme gars ont décidé qu'ils avaient besoin d'un temps plein-cadre de gestion. De la conception à la cherche d'abord overengineered, mais il les laisser s'en occuper largement différentes exigences en matière de vitesse et de garder étroitement synchronisés.
vous avez de la chance que 6502 a un comportement déterministe, l'heure exacte à chaque instruction prend est bien documenté; mais elle n'est pas constante. certaines instructions de prendre 2 cycles de 3 autres. Tout comme les images dans QuickTime, une vidéo n'est pas un "images par seconde" paramètre, chaque image raconte combien de temps il veut être dans l'écran.
Depuis modernes de la CPU sont de manière non-déterministe, et les OS multitâche peut même geler pendant quelques millisecondes (mémoire virtuelle!), vous devriez garder un onglet si vous êtes en retard, ou si vous pouvez prendre quelques microsecondes sieste.
Que jfk dit, la façon la plus courante de le faire est cravate la vitesse du processeur pour le rafraîchissement vertical de l' (émulé) sortie vidéo.
Choisissez un nombre de cycles pour exécuter chaque image de la vidéo. Ce sera souvent spécifiques à la machine, mais vous pouvez le calculer par quelque chose comme :
Puis, vous obtenez également de faire un sleep jusqu'à ce que la mise à jour vidéo est frappé, à ce stade, vous commencez le prochain n cycles de CPU émulation.
Si vous imiter quelque chose en particulier, alors vous avez juste besoin de regarder les fps taux et la vitesse du processeur pour obtenir ce droit environ.
EDIT: Si vous n'avez pas de temps externe exigences, alors c'est normal qu'un émulateur juste courir aussi vite qu'il le peut. Parfois, c'est un effet voulu et parfois pas 🙂
Je voudrais utiliser les cycles d'horloge pour calculer le temps et dormir la différence dans le temps. Bien sûr, pour ce faire, vous avez besoin d'une haute résolution de l'horloge. Ils façon dont vous le faites est d'aller à pic du CPU dans la filature de boucles.
Oui, comme dit précédemment, la plupart du temps vous n'avez pas besoin d'un CPU émulateur pour émuler les instructions à la même vitesse de la vraie chose. Quel utilisateur de percevoir, c'est la sortie de calcul (c'est à dire de l'audio et de la vidéo sorties) donc vous avez seulement besoin pour être en phase avec ces sorties qui ne signifie pas que vous devez nécessairement une UC la vitesse de l'émulation.
En d'autres termes, si le frame rate de la vidéo d'entrée est, disons, 50 hz, puis de laisser le CPU émulateur de courir aussi vite qu'il peut pour attirer l'écran, mais assurez-vous de la sortie de la cadres de l'écran à la bonne vitesse (50Hz). À partir d'un point de vue externe de votre émulateur émule à la bonne vitesse.
En essayant d'être le cycle exact même le temps d'exécution est un non-sens sur un multi-tâches OS comme Windows ou Linux, car l'émulateur du temps d'instruction (typiquement moins de 1 vintage des années 80 Processeurs) et de la planification de la plage horaire de l'OS modernes sont comparables.
Essayer à la sortie de quelque chose à 50Hz taux est beaucoup plus facile que vous pouvez faire de très bonne qualité sur les machines modernes
Une autre option est disponible si l'audio émulation est mis en œuvre, et si la sortie audio est liée au système/horloge CPU. En particulier, je sais que c'est le cas avec les 8 bits d'Apple ][ ordinateurs.
Généralement le son est généré dans les tampons de taille fixe (qui est fixe), afin que le fonctionnement (production de données, etc) de ces tampons peuvent être liées à des CPU débit via des primitives de synchronisation.
Je suis en train de faire quelque chose d'un peu plus généraux de cas d'utilisation, tels que la capacité de convertir le temps, à une estimation de la quantité d'instructions et vice versa.
La page d'accueil du projet est @ http://net7mma.codeplex.com
Le code commence comme ceci: (je pense)
Une fois que vous avez un certain type de profane de l'horloge de mise en œuvre vous avance à quelque chose comme une
Timer
Alors vous pouvez vraiment l'reproduire une logique d'utiliser quelque chose comme
Enfin, créer quelque chose de semi utile par exemple, un Bus, puis peut-être un écran virtuel pour émettre des données vers le bus...
Voici comment j'ai testé la
StopWatch