📄 self.lst
字号:
0EDE DF58 RCALL _sendchar
(0128) }
0EDF CF6D RJMP 0x0E4D
(0129) else if(val=='F') // read fuse bits
0EE0 3446 CPI R20,0x46
0EE1 F431 BNE 0x0EE8
(0130) {
(0131) sendchar(read_program_memory(0x0000,0x09));
0EE2 E029 LDI R18,0x9
0EE3 2700 CLR R16
0EE4 2711 CLR R17
0EE5 D06F RCALL _read_program_memory
0EE6 DF50 RCALL _sendchar
(0132) }
0EE7 CF65 RJMP 0x0E4D
(0133) else if(val=='r') // read lock bits
0EE8 3742 CPI R20,0x72
0EE9 F431 BNE 0x0EF0
(0134) {
(0135) sendchar(read_program_memory(0x0001,0x09));
0EEA E029 LDI R18,0x9
0EEB E001 LDI R16,1
0EEC E010 LDI R17,0
0EED D067 RCALL _read_program_memory
0EEE DF48 RCALL _sendchar
(0136) }
0EEF CF5D RJMP 0x0E4D
(0137) else if(val=='N') // read high fuse bits
0EF0 344E CPI R20,0x4E
0EF1 F431 BNE 0x0EF8
(0138) {
(0139) sendchar(read_program_memory(0x0003,0x09));
0EF2 E029 LDI R18,0x9
0EF3 E003 LDI R16,3
0EF4 E010 LDI R17,0
0EF5 D05F RCALL _read_program_memory
0EF6 DF40 RCALL _sendchar
(0140) }
0EF7 CF55 RJMP 0x0E4D
(0141) else if(val=='t') // Return programmer type
0EF8 3744 CPI R20,0x74
0EF9 F429 BNE 0x0EFF
(0142) {
(0143) sendchar(device);
0EFA E707 LDI R16,0x77
0EFB DF3B RCALL _sendchar
(0144) sendchar(0);
0EFC 2700 CLR R16
0EFD DF39 RCALL _sendchar
(0145) }
0EFE CF4E RJMP 0x0E4D
(0146) else if ((val=='x')||(val=='y')||(val=='T'))
0EFF 3748 CPI R20,0x78
0F00 F021 BEQ 0x0F05
0F01 3749 CPI R20,0x79
0F02 F011 BEQ 0x0F05
0F03 3544 CPI R20,0x54
0F04 F421 BNE 0x0F09
(0147) {
(0148) recchar();
0F05 DF35 RCALL _recchar
(0149) sendchar('\r');
0F06 E00D LDI R16,0xD
0F07 DF2F RCALL _sendchar
(0150) }
0F08 CF44 RJMP 0x0E4D
(0151) else if (val=='S') // Return software identifier
0F09 3543 CPI R20,0x53
0F0A F479 BNE 0x0F1A
(0152) {
(0153) sendchar('A');
0F0B E401 LDI R16,0x41
0F0C DF2A RCALL _sendchar
(0154) sendchar('V');
0F0D E506 LDI R16,0x56
0F0E DF28 RCALL _sendchar
(0155) sendchar('R');
0F0F E502 LDI R16,0x52
0F10 DF26 RCALL _sendchar
(0156) sendchar('B');
0F11 E402 LDI R16,0x42
0F12 DF24 RCALL _sendchar
(0157) sendchar('O');
0F13 E40F LDI R16,0x4F
0F14 DF22 RCALL _sendchar
(0158) sendchar('O');
0F15 E40F LDI R16,0x4F
0F16 DF20 RCALL _sendchar
(0159) sendchar('T');
0F17 E504 LDI R16,0x54
0F18 DF1E RCALL _sendchar
(0160) }
0F19 CF33 RJMP 0x0E4D
(0161) else if (val=='V') // Return Software Version
0F1A 3546 CPI R20,0x56
0F1B F429 BNE 0x0F21
(0162) {
(0163) sendchar('1');
0F1C E301 LDI R16,0x31
0F1D DF19 RCALL _sendchar
(0164) sendchar('0');
0F1E E300 LDI R16,0x30
0F1F DF17 RCALL _sendchar
(0165) }
0F20 CF2C RJMP 0x0E4D
(0166) else if (val=='s') // Return Signature Byte
0F21 3743 CPI R20,0x73
0F22 F439 BNE 0x0F2A
(0167) {
(0168) sendchar(sig_byte3);
0F23 E007 LDI R16,7
0F24 DF12 RCALL _sendchar
(0169) sendchar(sig_byte2);
0F25 E903 LDI R16,0x93
0F26 DF10 RCALL _sendchar
(0170) sendchar(sig_byte1);
0F27 E10E LDI R16,0x1E
0F28 DF0E RCALL _sendchar
(0171) }
0F29 CF23 RJMP 0x0E4D
(0172) else if(val!=0x1b) // if not esc
0F2A 314B CPI R20,0x1B
0F2B F409 BNE 0x0F2D
0F2C CF20 RJMP 0x0E4D
(0173) {
(0174) sendchar('?');
0F2D E30F LDI R16,0x3F
0F2E DF08 RCALL _sendchar
0F2F CF1D RJMP 0x0E4D
0F30 D042 RCALL pop_gset5
0F31 9508 RET
(0175) }
(0176) }
(0177) }
(0178) void main(void)
(0179) {
(0180) void (*funcptr)( void ) = 0x0000; // Set up function pointer
_main:
funcptr --> R20
0F32 2744 CLR R20
0F33 2755 CLR R21
(0181) DDRD=0;
0F34 2422 CLR R2
0F35 BA21 OUT 0x11,R2
(0182) PORTD=0xff;
0F36 EF8F LDI R24,0xFF
0F37 BB82 OUT 0x12,R24
(0183) uart_init();
0F38 DF06 RCALL _uart_init
(0184) if ((PIND&0x04)==0)
0F39 9982 SBIC 0x10,2
0F3A C004 RJMP 0x0F3F
(0185) {
(0186) PORTD=0;
0F3B 2422 CLR R2
0F3C BA22 OUT 0x12,R2
(0187) iap();
0F3D DF0E RCALL _iap
(0188) }
0F3E C003 RJMP 0x0F42
(0189) else
(0190) funcptr();
0F3F 2FE4 MOV R30,R20
0F40 2FF5 MOV R31,R21
0F41 D056 RCALL xicall
(0191) }
0F42 9508 RET
FILE: E:\icc\iccavr\mega8\mega8\boot\assembly.s
(0001) .text
(0002)
(0003) SPMCR = 0x37
(0004)
(0005) ; void write_page (unsigned int adr, unsigned char function);
(0006) _write_page::
(0007) in r20,SPMCR
_write_page:
0F43 B747 IN R20,0x37
(0008) sbrc r20,0
0F44 FD40 SBRC R20,0
(0009) rjmp _write_page
0F45 CFFD RJMP _write_page
(0010) MOV R31,R17
0F46 2FF1 MOV R31,R17
(0011) MOV R30,R16 ;move adress to z pointer (R31=ZH R30=ZL)
0F47 2FE0 MOV R30,R16
(0012) OUT SPMCR,R18 ;argument 2 decides function
0F48 BF27 OUT 0x37,R18
(0013) SPM ;perform pagewrite
0F49 95E8 SPM
0F4A FFFF SBRS R31,7
(0014) .dw $ffff
(0015) NOP
0F4B 0000 NOP
(0016) RET
0F4C 9508 RET
(0017)
(0018) ; void fill_temp_buffer (unsigned int data, unsigned int adr);
(0019) _fill_temp_buffer::
(0020) MOV R31,R19
_fill_temp_buffer:
0F4D 2FF3 MOV R31,R19
(0021) MOV R30,R18 ;move adress to z pointer (R31=ZH R30=ZL)
0F4E 2FE2 MOV R30,R18
(0022) MOV R1,R17
0F4F 2E11 MOV R1,R17
(0023) MOV R0,R16 ;move data to reg 0 and 1
0F50 2E00 MOV R0,R16
(0024) LDI R18,0x01
0F51 E021 LDI R18,1
(0025) OUT SPMCR,R18
0F52 BF27 OUT 0x37,R18
(0026) SPM ;Store program memory
0F53 95E8 SPM
(0027) RET
0F54 9508 RET
(0028)
(0029) ;unsigned int read_program_memory (unsigned int adr ,unsigned char cmd);
(0030) _read_program_memory::
(0031) ldi r20,0x11
_read_program_memory:
0F55 E141 LDI R20,0x11
(0032) out SPMCR,r20
0F56 BF47 OUT 0x37,R20
(0033) SPM
0F57 95E8 SPM
0F58 FFFF SBRS R31,7
(0034) .dw $ffff
(0035) nop ;重新使能RWW扇区
0F59 0000 NOP
(0036) MOV R31,R17 ;R31=ZH R30=ZL
0F5A 2FF1 MOV R31,R17
(0037) MOV R30,R16 ;move adress to z pointer
0F5B 2FE0 MOV R30,R16
(0038) SBRC R18,0 ;read lockbits? (second argument=0x09)
0F5C FD20 SBRC R18,0
(0039) OUT SPMCR,R18 ;if so, place second argument in SPMEN register
0F5D BF27 OUT 0x37,R18
(0040) LPM ;read LSB
0F5E 95C8 LPM
(0041) MOV R16,R0
0F5F 2D00 MOV R16,R0
(0042) INC R30
0F60 95E3 INC R30
(0043) LPM
0F61 95C8 LPM
(0044) MOV R17,R0 ;read MSB (ignored when reading lockbits)
0F62 2D10 MOV R17,R0
(0045) RET
0F63 9508 RET
(0046)
(0047) ;void write_lock_bits (unsigned char val);
(0048) _write_lock_bits::
(0049) in r20,SPMCR
_write_lock_bits:
0F64 B747 IN R20,0x37
(0050) sbrc r20,0
0F65 FD40 SBRC R20,0
(0051) rjmp _write_lock_bits
0F66 CFFD RJMP _write_lock_bits
(0052) MOV R0,R16
0F67 2E00 MOV R0,R16
(0053) LDI R17,0x09
0F68 E019 LDI R17,0x9
(0054) OUT SPMCR,R17
0F69 BF17 OUT 0x37,R17
(0055) SPM ;write lockbits
0F6A 95E8 SPM
0F6B FFFF SBRS R31,7
(0056) .dw $ffff
(0057) NOP
0F6C 0000 NOP
(0058) RET
0F6D 9508 RET
FILE: E:\icc\iccavr\mega8\mega8\boot\read_flash.s
(0001) ;unsigned char read_flash(unsigned int add);
(0002) _read_flash::
(0003) mov r31,r17
_read_flash:
0F6E 2FF1 MOV R31,R17
(0004) mov r30,r16
0F6F 2FE0 MOV R30,R16
(0005) lpm r16,z
0F70 9104 LPM R16,0(Z)
(0006) clr r17
0F71 2711 CLR R17
(0007) ret
FILE: <library>
0F72 9508 RET
pop_gset5:
0F73 27EE CLR R30
0F74 C004 RJMP pop
push_gset1:
0F75 935A ST R21,-Y
0F76 934A ST R20,-Y
0F77 9508 RET
pop_gset1:
0F78 E0E1 LDI R30,1
pop:
0F79 9149 LD R20,Y+
0F7A 9159 LD R21,Y+
0F7B FDE0 SBRC R30,0
0F7C 9508 RET
0F7D 9169 LD R22,Y+
0F7E 9179 LD R23,Y+
0F7F FDE1 SBRC R30,1
0F80 9508 RET
0F81 90A9 LD R10,Y+
0F82 90B9 LD R11,Y+
0F83 FDE2 SBRC R30,2
0F84 9508 RET
0F85 90C9 LD R12,Y+
0F86 90D9 LD R13,Y+
0F87 FDE3 SBRC R30,3
0F88 9508 RET
0F89 90E9 LD R14,Y+
0F8A 90F9 LD R15,Y+
0F8B 9508 RET
push_gset2:
0F8C 937A ST R23,-Y
0F8D 936A ST R22,-Y
0F8E CFE6 RJMP push_gset1
push_gset3:
0F8F 92BA ST R11,-Y
0F90 92AA ST R10,-Y
0F91 CFFA RJMP push_gset2
push_gset4:
0F92 92DA ST R13,-Y
0F93 92CA ST R12,-Y
0F94 CFFA RJMP push_gset3
push_gset5:
0F95 92FA ST R15,-Y
0F96 92EA ST R14,-Y
0F97 CFFA RJMP push_gset4
xicall:
0F98 920A ST R0,-Y
0F99 95C8 LPM
0F9A 920A ST R0,-Y
0F9B 9631 ADIW R30,1
0F9C 95C8 LPM
0F9D 2DF0 MOV R31,R0
0F9E 91E9 LD R30,Y+
0F9F 9009 LD R0,Y+
0FA0 9409 IJMP
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -