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