From b0c948a14319e3f701eed31e085513c31d471127 Mon Sep 17 00:00:00 2001
From: Tomas Hajny <hajny@freepascal.org>
Date: Sun, 21 Mar 2004 20:18:39 +0000
Subject: [PATCH]   * regcall fixes

---
 rtl/os2/ports.pas | 72 ++++++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 68 insertions(+), 4 deletions(-)

diff --git a/rtl/os2/ports.pas b/rtl/os2/ports.pas
index 3421fe5a1b..6eb9f80278 100644
--- a/rtl/os2/ports.pas
+++ b/rtl/os2/ports.pas
@@ -24,15 +24,14 @@
      for all EMX applications until EMX.DLL is unloaded from memory (i.e.
      all applications using this library finish).
 *)
-
+    
 unit Ports;
 
 { This unit uses classes so ObjFpc mode is required. }
 {$Mode ObjFpc}
-{$calling StdCall}
 
 interface
-
+    
 type
  TPort = class
   protected
@@ -71,75 +70,137 @@ implementation
 {Import syscall to call it nicely from assembler procedures.}
 
 procedure syscall; external name '___SYSCALL';
+{$WARNING Still using EMX - has to be updated once native linking available!}
+
 
 {$AsmMode ATT}
 
 procedure TPort.WritePort (P: word; Data: byte); assembler;
 asm
  xorl %ecx, %ecx
+{$IFDEF REGCALL}
+ movw %ax, %cx
+ pushl %edx
+ pushl %ecx
+{$ELSE REGCALL}
  movw P, %cx
+{$ENDIF REGCALL}
  movl %ecx, %edx
  movw $0x7F12, %ax
  call syscall
+{$IFDEF REGCALL}
+ popl %edx
+ popl %eax
+{$ELSE REGCALL}
  movw P, %dx
  movb Data, %al
+{$ENDIF REGCALL}
  outb %al, %dx
 end {['eax', 'ecx', 'edx']};
 
 function TPort.ReadPort (P: word): byte; assembler;
 asm
  xorl %ecx, %ecx
+{$IFDEF REGCALL}
+ movw %ax, %cx
+{$ELSE REGCALL}
  movw P, %cx
+ pushl %ecx
+{$ENDIF REGCALL}
  movl %ecx, %edx
  movw $0x7F12, %ax
  call syscall
+{$IFDEF REGCALL}
+ popl %edx
+{$ELSE REGCALL}
  movw P, %dx
+{$ENDIF REGCALL}
  inb %dx, %al
 end {['eax', 'ecx', 'edx']};
 
 procedure TPortW.WritePort (P: word; Data : word); assembler;
 asm
  xorl %ecx, %ecx
+{$IFDEF REGCALL}
+ movw %ax, %cx
+ pushl %edx
+ pushl %ecx
+{$ELSE REGCALL}
  movw P, %cx
+{$ENDIF REGCALL}
  movl %ecx, %edx
  movw $0x7F12, %ax
  call syscall
+{$IFDEF REGCALL}
+ popl %edx
+ popl %eax
+{$ELSE REGCALL}
  movw P, %dx
  movw Data, %ax
+{$ENDIF REGCALL}
  outw %ax, %dx
 end {['eax', 'ecx', 'edx']};
 
 function TPortW.ReadPort (P: word): word; assembler;
 asm
  xorl %ecx, %ecx
+{$IFDEF REGCALL}
+ movw %ax, %cx
+ pushl %ecx
+{$ELSE REGCALL}
  movw P, %cx
+{$ENDIF REGCALL}
  movl %ecx, %edx
  movw $0x7F12, %ax
  call syscall
+{$IFDEF REGCALL}
+ popl %edx
+{$ELSE REGCALL}
  movw P, %dx
+{$ENDIF REGCALL}
  inw %dx, %ax
 end {['eax', 'ecx', 'edx']};
 
 procedure TPortL.WritePort (P: word; Data: longint); assembler;
 asm
  xorl %ecx, %ecx
+{$IFDEF REGCALL}
+ movw %ax, %cx
+ pushl %edx
+ pushl %ecx
+{$ELSE REGCALL}
  movw P, %cx
+{$ENDIF REGCALL}
  movl %ecx, %edx
  movw $0x7F12, %ax
  call syscall
+{$IFDEF REGCALL}
+ popl %edx
+ popl %eax
+{$ELSE REGCALL}
  movw P, %dx
  movl Data, %eax
+{$ENDIF REGCALL}
  outl %eax, %dx
 end {['eax', 'ecx', 'edx']};
 
 function TPortL.ReadPort (P: word): longint; assembler;
 asm
  xorl %ecx, %ecx
+{$IFDEF REGCALL}
+ movw %ax, %cx
+ pushl %ecx
+{$ELSE REGCALL}
  movw P, %cx
+{$ENDIF REGCALL}
  movl %ecx, %edx
  movw $0x7F12, %ax
  call syscall
+{$IFDEF REGCALL}
+ popl %edx
+{$ELSE REGCALL}
  movw P, %dx
+{$ENDIF REGCALL}
  inl %dx, %eax
 end {['eax', 'ecx', 'edx']};
 
@@ -147,7 +208,10 @@ end.
 
 {
   $Log$
-  Revision 1.5  2003-12-04 21:22:38  peter
+  Revision 1.6  2004-03-21 20:18:39  hajny
+    * regcall fixes
+
+  Revision 1.5  2003/12/04 21:22:38  peter
     * regcall updates (untested)
 
   Revision 1.4  2003/10/18 16:58:39  hajny