📄 fat.s
字号:
adc R5,R19
std y+20,R2
std y+21,R3
std y+22,R4
std y+23,R5
.dbline 219
;
; //返回起始簇
; return(dir_cluster);
ldd R16,y+20
ldd R17,y+21
ldd R18,y+22
ldd R19,y+23
xjmp L34
L50:
.dbline 222
; }
; //搜索mp3文件:
; else if(dir->DIR_Name[8] == Search_FileExName1[0] && dir->DIR_Name[9] == Search_FileExName1[1] && dir->DIR_Name[10] == Search_FileExName1[2]) //找到要搜索的文件
ldi R30,<_Search_FileExName1
ldi R31,>_Search_FileExName1
lpm R2,Z
movw R30,R12
ldd R3,z+8
cp R3,R2
breq X53
xjmp L52
X53:
X36:
ldi R30,<_Search_FileExName1+1
ldi R31,>_Search_FileExName1+1
lpm R2,Z
movw R30,R12
ldd R3,z+9
cp R3,R2
breq X54
xjmp L52
X54:
X37:
ldi R30,<_Search_FileExName1+2
ldi R31,>_Search_FileExName1+2
lpm R2,Z
movw R30,R12
ldd R3,z+10
cp R3,R2
breq X55
xjmp L52
X55:
X38:
.dbline 223
; {
.dbline 224
; TMP_Entry_Count++;
movw R24,R10
adiw R24,1
movw R10,R24
.dbline 226
; //找寻第Entery_Count个指定文件
; if (TMP_Entry_Count == Entry_Count)
ldd R0,y+24
ldd R1,y+25
cp R24,R0
cpc R25,R1
breq X56
xjmp L56
X56:
X39:
.dbline 227
; {
.dbline 228
; 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 229
; *Dir_Attrib = dir->DIR_Attr;
ldd R2,z+11
ldd R30,y+28
ldd R31,y+29
std z+0,R2
.dbline 232
;
; //文件长度
; *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 235
;
; //文件起始簇的低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
adc R5,R19
std y+20,R2
std y+21,R3
std y+22,R4
std y+23,R5
.dbline 249
; /*
; if((a+32)<512) //判断是否该搜索下一个扇区的目录文件信息了
; {
; old_pos_a=a+32;
; old_pos_blk=blk;
; }
; else //到下一扇区寻找
; {
; old_pos_a=0;
; old_pos_blk=blk+1;
; }
; */
; //返回起始簇
; return(dir_cluster);
ldd R16,y+20
ldd R17,y+21
ldd R18,y+22
ldd R19,y+23
xjmp L34
L56:
.dbline 251
; }
; }
L52:
.dbline 252
; }
L48:
.dbline 253
; }
L43:
.dbline 196
movw R24,R14
adiw R24,32
movw R14,R24
L45:
.dbline 196
lds R2,_BlockSize
lds R3,_BlockSize+1
cp R14,R2
cpc R15,R3
brsh X57
xjmp L42
X57:
X40:
.dbline 254
; }
L38:
.dbline 191
ldi R20,1
ldi R21,0
ldi R22,0
ldi R23,0
ldd R2,y+2
ldd R3,y+3
ldd R4,y+4
ldd R5,y+5
add R2,R20
adc R3,R21
adc R4,R22
adc R5,R23
std y+2,R2
std y+3,R3
std y+4,R4
std y+5,R5
.dbline 191
xjmp L37
X41:
.dbline -2
L34:
.dbline 0 ; func end
adiw R28,10
xcall pop_xgsetF0FC
adiw R28,4
ret
.dbsym l Block 6 l
.dbsym l blk 2 l
.dbsym r TMP_Entry_Count 10 i
.dbsym r a 14 i
.dbsym r dir 12 pS[DirEntry]
.dbsym l buff 30 pc
.dbsym l Dir_Attrib 28 pc
.dbsym l Size 26 pl
.dbsym l Entry_Count 24 i
.dbsym l dir_cluster 20 l
.dbend
.area data(ram, con, rel)
.dbfile D:\学习\AVRpro\Mega16程序\TestLCD\fat.c
L59:
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.dbfile D:\学习\AVRpro\Mega16程序\TestLCD\fat.c
.area text(rom, con, rel)
.dbfile D:\学习\AVRpro\Mega16程序\TestLCD\fat.c
.dbfunc e fat_read_file _fat_read_file fc
.dbsym s serial L59 c
; Block -> y+4
; blockserial -> R10,R11
; BlockCount -> y+22
; buff -> R12,R13
; Cluster -> y+16
.even
_fat_read_file::
xcall push_arg4
xcall push_xgsetF03C
sbiw R28,8
ldd R12,y+20
ldd R13,y+21
ldd R10,y+26
ldd R11,y+27
.dbline -1
.dbline 266
; return (0xFFFFFFFF); //目录本身有错误,返回0xFFFF
; }
;
;
; //############################################################################
; //读取文件内容每次512bytes,文件没有读完,返回0;否则为1
; unsigned char fat_read_file(unsigned long Cluster, //文件起始簇号
; unsigned char *buff, //文件内容缓冲区
; unsigned long BlockCount, //扇区号
; unsigned char *blockserial)
; //############################################################################
; {
.dbline 270
; unsigned long Block;
; static unsigned char serial=0;
;
; if(BlockCount == 0)
ldd R2,y+22
ldd R3,y+23
ldd R4,y+24
ldd R5,y+25
ldi R16,0
cp R2,R16
cpc R3,R16
cpc R4,R16
cpc R5,R16
breq X63
xjmp L60
X63:
X58:
.dbline 271
; {
.dbline 272
; fat_load(Cluster,&Block,buff);
std y+3,R13
std y+2,R12
movw R24,R28
adiw R24,4
std y+1,R25
std y+0,R24
ldd R16,y+16
ldd R17,y+17
ldd R18,y+18
ldd R19,y+19
xcall _fat_load
.dbline 275
; //测试使用
; //DisplayLong(Block,1);
; MMC_SD_ReadSingleBlock((Cluster-2)*SecPerClus+data_offset+serial,buff);
std y+1,R13
std y+0,R12
ldi R20,2
ldi R21,0
ldi R22,0
ldi R23,0
ldd R16,y+16
ldd R17,y+17
ldd R18,y+18
ldd R19,y+19
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
lds R6,L59
clr R7
clr R8
clr R9
add R2,R6
adc R3,R7
adc R4,R8
adc R5,R9
movw R16,R2
movw R18,R4
xcall _MMC_SD_ReadSingleBlock
.dbline 276
; serial++;
lds R24,L59
subi R24,255 ; addi 1
sts L59,R24
.dbline 277
; blocknow = Cluster;
ldd R2,y+16
ldd R3,y+17
ldd R4,y+18
ldd R5,y+19
sts _blocknow+1,R3
sts _blocknow,R2
sts _blocknow+2+1,R5
sts _blocknow+2,R4
.dbline 278
; *blockserial = SecPerClus-serial;
lds R3,_SecPerClus
sub R3,R24
movw R30,R10
std z+0,R3
.dbline 279
; if(serial == SecPerClus)
lds R2,_SecPerClus
lds R3,L59
cp R3,R2
breq X64
xjmp L61
X64:
X59:
.dbline 280
; serial = 0;
clr R2
sts L59,R2
.dbline 281
; }
xjmp L61
L60:
.dbline 283
; else
; {
.dbline 284
; fat_load(blocknow,&Block,buff);
std y+3,R13
std y+2,R12
movw R24,R28
adiw R24,4
std y+1,R25
std y+0,R24
lds R18,_blocknow+2
lds R19,_blocknow+2+1
lds R16,_blocknow
lds R17,_blocknow+1
xcall _fat_load
.dbline 285
; MMC_SD_ReadSingleBlock((blocknow-2)*SecPerClus+data_offset+serial,buff);
std y+1,R13
std y+0,R12
ldi R20,2
ldi R21,0
ldi R22,0
ldi R23,0
lds R18,_blocknow+2
lds R19,_blocknow+2+1
lds R16,_blocknow
lds R17,_blocknow+1
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
lds R6,L59
clr R7
clr R8
clr R9
add R2,R6
adc R3,R7
adc R4,R8
adc R5,R9
movw R16,R2
movw R18,R4
xcall _MMC_SD_ReadSingleBlock
.dbline 286
; serial++;
lds R24,L59
subi R24,255 ; addi 1
sts L59,R24
.dbline 287
; *blockserial = SecPerClus-serial;
lds R3,_SecPerClus
sub R3,R24
movw R30,R10
std z+0,R3
.dbline 288
; if(serial == SecPerClus)
lds R2,_SecPerClus
lds R3,L59
cp R3,R2
brne L64
X60:
.dbline 289
; serial = 0;
clr R2
sts L59,R2
L64:
.dbline 290
; }
L61:
.dbline 291
; if(serial == 0)
lds R2,L59
tst R2
brne L66
X61:
.dbline 292
; blocknow = Block;
ldd R2,y+4
ldd R3,y+5
ldd R4,y+6
ldd R5,y+7
sts _blocknow+1,R3
sts _blocknow,R2
sts _blocknow+2+1,R5
sts _blocknow+2,R4
L66:
.dbline 293
; if(blocknow == 0xFFFFFFFF)
ldi R20,255
ldi R21,255
ldi R22,255
ldi R23,255
lds R4,_blocknow+2
lds R5,_blocknow+2+1
lds R2,_blocknow
lds R3,_blocknow+1
cp R2,R20
cpc R3,R21
cpc R4,R22
cpc R5,R23
brne L68
X62:
.dbline 294
; return 1;
ldi R16,1
xjmp L58
L68:
.dbline 296
; else
; return 0;
clr R16
.dbline -2
L58:
.dbline 0 ; func end
adiw R28,8
xcall pop_xgsetF03C
adiw R28,4
ret
.dbsym l Block 4 l
.dbsym r blockserial 10 pc
.dbsym l BlockCount 22 l
.dbsym r buff 12 pc
.dbsym l Cluster 16 l
.dbend
.dbfunc e strscmp _strscmp fc
; dist -> R18,R19
; src -> R16,R17
.even
_strscmp::
.dbline -1
.dbline 301
;
; }
;
; unsigned char strscmp(unsigned char *src,unsigned char *dist)
; {
xjmp L72
L71:
.dbline 303
; while(*src)
; {
.dbline 304
; if((*src) != (*dist))
movw R30,R18
ldd R2,z+0
movw R30,R16
ldd R3,z+0
cp R3,R2
breq L74
X65:
.dbline 305
; {
.dbline 306
; if((*src) > (*dist))
movw R30,R18
ldd R2,z+0
clr R3
movw R30,R16
ldd R4,z+0
clr R5
cp R2,R4
cpc R3,R5
brge L76
X66:
.dbline 307
; return 1;
ldi R16,1
xjmp L70
L76:
.dbline 309
; else
; return 2;
ldi R16,2
xjmp L70
L74:
.dbline 311
; }
; src++;
subi R16,255 ; offset = 1
sbci R17,255
.dbline 312
; dist++;
subi R18,255 ; offset = 1
sbci R19,255
.dbline 313
; }
L72:
.dbline 302
movw R30,R16
ldd R2,z+0
tst R2
brne L71
X67:
.dbline 314
; return 0;
clr R16
.dbline -2
L70:
.dbline 0 ; func end
ret
.dbsym r dist 18 pc
.dbsym r src 16 pc
.dbend
.dbfunc e fat_search_file _fat_search_file fc
; Dir_Cluster_Store -> R14,R15
; a -> R20
; buff -> R12,R13
; Dir_Attrib -> y+20
; Size -> y+18
; Cluster -> R10,R11
; File_Name -> R22,R23
.even
_fat_search_file::
xcall push_xgsetF0FC
movw R10,R18
movw R22,R16
sbiw R28,8
ldd R12,y+22
ldd R13,y+23
.dbline -1
.dbline 325
; }
;
; //####################################################################################
; //Sucht ein File im Directory
; unsigned char fat_search_file (unsigned char *File_Name, //要查找的文件名
; unsigned long *Cluster, //要查找的文件所在簇
; unsigned long *Size, //查到的文件大小
; unsigned char *Dir_Attrib,//查到的文件属性
; unsigned char *buff) //查到的文件名称
; //####################################################################################
; {
.dbline 326
; unsigned int Dir_Cluster_Store = *Cluster;
movw R30,R10
ldd R14,z+0
ldd R15,z+1
.dbline 328
; unsigned char a;
; for (a = 0;a < 100;a++)
clr R20
xjmp L82
L79:
.dbline 329
; {
.dbline 330
; *Cluster = fat_read_dir_ent(Dir_Cluster_Store,a,Size,Dir_Attrib,buff);
std y+7,R13
std y+6,R12
ldd R0,y+20
ldd R1,y+21
std y+5,R1
std y+4,R0
ldd R0,y+18
ldd R1,y+19
std y+3,R1
std y+2,R0
mov R2,R20
clr R3
std y+1,R3
std y+0,R2
movw R16,R14
movw R18,R16
clr R18
clr R19
xcall _fat_read_dir_ent
movw R30,R10
std z+0,R16
std z+1,R17
std z+2,R18
std z+3,R19
.dbline 331
; if (*Cluster == 0xffff)
ldi R24,255
ldi R25,255
ldi R26,0
ldi R27,0
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
cp R2,R24
cpc R3,R25
cpc R4,R26
cpc R5,R27
brne L83
X68:
.dbline 332
; {
.dbline 333
; return(0); //File not Found
clr R16
xjmp L78
L83:
.dbline 335
; }
; if(strscmp(File_Name,buff) == 0)
movw R18,R12
movw R16,R22
xcall _strscmp
tst R16
brne L85
X69:
.dbline 336
; {
.dbline 337
; return(1); //File Found
ldi R16,1
xjmp L78
L85:
.dbline 339
; }
; }
L80:
.dbline 328
inc R20
L82:
.dbline 328
cpi R20,100
brsh X71
xjmp L79
X71:
X70:
.dbline 340
; return(2); //Error
ldi R16,2
.dbline -2
L78:
.dbline 0 ; func end
adiw R28,8
xjmp pop_xgsetF0FC
.dbsym r Dir_Cluster_Store 14 i
.dbsym r a 20 c
.dbsym r buff 12 pc
.dbsym l Dir_Attrib 20 pc
.dbsym l Size 18 pl
.dbsym r Cluster 10 pl
.dbsym r File_Name 22 pc
.dbend
.area bss(ram, con, rel)
.dbfile D:\学习\AVRpro\Mega16程序\TestLCD\fat.c
_old_pos_blk::
.blkb 4
.dbsym e old_pos_blk _old_pos_blk l
_FirstRootDirSecNum::
.blkb 4
.dbsym e FirstRootDirSecNum _FirstRootDirSecNum l
_pointer_FDT::
.blkb 2
.dbsym e pointer_FDT _pointer_FDT pc
_SecPerClus::
.blkb 1
.dbsym e SecPerClus _SecPerClus c
_blocknow::
.blkb 4
.dbsym e blocknow _blocknow l
_FatFlags::
.blkb 1
.dbsym e FatFlags _FatFlags c
_data_offset::
.blkb 4
.dbsym e data_offset _data_offset l
_fat_offset::
.blkb 4
.dbsym e fat_offset _fat_offset l
_BlockSize::
.blkb 2
.dbsym e BlockSize _BlockSize i
; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -