Paarsuse biti kalkuleerimine
#1
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...
Vasta
#2
Lookup-table (256 bitti ehk 64 baiti)? Ma paremat ei tea. Mõnedel prosedel on paarsuse arvutamine riistvaras.
Vasta
#3
Vaata siia ja sealt edasi. Aga üldiselt, ega seda asjata rauas teha.
Vasta
#4
Ülilihtsat võimalust kas ei ole või siis ei tule kuidagi meelde. Tegin pikemalt, asmis muidugi Smile

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
Vasta
#5
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)Sadb^y)
MOVWF CRC16TEMP_ANYBANK ;
ANDLW H'F0' ; W = (a^x):0
SWAPF CRC16TEMP_ANYBANK,F ; Index = (b^y)Sada^x)
XORWF CRC16TEMP_ANYBANK,F ; Index = (a^b^x^y)Sada^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
Vasta
#6
(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.
Vasta
#7
Muuseas, paarsuse biti lookup tabel peaks olema maks 32 baiti, aga nii vist tehaksegi ?
Vasta
#8
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. Smile
Vasta
#9
Testsin ja parandasin oma koodi veidike, nüüd töötab nagu vaja.
Vasta
#10
(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.

Vasta


Alamfoorumi hüpe:


Kasutaja, kes vaatavad seda teemat: 2 külali(st)ne