Suma kontrolna SIO
From Atariki
(Różnice między wersjami)
Wersja z dnia 20:30, 23 maj 2011 Krótki (Dyskusja | wkład) (CRC moved to Suma kontrolna SIO: Artykuł de facto opisuje sumę kontrolną SIO, hasło "CRC" tylko komplikuje sprawę.) ← Previous diff |
Aktualna wersja Krótki (Dyskusja | wkład) (Wywalenie wszelkich śladów pojęcia CRC) |
||
Linia 1: | Linia 1: | ||
- | Z angielskiego ''cyclic redundancy check'', czyli [http://pl.wikipedia.org/wiki/Cykliczny_kod_nadmiarowy cykliczny kod nadmiarowy], obliczana w pewien określony z góry sposób i dołączana do bloku przesyłanych danych wartość, zapewniająca weryfikację poprawności przesłania. | + | W protokole transmisji [[SIO]] do każdego przesyłanego bloku danych dołączany jest pojedynczy bajt sumy kontrolnej, pozwalający wykryć ewentualny błąd transmisji. Bajt sumy kontrolnej jest dołączany na końcu bloku komendy wysyłanej przez komputer, oraz na końcu każdego bloku danych wysyłanego do/z urządzenia zewnętrznego. |
- | W praktyce skrót CRC stosuje się często (acz niezbyt prawidłowo) na określenie [http://pl.wikipedia.org/wiki/Suma_kontrolna sumy kontrolnej]. | + | SIO oblicza sumę kontrolną dodając do siebie kolejne bajty przesyłanego bloku, przy czym do wyniku każdego z dodawań dodawane jest przeniesienie. Przykład obliczenia sumy kontrolnej 256 bajtów umieszczonych pod arbitralnie wybranym adresem w pamięci (oznaczonym etykietą DATA): |
- | + | ||
- | == Suma kontrolna SIO == | + | |
- | + | ||
- | [[SIO]] oblicza sumę kontrolną dodając do siebie kolejne bajty przesyłanego bloku, przy czym do wyniku każdego z dodawań dodawane jest przeniesienie. Przykład obliczenia sumy kontrolnej 256 bajtów umieszczonych pod arbitralnie wybranym adresem w pamięci (oznaczonym etykietą DATA): | + | |
<code> | <code> | ||
- | LDX #$00 | + | LDX #$00 |
- | STX CHKSUM | + | STX CHKSUM |
- | CLC | + | CLC |
- | CRC LDA DATA,X | + | LOOP LDA DATA,X |
- | ADC CHKSUM | + | ADC CHKSUM |
- | ADC #$00 | + | ADC #$00 |
- | STA CHKSUM | + | STA CHKSUM |
- | INX | + | INX |
- | BNE CRC | + | BNE LOOP |
</code> | </code> | ||
Aktualna wersja
W protokole transmisji SIO do każdego przesyłanego bloku danych dołączany jest pojedynczy bajt sumy kontrolnej, pozwalający wykryć ewentualny błąd transmisji. Bajt sumy kontrolnej jest dołączany na końcu bloku komendy wysyłanej przez komputer, oraz na końcu każdego bloku danych wysyłanego do/z urządzenia zewnętrznego.
SIO oblicza sumę kontrolną dodając do siebie kolejne bajty przesyłanego bloku, przy czym do wyniku każdego z dodawań dodawane jest przeniesienie. Przykład obliczenia sumy kontrolnej 256 bajtów umieszczonych pod arbitralnie wybranym adresem w pamięci (oznaczonym etykietą DATA):
LDX #$00 STX CHKSUM CLC LOOP LDA DATA,X ADC CHKSUM ADC #$00 STA CHKSUM INX BNE LOOP
W języku C (wynik w zmiennej cks):
unsigned char cks = 0; unsigned short nck; int i; for (i = 0; i < 256; i++) { nck = cks + data[i]; cks = (nck > 0x00ff) ? ((nck & 0x00ff) + 1) : (nck & 0x00ff); }