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

📄 main.s

📁 ATEMEL AVR128 BOOT程序
💻 S
📖 第 1 页 / 共 2 页
字号:
	.dbline 174
; 		msg_buffer[0] = CMD_ENTER_PROGMODE_ISP;
	ldi R24,16
	sts _msg_buffer,R24
	.dbline 175
; 		msg_buffer[1] = STATUS_CMD_OK;
	clr R2
	sts _msg_buffer+1,R2
	.dbline 176
; 		PORTB &= ~(1 << PB6);
	cbi 0x18,6
	.dbline 177
; 		}
	xjmp L61
L60:
	.dbline 179
; 	//退出编程模式
; 	else if (cmd==CMD_LEAVE_PROGMODE_ISP) {
	mov R24,R14
	cpi R24,17
	brne L63
	.dbline 179
	.dbline 180
; 		num_bytes = 2;
	ldi R24,2
	ldi R25,0
	std y+7,R25
	std y+6,R24
	.dbline 181
; 		msg_buffer[0] = CMD_LEAVE_PROGMODE_ISP;
	ldi R24,17
	sts _msg_buffer,R24
	.dbline 182
; 		msg_buffer[1] = STATUS_CMD_OK;	
	clr R2
	sts _msg_buffer+1,R2
	.dbline 184
; 			
; 		flag = 0;
	sts _flag,R2
	.dbline 185
; 		PORTB |= (1 << PB6);
	sbi 0x18,6
	.dbline 186
; 		}
	xjmp L64
L63:
	.dbline 196
; 	/*写FLASH*/
; 		/*
; 		M128一页容量为256字节,而AVRISP一帧数据为128字节。
; 		为了仿止有奇数帧出现,所以必顺每一帧写入一次。
; 		每页数据将写入两次,但是下一帧数据不能覆盖上一帧数据。
; 		整个写入过程大概如下:
; 		1、写上半页:擦除一页,写入上半页数据。
; 		2、写全部页:擦除一页,写入整个页数据。
; 		*/
; 	else if (cmd==CMD_PROGRAM_FLASH_ISP) {
	mov R24,R14
	cpi R24,19
	breq X6
	xjmp L66
X6:
	.dbline 196
	.dbline 198
; 		/*缓存合并处理*/
; 		if ((address & 0xFF) == 0x00) {						/*判断是否为上半页*/
	ldi R20,255
	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
	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 X7
	xjmp L68
X7:
	.dbline 198
	.dbline 199
; 			boot_page_ew(address,0x03);						/*擦除页*/
	ldi R24,3
	std y+0,R24
	lds R18,_address+2
	lds R19,_address+2+1
	lds R16,_address
	lds R17,_address+1
	xcall _boot_page_ew
	.dbline 200
; 			wait_page_rw_ok();								/*等待擦除完成 */
	xcall _wait_page_rw_ok
	.dbline 202
	clr R12
	clr R13
	xjmp L73
L70:
	.dbline 202
	.dbline 203
	ldi R24,<_msg_buffer
	ldi R25,>_msg_buffer
	movw R30,R12
	adiw R30,11
	add R30,R24
	adc R31,R25
	ldd R10,z+0
	clr R11
	.dbline 204
	mov R11,R10
	clr R10
	.dbline 205
	movw R30,R12
	adiw R30,10
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	clr R3
	add R10,R2
	adc R11,R3
	.dbline 206
	movw R18,R10
	movw R16,R12
	xcall _boot_page_fill
	.dbline 207
L71:
	.dbline 202
	movw R24,R12
	adiw R24,2
	movw R12,R24
L73:
	.dbline 202
; 			/*加载上半页数据*/
; 			for (i = 0; i < SPM_PAGESIZE; i += 2) {			/*加载上半页数据*/
	movw R24,R12
	cpi R24,128
	ldi R30,0
	cpc R25,R30
	brlo L70
	.dbline 208
; 				temp16=msg_buffer[i+11];
; 				temp16<<=8;
; 				temp16+=msg_buffer[i+10];
; 				boot_page_fill(i,temp16);
; 				}
; 			}
	xjmp L69
L68:
	.dbline 209
; 		else {
	.dbline 212
	clr R12
	clr R13
	xjmp L77
L74:
	.dbline 212
	.dbline 213
	ldi R24,<_msg_buffer
	ldi R25,>_msg_buffer
	movw R30,R12
	adiw R30,11
	add R30,R24
	adc R31,R25
	ldd R10,z+0
	clr R11
	.dbline 214
	mov R11,R10
	clr R10
	.dbline 215
	movw R30,R12
	adiw R30,10
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	clr R3
	add R10,R2
	adc R11,R3
	.dbline 216
	movw R18,R10
	movw R16,R12
	subi R16,128  ; offset = 128
	sbci R17,255
	xcall _boot_page_fill
	.dbline 217
L75:
	.dbline 212
	movw R24,R12
	adiw R24,2
	movw R12,R24
L77:
	.dbline 212
; 			/*写下半页时不擦除页*/
; 			/*加载上半页数据*/
; 			for (i = 0; i < SPM_PAGESIZE; i += 2) {			/*填充在后半页,完成合并*/
	movw R24,R12
	cpi R24,128
	ldi R30,0
	cpc R25,R30
	brlo L74
	.dbline 218
; 				temp16=msg_buffer[i+11];
; 				temp16<<=8;
; 				temp16+=msg_buffer[i+10];
; 				boot_page_fill(i + 128, temp16);
; 				}
; 			}
L69:
	.dbline 219
; 		boot_page_ew(address,0x05);							/*将缓冲页数据写入一个Flash页 */
	ldi R24,5
	std y+0,R24
	lds R18,_address+2
	lds R19,_address+2+1
	lds R16,_address
	lds R17,_address+1
	xcall _boot_page_ew
	.dbline 220
; 		wait_page_rw_ok();									/*等待写入完成 */
	xcall _wait_page_rw_ok
	.dbline 221
; 		address+=(SPM_PAGESIZE);
	ldi R20,128
	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 222
; 		num_bytes = 2;
	ldi R24,2
	ldi R25,0
	std y+7,R25
	std y+6,R24
	.dbline 223
; 		msg_buffer[0] = CMD_PROGRAM_FLASH_ISP;
	ldi R24,19
	sts _msg_buffer,R24
	.dbline 224
; 		msg_buffer[1] = STATUS_CMD_OK;
	clr R2
	sts _msg_buffer+1,R2
	.dbline 225
; 		}
	xjmp L67
L66:
	.dbline 227
; 	//读FLASH
; 	else if (cmd==CMD_READ_FLASH_ISP) {
	mov R24,R14
	cpi R24,20
	breq X8
	xjmp L79
X8:
	.dbline 227
	.dbline 228
	clr R12
	clr R13
	xjmp L84
L81:
	.dbline 228
	.dbline 229
	clr R18
	movw R2,R12
	clr R4
	clr R5
	lds R8,_address+2
	lds R9,_address+2+1
	lds R6,_address
	lds R7,_address+1
	add R6,R2
	adc R7,R3
	adc R8,R4
	adc R9,R5
	movw R16,R6
	xcall _read_program_memory
	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 230
L82:
	.dbline 228
	movw R24,R12
	adiw R24,1
	movw R12,R24
L84:
	.dbline 228
; 		for(i=0;i<READ_BLOCK_SIZE;i++) {
	movw R24,R12
	cpi R24,0
	ldi R30,1
	cpc R25,R30
	brlo L81
	.dbline 231
; 			msg_buffer[i+2] = read_program_memory (address+i,0x00);
; 			}
; 		address+=READ_BLOCK_SIZE;
	ldi R20,0
	ldi R21,1
	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 232
; 		num_bytes = READ_BLOCK_SIZE + 3;
	ldi R24,259
	ldi R25,1
	std y+7,R25
	std y+6,R24
	.dbline 233
; 		msg_buffer[0] = CMD_READ_FLASH_ISP;
	ldi R24,20
	sts _msg_buffer,R24
	.dbline 234
; 		msg_buffer[1] = STATUS_CMD_OK;
	clr R2
	sts _msg_buffer+1,R2
	.dbline 235
; 		msg_buffer[READ_BLOCK_SIZE + 2] = STATUS_CMD_OK;
	sts _msg_buffer+258,R2
	.dbline 236
; 		}
	xjmp L80
