2015-01-13 1 views
1

Я реализую эмулятор для старой игровой консоли, в основном для учебных целей.Эмуляция памяти-сопоставления игровой консоли, доступ к различным местоположениям по указанному адресу

Эта консоль отображает ромы и многое другое в регионах в своем адресном пространстве. Определенные местоположения также отражаются так, что несколько адресов могут соответствовать одному и тому же физическому местоположению. Я хотел бы подражать этому, но я не уверен, что было бы хорошим подходом к этому (а также не знаю, как этот процесс называется, отсюда и этот несколько общий вопрос).

Одна вещь, которая работает, является простой, неупорядоченной картой. Имеют ли они абсолютные адреса и соответствующие указатели на мои структуры данных. Таким образом, я могу легко отобразить все, что мне нужно, в адресное пространство системы. Проблема с этим подходом заключается в том, что это, очевидно, бодрость памяти. Даже с небольшими ромами, я получаю около десяти миллионов записей, благодаря вышеупомянутому зеркалированию. Наверняка, это не может быть сложной задачей?

Любая помощь очень ценится.

Edit:

Чтобы предоставить некоторые подробности относительно того, как именно я это делаю:

Система в вопросе, конечно, SNES. Использование this wiki в качестве основного ресурса, я implemeted, что я упоминал выше, следующим образом:

  • Создать std::unordered_map<uint32,uint8_t*> mMemoryMap;
  • Проверьте ли ПЗУ LoRom или HiRom
  • Для каждого байта в ПЗУ
    • Calculate адрес, где он должен быть сопоставлен, и поместить как адрес, так и указатель на указанный байт на карте.
    • Если раздел необходимо отразить где-то в другом месте, повторите приведенное выше
  • Это будет применяться ко всему еще мне нужно сделать, таким, как видео- или систему-память

Если теперь я хочу, чтобы получить доступ что-нибудь в пределах адресного пространства, я могу просто использовать адрес система будет использовать внутренне.

+0

Я думаю, вы должны добавить код для этого –

ответ

0

Я предполагаю, что для смежных адресов физические местоположения также смежны, в определенных блоках памяти или «кусках». То есть, если адрес 0x0000 соответствует 0xFF00, то 0x0004 отображается в 0xFF04.

enter image description here

Если они работают так, то вы можете создать список, содержащий информацию о тех кусках.Скажи:

struct Chunk 
{ 
    int addressStart, memoryStart, size; 
} 

Куски могут быть заказаны addressStart, так что вы можете узнать правильный кусок вам потребуется для любого адреса. Это требует, чтобы вы перебирали список, но если у вас есть только несколько кусков, это может быть приемлемым.

+0

Такое очевидное решение, и все же я его совсем не видел. Очень доволен результатами. Большое спасибо! – ZeroSum

1

Вместо использования простых карт (которые даже с диапазонами могут увеличиваться до больших размеров) вместо этого вы можете использовать более интеллектуальную карту.

Например, если консоль отображает 0x10XXXX через 0x1FXXXX все к тому же 0x20XXXX вы можете создать структуру, которая считает, что повторение (начало 0x100000 конца 0x1FFFFF повтора 0x010000 хотя вы можете использовать битовую маску, а не повторять).

Смежные вопросы