📄 demo.lst
字号:
1 .file "demo.c"
2 .arch atmega8
3 __SREG__ = 0x3f
4 __SP_H__ = 0x3e
5 __SP_L__ = 0x3d
6 __tmp_reg__ = 0
7 __zero_reg__ = 1
8 .global __do_copy_data
9 .global __do_clear_bss
11 .text
12 .Ltext0:
67 .global reset
68 .global reset
69 .section .bss
72 reset:
73 0000 0000 .skip 2,0
74 .global g_wPageIndex
75 .global g_wPageIndex
78 g_wPageIndex:
79 0002 0000 .skip 2,0
80 .text
83 .global uart_putc
85 uart_putc:
1:demo.c **** /*
2:demo.c **** LuckyProg Mega8 BootLoader 引导程序 V1.0
3:demo.c ****
4:demo.c **** 文件名 : demo.c
5:demo.c **** 作 者: 芯 艺
6:demo.c **** 更新时间: 2004-08-30
7:demo.c ****
8:demo.c **** CPU : ATMEGA8
9:demo.c **** 时 钟: 4MHz
10:demo.c **** 编 译: WinAVR-20040720
11:demo.c ****
12:demo.c **** E-mail : changfutong@sina.com
13:demo.c **** MSN : changfutong@hotmail.com
14:demo.c **** OICQ : 27796915
15:demo.c **** 欢迎访问: http://BitFu.yeah.net
16:demo.c ****
17:demo.c ****
18:demo.c **** 注:本程序在硬件上调试通过,
19:demo.c **** 与计算机程序LuckyProg Mega8 BootLoader(LuckyProg M8BL)配合使用。
20:demo.c ****
21:demo.c **** */
22:demo.c ****
23:demo.c **** #include <avr/io.h>
24:demo.c **** #include <avr/pgmspace.h>
25:demo.c **** #include <avr/boot.h>
26:demo.c ****
27:demo.c **** #define uchar unsigned char
28:demo.c **** #define uint unsigned int
29:demo.c ****
30:demo.c **** #define FREQ 4
31:demo.c **** #define UART_ACK 0XAA
32:demo.c ****
33:demo.c **** #define PAGE_SIZE 64
34:demo.c ****
35:demo.c **** uint g_wPageIndex=0;
36:demo.c **** uchar g_aPageTemp[PAGE_SIZE];
37:demo.c ****
38:demo.c **** void (*reset)(void)=0x0000;
39:demo.c ****
40:demo.c **** void uart_putc(uchar c)
41:demo.c **** {
87 .LM1:
88 /* prologue: frame size=0 */
89 /* prologue end (size=0) */
90 .L2:
42:demo.c **** while( !(UCSRA & (1<<UDRE)) );
92 .LM2:
93 0000 5D9B sbis 43-0x20,5
94 0002 FECF rjmp .L2
43:demo.c **** UDR=c;
96 .LM3:
97 0004 8CB9 out 44-0x20,r24
98 /* epilogue: frame size=0 */
99 0006 0895 ret
100 /* epilogue end (size=1) */
101 /* function uart_putc size 4 (3) */
104 .global uart_getc
106 uart_getc:
44:demo.c **** }
45:demo.c ****
46:demo.c **** uchar uart_getc(void)
47:demo.c **** {
108 .LM4:
109 /* prologue: frame size=0 */
110 /* prologue end (size=0) */
111 .L6:
48:demo.c **** while( !(UCSRA & (1<<RXC)) );
113 .LM5:
114 0008 5F9B sbis 43-0x20,7
115 000a FECF rjmp .L6
49:demo.c **** return UDR;
117 .LM6:
118 000c 8CB1 in r24,44-0x20
50:demo.c **** }
120 .LM7:
121 000e 9927 clr r25
122 /* epilogue: frame size=0 */
123 0010 0895 ret
124 /* epilogue end (size=1) */
125 /* function uart_getc size 5 (4) */
128 .global WritePage
130 WritePage:
51:demo.c ****
52:demo.c **** void WritePage(void)
53:demo.c **** {
132 .LM8:
133 /* prologue: frame size=0 */
134 0012 0F93 push r16
135 0014 1F93 push r17
136 0016 CF93 push r28
137 /* prologue end (size=3) */
138 0018 00E0 ldi r16,lo8(g_aPageTemp)
139 001a 10E0 ldi r17,hi8(g_aPageTemp)
140 001c CFE3 ldi r28,lo8(63)
141 .L13:
54:demo.c **** uchar i;
55:demo.c ****
56:demo.c **** // 接收当前页面数据
57:demo.c **** for(i=0;i<PAGE_SIZE;i++)
58:demo.c **** g_aPageTemp[i]=uart_getc();
143 .LM9:
144 001e F4DF rcall uart_getc
145 0020 F801 movw r30,r16
146 0022 8193 st Z+,r24
147 0024 8F01 movw r16,r30
149 .LM10:
150 0026 C150 subi r28,lo8(-(-1))
151 0028 C7FF sbrs r28,7
152 002a F9CF rjmp .L13
153 .L14:
154 .LBB2:
59:demo.c ****
60:demo.c **** // 页擦除操作
61:demo.c **** boot_page_erase(g_wPageIndex<<6);
156 .LM11:
157 002c 07B6 in __tmp_reg__,87-0x20
158 002e 00FC sbrc __tmp_reg__,0
159 0030 FDCF rjmp .L14
160 .L17:
161 0032 E199 sbic 60-0x20,1
162 0034 FECF rjmp .L17
163 0036 23E0 ldi r18,lo8(3)
164 0038 4091 0000 lds r20,g_wPageIndex
165 003c 5091 0000 lds r21,(g_wPageIndex)+1
166 0040 CA01 movw r24,r20
167 0042 66E0 ldi r22,6
168 0044 880F 1: lsl r24
169 0046 991F rol r25
170 0048 6A95 dec r22
171 004a E1F7 brne 1b
172 /* #APP */
173 004c FC01 movw r30, r24
174 004e 2093 5700 sts 87, r18
175 0052 E895 spm
176
177 /* #NOAPP */
178 .LBE2:
62:demo.c **** while(boot_rww_busy())
63:demo.c **** boot_rww_enable();
180 .LM12:
181 0054 07B6 in __tmp_reg__,87-0x20
182 0056 06FE sbrs __tmp_reg__,6
183 0058 0CC0 rjmp .L56
184 005a 81E1 ldi r24,lo8(17)
185 .L69:
186 .LBB3:
187 005c 07B6 in __tmp_reg__,87-0x20
188 005e 00FC sbrc __tmp_reg__,0
189 0060 FDCF rjmp .L69
190 .L25:
191 0062 E199 sbic 60-0x20,1
192 0064 FECF rjmp .L25
193 /* #APP */
194 0066 8093 5700 sts 87, r24
195 006a E895 spm
196
197 /* #NOAPP */
198 .LBE3:
199 006c 07B6 in __tmp_reg__,87-0x20
200 006e 06FC sbrc __tmp_reg__,6
201 0070 F5CF rjmp .L69
202 .L56:
64:demo.c ****
65:demo.c **** // 填充缓冲页
66:demo.c **** for(i = 0; i < PAGE_SIZE; i += 2)
204 .LM13:
205 0072 C0E0 ldi r28,lo8(0)
206 0074 61E0 ldi r22,lo8(1)
207 .L70:
208 .LBB4:
67:demo.c **** boot_page_fill((unsigned long)i,*((uint *)(g_aPageTemp +i)));
210 .LM14:
211 0076 07B6 in __tmp_reg__,87-0x20
212 0078 00FC sbrc __tmp_reg__,0
213 007a FDCF rjmp .L70
214 .L35:
215 007c E199 sbic 60-0x20,1
216 007e FECF rjmp .L35
217 0080 8C2F mov r24,r28
218 0082 9927 clr r25
219 0084 FC01 movw r30,r24
220 0086 E050 subi r30,lo8(-(g_aPageTemp))
221 0088 F040 sbci r31,hi8(-(g_aPageTemp))
222 008a 2081 ld r18,Z
223 008c 3181 ldd r19,Z+1
224 /* #APP */
225 008e 0901 movw r0, r18
226 0090 FC01 movw r30, r24
227 0092 6093 5700 sts 87, r22
228 0096 E895 spm
229 0098 1124 clr r1
230
231 /* #NOAPP */
232 .LBE4:
234 .LM15:
235 009a CE5F subi r28,lo8(-(2))
236 009c C034 cpi r28,lo8(64)
237 009e 58F3 brlo .L70
238 .L39:
239 .LBB5:
68:demo.c ****
69:demo.c **** // 页写入操作
70:demo.c **** boot_page_write(g_wPageIndex<<6);
241 .LM16:
242 00a0 07B6 in __tmp_reg__,87-0x20
243 00a2 00FC sbrc __tmp_reg__,0
244 00a4 FDCF rjmp .L39
245 .L42:
246 00a6 E199 sbic 60-0x20,1
247 00a8 FECF rjmp .L42
248 00aa 25E0 ldi r18,lo8(5)
249 00ac CA01 movw r24,r20
250 00ae 36E0 ldi r19,6
251 00b0 880F 1: lsl r24
252 00b2 991F rol r25
253 00b4 3A95 dec r19
254 00b6 E1F7 brne 1b
255 /* #APP */
256 00b8 FC01 movw r30, r24
257 00ba 2093 5700 sts 87, r18
258 00be E895 spm
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -