Системное программное обеспечение персональных ЭВМ


Пример 9 - часть 3


дискового адреса */ t=(part.Begin_SecTrk>>8)|((part.Begin_SecTrk<<2)&0x300); s=part.Begin_SecTrk&0x3f; FirstSect=(((dword)t*boot->HeadCnt)+part.Begin_Hd)* boot->TrkSecs+s-1; } } /*--------------------------------------------------------*/ /* формирование физического дискового адреса из # сектора */ void Sect_to_Daddr(dword sect) { /* sect - номер сектора, caddr - адрес на диске */ dword s; if (Fdisk>=0x80) sect+=FirstSect; caddr.s=sect%boot->TrkSecs+1; s=sect/boot->TrkSecs; caddr.h=s%boot->HeadCnt; caddr.t=s/boot->HeadCnt; caddr.ts=(caddr.t<<8)|caddr.s|((caddr.t&0x300)>>2); } /*----------------------------------------------*/ /* вычисление номера сектора по номеру кластера */ dword Clust_to_Sect(word clust) { /* clust - номер кластера, возвращает номер сектора */ dword ds, s; ds=boot->ResSect+boot->FatSize*boot->FatCnt+ boot->RootSize*32/boot->SectSize; s=ds+(clust-2)*boot->ClustSize; return(s); } /*------------------------------------*/ /* выборка следующего кластера по FAT */ word Next_Clust(word clust) { /* clust - номер кластера, возвращает номер след.кластера или 0 - если следующего нет */ word m, s; if (rootdir) return(0); if (!fat16) { m=(clust*3)/2; s=*(word *)(fat+m); if(clust%2) /* нечетный элемент */ s>>=4; else /* четный элемент */ s=*s1&0x0fff; if (s>0x0fef) return(0); else return(s); } else { m=clust*2; s=*(word *)(fat+m); if (s>0xffef) return(0); else return(s); } } /*-------------------------------------------------*/ /* выделение очередного элемента из строки-задания */ char *Get_Name(char *s, char *d) { /* s - строка задания, d - выделенный элемент, возвращает указатель на новое начало строки задания. */ char *p,*r; int i; for(i=0;i<11;d[i++]=' '); d[11]='\0'; if ((p=strchr(s,'\\'))==NULL) { /* последний элемент строки - имя файла */ /* перезапись имени */ for(r=s,i=0; (i<8)&&*r&&(*r!='.'); i++,r++) *(d+i)=*r; /* перезапись расширения */ if (*r) for(i=0,r++; (i<3)&&*r; i++,r++) *(d+8+i)=*r; return(NULL); } else { /* очередной элемент - имя подкаталога */ *p='\0'; for(r=s,i=0; (i<11)&&*r; i++,r++) *(d+i)=*r; return(p+1); } } /*------------------------*/ /* поиск имени в каталоге */ int Find_Name() {__ _.int j; /* cname - искомое имя, возвращает индекс найденного элемента в массиве dir или (-1) */ for (j=0; j<boot->SectSize/sizeof(struct Dir_Item); j++) { if (dir[j].fname[0]=='\0') { /* конец использованных элементов каталога */ printf("%s -",cname); if (jobptr==NULL) End_of_Job(4); else End_of_Job(5); } if ((byte)dir[j].fname[0]!=0xe5) { if (memcmp(dir[j].fname,cname,11)==0) { /* если имя совпало, то: - при поиске файла элемент не должен иметь атрибутов "подкаталог" или "метка тома", - при поиске подкаталога элемент должен иметь атрибут "подкаталог" */ if (jobptr==NULL) { if ( !(dir[j].attr&0x18) ) return(j); } else if (dir[j].attr&0x10) return(j); } } } return(-1); } /*------------------------------------*/ /* завершение (при n=0-5 - аварийное) */ void End_of_Job(int n) { /* n - номер сообщения */ char *msg[] = { "неправильный идентификатор диска", "лог.диск отсутствует", "ошибка чтения", "нехватка памяти", "подкаталог не найден", "файл не найден", "непредусмотренный конец файла", "======== КОНЕЦ ФАЙЛА =======" }; /* освобождение памяти */ if (fatalloc) free(fat); /* выдача сообщения */ printf(" %s\nНажмите любую клавишу...\n\7",msg[n]); getch(); /* завершение программы */ exit(0); }




- Начало -  - Назад -  - Вперед -