📄 fat16.lst
字号:
C51 COMPILER V7.50 FAT16 08/25/2007 14:05:33 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE FAT16
OBJECT MODULE PLACED IN FAT16.OBJ
COMPILER INVOKED BY: e:\Keil\C51\BIN\C51.EXE FAT16.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <stdio.h>
2 #include "FAT16.h"
*** WARNING C245 IN LINE 5 OF FAT16.H: unknown #pragma, line ignored
*** WARNING C245 IN LINE 58 OF FAT16.H: unknown #pragma, line ignored
3
4 uint8 BUFFER[512];
5
6 uint16 BPB_BytesPerSec;
7 uint8 BPB_SecPerClus;
8 uint16 BPB_RsvdSecCnt;
9 uint8 BPB_NumFATs;
10 uint16 BPB_RootEntCnt;
11 uint16 BPB_TotSec16;
12 uint16 BPB_FATSz16;
13 uint32 BPB_HiddSec;
14
15 //********************************************************************************************
16 //读一个扇区
17 void ReadBlock(uint32 LBA)
18 //********************************************************************************************
19 {
20 1 return;
21 1 }
*** WARNING C280 IN LINE 17 OF FAT16.C: 'LBA': unreferenced local variable
22
23 //********************************************************************************************
24 //写一个扇区
25 void WriteBlock(uint32 LBA)
26 //********************************************************************************************
27 {
28 1 return;
29 1 }
*** WARNING C280 IN LINE 25 OF FAT16.C: 'LBA': unreferenced local variable
30
31 //********************************************************************************************
32 void CopyBytes(void* S, void* D, uint16 size)
33 //********************************************************************************************
34 {
35 1 uint8 *s = S, *d = D;
36 1 uint16 i;
37 1 for(i = 0; i < size; i++)
38 1 *d++ = *s++;
39 1 }
40
41 //********************************************************************************************
42 uint8 IsEqual(void* A, void* B, uint8 Size)
43 //********************************************************************************************
44 {
45 1 uint8 i, *a = A, *b = B;
46 1 for(i = 0; i < Size; i++)
47 1 if(a[i] != b[i])
48 1 return 0;
49 1 return 1;
50 1 }
51
C51 COMPILER V7.50 FAT16 08/25/2007 14:05:33 PAGE 2
52 //********************************************************************************************
53 void EmptyBytes(void* D, uint16 size)
54 //********************************************************************************************
55 {
56 1 uint16 i;
57 1 uint8* data = (uint8*)D;
*** ERROR C141 IN LINE 57 OF FAT16.C: syntax error near '='
58 1 for(i = 0; i < size; i++)
59 1 {
60 2 *data++ = 0;
*** ERROR C141 IN LINE 60 OF FAT16.C: syntax error near 'data'
61 2 }
62 1 }
63
64 //********************************************************************************************
65 //读取BPB数据结构
66 void ReadBPB(void)
67 //********************************************************************************************
68 {
69 1 FAT_BPB* BPB = (FAT_BPB*)BUFFER;
70 1 ReadBlock(0);
71 1
72 1 //获取参数
73 1 BPB_BytesPerSec = BPB->BPB_BytesPerSec;
74 1 BPB_SecPerClus = BPB->BPB_SecPerClus;
75 1 BPB_RsvdSecCnt = BPB->BPB_RsvdSecCnt;
76 1 BPB_NumFATs = BPB->BPB_NumFATs;
77 1 BPB_RootEntCnt = BPB->BPB_RootEntCnt;
78 1 BPB_TotSec16 = BPB->BPB_TotSec16;
79 1 BPB_FATSz16 = BPB->BPB_FATSz16;
80 1 BPB_HiddSec = BPB->BPB_HiddSec;
81 1
82 1 }
83
84 //********************************************************************************************
85 //获取根目录开始扇区号
86 uint32 DirStartSec(void)
87 //********************************************************************************************
88 {
89 1 return BPB_RsvdSecCnt + BPB_NumFATs * BPB_FATSz16;
90 1 }
91
92 //********************************************************************************************
93 //获取数据区开始扇区号
94 uint32 DataStartSec(void)
95 //********************************************************************************************
96 {
97 1 return (uint32)(DirStartSec() + BPB_RootEntCnt * 32 / BPB_BytesPerSec);
98 1 }
99
100 //********************************************************************************************
101 //目录项占用的扇区数
102 uint16 GetDirSecCount(void)
103 //********************************************************************************************
104 {
105 1 return BPB_RootEntCnt * 32 / 512;
106 1 }
107
108 //********************************************************************************************
109 //获取一个簇的开始扇区
110 uint32 ClusConvLBA(uint16 ClusID)
111 //********************************************************************************************
C51 COMPILER V7.50 FAT16 08/25/2007 14:05:33 PAGE 3
112 {
113 1 return DataStartSec() + BPB_SecPerClus * (ClusID - 2);
114 1 }
115
116 //********************************************************************************************
117 //读取文件分配表的指定项
118 uint16 ReadFAT(uint16 Index)
119 //********************************************************************************************
120 {
121 1 uint16 *RAM = (uint16*)BUFFER;
122 1 ReadBlock(BPB_RsvdSecCnt + Index / 256);
123 1 return RAM[Index % 256];
124 1 }
125
126 //********************************************************************************************
127 //写文件分配表的指定项
128 void WriteFAT(uint16 Index, uint16 Value)
129 //********************************************************************************************
130 {
131 1 uint16 *RAM = (uint16*)BUFFER;
132 1 uint32 SecID;
133 1 SecID = BPB_RsvdSecCnt + Index / 256;
134 1 ReadBlock(SecID);
135 1 RAM[Index % 256] = Value;
136 1 WriteBlock(SecID);
137 1 }
138
139 //********************************************************************************************
140 //获取根目录中可以使用的一项
141 uint16 GetEmptyDIR()
142 //********************************************************************************************
143 {
144 1 uint16 DirSecCut, DirStart, i, m, ID = 0;
145 1 DirSecCut = GetDirSecCount();
146 1 DirStart = DirStartSec();
147 1 for(i = 0; i < DirSecCut; i++)
148 1 {
149 2 ReadBlock(DirStart + i);
150 2 for(m = 0; m < 16; m++)
151 2 {
152 3 if((BUFFER[m * 32] == 0) || (BUFFER[m * 32] == 0xe5))
153 3 return ID;
154 3 else
155 3 ID++;
156 3 }
157 2 }
158 1 return ID;
159 1 }
160
161 //********************************************************************************************
162 //获得和文件名对应的目录项
163 uint8 GetFileID(uint8 Name[11], DIR* ID)
164 //********************************************************************************************
165 {
166 1 uint16 DirSecCut, DirStart, i, m;
167 1 DirSecCut = GetDirSecCount();
168 1 DirStart = DirStartSec();
169 1 for(i = 0; i < DirSecCut; i++)
170 1 {
171 2 ReadBlock(DirStart + i);
172 2 for(m = 0; m <16; m++)
173 2 {
C51 COMPILER V7.50 FAT16 08/25/2007 14:05:33 PAGE 4
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -