📄 ide.lst
字号:
216 unsigned int byte_offset; //字节偏移
217 unsigned char disk_error=0; //磁盘错误
218
219
220 DPT xdata dpt[4]; //磁盘分区表
221 DBR xdata dbr[4]; //DOS引导记录
222
223
224 unsigned long int xdata FAT_start_sector[4]; //FAT开始扇区
225 unsigned long int xdata DATA_start_sector[4]; //数据开始扇区
226
227 unsigned char mp3_file_exist=0;
228
229 unsigned char xdata FAT_buffer[512]; //文件分配表FAT缓冲
230
231 ////////////////////////////////////// 写扇区计数寄存器 ///////////////////////////////////////////
232 void write_IDE_sector_count(unsigned char count)
233 {
234 1 write_IDE_8(IDE_Sector_Count,count);
235 1 }
236 /////////////////////////////////////////////////////////////////////////////////////////////////
237
238 ///////////////////////////////// 读取一个FAT扇区,512字节保存在FAT_buffer[]中 ///////////////////////
239 void read_IDE_FAT_sector(unsigned long int LBA)
240 {
241 1 unsigned int i;
C51 COMPILER V7.06 IDE 03/02/2006 23:11:50 PAGE 5
242 1 if(LBA>=(dpt[driver_number].start_sector+dpt[driver_number].total_sectors))return;
243 1 write_IDE_LBA(LBA);
244 1 write_IDE_sector_count(1);
245 1 write_IDE_command(IDE_Read_Sectors);
246 1 IDE_Address=IDE_Data;
247 1 set_IDE_address();
248 1 IDE_DATA_H=0xFF;
249 1 IDE_DATA_L=0xFF;
250 1 for(i=0;i<512;i++)
251 1 {
252 2 while(!IDE_IORDY);
253 2 IDE_DIOR=0;
254 2 FAT_buffer[i]=IDE_DATA_L;
255 2 i++;
256 2 FAT_buffer[i]=IDE_DATA_H;
257 2 IDE_DIOR=1;
258 2 }
259 1 IDE_Address=IDE_Bus_Not_Use;
260 1 set_IDE_address();
261 1 IDE_DATA_L=0xFF;
262 1 }
263 ///////////////////////////////////////////////////////////////////////////////////////////////
264
265 ///////////////////////////////// 读取一个数据扇区,512字节保存在buffer[]中 //////////////////
266 void read_IDE_sector(unsigned long int LBA)
267 {
268 1 unsigned int i;
269 1 if(LBA>=(dpt[driver_number].start_sector+dpt[driver_number].total_sectors))return;
270 1 write_IDE_LBA(LBA);
271 1 write_IDE_sector_count(1);
272 1 write_IDE_command(IDE_Read_Sectors);
273 1 IDE_Address=IDE_Data;
274 1 set_IDE_address();
275 1 IDE_DATA_H=0xFF;
276 1 IDE_DATA_L=0xFF;
277 1 for(i=0;i<512;i++)
278 1 {
279 2 while(!IDE_IORDY);
280 2 IDE_DIOR=0;
281 2 buffer[i]=IDE_DATA_L;
282 2 i++;
283 2 buffer[i]=IDE_DATA_H;
284 2 IDE_DIOR=1;
285 2 }
286 1 IDE_Address=IDE_Bus_Not_Use;
287 1 set_IDE_address();
288 1 IDE_DATA_L=0xFF;
289 1 }
290 ///////////////////////////////////////////////////////////////////////////////////////////////
291
292 unsigned int play_count; //当前文件夹中播放曲号
293
294 ///////////////////////////////////// 获取磁盘信息 /////////////////////////////////////////
295 void get_IDE_information(void)
296 {
297 1 unsigned int i;
298 1 unsigned long int LBA=0;
299 1 mp3_file_exist=0;
300 1 LBA=0;
301 1 read_IDE_sector(LBA);
302 1 for(i=0;i<4;i++)
303 1 {
C51 COMPILER V7.06 IDE 03/02/2006 23:11:50 PAGE 6
304 2 dpt[i].file_system_type=buffer[0x1C2+i*16]; //文件系统类型
305 2 ((unsigned char *)&(dpt[i].start_sector))[3]=buffer[0x1C6+i*16];
306 2 ((unsigned char *)&(dpt[i].start_sector))[2]=buffer[0x1C7+i*16];
307 2 ((unsigned char *)&(dpt[i].start_sector))[1]=buffer[0x1C8+i*16];
308 2 ((unsigned char *)&(dpt[i].start_sector))[0]=buffer[0x1C9+i*16]; //分区开始扇区
309 2 ((unsigned char *)&(dpt[i].total_sectors))[3]=buffer[0x1CA+i*16];
310 2 ((unsigned char *)&(dpt[i].total_sectors))[2]=buffer[0x1CB+i*16];
311 2 ((unsigned char *)&(dpt[i].total_sectors))[1]=buffer[0x1CC+i*16];
312 2 ((unsigned char *)&(dpt[i].total_sectors))[0]=buffer[0x1CD+i*16]; //分区总扇区
313 2 }
314 1
315 1 if((buffer[510]!=0x55)||(buffer[511]!=0xAA))disk_error=1;
316 1 LBA=dpt[0].start_sector; //C盘
317 1 read_IDE_sector(LBA);
318 1 DISK_CAPACITY[7]=buffer[0x0B];
319 1 DISK_CAPACITY[6]=buffer[0x0C]; //每扇区字节数
320 1 ((unsigned char *)&(dbr[0].bytes_per_sectors))[0]=buffer[0x0C];
321 1 ((unsigned char *)&(dbr[0].bytes_per_sectors))[1]=buffer[0x0B]; //每扇区字节数
322 1 dbr[0].sectors_per_cluster=buffer[0x0D]; //每簇扇区数
323 1 ((unsigned char *)&(dbr[0].reserve_sectors))[1]=buffer[0x0E];
324 1 ((unsigned char *)&(dbr[0].reserve_sectors))[0]=buffer[0x0F]; //保留扇区数
325 1 dbr[0].num_of_FAT=buffer[0x10]; //FAT副本数
326 1 ((unsigned char *)&(dbr[0].FAT16_ROOT_num))[1]=buffer[0x11];
327 1 ((unsigned char *)&(dbr[0].FAT16_ROOT_num))[0]=buffer[0x12]; //FAT16文件系统的根目录数
328 1 ((unsigned char *)&(dbr[0].small_sectors))[1]=buffer[0x13];
329 1 ((unsigned char *)&(dbr[0].small_sectors))[0]=buffer[0x14];
330 1 ((unsigned char *)&(dbr[0].sectors_per_FAT16))[1]=buffer[0x16];
331 1 ((unsigned char *)&(dbr[0].sectors_per_FAT16))[0]=buffer[0x17];
332 1 ((unsigned char *)&(dbr[0].hidden_sectors))[3]=buffer[0x1C];
333 1 ((unsigned char *)&(dbr[0].hidden_sectors))[2]=buffer[0x1D];
334 1 ((unsigned char *)&(dbr[0].hidden_sectors))[1]=buffer[0x1E];
335 1 ((unsigned char *)&(dbr[0].hidden_sectors))[0]=buffer[0x1F];
336 1 ((unsigned char *)&(dbr[0].large_sectors))[3]=buffer[0x20];
337 1 ((unsigned char *)&(dbr[0].large_sectors))[2]=buffer[0x21];
338 1 ((unsigned char *)&(dbr[0].large_sectors))[1]=buffer[0x22];
339 1 ((unsigned char *)&(dbr[0].large_sectors))[0]=buffer[0x23];
340 1 DISK_CAPACITY[0]=buffer[0x23];
341 1 DISK_CAPACITY[1]=buffer[0x22];
342 1 DISK_CAPACITY[2]=buffer[0x21];
343 1 DISK_CAPACITY[3]=buffer[0x20];
344 1 ((unsigned char *)&(dbr[0].sectors_per_FAT32))[3]=buffer[0x24];
345 1 ((unsigned char *)&(dbr[0].sectors_per_FAT32))[2]=buffer[0x25];
346 1 ((unsigned char *)&(dbr[0].sectors_per_FAT32))[1]=buffer[0x26];
347 1 ((unsigned char *)&(dbr[0].sectors_per_FAT32))[0]=buffer[0x27];
348 1 ((unsigned char *)&(dbr[0].root_cluster_num))[3]=buffer[0x2C];
349 1 ((unsigned char *)&(dbr[0].root_cluster_num))[2]=buffer[0x2D];
350 1 ((unsigned char *)&(dbr[0].root_cluster_num))[1]=buffer[0x2E];
351 1 ((unsigned char *)&(dbr[0].root_cluster_num))[0]=buffer[0x2F];
352 1 if((buffer[510]!=0x55)||(buffer[511]!=0xAA))disk_error=2;
353 1 FAT_start_sector[0]=dpt[0].start_sector+dbr[0].reserve_sectors;
354 1 DATA_start_sector[0]=FAT_start_sector[0]+(dbr[0].num_of_FAT)*(dbr[0].sectors_per_FAT32);
355 1 LBA=DATA_start_sector[0];
356 1 driver_number=C_;
357 1 current_dir.first_cluster_number=dbr[0].root_cluster_num;
358 1 play_count=1;
359 1 item_count=1;
360 1 get_nst_item();
361 1 }
362 //////////////////////////////////////////////////////////////////////////////////////////////////////////
-//
363
364 /*void read_IDE_buffer(void)
C51 COMPILER V7.06 IDE 03/02/2006 23:11:50 PAGE 7
365 {
366 write_IDE_command(IDE_Read_Buffer);
367 }*/
368
369 /*void write_IDE_buffer(void)
370 {
371 write_IDE_command(IDE_Write_Buffer);
372 }*/
373
374 /*
375 void write_IDE_sector(unsigned long int LBA)
376 {
377 unsigned int i;
378 write_IDE_LBA(LBA);
379 write_IDE_sector_count(1);
380 write_IDE_command(IDE_Write_Sectors);
381 IDE_Address=IDE_Data;
382 set_IDE_address();
383 for(i=0;i<512;i++)
384 {
385 while(!IDE_IORDY);
386 IDE_DIOW=0;
387 IDE_DATA_L=buffer[i];
388 i++;
389 IDE_DATA_H=buffer[i];
390 IDE_DIOW=1;
391 }
392 wait_IDE_busy();
393 IDE_Address=IDE_Bus_Not_Use;
394 set_IDE_address();
395 }
396 */
397
398 ///////////////////////////////////////////// IDE 初始化 /////////////////////////////////////////
399 void IDE_initial(void)
400 {
401 1 unsigned char i;
402 1 reset_IDE();
403 1 for(i=2;i<200;i++)dir_name[i]=0x2020;
404 1 do
405 1 {
406 2 write_IDE_8(IDE_Drive_Head,0xE0);
407 2 read_IDE_status();
408 2 }while(IDE_BSY);
409 1 wait_IDE_busy();
410 1 write_IDE_8(IDE_Device_Control,0xFA);//没有中断模式
411 1 dir_name[0]='C'+0xA380;
412 1 ((unsigned char *)dir_name)[2]=':';
413 1 ((unsigned char *)dir_name)[3]='\\';
414 1 folder_length=4;
415 1 dir_length=folder_length;
416 1 not_root_dir=0;
417 1 get_IDE_information();
418 1 }
419 ///////////////////////////////////////////////////////////////////////////////////////////////////////
420
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1546 ----
CONSTANT SIZE = 11 ----
XDATA SIZE = 1204 ----
C51 COMPILER V7.06 IDE 03/02/2006 23:11:50 PAGE 8
PDATA SIZE = ---- ----
DATA SIZE = 17 16
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 + -