📄 hhh.lst
字号:
FD27 2DEA MOV R30,R10
FD28 27FF CLR R31
FD29 0FE8 ADD R30,R24
FD2A 1FF9 ADC R31,R25
FD2B 8020 LDD R2,Z+0
FD2C 2433 CLR R3
FD2D 2C32 MOV R3,R2
FD2E 2422 CLR R2
FD2F E084 LDI R24,4
FD30 E091 LDI R25,1
FD31 2DEA MOV R30,R10
FD32 27FF CLR R31
FD33 0FE8 ADD R30,R24
FD34 1FF9 ADC R31,R25
FD35 8140 LDD R20,Z+0
FD36 2755 CLR R21
FD37 0D42 ADD R20,R2
FD38 1D53 ADC R21,R3
(0221) if (TempInt != TempInt2)
FD39 1704 CP R16,R20
FD3A 0715 CPC R17,R21
FD3B F011 BEQ 0xFD3E
(0222) return 0;
FD3C 2700 CLR R16
FD3D C007 RJMP 0xFD45
FD3E 2D8A MOV R24,R10
FD3F 5F8E SUBI R24,0xFE
FD40 2EA8 MOV R10,R24
FD41 2D8A MOV R24,R10
FD42 3080 CPI R24,0
FD43 F2AC BLT 0xFD19
(0223) }
(0224) return 1;
FD44 E001 LDI R16,1
FD45 940EFDE4 CALL pop_gset3
FD47 9508 RET
(0225) }
(0226) /*****************************************************************************/
(0227) /* Serial Port Code */
(0228) /*****************************************************************************/
(0229) unsigned char IsChar(void)
(0230) {
(0231) #if (ChipType == Atmega8)||(ChipType == Atmega16)||(ChipType == Atmega32)
(0232) if(UCSRA & 0x80)
(0233) #endif
(0234) #if (ChipType == Atmega64)||(ChipType == Atmega128)
(0235) if(UCSR1A & 0x80)
_IsChar:
FD48 9020009B LDS R2,0x9B
FD4A FE27 SBRS R2,7
FD4B C002 RJMP 0xFD4E
(0236) #endif
(0237) return 1;
FD4C E001 LDI R16,1
FD4D C001 RJMP 0xFD4F
(0238) else
(0239) return 0;
FD4E 2700 CLR R16
FD4F 9508 RET
(0240) }
(0241) /*****************************************************************************/
(0242) /* 字符输入函数 */
(0243) unsigned char RecChar(void)
(0244) {
(0245) #if (ChipType == Atmega8)||(ChipType == Atmega16)||(ChipType == Atmega32)
(0246) while(!(UCSRA & 0x80));
(0247) return UDR;
(0248) #endif
(0249) #if (ChipType == Atmega64)||(ChipType == Atmega128)
(0250) while(!(UCSR1A & 0x80));
_RecChar:
FD50 9020009B LDS R2,0x9B
FD52 FE27 SBRS R2,7
FD53 CFFC RJMP _RecChar
(0251) return UDR1;
FD54 9100009C LDS R16,0x9C
FD56 9508 RET
(0252) #endif
(0253) }
(0254) /*****************************************************************************/
(0255) void SendChar(unsigned char c)
(0256) {
(0257) #if (ChipType == Atmega8)||(ChipType == Atmega16)||(ChipType == Atmega32)
(0258) while (!(UCSRA&(1<<UDRE)));
(0259) UDR=c;
(0260) #endif
(0261) #if (ChipType == Atmega64)||(ChipType == Atmega128)
(0262) while (!(UCSR1A&(1<<UDRE1)));
_SendChar:
c --> R16
FD57 9020009B LDS R2,0x9B
FD59 FE25 SBRS R2,5
FD5A CFFC RJMP _SendChar
(0263) UDR1=c;
FD5B 9300009C STS 0x9C,R16
(0264) #endif
(0265) }
FD5D 9508 RET
(0266) void delay(void)
(0267) {
(0268) unsigned int i;
(0269) for (i=0;i<65530;i++);
_delay:
i --> R16
FD5E 2700 CLR R16
FD5F 2711 CLR R17
FD60 C002 RJMP 0xFD63
FD61 5F0F SUBI R16,0xFF
FD62 4F1F SBCI R17,0xFF
FD63 3F0A CPI R16,0xFA
FD64 EFEF LDI R30,0xFF
FD65 071E CPC R17,R30
FD66 F3D0 BCS 0xFD61
(0270) }
FD67 9508 RET
(0271)
(0272) /*****************************************************************************/
(0273) void ExecCode(void)
(0274) {
(0275) #ifdef RAMPZ_FLAG
(0276) RAMPZ = 0;
_ExecCode:
FD68 2422 CLR R2
FD69 BE2B OUT 0x3B,R2
(0277) #endif
(0278) INTVECREG=0x01; //中断向量表移位允许
FD6A E081 LDI R24,1
FD6B BF85 OUT 0x35,R24
(0279) INTVECREG=0x00; //中断向量指向应用程序区
FD6C BE25 OUT 0x35,R2
(0280) asm("jmp 0x0000");
FD6D 940C0000 JMP 0x0
(0281) }
FD6F 9508 RET
(0282)
(0283) void main(void)
(0284) {
(0285) unsigned char BootFlag;
(0286)
(0287) #ifdef InteClk //如果使用内部时钟,读取时钟校准值
(0288) OSCCAL=read_flash(OscAddress);
_main:
BootFlag --> R20
FD70 EF0F LDI R16,0xFF
FD71 E11F LDI R17,0x1F
FD72 940EFDCB CALL _read_flash
FD74 9300006F STS 0x6F,R16
(0289) #endif
(0290)
(0291) #if (ChipType == Atmega8)||(ChipType == Atmega16)||(ChipType == Atmega32)
(0292) UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); //8位数据+1位停止
(0293) UCSRB = (1<<RXEN)|(1<<TXEN); //允许串口发送和接收
(0294) UBRR = BAU;
(0295) #endif
(0296)
(0297) #if (ChipType == Atmega64)||(ChipType == Atmega128)
(0298) //------------------使用串口1为Boot口-----------------
(0299) //UCSR1C=(1<<URSEL1)|(1<<UCSZ11)|(1<<UCSZ10); //8位数据+1位停止
(0300) UCSR1C=(1<<UCSZ11)|(1<<UCSZ10);//|(1<<USBS1);
FD76 E086 LDI R24,6
FD77 9380009D STS 0x9D,R24
(0301) UCSR1B = (1<<RXEN1)|(1<<TXEN1); //允许串口发送和接收
FD79 E188 LDI R24,0x18
FD7A 9380009A STS 0x9A,R24
(0302) UBRR1L=((fosc/16/baud1)-1)%256;
FD7C E08C LDI R24,0xC
FD7D 93800099 STS 0x99,R24
(0303) UBRR1H=((fosc/16/baud1)-1)/256;
FD7F 2422 CLR R2
FD80 92200098 STS 0x98,R2
(0304) #endif
(0305) SendChar('>'); //通知PC机,BOOT下载准备就绪
FD82 E30E LDI R16,0x3E
FD83 DFD3 RCALL _SendChar
(0306) delay(); //延时等待PC机响应
FD84 DFD9 RCALL _delay
(0307) delay();
FD85 DFD8 RCALL _delay
(0308) delay();
FD86 DFD7 RCALL _delay
(0309) delay();
FD87 DFD6 RCALL _delay
(0310) delay();
FD88 DFD5 RCALL _delay
(0311) delay();
FD89 DFD4 RCALL _delay
(0312) delay();
FD8A DFD3 RCALL _delay
(0313) delay();
FD8B DFD2 RCALL _delay
(0314) BootFlag=UDR1;
FD8C 9140009C LDS R20,0x9C
(0315) if (BootFlag == '<')
FD8E 334C CPI R20,0x3C
FD8F F531 BNE 0xFDB6
(0316) {
(0317) SendChar(ChipType);
FD90 E304 LDI R16,0x34
FD91 DFC5 RCALL _SendChar
(0318) while (RecChar()!='N');
FD92 DFBD RCALL _RecChar
FD93 340E CPI R16,0x4E
FD94 F7E9 BNE 0xFD92
(0319) SendChar(BootSize);
FD95 E604 LDI R16,0x64
FD96 DFC0 RCALL _SendChar
(0320) while (RecChar()!='N');
FD97 DFB8 RCALL _RecChar
FD98 340E CPI R16,0x4E
FD99 F7E9 BNE 0xFD97
(0321) SendChar(BootVer);
FD9A E606 LDI R16,0x66
FD9B DFBB RCALL _SendChar
FD9C C018 RJMP 0xFDB5
(0322) while (1)
(0323) {
(0324) switch (RecChar())
FD9D DFB2 RCALL _RecChar
FD9E 2F40 MOV R20,R16
FD9F 2755 CLR R21
FDA0 3445 CPI R20,0x45
FDA1 E0E0 LDI R30,0
FDA2 075E CPC R21,R30
FDA3 F059 BEQ 0xFDAF
FDA4 3445 CPI R20,0x45
FDA5 E0E0 LDI R30,0
FDA6 075E CPC R21,R30
FDA7 F06C BLT 0xFDB5
FDA8 3547 CPI R20,0x57
FDA9 E0E0 LDI R30,0
FDAA 075E CPC R21,R30
FDAB F009 BEQ 0xFDAD
FDAC C008 RJMP 0xFDB5
(0325) {
(0326) case 'W': FlashLoad(); break;
FDAD DEBE RCALL _FlashLoad
FDAE C006 RJMP 0xFDB5
(0327) case 'E': {
(0328) SendChar('E'); //通知PC机,进入运用程序区
FDAF E405 LDI R16,0x45
FDB0 DFA6 RCALL _SendChar
(0329) while (RecChar()!='N');
FDB1 DF9E RCALL _RecChar
FDB2 340E CPI R16,0x4E
FDB3 F7E9 BNE 0xFDB1
(0330) ExecCode();
FDB4 DFB3 RCALL _ExecCode
FDB5 CFE7 RJMP 0xFD9D
(0331) } break;
(0332) default : break;
(0333) }
(0334) }
(0335) }
(0336) SendChar('E'); //通知PC机,进入运用程序区
FDB6 E405 LDI R16,0x45
FDB7 DF9F RCALL _SendChar
(0337) //while (RecChar()!='N');
(0338) delay();
FDB8 DFA5 RCALL _delay
(0339) delay();
FDB9 DFA4 RCALL _delay
(0340) delay();
FDBA DFA3 RCALL _delay
(0341) delay();
FDBB DFA2 RCALL _delay
(0342) ExecCode();
(0343) }
FDBC CFAB RJMP _ExecCode
FILE: E:\icc\peterf\BootLoad\assembly.s
(0001) .text
(0002) ;*********************************************************
(0003) ; Place a 1 for the processor you want use
(0004) ;*********************************************************
(0005)
(0006) MEGATYPE8 = 0
(0007) MEGATYPE16 = 0
(0008) MEGATYPE32 = 0
(0009) MEGATYPE64 = 0
(0010) MEGATYPE128 = 1
(0011) MEGATYPE162 = 0
(0012) MEGATYPE169 = 0
(0013) MEGATYPE8515 = 0
(0014) MEGATYPE8535 = 0
(0015) MEGATYPE2313 = 0
(0016)
(0017) ;*********************************************************
(0018) ;*********************************************************
(0019) ;*********************************************************
(0020) ;*********************************************************
(0021) ; DO NOT CHANGE ANYTHING BELOW THIS LINE !!!!!!!
(0022) ;*********************************************************
(0023) ;*********************************************************
(0024) ;*********************************************************
(0025) ;*********************************************************
(0026)
(0027) .if MEGATYPE64 | MEGATYPE128
(0028) SPMCR = 0x68 ;RWW区忙标志,读RWW区允许,允许写程序存储区
(0029) .else
(0030) SPMCR = 0x57
(0031) .endif
(0032)
(0033) ;-----------------------------------------
(0034)
(0035) ; void write_page (unsigned int adr, unsigned char function);
(0036) ; bits 8:15 adr addresses the page...(must setup RAMPZ beforehand!!!)
(0037) _write_page::
(0038) XCALL __WAIT_SPMEN__
_write_page:
FDBD D01F RCALL 0xFDDD
(0039) movw r30, r16 ;move address to z pointer (R31 = ZH, R30 = ZL)
FDBE 01F8 MOVW R30,R16
(0040) STS SPMCR, R18 ;argument 2 decides function
FDBF 93200068 STS 0x68,R18
(0041) SPM ;perform pagewrite
FDC1 95E8 SPM
(0042) RET
FDC2 9508 RET
(0043)
(0044) ;-----------------------------------------
(0045)
(0046) ; void fill_temp_buffer (unsigned int data, unsigned int adr);
(0047) ; bits 7:1 in adr addresses the word in the page... (2=first word, 4=second word etc..)
(0048) _fill_temp_buffer::
(0049) XCALL __WAIT_SPMEN__
_fill_temp_buffer:
FDC3 D019 RCALL 0xFDDD
(0050) movw r30, r18 ;move adress to z pointer (R31=ZH R30=ZL)
FDC4 01F9 MOVW R30,R18
(0051) movw r0, r16 ;move data to reg 0 and 1
FDC5 0108 MOVW R0,R16
(0052) LDI R19, 0x01
FDC6 E031 LDI R19,1
(0053) STS SPMCR, R19
FDC7 93300068 STS 0x68,R19
(0054) SPM ;Store program memory
FDC9 95E8 SPM
(0055) RET
FDCA 9508 RET
(0056)
(0057) ;-----------------------------------------
(0058)
(0059) ;unsigned char read_flash(unsigned int add);
(0060) _read_flash::
(0061) mov r31,r17
_read_flash:
FDCB 2FF1 MOV R31,R17
(0062) mov r30,r16
FDCC 2FE0 MOV R30,R16
(0063) lpm r16,z
FDCD 9104 LPM R16,0(Z)
(0064) clr r17
FDCE 2711 CLR R17
(0065) ret
FDCF 9508 RET
(0066)
(0067) ;unsigned int read_program_memory (unsigned int adr ,unsigned char cmd);
(0068) _read_program_memory::
(0069) movw r30, r16 ;move adress to z pointer
_read_program_memory:
FDD0 01F8 MOVW R30,R16
(0070) SBRC R18, 0 ;read lockbits? (second argument = 0x09)
FDD1 FD20 SBRC R18,0
(0071) STS SPMCR, R18 ;if so, place second argument in SPMEN register
FDD2 93200068 STS 0x68,R18
(0072) LPM r16, Z+
FDD4 9105 LPM R16,Z+
(0073) LPM r17, Z
FDD5 9114 LPM R17,0(Z)
(0074) RET
FDD6 9508 RET
(0075)
(0076) ;-----------------------------------------
(0077)
(0078) _enableRWW::
(0079) XCALL __WAIT_SPMEN__
_enableRWW:
FDD7 D005 RCALL 0xFDDD
(0080) LDI R27,0x11
FDD8 E1B1 LDI R27,0x11
(0081) STS SPMCR,R27
FDD9 93B00068 STS 0x68,R27
(0082) SPM
FDDB 95E8 SPM
(0083) RET
FDDC 9508 RET
(0084)
(0085) ;-----------------------------------------
(0086)
(0087) __WAIT_SPMEN__:
(0088) LDS R27,SPMCR ; load SPMCR to R27
FDDD 91B00068 LDS R27,0x68
(0089) SBRC R27,0 ; check SPMEN flag
FDDF FDB0 SBRC R27,0
(0090) RJMP __WAIT_SPMEN__ ; wait for SPMEN flag cleared
FDE0 CFFC RJMP 0xFDDD
(0091) RET
FILE: <library>
FDE1 9508 RET
pop_gset2:
FDE2 E0E2 LDI R30,2
FDE3 C006 RJMP pop
pop_gset3:
FDE4 E0E4 LDI R30,4
FDE5 C004 RJMP pop
push_gset1:
FDE6 935A ST R21,-Y
FDE7 934A ST R20,-Y
FDE8 9508 RET
pop_gset1:
FDE9 E0E1 LDI R30,1
pop:
FDEA 9149 LD R20,Y+
FDEB 9159 LD R21,Y+
FDEC FDE0 SBRC R30,0
FDED 9508 RET
FDEE 9169 LD R22,Y+
FDEF 9179 LD R23,Y+
FDF0 FDE1 SBRC R30,1
FDF1 9508 RET
FDF2 90A9 LD R10,Y+
FDF3 90B9 LD R11,Y+
FDF4 FDE2 SBRC R30,2
FDF5 9508 RET
FDF6 90C9 LD R12,Y+
FDF7 90D9 LD R13,Y+
FDF8 FDE3 SBRC R30,3
FDF9 9508 RET
FDFA 90E9 LD R14,Y+
FDFB 90F9 LD R15,Y+
FDFC 9508 RET
push_gset2:
FDFD 937A ST R23,-Y
FDFE 936A ST R22,-Y
FDFF CFE6 RJMP push_gset1
push_gset3:
FE00 92BA ST R11,-Y
FE01 92AA ST R10,-Y
FE02 CFFA RJMP push_gset2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -