home *** CD-ROM | disk | FTP | other *** search
/ Amiga MA Magazine 1998 #6 / amigamamagazinepolishissue1998.iso / coders / jËzyki_programowania / oberon / loader / oloaddebug.mod < prev    next >
Text File  |  1977-12-31  |  2KB  |  111 lines

  1.  
  2.  
  3. (* This Module for hacker only. Don't touch !!!! *)
  4.  
  5.  
  6. (*$ LargeVars:=TRUE *) (* IMPORTANT !!! *)
  7.  
  8. IMPLEMENTATION MODULE OLoadDebug;
  9.  
  10. FROM SYSTEM IMPORT ADDRESS,ADR,ASSEMBLE,CAST,REG,SETREG,WORD;
  11.  
  12. IMPORT
  13.  Arts,ExecD,ExecL,R;
  14.  
  15. CONST
  16.  (* trapStubOffset=1D6H; DArts *)
  17.  trapStubOffset=172H; (* Arts *)
  18.  
  19.  (* trapHandlerOffset=10; not optimized *)
  20.  trapHandlerOffset=9; (* optimized *)
  21.  
  22. TYPE
  23.  Word3=ARRAY [0..2] OF CARDINAL;
  24.  Word3Ptr=POINTER TO Word3;
  25.  
  26. VAR
  27.  inOberon:BOOLEAN;
  28.  trapStubInit:Word3;
  29.  
  30. PROCEDURE ToModula;
  31. BEGIN
  32.  inOberon:=FALSE;
  33. END ToModula;
  34.  
  35. PROCEDURE ToOberon;
  36. BEGIN
  37.  inOberon:=TRUE;
  38. END ToOberon;
  39.  
  40. VAR
  41.  copyOfA4:ADDRESS;
  42.  
  43. PROCEDURE TrapHandler;
  44. (*$EntryExitCode:=FALSE*)
  45. BEGIN
  46.  IF inOberon THEN
  47.   SETREG(R.A5,REG(R.A6));
  48.  END;
  49.  SETREG(R.A4,copyOfA4);
  50.  ASSEMBLE(
  51.   JMP $12345678
  52.   END
  53.  );
  54. END TrapHandler;
  55.  
  56. PROCEDURE NewTrapStub(adr:LONGINT);
  57. VAR
  58.  p:Word3Ptr;
  59. BEGIN
  60.  p:=ADDRESS(ADR(Arts.Requester)+trapStubOffset);
  61.  p^[0]:=4EF9H;
  62.  p^[1]:=CAST(LONGCARD,adr) DIV 10000H;
  63.  p^[2]:=CAST(LONGCARD,adr) MOD 10000H;
  64.  ExecL.CacheClearU;
  65. END NewTrapStub;
  66.  
  67. PROCEDURE ResetTrapStub;
  68. VAR
  69.  p:Word3Ptr;
  70. BEGIN
  71.  p:=ADDRESS(ADR(Arts.Requester)+trapStubOffset);
  72.  p^:=trapStubInit;
  73.  ExecL.CacheClearU;
  74. END ResetTrapStub;
  75.  
  76. PROCEDURE SaveTrapStub;
  77. VAR
  78.  p:Word3Ptr;
  79. BEGIN
  80.  p:=ADDRESS(ADR(Arts.Requester)+trapStubOffset);
  81.  trapStubInit:=p^;
  82.  Arts.Assert(
  83.   (trapStubInit[0]=7000H) & (trapStubInit[1]=302CH)
  84.   ,ADR("Please adjust trapStubOffset.")
  85.  );
  86. END SaveTrapStub;
  87.  
  88. VAR
  89.  thisTask:ExecD.TaskPtr;
  90.  trapHandler:POINTER TO RECORD
  91.   code:ARRAY [1..trapHandlerOffset] OF WORD;
  92.   oldAddr:PROC;
  93.  END;
  94.  
  95. BEGIN
  96.  copyOfA4:=REG(R.A4);
  97.  inOberon:=FALSE;
  98.  SaveTrapStub;
  99.  
  100. (* Patch in our own TrapHandler *)
  101.  thisTask:=ExecL.FindTask(NIL);
  102.  trapHandler:=ADR(TrapHandler);
  103.  
  104.  Arts.Assert(CAST(LONGCARD,trapHandler^.oldAddr)=12345678H,ADR("Please adjust trapHandler."));
  105.  
  106.  trapHandler^.oldAddr:=thisTask^.trapCode;
  107.  ExecL.CacheClearU;
  108.  thisTask^.trapCode:=TrapHandler;
  109.  
  110. END OLoadDebug.
  111.