Так, поигрался ещё с прошивкой, вот результат.
--
Есть проблема с SMS играми в том, что если не поставить:
Hide by header: Show
Show ROM Info: Hide
То ромы просто не будут видны. Нужно исправить.
--
Плюс всякие разности по юзабилити:
1) При первом обращении к SD карте, что-то делается, в следствии чего ОС подвисает и ощущение что картридж завис, нужно бы добавить предупреждение что всё в порядке, просто подождите.
2) Выбор пунктов меню на кнопку START немного не интуитивно, желательно заменить на кнопку A, тем более что отмена - кнопка B, да и в мессадж боксах просят нажать A.
3) Сделать так, чтобы на кнопку B не выходил из самой SD карты, а просто переходил в папках на уровень выше.
4) Пропала возможность загрузить в SRAM или EEPROM свой сейв, тоже желательно вернуть возможность.
5) Хочется иметь возможность редактировать GG коды, в играх, которые уже залиты во внутреннюю память.
6) Добавить меню выбора где тебе предлагают - запустить выбранный ром или просто залить его во внутреннюю память.
7) Удалить возможность GG кодов у SMS игр, т.к. таких не существует (?). А если включить поддержку и даже ничего не вводить, игра не запустится.
--
Что-то не то в GG кодах.
Пример Comix Zone (USA).
Код AJCV-4A56 (неуязвимость).
В Fusion он преобразуется в 1D057C:6002
А в картридже в 1D057C:6000
В следствии чего в эмуляторе код работает, а в картридже вылетает игра. Если пропатчить ром с кодом, тоже нормально работает во флешкартридже. Так что скорее всего неправильное преобразование.
Вообще, вот функции преобразования GG в HEX. Не помню, честно говоря, откуда подсмотрел, в каких-то исходниках программы.
Code: Select all
private readonly char[] alphabet = new char[]
{
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
'J', 'K', 'L', 'M', 'N', 'P', 'R', 'S',
'T', 'V', 'W', 'X', 'Y', 'Z', '0', '1',
'2', '3', '4', '5', '6', '7', '8', '9'
};
private int CharToInt(char letter)
{
for (int i = 0; i < alphabet.Length; i++)
{
if (alphabet[i] == letter)
{
return i;
}
}
return -1;
}
private int[] DecodeGameGenieCode(string gameGenieCode)
{
long bitstring = 0;
for (int i = 0; i < gameGenieCode.Length; i++)
{
if (i != 4)
{
char ch = gameGenieCode[i];
bitstring <<= 5;
bitstring |= CharToInt(ch);
}
}
int[] decoded = new int[2];
int temp;
decoded[1] = (int)(((bitstring >> 7) & 0xE) | ((bitstring >> 15) & 0x1));
temp = (int)(((bitstring >> 11) & 0xE) | ((bitstring >> 11) & 0x1));
decoded[1] <<= 4;
decoded[1] |= temp;
temp = (int)(bitstring >> 32);
decoded[1] <<= 8;
decoded[1] |= temp;
decoded[0] = (int)((bitstring >> 16) & 0xFF);
temp = (int)((bitstring >> 24) & 0xFF);
decoded[0] <<= 8;
decoded[0] |= temp;
temp = (int)(bitstring & 0xFF);
decoded[0] <<= 8;
decoded[0] |= temp;
return decoded;
}
int[] decoded = new int[2];
List<byte> bytes = new List<byte>(); ;
FileStream romFile;
decoded = DecodeGameGenieCode(gameGenieCode.ToString());
bytes.Add(BitConverter.GetBytes(decoded[1])[1]);
bytes.Add(BitConverter.GetBytes(decoded[1])[0]);
romFile = new FileStream(txtRomFilePath.Text, FileMode.Open, FileAccess.Write);
foreach (byte i in bytes)
{
romFile.Position = decoded[0];
romFile.WriteByte(i);
decoded[0]++;
}
romFile.Close();
bytes.Clear();
--
Ещё баги по части SMS игр.
1) Не сохраняются игры. Пробовал Phantasy Star и Golden Axe Warrior. В обоих случаях мусор вместо нормальных сейвов.
2) При сбросе некоторые игры подвисают и сбрасываются только через 1-2 секунды.