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