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

📄 main.lst

📁 atmel公司atmega单片机bootloader的源代码
💻 LST
📖 第 1 页 / 共 5 页
字号:
   \   000002B6   E0E2               LDI     R30, 2
   \   000002B8   CFE0               RJMP    ??main_32
   \                     ??main_37:
   \   000002BA   3503               CPI     R16, 83
   \   000002BC   F4A1               BRNE    ??main_39
   \   000002BE   E401               LDI     R16, 65
   \   000002C0   ........           CALL    sendchar
   \   000002C4   E506               LDI     R16, 86
   \   000002C6   ........           CALL    sendchar
   \   000002CA   E502               LDI     R16, 82
   \   000002CC   ........           CALL    sendchar
   \   000002D0   E402               LDI     R16, 66
   \   000002D2   ........           CALL    sendchar
   \   000002D6   E40F               LDI     R16, 79
   \   000002D8   ........           CALL    sendchar
   \   000002DC   E40F               LDI     R16, 79
   \   000002DE   ........           CALL    sendchar
   \   000002E2   E504               LDI     R16, 84
   \   000002E4   CEA2               RJMP    ??main_3
   \                     ??main_39:
   \   000002E6   3506               CPI     R16, 86
   \   000002E8   F429               BRNE    ??main_40
   \   000002EA   E301               LDI     R16, 49
   \   000002EC   ........           CALL    sendchar
   \   000002F0   E305               LDI     R16, 53
   \   000002F2   CE9B               RJMP    ??main_3
   \                     ??main_40:
   \   000002F4   3703               CPI     R16, 115
   \   000002F6   F441               BRNE    ??main_41
   \   000002F8   E001               LDI     R16, 1
   \   000002FA   ........           CALL    sendchar
   \   000002FE   E908               LDI     R16, 152
   \   00000300   ........           CALL    sendchar
   \   00000304   E10E               LDI     R16, 30
   \   00000306   CE91               RJMP    ??main_3
   \                     ??main_41:
   \   00000308   310B               CPI     R16, 27
   \   0000030A   F409               BRNE    $+2+2
   \   0000030C   CE90               RJMP    ??main_0
   \   0000030E   E30F               LDI     R16, 63
   \   00000310   CE8C               RJMP    ??main_3
    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    ?PROLOGUE10_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   50D1               SUBI    R29, 1
   \   00000006   0138               MOVW    R7:R6, R17:R16
   \   00000008   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')
   \   0000000A   3425               CPI     R18, 69
   \   0000000C   F009               BREQ    $+2+2
   \   0000000E   C046               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++)
   \   00000010   E080               LDI     R24, 0
   \   00000012   E090               LDI     R25, 0
   \   00000014   E0A0               LDI     R26, 0
   \   00000016   E0B0               LDI     R27, 0
   \   00000018   C00B               RJMP    ??BlockLoad_1
    386          			buffer[tempaddress] = recchar();
   \                     ??BlockLoad_2:
   \   0000001A   ........           CALL    recchar
   \   0000001E   01FE               MOVW    R31:R30, R29:R28
   \   00000020   019C               MOVW    R19:R18, R25:R24
   \   00000022   0FE2               ADD     R30, R18
   \   00000024   1FF3               ADC     R31, R19
   \   00000026   8300               ST      Z, R16
   \   00000028   5F8F               SUBI    R24, 255
   \   0000002A   4F9F               SBCI    R25, 255
   \   0000002C   4FAF               SBCI    R26, 255
   \   0000002E   4FBF               SBCI    R27, 255
   \                     ??BlockLoad_1:
   \   00000030   E060               LDI     R22, 0
   \   00000032   1586               CP      R24, R6
   \   00000034   0597               CPC     R25, R7
   \   00000036   07A6               CPC     R26, R22
   \   00000038   07B6               CPC     R27, R22
   \   0000003A   F37C               BRLT    ??BlockLoad_2
    387          
    388          		/* Then program the EEPROM */
    389          		_WAIT_FOR_SPM();
   \                     ??BlockLoad_3:
   \   0000003C   B707               IN      R16, 0x37
   \   0000003E   2F10               MOV     R17, R16
   \   00000040   FD10               SBRC    R17, 0
   \   00000042   CFFC               RJMP    ??BlockLoad_3
    390          		for( tempaddress=0; tempaddress < size; tempaddress++)
   \   00000044   E080               LDI     R24, 0
   \   00000046   E090               LDI     R25, 0
   \   00000048   E0A0               LDI     R26, 0
   \   0000004A   E0B0               LDI     R27, 0
   \   0000004C   C020               RJMP    ??BlockLoad_4
    391          		{
    392          			EEARL = *address; // Setup EEPROM address
   \                     ??BlockLoad_5:
   \   0000004E   01F2               MOVW    R31:R30, R5:R4
   \   00000050   8100               LD      R16, Z
   \   00000052   BD01               OUT     0x21, R16
    393          			EEARH = ((*address) >> 8);
   \   00000054   8111               LDD     R17, Z+1
   \   00000056   BD12               OUT     0x22, R17
    394          			EEDR = buffer[tempaddress]; // Get byte.
   \   00000058   01FE               MOVW    R31:R30, R29:R28
   \   0000005A   018C               MOVW    R17:R16, R25:R24
   \   0000005C   0FE0               ADD     R30, R16
   \   0000005E   1FF1               ADC     R31, R17
   \   00000060   8100               LD      R16, Z
   \   00000062   BD00               OUT     0x20, R16
    395          			EECR |= (1<<EEMWE); // Write byte.
   \   00000064   9AFA               SBI     0x1F, 0x02
    396          			EECR |= (1<<EEWE);
   \   00000066   9AF9               SBI     0x1F, 0x01
    397          			while (EECR & (1<<EEWE)) // Wait for write operation to finish.
   \                     ??BlockLoad_6:
   \   00000068   99F9               SBIC    0x1F, 0x01
   \   0000006A   CFFE               RJMP    ??BlockLoad_6
    398          				;
    399          
    400          			(*address)++; // Select next EEPROM byte
   \   0000006C   01F2               MOVW    R31:R30, R5:R4
   \   0000006E   8100               LD      R16, Z
   \   00000070   8111               LDD     R17, Z+1
   \   00000072   8122               LDD     R18, Z+2
   \   00000074   8133               LDD     R19, Z+3
   \   00000076   5F0F               SUBI    R16, 255
   \   00000078   4F1F               SBCI    R17, 255
   \   0000007A   4F2F               SBCI    R18, 255
   \   0000007C   4F3F               SBCI    R19, 255
   \   0000007E   8300               ST      Z, R16
   \   00000080   8311               STD     Z+1, R17
   \   00000082   8322               STD     Z+2, R18
   \   00000084   8333               STD     Z+3, R19
    401          		}
   \   00000086   5F8F               SUBI    R24, 255
   \   00000088   4F9F               SBCI    R25, 255
   \   0000008A   4FAF               SBCI    R26, 255
   \   0000008C   4FBF               SBCI    R27, 255
   \                     ??BlockLoad_4:
   \   0000008E   1586               CP      R24, R6
   \   00000090   0597               CPC     R25, R7
   \   00000092   07A6               CPC     R26, R22
   \   00000094   07B6               CPC     R27, R22
   \   00000096   F2DC               BRLT    ??BlockLoad_5
    402          
    403          		return '\r'; // Report programming OK
   \                     ??BlockLoad_7:
   \   00000098   E00D               LDI     R16, 13
   \   0000009A   C05D               RJMP    ??BlockLoad_8
    404          	}
    405          
    406          	// Flash memory type.
    407          	else if(mem=='F')
   \                     ??BlockLoad_0:
   \   0000009C   3426               CPI     R18, 70
   \   0000009E   F009               BREQ    $+2+2
   \   000000A0   C059               RJMP    ??BlockLoad_9
    408          	{ // NOTE: For flash programming, 'address' is given in words.
    409          		(*address) <<= 1; // Convert address to bytes temporarily.
   \   000000A2   01F2               MOVW    R31:R30, R5:R4
   \   000000A4   8100               LD      R16, Z
   \   000000A6   8111               LDD     R17, Z+1
   \   000000A8   8122               LDD     R18, Z+2
   \   000000AA   8133               LDD     R19, Z+3
   \   000000AC   0F00               LSL     R16
   \   000000AE   1F11               ROL     R17
   \   000000B0   1F22               ROL     R18
   \   000000B2   1F33               ROL     R19
   \   000000B4   8300               ST      Z, R16
   \   000000B6   8311               STD     Z+1, R17
   \   000000B8   8322               STD     Z+2, R18
   \   000000BA   8333               STD     Z+3, R19
    410          		tempaddress = (*address);  // Store address in page.
   \   000000BC   8180               LD      R24, Z
   \   000000BE   8191               LDD     R25, Z+1
   \   000000C0   81A2               LDD     R26, Z+2
   \   000000C2   81B3               LDD     R27, Z+3
    411          
    412          		do
    413          		{
    414          			data = recchar();
   \                     ??BlockLoad_10:
   \   000000C4   ........           CALL    recchar
   \   000000C8   2E80               MOV     R8, R16
   \   000000CA   2499               CLR     R9
    415          			data |= (recchar() << 8);
   \   000000CC   ........           CALL    recchar
   \   000000D0   2A90               OR      R9, R16
    416          #pragma diag_suppress=Pe1053 // Suppress warning for conversion from long-type address to flash ptr.
    417          			_FILL_TEMP_WORD(*address,data);
   \   000000D2   E001               LDI     R16, 1
   \   000000D4   01F2               MOVW    R31:R30, R5:R4
   \   000000D6   8140               LD      R20, Z
   \   000000D8   8151               LDD     R21, Z+1
   \   000000DA   8162               LDD     R22, Z+2
   \   000000DC   01FA               MOVW    R31:R30, R21:R20
   \   000000DE   BF6B               OUT     0x3B, R22
   \   000000E0   0104               MOVW    R1:R0, R9:R8
   \   000000E2   BF07               OUT     0x37, R16
   \   000000E4   95E8               SPM
    418          #pragma diag_default=Pe1053 // Back to default.
    419          			(*address)+=2; // Select next word in memory.
   \   000000E6   01F2               MOVW    R31:R30, R5:R4
   \   000000E8   8100               LD      R16, Z
   \   000000EA   8111               LDD     R17, Z+1
   \   000000EC   8122               LDD     R18, Z+2
   \   000000EE   8133               LDD     R19, Z+3
   \   000000F0   5F0E               SUBI    R16, 254
   \   000000F2   4F1F               SBCI    R17, 255
   \   000000F4   4F2F               SBCI    R18, 255
   \   000000F6   4F3F               SBCI    R19, 255
   \   000000F8   8300               ST      Z, R16
   \   000000FA   8311               STD     Z+1, R17
   \   000000FC   8322               STD     Z+2, R18
   \   000000FE   8333               STD     Z+3, R19
    420          			size -= 2; // Reduce number of bytes to write by two.
   \   00000100   EF0E               LDI     R16, 254
   \   00000102   0E60               ADD     R6, R16
   \   00000104   EF0F               LDI     R16, 255
   \   00000106   1E70               ADC     R7, R16
    421          		} while(size); // Loop until all bytes written.
   \   00000108   2D06               MOV     R16, R6
   \   0000010A   2907               OR      R16, R7
   \   0000010C   F6D9               BRNE    ??BlockLoad_10
    422          
    423          		if( tempaddress < (APP_END) ) { // Protect bootloader area.
   \   0000010E   3080               CPI     R24, 0
   \   00000110   EF00               LDI     R16, 240
   \   00000112   0790               CPC     R25, R16
   \   00000114   E003               LDI     R16, 3
   \   00000116   07A0               CPC     R26, R16
   \   00000118   E000               LDI     R16, 0
   \   0000011A   07B0               CPC     R27, R16
   \   0000011C   F44C               BRGE    ??BlockLoad_11
    424          #pragma diag_suppress=Pe1053 // Suppress warning for conversion from long-type address to flash ptr.
    425          			_PAGE_WRITE(tempaddress);
   \   0000011E   E005               LDI     R16, 5
   \   00000120   01FC               MOVW    R31:R30, R25:R24
   \   00000122   BFAB               OUT     0x3B, R26
   \   00000124   BF07               OUT     0x37, R16

⌨️ 快捷键说明

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