Erhard hat geschrieben: ↑23.02.2023 08:15
das sieht nach einer Routine aus, die entsprechend der Atari-SIO eine Prüfsumme erzeugt.
Korrekt.
Sie stammt offenbar aus dem Vorläufer des SDriveMax und wurde von Farb geschrieben.
Es werden einfach alle Bytes der Reihe nach addiert. In Assembler wird der Übertrag glaube ich mit reinaddiert, weiß ich aber nicht mehr genau und müßte ich nachschauen.
Ja, der Übertrag wird mit reinaddiert.
Aber egal wie groß der Datenblock ist, es werden nur die unteren 8 Bits (= 1 Byte) für die Prüfsumme verwendet.
Hier gibt's ein klares "jein".
Nicht die unteren 8 Bits werden verwendet, sondern das Ergebnis ist immer $00-$FF weil immer nur auf einem Byte addiert wird.
chkSum muss nur deshalb Integer sein, dass der Überlauf (a.k.a. Carry-Bit) erkannt wird (=$100).
Er wird direkt danach durch diesen Befehl (achtmal nach rechts schieben => $100 wird zu $1) wieder zum Byte addiert, wodurch das Ergebnis nur noch 8 Bit hat.
Als Ergebnis liefert sie 1 Byte zurück, die Prüfsumme eben.
Allerdings würde ACTION! bei dem Konstrukt richtig abkotzen, denn innerhalb der Funktion wird "chksum" als Integer definiert und bei der Rückgabe als Byte.
Yep, aber manchmal ist die Gelassenheit von C in Bezug auf Typecasts durchaus hilfreich.
Vermutlich funktioniert die Routine nicht mit Datenblöcken von mehr als 256 Bytes, da dann das Ergebnis größer als 16 Bit wird oder werden kann.
Doch, das sollte gehen. Es wird ja immer nur wieder auf das eine Byte draufaddiert.
Mit größeren Datenblöcken steigt aber das statistische Risiko an, dass eventuelle Fehler sich so ergänzen, dass die Prüfsumme zufällig wieder stimmt.