2015-01-13 7 views
1

주로 게임용 에뮬레이터를 학습용으로 구현하고 있습니다.게임 콘솔의 메모리 매핑을 에뮬레이트하고 제공된 주소를 기반으로 다른 위치에 액세스합니다.

이 콘솔은 rom과 그 밖의 많은 것들을 주소 공간 내의 영역에 매핑합니다. 특정 위치는 미러링되어 여러 주소가 동일한 실제 위치에 대응할 수 있습니다. 나는 이것을 모방하고 싶다.하지만 그렇게하기위한 좋은 접근 방법이 무엇인지 모르겠다. (그리고이 과정이 무엇 인지도 모르기 때문에 다소 일반적인 질문이다.)

작동하는 한 가지는 단순한 정렬되지 않은지도입니다. 절대 주소와 내 데이터 구조에 해당하는 포인터가 포함되어 있어야합니다. 이렇게하면 필요한 모든 것을 시스템의 주소 공간에 쉽게 매핑 할 수 있습니다. 이 접근 방식의 문제점은 분명히 메모리 호그입니다. 작은 ROM을 사용해도, 앞서 언급 한 미러링 덕분에 1 천만 항목에 달할 수 있습니다. 확실하게, 이것이 할 수있는 가장 어려운 일이 아니겠습니까?

도움을 주시면 감사하겠습니다.

편집 :

내가이 일을 얼마나 정확히에 관한 몇 가지 세부 사항을 제공하기 위해 :

시스템 문제이다, 물론, SNES.

  • 는 롬
    • 계산에서 각 바이트를 들어 std::unordered_map<uint32,uint8_t*> mMemoryMap;
    • 롬이 LoRom인지 여부를 확인하거나 HiRom
    • 만들기 : 내 기본 자원으로 this wiki를 사용하여, 나는 다음과 같이 내가 위에서 언급 한 것을 implemeted 맵핑되어야하는 주소와 맵의 해당 바이트에 대한 포인터와 주소를 모두 지정하십시오.
    • 섹션을 다른 곳에서 미러해야하는 경우 위의 내용을 반복하십시오.
  • 이 나는 ​​단순히 주소를 사용할 수 있습니다, 내가 지금 주소 공간 내에서 아무것도 액세스하려면, 비디오 카메라 또는 시스템 메모리

로 사용할 수 같은 만들 필요가 무엇에 적용됩니다 시스템은 내부적으로 사용할 것입니다.

+0

나는이 코드를 추가해야한다고 생각한다. –

답변

0

필자는 인접한 주소의 물리적 위치가 메모리 또는 "청크"의 특정 블록 내에서 연속적이라고 가정합니다. 즉, 주소 0x0000이 0xFF00으로 매핑되면 0x0004는 0xFF04로 매핑됩니다. 그들이 그런 식으로 작업하는 경우

enter image description here

, 당신은 그 덩어리의 정보를 포함하는 목록을 만들 수 있습니다.말 :

struct Chunk 
{ 
    int addressStart, memoryStart, size; 
} 

청크는 addressStart으로 주문할 수 있습니다, 그래서 당신은 당신이 어떤 주소를 필요 올바른 덩어리를 확인할 수 있습니다. 이렇게하면 목록을 반복해야하지만 청크가 적다면 허용 될 수 있습니다.

+0

그런 명백한 해결책이지만 아직 전혀 보지 못했다. 결과에 매우 만족합니다. 고마워요! – ZeroSum

1

단순한지도 (범위가 커질 수도 있지만 크기가 커질지라도)를 사용하는 대신 더 지능적인지도를 사용할 수 있습니다. 예를 들어

콘솔이 그 반복을 보유 구조를 설계 할 수 같은 0x20XXXX0x1FXXXX 모든 통해 0x10XXXX을 매핑하고있는 경우에 (당신은 반복이 아닌 비트 마스크를 사용할 수 있지만 0x1000000x1FFFFF 반복 0x010000를 시작합니다).