mirror of
https://github.com/sanni/cartreader.git
synced 2024-11-30 16:34:14 +01:00
All: Factorise title generation from cart.
Fix out-of-bound access when first byte is not an ascii printable character. Reduces program space use by 480 bytes.
This commit is contained in:
parent
3b05046ee9
commit
67b54a690b
@ -1884,6 +1884,32 @@ void setColor_RGB(byte r, byte g, byte b) {
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Extract ASCII printable characters from input, collapsing underscores and spaces.
|
||||||
|
// Use when extracting titles from cartridges, to build a rom title.
|
||||||
|
byte buildRomName(char *output, const byte *input, byte length) {
|
||||||
|
byte input_char;
|
||||||
|
byte output_len = 0;
|
||||||
|
for (unsigned int i = 0; i < length; i++) {
|
||||||
|
input_char = input[i];
|
||||||
|
if (isprint(input_char) && input_char != '<' && input_char != '>' && input_char != ':' && input_char != '"' && input_char != '/' && input_char != '\\' && input_char != '|' && input_char != '?' && input_char != '*') {
|
||||||
|
output[output_len++] = input_char;
|
||||||
|
} else {
|
||||||
|
if (output_len == 0 || output[output_len - 1] != '_') {
|
||||||
|
output[output_len++] = '_';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while (
|
||||||
|
output_len && (
|
||||||
|
output[output_len - 1] == '_' || output[output_len - 1] == ' '
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
output_len--;
|
||||||
|
}
|
||||||
|
output[output_len] = 0;
|
||||||
|
return output_len;
|
||||||
|
}
|
||||||
|
|
||||||
// Converts a progmem array into a ram array
|
// Converts a progmem array into a ram array
|
||||||
void convertPgm(const char* const pgmOptions[], byte numArrays) {
|
void convertPgm(const char* const pgmOptions[], byte numArrays) {
|
||||||
for (int i = 0; i < numArrays; i++) {
|
for (int i = 0; i < numArrays; i++) {
|
||||||
|
@ -882,12 +882,10 @@ void getCartInfo_GB() {
|
|||||||
for (int addr = 0x0134; addr <= 0x0143 - x; addr++) {
|
for (int addr = 0x0134; addr <= 0x0143 - x; addr++) {
|
||||||
myByte = sdBuffer[addr];
|
myByte = sdBuffer[addr];
|
||||||
if (isprint(myByte) && myByte != '<' && myByte != '>' && myByte != ':' && myByte != '"' && myByte != '/' && myByte != '\\' && myByte != '|' && myByte != '?' && myByte != '*') {
|
if (isprint(myByte) && myByte != '<' && myByte != '>' && myByte != ':' && myByte != '"' && myByte != '/' && myByte != '\\' && myByte != '|' && myByte != '?' && myByte != '*') {
|
||||||
romName[myLength] = char(myByte);
|
romName[myLength++] = char(myByte);
|
||||||
} else {
|
} else if (myLength == 0 || romName[myLength - 1] != '_') {
|
||||||
if (romName[myLength - 1] == 0x5F) myLength--;
|
romName[myLength++] = '_';
|
||||||
romName[myLength] = 0x5F;
|
|
||||||
}
|
}
|
||||||
myLength++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Find Game Serial
|
// Find Game Serial
|
||||||
@ -904,11 +902,13 @@ void getCartInfo_GB() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Strip trailing white space
|
// Strip trailing white space
|
||||||
for (unsigned int i = myLength - 1; i > 0; i--) {
|
while (
|
||||||
if ((romName[i] != 0x5F) && (romName[i] != 0x20)) break;
|
myLength &&
|
||||||
romName[i] = 0x00;
|
(romName[myLength - 1] == '_' || romName[myLength - 1] == ' ')
|
||||||
|
) {
|
||||||
myLength--;
|
myLength--;
|
||||||
}
|
}
|
||||||
|
romName[myLength] = 0;
|
||||||
|
|
||||||
// M161 (Mani 4 in 1)
|
// M161 (Mani 4 in 1)
|
||||||
if (strncmp(romName, "TETRIS SET", 10) == 0 && sdBuffer[0x14D] == 0x3F) {
|
if (strncmp(romName, "TETRIS SET", 10) == 0 && sdBuffer[0x14D] == 0x3F) {
|
||||||
|
@ -755,25 +755,7 @@ void getCartInfo_GBA() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Get name
|
// Get name
|
||||||
byte myByte = 0;
|
buildRomName(romName, &sdBuffer[0xA0], 11);
|
||||||
byte myLength = 0;
|
|
||||||
for (int addr = 0xA0; addr <= 0xAB; addr++) {
|
|
||||||
myByte = sdBuffer[addr];
|
|
||||||
if (isprint(myByte) && myByte != '<' && myByte != '>' && myByte != ':' && myByte != '"' && myByte != '/' && myByte != '\\' && myByte != '|' && myByte != '?' && myByte != '*') {
|
|
||||||
romName[myLength] = char(myByte);
|
|
||||||
} else {
|
|
||||||
if (romName[myLength - 1] == 0x5F) myLength--;
|
|
||||||
romName[myLength] = 0x5F;
|
|
||||||
}
|
|
||||||
myLength++;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Strip trailing white space
|
|
||||||
for (unsigned int i = myLength - 1; i > 0; i--) {
|
|
||||||
if ((romName[i] != 0x5F) && (romName[i] != 0x20)) break;
|
|
||||||
romName[i] = 0x00;
|
|
||||||
myLength--;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get ROM version
|
// Get ROM version
|
||||||
romVersion = sdBuffer[0xBC];
|
romVersion = sdBuffer[0xBC];
|
||||||
|
@ -2181,33 +2181,9 @@ void idCart() {
|
|||||||
// Get rom version
|
// Get rom version
|
||||||
romVersion = sdBuffer[0x3F];
|
romVersion = sdBuffer[0x3F];
|
||||||
|
|
||||||
// Get name
|
|
||||||
byte myByte = 0;
|
|
||||||
byte myLength = 0;
|
|
||||||
for (unsigned int i = 0; i < 20; i++) {
|
|
||||||
myByte = sdBuffer[0x20 + i];
|
|
||||||
if (isprint(myByte) && myByte != '<' && myByte != '>' && myByte != ':' && myByte != '"' && myByte != '/' && myByte != '\\' && myByte != '|' && myByte != '?' && myByte != '*') {
|
|
||||||
romName[myLength] = char(myByte);
|
|
||||||
} else {
|
|
||||||
if (romName[myLength - 1] == 0x5F) myLength--;
|
|
||||||
romName[myLength] = 0x5F;
|
|
||||||
}
|
|
||||||
myLength++;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Strip trailing white space
|
|
||||||
for (unsigned int i = myLength - 1; i > 0; i--) {
|
|
||||||
if ((romName[i] != 0x5F) && (romName[i] != 0x20)) break;
|
|
||||||
romName[i] = 0x00;
|
|
||||||
myLength--;
|
|
||||||
}
|
|
||||||
|
|
||||||
// If name consists out of all japanese characters use cart id
|
// If name consists out of all japanese characters use cart id
|
||||||
if (myLength == 0) {
|
if (buildRomName(romName, &sdBuffer[0x20], 20) == 0) {
|
||||||
romName[0] = sdBuffer[0x3B];
|
strcpy(romName, cartID);
|
||||||
romName[1] = sdBuffer[0x3C];
|
|
||||||
romName[2] = sdBuffer[0x3D];
|
|
||||||
romName[3] = sdBuffer[0x3E];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef savesummarytotxt
|
#ifdef savesummarytotxt
|
||||||
|
@ -1016,25 +1016,7 @@ boolean checkcart_SNES() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Get name
|
// Get name
|
||||||
byte myByte = 0;
|
byte myLength = buildRomName(romName, &snesHeader[headerStart], 21);
|
||||||
byte myLength = 0;
|
|
||||||
for (unsigned int i = 0xFFC0; i < 0xFFD5; i++) {
|
|
||||||
myByte = snesHeader[i - headerStart];
|
|
||||||
if (isprint(myByte) && myByte != '<' && myByte != '>' && myByte != ':' && myByte != '"' && myByte != '/' && myByte != '\\' && myByte != '|' && myByte != '?' && myByte != '*') {
|
|
||||||
romName[myLength] = char(myByte);
|
|
||||||
} else {
|
|
||||||
if (romName[myLength - 1] == 0x5F) myLength--;
|
|
||||||
romName[myLength] = 0x5F;
|
|
||||||
}
|
|
||||||
myLength++;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Strip trailing white space
|
|
||||||
for (unsigned int i = myLength - 1; i > 0; i--) {
|
|
||||||
if ((romName[i] != 0x5F) && (romName[i] != 0x20)) break;
|
|
||||||
romName[i] = 0x00;
|
|
||||||
myLength--;
|
|
||||||
}
|
|
||||||
|
|
||||||
// If name consists out of all japanese characters use game code
|
// If name consists out of all japanese characters use game code
|
||||||
if (myLength == 0) {
|
if (myLength == 0) {
|
||||||
@ -1045,9 +1027,10 @@ boolean checkcart_SNES() {
|
|||||||
romName[3] = 'C';
|
romName[3] = 'C';
|
||||||
romName[4] = '-';
|
romName[4] = '-';
|
||||||
for (unsigned int i = 0; i < 4; i++) {
|
for (unsigned int i = 0; i < 4; i++) {
|
||||||
|
byte myByte;
|
||||||
myByte = snesHeader[0xFFB2 + i - headerStart];
|
myByte = snesHeader[0xFFB2 + i - headerStart];
|
||||||
if (((char(myByte) >= 48 && char(myByte) <= 57) || (char(myByte) >= 65 && char(myByte) <= 122)) && myLength < 4) {
|
if (((myByte >= '0' && myByte <= '9') || (myByte >= 'A' && myByte <= 'z')) && myLength < 4) {
|
||||||
romName[myLength + 5] = char(myByte);
|
romName[myLength + 5] = myByte;
|
||||||
myLength++;
|
myLength++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user