Найти

Методические указания по Организации ЭВМ и систем

Лабораторная работа 7.

{Лабораторная работа №7. Запись сектора в пустой кластер. Рбта защищена
на отлично 04.12.2004. Студент гр.22-6 Швацкий А.В. Забавно, что файл он не
сдал. Поэтому размещаю файл от студентки Шафрыгиной, совпадающий с работой
Швацкого символ в символ. В принципе файл не подписан,
так что получилась как бы анонимная рбта. Может ее сделали еще пару лет назад?

Напоминаю, что сдавать файлы и подписывать в них фамилию ОБЯЗАТЕЛЬНО! Данный
комментарий написан мной. Вероятно, я могу претендовать и на написание этой
АНОНИМНОЙ - не подписанной - программы...}

program Lab_7;
{$APPTYPE CONSOLE}
uses
  SysUtils;

const
  FAT12:array [1..5] of char = ('F','A','T','1','2');
type
  Fsector = record
    None0:array [1..13] of byte;
    sectorinrcluster:byte;
    Ressecs:word;
    None1:array [1..6] of byte;
    sectorinFAT:word;
    None2:array [1..30] of byte;
    FATn:array [1..5] of char;
    None3:array [1..453] of byte;
  end;

procedure writesect(n:byte;p:pointer; numsect,csect:word);
assembler;{Процедура для зап-и в сектор на указ-ом диске;
вход: n - номер диска;p-буфер для сектора ;numsect - номер сектора}
asm
    mov al,n
    mov cx,csect
    mov dx,numsect
    lds bx,p
    int 26h
    add sp,2
end;

procedure Readsect(n:byte;p:pointer; numsect,csect:word);
assembler;{Процедура для счит-я сектора на указ-ом диске;
вход: n - номер диска;p-буфер для сектора ;numsect - номер сектора}
asm
    mov al,n
    mov cx,csect
    mov dx,numsect
    lds bx,p
    int 25h
    add sp,2
end;

Function clustcount(n:byte):word;
assembler;{вход: n - номер диска; выход:clustcount - общее кол-во кластеров}
asm
  push ds
  mov ah,1ch
  mov dl,n
  int 21h
  pop ds
  mov ax,dx
end;

var
  M: array [1..6144] of byte;
  Nsect,N,l,countclust,indic:word;
  sectorRec:array [1..512] of byte;
  buf:pointer;
  Fsec:Fsector;
  c:char;
  numbdisk:byte;
begin
  randomize;
  for l:=1 to 512 do
    sectorRec[l]:=1;
  repeat
    writeln('Enter NGMD Disk [a,b]');
    readln(c);
  until (c='a') or (c='b');

  case c of
    'a' : numbdisk:=0;
    'b' : numbdisk:=1;
  end;

  buf:=@Fsec;
  Readsect(numbdisk,buf,0,1);

  if not(Fsec.Fatn = FAT12) then
    begin
      writeln('Программа работает только с FAT12');
      exit;
    end;
  countclust:=clustcount(numbdisk+1);
  buf:=@M;
  indic:=0;
  l:=0;
  Readsect(numbdisk,buf,Fsec.Ressecs,Fsec.sectorinFAT);
  buf:=@sectorRec;
  for N:= 1 to 6144 do
    begin
      if indic =2 then
        begin
          dec(N);
          indic:=0;
        end;
      if M[N]=0 then
        writesect(numbdisk,buf,L*Fsec.sectorinrcluster,Fsec.sectorinrcluster);
      if countclust-1 = l then
        break;
      inc(L);
      inc(N);
      inc(indic);
    end;
end.
Рейтинг SIMPLETOP.NET
Rambler's Top100 Powered byCeleron©
Бесплатный хостинг от EOMY.NET