📄 self.lst
字号:
__text_start:
__start:
0E13 E001 LDI R16,1
0E14 BF05 OUT 0x35,R16
0E15 E002 LDI R16,2
0E16 BF05 OUT 0x35,R16
0E17 E5CF LDI R28,0x5F
0E18 E0D4 LDI R29,4
0E19 BFCD OUT 0x3D,R28
0E1A BFDE OUT 0x3E,R29
0E1B 51C0 SUBI R28,0x10
0E1C 40D0 SBCI R29,0
0E1D EA0A LDI R16,0xAA
0E1E 8308 STD Y+0,R16
0E1F 2400 CLR R0
0E20 E6E0 LDI R30,0x60
0E21 E0F0 LDI R31,0
0E22 E010 LDI R17,0
0E23 36E0 CPI R30,0x60
0E24 07F1 CPC R31,R17
0E25 F011 BEQ 0x0E28
0E26 9201 ST R0,Z+
0E27 CFFB RJMP 0x0E23
0E28 8300 STD Z+0,R16
0E29 E2E6 LDI R30,0x26
0E2A E1FC LDI R31,0x1C
0E2B E6A0 LDI R26,0x60
0E2C E0B0 LDI R27,0
0E2D E11C LDI R17,0x1C
0E2E 32E6 CPI R30,0x26
0E2F 07F1 CPC R31,R17
0E30 F021 BEQ 0x0E35
0E31 95C8 LPM
0E32 9631 ADIW R30,1
0E33 920D ST R0,X+
0E34 CFF9 RJMP 0x0E2E
0E35 D0FC RCALL _main
_exit:
0E36 CFFF RJMP _exit
FILE: E:\icc\iccavr\mega8\mega8\boot\main.c
(0001) /*******************************************/
(0002) /* 广州天河双龙电子公司 */
(0003) /* http://www.sl.com.cn */
(0004) /* BOOT引导IAP应用演示程序 */
(0005) /* 作者:ntzwq@wx88.net */
(0006) /* 2002年5月11日 */
(0007) /* 目标MCU:MEGA8 晶振:外部(EXT) 8MHZ */
(0008) /*******************************************/
(0009) #include "self.h"
(0010) #include "assembly.h"
(0011) #include<iom8v.h>
(0012) #define fosc 8000000 //晶振8MHZ
(0013) #define baud 19200 //波特率
(0014) #define osc_address 0x1ff0
(0015) extern unsigned char read_flash(unsigned int add);
(0016) /* 字符输出函数 */
(0017) void sendchar(unsigned char c)
(0018) {
(0019) while (!(UCSRA&(1<<UDRE)));
_sendchar:
c --> R16
0E37 9B5D SBIS 0x0B,5
0E38 CFFE RJMP _sendchar
(0020) UDR=c;
0E39 B90C OUT 0x0C,R16
(0021) }
0E3A 9508 RET
(0022) /* 字符输入函数 */
(0023) unsigned char recchar(void)
(0024) {
(0025) while(!(UCSRA& (1<<RXC)));
_recchar:
0E3B 9B5F SBIS 0x0B,7
0E3C CFFE RJMP _recchar
(0026) return UDR;
0E3D B10C IN R16,0x0C
0E3E 9508 RET
(0027) }
(0028) /* UART初始化 */
(0029) void uart_init(void)
(0030) {
(0031) OSCCAL=read_flash(osc_address);//对内部RC OSC调整
_uart_init:
0E3F EF00 LDI R16,0xF0
0E40 E11F LDI R17,0x1F
0E41 D12C RCALL _read_flash
0E42 BF01 OUT 0x31,R16
(0032) UCSRB=(1<<RXEN)|(1<<TXEN);//允许发送和接收
0E43 E188 LDI R24,0x18
0E44 B98A OUT 0x0A,R24
(0033) UBRRL=(fosc/16/(baud+1))%256;
0E45 E18A LDI R24,0x1A
0E46 B989 OUT 0x09,R24
(0034) UBRRH=(fosc/16/(baud+1))/256;
0E47 2422 CLR R2
0E48 BC20 OUT 0x20,R2
(0035) UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);//8位数据+1位STOP位
0E49 E886 LDI R24,0x86
0E4A BD80 OUT 0x20,R24
(0036) }
0E4B 9508 RET
_iap:
intval --> R10
data --> R14
ldata --> R12
address --> R22
val --> R20
0E4C D148 RCALL push_gset5
(0037) void iap(void)
(0038) {
(0039) unsigned int intval,address,data;
(0040) unsigned char val, ldata;
(0041) for(;;)
(0042) {
(0043) val=recchar();
0E4D DFED RCALL _recchar
0E4E 2F40 MOV R20,R16
(0044) if(val=='a') //Autoincrement?
0E4F 3601 CPI R16,0x61
0E50 F419 BNE 0x0E54
(0045) {
(0046) sendchar('Y'); //Autoincrement is quicker
0E51 E509 LDI R16,0x59
0E52 DFE4 RCALL _sendchar
(0047) }
0E53 CFF9 RJMP 0x0E4D
(0048) else if(val=='A') //write address
0E54 3441 CPI R20,0x41
0E55 F461 BNE 0x0E62
(0049) {
(0050) address=recchar(); //read address 8 MSB
0E56 DFE4 RCALL _recchar
0E57 2F60 MOV R22,R16
0E58 2777 CLR R23
(0051) address=(address<<8)|recchar();
0E59 DFE1 RCALL _recchar
0E5A 2E20 MOV R2,R16
0E5B 2E36 MOV R3,R22
0E5C 01B1 MOVW R22,R2
(0052) address=address<<1; //convert from word address to byte address
0E5D 0F66 LSL R22
0E5E 1F77 ROL R23
(0053) sendchar('\r');
0E5F E00D LDI R16,0xD
0E60 DFD6 RCALL _sendchar
(0054) }
0E61 CFEB RJMP 0x0E4D
(0055) else if(val=='c') //Write program memory, low byte
0E62 3643 CPI R20,0x63
0E63 F429 BNE 0x0E69
(0056) {
(0057) ldata=recchar();
0E64 DFD6 RCALL _recchar
0E65 2EC0 MOV R12,R16
(0058) sendchar('\r');
0E66 E00D LDI R16,0xD
0E67 DFCF RCALL _sendchar
(0059) }
0E68 CFE4 RJMP 0x0E4D
(0060) else if(val== 'C') //Write program memory, high byte
0E69 3443 CPI R20,0x43
0E6A F489 BNE 0x0E7C
(0061) {
(0062) data=ldata|(recchar()<<8);
0E6B DFCF RCALL _recchar
0E6C 2E20 MOV R2,R16
0E6D 2433 CLR R3
0E6E 2C32 MOV R3,R2
0E6F 2422 CLR R2
0E70 2CEC MOV R14,R12
0E71 24FF CLR R15
0E72 28E2 OR R14,R2
0E73 28F3 OR R15,R3
(0063) fill_temp_buffer(data,(address)); //call asm routine.
0E74 019B MOVW R18,R22
0E75 0187 MOVW R16,R14
0E76 D0D6 RCALL _fill_temp_buffer
(0064) address+=2;
0E77 5F6E SUBI R22,0xFE
0E78 4F7F SBCI R23,0xFF
(0065) sendchar('\r');
0E79 E00D LDI R16,0xD
0E7A DFBC RCALL _sendchar
(0066) }
0E7B CFD1 RJMP 0x0E4D
(0067) else if(val=='e') //Chip erase
0E7C 3645 CPI R20,0x65
0E7D F479 BNE 0x0E8D
(0068) {
(0069) for(address=0;address < APP_END;address += PAGESIZE) //Application section = 60 pages
0E7E 2766 CLR R22
0E7F 2777 CLR R23
0E80 C005 RJMP 0x0E86
(0070) {
(0071) write_page(address,0x03); //Perform page erase
0E81 E023 LDI R18,3
0E82 018B MOVW R16,R22
0E83 D0BF RCALL _write_page
0E84 5C60 SUBI R22,0xC0
0E85 4F7F SBCI R23,0xFF
0E86 3060 CPI R22,0
0E87 E1EC LDI R30,0x1C
0E88 077E CPC R23,R30
0E89 F3B8 BCS 0x0E81
(0072) }
(0073) sendchar('\r');
0E8A E00D LDI R16,0xD
0E8B DFAB RCALL _sendchar
(0074) }
0E8C CFC0 RJMP 0x0E4D
(0075) else if(val=='l') // write lockbits
0E8D 364C CPI R20,0x6C
0E8E F429 BNE 0x0E94
(0076) {
(0077) write_lock_bits(recchar());
0E8F DFAB RCALL _recchar
0E90 D0D3 RCALL _write_lock_bits
(0078) sendchar('\r');
0E91 E00D LDI R16,0xD
0E92 DFA4 RCALL _sendchar
(0079) }
0E93 CFB9 RJMP 0x0E4D
(0080) else if(val== 'm') // write page
0E94 364D CPI R20,0x6D
0E95 F431 BNE 0x0E9C
(0081) {
(0082) write_page((address),0x05);
0E96 E025 LDI R18,5
0E97 018B MOVW R16,R22
0E98 D0AA RCALL _write_page
(0083) sendchar('\r');
0E99 E00D LDI R16,0xD
0E9A DF9C RCALL _sendchar
(0084) }
0E9B CFB1 RJMP 0x0E4D
(0085) else if((val=='P')||(val=='L')) // Enter programming mode
0E9C 3540 CPI R20,0x50
0E9D F011 BEQ 0x0EA0
0E9E 344C CPI R20,0x4C
0E9F F419 BNE 0x0EA3
(0086) {
(0087) sendchar('\r');
0EA0 E00D LDI R16,0xD
0EA1 DF95 RCALL _sendchar
(0088) }
0EA2 CFAA RJMP 0x0E4D
(0089) else if (val=='p')
0EA3 3740 CPI R20,0x70
0EA4 F419 BNE 0x0EA8
(0090) {
(0091) sendchar('S');
0EA5 E503 LDI R16,0x53
0EA6 DF90 RCALL _sendchar
(0092) }
0EA7 CFA5 RJMP 0x0E4D
(0093) else if(val=='R') //Read program memory
0EA8 3542 CPI R20,0x52
0EA9 F4B9 BNE 0x0EC1
(0094) {
(0095) if (address>=APP_END)
0EAA 3060 CPI R22,0
0EAB E1EC LDI R30,0x1C
0EAC 077E CPC R23,R30
0EAD F038 BCS 0x0EB5
(0096) {
(0097) sendchar(0xff);
0EAE EF0F LDI R16,0xFF
0EAF DF87 RCALL _sendchar
(0098) sendchar(0xff);
0EB0 EF0F LDI R16,0xFF
0EB1 DF85 RCALL _sendchar
(0099) address+=2;
0EB2 5F6E SUBI R22,0xFE
0EB3 4F7F SBCI R23,0xFF
(0100) }
0EB4 CF98 RJMP 0x0E4D
(0101) else
(0102) {
(0103) intval=read_program_memory(address,0x00);
0EB5 2722 CLR R18
0EB6 018B MOVW R16,R22
0EB7 D09D RCALL _read_program_memory
0EB8 0158 MOVW R10,R16
(0104) sendchar((char)(intval>>8)); //send MSB
0EB9 2F01 MOV R16,R17
0EBA 2711 CLR R17
0EBB DF7B RCALL _sendchar
(0105) sendchar((char)intval); //send LSB
0EBC 2D0A MOV R16,R10
0EBD DF79 RCALL _sendchar
(0106) address+=2;
0EBE 5F6E SUBI R22,0xFE
0EBF 4F7F SBCI R23,0xFF
(0107) }
(0108) }
0EC0 CF8C RJMP 0x0E4D
(0109) else if (val == 'D')
0EC1 3444 CPI R20,0x44
0EC2 F481 BNE 0x0ED3
(0110) {
(0111) EEARL = address;
0EC3 BB6E OUT 0x1E,R22
(0112) EEARH = (address >> 8);
0EC4 011B MOVW R2,R22
0EC5 2C23 MOV R2,R3
0EC6 2433 CLR R3
0EC7 BA2F OUT 0x1F,R2
(0113) address++;
0EC8 5F6F SUBI R22,0xFF
0EC9 4F7F SBCI R23,0xFF
(0114) EEDR = recchar();
0ECA DF70 RCALL _recchar
0ECB BB0D OUT 0x1D,R16
(0115) EECR |= (1<<EEMWE);
0ECC 9AE2 SBI 0x1C,2
(0116) EECR |= (1<<EEWE);
0ECD 9AE1 SBI 0x1C,1
(0117) while (EECR & (1<<EEWE))
0ECE 99E1 SBIC 0x1C,1
0ECF CFFE RJMP 0x0ECE
(0118) ;
(0119) sendchar('\r');
0ED0 E00D LDI R16,0xD
0ED1 DF65 RCALL _sendchar
(0120) }
0ED2 CF7A RJMP 0x0E4D
(0121) else if (val == 'd')
0ED3 3644 CPI R20,0x64
0ED4 F459 BNE 0x0EE0
(0122) {
(0123) EEARL = address;
0ED5 BB6E OUT 0x1E,R22
(0124) EEARH = (address >> 8);
0ED6 011B MOVW R2,R22
0ED7 2C23 MOV R2,R3
0ED8 2433 CLR R3
0ED9 BA2F OUT 0x1F,R2
(0125) address++;
0EDA 5F6F SUBI R22,0xFF
0EDB 4F7F SBCI R23,0xFF
(0126) EECR |= (1<<EERE);
0EDC 9AE0 SBI 0x1C,0
(0127) sendchar(EEDR);
0EDD B30D IN R16,0x1D
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -