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

📄 mousealgorithm.s

📁 陀螺仪程序
💻 S
📖 第 1 页 / 共 3 页
字号:
	mov [__r0],[_gyroY]
	mov [__r1],[_gyroY+1]
	mov [__r2],[_gyroY+2]
	mov [__r3],[_gyroY+3]
	mov A,2
X47:
	asr [__r0]
	rrc [__r1]
	rrc [__r2]
	rrc [__r3]
	dec A
	jnz X47
	mov A,[__r3]
	sub [_gyroY+3],A
	mov A,[__r2]
	sbb [_gyroY+2],A
	mov A,[__r1]
	sbb [_gyroY+1],A
	mov A,[__r0]
	sbb [_gyroY],A
	.dbline 299
;         gyroZ=gyroZ-(gyroZ>>2);
	mov [__r0],[_gyroZ]
	mov [__r1],[_gyroZ+1]
	mov [__r2],[_gyroZ+2]
	mov [__r3],[_gyroZ+3]
	mov A,2
X48:
	asr [__r0]
	rrc [__r1]
	rrc [__r2]
	rrc [__r3]
	dec A
	jnz X48
	mov A,[__r3]
	sub [_gyroZ+3],A
	mov A,[__r2]
	sbb [_gyroZ+2],A
	mov A,[__r1]
	sbb [_gyroZ+1],A
	mov A,[__r0]
	sbb [_gyroZ],A
	.dbline 300
; 	}
L95:
	.dbline 301
; 	if (mode==1) {
	cmp [_mode],1
	jnz L97
	.dbline 301
	.dbline 307
; 
; 		#ifdef DEBUG_INFO
; 		printf("SPEED 1\n");
; 		#endif
; 
;         gyroY=gyroY-(gyroY>>2)-(gyroY>>3);
	mov [__r0],[_gyroY]
	mov [__r1],[_gyroY+1]
	mov [__r2],[_gyroY+2]
	mov [__r3],[_gyroY+3]
	mov A,3
X49:
	asr [__r0]
	rrc [__r1]
	rrc [__r2]
	rrc [__r3]
	dec A
	jnz X49
	mov [__r4],[_gyroY]
	mov [__r5],[_gyroY+1]
	mov [__r6],[_gyroY+2]
	mov [__r7],[_gyroY+3]
	mov A,2
X50:
	asr [__r4]
	rrc [__r5]
	rrc [__r6]
	rrc [__r7]
	dec A
	jnz X50
	mov A,[_gyroY+3]
	sub A,[__r7]
	mov [__r7],A
	mov A,[_gyroY+2]
	sbb A,[__r6]
	mov [__r6],A
	mov A,[_gyroY+1]
	sbb A,[__r5]
	mov [__r5],A
	mov A,[_gyroY]
	sbb A,[__r4]
	mov [__r4],A
	mov A,[__r7]
	sub A,[__r3]
	mov [_gyroY+3],A
	mov A,[__r6]
	sbb A,[__r2]
	mov [_gyroY+2],A
	mov A,[__r5]
	sbb A,[__r1]
	mov [_gyroY+1],A
	mov A,[__r4]
	sbb A,[__r0]
	mov [_gyroY],A
	.dbline 308
;         gyroZ=gyroZ-(gyroZ>>2)-(gyroZ>>3);
	mov [__r0],[_gyroZ]
	mov [__r1],[_gyroZ+1]
	mov [__r2],[_gyroZ+2]
	mov [__r3],[_gyroZ+3]
	mov A,3
X51:
	asr [__r0]
	rrc [__r1]
	rrc [__r2]
	rrc [__r3]
	dec A
	jnz X51
	mov [__r4],[_gyroZ]
	mov [__r5],[_gyroZ+1]
	mov [__r6],[_gyroZ+2]
	mov [__r7],[_gyroZ+3]
	mov A,2
X52:
	asr [__r4]
	rrc [__r5]
	rrc [__r6]
	rrc [__r7]
	dec A
	jnz X52
	mov A,[_gyroZ+3]
	sub A,[__r7]
	mov [__r7],A
	mov A,[_gyroZ+2]
	sbb A,[__r6]
	mov [__r6],A
	mov A,[_gyroZ+1]
	sbb A,[__r5]
	mov [__r5],A
	mov A,[_gyroZ]
	sbb A,[__r4]
	mov [__r4],A
	mov A,[__r7]
	sub A,[__r3]
	mov [_gyroZ+3],A
	mov A,[__r6]
	sbb A,[__r2]
	mov [_gyroZ+2],A
	mov A,[__r5]
	sbb A,[__r1]
	mov [_gyroZ+1],A
	mov A,[__r4]
	sbb A,[__r0]
	mov [_gyroZ],A
	.dbline 309
; 	}
L97:
	.dbline 310
; 	if (mode==2) {
	cmp [_mode],2
	jnz L99
	.dbline 310
	.dbline 316
; 
; 		#ifdef DEBUG_INFO
; 		printf("SPEED 2\n");
; 		#endif
; 
;         gyroY=(gyroY>>1);
	asr [_gyroY]
	rrc [_gyroY+1]
	rrc [_gyroY+2]
	rrc [_gyroY+3]
	.dbline 317
;         gyroZ=(gyroZ>>1);
	asr [_gyroZ]
	rrc [_gyroZ+1]
	rrc [_gyroZ+2]
	rrc [_gyroZ+3]
	.dbline 318
; 	}
L99:
	.dbline 319
; 	if (mode==3) {
	cmp [_mode],3
	jnz L101
	.dbline 319
	.dbline 325
; 
; 		#ifdef DEBUG_INFO
; 		printf("SPEED 3\n");
; 		#endif
; 
;         gyroY=(gyroY>>1)-(gyroY>>3);
	mov [__r0],[_gyroY]
	mov [__r1],[_gyroY+1]
	mov [__r2],[_gyroY+2]
	mov [__r3],[_gyroY+3]
	mov A,3
X53:
	asr [__r0]
	rrc [__r1]
	rrc [__r2]
	rrc [__r3]
	dec A
	jnz X53
	mov [__r4],[_gyroY]
	mov [__r5],[_gyroY+1]
	mov [__r6],[_gyroY+2]
	mov [__r7],[_gyroY+3]
	asr [__r4]
	rrc [__r5]
	rrc [__r6]
	rrc [__r7]
	mov A,[__r7]
	sub A,[__r3]
	mov [_gyroY+3],A
	mov A,[__r6]
	sbb A,[__r2]
	mov [_gyroY+2],A
	mov A,[__r5]
	sbb A,[__r1]
	mov [_gyroY+1],A
	mov A,[__r4]
	sbb A,[__r0]
	mov [_gyroY],A
	.dbline 326
;         gyroZ=(gyroZ>>1)-(gyroZ>>3);
	mov [__r0],[_gyroZ]
	mov [__r1],[_gyroZ+1]
	mov [__r2],[_gyroZ+2]
	mov [__r3],[_gyroZ+3]
	mov A,3
X54:
	asr [__r0]
	rrc [__r1]
	rrc [__r2]
	rrc [__r3]
	dec A
	jnz X54
	mov [__r4],[_gyroZ]
	mov [__r5],[_gyroZ+1]
	mov [__r6],[_gyroZ+2]
	mov [__r7],[_gyroZ+3]
	asr [__r4]
	rrc [__r5]
	rrc [__r6]
	rrc [__r7]
	mov A,[__r7]
	sub A,[__r3]
	mov [_gyroZ+3],A
	mov A,[__r6]
	sbb A,[__r2]
	mov [_gyroZ+2],A
	mov A,[__r5]
	sbb A,[__r1]
	mov [_gyroZ+1],A
	mov A,[__r4]
	sbb A,[__r0]
	mov [_gyroZ],A
	.dbline 327
; 	}
L101:
	.dbline 328
; 	if (mode==4) {
	cmp [_mode],4
	jnz L103
	.dbline 328
	.dbline 334
; 
; 		#ifdef DEBUG_INFO
; 		printf("SPEED 4\n");
; 		#endif
; 
;         gyroY=(gyroY>>1)-(gyroY>>2);
	mov [__r0],[_gyroY]
	mov [__r1],[_gyroY+1]
	mov [__r2],[_gyroY+2]
	mov [__r3],[_gyroY+3]
	mov A,2
X55:
	asr [__r0]
	rrc [__r1]
	rrc [__r2]
	rrc [__r3]
	dec A
	jnz X55
	mov [__r4],[_gyroY]
	mov [__r5],[_gyroY+1]
	mov [__r6],[_gyroY+2]
	mov [__r7],[_gyroY+3]
	asr [__r4]
	rrc [__r5]
	rrc [__r6]
	rrc [__r7]
	mov A,[__r7]
	sub A,[__r3]
	mov [_gyroY+3],A
	mov A,[__r6]
	sbb A,[__r2]
	mov [_gyroY+2],A
	mov A,[__r5]
	sbb A,[__r1]
	mov [_gyroY+1],A
	mov A,[__r4]
	sbb A,[__r0]
	mov [_gyroY],A
	.dbline 335
;         gyroZ=(gyroZ>>1)-(gyroZ>>2);
	mov [__r0],[_gyroZ]
	mov [__r1],[_gyroZ+1]
	mov [__r2],[_gyroZ+2]
	mov [__r3],[_gyroZ+3]
	mov A,2
X56:
	asr [__r0]
	rrc [__r1]
	rrc [__r2]
	rrc [__r3]
	dec A
	jnz X56
	mov [__r4],[_gyroZ]
	mov [__r5],[_gyroZ+1]
	mov [__r6],[_gyroZ+2]
	mov [__r7],[_gyroZ+3]
	asr [__r4]
	rrc [__r5]
	rrc [__r6]
	rrc [__r7]
	mov A,[__r7]
	sub A,[__r3]
	mov [_gyroZ+3],A
	mov A,[__r6]
	sbb A,[__r2]
	mov [_gyroZ+2],A
	mov A,[__r5]
	sbb A,[__r1]
	mov [_gyroZ+1],A
	mov A,[__r4]
	sbb A,[__r0]
	mov [_gyroZ],A
	.dbline 336
; 	}
L103:
	.dbline 337
; 	if (mode==5) {
	cmp [_mode],5
	jnz L105
	.dbline 337
	.dbline 343
; 
; 		#ifdef DEBUG_INFO
; 		printf("SPEED 5\n");
; 		#endif
; 
;         gyroY=(gyroY>>2);
	mov [__r0],[_gyroY]
	mov [__r1],[_gyroY+1]
	mov [__r2],[_gyroY+2]
	mov [__r3],[_gyroY+3]
	mov A,2
X57:
	asr [__r0]
	rrc [__r1]
	rrc [__r2]
	rrc [__r3]
	dec A
	jnz X57
	mov [_gyroY],[__r0]
	mov [_gyroY+1],[__r1]
	mov [_gyroY+2],[__r2]
	mov [_gyroY+3],[__r3]
	.dbline 344
;         gyroZ=(gyroZ>>2);
	mov [__r0],[_gyroZ]
	mov [__r1],[_gyroZ+1]
	mov [__r2],[_gyroZ+2]
	mov [__r3],[_gyroZ+3]
	mov A,2
X58:
	asr [__r0]
	rrc [__r1]
	rrc [__r2]
	rrc [__r3]
	dec A
	jnz X58
	mov [_gyroZ],[__r0]
	mov [_gyroZ+1],[__r1]
	mov [_gyroZ+2],[__r2]
	mov [_gyroZ+3],[__r3]
	.dbline 345
; 	}
L105:
	.dbline 346
; 	if (mode==6) {
	cmp [_mode],6
	jnz L107
	.dbline 346
	.dbline 352
; 
; 		#ifdef DEBUG_INFO
; 		printf("SPEED 6\n");
; 		#endif
; 
;         gyroY=gyroY>>3;
	mov [__r0],[_gyroY]
	mov [__r1],[_gyroY+1]
	mov [__r2],[_gyroY+2]
	mov [__r3],[_gyroY+3]
	mov A,3
X59:
	asr [__r0]
	rrc [__r1]
	rrc [__r2]
	rrc [__r3]
	dec A
	jnz X59
	mov [_gyroY],[__r0]
	mov [_gyroY+1],[__r1]
	mov [_gyroY+2],[__r2]
	mov [_gyroY+3],[__r3]
	.dbline 353
;         gyroZ=gyroZ>>3;
	mov [__r0],[_gyroZ]
	mov [__r1],[_gyroZ+1]
	mov [__r2],[_gyroZ+2]
	mov [__r3],[_gyroZ+3]
	mov A,3
X60:
	asr [__r0]
	rrc [__r1]
	rrc [__r2]
	rrc [__r3]
	dec A
	jnz X60
	mov [_gyroZ],[__r0]
	mov [_gyroZ+1],[__r1]
	mov [_gyroZ+2],[__r2]
	mov [_gyroZ+3],[__r3]
	.dbline 354
; 	}
L107:
	.dbline 356
; 	//"STOP MODE", when gyro pointer is staying within a small area
; 	if (mode==7) {
	cmp [_mode],7
	jnz L109
	.dbline 356
	.dbline 362
; 
; 		#ifdef DEBUG_INFO
; 		printf("STOP\n");
; 		#endif
; 
; 		gyroY=gyroY>>5;
	mov [__r0],[_gyroY]
	mov [__r1],[_gyroY+1]
	mov [__r2],[_gyroY+2]
	mov [__r3],[_gyroY+3]
	mov A,5
X61:
	asr [__r0]
	rrc [__r1]
	rrc [__r2]
	rrc [__r3]
	dec A
	jnz X61
	mov [_gyroY],[__r0]
	mov [_gyroY+1],[__r1]
	mov [_gyroY+2],[__r2]
	mov [_gyroY+3],[__r3]
	.dbline 363
; 		gyroZ=gyroZ>>5;
	mov [__r0],[_gyroZ]
	mov [__r1],[_gyroZ+1]
	mov [__r2],[_gyroZ+2]
	mov [__r3],[_gyroZ+3]
	mov A,5
X62:
	asr [__r0]
	rrc [__r1]
	rrc [__r2]
	rrc [__r3]
	dec A
	jnz X62
	mov [_gyroZ],[__r0]
	mov [_gyroZ+1],[__r1]
	mov [_gyroZ+2],[__r2]
	mov [_gyroZ+3],[__r3]
	.dbline 364
; 		if (gyroY>25) {gyroY=25;}
	mov A,25
	sub A,[_gyroY+3]
	mov A,0
	sbb A,[_gyroY+2]
	mov A,0
	sbb A,[_gyroY+1]
	mov A,[_gyroY]
	xor A,-128
	mov [__rX],A
	mov A,(0 ^ 0x80)
	sbb A,[__rX]
	jnc L111
X63:
	.dbline 364
	.dbline 364
	mov [_gyroY],0
	mov [_gyroY+1],0
	mov [_gyroY+2],0
	mov [_gyroY+3],25
	.dbline 364
L111:
	.dbline 365
; 		if (gyroY<-25) {gyroY=-25;}
	mov A,[_gyroY+3]
	sub A,-25
	mov A,[_gyroY+2]
	sbb A,-1
	mov A,[_gyroY+1]
	sbb A,-1
	mov A,[_gyroY]
	xor A,-128
	sbb A,(255 ^ 0x80)
	jnc L113
X64:
	.dbline 365
	.dbline 365
	mov [_gyroY],-1
	mov [_gyroY+1],-1
	mov [_gyroY+2],-1
	mov [_gyroY+3],-25
	.dbline 365
L113:
	.dbline 366
; 		if (gyroZ>25) {gyroZ=25;}
	mov A,25
	sub A,[_gyroZ+3]
	mov A,0
	sbb A,[_gyroZ+2]
	mov A,0
	sbb A,[_gyroZ+1]
	mov A,[_gyroZ]
	xor A,-128
	mov [__rX],A
	mov A,(0 ^ 0x80)
	sbb A,[__rX]
	jnc L115
X65:
	.dbline 366
	.dbline 366
	mov [_gyroZ],0
	mov [_gyroZ+1],0
	mov [_gyroZ+2],0
	mov [_gyroZ+3],25
	.dbline 366
L115:
	.dbline 367
; 		if (gyroZ<-25) {gyroZ=-25;}
	mov A,[_gyroZ+3]
	sub A,-25
	mov A,[_gyroZ+2]
	sbb A,-1
	mov A,[_gyroZ+1]
	sbb A,-1
	mov A,[_gyroZ]
	xor A,-128
	sbb A,(255 ^ 0x80)
	jnc L117
X66:
	.dbline 367
	.dbline 367
	mov [_gyroZ],-1
	mov [_gyroZ+1],-1
	mov [_gyroZ+2],-1
	mov [_gyroZ+3],-25
	.dbline 367
L117:
	.dbline 368
; 	}
L109:
	.dbline 370
