Skip to content

Instantly share code, notes, and snippets.

@diecrf
Created July 18, 2016 16:50
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save diecrf/284b9733c9a654f395858f0dec84dcbc to your computer and use it in GitHub Desktop.
Save diecrf/284b9733c9a654f395858f0dec84dcbc to your computer and use it in GitHub Desktop.
.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