aboxlib.pas 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. {
  2. This file is part of the Free Pascal run time library.
  3. Copyright (c) 2005 Karoly Balogh
  4. abox.lib implementation for MorphOS/PowerPC
  5. MorphOS port was done on a free Pegasos II/G4 machine
  6. provided by Genesi S.a.r.l. <www.genesi.lu>
  7. See the file COPYING.FPC, included in this distribution,
  8. for details about the copyright.
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  12. **********************************************************************}
  13. unit aboxlib;
  14. interface
  15. function DoMethod(obj : longword; msg : array of LongWord): longword;
  16. function DoMethod(obj : pointer; msg : array of LongWord): longword; inline;
  17. function DoMethodA(obj : longword; msg1 : Pointer): longword; assembler;
  18. function DoSuperMethod(class_: longword; obj : longword; msg : array of LongWord): longword;
  19. function DoSuperMethodA(class_: longword; obj : longword; msg1 : Pointer): longword; assembler;
  20. function DoSuperMethodA(class_: pointer; obj : pointer; msg1 : Pointer): longword; inline;
  21. function DoSuperNew(class_: pointer; obj: pointer; tags: array of LongWord): longword;
  22. // This procedure is used to pop dispatcher args from emulstruc
  23. procedure DISPATCHERARG(var cl; var obj; var msg); assembler;
  24. implementation
  25. uses intuition;
  26. function DoMethodA(obj : longword; msg1 : Pointer): longword; assembler;
  27. asm
  28. mflr r31
  29. lwz r9,-4(r3)
  30. stw r9,32(r2)
  31. stw r4,36(r2)
  32. stw r3,40(r2)
  33. lwz r11,104(r2)
  34. lwz r3,8(r9)
  35. mtlr r11
  36. blrl
  37. mtlr r31
  38. end ['R31'];
  39. function DoMethod(obj : longword; msg : array of LongWord): longword;
  40. begin
  41. DoMethod:=DoMethodA(obj, @msg);
  42. end;
  43. function DoMethod(obj : pointer; msg : array of LongWord): longword; inline;
  44. begin
  45. DoMethod:=DoMethodA(DWord(obj), @msg);
  46. end;
  47. function DoSuperMethodA(class_: longword; obj : longword; msg1 : Pointer): longword; assembler;
  48. asm
  49. mflr r31
  50. lwz r9,24(r3)
  51. stw r9,32(r2)
  52. stw r5,36(r2)
  53. stw r4,40(r2)
  54. lwz r11,104(r2)
  55. lwz r3,8(r9)
  56. mtlr r11
  57. blrl
  58. mtlr r31
  59. end ['R31'];
  60. function DoSuperMethodA(class_: pointer; obj : pointer; msg1 : Pointer): longword; inline;
  61. begin
  62. DoSuperMethodA:=DoSuperMethodA(DWord(class_),DWord(obj),msg1);
  63. end;
  64. function DoSuperMethod(class_: longword; obj : longword; msg : array of LongWord): longword;
  65. begin
  66. DoSuperMethod:=DoSuperMethodA(class_, obj, @msg);
  67. end;
  68. function DoSuperNew(class_: pointer; obj: pointer; tags: array of LongWord): longword;
  69. var opSet: topSet;
  70. begin
  71. opSet.MethodID := OM_NEW;
  72. opSet.ops_AttrList := @tags;
  73. opSet.ops_GInfo := nil;
  74. DoSuperNew:=DoSuperMethodA(class_,obj,@opset);
  75. end;
  76. // This procedure is used to pop dispatcher args from emulstruc
  77. procedure DISPATCHERARG(var cl; var obj; var msg); assembler;
  78. asm
  79. lwz r6,32(r2) // REG_a0
  80. stw r6,(r3) // cl
  81. lwz r6,40(r2) // REG_a2
  82. stw r6,(r4) // obj
  83. lwz r6,36(r2) // REG_a1
  84. stw r6,(r5) // msg
  85. end;
  86. end.