📄 nflash32.s
字号:
sts _Flash_Write_addl,R2
.dbline 180
; Flash_Write_addh= XmtBuff.b[19];
lds R2,_XmtBuff+19
sts _Flash_Write_addh,R2
.dbline 181
; WriteResidueVal=(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
sts _WriteResidueVal+1,R5
sts _WriteResidueVal,R4
.dbline -2
.dbline 182
; }
L9:
adiw R28,20
rcall pop_gset5
.dbline 0 ; func end
ret
.dbsym l Start_add 9 X
.dbsym l End_add 7 X
.dbsym l WritePageNum 5 i
.dbsym l Erase_Count 3 i
.dbsym r Erase_addh 14 c
.dbsym r Dest_two_addh 22 c
.dbsym r Sour_two_addh 10 c
.dbsym l Dest_addh 19 c
.dbsym l Sour_addh 18 c
.dbsym l CopyBack_two_count 16 i
.dbsym l CopyBack_Count 14 i
.dbsym l Erase_addl 13 c
.dbsym r Dest_two_addl 12 c
.dbsym r Sour_two_addl 20 c
.dbsym l Dest_addl 12 c
.dbsym l Sour_addl 11 c
.dbsym r i 6 i
.dbfunc s flashWrite _flashWrite fI
; 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
ldi R17,>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
ldi R17,>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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -