Hi Norman,

 This all depend on the debugger capabilities,
if you can watch changes at a sepecific location,
the easiest is just to watch InOutRes memory position.

  This will trigger a break in your program
exactly at the instruction which modifies the
InOutRes internal variable, which is
check troughout the RTL sources in lots of places.

  In the hope that this helps,

Pierre Muller


Le 01/04/2021 à 16:33, Norman Dunbar via fpc-pascal a écrit :
Good afternoon all,

I've been working on the Sinclair QL version of the FPC runtimes and
I've got quite a lot of progress made. Unfortunately, I've hit a problem
with the Append() function. This is my stripped down test file showing
the problem:
{ Program to demonstrate the Append function. }

Var f : text;

begin
    Assign (f,'ram1_test.txt');
    Append(f);
    { Fwrite(f, 'This is the second line of text'); }
    close (f);
end.

The Fwrite() call after Append() is commented out as it never gets that far.

The ram1_test.txt file already exists, and has a single line of text in
it. When I execute the compiled program I get a runtime error 103.

Looking at the RTL code, I see the following:


  From sysfile.inc

At the end of do_open() we have the file already open in the correct
mode (Q_OPEN -- confirmed with debugger) and this gets executed:

    { append mode }
    if ((Flags and $100)<>0) and
        (FileRec(F).Handle<>UnusedHandle) then begin
      do_seekend(filerec(f).handle);
      filerec(f).mode:=fmOutput; {fool fmappend}
    end;
end;


The call to do_seekend(), also in sysfile.inc, is this:

function do_seekend(handle: longint): longint;
begin
    do_seek(handle, -1);
    do_seekend := do_filepos(handle);
end;


And do_seek() is this:

procedure do_seek(handle, pos: longint);
var
    res: longint;
begin
    res := fs_posab(handle, pos);
    if res < 0 then
      Error2InOutRes(res);
end;

Finally, fs_posab() has been changed to the following, in qdos.inc:


function fs_posab(chan: Tchanid; new_pos: dword):longint; assembler;
nostackframe; public name '_fs_posab';
asm
    { D0 = chan, D1 = new_pos! }
    move.l d3,-(sp)
    move.l chan,a0
    move.l new_pos,d1
    moveq #_FS_POSAB,d0
    moveq #-1,d3
    trap #3
    { Test for EOF, else we get runtime errors }
    cmpi.l #ERR_EF,d0
    bne.s @noteof
@eof:
    { At EOF, we need to zero D0 to clear the error. }
    moveq #0,d0
    bra.s @done
@noteof:
    tst.l d0
    bne.s  @quit
@done:
    { D1 is the new file position, unless EOF. }
    move.l d1,d0
@quit:
    move.l (sp)+,d3
end;

I changed it as I had problems with D0 being set to _FS_POSAB ($42)
before A0 was set to the channel id, which was passed in D0 due to the
"register" calling convention. Once I figured that out, I reorganised
the code to that shown above to be sure that we didn't get an "invalid
channel" error back from the OS as we were from A0 being $42 instead of
an actual channel ID.

Another problem is that when requesting a new position which is after
the end of the file, you get the "EOF error" code back ($FFFFFFF6 or
-10) from the OS. This wasn't checked for in the original code, so
caused an error exit. The code above resolves that problem.

Unfortunately, now when I exit from fs_posab() and there are no errors
in D0, I'm still getting a runtime error 103 from the Append(F) call.
When the code was attempting to write to the file after the Append()
call, the second line of text was not written to the file as it barfs in
Append().

The OS is returning the correct error code, $FFFFFFF6 or -10, for the
seek to the end of file, and the code exits from fs_posab() with D0
cleared of any errors when the request is for a file position bigger
than the file size. On a QL, Close() doesn't return any errors, so it's
definitely not there.

I've traced the fs_posab() calls through a debugger on my QL, and the
code does as it should, it exits back to Pascal with no errors in D0 as
it should.

Any pointers to where I should be looking are gratefully received, thanks.


Cheers,
Norm.

_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Reply via email to