; 	//"OFF" Mode, when the gyro is on a desk, and only sensor noise is detected
; 	if (mode==8) {
	cmp [_mode],8
	jnz L119
	.dbline 370
	.dbline 376
; 
; 		#ifdef DEBUG_INFO
; 		printf("OFF\n");
; 		#endif
; 
; 		gyroY=0;	
	mov [_gyroY],0
	mov [_gyroY+1],0
	mov [_gyroY+2],0
	mov [_gyroY+3],0
	.dbline 377
; 		gyroZ=0;
	mov [_gyroZ],0
	mov [_gyroZ+1],0
	mov [_gyroZ+2],0
	mov [_gyroZ+3],0
	.dbline 378
; 	}
L119:
	.dbline 380
; 	//When button is detected, temporarily freeze the gyro data
; 	if (buttonCounter<25) {
	cmp [_buttonCounter],25
	jnc L121
X67:
	.dbline 380
	.dbline 386
; 
; 		#ifdef DEBUG_INFO
; 		printf("CLICK DETECTED\n");
; 		#endif
; 
; 		buttonCounter+=1;
	inc [_buttonCounter]
	.dbline 387
; 		gyroY = 0;
	mov [_gyroY],0
	mov [_gyroY+1],0
	mov [_gyroY+2],0
	mov [_gyroY+3],0
	.dbline 388
; 		gyroZ = 0;		
	mov [_gyroZ],0
	mov [_gyroZ+1],0
	mov [_gyroZ+2],0
	mov [_gyroZ+3],0
	.dbline 389
; 	}
L121:
	.dbline 390
; 	if ((*button!=lastButton)){
	mov A,[X-14]
	mov [__r1],A
	mvi A,[__r1]
	cmp A,[_lastButton]
	jz L123
	.dbline 390
	.dbline 391
; 		buttonCounter=0;
	mov [_buttonCounter],0
	.dbline 392
; 	}
L123:
	.dbline 393
	mov A,[X-14]
	mov [__r1],A
	mvi A,[__r1]
	mov [_lastButton],A
	.dbline 396
	mov A,[_gyroY+3]
	add [_gyroYInt+3],A
	mov A,[_gyroY+2]
	adc [_gyroYInt+2],A
	mov A,[_gyroY+1]
	adc [_gyroYInt+1],A
	mov A,[_gyroY]
	adc [_gyroYInt],A
	.dbline 397
	mov A,[_gyroZ+3]
	sub [_gyroZInt+3],A
	mov A,[_gyroZ+2]
	sbb [_gyroZInt+2],A
	mov A,[_gyroZ+1]
	sbb [_gyroZInt+1],A
	mov A,[_gyroZ]
	sbb [_gyroZInt],A
	.dbline 400
	mov [__r0],[_gyroYInt]
	mov [__r1],[_gyroYInt+1]
	mov [__r2],[_gyroYInt+2]
	mov [__r3],[_gyroYInt+3]
	mov A,10
