in 256 #Byte.Blöcken, (der letzte muss mit nullen aufgefüllt werden) abspeichern, dann eine Prüfsumme über die gesamten 256 Bytes (auch beim Header) erstellen.
Hier der Code dazu, falls es mal jemand anders braucht:
functionCpcCrc(const Data: array of Byte;syncchar:byte):word;vari,bi:integer;Checksum:word;//entspricht(B8D3)little-endianCurrentByte:byte;BitValue:byte;//0oder1A:byte;//das"letzte geschriebene Bit"als$00oder$FFH,L:byte;//fürlesbareDarstellungprocedureUpdateChecksum;inline;vartempA:byte;carry:boolean;begin//ldhl,(B8D3)H:=hi(Checksum);L:=lo(Checksum);//xorhtempA:=AxorH;//jpp,29A0→wennSign-Flag=0(Bit7=0)→positiverPfadif(tempAand$80)=0thencarry:=falseelsebegin//1-Bit//lda,h//xor08tempA:=Hxor$08;H:=tempA;//lda,l//xor10tempA:=Lxor$10;L:=tempA;//scf→Carry=1carry:=true;end;//adchl,hl→HL←HL*2+Carry//inPascal:Links-Shift+Carry-BitinsLSBChecksum:=(word(H)shl8)orL;//machtausHL=ChecksumChecksum:=(Checksumshl1)and$FFFF;//<<1,oberesBitwegifcarrythenChecksum:=Checksumor1;//CarryinsBit0//ld(B8D3),hl→schoninChecksumend;procedureUpdateChecksumByte(currentbyte:byte);varBitPos:integer;beginforBitPos:=7downto0dobeginBitValue:=(currentbyteshrBitPos)and1;ifBitValue=1thenA:=$FFelseA:=$00;//RoutineaufrufenUpdateChecksum;end;end;beginChecksum:=$FFFF;//initifsyncchar>0thenUpdateChecksumByte(syncchar);forbi:=low(data)tohigh(data)doUpdateChecksumByte(data[bi]);result:=Checksumxor$FFFF;end;
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
in 256 #Byte.Blöcken, (der letzte muss mit nullen aufgefüllt werden) abspeichern, dann eine Prüfsumme über die gesamten 256 Bytes (auch beim Header) erstellen.
Hier der Code dazu, falls es mal jemand anders braucht:
(hinweis: syncchar muss immer 0 sein, könnte man auch weglassen)