⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cpyp.s

📁 关于DVD上的PCM的解码的代码,PCM的DSP压缩,解调的算法,用RISC32指令来写.
💻 S
📖 第 1 页 / 共 3 页
字号:
	.nolist
#include "regdef.h"
#include "cpyp.h"
#include "user.h"
#include "ac3_mac.h"
#include "globalv.h"

	.text	
	.list
	.globl	SUB_Drv_Auth
	.globl	SUB_Dec_Auth
	.globl	SUB_Key_Share
	.globl	SUB_Disc_Key
	.globl	SUB_Title_Key

;************************************************************************
; (c)1996-1997 Copyright M-Pact, Inc. All rights reserved
;
; Revision 1.0
;
;	Module: SUB_Title_Key
;
;	Initial version: KWEN 4/24/96
;
;	Calling	:     	SUB_Bus_Dec, SUB_DecDK
;	Called by:	exective
;	Return:		r26, dk_0(4 bytes, r20), dk_1(1 byte, r21)
;	Param in:     	DK(LWdisckey, 5 bytes), TK(Drv_RD, 5 bytes)
;	Temp reg:	
;	AGR  reg:	
;	Local buffer:
;************************************************************************

SUB_Title_Key:
	movw	r0,LWdisckey0		// Disc key
	movw	LBpbyte0,r0
	movb	r0,LBdisckey4
	movb	LBpbyte4,r0
Lstart_TK:	
	dlw	r0,Drv_RD		// EncTK
	dlb	r2,Drv_RD+4
//	movw	r1,LWbuskey0
//	movb	r3,LBbuskey4
//#ifndef	PLAYER
	movb	r4,LBDriver
	tsti	r4,0
	beq		skip_bus_key_load
	dlw	r1,BUS_KEY0
	dlb	r3,BUS_KEY4
	xor	r0,r1
	xor	r2,r3
skip_bus_key_load:
//#endif
	movw	LBekbyte0,r0
	movb	LBekbyte4,r2
	movi	r23, 1		; in:	LSW
	jsr	r27,SUB_DecDK		// 
	
	movw	LWtitlekey0,r20
	dsw	r20,Drv_RD
	rswi	r20,0x3c>>2
	movb	LBtitlekey4,r21
	dsb	r21,Drv_RD+4
	rswi	r21,0x38>>2
	j	r26			// return

;************************************************************************
; (c)1996-1997 Copyright M-Pact, Inc. All rights reserved
;
; Revision 1.0
;
;	Module: SUB_Disc_Key
;
;	Initial version: KWEN 4/23/96
;
;	Calling	:     	none
;	Called by:	exective
;	Return:		r26, dk_0(4 bytes, r20), dk_1(1 byte, r21)
;	Param in:     	MA(5 bytes), MB(5 bytes)
;	Temp reg:	
;	AGR  reg:	
;	Local buffer:
;************************************************************************

SUB_Disc_Key:
	movi	r7,1			// execute twice for A and B
	mupi	r0,MA2			// MKiA
	ori	r0,MA0
	movw	LBpbyte0,r0
	movi	r0,MA4
	movb	LBpbyte4,r0
Lstart_DK:	
	dlw	r0,ENC_KEYNUM		// EncDK
	dlb	r2,ENC_KEYNUM4
//#ifdef	PLAYER
	movw	LBekbyte0,r0
	movb	LBekbyte4,r2
//#else
	movb	r4,LBDriver
	tsti	r4,0
	beq		load_buskey
	jsr	r27,SUB_Bus_Dec
load_buskey:
//#endif
	movi	r23, 0		; in:	LSW
	jsr	r27,SUB_DecDK		// 1'st
	
	movw	LWdka0,r20		// put it aside for compare later
	movw	LBpbyte0,r20		// DKA
	movb	LBdka4,r21
	movb	LBpbyte4,r21
	
	dlw	r0,REF_KEYNUM		// EncDK
	dlb	r2,REF_KEYNUM4
//#ifdef	PLAYER
	movw	LBekbyte0,r0
	movb	LBekbyte4,r2
//#else
	movb	r4,LBDriver
	tsti	r4,0
	beq		skip_buskey_again
	jsr	r27,SUB_Bus_Dec
