2015-05-20 24 views
6
Ben 6502 cpu temsil eden bir tek sınıf bir nes emülatörü yazma ve yazdığı am

: TemeldeRefactoring büyük C++ sınıfı

class CCpu6502 { 
    public: 
     /*....*/ 
     void fetch8(); 
     void fetch16(); 

     void ADC(); 
     void AND(); 
     /* Around 50+ cpu instruction types */ 
    private: 
     /*register state, jump table definition*/ 
}; 

, ben uygun üye işlevini işlem kodu alır ve yürütür bir atlama masası var - değişen cpu'nun dahili durumu. Doğru adresleme türünü belirleyen diğer bazı görevler vardır.

Sınıf tanımının, test edilmenin yanı sıra ayrıştırmanın çok büyük ve zor olduğunu fark ettim. Bununla birlikte, sınıfı ayrı sınıflara ayırmak problemlidir çünkü hemen hemen her işlev cpu'nun dahili durumunu değiştirecektir. Sonra görünüyor her sınıf bir arkadaş, yaparak cpu iç durumuna her talimat işleyici sınıf erişimi vermek zorunda kalacak,

class AInstructionHandler {/*...*/}; 
class CArithmeticInstHandler : public AInstructionHandler{/*...*/}; 
class CBranchInstHandler : public AInstructionHandler{/*...*/}; 
/*memory accessors, logical, etc. */ 

Ancak:

ben gibi talimat türleri sınıflandırmak düşündü Kötü bir fikir gibi.

Neredeyse tüm yöntemlerin nesnenin durumunu etkilediği veya tasarımımın başlangıçta kusurlu olduğu büyük bir sınıfı yeniden düzenlemenin tercih edilen bir yolu olup olmadığını merak ediyorum.

Teşekkür

+2

CPU durumunu uygun alıcılar/ayarlayıcılar aracılığıyla ortaya koyarım ve komutları CPU'nun genel arabirimini kullanan üye olmayan, arkadaşlık dışı işlevlere sahip olurum. – Nim

+2

Belki [Strateji Kalıbı] (http: // en.wikipedia.org/wiki/Strategy_pattern) burada yararlı olabilir. Her op kodu bir strateji olabilir. – Steve

cevap

3

Eh, koparmaya zaman belki kendi sınıfa yerleştirmek için küçük bit bulabilirsiniz geniş mantıksal parçalar bulunmuyorsa. Kendi sınıfının bir adayı olan JumpTable'dan bahsettiniz. Belki bir hesap kodu alabilir ve bir adres alabilir mi? Sonra

, kendileri opcodes muhtemelen dahili durumunun ilgili bitlerini paketlemek için isteyeyim, bunu yapmak için, Yani 6502. durumunun bazı değişikliklerin yapılmasını yapmak nesneleri haline gelebilir ki, orada İŞLEMCİ.

Daha küçük parçaları çıkarmaya başladığınızda, diğer yeniden düzenleme işlemlerinin gerçekleştirilebileceği belli olabilir.

Ayrıca, StackOverflow üzerinde yardımcı olabilecek relatedanswers vardır. Dobb's'dan some additional thoughts.