www.pudn.com > usbcode.rar > NFlash32.lis
.module NFlash32.c
.area data(ram, con, rel)
0000 _WriteResidueVal::
0000 .blkb 2
.area idata
0000 0000 .word 0
.area data(ram, con, rel)
0002 .dbfile G:\source\NFlash32.c
0002 .dbsym s WriteResidueVal _WriteResidueVal i
0002 _Flash_Write_Sec::
0002 .blkb 1
.area idata
0002 00 .byte 0
.area data(ram, con, rel)
0003 .dbfile G:\source\NFlash32.c
0003 .dbsym s Flash_Write_Sec _Flash_Write_Sec c
0003 _Flash_Write_Col::
0003 .blkb 1
.area idata
0003 00 .byte 0
.area data(ram, con, rel)
0004 .dbfile G:\source\NFlash32.c
0004 .dbsym s Flash_Write_Col _Flash_Write_Col c
0004 _Flash_Write_addl::
0004 .blkb 1
.area idata
0004 00 .byte 0
.area data(ram, con, rel)
0005 .dbfile G:\source\NFlash32.c
0005 .dbsym s Flash_Write_addl _Flash_Write_addl c
0005 _Flash_Write_addh::
0005 .blkb 1
.area idata
0005 00 .byte 0
.area data(ram, con, rel)
0006 .dbfile G:\source\NFlash32.c
0006 .dbsym s Flash_Write_addh _Flash_Write_addh c
0006 _ReadResidueVal::
0006 .blkb 4
.area idata
0006 00000000 .word 0,0
.area data(ram, con, rel)
000A .dbfile G:\source\NFlash32.c
000A .dbsym s ReadResidueVal _ReadResidueVal l
000A _Flash_Read_Sec::
000A .blkb 1
.area idata
000A 00 .byte 0
.area data(ram, con, rel)
000B .dbfile G:\source\NFlash32.c
000B .dbsym s Flash_Read_Sec _Flash_Read_Sec c
000B _Flash_Read_Col::
000B .blkb 1
.area idata
000B 00 .byte 0
.area data(ram, con, rel)
000C .dbfile G:\source\NFlash32.c
000C .dbsym s Flash_Read_Col _Flash_Read_Col c
000C _Flash_Read_addl::
000C .blkb 1
.area idata
000C 00 .byte 0
.area data(ram, con, rel)
000D .dbfile G:\source\NFlash32.c
000D .dbsym s Flash_Read_addl _Flash_Read_addl c
000D _Flash_Read_addh::
000D .blkb 1
.area idata
000D 00 .byte 0
.area data(ram, con, rel)
000E .dbfile G:\source\NFlash32.c
000E .dbsym s Flash_Read_addh _Flash_Read_addh c
.area text(rom, con, rel)
0000 .dbfile G:\source\NFlash32.c
0000 .dbfunc s flashErase _flashErase fI
; i -> R20
; addl -> R22
; addh -> R10
.even
0000 _flashErase::
0000 00D0 rcall push_gset3
0002 622F mov R22,R18
0004 A02E mov R10,R16
0006 2497 sbiw R28,4
0008 .dbline -1
0008 .dbline 61
; /*++
;
; Module Name:
;
; NFlash32.c
;
; Abstract:
;
; Header file related to D12 module
;
; Environment:
;
; ICCAVR 6.29
;
; Revision History:
;
; 04/23/2004 chenchi created
;
; --*/
; /******************************************************************/
; #include "io8515v.h"
; #include "d12.h"
; #include "scsi.h"
; #include "nflash32.h"
;
; unsigned int WriteResidueVal = 0;
; unsigned char Flash_Write_Sec = 0x00;
; unsigned char Flash_Write_Col = 0x00;
; unsigned char Flash_Write_addl = 0x00;
; unsigned char Flash_Write_addh = 0x00;
; unsigned long ReadResidueVal = 0;
; unsigned char Flash_Read_Sec = 0x00;
; unsigned char Flash_Read_Col = 0x00;
; unsigned char Flash_Read_addl = 0x00;
; unsigned char Flash_Read_addh = 0x00;
;
; /************************************************************
; **工程名称:U盘固件程序开发
; **编译器类型及版本:ICCAVR 6.26C
; **日期:2004.4.30
; **创建人:陈驰
; **所属单位:湖南大学计算机与通信学院
;
; **芯片类型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0
; **时钟频率:8MHZ
;
; **函数功能:块擦除函数
; **函数输入参数及说明:
; addh:高地址
; addl:低地址
;
; **函数返回值:无
; **在本函数以外定义的变量:fCOMMAND,fADD,fWPs,fWPc,fRB
; **调用的函数说明:无
;
; **修改人:陈驰
; **修改日期:2004.4.30
; **修改说明:创建
; *************************************************************/
; void flashErase(unsigned char addh,unsigned char addl)
; {
0008 .dbline 62
; unsigned char i=0;
0008 4427 clr R20
000A .dbline 63
; fWPs;//打开写保护
000A 959A SBI 0x12,5
000C .dbline 63
000C .dbline 64
; fCOMMAND = 0x60;//块擦除命令
000C 80E6 ldi R24,96
000E 809300A0 sts 40960,R24
0012 .dbline 65
; fADD = addl;//低地址
0012 60930090 sts 36864,R22
0016 .dbline 66
; fADD = addh;//高地址
0016 A0920090 sts 36864,R10
001A .dbline 67
; fCOMMAND = 0xd0;//处理命令
001A 80ED ldi R24,208
001C 809300A0 sts 40960,R24
0020 .dbline 68
; asm("nop \n nop");
0020 0000 nop
0022 0000 nop
0024 L5:
0024 .dbline 69
0024 L6:
0024 .dbline 69
; while(!fRB);
0024 849B sbis 0x10,4
0026 FECF rjmp L5
0028 .dbline 70
; fCOMMAND = 0x70;//读状态命令
0028 80E7 ldi R24,112
002A 809300A0 sts 40960,R24
002E .dbline 71
; i = fDATA;//读状态值
002E 40910080 lds R20,32768
0032 .dbline 72
; csram;
0032 609301FC sts 0xfc01,R22
0036 .dbline 72
0036 .dbline 73
; fWPc;//写保护
0036 9598 CBI 0x12,5
0038 .dbline 73
0038 .dbline 74
; printf("%x,%x erase is %x",addh,addl,i);//串口打印
0038 242E mov R2,R20
003A 3324 clr R3
003C 2A82 std y+2,R2
003E 3B82 std y+3,R3
0040 262E mov R2,R22
0042 3324 clr R3
0044 2882 std y+0,R2
0046 3982 std y+1,R3
0048 2A2D mov R18,R10
004A 3327 clr R19
004C 00E0 ldi R16,L8
0050 00D0 rcall _printf
0052 .dbline -2
0052 .dbline 75
; }
0052 L4:
0052 2496 adiw R28,4
0054 00D0 rcall pop_gset3
0056 .dbline 0 ; func end
0056 0895 ret
0058 .dbsym r i 20 c
0058 .dbsym r addl 22 c
0058 .dbsym r addh 10 c
0058 .dbfunc s flashWritecmd _flashWritecmd fI
; Start_add -> y+9
; End_add -> y+7
; WritePageNum -> y+5
; Erase_Count -> y+3
; Erase_addh -> R14
; Dest_two_addh -> R22
; Sour_two_addh -> R10
; Dest_addh -> y+19
; Sour_addh -> y+18
; CopyBack_two_count -> y+16
; CopyBack_Count -> y+14
; Erase_addl -> y+13
; Dest_two_addl -> R12
; Sour_two_addl -> R20
; Dest_addl -> y+12
; Sour_addl -> y+11
; i -> R6,R7
.even
0058 _flashWritecmd::
0058 00D0 rcall push_gset5
005A 6497 sbiw R28,20
005C .dbline -1
005C .dbline 98
; /************************************************************
; **工程名称:U盘固件程序开发
; **编译器类型及版本:ICCAVR 6.26C
; **日期:2004.4.30
; **创建人:陈驰
; **所属单位:湖南大学计算机与通信学院
;
; **芯片类型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0
; **时钟频率:8MHZ
;
; **函数功能:写FLASH预处理函数
; **函数输入参数及说明:无
;
; **函数返回值:无
; **在本函数以外定义的变量:
; **调用的函数说明:无
;
; **修改人:陈驰
; **修改日期:2004.4.30
; **修改说明:创建
; *************************************************************/
; void flashWritecmd(void)
; {
005C .dbline 102
; unsigned char Erase_addh,Erase_addl;
; unsigned char Sour_addh,Sour_addl,Dest_addh,Dest_addl;
; unsigned char Sour_two_addh,Sour_two_addl,Dest_two_addh,Dest_two_addl;
; unsigned int Erase_Count = 0,i = 0;
005C 2224 clr R2
005E 3324 clr R3
0060 2B82 std y+3,R2
0062 3C82 std y+4,R3
0064 .dbline 102
0064 6624 clr R6
0066 7724 clr R7
0068 .dbline 103
; unsigned int CopyBack_Count = 0;
0068 0024 clr R0
006A 1124 clr R1
006C 0E86 std y+14,R0
006E 1F86 std y+15,R1
0070 .dbline 104
; unsigned int CopyBack_two_count = 0;
0070 088A std y+16,R0
0072 198A std y+17,R1
0074 .dbline 105
; unsigned int WritePageNum = 0;
0074 2224 clr R2
0076 2D82 std y+5,R2
0078 3E82 std y+6,R3
007A .dbline 124
; union{
; unsigned char c[2];
; unsigned int add;
; }Start_add;
; union{
; unsigned char c[2];
; unsigned int add;
; }End_add;
; /************说明*****************
; 对于FLASH的写操作原理是,写之前
; 必须擦除,FLASH写是按页写,但是擦
; 除是按块擦除,1块 = 32页,所以在
; 一块内只有部分页被写入时就需要先
; 将块内其他页保存,代整块擦除后一起
; 写入,这里用0XFA,0X00作为头块缓冲,
; 0XFB,0X00作为最后块缓冲,中间块采
; 用直接擦除处理
; **********************************/
; flashErase(0xfa, 0x00);
007A 2227 clr R18
007C 0AEF ldi R16,250
007E 6F92 push R6
0080 7F92 push R7
0082 BEDF rcall _flashErase
0084 7F90 pop R7
0086 6F90 pop R6
0088 .dbline 125
; Sour_addh = XmtBuff.b[19];
0088 20901300 lds R2,_XmtBuff+19
008C 2A8A std y+18,R2
008E .dbline 126
; Sour_addl = (XmtBuff.b[20]/0x20) * 0x20;
008E 10E2 ldi R17,32
0090 00911400 lds R16,_XmtBuff+20
0094 00D0 rcall div8u
0096 202E mov R2,R16
0098 220C lsl R2
009A 220C lsl R2
009C 220C lsl R2
009E 220C lsl R2
00A0 220C lsl R2
00A2 2B86 std y+11,R2
00A4 .dbline 127
; Dest_addh = 0xfa;
00A4 8AEF ldi R24,250
00A6 8B8B std y+19,R24
00A8 .dbline 128
; Dest_addl = (XmtBuff.b[20]/0x20) * 0x20;
00A8 10E2 ldi R17,32
00AA 00911400 lds R16,_XmtBuff+20
00AE 00D0 rcall div8u
00B0 202E mov R2,R16
00B2 220C lsl R2
00B4 220C lsl R2
00B6 220C lsl R2
00B8 220C lsl R2
00BA 220C lsl R2
00BC 2C86 std y+12,R2
00BE .dbline 129
; CopyBack_Count = XmtBuff.b[20]%0x20;
00BE 20E2 ldi R18,32
00C0 30E0 ldi R19,0
00C2 00911400 lds R16,_XmtBuff+20
00C6 1127 clr R17
00C8 00D0 rcall mod16s
00CA 0E87 std y+14,R16
00CC 1F87 std y+15,R17
00CE .dbline 130
00CE 6624 clr R6
00D0 7724 clr R7
00D2 16C0 rjmp L19
00D4 L16:
00D4 .dbline 130
00D4 .dbline 131
00D4 0C84 ldd R0,y+12
00D6 0A82 std y+2,R0
00D8 0B88 ldd R0,y+19
00DA 0882 std y+0,R0
00DC 2B85 ldd R18,y+11
00DE 0A89 ldd R16,y+18
00E0 6F92 push R6
00E2 7F92 push R7
00E4 74D1 rcall _flashCopyBLack
00E6 7F90 pop R7
00E8 6F90 pop R6
00EA .dbline 132
00EA 0B84 ldd R0,y+11
00EC 0394 inc R0
00EE 0B86 std y+11,R0
00F0 .dbline 133
00F0 0C84 ldd R0,y+12
00F2 0394 inc R0
00F4 0C86 std y+12,R0
00F6 .dbline 134
00F6 L17:
00F6 .dbline 130
00F6 862D mov R24,R6
00F8 972D mov R25,R7
00FA 0196 adiw R24,1
00FC 682E mov R6,R24
00FE 792E mov R7,R25
0100 L19:
0100 .dbline 130
; for(i=0;i (0x20 - (XmtBuff.b[20] % 0x20)))
0162 20E2 ldi R18,32
0164 30E0 ldi R19,0
0166 00911400 lds R16,_XmtBuff+20
016A 1127 clr R17
016C 00D0 rcall mod16s
016E 80E2 ldi R24,32
0170 90E0 ldi R25,0
0172 801B sub R24,R16
0174 910B sbc R25,R17
0176 ED81 ldd R30,y+5
0178 FE81 ldd R31,y+6
017A EF71 andi R30,31
017C F070 andi R31,0
017E 8E17 cp R24,R30
0180 9F07 cpc R25,R31
0182 88F4 brsh L25
0184 .dbline 142
; Erase_Count ++;
0184 8B81 ldd R24,y+3
0186 9C81 ldd R25,y+4
0188 0196 adiw R24,1
018A 8B83 std y+3,R24
018C 9C83 std y+4,R25
018E .dbline 143
018E 0BC0 rjmp L25
0190 L24:
0190 .dbline 143
; }else if(XmtBuff.b[20] % 0x20){
0190 10E2 ldi R17,32
0192 00911400 lds R16,_XmtBuff+20
0196 00D0 rcall mod8u
0198 0023 tst R16
019A 29F0 breq L29
019C .dbline 143
019C .dbline 144
; Erase_Count ++;
019C 8B81 ldd R24,y+3
019E 9C81 ldd R25,y+4
01A0 0196 adiw R24,1
01A2 8B83 std y+3,R24
01A4 9C83 std y+4,R25
01A6 .dbline 145
; }
01A6 L29:
01A6 L25:
01A6 .dbline 146
; Start_add.add = (XmtBuff.b[19]<<8)+XmtBuff.b[20];
01A6 20901400 lds R2,_XmtBuff+20
01AA 3324 clr R3
01AC 40901300 lds R4,_XmtBuff+19
01B0 5524 clr R5
01B2 542C mov R5,R4
01B4 4424 clr R4
01B6 420C add R4,R2
01B8 531C adc R5,R3
01BA 4986 std y+9,R4
01BC 5A86 std y+10,R5
01BE .dbline 147
; End_add.add = Start_add.add + WritePageNum;
01BE 2D80 ldd R2,y+5
01C0 3E80 ldd R3,y+6
01C2 420C add R4,R2
01C4 531C adc R5,R3
01C6 4F82 std y+7,R4
01C8 5886 std y+8,R5
01CA .dbline 148
; flashErase(0xfb, 0x00);
01CA 2227 clr R18
01CC 0BEF ldi R16,251
01CE 6F92 push R6
01D0 7F92 push R7
01D2 16DF rcall _flashErase
01D4 7F90 pop R7
01D6 6F90 pop R6
01D8 .dbline 149
; Sour_two_addh = End_add.c[1];
01D8 A884 ldd R10,y+8
01DA .dbline 150
; Sour_two_addl = End_add.c[0];
01DA 4F81 ldd R20,y+7
01DC .dbline 151
; Dest_two_addh = 0xfb;
01DC 6BEF ldi R22,251
01DE .dbline 152
; Dest_two_addl = End_add.c[0];
01DE CF80 ldd R12,y+7
01E0 .dbline 153
; CopyBack_two_count = (Erase_Count * 0x20) - CopyBack_Count -WritePageNum;
01E0 25E0 ldi R18,5
01E2 30E0 ldi R19,0
01E4 0B81 ldd R16,y+3
01E6 1C81 ldd R17,y+4
01E8 00D0 rcall lsl16
01EA 202E mov R2,R16
01EC 312E mov R3,R17
01EE 0E84 ldd R0,y+14
01F0 1F84 ldd R1,y+15
01F2 2018 sub R2,R0
01F4 3108 sbc R3,R1
01F6 4D80 ldd R4,y+5
01F8 5E80 ldd R5,y+6
01FA 2418 sub R2,R4
01FC 3508 sbc R3,R5
01FE 288A std y+16,R2
0200 398A std y+17,R3
0202 .dbline 154
0202 6624 clr R6
0204 7724 clr R7
0206 10C0 rjmp L38
0208 L35:
0208 .dbline 154
0208 .dbline 155
0208 CA82 std y+2,R12
020A 6883 std y+0,R22
020C 242F mov R18,R20
020E 0A2D mov R16,R10
0210 6F92 push R6
0212 7F92 push R7
0214 DCD0 rcall _flashCopyBLack
0216 7F90 pop R7
0218 6F90 pop R6
021A .dbline 156
021A 4395 inc R20
021C .dbline 157
021C C394 inc R12
021E .dbline 158
021E L36:
021E .dbline 154
021E 862D mov R24,R6
0220 972D mov R25,R7
0222 0196 adiw R24,1
0224 682E mov R6,R24
0226 792E mov R7,R25
0228 L38:
0228 .dbline 154
; for(i=0;i R20,R21
; PageBuff -> R16,R17
.even
0316 _flashWrite::
0316 00D0 rcall push_gset1
0318 .dbline -1
0318 .dbline 205
; /************************************************************
; **工程名称:U盘固件程序开发
; **编译器类型及版本:ICCAVR 6.26C
; **日期:2004.4.30
; **创建人:陈驰
; **所属单位:湖南大学计算机与通信学院
;
; **芯片类型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0
; **时钟频率:8MHZ
;
; **函数功能:写FLASH函数
; **函数输入参数及说明:写入数据
;
; **函数返回值:无
; **在本函数以外定义的变量:
; **调用的函数说明:无
;
; **修改人:陈驰
; **修改日期:2004.4.30
; **修改说明:创建
; *************************************************************/
; void flashWrite(unsigned char * PageBuff)
; {
0318 .dbline 207
; unsigned int i;
; if(WriteResidueVal > 0)
0318 30900100 lds R3,_WriteResidueVal+1
031C 20900000 lds R2,_WriteResidueVal
0320 2220 tst R2
0322 19F4 brne X0
0324 3320 tst R3
0326 09F4 brne X1
0328 50C0 rjmp L58
032A X1:
032A X0:
032A .dbline 208
; {
032A .dbline 209
; fWPs;//打开写保护
032A 959A SBI 0x12,5
032C .dbline 209
032C .dbline 210
; fCOMMAND = 0x00;//从FRIST部分开始
032C 2224 clr R2
032E 209200A0 sts 40960,R2
0332 .dbline 211
; fCOMMAND = 0x80;//写FLASH命令
0332 80E8 ldi R24,128
0334 809300A0 sts 40960,R24
0338 .dbline 212
; fADD = 0x00;//从0列开始
0338 2224 clr R2
033A 20920090 sts 36864,R2
033E .dbline 213
; fADD = Flash_Write_addl;//页地址低位
033E 20900400 lds R2,_Flash_Write_addl
0342 20920090 sts 36864,R2
0346 .dbline 214
; fADD = Flash_Write_addh;//页地址高位
0346 20900500 lds R2,_Flash_Write_addh
034A 20920090 sts 36864,R2
034E .dbline 216
;
; for(i=0;i<512;i++)
034E 4427 clr R20
0350 5527 clr R21
0352 09C0 rjmp L63
0354 L60:
0354 .dbline 217
0354 .dbline 218
0354 E42F mov R30,R20
0356 F52F mov R31,R21
0358 E00F add R30,R16
035A F11F adc R31,R17
035C 2080 ldd R2,z+0
035E 20920080 sts 32768,R2
0362 .dbline 219
0362 L61:
0362 .dbline 216
0362 4F5F subi R20,255 ; offset = 1
0364 5F4F sbci R21,255
0366 L63:
0366 .dbline 216
0366 4030 cpi R20,0
0368 E2E0 ldi R30,2
036A 5E07 cpc R21,R30
036C 98F3 brlo L60
036E .dbline 221
; {
; fDATA = PageBuff[i];//写数据到FLASH指定页里
; }
;
; fCOMMAND = 0x10;
036E 80E1 ldi R24,16
0370 809300A0 sts 40960,R24
0374 .dbline 222
; asm("nop \n nop");
0374 0000 nop
0376 0000 nop
0378 L64:
0378 .dbline 223
0378 L65:
0378 .dbline 223
; while(!fRB);
0378 849B sbis 0x10,4
037A FECF rjmp L64
037C .dbline 224
; fCOMMAND = 0x70;//读状态值命令
037C 80E7 ldi R24,112
037E 809300A0 sts 40960,R24
0382 .dbline 225
; i = fDATA;//读状态值
0382 40910080 lds R20,32768
0386 5527 clr R21
0388 .dbline 226
; D12_COMMAND = 0xf2;//清端点缓冲区
0388 82EF ldi R24,242
038A 8093017C sts 31745,R24
038E .dbline 227
; csram;
038E 609301FC sts 0xfc01,R22
0392 .dbline 227
0392 .dbline 228
; fWPc;//写保护
0392 9598 CBI 0x12,5
0394 .dbline 228
0394 .dbline 230
;
; WriteResidueVal = WriteResidueVal - 1;
0394 90910100 lds R25,_WriteResidueVal+1
0398 80910000 lds R24,_WriteResidueVal
039C 0197 sbiw R24,1
039E 90930100 sts _WriteResidueVal+1,R25
03A2 80930000 sts _WriteResidueVal,R24
03A6 .dbline 231
; if(Flash_Write_addl== 255){
03A6 80910400 lds R24,_Flash_Write_addl
03AA 8F3F cpi R24,255
03AC 49F4 brne L67
03AE .dbline 231
03AE .dbline 232
; Flash_Write_addl= 0x00;
03AE 2224 clr R2
03B0 20920400 sts _Flash_Write_addl,R2
03B4 .dbline 233
; Flash_Write_addh++;
03B4 80910500 lds R24,_Flash_Write_addh
03B8 8F5F subi R24,255 ; addi 1
03BA 80930500 sts _Flash_Write_addh,R24
03BE .dbline 234
; }else
03BE 05C0 rjmp L68
03C0 L67:
03C0 .dbline 235
; Flash_Write_addl++;
03C0 80910400 lds R24,_Flash_Write_addl
03C4 8F5F subi R24,255 ; addi 1
03C6 80930400 sts _Flash_Write_addl,R24
03CA L68:
03CA .dbline 236
03CA L58:
03CA .dbline -2
03CA .dbline 237
; }
; }
03CA L57:
03CA 00D0 rcall pop_gset1
03CC .dbline 0 ; func end
03CC 0895 ret
03CE .dbsym r i 20 i
03CE .dbsym r PageBuff 16 pc
03CE .dbfunc s flashCopyBLack _flashCopyBLack fI
; i -> R20
; Destination_addl -> R22
; Destination_addh -> R10
; Source_addl -> R18
; Source_addh -> R16
.even
03CE _flashCopyBLack::
03CE 00D0 rcall push_gset3
03D0 AE80 ldd R10,y+6
03D2 BF80 ldd R11,y+7
03D4 6885 ldd R22,y+8
03D6 7985 ldd R23,y+9
03D8 .dbline -1
03D8 .dbline 264
; /************************************************************
; **工程名称:U盘固件程序开发
; **编译器类型及版本:ICCAVR 6.26C
; **日期:2004.4.30
; **创建人:陈驰
; **所属单位:湖南大学计算机与通信学院
;
; **芯片类型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0
; **时钟频率:8MHZ
;
; **函数功能:FLASH页拷贝命令
; **函数输入参数及说明:
; Source_addh:源地址高位
; Source_addl:源地址低位
; Destination_addh:目的地址高位
; Destination_addl:目的地址低位
;
; **函数返回值:无
; **在本函数以外定义的变量:
; **调用的函数说明:无
;
; **修改人:陈驰
; **修改日期:2004.4.30
; **修改说明:创建
; *************************************************************/
; void flashCopyBLack(unsigned char Source_addh,unsigned char Source_addl,unsigned char Destination_addh,unsigned char Destination_addl)
; {
03D8 .dbline 266
; unsigned char i;
; fWPs;//打开写保护
03D8 959A SBI 0x12,5
03DA .dbline 266
03DA .dbline 267
; fCOMMAND = 0x00;//页拷贝命令
03DA 2224 clr R2
03DC 209200A0 sts 40960,R2
03E0 .dbline 269
; /*源地址*/
; fADD = 0x00;
03E0 20920090 sts 36864,R2
03E4 .dbline 270
; fADD = Source_addl;
03E4 20930090 sts 36864,R18
03E8 .dbline 271
; fADD = Source_addh;
03E8 00930090 sts 36864,R16
03EC .dbline 272
; asm("nop \n nop");
03EC 0000 nop
03EE 0000 nop
03F0 L70:
03F0 .dbline 273
03F0 L71:
03F0 .dbline 273
; while(!fRB);
03F0 849B sbis 0x10,4
03F2 FECF rjmp L70
03F4 .dbline 275
;
; fCOMMAND = 0x8a;//页拷贝命令
03F4 8AE8 ldi R24,138
03F6 809300A0 sts 40960,R24
03FA .dbline 277
; /*目的地址*/
; fADD = 0x00;
03FA 2224 clr R2
03FC 20920090 sts 36864,R2
0400 .dbline 278
; fADD = Destination_addl;
0400 60930090 sts 36864,R22
0404 .dbline 279
; fADD = Destination_addh;
0404 A0920090 sts 36864,R10
0408 .dbline 280
; asm("nop \n nop");
0408 0000 nop
040A 0000 nop
040C L73:
040C .dbline 281
040C L74:
040C .dbline 281
; while(!fRB);
040C 849B sbis 0x10,4
040E FECF rjmp L73
0410 .dbline 283
;
; fCOMMAND = 0x70;//读状态命令
0410 80E7 ldi R24,112
0412 809300A0 sts 40960,R24
0416 .dbline 284
; i = fDATA;//读状态值
0416 40910080 lds R20,32768
041A .dbline 285
; csram;
041A 609301FC sts 0xfc01,R22
041E .dbline 285
041E .dbline 286
; fWPc;//写保护
041E 9598 CBI 0x12,5
0420 .dbline 286
0420 .dbline -2
0420 .dbline 287
; }
0420 L69:
0420 00D0 rcall pop_gset3
0422 .dbline 0 ; func end
0422 0895 ret
0424 .dbsym r i 20 c
0424 .dbsym r Destination_addl 22 c
0424 .dbsym r Destination_addh 10 c
0424 .dbsym r Source_addl 18 c
0424 .dbsym r Source_addh 16 c
0424 .dbfunc s flashReadcmd _flashReadcmd fI
.even
0424 _flashReadcmd::
0424 .dbline -1
0424 .dbline 310
; /************************************************************
; **工程名称:U盘固件程序开发
; **编译器类型及版本:ICCAVR 6.26C
; **日期:2004.4.30
; **创建人:陈驰
; **所属单位:湖南大学计算机与通信学院
;
; **芯片类型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0
; **时钟频率:8MHZ
;
; **函数功能:读FLASH预处理函数
; **函数输入参数及说明:无
;
; **函数返回值:无
; **在本函数以外定义的变量:
; **调用的函数说明:无
;
; **修改人:陈驰
; **修改日期:2004.4.30
; **修改说明:创建
; *************************************************************/
; void flashReadcmd(void)
; {
0424 .dbline 316
; /****************说明************
; 对于FLASH的读原理为:FLASH的读
; 可以是随机读取,所以这里只要给
; 定读数据的首地址和读写长度
; ********************************/
; Flash_Read_Sec = 0x00;
0424 2224 clr R2
0426 20920A00 sts _Flash_Read_Sec,R2
042A .dbline 317
; Flash_Read_Col = 0x00;
042A 20920B00 sts _Flash_Read_Col,R2
042E .dbline 318
; Flash_Read_addl = XmtBuff.b[20];
042E 20901400 lds R2,_XmtBuff+20
0432 20920C00 sts _Flash_Read_addl,R2
0436 .dbline 319
; Flash_Read_addh = XmtBuff.b[19];
0436 20901300 lds R2,_XmtBuff+19
043A 20920D00 sts _Flash_Read_addh,R2
043E .dbline 320
; ReadResidueVal = (XmtBuff.b[22]<<8) + XmtBuff.b[23];
043E 20901700 lds R2,_XmtBuff+23
0442 3324 clr R3
0444 40901600 lds R4,_XmtBuff+22
0448 5524 clr R5
044A 542C mov R5,R4
044C 4424 clr R4
044E 420C add R4,R2
0450 531C adc R5,R3
0452 242C mov R2,R4
0454 352C mov R3,R5
0456 4424 clr R4
0458 37FC sbrc R3,7
045A 4094 com R4
045C 5524 clr R5
045E 47FC sbrc R4,7
0460 5094 com R5
0462 30920700 sts _ReadResidueVal+1,R3
0466 20920600 sts _ReadResidueVal,R2
046A 50920900 sts _ReadResidueVal+2+1,R5
046E 40920800 sts _ReadResidueVal+2,R4
0472 .dbline 321
; ReadResidueVal = 512 * ReadResidueVal;
0472 89E0 ldi R24,9
0474 90E0 ldi R25,0
0476 8A93 st -y,R24
0478 022D mov R16,R2
047A 132D mov R17,R3
047C 242D mov R18,R4
047E 352D mov R19,R5
0480 00D0 rcall lsl32
0482 10930700 sts _ReadResidueVal+1,R17
0486 00930600 sts _ReadResidueVal,R16
048A 30930900 sts _ReadResidueVal+2+1,R19
048E 20930800 sts _ReadResidueVal+2,R18
0492 .dbline 322
; fCOMMAND = 0xff;
0492 8FEF ldi R24,255
0494 809300A0 sts 40960,R24
0498 .dbline 323
; asm("nop \n nop");
0498 0000 nop
049A 0000 nop
049C L81:
049C .dbline 324
049C L82:
049C .dbline 324
; while(!fRB);
049C 849B sbis 0x10,4
049E FECF rjmp L81
04A0 .dbline -2
04A0 .dbline 325
; }
04A0 L76:
04A0 .dbline 0 ; func end
04A0 0895 ret
04A2 .dbfunc s flashRead _flashRead fI
; temp -> R10
; i -> R10
.even
04A2 _flashRead::
04A2 00D0 rcall push_gset4
04A4 .dbline -1
04A4 .dbline 348
; /************************************************************
; **工程名称:U盘固件程序开发
; **编译器类型及版本:ICCAVR 6.26C
; **日期:2004.4.30
; **创建人:陈驰
; **所属单位:湖南大学计算机与通信学院
;
; **芯片类型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0
; **时钟频率:8MHZ
;
; **函数功能:读FLASH函数
; **函数输入参数及说明:无
;
; **函数返回值:无
; **在本函数以外定义的变量:
; **调用的函数说明:无
;
; **修改人:陈驰
; **修改日期:2004.4.30
; **修改说明:创建
; *************************************************************/
; void flashRead(void)
; {
04A4 .dbline 351
; unsigned char i;
; unsigned char temp;
; if(ReadResidueVal > 0){
04A4 00E0 ldi R16,L87
04A8 00D0 rcall lpm32
04AA 50900900 lds R5,_ReadResidueVal+2+1
04AE 40900800 lds R4,_ReadResidueVal+2
04B2 30900700 lds R3,_ReadResidueVal+1
04B6 20900600 lds R2,_ReadResidueVal
04BA 2016 cp R2,R16
04BC 3106 cpc R3,R17
04BE 4206 cpc R4,R18
04C0 5306 cpc R5,R19
04C2 09F4 brne X3
04C4 8DC0 rjmp L85
04C6 X3:
04C6 .dbline 351
04C6 .dbline 352
; ReadResidueVal -= 64;
04C6 00E0 ldi R16,L88
04CA 00D0 rcall lpm32
04CC 50900900 lds R5,_ReadResidueVal+2+1
04D0 40900800 lds R4,_ReadResidueVal+2
04D4 30900700 lds R3,_ReadResidueVal+1
04D8 20900600 lds R2,_ReadResidueVal
04DC 201A sub R2,R16
04DE 310A sbc R3,R17
04E0 420A sbc R4,R18
04E2 530A sbc R5,R19
04E4 30920700 sts _ReadResidueVal+1,R3
04E8 20920600 sts _ReadResidueVal,R2
04EC 50920900 sts _ReadResidueVal+2+1,R5
04F0 40920800 sts _ReadResidueVal+2,R4
04F4 .dbline 353
; temp = (unsigned char)(Flash_Read_Col + 64);
04F4 80910B00 lds R24,_Flash_Read_Col
04F8 9927 clr R25
04FA 805C subi R24,192 ; offset = 64
04FC 9F4F sbci R25,255
04FE A82E mov R10,R24
0500 .dbline 354
; fCOMMAND = Flash_Read_Sec;
0500 20900A00 lds R2,_Flash_Read_Sec
0504 209200A0 sts 40960,R2
0508 .dbline 355
; fADD = Flash_Read_Col;
0508 20900B00 lds R2,_Flash_Read_Col
050C 20920090 sts 36864,R2
0510 .dbline 356
; fADD = Flash_Read_addl;
0510 20900C00 lds R2,_Flash_Read_addl
0514 20920090 sts 36864,R2
0518 .dbline 357
; fADD = Flash_Read_addh;
0518 20900D00 lds R2,_Flash_Read_addh
051C 20920090 sts 36864,R2
0520 .dbline 358
; asm("nop \n nop");
0520 0000 nop
0522 0000 nop
0524 L89:
0524 .dbline 359
0524 L90:
0524 .dbline 359
; while(!fRB);
0524 849B sbis 0x10,4
0526 FECF rjmp L89
0528 .dbline 360
; switch (Flash_Read_Sec)
0528 C0900A00 lds R12,_Flash_Read_Sec
052C DD24 clr R13
052E CC20 tst R12
0530 11F4 brne X4
0532 DD20 tst R13
0534 31F0 breq L95
0536 X4:
0536 81E0 ldi R24,1
0538 90E0 ldi R25,0
053A C816 cp R12,R24
053C D906 cpc R13,R25
053E 81F0 breq L98
0540 2EC0 rjmp L92
0542 X2:
0542 .dbline 361
; {
0542 L95:
0542 .dbline 363
; case 0x00:
; if(temp == 0)
0542 AA20 tst R10
0544 39F4 brne L96
0546 .dbline 364
; {
0546 .dbline 365
; Flash_Read_Sec = 0x01;
0546 81E0 ldi R24,1
0548 80930A00 sts _Flash_Read_Sec,R24
054C .dbline 366
; Flash_Read_Col = 0x00;
054C 2224 clr R2
054E 20920B00 sts _Flash_Read_Col,R2
0552 .dbline 367
; }else
0552 25C0 rjmp L93
0554 L96:
0554 .dbline 368
; {
0554 .dbline 369
; Flash_Read_Col += 64;
0554 80910B00 lds R24,_Flash_Read_Col
0558 805C subi R24,192 ; addi 64
055A 80930B00 sts _Flash_Read_Col,R24
055E .dbline 370
; }
055E .dbline 371
; break;
055E 1FC0 rjmp L93
0560 L98:
0560 .dbline 373
; case 0x01:
; if(temp == 0)
0560 AA20 tst R10
0562 C1F4 brne L99
0564 .dbline 374
; {
0564 .dbline 375
; if(Flash_Read_addl == 255){
0564 80910C00 lds R24,_Flash_Read_addl
0568 8F3F cpi R24,255
056A 49F4 brne L101
056C .dbline 375
056C .dbline 376
; Flash_Read_addl = 0x00;
056C 2224 clr R2
056E 20920C00 sts _Flash_Read_addl,R2
0572 .dbline 377
; Flash_Read_addh ++;
0572 80910D00 lds R24,_Flash_Read_addh
0576 8F5F subi R24,255 ; addi 1
0578 80930D00 sts _Flash_Read_addh,R24
057C .dbline 378
; }else
057C 05C0 rjmp L102
057E L101:
057E .dbline 379
; Flash_Read_addl ++;
057E 80910C00 lds R24,_Flash_Read_addl
0582 8F5F subi R24,255 ; addi 1
0584 80930C00 sts _Flash_Read_addl,R24
0588 L102:
0588 .dbline 380
; Flash_Read_Sec = 0x00;
0588 2224 clr R2
058A 20920A00 sts _Flash_Read_Sec,R2
058E .dbline 381
; Flash_Read_Col = 0x00;
058E 20920B00 sts _Flash_Read_Col,R2
0592 .dbline 382
; }else
0592 05C0 rjmp L93
0594 L99:
0594 .dbline 383
; {
0594 .dbline 384
; Flash_Read_Col += 64;
0594 80910B00 lds R24,_Flash_Read_Col
0598 805C subi R24,192 ; addi 64
059A 80930B00 sts _Flash_Read_Col,R24
059E .dbline 385
; }
059E .dbline 386
; break;
059E L92:
059E L93:
059E .dbline 389
; }
;
; D12_COMMAND = 0x05;//选择端点(指针指向0位置)
059E 85E0 ldi R24,5
05A0 8093017C sts 31745,R24
05A4 .dbline 390
; cwait;
05A4 0000 nop
05A6 .dbline 391
; D12_COMMAND = 0xf0;//写缓冲区
05A6 80EF ldi R24,240
05A8 8093017C sts 31745,R24
05AC .dbline 392
; cwait;
05AC 0000 nop
05AE .dbline 400
; /****************************
; 缓冲区数据结构:
; 字节1:保留,可为任意值
; 字节2:数据字节的数目/长度
; 字节3:数据字节1
; 字节4:数据字节2
; *****************************/
; D12_DATA = 0x00;//字节1
05AE 2224 clr R2
05B0 2092007C sts 31744,R2
05B4 .dbline 401
; cwait;
05B4 0000 nop
05B6 .dbline 402
; D12_DATA = 64;//字节2
05B6 80E4 ldi R24,64
05B8 8093007C sts 31744,R24
05BC .dbline 403
; csram;
05BC 609301FC sts 0xfc01,R22
05C0 .dbline 403
05C0 .dbline 404
; for(i=0;i<64;i++)
05C0 AA24 clr R10
05C2 06C0 rjmp L106
05C4 L103:
05C4 .dbline 405
05C4 .dbline 406
05C4 20900080 lds R2,32768
05C8 2092007C sts 31744,R2
05CC .dbline 407
05CC 0000 nop
05CE .dbline 408
05CE L104:
05CE .dbline 404
05CE A394 inc R10
05D0 L106:
05D0 .dbline 404
05D0 8A2D mov R24,R10
05D2 8034 cpi R24,64
05D4 B8F3 brlo L103
05D6 .dbline 409
05D6 8AEF ldi R24,250
05D8 8093017C sts 31745,R24
05DC .dbline 410
05DC 609301FC sts 0xfc01,R22
05E0 .dbline 410
05E0 .dbline 411
05E0 L85:
05E0 .dbline -2
05E0 .dbline 412
; {
; D12_DATA = fDATA;//写数据
; cwait;
; }
; D12_COMMAND = 0xfa;//设置缓冲区有效(满标志)
; csram;
; }
; }
05E0 L84:
05E0 00D0 rcall pop_gset4
05E2 .dbline 0 ; func end
05E2 0895 ret
05E4 .dbsym r temp 10 c
05E4 .dbsym r i 10 c
.area lit(rom, con, rel)
0000 L88:
0000 40000000 .word 64,0
0004 L87:
0004 00000000 .word 0,0
.area data(ram, con, rel)
000E .dbfile G:\source\NFlash32.c
000E L8:
000E .blkb 18
.area idata
000E 25782C25782065726173652069732025 .byte 37,'x,44,37,'x,32,'e,'r,'a,'s,'e,32,'i,'s,32,37
001E 7800 .byte 'x,0
.area data(ram, con, rel)
0020 .dbfile G:\source\NFlash32.c