Der Nachfolger des WDR-Computerclub mit Wolfgang Back und Wolfgang Rudolph - ...und immer ein Bit übrigbehalten!


Das Forum zur C-Control-1
Welche C-Control-Varianten existieren?
Übersicht - Suchen - Neueste 50 Beiträge - Neuer Beitrag - Login - Registrieren
INFO - FAQ - CC2-Forum - CCPro-Forum 

 Auf der Open-Macro Kategorie: Open-Micro/Open-Mini/Open-Midi/Open-Macro/Open-Maxi (von Dietmar, Homepage - 20.06.2018 12:38)
 Als Antwort auf Betriebssystem mittels CRC prüfen von Dietmar - 9.06.2018 1:43
Dietmar nutzt:  Open-Micro, Open-Mini, Open-Midi, Open-Macro, Open-Maxi, Open-Mini M-Unit, Open-Mini Station
' ===========================================================================
' 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

Bisherige Antworten: