main.s

来自「文档里面的代码是可以正常使用的」· S 代码 · 共 3,673 行 · 第 1/5 页

S
3,673
字号
	ori R16,8
	rcall _spi_transfer_8
	.dbline 414
; 				}
	rjmp L166
L165:
	.dbline 416
; 				else
; 				{
	.dbline 417
; 					spi_transfer_8(msg_buffer[5]);
	lds R16,_msg_buffer+5
	rcall _spi_transfer_8
	.dbline 418
; 				}
L166:
	.dbline 420
; 				
; 				spi_transfer_16(address&0xFFFF);
	ldi R20,255
	ldi R21,255
	ldi R22,0
	ldi R23,0
	lds R4,_address+2
	lds R5,_address+2+1
	lds R2,_address
	lds R3,_address+1
	and R2,R20
	and R3,R21
	and R4,R22
	and R5,R23
	movw R16,R2
	rcall _spi_transfer_16
	.dbline 421
; 				spi_transfer_8(msg_buffer[i+10]);
	ldi R24,<_msg_buffer
	ldi R25,>_msg_buffer
	movw R30,R12
	adiw R30,10
	add R30,R24
	adc R31,R25
	ldd R16,z+0
	rcall _spi_transfer_8
	.dbline 424
; 				
; 				//Check if we can do polling
; 				if(msg_buffer[8]!=msg_buffer[i+10])
	ldi R24,<_msg_buffer
	ldi R25,>_msg_buffer
	movw R30,R12
	adiw R30,10
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	lds R3,_msg_buffer+8
	cp R3,R2
	breq L169
	.dbline 425
; 				{
	.dbline 426
; 					polling_address = address&0xFFFF;
	ldi R20,255
	ldi R21,255
	ldi R22,0
	ldi R23,0
	lds R4,_address+2
	lds R5,_address+2+1
	lds R2,_address
	lds R3,_address+1
	and R2,R20
	and R3,R21
	and R4,R22
	and R5,R23
	movw R30,R28
	std z+2,R2
	std z+3,R3
	std z+4,R4
	std z+5,R5
	.dbline 427
; 				}
	rjmp L170
L169:
	.dbline 430
; 				//If not switch the mode hard waiting
; 				else
; 				{
	.dbline 431
; 					mode = (mode&(~0x0E)) | 0x02;
	mov R24,R14
	andi R24,241
	ori R24,2
	mov R14,R24
	.dbline 432
; 				}
L170:
	.dbline 436
; 				
; 				//Different polling methods
; 				//Hard waiting
; 				if((mode&0x0E) == 0x02)
	mov R24,R14
	andi R24,14
	cpi R24,2
	brne L172
	.dbline 437
; 				{
	.dbline 438
; 					wait_ms(msg_buffer[4]);
	lds R16,_msg_buffer+4
	clr R17
	rcall _wait_ms
	.dbline 439
; 				}
	rjmp L173
L172:
	.dbline 441
; 				//Data polling
; 				else if((mode&0x0E) == 0x04)
	mov R24,R14
	andi R24,14
	cpi R24,4
	brne L175
	.dbline 442
; 				{
L177:
	.dbline 443
; 					do{
	.dbline 446
; 						//If we have an uneven byte read the
; 						//high byte			
; 						if(i&1)
	sbrs R12,0
	rjmp L180
	.dbline 447
; 						{
	.dbline 448
; 							spi_transfer_8(msg_buffer[7]|(1<<3));
	lds R16,_msg_buffer+7
	ori R16,8
	rcall _spi_transfer_8
	.dbline 449
; 						}
	rjmp L181
L180:
	.dbline 451
; 						else
; 						{
	.dbline 452
; 							spi_transfer_8(msg_buffer[7]);
	lds R16,_msg_buffer+7
	rcall _spi_transfer_8
	.dbline 453
; 						}
L181:
	.dbline 454
; 						spi_transfer_16(polling_address);
	movw R30,R28
	ldd R16,z+2
	ldd R17,z+3
	rcall _spi_transfer_16
	.dbline 455
; 						tmp=spi_transfer_8(0x00);
	clr R16
	rcall _spi_transfer_8
	std y+13,R16
	.dbline 456
L178:
	.dbline 456
; 					}while(tmp==msg_buffer[8]);
	lds R2,_msg_buffer+8
	ldd R0,y+13
	cp R0,R2
	breq L177
	.dbline 457
; 				}
	rjmp L176
L175:
	.dbline 459
; 				//RDY/BSY polling
; 				else if((mode&0x0E) == 0x08)
	mov R24,R14
	andi R24,14
	cpi R24,8
	brne L185
	.dbline 460
; 				{
L187:
	.dbline 461
L188:
	.dbline 461
; 					while(spi_transfer_32(0xF0000000)&1);
	ldi R16,0
	ldi R17,0
	ldi R18,0
	ldi R19,240
	rcall _spi_transfer_32
	sbrc R16,0
	rjmp L187
	.dbline 462
; 				}
	rjmp L186
L185:
	.dbline 466
; 				//If something was not correct with the given mode do
; 				//hard waiting. Should never reach this point
; 				else
; 				{
	.dbline 467
; 					wait_ms(msg_buffer[4]);					
	lds R16,_msg_buffer+4
	clr R17
	rcall _wait_ms
	.dbline 468
; 				}
L186:
L176:
L173:
	.dbline 471
; 				
; 				//increment (word) address only when we have an uneven (byte) address
; 				if(i&1) address++;
	sbrs R12,0
	rjmp L191
	.dbline 471
	ldi R20,1
	ldi R21,0
	ldi R22,0
	ldi R23,0
	lds R4,_address+2
	lds R5,_address+2+1
	lds R2,_address
	lds R3,_address+1
	add R2,R20
	adc R3,R21
	adc R4,R22
	adc R5,R23
	sts _address+1,R3
	sts _address,R2
	sts _address+2+1,R5
	sts _address+2,R4
L191:
	.dbline 472
L162:
	.dbline 407
	movw R24,R12
	adiw R24,1
	movw R12,R24
L164:
	.dbline 407
	cp R12,R10
	cpc R13,R11
	brsh X16
	rjmp L161
X16:
	.dbline 473
; 			}			
; 		}
	rjmp L160
L159:
	.dbline 476
; 		//Page Mode
; 		else
; 		{
	.dbline 477
; 			for(i=0;i<block_size;i++)
	clr R12
	clr R13
	rjmp L196
L193:
	.dbline 478
; 			{
	.dbline 481
; 				//If we have an uneven byte programm the
; 				//high byte			
; 				if(i&1)
	sbrs R12,0
	rjmp L197
	.dbline 482
; 				{
	.dbline 483
; 					spi_transfer_8(msg_buffer[5]|(1<<3));
	lds R16,_msg_buffer+5
	ori R16,8
	rcall _spi_transfer_8
	.dbline 484
; 				}
	rjmp L198
L197:
	.dbline 486
; 				else
; 				{
	.dbline 487
; 					spi_transfer_8(msg_buffer[5]);
	lds R16,_msg_buffer+5
	rcall _spi_transfer_8
	.dbline 488
; 				}
L198:
	.dbline 490
; 				
; 				spi_transfer_16(address&0xFFFF);
	ldi R20,255
	ldi R21,255
	ldi R22,0
	ldi R23,0
	lds R4,_address+2
	lds R5,_address+2+1
	lds R2,_address
	lds R3,_address+1
	and R2,R20
	and R3,R21
	and R4,R22
	and R5,R23
	movw R16,R2
	rcall _spi_transfer_16
	.dbline 491
; 				spi_transfer_8(msg_buffer[i+10]);
	ldi R24,<_msg_buffer
	ldi R25,>_msg_buffer
	movw R30,R12
	adiw R30,10
	add R30,R24
	adc R31,R25
	ldd R16,z+0
	rcall _spi_transfer_8
	.dbline 494
; 				
; 				//Check if we can do polling
; 				if(msg_buffer[8]!=msg_buffer[i+10])
	ldi R24,<_msg_buffer
	ldi R25,>_msg_buffer
	movw R30,R12
	adiw R30,10
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	lds R3,_msg_buffer+8
	cp R3,R2
	brne X17
	rjmp L201
X17:
	.dbline 495
; 				{
	.dbline 499
; 					//We have to check if we have an uneven byte. 
; 					//Set the polling address to a byte address
; 					//so that we can poll the right location
; 					polling_address = (address&0xFFFF)*2;
	ldi R20,255
	ldi R21,255
	ldi R22,0
	ldi R23,0
	lds R4,_address+2
	lds R5,_address+2+1
	lds R2,_address
	lds R3,_address+1
	and R2,R20
	and R3,R21
	and R4,R22
	and R5,R23
	ldi R20,2
	ldi R21,0
	ldi R22,0
	ldi R23,0
	st -y,R5
	st -y,R4
	st -y,R3
	st -y,R2
	movw R16,R20
	movw R18,R22
	rcall empy32u
	movw R30,R28
	std z+2,R16
	std z+3,R17
	std z+4,R18
	std z+5,R19
	.dbline 500
; 					if(i&1) polling_address++;
	sbrs R12,0
	rjmp L204
	.dbline 500
	ldi R20,1
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	ldd R2,z+2
	ldd R3,z+3
	ldd R4,z+4
	ldd R5,z+5
	add R2,R20
	adc R3,R21
	adc R4,R22
	adc R5,R23
	movw R30,R28
	std z+2,R2
	std z+3,R3
	std z+4,R4
	std z+5,R5
L204:
	.dbline 501
; 				}
L201:
	.dbline 504
; 				
; 				//increment (word) address only when we have an uneven (byte) address
; 				if(i&1) address++;
	sbrs R12,0
	rjmp L206
	.dbline 504
	ldi R20,1
	ldi R21,0
	ldi R22,0
	ldi R23,0
	lds R4,_address+2
	lds R5,_address+2+1
	lds R2,_address
	lds R3,_address+1
	add R2,R20
	adc R3,R21
	adc R4,R22
	adc R5,R23
	sts _address+1,R3
	sts _address,R2
	sts _address+2+1,R5
	sts _address+2,R4
L206:
	.dbline 505
L194:
	.dbline 477
	movw R24,R12
	adiw R24,1
	movw R12,R24
L196:
	.dbline 477
	cp R12,R10
	cpc R13,R11
	brsh X18
	rjmp L193
X18:
	.dbline 508
; 			}
; 			
; 			//If this page is complete the bit 7 of mode will be set and we programm the page
; 			if(mode&0x80)
	sbrs R14,7
	rjmp L208
	.dbline 509
; 			{
	.dbline 510
; 				spi_transfer_8(msg_buffer[6]);								
	lds R16,_msg_buffer+6
	rcall _spi_transfer_8
	.dbline 511
; 				spi_transfer_16(start_address&0xFFFF);
	ldi R20,255
	ldi R21,255
	ldi R22,0
	ldi R23,0
	movw R30,R28
	ldd R2,z+6
	ldd R3,z+7
	ldd R4,z+8
	ldd R5,z+9
	and R2,R20
	and R3,R21
	and R4,R22
	and R5,R23
	movw R16,R2
	rcall _spi_transfer_16
	.dbline 512
; 				spi_transfer_8(0);
	clr R16
	rcall _spi_transfer_8
	.dbline 515
; 				
; 				//If we have no valid polling address switch to simple wait mode
; 				if(polling_address==0)
	ldi R20,0
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	ldd R2,z+2
	ldd R3,z+3
	ldd R4,z+4
	ldd R5,z+5
	cp R2,R20
	cpc R3,R21
	cpc R4,R22
	cpc R5,R23
	brne L211
	.dbline 516
; 				{
	.dbline 517
; 					mode = (mode&(~0x70)) | 0x10;
	mov R24,R14
	andi R24,143
	ori R24,16
	mov R14,R24
	.dbline 518
; 				}
L211:
	.dbline 522
; 				
; 				//Different polling methods
; 				//Hard waiting
; 				if((mode&0x70) == 0x10)
	mov R24,R14
	andi R24,112
	cpi R24,16
	brne L213
	.dbline 523
; 				{
	.dbline 524
; 					wait_ms(msg_buffer[4]);
	lds R16,_msg_buffer+4
	clr R17
	rcall _wait_ms
	.dbline 525
; 				}
	rjmp L214
L213:
	.dbline 527
; 				//Data polling
; 				else if((mode&0x70) == 0x20)
	mov R24,R14
	andi R24,112
	cpi R24,32
	breq X19
	rjmp L216
X19:
	.dbline 528
; 				{
L218:
	.dbline 529
; 					do{
	.dbline 532
; 						//If we have an uneven byte read the
; 						//high byte			
; 						if(polling_address%2)
	ldi R20,1
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	ldd R2,z+2
	ldd R3,z+3
	ldd R4,z+4
	ldd R5,z+5
	and R2,R20
	and R3,R21
	and R4,R22
	and R5,R23
	ldi R20,0
	ldi R21,0
	ldi R22,0
	ldi R23,0
	cp R2,R20
	cpc R3,R21
	cpc R4,R22
	cpc R5,R23
	breq L221
	.dbline 533
; 						{
	.dbline 534
; 							spi_transfer_8(msg_buffer[7]|(1<<3));
	lds R16,_msg_buffer+7
	ori R16,8
	rcall _spi_transfer_8
	.dbline 535
; 						}
	rjmp L222
L221:
	.dbline 537
; 						else
; 						{
	.dbline 538
; 							spi_transfer_8(msg_buffer[7]);
	lds R16,_msg_buffer+7
	rcall _spi_transfer_8
	.dbline 539
; 						}
L222:
	.dbline 540
; 						spi_transfer_16(polling_address/2);
	movw R30,R28
	ldd R2,z+2
	ldd R3,z+3
	ldd R4,z+4
	ldd R5,z+5
	lsr R5
	ror R4
	ror R3
	ror R2
	movw R16,R2
	rcall _spi_transfer_16
	.dbline 541
; 						tmp=spi_transfer_8(0x00);
	clr R16
	rcall _spi_transfer_8
	std y+13,R16
	.dbline 542
L219:
	.dbline 542
; 					}while(tmp==msg_buffer[8]);
	lds R2,_msg_buffer+8
	ldd R0,y+13
	cp R0,R2
	brne X20
	rjmp L218
X20:
	.dbline 543
; 				}
	rjmp L217
L216:
	.dbline 545
; 				//RDY/BSY polling
; 				else if((mode&0x70) == 0x40)
	mov R24,R14
	andi R24,112
	cpi R24,64
	brne L226
	.dbline 546
; 				{
L228:
	.dbline 547
L229:
	.dbline 547
; 					while(spi_transfer_32(0xF0000000)&1);
	ldi R16,0
	ldi R17,0
	ldi R18,0
	ldi R19,240
	rcall _spi_transfer_32
	sbrc R16,0
	rjmp L228
	.dbline 548
; 				}
	rjmp L227
L226:
	.dbline 552
; 				//If something was not correct with the given mode do
; 				//hard waiting. Should never reach this point
; 				else
; 				{
	.dbline 553
; 					wait_ms(msg_buffer[4]);					
	lds R16,_msg_buffer+4
	clr R17
	rcall _wait_ms
	.dbline 554
; 				}
L227:
L217:
L214:
	.dbline 555
; 			}
L208:
	.dbline 556
; 		}
L160:
	.dbline 558
