Program direct reading diskette

Delphi & Pascal (česká wiki)
Přejít na: navigace, hledání
Category: Source in Pascal

Program: Diskread.pas
File exe: Diskread.exe

Don't be frightened when the red control of the disk mechanism lightsup immediately after the program is running. This only means that the program reads the disk physically. What is the use of it? Since DOS 3.0, each disk includes a sector which the system does not use in order to maintain the compatibility. You must understand that the majority of the installation programs record the information to this sector, thus producing the floppy disk which can't be copied. You may use it either as a hacker program or as a part of your own installation disks.
{ DISKREAD.PAS              Copyright (c) TrSek alias Zdeno Sekerak }
{ Fyzicky cita disketu a nasledne zobrazuje jej obsah.              }
{ Sipkami a klavesami PgUp, PgDn sa da zmenit stopa/sektor/hlava    }
{                                                                   }
{ Datum:24.07.1997                             http://www.trsek.com }
 
program fyzicke_citanie_disku;
 
uses crt,dos;
const poc=1;
      dlz=512;
      hex:array[0..15] of char=
      ('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F');
 
var reg:registers;
    x,y,i,za,st,hl:integer;
    ch:char;
    s:string;
    ako,auto:boolean;
    text:array[0..poc*dlz] of byte;
 
procedure farba(f,g:integer);
begin
 textbackground(f);
 textcolor(g);
 lowvideo;
end;
 
procedure hexa(p:integer);
begin
  clrscr;
  writeln('stav operacie:',reg.ah,' pocet nacitanych sektorov:',reg.al,' sektor:',za,' stopa:',st,' hlava:',hl);
  for i:=1 to 8 do write('ÄÄÄÄ5ÄÄÄÄ0');
  for x:=0 to 25 do
   for y:=0 to 20 do begin
     gotoxy(x+1,y+3);
     i:=x+y*26;
     if p=i then farba(white,black);
     if ord(text[i])>31 then write(chr(text[i]))
                        else write('.');
     gotoxy(29+x*2,y+3);
     if (i/2)=int(i/2) then farba(black,white)
                       else farba(white,black);
     write(hex[text[i] div 16],hex[text[i] mod 16]);
     farba(black,white);
     if (x+y*26)=511 then begin gotoxy(x,y+3);write('°');end;
     end;
  for i:=1 to 8 do write('ÄÄÄÄ5ÄÄÄÄ0');
  write('Zmena sektoru: ',+chr(26)+''+chr(27)+'  Zmena stopy: '+chr(24)+''+chr(25)+'  Zmena vypisu: F3   Ukoncit: ESC ');
end;
 
procedure norm(p:integer);
begin
  clrscr;
  writeln('stav operacie:',reg.ah,' pocet nacitanych sektorov:',reg.al,' sektor:',za,' stopa:',st,' hlava:',hl);
  for i:=1 to 8 do write('ÄÄÄÄ5ÄÄÄÄ0');
  for x:=0 to poc*dlz-1 do begin
     if p=x then farba(white,black);
     if ord(text[x])>31 then write(chr(text[x]))
                        else write('.');
     if p=x then farba(black,white);
     end;
  write('Ű');
  writeln;
  for i:=1 to 8 do write('ÄÄÄÄ5ÄÄÄÄ0');
  write('Zmena sektoru: ',+chr(26)+''+chr(27)+'  stopy: '+chr(24)+''+chr(25)+
        '  hlavy: F4  vypisu: F3   Ukoncit: ESC ');
end;
 
procedure citaj;
begin
  for x:=0 to poc*dlz do text[x]:=176;
  reg.ah:=$0;
  reg.dl:=$0;
  intr($13,reg);
 
  reg.ah:=2;
  reg.al:=poc;           {pocet sektorov  1}
  reg.cl:=za;            {cislo pociatku sektorov  1}
  reg.ch:=st;            {cislo stopy  0}
  reg.dh:=hl;            {cislo hlavicky  0}
  reg.dl:=0;             {cislo disku  0}
  reg.es:=seg(text);     {adresa pameti}
  reg.bx:=ofs(text);
  intr($13,reg);
end;
 
function pos(s:string):integer;
var i,ip:integer;
    z:string;
begin
 for i:=0 to poc*dlz-length(s)+1 do
   if chr(text[i])=s[1] then begin z:='';
       for ip:=0 to length(s)-1 do z:=z+chr(text[i+ip]);
       if z=s then begin pos:=i;exit;end;
       end;
 pos:=0;
end;
 
begin
 clrscr;za:=1;st:=0;ako:=true;hl:=0;auto:=false;
 repeat
 citaj;
 if auto then begin
         repeat
          za:=za+1;
          citaj;
          if (reg.al=0) and (za=1) then begin hl:=hl+1;st:=0;za:=0;reg.al:=1;end;
          if reg.al=0 then begin za:=0;st:=st+1;end;
          farba(black,white);
          gotoxy(1,4);write('Stopa:',za,' sektor:',st,' hlava:',hl,'  ');
          i:=pos(s);
          if i>0 then begin
                      if ako then norm(i)
                             else hexa(i);
                      repeat until (readkey in [#13,#27]);
                      clrscr;end;
         until ((hl>=2) or keypressed);
         ch:=readkey;ch:=chr(65);
         auto:=false;end;
  if ako then norm(-1)
         else hexa(-1);
  repeat
  ch:=readkey;
  if ch=#13 then begin
     clrscr;gotoxy(1,3);write('Sektor:');read(za);
     clrscr;gotoxy(1,3);write('Stopa :');read(st);
     clrscr;gotoxy(1,3);write('Hlava :');read(hl);
     clrscr;end;
  if ch=#0 then begin
   ch:=readkey;
   if ch=#72 then za:=za-1;
   if ch=#80 then za:=za+1;
   if ch=#75 then st:=st-1;
   if ch=#77 then st:=st+1;
   if ch=#62 then hl:=hl+1;
   if ch=#65 then begin
     clrscr;gotoxy(1,3);write('Retazec:');readln(s);
     auto:=true;end;
   if ch=#61 then begin ako:=not(ako);
               if ako then norm(-1)
                      else hexa(-1);
               end;
   if hl>1 then hl:=0;
   if za<1 then za:=1;
   if st<0 then st:=0;
   end;
   until (ch in [#13,#27,#72,#80,#75,#77,#62,#65]);
 until (ch in [#27]);
end.