Я реализую эмулятор для старой игровой консоли, в основном в учебных целях.
Эта консоль сопоставляет ромы и многое другое с регионами в своем адресном пространстве. Некоторые местоположения также зеркалируются, поэтому несколько адресов могут соответствовать одному и тому же физическому местоположению. Я хотел бы подражать этому, но я не уверен, что было бы хорошим подходом для этого (а также понятия не имею, как называется этот процесс, отсюда этот несколько общий вопрос).
Одна вещь, которая действительно работает, - это простая неупорядоченная карта. Он должен содержать абсолютные адреса и соответствующие указатели на мои структуры данных. Таким образом, я могу легко отобразить все, что мне нужно, в адресное пространство системы. Проблема с этим подходом в том, что он явно потребляет много памяти. Даже с маленькими ромами я получаю почти десять миллионов записей благодаря вышеупомянутому зеркалированию. Конечно, это не самое правильное решение?
Любая помощь очень ценится.
Редактировать:
Чтобы предоставить некоторые подробности о том, как именно я это делаю:
Речь идет, конечно же, о SNES. Используя эту вики в качестве основного ресурса, я реализовал то, что упомянул выше, следующим образом:
- Создайте
std::unordered_map<uint32,uint8_t*> mMemoryMap;
- Проверьте, является ли ROM LoRom или HiRom
- For each byte in the rom
- Calculate the address where it should be mapped and emplace both the address and a pointer to said byte in the map
- Если раздел необходимо отразить где-то еще, повторите вышеизложенное.
- Это будет применяться ко всему, что мне нужно сделать доступным, например, к видео- или системной памяти.
Если теперь я хочу получить доступ к чему-либо в адресном пространстве, я могу просто использовать адрес, который система будет использовать для внутренних целей.