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

📄 bootloader.lst

📁 硬盘MP3播放器-MEGA128-VS1001K-USB-遥控-LCD-ICCAVR代码-硬盘-支持FAT32-单面PCB 第三部分
💻 LST
📖 第 1 页 / 共 2 页
字号:
(0131) unsigned int i;
(0132) unsigned char LocalCheckSum = 0;
    FEEC 24AA      CLR	R10
(0133) unsigned char CheckSum = 0;
    FEED 2766      CLR	R22
(0134) 
(0135) for (i=0;i<PageByte;i++)
    FEEE 2744      CLR	R20
    FEEF 2755      CLR	R21
    FEF0 C011      RJMP	0xFF02
(0136) 	{
(0137) 	while(!IsChar());
    FEF1 D093      RCALL	_IsChar
    FEF2 2300      TST	R16
    FEF3 F3E9      BEQ	0xFEF1
(0138) 	PageBuffer[i]=RxChar();
    FEF4 D096      RCALL	_RxChar
    FEF5 E085      LDI	R24,5
    FEF6 E091      LDI	R25,1
    FEF7 01FA      MOVW	R30,R20
    FEF8 0FE8      ADD	R30,R24
    FEF9 1FF9      ADC	R31,R25
    FEFA 8300      STD	Z+0,R16
(0139) 	LocalCheckSum += PageBuffer[i];
    FEFB 01FA      MOVW	R30,R20
    FEFC 0FE8      ADD	R30,R24
    FEFD 1FF9      ADC	R31,R25
    FEFE 8020      LDD	R2,Z+0
    FEFF 0CA2      ADD	R10,R2
    FF00 5F4F      SUBI	R20,0xFF
    FF01 4F5F      SBCI	R21,0xFF
    FF02 3040      CPI	R20,0
    FF03 E0E1      LDI	R30,1
    FF04 075E      CPC	R21,R30
    FF05 F358      BCS	0xFEF1
(0140)    	}
(0141) 		   
(0142) while(!IsChar());
    FF06 D07E      RCALL	_IsChar
    FF07 2300      TST	R16
    FF08 F3E9      BEQ	0xFF06
(0143) CheckSum = RxChar(); 
    FF09 D081      RCALL	_RxChar
    FF0A 2F60      MOV	R22,R16
(0144) if (LocalCheckSum == CheckSum) return 1;
    FF0B 16A0      CP	R10,R16
    FF0C F411      BNE	0xFF0F
    FF0D E001      LDI	R16,1
    FF0E C001      RJMP	0xFF10
(0145) else return 0;
    FF0F 2700      CLR	R16
    FF10 940EFFB9  CALL	pop_gset3
    FF12 9508      RET
_WriteFlash:
  TempInt              --> R22
  i                    --> R20
    FF13 940EFFD2  CALL	push_gset2
(0146) }
(0147) 
(0148) /*********************************************************/
(0149) 
(0150) void WriteFlash(void)
(0151) {
(0152) unsigned int i;
(0153) unsigned int TempInt;
(0154) 
(0155) for (i=0;i<PageByte;i+=2)
    FF15 2744      CLR	R20
    FF16 2755      CLR	R21
    FF17 C017      RJMP	0xFF2F
(0156)    	{
(0157)    	TempInt=PageBuffer[i]+(PageBuffer[i+1]<<8);
    FF18 E085      LDI	R24,5
    FF19 E091      LDI	R25,1
    FF1A 01FA      MOVW	R30,R20
    FF1B 9631      ADIW	R30,1
    FF1C 0FE8      ADD	R30,R24
    FF1D 1FF9      ADC	R31,R25
    FF1E 8020      LDD	R2,Z+0
    FF1F 2433      CLR	R3
    FF20 2C32      MOV	R3,R2
    FF21 2422      CLR	R2
    FF22 01FA      MOVW	R30,R20
    FF23 0FE8      ADD	R30,R24
    FF24 1FF9      ADC	R31,R25
    FF25 8160      LDD	R22,Z+0
    FF26 2777      CLR	R23
    FF27 0D62      ADD	R22,R2
    FF28 1D73      ADC	R23,R3
(0158)    	fill_temp_buffer(TempInt,i); //call asm routine.
    FF29 019A      MOVW	R18,R20
    FF2A 018B      MOVW	R16,R22
    FF2B 940EFE74  CALL	_fill_temp_buffer
    FF2D 5F4E      SUBI	R20,0xFE
    FF2E 4F5F      SBCI	R21,0xFF
    FF2F 3040      CPI	R20,0
    FF30 E0E1      LDI	R30,1
    FF31 075E      CPC	R21,R30
    FF32 F328      BCS	0xFF18
(0159)    	}
(0160) if (PageAddress16) RAMPZ = 1;
    FF33 90200100  LDS	R2,0x100
    FF35 2022      TST	R2
    FF36 F011      BEQ	0xFF39
    FF37 E081      LDI	R24,1
    FF38 BF8B      OUT	0x3B,R24
(0161) 
(0162) write_page(PageAddress,0x03);       //Perform page ERASE
    FF39 E023      LDI	R18,3
    FF3A 91000103  LDS	R16,_PageAddress
    FF3C 91100104  LDS	R17,_PageAddress+1
    FF3E 940EFE6D  CALL	_write_page
(0163) write_page(PageAddress,0x05);       //Perform page write
    FF40 E025      LDI	R18,5
    FF41 91000103  LDS	R16,_PageAddress
    FF43 91100104  LDS	R17,_PageAddress+1
    FF45 940EFE6D  CALL	_write_page
(0164)    
(0165) enableRWW();
    FF47 940EFE89  CALL	_enableRWW
(0166) RAMPZ = 0;
    FF49 2422      CLR	R2
    FF4A BE2B      OUT	0x3B,R2
(0167) }
    FF4B 940EFFB7  CALL	pop_gset2
    FF4D 9508      RET
_CheckFlash:
  TempInt2             --> R22
  TempInt              --> R10
  i                    --> R20
    FF4E 940EFFD5  CALL	push_gset3
(0168) 
(0169) /*********************************************************/
(0170) 
(0171) char CheckFlash(void)
(0172) {
(0173) unsigned int i;							
(0174) unsigned int TempInt;
(0175) unsigned int TempInt2;
(0176) 
(0177) for (i=0;i<PageByte;i+=2)
    FF50 2744      CLR	R20
    FF51 2755      CLR	R21
    FF52 C02A      RJMP	0xFF7D
(0178)     {
(0179) 	if (PageAddress16) RAMPZ = 1;
    FF53 90200100  LDS	R2,0x100
    FF55 2022      TST	R2
    FF56 F011      BEQ	0xFF59
    FF57 E081      LDI	R24,1
    FF58 BF8B      OUT	0x3B,R24
(0180) 	TempInt = read_program_memory(PageAddress + i,0x00);
    FF59 2722      CLR	R18
    FF5A 91000103  LDS	R16,_PageAddress
    FF5C 91100104  LDS	R17,_PageAddress+1
    FF5E 0F04      ADD	R16,R20
    FF5F 1F15      ADC	R17,R21
    FF60 940EFE7E  CALL	_read_program_memory
    FF62 0158      MOVW	R10,R16
(0181) 	RAMPZ = 0;
    FF63 2422      CLR	R2
    FF64 BE2B      OUT	0x3B,R2
(0182) 	TempInt2 = PageBuffer[i] +(PageBuffer[i+1]<<8);
    FF65 E085      LDI	R24,5
    FF66 E091      LDI	R25,1
    FF67 01FA      MOVW	R30,R20
    FF68 9631      ADIW	R30,1
    FF69 0FE8      ADD	R30,R24
    FF6A 1FF9      ADC	R31,R25
    FF6B 8020      LDD	R2,Z+0
    FF6C 2433      CLR	R3
    FF6D 2C32      MOV	R3,R2
    FF6E 2422      CLR	R2
    FF6F 01FA      MOVW	R30,R20
    FF70 0FE8      ADD	R30,R24
    FF71 1FF9      ADC	R31,R25
    FF72 8160      LDD	R22,Z+0
    FF73 2777      CLR	R23
    FF74 0D62      ADD	R22,R2
    FF75 1D73      ADC	R23,R3
(0183) 	if (TempInt != TempInt2) return 0;
    FF76 1706      CP	R16,R22
    FF77 0717      CPC	R17,R23
    FF78 F011      BEQ	0xFF7B
    FF79 2700      CLR	R16
    FF7A C007      RJMP	0xFF82
    FF7B 5F4E      SUBI	R20,0xFE
    FF7C 4F5F      SBCI	R21,0xFF
    FF7D 3040      CPI	R20,0
    FF7E E0E1      LDI	R30,1
    FF7F 075E      CPC	R21,R30
    FF80 F290      BCS	0xFF53
(0184)     }
(0185) return 1;
    FF81 E001      LDI	R16,1
    FF82 940EFFB9  CALL	pop_gset3
    FF84 9508      RET
(0186) }
(0187) 
(0188) /*********************************************************/
(0189) 
(0190) unsigned char IsChar(void)
(0191) {
(0192) if (UCSR0A & 0x80) return 1;
_IsChar:
    FF85 9B5F      SBIS	0x0B,7
    FF86 C002      RJMP	0xFF89
    FF87 E001      LDI	R16,1
    FF88 C001      RJMP	0xFF8A
(0193) return 0;
    FF89 2700      CLR	R16
    FF8A 9508      RET
(0194) }
(0195) 
(0196) /*********************************************************/
(0197) 
(0198) unsigned char RxChar(void)
(0199) {
(0200) return UDR0;		   		  // Read char
_RxChar:
    FF8B B10C      IN	R16,0x0C
    FF8C 9508      RET
(0201) }
(0202) 
(0203) /*********************************************************/
(0204) 
(0205) void TxChar(unsigned char ch)
(0206) {
(0207) while (!(UCSR0A & 0x20)); // Wait for empty transmit buffer
_TxChar:
  ch                   --> R16
    FF8D 9B5D      SBIS	0x0B,5
    FF8E CFFE      RJMP	_TxChar
(0208) UDR0 = ch;	  		   		  // Write char
    FF8F B90C      OUT	0x0C,R16
(0209) }
    FF90 9508      RET
(0210) 
(0211) /*********************************************************/
(0212) 
(0213) void Wait()
(0214) {
(0215) int i;
(0216) 
(0217) for (i=-32000;i<32000;i++); // Minimum for 16Mhz
_Wait:
  i                    --> R16
    FF91 E000      LDI	R16,0
    FF92 E813      LDI	R17,0x83
    FF93 5F0F      SUBI	R16,0xFF
    FF94 4F1F      SBCI	R17,0xFF
    FF95 3000      CPI	R16,0
    FF96 E7ED      LDI	R30,0x7D
    FF97 071E      CPC	R17,R30
    FF98 F3D4      BLT	0xFF93
(0218) }
    FF99 9508      RET
(0219) 
(0220) /*********************************************************/
(0221) 
(0222) void main(void)
(0223) {
(0224) DDRF = 0xff;   // for ata
_main:
    FF9A EF8F      LDI	R24,0xFF
    FF9B 93800061  STS	0x61,R24
(0225) PORTF = 0xff;
    FF9D 93800062  STS	0x62,R24
(0226) DDRG = 0x02;
    FF9F E082      LDI	R24,2
    FFA0 93800064  STS	0x64,R24
(0227) PORTG = 0x02;
    FFA2 93800065  STS	0x65,R24
(0228) 
(0229) PORTE  = 0x01;	// Pull up on RX line
    FFA4 E081      LDI	R24,1
    FFA5 B983      OUT	0x03,R24
(0230) UCSR0C = 0x86;  // Asyn,NoParity,1StopBit,8Bit,
    FFA6 E886      LDI	R24,0x86
    FFA7 93800095  STS	0x95,R24
(0231) UBRR0L = 16;    // 8->115200 at 16Mhz // 16->57600 at 16Mhz // 25->38400bps at 16Mhz
    FFA9 E180      LDI	R24,0x10
    FFAA B989      OUT	0x09,R24
(0232) UCSR0B = 0x18;  // Rx enable Tx Enable
    FFAB E188      LDI	R24,0x18
    FFAC B98A      OUT	0x0A,R24
(0233) 
(0234) RxChar();
    FFAD DFDD      RCALL	_RxChar
(0235) TxChar('>');
    FFAE E30E      LDI	R16,0x3E
    FFAF DFDD      RCALL	_TxChar
(0236) Wait();
    FFB0 DFE0      RCALL	_Wait
(0237) if (RxChar() == '<') 
    FFB1 DFD9      RCALL	_RxChar
    FFB2 330C      CPI	R16,0x3C
    FFB3 F411      BNE	0xFFB6
(0238)    {
(0239)    BootLoad();
    FFB4 DEDF      RCALL	_BootLoad
(0240)    ExecCode();
    FFB5 DF2C      RCALL	_ExecCode
(0241)    }
(0242) ExecCode();
(0243) }
FILE: <library>
    FFB6 CF2B      RJMP	_ExecCode
pop_gset2:
    FFB7 E0E2      LDI	R30,2
    FFB8 C006      RJMP	pop
pop_gset3:
    FFB9 E0E4      LDI	R30,4
    FFBA C004      RJMP	pop
push_gset1:
    FFBB 935A      ST	R21,-Y
    FFBC 934A      ST	R20,-Y
    FFBD 9508      RET
pop_gset1:
    FFBE E0E1      LDI	R30,1
pop:
    FFBF 9149      LD	R20,Y+
    FFC0 9159      LD	R21,Y+
    FFC1 FDE0      SBRC	R30,0
    FFC2 9508      RET
    FFC3 9169      LD	R22,Y+
    FFC4 9179      LD	R23,Y+
    FFC5 FDE1      SBRC	R30,1
    FFC6 9508      RET
    FFC7 90A9      LD	R10,Y+
    FFC8 90B9      LD	R11,Y+
    FFC9 FDE2      SBRC	R30,2
    FFCA 9508      RET
    FFCB 90C9      LD	R12,Y+
    FFCC 90D9      LD	R13,Y+
    FFCD FDE3      SBRC	R30,3
    FFCE 9508      RET
    FFCF 90E9      LD	R14,Y+
    FFD0 90F9      LD	R15,Y+
    FFD1 9508      RET
push_gset2:
    FFD2 937A      ST	R23,-Y
    FFD3 936A      ST	R22,-Y
    FFD4 CFE6      RJMP	push_gset1
push_gset3:
    FFD5 92BA      ST	R11,-Y
    FFD6 92AA      ST	R10,-Y
    FFD7 CFFA      RJMP	push_gset2

⌨️ 快捷键说明

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