; 		
; 		num_bytes = 2;
	ldi R24,2
	ldi R25,0
	std y+11,R25
	std y+10,R24
	.dbline 559
; 		msg_buffer[0] = CMD_PROGRAM_FLASH_ISP;
	ldi R24,19
	sts _msg_buffer,R24
	.dbline 560
; 		msg_buffer[1] = STATUS_CMD_OK;
	clr R2
	sts _msg_buffer+1,R2
	.dbline 561
; 	}
	rjmp L155
L154:
	.dbline 565
; 	//////////////////////////////////////
; 	//CMD_READ_FLASH_ISP
; 	//////////////////////////////////////
; 	else if(cmd==CMD_READ_FLASH_ISP)
	ldd R24,y+12
	cpi R24,20
	breq X21
	rjmp L233
X21:
	.dbline 566
; 	{
	.dbline 567
; 		block_size = ((unsigned int)msg_buffer[1])<<8;
	lds R10,_msg_buffer+1
	clr R11
	mov R11,R10
	clr R10
	.dbline 568
; 		block_size |= msg_buffer[2];
	lds R2,_msg_buffer+2
	clr R3
	or R10,R2
	or R11,R3
	.dbline 569
; 		tmp = msg_buffer[3];
	lds R2,_msg_buffer+3
	std y+13,R2
	.dbline 571
; 		
; 		for(i=0;i<block_size;i++)
	clr R12
	clr R13
	rjmp L241
L238:
	.dbline 572
; 		{
	.dbline 574
; 			//Select Low or High-Byte
; 			if(i&1)
	sbrs R12,0
	rjmp L242
	.dbline 575
; 			{
	.dbline 576
; 				spi_transfer_8(tmp|(1<<3));
	ldd R16,y+13
	ori R16,8
	rcall _spi_transfer_8
	.dbline 577
; 			}
	rjmp L243
L242:
	.dbline 579

⌨️ 快捷键说明

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