📄 main.lis
字号:
.module main.c
.area text(rom, con, rel)
0000 .dbfile C:\mega8\boot\main.c
0000 .dbfunc e sendchar _sendchar fV
0000 ; c -> R16
.even
0000 _sendchar::
0000 .dbline -1
0000 .dbline 17
0000 ; /*******************************************/
0000 ; /* 广州天河双龙电子公司 */
0000 ; /* http://www.sl.com.cn */
0000 ; /* BOOT引导IAP应用演示程序 */
0000 ; /* 作者:ntzwq@wx88.net */
0000 ; /* 2002年5月11日 */
0000 ; /* 目标MCU:MEGA8 晶振:外部(EXT) 8MHZ */
0000 ; /*******************************************/
0000 ; #include "self.h"
0000 ; #include "assembly.h"
0000 ; #include<iom8v.h>
0000 ; #define fosc 8000000 //晶振8MHZ
0000 ; #define baud 19200 //波特率
0000 ; extern unsigned char read_flash(unsigned int add);
0000 ; /* 字符输出函数 */
0000 ; void sendchar(unsigned char c)
0000 ; {
0000 L2:
0000 .dbline 18
0000 L3:
0000 .dbline 18
0000 ; while (!(UCSRA&(1<<UDRE)));
0000 5D9B sbis 0xb,5
0002 FECF rjmp L2
0004 .dbline 19
0004 ; UDR=c;
0004 0CB9 out 0xc,R16
0006 .dbline -2
0006 .dbline 20
0006 ; }
0006 L1:
0006 .dbline 0 ; func end
0006 0895 ret
0008 .dbsym r c 16 c
0008 .dbend
0008 .dbfunc e recchar _recchar fc
.even
0008 _recchar::
0008 .dbline -1
0008 .dbline 23
0008 ; /* 字符输入函数 */
0008 ; unsigned char recchar(void)
0008 ; {
0008 L6:
0008 .dbline 24
0008 L7:
0008 .dbline 24
0008 ; while(!(UCSRA& (1<<RXC)));
0008 5F9B sbis 0xb,7
000A FECF rjmp L6
000C .dbline 25
000C ; return UDR;
000C 0CB1 in R16,0xc
000E .dbline -2
000E L5:
000E .dbline 0 ; func end
000E 0895 ret
0010 .dbend
0010 .dbfunc e uart_init _uart_init fV
.even
0010 _uart_init::
0010 .dbline -1
0010 .dbline 29
0010 ; }
0010 ; /* UART初始化 */
0010 ; void uart_init(void)
0010 ; {
0010 .dbline 30
0010 ; OSCCAL=read_flash(0x1f20);//对内部RC OSC调整
0010 00E2 ldi R16,7968
0012 1FE1 ldi R17,31
0014 00D0 rcall _read_flash
0016 01BF out 0x31,R16
0018 .dbline 31
0018 ; UCSRB=(1<<RXEN)|(1<<TXEN);//允许发送和接收
0018 88E1 ldi R24,24
001A 8AB9 out 0xa,R24
001C .dbline 32
001C ; UBRRL=(fosc/16/(baud+1))%256;
001C 8AE1 ldi R24,26
001E 89B9 out 0x9,R24
0020 .dbline 33
0020 ; UBRRH=(fosc/16/(baud+1))/256;
0020 2224 clr R2
0022 20BC out 0x20,R2
0024 .dbline 34
0024 ; UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);//8位数据+1位STOP位
0024 86E8 ldi R24,134
0026 80BD out 0x20,R24
0028 .dbline -2
0028 .dbline 35
0028 ; }
0028 L9:
0028 .dbline 0 ; func end
0028 0895 ret
002A .dbend
002A .dbfunc e iap _iap fV
002A ; intval -> R10,R11
002A ; data -> R14,R15
002A ; ldata -> R12
002A ; address -> R22,R23
002A ; val -> R20
.even
002A _iap::
002A 00D0 rcall push_gset5
002C .dbline -1
002C .dbline 37
002C ; void iap(void)
002C ; {
002C .dbline 40
002C ; unsigned int intval,address,data;
002C ; unsigned char val, ldata;
002C ; for(;;)
002C L11:
002C .dbline 41
002C ; {
002C .dbline 42
002C ; val=recchar();
002C EDDF rcall _recchar
002E 402F mov R20,R16
0030 .dbline 43
0030 ; if(val=='a') //Autoincrement?
0030 0136 cpi R16,97
0032 19F4 brne L15
0034 .dbline 44
0034 ; {
0034 .dbline 45
0034 ; sendchar('Y'); //Autoincrement is quicker
0034 09E5 ldi R16,89
0036 E4DF rcall _sendchar
0038 .dbline 46
0038 ; }
0038 F9CF rjmp L11
003A L15:
003A .dbline 47
003A ; else if(val=='A') //write address
003A 4134 cpi R20,65
003C 61F4 brne L17
003E .dbline 48
003E ; {
003E .dbline 49
003E ; address=recchar(); //read address 8 MSB
003E E4DF rcall _recchar
0040 602F mov R22,R16
0042 7727 clr R23
0044 .dbline 50
0044 ; address=(address<<8)|recchar();
0044 E1DF rcall _recchar
0046 362E mov R3,R22
0048 202E mov R2,R16
004A B101 movw R22,R2
004C .dbline 51
004C ; address=address<<1; //convert from word address to byte address
004C 660F lsl R22
004E 771F rol R23
0050 .dbline 52
0050 ; sendchar('\r');
0050 0DE0 ldi R16,13
0052 D6DF rcall _sendchar
0054 .dbline 53
0054 ; }
0054 EBCF rjmp L11
0056 L17:
0056 .dbline 54
0056 ; else if(val=='c') //Write program memory, low byte
0056 4336 cpi R20,99
0058 29F4 brne L19
005A .dbline 55
005A ; {
005A .dbline 56
005A ; ldata=recchar();
005A D6DF rcall _recchar
005C C02E mov R12,R16
005E .dbline 57
005E ; sendchar('\r');
005E 0DE0 ldi R16,13
0060 CFDF rcall _sendchar
0062 .dbline 58
0062 ; }
0062 E4CF rjmp L11
0064 L19:
0064 .dbline 59
0064 ; else if(val== 'C') //Write program memory, high byte
0064 4334 cpi R20,67
0066 89F4 brne L21
0068 .dbline 60
0068 ; {
0068 .dbline 61
0068 ; data=ldata|(recchar()<<8);
0068 CFDF rcall _recchar
006A 202E mov R2,R16
006C 3324 clr R3
006E 322C mov R3,R2
0070 2224 clr R2
0072 EC2C mov R14,R12
0074 FF24 clr R15
0076 E228 or R14,R2
0078 F328 or R15,R3
007A .dbline 62
007A ; fill_temp_buffer(data,(address)); //call asm routine.
007A 9B01 movw R18,R22
007C 8701 movw R16,R14
007E 00D0 rcall _fill_temp_buffer
0080 .dbline 63
0080 ; address+=2;
0080 6E5F subi R22,254 ; offset = 2
0082 7F4F sbci R23,255
0084 .dbline 64
0084 ; sendchar('\r');
0084 0DE0 ldi R16,13
0086 BCDF rcall _sendchar
0088 .dbline 65
0088 ; }
0088 D1CF rjmp L11
008A L21:
008A .dbline 66
008A ; else if(val=='e') //Chip erase
008A 4536 cpi R20,101
008C 79F4 brne L23
008E .dbline 67
008E ; {
008E .dbline 68
008E ; for(address=0;address < APP_END;address += PAGESIZE) //Application section = 60 pages
008E 6627 clr R22
0090 7727 clr R23
0092 05C0 rjmp L28
0094 L25:
0094 .dbline 69
0094 .dbline 70
0094 23E0 ldi R18,3
0096 8B01 movw R16,R22
0098 00D0 rcall _write_page
009A .dbline 71
009A L26:
009A .dbline 68
009A 605C subi R22,192 ; offset = 64
009C 7F4F sbci R23,255
009E L28:
009E .dbline 68
009E 6030 cpi R22,0
00A0 ECE1 ldi R30,28
00A2 7E07 cpc R23,R30
00A4 B8F3 brlo L25
00A6 .dbline 72
00A6 ; {
00A6 ; write_page(address,0x03); //Perform page erase
00A6 ; }
00A6 ; sendchar('\r');
00A6 0DE0 ldi R16,13
00A8 ABDF rcall _sendchar
00AA .dbline 73
00AA ; }
00AA C0CF rjmp L11
00AC L23:
00AC .dbline 74
00AC ; else if(val=='l') // write lockbits
00AC 4C36 cpi R20,108
00AE 29F4 brne L29
00B0 .dbline 75
00B0 ; {
00B0 .dbline 76
00B0 ; write_lock_bits(recchar());
00B0 ABDF rcall _recchar
00B2 00D0 rcall _write_lock_bits
00B4 .dbline 77
00B4 ; sendchar('\r');
00B4 0DE0 ldi R16,13
00B6 A4DF rcall _sendchar
00B8 .dbline 78
00B8 ; }
00B8 B9CF rjmp L11
00BA L29:
00BA .dbline 79
00BA ; else if(val== 'm') // write page
00BA 4D36 cpi R20,109
00BC 31F4 brne L31
00BE .dbline 80
00BE ; {
00BE .dbline 81
00BE ; write_page((address),0x05);
00BE 25E0 ldi R18,5
00C0 8B01 movw R16,R22
00C2 00D0 rcall _write_page
00C4 .dbline 82
00C4 ; sendchar('\r');
00C4 0DE0 ldi R16,13
00C6 9CDF rcall _sendchar
00C8 .dbline 83
00C8 ; }
00C8 B1CF rjmp L11
00CA L31:
00CA .dbline 84
00CA ; else if((val=='P')||(val=='L')) // Enter programming mode
00CA 4035 cpi R20,80
00CC 11F0 breq L35
00CE 4C34 cpi R20,76
00D0 19F4 brne L33
00D2 L35:
00D2 .dbline 85
00D2 ; {
00D2 .dbline 86
00D2 ; sendchar('\r');
00D2 0DE0 ldi R16,13
00D4 95DF rcall _sendchar
00D6 .dbline 87
00D6 ; }
00D6 AACF rjmp L11
00D8 L33:
00D8 .dbline 88
00D8 ; else if (val=='p')
00D8 4037 cpi R20,112
00DA 19F4 brne L36
00DC .dbline 89
00DC ; {
00DC .dbline 90
00DC ; sendchar('S');
00DC 03E5 ldi R16,83
00DE 90DF rcall _sendchar
00E0 .dbline 91
00E0 ; }
00E0 A5CF rjmp L11
00E2 L36:
00E2 .dbline 92
00E2 ; else if(val=='R') //Read program memory
00E2 4235 cpi R20,82
00E4 B9F4 brne L38
00E6 .dbline 93
00E6 ; {
00E6 .dbline 94
00E6 ; if (address>=APP_END)
00E6 6030 cpi R22,0
00E8 ECE1 ldi R30,28
00EA 7E07 cpc R23,R30
00EC 38F0 brlo L40
00EE .dbline 95
00EE ; {
00EE .dbline 96
00EE ; sendchar(0xff);
00EE 0FEF ldi R16,255
00F0 87DF rcall _sendchar
00F2 .dbline 97
00F2 ; sendchar(0xff);
00F2 0FEF ldi R16,255
00F4 85DF rcall _sendchar
00F6 .dbline 98
00F6 ; address+=2;
00F6 6E5F subi R22,254 ; offset = 2
00F8 7F4F sbci R23,255
00FA .dbline 99
00FA ; }
00FA 98CF rjmp L11
00FC L40:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -