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

📄 main.lst

📁 atmel公司atmega单片机bootloader的源代码
💻 LST
📖 第 1 页 / 共 5 页
字号:
    398          				;
    399          
    400          			(*address)++; // Select next EEPROM byte
   \   00000086   01F2               MOVW    R31:R30, R5:R4
   \   00000088   8100               LD      R16, Z
   \   0000008A   8111               LDD     R17, Z+1
   \   0000008C   8122               LDD     R18, Z+2
   \   0000008E   8133               LDD     R19, Z+3
   \   00000090   5F0F               SUBI    R16, 255
   \   00000092   4F1F               SBCI    R17, 255
   \   00000094   4F2F               SBCI    R18, 255
   \   00000096   4F3F               SBCI    R19, 255
   \   00000098   8300               ST      Z, R16
   \   0000009A   8311               STD     Z+1, R17
   \   0000009C   8322               STD     Z+2, R18
   \   0000009E   8333               STD     Z+3, R19
    401          		}
   \   000000A0   5F8F               SUBI    R24, 255
   \   000000A2   4F9F               SBCI    R25, 255
   \   000000A4   4FAF               SBCI    R26, 255
   \   000000A6   4FBF               SBCI    R27, 255
   \   000000A8   CFD5               RJMP    ??BlockLoad_3
    402          
    403          		return '\r'; // Report programming OK
   \                     ??BlockLoad_4:
   \   000000AA   E00D               LDI     R16, 13
   \   000000AC   C06A               RJMP    ??BlockLoad_6
    404          	}
    405          
    406          	// Flash memory type.
    407          	else if(mem=='F')
   \                     ??BlockLoad_0:
   \   000000AE   E406               LDI     R16, 70
   \   000000B0   16A0               CP      R10, R16
   \   000000B2   F009               BREQ    $+2+2
   \   000000B4   C065               RJMP    ??BlockLoad_7
    408          	{ // NOTE: For flash programming, 'address' is given in words.
    409          		(*address) <<= 1; // Convert address to bytes temporarily.
   \   000000B6   01F2               MOVW    R31:R30, R5:R4
   \   000000B8   8100               LD      R16, Z
   \   000000BA   8111               LDD     R17, Z+1
   \   000000BC   8122               LDD     R18, Z+2
   \   000000BE   8133               LDD     R19, Z+3
   \   000000C0   0F00               LSL     R16
   \   000000C2   1F11               ROL     R17
   \   000000C4   1F22               ROL     R18
   \   000000C6   1F33               ROL     R19
   \   000000C8   01F2               MOVW    R31:R30, R5:R4
   \   000000CA   8300               ST      Z, R16
   \   000000CC   8311               STD     Z+1, R17
   \   000000CE   8322               STD     Z+2, R18
   \   000000D0   8333               STD     Z+3, R19
    410          		tempaddress = (*address);  // Store address in page.
   \   000000D2   01F2               MOVW    R31:R30, R5:R4
   \   000000D4   8100               LD      R16, Z
   \   000000D6   8111               LDD     R17, Z+1
   \   000000D8   8122               LDD     R18, Z+2
   \   000000DA   8133               LDD     R19, Z+3
   \   000000DC   01C8               MOVW    R25:R24, R17:R16
   \   000000DE   01D9               MOVW    R27:R26, R19:R18
    411          
    412          		do
    413          		{
    414          			data = recchar();
   \                     ??BlockLoad_8:
   \   000000E0   ........           CALL    recchar
   \   000000E4   E010               LDI     R17, 0
   \   000000E6   0138               MOVW    R7:R6, R17:R16
    415          			data |= (recchar() << 8);
   \   000000E8   ........           CALL    recchar
   \   000000EC   2F30               MOV     R19, R16
   \   000000EE   E020               LDI     R18, 0
   \   000000F0   2A62               OR      R6, R18
   \   000000F2   2A73               OR      R7, R19
    416          #pragma diag_suppress=Pe1053 // Suppress warning for conversion from long-type address to flash ptr.
    417          			_FILL_TEMP_WORD(*address,data);
   \   000000F4   E041               LDI     R20, 1
   \   000000F6   01F2               MOVW    R31:R30, R5:R4
   \   000000F8   8100               LD      R16, Z
   \   000000FA   8111               LDD     R17, Z+1
   \   000000FC   8122               LDD     R18, Z+2
   \   000000FE   01F8               MOVW    R31:R30, R17:R16
   \   00000100   2F32               MOV     R19, R18
   \   00000102   BF3B               OUT     0x3B, R19
   \   00000104   0103               MOVW    R1:R0, R7:R6
   \   00000106   BF47               OUT     0x37, R20
   \   00000108   95E8               SPM
    418          #pragma diag_default=Pe1053 // Back to default.
    419          			(*address)+=2; // Select next word in memory.
   \   0000010A   01F2               MOVW    R31:R30, R5:R4
   \   0000010C   8100               LD      R16, Z
   \   0000010E   8111               LDD     R17, Z+1
   \   00000110   8122               LDD     R18, Z+2
   \   00000112   8133               LDD     R19, Z+3
   \   00000114   5F0E               SUBI    R16, 254
   \   00000116   4F1F               SBCI    R17, 255
   \   00000118   4F2F               SBCI    R18, 255
   \   0000011A   4F3F               SBCI    R19, 255
   \   0000011C   8300               ST      Z, R16
   \   0000011E   8311               STD     Z+1, R17
   \   00000120   8322               STD     Z+2, R18
   \   00000122   8333               STD     Z+3, R19
    420          			size -= 2; // Reduce number of bytes to write by two.
   \   00000124   EF0E               LDI     R16, 254
   \   00000126   0E80               ADD     R8, R16
   \   00000128   EF0F               LDI     R16, 255
   \   0000012A   1E90               ADC     R9, R16
    421          		} while(size); // Loop until all bytes written.
   \   0000012C   2D08               MOV     R16, R8
   \   0000012E   2909               OR      R16, R9
   \   00000130   F6B9               BRNE    ??BlockLoad_8
    422          
    423          		if( tempaddress < (APP_END) ) { // Protect bootloader area.
   \   00000132   3080               CPI     R24, 0
   \   00000134   EF00               LDI     R16, 240
   \   00000136   0790               CPC     R25, R16
   \   00000138   E003               LDI     R16, 3
   \   0000013A   07A0               CPC     R26, R16
   \   0000013C   E000               LDI     R16, 0
   \   0000013E   07B0               CPC     R27, R16
   \   00000140   F454               BRGE    ??BlockLoad_9
    424          #pragma diag_suppress=Pe1053 // Suppress warning for conversion from long-type address to flash ptr.
    425          			_PAGE_WRITE(tempaddress);
   \   00000142   E005               LDI     R16, 5
   \   00000144   01FC               MOVW    R31:R30, R25:R24
   \   00000146   2F3A               MOV     R19, R26
   \   00000148   BF3B               OUT     0x3B, R19
   \   0000014A   BF07               OUT     0x37, R16
   \   0000014C   95E8               SPM
    426          #pragma diag_default=Pe1053 // Back to default.
    427          			_WAIT_FOR_SPM();
   \                     ??BlockLoad_10:
   \   0000014E   B707               IN      R16, 0x37
   \   00000150   2F10               MOV     R17, R16
   \   00000152   FD10               SBRC    R17, 0
   \   00000154   CFFC               RJMP    ??BlockLoad_10
    428          		}
    429          		_ENABLE_RWW_SECTION();
   \                     ??BlockLoad_9:
   \   00000156   E111               LDI     R17, 17
   \   00000158   E000               LDI     R16, 0
   \   0000015A   2E00               MOV     R0, R16
   \   0000015C   BF17               OUT     0x37, R17
   \   0000015E   95E8               SPM
    430          
    431          		(*address) >>= 1; // Convert address back to Flash words again.
   \   00000160   01F2               MOVW    R31:R30, R5:R4
   \   00000162   8100               LD      R16, Z
   \   00000164   8111               LDD     R17, Z+1
   \   00000166   8122               LDD     R18, Z+2
   \   00000168   8133               LDD     R19, Z+3
   \   0000016A   9535               ASR     R19
   \   0000016C   9527               ROR     R18
   \   0000016E   9517               ROR     R17
   \   00000170   9507               ROR     R16
   \   00000172   01F2               MOVW    R31:R30, R5:R4
   \   00000174   8300               ST      Z, R16
   \   00000176   8311               STD     Z+1, R17
   \   00000178   8322               STD     Z+2, R18
   \   0000017A   8333               STD     Z+3, R19
    432          		return '\r'; // Report programming OK
   \   0000017C   E00D               LDI     R16, 13
   \   0000017E   C001               RJMP    ??BlockLoad_6
    433          	}
    434          
    435          	// Invalid memory type?
    436          	else
    437          	{
    438          		return '?';
   \                     ??BlockLoad_7:
   \   00000180   E30F               LDI     R16, 63
   \                     ??BlockLoad_6:
   \   00000182   5FDF               SUBI    R29, 255
   \   00000184   E0EB               LDI     R30, 11
   \   00000186   ........           JMP     ?EPILOGUE_B11_L09
    439          	}
    440          }
    441          
    442          
    443          
    444          /*! \brief  Read block of mem and send to serial port.
    445           *
    446           *  Read 'size' bytes from EEPROM/Flash memory 'address' and
    447           *  send to serial port. If 'mem' == 'E', then 'address' gives
    448           *  the byte address in EEPROM. If 'mem' == 'F', then 'address'
    449           *  gives the word address in Flash.
    450           */

   \                                 In segment FARCODE, align 2, keep-with-next
    451          void BlockRead(unsigned int size, unsigned char mem, long *address)
   \                     BlockRead:
    452          {
   \   00000000   ........           CALL    ?PROLOGUE5_L09
   \   00000004                      REQUIRE ?Register_R4_is_cg_reg
   \   00000004   01C8               MOVW    R25:R24, R17:R16
   \   00000006   2E42               MOV     R4, R18
   \   00000008   01DA               MOVW    R27:R26, R21:R20
    453          	// EEPROM memory type.
    454          	if (mem=='E') // Read EEPROM
   \   0000000A   E405               LDI     R16, 69
   \   0000000C   1640               CP      R4, R16
   \   0000000E   F509               BRNE    ??BlockRead_0
    455          	{
    456          		do
    457          		{
    458          			EEARL = *address; // Setup EEPROM address
   \                     ??BlockRead_1:
   \   00000010   910D               LD      R16, X+
   \   00000012   911D               LD      R17, X+
   \   00000014   912D               LD      R18, X+
   \   00000016   9713               SBIW    R27:R26, 3
   \   00000018   BD01               OUT     0x21, R16
    459          			EEARH = ((*address) >> 8);
   \   0000001A   910D               LD      R16, X+
   \   0000001C   911D               LD      R17, X+
   \   0000001E   912D               LD      R18, X+
   \   00000020   9713               SBIW    R27:R26, 3
   \   00000022   2F01               MOV     R16, R17
   \   00000024   BD02               OUT     0x22, R16
    460          			(*address)++; // Select next EEPROM byte
   \   00000026   01FD               MOVW    R31:R30, R27:R26
   \   00000028   8100               LD      R16, Z
   \   0000002A   8111               LDD     R17, Z+1
   \   0000002C   8122               LDD     R18, Z+2
   \   0000002E   8133               LDD     R19, Z+3
   \   00000030   5F0F               SUBI    R16, 255
   \   00000032   4F1F               SBCI    R17, 255
   \   00000034   4F2F               SBCI    R18, 255
   \   00000036   4F3F               SBCI    R19, 255
   \   00000038   8300               ST      Z, R16
   \   0000003A   8311               STD     Z+1, R17
   \   0000003C   8322               STD     Z+2, R18
   \   0000003E   8333               STD     Z+3, R19
    461          			EECR |= (1<<EERE); // Read EEPROM
   \   00000040   9AF8               SBI     0x1F, 0x00
    462          			sendchar(EEDR); // Transmit EEPROM dat ato PC
   \   00000042   B500               IN      R16, 0x20
   \   00000044   ........           CALL    sendchar
    463          
    464          			size--; // Decrease number of bytes to read
   \   00000048   9701               SBIW    R25:R24, 1
    465          		} while (size); // Repeat until all block has been read
   \   0000004A   2F08               MOV     R16, R24
   \   0000004C   2B09               OR      R16, R25
   \   0000004E   F701               BRNE    ??BlockRead_1
   \   00000050   C04C               RJMP    ??BlockRead_2
    466          	}
    467          
    468          	// Flash memory type.
    469          	else if(mem=='F')
   \                     ??BlockRead_0:
   \   00000052   E406               LDI     R16, 70
   \   00000054   1640               CP      R4, R16
   \   00000056   F009               BREQ    $+2+2
   \   00000058   C048               RJMP    ??BlockRead_2

⌨️ 快捷键说明

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