skip_buskey_again:
//#endif

	movi	r23, 0		; in:	LSW
	jsr	r27,SUB_DecDK		// 2'nd
	
	movw	r0,LWdka0
	tst	r0,r20			// check if DKA==DKA'
	bne	LcheckB
	movb	r0,LBdka4
	tst	r0,r21
	bne	LcheckB
	dsw	r20,Drv_RD
	dsb	r21,Drv_RD+4
	movw	LWdisckey0,r20
	movb	LBdisckey4,r21
	movi	r20,1
	dsb	r20,Drv_acc
	j	r26			// return
LcheckB:
	tsti	r7,0
	beq	Lfail_DK
	movi	r7,0
	mupi	r0,MB2			// MKiA
	ori	r0,MB0
	movw	LBpbyte0,r0
	movi	r0,MB4
	movb	LBpbyte4,r0
	j	Lstart_DK	
Lfail_DK:
	movi	r20,0
	dsb	r20,Drv_acc
	j	r26			// return

;************************************************************************
; (c)1996-1997 Copyright M-Pact, Inc. All rights reserved
;
; Revision 1.0
;
;	Module: SUB_Bus_Dec
;
;	Initial version: KWEN 4/23/96
;
;	Calling	:     	none
;	Called by:	exective
;	Return:		r27, LBekbyte0(4 bytes, r1), LBekbyte4(1 byte, r3)
;	Param in:     	r0(key num low, 4 bytes), r2(keynum high), buskey
;	Temp reg:	
;	AGR  reg:	
;	Local buffer:
;************************************************************************

SUB_Bus_Dec:

	movi	r6,0xff
//	movw	r1,LWbuskey0
//	movb	r3,LBbuskey4
	dlw	r1,BUS_KEY0
	dlb	r3,BUS_KEY4
	and	r5,r0,r6		// Enc[0]
	xor	r3,r5			// Enc[0]^BK[4]
	movb	LBekbyte4,r3
	xor	r1,r2			// Enc[4]^BK[0]
	shl	r6,8
	and	r5,r0,r6		// get Enc[1]
	shl	r5,16
	xor	r1,r5			// Enc[1]^BK[3]
	shl	r6,8
	and	r5,r0,r6
	xor	r1,r5			// Enc[2]^BK[2]
	shl	r6,8
	and	r5,r0,r6
	shr	r5,16
	xor	r1,r5			// Enc[3]^BK[1]	
	movw	LBekbyte0,r1

	j	r27			// return

;************************************************************************
; (c)1996-1997 Copyright M-Pact, Inc. All rights reserved
;
; Revision 1.0
;
;	
;
;	Module: SUB_DecDK
;
;	Initial version:Jinshi Huang 4/23/96
;
;	Calling	:     	none
;	Called by:	exective
;	Return:		r27, dk_0(4 bytes, r20), dk_1(1 byte, r21)
;	Param in:     	r23, LSW, edk(5 bytes), mk(5 bytes)
;	Temp reg:	
;	AGR  reg:	
;	Local buffer:
;************************************************************************

SUB_DecDK:
//------------------------------------------------------------
//input  r25(byte count), r24(LBp_byte), r22(USW), r23(LSW)
//output AGRAdr3 (LBipbyte0-4)
	movi	r22, 0		; in:	USW
	movi	r24, LBp_byte	; in:
	movi	r25, 5		; in:	 byte count
	movi	AGRAdr3, LBik_byte+4	; out: starts from last byte
	movi	AGRSiz3, 0xffff	; linear

	jsr	r28, SUB_DK_Scheduler
	

	jsr	r28, SUB_IDK_Substitutor

	j	r27

;************************************************************************
; (c)1996-1997 Copyright M-Pact, Inc. All rights reserved
;
; Revision 1.0
;
;	
;
;	Module: SUB_IDK_Substitutor
;
;	Initial version:Jinshi Huang 4/7/96
;
;	Calling	:     	none
;	Called by:	exective
;	Return:		r28, dk_1, dk_0
;	Param in:     	LBekbytes0-4, LBikbyte0-4
;	Temp reg:	
;	AGR  reg:	
;	Local buffer:
;************************************************************************
	
SUB_IDK_Substitutor:		//(BYTE *ekBYTE *ik,BYTE *z)
// input LBekbyte0-4, LBikbyte0-4
// output dk_1, dk_0
	
//---------------- read in tables----------------------------

	movi	BlockSkip, 0
	movi	BlockSize, 31		
	movi	DMASize, 31		;read 32 words

	movi	r1,  LBADec_Tab_word	 
	movi	r15, BADec_Tab
	shr	r15, 2			;to word addr 

	loop	2, read_Dec_Tab		;total = 64 words = 256 bytes
	
	mov	LocalAddr,  r1
	dmarr	r15		
	WaitDma
	
	addi	r15, 32
	addi	r1, 32
read_Dec_Tab:	

	movi	r1,  LBAInv_Tab_word	 
	movi	r15, BAInv_Tab
	shr	r15, 2			;to word addr 

	loop	2, Lread_Inv_Tab	;total = 64 words = 256 bytes
	
	mov	LocalAddr,  r1
	dmarr	r15		
	WaitDma

	addi	r15, 32
	addi	r1, 32
Lread_Inv_Tab:	


//------------------------- first stage -----------------------

	
	movi	AGRSiz0, 0xffff		//linear
	movi	AGRAdr0, LAx_byte	//5 words
	movi	r0, LBek_byte
	movi	r1, LBik_byte
		
	loop	5, stage_1_loop_a	
	movb	r2, l0 			//r2=ek[j]
	addi	r2, LBADec_Tab_byte	
	movb	r3, l1			//r3=ik[j]
	addi	r3, LBAInv_Tab_byte		
	movb	r4, l2			//r4=Dec_Tab[ek[j]]
	movb	r5, l3			//r5=Inv_Tab[ik[j]]
	xor	a0(1*4), r4, r5		//x[j]= ... 
	addi	r0, 1			//inc byte pointers
	addi	r1, 1
stage_1_loop_a:

	movi	r0, LBek_byte+4

	movi	AGRSiz1, 0xffff		//linear
	movi	AGRAdr1, LAy_byte+3*4	//5 words
	movi	AGRAdr0, LAx_byte+3*4
		
	loop	4, stage_1_loop_b	//y[3]..y[0]
	movb	r2, l0 			//r2=ek[j+1]
	mov	r3, a0(-1*4)		//x[j]
	subi	r0, 1			//dec byte pointer
	xor	a1(-1*4), r2, r3	//y[j]=x[j] ^ ek[j+1]
stage_1_loop_b:

	movi	AGRAdr1, LAy_byte+4*4
	movi	AGRAdr0, LAx_byte+4*4	
	xor	r4, r2, r3		//y[0]
	mov	r3, a0(0)		//x[4]
	xor	a1(0), r3, r4		//y[4]=x[4] ^ y[0]
	
//---------------------- 2nd stage-----------------------------

	movi	AGRAdr0, LAx_byte	//5 words
	movi	AGRAdr1, LAy_byte
	movi	r1, LBik_byte
		
	loop	5, stage_2_loop_a	
	mov	r2, a1(1*4) 		//r2=y[j]
	addi	r2, LBADec_Tab_byte	
	movb	r3, l1			//r3=ik[j]
	addi	r3, LBAInv_Tab_byte		
	movb	r4, l2			//r4=Dec_Tab[y[j]]
	movb	r5, l3			//r5=Inv_Tab[ik[j]]
	xor	a0(1*4), r4, r5		//x[j]= ... 
	addi	r1, 1			//inc byte pointers
stage_2_loop_a:
	
	movi	AGRAdr0, LAx_byte+4*4
	nop
	mov	r21, a0(-1*4)		//z[4]=x[4]
//	dsb	r21, dk_1		//to DRAM
	
	movi	AGRAdr1, LAy_byte+4*4
	movi	r20, 0
	
	loop	4, stage_2_loop_b	//z[3]..z[0]
	mov	r2, a1(-1*4) 		//r2=y[j+1]
	shl	r20, 8
	xor	r2, a0(-1*4)		//y[j]=x[j] ^ y[j+1]
	or	r20, r2
stage_2_loop_b:
	
//	dsw	r20, dk_0		//to DRAM
	
	j	r28			//return
	
;************************************************************************
; (c)1996-1997 Copyright M-Pact, Inc. All rights reserved
;
; Revision 1.0
;
;	
;
;	Module: Key_Share
;
;	Initial version:Jinshi Huang 4/17/97
;
;	Calling	:     	SUB_Auth_Scheduler, SUB_Auth_Substitutor
;	Called by:	
;	Return:		r27, Bk
;	Param in:     	CRD, acc, AuthKey
;	Temp reg:	
;	AGR  reg:	
;	Local buffer:
;************************************************************************

SUB_Key_Share:

//Key_Byte_Perm

	movb	r0, LBCRDbyte9
	movb	LBpcdbyte9, r0
	movb	r0, LBCRDbyte1
	movb	LBpcdbyte8, r0
	movb	r0, LBCRDbyte6
	movb	LBpcdbyte7, r0
	movb	r0, LBCRDbyte8
	movb	LBpcdbyte6, r0
	movb	r0, LBCRDbyte2
	movb	LBpcdbyte5, r0
	movb	r0, LBCRDbyte7
	movb	LBpcdbyte4, r0
	movb	r0, LBCRDbyte5
	movb	LBpcdbyte3, r0
	movb	r0, LBCRDbyte3
	movb	LBpcdbyte2, r0
	movb	r0, LBCRDbyte0
	movb	LBpcdbyte1, r0
	movb	r0, LBCRDbyte4
	movb	LBpcdbyte0, r0
	
//Key_Bit_Perm	

	movb	r0, LBacc
	xori	r1, r0, 0x000c	;negate bits 3, 2
	andi	r2, r0, 0x0001
	andi	r3, r0, 0x0002
	andi	r4, r1, 0x0004
	andi	r5, r1, 0x0008
	andi	r6, r0, 0x0010
	shl	r10, r2, 3
	shl	r3, 1
	shl	r4, 2
	shr	r5, 2
	shr	r6, 4
	or	r10, r3
	or	r10, r4
	or	r10, r5
	or	r10, r6
	movb	LBpaccbyte0, r10
	
// generate eak

	dlw	r0, AuthKey
	movw	r1, LBpcdbyte5	; get 7 6 5 4
	shr	r1, 8		; align as x 7 6 5
	movw	r2, LBpcdbyte8	; get 11 10 9 8
	shl	r2, 24		; align as 8 x x x
	or	r1, r2		; now 8 7 6 5
	xor	r0, r1
	movw	LBeakbyte0, r0		;eak[31:0]
	dlb	r0, AuthKey+4
	movb	r1, LBpcdbyte9
	xor	r0, r1
	movb	LBeakbyte4, r0	;eak[39:32]
	
// call main routines

	movi	r22, 1		;input: USW
	movi	r23, 1		;input: LSW
	movi	r24, LBeak_byte	;input: LBp_byte
	movi	r25, 30		;input: byte count
	movi	AGRAdr3, LBiak_byte+29	;output:	start from last byte
	jsr	r28, SUB_Auth_Scheduler

	movb	r22, LBpaccbyte0	;in:	pacc
	movi	AGRAdr4, LBk_byte	;out:	LBk_lo, _hi 
	jsr	r28, SUB_Auth_Substitutor
	dsw	r12, Drv_RD	; lo
	dsb	r11, Drv_RD+4	; hi
//	movw	LWbuskey0,r12
//	movb	LBbuskey4,r11
	dsw	r12,BUS_KEY0
	dsb	r11,BUS_KEY4
	j	r27		//return
;************************************************************************
; (c)1996-1997 Copyright M-Pact, Inc. All rights reserved
;
; Revision 1.0
;
;	
;
;	Module: Dec_Auth
;
;	Initial version:Jinshi Huang 4/14/97
;
;	Calling	:     	SUB_Auth_Scheduler, SUB_Auth_Substitutor
;	Called by:	
;	Return:		r27, RD
;	Param in:     	Drv_CD, acc, AuthKey
;	Temp reg:	
;	AGR  reg:	
;	Local buffer:
;************************************************************************

SUB_Dec_Auth:


//Dec_Byte_Perm
//share same locations with Drv_Auth
	movi	DcacheBase,MEM_SEG
	dlb	r0, Drv_CD+2
	movi	AGRSiz0, 0xffff
	movb	LBpcdbyte9, r0
	dlb	r0, Drv_CD+0
	movi	AGRSiz1, 0xffff
	movb	LBpcdbyte8, r0
	dlb	r0, Drv_CD+4
	movi	AGRSiz2, 0xffff
	movb	LBpcdbyte7, r0
	dlb	r0, Drv_CD+7
	movi	AGRSiz3, 0xffff
	movb	LBpcdbyte6, r0
	dlb	r0, Drv_CD+5
	movi	StartAddrHigh,MEM_SEG
	movb	LBpcdbyte5, r0
	dlb	r0, Drv_CD+8
	nop
	movb	LBpcdbyte4, r0
	dlb	r0, Drv_CD+3
	nop
	movb	LBpcdbyte3, r0
	dlb	r0, Drv_CD+9
	nop
	movb	LBpcdbyte2, r0
	dlb	r0, Drv_CD+1
	nop
	movb	LBpcdbyte1, r0
	dlb	r0, Drv_CD+6
	nop
	movb	LBpcdbyte0, r0
	