L79:
	.dbline 238
; 	//读熔丝位
; 	else if (cmd==CMD_READ_FUSE_ISP) {	
	mov R24,R14
	cpi R24,24
	brne L87
	.dbline 238
	.dbline 239
; 		switch(msg_buffer[2]) {
	lds R10,_msg_buffer+2
	clr R11
	movw R24,R10
	cpi R24,80
	ldi R30,0
	cpc R25,R30
	breq L93
	cpi R24,80
	ldi R30,0
	cpc R25,R30
	brlt L90
L97:
	movw R24,R10
	cpi R24,88
	ldi R30,0
	cpc R25,R30
	breq L95
	xjmp L90
X3:
	.dbline 239
L93:
	.dbline 241
; 			case 0x50:
; 				msg_buffer[2] =	read_program_memory(0x0000,1);			//读熔丝位
	ldi R18,1
	clr R16
	clr R17
	xcall _read_program_memory
	sts _msg_buffer+2,R16
	.dbline 242
; 				break;
	xjmp L90
L95:
	.dbline 244
; 			case 0x58:	
; 				msg_buffer[2] =	read_program_memory(0x0003,1);			//读高熔丝位
	ldi R18,1
	ldi R16,3
	ldi R17,0
	xcall _read_program_memory
	sts _msg_buffer+2,R16
	.dbline 245
; 				break;
	.dbline 247
; 			default:
; 				break;
L90:
	.dbline 249
; 				}
; 		num_bytes = 4;
	ldi R24,4
	ldi R25,0
	std y+7,R25
	std y+6,R24
	.dbline 250
; 		msg_buffer[0] = CMD_READ_FUSE_ISP;
	ldi R24,24
	sts _msg_buffer,R24
	.dbline 251
; 		msg_buffer[1] = STATUS_CMD_OK;
	clr R2
	sts _msg_buffer+1,R2
	.dbline 252
; 		msg_buffer[3] = STATUS_CMD_OK;
	sts _msg_buffer+3,R2
	.dbline 253
; 		}
	xjmp L88
L87:
	.dbline 255
; 	//写锁定位
; 	else if (cmd==CMD_PROGRAM_LOCK_ISP) {
	mov R24,R14
	cpi R24,25
	brne L100
	.dbline 255
	.dbline 257
; 		//write_lock_bits (msg_buffer[4]|0xC0);
; 		num_bytes = 3;
	ldi R24,3
	ldi R25,0
	std y+7,R25
	std y+6,R24
	.dbline 258
; 		msg_buffer[0] = CMD_PROGRAM_LOCK_ISP;
	ldi R24,25
	sts _msg_buffer,R24
	.dbline 259
; 		msg_buffer[1] = STATUS_CMD_OK;		
	clr R2
	sts _msg_buffer+1,R2
	.dbline 260
; 		msg_buffer[2] = STATUS_CMD_OK;
	sts _msg_buffer+2,R2
	.dbline 261
; 		}
	xjmp L101
L100:
	.dbline 263
; 	//读锁定位
; 	else if (cmd==CMD_READ_LOCK_ISP) {
	mov R24,R14
	cpi R24,26
	brne L104
	.dbline 263
	.dbline 264
; 		msg_buffer[2] = read_program_memory(0x0001,1);
	ldi R18,1
	ldi R16,1
	ldi R17,0
	xcall _read_program_memory
	sts _msg_buffer+2,R16
	.dbline 265
; 		num_bytes = 4;
	ldi R24,4
	ldi R25,0
	std y+7,R25
	std y+6,R24
	.dbline 266
; 		msg_buffer[0] = CMD_READ_LOCK_ISP;
	ldi R24,26
	sts _msg_buffer,R24
	.dbline 267
; 		msg_buffer[1] = STATUS_CMD_OK;
	clr R2
	sts _msg_buffer+1,R2
	.dbline 268
; 		msg_buffer[3] = STATUS_CMD_OK;
	sts _msg_buffer+3,R2
	.dbline 269
; 		}
L104:
L101:
L88:
L80:
L67:
L64:
L61:
L58:
L52:
L39:
L36:
L30:
	.dbline 271
; 	//传送缓冲区数据
; 	if (num_bytes>0) {		
	ldd R0,y+6
	ldd R1,y+7
	tst R0
	brne X4
	tst R1
	brne X9
	xjmp L109
X9:
X4:
	.dbline 271
	.dbline 272
; 		putChar(MESSAGE_START);
	ldi R16,27
	xcall _putChar
	.dbline 273
; 		checkSum=MESSAGE_START;
	ldi R24,27
	sts _checkSum,R24
	.dbline 274
; 		putChar(seqNum);
	ldd R16,y+19
	xcall _putChar
	.dbline 275
; 		checkSum^=seqNum;
	lds R2,_checkSum
	ldd R0,y+19
	eor R2,R0
	sts _checkSum,R2
	.dbline 276
; 		tmp=(num_bytes&0xFF00)>>8;
	ldd R24,y+6
	ldd R25,y+7
	andi R24,0
	mov R24,R25
	clr R25
	std y+8,R24
	.dbline 277
; 		putChar(tmp);
	mov R16,R24
	xcall _putChar
	.dbline 278
; 		checkSum^=tmp;
	lds R2,_checkSum
	ldd R0,y+8
	eor R2,R0
	sts _checkSum,R2
	.dbline 279
; 		tmp=num_bytes&0x00FF;
	ldd R24,y+6
	ldd R25,y+7
	andi R25,0
	std y+8,R24
	.dbline 280
; 		putChar(tmp);
	mov R16,R24
	xcall _putChar
	.dbline 281
; 		checkSum^=tmp;
	lds R2,_checkSum
	ldd R0,y+8
	eor R2,R0
	sts _checkSum,R2
	.dbline 282
; 		putChar(TOKEN);
	ldi R16,14
	xcall _putChar
	.dbline 283
; 		checkSum^=TOKEN;
	ldi R24,14
	lds R2,_checkSum
	eor R2,R24
	sts _checkSum,R2
	.dbline 284
	clr R12
	clr R13
	xjmp L114
L111:
	.dbline 284
	.dbline 285
	ldi R24,<_msg_buffer
	ldi R25,>_msg_buffer
	movw R30,R12
	add R30,R24
	adc R31,R25
	ldd R16,z+0
	xcall _putChar
	.dbline 286
	ldi R24,<_msg_buffer
	ldi R25,>_msg_buffer
	movw R30,R12
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	lds R3,_checkSum
	eor R3,R2
	sts _checkSum,R3
	.dbline 287
L112:
	.dbline 284
	movw R24,R12
	adiw R24,1
	movw R12,R24
L114:
	.dbline 284
	ldd R0,y+6
	ldd R1,y+7
	cp R12,R0
	cpc R13,R1
	brlo L111
	.dbline 288
	lds R16,_checkSum
	xcall _putChar
	.dbline 289
	clr R2
	sts _checkSum,R2
	.dbline 290
L109:
	.dbline -2
L28:
	adiw R28,9
	xcall pop_gset5
	adiw R28,2
	.dbline 0 ; func end
	ret
	.dbsym r temp16 10 i
	.dbsym l start_address 2 l
	.dbsym r cmd 14 c
	.dbsym l tmp 8 c
	.dbsym l num_bytes 6 i
	.dbsym r i 12 i
	.dbsym l seqNum 19 c
	.dbend
	.area data(ram, con, rel)
	.dbfile E:\ICCAVR\project\AVRMEG~3\icc\019-BOOT\main.c
L34:
	.blkb 9
	.area idata
	.byte 'S,'T,'K,53,48,48,95,50,0
	.area data(ram, con, rel)
	.dbfile E:\ICCAVR\project\AVRMEG~3\icc\019-BOOT\main.c

⌨️ 快捷键说明

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