📄 fat.s
字号:
.module FAT.c
.area data(ram, con, rel)
_CHINALIB_point::
.blkb 4
.area idata
.word 0,0
.area data(ram, con, rel)
.dbfile E:\MYWORK~1\开发设计\AVR-MP3\mp3开发板光盘\驱动程序\MP3BOA~1.8\FAT.c
.dbsym e CHINALIB_point _CHINALIB_point l
_UNICODE_point::
.blkb 4
.area idata
.word 0,0
.area data(ram, con, rel)
.dbfile E:\MYWORK~1\开发设计\AVR-MP3\mp3开发板光盘\驱动程序\MP3BOA~1.8\FAT.c
.dbsym e UNICODE_point _UNICODE_point l
.area text(rom, con, rel)
.dbfile E:\MYWORK~1\开发设计\AVR-MP3\mp3开发板光盘\驱动程序\MP3BOA~1.8\FAT.c
.dbfunc e FATinit _FATinit fc
; RootDirSectors -> R10,R11
; BPB_RootEntCnt -> R10,R11
; BPB_FATsz16 -> R12,R13
; BPB_NumFATs -> R14
; BPB_BytePerSec -> y+4
.even
_FATinit::
xcall push_gset5
sbiw R28,6
.dbline -1
.dbline 23
; //ICC-AVR application builder : 2005-11-12 17:11:59
; // Target : M16
; // Crystal: 8.0000Mhz
; // copyright:鲁军波(endylu)
; // www.shop34612283.taobao.com
; // www.adembed.com
; #include <iom16v.h>
; #include <macros.h>
; #include "main.h"
;
; uint32 CHINALIB_point=0;
; uint32 UNICODE_point=0;
;
; extern MP3_INFO mp3_info;
; extern FAT_INFO fat_info;
;
; extern uint8 buffer[512];
; extern uint8 MP3_all_number;
; extern uint8 name_number;
;
; //=======================================================================
; uint8 FATinit(void)
; {/*SD卡的变量*/
.dbline 35
;
; uint16 BPB_BytePerSec; //每扇区的字节数 512
;
; uint8 BPB_NumFATs; //此卷中FAT表的份数;
; uint16 BPB_RootEntCnt; //fat12/16根目录的目录项数;
; uint16 BPB_FATsz16; //FAT12/FAT16一个FAT表占的扇区数(FAT32此项必须为0);
;
; uint16 RootDirSectors; //根目录所占的扇区数
;
; /*变量取值*/
;
; if(SD_read_sector2(0,&fat_info.Relative,1))
ldi R24,1
ldi R25,0
std y+3,R25
std y+2,R24
ldi R24,<_fat_info
ldi R25,>_fat_info
std y+1,R25
std y+0,R24
ldi R16,0
ldi R17,0
ldi R18,0
ldi R19,0
xcall _SD_read_sector2
tst R16
breq L2
.dbline 36
; {
.dbline 37
; return 1;
ldi R16,1
xjmp L1
L2:
.dbline 40
; }
;
; if(fat_info.Relative==0xEB) //判断有没有Relative Sectors
lds R24,_fat_info
cpi R24,235
brne L4
.dbline 41
; fat_info.Relative=0;
clr R2
sts _fat_info,R2
xjmp L5
L4:
.dbline 43
; else
; SD_read_sector2(454,&fat_info.Relative,1); //取Relative Sectors
ldi R24,1
ldi R25,0
std y+3,R25
std y+2,R24
ldi R24,<_fat_info
ldi R25,>_fat_info
std y+1,R25
std y+0,R24
ldi R16,198
ldi R17,1
ldi R18,0
ldi R19,0
xcall _SD_read_sector2
L5:
.dbline 45
;
; SD_read_sector2(((long)fat_info.Relative<<9)+11,buffer,13); //取值
ldi R24,13
ldi R25,0
std y+3,R25
std y+2,R24
ldi R24,<_buffer
ldi R25,>_buffer
std y+1,R25
std y+0,R24
ldi R24,9
ldi R25,0
lds R2,_fat_info
clr R3
clr R4
clr R5
st -y,R24
movw R16,R2
movw R18,R4
xcall lsl32
movw R2,R16
movw R4,R18
ldi R20,11
ldi R21,0
ldi R22,0
ldi R23,0
add R2,R20
adc R3,R21
adc R4,R22
adc R5,R23
movw R16,R2
movw R18,R4
xcall _SD_read_sector2
.dbline 48
;
;
; BPB_BytePerSec=buffer[0]+((int)buffer[1]<<8);
lds R2,_buffer+1
clr R3
mov R3,R2
clr R2
lds R4,_buffer
clr R5
add R4,R2
adc R5,R3
std y+5,R5
std y+4,R4
.dbline 49
; fat_info.BPB_SecPerClus=buffer[2];
lds R2,_buffer+2
sts _fat_info+1,R2
.dbline 50
; fat_info.BPB_RsvdSecCnt=buffer[3];
lds R2,_buffer+3
sts _fat_info+2,R2
.dbline 51
; BPB_NumFATs=buffer[5];
lds R14,_buffer+5
.dbline 53
;
; BPB_RootEntCnt=buffer[6]+((int)buffer[7]<<8);
lds R2,_buffer+7
clr R3
mov R3,R2
clr R2
lds R10,_buffer+6
clr R11
add R10,R2
adc R11,R3
.dbline 54
; BPB_FATsz16=buffer[11]+((int)buffer[12]<<8);
lds R2,_buffer+12
clr R3
mov R3,R2
clr R2
lds R12,_buffer+11
clr R13
add R12,R2
adc R13,R3
.dbline 57
;
; /*计算根目录的首扇区号*/
; fat_info.Firstgengmulu=fat_info.Relative+fat_info.BPB_RsvdSecCnt+BPB_FATsz16*BPB_NumFATs;
mov R18,R14
clr R19
movw R16,R12
xcall empy16s
lds R2,_fat_info+2
clr R3
lds R4,_fat_info
clr R5
add R4,R2
adc R5,R3
add R4,R16
adc R5,R17
sts _fat_info+3+1,R5
sts _fat_info+3,R4
.dbline 60
;
; /*计算FAT16根目录所占的扇区数*/
; RootDirSectors=(((long)BPB_RootEntCnt<<5)+(BPB_BytePerSec-1) )/BPB_BytePerSec;
ldi R24,5
ldi R25,0
movw R2,R10
clr R4
clr R5
st -y,R24
movw R16,R2
movw R18,R4
xcall lsl32
movw R2,R16
movw R4,R18
ldd R24,y+4
ldd R25,y+5
sbiw R24,1
movw R6,R24
clr R8
clr R9
add R2,R6
adc R3,R7
adc R4,R8
adc R5,R9
ldd R6,y+4
ldd R7,y+5
clr R8
clr R9
st -y,R9
st -y,R8
st -y,R7
st -y,R6
movw R16,R2
movw R18,R4
xcall div32s
movw R10,R16
.dbline 62
; /*计算簇2的首扇区*/
; fat_info.FirstDateSecter=fat_info.Relative+fat_info.BPB_RsvdSecCnt+((long)BPB_FATsz16*BPB_NumFATs)+RootDirSectors;
mov R2,R14
clr R3
clr R4
clr R5
movw R6,R12
clr R8
clr R9
st -y,R5
st -y,R4
st -y,R3
st -y,R2
movw R16,R6
movw R18,R8
xcall empy32s
lds R2,_fat_info+2
clr R3
lds R4,_fat_info
clr R5
add R4,R2
adc R5,R3
movw R2,R4
clr R4
sbrc R3,7
com R4
clr R5
sbrc R4,7
com R5
add R2,R16
adc R3,R17
adc R4,R18
adc R5,R19
movw R6,R10
clr R8
clr R9
add R2,R6
adc R3,R7
adc R4,R8
adc R5,R9
sts _fat_info+5+1,R3
sts _fat_info+5,R2
.dbline 65
;
;
; return 0;
clr R16
.dbline -2
L1:
adiw R28,6
xcall pop_gset5
.dbline 0 ; func end
ret
.dbsym r RootDirSectors 10 i
.dbsym r BPB_RootEntCnt 10 i
.dbsym r BPB_FATsz16 12 i
.dbsym r BPB_NumFATs 14 c
.dbsym l BPB_BytePerSec 4 i
.dbend
.dbfunc e Mp3_number_Counter _Mp3_number_Counter fV
; mulu_Clus_number -> y+1
; counter_over -> y+0
; Read_number -> R10
.even
_Mp3_number_Counter::
xcall push_gset5
sbiw R28,3
.dbline -1
.dbline 70
; }
;
; //=======================================================================
; void Mp3_number_Counter(void)
; {
.dbline 72
; uint8 Read_number;
; uint8 counter_over=0;
clr R0
std y+0,R0
.dbline 75
; uint16 mulu_Clus_number;
;
; mulu_Clus_number=fat_info.Firstgengmulu;
lds R2,_fat_info+3
lds R3,_fat_info+3+1
std y+2,R3
std y+1,R2
xjmp L23
L22:
.dbline 78
;
; while(!counter_over)
; {
.dbline 80
;
; SD_start_read(mulu_Clus_number++);
ldd R2,y+1
ldd R3,y+2
movw R24,R2
adiw R24,1
std y+2,R25
std y+1,R24
clr R4
clr R5
movw R16,R2
movw R18,R4
xcall _SD_start_read
.dbline 81
; Read_number=16;
ldi R24,16
mov R10,R24
xjmp L26
L25:
.dbline 83
; while(Read_number--)
; {
.dbline 85
;
; SD_get_date(buffer,32);
ldi R18,32
ldi R19,0
ldi R16,<_buffer
ldi R17,>_buffer
xcall _SD_get_date
.dbline 86
; if((buffer[0]!=0XE5)&(buffer[8]==0x4D)&(buffer[9]==0x50)&(buffer[10]==0x33))
lds R24,_buffer
cpi R24,229
breq L33
ldi R20,1
ldi R21,0
xjmp L34
L33:
clr R20
clr R21
L34:
lds R24,_buffer+8
cpi R24,77
brne L35
ldi R22,1
ldi R23,0
xjmp L36
L35:
clr R22
clr R23
L36:
lds R24,_buffer+9
cpi R24,80
brne L37
ldi R24,1
ldi R25,0
movw R14,R24
xjmp L38
L37:
clr R14
clr R15
L38:
lds R24,_buffer+10
cpi R24,51
brne L39
ldi R24,1
ldi R25,0
movw R12,R24
xjmp L40
L39:
clr R12
clr R13
L40:
movw R2,R20
and R2,R22
and R3,R23
and R2,R14
and R3,R15
and R2,R12
and R3,R13
tst R2
brne X0
tst R3
breq L28
X0:
.dbline 87
; {
.dbline 89
;
; MP3_all_number++;
lds R24,_MP3_all_number
subi R24,255 ; addi 1
sts _MP3_all_number,R24
.dbline 90
; }
xjmp L29
L28:
.dbline 91
; else if(buffer[0]==0)
lds R2,_buffer
tst R2
brne L41
.dbline 92
; {
xjmp L44
L43:
.dbline 94
.dbline 96
ldi R18,32
ldi R19,0
ldi R16,<_buffer
ldi R17,>_buffer
xcall _SD_get_date
.dbline 97
L44:
.dbline 93
; while(Read_number--)
mov R2,R10
clr R3
mov R24,R2
subi R24,1
mov R10,R24
tst R2
brne L43
.dbline 98
; {
;
; SD_get_date(buffer,32);
; }
; counter_over=1;
clr R0
inc R0
std y+0,R0
.dbline 99
; }
L41:
L29:
.dbline 101
L26:
.dbline 82
mov R2,R10
clr R3
mov R24,R2
subi R24,1
mov R10,R24
tst R2
breq X1
xjmp L25
X1:
.dbline 102
L23:
.dbline 77
ldd R0,y+0
tst R0
brne X2
xjmp L22
X2:
.dbline -2
L20:
adiw R28,3
xcall pop_gset5
.dbline 0 ; func end
ret
.dbsym l mulu_Clus_number 1 i
.dbsym l counter_over 0 c
.dbsym r Read_number 10 c
.dbend
.dbfunc e MP3_Directory _MP3_Directory fV
; counter -> y+12
; mulu_Clus_number -> y+4
; i -> y+11
; j -> y+10
; Read_number -> y+8
; number -> R10
.even
_MP3_Directory::
xcall push_gset5
mov R10,R16
sbiw R28,17
.dbline -1
.dbline 108
;
; }
; }
;
; }
;
; //=======================================================================
; void MP3_Directory(uint8 number)
; {
.dbline 114
; uint8 i,j;
; uint8 counter;
; uint16 Read_number;
; uint32 mulu_Clus_number;
;
; Read_number=0;
clr R0
clr R1
std y+9,R1
std y+8,R0
.dbline 115
; counter=number;
std y+12,R10
.dbline 116
; mp3_info.Name_number=0;
clr R2
sts _mp3_info+52,R2
.dbline 117
; mulu_Clus_number=fat_info.Firstgengmulu;
lds R2,_fat_info+3
lds R3,_fat_info+3+1
clr R4
clr R5
movw R30,R28
std z+4,R2
std z+5,R3
std z+6,R4
std z+7,R5
.dbline 118
; mulu_Clus_number=mulu_Clus_number<<9;
ldi R24,9
ldi R25,0
movw R30,R28
ldd R2,z+4
ldd R3,z+5
ldd R4,z+6
ldd R5,z+7
st -y,R24
movw R16,R2
movw R18,R4
xcall lsl32
movw R30,R28
std z+4,R16
std z+5,R17
std z+6,R18
std z+7,R19
xjmp L50
L49:
.dbline 122
;
;
; while(counter)
; {
.dbline 123
; SD_read_sector2(mulu_Clus_number+((long)(Read_number++)<<5),buffer,32);
ldi R24,32
ldi R25,0
std y+3,R25
std y+2,R24
ldi R24,<_buffer
ldi R25,>_buffer
std y+1,R25
std y+0,R24
ldd R2,y+8
ldd R3,y+9
movw R24,R2
adiw R24,1
std y+9,R25
std y+8,R24
ldi R24,5
ldi R25,0
clr R4
clr R5
st -y,R24
movw R16,R2
movw R18,R4
xcall lsl32
movw R30,R28
ldd R2,z+4
ldd R3,z+5
ldd R4,z+6
ldd R5,z+7
add R2,R16
adc R3,R17
adc R4,R18
adc R5,R19
movw R16,R2
movw R18,R4
xcall _SD_read_sector2
.dbline 125
;
; if(counter>1)
ldi R24,1
ldd R0,y+12
cp R24,R0
brlo X10
xjmp L52
X10:
.dbline 126
; {if((buffer[0]!=0XE5)&(buffer[8]==0x4D)&(buffer[9]==0x50)&(buffer[10]==0x33))
.dbline 126
lds R24,_buffer
cpi R24,229
breq L59
ldi R24,1
ldi R25,0
std y+14,R25
std y+13,R24
xjmp L60
L59:
clr R0
clr R1
std y+14,R1
std y+13,R0
L60:
lds R24,_buffer+8
cpi R24,77
brne L61
ldi R24,1
ldi R25,0
movw R14,R24
xjmp L62
L61:
clr R14
clr R15
L62:
lds R24,_buffer+9
cpi R24,80
brne L63
ldi R24,1
ldi R25,0
movw R12,R24
xjmp L64
L63:
clr R12
clr R13
L64:
lds R24,_buffer+10
cpi R24,51
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -