home *** CD-ROM | disk | FTP | other *** search
- { 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.
-
-