//Dec_Bit_Perm	

	movb	r0, LBacc
	xori	r1, r0, 0x0011	;negate bits 4, 0
	andi	r2, r1, 0x0001
	andi	r3, r0, 0x0002
	andi	r4, r0, 0x0004
	andi	r5, r0, 0x0008
	andi	r6, r1, 0x0010
	shl	r10, r2, 1
	shl	r3, 1
	shr	r4, 2
	shl	r5, 1
	shr	r6, 1
	or	r10, r3
	or	r10, r4
	or	r10, r5
	or	r10, r6
	movb	LBpaccbyte0, r10
	
// generate eak

	dlw	r0, AuthKey
	movw	r1, LBpcdbyte5	; get 7 6 5 4
	shr	r1, 8		; align as x 7 6 5
	movw	r2, LBpcdbyte8	; get 11 10 9 8
	shl	r2, 24		; align as 8 x x x
	or	r1, r2		; now 8 7 6 5
	xor	r0, r1
	movw	LBeakbyte0, r0		;eak[31:0]
	dlb	r0, AuthKey+4
	movb	r1, LBpcdbyte9
	xor	r0, r1
	movb	LBeakbyte4, r0	;eak[39:32]
	
// call main routines

	movi	r22, 1		;input: USW
	movi	r23, 1		;input: LSW
	movi	r24, LBeak_byte	;input: LBp_byte
	movi	r25, 30		;input: byte count
	movi	AGRAdr3, LBiak_byte+29	;output:	start from last byte

	jsr	r28, SUB_Auth_Scheduler
	
	movb	r22, LBpaccbyte0	;in:	pacc
	movi	AGRAdr4, LRD_byte	;out:	LRD_lo, _hi 

	jsr	r28, SUB_Auth_Substitutor

	dsw	r12, Drv_RD	; lo
	dsb	r11, Drv_RD+4	; hi

	shl	r22,r12,8		// prepare for key sharing
	movb	r23,LBCRDbyte4
	or	r22,r23
	movw	LBCRDbyte4,r22
	shr	r22,r12,24
	shl	r11,8
	or	r22,r11
	movh	LBCRDbyte8,r22
	j	r27		//return


;************************************************************************
; (c)1996-1997 Copyright M-Pact, Inc. All rights reserved
;
; Revision 1.0
;
;	
;
;	Module: Drv_Auth
;
;	Initial version:Jinshi Huang 4/14/97
;
;	Calling	:     	SUB_Auth_Scheduler, SUB_Auth_Substitutor
;	Called by:	
;	Return:		r27, Drv_acc
;	Param in:     	Drv_CD, Drv_RD, AuthKey
;	Temp reg:	
;	AGR  reg:	
;	Local buffer:
;************************************************************************

SUB_Drv_Auth:


//Drv_Byte_Perm
	movi	DcacheBase,MEM_SEG
	dlb	r0, Drv_CD+8
	movi	AGRSiz0, 0xffff
	movb	LBpcdbyte9, r0
	dlb	r0, Drv_CD+4
	movi	AGRSiz1, 0xffff
	movb	LBpcdbyte8, r0
	dlb	r0, Drv_CD+6
	movi	AGRSiz2, 0xffff
	movb	LBpcdbyte7, r0
	dlb	r0, Drv_CD+9
	movi	AGRSiz3, 0xffff
	movb	LBpcdbyte6, r0
	dlb	r0, Drv_CD+2
	movi	StartAddrHigh,MEM_SEG
	movb	LBpcdbyte5, r0
	dlb	r0, Drv_CD+5
	nop
	movb	LBpcdbyte4, r0
	dlb	r0, Drv_CD+7
	nop
	movb	LBpcdbyte3, r0
	dlb	r0, Drv_CD+0
	nop
	movb	LBpcdbyte2, r0
	dlb	r0, Drv_CD+3
	nop
	movb	LBpcdbyte1, r0
	dlb	r0, Drv_CD+1
	nop
	movb	LBpcdbyte0, r0

