📄 m8iap.lst
字号:
__start:
__text_start:
0E43 E001 LDI R16,1
0E44 BF05 OUT 0x35,R16
0E45 E002 LDI R16,2
0E46 BF05 OUT 0x35,R16
0E47 E5CF LDI R28,0x5F
0E48 E0D4 LDI R29,4
0E49 BFCD OUT 0x3D,R28
0E4A BFDE OUT 0x3E,R29
0E4B 52C0 SUBI R28,0x20
0E4C 40D0 SBCI R29,0
0E4D EA0A LDI R16,0xAA
0E4E 8308 STD Y+0,R16
0E4F 2400 CLR R0
0E50 EBEF LDI R30,0xBF
0E51 E0F0 LDI R31,0
0E52 E010 LDI R17,0
0E53 3BEF CPI R30,0xBF
0E54 07F1 CPC R31,R17
0E55 F011 BEQ 0x0E58
0E56 9201 ST R0,Z+
0E57 CFFB RJMP 0x0E53
0E58 8300 STD Z+0,R16
0E59 E2E6 LDI R30,0x26
0E5A E1FC LDI R31,0x1C
0E5B E6A0 LDI R26,0x60
0E5C E0B0 LDI R27,0
0E5D E11C LDI R17,0x1C
0E5E 38E5 CPI R30,0x85
0E5F 07F1 CPC R31,R17
0E60 F021 BEQ 0x0E65
0E61 95C8 LPM
0E62 9631 ADIW R30,1
0E63 920D ST R0,X+
0E64 CFF9 RJMP 0x0E5E
0E65 D022 RCALL _main
_exit:
0E66 CFFF RJMP _exit
FILE: D:\AVR_Demo\M8IAP\Source\main.c
(0001) /*****************************************************************************
(0002) *
(0003) * Copyright (C) 1996-1998 Atmel Corporation
(0004) *
(0005) * File : main.c
(0006) * Compiler : IAR 1.51B
(0007) * Output size : 505 bytes (size optimized)
(0008) * Created : 16-jun-99
(0009) * Modified : 5-jan-2000
(0010) * Last modified : 16-may-2001 by jll
(0011) *
(0012) * Support mail : avr@atmel.com
(0013) *
(0014) * Description : This Program allows an AVR with bootloader capabilities to
(0015) * Read/write its own Flash/EEprom. To enter Programming mode
(0016) * PD2 is checked, it this pin is pulled low, programming mode
(0017) * is entered. If not, normal execution is done from $0000
(0018) * "reset" vector in Application area.
(0019) * The PD2 pin should be pulled HIGH by an external Pull-up
(0020) * resistor.
(0021) *
(0022) * Other info : Code must be modified to use this specific code with devices
(0023) * other than ATmega161. Following change should be made:
(0024) * -Specify device in define list (e.g. _ATMEGA163)
(0025) *
(0026) * When using this code with (future) parts other than ATmega32,
(0027) * ATmega161 and ATmega163, it will be necessary to change more
(0028) * than the device name. The changes that should be made is:
(0029) * -Device name
(0030) * -Device signature and memory settings (defines.h)
(0031) * -Device code
(0032) * -Linker file
(0033) *
(0034) * In general the linker file should always be verifyed to match
(0035) * the used part's boot address and size. Note that memory size
(0036) * is specified in bytes in the linker file.
(0037) ****************************************************************************/
(0038) #include "defines.h"
(0039) #include "serial.h"
(0040) #include "assembly.h"
(0041)
(0042) void Delay(unsigned int i)
(0043) {
(0044) while(i--) ;
_Delay:
i --> R16
0E67 0118 MOVW R2,R16
0E68 5001 SUBI R16,1
0E69 4010 SBCI R17,0
0E6A 2022 TST R2
0E6B F7D9 BNE 0x0E67
0E6C 2033 TST R3
0E6D F7C9 BNE 0x0E67
(0045) }
0E6E 9508 RET
(0046)
(0047) void Display_IAP(void)
(0048) {
(0049) PORTD = 0xEF;
_Display_IAP:
0E6F EE8F LDI R24,0xEF
0E70 BB82 OUT 0x12,R24
(0050) PORTB = 0xF9;
0E71 EF89 LDI R24,0xF9
0E72 BB88 OUT 0x18,R24
(0051) Delay(6000);
0E73 E700 LDI R16,0x70
0E74 E117 LDI R17,0x17
0E75 DFF1 RCALL _Delay
(0052) PORTD = 0xB7;
0E76 EB87 LDI R24,0xB7
0E77 BB82 OUT 0x12,R24
(0053) PORTB = 0x08;
0E78 E088 LDI R24,0x8
0E79 BB88 OUT 0x18,R24
(0054) Delay(6000);
0E7A E700 LDI R16,0x70
0E7B E117 LDI R17,0x17
0E7C DFEA RCALL _Delay
(0055) PORTD = 0xBB;
0E7D EB8B LDI R24,0xBB
0E7E BB82 OUT 0x12,R24
(0056) PORTB = 0xCC;
0E7F EC8C LDI R24,0xCC
0E80 BB88 OUT 0x18,R24
(0057) }
0E81 9508 RET
_timer0_ovf_isr:
0E82 D11B RCALL push_lset
(0058)
(0059) #pragma interrupt_handler timer0_ovf_isr:10
(0060) void timer0_ovf_isr(void)
(0061) {
(0062) TCNT0 = 0x8D; //reload counter value
0E83 E88D LDI R24,0x8D
0E84 BF82 OUT 0x32,R24
(0063) Display_IAP();
0E85 DFE9 RCALL _Display_IAP
(0064) }
0E86 D12E RCALL pop_lset
0E87 9518 RETI
(0065) void main(void)
(0066) {
(0067) unsigned int intval,address,data,page_address;
(0068) unsigned char val, page_size;
(0069) Delay(10000);
_main:
intval --> Y+1
val --> R20
address --> R22
data --> R14
page_size --> R10
page_address --> R12
0E88 E100 LDI R16,0x10
0E89 E217 LDI R17,0x27
0E8A DFDC RCALL _Delay
(0070) SerialInit();
0E8B D097 RCALL _SerialInit
(0071) Delay(50000);
0E8C E500 LDI R16,0x50
0E8D EC13 LDI R17,0xC3
0E8E DFD8 RCALL _Delay
(0072) sendstr("富友勤IAP V1.0 ");
0E8F EA0F LDI R16,0xAF
0E90 E010 LDI R17,0
0E91 D0A1 RCALL _sendstr
(0073) PORTB = 0xFF;
0E92 EF8F LDI R24,0xFF
0E93 BB88 OUT 0x18,R24
(0074) DDRB = 0xFF;
0E94 BB87 OUT 0x17,R24
(0075) PORTC = 0x7F; //m103 output only
0E95 E78F LDI R24,0x7F
0E96 BB85 OUT 0x15,R24
(0076) DDRC = 0x79;
0E97 E789 LDI R24,0x79
0E98 BB84 OUT 0x14,R24
(0077) PORTD = 0xFF;
0E99 EF8F LDI R24,0xFF
0E9A BB82 OUT 0x12,R24
(0078) DDRD = 0xFC;
0E9B EF8C LDI R24,0xFC
0E9C BB81 OUT 0x11,R24
(0079) val=UDR;
0E9D B14C IN R20,0x0C
(0080) val=reccharcommand2();
0E9E D0B8 RCALL _reccharcommand2
0E9F 2F40 MOV R20,R16
(0081) if(val=='I') //Chip erase
0EA0 3409 CPI R16,0x49
0EA1 F409 BNE 0x0EA3
(0082) goto Binger;
0EA2 C003 RJMP 0x0EA6
(0083)
(0084) //UCSRB = 0x00; //disable while setting baud rate
(0085) //UCSRA = 0x00;
(0086)
(0087) PROGPORT |= PROGCTRL; //enable pull-up on PROGCTRL line on PROGPORT
0EA3 9A92 SBI 0x12,2
(0088) if (PROGMODE)
0EA4 9982 SBIC 0x10,2
0EA5 C078 RJMP 0x0F1E
(0089) {
(0090) Binger:
(0091)
(0092) sendstr("富友勤 ATMEGA8 DEMO");
0EA6 E90B LDI R16,0x9B
0EA7 E010 LDI R17,0
0EA8 D08A RCALL _sendstr
(0093) sendstr("Start IAP");
0EA9 E901 LDI R16,0x91
0EAA E010 LDI R17,0
0EAB D087 RCALL _sendstr
(0094) for(;;)
(0095) {
(0096) Display_IAP();
0EAC DFC2 RCALL _Display_IAP
(0097) val=reccharcommand();
0EAD D099 RCALL _reccharcommand
0EAE 2F40 MOV R20,R16
(0098) if(val=='W') //Chip erase
0EAF 3507 CPI R16,0x57
0EB0 F009 BEQ 0x0EB2
0EB1 C053 RJMP 0x0F05
(0099) {
(0100) sendstr("Start Write ");
0EB2 E804 LDI R16,0x84
0EB3 E010 LDI R17,0
0EB4 D07E RCALL _sendstr
(0101) page_address=recchar();
0EB5 D08D RCALL _recchar
0EB6 2EC0 MOV R12,R16
0EB7 24DD CLR R13
(0102) page_address|=recchar()<<8;
0EB8 D08A RCALL _recchar
0EB9 2E20 MOV R2,R16
0EBA 2433 CLR R3
0EBB 2C32 MOV R3,R2
0EBC 2422 CLR R2
0EBD 28C2 OR R12,R2
0EBE 28D3 OR R13,R3
(0103) for(address=0;address < APP_END;address += PAGESIZE) //Application section = 60 pages
0EBF 2766 CLR R22
0EC0 2777 CLR R23
0EC1 C03A RJMP 0x0EFC
(0104) {
(0105) for(page_size=0;page_size < PAGESIZE;page_size += 2) //Application section = 60 pages
0EC2 24AA CLR R10
0EC3 C02F RJMP 0x0EF3
(0106) {
(0107) if(page_address!=0)
0EC4 20CC TST R12
0EC5 F411 BNE 0x0EC8
0EC6 20DD TST R13
0EC7 F021 BEQ 0x0ECC
(0108) data=recchar();
0EC8 D07A RCALL _recchar
0EC9 2EE0 MOV R14,R16
0ECA 24FF CLR R15
0ECB C003 RJMP 0x0ECF
(0109) else
(0110) data=0xFF;
0ECC EF8F LDI R24,0xFF
0ECD E090 LDI R25,0
0ECE 017C MOVW R14,R24
(0111) if(page_address)
0ECF 20CC TST R12
0ED0 F411 BNE 0x0ED3
0ED1 20DD TST R13
0ED2 F019 BEQ 0x0ED6
(0112) page_address--;
0ED3 01C6 MOVW R24,R12
0ED4 9701 SBIW R24,1
0ED5 016C MOVW R12,R24
(0113) if(page_address!=0)
0ED6 20CC TST R12
0ED7 F411 BNE 0x0EDA
0ED8 20DD TST R13
0ED9 F041 BEQ 0x0EE2
(0114) data|=recchar()<<8;
0EDA D068 RCALL _recchar
0EDB 2E20 MOV R2,R16
0EDC 2433 CLR R3
0EDD 2C32 MOV R3,R2
0EDE 2422 CLR R2
0EDF 28E2 OR R14,R2
0EE0 28F3 OR R15,R3
0EE1 C003 RJMP 0x0EE5
(0115) else
(0116) data|=0xFF<<8;
0EE2 01C7 MOVW R24,R14
0EE3 6F9F ORI R25,0xFF
0EE4 017C MOVW R14,R24
(0117) if(page_address)
0EE5 20CC TST R12
0EE6 F411 BNE 0x0EE9
0EE7 20DD TST R13
0EE8 F019 BEQ 0x0EEC
(0118) page_address--;
0EE9 01C6 MOVW R24,R12
0EEA 9701 SBIW R24,1
0EEB 016C MOVW R12,R24
(0119) fill_temp_buffer(data,(page_size)); //call asm routine.
0EEC 2D2A MOV R18,R10
0EED 2733 CLR R19
0EEE 0187 MOVW R16,R14
0EEF D07E RCALL _fill_temp_buffer
0EF0 2D8A MOV R24,R10
0EF1 5F8E SUBI R24,0xFE
0EF2 2EA8 MOV R10,R24
0EF3 2D8A MOV R24,R10
0EF4 3480 CPI R24,0x40
0EF5 F408 BCC 0x0EF7
0EF6 CFCD RJMP 0x0EC4
(0120) }
(0121) write_page((address),0x05);
0EF7 E025 LDI R18,5
0EF8 018B MOVW R16,R22
0EF9 D06D RCALL _write_page
0EFA 5C60 SUBI R22,0xC0
0EFB 4F7F SBCI R23,0xFF
0EFC 3060 CPI R22,0
0EFD E1EC LDI R30,0x1C
0EFE 077E CPC R23,R30
0EFF F408 BCC 0x0F01
0F00 CFC1 RJMP 0x0EC2
(0122) }
(0123) sendstr("End Write ");
0F01 E709 LDI R16,0x79
0F02 E010 LDI R17,0
0F03 D02F RCALL _sendstr
(0124) }
0F04 CFA7 RJMP 0x0EAC
(0125)
(0126) else if(val=='e') //Chip erase
0F05 3645 CPI R20,0x65
0F06 F009 BEQ 0x0F08
0F07 CFA4 RJMP 0x0EAC
(0127) {
(0128) sendstr("Start Erase ");
0F08 E60C LDI R16,0x6C
0F09 E010 LDI R17,0
0F0A D028 RCALL _sendstr
(0129)
(0130) for(address=0;address < APP_END;address += PAGESIZE) //Application section = 60 pages
0F0B 2766 CLR R22
0F0C 2777 CLR R23
0F0D C008 RJMP 0x0F16
(0131) {Delay(20000);
0F0E E200 LDI R16,0x20
0F0F E41E LDI R17,0x4E
0F10 DF56 RCALL _Delay
(0132) write_page(address,0x03); //Perform page erase
0F11 E023 LDI R18,3
0F12 018B MOVW R16,R22
0F13 D053 RCALL _write_page
0F14 5C60 SUBI R22,0xC0
0F15 4F7F SBCI R23,0xFF
0F16 3060 CPI R22,0
0F17 E1EC LDI R30,0x1C
0F18 077E CPC R23,R30
0F19 F3A0 BCS 0x0F0E
(0133) }
(0134) sendstr("End Erase ");
0F1A E600 LDI R16,0x60
0F1B E010 LDI R17,0
0F1C D016 RCALL _sendstr
0F1D CF8E RJMP 0x0EAC
(0135) }
(0136)
(0137)
(0138) }
(0139) }
(0140) else
(0141) { asm("JMP 0x0000") ;
0F1E 940C0000 JMP 0x0
(0142) UCSRB = 0x00;
0F20 2422 CLR R2
0F21 B82A OUT 0x0A,R2
(0143) }
(0144)
(0145) }
0F22 9508 RET
FILE: D:\AVR_Demo\M8IAP\Source\serial.c
(0001) #include "defines.h"
(0002) void SerialInit(void)
(0003) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -