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

📄 main.s

📁 很好的制作AVR32 ICE的资料
💻 S
📖 第 1 页 / 共 5 页
字号:
	ldi R17,0
	ldi R18,0
	ldi R19,240
	xcall _spi_transfer_32
	mov R12,R16
	sbrc R16,0
	rjmp L150
X52:
	.dbline 416
;         }
L147:
	.dbline 418
; 
;       num_bytes = 2;
	ldi R24,2
	ldi R25,0
	movw R10,R24
	.dbline 419
;       msg_buffer[0] = CMD_CHIP_ERASE_ISP;
	ldi R24,18
	sts _msg_buffer,R24
	.dbline 420
;       msg_buffer[1] = STATUS_CMD_OK;
	clr R2
	sts _msg_buffer+1,R2
	.dbline 421
;     }
	xjmp L141
L140:
	.dbline 425
;   //////////////////////////////////////
;   //CMD_PROGRAM_FLASH_ISP
;   //////////////////////////////////////
;   else if (cmd==CMD_PROGRAM_FLASH_ISP)
	ldd R24,y+10
	cpi R24,19
	breq X143
	xjmp L154
X143:
X53:
	.dbline 426
;     {
	.dbline 427
;       block_size = ((unsigned int)msg_buffer[1])<<8;
	lds R2,_msg_buffer+1
	clr R3
	mov R3,R2
	clr R2
	std y+15,R3
	std y+14,R2
	.dbline 428
;       block_size |= msg_buffer[2];
	lds R2,_msg_buffer+2
	clr R3
	ldd R0,y+14
	ldd R1,y+15
	or R0,R2
	or R1,R3
	std y+15,R1
	std y+14,R0
	.dbline 429
;       mode = msg_buffer[3];
	lds R2,_msg_buffer+3
	std y+12,R2
	.dbline 432
; 
;       //Word Mode
;       if ((mode&1) == 0)
	mov R0,R2
	sbrc R2,0
	rjmp L159
X54:
	.dbline 433
;         {
	.dbline 434
;           for (i=0;i<block_size;i++)
	clr R14
	clr R15
	xjmp L164
L161:
	.dbline 435
;             {
	.dbline 438
;               //If we have an uneven byte programm the
;               //high byte
;               if (i&1)
	movw R24,R14
	andi R24,1
	andi R25,0
	movw R12,R24
	cpi R24,0
	cpc R24,R25
	breq L165
X55:
	.dbline 439
;                 {
	.dbline 440
;                   spi_transfer_8(msg_buffer[5]|(1<<3));
	lds R16,_msg_buffer+5
	ori R16,8
	xcall _spi_transfer_8
	.dbline 441
;                 }
	xjmp L166
L165:
	.dbline 443
;               else
;                 {
	.dbline 444
;                   spi_transfer_8(msg_buffer[5]);
	lds R16,_msg_buffer+5
	xcall _spi_transfer_8
	.dbline 445
;                 }
L166:
	.dbline 447
; 
;               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 448
;               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 451
; 
;               //Check if we can do polling
;               if (msg_buffer[8]!=msg_buffer[i+10])
	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
	lds R3,_msg_buffer+8
	cp R3,R2
	breq L169
X56:
	.dbline 452
;                 {
	.dbline 453
;                   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 454
;                 }
	xjmp L170
L169:
	.dbline 457
;               //If not switch the mode hard waiting
;               else
;                 {
	.dbline 458
;                   mode = (mode&(~0x0E)) | 0x02;
	ldd R24,y+12
	andi R24,241
	ori R24,2
	std y+12,R24
	.dbline 459
;                 }
L170:
	.dbline 463
; 
;               //Different polling methods
;               //Hard waiting
;               if ((mode&0x0E) == 0x02)
	ldd R24,y+12
	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 L172
X57:
	.dbline 464
;                 {
	.dbline 465
;                   wait_ms(msg_buffer[4]);
	lds R16,_msg_buffer+4
	clr R17
	xcall _wait_ms
	.dbline 466
;                 }
	xjmp L173
L172:
	.dbline 468
;               //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 L175
X58:
	.dbline 469
;                 {
L177:
	.dbline 471
;                   do
;                     {
	.dbline 474
;                       //If we have an uneven byte read the
;                       //high byte
;                       if (i&1)
	tst R12
	brne X59
	tst R13
	breq L180
X59:
	.dbline 475
;                         {
	.dbline 476
;                           spi_transfer_8(msg_buffer[7]|(1<<3));
	lds R16,_msg_buffer+7
	ori R16,8
	xcall _spi_transfer_8
	.dbline 477
;                         }
	xjmp L181
L180:
	.dbline 479
;                       else
;                         {
	.dbline 480
;                           spi_transfer_8(msg_buffer[7]);
	lds R16,_msg_buffer+7
	xcall _spi_transfer_8
	.dbline 481
;                         }
L181:
	.dbline 482
;                       spi_transfer_16(polling_address);
	ldd R16,y+2
	ldd R17,y+3
	xcall _spi_transfer_16
	.dbline 483
;                       tmp=spi_transfer_8(0x00);
	clr R16
	xcall _spi_transfer_8
	std y+21,R17
	std y+20,R16
	movw R0,R16
	std y+18,R0
	.dbline 484
;                     }
L178:
	.dbline 485
;                   while (tmp==msg_buffer[8]);
	lds R2,_msg_buffer+8
	ldd R0,y+18
	cp R0,R2
	breq L177
X60:
	.dbline 486
;                 }
	xjmp L176
L175:
	.dbline 488
;               //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 L185
X61:
	.dbline 489
;                 {
L187:
	.dbline 490
;                   while (spi_transfer_32(0xF0000000)&1);
L188:
	.dbline 490
	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 L187
X62:
	.dbline 491
;                 }
	xjmp L186
L185:
	.dbline 495
;               //If something was not correct with the given mode do
;               //hard waiting. Should never reach this point
;               else
;                 {
	.dbline 496
;                   wait_ms(msg_buffer[4]);
	lds R16,_msg_buffer+4
	clr R17
	xcall _wait_ms
	.dbline 497
;                 }
L186:
L176:
L173:
	.dbline 500
; 
;               //increment (word) address only when we have an uneven (byte) address
;               if (i&1) address++;
	tst R12
	brne X63
	tst R13
	breq L191
X63:
	.dbline 500
	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 501
;             }
L162:
	.dbline 434
	movw R24,R14
	adiw R24,1
	movw R14,R24
L164:
	.dbline 434
	ldd R0,y+14
	ldd R1,y+15
	cp R14,R0
	cpc R15,R1
	brsh X144
	xjmp L161
X144:
X64:
	.dbline 502
;         }
	xjmp L160
L159:
	.dbline 505
;       //Page Mode
;       else
;         {
	.dbline 506
;           for (i=0;i<block_size;i++)
	clr R14
	clr R15
	xjmp L196
L193:
	.dbline 507
;             {
	.dbline 510
;               //If we have an uneven byte programm the
;               //high byte
;               if (i&1)
	movw R24,R14
	andi R24,1
	andi R25,0
	std y+17,R25
	std y+16,R24
	movw R0,R24
	cpi R24,0
	cpc R24,R25
	breq L197
X65:
	.dbline 511
;                 {
	.dbline 512
;                   spi_transfer_8(msg_buffer[5]|(1<<3));
	lds R16,_msg_buffer+5
	ori R16,8
	xcall _spi_transfer_8
	.dbline 513
;                 }
	xjmp L198
L197:
	.dbline 515
;               else
;                 {
	.dbline 516
;                   spi_transfer_8(msg_buffer[5]);
	lds R16,_msg_buffer+5
	xcall _spi_transfer_8
	.dbline 517
;                 }
L198:
	.dbline 519
; 
;               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 520
;               spi_transfer_8(msg_buffer[i+10]);
	movw R24,R14
	adiw R24,10
	std y+21,R25
	std y+20,R24
	ldi R24,<_msg_buffer
	ldi R25,>_msg_buffer
	ldd R30,y+20
	ldd R31,y+21
	add R30,R24
	adc R31,R25
	ldd R16,z+0
	xcall _spi_transfer_8
	.dbline 523
; 
;               //Check if we can do polling
;               if (msg_buffer[8]!=msg_buffer[i+10])
	ldi R24,<_msg_buffer
	ldi R25,>_msg_buffer
	ldd R30,y+20
	ldd R31,y+21
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	lds R3,_msg_buffer+8
	cp R3,R2
	breq L201
X66:
	.dbline 524
;                 {
	.dbline 528
;                   //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
	lsl R2
	rol R3
	rol R4
	rol R5
	std y+2,R2
	std y+3,R3
	std y+4,R4
	std y+5,R5
	.dbline 529
;                   if (i&1) polling_address++;
	ldd R0,y+16
	ldd R1,y+17
	tst R0
	brne X67
	tst R1
	breq L204
X67:
	.dbline 529
	ldi R20,1
	ldi R21,0
	ldi R22,0
	ldi R23,0
	ldd R2,y+2
	ldd R3,y+3
	ldd R4,y+4
	ldd R5,y+5
	add R2,R20
	adc R3,R21
	adc R4,R22
	adc R5,R23
	std y+2,R2
	std y+3,R3
	std y+4,R4
	std y+5,R5
L204:
	.dbline 530
;                 }
L201:
	.dbline 533
; 
;               //increment (word) address only when we have an uneven (byte) address
;               if (i&1) address++;
	ldd R0,y+16
	ldd R1,y+17
	tst R0
	brne X68
	tst R1
	breq L206
X68:
	.dbline 533
	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 534
;             }
L194:
	.dbline 506
	movw R24,R14
	adiw R24,1
	movw R14,R24
L196:
	.dbline 506
	ldd R0,y+14
	ldd R1,y+15
	cp R14,R0
	cpc R15,R1
	brsh X145
	xjmp L193
X145:
X69:
	.dbline 537
; 
;           //If this page is complete the bit 7 of mode will be set and we programm the page
;           if (mode&0x80)
	ldd R24,y+12
	andi R24,128
	brne X146
	xjmp L208
X146:
X70:
	.dbline 538
;             {
	.dbline 539
;               spi_transfer_8(msg_buffer[6]);
	lds R16,_msg_buffer+6
	xcall _spi_transfer_8
	.dbline 540
;               spi_transfer_16(start_address&0xFFFF);
	ldi R20,255
	ldi R21,255
	ldi R22,0
	ldi R23,0
	ldd R2,y+6
	ldd R3,y+7
	ldd R4,y+8
	ldd R5,y+9
	and R2,R20
	and R3,R21
	and R4,R22
	and R5,R23
	movw R16,R2
	xcall _spi_transfer_16
	.dbline 541
;               spi_transfer_8(0);
	clr R16
	xcall _spi_transfer_8
	.dbline 544
; 
;               //If we have no valid polling address switch to simple wait mode
;               if (polling_address==0)
	ldd R2,y+2
	ldd R3,y+3
	ldd R4,y+4
	ldd R5,y+5
	clc
	tst R2
	cpc R3,R2
	cpc R4,R2
	cpc R5,R2
	brne L211
X71:
	.dbline 545
;                 {
	.dbline 546
;                   mode = (mode&(~0x70)) | 0x10;
	ldd R24,y+12
	andi R24,143
	ori R24,16
	std y+12,R24
	.dbline 547
;                 }
L211:
	.dbline 551
; 
;               //Different polling methods
;               //Hard waiting
;               if ((mode&0x70) == 0x10)
	ldd R24,y+12
	clr R25
	andi R24,112
	andi R25,0
	movw R12,R24
	cpi R24,16
	ldi R30,0
	cpc R25,R30
	brne L213
X72:
	.dbline 552
;                 {
	.dbline 553
;                   wait_ms(msg_buffer[4]);
	lds R16,_msg_buffer+4
	clr R17
	xcall _wait_ms
	.dbline 554
;                 }
	xjmp L214
L213:
	.dbline 556
;               //Data polling
;               else if ((mode&0x70) == 0x20)
	movw R24,R12
	cpi R24,32
	ldi R30,0
	cpc R25,R30
	brne L216
X73:
	.dbline 557
;                 {
L218:
	.dbline 559
;                   do
;                     {
	.dbline 562
;                       //If we have an uneven byte read the
;                       //high byte
;                       if (polling_address%2)
	ldd R2,y+2
	ldd R3,y+3
	ldd R4,y+4
	ldd R5,y+5
	mov R30,R2
	andi R30,1
	breq L221
X74:
	.dbline 563
;                         {
	.dbline 564
;                           spi_transfer_8(msg_buffer[7]|(1<<3));
	lds R16,_msg_buffer+7
	ori R16,8
	xcall _spi_transfer_8

⌨️ 快捷键说明

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