![]() ![]() INFO - FAQ - CC2-Forum - CCPro-Forum |
|
' =========================================================================== ' Berechnung der CRC (Cyclic Redundancy Check) mit 32 Bit Auflösung ' In OCBASIC 1.11a für Open-Macro von Dietmar Harlos am 18. Juni 2018 ' =========================================================================== ' Die CRC ist eine Methode zur Fehlererkennung in größeren Datenmengen ' mittels Prüfsumme. Das hier gezeigte Verfahren ist kompatibel zur CRC- ' Berechnung, die von Programmen wie WinZIP, RAR, ARJ, etc. benutzt wird. ' In diesem Demoprogramm wird die CRC-Prüfsumme über alle Bytes des ' Betriebssystems berechnet. Falls an irgendeiner Stelle irgendein Byte ' oder Bit in diesem Speicherbereich fehlerhaft sein sollte, liefert die ' CRC einen von der korrekten Prüfsumme abweichenden Wert zurück. ' Der größte Nachteil dieses Verfahrens ist der relativ hohe Zeitbedarf ' für die Berechnung der CRC32-Prüfsumme. ' --------------------------------------------------------------------------- INCLUDE "omac.def" 'Definitionen für die Open-Macro DEFINE c1 FREERAM1 'Alternative Namen für die FREERAM-Variablen DEFINE c2 FREERAM2 ' definieren. Die OM stellt fünf FREERAM-Bytes DEFINE c3 FREERAM3 ' zur Verfügung, die sich gut zur Nutzung in DEFINE c4 FREERAM4 ' Assemblerprogrammen eignen. ' --------------------------------------------------------------------------- PRINT "CRC32 vom OS1: $"; FILEPOS=&hde00 'Startadresse FileByte=ON 'PRINT# und INPUT# im Byte- statt Wordformat c1=0 : c2=0 : c3=0 : c4=0 'Speicher für CRC initialisieren REPEAT 'Byte aus OS lesen und CRC berechnen, crc32 INPUT# ' bis OS-Ende erreicht UNTIL FILEPOS=&he8c0 PrintHex=ON 'CRC hexadezimal ausgeben PRINT c1 SHL 8 OR c2; c3 SHL 8 OR c4 PRINT "Das OS1 steht fehler"; IF c1=&h49 AND c2=&hb7 AND c3=&hf9 AND c4=&h49 THEN PRINT "frei in der 5-Volt-Version"; ELSEIF c1=&h6c AND c2=&h1d AND c3=&h55 AND c4=&hdd THEN PRINT "frei in der 3-Volt-Version"; ELSE PRINT "haft"; END IF PRINT " im Flash!" ' --- PRINT "CRC32 vom OS2: $"; FILEPOS=&hffc1 'Startadresse FileByte=ON 'PRINT# und INPUT# im Byte- statt Wordformat c1=0 : c2=0 : c3=0 : c4=0 'Speicher für CRC initialisieren crc32 &h80 'auf $ffc0 steht IOSCTV REPEAT crc32 INPUT# UNTIL FILEPOS=&h0000 PrintHex=ON 'CRC hexadezimal ausgeben PRINT c1 SHL 8 OR c2; c3 SHL 8 OR c4 PRINT "Das OS2 steht fehler"; IF c1=&h9c AND c2=&hea AND c3=&h5c AND c4=&ha8 THEN PRINT "frei"; ELSE PRINT "haft"; END IF PRINT " im Flash!" End2Host=ON 'Nach Programmende in den Host-Modus END 'Programmende, Neustart mit der Enter-Taste ' --------------------------------------------------------------------------- ' Subroutine zur CRC32-Berechnung auf der Open-Micro bis Open-Maxi ' Zur Initialisierung müssen FREERAM1 bis FREERAM4 auf Null gesetzt werden. ' Die Berechnung wird Byte-für-Byte durchgeführt. ' --------------------------------------------------------------------------- PROC crc32(databyte) INLASM ! eor FREERAM4 'CRC=CRC XOR DATABYTE ! sta FREERAM4 ! ldx #8 'FOR x=8 DOWNTO 1 #crc32_1 ! sec ' CARRY=CRC AND 1 ! ror FREERAM1 ! ror FREERAM2 ' CRC=(CRC SHR 1) OR &h080000000 ! ror FREERAM3 ! ror FREERAM4 ! bcs crc32_2 ' IF CARRY=0 THEN ! lda #&hed ! eor FREERAM1 ' CRC=CRC XOR &h0edb88320 ! sta FREERAM1 ! lda #&hb8 ! eor FREERAM2 ! sta FREERAM2 ! lda #&h83 ! eor FREERAM3 ! sta FREERAM3 ! lda #&h20 ! eor FREERAM4 ! sta FREERAM4 #crc32_2 ' END IF ! dbnzx crc32_1 'NEXT x ! rts END PROC ' -------------------------------------------------------------------------- Meine Homepage: http://ccintern.dharlos.de |
Antwort schreiben |