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