📄 self.lst
字号:
__text_start:
__start:
0E01 E5CF LDI R28,0x5F
0E02 E0D4 LDI R29,4
0E03 BFCD OUT P3D,R28
0E04 BFDE OUT P3E,R29
0E05 51C0 SUBI R28,0x10
0E06 40D0 SBCI R29,0
0E07 EA0A LDI R16,0xAA
0E08 8308 STD R16,0+Y
0E09 2400 CLR R0
0E0A E6E0 LDI R30,0x60
0E0B E0F0 LDI R31,0
0E0C E010 LDI R17,0
0E0D 36E0 CPI R30,0x60
0E0E 07F1 CPC R31,R17
0E0F F011 BEQ 0x0E12
0E10 9201 ST R0,Z+
0E11 CFFB RJMP 0x0E0D
0E12 8300 STD R16,0+Z
0E13 E0E2 LDI R30,2
0E14 E1FC LDI R31,0x1C
0E15 E6A0 LDI R26,0x60
0E16 E0B0 LDI R27,0
0E17 E11C LDI R17,0x1C
0E18 30E2 CPI R30,2
0E19 07F1 CPC R31,R17
0E1A F021 BEQ 0x0E1F
0E1B 95C8 LPM
0E1C 9631 ADIW R30,1
0E1D 920D ST R0,X+
0E1E CFF9 RJMP 0x0E18
0E1F D0FC RCALL _main
_exit:
0E20 CFFF RJMP _exit
FILE: C:\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) extern unsigned char read_flash(unsigned int add);
(0015) /* 字符输出函数 */
(0016) void sendchar(unsigned char c)
(0017) {
(0018) while (!(UCSRA&(1<<UDRE)));
_sendchar:
c --> R16
0E21 9B5D SBIS P0B,5
0E22 CFFE RJMP _sendchar
(0019) UDR=c;
0E23 B90C OUT P0C,R16
(0020) }
0E24 9508 RET
(0021) /* 字符输入函数 */
(0022) unsigned char recchar(void)
(0023) {
(0024) while(!(UCSRA& (1<<RXC)));
_recchar:
0E25 9B5F SBIS P0B,7
0E26 CFFE RJMP _recchar
(0025) return UDR;
0E27 B10C IN R16,P0C
0E28 9508 RET
(0026) }
(0027) /* UART初始化 */
(0028) void uart_init(void)
(0029) {
(0030) OSCCAL=read_flash(0x1f20);//对内部RC OSC调整
_uart_init:
0E29 E200 LDI R16,0x20
0E2A E11F LDI R17,0x1F
0E2B D12C RCALL _read_flash
0E2C BF01 OUT P31,R16
(0031) UCSRB=(1<<RXEN)|(1<<TXEN);//允许发送和接收
0E2D E188 LDI R24,0x18
0E2E B98A OUT P0A,R24
(0032) UBRRL=(fosc/16/(baud+1))%256;
0E2F E18A LDI R24,0x1A
0E30 B989 OUT P09,R24
(0033) UBRRH=(fosc/16/(baud+1))/256;
0E31 2422 CLR R2
0E32 BC20 OUT P20,R2
(0034) UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);//8位数据+1位STOP位
0E33 E886 LDI R24,0x86
0E34 BD80 OUT P20,R24
(0035) }
0E35 9508 RET
_iap:
intval --> R10
data --> R14
ldata --> R12
address --> R22
val --> R20
0E36 D146 RCALL push_gset5
(0036) void iap(void)
(0037) {
(0038) unsigned int intval,address,data;
(0039) unsigned char val, ldata;
(0040) for(;;)
(0041) {
(0042) val=recchar();
0E37 DFED RCALL _recchar
0E38 2F40 MOV R20,R16
(0043) if(val=='a') //Autoincrement?
0E39 3601 CPI R16,0x61
0E3A F419 BNE 0x0E3E
(0044) {
(0045) sendchar('Y'); //Autoincrement is quicker
0E3B E509 LDI R16,0x59
0E3C DFE4 RCALL _sendchar
(0046) }
0E3D CFF9 RJMP 0x0E37
(0047) else if(val=='A') //write address
0E3E 3441 CPI R20,0x41
0E3F F461 BNE 0x0E4C
(0048) {
(0049) address=recchar(); //read address 8 MSB
0E40 DFE4 RCALL _recchar
0E41 2F60 MOV R22,R16
0E42 2777 CLR R23
(0050) address=(address<<8)|recchar();
0E43 DFE1 RCALL _recchar
0E44 2E36 MOV R3,R22
0E45 2E20 MOV R2,R16
0E46 01B1 MOVW R22,R2
(0051) address=address<<1; //convert from word address to byte address
0E47 0F66 LSL R22
0E48 1F77 ROL R23
(0052) sendchar('\r');
0E49 E00D LDI R16,0xD
0E4A DFD6 RCALL _sendchar
(0053) }
0E4B CFEB RJMP 0x0E37
(0054) else if(val=='c') //Write program memory, low byte
0E4C 3643 CPI R20,0x63
0E4D F429 BNE 0x0E53
(0055) {
(0056) ldata=recchar();
0E4E DFD6 RCALL _recchar
0E4F 2EC0 MOV R12,R16
(0057) sendchar('\r');
0E50 E00D LDI R16,0xD
0E51 DFCF RCALL _sendchar
(0058) }
0E52 CFE4 RJMP 0x0E37
(0059) else if(val== 'C') //Write program memory, high byte
0E53 3443 CPI R20,0x43
0E54 F489 BNE 0x0E66
(0060) {
(0061) data=ldata|(recchar()<<8);
0E55 DFCF RCALL _recchar
0E56 2E20 MOV R2,R16
0E57 2433 CLR R3
0E58 2C32 MOV R3,R2
0E59 2422 CLR R2
0E5A 2CEC MOV R14,R12
0E5B 24FF CLR R15
0E5C 28E2 OR R14,R2
0E5D 28F3 OR R15,R3
(0062) fill_temp_buffer(data,(address)); //call asm routine.
0E5E 019B MOVW R18,R22
0E5F 0187 MOVW R16,R14
0E60 D0D6 RCALL _fill_temp_buffer
(0063) address+=2;
0E61 5F6E SUBI R22,0xFE
0E62 4F7F SBCI R23,0xFF
(0064) sendchar('\r');
0E63 E00D LDI R16,0xD
0E64 DFBC RCALL _sendchar
(0065) }
0E65 CFD1 RJMP 0x0E37
(0066) else if(val=='e') //Chip erase
0E66 3645 CPI R20,0x65
0E67 F479 BNE 0x0E77
(0067) {
(0068) for(address=0;address < APP_END;address += PAGESIZE) //Application section = 60 pages
0E68 2766 CLR R22
0E69 2777 CLR R23
0E6A C005 RJMP 0x0E70
(0069) {
(0070) write_page(address,0x03); //Perform page erase
0E6B E023 LDI R18,3
0E6C 018B MOVW R16,R22
0E6D D0BF RCALL _write_page
0E6E 5C60 SUBI R22,0xC0
0E6F 4F7F SBCI R23,0xFF
0E70 3060 CPI R22,0
0E71 E1EC LDI R30,0x1C
0E72 077E CPC R23,R30
0E73 F3B8 BCS 0x0E6B
(0071) }
(0072) sendchar('\r');
0E74 E00D LDI R16,0xD
0E75 DFAB RCALL _sendchar
(0073) }
0E76 CFC0 RJMP 0x0E37
(0074) else if(val=='l') // write lockbits
0E77 364C CPI R20,0x6C
0E78 F429 BNE 0x0E7E
(0075) {
(0076) write_lock_bits(recchar());
0E79 DFAB RCALL _recchar
0E7A D0D3 RCALL _write_lock_bits
(0077) sendchar('\r');
0E7B E00D LDI R16,0xD
0E7C DFA4 RCALL _sendchar
(0078) }
0E7D CFB9 RJMP 0x0E37
(0079) else if(val== 'm') // write page
0E7E 364D CPI R20,0x6D
0E7F F431 BNE 0x0E86
(0080) {
(0081) write_page((address),0x05);
0E80 E025 LDI R18,5
0E81 018B MOVW R16,R22
0E82 D0AA RCALL _write_page
(0082) sendchar('\r');
0E83 E00D LDI R16,0xD
0E84 DF9C RCALL _sendchar
(0083) }
0E85 CFB1 RJMP 0x0E37
(0084) else if((val=='P')||(val=='L')) // Enter programming mode
0E86 3540 CPI R20,0x50
0E87 F011 BEQ 0x0E8A
0E88 344C CPI R20,0x4C
0E89 F419 BNE 0x0E8D
(0085) {
(0086) sendchar('\r');
0E8A E00D LDI R16,0xD
0E8B DF95 RCALL _sendchar
(0087) }
0E8C CFAA RJMP 0x0E37
(0088) else if (val=='p')
0E8D 3740 CPI R20,0x70
0E8E F419 BNE 0x0E92
(0089) {
(0090) sendchar('S');
0E8F E503 LDI R16,0x53
0E90 DF90 RCALL _sendchar
(0091) }
0E91 CFA5 RJMP 0x0E37
(0092) else if(val=='R') //Read program memory
0E92 3542 CPI R20,0x52
0E93 F4B9 BNE 0x0EAB
(0093) {
(0094) if (address>=APP_END)
0E94 3060 CPI R22,0
0E95 E1EC LDI R30,0x1C
0E96 077E CPC R23,R30
0E97 F038 BCS 0x0E9F
(0095) {
(0096) sendchar(0xff);
0E98 EF0F LDI R16,0xFF
0E99 DF87 RCALL _sendchar
(0097) sendchar(0xff);
0E9A EF0F LDI R16,0xFF
0E9B DF85 RCALL _sendchar
(0098) address+=2;
0E9C 5F6E SUBI R22,0xFE
0E9D 4F7F SBCI R23,0xFF
(0099) }
0E9E CF98 RJMP 0x0E37
(0100) else
(0101) {
(0102) intval=read_program_memory(address,0x00);
0E9F 2722 CLR R18
0EA0 018B MOVW R16,R22
0EA1 D09D RCALL _read_program_memory
0EA2 0158 MOVW R10,R16
(0103) sendchar((char)(intval>>8)); //send MSB
0EA3 2F01 MOV R16,R17
0EA4 2711 CLR R17
0EA5 DF7B RCALL _sendchar
(0104) sendchar((char)intval); //send LSB
0EA6 2D0A MOV R16,R10
0EA7 DF79 RCALL _sendchar
(0105) address+=2;
0EA8 5F6E SUBI R22,0xFE
0EA9 4F7F SBCI R23,0xFF
(0106) }
(0107) }
0EAA CF8C RJMP 0x0E37
(0108) else if (val == 'D')
0EAB 3444 CPI R20,0x44
0EAC F481 BNE 0x0EBD
(0109) {
(0110) EEARL = address;
0EAD BB6E OUT P1E,R22
(0111) EEARH = (address >> 8);
0EAE 011B MOVW R2,R22
0EAF 2C23 MOV R2,R3
0EB0 2433 CLR R3
0EB1 BA2F OUT P1F,R2
(0112) address++;
0EB2 5F6F SUBI R22,0xFF
0EB3 4F7F SBCI R23,0xFF
(0113) EEDR = recchar();
0EB4 DF70 RCALL _recchar
0EB5 BB0D OUT P1D,R16
(0114) EECR |= (1<<EEMWE);
0EB6 9AE2 SBI P1C,2
(0115) EECR |= (1<<EEWE);
0EB7 9AE1 SBI P1C,1
(0116) while (EECR & (1<<EEWE))
0EB8 99E1 SBIC P1C,1
0EB9 CFFE RJMP 0x0EB8
(0117) ;
(0118) sendchar('\r');
0EBA E00D LDI R16,0xD
0EBB DF65 RCALL _sendchar
(0119) }
0EBC CF7A RJMP 0x0E37
(0120) else if (val == 'd')
0EBD 3644 CPI R20,0x64
0EBE F459 BNE 0x0ECA
(0121) {
(0122) EEARL = address;
0EBF BB6E OUT P1E,R22
(0123) EEARH = (address >> 8);
0EC0 011B MOVW R2,R22
0EC1 2C23 MOV R2,R3
0EC2 2433 CLR R3
0EC3 BA2F OUT P1F,R2
(0124) address++;
0EC4 5F6F SUBI R22,0xFF
0EC5 4F7F SBCI R23,0xFF
(0125) EECR |= (1<<EERE);
0EC6 9AE0 SBI P1C,0
(0126) sendchar(EEDR);
0EC7 B30D IN R16,P1D
0EC8 DF58 RCALL _sendchar
(0127) }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -