-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmemmap.cpp
67 lines (52 loc) · 1.53 KB
/
memmap.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
/*
* memmap.cpp
* smcdis
*
* Created by Alexander Strange on 12/23/07.
*
*/
#include "memmap.h"
#include <stdio.h>
#include <assert.h>
static uint32_t makeaddr(uint8_t bank, uint16_t addr) {return (bank << 16) | addr;}
void snes_mapper::map_rom(uint8_t bank_begin, uint8_t bank_end, uint16_t addr_begin, uint16_t addr_end, size_t offset, size_t rom_size)
{
size_t r = 0;
fprintf(stderr, "-Mapping %#lx bytes\n", rom_size);
for (int b = bank_begin; b <= bank_end; b++) {
map_item m = (map_item){makeaddr(b, addr_begin), makeaddr(b, addr_end), offset + r};
r += m.end - m.begin;
if (r >= rom_size) break;
map.push_back(m);
}
}
void snes_mapper::print()
{
list<map_item>::iterator i;
for (i = map.begin(); i != map.end(); i++) {
map_item &m = *i;
printf("$%.2X:%.4X - $%.2X:%.4X: %#x - %#x\n", m.begin >> 16, m.begin & 0xffff,
m.end >> 16, m.end & 0xffff,
m.rom_off, m.rom_off + (m.end - m.begin));
}
}
uint8_t *snes_mapper::lookup(uint32_t a)
{
list<map_item>::iterator i;
for (i = map.begin(); i != map.end(); i++) {
map_item &m = *i;
if (m.begin > a) {return NULL;}
else if (m.begin <= a && a <= m.end) return base + m.rom_off + (a - m.begin);
}
return NULL;
}
uint8_t *snes_mapper::lookup(uint8_t bank, uint16_t addr)
{
uint8_t *result = lookup(makeaddr(bank, addr));
if (!result) {
fprintf(stderr, "- Couldn't read memory at $%.2X:%.4X. The memory map is likely wrong.\n", bank, addr);
exit(1);
return NULL;
}
return result;
}