-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlibsmw.h
146 lines (138 loc) · 3.79 KB
/
libsmw.h
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
#pragma once
#include <cstdio>
extern unsigned char * romdata;
extern int romlen;
extern const char * openromerror;
bool openrom(const char * filename, bool confirm=true);
void closerom(bool save=true);
enum mapper_t {
invalid_mapper,
lorom,
hirom,
sa1rom,
bigsa1rom,
sfxrom,
norom,
} extern mapper;
extern int sa1banks[8];//only 0, 1, 4, 5 are used
//#define CONV_UNHEADERED 0
//#define CONV_HEADERED 1
//#define CONV_PCTOSNES 2
//#define CONV_SNESTOPC 0
//#define CONV_LOROM 0
//int convaddr(int addr, int mode);
//Tip: Use snestopc and pctosnes if possible.
inline int snestopc(int addr)
{
if (addr<0 || addr>0xFFFFFF) return -1;//not 24bit
if (mapper==lorom)
{
if ((addr&0xF00000)==0x700000 ||//wram, sram
(addr&0x408000)==0x000000)//area that shouldn't be used in lorom
return -1;
addr=((addr&0x7F0000)>>1|(addr&0x7FFF));
return addr;
}
if (mapper==hirom)
{
if ((addr&0xFE0000)==0x7E0000 ||//wram
(addr&0x408000)==0x000000)//hardware regs, ram mirrors, other strange junk
return -1;
return addr&0x3FFFFF;
}
if (mapper==sfxrom)
{
if ((addr&0x600000)==0x600000 ||//wram, sram, open bus
(addr&0x408000)==0x000000 ||//hardware regs, ram mirrors, rom mirrors, other strange junk
(addr&0x800000)==0x800000)//fastrom isn't valid either in superfx
return -1;
if (addr&0x400000) return addr&0x3FFFFF;
else return (addr&0x7F0000)>>1|(addr&0x7FFF);
}
if (mapper==sa1rom)
{
if ((addr&0x408000)==0x008000)
{
return sa1banks[(addr&0xE00000)>>21]|((addr&0x1F0000)>>1)|(addr&0x007FFF);
}
if ((addr&0xC00000)==0xC00000)
{
return sa1banks[((addr&0x100000)>>20)|((addr&0x200000)>>19)]|(addr&0x0FFFFF);
}
return -1;
}
if (mapper==bigsa1rom)
{
if ((addr&0xC00000)==0xC00000)//hirom
{
return (addr&0x3FFFFF)|0x400000;
}
if ((addr&0xC00000)==0x000000 || (addr&0xC00000)==0x800000)//lorom
{
if ((addr&0x008000)==0x000000) return -1;
return (addr&0x800000)>>2 | (addr&0x3F0000)>>1 | (addr&0x7FFF);
}
return -1;
}
if (mapper==norom)
{
return addr;
}
return -1;
}
inline int pctosnes(int addr)
{
if (addr<0) return -1;
if (mapper==lorom)
{
if (addr>=0x400000) return -1;
addr=((addr<<1)&0x7F0000)|(addr&0x7FFF)|0x8000;
return addr|0x800000;
//if ((addr&0xF00000)==0x700000) return addr|0x800000;
//return addr;
}
if (mapper==hirom)
{
if (addr>=0x400000) return -1;
return addr|0xC00000;
}
if (mapper==sa1rom)
{
for (int i=0;i<8;i++)
{
if (sa1banks[i]==(addr&0x700000)){ return 0x008000|(i<<21)|((addr&0x0F8000)<<1)|(addr&0x7FFF);}
}
return -1;
}
if (mapper==bigsa1rom)
{
if (addr>=0x800000) return -1;
if ((addr&0x400000)==0x400000)
{
return addr|0xC00000;
}
if ((addr&0x600000)==0x000000)
{
return ((addr<<1)&0x3F0000)|0x8000|(addr&0x7FFF);
}
if ((addr&0x600000)==0x200000)
{
return 0x800000|((addr<<1)&0x3F0000)|0x8000|(addr&0x7FFF);
}
return -1;
}
if (mapper==norom)
{
return addr;
}
return -1;
}
int getpcfreespace(int size, bool isforcode, bool autoexpand=true, bool respectbankborders=true, bool align=false, unsigned char freespacebyte=0x00);
int getsnesfreespace(int size, bool isforcode, bool autoexpand=true, bool respectbankborders=true, bool align=false, unsigned char freespacebyte=0x00);
void resizerats(int snesaddr, int newlen);
void removerats(int snesaddr, unsigned char clean_byte);
int ratsstart(int pcaddr);
bool goodchecksum();
void fixchecksum();
void WalkRatsTags(void(*func)(int loc, int len));//This one calls func() for each RATS tag in the ROM. The pointer is SNES format.
void WalkMetadata(int loc, void(*func)(int loc, char * name, int len, unsigned char * contents));//This one calls func() for each metadata block in the RATS tag whose contents (metadata) start at loc in the ROM. Do not replace name with an invalid metadata name, and note that name is not null terminated.