amigalib.pas 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  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 amigalib;
  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. function HookEntry: longword;
  25. implementation
  26. uses exec, intuition, utility;
  27. function DoMethodA(obj : longword; msg1 : Pointer): longword; assembler;
  28. asm
  29. mflr r31
  30. lwz r9,-4(r3)
  31. stw r9,32(r2)
  32. stw r4,36(r2)
  33. stw r3,40(r2)
  34. lwz r11,104(r2)
  35. lwz r3,8(r9)
  36. mtlr r11
  37. blrl
  38. mtlr r31
  39. end ['R31'];
  40. function DoMethod(obj : longword; msg : array of LongWord): longword;
  41. begin
  42. DoMethod:=DoMethodA(obj, @msg);
  43. end;
  44. function DoMethod(obj : pointer; msg : array of LongWord): longword; inline;
  45. begin
  46. DoMethod:=DoMethodA(DWord(obj), @msg);
  47. end;
  48. function DoSuperMethodA(class_: longword; obj : longword; msg1 : Pointer): longword; assembler;
  49. asm
  50. mflr r31
  51. lwz r9,24(r3)
  52. stw r9,32(r2)
  53. stw r5,36(r2)
  54. stw r4,40(r2)
  55. lwz r11,104(r2)
  56. lwz r3,8(r9)
  57. mtlr r11
  58. blrl
  59. mtlr r31
  60. end ['R31'];
  61. function DoSuperMethodA(class_: pointer; obj : pointer; msg1 : Pointer): longword; inline;
  62. begin
  63. DoSuperMethodA:=DoSuperMethodA(DWord(class_),DWord(obj),msg1);
  64. end;
  65. function DoSuperMethod(class_: longword; obj : longword; msg : array of LongWord): longword;
  66. begin
  67. DoSuperMethod:=DoSuperMethodA(class_, obj, @msg);
  68. end;
  69. function DoSuperNew(class_: pointer; obj: pointer; tags: array of LongWord): longword;
  70. var opSet: topSet;
  71. begin
  72. opSet.MethodID := OM_NEW;
  73. opSet.ops_AttrList := @tags;
  74. opSet.ops_GInfo := nil;
  75. DoSuperNew:=DoSuperMethodA(class_,obj,@opset);
  76. end;
  77. // This procedure is used to pop dispatcher args from emulstruc
  78. procedure DISPATCHERARG(var cl; var obj; var msg); assembler;
  79. asm
  80. lwz r6,32(r2) // REG_a0
  81. stw r6,(r3) // cl
  82. lwz r6,40(r2) // REG_a2
  83. stw r6,(r4) // obj
  84. lwz r6,36(r2) // REG_a1
  85. stw r6,(r5) // msg
  86. end;
  87. type
  88. THookSubEntryFunc = function(a, b, c: Pointer): longword;
  89. function HookEntry: longword;
  90. var
  91. hook: PHook;
  92. begin
  93. hook:=REG_A0;
  94. HookEntry:=THookSubEntryFunc(hook^.h_SubEntry)(hook, REG_A2, REG_A1);
  95. end;
  96. end.