home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CP/M
/
CPM_CDROM.iso
/
simtel
/
sigm
/
vols200
/
vol270
/
dskdmp.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1986-05-22
|
7KB
|
232 lines
{ DSKDMP.PAS of JUGPDS Vol.11 by M. Miyao (No.78) }
program dskdmp(input,output);
const
maxdsknminus1 = 4;
maxtrknum = 40;
mintrknum = 0;
maxsecnum = 63;
minsecnum = 0;
errorcode = -1;
CR = $0D;
LF = $0A;
HOMEDISK = 3; { Turbo Pascal is on D/3 disk }
type
hex2 = string[2];
hex4 = string[4];
var i,error : integer;
ans,adrs : integer;
dskbuf : array[0..127] of byte;
chans : char;
incdec : ( inc, dec , noi );
trksec : ( track, sector, nos );
trk : 0..maxtrknum;
sec : 0..maxsecnum;
disk : 0..maxdsknminus1;
function peek( adr : integer ) : byte;
begin peek := mem[adr]; end;
procedure poke( adr : integer; data : byte );
begin mem[adr] := data; end;
function hex2cnv( i : integer ) : hex2;
var j,k : integer;
st : hex2;
ch : byte;
begin
st := '';
j := i;
for k:=1 to 2 do
begin
ch :=( j mod $10 );
if ch > 9 then ch := ch + byte('@')-9
else ch := ch + byte('0');
st := chr(ch) + st;
j:=j div $10;
end;
hex2cnv:=st;
end;
function hex4cnv( i : integer ): hex4;
begin
hex4cnv:=hex2cnv(hi(i))+hex2cnv(lo(i));
end;
procedure dump( sadd, line : integer; faddress : boolean );
var
address : integer;
hia, loa, j : byte;
stbuf : array[0..$f] of char;
begin
for hia:=0 to line-1 do
begin
if faddress then write( hex4cnv(sadd+hia*$10),' ');
for loa:= 0 to $F do
begin
address := sadd+hia*$10+loa;
write(hex2cnv(peek(address)),' ');
stbuf[loa] := chr(peek(address));
if (stbuf[loa] < ' ') or (stbuf[loa] > '~')
then stbuf[loa]:= '.' ;
end;
write(' ');
for j:=0 to $f do
write(stbuf[j]);
writeln;
end;
end;
function get1sect( disk, trk, sec : integer ) : integer;
var error : integer;
begin
if (trk<=maxtrknum) and (trk>=mintrknum)
and (sec<=maxsecnum) and (sec>=minsecnum)
and (disk<=maxdsknminus1) and (disk>=0) then
begin
error:=bioshl( 8 {seldsk}, disk );
bios( 9 {settrk}, trk );
bios( 10 {setsec}, sec );
bios( 11 {setdma}, addr( dskbuf ));
get1sect:= -( bios( 12 {read} ) and $00FF );
end
else get1sect:= errorcode;
end;
procedure memdump;
var i : integer;
begin
adrs:=0;
repeat
write('Start address (Hex) = ');
readln(adrs);
writeln;
write( ' ');
for i:= 0 to $F do write ( hex2cnv( i ), ' ');
writeln;
for i:= 0 to $E do write ( '-----');
writeln;
dump( adrs, 8, true );
adrs := adrs + $80;
until (adrs <= 0) and (adrs > $FF80) ;
end;
procedure dumpexec;
begin
error := get1sect(disk,trk,sec);
writeln;
if error <> errorcode then begin
writeln('Disk = ', char(disk + byte('A'))
, ' Track = ',trk, ' Sector = ',sec );
writeln;
for i:= 0 to $F do
write ( hex2cnv( i ), ' ');
writeln;
for i:= 0 to $10 do write ( '----');
writeln;
dump(addr(dskbuf),8,false);
case trksec of
track : case incdec of
inc : trk := trk + 1;
dec : trk := trk - 1;
end;
sector: case incdec of
inc : sec := sec + 1;
dec : sec := sec - 1;
end;
end;
end;
end;
procedure dskdump;
var
ansc : char;
i : integer;
begin
incdec := noi;
trksec := nos;
trk := 0;
sec := 0;
disk := 0;
repeat
writeln('Q)uit or R)andum, or ');
write( 'default Inc/Decrement is T)rack or S)ector ' );
ansc := char(bios(2)){ conin function call };
while not(( ansc = 'T' ) or ( ansc = 't' )
or ( ansc = 'S' ) or ( ansc = 's' )
or ( ansc = 'R' ) or ( ansc = 'r' )
or ( ansc = 'Q' ) or ( ansc = 'q' )
or ( ansc = char(CR)) or ( ansc = char(LF)) )
do ansc := char(bios(2)){ conin function call };
writeln ( char( ansc ));
case ansc of
'Q','q' : ;
else
case ansc of
'R','r': begin
writeln('Disk number A->0 ');
writeln(' B->1 ');
writeln(' C->2 ');
writeln(' D->3 ');
writeln(' E->4 ');
write (' Which disk select ? ');
readln ( disk );
if not((disk<0)or(disk>maxdsknminus1)) then begin
write( 'Track number = ');
readln ( trk );
write( 'Sector number = ');
readln ( sec );
end;
dumpexec;
end;
'T','t','S','s': begin
case ansc of
'T','t' : trksec := track;
'S','s' : trksec := sector;
end;
write( ' I)ncriment or D)ecriment ');
chans := char(bios(2)){ conin function call };
while not((chans='I')or(chans='i')or(chans='D')
or(chans='d')) do
chans := char(bios(2)){ conin function call };
writeln ( char( chans ));
case chans of
'I','i' : incdec := inc;
'D','d' : incdec := dec;
end;
end;
else dumpexec;
end;
end;
until (disk<0)or(disk>maxdsknminus1)or(ansc = 'Q')or(ansc='q')
end;
begin { main program }
writeln ( '** DSKDMP **');
write ( 'M)emory or D)isk dump?');
chans := char(bios(2));
while not((chans='M')or(chans='m')or(chans='D')
or(chans='d')) do chans := char(bios(2)){ conin function call };
writeln ( char( chans ));
case chans of
'M','m' : memdump;
'D','d' : dskdump;
end;
error:=bioshl( 8 {seldsk}, HOMEDISK );
end.