www.pudn.com > usbcode.rar > NFlash32.s
.module NFlash32.c
.area data(ram, con, rel)
_WriteResidueVal::
.blkb 2
.area idata
.word 0
.area data(ram, con, rel)
.dbfile G:\source\NFlash32.c
.dbsym s WriteResidueVal _WriteResidueVal i
_Flash_Write_Sec::
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.dbfile G:\source\NFlash32.c
.dbsym s Flash_Write_Sec _Flash_Write_Sec c
_Flash_Write_Col::
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.dbfile G:\source\NFlash32.c
.dbsym s Flash_Write_Col _Flash_Write_Col c
_Flash_Write_addl::
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.dbfile G:\source\NFlash32.c
.dbsym s Flash_Write_addl _Flash_Write_addl c
_Flash_Write_addh::
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.dbfile G:\source\NFlash32.c
.dbsym s Flash_Write_addh _Flash_Write_addh c
_ReadResidueVal::
.blkb 4
.area idata
.word 0,0
.area data(ram, con, rel)
.dbfile G:\source\NFlash32.c
.dbsym s ReadResidueVal _ReadResidueVal l
_Flash_Read_Sec::
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.dbfile G:\source\NFlash32.c
.dbsym s Flash_Read_Sec _Flash_Read_Sec c
_Flash_Read_Col::
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.dbfile G:\source\NFlash32.c
.dbsym s Flash_Read_Col _Flash_Read_Col c
_Flash_Read_addl::
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.dbfile G:\source\NFlash32.c
.dbsym s Flash_Read_addl _Flash_Read_addl c
_Flash_Read_addh::
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.dbfile G:\source\NFlash32.c
.dbsym s Flash_Read_addh _Flash_Read_addh c
.area text(rom, con, rel)
.dbfile G:\source\NFlash32.c
.dbfunc s flashErase _flashErase fI
; i -> R20
; addl -> R22
; addh -> R10
.even
_flashErase::
rcall push_gset3
mov R22,R18
mov R10,R16
sbiw R28,4
.dbline -1
.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)
; {
.dbline 62
; unsigned char i=0;
clr R20
.dbline 63
; fWPs;//打开写保护
SBI 0x12,5
.dbline 63
.dbline 64
; fCOMMAND = 0x60;//块擦除命令
ldi R24,96
sts 40960,R24
.dbline 65
; fADD = addl;//低地址
sts 36864,R22
.dbline 66
; fADD = addh;//高地址
sts 36864,R10
.dbline 67
; fCOMMAND = 0xd0;//处理命令
ldi R24,208
sts 40960,R24
.dbline 68
; asm("nop \n nop");
nop
nop
L5:
.dbline 69
L6:
.dbline 69
; while(!fRB);
sbis 0x10,4
rjmp L5
.dbline 70
; fCOMMAND = 0x70;//读状态命令
ldi R24,112
sts 40960,R24
.dbline 71
; i = fDATA;//读状态值
lds R20,32768
.dbline 72
; csram;
sts 0xfc01,R22
.dbline 72
.dbline 73
; fWPc;//写保护
CBI 0x12,5
.dbline 73
.dbline 74
; printf("%x,%x erase is %x",addh,addl,i);//串口打印
mov R2,R20
clr R3
std y+2,R2
std y+3,R3
mov R2,R22
clr R3
std y+0,R2
std y+1,R3
mov R18,R10
clr R19
ldi R16,L8
rcall _printf
.dbline -2
.dbline 75
; }
L4:
adiw R28,4
rcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym r addl 22 c
.dbsym r addh 10 c
.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
_flashWritecmd::
rcall push_gset5
sbiw R28,20
.dbline -1
.dbline 98
; /************************************************************
; **工程名称:U盘固件程序开发
; **编译器类型及版本:ICCAVR 6.26C
; **日期:2004.4.30
; **创建人:陈驰
; **所属单位:湖南大学计算机与通信学院
;
; **芯片类型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0
; **时钟频率:8MHZ
;
; **函数功能:写FLASH预处理函数
; **函数输入参数及说明:无
;
; **函数返回值:无
; **在本函数以外定义的变量:
; **调用的函数说明:无
;
; **修改人:陈驰
; **修改日期:2004.4.30
; **修改说明:创建
; *************************************************************/
; void flashWritecmd(void)
; {
.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;
clr R2
clr R3
std y+3,R2
std y+4,R3
.dbline 102
clr R6
clr R7
.dbline 103
; unsigned int CopyBack_Count = 0;
clr R0
clr R1
std y+14,R0
std y+15,R1
.dbline 104
; unsigned int CopyBack_two_count = 0;
std y+16,R0
std y+17,R1
.dbline 105
; unsigned int WritePageNum = 0;
clr R2
std y+5,R2
std y+6,R3
.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);
clr R18
ldi R16,250
push R6
push R7
rcall _flashErase
pop R7
pop R6
.dbline 125
; Sour_addh = XmtBuff.b[19];
lds R2,_XmtBuff+19
std y+18,R2
.dbline 126
; Sour_addl = (XmtBuff.b[20]/0x20) * 0x20;
ldi R17,32
lds R16,_XmtBuff+20
rcall div8u
mov R2,R16
lsl R2
lsl R2
lsl R2
lsl R2
lsl R2
std y+11,R2
.dbline 127
; Dest_addh = 0xfa;
ldi R24,250
std y+19,R24
.dbline 128
; Dest_addl = (XmtBuff.b[20]/0x20) * 0x20;
ldi R17,32
lds R16,_XmtBuff+20
rcall div8u
mov R2,R16
lsl R2
lsl R2
lsl R2
lsl R2
lsl R2
std y+12,R2
.dbline 129
; CopyBack_Count = XmtBuff.b[20]%0x20;
ldi R18,32
ldi R19,0
lds R16,_XmtBuff+20
clr R17
rcall mod16s
std y+14,R16
std y+15,R17
.dbline 130
clr R6
clr R7
rjmp L19
L16:
.dbline 130
.dbline 131
ldd R0,y+12
std y+2,R0
ldd R0,y+19
std y+0,R0
ldd R18,y+11
ldd R16,y+18
push R6
push R7
rcall _flashCopyBLack
pop R7
pop R6
.dbline 132
ldd R0,y+11
inc R0
std y+11,R0
.dbline 133
ldd R0,y+12
inc R0
std y+12,R0
.dbline 134
L17:
.dbline 130
mov R24,R6
mov R25,R7
adiw R24,1
mov R6,R24
mov R7,R25
L19:
.dbline 130
; for(i=0;i (0x20 - (XmtBuff.b[20] % 0x20)))
ldi R18,32
ldi R19,0
lds R16,_XmtBuff+20
clr R17
rcall mod16s
ldi R24,32
ldi R25,0
sub R24,R16
sbc R25,R17
ldd R30,y+5
ldd R31,y+6
andi R30,31
andi R31,0
cp R24,R30
cpc R25,R31
brsh L25
.dbline 142
; Erase_Count ++;
ldd R24,y+3
ldd R25,y+4
adiw R24,1
std y+3,R24
std y+4,R25
.dbline 143
rjmp L25
L24:
.dbline 143
; }else if(XmtBuff.b[20] % 0x20){
ldi R17,32
lds R16,_XmtBuff+20
rcall mod8u
tst R16
breq L29
.dbline 143
.dbline 144
; Erase_Count ++;
ldd R24,y+3
ldd R25,y+4
adiw R24,1
std y+3,R24
std y+4,R25
.dbline 145
; }
L29:
L25:
.dbline 146
; Start_add.add = (XmtBuff.b[19]<<8)+XmtBuff.b[20];
lds R2,_XmtBuff+20
clr R3
lds R4,_XmtBuff+19
clr R5
mov R5,R4
clr R4
add R4,R2
adc R5,R3
std y+9,R4
std y+10,R5
.dbline 147
; End_add.add = Start_add.add + WritePageNum;
ldd R2,y+5
ldd R3,y+6
add R4,R2
adc R5,R3
std y+7,R4
std y+8,R5
.dbline 148
; flashErase(0xfb, 0x00);
clr R18
ldi R16,251
push R6
push R7
rcall _flashErase
pop R7
pop R6
.dbline 149
; Sour_two_addh = End_add.c[1];
ldd R10,y+8
.dbline 150
; Sour_two_addl = End_add.c[0];
ldd R20,y+7
.dbline 151
; Dest_two_addh = 0xfb;
ldi R22,251
.dbline 152
; Dest_two_addl = End_add.c[0];
ldd R12,y+7
.dbline 153
; CopyBack_two_count = (Erase_Count * 0x20) - CopyBack_Count -WritePageNum;
ldi R18,5
ldi R19,0
ldd R16,y+3
ldd R17,y+4
rcall lsl16
mov R2,R16
mov R3,R17
ldd R0,y+14
ldd R1,y+15
sub R2,R0
sbc R3,R1
ldd R4,y+5
ldd R5,y+6
sub R2,R4
sbc R3,R5
std y+16,R2
std y+17,R3
.dbline 154
clr R6
clr R7
rjmp L38
L35:
.dbline 154
.dbline 155
std y+2,R12
std y+0,R22
mov R18,R20
mov R16,R10
push R6
push R7
rcall _flashCopyBLack
pop R7
pop R6
.dbline 156
inc R20
.dbline 157
inc R12
.dbline 158
L36:
.dbline 154
mov R24,R6
mov R25,R7
adiw R24,1
mov R6,R24
mov R7,R25
L38:
.dbline 154
; for(i=0;i R20,R21
; PageBuff -> R16,R17
.even
_flashWrite::
rcall push_gset1
.dbline -1
.dbline 205
; /************************************************************
; **工程名称:U盘固件程序开发
; **编译器类型及版本:ICCAVR 6.26C
; **日期:2004.4.30
; **创建人:陈驰
; **所属单位:湖南大学计算机与通信学院
;
; **芯片类型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0
; **时钟频率:8MHZ
;
; **函数功能:写FLASH函数
; **函数输入参数及说明:写入数据
;
; **函数返回值:无
; **在本函数以外定义的变量:
; **调用的函数说明:无
;
; **修改人:陈驰
; **修改日期:2004.4.30
; **修改说明:创建
; *************************************************************/
; void flashWrite(unsigned char * PageBuff)
; {
.dbline 207
; unsigned int i;
; if(WriteResidueVal > 0)
lds R3,_WriteResidueVal+1
lds R2,_WriteResidueVal
tst R2
brne X0
tst R3
brne X1
rjmp L58
X1:
X0:
.dbline 208
; {
.dbline 209
; fWPs;//打开写保护
SBI 0x12,5
.dbline 209
.dbline 210
; fCOMMAND = 0x00;//从FRIST部分开始
clr R2
sts 40960,R2
.dbline 211
; fCOMMAND = 0x80;//写FLASH命令
ldi R24,128
sts 40960,R24
.dbline 212
; fADD = 0x00;//从0列开始
clr R2
sts 36864,R2
.dbline 213
; fADD = Flash_Write_addl;//页地址低位
lds R2,_Flash_Write_addl
sts 36864,R2
.dbline 214
; fADD = Flash_Write_addh;//页地址高位
lds R2,_Flash_Write_addh
sts 36864,R2
.dbline 216
;
; for(i=0;i<512;i++)
clr R20
clr R21
rjmp L63
L60:
.dbline 217
.dbline 218
mov R30,R20
mov R31,R21
add R30,R16
adc R31,R17
ldd R2,z+0
sts 32768,R2
.dbline 219
L61:
.dbline 216
subi R20,255 ; offset = 1
sbci R21,255
L63:
.dbline 216
cpi R20,0
ldi R30,2
cpc R21,R30
brlo L60
.dbline 221
; {
; fDATA = PageBuff[i];//写数据到FLASH指定页里
; }
;
; fCOMMAND = 0x10;
ldi R24,16
sts 40960,R24
.dbline 222
; asm("nop \n nop");
nop
nop
L64:
.dbline 223
L65:
.dbline 223
; while(!fRB);
sbis 0x10,4
rjmp L64
.dbline 224
; fCOMMAND = 0x70;//读状态值命令
ldi R24,112
sts 40960,R24
.dbline 225
; i = fDATA;//读状态值
lds R20,32768
clr R21
.dbline 226
; D12_COMMAND = 0xf2;//清端点缓冲区
ldi R24,242
sts 31745,R24
.dbline 227
; csram;
sts 0xfc01,R22
.dbline 227
.dbline 228
; fWPc;//写保护
CBI 0x12,5
.dbline 228
.dbline 230
;
; WriteResidueVal = WriteResidueVal - 1;
lds R25,_WriteResidueVal+1
lds R24,_WriteResidueVal
sbiw R24,1
sts _WriteResidueVal+1,R25
sts _WriteResidueVal,R24
.dbline 231
; if(Flash_Write_addl== 255){
lds R24,_Flash_Write_addl
cpi R24,255
brne L67
.dbline 231
.dbline 232
; Flash_Write_addl= 0x00;
clr R2
sts _Flash_Write_addl,R2
.dbline 233
; Flash_Write_addh++;
lds R24,_Flash_Write_addh
subi R24,255 ; addi 1
sts _Flash_Write_addh,R24
.dbline 234
; }else
rjmp L68
L67:
.dbline 235
; Flash_Write_addl++;
lds R24,_Flash_Write_addl
subi R24,255 ; addi 1
sts _Flash_Write_addl,R24
L68:
.dbline 236
L58:
.dbline -2
.dbline 237
; }
; }
L57:
rcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r i 20 i
.dbsym r PageBuff 16 pc
.dbfunc s flashCopyBLack _flashCopyBLack fI
; i -> R20
; Destination_addl -> R22
; Destination_addh -> R10
; Source_addl -> R18
; Source_addh -> R16
.even
_flashCopyBLack::
rcall push_gset3
ldd R10,y+6
ldd R11,y+7
ldd R22,y+8
ldd R23,y+9
.dbline -1
.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)
; {
.dbline 266
; unsigned char i;
; fWPs;//打开写保护
SBI 0x12,5
.dbline 266
.dbline 267
; fCOMMAND = 0x00;//页拷贝命令
clr R2
sts 40960,R2
.dbline 269
; /*源地址*/
; fADD = 0x00;
sts 36864,R2
.dbline 270
; fADD = Source_addl;
sts 36864,R18
.dbline 271
; fADD = Source_addh;
sts 36864,R16
.dbline 272
; asm("nop \n nop");
nop
nop
L70:
.dbline 273
L71:
.dbline 273
; while(!fRB);
sbis 0x10,4
rjmp L70
.dbline 275
;
; fCOMMAND = 0x8a;//页拷贝命令
ldi R24,138
sts 40960,R24
.dbline 277
; /*目的地址*/
; fADD = 0x00;
clr R2
sts 36864,R2
.dbline 278
; fADD = Destination_addl;
sts 36864,R22
.dbline 279
; fADD = Destination_addh;
sts 36864,R10
.dbline 280
; asm("nop \n nop");
nop
nop
L73:
.dbline 281
L74:
.dbline 281
; while(!fRB);
sbis 0x10,4
rjmp L73
.dbline 283
;
; fCOMMAND = 0x70;//读状态命令
ldi R24,112
sts 40960,R24
.dbline 284
; i = fDATA;//读状态值
lds R20,32768
.dbline 285
; csram;
sts 0xfc01,R22
.dbline 285
.dbline 286
; fWPc;//写保护
CBI 0x12,5
.dbline 286
.dbline -2
.dbline 287
; }
L69:
rcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym r Destination_addl 22 c
.dbsym r Destination_addh 10 c
.dbsym r Source_addl 18 c
.dbsym r Source_addh 16 c
.dbfunc s flashReadcmd _flashReadcmd fI
.even
_flashReadcmd::
.dbline -1
.dbline 310
; /************************************************************
; **工程名称:U盘固件程序开发
; **编译器类型及版本:ICCAVR 6.26C
; **日期:2004.4.30
; **创建人:陈驰
; **所属单位:湖南大学计算机与通信学院
;
; **芯片类型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0
; **时钟频率:8MHZ
;
; **函数功能:读FLASH预处理函数
; **函数输入参数及说明:无
;
; **函数返回值:无
; **在本函数以外定义的变量:
; **调用的函数说明:无
;
; **修改人:陈驰
; **修改日期:2004.4.30
; **修改说明:创建
; *************************************************************/
; void flashReadcmd(void)
; {
.dbline 316
; /****************说明************
; 对于FLASH的读原理为:FLASH的读
; 可以是随机读取,所以这里只要给
; 定读数据的首地址和读写长度
; ********************************/
; Flash_Read_Sec = 0x00;
clr R2
sts _Flash_Read_Sec,R2
.dbline 317
; Flash_Read_Col = 0x00;
sts _Flash_Read_Col,R2
.dbline 318
; Flash_Read_addl = XmtBuff.b[20];
lds R2,_XmtBuff+20
sts _Flash_Read_addl,R2
.dbline 319
; Flash_Read_addh = XmtBuff.b[19];
lds R2,_XmtBuff+19
sts _Flash_Read_addh,R2
.dbline 320
; ReadResidueVal = (XmtBuff.b[22]<<8) + XmtBuff.b[23];
lds R2,_XmtBuff+23
clr R3
lds R4,_XmtBuff+22
clr R5
mov R5,R4
clr R4
add R4,R2
adc R5,R3
mov R2,R4
mov R3,R5
clr R4
sbrc R3,7
com R4
clr R5
sbrc R4,7
com R5
sts _ReadResidueVal+1,R3
sts _ReadResidueVal,R2
sts _ReadResidueVal+2+1,R5
sts _ReadResidueVal+2,R4
.dbline 321
; ReadResidueVal = 512 * ReadResidueVal;
ldi R24,9
ldi R25,0
st -y,R24
mov R16,R2
mov R17,R3
mov R18,R4
mov R19,R5
rcall lsl32
sts _ReadResidueVal+1,R17
sts _ReadResidueVal,R16
sts _ReadResidueVal+2+1,R19
sts _ReadResidueVal+2,R18
.dbline 322
; fCOMMAND = 0xff;
ldi R24,255
sts 40960,R24
.dbline 323
; asm("nop \n nop");
nop
nop
L81:
.dbline 324
L82:
.dbline 324
; while(!fRB);
sbis 0x10,4
rjmp L81
.dbline -2
.dbline 325
; }
L76:
.dbline 0 ; func end
ret
.dbfunc s flashRead _flashRead fI
; temp -> R10
; i -> R10
.even
_flashRead::
rcall push_gset4
.dbline -1
.dbline 348
; /************************************************************
; **工程名称:U盘固件程序开发
; **编译器类型及版本:ICCAVR 6.26C
; **日期:2004.4.30
; **创建人:陈驰
; **所属单位:湖南大学计算机与通信学院
;
; **芯片类型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0
; **时钟频率:8MHZ
;
; **函数功能:读FLASH函数
; **函数输入参数及说明:无
;
; **函数返回值:无
; **在本函数以外定义的变量:
; **调用的函数说明:无
;
; **修改人:陈驰
; **修改日期:2004.4.30
; **修改说明:创建
; *************************************************************/
; void flashRead(void)
; {
.dbline 351
; unsigned char i;
; unsigned char temp;
; if(ReadResidueVal > 0){
ldi R16,L87
rcall lpm32
lds R5,_ReadResidueVal+2+1
lds R4,_ReadResidueVal+2
lds R3,_ReadResidueVal+1
lds R2,_ReadResidueVal
cp R2,R16
cpc R3,R17
cpc R4,R18
cpc R5,R19
brne X3
rjmp L85
X3:
.dbline 351
.dbline 352
; ReadResidueVal -= 64;
ldi R16,L88
rcall lpm32
lds R5,_ReadResidueVal+2+1
lds R4,_ReadResidueVal+2
lds R3,_ReadResidueVal+1
lds R2,_ReadResidueVal
sub R2,R16
sbc R3,R17
sbc R4,R18
sbc R5,R19
sts _ReadResidueVal+1,R3
sts _ReadResidueVal,R2
sts _ReadResidueVal+2+1,R5
sts _ReadResidueVal+2,R4
.dbline 353
; temp = (unsigned char)(Flash_Read_Col + 64);
lds R24,_Flash_Read_Col
clr R25
subi R24,192 ; offset = 64
sbci R25,255
mov R10,R24
.dbline 354
; fCOMMAND = Flash_Read_Sec;
lds R2,_Flash_Read_Sec
sts 40960,R2
.dbline 355
; fADD = Flash_Read_Col;
lds R2,_Flash_Read_Col
sts 36864,R2
.dbline 356
; fADD = Flash_Read_addl;
lds R2,_Flash_Read_addl
sts 36864,R2
.dbline 357
; fADD = Flash_Read_addh;
lds R2,_Flash_Read_addh
sts 36864,R2
.dbline 358
; asm("nop \n nop");
nop
nop
L89:
.dbline 359
L90:
.dbline 359
; while(!fRB);
sbis 0x10,4
rjmp L89
.dbline 360
; switch (Flash_Read_Sec)
lds R12,_Flash_Read_Sec
clr R13
tst R12
brne X4
tst R13
breq L95
X4:
ldi R24,1
ldi R25,0
cp R12,R24
cpc R13,R25
breq L98
rjmp L92
X2:
.dbline 361
; {
L95:
.dbline 363
; case 0x00:
; if(temp == 0)
tst R10
brne L96
.dbline 364
; {
.dbline 365
; Flash_Read_Sec = 0x01;
ldi R24,1
sts _Flash_Read_Sec,R24
.dbline 366
; Flash_Read_Col = 0x00;
clr R2
sts _Flash_Read_Col,R2
.dbline 367
; }else
rjmp L93
L96:
.dbline 368
; {
.dbline 369
; Flash_Read_Col += 64;
lds R24,_Flash_Read_Col
subi R24,192 ; addi 64
sts _Flash_Read_Col,R24
.dbline 370
; }
.dbline 371
; break;
rjmp L93
L98:
.dbline 373
; case 0x01:
; if(temp == 0)
tst R10
brne L99
.dbline 374
; {
.dbline 375
; if(Flash_Read_addl == 255){
lds R24,_Flash_Read_addl
cpi R24,255
brne L101
.dbline 375
.dbline 376
; Flash_Read_addl = 0x00;
clr R2
sts _Flash_Read_addl,R2
.dbline 377
; Flash_Read_addh ++;
lds R24,_Flash_Read_addh
subi R24,255 ; addi 1
sts _Flash_Read_addh,R24
.dbline 378
; }else
rjmp L102
L101:
.dbline 379
; Flash_Read_addl ++;
lds R24,_Flash_Read_addl
subi R24,255 ; addi 1
sts _Flash_Read_addl,R24
L102:
.dbline 380
; Flash_Read_Sec = 0x00;
clr R2
sts _Flash_Read_Sec,R2
.dbline 381
; Flash_Read_Col = 0x00;
sts _Flash_Read_Col,R2
.dbline 382
; }else
rjmp L93
L99:
.dbline 383
; {
.dbline 384
; Flash_Read_Col += 64;
lds R24,_Flash_Read_Col
subi R24,192 ; addi 64
sts _Flash_Read_Col,R24
.dbline 385
; }
.dbline 386
; break;
L92:
L93:
.dbline 389
; }
;
; D12_COMMAND = 0x05;//选择端点(指针指向0位置)
ldi R24,5
sts 31745,R24
.dbline 390
; cwait;
nop
.dbline 391
; D12_COMMAND = 0xf0;//写缓冲区
ldi R24,240
sts 31745,R24
.dbline 392
; cwait;
nop
.dbline 400
; /****************************
; 缓冲区数据结构:
; 字节1:保留,可为任意值
; 字节2:数据字节的数目/长度
; 字节3:数据字节1
; 字节4:数据字节2
; *****************************/
; D12_DATA = 0x00;//字节1
clr R2
sts 31744,R2
.dbline 401
; cwait;
nop
.dbline 402
; D12_DATA = 64;//字节2
ldi R24,64
sts 31744,R24
.dbline 403
; csram;
sts 0xfc01,R22
.dbline 403
.dbline 404
; for(i=0;i<64;i++)
clr R10
rjmp L106
L103:
.dbline 405
.dbline 406
lds R2,32768
sts 31744,R2
.dbline 407
nop
.dbline 408
L104:
.dbline 404
inc R10
L106:
.dbline 404
mov R24,R10
cpi R24,64
brlo L103
.dbline 409
ldi R24,250
sts 31745,R24
.dbline 410
sts 0xfc01,R22
.dbline 410
.dbline 411
L85:
.dbline -2
.dbline 412
; {
; D12_DATA = fDATA;//写数据
; cwait;
; }
; D12_COMMAND = 0xfa;//设置缓冲区有效(满标志)
; csram;
; }
; }
L84:
rcall pop_gset4
.dbline 0 ; func end
ret
.dbsym r temp 10 c
.dbsym r i 10 c
.area lit(rom, con, rel)
L88:
.word 64,0
L87:
.word 0,0
.area data(ram, con, rel)
.dbfile G:\source\NFlash32.c
L8:
.blkb 18
.area idata
.byte 37,'x,44,37,'x,32,'e,'r,'a,'s,'e,32,'i,'s,32,37
.byte 'x,0
.area data(ram, con, rel)
.dbfile G:\source\NFlash32.c