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

📄 main.lst

📁 atmel公司atmega单片机bootloader的源代码
💻 LST
📖 第 1 页 / 共 5 页
字号:
   \   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 + -