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