![]() ![]() INFO - FAQ - CC2-Forum - CCPro-Forum |
|
' =========================================================================== ' Berechnung der CRC (Cyclic Redundancy Check) mit 32 Bit Auflösung ' In OCBASIC 1.11a für Open-Maxi von Dietmar Harlos am 9. 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. ' Wenn mittels NVCONFIG Änderungen an der Open-Maxi vorgenommen wurden, ' wirkt sich das auf OS2 aus. Die CRC von OS2 wird in diesem Fall als ' fehlerhaft gemeldet. ' --------------------------------------------------------------------------- INCLUDE "omax.def" 'Definitionen für die Open-Maxi 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. DIM adr WORD 'Die Adresse als 16-Bit-WORD-Variable ' --------------------------------------------------------------------------- PRINT "CRC32 vom OS1: $"; adr=&h0a00 'Startadresse c1=0 : c2=0 : c3=0 : c4=0 'Speicher für CRC initialisieren REPEAT 'Byte aus OS lesen und CRC berechnen, crc32 PEEK(adr) ' bis OS-Ende erreicht ADD adr,1 UNTIL adr=&h1800 PrintHex=ON 'CRC hexadezimal ausgeben PRINT c1 SHL 8 OR c2; c3 SHL 8 OR c4 PRINT "Das OS1 steht fehler"; IF c1=&h5b AND c2=&h0b AND c3=&hf9 AND c4=&h8a THEN PRINT "frei"; ELSE PRINT "haft"; END IF PRINT " im Flash!" ' --- PRINT "CRC32 vom OS2: $"; adr=&hfe00 'Startadresse c1=0 : c2=0 : c3=0 : c4=0 'Speicher für CRC initialisieren REPEAT IF adr=&hffbe THEN 'auf $ffbe steht NVICGTRM crc32 &hff ELSE crc32 PEEK(adr) END IF ADD adr,1 UNTIL adr=&h0000 PrintHex=ON 'CRC hexadezimal ausgeben PRINT c1 SHL 8 OR c2; c3 SHL 8 OR c4 PRINT "Das OS2 steht fehler"; IF c1=&hd2 AND c2=&h38 AND c3=&h18 AND c4=&h8a 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 |