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 

 Betriebssystem mittels CRC prüfen Kategorie: Open-Micro/Open-Mini/Open-Midi/Open-Macro/Open-Maxi (von Dietmar, Homepage - 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-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

Bisherige Antworten:

Auf der Open-Macro (von Dietmar - 20.06.2018 12:38)