Просмотр полной версии : Контрольная сумма
Helloween
19.04.2024, 06:12
Здравствуйте!
Подскажите пожалуйста алгоритм вычисления контрольной суммы (чем точнее алгоритм, тем лучше). Еще очень желательна по возможности откомментированная программа на ассемблере и/или Си.
А К.С. у РК совпадает со Специалистом и тому подобными компьютерами?
Си
Из исходников bin2type
https://github.com/vpyk/EmuUtils/blob/master/bin2tape/bin2tape.cpp#L126
Helloween
19.04.2024, 09:40
Из исходников bin2type
https://github.com/vpyk/EmuUtils/blob/master/bin2tape/bin2tape.cpp#L126
Thanx. А у всех перечисленных компов она по-разному вычисляется?
Alikberov
19.04.2024, 12:31
Хотел на Питоне написать код, но, кажется, уже есть.
Вот написал на Баш'е. Выручает на Raspberry Pi, если ещё добавить пользовательское меню в оболочке Midnight Commander'а.
CityAceE
19.04.2024, 13:09
Вот написал на Баш'е.
А почему Emu80 под Wine, если он в исходниках и существует версия под Linux?
wine ~/Emu80/Emu80qt.exe --platform rk86 --run ${temp_file}
Alikberov
19.04.2024, 13:36
А почему Emu80 под Wine, если он в исходниках и существует версия под Linux?
wine ~/Emu80/Emu80qt.exe --platform rk86 --run ${temp_file}
Да, я пользуюсь сборкой под Linux: Она и запускается быстрее (0,75 секунд против 20 секунд под wine), и систему не так сильно грузит (звук чище, в частности).
Но Баш-скрипт написал ещё до сборки.
(Забыл эту строчку удалить перед публикацией.)
у всех перечисленных компов она по-разному вычисляется?
switch (format) {
case TFF_RKM:
cs = calcRkmCs(body);
break;
case TFF_RKU:
cs = calcRkuCs(body);
break;
default:
cs = calcRkCs(body);
}
Фориат РК по умолчанию. У Микроши и ЮТ-88 свое.
Из исходников Emu80. Возможно, будет понятнее:
uint16_t cs = 0;
for (uint16_t i = 0; i < fileSize - 1; i++) {
cs += buf[i];
cs += (buf[i] << 8);
}
cs = (cs & 0xff00) | ((cs + buf[fileSize - 1]) & 0xff);
Из исходников Emu80
Тут нет lastChunk?
Тут нет lastChunk?
Последняя строка
cs = (cs & 0xff00) | ((cs + buf[fileSize - 1]) & 0xff);
Из исходников Emu80. Возможно, будет понятнее:
uint16_t cs = 0;
for (uint16_t i = 0; i < fileSize - 1; i++) {
cs += buf[i];
cs += (buf[i] << 8);
}
cs = (cs & 0xff00) | ((cs + buf[fileSize - 1]) & 0xff);
Это типа бага изначального монитора, что старший байт последнего суммирования теряется и вместо него используется его предыдущее значение?
А где условие то?
if (lastChunk)
--len;
if (lastChunk)
baseCs = (baseCs & 0xff00) | ((baseCs + data[len]) & 0xff);
Последняя строка
cs = (cs & 0xff00) | ((cs + buf[fileSize - 1]) & 0xff);
lastChunk нет :)
- - - Добавлено - - -
Точнее, в Вашем примере, lastChunk всегда равен true.
Это типа бага изначального монитора, что старший байт последнего суммирования теряется и вместо него используется его предыдущее значение?
Похоже на то, только младший байт.
Похоже на то, только младший байт.
lastChunk включает именно это, так?
Это типа бага изначального монитора, что старший байт последнего суммирования теряется и вместо него используется его предыдущее значение
Вот это.
Powered by vBulletin® Version 4.2.5 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot