📄 fat.lst
字号:
C51 COMPILER V7.06 FAT 11/16/2008 16:00:19 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE FAT
OBJECT MODULE PLACED IN FAT.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE FAT.C BROWSE DEBUG OBJECTEXTEND TABS(1)
stmt level source
1 /******************************************************************
2 本程序只供学习使用,未经作者许可,不得用于其它任何用途
3
4 欢迎访问我的USB专区:http://group.ednchina.com/93/
5 欢迎访问我的blog: http://www.ednchina.com/blog/computer00
6 http://computer00.21ic.org
7
8 感谢PCB赞助商——电子园: http://bbs.cepark.com/
9
10 FAT.c file
11
12 作者:电脑圈圈
13 建立日期: 2008.08.19
14 修改日期: 2008.08.20
15 版本:V1.1
16 版权所有,盗版必究。
17 Copyright(C) 电脑圈圈 2008-2018
18 All rights reserved
19 *******************************************************************/
20
21 #include "FAT.h"
22
23 //DBR(DOS引导记录)
24 code uint8 Dbr[512]=
25 {
26 0xeb, 0x3e, 0x90, //跳转指令,不能改为0,否则提示未格式化
27 'M','S','D','O','S','5','.','0', //文件系统及版本信息"MSDOS5.0"
28 0x00, 0x02, //每扇区字节数,为512字节
29 0x20, //每簇扇区数,为32扇区
30 0x01, 0x00, //保留扇区数,为1
31 0x02, //该分区的FAT份数,为2
32 0x00, 0x02, //根目录项数,为512项
33 0x00, 0x00, //小扇区数,这里不用,为0
34 0xF8, //媒体描述符,0xF8表示硬盘
35 0x20, 0x00, //每FAT扇区数,为32个
36 0x20, 0x00, //每道扇区数,为32
37 0x40, 0x00, //磁头数为64
38 0x00, 0x00, 0x00, 0x00, //隐藏扇区数这里没有隐藏扇区,为0
39 0x00, 0x00, 0x04, 0x00, //大扇区数,扇区的总数,128M为0x40000
40 0x80, //磁盘驱动器参数,80表示硬盘
41 0x00, //保留
42 0x29, //扩展引导标记,0x29表示接下来的三个域可用
43 0x88, 0x09, 0x71, 0x20, //标卷序列号
44
45 //磁盘标卷:圈圈的假U盘
46 0xC8, 0xA6, 0xC8, 0xA6, 0xB5, 0xC4, 0xBC, 0xD9,
47 0x55, 0xC5, 0xCC,
48
49 //文件系统类型信息,为字符串"FAT16 "
50 'F', 'A', 'T', '1', '6', 0x20,0x20, 0x20,
51
52 //以下为引导代码,直接从其它U盘复制而来
53 0xf1, 0x7d,
54 0xfa, 0x33, 0xc9, 0x8e, 0xd1, 0xbc, 0xfc, 0x7b, 0x16, 0x07, 0xbd, 0x78, 0x00, 0xc5, 0x76, 0x00,
55 0x1e, 0x56, 0x16, 0x55, 0xbf, 0x22, 0x05, 0x89, 0x7e, 0x00, 0x89, 0x4e, 0x02, 0xb1, 0x0b, 0xfc,
C51 COMPILER V7.06 FAT 11/16/2008 16:00:19 PAGE 2
56 0xf3, 0xa4, 0x06, 0x1f, 0xbd, 0x00, 0x7c, 0xc6, 0x45, 0xfe, 0x0f, 0x8b, 0x46, 0x18, 0x88, 0x45,
57 0xf9, 0xfb, 0x38, 0x66, 0x24, 0x7c, 0x04, 0xcd, 0x13, 0x72, 0x3c, 0x8a, 0x46, 0x10, 0x98, 0xf7,
58 0x66, 0x16, 0x03, 0x46, 0x1c, 0x13, 0x56, 0x1e, 0x03, 0x46, 0x0e, 0x13, 0xd1, 0x50, 0x52, 0x89,
59 0x46, 0xfc, 0x89, 0x56, 0xfe, 0xb8, 0x20, 0x00, 0x8b, 0x76, 0x11, 0xf7, 0xe6, 0x8b, 0x5e, 0x0b,
60 0x03, 0xc3, 0x48, 0xf7, 0xf3, 0x01, 0x46, 0xfc, 0x11, 0x4e, 0xfe, 0x5a, 0x58, 0xbb, 0x00, 0x07,
61 0x8b, 0xfb, 0xb1, 0x01, 0xe8, 0x94, 0x00, 0x72, 0x47, 0x38, 0x2d, 0x74, 0x19, 0xb1, 0x0b, 0x56,
62 0x8b, 0x76, 0x3e, 0xf3, 0xa6, 0x5e, 0x74, 0x4a, 0x4e, 0x74, 0x0b, 0x03, 0xf9, 0x83, 0xc7, 0x15,
63 0x3b, 0xfb, 0x72, 0xe5, 0xeb, 0xd7, 0x2b, 0xc9, 0xb8, 0xd8, 0x7d, 0x87, 0x46, 0x3e, 0x3c, 0xd8,
64 0x75, 0x99, 0xbe, 0x80, 0x7d, 0xac, 0x98, 0x03, 0xf0, 0xac, 0x84, 0xc0, 0x74, 0x17, 0x3c, 0xff,
65 0x74, 0x09, 0xb4, 0x0e, 0xbb, 0x07, 0x00, 0xcd, 0x10, 0xeb, 0xee, 0xbe, 0x83, 0x7d, 0xeb, 0xe5,
66 0xbe, 0x81, 0x7d, 0xeb, 0xe0, 0x33, 0xc0, 0xcd, 0x16, 0x5e, 0x1f, 0x8f, 0x04, 0x8f, 0x44, 0x02,
67 0xcd, 0x19, 0xbe, 0x82, 0x7d, 0x8b, 0x7d, 0x0f, 0x83, 0xff, 0x02, 0x72, 0xc8, 0x8b, 0xc7, 0x48,
68 0x48, 0x8a, 0x4e, 0x0d, 0xf7, 0xe1, 0x03, 0x46, 0xfc, 0x13, 0x56, 0xfe, 0xbb, 0x00, 0x07, 0x53,
69 0xb1, 0x04, 0xe8, 0x16, 0x00, 0x5b, 0x72, 0xc8, 0x81, 0x3f, 0x4d, 0x5a, 0x75, 0xa7, 0x81, 0xbf,
70 0x00, 0x02, 0x42, 0x4a, 0x75, 0x9f, 0xea, 0x00, 0x02, 0x70, 0x00, 0x50, 0x52, 0x51, 0x91, 0x92,
71 0x33, 0xd2, 0xf7, 0x76, 0x18, 0x91, 0xf7, 0x76, 0x18, 0x42, 0x87, 0xca, 0xf7, 0x76, 0x1a, 0x8a,
72 0xf2, 0x8a, 0x56, 0x24, 0x8a, 0xe8, 0xd0, 0xcc, 0xd0, 0xcc, 0x0a, 0xcc, 0xb8, 0x01, 0x02, 0xcd,
73 0x13, 0x59, 0x5a, 0x58, 0x72, 0x09, 0x40, 0x75, 0x01, 0x42, 0x03, 0x5e, 0x0b, 0xe2, 0xcc, 0xc3,
74 0x03, 0x18, 0x01, 0x27, 0x0d, 0x0a, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x73, 0x79,
75 0x73, 0x74, 0x65, 0x6d, 0x20, 0x64, 0x69, 0x73, 0x6b, 0xff, 0x0d, 0x0a, 0x44, 0x69, 0x73, 0x6b,
76 0x20, 0x49, 0x2f, 0x4f, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0xff, 0x0d, 0x0a, 0x52, 0x65, 0x70,
77 0x6c, 0x61, 0x63, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x69, 0x73, 0x6b, 0x2c, 0x20, 0x61,
78 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x70, 0x72, 0x65, 0x73, 0x73, 0x20, 0x61, 0x6e,
79 0x79, 0x20, 0x6b, 0x65, 0x79, 0x0d, 0x0a, 0x00, 0x49, 0x4f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
80 0x53, 0x59, 0x53, 0x4d, 0x53, 0x44, 0x4f, 0x53, 0x20, 0x20, 0x20, 0x53, 0x59, 0x53, 0x80, 0x01,
81 0x00, 0x57, 0x49, 0x4e, 0x42, 0x4f, 0x4f, 0x54, 0x20, 0x53, 0x59, 0x53, 0x00, 0x00, 0x55, 0xaa,
82 };
83
84 //模拟的文件分配表
85 //其中项0为0xFFF8,项1为0xFFFF,表示已经使用。
86 //项2为0xFFFF,表示文件结束。其余项为0,表示未使用
87 code uint8 Fat[64]=
88 {
89 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
90 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
91 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
92 0x00, 0x00 ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
93 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
94 0x00, 0x00 ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
95 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
96 0x00, 0x00 ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00
97 };
98
99 //64字节的0,填充0用。
100 code uint8 Zeros[64]=
101 {
102 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
103 0x00, 0x00 ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
104 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
105 0x00, 0x00 ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
106 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
107 0x00, 0x00 ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
108 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
109 0x00, 0x00 ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00
110 };
111
112 //测试文件的数据
113 code uint8 TestFileData[]=
114 {
115 "这是一个测试程序,用来测试文件系统是否工作正常。\r\n如果你能看到这些文字,那么说明你的电脑已经中了最\r\n
-无耻的电脑圈圈病毒了,请马上把所有文件删除,并格\r\n式化硬盘后,将硬盘压碎,以免你也被感染!如果你在\r\n30秒内还未开始删
-除文件,你的电脑将会永久报废!\r\n欢迎访问我们的USB专区: http://group.ednchina.com/93/"
C51 COMPILER V7.06 FAT 11/16/2008 16:00:19 PAGE 3
116 };
117
118
119 /********** 时间格式(16Bits)为: **************
120 Bits15~11表示小时,可以取值为0~23;
121 Bits10~5表示分,可以取值为0~59;
122 Bits4~0表示秒,可以取值为0~29,每单位为2秒,即实际秒值为该值的2倍。
123 */
124
125 /********* 日期格式(16Bits)为: *************
126 Bits15~9表示年份,可以取值为0~127,它表示距离1980年差值,
127 即实际的年份为该值加上1980,最大可表示到2107年;
128
129 Bits8~5表示月份,可以取值为1~12;
130 Bits4~0表示号数,可以取值为1~31。
131 */
132
133 //求出16位时间格式的高字节
134 #define TIME_HB(H,M,S) (((((H)<<11))|((M)<<5)|(S))>>8)
135 //求出16位时间格式的低字节
136 #define TIME_LB(H,M,S) ((((H)<<11))|((M)<<5)|(S))
137
138 //求出16位日期格式的高字节
139 #define DATE_HB(Y,M,D) (((((Y)-1980)<<9)|((M)<<5)|(D))>>8)
140 //求出16位日期格式的低字节
141 #define DATE_LB(Y,M,D) ((((Y)-1980)<<9)|((M)<<5)|(D))
142
143
144 //根目录
145 code uint8 RootDir[64]=
146 {
147 //磁盘标卷:圈圈的假U盘
148 0xC8, 0xA6, 0xC8, 0xA6, 0xB5, 0xC4, 0xBC, 0xD9, 0x55, 0xC5, 0xCC,
149 0x08, //文件属性,表示磁盘标卷
150 0x00, //保留
151 0x00, //创建时间毫秒时间戳
152
153 //文件创建时间,15点27分35秒
154 TIME_LB(15,27,35), TIME_HB(15,27,35),
155
156 //文件创建日期,2008年8月19日
157 DATE_LB(2008,8,19), DATE_HB(2008,8,19),
158
159 //最后访问日期,2008年8月20日
160 DATE_LB(2008,8,20), DATE_HB(2008,8,20),
161
162 0x00, 0x00, //起始簇号高位字节,FAT12/16必须为0
163
164 //最后修改时间,15点36分47秒
165 TIME_LB(15,36,47), TIME_HB(15,36,47),
166
167 //最后修改日期,2008年8月19日
168 DATE_LB(2008,8,19), DATE_HB(2008,8,19),
169
170 0x00, 0x00, //起始簇低字
171 0x00, 0x00, 0x00, 0x00, //文件长度
172
173 //根目录下的测试文件
174 //文件名“TEST.TXT”
175 'T', 'E', 'S', 'T', ' ', ' ', ' ', ' ', 'T', 'X', 'T',
176 0x01, //文件属性,表示只读文件
177 0x00, //保留
C51 COMPILER V7.06 FAT 11/16/2008 16:00:19 PAGE 4
178 0x00, //创建时间毫秒时间戳
179 //文件创建时间,15点48分26秒
180 TIME_LB(15,48,26), TIME_HB(15,48,26),
181
182 //文件创建日期,2008年8月19日
183 DATE_LB(2008,8,19), DATE_HB(2008,8,19),
184
185 //最后访问日期
186 DATE_LB(2008,8,20), DATE_HB(2008,8,20),
187
188 0x00, 0x00, //起始簇号高位字节,FAT12/16必须为0
189
190 //最后修改时间,15点50分33秒
191 TIME_LB(15,50,33), TIME_HB(15,50,33),
192
193 //最后修改日期,2008年8月19日
194 DATE_LB(2008,8,19), DATE_HB(2008,8,19),
195
196 0x02, 0x00, //起始簇低字,簇2。
197
198 //文件长度
199 (sizeof(TestFileData)-1),((sizeof(TestFileData)-1)>>8), 0x00, 0x00,
200 };
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = ---- ----
CONSTANT SIZE = 1005 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -