📄 atmel mp3.lst
字号:
C51 COMPILER V7.50 ATMEL_MP3 02/08/2007 11:18:09 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE ATMEL_MP3
OBJECT MODULE PLACED IN ATMEL MP3.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ATMEL MP3.C LARGE BROWSE DEBUG OBJECTEXTEND
line level source
1
2
3 #include <string.h>
4 #define Root_Cluster (0)
5 #define Begin_Cluster (0) //MBR所在的簇号
6 #define Data_Cluster (1) //数据真正开始的扇区
7
8 #define BPB_Sector (0)
9 #define Fat_Sector (BPB_Sector + 1)
10 #define Directory_Sector (Fat_Sector + 4)
11 #define End_Cluster (Disk_Size / 32)
12
13 #define UNUSED_MARK (0xFF)
14 #define BAD_MARK (0x00)
15 #define LAST_BLOCK (0xFFFF)
16 #define FILE_NO_FOUND (512)
17
18 #define PagePerClus 32
19
20 #define FAT12 (12)
21 #define FAT16 (16)
22 #define FAT32 (32)
23
24 #define K9F_FUN P5
25 #define K9F5608 0x4000
26 #define COMMAND 0x03
27 #define ADDRESS 0x05
28 #define D_DATA 0x01
29 #define INACTIVE 0x09
30 #define RB 0x01
31
32 extern void printuf(char * c, unsigned char cb);
33
34
35 //数据结构与全局变量定义
36 unsigned char Page_Buf[512];
37 extern unsigned char SONG[];
38 long int Current_Cluster, DataRead = 0, DataRemain = 0, Sector_Offset = 0x21d;
39 unsigned int TotalCluster, BootSector, RsdSector, SectorofFatSize, TotalCapacity, RootEntry, SecPerClus;
40 unsigned int TotalSector, BytesPerSec, FirstDataSec;
41 unsigned char FAT_TYPE;
42
43
44 int ReadSector(unsigned char *Name, unsigned char *databuff);
45 unsigned char GetMP3List(void);
46 void Init_FAT_Info(void);
47
48 extern void ReadPage(unsigned int block, unsigned int page, unsigned char *pPage);
49
50
51 void Init_FAT_Info(void)
52 {
53 1 /* 得到引导扇区所在扇区号,如果介质是不带分区的,则0扇区就是BootSector了。 */
54 1 ReadPage(Begin_Cluster, 0, Page_Buf);
55 1
C51 COMPILER V7.50 ATMEL_MP3 02/08/2007 11:18:09 PAGE 2
56 1 if (!(Page_Buf[0] == 0xeb && Page_Buf[2] == 0x90)) //通过判断EB ?? 90来看是否已经是BPB了
57 1 { //带分区的介质
58 2
59 2 BootSector = Page_Buf[454] + Page_Buf[455] * 256 + Page_Buf[456] * (256 * 256) + Page_Buf[457] * (256 *
-256 * 256);
60 2 }
61 1 else
62 1 {
63 2 BootSector = 0;
64 2 }
65 1
66 1 /* 得到保留扇区数,总扇区数,总扇区数/每簇扇区数得到簇数,是FAT类型的依据 */
67 1 ReadPage(Begin_Cluster, BootSector, Page_Buf);
68 1 RsdSector = Page_Buf[14] + Page_Buf[15] * 256;
69 1 SecPerClus = Page_Buf[13];
70 1
71 1 BytesPerSec = Page_Buf[12] * 256 + Page_Buf[11];
72 1
73 1 TotalSector = (Page_Buf[20] * 256 + Page_Buf[19]);
74 1 TotalCapacity = TotalSector * BytesPerSec;
75 1 TotalCluster = TotalSector / SecPerClus; //FAT16的簇总数=扇区总数/每簇扇区数
76 1
77 1 SectorofFatSize = ((Page_Buf[22] + Page_Buf[23] * 256));
78 1 RootEntry = (Page_Buf[18] * 256 + Page_Buf[17]);
79 1
80 1 FirstDataSec = BootSector + RsdSector + (SectorofFatSize * 2) + ((RootEntry * 32 + (BytesPerSec-1)) / Byt
-esPerSec);
81 1
82 1 if (TotalCluster > 65525) //FAT32的扇区总数和FAT表项长度
83 1 {
84 2 FAT_TYPE = FAT32;
85 2
86 2 if (TotalSector == 0)
87 2 {
88 3 TotalSector = (Page_Buf[32] + Page_Buf[33] * 256 + Page_Buf[34] * 256 * 256 + Page_Buf[35] * 256 * 256
-* 256);
89 3 }
90 2 TotalCapacity = TotalSector * BytesPerSec;
91 2 TotalCluster = TotalSector / SecPerClus;
92 2
93 2 SectorofFatSize = (Page_Buf[36] + Page_Buf[37] * 256 + Page_Buf[38] * 256 * 256 + Page_Buf[39] * 256 * 2
-56 * 256);
94 2 if (SectorofFatSize > (TotalCluster * 16 / 512))
95 2 {
96 3 SectorofFatSize = ((Page_Buf[22] + Page_Buf[23] * 256));
97 3 }
98 2 RootEntry = (Page_Buf[44] * 256 + Page_Buf[43]);
99 2 FirstDataSec = BootSector+RsdSector + (SectorofFatSize * 2) + ((RootEntry * 32 + (BytesPerSec-1)) / Byte
-sPerSec);
100 2
101 2 }
102 1 else if ((TotalCluster > 0) && (TotalCluster < 4085))
103 1 {
104 2 FAT_TYPE = FAT12;
105 2 }
106 1 else
107 1 {
108 2 FAT_TYPE = FAT16;
109 2 }
110 1 }
111
112 unsigned char GetMP3List(void)
C51 COMPILER V7.50 ATMEL_MP3 02/08/2007 11:18:09 PAGE 3
113 {
114 1 unsigned char i = 0, j = 0, l = 0;
115 1 int k = 0;
116 1 unsigned char MP3[3] = {'M', 'P', '3'};
117 1 Init_FAT_Info();
118 1
119 1 k = BootSector + RsdSector + 2 * SectorofFatSize;
120 1
121 1 ReadPage(0 + k / 32, k % 32, Page_Buf);
122 1
123 1 while (Page_Buf[0] != 0) //遍历整个目录
124 1 {
125 2 for (j=0; j<16; j++)
126 2 // for (j=0; j<12; j++)
127 2 {
128 3 if (!Page_Buf[j * 32]) break;
129 3 if (Page_Buf[j * 32] == 0xE5) continue;
130 3
131 3 if (!memcmp(MP3, &Page_Buf[j * 32 + 8], 3)) //file find
132 3 {
133 4 for (i=0; i<11; i++)
134 4 {
135 5 SONG[l * 11 + i] = Page_Buf[j * 32 + i];
136 5 }
137 4 l++;
138 4 }
139 3 }
140 2 k++;
141 2 ReadPage(0 + k / 32, k % 32, Page_Buf);
142 2 }
143 1 return (l);
144 1 }
145
146 int ReadSector(unsigned char *Name, unsigned char *databuff)
147 {
148 1 int i, k, Page;
149 1 unsigned long CurrentSector;
150 1 if (DataRead == 0) //第一次读取,先查找文件,然后进行
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -