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