if (rr.x.cflag&1) {
printf("%u -",rr.h.ah);
End_of_Job(2);
}
}
/*-------------------------------------------------------------*/
/* Визначення абс.номера сектора початку лог.диска */
void Get_First(void) {
word s, t;
if (Fdisk<0x80) FirstSect=0;
else {
/* формування # сектора з фiзич. дисковоє адреси */
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;
}
}
/*-------------------------------------------------------------*/
/* Формування фiзичноє дисковоє адреси з # сектора */
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);
}
/*-------------------------------------------------------------*/
/* Пiдрахування номера сектора з номеру кластера */
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);
}
/*-------------------------------------------------------------*/
/* Вибiрка наступного кластера з 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=s&0x0fff;
}
if (s>0x0fef)
{
ssss = s;
return(0);
}
else
{
return(s);
}
}
else {
m=clust*2;
s=*(word *)(fat+m);
if (s>0xffef)
{
ssss = s;
return(0);
}
else return(s);
}
}
/*-------------------------------------------------------------*/
/* Видiлення наступного елемента з рядка-завдання */
char *Get_Name(char *s, char *d) {
/* s - рядок завдання, d - видiлений елемент, повертає
покажчик на новий початок рядка завдання. */
char *p,*r;
int i;
for(i=0;i<11;d[i++]=' ');
d[11]='\0';
if ((p=strchr(s,'\\'))==NULL) {
/* останнiй елемент рядка - iм`я файла */
/* перезапис iм`я */
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 {
/* наступний елемент - iм`я пiдкаталога */
*p='\0';
for(r=s,i=0; (i<11)&&*r; i++,r++) *(d+i)=*r;
return(p+1);
}
}
/*-------------------------------------------------------------*/
/* Пошук iменi у каталозi */
int Find_Name() {
int j;
/* cname - iм`я, яке знайдено; повертає iндекс знайденого
елемента у масивi dir або (-1) */
for (j=0; j<boot->SectSize/sizeof(struct Dir_Item); j++) {
if (dir[j].fname[0]=='\0') {
/* кiнець використаних елементiв каталога */
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) {
/* якщо iм`я збiгається, то:
- при пошуку файла елемент не повинен мати атрибутiв
"пiдкаталог" або "мiтка тому",
- при пошуку пiдкаталога елемент повинен мати атрибут
"пiдкаталог" */
if (jobptr==NULL)
if ( !(dir[j].attr&0x18) ) return(j);
else
if (dir[j].attr&0x10) return(j);
}
}
}
return(-1);
}
/*-------------------------------------------------------------*/
/* Завершння (при n=0-5 - аварiйне) */
void End_of_Job(int n) {
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.