Răsfoiți Sursa

* stdcall changes merged to EMX

Tomas Hajny 22 ani în urmă
părinte
comite
2200cb4d8e
3 a modificat fișierele cu 148 adăugiri și 100 ștergeri
  1. 85 72
      rtl/emx/dos.pas
  2. 32 22
      rtl/emx/system.pas
  3. 31 6
      rtl/emx/sysutils.pp

+ 85 - 72
rtl/emx/dos.pas

@@ -109,6 +109,8 @@ type    {Some string types:}
         efdetach:      Detached. Function unknown. Info wanted!
         efpm:          Run as presentation manager program.
 
+ Not found info about execwinflags
+
         Determining the window state of the program:
         efdefault:     Run the pm program in it's default situation.
         efminimize:    Run the pm program minimized.
@@ -116,9 +118,7 @@ type    {Some string types:}
         effullscreen:  Run the non-pm program fullscreen.
         efwindowed:    Run the non-pm program in a window.
 
-        Other options are not implemented defined because lack of
-        knowledge about what they do.}
-
+}
         type    execrunflags=(efwait,efno_wait,efoverlay,efdebug,efsession,
                               efdetach,efpm);
                 execwinflags=(efdefault,efminimize,efmaximize,effullscreen,
@@ -260,6 +260,7 @@ procedure getftime(var f;var time:longint);
 
 begin
     asm
+        pushl %ebx
         {Load handle}
         movl f,%ebx
         movl (%ebx),%ebx
@@ -272,6 +273,7 @@ begin
         movl %edx,(%ebx)
         xorb %ah,%ah
         movw %ax,doserror
+        popl %ebx
     end;
 end;
 
@@ -282,26 +284,27 @@ var FStat: PFileStatus3;
 
 begin
     if os_mode = osOS2 then
-        begin
-            New (FStat);
-            RC := DosQueryFileInfo (FileRec (F).Handle, ilStandard, FStat,
-                                                              SizeOf (FStat^));
-            if RC = 0 then
-                begin
-                    FStat^.DateLastAccess := Hi (Time);
-                    FStat^.DateLastWrite := Hi (Time);
-                    FStat^.TimeLastAccess := Lo (Time);
-                    FStat^.TimeLastWrite := Lo (Time);
-                    RC := DosSetFileInfo (FileRec (F).Handle, ilStandard,
-                                                       FStat, SizeOf (FStat^));
+begin
+  New (FStat);
+  RC := DosQueryFileInfo (FileRec (F).Handle, ilStandard, FStat,
+                                                    SizeOf (FStat^));
+  if RC = 0 then
+  begin
+    FStat^.DateLastAccess := Hi (Time);
+    FStat^.DateLastWrite := Hi (Time);
+    FStat^.TimeLastAccess := Lo (Time);
+    FStat^.TimeLastWrite := Lo (Time);
+    RC := DosSetFileInfo (FileRec (F).Handle, ilStandard,
+                                       FStat, SizeOf (FStat^));
 
 
-                end;
-            DosError := integer(RC);
-            Dispose (FStat);
+  end;
+  DosError := integer(RC);
+  Dispose (FStat);
         end
     else
         asm
+            pushl %ebx
             {Load handle}
             movl f,%ebx
             movl (%ebx),%ebx
@@ -312,6 +315,7 @@ begin
             call syscall
             xorb %ah,%ah
             movw %ax,doserror
+            popl %ebx
         end;
 end;
 
@@ -388,7 +392,7 @@ begin
     popl    %ebx            {Flags.}
     movl    %ebx,32(%eax)
     {FS and GS too}
-  end;
+  end ['eax','ebx','ecx','edx','esi','edi'];
 end;
 
 procedure exec(const path:pathstr;const comline:comstr);
@@ -498,7 +502,7 @@ begin
         stosb               {Store an extra 0 to finish. (AL is now 0).}
         incl %edx
         movw %dx,ES.SizeEnv    {Store environment size.}
-    end;
+    end ['eax','ebx','ecx','edx','esi','edi'];
 
     {Environment ready, now set-up exec structure.}
     es.argofs:=args;
@@ -580,12 +584,12 @@ procedure SetDate (Year, Month, Day: word);
 var DT: TDateTime;
 begin
     if os_mode = osOS2 then
-        begin
-            DosGetDateTime (DT);
-            DT.Year := Year;
-            DT.Month := byte (Month);
-            DT.Day := byte (Day);
-            DosSetDateTime (DT);
+begin
+  DosGetDateTime (DT);
+  DT.Year := Year;
+  DT.Month := byte (Month);
+  DT.Day := byte (Day);
+  DosSetDateTime (DT);
         end
     else
         asm
@@ -623,13 +627,13 @@ procedure SetTime (Hour, Minute, Second, Sec100: word);
 var DT: TDateTime;
 begin
     if os_mode = osOS2 then
-        begin
-            DosGetDateTime (DT);
-            DT.Hour := byte (Hour);
-            DT.Minute := byte (Minute);
-            DT.Second := byte (Second);
-            DT.Sec100 := byte (Sec100);
-            DosSetDateTime (DT);
+begin
+  DosGetDateTime (DT);
+  DT.Hour := byte (Hour);
+  DT.Minute := byte (Minute);
+  DT.Second := byte (Second);
+  DT.Sec100 := byte (Sec100);
+  DosSetDateTime (DT);
         end
     else
         asm
@@ -647,7 +651,7 @@ end;
 procedure getcbreak(var breakvalue:boolean);
 
 begin
-    breakvalue := True;
+  breakvalue := True;
 end;
 
 procedure setcbreak(breakvalue:boolean);
@@ -675,8 +679,8 @@ begin
          stosb
       end
   else
-      verify := true;
-  end;
+  verify := true;
+end;
 
 procedure setverify(verify:boolean);
 
@@ -700,6 +704,7 @@ begin
     if (os_mode = osDOS) or (os_mode = osDPMI) then
     {Function 36 is not supported in OS/2.}
         asm
+            pushl %ebx
             movb Drive,%dl
             movb $0x36,%ah
             call syscall
@@ -711,23 +716,24 @@ begin
             movw %ax,%dx
             movl $0,%eax
             xchgl %edx,%eax
-            leave
-            ret
+            jmp .LDISKFREE2
          .LDISKFREE1:
             cltd
+         .LDISKFREE2:
+            popl %ebx
             leave
             ret
         end
     else
         {In OS/2, we use the filesystem information.}
         begin
-            RC := DosQueryFSInfo (Drive, 1, FI, SizeOf (FI));
-            if RC = 0 then
-                DiskFree := int64 (FI.Free_Clusters) *
-                   int64 (FI.Sectors_Per_Cluster) * int64 (FI.Bytes_Per_Sector)
-            else
-                DiskFree := -1;
-        end;
+  RC := DosQueryFSInfo (Drive, 1, FI, SizeOf (FI));
+  if RC = 0 then
+      DiskFree := int64 (FI.Free_Clusters) *
+         int64 (FI.Sectors_Per_Cluster) * int64 (FI.Bytes_Per_Sector)
+  else
+      DiskFree := -1;
+end;
 end;
 
 function DiskSize (Drive: byte): int64;
@@ -739,6 +745,7 @@ begin
     if (os_mode = osDOS) or (os_mode = osDPMI) then
         {Function 36 is not supported in OS/2.}
         asm
+            pushl %ebx
             movb Drive,%dl
             movb $0x36,%ah
             call syscall
@@ -751,23 +758,24 @@ begin
             movw %ax,%dx
             movl $0,%eax
             xchgl %edx,%eax
-            leave
-            ret
+            jmp .LDISKSIZE2
         .LDISKSIZE1:
             cltd
+        .LDISKSIZE2:
+            popl %ebx
             leave
             ret
         end
     else
         {In OS/2, we use the filesystem information.}
-        begin
-            RC := DosQueryFSinfo (Drive, 1, FI, SizeOf (FI));
-            if RC = 0 then
-                DiskSize := int64 (FI.Total_Clusters) *
-                   int64 (FI.Sectors_Per_Cluster) * int64 (FI.Bytes_Per_Sector)
-            else
-                DiskSize := -1;
-        end;
+begin
+  RC := DosQueryFSinfo (Drive, 1, FI, SizeOf (FI));
+  if RC = 0 then
+      DiskSize := int64 (FI.Total_Clusters) *
+         int64 (FI.Sectors_Per_Cluster) * int64 (FI.Bytes_Per_Sector)
+  else
+      DiskSize := -1;
+end;
 end;
 
 
@@ -799,8 +807,8 @@ const NameSize=255;
 var L, I: longint;
 
 type    TRec = record
-            T, D: word;
-        end;
+    T, D: word;
+  end;
 
 begin
     if os_mode = osOS2 then with F do
@@ -850,17 +858,17 @@ var path0: array[0..255] of char;
     Count: cardinal;
 
 begin
-    {No error.}
-    DosError := 0;
+  {No error.}
+  DosError := 0;
     if os_mode = osOS2 then
     begin
-        New (F.FStat);
-        F.Handle := longint ($FFFFFFFF);
-        Count := 1;
-        DosError := integer (DosFindFirst (Path, F.Handle,
-                       Attr and FindResvdMask, F.FStat, SizeOf (F.FStat^),
-                                                           Count, ilStandard));
-        if (DosError = 0) and (Count = 0) then DosError := 18;
+      New (F.FStat);
+      F.Handle := longint ($FFFFFFFF);
+      Count := 1;
+      DosError := integer (DosFindFirst (Path, F.Handle,
+                     Attr and FindResvdMask, F.FStat, SizeOf (F.FStat^),
+                                                         Count, ilStandard));
+      if (DosError = 0) and (Count = 0) then DosError := 18;
     end else
     begin
         strPcopy(path0,path);
@@ -905,9 +913,9 @@ procedure FindClose (var F: SearchRec);
 begin
     if os_mode = osOS2 then
     begin
-        if F.Handle <> $FFFFFFFF then DosError := DosFindClose (F.Handle);
-        Dispose (F.FStat);
-    end;
+  if F.Handle <> $FFFFFFFF then DosError := DosFindClose (F.Handle);
+  Dispose (F.FStat);
+end;
 end;
 
 procedure swapvectors;
@@ -988,7 +996,7 @@ begin
   pop eax
   mov P, edi      { place pointer to variable contents in P }
 @End:
- end;
+ end ['eax','ebx','ecx','edx','esi','edi'];
  GetEnvPChar := P;
 end;
 {$ASMMODE ATT}
@@ -1115,6 +1123,7 @@ begin
   move(path[1],buffer,length(path));
   buffer[length(path)]:=#0;
  asm
+    pushl %ebx
     movw $0x4300,%ax
     leal buffer,%edx
     call syscall
@@ -1123,6 +1132,7 @@ begin
   .Lnoerror:
     movl attr,%ebx
     movw %cx,(%ebx)
+    popl %ebx
  end;
 end;
 
@@ -1139,7 +1149,7 @@ begin
   DosError := 0;
   path := StrPas(filerec(f).Name);
   { Takes care of slash and backslash support }
-  path:=FExPand(path);
+  path:=FExpand(path);
   move(path[1],buffer,length(path));
   buffer[length(path)]:=#0;
    asm
@@ -1222,7 +1232,10 @@ begin
 end.
 {
   $Log$
-  Revision 1.4  2003-06-26 17:12:29  yuri
+  Revision 1.5  2003-10-04 17:53:08  hajny
+    * stdcall changes merged to EMX
+
+  Revision 1.4  2003/06/26 17:12:29  yuri
   * pmbidi added
   * some cosmetic changes
 

+ 32 - 22
rtl/emx/system.pas

@@ -18,22 +18,6 @@
 
 unit {$ifdef VER1_0}sysemx{$else}System{$endif};
 
-{Changelog:
-
-    People:
-
-        DM - Daniel Mantione
-
-    Date:           Description of change:              Changed by:
-
-     -              First released version 0.1.         DM
-
-Coding style:
-
-    My coding style is a bit unusual for Pascal. Nevertheless I friendly ask
-    you to try to make your changes not look all to different. In general,
-    set your IDE to use a tabsize of 4.}
-
 interface
 
 {Link the startup code.}
@@ -360,12 +344,14 @@ begin
      ((os_MODE = osOS2) and (h > 2)) then
    begin
      asm
+        pushl %ebx
         movb $0x3e,%ah
         movl h,%ebx
         call syscall
         jnc  .Lnoerror           { error code?            }
         movw  %ax, InOutRes       { yes, then set InOutRes }
      .Lnoerror:
+        popl %ebx
      end;
    end;
 end;
@@ -390,6 +376,7 @@ begin
     allowslash(p1);
     allowslash(p2);
     asm
+        pushl %edi
         movl P1, %edx
         movl P2, %edi
         movb $0x56,%ah
@@ -397,11 +384,13 @@ begin
         jnc .LRENAME1
         movw %ax,inoutres;
     .LRENAME1:
+        popl %edi
     end;
 end;
 
 function do_read(h,addr,len:longint):longint; assembler;
 asm
+    pushl %ebx
     movl len,%ecx
     movl addr,%edx
     movl h,%ebx
@@ -411,10 +400,12 @@ asm
     movw %ax,inoutres;
     xorl %eax,%eax
 .LDOSREAD1:
+    popl %ebx
 end;
 
 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
@@ -426,10 +417,12 @@ asm
     jnc .LDOSWRITE1
     movw %ax,inoutres;
 .LDOSWRITE1:
+    popl %ebx
 end;
 
 function do_filepos(handle:longint): longint; assembler;
 asm
+    pushl %ebx
     movw $0x4201,%ax
     movl handle,%ebx
     xorl %edx,%edx
@@ -438,10 +431,12 @@ asm
     movw %ax,inoutres;
     xorl %eax,%eax
 .LDOSFILEPOS:
+    popl %ebx
 end;
 
 procedure do_seek(handle,pos:longint); assembler;
 asm
+    pushl %ebx
     movw $0x4200,%ax
     movl handle,%ebx
     movl pos,%edx
@@ -449,10 +444,12 @@ asm
     jnc .LDOSSEEK1
     movw %ax,inoutres;
 .LDOSSEEK1:
+    popl %ebx
 end;
 
 function do_seekend(handle:longint):longint; assembler;
 asm
+    pushl %ebx
     movw $0x4202,%ax
     movl handle,%ebx
     xorl %edx,%edx
@@ -461,6 +458,7 @@ asm
     movw %ax,inoutres;
     xorl %eax,%eax
 .Lset_at_end1:
+    popl %ebx
 end;
 
 function do_filesize(handle:longint):longint;
@@ -475,6 +473,7 @@ end;
 
 procedure do_truncate(handle,pos:longint); assembler;
 asm
+    pushl %ebx
 (* DOS function 40h isn't safe for this according to EMX documentation *)
     movl $0x7F25,%eax
     movl Handle,%ebx
@@ -492,6 +491,7 @@ asm
 .LTruncate1:
     movw %ax,inoutres;
 .LTruncate2:
+    popl %ebx
 end;
 
 const
@@ -520,12 +520,14 @@ begin
             Inc (FileHandleCount, 10);
             Err := 0;
             asm
+                pushl %ebx
                 movl $0x6700, %eax
                 movl FileHandleCount, %ebx
                 call syscall
                 jnc .LIncFHandles
                 movw %ax, Err
 .LIncFHandles:
+                popl %ebx
             end;
             if Err <> 0 then
                 begin
@@ -647,6 +649,7 @@ begin
     else
 *)
 asm
+    push ebx
     mov ebx, Handle
     mov eax, 4400h
     call syscall
@@ -656,6 +659,7 @@ asm
     jnz @IsDevEnd
     dec eax                 { nope, so result is zero }
 @IsDevEnd:
+    pop ebx
 end;
 {$ASMMODE ATT}
 
@@ -833,7 +837,7 @@ begin
                             jz @LCHDIR
                             mov InOutRes, 15
 @LCHDIR:
-                        end;
+                        end ['eax','edx','esi'];
                         if (Length (S) > 2) and (InOutRes <> 0) then
                             { Under EMX 0.9d DOS this routine may sometime }
                             { fail or crash the system.                    }
@@ -870,7 +874,7 @@ begin
         jnc .LGetDir
         movw %ax, InOutRes
 .LGetDir:
-    end;
+    end [ 'eax','edx','esi'];
     { Now Dir should be filled with directory in ASCIIZ, }
     { starting from dir[4]                               }
     dir[0]:=#3;
@@ -1042,7 +1046,7 @@ begin
 @Stop:
   inc eax
   mov EnvSize, eax
- end;
+ end ['eax','ecx','edx','esi','edi'];
  Environment := GetMem (EnvSize);
  asm
   cld
@@ -1065,7 +1069,7 @@ begin
   jmp @L2
 @Stop2:
   stosb
- end;
+ end ['eax','ecx','edx','esi','edi'];
 end;
 
 
@@ -1128,6 +1132,7 @@ begin
     {Determine the operating system we are running on.}
 {$ASMMODE INTEL}
     asm
+        push ebx
         mov os_mode, 0
         mov eax, 7F0Ah
         call syscall
@@ -1137,7 +1142,6 @@ begin
         jz @noRSX
         mov os_mode, 2
     @noRSX:
-
     {Enable the brk area by initializing it with the initial heap size.}
 
         mov eax, 7F01h
@@ -1165,6 +1169,7 @@ begin
         mov edx, 8
         call syscall
 {$ENDIF CONTHEAP}
+        pop ebx
     end;
 
     { in OS/2 this will always be nil, but in DOS mode }
@@ -1174,6 +1179,7 @@ begin
      read-access to the first meg. of memory.}
     if os_mode in [osDOS,osDPMI] then
         asm
+            push ebx
             mov eax, 7F13h
             xor ebx, ebx
             mov ecx, 0FFFh
@@ -1182,6 +1188,7 @@ begin
             jc @endmem
             mov first_meg, eax
          @endmem:
+            pop ebx
         end
     else
         begin
@@ -1242,7 +1249,10 @@ begin
 end.
 {
   $Log$
-  Revision 1.8  2003-09-29 18:39:59  hajny
+  Revision 1.9  2003-10-04 17:53:08  hajny
+    * stdcall changes merged to EMX
+
+  Revision 1.8  2003/09/29 18:39:59  hajny
     * append fix applied to GO32v2, OS/2 and EMX
 
   Revision 1.7  2003/09/27 11:52:35  peter

+ 31 - 6
rtl/emx/sysutils.pp

@@ -296,6 +296,7 @@ end;
 function FileRead (Handle: longint; var Buffer; Count: longint): longint;
                                                                      assembler;
 asm
+    push ebx
     mov eax, 3F00h
     mov ebx, Handle
     mov ecx, Count
@@ -304,12 +305,14 @@ asm
     jnc @FReadEnd
     mov eax, -1
 @FReadEnd:
+    pop ebx
 end;
 
 
 function FileWrite (Handle: longint; const Buffer; Count: longint): longint;
                                                                      assembler;
 asm
+    push ebx
     mov eax, 4000h
     mov ebx, Handle
     mov ecx, Count
@@ -318,11 +321,13 @@ asm
     jnc @FWriteEnd
     mov eax, -1
 @FWriteEnd:
+    pop ebx
 end;
 
 
 function FileSeek (Handle, FOffset, Origin: longint): longint; assembler;
 asm
+    push ebx
     mov eax, Origin
     mov ah, 42h
     mov ebx, Handle
@@ -331,6 +336,7 @@ asm
     jnc @FSeekEnd
     mov eax, -1
 @FSeekEnd:
+    pop ebx
 end;
 
 Function FileSeek (Handle : Longint; FOffset,Origin : Int64) : Int64;
@@ -343,15 +349,18 @@ procedure FileClose (Handle: longint);
 begin
     if (Handle > 4) or ((os_mode = osOS2) and (Handle > 2)) then
         asm
+            push ebx
             mov eax, 3E00h
             mov ebx, Handle
             call syscall
+            pop ebx
         end;
 end;
 
 
 function FileTruncate (Handle, Size: longint): boolean; assembler;
 asm
+    push ebx
     mov eax, 7F25h
     mov ebx, Handle
     mov edx, Size
@@ -365,6 +374,7 @@ asm
     jnc @FTruncEnd
     dec eax
 @FTruncEnd:
+    pop ebx
 end;
 
 
@@ -533,6 +543,7 @@ end;
 
 function FileGetDate (Handle: longint): longint; assembler;
 asm
+    push ebx
     mov ax, 5700h
     mov ebx, Handle
     call syscall
@@ -541,6 +552,7 @@ asm
     mov ax, dx
     shld eax, ecx, 16
 @FGetDateEnd:
+    pop ebx
 end;
 
 
@@ -572,6 +584,7 @@ begin
         end
     else
         asm
+            push ebx
             mov ax, 5701h
             mov ebx, Handle
             mov cx, word ptr [Age]
@@ -581,6 +594,7 @@ begin
             mov eax, -1
 @FSetDateEnd:
             mov [ebp - 4], eax
+            pop ebx
         end;
 end;
 
@@ -679,6 +693,7 @@ begin
     FN2 := NewName + #0;
 {$ENDIF}
 asm
+    push edi
     mov ax, 5600h
 {$IFOPT H+}
     mov edx, OldName
@@ -696,6 +711,7 @@ asm
 @FRenameEnd:
 {$IFOPT H-}
     mov [ebp - 4], eax
+    pop edi
 end;
 {$ENDIF}
 end;
@@ -716,6 +732,7 @@ begin
     if (os_mode = osDOS) or (os_mode = osDPMI) then
     {Function 36 is not supported in OS/2.}
         asm
+            pushl %ebx
             movb Drive,%dl
             movb $0x36,%ah
             call syscall
@@ -727,10 +744,11 @@ begin
             movw %ax,%dx
             movl $0,%eax
             xchgl %edx,%eax
-            leave
-            ret
+            jmp .LDISKFREE2
          .LDISKFREE1:
             cltd
+         .LDISKFREE2:
+            popl %ebx
             leave
             ret
         end
@@ -755,6 +773,7 @@ begin
     if (os_mode = osDOS) or (os_mode = osDPMI) then
         {Function 36 is not supported in OS/2.}
         asm
+            pushl %ebx
             movb Drive,%dl
             movb $0x36,%ah
             call syscall
@@ -767,10 +786,11 @@ begin
             movw %ax,%dx
             movl $0,%eax
             xchgl %edx,%eax
-            leave
-            ret
-        .LDISKSIZE1:
+            jmp .LDISKSIZE2
+         .LDISKSIZE1:
             cltd
+         .LDISKSIZE2:
+            popl %ebx
             leave
             ret
         end
@@ -856,6 +876,7 @@ end;
 
 procedure GetLocalTime (var SystemTime: TSystemTime); assembler;
 asm
+    push edi
 (* Expects the default record alignment (word)!!! *)
     mov ah, 2Ah
     call syscall
@@ -881,6 +902,7 @@ asm
     shl eax, 16
     mov al, dh
     stosd
+    pop edi
 end;
 {$asmmode default}
 
@@ -987,7 +1009,10 @@ end.
 
 {
   $Log$
-  Revision 1.8  2003-06-26 17:12:29  yuri
+  Revision 1.9  2003-10-04 17:53:08  hajny
+    * stdcall changes merged to EMX
+
+  Revision 1.8  2003/06/26 17:12:29  yuri
   * pmbidi added
   * some cosmetic changes