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

📄 main.s

📁 很好的制作AVR32 ICE的资料
💻 S
📖 第 1 页 / 共 5 页
字号:
	.dbline 565
;                         }
	xjmp L222
L221:
	.dbline 567
;                       else
;                         {
	.dbline 568
;                           spi_transfer_8(msg_buffer[7]);
	lds R16,_msg_buffer+7
	xcall _spi_transfer_8
	.dbline 569
;                         }
L222:
	.dbline 570
;                       spi_transfer_16(polling_address/2);
	ldd R2,y+2
	ldd R3,y+3
	ldd R4,y+4
	ldd R5,y+5
	lsr R5
	ror R4
	ror R3
	ror R2
	movw R16,R2
	xcall _spi_transfer_16
	.dbline 571
;                       tmp=spi_transfer_8(0x00);
	clr R16
	xcall _spi_transfer_8
	mov R14,R16
	.dbline 572
;                     }
L219:
	.dbline 573
;                   while (tmp==msg_buffer[8]);
	lds R2,_msg_buffer+8
	cp R14,R2
	breq L218
X75:
	.dbline 574
;                 }
	xjmp L217
L216:
	.dbline 576
;               //RDY/BSY polling
;               else if ((mode&0x70) == 0x40)
	movw R24,R12
	cpi R24,64
	ldi R30,0
	cpc R25,R30
	brne L226
X76:
	.dbline 577
;                 {
L228:
	.dbline 578
;                   while (spi_transfer_32(0xF0000000)&1);
L229:
	.dbline 578
	ldi R16,0
	ldi R17,0
	ldi R18,0
	ldi R19,240
	xcall _spi_transfer_32
	mov R12,R16
	sbrc R16,0
	rjmp L228
X77:
	.dbline 579
;                 }
	xjmp L227
L226:
	.dbline 583
;               //If something was not correct with the given mode do
;               //hard waiting. Should never reach this point
;               else
;                 {
	.dbline 584
;                   wait_ms(msg_buffer[4]);
	lds R16,_msg_buffer+4
	clr R17
	xcall _wait_ms
	.dbline 585
;                 }
L227:
L217:
L214:
	.dbline 586
;             }
L208:
	.dbline 587
;         }
L160:
	.dbline 589
; 
;       num_bytes = 2;
	ldi R24,2
	ldi R25,0
	movw R10,R24
	.dbline 590
;       msg_buffer[0] = CMD_PROGRAM_FLASH_ISP;
	ldi R24,19
	sts _msg_buffer,R24
	.dbline 591
;       msg_buffer[1] = STATUS_CMD_OK;
	clr R2
	sts _msg_buffer+1,R2
	.dbline 592
;     }
	xjmp L155
L154:
	.dbline 596
;   //////////////////////////////////////
;   //CMD_READ_FLASH_ISP
;   //////////////////////////////////////
;   else if (cmd==CMD_READ_FLASH_ISP)
	ldd R24,y+10
	cpi R24,20
	breq X147
	xjmp L233
X147:
X78:
	.dbline 597
;     {
	.dbline 598
;       block_size = ((unsigned int)msg_buffer[1])<<8;
	lds R2,_msg_buffer+1
	clr R3
	mov R3,R2
	clr R2
	std y+13,R3
	std y+12,R2
	.dbline 599
;       block_size |= msg_buffer[2];
	lds R2,_msg_buffer+2
	clr R3
	ldd R0,y+12
	ldd R1,y+13
	or R0,R2
	or R1,R3
	std y+13,R1
	std y+12,R0
	.dbline 600
;       tmp = msg_buffer[3];
	lds R2,_msg_buffer+3
	std y+14,R2
	.dbline 602
; 
;       for (i=0;i<block_size;i++)
	clr R14
	clr R15
	xjmp L241
L238:
	.dbline 603
;         {
	.dbline 605
;           //Select Low or High-Byte
;           if (i&1)
	movw R24,R14
	andi R24,1
	andi R25,0
	movw R12,R24
	cpi R24,0
	cpc R24,R25
	breq L242
X79:
	.dbline 606
;             {
	.dbline 607
;               spi_transfer_8(tmp|(1<<3));
	ldd R16,y+14
	ori R16,8
	xcall _spi_transfer_8
	.dbline 608
;             }
	xjmp L243
L242:
	.dbline 610
;           else
;             {
	.dbline 611
;               spi_transfer_8(tmp);
	ldd R16,y+14
	xcall _spi_transfer_8
	.dbline 612
;             }
L243:
	.dbline 614
; 
;           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
	xcall _spi_transfer_16
	.dbline 615
;           msg_buffer[i+2] = spi_transfer_8(0);
	clr R16
	xcall _spi_transfer_8
	std y+17,R17
	std y+16,R16
	ldi R24,<_msg_buffer
	ldi R25,>_msg_buffer
	movw R30,R14
	adiw R30,2
	add R30,R24
	adc R31,R25
	movw R0,R16
	std z+0,R0
	.dbline 618
; 
;           //increment (word) address only when we have an uneven (byte) address
;           if (i&1) address++;
	tst R12
	brne X80
	tst R13
	breq L244
X80:
	.dbline 618
	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 619
;         }
L239:
	.dbline 602
	movw R24,R14
	adiw R24,1
	movw R14,R24
L241:
	.dbline 602
	ldd R0,y+12
	ldd R1,y+13
	cp R14,R0
	cpc R15,R1
	brsh X148
	xjmp L238
X148:
X81:
	.dbline 621
; 
;       num_bytes = block_size+3;
	movw R24,R0
	adiw R24,3
	movw R10,R24
	.dbline 622
;       msg_buffer[0] = CMD_READ_FLASH_ISP;
	ldi R24,20
	sts _msg_buffer,R24
	.dbline 623
;       msg_buffer[1] = STATUS_CMD_OK;
	clr R2
	sts _msg_buffer+1,R2
	.dbline 624
;       msg_buffer[block_size+2] = STATUS_CMD_OK;
	ldi R24,<_msg_buffer
	ldi R25,>_msg_buffer
	movw R30,R0
	adiw R30,2
	add R30,R24
	adc R31,R25
	std z+0,R2
	.dbline 625
;     }
	xjmp L234
L233:
	.dbline 629
;   //////////////////////////////////////
;   //CMD_PROGRAM_EEPROM_ISP
;   //////////////////////////////////////
;   else if (cmd==CMD_PROGRAM_EEPROM_ISP)
	ldd R24,y+10
	cpi R24,21
	breq X149
	xjmp L247
X149:
X82:
	.dbline 630
;     {
	.dbline 631
;       block_size = ((unsigned int)msg_buffer[1])<<8;
	lds R2,_msg_buffer+1
	clr R3
	mov R3,R2
	clr R2
	std y+13,R3
	std y+12,R2
	.dbline 632
;       block_size |= msg_buffer[2];
	lds R2,_msg_buffer+2
	clr R3
	ldd R0,y+12
	ldd R1,y+13
	or R0,R2
	or R1,R3
	std y+13,R1
	std y+12,R0
	.dbline 633
;       mode = msg_buffer[3];
	lds R2,_msg_buffer+3
	std y+14,R2
	.dbline 636
; 
;       //Byte Mode
;       if ((mode&1) == 0)
	mov R0,R2
	sbrc R2,0
	rjmp L252
X83:
	.dbline 637
;         {
	.dbline 638
;           for (i=0;i<block_size;i++)
	clr R14
	clr R15
	xjmp L257
L254:
	.dbline 639
;             {
	.dbline 640
;               spi_transfer_8(msg_buffer[5]);
	lds R16,_msg_buffer+5
	xcall _spi_transfer_8
	.dbline 641
;               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
	xcall _spi_transfer_16
	.dbline 642
;               spi_transfer_8(msg_buffer[i+10]);
	movw R24,R14
	adiw R24,10
	movw R12,R24
	ldi R24,<_msg_buffer
	ldi R25,>_msg_buffer
	movw R30,R12
	add R30,R24
	adc R31,R25
	ldd R16,z+0
	xcall _spi_transfer_8
	.dbline 645
; 
;               //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
	add R30,R24
	adc R31,R25
	ldd R12,z+0
	lds R2,_msg_buffer+8
	cp R12,R2
	breq L259
X84:
	lds R2,_msg_buffer+9
	cp R12,R2
	breq L259
X85:
	.dbline 646
;                 {
	.dbline 647
;                   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
	std y+2,R2
	std y+3,R3
	std y+4,R4
	std y+5,R5
	.dbline 648
;                 }
	xjmp L260
L259:
	.dbline 651
;               //If not switch the mode hard waiting
;               else
;                 {
	.dbline 652
;                   mode = (mode&(~0x0E)) | 0x02;
	ldd R24,y+14
	andi R24,241
	ori R24,2
	std y+14,R24
	.dbline 653
;                 }
L260:
	.dbline 657
; 
;               //Different polling methods
;               //Hard waiting
;               if ((mode&0x0E) == 0x02)
	ldd R24,y+14
	clr R25
	andi R24,14
	andi R25,0
	std y+17,R25
	std y+16,R24
	cpi R24,2
	ldi R30,0
	cpc R25,R30
	brne L263
X86:
	.dbline 658
;                 {
	.dbline 659
;                   wait_ms(msg_buffer[4]);
	lds R16,_msg_buffer+4
	clr R17
	xcall _wait_ms
	.dbline 660
;                 }
	xjmp L264
L263:
	.dbline 662
;               //Data polling
;               else if ((mode&0x0E) == 0x04)
	ldd R24,y+16
	ldd R25,y+17
	cpi R24,4
	ldi R30,0
	cpc R25,R30
	brne L266
X87:
	.dbline 663
;                 {
L268:
	.dbline 665
;                   do
;                     {
	.dbline 666
;                       spi_transfer_8(msg_buffer[7]);
	lds R16,_msg_buffer+7
	xcall _spi_transfer_8
	.dbline 667
;                       spi_transfer_16(polling_address);
	ldd R16,y+2
	ldd R17,y+3
	xcall _spi_transfer_16
	.dbline 668
;                       tmp=spi_transfer_8(0x00);
	clr R16
	xcall _spi_transfer_8
	mov R12,R16
	std y+18,R12
	.dbline 669
;                     }
L269:
	.dbline 670
;                   while ((tmp==msg_buffer[8])||(tmp==msg_buffer[9]));
	lds R2,_msg_buffer+8
	ldd R0,y+18
	cp R0,R2
	breq L268
X88:
	lds R2,_msg_buffer+9
	cp R0,R2
	breq L268
X89:
	.dbline 671
;                 }
	xjmp L267
L266:
	.dbline 673
;               //RDY/BSY polling
;               else if ((mode&0x0E) == 0x08)
	ldd R24,y+16
	ldd R25,y+17
	cpi R24,8
	ldi R30,0
	cpc R25,R30
	brne L274
X90:
	.dbline 674
;                 {
L276:
	.dbline 675
;                   while (spi_transfer_32(0xF0000000)&1);
L277:
	.dbline 675
	ldi R16,0
	ldi R17,0
	ldi R18,0
	ldi R19,240
	xcall _spi_transfer_32
	std y+17,R17
	std y+16,R16
	movw R0,R16
	sbrc R16,0
	rjmp L276
X91:
	.dbline 676
;                 }
	xjmp L275
L274:
	.dbline 680
;               //If something was not correct with the given mode do
;               //hard waiting. Should never reach this point
;               else
;                 {
	.dbline 681
;                   wait_ms(msg_buffer[4]);
	lds R16,_msg_buffer+4
	clr R17
	xcall _wait_ms
	.dbline 682
;                 }
L275:
L267:
L264:
	.dbline 685
; 
;               //increment address
;               address++;
	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 686
;             }
L255:
	.dbline 638
	movw R24,R14
	adiw R24,1
	movw R14,R24
L257:
	.dbline 638
	ldd R0,y+12
	ldd R1,y+13
	cp R14,R0
	cpc R15,R1
	brsh X150
	xjmp L254
X150:
X92:
	.dbline 687
;         }
	xjmp L253
L252:
	.dbline 690
;       //Page Mode
;       else
;         {
	.dbline 691
;           for (i=0;i<block_size;i++)
	clr R14
	clr R15
	xjmp L283
L280:
	.dbline 692
;             {
	.dbline 693
;               spi_transfer_8(msg_buffer[5]);
	lds R16,_msg_buffer+5
	xcall _spi_transfer_8
	.dbline 694
;               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
	xcall _spi_transfer_16
	.dbline 695
;               spi_transfer_8(msg_buffer[i+10]);
	movw R24,R14
	adiw R24,10
	std y+17,R25
	std y+16,R24
	ldi R24,<_msg_buffer
	ldi R25,>_msg_buffer
	ldd R30,y+16
	ldd R31,y+17
	add R30,R24
	adc R31,R25
	ldd R16,z+0
	xcall _spi_transfer_8
	.dbline 698
; 
;               //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
	ldd R30,y+16
	ldd R31,y+17
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	std y+17,R3
	std y+16,R2
	lds R2,_msg_buffer+8
	ldd R0,y+16
	ldd R1,y+17
	cp R0,R2
	breq L285
X93:
	lds R2,_msg_buffer+9
	cp R0,R2
	breq L285
X94:
	.dbline 699
;                 {
	.dbline 700
;                   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
	std y+2,R2
	std y+3,R3
	std y+4,R4
	std y+5,R5
	.dbline 701
;                 }
L285:
	.dbline 704
; 
;               //increment (word) address only when we have an uneven (byte) address
;               address++;
	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 705
;             }
L281:
	.dbline 691
	movw R24,R14

⌨️ 快捷键说明

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