main.s

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

S
3,673
字号
; 			else
; 			{
	.dbline 580
; 				spi_transfer_8(tmp);
	ldd R16,y+13
	rcall _spi_transfer_8
	.dbline 581
; 			}
L243:
	.dbline 583
; 			
; 			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 584
; 			msg_buffer[i+2] = spi_transfer_8(0);
	clr R16
	rcall _spi_transfer_8
	ldi R24,<_msg_buffer
	ldi R25,>_msg_buffer
	movw R30,R12
	adiw R30,2
	add R30,R24
	adc R31,R25
	std z+0,R16
	.dbline 587
; 			
; 			//increment (word) address only when we have an uneven (byte) address
; 			if(i&1) address++;
	sbrs R12,0
	rjmp L244
	.dbline 587
	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
L244:
	.dbline 588
L239:
	.dbline 571
	movw R24,R12
	adiw R24,1
	movw R12,R24
L241:
	.dbline 571
	cp R12,R10
	cpc R13,R11
	brsh X22
	rjmp L238
X22:
	.dbline 590
; 		}
; 		
; 		num_bytes = block_size+3;
	movw R24,R10
	adiw R24,3
	std y+11,R25
	std y+10,R24
	.dbline 591
; 		msg_buffer[0] = CMD_READ_FLASH_ISP;
	ldi R24,20
	sts _msg_buffer,R24
	.dbline 592
; 		msg_buffer[1] = STATUS_CMD_OK;
	clr R2
	sts _msg_buffer+1,R2
	.dbline 593
; 		msg_buffer[block_size+2] = STATUS_CMD_OK;
	ldi R24,<_msg_buffer
	ldi R25,>_msg_buffer
	movw R30,R10
	adiw R30,2
	add R30,R24
	adc R31,R25
	std z+0,R2
	.dbline 594
; 	}
	rjmp L234
L233:
	.dbline 598
; 	//////////////////////////////////////
; 	//CMD_PROGRAM_EEPROM_ISP
; 	//////////////////////////////////////
; 	else if(cmd==CMD_PROGRAM_EEPROM_ISP)
	ldd R24,y+12
	cpi R24,21
	breq X23
	rjmp L247
X23:
	.dbline 599
