📄 fat.s
字号:
.module fat.c
.area text(rom, con, rel)
.dbfile C:\AVR\M\1\fat.c
.dbfunc e Fat_Init _Fat_Init fc
.even
_Fat_Init::
xcall push_gset3
sbiw R28,2
.dbline -1
.dbline 18
;
; #include"fat.h"
; #include "Usart.h"
; uint32 FAT_MASK;
; uint8 Fat_Buffer[512];
; uint32 NumOfFile; //文件的数量
;
;
; //DISK_FAT_INFO结构,用来存储SD卡的信息
; struct DISK_FAT_INFO DiskFATInfo;
;
; //MUSIC_INFO结构,用来存储音乐的信息,MusicInfoList用来存放音乐列表,这里限制100首
; struct MUSIC_INFO MusicInfoList[3];
;
; //******************************************************************************
; //初始化FAT,将SD卡信息,存到DiskFATInfo结构
; uint8 Fat_Init(void)
; {
.dbline 19
; SD_ReadBlock(0,Fat_Buffer);
ldi R24,<_Fat_Buffer
ldi R25,>_Fat_Buffer
std y+1,R25
std y+0,R24
ldi R16,0
ldi R17,0
ldi R18,0
ldi R19,0
xcall _SD_ReadBlock
.dbline 20
; if(Fat_Buffer[0] != 0xEB)
lds R24,_Fat_Buffer
cpi R24,235
brne X2
xjmp L2
X2:
.dbline 21
; {
.dbline 22
; DiskFATInfo.DBR_LBA = (Fat_Buffer[454]|(Fat_Buffer[455]<<8)|((uint32)Fat_Buffer[456]<<16)|((uint32)Fat_Buffer[457]<<24));
lds R2,_Fat_Buffer+455
clr R3
mov R3,R2
clr R2
lds R4,_Fat_Buffer+454
clr R5
or R4,R2
or R5,R3
movw R2,R4
clr R4
sbrc R3,7
com R4
clr R5
sbrc R4,7
com R5
lds R6,_Fat_Buffer+456
clr R7
clr R8
clr R9
movw R8,R6
clr R6
clr R7
or R2,R6
or R3,R7
or R4,R8
or R5,R9
ldi R24,24
ldi R25,0
lds R6,_Fat_Buffer+457
clr R7
clr R8
clr R9
st -y,R24
movw R16,R6
movw R18,R8
xcall lsl32
or R2,R16
or R3,R17
or R4,R18
or R5,R19
sts _DiskFATInfo+1,R3
sts _DiskFATInfo,R2
sts _DiskFATInfo+2+1,R5
sts _DiskFATInfo+2,R4
.dbline 23
; switch(Fat_Buffer[0x1C2])
lds R10,_Fat_Buffer+450
clr R11
movw R24,R10
cpi R24,4
ldi R30,0
cpc R25,R30
breq L14
cpi R24,4
ldi R30,0
cpc R25,R30
brge X3
xjmp L3
X3:
L16:
movw R24,R10
cpi R24,11
ldi R30,0
cpc R25,R30
breq L12
xjmp L3
X0:
.dbline 24
; {
L12:
.dbline 26
; case 0x0B:
; DiskFATInfo.FAT_Style = 32;
ldi R24,32
sts _DiskFATInfo+14,R24
.dbline 27
; FAT_MASK = FAT32_MASK;
ldi R20,255
ldi R21,255
ldi R22,255
ldi R23,15
sts _FAT_MASK+1,R21
sts _FAT_MASK,R20
sts _FAT_MASK+2+1,R23
sts _FAT_MASK+2,R22
.dbline 28
; break;
xjmp L3
L14:
.dbline 30
; case 0x04:
; DiskFATInfo.FAT_Style = 16;
ldi R24,16
sts _DiskFATInfo+14,R24
.dbline 31
; FAT_MASK = FAT16_MASK;
ldi R20,255
ldi R21,255
ldi R22,0
ldi R23,0
sts _FAT_MASK+1,R21
sts _FAT_MASK,R20
sts _FAT_MASK+2+1,R23
sts _FAT_MASK+2,R22
.dbline 32
; break;
.dbline 34
; }
; }
xjmp L3
L2:
.dbline 36
; else
; {
.dbline 37
; DiskFATInfo.DBR_LBA = 0;
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
sts _DiskFATInfo+1,R21
sts _DiskFATInfo,R20
sts _DiskFATInfo+2+1,R23
sts _DiskFATInfo+2,R22
.dbline 38
; switch(Fat_Buffer[0x55])
lds R10,_Fat_Buffer+85
clr R11
movw R24,R10
cpi R24,49
ldi R30,0
cpc R25,R30
breq L23
cpi R24,51
ldi R30,0
cpc R25,R30
breq L21
xjmp L17
X1:
.dbline 39
; {
L21:
.dbline 41
; case 0x33:
; DiskFATInfo.FAT_Style = 32;
ldi R24,32
sts _DiskFATInfo+14,R24
.dbline 42
; FAT_MASK = FAT32_MASK;
ldi R20,255
ldi R21,255
ldi R22,255
ldi R23,15
sts _FAT_MASK+1,R21
sts _FAT_MASK,R20
sts _FAT_MASK+2+1,R23
sts _FAT_MASK+2,R22
.dbline 43
; break;
xjmp L18
L23:
.dbline 45
; case 0x31:
; DiskFATInfo.FAT_Style = 16;
ldi R24,16
sts _DiskFATInfo+14,R24
.dbline 46
; FAT_MASK = FAT16_MASK;
ldi R20,255
ldi R21,255
ldi R22,0
ldi R23,0
sts _FAT_MASK+1,R21
sts _FAT_MASK,R20
sts _FAT_MASK+2+1,R23
sts _FAT_MASK+2,R22
.dbline 47
; break;
L17:
L18:
.dbline 50
;
; }
; }
L3:
.dbline 51
; SD_ReadBlock(DiskFATInfo.DBR_LBA,Fat_Buffer);
ldi R24,<_Fat_Buffer
ldi R25,>_Fat_Buffer
std y+1,R25
std y+0,R24
lds R18,_DiskFATInfo+2
lds R19,_DiskFATInfo+2+1
lds R16,_DiskFATInfo
lds R17,_DiskFATInfo+1
xcall _SD_ReadBlock
.dbline 52
; DiskFATInfo.BytesPerSector = Fat_Buffer[0x0B] |(Fat_Buffer[0x0C] << 8);
lds R2,_Fat_Buffer+12
clr R3
mov R3,R2
clr R2
lds R4,_Fat_Buffer+11
clr R5
or R4,R2
or R5,R3
sts _DiskFATInfo+15+1,R5
sts _DiskFATInfo+15,R4
.dbline 53
; DiskFATInfo.SectorsPerClustor = Fat_Buffer[0x0D];
lds R2,_Fat_Buffer+13
sts _DiskFATInfo+17,R2
.dbline 56
;
;
; DiskFATInfo.NumOfFATs = Fat_Buffer[0x10] |(Fat_Buffer[0x11] << 8);
lds R2,_Fat_Buffer+17
clr R3
mov R3,R2
clr R2
lds R4,_Fat_Buffer+16
clr R5
or R4,R2
or R5,R3
sts _DiskFATInfo+18,R4
.dbline 59
;
;
; DiskFATInfo.SectorsPerFAT = Fat_Buffer[0x24] |Fat_Buffer[0x25] << 8|(uint32)Fat_Buffer[0x26]<<16|(uint32)Fat_Buffer[0x27]<<24;
lds R2,_Fat_Buffer+37
clr R3
mov R3,R2
clr R2
lds R4,_Fat_Buffer+36
clr R5
or R4,R2
or R5,R3
movw R2,R4
clr R4
sbrc R3,7
com R4
clr R5
sbrc R4,7
com R5
lds R6,_Fat_Buffer+38
clr R7
clr R8
clr R9
movw R8,R6
clr R6
clr R7
or R2,R6
or R3,R7
or R4,R8
or R5,R9
ldi R24,24
ldi R25,0
lds R6,_Fat_Buffer+39
clr R7
clr R8
clr R9
st -y,R24
movw R16,R6
movw R18,R8
xcall lsl32
or R2,R16
or R3,R17
or R4,R18
or R5,R19
sts _DiskFATInfo+19+1,R3
sts _DiskFATInfo+19,R2
sts _DiskFATInfo+19+2+1,R5
sts _DiskFATInfo+19+2,R4
.dbline 62
;
;
; DiskFATInfo.FAT_LBA = DiskFATInfo.DBR_LBA + (Fat_Buffer[0x0E]|Fat_Buffer[0x0F]<<8);
lds R2,_Fat_Buffer+15
clr R3
mov R3,R2
clr R2
lds R4,_Fat_Buffer+14
clr R5
or R4,R2
or R5,R3
movw R2,R4
clr R4
sbrc R3,7
com R4
clr R5
sbrc R4,7
com R5
lds R8,_DiskFATInfo+2
lds R9,_DiskFATInfo+2+1
lds R6,_DiskFATInfo
lds R7,_DiskFATInfo+1
add R6,R2
adc R7,R3
adc R8,R4
adc R9,R5
sts _DiskFATInfo+8+1,R7
sts _DiskFATInfo+8,R6
sts _DiskFATInfo+8+2+1,R9
sts _DiskFATInfo+8+2,R8
.dbline 64
;
; DiskFATInfo.FDT_LBA = DiskFATInfo.FAT_LBA + DiskFATInfo.SectorsPerFAT*DiskFATInfo.NumOfFATs;
lds R2,_DiskFATInfo+18
clr R3
clr R4
clr R5
lds R8,_DiskFATInfo+19+2
lds R9,_DiskFATInfo+19+2+1
lds R6,_DiskFATInfo+19
lds R7,_DiskFATInfo+19+1
st -y,R5
st -y,R4
st -y,R3
st -y,R2
movw R16,R6
movw R18,R8
xcall empy32u
lds R4,_DiskFATInfo+8+2
lds R5,_DiskFATInfo+8+2+1
lds R2,_DiskFATInfo+8
lds R3,_DiskFATInfo+8+1
add R2,R16
adc R3,R17
adc R4,R18
adc R5,R19
sts _DiskFATInfo+4+1,R3
sts _DiskFATInfo+4,R2
sts _DiskFATInfo+4+2+1,R5
sts _DiskFATInfo+4+2,R4
.dbline 68
;
;
;
; DiskFATInfo.FDT_StartClustor = Fat_Buffer[0x2C] |Fat_Buffer[0x2D] << 8|(uint32)Fat_Buffer[0x2E]<<16|(uint32)Fat_Buffer[0x2F]<<24;
lds R2,_Fat_Buffer+45
clr R3
mov R3,R2
clr R2
lds R4,_Fat_Buffer+44
clr R5
or R4,R2
or R5,R3
movw R2,R4
clr R4
sbrc R3,7
com R4
clr R5
sbrc R4,7
com R5
lds R6,_Fat_Buffer+46
clr R7
clr R8
clr R9
movw R8,R6
clr R6
clr R7
or R2,R6
or R3,R7
or R4,R8
or R5,R9
ldi R24,24
ldi R25,0
lds R6,_Fat_Buffer+47
clr R7
clr R8
clr R9
st -y,R24
movw R16,R6
movw R18,R8
xcall lsl32
or R2,R16
or R3,R17
or R4,R18
or R5,R19
sts _DiskFATInfo+12+1,R3
sts _DiskFATInfo+12,R2
.dbline 70
;
; return 1;
ldi R16,1
.dbline -2
L1:
adiw R28,2
xcall pop_gset3
.dbline 0 ; func end
ret
.dbend
.dbfunc e FileExt_Compare _FileExt_Compare fc
; i -> R20
; strExt2 -> R18,R19
; strExt1 -> R16,R17
.even
_FileExt_Compare::
xcall push_gset1
.dbline -1
.dbline 76
; }
;
; //****************************************************************************
; //文件扩展名匹配,匹配成功返回真
; uint8 FileExt_Compare(uint8 *strExt1,uint8 *strExt2)
; {
.dbline 79
; uint8 i;
;
; for(i=0; i<3; i++)
clr R20
xjmp L54
L51:
.dbline 80
; {
.dbline 81
; if(strExt1[i]!= strExt2[i]) break;
mov R30,R20
clr R31
add R30,R18
adc R31,R19
ldd R2,z+0
mov R30,R20
clr R31
add R30,R16
adc R31,R17
ldd R3,z+0
cp R3,R2
breq L55
.dbline 81
xjmp L53
L55:
.dbline 82
L52:
.dbline 79
inc R20
L54:
.dbline 79
cpi R20,3
brlo L51
L53:
.dbline 83
; }
; if(i == 3) return 1;
cpi R20,3
brne L57
.dbline 83
ldi R16,1
xjmp L50
L57:
.dbline 85
;
; return 0;
clr R16
.dbline -2
L50:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym r strExt2 18 pc
.dbsym r strExt1 16 pc
.dbend
.dbfunc e GetMusicFile _GetMusicFile fV
; FileExt -> y+18
; LocalOfFirstLFN -> y+14
; Index_tmp -> y+10
; n -> y+6
; LocalOfMusic -> y+27
; k -> y+25
; i -> y+23
; tem -> y+2
; j -> y+21
.even
_GetMusicFile::
xcall push_gset5
sbiw R28,33
.dbline -1
.dbline 91
; }
;
; //****************************************************************************
; //获取音乐文件
; void GetMusicFile(void)
; {
.dbline 94
; uint16 i,j,k;
; uint32 tem; //记录目录起始位置
; uint32 Index_tmp=1; //记录目录编号,不从0开始,因为第0项是系统占用的
ldi R20,1
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
std z+10,R20
std z+11,R21
std z+12,R22
std z+13,R23
.dbline 97
; uint32 LocalOfFirstLFN;
; uint32 n;
; uint16 LocalOfMusic=0; //音乐文件的编号
clr R0
clr R1
std y+28,R1
std y+27,R0
xjmp L61
L60:
.dbline 102
; uint8 FileExt[3];
;
;
; while(1)
; {
.dbline 103
; n = DiskFATInfo.FDT_LBA+(Index_tmp/(DiskFATInfo.BytesPerSector/32));
ldi R18,5
ldi R19,0
lds R16,_DiskFATInfo+15
lds R17,_DiskFATInfo+15+1
xcall lsr16
movw R2,R16
clr R4
clr R5
movw R30,R28
ldd R6,z+10
ldd R7,z+11
ldd R8,z+12
ldd R9,z+13
st -y,R5
st -y,R4
st -y,R3
st -y,R2
movw R16,R6
movw R18,R8
xcall div32u
lds R4,_DiskFATInfo+4+2
lds R5,_DiskFATInfo+4+2+1
lds R2,_DiskFATInfo+4
lds R3,_DiskFATInfo+4+1
add R2,R16
adc R3,R17
adc R4,R18
adc R5,R19
movw R30,R28
std z+6,R2
std z+7,R3
std z+8,R4
std z+9,R5
.dbline 106
;
; //读取FDT的相应扇区位置的内容
; SD_ReadBlock(n,Fat_Buffer);
ldi R24,<_Fat_Buffer
ldi R25,>_Fat_Buffer
std y+1,R25
std y+0,R24
movw R30,R28
ldd R16,z+6
ldd R17,z+7
ldd R18,z+8
ldd R19,z+9
xcall _SD_ReadBlock
.dbline 108
;
; tem=((Index_tmp)*32)%DiskFATInfo.BytesPerSector; //获取相应的目录
movw R30,R28
ldd R2,z+10
ldd R3,z+11
ldd R4,z+12
ldd R5,z+13
ldi R20,32
ldi R21,0
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
lds R2,_DiskFATInfo+15
lds R3,_DiskFATInfo+15+1
clr R4
clr R5
st -y,R5
st -y,R4
st -y,R3
st -y,R2
xcall mod32u
movw R30,R28
std z+2,R16
std z+3,R17
std z+4,R18
std z+5,R19
.dbline 110
;
; if(Fat_Buffer[tem] == 0) //后面没有文件了,文件查询完毕
ldi R24,<_Fat_Buffer
ldi R25,>_Fat_Buffer
movw R30,R28
push R26
push R27
ldd R26,z+2
ldd R27,z+3
movw R30,R26
pop R27
pop R26
add R30,R24
adc R31,R25
ldd R2,z+0
tst R2
brne L66
.dbline 111
; {
.dbline 112
; Index_tmp = 0;
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
std z+10,R20
std z+11,R21
std z+12,R22
std z+13,R23
.dbline 113
; break;
xjmp L62
L66:
.dbline 116
; }
;
; if((Fat_Buffer[tem] != 0xe5) && (Fat_Buffer[tem] != 0x05)) //文件没有删除
ldi R24,<_Fat_Buffer
ldi R25,>_Fat_Buffer
movw R30,R28
push R26
push R27
ldd R26,z+2
ldd R27,z+3
movw R30,R26
pop R27
pop R26
add R30,R24
adc R31,R25
ldd R2,z+0
clr R3
mov R24,R2
cpi R24,229
brne X5
xjmp L68
X5:
cpi R24,5
brne X6
xjmp L68
X6:
.dbline 117
; {
.dbline 118
; if(Fat_Buffer[tem+11]!= 0x0F) //文件不为长文件名的一部分
ldi R20,11
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+2
ldd R3,z+3
ldd R4,z+4
ldd R5,z+5
add R2,R20
adc R3,R21
adc R4,R22
adc R5,R23
movw R30,R2
ldi R24,<_Fat_Buffer
ldi R25,>_Fat_Buffer
add R30,R24
adc R31,R25
ldd R24,z+0
cpi R24,15
brne X7
xjmp L70
X7:
.dbline 119
; {
.dbline 120
; for(i=0;i<3;i++) //读取该文件的扩展名
clr R0
clr R1
std y+24,R1
std y+23,R0
xjmp L75
L72:
.dbline 121
.dbline 122
ldi R20,8
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+2
ldd R3,z+3
ldd R4,z+4
ldd R5,z+5
add R2,R20
adc R3,R21
adc R4,R22
adc R5,R23
ldd R6,y+23
ldd R7,y+24
clr R8
clr R9
add R2,R6
adc R3,R7
adc R4,R8
adc R5,R9
movw R30,R2
ldi R24,<_Fat_Buffer
ldi R25,>_Fat_Buffer
add R30,R24
adc R31,R25
ldd R2,z+0
movw R24,R28
adiw R24,18
movw R30,R6
add R30,R24
adc R31,R25
std z+0,R2
.dbline 124
L73:
.dbline 120
ldd R24,y+23
ldd R25,y+24
adiw R24,1
std y+24,R25
std y+23,R24
L75:
.dbline 120
ldd R24,y+23
ldd R25,y+24
cpi R24,3
ldi R30,0
cpc R25,R30
brlo L72
.dbline 126
; {
; FileExt[i] = Fat_Buffer[tem+8+i];
;
; }
;
; if(FileExt_Compare(FileExt,"MP3")) //如果该文件是MP3
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -