* fixes from OS/2 merged to EMX

This commit is contained in:
Tomas Hajny 2003-10-19 09:35:28 +00:00
parent c2a66502f0
commit fc7111ff4b
4 changed files with 134 additions and 239 deletions

View File

@ -131,7 +131,7 @@ function kbdcharin(var Akeyrec:Tkbdkeyinfo;wait,kbdhandle:longint):word; cdecl;
function kbdpeek(var Akeyrec:TkbdkeyInfo;kbdhandle:word):word; cdecl;
external 'EMXWRAP' index 222;
function dossleep(time:longint):word; cdecl;
function dossleep(time:cardinal):cardinal; cdecl;
external 'DOSCALLS' index 229;
function vioscrollup(top,left,bottom,right,lines:longint;
var screl:word;viohandle:longint):word; cdecl;
@ -894,7 +894,10 @@ end.
{
$Log$
Revision 1.1 2003-03-23 23:11:17 hajny
Revision 1.2 2003-10-19 09:35:28 hajny
* fixes from OS/2 merged to EMX
Revision 1.1 2003/03/23 23:11:17 hajny
+ emx target added

View File

@ -34,6 +34,7 @@ interface
{Platform specific information}
type
THandle = Longint;
const
LineEnding = #13#10;
{ LFNSupport is defined separately below!!! }
@ -131,29 +132,30 @@ procedure DosGetInfoBlocks (PATIB: PPThreadInfoBlock;
external 'DOSCALLS' index 312;
function DosLoadModule (ObjName: PChar; ObjLen: cardinal; DLLName: PChar;
var Handle: cardinal): longint; cdecl;
var Handle: cardinal): cardinal; cdecl;
external 'DOSCALLS' index 318;
function DosQueryProcAddr (Handle, Ordinal: cardinal; ProcName: PChar;
var Address: pointer): longint; cdecl;
var Address: pointer): cardinal; cdecl;
external 'DOSCALLS' index 321;
function DosSetRelMaxFH (var ReqCount, CurMaxFH: longint): longint; cdecl;
function DosSetRelMaxFH (var ReqCount: longint; var CurMaxFH: cardinal):
cardinal; cdecl;
external 'DOSCALLS' index 382;
function DosSetCurrentDir (Name:PChar): longint; cdecl;
function DosSetCurrentDir (Name:PChar): cardinal; cdecl;
external 'DOSCALLS' index 255;
function DosSetDefaultDisk (DiskNum:longint): longint; cdecl;
function DosSetDefaultDisk (DiskNum:cardinal): cardinal; cdecl;
external 'DOSCALLS' index 220;
{ This is not real prototype, but is close enough }
{ for us (the 2nd parameter is actually a pointer }
{ to a structure). }
function DosCreateDir( Name : pchar; p : pointer): longint; cdecl;
function DosCreateDir (Name: PChar; P: pointer): cardinal; cdecl;
external 'DOSCALLS' index 270;
function DosDeleteDir( Name : pchar) : longint; cdecl;
function DosDeleteDir (Name: PChar): cardinal; cdecl;
external 'DOSCALLS' index 226;
{This is the correct way to call external assembler procedures.}
@ -212,13 +214,13 @@ function paramcount:longint;assembler;
asm
movl argc,%eax
decl %eax
end ['EAX'];
end {['EAX']};
function args:pointer;assembler;
asm
movl argv,%eax
end ['EAX'];
end {['EAX']};
function paramstr(l:longint):string;
@ -267,7 +269,7 @@ asm
call syscall
mov word ptr [randseed], cx
mov word ptr [randseed + 2], dx
end ['eax', 'ecx', 'edx'];
end {['eax', 'ecx', 'edx']};
{$ASMMODE ATT}
@ -292,7 +294,7 @@ begin
{$ENDIF CONTHEAP}
asm
movl size,%edx
movw $0x7f00,%eax
movw $0x7f00,%ax
call syscall { result directly in EAX }
inc %eax { Result in EAX, -1 = error (has to be transformed to 0) }
jz .LSbrk_End
@ -307,25 +309,25 @@ end;
assembler;
asm
movl size,%edx
movw $0x7f00,%eax
movw $0x7f00,%ax
call syscall
inc %eax { Result in EAX, -1 = error (has to be transformed to 0) }
jz .LSbrk_End
dec %eax { No error - back to previous value }
.LSbrk_End:
end ['eax', 'edx'];
end {['eax', 'edx']};
{$ENDIF DUMPGROW}
function getheapstart:pointer;assembler;
asm
movl heap_base,%eax
end ['EAX'];
end {['EAX']};
function getheapsize:longint;assembler;
asm
movl heap_brk,%eax
end ['EAX'];
end {['EAX']};
{$i heap.inc}
@ -398,6 +400,7 @@ end;
function do_read(h,addr,len:longint):longint; assembler;
asm
pushl %ebx
movl len,%ecx
movl addr,%edx
movl h,%ebx
@ -407,10 +410,12 @@ asm
movw %ax,inoutres;
xorl %eax,%eax
.LDOSREAD1:
end ['eax', 'ebx', 'ecx', 'edx'];
popl %ebx
end {['eax', 'ebx', 'ecx', 'edx']};
function do_write(h,addr,len:longint) : longint; assembler;
asm
pushl %ebx
xorl %eax,%eax
cmpl $0,len { 0 bytes to write is undefined behavior }
jz .LDOSWRITE1
@ -422,10 +427,12 @@ asm
jnc .LDOSWRITE1
movw %ax,inoutres;
.LDOSWRITE1:
end ['eax', 'ebx', 'ecx', 'edx'];
popl %ebx
end {['eax', 'ebx', 'ecx', 'edx']};
function do_filepos(handle:longint): longint; assembler;
asm
pushl %ebx
movw $0x4201,%ax
movl handle,%ebx
xorl %edx,%edx
@ -434,10 +441,12 @@ asm
movw %ax,inoutres;
xorl %eax,%eax
.LDOSFILEPOS:
end ['eax', 'ebx', 'ecx', 'edx'];
popl %ebx
end {['eax', 'ebx', 'ecx', 'edx']};
procedure do_seek(handle,pos:longint); assembler;
asm
pushl %ebx
movw $0x4200,%ax
movl handle,%ebx
movl pos,%edx
@ -445,10 +454,12 @@ asm
jnc .LDOSSEEK1
movw %ax,inoutres;
.LDOSSEEK1:
end ['eax', 'ebx', 'ecx', 'edx'];
popl %ebx
end {['eax', 'ebx', 'ecx', 'edx']};
function do_seekend(handle:longint):longint; assembler;
asm
pushl %ebx
movw $0x4202,%ax
movl handle,%ebx
xorl %edx,%edx
@ -457,7 +468,8 @@ asm
movw %ax,inoutres;
xorl %eax,%eax
.Lset_at_end1:
end ['eax', 'ebx', 'ecx', 'edx'];
popl %ebx
end {['eax', 'ebx', 'ecx', 'edx']};
function do_filesize(handle:longint):longint;
@ -491,12 +503,12 @@ asm
end ['eax', 'ebx', 'ecx', 'edx'];
const
FileHandleCount: longint = 20;
FileHandleCount: cardinal = 20;
function Increase_File_Handle_Count: boolean;
var Err: word;
L1, L2: longint;
begin
L1: longint;
L2: cardinal;
if os_mode = osOS2 then
begin
L1 := 10;
@ -545,7 +557,7 @@ procedure do_open(var f;p:pchar;flags:longint);
when (flags and $10000) there is no check for close (needed for textfiles)
}
var Action: longint;
var Action: cardinal;
begin
allowslash(p);
@ -603,15 +615,16 @@ begin
cmpl $0xffffffff, %eax
jnz .LOPEN1
movw %cx, InOutRes
movw UnusedHandle, %ax
movl UnusedHandle, %eax
.LOPEN1:
movl f,%edx { Warning : This assumes Handle is first }
movw %ax,(%edx) { field of FileRec }
movl %eax,(%edx) { field of FileRec }
popl %ebx
end ['eax', 'ecx', 'edx'];
if (InOutRes = 4) and Increase_File_Handle_Count then
(* Trying again after increasing amount of file handles *)
asm
pushl %ebx
movl $0x7f2b, %eax
movl Action, %ecx
movl p, %edx
@ -619,10 +632,11 @@ begin
cmpl $0xffffffff, %eax
jnz .LOPEN2
movw %cx, InOutRes
movw UnusedHandle, %ax
movl UnusedHandle, %eax
.LOPEN2:
movl f,%edx
movw %ax,(%edx)
movl %eax,(%edx)
popl %ebx
end ['eax', 'ecx', 'edx'];
{ for systems that have more handles }
if FileRec (F).Handle > FileHandleCount then
@ -658,7 +672,7 @@ asm
dec eax { nope, so result is zero }
@IsDevEnd:
pop ebx
end ['eax', 'edx'];
end {['eax', 'ebx', 'edx']};
{$ASMMODE ATT}
@ -775,7 +789,7 @@ end;
procedure ChDir (const S: string);[IOCheck];
var RC: longint;
var RC: cardinal;
Buffer: array [0..255] of char;
begin
@ -1115,7 +1129,8 @@ end;
function GetFileHandleCount: longint;
var L1, L2: longint;
var L1: longint;
L2: cardinal;
begin
L1 := 0; (* Don't change the amount, just check. *)
if DosSetRelMaxFH (L1, L2) <> 0 then GetFileHandleCount := 50
@ -1248,7 +1263,10 @@ begin
end.
{
$Log$
Revision 1.15 2003-10-16 15:43:13 peter
Revision 1.16 2003-10-19 09:35:28 hajny
* fixes from OS/2 merged to EMX
Revision 1.15 2003/10/16 15:43:13 peter
* THandle is platform dependent
Revision 1.14 2003/10/12 18:07:30 hajny

View File

@ -92,44 +92,44 @@ type
{ import the necessary stuff from the OS }
function DosAllocThreadLocalMemory (Count: cardinal; var P: pointer): longint;
function DosAllocThreadLocalMemory (Count: cardinal; var P: pointer): cardinal;
cdecl; external 'DOSCALLS' index 454;
function DosFreeThreadLocalMemory (P: pointer): longint; cdecl;
function DosFreeThreadLocalMemory (P: pointer): cardinal; cdecl;
external 'DOSCALLS' index 455;
function DosCreateThread (var TID: longint; Address: pointer;
function DosCreateThread (var TID: cardinal; Address: pointer;
(* TThreadFunc *)
aParam: pointer; Flags: longint; StackSize: longint): longint; cdecl;
aParam: pointer; Flags: cardinal; StackSize: cardinal): cardinal; cdecl;
external 'DOSCALLS' index 311;
procedure DosExit (Action, Result: longint); cdecl;
procedure DosExit (Action, Result: cardinal); cdecl;
external 'DOSCALLS' index 234;
function DosCreateMutExSem (Name: PChar; var Handle: longint; Attr: longint;
State: boolean): longint; cdecl; external 'DOSCALLS' index 331;
function DosCreateMutExSem (Name: PChar; var Handle: longint; Attr: cardinal;
State: boolean): cardinal; cdecl; external 'DOSCALLS' index 331;
function DosCloseMutExSem (Handle: longint): longint; cdecl;
function DosCloseMutExSem (Handle: longint): cardinal; cdecl;
external 'DOSCALLS' index 333;
function DosQueryMutExSem (Handle: longint; var PID, TID, Count: longint):
longint; cdecl; external 'DOSCALLS' index 336;
function DosQueryMutExSem (Handle: longint; var PID, TID, Count: cardinal):
cardinal; cdecl; external 'DOSCALLS' index 336;
function DosRequestMutExSem (Handle, Timeout: longint): longint; cdecl;
function DosRequestMutExSem (Handle:longint; Timeout: cardinal): cardinal; cdecl;
external 'DOSCALLS' index 334;
function DosReleaseMutExSem (Handle: longint): longint; cdecl;
function DosReleaseMutExSem (Handle: longint): cardinal; cdecl;
external 'DOSCALLS' index 335;
function DosAllocMem (var P: pointer; Size, Flag: longint): longint; cdecl;
function DosAllocMem (var P: pointer; Size, Flag: cardinal): cardinal; cdecl;
external 'DOSCALLS' index 299;
function DosFreeMem (P: pointer): longint; cdecl;
function DosFreeMem (P: pointer): cardinal; cdecl;
external 'DOSCALLS' index 304;
function DosEnterCritSec:longint; cdecl; external 'DOSCALLS' index 232;
function DosEnterCritSec:cardinal; cdecl; external 'DOSCALLS' index 232;
function DosExitCritSec:longint; cdecl; external 'DOSCALLS' index 233;
function DosExitCritSec:cardinal; cdecl; external 'DOSCALLS' index 233;
procedure DosGetInfoBlocks (PATIB: PPThreadInfoBlock;
PAPIB: PPProcessInfoBlock); cdecl;
@ -379,7 +379,10 @@ initialization
end.
{
$Log$
Revision 1.3 2003-03-23 23:11:17 hajny
Revision 1.4 2003-10-19 09:35:28 hajny
* fixes from OS/2 merged to EMX
Revision 1.3 2003/03/23 23:11:17 hajny
+ emx target added
Revision 1.2 2002/11/17 22:32:05 hajny

View File

@ -25,9 +25,6 @@ interface
uses
Dos;
type
THandle = type Longint;
{ Include platform independent interface part }
{$i sysutilh.inc}
@ -231,15 +228,9 @@ const
specification for DosFindFirst call.}
{$ASMMODE INTEL}
function FileOpen (const FileName: string; Mode: integer): longint;
{$IFOPT H+}
assembler;
{$ELSE}
var FN: string;
begin
FN := FileName + #0;
{$ENDIF}
asm
function FileOpen (const FileName: string; Mode: integer): longint; assembler;
asm
push ebx
mov eax, Mode
(* DenyAll if sharing not specified. *)
test eax, 112
@ -248,50 +239,24 @@ begin
@FOpen1:
mov ecx, eax
mov eax, 7F2Bh
{$IFOPT H+}
mov edx, FileName
{$ELSE}
lea edx, FN
inc edx
{$ENDIF}
call syscall
{$IFOPT H-}
mov Result, eax
{$ENDIF}
end ['eax', 'ebx', 'ecx', 'edx'];
{$IFOPT H-}
end;
{$ENDIF}
mov edx, FileName
call syscall
pop ebx
end {['eax', 'ebx', 'ecx', 'edx']};
function FileCreate (const FileName: string): longint;
{$IFOPT H+}
assembler;
{$ELSE}
var FN: string;
begin
FN := FileName + #0;
{$ENDIF}
asm
function FileCreate (const FileName: string): longint; assembler;
asm
push ebx
mov eax, 7F2Bh
mov ecx, ofReadWrite or faCreate or doDenyRW (* Sharing to DenyAll *)
{$IFOPT H+}
mov edx, FileName
{$ELSE}
lea edx, FN
inc edx
{$ENDIF}
call syscall
{$IFOPT H-}
mov Result, eax
{$ENDIF}
end ['eax', 'ebx', 'ecx', 'edx'];
{$IFOPT H-}
end;
{$ENDIF}
mov edx, FileName
call syscall
pop ebx
end {['eax', 'ebx', 'ecx', 'edx']};
Function FileCreate (Const FileName : String; Mode:longint) : Longint;
function FileCreate (const FileName: string; Mode: longint): longint;
begin
FileCreate:=FileCreate(FileName);
end;
@ -300,6 +265,7 @@ end;
function FileRead (Handle: longint; var Buffer; Count: longint): longint;
assembler;
asm
push ebx
mov eax, 3F00h
mov ebx, Handle
mov ecx, Count
@ -308,12 +274,14 @@ asm
jnc @FReadEnd
mov eax, -1
@FReadEnd:
end ['eax', 'ebx', 'ecx', 'edx'];
pop ebx
end {['eax', 'ebx', 'ecx', 'edx']};
function FileWrite (Handle: longint; const Buffer; Count: longint): longint;
assembler;
asm
push ebx
mov eax, 4000h
mov ebx, Handle
mov ecx, Count
@ -322,11 +290,13 @@ asm
jnc @FWriteEnd
mov eax, -1
@FWriteEnd:
end ['eax', 'ebx', 'ecx', 'edx'];
pop ebx
end {['eax', 'ebx', 'ecx', 'edx']};
function FileSeek (Handle, FOffset, Origin: longint): longint; assembler;
asm
push ebx
mov eax, Origin
mov ah, 42h
mov ebx, Handle
@ -335,9 +305,10 @@ asm
jnc @FSeekEnd
mov eax, -1
@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
{$warning need to add 64bit call }
Result:=FileSeek(Handle,Longint(Foffset),Longint(Origin));
@ -358,6 +329,7 @@ end;
function FileTruncate (Handle, Size: longint): boolean; assembler;
asm
push ebx
mov eax, 7F25h
mov ebx, Handle
mov edx, Size
@ -371,7 +343,8 @@ asm
jnc @FTruncEnd
dec eax
@FTruncEnd:
end ['eax', 'ebx', 'ecx', 'edx'];
pop ebx
end {['eax', 'ebx', 'ecx', 'edx']};
function FileAge (const FileName: string): longint;
@ -388,22 +361,10 @@ begin
end;
function FileExists (const FileName: string): boolean;
{$IFOPT H+}
assembler;
{$ELSE}
var FN: string;
begin
FN := FileName + #0;
{$ENDIF}
function FileExists (const FileName: string): boolean; assembler;
asm
mov ax, 4300h
{$IFOPT H+}
mov edx, FileName
{$ELSE}
lea edx, FN
inc edx
{$ENDIF}
mov ax, 4300h
mov edx, FileName
call syscall
mov eax, 0
jc @FExistsEnd
@ -411,13 +372,7 @@ asm
jnz @FExistsEnd
inc eax
@FExistsEnd:
{$IFOPT H-}
mov Result, eax
{$ENDIF}
end ['eax', 'ecx', 'edx'];
{$IFOPT H-}
end;
{$ENDIF}
end {['eax', 'ecx', 'edx']};
type TRec = record
@ -542,6 +497,7 @@ end;
function FileGetDate (Handle: longint): longint; assembler;
asm
push ebx
mov ax, 5700h
mov ebx, Handle
call syscall
@ -550,7 +506,8 @@ asm
mov ax, dx
shld eax, ecx, 16
@FGetDateEnd:
end ['eax', 'ebx', 'ecx', 'edx'];
pop ebx
end {['eax', 'ebx', 'ecx', 'edx']};
function FileSetDate (Handle, Age: longint): longint;
@ -596,128 +553,55 @@ begin
end;
function FileGetAttr (const FileName: string): longint;
{$IFOPT H+}
assembler;
{$ELSE}
var FN: string;
begin
FN := FileName + #0;
{$ENDIF}
function FileGetAttr (const FileName: string): longint; assembler;
asm
mov ax, 4300h
{$IFOPT H+}
mov edx, FileName
{$ELSE}
lea edx, FN
inc edx
{$ENDIF}
mov ax, 4300h
mov edx, FileName
call syscall
jnc @FGetAttrEnd
mov eax, -1
@FGetAttrEnd:
{$IFOPT H-}
mov Result, eax
{$ENDIF}
end ['eax', 'edx'];
{$IFOPT H-}
end;
{$ENDIF}
end {['eax', 'edx']};
function FileSetAttr (const Filename: string; Attr: longint): longint;
{$IFOPT H+}
assembler;
{$ELSE}
var FN: string;
begin
FN := FileName + #0;
{$ENDIF}
function FileSetAttr (const Filename: string; Attr: longint): longint; assembler;
asm
mov ax, 4301h
mov ecx, Attr
{$IFOPT H+}
mov edx, FileName
{$ELSE}
lea edx, FN
inc edx
{$ENDIF}
mov edx, FileName
call syscall
mov eax, 0
jnc @FSetAttrEnd
mov eax, -1
@FSetAttrEnd:
{$IFOPT H-}
mov Result, eax
{$ENDIF}
end ['eax', 'ecx', 'edx'];
{$IFOPT H-}
end;
{$ENDIF}
end {['eax', 'ecx', 'edx']};
function DeleteFile (const FileName: string): boolean;
{$IFOPT H+}
assembler;
{$ELSE}
var FN: string;
begin
FN := FileName + #0;
{$ENDIF}
function DeleteFile (const FileName: string): boolean; assembler;
asm
mov ax, 4100h
{$IFOPT H+}
mov edx, FileName
{$ELSE}
lea edx, FN
inc edx
{$ENDIF}
mov edx, FileName
call syscall
mov eax, 0
jc @FDeleteEnd
inc eax
@FDeleteEnd:
{$IFOPT H-}
mov Result, eax
{$ENDIF}
end ['eax', 'edx'];
{$IFOPT H-}
end;
{$ENDIF}
end {['eax', 'edx']};
function RenameFile (const OldName, NewName: string): boolean;
{$IFOPT H+}
assembler;
{$ELSE}
var FN1, FN2: string;
begin
FN1 := OldName + #0;
FN2 := NewName + #0;
{$ENDIF}
function RenameFile (const OldName, NewName: string): boolean; assembler;
asm
push edi
mov ax, 5600h
{$IFOPT H+}
mov edx, OldName
mov edi, NewName
{$ELSE}
lea edx, FN1
inc edx
lea edi, FN2
inc edi
{$ENDIF}
call syscall
mov eax, 0
jc @FRenameEnd
inc eax
@FRenameEnd:
{$IFOPT H-}
mov Result, eax
{$ENDIF}
end ['eax', 'edx', 'edi'];
{$IFOPT H-}
end;
{$ENDIF}
pop edi
end {['eax', 'edx', 'edi']};
{****************************************************************************
@ -844,22 +728,10 @@ end;
{$ASMMODE INTEL}
function DirectoryExists (const Directory: string): boolean;
{$IFOPT H+}
assembler;
{$ELSE}
var FN: string;
begin
FN := Directory + #0;
{$ENDIF}
function DirectoryExists (const Directory: string): boolean; assembler;
asm
mov ax, 4300h
{$IFOPT H+}
mov ax, 4300h
mov edx, Directory
{$ELSE}
lea edx, FN
inc edx
{$ENDIF}
call syscall
mov eax, 0
jc @FExistsEnd
@ -867,13 +739,7 @@ asm
jz @FExistsEnd
inc eax
@FExistsEnd:
{$IFOPT H-}
mov Result, eax
{$ENDIF}
end ['eax', 'ecx', 'edx'];
{$IFOPT H-}
end;
{$ENDIF}
end {['eax', 'ecx', 'edx']};
{****************************************************************************
@ -883,6 +749,7 @@ end;
procedure GetLocalTime (var SystemTime: TSystemTime); assembler;
asm
(* Expects the default record alignment (word)!!! *)
push edi
mov ah, 2Ah
call syscall
mov edi, SystemTime
@ -907,7 +774,8 @@ asm
shl eax, 16
mov al, dh
stosd
end ['eax', 'ecx', 'edx', 'edi'];
pop edi
end {['eax', 'ecx', 'edx', 'edi']};
{$asmmode default}
@ -1013,7 +881,10 @@ end.
{
$Log$
Revision 1.11 2003-10-14 21:15:20 hajny
Revision 1.12 2003-10-19 09:35:28 hajny
* fixes from OS/2 merged to EMX
Revision 1.11 2003/10/14 21:15:20 hajny
* longint2cardinal fixes merged
Revision 1.10 2003/10/07 21:33:24 hajny