Автор Тема: Мучаем ROMы SNES  (Прочитано 4498 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн masyanya

  • Пользователь
  • Сообщений: 545
  • Пол: Мужской
  • ...there's no knowledge that is not power...
    • Youtube
    • Просмотр профиля
Мучаем ROMы SNES
« : 27 Январь 2009, 11:47:33 »
 Забавная ситуация получается... o_0 Прописал калькулятор CheckSum для SNES, оказывается большинство ромов неправильную контрольную сумму имеют  0_0, и что ещё более забавно, меняешь сумму на верную...  :-\ открываешь в одном эмуляторе неправильная колнтрольная сумма... в другом, - правильная, как можно написать хороший эмулятор если даж контрольную сумму посчитать не могут!  >:(

 Народ ромы хачит, ну ладно неправильную контрольную сумму вписал, ну ты хоть комплимент к контрольной сумме введи правильно, google не молчит, но то что нашел по этому поводу вызывает приступы смеха в перемешку с приступами булемии...
 например вот:
Цитата
ROM Checksum (2 bytes)
 The checksum is a 16bit word with the lower 8bits stored first, followed by the upper 8bits.
 The checksum is calculated by dividing the ROM into 4Mbit chunks then adding all the bytes in these chunks together. Once you have the checksum for each chunk, add them together and take the lower 32bits of the result.
With a non-standard image size, you do not get it equally divisible by 4Mbit (excluding 2Mbit images). e.g. 10Mbit = 4Mbit + 4Mbit + 2Mbit chunks.
 Therefore, you must create a 4Mbit chunk from what is left over. Using the same example, you would add the checksum of the following chunks to get the ROM checksum:
4Mbit + 4Mbit + (2Mbit + 2Mbit)
or
4Mbit + 4Mbit + (2 x 2Mbit)
Вот чё загон написан?  >:( Сам то читал?
 Если коротко:
Цитата
- Посчитать сумму можно просто, берем делим ром на куски по 4 мегабита, суммируем байты в этих кусках, потом прибавляем оставшийся кусок берем нижние 32бита (реально берем 16 нижних битов, ну автор не посчитал нужным перечитать написанное перед публикацией  <_<) и получаем сумму
а не проще всё просуммировать?!?!! >:(
 Ах да, если принять на грудь литрушку, становиться понятно что последний кусок надо таки помножить на два перед суммированием!
Ток алгоритм всёравно неправильный! Если взять 12-ти мегабитный ром уже неправильная контрольная сумма.
  Вот тут ваще гомосятина написана, и ещё назвали язык "С" чудовищьным, из за того что долго считает, ну дык правильно, кувалдой сложно чай пить!  o_0
Цитата
fseek(fp,0,SEEK_END);
endofrom=ftell(fp);
fseek(fp,0,SEEK_SET);
for (romoffset=0; (romoffset+rhoffset)<=endofrom-1; romoffset++)
{
 fseek(f, romoffset+rhoffset, SEEK_SET);
 fread(obbuffer, 1, 1, f);
 checksumvalue=(checksumvalue+*obbuffer);
}
Вот так детки не надо писать код для "С"
 Чудовищно  0_0, я просто о..ел увидев такое издевательство над кодом, после чтения байта и так сдвигается на след позицию, вот это зачем fseek(f, romoffset+rhoffset, SEEK_SET); , типа контрольный в голову? Вначале перешли на следующую позицию потом её поставили,  ага, специально выделили массив под 1 байт, и читаем в него...  неописуемая фантазмогория, а попросту, - уродство.  >:( А в конце резюме от этого чела, - код медленный потому что язык Си идеотический, эт не язык Си идеотический, эт наполение мозга такое...
 я бы вот так написал:
fseek(fp,0,SEEK_SET);
 while(!feof(fp))
  checksumvalue+=fgetc(fp);

 И строчек меньше, и работает быстрее, и тож самое, тока всёравно это неправильно!!!
 В общем приложил калькулятор, у кого какие идеи по этому поводу будут?

 Вот например ROM с этого сайта, контрольная сумма неверная, по сути во всем архиве с верной контрольной суммой тока 4 файла, если правильно помню (после двойного двоеточия значение которое должно быть, до, - значение записанное в роме)...
 

 P.S.
 Бесит не то что мало инфы, а то что вранья навалом.
 Попрежнему не могу понять, почему людям не интересно узнавать новое и разбираться в сути вещей, ведь пугает-то неизвестное... :(
« Последнее редактирование: 28 Январь 2009, 09:20:10 от masyanya »

Оффлайн HardWareMan

  • Модератор
  • Сообщений: 7561
    • Просмотр профиля
Re: Мучаем ROMы SNES
« Ответ #1 : 27 Январь 2009, 13:17:15 »
А кто считает контрольку? В сеге проще, ее по идее сам М68К должен считать. Отреверсили один раз алго (а как выяснилось он был дан в sega2.doc) и все. Никакой путаницы. Если контрольку считает сам проц SNES, то реальный результат будет только после реверса.
PS В Сеге область счета дана в заголовке, как есть. Без "банкования". В SNES ИМХО это из-за долбанутой системы HiROM/LoROM.

Оффлайн masyanya

  • Пользователь
  • Сообщений: 545
  • Пол: Мужской
  • ...there's no knowledge that is not power...
    • Youtube
    • Просмотр профиля
Re: Мучаем ROMы SNES
« Ответ #2 : 27 Январь 2009, 13:44:16 »
 Фишка в том, что в роме есть SheckSum и SheckSum Compliment,
По сути верно утверждение, - (SheckSum+SheckSumCompliment)&0xFFFF=0 и SheckSum=~SheckSumCompliment, то есть контрольная сумма не должна влиять на общее значение CRC в файле, но я нашел кучу ромов в которых ни одно из этих утверждений не выполняется, а выполняться должно.
 По сути пофиг, но если хачишь ром, - будь добр на выходе сделать достойное творение а не отстойное.

 P.S. Там оч забавный алгоритм подсчета контрольной суммы... и считается он на каждый MASK ROM к картридже... незнаю как иначе сказать.
 Контрольную сумму можно пользовать для однозначного определение HiROM или LoROM или вообще для определения SNES ROM это или нет, разумеется тока в том случае если в роме правильная контрольная сумма, а если сплош и рядом неправильно записано, тады, - Ой...
 Кстати, а как бы запели изготовители операционных систем еслиб сплош и рядом в  exe'шниках и dll'ках CRC32 какое хошь писалось, например винда низачто не будет грузить dll'ку если у неё CRC32 неправильное, "не является динамической библиотекой"... вот и как теперь какой нить софт писать для SNES ромов если их какие попало выкладывают? Нипаняятнаааааа...
« Последнее редактирование: 28 Январь 2009, 09:25:36 от masyanya »