X68:
	asr [__r0]
	rrc [__r1]
	rrc [__r2]
	rrc [__r3]
	dec A
	jnz X68
	mov [__r1],[__r3]
	mov [__r0],[__r2]
	mov A,[X-10]
	mov [__r3],A
	mov A,[__r0]
	mvi [__r3],A
	mov A,[__r1]
	mvi [__r3],A
	.dbline 401
	mov [__r0],[_gyroZInt]
	mov [__r1],[_gyroZInt+1]
	mov [__r2],[_gyroZInt+2]
	mov [__r3],[_gyroZInt+3]
	mov A,10
X69:
	asr [__r0]
	rrc [__r1]
	rrc [__r2]
	rrc [__r3]
	dec A
	jnz X69
	mov [__r1],[__r3]
	mov [__r0],[__r2]
	mov A,[X-12]
	mov [__r3],A
	mov A,[__r0]
	mvi [__r3],A
	mov A,[__r1]
	mvi [__r3],A
	.dbline 402
	mov A,[X-10]
	mov [__r1],A
	mvi A,[__r1]
	mov [__r0],A
	mvi A,[__r1]
	mov [__r3],A
	mov [__r2],[__r0]
	tst [__r2],-128
	jz X70
	mov [__r1],-1
	mov [__r0],-1
	jmp X71
X70:
	mov [__r1],0
	mov [__r0],0
X71:
	mov A,10
X72:
	asl [__r3]
	rlc [__r2]
	rlc [__r1]
	rlc [__r0]
	dec A
	jnz X72
	mov A,[__r3]
	sub [_gyroYInt+3],A
	mov A,[__r2]
	sbb [_gyroYInt+2],A
	mov A,[__r1]
	sbb [_gyroYInt+1],A
	mov A,[__r0]
	sbb [_gyroYInt],A
	.dbline 403
	mov A,[X-12]
	mov [__r1],A
	mvi A,[__r1]
	mov [__r0],A
	mvi A,[__r1]
	mov [__r3],A
	mov [__r2],[__r0]
	tst [__r2],-128
	jz X73
	mov [__r1],-1
	mov [__r0],-1
	jmp X74
X73:
	mov [__r1],0
	mov [__r0],0
X74:
	mov A,10
X75:
	asl [__r3]
	rlc [__r2]
	rlc [__r1]
	rlc [__r0]
	dec A
	jnz X75
	mov A,[__r3]
	sub [_gyroZInt+3],A
	mov A,[__r2]
	sbb [_gyroZInt+2],A
	mov A,[__r1]
	sbb [_gyroZInt+1],A
	mov A,[__r0]
	sbb [_gyroZInt],A
	.dbline 404
	cmp [_calibrated],0
	jnz L125
	.dbline 404
	.dbline 405
	mov A,[X-10]
	mov [__r1],A
	mov A,0
	mvi [__r1],A
	mvi [__r1],A
	.dbline 406
	mov A,[X-12]
	mov [__r1],A
	mov A,0
	mvi [__r1],A
	mvi [__r1],A
	.dbline 407
L125:
	.dbline -2
	.dbline 409
; 	lastButton = *button;
; 
; 	//Integrate the gyro data
; 	gyroYInt += gyroY;
; 	gyroZInt -= gyroZ;
; 
; 	//Round to the nearest pixel, and adjust the gyro integral
; 	*pixelYShift = (signed short)(gyroYInt>>10);
; 	*pixelZShift = (signed short)(gyroZInt>>10);
; 	gyroYInt-=(((signed long)*pixelYShift)<<10);
; 	gyroZInt-=(((signed long)*pixelZShift)<<10);
; 	if (calibrated==0) {
; 		*pixelYShift = 0;
; 		*pixelZShift = 0;
; 	}	
; 	
; }
L1:
	pop X
	.dbline 0 ; func end
	ret
	.dbsym l button -15 pc
	.dbsym l pixelZShift -13 pS
	.dbsym l pixelYShift -11 pS
	.dbsym l gyroZData -9 ps
	.dbsym l gyroYData -7 ps
	.dbsym l tempData -5 ps
	.dbend
	.area bss(ram, con, rel)
	.dbfile ./mousealgorithm.c
_motionTemp::
	.blkb 2
	.dbsym e motionTemp _motionTemp s

⌨️ 快捷键说明

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