My DMAP program works as expected on Pascal MT+ for cp/m 2.2 but ported across to 68k, changing it from Word parameters to Pointer parameters, then the bdos search first and search next fails, but set user and get user work fine.
My FCB is pre-filled with ? before the bdos search call and doesn't seem to get over-ridden with real data.
It could be my error, but I believe I have accurately followed the doc although it contains a lot of typo errors, and one of those may actually be significant.
If you have any inspiration, I'd love to hear.
Program DMAP;
Const
SETUSR = 032;
GETUSR = 032;
SEAR = 017;
SEARN = 018;
Type
ptr = ^integer;
(* fcb length = 36 *)
search_fcb =
RECORD
drive : char;end;
name : array[1..8] of char;
ext : array [1..3] of char;
extnt : char;
s1,s2 : char;
record_count : char;
blocks : array[1..16] of char;
current_record : char;
R0,R1,R2 : CHAR;
END;
Var
i,j, number : integer;
Dsk : integer;
ch : char;
usercount : array[0..15] of integer;
fcb : search_fcb;
user : integer;
saved_user : integer;
retcode : Integer;
parm : word;
k: integer;
EXTERNAL FUNCTION _BDOS(i:integer;p:ptr): INTEGER;
FUNCTION CONINP:CHAR;
begin
end;
FUNCTION rdstat:boolean;
begin
end;
procedure write3(i:integer);
var
num3: array[1..3] of char;
j,k,l,m : integer;
ch: char;
flag: boolean;
begin
flag := false;
k:=i;
(* write(' '); *)
for j := 3 downto 1 do
begin
l := k MOD 10;
num3[j] := chr(l+48);
k := k DIV 10;
end;
for j:= 1 to 3 do
begin
if num3[j] > '0' then flag := true;
if ((num3[j] = '0') and (flag = false)) then num3[j] := ' ';
end;
write(num3);
write(' ');
end;
(* Main Program *)
BEGIN
k:= 255;
saved_user := _BDOS(GETUSR,ADDR(k));
writeln('Saved User is: ', saved_user);
writeln('DMAP - A program written in Pascal/MT+ (CP/M-68K)to show file count on each user/drive');
(*writeln('Press ESC or CTL-C to quit');*)
write('USR> ');
for i := 0 to 15 do
begin
CASE i OF
00 : WRITE(' 00');
01 : WRITE(' 01');
02 : WRITE(' 02');
03 : WRITE(' 03');
04 : WRITE(' 04');
05 : WRITE(' 05');
06 : WRITE(' 06');
07 : WRITE(' 07');
08 : WRITE(' 08');
09 : WRITE(' 09');
10 : WRITE(' 10');
11 : WRITE(' 11');
12 : WRITE(' 12');
13 : WRITE(' 13');
14 : WRITE(' 14');
15 : WRITE(' 15');
end;
write(' ');
end;
writeln;
for Dsk := 1 to 16 do (* Loop through Drives (0 would be default drive) *)
begin
for User := 0 TO 15 do (* Loop through Users *)
begin
retcode := _BDOS(SETUSR,ADDR(User));
number := 0;
end;
fcb.drive := chr(Dsk);
fcb.name := '????????';
fcb.ext := '???';
retcode := _BDOS(SEAR,ADDR(FCB));
writeln('search first on dsk', Dsk,'retcode: ', retcode, 'user ',user);
while (retcode <> 255) do
begin
number := number + 1;
retcode := _BDOS(SEARN,ADDR(FCB));
writeln('search next on dsk', Dsk,'retcode: ', retcode, 'user ',user);
end;
usercount[User] := number;
end; (* end loop users *)
write(' ',chr(ord('@') + Dsk),':> ');
for i := 0 to 15 do
begin
j := usercount[i];
if j <> 0 then write3(usercount[i])
else write(' ');
end;
writeln;
end; (* end loop Drive *)
(*writeln('saved_user value: ',saved_user);*)
retcode := _BDOS(SETUSR,ADDR(Saved_User));
end. (*dmap *)