ich nes Emulator schreibe und schrieb eine einzige Klasse, die die 6502 CPU:Refactoring große C++ Klasse
class CCpu6502 {
public:
/*....*/
void fetch8();
void fetch16();
void ADC();
void AND();
/* Around 50+ cpu instruction types */
private:
/*register state, jump table definition*/
};
Grundsätzlich habe ich eine Sprungtabelle, die in Opcode nimmt und führt die entsprechende Elementfunktion - die sich wandelnde CPU-interner Zustand. Es gibt einige andere Aufgaben, die den richtigen Adressierungstyp bestimmen.
Ich habe festgestellt, dass die Klassendefinition viel zu groß und schwer zu parsen sowie zu testen ist. Das Aufteilen der Klasse in separate Klassen scheint jedoch problematisch zu sein, da fast jede Funktion den internen Zustand der CPU ändert.
Ich dachte über die Befehlstypen als solche Klassifizierung:
class AInstructionHandler {/*...*/};
class CArithmeticInstHandler : public AInstructionHandler{/*...*/};
class CBranchInstHandler : public AInstructionHandler{/*...*/};
/*memory accessors, logical, etc. */
Allerdings würde ich dann, indem sie jede Klasse ein Freund jeden Befehl Handler-Klasse Zugriff auf den internen Zustand der CPU geben müssen, was scheint wie eine schlechte Idee.
Ich frage mich, ob es eine bevorzugte Möglichkeit gibt, eine große Klasse umzuformen, wo fast alle Methoden den Zustand des Objekts beeinflussen oder ob mein Design fehlerhaft ist.
Dank
Ich würde den CPU-Status über entsprechende Getter/Setter offen legen, und habe die Anweisungen als Nichtmitglied, Nicht-Freund-Funktionen, die die öffentliche Schnittstelle der CPU verwenden .. – Nim
Vielleicht das [Strategie-Muster] (http: // en.wikipedia.org/wiki/Strategy_pattern) könnte hier nützlich sein. Jeder Op-Code könnte eine Strategie sein. – Steve