📄 golay.asm
字号:
;----------------------------------------------------------------------
; Subroutine: gloay
;
; Description:
;
; Constants:
;
; Global Variables: gnHiByte, gnLoByte as input data
;
; Output: FSR+0, FSR+1, FSR+2 as output data
;
;----------------------------------------------------------------------
golay
; pDest[0] = nHiByte;
; pDest[1] = nLoByte;
; pDest[2] = nLoByte;
movf gnHiByte,W ; [1] W = gnHiByte
movwf TBUFFER+0 ; [1] pDest[0] = W
movf gnLoByte,W ; [1] W = gnLoByte
movwf TBUFFER+1 ; [1] gn2ndByte = W
movwf TBUFFER+2 ; [1] gn3rdByte = W
movlw D'12' ; [1] W = 12
movwf BitCount ; [1] BitCount = W
golay_loop
; if ( pDest[1] & 1 )
; {
; pDest[1] ^= POLY_LOW;
; pDest[0] ^= POLY_HI;
; }
btfss TBUFFER+1,0 ; [1] if ( 0 == ( gn2ndByte & 1 ) )
goto golay_no_poly ; [1] goto golay_no_poly
movlw 0x0A
xorwf TBUFFER+0,F ; pDest[0] ^= 0x0A
movlw 0xE3
xorwf TBUFFER+1,F ; gn2ndByte ^= 0xE3
golay_no_poly
; if ( pDest[0] & 1 )
; pDest[1] = 0x80 | ( pDest[1] >> 1 );
; else
; pDest[1] = 0x7F & ( pDest[1] >> 1 );
; pDest[0] = 0x7F & ( pDest[0] >> 1 );
rrf TBUFFER+0,F ; [1] pDest[0] >>= 1
rrf TBUFFER+1,F ; [1] pDest[1] >>= 1
bcf TBUFFER+0,7 ; [1] pDest[0] &= 0x80
; }
decfsz BitCount,F ; [2] BitCount--;
goto golay_loop ; [1] }
golay_loop_end
; pDest[0] <<= 4;
swapf TBUFFER+0,W ; [1] W = pDest[0] 注:已交换高低4BIT
andlw 0xF0 ; [1] W &= 0xF0 注:保留高4位,实际上是原低4位
movwf TBUFFER+0 ; [1] pDest[0] = W
; pDest[0] |= 0x0F & ( pDest[1] >> 4 );
swapf TBUFFER+1,W ; [1] W = pDest[1] 注:已交换高低4位
andlw 0x0F ; [1] W &= 0x0F 注:保留低4位,实际上是原高4位
iorwf TBUFFER+0,F ; [1] pDest[0] |= W
; pDest[1] <<= 4;
; pDest[1] |= 0x0F & nHiByte;
swapf TBUFFER+1,W ; [1] W = pDest[1] 注:已交换高低4位
andlw 0xF0 ; [1] W &= 0xF0 注:保留高4位,实际上是原低4位
iorwf gnHiByte,W ; [1] W |= gnHiByte;
movwf TBUFFER+1 ; [1] pDest[1] = W
gloay_parity
; unsigned char p;
; p = pDest[0];
; p ^= pDest[1];
; p ^= pDest[2];
movf TBUFFER+0,W ; [1] W = pDest[0];
xorwf TBUFFER+1,W ; [1] W ^= pDest[1];
xorwf TBUFFER+2,W ; [1] W ^= pDest[2];
; p = p ^ ( ( p >> 4 ) & 0x0F );
movwf TEMP ; [1] TEMP = W;
movwf TEMP2 ; [1] TEMP2 = W;
swapf TEMP2,W ; [1] W = TEMP交换高低BIT
andlw 0x0F ; [1] W &= 0x0F;
xorwf TEMP,W ; [1] W ^= TEMP;
; p = p ^ ( ( p >> 2 ) & 0x3F );
movwf TEMP ; [1] TEMP = W;
movwf TEMP2 ; [1] TEMP2 = W;
rrf TEMP2,F ; [1] TEMP2 >>= 1
rrf TEMP2,W ; [1] W = TEMP2 >> 1
andlw 0x3F ; [1] W &= 0x3F;
xorwf TEMP,W ; [1] W ^= TEMP;
; p = p ^ ( ( p >> 1 ) & 0x7F );
movwf TEMP ; [1] TEMP = W;
movwf TEMP2 ; [1] TEMP2 = W;
rrf TEMP2,W ; [1] W = TEMP2 >> 1
andlw 0x7F ; [1] W &= 0x7F;
xorwf TEMP,F ; [1] TEMP ^= W
; if ( p & 1 ) pDest[0] ^= 0x80;
movf TBUFFER+0,W ; [1] W = pDest[0]
btfsc TEMP, 0 ; [1] if ( TEMP & 1 )
xorlw 0x80 ; [1] W ^= 0x80
movwf TBUFFER+0 ; [1] pDest[0] = W;
return ; [2]
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -