📄 fat.s
字号:
ldd R6,z+0
clr R7
clr R8
clr R9
ldi R24,24
ldi R25,0
st -y,R24
movw R16,R6
movw R18,R8
xcall lsl32
or R2,R16
or R3,R17
or R4,R18
or R5,R19
ldi R16,41
ldi R17,0
ldd R18,y+27
ldd R19,y+28
xcall empy16s
movw R30,R16
ldi R24,<_MusicInfoList+37
ldi R25,>_MusicInfoList+37
add R30,R24
adc R31,R25
std z+0,R2
std z+1,R3
std z+2,R4
std z+3,R5
.dbline 160
; break;
xjmp L90
L94:
.dbline 163
L89:
.dbline 149
xjmp L88
L90:
.dbline 164
; }
;
; }
; k = 0;
clr R0
clr R1
std y+26,R1
std y+25,R0
.dbline 165
; for(i=Index_tmp-1; i>=LocalOfFirstLFN; i--)
ldi R20,1
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+10
ldd R3,z+11
ldd R4,z+12
ldd R5,z+13
sub R2,R20
sbc R3,R21
sbc R4,R22
sbc R5,R23
std y+24,R3
std y+23,R2
xjmp L101
L98:
.dbline 166
; {
.dbline 167
; n = DiskFATInfo.FDT_LBA+(i/(DiskFATInfo.BytesPerSector/32));
ldi R18,5
ldi R19,0
lds R16,_DiskFATInfo+15
lds R17,_DiskFATInfo+15+1
xcall lsr16
movw R18,R16
ldd R16,y+23
ldd R17,y+24
xcall div16u
movw R2,R16
clr R4
clr R5
lds R8,_DiskFATInfo+4+2
lds R9,_DiskFATInfo+4+2+1
lds R6,_DiskFATInfo+4
lds R7,_DiskFATInfo+4+1
add R6,R2
adc R7,R3
adc R8,R4
adc R9,R5
movw R30,R28
std z+6,R6
std z+7,R7
std z+8,R8
std z+9,R9
.dbline 169
; //读取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 170
; tem = (i*32)%DiskFATInfo.BytesPerSector;
ldi R16,32
ldi R17,0
ldd R18,y+23
ldd R19,y+24
xcall empy16s
lds R18,_DiskFATInfo+15
lds R19,_DiskFATInfo+15+1
xcall mod16u
movw R2,R16
clr R4
clr R5
movw R30,R28
std z+2,R2
std z+3,R3
std z+4,R4
std z+5,R5
.dbline 172
;
; for(j=1; j<32; j++)
ldi R24,1
ldi R25,0
std y+22,R25
std y+21,R24
xjmp L108
L105:
.dbline 173
; {
.dbline 174
; if(j==0x0B|j==0x0C|j==0x0D|j==0x1A|j==0x1B)
ldd R24,y+21
ldd R25,y+22
cpi R24,11
ldi R30,0
cpc R25,R30
brne L111
ldi R24,1
ldi R25,0
std y+32,R25
std y+31,R24
xjmp L112
L111:
clr R0
clr R1
std y+32,R1
std y+31,R0
L112:
ldd R24,y+21
ldd R25,y+22
cpi R24,12
ldi R30,0
cpc R25,R30
brne L113
ldi R24,1
ldi R25,0
std y+30,R25
std y+29,R24
xjmp L114
L113:
clr R0
clr R1
std y+30,R1
std y+29,R0
L114:
ldd R24,y+21
ldd R25,y+22
cpi R24,13
ldi R30,0
cpc R25,R30
brne L115
ldi R24,1
ldi R25,0
movw R10,R24
xjmp L116
L115:
clr R10
clr R11
L116:
ldd R24,y+21
ldd R25,y+22
cpi R24,26
ldi R30,0
cpc R25,R30
brne L117
ldi R24,1
ldi R25,0
movw R12,R24
xjmp L118
L117:
clr R12
clr R13
L118:
ldd R24,y+21
ldd R25,y+22
cpi R24,27
ldi R30,0
cpc R25,R30
brne L119
ldi R24,1
ldi R25,0
movw R14,R24
xjmp L120
L119:
clr R14
clr R15
L120:
ldd R2,y+31
ldd R3,y+32
ldd R0,y+29
ldd R1,y+30
or R2,R0
or R3,R1
or R2,R10
or R3,R11
or R2,R12
or R3,R13
or R2,R14
or R3,R15
tst R2
brne X4
tst R3
breq L109
X4:
.dbline 175
; continue;
xjmp L106
L109:
.dbline 176
; if(Fat_Buffer[tem+j]<128 && Fat_Buffer[tem+j]!=0)
ldd R2,y+21
ldd R3,y+22
clr R4
clr R5
movw R30,R28
ldd R6,z+2
ldd R7,z+3
ldd R8,z+4
ldd R9,z+5
add R6,R2
adc R7,R3
adc R8,R4
adc R9,R5
movw R30,R6
ldi R24,<_Fat_Buffer
ldi R25,>_Fat_Buffer
add R30,R24
adc R31,R25
ldd R2,z+0
clr R3
mov R24,R2
cpi R24,128
brsh L121
tst R24
breq L121
.dbline 177
; {
.dbline 178
; MusicInfoList[LocalOfMusic].FileName[k] = Fat_Buffer[tem+j];
ldi R16,41
ldi R17,0
ldd R18,y+27
ldd R19,y+28
xcall empy16s
movw R2,R16
ldi R24,<_MusicInfoList
ldi R25,>_MusicInfoList
add R2,R24
adc R3,R25
ldd R30,y+25
ldd R31,y+26
add R30,R2
adc R31,R3
ldd R2,y+21
ldd R3,y+22
clr R4
clr R5
movw R26,R28
adiw R26,2
ld R6,x+
ld R7,x+
ld R8,x+
ld R9,x
add R6,R2
adc R7,R3
adc R8,R4
adc R9,R5
movw R26,R6
ldi R24,<_Fat_Buffer
ldi R25,>_Fat_Buffer
add R26,R24
adc R27,R25
ld R2,x
std z+0,R2
.dbline 179
; k++;
ldd R24,y+25
ldd R25,y+26
adiw R24,1
std y+26,R25
std y+25,R24
.dbline 180
; }
L121:
.dbline 182
L106:
.dbline 172
ldd R24,y+21
ldd R25,y+22
adiw R24,1
std y+22,R25
std y+21,R24
L108:
.dbline 172
ldd R24,y+21
ldd R25,y+22
cpi R24,32
ldi R30,0
cpc R25,R30
brsh X11
xjmp L105
X11:
.dbline 183
L99:
.dbline 165
ldd R24,y+23
ldd R25,y+24
sbiw R24,1
std y+24,R25
std y+23,R24
L101:
.dbline 165
movw R30,R28
ldd R2,z+14
ldd R3,z+15
ldd R4,z+16
ldd R5,z+17
ldd R6,y+23
ldd R7,y+24
clr R8
clr R9
cp R6,R2
cpc R7,R3
cpc R8,R4
cpc R9,R5
brlo X12
xjmp L98
X12:
.dbline 184
; // else if(Fat_Buffer[tem+j]>128 && Fat_Buffer[tem+j]!=)
; }
; }
; LocalOfMusic++; //开始下一个音乐文件的记录
ldd R24,y+27
ldd R25,y+28
adiw R24,1
std y+28,R25
std y+27,R24
.dbline 185
; }
L71:
.dbline 186
; }
L68:
.dbline 188
ldi R20,1
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+10
ldd R3,z+11
ldd R4,z+12
ldd R5,z+13
add R2,R20
adc R3,R21
adc R4,R22
adc R5,R23
movw R30,R28
std z+10,R2
std z+11,R3
std z+12,R4
std z+13,R5
.dbline 190
L61:
.dbline 101
xjmp L60
L62:
.dbline 191
;
; Index_tmp++; //跳到下一个目录编号
;
; }
; NumOfFile = LocalOfMusic;
ldd R2,y+27
ldd R3,y+28
clr R4
clr R5
sts _NumOfFile+1,R3
sts _NumOfFile,R2
sts _NumOfFile+2+1,R5
sts _NumOfFile+2,R4
.dbline -2
L59:
adiw R28,33
xcall pop_gset5
.dbline 0 ; func end
ret
.dbsym l FileExt 18 A[3:3]c
.dbsym l LocalOfFirstLFN 14 l
.dbsym l Index_tmp 10 l
.dbsym l n 6 l
.dbsym l LocalOfMusic 27 i
.dbsym l k 25 i
.dbsym l i 23 i
.dbsym l tem 2 l
.dbsym l j 21 i
.dbend
.dbfunc e ReadBlockforCluster _ReadBlockforCluster fl
; tmp -> y+2
; offset -> y+14
; Sector -> y+10
.even
_ReadBlockforCluster::
xcall push_arg4
xcall push_gset2
sbiw R28,6
.dbline -1
.dbline 195
; }
;
; uint32 ReadBlockforCluster(uint32 Sector,uint32 offset)
; {
.dbline 197
; uint32 tmp;
; SD_ReadBlock(Sector,Fat_Buffer);
ldi R24,<_Fat_Buffer
ldi R25,>_Fat_Buffer
std y+1,R25
std y+0,R24
movw R30,R28
ldd R16,z+10
ldd R17,z+11
ldd R18,z+12
ldd R19,z+13
xcall _SD_ReadBlock
.dbline 198
; tmp=Fat_Buffer[offset] |(Fat_Buffer[offset+1]<<8) |((uint32)Fat_Buffer[offset+2]<<16) |((uint32)Fat_Buffer[offset+3]<<24);
ldi R20,1
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+14
ldd R3,z+15
ldd R4,z+16
ldd R5,z+17
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 R2,z+0
clr R3
mov R3,R2
clr R2
movw R30,R28
push R26
push R27
ldd R26,z+14
ldd R27,z+15
movw R30,R26
pop R27
pop R26
add R30,R24
adc R31,R25
ldd R4,z+0
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
ldi R20,2
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R6,z+14
ldd R7,z+15
ldd R8,z+16
ldd R9,z+17
add R6,R20
adc R7,R21
adc R8,R22
adc R9,R23
movw R30,R6
add R30,R24
adc R31,R25
ldd R6,z+0
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 R20,3
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R6,z+14
ldd R7,z+15
ldd R8,z+16
ldd R9,z+17
add R6,R20
adc R7,R21
adc R8,R22
adc R9,R23
movw R30,R6
add R30,R24
adc R31,R25
ldd R6,z+0
clr R7
clr R8
clr R9
ldi R24,24
ldi R25,0
st -y,R24
movw R16,R6
movw R18,R8
xcall lsl32
or R2,R16
or R3,R17
or R4,R18
or R5,R19
movw R30,R28
std z+2,R2
std z+3,R3
std z+4,R4
std z+5,R5
.dbline 199
; return tmp;
movw R30,R28
ldd R16,z+2
ldd R17,z+3
ldd R18,z+4
ldd R19,z+5
.dbline -2
L123:
adiw R28,6
xcall pop_gset2
adiw R28,4
.dbline 0 ; func end
ret
.dbsym l tmp 2 l
.dbsym l offset 14 l
.dbsym l Sector 10 l
.dbend
.dbfunc e FatNextCluster _FatNextCluster fl
; offset -> R10,R11
; sector -> y+12
; fatOffset -> y+8
; nextCluster -> y+4
; cluster -> y+22
.even
_FatNextCluster::
xcall push_arg4
xcall push_gset3
sbiw R28,16
.dbline -1
.dbline 204
; }
;
;
; uint32 FatNextCluster(uint32 cluster)
; {
.dbline 205
; uint32 nextCluster=0;
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
std z+4,R20
std z+5,R21
std z+6,R22
std z+7,R23
.dbline 206
; uint32 fatOffset=0;
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
std z+8,R20
std z+9,R21
std z+10,R22
std z+11,R23
.dbline 207
; uint32 sector=0;
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
std z+12,R20
std z+13,R21
std z+14,R22
std z+15,R23
.dbline 208
; uint16 offset=0;
clr R10
clr R11
.dbline 210
;
; fatOffset = cluster<<2;
ldi R24,2
ldi R25,0
movw R30,R28
ldd R2,z+22
ldd R3,z+23
ldd R4,z+24
ldd R5,z+25
st -y,R24
movw R16,R2
movw R18,R4
xcall lsl32
movw R30,R28
std z+8,R16
std z+9,R17
std z+10,R18
std z+11,R19
.dbline 211
; sector = DiskFATInfo.FAT_LBA + (fatOffset>>9);
ldi R24,9
ldi R25,0
movw R30,R28
ldd R2,z+8
ldd R3,z+9
ldd R4,z+10
ldd R5,z+11
st -y,R24
movw R16,R2
movw R18,R4
xcall lsr32
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
movw R30,R28
std z+12,R2
std z+13,R3
std z+14,R4
std z+15,R5
.dbline 212
; offset = fatOffset % DiskFATInfo.BytesPerSector;
lds R2,_DiskFATInfo+15
lds R3,_DiskFATInfo+15+1
clr R4
clr R5
movw R30,R28
ldd R6,z+8
ldd R7,z+9
ldd R8,z+10
ldd R9,z+11
st -y,R5
st -y,R4
st -y,R3
st -y,R2
movw R16,R6
movw R18,R8
xcall mod32u
movw R10,R16
.dbline 213
; nextCluster = ReadBlockforCluster(sector,offset);
movw R2,R10
clr R4
clr R5
std y+0,R2
std y+1,R3
std y+2,R4
std y+3,R5
movw R30,R28
ldd R16,z+12
ldd R17,z+13
ldd R18,z+14
ldd R19,z+15
xcall _ReadBlockforCluster
movw R30,R28
std z+4,R16
std z+5,R17
std z+6,R18
std z+7,R19
.dbline 214
; if (nextCluster >= (CLUST_EOFS & FAT_MASK)) // 是否文件的结束簇
ldi R20,248
ldi R21,255
ldi R22,255
ldi R23,255
lds R4,_FAT_MASK+2
lds R5,_FAT_MASK+2+1
lds R2,_FAT_MASK
lds R3,_FAT_MASK+1
and R2,R20
and R3,R21
and R4,R22
and R5,R23
movw R30,R28
ldd R6,z+4
ldd R7,z+5
ldd R8,z+6
ldd R9,z+7
cp R6,R2
cpc R7,R3
cpc R8,R4
cpc R9,R5
brlo L127
.dbline 215
; {
.dbline 216
; nextCluster = CLUST_EOFE;
ldi R20,255
ldi R21,255
ldi R22,255
ldi R23,255
movw R30,R28
std z+4,R20
std z+5,R21
std z+6,R22
std z+7,R23
.dbline 217
; }
L127:
.dbline 218
; return nextCluster;
movw R30,R28
ldd R16,z+4
ldd R17,z+5
ldd R18,z+6
ldd R19,z+7
.dbline -2
L124:
adiw R28,16
xcall pop_gset3
adiw R28,4
.dbline 0 ; func end
ret
.dbsym r offset 10 i
.dbsym l sector 12 l
.dbsym l fatOffset 8 l
.dbsym l nextCluster 4 l
.dbsym l cluster 22 l
.dbend
.area bss(ram, con, rel)
.dbfile C:\AVR\M\1\fat.c
_MusicInfoList::
.blkb 123
.dbsym e MusicInfoList _MusicInfoList A[123:3]X
_DiskFATInfo::
.blkb 23
.dbsym e DiskFATInfo _DiskFATInfo X
_FAT_MASK::
.blkb 4
.dbsym e FAT_MASK _FAT_MASK l
_NumOfFile::
.blkb 4
.dbsym e NumOfFile _NumOfFile l
_Fat_Buffer::
.blkb 512
.dbsym e Fat_Buffer _Fat_Buffer A[512:512]c
.area data(ram, con, rel)
.dbfile C:\AVR\M\1\fat.c
L78:
.blkb 4
.area idata
.byte 'M,'P,51,0
.area data(ram, con, rel)
.dbfile C:\AVR\M\1\fat.c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -