Created
July 18, 2016 16:50
-
-
Save diecrf/284b9733c9a654f395858f0dec84dcbc to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
.title "DECODIFICADOR REED-SOLOMON 63-48" | |
; | |
.global R_S | |
.global a_tabla,a_mult | |
.global a_inRS,a_salida | |
; | |
i .set 2 ; Interleaving entre codigos | |
j .set 2 ; Interleaving de canal | |
; | |
.bss sindromes,63 ; Transformada de entrada + extension | |
.bss T,16 ; Auxiliar Berlekamp-Massey | |
.bss F,63 ; Auxiliar FFT | |
.bss G,63 ; Auxiliar FFT | |
.bss g,63 ; Entrada FFT | |
; | |
.data | |
; | |
a_inverso .word inverso | |
a_sindromes .word sindromes | |
; | |
a_F .word F | |
a_g .word g | |
a_G .word G | |
a_igamma .word igamma | |
a_ibeta .word ibeta | |
a_ishuf .word ishuf | |
a_oshuf .word oshuf | |
; | |
a_A .word A | |
a_B .word B | |
a_T .word T | |
; | |
; Tabla de inversos de alfa | |
; | |
inverso .word 32,63,47,21,39,44,58, 9,35, 7 | |
.word 22,20,29,56,52,59,33,54,51,25 | |
.word 11, 3,10,55,62,19,28,34,26,12 | |
.word 45,48,32,16,27, 8,41,61,60, 4 | |
.word 53,36,49,46, 5,30,43, 2,31,42 | |
.word 57,18,14,40,17,23,13,50, 6,15 | |
.word 38,37,24, 1 | |
; | |
; Variables auxiliares para Berlekamp-Massey | |
; | |
A .word 32, 0, 0, 0, 0, 0, 0, 0, 0, 0 | |
.word 0, 0, 0, 0, 0, 0 | |
; | |
B .word 32, 0, 0, 0, 0, 0, 0, 0, 0, 0 | |
.word 0, 0, 0, 0, 0, 0 | |
; | |
; Variables auxiliares para Good-Thomas FFT | |
; | |
; Input shuffling | |
; | |
ishuf .word 0,36, 9,45,18,54,27 | |
.word 28, 1,37,10,46,19,55 | |
.word 56,29, 2,38,11,47,20 | |
.word 21,57,30, 3,39,12,48 | |
.word 49,22,58,31, 4,40,13 | |
.word 14,50,23,59,32, 5,41 | |
.word 42,15,51,24,60,33, 6 | |
.word 7,43,16,52,25,61,34 | |
.word 35, 8,44,17,53,26,62 | |
; | |
; Output shuffling | |
; | |
oshuf .word 0, 9,18,27,36,45,54 | |
.word 7,16,25,34,43,52,61 | |
.word 14,23,32,41,50,59, 5 | |
.word 21,30,39,48,57, 3,12 | |
.word 28,37,46,55, 1,10,19 | |
.word 35,44,53,62, 8,17,26 | |
.word 42,51,60, 6,15,24,33 | |
.word 49,58, 4,13,22,31,40 | |
.word 56, 2,11,20,29,38,47 | |
; | |
; Tabla de gamma^-(i*j) * 64 (desplazamiento para multiplicar) | |
; | |
igamma .word 2048,2048,2048,2048,2048,2048,2048 | |
.word 2048,3712,2432,1664,1792,3840, 384 | |
.word 2048,2432,1792, 384,3712,1664,3840 | |
.word 2048,1664, 384,2432,3840,3712,1792 | |
.word 2048,1792,3712,3840,2432, 384,1664 | |
.word 2048,3840,1664,3712, 384,1792,2432 | |
.word 2048, 384,3840,1792,1664,2432,3712 | |
; | |
; Tabla de beta^-(i*j) * 64 (desplazamiento para multiplicar) | |
; | |
ibeta .word 2048,2048,2048,2048,2048,2048,2048,2048,2048 | |
.word 2048,3968,1408,1472,3328, 896,3520, 640,1536 | |
.word 2048,1408,3328,3520,1536,3968,1472, 896, 640 | |
.word 2048,1472,3520,2048,1472,3520,2048,1472,3520 | |
.word 2048,3328,1536,1472, 640,1408,3520,3968, 896 | |
.word 2048, 896,3968,3520,1408, 640,1472,1536,3328 | |
.word 2048,3520,1472,2048,3520,1472,2048,3520,1472 | |
.word 2048, 640, 896,1472,3968,1536,3520,3328,1408 | |
.word 2048,1536, 640,3520, 896,3328,1472,1408,3968 | |
; | |
.text | |
; | |
; Transformada de Fourier (calculo de sindromes) | |
; | |
R_S: ldi @a_inRS,AR0 ; e[] | |
; | |
ldi i*j-1,R0 | |
subi AR7,R0 ; R0 = numero de bloque = 0..i-1 | |
mpyi 63,R0 ; desplazamiento sobre AR0 | |
addi R0,AR0 | |
; | |
ldi @a_sindromes,AR1 ; s[] | |
ldi @a_mult,AR2 | |
ldi @a_tabla,AR3 | |
addi 1,AR1 ; s[1] | |
addi 1,AR3 ; alfa^1 | |
addi 62,AR0 ; e[62] | |
ldi 6,R2 | |
ldi 14,AR4 ; 15 sindromes a calcular | |
nextf: ldi 0,R0 | |
lsh3 R2,*AR3++,R1 ; R1 = alfa^i + desplazamiento para multiplicar | |
ldi 61,RC ; simbolos de entrada e[62]..e[1] | |
rptb loopf | |
xor *AR0--,R0 ; e[j] + s[i] | |
xor3 R0,R1,IR0 ; IR0 desplazamiento en tabla mult | |
loopf: ldi *+AR2(IR0),R0 ; (s[i] + e[j]) * alfa^i | |
dbud AR4,nextf ; bucle retardado | |
xor *AR0,R0 ; e[0] + s[i] | |
sti R0,*AR1++ | |
addi 62,AR0 ; e[62] | |
; | |
; Resetea las variables A y B. El resto no es necesario | |
; | |
ldi @a_A,AR0 | |
ldi @a_B,AR1 | |
ldi 32,R0 | |
sti R0,*AR0++ | |
|| sti R0,*AR1++ | |
ldi 0,R0 | |
ldi 14,RC | |
rpts RC | |
sti R0,*AR0++ | |
|| sti R0,*AR1++ | |
; | |
; Algoritmo BERLEKAMP_MASSEY | |
; | |
ldi @a_sindromes,AR0 | |
ldi @a_mult,AR2 | |
ldi @a_inverso,AR3 | |
ldi @a_A,AR1 | |
ldi @a_B,AR4 | |
ldi @a_T,AR5 | |
; | |
ldi 0,R6 ; R6=L=0 | |
ldi 6,R7 ; auxiliar para multiplicar | |
ldi 14,AR6 ; bucle de 15 iteraciones (14..0) | |
bu1: ldi 0,R0 ; R0=discrepancia=0 | |
ldi 15,R1 | |
subi AR6,R1 ; R1 contiene el valor r (1..15) | |
ldi R1,R2 | |
subi 1,R2 ; R2 contiene el valor r-1 (0..14) | |
; | |
ldi R2,RC ; bucle de r iteraciones (r-1..0) | |
addi R1,AR0 ; S[r] | |
rptb paso1 | |
lsh3 R7,*AR1++,R3 ; R3=A[j] | |
xor3 *AR0--,R3,IR0 | |
paso1: xor *+AR2(IR0),R0 | |
subi R1,AR1 ; A[0] | |
; | |
ldi R2,RC ; bucle de r iteraciones (r-1..0) | |
addi RC,AR4 | |
rptb paso2 | |
ldi *AR4++,R3 ; R3=B[i-1] | |
paso2: sti R3,*AR4--(2) ; B[i]=B[i-1] | |
ldi 0,R3 | |
sti R3,*++AR4 ; B[0]=0 | |
; | |
cmpi 0,R0 ; šdiscrepancia=0? | |
bz disc0 | |
lsh3 R7,R0,R3 | |
ldi R2,RC ; bucle de r iteraciones (r-1..0) | |
rptb paso3 | |
xor3 *AR4++,R3,IR1 ; desplazamiento en tabla de multiplicaci¢n | |
xor3 *+AR2(IR1),*AR1++,R4 ; R4=A[i]+discrepancia*B[i] | |
paso3: sti R4,*AR5++ ; T[i]=R4 | |
subi R1,AR1 ; A[0] | |
subi R1,AR4 ; B[0] | |
subi R1,AR5 ; T[0] | |
; | |
ldi R6,R3 | |
lsh 1,R3 ; R3=2*L | |
cmpi R3,R2 ; š(2*L)<r? | |
bn lower | |
subri R1,R6 ; R6=L=r-L | |
ldi R0,IR0 | |
lsh3 R7,*+AR3(IR0),R3 ; R3=inverso(discrepancia) * 64 | |
ldi R2,RC ; bucle de longitud r (r-1..0) | |
rptb paso4 | |
xor3 *AR1,R3,IR1 | |
ldi *+AR2(IR1),R4 | |
|| ldi *AR5++,R5 | |
paso4: sti R4,*AR4++ | |
|| sti R5,*AR1++ ; A[i]=T[i] | |
subi R1,AR1 ; A[0] | |
subi R1,AR4 ; B[0] | |
subi R1,AR5 ; T[0] | |
bu disc0 | |
; | |
lower: ldi R2,RC ; bucle de longitud r (r-1..0) | |
rptb paso5 | |
ldi *AR5++,R3 | |
paso5: sti R3,*AR1++ ; A[i]=T[i] | |
subi R1,AR1 ; A[0] | |
subi R1,AR5 ; T[0] | |
disc0: dbu AR6,bu1 | |
; | |
; Comprobacion grado del polinomio A(x) | |
; | |
ldi @a_A,AR0 | |
addi 8,AR0 | |
ldi 9,R7 | |
ldi 0,R0 | |
zero: cmpi3 R0,*AR0-- | |
bnz grado | |
subi 1,R7 | |
bu zero | |
grado: cmpi 9,R7 ; Si grado A(x) = 8 ==> ARQ | |
bz ARQ | |
; | |
; Extension recursiva | |
; | |
ldi @a_sindromes,AR0 | |
ldi @a_A,AR1 | |
ldi @a_mult,AR2 | |
; | |
addi 15,AR0 ; S[15] | |
addi 1,AR1 ; A[1] | |
ldi 6,R1 ; auxiliar para multiplicacion | |
ldi R7,R5 ; R7 = deg(A) + 1 | |
subi 1,R5 ; R5 = deg(A) | |
ldi 46,AR3 ; bucle de 47 iteraciones (46..0) | |
bu2: ldi 0,R0 | |
ldi R5,RC | |
rptb paso6 | |
lsh3 R1,*AR1++,R2 | |
xor3 *AR0--,R2,IR0 ; desplazamiento tabla mult | |
paso6: xor *+AR2(IR0),R0 | |
dbud AR3,bu2 ; bucle retardado | |
subi R7,AR1 | |
addi R7,AR0 | |
sti R0,*++AR0 | |
; | |
ldi 0,R0 | |
ldi AR0,AR3 | |
ldi @a_sindromes,AR3 | |
ldi R5,RC | |
rptb paso7 | |
lsh3 R1,*AR1++,R2 | |
xor3 *AR0--,R2,IR0 ; desplazamiento tabla mult | |
paso7: xor *+AR2(IR0),R0 | |
sti R0,*AR3 | |
; | |
; Transformada Inversa de Fourier + correccion de errores | |
; | |
; Input Shuffling | |
; | |
ldi @a_sindromes,AR0 | |
ldi @a_g,AR1 | |
ldi @a_ishuf,AR2 | |
ldi 62,RC | |
rptb ishuffi | |
ldi *AR2++,IR0 | |
ldi *+AR0(IR0),R0 | |
ishuffi: sti R0,*AR1++ | |
subi 63,AR1 | |
; | |
; Calculo IFFT | |
; | |
ldi @a_igamma,AR0 | |
ldi @a_mult,AR2 | |
ldi @a_F,AR3 | |
ldi 0,R0 | |
ldi 8,AR5 ; i1 | |
ldi 6,AR6 ; j2 | |
ifft1: ldi 6,RC ; i1 | |
rptb ifft2 | |
xor3 *AR1++,*AR0++,IR0 ; IR0 desplazamiento en tabla mult | |
ifft2: xor *+AR2(IR0),R0 ; R0=F[i1][j2] | |
dbud AR6,ifft1 | |
sti R0,*AR3++ ; R0=F[i1][j2] | |
subi 7,AR1 | |
ldi 0,R0 | |
dbud AR5,ifft1 ; bucle retardado | |
addi 7,AR1 | |
subi 49,AR0 ; AR0 = @a_igamma | |
ldi 6,AR6 | |
; | |
subi 63,AR3 ; AR3 = @a_F | |
ldi @a_ibeta,AR0 | |
ldi @a_G,AR1 | |
ldi 8,AR5 ; j1 | |
ldi 6,AR6 ; j2 | |
ldi 7,IR1 | |
ifft3: ldi 0,R0 | |
ldi 8,RC ; i1 | |
rptb ifft4 | |
xor3 *AR3++(IR1),*AR0++,IR0 ; IR0 desplazamiento en tabla mult | |
ifft4: xor *+AR2(IR0),R0 ; R0=G[j1][j2] | |
dbud AR6,ifft3 ; bucle retardado | |
sti R0,*AR1++ ; R0=G[j1][j2] | |
subi 9,AR0 | |
subi 62,AR3 | |
dbud AR5,ifft3 ; bucle retardado | |
subi 7,AR3 | |
addi 9,AR0 | |
ldi 6,AR6 | |
; | |
; Output Shuffling + Correccion de errores | |
; | |
subi 63,AR1 ; AR1 = @a_G | |
ldi @a_oshuf,AR2 ; Output shuffling | |
ldi @a_inRS,AR0 ; Secuencia recibida y corregida | |
; | |
ldi i*j-1,R0 | |
subi AR7,R0 ; R0 = numero de bloque = 0..i-1 | |
mpyi 63,R0 ; desplazamiento sobre AR3 | |
addi R0,AR0 | |
; | |
ldi 62,RC | |
rptb ishuffo | |
ldi *AR2++,IR0 | |
xor3 *AR1++,*+AR0(IR0),R0 | |
ishuffo: sti R0,*+AR0(IR0) | |
; | |
; Escribe en el registro de salida | |
; | |
ARQ: ldi @a_salida,AR1 | |
; | |
ldi i*j-1,R0 | |
subi AR7,R0 ; R0 = numero de bloque = 0..i-1 | |
mpyi 24,R0 ; desplazamiento sobre AR1 | |
addi R0,AR1 | |
; | |
ldi @a_inRS,AR0 ; Secuencia recibida y corregida | |
; | |
ldi i*j-1,R0 | |
subi AR7,R0 ; R0 = numero de bloque = 0..i-1 | |
mpyi 63,R0 ; desplazamiento sobre AR0 | |
addi R0,AR0 | |
addi 15,AR0 ; AR0 apunta al primer simbolo | |
; | |
ldi 6,R2 | |
ldi 23,RC | |
rptb fin | |
ldi *AR0++,R0 | |
lsh3 R2,*AR0++,R1 | |
xor R1,R0 ; R0 contiene dos simbolos | |
fin: sti R0,*AR1++ | |
; | |
rets |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment