* only clear DS and ES instead of fillchar-ing the whole Registers record in

various places in the win16 rtl where int 21h is called

git-svn-id: trunk@31871 -
This commit is contained in:
nickysn 2015-09-27 23:52:33 +00:00
parent eaf719a623
commit 2f32a7b718
3 changed files with 22 additions and 14 deletions

View File

@ -35,7 +35,7 @@ var
begin
if Handle<=4 then
exit;
FillChar(regs,SizeOf(regs),0);
ZeroSegRegs(regs);
regs.BX:=handle;
if handle<max_files then
begin
@ -62,7 +62,7 @@ var
begin
oldp:=p;
DoDirSeparators(p,pchangeable);
FillChar(regs,SizeOf(regs),0);
ZeroSegRegs(regs);
regs.DX:=Ofs(p^);
regs.DS:=Seg(p^);
if LFNSupport then
@ -88,7 +88,7 @@ begin
oldp2:=p2;
DoDirSeparators(p1,p1changeable);
DoDirSeparators(p2,p2changeable);
FillChar(regs,SizeOf(regs),0);
ZeroSegRegs(regs);
regs.DS:=Seg(p1^);
regs.DX:=Ofs(p1^);
regs.ES:=Seg(p2^);
@ -112,7 +112,7 @@ function do_write(h:thandle;addr:pointer;len : longint) : longint;
var
regs: Registers;
begin
FillChar(regs,SizeOf(regs),0);
ZeroSegRegs(regs);
regs.AH := $40;
regs.BX := h;
regs.CX := len;
@ -132,7 +132,7 @@ function do_read(h:thandle;addr:pointer;len : longint) : longint;
var
regs: Registers;
begin
FillChar(regs,SizeOf(regs),0);
ZeroSegRegs(regs);
regs.AH := $3F;
regs.BX := h;
regs.CX := len;
@ -152,7 +152,7 @@ function do_filepos(handle : thandle) : longint;
var
regs : Registers;
begin
FillChar(regs,SizeOf(regs),0);
ZeroSegRegs(regs);
regs.BX:=handle;
regs.CX:=0;
regs.DX:=0;
@ -172,7 +172,7 @@ procedure do_seek(handle:thandle;pos : longint);
var
regs : Registers;
begin
FillChar(regs,SizeOf(regs),0);
ZeroSegRegs(regs);
regs.BX:=handle;
regs.CX:=pos shr 16;
regs.DX:=pos and $ffff;
@ -188,7 +188,7 @@ function do_seekend(handle:thandle):longint;
var
regs : Registers;
begin
FillChar(regs,SizeOf(regs),0);
ZeroSegRegs(regs);
regs.BX:=handle;
regs.CX:=0;
regs.DX:=0;
@ -220,7 +220,7 @@ var
regs : Registers;
begin
do_seek(handle,pos);
FillChar(regs,SizeOf(regs),0);
ZeroSegRegs(regs);
regs.CX:=0;
regs.BX:=handle;
regs.AX:=$4000;
@ -237,7 +237,7 @@ var
regs : Registers;
begin
Inc(FileHandleCount,10);
FillChar(regs,SizeOf(regs),0);
ZeroSegRegs(regs);
regs.BX:=FileHandleCount;
regs.AX:=$6700;
MsDos(regs);
@ -263,7 +263,7 @@ var
action : word;
oldp : pchar;
begin
FillChar(regs,SizeOf(regs),0);
ZeroSegRegs(regs);
{ close first if opened }
if ((flags and $10000)=0) then
begin
@ -332,7 +332,7 @@ begin
if regs.AX=4 then
if Increase_file_handle_count then
begin
FillChar(regs,SizeOf(regs),0);
ZeroSegRegs(regs);
{ Try again }
if LFNSupport then
begin
@ -409,7 +409,7 @@ begin
do_isdevice:=true;
exit;
end;
FillChar(regs,SizeOf(regs),0);
ZeroSegRegs(regs);
regs.AX := $4400;
regs.BX := handle;
MsDos(regs);

View File

@ -19,7 +19,7 @@ procedure GetInOutRes(def: Word);
var
regs : Registers;
begin
FillChar(regs,SizeOf(regs),0);
ZeroSegRegs(regs);
regs.AX:=$5900;
regs.BX:=$0;
MsDos(regs);

View File

@ -146,6 +146,14 @@ procedure MsDos_Carry(var Regs: Registers); external name 'FPC_MSDOS_CARRY';
{$I winprocsh.inc}
{$I winprocs.inc}
{ in protected mode, loading invalid values into segment registers causes an
exception, so we use this function to initialize our Registers structure }
procedure ZeroSegRegs(var regs: Registers); inline;
begin
regs.DS:=0;
regs.ES:=0;
end;
{$I system.inc}
{$IFDEF FPC_X86_DATA_NEAR}