Asi on ju lihtne: loed bitis 1-d kokku ja vastavalt paarsuse nõudele lisad või ei lisa 1-e. Aga...juskui mäletaks, et oli olemas mingi elementaarne "ühe liigutusega" trikk baidile sobiva paarsuse biti leidmiseks.
Või ei olnud?
Felch@tahab lihtsalt hakkama saada...
Lookup-table (256 bitti ehk 64 baiti)? Ma paremat ei tea. Mõnedel prosedel on paarsuse arvutamine riistvaras.
Vaata
siia ja sealt edasi. Aga üldiselt, ega seda asjata rauas teha.
Ülilihtsat võimalust kas ei ole või siis ei tule kuidagi meelde. Tegin pikemalt, asmis muidugi
Kood:
movwf sendtemp ; seivi saadetav
movwf countH
btfsc MySerial,.7 ; bit7 paarsus. 0=E,1=N
goto snd_exit
; kalkuleeri paarsuse bitt
movlw .8
movwf countL
clrf adrtemp ; 1-tede loendi
bcf CARRY
parity: rrf countH,F
btfsc CARRY
incf adrtemp,F
decfsz countL
goto parity
bcf CARRY
btfsc adrtemp,.0
bsf CARRY
banksel TXSTA ; paarsuse bitt on nüüd TXSTA,TX9D-s
bcf TXSTA,TX9D
btfsc CARRY
bsf TXSTA,TX9D
banksel .0
snd_exit: btfss PIR1,TXIF ; saatja valmis ?
goto snd_exit
movf sendtemp,W ; saadetav bait meelde tuletada
banksel TXREG
movwf TXREG ; saada!
banksel TXSTA
snd_exit1: btfss TXSTA,TRMT ; kas saatja nihkeregister tühi (bait prosest väljas)?
goto snd_exit1
banksel .0
movf sendtemp,W ; taasta saadetav
return
CRC_INIT_CHKFB8 ;"0xFFFF","0x1021",3xA1 = (CRC) H'CDB4'
MOVLF H'CD',CRC16H_ANYBANK ;(3xA1) crc High on CD
MOVLF H'B4',CRC16L_ANYBANK ;(3xA1) crc Low on B4
CRC_CALC
XORWF CRC16H_ANYBANK,W ; (a^x)
b^y)
MOVWF CRC16TEMP_ANYBANK ;
ANDLW H'F0' ; W = (a^x):0
SWAPF CRC16TEMP_ANYBANK,F ; Index = (b^y)
a^x)
XORWF CRC16TEMP_ANYBANK,F ; Index = (a^b^x^y)
a^x) = i2:i1
MOVF CRC16TEMP_ANYBANK,W
ANDLW H'F0'
XORWF CRC16L_ANYBANK,W
MOVWF CRC16H_ANYBANK
RLF CRC16TEMP_ANYBANK,W
RLF CRC16TEMP_ANYBANK,W
XORWF CRC16H_ANYBANK,F
ANDLW H'E0'
XORWF CRC16H_ANYBANK,F
SWAPF CRC16TEMP_ANYBANK,F
XORWF CRC16TEMP_ANYBANK,W
MOVWF CRC16L_ANYBANK
RETURN
see 17 käsuline programmijupp ka töötab täiesti, olen kasutanud.
http://www.lammertbies.nl/comm/info/crc-...ation.html
crc kalkulaatorid on paljud kõverad ehk teoreetilised, aga see siin töötab, vähemasti floppy asjades ta toimib olen kasutanud.
aga üldiselt on see crc asi loomaaed, variante on seinast seina ja igale muidugi oma kalkulaator ja oma programmijupp asm-is
(24-09-2012, 11:06 PM)ahelet Kirjutas: [ -> ]CRC_INIT_CHKFB8 .....
Tänks, CRC arvutamiseks on tõesti väga palju valemeid. Mul oli hetkel küll vaja paarsust, mitte CRC-d.
Muuseas, paarsuse biti lookup tabel peaks olema maks 32 baiti, aga nii vist tehaksegi ?
Proovisin leida baidi paarsust C keeles. (Puht laiskusest.)
Aga katsuge sama teha ASMis.
Seal peaks kuluma 7 käsku?
Muuses, seda C-d võib transleerida ka PICi jaoks.
Kood:
#include <stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[]){
int a =0x93,b,i;
fprintf(stdout,"Arv (detsi hex bin)-vahekujud (hex bin)-paarsus\n");
for(i=0;i<=255;i++){
// Katsetame leida arvude 0 kuni 255 paarsust
b=i;
// nihutame baiti 4 bitti paremale ja kasutame XOR käsku
b=b^(b>>4);
// nihutame baiti 2 bitti paremale ja kasutame XOR käsku
b=b^(b>>2);
// nihutame baiti 1 bitti paremale ja kasutame XOR käsku
b=b^(b>>1);
fprintf(stdout,"%3d %2X %8b - %2X %8b - %d\n",i,i,i,b,b,b&1);
}
fprintf(stdout,"Käsud nihutada ja XOR on olemas ka ASMis\n");
return 0;
}
_________________________________
Õhtu on vist ikka hommikust targem.
Kui nihutada vasakule, siis saab suunata baidi märgi järgi.
Jälle üks käsk vähem.
Testsin ja parandasin oma koodi veidike, nüüd töötab nagu vaja.
(01-10-2012, 08:54 AM)felch Kirjutas: [ -> ]Testsin ja parandasin oma koodi veidike, nüüd töötab nagu vaja.
Kus kaasajal sellist asja veel kasutatakse?
Vaata kunagi, 68.-70. oli selline vägev arvuti mis paarsuse abilmälu vigu parandas. Ühe vea sõnas parandas, kaks avastas.
Kutsuti Hemmingi koodiks.