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

📄 self.lst

📁 单片机开发资料光盘-双龙-686M.zip
💻 LST
📖 第 1 页 / 共 2 页
字号:
__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 + -