Вход

Просмотр полной версии : Контрольная сумма



Helloween
19.04.2024, 06:12
Здравствуйте!

Подскажите пожалуйста алгоритм вычисления контрольной суммы (чем точнее алгоритм, тем лучше). Еще очень желательна по возможности откомментированная программа на ассемблере и/или Си.
А К.С. у РК совпадает со Специалистом и тому подобными компьютерами?

cy6
19.04.2024, 07:58
Си
Из исходников 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), и систему не так сильно грузит (звук чище, в частности).
Но Баш-скрипт написал ещё до сборки.
(Забыл эту строчку удалить перед публикацией.)

cy6
19.04.2024, 15:46
у всех перечисленных компов она по-разному вычисляется?

switch (format) {
case TFF_RKM:
cs = calcRkmCs(body);
break;
case TFF_RKU:
cs = calcRkuCs(body);
break;
default:
cs = calcRkCs(body);
}

Фориат РК по умолчанию. У Микроши и ЮТ-88 свое.

Pyk
19.04.2024, 17:49
Из исходников 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);

cy6
19.04.2024, 21:38
Из исходников Emu80
Тут нет lastChunk?

Pyk
19.04.2024, 22:28
Тут нет lastChunk?
Последняя строка

cs = (cs & 0xff00) | ((cs + buf[fileSize - 1]) & 0xff);

Shaos
20.04.2024, 07:32
Из исходников 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);
Это типа бага изначального монитора, что старший байт последнего суммирования теряется и вместо него используется его предыдущее значение?

cy6
22.04.2024, 09:36
А где условие то?

if (lastChunk)
--len;

if (lastChunk)
baseCs = (baseCs & 0xff00) | ((baseCs + data[len]) & 0xff);



Последняя строка

cs = (cs & 0xff00) | ((cs + buf[fileSize - 1]) & 0xff);

lastChunk нет :)

- - - Добавлено - - -

Точнее, в Вашем примере, lastChunk всегда равен true.

Pyk
22.04.2024, 09:37
Это типа бага изначального монитора, что старший байт последнего суммирования теряется и вместо него используется его предыдущее значение?
Похоже на то, только младший байт.

cy6
22.04.2024, 11:44
Похоже на то, только младший байт.
lastChunk включает именно это, так?

Это типа бага изначального монитора, что старший байт последнего суммирования теряется и вместо него используется его предыдущее значение
Вот это.