I spent about fifteen minutes writing out a justification of why you only needed 9 bits/cycle and could therefore just store events in a big buffer and analyse them later. (I used something like the buffer approach when working on model-b, and it worked out quite well, though I didn't do anything very clever with it - so this approach sprang immediately to mind.) But then I noticed one of the figures in my calculations, and remembered: everything these days is really fast. And that includes disks.
With this in mind, there might be no need for a table, and there might be no need for anything clever in the emulator. Just record what the CPU is doing each cycle, and save 26 bits: store access reason (read/write/instruction fetch - 2 bits), store the address accessed (16 bits), and store byte read or written (8 bits). This would produce 52,000,000 bits/sec, or ~6MBytes/sec. You could save to disk at that rate. Even my old laptop (5400rpm laptop hard drive...) could write to disk a lot faster than 6MBytes/sec.
(Which means there's plenty of scope for saving more data here. For example, you might want more bits to indicate memory access reason, so it's easy to distinguish opcode fetch from operand fetch. Maybe even dump register contents every cycle - or at least every time there's a new instruction fetched - as this would simplify analysing the data.)
Since this would just be saving the raw data, you'd need to write some kind of post-processor afterwards. But you could do that in Python/C#/etc., rather than having to write it all in C++ inside the emulator.
Things you could do with this data, that would be potentially useful when working on a disassembly:
* locate all instructions that read or wrote a particular address
* locate all instructions whose operands were written to after being executed, and which instruction overwrote them
* for any indexed/indirect instruction, find all effective addresses
If you dumped register contents you could also enumerate all register values for a particular instruction, which could be useful sometimes.