// generate eak

	dlw	r0, AuthKey
	movw	r1, LBpcdbyte5	; get 7 6 5 4
	shr	r1, 8		; align as x 7 6 5
	movw	r2, LBpcdbyte8	; get 11 10 9 8
	shl	r2, 24		; align as 8 x x x
	or	r1, r2		; now 8 7 6 5
	xor	r0, r1
	movw	LBeakbyte0, r0		;eak[31:0]
	dlb	r0, AuthKey+4
	movb	r1, LBpcdbyte9
	xor	r0, r1
	movb	LBeakbyte4, r0	;eak[39:32]
	
// call main routines

	movi	r22, 1		;input: USW
	movi	r23, 1		;input: LSW
	movi	r24, LBeak_byte	;input: LBp_byte
	movi	r25, 30		;input: byte count
	movi	AGRAdr3, LBiak_byte+29	;output:	start from last byte

	jsr	r28, SUB_Auth_Scheduler
	
	movi	r25, 0		; as loop counter
	dlw	r24, Drv_RD	; lo
	dlb	r23, Drv_RD+4	;  hi
	
start_Drv_Sub_loop:	

	mov	r22, r25	;in:	count as pacc
	movi	AGRAdr4, LBDrv_RD_byte	;out:	r12(LRD_lo), r11(LRD_hi) 

	jsr	r28, SUB_Auth_Substitutor
	
	tst	r12, r24	; compare lo
	bne	continue_search

	tst	r11, r23	; compare hi
	beq	acc_found

continue_search:	
	
	addi	r25, 1
	tsti	r25, 32
	blt	start_Drv_Sub_loop 
	movi	r25,0			// not found
	dsb	r25, Drv_acc
	j	r27
acc_found:
	
	movw	LBCRDbyte0,r12
	movb	LBCRDbyte4,r11
	movb	LBacc,r25
	movi	r25,1
	dsb	r25, Drv_acc
	j	r27		//return


;************************************************************************
; (c)1996-1997 Copyright M-Pact, Inc. All rights reserved
;
; Revision 1.0
;
;	
;
;	Module: SUB_DK_Scheduler
;		SUB_Auth_Scheduler
;
;	Initial version:Jinshi Huang 4/7/96
;
;	Calling	:     	none
;	Called by:	exective
;	Return:		r28, samples
;	Param in:     	r24(LBpbyte), r22(USW), r23(LSW)
;	Temp reg:	
;	AGR  reg:	
;	Local buffer:
;************************************************************************


SUB_Auth_Scheduler:
SUB_DK_Scheduler:		//(BYTE *p,BYTE *ip)

//input  r25(byte count), r24(LBp_byte), r22(USW), r23(LSW)
//output AGRAdr3 (LBipbyte0-4)

// -------------------read input --------------------------
	
//	movi	r0, LBp_byte
	mov	r0, r24
	addi	r0, 3
	nop
	movb	r10, l0		//p[3]
	addi	r0, 1
	shl	r10, 9
	movb	r9, l0		//p[4]
	or	r10, r9		//p[4] | p[3]<<9
	subi	r0, 2
	ori	r10, 0x100	// | 0x100. r10=u_lfsr
	
	movb	r11, l0		//p[2]
	andi	r12, r11, 0xf8
	shl	r12, 1		//(p[2] & 0xf8)<<1
	andi	r11, 0x7	//p[2]&0x7
	or 	r12, r11
	subi	r0, 2
	ori	r12, 0x8	// | 0x8
	movb	r11, l0		//p[0]
	addi	r0, 1
	shl	r11, 17		//p[0]<<17
	or	r12, r11
	movb	r11, l0		//p[1]
	shl	r11, 9		//p[1]<<9
	or	r12, r11	//r12=l_lfsr
	
	movi	r13, 0		//r13=diff
	
//--------------------- byte4=r21(7:0)--------------------------
	
	andi	r6, r25, 0x0003	//left over bytes from full words

	
	movi	r21, 0		//init curbyte

	loop	r6, left_over_loop
	
	loop	8, inner_loop_0	//byte 4
	
	shr	r15, r10, 16	//upper part
	shr	r16, r10, 2
	xor	r15, r16
	andi	r15, 0x01	//r15=upper out	
	shl	r10, 1		//u_lfsr<<1
	or	r10, r15	
	xor	r15, r22	//a=upper out ^ USW
		
	shr	r16, r12, 24	//lower part
	shr	r17, r12, 21
	shr	r18, r12, 20
	shr	r19, r12, 12
	xor	r16, r17

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -