Как мне структурировать карту памяти в эмуляторе N64? - PullRequest
6 голосов
/ 02 декабря 2009

Согласно Википедии, N64 имеет только 4 МБ RDRAM (8 МБ с пакетом расширения), а другие объемы аналогично малы (около 4 КБ или около того кэш-памяти L1). Тем не менее, технические документы, которые я нашел в Google, указывают, что его адреса памяти варьируются от $ 0000: 0000 до $ FFFF: FFFF - это 4 ГБ! Поскольку существующие эмуляторы N64, такие как Project64, не используют 4 ГБ ОЗУ, как работает эмуляция карты памяти? Я пробовал просматривать различные документы и тому подобное, и все они, кажется, немного отличаются. У кого-нибудь есть советы по этому вопросу?

В частности, вот карта памяти, которую я нашел:

0x0000 0000 to 0x03EF FFFF RDRAM Memory
0x03F0 0000 to 0x03FF FFFF RDRAM Registers
0x0400 0000 to 0x040F FFFF SP Registers
0x0410 0000 to 0x041F FFFF DP Command Registers
0x0420 0000 to 0x042F FFFF DP Span Registers
0x0430 0000 to 0x043F FFFF MIPS Interface (MI) Registers
0x0440 0000 to 0x044F FFFF Video Interface (VI) Registers
0x0450 0000 to 0x045F FFFF Audio Interface (AI) Registers
0x0460 0000 to 0x046F FFFF Peripheral Interface (PI) Registers
0x0470 0000 to 0x047F FFFF RDRAM Interface (RI) Registers
0x0480 0000 to 0x048F FFFF Serial Interface (SI) Registers
0x0490 0000 to 0x04FF FFFF Unused
0x0500 0000 to 0x05FF FFFF Cartridge Domain 2 Address 1
0x0600 0000 to 0x07FF FFFF Cartridge Domain 1 Address 1
0x0800 0000 to 0x0FFF FFFF Cartridge Domain 2 Address 2
0x1000 0000 to 0x1FBF FFFF Cartridge Domain 1 Address 2
0x1FC0 0000 to 0x1FC0 07BF PIF Boot ROM
0x1FC0 07C0 to 0x1FC0 07FF PIF RAM
0x1FC0 0800 to 0x1FCF FFFF Reserved
0x1FD0 0000 to 0x7FFF FFFF Cartridge Domain 1 Address 3
0x8000 0000 to 0xFFFF FFFF External SysAD Device

Ответы [ 3 ]

2 голосов
/ 11 августа 2011

Карта у вас абстрактная, если вы посмотрите на более подробную карту памяти , вы заметите большие пробелы в не отображенной памяти. Не включая подключенный внешний картридж ПЗУ (и т. Д.), Добавьте каждую часть используемой памяти. В итоге вы выделите чуть более 4 МБ, включая RDRAM. Также обратите внимание, что адреса более 0x80000000 фактически являются зеркалами более низких адресов, с той разницей, что некоторые из них отображаются напрямую (физическая память), а некоторые - TLB (виртуальная память).

0x00000000 - 0x7fffffff  KUSEG  TLB mapping
0x80000000 - 0x9fffffff  KSEG0  Direct map, cache
0xa0000000 - 0xbfffffff  KSEG1  Direct map, non-cache
0xc0000000 - 0xdfffffff  KSSEG  TLB mapping
0xe0000000 - 0xffffffff  KSEG3  TLB mapping

Также обратите внимание, что память картриджа отображается в 0xb0000000. Это явно не показано на карте памяти.

1 голос
/ 03 декабря 2009

Независимо от того, сколько памяти вы эмулируете, вам не нужно столько памяти, доступной на хост-машине (вам не нужно 4 ГБ, и вам даже не нужно 4 МБ) ). Вместо этого используйте структуру данных, где вы можете получить доступ к вашей эмулируемой памяти по значению адреса. Выделяйте пространство в вашей реальной памяти только тогда, когда вам нужно что-то сохранить в эмулируемой памяти.

Однако может быть тривиально выделить объем внутренней памяти, описанный выше.

Как и Саймон, я бы сначала предположил теорию «сегмент: смещение», но адрес в диапазоне , который вы перечислили выше, кажется, полностью противоречит этой теории. Кроме того, вся "64" -битная вещь адресного пространства.

Обратите внимание, что большая часть адресного пространства выделена внешним интерфейсам (картриджам и т. Д.), А не внутренним аппаратным ресурсам.

0 голосов
/ 14 февраля 2017

AFAIK Процессор системы может иметь до 4 ГБ без каких-либо проблем, но сам n64 не использовал эту возможность. Поэтому я думаю, что если процессор запросит данные из этого региона, он просто вернет 00.

...