Например так (+). Хотя если делать свою простенькую файловую систему, то ECC считать совершенно не обязательно.Это нужно, если работать к примеру в файловой системе для дискет SmartMedia.
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Кодер 03 марта 2005 г. 17:24
В ответ на: Ответ: отправлено Sanchello 03 марта 2005 г. 17:02

DSEG AT 20h
Ecc1: ds 1 ; Эти переменные - только в
Ecc2: ds 1 ; побитово адресуемой InRAM (20H-2FH)
Ecc3: ds 1 ; ECC
Count: ds 1 ; ECC

DSEG AT 10h
sum: ds 1 ;
paritr: ds 1 ; Эти переменные должны быть
paritc: ds 1 ; в InRAM с прямой (direct) адресацией
p8_2: ds 1 ;
p16_2: ds 1 ; переменные для вычисления ECC
p32_2: ds 1 ;
p64_2: ds 1 ;
p128_2: ds 1 ;
p256_2: ds 1 ;
p512_2: ds 1 ;
p1024_2: ds 1 ;

Rezerv1: ds 1
Rezerv2: ds 1
Rezerv3: ds 1

ISEG AT 0A0h
BUFF16: ds 16

p0c equ p8_2 ; переменные для вычисления ECC
p1c equ p16_2 ;
p2c equ p32_2 ;
p3c equ p64_2 ;
p4c equ p128_2 ;
p5c equ p256_2 ;
p6c equ p512_2 ;
p7c equ p1024_2 ;

b8_2 bit Ecc1.0
b8_1 bit Ecc1.1
b16_2 bit Ecc1.2
b16_1 bit Ecc1.3
b32_2 bit Ecc1.4
b32_1 bit Ecc1.5
b64_2 bit Ecc1.6
b64_1 bit Ecc1.7

b128_2 bit Ecc2.0
b128_1 bit Ecc2.1
b256_2 bit Ecc2.2
b256_1 bit Ecc2.3
b512_2 bit Ecc2.4
b512_1 bit Ecc2.5
b1024_2 bit Ecc2.6
b1024_1 bit Ecc2.7

b1_2 bit Ecc3.2
b1_1 bit Ecc3.3
b2_2 bit Ecc3.4
b2_1 bit Ecc3.5
b4_2 bit Ecc3.6
b4_1 bit Ecc3.7

FL1 bit Ecc3.0
FL2 bit Ecc3.1
FL3 bit Ecc3.2
FL4 bit Ecc3.3
FL5 bit Ecc3.4
FL6 bit Ecc3.5
FL7 bit Ecc3.6
FL8 bit Ecc3.7


ECC_CODE SEGMENT CODE
RSEG ECC_CODE


HAMMTABLE:

dB 0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0
dB 1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1
dB 1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1
dB 0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0

dB 1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1
dB 0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0
dB 0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0
dB 1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1

dB 1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1
dB 0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0
dB 0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0
dB 1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1

dB 0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0
dB 1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1
dB 1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1
dB 0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0


CalcECC:
;=====================================================================
; Расчет ЕСС для 256 байт. Адрес первого байта данных в XRAM
; передается в DPTR. Расчитанная ЕСС размещается в переменных
; Есс1:Ecc2:Ecc3. DPTR после выполнения содержит адрес байта
; за обсчитанными 256.
;=====================================================================

mov A,R0
push ACC
push B

clr A ;
mov R0,#Sum ; Обнуляем переменные
mov B,#11 ;
ecc_clearv: ;
mov @R0,A ;
inc R0 ;
djnz B,ecc_clearv ;

mov ecc1,A
mov ecc2,A
mov ecc3,A
mov Count,A

ecc_c1:
movx A,@DPTR
inc DPTR
xrl ParitC,A

push DPH
push DPL

mov DPTR,#HAMMTABLE

movc A,@A+DPTR
mov Paritr,A

pop DPL
pop DPH

xrl Sum,A

mov A,ParitR

jb Count.0,$+5
xrl p8_2,A
;-------------------------------------------------------------------
jb Count.1,$+5
xrl p16_2,A
;-------------------------------------------------------------------
jb Count.2,$+5
xrl p32_2,A
;-------------------------------------------------------------------
jb Count.3,$+5
xrl p64_2,A
;-------------------------------------------------------------------
jb Count.4,$+5
xrl p128_2,A
;-------------------------------------------------------------------
jb Count.5,$+5
xrl p256_2,A
;-------------------------------------------------------------------
jb Count.6,$+5
xrl p512_2,A
;-------------------------------------------------------------------
jb Count.7,$+5
xrl p1024_2,A

inc Count
mov A,Count
jz $+5
ljmp ecc_c1

;--------------------------------------------------------------------
; Раскидываем биты по своим местам
;--------------------------------------------------------------------
clr FL1
mov A,Sum
jz ecc_bites
setb FL1
ecc_bites:
mov A,p8_2
mov C,ACC.0
mov b8_2,C
jnb FL1,$+4
cpl C
mov b8_1,C


mov A,p16_2
mov C,ACC.0
mov b16_2,C
jnb FL1,$+4
cpl C
mov b16_1,C


mov A,p32_2
mov C,ACC.0
mov b32_2,C
jnb FL1,$+4
cpl C
mov b32_1,C

mov A,p64_2
mov C,ACC.0
mov b64_2,C
jnb FL1,$+4
cpl C
mov b64_1,C


mov A,p128_2
mov C,ACC.0
mov b128_2,C
jnb FL1,$+4
cpl C
mov b128_1,C


mov A,p256_2
mov C,ACC.0
mov b256_2,C
jnb FL1,$+4
cpl C
mov b256_1,C

mov A,p512_2
mov C,ACC.0
mov b512_2,C
jnb FL1,$+4
cpl C
mov b512_1,C


mov A,p1024_2
mov C,ACC.0
mov b1024_2,C
jnb FL1,$+4
cpl C
mov b1024_1,C

mov A,Ecc1
cpl A
mov Ecc1,A

mov A,Ecc2
cpl A
mov Ecc2,A
;--------------------------------------------------------------------
; Рассчет оставшихся битов
;--------------------------------------------------------------------
mov Ecc3,#00

mov A,ParitC
mov R0,#p0c
mov B,#8
ecc_bcopy:
rrc A
jc $+6
mov @R0,#0
sjmp $+4

mov @R0,#1

inc R0
djnz B,ecc_bcopy


mov A,p6c
xrl A,p4c
xrl A,p2c
xrl A,p0c
mov C,Acc.0
mov b1_2,C

mov A,p7c
xrl A,p5c
xrl A,p3c
xrl A,p1c
mov C,Acc.0
mov b1_1,C

mov A,p5c
xrl A,p4c
xrl A,p1c
xrl A,p0c
mov C,Acc.0
mov b2_2,C

mov A,p7c
xrl A,p6c
xrl A,p3c
xrl A,p2c
mov C,Acc.0
mov b2_1,C

mov A,p3c
xrl A,p2c
xrl A,p1c
xrl A,p0c
mov C,Acc.0
mov b4_2,C

mov A,p7c
xrl A,p6c
xrl A,p5c
xrl A,p4c
mov C,Acc.0
mov b4_1,C

mov A,Ecc3
cpl A
mov Ecc3,A

pop ACC
mov R0,A
pop B
RET;=============================================================>>>>>

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru