|
@@ -22,6 +22,12 @@
|
|
opennames : array [0..max_files-1] of pchar;
|
|
opennames : array [0..max_files-1] of pchar;
|
|
const
|
|
const
|
|
free_closed_names : boolean = true;
|
|
free_closed_names : boolean = true;
|
|
|
|
+ verbose_files : boolean = true;
|
|
|
|
+
|
|
|
|
+ { we cannot allocate memory using SysGetMem, as we use tinyheap code,
|
|
|
|
+ but tinyheap.inc source in inserted later, so we need a forward declaration }
|
|
|
|
+ function SysTinyFreeMemSize(Addr: Pointer; Size: Ptruint): ptruint; forward;
|
|
|
|
+ function SysTinyGetMem(Size: ptruint): pointer; forward;
|
|
{$endif SYSTEMDEBUG}
|
|
{$endif SYSTEMDEBUG}
|
|
|
|
|
|
|
|
|
|
@@ -38,19 +44,30 @@ begin
|
|
regs.BX:=handle;
|
|
regs.BX:=handle;
|
|
if handle<max_files then
|
|
if handle<max_files then
|
|
begin
|
|
begin
|
|
- openfiles[handle]:=false;
|
|
|
|
{$ifdef SYSTEMDEBUG}
|
|
{$ifdef SYSTEMDEBUG}
|
|
|
|
+ if not openfiles[handle] then
|
|
|
|
+ Writeln(stderr,'Trying to close file h=',handle,' marked as closed');
|
|
if assigned(opennames[handle]) and free_closed_names then
|
|
if assigned(opennames[handle]) and free_closed_names then
|
|
begin
|
|
begin
|
|
- sysfreememsize(opennames[handle],strlen(opennames[handle])+1);
|
|
|
|
|
|
+ if verbose_files then
|
|
|
|
+ Writeln(stderr,'file ',opennames[handle],' closed');
|
|
|
|
+
|
|
|
|
+ systinyfreememsize(opennames[handle],strlen(opennames[handle])+1);
|
|
opennames[handle]:=nil;
|
|
opennames[handle]:=nil;
|
|
end;
|
|
end;
|
|
{$endif SYSTEMDEBUG}
|
|
{$endif SYSTEMDEBUG}
|
|
|
|
+ openfiles[handle]:=false;
|
|
end;
|
|
end;
|
|
regs.AX:=$3e00;
|
|
regs.AX:=$3e00;
|
|
MsDos(regs);
|
|
MsDos(regs);
|
|
if (regs.Flags and fCarry) <> 0 then
|
|
if (regs.Flags and fCarry) <> 0 then
|
|
- GetInOutRes(regs.AX);
|
|
|
|
|
|
+ begin
|
|
|
|
+ GetInOutRes(regs.AX);
|
|
|
|
+{$ifdef SYSTEMDEBUG}
|
|
|
|
+ if verbose_files then
|
|
|
|
+ Writeln(stderr,'file close failed AX= ',regs.AX);
|
|
|
|
+{$endif SYSTEMDEBUG}
|
|
|
|
+ end;
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
@@ -63,9 +80,11 @@ begin
|
|
DoDirSeparators(p,pchangeable);
|
|
DoDirSeparators(p,pchangeable);
|
|
regs.DX:=Ofs(p^);
|
|
regs.DX:=Ofs(p^);
|
|
regs.DS:=Seg(p^);
|
|
regs.DS:=Seg(p^);
|
|
|
|
+{$ifndef RTLLITE}
|
|
if LFNSupport then
|
|
if LFNSupport then
|
|
regs.AX:=$7141
|
|
regs.AX:=$7141
|
|
else
|
|
else
|
|
|
|
+{$endif ndef RTLLITE}
|
|
regs.AX:=$4100;
|
|
regs.AX:=$4100;
|
|
regs.SI:=0;
|
|
regs.SI:=0;
|
|
regs.CX:=0;
|
|
regs.CX:=0;
|
|
@@ -90,9 +109,11 @@ begin
|
|
regs.DX:=Ofs(p1^);
|
|
regs.DX:=Ofs(p1^);
|
|
regs.ES:=Seg(p2^);
|
|
regs.ES:=Seg(p2^);
|
|
regs.DI:=Ofs(p2^);
|
|
regs.DI:=Ofs(p2^);
|
|
|
|
+{$ifndef RTLLITE}
|
|
if LFNSupport then
|
|
if LFNSupport then
|
|
regs.AX:=$7156
|
|
regs.AX:=$7156
|
|
else
|
|
else
|
|
|
|
+{$endif ndef RTLLITE}
|
|
regs.AX:=$5600;
|
|
regs.AX:=$5600;
|
|
regs.CX:=$ff; { attribute problem here ! }
|
|
regs.CX:=$ff; { attribute problem here ! }
|
|
MsDos(regs);
|
|
MsDos(regs);
|
|
@@ -253,6 +274,10 @@ var
|
|
action : word;
|
|
action : word;
|
|
oldp : pchar;
|
|
oldp : pchar;
|
|
begin
|
|
begin
|
|
|
|
+{$ifdef SYSTEMDEBUG}
|
|
|
|
+ if verbose_files then
|
|
|
|
+ Writeln(stderr,'do_open for file "',p,'" called');
|
|
|
|
+{$endif SYSTEMDEBUG}
|
|
{ close first if opened }
|
|
{ close first if opened }
|
|
if ((flags and $10000)=0) then
|
|
if ((flags and $10000)=0) then
|
|
begin
|
|
begin
|
|
@@ -348,6 +373,10 @@ begin
|
|
GetInOutRes(regs.AX);
|
|
GetInOutRes(regs.AX);
|
|
if oldp<>p then
|
|
if oldp<>p then
|
|
freemem(p);
|
|
freemem(p);
|
|
|
|
+{$ifdef SYSTEMDEBUG}
|
|
|
|
+ if verbose_files then
|
|
|
|
+ Writeln(stderr,'MSDOS INT open for file "',p,'" failed err=',regs.AX);
|
|
|
|
+{$endif SYSTEMDEBUG}
|
|
exit;
|
|
exit;
|
|
end
|
|
end
|
|
else
|
|
else
|
|
@@ -359,6 +388,10 @@ begin
|
|
FileHandleCount:=regs.AX;
|
|
FileHandleCount:=regs.AX;
|
|
{$endif RTLLITE}
|
|
{$endif RTLLITE}
|
|
end;
|
|
end;
|
|
|
|
+{$ifdef SYSTEMDEBUG}
|
|
|
|
+ if verbose_files then
|
|
|
|
+ Writeln(stderr,'MSDOS INT open for file "',p,'" returned ',regs.AX);
|
|
|
|
+{$endif SYSTEMDEBUG}
|
|
if regs.AX<max_files then
|
|
if regs.AX<max_files then
|
|
begin
|
|
begin
|
|
{$ifdef SYSTEMDEBUG}
|
|
{$ifdef SYSTEMDEBUG}
|
|
@@ -366,13 +399,15 @@ begin
|
|
assigned(opennames[regs.AX]) then
|
|
assigned(opennames[regs.AX]) then
|
|
begin
|
|
begin
|
|
Writeln(stderr,'file ',opennames[regs.AX],'(',regs.AX,') not closed but handle reused!');
|
|
Writeln(stderr,'file ',opennames[regs.AX],'(',regs.AX,') not closed but handle reused!');
|
|
- sysfreememsize(opennames[regs.AX],strlen(opennames[regs.AX])+1);
|
|
|
|
|
|
+ systinyfreememsize(opennames[regs.AX],strlen(opennames[regs.AX])+1);
|
|
end;
|
|
end;
|
|
{$endif SYSTEMDEBUG}
|
|
{$endif SYSTEMDEBUG}
|
|
openfiles[regs.AX]:=true;
|
|
openfiles[regs.AX]:=true;
|
|
{$ifdef SYSTEMDEBUG}
|
|
{$ifdef SYSTEMDEBUG}
|
|
- opennames[regs.AX] := sysgetmem(strlen(p)+1);
|
|
|
|
|
|
+ opennames[regs.AX] := systinygetmem(strlen(p)+1);
|
|
move(p^,opennames[regs.AX]^,strlen(p)+1);
|
|
move(p^,opennames[regs.AX]^,strlen(p)+1);
|
|
|
|
+ if verbose_files then
|
|
|
|
+ Writeln(stderr,'file ',opennames[regs.AX],' opened');
|
|
{$endif SYSTEMDEBUG}
|
|
{$endif SYSTEMDEBUG}
|
|
end;
|
|
end;
|
|
{ append mode }
|
|
{ append mode }
|