; 	{
	.dbline 600
; 		block_size = ((unsigned int)msg_buffer[1])<<8;
	lds R10,_msg_buffer+1
	clr R11
	mov R11,R10
	clr R10
	.dbline 601
; 		block_size |= msg_buffer[2];
	lds R2,_msg_buffer+2
	clr R3
	or R10,R2
	or R11,R3
	.dbline 602
; 		mode = msg_buffer[3];
	lds R14,_msg_buffer+3
	.dbline 605
; 		
; 		//Byte Mode
; 		if((mode&1) == 0)
	sbrc R14,0
	rjmp L252
	.dbline 606
; 		{		
	.dbline 607
; 			for(i=0;i<block_size;i++)
	clr R12
	clr R13
	rjmp L257
L254:
	.dbline 608
; 			{	
	.dbline 609
; 				spi_transfer_8(msg_buffer[5]);								
	lds R16,_msg_buffer+5
	rcall _spi_transfer_8
	.dbline 610
; 				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 611
; 				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 614
; 				
; 				//Check if we can do polling
; 				if((msg_buffer[i+10]!=msg_buffer[8])&&(msg_buffer[i+10]!=msg_buffer[9]))
	ldi R24,<_msg_buffer
	ldi R25,>_msg_buffer
	movw R30,R12
	adiw R30,10
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	clr R3
	lds R4,_msg_buffer+8
	cp R2,R4
	breq L259
	lds R4,_msg_buffer+9
	cp R2,R4
	breq L259
	.dbline 615
; 				{
	.dbline 616
; 					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 617
; 				}
	rjmp L260
L259:
	.dbline 620
; 				//If not switch the mode hard waiting
; 				else
; 				{
	.dbline 621
; 					mode = (mode&(~0x0E)) | 0x02;
	mov R24,R14
	andi R24,241
	ori R24,2
	mov R14,R24
	.dbline 622
; 				}
L260:
	.dbline 626
; 				
; 				//Different polling methods
; 				//Hard waiting
; 				if((mode&0x0E) == 0x02)
	mov R24,R14
	andi R24,14
	cpi R24,2
	brne L263
	.dbline 627
; 				{
	.dbline 628
; 					wait_ms(msg_buffer[4]);
	lds R16,_msg_buffer+4
	clr R17
	rcall _wait_ms
	.dbline 629
; 				}
	rjmp L264
L263:
	.dbline 631
; 				//Data polling
; 				else if((mode&0x0E) == 0x04)
	mov R24,R14
	andi R24,14
	cpi R24,4
	brne L266
	.dbline 632
; 				{
L268:
	.dbline 633
; 					do{
	.dbline 634
; 						spi_transfer_8(msg_buffer[7]);
	lds R16,_msg_buffer+7
	rcall _spi_transfer_8
	.dbline 635
; 						spi_transfer_16(polling_address);
	movw R30,R28
	ldd R16,z+2
	ldd R17,z+3
	rcall _spi_transfer_16
	.dbline 636
; 						tmp=spi_transfer_8(0x00);
	clr R16
	rcall _spi_transfer_8
	std y+13,R16
	.dbline 637
L269:
	.dbline 637
; 					}while((tmp==msg_buffer[8])||(tmp==msg_buffer[9]));
	lds R2,_msg_buffer+8
	ldd R0,y+13
	cp R0,R2
	breq L268
	lds R2,_msg_buffer+9
	cp R0,R2
	breq L268
	.dbline 638
; 				}
	rjmp L267
L266:
	.dbline 640
; 				//RDY/BSY polling
; 				else if((mode&0x0E) == 0x08)
	mov R24,R14
	andi R24,14
	cpi R24,8
	brne L274
	.dbline 641
; 				{
L276:
	.dbline 642
L277:
	.dbline 642
; 					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 L276
	.dbline 643
; 				}
	rjmp L275
L274:
	.dbline 647
; 				//If something was not correct with the given mode do
; 				//hard waiting. Should never reach this point
; 				else
; 				{
	.dbline 648
; 					wait_ms(msg_buffer[4]);					
	lds R16,_msg_buffer+4
	clr R17
	rcall _wait_ms
	.dbline 649
; 				}
L275:
L267:
L264:
	.dbline 652
	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
	.dbline 653
L255:
	.dbline 607
	movw R24,R12
	adiw R24,1
	movw R12,R24
L257:
	.dbline 607
	cp R12,R10
	cpc R13,R11
	brsh X24
	rjmp L254
X24:
	.dbline 654
; 				
; 				//increment address
; 				address++;
; 			}			
; 		}
	rjmp L253
L252:
	.dbline 657
; 		//Page Mode
; 		else
; 		{
	.dbline 658
; 			for(i=0;i<block_size;i++)
	clr R12
	clr R13
	rjmp L283
L280:
	.dbline 659
; 			{
	.dbline 660
; 				spi_transfer_8(msg_buffer[5]);
	lds R16,_msg_buffer+5
	rcall _spi_transfer_8
	.dbline 661
; 				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 662
; 				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 665
; 				
; 				//Check if we can do polling
; 				if((msg_buffer[i+10]!=msg_buffer[8])&&(msg_buffer[i+10]!=msg_buffer[9]))
	ldi R24,<_msg_buffer
	ldi R25,>_msg_buffer
	movw R30,R12
	adiw R30,10
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	clr R3
	lds R4,_msg_buffer+8
	cp R2,R4
	breq L285
	lds R4,_msg_buffer+9
	cp R2,R4
	breq L285
	.dbline 666
; 				{
	.dbline 667
; 					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 668
; 				}
L285:
	.dbline 671
	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
	.dbline 672
L281:
	.dbline 658
	movw R24,R12
	adiw R24,1
	movw R12,R24
L283:
	.dbline 658
	cp R12,R10
	cpc R13,R11
	brsh X25
	rjmp L280
X25:
	.dbline 675
; 				
; 				//increment (word) address only when we have an uneven (byte) address
; 				address++;
; 			}
; 			
; 			//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 L289
	.dbline 676
; 			{
	.dbline 677
; 				spi_transfer_8(msg_buffer[6]);						
	lds R16,_msg_buffer+6
	rcall _spi_transfer_8
	.dbline 678
; 				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 679
; 				spi_transfer_8(0);
	clr R16
	rcall _spi_transfer_8
	.dbline 682
; 				
; 				//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 L292
	.dbline 683
; 				{
	.dbline 684
; 					mode = (mode&(~0x70)) | 0x10;
	mov R24,R14
	andi R24,143
	ori R24,16
	mov R14,R24
	.dbline 685
; 				}
L292:
	.dbline 689
; 				
; 				//Different polling methods
; 				//Hard waiting
; 				if((mode&0x70) == 0x10)
	mov R24,R14
	andi R24,112
	cpi R24,16
	brne L294
	.dbline 690
; 				{
	.dbline 691
; 					wait_ms(msg_buffer[4]);
	lds R16,_msg_buffer+4
	clr R17
	rcall _wait_ms
	.dbline 692
; 				}
	rjmp L295
L294:
	.dbline 694
; 				//Data polling
; 				else if((mode&0x70) == 0x20)
	mov R24,R14
	andi R24,112
	cpi R24,32
	brne L297
	.dbline 695
; 				{
L299:
	.dbline 696
; 					do{
	.dbline 699
; 						//If we have an uneven byte read the
; 						//high byte			
; 						if(i&1)
	sbrs R12,0
	rjmp L302
	.dbline 700
; 						{
	.dbline 701
; 							spi_transfer_8(msg_buffer[7]|(1<<3));
	lds R16,_msg_buffer+7
	ori R16,8
	rcall _spi_transfer_8
	.dbline 702
; 						}
	rjmp L303
L302:
	.dbline 704
; 						else
; 						{
	.dbline 705
; 							spi_transfer_8(msg_buffer[7]);
	lds R16,_msg_buffer+7
	rcall _spi_transfer_8
	.dbline 706
; 						}
L303:
	.dbline 707
; 						spi_transfer_16(polling_address);
	movw R30,R28
	ldd R16,z+2
	ldd R17,z+3
	rcall _spi_transfer_16
	.dbline 708
; 						tmp=spi_transfer_8(0x00);
	clr R16
	rcall _spi_transfer_8
	std y+13,R16
	.dbline 709
L300:
	.dbline 709
; 					}while(tmp==msg_buffer[8]);
	lds R2,_msg_buffer+8
	ldd R0,y+13
	cp R0,R2
	breq L299
	.dbline 710
; 				}
	rjmp L298
L297:
	.dbline 712
; 				//RDY/BSY polling
; 				else if((mode&0x70) == 0x40)
	mov R24,R14
	andi R24,112
	cpi R24,64
	brne L307
	.dbline 713
; 				{
L309:
	.dbline 714
L310:
	.dbline 714
; 					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 L309
	.dbline 715
; 				}
	rjmp L308
L307:
	.dbline 719
; 				//If something was not correct with the given mode do
; 				//hard waiting. Should never reach this point
; 				else
; 				{
	.dbline 720
; 					wait_ms(msg_buffer[4]);					
	lds R16,_msg_buffer+4
	clr R17
	rcall _wait_ms
	.dbline 721
; 				}
L308:
L298:
L295:
	.dbline 722
; 			}
L289:
	.dbline 723
; 		}
L253:
	.dbline 725
; 		
; 		num_bytes = 2;
	ldi R24,2
	ldi R25,0
	std y+11,R25
	std y+10,R24
	.dbline 726
; 		msg_buffer[0] = CMD_PROGRAM_EEPROM_ISP;
	ldi R24,21
	sts _msg_buffer,R24
	.dbline 727
; 		msg_buffer[1] = STATUS_CMD_OK;
	clr R2
	sts _msg_buffer+1,R2
	.dbline 728
; 	}
	rjmp L248
L247:
	.dbline 733
; 	
; 	//////////////////////////////////////
; 	//CMD_READ_EEPROM_ISP
; 	//////////////////////////////////////
; 	else if(cmd==CMD_READ_EEPROM_ISP)
	ldd R24,y+12
	cpi R24,22
	breq X26
	rjmp L314
X26:
	.dbline 734
; 	{
	.dbline 735
; 		block_size = ((unsigned int)msg_buffer[1])<<8;
	lds R10,_msg_buffer+1
	clr R11
	mov R11,R10
	clr R10
	.dbline 736
; 		block_size |= msg_buffer[2];
	lds R2,_msg_buffer+2
	clr R3
	or R10,R2
	or R11,R3
	.dbline 737
; 		tmp = msg_buffer[3];
	lds R2,_msg_buffer+3
	std y+13,R2
	.dbline 739
; 		
; 		for(i=0;i<block_size;i++)
	clr R12
	clr R13
	rjmp L322
L319:

⌨️ 快捷键说明

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