* stdcall fixes again

This commit is contained in:
Tomas Hajny 2003-10-18 16:58:39 +00:00
parent f659dc38f9
commit c5df303517
3 changed files with 218 additions and 328 deletions

View File

@ -83,7 +83,7 @@ asm
movw P, %dx movw P, %dx
movb Data, %al movb Data, %al
outb %al, %dx outb %al, %dx
end ['eax', 'ecx', 'edx']; end {['eax', 'ecx', 'edx']};
function TPort.ReadPort (P: word): byte; assembler; function TPort.ReadPort (P: word): byte; assembler;
asm asm
@ -94,7 +94,7 @@ asm
call syscall call syscall
movw P, %dx movw P, %dx
inb %dx, %al inb %dx, %al
end ['eax', 'ecx', 'edx']; end {['eax', 'ecx', 'edx']};
procedure TPortW.WritePort (P: word; Data : word); assembler; procedure TPortW.WritePort (P: word; Data : word); assembler;
asm asm
@ -106,7 +106,7 @@ asm
movw P, %dx movw P, %dx
movw Data, %ax movw Data, %ax
outw %ax, %dx outw %ax, %dx
end ['eax', 'ecx', 'edx']; end {['eax', 'ecx', 'edx']};
function TPortW.ReadPort (P: word): word; assembler; function TPortW.ReadPort (P: word): word; assembler;
asm asm
@ -117,7 +117,7 @@ asm
call syscall call syscall
movw P, %dx movw P, %dx
inw %dx, %ax inw %dx, %ax
end ['eax', 'ecx', 'edx']; end {['eax', 'ecx', 'edx']};
procedure TPortL.WritePort (P: word; Data: longint); assembler; procedure TPortL.WritePort (P: word; Data: longint); assembler;
asm asm
@ -129,7 +129,7 @@ asm
movw P, %dx movw P, %dx
movl Data, %eax movl Data, %eax
outl %eax, %dx outl %eax, %dx
end ['eax', 'ecx', 'edx']; end {['eax', 'ecx', 'edx']};
function TPortL.ReadPort (P: word): longint; assembler; function TPortL.ReadPort (P: word): longint; assembler;
asm asm
@ -140,13 +140,16 @@ asm
call syscall call syscall
movw P, %dx movw P, %dx
inl %dx, %eax inl %dx, %eax
end ['eax', 'ecx', 'edx']; end {['eax', 'ecx', 'edx']};
end. end.
{ {
$Log$ $Log$
Revision 1.3 2003-10-07 21:26:35 hajny Revision 1.4 2003-10-18 16:58:39 hajny
* stdcall fixes again
Revision 1.3 2003/10/07 21:26:35 hajny
* stdcall fixes and asm routines cleanup * stdcall fixes and asm routines cleanup
Revision 1.2 2002/09/07 16:01:25 peter Revision 1.2 2002/09/07 16:01:25 peter

View File

@ -394,12 +394,12 @@ function paramcount:longint;assembler;
asm asm
movl argc,%eax movl argc,%eax
decl %eax decl %eax
end ['EAX']; end {['EAX']};
function args:pointer;assembler; function args:pointer;assembler;
asm asm
movl argv,%eax movl argv,%eax
end ['EAX']; end {['EAX']};
function paramstr(l:longint):string; function paramstr(l:longint):string;
@ -437,7 +437,7 @@ asm
call syscall call syscall
mov word ptr [randseed], cx mov word ptr [randseed], cx
mov word ptr [randseed + 2], dx mov word ptr [randseed + 2], dx
end ['eax', 'ecx', 'edx']; end {['eax', 'ecx', 'edx']};
{$ASMMODE ATT} {$ASMMODE ATT}
@ -483,19 +483,19 @@ asm
jz .LSbrk_End jz .LSbrk_End
dec %eax { No error - back to previous value } dec %eax { No error - back to previous value }
.LSbrk_End: .LSbrk_End:
end ['eax', 'edx']; end {['eax', 'edx']};
{$ENDIF DUMPGROW} {$ENDIF DUMPGROW}
function getheapstart:pointer;assembler; function getheapstart:pointer;assembler;
asm asm
movl heap_base,%eax movl heap_base,%eax
end ['EAX']; end {['EAX']};
function getheapsize:longint;assembler; function getheapsize:longint;assembler;
asm asm
movl heap_brk,%eax movl heap_brk,%eax
end ['EAX']; end {['EAX']};
{$i heap.inc} {$i heap.inc}
@ -550,6 +550,7 @@ end;
function do_read(h,addr,len:longint):longint; assembler; function do_read(h,addr,len:longint):longint; assembler;
asm asm
pushl %ebx
movl len,%ecx movl len,%ecx
movl addr,%edx movl addr,%edx
movl h,%ebx movl h,%ebx
@ -559,10 +560,12 @@ asm
movw %ax,inoutres; movw %ax,inoutres;
xorl %eax,%eax xorl %eax,%eax
.LDOSREAD1: .LDOSREAD1:
end ['eax', 'ebx', 'ecx', 'edx']; popl %ebx
end {['eax', 'ebx', 'ecx', 'edx']};
function do_write(h,addr,len:longint) : longint; assembler; function do_write(h,addr,len:longint) : longint; assembler;
asm asm
pushl %ebx
xorl %eax,%eax xorl %eax,%eax
cmpl $0,len { 0 bytes to write is undefined behavior } cmpl $0,len { 0 bytes to write is undefined behavior }
jz .LDOSWRITE1 jz .LDOSWRITE1
@ -574,10 +577,12 @@ asm
jnc .LDOSWRITE1 jnc .LDOSWRITE1
movw %ax,inoutres; movw %ax,inoutres;
.LDOSWRITE1: .LDOSWRITE1:
end ['eax', 'ebx', 'ecx', 'edx']; popl %ebx
end {['eax', 'ebx', 'ecx', 'edx']};
function do_filepos(handle:longint): longint; assembler; function do_filepos(handle:longint): longint; assembler;
asm asm
pushl %ebx
movw $0x4201,%ax movw $0x4201,%ax
movl handle,%ebx movl handle,%ebx
xorl %edx,%edx xorl %edx,%edx
@ -586,10 +591,12 @@ asm
movw %ax,inoutres; movw %ax,inoutres;
xorl %eax,%eax xorl %eax,%eax
.LDOSFILEPOS: .LDOSFILEPOS:
end ['eax', 'ebx', 'ecx', 'edx']; popl %ebx
end {['eax', 'ebx', 'ecx', 'edx']};
procedure do_seek(handle,pos:longint); assembler; procedure do_seek(handle,pos:longint); assembler;
asm asm
pushl %ebx
movw $0x4200,%ax movw $0x4200,%ax
movl handle,%ebx movl handle,%ebx
movl pos,%edx movl pos,%edx
@ -597,10 +604,12 @@ asm
jnc .LDOSSEEK1 jnc .LDOSSEEK1
movw %ax,inoutres; movw %ax,inoutres;
.LDOSSEEK1: .LDOSSEEK1:
end ['eax', 'ebx', 'ecx', 'edx']; popl %ebx
end {['eax', 'ebx', 'ecx', 'edx']};
function do_seekend(handle:longint):longint; assembler; function do_seekend(handle:longint):longint; assembler;
asm asm
pushl %ebx
movw $0x4202,%ax movw $0x4202,%ax
movl handle,%ebx movl handle,%ebx
xorl %edx,%edx xorl %edx,%edx
@ -609,7 +618,8 @@ asm
movw %ax,inoutres; movw %ax,inoutres;
xorl %eax,%eax xorl %eax,%eax
.Lset_at_end1: .Lset_at_end1:
end ['eax', 'ebx', 'ecx', 'edx']; popl %ebx
end {['eax', 'ebx', 'ecx', 'edx']};
function do_filesize(handle:longint):longint; function do_filesize(handle:longint):longint;
@ -775,6 +785,7 @@ begin
else else
*) *)
asm asm
push ebx
mov ebx, Handle mov ebx, Handle
mov eax, 4400h mov eax, 4400h
call syscall call syscall
@ -784,7 +795,8 @@ asm
jnz @IsDevEnd jnz @IsDevEnd
dec eax { nope, so result is zero } dec eax { nope, so result is zero }
@IsDevEnd: @IsDevEnd:
end ['eax', 'ebx', 'edx']; pop ebx
end {['eax', 'ebx', 'edx']};
{$ASMMODE ATT} {$ASMMODE ATT}
@ -1165,7 +1177,10 @@ begin
end. end.
{ {
$Log$ $Log$
Revision 1.47 2003-10-16 15:43:13 peter Revision 1.48 2003-10-18 16:58:39 hajny
* stdcall fixes again
Revision 1.47 2003/10/16 15:43:13 peter
* THandle is platform dependent * THandle is platform dependent
Revision 1.46 2003/10/14 21:10:06 hajny Revision 1.46 2003/10/14 21:10:06 hajny

View File

@ -25,9 +25,6 @@ interface
uses uses
Dos; Dos;
type
THandle = type Longint;
{ Include platform independent interface part } { Include platform independent interface part }
{$i sysutilh.inc} {$i sysutilh.inc}
@ -231,15 +228,9 @@ const
specification for DosFindFirst call.} specification for DosFindFirst call.}
{$ASMMODE INTEL} {$ASMMODE INTEL}
function FileOpen (const FileName: string; Mode: integer): longint; function FileOpen (const FileName: string; Mode: integer): longint; assembler;
{$IFOPT H+} asm
assembler; push ebx
{$ELSE}
var FN: string;
begin
FN := FileName + #0;
{$ENDIF}
asm
mov eax, Mode mov eax, Mode
(* DenyAll if sharing not specified. *) (* DenyAll if sharing not specified. *)
test eax, 112 test eax, 112
@ -248,58 +239,33 @@ begin
@FOpen1: @FOpen1:
mov ecx, eax mov ecx, eax
mov eax, 7F2Bh mov eax, 7F2Bh
{$IFOPT H+}
mov edx, FileName mov edx, FileName
{$ELSE}
lea edx, FN
inc edx
{$ENDIF}
call syscall call syscall
{$IFOPT H-} pop ebx
mov Result, eax end {['eax', 'ebx', 'ecx', 'edx']};
{$ENDIF}
end ['eax', 'ebx', 'ecx', 'edx'];
{$IFOPT H-}
end;
{$ENDIF}
function FileCreate (const FileName: string): longint; function FileCreate (const FileName: string): longint; assembler;
{$IFOPT H+} asm
assembler; push ebx
{$ELSE}
var FN: string;
begin
FN := FileName + #0;
{$ENDIF}
asm
mov eax, 7F2Bh mov eax, 7F2Bh
mov ecx, ofReadWrite or faCreate or doDenyRW (* Sharing to DenyAll *) mov ecx, ofReadWrite or faCreate or doDenyRW (* Sharing to DenyAll *)
{$IFOPT H+}
mov edx, FileName mov edx, FileName
{$ELSE}
lea edx, FN
inc edx
{$ENDIF}
call syscall call syscall
{$IFOPT H-} pop ebx
mov Result, eax end {['eax', 'ebx', 'ecx', 'edx']};
{$ENDIF}
end ['eax', 'ebx', 'ecx', 'edx'];
{$IFOPT H-}
end;
{$ENDIF}
Function FileCreate (Const FileName : String; Mode:longint) : Longint; function FileCreate (const FileName: string; Mode: longint): longint;
begin begin
FileCreate:=FileCreate(FileName); FileCreate := FileCreate(FileName);
end; end;
function FileRead (Handle: longint; var Buffer; Count: longint): longint; function FileRead (Handle: longint; var Buffer; Count: longint): longint;
assembler; assembler;
asm asm
push ebx
mov eax, 3F00h mov eax, 3F00h
mov ebx, Handle mov ebx, Handle
mov ecx, Count mov ecx, Count
@ -308,12 +274,14 @@ asm
jnc @FReadEnd jnc @FReadEnd
mov eax, -1 mov eax, -1
@FReadEnd: @FReadEnd:
end ['eax', 'ebx', 'ecx', 'edx']; pop ebx
end {['eax', 'ebx', 'ecx', 'edx']};
function FileWrite (Handle: longint; const Buffer; Count: longint): longint; function FileWrite (Handle: longint; const Buffer; Count: longint): longint;
assembler; assembler;
asm asm
push ebx
mov eax, 4000h mov eax, 4000h
mov ebx, Handle mov ebx, Handle
mov ecx, Count mov ecx, Count
@ -322,11 +290,13 @@ asm
jnc @FWriteEnd jnc @FWriteEnd
mov eax, -1 mov eax, -1
@FWriteEnd: @FWriteEnd:
end ['eax', 'ebx', 'ecx', 'edx']; pop ebx
end {['eax', 'ebx', 'ecx', 'edx']};
function FileSeek (Handle, FOffset, Origin: longint): longint; assembler; function FileSeek (Handle, FOffset, Origin: longint): longint; assembler;
asm asm
push ebx
mov eax, Origin mov eax, Origin
mov ah, 42h mov ah, 42h
mov ebx, Handle mov ebx, Handle
@ -335,29 +305,32 @@ asm
jnc @FSeekEnd jnc @FSeekEnd
mov eax, -1 mov eax, -1
@FSeekEnd: @FSeekEnd:
end ['eax', 'ebx', 'edx']; pop ebx
end {['eax', 'ebx', 'edx']};
Function FileSeek (Handle : Longint; FOffset,Origin : Int64) : Int64; function FileSeek (Handle: longint; FOffset, Origin: Int64): Int64;
begin begin
{$warning need to add 64bit call } {$warning need to add 64bit call }
Result:=FileSeek(Handle,Longint(Foffset),Longint(Origin)); Result:=FileSeek(Handle,Longint(Foffset),Longint(Origin));
end; end;
procedure FileClose (Handle: longint); procedure FileClose (Handle: longint); assembler;
begin asm
if Handle > 2 then
asm
push ebx push ebx
mov eax, Handle
cmp eax, 2
jbe @FCloseEnd
mov ebx, eax
mov eax, 3E00h mov eax, 3E00h
mov ebx, Handle
call syscall call syscall
@FCloseEnd:
pop ebx pop ebx
end ['eax']; end {['eax', 'ebx']};
end;
function FileTruncate (Handle, Size: longint): boolean; assembler; function FileTruncate (Handle, Size: longint): boolean; assembler;
asm asm
push ebx
mov eax, 7F25h mov eax, 7F25h
mov ebx, Handle mov ebx, Handle
mov edx, Size mov edx, Size
@ -371,7 +344,8 @@ asm
jnc @FTruncEnd jnc @FTruncEnd
dec eax dec eax
@FTruncEnd: @FTruncEnd:
end ['eax', 'ebx', 'ecx', 'edx']; pop ebx
end {['eax', 'ebx', 'ecx', 'edx']};
function FileAge (const FileName: string): longint; function FileAge (const FileName: string): longint;
@ -388,22 +362,10 @@ begin
end; end;
function FileExists (const FileName: string): boolean; function FileExists (const FileName: string): boolean; assembler;
{$IFOPT H+}
assembler;
{$ELSE}
var FN: string;
begin
FN := FileName + #0;
{$ENDIF}
asm asm
mov ax, 4300h mov ax, 4300h
{$IFOPT H+}
mov edx, FileName mov edx, FileName
{$ELSE}
lea edx, FN
inc edx
{$ENDIF}
call syscall call syscall
mov eax, 0 mov eax, 0
jc @FExistsEnd jc @FExistsEnd
@ -411,13 +373,7 @@ asm
jnz @FExistsEnd jnz @FExistsEnd
inc eax inc eax
@FExistsEnd: @FExistsEnd:
{$IFOPT H-} end {['eax', 'ecx', 'edx']};
mov Result, eax
{$ENDIF}
end ['eax', 'ecx', 'edx'];
{$IFOPT H-}
end;
{$ENDIF}
type TRec = record type TRec = record
@ -493,6 +449,7 @@ end;
function FileGetDate (Handle: longint): longint; assembler; function FileGetDate (Handle: longint): longint; assembler;
asm asm
push ebx
mov ax, 5700h mov ax, 5700h
mov ebx, Handle mov ebx, Handle
call syscall call syscall
@ -501,7 +458,8 @@ asm
mov ax, dx mov ax, dx
shld eax, ecx, 16 shld eax, ecx, 16
@FGetDateEnd: @FGetDateEnd:
end ['eax', 'ebx', 'ecx', 'edx']; pop ebx
end {['eax', 'ebx', 'ecx', 'edx']};
function FileSetDate (Handle, Age: longint): longint; function FileSetDate (Handle, Age: longint): longint;
@ -530,128 +488,55 @@ begin
end; end;
function FileGetAttr (const FileName: string): longint; function FileGetAttr (const FileName: string): longint; assembler;
{$IFOPT H+}
assembler;
{$ELSE}
var FN: string;
begin
FN := FileName + #0;
{$ENDIF}
asm asm
mov ax, 4300h mov ax, 4300h
{$IFOPT H+}
mov edx, FileName mov edx, FileName
{$ELSE}
lea edx, FN
inc edx
{$ENDIF}
call syscall call syscall
jnc @FGetAttrEnd jnc @FGetAttrEnd
mov eax, -1 mov eax, -1
@FGetAttrEnd: @FGetAttrEnd:
{$IFOPT H-} end {['eax', 'edx']};
mov Result, eax
{$ENDIF}
end ['eax', 'edx'];
{$IFOPT H-}
end;
{$ENDIF}
function FileSetAttr (const Filename: string; Attr: longint): longint; function FileSetAttr (const Filename: string; Attr: longint): longint; assembler;
{$IFOPT H+}
assembler;
{$ELSE}
var FN: string;
begin
FN := FileName + #0;
{$ENDIF}
asm asm
mov ax, 4301h mov ax, 4301h
mov ecx, Attr mov ecx, Attr
{$IFOPT H+}
mov edx, FileName mov edx, FileName
{$ELSE}
lea edx, FN
inc edx
{$ENDIF}
call syscall call syscall
mov eax, 0 mov eax, 0
jnc @FSetAttrEnd jnc @FSetAttrEnd
mov eax, -1 mov eax, -1
@FSetAttrEnd: @FSetAttrEnd:
{$IFOPT H-} end {['eax', 'ecx', 'edx']};
mov Result, eax
{$ENDIF}
end ['eax', 'ecx', 'edx'];
{$IFOPT H-}
end;
{$ENDIF}
function DeleteFile (const FileName: string): boolean; function DeleteFile (const FileName: string): boolean; assembler;
{$IFOPT H+}
assembler;
{$ELSE}
var FN: string;
begin
FN := FileName + #0;
{$ENDIF}
asm asm
mov ax, 4100h mov ax, 4100h
{$IFOPT H+}
mov edx, FileName mov edx, FileName
{$ELSE}
lea edx, FN
inc edx
{$ENDIF}
call syscall call syscall
mov eax, 0 mov eax, 0
jc @FDeleteEnd jc @FDeleteEnd
inc eax inc eax
@FDeleteEnd: @FDeleteEnd:
{$IFOPT H-} end {['eax', 'edx']};
mov Result, eax
{$ENDIF}
end ['eax', 'edx'];
{$IFOPT H-}
end;
{$ENDIF}
function RenameFile (const OldName, NewName: string): boolean; function RenameFile (const OldName, NewName: string): boolean; assembler;
{$IFOPT H+}
assembler;
{$ELSE}
var FN1, FN2: string;
begin
FN1 := OldName + #0;
FN2 := NewName + #0;
{$ENDIF}
asm asm
push edi
mov ax, 5600h mov ax, 5600h
{$IFOPT H+}
mov edx, OldName mov edx, OldName
mov edi, NewName mov edi, NewName
{$ELSE}
lea edx, FN1
inc edx
lea edi, FN2
inc edi
{$ENDIF}
call syscall call syscall
mov eax, 0 mov eax, 0
jc @FRenameEnd jc @FRenameEnd
inc eax inc eax
@FRenameEnd: @FRenameEnd:
{$IFOPT H-} pop edi
mov Result, eax end {['eax', 'edx', 'edi']};
{$ENDIF}
end ['eax', 'edx', 'edi'];
{$IFOPT H-}
end;
{$ENDIF}
{**************************************************************************** {****************************************************************************
@ -725,22 +610,10 @@ end;
{$ASMMODE INTEL} {$ASMMODE INTEL}
function DirectoryExists (const Directory: string): boolean; function DirectoryExists (const Directory: string): boolean; assembler;
{$IFOPT H+}
assembler;
{$ELSE}
var FN: string;
begin
FN := Directory + #0;
{$ENDIF}
asm asm
mov ax, 4300h mov ax, 4300h
{$IFOPT H+}
mov edx, Directory mov edx, Directory
{$ELSE}
lea edx, FN
inc edx
{$ENDIF}
call syscall call syscall
mov eax, 0 mov eax, 0
jc @FExistsEnd jc @FExistsEnd
@ -748,13 +621,7 @@ asm
jz @FExistsEnd jz @FExistsEnd
inc eax inc eax
@FExistsEnd: @FExistsEnd:
{$IFOPT H-} end {['eax', 'ecx', 'edx']};
mov Result, eax
{$ENDIF}
end ['eax', 'ecx', 'edx'];
{$IFOPT H-}
end;
{$ENDIF}
{**************************************************************************** {****************************************************************************
@ -764,6 +631,7 @@ end;
procedure GetLocalTime (var SystemTime: TSystemTime); assembler; procedure GetLocalTime (var SystemTime: TSystemTime); assembler;
asm asm
(* Expects the default record alignment (word)!!! *) (* Expects the default record alignment (word)!!! *)
push edi
mov ah, 2Ah mov ah, 2Ah
call syscall call syscall
mov edi, SystemTime mov edi, SystemTime
@ -788,7 +656,8 @@ asm
shl eax, 16 shl eax, 16
mov al, dh mov al, dh
stosd stosd
end ['eax', 'ecx', 'edx', 'edi']; pop edi
end {['eax', 'ecx', 'edx', 'edi']};
{$asmmode default} {$asmmode default}
{**************************************************************************** {****************************************************************************
@ -886,7 +755,10 @@ end.
{ {
$Log$ $Log$
Revision 1.33 2003-10-13 21:17:31 hajny Revision 1.34 2003-10-18 16:58:39 hajny
* stdcall fixes again
Revision 1.33 2003/10/13 21:17:31 hajny
* longint to cardinal corrections * longint to cardinal corrections
Revision 1.32 2003/10/08 05:22:47 yuri Revision 1.32 2003/10/08 05:22:47 yuri