#pragma once #include #include #include #include #include #include #include #include "Disassembly.h" #include "Symbols.h" #include "ProfileLineEventArgs.h" #include "ProfileScopeEventArgs.h" class Profiler { public: std::array instructionCounts; std::array addressProfiles; std::array addressCounts; std::array addressScopes; std::map scopeCycles; System6502& processor; const Disassembly& disassembler; const Symbols& symbols; bool countInstructions; bool profileAddresses; uint64_t priorCycleCount = 0; Profiler(System6502& processor, Disassembly& disassembler, Symbols& symbols, bool countInstructions, bool profileAddresses); Signal StartingOutput; Signal FinishedOutput; Signal StartingLineOutput; Signal FinishedLineOutput; Signal EmitLine; Signal StartingScopeOutput; Signal FinishedScopeOutput; Signal EmitScope; void Generate(); private: void EmitProfileInformation(); void Processor_ExecutingInstruction_ProfileAddresses(const AddressEventArgs& addressEvent); void Processor_ExecutingInstruction_CountInstructions(const AddressEventArgs& addressEvent); void Processor_ExecutedInstruction_ProfileAddresses(const AddressEventArgs& addressEvent); void BuildAddressScopes(); };