home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CP/M
/
CPM_CDROM.iso
/
simtel
/
sigm
/
vols200
/
vol270
/
dpr.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1986-05-22
|
6KB
|
205 lines
{ DPR.PAS of JUGPDS Vol.11 by M. Miyao (No.78) }
program disk_parameter_read(input, output );
const
CR = $0D;
LF = $0A;
SRSDSK = 3;
type
hex2 = string[2];
hex4 = string[4];
var
ans : char;
diskno : integer;
function peek( adr : integer ) : byte;
begin peek := mem[adr]; end;
procedure poke( adr : integer; data : byte );
begin mem[adr] := data; end;
{
seldsk------> getdphadr(disk#)
|
XLTTBL n |
.--------. <-----' sector trans tavle
| XLTTBL | --. .--------.
:--------: '--> | 1 | dirbuf
| 0000 | | 7 | .------------------------------------.
:--------: | : | .->| 128 byte directory access buffer |
| 0000 | | : | | '------------------------------------'
:--------: | 22 | |
| 0000 | '--------' | .------------.
:--------: | .--->| sector(l) | DPBADR
| DIRBUF |---------------------' | '------------'
:--------: | :
| DPBADR |-------------------------' :
:--------: .---------. .------------.
| CSV n |-------------> | CSV n | | sector(h) |
:--------: | check | :------------:
| ALV n |--> .--------. | vectors | | offset(h) |
'--------' | ALV n | | | '------------'
|alloca- | '---------'
|tion |
|vectors |
'--------'
}
function getdphadr( dsk : integer ) : integer;
begin
getdphadr := bioshl( 8 {seldisk}, dsk );
end;
function getxltadr( dsk : integer ) : integer;
var
adr : integer;
begin
adr := getdphadr( dsk );
getxltadr := peek(adr) + peek(adr+1)*256;
end;
function getdpbadr( dsk : integer ) : integer;
var
adr : integer;
begin
adr := getdphadr( dsk );
getdpbadr := peek(adr+10) + peek(adr+11)*256;
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 dphtblprint(dsk : integer);
var
adr : integer;
data : integer;
begin
adr := getdphadr(dsk);
data := getxltadr(dsk);
if data = 0 then writeln(' No translation table')
else writeln( 'XLT table address = ',
hex4cnv(data));
writeln( 'Directory buffer address = ',
hex4cnv(peek(adr+8)+peek(adr+9)*256));
writeln( 'Disk Parameter Block address = ',
hex4cnv(peek(adr+10)+peek(adr+11)*256));
writeln( 'Check vector address = ',
hex4cnv(peek(adr+12)+peek(adr+13)*256));
writeln( 'Allocation vector address = ',
hex4cnv(peek(adr+14)+peek(adr+15)*256));
end;
procedure xlttblprint( dsk : integer );
var
adr : integer;
data : integer;
i : integer;
sectn : integer;
begin
adr := getxltadr( dsk );
if adr <> 0 then begin
write ('Sector read order : ');
sectn := peek(getdpbadr(dsk))+peek(getdpbadr(dsk)+1)*256;
for i := 0 to sectn-1 do
write( peek(getxltadr(dsk)+i),' ');
writeln;
end;
end;
procedure dpbtblprint( dsk : integer );
var
adr : integer;
spt, bsh, blm, exm, dsm, drm, al0, al1, cks, off : integer;
begin
adr := getdpbadr(dsk);
spt := peek(adr)+peek(adr+1)*256;
bsh := peek(adr+2);
blm := peek(adr+3);
exm := peek(adr+4);
dsm := peek(adr+5)+peek(adr+6)*256;
drm := peek(adr+7)+peek(adr+8)*256;
al0 := peek(adr+9);
al1 := peek(adr+10);
cks := peek(adr+11)+peek(adr+12)*256;
off := peek(adr+13)+peek(adr+14)*256;
writeln(' Sector per Track = ', hex4cnv( spt ), '/ ', spt );
writeln(' Block SHift = ', hex2cnv( bsh ), '/ ', bsh );
writeln(' BLock Mask = ', hex2cnv( blm ), '/ ', blm );
writeln(' EXtent Mask = ', hex2cnv( exm ), '/ ', exm );
writeln(' Disk Size Minus 1 = ', hex4cnv( dsm ), '/ ', dsm );
writeln(' DiRectory Minus 1 = ', hex4cnv( drm ), '/ ', drm );
writeln(' ALlocation 0 = ', hex2cnv( al0 ), '/ ', al0 );
writeln(' ALlocation 1 = ', hex2cnv( al1 ), '/ ', al1 );
writeln(' ChecK Size = ', hex4cnv( cks ), '/ ', cks );
writeln(' OFFset = ', hex4cnv( off ), '/ ', off );
end;
begin { MAIN program }
repeat
writeln('* DPR: Disk parameter Read *');
write('Disk drive name: A), B), C), D), E), or Q)uit?');
repeat
ans := char(bios(2){ conin function call});
write(ans);
until ((ans>='a')and(ans<='e'))
or((ans>='A')and(ans<='E'))
or(ans='q')or(ans='Q');
if (((ans>='a')and(ans<='e'))or((ans>='A')and(ans<='E'))) then begin
if (ans>='a')and(ans<='e') then diskno:=byte(ans)-byte('a')
else if (ans>='A')and(ans<='E') then diskno:=byte(ans)-byte('A');
writeln; writeln;
writeln( 'Disk Parameter Head Address = ',
hex4cnv(getdphadr(diskno)));
xlttblprint(diskno);
dphtblprint(diskno);
writeln( 'Disk Parameter Block address = ',
hex4cnv(getdpbadr(diskno)));
dpbtblprint(diskno);
writeln; writeln;
end;
until (ans = 'Q') or (ans = 'q');
diskno := getdphadr(SRSDSK);
end.