Pas mal la technique de l'offset,X en soustrayant les pointeurs de tableau !
Le U au lieu de S, c'est juste un choix arbitraire. On peut mettre S.
J'ai deux nouvelles versions à vous soumettre. La premiere basée sur le même principe du coup, et la seconde qui est l'algorithme original, donc plus de tables, mais plus lent. Par contre beaucoup plus compact, forcément. Ca fonctionne, mais c'est pas optimisé.
Code:
; A = longueur des data (max. 256)
; Y = Pointeur sur les data
; Le vecteur d'initialisation est poussé sur la pile (4 octets)
; En sortie, le CRC32 est à la place du vecteur d'initialisation
CRC32 EQU *
COM 4,S
COM 3,S
COM 2,S
COM 1,S
LOOPC LDB 4,S
EORB ,Y+
LDX #TABLE0
ABX
LDB ,X
EORB 3,S
STB 4,S
LDB TABLE2-TABLE3,X
EORB 2,S
STB 3,S
LDB TABLE1-TABLE3,X
EORB 1,S
STB 2,S
LDB TABLE0-TABLE3,X
STB 1,S
DECA
BNE LOOPC
COM 4,S
COM 3,S
COM 2,S
COM 1,S
RTS
Et le code de l'algorithme sans tables (1er jet fonctionnel) :
Code:
; En entrée, vecteur d'initialisation, pointeur sur data, pointeur sur fin de data poussés sur la pile
; En sortie, le CRC-32 prend la place du vecteur d'initialisation sur la pile
CRC32 LEAS -1,S
LDY 3,S
COM 5,S
COM 6,S
COM 7,S
COM 8,S
NEXT LDA 8,S
EORA ,Y+
CMPY 1,S
BHI FIN
STA 8,U
LDA #8
STA ,S
SCROLL LSR 5,S
ROR 6,S
ROR 7,S
ROR 8,S
BCC SKIP
LDD 7,S
EORA #$83
EORB #$20
STD 7,S
LDD 5,S
EORA #$ED
EORB #$B8
STD 5,S
SKIP DEC ,S
BNE SCROLL
BRA NEXT
COM 5,S
COM 6,S
COM 7,S
COM 8,S
LEAS 5,S
RTS
Sachant que le pseudo-code a implementer est :
Code:
r = ~r;
for(;;)
{
x = fgetc(f); // next character
if (feof(f)) break;
r^=x;
if (r&0x01) { r = (r>>1)^0xedb88320; } else { r >>= 1; }
if (r&0x01) { r = (r>>1)^0xedb88320; } else { r >>= 1; }
if (r&0x01) { r = (r>>1)^0xedb88320; } else { r >>= 1; }
if (r&0x01) { r = (r>>1)^0xedb88320; } else { r >>= 1; }
if (r&0x01) { r = (r>>1)^0xedb88320; } else { r >>= 1; }
if (r&0x01) { r = (r>>1)^0xedb88320; } else { r >>= 1; }
if (r&0x01) { r = (r>>1)^0xedb88320; } else { r >>= 1; }
if (r&0x01) { r = (r>>1)^0xedb88320; } else { r >>= 1; }
}
printf("CRC32=%08x\n", ~r);