📄 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
ldi R17,>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<CopyBack_Count;i++){
ldd R0,y+14
ldd R1,y+15
cp R6,R0
cpc R7,R1
brlo L16
.dbline 135
; flashCopyBLack(Sour_addh,Sour_addl,Dest_addh,Dest_addl);
; Sour_addl ++;
; Dest_addl ++;
; }
; Erase_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+13,R2
.dbline 136
; Erase_addh = XmtBuff.b[19];
lds R14,_XmtBuff+19
.dbline 137
; WritePageNum = (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
std y+5,R4
std y+6,R5
.dbline 138
; Erase_Count = WritePageNum / 0x20;
ldi R18,5
ldi R19,0
ldd R16,y+5
ldd R17,y+6
rcall lsr16
std y+3,R16
std y+4,R17
.dbline 139
; if(WritePageNum % 0x20){
ldd R24,y+5
ldd R25,y+6
andi R24,31
andi R25,0
cpi R24,0
cpc R24,R25
breq L24
.dbline 139
.dbline 140
; Erase_Count ++;
ldd R24,y+3
ldd R25,y+4
adiw R24,1
std y+3,R24
std y+4,R25
.dbline 141
; if((WritePageNum % 0x20) > (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<CopyBack_two_count;i++){
ldd R0,y+16
ldd R1,y+17
cp R6,R0
cpc R7,R1
brlo L35
.dbline 159
clr R6
clr R7
rjmp L42
L39:
.dbline 159
; flashCopyBLack(Sour_two_addh,Sour_two_addl,Dest_two_addh,Dest_two_addl);
; Sour_two_addl ++;
; Dest_two_addl ++;
; }
; for(i=0;i<Erase_Count;i++){
.dbline 160
; flashErase(Erase_addh, Erase_addl);
ldd R18,y+13
mov R16,R14
push R6
push R7
rcall _flashErase
pop R7
pop R6
.dbline 161
; if(Erase_addl == 224){
ldd R24,y+13
cpi R24,224
brne L43
.dbline 161
.dbline 162
; Erase_addl = 0x00;
clr R0
std y+13,R0
.dbline 163
; Erase_addh ++;
inc R14
.dbline 164
; }else
rjmp L44
L43:
.dbline 165
; Erase_addl += 0x20;
ldd R24,y+13
subi R24,224 ; addi 32
std y+13,R24
L44:
.dbline 166
L40:
.dbline 159
mov R24,R6
mov R25,R7
adiw R24,1
mov R6,R24
mov R7,R25
L42:
.dbline 159
ldd R2,y+3
ldd R3,y+4
cp R6,R2
cpc R7,R3
brlo L39
.dbline 167
clr R6
clr R7
rjmp L48
L45:
.dbline 167
.dbline 168
ldd R0,y+11
dec R0
std y+11,R0
.dbline 169
ldd R0,y+12
dec R0
std y+12,R0
.dbline 170
ldd R0,y+11
std y+2,R0
ldd R0,y+18
std y+0,R0
ldd R18,y+12
ldd R16,y+19
push R6
push R7
rcall _flashCopyBLack
pop R7
pop R6
.dbline 171
L46:
.dbline 167
mov R24,R6
mov R25,R7
adiw R24,1
mov R6,R24
mov R7,R25
L48:
.dbline 167
; }
; for(i=0;i<CopyBack_Count;i++){
ldd R0,y+14
ldd R1,y+15
cp R6,R0
cpc R7,R1
brlo L45
.dbline 172
clr R6
clr R7
rjmp L52
L49:
.dbline 172
.dbline 173
dec R20
.dbline 174
dec R12
.dbline 175
std y+2,R20
std y+0,R10
mov R18,R12
mov R16,R22
push R6
push R7
rcall _flashCopyBLack
pop R7
pop R6
.dbline 176
L50:
.dbline 172
mov R24,R6
mov R25,R7
adiw R24,1
mov R6,R24
mov R7,R25
L52:
.dbline 172
; Sour_addl --;
; Dest_addl --;
; flashCopyBLack(Dest_addh,Dest_addl,Sour_addh,Sour_addl);
; }
; for(i=0;i<CopyBack_two_count;i++){
ldd R0,y+16
ldd R1,y+17
cp R6,R0
cpc R7,R1
brlo L49
.dbline 177
; Sour_two_addl --;
; Dest_two_addl --;
; flashCopyBLack(Dest_two_addh,Dest_two_addl,Sour_two_addh,Sour_two_addl);
; }
; Flash_Write_Sec= 0x00;
clr R2
sts _Flash_Write_Sec,R2
.dbline 178
; Flash_Write_Col= 0x00;
sts _Flash_Write_Col,R2
.dbline 179
; Flash_Write_addl= XmtBuff.b[20];
lds R2,_XmtBuff+20
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -