📄 fat.lis
字号:
.module FAT.c
.area data(ram, con, rel)
0000 _CHINALIB_point::
0000 .blkb 4
.area idata
0000 00000000 .word 0,0
.area data(ram, con, rel)
0004 .dbfile E:\MYWORK~1\开发设计\AVR-MP3\mp3开发板光盘\驱动程序\MP3BOA~1.8\FAT.c
0004 .dbsym e CHINALIB_point _CHINALIB_point l
0004 _UNICODE_point::
0004 .blkb 4
.area idata
0004 00000000 .word 0,0
.area data(ram, con, rel)
0008 .dbfile E:\MYWORK~1\开发设计\AVR-MP3\mp3开发板光盘\驱动程序\MP3BOA~1.8\FAT.c
0008 .dbsym e UNICODE_point _UNICODE_point l
.area text(rom, con, rel)
0000 .dbfile E:\MYWORK~1\开发设计\AVR-MP3\mp3开发板光盘\驱动程序\MP3BOA~1.8\FAT.c
0000 .dbfunc e FATinit _FATinit fc
0000 ; RootDirSectors -> R10,R11
0000 ; BPB_RootEntCnt -> R10,R11
0000 ; BPB_FATsz16 -> R12,R13
0000 ; BPB_NumFATs -> R14
0000 ; BPB_BytePerSec -> y+4
.even
0000 _FATinit::
0000 0E940000 xcall push_gset5
0004 2697 sbiw R28,6
0006 .dbline -1
0006 .dbline 23
0006 ; //ICC-AVR application builder : 2005-11-12 17:11:59
0006 ; // Target : M16
0006 ; // Crystal: 8.0000Mhz
0006 ; // copyright:鲁军波(endylu)
0006 ; // www.shop34612283.taobao.com
0006 ; // www.adembed.com
0006 ; #include <iom16v.h>
0006 ; #include <macros.h>
0006 ; #include "main.h"
0006 ;
0006 ; uint32 CHINALIB_point=0;
0006 ; uint32 UNICODE_point=0;
0006 ;
0006 ; extern MP3_INFO mp3_info;
0006 ; extern FAT_INFO fat_info;
0006 ;
0006 ; extern uint8 buffer[512];
0006 ; extern uint8 MP3_all_number;
0006 ; extern uint8 name_number;
0006 ;
0006 ; //=======================================================================
0006 ; uint8 FATinit(void)
0006 ; {/*SD卡的变量*/
0006 .dbline 35
0006 ;
0006 ; uint16 BPB_BytePerSec; //每扇区的字节数 512
0006 ;
0006 ; uint8 BPB_NumFATs; //此卷中FAT表的份数;
0006 ; uint16 BPB_RootEntCnt; //fat12/16根目录的目录项数;
0006 ; uint16 BPB_FATsz16; //FAT12/FAT16一个FAT表占的扇区数(FAT32此项必须为0);
0006 ;
0006 ; uint16 RootDirSectors; //根目录所占的扇区数
0006 ;
0006 ; /*变量取值*/
0006 ;
0006 ; if(SD_read_sector2(0,&fat_info.Relative,1))
0006 81E0 ldi R24,1
0008 90E0 ldi R25,0
000A 9B83 std y+3,R25
000C 8A83 std y+2,R24
000E 80E0 ldi R24,<_fat_info
0010 90E0 ldi R25,>_fat_info
0012 9983 std y+1,R25
0014 8883 std y+0,R24
0016 00E0 ldi R16,0
0018 10E0 ldi R17,0
001A 20E0 ldi R18,0
001C 30E0 ldi R19,0
001E 0E940000 xcall _SD_read_sector2
0022 0023 tst R16
0024 11F0 breq L2
0026 .dbline 36
0026 ; {
0026 .dbline 37
0026 ; return 1;
0026 01E0 ldi R16,1
0028 C6C0 xjmp L1
002A L2:
002A .dbline 40
002A ; }
002A ;
002A ; if(fat_info.Relative==0xEB) //判断有没有Relative Sectors
002A 80910000 lds R24,_fat_info
002E 8B3E cpi R24,235
0030 21F4 brne L4
0032 .dbline 41
0032 ; fat_info.Relative=0;
0032 2224 clr R2
0034 20920000 sts _fat_info,R2
0038 0EC0 xjmp L5
003A L4:
003A .dbline 43
003A ; else
003A ; SD_read_sector2(454,&fat_info.Relative,1); //取Relative Sectors
003A 81E0 ldi R24,1
003C 90E0 ldi R25,0
003E 9B83 std y+3,R25
0040 8A83 std y+2,R24
0042 80E0 ldi R24,<_fat_info
0044 90E0 ldi R25,>_fat_info
0046 9983 std y+1,R25
0048 8883 std y+0,R24
004A 06EC ldi R16,198
004C 11E0 ldi R17,1
004E 20E0 ldi R18,0
0050 30E0 ldi R19,0
0052 0E940000 xcall _SD_read_sector2
0056 L5:
0056 .dbline 45
0056 ;
0056 ; SD_read_sector2(((long)fat_info.Relative<<9)+11,buffer,13); //取值
0056 8DE0 ldi R24,13
0058 90E0 ldi R25,0
005A 9B83 std y+3,R25
005C 8A83 std y+2,R24
005E 80E0 ldi R24,<_buffer
0060 90E0 ldi R25,>_buffer
0062 9983 std y+1,R25
0064 8883 std y+0,R24
0066 89E0 ldi R24,9
0068 90E0 ldi R25,0
006A 20900000 lds R2,_fat_info
006E 3324 clr R3
0070 4424 clr R4
0072 5524 clr R5
0074 8A93 st -y,R24
0076 8101 movw R16,R2
0078 9201 movw R18,R4
007A 0E940000 xcall lsl32
007E 1801 movw R2,R16
0080 2901 movw R4,R18
0082 4BE0 ldi R20,11
0084 50E0 ldi R21,0
0086 60E0 ldi R22,0
0088 70E0 ldi R23,0
008A 240E add R2,R20
008C 351E adc R3,R21
008E 461E adc R4,R22
0090 571E adc R5,R23
0092 8101 movw R16,R2
0094 9201 movw R18,R4
0096 0E940000 xcall _SD_read_sector2
009A .dbline 48
009A ;
009A ;
009A ; BPB_BytePerSec=buffer[0]+((int)buffer[1]<<8);
009A 20900100 lds R2,_buffer+1
009E 3324 clr R3
00A0 322C mov R3,R2
00A2 2224 clr R2
00A4 40900000 lds R4,_buffer
00A8 5524 clr R5
00AA 420C add R4,R2
00AC 531C adc R5,R3
00AE 5D82 std y+5,R5
00B0 4C82 std y+4,R4
00B2 .dbline 49
00B2 ; fat_info.BPB_SecPerClus=buffer[2];
00B2 20900200 lds R2,_buffer+2
00B6 20920100 sts _fat_info+1,R2
00BA .dbline 50
00BA ; fat_info.BPB_RsvdSecCnt=buffer[3];
00BA 20900300 lds R2,_buffer+3
00BE 20920200 sts _fat_info+2,R2
00C2 .dbline 51
00C2 ; BPB_NumFATs=buffer[5];
00C2 E0900500 lds R14,_buffer+5
00C6 .dbline 53
00C6 ;
00C6 ; BPB_RootEntCnt=buffer[6]+((int)buffer[7]<<8);
00C6 20900700 lds R2,_buffer+7
00CA 3324 clr R3
00CC 322C mov R3,R2
00CE 2224 clr R2
00D0 A0900600 lds R10,_buffer+6
00D4 BB24 clr R11
00D6 A20C add R10,R2
00D8 B31C adc R11,R3
00DA .dbline 54
00DA ; BPB_FATsz16=buffer[11]+((int)buffer[12]<<8);
00DA 20900C00 lds R2,_buffer+12
00DE 3324 clr R3
00E0 322C mov R3,R2
00E2 2224 clr R2
00E4 C0900B00 lds R12,_buffer+11
00E8 DD24 clr R13
00EA C20C add R12,R2
00EC D31C adc R13,R3
00EE .dbline 57
00EE ;
00EE ; /*计算根目录的首扇区号*/
00EE ; fat_info.Firstgengmulu=fat_info.Relative+fat_info.BPB_RsvdSecCnt+BPB_FATsz16*BPB_NumFATs;
00EE 2E2D mov R18,R14
00F0 3327 clr R19
00F2 8601 movw R16,R12
00F4 0E940000 xcall empy16s
00F8 20900200 lds R2,_fat_info+2
00FC 3324 clr R3
00FE 40900000 lds R4,_fat_info
0102 5524 clr R5
0104 420C add R4,R2
0106 531C adc R5,R3
0108 400E add R4,R16
010A 511E adc R5,R17
010C 50920400 sts _fat_info+3+1,R5
0110 40920300 sts _fat_info+3,R4
0114 .dbline 60
0114 ;
0114 ; /*计算FAT16根目录所占的扇区数*/
0114 ; RootDirSectors=(((long)BPB_RootEntCnt<<5)+(BPB_BytePerSec-1) )/BPB_BytePerSec;
0114 85E0 ldi R24,5
0116 90E0 ldi R25,0
0118 1501 movw R2,R10
011A 4424 clr R4
011C 5524 clr R5
011E 8A93 st -y,R24
0120 8101 movw R16,R2
0122 9201 movw R18,R4
0124 0E940000 xcall lsl32
0128 1801 movw R2,R16
012A 2901 movw R4,R18
012C 8C81 ldd R24,y+4
012E 9D81 ldd R25,y+5
0130 0197 sbiw R24,1
0132 3C01 movw R6,R24
0134 8824 clr R8
0136 9924 clr R9
0138 260C add R2,R6
013A 371C adc R3,R7
013C 481C adc R4,R8
013E 591C adc R5,R9
0140 6C80 ldd R6,y+4
0142 7D80 ldd R7,y+5
0144 8824 clr R8
0146 9924 clr R9
0148 9A92 st -y,R9
014A 8A92 st -y,R8
014C 7A92 st -y,R7
014E 6A92 st -y,R6
0150 8101 movw R16,R2
0152 9201 movw R18,R4
0154 0E940000 xcall div32s
0158 5801 movw R10,R16
015A .dbline 62
015A ; /*计算簇2的首扇区*/
015A ; fat_info.FirstDateSecter=fat_info.Relative+fat_info.BPB_RsvdSecCnt+((long)BPB_FATsz16*BPB_NumFATs)+RootDirSectors;
015A 2E2C mov R2,R14
015C 3324 clr R3
015E 4424 clr R4
0160 5524 clr R5
0162 3601 movw R6,R12
0164 8824 clr R8
0166 9924 clr R9
0168 5A92 st -y,R5
016A 4A92 st -y,R4
016C 3A92 st -y,R3
016E 2A92 st -y,R2
0170 8301 movw R16,R6
0172 9401 movw R18,R8
0174 0E940000 xcall empy32s
0178 20900200 lds R2,_fat_info+2
017C 3324 clr R3
017E 40900000 lds R4,_fat_info
0182 5524 clr R5
0184 420C add R4,R2
0186 531C adc R5,R3
0188 1201 movw R2,R4
018A 4424 clr R4
018C 37FC sbrc R3,7
018E 4094 com R4
0190 5524 clr R5
0192 47FC sbrc R4,7
0194 5094 com R5
0196 200E add R2,R16
0198 311E adc R3,R17
019A 421E adc R4,R18
019C 531E adc R5,R19
019E 3501 movw R6,R10
01A0 8824 clr R8
01A2 9924 clr R9
01A4 260C add R2,R6
01A6 371C adc R3,R7
01A8 481C adc R4,R8
01AA 591C adc R5,R9
01AC 30920600 sts _fat_info+5+1,R3
01B0 20920500 sts _fat_info+5,R2
01B4 .dbline 65
01B4 ;
01B4 ;
01B4 ; return 0;
01B4 0027 clr R16
01B6 .dbline -2
01B6 L1:
01B6 2696 adiw R28,6
01B8 0E940000 xcall pop_gset5
01BC .dbline 0 ; func end
01BC 0895 ret
01BE .dbsym r RootDirSectors 10 i
01BE .dbsym r BPB_RootEntCnt 10 i
01BE .dbsym r BPB_FATsz16 12 i
01BE .dbsym r BPB_NumFATs 14 c
01BE .dbsym l BPB_BytePerSec 4 i
01BE .dbend
01BE .dbfunc e Mp3_number_Counter _Mp3_number_Counter fV
01BE ; mulu_Clus_number -> y+1
01BE ; counter_over -> y+0
01BE ; Read_number -> R10
.even
01BE _Mp3_number_Counter::
01BE 0E940000 xcall push_gset5
01C2 2397 sbiw R28,3
01C4 .dbline -1
01C4 .dbline 70
01C4 ; }
01C4 ;
01C4 ; //=======================================================================
01C4 ; void Mp3_number_Counter(void)
01C4 ; {
01C4 .dbline 72
01C4 ; uint8 Read_number;
01C4 ; uint8 counter_over=0;
01C4 0024 clr R0
01C6 0882 std y+0,R0
01C8 .dbline 75
01C8 ; uint16 mulu_Clus_number;
01C8 ;
01C8 ; mulu_Clus_number=fat_info.Firstgengmulu;
01C8 20900300 lds R2,_fat_info+3
01CC 30900400 lds R3,_fat_info+3+1
01D0 3A82 std y+2,R3
01D2 2982 std y+1,R2
01D4 69C0 xjmp L23
01D6 L22:
01D6 .dbline 78
01D6 ;
01D6 ; while(!counter_over)
01D6 ; {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -