📄 fat.s
字号:
X13:
.dbline 114
; {
.dbline 115
; *Block += ((TMP_Buffer[0] & 0x0F) << 8);
movw R30,R12
ldd R24,z+0
clr R25
andi R24,15
andi R25,0
mov R25,R24
clr R24
movw R2,R24
clr R4
sbrc R3,7
com R4
clr R5
sbrc R4,7
com R5
movw R30,R10
ldd R6,z+0
ldd R7,z+1
ldd R8,z+2
ldd R9,z+3
add R6,R2
adc R7,R3
adc R8,R4
adc R9,R5
std z+0,R6
std z+1,R7
std z+2,R8
std z+3,R9
.dbline 116
; }
xjmp L21
L24:
.dbline 118
; else
; {
.dbline 119
; *Block += (TMP_Buffer[0] << 4);
movw R30,R12
ldd R2,z+0
clr R3
lsl R2
rol R3
lsl R2
rol R3
lsl R2
rol R3
lsl R2
rol R3
clr R4
sbrc R3,7
com R4
clr R5
sbrc R4,7
com R5
movw R30,R10
ldd R6,z+0
ldd R7,z+1
ldd R8,z+2
ldd R9,z+3
add R6,R2
adc R7,R3
adc R8,R4
adc R9,R5
std z+0,R6
std z+1,R7
std z+2,R8
std z+3,R9
.dbline 120
; }
.dbline 121
; }
xjmp L21
L20:
.dbline 123
; else
; {
.dbline 124
; MMC_SD_ReadSingleBlock(FAT_Block_Addresse,TMP_Buffer);
std y+1,R13
std y+0,R12
ldd R16,y+2
ldd R17,y+3
ldd R18,y+4
ldd R19,y+5
xcall _MMC_SD_ReadSingleBlock
.dbline 125
; if((Cluster % 2) == 0)
ldd R2,y+20
ldd R3,y+21
ldd R4,y+22
ldd R5,y+23
mov R16,R2
andi R16,1
brne L26
X14:
.dbline 126
; {
.dbline 127
; *Block = ((TMP_Buffer[FAT_Byte_Addresse + 1] & 0x0F) << 8) + TMP_Buffer[FAT_Byte_Addresse];
movw R30,R14
add R30,R12
adc R31,R13
ldd R2,z+0
movw R30,R14
adiw R30,1
add R30,R12
adc R31,R13
ldd R24,z+0
andi R24,15
mov R3,R24
clr R4
sbrc R3,7
com R4
clr R5
sbrc R4,7
com R5
movw R30,R10
std z+0,R2
std z+1,R3
std z+2,R4
std z+3,R5
.dbline 128
; }
xjmp L27
L26:
.dbline 130
; else
; {
.dbline 131
; *Block = (TMP_Buffer[FAT_Byte_Addresse + 1] << 4) + (TMP_Buffer[FAT_Byte_Addresse] >> 4);
movw R30,R14
add R30,R12
adc R31,R13
ldd R2,z+0
clr R3
asr R3
ror R2
asr R3
ror R2
asr R3
ror R2
asr R3
ror R2
movw R30,R14
adiw R30,1
add R30,R12
adc R31,R13
ldd R4,z+0
clr R5
lsl R4
rol R5
lsl R4
rol R5
lsl R4
rol R5
lsl R4
rol R5
add R4,R2
adc R5,R3
movw R2,R4
clr R4
sbrc R3,7
com R4
clr R5
sbrc R4,7
com R5
movw R30,R10
std z+0,R2
std z+1,R3
std z+2,R4
std z+3,R5
.dbline 132
; }
L27:
.dbline 133
; }
L21:
.dbline 134
; if(*Block == 0xFFF)
ldi R20,255
ldi R21,15
ldi R22,0
ldi R23,0
movw R30,R10
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
cp R2,R20
cpc R3,R21
cpc R4,R22
cpc R5,R23
breq X22
xjmp L9
X22:
X15:
.dbline 135
; *Block = 0xFFFFFFFF;
ldi R20,255
ldi R21,255
ldi R22,255
ldi R23,255
std z+0,R20
std z+1,R21
std z+2,R22
std z+3,R23
.dbline 136
; }
xjmp L9
L16:
.dbline 137
; else if(FatFlags == FAT_Flg_32)
lds R24,_FatFlags
cpi R24,2
breq X23
xjmp L9
X23:
X16:
.dbline 138
; {
.dbline 140
; unsigned long Tmp;
; Tmp=Cluster/128;
ldi R24,7
ldi R25,0
ldd R16,y+20
ldd R17,y+21
ldd R18,y+22
ldd R19,y+23
st -y,R24
xcall lsr32
std y+6,R16
std y+7,R17
std y+8,R18
std y+9,R19
.dbline 141
; if(Cluster == 0xFFFFFFFF)
ldi R20,255
ldi R21,255
ldi R22,255
ldi R23,255
ldd R2,y+20
ldd R3,y+21
ldd R4,y+22
ldd R5,y+23
cp R2,R20
cpc R3,R21
cpc R4,R22
cpc R5,R23
brne L32
X17:
.dbline 142
; {
.dbline 143
; *Block = 0xFFFFFFFF;
ldi R20,255
ldi R21,255
ldi R22,255
ldi R23,255
movw R30,R10
std z+0,R20
std z+1,R21
std z+2,R22
std z+3,R23
.dbline 144
; return; //文件已经到达末尾
xjmp L9
L32:
.dbline 147
; }
;
; FAT_Byte_Addresse = (Cluster*4)%512;
ldi R24,2
ldi R25,0
ldd R16,y+20
ldd R17,y+21
ldd R18,y+22
ldd R19,y+23
st -y,R24
xcall lsl32
movw R2,R16
movw R4,R18
ldi R20,255
ldi R21,1
ldi R22,0
ldi R23,0
and R2,R20
and R3,R21
and R4,R22
and R5,R23
movw R14,R2
.dbline 148
; FAT_Block_Addresse = Tmp + fat_offset ;
lds R4,_fat_offset+2
lds R5,_fat_offset+2+1
lds R2,_fat_offset
lds R3,_fat_offset+1
ldd R6,y+6
ldd R7,y+7
ldd R8,y+8
ldd R9,y+9
add R6,R2
adc R7,R3
adc R8,R4
adc R9,R5
std y+2,R6
std y+3,R7
std y+4,R8
std y+5,R9
.dbline 150
;
; MMC_SD_ReadSingleBlock (FAT_Block_Addresse,TMP_Buffer);
std y+1,R13
std y+0,R12
ldd R16,y+2
ldd R17,y+3
ldd R18,y+4
ldd R19,y+5
xcall _MMC_SD_ReadSingleBlock
.dbline 158
; //测试使用:
; //DisplayHexNum(1,1,TMP_Buffer[FAT_Byte_Addresse+3]);
; //DisplayHexNum(2,1,TMP_Buffer[FAT_Byte_Addresse+2]);
; //DisplayHexNum(3,1,TMP_Buffer[FAT_Byte_Addresse+1]);
; //DisplayHexNum(4,1,TMP_Buffer[FAT_Byte_Addresse]);
; //Delay(1000);
; //
; *Block = (TMP_Buffer[FAT_Byte_Addresse+3]*(unsigned long)16777216) +
movw R30,R14
adiw R30,2
add R30,R12
adc R31,R13
ldd R2,z+0
clr R3
clr R4
clr R5
ldi R20,0
ldi R21,0
ldi R22,1
ldi R23,0
st -y,R5
st -y,R4
st -y,R3
st -y,R2
movw R16,R20
movw R18,R22
xcall empy32u
movw R2,R16
movw R4,R18
movw R30,R14
adiw R30,3
add R30,R12
adc R31,R13
ldd R6,z+0
clr R7
clr R8
clr R9
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,1
st -y,R9
st -y,R8
st -y,R7
st -y,R6
movw R16,R20
movw R18,R22
xcall empy32u
movw R6,R16
movw R8,R18
add R6,R2
adc R7,R3
adc R8,R4
adc R9,R5
movw R30,R14
adiw R30,1
add R30,R12
adc R31,R13
ldd R2,z+0
clr R3
clr R4
clr R5
ldi R20,0
ldi R21,1
ldi R22,0
ldi R23,0
st -y,R5
st -y,R4
st -y,R3
st -y,R2
movw R16,R20
movw R18,R22
xcall empy32u
add R6,R16
adc R7,R17
adc R8,R18
adc R9,R19
movw R30,R14
add R30,R12
adc R31,R13
ldd R2,z+0
clr R3
clr R4
clr R5
add R6,R2
adc R7,R3
adc R8,R4
adc R9,R5
movw R30,R10
std z+0,R6
std z+1,R7
std z+2,R8
std z+3,R9
.dbline 162
; (TMP_Buffer[FAT_Byte_Addresse+2]*(unsigned long)65536) +
; (TMP_Buffer[FAT_Byte_Addresse+1]*(unsigned long)256) +
; TMP_Buffer[FAT_Byte_Addresse];
; }
.dbline 163
; return;
.dbline -2
L9:
.dbline 0 ; func end
adiw R28,10
xcall pop_xgsetF0FC
adiw R28,4
ret
.dbsym l Tmp 6 l
.dbsym l FAT_Block_Addresse 2 l
.dbsym r FAT_Byte_Addresse 14 i
.dbsym r TMP_Buffer 12 pc
.dbsym r Block 10 pl
.dbsym l Cluster 20 l
.dbend
.dbfunc e fat_read_dir_ent _fat_read_dir_ent fl
.dbstruct 0 32 DirEntry
.dbfield 0 DIR_Name A[11:11]c
.dbfield 11 DIR_Attr c
.dbfield 12 DIR_NTRes c
.dbfield 13 DIR_CrtTimeTenth c
.dbfield 14 DIR_CrtTime i
.dbfield 16 DIR_CrtDate i
.dbfield 18 DIR_LastAccDate i
.dbfield 20 DIR_FstClusHI i
.dbfield 22 DIR_WrtTime i
.dbfield 24 DIR_WrtDate i
.dbfield 26 DIR_FstClusLO i
.dbfield 28 DIR_FileSize l
.dbend
; Block -> y+6
; blk -> y+2
; TMP_Entry_Count -> R10,R11
; a -> R14,R15
; dir -> R12,R13
; buff -> y+30
; Dir_Attrib -> y+28
; Size -> y+26
; Entry_Count -> y+24
; dir_cluster -> y+20
.even
_fat_read_dir_ent::
xcall push_arg4
xcall push_xgsetF0FC
sbiw R28,10
.dbline -1
.dbline 174
; }
;
; //############################################################################
; //读取文件目录区FDT相关信息,错误的时候返回0xffffffff,目录搜索完毕,返回0xFFFFFFFE
; unsigned long fat_read_dir_ent(unsigned long dir_cluster,//目录所在簇
; unsigned int Entry_Count, //目录中文件序号
; unsigned long *Size, //文件长度
; unsigned char *Dir_Attrib, //文件属性
; unsigned char *buff) //函数所需buffer
; //############################################################################
; {
.dbline 175
; unsigned int TMP_Entry_Count = 0;
clr R10
clr R11
.dbline 176
; unsigned long Block=0; //目录所在扇区地址
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
std y+6,R20
std y+7,R21
std y+8,R22
std y+9,R23
.dbline 181
; unsigned long blk;
; unsigned int a;
; struct DirEntry *dir; //文件目录指针
;
; if (dir_cluster == 0) //读取根目录,得到FDT起始扇区号
ldd R2,y+20
ldd R3,y+21
ldd R4,y+22
ldd R5,y+23
ldi R16,0
cp R2,R16
cpc R3,R16
cpc R4,R16
cpc R5,R16
brne L35
X24:
.dbline 182
; {
.dbline 183
; Block = FirstRootDirSecNum;
lds R4,_FirstRootDirSecNum+2
lds R5,_FirstRootDirSecNum+2+1
lds R2,_FirstRootDirSecNum
lds R3,_FirstRootDirSecNum+1
std y+6,R2
std y+7,R3
std y+8,R4
std y+9,R5
.dbline 184
; }
xjmp L36
L35:
.dbline 186
; else //读取子目录,本程序中用不到
; {
.dbline 187
; Block = (dir_cluster-2)*SecPerClus+data_offset;
ldi R20,2
ldi R21,0
ldi R22,0
ldi R23,0
ldd R16,y+20
ldd R17,y+21
ldd R18,y+22
ldd R19,y+23
sub R16,R20
sbc R17,R21
sbc R18,R22
sbc R19,R23
lds R2,_SecPerClus
clr R3
clr R4
clr R5
st -y,R5
st -y,R4
st -y,R3
st -y,R2
xcall empy32u
movw R2,R16
movw R4,R18
lds R8,_data_offset+2
lds R9,_data_offset+2+1
lds R6,_data_offset
lds R7,_data_offset+1
add R2,R6
adc R3,R7
adc R4,R8
adc R5,R9
std y+6,R2
std y+7,R3
std y+8,R4
std y+9,R5
.dbline 188
; }
L36:
.dbline 191
; //下面的算法效率有问题。注意它每次都是从根目录下面依次去找第Entry_Count个文件
; //for (blk = old_pos_blk;;blk++)
; for (blk = Block;;blk++) //从该目录下面,依次读取一个扇区
ldd R2,y+6
ldd R3,y+7
ldd R4,y+8
ldd R5,y+9
std y+2,R2
std y+3,R3
std y+4,R4
std y+5,R5
L37:
.dbline 192
; {
.dbline 193
; MMC_SD_ReadSingleBlock(blk,buff);
ldd R0,y+30
ldd R1,y+31
std y+1,R1
std y+0,R0
ldd R16,y+2
ldd R17,y+3
ldd R18,y+4
ldd R19,y+5
xcall _MMC_SD_ReadSingleBlock
L41:
.dbline 196
; Next_a:
; //for (a=old_pos_a;a<BlockSize; a = a + 32)
; for (a=0;a<BlockSize; a = a + 32) //依次分析每一个32字节的目录/文件结构
clr R14
clr R15
xjmp L45
L42:
.dbline 197
; { //依次分析每一个文件或目录,可能会出现空的、已删除、正常的目录/文件
.dbline 198
; dir=(struct DirEntry *)(buff + a); //装载目录内容
movw R12,R14
ldd R0,y+30
ldd R1,y+31
add R12,R0
adc R13,R1
.dbline 199
; if (dir->DIR_Name[0] == 0) //目录已经搜索完毕,返回.
movw R30,R12
ldd R2,z+0
tst R2
brne L46
X25:
.dbline 200
; {
.dbline 201
; return (0xFFFFFFFE);
ldi R16,254
ldi R17,255
ldi R18,255
ldi R19,255
xjmp L34
L46:
.dbline 204
; }
; //非卷标,非长文件名,并且文件没有删除
; if ((dir->DIR_Attr != ATTR_LONG_NAME) && (dir->DIR_Attr != DIR_ATTRIB_VOL_ID) && (dir->DIR_Name[0] != DIR_ENTRY_IS_FREE))
movw R30,R12
ldd R2,z+11
clr R3
mov R24,R2
cpi R24,15
brne X42
xjmp L48
X42:
X26:
cpi R24,8
brne X43
xjmp L48
X43:
X27:
ldd R24,z+0
cpi R24,229
brne X44
xjmp L48
X44:
X28:
.dbline 205
; {
.dbline 207
; //搜索字库文件:
; if(Entry_Count==0 && dir->DIR_Name[2] == 'F' && dir->DIR_Name[3] == 'O' && dir->DIR_Name[4] == 'N' && dir->DIR_Name[5] == 'T' && dir->DIR_Name[6] == '1' && dir->DIR_Name[7] == '6')
ldd R0,y+24
ldd R1,y+25
tst R0
breq X45
xjmp L50
X45:
tst R1
breq X46
xjmp L50
X46:
X29:
ldd R24,z+2
cpi R24,70
breq X47
xjmp L50
X47:
X30:
ldd R24,z+3
cpi R24,79
breq X48
xjmp L50
X48:
X31:
ldd R24,z+4
cpi R24,78
breq X49
xjmp L50
X49:
X32:
ldd R24,z+5
cpi R24,84
breq X50
xjmp L50
X50:
X33:
ldd R24,z+6
cpi R24,49
breq X51
xjmp L50
X51:
X34:
ldd R24,z+7
cpi R24,54
breq X52
xjmp L50
X52:
X35:
.dbline 208
; {
.dbline 209
; pointer_FDT=buff + a;
movw R2,R14
ldd R0,y+30
ldd R1,y+31
add R2,R0
adc R3,R1
sts _pointer_FDT+1,R3
sts _pointer_FDT,R2
.dbline 210
; *Dir_Attrib = dir->DIR_Attr;
ldd R2,z+11
ldd R30,y+28
ldd R31,y+29
std z+0,R2
.dbline 213
;
; //文件长度
; *Size=dir->DIR_FileSize;
movw R30,R12
ldd R2,z+28
ldd R3,z+29
ldd R4,z+30
ldd R5,z+31
ldd R30,y+26
ldd R31,y+27
std z+0,R2
std z+1,R3
std z+2,R4
std z+3,R5
.dbline 216
;
; //文件起始簇的低16位
; dir_cluster = dir->DIR_FstClusLO + (dir->DIR_FstClusHI)*65536;
movw R30,R12
ldd R2,z+20
ldd R3,z+21
clr R4
clr R5
ldi R20,0
ldi R21,0
ldi R22,1
ldi R23,0
st -y,R5
st -y,R4
st -y,R3
st -y,R2
movw R16,R20
movw R18,R22
xcall empy32s
movw R30,R12
adiw R30,26
ldd R2,z+0
ldd R3,z+1
clr R4
clr R5
add R2,R16
adc R3,R17
adc R4,R18
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -