📄 main.lst
字号:
\ 00000376 CE4F RJMP ??main_1
276 }
277 #endif
278
279 #ifndef REMOVE_AVRPROG_SUPPORT
280 // Enter and leave programming mode.
281 else if((val=='P')||(val=='L'))
282 {
283 sendchar('\r'); // Nothing special to do, just answer OK.
284 }
285
286
287 // Exit bootloader.
288 else if(val=='E')
289 {
290 _WAIT_FOR_SPM();
291 _ENABLE_RWW_SECTION();
292 sendchar('\r');
293 funcptr(); // Jump to Reset vector 0x0000 in Application Section.
294 }
295
296
297 // Get programmer type.
298 else if (val=='p')
299 {
300 sendchar('S'); // Answer 'SERIAL'.
301 }
302
303
304 // Return supported device codes.
305 else if(val=='t')
306 {
307 sendchar( PARTCODE ); // Supports only this device, of course.
308 sendchar( 0 ); // Send list terminator.
309 }
310
311
312 // Set LED, clear LED and set device type.
313 else if((val=='x')||(val=='y')||(val=='T'))
314 {
315 recchar(); // Ignore the command and it's parameter.
316 sendchar('\r'); // Send OK back.
317 }
318 #endif
319
320 // Return programmer identifier.
321 else if(val=='S')
\ ??main_32:
\ 00000378 35A3 CPI R26, 83
\ 0000037A F4B1 BRNE ??main_34
322 {
323 sendchar('A'); // Return 'AVRBOOT'.
\ 0000037C E401 LDI R16, 65
\ 0000037E ........ CALL sendchar
324 sendchar('V'); // Software identifier (aka programmer signature) is always 7 characters.
\ 00000382 E506 LDI R16, 86
\ 00000384 ........ CALL sendchar
325 sendchar('R');
\ 00000388 E502 LDI R16, 82
\ 0000038A ........ CALL sendchar
326 sendchar('B');
\ 0000038E E402 LDI R16, 66
\ 00000390 ........ CALL sendchar
327 sendchar('O');
\ 00000394 E40F LDI R16, 79
\ 00000396 ........ CALL sendchar
328 sendchar('O');
\ 0000039A E40F LDI R16, 79
\ 0000039C ........ CALL sendchar
329 sendchar('T');
\ 000003A0 E504 LDI R16, 84
\ 000003A2 ........ CALL sendchar
\ 000003A6 CE37 RJMP ??main_1
330 }
331
332
333 // Return software version.
334 else if(val=='V')
\ ??main_34:
\ 000003A8 35A6 CPI R26, 86
\ 000003AA F439 BRNE ??main_35
335 {
336 sendchar('1');
\ 000003AC E301 LDI R16, 49
\ 000003AE ........ CALL sendchar
337 sendchar('5');
\ 000003B2 E305 LDI R16, 53
\ 000003B4 ........ CALL sendchar
\ 000003B8 CE2E RJMP ??main_1
338 }
339
340
341 // Return signature bytes.
342 else if(val=='s')
\ ??main_35:
\ 000003BA 37A3 CPI R26, 115
\ 000003BC F451 BRNE ??main_36
343 {
344 sendchar( SIGNATURE_BYTE_3 );
\ 000003BE E001 LDI R16, 1
\ 000003C0 ........ CALL sendchar
345 sendchar( SIGNATURE_BYTE_2 );
\ 000003C4 E908 LDI R16, 152
\ 000003C6 ........ CALL sendchar
346 sendchar( SIGNATURE_BYTE_1 );
\ 000003CA E10E LDI R16, 30
\ 000003CC ........ CALL sendchar
\ 000003D0 CE22 RJMP ??main_1
347 }
348
349
350 // The last command to accept is ESC (synchronization).
351 else if(val!=0x1b) // If not ESC, then it is unrecognized...
\ ??main_36:
\ 000003D2 31AB CPI R26, 27
\ 000003D4 F409 BRNE $+2+2
\ 000003D6 CE1F RJMP ??main_1
352 {
353 sendchar('?');
\ 000003D8 E30F LDI R16, 63
\ 000003DA ........ CALL sendchar
\ 000003DE CE1B RJMP ??main_1
354 }
355 } // end: for(;;)
356 }
357 else
358 {
359 _WAIT_FOR_SPM();
\ ??main_0:
\ 000003E0 B707 IN R16, 0x37
\ 000003E2 2F10 MOV R17, R16
\ 000003E4 FD10 SBRC R17, 0
\ 000003E6 CFFC RJMP ??main_0
360 _ENABLE_RWW_SECTION();
\ 000003E8 E111 LDI R17, 17
\ 000003EA E000 LDI R16, 0
\ 000003EC 2E00 MOV R0, R16
\ 000003EE BF17 OUT 0x37, R17
\ 000003F0 95E8 SPM
361 funcptr(); // Jump to Reset vector 0x0000 in Application Section.
\ 000003F2 01F2 MOVW R31:R30, R5:R4
\ 000003F4 BE6C OUT 0x3C, R6
\ 000003F6 9519 EICALL
362 }
363 } // end: main
\ 000003F8 9624 ADIW R29:R28, 4
\ 000003FA 9508 RET
364
365
366 #ifndef REMOVE_BLOCK_SUPPORT
367 /*! \brief Write block from serial port and program mem.
368 *
369 * Read 'size' bytes from serial port and write to EPROM/Flash
370 * memory 'address'.
371 * If 'mem' == 'E', then 'address' gives
372 * the byte address in EEPROM. If 'mem' == 'F', then 'address'
373 * gives the word address in Flash.
374 */
\ In segment FARCODE, align 2, keep-with-next
375 unsigned char BlockLoad(unsigned int size, unsigned char mem, long *address)
\ BlockLoad:
376 {
\ 00000000 ........ CALL ?PROLOGUE11_L09
\ 00000004 REQUIRE ?Register_R4_is_cg_reg
\ 00000004 REQUIRE ?Register_R5_is_cg_reg
\ 00000004 REQUIRE ?Register_R6_is_cg_reg
\ 00000004 REQUIRE ?Register_R7_is_cg_reg
\ 00000004 REQUIRE ?Register_R8_is_cg_reg
\ 00000004 REQUIRE ?Register_R9_is_cg_reg
\ 00000004 REQUIRE ?Register_R10_is_cg_reg
\ 00000004 50D1 SUBI R29, 1
\ 00000006 0148 MOVW R9:R8, R17:R16
\ 00000008 2EA2 MOV R10, R18
\ 0000000A 012A MOVW R5:R4, R21:R20
377 unsigned char buffer[BLOCKSIZE];
378 unsigned int data;
379 long tempaddress;
380
381 // EEPROM memory type.
382 if(mem=='E')
\ 0000000C E405 LDI R16, 69
\ 0000000E 16A0 CP R10, R16
\ 00000010 F009 BREQ $+2+2
\ 00000012 C04D RJMP ??BlockLoad_0
383 {
384 /* Fill buffer first, as EEPROM is too slow to copy with UART speed */
385 for(tempaddress=0;tempaddress<size;tempaddress++)
\ 00000014 E080 LDI R24, 0
\ 00000016 E090 LDI R25, 0
\ 00000018 E0A0 LDI R26, 0
\ 0000001A E0B0 LDI R27, 0
\ ??BlockLoad_1:
\ 0000001C 0184 MOVW R17:R16, R9:R8
\ 0000001E E020 LDI R18, 0
\ 00000020 E030 LDI R19, 0
\ 00000022 1780 CP R24, R16
\ 00000024 0791 CPC R25, R17
\ 00000026 07A2 CPC R26, R18
\ 00000028 07B3 CPC R27, R19
\ 0000002A F464 BRGE ??BlockLoad_2
386 buffer[tempaddress] = recchar();
\ 0000002C ........ CALL recchar
\ 00000030 01FE MOVW R31:R30, R29:R28
\ 00000032 019C MOVW R19:R18, R25:R24
\ 00000034 0FE2 ADD R30, R18
\ 00000036 1FF3 ADC R31, R19
\ 00000038 8300 ST Z, R16
\ 0000003A 5F8F SUBI R24, 255
\ 0000003C 4F9F SBCI R25, 255
\ 0000003E 4FAF SBCI R26, 255
\ 00000040 4FBF SBCI R27, 255
\ 00000042 CFEC RJMP ??BlockLoad_1
387
388 /* Then program the EEPROM */
389 _WAIT_FOR_SPM();
\ ??BlockLoad_2:
\ 00000044 B707 IN R16, 0x37
\ 00000046 2F10 MOV R17, R16
\ 00000048 FD10 SBRC R17, 0
\ 0000004A CFFC RJMP ??BlockLoad_2
390 for( tempaddress=0; tempaddress < size; tempaddress++)
\ 0000004C E080 LDI R24, 0
\ 0000004E E090 LDI R25, 0
\ 00000050 E0A0 LDI R26, 0
\ 00000052 E0B0 LDI R27, 0
\ ??BlockLoad_3:
\ 00000054 0184 MOVW R17:R16, R9:R8
\ 00000056 E020 LDI R18, 0
\ 00000058 E030 LDI R19, 0
\ 0000005A 1780 CP R24, R16
\ 0000005C 0791 CPC R25, R17
\ 0000005E 07A2 CPC R26, R18
\ 00000060 07B3 CPC R27, R19
\ 00000062 F51C BRGE ??BlockLoad_4
391 {
392 EEARL = *address; // Setup EEPROM address
\ 00000064 01F2 MOVW R31:R30, R5:R4
\ 00000066 8100 LD R16, Z
\ 00000068 BD01 OUT 0x21, R16
393 EEARH = ((*address) >> 8);
\ 0000006A 01F2 MOVW R31:R30, R5:R4
\ 0000006C 8111 LDD R17, Z+1
\ 0000006E 2F01 MOV R16, R17
\ 00000070 BD02 OUT 0x22, R16
394 EEDR = buffer[tempaddress]; // Get byte.
\ 00000072 01FE MOVW R31:R30, R29:R28
\ 00000074 018C MOVW R17:R16, R25:R24
\ 00000076 0FE0 ADD R30, R16
\ 00000078 1FF1 ADC R31, R17
\ 0000007A 8100 LD R16, Z
\ 0000007C BD00 OUT 0x20, R16
395 EECR |= (1<<EEMWE); // Write byte.
\ 0000007E 9AFA SBI 0x1F, 0x02
396 EECR |= (1<<EEWE);
\ 00000080 9AF9 SBI 0x1F, 0x01
397 while (EECR & (1<<EEWE)) // Wait for write operation to finish.
\ ??BlockLoad_5:
\ 00000082 99F9 SBIC 0x1F, 0x01
\ 00000084 CFFE RJMP ??BlockLoad_5
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -