djtechno
Neuling
programmierproglem
folgendes: hatte an meinem 150er pentioum pc vor 2 jahren die partitionstabbele gekiltl, heute hab ich mich dann mal ans wiederherstellen egsetzt
habe erst das programm scrhpart.pas geschrieben,das die platte sektorweise lesen soll und jeden sektor,der nach einem bootsektor aussieht mit zhylinder head sektor (fuer das von ahnd wieder eintragend er partition lesten soll.
(mir ist klar,das der suchstring falsch ist, habe versehentlich den der partitionstebelle drin, da kommt halt ein apssender fuer die bootsektoren von dos bzw unix und die erweiterte aprtition rein
problem ist aber, er li4est den ersten sektor, danns tuerzt der pc ab.
wo liegt der fehler
die geänderte gfassung seekpart.pas hat dassselbve problem
========= scrhpart.pas ===============
{$I-}
{$G+}
{$M 4096,512,1024}
program scrhpart;
{
INT 13 - DISK - READ SECTOR(S) INTO MEMORY
AH = 02h
AL = number of sectors to read (must be nonzero)
CH = low eight bits of cylinder number
CL = sector number 1-63 (bits 0-5)
high two bits of cylinder (bits 6-7, hard disk only)
DH = head number
DL = drive number (bit 7 set for hard disk)
ES:BX -> data buffer
Return: CF set on error
if AH = 11h (corrected ECC error), AL = burst length
CF clear if successful
AH = status (see #0140)
AL = number of sectors transferred
((20f-21f 0 "Ung�ltige partiti"))
}
uses dos;
const srchstring='Ung�ltige Partiti';
var mov:registers;sec:array[1..512] of char;sector,cyllow,cdat:byte;er:word;
procedure examine;
var counter:word;ste:string;
begin
counter:=$110;
ste:='';
repeat
ste:=ste+sec[counter];
until counter=$120;
if ste=srchstring then begin
write('found partition at sector: ');
write(sector);
write(' zhilinder: ');
write(cyllow+64*cdat);
write(' kopf: ');
write(mov.dx div 256);
writeln(' gefunden!');
end;
end;
begin
writeln('suche bootsektoren (ms-dos/windows 95)');
mov.cx:=0;
mov.dx:=$80;
sector:=0;
cyllow:=0;
cdat:=0;
repeat
repeat
er:=mov.dx;
mov.es:=seg(sec);
mov.bx:=ofs(sec);
mov.ax:=$201;
intr($13,mov);
examine;
sector:=(sector+1) mod 64;
if sector=0 then cyllow:=cyllow+1;
if cyllow=0 then if sector=0 then cdat:=(cdat+1) mod 4;
mov.cx:=sector+256*cyllow+64*cdat;
if cyllow=0 then if sector=0 then if cdat=0 then er:=er+256;
mov.dx:=er;
if port[$60]=1 then halt;
until mov.cx=$FFFF;
until mov.dx=$FF80;
writeln('suchungsvorgang ist beendet.');
end.
============== seekpart.pas =======================
{$I-}
{$G+}
{$M 4096,512,1024}
program seekpart;
{
INT 13 - DISK - READ SECTOR(S) INTO MEMORY
AH = 02h
AL = number of sectors to read (must be nonzero)
CH = low eight bits of cylinder number
CL = sector number 1-63 (bits 0-5)
high two bits of cylinder (bits 6-7, hard disk only)
DH = head number
DL = drive number (bit 7 set for hard disk)
ES:BX -> data buffer
Return: CF set on error
if AH = 11h (corrected ECC error), AL = burst length
CF clear if successful
AH = status (see #0140)
AL = number of sectors transferred
((20f-21f 0 "Ung�ltige partiti"))
}
uses dos;
const srchstring='Ung�ltige Partiti';
var mov:registers;sec:string absolute $9000:$0;sector,cyllow,cdat:byte;er:word;
procedure examine;
var counter:word;ste:string;
begin
counter:=$110;
ste:='';
repeat
ste:=ste+sec[counter];
until counter=$120;
if ste=srchstring then begin
write('found partition at sector: ');
write(sector);
write(' zhilinder: ');
write(cyllow+64*cdat);
write(' kopf: ');
write(mov.dx div 256);
writeln(' gefunden!');
end;
end;
begin
writeln('suche bootsektoren (ms-dos/windows 95)');
mov.cx:=0;
mov.dx:=$80;
sector:=1;
cyllow:=0;
cdat:=0;
repeat
repeat
er:=mov.dx;
mov.es:=$9000;
mov.bx:=$0;
mov.ax:=$201;
intr($13,mov);
if paramstr(1)='/debug' then write('.');
examine;
sector:=(sector+1) mod 64;
if sector=0 then cyllow:=cyllow+1;
if cyllow=0 then if sector=0 then cdat:=(cdat+1) mod 4;
mov.cx:=sector+256*cyllow+64*cdat;
if cyllow=0 then if sector=0 then if cdat=0 then er:=er+256;
mov.dx:=er;
if sector=0 then sector:=1;
if port[$60]=1 then halt;
until mov.cx=$FFFF;
until mov.dx=$FF80;
writeln('suchungsvorgang ist beendet.');
end.
==========================================
marcus
folgendes: hatte an meinem 150er pentioum pc vor 2 jahren die partitionstabbele gekiltl, heute hab ich mich dann mal ans wiederherstellen egsetzt
habe erst das programm scrhpart.pas geschrieben,das die platte sektorweise lesen soll und jeden sektor,der nach einem bootsektor aussieht mit zhylinder head sektor (fuer das von ahnd wieder eintragend er partition lesten soll.
(mir ist klar,das der suchstring falsch ist, habe versehentlich den der partitionstebelle drin, da kommt halt ein apssender fuer die bootsektoren von dos bzw unix und die erweiterte aprtition rein
problem ist aber, er li4est den ersten sektor, danns tuerzt der pc ab.
wo liegt der fehler
die geänderte gfassung seekpart.pas hat dassselbve problem
========= scrhpart.pas ===============
{$I-}
{$G+}
{$M 4096,512,1024}
program scrhpart;
{
INT 13 - DISK - READ SECTOR(S) INTO MEMORY
AH = 02h
AL = number of sectors to read (must be nonzero)
CH = low eight bits of cylinder number
CL = sector number 1-63 (bits 0-5)
high two bits of cylinder (bits 6-7, hard disk only)
DH = head number
DL = drive number (bit 7 set for hard disk)
ES:BX -> data buffer
Return: CF set on error
if AH = 11h (corrected ECC error), AL = burst length
CF clear if successful
AH = status (see #0140)
AL = number of sectors transferred
((20f-21f 0 "Ung�ltige partiti"))
}
uses dos;
const srchstring='Ung�ltige Partiti';
var mov:registers;sec:array[1..512] of char;sector,cyllow,cdat:byte;er:word;
procedure examine;
var counter:word;ste:string;
begin
counter:=$110;
ste:='';
repeat
ste:=ste+sec[counter];
until counter=$120;
if ste=srchstring then begin
write('found partition at sector: ');
write(sector);
write(' zhilinder: ');
write(cyllow+64*cdat);
write(' kopf: ');
write(mov.dx div 256);
writeln(' gefunden!');
end;
end;
begin
writeln('suche bootsektoren (ms-dos/windows 95)');
mov.cx:=0;
mov.dx:=$80;
sector:=0;
cyllow:=0;
cdat:=0;
repeat
repeat
er:=mov.dx;
mov.es:=seg(sec);
mov.bx:=ofs(sec);
mov.ax:=$201;
intr($13,mov);
examine;
sector:=(sector+1) mod 64;
if sector=0 then cyllow:=cyllow+1;
if cyllow=0 then if sector=0 then cdat:=(cdat+1) mod 4;
mov.cx:=sector+256*cyllow+64*cdat;
if cyllow=0 then if sector=0 then if cdat=0 then er:=er+256;
mov.dx:=er;
if port[$60]=1 then halt;
until mov.cx=$FFFF;
until mov.dx=$FF80;
writeln('suchungsvorgang ist beendet.');
end.
============== seekpart.pas =======================
{$I-}
{$G+}
{$M 4096,512,1024}
program seekpart;
{
INT 13 - DISK - READ SECTOR(S) INTO MEMORY
AH = 02h
AL = number of sectors to read (must be nonzero)
CH = low eight bits of cylinder number
CL = sector number 1-63 (bits 0-5)
high two bits of cylinder (bits 6-7, hard disk only)
DH = head number
DL = drive number (bit 7 set for hard disk)
ES:BX -> data buffer
Return: CF set on error
if AH = 11h (corrected ECC error), AL = burst length
CF clear if successful
AH = status (see #0140)
AL = number of sectors transferred
((20f-21f 0 "Ung�ltige partiti"))
}
uses dos;
const srchstring='Ung�ltige Partiti';
var mov:registers;sec:string absolute $9000:$0;sector,cyllow,cdat:byte;er:word;
procedure examine;
var counter:word;ste:string;
begin
counter:=$110;
ste:='';
repeat
ste:=ste+sec[counter];
until counter=$120;
if ste=srchstring then begin
write('found partition at sector: ');
write(sector);
write(' zhilinder: ');
write(cyllow+64*cdat);
write(' kopf: ');
write(mov.dx div 256);
writeln(' gefunden!');
end;
end;
begin
writeln('suche bootsektoren (ms-dos/windows 95)');
mov.cx:=0;
mov.dx:=$80;
sector:=1;
cyllow:=0;
cdat:=0;
repeat
repeat
er:=mov.dx;
mov.es:=$9000;
mov.bx:=$0;
mov.ax:=$201;
intr($13,mov);
if paramstr(1)='/debug' then write('.');
examine;
sector:=(sector+1) mod 64;
if sector=0 then cyllow:=cyllow+1;
if cyllow=0 then if sector=0 then cdat:=(cdat+1) mod 4;
mov.cx:=sector+256*cyllow+64*cdat;
if cyllow=0 then if sector=0 then if cdat=0 then er:=er+256;
mov.dx:=er;
if sector=0 then sector:=1;
if port[$60]=1 then halt;
until mov.cx=$FFFF;
until mov.dx=$FF80;
writeln('suchungsvorgang ist beendet.');
end.
==========================================
marcus
Zuletzt bearbeitet: