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

📄 self.lst

📁 一个AVR单片机BOOTLOADER的例子
💻 LST
📖 第 1 页 / 共 2 页
字号:
    0EC9 CF6D      RJMP	0x0E37
(0128)           else if(val=='F')                   // read fuse bits
    0ECA 3446      CPI	R20,0x46
    0ECB F431      BNE	0x0ED2
(0129)            {
(0130)             sendchar(read_program_memory(0x0000,0x09));
    0ECC E029      LDI	R18,0x9
    0ECD 2700      CLR	R16
    0ECE 2711      CLR	R17
    0ECF D06F      RCALL	_read_program_memory
    0ED0 DF50      RCALL	_sendchar
(0131)            }        
    0ED1 CF65      RJMP	0x0E37
(0132)           else if(val=='r')                   // read lock bits
    0ED2 3742      CPI	R20,0x72
    0ED3 F431      BNE	0x0EDA
(0133)            {
(0134)             sendchar(read_program_memory(0x0001,0x09));
    0ED4 E029      LDI	R18,0x9
    0ED5 E001      LDI	R16,1
    0ED6 E010      LDI	R17,0
    0ED7 D067      RCALL	_read_program_memory
    0ED8 DF48      RCALL	_sendchar
(0135)            }        
    0ED9 CF5D      RJMP	0x0E37
(0136)           else if(val=='N')                   // read high fuse bits
    0EDA 344E      CPI	R20,0x4E
    0EDB F431      BNE	0x0EE2
(0137)            {
(0138)             sendchar(read_program_memory(0x0003,0x09));
    0EDC E029      LDI	R18,0x9
    0EDD E003      LDI	R16,3
    0EDE E010      LDI	R17,0
    0EDF D05F      RCALL	_read_program_memory
    0EE0 DF40      RCALL	_sendchar
(0139)             }        
    0EE1 CF55      RJMP	0x0E37
(0140)           else if(val=='t')                   // Return programmer type 
    0EE2 3744      CPI	R20,0x74
    0EE3 F429      BNE	0x0EE9
(0141)            {
(0142)             sendchar(device);
    0EE4 E707      LDI	R16,0x77
    0EE5 DF3B      RCALL	_sendchar
(0143)             sendchar(0);
    0EE6 2700      CLR	R16
    0EE7 DF39      RCALL	_sendchar
(0144)             }
    0EE8 CF4E      RJMP	0x0E37
(0145)           else if ((val=='x')||(val=='y')||(val=='T'))
    0EE9 3748      CPI	R20,0x78
    0EEA F021      BEQ	0x0EEF
    0EEB 3749      CPI	R20,0x79
    0EEC F011      BEQ	0x0EEF
    0EED 3544      CPI	R20,0x54
    0EEE F421      BNE	0x0EF3
(0146)             {
(0147)              recchar();
    0EEF DF35      RCALL	_recchar
(0148)              sendchar('\r');
    0EF0 E00D      LDI	R16,0xD
    0EF1 DF2F      RCALL	_sendchar
(0149)             }       
    0EF2 CF44      RJMP	0x0E37
(0150)           else if (val=='S')                  // Return software identifier 
    0EF3 3543      CPI	R20,0x53
    0EF4 F479      BNE	0x0F04
(0151)             {
(0152)              sendchar('A');
    0EF5 E401      LDI	R16,0x41
    0EF6 DF2A      RCALL	_sendchar
(0153)              sendchar('V');
    0EF7 E506      LDI	R16,0x56
    0EF8 DF28      RCALL	_sendchar
(0154)              sendchar('R');
    0EF9 E502      LDI	R16,0x52
    0EFA DF26      RCALL	_sendchar
(0155)              sendchar('B');
    0EFB E402      LDI	R16,0x42
    0EFC DF24      RCALL	_sendchar
(0156)              sendchar('O');
    0EFD E40F      LDI	R16,0x4F
    0EFE DF22      RCALL	_sendchar
(0157)              sendchar('O');
    0EFF E40F      LDI	R16,0x4F
    0F00 DF20      RCALL	_sendchar
(0158)              sendchar('T');
    0F01 E504      LDI	R16,0x54
    0F02 DF1E      RCALL	_sendchar
(0159)             }			                       
    0F03 CF33      RJMP	0x0E37
(0160)           else if (val=='V')                  // Return Software Version
    0F04 3546      CPI	R20,0x56
    0F05 F429      BNE	0x0F0B
(0161)             {
(0162)              sendchar('1');
    0F06 E301      LDI	R16,0x31
    0F07 DF19      RCALL	_sendchar
(0163)              sendchar('0');
    0F08 E300      LDI	R16,0x30
    0F09 DF17      RCALL	_sendchar
(0164)              }        
    0F0A CF2C      RJMP	0x0E37
(0165)           else if (val=='s')                  // Return Signature Byte
    0F0B 3743      CPI	R20,0x73
    0F0C F439      BNE	0x0F14
(0166)             {							
(0167)              sendchar(sig_byte3);
    0F0D E007      LDI	R16,7
    0F0E DF12      RCALL	_sendchar
(0168)              sendchar(sig_byte2);
    0F0F E903      LDI	R16,0x93
    0F10 DF10      RCALL	_sendchar
(0169)              sendchar(sig_byte1);
    0F11 E10E      LDI	R16,0x1E
    0F12 DF0E      RCALL	_sendchar
(0170)             }       
    0F13 CF23      RJMP	0x0E37
(0171)           else if(val!=0x1b)                  // if not esc
    0F14 314B      CPI	R20,0x1B
    0F15 F409      BNE	0x0F17
    0F16 CF20      RJMP	0x0E37
(0172)             {
(0173)              sendchar('?');
    0F17 E30F      LDI	R16,0x3F
    0F18 DF08      RCALL	_sendchar
    0F19 CF1D      RJMP	0x0E37
    0F1A D065      RCALL	pop_gset5
    0F1B 9508      RET
(0174)              }
(0175)          }	
(0176) }
(0177) void main(void)
(0178) {
(0179)     void (*funcptr)( void ) = 0x0000;       // Set up function pointer
_main:
  funcptr              --> R20
    0F1C 2744      CLR	R20
    0F1D 2755      CLR	R21
(0180) 	DDRD=0;
    0F1E 2422      CLR	R2
    0F1F BA21      OUT	P11,R2
(0181) 	PORTD=0xff;	
    0F20 EF8F      LDI	R24,0xFF
    0F21 BB82      OUT	P12,R24
(0182)     uart_init();
    0F22 DF06      RCALL	_uart_init
(0183) 	if ((PIND&0x04)==0)   
    0F23 9982      SBIC	P10,2
    0F24 C004      RJMP	0x0F29
(0184)        {
(0185) 	    PORTD=0;
    0F25 2422      CLR	R2
    0F26 BA22      OUT	P12,R2
(0186) 	    iap();
    0F27 DF0E      RCALL	_iap
(0187) 	   }
    0F28 C003      RJMP	0x0F2C
(0188) 	else
(0189) 	   funcptr();   
    0F29 2FE4      MOV	R30,R20
    0F2A 2FF5      MOV	R31,R21
    0F2B D056      RCALL	xicall
(0190) }
    0F2C 9508      RET
FILE: C:\mega8\boot\assembly.s
(0001) 		.text
(0002) 
(0003) SPMCR = 0x37
(0004) 
(0005) ; void write_page (unsigned int adr, unsigned char function);
(0006) _write_page::
(0007)         in r20,SPMCR
_write_page:
    0F2D B747      IN	R20,P37
(0008) 		sbrc r20,0
    0F2E FD40      SBRC	R20,0
(0009) 		rjmp _write_page 
    0F2F CFFD      RJMP	_write_page
(0010) 		MOV R31,R17        
    0F30 2FF1      MOV	R31,R17
(0011)         MOV R30,R16         ;move adress to z pointer (R31=ZH R30=ZL)
    0F31 2FE0      MOV	R30,R16
(0012)         OUT SPMCR,R18       ;argument 2 decides function
    0F32 BF27      OUT	P37,R18
(0013)         SPM                 ;perform pagewrite
    0F33 95E8      SPM
    0F34 FFFF      SBRS	R31,7
(0014) 		.dw $ffff
(0015) 		NOP
    0F35 0000      NOP
(0016)         RET
    0F36 9508      RET
(0017) 
(0018) ; void fill_temp_buffer (unsigned int data, unsigned int adr);
(0019) _fill_temp_buffer::
(0020)         MOV R31,R19        
_fill_temp_buffer:
    0F37 2FF3      MOV	R31,R19
(0021)         MOV R30,R18         ;move adress to z pointer (R31=ZH R30=ZL)
    0F38 2FE2      MOV	R30,R18
(0022)         MOV R1,R17
    0F39 2E11      MOV	R1,R17
(0023)         MOV R0,R16          ;move data to reg 0 and 1      
    0F3A 2E00      MOV	R0,R16
(0024)         LDI R18,0x01
    0F3B E021      LDI	R18,1
(0025)         OUT SPMCR,R18
    0F3C BF27      OUT	P37,R18
(0026)         SPM            ;Store program memory
    0F3D 95E8      SPM
(0027)         RET      
    0F3E 9508      RET
(0028) 
(0029) ;unsigned int read_program_memory (unsigned int adr ,unsigned char cmd);
(0030) _read_program_memory::
(0031)         ldi  r20,0x11
_read_program_memory:
    0F3F E141      LDI	R20,0x11
(0032) 		out	 SPMCR,r20
    0F40 BF47      OUT	P37,R20
(0033) 		SPM
    0F41 95E8      SPM
    0F42 FFFF      SBRS	R31,7
(0034) 		.dw $ffff
(0035) 		nop		 	  		;重新使能RWW扇区
    0F43 0000      NOP
(0036)         MOV R31,R17         ;R31=ZH R30=ZL
    0F44 2FF1      MOV	R31,R17
(0037)         MOV R30,R16         ;move adress to z pointer
    0F45 2FE0      MOV	R30,R16
(0038)         SBRC R18,0          ;read lockbits? (second argument=0x09)
    0F46 FD20      SBRC	R18,0
(0039)         OUT SPMCR,R18	    ;if so, place second argument in SPMEN register
    0F47 BF27      OUT	P37,R18
(0040)         LPM                 ;read LSB
    0F48 95C8      LPM
(0041)         MOV R16,R0         
    0F49 2D00      MOV	R16,R0
(0042)         INC R30
    0F4A 95E3      INC	R30
(0043)         LPM
    0F4B 95C8      LPM
(0044)         MOV R17,R0          ;read MSB (ignored when reading lockbits)
    0F4C 2D10      MOV	R17,R0
(0045)         RET
    0F4D 9508      RET
(0046) 
(0047) ;void write_lock_bits (unsigned char val);
(0048) _write_lock_bits::
(0049)         in r20,SPMCR
_write_lock_bits:
    0F4E B747      IN	R20,P37
(0050) 		sbrc r20,0
    0F4F FD40      SBRC	R20,0
(0051) 		rjmp _write_lock_bits         
    0F50 CFFD      RJMP	_write_lock_bits
(0052)         MOV R0,R16   
    0F51 2E00      MOV	R0,R16
(0053)         LDI R17,0x09     
    0F52 E019      LDI	R17,0x9
(0054)         OUT SPMCR,R17
    0F53 BF17      OUT	P37,R17
(0055)         SPM                ;write lockbits
    0F54 95E8      SPM
    0F55 FFFF      SBRS	R31,7
(0056) 		.dw $ffff
(0057) 		NOP
    0F56 0000      NOP
(0058)         RET    0F57 9508      RET
FILE: C:\mega8\boot\read_flash.s
(0001) ;unsigned char read_flash(unsigned int add);
(0002) _read_flash::
(0003)         mov r31,r17
_read_flash:
    0F58 2FF1      MOV	R31,R17
(0004) 		mov r30,r16
    0F59 2FE0      MOV	R30,R16
(0005) 		lpm r16,z
    0F5A 9104      LD	R16,R16
(0006) 		clr r17
    0F5B 2711      CLR	R17
(0007) 		ret	FILE: <library>
    0F5C 9508      RET
push_gset1:
    0F5D 935A      ST	R21,-Y
    0F5E 934A      ST	R20,-Y
    0F5F 9508      RET
pop_gset1:
    0F60 E0E1      LDI	R30,1
pop:
    0F61 9149      LD	R20,Y+
    0F62 9159      LD	R21,Y+
    0F63 FDE0      SBRC	R30,0
    0F64 9508      RET
    0F65 9169      LD	R22,Y+
    0F66 9179      LD	R23,Y+
    0F67 FDE1      SBRC	R30,1
    0F68 9508      RET
    0F69 90A9      LD	R10,Y+
    0F6A 90B9      LD	R11,Y+
    0F6B FDE2      SBRC	R30,2
    0F6C 9508      RET
    0F6D 90C9      LD	R12,Y+
    0F6E 90D9      LD	R13,Y+
    0F6F FDE3      SBRC	R30,3
    0F70 9508      RET
    0F71 90E9      LD	R14,Y+
    0F72 90F9      LD	R15,Y+
    0F73 9508      RET
push_gset2:
    0F74 937A      ST	R23,-Y
    0F75 936A      ST	R22,-Y
    0F76 CFE6      RJMP	push_gset1
push_gset3:
    0F77 92BA      ST	R11,-Y
    0F78 92AA      ST	R10,-Y
    0F79 CFFA      RJMP	push_gset2
push_gset4:
    0F7A 92DA      ST	R13,-Y
    0F7B 92CA      ST	R12,-Y
    0F7C CFFA      RJMP	push_gset3
push_gset5:
    0F7D 92FA      ST	R15,-Y
    0F7E 92EA      ST	R14,-Y
    0F7F CFFA      RJMP	push_gset4
pop_gset5:
    0F80 27EE      CLR	R30
    0F81 CFDF      RJMP	pop
xicall:
    0F82 920A      ST	R0,-Y
    0F83 95C8      LPM
    0F84 920A      ST	R0,-Y
    0F85 9631      ADIW	R30,1
    0F86 95C8      LPM
    0F87 2DF0      MOV	R31,R0
    0F88 91E9      LD	R30,Y+
    0F89 9009      LD	R0,Y+
    0F8A 9409      IJMP

⌨️ 快捷键说明

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